ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDZkYzM5ZWIuLjU3MGZiZjggMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTAwLDkgKzEwMCwxMSBAQAogCWNvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ2FsbGJhY2suYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFkc2V0LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGJhcC5haWRsIFwKKwljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFNlcnZpY2UuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JSW50ZW50UmVjZWl2ZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JSW50ZW50U2VuZGVyLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY0FkYXB0ZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY0NvbnRleHQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY1N0YXR1c09ic2VydmVyLmFpZGwgXApAQCAtMTI5LDcgKzEzMSw2IEBACiAgICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckNvbm5lY3Rpb24uYWlkbCBcCiAgICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckVuZ2luZS5haWRsIFwKICAgICBjb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyU2VydmljZS5haWRsIFwKLQljb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSUFwcGxpY2F0aW9uVG9rZW4uYWlkbCBcCkBAIC0xNTksNiArMTYwLDcgQEAKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RDbGllbnQuYWlkbCBcCiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kTWFuYWdlci5haWRsIFwKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RTZXNzaW9uLmFpZGwgXAorCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsIFwKIAljb3JlL2phdmEvY29tL3RydXN0ZWRsb2dpYy90cnVzdGVkbmZjL2FuZHJvaWQvSUxsY3BDb25uZWN0aW9ubGVzc1NvY2tldC5haWRsIFwKIAljb3JlL2phdmEvY29tL3RydXN0ZWRsb2dpYy90cnVzdGVkbmZjL2FuZHJvaWQvSUxsY3BTZXJ2aWNlU29ja2V0LmFpZGwgXAogCWNvcmUvamF2YS9jb20vdHJ1c3RlZGxvZ2ljL3RydXN0ZWRuZmMvYW5kcm9pZC9JTGxjcFNvY2tldC5haWRsIFwKQEAgLTE2Nyw2ICsxNjksOCBAQAogCWNvcmUvamF2YS9jb20vdHJ1c3RlZGxvZ2ljL3RydXN0ZWRuZmMvYW5kcm9pZC9JTmZjVGFnLmFpZGwgXAogCWNvcmUvamF2YS9jb20vdHJ1c3RlZGxvZ2ljL3RydXN0ZWRuZmMvYW5kcm9pZC9JUDJwSW5pdGlhdG9yLmFpZGwgXAogCWNvcmUvamF2YS9jb20vdHJ1c3RlZGxvZ2ljL3RydXN0ZWRuZmMvYW5kcm9pZC9JUDJwVGFyZ2V0LmFpZGwgXAorCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeURldGVjdG9yLmFpZGwgXAorCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeUxpc3RlbmVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR2VvY29kZVByb3ZpZGVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR3BzU3RhdHVzTGlzdGVuZXIuYWlkbCBcCiAJbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lHcHNTdGF0dXNQcm92aWRlci5haWRsIFwKQEAgLTM1Niw3ICszNjAsNyBAQAogCQkJZnJhbWV3b3JrIFwKIAogZnJhbWV3b3JrX2RvY3NfTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCi1mcmFtZXdvcmtfZG9jc19MT0NBTF9EUk9JRERPQ19IVE1MX0RJUiA6PSAkKExPQ0FMX1BBVEgpL2RvY3MvaHRtbCAkKE9VVF9ET0NTKS9nZW4KK2ZyYW1ld29ya19kb2NzX0xPQ0FMX0RST0lERE9DX0hUTUxfRElSIDo9IGRvY3MvaHRtbAogIyBUaGUgc2luY2UgZmxhZyAoLXNpbmNlIE4ueG1sIEFQSV9MRVZFTCkgaXMgdXNlZCB0byBhZGQgQVBJIExldmVsIGluZm9ybWF0aW9uCiAjIHRvIHRoZSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbi4gTXVzdCBiZSBpbiBvcmRlciBvZiBvbGRlc3QgdG8gbmV3ZXN0LgogZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfT1BUSU9OUyA6PSBcCkBAIC0zNjksOCArMzczLDkgQEAKICAgICAtc2luY2UgLi9mcmFtZXdvcmtzL2Jhc2UvYXBpLzYueG1sIDYgXAogICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvNy54bWwgNyBcCiAgICAgLXNpbmNlIC4vZnJhbWV3b3Jrcy9iYXNlL2FwaS84LnhtbCA4IFwKLSAgICAtd2Vycm9yIC1oaWRlIDEzIFwKLSAgICAtb3ZlcnZpZXcgJChMT0NBTF9QQVRIKS9jb3JlL2phdmEvb3ZlcnZpZXcuaHRtbAorICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvY3VycmVudC54bWwgSEMgXAorCQktd2Vycm9yIC1oaWRlIDExMyBcCisJCS1vdmVydmlldyAkKExPQ0FMX1BBVEgpL2NvcmUvamF2YS9vdmVydmlldy5odG1sCiAKIGZyYW1ld29ya19kb2NzX0xPQ0FMX0FERElUSU9OQUxfSkFWQV9ESVI6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLGZyYW1ld29yaykKIApAQCAtNDI4LDcgKzQzMyw5IEBACiAJCS1zYW1wbGVjb2RlICQoc2FtcGxlX2RpcikvV2lrdGlvbmFyeVNpbXBsZSBcCiAJCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1dpa3Rpb25hcnlTaW1wbGUgIldpa3Rpb25hcnkgKFNpbXBsaWZpZWQpIiBcCiAJCS1zYW1wbGVjb2RlICQoc2FtcGxlX2RpcikvVm9pY2VSZWNvZ25pdGlvblNlcnZpY2UgXAotCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9Wb2ljZVJlY29nbml0aW9uU2VydmljZSAiVm9pY2UgUmVjb2duaXRpb24gU2VydmljZSIKKwkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvVm9pY2VSZWNvZ25pdGlvblNlcnZpY2UgIlZvaWNlIFJlY29nbml0aW9uIFNlcnZpY2UiIFwKKwkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9YbWxBZGFwdGVycyBcCisJCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1htbEFkYXB0ZXJzICJYTUwgQWRhcHRlcnMiCiAKICMjIFNESyB2ZXJzaW9uIGlkZW50aWZpZXJzIHVzZWQgaW4gdGhlIHB1Ymxpc2hlZCBkb2NzCiAgICMgbWFqb3JbLm1pbm9yXSB2ZXJzaW9uIGZvciBjdXJyZW50IFNESy4gKGZ1bGwgcmVsZWFzZXMgb25seSkKQEAgLTQ2MywxMSArNDcwLDEzIEBACiAJCS1ub2RvY3MKIAogTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUjo9YnVpbGQvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNkawotTE9DQUxfRFJPSURET0NfQ1VTVE9NX0FTU0VUX0RJUjo9YXNzZXRzLXNkaworCitMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRSA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIAotJChmdWxsX3RhcmdldCk6ICQoZnJhbWV3b3JrX2J1aWx0KQorIyAkKGdlbiksIGkuZS4gZnJhbWV3b3JrLmFpZGwsIGlzIGFsc28gbmVlZGVkIHdoaWxlIGJ1aWxkaW5nIGFnYWluc3QgdGhlIGN1cnJlbnQgc3R1Yi4KKyQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkgJChnZW4pCiAkKElOVEVSTkFMX1BMQVRGT1JNX0FQSV9GSUxFKTogJChmdWxsX3RhcmdldCkKICQoY2FsbCBkaXN0LWZvci1nb2FscyxzZGssJChJTlRFUk5BTF9QTEFURk9STV9BUElfRklMRSkpCiAKQEAgLTQ5MCw3ICs0OTksOCBAQAogCQktcGFyc2Vjb21tZW50cwogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCisKK0xPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCkBAIC01MjEsMTQgKzUzMSwxMyBAQAogCQktcHJvb2ZyZWFkICQoT1VUX0RPQ1MpLyQoTE9DQUxfTU9EVUxFKS1wcm9vZnJlYWQudHh0IFwKIAkJLXRvZG8gJChPVVRfRE9DUykvJChMT0NBTF9NT0RVTEUpLWRvY3MtdG9kby5odG1sIFwKIAkJLXNka3ZhbHVlcyAkKE9VVF9ET0NTKSBcCi0JCS1oZGYgYW5kcm9pZC53aGljaGRvYyBvZmZsaW5lIAorCQktaGRmIGFuZHJvaWQud2hpY2hkb2Mgb2ZmbGluZQogCiBpZmVxICgkKGZyYW1ld29ya19kb2NzX1NES19QUkVWSUVXKSx0cnVlKQogICBMT0NBTF9EUk9JRERPQ19PUFRJT05TICs9IC1oZGYgc2RrLnByZXZpZXcgdHJ1ZQogZW5kaWYKIAogTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUjo9YnVpbGQvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNkawotTE9DQUxfRFJPSURET0NfQ1VTVE9NX0FTU0VUX0RJUjo9YXNzZXRzLXNkawogCiBpbmNsdWRlICQoQlVJTERfRFJPSURET0MpCiAKQEAgLTU0MSw3ICs1NTAsNiBAQAogJChmdWxsX3RhcmdldCk6ICQoc3RhdGljX2RvY19pbmRleF9yZWRpcmVjdCkKICQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkKIAotCiAjID09PT0gZG9jcyBmb3IgdGhlIHdlYiAob24gdGhlIGdvb2dsZSBhcHAgZW5naW5lIHNlcnZlcikgPT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC01NjUsMTIgKzU3MywxMSBAQAogCQktaGRmIHRlbXBsYXRlLnNob3dMYW5ndWFnZU1lbnUgdHJ1ZQogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIAogIyBleHBsaWNpdGx5IHNwZWNpZnkgdGhhdCBvbmxpbmUtc2RrIGRlcGVuZHMgb24gZnJhbWV3b3JrLXJlcyBhbmQgYW55IGdlbmVyYXRlZCBkb2NzCi0kKGZ1bGxfdGFyZ2V0KTogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldCAkKEFMTF9HRU5FUkFURURfRE9DUykKKyQoZnVsbF90YXJnZXQpOiBmcmFtZXdvcmstcmVzLXBhY2thZ2UtdGFyZ2V0CiAKICMgPT09PSBkb2NzIHRoYXQgaGF2ZSBhbGwgb2YgdGhlIHN0dWZmIHRoYXQncyBAaGlkZGVuID09PT09PT09PT09PT09PT09PT09PT09CiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKQEAgLTU4NywxMSArNTk0LDEwIEBACiBMT0NBTF9NT0RVTEUgOj0gaGlkZGVuCiBMT0NBTF9EUk9JRERPQ19PUFRJT05TOj1cCiAJCSQoZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfT1BUSU9OUykgXAotICAgICAgICAtdGl0bGUgIkFuZHJvaWQgU0RLIC0gSW5jbHVkaW5nIGhpZGRlbiBBUElzLiIKLSMgICAgICAgIC1oaWRkZW4KKwkJLXRpdGxlICJBbmRyb2lkIFNESyAtIEluY2x1ZGluZyBoaWRkZW4gQVBJcy4iCisjCQktaGlkZGVuCiAKIExPQ0FMX0RST0lERE9DX0NVU1RPTV9URU1QTEFURV9ESVI6PWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zZGsKLUxPQ0FMX0RST0lERE9DX0NVU1RPTV9BU1NFVF9ESVI6PWFzc2V0cy1zZGsKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCkBAIC02MDEsMTAgKzYwNywxNCBAQAogZXh0X2RpcnMgOj0gXAogCS4uLy4uL2V4dGVybmFsL25pc3Qtc2lwL2phdmEgXAogCS4uLy4uL2V4dGVybmFsL2FwYWNoZS1odHRwL3NyYyBcCi0JLi4vLi4vZXh0ZXJuYWwvdGFnc291cC9zcmMKKwkuLi8uLi9leHRlcm5hbC90YWdzb3VwL3NyYyBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKIAogZXh0X3NyY19maWxlcyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsJChleHRfZGlycykpCiAKK2V4dF9yZXNfZGlycyA6PSBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKKwogIyA9PT09ICB0aGUgbGlicmFyeSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC02MTIsNiArNjIyLDcgQEAKIAogTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTIDo9IHRydWUKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUKK0xPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSAkKGV4dF9yZXNfZGlycykKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEUgOj0gZXh0CiAKZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCA1NjE4ZWFhLi5lNWYxZjkwIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC02Nyw3ICs2NywyMCBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGlicmV2ZXJiX2ludGVybWVkaWF0ZXMpCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJyZXZlcmJ0ZXN0X2ludGVybWVkaWF0ZXMpCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL3NvdW5kZngvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kIC4gLXR5cGUgZiAtbmFtZSAiKi5ycyIgLXByaW50MCB8IHhhcmdzIC0wIHRvdWNoKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYW5kcm9pZF9ydW50aW1lX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovbGliL2xpYmFuZHJvaWRfcnVudGltZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5bWJvbHMvc3lzdGVtL2xpYi9saWJhbmRyb2lkX3J1bnRpbWUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmFuZHJvaWRfcnVudGltZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmh3dWlfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9saWIvbGliaHd1aS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5bWJvbHMvc3lzdGVtL2xpYi9saWJod3VpLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJod3VpLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS8qKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ2xpcGJvYXJkLlApCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LlApCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2FuZHJvaWRfc3R1YnNfY3VycmVudF9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgb3V0L3RhcmdldC9jb21tb24vZG9jcy9hcGktc3R1YnMqKQogCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKZGlmZiAtLWdpdCBhL2FwaS85LnhtbCBiL2FwaS85LnhtbAppbmRleCA5ZmYxMjg3Li4zZTc2NTNjIDEwMDY0NAotLS0gYS9hcGkvOS54bWwKKysrIGIvYXBpLzkueG1sCkBAIC0xNTg0NSwxNyArMTU4NDUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRJbnN0YW5jZUNvdW50IgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEludGVudCIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg1NzEsMTYgKzU4NTYwLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYml0bWFwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iQ2FudmFzIgotIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2wiIHR5cGU9ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xpcFBhdGgiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NDk3LDE3ICs1OTQ3Niw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InBhaW50IiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlBhaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZyZWVHbENhY2hlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDbGlwQm91bmRzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTU1NCwxNyArNTk1MjIsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRHTCIKLSByZXR1cm49ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTkyOCwyMSArNTk4ODUsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFZpZXdwb3J0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2tldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNzQxNDgsNyArNzQwOTAsNyBAQAogIHR5cGU9ImZsb2F0IgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIwLjAwMTBmIgorIHZhbHVlPSIwLjAwMWYiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTQ3NzYwLDE3ICsxNDc3MDIsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImFib3J0VXBkYXRlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0Nzc4MiwzMCArMTQ3NzEzLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLkxvbmcsID8gZXh0ZW5kcyBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QmZ3Q7Jmd0OyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjb3B5U3RyaW5nVG9CdWZmZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0NzgzMiwxNyArMTQ3NzM5LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZGVsZXRlUm93IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRCbG9iIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODAzOSwxNyArMTQ3OTM1LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaGFzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBZnRlckxhc3QiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODI1MywxNyArMTQ4MTM4LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3VwcG9ydHNVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDgyOTAsMTI0ICsxNDgxNjQsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJvYnNlcnZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlQmxvYiIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRG91YmxlIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVGbG9hdCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJmbG9hdCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVJbnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUxvbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ibG9uZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTaG9ydCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJzaG9ydCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTdHJpbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVUb051bGwiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1vY2tEaWFsb2dJbnRlcmZhY2UiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE2NDY3NCw3ICsxNjQ0MzAsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTY0Njg1LDcgKzE2NDQ0MSw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTk1NTk2LDYgKzE5NTM1MiwzOSBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxtZXRob2QgbmFtZT0iYWZ0ZXJUZXh0Q2hhbmdlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA0MDUyLDM5ICsyMDM4NDEsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTGlzdFZpZXcuRml4ZWRWaWV3SW5mbyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpkaWZmIC0tZ2l0IGEvYXBpL2N1cnJlbnQueG1sIGIvYXBpL2N1cnJlbnQueG1sCmluZGV4IDZhN2NjMWMuLjYzNjUyM2MgMTAwNjQ0Ci0tLSBhL2FwaS9jdXJyZW50LnhtbAorKysgYi9hcGkvY3VycmVudC54bWwKQEAgLTE0ODIsNiArMTQ4MiwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYW5pbWF0b3JfZmFkZV9pbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3NDMyNjA5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFuaW1hdG9yX2ZhZGVfb3V0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTc0MzI2MTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYW50aWNpcGF0ZV9pbnRlcnBvbGF0b3IiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMDg4LDYgKzIxMTAsMTcxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CYXJTaXplIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQmFyU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJhclRhYlN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkxheW91dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTg0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uTW9kZUNsb3NlQnV0dG9uU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTUwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25WaWV3Q2xhc3MiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYWN0aXZpdHlDbG9zZUVudGVyQW5pbWF0aW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjEzMiw2ICsyMzE5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhZGFwdGVyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYWRkU3RhdGVzRnJvbUNoaWxkcmVuIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjE2NSw2ICsyMzYzLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbGVydERpYWxvZ1RoZW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1OTgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWxsQ29udGFjdHNOYW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYWxsb3dCYWNrdXAiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMjUzLDYgKzI0NzMsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRlTGF5b3V0Q2hhbmdlcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFuaW1hdGVPbkNsaWNrIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjM0MSw2ICsyNTgzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImF1dGhvciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI1NzIsNiArMjgyNSwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYnJlYWRDcnVtYlNob3J0VGl0bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU5MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJicmVhZENydW1iVGl0bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU5MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJidWZmZXJUeXBlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzAwMSw2ICszMjc2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJjb2x1bW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJjb2x1bW5EZWxheSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMxNDQsNiArMzQzMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImN5Y2xlcyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMzNDIsNiArMzYzOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZGlhbG9nVGhlbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU5NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJkaWFsb2dUaXRsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM0MDgsNiArMzcxNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZGlzcGxheU9wdGlvbnMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJkaXRoZXIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zNjA2LDYgKzM5MjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxNjcsNiArNDQ5NywxMDUgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudE5leHRFbnRlckFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTYzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50TmV4dEV4aXRBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudE9wZW5FbnRlckFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudFByZXZFbnRlckFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50UHJldkV4aXRBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJmcmVlemVzVGV4dCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxNzgsNiArNDYwNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJvbSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImZyb21BbHBoYSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQyMDAsNiArNDY0MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJvbVZhbHVlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZnJvbVhEZWx0YSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ0ODYsNiArNDkzNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Imhhc0NvZGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NjA3LDYgKzUwNjksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imljb25pZmllZEJ5RGVmYXVsdCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTgzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImlkIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDcxNyw2ICs1MTkwLDUwIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbWVTdWJ0eXBlRXh0cmFWYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTcwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImltZVN1YnR5cGVMb2NhbGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImltbWVyc2l2ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNDU2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImluQW5pbWF0aW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTA1OCw2ICs1NTc1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpdGVtUGFkZGluZyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Iml0ZW1UZXh0QXBwZWFyYW5jZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTYzMjMsNiArNjg1MSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02MzU2LDYgKzY4OTUsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imxpc3REaXZpZGVyQWxlcnREaWFsb2ciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU5NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsaXN0UG9wdXBXaW5kb3dTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTg4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Imxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjQxMSw2ICs2OTcyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsb2dvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM0NTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibG9uZ0NsaWNrYWJsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY0MjIsNiArNjk5NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibG9vcFZpZXdzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1OTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibWFuYWdlU3BhY2VBY3Rpdml0eSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY1NzYsNiArNzE1OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJtZW51Q2F0ZWdvcnkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02NzA4LDYgKzczMDIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im5hdmlnYXRpb25Nb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibmVnYXRpdmVCdXR0b25UZXh0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjg3Myw2ICs3NDc4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJvcmRlcmluZyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Im9yZGVyaW5nRnJvbVhtbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY5MDYsMzkgKzc1MjIsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Ci08ZmllbGQgbmFtZT0ib3ZlclNjcm9sbEZvb3RlciIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2ODQzNDU5IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9Im92ZXJTY3JvbGxIZWFkZXIiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxNjg0MzQ1OCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJvdmVyU2Nyb2xsTW9kZSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2ODQzNDU3IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgogPGZpZWxkIG5hbWU9InBhZGRpbmciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC03MjI1LDYgKzc4MDgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InBvcHVwTWVudVN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0icG9wdXBXaW5kb3dTdHlsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTczMTMsNiArNzkwNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0icHJldmlld0ltYWdlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0icHJpb3JpdHkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC03NDY3LDYgKzgwNzIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InByb3BlcnR5TmFtZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByb3RlY3Rpb25MZXZlbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTgyMzcsNiArODg1MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2VsZWN0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2V0dGluZ3NBY3Rpdml0eSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTgzNDcsNiArODk3NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2hvd0FzQWN0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2hvd0RlZmF1bHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDI0LDYgKzkwNjIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNvcnRPcmRlciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNvdW5kRWZmZWN0c0VuYWJsZWQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDY4LDYgKzkxMTcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNwaW5uZXJNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic3Bpbm5lclN0eWxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODQ3OSw2ICs5MTM5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzcGxpdE1vdGlvbkV2ZW50cyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTcxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNyYyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTg1NjcsNiArOTIzOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic3RhdGVfYWN0aXZhdGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic3RhdGVfYWN0aXZlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODc3Niw2ICs5NDU4LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzdWJ0aXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InN1YnRpdGxlVGV4dFN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic3VnZ2VzdEFjdGlvbk1zZyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTkxNTAsNiArOTg1NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZVBvcHVwTWVudSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTkwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRleHRBcHBlYXJhbmNlTWVkaXVtIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTIxNiw2ICs5OTMxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNtYWxsUG9wdXBNZW51IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1OTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idGV4dENoZWNrTWFyayIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTkyNDksNiArOTk3NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idGV4dENvbG9yQWxlcnREaWFsb2dMaXN0SXRlbSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTk1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTk2NTYsNiArMTAzOTMsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRpdGxlVGV4dFN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ0b0FscGhhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTY3OCw2ICsxMDQzNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG9WYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRvWERlbHRhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTg1NCw2ICsxMDYyNCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idXJpIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idXNlTGV2ZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05ODg3LDYgKzEwNjY4LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZUZyb20iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZVRvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idmFsdWVUeXBlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idmFyaWFibGVQYWRkaW5nIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTAxOTUsNiArMTEwMDksMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTUxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IndpbmRvd0FuaW1hdGlvblN0eWxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTA0MDQsNiArMTEyNTEsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhDbGFzcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhFeHByZXNzaW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0id3JpdGVQZXJtaXNzaW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQwNTMsNiArMTQ5MjIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImhvbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjkwODM1MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJpY29uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQ0MzgsNiArMTUzMTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdFRleHRNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5MDgzNTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2VsZWN0ZWRJY29uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQ5NzgsNiArMTU4NjksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imxpc3RfY29udGVudCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MzY3MDczIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByZWZlcmVuY2VfY2F0ZWdvcnkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTA4OCw2ICsxNTk5MCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2ltcGxlX2xpc3RfaXRlbV9hY3RpdmF0ZWRfMSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MzY3MDc1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzM2NzA3NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzaW1wbGVfbGlzdF9pdGVtX2NoZWNrZWQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTEyMSw2ICsxNjA0NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTczNjcwNzQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2ltcGxlX3NwaW5uZXJfZHJvcGRvd25faXRlbSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE1MTY2LDYgKzE2MTAxLDIzIEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJSLm1lbnUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJSLm1lbnUiCisgdHlwZT0iYW5kcm9pZC5SLm1lbnUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iUi5wbHVyYWxzIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU1NDYsNiArMTY0OTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdFRleHRNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTcwMzkzOTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idW5rbm93bk5hbWUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTk3MCw2ICsxNjkzMywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X1BvcHVwTWVudV9MYXJnZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTg0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX1dpZGdldF9Qb3B1cE1lbnVfU21hbGwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk4NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9XaWRnZXRfVGFiV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYwODAsNiArMTcwNjUsNTAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0RpYWxvZ19Ob0ZyYW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfSG9sbyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0hvbG9fTm9BY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9Ib2xvX05vQWN0aW9uQmFyX0Z1bGxzY3JlZW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9JbnB1dE1ldGhvZCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MTAyLDYgKzE3MTMxLDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9MaWdodF9Ib2xvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTGlnaHRfSG9sb19Ob0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X0hvbG9fTm9BY3Rpb25CYXJfRnVsbHNjcmVlbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X05vVGl0bGVCYXIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjE3OSw2ICsxNzI0MSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTm9UaXRsZUJhcl9PdmVybGF5QWN0aW9uTW9kZXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9QYW5lbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MjY3LDYgKzE3MzQwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9XaXRoQWN0aW9uQmFyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyODksNiArMTczNzMsMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9BY3Rpb25CdXR0b24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfQWN0aW9uQnV0dG9uX0Nsb3NlTW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTgzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9BY3Rpb25CdXR0b25fT3ZlcmZsb3ciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk4MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfQXV0b0NvbXBsZXRlVGV4dFZpZXciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjQzMiw2ICsxNzU0OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X0ZyYWdtZW50QnJlYWRDcnVtYnMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk4NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfR2FsbGVyeSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2NDg3LDYgKzE3NjE1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5ODAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0X0xpc3RWaWV3IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTY1MzEsNiArMTc2NzAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9Qb3B1cE1lbnUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk4MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfUG9wdXBXaW5kb3ciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjY2Myw2ICsxNzgxMywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X1NwaW5uZXJfRHJvcERvd24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfVGFiV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkwNDMsOCArMjAyMDQsMjYxMyBAQAogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+CiA8L3BhY2thZ2U+Cis8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbiIKKz4KKzxjbGFzcyBuYW1lPSJBbmltYXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9uZSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RHVyYXRpb24iCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdGVuZXJzIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5TGlzdCZsdDthbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFydERlbGF5IgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUnVubmluZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVBbGxMaXN0ZW5lcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHVyYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlRpbWVJbnRlcnBvbGF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhcnREZWxheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnREZWxheSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUYXJnZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0dXBFbmRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldHVwU3RhcnRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25FbmQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25SZXBlYXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0b3JJbmZsYXRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0b3JJbmZsYXRlciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckluZmxhdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImxvYWRBbmltYXRvciIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uRW5kIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblJlcGVhdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0b3JTZXQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdG9yU2V0IgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldENoaWxkQW5pbWF0aW9ucyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3ImZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldER1cmF0aW9uIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFydERlbGF5IgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1J1bm5pbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXkiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldC5CdWlsZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwbGF5U2VxdWVudGlhbGx5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXlUb2dldGhlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1zIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREdXJhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVGltZUludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFydERlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnREZWxheSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBbmltYXRvclNldC5CdWlsZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWZ0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZnRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZm9yZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW0iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndpdGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEb3VibGVFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRG91YmxlRXZhbHVhdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkRvdWJsZUV2YWx1YXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRmxvYXRFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRmxvYXRFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uRmxvYXRFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkludEV2YWx1YXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJJbnRFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uSW50RXZhbHVhdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJLZXlmcmFtZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuQ2xvbmVhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLkZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5Eb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNsb25lIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhY3Rpb24iCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5UaW1lSW50ZXJwb2xhdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2xhc3MiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZyYWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVGltZUludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxheW91dFRyYW5zaXRpb24iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxheW91dFRyYW5zaXRpb24iCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRDaGlsZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2hpbGQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZFRyYW5zaXRpb25MaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRvciIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldER1cmF0aW9uIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5UaW1lSW50ZXJwb2xhdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YWdnZXIiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zaXRpb25MaXN0ZW5lcnMiCisgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDthbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lciZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGlkZUNoaWxkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlQ2hpbGQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoaWxkIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUcmFuc2l0aW9uTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbi5UcmFuc2l0aW9uTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5pbWF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRvciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHVyYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREdXJhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVGltZUludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFnZ2VyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhcnREZWxheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dDaGlsZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2hpbGQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQVBQRUFSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSEFOR0VfQVBQRUFSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSEFOR0VfRElTQVBQRUFSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNBUFBFQVJJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iTGF5b3V0VHJhbnNpdGlvbi5UcmFuc2l0aW9uTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImVuZFRyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRUcmFuc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJPYmplY3RBbmltYXRvciIKKyBleHRlbmRzPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJPYmplY3RBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik9iamVjdEFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik9iamVjdEFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldFByb3BlcnR5TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFyZ2V0IgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9wZXJ0eU5hbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjbG9uZSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEdldHRlciIKKyByZXR1cm49ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9wZXJ0eU5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNldHRlciIKKyByZXR1cm49ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFdmFsdWF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJldmFsdWF0b3IiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0R2V0dGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZ2V0dGVyIiB0eXBlPSJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvcGVydHlOYW1lIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNldHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNldHRlciIgdHlwZT0iamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iVC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJSR0JFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iUkdCRXZhbHVhdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlJHQkV2YWx1YXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlRpbWVJbnRlcnBvbGF0b3IiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0aW9uIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5wdXQiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iVHlwZUV2YWx1YXRvciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJWYWx1ZUFuaW1hdG9yIgorIGV4dGVuZHM9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iVmFsdWVBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iVmFsdWVBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iVC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFVwZGF0ZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRlZFZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRlZFZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1cnJlbnRQbGF5VGltZSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RHVyYXRpb24iCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYW1lRGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uVGltZUludGVycG9sYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXBlYXRDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXBlYXRNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZhbHVlcyIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNSdW5uaW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVBbGxVcGRhdGVMaXN0ZW5lcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVVwZGF0ZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXZlcnNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXJyZW50UGxheVRpbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwbGF5VGltZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREdXJhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEV2YWx1YXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZyYW1lRGVsYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYW1lRGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlRpbWVJbnRlcnBvbGF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVwZWF0Q291bnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlcGVhdE1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydERlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iSU5GSU5JVEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJSRVNUQVJUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJSRVZFUlNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25VcGRhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmFwcCIKID4KKzxjbGFzcyBuYW1lPSJBY3Rpb25CYXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWN0aW9uQmFyIgorIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDdXN0b21OYXZpZ2F0aW9uVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGlzcGxheU9wdGlvbnMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRIZWlnaHQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkTmF2aWdhdGlvbkl0ZW0iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZFRhYiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdWJ0aXRsZSIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUaXRsZSIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzU2hvd2luZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdUYWIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlVGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlVGFiQXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2VsZWN0VGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmFja2dyb3VuZERyYXdhYmxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEN1c3RvbU5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0aW9ucyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERpc3BsYXlPcHRpb25zIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcHRpb25zIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1hc2siIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5OYXZpZ2F0aW9uQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZhdWx0U2VsZWN0ZWRQb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGVkTmF2aWdhdGlvbkl0ZW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJ0aXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFiTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX0hJREVfSE9NRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElTUExBWV9VU0VfTE9HTyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX0NVU1RPTSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1QiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5BVklHQVRJT05fTU9ERV9TVEFOREFSRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX1RBQlMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQWN0aW9uQmFyLk5hdmlnYXRpb25DYWxsYmFjayIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25OYXZpZ2F0aW9uSXRlbVNlbGVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtUG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbUlkIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJBY3Rpb25CYXIuVGFiIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWN0aW9uQmFyLlRhYiIKKyB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEN1c3RvbVZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEljb24iCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYWciCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZWxlY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tVmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SWNvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUYWJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWJMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUYWciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9iaiIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUZXh0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iSU5WQUxJRF9QT1NJVElPTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQWN0aW9uQmFyLlRhYkxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblRhYlNlbGVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZ0IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uVGFiVW5zZWxlY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmdCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iQWN0aXZpdHkiCiAgZXh0ZW5kcz0iYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkwNTcsNyArMjI4MjMsNyBAQAogPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LktleUV2ZW50LkNhbGxiYWNrIj4KIDwvaW1wbGVtZW50cz4KLTxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5Ij4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5MiI+CiA8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIiPgogPC9pbXBsZW1lbnRzPgpAQCAtMTkxOTAsNiArMjI5NTYsNDkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXYiIHR5cGU9ImFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkdW1wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmQiIHR5cGU9ImphdmEuaW8uRmlsZURlc2NyaXB0b3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IndyaXRlciIgdHlwZT0iamF2YS5pby5QcmludFdyaXRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRGcmFnbWVudEJ5SWQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRGcmFnbWVudEJ5VGFnIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZpbmRWaWV3QnlJZCIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MjU1LDYgKzIzMDY0LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNoaWxkIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpb25CYXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QXBwbGljYXRpb24iCiAgcmV0dXJuPSJhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTMyMSwxMiArMjMxNDEsMTIgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0SW5zdGFuY2VDb3VudCIKLSByZXR1cm49ImxvbmciCis8bWV0aG9kIG5hbWU9ImdldEZyYWdtZW50TWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlciIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCkBAIC0xOTM2NSw2ICsyMzE4NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXJNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRMb2NhbENsYXNzTmFtZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk0OTksNiArMjMzMzAsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0NoYW5naW5nQ29uZmlndXJhdGlvbnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQ2hpbGQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NTM5LDcgKzIzMzkyLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KQEAgLTE5NTgzLDYgKzIzNDM2LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BdHRhY2hGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkF0dGFjaGVkVG9XaW5kb3ciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5ODEyLDYgKzIzNjc4LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25EZXN0cm95IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDE2OSw2ICsyNDA1NCwxOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25TdG9wIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDI4Miw2ICsyNDE4MCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvcGVuT3B0aW9uc01lbnUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMzA4LDYgKzI0MjE3LDQ3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV4aXRBbmltIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVnaXN0ZXJGb3JDb250ZXh0TWVudSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA2OTksNiArMjQ2NDksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDczMSw2ICsyNDY5NCwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5SWZOZWVkZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwODA1LDcgKzI0Nzg1LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+CkBAIC0yMDg1MCw3ICsyNDgzMCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgpAQCAtMjA5NjMsNiArMjQ5NDMsMTcgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iUkVTVUxUX0NBTkNFTEVEIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjI4MzMsNiArMjY4MjQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29udGV4dCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db250ZXh0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCiAgcmV0dXJuPSJhbmRyb2lkLmFwcC5BbGVydERpYWxvZy5CdWlsZGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIzNjY1LDYgKzI3NjY3LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWN0aW9uQmFyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENvbnRleHQiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMzc0Miw2ICsyNzc1NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzU2hvd2luZyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQxMDMsNiArMjgxMjcsMTkgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uU3RvcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ1MTEsNiArMjg1NDgsMjUxIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEaWFsb2dGcmFnbWVudCIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25EaXNtaXNzTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRpYWxvZ0ZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRpc21pc3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENhbmNlbGFibGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERpYWxvZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkRpYWxvZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTaG93c0RpYWxvZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGhlbWUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkaWFsb2ciIHR5cGU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVEaWFsb2ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5EaWFsb2ciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGlhbG9nIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENhbmNlbGFibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYW5jZWxhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNob3dzRGlhbG9nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2hvd3NEaWFsb2ciIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3R5bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVtZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtYW5hZ2VyIiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbiIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9STUFMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVFlMRV9OT19GUkFNRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9fSU5QVVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUWUxFX05PX1RJVExFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRG93bmxvYWRNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ2NTAsNiArMjg5MzIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNPTFVNTl9MT0NBTF9GSUxFTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtsb2NhbF9maWxlbmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJDT0xVTU5fTE9DQUxfVVJJIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI1MzMxLDYgKzI5NjI0LDE0MTkgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkZyYWdtZW50IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3MiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkdW1wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmZCIgdHlwZT0iamF2YS5pby5GaWxlRGVzY3JpcHRvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0id3JpdGVyIiB0eXBlPSJqYXZhLmlvLlByaW50V3JpdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZXF1YWxzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGl2aXR5IgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBcmd1bWVudHMiCisgcmV0dXJuPSJhbmRyb2lkLm9zLkJ1bmRsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYWdtZW50TWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyTWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmV0YWluSW5zdGFuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFnIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhcmdldEZyYWdtZW50IgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXRSZXF1ZXN0Q29kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNoQ29kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imluc3RhbnRpYXRlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imluc3RhbnRpYXRlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0FkZGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSGlkZGVuIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSW5MYXlvdXQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNSZXN1bWVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVmlzaWJsZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFjdGl2aXR5Q3JlYXRlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BY3Rpdml0eVJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlc3VsdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkF0dGFjaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3Q29uZmlnIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db250ZXh0SXRlbVNlbGVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUFuaW1hdG9yIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50ZXIiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5leHRBbmltIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVDb250ZXh0TWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5Db250ZXh0TWVudSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idiIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmZvIiB0eXBlPSJhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5mbGF0ZXIiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZmxhdGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGVzdHJveVZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGV0YWNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkhpZGRlbkNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoaWRkZW4iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25JbmZsYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Mb3dNZW1vcnkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uT3B0aW9uc0l0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbk9wdGlvbnNNZW51Q2xvc2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QYXVzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVwYXJlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlc3VtZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TYXZlSW5zdGFuY2VTdGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0b3AiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBcmd1bWVudHMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIYXNPcHRpb25zTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imhhc01lbnUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmV0YWluSW5zdGFuY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXRhaW4iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFyZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJGb3JDb250ZXh0TWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkZyYWdtZW50Lkluc3RhbnRpYXRpb25FeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJGcmFnbWVudC5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Lkluc3RhbnRpYXRpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtc2ciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuRXhjZXB0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRnJhZ21lbnRCcmVhZENydW1icyIKKyBleHRlbmRzPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIuT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkZyYWdtZW50QnJlYWRDcnVtYnMiCisgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRCcmVhZENydW1icyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJGcmFnbWVudEJyZWFkQ3J1bWJzIgorIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50QnJlYWRDcnVtYnMiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkZyYWdtZW50QnJlYWRDcnVtYnMiCisgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRCcmVhZENydW1icyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uQmFja1N0YWNrQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25MYXlvdXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJjaGFuZ2VkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJiIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWN0aXZpdHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzaG9ydFRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJGcmFnbWVudE1hbmFnZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZGRPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlci5PbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3VudEJhY2tTdGFja0VudHJpZXMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkdW1wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmaXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZkIiB0eXBlPSJqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ3cml0ZXIiIHR5cGU9ImphdmEuaW8uUHJpbnRXcml0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeUlkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeVRhZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCYWNrU3RhY2tFbnRyeSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlci5CYWNrU3RhY2tFbnRyeSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYWdtZW50IgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVuZGxlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5UcmFuc2FjdGlvbiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXRGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVuZGxlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIuT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IkZyYWdtZW50TWFuYWdlci5CYWNrU3RhY2tFbnRyeSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZ2V0QnJlYWRDcnVtYlNob3J0VGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QnJlYWRDcnVtYlRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJGcmFnbWVudE1hbmFnZXIuT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQmFja1N0YWNrQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRUb0JhY2tTdGFjayIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21taXQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWRlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNFbXB0eSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXBsYWNlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlcGxhY2UiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCcmVhZENydW1iU2hvcnRUaXRsZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QnJlYWRDcnVtYlNob3J0VGl0bGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QnJlYWRDcnVtYlRpdGxlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCcmVhZENydW1iVGl0bGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tQW5pbWF0aW9ucyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50ZXIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXhpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zaXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2l0aW9uU3R5bGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0eWxlUmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9FTlRFUl9NQVNLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0VYSVRfTUFTSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9GUkFHTUVOVF9DTE9TRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9GUkFHTUVOVF9ORVhUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0ZSQUdNRU5UX09QRU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MDk3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRlJBR01FTlRfUFJFViIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1VOU0VUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJJbnN0cnVtZW50YXRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNjc4MCw2ICszMjQ4NiwzNzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikxpc3RGcmFnbWVudCIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLmFwcC5MaXN0RnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdEFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMaXN0VmlldyIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbUlkIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxpc3RJdGVtQ2xpY2siCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0VmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idiIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVtcHR5VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdEFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMaXN0U2hvd24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzaG93biIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMaXN0U2hvd25Ob0FuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNob3duIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkxvYWRlck1hbmFnZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5pdExvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrcyZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXN0YXJ0TG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrcyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZEZpbmlzaGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkxvYWRlck1hbmFnaW5nRnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXJNYW5hZ2luZ0ZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnaW5nRnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUxvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Jbml0aWFsaXplTG9hZGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRDb21wbGV0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZEZpbmlzaGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRMb2FkaW5nIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkxvY2FsQWN0aXZpdHlNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjcyNjMsNiArMzMzMzYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfSElHSF9QUklPUklUWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEyOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX0lOU0lTVEVOVCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI3NDY5LDYgKzMzNTUzLDI3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0aWNrZXJJY29ucyIKKyB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFtdIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSJudWxsIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idGlja2VyU3VidGl0bGUiCisgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRpY2tlclRleHQiCiAgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjc0NzksNiArMzM1ODQsMTYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRpY2tlclRpdGxlIgorIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ2aWJyYXRlIgogIHR5cGU9ImxvbmdbXSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjg0NTMsNiArMzQ1NjgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfUVVFUllfUkVGSU5FTUVOVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iSU5URU5UX0FDVElPTl9HTE9CQUxfU0VBUkNIIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI4NTUyLDYgKzM0Njc4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVUdHRVNUX0NPTFVNTl9GTEFHUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzdWdnZXN0X2ZsYWdzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlNVR0dFU1RfQ09MVU1OX0ZPUk1BVCIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMDQ5Myw2ICszNjYzMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlVTRVNfUE9MSUNZX1dBVENIX0xPR0lOIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzA3ODIsNiArMzY5MzAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0R2xvYmFsUHJveHlBZG1pbiIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwODA4LDYgKzM2OTY3LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1heGltdW1MZW5ndGgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA4MzQsNiArMzcwMDYsODQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bUxldHRlcnMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1OdW1lcmljIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkUXVhbGl0eSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDkxMCw2ICszNzE2MCwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEdsb2JhbFByb3h5IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJveHlTcGVjIiB0eXBlPSJqYXZhLm5ldC5Qcm94eSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXhjbHVzaW9uTGlzdCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwOTQwLDYgKzM3MjA3LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InRpbWVNcyIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxlbmd0aCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA5NTUsNiArMzcyMzcsOTYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bU51bWVyaWMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRRdWFsaXR5IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTA0OSw2ICszNzQyMSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMzkzMjE2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMyMDMyLDYgKzM4NDE1LDY2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkcyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkcyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdzIiB0eXBlPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3cyIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlQXBwV2lkZ2V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMjQ0OCw2ICszODg5MSwxMTEgQEAKIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoIgogPgorPGNsYXNzIG5hbWU9IkJsdWV0b290aEEyZHAiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iZ2V0Q29ubmVjdGVkRGV2aWNlcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7YW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb25uZWN0aW9uU3RhdGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRldmljZSIgdHlwZT0iYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2FuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXRlcyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNBMmRwUGxheWluZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRldmljZSIgdHlwZT0iYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmJsdWV0b290aC5hMmRwLnByb2ZpbGUuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJBQ1RJT05fUExBWUlOR19TVEFURV9DSEFOR0VEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuYmx1ZXRvb3RoLmEyZHAucHJvZmlsZS5hY3Rpb24uUExBWUlOR19TVEFURV9DSEFOR0VEJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFX05PVF9QTEFZSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVfUExBWUlORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCbHVldG9vdGhBZGFwdGVyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzI0ODAsNiArMzkwMjgsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9zZVByb2ZpbGVQcm94eSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb2ZpbGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJveHkiIHR5cGU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGlzYWJsZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzI1NDYsNiArMzkxMDksMjMgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvZmlsZVByb3h5IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvZmlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFJlbW90ZURldmljZSIKICByZXR1cm49ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMjY0NCw2ICszOTIyNCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkFDVElPTl9ESVNDT1ZFUllfRklOSVNIRUQiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzI3MzIsNiArMzkzMjMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX0NPTk5FQ1RJT05fU1RBVEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5leHRyYS5DT05ORUNUSU9OX1NUQVRFJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkVYVFJBX0RJU0NPVkVSQUJMRV9EVVJBVElPTiIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMjc1NCw2ICszOTM1NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhUUkFfUFJFVklPVVNfQ09OTkVDVElPTl9TVEFURSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmJsdWV0b290aC5hZGFwdGVyLmV4dHJhLlBSRVZJT1VTX0NPTk5FQ1RJT05fU1RBVEUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRVhUUkFfUFJFVklPVVNfU0NBTl9NT0RFIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMyODMxLDYgKzM5NDQ0LDUwIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURV9DT05ORUNURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFX0NPTk5FQ1RJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFX0RJU0NPTk5FQ1RFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVfRElTQ09OTkVDVElORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iU1RBVEVfT0ZGIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzQwNzIsNiArNDA3MjksMzA2IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJCbHVldG9vdGhIZWFkc2V0IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImdldENvbm5lY3RlZERldmljZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2FuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29ubmVjdGlvblN0YXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXZpY2UiIHR5cGU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDthbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGF0ZXMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQXVkaW9Db25uZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXZpY2UiIHR5cGU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFZvaWNlUmVjb2duaXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXZpY2UiIHR5cGU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wVm9pY2VSZWNvZ25pdGlvbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRldmljZSIgdHlwZT0iYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX0FVRElPX1NUQVRFX0NIQU5HRUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5wcm9maWxlLmFjdGlvbi5BVURJT19TVEFURV9DSEFOR0VEJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVfQVVESU9fQ09OTkVDVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVfQVVESU9fRElTQ09OTkVDVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJCbHVldG9vdGhQcm9maWxlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZ2V0Q29ubmVjdGVkRGV2aWNlcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7YW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENvbm5lY3Rpb25TdGF0ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXZpY2UiIHR5cGU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDthbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXRlcyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBMkRQIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9QUkVWSU9VU19TVEFURSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmJsdWV0b290aC5wcm9maWxlLmV4dHJhLlBSRVZJT1VTX1NUQVRFJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX1NUQVRFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuYmx1ZXRvb3RoLnByb2ZpbGUuZXh0cmEuU1RBVEUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSEVBRFNFVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVfQ09OTkVDVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURV9DT05ORUNUSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURV9ESVNDT05ORUNURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFX0RJU0NPTk5FQ1RJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IkJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblNlcnZpY2VDb25uZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb2ZpbGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJveHkiIHR5cGU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TZXJ2aWNlRGlzY29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9maWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkJsdWV0b290aFNlcnZlclNvY2tldCIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0NjQzLDYgKzQxNjAwLDcxIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFzeW5jVGFza0xvYWRlciIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBc3luY1Rhc2tMb2FkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkFzeW5jVGFza0xvYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2FuY2VsTG9hZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZm9yY2VMb2FkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkSW5CYWNrZ3JvdW5kIgorIHJldHVybj0iRCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ2FuY2VsbGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCcm9hZGNhc3RSZWNlaXZlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ4NzMsNiArNDE4OTUsNTcxIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDbGlwRGF0YSIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRJdGVtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvbiIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEl0ZW0iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJdGVtQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3SW50ZW50IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1BsYWluVGV4dCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3UmF3VXJpIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3VXJpIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc29sdmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ1JFQVRPUiIKKyB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGF0YS5JdGVtIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGF0YS5JdGVtIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNvZXJjZVRvVGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEludGVudCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VXJpIgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNsaXBEZXNjcmlwdGlvbiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEZXNjcmlwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGVzY3JpcHRpb24iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjb21wYXJlTWltZVR5cGVzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb25jcmV0ZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc2lyZWRUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmlsdGVyTWltZVR5cGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMYWJlbCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWltZVR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1pbWVUeXBlQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzTWltZVR5cGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3cml0ZVRvUGFyY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVzdCIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJDUkVBVE9SIgorIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1JTUVUWVBFX1RFWFRfSU5URU5UIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3RleHQvdm5kLmFuZHJvaWQuaW50ZW50JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1JTUVUWVBFX1RFWFRfUExBSU4iCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dGV4dC9wbGFpbiZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU1FVFlQRV9URVhUX1VSSUxJU1QiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dGV4dC91cmktbGlzdCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlciIKKyBleHRlbmRzPSJhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoYXQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJpbWFyeUNsaXAiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbiIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNQcmltYXJ5Q2xpcCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzVGV4dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoYXQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJpbWFyeUNsaXAiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbGlwIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblByaW1hcnlDbGlwQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IkNvbXBvbmVudENhbGxiYWNrcyIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMzUyNDYsNiArNDI4MzMsMjEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyZWFtVHlwZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZUZpbHRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM1MzgyLDYgKzQyOTg0LDQ4IEBACiA8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblBpcGVIZWxwZXIiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJUIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmdW5jIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyLlBpcGVEYXRhV3JpdGVyJmx0O1QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5UeXBlZEFzc2V0RmlsZSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlRmlsdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJxdWVyeSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzU0NDIsNiArNDMwODYsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGVybWlzc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaHV0ZG93biIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzU0NjIsNiArNDMxMTcsMzUgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJDb250ZW50UHJvdmlkZXIuUGlwZURhdGFXcml0ZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9IndyaXRlRGF0YVRvUGlwZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0cHV0IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJUIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250ZW50UHJvdmlkZXJDbGllbnQiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNTUzNCw2ICs0MzIxOCwyMyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJlYW1UeXBlcyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJsIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlRmlsdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFR5cGUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM1NjA0LDYgKzQzMzA1LDI3IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzYzMjksNiArNDQwNTEsMTcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VycmVudFN5bmNzIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5jb250ZW50LlN5bmNJbmZvJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgpAQCAtMzYzNzQsNiArNDQxMDcsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXV0aG9yaXR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmVhbVR5cGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmwiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U3luY0FkYXB0ZXJUeXBlcyIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5TeW5jQWRhcHRlclR5cGVbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNjU3MSw2ICs0NDMxOSwyNSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJxdWVyeSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM3MjM2LDYgKzQ1MDAzLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJrZXlTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InB1dCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzgyODYsNiArNDYwNjQsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlZWtXYWxscGFwZXIiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzk3MjQsNiArNDc1MjEsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrV2FsbHBhcGVyIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC00MDA1MCw2ICs0Nzg2NiwyNDAgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkN1cnNvckxvYWRlciIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQXN5bmNUYXNrTG9hZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ3Vyc29yTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DdXJzb3JMb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGl2ZXJSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb2plY3Rpb24iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0aW9uIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3Rpb25BcmdzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNvcnRPcmRlciIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VXJpIgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRJbkJhY2tncm91bmQiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNhbmNlbGxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvYnNlcnZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvamVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uQXJncyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTb3J0T3JkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VXJpIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IkRpYWxvZ0ludGVyZmFjZSIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtNDI2MjksNiArNTA2NzksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9QQVNURSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmludGVudC5hY3Rpb24uUEFTVEUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQUNUSU9OX1BJQ0siCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDI5NzAsNiArNTEwMzEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNBVEVHT1JZX0FQUF9NQVJLRVQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuQVBQX01BUktFVCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJDQVRFR09SWV9CUk9XU0FCTEUiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDUwMjcsNiArNTMwOTksMTgzIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGVsaXZlclJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzdHJveSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmb3JjZUxvYWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29udGV4dCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db250ZXh0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ29udGVudENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0TG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlci5Gb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxvYWRlci5Gb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5Gb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRDb21wbGV0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJNdXRhYmxlQ29udGV4dFdyYXBwZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTQ1NTY2LDYgKzUzODE1LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlZlZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmluZ1NldCIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZWYWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVnaXN0ZXJPblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC00NTcwOCw2ICs1Mzk3MiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXRTdHJpbmdTZXQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlbW92ZSIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC00NTkyNiw2ICs1NDIwNSwzNCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmNlbCIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxmaWVsZCBuYW1lPSJhY2NvdW50IgogIHR5cGU9ImFuZHJvaWQuYWNjb3VudHMuQWNjb3VudCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDY0MjUsNiArNTQ3MzIsMTQ1IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJYbWxEb2N1bWVudFByb3ZpZGVyIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJYbWxEb2N1bWVudFByb3ZpZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGV0ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJlc291cmNlWG1sUHVsbFBhcnNlciIKKyByZXR1cm49Im9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlVXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaVhtbFB1bGxQYXJzZXIiCisgcmV0dXJuPSJvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5zZXJ0IgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icXVlcnkiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuY29udGVudC5wbSIKID4KQEAgLTQ2NjkwLDYgKzU1MTM2LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAyNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0lNTUVSU0lWRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUxMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX01VTFRJUFJPQ0VTUyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ3MjMyLDYgKzU1NzAwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX1NVUFBPUlRTX1hMQVJHRV9TQ1JFRU5TIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNTI0Mjg4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZMQUdfU1lTVEVNIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTI0NjcsNiArNjA5NDYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iVE9VQ0hTQ1JFRU5fRklOR0VSIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTQzNDcsNiArNjI4MzcsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Tm90aWZpY2F0aW9uVXJpIgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFBvc2l0aW9uIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU0Mzg0LDYgKzYyODg1LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFVwZGF0ZWRGaWVsZCIKICByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTQzOTEsNyArNjI5MDUsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQ0NTksNyArNjI5NzMsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQ3NDUsNyArNjMyNTksNyBAQAogIHZvbGF0aWxlPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+CkBAIC01NDg4MSw3ICs2MzM5NSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDg5NCw3ICs2MzQwOCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDkwNyw3ICs2MzQyMSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDkzMyw3ICs2MzQ0Nyw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NTQwNyw2ICs2MzkyMSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTU1NjQ3LDYgKzY0MTc0LDYxIEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfQkxPQiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9GTE9BVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9JTlRFR0VSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX05VTEwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfU1RSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkN1cnNvckluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iCkBAIC01NjAwNCw2ICs2NDU4NiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2wiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNCbG9iIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NjAxMSw3ICs2NDYwOCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTYwMjYsNyArNjQ2MjMsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU2MDQxLDcgKzY0NjM4LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NjA1Niw3ICs2NDY1Myw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTYwNzEsNyArNjQ2NjgsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU2NDgyLDYgKzY1MDc5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NjQ5Myw2ICs2NTEwMywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRXcmFwcGVkQ3Vyc29yIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBZnRlckxhc3QiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU2ODAxLDYgKzY1NDIyLDI3IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkRhdGFiYXNlRXJyb3JIYW5kbGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25Db3JydXB0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYk9iaiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkRhdGFiYXNlVXRpbHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NjgzMiw2ICs2NTQ3NCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJzcWxTdHJpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXBwZW5kU2VsZWN0aW9uQXJncyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZhbHVlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJhcHBlbmRWYWx1ZVRvU3FsIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Njg2NCw2ICs2NTUyMSwzOCBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5IgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9nIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjcmVhdGVEYkZyb21TcWxTdGF0ZW1lbnRzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzMwMSw2ICs2NTk5MCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNxbFN0YXRlbWVudFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvbmdGb3JRdWVyeSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc0ODcsNiArNjYxODksMTE2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9ImphdmEubGFuZy5FeGNlcHRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfQUJPUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9BVFRBQ0giCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9CRUdJTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0NPTU1JVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0RETCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX09USEVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOTkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX1BSQUdNQSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX1NFTEVDVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX1VOUFJFUEFSRUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9VUERBVEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJEYXRhYmFzZVV0aWxzLkluc2VydEhlbHBlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtNTc3MjEsNiArNjY1MzMsMzggQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvbkNvcnJ1cHRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYk9iaiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTWF0cml4Q3Vyc29yIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTgyMDQsNiArNjcwNDgsMTE0IEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iU1FMaXRlQ2xvc2FibGUiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTU4MzE1LDcgKzY3MjY3LDcgQEAKICB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3IiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRiIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+CkBAIC01ODMyNyw2ICs2NzI3OSwyMCBAQAogPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUXVlcnkiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUN1cnNvciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkcml2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvckRyaXZlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZWRpdFRhYmxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUXVlcnkiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRDb2x1bW5OYW1lcyIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODQ2NCw2ICs2NzQzMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODQ3Nyw2ICs2NzQ1NCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbkxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbkxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODUzMyw2ICs2NzUyMywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aGVyZUFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmFibGVXcml0ZUFoZWFkTG9nZ2luZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZW5kVHJhbnNhY3Rpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NTg5LDYgKzY3NTkwLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InRhYmxlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBdHRhY2hlZERicyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC51dGlsLlBhaXImbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyZndDsmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1heGltdW1TaXplIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODYyOSw3ICs2NzY0MSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNTg3MTAsNiArNjc3MjIsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29uZmxpY3RBbGdvcml0aG0iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0RhdGFiYXNlSW50ZWdyaXR5T2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NzYxLDcgKzY3Nzg0LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJ0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC01ODc3Niw3ICs2Nzc5OSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgpAQCAtNTg4MjcsNiArNjc4NTAsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODg1Nyw2ICs2Nzg5OSwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTkwNzYsNiArNjgxMzUsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibG9ja2luZ0VuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TWF4U3FsQ2FjaGVTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FjaGVTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4aW11bVNpemUiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5Mjc4LDYgKzY4MzUwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNQVhfU1FMX0NBQ0hFX1NJWkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTk9fTE9DQUxJWkVEX0NPTExBVE9SUyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTU5Mzc3LDYgKzY4NDYwLDYwIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVEaXNrSU9FeGNlcHRpb24iCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NTM2LDYgKzY4NjczLDI0IEBACiA8cGFyYW1ldGVyIG5hbWU9InZlcnNpb24iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlT3BlbkhlbHBlciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlcnNpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NjEzLDYgKzY4NzY4LDMzIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVQcm9ncmFtIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNTk2MjEsNiArNjg4MDMsMTkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImJpbmRBbGxBcmdzQXNTdHJpbmdzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmluZEFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiaW5kQmxvYiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTk3MzgsNyArNjg5MzMsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNjAxNjEsNiArNjkzNTYsMzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVTdGF0ZW1lbnQiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUHJvZ3JhbSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02MDE5MSw2ICs2OTQxMywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJleGVjdXRlVXBkYXRlRGVsZXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNpbXBsZVF1ZXJ5Rm9yQmxvYkZpbGVEZXNjcmlwdG9yIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzaW1wbGVRdWVyeUZvckxvbmciCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTYwMjE0LDYgKzY5NDU4LDMzIEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTY1MTg0LDYgKzc0NDU1LDE0NiBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQml0bWFwUmVnaW9uRGVjb2RlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZGVjb2RlUmVnaW9uIgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlY3QiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUmVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0aW9ucyIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5Lk9wdGlvbnMiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFdpZHRoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUmVjeWNsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3SW5zdGFuY2UiCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFJlZ2lvbkRlY29kZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlzU2hhcmVhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdJbnN0YW5jZSIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwUmVnaW9uRGVjb2RlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZCIgdHlwZT0iamF2YS5pby5GaWxlRGVzY3JpcHRvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXNTaGFyZWFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld0luc3RhbmNlIgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBSZWdpb25EZWNvZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlzIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpc1NoYXJlYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3SW5zdGFuY2UiCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFJlZ2lvbkRlY29kZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlzU2hhcmVhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWN5Y2xlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCaXRtYXBTaGFkZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjU0MjUsMTYgKzc0ODM2LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYml0bWFwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iQ2FudmFzIgotIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2wiIHR5cGU9ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xpcFBhdGgiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTY2MjA4LDcgKzc1NjA5LDcgQEAKIDxtZXRob2QgbmFtZT0iZHJhd1RleHQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgpAQCAtNjYzNTEsMTcgKzc1NzUyLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZnJlZUdsQ2FjaGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENsaXBCb3VuZHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTY2NDE1LDggKzc1ODA1LDggQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRIZWlnaHQiCkBAIC02NjQ3Niw2ICs3NTg2NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hhcmR3YXJlQWNjZWxlcmF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzT3BhcXVlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02Njc4MiwyMSArNzYxODMsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFZpZXdwb3J0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2tldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNzAxOTQsNyArNzk1ODAsNyBAQAogPG1ldGhvZCBuYW1lPSJzZXRTaGFkb3dMYXllciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCkBAIC03NjE2MSw2ICs4NTU0NywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21wdXRlQ29uc3RhbnRTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTc3MDU1LDYgKzg2NDUyLDM2IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNaXBtYXBEcmF3YWJsZSIKKyBleHRlbmRzPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTWlwbWFwRHJhd2FibGUiCisgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5NaXBtYXBEcmF3YWJsZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRyYXdhYmxlIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik5pbmVQYXRjaERyYXdhYmxlIgogIGV4dGVuZHM9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtODEzNDUsNyArOTA3NzIsNyBAQAogIHR5cGU9ImZsb2F0IgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIwLjAwMTBmIgorIHZhbHVlPSIwLjAwMWYiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtODIzMTcsNiArOTE3NDQsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DdXJyZW50SW5wdXRNZXRob2RTdWJ0eXBlQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1N1YnR5cGUiIHR5cGU9ImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25EaXNwbGF5Q29tcGxldGlvbnMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTgyOTIwLDYgKzkyMzYwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImJpbmRpbmciIHR5cGU9ImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dEJpbmRpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2hhbmdlSW5wdXRNZXRob2RTdWJ0eXBlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidHlwZSIgdHlwZT0iYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU3VidHlwZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoaWRlU29mdElucHV0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC04MzIyNyw2ICs5MjY4MCwyNCBAQAogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Im1vZGVJZCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5Ym9hcmQiCisgdHlwZT0iYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuS2V5Ym9hcmQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieG1sTGF5b3V0UmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPGNvbnN0cnVjdG9yIG5hbWU9IktleWJvYXJkIgogIHR5cGU9ImFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLktleWJvYXJkIgpAQCAtOTAwMDEsNiArOTk0NzIsNzggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icXVhbGl0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1Byb2ZpbGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InF1YWxpdHkiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNQcm9maWxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYW1lcmFJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWFsaXR5IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZXzEwODBQIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZXzQ4MFAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfNzIwUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9DSUYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlFVQUxJVFlfSElHSCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTkwMDIzLDYgKzk5NTY2LDk0IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1FDSUYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFXzQ4MFAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDA0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfVElNRV9MQVBTRV83MjBQIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1RJTUVfTEFQU0VfQ0lGIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1RJTUVfTEFQU0VfSElHSCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFX0xPVyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFX1FDSUYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImF1ZGlvQml0UmF0ZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTkyMTE5LDYgKzEwMTc1MCwzMiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJJbGxlZ2FsU3RhdGVFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXV4aWxpYXJ5T3V0cHV0RmlsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZkIiB0eXBlPSJqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEF1eGlsaWFyeU91dHB1dEZpbGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENhbWVyYSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtOTIxMzIsNiArMTAxNzg5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENhcHR1cmVSYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnBzIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4RHVyYXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTk5MDgxLDcgKzEwODc1MSw3IEBACiAgdHlwZT0iYW5kcm9pZC5uZXQuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5IgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJoYW5kc2hha2VUaW1lb3V0TWlsbGlzIiB0eXBlPSJpbnQiPgpAQCAtOTk1NTYsNiArMTA5MjI2LDIxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJvb2xlYW5RdWVyeVBhcmFtZXRlciIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmYXVsdFZhbHVlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEVuY29kZWRBdXRob3JpdHkiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtOTk3MTIsNiArMTA5Mzk3LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRRdWVyeVBhcmFtZXRlck5hbWVzIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRRdWVyeVBhcmFtZXRlcnMiCiAgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC05OTk1OCw2ICsxMDk2NTQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xlYXJRdWVyeSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaS5CdWlsZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVuY29kZWRBdXRob3JpdHkiCiAgcmV0dXJuPSJhbmRyb2lkLm5ldC5VcmkuQnVpbGRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMDExODEsNyArMTEwODg4LDcgQEAKICB0eXBlPSJhbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJpc3N1ZWRUbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC0xMDEyNDgsNyArMTEwOTU1LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC0xMDEyNzAsNyArMTEwOTc3LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC0xMjUzODEsNiArMTM1MDg4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJIT05FWUNPTUIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAwMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQnVuZGxlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xMzE0MjcsNiArMTQxMTQ1LDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZVBpcGUiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGVzY3JpYmVDb250ZW50cyIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzE0MzgsNiArMTQxMTY5LDIzIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZyb21EYXRhIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZyb21Tb2NrZXQiCiAgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMzc0OCw2ICsxNDM0OTYsNTMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlN0b3JhZ2VFdmVudExpc3RlbmVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0b3JhZ2VFdmVudExpc3RlbmVyIgorIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvblN0b3JhZ2VTdGF0ZUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvbGRTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3U3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Vc2JNYXNzU3RvcmFnZUNvbm5lY3Rpb25DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29ubmVjdGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlN0b3JhZ2VNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMzNzU2LDYgKzE0MzU1MSwyOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZGlzYWJsZVVzYk1hc3NTdG9yYWdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmFibGVVc2JNYXNzU3RvcmFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TW91bnRlZE9iYlBhdGgiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMzc4NCw2ICsxNDM2MDEsMjggQEAKIDxleGNlcHRpb24gbmFtZT0iSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VDb25uZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJtb3VudE9iYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMzODAxLDYgKzE0MzY0MCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLk9uT2JiU3RhdGVDaGFuZ2VMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1bm1vdW50T2JiIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzM4MTgsNiArMTQzNjcwLDEyNCBAQAogPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLk9uT2JiU3RhdGVDaGFuZ2VMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlN0b3JhZ2VSZXN1bHRDb2RlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdG9yYWdlUmVzdWx0Q29kZSIKKyB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZVJlc3VsdENvZGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRJbnRlcm5hbEVycm9yIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkTWVkaWFCbGFuayIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0zIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE1lZGlhQ29ycnVwdCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii00IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE5vTWVkaWEiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRTdG9yYWdlQnVzeSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii03IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZFN0b3JhZ2VNb3VudGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkU3RvcmFnZU5vdE1vdW50ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25TdWNjZWVkZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQucHJlZmVyZW5jZSIKQEAgLTEzNDYxMyw2ICsxNDQ1ODMsMTQ4IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZmluZEluZGV4T2ZWYWx1ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RW50cmllcyIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWYWx1ZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJpZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyaWVzIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cmllcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJpZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJ5VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cnlWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJ5VmFsdWVzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzNDczMSw2ICsxNDQ4NDMsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXh0cmFzIgorIHJldHVybj0iYW5kcm9pZC5vcy5CdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEludGVudCIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTM1MTYzLDYgKzE0NTI5NywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZhdWx0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVla0V4dHJhcyIKKyByZXR1cm49ImFuZHJvaWQub3MuQnVuZGxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlcnNpc3RCb29sZWFuIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzUyOTMsNiArMTQ1NDM4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRJbnRlbnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzNTYxMSw2ICsxNDU3NjksOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIj4KKzwvaW1wbGVtZW50cz4KIDxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQWN0aXZpdHkiCiAgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTM1NjI2LDYgKzE0NTc4Niw2MjIgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2VzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kUHJlZmVyZW5jZSIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcmVmZXJlbmNlTWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZWZlcmVuY2VTY3JlZW4iCisgcmV0dXJuPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc0hlYWRlcnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVIZWFkZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc011bHRpUGFuZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2FuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkJ1aWxkSGVhZGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXImZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0SW5pdGlhbEhlYWRlciIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0TmV3SGVhZGVyIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25IZWFkZXJDbGljayIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImhlYWRlciIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Jc0hpZGluZ0hlYWRlcnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSXNNdWx0aVBhbmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsZXIiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByZWYiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlZmVyZW5jZVRyZWVDbGljayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZVNjcmVlbiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2UiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RGb290ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcmVmZXJlbmNlU2NyZWVuIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmZXJlbmNlU2NyZWVuIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93QnJlYWRDcnVtYnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2hvcnRUaXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFByZWZlcmVuY2VGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHVzaCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFByZWZlcmVuY2VGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRXaXRoRnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN3aXRjaFRvSGVhZGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzd2l0Y2hUb0hlYWRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImhlYWRlciIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3dpdGNoVG9IZWFkZXJJbm5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5leHQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9OT19IRUFERVJTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90OzphbmRyb2lkOm5vX2hlYWRlcnMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhUUkFfU0hPV19GUkFHTUVOVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDs6YW5kcm9pZDpzaG93X2ZyYWdtZW50JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90OzphbmRyb2lkOnNob3dfZnJhZ21lbnRfYXJncyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJIRUFERVJfSURfVU5ERUZJTkVEIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xTCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZEZyb21QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbiIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ1JFQVRPUiIKKyB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJicmVhZENydW1iU2hvcnRUaXRsZSIKKyB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYnJlYWRDcnVtYlRpdGxlIgorIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJleHRyYXMiCisgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRBcmd1bWVudHMiCisgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpY29uUmVzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImlkIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbnRlbnQiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InN1bW1hcnkiCisgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRpdGxlIgorIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlRnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFByZWZlcmVuY2VzRnJvbUludGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CkBAIC0xMzU3MDksNTEgKzE0NjQ4NSwyOSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgotIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAiCi0gYWJzdHJhY3Q9ImZhbHNlIgorPGludGVyZmFjZSBuYW1lPSJQcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblByZWZlcmVuY2VTdGFydEZyYWdtZW50IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsZXIiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTwvY2xhc3M+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VHcm91cCIKICBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTEzNjcxNCw5ICsxNDc0NjgsOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InN0cmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ0cnVuY2F0ZUhpc3RvcnkiCkBAIC0xMzcxMDAsNyArMTQ3ODU0LDcgQEAKICB2YWx1ZT0iJnF1b3Q7dXJsJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+CkBAIC0xNDAxNTksNiArMTUwOTEzLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVJFQ1RPUllfUEFSQU1fS0VZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RpcmVjdG9yeSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJMSU1JVF9QQVJBTV9LRVkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7bGltaXQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQWdncmVnYXRpb25FeGNlcHRpb25zIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNDA0MzQsNiArMTUxMjEwLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InR5cGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFERFJFU1MiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZGF0YTEmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQ09OVEVOVF9GSUxURVJfVVJJIgogIHR5cGU9ImFuZHJvaWQubmV0LlVyaSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQyMjY4LDYgKzE1MzA1NSw5MSBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE5hbWVDb2x1bW5zIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRV9BTFRFUk5BVElWRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5X25hbWVfYWx0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRV9QUklNQVJZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Rpc3BsYXlfbmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX05BTUVfU09VUkNFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Rpc3BsYXlfbmFtZV9zb3VyY2UmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEhPTkVUSUNfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtwaG9uZXRpY19uYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT05FVElDX05BTUVfU1RZTEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cGhvbmV0aWNfbmFtZV9zdHlsZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTT1JUX0tFWV9BTFRFUk5BVElWRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzb3J0X2tleV9hbHQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU09SVF9LRVlfUFJJTUFSWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzb3J0X2tleSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9InRydWUiCkBAIC0xNDIzMzgsNiArMTUzMjEwLDE3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgorPGZpZWxkIG5hbWU9IkNPTlRBQ1RfQ0hBVF9DQVBBQklMSVRZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2NvbnRhY3RfY2hhdF9jYXBhYmlsaXR5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkNPTlRBQ1RfUFJFU0VOQ0UiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQyNDE1LDYgKzE1MzI5OCw4IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0TmFtZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdFN0YXR1c0NvbHVtbnMiPgpAQCAtMTQyNjEwLDYgKzE1MzQ5NSwxMCBAQAogPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHNDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KIDxmaWVsZCBuYW1lPSJDT05URU5UX0RJUkVDVE9SWSIKQEAgLTE0MjY0OCw2ICsxNTM1MzcsNjggQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuRW50aXR5IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5CYXNlU3luY0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TeW5jQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8ZmllbGQgbmFtZT0iQ09OVEVOVF9ESVJFQ1RPUlkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZW50aXRpZXMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iREFUQV9JRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkYXRhX2lkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJBV19DT05UQUNUX0lEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Jhd19jb250YWN0X2lkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzLlBob3RvIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQyNjU4LDcgKzE1MzYwOSw3IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KLTxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhQ29sdW1ucyI+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YUNvbHVtbnNXaXRoSm9pbnMiPgogPC9pbXBsZW1lbnRzPgogPGZpZWxkIG5hbWU9IkNPTlRFTlRfRElSRUNUT1JZIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCkBAIC0xNDI2NzEsNiArMTUzNjIyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9UTyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkYXRhMTUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzQ29sdW1ucyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE0MjczNCw2ICsxNTM2OTYsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPX1RIVU1CTkFJTF9VUkkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cGhvdG9fdGh1bWJfdXJpJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPX1VSSSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtwaG90b191cmkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkRhdGEiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE0Mjk3Niw2ICsxNTM5NjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklTX1JFQURfT05MWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtpc19yZWFkX29ubHkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iSVNfU1VQRVJfUFJJTUFSWSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDMwNjMsNiArMTU0MDU4LDggQEAKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+CkBAIC0xNDMwNzYsNiArMTU0MDczLDQ0MSBAQAogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c0NvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5EaXJlY3RvcnkiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJub3RpZnlEaXJlY3RvcnlDaGFuZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc29sdmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNDT1VOVF9OQU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FjY291bnROYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDQ09VTlRfVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthY2NvdW50VHlwZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDT05URU5UX0lURU1fVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9jb250YWN0X2RpcmVjdG9yeSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDT05URU5UX1RZUEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dm5kLmFuZHJvaWQuY3Vyc29yLmRpci9jb250YWN0X2RpcmVjdG9yaWVzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNPTlRFTlRfVVJJIgorIHR5cGU9ImFuZHJvaWQubmV0LlVyaSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJERUZBVUxUIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjBMIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJUkVDVE9SWV9BVVRIT1JJVFkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YXV0aG9yaXR5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5TmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtleHBvcnRTdXBwb3J0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUX0FOWV9BQ0NPVU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVF9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVF9TQU1FX0FDQ09VTlRfT05MWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTE9DQUxfSU5WSVNJQkxFIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjFMIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBBQ0tBR0VfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtwYWNrYWdlTmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9UT19TVVBQT1JUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Bob3RvU3VwcG9ydCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9UT19TVVBQT1JUX0ZVTEwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPX1NVUFBPUlRfRlVMTF9TSVpFX09OTFkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPX1NVUFBPUlRfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEhPVE9fU1VQUE9SVF9USFVNQk5BSUxfT05MWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPUlRDVVRfU1VQUE9SVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzaG9ydGN1dFN1cHBvcnQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPUlRDVVRfU1VQUE9SVF9EQVRBX0lURU1TX09OTFkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1JUQ1VUX1NVUFBPUlRfRlVMTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPUlRDVVRfU1VQUE9SVF9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX1JFU09VUkNFX0lEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3R5cGVSZXNvdXJjZUlkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQ29udGFjdHNDb250cmFjdC5EaXNwbGF5TmFtZVNvdXJjZXMiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZmllbGQgbmFtZT0iRU1BSUwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOSUNLTkFNRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjM1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9SR0FOSVpBVElPTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RSVUNUVVJFRF9OQU1FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVU5ERUZJTkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkZ1bGxOYW1lU3R5bGUiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZmllbGQgbmFtZT0iQ0hJTkVTRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0pLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJKQVBBTkVTRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS09SRUFOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJVTkRFRklORUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldFU1RFUk4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5Hcm91cHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDMxNTMsNiArMTU0NTg1LDE3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgorPGZpZWxkIG5hbWU9IkFVVE9fQUREIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2F1dG9fYWRkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkRFTEVURUQiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQzMTY0LDYgKzE1NDYwNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkFWT1JJVEVTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Zhdm9yaXRlcyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJHUk9VUF9WSVNJQkxFIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0MzcxOCw2ICsxNTUxNzIsNTggQEAKID4KIDwvZmllbGQ+CiA8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iQ29udGFjdHNDb250cmFjdC5QaG9uZXRpY05hbWVTdHlsZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxmaWVsZCBuYW1lPSJKQVBBTkVTRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS09SRUFOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSU5ZSU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlVOREVGSU5FRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LlByZXNlbmNlIgogIGV4dGVuZHM9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNVcGRhdGVzIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0MzkwMCw2ICsxNTU0MDYsOCBAQAogPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE5hbWVDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0T3B0aW9uc0NvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzQ29sdW1ucyI+CkBAIC0xNDM5NjMsNyArMTU1NDcxLDcgQEAKICB2YWx1ZT0iMSIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgpAQCAtMTQ0MTEwLDYgKzE1NTYxOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUkFXX0NPTlRBQ1RfSVNfUkVBRF9PTkxZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Jhd19jb250YWN0X2lzX3JlYWRfb25seSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNFbnRpdHkiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE0NDMxNSw2ICsxNTU4MzQsNTAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNBUEFCSUxJVFlfSEFTX0NBTUVSQSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0FQQUJJTElUWV9IQVNfVklERU8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNBUEFCSUxJVFlfSEFTX1ZPSUNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSEFUX0NBUEFCSUxJVFkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7Y2hhdF9jYXBhYmlsaXR5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkRPX05PVF9ESVNUVVJCIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQ1NzU3LDYgKzE1NzMyMCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2b2x1bWVOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENvbnRlbnRVcmlGb3JBdWRpb0lkIgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZvbHVtZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF1ZGlvSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPGZpZWxkIG5hbWU9IkNPTlRFTlRfVFlQRSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDg2MzQsNiArMTYwMjEyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTRUxFQ1RFRF9JTlBVVF9NRVRIT0RfU1VCVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzZWxlY3RlZF9pbnB1dF9tZXRob2Rfc3VidHlwZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJTRVRUSU5HU19DTEFTU05BTUUiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQ5MzU1LDYgKzE2MDk0NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQVVUT19USU1FX1pPTkUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YXV0b190aW1lX3pvbmUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQkxVRVRPT1RIX0RJU0NPVkVSQUJJTElUWSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTMyMjQsNyArMTY0ODI0LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+Cis8cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiZWZvcmVUZXh0Q2hhbmdlZCIKQEAgLTE1ODA2Niw2ICsxNjk2NjYsMzYgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXJUZXN0Q2FzZSIKKyBleHRlbmRzPSJhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyVGVzdENhc2UiCisgdHlwZT0iYW5kcm9pZC50ZXN0LkxvYWRlclRlc3RDYXNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlclJlc3VsdFN5bmNocm9ub3VzbHkiCisgcmV0dXJuPSJUIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7VCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9yZUFzc2VydHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNjA5ODYsNiArMTcyNjE2LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTYxMzMwLDE3ICsxNzI5NzksNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImFib3J0VXBkYXRlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE2MTM1MiwzMCArMTcyOTkwLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLkxvbmcsID8gZXh0ZW5kcyBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QmZ3Q7Jmd0OyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjb3B5U3RyaW5nVG9CdWZmZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE2MTQwMiwxNyArMTczMDE2LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZGVsZXRlUm93IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRCbG9iIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE2MTU5OCw4ICsxNzMyMDEsOCBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCi0gcmV0dXJuPSJib29sZWFuIgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0xNjE2MDgsOCArMTczMjExLDEwIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Imhhc1VwZGF0ZXMiCis8bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMTYxODIzLDE3ICsxNzM0MjgsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdXBwb3J0c1VwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE2MTg2MCwxMjQgKzE3MzQ1NCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVEb3VibGUiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUZsb2F0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUludCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlTG9uZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVNob3J0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9InNob3J0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVN0cmluZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVRvTnVsbCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9ja0RpYWxvZ0ludGVyZmFjZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTY0MTMwLDE1ICsxNzU2MDYsMjMgQEAKIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwYm9hcmRNYW5hZ2VyIgorIHR5cGU9ImFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldFRleHQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2NDE0OSw3ICsxNzU2MzMsNyBAQAogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imhhc1RleHQiCiAgcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2NDE2MCw3ICsxNzU2NDQsNyBAQAogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRleHQiCiAgcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2Njk4NSw2ICsxNzg0NjksMjkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2luZCIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1QmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHRSdW5DdXJzb3IiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRTdGFydCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0RW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3JPcHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5QYWludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpbnNlcnQiCiAgcmV0dXJuPSJhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNjgwNDUsNyArMTc5NTUyLDcgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC50ZXh0LlRleHRQYWludCI+Cis8cGFyYW1ldGVyIG5hbWU9InBhaW50IiB0eXBlPSJhbmRyb2lkLnRleHQuVGV4dFBhaW50Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJhdmFpbCIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CkBAIC0xNzY0MzIsNiArMTg3OTM5LDE4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5kcm9pZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuRXhjZXB0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTE3NjQ2OSw2ICsxODc5ODgsMTggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmRyb2lkUnVudGltZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLkV4Y2VwdGlvbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CkBAIC0xNzc0NzcsNyArMTg5MDA4LDcgQEAKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8Y29uc3RydWN0b3IgbmFtZT0iRXZlbnRMb2dUYWdzIgpAQCAtMTc3NjMyLDYgKzE4OTE2Myw0ODMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikpzb25SZWFkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLkNsb3NlYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSnNvblJlYWRlciIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuSnNvblJlYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImJlZ2luQXJyYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpbk9iamVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsb3NlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kQXJyYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRPYmplY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNOZXh0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dEJvb2xlYW4iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0RG91YmxlIgorIHJldHVybj0iZG91YmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0SW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0TG9uZyIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHROYW1lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dE51bGwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0U3RyaW5nIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVlayIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uVG9rZW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExlbmllbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsZW5pZW50IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNraXBWYWx1ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN5bnRheEVycm9yIgorIHJldHVybj0iamF2YS5pby5JT0V4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSnNvblRva2VuIgorIGV4dGVuZHM9ImphdmEubGFuZy5FbnVtIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0idmFsdWVPZiIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uVG9rZW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZXMiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvblRva2VuW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikpzb25Xcml0ZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLkNsb3NlYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSnNvbldyaXRlciIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dCIgdHlwZT0iamF2YS5pby5Xcml0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJiZWdpbkFycmF5IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luT2JqZWN0IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsb3NlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kQXJyYXkiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kT2JqZWN0IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZsdXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmFtZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJudWxsVmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5kZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkxvZyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE3ODM1Nyw3ICsxOTAzNjUsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTc4MzY4LDcgKzE5MDM3Niw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTc4NjM1LDYgKzE5MDY0MywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVBdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VmFsdWVBdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTgwMjQwLDYgKzE5MjI2MSwyMzEgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFjdGlvbk1vZGUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWN0aW9uTW9kZSIKKyB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJmaW5pc2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VzdG9tVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWVudSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5NZW51IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWVudUluZmxhdGVyIgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tVmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQWN0aW9uTW9kZS5DYWxsYmFjayIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25BY3Rpb25JdGVtQ2xpY2tlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUFjdGlvbk1vZGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3lBY3Rpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblByZXBhcmVBY3Rpb25Nb2RlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJDb250ZXh0TWVudSIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTgwNDkwLDYgKzE5MjczNiwyMTkgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRyYWdFdmVudCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDbGlwRGF0YSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDbGlwRGVzY3JpcHRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2J0YWluIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkRyYWdFdmVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9idGFpbiIKKyByZXR1cm49ImFuZHJvaWQudmlldy5EcmFnRXZlbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic291cmNlIiB0eXBlPSJhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlY3ljbGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX0RSQUdfRU5ERUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9EUkFHX0VOVEVSRUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9EUkFHX0VYSVRFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX0RSQUdfTE9DQVRJT04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9EUkFHX1NUQVJURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9EUk9QIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDUkVBVE9SIgorIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJGb2N1c0ZpbmRlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NDcxNiw2ICsxOTcxNzUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RmFjdG9yeTIiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeTIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRGaWx0ZXIiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmlsdGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NDgwOCw2ICsxOTcyNzgsMjUgQEAKIDxleGNlcHRpb24gbmFtZT0iQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRGYWN0b3J5IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODQ4MjEsNiArMTk3MzEwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZhY3RvcnkyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3RvcnkyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEZpbHRlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg0ODYwLDYgKzE5NzM2MiwzNSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJMYXlvdXRJbmZsYXRlci5GYWN0b3J5MiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5Ij4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iTGF5b3V0SW5mbGF0ZXIuRmlsdGVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0idHJ1ZSIKQEAgLTE4NTM4Nyw2ICsxOTc5MTgsMTcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGlvblZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFscGhhYmV0aWNTaG9ydGN1dCIKICByZXR1cm49ImNoYXIiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xODU1NjMsNiArMTk4MTA1LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFjdGlvblZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QWxwaGFiZXRpY1Nob3J0Y3V0IgogIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTg1Njk1LDYgKzE5ODI1MCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhbHBoYUNoYXIiIHR5cGU9ImNoYXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2hvd0FzQWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpb25FbnVtIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xODU3NDcsNiArMTk4MzE1LDM5IEBACiA8cGFyYW1ldGVyIG5hbWU9InZpc2libGUiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJTSE9XX0FTX0FDVElPTl9BTFdBWVMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1dfQVNfQUNUSU9OX0lGX1JPT00iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1dfQVNfQUNUSU9OX05FVkVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE4NjczNyw2ICsxOTkzMzgsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ieSIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJhbnNmb3JtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NzM1MSw2ICsxOTk5NjUsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VycmVudFNwYW5YIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VycmVudFNwYW5ZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0RXZlbnRUaW1lIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODczOTUsNiArMjAwMDMxLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZXZpb3VzU3BhblgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcmV2aW91c1NwYW5ZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2NhbGVGYWN0b3IiCiAgcmV0dXJuPSJmbG9hdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODg5NzQsNiArMjAxNjMyLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZvY3VzYWJsZU1vZGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRPbkxheW91dENoYW5nZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYWRkVG91Y2hhYmxlcyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5MjM0LDYgKzIwMTkwNSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJoaW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGlzcGF0Y2hEcmFnRXZlbnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LkRyYWdFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkaXNwYXRjaERyYXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTMyNSw2ICsyMDIwMDksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkmbHQ7YW5kcm9pZC5vcy5QYXJjZWxhYmxlJmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkaXNwYXRjaFNldEFjdGl2YXRlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2YXRlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkaXNwYXRjaFNldFByZXNzZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTUzMSw2ICsyMDIyMjgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWxwaGEiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRpb24iCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODk5NzUsNiArMjAyNjgzLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJpbnRbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNYXRyaXgiCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRNZWFzdXJlZEhlaWdodCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTAwNTIsOCArMjAyNzcxLDggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0T3ZlclNjcm9sbE1vZGUiCi0gcmV0dXJuPSJpbnQiCis8bWV0aG9kIG5hbWU9ImdldE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC52aWV3LlZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTE5MDExOCw2ICsyMDI4MzcsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGl2b3RYIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGl2b3RZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UmVzb3VyY2VzIgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkwMTczLDYgKzIwMjkxNCw2MSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3RhdGlvbiIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvdGF0aW9uWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvdGF0aW9uWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjYWxlWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjYWxlWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNjcm9sbEJhclN0eWxlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MDMxOCw2ICsyMDMxMTQsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNsYXRpb25YIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNsYXRpb25ZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VmVydGljYWxGYWRpbmdFZGdlTGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MDQxOSw2ICsyMDMyMzcsMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3V0UmVjdCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5SZWN0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGFzRm9jdXMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MDU1MSw2ICsyMDMzOTEsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZHJhd2FibGUiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNBY3RpdmF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQ2xpY2thYmxlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTA2MzksNiArMjAzNDkwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSGFyZHdhcmVBY2NlbGVyYXRlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNIb3Jpem9udGFsRmFkaW5nRWRnZUVuYWJsZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MDc0OSw2ICsyMDM2MTEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNTYXZlRnJvbVBhcmVudEVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzU2Nyb2xsYmFyRmFkaW5nRW5hYmxlZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkxMDEwLDYgKzIwMzg4MywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJoaW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EcmFnRXZlbnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LkRyYWdFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkRyYXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MTAyMyw2ICsyMDM5MDksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY2FudmFzIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRyYXdEcmFnVGh1bWJuYWlsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FudmFzIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkRyYXdTY3JvbGxCYXJzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTEyMTYsNyArMjA0MTE1LDcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0TWVhc3VyZVNwZWMiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJvbk92ZXJTY3JvbGxlZCIKKzxtZXRob2QgbmFtZT0ib25NZWFzdXJlRHJhZ1RodW1ibmFpbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0xOTEyMjYsMTQgKzIwNDEyNSw2IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgotPHBhcmFtZXRlciBuYW1lPSJzY3JvbGxYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iY2xhbXBlZFgiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImNsYW1wZWRZIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uUmVzdG9yZUluc3RhbmNlU3RhdGUiCiAgcmV0dXJuPSJ2b2lkIgpAQCAtMTkxMzg4LDM1ICsyMDQyNzksNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aXNpYmlsaXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ib3ZlclNjcm9sbEJ5IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGVsdGFYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImRlbHRhWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzY3JvbGxYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic2Nyb2xsUmFuZ2VYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFJhbmdlWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhPdmVyU2Nyb2xsWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhPdmVyU2Nyb2xsWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpc1RvdWNoRXZlbnQiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVyZm9ybUNsaWNrIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTE1OTYsNiArMjA0NDU4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlJ1bm5hYmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZXF1ZXN0Rm9jdXMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MTc5OSw2ICsyMDQ2NzQsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBY3RpdmF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3RpdmF0ZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWxwaGEiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbHBoYSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTE4NTEsNiArMjA0NzUyLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InJlc2lkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Qm90dG9tIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJib3R0b20iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDbGlja2FibGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MTg3Nyw2ICsyMDQ3OTEsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERyYWdUaHVtYm5haWxEaW1lbnNpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImhlaWdodCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldERyYXdpbmdDYWNoZUJhY2tncm91bmRDb2xvciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMDcyLDYgKzIwNTAwMSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJwYXJhbXMiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExlZnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxlZnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRMb25nQ2xpY2thYmxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTIyNTYsMTkgKzIwNTE5OCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImwiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRPdmVyU2Nyb2xsTW9kZSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9Im92ZXJTY3JvbGxNb2RlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFkZGluZyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMjg4LDYgKzIwNTIxNywzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJib3R0b20iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQaXZvdFgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwaXZvdFgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBpdm90WSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBpdm90WSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UHJlc3NlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMzAxLDYgKzIwNTI1Niw1OCBAQAogPHBhcmFtZXRlciBuYW1lPSJwcmVzc2VkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJpZ2h0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyaWdodCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvdGF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm90YXRpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvdGF0aW9uWCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJvdGF0aW9uWCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um90YXRpb25ZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm90YXRpb25ZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTYXZlRW5hYmxlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMzE0LDYgKzIwNTMyMSw0NSBAQAogPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNhdmVGcm9tUGFyZW50RW5hYmxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2NhbGVYIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NhbGVYIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTY2FsZVkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZVkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNjcm9sbEJhclN0eWxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI0MDcsNiArMjA1NDUzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUb3AiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRvcCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRvdWNoRGVsZWdhdGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MjQyMCw2ICsyMDU0NzksMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVsZWdhdGUiIHR5cGU9ImFuZHJvaWQudmlldy5Ub3VjaERlbGVnYXRlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zbGF0aW9uWCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zbGF0aW9uWCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VHJhbnNsYXRpb25ZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNsYXRpb25ZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI0ODUsNiArMjA1NTcwLDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9IndpbGxOb3REcmF3IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2hvd0NvbnRleHRNZW51IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI0OTYsNiArMjA1NjA3LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBbmltYXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MjUwOSw2ICsyMDU2MzMsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydERyYWciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGh1bWJCdWlsZGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldy5EcmFnVGh1bWJuYWlsQnVpbGRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibXlXaW5kb3dPbmx5IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVuc2NoZWR1bGVEcmF3YWJsZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyODkxLDM5ICsyMDYwMzIsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iT1ZFUl9TQ1JPTExfQUxXQVlTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJPVkVSX1NDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9Ik9WRVJfU0NST0xMX05FVkVSIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQiCiAgdHlwZT0iaW50W10iCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE5MzIzOSw2ICsyMDYzNDcsNTMgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlZpZXcuRHJhZ1RodW1ibmFpbEJ1aWxkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iVmlldy5EcmFnVGh1bWJuYWlsQnVpbGRlciIKKyB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldy5EcmFnVGh1bWJuYWlsQnVpbGRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25EcmF3VGh1bWJuYWlsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FudmFzIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblByb3ZpZGVUaHVtYm5haWxNZXRyaWNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGh1bWJuYWlsU2l6ZSIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5Qb2ludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGh1bWJuYWlsVG91Y2hQb2ludCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5Qb2ludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJWaWV3Lk1lYXN1cmVTcGVjIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkzNDM3LDYgKzIwNjU5Miw0MyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uTGF5b3V0Q2hhbmdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVmdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b3AiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYm90dG9tIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZExlZnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2xkVG9wIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZFJpZ2h0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZEJvdHRvbSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iVmlldy5PbkxvbmdDbGlja0xpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0idHJ1ZSIKQEAgLTE5MzY4NiwyOCArMjA2ODc4LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNjYWxlZFBhZ2luZ1RvdWNoU2xvcCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTQ0NjIsNiArMjA3NjMyLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5Jmx0O2FuZHJvaWQub3MuUGFyY2VsYWJsZSZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGlzcGF0Y2hTZXRBY3RpdmF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3RpdmF0ZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGlzcGF0Y2hTZXRTZWxlY3RlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk0NTA1LDYgKzIwNzY4OCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJkcmF3aW5nVGltZSIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRWaWV3VHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZvY3VzU2VhcmNoIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk0NzE1LDYgKzIwNzkxMSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMYXlvdXRUcmFuc2l0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQZXJzaXN0ZW50RHJhd2luZ0NhY2hlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NDgxMyw2ICsyMDgwMjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im1lYXN1cmVDaGlsZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk1Mjc2LDYgKzIwODQ5NCwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGF5b3V0VHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3BsaXQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk1MzI4LDYgKzIwODU3MiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsVmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdGFydExheW91dEFuaW1hdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk1MzM5LDYgKzIwODU5OCwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFZpZXdUcmFuc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlVmlld0xheW91dCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk2MDE4LDYgKzIwOTI5MCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWaWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJWaWV3U3R1YiIKICBleHRlbmRzPSJhbmRyb2lkLnZpZXcuVmlldyIKQEAgLTE5NjY5NCw2ICsyMDk5ODEsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzRmVhdHVyZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoYXNTb2Z0SW5wdXRNb2RlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTY3MDUsNiArMjEwMDA1LDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVQYW5lbE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWN0aXZlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTcyNjYsNiArMjEwNTc5LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFwcE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0V2luZG93TWFuYWdlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndtIiB0eXBlPSJhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwVG9rZW4iIHR5cGU9ImFuZHJvaWQub3MuSUJpbmRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdXBlckRpc3BhdGNoS2V5RXZlbnQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTk3MzcwLDYgKzIxMDcwMiwzOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fQkFSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkVBVFVSRV9DT05URVhUX01FTlUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTc3NTEsNiArMjExMTE2LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uV2luZG93QXR0cmlidXRlc0NoYW5nZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTk4MjQwLDYgKzIxMTYxOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0yMTQ3NDgzNjQ4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMDAxMjYsNiArMjEzNTE1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjYWxlRmFjdG9yIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U3RhcnRPZmZzZXQiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMDE2Myw2ICsyMTM1NjMsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3V0VHJhbnNmb3JtYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNmb3JtYXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJyZW50VGltZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0VHJhbnNmb3JtYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRaQWRqdXN0bWVudCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDE0NDgsMTkgKzIxNDg2NSw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0aW9uIgotIHJldHVybj0iZmxvYXQiCi0gYWJzdHJhY3Q9InRydWUiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iaW5wdXQiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UaW1lSW50ZXJwb2xhdG9yIj4KKzwvaW1wbGVtZW50cz4KIDwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTIwNDEzNiw2ICsyMTc1NDIsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYmluZGluZyIgdHlwZT0iYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0QmluZGluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjaGFuZ2VJbnB1dE1ldGhvZFN1YnR5cGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnR5cGUiIHR5cGU9ImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY3JlYXRlU2Vzc2lvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yMDQ0NTksNiArMjE3ODc4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnR5cGVzIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5TGlzdCZsdDthbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsb2FkSWNvbiIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA0NzIwLDYgKzIxODE1MCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93SW5wdXRNZXRob2RBbmRTdWJ0eXBlRW5hYmxlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRvcElkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNob3dJbnB1dE1ldGhvZFBpY2tlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA0NzMxLDYgKzIxODE3NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93SW5wdXRNZXRob2RTdWJ0eXBlUGlja2VyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzaG93U29mdElucHV0IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDUxNDUsNiArMjE4NTk5LDEwOCBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IklucHV0TWV0aG9kU3VidHlwZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXh0cmFWYWx1ZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvblJlc0lkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvY2FsZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TW9kZVJlc0lkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5hbWVSZXNJZCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3cml0ZVRvUGFyY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVzdCIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmNlbGFibGVGbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ1JFQVRPUiIKKyB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLndlYmtpdCIKID4KQEAgLTIwNzUyNiw2ICsyMjEwODIsMTcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFsbG93RmlsZUFjY2VzcyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3ODA4LDcgKzIyMTM3NSw3IEBACiAgc3luY2hyb25pemVkPSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC0yMDc5MDAsMTcgKzIyMTQ2Nyw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFVzZVdpZGVWaWV3UG9ydCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4MTUyLDYgKzIyMTcwOCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFnIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RmFudGFzeUZvbnRGYW1pbHkiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwODM1NCw3ICsyMjE5MjMsNyBAQAogIHN5bmNocm9uaXplZD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZyIgdHlwZT0iYm9vbGVhbiI+CkBAIC0yMDg1MDMsMTkgKzIyMjA3Miw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InVzZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRVc2VXZWJWaWV3QmFja2dyb3VuZEZvck92ZXJzY3JvbGxCYWNrZ3JvdW5kIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRVc2VXaWRlVmlld1BvcnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwOTA5Nyw2ICsyMjI2NTMsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iV2ViVmlldyIKKyB0eXBlPSJhbmRyb2lkLndlYmtpdC5XZWJWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcml2YXRlQnJvd3NpbmciIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJhZGRKYXZhc2NyaXB0SW50ZXJmYWNlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDkxNDcsNiArMjIyNzE5LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNhblpvb21JbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuWm9vbU91dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2FwdHVyZVBpY3R1cmUiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA5NTA2LDYgKzIyMzEwMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaXNpYmxlVGl0bGVIZWlnaHQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Wm9vbUNvbnRyb2xzIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA5NTYzLDYgKzIyMzE2OCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvYWREYXRhIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDk4ODIsNiArMjIzNDk4LDM2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzYXZlV2ViQXJjaGl2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZpbGVuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNhdmVXZWJBcmNoaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZW5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF1dG9uYW1lIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC53ZWJraXQuVmFsdWVDYWxsYmFjayZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDZXJ0aWZpY2F0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjEwMDMxLDYgKzIyMzY3NywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjbGllbnQiIHR5cGU9ImFuZHJvaWQud2Via2l0LldlYlZpZXdDbGllbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd0ZpbmREaWFsb2ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTA0NzksNyArMjI0MTM4LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLndlYmtpdC5XZWJWaWV3Ij4KQEAgLTIxMDg4Niw2ICsyMjQ1NDUsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWZ0ZXIiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbGVhckNob2ljZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsZWFyVGV4dEZpbHRlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjEwOTA4LDYgKzIyNDU3OCw2MSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbUNvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtSWRzIgorIHJldHVybj0ibG9uZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtUG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENob2ljZU1vZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TGlzdFBhZGRpbmdCb3R0b20iCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjExMDUxLDYgKzIyNDc3NiwxOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0l0ZW1DaGVja2VkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc1Njcm9sbGluZ0NhY2hlRW5hYmxlZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjExMTMwLDYgKzIyNDg2OCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25SZXN0b3JlSW5zdGFuY2VTdGF0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjExMjI5LDYgKzIyNDk4OSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aWV3cyIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC52aWV3LlZpZXcmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDYWNoZUNvbG9ySGludCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjExMjQyLDYgKzIyNTAxNSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2xvciIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENob2ljZU1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjaG9pY2VNb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RHJhd1NlbGVjdG9yT25Ub3AiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMTI4MSw2ICsyMjUwNjcsMzQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmlsdGVyVGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJdGVtQ2hlY2tlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3Lk11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE9uU2Nyb2xsTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMTMwNyw2ICsyMjUxMjEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3LlJlY3ljbGVyTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVtb3RlVmlld3NBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNjcm9sbEluZGljYXRvcnMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMTQ1Niw2ICsyMjUyODMsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYm91bmRQb3NpdGlvbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNtb290aFNjcm9sbFRvUG9zaXRpb25Gcm9tVG9wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idmVyaWZ5RHJhd2FibGUiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMTQ2OSw2ICsyMjUzMTEsNTAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZHIiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX1NJTkdMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iVFJBTlNDUklQVF9NT0RFX0FMV0FZU19TQ1JPTEwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTE1NjAsNiArMjI1NDQ2LDM1IEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBYnNMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0ib25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjaGVja2VkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iQWJzTGlzdFZpZXcuT25TY3JvbGxMaXN0ZW5lciIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9InRydWUiCkBAIC0yMTI3MzYsNiArMjI2NjUxLDU4MiBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVyVmlld0FuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDdXJyZW50VmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERpc3BsYXllZENoaWxkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEluQW5pbWF0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3ImbHQ7PyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0T3V0QW5pbWF0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3ImbHQ7PyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVzdG9yZUluc3RhbmNlU3RhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU2F2ZUluc3RhbmNlU3RhdGUiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5pbWF0ZUZpcnN0VmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzcGxheWVkQ2hpbGQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3aGljaENoaWxkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5BbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbkFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3ImbHQ7PyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5BbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VJRCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE91dEFuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dEFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3ImbHQ7PyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T3V0QW5pbWF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlSUQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93TmV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd1ByZXZpb3VzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBZGFwdGVyVmlld0ZsaXBwZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdBbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJWaWV3RmxpcHBlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0ZsaXBwZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3RmxpcHBlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImlzQXV0b1N0YXJ0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0ZsaXBwaW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBdXRvU3RhcnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhdXRvU3RhcnQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RmxpcEludGVydmFsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWlsbGlzZWNvbmRzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRGbGlwcGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcEZsaXBwaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBZGFwdGVycyIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlcnMiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ibG9hZEFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkQ3Vyc29yQWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkQ3Vyc29yQWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yQmluZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yQmluZGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJiaW5kIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Im1Db250ZXh0IgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJtVHJhbnNmb3JtYXRpb24iCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2Zvcm0iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJhbnNmb3JtVG9SZXNvdXJjZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Im1Db250ZXh0IgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQWxwaGFiZXRJbmRleGVyIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNDcyMyw2ICsyMjkyMTQsMjAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXV0b1JlcXVlcnkiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkN1cnNvckFkYXB0ZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImJpbmRWaWV3IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTIxNDg3MCw2ICsyMjkzNzUsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXV0b1JlcXVlcnkiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5pdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJuZXdEcm9wRG93blZpZXciCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTQ5NDEsNiArMjI5NDYzLDI4IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZpbHRlclF1ZXJ5UHJvdmlkZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkZpbHRlclF1ZXJ5UHJvdmlkZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0FVVE9fUkVRVUVSWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQ3Vyc29yVHJlZUFkYXB0ZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciIKQEAgLTIxNzM4MCw3ICsyMzE5MjQsNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRTdHJldGNoTW9kZSIKKzxtZXRob2QgbmFtZT0iZ2V0TnVtQ29sdW1ucyIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKQEAgLTIxNzM5MSw4ICsyMzE5MzUsOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgotIHJldHVybj0idm9pZCIKKzxtZXRob2QgbmFtZT0iZ2V0U3RyZXRjaE1vZGUiCisgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTIxNzQwMSw4ICsyMzE5NDUsNiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgotPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Q29sdW1uV2lkdGgiCiAgcmV0dXJuPSJ2b2lkIgpAQCAtMjE3NDk1LDYgKzIzMjAzNywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2ZXJ0aWNhbFNwYWNpbmciIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzbW9vdGhTY3JvbGxCeU9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iQVVUT19GSVQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTg1NjYsNiArMjMzMTIxLDIwIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaW5lYXJMYXlvdXQiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0QmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTg2MTAsNiArMjMzMTc5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzTWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkxheW91dCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE4NjgzLDYgKzIzMzI2MywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJob3Jpem9udGFsR3Jhdml0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T3JpZW50YXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxODg3OSw2ICsyMzM0NzIsNjkxIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlQXR0ciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZUF0dHIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVSZXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNsZWFyTGlzdFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGlzbWlzcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QW5jaG9yVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFuaW1hdGlvblN0eWxlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJhY2tncm91bmQiCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRIb3Jpem9udGFsT2Zmc2V0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElucHV0TWV0aG9kTW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMaXN0VmlldyIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb21wdFBvc2l0aW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtSWQiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbVBvc2l0aW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNvZnRJbnB1dE1vZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmVydGljYWxPZmZzZXQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V2lkdGgiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNb2RhbCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNTaG93aW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbktleURvd24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXlDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuS2V5RXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25LZXlQcmVJbWUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXlDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuS2V5RXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25LZXlVcCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleUNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5LZXlFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZXJmb3JtSXRlbUNsaWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3N0U2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFuY2hvclZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmNob3IiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFuaW1hdGlvblN0eWxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uU3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCYWNrZ3JvdW5kRHJhd2FibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENvbnRlbnRXaWR0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SGVpZ2h0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SG9yaXpvbnRhbE9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldElucHV0TWV0aG9kTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMaXN0U2VsZWN0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3RvciIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNb2RhbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGFsIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uRGlzbWlzc0xpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uSXRlbUNsaWNrTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbGlja0xpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3RlZExpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb21wdFBvc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9tcHRWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvbXB0IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNvZnRJbnB1dE1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmVydGljYWxPZmZzZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRXaWR0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9ORUVERUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9OT1RfTkVFREVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNQVRDSF9QQVJFTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQT1NJVElPTl9QUk9NUFRfQUJPVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBPU0lUSU9OX1BST01QVF9CRUxPVyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV1JBUF9DT05URU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ikxpc3RWaWV3IgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxODk4MywxNyArMjM0MjYxLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idiIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY2xlYXJDaG9pY2VzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmaW5kVmlld1RyYXZlcnNhbCIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxOTAzOCw1MSArMjM0MzA1LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbUlkcyIKLSByZXR1cm49ImxvbmdbXSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbVBvc2l0aW9uIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtUG9zaXRpb25zIgotIHJldHVybj0iYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaG9pY2VNb2RlIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTIxOTE1Miw0MSArMjM0Mzc1LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0T3ZlcnNjcm9sbEZvb3RlciIKLSByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0T3ZlcnNjcm9sbEhlYWRlciIKLSByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaXNJdGVtQ2hlY2tlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVtb3ZlRm9vdGVyVmlldyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE5MjEzLDMyICsyMzQ0MDEsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0Q2hvaWNlTW9kZSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNob2ljZU1vZGUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXREaXZpZGVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTkyOTEsMjEgKzIzNDQ1Myw2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImhlYWRlckRpdmlkZXJzRW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRJdGVtQ2hlY2tlZCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEl0ZW1zQ2FuRm9jdXMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxOTMxOSwzMiArMjM0NDY2LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaXRlbXNDYW5Gb2N1cyIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRPdmVyc2Nyb2xsRm9vdGVyIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZm9vdGVyIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldE92ZXJzY3JvbGxIZWFkZXIiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJoZWFkZXIiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTkzODQsMzkgKzIzNDUwNSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgorPG1ldGhvZCBuYW1lPSJzbW9vdGhTY3JvbGxCeU9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX05PTkUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIwIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX1NJTkdMRSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ikxpc3RWaWV3LkZpeGVkVmlld0luZm8iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTIxOTkxNiw3ICsyMzUwMTcsNyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgotPGNsYXNzIG5hbWU9Ik92ZXJTY3JvbGxlciIKKzxjbGFzcyBuYW1lPSJQb3B1cE1lbnUiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTIxOTkyNCw4ICsyMzUwMjUsOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxjb25zdHJ1Y3RvciBuYW1lPSJPdmVyU2Nyb2xsZXIiCi0gdHlwZT0iYW5kcm9pZC53aWRnZXQuT3ZlclNjcm9sbGVyIgorPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwTWVudSIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cE1lbnUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0yMTk5MzMsMzYgKzIzNTAzNCwxMCBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+CiA8L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iT3ZlclNjcm9sbGVyIgotIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lk92ZXJTY3JvbGxlciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpbnRlcnBvbGF0b3IiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iT3ZlclNjcm9sbGVyIgotIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lk92ZXJTY3JvbGxlciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpbnRlcnBvbGF0b3IiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJib3VuY2VDb2VmZmljaWVudFgiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJib3VuY2VDb2VmZmljaWVudFkiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iYWJvcnRBbmltYXRpb24iCis8bWV0aG9kIG5hbWU9ImRpc21pc3MiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMjE5OTczLDggKzIzNTA0OCw4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImNvbXB1dGVTY3JvbGxPZmZzZXQiCi0gcmV0dXJuPSJib29sZWFuIgorPG1ldGhvZCBuYW1lPSJnZXRNZW51IgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnUiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTIxOTk4NCw3ICsyMzUwNTksMTggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZmxpbmciCis8bWV0aG9kIG5hbWU9ImdldE1lbnVJbmZsYXRlciIKKyByZXR1cm49ImFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMjE5OTk0LDI0ICsyMzUwODAsMTAgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmVsb2NpdHlYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZlbG9jaXR5WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5YIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhZIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBNZW51Lk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZsaW5nIgorPG1ldGhvZCBuYW1lPSJzaG93IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKQEAgLTIyMDAyMSwyMjYgKzIzNTA5MywyOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2ZWxvY2l0eVgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmVsb2NpdHlZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5ZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib3ZlclgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib3ZlclkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmb3JjZUZpbmlzaGVkIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJmaW5pc2hlZCIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDdXJyWCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEN1cnJZIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0RmluYWxYIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0RmluYWxZIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U3RhcnRYIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U3RhcnRZIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaXNGaW5pc2hlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJpc092ZXJTY3JvbGxlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ibm90aWZ5SG9yaXpvbnRhbEVkZ2VSZWFjaGVkIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImZpbmFsWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvdmVyWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Im5vdGlmeVZlcnRpY2FsRWRnZVJlYWNoZWQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZmluYWxZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im92ZXJZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3ByaW5nQmFjayIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0U2Nyb2xsIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkeCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkeSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0U2Nyb2xsIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkeCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkeSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJQb3B1cE1lbnUuT25NZW51SXRlbUNsaWNrTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uTWVudUl0ZW1DbGljayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJQb3B1cFdpbmRvdyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMDI5Miw2ICsyMzUxNjcsMjIgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVBdHRyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlUmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDwvY29uc3RydWN0b3I+CiA8Y29uc3RydWN0b3IgbmFtZT0iUG9wdXBXaW5kb3ciCiAgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ciCkBAIC0yMjEzMjEsNiArMjM2MjEyLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV4Y2x1ZGVNaW1lcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEltYWdlVG9EZWZhdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRNb2RlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjI0NTcsNiArMjM3MzU5LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW1wdHlWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVtcHR5Vmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RmxvYXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMjUzNiw2ICsyMzc0NTMsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbnRlbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWV0aG9kTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TG9uZyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIyNTUzLDYgKzIzNzQ4NywzNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPbkNsaWNrRXh0cmFzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4dHJhcyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25DbGlja0ZpbGxJbkludGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmaWxsSW5JbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T25DbGlja1BlbmRpbmdJbnRlbnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMjU2OCw2ICsyMzc1MzIsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGVuZGluZ0ludGVudCIgdHlwZT0iYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQZW5kaW5nSW50ZW50VGVtcGxhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icGVuZGluZ0ludGVudFRlbXBsYXRlIiB0eXBlPSJhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFByb2dyZXNzQmFyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjI1ODcsNiArMjM3NTY2LDUxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImluZGV0ZXJtaW5hdGUiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZW1vdGVBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTY3JvbGxQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNob3J0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjI2ODMsNiArMjM3NzA3LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9InZpc2liaWxpdHkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93TmV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dQcmV2aW91cyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMjc0OSw2ICsyMzc3OTksMTYwIEBACiA8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIj4KIDwvaW1wbGVtZW50cz4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUmVtb3RlVmlld3NTZXJ2aWNlIgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLlNlcnZpY2UiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlJlbW90ZVZpZXdzU2VydmljZSIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3c1NlcnZpY2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25CaW5kIgorIHJldHVybj0iYW5kcm9pZC5vcy5JQmluZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25HZXRWaWV3RmFjdG9yeSIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzU2VydmljZS5SZW1vdGVWaWV3c0ZhY3RvcnkiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJSZW1vdGVWaWV3c1NlcnZpY2UuUmVtb3RlVmlld3NGYWN0b3J5IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXRDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEl0ZW1JZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkaW5nVmlldyIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Vmlld0F0IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaWV3VHlwZUNvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzU3RhYmxlSWRzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGF0YVNldENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJSZXNvdXJjZUN1cnNvckFkYXB0ZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTIyMjc4Nyw2ICsyMzc5OTEsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXV0b1JlcXVlcnkiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlJlc291cmNlQ3Vyc29yQWRhcHRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5SZXNvdXJjZUN1cnNvckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGF5b3V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0ibmV3VmlldyIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMzQxNSw2ICsyMzg2MzUsMzM3IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU2VhcmNoVmlldyIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTZWFyY2hWaWV3IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU2VhcmNoVmlldyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0U3VnZ2VzdGlvbnNBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0ljb25maWVkQnlEZWZhdWx0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0ljb25pZmllZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNRdWVyeVJlZmluZW1lbnRFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1N1Ym1pdEJ1dHRvbkVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEljb25pZmllZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imljb25pZnkiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SWNvbmlmaWVkQnlEZWZhdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbmlmaWVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uQ2xvc2VMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3Lk9uQ2xvc2VMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPblF1ZXJ5Q2hhbmdlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldy5PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25RdWVyeVRleHRGb2N1c0NoYW5nZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPblN1Z2dlc3Rpb25TZWxlY3Rpb25MaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3Lk9uU3VnZ2VzdGlvblNlbGVjdGlvbkxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFF1ZXJ5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN1Ym1pdCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRRdWVyeUhpbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoaW50IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFF1ZXJ5UmVmaW5lbWVudEVuYWJsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VhcmNoYWJsZUluZm8iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWFyY2hhYmxlIiB0eXBlPSJhbmRyb2lkLmFwcC5TZWFyY2hhYmxlSW5mbyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJtaXRCdXR0b25FbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWdnZXN0aW9uc0FkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJTZWFyY2hWaWV3Lk9uQ2xvc2VMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25DbG9zZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IlNlYXJjaFZpZXcuT25RdWVyeUNoYW5nZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblF1ZXJ5VGV4dENoYW5nZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1RleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdWJtaXRRdWVyeSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJTZWFyY2hWaWV3Lk9uU3VnZ2VzdGlvblNlbGVjdGlvbkxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblN1Z2dlc3Rpb25DbGlja2VkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3VnZ2VzdGlvblNlbGVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iU2VjdGlvbkluZGV4ZXIiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTIyNDc5OCw2ICsyNDAzNDksMTggQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgogPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3Bpbm5lciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTIyNDgxNSw2ICsyNDAzNzgsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3Bpbm5lciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRQcm9tcHQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyNDg2Nyw2ICsyNDA0NDYsMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icHJvbXB0SWQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Ik1PREVfRElBTE9HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNT0RFX0RST1BET1dOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNwaW5uZXJBZGFwdGVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjI0ODk1LDYgKzI0MDQ5NiwzNyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IlN0YWNrVmlldyIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0FuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RhY2tWaWV3IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlN0YWNrVmlldyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdGFja1ZpZXciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3RhY2tWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iVGFiSG9zdCIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMzY1MzMsNyArMjUyMTY1LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImZpbGVOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KQEAgLTIzNjY1Niw3ICsyNTIyODgsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iZmlsZW5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMjM2NjY4LDcgKzI1MjMwMCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJmaWxlbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KQEAgLTIzNzMzOSw3ICsyNTI5NzEsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYiIgdHlwZT0iYnl0ZVtdIj4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVmZmVyIiB0eXBlPSJieXRlW10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgpAQCAtMjcyNDE2LDkgKzI4ODA0OCw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0iYnl0ZVtdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImRzdE9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImJ5dGVDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3MjY2Miw5ICsyODgyOTQsOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImJ5dGVbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJieXRlQ291bnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwdXQiCkBAIC0yNzI5MDEsNyArMjg4NTMzLDcgQEAKIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImJ5dGVDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgpAQCAtMjczMTM0LDkgKzI4ODc2Niw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0iY2hhcltdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImRzdE9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoYXJDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3MzIzNCw5ICsyODg4NjYsOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImNoYXJbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJjaGFyQ291bnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwdXQiCkBAIC0yNzMzNjUsNyArMjg4OTk3LDcgQEAKIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoYXJDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9IndyYXAiCkBAIC0yNzM1MjYsOSArMjg5MTU4LDkgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iZHN0IiB0eXBlPSJkb3VibGVbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkc3RPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkb3VibGVDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3MzYxNSw5ICsyODkyNDcsOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImRvdWJsZVtdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9InNyY09mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImRvdWJsZUNvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgpAQCAtMjczNjg2LDcgKzI4OTMxOCw3IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkb3VibGVDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgpAQCAtMjczODE3LDkgKzI4OTQ0OSw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0iZmxvYXRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkc3RPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJmbG9hdENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0IgpAQCAtMjczOTA2LDkgKzI4OTUzOCw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9InNyYyIgdHlwZT0iZmxvYXRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJmbG9hdENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgpAQCAtMjczOTc3LDcgKzI4OTYwOSw3IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJmbG9hdENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+CkBAIC0yNzQxMDgsOSArMjg5NzQwLDkgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iZHN0IiB0eXBlPSJpbnRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkc3RPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJpbnRDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3NDE5Nyw5ICsyODk4MjksOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImludFtdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9InNyY09mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImludENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgpAQCAtMjc0MjY4LDcgKzI4OTkwMCw3IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJpbnRDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgpAQCAtMjc0NDE2LDkgKzI5MDA0OCw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0ibG9uZ1tdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImRzdE9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvbmdDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3NDUwNSw5ICsyOTAxMzcsOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImxvbmdbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJsb25nQ291bnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwdXQiCkBAIC0yNzQ1NzYsNyArMjkwMjA4LDcgQEAKIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvbmdDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgpAQCAtMjc0NzY2LDkgKzI5MDM5OCw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0ic2hvcnRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkc3RPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzaG9ydENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0IgpAQCAtMjc0ODU1LDkgKzI5MDQ4Nyw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9InNyYyIgdHlwZT0ic2hvcnRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzaG9ydENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgpAQCAtMjc0OTI2LDcgKzI5MDU1OCw3IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzaG9ydENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+CkBAIC00MTY3NDMsNyArNDMyMzc1LDcgQEAKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxtZXRob2QgbmFtZT0iZ2V0TGVuZ3RoIgpAQCAtNDE3MjMyLDcgKzQzMjg2NCw3IEBACiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8bWV0aG9kIG5hbWU9ImNoYXJhY3RlcnMiCkBAIC00MTc0NDcsNyArNDMzMDc5LDcgQEAKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8aW1wbGVtZW50cyBuYW1lPSJvcmcueG1sLnNheC5EVERIYW5kbGVyIj4KQEAgLTQxNzkxNCw3ICs0MzM1NDYsNyBAQAogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJwYXJzZSIKQEAgLTQxOTM0Niw3ICs0MzQ5NzgsNyBAQAogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxpbXBsZW1lbnRzIG5hbWU9Im9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QiPgpAQCAtNDIwODM1LDcgKzQzNjQ2Nyw3IEBACiAgYWJzdHJhY3Q9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJtYWtlUGFyc2VyIgpkaWZmIC0tZ2l0IGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YSBiL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKaW5kZXggZjJhYTkxZi4uYjA3MzAwNCAxMDA2NDQKLS0tIGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQorKysgYi9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCkBAIC0xMDIsNiArMTAyLDggQEAKICAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoKTsKICAgICAgICAgfSBlbHNlIGlmIChvcC5lcXVhbHMoInByb2ZpbGUiKSkgewogICAgICAgICAgICAgcnVuUHJvZmlsZSgpOworICAgICAgICB9IGVsc2UgaWYgKG9wLmVxdWFscygiZHVtcGhlYXAiKSkgeworICAgICAgICAgICAgcnVuRHVtcEhlYXAoKTsKICAgICAgICAgfSBlbHNlIGlmIChvcC5lcXVhbHMoIm1vbml0b3IiKSkgewogICAgICAgICAgICAgcnVuTW9uaXRvcigpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTQ2LDYgKzE0OCwzMSBAQAogICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHRBcmdSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShrZXksIEludGVnZXIudmFsdWVPZih2YWx1ZSkpOwogICAgICAgICAgICAgICAgIGhhc0ludGVudEluZm8gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLWVpYSIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSB2YWx1ZS5zcGxpdCgiLCIpOworICAgICAgICAgICAgICAgIGludFtdIGxpc3QgPSBuZXcgaW50W3N0cmluZ3MubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdFtpXSA9IEludGVnZXIudmFsdWVPZihzdHJpbmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKGtleSwgbGlzdCk7CisgICAgICAgICAgICAgICAgaGFzSW50ZW50SW5mbyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tZWwiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoa2V5LCBMb25nLnZhbHVlT2YodmFsdWUpKTsKKyAgICAgICAgICAgICAgICBoYXNJbnRlbnRJbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LmVxdWFscygiLS1lbGEiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gdmFsdWUuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgICAgICBsb25nW10gbGlzdCA9IG5ldyBsb25nW3N0cmluZ3MubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdFtpXSA9IExvbmcudmFsdWVPZihzdHJpbmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKGtleSwgbGlzdCk7CisgICAgICAgICAgICAgICAgaGFzSW50ZW50SW5mbyA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tZXoiKSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuZXh0QXJnUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKQEAgLTQzMCw2ICs0NTcsMjggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBydW5EdW1wSGVhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIG1hbmFnZWQgPSAhIi1uIi5lcXVhbHMobmV4dE9wdGlvbigpKTsKKyAgICAgICAgU3RyaW5nIHByb2Nlc3MgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgU3RyaW5nIGhlYXBGaWxlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmQgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShoZWFwRmlsZSksCisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfQ1JFQVRFIHwKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9UUlVOQ0FURSB8CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9XUklURSk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiBVbmFibGUgdG8gb3BlbiBmaWxlOiAiICsgaGVhcEZpbGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtQW0uZHVtcEhlYXAocHJvY2VzcywgbWFuYWdlZCwgaGVhcEZpbGUsIGZkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFuZHJvaWRFeGNlcHRpb24oIkhFQVAgRFVNUCBGQUlMRUQgb24gcHJvY2VzcyAiICsgcHJvY2Vzcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBjbGFzcyBNeUFjdGl2aXR5Q29udHJvbGxlciBleHRlbmRzIElBY3Rpdml0eUNvbnRyb2xsZXIuU3R1YiB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBtR2RiUG9ydDsKIApAQCAtODk0LDggKzk0MywxNSBAQAogICAgICAgICAgICAgICAgICIgICAgICAgIC1wIDxGSUxFPjogd3JpdGUgcHJvZmlsaW5nIGRhdGEgdG8gPEZJTEU+XG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICAtdzogd2FpdCBmb3IgaW5zdHJ1bWVudGF0aW9uIHRvIGZpbmlzaCBiZWZvcmUgcmV0dXJuaW5nXG4iICsKICAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHJ1biBhIHRlc3QgcGFja2FnZSBhZ2FpbnN0IGFuIGFwcGxpY2F0aW9uOiBhbSBpbnN0cnVtZW50IFtmbGFnc10gPFRFU1RfUEFDS0FHRT4vPFJVTk5FUl9DTEFTUz5cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIC1lIDx0ZXN0cnVubmVyX2ZsYWc+IDx0ZXN0cnVubmVyX3ZhbHVlPiBbLDx0ZXN0cnVubmVyX3ZhbHVlPl1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIC13IHdhaXQgZm9yIHRoZSB0ZXN0IHRvIGZpbmlzaCAocmVxdWlyZWQpXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAtciB1c2Ugd2l0aCAtZSBwZXJmIHRydWUgdG8gZ2VuZXJhdGUgcmF3IG91dHB1dCBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzXG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0YXJ0IHByb2ZpbGluZzogYW0gcHJvZmlsZSA8UFJPQ0VTUz4gc3RhcnQgPEZJTEU+XG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0b3AgcHJvZmlsaW5nOiBhbSBwcm9maWxlIDxQUk9DRVNTPiBzdG9wXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGR1bXAgaGVhcDogYW0gZHVtcGhlYXAgW2ZsYWdzXSA8UFJPQ0VTUz4gPEZJTEU+XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAtbjogZHVtcCBuYXRpdmUgaGVhcCBpbnN0ZWFkIG9mIG1hbmFnZWQgaGVhcFxuIiArCiAgICAgICAgICAgICAgICAgIlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICBzdGFydCBtb25pdG9yaW5nOiBhbSBtb25pdG9yIFstLWdkYiA8cG9ydD5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICAtLWdkYjogc3RhcnQgZ2Ric2VydiBvbiB0aGUgZ2l2ZW4gcG9ydCBhdCBjcmFzaC9BTlJcbiIgKwpAQCAtOTA2LDcgKzk2MiwxMCBAQAogICAgICAgICAgICAgICAgICIgICAgICAgIFstZXwtLWVzIDxFWFRSQV9LRVk+IDxFWFRSQV9TVFJJTkdfVkFMVUU+IC4uLl1cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVzbiA8RVhUUkFfS0VZPiAuLi5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1leiA8RVhUUkFfS0VZPiA8RVhUUkFfQk9PTEVBTl9WQUxVRT4gLi4uXVxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgWy1lfC0tZWkgPEVYVFJBX0tFWT4gPEVYVFJBX0lOVF9WQUxVRT4gLi4uXVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZWkgPEVYVFJBX0tFWT4gPEVYVFJBX0lOVF9WQUxVRT4gLi4uXVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZWwgPEVYVFJBX0tFWT4gPEVYVFJBX0xPTkdfVkFMVUU+IC4uLl1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVpYSA8RVhUUkFfS0VZPiA8RVhUUkFfSU5UX1ZBTFVFPlssPEVYVFJBX0lOVF9WQUxVRS4uLl1dXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICBbLS1lbGEgPEVYVFJBX0tFWT4gPEVYVFJBX0xPTkdfVkFMVUU+Wyw8RVhUUkFfTE9OR19WQUxVRS4uLl1dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLW4gPENPTVBPTkVOVD5dIFstZiA8RkxBR1M+XVxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZ3JhbnQtcmVhZC11cmktcGVybWlzc2lvbl0gWy0tZ3JhbnQtd3JpdGUtdXJpLXBlcm1pc3Npb25dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1kZWJ1Zy1sb2ctcmVzb2x1dGlvbl1cbiIgKwpkaWZmIC0tZ2l0IGEvY21kcy9hcHBfcHJvY2Vzcy9hcHBfbWFpbi5jcHAgYi9jbWRzL2FwcF9wcm9jZXNzL2FwcF9tYWluLmNwcAppbmRleCA3ZGVjZjlhLi4wMTU5ZWRkIDEwMDY0NAotLS0gYS9jbWRzL2FwcF9wcm9jZXNzL2FwcF9tYWluLmNwcAorKysgYi9jbWRzL2FwcF9wcm9jZXNzL2FwcF9tYWluLmNwcApAQCAtMTcxLDkgKzE3MSw5IEBACiAgICAgICAgICAgICBydW50aW1lLnN0YXJ0KCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJhcHBfcHJvY2Vzczogbm8gY2xhc3MgbmFtZSBvciAtLXp5Z290ZSBzdXBwbGllZC4iKTsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogbm8gY2xhc3MgbmFtZSBvciAtLXp5Z290ZSBzdXBwbGllZC5cbiIpOwogICAgICAgICBhcHBfdXNhZ2UoKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYXBwX3Byb2Nlc3M6IG5vIGNsYXNzIG5hbWUgb3IgLS16eWdvdGUgc3VwcGxpZWQuIik7CiAgICAgICAgIHJldHVybiAxMDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKaW5kZXggODIyZjYyZC4uNjdiZDlmNyAxMDA2NDQKLS0tIGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKKysrIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKQEAgLTM5LDYgKzM5LDggQEAKIHN0YXRpYyBjaGFyIGNtZGxpbmVfYnVmWzE2Mzg0XSA9ICIodW5rbm93bikiOwogc3RhdGljIGNvbnN0IGNoYXIgKmR1bXBfdHJhY2VzX3BhdGggPSBOVUxMOwogCitzdGF0aWMgY2hhciBzY3JlZW5zaG90X3BhdGhbUEFUSF9NQVhdID0gIiI7CisKIC8qIGR1bXBzIHRoZSBjdXJyZW50IHN5c3RlbSBzdGF0ZSB0byBzdGRvdXQgKi8KIHN0YXRpYyB2b2lkIGR1bXBzdGF0ZSgpIHsKICAgICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKQEAgLTc2LDYgKzc4LDEyIEBACiAgICAgZHVtcF9maWxlKCJTTEFCIElORk8iLCAiL3Byb2Mvc2xhYmluZm8iKTsKICAgICBkdW1wX2ZpbGUoIlpPTkVJTkZPIiwgIi9wcm9jL3pvbmVpbmZvIik7CiAKKyAgICBpZiAoc2NyZWVuc2hvdF9wYXRoWzBdKSB7CisgICAgICAgIExPR0koInRha2luZyBzY3JlZW5zaG90XG4iKTsKKyAgICAgICAgcnVuX2NvbW1hbmQoTlVMTCwgNSwgInN1IiwgInJvb3QiLCAic2NyZWVuc2hvdCIsIHNjcmVlbnNob3RfcGF0aCwgTlVMTCk7CisgICAgICAgIExPR0koIndyb3RlIHNjcmVlbnNob3Q6ICVzXG4iLCBzY3JlZW5zaG90X3BhdGgpOworICAgIH0KKwogICAgIHJ1bl9jb21tYW5kKCJTWVNURU0gTE9HIiwgMjAsICJsb2djYXQiLCAiLXYiLCAidGltZSIsICItZCIsICIqOnYiLCBOVUxMKTsKIAogICAgIC8qIHNob3cgdGhlIHRyYWNlcyB3ZSBjb2xsZWN0ZWQgaW4gbWFpbigpLCBpZiB0aGF0IHdhcyBkb25lICovCkBAIC0xMDMsNyArMTExLDEyIEBACiAgICAgZHVtcF9maWxlKCJORVRXT1JLIFJPVVRFUyIsICIvcHJvYy9uZXQvcm91dGUiKTsKICAgICBkdW1wX2ZpbGUoIkFSUCBDQUNIRSIsICIvcHJvYy9uZXQvYXJwIik7CiAKKyAgICBydW5fY29tbWFuZCgiV0lGSSBORVRXT1JLUyIsIDIwLAorICAgICAgICAgICAgInN1IiwgInJvb3QiLCAid3BhX2NsaSIsICJsaXN0X25ldHdvcmtzIiwgTlVMTCk7CisKICNpZmRlZiBGV0RVTVBfYmNtNDMyOQorICAgIHJ1bl9jb21tYW5kKCJEVU1QIFdJRkkgU1RBVFVTIiwgMjAsCisgICAgICAgICAgICAic3UiLCAicm9vdCIsICJkaGR1dGlsIiwgIi1pIiwgImV0aDAiLCAiZHVtcCIsIE5VTEwpOwogICAgIHJ1bl9jb21tYW5kKCJEVU1QIFdJRkkgRklSTVdBUkUgTE9HIiwgNjAsCiAgICAgICAgICAgICAic3UiLCAicm9vdCIsICJkaGR1dGlsIiwgIi1pIiwgImV0aDAiLCAidXBsb2FkIiwgIi9kYXRhL2xvY2FsL3RtcC93bGFuX2NyYXNoLmR1bXAiLCBOVUxMKTsKICNlbmRpZgpAQCAtMTY0LDE4ICsxNzcsMjUgQEAKIH0KIAogc3RhdGljIHZvaWQgdXNhZ2UoKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZHVtcHN0YXRlIFstZF0gWy1vIGZpbGVdIFstc10gWy16XVxuIgotICAgICAgICAgICAgIiAgLWQ6IGFwcGVuZCBkYXRlIHRvIGZpbGVuYW1lIChyZXF1aXJlcyAtbylcbiIKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBkdW1wc3RhdGUgWy1iIHNvdW5kZmlsZV0gWy1lIHNvdW5kZmlsZV0gWy1vIGZpbGUgWy1kXSBbLXBdIFstel1dIFstc11cbiIKICAgICAgICAgICAgICIgIC1vOiB3cml0ZSB0byBmaWxlIChpbnN0ZWFkIG9mIHN0ZG91dClcbiIKKyAgICAgICAgICAgICIgIC1kOiBhcHBlbmQgZGF0ZSB0byBmaWxlbmFtZSAocmVxdWlyZXMgLW8pXG4iCisgICAgICAgICAgICAiICAtejogZ3ppcCBvdXRwdXQgKHJlcXVpcmVzIC1vKVxuIgorICAgICAgICAgICAgIiAgLXA6IGNhcHR1cmUgc2NyZWVuc2hvdCB0byBmaWxlbmFtZS5wbmcgKHJlcXVpcmVzIC1vKVxuIgogICAgICAgICAgICAgIiAgLXM6IHdyaXRlIG91dHB1dCB0byBjb250cm9sIHNvY2tldCAoZm9yIGluaXQpXG4iCi0gICAgICAgICAgICAiICAtejogZ3ppcCBvdXRwdXQgKHJlcXVpcmVzIC1vKVxuIik7CisgICAgICAgICAgICAiICAtYjogcGxheSBzb3VuZCBmaWxlIGluc3RlYWQgb2YgdmlicmF0ZSwgYXQgYmVnaW5uaW5nIG9mIGpvYlxuIgorICAgICAgICAgICAgIiAgLWU6IHBsYXkgc291bmQgZmlsZSBpbnN0ZWFkIG9mIHZpYnJhdGUsIGF0IGVuZCBvZiBqb2JcbiIKKwkJKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgIGludCBkb19hZGRfZGF0ZSA9IDA7CiAgICAgaW50IGRvX2NvbXByZXNzID0gMDsKICAgICBjaGFyKiB1c2Vfb3V0ZmlsZSA9IDA7CisgICAgY2hhciogYmVnaW5fc291bmQgPSAwOworICAgIGNoYXIqIGVuZF9zb3VuZCA9IDA7CiAgICAgaW50IHVzZV9zb2NrZXQgPSAwOworICAgIGludCBkb19mYiA9IDA7CiAKICAgICBMT0dJKCJiZWdpblxuIik7CiAKQEAgLTE5MSwxMyArMjExLDE2IEBACiAgICAgZHVtcF90cmFjZXNfcGF0aCA9IGR1bXBfdm1fdHJhY2VzKCk7CiAKICAgICBpbnQgYzsKLSAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImRobzpzdnoiKSkgIT0gLTEpIHsKKyAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImI6ZGU6aG86c3Z6cCIpKSAhPSAtMSkgewogICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ2InOiBiZWdpbl9zb3VuZCA9IG9wdGFyZzsgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnZCc6IGRvX2FkZF9kYXRlID0gMTsgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdlJzogZW5kX3NvdW5kID0gb3B0YXJnOyAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ28nOiB1c2Vfb3V0ZmlsZSA9IG9wdGFyZzsgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAncyc6IHVzZV9zb2NrZXQgPSAxOyAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICd2JzogYnJlYWs7ICAvLyBjb21wYXRpYmlsaXR5IG5vLW9wCiAgICAgICAgICAgICBjYXNlICd6JzogZG9fY29tcHJlc3MgPSA2OyAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3AnOiBkb19mYiA9IDE7ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnPyc6IHByaW50ZigiXG4iKTsKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgICAgIHVzYWdlKCk7CkBAIC0yNDQsNiArMjY3LDEwIEBACiAgICAgICAgICAgICBzdHJmdGltZShkYXRlLCBzaXplb2YoZGF0ZSksICItJVktJW0tJWQtJUgtJU0tJVMiLCBsb2NhbHRpbWUoJm5vdykpOwogICAgICAgICAgICAgc3RybGNhdChwYXRoLCBkYXRlLCBzaXplb2YocGF0aCkpOwogICAgICAgICB9CisgICAgICAgIGlmIChkb19mYikgeworICAgICAgICAgICAgc3RybGNweShzY3JlZW5zaG90X3BhdGgsIHBhdGgsIHNpemVvZihzY3JlZW5zaG90X3BhdGgpKTsKKyAgICAgICAgICAgIHN0cmxjYXQoc2NyZWVuc2hvdF9wYXRoLCAiLnBuZyIsIHNpemVvZihzY3JlZW5zaG90X3BhdGgpKTsKKyAgICAgICAgfQogICAgICAgICBzdHJsY2F0KHBhdGgsICIudHh0Iiwgc2l6ZW9mKHBhdGgpKTsKICAgICAgICAgaWYgKGRvX2NvbXByZXNzKSBzdHJsY2F0KHBhdGgsICIuZ3oiLCBzaXplb2YocGF0aCkpOwogICAgICAgICBzdHJsY3B5KHRtcF9wYXRoLCBwYXRoLCBzaXplb2YodG1wX3BhdGgpKTsKQEAgLTI1MSwxNiArMjc4LDE4IEBACiAgICAgICAgIGd6aXBfcGlkID0gcmVkaXJlY3RfdG9fZmlsZShzdGRvdXQsIHRtcF9wYXRoLCBkb19jb21wcmVzcyk7CiAgICAgfQogCi0gICAgLyogYnp6enp6eiAqLwotICAgIGlmICh2aWJyYXRvcikgeworICAgIGlmIChiZWdpbl9zb3VuZCkgeworICAgICAgICBwbGF5X3NvdW5kKGJlZ2luX3NvdW5kKTsKKyAgICB9IGVsc2UgaWYgKHZpYnJhdG9yKSB7CiAgICAgICAgIGZwdXRzKCIxNTAiLCB2aWJyYXRvcik7CiAgICAgICAgIGZmbHVzaCh2aWJyYXRvcik7CiAgICAgfQogCiAgICAgZHVtcHN0YXRlKCk7CiAKLSAgICAvKiBienp6IGJ6enogYnp6eiAqLwotICAgIGlmICh2aWJyYXRvcikgeworICAgIGlmIChlbmRfc291bmQpIHsKKyAgICAgICAgcGxheV9zb3VuZChlbmRfc291bmQpOworICAgIH0gZWxzZSBpZiAodmlicmF0b3IpIHsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgICAgIGZwdXRzKCI3NVxuIiwgdmlicmF0b3IpOwpkaWZmIC0tZ2l0IGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmggYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuaAppbmRleCA2ODJlYWZkLi44M2IxZDExIDEwMDY0NAotLS0gYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuaAorKysgYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuaApAQCAtNDQsNCArNDQsNyBAQAogLyogRGlzcGxheXMgYSBibG9ja2VkIHByb2Nlc3NlcyBpbi1rZXJuZWwgd2FpdCBjaGFubmVsICovCiB2b2lkIHNob3dfd2NoYW4oaW50IHBpZCwgY29uc3QgY2hhciAqbmFtZSk7CiAKKy8qIFBsYXkgYSBzb3VuZCB2aWEgU3RhZ2VmcmlnaHQgKi8KK3ZvaWQgcGxheV9zb3VuZChjb25zdCBjaGFyKiBwYXRoKTsKKwogI2VuZGlmIC8qIF9EVU1QU1RBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMgYi9jbWRzL2R1bXBzdGF0ZS91dGlscy5jCmluZGV4IGM3YTc4Y2MuLmY5MmFjYmJiIDEwMDY0NAotLS0gYS9jbWRzL2R1bXBzdGF0ZS91dGlscy5jCisrKyBiL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMKQEAgLTQyOSwzICs0MjksNyBAQAogICAgIHJlbmFtZShhbnJfdHJhY2VzX3BhdGgsIHRyYWNlc19wYXRoKTsKICAgICByZXR1cm4gZHVtcF90cmFjZXNfcGF0aDsKIH0KKwordm9pZCBwbGF5X3NvdW5kKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBydW5fY29tbWFuZChOVUxMLCA1LCAiL3N5c3RlbS9iaW4vc3RhZ2VmcmlnaHQiLCAiLW8iLCAiLWEiLCBwYXRoLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2NtZHMvcG0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL3BtL1BtLmphdmEgYi9jbWRzL3BtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9wbS9QbS5qYXZhCmluZGV4IDliOGIwYWMuLjA0MDQyMWEgMTAwNjQ0Ci0tLSBhL2NtZHMvcG0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL3BtL1BtLmphdmEKKysrIGIvY21kcy9wbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvcG0vUG0uamF2YQpAQCAtMjMzLDcgKzIzMyw3IEBACiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmF3TGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgIGxpc3QuYWRkKHJhd0xpc3RbaV0pOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogCiAgICAgICAgICAgICAvLyBTb3J0IGJ5IG5hbWUKICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgbmV3IENvbXBhcmF0b3I8RmVhdHVyZUluZm8+KCkgewpAQCAtOTA5LDYgKzkwOSw5IEBACiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhlIGxpc3QgaW5zdHJ1bWVudGF0aW9uIGNvbW1hbmQgcHJpbnRzIGFsbCBpbnN0cnVtZW50YXRpb25zLCIpOwogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm9yIG9ubHkgdGhvc2UgdGhhdCB0YXJnZXQgYSBzcGVjaWZpZWQgcGFja2FnZS4gIE9wdGlvbnM6Iik7CiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtZjogc2VlIHRoZWlyIGFzc29jaWF0ZWQgZmlsZS4iKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIoVXNlIHRoaXMgY29tbWFuZCB0byBsaXN0IGFsbCB0ZXN0IHBhY2thZ2VzLCBvciB1c2UgPFRBUkdFVC1QQUNLQUdFPiAiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgdG8gbGlzdCB0aGUgdGVzdCBwYWNrYWdlcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiBUaGUgLWYgIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIG9wdGlvbiBsaXN0cyB0aGUgLmFwayBmaWxlIGZvciB0aGUgdGVzdCBwYWNrYWdlLikiKTsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIiKTsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUaGUgbGlzdCBmZWF0dXJlcyBjb21tYW5kIHByaW50cyBhbGwgZmVhdHVyZXMgb2YgdGhlIHN5c3RlbS4iKTsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIiKTsKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVuc2hvdC9BbmRyb2lkLm1rIGIvY21kcy9zY3JlZW5zaG90L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljN2FlYgotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc2NyZWVuc2hvdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBzY3JlZW5zaG90LmMKKworTE9DQUxfTU9EVUxFIDo9IHNjcmVlbnNob3QKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGliegorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJwbmcKK0xPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvemxpYgorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVuc2hvdC9zY3JlZW5zaG90LmMgYi9jbWRzL3NjcmVlbnNob3Qvc2NyZWVuc2hvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODYzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3NjcmVlbnNob3Qvc2NyZWVuc2hvdC5jCkBAIC0wLDAgKzEsMTcxIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8emxpYi5oPgorI2luY2x1ZGUgPGxpYnBuZy9wbmcuaD4KKworI2luY2x1ZGUgInByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIgorCisjZGVmaW5lIExPR19UQUcgInNjcmVlbnNob3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3ZvaWQgdGFrZV9zY3JlZW5zaG90KEZJTEUgKmZiX2luLCBGSUxFICpmYl9vdXQpIHsKKyAgICBpbnQgZmI7CisgICAgY2hhciBpbWdidWZbMHgxMDAwMF07CisgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZpbmZvOworICAgIHBuZ19zdHJ1Y3RwIHBuZzsKKyAgICBwbmdfaW5mb3AgaW5mbzsKKyAgICB1bnNpZ25lZCBpbnQgcixjLHJvd2xlbjsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXNwcCxvZmZzZXQ7CisKKyAgICBmYiA9IGZpbGVubyhmYl9pbik7CisgICAgaWYoZmIgPCAwKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBvcGVuIGZyYW1lYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmYl9pbiA9IGZkb3BlbihmYiwgInIiKTsKKworICAgIGlmKGlvY3RsKGZiLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmdmluZm8pIDwgMCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gZ2V0IGZyYW1lYnVmZmVyIGluZm9cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZjbnRsKGZiLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKworICAgIHBuZyA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHBuZyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImZhaWxlZCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdFxuIik7CisgICAgICAgIGZjbG9zZShmYl9pbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwbmdfaW5pdF9pbyhwbmcsIGZiX291dCk7CisgICAgaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImZhaWxlZCBwbmdfY3JlYXRlX2luZm9fc3RydWN0XG4iKTsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmcsIE5VTEwpOworICAgICAgICBmY2xvc2UoZmJfaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmcpKSkgeworICAgICAgICBMT0dFKCJmYWlsZWQgcG5nIHNldGptcFxuIik7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nLCBOVUxMKTsKKyAgICAgICAgZmNsb3NlKGZiX2luKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJ5dGVzcHAgPSB2aW5mby5iaXRzX3Blcl9waXhlbCAvIDg7CisgICAgcG5nX3NldF9JSERSKHBuZywgaW5mbywKKyAgICAgICAgdmluZm8ueHJlcywgdmluZm8ueXJlcywgdmluZm8uYml0c19wZXJfcGl4ZWwgLyA0LCAKKyAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBLCBQTkdfSU5URVJMQUNFX05PTkUsCisgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsIFBOR19GSUxURVJfVFlQRV9CQVNFKTsKKyAgICBwbmdfd3JpdGVfaW5mbyhwbmcsIGluZm8pOworCisgICAgcm93bGVuPXZpbmZvLnhyZXMgKiBieXRlc3BwOworICAgIGlmIChyb3dsZW4gPiBzaXplb2YoaW1nYnVmKSkgeworICAgICAgICBMT0dFKCJjcmF6eSByb3dsZW46ICVkXG4iLCByb3dsZW4pOworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZywgTlVMTCk7CisgICAgICAgIGZjbG9zZShmYl9pbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvZmZzZXQgPSB2aW5mby54b2Zmc2V0ICogYnl0ZXNwcCArIHZpbmZvLnhyZXMgKiB2aW5mby55b2Zmc2V0ICogYnl0ZXNwcDsKKyAgICBmc2VlayhmYl9pbiwgb2Zmc2V0LCBTRUVLX1NFVCk7CisKKyAgICBmb3Iocj0wOyByPHZpbmZvLnlyZXM7IHIrKykgeworICAgICAgICBpbnQgbGVuID0gZnJlYWQoaW1nYnVmLCAxLCByb3dsZW4sIGZiX2luKTsKKyAgICAgICAgaWYgKGxlbiA8PSAwKSBicmVhazsKKyAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmcsIChwbmdfYnl0ZXApaW1nYnVmKTsKKyAgICB9CisKKyAgICBwbmdfd3JpdGVfZW5kKHBuZywgaW5mbyk7CisgICAgZmNsb3NlKGZiX2luKTsKKyAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZywgTlVMTCk7Cit9CisKK3ZvaWQgZm9ya19zb3VuZChjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgcGlkX3QgcGlkID0gZm9yaygpOworICAgIGlmIChwaWQgPT0gMCkgeworICAgICAgICBleGVjbCgiL3N5c3RlbS9iaW4vc3RhZ2VmcmlnaHQiLCAic3RhZ2VmcmlnaHQiLCAiLW8iLCAiLWEiLCBwYXRoLCBOVUxMKTsKKyAgICB9Cit9CisKK3ZvaWQgdXNhZ2UoKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAidXNhZ2U6IHNjcmVlbnNob3QgWy1zIHNvdW5kZmlsZV0gZmlsZW5hbWUucG5nXG4iCisgICAgICAgICAgICAiICAgLXM6IHBsYXkgYSBzb3VuZCBlZmZlY3QgdG8gc2lnbmFsIHN1Y2Nlc3NcbiIKKyAgICAgICAgICAgICIgICAtaTogYXV0b2luY3JlbWVudCB0byBhdm9pZCBvdmVyd3JpdGluZyBmaWxlbmFtZS5wbmdcbiIKKyAgICApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqYXJndikgeworICAgIEZJTEUgKnBuZyA9IE5VTEw7CisgICAgRklMRSAqZmJfaW4gPSBOVUxMOworICAgIGNoYXIgb3V0ZmlsZVtQQVRIX01BWF0gPSAiIjsKKworICAgIGNoYXIgKiBzb3VuZGZpbGUgPSBOVUxMOworICAgIGludCBkb19pbmNyZW1lbnQgPSAwOworCisgICAgaW50IGM7CisgICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJzOmkiKSkgIT0gLTEpIHsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdzJzogc291bmRmaWxlID0gb3B0YXJnOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2knOiBkb19pbmNyZW1lbnQgPSAxOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgdXNhZ2UoKTsgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICB1c2FnZSgpOyBleGl0KDEpOworICAgIH0KKworICAgIHN0cmxjcHkob3V0ZmlsZSwgYXJndlswXSwgUEFUSF9NQVgpOworICAgIGlmIChkb19pbmNyZW1lbnQpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgICAgIGNoYXIgYmFzZVtQQVRIX01BWF0gPSAiIjsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoc3RhdChvdXRmaWxlLCAmc3QpID09IDApIHsKKyAgICAgICAgICAgIGlmICghYmFzZVswXSkgeworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJyY2hyKG91dGZpbGUsICcuJyk7CisgICAgICAgICAgICAgICAgaWYgKHApICpwID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBzdHJjcHkoYmFzZSwgb3V0ZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbnByaW50ZihvdXRmaWxlLCBQQVRIX01BWCwgIiVzLSVkLnBuZyIsIGJhc2UsICsraSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmYl9pbiA9IGZvcGVuKCIvZGV2L2dyYXBoaWNzL2ZiMCIsICJyIik7CisgICAgaWYgKCFmYl9pbikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBjb3VsZCBub3QgcmVhZCBmcmFtZWJ1ZmZlclxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogc3dpdGNoIHRvIG5vbi1yb290IHVzZXIgYW5kIGdyb3VwICovCisgICAgZ2lkX3QgZ3JvdXBzW10gPSB7IEFJRF9MT0csIEFJRF9TRENBUkRfUlcgfTsKKyAgICBzZXRncm91cHMoc2l6ZW9mKGdyb3Vwcykvc2l6ZW9mKGdyb3Vwc1swXSksIGdyb3Vwcyk7CisgICAgc2V0dWlkKEFJRF9TSEVMTCk7CisKKyAgICBwbmcgPSBmb3BlbihvdXRmaWxlLCAidyIpOworICAgIGlmICghcG5nKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IHdyaXRpbmcgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgb3V0ZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICB0YWtlX3NjcmVlbnNob3QoZmJfaW4sIHBuZyk7CisKKyAgICBpZiAoc291bmRmaWxlKSB7CisgICAgICAgIGZvcmtfc291bmQoc291bmRmaWxlKTsKKyAgICB9CisKKyAgICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDlhOTcyODQuLmNiZGYxMTkgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTUzLDYgKzUzLDMxIEBACiAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAogICAgICAgICBTaW5lU291cmNlLmNwcCAgICBcCisgICAgICAgIHJlY29yZHZpZGVvLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisJJChKTklfSF9JTkNMVURFKSBcCisJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKwkkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCisKK0xPQ0FMX01PRFVMRTo9IHJlY29yZHZpZGVvCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKKyAgICAgICAgU2luZVNvdXJjZS5jcHAgICAgXAogICAgICAgICBhdWRpb2xvb3AuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGViNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU2luZVNvdXJjZS5oIgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gUHJpbnQgdXNhZ2Ugc2hvd2luZyBob3cgdG8gdXNlIHRoaXMgdXRpbGl0eSB0byByZWNvcmQgdmlkZW9zCitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICptZSkgeworICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzXG4iLCBtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWgoZWxwKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWIgYml0IHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kIChkZWZhdWx0OiAzMDAwMDApXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtYyBZVVY0MjAgY29sb3IgZm9ybWF0OiBbMF0gc2VtaSBwbGFuYXIgb3IgWzFdIHBsYW5hciAoZGVmYXVsdDogMSlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1mIGZyYW1lIHJhdGUgaW4gZnJhbWVzIHBlciBzZWNvbmQgKGRlZmF1bHQ6IDMwKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWkgSSBmcmFtZSBpbnRlcnZhbCBpbiBzZWNvbmRzIChkZWZhdWx0OiAxKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW4gbnVtYmVyIG9mIGZyYW1lcyB0byBiZSByZWNvcmRlZCAoZGVmYXVsdDogMzAwKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXcgd2lkdGggaW4gcGl4ZWxzIChkZWZhdWx0OiAxNzYpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdCBoZWlnaHQgaW4gcGl4ZWxzIChkZWZhdWx0OiAxNDQpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtbCBlbmNvZGVyIGxldmVsLiBzZWUgb214IGlsIGhlYWRlciAoZGVmYXVsdDogZW5jb2RlciBzcGVjaWZpYylcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1wIGVuY29kZXIgcHJvZmlsZS4gc2VlIG9teCBpbCBoZWFkZXIgKGRlZmF1bHQ6IGVuY29kZXIgc3BlY2lmaWMpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdiB2aWRlbyBjb2RlYzogWzBdIEFWQyBbMV0gTTRWIFsyXSBIMjYzIChkZWZhdWx0OiAwKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJUaGUgb3V0cHV0IGZpbGUgaXMgL3NkY2FyZC9vdXRwdXQubXA0XG4iKTsKKyAgICBleGl0KDEpOworfQorCitjbGFzcyBEdW1teVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CisKK3B1YmxpYzoKKyAgICBEdW1teVNvdXJjZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuRnJhbWVzLCBpbnQgZnBzLCBpbnQgY29sb3JGb3JtYXQpCisgICAgICAgIDogbVdpZHRoKHdpZHRoKSwKKyAgICAgICAgICBtSGVpZ2h0KGhlaWdodCksCisgICAgICAgICAgbU1heE51bUZyYW1lcyhuRnJhbWVzKSwKKyAgICAgICAgICBtRnJhbWVSYXRlKGZwcyksCisgICAgICAgICAgbUNvbG9yRm9ybWF0KGNvbG9yRm9ybWF0KSwKKyAgICAgICAgICBtU2l6ZSgod2lkdGggKiBoZWlnaHQgKiAzKSAvIDIpIHsKKworICAgICAgICBtR3JvdXAuYWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobVNpemUpKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgY29sb3IgZm9ybWF0IHRvIG1ha2Ugc3VyZQorICAgICAgICAvLyB0aGF0IHRoZSBidWZmZXIgc2l6ZSBtU2l6ZSBpdCBzZXQgY29ycmVjdGx5IGFib3ZlLgorICAgICAgICBDSEVDSyhjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciB8fAorICAgICAgICAgICAgICBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKSB7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIG1XaWR0aCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIG1Db2xvckZvcm1hdCk7CisgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOworCisgICAgICAgIHJldHVybiBtZXRhOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKworICAgICAgICBpZiAobU51bUZyYW1lc091dHB1dCAlIDEwID09IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtTnVtRnJhbWVzT3V0cHV0ID09IG1NYXhOdW1GcmFtZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLmFjcXVpcmVfYnVmZmVyKGJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBjb250ZW50cy4gd2UganVzdCB0ZXN0IHZpZGVvIGVuY29kZXIKKyAgICAgICAgLy8gQWxzbywgYnkgc2tpcHBpbmcgdGhlIGNvbnRlbnQgZ2VuZXJhdGlvbiwgd2UgY2FuIHJldHVybiBmcm9tCisgICAgICAgIC8vIHJlYWQoKSBtdWNoIGZhc3Rlci4KKyAgICAgICAgLy9jaGFyIHggPSAoY2hhcikoKGRvdWJsZSlyYW5kKCkgLyBSQU5EX01BWCAqIDI1NSk7CisgICAgICAgIC8vbWVtc2V0KCgqYnVmZmVyKS0+ZGF0YSgpLCB4LCBtU2l6ZSk7CisgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKDAsIG1TaXplKTsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleVRpbWUsIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMCkgLyBtRnJhbWVSYXRlKTsKKyAgICAgICAgKyttTnVtRnJhbWVzT3V0cHV0OworCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5EdW1teVNvdXJjZSgpIHt9CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJHcm91cCBtR3JvdXA7CisgICAgaW50IG1XaWR0aCwgbUhlaWdodDsKKyAgICBpbnQgbU1heE51bUZyYW1lczsKKyAgICBpbnQgbUZyYW1lUmF0ZTsKKyAgICBpbnQgbUNvbG9yRm9ybWF0OworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7OworCisgICAgRHVtbXlTb3VyY2UoY29uc3QgRHVtbXlTb3VyY2UgJik7CisgICAgRHVtbXlTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEdW1teVNvdXJjZSAmKTsKK307CisKK2VudW0geworICAgIGtZVVY0MjBTUCA9IDAsCisgICAga1lVVjQyMFAgID0gMSwKK307CisKKy8vIHJldHVybnMgLTEgaWYgbWFwcGluZyBvZiB0aGUgZ2l2ZW4gY29sb3IgaXMgdW5zdWNjZXNzZnVsCisvLyByZXR1cm5zIGFuIG9teCBjb2xvciBlbnVtIHZhbHVlIG90aGVyd2lzZQorc3RhdGljIGludCB0cmFuc2xhdGVDb2xvclRvT214RW51bVZhbHVlKGludCBjb2xvcikgeworICAgIHN3aXRjaCAoY29sb3IpIHsKKyAgICAgICAgY2FzZSBrWVVWNDIwU1A6CisgICAgICAgICAgICByZXR1cm4gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CisgICAgICAgIGNhc2Uga1lVVjQyMFA6CisgICAgICAgICAgICByZXR1cm4gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgY29sb3I6ICVkXG4iLCBjb2xvcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKworICAgIC8vIERlZmF1bHQgdmFsdWVzIGZvciB0aGUgcHJvZ3JhbSBpZiBub3Qgb3ZlcndyaXR0ZW4KKyAgICBpbnQgZnJhbWVSYXRlRnBzID0gMzA7CisgICAgaW50IHdpZHRoID0gMTc2OworICAgIGludCBoZWlnaHQgPSAxNDQ7CisgICAgaW50IGJpdFJhdGVCcHMgPSAzMDAwMDA7CisgICAgaW50IGlGcmFtZXNJbnRlcnZhbFNlY29uZHMgPSAxOworICAgIGludCBjb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgaW50IG5GcmFtZXMgPSAzMDA7CisgICAgaW50IGxldmVsID0gLTE7ICAgICAgICAvLyBFbmNvZGVyIHNwZWNpZmljIGRlZmF1bHQKKyAgICBpbnQgcHJvZmlsZSA9IC0xOyAgICAgIC8vIEVuY29kZXIgc3BlY2lmaWMgZGVmYXVsdAorICAgIGludCBjb2RlYyA9IDA7CisgICAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSAiL3NkY2FyZC9vdXRwdXQubXA0IjsKKworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBpbnQgcmVzOworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJiOmM6ZjppOm46dzp0Omw6cDp2OmgiKSkgPj0gMCkgeworICAgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYml0UmF0ZUJwcyA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQgPSB0cmFuc2xhdGVDb2xvclRvT214RW51bVZhbHVlKGF0b2kob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbG9yRm9ybWF0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJhbWVSYXRlRnBzID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpRnJhbWVzSW50ZXJ2YWxTZWNvbmRzID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuRnJhbWVzID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVpZ2h0ID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvZmlsZSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29kZWMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGNvZGVjIDwgMCB8fCBjb2RlYyA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPTVhDbGllbnQgY2xpZW50OworICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIE9LKTsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPQorICAgICAgICBuZXcgRHVtbXlTb3VyY2Uod2lkdGgsIGhlaWdodCwgbkZyYW1lcywgZnJhbWVSYXRlRnBzLCBjb2xvckZvcm1hdCk7CisKKyAgICBzcDxNZXRhRGF0YT4gZW5jX21ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgc3dpdGNoIChjb2RlYykgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgZnJhbWVSYXRlRnBzKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIGJpdFJhdGVCcHMpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLCB3aWR0aCk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgaGVpZ2h0KTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgaUZyYW1lc0ludGVydmFsU2Vjb25kcyk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOworICAgIGlmIChsZXZlbCAhPSAtMSkgeworICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIGxldmVsKTsKKyAgICB9CisgICAgaWYgKHByb2ZpbGUgIT0gLTEpIHsKKyAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIHByb2ZpbGUpOworICAgIH0KKworICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0KKyAgICAgICAgT01YQ29kZWM6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLCB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIHNvdXJjZSk7CisKKyAgICBzcDxNUEVHNFdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGZpbGVOYW1lKTsKKyAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKKyAgICBpbnQ2NF90IHN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgIENIRUNLX0VRKE9LLCB3cml0ZXItPnN0YXJ0KCkpOworICAgIHdoaWxlICghd3JpdGVyLT5yZWFjaGVkRU9TKCkpIHsKKyAgICB9CisgICAgZXJyID0gd3JpdGVyLT5zdG9wKCk7CisgICAgaW50NjRfdCBlbmQgPSBzeXN0ZW1UaW1lKCk7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiRcbiIpOworICAgIGNsaWVudC5kaXNjb25uZWN0KCk7CisKKyAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicmVjb3JkIGZhaWxlZDogJWRcbiIsIGVycik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgImVuY29kaW5nICVkIGZyYW1lcyBpbiAlbGxkIHVzXG4iLCBuRnJhbWVzLCAoZW5kLXN0YXJ0KS8xMDAwKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVuY29kaW5nIHNwZWVkIGlzOiAlLjJmIGZwc1xuIiwgKG5GcmFtZXMgKiAxRTkpIC8gKGVuZC1zdGFydCkpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAxZDllMGYxLi5lNmIxYzA4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMzk5LDE5ICszOTksMTkgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBpbnNlcnRBY2NvdW50SW50b0RhdGFiYXNlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHBhc3N3b3JkLCBCdW5kbGUgZXh0cmFzKSB7CiAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBub0Jyb2FkY2FzdCA9IGFjY291bnQudHlwZS5lcXVhbHMoR09PR0xFX0FDQ09VTlRfVFlQRSkKKyAgICAgICAgICAgICAgICAmJiBleHRyYXMgIT0gbnVsbCAmJiBleHRyYXMuZ2V0Qm9vbGVhbihOT19CUk9BRENBU1RfRkxBRywgZmFsc2UpOworICAgICAgICAvLyBSZW1vdmUgdGhlICdub2Jyb2FkY2FzdCcgZmxhZyBzaW5jZSB3ZSBkb24ndCB3YW50IGl0IHRvIHBlcnNpc3QgaW4gdGhlIGRiLiBJdCBpcyBpbnN0ZWFkCisgICAgICAgIC8vIHVzZWQgYXMgYSBjb250cm9sIHNpZ25hbCB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGluc2VydGlvbiBzaG91bGQgcmVzdWx0IGluCisgICAgICAgIC8vIGFuIGFjY291bnRzIGNoYW5nZWQgYnJvYWRjYXN0IGJlaW5nIHNlbnQuCisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZXh0cmFzLnJlbW92ZShOT19CUk9BRENBU1RfRkxBRyk7CisgICAgICAgIH0KICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gbm9Ccm9hZGNhc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChhY2NvdW50LnR5cGUuZXF1YWxzKEdPT0dMRV9BQ0NPVU5UX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlICdub2Jyb2FkY2FzdCcgZmxhZyBhbmQgcmVtb3ZlIGl0IHNpbmNlIHdlIGRvbid0IHdhbnQgaXQgdG8gcGVyc2lzdAotICAgICAgICAgICAgICAgIC8vIGluIHRoZSBkYi4KLSAgICAgICAgICAgICAgICBub0Jyb2FkY2FzdCA9IGV4dHJhcy5nZXRCb29sZWFuKE5PX0JST0FEQ0FTVF9GTEFHLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZXh0cmFzLnJlbW92ZShOT19CUk9BRENBU1RfRkxBRyk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGxvbmcgbnVtTWF0Y2hlcyA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLAogICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRBQkxFX0FDQ09VTlRTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFdIRVJFICIgKyBBQ0NPVU5UU19OQU1FICsgIj0/IEFORCAiICsgQUNDT1VOVFNfVFlQRSsgIj0/IiwKQEAgLTQzNiwxMyArNDM2LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICBpZiAoIW5vQnJvYWRjYXN0KSB7Ci0gICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOwogICAgICAgICB9CisgICAgICAgIGlmICghbm9Ccm9hZGNhc3QpIHsKKyAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmcgaW5zZXJ0RXh0cmEoU1FMaXRlRGF0YWJhc2UgZGIsIGxvbmcgYWNjb3VudElkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKQEAgLTE2NTcsNyArMTY1Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0ZWxlcGhvbnkuZ2V0Q2RtYU5lZWRzUHJvdmlzaW9uaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdGVsZXBob255Lm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImV4Y2VwdGlvbiB3aGlsZSBjaGVja2luZyBwcm92aXNpb25pbmciLCBlKTsKICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBOT1Qgd2lwaW5nIG91dCB0aGUgcGFzc3dvcmRzCkBAIC0xNjgxLDExICsxNjgxLDExIEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiREVMRVRFIGZyb20gIiArIFRBQkxFX0FVVEhUT0tFTlMpOwogICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJVUERBVEUgIiArIFRBQkxFX0FDQ09VTlRTICsgIiBTRVQgIiArIEFDQ09VTlRTX1BBU1NXT1JEICsgIiA9ICcnIik7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKICAgICAgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0TWV0YVZhbHVlKCJpbXNpIiwgaW1zaSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlMDc5NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvci5qYXZhCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVGhpcyBpcyB0aGUgc3VwZXJjbGFzcyBmb3IgY2xhc3NlcyB3aGljaCBwcm92aWRlIGJhc2ljIHN1cHBvcnQgZm9yIGFuaW1hdGlvbnMgd2hpY2ggY2FuIGJlCisgKiBzdGFydGVkLCBlbmRlZCwgYW5kIGhhdmUgPGNvZGU+QW5pbWF0b3JMaXN0ZW5lcnM8L2NvZGU+IGFkZGVkIHRvIHRoZW0uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbmltYXRvciBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRvIGJlIHNlbnQgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBtTGlzdGVuZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGlzIGFuaW1hdGlvbi4gSWYgdGhlIGFuaW1hdGlvbiBoYXMgYSBub256ZXJvIHN0YXJ0RGVsYXksIHRoZSBhbmltYXRpb24gd2lsbCBzdGFydAorICAgICAqIHJ1bm5pbmcgYWZ0ZXIgdGhhdCBkZWxheSBlbGFwc2VzLiBOb3RlIHRoYXQgdGhlIGFuaW1hdGlvbiBkb2VzIG5vdCBzdGFydCBzeW5jaHJvbm91c2x5IHdpdGgKKyAgICAgKiB0aGlzIGNhbGwsIGJlY2F1c2UgYWxsIGFuaW1hdGlvbiBldmVudHMgYXJlIHBvc3RlZCB0byBhIGNlbnRyYWwgdGltaW5nIGxvb3Agc28gdGhhdCBhbmltYXRpb24KKyAgICAgKiB0aW1lcyBhcmUgYWxsIHN5bmNocm9uaXplZCBvbiBhIHNpbmdsZSB0aW1pbmcgcHVsc2Ugb24gdGhlIFVJIHRocmVhZC4gU28gdGhlIGFuaW1hdGlvbiB3aWxsCisgICAgICogc3RhcnQgdGhlIG5leHQgdGltZSB0aGF0IGV2ZW50IGhhbmRsZXIgcHJvY2Vzc2VzIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIHRoZSBhbmltYXRpb24uIFVubGlrZSB7QGxpbmsgI2VuZCgpfSwgPGNvZGU+Y2FuY2VsKCk8L2NvZGU+IGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvCisgICAgICogc3RvcCBpbiBpdHMgdHJhY2tzLCBzZW5kaW5nIGFuIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyI29uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yKX0gdG8KKyAgICAgKiBpdHMgbGlzdGVuZXJzLCBmb2xsb3dlZCBieSBhbiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciNvbkFuaW1hdGlvbkVuZChBbmltYXRvcil9IG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgdGhlIGFuaW1hdGlvbi4gVGhpcyBjYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBhc3NpZ24gdGhlIGVuZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcKKyAgICAgKiBhbmltYXRlZCwgdGhlbiBjYWxsaW5nIHRoZSB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciNvbkFuaW1hdGlvbkVuZChBbmltYXRvcil9IG1ldGhvZCBvbgorICAgICAqIGl0cyBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IHJ1bm5pbmcgdGhlIGFuaW1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldFN0YXJ0RGVsYXkoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisKKyAgICAgKiBAcGFyYW0gc3RhcnREZWxheSBUaGUgYW1vdW50IG9mIHRoZSBkZWxheSwgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhcnREZWxheShsb25nIHN0YXJ0RGVsYXkpOworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXREdXJhdGlvbigpOworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHVzZWQgaW4gY2FsY3VsYXRpbmcgdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhpcyBhbmltYXRpb24uIFRoZQorICAgICAqIGludGVycG9sYXRvciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBydW5zIHdpdGggbGluZWFyIG9yIG5vbi1saW5lYXIgbW90aW9uLAorICAgICAqIHN1Y2ggYXMgYWNjZWxlcmF0aW9uIGFuZCBkZWNlbGVyYXRpb24uIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3J9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVycG9sYXRvciB0byBiZSB1c2VkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW50ZXJwb2xhdG9yKFRpbWVJbnRlcnBvbGF0b3IgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgQW5pbWF0b3IgaXMgY3VycmVudGx5IHJ1bm5pbmcgKGhhdmluZyBiZWVuIHN0YXJ0ZWQgYW5kIG5vdCB5ZXQgZW5kZWQpLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgQW5pbWF0b3IgaXMgcnVubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1J1bm5pbmcoKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgc2V0IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBzZW50IGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mIGFuCisgICAgICogYW5pbWF0aW9uLCBzdWNoIGFzIHN0YXJ0LCByZXBlYXQsIGFuZCBlbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHNldCBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIHNldCBsaXN0ZW5pbmcgdG8gdGhpcyBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudCBzZXQgb2YgbGlzdGVuZXJzIGZvciB0aGlzCisgICAgICogICAgICAgICAgICAgICAgIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIGlmIChtTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNldCBvZiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lcn0gb2JqZWN0cyB0aGF0IGFyZSBjdXJyZW50bHkKKyAgICAgKiBsaXN0ZW5pbmcgZm9yIGV2ZW50cyBvbiB0aGlzIDxjb2RlPkFuaW1hdG9yPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBUaGUgc2V0IG9mIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IGdldExpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1MaXN0ZW5lcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzIGZyb20gdGhpcyBvYmplY3QuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICogPGNvZGU+Z2V0TGlzdGVuZXJzKCk8L2NvZGU+IGZvbGxvd2VkIGJ5IGNhbGxpbmcgPGNvZGU+Y2xlYXIoKTwvY29kZT4gb24gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCBvZiBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsTGlzdGVuZXJzKCkgeworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzLmNsZWFyKCk7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbmltYXRvciBjbG9uZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEFuaW1hdG9yIGFuaW0gPSAoQW5pbWF0b3IpIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IG9sZExpc3RlbmVycyA9IG1MaXN0ZW5lcnM7CisgICAgICAgICAgICAgICAgYW5pbS5tTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPigpOworICAgICAgICAgICAgICAgIGludCBudW1MaXN0ZW5lcnMgPSBvbGRMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5pbS5tTGlzdGVuZXJzLmFkZChvbGRMaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYW5pbTsKKyAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHRlbGxzIHRoZSBvYmplY3QgdG8gdXNlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIHRvIGV4dHJhY3QKKyAgICAgKiBzdGFydGluZyB2YWx1ZXMgZm9yIHRoZSBhbmltYXRpb24uIEZvciBleGFtcGxlLCBhIEFuaW1hdG9yU2V0IG9iamVjdCB3aWxsIHBhc3MKKyAgICAgKiB0aGlzIGNhbGwgdG8gaXRzIGNoaWxkIG9iamVjdHMgdG8gdGVsbCB0aGVtIHRvIHNldCB1cCB0aGUgdmFsdWVzLiBBCisgICAgICogT2JqZWN0QW5pbWF0b3Igb2JqZWN0IHdpbGwgdXNlIHRoZSBpbmZvcm1hdGlvbiBpdCBoYXMgYWJvdXQgaXRzIHRhcmdldCBvYmplY3QKKyAgICAgKiBhbmQgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyB0byBnZXQgdGhlIHN0YXJ0IHZhbHVlcyBmb3IgaXRzIHByb3BlcnRpZXMuCisgICAgICogQW4gVmFsdWVBbmltYXRvciBvYmplY3Qgd2lsbCBpZ25vcmUgdGhlIHJlcXVlc3Qgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBlbm91Z2gKKyAgICAgKiBpbmZvcm1hdGlvbiAoc3VjaCBhcyBhIHRhcmdldCBvYmplY3QpIHRvIGdhdGhlciB0aGVzZSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0dXBTdGFydFZhbHVlcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB0ZWxscyB0aGUgb2JqZWN0IHRvIHVzZSBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbiB0byBleHRyYWN0CisgICAgICogZW5kaW5nIHZhbHVlcyBmb3IgdGhlIGFuaW1hdGlvbi4gRm9yIGV4YW1wbGUsIGEgQW5pbWF0b3JTZXQgb2JqZWN0IHdpbGwgcGFzcworICAgICAqIHRoaXMgY2FsbCB0byBpdHMgY2hpbGQgb2JqZWN0cyB0byB0ZWxsIHRoZW0gdG8gc2V0IHVwIHRoZSB2YWx1ZXMuIEEKKyAgICAgKiBPYmplY3RBbmltYXRvciBvYmplY3Qgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIGl0IGhhcyBhYm91dCBpdHMgdGFyZ2V0IG9iamVjdAorICAgICAqIGFuZCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIHRvIGdldCB0aGUgc3RhcnQgdmFsdWVzIGZvciBpdHMgcHJvcGVydGllcy4KKyAgICAgKiBBbiBWYWx1ZUFuaW1hdG9yIG9iamVjdCB3aWxsIGlnbm9yZSB0aGUgcmVxdWVzdCBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIGVub3VnaAorICAgICAqIGluZm9ybWF0aW9uIChzdWNoIGFzIGEgdGFyZ2V0IG9iamVjdCkgdG8gZ2F0aGVyIHRoZXNlIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXR1cEVuZFZhbHVlcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgb2JqZWN0IHdob3NlIHByb3BlcnR5IHdpbGwgYmUgYW5pbWF0ZWQgYnkgdGhpcyBhbmltYXRpb24uIE5vdCBhbGwgc3ViY2xhc3NlcworICAgICAqIG9wZXJhdGUgb24gdGFyZ2V0IG9iamVjdHMgKGZvciBleGFtcGxlLCB7QGxpbmsgVmFsdWVBbmltYXRvcn0sIGJ1dCB0aGlzIG1ldGhvZAorICAgICAqIGlzIG9uIHRoZSBzdXBlcmNsYXNzIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgZGVhbGluZyBnZW5lcmljYWxseSB3aXRoIHRob3NlIHN1YmNsYXNzZXMKKyAgICAgKiB0aGF0IGRvIGhhbmRsZSB0YXJnZXRzLgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE9iamVjdCB0YXJnZXQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5BbiBhbmltYXRpb24gbGlzdGVuZXIgcmVjZWl2ZXMgbm90aWZpY2F0aW9ucyBmcm9tIGFuIGFuaW1hdGlvbi4KKyAgICAgKiBOb3RpZmljYXRpb25zIGluZGljYXRlIGFuaW1hdGlvbiByZWxhdGVkIGV2ZW50cywgc3VjaCBhcyB0aGUgZW5kIG9yIHRoZQorICAgICAqIHJlcGV0aXRpb24gb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQW5pbWF0b3JMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgc3RhcnQgb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIHN0YXJ0ZWQgYW5pbWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdG9yIGFuaW1hdGlvbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4gVGhpcyBjYWxsYmFjayBpcyBub3QgaW52b2tlZAorICAgICAgICAgKiBmb3IgYW5pbWF0aW9ucyB3aXRoIHJlcGVhdCBjb3VudCBzZXQgdG8gSU5GSU5JVEUuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gd2hpY2ggcmVhY2hlZCBpdHMgZW5kLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgY2FsbGJhY2sgaXMgbm90IGludm9rZWQKKyAgICAgICAgICogZm9yIGFuaW1hdGlvbnMgd2l0aCByZXBlYXQgY291bnQgc2V0IHRvIElORklOSVRFLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHdhcyBjYW5jZWxlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Tm90aWZpZXMgdGhlIHJlcGV0aXRpb24gb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCB3YXMgcmVwZWF0ZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdG9yIGFuaW1hdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9ySW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvckluZmxhdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxNjQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvckluZmxhdGVyLmphdmEKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgbWVudSBYTUwgZmlsZXMgaW50byBBbmltYXRvciBvYmplY3RzLgorICogPHA+CisgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgbWVudSBpbmZsYXRpb24gcmVsaWVzIGhlYXZpbHkgb24gcHJlLXByb2Nlc3Npbmcgb2YKKyAqIFhNTCBmaWxlcyB0aGF0IGlzIGRvbmUgYXQgYnVpbGQgdGltZS4gVGhlcmVmb3JlLCBpdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlCisgKiB0byB1c2UgTWVudUluZmxhdGVyIHdpdGggYW4gWG1sUHVsbFBhcnNlciBvdmVyIGEgcGxhaW4gWE1MIGZpbGUgYXQgcnVudGltZTsKKyAqIGl0IG9ubHkgd29ya3Mgd2l0aCBhbiBYbWxQdWxsUGFyc2VyIHJldHVybmVkIGZyb20gYSBjb21waWxlZCByZXNvdXJjZSAoUi4KKyAqIDxlbT5zb21ldGhpbmc8L2VtPiBmaWxlLikKKyAqLworcHVibGljIGNsYXNzIEFuaW1hdG9ySW5mbGF0ZXIgeworCisgICAgLyoqCisgICAgICogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgd2hlbiBwYXJzaW5nIEFuaW1hdG9yU2V0IG9iamVjdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9HRVRIRVIgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVFVRU5USUFMTFkgPSAxOworCisgICAgLyoqCisgICAgICogRW51bSB2YWx1ZXMgdXNlZCBpbiBYTUwgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgZm9yIG1WYWx1ZVR5cGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9GTE9BVCAgICAgICA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfSU5UICAgICAgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0RPVUJMRSAgICAgID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9DT0xPUiAgICAgICA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfQ1VTVE9NICAgICAgPSA0OworCisgICAgLyoqCisgICAgICogTG9hZHMgYW4ge0BsaW5rIEFuaW1hdG9yfSBvYmplY3QgZnJvbSBhIHJlc291cmNlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBcHBsaWNhdGlvbiBjb250ZXh0IHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcworICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbiB0byBsb2FkCisgICAgICogQHJldHVybiBUaGUgYW5pbWF0b3Igb2JqZWN0IHJlZmVyZW5jZSBieSB0aGUgc3BlY2lmaWVkIGlkCisgICAgICogQHRocm93cyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiB3aGVuIHRoZSBhbmltYXRpb24gY2Fubm90IGJlIGxvYWRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQW5pbWF0b3IgbG9hZEFuaW1hdG9yKENvbnRleHQgY29udGV4dCwgaW50IGlkKQorICAgICAgICAgICAgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRBbmltYXRpb24oaWQpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdG9yRnJvbVhtbChjb250ZXh0LCBwYXJzZXIpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gcm5mID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigiQ2FuJ3QgbG9hZCBhbmltYXRpb24gcmVzb3VyY2UgSUQgIzB4IiArCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oIkNhbid0IGxvYWQgYW5pbWF0aW9uIHJlc291cmNlIElEICMweCIgKworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRvciBjcmVhdGVBbmltYXRvckZyb21YbWwoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlcikKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdG9yRnJvbVhtbChjLCBwYXJzZXIsIFhtbC5hc0F0dHJpYnV0ZVNldChwYXJzZXIpLCBudWxsLCAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRvciBjcmVhdGVBbmltYXRvckZyb21YbWwoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgIEF0dHJpYnV0ZVNldCBhdHRycywgQW5pbWF0b3JTZXQgcGFyZW50LCBpbnQgc2VxdWVuY2VPcmRlcmluZykKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQW5pbWF0b3IgYW5pbSA9IG51bGw7CisgICAgICAgIEFycmF5TGlzdDxBbmltYXRvcj4gY2hpbGRBbmltcyA9IG51bGw7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBvbiBhIHN0YXJ0IHRhZy4KKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgIHdoaWxlICgoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAmJiB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyAgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygib2JqZWN0QW5pbWF0b3IiKSkgeworICAgICAgICAgICAgICAgIGFuaW0gPSBsb2FkT2JqZWN0QW5pbWF0b3IoYywgYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYW5pbWF0b3IiKSkgeworICAgICAgICAgICAgICAgIGFuaW0gPSBsb2FkQW5pbWF0b3IoYywgYXR0cnMsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygic2V0IikpIHsKKyAgICAgICAgICAgICAgICBhbmltID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gYy5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JTZXQpOworICAgICAgICAgICAgICAgIGludCBvcmRlcmluZyA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yU2V0X29yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgVE9HRVRIRVIpOworICAgICAgICAgICAgICAgIGNyZWF0ZUFuaW1hdG9yRnJvbVhtbChjLCBwYXJzZXIsIGF0dHJzLCAoQW5pbWF0b3JTZXQpIGFuaW0sICBvcmRlcmluZyk7CisgICAgICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIGFuaW1hdG9yIG5hbWU6ICIgKyBwYXJzZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkQW5pbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZEFuaW1zID0gbmV3IEFycmF5TGlzdDxBbmltYXRvcj4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hpbGRBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIGNoaWxkQW5pbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgQW5pbWF0b3JbXSBhbmltc0FycmF5ID0gbmV3IEFuaW1hdG9yW2NoaWxkQW5pbXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBmb3IgKEFuaW1hdG9yIGEgOiBjaGlsZEFuaW1zKSB7CisgICAgICAgICAgICAgICAgYW5pbXNBcnJheVtpbmRleCsrXSA9IGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VxdWVuY2VPcmRlcmluZyA9PSBUT0dFVEhFUikgeworICAgICAgICAgICAgICAgIHBhcmVudC5wbGF5VG9nZXRoZXIoYW5pbXNBcnJheSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcmVudC5wbGF5U2VxdWVudGlhbGx5KGFuaW1zQXJyYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFuaW07CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RBbmltYXRvciBsb2FkT2JqZWN0QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW0gPSBuZXcgT2JqZWN0QW5pbWF0b3IoKTsKKworICAgICAgICBsb2FkQW5pbWF0b3IoY29udGV4dCwgYXR0cnMsIGFuaW0pOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9CisgICAgICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Qcm9wZXJ0eUFuaW1hdG9yKTsKKworICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJvcGVydHlBbmltYXRvcl9wcm9wZXJ0eU5hbWUpOworCisgICAgICAgIGFuaW0uc2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7CisKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBhbmltYXRpb24gd2hvc2UgcGFyYW1ldGVycyBjb21lIGZyb20gdGhlIHNwZWNpZmllZCBjb250ZXh0IGFuZAorICAgICAqIGF0dHJpYnV0ZXMgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGFwcGxpY2F0aW9uIGVudmlyb25tZW50CisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBob2xkaW5nIHRoZSBhbmltYXRpb24gcGFyYW1ldGVycworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQW5pbWF0b3IgbG9hZEFuaW1hdG9yKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBWYWx1ZUFuaW1hdG9yIGFuaW0pCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9CisgICAgICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcik7CisKKyAgICAgICAgbG9uZyBkdXJhdGlvbiA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX2R1cmF0aW9uLCAwKTsKKworICAgICAgICBsb25nIHN0YXJ0RGVsYXkgPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9zdGFydE9mZnNldCwgMCk7CisKKyAgICAgICAgaW50IHZhbHVlVHlwZSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVHlwZSwKKyAgICAgICAgICAgICAgICBWQUxVRV9UWVBFX0ZMT0FUKTsKKworICAgICAgICBPYmplY3QgdmFsdWVGcm9tID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IHZhbHVlVG8gPSBudWxsOworICAgICAgICBUeXBlRXZhbHVhdG9yIGV2YWx1YXRvciA9IG51bGw7CisKKyAgICAgICAgc3dpdGNoICh2YWx1ZVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfQ09MT1I6CisgICAgICAgICAgICAgICAgZXZhbHVhdG9yID0gbmV3IFJHQkV2YWx1YXRvcigpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBwaWNrIHVwIHZhbHVlcworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IGEuZ2V0SW50ZWdlcihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvID0gYS5nZXRJbnRlZ2VyKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZUZyb20gPSAoRG91YmxlKSgoRmxvYXQpKGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZikpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvID0gKERvdWJsZSkoKEZsb2F0KWEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMGYpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9DVVNUT006CisgICAgICAgICAgICAgICAgLy8gVE9ETzogSG93IHRvIGdldCBhbiAnT2JqZWN0JyB2YWx1ZT8KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYW5pbSA9PSBudWxsKSB7CisgICAgICAgICAgICBhbmltID0gbmV3IFZhbHVlQW5pbWF0b3IoZHVyYXRpb24sIHZhbHVlRnJvbSwgdmFsdWVUbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbmltLnNldER1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICAgICAgICAgIGFuaW0uc2V0VmFsdWVzKHZhbHVlRnJvbSwgdmFsdWVUbyk7CisgICAgICAgIH0KKworICAgICAgICBhbmltLnNldFN0YXJ0RGVsYXkoc3RhcnREZWxheSk7CisKKyAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0Q291bnQpKSB7CisgICAgICAgICAgICBhbmltLnNldFJlcGVhdENvdW50KAorICAgICAgICAgICAgICAgICAgICBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9yZXBlYXRDb3VudCwgMCkpOworICAgICAgICB9CisgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3JlcGVhdE1vZGUpKSB7CisgICAgICAgICAgICBhbmltLnNldFJlcGVhdE1vZGUoCisgICAgICAgICAgICAgICAgICAgIGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3JlcGVhdE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBbmltYXRvci5SRVNUQVJUKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV2YWx1YXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBhbmltLnNldEV2YWx1YXRvcihldmFsdWF0b3IpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHJlc0lEID0KKyAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfaW50ZXJwb2xhdG9yLCAwKTsKKyAgICAgICAgaWYgKHJlc0lEID4gMCkgeworICAgICAgICAgICAgYW5pbS5zZXRJbnRlcnBvbGF0b3IoQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcihjb250ZXh0LCByZXNJRCkpOworICAgICAgICB9CisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvckxpc3RlbmVyQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yTGlzdGVuZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkNzBhNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvckxpc3RlbmVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgYWRhcHRlciBjbGFzcyBwcm92aWRlcyBlbXB0eSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG1ldGhvZHMgZnJvbSB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lcn0uCisgKiBBbnkgY3VzdG9tIGxpc3RlbmVyIHRoYXQgY2FyZXMgb25seSBhYm91dCBhIHN1YnNldCBvZiB0aGUgbWV0aG9kcyBvZiB0aGlzIGxpc3RlbmVyIGNhbgorICogc2ltcGx5IHN1YmNsYXNzIHRoaXMgYWRhcHRlciBjbGFzcyBpbnN0ZWFkIG9mIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGRpcmVjdGx5LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIgaW1wbGVtZW50cyBBbmltYXRvci5BbmltYXRvckxpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGUwMjkzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yU2V0LmphdmEKQEAgLTAsMCArMSw5MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHBsYXlzIGEgc2V0IG9mIHtAbGluayBBbmltYXRvcn0gb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLiBBbmltYXRpb25zCisgKiBjYW4gYmUgc2V0IHVwIHRvIHBsYXkgdG9nZXRoZXIsIGluIHNlcXVlbmNlLCBvciBhZnRlciBhIHNwZWNpZmllZCBkZWxheS4KKyAqCisgKiA8cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIGFkZGluZyBhbmltYXRpb25zIHRvIGEgPGNvZGU+QW5pbWF0b3JTZXQ8L2NvZGU+OgorICogZWl0aGVyIHRoZSB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheVRvZ2V0aGVyKEFuaW1hdG9yW10pIHBsYXlUb2dldGhlcigpfSBvcgorICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXlTZXF1ZW50aWFsbHkoQW5pbWF0b3JbXSkgcGxheVNlcXVlbnRpYWxseSgpfSBtZXRob2RzIGNhbiBiZSBjYWxsZWQgdG8gYWRkCisgKiBhIHNldCBvZiBhbmltYXRpb25zIGFsbCBhdCBvbmNlLCBvciB0aGUge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBjYW4gYmUKKyAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBtZXRob2RzIGluIHRoZSB7QGxpbmsgQW5pbWF0b3JTZXQuQnVpbGRlciBCdWlsZGVyfQorICogY2xhc3MgdG8gYWRkIGFuaW1hdGlvbnMKKyAqIG9uZSBieSBvbmUuPC9wPgorICoKKyAqIDxwPkl0IGlzIHBvc3NpYmxlIHRvIHNldCB1cCBhIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPiB3aXRoIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBiZXR3ZWVuCisgKiBpdHMgYW5pbWF0aW9ucy4gRm9yIGV4YW1wbGUsIGFuIGFuaW1hdGlvbiBhMSBjb3VsZCBiZSBzZXQgdXAgdG8gc3RhcnQgYmVmb3JlIGFuaW1hdGlvbiBhMiwgYTIKKyAqIGJlZm9yZSBhMywgYW5kIGEzIGJlZm9yZSBhMS4gVGhlIHJlc3VsdHMgb2YgdGhpcyBjb25maWd1cmF0aW9uIGFyZSB1bmRlZmluZWQsIGJ1dCB3aWxsIHR5cGljYWxseQorICogcmVzdWx0IGluIG5vbmUgb2YgdGhlIGFmZmVjdGVkIGFuaW1hdGlvbnMgYmVpbmcgcGxheWVkLiBCZWNhdXNlIG9mIHRoaXMgKGFuZCBiZWNhdXNlCisgKiBjaXJjdWxhciBkZXBlbmRlbmNpZXMgZG8gbm90IG1ha2UgbG9naWNhbCBzZW5zZSBhbnl3YXkpLCBjaXJjdWxhciBkZXBlbmRlbmNpZXMKKyAqIHNob3VsZCBiZSBhdm9pZGVkLCBhbmQgdGhlIGRlcGVuZGVuY3kgZmxvdyBvZiBhbmltYXRpb25zIHNob3VsZCBvbmx5IGJlIGluIG9uZSBkaXJlY3Rpb24uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbmltYXRvclNldCBleHRlbmRzIEFuaW1hdG9yIHsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIHZhcmlhYmxlcworICAgICAqIE5PVEU6IFRoaXMgb2JqZWN0IGltcGxlbWVudHMgdGhlIGNsb25lKCkgbWV0aG9kLCBtYWtpbmcgYSBkZWVwIGNvcHkgb2YgYW55IHJlZmVyZW5jZWQKKyAgICAgKiBvYmplY3RzLiBBcyBvdGhlciBub24tdHJpdmlhbCBmaWVsZHMgYXJlIGFkZGVkIHRvIHRoaXMgY2xhc3MsIG1ha2Ugc3VyZSB0byBhZGQgbG9naWMKKyAgICAgKiB0byBjbG9uZSgpIHRvIG1ha2UgZGVlcCBjb3BpZXMgb2YgdGhlbS4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFRyYWNrcyBhbmltYXRpb25zIGN1cnJlbnRseSBiZWluZyBwbGF5ZWQsIHNvIHRoYXQgd2Uga25vdyB3aGF0IHRvCisgICAgICogY2FuY2VsIG9yIGVuZCB3aGVuIGNhbmNlbCgpIG9yIGVuZCgpIGlzIGNhbGxlZCBvbiB0aGlzIEFuaW1hdG9yU2V0CisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8QW5pbWF0b3I+IG1QbGF5aW5nU2V0ID0gbmV3IEFycmF5TGlzdDxBbmltYXRvcj4oKTsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGFsbCBub2RlcywgbWFwcGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgQW5pbWF0b3JzLiBXaGVuIG5ldworICAgICAqIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaXMgYWRkZWQgZm9yIGFuIEFuaW1hdG9yLCB3ZSB3YW50IHRvIGFkZCBpdAorICAgICAqIHRvIGEgc2luZ2xlIG5vZGUgcmVwcmVzZW50aW5nIHRoYXQgQW5pbWF0b3IsIG5vdCBjcmVhdGUgYSBuZXcgTm9kZQorICAgICAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXA8QW5pbWF0b3IsIE5vZGU+IG1Ob2RlTWFwID0gbmV3IEhhc2hNYXA8QW5pbWF0b3IsIE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgb2YgYWxsIG5vZGVzIGNyZWF0ZWQgZm9yIHRoaXMgQW5pbWF0b3JTZXQuIFRoaXMgbGlzdCBpcyB1c2VkIHVwb24KKyAgICAgKiBzdGFydGluZyB0aGUgc2V0LCBhbmQgdGhlIG5vZGVzIGFyZSBwbGFjZWQgaW4gc29ydGVkIG9yZGVyIGludG8gdGhlCisgICAgICogc29ydGVkTm9kZXMgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxOb2RlPiBtTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydGVkIGxpc3Qgb2Ygbm9kZXMuIFRoaXMgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBhbmltYXRpb25zIHdpbGwKKyAgICAgKiBiZSBwbGF5ZWQuIFRoZSBkZXRhaWxzIGFib3V0IHdoZW4gZXhhY3RseSB0aGV5IHdpbGwgYmUgcGxheWVkIGRlcGVuZAorICAgICAqIG9uIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIG5vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PE5vZGU+IG1Tb3J0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBub2RlcyBzaG91bGQgYmUgc29ydGVkIHByaW9yIHRvIHBsYXlpbmcuIFRoaXMKKyAgICAgKiBmbGFnIGFsbG93cyB1cyB0byBjYWNoZSB0aGUgcHJldmlvdXMgc29ydGVkIG5vZGVzIHNvIHRoYXQgaWYgdGhlIHNlcXVlbmNlCisgICAgICogaXMgcmVwbGF5ZWQgd2l0aCBubyBjaGFuZ2VzLCBpdCBkb2VzIG5vdCBoYXZlIHRvIHJlLXNvcnQgdGhlIG5vZGVzIGFnYWluLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZHNTb3J0ID0gdHJ1ZTsKKworICAgIHByaXZhdGUgQW5pbWF0b3JTZXRMaXN0ZW5lciBtU2V0TGlzdGVuZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIEFuaW1hdG9yU2V0IGhhcyBiZWVuIGNhbmNlbGVkIChieSBjYWxsaW5nIGNhbmNlbCgpIG9yIGVuZCgpKS4KKyAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBhdm9pZCBzdGFydGluZyBvdGhlciBhbmltYXRpb25zIHdoZW4gY3VycmVudGx5LXBsYXlpbmcKKyAgICAgKiBjaGlsZCBhbmltYXRpb25zIG9mIHRoaXMgQW5pbWF0b3JTZXQgZW5kLgorICAgICAqLworICAgIGJvb2xlYW4gbUNhbmNlbGVkID0gZmFsc2U7CisKKyAgICAvLyBUaGUgYW1vdW50IG9mIHRpbWUgaW4gbXMgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlciBzdGFydCgpIGlzIGNhbGxlZAorICAgIHByaXZhdGUgbG9uZyBtU3RhcnREZWxheSA9IDA7CisKKworICAgIC8vIEhvdyBsb25nIHRoZSBjaGlsZCBhbmltYXRpb25zIHNob3VsZCBsYXN0IGluIG1zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBuZWdhdGl2ZSwgd2hpY2gKKyAgICAvLyBzaW1wbHkgbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBkdXJhdGlvbiBzZXQgb24gdGhlIEFuaW1hdG9yU2V0LiBXaGVuIGEgcmVhbCBkdXJhdGlvbiBpcworICAgIC8vIHNldCwgaXQgaXMgcGFzc2VkIGFsb25nIHRvIHRoZSBjaGlsZCBhbmltYXRpb25zLgorICAgIHByaXZhdGUgbG9uZyBtRHVyYXRpb24gPSAtMTsKKworCisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFuaW1hdG9yU2V0IHRvIHBsYXkgYWxsIG9mIHRoZSBzdXBwbGllZCBhbmltYXRpb25zIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGFuaW1hdGlvbnMgdGhhdCB3aWxsIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGxheVRvZ2V0aGVyKEFuaW1hdG9yLi4uIGl0ZW1zKSB7CisgICAgICAgIGlmIChpdGVtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmVlZHNTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IHBsYXkoaXRlbXNbMF0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aChpdGVtc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQW5pbWF0b3JTZXQgdG8gcGxheSBlYWNoIG9mIHRoZSBzdXBwbGllZCBhbmltYXRpb25zIHdoZW4gdGhlCisgICAgICogcHJldmlvdXMgYW5pbWF0aW9uIGVuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGFuaWFtdGlvbnMgdGhhdCB3aWxsIGJlIHN0YXJ0ZWQgb25lIGFmdGVyIGFub3RoZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGxheVNlcXVlbnRpYWxseShBbmltYXRvci4uLiBpdGVtcykgeworICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbU5lZWRzU29ydCA9IHRydWU7CisgICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICBwbGF5KGl0ZW1zWzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGggLSAxOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgcGxheShpdGVtc1tpXSkuYmVmb3JlKGl0ZW1zW2krMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGlzdCBvZiBjaGlsZCBBbmltYXRvciBvYmplY3RzIGNvbnRyb2xsZWQgYnkgdGhpcworICAgICAqIEFuaW1hdG9yU2V0LiBUaGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgbGlzdDsgbW9kaWZpY2F0aW9ucyB0byB0aGUgcmV0dXJuZWQgbGlzdAorICAgICAqIHdpbGwgbm90IGFmZmVjdCB0aGUgQW5pbWF0b3JTZXQsIGFsdGhvdWdoIGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgQW5pbWF0b3Igb2JqZWN0cworICAgICAqIHdpbGwgYWZmZWN0IHRob3NlIG9iamVjdHMgYmVpbmcgbWFuYWdlZCBieSB0aGUgQW5pbWF0b3JTZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5TGlzdDxBbmltYXRvcj4gVGhlIGxpc3Qgb2YgY2hpbGQgYW5pbWF0aW9ucyBvZiB0aGlzIEFuaW1hdG9yU2V0LgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8QW5pbWF0b3I+IGdldENoaWxkQW5pbWF0aW9ucygpIHsKKyAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yPiBjaGlsZExpc3QgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgY2hpbGRMaXN0LmFkZChub2RlLmFuaW1hdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoaWxkTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgb2JqZWN0IGZvciBhbGwgY3VycmVudCB7QGxpbmsgI2dldENoaWxkQW5pbWF0aW9ucygpIGNoaWxkIGFuaW1hdGlvbnN9CisgICAgICogb2YgdGhpcyBBbmltYXRvclNldCB0aGF0IHRha2UgdGFyZ2V0cyAoe0BsaW5rIE9iamVjdEFuaW1hdG9yfSBhbmQKKyAgICAgKiBBbmltYXRvclNldCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgQW5pbWF0b3IgYW5pbWF0aW9uID0gbm9kZS5hbmltYXRpb247CisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uIGluc3RhbmNlb2YgQW5pbWF0b3JTZXQpIHsKKyAgICAgICAgICAgICAgICAoKEFuaW1hdG9yU2V0KWFuaW1hdGlvbikuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIE9iamVjdEFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgKChPYmplY3RBbmltYXRvcilhbmltYXRpb24pLnNldFRhcmdldCh0YXJnZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgVGltZUludGVycG9sYXRvciBmb3IgYWxsIGN1cnJlbnQge0BsaW5rICNnZXRDaGlsZEFuaW1hdGlvbnMoKSBjaGlsZCBhbmltYXRpb25zfQorICAgICAqIG9mIHRoaXMgQW5pbWF0b3JTZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIHRoZSBpbnRlcnBvbGF0b3IgdG8gYmUgdXNlZCBieSBlYWNoIGNoaWxkIGFuaW1hdGlvbiBvZiB0aGlzIEFuaW1hdG9yU2V0CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKFRpbWVJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yKSB7CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5zZXRJbnRlcnBvbGF0b3IoaW50ZXJwb2xhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QsIHdoaWNoIGlzIHVzZWQgdG8KKyAgICAgKiBzZXQgdXAgcGxheWluZyBjb25zdHJhaW50cy4gVGhpcyBpbml0aWFsIDxjb2RlPnBsYXkoKTwvY29kZT4gbWV0aG9kCisgICAgICogdGVsbHMgdGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IHRoZSBhbmltYXRpb24gdGhhdCBpcyB0aGUgZGVwZW5kZW5jeSBmb3IKKyAgICAgKiB0aGUgc3VjY2VlZGluZyBjb21tYW5kcyB0byB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4uIEZvciBleGFtcGxlLAorICAgICAqIGNhbGxpbmcgPGNvZGU+cGxheShhMSkud2l0aChhMik8L2NvZGU+IHNldHMgdXAgdGhlIEFuaW1hdG9yU2V0IHRvIHBsYXkKKyAgICAgKiA8Y29kZT5hMTwvY29kZT4gYW5kIDxjb2RlPmEyPC9jb2RlPiBhdCB0aGUgc2FtZSB0aW1lLAorICAgICAqIDxjb2RlPnBsYXkoYTEpLmJlZm9yZShhMik8L2NvZGU+IHNldHMgdXAgdGhlIEFuaW1hdG9yU2V0IHRvIHBsYXkKKyAgICAgKiA8Y29kZT5hMTwvY29kZT4gZmlyc3QsIGZvbGxvd2VkIGJ5IDxjb2RlPmEyPC9jb2RlPiwgYW5kCisgICAgICogPGNvZGU+cGxheShhMSkuYWZ0ZXIoYTIpPC9jb2RlPiBzZXRzIHVwIHRoZSBBbmltYXRvclNldCB0byBwbGF5CisgICAgICogPGNvZGU+YTI8L2NvZGU+IGZpcnN0LCBmb2xsb3dlZCBieSA8Y29kZT5hMTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgPGNvZGU+cGxheSgpPC9jb2RlPiBpcyB0aGUgb25seSB3YXkgdG8gdGVsbCB0aGUKKyAgICAgKiA8Y29kZT5CdWlsZGVyPC9jb2RlPiB0aGUgYW5pbWF0aW9uIHVwb24gd2hpY2ggdGhlIGRlcGVuZGVuY3kgaXMgY3JlYXRlZCwKKyAgICAgKiBzbyBzdWNjZXNzaXZlIGNhbGxzIHRvIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBpbiA8Y29kZT5CdWlsZGVyPC9jb2RlPgorICAgICAqIHdpbGwgYWxsIHJlZmVyIHRvIHRoZSBpbml0aWFsIHBhcmFtZXRlciBzdXBwbGllZCBpbiA8Y29kZT5wbGF5KCk8L2NvZGU+CisgICAgICogYXMgdGhlIGRlcGVuZGVuY3kgb2YgdGhlIG90aGVyIGFuaW1hdGlvbnMuIEZvciBleGFtcGxlLCBjYWxsaW5nCisgICAgICogPGNvZGU+cGxheShhMSkuYmVmb3JlKGEyKS5iZWZvcmUoYTMpPC9jb2RlPiB3aWxsIHBsYXkgYm90aCA8Y29kZT5hMjwvY29kZT4KKyAgICAgKiBhbmQgPGNvZGU+YTM8L2NvZGU+IHdoZW4gYTEgZW5kczsgaXQgZG9lcyBub3Qgc2V0IHVwIGEgZGVwZW5kZW5jeSBiZXR3ZWVuCisgICAgICogPGNvZGU+YTI8L2NvZGU+IGFuZCA8Y29kZT5hMzwvY29kZT4uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IHVzZWQgaW4gbGF0ZXIgY2FsbHMgdG8gdGhlCisgICAgICogbWV0aG9kcyBpbiB0aGUgcmV0dXJuZWQgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0LiBBIG51bGwgcGFyYW1ldGVyIHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBudWxsIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IHJldHVybiB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIEJ1aWxkZXIgVGhlIG9iamVjdCB0aGF0IGNvbnN0cnVjdHMgdGhlIEFuaW1hdG9yU2V0IGJhc2VkIG9uIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgKiBvdXRsaW5lZCBpbiB0aGUgY2FsbHMgdG8gPGNvZGU+cGxheTwvY29kZT4gYW5kIHRoZSBvdGhlciBtZXRob2RzIGluIHRoZQorICAgICAqIDxjb2RlPkJ1aWxkZXI8L2NvZGUgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZGVyIHBsYXkoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmVlZHNTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihhbmltKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgY2FuY2VsaW5nIGEgPGNvZGU+QW5pbWF0b3JTZXQ8L2NvZGU+IGFsc28gY2FuY2VscyBhbGwgb2YgdGhlIGFuaW1hdGlvbnMgdGhhdCBpdCBpcworICAgICAqIHJlc3BvbnNpYmxlIGZvci48L3A+CisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgICBtQ2FuY2VsZWQgPSB0cnVlOworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25DYW5jZWwodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Tb3J0ZWROb2Rlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLmNhbmNlbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IGVuZGluZyBhIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPiBhbHNvIGVuZHMgYWxsIG9mIHRoZSBhbmltYXRpb25zIHRoYXQgaXQgaXMKKyAgICAgKiByZXNwb25zaWJsZSBmb3IuPC9wPgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKKyAgICAgICAgbUNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Tb3J0ZWROb2Rlcy5zaXplKCkgIT0gbU5vZGVzLnNpemUoKSkgeworICAgICAgICAgICAgLy8gaGFzbid0IGJlZW4gc3RhcnRlZCB5ZXQgLSBzb3J0IHRoZSBub2RlcyBub3csIHRoZW4gZW5kIHRoZW0KKyAgICAgICAgICAgIHNvcnROb2RlcygpOworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtU29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNldExpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNldExpc3RlbmVyID0gbmV3IEFuaW1hdG9yU2V0TGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLmFkZExpc3RlbmVyKG1TZXRMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Tb3J0ZWROb2Rlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLmVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgY2hpbGQgYW5pbWF0aW9ucyBvZiB0aGlzIEFuaW1hdG9yU2V0IGhhdmUgYmVlbiBzdGFydGVkIGFuZCBoYXZlIG5vdAorICAgICAqIHlldCBlbmRlZC4KKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhpcyBBbmltYXRvclNldCBoYXMgYmVlbiBzdGFydGVkIGFuZCBoYXMgbm90IHlldCBlbmRlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICBpZiAobm9kZS5hbmltYXRpb24uaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgcnVubmluZyB0aGUgYW5pbWF0aW9uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnREZWxheSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGFydERlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisKKyAgICAgKiBAcGFyYW0gc3RhcnREZWxheSBUaGUgYW1vdW50IG9mIHRoZSBkZWxheSwgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnREZWxheShsb25nIHN0YXJ0RGVsYXkpIHsKKyAgICAgICAgbVN0YXJ0RGVsYXkgPSBzdGFydERlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiBlYWNoIG9mIHRoZSBjaGlsZCBhbmltYXRpb25zIG9mIHRoaXMgQW5pbWF0b3JTZXQuIFRoaXMgdmFsdWUgbWF5CisgICAgICogYmUgbGVzcyB0aGFuIDAsIHdoaWNoIGluZGljYXRlcyB0aGF0IG5vIGR1cmF0aW9uIGhhcyBiZWVuIHNldCBvbiB0aGlzIEFuaW1hdG9yU2V0CisgICAgICogYW5kIGVhY2ggb2YgdGhlIGNoaWxkIGFuaW1hdGlvbnMgd2lsbCB1c2UgdGhlaXIgb3duIGR1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcywgb2YgZWFjaCBvZiB0aGUgY2hpbGQKKyAgICAgKiBhbmltYXRpb25zIG9mIHRoaXMgQW5pbWF0b3JTZXQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtRHVyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGVuZ3RoIG9mIGVhY2ggb2YgdGhlIGN1cnJlbnQgY2hpbGQgYW5pbWF0aW9ucyBvZiB0aGlzIEFuaW1hdG9yU2V0LiBCeSBkZWZhdWx0LAorICAgICAqIGVhY2ggY2hpbGQgYW5pbWF0aW9uIHdpbGwgdXNlIGl0cyBvd24gZHVyYXRpb24uIElmIHRoZSBkdXJhdGlvbiBpcyBzZXQgb24gdGhlIEFuaW1hdG9yU2V0LAorICAgICAqIHRoZW4gZWFjaCBjaGlsZCBhbmltYXRpb24gaW5oZXJpdHMgdGhpcyBkdXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcywgb2YgZWFjaCBvZiB0aGUgY2hpbGQKKyAgICAgKiBhbmltYXRpb25zIG9mIHRoaXMgQW5pbWF0b3JTZXQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RHVyYXRpb24obG9uZyBkdXJhdGlvbikgeworICAgICAgICBpZiAoZHVyYXRpb24gPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXJhdGlvbiBtdXN0IGJlIGEgdmFsdWUgb2YgemVybyBvciBncmVhdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGRvbid0IHNldCB0aGUgZHVyYXRpb24gb2YgdGhlIHRpbWluZy1vbmx5IG5vZGVzIGNyZWF0ZWQgYnkgQW5pbWF0b3JTZXQgdG8KKyAgICAgICAgICAgIC8vIGluc2VydCAicGxheS1hZnRlciIgZGVsYXlzCisgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5zZXREdXJhdGlvbihkdXJhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgbUR1cmF0aW9uID0gZHVyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogPHA+U3RhcnRpbmcgdGhpcyA8Y29kZT5BbmltYXRvclNldDwvY29kZT4gd2lsbCwgaW4gdHVybiwgc3RhcnQgdGhlIGFuaW1hdGlvbnMgZm9yIHdoaWNoCisgICAgICogaXQgaXMgcmVzcG9uc2libGUuIFRoZSBkZXRhaWxzIG9mIHdoZW4gZXhhY3RseSB0aG9zZSBhbmltYXRpb25zIGFyZSBzdGFydGVkIGRlcGVuZHMgb24KKyAgICAgKiB0aGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIHRoYXQgaGF2ZSBiZWVuIHNldCB1cCBiZXR3ZWVuIHRoZSBhbmltYXRpb25zLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBtQ2FuY2VsZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBGaXJzdCwgc29ydCB0aGUgbm9kZXMgKGlmIG5lY2Vzc2FyeSkuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBzb3J0ZWROb2RlcworICAgICAgICAvLyBjb250YWlucyB0aGUgYW5pbWF0aW9uIG5vZGVzIGluIHRoZSBjb3JyZWN0IG9yZGVyLgorICAgICAgICBzb3J0Tm9kZXMoKTsKKworICAgICAgICAvLyBub2Rlc1RvU3RhcnQgaG9sZHMgdGhlIGxpc3Qgb2Ygbm9kZXMgdG8gYmUgc3RhcnRlZCBpbW1lZGlhdGVseS4gV2UgZG9uJ3Qgd2FudCB0bworICAgICAgICAvLyBzdGFydCB0aGUgYW5pbWF0aW9ucyBpbiB0aGUgbG9vcCBkaXJlY3RseSBiZWNhdXNlIHdlIGZpcnN0IG5lZWQgdG8gc2V0IHVwCisgICAgICAgIC8vIGRlcGVuZGVuY2llcyBvbiBhbGwgb2YgdGhlIG5vZGVzLiBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgd2FudCB0byBzdGFydCBhbiBhbmltYXRpb24KKyAgICAgICAgLy8gd2hlbiBzb21lIG90aGVyIGFuaW1hdGlvbiBhbHNvIHdhbnRzIHRvIHN0YXJ0IHdoZW4gdGhlIGZpcnN0IGFuaW1hdGlvbiBiZWdpbnMuCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxOb2RlPiBub2Rlc1RvU3RhcnQgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbVNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICBpZiAobVNldExpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2V0TGlzdGVuZXIgPSBuZXcgQW5pbWF0b3JTZXRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub2RlLmRlcGVuZGVuY2llcyA9PSBudWxsIHx8IG5vZGUuZGVwZW5kZW5jaWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbm9kZXNUb1N0YXJ0LmFkZChub2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChEZXBlbmRlbmN5IGRlcGVuZGVuY3kgOiBub2RlLmRlcGVuZGVuY2llcykgeworICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5Lm5vZGUuYW5pbWF0aW9uLmFkZExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXBlbmRlbmN5TGlzdGVuZXIodGhpcywgbm9kZSwgZGVwZW5kZW5jeS5ydWxlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUudG1wRGVwZW5kZW5jaWVzID0gKEFycmF5TGlzdDxEZXBlbmRlbmN5Pikgbm9kZS5kZXBlbmRlbmNpZXMuY2xvbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLmFkZExpc3RlbmVyKG1TZXRMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IHRoYXQgYWxsIGRlcGVuZGVuY2llcyBhcmUgc2V0IHVwLCBzdGFydCB0aGUgYW5pbWF0aW9ucyB0aGF0IHNob3VsZCBiZSBzdGFydGVkLgorICAgICAgICBpZiAobVN0YXJ0RGVsYXkgPD0gMCkgeworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBub2Rlc1RvU3RhcnQpIHsKKyAgICAgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICAgICAgICAgIG1QbGF5aW5nU2V0LmFkZChub2RlLmFuaW1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIGNhbmNlbCBvdXQgb2YgdGhlIGRlbGF5IGFwcHJvcHJpYXRlbHkKKyAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgZGVsYXlBbmltID0gbmV3IFZhbHVlQW5pbWF0b3IobVN0YXJ0RGVsYXksIDBmLCAxZik7CisgICAgICAgICAgICBkZWxheUFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBub2Rlc1RvU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWluZ1NldC5hZGQobm9kZS5hbmltYXRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uU3RhcnQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5pbWF0b3JTZXQgY2xvbmUoKSB7CisgICAgICAgIGZpbmFsIEFuaW1hdG9yU2V0IGFuaW0gPSAoQW5pbWF0b3JTZXQpIHN1cGVyLmNsb25lKCk7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBiYXNpYyBjbG9uZSgpIG9wZXJhdGlvbiBjb3BpZXMgYWxsIGl0ZW1zLiBUaGlzIGRvZXNuJ3Qgd29yayB2ZXJ5IHdlbGwgZm9yCisgICAgICAgICAqIEFuaW1hdG9yU2V0LCBiZWNhdXNlIGl0IHdpbGwgY29weSByZWZlcmVuY2VzIHRoYXQgbmVlZCB0byBiZSByZWNyZWF0ZWQgYW5kIHN0YXRlCisgICAgICAgICAqIHRoYXQgbWF5IG5vdCBhcHBseS4gV2hhdCB3ZSBuZWVkIHRvIGRvIG5vdyBpcyBwdXQgdGhlIGNsb25lIGluIGFuIHVuaW5pdGlhbGl6ZWQKKyAgICAgICAgICogc3RhdGUsIHdpdGggZnJlc2gsIGVtcHR5IGRhdGEgc3RydWN0dXJlcy4gVGhlbiB3ZSB3aWxsIGJ1aWxkIHVwIHRoZSBub2RlcyBsaXN0CisgICAgICAgICAqIG1hbnVhbGx5LCBhcyB3ZSBjbG9uZSBlYWNoIE5vZGUgKGFuZCBpdHMgYW5pbWF0aW9uKS4gVGhlIGNsb25lIHdpbGwgdGhlbiBiZSBzb3J0ZWQsCisgICAgICAgICAqIGFuZCB3aWxsIHBvcHVsYXRlIGFueSBhcHByb3ByaWF0ZSBsaXN0cywgd2hlbiBpdCBpcyBzdGFydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgYW5pbS5tTmVlZHNTb3J0ID0gdHJ1ZTsKKyAgICAgICAgYW5pbS5tQ2FuY2VsZWQgPSBmYWxzZTsKKyAgICAgICAgYW5pbS5tUGxheWluZ1NldCA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisgICAgICAgIGFuaW0ubU5vZGVNYXAgPSBuZXcgSGFzaE1hcDxBbmltYXRvciwgTm9kZT4oKTsKKyAgICAgICAgYW5pbS5tTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgIGFuaW0ubVNvcnRlZE5vZGVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworCisgICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgb2xkIG5vZGVzIGxpc3QsIGNsb25pbmcgZWFjaCBub2RlIGFuZCBhZGRpbmcgaXQgdG8gdGhlIG5ldyBub2RlbWFwLgorICAgICAgICAvLyBPbmUgcHJvYmxlbSBpcyB0aGF0IHRoZSBvbGQgbm9kZSBkZXBlbmRlbmNpZXMgcG9pbnQgdG8gbm9kZXMgaW4gdGhlIG9sZCBBbmltYXRvclNldC4KKyAgICAgICAgLy8gV2UgbmVlZCB0byB0cmFjayB0aGUgb2xkL25ldyBub2RlcyBpbiBvcmRlciB0byByZWNvbnN0cnVjdCB0aGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjbG9uZS4KKyAgICAgICAgSGFzaE1hcDxOb2RlLCBOb2RlPiBub2RlQ2xvbmVNYXAgPSBuZXcgSGFzaE1hcDxOb2RlLCBOb2RlPigpOyAvLyA8b2xkLCBuZXc+CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICBOb2RlIG5vZGVDbG9uZSA9IG5vZGUuY2xvbmUoKTsKKyAgICAgICAgICAgIG5vZGVDbG9uZU1hcC5wdXQobm9kZSwgbm9kZUNsb25lKTsKKyAgICAgICAgICAgIGFuaW0ubU5vZGVzLmFkZChub2RlQ2xvbmUpOworICAgICAgICAgICAgYW5pbS5tTm9kZU1hcC5wdXQobm9kZUNsb25lLmFuaW1hdGlvbiwgbm9kZUNsb25lKTsKKyAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjbG9uZTsgd2UnbGwgc2V0IHRoZXNlIHVwIG1hbnVhbGx5IGxhdGVyCisgICAgICAgICAgICBub2RlQ2xvbmUuZGVwZW5kZW5jaWVzID0gbnVsbDsKKyAgICAgICAgICAgIG5vZGVDbG9uZS50bXBEZXBlbmRlbmNpZXMgPSBudWxsOworICAgICAgICAgICAgbm9kZUNsb25lLm5vZGVEZXBlbmRlbnRzID0gbnVsbDsKKyAgICAgICAgICAgIG5vZGVDbG9uZS5ub2RlRGVwZW5kZW5jaWVzID0gbnVsbDsKKyAgICAgICAgICAgIC8vIGNsZWFyIG91dCBhbnkgbGlzdGVuZXJzIHRoYXQgd2VyZSBzZXQgdXAgYnkgdGhlIEFuaW1hdG9yU2V0OyB0aGVzZSB3aWxsCisgICAgICAgICAgICAvLyBiZSBzZXQgdXAgd2hlbiB0aGUgY2xvbmUncyBub2RlcyBhcmUgc29ydGVkCisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gY2xvbmVMaXN0ZW5lcnMgPSBub2RlQ2xvbmUuYW5pbWF0aW9uLmdldExpc3RlbmVycygpOworICAgICAgICAgICAgaWYgKGNsb25lTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gbGlzdGVuZXJzVG9SZW1vdmUgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IGNsb25lTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIEFuaW1hdG9yU2V0TGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNUb1JlbW92ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNUb1JlbW92ZS5hZGQobGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNUb1JlbW92ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVyc1RvUmVtb3ZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGNsb25lZCBhbGwgb2YgdGhlIG5vZGVzLCB3ZSdyZSByZWFkeSB0byB3YWxrIHRocm91Z2ggdGhlaXIKKyAgICAgICAgLy8gZGVwZW5kZW5jaWVzLCBtYXBwaW5nIHRoZSBvbGQgZGVwZW5kZW5jaWVzIHRvIHRoZSBuZXcgbm9kZXMKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZUNsb25lID0gbm9kZUNsb25lTWFwLmdldChub2RlKTsKKyAgICAgICAgICAgIGlmIChub2RlLmRlcGVuZGVuY2llcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChEZXBlbmRlbmN5IGRlcGVuZGVuY3kgOiBub2RlLmRlcGVuZGVuY2llcykgeworICAgICAgICAgICAgICAgICAgICBOb2RlIGNsb25lZERlcGVuZGVuY3lOb2RlID0gbm9kZUNsb25lTWFwLmdldChkZXBlbmRlbmN5Lm5vZGUpOworICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbmN5IGNsb25lRGVwZW5kZW5jeSA9IG5ldyBEZXBlbmRlbmN5KGNsb25lZERlcGVuZGVuY3lOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kucnVsZSk7CisgICAgICAgICAgICAgICAgICAgIG5vZGVDbG9uZS5hZGREZXBlbmRlbmN5KGNsb25lRGVwZW5kZW5jeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyB0aGUgbWVjaGFuaXNtIGJ5IHdoaWNoIGFuaW1hdGlvbnMgYXJlIHN0YXJ0ZWQgYmFzZWQgb24gZXZlbnRzIGluIG90aGVyCisgICAgICogYW5pbWF0aW9ucy4gSWYgYW4gYW5pbWF0aW9uIGhhcyBtdWx0aXBsZSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgYW5pbWF0aW9ucywgdGhlbgorICAgICAqIGFsbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBzYXRpc2ZpZWQgYmVmb3JlIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXBlbmRlbmN5TGlzdGVuZXIgaW1wbGVtZW50cyBBbmltYXRvckxpc3RlbmVyIHsKKworICAgICAgICBwcml2YXRlIEFuaW1hdG9yU2V0IG1BbmltYXRvclNldDsKKworICAgICAgICAvLyBUaGUgbm9kZSB1cG9uIHdoaWNoIHRoZSBkZXBlbmRlbmN5IGlzIGJhc2VkLgorICAgICAgICBwcml2YXRlIE5vZGUgbU5vZGU7CisKKyAgICAgICAgLy8gVGhlIERlcGVuZGVuY3kgcnVsZSAoV0lUSCBvciBBRlRFUikgdGhhdCB0aGUgbGlzdGVuZXIgc2hvdWxkIHdhaXQgZm9yIG9uCisgICAgICAgIC8vIHRoZSBub2RlCisgICAgICAgIHByaXZhdGUgaW50IG1SdWxlOworCisgICAgICAgIHB1YmxpYyBEZXBlbmRlbmN5TGlzdGVuZXIoQW5pbWF0b3JTZXQgYW5pbWF0b3JTZXQsIE5vZGUgbm9kZSwgaW50IHJ1bGUpIHsKKyAgICAgICAgICAgIHRoaXMubUFuaW1hdG9yU2V0ID0gYW5pbWF0b3JTZXQ7CisgICAgICAgICAgICB0aGlzLm1Ob2RlID0gbm9kZTsKKyAgICAgICAgICAgIHRoaXMubVJ1bGUgPSBydWxlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElnbm9yZSBjYW5jZWwgZXZlbnRzIGZvciBub3cuIFdlIG1heSB3YW50IHRvIGhhbmRsZSB0aGlzIGV2ZW50dWFsbHksCisgICAgICAgICAqIHRvIHByZXZlbnQgZm9sbG93LW9uIGFuaW1hdGlvbnMgZnJvbSBydW5uaW5nIHdoZW4gc29tZSBkZXBlbmRlbmN5CisgICAgICAgICAqIGFuaW1hdGlvbiBpcyBjYW5jZWxlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGVuZCBldmVudCBpcyByZWNlaXZlZCAtIHNlZSBpZiB0aGlzIGlzIGFuIGV2ZW50IHdlIGFyZSBsaXN0ZW5pbmcgZm9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtUnVsZSA9PSBEZXBlbmRlbmN5LkFGVEVSKSB7CisgICAgICAgICAgICAgICAgc3RhcnRJZlJlYWR5KGFuaW1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSWdub3JlIHJlcGVhdCBldmVudHMgZm9yIG5vdworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQSBzdGFydCBldmVudCBpcyByZWNlaXZlZCAtIHNlZSBpZiB0aGlzIGlzIGFuIGV2ZW50IHdlIGFyZSBsaXN0ZW5pbmcgZm9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1SdWxlID09IERlcGVuZGVuY3kuV0lUSCkgeworICAgICAgICAgICAgICAgIHN0YXJ0SWZSZWFkeShhbmltYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGV2ZW50IHJlY2VpdmVkIGlzIG9uZSB0aGF0IHRoZSBub2RlIHdhcyB3YWl0aW5nIGZvci4KKyAgICAgICAgICogSWYgc28sIG1hcmsgaXQgYXMgY29tcGxldGUgYW5kIHNlZSB3aGV0aGVyIGl0J3MgdGltZSB0byBzdGFydAorICAgICAgICAgKiB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZGVwZW5kZW5jeUFuaW1hdGlvbiB0aGUgYW5pbWF0aW9uIHRoYXQgc2VudCB0aGUgZXZlbnQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgc3RhcnRJZlJlYWR5KEFuaW1hdG9yIGRlcGVuZGVuY3lBbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtQW5pbWF0b3JTZXQubUNhbmNlbGVkKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhcmVudCBBbmltYXRvclNldCB3YXMgY2FuY2VsZWQsIHRoZW4gZG9uJ3Qgc3RhcnQgYW55IGRlcGVuZGVudCBhbmltcworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeVRvUmVtb3ZlID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoRGVwZW5kZW5jeSBkZXBlbmRlbmN5IDogbU5vZGUudG1wRGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3kucnVsZSA9PSBtUnVsZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5ub2RlLmFuaW1hdGlvbiA9PSBkZXBlbmRlbmN5QW5pbWF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJ1bGUgZmlyZWQgLSByZW1vdmUgdGhlIGRlcGVuZGVuY3kgYW5kIGxpc3RlbmVyIGFuZCBjaGVjayB0bworICAgICAgICAgICAgICAgICAgICAvLyBzZWUgd2hldGhlciBpdCdzIHRpbWUgdG8gc3RhcnQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5VG9SZW1vdmUgPSBkZXBlbmRlbmN5OworICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5QW5pbWF0aW9uLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTm9kZS50bXBEZXBlbmRlbmNpZXMucmVtb3ZlKGRlcGVuZGVuY3lUb1JlbW92ZSk7CisgICAgICAgICAgICBpZiAobU5vZGUudG1wRGVwZW5kZW5jaWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gYWxsIGRlcGVuZGVuY2llcyBzYXRpc2ZpZWQ6IHN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICBtTm9kZS5hbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBtQW5pbWF0b3JTZXQubVBsYXlpbmdTZXQuYWRkKG1Ob2RlLmFuaW1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQW5pbWF0b3JTZXRMaXN0ZW5lciBpbXBsZW1lbnRzIEFuaW1hdG9yTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgQW5pbWF0b3JTZXQgbUFuaW1hdG9yU2V0OworCisgICAgICAgIEFuaW1hdG9yU2V0TGlzdGVuZXIoQW5pbWF0b3JTZXQgYW5pbWF0b3JTZXQpIHsKKyAgICAgICAgICAgIG1BbmltYXRvclNldCA9IGFuaW1hdG9yU2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpZiAobVBsYXlpbmdTZXQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uQ2FuY2VsKG1BbmltYXRvclNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBhbmltYXRpb24ucmVtb3ZlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBtUGxheWluZ1NldC5yZW1vdmUoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIE5vZGUgYW5pbU5vZGUgPSBtQW5pbWF0b3JTZXQubU5vZGVNYXAuZ2V0KGFuaW1hdGlvbik7CisgICAgICAgICAgICBhbmltTm9kZS5kb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIEFycmF5TGlzdDxOb2RlPiBzb3J0ZWROb2RlcyA9IG1BbmltYXRvclNldC5tU29ydGVkTm9kZXM7CisgICAgICAgICAgICBib29sZWFuIGFsbERvbmUgPSB0cnVlOworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBzb3J0ZWROb2RlcykgeworICAgICAgICAgICAgICAgIGlmICghbm9kZS5kb25lKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbERvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFsbERvbmUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBjaGlsZCBhbmltYXRpb24gdG8gZW5kLCB0aGVuIG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGlzCisgICAgICAgICAgICAgICAgLy8gQW5pbWF0b3JTZXQgaGFzIGVuZGVkCisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25FbmQobUFuaW1hdG9yU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHNvcnRzIHRoZSBjdXJyZW50IHNldCBvZiBub2RlcywgaWYgbmVlZGVkLiBUaGUgc29ydCBpcyBhIHNpbXBsZQorICAgICAqIERlcGVuZGVuY3lHcmFwaCBzb3J0LCB3aGljaCBnb2VzIGxpa2UgdGhpczoKKyAgICAgKiAtIEFsbCBub2RlcyB3aXRob3V0IGRlcGVuZGVuY2llcyBiZWNvbWUgJ3Jvb3RzJworICAgICAqIC0gd2hpbGUgcm9vdHMgbGlzdCBpcyBub3QgbnVsbAorICAgICAqIC0gICBmb3IgZWFjaCByb290IHIKKyAgICAgKiAtICAgICBhZGQgciB0byBzb3J0ZWQgbGlzdAorICAgICAqIC0gICAgIHJlbW92ZSByIGFzIGEgZGVwZW5kZW5jeSBmcm9tIGFueSBvdGhlciBub2RlCisgICAgICogLSAgIGFueSBub2RlcyB3aXRoIG5vIGRlcGVuZGVuY2llcyBhcmUgYWRkZWQgdG8gdGhlIHJvb3RzIGxpc3QKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc29ydE5vZGVzKCkgeworICAgICAgICBpZiAobU5lZWRzU29ydCkgeworICAgICAgICAgICAgbVNvcnRlZE5vZGVzLmNsZWFyKCk7CisgICAgICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gcm9vdHMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgICAgIGlmIChub2RlLmRlcGVuZGVuY2llcyA9PSBudWxsIHx8IG5vZGUuZGVwZW5kZW5jaWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RzLmFkZChub2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gdG1wUm9vdHMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICB3aGlsZSAocm9vdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoTm9kZSByb290IDogcm9vdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNvcnRlZE5vZGVzLmFkZChyb290KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3Qubm9kZURlcGVuZGVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiByb290Lm5vZGVEZXBlbmRlbnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlRGVwZW5kZW5jaWVzLnJlbW92ZShyb290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlRGVwZW5kZW5jaWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJvb3RzLmFkZChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcm9vdHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByb290cy5hZGRBbGwodG1wUm9vdHMpOworICAgICAgICAgICAgICAgIHRtcFJvb3RzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTmVlZHNTb3J0ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSAhPSBtTm9kZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2lyY3VsYXIgZGVwZW5kZW5jaWVzIGNhbm5vdCBleGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBBbmltYXRvclNldCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRG9lc24ndCBuZWVkIHNvcnRpbmcsIGJ1dCBzdGlsbCBuZWVkIHRvIGFkZCBpbiB0aGUgbm9kZURlcGVuZGVuY2llcyBsaXN0CisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXNlIGdldCByZW1vdmVkIGFzIHRoZSBldmVudCBsaXN0ZW5lcnMgZmlyZSBhbmQgdGhlIGRlcGVuZGVuY2llcworICAgICAgICAgICAgLy8gYXJlIHNhdGlzZmllZAorICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS5kZXBlbmRlbmNpZXMgIT0gbnVsbCAmJiBub2RlLmRlcGVuZGVuY2llcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoRGVwZW5kZW5jeSBkZXBlbmRlbmN5IDogbm9kZS5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVEZXBlbmRlbmNpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZURlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5ub2RlRGVwZW5kZW5jaWVzLmNvbnRhaW5zKGRlcGVuZGVuY3kubm9kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kubm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZS5kb25lID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXBlbmRlbmN5IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlIHRoYXQgc29tZSBvdGhlciBub2RlIGlzCisgICAgICogZGVwZW5kZW50IHVwb24gYW5kIHRoZSBuYXR1cmUgb2YgdGhhdCBkZXBlbmRlbmN5LgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVwZW5kZW5jeSB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgV0lUSCA9IDA7IC8vIGRlcGVuZGVudCBub2RlIG11c3Qgc3RhcnQgd2l0aCB0aGlzIGRlcGVuZGVuY3kgbm9kZQorICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFGVEVSID0gMTsgLy8gZGVwZW5kZW50IG5vZGUgbXVzdCBzdGFydCB3aGVuIHRoaXMgZGVwZW5kZW5jeSBub2RlIGZpbmlzaGVzCisKKyAgICAgICAgLy8gVGhlIG5vZGUgdGhhdCB0aGUgb3RoZXIgbm9kZSB3aXRoIHRoaXMgRGVwZW5kZW5jeSBpcyBkZXBlbmRlbnQgdXBvbgorICAgICAgICBwdWJsaWMgTm9kZSBub2RlOworCisgICAgICAgIC8vIFRoZSBuYXR1cmUgb2YgdGhlIGRlcGVuZGVuY3kgKFdJVEggb3IgQUZURVIpCisgICAgICAgIHB1YmxpYyBpbnQgcnVsZTsKKworICAgICAgICBwdWJsaWMgRGVwZW5kZW5jeShOb2RlIG5vZGUsIGludCBydWxlKSB7CisgICAgICAgICAgICB0aGlzLm5vZGUgPSBub2RlOworICAgICAgICAgICAgdGhpcy5ydWxlID0gcnVsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgTm9kZSBpcyBhbiBlbWJvZGltZW50IG9mIGJvdGggdGhlIEFuaW1hdG9yIHRoYXQgaXQgd3JhcHMgYXMgd2VsbCBhcworICAgICAqIGFueSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgQW5pbWF0aW9uLiBUaGlzIGluY2x1ZGVzCisgICAgICogYm90aCBkZXBlbmRlbmNpZXMgdXBvbiBvdGhlciBub2RlcyAoaW4gdGhlIGRlcGVuZGVuY2llcyBsaXN0KSBhcworICAgICAqIHdlbGwgYXMgZGVwZW5kZW5jaWVzIG9mIG90aGVyIG5vZGVzIHVwb24gdGhpcyAoaW4gdGhlIG5vZGVEZXBlbmRlbnRzIGxpc3QpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworICAgICAgICBwdWJsaWMgQW5pbWF0b3IgYW5pbWF0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiAgVGhlc2UgYXJlIHRoZSBkZXBlbmRlbmNpZXMgdGhhdCB0aGlzIG5vZGUncyBhbmltYXRpb24gaGFzIG9uIG90aGVyCisgICAgICAgICAqICBub2Rlcy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMgbm9kZSdzIGFuaW1hdGlvbiBzaG91bGQgYmVnaW4gd2l0aCBzb21lCisgICAgICAgICAqICBvdGhlciBhbmltYXRpb24gZW5kcywgdGhlbiB0aGVyZSB3aWxsIGJlIGFuIGl0ZW0gaW4gdGhpcyBub2RlJ3MKKyAgICAgICAgICogIGRlcGVuZGVuY2llcyBsaXN0IGZvciB0aGF0IG90aGVyIGFuaW1hdGlvbidzIG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PERlcGVuZGVuY3k+IGRlcGVuZGVuY2llcyA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRtcERlcGVuZGVuY2llcyBpcyBhIHJ1bnRpbWUgZGV0YWlsLiBXZSB1c2UgdGhlIGRlcGVuZGVuY2llcyBsaXN0IGZvciBzb3J0aW5nLgorICAgICAgICAgKiBCdXQgd2UgYWxzbyB1c2UgdGhlIGxpc3QgdG8ga2VlcCB0cmFjayBvZiB3aGVuIG11bHRpcGxlIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkLAorICAgICAgICAgKiBidXQgcmVtb3ZpbmcgZWFjaCBkZXBlbmRlbmN5IGFzIGl0IGlzIHNhdGlzZmllZC4gV2UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlCisgICAgICAgICAqIHRoZSBkZXBlbmRlbmN5IGl0c2VsZiBmcm9tIHRoZSBsaXN0LCBiZWNhdXNlIHdlIG5lZWQgdG8gcmV0YWluIHRoYXQgaW5mb3JtYXRpb24KKyAgICAgICAgICogaWYgdGhlIEFuaW1hdG9yU2V0IGlzIGxhdW5jaGVkIGluIHRoZSBmdXR1cmUuIFNvIHdlIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGRlcGVuZGVuY3kKKyAgICAgICAgICogbGlzdCB3aGVuIHRoZSBBbmltYXRvclNldCBzdGFydHMgYW5kIHVzZSB0aGlzIHRtcERlcGVuZGVuY2llcyBsaXN0IHRvIHRyYWNrIHRoZQorICAgICAgICAgKiBsaXN0IG9mIHNhdGlzZmllZCBkZXBlbmRlbmNpZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PERlcGVuZGVuY3k+IHRtcERlcGVuZGVuY2llcyA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5vZGVEZXBlbmRlbmNpZXMgaXMganVzdCBhIGxpc3Qgb2YgdGhlIG5vZGVzIHRoYXQgdGhpcyBOb2RlIGlzIGRlcGVuZGVudCB1cG9uLgorICAgICAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgaW4gc29ydE5vZGVzKCksIHRvIGRldGVybWluZSB3aGVuIGEgbm9kZSBpcyBhIHJvb3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PE5vZGU+IG5vZGVEZXBlbmRlbmNpZXMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBub2RlRGVwZGVuZGVudHMgaXMgdGhlIGxpc3Qgb2Ygbm9kZXMgdGhhdCBoYXZlIHRoaXMgbm9kZSBhcyBhIGRlcGVuZGVuY3kuIFRoaXMKKyAgICAgICAgICogaXMgYSB1dGlsaXR5IGZpZWxkIHVzZWQgaW4gc29ydE5vZGVzIHRvIGZhY2lsaXRhdGUgcmVtb3ZpbmcgdGhpcyBub2RlIGFzIGEKKyAgICAgICAgICogZGVwZW5kZW5jeSB3aGVuIGl0IGlzIGEgcm9vdCBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFycmF5TGlzdDxOb2RlPiBub2RlRGVwZW5kZW50cyA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhbmltYXRpb24gaW4gdGhpcyBub2RlIGlzIGZpbmlzaGVkLiBUaGlzIGZsYWcKKyAgICAgICAgICogaXMgdXNlZCBieSBBbmltYXRvclNldCB0byBjaGVjaywgYXMgZWFjaCBhbmltYXRpb24gZW5kcywgd2hldGhlciBhbGwgY2hpbGQgYW5pbWF0aW9ucworICAgICAgICAgKiBhcmUgZG9uZSBhbmQgaXQncyB0aW1lIHRvIHNlbmQgb3V0IGFuIGVuZCBldmVudCBmb3IgdGhlIGVudGlyZSBBbmltYXRvclNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRvbmUgPSBmYWxzZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyB0aGUgTm9kZSB3aXRoIHRoZSBhbmltYXRpb24gdGhhdCBpdCBlbmNhcHN1bGF0ZXMuIEEgTm9kZSBoYXMgbm8KKyAgICAgICAgICogZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQ7IGRlcGVuZGVuY2llcyBhcmUgYWRkZWQgdmlhIHRoZSBhZGREZXBlbmRlbmN5KCkKKyAgICAgICAgICogbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gdGhhdCB0aGUgTm9kZSBlbmNhcHN1bGF0ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTm9kZShBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uID0gYW5pbWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBOb2RlLiBUaGUgZGVwZW5kZW5jeSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICAgICogbm9kZSB0aGF0IHRoaXMgbm9kZSBpcyBkZXBlbmRlbmN5IHVwb24gYW5kIHRoZSBuYXR1cmUgb2YgdGhlIGRlcGVuZGVuY3kuCisgICAgICAgICAqIEBwYXJhbSBkZXBlbmRlbmN5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmRlbmN5KERlcGVuZGVuY3kgZGVwZW5kZW5jeSkgeworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxEZXBlbmRlbmN5PigpOworICAgICAgICAgICAgICAgIG5vZGVEZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOworICAgICAgICAgICAgaWYgKCFub2RlRGVwZW5kZW5jaWVzLmNvbnRhaW5zKGRlcGVuZGVuY3kubm9kZSkpIHsKKyAgICAgICAgICAgICAgICBub2RlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5Lm5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9kZSBkZXBlbmRlbmN5Tm9kZSA9IGRlcGVuZGVuY3kubm9kZTsKKyAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5Tm9kZS5ub2RlRGVwZW5kZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU5vZGUubm9kZURlcGVuZGVudHMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXBlbmRlbmN5Tm9kZS5ub2RlRGVwZW5kZW50cy5hZGQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5vZGUgY2xvbmUoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uID0gKEFuaW1hdG9yKSBhbmltYXRpb24uY2xvbmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCBpcyBhIHV0aWxpdHkgY2xhc3MgdG8gZmFjaWxpdGF0ZSBhZGRpbmcgYW5pbWF0aW9ucyB0byBhCisgICAgICogPGNvZGU+QW5pbWF0b3JTZXQ8L2NvZGU+IGFsb25nIHdpdGggdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgdmFyaW91cyBhbmltYXRpb25zLiBUaGUKKyAgICAgKiBpbnRlbnRpb24gb2YgdGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG1ldGhvZHMsIGFsb25nIHdpdGggdGhlIHtAbGluaworICAgICAqIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpIHBsYXkoKX0gbWV0aG9kIG9mIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPiBpcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvCisgICAgICogZXhwcmVzcyB0aGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIG9mIGFuaW1hdGlvbnMgaW4gYSBuYXR1cmFsIHdheS4gRGV2ZWxvcGVycyBjYW4gYWxzbyB1c2UKKyAgICAgKiB0aGUge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXlUb2dldGhlcihBbmltYXRvcltdKSBwbGF5VG9nZXRoZXIoKX0gYW5kIHtAbGluaworICAgICAqIEFuaW1hdG9yU2V0I3BsYXlTZXF1ZW50aWFsbHkoQW5pbWF0b3JbXSkgcGxheVNlcXVlbnRpYWxseSgpfSBtZXRob2RzIGlmIHRoZXNlIHN1aXQgdGhlIG5lZWQsCisgICAgICogYnV0IGl0IG1pZ2h0IGJlIGVhc2llciBpbiBzb21lIHNpdHVhdGlvbnMgdG8gZXhwcmVzcyB0aGUgQW5pbWF0b3JTZXQgb2YgYW5pbWF0aW9ucyBpbiBwYWlycy4KKyAgICAgKiA8cC8+CisgICAgICogPHA+VGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHksIGJ1dCBpcyByYXRoZXIgY29uc3RydWN0ZWQKKyAgICAgKiBpbnRlcm5hbGx5IHZpYSBhIGNhbGwgdG8ge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfS48L3A+CisgICAgICogPHAvPgorICAgICAqIDxwPkZvciBleGFtcGxlLCB0aGlzIHNldHMgdXAgYSBBbmltYXRvclNldCB0byBwbGF5IGFuaW0xIGFuZCBhbmltMiBhdCB0aGUgc2FtZSB0aW1lLCBhbmltMyB0bworICAgICAqIHBsYXkgd2hlbiBhbmltMiBmaW5pc2hlcywgYW5kIGFuaW00IHRvIHBsYXkgd2hlbiBhbmltMyBmaW5pc2hlczo8L3A+CisgICAgICogPHByZT4KKyAgICAgKiAgICAgQW5pbWF0b3JTZXQgcyA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAqICAgICBzLnBsYXkoYW5pbTEpLndpdGgoYW5pbTIpOworICAgICAqICAgICBzLnBsYXkoYW5pbTIpLmJlZm9yZShhbmltMyk7CisgICAgICogICAgIHMucGxheShhbmltNCkuYWZ0ZXIoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5Ob3RlIGluIHRoZSBleGFtcGxlIHRoYXQgYm90aCB7QGxpbmsgQnVpbGRlciNiZWZvcmUoQW5pbWF0b3IpfSBhbmQge0BsaW5rCisgICAgICogQnVpbGRlciNhZnRlcihBbmltYXRvcil9IGFyZSB1c2VkLiBUaGVzZSBhcmUganVzdCBkaWZmZXJlbnQgd2F5cyBvZiBleHByZXNzaW5nIHRoZSBzYW1lCisgICAgICogcmVsYXRpb25zaGlwIGFuZCBhcmUgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc2F5IHRoaW5ncyBpbiBhIHdheSB0aGF0IGlzIG1vcmUgbmF0dXJhbCwKKyAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHNpdHVhdGlvbi48L3A+CisgICAgICogPHAvPgorICAgICAqIDxwPkl0IGlzIHBvc3NpYmxlIHRvIG1ha2Ugc2V2ZXJhbCBjYWxscyBpbnRvIHRoZSBzYW1lIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCB0byBleHByZXNzCisgICAgICogbXVsdGlwbGUgcmVsYXRpb25zaGlwcy4gSG93ZXZlciwgbm90ZSB0aGF0IGl0IGlzIG9ubHkgdGhlIGFuaW1hdGlvbiBwYXNzZWQgaW50byB0aGUgaW5pdGlhbAorICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gbWV0aG9kIHRoYXQgaXMgdGhlIGRlcGVuZGVuY3kgaW4gYW55IG9mIHRoZSBzdWNjZXNzaXZlCisgICAgICogY2FsbHMgdG8gdGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBzdGFydHMgYm90aCBhbmltMgorICAgICAqIGFuZCBhbmltMyB3aGVuIGFuaW0xIGVuZHM7IHRoZXJlIGlzIG5vIGRpcmVjdCBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFuaW0yIGFuZAorICAgICAqIGFuaW0zOgorICAgICAqIDxwcmU+CisgICAgICogICBBbmltYXRvclNldCBzID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICogICBzLnBsYXkoYW5pbTEpLmJlZm9yZShhbmltMikuYmVmb3JlKGFuaW0zKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBJZiB0aGUgZGVzaXJlZCByZXN1bHQgaXMgdG8gcGxheSBhbmltMSB0aGVuIGFuaW0yIHRoZW4gYW5pbTMsIHRoaXMgY29kZSBleHByZXNzZXMgdGhlCisgICAgICogcmVsYXRpb25zaGlwIGNvcnJlY3RseTo8L3A+CisgICAgICogPHByZT4KKyAgICAgKiAgIEFuaW1hdG9yU2V0IHMgPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgKiAgIHMucGxheShhbmltMSkuYmVmb3JlKGFuaW0yKTsKKyAgICAgKiAgIHMucGxheShhbmltMikuYmVmb3JlKGFuaW0zKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cC8+CisgICAgICogPHA+Tm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGV4cHJlc3MgcmVsYXRpb25zaGlwcyB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBhbmQgd2lsbCBub3QKKyAgICAgKiByZXN1bHQgaW4gc2Vuc2libGUgcmVzdWx0cy4gRm9yIGV4YW1wbGUsIDxjb2RlPnBsYXkoYW5pbTEpLmFmdGVyKGFuaW0xKTwvY29kZT4gbWFrZXMgbm8KKyAgICAgKiBzZW5zZS4gSW4gZ2VuZXJhbCwgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGxpa2UgdGhpcyBvbmUgKG9yIG1vcmUgaW5kaXJlY3Qgb25lcyB3aGVyZSBhIGRlcGVuZHMKKyAgICAgKiBvbiBiLCB3aGljaCBkZXBlbmRzIG9uIGMsIHdoaWNoIGRlcGVuZHMgb24gYSkgc2hvdWxkIGJlIGF2b2lkZWQuIE9ubHkgY3JlYXRlIEFuaW1hdG9yU2V0cworICAgICAqIHRoYXQgY2FuIGJvaWwgZG93biB0byBhIHNpbXBsZSwgb25lLXdheSByZWxhdGlvbnNoaXAgb2YgYW5pbWF0aW9ucyBzdGFydGluZyB3aXRoLCBiZWZvcmUsIGFuZAorICAgICAqIGFmdGVyIG90aGVyLCBkaWZmZXJlbnQsIGFuaW1hdGlvbnMuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBCdWlsZGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB0cmFja3MgdGhlIGN1cnJlbnQgbm9kZSBiZWluZyBwcm9jZXNzZWQuIEl0IGlzIHN1cHBsaWVkIHRvIHRoZSBwbGF5KCkgbWV0aG9kCisgICAgICAgICAqIG9mIEFuaW1hdG9yU2V0IGFuZCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igb2YgQnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgTm9kZSBtQ3VycmVudE5vZGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHBhY2thZ2UtcHJpdmF0ZSBjb25zdHJ1Y3Rvci4gQnVpbGRlcnMgYXJlIG9ubHkgY29uc3RydWN0ZWQgYnkgQW5pbWF0b3JTZXQsIHdoZW4gdGhlCisgICAgICAgICAqIHBsYXkoKSBtZXRob2QgaXMgY2FsbGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHRoYXQgaXMgdGhlIGRlcGVuZGVuY3kgZm9yIHRoZSBvdGhlciBhbmltYXRpb25zIHBhc3NlZCBpbnRvCisgICAgICAgICAqIHRoZSBvdGhlciBtZXRob2RzIG9mIHRoaXMgQnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgIG1DdXJyZW50Tm9kZSA9IG1Ob2RlTWFwLmdldChhbmltKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudE5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50Tm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBtQ3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIG1Ob2Rlcy5hZGQobUN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gdGhhdCB3aWxsIHBsYXkgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIHRvIHRoZQorICAgICAgICAgKiB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9IG1ldGhvZCBzdGFydHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB3aXRoKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG1Ob2RlTWFwLmdldChhbmltKTsKKyAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoYW5pbSk7CisgICAgICAgICAgICAgICAgbU5vZGVNYXAucHV0KGFuaW0sIG5vZGUpOworICAgICAgICAgICAgICAgIG1Ob2Rlcy5hZGQobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBuZXcgRGVwZW5kZW5jeShtQ3VycmVudE5vZGUsIERlcGVuZGVuY3kuV0lUSCk7CisgICAgICAgICAgICBub2RlLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB1cCB0aGUgZ2l2ZW4gYW5pbWF0aW9uIHRvIHBsYXkgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIGluIHRoZQorICAgICAgICAgKiB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9IGNhbGwgdGhhdCBjcmVhdGVkIHRoaXMgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0CisgICAgICAgICAqIGVuZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gdGhhdCB3aWxsIHBsYXkgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIHRvIHRoZQorICAgICAgICAgKiB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9IG1ldGhvZCBlbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG1Ob2RlTWFwLmdldChhbmltKTsKKyAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoYW5pbSk7CisgICAgICAgICAgICAgICAgbU5vZGVNYXAucHV0KGFuaW0sIG5vZGUpOworICAgICAgICAgICAgICAgIG1Ob2Rlcy5hZGQobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBuZXcgRGVwZW5kZW5jeShtQ3VycmVudE5vZGUsIERlcGVuZGVuY3kuQUZURVIpOworICAgICAgICAgICAgbm9kZS5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGdpdmVuIGFuaW1hdGlvbiB0byBwbGF5IHdoZW4gdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdAorICAgICAgICAgKiB0byBzdGFydCB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhpcyBtZXRob2QgY2FsbCBlbmRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHdob3NlIGVuZCB3aWxsIGNhdXNlIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gbWV0aG9kIHRvIHBsYXkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZnRlcihBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBtTm9kZU1hcC5nZXQoYW5pbSk7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBub2RlKTsKKyAgICAgICAgICAgICAgICBtTm9kZXMuYWRkKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3kobm9kZSwgRGVwZW5kZW5jeS5BRlRFUik7CisgICAgICAgICAgICBtQ3VycmVudE5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogdG8gcGxheSB3aGVuIHRoZSBnaXZlbiBhbW91bnQgb2YgdGltZSBlbGFwc2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVsYXkgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBzaG91bGQgZWxhcHNlIGJlZm9yZSB0aGUKKyAgICAgICAgICogYW5pbWF0aW9uIHN0YXJ0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyKGxvbmcgZGVsYXkpIHsKKyAgICAgICAgICAgIC8vIHNldHVwIGR1bW15IFZhbHVlQW5pbWF0b3IganVzdCB0byBydW4gdGhlIGNsb2NrCisgICAgICAgICAgICBhZnRlcihuZXcgVmFsdWVBbmltYXRvcihkZWxheSwgMGYsIDFmKSk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0RvdWJsZUV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0RvdWJsZUV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmViMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRG91YmxlRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIERvdWJsZUV2YWx1YXRvciBpbXBsZW1lbnRzIFR5cGVFdmFsdWF0b3IgeworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVzdWx0IG9mIGxpbmVhcmx5IGludGVycG9sYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCB3aXRoCisgICAgICogPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgcHJvcG9ydGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcy4gVGhlCisgICAgICogY2FsY3VsYXRpb24gaXMgYSBzaW1wbGUgcGFyYW1ldHJpYyBjYWxjdWxhdGlvbjogPGNvZGU+cmVzdWx0ID0geDAgKyB0ICogKHYxIC0gdjApPC9jb2RlPiwKKyAgICAgKiB3aGVyZSA8Y29kZT54MDwvY29kZT4gaXMgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4sIDxjb2RlPngxPC9jb2RlPiBpcyA8Y29kZT5lbmRWYWx1ZTwvY29kZT4sCisgICAgICogYW5kIDxjb2RlPnQ8L2NvZGU+IGlzIDxjb2RlPmZyYWN0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiAgIFRoZSBmcmFjdGlvbiBmcm9tIHRoZSBzdGFydGluZyB0byB0aGUgZW5kaW5nIHZhbHVlcworICAgICAqIEBwYXJhbSBzdGFydFZhbHVlIFRoZSBzdGFydCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+ZG91YmxlPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkRvdWJsZTwvY29kZT4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5kb3VibGU8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+RG91YmxlPC9jb2RlPgorICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgZG91YmxlIHN0YXJ0RG91YmxlID0gKChOdW1iZXIpIHN0YXJ0VmFsdWUpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgIHJldHVybiBzdGFydERvdWJsZSArIGZyYWN0aW9uICogKCgoTnVtYmVyKSBlbmRWYWx1ZSkuZG91YmxlVmFsdWUoKSAtIHN0YXJ0RG91YmxlKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0Zsb2F0RXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRmxvYXRFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTIwNTRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0Zsb2F0RXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgRmxvYXRFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVzdWx0IG9mIGxpbmVhcmx5IGludGVycG9sYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCB3aXRoCisgICAgICogPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgcHJvcG9ydGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcy4gVGhlCisgICAgICogY2FsY3VsYXRpb24gaXMgYSBzaW1wbGUgcGFyYW1ldHJpYyBjYWxjdWxhdGlvbjogPGNvZGU+cmVzdWx0ID0geDAgKyB0ICogKHYxIC0gdjApPC9jb2RlPiwKKyAgICAgKiB3aGVyZSA8Y29kZT54MDwvY29kZT4gaXMgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4sIDxjb2RlPngxPC9jb2RlPiBpcyA8Y29kZT5lbmRWYWx1ZTwvY29kZT4sCisgICAgICogYW5kIDxjb2RlPnQ8L2NvZGU+IGlzIDxjb2RlPmZyYWN0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiAgIFRoZSBmcmFjdGlvbiBmcm9tIHRoZSBzdGFydGluZyB0byB0aGUgZW5kaW5nIHZhbHVlcworICAgICAqIEBwYXJhbSBzdGFydFZhbHVlIFRoZSBzdGFydCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+RmxvYXQ8L2NvZGU+CisgICAgICogQHBhcmFtIGVuZFZhbHVlICAgVGhlIGVuZCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IG9yIDxjb2RlPkZsb2F0PC9jb2RlPgorICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgZmxvYXQgc3RhcnRGbG9hdCA9ICgoTnVtYmVyKSBzdGFydFZhbHVlKS5mbG9hdFZhbHVlKCk7CisgICAgICAgIHJldHVybiBzdGFydEZsb2F0ICsgZnJhY3Rpb24gKiAoKChOdW1iZXIpIGVuZFZhbHVlKS5mbG9hdFZhbHVlKCkgLSBzdGFydEZsb2F0KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0ludEV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0ludEV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODg5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vSW50RXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIEludEV2YWx1YXRvciBpbXBsZW1lbnRzIFR5cGVFdmFsdWF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+SW50ZWdlcjwvY29kZT4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+CisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSkgeworICAgICAgICBpbnQgc3RhcnRJbnQgPSAoKE51bWJlcikgc3RhcnRWYWx1ZSkuaW50VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIChpbnQpIChzdGFydEludCArIGZyYWN0aW9uICogKCgoTnVtYmVyKSBlbmRWYWx1ZSkuaW50VmFsdWUoKSAtIHN0YXJ0SW50KSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhNGYzYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZS5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgdGltZS92YWx1ZSBwYWlyIGZvciBhbiBhbmltYXRpb24uIFRoZSBLZXlmcmFtZSBjbGFzcyBpcyB1c2VkCisgKiBieSB7QGxpbmsgVmFsdWVBbmltYXRvcn0gdG8gZGVmaW5lIHRoZSB2YWx1ZXMgdGhhdCB0aGUgYW5pbWF0aW9uIHRhcmdldCB3aWxsIGhhdmUgb3ZlciB0aGUgY291cnNlCisgKiBvZiB0aGUgYW5pbWF0aW9uLiBBcyB0aGUgdGltZSBwcm9jZWVkcyBmcm9tIG9uZSBrZXlmcmFtZSB0byB0aGUgb3RoZXIsIHRoZSB2YWx1ZSBvZiB0aGUKKyAqIHRhcmdldCBvYmplY3Qgd2lsbCBhbmltYXRlIGJldHdlZW4gdGhlIHZhbHVlIGF0IHRoZSBwcmV2aW91cyBrZXlmcmFtZSBhbmQgdGhlIHZhbHVlIGF0IHRoZQorICogbmV4dCBrZXlmcmFtZS4gRWFjaCBrZXlmcmFtZSBhbHNvIGhvbGRzIGFuIG9wdGlvbmFsIHtAbGluayBUaW1lSW50ZXJwb2xhdG9yfQorICogb2JqZWN0LCB3aGljaCBkZWZpbmVzIHRoZSB0aW1lIGludGVycG9sYXRpb24gb3ZlciB0aGUgaW50ZXJ2YWx1ZSBwcmVjZWRpbmcgdGhlIGtleWZyYW1lLgorICovCitwdWJsaWMgY2xhc3MgS2V5ZnJhbWUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGF0IHdoaWNoIG1WYWx1ZSB3aWxsIGhvbGQgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1GcmFjdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uIGF0IHRoZSB0aW1lIG1GcmFjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBtVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgaW4gdGhpcyBLZXlmcmFtZS4gVGhpcyB0eXBlIGlzIGRldGVybWluZWQgYXQgY29uc3RydWN0aW9uIHRpbWUsCisgICAgICogYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBvYmplY3QgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgbVZhbHVlVHlwZTsKKworICAgIC8qKgorICAgICAqIFRoZSBvcHRpb25hbCB0aW1lIGludGVycG9sYXRvciBmb3IgdGhlIGludGVydmFsIHByZWNlZGluZyB0aGlzIGtleWZyYW1lLiBBIG51bGwgaW50ZXJwb2xhdG9yCisgICAgICogKHRoZSBkZWZhdWx0KSByZXN1bHRzIGluIGxpbmVhciBpbnRlcnBvbGF0aW9uIG92ZXIgdGhlIGludGVydmFsLgorICAgICAqLworICAgIHByaXZhdGUgVGltZUludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IsIGNhbGxlZCBmcm9tIHRoZSBwdWJsaWMgY29uc3RydWN0b3JzIHdpdGggdGhlIGFkZGl0aW9uYWwKKyAgICAgKiA8Y29kZT52YWx1ZVR5cGU8L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICogQHBhcmFtIHZhbHVlVHlwZSBUaGUgdHlwZSBvZiB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IG9iamVjdC4gVGhpcyBpcyB1c2VkIGJ5IHRoZQorICAgICAqIHtAbGluayAjZ2V0VmFsdWUoKX0gZnVuY3Rpb25tLCB3aGljaCBpcyBxdWVyaWVkIGJ5IHtAbGluayBWYWx1ZUFuaW1hdG9yfSB0byBkZXRlcm1pbmUKKyAgICAgKiB0aGUgdHlwZSBvZiB7QGxpbmsgVHlwZUV2YWx1YXRvcn0gdG8gdXNlIHRvIGludGVycG9sYXRlIGJldHdlZW4gdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCB2YWx1ZSwgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIG1GcmFjdGlvbiA9IGZyYWN0aW9uOworICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgbVZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLmdldENsYXNzKCkgOiBPYmplY3QuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgZmxvYXQgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIEZsb2F0IHZhbHVlKSB7CisgICAgICAgIHRoaXMoZnJhY3Rpb24sIHZhbHVlLCBGbG9hdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBpbnRlZ2VyIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgIHRoaXMoZnJhY3Rpb24sIHZhbHVlLCBJbnRlZ2VyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGRvdWJsZSB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgRG91YmxlIHZhbHVlKSB7CisgICAgICAgIHRoaXMoZnJhY3Rpb24sIHZhbHVlLCBEb3VibGUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgaW50ZWdlciB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgaW50IHZhbHVlKSB7CisgICAgICAgIHRoaXMoZnJhY3Rpb24sIHZhbHVlLCBpbnQuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgZmxvYXQgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHRoaXMoZnJhY3Rpb24sIHZhbHVlLCBmbG9hdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBkb3VibGUgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIGRvdWJsZSB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgZG91YmxlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIG1WYWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWUgZm9yIHRoaXMga2V5ZnJhbWUsIGFzIGEgZnJhY3Rpb24gb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24KKyAgICAgKiBkdXJhdGlvbi4gVGhpcyBzaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldEZyYWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbUZyYWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRpbWUgZm9yIHRoaXMga2V5ZnJhbWUsIGFzIGEgZnJhY3Rpb24gb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5ZnJhbWUsIGFzIGEgZnJhY3Rpb24gb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uCisgICAgICogZHVyYXRpb24uIFRoaXMgc2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyYWN0aW9uKGZsb2F0IGZyYWN0aW9uKSB7CisgICAgICAgIG1GcmFjdGlvbiA9IGZyYWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG9wdGlvbmFsIGludGVycG9sYXRvciBmb3IgdGhpcyBLZXlmcmFtZS4gQSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMKKyAgICAgKiB0aGF0IHRoZXJlIGlzIG5vIGludGVycG9sYXRpb24sIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGxpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBUaW1lSW50ZXJwb2xhdG9yIGdldEludGVycG9sYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLiBBIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcworICAgICAqIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJwb2xhdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgbGluZWFyIGludGVycG9sYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKFRpbWVJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yKSB7CisgICAgICAgIG1JbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHlwZSBvZiBrZXlmcmFtZS4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IFZhbHVlQW5pbWF0b3IgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mCisgICAgICoge0BsaW5rIFR5cGVFdmFsdWF0b3J9IHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHZhbHVlcyBiZXR3ZWVuIGtleWZyYW1lcy4gVGhlIHR5cGUgaXMgYmFzZWQKKyAgICAgKiBvbiB0aGUgdHlwZSBvZiBLZXlmcmFtZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZVR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEtleWZyYW1lIGNsb25lKCkgeworICAgICAgICBLZXlmcmFtZSBrZkNsb25lID0gbmV3IEtleWZyYW1lKG1GcmFjdGlvbiwgbVZhbHVlLCBtVmFsdWVUeXBlKTsKKyAgICAgICAga2ZDbG9uZS5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7CisgICAgICAgIHJldHVybiBrZkNsb25lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZVNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0YjFmYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZVNldC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgY29sbGVjdGlvbiBvZiBLZXlmcmFtZSBvYmplY3RzIGFuZCBpcyBjYWxsZWQgYnkgVmFsdWVBbmltYXRvciB0byBjYWxjdWxhdGUKKyAqIHZhbHVlcyBiZXR3ZWVuIHRob3NlIGtleWZyYW1lcyBmb3IgYSBnaXZlbiBhbmltYXRpb24uIFRoZSBjbGFzcyBpbnRlcm5hbCB0byB0aGUgYW5pbWF0aW9uCisgKiBwYWNrYWdlIGJlY2F1c2UgaXQgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIGhvdyBLZXlmcmFtZXMgYXJlIHN0b3JlZCBhbmQgdXNlZC4KKyAqLworY2xhc3MgS2V5ZnJhbWVTZXQgeworCisgICAgcHJpdmF0ZSBpbnQgbU51bUtleWZyYW1lczsKKworICAgIEFycmF5TGlzdDxLZXlmcmFtZT4gbUtleWZyYW1lczsKKworICAgIHB1YmxpYyBLZXlmcmFtZVNldChLZXlmcmFtZS4uLiBrZXlmcmFtZXMpIHsKKyAgICAgICAgbUtleWZyYW1lcyA9IG5ldyBBcnJheUxpc3Q8S2V5ZnJhbWU+KCk7CisgICAgICAgIGZvciAoS2V5ZnJhbWUga2V5ZnJhbWUgOiBrZXlmcmFtZXMpIHsKKyAgICAgICAgICAgIG1LZXlmcmFtZXMuYWRkKGtleWZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtTnVtS2V5ZnJhbWVzID0gbUtleWZyYW1lcy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYW5pbWF0ZWQgdmFsdWUsIGdpdmVuIHRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24gKGludGVycG9sYXRlZCBieSB0aGUKKyAgICAgKiBhbmltYXRpb24ncyBpbnRlcnBvbGF0b3IpIGFuZCB0aGUgZXZhbHVhdG9yIHVzZWQgdG8gY2FsY3VsYXRlIGluLWJldHdlZW4gdmFsdWVzLiBUaGlzCisgICAgICogZnVuY3Rpb24gbWFwcyB0aGUgaW5wdXQgZnJhY3Rpb24gdG8gdGhlIGFwcHJvcHJpYXRlIGtleWZyYW1lIGludGVydmFsIGFuZCBhIGZyYWN0aW9uCisgICAgICogYmV0d2VlbiB0aGVtIGFuZCByZXR1cm5zIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuIE5vdGUgdGhhdCB0aGUgaW5wdXQgZnJhY3Rpb24gbWF5IGZhbGwKKyAgICAgKiBvdXRzaWRlIHRoZSBbMC0xXSBib3VuZHMsIGlmIHRoZSBhbmltYXRpb24ncyBpbnRlcnBvbGF0b3IgbWFkZSB0aGF0IGhhcHBlbiAoZS5nLiwgYQorICAgICAqIHNwcmluZyBpbnRlcnBvbGF0aW9uIHRoYXQgbWlnaHQgc2VuZCB0aGUgZnJhY3Rpb24gcGFzdCAxLjApLiBXZSBoYW5kbGUgdGhpcyBzaXR1YXRpb24gYnkKKyAgICAgKiBqdXN0IHVzaW5nIHRoZSB0d28ga2V5ZnJhbWVzIGF0IHRoZSBhcHByb3ByaWF0ZSBlbmQgd2hlbiB0aGUgdmFsdWUgaXMgb3V0c2lkZSB0aG9zZSBib3VuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbgorICAgICAqIEBwYXJhbSBldmFsdWF0b3IgVGhlIHR5cGUgZXZhbHVhdG9yIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWVzLgorICAgICAqIEByZXR1cm4gVGhlIGFuaW1hdGVkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoZmxvYXQgZnJhY3Rpb24sIFR5cGVFdmFsdWF0b3IgZXZhbHVhdG9yKSB7CisgICAgICAgIC8vIFRPRE86IHNwZWNpYWwtY2FzZSAyLWtleWZyYW1lIGNvbW1vbiBjYXNlCisKKyAgICAgICAgaWYgKGZyYWN0aW9uIDw9IDBmKSB7CisgICAgICAgICAgICBmaW5hbCBLZXlmcmFtZSBwcmV2S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldCgwKTsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KDEpOworICAgICAgICAgICAgZmluYWwgVGltZUludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXh0S2V5ZnJhbWUuZ2V0SW50ZXJwb2xhdG9yKCk7CisgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0IGludGVydmFsRnJhY3Rpb24gPSAoZnJhY3Rpb24gLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgLworICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuZXZhbHVhdGUoaW50ZXJ2YWxGcmFjdGlvbiwgcHJldktleWZyYW1lLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIG5leHRLZXlmcmFtZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChmcmFjdGlvbiA+PSAxZikgeworICAgICAgICAgICAgZmluYWwgS2V5ZnJhbWUgcHJldktleWZyYW1lID0gbUtleWZyYW1lcy5nZXQobU51bUtleWZyYW1lcyAtIDIpOworICAgICAgICAgICAgZmluYWwgS2V5ZnJhbWUgbmV4dEtleWZyYW1lID0gbUtleWZyYW1lcy5nZXQobU51bUtleWZyYW1lcyAtIDEpOworICAgICAgICAgICAgZmluYWwgVGltZUludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXh0S2V5ZnJhbWUuZ2V0SW50ZXJwb2xhdG9yKCk7CisgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0IGludGVydmFsRnJhY3Rpb24gPSAoZnJhY3Rpb24gLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgLworICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuZXZhbHVhdGUoaW50ZXJ2YWxGcmFjdGlvbiwgcHJldktleWZyYW1lLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIG5leHRLZXlmcmFtZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZSBwcmV2S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGZyYWN0aW9uIDwgbmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUaW1lSW50ZXJwb2xhdG9yIGludGVycG9sYXRvciA9IG5leHRLZXlmcmFtZS5nZXRJbnRlcnBvbGF0b3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihmcmFjdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsb2F0IGludGVydmFsRnJhY3Rpb24gPSAoZnJhY3Rpb24gLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgLworICAgICAgICAgICAgICAgICAgICAobmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkgLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5ldmFsdWF0ZShpbnRlcnZhbEZyYWN0aW9uLCBwcmV2S2V5ZnJhbWUuZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRLZXlmcmFtZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZLZXlmcmFtZSA9IG5leHRLZXlmcmFtZTsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKKyAgICAgICAgcmV0dXJuIG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAxKS5nZXRWYWx1ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9MYXlvdXRUcmFuc2l0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vTGF5b3V0VHJhbnNpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWQ4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vTGF5b3V0VHJhbnNpdGlvbi5qYXZhCkBAIC0wLDAgKzEsODM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkRlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgZW5hYmxlcyBhdXRvbWF0aWMgYW5pbWF0aW9ucyBvbiBsYXlvdXQgY2hhbmdlcyBpbiBWaWV3R3JvdXAgb2JqZWN0cy4gVG8gZW5hYmxlCisgKiB0cmFuc2l0aW9ucyBmb3IgYSBsYXlvdXQgY29udGFpbmVyLCBjcmVhdGUgYSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCBhbmQgc2V0IGl0IG9uIGFueQorICogVmlld0dyb3VwIGJ5IGNhbGxpbmcge0BsaW5rIFZpZXdHcm91cCNzZXRMYXlvdXRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24pfS4gVGhpcyB3aWxsIGNhdXNlCisgKiBkZWZhdWx0IGFuaW1hdGlvbnMgdG8gcnVuIHdoZW5ldmVyIGl0ZW1zIGFyZSBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhhdCBjb250YWluZXIuIFRvIHNwZWNpZnkKKyAqIGN1c3RvbSBhbmltYXRpb25zLCB1c2UgdGhlIHtAbGluayBMYXlvdXRUcmFuc2l0aW9uI3NldEFuaW1hdG9yKGludCwgQW5pbWF0b3IpCisgKiBzZXRBbmltYXRvcigpfSBtZXRob2QuCisgKgorICogPHA+T25lIG9mIHRoZSBjb3JlIGNvbmNlcHRzIG9mIHRoZXNlIHRyYW5zaXRpb24gYW5pbWF0aW9ucyBpcyB0aGF0IHRoZXJlIGFyZSB0d28gY29yZQorICogY2hhbmdlcyB0aGF0IGNhdXNlIHRoZSB0cmFuc2l0aW9uIGFuZCBmb3VyIGRpZmZlcmVudCBhbmltYXRpb25zIHRoYXQgcnVuIGJlY2F1c2Ugb2YKKyAqIHRob3NlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHRoYXQgdHJpZ2dlciB0aGUgdHJhbnNpdGlvbiBhcmUgaXRlbXMgYmVpbmcgYWRkZWQgdG8gYSBjb250YWluZXIKKyAqIChyZWZlcnJlZCB0byBhcyBhbiAiYXBwZWFyaW5nIiB0cmFuc2l0aW9uKSBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIgKGFsc28ga25vd24gYXMKKyAqICJkaXNhcHBlYXJpbmciKS4gVGhlIGFuaW1hdGlvbnMgdGhhdCBydW4gZHVlIHRvIHRob3NlIGV2ZW50cyBhcmUgb25lIHRoYXQgYW5pbWF0ZXMKKyAqIGl0ZW1zIGJlaW5nIGFkZGVkLCBvbmUgdGhhdCBhbmltYXRlcyBpdGVtcyBiZWluZyByZW1vdmVkLCBhbmQgdHdvIHRoYXQgYW5pbWF0ZSB0aGUgb3RoZXIKKyAqIGl0ZW1zIGluIHRoZSBjb250YWluZXIgdGhhdCBjaGFuZ2UgZHVlIHRvIHRoZSBhZGQvcmVtb3ZlIG9jY3VycmVuY2UuIFVzZXJzIG9mCisgKiB0aGUgdHJhbnNpdGlvbiBtYXkgd2FudCBkaWZmZXJlbnQgYW5pbWF0aW9ucyBmb3IgdGhlIGNoYW5naW5nIGl0ZW1zIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgKiB0aGV5IGFyZSBjaGFuZ2luZyBkdWUgdG8gYW5hcHBlYXJpbmcgb3IgZGlzYXBwZWFyaW5nIGV2ZW50LCBzbyB0aGVyZSBpcyBvbmUgYW5pbWF0aW9uIGZvcgorICogZWFjaCBvZiB0aGVzZSB2YXJpYXRpb25zIG9mIHRoZSBjaGFuZ2luZyBldmVudC4gTW9zdCBvZiB0aGUgQVBJIG9mIHRoaXMgY2xhc3MgaXMgY29uY2VybmVkCisgKiB3aXRoIHNldHRpbmcgdXAgdGhlIGJhc2ljIHByb3BlcnRpZXMgb2YgdGhlIGFuaW1hdGlvbnMgdXNlZCBpbiB0aGVzZSBmb3VyIHNpdHVhdGlvbnMsCisgKiBvciB3aXRoIHNldHRpbmcgdXAgY3VzdG9tIGFuaW1hdGlvbnMgZm9yIGFueSBvciBhbGwgb2YgdGhlIGZvdXIuPC9wPgorICoKKyAqIDxwPlRoZSBhbmltYXRpb25zIHNwZWNpZmllZCBmb3IgdGhlIHRyYW5zaXRpb24sIGJvdGggdGhlIGRlZmF1bHRzIGFuZCBhbnkgY3VzdG9tIGFuaW1hdGlvbnMKKyAqIHNldCBvbiB0aGUgdHJhbnNpdGlvbiBvYmplY3QsIGFyZSB0ZW1wbGF0ZXMgb25seS4gVGhhdCBpcywgdGhlc2UgYW5pbWF0aW9ucyBleGlzdCB0byBob2xkIHRoZQorICogYmFzaWMgYW5pbWF0aW9uIHByb3BlcnRpZXMsIHN1Y2ggYXMgdGhlIGR1cmF0aW9uLCBzdGFydCBkZWxheSwgYW5kIHByb3BlcnRpZXMgYmVpbmcgYW5pbWF0ZWQuCisgKiBCdXQgdGhlIGFjdHVhbCB0YXJnZXQgb2JqZWN0LCBhcyB3ZWxsIGFzIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcyBmb3IgdGhvc2UgcHJvcGVydGllcywgYXJlCisgKiBzZXQgYXV0b21hdGljYWxseSBpbiB0aGUgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIHRoZSB0cmFuc2l0aW9uIGVhY2ggdGltZSBpdCBydW5zLiBFYWNoIG9mIHRoZQorICogYW5pbWF0aW9ucyBpcyBjbG9uZWQgZnJvbSB0aGUgb3JpZ2luYWwgY29weSBhbmQgdGhlIGNsb25lIGlzIHRoZW4gcG9wdWxhdGVkIHdpdGggdGhlIGR5bmFtaWMKKyAqIHZhbHVlcyBvZiB0aGUgdGFyZ2V0IGJlaW5nIGFuaW1hdGVkIChzdWNoIGFzIG9uZSBvZiB0aGUgaXRlbXMgaW4gYSBsYXlvdXQgY29udGFpbmVyIHRoYXQgaXMKKyAqIG1vdmluZyBhcyBhIHJlc3VsdCBvZiB0aGUgbGF5b3V0IGV2ZW50KSBhcyB3ZWxsIGFzIHRoZSB2YWx1ZXMgdGhhdCBhcmUgY2hhbmdpbmcgKHN1Y2ggYXMgdGhlCisgKiBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGF0IG9iamVjdCkuIFRoZSBhY3R1YWwgdmFsdWVzIHRoYXQgYXJlIHB1c2hlZCB0byBlYWNoIGFuaW1hdGlvbgorICogZGVwZW5kcyBvbiB3aGF0IHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBmb3IgdGhlIGFuaW1hdGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0CisgKiBDSEFOR0VfQVBQRUFSSU5HIGFuaW1hdGlvbiBhbmltYXRlcyA8Y29kZT5sZWZ0PC9jb2RlPiwgPGNvZGU+dG9wPC9jb2RlPiwgPGNvZGU+cmlnaHQ8L2NvZGU+LAorICogYW5kIDxjb2RlPmJvdHRvbTwvY29kZT4uIFZhbHVlcyBmb3IgdGhlc2UgcHJvcGVydGllcyBhcmUgdXBkYXRlZCB3aXRoIHRoZSBwcmUtIGFuZCBwb3N0LWxheW91dAorICogdmFsdWVzIHdoZW4gdGhlIHRyYW5zaXRpb24gYmVnaW5zLiBDdXN0b20gYW5pbWF0aW9ucyB3aWxsIGJlIHNpbWlsYXJseSBwb3B1bGF0ZWQgd2l0aAorICogdGhlIHRhcmdldCBhbmQgdmFsdWVzIGJlaW5nIGFuaW1hdGVkLCBhc3N1bWluZyB0aGV5IHVzZSBPYmplY3RBbmltYXRvciBvYmplY3RzIHdpdGgKKyAqIHByb3BlcnR5IG5hbWVzIHRoYXQgYXJlIGtub3duIG9uIHRoZSB0YXJnZXQgb2JqZWN0LjwvcD4KKyAqLworcHVibGljIGNsYXNzIExheW91dFRyYW5zaXRpb24geworCisgICAgLyoqCisgICAgICogQSBmbGFnIGluZGljYXRpbmcgdGhlIGFuaW1hdGlvbiB0aGF0IHJ1bnMgb24gdGhvc2UgaXRlbXMgdGhhdCBhcmUgY2hhbmdpbmcKKyAgICAgKiBkdWUgdG8gYSBuZXcgaXRlbSBhcHBlYXJpbmcgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfQVBQRUFSSU5HID0gMDsKKworICAgIC8qKgorICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIHRoZSBhbmltYXRpb24gdGhhdCBydW5zIG9uIHRob3NlIGl0ZW1zIHRoYXQgYXJlIGNoYW5naW5nCisgICAgICogZHVlIHRvIGEgbmV3IGl0ZW0gZGlzYXBwZWFyaW5nIGZyb20gdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfRElTQVBQRUFSSU5HID0gMTsKKworICAgIC8qKgorICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIHRoZSBhbmltYXRpb24gdGhhdCBydW5zIG9uIHRob3NlIGl0ZW1zIHRoYXQgYXJlIGNoYW5naW5nCisgICAgICogZHVlIHRvIGEgbmV3IGl0ZW0gYXBwZWFyaW5nIGluIHRoZSBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQRUFSSU5HID0gMjsKKworICAgIC8qKgorICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIHRoZSBhbmltYXRpb24gdGhhdCBydW5zIG9uIHRob3NlIGl0ZW1zIHRoYXQgYXJlIGNoYW5naW5nCisgICAgICogZHVlIHRvIGEgbmV3IGl0ZW0gYXBwZWFyaW5nIGluIHRoZSBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQVBQRUFSSU5HID0gMzsKKworICAgIC8qKgorICAgICAqIFRoZXNlIHZhcmlhYmxlcyBob2xkIHRoZSBhbmltYXRpb25zIHRoYXQgYXJlIGN1cnJlbnRseSB1c2VkIHRvIHJ1biB0aGUgdHJhbnNpdGlvbiBlZmZlY3RzLgorICAgICAqIFRoZXNlIGFuaW1hdGlvbnMgYXJlIHNldCB0byBkZWZhdWx0cywgYnV0IGNhbiBiZSBjaGFuZ2VkIHRvIGN1c3RvbSBhbmltYXRpb25zIGJ5CisgICAgICogY2FsbHMgdG8gc2V0QW5pbWF0b3IoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFuaW1hdG9yIG1EaXNhcHBlYXJpbmdBbmltID0gbnVsbDsKKyAgICBwcml2YXRlIEFuaW1hdG9yIG1BcHBlYXJpbmdBbmltID0gbnVsbDsKKyAgICBwcml2YXRlIEFuaW1hdG9yIG1DaGFuZ2luZ0FwcGVhcmluZ0FuaW0gPSBudWxsOworICAgIHByaXZhdGUgQW5pbWF0b3IgbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgYW5pbWF0aW9ucywgZGVmaW5lZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoYXQgd2lsbCBiZSB1c2VkCisgICAgICogdW5sZXNzIHRoZSB1c2VyIHNwZWNpZmllcyBjdXN0b20gYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RBbmltYXRvciBkZWZhdWx0Q2hhbmdlSW47CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0QW5pbWF0b3IgZGVmYXVsdENoYW5nZU91dDsKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RBbmltYXRvciBkZWZhdWx0RmFkZUluOworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdEFuaW1hdG9yIGRlZmF1bHRGYWRlT3V0OworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgZHVyYXRpb24gdXNlZCBieSBhbGwgYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIERFRkFVTFRfRFVSQVRJT04gPSAzMDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZHVyYXRpb25zIG9mIHRoZSBmb3VyIGRpZmZlcmVudCBhbmltYXRpb25zCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uID0gREVGQVVMVF9EVVJBVElPTjsKKyAgICBwcml2YXRlIGxvbmcgbUNoYW5naW5nRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBERUZBVUxUX0RVUkFUSU9OOworICAgIHByaXZhdGUgbG9uZyBtQXBwZWFyaW5nRHVyYXRpb24gPSBERUZBVUxUX0RVUkFUSU9OOworICAgIHByaXZhdGUgbG9uZyBtRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBERUZBVUxUX0RVUkFUSU9OOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXJ0IGRlbGF5cyBvZiB0aGUgZm91ciBkaWZmZXJlbnQgYW5pbWF0aW9ucy4gTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mCisgICAgICogdGhlIGFwcGVhcmluZyBpdGVtIGlzIHRoZSBkZWZhdWx0IGR1cmF0aW9uLCBzaW5jZSBpdCBzaG91bGQgd2FpdCBmb3IgdGhlIGl0ZW1zIHRvIG1vdmUKKyAgICAgKiBiZWZvcmUgZmFkaW5nIGl0LiBTYW1lIGZvciB0aGUgY2hhbmdpbmcgYW5pbWF0aW9uIHdoZW4gZGlzYXBwZWFyaW5nOyBpdCB3YWl0cyBmb3IgdGhlIGl0ZW0KKyAgICAgKiB0byBmYWRlIG91dCBiZWZvcmUgbW92aW5nIHRoZSBvdGhlciBpdGVtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbUFwcGVhcmluZ0RlbGF5ID0gREVGQVVMVF9EVVJBVElPTjsKKyAgICBwcml2YXRlIGxvbmcgbURpc2FwcGVhcmluZ0RlbGF5ID0gMDsKKyAgICBwcml2YXRlIGxvbmcgbUNoYW5naW5nQXBwZWFyaW5nRGVsYXkgPSAwOworICAgIHByaXZhdGUgbG9uZyBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEZWxheSA9IERFRkFVTFRfRFVSQVRJT047CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXItYW5pbWF0aW9uIGRlbGF5cyB1c2VkIG9uIHRoZSB0d28gY2hhbmdpbmcgYW5pbWF0aW9ucworICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtQ2hhbmdpbmdBcHBlYXJpbmdTdGFnZ2VyID0gMDsKKyAgICBwcml2YXRlIGxvbmcgbUNoYW5naW5nRGlzYXBwZWFyaW5nU3RhZ2dlciA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBpbnRlcnBvbGF0b3JzIHVzZWQgZm9yIHRoZSBhbmltYXRpb25zCisgICAgICovCisgICAgcHJpdmF0ZSBUaW1lSW50ZXJwb2xhdG9yIG1BcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBuZXcgQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKyAgICBwcml2YXRlIFRpbWVJbnRlcnBvbGF0b3IgbURpc2FwcGVhcmluZ0ludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworICAgIHByaXZhdGUgVGltZUludGVycG9sYXRvciBtQ2hhbmdpbmdBcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworICAgIHByaXZhdGUgVGltZUludGVycG9sYXRvciBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworCisgICAgLyoqCisgICAgICogVGhpcyBoYXNobWFwIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGFuaW1hdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IHJ1bm5pbmcgYXMgcGFydCBvZgorICAgICAqIHRoZSB0cmFuc2l0aW9uLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgYSBmdXJ0aGVyIGxheW91dCBldmVudCBzaG91bGQgY2F1c2UKKyAgICAgKiBleGlzdGluZyBhbmltYXRpb25zIHRvIHN0b3Agd2hlcmUgdGhleSBhcmUgcHJpb3IgdG8gc3RhcnRpbmcgbmV3IGFuaW1hdGlvbnMuIFNvCisgICAgICogd2UgY2FjaGUgYWxsIG9mIHRoZSBjdXJyZW50IGFuaW1hdGlvbnMgaW4gdGhpcyBtYXAgZm9yIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBvbgorICAgICAqIGFub3RoZXIgbGF5b3V0IGV2ZW50LgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcDxWaWV3LCBBbmltYXRvcj4gY3VycmVudEFuaW1hdGlvbnMgPSBuZXcgSGFzaE1hcDxWaWV3LCBBbmltYXRvcj4oKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaGFzaG1hcCBpcyB1c2VkIHRvIHRyYWNrIHRoZSBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGNoaWxkcmVuIG9mCisgICAgICogYSBjb250YWluZXIuIFdoZW4gYSBsYXlvdXQgY2hhbmdlIG9jY3VycywgYW4gYW5pbWF0aW9uIGlzIGNyZWF0ZWQgZm9yIGVhY2ggVmlldywgc28gdGhhdAorICAgICAqIHRoZSBwcmUtbGF5b3V0IHZhbHVlcyBjYW4gYmUgY2FjaGVkIGluIHRoYXQgYW5pbWF0aW9uLiBUaGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQgdG8gdGhlCisgICAgICogdmlldyB0byBzZWUgd2hldGhlciB0aGUgbGF5b3V0IGNoYW5nZXMgdGhlIGJvdW5kcyBvZiB0aGF0IHZpZXcuIElmIHNvLCB0aGUgYW5pbWF0aW9uCisgICAgICogaXMgc2V0IHdpdGggdGhlIGZpbmFsIHZhbHVlcyBhbmQgdGhlbiBydW4uIElmIG5vdCwgdGhlIGFuaW1hdGlvbiBpcyBub3Qgc3RhcnRlZC4gV2hlbgorICAgICAqIHRoZSBwcm9jZXNzIG9mIHNldHRpbmcgdXAgYW5kIHJ1bm5pbmcgYWxsIGFwcHJvcHJpYXRlIGFuaW1hdGlvbnMgaXMgZG9uZSwgd2UgbmVlZCB0bworICAgICAqIHJlbW92ZSB0aGVzZSBsaXN0ZW5lcnMgYW5kIGNsZWFyIG91dCB0aGUgbWFwLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcDxWaWV3LCBWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+IGxheW91dENoYW5nZUxpc3RlbmVyTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFZpZXcsIFZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4oKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdHJhY2sgdGhlIGN1cnJlbnQgZGVsYXkgYmVpbmcgYXNzaWduZWQgdG8gc3VjY2Vzc2l2ZSBhbmltYXRpb25zIGFzIHRoZXkgYXJlCisgICAgICogc3RhcnRlZC4gVGhpcyB2YWx1ZSBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBuZXcgYW5pbWF0aW9uLCB0aGVuIHplcm9lZCBiZWZvcmUgdGhlIG5leHQKKyAgICAgKiB0cmFuc2l0aW9uIGJlZ2lucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc3RhZ2dlckRlbGF5OworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBsaXN0ZW5lcnMgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiBBUFBFQVJJTkcvRElTQVBQRUFSSU5HIHRyYW5zaXRpb25zCisgICAgICogc3RhcnQgYW5kIGVuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxUcmFuc2l0aW9uTGlzdGVuZXI+IG1MaXN0ZW5lcnM7CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdC4gQnkgZGVmYXVsdCwgdGhlIG9iamVjdCB3aWxsIGxpc3RlbiB0byBsYXlvdXQKKyAgICAgKiBldmVudHMgb24gYW55IFZpZXdHcm91cCB0aGF0IGl0IGlzIHNldCBvbiBhbmQgd2lsbCBydW4gZGVmYXVsdCBhbmltYXRpb25zIGZvciBlYWNoCisgICAgICogdHlwZSBvZiBsYXlvdXQgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIExheW91dFRyYW5zaXRpb24oKSB7CisgICAgICAgIGlmIChkZWZhdWx0Q2hhbmdlSW4gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gImxlZnQiIGlzIGp1c3QgYSBwbGFjZWhvbGRlcjsgd2UnbGwgcHV0IHJlYWwgcHJvcGVydGllcy92YWx1ZXMgaW4gd2hlbiBuZWVkZWQKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEludGVnZXI+IHB2aExlZnQgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4oImxlZnQiLCAwLCAxKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEludGVnZXI+IHB2aFRvcCA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPigidG9wIiwgMCwgMSk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPiBwdmhSaWdodCA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPigicmlnaHQiLCAwLCAxKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEludGVnZXI+IHB2aEJvdHRvbSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPigiYm90dG9tIiwgMCwgMSk7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlSW4gPSBuZXcgT2JqZWN0QW5pbWF0b3I8UHJvcGVydHlWYWx1ZXNIb2xkZXI+KERFRkFVTFRfRFVSQVRJT04sIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIHB2aExlZnQsIHB2aFRvcCwgcHZoUmlnaHQsIHB2aEJvdHRvbSk7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlSW4uc2V0U3RhcnREZWxheShtQ2hhbmdpbmdBcHBlYXJpbmdEZWxheSk7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlSW4uc2V0SW50ZXJwb2xhdG9yKG1DaGFuZ2luZ0FwcGVhcmluZ0ludGVycG9sYXRvcik7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlT3V0ID0gZGVmYXVsdENoYW5nZUluLmNsb25lKCk7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlT3V0LnNldFN0YXJ0RGVsYXkobUNoYW5naW5nRGlzYXBwZWFyaW5nRGVsYXkpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZU91dC5zZXRJbnRlcnBvbGF0b3IobUNoYW5naW5nRGlzYXBwZWFyaW5nSW50ZXJwb2xhdG9yKTsKKyAgICAgICAgICAgIGRlZmF1bHRGYWRlSW4gPQorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+KERFRkFVTFRfRFVSQVRJT04sIHRoaXMsICJhbHBoYSIsIDBmLCAxZik7CisgICAgICAgICAgICBkZWZhdWx0RmFkZUluLnNldFN0YXJ0RGVsYXkobUFwcGVhcmluZ0RlbGF5KTsKKyAgICAgICAgICAgIGRlZmF1bHRGYWRlSW4uc2V0SW50ZXJwb2xhdG9yKG1BcHBlYXJpbmdJbnRlcnBvbGF0b3IpOworICAgICAgICAgICAgZGVmYXVsdEZhZGVPdXQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+KERFRkFVTFRfRFVSQVRJT04sIHRoaXMsICJhbHBoYSIsIDFmLCAwZik7CisgICAgICAgICAgICBkZWZhdWx0RmFkZU91dC5zZXRTdGFydERlbGF5KG1EaXNhcHBlYXJpbmdEZWxheSk7CisgICAgICAgICAgICBkZWZhdWx0RmFkZU91dC5zZXRJbnRlcnBvbGF0b3IobURpc2FwcGVhcmluZ0ludGVycG9sYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nQW5pbSA9IGRlZmF1bHRDaGFuZ2VJbjsKKyAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSA9IGRlZmF1bHRDaGFuZ2VPdXQ7CisgICAgICAgIG1BcHBlYXJpbmdBbmltID0gZGVmYXVsdEZhZGVJbjsKKyAgICAgICAgbURpc2FwcGVhcmluZ0FuaW0gPSBkZWZhdWx0RmFkZU91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkdXJhdGlvbiB0byBiZSB1c2VkIGJ5IGFsbCBhbmltYXRpb25zIG9mIHRoaXMgdHJhbnNpdGlvbiBvYmplY3QuIElmIHlvdSB3YW50IHRvCisgICAgICogc2V0IHRoZSBkdXJhdGlvbiBvZiBqdXN0IG9uZSBvZiB0aGUgYW5pbWF0aW9ucyBpbiBwYXJ0aWN1bGFyLCB1c2UgdGhlCisgICAgICoge0BsaW5rICNzZXREdXJhdGlvbihpbnQsIGxvbmcpfSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRoYXQgdGhlIHRyYW5zaXRpb24gYW5pbWF0aW9ucworICAgICAqIHNob3VsZCBsYXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgbUFwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIG1EaXNhcHBlYXJpbmdEdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN0YXJ0IGRlbGF5IG9uIG9uZSBvZiB0aGUgYW5pbWF0aW9uIG9iamVjdHMgdXNlZCBieSB0aGlzIHRyYW5zaXRpb24uIFRoZQorICAgICAqIDxjb2RlPnRyYW5zaXRpb25UeXBlPC9jb2RlPiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIHN0YXJ0IGRlbGF5CisgICAgICogaXMgYmVpbmcgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2Ugc3RhcnQKKyAgICAgKiBkZWxheSBpcyBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIGRlbGF5IFRoZSBsZW5ndGggb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKiBAc2VlIEFuaW1hdG9yI3NldFN0YXJ0RGVsYXkobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydERlbGF5KGludCB0cmFuc2l0aW9uVHlwZSwgbG9uZyBkZWxheSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nRGVsYXkgPSBkZWxheTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEZWxheSA9IGRlbGF5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUFwcGVhcmluZ0RlbGF5ID0gZGVsYXk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtRGlzYXBwZWFyaW5nRGVsYXkgPSBkZWxheTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHN0YXJ0IGRlbGF5IG9uIG9uZSBvZiB0aGUgYW5pbWF0aW9uIG9iamVjdHMgdXNlZCBieSB0aGlzIHRyYW5zaXRpb24uIFRoZQorICAgICAqIDxjb2RlPnRyYW5zaXRpb25UeXBlPC9jb2RlPiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIHN0YXJ0IGRlbGF5CisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBzdGFydAorICAgICAqIGRlbGF5IGlzIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gbG9uZyBUaGUgc3RhcnQgZGVsYXkgb2YgdGhlIHNwZWNpZmllZCBhbmltYXRpb24uCisgICAgICogQHNlZSBBbmltYXRvciNnZXRTdGFydERlbGF5KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydERlbGF5KGludCB0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbURpc2FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCByZWFjaCBoZXJlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGR1cmF0aW9uIG9uIG9uZSBvZiB0aGUgYW5pbWF0aW9uIG9iamVjdHMgdXNlZCBieSB0aGlzIHRyYW5zaXRpb24uIFRoZQorICAgICAqIDxjb2RlPnRyYW5zaXRpb25UeXBlPC9jb2RlPiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIGR1cmF0aW9uCisgICAgICogaXMgYmVpbmcgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0aGF0IHRoZSBzcGVjaWZpZWQgYW5pbWF0aW9uIHNob3VsZCBydW4uCisgICAgICogQHNlZSBBbmltYXRvciNzZXREdXJhdGlvbihsb25nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGludCB0cmFuc2l0aW9uVHlwZSwgbG9uZyBkdXJhdGlvbikgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUFwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGR1cmF0aW9uIG9uIG9uZSBvZiB0aGUgYW5pbWF0aW9uIG9iamVjdHMgdXNlZCBieSB0aGlzIHRyYW5zaXRpb24uIFRoZQorICAgICAqIDxjb2RlPnRyYW5zaXRpb25UeXBlPC9jb2RlPiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIGR1cmF0aW9uCisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZQorICAgICAqIGR1cmF0aW9uIGlzIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gbG9uZyBUaGUgZHVyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhbmltYXRpb24uCisgICAgICogQHNlZSBBbmltYXRvciNnZXREdXJhdGlvbigpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oaW50IHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgIGNhc2UgRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtRGlzYXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgIH0KKyAgICAgICAgLy8gc2hvdWxkbid0IHJlYWNoIGhlcmUKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRpbWUgdG8gZGVsYXkgYmV0d2VlbiBzdGFydGluZyBlYWNoIGFuaW1hdGlvbiBkdXJpbmcgb25lIG9mIHRoZQorICAgICAqIENIQU5HRSBhbmltYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIEEgdmFsdWUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSBvciBAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30uCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBiZWZvcmUgbGF1bmNoaW5nIHRoZSBuZXh0CisgICAgICogYW5pbWF0aW9uIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFnZ2VyKGludCB0cmFuc2l0aW9uVHlwZSwgbG9uZyBkdXJhdGlvbikgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nU3RhZ2dlciA9IGR1cmF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ1N0YWdnZXIgPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIG5vb3Agb3RoZXIgY2FzZXMKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRldHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRvIGRlbGF5IGJldHdlZW4gc3RhcnRpbmcgZWFjaCBhbmltYXRpb24gZHVyaW5nIG9uZSBvZiB0aGUKKyAgICAgKiBDSEFOR0UgYW5pbWF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBBIHZhbHVlIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30gb3IgQGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LgorICAgICAqIEByZXR1cm4gbG9uZyBUaGUgbGVuZ3RoIG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgYmVmb3JlIGxhdW5jaGluZyB0aGUgbmV4dAorICAgICAqIGFuaW1hdGlvbiBpbiB0aGUgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U3RhZ2dlcihpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdBcHBlYXJpbmdTdGFnZ2VyOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdTdGFnZ2VyOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCByZWFjaCBoZXJlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGludGVycG9sYXRvciBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBpbnRlcnBvbGF0b3IKKyAgICAgKiBpcyBiZWluZyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZQorICAgICAqIGR1cmF0aW9uIGlzIGJlaW5nIHNldC4KKyAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIFRoZSBpbnRlcnBvbGF0b3IgdGhhdCB0aGUgc3BlY2lmaWVkIGFuaW1hdGlvbiBzaG91bGQgdXNlLgorICAgICAqIEBzZWUgQW5pbWF0b3Ijc2V0SW50ZXJwb2xhdG9yKFRpbWVJbnRlcnBvbGF0b3IpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKGludCB0cmFuc2l0aW9uVHlwZSwgVGltZUludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0ludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbURpc2FwcGVhcmluZ0ludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGludGVycG9sYXRvciBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBpbnRlcnBvbGF0b3IKKyAgICAgKiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBvbmUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSwge0BsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfSwKKyAgICAgKiB7QGxpbmsgI0FQUEVBUklOR30sIG9yIHtAbGluayAjRElTQVBQRUFSSU5HfSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlCisgICAgICogZHVyYXRpb24gaXMgYmVpbmcgc2V0LgorICAgICAqIEByZXR1cm4gVGltZUludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHRoYXQgdGhlIHNwZWNpZmllZCBhbmltYXRpb24gdXNlcy4KKyAgICAgKiBAc2VlIEFuaW1hdG9yI3NldEludGVycG9sYXRvcihUaW1lSW50ZXJwb2xhdG9yKQorICAgICAqLworICAgIHB1YmxpYyBUaW1lSW50ZXJwb2xhdG9yIGdldEludGVycG9sYXRvcihpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdBcHBlYXJpbmdJbnRlcnBvbGF0b3I7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0ludGVycG9sYXRvcjsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQXBwZWFyaW5nSW50ZXJwb2xhdG9yOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3I7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2hvdWxkbid0IHJlYWNoIGhlcmUKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYW5pbWF0aW9uIHVzZWQgZHVyaW5nIG9uZSBvZiB0aGUgdHJhbnNpdGlvbiB0eXBlcyB0aGF0IG1heSBydW4uIEFueQorICAgICAqIEFuaW1hdG9yIG9iamVjdCBjYW4gYmUgdXNlZCwgYnV0IHRvIGJlIG1vc3QgdXNlZnVsIGluIHRoZSBjb250ZXh0IG9mIGxheW91dAorICAgICAqIHRyYW5zaXRpb25zLCB0aGUgYW5pbWF0aW9uIHNob3VsZCBlaXRoZXIgYmUgYSBPYmplY3RBbmltYXRvciBvciBhIEFuaW1hdG9yU2V0CisgICAgICogb2YgYW5pbWF0aW9ucyBpbmNsdWRpbmcgUHJvcGVydHlBbmltYXRvcnMuIEFsc28sIHRoZXNlIE9iamVjdEFuaW1hdG9yIG9iamVjdHMKKyAgICAgKiBzaG91bGQgYmUgYWJsZSB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb24gdGhlaXIgdGFyZ2V0IG9iamVjdHMgYXV0b21hdGljYWxseS4gRm9yCisgICAgICogZXhhbXBsZSwgYSBPYmplY3RBbmltYXRvciB0aGF0IGFuaW1hdGVzIHRoZSBwcm9wZXJ0eSAibGVmdCIgaXMgYWJsZSB0byBzZXQgYW5kIGdldCB0aGUKKyAgICAgKiA8Y29kZT5sZWZ0PC9jb2RlPiBwcm9wZXJ0eSBmcm9tIHRoZSBWaWV3IG9iamVjdHMgYmVpbmcgYW5pbWF0ZWQgYnkgdGhlIGxheW91dAorICAgICAqIHRyYW5zaXRpb24uIFRoZSB0cmFuc2l0aW9uIHdvcmtzIGJ5IHNldHRpbmcgdGFyZ2V0IG9iamVjdHMgYW5kIHByb3BlcnRpZXMKKyAgICAgKiBkeW5hbWljYWxseSwgYWNjb3JkaW5nIHRvIHRoZSBwcmUtIGFuZCBwb3N0LWxheW9vdXQgdmFsdWVzIG9mIHRob3NlIG9iamVjdHMsIHNvCisgICAgICogaGF2aW5nIGFuaW1hdGlvbnMgdGhhdCBjYW4gaGFuZGxlIHRob3NlIHByb3BlcnRpZXMgYXBwcm9wcmlhdGVseSB3aWxsIHdvcmsgYmVzdAorICAgICAqIGZvciBjdXN0b20gYW5pbWF0aW9uLiBUaGUgZHluYW1pYyBzZXR0aW5nIG9mIHZhbHVlcyBpcyBvbmx5IHRoZSBjYXNlIGZvciB0aGUKKyAgICAgKiBDSEFOR0UgYW5pbWF0aW9uczsgdGhlIEFQUEVBUklORyBhbmQgRElTQVBQRUFSSU5HIGFuaW1hdGlvbnMgYXJlIHNpbXBseSBydW4gd2l0aAorICAgICAqIHRoZSB2YWx1ZXMgdGhleSBoYXZlLgorICAgICAqCisgICAgICogPHA+SXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCBhbnkgYW5kIGFsbCBhbmltYXRpb25zIChhbmQgdGhlaXIgdW5kZXJseWluZworICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMpIHdpbGwgaGF2ZSB0aGVpciBzdGFydCBhbmQgZW5kIHZhbHVlcyBzZXQgYWNjb3JkaW5nCisgICAgICogdG8gdGhlIHByZS0gYW5kIHBvc3QtbGF5b3V0IHZhbHVlcy4gU28sIGZvciBleGFtcGxlLCBhIGN1c3RvbSBhbmltYXRpb24gb24gImFscGhhIgorICAgICAqIGFzIHRoZSBDSEFOR0VfQVBQRUFSSU5HIGFuaW1hdGlvbiB3aWxsIGluaGVyaXQgdGhlIHJlYWwgdmFsdWUgb2YgYWxwaGEgb24gdGhlIHRhcmdldAorICAgICAqIG9iamVjdCAocHJlc3VtYWJseSAxKSBhcyBpdHMgc3RhcnRpbmcgYW5kIGVuZGluZyB2YWx1ZSB3aGVuIHRoZSBhbmltYXRpb24gYmVnaW5zLgorICAgICAqIEFuaW1hdGlvbnMgd2hpY2ggbmVlZCB0byB1c2UgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCB0aGF0IG1heSBub3QgbWF0Y2ggdGhlCisgICAgICogdmFsdWVzIHF1ZXJpZWQgd2hlbiB0aGUgdHJhbnNpdGlvbiBiZWdpbnMgbWF5IG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50IG1lY2hhbmlzbQorICAgICAqIHRoYW4gYSBzdGFuZGFyZCBPYmplY3RBbmltYXRvciBvYmplY3QuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIGFuaW1hdG9yIFRoZSBhbmltYXRpb24gYmVpbmcgYXNzaWduZWQuIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgdGhhdCBubworICAgICAqIGFuaW1hdGlvbiB3aWxsIGJlIHJ1biBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2l0aW9uVHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRvcihpbnQgdHJhbnNpdGlvblR5cGUsIEFuaW1hdG9yIGFuaW1hdG9yKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdBcHBlYXJpbmdBbmltID0gYW5pbWF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSA9IGFuaW1hdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUFwcGVhcmluZ0FuaW0gPSBhbmltYXRvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1EaXNhcHBlYXJpbmdBbmltID0gYW5pbWF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbmltYXRpb24gdXNlZCBkdXJpbmcgb25lIG9mIHRoZSB0cmFuc2l0aW9uIHR5cGVzIHRoYXQgbWF5IHJ1bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBvbmUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSwge0BsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfSwKKyAgICAgKiB7QGxpbmsgI0FQUEVBUklOR30sIG9yIHtAbGluayAjRElTQVBQRUFSSU5HfSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlCisgICAgICogZHVyYXRpb24gaXMgYmVpbmcgc2V0LgorICAgICAqIEByZXR1cm4gQW5pbWF0b3IgVGhlIGFuaW1hdGlvbiBiZWluZyB1c2VkIGZvciB0aGUgZ2l2ZW4gdHJhbnNpdGlvbiB0eXBlLgorICAgICAqIEBzZWUgI3NldEFuaW1hdG9yKGludCwgQW5pbWF0b3IpCisgICAgICovCisgICAgcHVibGljIEFuaW1hdG9yIGdldEFuaW1hdG9yKGludCB0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0FwcGVhcmluZ0FuaW07CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW07CisgICAgICAgICAgICBjYXNlIEFQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGVhcmluZ0FuaW07CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbURpc2FwcGVhcmluZ0FuaW07CisgICAgICAgIH0KKyAgICAgICAgLy8gc2hvdWxkbid0IHJlYWNoIGhlcmUKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHJ1bnMgYW5pbWF0aW9ucyBvbiBhbGwgb2YgdGhlIHZpZXdzIHRoYXQgY2hhbmdlIGR1cmluZyBsYXlvdXQuCisgICAgICogRm9yIGV2ZXJ5IGNoaWxkIGluIHRoZSBwYXJlbnQsIHdlIGNyZWF0ZSBhIGNoYW5nZSBhbmltYXRpb24gb2YgdGhlIGFwcHJvcHJpYXRlCisgICAgICogdHlwZSAoYXBwZWFyaW5nIG9yIGRpc2FwcGVhcmluZykgYW5kIGFzayBpdCB0byBwb3B1bGF0ZSBpdHMgc3RhcnQgdmFsdWVzIGZyb20gaXRzCisgICAgICogdGFyZ2V0IHZpZXcuIFdlIGFkZCBsYXlvdXQgbGlzdGVuZXJzIHRvIGFsbCBjaGlsZCB2aWV3cyBhbmQgbGlzdGVuIGZvciBjaGFuZ2VzLiBGb3IKKyAgICAgKiB0aG9zZSB2aWV3cyB0aGF0IGNoYW5nZSwgd2UgcG9wdWxhdGUgdGhlIGVuZCB2YWx1ZXMgZm9yIHRob3NlIGFuaW1hdGlvbnMgYW5kIHN0YXJ0IHRoZW0uCisgICAgICogQW5pbWF0aW9ucyBhcmUgbm90IHJ1biBvbiB1bmNoYW5naW5nIHZpZXdzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgY29udGFpbmVyIHdoaWNoIGlzIHVuZGVyZ29pbmcgYW4gYXBwZWFyaW5nIG9yIGRpc2FwcGVhcmluZyBjaGFuZ2UuCisgICAgICogQHBhcmFtIG5ld1ZpZXcgVGhlIHZpZXcgYmVpbmcgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnQuCisgICAgICogQHBhcmFtIGNoYW5nZVJlYXNvbiBBIHZhbHVlIG9mIEFQUEVBUklORyBvciBESVNBUFBFQVJJTkcsIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAgICAgKiB0cmFuc2l0aW9uIGlzIG9jY3VyaW5nIGJlY2F1c2UgYW4gaXRlbSBpcyBiZWluZyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlIHBhcmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcnVuQ2hhbmdlVHJhbnNpdGlvbihmaW5hbCBWaWV3R3JvdXAgcGFyZW50LCBWaWV3IG5ld1ZpZXcsIGZpbmFsIGludCBjaGFuZ2VSZWFzb24pIHsKKworICAgICAgICBBbmltYXRvciBiYXNlQW5pbWF0b3IgPSAoY2hhbmdlUmVhc29uID09IEFQUEVBUklORykgPworICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0FuaW0gOiBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltOworICAgICAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGlzIG51bGwsIHRoZXJlJ3Mgbm90aGluZyB0byBkbworICAgICAgICBpZiAoYmFzZUFuaW1hdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc2V0IHRoZSBpbnRlci1hbmltYXRpb24gZGVsYXksIGluIGNhc2Ugd2UgdXNlIGl0IGxhdGVyCisgICAgICAgIHN0YWdnZXJEZWxheSA9IDA7CisKKyAgICAgICAgZmluYWwgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IHBhcmVudC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7IC8vIHVzZWQgZm9yIGxhdGVyIGNsZWFudXAKKyAgICAgICAgaWYgKCFvYnNlcnZlci5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBvYnNlcnZlcidzIG5vdCBpbiBhIGdvb2Qgc3RhdGUsIHNraXAgdGhlIHRyYW5zaXRpb24KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgbnVtQ2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47ICsraSkgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IHBhcmVudC5nZXRDaGlsZEF0KGkpOworCisgICAgICAgICAgICAvLyBvbmx5IGFuaW1hdGUgdGhlIHZpZXdzIG5vdCBiZWluZyBhZGRlZCBvciByZW1vdmVkCisgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbmV3VmlldykgeworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBhbmltYXRpb24gcnVubmluZyBvbiB0aGlzIHZpZXcgYWxyZWFkeSwgY2FuY2VsIGl0CisgICAgICAgICAgICAgICAgQW5pbWF0b3IgY3VycmVudEFuaW1hdGlvbiA9IGN1cnJlbnRBbmltYXRpb25zLmdldChjaGlsZCk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBbmltYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9uLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9ucy5yZW1vdmUoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBhcHByb3ByaWF0ZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICBmaW5hbCBBbmltYXRvciBhbmltID0gYmFzZUFuaW1hdG9yLmNsb25lKCk7CisKKyAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgYW5pbWF0aW9uIGluIGNhc2Ugd2UgbmVlZCB0byBjYW5jZWwgaXQgbGF0ZXIKKyAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9ucy5wdXQoY2hpbGQsIGFuaW0pOworCisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB0YXJnZXQgb2JqZWN0IGZvciB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgYW5pbS5zZXRUYXJnZXQoY2hpbGQpOworCisgICAgICAgICAgICAgICAgLy8gQSBPYmplY3RBbmltYXRvciAob3IgQW5pbWF0b3JTZXQgb2YgdGhlbSkgY2FuIGV4dHJhY3Qgc3RhcnQgdmFsdWVzIGZyb20KKyAgICAgICAgICAgICAgICAvLyBpdHMgdGFyZ2V0IG9iamVjdAorICAgICAgICAgICAgICAgIGFuaW0uc2V0dXBTdGFydFZhbHVlcygpOworCisgICAgICAgICAgICAgICAgLy8gQWRkIGEgbGlzdGVuZXIgdG8gdHJhY2sgbGF5b3V0IGNoYW5nZXMgb24gdGhpcyB2aWV3LiBJZiB3ZSBkb24ndCBnZXQgYSBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBhbmltYXRlLgorICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0Q2hhbmdlKFZpZXcgdiwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2xkTGVmdCwgaW50IG9sZFRvcCwgaW50IG9sZFJpZ2h0LCBpbnQgb2xkQm90dG9tKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlbGwgdGhlIGFuaW1hdGlvbiB0byBleHRyYWN0IGVuZCB2YWx1ZXMgZnJvbSB0aGUgY2hhbmdlZCBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc2V0dXBFbmRWYWx1ZXMoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzdGFydERlbGF5OworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VSZWFzb24gPT0gQVBQRUFSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREZWxheSA9IG1DaGFuZ2luZ0FwcGVhcmluZ0RlbGF5ICsgc3RhZ2dlckRlbGF5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdnZXJEZWxheSArPSBtQ2hhbmdpbmdBcHBlYXJpbmdTdGFnZ2VyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGVsYXkgPSBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEZWxheSArIHN0YWdnZXJEZWxheTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZ2VyRGVsYXkgKz0gbUNoYW5naW5nRGlzYXBwZWFyaW5nU3RhZ2dlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zZXRTdGFydERlbGF5KHN0YXJ0RGVsYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbihkdXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgT2JqZWN0QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5zZXRDdXJyZW50UGxheVRpbWUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb25seSByZW1vdmVzIGxpc3RlbmVycyB3aG9zZSB2aWV3cyBjaGFuZ2VkIC0gbXVzdCBjbGVhciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIGxpc3RlbmVycyBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dENoYW5nZUxpc3RlbmVyTWFwLnJlbW92ZShjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGZyb20gdGhlIGNhY2hlIHdoZW4gaXQgZW5kcworICAgICAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2FuY2VsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlbW92ZSBjYW5jZWxlZCBhbmltYXRpb25zIGltbWVkaWF0ZWx5LCBub3QgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRDaGFuZ2VMaXN0ZW5lck1hcC5yZW1vdmUoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEFuaW1hdGlvbnMucmVtb3ZlKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgY2hpbGQuYWRkT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgLy8gY2FjaGUgdGhlIGxpc3RlbmVyIGZvciBsYXRlciByZW1vdmFsCisgICAgICAgICAgICAgICAgbGF5b3V0Q2hhbmdlTGlzdGVuZXJNYXAucHV0KGNoaWxkLCBsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2xlYW51cCBzdGVwLiBXaGVuIHdlIGdldCB0aGlzIHJlbmRlcmluZyBldmVudCwgd2Uga25vdyB0aGF0IGFsbCBvZgorICAgICAgICAvLyB0aGUgYXBwcm9wcmlhdGUgYW5pbWF0aW9ucyBoYXZlIGJlZW4gc2V0IHVwIGFuZCBydW4uIE5vdyB3ZSBjYW4gY2xlYXIgb3V0IHRoZQorICAgICAgICAvLyBsYXlvdXQgbGlzdGVuZXJzLgorICAgICAgICBvYnNlcnZlci5hZGRPblByZURyYXdMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5PblByZURyYXdMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlRHJhdygpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZU9uUHJlRHJhd0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGludCBudW1DaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBwYXJlbnQuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcihsYXlvdXRDaGFuZ2VMaXN0ZW5lck1hcC5nZXQoY2hpbGQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGF5b3V0Q2hhbmdlTGlzdGVuZXJNYXAuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcnVucyB0aGUgYW5pbWF0aW9uIHRoYXQgbWFrZXMgYW4gYWRkZWQgaXRlbSBhcHBlYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBWaWV3R3JvdXAgdG8gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgYWRkZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIGFkZGVkIHRvIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkFwcGVhcmluZ1RyYW5zaXRpb24oZmluYWwgVmlld0dyb3VwIHBhcmVudCwgZmluYWwgVmlldyBjaGlsZCkgeworICAgICAgICBpZiAobUFwcGVhcmluZ0FuaW0gPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoVHJhbnNpdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5lbmRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24udGhpcywgcGFyZW50LCBjaGlsZCwgQVBQRUFSSU5HKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQW5pbWF0b3IgYW5pbSA9IG1BcHBlYXJpbmdBbmltLmNsb25lKCk7CisgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGNoaWxkKTsKKyAgICAgICAgYW5pbS5zZXRTdGFydERlbGF5KG1BcHBlYXJpbmdEZWxheSk7CisgICAgICAgIGFuaW0uc2V0RHVyYXRpb24obUFwcGVhcmluZ0R1cmF0aW9uKTsKKyAgICAgICAgaWYgKGFuaW0gaW5zdGFuY2VvZiBPYmplY3RBbmltYXRvcikgeworICAgICAgICAgICAgKChPYmplY3RBbmltYXRvcikgYW5pbSkuc2V0Q3VycmVudFBsYXlUaW1lKDApOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVuZFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbi50aGlzLCBwYXJlbnQsIGNoaWxkLCBBUFBFQVJJTkcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgYW5pbS5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJ1bnMgdGhlIGFuaW1hdGlvbiB0aGF0IG1ha2VzIGEgcmVtb3ZlZCBpdGVtIGRpc2FwcGVhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIFZpZXdHcm91cCBmcm9tIHdoaWNoIHRoZSBWaWV3IGlzIGJlaW5nIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgVmlld0dyb3VwLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBydW5EaXNhcHBlYXJpbmdUcmFuc2l0aW9uKGZpbmFsIFZpZXdHcm91cCBwYXJlbnQsIGZpbmFsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgaWYgKG1EaXNhcHBlYXJpbmdBbmltID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZW5kVHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uLnRoaXMsIHBhcmVudCwgY2hpbGQsIERJU0FQUEVBUklORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBtRGlzYXBwZWFyaW5nQW5pbS5jbG9uZSgpOworICAgICAgICBhbmltLnNldFN0YXJ0RGVsYXkobURpc2FwcGVhcmluZ0RlbGF5KTsKKyAgICAgICAgYW5pbS5zZXREdXJhdGlvbihtRGlzYXBwZWFyaW5nRHVyYXRpb24pOworICAgICAgICBhbmltLnNldFRhcmdldChjaGlsZCk7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChUcmFuc2l0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5lbmRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24udGhpcywgcGFyZW50LCBjaGlsZCwgRElTQVBQRUFSSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgT2JqZWN0QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLnNldEN1cnJlbnRQbGF5VGltZSgwKTsKKyAgICAgICAgfQorICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFZpZXdHcm91cCB3aGVuIGEgY2hpbGQgdmlldyBpcyBhYm91dCB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiBjb250YWluZXIuIFRoaXMgY2FsbGJhY2sgc3RhcnRzIHRoZSBwcm9jZXNzIG9mIGEgdHJhbnNpdGlvbjsgd2UgZ3JhYiB0aGUgc3RhcnRpbmcKKyAgICAgKiB2YWx1ZXMsIGxpc3RlbiBmb3IgY2hhbmdlcyB0byBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoZSBjb250YWluZXIsIGFuZCBzdGFydCBhcHByb3ByaWF0ZQorICAgICAqIGFuaW1hdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBWaWV3R3JvdXAgdG8gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgYWRkZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIGFkZGVkIHRvIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoVmlld0dyb3VwIHBhcmVudCwgVmlldyBjaGlsZCkgeworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5zdGFydFRyYW5zaXRpb24odGhpcywgcGFyZW50LCBjaGlsZCwgQVBQRUFSSU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBydW5DaGFuZ2VUcmFuc2l0aW9uKHBhcmVudCwgY2hpbGQsIEFQUEVBUklORyk7CisgICAgICAgIHJ1bkFwcGVhcmluZ1RyYW5zaXRpb24ocGFyZW50LCBjaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFZpZXdHcm91cCB3aGVuIGEgY2hpbGQgdmlldyBpcyBhYm91dCB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiBjb250YWluZXIuIFRoaXMgY2FsbGJhY2sgc3RhcnRzIHRoZSBwcm9jZXNzIG9mIGEgdHJhbnNpdGlvbjsgd2UgZ3JhYiB0aGUgc3RhcnRpbmcKKyAgICAgKiB2YWx1ZXMsIGxpc3RlbiBmb3IgY2hhbmdlcyB0byBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoZSBjb250YWluZXIsIGFuZCBzdGFydCBhcHByb3ByaWF0ZQorICAgICAqIGFuaW1hdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBWaWV3R3JvdXAgdG8gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgYWRkZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIGFkZGVkIHRvIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd0NoaWxkKFZpZXdHcm91cCBwYXJlbnQsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgYWRkQ2hpbGQocGFyZW50LCBjaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFZpZXdHcm91cCB3aGVuIGEgY2hpbGQgdmlldyBpcyBhYm91dCB0byBiZSByZW1vdmVkIGZyb20gdGhlCisgICAgICogY29udGFpbmVyLiBUaGlzIGNhbGxiYWNrIHN0YXJ0cyB0aGUgcHJvY2VzcyBvZiBhIHRyYW5zaXRpb247IHdlIGdyYWIgdGhlIHN0YXJ0aW5nCisgICAgICogdmFsdWVzLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyLCBhbmQgc3RhcnQgYXBwcm9wcmlhdGUKKyAgICAgKiBhbmltYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgVmlld0dyb3VwIGZyb20gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIFZpZXcgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVmlld0dyb3VwIHBhcmVudCwgVmlldyBjaGlsZCkgeworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5zdGFydFRyYW5zaXRpb24odGhpcywgcGFyZW50LCBjaGlsZCwgRElTQVBQRUFSSU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBydW5DaGFuZ2VUcmFuc2l0aW9uKHBhcmVudCwgY2hpbGQsIERJU0FQUEVBUklORyk7CisgICAgICAgIHJ1bkRpc2FwcGVhcmluZ1RyYW5zaXRpb24ocGFyZW50LCBjaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFZpZXdHcm91cCB3aGVuIGEgY2hpbGQgdmlldyBpcyBhYm91dCB0byBiZSByZW1vdmVkIGZyb20gdGhlCisgICAgICogY29udGFpbmVyLiBUaGlzIGNhbGxiYWNrIHN0YXJ0cyB0aGUgcHJvY2VzcyBvZiBhIHRyYW5zaXRpb247IHdlIGdyYWIgdGhlIHN0YXJ0aW5nCisgICAgICogdmFsdWVzLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyLCBhbmQgc3RhcnQgYXBwcm9wcmlhdGUKKyAgICAgKiBhbmltYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgVmlld0dyb3VwIGZyb20gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIFZpZXcgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGlkZUNoaWxkKFZpZXdHcm91cCBwYXJlbnQsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgcmVtb3ZlQ2hpbGQocGFyZW50LCBjaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBib3VuZHMgb2YgdGhlIHZpZXcgY2hhbmdlIGR1ZSB0bworICAgICAqIGxheW91dCBwcm9jZXNzaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gbGF5b3V0IGJvdW5kcyBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVHJhbnNpdGlvbkxpc3RlbmVyKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxUcmFuc2l0aW9uTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpc3RlbmVyIGZvciBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZm9yIGxheW91dCBib3VuZHMgY2hhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRyYW5zaXRpb25MaXN0ZW5lcihUcmFuc2l0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpc3Qgb2YgbGlzdGVuZXJzIGZvciBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJhbnNpdGlvbkxpc3RlbmVyPiBnZXRUcmFuc2l0aW9uTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbUxpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGZvciBsaXN0ZW5pbmcgdG8gc3RhcnRpbmcgYW5kIGVuZGluZyBldmVudHMgZm9yIHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgVHJhbnNpdGlvbkxpc3RlbmVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBldmVudCBpcyBzZW50IHRvIGxpc3RlbmVycyB3aGVuIGFuIEFQUEVBUklORyBvciBESVNBUFBFQVJJTkcgdHJhbnNpdGlvbgorICAgICAgICAgKiBiZWdpbnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSBMYXlvdXRUcmFuc2l0aW9uIHNlbmRpbmcgb3V0IHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgVmlld0dyb3VwIG9uIHdoaWNoIHRoZSB0cmFuc2l0aW9uIGlzIHBsYXlpbmcuCisgICAgICAgICAqIEBwYXJhbSB2aWV3IFRoZSBWaWV3IG9iamVjdCBiZWluZyBhZGRlZCBvciByZW1vdmVkIGZyb20gaXRzIHBhcmVudC4KKyAgICAgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIFRoZSB0eXBlIG9mIHRyYW5zaXRpb24gdGhhdCBpcyBiZWdpbm5pbmcsIGVpdGhlcgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiNBUFBFQVJJTkd9IG9yCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uI0RJU0FQUEVBUklOR30uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIFZpZXcgdmlldywgaW50IHRyYW5zaXRpb25UeXBlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBldmVudCBpcyBzZW50IHRvIGxpc3RlbmVycyB3aGVuIGFuIEFQUEVBUklORyBvciBESVNBUFBFQVJJTkcgdHJhbnNpdGlvbiBlbmRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbiBUaGUgTGF5b3V0VHJhbnNpdGlvbiBzZW5kaW5nIG91dCB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSBjb250YWluZXIgVGhlIFZpZXdHcm91cCBvbiB3aGljaCB0aGUgdHJhbnNpdGlvbiBpcyBwbGF5aW5nLgorICAgICAgICAgKiBAcGFyYW0gdmlldyBUaGUgVmlldyBvYmplY3QgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQuCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBUaGUgdHlwZSBvZiB0cmFuc2l0aW9uIHRoYXQgaXMgZW5kaW5nLCBlaXRoZXIKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24jQVBQRUFSSU5HfSBvcgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiNESVNBUFBFQVJJTkd9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24sIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgdHJhbnNpdGlvblR5cGUpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9PYmplY3RBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL09iamVjdEFuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkZGIwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9PYmplY3RBbmltYXRvci5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogVGhpcyBzdWJjbGFzcyBvZiB7QGxpbmsgVmFsdWVBbmltYXRvcn0gcHJvdmlkZXMgc3VwcG9ydCBmb3IgYW5pbWF0aW5nIHByb3BlcnRpZXMgb24gdGFyZ2V0IG9iamVjdHMuCisgKiBUaGUgY29uc3RydWN0b3JzIG9mIHRoaXMgY2xhc3MgdGFrZSBwYXJhbWV0ZXJzIHRvIGRlZmluZSB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQKKyAqIGFzIHdlbGwgYXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhbmltYXRlZC4gQXBwcm9wcmlhdGUgc2V0L2dldCBmdW5jdGlvbnMKKyAqIGFyZSB0aGVuIGRldGVybWluZWQgaW50ZXJuYWxseSBhbmQgdGhlIGFuaW1hdGlvbiB3aWxsIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGFzIG5lY2Vzc2FyeSB0bworICogYW5pbWF0ZSB0aGUgcHJvcGVydHkuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RBbmltYXRvcjxUPiBleHRlbmRzIFZhbHVlQW5pbWF0b3I8VD4geworCisgICAgLy8gVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIHByb3BlcnR5IGV4aXN0cywgc2V0IGluIHRoZSBjb25zdHJ1Y3RvcgorICAgIHByaXZhdGUgT2JqZWN0IG1UYXJnZXQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBtUHJvcGVydHlOYW1lOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHNldHRlciBmdW5jdGlvbiBkZXJpdmVkIGZyb20gdGhpcyBwcm9wZXJ0eSBuYW1lCisgICAgICogbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHRoaXMgT2JqZWN0QW5pbWF0b3IgaGFzIGJlZW4gc2V0IHVwIHRvIGFuaW1hdGUgc2V2ZXJhbCBwcm9wZXJ0aWVzIHRvZ2V0aGVyLAorICAgICAqIHVzaW5nIG1vcmUgdGhhbiBvbmUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlbiBzZXR0aW5nIHRoZSBwcm9wZXJ0eU5hbWUgc2ltcGx5CisgICAgICogc2V0cyB0aGUgcHJvcGVydHlOYW1lIGluIHRoZSBmaXJzdCBvZiB0aG9zZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIC8vIG1WYWx1ZXMgY291bGQgYmUgbnVsbCBpZiB0aGlzIGlzIGJlaW5nIGNvbnN0cnVjdGVkIHBpZWNlbWVhbC4gSnVzdCByZWNvcmQgdGhlCisgICAgICAgIC8vIHByb3BlcnR5TmFtZSB0byBiZSB1c2VkIGxhdGVyIHdoZW4gc2V0VmFsdWVzKCkgaXMgY2FsbGVkIGlmIHNvLgorICAgICAgICBpZiAobVZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzWzBdOworICAgICAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSB2YWx1ZXNIb2xkZXIuZ2V0UHJvcGVydHlOYW1lKCk7CisgICAgICAgICAgICB2YWx1ZXNIb2xkZXIuc2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBtVmFsdWVzTWFwLnJlbW92ZShvbGROYW1lKTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucHV0KHByb3BlcnR5TmFtZSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgfQorICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgICAgICAvLyBOZXcgcHJvcGVydHkvdmFsdWVzL3RhcmdldCBzaG91bGQgY2F1c2UgcmUtaW5pdGlhbGl6YXRpb24gcHJpb3IgdG8gc3RhcnRpbmcKKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBzZXR0ZXIgb3IgZ2V0dGVyIGZ1bmN0aW9uIHVzaW5nIHRoZSBKYXZhQmVhbnMgY29udmVudGlvbiBvZiBzZXRGb28gb3IKKyAgICAgKiBnZXRGb28gZm9yIGEgcHJvcGVydHkgbmFtZWQgJ2ZvbycuIFRoaXMgZnVuY3Rpb24gZmlndXJlcyBvdXQgd2hhdCB0aGUgbmFtZSBvZiB0aGUKKyAgICAgKiBmdW5jdGlvbiBzaG91bGQgYmUgYW5kIHVzZXMgcmVmbGVjdGlvbiB0byBmaW5kIHRoZSBNZXRob2Qgd2l0aCB0aGF0IG5hbWUgb24gdGhlCisgICAgICogdGFyZ2V0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggInNldCIgb3IgImdldCIsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIG5lZWQgYSBzZXR0ZXIgb3IgZ2V0dGVyLgorICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIG1Qcm9wZXJ0eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgZ2V0UHJvcGVydHlGdW5jdGlvbihTdHJpbmcgcHJlZml4LCBDbGFzcyB2YWx1ZVR5cGUpIHsKKyAgICAgICAgLy8gVE9ETzogZmFzdGVyIGltcGxlbWVudGF0aW9uLi4uCisgICAgICAgIE1ldGhvZCByZXR1cm5WYWwgPSBudWxsOworICAgICAgICBTdHJpbmcgZmlyc3RMZXR0ZXIgPSBtUHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKTsKKyAgICAgICAgU3RyaW5nIHRoZVJlc3QgPSBtUHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgZmlyc3RMZXR0ZXIgPSBmaXJzdExldHRlci50b1VwcGVyQ2FzZSgpOworICAgICAgICBTdHJpbmcgc2V0dGVyTmFtZSA9IHByZWZpeCArIGZpcnN0TGV0dGVyICsgdGhlUmVzdDsKKyAgICAgICAgQ2xhc3MgYXJnc1tdID0gbnVsbDsKKyAgICAgICAgaWYgKHZhbHVlVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBhcmdzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgYXJnc1swXSA9IHZhbHVlVHlwZTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuVmFsID0gbVRhcmdldC5nZXRDbGFzcygpLmdldE1ldGhvZChzZXR0ZXJOYW1lLCBhcmdzKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKCJPYmplY3RBbmltYXRvciIsCisgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIHNldHRlci9nZXR0ZXIgZm9yIHByb3BlcnR5ICIgKyBtUHJvcGVydHlOYW1lICsgIjogIiArIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBPYmplY3RBbmltYXRvciBvYmplY3QuIFRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBwcmltYXJpbHkgZm9yCisgICAgICogdXNlIGludGVybmFsbHk7IHRoZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2hpY2ggdGFrZSBwYXJhbWV0ZXJzIGFyZSBtb3JlIGdlbmVyYWxseQorICAgICAqIHVzZWZ1bC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0QW5pbWF0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgc2luZ2xlIHByb3BlcnR5IG5hbWUgYW5kIHNldCBvZiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3IgaXMKKyAgICAgKiB1c2VkIGluIHRoZSBzaW1wbGUgY2FzZSBvZiBhbmltYXRpbmcgYSBzaW5nbGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIGFuaW1hdGVkLiBUaGlzIG9iamVjdCBzaG91bGQKKyAgICAgKiBoYXZlIGEgcHVibGljIG1ldGhvZCBvbiBpdCBjYWxsZWQgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bmFtZTwvY29kZT4gaXMKKyAgICAgKiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB2YWx1ZSwgaXQKKyAgICAgKiBpcyBhc3N1bWVkIHRvIGJlIHRoZSBmaW5hbCB2YWx1ZSBiZWluZyBhbmltYXRlZCB0bywgYW5kIHRoZSBpbml0aWFsIHZhbHVlIHdpbGwgYmUKKyAgICAgKiBkZXJpdmVkIG9uIHRoZSBmbHkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIFQuLi52YWx1ZXMpIHsKKyAgICAgICAgc3VwZXIoZHVyYXRpb24sIChUW10pIHZhbHVlcyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIHNldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyA8Y29kZT5Qcm9wZXJ0eVZhbHVlSG9sZGVyPC9jb2RlPiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkCisgICAgICogYmUgdXNlZCB3aGVuIGFuaW1hdGluZyBzZXZlcmFsIHByb3BlcnRpZXMgYXQgb25jZSB3aXRoIHRoZSBzYW1lIE9iamVjdEFuaW1hdG9yLCBzaW5jZQorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIGFsbG93cyB5b3UgdG8gYXNzb2NpYXRlIGEgc2V0IG9mIGFuaW1hdGlvbiB2YWx1ZXMgd2l0aCBhIHByb3BlcnR5CisgICAgICogbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgcHVibGljIG1ldGhvZHMgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIgZm9yCisgICAgICogZWFjaCBvZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIHdoaWNoIGhvbGQgZWFjaCB0aGUgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWVzCisgICAgICogdG8gYW5pbWF0ZSB0aGF0IHByb3BlcnR5IGJldHdlZW4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFByb3BlcnR5VmFsdWVzSG9sZGVyLi4udmFsdWVzKSB7CisgICAgICAgIHN1cGVyKGR1cmF0aW9uKTsKKyAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKFQuLi4gdmFsdWVzKSB7CisgICAgICAgIGlmIChtVmFsdWVzID09IG51bGwgfHwgbVZhbHVlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgLy8gTm8gdmFsdWVzIHlldCAtIHRoaXMgYW5pbWF0b3IgaXMgYmVpbmcgY29uc3RydWN0ZWQgcGllY2VtZWFsLiBJbml0IHRoZSB2YWx1ZXMgd2l0aAorICAgICAgICAgICAgLy8gd2hhdGV2ZXIgdGhlIGN1cnJlbnQgcHJvcGVydHlOYW1lIGlzCisgICAgICAgICAgICBzZXRWYWx1ZXMobmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW117CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcihtUHJvcGVydHlOYW1lLCAoT2JqZWN0W10pdmFsdWVzKX0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuc2V0VmFsdWVzKChUW10pIHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYW5pbWF0aW9uCisgICAgICogZnJhbWUgb2YgYW4gYW5pbWF0aW9uLiBJZiB0aGVyZSBpcyBhIG5vbnplcm8gPGNvZGU+c3RhcnREZWxheTwvY29kZT4sIHRoZQorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGF0IGRlbGF5IGVuZHMuCisgICAgICogSXQgdGFrZXMgY2FyZSBvZiB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIHRoZQorICAgICAqIGFuaW1hdGlvbi4gVGhpcyBpbmNsdWRlcyBzZXR0aW5nIG1FdmFsdWF0b3IsIGlmIHRoZSB1c2VyIGhhcyBub3QgeWV0CisgICAgICogc2V0IGl0IHVwLCBhbmQgdGhlIHNldHRlci9nZXR0ZXIgbWV0aG9kcywgaWYgdGhlIHVzZXIgZGlkIG5vdCBzdXBwbHkKKyAgICAgKiB0aGVtLgorICAgICAqCisgICAgICogIDxwPk92ZXJyaWRlcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGNhdXNlCisgICAgICogIGludGVybmFsIG1lY2hhbmlzbXMgdG8gYmUgc2V0IHVwIGNvcnJlY3RseS48L3A+CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBpbml0QW5pbWF0aW9uKCkgeworICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgLy8gbVZhbHVlVHlwZSBtYXkgY2hhbmdlIGR1ZSB0byBzZXR0ZXIvZ2V0dGVyIHNldHVwOyBkbyB0aGlzIGJlZm9yZSBjYWxsaW5nIHN1cGVyLmluaXQoKSwKKyAgICAgICAgICAgIC8vIHdoaWNoIHVzZXMgbVZhbHVlVHlwZSB0byBzZXQgdXAgdGhlIGRlZmF1bHQgdHlwZSBldmFsdWF0b3IuCisgICAgICAgICAgICBpbnQgbnVtVmFsdWVzID0gbVZhbHVlcy5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICAgICAgbVZhbHVlc1tpXS5zZXR1cFNldHRlckFuZEdldHRlcihtVGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLmluaXRBbmltYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBvYmplY3Qgd2hvc2UgcHJvcGVydHkgd2lsbCBiZSBhbmltYXRlZCBieSB0aGlzIGFuaW1hdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiBtVGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBvYmplY3Qgd2hvc2UgcHJvcGVydHkgd2lsbCBiZSBhbmltYXRlZCBieSB0aGlzIGFuaW1hdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgLy8gTmV3IHByb3BlcnR5L3ZhbHVlcy90YXJnZXQgc2hvdWxkIGNhdXNlIHJlLWluaXRpYWxpemF0aW9uIHByaW9yIHRvIHN0YXJ0aW5nCisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldHVwU3RhcnRWYWx1ZXMoKSB7CisgICAgICAgIGluaXRBbmltYXRpb24oKTsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLnNldHVwU3RhcnRWYWx1ZShtVGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldHVwRW5kVmFsdWVzKCkgeworICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgbVZhbHVlc1tpXS5zZXR1cEVuZFZhbHVlKG1UYXJnZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiBkdXJpbmcgZXZlcnkKKyAgICAgKiBhbmltYXRpb24gZnJhbWUuIFRoaXMgZnVuY3Rpb24gdHVybnMgdGhlIGVsYXBzZWQgZnJhY3Rpb24gaW50byBhbiBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24KKyAgICAgKiBhbmQgdGhlbiBpbnRvIGFuIGFuaW1hdGVkIHZhbHVlIChmcm9tIHRoZSBldmFsdWF0b3IuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgbW9zdGx5IGR1cmluZworICAgICAqIGFuaW1hdGlvbiB1cGRhdGVzLCBidXQgaXQgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgPGNvZGU+ZW5kKCk8L2NvZGU+CisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0byBzZXQgdGhlIGZpbmFsIHZhbHVlIG9uIHRoZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPk92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBtdXN0IGNhbGwgdGhlIHN1cGVyY2xhc3MgdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb24KKyAgICAgKiBvZiB0aGUgYW5pbWF0ZWQgdmFsdWUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBhbmltYXRlVmFsdWUoZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgc3VwZXIuYW5pbWF0ZVZhbHVlKGZyYWN0aW9uKTsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLnNldEFuaW1hdGVkVmFsdWUobVRhcmdldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0QW5pbWF0b3IgY2xvbmUoKSB7CisgICAgICAgIGZpbmFsIE9iamVjdEFuaW1hdG9yIGFuaW0gPSAoT2JqZWN0QW5pbWF0b3IpIHN1cGVyLmNsb25lKCk7CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eVZhbHVlc0hvbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5VmFsdWVzSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NjEyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eVZhbHVlc0hvbGRlci5qYXZhCkBAIC0wLDAgKzEsNTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb3BlcnR5IGFuZCB0aGUgdmFsdWVzIHRoYXQgdGhhdCBwcm9wZXJ0eQorICogc2hvdWxkIHRha2Ugb24gZHVyaW5nIGFuIGFuaW1hdGlvbi4gUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyBjYW4gYmUgdXNlZCB0byBjcmVhdGUKKyAqIGFuaW1hdGlvbnMgd2l0aCBWYWx1ZUFuaW1hdG9yIG9yIE9iamVjdEFuaW1hdG9yIHRoYXQgb3BlcmF0ZSBvbiBzZXZlcmFsIGRpZmZlcmVudCBwcm9wZXJ0aWVzCisgKiBpbiBwYXJhbGxlbC4KKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5VmFsdWVzSG9sZGVyPFQ+IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlcy4gVGhpcyBuZWVkIG5vdCBiZSBhIHJlYWwgcHJvcGVydHksCisgICAgICogdW5sZXNzIHRoaXMgb2JqZWN0IGlzIGJlaW5nIHVzZWQgd2l0aCBPYmplY3RBbmltYXRvci4gQnV0IHRoaXMgaXMgdGhlIG5hbWUgYnkgd2hpY2gKKyAgICAgKiBhbmlhbXRlZCB2YWx1ZXMgYXJlIGxvb2tlZCB1cCB3aXRoIGdldEFuaW1hdGVkVmFsdWUoU3RyaW5nKSBpbiBWYWx1ZUFuaW1hdG9yLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0dGVyIGZ1bmN0aW9uLCBpZiBuZWVkZWQuIE9iamVjdEFuaW1hdG9yIGhhbmRzIG9mZiB0aGlzIGZ1bmN0aW9uYWxpdHkgdG8KKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciwgc2luY2UgaXQgaG9sZHMgYWxsIG9mIHRoZSBwZXItcHJvcGVydHkgaW5mb3JtYXRpb24uIFRoaXMKKyAgICAgKiBwcm9wZXJ0eSBjYW4gYmUgbWFudWFsbHkgc2V0IHZpYSBzZXRTZXR0ZXIoKS4gT3RoZXJ3aXNlLCBpdCBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZGVyaXZlZCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzIGluIHNldHVwU2V0dGVyQW5kR2V0dGVyKCkgaWYgdXNpbmcgT2JqZWN0QW5pbWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgbVNldHRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2V0dGVyIGZ1bmN0aW9uLCBpZiBuZWVkZWQuIE9iamVjdEFuaW1hdG9yIGhhbmRzIG9mZiB0aGlzIGZ1bmN0aW9uYWxpdHkgdG8KKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciwgc2luY2UgaXQgaG9sZHMgYWxsIG9mIHRoZSBwZXItcHJvcGVydHkgaW5mb3JtYXRpb24uIFRoaXMKKyAgICAgKiBwcm9wZXJ0eSBjYW4gYmUgbWFudWFsbHkgc2V0IHZpYSBzZXRTZXR0ZXIoKS4gT3RoZXJ3aXNlLCBpdCBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZGVyaXZlZCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzIGluIHNldHVwU2V0dGVyQW5kR2V0dGVyKCkgaWYgdXNpbmcgT2JqZWN0QW5pbWF0b3IuCisgICAgICogVGhlIGdldHRlciBpcyBvbmx5IGRlcml2ZWQgYW5kIHVzZWQgaWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBtR2V0dGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHZhbHVlcyBzdXBwbGllZC4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJvdGggaW4gZGVyaXZpbmcgdGhlIHNldHRlci9nZXR0ZXIKKyAgICAgKiBmdW5jdGlvbnMgYW5kIGluIGRlcml2aW5nIHRoZSB0eXBlIG9mIFR5cGVFdmFsdWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBtVmFsdWVUeXBlOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBrZXlmcmFtZXMgKHRpbWUvdmFsdWUgcGFpcnMpIHRoYXQgZGVmaW5lIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgS2V5ZnJhbWVTZXQgbUtleWZyYW1lU2V0ID0gbnVsbDsKKworCisgICAgLy8gdHlwZSBldmFsdWF0b3JzIGZvciB0aGUgdGhyZWUgcHJpbWl0aXZlIHR5cGVzIGhhbmRsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0ludEV2YWx1YXRvciA9IG5ldyBJbnRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNGbG9hdEV2YWx1YXRvciA9IG5ldyBGbG9hdEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0RvdWJsZUV2YWx1YXRvciA9IG5ldyBEb3VibGVFdmFsdWF0b3IoKTsKKworICAgIC8vIFdlIHRyeSBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyB3aGVuIHNlYXJjaGluZyBmb3IgYXBwcm9wcmlhdGUgc2V0dGVyL2dldHRlciBmdW5jdGlvbnMuCisgICAgLy8gVGhlIGNhbGxlciBtYXkgaGF2ZSBzdXBwbGllZCB2YWx1ZXMgaW4gYSB0eXBlIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNldHRlci9nZXR0ZXIKKyAgICAvLyBmdW5jdGlvbnMgKHN1Y2ggYXMgdGhlIGludGVnZXJzIDAgYW5kIDEgdG8gcmVwcmVzZW50IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBmb3IgYWxwaGEpLgorICAgIC8vIEFsc28sIHRoZSB1c2Ugb2YgZ2VuZXJpY3MgaW4gY29uc3RydWN0b3JzIG1lYW5zIHRoYXQgd2UgZW5kIHVwIHdpdGggdGhlIE9iamVjdCB2ZXJzaW9ucworICAgIC8vIG9mIHByaW1pdGl2ZSB0eXBlcyAoRmxvYXQgdnMuIGZsb2F0KS4gQnV0IG1vc3QgbGlrZWx5LCB0aGUgc2V0dGVyL2dldHRlciBmdW5jdGlvbnMKKyAgICAvLyB3aWxsIHRha2UgcHJpbWl0aXZlIHR5cGVzIGluc3RlYWQuCisgICAgLy8gU28gd2Ugc3VwcGx5IGFuIG9yZGVyZWQgYXJyYXkgb2Ygb3RoZXIgdHlwZXMgdG8gdHJ5IGJlZm9yZSBnaXZpbmcgdXAuCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBGTE9BVF9WQVJJQU5UUyA9IHtmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MsIGRvdWJsZS5jbGFzcywgaW50LmNsYXNzLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLCBJbnRlZ2VyLmNsYXNzfTsKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIElOVEVHRVJfVkFSSUFOVFMgPSB7aW50LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBmbG9hdC5jbGFzcywgZG91YmxlLmNsYXNzLAorICAgICAgICAgICAgRmxvYXQuY2xhc3MsIERvdWJsZS5jbGFzc307CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBET1VCTEVfVkFSSUFOVFMgPSB7ZG91YmxlLmNsYXNzLCBEb3VibGUuY2xhc3MsIGZsb2F0LmNsYXNzLCBpbnQuY2xhc3MsCisgICAgICAgICAgICBGbG9hdC5jbGFzcywgSW50ZWdlci5jbGFzc307CisKKyAgICAvLyBUaGVzZSBtYXBzIGhvbGQgYWxsIHByb3BlcnR5IGVudHJpZXMgZm9yIGEgcGFydGljdWxhciBjbGFzcy4gVGhpcyBtYXAKKyAgICAvLyBpcyB1c2VkIHRvIHNwZWVkIHVwIHByb3BlcnR5L3NldHRlci9nZXR0ZXIgbG9va3VwcyBmb3IgYSBnaXZlbiBjbGFzcy9wcm9wZXJ0eQorICAgIC8vIGNvbWJpbmF0aW9uLiBObyBuZWVkIHRvIHVzZSByZWZsZWN0aW9uIG9uIHRoZSBjb21iaW5hdGlvbiBtb3JlIHRoYW4gb25jZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4gc1NldHRlclByb3BlcnR5TWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4gc0dldHRlclByb3BlcnR5TWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4oKTsKKworICAgIC8vIFRoaXMgbG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHRocmVhZCBpcyBhY2Nlc3NpbmcgdGhlIHByb3BlcnR5IG1hcHMKKyAgICAvLyBhdCBhIHRpbWUuCisgICAgcHJpdmF0ZSBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHByb3BlcnR5TWFwTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisKKyAgICAvLyBVc2VkIHRvIHBhc3Mgc2luZ2xlIHZhbHVlIHRvIHZhcmFyZ3MgcGFyYW1ldGVyIGluIHNldHRlciBpbnZvY2F0aW9uCisgICAgcHJpdmF0ZSBPYmplY3RbXSBtVG1wVmFsdWVBcnJheSA9IG5ldyBPYmplY3RbMV07CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBldmFsdWF0b3IgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGFuaW1hdGVkIHZhbHVlcy4gVGhpcyBldmFsdWF0b3IgaXMgZGV0ZXJtaW5lZAorICAgICAqIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIHN0YXJ0L2VuZCBvYmplY3RzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciwKKyAgICAgKiBidXQgdGhlIHN5c3RlbSBvbmx5IGtub3dzIGFib3V0IHRoZSBwcmltaXRpdmUgdHlwZXMgaW50LCBkb3VibGUsIGFuZCBmbG9hdC4gQW55IG90aGVyCisgICAgICogdHlwZSB3aWxsIG5lZWQgdG8gc2V0IHRoZSBldmFsdWF0b3IgdG8gYSBjdXN0b20gZXZhbHVhdG9yIGZvciB0aGF0IHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBUeXBlRXZhbHVhdG9yIG1FdmFsdWF0b3I7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGJ5IGNhbGN1bGF0ZVZhbHVlKCkuIFRoaXMgaXMgc2V0IGR1cmluZworICAgICAqIHRoYXQgZnVuY3Rpb24gYW5kIG1pZ2h0IGJlIHJldHJpZXZlZCBsYXRlciBlaXRoZXIgYnkgVmFsdWVBbmltYXRvci5hbmltYXRlZFZhbHVlKCkgb3IKKyAgICAgKiBieSB0aGUgcHJvcGVydHktc2V0dGluZyBsb2dpYyBpbiBPYmplY3RBbmltYXRvci5hbmltYXRlZFZhbHVlKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgbUFuaW1hdGVkVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IHdpdGgganVzdCBhIHNldCBvZiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBpcyB0eXBpY2FsbHkgbm90IHVzZWQgd2hlbiBhbmltYXRpbmcgb2JqZWN0cyB3aXRoIE9iamVjdEFuaW1hdG9yLCBiZWNhdXNlIHRoYXQKKyAgICAgKiBvYmplY3QgbmVlZHMgZGlzdGluY3QgYW5kIG1lYW5pbmdmdWwgcHJvcGVydHkgbmFtZXMuIFNpbXBsZXIgYW5pbWF0aW9ucyBvZiBvbmUKKyAgICAgKiBzZXQgb2YgdmFsdWVzIHVzaW5nIFZhbHVlQW5pbWF0b3IgbWF5IHVzZSB0aGlzIGNvbnN0cnVjdG9yLCBob3dldmVyLCBiZWNhdXNlIG5vCisgICAgICogZGlzdGluZ3Vpc2hpbmcgbmFtZSBpcyBuZWVkZWQuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uIElmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdAorICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGZpbmFsIHZhbHVlIGJlaW5nIGFuaW1hdGVkIHRvLCBhbmQgdGhlIGluaXRpYWwgdmFsdWUgd2lsbCBiZQorICAgICAqIGRlcml2ZWQgb24gdGhlIGZseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIoVC4uLnZhbHVlcykgeworICAgICAgICB0aGlzKG51bGwsIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZSBhbmQgc2V0IG9mCisgICAgICogdmFsdWVzLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIG9mIGFueSB0eXBlLCBidXQgdGhlIHR5cGUgc2hvdWxkIGJlIGNvbnNpc3RlbnQgc28gdGhhdAorICAgICAqIGFuIGFwcHJvcHJpYXRlIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yfSBjYW4gYmUgZm91bmQgdGhhdCBtYXRjaGVzCisgICAgICogdGhlIGNvbW1vbiB0eXBlLgorICAgICAqIDxwPklmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBlbmQgdmFsdWUgb2YgYW4gYW5pbWF0aW9uLAorICAgICAqIGFuZCBhbiBpbml0aWFsIHZhbHVlIHdpbGwgYmUgZGVyaXZlZCwgaWYgcG9zc2libGUsIGJ5IGNhbGxpbmcgYSBnZXR0ZXIgZnVuY3Rpb24KKyAgICAgKiBvbiB0aGUgb2JqZWN0LiBBbHNvLCBpZiBhbnkgdmFsdWUgaXMgbnVsbCwgdGhlIHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gdGhlIGFuaW1hdGlvbgorICAgICAqIHN0YXJ0cyBpbiB0aGUgc2FtZSB3YXkuIFRoaXMgbWVjaGFuaXNtIG9mIGF1dG9tYXRpY2FsbHkgZ2V0dGluZyBudWxsIHZhbHVlcyBvbmx5IHdvcmtzCisgICAgICogaWYgdGhlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uCisgICAgICoge0BsaW5rIE9iamVjdEFuaW1hdG9yfSwgYW5kIHdpdGggYSBnZXR0ZXIgZnVuY3Rpb24gZWl0aGVyCisgICAgICogZGVyaXZlZCBhdXRvbWF0aWNhbGx5IGZyb20gPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBvciBzZXQgZXhwbGljaXRseSB2aWEKKyAgICAgKiB7QGxpbmsgI3NldEdldHRlcihqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpfSwgc2luY2Ugb3RoZXJ3aXNlIFByb3BlcnR5VmFsdWVzSG9sZGVyIGhhcworICAgICAqIG5vIHdheSBvZiBkZXRlcm1pbmluZyB3aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2V0IG9mIHZhbHVlcy4gVGhpcworICAgICAqIGNhbiBiZSB0aGUgYWN0dWFsIHByb3BlcnR5IG5hbWUgdG8gYmUgdXNlZCB3aGVuIHVzaW5nIGEgT2JqZWN0QW5pbWF0b3Igb2JqZWN0LCBvcgorICAgICAqIGp1c3QgYSBuYW1lIHVzZWQgdG8gZ2V0IGFuaW1hdGVkIHZhbHVlcywgc3VjaCBhcyBpZiB0aGlzIG9iamVjdCBpcyB1c2VkIHdpdGggYW4KKyAgICAgKiBWYWx1ZUFuaW1hdG9yIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWVzIGJlaW5nIGFuaW1hdGVkIGJldHdlZW4uCisgICAgICogSWYgdGhlcmUgaXMgb25seSBvbmUgdmFsdWUsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIGVuZCB2YWx1ZSBvZiBhbiBhbmltYXRpb24sCisgICAgICogYW5kIGFuIGluaXRpYWwgdmFsdWUgd2lsbCBiZSBkZXJpdmVkLCBpZiBwb3NzaWJsZSwgYnkgY2FsbGluZyBhIGdldHRlciBmdW5jdGlvbgorICAgICAqIG9uIHRoZSBvYmplY3QuIEFsc28sIGlmIGFueSB2YWx1ZSBpcyBudWxsLCB0aGUgdmFsdWUgd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiB0aGUgYW5pbWF0aW9uCisgICAgICogc3RhcnRzIGluIHRoZSBzYW1lIHdheS4gVGhpcyBtZWNoYW5pc20gb2YgYXV0b21hdGljYWxseSBnZXR0aW5nIG51bGwgdmFsdWVzIG9ubHkgd29ya3MKKyAgICAgKiBpZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24KKyAgICAgKiB7QGxpbmsgT2JqZWN0QW5pbWF0b3J9LCBhbmQgd2l0aCBhIGdldHRlciBmdW5jdGlvbiBlaXRoZXIKKyAgICAgKiBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZnJvbSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IG9yIHNldCBleHBsaWNpdGx5IHZpYQorICAgICAqIHtAbGluayAjc2V0R2V0dGVyKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCl9LCBzaW5jZSBvdGhlcndpc2UgUHJvcGVydHlWYWx1ZXNIb2xkZXIgaGFzCisgICAgICogbm8gd2F5IG9mIGRldGVybWluaW5nIHdoYXQgdGhlIHZhbHVlIHNob3VsZCBiZS4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaW50IG51bUtleWZyYW1lcyA9IHZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzIHRoaXNWYWx1ZVR5cGUgPSB2YWx1ZXNbaV0uZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICBpZiAobVZhbHVlVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSB0aGlzVmFsdWVUeXBlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzVmFsdWVUeXBlICE9IG1WYWx1ZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmFsdWVUeXBlID09IEludGVnZXIuY2xhc3MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXNWYWx1ZVR5cGUgPT0gRmxvYXQuY2xhc3MgfHwgdGhpc1ZhbHVlVHlwZSA9PSBEb3VibGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IHRoaXNWYWx1ZVR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WYWx1ZVR5cGUgPT0gRmxvYXQuY2xhc3MgJiYgdGhpc1ZhbHVlVHlwZSA9PSBEb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVUeXBlID0gdGhpc1ZhbHVlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZSBrZXlmcmFtZXNbXSA9IG5ldyBLZXlmcmFtZVtNYXRoLm1heChudW1LZXlmcmFtZXMsMildOworICAgICAgICBpZiAobVZhbHVlVHlwZS5lcXVhbHMoS2V5ZnJhbWUuY2xhc3MpKSB7CisgICAgICAgICAgICBtVmFsdWVUeXBlID0gKChLZXlmcmFtZSl2YWx1ZXNbMF0pLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZXNbaV0gPSAoS2V5ZnJhbWUpdmFsdWVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG51bUtleWZyYW1lcyA9PSAxKSB7CisgICAgICAgICAgICAgICAga2V5ZnJhbWVzWzBdID0gbmV3IEtleWZyYW1lKDBmLCAoT2JqZWN0KSBudWxsKTsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZXNbMV0gPSBuZXcgS2V5ZnJhbWUoMWYsIHZhbHVlc1swXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGtleWZyYW1lc1swXSA9IG5ldyBLZXlmcmFtZSgwZiwgdmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG51bUtleWZyYW1lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCAmJiAodmFsdWVzW2ldLmdldENsYXNzKCkgIT0gbVZhbHVlVHlwZSkpIHsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lc1tpXSA9IG5ldyBLZXlmcmFtZSgoZmxvYXQpIGkgLyAobnVtS2V5ZnJhbWVzIC0gMSksIHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1LZXlmcmFtZVNldCA9IG5ldyBLZXlmcmFtZVNldChrZXlmcmFtZXMpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIHNldHRlciBvciBnZXR0ZXIgZnVuY3Rpb24gdXNpbmcgdGhlIEphdmFCZWFucyBjb252ZW50aW9uIG9mIHNldEZvbyBvcgorICAgICAqIGdldEZvbyBmb3IgYSBwcm9wZXJ0eSBuYW1lZCAnZm9vJy4gVGhpcyBmdW5jdGlvbiBmaWd1cmVzIG91dCB3aGF0IHRoZSBuYW1lIG9mIHRoZQorICAgICAqIGZ1bmN0aW9uIHNob3VsZCBiZSBhbmQgdXNlcyByZWZsZWN0aW9uIHRvIGZpbmQgdGhlIE1ldGhvZCB3aXRoIHRoYXQgbmFtZSBvbiB0aGUKKyAgICAgKiB0YXJnZXQgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBjbGFzcyB0byBzZWFyY2ggZm9yIHRoZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gcHJlZml4ICJzZXQiIG9yICJnZXQiLCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBuZWVkIGEgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgKGluIHRoZSBjYXNlIG9mIGEgc2V0dGVyKS4gVGhpcyB0eXBlCisgICAgICogaXMgZGVyaXZlZCBmcm9tIHRoZSB2YWx1ZXMgc2V0IG9uIHRoaXMgUHJvcGVydHlWYWx1ZXNIb2xkZXIuIFRoaXMgdHlwZSBpcyB1c2VkIGFzCisgICAgICogYSBmaXJzdCBndWVzcyBhdCB0aGUgcGFyYW1ldGVyIHR5cGUsIGJ1dCB3ZSBjaGVjayBmb3IgbWV0aG9kcyB3aXRoIHNldmVyYWwgZGlmZmVyZW50CisgICAgICogdHlwZXMgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBzbGlnaHQgbWlzLW1hdGNoZXMgYmV0d2VlbiBzdXBwbGllZCB2YWx1ZXMgYW5kIGFjdHVhbAorICAgICAqIHZhbHVlIHR5cGVzIHVzZWQgb24gdGhlIHNldHRlci4KKyAgICAgKiBAcmV0dXJuIE1ldGhvZCB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBtUHJvcGVydHlOYW1lLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIGdldFByb3BlcnR5RnVuY3Rpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcmVmaXgsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICAvLyBUT0RPOiBmYXN0ZXIgaW1wbGVtZW50YXRpb24uLi4KKyAgICAgICAgTWV0aG9kIHJldHVyblZhbCA9IG51bGw7CisgICAgICAgIFN0cmluZyBmaXJzdExldHRlciA9IG1Qcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpOworICAgICAgICBTdHJpbmcgdGhlUmVzdCA9IG1Qcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICBmaXJzdExldHRlciA9IGZpcnN0TGV0dGVyLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gcHJlZml4ICsgZmlyc3RMZXR0ZXIgKyB0aGVSZXN0OworICAgICAgICBDbGFzcyBhcmdzW10gPSBudWxsOworICAgICAgICBpZiAodmFsdWVUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuVmFsID0gdGFyZ2V0Q2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgbm8tYXJnIG1ldGhvZCBmb3IgcHJvcGVydHkgIiArIG1Qcm9wZXJ0eU5hbWUgKyAiOiAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmdzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgQ2xhc3MgdHlwZVZhcmlhbnRzW107CisgICAgICAgICAgICBpZiAobVZhbHVlVHlwZS5lcXVhbHMoRmxvYXQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gRkxPQVRfVkFSSUFOVFM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1WYWx1ZVR5cGUuZXF1YWxzKEludGVnZXIuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gSU5URUdFUl9WQVJJQU5UUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVZhbHVlVHlwZS5lcXVhbHMoRG91YmxlLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHR5cGVWYXJpYW50cyA9IERPVUJMRV9WQVJJQU5UUzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgICAgIHR5cGVWYXJpYW50c1swXSA9IG1WYWx1ZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKENsYXNzIHR5cGVWYXJpYW50IDogdHlwZVZhcmlhbnRzKSB7CisgICAgICAgICAgICAgICAgYXJnc1swXSA9IHR5cGVWYXJpYW50OworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbCA9IHRhcmdldENsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB2YWx1ZSB0eXBlIHRvIHN1aXQKKyAgICAgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IHR5cGVWYXJpYW50OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgdGhlIGVycm9yIGFuZCBrZWVwIHRyeWluZyBvdGhlciB2YXJpYW50cworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIG5vIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIHdhcyBmb3VuZAorICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgc2V0dGVyL2dldHRlciBmb3IgcHJvcGVydHkgIiArIG1Qcm9wZXJ0eU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHZhbHVlIHR5cGUgIisgbVZhbHVlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0dGVyIG9yIGdldHRlciByZXF1ZXN0ZWQuIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUKKyAgICAgKiByZXF1ZXN0ZWQgbWV0aG9kIGV4aXN0cyBpbiB0aGUgcHJvcGVydHlNYXBNYXAgY2FjaGUuIElmIG5vdCwgaXQgY2FsbHMgYW5vdGhlcgorICAgICAqIHV0aWxpdHkgZnVuY3Rpb24gdG8gcmVxdWVzdCB0aGUgTWV0aG9kIGZyb20gdGhlIHRhcmdldENsYXNzIGRpcmVjdGx5LgorICAgICAqIEBwYXJhbSB0YXJnZXRDbGFzcyBUaGUgQ2xhc3Mgb24gd2hpY2ggdGhlIHJlcXVlc3RlZCBtZXRob2Qgc2hvdWxkIGV4aXN0LgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU1hcE1hcCBUaGUgY2FjaGUgb2Ygc2V0dGVycy9nZXR0ZXJzIGRlcml2ZWQgc28gZmFyLgorICAgICAqIEBwYXJhbSBwcmVmaXggInNldCIgb3IgImdldCIsIGZvciB0aGUgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHBhcmFtZXRlciBwYXNzZWQgaW50byB0aGUgbWV0aG9kIChudWxsIGZvciBnZXR0ZXIpLgorICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIG1Qcm9wZXJ0eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2Qgc2V0dXBTZXR0ZXJPckdldHRlcihDbGFzcyB0YXJnZXRDbGFzcywKKyAgICAgICAgICAgIEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PiBwcm9wZXJ0eU1hcE1hcCwKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICBNZXRob2Qgc2V0dGVyT3JHZXR0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSGF2ZSB0byBsb2NrIHByb3BlcnR5IG1hcCBwcmlvciB0byByZWFkaW5nIGl0LCB0byBndWFyZCBhZ2FpbnN0CisgICAgICAgICAgICAvLyBhbm90aGVyIHRocmVhZCBwdXR0aW5nIHNvbWV0aGluZyBpbiB0aGVyZSBhZnRlciB3ZSd2ZSBjaGVja2VkIGl0CisgICAgICAgICAgICAvLyBidXQgYmVmb3JlIHdlJ3ZlIGFkZGVkIGFuIGVudHJ5IHRvIGl0CisgICAgICAgICAgICAvLyBUT0RPOiBjYW4gd2Ugc3RvcmUgdGhlIHNldHRlci9nZXR0ZXIgcGVyIENsYXNzIGluc3RlYWQgb2YgcGVyIE9iamVjdD8KKyAgICAgICAgICAgIHByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgTWV0aG9kPiBwcm9wZXJ0eU1hcCA9IHByb3BlcnR5TWFwTWFwLmdldCh0YXJnZXRDbGFzcyk7CisgICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldHRlck9yR2V0dGVyID0gcHJvcGVydHlNYXAuZ2V0KG1Qcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldHRlck9yR2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXR0ZXJPckdldHRlciA9IGdldFByb3BlcnR5RnVuY3Rpb24odGFyZ2V0Q2xhc3MsIHByZWZpeCwgdmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpOworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcE1hcC5wdXQodGFyZ2V0Q2xhc3MsIHByb3BlcnR5TWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KG1Qcm9wZXJ0eU5hbWUsIHNldHRlck9yR2V0dGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2V0dGVyT3JHZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgdGhlIHNldHRlciBmcm9tIHRhcmdldENsYXNzCisgICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBDbGFzcyBvbiB3aGljaCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBzaG91bGQgZXhpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwU2V0dGVyKENsYXNzIHRhcmdldENsYXNzKSB7CisgICAgICAgIG1TZXR0ZXIgPSBzZXR1cFNldHRlck9yR2V0dGVyKHRhcmdldENsYXNzLCBzU2V0dGVyUHJvcGVydHlNYXAsICJzZXQiLCBtVmFsdWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgZ2V0dGVyIGZyb20gdGFyZ2V0Q2xhc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBHZXR0ZXIoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHsKKyAgICAgICAgbUdldHRlciA9IHNldHVwU2V0dGVyT3JHZXR0ZXIodGFyZ2V0Q2xhc3MsIHNHZXR0ZXJQcm9wZXJ0eU1hcCwgImdldCIsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGZ1bmN0aW9uIChjYWxsZWQgZnJvbSBPYmplY3RBbmltYXRvcikgdG8gc2V0IHVwIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgorICAgICAqIHByaW9yIHRvIHJ1bm5pbmcgdGhlIGFuaW1hdGlvbi4gSWYgdGhlIHNldHRlciBoYXMgbm90IGJlZW4gbWFudWFsbHkgc2V0IGZvciB0aGlzCisgICAgICogb2JqZWN0LCBpdCB3aWxsIGJlIGRlcml2ZWQgYXV0b21hdGljYWxseSBnaXZlbiB0aGUgcHJvcGVydHkgbmFtZSwgdGFyZ2V0IG9iamVjdCwgYW5kCisgICAgICogdHlwZXMgb2YgdmFsdWVzIHN1cHBsaWVkLiBJZiBubyBnZXR0ZXIgaGFzIGJlZW4gc2V0LCBpdCB3aWxsIGJlIHN1cHBsaWVkIGlmZiBhbnkgb2YgdGhlCisgICAgICogc3VwcGxpZWQgdmFsdWVzIHdhcyBudWxsLiBJZiB0aGVyZSBpcyBhIG51bGwgdmFsdWUsIHRoZW4gdGhlIGdldHRlciAoc3VwcGxpZWQgb3IgZGVyaXZlZCkKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCB0byBzZXQgdGhvc2UgbnVsbCB2YWx1ZXMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogb24gdGhlIHRhcmdldCBvYmplY3QuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBzZXR0ZXIgKGFuZCBwb3NzaWJseSBnZXR0ZXIpIGV4aXN0LgorICAgICAqLworICAgIHZvaWQgc2V0dXBTZXR0ZXJBbmRHZXR0ZXIoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IHRhcmdldC5nZXRDbGFzcygpOworICAgICAgICBpZiAobVNldHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXR1cFNldHRlcih0YXJnZXRDbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChLZXlmcmFtZSBrZiA6IG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoa2YuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1HZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cEdldHRlcih0YXJnZXRDbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGtmLnNldFZhbHVlKChUKSBtR2V0dGVyLmludm9rZSh0YXJnZXQpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgc3RvcmVkIGluIGEgcGFydGljdWxhciBLZXlmcmFtZS4gVGhlIHZhbHVlIHVzZWQgaXMKKyAgICAgKiB3aGF0ZXZlciB0aGUgdmFsdWUgaXMgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lIHNwZWNpZmllZCBpbiB0aGUga2V5ZnJhbWUgb24gdGhlIHRhcmdldCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGN1cnJlbnQgdmFsdWUgc2hvdWxkIGJlIGV4dHJhY3RlZC4KKyAgICAgKiBAcGFyYW0ga2YgVGhlIGtleWZyYW1lIHdoaWNoIGhvbGRzIHRoZSBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBWYWx1ZShPYmplY3QgdGFyZ2V0LCBLZXlmcmFtZSBrZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1HZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0LmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgc2V0dXBHZXR0ZXIodGFyZ2V0Q2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2Yuc2V0VmFsdWUoKFQpIG1HZXR0ZXIuaW52b2tlKHRhcmdldCkpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE9iamVjdEFuaW1hdG9yIHdoZW4gc2V0dGluZyB0aGUgc3RhcnQgdmFsdWVzIGZvciBhbiBhbmltYXRpb24uCisgICAgICogVGhlIHN0YXJ0IHZhbHVlcyBhcmUgc2V0IGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2YWx1ZXMgaW4gdGhlIHRhcmdldCBvYmplY3QuIFRoZQorICAgICAqIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIGV4dHJhY3RlZCBpcyB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgYnkgdGhlIHByb3BlcnR5TmFtZSBvZiB0aGlzCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdoaWNoIGhvbGRzIHRoZSBzdGFydCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgc2V0LgorICAgICAqLworICAgIHZvaWQgc2V0dXBTdGFydFZhbHVlKE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgc2V0dXBWYWx1ZSh0YXJnZXQsIG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzLmdldCgwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgT2JqZWN0QW5pbWF0b3Igd2hlbiBzZXR0aW5nIHRoZSBlbmQgdmFsdWVzIGZvciBhbiBhbmltYXRpb24uCisgICAgICogVGhlIGVuZCB2YWx1ZXMgYXJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWVzIGluIHRoZSB0YXJnZXQgb2JqZWN0LiBUaGUKKyAgICAgKiBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBleHRyYWN0ZWQgaXMgd2hhdGV2ZXIgaXMgc3BlY2lmaWVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUgb2YgdGhpcworICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aGljaCBob2xkcyB0aGUgc3RhcnQgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIHNldC4KKyAgICAgKi8KKyAgICB2b2lkIHNldHVwRW5kVmFsdWUoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBzZXR1cFZhbHVlKHRhcmdldCwgbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMuZ2V0KG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzLnNpemUoKSAtIDEpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIgY2xvbmUoKSB7CisgICAgICAgIEFycmF5TGlzdDxLZXlmcmFtZT4ga2V5ZnJhbWVzID0gbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXM7CisgICAgICAgIGludCBudW1LZXlmcmFtZXMgPSBtS2V5ZnJhbWVTZXQubUtleWZyYW1lcy5zaXplKCk7CisgICAgICAgIEtleWZyYW1lW10gbmV3S2V5ZnJhbWVzID0gbmV3IEtleWZyYW1lW251bUtleWZyYW1lc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIG5ld0tleWZyYW1lc1tpXSA9IGtleWZyYW1lcy5nZXQoaSkuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhDbG9uZSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcihtUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgIChPYmplY3RbXSkgbmV3S2V5ZnJhbWVzKTsKKyAgICAgICAgcmV0dXJuIHB2aENsb25lOworICAgIH0KKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9uIHRoZSB0YXJnZXQgb2JqZWN0LCB1c2luZyB0aGUgc2V0dGVyIHNldCB1cAorICAgICAqIGVhcmxpZXIgb24gdGhpcyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE9iamVjdEFuaW1hdG9yCisgICAgICogdG8gaGFuZGxlIHR1cm5pbmcgdGhlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgVmFsdWVBbmltYXRvciBpbnRvIGEgdmFsdWUgc2V0IG9uIHRoZSBvYmplY3QKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIHZhbHVlIGlzIHNldAorICAgICAqLworICAgIHZvaWQgc2V0QW5pbWF0ZWRWYWx1ZShPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgIGlmIChtU2V0dGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVRtcFZhbHVlQXJyYXlbMF0gPSBtQW5pbWF0ZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICBtU2V0dGVyLmludm9rZSh0YXJnZXQsIG1UbXBWYWx1ZUFycmF5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24sIGNhbGxlZCBieSBWYWx1ZUFuaW1hdG9yLCB0byBzZXQgdXAgdGhlIFR5cGVFdmFsdWF0b3IgdGhhdCB3aWxsIGJlIHVzZWQKKyAgICAgKiB0byBjYWxjdWxhdGUgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqLworICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYgKG1FdmFsdWF0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbUV2YWx1YXRvciA9IChtVmFsdWVUeXBlID09IGludC5jbGFzcyB8fCBtVmFsdWVUeXBlID09IEludGVnZXIuY2xhc3MpID8gc0ludEV2YWx1YXRvciA6CisgICAgICAgICAgICAgICAgKG1WYWx1ZVR5cGUgPT0gZG91YmxlLmNsYXNzIHx8IG1WYWx1ZVR5cGUgPT0gRG91YmxlLmNsYXNzKSA/IHNEb3VibGVFdmFsdWF0b3IgOgorICAgICAgICAgICAgICAgICAgICAgICAgc0Zsb2F0RXZhbHVhdG9yOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFR5cGVFdmFsdWF0b3Igd2lsbCB0aGUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHZhbHVlcworICAgICAqIHN1cHBsaWVkIHRvIFByb3BlcnR5VmFsdWVzSG9sZGVyLiBUaGUgZXZhbHVhdG9yIGNhbiBiZSBtYW51YWxseSBzZXQsIGhvd2V2ZXIsIGlmIHNvCisgICAgICogZGVzaXJlZC4gVGhpcyBtYXkgYmUgaW1wb3J0YW50IGluIGNhc2VzIHdoZXJlIGVpdGhlciB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIHN1cHBsaWVkCisgICAgICogZG8gbm90IG1hdGNoIHRoZSB3YXkgdGhhdCB0aGV5IHNob3VsZCBiZSBpbnRlcnBvbGF0ZWQgYmV0d2Vlbiwgb3IgaWYgdGhlIHZhbHVlcworICAgICAqIGFyZSBvZiBhIGN1c3RvbSB0eXBlIG9yIG9uZSBub3QgY3VycmVudGx5IHVuZGVyc3Rvb2QgYnkgdGhlIGFuaW1hdGlvbiBzeXN0ZW0uIEN1cnJlbnRseSwKKyAgICAgKiBvbmx5IHZhbHVlcyBvZiB0eXBlIGZsb2F0LCBkb3VibGUsIGFuZCBpbnQgKGFuZCB0aGVpciBPYmplY3QgZXF1aXZhbGVudHMsIEZsb2F0LCBEb3VibGUsCisgICAgICogYW5kIEludGVnZXIpIGFyZSAgY29ycmVjdGx5IGludGVycG9sYXRlZDsgYWxsIG90aGVyIHR5cGVzIHJlcXVpcmUgc2V0dGluZyBhIFR5cGVFdmFsdWF0b3IuCisgICAgICogQHBhcmFtIGV2YWx1YXRvcgorICAgICAqLworCXB1YmxpYyB2b2lkIHNldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yIGV2YWx1YXRvcikgeworICAgICAgICBtRXZhbHVhdG9yID0gZXZhbHVhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGV2YWx1YXRvciBzZXQgdXAgZm9yCisgICAgICogdGhpcyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFZhbHVlQW5pbWF0b3IuYW5pbWF0ZVZhbHVlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGVsYXBzZWQsIGludGVycG9sYXRlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqIEByZXR1cm4gVGhlIGNhbGN1bGF0ZWQgdmFsdWUgYXQgdGhpcyBwb2ludCBpbiB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIE9iamVjdCBjYWxjdWxhdGVWYWx1ZShmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBtQW5pbWF0ZWRWYWx1ZSA9IG1LZXlmcmFtZVNldC5nZXRWYWx1ZShmcmFjdGlvbiwgbUV2YWx1YXRvcik7CisgICAgICAgIHJldHVybiBtQW5pbWF0ZWRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IHRoYXQgaXMgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcyBjYWxjdWxhdGVkCisgICAgICogZHVyaW5nIHRoZSBhbmltYXRpb24uIFNldHRpbmcgdGhlIHNldHRlciBtZXRob2QgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3VwcGx5aW5nIGEKKyAgICAgKiB7QGxpbmsgI3NldFByb3BlcnR5TmFtZShTdHJpbmcpIHByb3BlcnR5TmFtZX0gZnJvbSB3aGljaCB0aGUgbWV0aG9kIGlzIGRlcml2ZWQuIFRoaXMKKyAgICAgKiBhcHByb2FjaCBpcyBtb3JlIGRpcmVjdCwgYW5kIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gYSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0aGF0IGRvZXMKKyAgICAgKiBub3QgY29ycmVzcG9uZCB0byB0aGUgY29udmVudGlvbiBvZiA8Y29kZT5zZXROYW1lKCk8L2NvZGU+LiBGb3IgZXhhbXBsZSwgaWYgYSBmdW5jdGlvbgorICAgICAqIGNhbGxlZCA8Y29kZT5vZmZzZXQoKTwvY29kZT4gaXMgdG8gYmUgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcywgdGhlcmUgaXMgbm8gd2F5CisgICAgICogdG8gdGVsbCA8Y29kZT5PYmplY3RBbmltYXRvcjwvY29kZT4gaG93IHRvIGNhbGwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgdGhyb3VnaCBhIHByb3BlcnR5CisgICAgICogbmFtZSwgc28gYSBzZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBzdXBwbGllZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBzZXR0ZXIgZnVuY3Rpb24gbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXR0ZXIgVGhlIHNldHRlciBtZXRob2QgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXIoTWV0aG9kIHNldHRlcikgeworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzIGNhbGN1bGF0ZWQKKyAgICAgKiBkdXJpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldFNldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB0byBnZXQgdW5zdXBwbGllZCA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yCisgICAgICogPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcy4gU2V0dGluZyB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzdXBwbHlpbmcgYQorICAgICAqIHtAbGluayAjc2V0UHJvcGVydHlOYW1lKFN0cmluZykgcHJvcGVydHlOYW1lfSBmcm9tIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVyaXZlZC4gVGhpcworICAgICAqIGFwcHJvYWNoIGlzIG1vcmUgZGlyZWN0LCBhbmQgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBhIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRoYXQgZG9lcworICAgICAqIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb252ZW50aW9uIG9mIDxjb2RlPnNldE5hbWUoKTwvY29kZT4uIEZvciBleGFtcGxlLCBpZiBhIGZ1bmN0aW9uCisgICAgICogY2FsbGVkIDxjb2RlPm9mZnNldCgpPC9jb2RlPiBpcyB0byBiZSBjYWxsZWQgdG8gZ2V0IGFuIGluaXRpYWwgdmFsdWUsIHRoZXJlIGlzIG5vIHdheQorICAgICAqIHRvIHRlbGwgPGNvZGU+T2JqZWN0QW5pbWF0b3I8L2NvZGU+IGhvdyB0byBjYWxsIHRoYXQgZnVuY3Rpb24gc2ltcGx5IHRocm91Z2ggYSBwcm9wZXJ0eQorICAgICAqIG5hbWUsIHNvIGEgZ2V0dGVyIG1ldGhvZCBzaG91bGQgYmUgc3VwcGxpZWQgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGV0aGVyIHN1cHBsaWVkIGhlcmUgb3IgZGVyaXZlZAorICAgICAqIGZyb20gdGhlIHByb3BlcnR5IG5hbWUsIGlmIG9uZSBvZiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yIDxjb2RlPnZhbHVlVG88L2NvZGU+IGFyZQorICAgICAqIG51bGwuIElmIGJvdGggb2YgdGhvc2UgdmFsdWVzIGFyZSBub24tbnVsbCwgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIGdldCBvbmUgb2YgdGhlCisgICAgICogdmFsdWVzIGFuZCB0aGUgZ2V0dGVyIGlzIG5vdCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIGdldHRlciBmdW5jdGlvbiBtdXN0IHJldHVybiB0aGUgc2FtZSBwYXJhbWV0ZXIgdHlwZSBhcyB0aGUKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IGFuZCA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzICh3aGljaGV2ZXIgb2YgdGhlbSBhcmUKKyAgICAgKiBub24tbnVsbCksIG90aGVyd2lzZSB0aGUgY2FsbCB0byB0aGUgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwgZmFpbC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2V0dGVyIFRoZSBnZXR0ZXIgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB0byBnZXQgaW5pdGlhbCBhbmltYXRpb24gdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdldHRlcihNZXRob2QgZ2V0dGVyKSB7CisgICAgICAgIG1HZXR0ZXIgPSBnZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB0byBnZXQgdW5zdXBwbGllZCA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yCisgICAgICogPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldEdldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1HZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHNldHRlciBmdW5jdGlvbiBkZXJpdmVkIGZyb20gdGhpcyBwcm9wZXJ0eSBuYW1lCisgICAgICogbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24sIGNhbGxlZCBieSBWYWx1ZUFuaW1hdG9yIGFuZCBPYmplY3RBbmltYXRvciwgdG8gcmV0cmlldmUgdGhlIHZhbHVlCisgICAgICogbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGluIGNhbGN1bGF0ZVZhbHVlKCkuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKCkgeworICAgICAgICByZXR1cm4gbUFuaW1hdGVkVmFsdWU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9SR0JFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9SR0JFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWUwYWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgZXZhbHVhdG9yIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdHlwZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gaW50ZWdlcgorICogdmFsdWVzIHRoYXQgcmVwcmVzZW50IEFSR0IgY29sb3JzLgorICovCitwdWJsaWMgY2xhc3MgUkdCRXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW4tYmV0d2VlbiB2YWx1ZSBmb3IgYSBjb2xvcgorICAgICAqIGdpdmVuIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcyBpbiB0aGUgZm91cgorICAgICAqIGJ5dGVzIG9mIHRoZSAzMi1iaXQgaW50LiBFYWNoIGNoYW5uZWwgaXMgc2VwYXJhdGVseSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQKKyAgICAgKiBhbmQgdGhlIHJlc3VsdGluZyBjYWxjdWxhdGVkIHZhbHVlcyBhcmUgcmVjb21iaW5lZCBpbnRvIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgQSAzMi1iaXQgaW50IHZhbHVlIHJlcHJlc2VudGluZyBjb2xvcnMgaW4gdGhlCisgICAgICogc2VwYXJhdGUgYnl0ZXMgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSBBIDMyLWJpdCBpbnQgdmFsdWUgcmVwcmVzZW50aW5nIGNvbG9ycyBpbiB0aGUKKyAgICAgKiBzZXBhcmF0ZSBieXRlcyBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHJldHVybiBBIHZhbHVlIHRoYXQgaXMgY2FsY3VsYXRlZCB0byBiZSB0aGUgbGluZWFybHkgaW50ZXJwb2xhdGVkCisgICAgICogcmVzdWx0LCBkZXJpdmVkIGJ5IHNlcGFyYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGludG8gc2VwYXJhdGUKKyAgICAgKiBjb2xvciBjaGFubmVscyBhbmQgaW50ZXJwb2xhdGluZyBlYWNoIG9uZSBzZXBhcmF0ZWx5LCByZWNvbWJpbmluZyB0aGUKKyAgICAgKiByZXN1bHRpbmcgdmFsdWVzIGluIHRoZSBzYW1lIHdheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgIGludCBzdGFydEludCA9IChJbnRlZ2VyKSBzdGFydFZhbHVlOworICAgICAgICBpbnQgc3RhcnRBID0gKHN0YXJ0SW50ID4+IDI0KTsKKyAgICAgICAgaW50IHN0YXJ0UiA9IChzdGFydEludCA+PiAxNikgJiAweGZmOworICAgICAgICBpbnQgc3RhcnRHID0gKHN0YXJ0SW50ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaW50IHN0YXJ0QiA9IHN0YXJ0SW50ICYgMHhmZjsKKworICAgICAgICBpbnQgZW5kSW50ID0gKEludGVnZXIpIGVuZFZhbHVlOworICAgICAgICBpbnQgZW5kQSA9IChlbmRJbnQgPj4gMjQpOworICAgICAgICBpbnQgZW5kUiA9IChlbmRJbnQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgaW50IGVuZEcgPSAoZW5kSW50ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaW50IGVuZEIgPSBlbmRJbnQgJiAweGZmOworCisgICAgICAgIHJldHVybiAoaW50KSgoc3RhcnRBICsgKGludCkoZnJhY3Rpb24gKiAoZW5kQSAtIHN0YXJ0QSkpKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgIChpbnQpKChzdGFydFIgKyAoaW50KShmcmFjdGlvbiAqIChlbmRSIC0gc3RhcnRSKSkpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0RyArIChpbnQpKGZyYWN0aW9uICogKGVuZEcgLSBzdGFydEcpKSkgPDwgOCkgfAorICAgICAgICAgICAgICAgIChpbnQpKChzdGFydEIgKyAoaW50KShmcmFjdGlvbiAqIChlbmRCIC0gc3RhcnRCKSkpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1RpbWVJbnRlcnBvbGF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UaW1lSW50ZXJwb2xhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3OTVhOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UaW1lSW50ZXJwb2xhdG9yLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogQSB0aW1lIGludGVycG9sYXRvciBkZWZpbmVzIHRoZSByYXRlIG9mIGNoYW5nZSBvZiBhbiBhbmltYXRpb24uIFRoaXMgYWxsb3dzIGFuaW1hdGlvbnMKKyAqIHRvIGhhdmUgbm9uLWxpbmVhciBtb3Rpb24sIHN1Y2ggYXMgYWNjZWxlcmF0aW9uIGFuZCBkZWNlbGVyYXRpb24uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGltZUludGVycG9sYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBNYXBzIGEgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBlbGFwc2VkIGZyYWNpdG9uIG9mIGFuIGFuaW1hdGlvbiB0byBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cworICAgICAqIHRoZSBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24uIFRoaXMgaW50ZXJwb2xhdGVkIHZhbHVlIGlzIHRoZW4gbXVsdGlwbGllZCBieSB0aGUgY2hhbmdlIGluCisgICAgICogdmFsdWUgb2YgYW4gYW5pbWF0aW9uIHRvIGRlcml2ZSB0aGUgYW5pbWF0ZWQgdmFsdWUgYXQgdGhlIGN1cnJlbnQgZWxhcHNlZCBhbmltYXRpb24gdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4wIGluZGljYXRpbmcgb3VyIGN1cnJlbnQgcG9pbnQKKyAgICAgKiAgICAgICAgaW4gdGhlIGFuaW1hdGlvbiB3aGVyZSAwIHJlcHJlc2VudHMgdGhlIHN0YXJ0IGFuZCAxLjAgcmVwcmVzZW50cworICAgICAqICAgICAgICB0aGUgZW5kCisgICAgICogQHJldHVybiBUaGUgaW50ZXJwb2xhdGlvbiB2YWx1ZS4gVGhpcyB2YWx1ZSBjYW4gYmUgbW9yZSB0aGFuIDEuMCBmb3IKKyAgICAgKiAgICAgICAgIGludGVycG9sYXRvcnMgd2hpY2ggb3ZlcnNob290IHRoZWlyIHRhcmdldHMsIG9yIGxlc3MgdGhhbiAwIGZvcgorICAgICAqICAgICAgICAgaW50ZXJwb2xhdG9ycyB0aGF0IHVuZGVyc2hvb3QgdGhlaXIgdGFyZ2V0cy4KKyAgICAgKi8KKyAgICBmbG9hdCBnZXRJbnRlcnBvbGF0aW9uKGZsb2F0IGlucHV0KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UeXBlRXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVHlwZUV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDkxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVHlwZUV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgdXNlIHdpdGggdGhlIHtAbGluayBWYWx1ZUFuaW1hdG9yI3NldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yKX0gZnVuY3Rpb24uIEV2YWx1YXRvcnMKKyAqIGFsbG93IGRldmVsb3BlcnMgdG8gY3JlYXRlIGFuaW1hdGlvbnMgb24gYXJiaXRyYXJ5IHByb3BlcnR5IHR5cGVzLCBieSBhbGxvd2luZyB0aGVtIHRvIHN1cHBseQorICogY3VzdG9tIGV2YXVsYXRvcnMgZm9yIHR5cGVzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHVuZGVyc3Rvb2QgYW5kIHVzZWQgYnkgdGhlIGFuaW1hdGlvbgorICogc3lzdGVtLgorICoKKyAqIEBzZWUgVmFsdWVBbmltYXRvciNzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvcikKKyAqLworcHVibGljIGludGVyZmFjZSBUeXBlRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVzdWx0IG9mIGxpbmVhcmx5IGludGVycG9sYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCB3aXRoCisgICAgICogPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgcHJvcG9ydGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcy4gVGhlCisgICAgICogY2FsY3VsYXRpb24gaXMgYSBzaW1wbGUgcGFyYW1ldHJpYyBjYWxjdWxhdGlvbjogPGNvZGU+cmVzdWx0ID0geDAgKyB0ICogKHYxIC0gdjApPC9jb2RlPiwKKyAgICAgKiB3aGVyZSA8Y29kZT54MDwvY29kZT4gaXMgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4sIDxjb2RlPngxPC9jb2RlPiBpcyA8Y29kZT5lbmRWYWx1ZTwvY29kZT4sCisgICAgICogYW5kIDxjb2RlPnQ8L2NvZGU+IGlzIDxjb2RlPmZyYWN0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiAgIFRoZSBmcmFjdGlvbiBmcm9tIHRoZSBzdGFydGluZyB0byB0aGUgZW5kaW5nIHZhbHVlcworICAgICAqIEBwYXJhbSBzdGFydFZhbHVlIFRoZSBzdGFydCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlLgorICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1ZhbHVlQW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9WYWx1ZUFuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDJiMTdmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9WYWx1ZUFuaW1hdG9yLmphdmEKQEAgLTAsMCArMSwxMDA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2ltcGxlIHRpbWluZyBlbmdpbmUgZm9yIHJ1bm5pbmcgYW5pbWF0aW9ucworICogd2hpY2ggY2FsY3VsYXRlIGFuaW1hdGVkIHZhbHVlcyBhbmQgc2V0IHRoZW0gb24gdGFyZ2V0IG9iamVjdHMuCisgKgorICogPHA+VGhlcmUgaXMgYSBzaW5nbGUgdGltaW5nIHB1bHNlIHRoYXQgYWxsIGFuaW1hdGlvbnMgdXNlLiBJdCBydW5zIGluIGEKKyAqIGN1c3RvbSBoYW5kbGVyIHRvIGVuc3VyZSB0aGF0IHByb3BlcnR5IGNoYW5nZXMgaGFwcGVuIG9uIHRoZSBVSSB0aHJlYWQuPC9wPgorICoKKyAqIDxwPkJ5IGRlZmF1bHQsIFZhbHVlQW5pbWF0b3IgdXNlcyBub24tbGluZWFyIHRpbWUgaW50ZXJwb2xhdGlvbiwgdmlhIHRoZQorICoge0BsaW5rIEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yfSBjbGFzcywgd2hpY2ggYWNjZWxlcmF0ZXMgaW50byBhbmQgZGVjZWxlcmF0ZXMKKyAqIG91dCBvZiBhbiBhbmltYXRpb24uIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQgYnkgY2FsbGluZworICoge0BsaW5rIFZhbHVlQW5pbWF0b3Ijc2V0SW50ZXJwb2xhdG9yKFRpbWVJbnRlcnBvbGF0b3IpfS48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBWYWx1ZUFuaW1hdG9yPFQ+IGV4dGVuZHMgQW5pbWF0b3IgeworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29uc3RhbnRzCisgICAgICovCisKKyAgICAvKgorICAgICAqIFRoZSBkZWZhdWx0IGFtb3VudCBvZiB0aW1lIGluIG1zIGJldHdlZW4gYW5pbWF0aW9uIGZyYW1lcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9GUkFNRV9ERUxBWSA9IDMwOworCisgICAgLyoqCisgICAgICogTWVzc2FnZXMgc2VudCB0byB0aW1pbmcgaGFuZGxlcjogU1RBUlQgaXMgc2VudCB3aGVuIGFuIGFuaW1hdGlvbiBmaXJzdCBiZWdpbnMsIEZSQU1FIGlzIHNlbnQKKyAgICAgKiBieSB0aGUgaGFuZGxlciB0byBpdHNlbGYgdG8gcHJvY2VzcyB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFUSU9OX1NUQVJUID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFUSU9OX0ZSQU1FID0gMTsKKworICAgIC8qKgorICAgICAqIFZhbHVlcyB1c2VkIHdpdGggaW50ZXJuYWwgdmFyaWFibGUgbVBsYXlpbmdTdGF0ZSB0byBpbmRpY2F0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbgorICAgICAqIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RPUFBFRCAgICA9IDA7IC8vIE5vdCB5ZXQgcGxheWluZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HICAgID0gMTsgLy8gUGxheWluZyBub3JtYWxseQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUxFRCAgID0gMjsgLy8gY2FuY2VsKCkgY2FsbGVkIC0gbmVlZCB0byBlbmQgaXQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5ERUQgICAgICA9IDM7IC8vIGVuZCgpIGNhbGxlZCAtIG5lZWQgdG8gZW5kIGl0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRUtFRCAgICAgPSA0OyAvLyBTZWVrZWQgdG8gc29tZSB0aW1lIHZhbHVlCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCB2YXJpYWJsZXMKKyAgICAgKiBOT1RFOiBUaGlzIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBjbG9uZSgpIG1ldGhvZCwgbWFraW5nIGEgZGVlcCBjb3B5IG9mIGFueSByZWZlcmVuY2VkCisgICAgICogb2JqZWN0cy4gQXMgb3RoZXIgbm9uLXRyaXZpYWwgZmllbGRzIGFyZSBhZGRlZCB0byB0aGlzIGNsYXNzLCBtYWtlIHN1cmUgdG8gYWRkIGxvZ2ljCisgICAgICogdG8gY2xvbmUoKSB0byBtYWtlIGRlZXAgY29waWVzIG9mIHRoZW0uCisgICAgICovCisKKyAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGF0IHRoZSBhbmltYXRpb24ncyBhbmltYXRlRnJhbWUoKSBtZXRob2QgaXMgY2FsbGVkLiBUaGlzIHRpbWUgaXMgdXNlZCB0bworICAgIC8vIGRldGVybWluZSBlbGFwc2VkIHRpbWUgKGFuZCB0aGVyZWZvcmUgdGhlIGVsYXBzZWQgZnJhY3Rpb24pIGluIHN1YnNlcXVlbnQgY2FsbHMKKyAgICAvLyB0byBhbmltYXRlRnJhbWUoKQorICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOworCisgICAgLyoqCisgICAgICogU2V0IHdoZW4gc2V0Q3VycmVudFBsYXlUaW1lKCkgaXMgY2FsbGVkLiBJZiBuZWdhdGl2ZSwgYW5pbWF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc2Vla2VkCisgICAgICogdG8gYSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbVNlZWtUaW1lID0gLTE7CisKKyAgICAvLyBUaGUgc3RhdGljIHNBbmltYXRpb25IYW5kbGVyIHByb2Nlc3NlcyB0aGUgaW50ZXJuYWwgdGltaW5nIGxvb3Agb24gd2hpY2ggYWxsIGFuaW1hdGlvbnMKKyAgICAvLyBhcmUgYmFzZWQKKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRpb25IYW5kbGVyIHNBbmltYXRpb25IYW5kbGVyOworCisgICAgLy8gVGhlIHN0YXRpYyBsaXN0IG9mIGFsbCBhY3RpdmUgYW5pbWF0aW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPiBzQW5pbWF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4oKTsKKworICAgIC8vIFRoZSBzZXQgb2YgYW5pbWF0aW9ucyB0byBiZSBzdGFydGVkIG9uIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPiBzUGVuZGluZ0FuaW1hdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+KCk7CisKKyAgICAvLyBUaGUgdGltZSBpbnRlcnBvbGF0b3IgdG8gYmUgdXNlZCBpZiBub25lIGlzIHNldCBvbiB0aGUgYW5pbWF0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZUludGVycG9sYXRvciBzRGVmYXVsdEludGVycG9sYXRvciA9CisgICAgICAgICAgICBuZXcgQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKworICAgIC8vIHR5cGUgZXZhbHVhdG9ycyBmb3IgdGhlIHRocmVlIHByaW1pdGl2ZSB0eXBlcyBoYW5kbGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNJbnRFdmFsdWF0b3IgPSBuZXcgSW50RXZhbHVhdG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZUV2YWx1YXRvciBzRmxvYXRFdmFsdWF0b3IgPSBuZXcgRmxvYXRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNEb3VibGVFdmFsdWF0b3IgPSBuZXcgRG91YmxlRXZhbHVhdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBpcyBjdXJyZW50bHkgcGxheWluZyBpbiByZXZlcnNlLiBUaGlzIGNhdXNlcyB0aGUKKyAgICAgKiBlbGFwc2VkIGZyYWN0aW9uIHRvIGJlIGludmVydGVkIHRvIGNhbGN1bGF0ZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUGxheWluZ0JhY2t3YXJkcyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhpcyB2YXJpYWJsZSB0cmFja3MgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIHRoYXQgaXMgcGxheWluZy4gV2hlbiBtQ3VycmVudEl0ZXJhdGlvbiBleGNlZWRzIHRoZQorICAgICAqIHJlcGVhdENvdW50IChpZiByZXBlYXRDb3VudCE9SU5GSU5JVEUpLCB0aGUgYW5pbWF0aW9uIGVuZHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtQ3VycmVudEl0ZXJhdGlvbiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUcmFja3Mgd2hldGhlciBhIHN0YXJ0RGVsYXknZCBhbmltYXRpb24gaGFzIGJlZ3VuIHBsYXlpbmcgdGhyb3VnaCB0aGUgc3RhcnREZWxheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWREZWxheSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVHJhY2tzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBhbmltYXRpb24gYmVnYW4gcGxheWluZyB0aHJvdWdoIGl0cyBzdGFydERlbGF5LiBUaGlzIGlzCisgICAgICogZGlmZmVyZW50IGZyb20gdGhlIG1TdGFydFRpbWUgdmFyaWFibGUsIHdoaWNoIGlzIHVzZWQgdG8gdHJhY2sgd2hlbiB0aGUgYW5pbWF0aW9uIGJlY2FtZQorICAgICAqIGFjdGl2ZSAod2hpY2ggaXMgd2hlbiB0aGUgc3RhcnREZWxheSBleHBpcmVkIGFuZCB0aGUgYW5pbWF0aW9uIHdhcyBhZGRlZCB0byB0aGUgYWN0aXZlCisgICAgICogYW5pbWF0aW9ucyBsaXN0KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbURlbGF5U3RhcnRUaW1lOworCisgICAgLyoqCisgICAgICogRmxhZyB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFuaW1hdGlvbi4gVXNlZCB0byBmaWd1cmUgb3V0IHdoZW4gdG8gc3RhcnQKKyAgICAgKiBhbiBhbmltYXRpb24gKGlmIHN0YXRlID09IFNUT1BQRUQpLiBBbHNvIHVzZWQgdG8gZW5kIGFuIGFuaW1hdGlvbiB0aGF0CisgICAgICogaGFzIGJlZW4gY2FuY2VsKCknZCBvciBlbmQoKSdkIHNpbmNlIHRoZSBsYXN0IGFuaW1hdGlvbiBmcmFtZS4gUG9zc2libGUgdmFsdWVzIGFyZQorICAgICAqIFNUT1BQRUQsIFJVTk5JTkcsIEVOREVELCBDQU5DRUxFRC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtUGxheWluZ1N0YXRlID0gU1RPUFBFRDsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIGNvbGxlY3Rpb25zIHVzZWQgdG8gYXZvaWQgc2V0IGNvbGxpc2lvbnMgYXMgYW5pbWF0aW9ucyBzdGFydCBhbmQgZW5kIHdoaWxlIGJlaW5nCisgICAgICogcHJvY2Vzc2VkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPiBzRW5kaW5nQW5pbXMgPSBuZXcgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+IHNEZWxheWVkQW5pbXMgPSBuZXcgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+IHNSZWFkeUFuaW1zID0gbmV3IEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPigpOworCisgICAgLyoqCisgICAgICogRmxhZyB0aGF0IGRlbm90ZXMgd2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIHNldCB1cCBhbmQgcmVhZHkgdG8gZ28uIFVzZWQgdG8KKyAgICAgKiBzZXQgdXAgYW5pbWF0aW9uIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLgorICAgICAqLworICAgIGJvb2xlYW4gbUluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICAvLworICAgIC8vIEJhY2tpbmcgdmFyaWFibGVzCisgICAgLy8KKworICAgIC8vIEhvdyBsb25nIHRoZSBhbmltYXRpb24gc2hvdWxkIGxhc3QgaW4gbXMKKyAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uOworCisgICAgLy8gVGhlIGFtb3VudCBvZiB0aW1lIGluIG1zIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIgc3RhcnQoKSBpcyBjYWxsZWQKKyAgICBwcml2YXRlIGxvbmcgbVN0YXJ0RGVsYXkgPSAwOworCisgICAgLy8gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBhbmltYXRpb24gZnJhbWVzCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzRnJhbWVEZWxheSA9IERFRkFVTFRfRlJBTUVfREVMQVk7CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmltYXRpb24gd2lsbCByZXBlYXQuIFRoZSBkZWZhdWx0IGlzIDAsIHdoaWNoIG1lYW5zIHRoZSBhbmltYXRpb24KKyAgICAvLyB3aWxsIHBsYXkgb25seSBvbmNlCisgICAgcHJpdmF0ZSBpbnQgbVJlcGVhdENvdW50ID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHJlcGV0aXRpb24gdGhhdCB3aWxsIG9jY3VyIHdoZW4gcmVwZWF0TW9kZSBpcyBub256ZXJvLiBSRVNUQVJUIG1lYW5zIHRoZQorICAgICAqIGFuaW1hdGlvbiB3aWxsIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyBvbiBldmVyeSBuZXcgY3ljbGUuIFJFVkVSU0UgbWVhbnMgdGhlIGFuaW1hdGlvbgorICAgICAqIHdpbGwgcmV2ZXJzZSBkaXJlY3Rpb25zIG9uIGVhY2ggaXRlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1SZXBlYXRNb2RlID0gUkVTVEFSVDsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGludGVycG9sYXRvciB0byBiZSB1c2VkLiBUaGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uIHdpbGwgYmUgcGFzc2VkCisgICAgICogdGhyb3VnaCB0aGlzIGludGVycG9sYXRvciB0byBjYWxjdWxhdGUgdGhlIGludGVycG9sYXRlZCBmcmFjdGlvbiwgd2hpY2ggaXMgdGhlbiB1c2VkIHRvCisgICAgICogY2FsY3VsYXRlIHRoZSBhbmltYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBUaW1lSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3IgPSBzRGVmYXVsdEludGVycG9sYXRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRvIGJlIHNlbnQgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+IG1VcGRhdGVMaXN0ZW5lcnMgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5L3ZhbHVlIHNldHMgYmVpbmcgYW5pbWF0ZWQuCisgICAgICovCisgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXJbXSBtVmFsdWVzOworCisgICAgLyoqCisgICAgICogQSBoYXNobWFwIG9mIHRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGxvb2t1cCBhbmltYXRlZCB2YWx1ZXMKKyAgICAgKiBieSBwcm9wZXJ0eSBuYW1lIGR1cmluZyBjYWxscyB0byBnZXRBbmltYXRlZFZhbHVlKFN0cmluZykuCisgICAgICovCisgICAgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5VmFsdWVzSG9sZGVyPiBtVmFsdWVzTWFwOworCisgICAgLyoqCisgICAgICogUHVibGljIGNvbnN0YW50cworICAgICAqLworCisgICAgLyoqCisgICAgICogV2hlbiB0aGUgYW5pbWF0aW9uIHJlYWNoZXMgdGhlIGVuZCBhbmQgPGNvZGU+cmVwZWF0Q291bnQ8L2NvZGU+IGlzIElORklOSVRFCisgICAgICogb3IgYSBwb3NpdGl2ZSB2YWx1ZSwgdGhlIGFuaW1hdGlvbiByZXN0YXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVEFSVCA9IDE7CisgICAgLyoqCisgICAgICogV2hlbiB0aGUgYW5pbWF0aW9uIHJlYWNoZXMgdGhlIGVuZCBhbmQgPGNvZGU+cmVwZWF0Q291bnQ8L2NvZGU+IGlzIElORklOSVRFCisgICAgICogb3IgYSBwb3NpdGl2ZSB2YWx1ZSwgdGhlIGFuaW1hdGlvbiByZXZlcnNlcyBkaXJlY3Rpb24gb24gZXZlcnkgaXRlcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFVkVSU0UgPSAyOworICAgIC8qKgorICAgICAqIFRoaXMgdmFsdWUgdXNlZCB1c2VkIHdpdGggdGhlIHtAbGluayAjc2V0UmVwZWF0Q291bnQoaW50KX0gcHJvcGVydHkgdG8gcmVwZWF0CisgICAgICogdGhlIGFuaW1hdGlvbiBpbmRlZmluaXRlbHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GSU5JVEUgPSAtMTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgVmFsdWVBbmltYXRvciBvYmplY3QuIFRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBwcmltYXJpbHkgZm9yCisgICAgICogdXNlIGludGVybmFsbHk7IHRoZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2hpY2ggdGFrZSBwYXJhbWV0ZXJzIGFyZSBtb3JlIGdlbmVyYWxseQorICAgICAqIHVzZWZ1bC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWVBbmltYXRvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFZhbHVlQW5pbWF0b3Igb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBhbmQgc2V0IG9mCisgICAgICogdmFsdWVzLiBJZiB0aGUgdmFsdWVzIGFyZSBhIHNldCBvZiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLCB0aGVuIHRoZXNlIG9iamVjdHMKKyAgICAgKiBkZWZpbmUgdGhlIHBvdGVudGlhbGx5IG11bHRpcGxlIHByb3BlcnRpZXMgYmVpbmcgYW5pbWF0ZWQgYW5kIHRoZSB2YWx1ZXMgdGhlIHByb3BlcnRpZXMgYXJlCisgICAgICogYW5pbWF0ZWQgYmV0d2Vlbi4gT3RoZXJ3aXNlLCB0aGUgdmFsdWVzIGRlZmluZSBhIHNpbmdsZSBzZXQgb2YgdmFsdWVzIGFuaW1hdGVkIGJldHdlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uIElmIHRoZXNlIHZhbHVlcyBhcmUgbm90CisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlbiB0aGVyZSBzaG91bGQgYmUgbW9yZSB0aGFuIG9uZSB2YWx1ZSwgc2luY2UgdGhlIHZhbHVlcworICAgICAqIGRldGVybWluZSB0aGUgaW50ZXJ2YWwgdG8gYW5pbWF0ZSBiZXR3ZWVuLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZUFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIFQuLi52YWx1ZXMpIHsKKyAgICAgICAgbUR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZXMsIHBlciBwcm9wZXJ0eSwgYmVpbmcgYW5pbWF0ZWQgYmV0d2Vlbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseQorICAgICAqIGJ5IHRoZSBjb25zdHJ1Y3RvcnMgb2YgVmFsdWVBbmltYXRvciB0aGF0IHRha2UgYSBsaXN0IG9mIHZhbHVlcy4gQnV0IGFuIFZhbHVlQW5pbWF0b3IgY2FuCisgICAgICogYmUgY29uc3RydWN0ZWQgd2l0aG91dCB2YWx1ZXMgYW5kIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gc2V0IHRoZSB2YWx1ZXMgbWFudWFsbHkKKyAgICAgKiBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcywgcGVyIHByb3BlcnR5LCBiZWluZyBhbmltYXRlZCBiZXR3ZWVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhQcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7CisgICAgICAgIG1WYWx1ZXMgPSB2YWx1ZXM7CisgICAgICAgIG1WYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5VmFsdWVzSG9sZGVyPihudW1WYWx1ZXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSAoUHJvcGVydHlWYWx1ZXNIb2xkZXIpIHZhbHVlc1tpXTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucHV0KHZhbHVlc0hvbGRlci5nZXRQcm9wZXJ0eU5hbWUoKSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXcgcHJvcGVydHkvdmFsdWVzL3RhcmdldCBzaG91bGQgY2F1c2UgcmUtaW5pdGlhbGl6YXRpb24gcHJpb3IgdG8gc3RhcnRpbmcKKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWVzIHRoYXQgdGhpcyBWYWx1ZUFuaW1hdG9yIGFuaW1hdGVzIGJldHdlZW4uIFRoZXNlIHZhbHVlcyBhcmUgc3RvcmVkIGluCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgZXZlbiBpZiB0aGUgVmFsdWVBbmltYXRvciB3YXMgY3JlYXRlZCB3aXRoIGEgc2ltcGxlIGxpc3QKKyAgICAgKiBvZiB2YWx1ZSBvYmplY3RzIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFByb3BlcnR5VmFsdWVzSG9sZGVyW10gQW4gYXJyYXkgb2YgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyB3aGljaCBob2xkIHRoZQorICAgICAqIHZhbHVlcywgcGVyIHByb3BlcnR5LCB0aGF0IGRlZmluZSB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdIGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2VlbiBmb3IgdGhpcyBhbmltYXRpb24uIElmIDxjb2RlPnZhbHVlczwvY29kZT4gaXMKKyAgICAgKiBhIHNldCBvZiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLCB0aGVzZSBvYmplY3RzIHdpbGwgYmVjb21lIHRoZSBzZXQgb2YgcHJvcGVydGllcworICAgICAqIGFuaW1hdGVkIGFuZCB0aGUgdmFsdWVzIHRoYXQgdGhvc2UgcHJvcGVydGllcyBhcmUgYW5pbWF0ZWQgYmV0d2Vlbi4gT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZAorICAgICAqIHdpbGwgc2V0IG9ubHkgb25lIHNldCBvZiB2YWx1ZXMgZm9yIHRoZSBWYWx1ZUFuaW1hdG9yLiBBbHNvLCBpZiB0aGUgdmFsdWVzIGFyZSBub3QKKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIGFuZCBpZiB0aGVyZSBhcmUgYWxyZWFkeSBtdWx0aXBsZSBzZXRzIG9mCisgICAgICogdmFsdWVzIGRlZmluZWQgZm9yIHRoaXMgVmFsdWVBbmltYXRvciB2aWEKKyAgICAgKiBtb3JlIHRoYW4gb25lIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSB2YWx1ZXMgZm9yCisgICAgICogdGhlIGZpcnN0IG9mIHRob3NlIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXMgPT0gbnVsbCB8fCBtVmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZXMobmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW117CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcigiIiwgKE9iamVjdFtdKXZhbHVlcyl9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IG1WYWx1ZXNbMF07CisgICAgICAgICAgICB2YWx1ZXNIb2xkZXIuc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV3IHByb3BlcnR5L3ZhbHVlcy90YXJnZXQgc2hvdWxkIGNhdXNlIHJlLWluaXRpYWxpemF0aW9uIHByaW9yIHRvIHN0YXJ0aW5nCisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBmaXJzdCBhbmltYXRpb24KKyAgICAgKiBmcmFtZSBvZiBhbiBhbmltYXRpb24uIElmIHRoZXJlIGlzIGEgbm9uemVybyA8Y29kZT5zdGFydERlbGF5PC9jb2RlPiwgdGhlCisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoYXQgZGVsYXkgZW5kcy4KKyAgICAgKiBJdCB0YWtlcyBjYXJlIG9mIHRoZSBmaW5hbCBpbml0aWFsaXphdGlvbiBzdGVwcyBmb3IgdGhlCisgICAgICogYW5pbWF0aW9uLgorICAgICAqCisgICAgICogIDxwPk92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCB0aGUgc3VwZXJjbGFzcyBtZXRob2QgdG8gZW5zdXJlCisgICAgICogIHRoYXQgaW50ZXJuYWwgbWVjaGFuaXNtcyBmb3IgdGhlIGFuaW1hdGlvbiBhcmUgc2V0IHVwIGNvcnJlY3RseS48L3A+CisgICAgICovCisgICAgdm9pZCBpbml0QW5pbWF0aW9uKCkgeworICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgICAgIG1WYWx1ZXNbaV0uaW5pdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1cnJlbnRJdGVyYXRpb24gPSAwOworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHVyYXRpb24obG9uZyBkdXJhdGlvbikgeworICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtRHVyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGFuaW1hdGlvbiB0byB0aGUgc3BlY2lmaWVkIHBvaW50IGluIHRpbWUuIFRoaXMgdGltZSBzaG91bGQKKyAgICAgKiBiZSBiZXR3ZWVuIDAgYW5kIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uLCBpbmNsdWRpbmcgYW55IHJlcGV0aXRpb24uIElmCisgICAgICogdGhlIGFuaW1hdGlvbiBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQsIHRoZW4gaXQgd2lsbCBub3QgYWR2YW5jZSBmb3J3YXJkIGFmdGVyIGl0IGlzCisgICAgICogc2V0IHRvIHRoaXMgdGltZTsgaXQgd2lsbCBzaW1wbHkgc2V0IHRoZSB0aW1lIHRvIHRoaXMgdmFsdWUgYW5kIHBlcmZvcm0gYW55IGFwcHJvcHJpYXRlCisgICAgICogYWN0aW9ucyBiYXNlZCBvbiB0aGF0IHRpbWUuIElmIHRoZSBhbmltYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nLCB0aGVuIHNldEN1cnJlbnRQbGF5VGltZSgpCisgICAgICogd2lsbCBzZXQgdGhlIGN1cnJlbnQgcGxheWluZyB0aW1lIHRvIHRoaXMgdmFsdWUgYW5kIGNvbnRpbnVlIHBsYXlpbmcgZnJvbSB0aGF0IHBvaW50LgorICAgICAqCisgICAgICogQHBhcmFtIHBsYXlUaW1lIFRoZSB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdoaWNoIHRoZSBhbmltYXRpb24gaXMgYWR2YW5jZWQgb3IgcmV3b3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UGxheVRpbWUobG9uZyBwbGF5VGltZSkgeworICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOworICAgICAgICBpZiAobVBsYXlpbmdTdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICBtU2Vla1RpbWUgPSBwbGF5VGltZTsKKyAgICAgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBTRUVLRUQ7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lIC0gcGxheVRpbWU7CisgICAgICAgIGFuaW1hdGlvbkZyYW1lKGN1cnJlbnRUaW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gdGltZSwgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQKKyAgICAgKiB0aW1lIG1pbnVzIHRoZSB0aW1lIHRoYXQgdGhlIGFuaW1hdGlvbiBzdGFydGVkLiBBbiBhbmltYXRpb24gdGhhdCBpcyBub3QgeWV0IHN0YXJ0ZWQgd2lsbAorICAgICAqIHJldHVybiBhIHZhbHVlIG9mIHplcm8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRpbWUgb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UGxheVRpbWUoKSB7CisgICAgICAgIGlmICghbUluaXRpYWxpemVkIHx8IG1QbGF5aW5nU3RhdGUgPT0gU1RPUFBFRCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCkgLSBtU3RhcnRUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY3VzdG9tLCBzdGF0aWMgaGFuZGxlciBoYW5kbGVzIHRoZSB0aW1pbmcgcHVsc2UgdGhhdCBpcyBzaGFyZWQgYnkKKyAgICAgKiBhbGwgYWN0aXZlIGFuaW1hdGlvbnMuIFRoaXMgYXBwcm9hY2ggZW5zdXJlcyB0aGF0IHRoZSBzZXR0aW5nIG9mIGFuaW1hdGlvbgorICAgICAqIHZhbHVlcyB3aWxsIGhhcHBlbiBvbiB0aGUgVUkgdGhyZWFkIGFuZCB0aGF0IGFsbCBhbmltYXRpb25zIHdpbGwgc2hhcmUKKyAgICAgKiB0aGUgc2FtZSB0aW1lcyBmb3IgY2FsY3VsYXRpbmcgdGhlaXIgdmFsdWVzLCB3aGljaCBtYWtlcyBzeW5jaHJvbml6aW5nCisgICAgICogYW5pbWF0aW9ucyBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFuaW1hdGlvbkhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZXJlIGFyZSBvbmx5IHR3byBtZXNzYWdlcyB0aGF0IHdlIGNhcmUgYWJvdXQ6IEFOSU1BVElPTl9TVEFSVCBhbmQKKyAgICAgICAgICogQU5JTUFUSU9OX0ZSQU1FLiBUaGUgU1RBUlQgbWVzc2FnZSBpcyBzZW50IHdoZW4gYW4gYW5pbWF0aW9uJ3Mgc3RhcnQoKQorICAgICAgICAgKiBtZXRob2QgaXMgY2FsbGVkLiBJdCBjYW5ub3Qgc3RhcnQgc3luY2hyb25vdXNseSB3aGVuIHN0YXJ0KCkgaXMgY2FsbGVkCisgICAgICAgICAqIGJlY2F1c2UgdGhlIGNhbGwgbWF5IGJlIG9uIHRoZSB3cm9uZyB0aHJlYWQsIGFuZCBpdCB3b3VsZCBhbHNvIG5vdCBiZQorICAgICAgICAgKiBzeW5jaHJvbml6ZWQgd2l0aCBvdGhlciBhbmltYXRpb25zIGJlY2F1c2UgaXQgd291bGQgbm90IHN0YXJ0IG9uIGEgY29tbW9uCisgICAgICAgICAqIHRpbWluZyBwdWxzZS4gU28gZWFjaCBhbmltYXRpb24gc2VuZHMgYSBTVEFSVCBtZXNzYWdlIHRvIHRoZSBoYW5kbGVyLCB3aGljaAorICAgICAgICAgKiBjYXVzZXMgdGhlIGhhbmRsZXIgdG8gcGxhY2UgdGhlIGFuaW1hdGlvbiBvbiB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgcXVldWUgYW5kCisgICAgICAgICAqIHN0YXJ0IHByb2Nlc3NpbmcgZnJhbWVzIGZvciB0aGF0IGFuaW1hdGlvbi4KKyAgICAgICAgICogVGhlIEZSQU1FIG1lc3NhZ2UgaXMgdGhlIG9uZSB0aGF0IGlzIHNlbnQgb3ZlciBhbmQgb3ZlciB3aGlsZSB0aGVyZSBhcmUgYW55CisgICAgICAgICAqIGFjdGl2ZSBhbmltYXRpb25zIHRvIHByb2Nlc3MuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgYm9vbGVhbiBjYWxsQWdhaW4gPSB0cnVlOworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhdm9pZCBzZW5kaW5nIGZyYW1lIG1lc3NhZ2Ugd2hlbiBzdGFydGluZyBpZiB3ZQorICAgICAgICAgICAgICAgIC8vIHdlcmUgYWxyZWFkeSBydW5uaW5nPworICAgICAgICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICBpZiAoc0FuaW1hdGlvbnMuc2l6ZSgpID4gMCB8fCBzRGVsYXllZEFuaW1zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxBZ2FpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHBlbmRpbmdBbmltcyBob2xkcyBhbnkgYW5pbWF0aW9ucyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gY2xlYXIgc1BlbmRpbmdBbmltYXRpb25zLCBidXQgc3RhcnRpbmcgYW5pbWF0aW9uIG1heQorICAgICAgICAgICAgICAgICAgICAvLyBjYXVzZSBtb3JlIHRvIGJlIGFkZGVkIHRvIHRoZSBwZW5kaW5nIGxpc3QgKGZvciBleGFtcGxlLCBpZiBvbmUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHRyaWdnZXJzIGFub3RoZXIgc3RhcnRpbmcpLiBTbyB3ZSBsb29wIHVudGlsIHNQZW5kaW5nQW5pbWF0aW9ucworICAgICAgICAgICAgICAgICAgICAvLyBpcyBlbXB0eS4KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNQZW5kaW5nQW5pbWF0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4gcGVuZGluZ0NvcHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+KSBzUGVuZGluZ0FuaW1hdGlvbnMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQZW5kaW5nQW5pbWF0aW9ucy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gcGVuZGluZ0NvcHkuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBbmltYXRvciBhbmltID0gcGVuZGluZ0NvcHkuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhbmltYXRpb24gaGFzIGEgc3RhcnREZWxheSwgcGxhY2UgaXQgb24gdGhlIGRlbGF5ZWQgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltLm1TdGFydERlbGF5ID09IDAgfHwgYW5pbS5tUGxheWluZ1N0YXRlID09IEVOREVEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLm1QbGF5aW5nU3RhdGUgPT0gQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNEZWxheWVkQW5pbXMuYWRkKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gcHJvY2VzcyBmaXJzdCBmcmFtZSBvZiBuZXcgYW5pbWF0aW9ucworICAgICAgICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50VGltZSBob2xkcyB0aGUgY29tbW9uIHRpbWUgZm9yIGFsbCBhbmltYXRpb25zIHByb2Nlc3NlZAorICAgICAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdGhpcyBmcmFtZQorICAgICAgICAgICAgICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCwgcHJvY2VzcyBhbmltYXRpb25zIGN1cnJlbnRseSBzaXR0aW5nIG9uIHRoZSBkZWxheWVkIHF1ZXVlLCBhZGRpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSB0byB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgaWYgdGhleSBhcmUgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bURlbGF5ZWRBbmltcyA9IHNEZWxheWVkQW5pbXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bURlbGF5ZWRBbmltczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIGFuaW0gPSBzRGVsYXllZEFuaW1zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltLmRlbGF5ZWRBbmltYXRpb25GcmFtZShjdXJyZW50VGltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUmVhZHlBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IG51bVJlYWR5QW5pbXMgPSBzUmVhZHlBbmltcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1SZWFkeUFuaW1zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkeUFuaW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIGFuaW0gPSBzUmVhZHlBbmltcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNEZWxheWVkQW5pbXMucmVtb3ZlKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc1JlYWR5QW5pbXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBwcm9jZXNzIGFsbCBhY3RpdmUgYW5pbWF0aW9ucy4gVGhlIHJldHVybiB2YWx1ZSBmcm9tIGFuaW1hdGlvbkZyYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gdGVsbHMgdGhlIGhhbmRsZXIgd2hldGhlciBpdCBzaG91bGQgbm93IGJlIGVuZGVkCisgICAgICAgICAgICAgICAgICAgIGludCBudW1BbmltcyA9IHNBbmltYXRpb25zLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BbmltczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIGFuaW0gPSBzQW5pbWF0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbS5hbmltYXRpb25GcmFtZShjdXJyZW50VGltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRW5kaW5nQW5pbXMuYWRkKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzRW5kaW5nQW5pbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW5kaW5nQW5pbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRW5kaW5nQW5pbXMuZ2V0KGkpLmVuZEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc0VuZGluZ0FuaW1zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIG9yIGRlbGF5ZWQgYW5pbWF0aW9ucywgY2FsbCB0aGUgaGFuZGxlciBhZ2FpbgorICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciB0aGUgZnJhbWVEZWxheQorICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbEFnYWluICYmICghc0FuaW1hdGlvbnMuaXNFbXB0eSgpIHx8ICFzRGVsYXllZEFuaW1zLmlzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKEFOSU1BVElPTl9GUkFNRSwgc0ZyYW1lRGVsYXkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgcnVubmluZyB0aGUgYW5pbWF0aW9uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnREZWxheSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGFydERlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisKKyAgICAgKiBAcGFyYW0gc3RhcnREZWxheSBUaGUgYW1vdW50IG9mIHRoZSBkZWxheSwgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnREZWxheShsb25nIHN0YXJ0RGVsYXkpIHsKKyAgICAgICAgdGhpcy5tU3RhcnREZWxheSA9IHN0YXJ0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGJldHdlZW4gZWFjaCBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uLiBUaGlzIGlzIGEKKyAgICAgKiByZXF1ZXN0ZWQgdGltZSB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBhdHRlbXB0IHRvIGhvbm9yLCBidXQgdGhlIGFjdHVhbCBkZWxheSBiZXR3ZWVuCisgICAgICogZnJhbWVzIG1heSBiZSBkaWZmZXJlbnQsIGRlcGVuZGluZyBvbiBzeXN0ZW0gbG9hZCBhbmQgY2FwYWJpbGl0aWVzLiBUaGlzIGlzIGEgc3RhdGljCisgICAgICogZnVuY3Rpb24gYmVjYXVzZSB0aGUgc2FtZSBkZWxheSB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGFuaW1hdGlvbnMsIHNpbmNlIHRoZXkgYXJlIGFsbAorICAgICAqIHJ1biBvZmYgb2YgYSBzaW5nbGUgdGltaW5nIGxvb3AuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgdGltZSBiZXR3ZWVuIGZyYW1lcywgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldEZyYW1lRGVsYXkoKSB7CisgICAgICAgIHJldHVybiBzRnJhbWVEZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgYmV0d2VlbiBlYWNoIGZyYW1lIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgaXMgYQorICAgICAqIHJlcXVlc3RlZCB0aW1lIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIGF0dGVtcHQgdG8gaG9ub3IsIGJ1dCB0aGUgYWN0dWFsIGRlbGF5IGJldHdlZW4KKyAgICAgKiBmcmFtZXMgbWF5IGJlIGRpZmZlcmVudCwgZGVwZW5kaW5nIG9uIHN5c3RlbSBsb2FkIGFuZCBjYXBhYmlsaXRpZXMuIFRoaXMgaXMgYSBzdGF0aWMKKyAgICAgKiBmdW5jdGlvbiBiZWNhdXNlIHRoZSBzYW1lIGRlbGF5IHdpbGwgYmUgYXBwbGllZCB0byBhbGwgYW5pbWF0aW9ucywgc2luY2UgdGhleSBhcmUgYWxsCisgICAgICogcnVuIG9mZiBvZiBhIHNpbmdsZSB0aW1pbmcgbG9vcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZURlbGF5IHRoZSByZXF1ZXN0ZWQgdGltZSBiZXR3ZWVuIGZyYW1lcywgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZyYW1lRGVsYXkobG9uZyBmcmFtZURlbGF5KSB7CisgICAgICAgIHNGcmFtZURlbGF5ID0gZnJhbWVEZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbW9zdCByZWNlbnQgdmFsdWUgY2FsY3VsYXRlZCBieSB0aGlzIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+IHdoZW4gdGhlcmUgaXMganVzdCBvbmUKKyAgICAgKiBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHNlbnNpYmxlIHdoaWxlIHRoZSBhbmltYXRpb24gaXMgcnVubmluZy4gVGhlIG1haW4KKyAgICAgKiBwdXJwb3NlIGZvciB0aGlzIHJlYWQtb25seSBwcm9wZXJ0eSBpcyB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSB0aGUgPGNvZGU+VmFsdWVBbmltYXRvcjwvY29kZT4KKyAgICAgKiBkdXJpbmcgYSBjYWxsIHRvIHtAbGluayBBbmltYXRvclVwZGF0ZUxpc3RlbmVyI29uQW5pbWF0aW9uVXBkYXRlKFZhbHVlQW5pbWF0b3IpfSwgd2hpY2gKKyAgICAgKiBpcyBjYWxsZWQgZHVyaW5nIGVhY2ggYW5pbWF0aW9uIGZyYW1lLCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdmFsdWUgaXMgY2FsY3VsYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW5pbWF0ZWRWYWx1ZSBUaGUgdmFsdWUgbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGJ5IHRoaXMgPGNvZGU+VmFsdWVBbmltYXRvcjwvY29kZT4gZm9yCisgICAgICogdGhlIHNpbmdsZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gSWYgdGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBiZWluZyBhbmltYXRlZAorICAgICAqIChzcGVjaWZpZWQgYnkgc2V2ZXJhbCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIGluIHRoZSBjb25zdHJ1Y3RvciksIHRoaXMgZnVuY3Rpb24KKyAgICAgKiByZXR1cm5zIHRoZSBhbmltYXRlZCB2YWx1ZSBmb3IgdGhlIGZpcnN0IG9mIHRob3NlIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKCkgeworICAgICAgICBpZiAobVZhbHVlcyAhPSBudWxsICYmIG1WYWx1ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZXNbMF0uZ2V0QW5pbWF0ZWRWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIC8vIFNob3VsZG4ndCBnZXQgaGVyZTsgc2hvdWxkIGFsd2F5cyBoYXZlIHZhbHVlcyB1bmxlc3MgVmFsdWVBbmltYXRvciB3YXMgc2V0IHVwIHdyb25nCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtb3N0IHJlY2VudCB2YWx1ZSBjYWxjdWxhdGVkIGJ5IHRoaXMgPGNvZGU+VmFsdWVBbmltYXRvcjwvY29kZT4gZm9yIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4uCisgICAgICogVGhlIG1haW4gcHVycG9zZSBmb3IgdGhpcyByZWFkLW9ubHkgcHJvcGVydHkgaXMgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZyb20gdGhlCisgICAgICogPGNvZGU+VmFsdWVBbmltYXRvcjwvY29kZT4gZHVyaW5nIGEgY2FsbCB0bworICAgICAqIHtAbGluayBBbmltYXRvclVwZGF0ZUxpc3RlbmVyI29uQW5pbWF0aW9uVXBkYXRlKFZhbHVlQW5pbWF0b3IpfSwgd2hpY2gKKyAgICAgKiBpcyBjYWxsZWQgZHVyaW5nIGVhY2ggYW5pbWF0aW9uIGZyYW1lLCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdmFsdWUgaXMgY2FsY3VsYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW5pbWF0ZWRWYWx1ZSBUaGUgdmFsdWUgbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGZvciB0aGUgbmFtZWQgcHJvcGVydHkKKyAgICAgKiBieSB0aGlzIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0QW5pbWF0ZWRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IG1WYWx1ZXNNYXAuZ2V0KHByb3BlcnR5TmFtZSk7CisgICAgICAgIGlmICh2YWx1ZXNIb2xkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlc0hvbGRlci5nZXRBbmltYXRlZFZhbHVlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBdCBsZWFzdCBhdm9pZCBjcmFzaGluZyBpZiBjYWxsZWQgd2l0aCBib2d1cyBwcm9wZXJ0eU5hbWUKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCBiZSByZXBlYXRlZC4gSWYgdGhlIHJlcGVhdAorICAgICAqIGNvdW50IGlzIDAsIHRoZSBhbmltYXRpb24gaXMgbmV2ZXIgcmVwZWF0ZWQuIElmIHRoZSByZXBlYXQgY291bnQgaXMKKyAgICAgKiBncmVhdGVyIHRoYW4gMCBvciB7QGxpbmsgI0lORklOSVRFfSwgdGhlIHJlcGVhdCBtb2RlIHdpbGwgYmUgdGFrZW4KKyAgICAgKiBpbnRvIGFjY291bnQuIFRoZSByZXBlYXQgY291bnQgaXMgMCBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgYmUgcmVwZWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRDb3VudChpbnQgdmFsdWUpIHsKKyAgICAgICAgbVJlcGVhdENvdW50ID0gdmFsdWU7CisgICAgfQorICAgIC8qKgorICAgICAqIERlZmluZXMgaG93IG1hbnkgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgcmVwZWF0LiBUaGUgZGVmYXVsdCB2YWx1ZQorICAgICAqIGlzIDAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgcmVwZWF0LCBvciB7QGxpbmsgI0lORklOSVRFfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBtUmVwZWF0Q291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB3aGF0IHRoaXMgYW5pbWF0aW9uIHNob3VsZCBkbyB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZC4gVGhpcworICAgICAqIHNldHRpbmcgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhlIHJlcGVhdCBjb3VudCBpcyBlaXRoZXIgZ3JlYXRlciB0aGFuCisgICAgICogMCBvciB7QGxpbmsgI0lORklOSVRFfS4gRGVmYXVsdHMgdG8ge0BsaW5rICNSRVNUQVJUfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB7QGxpbmsgI1JFU1RBUlR9IG9yIHtAbGluayAjUkVWRVJTRX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKGludCB2YWx1ZSkgeworICAgICAgICBtUmVwZWF0TW9kZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgd2hhdCB0aGlzIGFuaW1hdGlvbiBzaG91bGQgZG8gd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVpdGhlciBvbmUgb2Yge0BsaW5rICNSRVZFUlNFfSBvciB7QGxpbmsgI1JFU1RBUlR9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlKCkgeworICAgICAgICByZXR1cm4gbVJlcGVhdE1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBzZXQgb2YgbGlzdGVuZXJzIHRoYXQgYXJlIHNlbnQgdXBkYXRlIGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mCisgICAgICogYW4gYW5pbWF0aW9uLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYWxsIGxpc3RlbmVycyBmb3IgZXZlcnkgZnJhbWUgb2YgdGhlIGFuaW1hdGlvbiwKKyAgICAgKiBhZnRlciB0aGUgdmFsdWVzIGZvciB0aGUgYW5pbWF0aW9uIGhhdmUgYmVlbiBjYWxjdWxhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZCB0byB0aGUgY3VycmVudCBzZXQgb2YgbGlzdGVuZXJzIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRVcGRhdGVMaXN0ZW5lcihBbmltYXRvclVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbVVwZGF0ZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBmcm9tIHRoZSBzZXQgbGlzdGVuaW5nIHRvIGZyYW1lIHVwZGF0ZXMgZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbFVwZGF0ZUxpc3RlbmVycygpIHsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICAgICAgbVVwZGF0ZUxpc3RlbmVycyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIHNldCBsaXN0ZW5pbmcgdG8gZnJhbWUgdXBkYXRlcyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudCBzZXQgb2YgdXBkYXRlIGxpc3RlbmVycworICAgICAqIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGVMaXN0ZW5lcihBbmltYXRvclVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHVzZWQgaW4gY2FsY3VsYXRpbmcgdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhpcyBhbmltYXRpb24uIFRoZQorICAgICAqIGludGVycG9sYXRvciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBydW5zIHdpdGggbGluZWFyIG9yIG5vbi1saW5lYXIgbW90aW9uLAorICAgICAqIHN1Y2ggYXMgYWNjZWxlcmF0aW9uIGFuZCBkZWNlbGVyYXRpb24uIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3J9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVycG9sYXRvciB0byBiZSB1c2VkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKFRpbWVJbnRlcnBvbGF0b3IgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JbnRlcnBvbGF0b3IgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRpbWluZyBpbnRlcnBvbGF0b3IgdGhhdCB0aGlzIFZhbHVlQW5pbWF0b3IgdXNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRpbWluZyBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgVmFsdWVBbmltYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGltZUludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgIHJldHVybiBtSW50ZXJwb2xhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIGV2YWx1YXRvciB0byBiZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGFuaW1hdGVkIHZhbHVlcyBvZiB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKiBUaGUgc3lzdGVtIHdpbGwgYXV0b21hdGljYWxseSBhc3NpZ24gYSBmbG9hdCwgaW50LCBvciBkb3VibGUgZXZhbHVhdG9yIGJhc2VkIG9uIHRoZSB0eXBlCisgICAgICogb2YgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4gYW5kIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiBpbiB0aGUgY29uc3RydWN0b3IuIEJ1dCBpZiB0aGVzZSB2YWx1ZXMKKyAgICAgKiBhcmUgbm90IG9uZSBvZiB0aGVzZSBwcmltaXRpdmUgdHlwZXMsIG9yIGlmIGRpZmZlcmVudCBldmFsdWF0aW9uIGlzIGRlc2lyZWQgKHN1Y2ggYXMgaXMKKyAgICAgKiBuZWNlc3Nhcnkgd2l0aCBpbnQgdmFsdWVzIHRoYXQgcmVwcmVzZW50IGNvbG9ycyksIGEgY3VzdG9tIGV2YWx1YXRvciBuZWVkcyB0byBiZSBhc3NpZ25lZC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBydW5uaW5nIGFuIGFuaW1hdGlvbiBvbiBjb2xvciB2YWx1ZXMsIHRoZSB7QGxpbmsgUkdCRXZhbHVhdG9yfQorICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGdldCBjb3JyZWN0IFJHQiBjb2xvciBpbnRlcnBvbGF0aW9uLgorICAgICAqCisgICAgICogPHA+SWYgdGhpcyBWYWx1ZUFuaW1hdG9yIGhhcyBvbmx5IG9uZSBzZXQgb2YgdmFsdWVzIGJlaW5nIGFuaW1hdGVkIGJldHdlZW4sIHRoaXMgZXZhbHVhdG9yCisgICAgICogd2lsbCBiZSB1c2VkIGZvciB0aGF0IHNldC4gSWYgdGhlcmUgYXJlIHNldmVyYWwgc2V0cyBvZiB2YWx1ZXMgYmVpbmcgYW5pbWF0ZWQsIHdoaWNoIGlzCisgICAgICogdGhlIGNhc2UgaWYgUHJvcGVydHlWYWx1ZXNIT2xkZXIgb2JqZWN0cyB3ZXJlIHNldCBvbiB0aGUgVmFsdWVBbmltYXRvciwgdGhlbiB0aGUgZXZhbHVhdG9yCisgICAgICogaXMgYXNzaWduZWQganVzdCB0byB0aGUgZmlyc3QgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZXZhbHVhdG9yIHRvIGJlIHVzZWQgdGhpcyBhbmltYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvciB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBtVmFsdWVzICE9IG51bGwgJiYgbVZhbHVlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBtVmFsdWVzWzBdLnNldEV2YWx1YXRvcih2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgYW5pbWF0aW9uIHBsYXlpbmcuIFRoaXMgdmVyc2lvbiBvZiBzdGFydCgpIHRha2VzIGEgYm9vbGVhbiBmbGFnIHRoYXQgaW5kaWNhdGVzCisgICAgICogd2hldGhlciB0aGUgYW5pbWF0aW9uIHNob3VsZCBwbGF5IGluIHJldmVyc2UuIFRoZSBmbGFnIGlzIHVzdWFsbHkgZmFsc2UsIGJ1dCBtYXkgYmUgc2V0CisgICAgICogdG8gdHJ1ZSBpZiBjYWxsZWQgZnJvbSB0aGUgcmV2ZXJzZSgpIG1ldGhvZC8KKyAgICAgKgorICAgICAqIEBwYXJhbSBwbGF5QmFja3dhcmRzIFdoZXRoZXIgdGhlIFZhbHVlQW5pbWF0b3Igc2hvdWxkIHN0YXJ0IHBsYXlpbmcgaW4gcmV2ZXJzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnQoYm9vbGVhbiBwbGF5QmFja3dhcmRzKSB7CisgICAgICAgIG1QbGF5aW5nQmFja3dhcmRzID0gcGxheUJhY2t3YXJkczsKKyAgICAgICAgTG9vcGVyIGxvb3BlciA9IExvb3Blci5nZXRNYWluTG9vcGVyKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNVaVRocmVhZDsKKyAgICAgICAgaWYgKGxvb3BlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpc1VpVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBsb29wZXIuZ2V0VGhyZWFkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZ25vcmUgY2hlY2sgaWYgd2UgZG9uJ3QgaGF2ZSBhIExvb3BlciAodGhpcyBpc24ndCBhbiBBY3Rpdml0eSkKKyAgICAgICAgICAgIGlzVWlUaHJlYWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICgobVN0YXJ0RGVsYXkgPT0gMCkgJiYgaXNVaVRocmVhZCkgeworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvblN0YXJ0KHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoaXMgc2V0cyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uLCBwcmlvciB0byBhY3R1YWxseSBzdGFydGluZyBpdCBydW5uaW5nCisgICAgICAgICAgICBzZXRDdXJyZW50UGxheVRpbWUoZ2V0Q3VycmVudFBsYXlUaW1lKCkpOworICAgICAgICB9CisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworICAgICAgICBtU3RhcnRlZERlbGF5ID0gZmFsc2U7CisgICAgICAgIHNQZW5kaW5nQW5pbWF0aW9ucy5hZGQodGhpcyk7CisgICAgICAgIGlmIChzQW5pbWF0aW9uSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzQW5pbWF0aW9uSGFuZGxlciA9IG5ldyBBbmltYXRpb25IYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogZG9lcyB0aGlzIHB1dCB0b28gbWFueSBtZXNzYWdlcyBvbiB0aGUgcXVldWUgaWYgdGhlIGhhbmRsZXIKKyAgICAgICAgLy8gaXMgYWxyZWFkeSBydW5uaW5nPworICAgICAgICBzQW5pbWF0aW9uSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEFOSU1BVElPTl9TVEFSVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIHN0YXJ0KGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkNhbmNlbCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBKdXN0IHNldCB0aGUgQ0FOQ0VMRUQgZmxhZyAtIHRoaXMgY2F1c2VzIHRoZSBhbmltYXRpb24gdG8gZW5kIHRoZSBuZXh0IHRpbWUgYSBmcmFtZQorICAgICAgICAvLyBpcyBwcm9jZXNzZWQuCisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBDQU5DRUxFRDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlbmQoKSB7CisgICAgICAgIGlmICghc0FuaW1hdGlvbnMuY29udGFpbnModGhpcykgJiYgIXNQZW5kaW5nQW5pbWF0aW9ucy5jb250YWlucyh0aGlzKSkgeworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGlmIHRoZSBhbmltYXRpb24gaGFzIG5vdCB5ZXQgc3RhcnRlZDsgZ2V0IGl0IHJlYWR5IGZvciBlbmRpbmcKKyAgICAgICAgICAgIG1TdGFydGVkRGVsYXkgPSBmYWxzZTsKKyAgICAgICAgICAgIHNQZW5kaW5nQW5pbWF0aW9ucy5hZGQodGhpcyk7CisgICAgICAgICAgICBpZiAoc0FuaW1hdGlvbkhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNBbmltYXRpb25IYW5kbGVyID0gbmV3IEFuaW1hdGlvbkhhbmRsZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNBbmltYXRpb25IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoQU5JTUFUSU9OX1NUQVJUKTsKKyAgICAgICAgfQorICAgICAgICAvLyBKdXN0IHNldCB0aGUgRU5ERUQgZmxhZyAtIHRoaXMgY2F1c2VzIHRoZSBhbmltYXRpb24gdG8gZW5kIHRoZSBuZXh0IHRpbWUgYSBmcmFtZQorICAgICAgICAvLyBpcyBwcm9jZXNzZWQuCisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBFTkRFRDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgICAgIC8vIEVOREVEIG9yIENBTkNFTEVEIGluZGljYXRlIHRoYXQgaXQgaGFzIGJlZW4gZW5kZWQgb3IgY2FuY2VsZWQsIGJ1dCBub3QgcHJvY2Vzc2VkIHlldAorICAgICAgICByZXR1cm4gKG1QbGF5aW5nU3RhdGUgPT0gUlVOTklORyB8fCBtUGxheWluZ1N0YXRlID09IEVOREVEIHx8IG1QbGF5aW5nU3RhdGUgPT0gQ0FOQ0VMRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBsYXlzIHRoZSBWYWx1ZUFuaW1hdG9yIGluIHJldmVyc2UuIElmIHRoZSBhbmltYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nLAorICAgICAqIGl0IHdpbGwgc3RvcCBpdHNlbGYgYW5kIHBsYXkgYmFja3dhcmRzIGZyb20gdGhlIHBvaW50IHJlYWNoZWQgd2hlbiByZXZlcnNlIHdhcyBjYWxsZWQuCisgICAgICogSWYgdGhlIGFuaW1hdGlvbiBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcsIHRoZW4gaXQgd2lsbCBzdGFydCBmcm9tIHRoZSBlbmQgYW5kCisgICAgICogcGxheSBiYWNrd2FyZHMuIFRoaXMgYmVoYXZpb3IgaXMgb25seSBzZXQgZm9yIHRoZSBjdXJyZW50IGFuaW1hdGlvbjsgZnV0dXJlIHBsYXlpbmcKKyAgICAgKiBvZiB0aGUgYW5pbWF0aW9uIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHBsYXlpbmcgZm9yd2FyZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXZlcnNlKCkgeworICAgICAgICBtUGxheWluZ0JhY2t3YXJkcyA9ICFtUGxheWluZ0JhY2t3YXJkczsKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBsb25nIGN1cnJlbnRQbGF5VGltZSA9IGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZTsKKyAgICAgICAgICAgIGxvbmcgdGltZUxlZnQgPSBtRHVyYXRpb24gLSBjdXJyZW50UGxheVRpbWU7CisgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSB0aW1lTGVmdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0KHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGludGVybmFsbHkgdG8gZW5kIGFuIGFuaW1hdGlvbiBieSByZW1vdmluZyBpdCBmcm9tIHRoZSBhbmltYXRpb25zIGxpc3QuIE11c3QgYmUKKyAgICAgKiBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5kQW5pbWF0aW9uKCkgeworICAgICAgICBzQW5pbWF0aW9ucy5yZW1vdmUodGhpcyk7CisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25FbmQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB0byBzdGFydCBhbiBhbmltYXRpb24gYnkgYWRkaW5nIGl0IHRvIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBsaXN0LiBNdXN0IGJlCisgICAgICogY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIHNBbmltYXRpb25zLmFkZCh0aGlzKTsKKyAgICAgICAgaWYgKG1TdGFydERlbGF5ID4gMCAmJiBtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIExpc3RlbmVycyB3ZXJlIGFscmVhZHkgbm90aWZpZWQgaW4gc3RhcnQoKSBpZiBzdGFydERlbGF5IGlzIDA7IHRoaXMgaXMKKyAgICAgICAgICAgIC8vIGp1c3QgZm9yIGRlbGF5ZWQgYW5pbWF0aW9ucworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uU3RhcnQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiBjYWxsZWQgdG8gcHJvY2VzcyBhbiBhbmltYXRpb24gZnJhbWUgb24gYW4gYW5pbWF0aW9uIHRoYXQgaXMgY3VycmVudGx5CisgICAgICogc2xlZXBpbmcgdGhyb3VnaCBpdHMgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gcGhhc2UuIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgaXQKKyAgICAgKiBzaG91bGQgYmUgd29rZW4gdXAgYW5kIHB1dCBvbiB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgcXVldWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUsIHVzZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgdGhlIGFuaW1hdGlvbgorICAgICAqIGhhcyBleGNlZWRlZCBpdHMgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gYW5kIHNob3VsZCBiZSBzdGFydGVkLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uJ3MgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gaGFzIGJlZW4gZXhjZWVkZWQgYW5kIHRoZSBhbmltYXRpb24KKyAgICAgKiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHNldCBvZiBhY3RpdmUgYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsYXllZEFuaW1hdGlvbkZyYW1lKGxvbmcgY3VycmVudFRpbWUpIHsKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgPT0gQ0FOQ0VMRUQgfHwgbVBsYXlpbmdTdGF0ZSA9PSBFTkRFRCkgeworICAgICAgICAgICAgLy8gZW5kIHRoZSBkZWxheSwgcHJvY2VzcyBhbiBhbmltYXRpb24gZnJhbWUgdG8gYWN0dWFsbHkgY2FuY2VsIGl0CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1TdGFydGVkRGVsYXkpIHsKKyAgICAgICAgICAgIG1TdGFydGVkRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgbURlbGF5U3RhcnRUaW1lID0gY3VycmVudFRpbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb25nIGRlbHRhVGltZSA9IGN1cnJlbnRUaW1lIC0gbURlbGF5U3RhcnRUaW1lOworICAgICAgICAgICAgaWYgKGRlbHRhVGltZSA+IG1TdGFydERlbGF5KSB7CisgICAgICAgICAgICAgICAgLy8gc3RhcnREZWxheSBlbmRlZCAtIHN0YXJ0IHRoZSBhbmltIGFuZCByZWNvcmQgdGhlCisgICAgICAgICAgICAgICAgLy8gbVN0YXJ0VGltZSBhcHByb3ByaWF0ZWx5CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lIC0gKGRlbHRhVGltZSAtIG1TdGFydERlbGF5KTsKKyAgICAgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gUlVOTklORzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpbnRlcm5hbCBmdW5jdGlvbiBwcm9jZXNzZXMgYSBzaW5nbGUgYW5pbWF0aW9uIGZyYW1lIGZvciBhIGdpdmVuIGFuaW1hdGlvbi4gVGhlCisgICAgICogY3VycmVudFRpbWUgcGFyYW1ldGVyIGlzIHRoZSB0aW1pbmcgcHVsc2Ugc2VudCBieSB0aGUgaGFuZGxlciwgdXNlZCB0byBjYWxjdWxhdGUgdGhlCisgICAgICogZWxhcHNlZCBkdXJhdGlvbiwgYW5kIHRoZXJlZm9yZQorICAgICAqIHRoZSBlbGFwc2VkIGZyYWN0aW9uLCBvZiB0aGUgYW5pbWF0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBhbmltYXRpb24KKyAgICAgKiBzaG91bGQgYmUgZW5kZWQgKHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUgZWxhcHNlZCB0aW1lIG9mIHRoZSBhbmltYXRpb24gZXhjZWVkcyB0aGUKKyAgICAgKiBhbmltYXRpb24ncyBkdXJhdGlvbiwgaW5jbHVkaW5nIHRoZSByZXBlYXRDb3VudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgVGhlIGN1cnJlbnQgdGltZSwgYXMgdHJhY2tlZCBieSB0aGUgc3RhdGljIHRpbWluZyBoYW5kbGVyCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgaW5jbHVkaW5nIGFueSByZXBldGl0aW9ucyBkdWUgdG8KKyAgICAgKiA8Y29kZT5yZXBlYXRDb3VudDwvY29kZT4gaGFzIGJlZW4gZXhjZWVkZWQgYW5kIHRoZSBhbmltYXRpb24gc2hvdWxkIGJlIGVuZGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhbmltYXRpb25GcmFtZShsb25nIGN1cnJlbnRUaW1lKSB7CisgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworCisgICAgICAgIGlmIChtUGxheWluZ1N0YXRlID09IFNUT1BQRUQpIHsKKyAgICAgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBSVU5OSU5HOworICAgICAgICAgICAgaWYgKG1TZWVrVGltZSA8IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIG1TZWVrVGltZTsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSdyZSBwbGF5aW5nLCByZXNldCB0aGUgc2VlayB0aW1lCisgICAgICAgICAgICAgICAgbVNlZWtUaW1lID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChtUGxheWluZ1N0YXRlKSB7CisgICAgICAgIGNhc2UgUlVOTklORzoKKyAgICAgICAgY2FzZSBTRUVLRUQ6CisgICAgICAgICAgICBmbG9hdCBmcmFjdGlvbiA9IChmbG9hdCkoY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lKSAvIG1EdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChmcmFjdGlvbiA+PSAxZikgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEl0ZXJhdGlvbiA8IG1SZXBlYXRDb3VudCB8fCBtUmVwZWF0Q291bnQgPT0gSU5GSU5JVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGltZSB0byByZXBlYXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uUmVwZWF0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrbUN1cnJlbnRJdGVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSBSRVZFUlNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWluZ0JhY2t3YXJkcyA9IG1QbGF5aW5nQmFja3dhcmRzID8gZmFsc2UgOiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvZXNuJ3QgYWNjb3VudCBmb3IgZnJhY3Rpb24gZ29pbmcgV2F5eXl5eSBvdmVyIDEsIGxpa2UgMisKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBmcmFjdGlvbiAtIDFmOworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lICs9IG1EdXJhdGlvbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBNYXRoLm1pbihmcmFjdGlvbiwgMS4wZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QbGF5aW5nQmFja3dhcmRzKSB7CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAxZiAtIGZyYWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZVZhbHVlKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOREVEOgorICAgICAgICAgICAgLy8gVGhlIGZpbmFsIHZhbHVlIHNldCBvbiB0aGUgdGFyZ2V0IHZhcmllcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgLy8gd2FzIHN1cHBvc2VkIHRvIHJlcGVhdCBhbiBvZGQgbnVtYmVyIG9mIHRpbWVzCisgICAgICAgICAgICBpZiAobVJlcGVhdENvdW50ID4gMCAmJiAobVJlcGVhdENvdW50ICYgMHgwMSkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFuaW1hdGVWYWx1ZSgwZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFuaW1hdGVWYWx1ZSgxZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gc2V0IGRvbmUgZmxhZworICAgICAgICBjYXNlIENBTkNFTEVEOgorICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRvbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiBkdXJpbmcgZXZlcnkKKyAgICAgKiBhbmltYXRpb24gZnJhbWUuIFRoaXMgZnVuY3Rpb24gdHVybnMgdGhlIGVsYXBzZWQgZnJhY3Rpb24gaW50byBhbiBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24KKyAgICAgKiBhbmQgdGhlbiBpbnRvIGFuIGFuaW1hdGVkIHZhbHVlIChmcm9tIHRoZSBldmFsdWF0b3IuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgbW9zdGx5IGR1cmluZworICAgICAqIGFuaW1hdGlvbiB1cGRhdGVzLCBidXQgaXQgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgPGNvZGU+ZW5kKCk8L2NvZGU+CisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0byBzZXQgdGhlIGZpbmFsIHZhbHVlIG9uIHRoZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPk92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBtdXN0IGNhbGwgdGhlIHN1cGVyY2xhc3MgdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb24KKyAgICAgKiBvZiB0aGUgYW5pbWF0ZWQgdmFsdWUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgdm9pZCBhbmltYXRlVmFsdWUoZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgZnJhY3Rpb24gPSBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24oZnJhY3Rpb24pOworICAgICAgICBpbnQgbnVtVmFsdWVzID0gbVZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaV0uY2FsY3VsYXRlVmFsdWUoZnJhY3Rpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBudW1MaXN0ZW5lcnMgPSBtVXBkYXRlTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLmdldChpKS5vbkFuaW1hdGlvblVwZGF0ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWYWx1ZUFuaW1hdG9yIGNsb25lKCkgeworICAgICAgICBmaW5hbCBWYWx1ZUFuaW1hdG9yIGFuaW0gPSAoVmFsdWVBbmltYXRvcikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+IG9sZExpc3RlbmVycyA9IG1VcGRhdGVMaXN0ZW5lcnM7CisgICAgICAgICAgICBhbmltLm1VcGRhdGVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+KCk7CisgICAgICAgICAgICBpbnQgbnVtTGlzdGVuZXJzID0gb2xkTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhbmltLm1VcGRhdGVMaXN0ZW5lcnMuYWRkKG9sZExpc3RlbmVycy5nZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFuaW0ubVNlZWtUaW1lID0gLTE7CisgICAgICAgIGFuaW0ubVBsYXlpbmdCYWNrd2FyZHMgPSBmYWxzZTsKKyAgICAgICAgYW5pbS5tQ3VycmVudEl0ZXJhdGlvbiA9IDA7CisgICAgICAgIGFuaW0ubUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIGFuaW0ubVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIGFuaW0ubVN0YXJ0ZWREZWxheSA9IGZhbHNlOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdIG9sZFZhbHVlcyA9IG1WYWx1ZXM7CisgICAgICAgIGlmIChvbGRWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG51bVZhbHVlcyA9IG9sZFZhbHVlcy5sZW5ndGg7CisgICAgICAgICAgICBhbmltLm1WYWx1ZXMgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXJbbnVtVmFsdWVzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhbmltLm1WYWx1ZXNbaV0gPSBvbGRWYWx1ZXNbaV0uY2xvbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW0ubVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlWYWx1ZXNIb2xkZXI+KG51bVZhbHVlcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgdmFsdWVzSG9sZGVyID0gbVZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgICBhbmltLm1WYWx1ZXNNYXAucHV0KHZhbHVlc0hvbGRlci5nZXRQcm9wZXJ0eU5hbWUoKSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGFkZCB0aGVtc2VsdmVzIGFzIHVwZGF0ZSBsaXN0ZW5lcnMKKyAgICAgKiB0byBhbiA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPiBpbnN0YW5jZSB0byByZWNlaXZlIGNhbGxiYWNrcyBvbiBldmVyeSBhbmltYXRpb24KKyAgICAgKiBmcmFtZSwgYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUncyB2YWx1ZXMgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgZm9yIHRoYXQKKyAgICAgKiA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBbmltYXRvclVwZGF0ZUxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBvY2N1cnJlbmNlIG9mIGFub3RoZXIgZnJhbWUgb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCB3YXMgcmVwZWF0ZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKFZhbHVlQW5pbWF0b3IgYW5pbWF0aW9uKTsKKworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY2NjliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDYgQEAKKzxodG1sPgorPGJvZHk+CitQcm92aWRlcyBjbGFzc2VzIGZvciBhbmltYXRpbmcgdmFsdWVzIG92ZXIgdGltZSwgYW5kIHNldHRpbmcgdGhvc2UgdmFsdWVzIG9uIHRhcmdldAorb2JqZWN0cy4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWYyZTMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBjb250ZXh0dWFsIEFjdGlvbkJhci4KKyAqIFRoZSBBY3Rpb25CYXIgYWN0cyBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgdGl0bGUgYmFyIGluIEFjdGl2aXRpZXMuCisgKiBJdCBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciBjcmVhdGluZyB0b29sYmFyIGFjdGlvbnMgYXMgd2VsbCBhcworICogbWV0aG9kcyBvZiBuYXZpZ2F0aW5nIGFyb3VuZCBhbiBhcHBsaWNhdGlvbi4gCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25CYXIgeworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4gQ29uc2lzdHMgb2YgZWl0aGVyIGEgbG9nbyBvciBpY29uCisgICAgICogYW5kIHRpdGxlIHRleHQgd2l0aCBhbiBvcHRpb25hbCBzdWJ0aXRsZS4gQ2xpY2tpbmcgYW55IG9mIHRoZXNlIGVsZW1lbnRzCisgICAgICogd2lsbCBkaXNwYXRjaCBvbkFjdGlvbkl0ZW1TZWxlY3RlZCB0byB0aGUgcmVnaXN0ZXJlZCBDYWxsYmFjayB3aXRoCisgICAgICogYSBNZW51SXRlbSB3aXRoIGl0ZW0gSUQgYW5kcm9pZC5SLmlkLmhvbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEcm9wZG93biBsaXN0IG5hdmlnYXRpb24gbW9kZS4gSW5zdGVhZCBvZiBzdGF0aWMgdGl0bGUgdGV4dCB0aGlzIG1vZGUKKyAgICAgKiBwcmVzZW50cyBhIGRyb3Bkb3duIG1lbnUgZm9yIG5hdmlnYXRpb24gd2l0aGluIHRoZSBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVCA9IDE7CisgICAgCisgICAgLyoqCisgICAgICogVGFiIG5hdmlnYXRpb24gbW9kZS4gSW5zdGVhZCBvZiBzdGF0aWMgdGl0bGUgdGV4dCB0aGlzIG1vZGUKKyAgICAgKiBwcmVzZW50cyBhIHNlcmllcyBvZiB0YWJzIGZvciBuYXZpZ2F0aW9uIHdpdGhpbiB0aGUgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX1RBQlMgPSAyOworICAgIAorICAgIC8qKgorICAgICAqIEN1c3RvbSBuYXZpZ2F0aW9uIG1vZGUuIFRoaXMgbmF2aWdhdGlvbiBtb2RlIGlzIHNldCBpbXBsaWNpdGx5IHdoZW5ldmVyCisgICAgICogYSBjdXN0b20gbmF2aWdhdGlvbiB2aWV3IGlzIHNldC4gU2VlIHtAbGluayAjc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9DVVNUT00gPSAzOworCisgICAgLyoqCisgICAgICogVXNlIGxvZ28gaW5zdGVhZCBvZiBpY29uIGlmIGF2YWlsYWJsZS4gVGhpcyBmbGFnIHdpbGwgY2F1c2UgYXBwcm9wcmlhdGUKKyAgICAgKiBuYXZpZ2F0aW9uIG1vZGVzIHRvIHVzZSBhIHdpZGVyIGxvZ28gaW4gcGxhY2Ugb2YgdGhlIHN0YW5kYXJkIGljb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9VU0VfTE9HTyA9IDB4MTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlICdob21lJyBlbGVtZW50cyBpbiB0aGlzIGFjdGlvbiBiYXIsIGxlYXZpbmcgbW9yZSBzcGFjZSBmb3Igb3RoZXIKKyAgICAgKiBuYXZpZ2F0aW9uIGVsZW1lbnRzLiBUaGlzIGluY2x1ZGVzIGxvZ28gYW5kIGljb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ISURFX0hPTUUgPSAweDI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBjdXN0b20gbmF2aWdhdGlvbiBtb2RlLCBzdXBwbHlpbmcgYSB2aWV3CisgICAgICogZm9yIGN1c3RvbSBuYXZpZ2F0aW9uLgorICAgICAqIAorICAgICAqIEN1c3RvbSBuYXZpZ2F0aW9uIHZpZXdzIGFwcGVhciBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBpY29uIGFuZAorICAgICAqIGFueSBhY3Rpb24gYnV0dG9ucyBhbmQgbWF5IHVzZSBhbnkgc3BhY2UgYXZhaWxhYmxlIHRoZXJlLiBDb21tb24KKyAgICAgKiB1c2UgY2FzZXMgZm9yIGN1c3RvbSBuYXZpZ2F0aW9uIHZpZXdzIG1pZ2h0IGluY2x1ZGUgYW4gYXV0by1zdWdnZXN0aW5nCisgICAgICogYWRkcmVzcyBiYXIgZm9yIGEgYnJvd3NlciBvciBvdGhlciBuYXZpZ2F0aW9uIG1lY2hhbmlzbXMgdGhhdCBkbyBub3QKKyAgICAgKiB0cmFuc2xhdGUgd2VsbCB0byBwcm92aWRlZCBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2aWV3IEN1c3RvbSBuYXZpZ2F0aW9uIHZpZXcgdG8gcGxhY2UgaW4gdGhlIEFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZShWaWV3IHZpZXcpOworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGRyb3Bkb3duIG5hdmlnYXRpb24gbW9kZSBhbmQgc3VwcGx5IGFuIGFkYXB0ZXIKKyAgICAgKiB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBmb3IgbmF2aWdhdGlvbiBjaG9pY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFkYXB0ZXIgdGhhdCB3aWxsIHByb3ZpZGUgdmlld3MgYm90aCB0byBkaXNwbGF5CisgICAgICogICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBzZWxlY3Rpb24gYW5kIHBvcHVsYXRlIHZpZXdzCisgICAgICogICAgICAgICAgICAgICAgd2l0aGluIHRoZSBkcm9wZG93biBuYXZpZ2F0aW9uIG1lbnUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgTmF2aWdhdGlvbkNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIGV2ZW50cyB3aGVuIHRoZSB1c2VyCisgICAgICogICAgICAgICAgICAgICAgIHNlbGVjdHMgYSBuYXZpZ2F0aW9uIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLAorICAgICAgICAgICAgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGRyb3Bkb3duIG5hdmlnYXRpb24gbW9kZSBhbmQgc3VwcGx5IGFuIGFkYXB0ZXIgdGhhdCB3aWxsCisgICAgICogcHJvdmlkZSB2aWV3cyBmb3IgbmF2aWdhdGlvbiBjaG9pY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYWRhcHRlciB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBib3RoIHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uIHNlbGVjdGlvbiBhbmQgcG9wdWxhdGUgdmlld3Mgd2l0aGluIHRoZSBkcm9wZG93bgorICAgICAqICAgICAgICAgICAgICAgIG5hdmlnYXRpb24gbWVudS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBOYXZpZ2F0aW9uQ2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgZXZlbnRzIHdoZW4gdGhlIHVzZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgc2VsZWN0cyBhIG5hdmlnYXRpb24gaXRlbS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24gUG9zaXRpb24gd2l0aGluIHRoZSBwcm92aWRlZCBhZGFwdGVyIHRoYXQgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGZyb20gdGhlIG91dHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIsCisgICAgICAgICAgICBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssIGludCBkZWZhdWx0U2VsZWN0ZWRQb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlbGVjdGVkIG5hdmlnYXRpb24gaXRlbSBpbiBkcm9wZG93biBvciB0YWJiZWQgbmF2aWdhdGlvbiBtb2Rlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgaXRlbSB0byBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbShpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0ZWQgbmF2aWdhdGlvbiBpdGVtIGluIGRyb3Bkb3duIG9yIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAqCisgICAgICogQHJldHVybiBQb3NpdGlvbiBvZiB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFNlbGVjdGVkTmF2aWdhdGlvbkl0ZW0oKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSwgdXNpbmcgdGhlIGN1cnJlbnRseSBzZXQgdGl0bGUKKyAgICAgKiBhbmQvb3Igc3VidGl0bGUuCisgICAgICoKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUgaXMgZGVmYXVsdC4gVGhlIHRpdGxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZSBuYW1lIG9mCisgICAgICogeW91ciBBY3Rpdml0eSBvbiBzdGFydHVwIGlmIGFuIGFjdGlvbiBiYXIgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyB0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3MgdGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgUmVzb3VyY2UgSUQgb2YgdGl0bGUgc3RyaW5nIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0VGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyBzdWJ0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKiBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBzdWJ0aXRsZSBlbnRpcmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdWJ0aXRsZSBTdWJ0aXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3Mgc3VidGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgUmVzb3VyY2UgSUQgb2Ygc3VidGl0bGUgc3RyaW5nIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN1YnRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgZGlzcGxheSBvcHRpb25zLiBUaGlzIGNoYW5nZXMgYWxsIGRpc3BsYXkgb3B0aW9uIGJpdHMgYXQgb25jZS4gVG8gY2hhbmdlCisgICAgICogYSBsaW1pdGVkIHN1YnNldCBvZiBkaXNwbGF5IG9wdGlvbnMsIHNlZSB7QGxpbmsgI3NldERpc3BsYXlPcHRpb25zKGludCwgaW50KX0uCisgICAgICogCisgICAgICogQHBhcmFtIG9wdGlvbnMgQSBjb21iaW5hdGlvbiBvZiB0aGUgYml0cyBkZWZpbmVkIGJ5IHRoZSBESVNQTEFZXyBjb25zdGFudHMKKyAgICAgKiAgICAgICAgICAgICAgICBkZWZpbmVkIGluIEFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucyk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHNlbGVjdGVkIGRpc3BsYXkgb3B0aW9ucy4gT25seSB0aGUgb3B0aW9ucyBzcGVjaWZpZWQgYnkgbWFzayB3aWxsIGJlIGNoYW5nZWQuCisgICAgICogVG8gY2hhbmdlIGFsbCBkaXNwbGF5IG9wdGlvbiBiaXRzIGF0IG9uY2UsIHNlZSB7QGxpbmsgI3NldERpc3BsYXlPcHRpb25zKGludCl9LgorICAgICAqIAorICAgICAqIDxwPkV4YW1wbGU6IHNldERpc3BsYXlPcHRpb25zKDAsIERJU1BMQVlfSElERV9IT01FKSB3aWxsIGRpc2FibGUgdGhlCisgICAgICoge0BsaW5rICNESVNQTEFZX0hJREVfSE9NRX0gb3B0aW9uLgorICAgICAqIHNldERpc3BsYXlPcHRpb25zKERJU1BMQVlfSElERV9IT01FLCBESVNQTEFZX0hJREVfSE9NRSB8IERJU1BMQVlfVVNFX0xPR08pCisgICAgICogd2lsbCBlbmFibGUge0BsaW5rICNESVNQTEFZX0hJREVfSE9NRX0gYW5kIGRpc2FibGUge0BsaW5rICNESVNQTEFZX1VTRV9MT0dPfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIGNvbWJpbmF0aW9uIG9mIHRoZSBiaXRzIGRlZmluZWQgYnkgdGhlIERJU1BMQVlfIGNvbnN0YW50cworICAgICAqICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gQWN0aW9uQmFyLgorICAgICAqIEBwYXJhbSBtYXNrIEEgYml0IG1hc2sgZGVjbGFyaW5nIHdoaWNoIGRpc3BsYXkgb3B0aW9ucyBzaG91bGQgYmUgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucywgaW50IG1hc2spOworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgQWN0aW9uQmFyJ3MgYmFja2dyb3VuZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZCBCYWNrZ3JvdW5kIGRyYXdhYmxlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlIGQpOworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgY3VzdG9tIG5hdmlnYXRpb24gdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVmlldyBnZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgQWN0aW9uQmFyIHRpdGxlIGluIHN0YW5kYXJkIG1vZGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHtAbGluayAjZ2V0TmF2aWdhdGlvbk1vZGUoKX0gd291bGQgbm90IHJldHVybgorICAgICAqIHtAbGluayAjTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEfS4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IEFjdGlvbkJhciB0aXRsZSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEFjdGlvbkJhciBzdWJ0aXRsZSBpbiBzdGFuZGFyZCBtb2RlLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB7QGxpbmsgI2dldE5hdmlnYXRpb25Nb2RlKCl9IHdvdWxkIG5vdCByZXR1cm4KKyAgICAgKiB7QGxpbmsgI05BVklHQVRJT05fTU9ERV9TVEFOREFSRH0uIAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBBY3Rpb25CYXIgc3VidGl0bGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUuIFRoZSByZXN1bHQgd2lsbCBiZSBvbmUgb2Y6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9TVEFOREFSRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX1RBQlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfQ1VTVE9NfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlLCBDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlcikKKyAgICAgKiBAc2VlICNzZXRUYWJOYXZpZ2F0aW9uTW9kZSgpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE5hdmlnYXRpb25Nb2RlKCk7CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzZXQgb2YgZGlzcGxheSBvcHRpb25zLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldERpc3BsYXlPcHRpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHNlZSAjYWRkVGFiKFRhYikKKyAgICAgKiBAc2VlICNpbnNlcnRUYWIoVGFiLCBpbnQpCisgICAgICogQHNlZSAjcmVtb3ZlVGFiKFRhYikKKyAgICAgKiBAc2VlICNyZW1vdmVUYWJBdChpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFiTmF2aWdhdGlvbk1vZGUoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IHtAbGluayBUYWJ9LgorICAgICAqIFRoaXMgdGFiIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBhY3Rpb24gYmFyIHVudGlsIGl0IGlzIGFkZGVkLgorICAgICAqCisgICAgICogQHJldHVybiBBIG5ldyBUYWIKKyAgICAgKgorICAgICAqIEBzZWUgI2FkZFRhYihUYWIpCisgICAgICogQHNlZSAjaW5zZXJ0VGFiKFRhYiwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBUYWIgbmV3VGFiKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB0YWIgZm9yIHVzZSBpbiB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLiBUaGUgdGFiIHdpbGwgYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGFiIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFRhYihUYWIgdGFiKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHRhYiBmb3IgdXNlIGluIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUuIFRoZSB0YWIgd2lsbCBiZSBpbnNlcnRlZCBhdAorICAgICAqIDxjb2RlPnBvc2l0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGhlIHRhYiB0byBhZGQKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgdGFiCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkVGFiKFRhYiB0YWIsIGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB0YWIgZnJvbSB0aGUgYWN0aW9uIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGhlIHRhYiB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVUYWIoVGFiIHRhYik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB0YWIgZnJvbSB0aGUgYWN0aW9uIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgdGFiIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVRhYkF0KGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIHNwZWNpZmllZCB0YWIuIElmIGl0IGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgYWN0aW9uIGJhciBpdCB3aWxsIGJlIGFkZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHRhYiBUYWIgdG8gc2VsZWN0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VsZWN0VGFiKFRhYiB0YWIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhYiBpZiBpbiB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlIGFuZCB0aGVyZSBpcyBhdCBsZWFzdAorICAgICAqIG9uZSB0YWIgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YWIgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBUYWIgZ2V0U2VsZWN0ZWRUYWIoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgQWN0aW9uQmFyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aW9uQmFyJ3MgaGVpZ2h0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRIZWlnaHQoKTsKKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIEFjdGlvbkJhciBpZiBpdCBpcyBub3QgY3VycmVudGx5IHNob3dpbmcuCisgICAgICogSWYgdGhlIHdpbmRvdyBob3N0aW5nIHRoZSBBY3Rpb25CYXIgZG9lcyBub3QgaGF2ZSB0aGUgZmVhdHVyZQorICAgICAqIHtAbGluayBXaW5kb3cjRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVl9IGl0IHdpbGwgcmVzaXplIGFwcGxpY2F0aW9uCisgICAgICogY29udGVudCB0byBmaXQgdGhlIG5ldyBzcGFjZSBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2hvdygpOworCisgICAgLyoqCisgICAgICogSGlkZSB0aGUgQWN0aW9uQmFyIGlmIGl0IGlzIG5vdCBjdXJyZW50bHkgc2hvd2luZy4KKyAgICAgKiBJZiB0aGUgd2luZG93IGhvc3RpbmcgdGhlIEFjdGlvbkJhciBkb2VzIG5vdCBoYXZlIHRoZSBmZWF0dXJlCisgICAgICoge0BsaW5rIFdpbmRvdyNGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWX0gaXQgd2lsbCByZXNpemUgYXBwbGljYXRpb24KKyAgICAgKiBjb250ZW50IHRvIGZpdCB0aGUgbmV3IHNwYWNlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBoaWRlKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBBY3Rpb25CYXIgaXMgc2hvd2luZywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Nob3dpbmcoKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgQWN0aW9uQmFyIG5hdmlnYXRpb24gZXZlbnRzLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE5hdmlnYXRpb25DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBuYXZpZ2F0aW9uIGl0ZW0gaW4geW91ciBhY3Rpb24gYmFyCisgICAgICAgICAqIGlzIHNlbGVjdGVkLgorICAgICAgICAgKiAgICAKKyAgICAgICAgICogQHBhcmFtIGl0ZW1Qb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgaXRlbSBjbGlja2VkLgorICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIElEIG9mIHRoZSBpdGVtIGNsaWNrZWQuCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZChpbnQgaXRlbVBvc2l0aW9uLCBsb25nIGl0ZW1JZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWIgaW4gdGhlIGFjdGlvbiBiYXIuCisgICAgICoKKyAgICAgKiA8cD5UYWJzIG1hbmFnZSB0aGUgaGlkaW5nIGFuZCBzaG93aW5nIG9mIHtAbGluayBGcmFnbWVudH1zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVGFiIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGludmFsaWQgcG9zaXRpb24gZm9yIGEgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRQb3NpdGlvbigpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BPU0lUSU9OID0gLTE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIHRhYiBpbiB0aGUgYWN0aW9uIGJhci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBDdXJyZW50IHBvc2l0aW9uLCBvciB7QGxpbmsgI0lOVkFMSURfUE9TSVRJT059IGlmIHRoaXMgdGFiIGlzIG5vdCBjdXJyZW50bHkgaW4KKyAgICAgICAgICogICAgICAgICB0aGUgYWN0aW9uIGJhci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UG9zaXRpb24oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgdGFiJ3MgaWNvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IERyYXdhYmxlIGdldEljb24oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mIHRoaXMgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB0YWIncyB0ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRleHQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBpY29uIGRpc3BsYXllZCBvbiB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGljb24gVGhlIGRyYXdhYmxlIHRvIHVzZSBhcyBhbiBpY29uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHRleHQgZGlzcGxheWVkIG9uIHRoaXMgdGFiLiBUZXh0IG1heSBiZSB0cnVuY2F0ZWQgaWYgdGhlcmUgaXMgbm90CisgICAgICAgICAqIHJvb20gdG8gZGlzcGxheSB0aGUgZW50aXJlIHN0cmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gZGlzcGxheQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIGN1c3RvbSB2aWV3IHRvIGJlIHVzZWQgZm9yIHRoaXMgdGFiLiBUaGlzIG92ZXJyaWRlcyB2YWx1ZXMgc2V0IGJ5CisgICAgICAgICAqIHtAbGluayAjc2V0VGV4dChDaGFyU2VxdWVuY2UpfSBhbmQge0BsaW5rICNzZXRJY29uKERyYXdhYmxlKX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2aWV3IEN1c3RvbSB2aWV3IHRvIGJlIHVzZWQgYXMgYSB0YWIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDdXN0b21WaWV3KFZpZXcgdmlldyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBzZXQgY3VzdG9tIHZpZXcgZm9yIHRoaXMgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBjdXN0b20gdmlldyBzZXQgYnkge0BsaW5rICNzZXRDdXN0b21WaWV3KFZpZXcpfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBWaWV3IGdldEN1c3RvbVZpZXcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZSB0aGlzIFRhYiBhbiBhcmJpdHJhcnkgb2JqZWN0IHRvIGhvbGQgZm9yIGxhdGVyIHVzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iaiBPYmplY3QgdG8gc3RvcmUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhZyhPYmplY3Qgb2JqKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBUaGlzIFRhYidzIHRhZyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFRhZygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHtAbGluayBUYWJMaXN0ZW5lcn0gdGhhdCB3aWxsIGhhbmRsZSBzd2l0Y2hpbmcgdG8gYW5kIGZyb20gdGhpcyB0YWIuCisgICAgICAgICAqIEFsbCB0YWJzIG11c3QgaGF2ZSBhIFRhYkxpc3RlbmVyIHNldCBiZWZvcmUgYmVpbmcgYWRkZWQgdG8gdGhlIEFjdGlvbkJhci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIHRvIGhhbmRsZSB0YWIgc2VsZWN0aW9uIGV2ZW50cworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFiTGlzdGVuZXIoVGFiTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZWxlY3QgdGhpcyB0YWIuIE9ubHkgdmFsaWQgaWYgdGhlIHRhYiBoYXMgYmVlbiBhZGRlZCB0byB0aGUgYWN0aW9uIGJhci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbGVjdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBpbnZva2VkIHdoZW4gYSB0YWIgaXMgZm9jdXNlZCwgdW5mb2N1c2VkLCBhZGRlZCwgb3IgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRhYkxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgdGFiIGVudGVycyB0aGUgc2VsZWN0ZWQgc3RhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0YWIgVGhlIHRhYiB0aGF0IHdhcyBzZWxlY3RlZAorICAgICAgICAgKiBAcGFyYW0gZnQgQSB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbn0gZm9yIHF1ZXVpbmcgZnJhZ21lbnQgb3BlcmF0aW9ucyB0byBleGVjdXRlCisgICAgICAgICAqICAgICAgICBkdXJpbmcgYSB0YWIgc3dpdGNoLiBUaGUgcHJldmlvdXMgdGFiJ3MgdW5zZWxlY3QgYW5kIHRoaXMgdGFiJ3Mgc2VsZWN0IHdpbGwgYmUKKyAgICAgICAgICogICAgICAgIGV4ZWN1dGVkIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25UYWJTZWxlY3RlZChUYWIgdGFiLCBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSB0YWIgZXhpdHMgdGhlIHNlbGVjdGVkIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGFiIFRoZSB0YWIgdGhhdCB3YXMgdW5zZWxlY3RlZAorICAgICAgICAgKiBAcGFyYW0gZnQgQSB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbn0gZm9yIHF1ZXVpbmcgZnJhZ21lbnQgb3BlcmF0aW9ucyB0byBleGVjdXRlCisgICAgICAgICAqICAgICAgICBkdXJpbmcgYSB0YWIgc3dpdGNoLiBUaGlzIHRhYidzIHVuc2VsZWN0IGFuZCB0aGUgbmV3bHkgc2VsZWN0ZWQgdGFiJ3Mgc2VsZWN0CisgICAgICAgICAqICAgICAgICB3aWxsIGJlIGV4ZWN1dGVkIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25UYWJVbnNlbGVjdGVkKFRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKaW5kZXggNzhhNzdlYi4uZjA4ZDg4ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKQEAgLTE2LDE5ICsxNiwyMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFjdGlvbkJhckltcGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ3Vyc29yTG9hZGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JSW50ZW50U2VuZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwpAQCAtMzksNiArNDIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CkBAIC00OSw3ICs1Myw5IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CkBAIC01OCwxOCArNjQsMTggQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIApAQCAtMTEwLDYgKzExNiw3IEBACiAgKiAKICAqIDxwPlRvcGljcyBjb3ZlcmVkIGhlcmU6CiAgKiA8b2w+CisgKiA8bGk+PGEgaHJlZj0iI0ZyYWdtZW50cyI+RnJhZ21lbnRzPC9hPgogICogPGxpPjxhIGhyZWY9IiNBY3Rpdml0eUxpZmVjeWNsZSI+QWN0aXZpdHkgTGlmZWN5Y2xlPC9hPgogICogPGxpPjxhIGhyZWY9IiNDb25maWd1cmF0aW9uQ2hhbmdlcyI+Q29uZmlndXJhdGlvbiBDaGFuZ2VzPC9hPgogICogPGxpPjxhIGhyZWY9IiNTdGFydGluZ0FjdGl2aXRpZXMiPlN0YXJ0aW5nIEFjdGl2aXRpZXMgYW5kIEdldHRpbmcgUmVzdWx0czwvYT4KQEAgLTExOCw2ICsxMjUsMTQgQEAKICAqIDxsaT48YSBocmVmPSIjUHJvY2Vzc0xpZmVjeWNsZSI+UHJvY2VzcyBMaWZlY3ljbGU8L2E+CiAgKiA8L29sPgogICogCisgKiA8YSBuYW1lPSJGcmFnbWVudHMiPjwvYT4KKyAqIDxoMz5GcmFnbWVudHM8L2gzPgorICoKKyAqIDxwPlN0YXJ0aW5nIHdpdGgge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9LCBBY3Rpdml0eQorICogaW1wbGVtZW50YXRpb25zIGNhbiBtYWtlIHVzZSBvZiB0aGUge0BsaW5rIEZyYWdtZW50fSBjbGFzcyB0byBiZXR0ZXIKKyAqIG1vZHVsYXJpemUgdGhlaXIgY29kZSwgYnVpbGQgbW9yZSBzb3BoaXN0aWNhdGVkIHVzZXIgaW50ZXJmYWNlcyBmb3IgbGFyZ2VyCisgKiBzY3JlZW5zLCBhbmQgaGVscCBzY2FsZSB0aGVpciBhcHBsaWNhdGlvbiBiZXR3ZWVuIHNtYWxsIGFuZCBsYXJnZSBzY3JlZW5zLgorICoKICAqIDxhIG5hbWU9IkFjdGl2aXR5TGlmZWN5Y2xlIj48L2E+CiAgKiA8aDM+QWN0aXZpdHkgTGlmZWN5Y2xlPC9oMz4KICAqCkBAIC01OTIsNyArNjA3LDcgQEAKICAqIG9yIGZpbmlzaGVkLgogICovCiBwdWJsaWMgY2xhc3MgQWN0aXZpdHkgZXh0ZW5kcyBDb250ZXh0VGhlbWVXcmFwcGVyCi0gICAgICAgIGltcGxlbWVudHMgTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeSwKKyAgICAgICAgaW1wbGVtZW50cyBMYXlvdXRJbmZsYXRlci5GYWN0b3J5MiwKICAgICAgICAgV2luZG93LkNhbGxiYWNrLCBLZXlFdmVudC5DYWxsYmFjaywKICAgICAgICAgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyLCBDb21wb25lbnRDYWxsYmFja3MgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWN0aXZpdHkiOwpAQCAtNjA0LDkgKzYxOSw4IEBACiAgICAgLyoqIFN0YXJ0IG9mIHVzZXItZGVmaW5lZCBhY3Rpdml0eSByZXN1bHRzLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9GSVJTVF9VU0VSICAgPSAxOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzSW5zdGFuY2VDb3VudCA9IDA7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX0hJRVJBUkNIWV9UQUcgPSAiYW5kcm9pZDp2aWV3SGllcmFyY2h5U3RhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVFNfVEFHID0gImFuZHJvaWQ6ZnJhZ21lbnRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX0lEU19LRVkgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ0lkcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR1NfVEFHID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX0tFWV9QUkVGSVggPSAiYW5kcm9pZDpkaWFsb2dfIjsKQEAgLTYyOCwxOCArNjQyLDI4IEBACiAgICAgcHJpdmF0ZSBDb21wb25lbnROYW1lIG1Db21wb25lbnQ7CiAgICAgLypwYWNrYWdlKi8gQWN0aXZpdHlJbmZvIG1BY3Rpdml0eUluZm87CiAgICAgLypwYWNrYWdlKi8gQWN0aXZpdHlUaHJlYWQgbU1haW5UaHJlYWQ7Ci0gICAgLypwYWNrYWdlKi8gT2JqZWN0IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgIC8qcGFja2FnZSovIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbUxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CiAgICAgQWN0aXZpdHkgbVBhcmVudDsKICAgICBib29sZWFuIG1DYWxsZWQ7CisgICAgYm9vbGVhbiBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXI7CisgICAgYm9vbGVhbiBtU3RhcnRlZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVJlc3VtZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wcGVkOwogICAgIGJvb2xlYW4gbUZpbmlzaGVkOwogICAgIGJvb2xlYW4gbVN0YXJ0ZWRBY3Rpdml0eTsKKyAgICAvKiogdHJ1ZSBpZiB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgZGVzdHJveWVkIGluIG9yZGVyIHRvIHJlY3JlYXRlIGl0IHdpdGggYSBuZXcgY29uZmlndXJhdGlvbiAqLworICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBmYWxzZTsKICAgICAvKnBhY2thZ2UqLyBpbnQgbUNvbmZpZ0NoYW5nZUZsYWdzOwogICAgIC8qcGFja2FnZSovIENvbmZpZ3VyYXRpb24gbUN1cnJlbnRDb25maWc7CiAgICAgcHJpdmF0ZSBTZWFyY2hNYW5hZ2VyIG1TZWFyY2hNYW5hZ2VyOwogCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgeworICAgICAgICBPYmplY3QgYWN0aXZpdHk7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkcmVuOworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50czsKKyAgICAgICAgU3BhcnNlQXJyYXk8TG9hZGVyTWFuYWdlckltcGw+IGxvYWRlcnM7CisgICAgfQorICAgIC8qIHBhY2thZ2UgKi8gTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CisgICAgCiAgICAgcHJpdmF0ZSBXaW5kb3cgbVdpbmRvdzsKIAogICAgIHByaXZhdGUgV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcjsKQEAgLTY0NywxMCArNjcxLDE2IEBACiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtV2luZG93QWRkZWQgPSBmYWxzZTsKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1WaXNpYmxlRnJvbVNlcnZlciA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbVZpc2libGVGcm9tQ2xpZW50ID0gdHJ1ZTsKKyAgICAvKnBhY2thZ2UqLyBBY3Rpb25CYXJJbXBsIG1BY3Rpb25CYXIgPSBudWxsOwogCiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOwogICAgIHByaXZhdGUgaW50IG1UaXRsZUNvbG9yID0gMDsKIAorICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlckltcGwgbUZyYWdtZW50cyA9IG5ldyBGcmFnbWVudE1hbmFnZXJJbXBsKCk7CisgICAgCisgICAgU3BhcnNlQXJyYXk8TG9hZGVyTWFuYWdlckltcGw+IG1BbGxMb2FkZXJNYW5hZ2VyczsKKyAgICBMb2FkZXJNYW5hZ2VySW1wbCBtTG9hZGVyTWFuYWdlcjsKKyAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNYW5hZ2VkQ3Vyc29yIHsKICAgICAgICAgTWFuYWdlZEN1cnNvcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOwpAQCAtNjc3LDI0ICs3MDcsNyBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQgPSB7Y29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnN0YXRlX2ZvY3VzZWR9OwogCiAgICAgcHJpdmF0ZSBUaHJlYWQgbVVpVGhyZWFkOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0KLSAgICAvLyBVc2VkIGZvciBkZWJ1ZyBvbmx5Ci0gICAgLyoKLSAgICBwdWJsaWMgQWN0aXZpdHkoKSB7Ci0gICAgICAgICsrc0luc3RhbmNlQ291bnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgLS1zSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0gICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gc0luc3RhbmNlQ291bnQ7Ci0gICAgfQorICAgIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwogCiAgICAgLyoqIFJldHVybiB0aGUgaW50ZW50IHRoYXQgc3RhcnRlZCB0aGlzIGFjdGl2aXR5LiAqLwogICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgewpAQCAtNzQ4LDYgKzc2MSwzMCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBnZXRMb2FkZXJNYW5hZ2VyKC0xLCBtU3RhcnRlZCwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtTG9hZGVyTWFuYWdlcjsKKyAgICB9CisgICAgCisgICAgTG9hZGVyTWFuYWdlckltcGwgZ2V0TG9hZGVyTWFuYWdlcihpbnQgaW5kZXgsIGJvb2xlYW4gc3RhcnRlZCwgYm9vbGVhbiBjcmVhdGUpIHsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMgPSBuZXcgU3BhcnNlQXJyYXk8TG9hZGVyTWFuYWdlckltcGw+KCk7CisgICAgICAgIH0KKyAgICAgICAgTG9hZGVyTWFuYWdlckltcGwgbG0gPSBtQWxsTG9hZGVyTWFuYWdlcnMuZ2V0KGluZGV4KTsKKyAgICAgICAgaWYgKGxtID09IG51bGwgJiYgY3JlYXRlKSB7CisgICAgICAgICAgICBsbSA9IG5ldyBMb2FkZXJNYW5hZ2VySW1wbChzdGFydGVkKTsKKyAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy5wdXQoaW5kZXgsIGxtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG07CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93I2dldEN1cnJlbnRGb2N1c30gb24gdGhlCiAgICAgICogV2luZG93IG9mIHRoaXMgQWN0aXZpdHkgdG8gcmV0dXJuIHRoZSBjdXJyZW50bHkgZm9jdXNlZCB2aWV3LgogICAgICAqIApAQCAtODAxLDYgKzgzOCwxNSBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgbVZpc2libGVGcm9tQ2xpZW50ID0gIW1XaW5kb3cuZ2V0V2luZG93U3R5bGUoKS5nZXRCb29sZWFuKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dOb0Rpc3BsYXksIGZhbHNlKTsKKyAgICAgICAgaWYgKG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMgPSBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMubG9hZGVyczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFBhcmNlbGFibGUgcCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRQYXJjZWxhYmxlKEZSQUdNRU5UU19UQUcpOworICAgICAgICAgICAgbUZyYWdtZW50cy5yZXN0b3JlQWxsU3RhdGUocCwgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuZnJhZ21lbnRzIDogbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaENyZWF0ZSgpOwogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKICAgICB9CiAKQEAgLTkzMyw2ICs5NzksMTMgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0KCkgewogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gZ2V0TG9hZGVyTWFuYWdlcigtMSwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA4NSw2ICsxMTM4LDEwIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFdJTkRPV19ISUVSQVJDSFlfVEFHLCBtV2luZG93LnNhdmVIaWVyYXJjaHlTdGF0ZSgpKTsKKyAgICAgICAgUGFyY2VsYWJsZSBwID0gbUZyYWdtZW50cy5zYXZlQWxsU3RhdGUoKTsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0UGFyY2VsYWJsZShGUkFHTUVOVFNfVEFHLCBwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTQwOCw3ICsxNDY1LDggQEAKICAgICAgKiB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOworICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5hY3Rpdml0eSA6IG51bGw7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTQyMCw2ICsxNDc4LDExIEBACiAgICAgICoge0BsaW5rICNnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9IGluIHRoZSBuZXcgYWN0aXZpdHkKICAgICAgKiBpbnN0YW5jZS4KICAgICAgKiAKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcgYSB7QGxpbmsgRnJhZ21lbnR9IHdpdGgKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnQjc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbikKKyAgICAgKiBGcmFnbWVudC5zZXRSZXRhaW5JbnN0YW5jZShib29sZWFufS48L2VtPgorICAgICAqCiAgICAgICogPHA+VGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcHVyZWx5IGFzIGFuIG9wdGltaXphdGlvbiwgYW5kIHlvdSBtdXN0CiAgICAgICogbm90IHJlbHkgb24gaXQgYmVpbmcgY2FsbGVkLiAgV2hlbiBpdCBpcyBjYWxsZWQsIGEgbnVtYmVyIG9mIGd1YXJhbnRlZXMKICAgICAgKiB3aWxsIGJlIG1hZGUgdG8gaGVscCBvcHRpbWl6ZSBjb25maWd1cmF0aW9uIHN3aXRjaGluZzoKQEAgLTE0NzUsOCArMTUzOCw5IEBACiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvYmplY3QgcHJldmlvdXNseSByZXR1cm5lZCBieQogICAgICAqIHtAbGluayAjb25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKX0KICAgICAgKi8KLSAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlczsKKyAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCkgeworICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5jaGlsZHJlbiA6IG51bGw7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTQ5MCwxNyArMTU1NCw4OCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgCisgICAgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyByZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCkgeworICAgICAgICBPYmplY3QgYWN0aXZpdHkgPSBvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZHJlbiA9IG9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCk7CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gZnJhZ21lbnRzID0gbUZyYWdtZW50cy5yZXRhaW5Ob25Db25maWcoKTsKKyAgICAgICAgYm9vbGVhbiByZXRhaW5Mb2FkZXJzID0gZmFsc2U7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcHJ1bmUgb3V0IGFueSBsb2FkZXIgbWFuYWdlcnMgdGhhdCB3ZXJlIGFscmVhZHkgc3RvcHBlZCBhbmQgc28KKyAgICAgICAgICAgIC8vIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gcmV0YWluLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWxsTG9hZGVyTWFuYWdlcnMuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXJJbXBsIGxtID0gbUFsbExvYWRlck1hbmFnZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxtLm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0YWluTG9hZGVycyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG0uZG9EZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2aXR5ID09IG51bGwgJiYgY2hpbGRyZW4gPT0gbnVsbCAmJiBmcmFnbWVudHMgPT0gbnVsbCAmJiAhcmV0YWluTG9hZGVycykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbmNpID0gbmV3IE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKTsKKyAgICAgICAgbmNpLmFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgICAgIG5jaS5jaGlsZHJlbiA9IGNoaWxkcmVuOworICAgICAgICBuY2kuZnJhZ21lbnRzID0gZnJhZ21lbnRzOworICAgICAgICBuY2kubG9hZGVycyA9IG1BbGxMb2FkZXJNYW5hZ2VyczsKKyAgICAgICAgcmV0dXJuIG5jaTsKKyAgICB9CisgICAgCiAgICAgcHVibGljIHZvaWQgb25Mb3dNZW1vcnkoKSB7CiAgICAgICAgIG1DYWxsZWQgPSB0cnVlOwogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEZyYWdtZW50TWFuYWdlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBmcmFnbWVudHMgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhpcyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyIGdldEZyYWdtZW50TWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBzZXJpZXMgb2YgZWRpdCBvcGVyYXRpb25zIG9uIHRoZSBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBhY3Rpdml0eS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gb3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLm9wZW5UcmFuc2FjdGlvbigpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGludmFsaWRhdGVGcmFnbWVudEluZGV4KGludCBpbmRleCkgeworICAgICAgICAvL0xvZy52KFRBRywgImludmFsaWRhdGVGcmFnbWVudEluZGV4OiBpbmRleD0iICsgaW5kZXgpOworICAgICAgICBpZiAobUFsbExvYWRlck1hbmFnZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlck1hbmFnZXJJbXBsIGxtID0gbUFsbExvYWRlck1hbmFnZXJzLmdldChpbmRleCk7CisgICAgICAgICAgICBpZiAobG0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxtLmRvRGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnJlbW92ZShpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBGcmFnbWVudCBpcyBiZWluZyBhdHRhY2hlZCB0byB0aGlzIGFjdGl2aXR5LCBpbW1lZGlhdGVseQorICAgICAqIGFmdGVyIHRoZSBjYWxsIHRvIGl0cyB7QGxpbmsgRnJhZ21lbnQjb25BdHRhY2ggRnJhZ21lbnQub25BdHRhY2goKX0KKyAgICAgKiBtZXRob2QgYW5kIGJlZm9yZSB7QGxpbmsgRnJhZ21lbnQjb25DcmVhdGUgRnJhZ21lbnQub25DcmVhdGUoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BdHRhY2hGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCkgeworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBXcmFwcGVyIGFyb3VuZAogICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjcXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZyl9CiAgICAgICogdGhhdCBnaXZlcyB0aGUgcmVzdWx0aW5nIHtAbGluayBDdXJzb3J9IHRvIGNhbGwKICAgICAgKiB7QGxpbmsgI3N0YXJ0TWFuYWdpbmdDdXJzb3J9IHNvIHRoYXQgdGhlIGFjdGl2aXR5IHdpbGwgbWFuYWdlIGl0cwogICAgICAqIGxpZmVjeWNsZSBmb3IgeW91LgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyB7QGxpbmsgTG9hZGVyTWFuYWdlcn0gaW5zdGVhZCwgYXZhaWxhYmxlCisgICAgICogdmlhIHtAbGluayAjZ2V0TG9hZGVyTWFuYWdlcigpfS48L2VtPgorICAgICAqCiAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIHF1ZXJ5LgogICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIExpc3Qgb2YgY29sdW1ucyB0byByZXR1cm4uCiAgICAgICogQHBhcmFtIHNlbGVjdGlvbiBTUUwgV0hFUkUgY2xhdXNlLgpAQCAtMTUxMSwxMiArMTY0NiwxMiBAQAogICAgICAqIEBzZWUgQ29udGVudFJlc29sdmVyI3F1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCiAgICAgICogQHNlZSAjc3RhcnRNYW5hZ2luZ0N1cnNvcgogICAgICAqIEBoaWRlCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEN1cnNvckxvYWRlcn0gaW5zdGVhZC4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgQ3Vyc29yIG1hbmFnZWRRdWVyeShVcmkgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKQotICAgIHsKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBmaW5hbCBDdXJzb3IgbWFuYWdlZFF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CiAgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIG51bGwsIHNvcnRPcmRlcik7CiAgICAgICAgIGlmIChjICE9IG51bGwpIHsKICAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CkBAIC0xNTMxLDYgKzE2NjYsMTAgQEAKICAgICAgKiB7QGxpbmsgI3N0YXJ0TWFuYWdpbmdDdXJzb3J9IHNvIHRoYXQgdGhlIGFjdGl2aXR5IHdpbGwgbWFuYWdlIGl0cwogICAgICAqIGxpZmVjeWNsZSBmb3IgeW91LgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyB7QGxpbmsgTG9hZGVyTWFuYWdlcn0gaW5zdGVhZCwgYXZhaWxhYmxlCisgICAgICogdmlhIHtAbGluayAjZ2V0TG9hZGVyTWFuYWdlcigpfS48L2VtPgorICAgICAqCiAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIHF1ZXJ5LgogICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIExpc3Qgb2YgY29sdW1ucyB0byByZXR1cm4uCiAgICAgICogQHBhcmFtIHNlbGVjdGlvbiBTUUwgV0hFUkUgY2xhdXNlLgpAQCAtMTU0MSwxMyArMTY4MCwxMiBAQAogICAgICAqIAogICAgICAqIEBzZWUgQ29udGVudFJlc29sdmVyI3F1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCiAgICAgICogQHNlZSAjc3RhcnRNYW5hZ2luZ0N1cnNvcgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDdXJzb3JMb2FkZXJ9IGluc3RlYWQuCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIEN1cnNvciBtYW5hZ2VkUXVlcnkoVXJpIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKQotICAgIHsKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBmaW5hbCBDdXJzb3IgbWFuYWdlZFF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB7CiAgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7CiAgICAgICAgIGlmIChjICE9IG51bGwpIHsKICAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CkBAIC0xNTU2LDQwICsxNjk0LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcmFwcGVyIGFyb3VuZCB7QGxpbmsgQ3Vyc29yI2NvbW1pdFVwZGF0ZXMoKX0gdGhhdCB0YWtlcyBjYXJlIG9mIG5vdGluZwotICAgICAqIHRoYXQgdGhlIEN1cnNvciBuZWVkcyB0byBiZSByZXF1ZXJpZWQuICBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgaW4KLSAgICAgKiB7QGxpbmsgI29uUGF1c2V9IG9yIHtAbGluayAjb25TdG9wfSB0byBoYXZlIHRoZSBzeXN0ZW0gY2FsbAotICAgICAqIHtAbGluayBDdXJzb3IjcmVxdWVyeX0gZm9yIHlvdSBpZiB0aGUgYWN0aXZpdHkgaXMgbGF0ZXIgcmVzdW1lZC4gIFRoaXMKLSAgICAgKiBhbGxvd3MgeW91IHRvIGF2b2lkIGRldGVybWluZyB3aGVuIHRvIGRvIHRoZSByZXF1ZXJ5IHlvdXJzZWxmICh3aGljaCBpcwotICAgICAqIHJlcXVpcmVkIGZvciB0aGUgQ3Vyc29yIHRvIHNlZSBhbnkgZGF0YSBjaGFuZ2VzIHRoYXQgd2VyZSBjb21taXR0ZWQgd2l0aAotICAgICAqIGl0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyBUaGUgQ3Vyc29yIHdob3NlIGNoYW5nZXMgYXJlIHRvIGJlIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNtYW5hZ2VkUXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZykKLSAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCi0gICAgICogQHNlZSBDdXJzb3IjY29tbWl0VXBkYXRlcygpCi0gICAgICogQHNlZSBDdXJzb3IjcmVxdWVyeQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBtYW5hZ2VkQ29tbWl0VXBkYXRlcyhDdXJzb3IgYykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgewotICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWFuYWdlZEN1cnNvcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIE1hbmFnZWRDdXJzb3IgbWMgPSBtTWFuYWdlZEN1cnNvcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChtYy5tQ3Vyc29yID09IGMpIHsKLSAgICAgICAgICAgICAgICAgICAgYy5jb21taXRVcGRhdGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1jLm1VcGRhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDdXJzb3IgIiArIGMgKyAiIGlzIG5vdCBjdXJyZW50bHkgbWFuYWdlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBhY3Rpdml0eSB0byB0YWtlIGNhcmUgb2YgbWFuYWdpbmcgdGhlIGdpdmVuCiAgICAgICoge0BsaW5rIEN1cnNvcn0ncyBsaWZlY3ljbGUgZm9yIHlvdSBiYXNlZCBvbiB0aGUgYWN0aXZpdHkncyBsaWZlY3ljbGUuCiAgICAgICogVGhhdCBpcywgd2hlbiB0aGUgYWN0aXZpdHkgaXMgc3RvcHBlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbApAQCAtMTU5NywxMSArMTcwMSwxOCBAQAogICAgICAqIGl0IHdpbGwgY2FsbCB7QGxpbmsgQ3Vyc29yI3JlcXVlcnl9IGZvciB5b3UuICBXaGVuIHRoZSBhY3Rpdml0eSBpcwogICAgICAqIGRlc3Ryb3llZCwgYWxsIG1hbmFnZWQgQ3Vyc29ycyB3aWxsIGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5LgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyB7QGxpbmsgTG9hZGVyTWFuYWdlcn0gaW5zdGVhZCwgYXZhaWxhYmxlCisgICAgICogdmlhIHtAbGluayAjZ2V0TG9hZGVyTWFuYWdlcigpfS48L2VtPgorICAgICAqCiAgICAgICogQHBhcmFtIGMgVGhlIEN1cnNvciB0byBiZSBtYW5hZ2VkLgogICAgICAqIAogICAgICAqIEBzZWUgI21hbmFnZWRRdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKQogICAgICAqIEBzZWUgI3N0b3BNYW5hZ2luZ0N1cnNvcgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDdXJzb3JMb2FkZXJ9IGluc3RlYWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzdGFydE1hbmFnaW5nQ3Vyc29yKEN1cnNvciBjKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1hbmFnZWRDdXJzb3JzKSB7CiAgICAgICAgICAgICBtTWFuYWdlZEN1cnNvcnMuYWRkKG5ldyBNYW5hZ2VkQ3Vyc29yKGMpKTsKQEAgLTE2MTYsNyArMTcyNywxMCBAQAogICAgICAqIEBwYXJhbSBjIFRoZSBDdXJzb3IgdGhhdCB3YXMgYmVpbmcgbWFuYWdlZC4KICAgICAgKiAKICAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEN1cnNvckxvYWRlcn0gaW5zdGVhZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHN0b3BNYW5hZ2luZ0N1cnNvcihDdXJzb3IgYykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgewogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWFuYWdlZEN1cnNvcnMuc2l6ZSgpOwpAQCAtMTY0Nyw3ICsxNzYxLDU0IEBACiAgICAgcHVibGljIFZpZXcgZmluZFZpZXdCeUlkKGludCBpZCkgewogICAgICAgICByZXR1cm4gZ2V0V2luZG93KCkuZmluZFZpZXdCeUlkKGlkKTsKICAgICB9Ci0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHJlZmVyZW5jZSB0byB0aGlzIGFjdGl2aXR5J3MgQWN0aW9uQmFyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aXZpdHkncyBBY3Rpb25CYXIsIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUuCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkJhciBnZXRBY3Rpb25CYXIoKSB7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgQWN0aW9uQmFyLCBsb2NhdGVzIHRoZSBpbmZsYXRlZCBBY3Rpb25CYXJWaWV3LAorICAgICAqIGluaXRpYWxpemVzIHRoZSBBY3Rpb25CYXIgd2l0aCB0aGUgdmlldywgYW5kIHNldHMgbUFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdEFjdGlvbkJhcigpIHsKKyAgICAgICAgV2luZG93IHdpbmRvdyA9IGdldFdpbmRvdygpOworICAgICAgICBpZiAoaXNDaGlsZCgpIHx8ICF3aW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSB8fCBtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUFjdGlvbkJhciA9IG5ldyBBY3Rpb25CYXJJbXBsKHRoaXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGlkIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgdGhlIGNvbnRhaW5lciBJRCB3aGVuIGFkZGVkIGluIGEgdHJhbnNhY3Rpb24uICBUaGlzIG9ubHkKKyAgICAgKiByZXR1cm5zIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIGFjdGl2aXR5J3MgY29udGVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBpZiBmb3VuZCBvciBudWxsIG90aGVyd2lzZS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5SWQoaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoaWQpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHRhZyBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHN1cHBsaWVkIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgb25seQorICAgICAqIHJldHVybnMgZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgYWN0aXZpdHkncyBjb250ZW50LgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nIHRhZykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVRhZyh0YWcpOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIGFjdGl2aXR5IGNvbnRlbnQgZnJvbSBhIGxheW91dCByZXNvdXJjZS4gIFRoZSByZXNvdXJjZSB3aWxsIGJlCiAgICAgICogaW5mbGF0ZWQsIGFkZGluZyBhbGwgdG9wLWxldmVsIHZpZXdzIHRvIHRoZSBhY3Rpdml0eS4KQEAgLTE2NTYsNiArMTgxNyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoaW50IGxheW91dFJlc0lEKSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldENvbnRlbnRWaWV3KGxheW91dFJlc0lEKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY2Nyw2ICsxODI5LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhWaWV3IHZpZXcpIHsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NzksNiArMTg0Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewogICAgICAgICBnZXRXaW5kb3coKS5zZXRDb250ZW50Vmlldyh2aWV3LCBwYXJhbXMpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjkwLDYgKzE4NTQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZENvbnRlbnRWaWV3KFZpZXcgdmlldywgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKICAgICAgICAgZ2V0V2luZG93KCkuYWRkQ29udGVudFZpZXcodmlldywgcGFyYW1zKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkxMywxMiArMjA3OCw2NSBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3BvcEJhY2tTdGFjayhTdHJpbmcsIGludCl9CisgICAgICogYW5kIHtAbGluayAjcG9wQmFja1N0YWNrKGludCwgaW50KX06IElmIHNldCwgYW5kIHRoZSBuYW1lIG9yIElEIG9mCisgICAgICogYSBiYWNrIHN0YWNrIGVudHJ5IGhhcyBiZWVuIHN1cHBsaWVkLCB0aGVuIGFsbCBtYXRjaGluZyBlbnRyaWVzIHdpbGwKKyAgICAgKiBiZSBjb25zdW1lZCB1bnRpbCBvbmUgdGhhdCBkb2Vzbid0IG1hdGNoIGlzIGZvdW5kIG9yIHRoZSBib3R0b20gb2YKKyAgICAgKiB0aGUgc3RhY2sgaXMgcmVhY2hlZC4gIE90aGVyd2lzZSwgYWxsIGVudHJpZXMgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhhdCBlbnRyeQorICAgICAqIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUgPSAxPDwwOworCisgICAgLyoqCisgICAgICogUG9wIHRoZSB0b3Agc3RhdGUgb2ZmIHRoZSBiYWNrIHN0YWNrLiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBvbmUKKyAgICAgKiB0byBwb3AsIGVsc2UgZmFsc2UuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMucG9wQmFja1N0YWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIHRoZSBsYXN0IGZyYWdtZW50IHRyYW5zaXRpb24gZnJvbSB0aGUgbG9jYWwgYWN0aXZpdHkncyBmcmFnbWVudAorICAgICAqIGJhY2sgc3RhY2suICBJZiB0aGVyZSBpcyBub3RoaW5nIHRvIHBvcCwgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIG5hbWUgSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwcmV2aW91cyBiYWNrIHN0YXRlCisgICAgICogdG8gbG9vayBmb3I7IGlmIGZvdW5kLCBhbGwgc3RhdGVzIHVwIHRvIHRoYXQgc3RhdGUgd2lsbCBiZSBwb3BwZWQuICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4gSWYgbnVsbCwgb25seSB0aGUgdG9wIHN0YXRlIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soU3RyaW5nIG5hbWUsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2sobmFtZSwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCBhbGwgYmFjayBzdGFjayBzdGF0ZXMgdXAgdG8gdGhlIG9uZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICAgICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGF0ZWQgdG8gYmUgcG9wcGVkLiBJZiBubyBpZGVudGlmaWVyIGV4aXN0cywKKyAgICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBUaGUgaWRlbnRpZmllciBpcyB0aGUgbnVtYmVyIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMucG9wQmFja1N0YWNrKGlkLCBmbGFncyk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBoYXMgZGV0ZWN0ZWQgdGhlIHVzZXIncyBwcmVzcyBvZiB0aGUgYmFjawogICAgICAqIGtleS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBmaW5pc2hlcyB0aGUgY3VycmVudCBhY3Rpdml0eSwKICAgICAgKiBidXQgeW91IGNhbiBvdmVycmlkZSB0aGlzIHRvIGRvIHdoYXRldmVyIHlvdSB3YW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uQmFja1ByZXNzZWQoKSB7Ci0gICAgICAgIGZpbmlzaCgpOworICAgICAgICBpZiAoIW1GcmFnbWVudHMucG9wQmFja1N0YWNrKCkpIHsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMjE1Niw3ICsyMzc0LDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZVBhbmVsTWVudShpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMKSB7Ci0gICAgICAgICAgICByZXR1cm4gb25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvdyA9IG9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICBzaG93IHw9IG1GcmFnbWVudHMuZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShtZW51LCBnZXRNZW51SW5mbGF0ZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gc2hvdzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMjE3Myw2ICsyMzkzLDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVQYW5lbChpbnQgZmVhdHVyZUlkLCBWaWV3IHZpZXcsIE1lbnUgbWVudSkgewogICAgICAgICBpZiAoZmVhdHVyZUlkID09IFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbWVudSAhPSBudWxsKSB7CiAgICAgICAgICAgICBib29sZWFuIGdvZm9yaXQgPSBvblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGdvZm9yaXQgfD0gbUZyYWdtZW50cy5kaXNwYXRjaFByZXBhcmVPcHRpb25zTWVudShtZW51KTsKICAgICAgICAgICAgIHJldHVybiBnb2Zvcml0ICYmIG1lbnUuaGFzVmlzaWJsZUl0ZW1zKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yMjAzLDExICsyNDI0LDE3IEBACiAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBjYWxsIHRocm91Z2ggdG8gc3VwZXJjbGFzcydzIGltcGxtZWVudGF0aW9uIG9mIGVhY2gKICAgICAgICAgICAgICAgICAvLyBvZiB0aGVzZSBtZXRob2RzIGJlbG93CiAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg1MDAwMCwgMCwgaXRlbS5nZXRUaXRsZUNvbmRlbnNlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfQ09OVEVYVF9NRU5VOgogICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDAsIDEsIGl0ZW0uZ2V0VGl0bGVDb25kZW5zZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAob25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5kaXNwYXRjaENvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIyMjYsNiArMjQ1Myw3IEBACiAgICAgcHVibGljIHZvaWQgb25QYW5lbENsb3NlZChpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgc3dpdGNoIChmZWF0dXJlSWQpIHsKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTDoKKyAgICAgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CiAgICAgICAgICAgICAgICAgb25PcHRpb25zTWVudUNsb3NlZChtZW51KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKQEAgLTIyMzYsNiArMjQ2NCwxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERlY2xhcmUgdGhhdCB0aGUgb3B0aW9ucyBtZW51IGhhcyBjaGFuZ2VkLCBzbyBzaG91bGQgYmUgcmVjcmVhdGVkLgorICAgICAqIFRoZSB7QGxpbmsgI29uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0aGUgbmV4dAorICAgICAqIHRpbWUgaXQgbmVlZHMgdG8gYmUgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVPcHRpb25zTWVudSgpIHsKKyAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgQWN0aXZpdHkncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUuICBZb3UKICAgICAgKiBzaG91bGQgcGxhY2UgeW91ciBtZW51IGl0ZW1zIGluIHRvIDx2YXI+bWVudTwvdmFyPi4KICAgICAgKiAKQEAgLTI0NTgsNiArMjY5NSw5IEBACiAgICAgICogYnkgdGhlIGFjdGl2aXR5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgdGhyb3VnaCB0bwogICAgICAqIHtAbGluayAjb25DcmVhdGVEaWFsb2coaW50KX0gZm9yIGNvbXBhdGliaWxpdHkuCiAgICAgICoKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcgYSB7QGxpbmsgRGlhbG9nRnJhZ21lbnR9IGluc3RlYWQuPC9lbT4KKyAgICAgKgogICAgICAqIDxwPklmIHlvdSB1c2Uge0BsaW5rICNzaG93RGlhbG9nKGludCl9LCB0aGUgYWN0aXZpdHkgd2lsbCBjYWxsIHRocm91Z2ggdG8KICAgICAgKiB0aGlzIG1ldGhvZCB0aGUgZmlyc3QgdGltZSwgYW5kIGhhbmcgb250byBpdCB0aGVyZWFmdGVyLiAgQW55IGRpYWxvZwogICAgICAqIHRoYXQgaXMgY3JlYXRlZCBieSB0aGlzIG1ldGhvZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc2F2ZWQgYW5kIHJlc3RvcmVkCkBAIC0yNTMwLDYgKzI3NzAsOSBAQAogICAgICAqIHdpbGwgYmUgbWFkZSB3aXRoIHRoZSBzYW1lIGlkIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkIGZvciBhIGdpdmVuCiAgICAgICogaWQuICBGcm9tIHRoZXJlYWZ0ZXIsIHRoZSBkaWFsb2cgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNhdmVkIGFuZCByZXN0b3JlZC4KICAgICAgKgorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBhIHtAbGluayBEaWFsb2dGcmFnbWVudH0gaW5zdGVhZC48L2VtPgorICAgICAqCiAgICAgICogPHA+RWFjaCB0aW1lIGEgZGlhbG9nIGlzIHNob3duLCB7QGxpbmsgI29uUHJlcGFyZURpYWxvZyhpbnQsIERpYWxvZywgQnVuZGxlKX0gd2lsbAogICAgICAqIGJlIG1hZGUgdG8gcHJvdmlkZSBhbiBvcHBvcnR1bml0eSB0byBkbyBhbnkgdGltZWx5IHByZXBhcmF0aW9uLgogICAgICAqCkBAIC0zMDc3LDYgKzMzMjAsMzYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgRnJhZ21lbnQgaW4gdGhpcyBhY3Rpdml0eSBjYWxscyBpdHMgCisgICAgICoge0BsaW5rIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHl9IG9yIHtAbGluayBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0fQorICAgICAqIG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCB0aHJvd3Mge0BsaW5rIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9ufQorICAgICAqIGlmIHRoZXJlIHdhcyBubyBBY3Rpdml0eSBmb3VuZCB0byBydW4gdGhlIGdpdmVuIEludGVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IG1ha2luZyB0aGUgY2FsbC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIFJlcGx5IHJlcXVlc3QgY29kZS4gIDwgMCBpZiByZXBseSBpcyBub3QgcmVxdWVzdGVkLiAKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5IAorICAgICAqIEBzZWUgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eUZvclJlc3VsdCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBJbnRlbnQgaW50ZW50LCAKKyAgICAgICAgICAgIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBJbnN0cnVtZW50YXRpb24uQWN0aXZpdHlSZXN1bHQgYXIgPQorICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5leGVjU3RhcnRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICB0aGlzLCBtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLCBtVG9rZW4sIGZyYWdtZW50LAorICAgICAgICAgICAgICAgIGludGVudCwgcmVxdWVzdENvZGUpOworICAgICAgICBpZiAoYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbU1haW5UaHJlYWQuc2VuZEFjdGl2aXR5UmVzdWx0KAorICAgICAgICAgICAgICAgIG1Ub2tlbiwgZnJhZ21lbnQubVdobywgcmVxdWVzdENvZGUsCisgICAgICAgICAgICAgICAgYXIuZ2V0UmVzdWx0Q29kZSgpLCBhci5nZXRSZXN1bHREYXRhKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogTGlrZSB7QGxpbmsgI3N0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQoQWN0aXZpdHksIEludGVudCwgaW50KX0sIGJ1dAogICAgICAqIHRha2luZyBhIEludGVudFNlbmRlcjsgc2VlCiAgICAgICoge0BsaW5rICNzdGFydEludGVudFNlbmRlckZvclJlc3VsdChJbnRlbnRTZW5kZXIsIGludCwgSW50ZW50LCBpbnQsIGludCwgaW50KX0KQEAgLTMyMzUsNiArMzUwOCwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHRoaXMgYWN0aXZpdHkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVzdHJveWVkIGluIG9yZGVyIHRvIGJlCisgICAgICogcmVjcmVhdGVkIHdpdGggYSBuZXcgY29uZmlndXJhdGlvbi4gVGhpcyBpcyBvZnRlbiB1c2VkIGluCisgICAgICoge0BsaW5rICNvblN0b3B9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzdGF0ZSBuZWVkcyB0byBiZSBjbGVhbmVkIHVwIG9yIHdpbGwgYmUgcGFzc2VkCisgICAgICogb24gdG8gdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IHZpYSB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gSWYgdGhlIGFjdGl2aXR5IGlzIGJlaW5nIHRvcm4gZG93biBpbiBvcmRlciB0byBiZSByZWNyZWF0ZWQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLAorICAgICAqIHJldHVybnMgdHJ1ZTsgZWxzZSByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zOworICAgIH0KKworICAgIC8qKgogICAgICAqIENhbGwgdGhpcyB3aGVuIHlvdXIgYWN0aXZpdHkgaXMgZG9uZSBhbmQgc2hvdWxkIGJlIGNsb3NlZC4gIFRoZQogICAgICAqIEFjdGl2aXR5UmVzdWx0IGlzIHByb3BhZ2F0ZWQgYmFjayB0byB3aG9ldmVyIGxhdW5jaGVkIHlvdSB2aWEKICAgICAgKiBvbkFjdGl2aXR5UmVzdWx0KCkuCkBAIC0zMzM1LDggKzM2MjEsNyBAQAogICAgICAqIEBzZWUgI2NyZWF0ZVBlbmRpbmdSZXN1bHQKICAgICAgKiBAc2VlICNzZXRSZXN1bHQoaW50KQogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwKLSAgICAgICAgICAgIEludGVudCBkYXRhKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgewogICAgIH0KIAogICAgIC8qKgpAQCAtMzcyMCw5ICs0MDA1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3R1YiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3Rvcnkjb25DcmVhdGVWaWV3fSB1c2VkIHdoZW4KLSAgICAgKiBpbmZsYXRpbmcgd2l0aCB0aGUgTGF5b3V0SW5mbGF0ZXIgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfS4gIFRoaXMKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBudWxsIGZvciBhbGwgdmlldyBuYW1lcy4KKyAgICAgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeSNvbkNyZWF0ZVZpZXd9IHVzZWQgd2hlbgorICAgICAqIGluZmxhdGluZyB3aXRoIHRoZSBMYXlvdXRJbmZsYXRlciByZXR1cm5lZCBieSB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9LgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCBpcyBmb3IKKyAgICAgKiBwcmUte0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9IGFwcHMuICBOZXdlciBhcHBzCisgICAgICogc2hvdWxkIHVzZSB7QGxpbmsgI29uQ3JlYXRlVmlldyhWaWV3LCBTdHJpbmcsIENvbnRleHQsIEF0dHJpYnV0ZVNldCl9LgogICAgICAqCiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIjY3JlYXRlVmlldwogICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LldpbmRvdyNnZXRMYXlvdXRJbmZsYXRlcgpAQCAtMzczMSw2ICs0MDE5LDE3MiBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeTIjb25DcmVhdGVWaWV3KFZpZXcsIFN0cmluZywgQ29udGV4dCwgQXR0cmlidXRlU2V0KX0KKyAgICAgKiB1c2VkIHdoZW4gaW5mbGF0aW5nIHdpdGggdGhlIExheW91dEluZmxhdGVyIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0uCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIDxmcmFnbWVudD4gdGFncyB0byBlbWJlZCBmcmFnbWVudHMgaW5zaWRlCisgICAgICogb2YgdGhlIGFjdGl2aXR5LgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIjY3JlYXRlVmlldworICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LldpbmRvdyNnZXRMYXlvdXRJbmZsYXRlcgorICAgICAqLworICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhWaWV3IHBhcmVudCwgU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIGlmICghImZyYWdtZW50Ii5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBvbkNyZWF0ZVZpZXcobmFtZSwgY29udGV4dCwgYXR0cnMpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZm5hbWUgPSBhdHRycy5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAiY2xhc3MiKTsKKyAgICAgICAgVHlwZWRBcnJheSBhID0gCisgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50KTsKKyAgICAgICAgaWYgKGZuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGZuYW1lID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGlkID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50X2lkLCBWaWV3Lk5PX0lEKTsKKyAgICAgICAgU3RyaW5nIHRhZyA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50X3RhZyk7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICAKKyAgICAgICAgaW50IGNvbnRhaW5lcklkID0gcGFyZW50ICE9IG51bGwgPyBwYXJlbnQuZ2V0SWQoKSA6IDA7CisgICAgICAgIGlmIChjb250YWluZXJJZCA9PSBWaWV3Lk5PX0lEICYmIGlkID09IFZpZXcuTk9fSUQgJiYgdGFnID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIjogTXVzdCBzcGVjaWZ5IHVuaXF1ZSBhbmRyb2lkOmlkLCBhbmRyb2lkOnRhZywgb3IgaGF2ZSBhIHBhcmVudCB3aXRoIGFuIGlkIGZvciAiICsgZm5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgcmVzdG9yZWQgZnJvbSBhIHByZXZpb3VzIHN0YXRlLCB3ZSBtYXkgYWxyZWFkeSBoYXZlCisgICAgICAgIC8vIGluc3RhbnRpYXRlZCB0aGlzIGZyYWdtZW50IGZyb20gdGhlIHN0YXRlIGFuZCBzaG91bGQgdXNlCisgICAgICAgIC8vIHRoYXQgaW5zdGFuY2UgaW5zdGVhZCBvZiBtYWtpbmcgYSBuZXcgb25lLgorICAgICAgICBGcmFnbWVudCBmcmFnbWVudCA9IGlkICE9IFZpZXcuTk9fSUQgPyBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoaWQpIDogbnVsbDsKKyAgICAgICAgaWYgKGZyYWdtZW50ID09IG51bGwgJiYgdGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZyYWdtZW50ID0gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVRhZyh0YWcpOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFnbWVudCA9PSBudWxsICYmIGNvbnRhaW5lcklkICE9IFZpZXcuTk9fSUQpIHsKKyAgICAgICAgICAgIGZyYWdtZW50ID0gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeUlkKGNvbnRhaW5lcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJvbkNyZWF0ZVZpZXc6IGlkPTB4IgorICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhpZCkgKyAiIGZuYW1lPSIgKyBmbmFtZQorICAgICAgICAgICAgICAgICsgIiBleGlzdGluZz0iICsgZnJhZ21lbnQpOworICAgICAgICBpZiAoZnJhZ21lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgZnJhZ21lbnQgPSBGcmFnbWVudC5pbnN0YW50aWF0ZSh0aGlzLCBmbmFtZSk7CisgICAgICAgICAgICBmcmFnbWVudC5tRnJvbUxheW91dCA9IHRydWU7CisgICAgICAgICAgICBmcmFnbWVudC5tRnJhZ21lbnRJZCA9IGlkICE9IDAgPyBpZCA6IGNvbnRhaW5lcklkOworICAgICAgICAgICAgZnJhZ21lbnQubUNvbnRhaW5lcklkID0gY29udGFpbmVySWQ7CisgICAgICAgICAgICBmcmFnbWVudC5tVGFnID0gdGFnOworICAgICAgICAgICAgZnJhZ21lbnQubUluTGF5b3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IHRoaXM7CisgICAgICAgICAgICBmcmFnbWVudC5tRnJhZ21lbnRNYW5hZ2VyID0gbUZyYWdtZW50czsKKyAgICAgICAgICAgIGZyYWdtZW50Lm9uSW5mbGF0ZShhdHRycywgZnJhZ21lbnQubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICBtRnJhZ21lbnRzLmFkZEZyYWdtZW50KGZyYWdtZW50LCB0cnVlKTsKKworICAgICAgICB9IGVsc2UgaWYgKGZyYWdtZW50Lm1JbkxheW91dCkgeworICAgICAgICAgICAgLy8gQSBmcmFnbWVudCBhbHJlYWR5IGV4aXN0cyBhbmQgaXQgaXMgbm90IG9uZSB3ZSByZXN0b3JlZCBmcm9tCisgICAgICAgICAgICAvLyBwcmV2aW91cyBzdGF0ZS4KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIjogRHVwbGljYXRlIGlkIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoaWQpCisgICAgICAgICAgICAgICAgICAgICsgIiwgdGFnICIgKyB0YWcgKyAiLCBvciBwYXJlbnQgaWQgMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjb250YWluZXJJZCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggYW5vdGhlciBmcmFnbWVudCBmb3IgIiArIGZuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoaXMgZnJhZ21lbnQgd2FzIHJldGFpbmVkIGZyb20gYSBwcmV2aW91cyBpbnN0YW5jZTsgZ2V0IGl0CisgICAgICAgICAgICAvLyBnb2luZyBub3cuCisgICAgICAgICAgICBmcmFnbWVudC5tSW5MYXlvdXQgPSB0cnVlOworICAgICAgICAgICAgZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID0gdGhpczsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgZnJhZ21lbnQgaXMgbmV3bHkgaW5zdGFudGlhdGVkIChlaXRoZXIgcmlnaHQgbm93LCBvcgorICAgICAgICAgICAgLy8gZnJvbSBsYXN0IHNhdmVkIHN0YXRlKSwgdGhlbiBnaXZlIGl0IHRoZSBhdHRyaWJ1dGVzIHRvCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIGl0c2VsZi4KKyAgICAgICAgICAgIGlmICghZnJhZ21lbnQubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgIGZyYWdtZW50Lm9uSW5mbGF0ZShhdHRycywgZnJhZ21lbnQubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRnJhZ21lbnRzLm1vdmVUb1N0YXRlKGZyYWdtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFnbWVudC5tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY3JlYXRlIGEgdmlldy4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaWQgIT0gMCkgeworICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0SWQoaWQpOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFnbWVudC5tVmlldy5nZXRUYWcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRUYWcodGFnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnJhZ21lbnQubVZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgdGhlIEFjdGl2aXR5J3Mgc3RhdGUgaW50byB0aGUgZ2l2ZW4gc3RyZWFtLiAgVGhpcyBnZXRzIGludm9rZWQgaWYKKyAgICAgKiB5b3UgcnVuICJhZGIgc2hlbGwgZHVtcHN5cyBhY3Rpdml0eSA8eW91cmFjdGl2aXR5bmFtZT4iLgorICAgICAqCisgICAgICogQHBhcmFtIGZkIFRoZSByYXcgZmlsZSBkZXNjcmlwdG9yIHRoYXQgdGhlIGR1bXAgaXMgYmVpbmcgc2VudCB0by4KKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSBQcmludFdyaXRlciB0byB3aGljaCB5b3Ugc2hvdWxkIGR1bXAgeW91ciBzdGF0ZS4gIFRoaXMgd2lsbCBiZQorICAgICAqIGNsb3NlZCBmb3IgeW91IGFmdGVyIHlvdSByZXR1cm4uCisgICAgICogQHBhcmFtIGFyZ3MgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGR1bXAgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgbUZyYWdtZW50cy5kdW1wKCIiLCBmZCwgd3JpdGVyLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaXQgaW5kaWNhdGluZyB0aGF0IHRoaXMgYWN0aXZpdHkgaXMgImltbWVyc2l2ZSIgYW5kIHNob3VsZCBub3QgYmUKKyAgICAgKiBpbnRlcnJ1cHRlZCBieSBub3RpZmljYXRpb25zIGlmIHBvc3NpYmxlLgorICAgICAqCisgICAgICogVGhpcyB2YWx1ZSBpcyBpbml0aWFsbHkgc2V0IGJ5IHRoZSBtYW5pZmVzdCBwcm9wZXJ0eQorICAgICAqIDxjb2RlPmFuZHJvaWQ6aW1tZXJzaXZlPC9jb2RlPiBidXQgbWF5IGJlIGNoYW5nZWQgYXQgcnVudGltZSBieQorICAgICAqIHtAbGluayAjc2V0SW1tZXJzaXZlfS4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyNGTEFHX0lNTUVSU0lWRQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbW1lcnNpdmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5pc0ltbWVyc2l2ZShtVG9rZW4pOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRqdXN0IHRoZSBjdXJyZW50IGltbWVyc2l2ZSBtb2RlIHNldHRpbmcuCisgICAgICogCisgICAgICogTm90ZSB0aGF0IGNoYW5naW5nIHRoaXMgdmFsdWUgd2lsbCBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgYWN0aXZpdHkncworICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvfSBzdHJ1Y3R1cmU7IHRoYXQgaXMsIGlmCisgICAgICogPGNvZGU+YW5kcm9pZDppbW1lcnNpdmU8L2NvZGU+IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPgorICAgICAqIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGVudHJ5IGZvciB0aGlzIGFjdGl2aXR5LCB0aGUge0BsaW5rCisgICAgICogYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyNmbGFncyBBY3Rpdml0eUluZm8uZmxhZ3N9IG1lbWJlciB3aWxsCisgICAgICogYWx3YXlzIGhhdmUgaXRzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI0ZMQUdfSU1NRVJTSVZFCisgICAgICogRkxBR19JTU1FUlNJVkV9IGJpdCBzZXQuCisgICAgICoKKyAgICAgKiBAc2VlICNpc0ltbWVyc2l2ZQorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyNGTEFHX0lNTUVSU0lWRQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW1tZXJzaXZlKGJvb2xlYW4gaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5zZXRJbW1lcnNpdmUobVRva2VuLCBpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgY29udGV4dCBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIHRoYXQgd2lsbCBtYW5hZ2UgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhpcyBjb250ZXh0IG1vZGUKKyAgICAgKiBAcmV0dXJuIFRoZSBDb250ZXh0TW9kZSB0aGF0IHdhcyBzdGFydGVkLCBvciBudWxsIGlmIGl0IHdhcyBjYW5jZWxlZAorICAgICAqCisgICAgICogQHNlZSBBY3Rpb25Nb2RlCisgICAgICovCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0RGVjb3JWaWV3KCkuc3RhcnRBY3Rpb25Nb2RlKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBvblN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXIuc3RhcnRBY3Rpb25Nb2RlKGNhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJuYWwgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLQogICAgIAogICAgIGZpbmFsIHZvaWQgc2V0UGFyZW50KEFjdGl2aXR5IHBhcmVudCkgewpAQCAtMzczOSwyOCArNDE5MywzMCBAQAogCiAgICAgZmluYWwgdm9pZCBhdHRhY2goQ29udGV4dCBjb250ZXh0LCBBY3Rpdml0eVRocmVhZCBhVGhyZWFkLCBJbnN0cnVtZW50YXRpb24gaW5zdHIsIElCaW5kZXIgdG9rZW4sCiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgSW50ZW50IGludGVudCwgQWN0aXZpdHlJbmZvIGluZm8sIENoYXJTZXF1ZW5jZSB0aXRsZSwgCi0gICAgICAgICAgICBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCisgICAgICAgICAgICBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywKICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCBpbnN0ciwgdG9rZW4sIDAsIGFwcGxpY2F0aW9uLCBpbnRlbnQsIGluZm8sIHRpdGxlLCBwYXJlbnQsIGlkLAotICAgICAgICAgICAgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgbnVsbCwgY29uZmlnKTsKKyAgICAgICAgICAgIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLCBjb25maWcpOwogICAgIH0KICAgICAKICAgICBmaW5hbCB2b2lkIGF0dGFjaChDb250ZXh0IGNvbnRleHQsIEFjdGl2aXR5VGhyZWFkIGFUaHJlYWQsCiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHIsIElCaW5kZXIgdG9rZW4sIGludCBpZGVudCwKICAgICAgICAgICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBJbnRlbnQgaW50ZW50LCBBY3Rpdml0eUluZm8gaW5mbywKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSwgQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcywKKyAgICAgICAgICAgIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsCiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZykgewogICAgICAgICBhdHRhY2hCYXNlQ29udGV4dChjb250ZXh0KTsKIAorICAgICAgICBtRnJhZ21lbnRzLmF0dGFjaEFjdGl2aXR5KHRoaXMpOworICAgICAgICAKICAgICAgICAgbVdpbmRvdyA9IFBvbGljeU1hbmFnZXIubWFrZU5ld1dpbmRvdyh0aGlzKTsKICAgICAgICAgbVdpbmRvdy5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgbVdpbmRvdy5nZXRMYXlvdXRJbmZsYXRlcigpLnNldEZhY3RvcnkyKHRoaXMpOwogICAgICAgICBpZiAoaW5mby5zb2Z0SW5wdXRNb2RlICE9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfU1RBVEVfVU5TUEVDSUZJRUQpIHsKICAgICAgICAgICAgIG1XaW5kb3cuc2V0U29mdElucHV0TW9kZShpbmZvLnNvZnRJbnB1dE1vZGUpOwogICAgICAgICB9CiAgICAgICAgIG1VaVRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0KKyAgICAgICAgCiAgICAgICAgIG1NYWluVGhyZWFkID0gYVRocmVhZDsKICAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IGluc3RyOwogICAgICAgICBtVG9rZW4gPSB0b2tlbjsKQEAgLTM3NzIsMTAgKzQyMjgsMTAgQEAKICAgICAgICAgbVRpdGxlID0gdGl0bGU7CiAgICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgIG1FbWJlZGRlZElEID0gaWQ7Ci0gICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKIAotICAgICAgICBtV2luZG93LnNldFdpbmRvd01hbmFnZXIobnVsbCwgbVRva2VuLCBtQ29tcG9uZW50LmZsYXR0ZW5Ub1N0cmluZygpKTsKKyAgICAgICAgbVdpbmRvdy5zZXRXaW5kb3dNYW5hZ2VyKG51bGwsIG1Ub2tlbiwgbUNvbXBvbmVudC5mbGF0dGVuVG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAoaW5mby5mbGFncyAmIEFjdGl2aXR5SW5mby5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEKSAhPSAwKTsKICAgICAgICAgaWYgKG1QYXJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgbVdpbmRvdy5zZXRDb250YWluZXIobVBhcmVudC5nZXRXaW5kb3coKSk7CiAgICAgICAgIH0KQEAgLTM3ODcsMjMgKzQyNDMsNDEgQEAKICAgICAgICAgcmV0dXJuIG1QYXJlbnQgIT0gbnVsbCA/IG1QYXJlbnQuZ2V0QWN0aXZpdHlUb2tlbigpIDogbVRva2VuOwogICAgIH0KIAorICAgIGZpbmFsIHZvaWQgcGVyZm9ybUNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIG9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hBY3Rpdml0eUNyZWF0ZWQoKTsKKyAgICB9CisgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtU3RhcnQoKSB7CisgICAgICAgIG1GcmFnbWVudHMubVN0YXRlU2F2ZWQgPSBmYWxzZTsKICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOworICAgICAgICBtRnJhZ21lbnRzLmV4ZWNQZW5kaW5nQWN0aW9ucygpOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uU3RhcnQodGhpcyk7CiAgICAgICAgIGlmICghbUNhbGxlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgbUNvbXBvbmVudC50b1Nob3J0U3RyaW5nKCkgKwogICAgICAgICAgICAgICAgICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25TdGFydCgpIik7CiAgICAgICAgIH0KKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFN0YXJ0KCk7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT1tQWxsTG9hZGVyTWFuYWdlcnMuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy52YWx1ZUF0KGkpLmZpbmlzaFJldGFpbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVJlc3RhcnQoKSB7CisgICAgICAgIG1GcmFnbWVudHMubVN0YXRlU2F2ZWQgPSBmYWxzZTsKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgewogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWFuYWdlZEN1cnNvcnMuc2l6ZSgpOwogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIE1hbmFnZWRDdXJzb3IgbWMgPSBtTWFuYWdlZEN1cnNvcnMuZ2V0KGkpOwogICAgICAgICAgICAgICAgIGlmIChtYy5tUmVsZWFzZWQgfHwgbWMubVVwZGF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWMubUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWMubUN1cnNvci5yZXF1ZXJ5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnlpbmcgdG8gcmVxdWVyeSBhbiBhbHJlYWR5IGNsb3NlZCBjdXJzb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtYy5tUmVsZWFzZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbWMubVVwZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CkBAIC0zODI2LDcgKzQzMDAsOSBAQAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVJlc3VtZSgpIHsKICAgICAgICAgcGVyZm9ybVJlc3RhcnQoKTsKICAgICAgICAgCi0gICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgbUZyYWdtZW50cy5leGVjUGVuZGluZ0FjdGlvbnMoKTsKKyAgICAgICAgCisgICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IG51bGw7CiAgICAgICAgIAogICAgICAgICAvLyBGaXJzdCBjYWxsIG9uUmVzdW1lKCkgLWJlZm9yZS0gc2V0dGluZyBtUmVzdW1lZCwgc28gd2UgZG9uJ3QKICAgICAgICAgLy8gc2VuZCBvdXQgYW55IHN0YXR1cyBiYXIgLyBtZW51IG5vdGlmaWNhdGlvbnMgdGhlIGNsaWVudCBtYWtlcy4KQEAgLTM4NDEsNiArNDMxNywxMCBAQAogICAgICAgICAvLyBOb3cgcmVhbGx5IHJlc3VtZSwgYW5kIGluc3RhbGwgdGhlIGN1cnJlbnQgc3RhdHVzIGJhciBhbmQgbWVudS4KICAgICAgICAgbVJlc3VtZWQgPSB0cnVlOwogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoUmVzdW1lKCk7CisgICAgICAgIG1GcmFnbWVudHMuZXhlY1BlbmRpbmdBY3Rpb25zKCk7CisgICAgICAgIAogICAgICAgICBvblBvc3RSZXN1bWUoKTsKICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oCkBAIC0zODUwLDYgKzQzMzAsNyBAQAogICAgIH0KIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVBhdXNlKCkgeworICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoUGF1c2UoKTsKICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOwogICAgICAgICBvblBhdXNlKCk7CiAgICAgICAgIGlmICghbUNhbGxlZCAmJiBnZXRBcHBsaWNhdGlvbkluZm8oKS50YXJnZXRTZGtWZXJzaW9uCkBAIC0zODY2LDExICs0MzQ3LDI0IEBACiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVN0b3AoKSB7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQ2hhbmdpbmdDb25maWd1cmF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb1N0b3AoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb1JldGFpbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgaWYgKCFtU3RvcHBlZCkgewogICAgICAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1XaW5kb3cuY2xvc2VBbGxQYW5lbHMoKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFN0b3AoKTsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5jYWxsQWN0aXZpdHlPblN0b3AodGhpcyk7CiAgICAgICAgICAgICBpZiAoIW1DYWxsZWQpIHsKQEAgLTM4OTUsNiArNDM4OSwxNSBAQAogICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgIH0KIAorICAgIGZpbmFsIHZvaWQgcGVyZm9ybURlc3Ryb3koKSB7CisgICAgICAgIG1XaW5kb3cuZGVzdHJveSgpOworICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoRGVzdHJveSgpOworICAgICAgICBvbkRlc3Ryb3koKTsKKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvRGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorICAgIAogICAgIGZpbmFsIGJvb2xlYW4gaXNSZXN1bWVkKCkgewogICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CiAgICAgfQpAQCAtMzkwNCw4ICs0NDA3LDE0IEBACiAgICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoCiAgICAgICAgICAgICBUQUcsICJEaXNwYXRjaGluZyByZXN1bHQ6IHdobz0iICsgd2hvICsgIiwgcmVxQ29kZT0iICsgcmVxdWVzdENvZGUKICAgICAgICAgICAgICsgIiwgcmVzQ29kZT0iICsgcmVzdWx0Q29kZSArICIsIGRhdGE9IiArIGRhdGEpOworICAgICAgICBtRnJhZ21lbnRzLm1TdGF0ZVNhdmVkID0gZmFsc2U7CiAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewogICAgICAgICAgICAgb25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudCBmcmFnID0gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVdobyh3aG8pOworICAgICAgICAgICAgaWYgKGZyYWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYWcub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKaW5kZXggZDYyMzFlYS4uOGNjNjQyOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQpAQCAtMTI1MCw2ICsxMjUwLDMyIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgSVNfSU1NRVJTSVZFX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIElCaW5kZXIgdG9rZW4gPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNpdCA9IGlzSW1tZXJzaXZlKHRva2VuKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KGlzaXQgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0lNTUVSU0lWRV9UUkFOU0FDVElPTjogeworICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBJQmluZGVyIHRva2VuID0gZGF0YS5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgICAgICBib29sZWFuIGltbSA9IGRhdGEucmVhZEludCgpID09IDE7CisgICAgICAgICAgICBzZXRJbW1lcnNpdmUodG9rZW4sIGltbSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY2FzZSBJU19UT1BfQUNUSVZJVFlfSU1NRVJTSVZFX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNpdCA9IGlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KGlzaXQgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgQ1JBU0hfQVBQTElDQVRJT05fVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgaW50IHVpZCA9IGRhdGEucmVhZEludCgpOwpAQCAtMTMwNCw2ICsxMzMwLDMxIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgQ0hFQ0tfR1JBTlRfVVJJX1BFUk1JU1NJT05fVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgaW50IGNhbGxpbmdVaWQgPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQa2cgPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpOworICAgICAgICAgICAgaW50IG1vZGVGbGFncyA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgICAgaW50IHJlcyA9IGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgdXJpLCBtb2RlRmxhZ3MpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQocmVzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEVU1QX0hFQVBfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3MgPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gbWFuYWdlZCA9IGRhdGEucmVhZEludCgpICE9IDA7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgID8gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKSA6IG51bGw7CisgICAgICAgICAgICBib29sZWFuIHJlcyA9IGR1bXBIZWFwKHByb2Nlc3MsIG1hbmFnZWQsIHBhdGgsIGZkKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KHJlcyA/IDEgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKQEAgLTI4MTgsNiArMjg2OSw0NiBAQAogICAgICAgICByZXBseS5yZWN5Y2xlKCk7CiAgICAgfQogICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEltbWVyc2l2ZShJQmluZGVyIHRva2VuLCBib29sZWFuIGltbWVyc2l2ZSkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcih0b2tlbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQoaW1tZXJzaXZlID8gMSA6IDApOworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KFNFVF9JTU1FUlNJVkVfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tZXJzaXZlKElCaW5kZXIgdG9rZW4pCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIodG9rZW4pOworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KElTX0lNTUVSU0lWRV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gcmVzID0gcmVwbHkucmVhZEludCgpID09IDE7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoSVNfVE9QX0FDVElWSVRZX0lNTUVSU0lWRV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gcmVzID0gcmVwbHkucmVhZEludCgpID09IDE7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgY3Jhc2hBcHBsaWNhdGlvbihpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKQEAgLTI4OTUsNiArMjk4Niw0NSBAQAogICAgICAgICBkYXRhLnJlY3ljbGUoKTsKICAgICAgICAgcmVwbHkucmVjeWNsZSgpOwogICAgIH0KKworICAgIHB1YmxpYyBpbnQgY2hlY2tHcmFudFVyaVBlcm1pc3Npb24oaW50IGNhbGxpbmdVaWQsIFN0cmluZyB0YXJnZXRQa2csCisgICAgICAgICAgICBVcmkgdXJpLCBpbnQgbW9kZUZsYWdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVJbnQoY2FsbGluZ1VpZCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcodGFyZ2V0UGtnKTsKKyAgICAgICAgdXJpLndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQobW9kZUZsYWdzKTsKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChDSEVDS19HUkFOVF9VUklfUEVSTUlTU0lPTl9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGludCByZXMgPSByZXBseS5yZWFkSW50KCk7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZHVtcEhlYXAoU3RyaW5nIHByb2Nlc3MsIGJvb2xlYW4gbWFuYWdlZCwKKyAgICAgICAgICAgIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHByb2Nlc3MpOworICAgICAgICBkYXRhLndyaXRlSW50KG1hbmFnZWQgPyAxIDogMCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocGF0aCk7CisgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDEpOworICAgICAgICAgICAgZmQud3JpdGVUb1BhcmNlbChkYXRhLCBQYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChEVU1QX0hFQVBfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICBib29sZWFuIHJlcyA9IHJlcGx5LnJlYWRJbnQoKSAhPSAwOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KICAgICAKICAgICBwcml2YXRlIElCaW5kZXIgbVJlbW90ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEKaW5kZXggNjNhNWZmNi4uZjNmN2VlNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Qcm92aWRlckluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwpAQCAtNjMsNiArNjQsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2dQcmludGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OworaW1wb3J0IGFuZHJvaWQudmlldy5IYXJkd2FyZVJlbmRlcmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdNYW5hZ2VyOwpAQCAtMTk5LDggKzIwMSw3IEBACiAgICAgICAgIFdpbmRvdyB3aW5kb3c7CiAgICAgICAgIEFjdGl2aXR5IHBhcmVudDsKICAgICAgICAgU3RyaW5nIGVtYmVkZGVkSUQ7Ci0gICAgICAgIE9iamVjdCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgICAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgICAgIEFjdGl2aXR5Lk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CiAgICAgICAgIGJvb2xlYW4gcGF1c2VkOwogICAgICAgICBib29sZWFuIHN0b3BwZWQ7CiAgICAgICAgIGJvb2xlYW4gaGlkZUZvck5vdzsKQEAgLTMzNSw5ICszMzYsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRHVtcFNlcnZpY2VJbmZvIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEdW1wQ29tcG9uZW50SW5mbyB7CiAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkOwotICAgICAgICBJQmluZGVyIHNlcnZpY2U7CisgICAgICAgIElCaW5kZXIgdG9rZW47CiAgICAgICAgIFN0cmluZ1tdIGFyZ3M7CiAgICAgICAgIGJvb2xlYW4gZHVtcGVkOwogICAgIH0KQEAgLTM2MSwxMiArMzYyLDE3IEBACiAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIER1bXBIZWFwRGF0YSB7CisgICAgICAgIFN0cmluZyBwYXRoOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZDsKKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEFwcGxpY2F0aW9uVGhyZWFkIGV4dGVuZHMgQXBwbGljYXRpb25UaHJlYWROYXRpdmUgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBUF9DT0xVTU4gPSAiJTE3cyAlOHMgJThzICU4cyAlOHMiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX0NPVU5UX0NPTFVNTiA9ICIlMTdzICU4ZCI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUV09fQ09VTlRfQ09MVU1OUyA9ICIlMTdzICU4ZCAlMTdzICU4ZCI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUV09fQ09VTlRfQ09MVU1OU19EQiA9ICIlMjBzICU4ZCAlMjBzICU4ZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9JTkZPX0ZPUk1BVCA9ICIgICU4ZCAlOGQgJTE0ZCAgJXMiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfSU5GT19GT1JNQVQgPSAiICAlOHMgJThzICUxNHMgJTE0cyAgJXMiOwogCiAgICAgICAgIC8vIEZvcm1hdHRpbmcgZm9yIGNoZWNraW4gc2VydmljZSAtIHVwZGF0ZSB2ZXJzaW9uIGlmIHJvdyBmb3JtYXQgY2hhbmdlcwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfVEhSRUFEX0NIRUNLSU5fVkVSU0lPTiA9IDE7CkBAIC01ODcsOSArNTkzLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGR1bXBTZXJ2aWNlKEZpbGVEZXNjcmlwdG9yIGZkLCBJQmluZGVyIHNlcnZpY2V0b2tlbiwgU3RyaW5nW10gYXJncykgewotICAgICAgICAgICAgRHVtcFNlcnZpY2VJbmZvIGRhdGEgPSBuZXcgRHVtcFNlcnZpY2VJbmZvKCk7CisgICAgICAgICAgICBEdW1wQ29tcG9uZW50SW5mbyBkYXRhID0gbmV3IER1bXBDb21wb25lbnRJbmZvKCk7CiAgICAgICAgICAgICBkYXRhLmZkID0gZmQ7Ci0gICAgICAgICAgICBkYXRhLnNlcnZpY2UgPSBzZXJ2aWNldG9rZW47CisgICAgICAgICAgICBkYXRhLnRva2VuID0gc2VydmljZXRva2VuOwogICAgICAgICAgICAgZGF0YS5hcmdzID0gYXJnczsKICAgICAgICAgICAgIGRhdGEuZHVtcGVkID0gZmFsc2U7CiAgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5EVU1QX1NFUlZJQ0UsIGRhdGEpOwpAQCAtNjI5LDYgKzYzNSwxMyBAQAogICAgICAgICAgICAgcXVldWVPclNlbmRNZXNzYWdlKEguUFJPRklMRVJfQ09OVFJPTCwgcGNkLCBzdGFydCA/IDEgOiAwKTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyB2b2lkIGR1bXBIZWFwKGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB7CisgICAgICAgICAgICBEdW1wSGVhcERhdGEgZGhkID0gbmV3IER1bXBIZWFwRGF0YSgpOworICAgICAgICAgICAgZGhkLnBhdGggPSBwYXRoOworICAgICAgICAgICAgZGhkLmZkID0gZmQ7CisgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5EVU1QX0hFQVAsIGRoZCwgbWFuYWdlZCA/IDEgOiAwKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFNjaGVkdWxpbmdHcm91cChpbnQgZ3JvdXApIHsKICAgICAgICAgICAgIC8vIE5vdGU6IGRvIHRoaXMgaW1tZWRpYXRlbHksIHNpbmNlIGdvaW5nIGludG8gdGhlIGZvcmVncm91bmQKICAgICAgICAgICAgIC8vIHNob3VsZCBoYXBwZW4gcmVnYXJkbGVzcyBvZiB3aGF0IHBlbmRpbmcgd29yayB3ZSBoYXZlIHRvIGRvCkBAIC02NTIsNiArNjY1LDI1IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlQ3Jhc2goU3RyaW5nIG1zZykgewogICAgICAgICAgICAgcXVldWVPclNlbmRNZXNzYWdlKEguU0NIRURVTEVfQ1JBU0gsIG1zZyk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkdW1wQWN0aXZpdHkoRmlsZURlc2NyaXB0b3IgZmQsIElCaW5kZXIgYWN0aXZpdHl0b2tlbiwgU3RyaW5nW10gYXJncykgeworICAgICAgICAgICAgRHVtcENvbXBvbmVudEluZm8gZGF0YSA9IG5ldyBEdW1wQ29tcG9uZW50SW5mbygpOworICAgICAgICAgICAgZGF0YS5mZCA9IGZkOworICAgICAgICAgICAgZGF0YS50b2tlbiA9IGFjdGl2aXR5dG9rZW47CisgICAgICAgICAgICBkYXRhLmFyZ3MgPSBhcmdzOworICAgICAgICAgICAgZGF0YS5kdW1wZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHF1ZXVlT3JTZW5kTWVzc2FnZShILkRVTVBfQUNUSVZJVFksIGRhdGEpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChkYXRhKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFkYXRhLmR1bXBlZCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZSwgd2Ugd2lsbCBrZWVwIHdhaXRpbmcgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1bXBlZCBpcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CkBAIC02NzcsMTQgKzcwOSwxNCBAQAogICAgICAgICAgICAgbG9uZyBkYWx2aWtBbGxvY2F0ZWQgPSBkYWx2aWtNYXggLSBkYWx2aWtGcmVlOwogICAgICAgICAgICAgbG9uZyB2aWV3SW5zdGFuY2VDb3VudCA9IFZpZXdEZWJ1Zy5nZXRWaWV3SW5zdGFuY2VDb3VudCgpOwogICAgICAgICAgICAgbG9uZyB2aWV3Um9vdEluc3RhbmNlQ291bnQgPSBWaWV3RGVidWcuZ2V0Vmlld1Jvb3RJbnN0YW5jZUNvdW50KCk7Ci0gICAgICAgICAgICBsb25nIGFwcENvbnRleHRJbnN0YW5jZUNvdW50ID0gQ29udGV4dEltcGwuZ2V0SW5zdGFuY2VDb3VudCgpOwotICAgICAgICAgICAgbG9uZyBhY3Rpdml0eUluc3RhbmNlQ291bnQgPSBBY3Rpdml0eS5nZXRJbnN0YW5jZUNvdW50KCk7CisgICAgICAgICAgICBsb25nIGFwcENvbnRleHRJbnN0YW5jZUNvdW50ID0gRGVidWcuY291bnRJbnN0YW5jZXNPZkNsYXNzKENvbnRleHRJbXBsLmNsYXNzKTsKKyAgICAgICAgICAgIGxvbmcgYWN0aXZpdHlJbnN0YW5jZUNvdW50ID0gRGVidWcuY291bnRJbnN0YW5jZXNPZkNsYXNzKEFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgICAgIGludCBnbG9iYWxBc3NldENvdW50ID0gQXNzZXRNYW5hZ2VyLmdldEdsb2JhbEFzc2V0Q291bnQoKTsKICAgICAgICAgICAgIGludCBnbG9iYWxBc3NldE1hbmFnZXJDb3VudCA9IEFzc2V0TWFuYWdlci5nZXRHbG9iYWxBc3NldE1hbmFnZXJDb3VudCgpOwogICAgICAgICAgICAgaW50IGJpbmRlckxvY2FsT2JqZWN0Q291bnQgPSBEZWJ1Zy5nZXRCaW5kZXJMb2NhbE9iamVjdENvdW50KCk7CiAgICAgICAgICAgICBpbnQgYmluZGVyUHJveHlPYmplY3RDb3VudCA9IERlYnVnLmdldEJpbmRlclByb3h5T2JqZWN0Q291bnQoKTsKICAgICAgICAgICAgIGludCBiaW5kZXJEZWF0aE9iamVjdENvdW50ID0gRGVidWcuZ2V0QmluZGVyRGVhdGhPYmplY3RDb3VudCgpOwotICAgICAgICAgICAgaW50IG9wZW5Tc2xTb2NrZXRDb3VudCA9IE9wZW5TU0xTb2NrZXRJbXBsLmdldEluc3RhbmNlQ291bnQoKTsKKyAgICAgICAgICAgIGxvbmcgb3BlblNzbFNvY2tldENvdW50ID0gRGVidWcuY291bnRJbnN0YW5jZXNPZkNsYXNzKE9wZW5TU0xTb2NrZXRJbXBsLmNsYXNzKTsKICAgICAgICAgICAgIGxvbmcgc3FsaXRlQWxsb2NhdGVkID0gU1FMaXRlRGVidWcuZ2V0SGVhcEFsbG9jYXRlZFNpemUoKSAvIDEwMjQ7CiAgICAgICAgICAgICBTUUxpdGVEZWJ1Zy5QYWdlclN0YXRzIHN0YXRzID0gU1FMaXRlRGVidWcuZ2V0RGF0YWJhc2VJbmZvKCk7CiAKQEAgLTc2Niw3ICs3OTgsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHMuZGJTdGF0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCcsJyk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04MTcsMTEgKzg0OSwxNSBAQAogICAgICAgICAgICAgaW50IE4gPSBzdGF0cy5kYlN0YXRzLnNpemUoKTsKICAgICAgICAgICAgIGlmIChOID4gMCkgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiBEQVRBQkFTRVMiKTsKLSAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgIiAgJThzICU4cyAlMTRzICAlcyIsICJwZ3N6IiwgImRic3oiLCAiTG9va2FzaWRlKGIpIiwgIkRibmFtZSIpOworICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCAiICAlOHMgJThzICUxNHMgJTE0cyAgJXMiLCAicGdzeiIsICJkYnN6IiwgIkxvb2thc2lkZShiKSIsICJjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRGJuYW1lIik7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgRGJTdGF0cyBkYlN0YXRzID0gc3RhdHMuZGJTdGF0cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCBEQl9JTkZPX0ZPUk1BVCwgZGJTdGF0cy5wYWdlU2l6ZSwgZGJTdGF0cy5kYlNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0cy5sb29rYXNpZGUsIGRiU3RhdHMuZGJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYlN0YXRzLnBhZ2VTaXplID4gMCkgPyBTdHJpbmcudmFsdWVPZihkYlN0YXRzLnBhZ2VTaXplKSA6ICIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJTdGF0cy5kYlNpemUgPiAwKSA/IFN0cmluZy52YWx1ZU9mKGRiU3RhdHMuZGJTaXplKSA6ICIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJTdGF0cy5sb29rYXNpZGUgPiAwKSA/IFN0cmluZy52YWx1ZU9mKGRiU3RhdHMubG9va2FzaWRlKSA6ICIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04NzUsNiArOTExLDggQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0pJVCAgICAgICAgICAgICAgPSAxMzI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BBVENIX1BBQ0tBR0VfQlJPQURDQVNUID0gMTMzOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9DUkFTSCAgICAgICAgICA9IDEzNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9IRUFQICAgICAgICAgICAgICAgPSAxMzU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVTVBfQUNUSVZJVFkgICAgICAgICAgID0gMTM2OwogICAgICAgICBTdHJpbmcgY29kZVRvU3RyaW5nKGludCBjb2RlKSB7CiAgICAgICAgICAgICBpZiAoREVCVUdfTUVTU0FHRVMpIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKQEAgLTkxMyw2ICs5NTEsOCBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIEVOQUJMRV9KSVQ6IHJldHVybiAiRU5BQkxFX0pJVCI7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1Q6IHJldHVybiAiRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1QiOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFNDSEVEVUxFX0NSQVNIOiByZXR1cm4gIlNDSEVEVUxFX0NSQVNIIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6IHJldHVybiAiRFVNUF9IRUFQIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0FDVElWSVRZOiByZXR1cm4gIkRVTVBfQUNUSVZJVFkiOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAiKHVua25vd24pIjsKQEAgLTEwMDgsNyArMTA0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlR2NJZGxlcigpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIERVTVBfU0VSVklDRToKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRHVtcFNlcnZpY2UoKER1bXBTZXJ2aWNlSW5mbyltc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRHVtcFNlcnZpY2UoKER1bXBDb21wb25lbnRJbmZvKW1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIExPV19NRU1PUlk6CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUxvd01lbW9yeSgpOwpAQCAtMTAzOSwxNCArMTA3OSwzOSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNDSEVEVUxFX0NSQVNIOgogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlU2VydmljZUV4Y2VwdGlvbigoU3RyaW5nKW1zZy5vYmopOworICAgICAgICAgICAgICAgIGNhc2UgRFVNUF9IRUFQOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVEdW1wSGVhcChtc2cuYXJnMSAhPSAwLCAoRHVtcEhlYXBEYXRhKW1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERVTVBfQUNUSVZJVFk6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUR1bXBBY3Rpdml0eSgoRHVtcENvbXBvbmVudEluZm8pbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKERFQlVHX01FU1NBR0VTKSBTbG9nLnYoVEFHLCAiPDw8IGRvbmU6ICIgKyBtc2cud2hhdCk7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIG1heWJlU25hcHNob3QoKSB7CiAgICAgICAgICAgICBpZiAobUJvdW5kQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KAotICAgICAgICAgICAgICAgICAgICAgICAgbUJvdW5kQXBwbGljYXRpb24ucHJvY2Vzc05hbWUpOworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlICpwcml2YXRlKiBBY3Rpdml0eVRocmVhZC5QYWNrYWdlSW5mbyB0byAqcHVibGljKiBrbm93bgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbworICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG1Cb3VuZEFwcGxpY2F0aW9uLmluZm8ubVBhY2thZ2VOYW1lOworICAgICAgICAgICAgICAgIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbyBwYWNrYWdlSW5mbyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0U3lzdGVtQ29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZihjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNhbm5vdCBnZXQgYSB2YWxpZCBjb250ZXh0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHBtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNhbm5vdCBnZXQgYSB2YWxpZCBQYWNrYWdlTWFuYWdlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VJbmZvID0gcG0uZ2V0UGFja2FnZUluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9BQ1RJVklUSUVTKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IHBhY2thZ2UgaW5mbyBmb3IgIiArIHBhY2thZ2VOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QobUJvdW5kQXBwbGljYXRpb24ucHJvY2Vzc05hbWUsIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE0MzcsNyArMTUwMiw3IEBACiAKICAgICBwdWJsaWMgZmluYWwgQWN0aXZpdHkgc3RhcnRBY3Rpdml0eU5vdyhBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwKICAgICAgICAgSW50ZW50IGludGVudCwgQWN0aXZpdHlJbmZvIGFjdGl2aXR5SW5mbywgSUJpbmRlciB0b2tlbiwgQnVuZGxlIHN0YXRlLAotICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSkgeworICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzKSB7CiAgICAgICAgIEFjdGl2aXR5Q2xpZW50UmVjb3JkIHIgPSBuZXcgQWN0aXZpdHlDbGllbnRSZWNvcmQoKTsKICAgICAgICAgICAgIHIudG9rZW4gPSB0b2tlbjsKICAgICAgICAgICAgIHIuaWRlbnQgPSAwOwpAQCAtMTQ0Niw3ICsxNTExLDcgQEAKICAgICAgICAgICAgIHIucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgci5lbWJlZGRlZElEID0gaWQ7CiAgICAgICAgICAgICByLmFjdGl2aXR5SW5mbyA9IGFjdGl2aXR5SW5mbzsKLSAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7CisgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CiAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG5hbWUgPSBpbnRlbnQuZ2V0Q29tcG9uZW50KCk7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZTsKQEAgLTE1NjgsMTQgKzE2MzMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgci5hY3Rpdml0eUluZm8ubmFtZSArICIgd2l0aCBjb25maWcgIiArIGNvbmZpZyk7CiAgICAgICAgICAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGFwcENvbnRleHQsIHRoaXMsIGdldEluc3RydW1lbnRhdGlvbigpLCByLnRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgci5pZGVudCwgYXBwLCByLmludGVudCwgci5hY3Rpdml0eUluZm8sIHRpdGxlLCByLnBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCwgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzLCBjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgci5lbWJlZGRlZElELCByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLCBjb25maWcpOwogCiAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbUludGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5Lm1JbnRlbnQgPSBjdXN0b21JbnRlbnQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzID0gbnVsbDsKKyAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbnVsbDsKICAgICAgICAgICAgICAgICBhY3Rpdml0eS5tU3RhcnRlZEFjdGl2aXR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW50IHRoZW1lID0gci5hY3Rpdml0eUluZm8uZ2V0VGhlbWVSZXNvdXJjZSgpOwogICAgICAgICAgICAgICAgIGlmICh0aGVtZSAhPSAwKSB7CkBAIC0xOTg4LDkgKzIwNTEsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUR1bXBTZXJ2aWNlKER1bXBTZXJ2aWNlSW5mbyBpbmZvKSB7CisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUR1bXBTZXJ2aWNlKER1bXBDb21wb25lbnRJbmZvIGluZm8pIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UgcyA9IG1TZXJ2aWNlcy5nZXQoaW5mby5zZXJ2aWNlKTsKKyAgICAgICAgICAgIFNlcnZpY2UgcyA9IG1TZXJ2aWNlcy5nZXQoaW5mby50b2tlbik7CiAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oaW5mby5mZCkpOwogICAgICAgICAgICAgICAgIHMuZHVtcChpbmZvLmZkLCBwdywgaW5mby5hcmdzKTsKQEAgLTIwMDQsNiArMjA2NywyMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUR1bXBBY3Rpdml0eShEdW1wQ29tcG9uZW50SW5mbyBpbmZvKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBY3Rpdml0eUNsaWVudFJlY29yZCByID0gbUFjdGl2aXRpZXMuZ2V0KGluZm8udG9rZW4pOworICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCAmJiByLmFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShpbmZvLmZkKSk7CisgICAgICAgICAgICAgICAgci5hY3Rpdml0eS5kdW1wKGluZm8uZmQsIHB3LCBpbmZvLmFyZ3MpOworICAgICAgICAgICAgICAgIHB3LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGluZm8pIHsKKyAgICAgICAgICAgICAgICBpbmZvLmR1bXBlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaW5mby5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgZmluYWwgdm9pZCBoYW5kbGVTZXJ2aWNlQXJncyhTZXJ2aWNlQXJnc0RhdGEgZGF0YSkgewogICAgICAgICBTZXJ2aWNlIHMgPSBtU2VydmljZXMuZ2V0KGRhdGEudG9rZW4pOwogICAgICAgICBpZiAocyAhPSBudWxsKSB7CkBAIC0yNTUyLDYgKzI2MzEsOSBAQAogICAgICAgICAgICAgaWYgKGZpbmlzaGluZykgewogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXROb25Db25maWdJbnN0YW5jZSkgeworICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFyLnBhdXNlZCkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUNhbGxlZCA9IGZhbHNlOwpAQCAtMjU5Miw4ICsyNjc0LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChnZXROb25Db25maWdJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5vblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByLmFjdGl2aXR5LnJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnN0cnVtZW50YXRpb24ub25FeGNlcHRpb24oci5hY3Rpdml0eSwgZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKApAQCAtMjYwMiwyMiArMjY4NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBlLnRvU3RyaW5nKCksIGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5vblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbUluc3RydW1lbnRhdGlvbi5vbkV4Y2VwdGlvbihyLmFjdGl2aXR5LCBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmV0YWluIGNoaWxkIGFjdGl2aXRpZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNhZmVUb0NvbXBvbmVudFNob3J0U3RyaW5nKHIuaW50ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUNhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkub25EZXN0cm95KCk7CisgICAgICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5jYWxsQWN0aXZpdHlPbkRlc3Ryb3koci5hY3Rpdml0eSk7CiAgICAgICAgICAgICAgICAgaWYgKCFyLmFjdGl2aXR5Lm1DYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5ICIgKyBzYWZlVG9Db21wb25lbnRTaG9ydFN0cmluZyhyLmludGVudCkgKwpAQCAtMzAyOSw2ICszMDk5LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBmaW5hbCB2b2lkIGhhbmRsZUR1bXBIZWFwKGJvb2xlYW4gbWFuYWdlZCwgRHVtcEhlYXBEYXRhIGRoZCkgeworICAgICAgICBpZiAobWFuYWdlZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBEZWJ1Zy5kdW1wSHByb2ZEYXRhKGRoZC5wYXRoLCBkaGQuZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIk1hbmFnZWQgaGVhcCBkdW1wIGZhaWxlZCBvbiBwYXRoICIgKyBkaGQucGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0tIGNhbiB0aGUgcHJvY2VzcyBhY2Nlc3MgdGhpcyBwYXRoPyIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkaGQuZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJGYWlsdXJlIGNsb3NpbmcgcHJvZmlsZSBmZCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERlYnVnLmR1bXBOYXRpdmVIZWFwKGRoZC5mZC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGZpbmFsIHZvaWQgaGFuZGxlRGlzcGF0Y2hQYWNrYWdlQnJvYWRjYXN0KGludCBjbWQsIFN0cmluZ1tdIHBhY2thZ2VzKSB7CiAgICAgICAgIGJvb2xlYW4gaGFzUGtnSW5mbyA9IGZhbHNlOwogICAgICAgICBpZiAocGFja2FnZXMgIT0gbnVsbCkgewpAQCAtMzYxMSw2ICszNzAwLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGl2aXR5VGhyZWFkIHN5c3RlbU1haW4oKSB7CisgICAgICAgIEhhcmR3YXJlUmVuZGVyZXIuZGlzYWJsZSgpOwogICAgICAgICBBY3Rpdml0eVRocmVhZCB0aHJlYWQgPSBuZXcgQWN0aXZpdHlUaHJlYWQoKTsKICAgICAgICAgdGhyZWFkLmF0dGFjaCh0cnVlKTsKICAgICAgICAgcmV0dXJuIHRocmVhZDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BbGVydERpYWxvZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FsZXJ0RGlhbG9nLmphdmEKaW5kZXggNjFhOGZjMy4uMGE0MGE5OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FsZXJ0RGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FsZXJ0RGlhbG9nLmphdmEKQEAgLTE2LDEyICsxNiwxNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlcjsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CkBAIC0zMCw4ICszNSw2IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyOwotCiAvKioKICAqIEEgc3ViY2xhc3Mgb2YgRGlhbG9nIHRoYXQgY2FuIGRpc3BsYXkgb25lLCB0d28gb3IgdGhyZWUgYnV0dG9ucy4gSWYgeW91IG9ubHkgd2FudCB0bwogICogZGlzcGxheSBhIFN0cmluZyBpbiB0aGlzIGRpYWxvZyBib3gsIHVzZSB0aGUgc2V0TWVzc2FnZSgpIG1ldGhvZC4gIElmIHlvdQpAQCAtNTYsMjEgKzU5LDI5IEBACiAgICAgcHJpdmF0ZSBBbGVydENvbnRyb2xsZXIgbUFsZXJ0OwogCiAgICAgcHJvdGVjdGVkIEFsZXJ0RGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRGlhbG9nX0FsZXJ0KTsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBnZXREZWZhdWx0RGlhbG9nVGhlbWUoY29udGV4dCkpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBBbGVydERpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCB0aGVtZSk7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIHRoZW1lID09IDAgPyBnZXREZWZhdWx0RGlhbG9nVGhlbWUoY29udGV4dCkgOiB0aGVtZSk7CiAgICAgICAgIG1BbGVydCA9IG5ldyBBbGVydENvbnRyb2xsZXIoY29udGV4dCwgdGhpcywgZ2V0V2luZG93KCkpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBBbGVydERpYWxvZyhDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gY2FuY2VsYWJsZSwgT25DYW5jZWxMaXN0ZW5lciBjYW5jZWxMaXN0ZW5lcikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCk7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGdldERlZmF1bHREaWFsb2dUaGVtZShjb250ZXh0KSk7CiAgICAgICAgIHNldENhbmNlbGFibGUoY2FuY2VsYWJsZSk7CiAgICAgICAgIHNldE9uQ2FuY2VsTGlzdGVuZXIoY2FuY2VsTGlzdGVuZXIpOwogICAgICAgICBtQWxlcnQgPSBuZXcgQWxlcnRDb250cm9sbGVyKGNvbnRleHQsIHRoaXMsIGdldFdpbmRvdygpKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdERpYWxvZ1RoZW1lKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBUeXBlZFZhbHVlIG91dFZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFsZXJ0RGlhbG9nVGhlbWUsCisgICAgICAgICAgICAgICAgb3V0VmFsdWUsIHRydWUpOworICAgICAgICBMb2cuZCgiQWxlcnREaWFsb2ciLCAiZ2V0RGVmYXVsdERpYWxvZ1RoZW1lIGRhdGEgIiArIG91dFZhbHVlLmRhdGEgKyAiIGlkICIgKyBvdXRWYWx1ZS5yZXNvdXJjZUlkKTsKKyAgICAgICAgcmV0dXJuIG91dFZhbHVlLnJlc291cmNlSWQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogR2V0cyBvbmUgb2YgdGhlIGJ1dHRvbnMgdXNlZCBpbiB0aGUgZGlhbG9nLgogICAgICAqIDxwPgpAQCAtMjY2LDEyICsyNzcsMTMgQEAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBwcml2YXRlIGZpbmFsIEFsZXJ0Q29udHJvbGxlci5BbGVydFBhcmFtcyBQOwogICAgICAgICBwcml2YXRlIGludCBtVGhlbWU7CisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtV3JhcHBlZENvbnRleHQ7CiAgICAgICAgIAogICAgICAgICAvKioKICAgICAgICAgICogQ29uc3RydWN0b3IgdXNpbmcgYSBjb250ZXh0IGZvciB0aGlzIGJ1aWxkZXIgYW5kIHRoZSB7QGxpbmsgQWxlcnREaWFsb2d9IGl0IGNyZWF0ZXMuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQnVpbGRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2dfQWxlcnQpOworICAgICAgICAgICAgdGhpcyhjb250ZXh0LCBnZXREZWZhdWx0RGlhbG9nVGhlbWUoY29udGV4dCkpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yODQsNiArMjk2LDIxIEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENvbnRleHR9IHdpdGggdGhlIGFwcHJvcHJpYXRlIHRoZW1lIGZvciBkaWFsb2dzIGNyZWF0ZWQgYnkgdGhpcyBCdWlsZGVyLgorICAgICAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGlzIENvbnRleHQgZm9yIG9idGFpbmluZyBMYXlvdXRJbmZsYXRlcnMgZm9yIGluZmxhdGluZyB2aWV3cworICAgICAgICAgKiB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgcmVzdWx0aW5nIGRpYWxvZ3MsIGFzIGl0IHdpbGwgY2F1c2Ugdmlld3MgdG8gYmUgaW5mbGF0ZWQgd2l0aAorICAgICAgICAgKiB0aGUgY29ycmVjdCB0aGVtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBBIENvbnRleHQgZm9yIGJ1aWx0IERpYWxvZ3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICAgICAgaWYgKG1XcmFwcGVkQ29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVdyYXBwZWRDb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoUC5tQ29udGV4dCwgbVRoZW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZENvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogU2V0IHRoZSB0aXRsZSB1c2luZyB0aGUgZ2l2ZW4gcmVzb3VyY2UgaWQuCiAgICAgICAgICAqCiAgICAgICAgICAqIEByZXR1cm4gVGhpcyBCdWlsZGVyIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMgdG8gc2V0IG1ldGhvZHMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCmluZGV4IDIzODI1OTYuLjFlMDEyZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgIGNhbmRpZGF0ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KERFRkFVTFRfRVJST1JfUkVDRUlWRVJfUFJPUEVSVFkpOwogICAgICAgICByZXR1cm4gZ2V0RXJyb3JSZXBvcnRSZWNlaXZlcihwbSwgcGFja2FnZU5hbWUsIGNhbmRpZGF0ZSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGFjdGl2aXR5IGluIHJlY2VpdmVyUGFja2FnZSB0aGF0IGhhbmRsZXMgQUNUSU9OX0FQUF9FUlJPUi4KICAgICAgKgpAQCAtNTgxLDYgKzU4MSw5IEBACiAgICAgICAgICAgICBjYXNlIFRZUEVfQkFUVEVSWToKICAgICAgICAgICAgICAgICBiYXR0ZXJ5SW5mby5kdW1wKHB3LCBwcmVmaXgpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX1JVTk5JTkdfU0VSVklDRToKKyAgICAgICAgICAgICAgICBydW5uaW5nU2VydmljZUluZm8uZHVtcChwdywgcHJlZml4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKaW5kZXggMWMyMDA2Mi4uOTU2ODlmYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKQEAgLTQwMyw2ICs0MDMsMzIgQEAKICAgICAgICAgICAgIHNjaGVkdWxlQ3Jhc2gobXNnKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEVU1QX0hFQVBfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQXBwbGljYXRpb25UaHJlYWQuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERVTVBfQUNUSVZJVFlfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQXBwbGljYXRpb25UaHJlYWQuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgICAgICBmaW5hbCBJQmluZGVyIGFjdGl2aXR5ID0gZGF0YS5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBhcmdzID0gZGF0YS5yZWFkU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZHVtcEFjdGl2aXR5KGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGFjdGl2aXR5LCBhcmdzKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmZC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKQEAgLTgyOSw1ICs4NTUsMzMgQEAKICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CiAgICAgICAgIAogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBIZWFwKGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFwcGxpY2F0aW9uVGhyZWFkLmRlc2NyaXB0b3IpOworICAgICAgICBkYXRhLndyaXRlSW50KG1hbmFnZWQgPyAxIDogMCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocGF0aCk7CisgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDEpOworICAgICAgICAgICAgZmQud3JpdGVUb1BhcmNlbChkYXRhLCBQYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChEVU1QX0hFQVBfVFJBTlNBQ1RJT04sIGRhdGEsIG51bGwsCisgICAgICAgICAgICAgICAgSUJpbmRlci5GTEFHX09ORVdBWSk7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBY3Rpdml0eShGaWxlRGVzY3JpcHRvciBmZCwgSUJpbmRlciB0b2tlbiwgU3RyaW5nW10gYXJncykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBcHBsaWNhdGlvblRocmVhZC5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZUZpbGVEZXNjcmlwdG9yKGZkKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcih0b2tlbik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmdBcnJheShhcmdzKTsKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChEVU1QX0FDVElWSVRZX1RSQU5TQUNUSU9OLCBkYXRhLCBudWxsLCAwKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQmFja1N0YWNrUmVjb3JkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQmFja1N0YWNrUmVjb3JkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjYzBmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tSZWNvcmQuamF2YQpAQCAtMCwwICsxLDU2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworZmluYWwgY2xhc3MgQmFja1N0YWNrU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBpbnRbXSBtT3BzOworICAgIGZpbmFsIGludCBtVHJhbnNpdGlvbjsKKyAgICBmaW5hbCBpbnQgbVRyYW5zaXRpb25TdHlsZTsKKyAgICBmaW5hbCBTdHJpbmcgbU5hbWU7CisgICAgZmluYWwgaW50IG1JbmRleDsKKyAgICBmaW5hbCBpbnQgbUJyZWFkQ3J1bWJUaXRsZVJlczsKKyAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbUJyZWFkQ3J1bWJUaXRsZVRleHQ7CisgICAgZmluYWwgaW50IG1CcmVhZENydW1iU2hvcnRUaXRsZVJlczsKKyAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbUJyZWFkQ3J1bWJTaG9ydFRpdGxlVGV4dDsKKworICAgIHB1YmxpYyBCYWNrU3RhY2tTdGF0ZShGcmFnbWVudE1hbmFnZXJJbXBsIGZtLCBCYWNrU3RhY2tSZWNvcmQgYnNlKSB7CisgICAgICAgIGludCBudW1SZW1vdmVkID0gMDsKKyAgICAgICAgQmFja1N0YWNrUmVjb3JkLk9wIG9wID0gYnNlLm1IZWFkOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgIT0gbnVsbCkgbnVtUmVtb3ZlZCArPSBvcC5yZW1vdmVkLnNpemUoKTsKKyAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgfQorICAgICAgICBtT3BzID0gbmV3IGludFtic2UubU51bU9wKjUgKyBudW1SZW1vdmVkXTsKKworICAgICAgICBpZiAoIWJzZS5tQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBvbiBiYWNrIHN0YWNrIik7CisgICAgICAgIH0KKworICAgICAgICBvcCA9IGJzZS5tSGVhZDsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmNtZDsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuZnJhZ21lbnQubUluZGV4OworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gb3AucmVtb3ZlZC5zaXplKCk7CisgICAgICAgICAgICAgICAgbU9wc1twb3MrK10gPSBOOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5yZW1vdmVkLmdldChpKS5tSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3BzW3BvcysrXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zaXRpb24gPSBic2UubVRyYW5zaXRpb247CisgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUgPSBic2UubVRyYW5zaXRpb25TdHlsZTsKKyAgICAgICAgbU5hbWUgPSBic2UubU5hbWU7CisgICAgICAgIG1JbmRleCA9IGJzZS5tSW5kZXg7CisgICAgICAgIG1CcmVhZENydW1iVGl0bGVSZXMgPSBic2UubUJyZWFkQ3J1bWJUaXRsZVJlczsKKyAgICAgICAgbUJyZWFkQ3J1bWJUaXRsZVRleHQgPSBic2UubUJyZWFkQ3J1bWJUaXRsZVRleHQ7CisgICAgICAgIG1CcmVhZENydW1iU2hvcnRUaXRsZVJlcyA9IGJzZS5tQnJlYWRDcnVtYlNob3J0VGl0bGVSZXM7CisgICAgICAgIG1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQgPSBic2UubUJyZWFkQ3J1bWJTaG9ydFRpdGxlVGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1PcHMgPSBpbi5jcmVhdGVJbnRBcnJheSgpOworICAgICAgICBtVHJhbnNpdGlvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbVRyYW5zaXRpb25TdHlsZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbU5hbWUgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1JbmRleCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUJyZWFkQ3J1bWJUaXRsZVJlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUJyZWFkQ3J1bWJUaXRsZVRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICBtQnJlYWRDcnVtYlNob3J0VGl0bGVSZXMgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgIH0KKworICAgIHB1YmxpYyBCYWNrU3RhY2tSZWNvcmQgaW5zdGFudGlhdGUoRnJhZ21lbnRNYW5hZ2VySW1wbCBmbSkgeworICAgICAgICBCYWNrU3RhY2tSZWNvcmQgYnNlID0gbmV3IEJhY2tTdGFja1JlY29yZChmbSk7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICB3aGlsZSAocG9zIDwgbU9wcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIEJhY2tTdGFja1JlY29yZC5PcCBvcCA9IG5ldyBCYWNrU3RhY2tSZWNvcmQuT3AoKTsKKyAgICAgICAgICAgIG9wLmNtZCA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KEZyYWdtZW50TWFuYWdlckltcGwuVEFHLAorICAgICAgICAgICAgICAgICAgICAiQlNFICIgKyBic2UgKyAiIHNldCBiYXNlIGZyYWdtZW50ICMiICsgbU9wc1twb3NdKTsKKyAgICAgICAgICAgIEZyYWdtZW50IGYgPSBmbS5tQWN0aXZlLmdldChtT3BzW3BvcysrXSk7CisgICAgICAgICAgICBvcC5mcmFnbWVudCA9IGY7CisgICAgICAgICAgICBvcC5lbnRlckFuaW0gPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIG9wLmV4aXRBbmltID0gbU9wc1twb3MrK107CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgb3AucmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KE4pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KEZyYWdtZW50TWFuYWdlckltcGwuVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCU0UgIiArIGJzZSArICIgc2V0IHJlbW92ZSBmcmFnbWVudCAjIiArIG1PcHNbcG9zXSk7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IHIgPSBmbS5tQWN0aXZlLmdldChtT3BzW3BvcysrXSk7CisgICAgICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQuYWRkKHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzZS5hZGRPcChvcCk7CisgICAgICAgIH0KKyAgICAgICAgYnNlLm1UcmFuc2l0aW9uID0gbVRyYW5zaXRpb247CisgICAgICAgIGJzZS5tVHJhbnNpdGlvblN0eWxlID0gbVRyYW5zaXRpb25TdHlsZTsKKyAgICAgICAgYnNlLm1OYW1lID0gbU5hbWU7CisgICAgICAgIGJzZS5tSW5kZXggPSBtSW5kZXg7CisgICAgICAgIGJzZS5tQWRkVG9CYWNrU3RhY2sgPSB0cnVlOworICAgICAgICBic2UubUJyZWFkQ3J1bWJUaXRsZVJlcyA9IG1CcmVhZENydW1iVGl0bGVSZXM7CisgICAgICAgIGJzZS5tQnJlYWRDcnVtYlRpdGxlVGV4dCA9IG1CcmVhZENydW1iVGl0bGVUZXh0OworICAgICAgICBic2UubUJyZWFkQ3J1bWJTaG9ydFRpdGxlUmVzID0gbUJyZWFkQ3J1bWJTaG9ydFRpdGxlUmVzOworICAgICAgICBic2UubUJyZWFkQ3J1bWJTaG9ydFRpdGxlVGV4dCA9IG1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQ7CisgICAgICAgIGJzZS5idW1wQmFja1N0YWNrTmVzdGluZygxKTsKKyAgICAgICAgcmV0dXJuIGJzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlSW50QXJyYXkobU9wcyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVRyYW5zaXRpb24pOworICAgICAgICBkZXN0LndyaXRlSW50KG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1OYW1lKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtSW5kZXgpOworICAgICAgICBkZXN0LndyaXRlSW50KG1CcmVhZENydW1iVGl0bGVSZXMpOworICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbChtQnJlYWRDcnVtYlRpdGxlVGV4dCwgZGVzdCwgMCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUJyZWFkQ3J1bWJTaG9ydFRpdGxlUmVzKTsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobUJyZWFkQ3J1bWJTaG9ydFRpdGxlVGV4dCwgZGVzdCwgMCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8QmFja1N0YWNrU3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxCYWNrU3RhY2tTdGF0ZT4oKSB7CisgICAgICAgIHB1YmxpYyBCYWNrU3RhY2tTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tTdGF0ZShpbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQGhpZGUgRW50cnkgb2YgYW4gb3BlcmF0aW9uIG9uIHRoZSBmcmFnbWVudCBiYWNrIHN0YWNrLgorICovCitmaW5hbCBjbGFzcyBCYWNrU3RhY2tSZWNvcmQgaW1wbGVtZW50cyBGcmFnbWVudFRyYW5zYWN0aW9uLAorICAgICAgICBGcmFnbWVudE1hbmFnZXIuQmFja1N0YWNrRW50cnksIFJ1bm5hYmxlIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCYWNrU3RhY2tFbnRyeSI7CisKKyAgICBmaW5hbCBGcmFnbWVudE1hbmFnZXJJbXBsIG1NYW5hZ2VyOworCisgICAgc3RhdGljIGZpbmFsIGludCBPUF9OVUxMID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX0FERCA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9SRVBMQUNFID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1JFTU9WRSA9IDM7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9ISURFID0gNDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1NIT1cgPSA1OworCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE9wIHsKKyAgICAgICAgT3AgbmV4dDsKKyAgICAgICAgT3AgcHJldjsKKyAgICAgICAgaW50IGNtZDsKKyAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQ7CisgICAgICAgIGludCBlbnRlckFuaW07CisgICAgICAgIGludCBleGl0QW5pbTsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiByZW1vdmVkOworICAgIH0KKworICAgIE9wIG1IZWFkOworICAgIE9wIG1UYWlsOworICAgIGludCBtTnVtT3A7CisgICAgaW50IG1FbnRlckFuaW07CisgICAgaW50IG1FeGl0QW5pbTsKKyAgICBpbnQgbVRyYW5zaXRpb247CisgICAgaW50IG1UcmFuc2l0aW9uU3R5bGU7CisgICAgYm9vbGVhbiBtQWRkVG9CYWNrU3RhY2s7CisgICAgU3RyaW5nIG1OYW1lOworICAgIGJvb2xlYW4gbUNvbW1pdHRlZDsKKyAgICBpbnQgbUluZGV4OworCisgICAgaW50IG1CcmVhZENydW1iVGl0bGVSZXM7CisgICAgQ2hhclNlcXVlbmNlIG1CcmVhZENydW1iVGl0bGVUZXh0OworICAgIGludCBtQnJlYWRDcnVtYlNob3J0VGl0bGVSZXM7CisgICAgQ2hhclNlcXVlbmNlIG1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQ7CisKKyAgICBwdWJsaWMgQmFja1N0YWNrUmVjb3JkKEZyYWdtZW50TWFuYWdlckltcGwgbWFuYWdlcikgeworICAgICAgICBtTWFuYWdlciA9IG1hbmFnZXI7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JbmRleDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEJyZWFkQ3J1bWJUaXRsZSgpIHsKKyAgICAgICAgaWYgKG1CcmVhZENydW1iVGl0bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLm1BY3Rpdml0eS5nZXRUZXh0KG1CcmVhZENydW1iVGl0bGVSZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQnJlYWRDcnVtYlRpdGxlVGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEJyZWFkQ3J1bWJTaG9ydFRpdGxlKCkgeworICAgICAgICBpZiAobUJyZWFkQ3J1bWJTaG9ydFRpdGxlUmVzICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtTWFuYWdlci5tQWN0aXZpdHkuZ2V0VGV4dChtQnJlYWRDcnVtYlNob3J0VGl0bGVSZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQnJlYWRDcnVtYlNob3J0VGl0bGVUZXh0OworICAgIH0KKworICAgIHZvaWQgYWRkT3AoT3Agb3ApIHsKKyAgICAgICAgaWYgKG1IZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgIG1IZWFkID0gbVRhaWwgPSBvcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wLnByZXYgPSBtVGFpbDsKKyAgICAgICAgICAgIG1UYWlsLm5leHQgPSBvcDsKKyAgICAgICAgICAgIG1UYWlsID0gb3A7CisgICAgICAgIH0KKyAgICAgICAgb3AuZW50ZXJBbmltID0gbUVudGVyQW5pbTsKKyAgICAgICAgb3AuZXhpdEFuaW0gPSBtRXhpdEFuaW07CisgICAgICAgIG1OdW1PcCsrOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZykgeworICAgICAgICBkb0FkZE9wKDAsIGZyYWdtZW50LCB0YWcsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIG51bGwsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZykgeworICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIHRhZywgT1BfQUREKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvQWRkT3AoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcsIGludCBvcGNtZCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IGFscmVhZHkgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID0gbU1hbmFnZXIubUFjdGl2aXR5OworICAgICAgICBmcmFnbWVudC5tRnJhZ21lbnRNYW5hZ2VyID0gbU1hbmFnZXI7CisKKyAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVRhZyAhPSBudWxsICYmICF0YWcuZXF1YWxzKGZyYWdtZW50Lm1UYWcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY2hhbmdlIHRhZyBvZiBmcmFnbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZyYWdtZW50ICsgIjogd2FzICIgKyBmcmFnbWVudC5tVGFnCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbm93ICIgKyB0YWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQubVRhZyA9IHRhZzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250YWluZXJWaWV3SWQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1GcmFnbWVudElkICE9IDAgJiYgZnJhZ21lbnQubUZyYWdtZW50SWQgIT0gY29udGFpbmVyVmlld0lkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY2hhbmdlIGNvbnRhaW5lciBJRCBvZiBmcmFnbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZyYWdtZW50ICsgIjogd2FzICIgKyBmcmFnbWVudC5tRnJhZ21lbnRJZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdyAiICsgY29udGFpbmVyVmlld0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm1Db250YWluZXJJZCA9IGZyYWdtZW50Lm1GcmFnbWVudElkID0gY29udGFpbmVyVmlld0lkOworICAgICAgICB9CisKKyAgICAgICAgT3Agb3AgPSBuZXcgT3AoKTsKKyAgICAgICAgb3AuY21kID0gb3BjbWQ7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZXBsYWNlKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIHJldHVybiByZXBsYWNlKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5lclZpZXdJZCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IHVzZSBub24temVybyBjb250YWluZXJWaWV3SWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvQWRkT3AoY29udGFpbmVyVmlld0lkLCBmcmFnbWVudCwgdGFnLCBPUF9SRVBMQUNFKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVtb3ZlKEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgbm90IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisKKyAgICAgICAgT3Agb3AgPSBuZXcgT3AoKTsKKyAgICAgICAgb3AuY21kID0gT1BfUkVNT1ZFOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gaGlkZShGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IG5vdCBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX0hJREU7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzaG93KEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgbm90IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisKKyAgICAgICAgT3Agb3AgPSBuZXcgT3AoKTsKKyAgICAgICAgb3AuY21kID0gT1BfU0hPVzsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEN1c3RvbUFuaW1hdGlvbnMoaW50IGVudGVyLCBpbnQgZXhpdCkgeworICAgICAgICBtRW50ZXJBbmltID0gZW50ZXI7CisgICAgICAgIG1FeGl0QW5pbSA9IGV4aXQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb24oaW50IHRyYW5zaXRpb24pIHsKKyAgICAgICAgbVRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uU3R5bGUoaW50IHN0eWxlUmVzKSB7CisgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUgPSBzdHlsZVJlczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkVG9CYWNrU3RhY2soU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbUFkZFRvQmFja1N0YWNrID0gdHJ1ZTsKKyAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRCcmVhZENydW1iVGl0bGUoaW50IHJlcykgeworICAgICAgICBtQnJlYWRDcnVtYlRpdGxlUmVzID0gcmVzOworICAgICAgICBtQnJlYWRDcnVtYlRpdGxlVGV4dCA9IG51bGw7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEJyZWFkQ3J1bWJUaXRsZShDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICBtQnJlYWRDcnVtYlRpdGxlUmVzID0gMDsKKyAgICAgICAgbUJyZWFkQ3J1bWJUaXRsZVRleHQgPSB0ZXh0OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRCcmVhZENydW1iU2hvcnRUaXRsZShpbnQgcmVzKSB7CisgICAgICAgIG1CcmVhZENydW1iU2hvcnRUaXRsZVJlcyA9IHJlczsKKyAgICAgICAgbUJyZWFkQ3J1bWJTaG9ydFRpdGxlVGV4dCA9IG51bGw7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEJyZWFkQ3J1bWJTaG9ydFRpdGxlKENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIG1CcmVhZENydW1iU2hvcnRUaXRsZVJlcyA9IDA7CisgICAgICAgIG1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQgPSB0ZXh0OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICB2b2lkIGJ1bXBCYWNrU3RhY2tOZXN0aW5nKGludCBhbXQpIHsKKyAgICAgICAgaWYgKCFtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQnVtcCBuZXN0aW5nIGluICIgKyB0aGlzCisgICAgICAgICAgICAgICAgKyAiIGJ5ICIgKyBhbXQpOworICAgICAgICBPcCBvcCA9IG1IZWFkOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgb3AuZnJhZ21lbnQubUJhY2tTdGFja05lc3RpbmcgKz0gYW10OworICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIkJ1bXAgbmVzdGluZyBvZiAiCisgICAgICAgICAgICAgICAgICAgICsgb3AuZnJhZ21lbnQgKyAiIHRvICIgKyBvcC5mcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyk7CisgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1vcC5yZW1vdmVkLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgciA9IG9wLnJlbW92ZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICByLm1CYWNrU3RhY2tOZXN0aW5nICs9IGFtdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIkJ1bXAgbmVzdGluZyBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByICsgIiB0byAiICsgci5tQmFja1N0YWNrTmVzdGluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBjb21taXQoKSB7CisgICAgICAgIGlmIChtQ29tbWl0dGVkKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb21taXQgYWxyZWFkeSBjYWxsZWQiKTsKKyAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIkNvbW1pdDogIiArIHRoaXMpOworICAgICAgICBtQ29tbWl0dGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgbUluZGV4ID0gbU1hbmFnZXIuYWxsb2NCYWNrU3RhY2tJbmRleCh0aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbmRleCA9IC0xOworICAgICAgICB9CisgICAgICAgIG1NYW5hZ2VyLmVucXVldWVBY3Rpb24odGhpcyk7CisgICAgICAgIHJldHVybiBtSW5kZXg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiUnVuOiAiICsgdGhpcyk7CisKKyAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgaWYgKG1JbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGRUb0JhY2tTdGFjaygpIGNhbGxlZCBhZnRlciBjb21taXQoKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVtcEJhY2tTdGFja05lc3RpbmcoMSk7CisKKyAgICAgICAgT3Agb3AgPSBtSGVhZDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3AuY21kKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9BREQ6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmVudGVyQW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQoZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRVBMQUNFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1NYW5hZ2VyLm1BZGRlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bU1hbmFnZXIubUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgb2xkID0gbU1hbmFnZXIubUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9QX1JFUExBQ0U6IGFkZGluZz0iICsgZiArICIgb2xkPSIgKyBvbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGQubUNvbnRhaW5lcklkID09IGYubUNvbnRhaW5lcklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQuYWRkKG9sZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5tTmV4dEFuaW0gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLm1CYWNrU3RhY2tOZXN0aW5nICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQnVtcCBuZXN0aW5nIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvbGQgKyAiIHRvICIgKyBvbGQubUJhY2tTdGFja05lc3RpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KG9sZCwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmVudGVyQW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQoZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRU1PVkU6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVGcmFnbWVudChmLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0hJREU6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5oaWRlRnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TSE9XOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNob3dGcmFnbWVudChmLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY21kOiAiICsgb3AuY21kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIG1NYW5hZ2VyLm1vdmVUb1N0YXRlKG1NYW5hZ2VyLm1DdXJTdGF0ZSwgbVRyYW5zaXRpb24sCisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSwgdHJ1ZSk7CisKKyAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgbU1hbmFnZXIuYWRkQmFja1N0YWNrU3RhdGUodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3BGcm9tQmFja1N0YWNrKGJvb2xlYW4gZG9TdGF0ZU1vdmUpIHsKKyAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgInBvcEZyb21CYWNrU3RhY2s6ICIgKyB0aGlzKTsKKworICAgICAgICBidW1wQmFja1N0YWNrTmVzdGluZygtMSk7CisKKyAgICAgICAgT3Agb3AgPSBtVGFpbDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3AuY21kKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9BREQ6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFUExBQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxvcC5yZW1vdmVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgb2xkID0gb3AucmVtb3ZlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtTWFuYWdlci5tQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQob2xkLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVNT1ZFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtTWFuYWdlci5tQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfSElERTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNob3dGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfU0hPVzogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmhpZGVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjbWQ6ICIgKyBvcC5jbWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3AgPSBvcC5wcmV2OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvU3RhdGVNb3ZlKSB7CisgICAgICAgICAgICBtTWFuYWdlci5tb3ZlVG9TdGF0ZShtTWFuYWdlci5tQ3VyU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgbU1hbmFnZXIuZnJlZUJhY2tTdGFja0luZGV4KG1JbmRleCk7CisgICAgICAgICAgICBtSW5kZXggPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2l0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNpdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb25TdHlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gbU51bU9wID09IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YQppbmRleCA1NWJhZGFjLi4wOTJmYTJhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YQpAQCAtNTYsMTEgKzU2LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5RGV0ZWN0b3I7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5JQ291bnRyeURldGVjdG9yOwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUxvY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKQEAgLTcyLDYgKzc1LDcgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLklXaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5Ecm9wQm94TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwpAQCAtODgsNyArOTIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzLkZpbGVTdGF0dXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CkBAIC0xNzAsNiArMTc0LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBUaHJvdHRsZU1hbmFnZXIgc1Rocm90dGxlTWFuYWdlcjsKICAgICBwcml2YXRlIHN0YXRpYyBXaWZpTWFuYWdlciBzV2lmaU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYXRpb25NYW5hZ2VyIHNMb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnRyeURldGVjdG9yIHNDb3VudHJ5RGV0ZWN0b3I7CiAgICAgcHJpdmF0ZSBzdGF0aWMgTmZjTWFuYWdlciBzTmZjTWFuYWdlcjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgU2hhcmVkUHJlZmVyZW5jZXNJbXBsPiBzU2hhcmVkUHJlZnMgPQogICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTaGFyZWRQcmVmZXJlbmNlc0ltcGw+KCk7CkBAIC0yMTIsMjMgKzIxNyw4IEBACiAgICAgcHJpdmF0ZSBGaWxlIG1FeHRlcm5hbEZpbGVzRGlyOwogICAgIHByaXZhdGUgRmlsZSBtRXh0ZXJuYWxDYWNoZURpcjsKIAotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgc0luc3RhbmNlQ291bnQgPSAwOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfRklMRV9MSVNUID0ge307CiAKLSAgICAvLyBGb3IgZGVidWcgb25seQotICAgIC8qCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgLS1zSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0gICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gc0luc3RhbmNlQ291bnQ7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFzc2V0TWFuYWdlciBnZXRBc3NldHMoKSB7CiAgICAgICAgIHJldHVybiBtUmVzb3VyY2VzLmdldEFzc2V0cygpOwpAQCAtNTQ1LDYgKzUzNSwxNSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICBGaWxlIGYgPSB2YWxpZGF0ZUZpbGVQYXRoKG5hbWUsIHRydWUpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKGYuZ2V0UGF0aCgpLCBmYWN0b3J5LCBlcnJvckhhbmRsZXIpOworICAgICAgICBzZXRGaWxlUGVybWlzc2lvbnNGcm9tTW9kZShmLmdldFBhdGgoKSwgbW9kZSwgMCk7CisgICAgICAgIHJldHVybiBkYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmlsZSBmID0gdmFsaWRhdGVGaWxlUGF0aChuYW1lLCBmYWxzZSk7CkBAIC02MjIsNyArNjIxLDggQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIElzIHRoaXMgcmVhbGx5IHdoYXQgeW91IHdhbnQ/Iik7CiAgICAgICAgIH0KICAgICAgICAgbU1haW5UaHJlYWQuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZXhlY1N0YXJ0QWN0aXZpdHkoCi0gICAgICAgICAgICBnZXRPdXRlckNvbnRleHQoKSwgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbnVsbCwgbnVsbCwgaW50ZW50LCAtMSk7CisgICAgICAgICAgICBnZXRPdXRlckNvbnRleHQoKSwgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbnVsbCwKKyAgICAgICAgICAgIChBY3Rpdml0eSludWxsLCBpbnRlbnQsIC0xKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTk0Niw2ICs5NDYsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpOwogICAgICAgICB9IGVsc2UgaWYgKExPQ0FUSU9OX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0TG9jYXRpb25NYW5hZ2VyKCk7CisgICAgICAgIH0gZWxzZSBpZiAoQ09VTlRSWV9ERVRFQ1RPUi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDb3VudHJ5RGV0ZWN0b3IoKTsKICAgICAgICAgfSBlbHNlIGlmIChTRUFSQ0hfU0VSVklDRS5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRTZWFyY2hNYW5hZ2VyKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoU0VOU09SX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CkBAIC0xMDY2LDggKzEwNjgsMTMgQEAKICAgICBwcml2YXRlIE5vdGlmaWNhdGlvbk1hbmFnZXIgZ2V0Tm90aWZpY2F0aW9uTWFuYWdlcigpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IG91dGVyQ29udGV4dCA9IGdldE91dGVyQ29udGV4dCgpOwogICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyID0gbmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihnZXRPdXRlckNvbnRleHQoKSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnRleHRUaGVtZVdyYXBwZXIob3V0ZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCkudGFyZ2V0U2RrVmVyc2lvbiA+PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0hvbG9fRGlhbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2cpLAogICAgICAgICAgICAgICAgICAgICAgICAgbU1haW5UaHJlYWQuZ2V0SGFuZGxlcigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTExNCw2ICsxMTIxLDE3IEBACiAgICAgICAgIHJldHVybiBzTG9jYXRpb25NYW5hZ2VyOwogICAgIH0KIAorICAgIHByaXZhdGUgQ291bnRyeURldGVjdG9yIGdldENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzU3luYykgeworICAgICAgICAgICAgaWYgKHNDb3VudHJ5RGV0ZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ09VTlRSWV9ERVRFQ1RPUik7CisgICAgICAgICAgICAgICAgSUNvdW50cnlEZXRlY3RvciBzZXJ2aWNlID0gSUNvdW50cnlEZXRlY3Rvci5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICAgICAgICAgIHNDb3VudHJ5RGV0ZWN0b3IgPSBuZXcgQ291bnRyeURldGVjdG9yKHNlcnZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzQ291bnRyeURldGVjdG9yOworICAgIH0KKwogICAgIHByaXZhdGUgU2VhcmNoTWFuYWdlciBnZXRTZWFyY2hNYW5hZ2VyKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVNlYXJjaE1hbmFnZXIgPT0gbnVsbCkgewpAQCAtMTUwMiw4ICsxNTIwLDYgQEAKICAgICB9CiAKICAgICBDb250ZXh0SW1wbCgpIHsKLSAgICAgICAgLy8gRm9yIGRlYnVnIG9ubHkKLSAgICAgICAgLy8rK3NJbnN0YW5jZUNvdW50OwogICAgICAgICBtT3V0ZXJDb250ZXh0ID0gdGhpczsKICAgICB9CiAKQEAgLTE1MTQsNyArMTUzMCw2IEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgRXhpc3RpbmcgYXBwbGljYXRpb24gY29udGV4dC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29udGV4dEltcGwoQ29udGV4dEltcGwgY29udGV4dCkgewotICAgICAgICArK3NJbnN0YW5jZUNvdW50OwogICAgICAgICBtUGFja2FnZUluZm8gPSBjb250ZXh0Lm1QYWNrYWdlSW5mbzsKICAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQubVJlc291cmNlczsKICAgICAgICAgbU1haW5UaHJlYWQgPSBjb250ZXh0Lm1NYWluVGhyZWFkOwpAQCAtMjgyMCw2ICsyODM1LDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiBkZWZWYWx1ZXMpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHYgPSAoU2V0PFN0cmluZz4pIG1NYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcga2V5LCBpbnQgZGVmVmFsdWUpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtMjg4MSw2ICsyOTAzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBFZGl0b3IgcHV0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBtTW9kaWZpZWQucHV0KGtleSwgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIEVkaXRvciBwdXRJbnQoU3RyaW5nIGtleSwgaW50IHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Nb2RpZmllZC5wdXQoa2V5LCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGF0ZVBpY2tlckRpYWxvZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RhdGVQaWNrZXJEaWFsb2cuamF2YQppbmRleCA4YmE0ODBkLi4zN2Y4NzM4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGF0ZVBpY2tlckRpYWxvZy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EYXRlUGlja2VyRGlhbG9nLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKQEAgLTgyLDcgKzgzLDkgQEAKICAgICAgICAgICAgIGludCB5ZWFyLAogICAgICAgICAgICAgaW50IG1vbnRoT2ZZZWFyLAogICAgICAgICAgICAgaW50IGRheU9mTW9udGgpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCwKKyAgICAgICAgdGhpcyhjb250ZXh0LCBjb250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9Ib2xvX0RpYWxvZ19BbGVydAorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCwKICAgICAgICAgICAgICAgICBjYWxsQmFjaywgeWVhciwgbW9udGhPZlllYXIsIGRheU9mTW9udGgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZy5qYXZhCmluZGV4IGRhOGM5ZTUuLjUyNjEyOWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEKQEAgLTE2LDE4ICsxNiwyMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFjdGlvbkJhckltcGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC0zNiwxMyArNDEsMTIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKQEAgLTc2LDYgKzgwLDcgQEAKICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwogICAgIFdpbmRvdyBtV2luZG93OwogICAgIFZpZXcgbURlY29yOworICAgIHByaXZhdGUgQWN0aW9uQmFySW1wbCBtQWN0aW9uQmFyOwogICAgIC8qKgogICAgICAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZSwgc28gaXQgaXMgaGlkZGVuIGZyb20gdGhlIFNESy4KICAgICAgKiB7QGhpZGV9CkBAIC0xMzYsOCArMTQxLDE0IEBACiAgICAgICogPHZhcj5jb250ZXh0PC92YXI+LiAgSWYgMCwgdGhlIGRlZmF1bHQgZGlhbG9nIHRoZW1lIHdpbGwgYmUgdXNlZC4KICAgICAgKi8KICAgICBwdWJsaWMgRGlhbG9nKENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoCi0gICAgICAgICAgICBjb250ZXh0LCB0aGVtZSA9PSAwID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2cgOiB0aGVtZSk7CisgICAgICAgIGlmICh0aGVtZSA9PSAwKSB7CisgICAgICAgICAgICBUeXBlZFZhbHVlIG91dFZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kaWFsb2dUaGVtZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0VmFsdWUsIHRydWUpOworICAgICAgICAgICAgdGhlbWUgPSBvdXRWYWx1ZS5yZXNvdXJjZUlkOworICAgICAgICB9CisKKyAgICAgICAgbUNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCB0aGVtZSk7CiAgICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwogICAgICAgICBXaW5kb3cgdyA9IFBvbGljeU1hbmFnZXIubWFrZU5ld1dpbmRvdyhtQ29udGV4dCk7CiAgICAgICAgIG1XaW5kb3cgPSB3OwpAQCAtMTcwLDEzICsxODEsMjIgQEAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgQ29udGV4dCB0aGlzIERpYWxvZyBpcyBydW5uaW5nIGluLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQ29udGV4dCBUaGUgQ29udGV4dCB0aGF0IHdhcyBzdXBwbGllZCB0byB0aGUgY29uc3RydWN0b3IuCisgICAgICogQHJldHVybiBDb250ZXh0IFRoZSBDb250ZXh0IHVzZWQgYnkgdGhlIERpYWxvZy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ29udGV4dCBnZXRDb250ZXh0KCkgewogICAgICAgICByZXR1cm4gbUNvbnRleHQ7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHtAbGluayBBY3Rpb25CYXJ9IGF0dGFjaGVkIHRvIHRoaXMgZGlhbG9nLCBpZiBwcmVzZW50LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aW9uQmFyIGF0dGFjaGVkIHRvIHRoZSBkaWFsb2cgb3IgbnVsbCBpZiBubyBBY3Rpb25CYXIgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uQmFyIGdldEFjdGlvbkJhcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXI7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgQWN0aXZpdHkgdGhhdCBvd25zIHRoaXMgZGlhbG9nLiBBbiBleGFtcGxlIHVzZTogVGhpcyBEaWFsb2cgd2lsbAogICAgICAqIHVzZSB0aGUgc3VnZ2VzdGVkIHZvbHVtZSBjb250cm9sIHN0cmVhbSBvZiB0aGUgQWN0aXZpdHkuCiAgICAgICogCkBAIC0yMTYsNiArMjM2LDkgQEAKICAgICBwdWJsaWMgdm9pZCBzaG93KCkgewogICAgICAgICBpZiAobVNob3dpbmcpIHsKICAgICAgICAgICAgIGlmIChtRGVjb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtV2luZG93Lmhhc0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUikpIHsKKyAgICAgICAgICAgICAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRGVjb3Iuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMjI3LDYgKzI1MCwxMSBAQAogCiAgICAgICAgIG9uU3RhcnQoKTsKICAgICAgICAgbURlY29yID0gbVdpbmRvdy5nZXREZWNvclZpZXcoKTsKKworICAgICAgICBpZiAobUFjdGlvbkJhciA9PSBudWxsICYmIG1XaW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhciA9IG5ldyBBY3Rpb25CYXJJbXBsKHRoaXMpOworICAgICAgICB9CisKICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbCA9IG1XaW5kb3cuZ2V0QXR0cmlidXRlcygpOwogICAgICAgICBpZiAoKGwuc29mdElucHV0TW9kZQogICAgICAgICAgICAgICAgICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9JU19GT1JXQVJEX05BVklHQVRJT04pID09IDApIHsKQEAgLTMxMCw3ICszMzgsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlfSwgeW91IHNob3VsZCBpbml0aWFsaXplZCB5b3VyIGRpYWxvZworICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlfSwgeW91IHNob3VsZCBpbml0aWFsaXplIHlvdXIgZGlhbG9nCiAgICAgICogaW4gdGhpcyBtZXRob2QsIGluY2x1ZGluZyBjYWxsaW5nIHtAbGluayAjc2V0Q29udGVudFZpZXd9LgogICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgdGhpcyBkaWFsb2cgaXMgYmVpbmcgcmVpbml0YWxpemVkIGFmdGVyIGEKICAgICAgKiAgICAgdGhlIGhvc3RpbmcgYWN0aXZpdHkgd2FzIHByZXZpb3VzbHkgc2h1dCBkb3duLCBob2xkcyB0aGUgcmVzdWx0IGZyb20KQEAgLTc3NSw2ICs4MDMsMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAc2VlIEFjdGl2aXR5I2ludmFsaWRhdGVPcHRpb25zTWVudSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZU9wdGlvbnNNZW51KCkgeworICAgICAgICBtV2luZG93LmludmFsaWRhdGVQYW5lbE1lbnUoV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQHNlZSBBY3Rpdml0eSNvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51LCBWaWV3LCBDb250ZXh0TWVudUluZm8pCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgewpAQCAtODMyLDggKzg2NywxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIEFjdGlvbk1vZGUgb25TdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbkJhci5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2FpdGVkIGFjdGl2aXR5LgorICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGFjdGl2aXR5LgogICAgICAqLwogICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBnZXRBc3NvY2lhdGVkQWN0aXZpdHkoKSB7CiAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbU93bmVyQWN0aXZpdHk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2dGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjM4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKKy8qKgorICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgZGlhbG9nIHdpbmRvdywgZmxvYXRpbmcgb24gdG9wIG9mIGl0cworICogYWN0aXZpdHkncyB3aW5kb3cuICBUaGlzIGZyYWdtZW50IGNvbnRhaW5zIGEgRGlhbG9nIG9iamVjdCwgd2hpY2ggaXQKKyAqIGRpc3BsYXlzIGFzIGFwcHJvcHJpYXRlIGJhc2VkIG9uIHRoZSBmcmFnbWVudCdzIHN0YXRlLiAgQ29udHJvbCBvZgorICogdGhlIGRpYWxvZyAoZGVjaWRpbmcgd2hlbiB0byBzaG93LCBoaWRlLCBkaXNtaXNzIGl0KSBzaG91bGQgYmUgZG9uZSB0aHJvdWdoCisgKiB0aGUgQVBJIGhlcmUsIG5vdCB3aXRoIGRpcmVjdCBjYWxscyBvbiB0aGUgZGlhbG9nLgorICoKKyAqIDxwPkltcGxlbWVudGF0aW9ucyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50CisgKiB7QGxpbmsgI29uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciwgVmlld0dyb3VwLCBCdW5kbGUpfSB0byBzdXBwbHkgdGhlCisgKiBjb250ZW50IG9mIHRoZSBkaWFsb2cuICBBbHRlcm5hdGl2ZWx5LCB0aGV5IGNhbiBvdmVycmlkZQorICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhCdW5kbGUpfSB0byBjcmVhdGUgYW4gZW50aXJlbHkgY3VzdG9tIGRpYWxvZywgc3VjaAorICogYXMgYW4gQWxlcnREaWFsb2csIHdpdGggaXRzIG93biBjb250ZW50LgorICoKKyAqIDxwPlRvcGljcyBjb3ZlcmVkIGhlcmU6CisgKiA8b2w+CisgKiA8bGk+PGEgaHJlZj0iI0xpZmVjeWNsZSI+TGlmZWN5Y2xlPC9hPgorICogPGxpPjxhIGhyZWY9IiNCYXNpY0RpYWxvZyI+QmFzaWMgRGlhbG9nPC9hPgorICogPGxpPjxhIGhyZWY9IiNBbGVydERpYWxvZyI+QWxlcnQgRGlhbG9nPC9hPgorICogPGxpPjxhIGhyZWY9IiNEaWFsb2dPckVtYmVkIj5TZWxlY3RpbmcgQmV0d2VlbiBEaWFsb2cgb3IgRW1iZWRkaW5nPC9hPgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMaWZlY3ljbGUiPjwvYT4KKyAqIDxoMz5MaWZlY3ljbGU8L2gzPgorICoKKyAqIDxwPkRpYWxvZ0ZyYWdtZW50IGRvZXMgdmFyaW91cyB0aGluZ3MgdG8ga2VlcCB0aGUgZnJhZ21lbnQncyBsaWZlY3ljbGUKKyAqIGRyaXZpbmcgaXQsIGluc3RlYWQgb2YgdGhlIERpYWxvZy4gIE5vdGUgdGhhdCBkaWFsb2dzIGFyZSBnZW5lcmFsbHkKKyAqIGF1dG9ub21vdXMgZW50aXRpZXMgLS0gdGhleSBhcmUgdGhlaXIgb3duIHdpbmRvdywgcmVjZWl2aW5nIHRoZWlyIG93bgorICogaW5wdXQgZXZlbnRzLCBhbmQgb2Z0ZW4gZGVjaWRpbmcgb24gdGhlaXIgb3duIHdoZW4gdG8gZGlzYXBwZWFyIChieQorICogcmVjZWl2aW5nIGEgYmFjayBrZXkgZXZlbnQgb3IgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSBidXR0b24pLgorICoKKyAqIDxwPkRpYWxvZ0ZyYWdtZW50IG5lZWRzIHRvIGVuc3VyZSB0aGF0IHdoYXQgaXMgaGFwcGVuaW5nIHdpdGggdGhlIEZyYWdtZW50CisgKiBhbmQgRGlhbG9nIHN0YXRlcyByZW1haW5zIGNvbnNpc3RlbnQuICBUbyBkbyB0aGlzLCBpdCB3YXRjaGVzIGZvciBkaXNtaXNzCisgKiBldmVudHMgZnJvbSB0aGUgZGlhbG9nIGFuZCB0YWtlcyBhcmUgb2YgcmVtb3ZpbmcgaXRzIG93biBzdGF0ZSB3aGVuIHRoZXkKKyAqIGhhcHBlbi4gIFRoaXMgbWVhbnMgeW91IHNob3VsZCB1c2Uge0BsaW5rICNzaG93KEZyYWdtZW50TWFuYWdlciwgU3RyaW5nKX0KKyAqIG9yIHtAbGluayAjc2hvdyhGcmFnbWVudFRyYW5zYWN0aW9uLCBTdHJpbmcpfSB0byBhZGQgYW4gaW5zdGFuY2Ugb2YKKyAqIERpYWxvZ0ZyYWdtZW50IHRvIHlvdXIgVUksIGFzIHRoZXNlIGtlZXAgdHJhY2sgb2YgaG93IERpYWxvZ0ZyYWdtZW50IHNob3VsZAorICogcmVtb3ZlIGl0c2VsZiB3aGVuIHRoZSBkaWFsb2cgaXMgZGlzbWlzc2VkLgorICoKKyAqIDxhIG5hbWU9IkJhc2ljRGlhbG9nIj48L2E+CisgKiA8aDM+QmFzaWMgRGlhbG9nPC9oMz4KKyAqCisgKiA8cD5UaGUgc2ltcGxlc3QgdXNlIG9mIERpYWxvZ0ZyYWdtZW50IGlzIGFzIGEgZmxvYXRpbmcgY29udGFpbmVyIGZvciB0aGUKKyAqIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkuICBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBtYXkgbG9vayBsaWtlIHRoaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZy5qYXZhCisgKiAgICAgIGRpYWxvZ30KKyAqCisgKiA8cD5BbiBleGFtcGxlIHNob3dEaWFsb2coKSBtZXRob2Qgb24gdGhlIEFjdGl2aXR5IGNvdWxkIGJlOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2cuamF2YQorICogICAgICBhZGRfZGlhbG9nfQorICoKKyAqIDxwPlRoaXMgcmVtb3ZlcyBhbnkgY3VycmVudGx5IHNob3duIGRpYWxvZywgY3JlYXRlcyBhIG5ldyBEaWFsb2dGcmFnbWVudAorICogd2l0aCBhbiBhcmd1bWVudCwgYW5kIHNob3dzIGl0IGFzIGEgbmV3IHN0YXRlIG9uIHRoZSBiYWNrIHN0YWNrLiAgV2hlbiB0aGUKKyAqIHRyYW5zYWN0aW9uIGlzIHBvcHBlZCwgdGhlIGN1cnJlbnQgRGlhbG9nRnJhZ21lbnQgYW5kIGl0cyBEaWFsb2cgd2lsbCBiZQorICogZGVzdHJveWVkLCBhbmQgdGhlIHByZXZpb3VzIG9uZSAoaWYgYW55KSByZS1zaG93bi4gIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UKKyAqIERpYWxvZ0ZyYWdtZW50IHdpbGwgdGFrZSBjYXJlIG9mIHBvcHBpbmcgdGhlIHRyYW5zYWN0aW9uIG9mIHRoZSBEaWFsb2cKKyAqIGlzIGRpc21pc3NlZCBzZXBhcmF0ZWx5IGZyb20gaXQuCisgKgorICogPGEgbmFtZT0iQWxlcnREaWFsb2ciPjwvYT4KKyAqIDxoMz5BbGVydCBEaWFsb2c8L2gzPgorICoKKyAqIDxwPkluc3RlYWQgb2YgKG9yIGluIGFkZGl0aW9uIHRvKSBpbXBsZW1lbnRpbmcge0BsaW5rICNvbkNyZWF0ZVZpZXd9IHRvCisgKiBnZW5lcmF0ZSB0aGUgdmlldyBoaWVyYXJjaHkgaW5zaWRlIG9mIGEgZGlhbG9nLCB5b3UgbWF5IGltcGxlbWVudAorICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhCdW5kbGUpfSB0byBjcmVhdGUgeW91ciBvd24gY3VzdG9tIERpYWxvZyBvYmplY3QuCisgKgorICogPHA+VGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgY3JlYXRpbmcgYW4ge0BsaW5rIEFsZXJ0RGlhbG9nfSwgYWxsb3dpbmcgeW91CisgKiB0byBkaXNwbGF5IHN0YW5kYXJkIGFsZXJ0cyB0byB0aGUgdXNlciB0aGF0IGFyZSBtYW5hZ2VkIGJ5IGEgZnJhZ21lbnQuCisgKiBBIHNpbXBsZSBleGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nLmphdmEKKyAqICAgICAgZGlhbG9nfQorICoKKyAqIDxwPlRoZSBhY3Rpdml0eSBjcmVhdGluZyB0aGlzIGZyYWdtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0bworICogc2hvdyB0aGUgZGlhbG9nIGFuZCByZWNlaXZlIHJlc3VsdHMgZnJvbSBpdDoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QWxlcnREaWFsb2cuamF2YQorICogICAgICBhY3Rpdml0eX0KKyAqCisgKiA8cD5Ob3RlIHRoYXQgaW4gdGhpcyBjYXNlIHRoZSBmcmFnbWVudCBpcyBub3QgcGxhY2VkIG9uIHRoZSBiYWNrIHN0YWNrLCBpdAorICogaXMganVzdCBhZGRlZCBhcyBhbiBpbmRlZmluaXRlbHkgcnVubmluZyBmcmFnbWVudC4gIEJlY2F1c2UgZGlhbG9ncyBub3JtYWxseQorICogYXJlIG1vZGFsLCB0aGlzIHdpbGwgc3RpbGwgb3BlcmF0ZSBhcyBhIGJhY2sgc3RhY2ssIHNpbmNlIHRoZSBkaWFsb2cgd2lsbAorICogY2FwdHVyZSB1c2VyIGlucHV0IHVudGlsIGl0IGlzIGRpc21pc3NlZC4gIFdoZW4gaXQgaXMgZGlzbWlzc2VkLCBEaWFsb2dGcmFnbWVudAorICogd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcgaXRzZWxmIGZyb20gaXRzIGZyYWdtZW50IG1hbmFnZXIuCisgKgorICogPGEgbmFtZT0iRGlhbG9nT3JFbWJlZCI+PC9hPgorICogPGgzPlNlbGVjdGluZyBCZXR3ZWVuIERpYWxvZyBvciBFbWJlZGRpbmc8L2gzPgorICoKKyAqIDxwPkEgRGlhbG9nRnJhZ21lbnQgY2FuIHN0aWxsIG9wdGlvbmFsbHkgYmUgdXNlZCBhcyBhIG5vcm1hbCBmcmFnbWVudCwgaWYKKyAqIGRlc2lyZWQuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGZyYWdtZW50IHRoYXQgaW4gc29tZSBjYXNlcyBzaG91bGQKKyAqIGJlIHNob3duIGFzIGEgZGlhbG9nIGFuZCBvdGhlcnMgZW1iZWRkZWQgaW4gYSBsYXJnZXIgVUkuICBUaGlzIGJlaGF2aW9yCisgKiB3aWxsIG5vcm1hbGx5IGJlIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgZm9yIHlvdSBiYXNlZCBvbiBob3cgeW91IGFyZSB1c2luZworICogdGhlIGZyYWdtZW50LCBidXQgY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aCB7QGxpbmsgI3NldFNob3dzRGlhbG9nKGJvb2xlYW4pfS4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgaGVyZSBpcyBhIHNpbXBsZSBkaWFsb2cgZnJhZ21lbnQ6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBkaWFsb2d9CisgKgorICogPHA+QW4gaW5zdGFuY2Ugb2YgdGhpcyBmcmFnbWVudCBjYW4gYmUgY3JlYXRlZCBhbmQgc2hvd24gYXMgYSBkaWFsb2c6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBzaG93X2RpYWxvZ30KKyAqCisgKiA8cD5JdCBjYW4gYWxzbyBiZSBhZGRlZCBhcyBjb250ZW50IGluIGEgdmlldyBoaWVyYXJjaHk6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBlbWJlZH0KKyAqLworcHVibGljIGNsYXNzIERpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQKKyAgICAgICAgaW1wbGVtZW50cyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lciwgRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIFN0eWxlIGZvciB7QGxpbmsgI3NldFN0eWxlKGludCwgaW50KX06IGEgYmFzaWMsCisgICAgICogbm9ybWFsIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT1JNQUwgPSAwOworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogZG9uJ3QgaW5jbHVkZQorICAgICAqIGEgdGl0bGUgYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT19USVRMRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBTdHlsZSBmb3Ige0BsaW5rICNzZXRTdHlsZShpbnQsIGludCl9OiBkb24ndCBkcmF3CisgICAgICogYW55IGZyYW1lIGF0IGFsbDsgdGhlIHZpZXcgaGllcmFyY2h5IHJldHVybmVkIGJ5IHtAbGluayAjb25DcmVhdGVWaWV3fQorICAgICAqIGlzIGVudGlyZWx5IHJlc3BvbnNpYmxlIGZvciBkcmF3aW5nIHRoZSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfTk9fRlJBTUUgPSAyOworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogbGlrZQorICAgICAqIHtAbGluayAjU1RZTEVfTk9fRlJBTUV9LCBidXQgYWxzbyBkaXNhYmxlcyBhbGwgaW5wdXQgdG8gdGhlIGRpYWxvZy4KKyAgICAgKiBUaGUgdXNlciBjYW4gbm90IHRvdWNoIGl0LCBhbmQgaXRzIHdpbmRvdyB3aWxsIG5vdCByZWNlaXZlIGlucHV0IGZvY3VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX05PX0lOUFVUID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfU1RBVEVfVEFHID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dTdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX1NUWUxFID0gImFuZHJvaWQ6c3R5bGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9USEVNRSA9ICJhbmRyb2lkOnRoZW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfQ0FOQ0VMQUJMRSA9ICJhbmRyb2lkOmNhbmNlbGFibGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9TSE9XU19ESUFMT0cgPSAiYW5kcm9pZDpzaG93c0RpYWxvZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0JBQ0tfU1RBQ0tfSUQgPSAiYW5kcm9pZDpiYWNrU3RhY2tJZCI7CisKKyAgICBpbnQgbVN0eWxlID0gU1RZTEVfTk9STUFMOworICAgIGludCBtVGhlbWUgPSAwOworICAgIGJvb2xlYW4gbUNhbmNlbGFibGUgPSB0cnVlOworICAgIGJvb2xlYW4gbVNob3dzRGlhbG9nID0gdHJ1ZTsKKyAgICBpbnQgbUJhY2tTdGFja0lkID0gLTE7CisKKyAgICBEaWFsb2cgbURpYWxvZzsKKyAgICBib29sZWFuIG1EZXN0cm95ZWQ7CisgICAgYm9vbGVhbiBtUmVtb3ZlZDsKKworICAgIHB1YmxpYyBEaWFsb2dGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRvIGN1c3RvbWl6ZSB0aGUgYmFzaWMgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3Igb2YgdGhlCisgICAgICogZnJhZ21lbnQncyBkaWFsb2cuICBUaGlzIGNhbiBiZSB1c2VkIGZvciBzb21lIGNvbW1vbiBkaWFsb2cgYmVoYXZpb3JzLAorICAgICAqIHRha2luZyBjYXJlIG9mIHNlbGVjdGluZyBmbGFncywgdGhlbWUsIGFuZCBvdGhlciBvcHRpb25zIGZvciB5b3UuICBUaGUKKyAgICAgKiBzYW1lIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZSBieSBtYW51YWxseSBzZXR0aW5nIERpYWxvZyBhbmQgV2luZG93CisgICAgICogYXR0cmlidXRlcyB5b3Vyc2VsZi4gIENhbGxpbmcgdGhpcyBhZnRlciB0aGUgZnJhZ21lbnQncyBEaWFsb2cgaXMKKyAgICAgKiBjcmVhdGVkIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3R5bGUgU2VsZWN0cyBhIHN0YW5kYXJkIHN0eWxlOiBtYXkgYmUge0BsaW5rICNTVFlMRV9OT1JNQUx9LAorICAgICAqIHtAbGluayAjU1RZTEVfTk9fVElUTEV9LCB7QGxpbmsgI1NUWUxFX05PX0ZSQU1FfSwgb3IKKyAgICAgKiB7QGxpbmsgI1NUWUxFX05PX0lOUFVUfS4KKyAgICAgKiBAcGFyYW0gdGhlbWUgT3B0aW9uYWwgY3VzdG9tIHRoZW1lLiAgSWYgMCwgYW4gYXBwcm9wcmlhdGUgdGhlbWUgKGJhc2VkCisgICAgICogb24gdGhlIHN0eWxlKSB3aWxsIGJlIHNlbGVjdGVkIGZvciB5b3UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlLCBpbnQgdGhlbWUpIHsKKyAgICAgICAgbVN0eWxlID0gc3R5bGU7CisgICAgICAgIGlmIChtU3R5bGUgPT0gU1RZTEVfTk9fRlJBTUUgfHwgbVN0eWxlID09IFNUWUxFX05PX0lOUFVUKSB7CisgICAgICAgICAgICBtVGhlbWUgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0hvbG9fRGlhbG9nX05vRnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoZW1lICE9IDApIHsKKyAgICAgICAgICAgIG1UaGVtZSA9IHRoZW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgI3Nob3coRnJhZ21lbnRNYW5hZ2VyLCBTdHJpbmcpfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyB2b2lkIHNob3coQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyB0YWcpIHsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGFjdGl2aXR5Lm9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZ0LmFkZCh0aGlzLCB0YWcpOworICAgICAgICBmdC5jb21taXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBkaWFsb2csIGFkZGluZyB0aGUgZnJhZ21lbnQgdG8gdGhlIGdpdmVuIEZyYWdtZW50TWFuYWdlci4gIFRoaXMKKyAgICAgKiBpcyBhIGNvbnZlbmllbmNlIGZvciBleHBsaWNpdGx5IGNyZWF0aW5nIGEgdHJhbnNhY3Rpb24sIGFkZGluZyB0aGUKKyAgICAgKiBmcmFnbWVudCB0byBpdCB3aXRoIHRoZSBnaXZlbiB0YWcsIGFuZCBjb21taXR0aW5nIGl0LiAgVGhpcyBkb2VzCisgICAgICogPGVtPm5vdDwvZW0+IGFkZCB0aGUgdHJhbnNhY3Rpb24gdG8gdGhlIGJhY2sgc3RhY2suICBXaGVuIHRoZSBmcmFnbWVudAorICAgICAqIGlzIGRpc21pc3NlZCwgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB0byByZW1vdmUgaXQgZnJvbQorICAgICAqIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgRnJhZ21lbnRNYW5hZ2VyIHRoaXMgZnJhZ21lbnQgd2lsbCBiZSBhZGRlZCB0by4KKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgZm9yIHRoaXMgZnJhZ21lbnQsIGFzIHBlcgorICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2FkZChGcmFnbWVudCwgU3RyaW5nKSBGcmFnbWVudFRyYW5zYWN0aW9uLmFkZH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvdyhGcmFnbWVudE1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIHRhZykgeworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gbWFuYWdlci5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZnQuYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIGZ0LmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIGRpYWxvZywgYWRkaW5nIHRoZSBmcmFnbWVudCB1c2luZyBhbiBleGlzdGluZyB0cmFuc2FjdGlvbgorICAgICAqIGFuZCB0aGVuIGNvbW1pdHRpbmcgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiBBbiBleGlzdGluZyB0cmFuc2FjdGlvbiBpbiB3aGljaCB0byBhZGQgdGhlIGZyYWdtZW50LgorICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBmb3IgdGhpcyBmcmFnbWVudCwgYXMgcGVyCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jYWRkKEZyYWdtZW50LCBTdHJpbmcpIEZyYWdtZW50VHJhbnNhY3Rpb24uYWRkfS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgYXMgcGVyCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uCisgICAgICovCisgICAgcHVibGljIGludCBzaG93KEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIFN0cmluZyB0YWcpIHsKKyAgICAgICAgdHJhbnNhY3Rpb24uYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIG1SZW1vdmVkID0gZmFsc2U7CisgICAgICAgIG1CYWNrU3RhY2tJZCA9IHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgICAgICByZXR1cm4gbUJhY2tTdGFja0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIGZyYWdtZW50IGFuZCBpdHMgZGlhbG9nLiAgSWYgdGhlIGZyYWdtZW50IHdhcyBhZGRlZCB0byB0aGUKKyAgICAgKiBiYWNrIHN0YWNrLCBhbGwgYmFjayBzdGFjayBzdGF0ZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgZW50cnkgd2lsbAorICAgICAqIGJlIHBvcHBlZC4gIE90aGVyd2lzZSwgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb21taXR0ZWQgdG8gcmVtb3ZlCisgICAgICogdGhlIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKSB7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgbURpYWxvZyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW92ZWQgPSB0cnVlOworICAgICAgICBpZiAobUJhY2tTdGFja0lkID49IDApIHsKKyAgICAgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLnBvcEJhY2tTdGFjayhtQmFja1N0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlci5QT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBmdC5yZW1vdmUodGhpcyk7CisgICAgICAgICAgICBmdC5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBEaWFsb2cgZ2V0RGlhbG9nKCkgeworICAgICAgICByZXR1cm4gbURpYWxvZzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRoZW1lKCkgeworICAgICAgICByZXR1cm4gbVRoZW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgc2hvd24gRGlhbG9nIGlzIGNhbmNlbGFibGUuICBVc2UgdGhpcyBpbnN0ZWFkIG9mCisgICAgICogZGlyZWN0bHkgY2FsbGluZyB7QGxpbmsgRGlhbG9nI3NldENhbmNlbGFibGUoYm9vbGVhbikKKyAgICAgKiBEaWFsb2cuc2V0Q2FuY2VsYWJsZShib29sZWFuKX0sIGJlY2F1c2UgRGlhbG9nRnJhZ21lbnQgbmVlZHMgdG8gY2hhbmdlCisgICAgICogaXRzIGJlaGF2aW9yIGJhc2VkIG9uIHRoaXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FuY2VsYWJsZSBJZiB0cnVlLCB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsYWJsZShib29sZWFuIGNhbmNlbGFibGUpIHsKKyAgICAgICAgbUNhbmNlbGFibGUgPSBjYW5jZWxhYmxlOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSBtRGlhbG9nLnNldENhbmNlbGFibGUoY2FuY2VsYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHtAbGluayAjc2V0Q2FuY2VsYWJsZShib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DYW5jZWxhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhpcyBmcmFnbWVudCBzaG91bGQgYmUgc2hvd24gaW4gYSBkaWFsb2cuICBJZiBub3QKKyAgICAgKiBzZXQsIG5vIERpYWxvZyB3aWxsIGJlIGNyZWF0ZWQgaW4ge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfSwKKyAgICAgKiBhbmQgdGhlIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkgd2lsbCB0aHVzIG5vdCBiZSBhZGRlZCB0byBpdC4gIFRoaXMKKyAgICAgKiBhbGxvd3MgeW91IHRvIGluc3RlYWQgdXNlIGl0IGFzIGEgbm9ybWFsIGZyYWdtZW50IChlbWJlZGRlZCBpbnNpZGUgb2YKKyAgICAgKiBpdHMgYWN0aXZpdHkpLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBub3JtYWxseSBzZXQgZm9yIHlvdSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBmcmFnbWVudCBpcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRhaW5lciB2aWV3IElEIHBhc3NlZCB0bworICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2FkZChpbnQsIEZyYWdtZW50KSBGcmFnbWVudFRyYW5zYWN0aW9uLmFkZChpbnQsIEZyYWdtZW50KX0uCisgICAgICogSWYgdGhlIGZyYWdtZW50IHdhcyBhZGRlZCB3aXRoIGEgY29udGFpbmVyLCBzZXRTaG93c0RpYWxvZyB3aWxsIGJlCisgICAgICogaW5pdGlhbGl6ZWQgdG8gZmFsc2U7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSB0cnVlLgorICAgICAqCisgICAgICogQHBhcmFtIHNob3dzRGlhbG9nIElmIHRydWUsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGRpc3BsYXllZCBpbiBhIERpYWxvZy4KKyAgICAgKiBJZiBmYWxzZSwgbm8gRGlhbG9nIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaGx5CisgICAgICogbGVmdCB1bmRpc3R1cmJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93c0RpYWxvZyhib29sZWFuIHNob3dzRGlhbG9nKSB7CisgICAgICAgIG1TaG93c0RpYWxvZyA9IHNob3dzRGlhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgI3NldFNob3dzRGlhbG9nKGJvb2xlYW4pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93c0RpYWxvZygpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93c0RpYWxvZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbVNob3dzRGlhbG9nID0gbUNvbnRhaW5lcklkID09IDA7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3R5bGUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNBVkVEX1NUWUxFLCBTVFlMRV9OT1JNQUwpOworICAgICAgICAgICAgbVRoZW1lID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTQVZFRF9USEVNRSwgMCk7CisgICAgICAgICAgICBtQ2FuY2VsYWJsZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCb29sZWFuKFNBVkVEX0NBTkNFTEFCTEUsIHRydWUpOworICAgICAgICAgICAgbVNob3dzRGlhbG9nID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEJvb2xlYW4oU0FWRURfU0hPV1NfRElBTE9HLCBtU2hvd3NEaWFsb2cpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTQVZFRF9CQUNLX1NUQUNLX0lELCAtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaWFsb2coZ2V0QWN0aXZpdHkoKSwgZ2V0VGhlbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DYW5jZWwoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzcyhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgIGlmICghbVJlbW92ZWQpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBpZiAoIW1TaG93c0RpYWxvZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlRGlhbG9nKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1EZXN0cm95ZWQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fSU5QVVQ6CisgICAgICAgICAgICAgICAgbURpYWxvZy5nZXRXaW5kb3coKS5hZGRGbGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSEFCTEUpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgorICAgICAgICAgICAgY2FzZSBTVFlMRV9OT19GUkFNRToKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fVElUTEU6CisgICAgICAgICAgICAgICAgbURpYWxvZy5yZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIH0KKyAgICAgICAgVmlldyB2aWV3ID0gZ2V0VmlldygpOworICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmlldy5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlhbG9nRnJhZ21lbnQgY2FuIG5vdCBiZSBhdHRhY2hlZCB0byBhIGNvbnRhaW5lciB2aWV3Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlhbG9nLnNldENvbnRlbnRWaWV3KHZpZXcpOworICAgICAgICB9CisgICAgICAgIG1EaWFsb2cuc2V0T3duZXJBY3Rpdml0eShnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgbURpYWxvZy5zZXRDYW5jZWxhYmxlKG1DYW5jZWxhYmxlKTsKKyAgICAgICAgbURpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKHRoaXMpOworICAgICAgICBtRGlhbG9nLnNldE9uRGlzbWlzc0xpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBkaWFsb2dTdGF0ZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCdW5kbGUoU0FWRURfRElBTE9HX1NUQVRFX1RBRyk7CisgICAgICAgICAgICBpZiAoZGlhbG9nU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaWFsb2cub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShkaWFsb2dTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW1vdmVkID0gZmFsc2U7CisgICAgICAgICAgICBtRGlhbG9nLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgZGlhbG9nU3RhdGUgPSBtRGlhbG9nLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChkaWFsb2dTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFNBVkVEX0RJQUxPR19TVEFURV9UQUcsIGRpYWxvZ1N0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVN0eWxlICE9IFNUWUxFX05PUk1BTCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KFNBVkVEX1NUWUxFLCBtU3R5bGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGhlbWUgIT0gMCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KFNBVkVEX1RIRU1FLCBtVGhlbWUpOworICAgICAgICB9CisgICAgICAgIGlmICghbUNhbmNlbGFibGUpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEJvb2xlYW4oU0FWRURfQ0FOQ0VMQUJMRSwgbUNhbmNlbGFibGUpOworICAgICAgICB9CisgICAgICAgIGlmICghbVNob3dzRGlhbG9nKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKFNBVkVEX1NIT1dTX0RJQUxPRywgbVNob3dzRGlhbG9nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJhY2tTdGFja0lkICE9IC0xKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoU0FWRURfQkFDS19TVEFDS19JRCwgbUJhY2tTdGFja0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBTZXQgcmVtb3ZlZCBoZXJlIGJlY2F1c2UgdGhpcyBkaXNtaXNzYWwgaXMganVzdCB0byBoaWRlCisgICAgICAgICAgICAvLyB0aGUgZGlhbG9nIC0tIHdlIGRvbid0IHdhbnQgdGhpcyB0byBjYXVzZSB0aGUgZnJhZ21lbnQgdG8KKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IGJlIHJlbW92ZWQuCisgICAgICAgICAgICBtUmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICBtRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1EaWFsb2cgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0Rvd25sb2FkTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0Rvd25sb2FkTWFuYWdlci5qYXZhCmluZGV4IGM0NzZiOGYuLmYwYThkZmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Eb3dubG9hZE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRG93bmxvYWRNYW5hZ2VyLmphdmEKQEAgLTk5LDYgKzk5LDExIEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MVU1OX0xPQ0FMX1VSSSA9ICJsb2NhbF91cmkiOwogCiAgICAgLyoqCisgICAgICogVGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIHRoZSBkb3dubG9hZCBpcyBzdG9yZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MVU1OX0xPQ0FMX0ZJTEVOQU1FID0gImxvY2FsX2ZpbGVuYW1lIjsKKworICAgIC8qKgogICAgICAqIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBkb3dubG9hZCwgYXMgb25lIG9mIHRoZSBTVEFUVVNfKiBjb25zdGFudHMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MVU1OX1NUQVRVUyA9ICJzdGF0dXMiOwpAQCAtMjcyLDcgKzI3Nyw4IEBACiAgICAgICAgIENPTFVNTl9TVEFUVVMsCiAgICAgICAgIENPTFVNTl9SRUFTT04sCiAgICAgICAgIENPTFVNTl9CWVRFU19ET1dOTE9BREVEX1NPX0ZBUiwKLSAgICAgICAgQ09MVU1OX0xBU1RfTU9ESUZJRURfVElNRVNUQU1QCisgICAgICAgIENPTFVNTl9MQVNUX01PRElGSUVEX1RJTUVTVEFNUCwKKyAgICAgICAgQ09MVU1OX0xPQ0FMX0ZJTEVOQU1FCiAgICAgfTsKIAogICAgIC8vIGNvbHVtbnMgdG8gcmVxdWVzdCBmcm9tIERvd25sb2FkUHJvdmlkZXIKQEAgLTMzNSw4ICszNDEsOCBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWUgPT0gbnVsbCB8fCAhc2NoZW1lLmVxdWFscygiaHR0cCIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuIG9ubHkgZG93bmxvYWQgSFRUUCBVUklzOiAiICsgdXJpKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWUgPT0gbnVsbCB8fCAoIXNjaGVtZS5lcXVhbHMoImh0dHAiKSAmJiAhc2NoZW1lLmVxdWFscygiaHR0cHMiKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4gb25seSBkb3dubG9hZCBIVFRQL0hUVFBTIFVSSXM6ICIgKyB1cmkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVVyaSA9IHVyaTsKICAgICAgICAgfQpAQCAtOTE1LDYgKzkyMSw5IEBACiAgICAgICAgICAgICBpZiAoY29sdW1uLmVxdWFscyhDT0xVTU5fTUVESUFfVFlQRSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VW5kZXJseWluZ1N0cmluZyhEb3dubG9hZHMuQ09MVU1OX01JTUVfVFlQRSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29sdW1uLmVxdWFscyhDT0xVTU5fTE9DQUxfRklMRU5BTUUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVuZGVybHlpbmdTdHJpbmcoRG93bmxvYWRzLkltcGwuX0RBVEEpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBhc3NlcnQgY29sdW1uLmVxdWFscyhDT0xVTU5fTE9DQUxfVVJJKTsKICAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbFVyaSgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmJmN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ZpbmFsIGNsYXNzIEZyYWdtZW50U3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICBmaW5hbCBpbnQgbUluZGV4OworICAgIGZpbmFsIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgZmluYWwgaW50IG1GcmFnbWVudElkOworICAgIGZpbmFsIGludCBtQ29udGFpbmVySWQ7CisgICAgZmluYWwgU3RyaW5nIG1UYWc7CisgICAgZmluYWwgYm9vbGVhbiBtUmV0YWluSW5zdGFuY2U7CisgICAgZmluYWwgQnVuZGxlIG1Bcmd1bWVudHM7CisgICAgCisgICAgQnVuZGxlIG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgCisgICAgRnJhZ21lbnQgbUluc3RhbmNlOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlKEZyYWdtZW50IGZyYWcpIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGZyYWcuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIG1JbmRleCA9IGZyYWcubUluZGV4OworICAgICAgICBtRnJvbUxheW91dCA9IGZyYWcubUZyb21MYXlvdXQ7CisgICAgICAgIG1GcmFnbWVudElkID0gZnJhZy5tRnJhZ21lbnRJZDsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gZnJhZy5tQ29udGFpbmVySWQ7CisgICAgICAgIG1UYWcgPSBmcmFnLm1UYWc7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IGZyYWcubVJldGFpbkluc3RhbmNlOworICAgICAgICBtQXJndW1lbnRzID0gZnJhZy5tQXJndW1lbnRzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUluZGV4ID0gaW4ucmVhZEludCgpOworICAgICAgICBtRnJvbUxheW91dCA9IGluLnJlYWRJbnQoKSAhPSAwOworICAgICAgICBtRnJhZ21lbnRJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gaW4ucmVhZEludCgpOworICAgICAgICBtVGFnID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtUmV0YWluSW5zdGFuY2UgPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgbUFyZ3VtZW50cyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZSA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGluc3RhbnRpYXRlKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGlmIChtSW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUluc3RhbmNlID0gRnJhZ21lbnQuaW5zdGFudGlhdGUoYWN0aXZpdHksIG1DbGFzc05hbWUsIG1Bcmd1bWVudHMpOworICAgICAgICAKKyAgICAgICAgaWYgKG1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZS5zZXRDbGFzc0xvYWRlcihhY3Rpdml0eS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5zdGFuY2Uuc2V0SW5kZXgobUluZGV4KTsKKyAgICAgICAgbUluc3RhbmNlLm1Gcm9tTGF5b3V0ID0gbUZyb21MYXlvdXQ7CisgICAgICAgIG1JbnN0YW5jZS5tRnJhZ21lbnRJZCA9IG1GcmFnbWVudElkOworICAgICAgICBtSW5zdGFuY2UubUNvbnRhaW5lcklkID0gbUNvbnRhaW5lcklkOworICAgICAgICBtSW5zdGFuY2UubVRhZyA9IG1UYWc7CisgICAgICAgIG1JbnN0YW5jZS5tUmV0YWluSW5zdGFuY2UgPSBtUmV0YWluSW5zdGFuY2U7CisgICAgICAgIG1JbnN0YW5jZS5tRnJhZ21lbnRNYW5hZ2VyID0gYWN0aXZpdHkubUZyYWdtZW50czsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUNsYXNzTmFtZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUluZGV4KTsKKyAgICAgICAgZGVzdC53cml0ZUludChtRnJvbUxheW91dCA/IDEgOiAwKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtRnJhZ21lbnRJZCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUNvbnRhaW5lcklkKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtVGFnKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtUmV0YWluSW5zdGFuY2UgPyAxIDogMCk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUFyZ3VtZW50cyk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50U3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudFN0YXRlPigpIHsKKyAgICAgICAgcHVibGljIEZyYWdtZW50U3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRTdGF0ZShpbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQSBGcmFnbWVudCBpcyBhIHBpZWNlIG9mIGFuIGFwcGxpY2F0aW9uJ3MgdXNlciBpbnRlcmZhY2Ugb3IgYmVoYXZpb3IKKyAqIHRoYXQgY2FuIGJlIHBsYWNlZCBpbiBhbiB7QGxpbmsgQWN0aXZpdHl9LiAgSW50ZXJhY3Rpb24gd2l0aCBmcmFnbWVudHMKKyAqIGlzIGRvbmUgdGhyb3VnaCB7QGxpbmsgRnJhZ21lbnRNYW5hZ2VyfSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIHZpYQorICoge0BsaW5rIEFjdGl2aXR5I2dldEZyYWdtZW50TWFuYWdlcigpIEFjdGl2aXR5LmdldEZyYWdtZW50TWFuYWdlcigpfSBhbmQKKyAqIHtAbGluayBGcmFnbWVudCNnZXRGcmFnbWVudE1hbmFnZXIoKSBGcmFnbWVudC5nZXRGcmFnbWVudE1hbmFnZXIoKX0uCisgKgorICogPHA+VGhlIEZyYWdtZW50IGNsYXNzIGNhbiBiZSB1c2VkIG1hbnkgd2F5cyB0byBhY2hpZXZlIGEgd2lkZSB2YXJpZXR5IG9mCisgKiByZXN1bHRzLiAgSXQgaXMgY29yZSwgaXQgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uIG9yIGludGVyZmFjZQorICogdGhhdCBpcyBydW5uaW5nIHdpdGhpbiBhIGxhcmdlciB7QGxpbmsgQWN0aXZpdHl9LiAgQSBGcmFnbWVudCBpcyBjbG9zZWx5CisgKiB0aWVkIHRvIHRoZSBBY3Rpdml0eSBpdCBpcyBpbiwgYW5kIGNhbiBub3QgYmUgdXNlZCBhcGFydCBmcm9tIG9uZS4gIFRob3VnaAorICogRnJhZ21lbnQgZGVmaW5lcyBpdHMgb3duIGxpZmVjeWNsZSwgdGhhdCBsaWZlY3ljbGUgaXMgZGVwZW5kZW50IG9uIGl0cworICogYWN0aXZpdHk6IGlmIHRoZSBhY3Rpdml0eSBpcyBzdG9wcGVkLCBubyBmcmFnbWVudHMgaW5zaWRlIG9mIGl0IGNhbiBiZQorICogc3RhcnRlZDsgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZGVzdHJveWVkLCBhbGwgZnJhZ21lbnRzIHdpbGwgYmUgZGVzdHJveWVkLgorICoKKyAqIDxwPkFsbCBzdWJjbGFzc2VzIG9mIEZyYWdtZW50IG11c3QgaW5jbHVkZSBhIHB1YmxpYyBlbXB0eSBjb25zdHJ1Y3Rvci4KKyAqIFRoZSBmcmFtZXdvcmsgd2lsbCBvZnRlbiByZS1pbnN0YW50aWF0ZSBhIGZyYWdtZW50IGNsYXNzIHdoZW4gbmVlZGVkLAorICogaW4gcGFydGljdWxhciBkdXJpbmcgc3RhdGUgcmVzdG9yZSwgYW5kIG5lZWRzIHRvIGJlIGFibGUgdG8gZmluZCB0aGlzCisgKiBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSBpdC4gIElmIHRoZSBlbXB0eSBjb25zdHJ1Y3RvciBpcyBub3QgYXZhaWxhYmxlLAorICogYSBydW50aW1lIGV4Y2VwdGlvbiB3aWxsIG9jY3VyIGluIHNvbWUgY2FzZXMgZHVyaW5nIHN0YXRlIHJlc3RvcmUuCisgKgorICogPHA+VG9waWNzIGNvdmVyZWQgaGVyZToKKyAqIDxvbD4KKyAqIDxsaT48YSBocmVmPSIjTGlmZWN5Y2xlIj5MaWZlY3ljbGU8L2E+CisgKiA8bGk+PGEgaHJlZj0iI0xheW91dCI+TGF5b3V0PC9hPgorICogPGxpPjxhIGhyZWY9IiNCYWNrU3RhY2siPkJhY2sgU3RhY2s8L2E+CisgKiA8L29sPgorICoKKyAqIDxhIG5hbWU9IkxpZmVjeWNsZSI+PC9hPgorICogPGgzPkxpZmVjeWNsZTwvaDM+CisgKgorICogPHA+VGhvdWdoIGEgRnJhZ21lbnQncyBsaWZlY3ljbGUgaXMgdGllZCB0byBpdHMgb3duaW5nIGFjdGl2aXR5LCBpdCBoYXMKKyAqIGl0cyBvd24gd3JpbmtsZSBvbiB0aGUgc3RhbmRhcmQgYWN0aXZpdHkgbGlmZWN5Y2xlLiAgSXQgaW5jbHVkZXMgYmFzaWMKKyAqIGFjdGl2aXR5IGxpZmVjeWNsZSBtZXRob2RzIHN1Y2ggYXMge0BsaW5rICNvblJlc3VtZX0sIGJ1dCBhbHNvIGltcG9ydGFudAorICogYXJlIG1ldGhvZHMgcmVsYXRlZCB0byBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgYWN0aXZpdHkgYW5kIFVJIGdlbmVyYXRpb24uCisgKgorICogPHA+VGhlIGNvcmUgc2VyaWVzIG9mIGxpZmVjeWNsZSBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCB0byBicmluZyBhIGZyYWdtZW50CisgKiB1cCB0byByZXN1bWVkIHN0YXRlIChpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyKSBhcmU6CisgKgorICogPG9sPgorICogPGxpPiB7QGxpbmsgI29uQXR0YWNofSBjYWxsZWQgb25jZSB0aGUgZnJhZ21lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIGl0cyBhY3Rpdml0eS4KKyAqIDxsaT4ge0BsaW5rICNvbkNyZWF0ZX0gY2FsbGVkIHRvIGRvIGluaXRpYWwgY3JlYXRpb24gb2YgdGhlIGZyYWdtZW50LgorICogPGxpPiB7QGxpbmsgI29uQ3JlYXRlVmlld30gY3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgdmlldyBoaWVyYXJjaHkgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgZnJhZ21lbnQuCisgKiA8bGk+IHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWR9IHRlbGxzIHRoZSBmcmFnbWVudCB0aGF0IGl0cyBhY3Rpdml0eSBoYXMKKyAqIGNvbXBsZXRlZCBpdHMgb3duIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZSBBY3Rpdml0eS5vbkNyZWFhdGV9LgorICogPGxpPiB7QGxpbmsgI29uU3RhcnR9IG1ha2VzIHRoZSBmcmFnbWVudCB2aXNpYmxlIHRvIHRoZSB1c2VyIChiYXNlZCBvbiBpdHMKKyAqIGNvbnRhaW5pbmcgYWN0aXZpdHkgYmVpbmcgc3RhcnRlZCkuCisgKiA8bGk+IHtAbGluayAjb25SZXN1bWV9IG1ha2VzIHRoZSBmcmFnbWVudCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyIChiYXNlZCBvbiBpdHMKKyAqIGNvbnRhaW5pbmcgYWN0aXZpdHkgYmVpbmcgcmVzdW1lZCkuCisgKiA8L29sPgorICoKKyAqIDxwPkFzIGEgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQsIGl0IGdvZXMgdGhyb3VnaCBhIHJldmVyc2UKKyAqIHNlcmllcyBvZiBjYWxsYmFja3M6CisgKgorICogPG9sPgorICogPGxpPiB7QGxpbmsgI29uUGF1c2V9IGZyYWdtZW50IGlzIG5vIGxvbmdlciBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyIGVpdGhlcgorICogYmVjYXVzZSBpdHMgYWN0aXZpdHkgaXMgYmVpbmcgcGF1c2VkIG9yIGEgZnJhZ21lbnQgb3BlcmF0aW9uIGlzIG1vZGlmeWluZyBpdAorICogaW4gdGhlIGFjdGl2aXR5LgorICogPGxpPiB7QGxpbmsgI29uU3RvcH0gZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIHZpc2libGUgdG8gdGhlIHVzZXIgZWl0aGVyCisgKiBiZWNhdXNlIGl0cyBhY3Rpdml0eSBpcyBiZWluZyBzdG9wcGVkIG9yIGEgZnJhZ21lbnQgb3BlcmF0aW9uIGlzIG1vZGlmeWluZyBpdAorICogaW4gdGhlIGFjdGl2aXR5LgorICogPGxpPiB7QGxpbmsgI29uRGVzdHJveVZpZXd9IGFsbG93cyB0aGUgZnJhZ21lbnQgdG8gY2xlYW4gdXAgcmVzb3VyY2VzCisgKiBhc3NvY2lhdGVkIHdpdGggaXRzIFZpZXcuCisgKiA8bGk+IHtAbGluayAjb25EZXN0cm95fSBjYWxsZWQgdG8gZG8gZmluYWwgY2xlYW51cCBvZiB0aGUgZnJhZ21lbnQncyBzdGF0ZS4KKyAqIDxsaT4ge0BsaW5rICNvbkRldGFjaH0gY2FsbGVkIGltbWVkaWF0ZWx5IHByaW9yIHRvIHRoZSBmcmFnbWVudCBubyBsb25nZXIKKyAqIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBpdHMgYWN0aXZpdHkuCisgKiA8L29sPgorICoKKyAqIDxhIG5hbWU9IkxheW91dCI+PC9hPgorICogPGgzPkxheW91dDwvaDM+CisgKgorICogPHA+RnJhZ21lbnRzIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgeW91ciBhcHBsaWNhdGlvbidzIGxheW91dCwgYWxsb3dpbmcKKyAqIHlvdSB0byBiZXR0ZXIgbW9kdWxhcml6ZSB5b3VyIGNvZGUgYW5kIG1vcmUgZWFzaWx5IGFkanVzdCB5b3VyIHVzZXIKKyAqIGludGVyZmFjZSB0byB0aGUgc2NyZWVuIGl0IGlzIHJ1bm5pbmcgb24uICBBcyBhbiBleGFtcGxlLCB3ZSBjYW4gbG9vaworICogYXQgYSBzaW1wbGUgcHJvZ3JhbSBjb25zaXN0aW5nIG9mIGEgbGlzdCBvZiBpdGVtcywgYW5kIGRpc3BsYXkgb2YgdGhlCisgKiBkZXRhaWxzIG9mIGVhY2ggaXRlbS48L3A+CisgKgorICogPHA+QW4gYWN0aXZpdHkncyBsYXlvdXQgWE1MIGNhbiBpbmNsdWRlIDxjb2RlPiZsdDtmcmFnbWVudCZndDs8L2NvZGU+IHRhZ3MKKyAqIHRvIGVtYmVkIGZyYWdtZW50IGluc3RhbmNlcyBpbnNpZGUgb2YgdGhlIGxheW91dC4gIEZvciBleGFtcGxlLCBoZXJlIGlzCisgKiBhIHNpbXBsZSBsYXlvdXQgdGhhdCBlbWJlZHMgb25lIGZyYWdtZW50OjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbGF5b3V0LnhtbCBsYXlvdXR9CisgKgorICogPHA+VGhlIGxheW91dCBpcyBpbnN0YWxsZWQgaW4gdGhlIGFjdGl2aXR5IGluIHRoZSBub3JtYWwgd2F5OjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgbWFpbn0KKyAqCisgKiA8cD5UaGUgdGl0bGVzIGZyYWdtZW50LCBzaG93aW5nIGEgbGlzdCBvZiB0aXRsZXMsIGlzIHZlcnkgc2ltcGxlLCByZWx5aW5nCisgKiBvbiB7QGxpbmsgTGlzdEZyYWdtZW50fSBmb3IgbW9zdCBvZiBpdHMgd29yay4gIE5vdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mCisgKiBjbGlja2luZyBhbiBpdGVtLCB3aGljaCBjYW4gZWl0aGVyIHVwZGF0ZQorICogdGhlIGNvbnRlbnQgb2YgdGhlIGRldGFpbHMgZnJhZ21lbnQgb3Igc3RhcnQgYSBuZXcgYWN0aXZpdHkgc2hvdyB0aGUKKyAqIGRldGFpbHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGN1cnJlbnQgYWN0aXZpdHkncyBsYXlvdXQgY2FuIHNob3cgdGhlCisgKiBkZXRhaWxzLjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgdGl0bGVzfQorICoKKyAqIDxwPlRoZSBkZXRhaWxzIGZyYWdtZW50IHNob3dpbmcgdGhlIGNvbnRlbnRzIG9mIHNlbGVjdGVkIGl0ZW0gaGVyZSBqdXN0CisgKiBkaXNwbGF5cyBhIHN0cmluZyBvZiB0ZXh0IGJhc2VkIG9uIGFuIGluZGV4IG9mIGEgc3RyaW5nIGFycmF5IGJ1aWx0IGluIHRvCisgKiB0aGUgYXBwOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgZGV0YWlsc30KKyAqCisgKiA8cD5JbiB0aGlzIGNhc2Ugd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSB0aXRsZSwgdGhlcmUgaXMgbm8gZGV0YWlscworICogZnJhZ21lbnQgaW4gdGhlIGN1cnJlbnQgYWN0aXZpdHksIHNvIHRoZSB0aXRsZSB0aXRsZSBmcmFnbWVudCdzIGNsaWNrIGNvZGUgd2lsbAorICogbGF1bmNoIGEgbmV3IGFjdGl2aXR5IHRvIGRpc3BsYXkgdGhlIGRldGFpbHMgZnJhZ21lbnQ6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMYXlvdXQuamF2YQorICogICAgICBkZXRhaWxzX2FjdGl2aXR5fQorICoKKyAqIDxwPkhvd2V2ZXIgdGhlIHNjcmVlbiBtYXkgYmUgbGFyZ2UgZW5vdWdoIHRvIHNob3cgYm90aCB0aGUgbGlzdCBvZiB0aXRsZXMKKyAqIGFuZCBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGl0bGUuICBUbyB1c2Ugc3VjaCBhIGxheW91dCBvbgorICogYSBsYW5kc2NhcGUgc2NyZWVuLCB0aGlzIGFsdGVybmF0aXZlIGxheW91dCBjYW4gYmUgcGxhY2VkIHVuZGVyIGxheW91dC1sYW5kOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtbGFuZC9mcmFnbWVudF9sYXlvdXQueG1sIGxheW91dH0KKyAqCisgKiA8cD5Ob3RlIGhvdyB0aGUgcHJpb3IgY29kZSB3aWxsIGFkanVzdCB0byB0aGlzIGFsdGVybmF0aXZlIFVJIGZsb3c6IHRoZQorICogdGl0bGVzIGZyYWdtZW50IHdpbGwgbm93IHNob3cgaXRzIHRleHQgaW5zaWRlIG9mIGl0cyBhY3Rpdml0eSwgYW5kIHRoZQorICogZGV0YWlscyBhY3Rpdml0eSB3aWxsIGZpbmlzaCBvZiBpdCBmaW5kcyBpdHNlbGYgcnVubmluZyBpbiBhIGNvbmZpZ3VyYXRpb24KKyAqIHdoZXJlIHRoZSBkZXRhaWxzIGNhbiBiZSBzaG93biBpbmxpbmUuCisgKgorICogPHA+V2hlbiBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhdXNlcyB0aGUgYWN0aXZpdHkgaG9zdGluZyB0aGVzZSBmcmFnbWVudHMKKyAqIHRvIHJlc3RhcnQsIGl0cyBuZXcgaW5zdGFuY2UgbWF5IHVzZSBhIGRpZmZlcmVudCBsYXlvdXQgdGhhdCBkb2Vzbid0CisgKiBpbmNsdWRlIHRoZSBzYW1lIGZyYWdtZW50cyBhcyB0aGUgcHJldmlvdXMgbGF5b3V0LiAgSW4gdGhpcyBjYXNlIGFsbCBvZgorICogdGhlIHByZXZpb3VzIGZyYWdtZW50cyB3aWxsIHN0aWxsIGJlIGluc3RhbnRpYXRlZCBhbmQgcnVubmluZyBpbiB0aGUgbmV3CisgKiBpbnN0YW5jZTsgaG93ZXZlciwgYW55IHRoYXQgYXJlIG5vIGxvbmdlciBhc3NvY2lhdGVkIHdpdGggYSAmbHQ7ZnJhZ21lbnQmZ3Q7CisgKiB0YWcgaW4gdGhlIHZpZXcgaGllcmFyY2h5IHdpbGwgbm90IGhhdmUgdGhlaXIgY29udGVudCB2aWV3IGNyZWF0ZWQgYW5kIHdpbGwKKyAqIHJldHVybiBmYWxzZSBmcm9tIHtAbGluayAjaXNJbkxheW91dH0uCisgKiAKKyAqIDxwPlRoZSBhdHRyaWJ1dGVzIG9mIHRoZSAmbHQ7ZnJhZ21lbnQmZ3Q7IHRhZyBhcmUgdXNlZCB0byBjb250cm9sIHRoZQorICogTGF5b3V0UGFyYW1zIHByb3ZpZGVyIHdoZW4gYXR0YWNoaW5nIHRoZSBmcmFnbWVudCdzIHZpZXcgdG8gdGhlIHBhcmVudAorICogY29udGFpbmVyLiAgVGhleSBjYW4gYWxzZSBiZSBwYXJzZWQgYnkgdGhlIGZyYWdtZW50IGluIHtAbGluayAjb25JbmZsYXRlfQorICogYXMgcGFyYW1ldGVycy4KKyAqIAorICogPHA+VGhlIGZyYWdtZW50IGJlaW5nIGluc3RhbnRpYXRlZCBtdXN0IGhhdmUgc29tZSBraW5kIG9mIHVuaXF1ZSBpZGVudGlmaWVyCisgKiBzbyB0aGF0IGl0IGNhbiBiZSByZS1hc3NvY2lhdGVkIHdpdGggYSBwcmV2aW91cyBpbnN0YW5jZSBpZiB0aGUgcGFyZW50CisgKiBhY3Rpdml0eSBuZWVkcyB0byBiZSBkZXN0cm95ZWQgYW5kIHJlY3JlYXRlZC4gIFRoaXMgY2FuIGJlIHByb3ZpZGVkIHRoZXNlCisgKiB3YXlzOgorICogCisgKiA8dWw+CisgKiA8bGk+SWYgbm90aGluZyBpcyBleHBsaWNpdGx5IHN1cHBsaWVkLCB0aGUgdmlldyBJRCBvZiB0aGUgY29udGFpbmVyIHdpbGwKKyAqIGJlIHVzZWQuCisgKiA8bGk+PGNvZGU+YW5kcm9pZDp0YWc8L2NvZGU+IGNhbiBiZSB1c2VkIGluICZsdDtmcmFnbWVudCZndDsgdG8gcHJvdmlkZQorICogYSBzcGVjaWZpYyB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LgorICogPGxpPjxjb2RlPmFuZHJvaWQ6aWQ8L2NvZGU+IGNhbiBiZSB1c2VkIGluICZsdDtmcmFnbWVudCZndDsgdG8gcHJvdmlkZQorICogYSBzcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgZnJhZ21lbnQuCisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJCYWNrU3RhY2siPjwvYT4KKyAqIDxoMz5CYWNrIFN0YWNrPC9oMz4KKyAqCisgKiA8cD5UaGUgdHJhbnNhY3Rpb24gaW4gd2hpY2ggZnJhZ21lbnRzIGFyZSBtb2RpZmllZCBjYW4gYmUgcGxhY2VkIG9uIGFuCisgKiBpbnRlcm5hbCBiYWNrLXN0YWNrIG9mIHRoZSBvd25pbmcgYWN0aXZpdHkuICBXaGVuIHRoZSB1c2VyIHByZXNzZXMgYmFjaworICogaW4gdGhlIGFjdGl2aXR5LCBhbnkgdHJhbnNhY3Rpb25zIG9uIHRoZSBiYWNrIHN0YWNrIGFyZSBwb3BwZWQgb2ZmIGJlZm9yZQorICogdGhlIGFjdGl2aXR5IGl0c2VsZiBpcyBmaW5pc2hlZC4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBzaW1wbGUgZnJhZ21lbnQgdGhhdCBpcyBpbnN0YW50aWF0ZWQgd2l0aAorICogYW4gaW50ZWdlciBhcmd1bWVudCBhbmQgZGlzcGxheXMgdGhhdCBpbiBhIFRleHRWaWV3IGluIGl0cyBVSTo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFN0YWNrLmphdmEKKyAqICAgICAgZnJhZ21lbnR9CisgKgorICogPHA+QSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGZyYWdtZW50LCByZXBsYWNpbmcKKyAqIHdoYXRldmVyIGN1cnJlbnQgZnJhZ21lbnQgaW5zdGFuY2UgaXMgYmVpbmcgc2hvd24gYW5kIHB1c2hpbmcgdGhhdCBjaGFuZ2UKKyAqIG9uIHRvIHRoZSBiYWNrIHN0YWNrIGNvdWxkIGJlIHdyaXR0ZW4gYXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFN0YWNrLmphdmEKKyAqICAgICAgYWRkX3N0YWNrfQorICoKKyAqIDxwPkFmdGVyIGVhY2ggY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBhIG5ldyBlbnRyeSBpcyBvbiB0aGUgc3RhY2ssIGFuZAorICogcHJlc3NpbmcgYmFjayB3aWxsIHBvcCBpdCB0byByZXR1cm4gdGhlIHVzZXIgdG8gd2hhdGV2ZXIgcHJldmlvdXMgc3RhdGUKKyAqIHRoZSBhY3Rpdml0eSBVSSB3YXMgaW4uCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudCBpbXBsZW1lbnRzIENvbXBvbmVudENhbGxiYWNrcywgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+IHNDbGFzc01hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PigpOworICAgIAorICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaSU5HID0gMDsgICAgIC8vIE5vdCB5ZXQgY3JlYXRlZC4KKyAgICBzdGF0aWMgZmluYWwgaW50IENSRUFURUQgPSAxOyAgICAgICAgICAvLyBDcmVhdGVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfQ1JFQVRFRCA9IDI7IC8vIFRoZSBhY3Rpdml0eSBoYXMgZmluaXNoZWQgaXRzIGNyZWF0aW9uLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRFRCA9IDM7ICAgICAgICAgIC8vIENyZWF0ZWQgYW5kIHN0YXJ0ZWQsIG5vdCByZXN1bWVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVTVU1FRCA9IDQ7ICAgICAgICAgIC8vIENyZWF0ZWQgc3RhcnRlZCBhbmQgcmVzdW1lZC4KKyAgICAKKyAgICBpbnQgbVN0YXRlID0gSU5JVElBTElaSU5HOworICAgIAorICAgIC8vIFdoZW4gaW5zdGFudGlhdGVkIGZyb20gc2F2ZWQgc3RhdGUsIHRoaXMgaXMgdGhlIHNhdmVkIHN0YXRlLgorICAgIEJ1bmRsZSBtU2F2ZWRGcmFnbWVudFN0YXRlOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TYXZlZFZpZXdTdGF0ZTsKKyAgICAKKyAgICAvLyBJbmRleCBpbnRvIGFjdGl2ZSBmcmFnbWVudCBhcnJheS4KKyAgICBpbnQgbUluZGV4ID0gLTE7CisgICAgCisgICAgLy8gSW50ZXJuYWwgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnJhZ21lbnQ7CisgICAgU3RyaW5nIG1XaG87CisgICAgCisgICAgLy8gQ29uc3RydWN0aW9uIGFyZ3VtZW50czsKKyAgICBCdW5kbGUgbUFyZ3VtZW50czsKKworICAgIC8vIFRhcmdldCBmcmFnbWVudC4KKyAgICBGcmFnbWVudCBtVGFyZ2V0OworCisgICAgLy8gVGFyZ2V0IHJlcXVlc3QgY29kZS4KKyAgICBpbnQgbVRhcmdldFJlcXVlc3RDb2RlOworCisgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gdGhlIGxpc3Qgb2YgYWRkZWQgZnJhZ21lbnRzLgorICAgIGJvb2xlYW4gbUFkZGVkOworICAgIAorICAgIC8vIFRydWUgaWYgdGhlIGZyYWdtZW50IGlzIGluIHRoZSByZXN1bWVkIHN0YXRlLgorICAgIGJvb2xlYW4gbVJlc3VtZWQ7CisgICAgCisgICAgLy8gU2V0IHRvIHRydWUgaWYgdGhpcyBmcmFnbWVudCB3YXMgaW5zdGFudGlhdGVkIGZyb20gYSBsYXlvdXQgZmlsZS4KKyAgICBib29sZWFuIG1Gcm9tTGF5b3V0OworICAgIAorICAgIC8vIFNldCB0byB0cnVlIHdoZW4gdGhlIHZpZXcgaGFzIGFjdHVhbGx5IGJlZW4gaW5mbGF0ZWQgaW4gaXRzIGxheW91dC4KKyAgICBib29sZWFuIG1JbkxheW91dDsKKworICAgIC8vIE51bWJlciBvZiBhY3RpdmUgYmFjayBzdGFjayBlbnRyaWVzIHRoaXMgZnJhZ21lbnQgaXMgaW4uCisgICAgaW50IG1CYWNrU3RhY2tOZXN0aW5nOworICAgIAorICAgIC8vIFRoZSBmcmFnbWVudCBtYW5hZ2VyIHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguICBTZXQgYXMgc29vbiBhcyB0aGUKKyAgICAvLyBmcmFnbWVudCBpcyB1c2VkIGluIGEgdHJhbnNhY3Rpb247IGNsZWFyZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVtb3ZlZAorICAgIC8vIGZyb20gYWxsIHRyYW5zYWN0aW9ucy4KKyAgICBGcmFnbWVudE1hbmFnZXIgbUZyYWdtZW50TWFuYWdlcjsKKworICAgIC8vIFNldCBhcyBzb29uIGFzIGEgZnJhZ21lbnQgaXMgYWRkZWQgdG8gYSB0cmFuc2FjdGlvbiAob3IgcmVtb3ZlZCksCisgICAgLy8gdG8gYmUgYWJsZSB0byBkbyB2YWxpZGF0aW9uLgorICAgIEFjdGl2aXR5IG1JbW1lZGlhdGVBY3Rpdml0eTsKKyAgICAKKyAgICAvLyBBY3Rpdml0eSB0aGlzIGZyYWdtZW50IGlzIGF0dGFjaGVkIHRvLgorICAgIEFjdGl2aXR5IG1BY3Rpdml0eTsKKyAgICAKKyAgICAvLyBUaGUgb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhpcyBmcmFnbWVudCAtLSBlaXRoZXIgdGhlIGNvbnRhaW5lciBJRCBpZiBpdAorICAgIC8vIHdhcyBkeW5hbWljYWxseSBhZGRlZCB0byB0aGUgdmlldyBoaWVyYXJjaHksIG9yIHRoZSBJRCBzdXBwbGllZCBpbgorICAgIC8vIGxheW91dC4KKyAgICBpbnQgbUZyYWdtZW50SWQ7CisgICAgCisgICAgLy8gV2hlbiBhIGZyYWdtZW50IGlzIGJlaW5nIGR5bmFtaWNhbGx5IGFkZGVkIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwgdGhpcworICAgIC8vIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgY29udGFpbmVyIGl0IGlzIGJlaW5nIGFkZGVkIHRvLgorICAgIGludCBtQ29udGFpbmVySWQ7CisgICAgCisgICAgLy8gVGhlIG9wdGlvbmFsIG5hbWVkIHRhZyBmb3IgdGhpcyBmcmFnbWVudCAtLSB1c3VhbGx5IHVzZWQgdG8gZmluZAorICAgIC8vIGZyYWdtZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgbGF5b3V0LgorICAgIFN0cmluZyBtVGFnOworICAgIAorICAgIC8vIFNldCB0byB0cnVlIHdoZW4gdGhlIGFwcCBoYXMgcmVxdWVzdGVkIHRoYXQgdGhpcyBmcmFnbWVudCBiZSBoaWRkZW4KKyAgICAvLyBmcm9tIHRoZSB1c2VyLgorICAgIGJvb2xlYW4gbUhpZGRlbjsKKyAgICAKKyAgICAvLyBJZiBzZXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIGl0cyBpbnN0YW5jZSByZXRhaW5lZCBhY3Jvc3MKKyAgICAvLyBjb25maWd1cmF0aW9uIGNoYW5nZXMuCisgICAgYm9vbGVhbiBtUmV0YWluSW5zdGFuY2U7CisgICAgCisgICAgLy8gSWYgc2V0IHRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgcmV0YWluZWQgYWNyb3NzIHRoZSBjdXJyZW50IGNvbmZpZyBjaGFuZ2UuCisgICAgYm9vbGVhbiBtUmV0YWluaW5nOworICAgIAorICAgIC8vIElmIHNldCB0aGlzIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgYm9vbGVhbiBtSGFzTWVudTsKKyAgICAKKyAgICAvLyBVc2VkIHRvIHZlcmlmeSB0aGF0IHN1YmNsYXNzZXMgY2FsbCB0aHJvdWdoIHRvIHN1cGVyIGNsYXNzLgorICAgIGJvb2xlYW4gbUNhbGxlZDsKKyAgICAKKyAgICAvLyBJZiBhcHAgaGFzIHJlcXVlc3RlZCBhIHNwZWNpZmljIGFuaW1hdGlvbiwgdGhpcyBpcyB0aGUgb25lIHRvIHVzZS4KKyAgICBpbnQgbU5leHRBbmltOworICAgIAorICAgIC8vIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoZSBmcmFnbWVudCBhZnRlciBkeW5hbWljYWxseSBhZGRlZCB0byBVSS4KKyAgICBWaWV3R3JvdXAgbUNvbnRhaW5lcjsKKyAgICAKKyAgICAvLyBUaGUgVmlldyBnZW5lcmF0ZWQgZm9yIHRoaXMgZnJhZ21lbnQuCisgICAgVmlldyBtVmlldzsKKyAgICAKKyAgICBMb2FkZXJNYW5hZ2VySW1wbCBtTG9hZGVyTWFuYWdlcjsKKyAgICBib29sZWFuIG1TdGFydGVkOworICAgIGJvb2xlYW4gbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyOworICAgIAorICAgIC8qKgorICAgICAqIFRocm93biBieSB7QGxpbmsgRnJhZ21lbnQjaW5zdGFudGlhdGUoQ29udGV4dCwgU3RyaW5nLCBCdW5kbGUpfSB3aGVuCisgICAgICogdGhlcmUgaXMgYW4gaW5zdGFudGlhdGlvbiBmYWlsdXJlLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEFuZHJvaWRSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIEluc3RhbnRpYXRpb25FeGNlcHRpb24oU3RyaW5nIG1zZywgRXhjZXB0aW9uIGNhdXNlKSB7CisgICAgICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuICA8c3Ryb25nPkV2ZXJ5PC9zdHJvbmc+IGZyYWdtZW50IG11c3QgaGF2ZSBhbgorICAgICAqIGVtcHR5IGNvbnN0cnVjdG9yLCBzbyBpdCBjYW4gYmUgaW5zdGFudGlhdGVkIHdoZW4gcmVzdG9yaW5nIGl0cworICAgICAqIGFjdGl2aXR5J3Mgc3RhdGUuICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHN1YmNsYXNzZXMgZG8gbm90CisgICAgICogaGF2ZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2l0aCBwYXJhbWV0ZXJzLCBzaW5jZSB0aGVzZSBjb25zdHJ1Y3RvcnMKKyAgICAgKiB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgcmUtaW5zdGFudGlhdGVkOyBpbnN0ZWFkLAorICAgICAqIGFyZ3VtZW50cyBjYW4gYmUgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciB3aXRoIHtAbGluayAjc2V0QXJndW1lbnRzfQorICAgICAqIGFuZCBsYXRlciByZXRyaWV2ZWQgYnkgdGhlIEZyYWdtZW50IHdpdGgge0BsaW5rICNnZXRBcmd1bWVudHN9LgorICAgICAqIAorICAgICAqIDxwPkFwcGxpY2F0aW9ucyBzaG91bGQgZ2VuZXJhbGx5IG5vdCBpbXBsZW1lbnQgYSBjb25zdHJ1Y3Rvci4gIFRoZQorICAgICAqIGZpcnN0IHBsYWNlIGFwcGxpY2F0aW9uIGNvZGUgYW4gcnVuIHdoZXJlIHRoZSBmcmFnbWVudCBpcyByZWFkeSB0bworICAgICAqIGJlIHVzZWQgaXMgaW4ge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9LCB0aGUgcG9pbnQgd2hlcmUgdGhlIGZyYWdtZW50CisgICAgICogaXMgYWN0dWFsbHkgYXNzb2NpYXRlZCB3aXRoIGl0cyBhY3Rpdml0eS4gIFNvbWUgYXBwbGljYXRpb25zIG1heSBhbHNvCisgICAgICogd2FudCB0byBpbXBsZW1lbnQge0BsaW5rICNvbkluZmxhdGV9IHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMgZnJvbSBhCisgICAgICogbGF5b3V0IHJlc291cmNlLCB0aG91Z2ggc2hvdWxkIHRha2UgY2FyZSBoZXJlIGJlY2F1c2UgdGhpcyBoYXBwZW5zIGZvcgorICAgICAqIHRoZSBmcmFnbWVudCBpcyBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNpbnN0YW50aWF0ZShDb250ZXh0LCBTdHJpbmcsIEJ1bmRsZSl9IGJ1dCB3aXRoIGEgbnVsbAorICAgICAqIGFyZ3VtZW50IEJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZyYWdtZW50IGluc3RhbnRpYXRlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGZuYW1lKSB7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZShjb250ZXh0LCBmbmFtZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgRnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4gIFRoaXMgaXMKKyAgICAgKiB0aGUgc2FtZSBhcyBjYWxsaW5nIGl0cyBlbXB0eSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjYWxsaW5nIGNvbnRleHQgYmVpbmcgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgZnJhZ21lbnQuCisgICAgICogVGhpcyBpcyBjdXJyZW50bHkganVzdCB1c2VkIHRvIGdldCBpdHMgQ2xhc3NMb2FkZXIuCisgICAgICogQHBhcmFtIGZuYW1lIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBmcmFnbWVudCB0byBpbnN0YW50aWF0ZS4KKyAgICAgKiBAcGFyYW0gYXJncyBCdW5kbGUgb2YgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQsIHdoaWNoIGl0CisgICAgICogY2FuIHJldHJpZXZlIHdpdGgge0BsaW5rICNnZXRBcmd1bWVudHMoKX0uICBNYXkgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgZnJhZ21lbnQgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIElmIHRoZXJlIGlzIGEgZmFpbHVyZSBpbiBpbnN0YW50aWF0aW5nCisgICAgICogdGhlIGdpdmVuIGZyYWdtZW50IGNsYXNzLiAgVGhpcyBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uOyBpdCBpcyBub3QKKyAgICAgKiBub3JtYWxseSBleHBlY3RlZCB0byBoYXBwZW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGcmFnbWVudCBpbnN0YW50aWF0ZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBmbmFtZSwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gc0NsYXNzTWFwLmdldChmbmFtZSk7CisgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIENsYXNzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsIHNlZSBpZiBpdCdzIHJlYWwsIGFuZCB0cnkgdG8gYWRkIGl0CisgICAgICAgICAgICAgICAgY2xhenogPSBjb250ZXh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGZuYW1lKTsKKyAgICAgICAgICAgICAgICBzQ2xhc3NNYXAucHV0KGZuYW1lLCBjbGF6eik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGcmFnbWVudCBmID0gKEZyYWdtZW50KWNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXJncy5zZXRDbGFzc0xvYWRlcihmLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgZi5tQXJndW1lbnRzID0gYXJnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjogbWFrZSBzdXJlIGNsYXNzIG5hbWUgZXhpc3RzLCBpcyBwdWJsaWMsIGFuZCBoYXMgYW4iCisgICAgICAgICAgICAgICAgICAgICsgIiBlbXB0eSBjb25zdHJ1Y3RvciB0aGF0IGlzIHB1YmxpYyIsIGUpOworICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGZyYWdtZW50ICIgKyBmbmFtZQorICAgICAgICAgICAgICAgICAgICArICI6IG1ha2Ugc3VyZSBjbGFzcyBuYW1lIGV4aXN0cywgaXMgcHVibGljLCBhbmQgaGFzIGFuIgorICAgICAgICAgICAgICAgICAgICArICIgZW1wdHkgY29uc3RydWN0b3IgdGhhdCBpcyBwdWJsaWMiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGZyYWdtZW50ICIgKyBmbmFtZQorICAgICAgICAgICAgICAgICAgICArICI6IG1ha2Ugc3VyZSBjbGFzcyBuYW1lIGV4aXN0cywgaXMgcHVibGljLCBhbmQgaGFzIGFuIgorICAgICAgICAgICAgICAgICAgICArICIgZW1wdHkgY29uc3RydWN0b3IgdGhhdCBpcyBwdWJsaWMiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHJlc3RvcmVWaWV3U3RhdGUoKSB7CisgICAgICAgIGlmIChtU2F2ZWRWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVZpZXcucmVzdG9yZUhpZXJhcmNoeVN0YXRlKG1TYXZlZFZpZXdTdGF0ZSk7CisgICAgICAgICAgICBtU2F2ZWRWaWV3U3RhdGUgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIG1JbmRleCA9IGluZGV4OworICAgICAgICBtV2hvID0gImFuZHJvaWQ6ZnJhZ21lbnQ6IiArIG1JbmRleDsKKyAgIH0KKyAgICAKKyAgICB2b2lkIGNsZWFySW5kZXgoKSB7CisgICAgICAgIG1JbmRleCA9IC0xOworICAgICAgICBtV2hvID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBjYW4gbm90IG92ZXJyaWRlIGVxdWFscygpLgorICAgICAqLworICAgIEBPdmVycmlkZSBmaW5hbCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBub3Qgb3ZlcnJpZGUgaGFzaENvZGUoKS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgZmluYWwgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworICAgICAgICBzYi5hcHBlbmQoIkZyYWdtZW50eyIpOworICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSkpOworICAgICAgICBpZiAobUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICMiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmIChtRnJhZ21lbnRJZCAhPSAwKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBpZD0weCIpOworICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcobUZyYWdtZW50SWQpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtVGFnKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaWRlbnRpZmllciB0aGlzIGZyYWdtZW50IGlzIGtub3duIGJ5LiAgVGhpcyBpcyBlaXRoZXIKKyAgICAgKiB0aGUgYW5kcm9pZDppZCB2YWx1ZSBzdXBwbGllZCBpbiBhIGxheW91dCBvciB0aGUgY29udGFpbmVyIHZpZXcgSUQKKyAgICAgKiBzdXBwbGllZCB3aGVuIGFkZGluZyB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudElkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRhZyBuYW1lIG9mIHRoZSBmcmFnbWVudCwgaWYgc3BlY2lmaWVkLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICByZXR1cm4gbVRhZzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU3VwcGx5IHRoZSBjb25zdHJ1Y3Rpb24gYXJndW1lbnRzIGZvciB0aGlzIGZyYWdtZW50LiAgVGhpcyBjYW4gb25seQorICAgICAqIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZyYWdtZW50IGhhcyBiZWVuIGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eTsgdGhhdAorICAgICAqIGlzLCB5b3Ugc2hvdWxkIGNhbGwgaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW5nIHRoZSBmcmFnbWVudC4gIFRoZQorICAgICAqIGFyZ3VtZW50cyBzdXBwbGllZCBoZXJlIHdpbGwgYmUgcmV0YWluZWQgYWNyb3NzIGZyYWdtZW50IGRlc3Ryb3kgYW5kCisgICAgICogY3JlYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnRzKEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgYWxyZWFkeSBhY3RpdmUiKTsKKyAgICAgICAgfQorICAgICAgICBtQXJndW1lbnRzID0gYXJnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFyZ3VtZW50cyBzdXBwbGllZCB3aGVuIHRoZSBmcmFnbWVudCB3YXMgaW5zdGFudGlhdGVkLAorICAgICAqIGlmIGFueS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgQnVuZGxlIGdldEFyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIG1Bcmd1bWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3B0aW9uYWwgdGFyZ2V0IGZvciB0aGlzIGZyYWdtZW50LiAgVGhpcyBtYXkgYmUgdXNlZCwgZm9yIGV4YW1wbGUsCisgICAgICogaWYgdGhpcyBmcmFnbWVudCBpcyBiZWluZyBzdGFydGVkIGJ5IGFub3RoZXIsIGFuZCB3aGVuIGRvbmUgd2FudHMgdG8KKyAgICAgKiBnaXZlIGEgcmVzdWx0IGJhY2sgdG8gdGhlIGZpcnN0LiAgVGhlIHRhcmdldCBzZXQgaGVyZSBpcyByZXRhaW5lZAorICAgICAqIGFjcm9zcyBpbnN0YW5jZXMgdmlhIHtAbGluayBGcmFnbWVudE1hbmFnZXIjcHV0RnJhZ21lbnQKKyAgICAgKiBGcmFnbWVudE1hbmFnZXIucHV0RnJhZ21lbnQoKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGlzIG9uZS4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgT3B0aW9uYWwgcmVxdWVzdCBjb2RlLCBmb3IgY29udmVuaWVuY2UgaWYgeW91CisgICAgICogYXJlIGdvaW5nIHRvIGNhbGwgYmFjayB3aXRoIHtAbGluayAjb25BY3Rpdml0eVJlc3VsdChpbnQsIGludCwgSW50ZW50KX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBtVGFyZ2V0ID0gZnJhZ21lbnQ7CisgICAgICAgIG1UYXJnZXRSZXF1ZXN0Q29kZSA9IHJlcXVlc3RDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFyZ2V0IGZyYWdtZW50IHNldCBieSB7QGxpbmsgI3NldFRhcmdldEZyYWdtZW50fS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgRnJhZ21lbnQgZ2V0VGFyZ2V0RnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiBtVGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFyZ2V0IHJlcXVlc3QgY29kZSBzZXQgYnkge0BsaW5rICNzZXRUYXJnZXRGcmFnbWVudH0uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGludCBnZXRUYXJnZXRSZXF1ZXN0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXRSZXF1ZXN0Q29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEFjdGl2aXR5IHRoaXMgZnJhZ21lbnQgaXMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgRnJhZ21lbnRNYW5hZ2VyIGZvciBpbnRlcmFjdGluZyB3aXRoIGZyYWdtZW50cyBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGlzIGZyYWdtZW50J3MgYWN0aXZpdHkuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGJlIG5vbi1udWxsIHNsaWdodGx5CisgICAgICogYmVmb3JlIHtAbGluayAjZ2V0QWN0aXZpdHkoKX0sIGR1cmluZyB0aGUgdGltZSBmcm9tIHdoZW4gdGhlIGZyYWdtZW50IGlzCisgICAgICogcGxhY2VkIGluIGEge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb259IHVudGlsIGl0IGlzIGNvbW1pdHRlZCBhbmQKKyAgICAgKiBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHkuCisgICAgICovCisgICAgZmluYWwgcHVibGljIEZyYWdtZW50TWFuYWdlciBnZXRGcmFnbWVudE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRNYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgYWRkZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzQWRkZWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHkgIT0gbnVsbCAmJiBtQWN0aXZpdHkubUZyYWdtZW50cy5tQWRkZWQuY29udGFpbnModGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBsYXlvdXQgaXMgaW5jbHVkZWQgYXMgcGFydCBvZiBhbiBhY3Rpdml0eSB2aWV3CisgICAgICogaGllcmFyY2h5IHZpYSB0aGUgJmx0O2ZyYWdtZW50Jmd0OyB0YWcuICBUaGlzIHdpbGwgYWx3YXlzIGJlIHRydWUgd2hlbgorICAgICAqIGZyYWdtZW50cyBhcmUgY3JlYXRlZCB0aHJvdWdoIHRoZSAmbHQ7ZnJhZ21lbnQmZ3Q7IHRhZywgPGVtPmV4Y2VwdDwvZW0+CisgICAgICogaW4gdGhlIGNhc2Ugd2hlcmUgYW4gb2xkIGZyYWdtZW50IGlzIHJlc3RvcmVkIGZyb20gYSBwcmV2aW91cyBzdGF0ZSBhbmQKKyAgICAgKiBpdCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGxheW91dCBvZiB0aGUgY3VycmVudCBzdGF0ZS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0luTGF5b3V0KCkgeworICAgICAgICByZXR1cm4gbUluTGF5b3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgcmVzdW1lZCBzdGF0ZS4gIFRoaXMgaXMgdHJ1ZQorICAgICAqIGZvciB0aGUgZHVyYXRpb24gb2Yge0BsaW5rICNvblJlc3VtZSgpfSBhbmQge0BsaW5rICNvblBhdXNlKCl9IGFzIHdlbGwuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNSZXN1bWVkKCkgeworICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgbWVhbnMKKyAgICAgKiBpdDogKDEpIGhhcyBiZWVuIGFkZGVkLCAoMikgaGFzIGl0cyB2aWV3IGF0dGFjaGVkIHRvIHRoZSB3aW5kb3csIGFuZCAKKyAgICAgKiAoMykgaXMgbm90IGhpZGRlbi4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiBpc0FkZGVkKCkgJiYgIWlzSGlkZGVuKCkgJiYgbVZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1WaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gaGlkZGVuLiAgQnkgZGVmYXVsdCBmcmFnbWVudHMKKyAgICAgKiBhcmUgc2hvd24uICBZb3UgY2FuIGZpbmQgb3V0IGFib3V0IGNoYW5nZXMgdG8gdGhpcyBzdGF0ZSB3aXRoCisgICAgICoge0BsaW5rICNvbkhpZGRlbkNoYW5nZWR9LiAgTm90ZSB0aGF0IHRoZSBoaWRkZW4gc3RhdGUgaXMgb3J0aG9nb25hbAorICAgICAqIHRvIG90aGVyIHN0YXRlcyAtLSB0aGF0IGlzLCB0byBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyLCBhIGZyYWdtZW50CisgICAgICogbXVzdCBiZSBib3RoIHN0YXJ0ZWQgYW5kIG5vdCBoaWRkZW4uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNIaWRkZW4oKSB7CisgICAgICAgIHJldHVybiBtSGlkZGVuOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgaGlkZGVuIHN0YXRlIChhcyByZXR1cm5lZCBieSB7QGxpbmsgI2lzSGlkZGVuKCl9IG9mCisgICAgICogdGhlIGZyYWdtZW50IGhhcyBjaGFuZ2VkLiAgRnJhZ21lbnRzIHN0YXJ0IG91dCBub3QgaGlkZGVuOyB0aGlzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZyYWdtZW50IGNoYW5nZXMgc3RhdGUgZnJvbSB0aGF0LgorICAgICAqIEBwYXJhbSBoaWRkZW4gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgbm93IGhpZGRlbiwgZmFsc2UgaWYgaXQgaXMgbm90CisgICAgICogdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkhpZGRlbkNoYW5nZWQoYm9vbGVhbiBoaWRkZW4pIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIGEgZnJhZ21lbnQgaW5zdGFuY2UgaXMgcmV0YWluZWQgYWNyb3NzIEFjdGl2aXR5CisgICAgICogcmUtY3JlYXRpb24gKHN1Y2ggYXMgZnJvbSBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlKS4gIFRoaXMgY2FuIG9ubHkKKyAgICAgKiBiZSB1c2VkIHdpdGggZnJhZ21lbnRzIG5vdCBpbiB0aGUgYmFjayBzdGFjay4gIElmIHNldCwgdGhlIGZyYWdtZW50CisgICAgICogbGlmZWN5Y2xlIHdpbGwgYmUgc2xpZ2h0bHkgZGlmZmVyZW50IHdoZW4gYW4gYWN0aXZpdHkgaXMgcmVjcmVhdGVkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAbGluayAjb25EZXN0cm95KCl9IHdpbGwgbm90IGJlIGNhbGxlZCAoYnV0IHtAbGluayAjb25EZXRhY2goKX0gc3RpbGwKKyAgICAgKiB3aWxsIGJlLCBiZWNhdXNlIHRoZSBmcmFnbWVudCBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIGl0cyBjdXJyZW50IGFjdGl2aXR5KS4KKyAgICAgKiA8bGk+IHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gd2lsbCBub3QgYmUgY2FsbGVkIHNpbmNlIHRoZSBmcmFnbWVudAorICAgICAqIGlzIG5vdCBiZWluZyByZS1jcmVhdGVkLgorICAgICAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9IDxiPndpbGw8L2I+CisgICAgICogc3RpbGwgYmUgY2FsbGVkLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbiByZXRhaW4pIHsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gcmV0YWluOworICAgIH0KKyAgICAKKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5JbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVwb3J0IHRoYXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIHRvIHBhcnRpY2lwYXRlIGluIHBvcHVsYXRpbmcKKyAgICAgKiB0aGUgb3B0aW9ucyBtZW51IGJ5IHJlY2VpdmluZyBhIGNhbGwgdG8ge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGFuZCByZWxhdGVkIG1ldGhvZHMuCisgICAgICogCisgICAgICogQHBhcmFtIGhhc01lbnUgSWYgdHJ1ZSwgdGhlIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uc01lbnUoYm9vbGVhbiBoYXNNZW51KSB7CisgICAgICAgIGlmIChtSGFzTWVudSAhPSBoYXNNZW51KSB7CisgICAgICAgICAgICBtSGFzTWVudSA9IGhhc01lbnU7CisgICAgICAgICAgICBpZiAoaXNBZGRlZCgpICYmICFpc0hpZGRlbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmludmFsaWRhdGVPcHRpb25zTWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCl9IG9uIHRoZSBmcmFnbWVudCdzCisgICAgICogY29udGFpbmluZyBBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCAtMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpfSBvbiB0aGUgZnJhZ21lbnQncworICAgICAqIGNvbnRhaW5pbmcgQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlY2VpdmUgdGhlIHJlc3VsdCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCl9LiAgVGhpcyBmb2xsb3dzIHRoZQorICAgICAqIHJlbGF0ZWQgQWN0aXZpdHkgQVBJIGFzIGRlc2NyaWJlZCB0aGVyZSBpbgorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgVGhlIGludGVnZXIgcmVxdWVzdCBjb2RlIG9yaWdpbmFsbHkgc3VwcGxpZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgd2hvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGNhbWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q29kZSBUaGUgaW50ZWdlciByZXN1bHQgY29kZSByZXR1cm5lZCBieSB0aGUgY2hpbGQgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGl0cyBzZXRSZXN1bHQoKS4KKyAgICAgKiBAcGFyYW0gZGF0YSBBbiBJbnRlbnQsIHdoaWNoIGNhbiByZXR1cm4gcmVzdWx0IGRhdGEgdG8gdGhlIGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgKHZhcmlvdXMgZGF0YSBjYW4gYmUgYXR0YWNoZWQgdG8gSW50ZW50ICJleHRyYXMiKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgdmlldyBsYXlvdXQKKyAgICAgKiBpbmZsYXRpb24sIHR5cGljYWxseSBmcm9tIHNldHRpbmcgdGhlIGNvbnRlbnQgdmlldyBvZiBhbiBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZnJhZ21lbnQgaXMgY3JlYXRlZCBmcm9tIGEgPGZyYWdtZW50PgorICAgICAqIHRhZyBpbiBhIGxheW91dCBmaWxlLiAgTm90ZSB0aGlzIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgZnJhZ21lbnQncworICAgICAqIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBoYXMgYmVlbiBjYWxsZWQ7IGFsbCB5b3Ugc2hvdWxkIGRvIGhlcmUgaXMKKyAgICAgKiBwYXJzZSB0aGUgYXR0cmlidXRlcyBhbmQgc2F2ZSB0aGVtIGF3YXkuICBBIGNvbnZlbmllbnQgdGhpbmcgdG8gZG8gaXMKKyAgICAgKiBzaW1wbHkgY29weSB0aGVtIGludG8gYSBCdW5kbGUgdGhhdCBpcyBnaXZlbiB0byB7QGxpbmsgI3NldEFyZ3VtZW50cyhCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBmcmFnbWVudCBpcyBpbmZsYXRlZCwgZXZlbiBpZiBpdCBpcworICAgICAqIGJlaW5nIGluZmxhdGVkIGludG8gYSBuZXcgaW5zdGFuY2Ugd2l0aCBzYXZlZCBzdGF0ZS4gIEJlY2F1c2UgYSBmcmFnbWVudCdzCisgICAgICogYXJndW1lbnRzIGFyZSByZXRhaW5lZCBhY3Jvc3MgaW5zdGFuY2VzLCBpdCBtYXkgbWFrZSBubyBzZW5zZSB0byByZS1wYXJzZQorICAgICAqIHRoZSBhdHRyaWJ1dGVzIGludG8gbmV3IGFyZ3VtZW50cy4gIFlvdSBtYXkgd2FudCB0byBmaXJzdCBjaGVjaworICAgICAqIHtAbGluayAjZ2V0QXJndW1lbnRzKCl9IGFuZCBvbmx5IHBhcnNlIHRoZSBhdHRyaWJ1dGVzIGlmIGl0IHJldHVybnMgbnVsbCwKKyAgICAgKiB0aGUgYXNzdW1wdGlvbiBiZWluZyB0aGF0IGlmIGl0IGlzIG5vbi1udWxsIHRob3NlIGFyZSB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBmcm9tIHRoZSBmaXJzdCB0aW1lIHRoZSBmcmFnbWVudCB3YXMgaW5mbGF0ZWQuICAoVGhhdCBzYWlkLCB5b3UgbWF5IHdhbnQKKyAgICAgKiB0byBoYXZlIGxheW91dHMgY2hhbmdlIGZvciBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgc3VjaCBhcyBsYW5kc2NhcGUKKyAgICAgKiBhbmQgcG9ydHJhaXQsIHdoaWNoIGNhbiBoYXZlIGRpZmZlcmVudCBhdHRyaWJ1dGVzLiAgSWYgc28sIHlvdSB3aWxsIG5lZWQKKyAgICAgKiB0byByZS1wYXJzZSB0aGUgYXR0cmlidXRlcyBlYWNoIHRpbWUgdGhpcyBpcyBjYWxsZWQgdG8gZ2VuZXJhdGUgbmV3CisgICAgICogYXJndW1lbnRzLik8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIGF0IHRoZSB0YWcgd2hlcmUgdGhlIGZyYWdtZW50IGlzCisgICAgICogYmVpbmcgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkluZmxhdGUoQXR0cmlidXRlU2V0IGF0dHJzLCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGZyYWdtZW50IGlzIGZpcnN0IGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoaXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BdHRhY2goQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgbG9hZHMgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRvciBvbkNyZWF0ZUFuaW1hdG9yKGludCB0cmFuc2l0LCBib29sZWFuIGVudGVyLCBpbnQgbmV4dEFuaW0pIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkbyBpbml0aWFsIGNyZWF0aW9uIG9mIGEgZnJhZ21lbnQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgorICAgICAqIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBhbmQgYmVmb3JlCisgICAgICoge0BsaW5rICNvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIsIFZpZXdHcm91cCwgQnVuZGxlKX0uCisgICAgICogCisgICAgICogPHA+Tm90ZSB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCB3aGlsZSB0aGUgZnJhZ21lbnQncyBhY3Rpdml0eSBpcworICAgICAqIHN0aWxsIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNyZWF0ZWQuICBBcyBzdWNoLCB5b3UgY2FuIG5vdCByZWx5CisgICAgICogb24gdGhpbmdzIGxpa2UgdGhlIGFjdGl2aXR5J3MgY29udGVudCB2aWV3IGhpZXJhcmNoeSBiZWluZyBpbml0aWFsaXplZAorICAgICAqIGF0IHRoaXMgcG9pbnQuICBJZiB5b3Ugd2FudCB0byBkbyB3b3JrIG9uY2UgdGhlIGFjdGl2aXR5IGl0c2VsZiBpcworICAgICAqIGNyZWF0ZWQsIHNlZSB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgdGhlIGZyYWdtZW50IGlzIGJlaW5nIHJlLWNyZWF0ZWQgZnJvbQorICAgICAqIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGUsIHRoaXMgaXMgdGhlIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBoYXZlIHRoZSBmcmFnbWVudCBpbnN0YW50aWF0ZSBpdHMgdXNlciBpbnRlcmZhY2Ugdmlldy4KKyAgICAgKiBUaGlzIGlzIG9wdGlvbmFsLCBhbmQgbm9uLWdyYXBoaWNhbCBmcmFnbWVudHMgY2FuIHJldHVybiBudWxsICh3aGljaAorICAgICAqIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uKS4gIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmV0d2VlbgorICAgICAqIHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gYW5kIHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlKX0uCisgICAgICogCisgICAgICogPHA+SWYgeW91IHJldHVybiBhIFZpZXcgZnJvbSBoZXJlLCB5b3Ugd2lsbCBsYXRlciBiZSBjYWxsZWQgaW4KKyAgICAgKiB7QGxpbmsgI29uRGVzdHJveVZpZXd9IHdoZW4gdGhlIHZpZXcgaXMgYmVpbmcgcmVsZWFzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGluZmxhdGVyIFRoZSBMYXlvdXRJbmZsYXRlciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbmZsYXRlCisgICAgICogYW55IHZpZXdzIGluIHRoZSBmcmFnbWVudCwKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBwYXJlbnQgdmlldyB0aGF0IHRoZSBmcmFnbWVudCdzCisgICAgICogVUkgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLiAgVGhlIGZyYWdtZW50IHNob3VsZCBub3QgYWRkIHRoZSB2aWV3IGl0c2VsZiwKKyAgICAgKiBidXQgdGhpcyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgTGF5b3V0UGFyYW1zIG9mIHRoZSB2aWV3LgorICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgbm9uLW51bGwsIHRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY29uc3RydWN0ZWQKKyAgICAgKiBmcm9tIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGUgYXMgZ2l2ZW4gaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybiB0aGUgVmlldyBmb3IgdGhlIGZyYWdtZW50J3MgVUksIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFZpZXcgZ2V0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQncyBhY3Rpdml0eSBoYXMgYmVlbiBjcmVhdGVkIGFuZCB0aGlzCisgICAgICogZnJhZ21lbnQncyB2aWV3IGhpZXJhcmNoeSBpbnN0YW50aWF0ZWQuICBJdCBjYW4gYmUgdXNlZCB0byBkbyBmaW5hbAorICAgICAqIGluaXRpYWxpemF0aW9uIG9uY2UgdGhlc2UgcGllY2VzIGFyZSBpbiBwbGFjZSwgc3VjaCBhcyByZXRyaWV2aW5nCisgICAgICogdmlld3Mgb3IgcmVzdG9yaW5nIHN0YXRlLiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIGZyYWdtZW50cyB0aGF0IHVzZQorICAgICAqIHtAbGluayAjc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbil9IHRvIHJldGFpbiB0aGVpciBpbnN0YW5jZSwKKyAgICAgKiBhcyB0aGlzIGNhbGxiYWNrIHRlbGxzIHRoZSBmcmFnbWVudCB3aGVuIGl0IGlzIGZ1bGx5IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBuZXcgYWN0aXZpdHkgaW5zdGFuY2UuICBUaGlzIGlzIGNhbGxlZCBhZnRlciB7QGxpbmsgI29uQ3JlYXRlVmlld30KKyAgICAgKiBhbmQgYmVmb3JlIHtAbGluayAjb25TdGFydCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQgaXMgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25TdGFydCgpIEFjdGl2aXR5Lm9uU3RhcnR9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlciA9IG1BY3Rpdml0eS5nZXRMb2FkZXJNYW5hZ2VyKG1JbmRleCwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdGFydCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyB2aXNpYmxlIHRvIHRoZSB1c2VyIGFuZCBhY3RpdmVseSBydW5uaW5nLgorICAgICAqIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25SZXN1bWUoKSBBY3Rpdml0eS5vblJlc3VtZX0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBhc2sgdGhlIGZyYWdtZW50IHRvIHNhdmUgaXRzIGN1cnJlbnQgZHluYW1pYyBzdGF0ZSwgc28gaXQKKyAgICAgKiBjYW4gbGF0ZXIgYmUgcmVjb25zdHJ1Y3RlZCBpbiBhIG5ldyBpbnN0YW5jZSBvZiBpdHMgcHJvY2VzcyBpcworICAgICAqIHJlc3RhcnRlZC4gIElmIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBmcmFnbWVudCBsYXRlciBuZWVkcyB0byBiZQorICAgICAqIGNyZWF0ZWQsIHRoZSBkYXRhIHlvdSBwbGFjZSBpbiB0aGUgQnVuZGxlIGhlcmUgd2lsbCBiZSBhdmFpbGFibGUKKyAgICAgKiBpbiB0aGUgQnVuZGxlIGdpdmVuIHRvIHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0sCisgICAgICoge0BsaW5rICNvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIsIFZpZXdHcm91cCwgQnVuZGxlKX0sIGFuZAorICAgICAqIHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlKX0uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHtAbGluayBBY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSkKKyAgICAgKiBBY3Rpdml0eS5vblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSl9IGFuZCBtb3N0IG9mIHRoZSBkaXNjdXNzaW9uIHRoZXJlCisgICAgICogYXBwbGllcyBoZXJlIGFzIHdlbGwuICBOb3RlIGhvd2V2ZXI6IDxlbT50aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkCisgICAgICogYXQgYW55IHRpbWUgYmVmb3JlIHtAbGluayAjb25EZXN0cm95KCl9PC9lbT4uICBUaGVyZSBhcmUgbWFueSBzaXR1YXRpb25zCisgICAgICogd2hlcmUgYSBmcmFnbWVudCBtYXkgYmUgbW9zdGx5IHRvcm4gZG93biAoc3VjaCBhcyB3aGVuIHBsYWNlZCBvbiB0aGUKKyAgICAgKiBiYWNrIHN0YWNrIHdpdGggbm8gVUkgc2hvd2luZyksIGJ1dCBpdHMgc3RhdGUgd2lsbCBub3QgYmUgc2F2ZWQgdW50aWwKKyAgICAgKiBpdHMgb3duaW5nIGFjdGl2aXR5IGFjdHVhbGx5IG5lZWRzIHRvIHNhdmUgaXRzIHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIG91dFN0YXRlIEJ1bmRsZSBpbiB3aGljaCB0byBwbGFjZSB5b3VyIHNhdmVkIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBGcmFnbWVudCBpcyBubyBsb25nZXIgcmVzdW1lZC4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25QYXVzZSgpIEFjdGl2aXR5Lm9uUGF1c2V9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBGcmFnbWVudCBpcyBubyBsb25nZXIgc3RhcnRlZC4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25TdG9wKCkgQWN0aXZpdHkub25TdG9wfSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG9uTG93TWVtb3J5KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZpZXcgcHJldmlvdXNseSBjcmVhdGVkIGJ5IHtAbGluayAjb25DcmVhdGVWaWV3fSBoYXMKKyAgICAgKiBiZWVuIGRldGFjaGVkIGZyb20gdGhlIGZyYWdtZW50LiAgVGhlIG5leHQgdGltZSB0aGUgZnJhZ21lbnQgbmVlZHMKKyAgICAgKiB0byBiZSBkaXNwbGF5ZWQsIGEgbmV3IHZpZXcgd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBpcyBjYWxsZWQKKyAgICAgKiBhZnRlciB7QGxpbmsgI29uU3RvcCgpfSBhbmQgYmVmb3JlIHtAbGluayAjb25EZXN0cm95KCl9LiAgSXQgaXMgY2FsbGVkCisgICAgICogPGVtPnJlZ2FyZGxlc3M8L2VtPiBvZiB3aGV0aGVyIHtAbGluayAjb25DcmVhdGVWaWV3fSByZXR1cm5lZCBhCisgICAgICogbm9uLW51bGwgdmlldy4gIEludGVybmFsbHkgaXQgaXMgY2FsbGVkIGFmdGVyIHRoZSB2aWV3J3Mgc3RhdGUgaGFzCisgICAgICogYmVlbiBzYXZlZCBidXQgYmVmb3JlIGl0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGluIHVzZS4gIFRoaXMgaXMgY2FsbGVkCisgICAgICogYWZ0ZXIge0BsaW5rICNvblN0b3AoKX0gYW5kIGJlZm9yZSB7QGxpbmsgI29uRGV0YWNoKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIC8vTG9nLnYoImZvbyIsICJvbkRlc3Ryb3k6IG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcj0iICsgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyCisgICAgICAgIC8vICAgICAgICArICIgbUxvYWRlck1hbmFnZXI9IiArIG1Mb2FkZXJNYW5hZ2VyKTsKKyAgICAgICAgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlciA9IG1BY3Rpdml0eS5nZXRMb2FkZXJNYW5hZ2VyKG1JbmRleCwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9EZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkRlc3Ryb3koKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EZXRhY2goKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgQWN0aXZpdHkncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUuICBZb3UKKyAgICAgKiBzaG91bGQgcGxhY2UgeW91ciBtZW51IGl0ZW1zIGluIHRvIDx2YXI+bWVudTwvdmFyPi4gIEZvciB0aGlzIG1ldGhvZAorICAgICAqIHRvIGJlIGNhbGxlZCwgeW91IG11c3QgaGF2ZSBmaXJzdCBjYWxsZWQge0BsaW5rICNzZXRIYXNPcHRpb25zTWVudX0uICBTZWUKKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGVPcHRpb25zTWVudShNZW51KSBBY3Rpdml0eS5vbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51IFRoZSBvcHRpb25zIG1lbnUgaW4gd2hpY2ggeW91IHBsYWNlIHlvdXIgaXRlbXMuCisgICAgICogCisgICAgICogQHNlZSAjc2V0SGFzT3B0aW9uc01lbnUKKyAgICAgKiBAc2VlICNvblByZXBhcmVPcHRpb25zTWVudQorICAgICAqIEBzZWUgI29uT3B0aW9uc0l0ZW1TZWxlY3RlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIHRoZSBTY3JlZW4ncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUgdG8gYmUgZGlzcGxheWVkLiAgVGhpcyBpcworICAgICAqIGNhbGxlZCByaWdodCBiZWZvcmUgdGhlIG1lbnUgaXMgc2hvd24sIGV2ZXJ5IHRpbWUgaXQgaXMgc2hvd24uICBZb3UgY2FuCisgICAgICogdXNlIHRoaXMgbWV0aG9kIHRvIGVmZmljaWVudGx5IGVuYWJsZS9kaXNhYmxlIGl0ZW1zIG9yIG90aGVyd2lzZQorICAgICAqIGR5bmFtaWNhbGx5IG1vZGlmeSB0aGUgY29udGVudHMuICBTZWUKKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSkgQWN0aXZpdHkub25QcmVwYXJlT3B0aW9uc01lbnV9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBhcyBsYXN0IHNob3duIG9yIGZpcnN0IGluaXRpYWxpemVkIGJ5CisgICAgICogICAgICAgICAgICAgb25DcmVhdGVPcHRpb25zTWVudSgpLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldEhhc09wdGlvbnNNZW51CisgICAgICogQHNlZSAjb25DcmVhdGVPcHRpb25zTWVudQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpbiB5b3VyIG9wdGlvbnMgbWVudSBpcyBzZWxlY3RlZC4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBmYWxzZSB0byBoYXZlIHRoZSBub3JtYWwKKyAgICAgKiBwcm9jZXNzaW5nIGhhcHBlbiAoY2FsbGluZyB0aGUgaXRlbSdzIFJ1bm5hYmxlIG9yIHNlbmRpbmcgYSBtZXNzYWdlIHRvCisgICAgICogaXRzIEhhbmRsZXIgYXMgYXBwcm9wcmlhdGUpLiAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgZm9yIGFueSBpdGVtcworICAgICAqIGZvciB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBkbyBwcm9jZXNzaW5nIHdpdGhvdXQgdGhvc2Ugb3RoZXIKKyAgICAgKiBmYWNpbGl0aWVzLgorICAgICAqIAorICAgICAqIDxwPkRlcml2ZWQgY2xhc3NlcyBzaG91bGQgY2FsbCB0aHJvdWdoIHRvIHRoZSBiYXNlIGNsYXNzIGZvciBpdCB0bworICAgICAqIHBlcmZvcm0gdGhlIGRlZmF1bHQgbWVudSBoYW5kbGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXRlbSBUaGUgbWVudSBpdGVtIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIG1lbnUgcHJvY2Vzc2luZyB0bworICAgICAqICAgICAgICAgcHJvY2VlZCwgdHJ1ZSB0byBjb25zdW1lIGl0IGhlcmUuCisgICAgICogCisgICAgICogQHNlZSAjb25DcmVhdGVPcHRpb25zTWVudQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBvcHRpb25zIG1lbnUgaXMgYmVpbmcgY2xvc2VkIChlaXRoZXIgYnkgdGhlIHVzZXIgY2FuY2VsaW5nCisgICAgICogdGhlIG1lbnUgd2l0aCB0aGUgYmFjay9tZW51IGJ1dHRvbiwgb3Igd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkKS4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBhcyBsYXN0IHNob3duIG9yIGZpcnN0IGluaXRpYWxpemVkIGJ5CisgICAgICogICAgICAgICAgICAgb25DcmVhdGVPcHRpb25zTWVudSgpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uT3B0aW9uc01lbnVDbG9zZWQoTWVudSBtZW51KSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgY29udGV4dCBtZW51IGZvciB0aGUge0Bjb2RlIHZpZXd9IGlzIGFib3V0IHRvIGJlIHNob3duLgorICAgICAqIFVubGlrZSB7QGxpbmsgI29uQ3JlYXRlT3B0aW9uc01lbnV9LCB0aGlzIHdpbGwgYmUgY2FsbGVkIGV2ZXJ5CisgICAgICogdGltZSB0aGUgY29udGV4dCBtZW51IGlzIGFib3V0IHRvIGJlIHNob3duIGFuZCBzaG91bGQgYmUgcG9wdWxhdGVkIGZvcgorICAgICAqIHRoZSB2aWV3IChvciBpdGVtIGluc2lkZSB0aGUgdmlldyBmb3Ige0BsaW5rIEFkYXB0ZXJWaWV3fSBzdWJjbGFzc2VzLAorICAgICAqIHRoaXMgY2FuIGJlIGZvdW5kIGluIHRoZSB7QGNvZGUgbWVudUluZm99KSkuCisgICAgICogPHA+CisgICAgICogVXNlIHtAbGluayAjb25Db250ZXh0SXRlbVNlbGVjdGVkKGFuZHJvaWQudmlldy5NZW51SXRlbSl9IHRvIGtub3cgd2hlbiBhbgorICAgICAqIGl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWQuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgdXAgdG8KKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGVDb250ZXh0TWVudSBBY3Rpdml0eS5vbkNyZWF0ZUNvbnRleHRNZW51fSwgdGhvdWdoCisgICAgICogeW91IGNhbiBub3QgY2FsbCB0aGlzIGltcGxlbWVudGF0aW9uIGlmIHlvdSBkb24ndCB3YW50IHRoYXQgYmVoYXZpb3IuCisgICAgICogPHA+CisgICAgICogSXQgaXMgbm90IHNhZmUgdG8gaG9sZCBvbnRvIHRoZSBjb250ZXh0IG1lbnUgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBnZXRBY3Rpdml0eSgpLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSwgdiwgbWVudUluZm8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNvbnRleHQgbWVudSB0byBiZSBzaG93biBmb3IgdGhlIGdpdmVuIHZpZXcgKG11bHRpcGxlIHZpZXdzCisgICAgICogY2FuIHNob3cgdGhlIGNvbnRleHQgbWVudSkuIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZQorICAgICAqIHtAbGluayBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXJ9IG9uIHRoZSB2aWV3IHRvIHRoaXMgZnJhZ21lbnQsIHNvCisgICAgICoge0BsaW5rICNvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51LCBWaWV3LCBDb250ZXh0TWVudUluZm8pfSB3aWxsIGJlCisgICAgICogY2FsbGVkIHdoZW4gaXQgaXMgdGltZSB0byBzaG93IHRoZSBjb250ZXh0IG1lbnUuCisgICAgICogCisgICAgICogQHNlZSAjdW5yZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcpCisgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCBzaG91bGQgc2hvdyBhIGNvbnRleHQgbWVudS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJldmVudHMgYSBjb250ZXh0IG1lbnUgdG8gYmUgc2hvd24gZm9yIHRoZSBnaXZlbiB2aWV3LiBUaGlzIG1ldGhvZCB3aWxsCisgICAgICogcmVtb3ZlIHRoZSB7QGxpbmsgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyfSBvbiB0aGUgdmlldy4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNyZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcpCisgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCBzaG91bGQgc3RvcCBzaG93aW5nIGEgY29udGV4dCBtZW51LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JDb250ZXh0TWVudShWaWV3IHZpZXcpIHsKKyAgICAgICAgdmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobnVsbCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpbiBhIGNvbnRleHQgbWVudSBpcyBzZWxlY3RlZC4gVGhlCisgICAgICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBmYWxzZSB0byBoYXZlIHRoZSBub3JtYWwgcHJvY2Vzc2luZworICAgICAqIGhhcHBlbiAoY2FsbGluZyB0aGUgaXRlbSdzIFJ1bm5hYmxlIG9yIHNlbmRpbmcgYSBtZXNzYWdlIHRvIGl0cyBIYW5kbGVyCisgICAgICogYXMgYXBwcm9wcmlhdGUpLiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCBmb3IgYW55IGl0ZW1zIGZvciB3aGljaCB5b3UKKyAgICAgKiB3b3VsZCBsaWtlIHRvIGRvIHByb2Nlc3Npbmcgd2l0aG91dCB0aG9zZSBvdGhlciBmYWNpbGl0aWVzLgorICAgICAqIDxwPgorICAgICAqIFVzZSB7QGxpbmsgTWVudUl0ZW0jZ2V0TWVudUluZm8oKX0gdG8gZ2V0IGV4dHJhIGluZm9ybWF0aW9uIHNldCBieSB0aGUKKyAgICAgKiBWaWV3IHRoYXQgYWRkZWQgdGhpcyBtZW51IGl0ZW0uCisgICAgICogPHA+CisgICAgICogRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBjYWxsIHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgZm9yIGl0IHRvIHBlcmZvcm0KKyAgICAgKiB0aGUgZGVmYXVsdCBtZW51IGhhbmRsaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBjb250ZXh0IG1lbnUgaXRlbSB0aGF0IHdhcyBzZWxlY3RlZC4KKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBjb250ZXh0IG1lbnUgcHJvY2Vzc2luZyB0bworICAgICAqICAgICAgICAgcHJvY2VlZCwgdHJ1ZSB0byBjb25zdW1lIGl0IGhlcmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25Db250ZXh0SXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCB0aGUgRnJhZ21lbnRzJ3Mgc3RhdGUgaW50byB0aGUgZ2l2ZW4gc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUZXh0IHRvIHByaW50IGF0IHRoZSBmcm9udCBvZiBlYWNoIGxpbmUuCisgICAgICogQHBhcmFtIGZkIFRoZSByYXcgZmlsZSBkZXNjcmlwdG9yIHRoYXQgdGhlIGR1bXAgaXMgYmVpbmcgc2VudCB0by4KKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSBQcmludFdyaXRlciB0byB3aGljaCB5b3Ugc2hvdWxkIGR1bXAgeW91ciBzdGF0ZS4gIFRoaXMgd2lsbCBiZQorICAgICAqIGNsb3NlZCBmb3IgeW91IGFmdGVyIHlvdSByZXR1cm4uCisgICAgICogQHBhcmFtIGFyZ3MgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGR1bXAgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdW1wKFN0cmluZyBwcmVmaXgsIEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibUZyYWdtZW50SWQ9Iik7IHdyaXRlci5wcmludChtRnJhZ21lbnRJZCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbUNvbnRhaW5lcklkPSIpOyB3cml0ZXIucHJpbnQobUNvbnRhaW5lcklkKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBtVGFnPSIpOyB3cml0ZXIucHJpbnRsbihtVGFnKTsKKyAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibVN0YXRlPSIpOyB3cml0ZXIucHJpbnQobVN0YXRlKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBtSW5kZXg9Iik7IHdyaXRlci5wcmludChtSW5kZXgpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1XaG89Iik7IHdyaXRlci5wcmludChtV2hvKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBtQmFja1N0YWNrTmVzdGluZz0iKTsgd3JpdGVyLnByaW50bG4obUJhY2tTdGFja05lc3RpbmcpOworICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50KCJtQWRkZWQ9Iik7IHdyaXRlci5wcmludChtQWRkZWQpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1SZXN1bWVkPSIpOyB3cml0ZXIucHJpbnQobVJlc3VtZWQpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1Gcm9tTGF5b3V0PSIpOyB3cml0ZXIucHJpbnQobUZyb21MYXlvdXQpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1JbkxheW91dD0iKTsgd3JpdGVyLnByaW50bG4obUluTGF5b3V0KTsKKyAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibUhpZGRlbj0iKTsgd3JpdGVyLnByaW50KG1IaWRkZW4pOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1SZXRhaW5JbnN0YW5jZT0iKTsgd3JpdGVyLnByaW50KG1SZXRhaW5JbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbVJldGFpbmluZz0iKTsgd3JpdGVyLnByaW50KG1SZXRhaW5pbmcpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1IYXNNZW51PSIpOyB3cml0ZXIucHJpbnRsbihtSGFzTWVudSk7CisgICAgICAgIGlmIChtRnJhZ21lbnRNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1GcmFnbWVudE1hbmFnZXI9Iik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1GcmFnbWVudE1hbmFnZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChtSW1tZWRpYXRlQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibUltbWVkaWF0ZUFjdGl2aXR5PSIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtSW1tZWRpYXRlQWN0aXZpdHkpOworICAgICAgICB9CisgICAgICAgIGlmIChtQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibUFjdGl2aXR5PSIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtQWN0aXZpdHkpOworICAgICAgICB9CisgICAgICAgIGlmIChtQXJndW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1Bcmd1bWVudHM9Iik7IHdyaXRlci5wcmludGxuKG1Bcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIGlmIChtU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1TYXZlZEZyYWdtZW50U3RhdGU9Iik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtU2F2ZWRWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibVNhdmVkVmlld1N0YXRlPSIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtU2F2ZWRWaWV3U3RhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1UYXJnZXQ9Iik7IHdyaXRlci5wcmludChtVGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbVRhcmdldFJlcXVlc3RDb2RlPSIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtVGFyZ2V0UmVxdWVzdENvZGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtTmV4dEFuaW0gIT0gMCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibU5leHRBbmltPSIpOyB3cml0ZXIucHJpbnRsbihtTmV4dEFuaW0pOworICAgICAgICB9CisgICAgICAgIGlmIChtQ29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1Db250YWluZXI9Iik7IHdyaXRlci5wcmludGxuKG1Db250YWluZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50KCJtVmlldz0iKTsgd3JpdGVyLnByaW50bG4obVZpZXcpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50KCJtTG9hZGVyTWFuYWdlcj0iKTsgd3JpdGVyLnByaW50KG1Mb2FkZXJNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbVN0YXJ0ZWQ9Iik7IHdyaXRlci5wcmludChtU3RhcnRlZCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcj0iKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGVyZm9ybVN0b3AoKSB7CisgICAgICAgIG9uU3RvcCgpOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZpdHkgPT0gbnVsbCB8fCAhbUFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RvcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvUmV0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50QnJlYWRDcnVtYnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudEJyZWFkQ3J1bWJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlMDc0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudEJyZWFkQ3J1bWJzLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyLkJhY2tTdGFja0VudHJ5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3Igc2hvd2luZyAiYnJlYWQgY3J1bWJzIiByZXByZXNlbnRpbmcgdGhlIGZyYWdtZW50CisgKiBzdGFjayBpbiBhbiBhY3Rpdml0eS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoCisgKiB7QGxpbmsgQWN0aW9uQmFyI3NldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcpCisgKiBBY3Rpb25CYXIuc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyl9IHRvIHBsYWNlIHRoZSBicmVhZCBjcnVtYnMgaW4KKyAqIHRoZSBuYXZpZ2F0aW9uIGFyZWEgb2YgdGhlIGFjdGlvbiBiYXIuCisgKgorICogPHA+VGhlIGRlZmF1bHQgc3R5bGUgZm9yIHRoaXMgdmlldyBpcworICoge0BsaW5rIGFuZHJvaWQuUi5zdHlsZSNXaWRnZXRfRnJhZ21lbnRCcmVhZENydW1ic30uCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudEJyZWFkQ3J1bWJzIGV4dGVuZHMgVmlld0dyb3VwCisgICAgICAgIGltcGxlbWVudHMgRnJhZ21lbnRNYW5hZ2VyLk9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIHsKKyAgICBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyOworICAgIExpbmVhckxheW91dCBtQ29udGFpbmVyOworCisgICAgLy8gSGFoYWgKKyAgICBCYWNrU3RhY2tSZWNvcmQgbVRvcEVudHJ5OworCisgICAgcHVibGljIEZyYWdtZW50QnJlYWRDcnVtYnMoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50QnJlYWRDcnVtYnMoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgYW5kcm9pZC5SLnN0eWxlLldpZGdldF9GcmFnbWVudEJyZWFkQ3J1bWJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRCcmVhZENydW1icyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIHRoZSBicmVhZCBjcnVtYnMgdG8gdGhlaXIgYWN0aXZpdHkuICBUaGlzIG11c3QgYmUgY2FsbGVkIG9uY2UKKyAgICAgKiB3aGVuIGNyZWF0aW5nIHRoZSBicmVhZCBjcnVtYnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZpdHkoQWN0aXZpdHkgYSkgeworICAgICAgICBtQWN0aXZpdHkgPSBhOworICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpYS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICBtQ29udGFpbmVyID0gKExpbmVhckxheW91dCltSW5mbGF0ZXIuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5mcmFnbWVudF9icmVhZF9jcnVtYnMsCisgICAgICAgICAgICAgICAgdGhpcywgZmFsc2UpOworICAgICAgICBhZGRWaWV3KG1Db250YWluZXIpOworICAgICAgICBhLmdldEZyYWdtZW50TWFuYWdlcigpLmFkZE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgICAgICB1cGRhdGVDcnVtYnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjdXN0b20gdGl0bGUgZm9yIHRoZSBicmVhZCBjcnVtYnMuICBUaGlzIHdpbGwgYmUgdGhlIGZpcnN0IGVudHJ5CisgICAgICogc2hvd24gYXQgdGhlIGxlZnQsIHJlcHJlc2VudGluZyB0aGUgcm9vdCBvZiB0aGUgYnJlYWQgY3J1bWJzLiAgSWYgdGhlCisgICAgICogdGl0bGUgaXMgbnVsbCwgaXQgd2lsbCBub3QgYmUgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlLCBDaGFyU2VxdWVuY2Ugc2hvcnRUaXRsZSkgeworICAgICAgICBpZiAodGl0bGUgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRvcEVudHJ5ID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ub3BFbnRyeSA9IG5ldyBCYWNrU3RhY2tSZWNvcmQoKEZyYWdtZW50TWFuYWdlckltcGwpCisgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKSk7CisgICAgICAgICAgICBtVG9wRW50cnkuc2V0QnJlYWRDcnVtYlRpdGxlKHRpdGxlKTsKKyAgICAgICAgICAgIG1Ub3BFbnRyeS5zZXRCcmVhZENydW1iU2hvcnRUaXRsZShzaG9ydFRpdGxlKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVDcnVtYnMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgIC8vIEV2ZW50dWFsbHkgd2Ugc2hvdWxkIGltcGxlbWVudCBvdXIgb3duIGxheW91dCBvZiB0aGUgdmlld3MsCisgICAgICAgIC8vIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYSBsaW5lYXIgbGF5b3V0LgorICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworCisgICAgICAgICAgICBpbnQgY2hpbGRSaWdodCA9IG1QYWRkaW5nTGVmdCArIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKSAtIG1QYWRkaW5nUmlnaHQ7CisgICAgICAgICAgICBpbnQgY2hpbGRCb3R0b20gPSBtUGFkZGluZ1RvcCArIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbTsKKyAgICAgICAgICAgIGNoaWxkLmxheW91dChtUGFkZGluZ0xlZnQsIG1QYWRkaW5nVG9wLCBjaGlsZFJpZ2h0LCBjaGlsZEJvdHRvbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisKKyAgICAgICAgaW50IG1heEhlaWdodCA9IDA7CisgICAgICAgIGludCBtYXhXaWR0aCA9IDA7CisKKyAgICAgICAgLy8gRmluZCByaWdodG1vc3QgYW5kIGJvdHRvbS1tb3N0IGNoaWxkCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgICAgICBtZWFzdXJlQ2hpbGQoY2hpbGQsIHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCkpOworICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBY2NvdW50IGZvciBwYWRkaW5nIHRvbworICAgICAgICBtYXhXaWR0aCArPSBtUGFkZGluZ0xlZnQgKyBtUGFkZGluZ1JpZ2h0OworICAgICAgICBtYXhIZWlnaHQgKz0gbVBhZGRpbmdUb3AgKyBtUGFkZGluZ0JvdHRvbTsKKworICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKKyAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBnZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0KCkpOworICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBnZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGgoKSk7CisKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24ocmVzb2x2ZVNpemUobWF4V2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpLAorICAgICAgICAgICAgICAgIHJlc29sdmVTaXplKG1heEhlaWdodCwgaGVpZ2h0TWVhc3VyZVNwZWMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkJhY2tTdGFja0NoYW5nZWQoKSB7CisgICAgICAgIHVwZGF0ZUNydW1icygpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlQ3J1bWJzKCkgeworICAgICAgICBGcmFnbWVudE1hbmFnZXIgZm0gPSBtQWN0aXZpdHkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7CisgICAgICAgIGludCBudW1FbnRyaWVzID0gZm0uY291bnRCYWNrU3RhY2tFbnRyaWVzKCk7CisgICAgICAgIGludCBudW1WaWV3cyA9IG1Db250YWluZXIuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gbVRvcEVudHJ5ICE9IG51bGwgPyAtMSA6IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKKyAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzZSA9IGkgPT0gLTEgPyBtVG9wRW50cnkgOiBmbS5nZXRCYWNrU3RhY2tFbnRyeShpKTsKKyAgICAgICAgICAgIGludCB2aWV3SSA9IG1Ub3BFbnRyeSAhPSBudWxsID8gaSArIDEgOiBpOworICAgICAgICAgICAgaWYgKHZpZXdJIDwgbnVtVmlld3MpIHsKKyAgICAgICAgICAgICAgICBWaWV3IHYgPSBtQ29udGFpbmVyLmdldENoaWxkQXQodmlld0kpOworICAgICAgICAgICAgICAgIE9iamVjdCB0YWcgPSB2LmdldFRhZygpOworICAgICAgICAgICAgICAgIGlmICh0YWcgIT0gYnNlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB2aWV3STsgaiA8IG51bVZpZXdzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250YWluZXIucmVtb3ZlVmlld0F0KHZpZXdJKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBudW1WaWV3cyA9IHZpZXdJOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWV3SSA+PSBudW1WaWV3cykgeworICAgICAgICAgICAgICAgIFZpZXcgaXRlbSA9IG1JbmZsYXRlci5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuZnJhZ21lbnRfYnJlYWRfY3J1bWJfaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBUZXh0VmlldyB0ZXh0ID0gKFRleHRWaWV3KWl0ZW0uZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGl0bGUpOworICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dChic2UuZ2V0QnJlYWRDcnVtYlRpdGxlKCkpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGFnKGJzZSk7CisgICAgICAgICAgICAgICAgaWYgKHZpZXdJID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRDb21wb3VuZERyYXdhYmxlcyhudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbnRhaW5lci5hZGRWaWV3KGl0ZW0pOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0T25DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCB2aWV3SSA9IG1Ub3BFbnRyeSAhPSBudWxsID8gbnVtRW50cmllcyArIDEgOiBudW1FbnRyaWVzOworICAgICAgICBudW1WaWV3cyA9IG1Db250YWluZXIuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICB3aGlsZSAobnVtVmlld3MgPiB2aWV3SSkgeworICAgICAgICAgICAgbUNvbnRhaW5lci5yZW1vdmVWaWV3QXQobnVtVmlld3MtMSk7CisgICAgICAgICAgICBudW1WaWV3cy0tOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBpZiAodi5nZXRUYWcoKSBpbnN0YW5jZW9mIEJhY2tTdGFja0VudHJ5KSB7CisgICAgICAgICAgICAgICAgQmFja1N0YWNrRW50cnkgYnNlID0gKEJhY2tTdGFja0VudHJ5KSB2LmdldFRhZygpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKS5wb3BCYWNrU3RhY2soYnNlLmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBic2UgPT0gbVRvcEVudHJ5PyBGcmFnbWVudE1hbmFnZXIuUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFIDogMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTcyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxNDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9ySW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB7QGxpbmsgRnJhZ21lbnR9IG9iamVjdHMgaW5zaWRlIG9mIGFuCisgKiB7QGxpbmsgQWN0aXZpdHl9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRnJhZ21lbnRNYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRhdGlvbiBvZiBhbiBlbnRyeSBvbiB0aGUgZnJhZ21lbnQgYmFjayBzdGFjaywgYXMgY3JlYXRlZAorICAgICAqIHdpdGgge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jYWRkVG9CYWNrU3RhY2soU3RyaW5nKQorICAgICAqIEZyYWdtZW50VHJhbnNhY3Rpb24uYWRkVG9CYWNrU3RhY2soKX0uICBFbnRyaWVzIGNhbiBsYXRlciBiZQorICAgICAqIHJldHJpZXZlZCB3aXRoIHtAbGluayBGcmFnbWVudE1hbmFnZXIjZ2V0QmFja1N0YWNrRW50cnkoaW50KQorICAgICAqIEZyYWdtZW50TWFuYWdlci5nZXRCYWNrU3RhY2tFbnRyeSgpfS4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIGhvbGQgb24gdG8gYSBCYWNrU3RhY2tFbnRyeSBvYmplY3Q7CisgICAgICogdGhlIGlkZW50aWZpZXIgYXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRJZH0gaXMgdGhlIG9ubHkgdGhpbmcgdGhhdAorICAgICAqIHdpbGwgYmUgcGVyc2lzdGVkIGFjcm9zcyBhY3Rpdml0eSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBCYWNrU3RhY2tFbnRyeSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW50cnkuICBUaGlzIGlzIHRoZSBvbmx5CisgICAgICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbnRyeSB0aGF0IHdpbGwgcGVyc2lzdCBhY3Jvc3MgYWN0aXZpdHkKKyAgICAgICAgICogaW5zdGFuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGZ1bGwgYnJlYWQgY3J1bWIgdGl0bGUgZm9yIHRoZSBlbnRyeSwgb3IgbnVsbCBpZiBpdAorICAgICAgICAgKiBkb2VzIG5vdCBoYXZlIG9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QnJlYWRDcnVtYlRpdGxlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgc2hvcnQgYnJlYWQgY3J1bWIgdGl0bGUgZm9yIHRoZSBlbnRyeSwgb3IgbnVsbCBpZiBpdAorICAgICAgICAgKiBkb2VzIG5vdCBoYXZlIG9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QnJlYWRDcnVtYlNob3J0VGl0bGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gd2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGJhY2sgc3RhY2suCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBiYWNrIHN0YWNrIGNoYW5nZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQmFja1N0YWNrQ2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgc2VyaWVzIG9mIGVkaXQgb3BlcmF0aW9ucyBvbiB0aGUgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgRnJhZ21lbnRNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIG9wZW5UcmFuc2FjdGlvbigpOworCisgICAgLyoqCisgICAgICogRmluZHMgYSBmcmFnbWVudCB0aGF0IHdhcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBpZCBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHRoZSBjb250YWluZXIgSUQgd2hlbiBhZGRlZCBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBmaXJzdAorICAgICAqIHNlYXJjaGVzIHRocm91Z2ggZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgbWFuYWdlcidzCisgICAgICogYWN0aXZpdHk7IGlmIG5vIHN1Y2ggZnJhZ21lbnQgaXMgZm91bmQsIHRoZW4gYWxsIGZyYWdtZW50cyBjdXJyZW50bHkKKyAgICAgKiBvbiB0aGUgYmFjayBzdGFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBhcmUgc2VhcmNoZWQuCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgaWYgZm91bmQgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5SWQoaW50IGlkKTsKKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gdGFnIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgc3VwcGxpZWQgd2hlbiBhZGRlZCBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBmaXJzdAorICAgICAqIHNlYXJjaGVzIHRocm91Z2ggZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgbWFuYWdlcidzCisgICAgICogYWN0aXZpdHk7IGlmIG5vIHN1Y2ggZnJhZ21lbnQgaXMgZm91bmQsIHRoZW4gYWxsIGZyYWdtZW50cyBjdXJyZW50bHkKKyAgICAgKiBvbiB0aGUgYmFjayBzdGFjayBhcmUgc2VhcmNoZWQuCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgaWYgZm91bmQgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyB0YWcpOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNwb3BCYWNrU3RhY2soU3RyaW5nLCBpbnQpfQorICAgICAqIGFuZCB7QGxpbmsgI3BvcEJhY2tTdGFjayhpbnQsIGludCl9OiBJZiBzZXQsIGFuZCB0aGUgbmFtZSBvciBJRCBvZgorICAgICAqIGEgYmFjayBzdGFjayBlbnRyeSBoYXMgYmVlbiBzdXBwbGllZCwgdGhlbiBhbGwgbWF0Y2hpbmcgZW50cmllcyB3aWxsCisgICAgICogYmUgY29uc3VtZWQgdW50aWwgb25lIHRoYXQgZG9lc24ndCBtYXRjaCBpcyBmb3VuZCBvciB0aGUgYm90dG9tIG9mCisgICAgICogdGhlIHN0YWNrIGlzIHJlYWNoZWQuICBPdGhlcndpc2UsIGFsbCBlbnRyaWVzIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoYXQgZW50cnkKKyAgICAgKiB3aWxsIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFID0gMTw8MDsKKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgdG9wIHN0YXRlIG9mZiB0aGUgYmFjayBzdGFjay4gIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgb25lCisgICAgICogdG8gcG9wLCBlbHNlIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjaygpOworCisgICAgLyoqCisgICAgICogUG9wIHRoZSBsYXN0IGZyYWdtZW50IHRyYW5zaXRpb24gZnJvbSB0aGUgbWFuYWdlcidzIGZyYWdtZW50CisgICAgICogYmFjayBzdGFjay4gIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gcG9wLCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gbmFtZSBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgbmFtZSBvZiBhIHByZXZpb3VzIGJhY2sgc3RhdGUKKyAgICAgKiB0byBsb29rIGZvcjsgaWYgZm91bmQsIGFsbCBzdGF0ZXMgdXAgdG8gdGhhdCBzdGF0ZSB3aWxsIGJlIHBvcHBlZC4gIFRoZQorICAgICAqIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAqIHRoZSBuYW1lZCBzdGF0ZSBpdHNlbGYgaXMgcG9wcGVkLiBJZiBudWxsLCBvbmx5IHRoZSB0b3Agc3RhdGUgaXMgcG9wcGVkLgorICAgICAqIEBwYXJhbSBmbGFncyBFaXRoZXIgMCBvciB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKFN0cmluZyBuYW1lLCBpbnQgZmxhZ3MpOworCisgICAgLyoqCisgICAgICogUG9wIGFsbCBiYWNrIHN0YWNrIHN0YXRlcyB1cCB0byB0aGUgb25lIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXIuCisgICAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIHN0YXRlZCB0byBiZSBwb3BwZWQuIElmIG5vIGlkZW50aWZpZXIgZXhpc3RzLAorICAgICAqIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIFRoZSBpZGVudGlmaWVyIGlzIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNjb21taXQoKSBGcmFnbWVudFRyYW5zYWN0aW9uLmNvbW1pdCgpfS4gIFRoZQorICAgICAqIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAqIHRoZSBuYW1lZCBzdGF0ZSBpdHNlbGYgaXMgcG9wcGVkLgorICAgICAqIEBwYXJhbSBmbGFncyBFaXRoZXIgMCBvciB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKGludCBpZCwgaW50IGZsYWdzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY3VycmVudGx5IGluIHRoZSBiYWNrIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY291bnRCYWNrU3RhY2tFbnRyaWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEJhY2tTdGFja0VudHJ5IGF0IGluZGV4IDx2YXI+aW5kZXg8L3Zhcj4gaW4gdGhlIGJhY2sgc3RhY2s7CisgICAgICogZW50cmllcyBzdGFydCBpbmRleCAwIGJlaW5nIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBCYWNrU3RhY2tFbnRyeSBnZXRCYWNrU3RhY2tFbnRyeShpbnQgaW5kZXgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIHRoZSBmcmFnbWVudCBiYWNrIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyKE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgYWRkZWQgd2l0aAorICAgICAqIHtAbGluayAjYWRkT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIoT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lcihPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBQdXQgYSByZWZlcmVuY2UgdG8gYSBmcmFnbWVudCBpbiBhIEJ1bmRsZS4gIFRoaXMgQnVuZGxlIGNhbiBiZQorICAgICAqIHBlcnNpc3RlZCBhcyBzYXZlZCBzdGF0ZSwgYW5kIHdoZW4gbGF0ZXIgcmVzdG9yaW5nCisgICAgICoge0BsaW5rICNnZXRGcmFnbWVudChCdW5kbGUsIFN0cmluZyl9IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgICogaW5zdGFuY2Ugb2YgdGhlIHNhbWUgZnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgaW4gd2hpY2ggdG8gcHV0IHRoZSBmcmFnbWVudCByZWZlcmVuY2UuCisgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgZW50cnkgaW4gdGhlIGJ1bmRsZS4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIEZyYWdtZW50IHdob3NlIHJlZmVyZW5jZSBpcyB0byBiZSBzdG9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSwgRnJhZ21lbnQgZnJhZ21lbnQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgRnJhZ21lbnQgaW5zdGFuY2UgZm9yIGEgcmVmZXJlbmNlIHByZXZpb3VzbHkKKyAgICAgKiBwbGFjZWQgd2l0aCB7QGxpbmsgI3B1dEZyYWdtZW50KEJ1bmRsZSwgU3RyaW5nLCBGcmFnbWVudCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGZyYWdtZW50IHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgYnVuZGxlLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCBGcmFnbWVudCBpbnN0YW5jZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBnaXZlbiByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpOworCisgICAgLyoqCisgICAgICogUHJpbnQgdGhlIEZyYWdtZW50TWFuYWdlcidzIHN0YXRlIGludG8gdGhlIGdpdmVuIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggVGV4dCB0byBwcmludCBhdCB0aGUgZnJvbnQgb2YgZWFjaCBsaW5lLgorICAgICAqIEBwYXJhbSBmZCBUaGUgcmF3IGZpbGUgZGVzY3JpcHRvciB0aGF0IHRoZSBkdW1wIGlzIGJlaW5nIHNlbnQgdG8uCisgICAgICogQHBhcmFtIHdyaXRlciBBIFByaW50V3JpdGVyIHRvIHdoaWNoIHRoZSBkdW1wIGlzIHRvIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gYXJncyBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgZHVtcCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCwgRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nW10gYXJncyk7Cit9CisKK2ZpbmFsIGNsYXNzIEZyYWdtZW50TWFuYWdlclN0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgRnJhZ21lbnRTdGF0ZVtdIG1BY3RpdmU7CisgICAgaW50W10gbUFkZGVkOworICAgIEJhY2tTdGFja1N0YXRlW10gbUJhY2tTdGFjazsKKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUFjdGl2ZSA9IGluLmNyZWF0ZVR5cGVkQXJyYXkoRnJhZ21lbnRTdGF0ZS5DUkVBVE9SKTsKKyAgICAgICAgbUFkZGVkID0gaW4uY3JlYXRlSW50QXJyYXkoKTsKKyAgICAgICAgbUJhY2tTdGFjayA9IGluLmNyZWF0ZVR5cGVkQXJyYXkoQmFja1N0YWNrU3RhdGUuQ1JFQVRPUik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZEFycmF5KG1BY3RpdmUsIGZsYWdzKTsKKyAgICAgICAgZGVzdC53cml0ZUludEFycmF5KG1BZGRlZCk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZEFycmF5KG1CYWNrU3RhY2ssIGZsYWdzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRNYW5hZ2VyU3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudE1hbmFnZXJTdGF0ZT4oKSB7CisgICAgICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZShpbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50TWFuYWdlclN0YXRlW3NpemVdOworICAgICAgICB9CisgICAgfTsKK30KKworLyoqCisgKiBDb250YWluZXIgZm9yIGZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gYWN0aXZpdHkuCisgKi8KK2ZpbmFsIGNsYXNzIEZyYWdtZW50TWFuYWdlckltcGwgaW1wbGVtZW50cyBGcmFnbWVudE1hbmFnZXIgeworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGcmFnbWVudE1hbmFnZXIiOworICAgIAorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1JFUVVFU1RfQ09ERV9TVEFURV9UQUcgPSAiYW5kcm9pZDp0YXJnZXRfcmVxX3N0YXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9TVEFURV9UQUcgPSAiYW5kcm9pZDp0YXJnZXRfc3RhdGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19TVEFURV9UQUcgPSAiYW5kcm9pZDp2aWV3X3N0YXRlIjsKKworICAgIEFycmF5TGlzdDxSdW5uYWJsZT4gbVBlbmRpbmdBY3Rpb25zOworICAgIFJ1bm5hYmxlW10gbVRtcEFjdGlvbnM7CisgICAgYm9vbGVhbiBtRXhlY3V0aW5nQWN0aW9uczsKKyAgICAKKyAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IG1BY3RpdmU7CisgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBtQWRkZWQ7CisgICAgQXJyYXlMaXN0PEludGVnZXI+IG1BdmFpbEluZGljZXM7CisgICAgQXJyYXlMaXN0PEJhY2tTdGFja1JlY29yZD4gbUJhY2tTdGFjazsKKyAgICAKKyAgICAvLyBNdXN0IGJlIGFjY2Vzc2VkIHdoaWxlIGxvY2tlZC4KKyAgICBBcnJheUxpc3Q8QmFja1N0YWNrUmVjb3JkPiBtQmFja1N0YWNrSW5kaWNlczsKKyAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbUF2YWlsQmFja1N0YWNrSW5kaWNlczsKKworICAgIEFycmF5TGlzdDxPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lcj4gbUJhY2tTdGFja0NoYW5nZUxpc3RlbmVyczsKKworICAgIGludCBtQ3VyU3RhdGUgPSBGcmFnbWVudC5JTklUSUFMSVpJTkc7CisgICAgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIAorICAgIGJvb2xlYW4gbU5lZWRNZW51SW52YWxpZGF0ZTsKKyAgICBib29sZWFuIG1TdGF0ZVNhdmVkOworICAgIAorICAgIC8vIFRlbXBvcmFyeSB2YXJzIGZvciBzdGF0ZSBzYXZlIGFuZCByZXN0b3JlLgorICAgIEJ1bmRsZSBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TdGF0ZUFycmF5ID0gbnVsbDsKKyAgICAKKyAgICBSdW5uYWJsZSBtRXhlY0NvbW1pdCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIG9wZW5UcmFuc2FjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tSZWNvcmQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKCkgeworICAgICAgICByZXR1cm4gcG9wQmFja1N0YWNrU3RhdGUobUFjdGl2aXR5Lm1IYW5kbGVyLCBudWxsLCAtMSwgMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKFN0cmluZyBuYW1lLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHBvcEJhY2tTdGFja1N0YXRlKG1BY3Rpdml0eS5tSGFuZGxlciwgbmFtZSwgLTEsIGZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGlkOiAiICsgaWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3BCYWNrU3RhY2tTdGF0ZShtQWN0aXZpdHkubUhhbmRsZXIsIG51bGwsIGlkLCBmbGFncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb3VudEJhY2tTdGFja0VudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBtQmFja1N0YWNrICE9IG51bGwgPyBtQmFja1N0YWNrLnNpemUoKSA6IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJhY2tTdGFja0VudHJ5IGdldEJhY2tTdGFja0VudHJ5KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbUJhY2tTdGFjay5nZXQoaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyKE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtQmFja1N0YWNrQ2hhbmdlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2tDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyPigpOworICAgICAgICB9CisgICAgICAgIG1CYWNrU3RhY2tDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lcihPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUJhY2tTdGFja0NoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwdXRGcmFnbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5LCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUluZGV4IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGZyYWdtZW50CisgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBGcmFnbWVudE1hbmFnZXIiKTsKKyAgICAgICAgfQorICAgICAgICBidW5kbGUucHV0SW50KGtleSwgZnJhZ21lbnQubUluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRnJhZ21lbnQgZ2V0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSkgeworICAgICAgICBpbnQgaW5kZXggPSBidW5kbGUuZ2V0SW50KGtleSwgLTEpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleCA+PSBtQWN0aXZlLnNpemUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ2VtZW50IG5vIGxvbmdlciBleGlzdHMgZm9yIGtleSAiCisgICAgICAgICAgICAgICAgICAgICsga2V5ICsgIjogaW5kZXggIiArIGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaW5kZXgpOworICAgICAgICBpZiAoZiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnZW1lbnQgbm8gbG9uZ2VyIGV4aXN0cyBmb3Iga2V5ICIKKyAgICAgICAgICAgICAgICAgICAgKyBrZXkgKyAiOiBpbmRleCAiICsgaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCwgRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsIHx8IG1BY3RpdmUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnRsbigiQWN0aXZlIEZyYWdtZW50czoiKTsKKworICAgICAgICBTdHJpbmcgaW5uZXJQcmVmaXggPSBwcmVmaXggKyAiICAgICI7CisKKyAgICAgICAgaW50IE4gPSBtQWN0aXZlLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIiAgIyIpOyB3cml0ZXIucHJpbnQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjogIik7IHdyaXRlci5wcmludGxuKGYudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZi5kdW1wKGlubmVyUHJlZml4LCBmZCwgd3JpdGVyLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgTiA9IG1BZGRlZC5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50bG4oIkFkZGVkIEZyYWdtZW50czoiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50KCIgICMiKTsgd3JpdGVyLnByaW50KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiOiAiKTsgd3JpdGVyLnByaW50bG4oZi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobUJhY2tTdGFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBOID0gbUJhY2tTdGFjay5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50bG4oIkJhY2sgU3RhY2s6Iik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBCYWNrU3RhY2tSZWNvcmQgYnMgPSBtQmFja1N0YWNrLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgiICAjIik7IHdyaXRlci5wcmludChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjogIik7IHdyaXRlci5wcmludGxuKGJzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFuaW1hdG9yIGxvYWRBbmltYXRvcihGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXQsIGJvb2xlYW4gZW50ZXIsCisgICAgICAgICAgICBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIEFuaW1hdG9yIGFuaW1PYmogPSBmcmFnbWVudC5vbkNyZWF0ZUFuaW1hdG9yKHRyYW5zaXQsIGVudGVyLAorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgIGlmIChhbmltT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmltT2JqOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZnJhZ21lbnQubU5leHRBbmltICE9IDApIHsKKyAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBBbmltYXRvckluZmxhdGVyLmxvYWRBbmltYXRvcihtQWN0aXZpdHksIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuaW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh0cmFuc2l0ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgc3R5bGVJbmRleCA9IHRyYW5zaXRUb1N0eWxlSW5kZXgodHJhbnNpdCwgZW50ZXIpOworICAgICAgICBpZiAoc3R5bGVJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDAgJiYgbUFjdGl2aXR5LmdldFdpbmRvdygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSA9IG1BY3Rpdml0eS5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2luZG93QW5pbWF0aW9uczsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGF0dHJzID0gbUFjdGl2aXR5Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXModHJhbnNpdGlvblN0eWxlLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uKTsKKyAgICAgICAgaW50IGFuaW0gPSBhdHRycy5nZXRSZXNvdXJjZUlkKHN0eWxlSW5kZXgsIDApOworICAgICAgICBhdHRycy5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoYW5pbSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIEFuaW1hdG9ySW5mbGF0ZXIubG9hZEFuaW1hdG9yKG1BY3Rpdml0eSwgYW5pbSk7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoRnJhZ21lbnQgZiwgaW50IG5ld1N0YXRlLCBpbnQgdHJhbnNpdCwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICAvLyBGcmFnbWVudHMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBhZGRlZCB3aWxsIHNpdCBpbiB0aGUgb25DcmVhdGUoKSBzdGF0ZS4KKyAgICAgICAgaWYgKCFmLm1BZGRlZCAmJiBuZXdTdGF0ZSA+IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgIG5ld1N0YXRlID0gRnJhZ21lbnQuQ1JFQVRFRDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGYubVN0YXRlIDwgbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZi5tU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LklOSVRJQUxJWklORzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gQ1JFQVRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gZi5tU2F2ZWRGcmFnbWVudFN0YXRlLmdldFNwYXJzZVBhcmNlbGFibGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5WSUVXX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXQgPSBnZXRGcmFnbWVudChmLm1TYXZlZEZyYWdtZW50U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVEFSR0VUX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXRSZXF1ZXN0Q29kZSA9IGYubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlRBUkdFVF9SRVFVRVNUX0NPREVfU1RBVEVfVEFHLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1BY3Rpdml0eSA9IG1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGYub25BdHRhY2gobUFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uQXR0YWNoKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHkub25BdHRhY2hGcmFnbWVudChmKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICghZi5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25DcmVhdGUoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uQ3JlYXRlKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1SZXRhaW5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubUZyb21MYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBmcmFnbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgY29udGVudCB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQsIHdlIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlIHZpZXcgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgaW5mbGF0ZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRkaW5nIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IGYub25DcmVhdGVWaWV3KG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcuc2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tSGlkZGVuKSBmLm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA+IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tRnJvbUxheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cCBjb250YWluZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1Db250YWluZXJJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IChWaWV3R3JvdXApbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChmLm1Db250YWluZXJJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdmlldyBmb3VuZCBmb3IgaWQgMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhmLm1Db250YWluZXJJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBmcmFnbWVudCAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBmLm9uQ3JlYXRlVmlldyhtQWN0aXZpdHkuZ2V0TGF5b3V0SW5mbGF0ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcuc2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gbG9hZEFuaW1hdG9yKGYsIHRyYW5zaXQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zZXRUYXJnZXQoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tSGlkZGVuKSBmLm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25BY3Rpdml0eUNyZWF0ZWQoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUmVhZHkoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uU3RhcnQoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5TVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVJlc3VtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25SZXN1bWUoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZi5tU3RhdGUgPiBuZXdTdGF0ZSkgeworICAgICAgICAgICAgc3dpdGNoIChmLm1TdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuUkVTVU1FRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuUkVTVU1FRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25QYXVzZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LlNUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LlNUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLnBlcmZvcm1TdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0b3AoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHNhdmUgdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSBpZiBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lIGFscmVhZHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZpdHkuaXNGaW5pc2hpbmcoKSAmJiBmLm1TYXZlZFZpZXdTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25EZXN0cm95VmlldygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95ZWRWaWV3KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwgJiYgZi5tQ29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1clN0YXRlID4gRnJhZ21lbnQuSU5JVElBTElaSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0gPSBsb2FkQW5pbWF0b3IoZiwgdHJhbnNpdCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgY29udGFpbmVyID0gZi5tQ29udGFpbmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBmLm1WaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuc3RhcnRWaWV3VHJhbnNpdGlvbih2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZW5kVmlld1RyYW5zaXRpb24odmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnNldFRhcmdldChmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNvbnRhaW5lci5yZW1vdmVWaWV3KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ29udGFpbmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENSRUFURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGVzdHJveSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25EZXRhY2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGV0YWNoKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmLm1TdGF0ZSA9IG5ld1N0YXRlOworICAgIH0KKyAgICAKKyAgICB2b2lkIG1vdmVUb1N0YXRlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoZiwgbUN1clN0YXRlLCAwLCAwKTsKKyAgICB9CisKKyAgICB2b2lkIG1vdmVUb1N0YXRlKGludCBuZXdTdGF0ZSwgYm9vbGVhbiBhbHdheXMpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUobmV3U3RhdGUsIDAsIDAsIGFsd2F5cyk7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoaW50IG5ld1N0YXRlLCBpbnQgdHJhbnNpdCwgaW50IHRyYW5zaXRTdHlsZSwgYm9vbGVhbiBhbHdheXMpIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eSA9PSBudWxsICYmIG5ld1N0YXRlICE9IEZyYWdtZW50LklOSVRJQUxJWklORykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWN0aXZpdHkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFhbHdheXMgJiYgbUN1clN0YXRlID09IG5ld1N0YXRlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1DdXJTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFjdGl2ZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1vdmVUb1N0YXRlKGYsIG5ld1N0YXRlLCB0cmFuc2l0LCB0cmFuc2l0U3R5bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1OZWVkTWVudUludmFsaWRhdGUgJiYgbUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkuaW52YWxpZGF0ZU9wdGlvbnNNZW51KCk7CisgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgbWFrZUFjdGl2ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwgfHwgbUF2YWlsSW5kaWNlcy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3RpdmUgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZi5zZXRJbmRleChtQWN0aXZlLnNpemUoKSk7CisgICAgICAgICAgICBtQWN0aXZlLmFkZChmKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5zZXRJbmRleChtQXZhaWxJbmRpY2VzLnJlbW92ZShtQXZhaWxJbmRpY2VzLnNpemUoKS0xKSk7CisgICAgICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBtYWtlSW5hY3RpdmUoRnJhZ21lbnQgZikgeworICAgICAgICBpZiAoZi5tSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRnJlZWluZyBmcmFnbWVudCBpbmRleCAiICsgZi5tSW5kZXgpOworICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgbnVsbCk7CisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BdmFpbEluZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUF2YWlsSW5kaWNlcy5hZGQoZi5tSW5kZXgpOworICAgICAgICBtQWN0aXZpdHkuaW52YWxpZGF0ZUZyYWdtZW50SW5kZXgoZi5tSW5kZXgpOworICAgICAgICBmLmNsZWFySW5kZXgoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGJvb2xlYW4gbW92ZVRvU3RhdGVOb3cpIHsKKyAgICAgICAgaWYgKG1BZGRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWRkZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICB9CisgICAgICAgIG1BZGRlZC5hZGQoZnJhZ21lbnQpOworICAgICAgICBtYWtlQWN0aXZlKGZyYWdtZW50KTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJhZGQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGZyYWdtZW50Lm1BZGRlZCA9IHRydWU7CisgICAgICAgIGlmIChmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vdmVUb1N0YXRlTm93KSB7CisgICAgICAgICAgICBtb3ZlVG9TdGF0ZShmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0aW9uLCBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVtb3ZlOiAiICsgZnJhZ21lbnQgKyAiIG5lc3Rpbmc9IiArIGZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgbUFkZGVkLnJlbW92ZShmcmFnbWVudCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5hY3RpdmUgPSBmcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyA8PSAwOworICAgICAgICBpZiAoZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1BZGRlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShmcmFnbWVudCwgaW5hY3RpdmUgPyBGcmFnbWVudC5JTklUSUFMSVpJTkcgOiBGcmFnbWVudC5DUkVBVEVELAorICAgICAgICAgICAgICAgIHRyYW5zaXRpb24sIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgIGlmIChpbmFjdGl2ZSkgeworICAgICAgICAgICAgbWFrZUluYWN0aXZlKGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBoaWRlRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0aW9uLCBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiaGlkZTogIiArIGZyYWdtZW50KTsKKyAgICAgICAgaWYgKCFmcmFnbWVudC5tSGlkZGVuKSB7CisgICAgICAgICAgICBmcmFnbWVudC5tSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQW5pbWF0b3IgYW5pbSA9IGxvYWRBbmltYXRvcihmcmFnbWVudCwgdHJhbnNpdGlvbiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbmltLnNldFRhcmdldChmcmFnbWVudC5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1BZGRlZCAmJiBmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQub25IaWRkZW5DaGFuZ2VkKHRydWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNob3dGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXRpb24sIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzaG93OiAiICsgZnJhZ21lbnQpOworICAgICAgICBpZiAoZnJhZ21lbnQubUhpZGRlbikgeworICAgICAgICAgICAgZnJhZ21lbnQubUhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gbG9hZEFuaW1hdG9yKGZyYWdtZW50LCB0cmFuc2l0aW9uLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGZyYWdtZW50Lm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUFkZGVkICYmIGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5vbkhpZGRlbkNoYW5nZWQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeUlkKGludCBpZCkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdCBsb29rIHRocm91Z2ggYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWRkZWQuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tRnJhZ21lbnRJZCA9PSBpZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3cgZm9yIGFueSBrbm93biBmcmFnbWVudC4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFjdGl2ZS5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tRnJhZ21lbnRJZCA9PSBpZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcgdGFnKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwgJiYgdGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGxvb2sgdGhyb3VnaCBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BZGRlZC5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiB0YWcuZXF1YWxzKGYubVRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm93IGZvciBhbnkga25vd24gZnJhZ21lbnQuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BY3RpdmUuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIHRhZy5lcXVhbHMoZi5tVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVdobyhTdHJpbmcgd2hvKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwgJiYgd2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFjdGl2ZS5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgd2hvLmVxdWFscyhmLm1XaG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZW5xdWV1ZUFjdGlvbihSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgaWYgKG1TdGF0ZVNhdmVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCBwZXJmb3JtIHRoaXMgYWN0aW9uIGFmdGVyIG9uU2F2ZUluc3RhbmNlU3RhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0FjdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UnVubmFibGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0FjdGlvbnMuYWRkKGFjdGlvbik7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdBY3Rpb25zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtRXhlY0NvbW1pdCk7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnBvc3QobUV4ZWNDb21taXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgYWxsb2NCYWNrU3RhY2tJbmRleChCYWNrU3RhY2tSZWNvcmQgYnNlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1BdmFpbEJhY2tTdGFja0luZGljZXMgPT0gbnVsbCB8fCBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CYWNrU3RhY2tJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja1JlY29yZD4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUJhY2tTdGFja0luZGljZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU2V0dGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgdG8gIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuYWRkKGJzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1BdmFpbEJhY2tTdGFja0luZGljZXMucmVtb3ZlKG1BdmFpbEJhY2tTdGFja0luZGljZXMuc2l6ZSgpLTEpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4ICsgIiB3aXRoICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLnNldChpbmRleCwgYnNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrU3RhY2tJbmRleChpbnQgaW5kZXgsIEJhY2tTdGFja1JlY29yZCBic2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobUJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tSZWNvcmQ+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgTiA9IG1CYWNrU3RhY2tJbmRpY2VzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IE4pIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlNldHRpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXggKyAiIHRvICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLnNldChpbmRleCwgYnNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKE4gPCBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgYXZhaWxhYmxlIGJhY2sgc3RhY2sgaW5kZXggIiArIE4pOworICAgICAgICAgICAgICAgICAgICBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLmFkZChOKTsKKyAgICAgICAgICAgICAgICAgICAgTisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgd2l0aCAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5hZGQoYnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZyZWVCYWNrU3RhY2tJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5zZXQoaW5kZXgsIG51bGwpOworICAgICAgICAgICAgaWYgKG1BdmFpbEJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkZyZWVpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXgpOworICAgICAgICAgICAgbUF2YWlsQmFja1N0YWNrSW5kaWNlcy5hZGQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT25seSBjYWxsIGZyb20gbWFpbiB0aHJlYWQhCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY1BlbmRpbmdBY3Rpb25zKCkgeworICAgICAgICBpZiAobUV4ZWN1dGluZ0FjdGlvbnMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlY3Vyc2l2ZSBlbnRyeSB0byBleGVjUGVuZGluZ0FjdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBudW1BY3Rpb25zOworICAgICAgICAgICAgCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdBY3Rpb25zID09IG51bGwgfHwgbVBlbmRpbmdBY3Rpb25zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbnVtQWN0aW9ucyA9IG1QZW5kaW5nQWN0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKG1UbXBBY3Rpb25zID09IG51bGwgfHwgbVRtcEFjdGlvbnMubGVuZ3RoIDwgbnVtQWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICBtVG1wQWN0aW9ucyA9IG5ldyBSdW5uYWJsZVtudW1BY3Rpb25zXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBY3Rpb25zLnRvQXJyYXkobVRtcEFjdGlvbnMpOworICAgICAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUV4ZWNDb21taXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBtRXhlY3V0aW5nQWN0aW9ucyA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtQWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVRtcEFjdGlvbnNbaV0ucnVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXhlY3V0aW5nQWN0aW9ucyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgcmVwb3J0QmFja1N0YWNrQ2hhbmdlZCgpIHsKKyAgICAgICAgaWYgKG1CYWNrU3RhY2tDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1CYWNrU3RhY2tDaGFuZ2VMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrQ2hhbmdlTGlzdGVuZXJzLmdldChpKS5vbkJhY2tTdGFja0NoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYWRkQmFja1N0YWNrU3RhdGUoQmFja1N0YWNrUmVjb3JkIHN0YXRlKSB7CisgICAgICAgIGlmIChtQmFja1N0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2sgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja1JlY29yZD4oKTsKKyAgICAgICAgfQorICAgICAgICBtQmFja1N0YWNrLmFkZChzdGF0ZSk7CisgICAgICAgIHJlcG9ydEJhY2tTdGFja0NoYW5nZWQoKTsKKyAgICB9CisgICAgCisgICAgYm9vbGVhbiBwb3BCYWNrU3RhY2tTdGF0ZShIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBuYW1lLCBpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBpZiAobUJhY2tTdGFjayA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiBpZCA8IDAgJiYgKGZsYWdzJkFjdGl2aXR5LlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSkgPT0gMCkgeworICAgICAgICAgICAgaW50IGxhc3QgPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgaWYgKGxhc3QgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQmFja1N0YWNrUmVjb3JkIGJzcyA9IG1CYWNrU3RhY2sucmVtb3ZlKGxhc3QpOworICAgICAgICAgICAgZW5xdWV1ZUFjdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlBvcHBpbmcgYmFjayBzdGFjayBzdGF0ZTogIiArIGJzcyk7CisgICAgICAgICAgICAgICAgICAgIGJzcy5wb3BGcm9tQmFja1N0YWNrKHRydWUpOworICAgICAgICAgICAgICAgICAgICByZXBvcnRCYWNrU3RhY2tDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgfHwgaWQgPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIGEgbmFtZSBvciBJRCBpcyBzcGVjaWZpZWQsIGxvb2sgZm9yIHRoYXQgcGxhY2UgaW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2suCisgICAgICAgICAgICAgICAgaW5kZXggPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEJhY2tTdGFja1JlY29yZCBic3MgPSBtQmFja1N0YWNrLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoYnNzLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwICYmIGlkID09IGJzcy5tSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzJkFjdGl2aXR5LlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lIGFsbCBmb2xsb3dpbmcgZW50cmllcyB0aGF0IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQmFja1N0YWNrUmVjb3JkIGJzcyA9IG1CYWNrU3RhY2suZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmFtZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzKGJzcy5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaWQgPj0gMCAmJiBpZCA9PSBic3MubUluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBtQmFja1N0YWNrLnNpemUoKS0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEJhY2tTdGFja1JlY29yZD4gc3RhdGVzCisgICAgICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tSZWNvcmQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpPW1CYWNrU3RhY2suc2l6ZSgpLTE7IGk+aW5kZXg7IGktLSkgeworICAgICAgICAgICAgICAgIHN0YXRlcy5hZGQobUJhY2tTdGFjay5yZW1vdmUoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5xdWV1ZUFjdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTEFTVCA9IHN0YXRlcy5zaXplKCktMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPD1MQVNUOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUG9wcGluZyBiYWNrIHN0YWNrIHN0YXRlOiAiICsgc3RhdGVzLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuZ2V0KGkpLnBvcEZyb21CYWNrU3RhY2soaSA9PSBMQVNUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXBvcnRCYWNrU3RhY2tDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxGcmFnbWVudD4gcmV0YWluTm9uQ29uZmlnKCkgeworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50cyA9IG51bGw7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWN0aXZlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tUmV0YWluSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGQoZik7CisgICAgICAgICAgICAgICAgICAgIGYubVJldGFpbmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFnbWVudHM7CisgICAgfQorICAgIAorICAgIHZvaWQgc2F2ZUZyYWdtZW50Vmlld1N0YXRlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgaWYgKGYubVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGVBcnJheSA9PSBudWxsKSB7CisgICAgICAgICAgICBtU3RhdGVBcnJheSA9IG5ldyBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPigpOworICAgICAgICB9CisgICAgICAgIGYubVZpZXcuc2F2ZUhpZXJhcmNoeVN0YXRlKG1TdGF0ZUFycmF5KTsKKyAgICAgICAgaWYgKG1TdGF0ZUFycmF5LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gbVN0YXRlQXJyYXk7CisgICAgICAgICAgICBtU3RhdGVBcnJheSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgUGFyY2VsYWJsZSBzYXZlQWxsU3RhdGUoKSB7CisgICAgICAgIG1TdGF0ZVNhdmVkID0gdHJ1ZTsKKworICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsIHx8IG1BY3RpdmUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCBjb2xsZWN0IGFsbCBhY3RpdmUgZnJhZ21lbnRzLgorICAgICAgICBpbnQgTiA9IG1BY3RpdmUuc2l6ZSgpOworICAgICAgICBGcmFnbWVudFN0YXRlW10gYWN0aXZlID0gbmV3IEZyYWdtZW50U3RhdGVbTl07CisgICAgICAgIGJvb2xlYW4gaGF2ZUZyYWdtZW50cyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGF2ZUZyYWdtZW50cyA9IHRydWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IG5ldyBGcmFnbWVudFN0YXRlKGYpOworICAgICAgICAgICAgICAgIGFjdGl2ZVtpXSA9IGZzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChmLm1TdGF0ZSA+IEZyYWdtZW50LklOSVRJQUxJWklORyAmJiBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZUJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5vblNhdmVJbnN0YW5jZVN0YXRlKG1TdGF0ZUJ1bmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YXRlQnVuZGxlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG1TdGF0ZUJ1bmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1bmRsZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlRnJhZ21lbnRWaWV3U3RhdGUoZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tU2F2ZWRWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5wdXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlZJRVdfU1RBVEVfVEFHLCBmLm1TYXZlZFZpZXdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHV0RnJhZ21lbnQoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5UQVJHRVRfU1RBVEVfVEFHLCBmLm1UYXJnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVRhcmdldFJlcXVlc3RDb2RlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlLnB1dEludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVEFSR0VUX1JFUVVFU1RfQ09ERV9TVEFURV9UQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXRSZXF1ZXN0Q29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPSBmLm1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU2F2ZWQgc3RhdGUgb2YgIiArIGYgKyAiOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWhhdmVGcmFnbWVudHMpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2F2ZUFsbFN0YXRlOiBubyBmcmFnbWVudHMhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50W10gYWRkZWQgPSBudWxsOworICAgICAgICBCYWNrU3RhY2tTdGF0ZVtdIGJhY2tTdGFjayA9IG51bGw7CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCBsaXN0IG9mIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgIGlmIChtQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgTiA9IG1BZGRlZC5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRlZCA9IG5ldyBpbnRbTl07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhZGRlZFtpXSA9IG1BZGRlZC5nZXQoaSkubUluZGV4OworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNhdmVBbGxTdGF0ZTogYWRkaW5nIGZyYWdtZW50ICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIG1BZGRlZC5nZXQoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTm93IHNhdmUgYmFjayBzdGFjay4KKyAgICAgICAgaWYgKG1CYWNrU3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgTiA9IG1CYWNrU3RhY2suc2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgYmFja1N0YWNrID0gbmV3IEJhY2tTdGFja1N0YXRlW05dOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja1N0YWNrW2ldID0gbmV3IEJhY2tTdGFja1N0YXRlKHRoaXMsIG1CYWNrU3RhY2suZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzYXZlQWxsU3RhdGU6IGFkZGluZyBiYWNrIHN0YWNrICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIG1CYWNrU3RhY2suZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEZyYWdtZW50TWFuYWdlclN0YXRlIGZtcyA9IG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZSgpOworICAgICAgICBmbXMubUFjdGl2ZSA9IGFjdGl2ZTsKKyAgICAgICAgZm1zLm1BZGRlZCA9IGFkZGVkOworICAgICAgICBmbXMubUJhY2tTdGFjayA9IGJhY2tTdGFjazsKKyAgICAgICAgcmV0dXJuIGZtczsKKyAgICB9CisgICAgCisgICAgdm9pZCByZXN0b3JlQWxsU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSwgQXJyYXlMaXN0PEZyYWdtZW50PiBub25Db25maWcpIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gc2F2ZWQgc3RhdGUgYXQgYWxsLCB0aGVuIHRoZXJlIGNhbiBub3QgYmUKKyAgICAgICAgLy8gYW55IG5vbkNvbmZpZyBmcmFnbWVudHMgZWl0aGVyLCBzbyB0aGF0IGlzIHRoYXQuCisgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIEZyYWdtZW50TWFuYWdlclN0YXRlIGZtcyA9IChGcmFnbWVudE1hbmFnZXJTdGF0ZSlzdGF0ZTsKKyAgICAgICAgaWYgKGZtcy5tQWN0aXZlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIC8vIEZpcnN0IHJlLWF0dGFjaCBhbnkgbm9uLWNvbmZpZyBpbnN0YW5jZXMgd2UgYXJlIHJldGFpbmluZyBiYWNrCisgICAgICAgIC8vIHRvIHRoZWlyIHNhdmVkIHN0YXRlLCBzbyB3ZSBkb24ndCB0cnkgdG8gaW5zdGFudGlhdGUgdGhlbSBhZ2Fpbi4KKyAgICAgICAgaWYgKG5vbkNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bm9uQ29uZmlnLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG5vbkNvbmZpZy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IHJlLWF0dGFjaGluZyByZXRhaW5lZCAiICsgZik7CisgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IGZtcy5tQWN0aXZlW2YubUluZGV4XTsKKyAgICAgICAgICAgICAgICBmcy5tSW5zdGFuY2UgPSBmOworICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nID0gMDsKKyAgICAgICAgICAgICAgICBmLm1JbkxheW91dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGYubUFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IGZzLm1TYXZlZEZyYWdtZW50U3RhdGUuZ2V0U3BhcnNlUGFyY2VsYWJsZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGZ1bGwgbGlzdCBvZiBhY3RpdmUgZnJhZ21lbnRzLCBpbnN0YW50aWF0aW5nIHRoZW0gZnJvbQorICAgICAgICAvLyB0aGVpciBzYXZlZCBzdGF0ZS4KKyAgICAgICAgbUFjdGl2ZSA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KGZtcy5tQWN0aXZlLmxlbmd0aCk7CisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BdmFpbEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTA7IGk8Zm1zLm1BY3RpdmUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBmbXMubUFjdGl2ZVtpXTsKKyAgICAgICAgICAgIGlmIChmcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IGZzLmluc3RhbnRpYXRlKG1BY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IGFkZGluZyAjIiArIGkgKyAiOiAiICsgZik7CisgICAgICAgICAgICAgICAgbUFjdGl2ZS5hZGQoZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgIyIgKyBpICsgIjogKG51bGwpIik7CisgICAgICAgICAgICAgICAgbUFjdGl2ZS5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQXZhaWxJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogYWRkaW5nIGF2YWlsICMiICsgaSk7CisgICAgICAgICAgICAgICAgbUF2YWlsSW5kaWNlcy5hZGQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGFyZ2V0IG9mIGFsbCByZXRhaW5lZCBmcmFnbWVudHMuCisgICAgICAgIGlmIChub25Db25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5vbkNvbmZpZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBub25Db25maWcuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0Lm1JbmRleCA8IG1BY3RpdmUuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXQgPSBtQWN0aXZlLmdldChmLm1UYXJnZXQubUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlLWF0dGFjaGluZyByZXRhaW5lZCBmcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFyZ2V0IG5vIGxvbmdlciBleGlzdHM6ICIgKyBmLm1UYXJnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ1aWxkIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgIGlmIChmbXMubUFkZGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KGZtcy5tQWRkZWQubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUFkZGVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGZtcy5tQWRkZWRbaV0pOworICAgICAgICAgICAgICAgIGlmIChmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gaW5zdGFudGlhdGVkIGZyYWdtZW50IGZvciBpbmRleCAjIiArIGZtcy5tQWRkZWRbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmLm1BZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IG1ha2luZyBhZGRlZCAjIiArIGkgKyAiOiAiICsgZik7CisgICAgICAgICAgICAgICAgbUFkZGVkLmFkZChmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEJ1aWxkIHRoZSBiYWNrIHN0YWNrLgorICAgICAgICBpZiAoZm1zLm1CYWNrU3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUJhY2tTdGFjayA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrUmVjb3JkPihmbXMubUJhY2tTdGFjay5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQmFja1N0YWNrLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQmFja1N0YWNrUmVjb3JkIGJzZSA9IGZtcy5tQmFja1N0YWNrW2ldLmluc3RhbnRpYXRlKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgYnNlICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIChpbmRleCAiICsgYnNlLm1JbmRleCArICIpOiAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrLmFkZChic2UpOworICAgICAgICAgICAgICAgIGlmIChic2UubUluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QmFja1N0YWNrSW5kZXgoYnNlLm1JbmRleCwgYnNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhdHRhY2hBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBpZiAobUFjdGl2aXR5ICE9IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKCkgeworICAgICAgICBtU3RhdGVTYXZlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQWN0aXZpdHlDcmVhdGVkKCkgeworICAgICAgICBtU3RhdGVTYXZlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU3RhcnQoKSB7CisgICAgICAgIG1TdGF0ZVNhdmVkID0gZmFsc2U7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlNUQVJURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hSZXN1bWUoKSB7CisgICAgICAgIG1TdGF0ZVNhdmVkID0gZmFsc2U7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlJFU1VNRUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQYXVzZSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuU1RBUlRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFN0b3AoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEZXN0cm95KCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5JTklUSUFMSVpJTkcsIGZhbHNlKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICBib29sZWFuIHNob3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIHNob3cgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSwgaW5mbGF0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hQcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIGJvb2xlYW4gc2hvdyA9IGZhbHNlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGYub25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzaG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaE9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQoTWVudSBtZW51KSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBmLm9uT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHJldmVyc2VUcmFuc2l0KGludCB0cmFuc2l0KSB7CisgICAgICAgIGludCByZXYgPSAwOworICAgICAgICBzd2l0Y2ggKHRyYW5zaXQpIHsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU46CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX0NMT1NFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfQ0xPU0U6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9ORVhUOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9QUkVWOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfUFJFVjoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfTkVYVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV2OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBpbnQgdHJhbnNpdFRvU3R5bGVJbmRleChpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlcikgeworICAgICAgICBpbnQgYW5pbUF0dHIgPSAtMTsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0KSB7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9PUEVOOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudE9wZW5FbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50T3BlbkV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9DTE9TRToKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRBbmltYXRpb25fZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRBbmltYXRpb25fZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9ORVhUOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudE5leHRFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50TmV4dEV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9QUkVWOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudFByZXZFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50UHJldkV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuaW1BdHRyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudFRyYW5zYWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRUcmFuc2FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDQ3NmJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpAQCAtMCwwICsxLDE4NiBAQAorcGFja2FnZSBhbmRyb2lkLmFwcDsKKworLyoqCisgKiBBUEkgZm9yIHBlcmZvcm1pbmcgYSBzZXQgb2YgRnJhZ21lbnQgb3BlcmF0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBGcmFnbWVudFRyYW5zYWN0aW9uIHsKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgMCBjb250YWluZXJWaWV3SWQuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmcmFnbWVudCB0byB0aGUgYWN0aXZpdHkgc3RhdGUuICBUaGlzIGZyYWdtZW50IG1heSBvcHRpb25hbGx5CisgICAgICogYWxzbyBoYXZlIGl0cyB2aWV3IChpZiB7QGxpbmsgRnJhZ21lbnQjb25DcmVhdGVWaWV3IEZyYWdtZW50Lm9uQ3JlYXRlVmlld30KKyAgICAgKiByZXR1cm5zIG5vbi1udWxsKSBpbnRvIGEgY29udGFpbmVyIHZpZXcgb2YgdGhlIGFjdGl2aXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgT3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHRoaXMgZnJhZ21lbnQgaXMKKyAgICAgKiB0byBiZSBwbGFjZWQgaW4uICBJZiAwLCBpdCB3aWxsIG5vdCBiZSBwbGFjZWQgaW4gYSBjb250YWluZXIuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSBhZGRlZC4gIFRoaXMgZnJhZ21lbnQgbXVzdCBub3QgYWxyZWFkeQorICAgICAqIGJlIGFkZGVkIHRvIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gdGFnIE9wdGlvbmFsIHRhZyBuYW1lIGZvciB0aGUgZnJhZ21lbnQsIHRvIGxhdGVyIHJldHJpZXZlIHRoZQorICAgICAqIGZyYWdtZW50IHdpdGgge0BsaW5rIEFjdGl2aXR5I2ZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZykKKyAgICAgKiBBY3Rpdml0eS5maW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayAjcmVwbGFjZShpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogUmVwbGFjZSBhbiBleGlzdGluZyBmcmFnbWVudCB0aGF0IHdhcyBhZGRlZCB0byBhIGNvbnRhaW5lci4gIFRoaXMgaXMKKyAgICAgKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjYWxsaW5nIHtAbGluayAjcmVtb3ZlKEZyYWdtZW50KX0gZm9yIGFsbAorICAgICAqIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMgdGhhdCB3ZXJlIGFkZGVkIHdpdGggdGhlIHNhbWUgY29udGFpbmVyVmlld0lkCisgICAgICogYW5kIHRoZW4ge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBnaXZlbiBoZXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgSWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHdob3NlIGZyYWdtZW50KHMpIGFyZQorICAgICAqIHRvIGJlIHJlcGxhY2VkLgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgbmV3IGZyYWdtZW50IHRvIHBsYWNlIGluIHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHRhZyBPcHRpb25hbCB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LCB0byBsYXRlciByZXRyaWV2ZSB0aGUKKyAgICAgKiBmcmFnbWVudCB3aXRoIHtAbGluayBBY3Rpdml0eSNmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpCisgICAgICogQWN0aXZpdHkuZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKX0uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZyk7CisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgSWYgaXQgd2FzIGFkZGVkIHRvIGEgY29udGFpbmVyLCBpdHMgdmlldworICAgICAqIGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoYXQgY29udGFpbmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZW1vdmUoRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIEhpZGVzIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBoaWRlKEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlcyBhIHByZXZpb3VzbHkgaGlkZGVuIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIHNob3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2hvdyhGcmFnbWVudCBmcmFnbWVudCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgbm8gb3BlcmF0aW9ucywKKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayB0aGF0IGlzIHNldCBmb3IgYWxsIGVudGVyIHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9FTlRFUl9NQVNLID0gMHgxMDAwOworICAgIAorICAgIC8qKgorICAgICAqIEJpdCBtYXNrIHRoYXQgaXMgc2V0IGZvciBhbGwgZXhpdCB0cmFuc2l0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRVhJVF9NQVNLID0gMHgyMDAwOworICAgIAorICAgIC8qKiBOb3Qgc2V0IHVwIGZvciBhIHRyYW5zaXRpb24uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1VOU0VUID0gLTE7CisgICAgLyoqIE5vIGFuaW1hdGlvbiBmb3IgdHJhbnNpdGlvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfTk9ORSA9IDA7CisgICAgLyoqIEZyYWdtZW50IGlzIGJlaW5nIGFkZGVkIG9udG8gdGhlIHN0YWNrICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0ZSQUdNRU5UX09QRU4gPSAxIHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBGcmFnbWVudCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIHN0YWNrICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0ZSQUdNRU5UX0NMT1NFID0gMiB8IFRSQU5TSVRfRVhJVF9NQVNLOworICAgIC8qKiBGcmFnbWVudCBpcyBiZWluZyBhZGRlZCBpbiBhICduZXh0JyBvcGVyYXRpb24qLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9GUkFHTUVOVF9ORVhUID0gMyB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogRnJhZ21lbnQgaXMgYmVpbmcgcmVtb3ZlZCBpbiBhICdwcmV2aW91cycgb3BlcmF0aW9uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0ZSQUdNRU5UX1BSRVYgPSA0IHwgVFJBTlNJVF9FWElUX01BU0s7CisKKyAgICAvKioKKyAgICAgKiBTZXQgc3BlY2lmaWMgYW5pbWF0aW9uIHJlc291cmNlcyB0byBydW4gZm9yIHRoZSBmcmFnbWVudHMgdGhhdCBhcmUKKyAgICAgKiBlbnRlcmluZyBhbmQgZXhpdGluZyBpbiB0aGlzIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEN1c3RvbUFuaW1hdGlvbnMoaW50IGVudGVyLCBpbnQgZXhpdCk7CisgICAgCisgICAgLyoqCisgICAgICogU2VsZWN0IGEgc3RhbmRhcmQgdHJhbnNpdGlvbiBhbmltYXRpb24gZm9yIHRoaXMgdHJhbnNhY3Rpb24uICBNYXkgYmUKKyAgICAgKiBvbmUgb2Yge0BsaW5rICNUUkFOU0lUX05PTkV9LCB7QGxpbmsgI1RSQU5TSVRfRlJBR01FTlRfT1BFTn0sCisgICAgICogb3Ige0BsaW5rICNUUkFOU0lUX0ZSQUdNRU5UX0NMT1NFfQorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb24oaW50IHRyYW5zaXQpOworCisgICAgLyoqCisgICAgICogU2V0IGEgY3VzdG9tIHN0eWxlIHJlc291cmNlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciByZXNvbHZpbmcgdHJhbnNpdAorICAgICAqIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvblN0eWxlKGludCBzdHlsZVJlcyk7CisgICAgCisgICAgLyoqCisgICAgICogQWRkIHRoaXMgdHJhbnNhY3Rpb24gdG8gdGhlIGJhY2sgc3RhY2suICBUaGlzIG1lYW5zIHRoYXQgdGhlIHRyYW5zYWN0aW9uCisgICAgICogd2lsbCBiZSByZW1lbWJlcmVkIGFmdGVyIGl0IGlzIGNvbW1pdHRlZCwgYW5kIHdpbGwgcmV2ZXJzZSBpdHMgb3BlcmF0aW9uCisgICAgICogd2hlbiBsYXRlciBwb3BwZWQgb2ZmIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoaXMgYmFjayBzdGFjayBzdGF0ZSwgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGRUb0JhY2tTdGFjayhTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZ1bGwgdGl0bGUgdG8gc2hvdyBhcyBhIGJyZWFkIGNydW1iIHdoZW4gdGhpcyB0cmFuc2FjdGlvbgorICAgICAqIGlzIG9uIHRoZSBiYWNrIHN0YWNrLCBhcyB1c2VkIGJ5IHtAbGluayBGcmFnbWVudEJyZWFkQ3J1bWJzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXMgQSBzdHJpbmcgcmVzb3VyY2UgY29udGFpbmluZyB0aGUgdGl0bGUuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0QnJlYWRDcnVtYlRpdGxlKGludCByZXMpOworCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI3NldEJyZWFkQ3J1bWJUaXRsZShpbnQpfSBidXQgdGFraW5nIGEgcmF3IHN0cmluZzsgdGhpcworICAgICAqIG1ldGhvZCBpcyA8ZW0+bm90PC9lbT4gcmVjb21tZW5kZWQsIGFzIHRoZSBzdHJpbmcgY2FuIG5vdCBiZSBjaGFuZ2VkCisgICAgICogbGF0ZXIgaWYgdGhlIGxvY2FsZSBjaGFuZ2VzLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEJyZWFkQ3J1bWJUaXRsZShDaGFyU2VxdWVuY2UgdGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNob3J0IHRpdGxlIHRvIHNob3cgYXMgYSBicmVhZCBjcnVtYiB3aGVuIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAgKiBpcyBvbiB0aGUgYmFjayBzdGFjaywgYXMgdXNlZCBieSB7QGxpbmsgRnJhZ21lbnRCcmVhZENydW1ic30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzIEEgc3RyaW5nIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIHRpdGxlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEJyZWFkQ3J1bWJTaG9ydFRpdGxlKGludCByZXMpOworCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI3NldEJyZWFkQ3J1bWJTaG9ydFRpdGxlKGludCl9IGJ1dCB0YWtpbmcgYSByYXcgc3RyaW5nOyB0aGlzCisgICAgICogbWV0aG9kIGlzIDxlbT5ub3Q8L2VtPiByZWNvbW1lbmRlZCwgYXMgdGhlIHN0cmluZyBjYW4gbm90IGJlIGNoYW5nZWQKKyAgICAgKiBsYXRlciBpZiB0aGUgbG9jYWxlIGNoYW5nZXMuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0QnJlYWRDcnVtYlNob3J0VGl0bGUoQ2hhclNlcXVlbmNlIHRleHQpOworCisgICAgLyoqCisgICAgICogU2NoZWR1bGVzIGEgY29tbWl0IG9mIHRoaXMgdHJhbnNhY3Rpb24uICBOb3RlIHRoYXQgdGhlIGNvbW1pdCBkb2VzCisgICAgICogbm90IGhhcHBlbiBpbW1lZGlhdGVseTsgaXQgd2lsbCBiZSBzY2hlZHVsZWQgYXMgd29yayBvbiB0aGUgbWFpbiB0aHJlYWQKKyAgICAgKiB0byBiZSBkb25lIHRoZSBuZXh0IHRpbWUgdGhhdCB0aHJlYWQgaXMgcmVhZHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyB0cmFuc2FjdGlvbidzIGJhY2sgc3RhY2sgZW50cnksCisgICAgICogaWYge0BsaW5rICNhZGRUb0JhY2tTdGFjayhTdHJpbmcpfSBoYWQgYmVlbiBjYWxsZWQuICBPdGhlcndpc2UsIHJldHVybnMKKyAgICAgKiBhIG5lZ2F0aXZlIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbW1pdCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggODNkNDIyZS4uYzlkNTQ0OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0zMTAsNiArMzEwLDEwIEBACiAgICAgCiAgICAgcHVibGljIHZvaWQgZmluaXNoSGVhdnlXZWlnaHRBcHAoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCisgICAgcHVibGljIHZvaWQgc2V0SW1tZXJzaXZlKElCaW5kZXIgdG9rZW4sIGJvb2xlYW4gaW1tZXJzaXZlKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tZXJzaXZlKElCaW5kZXIgdG9rZW4pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgcHVibGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgCiAgICAgcHVibGljIHZvaWQgY3Jhc2hBcHBsaWNhdGlvbihpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKQEAgLTMyMSw2ICszMjUsMTMgQEAKICAgICBwdWJsaWMgdm9pZCByZXZva2VVcmlQZXJtaXNzaW9uRnJvbU93bmVyKElCaW5kZXIgb3duZXIsIFVyaSB1cmksCiAgICAgICAgICAgICBpbnQgbW9kZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAorICAgIHB1YmxpYyBpbnQgY2hlY2tHcmFudFVyaVBlcm1pc3Npb24oaW50IGNhbGxpbmdVaWQsIFN0cmluZyB0YXJnZXRQa2csCisgICAgICAgICAgICBVcmkgdXJpLCBpbnQgbW9kZUZsYWdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisgICAgLy8gQ2F1c2UgdGhlIHNwZWNpZmllZCBwcm9jZXNzIHRvIGR1bXAgdGhlIHNwZWNpZmllZCBoZWFwLgorICAgIHB1YmxpYyBib29sZWFuIGR1bXBIZWFwKFN0cmluZyBwcm9jZXNzLCBib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLAorICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKwogICAgIC8qCiAgICAgICogUHJpdmF0ZSBub24tQmluZGVyIGludGVyZmFjZXMKICAgICAgKi8KQEAgLTUzMSw0ICs1NDIsNiBAQAogICAgIGludCBORVdfVVJJX1BFUk1JU1NJT05fT1dORVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE1OwogICAgIGludCBHUkFOVF9VUklfUEVSTUlTU0lPTl9GUk9NX09XTkVSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzExNjsKICAgICBpbnQgUkVWT0tFX1VSSV9QRVJNSVNTSU9OX0ZST01fT1dORVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE3OworICAgIGludCBDSEVDS19HUkFOVF9VUklfUEVSTUlTU0lPTl9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMTg7CisgICAgaW50IERVTVBfSEVBUF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMTk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKaW5kZXggYzhlZjE3Zi4uMWY4YTdjNTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKQEAgLTk3LDEzICs5NywxNyBAQAogICAgIHZvaWQgc2NoZWR1bGVBY3Rpdml0eUNvbmZpZ3VyYXRpb25DaGFuZ2VkKElCaW5kZXIgdG9rZW4pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBwcm9maWxlckNvbnRyb2woYm9vbGVhbiBzdGFydCwgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICB2b2lkIGR1bXBIZWFwKGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICB2b2lkIHNldFNjaGVkdWxpbmdHcm91cChpbnQgZ3JvdXApIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBnZXRNZW1vcnlJbmZvKERlYnVnLk1lbW9yeUluZm8gb3V0SW5mbykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0VfUkVNT1ZFRCA9IDA7CiAgICAgc3RhdGljIGZpbmFsIGludCBFWFRFUk5BTF9TVE9SQUdFX1VOQVZBSUxBQkxFID0gMTsKICAgICB2b2lkIGRpc3BhdGNoUGFja2FnZUJyb2FkY2FzdChpbnQgY21kLCBTdHJpbmdbXSBwYWNrYWdlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICB2b2lkIHNjaGVkdWxlQ3Jhc2goU3RyaW5nIG1zZykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLSAgICAKKyAgICB2b2lkIGR1bXBBY3Rpdml0eShGaWxlRGVzY3JpcHRvciBmZCwgSUJpbmRlciBzZXJ2aWNldG9rZW4sIFN0cmluZ1tdIGFyZ3MpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCiAgICAgU3RyaW5nIGRlc2NyaXB0b3IgPSAiYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkIjsKIAogICAgIGludCBTQ0hFRFVMRV9QQVVTRV9BQ1RJVklUWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTjsKQEAgLTE0MCw0ICsxNDQsNiBAQAogICAgIGludCBTQ0hFRFVMRV9TVUlDSURFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzMyOwogICAgIGludCBESVNQQVRDSF9QQUNLQUdFX0JST0FEQ0FTVF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszMzsKICAgICBpbnQgU0NIRURVTEVfQ1JBU0hfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMzQ7CisgICAgaW50IERVTVBfSEVBUF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszNTsKKyAgICBpbnQgRFVNUF9BQ1RJVklUWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszNjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQppbmRleCBiOGMzYWEzLi40ZDVmMzZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCkBAIC05OTcsOCArOTk3LDEwIEBACiAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpY2xhenoubmV3SW5zdGFuY2UoKTsKICAgICAgICAgQWN0aXZpdHlUaHJlYWQgYVRocmVhZCA9IG51bGw7Ci0gICAgICAgIGFjdGl2aXR5LmF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCB0aGlzLCB0b2tlbiwgYXBwbGljYXRpb24sIGludGVudCwgaW5mbywgdGl0bGUsCi0gICAgICAgICAgICAgICAgcGFyZW50LCBpZCwgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgbmV3IENvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgIGFjdGl2aXR5LmF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCB0aGlzLCB0b2tlbiwgYXBwbGljYXRpb24sIGludGVudCwKKyAgICAgICAgICAgICAgICBpbmZvLCB0aXRsZSwgcGFyZW50LCBpZCwKKyAgICAgICAgICAgICAgICAoQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcylsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAorICAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCkpOwogICAgICAgICByZXR1cm4gYWN0aXZpdHk7CiAgICAgfQogCkBAIC0xMDU4LDIxICsxMDYwLDIzIEBACiAgICAgfQogICAgIAogICAgIHB1YmxpYyB2b2lkIGNhbGxBY3Rpdml0eU9uRGVzdHJveShBY3Rpdml0eSBhY3Rpdml0eSkgewotICAgICAgaWYgKG1XYWl0aW5nQWN0aXZpdGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewotICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XYWl0aW5nQWN0aXZpdGllcy5zaXplKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5V2FpdGVyIGF3ID0gbVdhaXRpbmdBY3Rpdml0aWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBhdy5pbnRlbnQ7Ci0gICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmZpbHRlckVxdWFscyhhY3Rpdml0eS5nZXRJbnRlbnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICBhdy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlUXVldWUuYWRkSWRsZUhhbmRsZXIobmV3IEFjdGl2aXR5R29pbmcoYXcpKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KKyAgICAgIC8vIFRPRE86IHRoZSBmb2xsb3dpbmcgYmxvY2sgY2F1c2VzIGludGVybWl0dGVudCBoYW5ncyB3aGVuIHVzaW5nIHN0YXJ0QWN0aXZpdHkKKyAgICAgIC8vIHRlbXBvcmFyaWx5IGNvbW1lbnQgb3V0IHVudGlsIHJvb3QgY2F1c2UgaXMgZml4ZWQgKGJ1ZyAyNjMwNjgzKQorLy8gICAgICBpZiAobVdhaXRpbmdBY3Rpdml0aWVzICE9IG51bGwpIHsKKy8vICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKKy8vICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XYWl0aW5nQWN0aXZpdGllcy5zaXplKCk7CisvLyAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworLy8gICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eVdhaXRlciBhdyA9IG1XYWl0aW5nQWN0aXZpdGllcy5nZXQoaSk7CisvLyAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBhdy5pbnRlbnQ7CisvLyAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZmlsdGVyRXF1YWxzKGFjdGl2aXR5LmdldEludGVudCgpKSkgeworLy8gICAgICAgICAgICAgICAgICAgICAgYXcuYWN0aXZpdHkgPSBhY3Rpdml0eTsKKy8vICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlUXVldWUuYWRkSWRsZUhhbmRsZXIobmV3IEFjdGl2aXR5R29pbmcoYXcpKTsKKy8vICAgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgIH0KKy8vICAgICAgICAgIH0KKy8vICAgICAgfQogICAgICAgCi0gICAgICBhY3Rpdml0eS5vbkRlc3Ryb3koKTsKKyAgICAgIGFjdGl2aXR5LnBlcmZvcm1EZXN0cm95KCk7CiAgICAgICAKICAgICAgIGlmIChtQWN0aXZpdHlNb25pdG9ycyAhPSBudWxsKSB7CiAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewpAQCAtMTMzMSw3ICsxMzM1LDcgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzdGFydGVkLgogICAgICAqIEBwYXJhbSB0b2tlbiBJbnRlcm5hbCB0b2tlbiBpZGVudGlmeWluZyB0byB0aGUgc3lzdGVtIHdobyBpcyBzdGFydGluZyAKICAgICAgKiAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5OyBtYXkgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGFjdGl2aXR5IGlzIHBlcmZvcm0gdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCisgICAgICogQHBhcmFtIHRhcmdldCBXaGljaCBhY3Rpdml0eSBpcyBwZXJmb3JtaW5nIHRoZSBzdGFydCAoYW5kIHRodXMgcmVjZWl2aW5nIAogICAgICAqICAgICAgICAgICAgICAgYW55IHJlc3VsdCk7IG1heSBiZSBudWxsIGlmIHRoaXMgY2FsbCBpcyBub3QgYmVpbmcgbWFkZQogICAgICAqICAgICAgICAgICAgICAgZnJvbSBhbiBhY3Rpdml0eS4KICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IHRvIHN0YXJ0LgpAQCAtMTM4MSw2ICsxMzg1LDY0IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNleGVjU3RhcnRBY3Rpdml0eShDb250ZXh0LCBJQmluZGVyLCBJQmluZGVyLCBBY3Rpdml0eSwgSW50ZW50LCBpbnQpfSwKKyAgICAgKiBidXQgZm9yIGNhbGxzIGZyb20gYSB7I2xpbmsgRnJhZ21lbnR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aG8gVGhlIENvbnRleHQgZnJvbSB3aGljaCB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dFRocmVhZCBUaGUgbWFpbiB0aHJlYWQgb2YgdGhlIENvbnRleHQgZnJvbSB3aGljaCB0aGUgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzdGFydGVkLgorICAgICAqIEBwYXJhbSB0b2tlbiBJbnRlcm5hbCB0b2tlbiBpZGVudGlmeWluZyB0byB0aGUgc3lzdGVtIHdobyBpcyBzdGFydGluZyAKKyAgICAgKiAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5OyBtYXkgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGZyYWdtZW50IGlzIHBlcmZvcm1pbmcgdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCisgICAgICogICAgICAgICAgICAgICBhbnkgcmVzdWx0KS4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IHRvIHN0YXJ0LgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29kZSBJZGVudGlmaWVyIGZvciB0aGlzIHJlcXVlc3QncyByZXN1bHQ7IGxlc3MgdGhhbiB6ZXJvIAorICAgICAqICAgICAgICAgICAgICAgICAgICBpZiB0aGUgY2FsbGVyIGlzIG5vdCBleHBlY3RpbmcgYSByZXN1bHQuCisgICAgICogCisgICAgICogQHJldHVybiBUbyBmb3JjZSB0aGUgcmV0dXJuIG9mIGEgcGFydGljdWxhciByZXN1bHQsIHJldHVybiBhbiAKKyAgICAgKiAgICAgICAgIEFjdGl2aXR5UmVzdWx0IG9iamVjdCBjb250YWluaW5nIHRoZSBkZXNpcmVkIGRhdGE7IG90aGVyd2lzZQorICAgICAqICAgICAgICAgcmV0dXJuIG51bGwuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyBudWxsLgorICAgICAqICAKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCkKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5RnJvbUNoaWxkCisgICAgICogCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpdml0eVJlc3VsdCBleGVjU3RhcnRBY3Rpdml0eSgKKyAgICAgICAgQ29udGV4dCB3aG8sIElCaW5kZXIgY29udGV4dFRocmVhZCwgSUJpbmRlciB0b2tlbiwgRnJhZ21lbnQgdGFyZ2V0LAorICAgICAgICBJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgSUFwcGxpY2F0aW9uVGhyZWFkIHdob1RocmVhZCA9IChJQXBwbGljYXRpb25UaHJlYWQpIGNvbnRleHRUaHJlYWQ7CisgICAgICAgIGlmIChtQWN0aXZpdHlNb25pdG9ycyAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWN0aXZpdHlNb25pdG9ycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1vbml0b3IgYW0gPSBtQWN0aXZpdHlNb25pdG9ycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbS5tYXRjaCh3aG8sIG51bGwsIGludGVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFtLm1IaXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW0uaXNCbG9ja2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RDb2RlID49IDAgPyBhbS5nZXRSZXN1bHQoKSA6IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAuc3RhcnRBY3Rpdml0eSh3aG9UaHJlYWQsIGludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5yZXNvbHZlVHlwZUlmTmVlZGVkKHdoby5nZXRDb250ZW50UmVzb2x2ZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAwLCB0b2tlbiwgdGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQubVdobyA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29kZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGNoZWNrU3RhcnRBY3Rpdml0eVJlc3VsdChyZXN1bHQsIGludGVudCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgLypwYWNrYWdlKi8gZmluYWwgdm9pZCBpbml0KEFjdGl2aXR5VGhyZWFkIHRocmVhZCwKICAgICAgICAgICAgIENvbnRleHQgaW5zdHJDb250ZXh0LCBDb250ZXh0IGFwcENvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50LCAKICAgICAgICAgICAgIElJbnN0cnVtZW50YXRpb25XYXRjaGVyIHdhdGNoZXIpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YQppbmRleCA0YmY1NTE4Li5kNDk5NjhmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEFjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhCkBAIC0zMDksNyArMzA5LDcgQEAKICAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X2NvbnRlbnQpOworICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X2NvbnRlbnRfc2ltcGxlKTsKIAogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmY0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgbGlzdCBvZiBpdGVtcyBieSBiaW5kaW5nIHRvIGEgZGF0YSBzb3VyY2Ugc3VjaCBhcworICogYW4gYXJyYXkgb3IgQ3Vyc29yLCBhbmQgZXhwb3NlcyBldmVudCBoYW5kbGVycyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbS4KKyAqIDxwPgorICogTGlzdEZyYWdtZW50IGhvc3RzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IExpc3RWaWV3fSBvYmplY3QgdGhhdCBjYW4KKyAqIGJlIGJvdW5kIHRvIGRpZmZlcmVudCBkYXRhIHNvdXJjZXMsIHR5cGljYWxseSBlaXRoZXIgYW4gYXJyYXkgb3IgYSBDdXJzb3IKKyAqIGhvbGRpbmcgcXVlcnkgcmVzdWx0cy4gQmluZGluZywgc2NyZWVuIGxheW91dCwgYW5kIHJvdyBsYXlvdXQgYXJlIGRpc2N1c3NlZAorICogaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KKyAqIDxwPgorICogPHN0cm9uZz5TY3JlZW4gTGF5b3V0PC9zdHJvbmc+CisgKiA8L3A+CisgKiA8cD4KKyAqIExpc3RGcmFnbWVudCBoYXMgYSBkZWZhdWx0IGxheW91dCB0aGF0IGNvbnNpc3RzIG9mIGEgc2luZ2xlIGxpc3Qgdmlldy4KKyAqIEhvd2V2ZXIsIGlmIHlvdSBkZXNpcmUsIHlvdSBjYW4gY3VzdG9taXplIHRoZSBmcmFnbWVudCBsYXlvdXQgYnkgcmV0dXJuaW5nCisgKiB5b3VyIG93biB2aWV3IGhpZXJhcmNoeSBmcm9tIHtAbGluayAjb25DcmVhdGVWaWV3fS4KKyAqIFRvIGRvIHRoaXMsIHlvdXIgdmlldyBoaWVyYXJjaHkgPGVtPm11c3Q8L2VtPiBjb250YWluIGEgTGlzdFZpZXcgb2JqZWN0IHdpdGggdGhlCisgKiBpZCAiQGFuZHJvaWQ6aWQvbGlzdCIgKG9yIHtAbGluayBhbmRyb2lkLlIuaWQjbGlzdH0gaWYgaXQncyBpbiBjb2RlKQorICogPHA+CisgKiBPcHRpb25hbGx5LCB5b3VyIHZpZXcgaGllcmFyY2h5IGNhbiBjb250YWluIGFub3RoZXIgdmlldyBvYmplY3Qgb2YgYW55IHR5cGUgdG8KKyAqIGRpc3BsYXkgd2hlbiB0aGUgbGlzdCB2aWV3IGlzIGVtcHR5LiBUaGlzICJlbXB0eSBsaXN0IiBub3RpZmllciBtdXN0IGhhdmUgYW4KKyAqIGlkICJhbmRyb2lkOmVtcHR5Ii4gTm90ZSB0aGF0IHdoZW4gYW4gZW1wdHkgdmlldyBpcyBwcmVzZW50LCB0aGUgbGlzdCB2aWV3CisgKiB3aWxsIGJlIGhpZGRlbiB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgdG8gZGlzcGxheS4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBjb2RlIGRlbW9uc3RyYXRlcyBhbiAodWdseSkgY3VzdG9tIGxpc3QgbGF5b3V0LiBJdCBoYXMgYSBsaXN0CisgKiB3aXRoIGEgZ3JlZW4gYmFja2dyb3VuZCwgYW5kIGFuIGFsdGVybmF0ZSByZWQgIm5vIGRhdGEiIG1lc3NhZ2UuCisgKiA8L3A+CisgKgorICogPHByZT4KKyAqICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7PyZndDsKKyAqICZsdDtMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSZxdW90O3ZlcnRpY2FsJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9JnF1b3Q7OGRwJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSZxdW90OzhkcCZxdW90OyZndDsKKyAqCisgKiAgICAgJmx0O0xpc3RWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QGlkL2FuZHJvaWQ6bGlzdCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9JnF1b3Q7IzAwRkYwMCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9JnF1b3Q7MSZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QGlkL2FuZHJvaWQ6ZW1wdHkmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSZxdW90OyNGRjAwMDAmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSZxdW90O05vIGRhdGEmcXVvdDsvJmd0OworICogJmx0Oy9MaW5lYXJMYXlvdXQmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIDxzdHJvbmc+Um93IExheW91dDwvc3Ryb25nPgorICogPC9wPgorICogPHA+CisgKiBZb3UgY2FuIHNwZWNpZnkgdGhlIGxheW91dCBvZiBpbmRpdmlkdWFsIHJvd3MgaW4gdGhlIGxpc3QuIFlvdSBkbyB0aGlzIGJ5CisgKiBzcGVjaWZ5aW5nIGEgbGF5b3V0IHJlc291cmNlIGluIHRoZSBMaXN0QWRhcHRlciBvYmplY3QgaG9zdGVkIGJ5IHRoZSBmcmFnbWVudAorICogKHRoZSBMaXN0QWRhcHRlciBiaW5kcyB0aGUgTGlzdFZpZXcgdG8gdGhlIGRhdGE7IG1vcmUgb24gdGhpcyBsYXRlcikuCisgKiA8cD4KKyAqIEEgTGlzdEFkYXB0ZXIgY29uc3RydWN0b3IgdGFrZXMgYSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgYSBsYXlvdXQgcmVzb3VyY2UKKyAqIGZvciBlYWNoIHJvdy4gSXQgYWxzbyBoYXMgdHdvIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGxldCB5b3Ugc3BlY2lmeQorICogd2hpY2ggZGF0YSBmaWVsZCB0byBhc3NvY2lhdGUgd2l0aCB3aGljaCBvYmplY3QgaW4gdGhlIHJvdyBsYXlvdXQgcmVzb3VyY2UuCisgKiBUaGVzZSB0d28gcGFyYW1ldGVycyBhcmUgdHlwaWNhbGx5IHBhcmFsbGVsIGFycmF5cy4KKyAqIDwvcD4KKyAqIDxwPgorICogQW5kcm9pZCBwcm92aWRlcyBzb21lIHN0YW5kYXJkIHJvdyBsYXlvdXQgcmVzb3VyY2VzLiBUaGVzZSBhcmUgaW4gdGhlCisgKiB7QGxpbmsgYW5kcm9pZC5SLmxheW91dH0gY2xhc3MsIGFuZCBoYXZlIG5hbWVzIHN1Y2ggYXMgc2ltcGxlX2xpc3RfaXRlbV8xLAorICogc2ltcGxlX2xpc3RfaXRlbV8yLCBhbmQgdHdvX2xpbmVfbGlzdF9pdGVtLiBUaGUgZm9sbG93aW5nIGxheW91dCBYTUwgaXMgdGhlCisgKiBzb3VyY2UgZm9yIHRoZSByZXNvdXJjZSB0d29fbGluZV9saXN0X2l0ZW0sIHdoaWNoIGRpc3BsYXlzIHR3byBkYXRhCisgKiBmaWVsZHMsb25lIGFib3ZlIHRoZSBvdGhlciwgZm9yIGVhY2ggbGlzdCByb3cuCisgKiA8L3A+CisgKgorICogPHByZT4KKyAqICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7PyZndDsKKyAqICZsdDtMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsKKyAqICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSZxdW90O3ZlcnRpY2FsJnF1b3Q7Jmd0OworICoKKyAqICAgICAmbHQ7VGV4dFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAK2lkL3RleHQxJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9JnF1b3Q7MTZzcCZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0mcXVvdDtib2xkJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7d3JhcF9jb250ZW50JnF1b3Q7LyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QCtpZC90ZXh0MiZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTaXplPSZxdW90OzE2c3AmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsvJmd0OworICogJmx0Oy9MaW5lYXJMYXlvdXQmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFlvdSBtdXN0IGlkZW50aWZ5IHRoZSBkYXRhIGJvdW5kIHRvIGVhY2ggVGV4dFZpZXcgb2JqZWN0IGluIHRoaXMgbGF5b3V0LiBUaGUKKyAqIHN5bnRheCBmb3IgdGhpcyBpcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KKyAqIDwvcD4KKyAqIDxwPgorICogPHN0cm9uZz5CaW5kaW5nIHRvIERhdGE8L3N0cm9uZz4KKyAqIDwvcD4KKyAqIDxwPgorICogWW91IGJpbmQgdGhlIExpc3RGcmFnbWVudCdzIExpc3RWaWV3IG9iamVjdCB0byBkYXRhIHVzaW5nIGEgY2xhc3MgdGhhdAorICogaW1wbGVtZW50cyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIExpc3RBZGFwdGVyfSBpbnRlcmZhY2UuCisgKiBBbmRyb2lkIHByb3ZpZGVzIHR3byBzdGFuZGFyZCBsaXN0IGFkYXB0ZXJzOgorICoge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIgU2ltcGxlQWRhcHRlcn0gZm9yIHN0YXRpYyBkYXRhIChNYXBzKSwKKyAqIGFuZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlciBTaW1wbGVDdXJzb3JBZGFwdGVyfSBmb3IgQ3Vyc29yCisgKiBxdWVyeSByZXN1bHRzLgorICogPC9wPgorICogPHA+CisgKiBZb3UgPGI+bXVzdDwvYj4gdXNlCisgKiB7QGxpbmsgI3NldExpc3RBZGFwdGVyKExpc3RBZGFwdGVyKSBMaXN0RnJhZ21lbnQuc2V0TGlzdEFkYXB0ZXIoKX0gdG8KKyAqIGFzc29jaWF0ZSB0aGUgbGlzdCB3aXRoIGFuIGFkYXB0ZXIuICBEbyBub3QgZGlyZWN0bHkgY2FsbAorICoge0BsaW5rIExpc3RWaWV3I3NldEFkYXB0ZXIoTGlzdEFkYXB0ZXIpIExpc3RWaWV3LnNldEFkYXB0ZXIoKX0gb3IgZWxzZQorICogaW1wb3J0YW50IGluaXRpYWxpemF0aW9uIHdpbGwgYmUgc2tpcHBlZC4KKyAqIDwvcD4KKyAqCisgKiBAc2VlICNzZXRMaXN0QWRhcHRlcgorICogQHNlZSBhbmRyb2lkLndpZGdldC5MaXN0VmlldworICovCitwdWJsaWMgY2xhc3MgTGlzdEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgIGZpbmFsIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisKKyAgICBmaW5hbCBwcml2YXRlIFJ1bm5hYmxlIG1SZXF1ZXN0Rm9jdXMgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1MaXN0LmZvY3VzYWJsZVZpZXdBdmFpbGFibGUobUxpc3QpOworICAgICAgICB9CisgICAgfTsKKyAgICAKKyAgICBmaW5hbCBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgb25MaXN0SXRlbUNsaWNrKChMaXN0VmlldylwYXJlbnQsIHYsIHBvc2l0aW9uLCBpZCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgTGlzdFZpZXcgbUxpc3Q7CisgICAgVmlldyBtRW1wdHlWaWV3OworICAgIFRleHRWaWV3IG1TdGFuZGFyZEVtcHR5VmlldzsKKyAgICBWaWV3IG1Qcm9ncmVzc0NvbnRhaW5lcjsKKyAgICBWaWV3IG1MaXN0Q29udGFpbmVyOworICAgIGJvb2xlYW4gbVNldEVtcHR5VGV4dDsKKyAgICBib29sZWFuIG1MaXN0U2hvd247CisKKyAgICBwdWJsaWMgTGlzdEZyYWdtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYSBzaW1wbGUgbGlzdCB2aWV3LiAgU3ViY2xhc3NlcworICAgICAqIGNhbiBvdmVycmlkZSB0byByZXBsYWNlIHdpdGggdGhlaXIgb3duIGxheW91dC4gIElmIGRvaW5nIHNvLCB0aGUKKyAgICAgKiByZXR1cm5lZCB2aWV3IGhpZXJhcmNoeSA8ZW0+bXVzdDwvZW0+IGhhdmUgYSBMaXN0VmlldyB3aG9zZSBpZAorICAgICAqIGlzIHtAbGluayBhbmRyb2lkLlIuaWQjbGlzdCBhbmRyb2lkLlIuaWQubGlzdH0gYW5kIGNhbiBvcHRpb25hbGx5CisgICAgICogaGF2ZSBhIHNpYmxpbmcgdmlldyBpZCB7QGxpbmsgYW5kcm9pZC5SLmlkI2VtcHR5IGFuZHJvaWQuUi5pZC5lbXB0eX0KKyAgICAgKiB0aGF0IGlzIHRvIGJlIHNob3duIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuCisgICAgICogCisgICAgICogPHA+SWYgeW91IGFyZSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHdpdGggeW91ciBvd24gY3VzdG9tIGNvbnRlbnQsCisgICAgICogY29uc2lkZXIgaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsYXlvdXQge0BsaW5rIGFuZHJvaWQuUi5sYXlvdXQjbGlzdF9jb250ZW50fQorICAgICAqIGluIHlvdXIgbGF5b3V0IGZpbGUsIHNvIHRoYXQgeW91IGNvbnRpbnVlIHRvIHJldGFpbiBhbGwgb2YgdGhlIHN0YW5kYXJkCisgICAgICogYmVoYXZpb3Igb2YgTGlzdEZyYWdtZW50LiAgSW4gcGFydGljdWxhciwgdGhpcyBpcyBjdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgKiB3YXkgdG8gaGF2ZSB0aGUgYnVpbHQtaW4gaW5kZXRlcm1pbmFudCBwcm9ncmVzcyBzdGF0ZSBiZSBzaG93bi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudCwKKyAgICAgICAgICAgICAgICBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggdG8gbGlzdCB2aWV3IG9uY2UgRnJhZ21lbnQgaXMgcmVhZHkgdG8gcnVuLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGFjaCBmcm9tIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJlcXVlc3RGb2N1cyk7CisgICAgICAgIG1MaXN0ID0gbnVsbDsKKyAgICAgICAgc3VwZXIub25EZXN0cm95VmlldygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYW4gaXRlbSBpbiB0aGUgbGlzdCBpcyBzZWxlY3RlZC4KKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4gU3ViY2xhc3NlcyBjYW4gY2FsbAorICAgICAqIGdldExpc3RWaWV3KCkuZ2V0SXRlbUF0UG9zaXRpb24ocG9zaXRpb24pIGlmIHRoZXkgbmVlZCB0byBhY2Nlc3MgdGhlCisgICAgICogZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbCBUaGUgTGlzdFZpZXcgd2hlcmUgdGhlIGNsaWNrIGhhcHBlbmVkCisgICAgICogQHBhcmFtIHYgVGhlIHZpZXcgdGhhdCB3YXMgY2xpY2tlZCB3aXRoaW4gdGhlIExpc3RWaWV3CisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgdmlldyBpbiB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBpZCBUaGUgcm93IGlkIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNsaWNrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBjdXJzb3IgZm9yIHRoZSBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBib29sZWFuIGhhZEFkYXB0ZXIgPSBtQWRhcHRlciAhPSBudWxsOworICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICAgICAgaWYgKCFtTGlzdFNob3duICYmICFoYWRBZGFwdGVyKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGxpc3Qgd2FzIGhpZGRlbiwgYW5kIHByZXZpb3VzbHkgZGlkbid0IGhhdmUgYW4KKyAgICAgICAgICAgICAgICAvLyBhZGFwdGVyLiAgSXQgaXMgbm93IHRpbWUgdG8gc2hvdyBpdC4KKyAgICAgICAgICAgICAgICBzZXRMaXN0U2hvd24odHJ1ZSwgZ2V0VmlldygpLmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaXN0IGl0ZW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIHBvc2l0aW9uIHdpdGggdGhlIGFkYXB0ZXIncyBkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgbUxpc3Quc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJzb3Igcm93IElEIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFNlbGVjdGVkSXRlbUlkKCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWN0aXZpdHkncyBsaXN0IHZpZXcgd2lkZ2V0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY29udGVudCBmb3IgYSBMaXN0RnJhZ21lbnQgaGFzIGEgVGV4dFZpZXcgdGhhdCBjYW4KKyAgICAgKiBiZSBzaG93biB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBpdAorICAgICAqIHNob3duLCBjYWxsIHRoaXMgbWV0aG9kIHRvIHN1cHBseSB0aGUgdGV4dCBpdCBzaG91bGQgdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVtcHR5VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIGlmIChtU3RhbmRhcmRFbXB0eVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tIGNvbnRlbnQgdmlldyIpOworICAgICAgICB9CisgICAgICAgIG1TdGFuZGFyZEVtcHR5Vmlldy5zZXRUZXh0KHRleHQpOworICAgICAgICBpZiAoIW1TZXRFbXB0eVRleHQpIHsKKyAgICAgICAgICAgIG1MaXN0LnNldEVtcHR5VmlldyhtU3RhbmRhcmRFbXB0eVZpZXcpOworICAgICAgICAgICAgbVNldEVtcHR5VGV4dCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIHRoZSBsaXN0IGlzIGJlaW5nIGRpc3BsYXllZC4gIFlvdSBjYW4gbWFrZSBpdCBub3QKKyAgICAgKiBkaXNwbGF5ZWQgaWYgeW91IGFyZSB3YWl0aW5nIGZvciB0aGUgaW5pdGlhbCBkYXRhIHRvIHNob3cgaW4gaXQuICBEdXJpbmcKKyAgICAgKiB0aGlzIHRpbWUgYW4gaW5kZXRlcm1pbmFudCBwcm9ncmVzcyBpbmRpY2F0b3Igd2lsbCBiZSBzaG93biBpbnN0ZWFkLgorICAgICAqIAorICAgICAqIDxwPkFwcGxpY2F0aW9ucyBkbyBub3Qgbm9ybWFsbHkgbmVlZCB0byB1c2UgdGhpcyB0aGVtc2VsdmVzLiAgVGhlIGRlZmF1bHQKKyAgICAgKiBiZWhhdmlvciBvZiBMaXN0RnJhZ21lbnQgaXMgdG8gc3RhcnQgd2l0aCB0aGUgbGlzdCBub3QgYmVpbmcgc2hvd24sIG9ubHkKKyAgICAgKiBzaG93aW5nIGl0IG9uY2UgYW4gYWRhcHRlciBpcyBnaXZlbiB3aXRoIHtAbGluayAjc2V0TGlzdEFkYXB0ZXIoTGlzdEFkYXB0ZXIpfS4KKyAgICAgKiBJZiB0aGUgbGlzdCBhdCB0aGF0IHBvaW50IGhhZCBub3QgYmVlbiBzaG93biwgd2hlbiBpdCBkb2VzIGdldCBzaG93bgorICAgICAqIGl0IHdpbGwgYmUgZG8gd2l0aG91dCB0aGUgdXNlciBldmVyIHNlZWluZyB0aGUgaGlkZGVuIHN0YXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaG93biBJZiB0cnVlLCB0aGUgbGlzdCB2aWV3IGlzIHNob3duOyBpZiBmYWxzZSwgdGhlIHByb2dyZXNzCisgICAgICogaW5kaWNhdG9yLiAgVGhlIGluaXRpYWwgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2hvd24oYm9vbGVhbiBzaG93bikgeworICAgICAgICBzZXRMaXN0U2hvd24oc2hvd24sIHRydWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjc2V0TGlzdFNob3duKGJvb2xlYW4pfSwgYnV0IG5vIGFuaW1hdGlvbiBpcyB1c2VkIHdoZW4KKyAgICAgKiB0cmFuc2l0aW9uaW5nIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RTaG93bk5vQW5pbWF0aW9uKGJvb2xlYW4gc2hvd24pIHsKKyAgICAgICAgc2V0TGlzdFNob3duKHNob3duLCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgbGlzdCBpcyBiZWluZyBkaXNwbGF5ZWQuICBZb3UgY2FuIG1ha2UgaXQgbm90CisgICAgICogZGlzcGxheWVkIGlmIHlvdSBhcmUgd2FpdGluZyBmb3IgdGhlIGluaXRpYWwgZGF0YSB0byBzaG93IGluIGl0LiAgRHVyaW5nCisgICAgICogdGhpcyB0aW1lIGFuIGluZGV0ZXJtaW5hbnQgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdpbGwgYmUgc2hvd24gaW5zdGVhZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2hvd24gSWYgdHJ1ZSwgdGhlIGxpc3QgdmlldyBpcyBzaG93bjsgaWYgZmFsc2UsIHRoZSBwcm9ncmVzcworICAgICAqIGluZGljYXRvci4gIFRoZSBpbml0aWFsIHZhbHVlIGlzIHRydWUuCisgICAgICogQHBhcmFtIGFuaW1hdGUgSWYgdHJ1ZSwgYW4gYW5pbWF0aW9uIHdpbGwgYmUgdXNlZCB0byB0cmFuc2l0aW9uIHRvIHRoZQorICAgICAqIG5ldyBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0TGlzdFNob3duKGJvb2xlYW4gc2hvd24sIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIGlmIChtUHJvZ3Jlc3NDb250YWluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tIGNvbnRlbnQgdmlldyIpOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdFNob3duID09IHNob3duKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RTaG93biA9IHNob3duOworICAgICAgICBpZiAoc2hvd24pIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRlKSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyLnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX291dCkpOworICAgICAgICAgICAgICAgIG1MaXN0Q29udGFpbmVyLnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX2luKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUxpc3RDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFuaW1hdGUpIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfaW4pKTsKKyAgICAgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zdGFydEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSwgYW5kcm9pZC5SLmFuaW0uZmFkZV9vdXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBMaXN0QWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY3Rpdml0eSdzIExpc3RWaWV3LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0QWRhcHRlciBnZXRMaXN0QWRhcHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1BZGFwdGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVMaXN0KCkgeworICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFZpZXcgcm9vdCA9IGdldFZpZXcoKTsKKyAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29udGVudCB2aWV3IG5vdCB5ZXQgY3JlYXRlZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChyb290IGluc3RhbmNlb2YgTGlzdFZpZXcpIHsKKyAgICAgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJvb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhbmRhcmRFbXB0eVZpZXcgPSAoVGV4dFZpZXcpcm9vdC5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaW50ZXJuYWxFbXB0eSk7CisgICAgICAgICAgICBpZiAobVN0YW5kYXJkRW1wdHlWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRW1wdHlWaWV3ID0gcm9vdC5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmVtcHR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lciA9IHJvb3QuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQucHJvZ3Jlc3NDb250YWluZXIpOworICAgICAgICAgICAgbUxpc3RDb250YWluZXIgPSByb290LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmxpc3RDb250YWluZXIpOworICAgICAgICAgICAgVmlldyByYXdMaXN0VmlldyA9IHJvb3QuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5saXN0KTsKKyAgICAgICAgICAgIGlmICghKHJhd0xpc3RWaWV3IGluc3RhbmNlb2YgTGlzdFZpZXcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudCBoYXMgdmlldyB3aXRoIGlkIGF0dHJpYnV0ZSAnYW5kcm9pZC5SLmlkLmxpc3QnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInRoYXQgaXMgbm90IGEgTGlzdFZpZXcgY2xhc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJhd0xpc3RWaWV3OworICAgICAgICAgICAgaWYgKG1MaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJZb3VyIGNvbnRlbnQgbXVzdCBoYXZlIGEgTGlzdFZpZXcgd2hvc2UgaWQgYXR0cmlidXRlIGlzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIidhbmRyb2lkLlIuaWQubGlzdCciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRW1wdHlWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTGlzdC5zZXRFbXB0eVZpZXcobUVtcHR5Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RTaG93biA9IHRydWU7CisgICAgICAgIG1MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgc3RhcnRpbmcgd2l0aG91dCBhbiBhZGFwdGVyLCBzbyBhc3N1bWUgd2Ugd29uJ3QKKyAgICAgICAgICAgIC8vIGhhdmUgb3VyIGRhdGEgcmlnaHQgYXdheSBhbmQgc3RhcnQgd2l0aCB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorICAgICAgICAgICAgaWYgKG1Qcm9ncmVzc0NvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0TGlzdFNob3duKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIucG9zdChtUmVxdWVzdEZvY3VzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFiY2FhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCisvKioKKyAqIEludGVyZmFjZSBhc3NvY2lhdGVkIHdpdGggYW4ge0BsaW5rIEFjdGl2aXR5fSBvciB7QGxpbmsgRnJhZ21lbnR9IGZvciBtYW5hZ2luZworICogb25lIG9yIG1vcmUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Mb2FkZXJ9IGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggaXQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9hZGVyTWFuYWdlciB7CisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBhIGNsaWVudCB0byBpbnRlcmFjdCB3aXRoIHRoZSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTG9hZGVyQ2FsbGJhY2tzPEQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluc3RhbnRpYXRlIGFuZCByZXR1cm4gYSBuZXcgTG9hZGVyIGZvciB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgd2hvc2UgbG9hZGVyIGlzIHRvIGJlIGNyZWF0ZWQuCisgICAgICAgICAqIEBwYXJhbSBhcmdzIEFueSBhcmd1bWVudHMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm4gYSBuZXcgTG9hZGVyIGluc3RhbmNlIHRoYXQgaXMgcmVhZHkgdG8gc3RhcnQgbG9hZGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb2FkZXI8RD4gb25DcmVhdGVMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJldmlvdXNseSBjcmVhdGVkIGxvYWRlciBoYXMgZmluaXNoZWQgaXRzIGxvYWQuCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIExvYWRlciB0aGF0IGhhcyBmaW5pc2hlZC4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgZ2VuZXJhdGVkIGJ5IHRoZSBMb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRGaW5pc2hlZChMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGEgbG9hZGVyIGlzIGluaXRpYWxpemVkIGFuZCBhY3RpdmUuICBJZiB0aGUgbG9hZGVyIGRvZXNuJ3QKKyAgICAgKiBhbHJlYWR5IGV4aXN0LCBvbmUgaXMgY3JlYXRlZCBhbmQgKGlmIHRoZSBhY3Rpdml0eS9mcmFnbWVudCBpcyBjdXJyZW50bHkKKyAgICAgKiBzdGFydGVkKSBzdGFydHMgdGhlIGxvYWRlci4gIE90aGVyd2lzZSB0aGUgbGFzdCBjcmVhdGVkCisgICAgICogbG9hZGVyIGlzIHJlLXVzZWQuCisgICAgICoKKyAgICAgKiA8cD5JbiBlaXRoZXIgY2FzZSwgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9hZGVyLCBhbmQKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBhcyB0aGUgbG9hZGVyIHN0YXRlIGNoYW5nZXMuICBJZiBhdCB0aGUgcG9pbnQgb2YgY2FsbAorICAgICAqIHRoZSBjYWxsZXIgaXMgaW4gaXRzIHN0YXJ0ZWQgc3RhdGUsIGFuZCB0aGUgcmVxdWVzdGVkIGxvYWRlcgorICAgICAqIGFscmVhZHkgZXhpc3RzIGFuZCBoYXMgZ2VuZXJhdGVkIGl0cyBkYXRhLCB0aGVuCisgICAgICogY2FsbGJhY2suIHtAbGluayBMb2FkZXJDYWxsYmFja3Mjb25Mb2FkRmluaXNoZWR9IHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgKGluc2lkZSBvZiB0aGlzIGZ1bmN0aW9uKSwgc28geW91IG11c3QgYmUgcHJlcGFyZWQKKyAgICAgKiBmb3IgdGhpcyB0byBoYXBwZW4uCisgICAgICovCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gaW5pdExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBsb2FkZXIgaW4gdGhpcyBtYW5hZ2VyLCByZWdpc3RlcnMgdGhlIGNhbGxiYWNrcyB0byBpdCwKKyAgICAgKiBhbmQgKGlmIHRoZSBhY3Rpdml0eS9mcmFnbWVudCBpcyBjdXJyZW50bHkgc3RhcnRlZCkgc3RhcnRzIGxvYWRpbmcgaXQuCisgICAgICogSWYgYSBsb2FkZXIgd2l0aCB0aGUgc2FtZSBpZCBoYXMgcHJldmlvdXNseSBiZWVuCisgICAgICogc3RhcnRlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVzdHJveWVkIHdoZW4gdGhlIG5ldyBsb2FkZXIgY29tcGxldGVzCisgICAgICogaXRzIHdvcmsuIFRoZSBjYWxsYmFjayB3aWxsIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGhlIG9sZCBsb2FkZXIKKyAgICAgKiBpcyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gcmVzdGFydExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogU3RvcHMgYW5kIHJlbW92ZXMgdGhlIGxvYWRlciB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGVyKGludCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvYWRlciB3aXRoIHRoZSBnaXZlbiBpZCBvciBudWxsIGlmIG5vIG1hdGNoaW5nIExvYWRlcgorICAgICAqIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IGdldExvYWRlcihpbnQgaWQpOworfQorCitjbGFzcyBMb2FkZXJNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIExvYWRlck1hbmFnZXIgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvYWRlck1hbmFnZXJJbXBsIjsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisKKyAgICAvLyBUaGVzZSBhcmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbG9hZGVycy4gIEEgbG9hZGVyIGlzIGhlcmUKKyAgICAvLyBmcm9tIHRoZSB0aW1lIGl0cyBsb2FkIGlzIHN0YXJ0ZWQgdW50aWwgaXQgaGFzIGJlZW4gZXhwbGljaXRseQorICAgIC8vIHN0b3BwZWQgb3IgcmVzdGFydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICBmaW5hbCBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPiBtTG9hZGVycyA9IG5ldyBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPigpOworCisgICAgLy8gVGhlc2UgYXJlIHByZXZpb3VzbHkgcnVuIGxvYWRlcnMuICBUaGlzIGxpc3QgaXMgbWFpbnRhaW5lZCBpbnRlcm5hbGx5CisgICAgLy8gdG8gYXZvaWQgZGVzdHJveWluZyBhIGxvYWRlciB3aGlsZSBhbiBhcHBsaWNhdGlvbiBpcyBzdGlsbCB1c2luZyBpdC4KKyAgICAvLyBJdCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmVzdGFydCBhIGxvYWRlciwgYnV0IGNvbnRpbnVlIHVzaW5nIGl0cworICAgIC8vIHByZXZpb3VzbHkgcnVuIGxvYWRlciB1bnRpbCB0aGUgbmV3IGxvYWRlcidzIGRhdGEgaXMgYXZhaWxhYmxlLgorICAgIGZpbmFsIFNwYXJzZUFycmF5PExvYWRlckluZm8+IG1JbmFjdGl2ZUxvYWRlcnMgPSBuZXcgU3BhcnNlQXJyYXk8TG9hZGVySW5mbz4oKTsKKworICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgYm9vbGVhbiBtUmV0YWluaW5nOworICAgIGJvb2xlYW4gbVJldGFpbmluZ1N0YXJ0ZWQ7CisKKyAgICBmaW5hbCBjbGFzcyBMb2FkZXJJbmZvIGltcGxlbWVudHMgTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI8T2JqZWN0PiB7CisgICAgICAgIGZpbmFsIGludCBtSWQ7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBtQXJnczsKKyAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiBtQ2FsbGJhY2tzOworICAgICAgICBMb2FkZXI8T2JqZWN0PiBtTG9hZGVyOworICAgICAgICBPYmplY3QgbURhdGE7CisgICAgICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgICAgIGJvb2xlYW4gbVJldGFpbmluZzsKKyAgICAgICAgYm9vbGVhbiBtUmV0YWluaW5nU3RhcnRlZDsKKyAgICAgICAgYm9vbGVhbiBtRGVzdHJveWVkOworICAgICAgICBib29sZWFuIG1MaXN0ZW5lclJlZ2lzdGVyZWQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgTG9hZGVySW5mbyhpbnQgaWQsIEJ1bmRsZSBhcmdzLCBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+IGNhbGxiYWNrcykgeworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgICAgICBtQXJncyA9IGFyZ3M7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gY2FsbGJhY2tzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgaWYgKG1SZXRhaW5pbmcgJiYgbVJldGFpbmluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBPdXIgb3duZXIgaXMgc3RhcnRlZCwgYnV0IHdlIHdlcmUgYmVpbmcgcmV0YWluZWQgZnJvbSBhCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgaW5zdGFuY2UgaW4gdGhlIHN0YXJ0ZWQgc3RhdGUuLi4gIHNvIHRoZXJlIGlzIHJlYWxseQorICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZSwgc2luY2UgdGhlIGxvYWRlcnMgYXJlIHN0aWxsIHN0YXJ0ZWQuCisgICAgICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbG9hZGVyIGFscmVhZHkgc3RhcnRlZCwgZG9uJ3QgcmVzdGFydC4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBTdGFydGluZzogIiArIHRoaXMpOworICAgICAgICAgICAgaWYgKG1Mb2FkZXIgPT0gbnVsbCAmJiBtQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgIG1Mb2FkZXIgPSBtQ2FsbGJhY2tzLm9uQ3JlYXRlTG9hZGVyKG1JZCwgbUFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Mb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghbUxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIobUlkLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Mb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIHJldGFpbigpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIG1SZXRhaW5pbmcgPSB0cnVlOworICAgICAgICAgICAgbVJldGFpbmluZ1N0YXJ0ZWQgPSBtU3RhcnRlZDsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBmaW5pc2hSZXRhaW4oKSB7CisgICAgICAgICAgICBpZiAobVJldGFpbmluZykgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBGaW5pc2hlZCBSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICBtUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICE9IG1SZXRhaW5pbmdTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIHdhcyByZXRhaW5lZCBpbiBhIHN0YXJ0ZWQgc3RhdGUsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiByZXRhaW5pbmcgZXZlcnl0aGluZyBvdXIgb3duZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGxvbmdlciBzdGFydGVkLi4uICBzbyBtYWtlIGl0IHN0b3AuCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmIG1EYXRhICE9IG51bGwgJiYgbUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIHdhcyByZXRhaW5lZCwgYW5kIG5vdyBhdCB0aGUgcG9pbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoaW5nIHRoZSByZXRhaW4gd2UgZmluZCB3ZSByZW1haW4gc3RhcnRlZCwgaGF2ZQorICAgICAgICAgICAgICAgICAgICAvLyBvdXIgZGF0YSwgYW5kIHRoZSBvd25lciBoYXMgYSBuZXcgY2FsbGJhY2suLi4gIHNvCisgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGRlbGl2ZXIgdGhlIGRhdGEgbm93LgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uTG9hZEZpbmlzaGVkKG1Mb2FkZXIsIG1EYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBTdG9wcGluZzogIiArIHRoaXMpOworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICghbVJldGFpbmluZykgeworICAgICAgICAgICAgICAgIGlmIChtTG9hZGVyICE9IG51bGwgJiYgbUxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBMZXQgdGhlIGxvYWRlciBrbm93IHdlJ3JlIGRvbmUgd2l0aCBpdAorICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnN0b3BMb2FkaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EYXRhID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIERlc3Ryb3lpbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgICAgICAgICAgbUNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgICAgICBpZiAobUxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxvYWRlci5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8T2JqZWN0PiBsb2FkZXIsIE9iamVjdCBkYXRhKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm9uTG9hZENvbXBsZXRlOiAiICsgdGhpcyArICIgbURlc3Ryb3llZD0iICsgbURlc3Ryb3llZCk7CisKKyAgICAgICAgICAgIGlmIChtRGVzdHJveWVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBOb3RpZnkgb2YgdGhlIG5ldyBkYXRhIHNvIHRoZSBhcHAgY2FuIHN3aXRjaCBvdXQgdGhlIG9sZCBkYXRhIGJlZm9yZQorICAgICAgICAgICAgLy8gd2UgdHJ5IHRvIGRlc3Ryb3kgaXQuCisgICAgICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5vbkxvYWRGaW5pc2hlZChsb2FkZXIsIGRhdGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm9uTG9hZEZpbmlzaGVkIHJldHVybmVkOiAiICsgdGhpcyk7CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgbm93IGdpdmVuIHRoZSBhcHBsaWNhdGlvbiB0aGUgbmV3IGxvYWRlciB3aXRoIGl0cworICAgICAgICAgICAgLy8gbG9hZGVkIGRhdGEsIHNvIGl0IHNob3VsZCBoYXZlIHN0b3BwZWQgdXNpbmcgdGhlIHByZXZpb3VzCisgICAgICAgICAgICAvLyBsb2FkZXIuICBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIGxvYWRlciBvbiB0aGUgaW5hY3RpdmUgbGlzdCwKKyAgICAgICAgICAgIC8vIGNsZWFuIGl0IHVwLgorICAgICAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUluYWN0aXZlTG9hZGVycy5nZXQobUlkKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwgJiYgaW5mbyAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgaW5mby5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5yZW1vdmUobUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDY0KTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiTG9hZGVySW5mb3siKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAjIik7CisgICAgICAgICAgICBzYi5hcHBlbmQobUlkKTsKKyAgICAgICAgICAgIGlmIChtQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1BcmdzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBMb2FkZXJNYW5hZ2VySW1wbChib29sZWFuIHN0YXJ0ZWQpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSBzdGFydGVkOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIExvYWRlckluZm8gY3JlYXRlTG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+IGNhbGxiYWNrKSB7CisgICAgICAgIExvYWRlckluZm8gaW5mbyA9IG5ldyBMb2FkZXJJbmZvKGlkLCBhcmdzLCAgKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2spOworICAgICAgICBtTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICBMb2FkZXI8T2JqZWN0PiBsb2FkZXIgPSBjYWxsYmFjay5vbkNyZWF0ZUxvYWRlcihpZCwgYXJncyk7CisgICAgICAgIGluZm8ubUxvYWRlciA9IChMb2FkZXI8T2JqZWN0Pilsb2FkZXI7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gVGhlIGFjdGl2aXR5IHdpbGwgc3RhcnQgYWxsIGV4aXN0aW5nIGxvYWRlcnMgaW4gaXQncyBvblN0YXJ0KCksCisgICAgICAgICAgICAvLyBzbyBvbmx5IHN0YXJ0IHRoZW0gaGVyZSBpZiB3ZSdyZSBwYXN0IHRoYXQgcG9pbnQgb2YgdGhlIGFjdGl2aXRpeSdzCisgICAgICAgICAgICAvLyBsaWZlIGN5Y2xlCisgICAgICAgICAgICBpbmZvLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IGluaXRMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spIHsKKyAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgCisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiaW5pdExvYWRlciBpbiAiICsgdGhpcyArICI6IGN1cj0iICsgaW5mbyk7CisKKyAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTG9hZGVyIGRvZXNuJ3QgYWxyZWFkeSBleGlzdDsgY3JlYXRlLgorICAgICAgICAgICAgaW5mbyA9IGNyZWF0ZUxvYWRlcihpZCwgYXJncywgIChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZm8ubUNhbGxiYWNrcyA9IChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoaW5mby5tRGF0YSAhPSBudWxsICYmIG1TdGFydGVkKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgbG9hZGVyIGhhcyBhbHJlYWR5IGdlbmVyYXRlZCBpdHMgZGF0YSwgcmVwb3J0IGl0IG5vdy4KKyAgICAgICAgICAgIGluZm8ubUNhbGxiYWNrcy5vbkxvYWRGaW5pc2hlZChpbmZvLm1Mb2FkZXIsIGluZm8ubURhdGEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gKExvYWRlcjxEPilpbmZvLm1Mb2FkZXI7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IHJlc3RhcnRMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spIHsKKyAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0YXJ0TG9hZGVyIGluICIgKyB0aGlzICsgIjogY3VyPSIgKyBpbmZvKTsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgTG9hZGVySW5mbyBpbmFjdGl2ZSA9IG1JbmFjdGl2ZUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgICAgIGlmIChpbmFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZm8ubURhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxvYWRlciBub3cgaGFzIGRhdGEuLi4gIHdlIGFyZSBwcm9iYWJseSBiZWluZworICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSB3aXRoaW4gb25Mb2FkQ29tcGxldGUsIHdoZXJlIHdlIGhhdmVuJ3QKKyAgICAgICAgICAgICAgICAgICAgLy8geWV0IGRlc3Ryb3llZCB0aGUgbGFzdCBpbmFjdGl2ZSBsb2FkZXIuICBTbyBqdXN0IGRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbm93LgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgUmVtb3ZpbmcgbGFzdCBpbmFjdGl2ZSBsb2FkZXIgaW4gIiArIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBpbmFjdGl2ZS5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gaW5hY3RpdmUgbG9hZGVyIGZvciB0aGlzIElEIHRoYXQgd2UgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yISAgTm93IHdlIGhhdmUgdGhyZWUgYWN0aXZlIGxvYWRlcnMuLi4gbGV0J3MganVzdAorICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHRoZSBvbmUgaW4gdGhlIG1pZGRsZSwgc2luY2Ugd2UgYXJlIHN0aWxsIHdhaXRpbmcgZm9yCisgICAgICAgICAgICAgICAgICAgIC8vIGl0cyByZXN1bHQgYnV0IHRoYXQgcmVzdWx0IGlzIGFscmVhZHkgb3V0IG9mIGRhdGUuCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBSZW1vdmluZyBpbnRlcm1lZGlhdGUgbG9hZGVyIGluICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvZiB0aGlzIGxvYWRlciBzbyB3ZSBjYW4gZGVzdHJveQorICAgICAgICAgICAgICAgIC8vIGl0IHdoZW4gdGhlIG5ldyBvbmUgY29tcGxldGVzLgorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBNYWtpbmcgaW5hY3RpdmU6ICIgKyBpbmZvKTsKKyAgICAgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGluZm8gPSBjcmVhdGVMb2FkZXIoaWQsIGFyZ3MsICAoTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiljYWxsYmFjayk7CisgICAgICAgIHJldHVybiAoTG9hZGVyPEQ+KWluZm8ubUxvYWRlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRlcihpbnQgaWQpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzdG9wTG9hZGVyIGluICIgKyB0aGlzICsgIiBvZiAiICsgaWQpOworICAgICAgICBpbnQgaWR4ID0gbUxvYWRlcnMuaW5kZXhPZktleShpZCk7CisgICAgICAgIGlmIChpZHggPj0gMCkgeworICAgICAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMudmFsdWVBdChpZHgpOworICAgICAgICAgICAgbUxvYWRlcnMucmVtb3ZlQXQoaWR4KTsKKyAgICAgICAgICAgIGluZm8uZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gZ2V0TG9hZGVyKGludCBpZCkgeworICAgICAgICBMb2FkZXJJbmZvIGxvYWRlckluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAobG9hZGVySW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKExvYWRlcjxEPiltTG9hZGVycy5nZXQoaWQpLm1Mb2FkZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorIAorICAgIHZvaWQgZG9TdGFydCgpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJTdGFydGluZzogIiArIHRoaXMpOworCisgICAgICAgIC8vIENhbGwgb3V0IHRvIHN1YiBjbGFzc2VzIHNvIHRoZXkgY2FuIHN0YXJ0IHRoZWlyIGxvYWRlcnMKKyAgICAgICAgLy8gTGV0IHRoZSBleGlzdGluZyBsb2FkZXJzIGtub3cgdGhhdCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlCisgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuc3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIHZvaWQgZG9TdG9wKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlN0b3BwaW5nOiAiICsgdGhpcyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgdm9pZCBkb1JldGFpbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKworICAgICAgICBtUmV0YWluaW5nID0gdHJ1ZTsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5yZXRhaW4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGZpbmlzaFJldGFpbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJGaW5pc2hlZCBSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKworICAgICAgICBtUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuZmluaXNoUmV0YWluKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBkb0Rlc3Ryb3koKSB7CisgICAgICAgIGlmICghbVJldGFpbmluZykgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJEZXN0cm95aW5nIEFjdGl2ZTogIiArIHRoaXMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkRlc3Ryb3lpbmcgSW5hY3RpdmU6ICIgKyB0aGlzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1JbmFjdGl2ZUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnZhbHVlQXQoaSkuZGVzdHJveSgpOworICAgICAgICB9CisgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMuY2xlYXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdpbmdGcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnaW5nRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjcxMTcwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnaW5nRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogQSBGcmFnbWVudCB0aGF0IGhhcyB1dGlsaXR5IG1ldGhvZHMgZm9yIG1hbmFnaW5nIHtAbGluayBMb2FkZXJ9cy4KKyAqCisgKiBAcGFyYW0gPEQ+IFRoZSB0eXBlIG9mIGRhdGEgcmV0dXJuZWQgYnkgdGhlIExvYWRlci4gSWYgeW91J3JlIHVzaW5nIG11bHRpcGxlIExvYWRlcnMgd2l0aAorICogZGlmZmVyZW50IHJldHVybiB0eXBlcyB1c2UgT2JqZWN0IGFuZCBjYXNlIHRoZSByZXN1bHRzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9hZGVyTWFuYWdpbmdGcmFnbWVudDxEPiBleHRlbmRzIEZyYWdtZW50CisgICAgICAgIGltcGxlbWVudHMgTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4geworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIExvYWRlckluZm88RD4geworICAgICAgICBwdWJsaWMgQnVuZGxlIGFyZ3M7CisgICAgICAgIHB1YmxpYyBMb2FkZXI8RD4gbG9hZGVyOworICAgIH0KKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gbUxvYWRlcnM7CisgICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+IG1JbmFjdGl2ZUxvYWRlcnM7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBsb2FkZXIgd2l0aCB0aGlzIGFjdGl2aXR5LCByZWdpc3RlcnMgdGhlIGNhbGxiYWNrcyBvbiBpdCwgYW5kIHN0YXJ0cyBpdCBsb2FkaW5nLgorICAgICAqIElmIGEgbG9hZGVyIHdpdGggdGhlIHNhbWUgaWQgaGFzIHByZXZpb3VzbHkgYmVlbiBzdGFydGVkIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkZXN0cm95ZWQKKyAgICAgKiB3aGVuIHRoZSBuZXcgbG9hZGVyIGNvbXBsZXRlcyBpdCdzIHdvcmsuIFRoZSBjYWxsYmFjayB3aWxsIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGhlIG9sZCBsb2FkZXIKKyAgICAgKiBpcyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIExvYWRlcjxEPiBzdGFydExvYWRpbmcoaW50IGlkLCBCdW5kbGUgYXJncykgeworICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvZiB0aGlzIGxvYWRlciBzbyB3ZSBjYW4gZGVzdHJveQorICAgICAgICAgICAgLy8gaXQgd2hlbiB0aGUgbmV3IG9uZSBjb21wbGV0ZXMuCisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgaW5mbyA9IG5ldyBMb2FkZXJJbmZvPEQ+KCk7CisgICAgICAgIGluZm8uYXJncyA9IGFyZ3M7CisgICAgICAgIG1Mb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBvbkNyZWF0ZUxvYWRlcihpZCwgYXJncyk7CisgICAgICAgIGluZm8ubG9hZGVyID0gbG9hZGVyOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIC8vIFRoZSBhY3Rpdml0eSB3aWxsIHN0YXJ0IGFsbCBleGlzdGluZyBsb2FkZXJzIGluIGl0J3Mgb25TdGFydCgpLCBzbyBvbmx5IHN0YXJ0IHRoZW0KKyAgICAgICAgICAgIC8vIGhlcmUgaWYgd2UncmUgcGFzdCB0aGF0IHBvaW50IG9mIHRoZSBhY3Rpdml0aXkncyBsaWZlIGN5Y2xlCisgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcihpZCwgdGhpcyk7CisgICAgICAgICAgICBsb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTG9hZGVyPEQ+IG9uQ3JlYXRlTG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uSW5pdGlhbGl6ZUxvYWRlcnMoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkxvYWRGaW5pc2hlZChMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworCisgICAgcHVibGljIGZpbmFsIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPEQ+IGxvYWRlciwgRCBkYXRhKSB7CisgICAgICAgIC8vIE5vdGlmeSBvZiB0aGUgbmV3IGRhdGEgc28gdGhlIGFwcCBjYW4gc3dpdGNoIG91dCB0aGUgb2xkIGRhdGEgYmVmb3JlCisgICAgICAgIC8vIHdlIHRyeSB0byBkZXN0cm95IGl0LgorICAgICAgICBvbkxvYWRGaW5pc2hlZChsb2FkZXIsIGRhdGEpOworCisgICAgICAgIC8vIExvb2sgZm9yIGFuIGluYWN0aXZlIGxvYWRlciBhbmQgZGVzdHJveSBpdCBpZiBmb3VuZAorICAgICAgICBpbnQgaWQgPSBsb2FkZXIuZ2V0SWQoKTsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gbUluYWN0aXZlTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXI8RD4gb2xkTG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICBpZiAob2xkTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvbGRMb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5yZW1vdmUoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRTdGF0ZSk7CisKKyAgICAgICAgaWYgKG1Mb2FkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIExvb2sgZm9yIGEgcGFzc2VkIGFsb25nIGxvYWRlciBhbmQgY3JlYXRlIGEgbmV3IG9uZSBpZiBpdCdzIG5vdCB0aGVyZQorLy8gVE9ETzogdW5jb21tZW50IG9uY2UgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSBtZXRob2QgaXMgYXZhaWxhYmxlCisvLyAgICAgICAgICAgIG1Mb2FkZXJzID0gKEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbz4pIGdldExhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChtTG9hZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvYWRlcnMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PigpOworICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZUxvYWRlcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUluYWN0aXZlTG9hZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKKworICAgICAgICAvLyBDYWxsIG91dCB0byBzdWIgY2xhc3NlcyBzbyB0aGV5IGNhbiBzdGFydCB0aGVpciBsb2FkZXJzCisgICAgICAgIC8vIExldCB0aGUgZXhpc3RpbmcgbG9hZGVycyBrbm93IHRoYXQgd2Ugd2FudCB0byBiZSBub3RpZmllZCB3aGVuIGEgbG9hZCBpcyBjb21wbGV0ZQorICAgICAgICBmb3IgKEhhc2hNYXAuRW50cnk8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gZW50cnkgOiBtTG9hZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgaW50IGlkID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgIGxvYWRlciA9IG9uQ3JlYXRlTG9hZGVyKGlkLCBpbmZvLmFyZ3MpOworICAgICAgICAgICAgICAgaW5mby5sb2FkZXIgPSBsb2FkZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcihpZCwgdGhpcyk7CisgICAgICAgICAgICBsb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKworICAgICAgICBmb3IgKEhhc2hNYXAuRW50cnk8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gZW50cnkgOiBtTG9hZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExldCB0aGUgbG9hZGVyIGtub3cgd2UncmUgZG9uZSB3aXRoIGl0CisgICAgICAgICAgICBsb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworCisgICAgICAgICAgICAvLyBUaGUgbG9hZGVyIGlzbid0IGdldHRpbmcgcGFzc2VkIGFsb25nIHRvIHRoZSBuZXh0IGluc3RhbmNlIHNvIGFzayBpdCB0byBzdG9wIGxvYWRpbmcKKyAgICAgICAgICAgIGlmICghZ2V0QWN0aXZpdHkoKS5pc0NoYW5naW5nQ29uZmlndXJhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgIGxvYWRlci5zdG9wTG9hZGluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKiBUTyBETzogVGhpcyBuZWVkcyB0byBiZSB0dXJuZWQgaW50byBhIHJldGFpbmVkIGZyYWdtZW50LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3Qgb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKSB7CisgICAgICAgIC8vIFBhc3MgdGhlIGxvYWRlciBhbG9uZyB0byB0aGUgbmV4dCBndXkKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1Mb2FkZXJzOworICAgICAgICBtTG9hZGVycyA9IG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICoqLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKworICAgICAgICBpZiAobUxvYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIYXNoTWFwLkVudHJ5PEludGVnZXIsIExvYWRlckluZm88RD4+IGVudHJ5IDogbUxvYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIGFuZCByZW1vdmVzIHRoZSBsb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoaW50IGlkKSB7CisgICAgICAgIGlmIChtTG9hZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtTG9hZGVycy5yZW1vdmUoaWQpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgb3IgbnVsbCBpZiBubyBtYXRjaGluZyBMb2FkZXIKKyAgICAgKiBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyPEQ+IGdldExvYWRlcihpbnQgaWQpIHsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBsb2FkZXJJbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGxvYWRlckluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZXJzLmdldChpZCkubG9hZGVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggYTI0ZmNhZS4uNTI0ZGU2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTIwLDEzICsyMCwxMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKQEAgLTM4LDcgKzM2LDcgQEAKICAqLwogcHVibGljIGNsYXNzIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvY2FsQWN0aXZpdHlNYW5hZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HViA9IGZhbHNlIHx8IENvbmZpZy5MT0dWOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gZmFsc2U7CiAKICAgICAvLyBJbnRlcm5hbCB0b2tlbiBmb3IgYW4gQWN0aXZpdHkgYmVpbmcgbWFuYWdlZCBieSBMb2NhbEFjdGl2aXR5TWFuYWdlci4KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEFjdGl2aXR5UmVjb3JkIGV4dGVuZHMgQmluZGVyIHsKQEAgLTExMiwxMSArMTEwLDE2IEBACiAgICAgICAgIAogICAgICAgICBpZiAoci5jdXJTdGF0ZSA9PSBJTklUSUFMSVpJTkcpIHsKICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSBmb3IgdGhlIGFjdGl2aXR5Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0KLSAgICAgICAgICAgICAgICBtUGFyZW50LmdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQuZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOworICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlT2JqID0gbnVsbDsKICAgICAgICAgICAgIGlmIChsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VPYmogPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZU9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICAgICAgICAgIGluc3RhbmNlLmFjdGl2aXR5ID0gaW5zdGFuY2VPYmo7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaGF2ZSBhbHdheXMgY3JlYXRlZCB0aGUgYWN0aXZpdHkuCkBAIC0zNDYsNyArMzQ5LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFdpbmRvdyBwZXJmb3JtRGVzdHJveShMb2NhbEFjdGl2aXR5UmVjb3JkIHIsIGJvb2xlYW4gZmluaXNoKSB7Ci0gICAgICAgIFdpbmRvdyB3aW4gPSBudWxsOworICAgICAgICBXaW5kb3cgd2luOwogICAgICAgICB3aW4gPSByLndpbmRvdzsKICAgICAgICAgaWYgKHIuY3VyU3RhdGUgPT0gUkVTVU1FRCAmJiAhZmluaXNoKSB7CiAgICAgICAgICAgICBwZXJmb3JtUGF1c2UociwgZmluaXNoKTsKQEAgLTM4MCw3ICszODMsOCBAQAogICAgICAgICBpZiAociAhPSBudWxsKSB7CiAgICAgICAgICAgICB3aW4gPSBwZXJmb3JtRGVzdHJveShyLCBmaW5pc2gpOwogICAgICAgICAgICAgaWYgKGZpbmlzaCkgewotICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLnJlbW92ZShyKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdGllcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eUFycmF5LnJlbW92ZShyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gd2luOwpAQCAtNDQxLDEwICs0NDUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKEJ1bmRsZSBzdGF0ZSkgewogICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpID0gc3RhdGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBzdGF0ZS5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGkubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXN0YXRlID0gc3RhdGUuZ2V0QnVuZGxlKGlkKTsKICAgICAgICAgICAgICAgICAgICAgTG9jYWxBY3Rpdml0eVJlY29yZCByID0gbUFjdGl2aXRpZXMuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewpAQCAtNDU3LDkgKzQ1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBSZWNvdmVyIGZyb20gLWFsbC0gYXBwIGVycm9ycy4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHRocm93biB3aGVuIHJlc3RvcmluZyBMb2NhbEFjdGl2aXR5TWFuYWdlciBzdGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdGhyb3duIHdoZW4gcmVzdG9yaW5nIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHN0YXRlIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEKaW5kZXggODU2OTQzZC4uZTYwMjUxOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CkBAIC0xMTYsMTYgKzExNyw1NSBAQAogICAgICAqIElmIHRoaXMgZmFjaWxpdHkgaXMgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2UsIHBsZWFzZSBnaXZlIHRoZSB1c2VyIGFuIG9wdGlvbgogICAgICAqIHRvIHR1cm4gaXQgb2ZmIGFuZCB1c2UgYSBub3JtYWwgbm90aWZpY2F0aW9uLCBhcyB0aGlzIGNhbiBiZSBleHRyZW1lbHkKICAgICAgKiBkaXNydXB0aXZlLgorICAgICAqIAorICAgICAqIDxwPlVzZSB3aXRoIHtAbGluayAjRkxBR19ISUdIX1BSSU9SSVRZfSB0byBlbnN1cmUgdGhhdCB0aGlzIG5vdGlmaWNhdGlvbgorICAgICAqIHdpbGwgcmVhY2ggdGhlIHVzZXIgZXZlbiB3aGVuIG90aGVyIG5vdGlmaWNhdGlvbnMgYXJlIHN1cHByZXNzZWQuCiAgICAgICovCiAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgZnVsbFNjcmVlbkludGVudDsKIAogICAgIC8qKgogICAgICAqIFRleHQgdG8gc2Nyb2xsIGFjcm9zcyB0aGUgc2NyZWVuIHdoZW4gdGhpcyBpdGVtIGlzIGFkZGVkIHRvCi0gICAgICogdGhlIHN0YXR1cyBiYXIuCisgICAgICogdGhlIHN0YXR1cyBiYXIgb24gbGFyZ2UgYW5kIHNtYWxsZXIgZGV2aWNlcy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZmllbGQgaXMgcHJvdmlkZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBvdGhlciB0aWNrZXIgZmllbGRzCisgICAgICogYm90aCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgdG8gYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gY2hvb3NlIGRpZmZlcmVudAorICAgICAqIHRleHQgZm9yIHdoZW4gdGhlIHRleHQgc2Nyb2xscyBpbiBhbmQgd2hlbiBpdCBpcyBkaXNwbGF5ZWQgYWxsIGF0IG9uY2UKKyAgICAgKiBpbiBjb25qdW5jdGlvbiB3aXRoIG9uZSBvciBtb3JlIGljb25zLgorICAgICAqCisgICAgICogQHNlZSAjdGlja2VyVGl0bGUKKyAgICAgKiBAc2VlICN0aWNrZXJTdWJ0aXRsZQorICAgICAqIEBzZWUgI3RpY2tlckljb25zCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSB0aWNrZXJUZXh0OwogCiAgICAgLyoqCisgICAgICogVGhlIHRpdGxlIGxpbmUgZm9yIHRoZSB0aWNrZXIgb3ZlciBhIHRoZSBmYXQgc3RhdHVzIGJhciBvbiB4bGFyZ2UgZGV2aWNlcy4KKyAgICAgKgorICAgICAqIEBzZWUgI3RpY2tlclRleHQKKyAgICAgKiBAc2VlICN0aWNrZXJTdWJ0aXRsZQorICAgICAqIEBzZWUgI3RpY2tlckljb25zCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSB0aWNrZXJUaXRsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdWJ0aXRsZSBsaW5lIGZvciB0aGUgdGlja2VyIG92ZXIgYSB0aGUgZmF0IHN0YXR1cyBiYXIgb24geGxhcmdlIGRldmljZXMuCisgICAgICoKKyAgICAgKiBAc2VlICN0aWNrZXJUZXh0CisgICAgICogQHNlZSAjdGlja2VyVGl0bGUKKyAgICAgKiBAc2VlICN0aWNrZXJJY29ucworICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgdGlja2VyU3VidGl0bGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaWNvbnMgdG8gc2hvdyB0byB0aGUgbGVmdCBvZiB0aGUgb3RoZXIgdGlja2VyIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEBzZWUgI3RpY2tlclRleHQKKyAgICAgKiBAc2VlICN0aWNrZXJUaXRsZQorICAgICAqIEBzZWUgI3RpY2tlclN1YnRpdGxlCisgICAgICovCisgICAgcHVibGljIEJpdG1hcFtdIHRpY2tlckljb25zOworCisgICAgLyoqCiAgICAgICogVGhlIHZpZXcgdGhhdCB3aWxsIHJlcHJlc2VudCB0aGlzIG5vdGlmaWNhdGlvbiBpbiB0aGUgZXhwYW5kZWQgc3RhdHVzIGJhci4KICAgICAgKi8KICAgICBwdWJsaWMgUmVtb3RlVmlld3MgY29udGVudFZpZXc7CkBAIC0yNzUsNiArMzE1LDE0IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GT1JFR1JPVU5EX1NFUlZJQ0UgPSAweDAwMDAwMDQwOwogCisgICAgLyoqCisgICAgICogQml0IHRvIGJlIGJpdHdpc2Utb3JlZCBpbnRvIHRoZSB7QGxpbmsgI2ZsYWdzfSBmaWVsZCB0aGF0IHNob3VsZCBiZSBzZXQgaWYgdGhpcyBub3RpZmljYXRpb24KKyAgICAgKiByZXByZXNlbnRzIGEgaGlnaC1wcmlvcml0eSBldmVudCB0aGF0IG1heSBiZSBzaG93biB0byB0aGUgdXNlciBldmVuIGlmIG5vdGlmaWNhdGlvbnMgYXJlCisgICAgICogb3RoZXJ3aXNlIHVuYXZhaWxhYmxlICh0aGF0IGlzLCB3aGVuIHRoZSBzdGF0dXMgYmFyIGlzIGhpZGRlbikuIFRoaXMgZmxhZyBpcyBpZGVhbGx5IHVzZWQKKyAgICAgKiBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjZnVsbFNjcmVlbkludGVudH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ISUdIX1BSSU9SSVRZID0gMHgwMDAwMDA4MDsKKwogICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAKICAgICAvKioKQEAgLTMzNiw2ICszODQsMjEgQEAKICAgICAgICAgICAgIHRpY2tlclRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgfQogICAgICAgICBpZiAocGFyY2VsLnJlYWRJbnQoKSAhPSAwKSB7CisgICAgICAgICAgICB0aWNrZXJUaXRsZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJjZWwucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgIHRpY2tlclN1YnRpdGxlID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHRpY2tlckljb25Db3VudCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIGlmICh0aWNrZXJJY29uQ291bnQgPj0gMCkgeworICAgICAgICAgICAgdGlja2VySWNvbnMgPSBuZXcgQml0bWFwW3RpY2tlckljb25Db3VudF07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGlja2VySWNvbkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyY2VsLnJlYWRJbnQoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRpY2tlckljb25zW2ldID0gQml0bWFwLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocGFyY2VsLnJlYWRJbnQoKSAhPSAwKSB7CiAgICAgICAgICAgICBjb250ZW50VmlldyA9IFJlbW90ZVZpZXdzLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHRzID0gcGFyY2VsLnJlYWRJbnQoKTsKQEAgLTM3MSw2ICs0MzQsMTkgQEAKICAgICAgICAgaWYgKHRoaXMudGlja2VyVGV4dCAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aGF0LnRpY2tlclRleHQgPSB0aGlzLnRpY2tlclRleHQudG9TdHJpbmcoKTsKICAgICAgICAgfQorICAgICAgICBpZiAodGhpcy50aWNrZXJUaXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGF0LnRpY2tlclRpdGxlID0gdGhpcy50aWNrZXJUaXRsZS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnRpY2tlclN1YnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoYXQudGlja2VyU3VidGl0bGUgPSB0aGlzLnRpY2tlclN1YnRpdGxlLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMudGlja2VySWNvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgaW50IE4gPSB0aGlzLnRpY2tlckljb25zLmxlbmd0aDsKKyAgICAgICAgICAgIHRoYXQudGlja2VySWNvbnMgPSBuZXcgQml0bWFwW05dOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIHRoYXQudGlja2VySWNvbnNbaV0gPSBCaXRtYXAuY3JlYXRlQml0bWFwKHRoaXMudGlja2VySWNvbnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIHRoYXQuY29udGVudFZpZXcgPSB0aGlzLmNvbnRlbnRWaWV3LmNsb25lKCk7CiAgICAgICAgIH0KQEAgLTQyNyw2ICs1MDMsMzIgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBhcmNlbC53cml0ZUludCgwKTsKICAgICAgICAgfQorICAgICAgICBpZiAodGlja2VyVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDEpOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwodGlja2VyVGl0bGUsIHBhcmNlbCwgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIGlmICh0aWNrZXJTdWJ0aXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbCh0aWNrZXJTdWJ0aXRsZSwgcGFyY2VsLCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRpY2tlckljb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gdGlja2VySWNvbnMubGVuZ3RoOworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KE4pOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0aWNrZXJJY29uc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmNlbC53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICAgICAgdGlja2VySWNvbnNbaV0ud3JpdGVUb1BhcmNlbChwYXJjZWwsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KC0xKTsKKyAgICAgICAgfQogICAgICAgICBpZiAoY29udGVudFZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDEpOwogICAgICAgICAgICAgY29udGVudFZpZXcud3JpdGVUb1BhcmNlbChwYXJjZWwsIDApOwpAQCAtNTQzLDYgKzY0NSw5IEBACiAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoaXMuZGVmYXVsdHMpKTsKICAgICAgICAgc2IuYXBwZW5kKCIsZmxhZ3M9MHgiKTsKICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcodGhpcy5mbGFncykpOworICAgICAgICBpZiAoKHRoaXMuZmxhZ3MgJiBGTEFHX0hJR0hfUFJJT1JJVFkpICE9IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiISEhMSFvbmUhIik7CisgICAgICAgIH0KICAgICAgICAgc2IuYXBwZW5kKCIpIik7CiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Qcm9ncmVzc0RpYWxvZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1Byb2dyZXNzRGlhbG9nLmphdmEKaW5kZXggYmRlYTA2OS4uMDdhNWEyMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1Byb2dyZXNzRGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1Byb2dyZXNzRGlhbG9nLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNzMsNyArNzQsMTAgQEAKICAgICBwcml2YXRlIEhhbmRsZXIgbVZpZXdVcGRhdGVIYW5kbGVyOwogICAgIAogICAgIHB1YmxpYyBQcm9ncmVzc0RpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCk7CisgICAgICAgIHRoaXMoY29udGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUIKKyAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfSG9sb19EaWFsb2dfQWxlcnQKKyAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRGlhbG9nX0FsZXJ0KTsKICAgICB9CiAKICAgICBwdWJsaWMgUHJvZ3Jlc3NEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2cuamF2YQppbmRleCAxZjExNWU4Li4xODYwMmRmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VhcmNoRGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaERpYWxvZy5qYXZhCkBAIC0xMDgzLDcgKzEwODMsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaFF1ZXJ5U2VhcmNoKGludCBhY3Rpb25LZXksIFN0cmluZyBhY3Rpb25Nc2cpICB7CiAgICAgICAgIFN0cmluZyBxdWVyeSA9IG1TZWFyY2hBdXRvQ29tcGxldGUuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CiAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBJbnRlbnQuQUNUSU9OX1NFQVJDSDsKLSAgICAgICAgSW50ZW50IGludGVudCA9IGNyZWF0ZUludGVudChhY3Rpb24sIG51bGwsIG51bGwsIHF1ZXJ5LCBudWxsLAorICAgICAgICBJbnRlbnQgaW50ZW50ID0gY3JlYXRlSW50ZW50KGFjdGlvbiwgbnVsbCwgbnVsbCwgcXVlcnksCiAgICAgICAgICAgICAgICAgYWN0aW9uS2V5LCBhY3Rpb25Nc2cpOwogICAgICAgICBsYXVuY2hJbnRlbnQoaW50ZW50KTsKICAgICB9CkBAIC0xMTg1LDExICsxMTg1LDYgQEAKICAgICAgICAgICAgIC8vIHVzZSBzcGVjaWZpYyBhY3Rpb24gaWYgc3VwcGxpZWQsIG9yIGRlZmF1bHQgYWN0aW9uIGlmIHN1cHBsaWVkLCBvciBmaXhlZCBkZWZhdWx0CiAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gZ2V0Q29sdW1uU3RyaW5nKGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0FDVElPTik7CiAKLSAgICAgICAgICAgIC8vIHNvbWUgaXRlbXMgYXJlIGRpc3BsYXkgb25seSwgb3IgaGF2ZSBlZmZlY3QgdmlhIHRoZSBjdXJzb3IgcmVzcG9uZCBjbGljayByZXBvcnRpbmcuCi0gICAgICAgICAgICBpZiAoU2VhcmNoTWFuYWdlci5JTlRFTlRfQUNUSU9OX05PTkUuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYWN0aW9uID0gbVNlYXJjaGFibGUuZ2V0U3VnZ2VzdEludGVudEFjdGlvbigpOwogICAgICAgICAgICAgfQpAQCAtMTIxMSwxNCArMTIwNiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgVXJpIGRhdGFVcmkgPSAoZGF0YSA9PSBudWxsKSA/IG51bGwgOiBVcmkucGFyc2UoZGF0YSk7CiAKLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gZ2V0Q29sdW1uU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBjLCBTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lOVEVOVF9DT01QT05FTlRfTkFNRSk7Ci0KICAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldENvbHVtblN0cmluZyhjLCBTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1FVRVJZKTsKICAgICAgICAgICAgIFN0cmluZyBleHRyYURhdGEgPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfRVhUUkFfREFUQSk7CiAKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnQoYWN0aW9uLCBkYXRhVXJpLCBleHRyYURhdGEsIHF1ZXJ5LCBjb21wb25lbnROYW1lLCBhY3Rpb25LZXksCi0gICAgICAgICAgICAgICAgICAgIGFjdGlvbk1zZyk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50KGFjdGlvbiwgZGF0YVVyaSwgZXh0cmFEYXRhLCBxdWVyeSwgYWN0aW9uS2V5LCBhY3Rpb25Nc2cpOwogICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUgKSB7CiAgICAgICAgICAgICBpbnQgcm93TnVtOwogICAgICAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIHJlYWxseSBwYXJhbm9pZCBub3cKQEAgLTEyMzksNyArMTIzMCw2IEBACiAgICAgICogQHBhcmFtIGRhdGEgSW50ZW50IGRhdGEsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICAqIEBwYXJhbSBleHRyYURhdGEgRGF0YSBmb3Ige0BsaW5rIFNlYXJjaE1hbmFnZXIjRVhUUkFfREFUQV9LRVl9IG9yIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICAqIEBwYXJhbSBxdWVyeSBJbnRlbnQgcXVlcnksIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBjb21wb25lbnROYW1lIERhdGEgZm9yIHtAbGluayBTZWFyY2hNYW5hZ2VyI0NPTVBPTkVOVF9OQU1FX0tFWX0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICogQHBhcmFtIGFjdGlvbktleSBUaGUga2V5IGNvZGUgb2YgdGhlIGFjdGlvbiBrZXkgdGhhdCB3YXMgcHJlc3NlZCwKICAgICAgKiAgICAgICAgb3Ige0BsaW5rIEtleUV2ZW50I0tFWUNPREVfVU5LTk9XTn0gaWYgbm9uZS4KICAgICAgKiBAcGFyYW0gYWN0aW9uTXNnIFRoZSBtZXNzYWdlIGZvciB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLApAQCAtMTI0OSw3ICsxMjM5LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBpbnRlbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBJbnRlbnQgY3JlYXRlSW50ZW50KFN0cmluZyBhY3Rpb24sIFVyaSBkYXRhLCBTdHJpbmcgZXh0cmFEYXRhLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSwgaW50IGFjdGlvbktleSwgU3RyaW5nIGFjdGlvbk1zZykgeworICAgICAgICAgICAgaW50IGFjdGlvbktleSwgU3RyaW5nIGFjdGlvbk1zZykgewogICAgICAgICAvLyBOb3cgYnVpbGQgdGhlIEludGVudAogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZWFyY2hNYW5hZ2VyLmphdmEKaW5kZXggMmU5Y2Q5Ni4uNjcxNTAxMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VhcmNoTWFuYWdlci5qYXZhCkBAIC0xNiwxNiArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcDsKIAotaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKQEAgLTQwLDcgKzM2LDcgQEAKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc3lzdGVtIHNlYXJjaCBzZXJ2aWNlcy4KLSAqIAorICoKICAqIDxwPkluIHByYWN0aWNlLCB5b3Ugd29uJ3QgaW50ZXJhY3Qgd2l0aCB0aGlzIGNsYXNzIGRpcmVjdGx5LCBhcyBzZWFyY2gKICAqIHNlcnZpY2VzIGFyZSBwcm92aWRlZCB0aHJvdWdoIG1ldGhvZHMgaW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IEFjdGl2aXR5fQogICogYW5kIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNBQ1RJT05fU0VBUkNIIEFDVElPTl9TRUFSQ0h9CkBAIC01Niw3ICs1Miw3IEBACiAgKiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3NlYXJjaC9pbmRleC5odG1sIj5TZWFyY2g8L2E+PC9zdHJvbmc+LjwvcD4KICAqIDwvZGl2PgogICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoTWFuYWdlciAKK3B1YmxpYyBjbGFzcyBTZWFyY2hNYW5hZ2VyCiAgICAgICAgIGltcGxlbWVudHMgRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyLCBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcgogewogCkBAIC02NSwyMCArNjEsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFRoaXMgaXMgYSBzaG9ydGN1dCBkZWZpbml0aW9uIGZvciB0aGUgZGVmYXVsdCBtZW51IGtleSB0byB1c2UgZm9yIGludm9raW5nIHNlYXJjaC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIFNlZSBNZW51Lkl0ZW0uc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIE1FTlVfS0VZID0gJ3MnOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBhIHNob3J0Y3V0IGRlZmluaXRpb24gZm9yIHRoZSBkZWZhdWx0IG1lbnUga2V5IHRvIHVzZSBmb3IgaW52b2tpbmcgc2VhcmNoLgotICAgICAqIAorICAgICAqCiAgICAgICogU2VlIE1lbnUuSXRlbS5zZXRBbHBoYWJldGljU2hvcnRjdXQoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRU5VX0tFWUNPREUgPSBLZXlFdmVudC5LRVlDT0RFX1M7CiAKICAgICAvKioKLSAgICAgKiBJbnRlbnQgZXh0cmEgZGF0YSBrZXk6IFVzZSB0aGlzIGtleSB3aXRoIAorICAgICAqIEludGVudCBleHRyYSBkYXRhIGtleTogVXNlIHRoaXMga2V5IHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNnZXRTdHJpbmdFeHRyYQogICAgICAqICBjb250ZW50LkludGVudC5nZXRTdHJpbmdFeHRyYSgpfQogICAgICAqIHRvIG9idGFpbiB0aGUgcXVlcnkgc3RyaW5nIGZyb20gSW50ZW50LkFDVElPTl9TRUFSQ0guCkBAIC0xMDMsNyArOTksNyBAQAogICAgICAqIEludGVudCBleHRyYSBkYXRhIGtleTogVXNlIHRoaXMga2V5IHdpdGggSW50ZW50LkFDVElPTl9TRUFSQ0ggYW5kCiAgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjZ2V0QnVuZGxlRXh0cmEKICAgICAgKiAgY29udGVudC5JbnRlbnQuZ2V0QnVuZGxlRXh0cmEoKX0KLSAgICAgKiB0byBvYnRhaW4gYW55IGFkZGl0aW9uYWwgYXBwLXNwZWNpZmljIGRhdGEgdGhhdCB3YXMgaW5zZXJ0ZWQgYnkgdGhlIAorICAgICAqIHRvIG9idGFpbiBhbnkgYWRkaXRpb25hbCBhcHAtc3BlY2lmaWMgZGF0YSB0aGF0IHdhcyBpbnNlcnRlZCBieSB0aGUKICAgICAgKiBhY3Rpdml0eSB0aGF0IGxhdW5jaGVkIHRoZSBzZWFyY2guCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVBQX0RBVEEgPSAiYXBwX2RhdGEiOwpAQCAtMTI3LDcgKzEyMyw3IEBACiAgICAgICogZmlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fS0VZID0gImFjdGlvbl9rZXkiOwotICAgIAorCiAgICAgLyoqCiAgICAgICogSW50ZW50IGV4dHJhIGRhdGEga2V5OiBUaGlzIGtleSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBleHRyYSBwb3B1bGF0ZWQgYnkgdGhlCiAgICAgICoge0BsaW5rICNTVUdHRVNUX0NPTFVNTl9JTlRFTlRfRVhUUkFfREFUQX0gY29sdW1uLgpAQCAtMTUzLDExICsxNDksMTkgQEAKICAgICAgKiBJbnRlbnQgZXh0cmEgZGF0YSBrZXk6IFVzZSB0aGlzIGtleSB3aXRoIEludGVudC5BQ1RJT05fU0VBUkNIIGFuZAogICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I2dldFN0cmluZ0V4dHJhIGNvbnRlbnQuSW50ZW50LmdldFN0cmluZ0V4dHJhKCl9CiAgICAgICogdG8gb2J0YWluIHRoZSBhY3Rpb24gbWVzc2FnZSB0aGF0IHdhcyBkZWZpbmVkIGZvciBhIHBhcnRpY3VsYXIgc2VhcmNoIGFjdGlvbiBrZXkgYW5kL29yCi0gICAgICogc3VnZ2VzdGlvbi4gIEl0IHdpbGwgYmUgbnVsbCBpZiB0aGUgc2VhcmNoIHdhcyBsYXVuY2hlZCBieSB0eXBpbmcgImVudGVyIiwgdG91Y2hlZCB0aGUgdGhlIAotICAgICAqICJHTyIgYnV0dG9uLCBvciBvdGhlciBtZWFucyBub3QgaW52b2x2aW5nIGFueSBhY3Rpb24ga2V5LiAKKyAgICAgKiBzdWdnZXN0aW9uLiAgSXQgd2lsbCBiZSBudWxsIGlmIHRoZSBzZWFyY2ggd2FzIGxhdW5jaGVkIGJ5IHR5cGluZyAiZW50ZXIiLCB0b3VjaGVkIHRoZSB0aGUKKyAgICAgKiAiR08iIGJ1dHRvbiwgb3Igb3RoZXIgbWVhbnMgbm90IGludm9sdmluZyBhbnkgYWN0aW9uIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTVNHID0gImFjdGlvbl9tc2ciOwotICAgIAorCisgICAgLyoqCisgICAgICogRmxhZyB0byBzcGVjaWZ5IHRoYXQgdGhlIGVudHJ5IGNhbiBiZSB1c2VkIGZvciBxdWVyeSByZWZpbmVtZW50LCBpLmUuLCB0aGUgcXVlcnkgdGV4dAorICAgICAqIGluIHRoZSBzZWFyY2ggZmllbGQgY2FuIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRleHQgaW4gdGhpcyBlbnRyeSwgd2hlbiBhIHF1ZXJ5IHJlZmluZW1lbnQKKyAgICAgKiBpY29uIGlzIGNsaWNrZWQuIFRoZSBzdWdnZXN0aW9uIGxpc3Qgc2hvdWxkIHNob3cgc3VjaCBhIGNsaWNrYWJsZSBpY29uIGJlc2lkZSB0aGUgZW50cnkuCisgICAgICogPHA+VXNlIHRoaXMgZmxhZyBhcyBhIGJpdC1maWVsZCBmb3Ige0BsaW5rICNTVUdHRVNUX0NPTFVNTl9GTEFHU30uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRkxBR19RVUVSWV9SRUZJTkVNRU5UID0gMSA8PCAwOworCiAgICAgLyoqCiAgICAgICogVXJpIHBhdGggZm9yIHF1ZXJpZWQgc3VnZ2VzdGlvbnMgZGF0YS4gIFRoaXMgaXMgdGhlIHBhdGggdGhhdCB0aGUgc2VhcmNoIG1hbmFnZXIKICAgICAgKiB3aWxsIHVzZSB3aGVuIHF1ZXJ5aW5nIHlvdXIgY29udGVudCBwcm92aWRlciBmb3Igc3VnZ2VzdGlvbnMgZGF0YSBiYXNlZCBvbiB1c2VyIGlucHV0CkBAIC0xODIsMTIgKzE4NiwxMiBAQAogICAgICAqIEBzZWUgI1NVR0dFU1RfQ09MVU1OX1NIT1JUQ1VUX0lECiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9VUklfUEFUSF9TSE9SVENVVCA9ICJzZWFyY2hfc3VnZ2VzdF9zaG9ydGN1dCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNSU1FIHR5cGUgZm9yIHNob3J0Y3V0IHZhbGlkYXRpb24uICBZb3UnbGwgdXNlIHRoaXMgaW4geW91ciBzdWdnZXN0aW9ucyBjb250ZW50IHByb3ZpZGVyCiAgICAgICogaW4gdGhlIGdldFR5cGUoKSBmdW5jdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTSE9SVENVVF9NSU1FX1RZUEUgPSAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTSE9SVENVVF9NSU1FX1RZUEUgPQogICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3ZuZC5hbmRyb2lkLnNlYXJjaC5zdWdnZXN0IjsKIAogICAgIC8qKgpAQCAtMTk1LDcgKzE5OSw3IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fRk9STUFUID0gInN1Z2dlc3RfZm9ybWF0IjsKICAgICAvKioKLSAgICAgKiBDb2x1bW4gbmFtZSBmb3Igc3VnZ2VzdGlvbnMgY3Vyc29yLiAgPGk+UmVxdWlyZWQuPC9pPiAgVGhpcyBpcyB0aGUgcHJpbWFyeSBsaW5lIG9mIHRleHQgdGhhdCAKKyAgICAgKiBDb2x1bW4gbmFtZSBmb3Igc3VnZ2VzdGlvbnMgY3Vyc29yLiAgPGk+UmVxdWlyZWQuPC9pPiAgVGhpcyBpcyB0aGUgcHJpbWFyeSBsaW5lIG9mIHRleHQgdGhhdAogICAgICAqIHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFzIHRoZSBzdWdnZXN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVR0dFU1RfQ09MVU1OX1RFWFRfMSA9ICJzdWdnZXN0X3RleHRfMSI7CkBAIC0yMjcsOCArMjMxLDggQEAKICAgICAgKiA8bGk+ZmlsZSAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0ZJTEV9KTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgotICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZyl9IAotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHNjaGVtZXMuIAorICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZyl9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2Ugc2NoZW1lcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUdHRVNUX0NPTFVNTl9JQ09OXzEgPSAic3VnZ2VzdF9pY29uXzEiOwogICAgIC8qKgpAQCAtMjQzLDggKzI0Nyw4IEBACiAgICAgICogPGxpPmZpbGUgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9GSUxFfSk8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICoKLSAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcpfSAKLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzY2hlbWVzLiAKKyAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcpfQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHNjaGVtZXMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fSUNPTl8yID0gInN1Z2dlc3RfaWNvbl8yIjsKICAgICAvKioKQEAgLTI3NiwxMiArMjgwLDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUdHRVNUX0NPTFVNTl9JTlRFTlRfRVhUUkFfREFUQSA9ICJzdWdnZXN0X2ludGVudF9leHRyYV9kYXRhIjsKICAgICAvKioKLSAgICAgKiBUT0RPOiBSZW1vdmUKLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fSU5URU5UX0NPTVBPTkVOVF9OQU1FID0gInN1Z2dlc3RfaW50ZW50X2NvbXBvbmVudCI7Ci0gICAgLyoqCiAgICAgICogQ29sdW1uIG5hbWUgZm9yIHN1Z2dlc3Rpb25zIGN1cnNvci4gIDxpPk9wdGlvbmFsLjwvaT4gIElmIHRoaXMgY29sdW1uIGV4aXN0cyA8aT5hbmQ8L2k+CiAgICAgICogdGhpcyBlbGVtZW50IGV4aXN0cyBhdCB0aGUgZ2l2ZW4gcm93LCB0aGVuICIvIiBhbmQgdGhpcyB2YWx1ZSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBkYXRhCiAgICAgICogZmllbGQgaW4gdGhlIEludGVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUgZGF0YSBmaWVsZCBoYXMgYWxyZWFkeSBiZWVuIHNldCB0byBhbgpAQCAtMjg5LDggKzI4Nyw4IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fSU5URU5UX0RBVEFfSUQgPSAic3VnZ2VzdF9pbnRlbnRfZGF0YV9pZCI7CiAgICAgLyoqCi0gICAgICogQ29sdW1uIG5hbWUgZm9yIHN1Z2dlc3Rpb25zIGN1cnNvci4gIDxpPlJlcXVpcmVkIGlmIGFjdGlvbiBpcyAKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNBQ1RJT05fU0VBUkNIIEFDVElPTl9TRUFSQ0h9LCBvcHRpb25hbCBvdGhlcndpc2UuPC9pPiAgSWYgdGhpcyAKKyAgICAgKiBDb2x1bW4gbmFtZSBmb3Igc3VnZ2VzdGlvbnMgY3Vyc29yLiAgPGk+UmVxdWlyZWQgaWYgYWN0aW9uIGlzCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjQUNUSU9OX1NFQVJDSCBBQ1RJT05fU0VBUkNIfSwgb3B0aW9uYWwgb3RoZXJ3aXNlLjwvaT4gIElmIHRoaXMKICAgICAgKiBjb2x1bW4gZXhpc3RzIDxpPmFuZDwvaT4gdGhpcyBlbGVtZW50IGV4aXN0cyBhdCB0aGUgZ2l2ZW4gcm93LCB0aGlzIGlzIHRoZSBkYXRhIHRoYXQgd2lsbCBiZQogICAgICAqIHVzZWQgd2hlbiBmb3JtaW5nIHRoZSBzdWdnZXN0aW9uJ3MgcXVlcnkuCiAgICAgICovCkBAIC0zMDcsMTUgKzMwNSw2IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fU0hPUlRDVVRfSUQgPSAic3VnZ2VzdF9zaG9ydGN1dF9pZCI7CiAKICAgICAvKioKLSAgICAgKiBDb2x1bW4gbmFtZSBmb3Igc3VnZ2VzdGlvbnMgY3Vyc29yLiA8aT5PcHRpb25hbC48L2k+ICBUaGlzIGNvbHVtbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICogY3Vyc29yIGl0ZW0ncyBiYWNrZ3JvdW5kIGNvbG9yIGlmIGl0IG5lZWRzIGEgbm9uLWRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci4gQSBub24temVybyB2YWx1ZQotICAgICAqIGluZGljYXRlcyBhIHZhbGlkIGJhY2tncm91bmQgY29sb3IgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAaGlkZSBGb3IgaW50ZXJuYWwgdXNlLCBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUdHRVNUX0NPTFVNTl9CQUNLR1JPVU5EX0NPTE9SID0gInN1Z2dlc3RfYmFja2dyb3VuZF9jb2xvciI7Ci0gICAgCi0gICAgLyoqCiAgICAgICogQ29sdW1uIG5hbWUgZm9yIHN1Z2dlc3Rpb25zIGN1cnNvci4gPGk+T3B0aW9uYWwuPC9pPiBUaGlzIGNvbHVtbiBpcyB1c2VkIHRvIHNwZWNpZnkKICAgICAgKiB0aGF0IGEgc3Bpbm5lciBzaG91bGQgYmUgc2hvd24gaW4gbGlldSBvZiBhbiBpY29uMiB3aGlsZSB0aGUgc2hvcnRjdXQgb2YgdGhpcyBzdWdnZXN0aW9uCiAgICAgICogaXMgYmVpbmcgcmVmcmVzaGVkLgpAQCAtMzI0LDYgKzMxMywxNSBAQAogICAgICAgICAgICAgInN1Z2dlc3Rfc3Bpbm5lcl93aGlsZV9yZWZyZXNoaW5nIjsKIAogICAgIC8qKgorICAgICAqIENvbHVtbiBuYW1lIGZvciBzdWdnZXN0aW9ucyBjdXJzb3IuIDxpPk9wdGlvbmFsLjwvaT4gVGhpcyBjb2x1bW4gaXMgdXNlZCB0byBzcGVjaWZ5CisgICAgICogYWRkaXRpb25hbCBmbGFncyBwZXIgaXRlbS4gTXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHNwZWNpZmllZC4KKyAgICAgKiA8cD4KKyAgICAgKiBNdXN0IGJlIG9uZSBvZiB7QGxpbmsgI0ZMQUdfUVVFUllfUkVGSU5FTUVOVH0gb3IgMCB0byBpbmRpY2F0ZSBubyBmbGFncy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fRkxBR1MgPSAic3VnZ2VzdF9mbGFncyI7CisKKyAgICAvKioKICAgICAgKiBDb2x1bW4gdmFsdWUgZm9yIHN1Z2dlc3Rpb24gY29sdW1uIHtAbGluayAjU1VHR0VTVF9DT0xVTU5fU0hPUlRDVVRfSUR9IHdoZW4gYSBzdWdnZXN0aW9uCiAgICAgICogc2hvdWxkIG5vdCBiZSBzdG9yZWQgYXMgYSBzaG9ydGN1dCBpbiBnbG9iYWwgc2VhcmNoLgogICAgICAqLwpAQCAtMzQzLDE2ICszNDEsMTYgQEAKICAgICAgKiB7QGxpbmsgI0VYVFJBX1NFTEVDVF9RVUVSWX0sCiAgICAgICoge0BsaW5rICNBUFBfREFUQX0uCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URU5UX0FDVElPTl9HTE9CQUxfU0VBUkNIIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVEVOVF9BQ1RJT05fR0xPQkFMX1NFQVJDSAogICAgICAgICAgICAgPSAiYW5kcm9pZC5zZWFyY2guYWN0aW9uLkdMT0JBTF9TRUFSQ0giOwotICAgIAorCiAgICAgLyoqCiAgICAgICogSW50ZW50IGFjdGlvbiBmb3Igc3RhcnRpbmcgdGhlIGdsb2JhbCBzZWFyY2ggc2V0dGluZ3MgYWN0aXZpdHkuCiAgICAgICogVGhlIGdsb2JhbCBzZWFyY2ggcHJvdmlkZXIgc2hvdWxkIGhhbmRsZSB0aGlzIGludGVudC4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFTlRfQUNUSU9OX1NFQVJDSF9TRVRUSU5HUyAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFTlRfQUNUSU9OX1NFQVJDSF9TRVRUSU5HUwogICAgICAgICAgICAgPSAiYW5kcm9pZC5zZWFyY2guYWN0aW9uLlNFQVJDSF9TRVRUSU5HUyI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnRlbnQgYWN0aW9uIGZvciBzdGFydGluZyBhIHdlYiBzZWFyY2ggcHJvdmlkZXIncyBzZXR0aW5ncyBhY3Rpdml0eS4KICAgICAgKiBXZWIgc2VhcmNoIHByb3ZpZGVycyBzaG91bGQgaGFuZGxlIHRoaXMgaW50ZW50IGlmIHRoZXkgaGF2ZSBwcm92aWRlci1zcGVjaWZpYwpAQCAtMzY4LDcgKzM2Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URU5UX0FDVElPTl9TRUFSQ0hBQkxFU19DSEFOR0VECiAgICAgICAgICAgICA9ICJhbmRyb2lkLnNlYXJjaC5hY3Rpb24uU0VBUkNIQUJMRVNfQ0hBTkdFRCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnRlbnQgYWN0aW9uIGJyb2FkY2FzdGVkIHRvIGluZm9ybSB0aGF0IHRoZSBzZWFyY2ggc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkIGluIHNvbWUgd2F5LgogICAgICAqIEVpdGhlciBzZWFyY2hhYmxlcyBoYXZlIGJlZW4gZW5hYmxlZCBvciBkaXNhYmxlZCwgb3IgYSBkaWZmZXJlbnQgd2ViIHNlYXJjaCBwcm92aWRlcgpAQCAtMzc4LDE0ICszNzYsNiBAQAogICAgICAgICAgICAgPSAiYW5kcm9pZC5zZWFyY2guYWN0aW9uLlNFVFRJTkdTX0NIQU5HRUQiOwogCiAgICAgLyoqCi0gICAgICogSWYgYSBzdWdnZXN0aW9uIGhhcyB0aGlzIHZhbHVlIGluIHtAbGluayAjU1VHR0VTVF9DT0xVTU5fSU5URU5UX0FDVElPTn0sCi0gICAgICogdGhlIHNlYXJjaCBkaWFsb2cgd2lsbCB0YWtlIG5vIGFjdGlvbi4KLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URU5UX0FDVElPTl9OT05FID0gImFuZHJvaWQuc2VhcmNoLmFjdGlvbi5aSUxDSCI7Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgY29udGV4dCBpcyB2b2ljZSwgYW5kIHRoZXJlZm9yZSB0aGUgU2VhcmNoRGlhbG9nIHNob3VsZAogICAgICAqIGNvbnRpbnVlIHNob3dpbmcgdGhlIG1pY3JvcGhvbmUgdW50aWwgdGhlIHVzZXIgaW5kaWNhdGVzIHRoYXQgaGUvc2hlIGRvZXMKICAgICAgKiBub3Qgd2FudCB0byByZS1zcGVhayAoZS5nLiBieSB0eXBpbmcpLgpAQCAtNDEzLDcgKzQwMyw3IEBACiAgICAgICogVGhlIHBhY2thZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VhY2ggbWFuYWdlci4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBtQXNzb2NpYXRlZFBhY2thZ2U7Ci0gICAgCisKICAgICAvLyBwYWNrYWdlIHByaXZhdGUgc2luY2UgdGhleSBhcmUgdXNlZCBieSB0aGUgaW5uZXIgY2xhc3MgU2VhcmNoTWFuYWdlckNhbGxiYWNrCiAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwogICAgIC8qIHBhY2thZ2UgKi8gT25EaXNtaXNzTGlzdGVuZXIgbURpc21pc3NMaXN0ZW5lciA9IG51bGw7CkBAIC00MjcsMTUgKzQxNywxNSBAQAogICAgICAgICBtU2VydmljZSA9IElTZWFyY2hNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFKSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTGF1bmNoIHNlYXJjaCBVSS4KICAgICAgKgogICAgICAqIDxwPlRoZSBzZWFyY2ggbWFuYWdlciB3aWxsIG9wZW4gYSBzZWFyY2ggd2lkZ2V0IGluIGFuIG92ZXJsYXBwaW5nCi0gICAgICogd2luZG93LCBhbmQgdGhlIHVuZGVybHlpbmcgYWN0aXZpdHkgbWF5IGJlIG9ic2N1cmVkLiAgVGhlIHNlYXJjaCAKKyAgICAgKiB3aW5kb3csIGFuZCB0aGUgdW5kZXJseWluZyBhY3Rpdml0eSBtYXkgYmUgb2JzY3VyZWQuICBUaGUgc2VhcmNoCiAgICAgICogZW50cnkgc3RhdGUgd2lsbCByZW1haW4gaW4gZWZmZWN0IHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50czoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgc2VhcmNoLiAgSW4gbW9zdCBjYXNlcyB0aGlzIHdpbGwgbGF1bmNoIAorICAgICAqIDxsaT5UaGUgdXNlciBjb21wbGV0ZXMgdGhlIHNlYXJjaC4gIEluIG1vc3QgY2FzZXMgdGhpcyB3aWxsIGxhdW5jaAogICAgICAqIGEgc2VhcmNoIGludGVudC48L2xpPgogICAgICAqIDxsaT5UaGUgdXNlciB1c2VzIHRoZSBiYWNrLCBob21lLCBvciBvdGhlciBrZXlzIHRvIGV4aXQgdGhlIHNlYXJjaC48L2xpPgogICAgICAqIDxsaT5UaGUgYXBwbGljYXRpb24gY2FsbHMgdGhlIHtAbGluayAjc3RvcFNlYXJjaH0KQEAgLTQ0Myw4ICs0MzMsOCBAQAogICAgICAqIGFjdGl2aXR5IGZyb20gd2hpY2ggaXQgd2FzIGxhdW5jaGVkLjwvbGk+CiAgICAgICoKICAgICAgKiA8cD5Nb3N0IGFwcGxpY2F0aW9ucyB3aWxsIDxpPm5vdDwvaT4gdXNlIHRoaXMgaW50ZXJmYWNlIHRvIGludm9rZSBzZWFyY2guCi0gICAgICogVGhlIHByaW1hcnkgbWV0aG9kIGZvciBpbnZva2luZyBzZWFyY2ggaXMgdG8gY2FsbCAKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TZWFyY2hSZXF1ZXN0ZWQgQWN0aXZpdHkub25TZWFyY2hSZXF1ZXN0ZWQoKX0gb3IgCisgICAgICogVGhlIHByaW1hcnkgbWV0aG9kIGZvciBpbnZva2luZyBzZWFyY2ggaXMgdG8gY2FsbAorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNlYXJjaFJlcXVlc3RlZCBBY3Rpdml0eS5vblNlYXJjaFJlcXVlc3RlZCgpfSBvcgogICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzdGFydFNlYXJjaCBBY3Rpdml0eS5zdGFydFNlYXJjaCgpfS4KICAgICAgKgogICAgICAqIEBwYXJhbSBpbml0aWFsUXVlcnkgQSBzZWFyY2ggc3RyaW5nIGNhbiBiZSBwcmUtZW50ZXJlZCBoZXJlLCBidXQgdGhpcwpAQCAtNDU2LDE5ICs0NDYsMTkgQEAKICAgICAgKiBhbmQgdGhlIHVzZXIgd291bGQgZXhwZWN0IHRvIGJlIGFibGUgdG8ga2VlcCB0eXBpbmcuICA8aT5UaGlzIHBhcmFtZXRlciBpcyBvbmx5IG1lYW5pbmdmdWwKICAgICAgKiBpZiBpbml0aWFsUXVlcnkgaXMgYSBub24tZW1wdHkgc3RyaW5nLjwvaT4KICAgICAgKiBAcGFyYW0gbGF1bmNoQWN0aXZpdHkgVGhlIENvbXBvbmVudE5hbWUgb2YgdGhlIGFjdGl2aXR5IHRoYXQgaGFzIGxhdW5jaGVkIHRoaXMgc2VhcmNoLgotICAgICAqIEBwYXJhbSBhcHBTZWFyY2hEYXRhIEFuIGFwcGxpY2F0aW9uIGNhbiBpbnNlcnQgYXBwbGljYXRpb24tc3BlY2lmaWMgCi0gICAgICogY29udGV4dCBoZXJlLCBpbiBvcmRlciB0byBpbXByb3ZlIHF1YWxpdHkgb3Igc3BlY2lmaWNpdHkgb2YgaXRzIG93biAKKyAgICAgKiBAcGFyYW0gYXBwU2VhcmNoRGF0YSBBbiBhcHBsaWNhdGlvbiBjYW4gaW5zZXJ0IGFwcGxpY2F0aW9uLXNwZWNpZmljCisgICAgICogY29udGV4dCBoZXJlLCBpbiBvcmRlciB0byBpbXByb3ZlIHF1YWxpdHkgb3Igc3BlY2lmaWNpdHkgb2YgaXRzIG93bgogICAgICAqIHNlYXJjaGVzLiAgVGhpcyBkYXRhIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBTRUFSQ0ggaW50ZW50KHMpLiAgTnVsbCBpZgogICAgICAqIG5vIGV4dHJhIGRhdGEgaXMgcmVxdWlyZWQuCiAgICAgICogQHBhcmFtIGdsb2JhbFNlYXJjaCBJZiBmYWxzZSwgdGhpcyB3aWxsIG9ubHkgbGF1bmNoIHRoZSBzZWFyY2ggdGhhdCBoYXMgYmVlbiBzcGVjaWZpY2FsbHkKLSAgICAgKiBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAod2hpY2ggaXMgdXN1YWxseSBkZWZpbmVkIGFzIGEgbG9jYWwgc2VhcmNoKS4gIElmIG5vIGRlZmF1bHQgCisgICAgICogZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24gKHdoaWNoIGlzIHVzdWFsbHkgZGVmaW5lZCBhcyBhIGxvY2FsIHNlYXJjaCkuICBJZiBubyBkZWZhdWx0CiAgICAgICogc2VhcmNoIGlzIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gb3IgYWN0aXZpdHksIGdsb2JhbCBzZWFyY2ggd2lsbCBiZSBsYXVuY2hlZC4KICAgICAgKiBJZiB0cnVlLCB0aGlzIHdpbGwgYWx3YXlzIGxhdW5jaCBhIHBsYXRmb3JtLWdsb2JhbCAoZS5nLiB3ZWItYmFzZWQpIHNlYXJjaCBpbnN0ZWFkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHNlZSBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNlYXJjaFJlcXVlc3RlZAogICAgICAqIEBzZWUgI3N0b3BTZWFyY2gKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlYXJjaChTdHJpbmcgaW5pdGlhbFF1ZXJ5LCAKKyAgICBwdWJsaWMgdm9pZCBzdGFydFNlYXJjaChTdHJpbmcgaW5pdGlhbFF1ZXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0SW5pdGlhbFF1ZXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgbGF1bmNoQWN0aXZpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGFwcFNlYXJjaERhdGEsCkBAIC01OTUsNyArNTg1LDcgQEAKICAgICAgKiA8cD5UeXBpY2FsbHkgdGhlIHVzZXIgd2lsbCB0ZXJtaW5hdGUgdGhlIHNlYXJjaCBVSSBieSBsYXVuY2hpbmcgYQogICAgICAqIHNlYXJjaCBvciBieSBjYW5jZWxpbmcuICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgdW5kZXJseWluZyBhcHBsaWNhdGlvbgogICAgICAqIG9yIGFjdGl2aXR5IHRvIGNhbmNlbCB0aGUgc2VhcmNoIHByZW1hdHVyZWx5IChmb3IgYW55IHJlYXNvbikuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGNhbiBiZSBzYWZlbHkgY2FsbGVkIGF0IGFueSB0aW1lIChldmVuIGlmIG5vIHNlYXJjaCBpcyBhY3RpdmUuKQogICAgICAqCiAgICAgICogQHNlZSAjc3RhcnRTZWFyY2gKQEAgLTYwNywxMiArNTk3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBTZWFyY2ggVUkgaXMgY3VycmVudGx5IGRpc3BsYXllZC4gIAotICAgICAqIAorICAgICAqIERldGVybWluZSBpZiB0aGUgU2VhcmNoIFVJIGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQuCisgICAgICoKICAgICAgKiBUaGlzIGlzIHByb3ZpZGVkIHByaW1hcmlseSBmb3IgYXBwbGljYXRpb24gdGVzdCBwdXJwb3Nlcy4KICAgICAgKgogICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWFyY2ggVUkgaXMgY3VycmVudGx5IGRpc3BsYXllZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewpAQCAtNjMxLDcgKzYyMSw3IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTZWUge0BsaW5rIFNlYXJjaE1hbmFnZXIjc2V0T25DYW5jZWxMaXN0ZW5lcn0gZm9yIGNvbmZpZ3VyaW5nIHlvdXIgYWN0aXZpdHkgdG8gbW9uaXRvcgogICAgICAqIHNlYXJjaCBVSSBzdGF0ZS4KQEAgLTY0Nyw3ICs2MzcsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IG9yIGNsZWFyIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciB0aGUgc2VhcmNoIFVJIGlzIGRpc21pc3NlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUge0BsaW5rIE9uRGlzbWlzc0xpc3RlbmVyfSB0byB1c2UsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T25EaXNtaXNzTGlzdGVuZXIoZmluYWwgT25EaXNtaXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsKQEAgLTY1Niw3ICs2NDYsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IG9yIGNsZWFyIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciB0aGUgc2VhcmNoIFVJIGlzIGNhbmNlbGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSB7QGxpbmsgT25DYW5jZWxMaXN0ZW5lcn0gdG8gdXNlLCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE9uQ2FuY2VsTGlzdGVuZXIoT25DYW5jZWxMaXN0ZW5lciBsaXN0ZW5lcikgewpAQCAtNzY3LDEwICs3NTcsMTAgQEAKICAgICAgICAgLy8gZmluYWxseSwgbWFrZSB0aGUgcXVlcnkKICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KHVyaSwgbnVsbCwgc2VsZWN0aW9uLCBzZWxBcmdzLCBudWxsKTsKICAgICB9Ci0gICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNlYXJjaGFibGUgYWN0aXZpdGllcyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBnbG9iYWwgc2VhcmNoLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBhIGxpc3QgY29udGFpbmluZyBzZWFyY2hhYmxlIGluZm9ybWF0aW9uIGZvciBhbGwgc2VhcmNoYWJsZSBhY3Rpdml0aWVzCiAgICAgICogICAgICAgICB0aGF0IGhhdmUgdGhlIDxjb2RlPmFuZHJvaWQ6aW5jbHVkZUluR2xvYmFsU2VhcmNoPC9jb2RlPiBhdHRyaWJ1dGUgc2V0CiAgICAgICogICAgICAgICBpbiB0aGVpciBzZWFyY2hhYmxlIG1ldGEtZGF0YS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TdGF0dXNCYXJNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU3RhdHVzQmFyTWFuYWdlci5qYXZhCmluZGV4IGRlNTQ0ZmIuLmZhN2Y3OTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TdGF0dXNCYXJNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1N0YXR1c0Jhck1hbmFnZXIuamF2YQpAQCAtNTUsNiArNTUsMTggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIgPSAweDAwMDAwMDA4OwogCiAgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNkaXNhYmxlfSB0byBoaWRlIHRoZSBjZW50ZXIgc3lzdGVtIGluZm8gYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBQkxFX1NZU1RFTV9JTkZPID0gMHgwMDAwMDAxMDsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjZGlzYWJsZX0gdG8gaGlkZSBvbmx5IHRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMuICBEb24ndCB1c2UgdGhpcworICAgICAqIHVubGVzcyB5b3UncmUgdGhlIHNldHVwIHdpemFyZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBQkxFX05BVklHQVRJT04gPSAweDAwMDAwMDIwOworCisKKyAgICAvKioKICAgICAgKiBSZS1lbmFibGUgYWxsIG9mIHRoZSBzdGF0dXMgYmFyIGZlYXR1cmVzIHRoYXQgeW91J3ZlIGRpc2FibGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVfTk9ORSA9IDB4MDAwMDAwMDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU3VnZ2VzdGlvbnNBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU3VnZ2VzdGlvbnNBZGFwdGVyLmphdmEKaW5kZXggOGQ4ODY0Zi4uNTcwNWJmZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1N1Z2dlc3Rpb25zQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TdWdnZXN0aW9uc0FkYXB0ZXIuamF2YQpAQCAtNjgsNyArNjgsNiBAQAogICAgIHByaXZhdGUgU2VhcmNoYWJsZUluZm8gbVNlYXJjaGFibGU7CiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Qcm92aWRlckNvbnRleHQ7CiAgICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxTdHJpbmcsIERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IG1PdXRzaWRlRHJhd2FibGVzQ2FjaGU7Ci0gICAgcHJpdmF0ZSBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBtQmFja2dyb3VuZHNDYWNoZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlZCA9IGZhbHNlOwogCiAgICAgLy8gVVJMIGNvbG9yCkBAIC04MCw3ICs3OSw2IEBACiAgICAgcHJpdmF0ZSBpbnQgbVRleHQyVXJsQ29sOwogICAgIHByaXZhdGUgaW50IG1JY29uTmFtZTFDb2w7CiAgICAgcHJpdmF0ZSBpbnQgbUljb25OYW1lMkNvbDsKLSAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yQ29sOwogCiAgICAgc3RhdGljIGZpbmFsIGludCBOT05FID0gLTE7CiAKQEAgLTEwOSw3ICsxMDcsNiBAQAogICAgICAgICBtUHJvdmlkZXJDb250ZXh0ID0gbVNlYXJjaGFibGUuZ2V0UHJvdmlkZXJDb250ZXh0KG1Db250ZXh0LCBhY3Rpdml0eUNvbnRleHQpOwogCiAgICAgICAgIG1PdXRzaWRlRHJhd2FibGVzQ2FjaGUgPSBvdXRzaWRlRHJhd2FibGVzQ2FjaGU7Ci0gICAgICAgIG1CYWNrZ3JvdW5kc0NhY2hlID0gbmV3IFNwYXJzZUFycmF5PERyYXdhYmxlLkNvbnN0YW50U3RhdGU+KCk7CiAKICAgICAgICAgbVN0YXJ0U3Bpbm5lclJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKQEAgLTI0Myw4ICsyNDAsNiBAQAogICAgICAgICAgICAgICAgIG1UZXh0MlVybENvbCA9IGMuZ2V0Q29sdW1uSW5kZXgoU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9URVhUXzJfVVJMKTsKICAgICAgICAgICAgICAgICBtSWNvbk5hbWUxQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lDT05fMSk7CiAgICAgICAgICAgICAgICAgbUljb25OYW1lMkNvbCA9IGMuZ2V0Q29sdW1uSW5kZXgoU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JQ09OXzIpOwotICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ29sb3JDb2wgPQotICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0JBQ0tHUk9VTkRfQ09MT1IpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImVycm9yIGNoYW5naW5nIGN1cnNvciBhbmQgY2FjaGluZyBjb2x1bW5zIiwgZSk7CkBAIC0yODMsMTMgKzI3OCw2IEBACiAgICAgcHVibGljIHZvaWQgYmluZFZpZXcoVmlldyB2aWV3LCBDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjdXJzb3IpIHsKICAgICAgICAgQ2hpbGRWaWV3Q2FjaGUgdmlld3MgPSAoQ2hpbGRWaWV3Q2FjaGUpIHZpZXcuZ2V0VGFnKCk7CiAKLSAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IDA7Ci0gICAgICAgIGlmIChtQmFja2dyb3VuZENvbG9yQ29sICE9IC0xKSB7Ci0gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBjdXJzb3IuZ2V0SW50KG1CYWNrZ3JvdW5kQ29sb3JDb2wpOwotICAgICAgICB9Ci0gICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBnZXRJdGVtQmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICB2aWV3LnNldEJhY2tncm91bmREcmF3YWJsZShiYWNrZ3JvdW5kKTsKLQogICAgICAgICBpZiAodmlld3MubVRleHQxICE9IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyB0ZXh0MSA9IGdldFN0cmluZ09yTnVsbChjdXJzb3IsIG1UZXh0MUNvbCk7CiAgICAgICAgICAgICBzZXRWaWV3VGV4dCh2aWV3cy5tVGV4dDEsIHRleHQxKTsKQEAgLTM0MiwzMyArMzMwLDYgQEAKICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGRyYXdhYmxlIHdpdGggbm8gY29sb3Igd2hlbiBzZWxlY3RlZCBvciBwcmVzc2VkLCBhbmQgdGhlIGdpdmVuIGNvbG9yIHdoZW4KLSAgICAgKiBuZWl0aGVyIHNlbGVjdGVkIG5vciBwcmVzc2VkLgotICAgICAqCi0gICAgICogQHJldHVybiBBIGRyYXdhYmxlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGdpdmVuIGNvbG9yIGlzIHRyYW5zcGFyZW50LgotICAgICAqLwotICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0SXRlbUJhY2tncm91bmQoaW50IGJhY2tncm91bmRDb2xvcikgewotICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWRCZyA9IG1CYWNrZ3JvdW5kc0NhY2hlLmdldChiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgaWYgKGNhY2hlZEJnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiQmFja2dyb3VuZCBjYWNoZSBoaXQgZm9yIGNvbG9yICIgKyBiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRCZy5uZXdEcmF3YWJsZShtUHJvdmlkZXJDb250ZXh0LmdldFJlc291cmNlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJDcmVhdGluZyBuZXcgYmFja2dyb3VuZCBmb3IgY29sb3IgIiArIGJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgICAgICBDb2xvckRyYXdhYmxlIHRyYW5zcGFyZW50ID0gbmV3IENvbG9yRHJhd2FibGUoMCk7Ci0gICAgICAgICAgICBDb2xvckRyYXdhYmxlIGJhY2tncm91bmQgPSBuZXcgQ29sb3JEcmF3YWJsZShiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgU3RhdGVMaXN0RHJhd2FibGUgbmV3QmcgPSBuZXcgU3RhdGVMaXN0RHJhd2FibGUoKTsKLSAgICAgICAgICAgIG5ld0JnLmFkZFN0YXRlKG5ldyBpbnRbXXthbmRyb2lkLlIuYXR0ci5zdGF0ZV9zZWxlY3RlZH0sIHRyYW5zcGFyZW50KTsKLSAgICAgICAgICAgIG5ld0JnLmFkZFN0YXRlKG5ldyBpbnRbXXthbmRyb2lkLlIuYXR0ci5zdGF0ZV9wcmVzc2VkfSwgdHJhbnNwYXJlbnQpOwotICAgICAgICAgICAgbmV3QmcuYWRkU3RhdGUobmV3IGludFtde30sIGJhY2tncm91bmQpOwotICAgICAgICAgICAgbUJhY2tncm91bmRzQ2FjaGUucHV0KGJhY2tncm91bmRDb2xvciwgbmV3QmcuZ2V0Q29uc3RhbnRTdGF0ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXdCZzsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3VGV4dChUZXh0VmlldyB2LCBDaGFyU2VxdWVuY2UgdGV4dCkgewogICAgICAgICAvLyBTZXQgdGhlIHRleHQgZXZlbiBpZiBpdCdzIG51bGwsIHNpbmNlIHdlIG5lZWQgdG8gY2xlYXIgYW55IHByZXZpb3VzIHRleHQuCiAgICAgICAgIHYuc2V0VGV4dCh0ZXh0KTsKQEAgLTYwMSwyMSArNTYyLDcgQEAKICAgICAgKiBAcmV0dXJuIEEgbm9uLW51bGwgZHJhd2FibGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXREZWZhdWx0SWNvbjEoQ3Vyc29yIGN1cnNvcikgewotICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGUgY29tcG9uZW50IHRoYXQgdGhlIHN1Z2dlc3Rpb24gaXMgb3JpZ2luYWxseSBmcm9tCi0gICAgICAgIFN0cmluZyBjID0gZ2V0Q29sdW1uU3RyaW5nKGN1cnNvciwgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfQ09NUE9ORU5UX05BTUUpOwotICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBvbmVudCA9IENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZyhjKTsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gZ2V0QWN0aXZpdHlJY29uV2l0aENhY2hlKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkJhZCBjb21wb25lbnQgbmFtZTogIiArIGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlbiBjaGVjayB0aGUgY29tcG9uZW50IHRoYXQgZ2F2ZSB1cyB0aGUgc3VnZ2VzdGlvbgorICAgICAgICAvLyBDaGVjayB0aGUgY29tcG9uZW50IHRoYXQgZ2F2ZSB1cyB0aGUgc3VnZ2VzdGlvbgogICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGdldEFjdGl2aXR5SWNvbldpdGhDYWNoZShtU2VhcmNoYWJsZS5nZXRTZWFyY2hBY3Rpdml0eSgpKTsKICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9UaW1lUGlja2VyRGlhbG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvVGltZVBpY2tlckRpYWxvZy5qYXZhCmluZGV4IDUyMWQ0MWMuLjM4MTE0M2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9UaW1lUGlja2VyRGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1RpbWVQaWNrZXJEaWFsb2cuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwpAQCAtNzYsNyArNzcsMTAgQEAKICAgICBwdWJsaWMgVGltZVBpY2tlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICBPblRpbWVTZXRMaXN0ZW5lciBjYWxsQmFjaywKICAgICAgICAgICAgIGludCBob3VyT2ZEYXksIGludCBtaW51dGUsIGJvb2xlYW4gaXMyNEhvdXJWaWV3KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2dfQWxlcnQsCisgICAgICAgIHRoaXMoY29udGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9Ib2xvX0RpYWxvZ19BbGVydAorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCwKICAgICAgICAgICAgICAgICBjYWxsQmFjaywgaG91ck9mRGF5LCBtaW51dGUsIGlzMjRIb3VyVmlldyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEKaW5kZXggMGJjZDY1Yy4uMjIzN2M4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VBZG1pbkluZm8uamF2YQpAQCAtMTAzLDYgKzEwMywxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVNfUE9MSUNZX1dJUEVfREFUQSA9IDQ7CiAKKyAgICAvKioKKyAgICAgKiBBIHR5cGUgb2YgcG9saWN5IHRoYXQgdGhpcyBkZXZpY2UgYWRtaW4gY2FuIHVzZTogYWJsZSB0byBzcGVjaWZ5IHRoZQorICAgICAqIGRldmljZSBHbG9iYWwgUHJveHksIHZpYSB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNzZXRHbG9iYWxQcm94eX0uCisgICAgICoKKyAgICAgKiA8cD5UbyBjb250cm9sIHRoaXMgcG9saWN5LCB0aGUgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSBhICJzZXQtZ2xvYmFsLXByb3h5IgorICAgICAqIHRhZyBpbiB0aGUgInVzZXMtcG9saWNpZXMiIHNlY3Rpb24gb2YgaXRzIG1ldGEtZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSA9IDU7CisKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvbGljeUluZm8gewogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGlkZW50OwpAQCAtMTM4LDYgKzE0Nyw5IEBACiAgICAgICAgIHNQb2xpY2llc0Rpc3BsYXlPcmRlci5hZGQobmV3IFBvbGljeUluZm8oVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSywgImZvcmNlLWxvY2siLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9mb3JjZUxvY2ssCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5ZGVzY19mb3JjZUxvY2spKTsKKyAgICAgICAgc1BvbGljaWVzRGlzcGxheU9yZGVyLmFkZChuZXcgUG9saWN5SW5mbyhVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSwgInNldC1nbG9iYWwtcHJveHkiLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5KSk7CiAgICAgICAgIAogICAgICAgICBmb3IgKGludCBpPTA7IGk8c1BvbGljaWVzRGlzcGxheU9yZGVyLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBQb2xpY3lJbmZvIHBpID0gc1BvbGljaWVzRGlzcGxheU9yZGVyLmdldChpKTsKQEAgLTMyOCw3ICszNDAsNyBAQAogICAgICAqIHRoZSBnaXZlbiBwb2xpY3kgY29udHJvbC4gIFRoZSBwb3NzaWJsZSBwb2xpY3kgaWRlbnRpZmllciBpbnB1dHMgYXJlOgogICAgICAqIHtAbGluayAjVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSwKICAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEfSwge0BsaW5rICNVU0VTX1BPTElDWV9GT1JDRV9MT0NLfSwKLSAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0uCisgICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9XSVBFX0RBVEF9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB1c2VzUG9saWN5KGludCBwb2xpY3lJZGVudCkgewogICAgICAgICByZXR1cm4gKG1Vc2VzUG9saWNpZXMgJiAoMTw8cG9saWN5SWRlbnQpKSAhPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKaW5kZXggMjk2ZDcwYTQuLjJiN2U0MjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQpAQCAtMzIsNiArMzIsOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlByb3h5OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTQ2LDcgKzQ4LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIElEZXZpY2VQb2xpY3lNYW5hZ2VyIG1TZXJ2aWNlOwotICAgIAorCiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBEZXZpY2VQb2xpY3lNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CkBAIC02MSwxNCArNjMsMTQgQEAKICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBtZSA9IG5ldyBEZXZpY2VQb2xpY3lNYW5hZ2VyKGNvbnRleHQsIGhhbmRsZXIpOwogICAgICAgICByZXR1cm4gbWUubVNlcnZpY2UgIT0gbnVsbCA/IG1lIDogbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGFzayB0aGUgdXNlciB0byBhZGQgYSBuZXcgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbS4KICAgICAgKiBUaGUgZGVzaXJlZCBwb2xpY3kgaXMgdGhlIENvbXBvbmVudE5hbWUgb2YgdGhlIHBvbGljeSBpbiB0aGUKICAgICAgKiB7QGxpbmsgI0VYVFJBX0RFVklDRV9BRE1JTn0gZXh0cmEgZmllbGQuICBUaGlzIHdpbGwgaW52b2tlIGEgVUkgdG8KICAgICAgKiBicmluZyB0aGUgdXNlciB0aHJvdWdoIGFkZGluZyB0aGUgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbSAob3IKICAgICAgKiBhbGxvd2luZyB0aGVtIHRvIHJlamVjdCBpdCkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5Zb3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSB0aGUge0BsaW5rICNFWFRSQV9BRERfRVhQTEFOQVRJT059CiAgICAgICogZmllbGQgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gKGluIGFkZGl0aW9uCiAgICAgICogdG8geW91ciBjb21wb25lbnQncyBkZXNjcmlwdGlvbikgYWJvdXQgd2hhdCBpcyBiZWluZyBhZGRlZC4KQEAgLTc2LDcgKzc4LDcgQEAKICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FERF9ERVZJQ0VfQURNSU4KICAgICAgICAgICAgID0gImFuZHJvaWQuYXBwLmFjdGlvbi5BRERfREVWSUNFX0FETUlOIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IGFjdGlvbjogc2VuZCB3aGVuIGFueSBwb2xpY3kgYWRtaW4gY2hhbmdlcyBhIHBvbGljeS4KICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIGZpbmQgb3V0IHdoZW4gYSBuZXcgcG9saWN5IGlzIGluIGVmZmVjdC4KQEAgLTkyLDcgKzk0LDcgQEAKICAgICAgKiBAc2VlICNBQ1RJT05fQUREX0RFVklDRV9BRE1JTgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RFVklDRV9BRE1JTiA9ICJhbmRyb2lkLmFwcC5leHRyYS5ERVZJQ0VfQURNSU4iOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQW4gb3B0aW9uYWwgQ2hhclNlcXVlbmNlIHByb3ZpZGluZyBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGZvciB3aHkgdGhlCiAgICAgICogYWRtaW4gaXMgYmVpbmcgYWRkZWQuCkBAIC0xMDAsMjIgKzEwMiwyMSBAQAogICAgICAqIEBzZWUgI0FDVElPTl9BRERfREVWSUNFX0FETUlOCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQUREX0VYUExBTkFUSU9OID0gImFuZHJvaWQuYXBwLmV4dHJhLkFERF9FWFBMQU5BVElPTiI7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGhhdmUgdGhlIHVzZXIgZW50ZXIgYSBuZXcgcGFzc3dvcmQuICBUaGlzIGFjdGl2aXR5Ci0gICAgICogc2hvdWxkIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9Ci0gICAgICogb3Ige0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSwgaW50KX0gdG8gaGF2ZSB0aGUKLSAgICAgKiB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLiAgWW91IGNhbgotICAgICAqIHVzZSB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkCi0gICAgICogdG8gaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAotICAgICAqIGNvbnN0cmFpbnRzLiAgVXBvbiBiZWluZyByZXN1bWVkIGZyb20gdGhpcyBhY3Rpdml0eSwKLSAgICAgKiB5b3UgY2FuIGNoZWNrIHRoZSBuZXcgcGFzc3dvcmQgY2hhcmFjdGVyaXN0aWNzIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIHN1ZmZpY2llbnQuCisgICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiBUaGlzIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9LAorICAgICAqIG9yIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlIHVzZXIKKyAgICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cy4gWW91IGNhbiB1c2UKKyAgICAgKiB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkIHRvCisgICAgICogaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAorICAgICAqIGNvbnN0cmFpbnRzLiBVcG9uIGJlaW5nIHJlc3VtZWQgZnJvbSB0aGlzIGFjdGl2aXR5LCB5b3UgY2FuIGNoZWNrIHRoZSBuZXcKKyAgICAgKiBwYXNzd29yZCBjaGFyYWN0ZXJpc3RpY3MgdG8gc2VlIGlmIHRoZXkgYXJlIHN1ZmZpY2llbnQuCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfTkVXX1BBU1NXT1JECiAgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uU0VUX05FV19QQVNTV09SRCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYWRtaW5pc3RyYXRvciBjb21wb25lbnQgaXMgY3VycmVudGx5CiAgICAgICogYWN0aXZlIChlbmFibGVkKSBpbiB0aGUgc3lzdGVtLgpAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIGFkbWluaXN0cmF0b3IncyBjb21wb25lbnQKICAgICAgKiBuYW1lcy4gIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gYWRtaW5pc3RyYXRvcnMgdGhhbiBudWxsIG1heSBiZQpAQCAtMTQ2LDcgKzE0Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTE2MCw3ICsxNjEsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZW1vdmUgYSBjdXJyZW50IGFkbWluaXN0cmF0aW9uIGNvbXBvbmVudC4gIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkCiAgICAgICogYnkgdGhlIGFwcGxpY2F0aW9uIHRoYXQgb3ducyB0aGUgYWRtaW5pc3RyYXRpb24gY29tcG9uZW50OyBpZiB5b3UKQEAgLTE3NiwyOCArMTc3LDI4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgcG9saWN5IGhhcyBubyByZXF1aXJlbWVudHMKICAgICAgKiBmb3IgdGhlIHBhc3N3b3JkLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyCiAgICAgICogdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQgPSAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHBvbGljeSByZXF1aXJlcyBzb21lIGtpbmQKICAgICAgKiBvZiBwYXNzd29yZCwgYnV0IGRvZXNuJ3QgY2FyZSB3aGF0IGl0IGlzLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzCiAgICAgICogYXJlIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HID0gMHgxMDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IG51bWVyaWMgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBxdWFsaXR5CiAgICAgICogY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX05VTUVSSUMgPSAweDIwMDAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQogICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYWxwaGFiZXRpYyAob3Igb3RoZXIgc3ltYm9sKSBjaGFyYWN0ZXJzLgpAQCAtMjA1LDcgKzIwNiw3IEBACiAgICAgICogcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID0gMHg0MDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IDxlbT5ib3RoPjwvZW0+IG51bWVyaWMgPGVtPmFuZDwvZW0+CkBAIC0yMTMsNyArMjE0LDE5IEBACiAgICAgICogb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPSAweDUwMDAwOwotICAgIAorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQorICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYSBsZXR0ZXIsIGEgbnVtZXJpY2FsIGRpZ2l0IGFuZCBhIHNwZWNpYWwKKyAgICAgKiBzeW1ib2wsIGJ5IGRlZmF1bHQuIFdpdGggdGhpcyBwYXNzd29yZCBxdWFsaXR5LCBwYXNzd29yZHMgY2FuIGJlCisgICAgICogcmVzdHJpY3RlZCB0byBjb250YWluIHZhcmlvdXMgc2V0cyBvZiBjaGFyYWN0ZXJzLCBsaWtlIGF0IGxlYXN0IGFuCisgICAgICogdXBwZXJjYXNlIGxldHRlciwgZXRjLiBUaGVzZSBhcmUgc3BlY2lmaWVkIHVzaW5nIHZhcmlvdXMgbWV0aG9kcywKKyAgICAgKiBsaWtlIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9LiBOb3RlCisgICAgICogdGhhdCBxdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUKKyAgICAgKiByZXN0cmljdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVggPSAweDYwMDAwOworCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKICAgICAgKiBwYXNzd29yZCByZXN0cmljdGlvbnMgaXQgaXMgaW1wb3NpbmcuICBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyCkBAIC0yMjIsMjEgKzIzNSwyMSBAQAogICAgICAqIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90CiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZTsKICAgICAgKiB0aHVzIHRoZSBoaWdoZXN0IHJlcXVlc3RlZCBxdWFsaXR5IGNvbnN0YW50IChiZXR3ZWVuIHRoZSBwb2xpY3kgc2V0IGhlcmUsCiAgICAgICogdGhlIHVzZXIncyBwcmVmZXJlbmNlLCBhbmQgYW55IG90aGVyIGNvbnNpZGVyYXRpb25zKSBpcyB0aGUgb25lIHRoYXQKICAgICAgKiBpcyBpbiBlZmZlY3QuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gcXVhbGl0eSBUaGUgbmV3IGRlc2lyZWQgcXVhbGl0eS4gIE9uZSBvZgogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRH0sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkd9LAogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDfSwge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUN9LAotICAgICAqIG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LgorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9IG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IHF1YWxpdHkpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKQEAgLTI0Nyw3ICsyNjAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbWluaW11bSBwYXNzd29yZCBxdWFsaXR5IGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTI2NCw3ICsyNzcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCiAgICAgICogbWluaW11bSBhbGxvd2VkIHBhc3N3b3JkIGxlbmd0aC4gIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIKQEAgLTI3NCwxNCArMjg3LDE0IEBACiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gIFRoaXMKICAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQgZWl0aGVyCi0gICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30sCi0gICAgICogb3Ige0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfQorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LCBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0KICAgICAgKiB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoLiAgQSB2YWx1ZSBvZiAwCiAgICAgICogbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC0yOTUsNyArMzA4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoIGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTMxMiw3ICszMjUsMzc5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVwcGVyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxvd2VyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIgc2V0dGluZyB0aGlzLAorICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyBub3QgYXQgbGVhc3QgYXMKKyAgICAgKiByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwKKyAgICAgKiByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcyBub3QgdGFrZQorICAgICAqIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQgZm9yIGFsbAorICAgICAqIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSwgaW50KX0KKyAgICAgKiBhbmQgb25seSBhcHBsaWVzIHdoZW4gdGhlIHBhc3N3b3JkIHF1YWxpdHkgaXMKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0bworICAgICAqICAgICAgICAgICAgYWdncmVnYXRlIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyCisgICAgICogc2V0dGluZyB0aGlzLCB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMKKyAgICAgKiBub3QgYXQgbGVhc3QgYXMgcmVzdHJpY3RpdmUgYXMgd2hhdCBoYXMgYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudAorICAgICAqIHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMKKyAgICAgKiBub3QgdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gVG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlCisgICAgICoge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzCisgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkCisgICAgICogZm9yIGFsbCBhZG1pbnMgb3IgYSBwYXJ0aWN1bGFyIG9uZS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqIHNldCBieSB7I2xpbmsge0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIG1pbmltdW0gbnVtYmVyIG9mIHN5bWJvbHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlciBzZXR0aW5nIHRoaXMsCisgICAgICogdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIG5vdCBhdCBsZWFzdCBhcworICAgICAqIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2lsbAorICAgICAqIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlCisgICAgICogcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAxLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZCBmb3IgYWxsCisgICAgICogYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgKG51bWVyaWNhbCBkaWdpdHMgb3Igc3ltYm9scykKKyAgICAgKiByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZQorICAgICAqIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMgbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzCisgICAgICogYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMKKyAgICAgKiBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdAorICAgICAqIHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyCisgICAgICogc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yCisgICAgICogaGFzIGFsc28gcmVxdWVzdGVkIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoCisgICAgICoge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZSBsZW5ndGgKKyAgICogb2YgdGhlIHBhc3N3b3JkIGhpc3RvcnkuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0bworICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIHRoZSBzYW1lIGFzIGFueSBwYXNzd29yZCBpbiB0aGUgaGlzdG9yeS4gTm90ZQorICAgKiB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbworICAgKiB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcKKyAgICogcGFzc3dvcmQsIHVzZSB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuCisgICAqIFRoaXMgY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAqIGVpdGhlciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sCisgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfSwgb3IKKyAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uCisgICAqCisgICAqIDxwPgorICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwgdGhpcworICAgKiBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAqICAgICAgICB3aXRoLgorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBsZW5ndGggb2YgcGFzc3dvcmQgaGlzdG9yeS4gQSB2YWx1ZSBvZiAwCisgICAqICAgICAgICBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgaGlzdG9yeSBsZW5ndGggZm9yIGFsbCBhZG1pbnMKKyAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvIGFnZ3JlZ2F0ZQorICAgICAqIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZCBoaXN0b3J5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gcGFzc3dvcmQgbGVuZ3RoIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0cyBmb3IgYQogICAgICAqIHBhcnRpY3VsYXIgcGFzc3dvcmQgcXVhbGl0eS4KQEAgLTMyMywxNiArNzA4LDE2IEBACiAgICAgICAgIC8vIEtpbmQtb2YgYXJiaXRyYXJ5LgogICAgICAgICByZXR1cm4gMTY7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdGhlIHVzZXIgaGFzIHNldCBpcyBzdWZmaWNpZW50CiAgICAgICogdG8gbWVldCB0aGUgcG9saWN5IHJlcXVpcmVtZW50cyAocXVhbGl0eSwgbWluaW11bSBsZW5ndGgpIHRoYXQgaGF2ZSBiZWVuCiAgICAgICogcmVxdWVzdGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLAogICAgICAqIGVsc2UgZmFsc2UuCiAgICAgICovCkBAIC0zNDYsMTEgKzczMSwxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB1c2VyIGhhcyBmYWlsZWQgYXQgZW50ZXJpbmcgYQogICAgICAqIHBhc3N3b3JkIHNpbmNlIHRoYXQgbGFzdCBzdWNjZXNzZnVsIHBhc3N3b3JkIGVudHJ5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCkBAIC0zNzMsMTQgKzc1OCwxNCBAQAogICAgICAqIHdhdGNoaW5nIGZvciBmYWlsZWQgcGFzc3dvcmRzIGFuZCB3aXBpbmcgdGhlIGRldmljZSwgYW5kIHJlcXVpcmVzCiAgICAgICogdGhhdCB5b3UgcmVxdWVzdCBib3RoIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0FUQ0hfTE9HSU59IGFuZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0lQRV9EQVRBfX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UbyBpbXBsZW1lbnQgYW55IG90aGVyIHBvbGljeSAoZS5nLiB3aXBpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogYXBwbGljYXRpb24gb25seSwgZXJhc2luZyBvciByZXZva2luZyBjcmVkZW50aWFscywgb3IgcmVwb3J0aW5nIHRoZQogICAgICAqIGZhaWx1cmUgdG8gYSBzZXJ2ZXIpLCB5b3Ugc2hvdWxkIGltcGxlbWVudAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyI29uUGFzc3dvcmRGYWlsZWQoQ29udGV4dCwgYW5kcm9pZC5jb250ZW50LkludGVudCl9CiAgICAgICogaW5zdGVhZC4gIERvIG5vdCB1c2UgdGhpcyBBUEksIGJlY2F1c2UgaWYgdGhlIG1heGltdW0gY291bnQgaXMgcmVhY2hlZCwKICAgICAgKiB0aGUgZGV2aWNlIHdpbGwgYmUgd2lwZWQgaW1tZWRpYXRlbHksIGFuZCB5b3VyIGNhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICogQHBhcmFtIG51bSBUaGUgbnVtYmVyIG9mIGZhaWxlZCBwYXNzd29yZCBhdHRlbXB0cyBhdCB3aGljaCBwb2ludCB0aGUKICAgICAgKiBkZXZpY2Ugd2lsbCB3aXBlIGl0cyBkYXRhLgpAQCAtMzk0LDcgKzc3OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtYXhpbXVtIG51bWJlciBvZiBsb2dpbiBhdHRlbXB0cyB0aGF0IGFyZSBhbGxvd2VkCiAgICAgICogYmVmb3JlIHRoZSBkZXZpY2Ugd2lwZXMgaXRzZWxmLCBmb3IgYWxsIGFkbWlucwpAQCAtNDEyLDEzICs3OTcsMTMgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3Jlc2V0UGFzc3dvcmR9OiBkb24ndCBhbGxvdyBvdGhlciBhZG1pbnMgdG8gY2hhbmdlCiAgICAgICogdGhlIHBhc3N3b3JkIGFnYWluIHVudGlsIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGl0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU0VUX1BBU1NXT1JEX1JFUVVJUkVfRU5UUlkgPSAweDAwMDE7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGb3JjZSBhIG5ldyBkZXZpY2UgdW5sb2NrIHBhc3N3b3JkICh0aGUgcGFzc3dvcmQgbmVlZGVkIHRvIGFjY2VzcyB0aGUKICAgICAgKiBlbnRpcmUgZGV2aWNlLCBub3QgZm9yIGluZGl2aWR1YWwgYWNjb3VudHMpIG9uIHRoZSB1c2VyLiAgVGhpcyB0YWtlcwpAQCAtNDMxLDExICs4MTYsMTEgQEAKICAgICAgKiB0aGF0IHRoZSBwYXNzd29yZCBtYXkgYmUgYSBzdHJvbmdlciBxdWFsaXR5IChjb250YWluaW5nIGFscGhhbnVtZXJpYwogICAgICAqIGNoYXJhY3RlcnMgd2hlbiB0aGUgcmVxdWVzdGVkIHF1YWxpdHkgaXMgb25seSBudW1lcmljKSwgaW4gd2hpY2ggY2FzZQogICAgICAqIHRoZSBjdXJyZW50bHkgYWN0aXZlIHF1YWxpdHkgd2lsbCBiZSBpbmNyZWFzZWQgdG8gbWF0Y2guCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfUkVTRVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbmV3IHBhc3N3b3JkIGZvciB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gZmxhZ3MgTWF5IGJlIDAgb3Ige0BsaW5rICNSRVNFVF9QQVNTV09SRF9SRVFVSVJFX0VOVFJZfS4KICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgd2FzIGFwcGxpZWQsIG9yIGZhbHNlIGlmIGl0IGlzCkBAIC00NTEsMTYgKzgzNiwxNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQogICAgICAqIG1heGltdW0gdGltZSBmb3IgdXNlciBhY3Rpdml0eSB1bnRpbCB0aGUgZGV2aWNlIHdpbGwgbG9jay4gIFRoaXMgbGltaXRzCiAgICAgICogdGhlIGxlbmd0aCB0aGF0IHRoZSB1c2VyIGNhbiBzZXQuICBJdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfRk9SQ0VfTE9DS30gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSB0aW1lTXMgVGhlIG5ldyBkZXNpcmVkIG1heGltdW0gdGltZSB0byBsb2NrIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC00NzQsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1heGltdW0gdGltZSB0byB1bmxvY2sgZm9yIGFsbCBhZG1pbnMKICAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgpAQCAtNDkxLDExICs4NzYsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNYWtlIHRoZSBkZXZpY2UgbG9jayBpbW1lZGlhdGVseSwgYXMgaWYgdGhlIGxvY2sgc2NyZWVuIHRpbWVvdXQgaGFzCiAgICAgICogZXhwaXJlZCBhdCB0aGUgcG9pbnQgb2YgdGhpcyBjYWxsLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0ZPUkNFX0xPQ0t9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KQEAgLTUwOSwxNiArODk0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBc2sgdGhlIHVzZXIgZGF0ZSBiZSB3aXBlZC4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvIHJlYm9vdCwKICAgICAgKiBlcmFzaW5nIGFsbCB1c2VyIGRhdGEgd2hpbGUgbmV4dCBib290aW5nIHVwLiAgRXh0ZXJuYWwgc3RvcmFnZSBzdWNoCiAgICAgICogYXMgU0QgY2FyZHMgd2lsbCBub3QgYmUgZXJhc2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWdzIEJpdCBtYXNrIG9mIGFkZGl0aW9uYWwgb3B0aW9uczogY3VycmVudGx5IG11c3QgYmUgMC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKQEAgLTUzMCw3ICs5MTUsOTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogZ2xvYmFsIHByb3h5IGFuZCBleGNsdXNpb24gbGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFl9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKiBPbmx5IHRoZSBmaXJzdCBkZXZpY2UgYWRtaW4gY2FuIHNldCB0aGUgcHJveHkuIElmIGEgc2Vjb25kIGFkbWluIGF0dGVtcHRzCisgICAgICogdG8gc2V0IHRoZSBwcm94eSwgdGhlIHtAbGluayBDb21wb25lbnROYW1lfSBvZiB0aGUgYWRtaW4gb3JpZ2luYWxseSBzZXR0aW5nIHRoZQorICAgICAqIHByb3h5IHdpbGwgYmUgcmV0dXJuZWQuIElmIHN1Y2Nlc3NmdWwgaW4gc2V0dGluZyB0aGUgcHJveHksIG51bGwgd2lsbAorICAgICAqIGJlIHJldHVybmVkLgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5IGJ5IHRoZSBkZXZpY2UgYWRtaW4gYWxyYWR5IHNldHRpbmcgdGhlCisgICAgICogcHJveHkgdG8gdXBkYXRlIHRoZSBwcm94eSBhbmQgZXhjbHVzaW9uIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBwcm94eVNwZWMgdGhlIGdsb2JhbCBwcm94eSBkZXNpcmVkLiBNdXN0IGJlIGFuIEhUVFAgUHJveHkuCisgICAgICogICAgICAgICAgICBQYXNzIFByb3h5Lk5PX1BST1hZIHRvIHJlc2V0IHRoZSBwcm94eS4KKyAgICAgKiBAcGFyYW0gZXhjbHVzaW9uTGlzdCBhIGxpc3Qgb2YgZG9tYWlucyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICogQHJldHVybiByZXR1cm5zIG51bGwgaWYgdGhlIHByb3h5IHdhcyBzdWNjZXNzZnVsbHkgc2V0LCBvciBhIHtAbGluayBDb21wb25lbnROYW1lfQorICAgICAqICAgICAgICAgICAgb2YgdGhlIGRldmljZSBhZG1pbiB0aGF0IHNldHMgdGhldyBwcm94eSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgc2V0R2xvYmFsUHJveHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgUHJveHkgcHJveHlTcGVjLAorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvbkxpc3QgKSB7CisgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3RTcGVjOworICAgICAgICAgICAgICAgIFN0cmluZyBleGNsU3BlYzsKKyAgICAgICAgICAgICAgICBpZiAocHJveHlTcGVjLmVxdWFscyhQcm94eS5OT19QUk9YWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdFNwZWMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm94eVNwZWMudHlwZSgpLmVxdWFscyhQcm94eS5UeXBlLkhUVFApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSAoSW5ldFNvY2tldEFkZHJlc3MpcHJveHlTcGVjLmFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gc2EuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQgPSBzYS5nZXRQb3J0KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgaG9zdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICBob3N0U3BlYyA9IGhvc3RCdWlsZGVyLmFwcGVuZChob3N0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKS5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhwb3J0KSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2x1c2lvbkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhjbFNwZWMgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbGlzdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdERvbWFpbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGNsRG9tYWluIDogZXhjbHVzaW9uTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3REb21haW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEJ1aWxkZXIgPSBsaXN0QnVpbGRlci5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERvbWFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0QnVpbGRlciA9IGxpc3RCdWlsZGVyLmFwcGVuZChleGNsRG9tYWluLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IGxpc3RCdWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5uZXQuUHJveHkudmFsaWRhdGUoaG9zdE5hbWUsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGV4Y2xTcGVjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldEdsb2JhbFByb3h5KGFkbWluLCBob3N0U3BlYywgZXhjbFNwZWMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBuYW1lIHNldHRpbmcgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgKiBAcmV0dXJuIENvbXBvbmVudE5hbWUgb2JqZWN0IG9mIHRoZSBkZXZpY2UgYWRtaW4gdGhhdCBzZXQgdGhlIGdsb2JhbCBwcm94eSwgb3IKKyAgICAgKiAgICAgICAgICAgIG51bGwgaWYgbm8gYWRtaW4gaGFzIHNldCB0aGUgcHJveHkuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0R2xvYmFsUHJveHlBZG1pbigpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEdsb2JhbFByb3h5QWRtaW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNTQzLDcgKzEwMTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU1NiwxMCArMTAyNiwxMCBAQAogICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIHJldHJpZXZlIGRldmljZSBwb2xpY3kgIiArIGNuLCBlKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIFJlc29sdmVJbmZvIHJpID0gbmV3IFJlc29sdmVJbmZvKCk7CiAgICAgICAgIHJpLmFjdGl2aXR5SW5mbyA9IGFpOwotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIHJpKTsKICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CkBAIC01NzAsNyArMTA0MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC01ODcsMTYgKzEwNTcsMTggQEAKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKHF1YWxpdHksIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShxdWFsaXR5LCBsZW5ndGgsIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycywgc3ltYm9scywgbm9ubGV0dGVyKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC02MDksNyArMTA4MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNjIyLDQgKzEwOTQsNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCmluZGV4IDZmYzRkYzUuLjNmY2Q2ZmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCkBAIC0yNywxMCArMjcsMzEgQEAKIGludGVyZmFjZSBJRGV2aWNlUG9saWN5TWFuYWdlciB7CiAgICAgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBxdWFsaXR5KTsKICAgICBpbnQgZ2V0UGFzc3dvcmRRdWFsaXR5KGluIENvbXBvbmVudE5hbWUgd2hvKTsKLSAgICAKKwogICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKICAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCisgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvKTsKICAgICAKKyAgICB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobyk7CisKICAgICBib29sZWFuIGlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCk7CiAgICAgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCk7CiAgICAgCkBAIC00NSw2ICs2Niw5IEBACiAgICAgdm9pZCBsb2NrTm93KCk7CiAgICAgCiAgICAgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpOworCisgICAgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShpbiBDb21wb25lbnROYW1lIGFkbWluLCBTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCk7CisgICAgQ29tcG9uZW50TmFtZSBnZXRHbG9iYWxQcm94eUFkbWluKCk7CiAgICAgCiAgICAgdm9pZCBzZXRBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICBib29sZWFuIGlzQWRtaW5BY3RpdmUoaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CkBAIC01Myw3ICs3Nyw4IEBACiAgICAgdm9pZCBnZXRSZW1vdmVXYXJuaW5nKGluIENvbXBvbmVudE5hbWUgcG9saWN5UmVjZWl2ZXIsIGluIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCk7CiAgICAgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICAKLSAgICB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpOworICAgIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsIGludCBsb3dlcmNhc2UsCisgICAgICAgIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcik7CiAgICAgdm9pZCByZXBvcnRGYWlsZWRQYXNzd29yZEF0dGVtcHQoKTsKICAgICB2b2lkIHJlcG9ydFN1Y2Nlc3NmdWxQYXNzd29yZEF0dGVtcHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdC5qYXZhCmluZGV4IGIyZmMxM2YuLjc3MzA5NDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3QuamF2YQpAQCAtMzksNiArMzksNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEVfVVBEQVRFID0gMTsKICAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9QUk9WSURFUl9DSEFOR0VEID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9WSUVXX0RBVEFfQ0hBTkdFRCA9IDM7CiAKICAgICBmaW5hbCBzdGF0aWMgT2JqZWN0IHNTZXJ2aWNlTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBzdGF0aWMgSUFwcFdpZGdldFNlcnZpY2Ugc1NlcnZpY2U7CkBAIC02MCw2ICs2MSwxMyBAQAogICAgICAgICAgICAgbXNnLm9iaiA9IGluZm87CiAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbnQgdmlld0lkKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoSEFORExFX1ZJRVdfREFUQV9DSEFOR0VEKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gYXBwV2lkZ2V0SWQ7CisgICAgICAgICAgICBtc2cuYXJnMiA9IHZpZXdJZDsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGNsYXNzIFVwZGF0ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKQEAgLTc3LDYgKzg1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG9uUHJvdmlkZXJDaGFuZ2VkKG1zZy5hcmcxLCAoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvKW1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBIQU5ETEVfVklFV19EQVRBX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdmlld0RhdGFDaGFuZ2VkKG1zZy5hcmcxLCBtc2cuYXJnMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI1MCw2ICsyNjIsMTYgQEAKICAgICAgICAgICAgIHYudXBkYXRlQXBwV2lkZ2V0KHZpZXdzKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCkgeworICAgICAgICBBcHBXaWRnZXRIb3N0VmlldyB2OworICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3cykgeworICAgICAgICAgICAgdiA9IG1WaWV3cy5nZXQoYXBwV2lkZ2V0SWQpOworICAgICAgICB9CisgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHYudmlld0RhdGFDaGFuZ2VkKHZpZXdJZCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQppbmRleCBiMzNiMDk3Li40ZjhlZTkzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQpAQCAtMjMsMTUgKzIzLDE4IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CkBAIC0yNTgsNiArMjYxLDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUHJvY2VzcyBkYXRhLWNoYW5nZWQgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCB2aWV3IGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzZXQgb2Yge0BsaW5rIFJlbW90ZVZpZXdzfSB2aWV3cy4KKyAgICAgKi8KKyAgICB2b2lkIHZpZXdEYXRhQ2hhbmdlZChpbnQgdmlld0lkKSB7CisgICAgICAgIFZpZXcgdiA9IGZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICBpZiAoKHYgIT0gbnVsbCkgJiYgKHYgaW5zdGFuY2VvZiBBZGFwdGVyVmlldzw/PikpIHsKKyAgICAgICAgICAgIEFkYXB0ZXJWaWV3PD8+IGFkYXB0ZXJWaWV3ID0gKEFkYXB0ZXJWaWV3PD8+KSB2OworICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlclZpZXcuZ2V0QWRhcHRlcigpOworICAgICAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCYXNlQWRhcHRlcikgeworICAgICAgICAgICAgICAgIEJhc2VBZGFwdGVyIGJhc2VBZGFwdGVyID0gKEJhc2VBZGFwdGVyKSBhZGFwdGVyOworICAgICAgICAgICAgICAgIGJhc2VBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBCdWlsZCBhIHtAbGluayBDb250ZXh0fSBjbG9uZWQgaW50byBhbm90aGVyIHBhY2thZ2UgbmFtZSwgdXN1YWxseSBmb3IgdGhlCiAgICAgICogcHVycG9zZXMgb2YgcmVhZGluZyByZW1vdGUgcmVzb3VyY2VzLgogICAgICAqLwpAQCAtMjc1LDYgKzI5NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkcmF3Q2hpbGQoQ2FudmFzIGNhbnZhcywgVmlldyBjaGlsZCwgbG9uZyBkcmF3aW5nVGltZSkgewogICAgICAgICBpZiAoQ1JPU1NGQURFKSB7CiAgICAgICAgICAgICBpbnQgYWxwaGE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YQppbmRleCBkMmFiODVlLi4yYTU4M2MxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRNYW5hZ2VyLmphdmEKQEAgLTIzMyw2ICsyMzMsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIFJlbW90ZVZpZXdzIHRvIHVzZSBmb3IgdGhlIHNwZWNpZmllZCBhcHBXaWRnZXRJZHMuCiAgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIFJlbW90ZVZpZXdzIHBhcmFtZXRlciB3aWxsIGJlIGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZSwgYW5kIGhlbmNlIHNob3VsZAorICAgICAqIGNvbnRhaW4gYSBjb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZ2V0LiBGb3IgcGVyZm9ybWluZyBwYXJ0aWFsIHdpZGdldCB1cGRhdGVzLCBzZWUKKyAgICAgKiB7QGxpbmsgI3BhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnRbXSwgUmVtb3RlVmlld3MpfS4KKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIEl0IGlzIG9rYXkgdG8gY2FsbCB0aGlzIG1ldGhvZCBib3RoIGluc2lkZSBhbiB7QGxpbmsgI0FDVElPTl9BUFBXSURHRVRfVVBEQVRFfSBicm9hZGNhc3QsCiAgICAgICogYW5kIG91dHNpZGUgb2YgdGhlIGhhbmRsZXIuCkBAIC0yNTMsNiArMjU3LDEwIEBACiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIHRoZSBzcGVjaWZpZWQgYXBwV2lkZ2V0SWQuCiAgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIFJlbW90ZVZpZXdzIHBhcmFtZXRlciB3aWxsIGJlIGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZSwgYW5kIGhlbmNlIHNob3VsZAorICAgICAqIGNvbnRhaW4gYSBjb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZ2V0LiBGb3IgcGVyZm9ybWluZyBwYXJ0aWFsIHdpZGdldCB1cGRhdGVzLCBzZWUKKyAgICAgKiB7QGxpbmsgI3BhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnQsIFJlbW90ZVZpZXdzKX0uCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAogICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgpAQCAtMjY2LDYgKzI3NCw1OSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaW5jcmVtZW50YWwgdXBkYXRlIG9yIGNvbW1hbmQgb24gdGhlIHdpZGdldChzKSBzcGVjaWZpZWQgYnkgYXBwV2lkZ2V0SWRzLgorICAgICAqCisgICAgICogVGhpcyB1cGRhdGUgIGRpZmZlcnMgZnJvbSB7QGxpbmsgI3VwZGF0ZUFwcFdpZGdldChpbnRbXSwgUmVtb3RlVmlld3MpfSBpbiB0aGF0IHRoZQorICAgICAqIFJlbW90ZVZpZXdzIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgaXMgdW5kZXJzdG9vZCB0byBiZSBhbiBpbmNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAKKyAgICAgKiB3aWRnZXQsIGFuZCBoZW5jZSBpcyBub3QgY2FjaGVkIGJ5IHRoZSBBcHBXaWRnZXRTZXJ2aWNlLiBOb3RlIHRoYXQgYmVjYXVzZSB0aGVzZSB1cGRhdGVzIGFyZSAKKyAgICAgKiBub3QgY2FjaGVkLCBhbnkgc3RhdGUgdGhhdCB0aGV5IG1vZGlmeSB0aGF0IGlzIG5vdCByZXN0b3JlZCBieSByZXN0b3JlSW5zdGFuY2VTdGF0ZSB3aWxsIG5vdAorICAgICAqIHBlcnNpc3QgaW4gdGhlIGNhc2UgdGhhdCB0aGUgd2lkZ2V0cyBhcmUgcmVzdG9yZWQgdXNpbmcgdGhlIGNhY2hlZCB2ZXJzaW9uIGluCisgICAgICogQXBwV2lkZ2V0U2VydmljZS4KKyAgICAgKgorICAgICAqIFVzZSB3aXRoIHtAbGluayBSZW1vdGVWaWV3cyNzaG93TmV4dChpbnQpfSwge0BsaW5rIFJlbW90ZVZpZXdzI3Nob3dQcmV2aW91cyhpbnQpfSwKKyAgICAgKiB7QGxpbmsgUmVtb3RlVmlld3Mjc2V0U2Nyb2xsUG9zaXRpb24oaW50LCBpbnQpfSBhbmQgc2ltaWxhciBjb21tYW5kcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG9rYXkgdG8gY2FsbCB0aGlzIG1ldGhvZCBib3RoIGluc2lkZSBhbiB7QGxpbmsgI0FDVElPTl9BUFBXSURHRVRfVVBEQVRFfSBicm9hZGNhc3QsCisgICAgICogYW5kIG91dHNpZGUgb2YgdGhlIGhhbmRsZXIuCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHdvcmsgd2hlbiBjYWxsZWQgZnJvbSB0aGUgdWlkIHRoYXQgb3ducyB0aGUgQXBwV2lkZ2V0IHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkcyAgICAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZXMgZm9yIHdoaWNoIHRvIHNldCB0aGUgUmVtb3RlVmlld3MuCisgICAgICogQHBhcmFtIHZpZXdzICAgICAgICAgICAgVGhlIFJlbW90ZVZpZXdzIG9iamVjdCBjb250YWluaW5nIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGUgLyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnRbXSBhcHBXaWRnZXRJZHMsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzU2VydmljZS5wYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXRJZHMoYXBwV2lkZ2V0SWRzLCB2aWV3cyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhbiBpbmNyZW1lbnRhbCB1cGRhdGUgb3IgY29tbWFuZCBvbiB0aGUgd2lkZ2V0IHNwZWNpZmllZCBieSBhcHBXaWRnZXRJZC4KKyAgICAgKgorICAgICAqIFRoaXMgdXBkYXRlICBkaWZmZXJzIGZyb20ge0BsaW5rICN1cGRhdGVBcHBXaWRnZXQoaW50LCBSZW1vdGVWaWV3cyl9IGluIHRoYXQgdGhlIFJlbW90ZVZpZXdzCisgICAgICogb2JqZWN0IHdoaWNoIGlzIHBhc3NlZCBpcyB1bmRlcnN0b29kIHRvIGJlIGFuIGluY29tcGxldGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpZGdldCwgYW5kCisgICAgICogaGVuY2UgaXMgbm90IGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZS4gTm90ZSB0aGF0IGJlY2F1c2UgdGhlc2UgdXBkYXRlcyBhcmUgbm90IGNhY2hlZCwKKyAgICAgKiBhbnkgc3RhdGUgdGhhdCB0aGV5IG1vZGlmeSB0aGF0IGlzIG5vdCByZXN0b3JlZCBieSByZXN0b3JlSW5zdGFuY2VTdGF0ZSB3aWxsIG5vdCBwZXJzaXN0IGluCisgICAgICogdGhlIGNhc2UgdGhhdCB0aGUgd2lkZ2V0cyBhcmUgcmVzdG9yZWQgdXNpbmcgdGhlIGNhY2hlZCB2ZXJzaW9uIGluIEFwcFdpZGdldFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgUmVtb3RlVmlld3Mjc2hvd05leHQoaW50KX0sIHtAbGluayBSZW1vdGVWaWV3cyNzaG93UHJldmlvdXMoaW50KX0sCisgICAgICoge0BsaW5rIFJlbW90ZVZpZXdzI3NldFNjcm9sbFBvc2l0aW9uKGludCwgaW50KX0gYW5kIHNpbWlsYXIgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAorICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgb25seSB3b3JrIHdoZW4gY2FsbGVkIGZyb20gdGhlIHVpZCB0aGF0IG93bnMgdGhlIEFwcFdpZGdldCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZCAgICAgIFRoZSBBcHBXaWRnZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRvIHNldCB0aGUgUmVtb3RlVmlld3MuCisgICAgICogQHBhcmFtIHZpZXdzICAgICAgICAgICAgVGhlIFJlbW90ZVZpZXdzIG9iamVjdCBjb250YWluaW5nIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGUgLyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnQgYXBwV2lkZ2V0SWQsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9LCB2aWV3cyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIGFsbCBBcHBXaWRnZXQgaW5zdGFuY2VzIGZvciB0aGUgc3VwcGxpZWQgQXBwV2lkZ2V0IHByb3ZpZGVyLgogICAgICAqCiAgICAgICogPHA+CkBAIC0yODgsMTEgKzM0OSw0NiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2aWV3IGluIGFsbCB0aGUgc3BlY2lmaWVkIEFwcFdpZGdldCBpbnN0YW5jZXMKKyAgICAgKiB0byBpbnZhbGlkYXRlIHRoZWlyIGN1cnJlbnRseSBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkcyAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZXMgZm9yIHdoaWNoIHRvIG5vdGlmeSBvZiB2aWV3IGRhdGEgY2hhbmdlcy4KKyAgICAgKiBAcGFyYW0gdmlld0lkICAgICAgICBUaGUgY29sbGVjdGlvbiB2aWV3IGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIGludCB2aWV3SWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNTZXJ2aWNlLm5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChhcHBXaWRnZXRJZHMsIHZpZXdJZCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZpZXcgaW4gYWxsIHRoZSBzcGVjaWZpZWQgQXBwV2lkZ2V0IGluc3RhbmNlCisgICAgICogdG8gaW52YWxpZGF0ZSBpdCdzIGN1cnJlbnRseSBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkICBUaGUgQXBwV2lkZ2V0IGluc3RhbmNlIGZvciB3aGljaCB0byBub3RpZnkgb2YgdmlldyBkYXRhIGNoYW5nZXMuCisgICAgICogQHBhcmFtIHZpZXdJZCAgICAgICAgVGhlIGNvbGxlY3Rpb24gdmlldyBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbnQgdmlld0lkKSB7CisgICAgICAgIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9LCB2aWV3SWQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIEFwcFdpZGdldCBwcm92aWRlcnMgdGhhdCBhcmUgY3VycmVudGx5IGluc3RhbGxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IGdldEluc3RhbGxlZFByb3ZpZGVycygpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzU2VydmljZS5nZXRJbnN0YWxsZWRQcm92aWRlcnMoKTsKKyAgICAgICAgICAgIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBwcm92aWRlcnMgPSBzU2VydmljZS5nZXRJbnN0YWxsZWRQcm92aWRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8gOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGNvbXBsZXggdG8gZHAuCisgICAgICAgICAgICAgICAgaW5mby5taW5XaWR0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZFZhbHVlLmNvbXBsZXhUb0RpbWVuc2lvblBpeGVsU2l6ZShpbmZvLm1pbldpZHRoLCBtRGlzcGxheU1ldHJpY3MpOworICAgICAgICAgICAgICAgIGluZm8ubWluSGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUuY29tcGxleFRvRGltZW5zaW9uUGl4ZWxTaXplKGluZm8ubWluSGVpZ2h0LCBtRGlzcGxheU1ldHJpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyczsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJzeXN0ZW0gc2VydmVyIGRlYWQ/IiwgZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEKaW5kZXggY2VlMjg2NS4uMzk2ZTkyZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldFByb3ZpZGVySW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRQcm92aWRlckluZm8uamF2YQpAQCAtMTEwLDYgKzExMCwxNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBvbGROYW1lOworICAgIAorICAgIC8qKgorICAgICAqIEEgcHJldmlldyBvZiB3aGF0IHRoZSBBcHBXaWRnZXQgd2lsbCBsb29rIGxpa2UgYWZ0ZXIgaXQncyBjb25maWd1cmVkLgorICAgICAqIElmIG5vdCBzdXBwbGllZCwgdGhlIEFwcFdpZGdldCdzIGljb24gd2lsbCBiZSB1c2VkLgorICAgICAqCisgICAgICogPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+YW5kcm9pZDpwcmV2aWV3SW1hZ2U8L2NvZGU+IGF0dHJpYnV0ZSBpbgorICAgICAqIHRoZSA8Y29kZT4mbHQ7cmVjZWl2ZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUuCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKwlwdWJsaWMgaW50IHByZXZpZXdJbWFnZTsKIAogICAgIHB1YmxpYyBBcHBXaWRnZXRQcm92aWRlckluZm8oKSB7CiAgICAgfQpAQCAtMTMwLDYgKzE0MSw3IEBACiAgICAgICAgIH0KICAgICAgICAgdGhpcy5sYWJlbCA9IGluLnJlYWRTdHJpbmcoKTsKICAgICAgICAgdGhpcy5pY29uID0gaW4ucmVhZEludCgpOworICAgICAgICB0aGlzLnByZXZpZXdJbWFnZSA9IGluLnJlYWRJbnQoKTsKICAgICB9CiAKIApAQCAtMTUyLDYgKzE2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgb3V0LndyaXRlU3RyaW5nKHRoaXMubGFiZWwpOwogICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5pY29uKTsKKyAgICAgICAgb3V0LndyaXRlSW50KHRoaXMucHJldmlld0ltYWdlKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQTJkcC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEEyZHAuamF2YQppbmRleCA3ZTVmODU4Li5kMzA4YTVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQTJkcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBMmRwLmphdmEKQEAgLTE4LDg4ICsxOCwxMDQgQEAKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEEyZHBTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoQTJkcFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiAKIC8qKgotICogUHVibGljIEFQSSBmb3IgY29udHJvbGxpbmcgdGhlIEJsdWV0b290aCBBMkRQIFByb2ZpbGUgU2VydmljZS4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIHB1YmxpYyBBUElzIHRvIGNvbnRyb2wgdGhlIEJsdWV0b290aCBBMkRQCisgKiBwcm9maWxlLgogICoKLSAqIEJsdWV0b290aEEyZHAgaXMgYSBwcm94eSBvYmplY3QgZm9yIGNvbnRyb2xsaW5nIHRoZSBCbHVldG9vdGggQTJEUAotICogU2VydmljZSB2aWEgSVBDLgorICo8cD5CbHVldG9vdGhBMmRwIGlzIGEgcHJveHkgb2JqZWN0IGZvciBjb250cm9sbGluZyB0aGUgQmx1ZXRvb3RoIEEyRFAKKyAqIFNlcnZpY2UgdmlhIElQQy4gVXNlIHtAbGluayBCbHVldG9vdGhBZGFwdGVyI2dldFByb2ZpbGVQcm94eX0gdG8gZ2V0CisgKiB0aGUgQmx1ZXRvb3RoQTJkcCBwcm94eSBvYmplY3QuCiAgKgotICogQ3JlYXRpbmcgYSBCbHVldG9vdGhBMmRwIG9iamVjdCB3aWxsIGluaXRpYXRlIGEgYmluZGluZyB3aXRoIHRoZQotICogQmx1ZXRvb3RoSGVhZHNldCBzZXJ2aWNlLiBVc2VycyBvZiB0aGlzIG9iamVjdCBzaG91bGQgY2FsbCBjbG9zZSgpIHdoZW4gdGhleQotICogYXJlIGZpbmlzaGVkLCBzbyB0aGF0IHRoaXMgcHJveHkgb2JqZWN0IGNhbiB1bmJpbmQgZnJvbSB0aGUgc2VydmljZS4KLSAqCi0gKiBDdXJyZW50bHkgdGhlIEJsdWV0b290aEEyZHAgc2VydmljZSBydW5zIGluIHRoZSBzeXN0ZW0gc2VydmVyIGFuZCB0aGlzCi0gKiBwcm94eSBvYmplY3Qgd2lsbCBiZSBpbW1lZGlhdGVseSBib3VuZCB0byB0aGUgc2VydmljZSBvbiBjb25zdHJ1Y3Rpb24uCi0gKgotICogQ3VycmVudGx5IHRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0byBjb25uZWN0IHRvIEEyRFAgYXVkaW8gc2lua3MuCi0gKgotICogQGhpZGUKKyAqIDxwPiBBbmRyb2lkIG9ubHkgc3VwcG9ydHMgb25lIGNvbm5lY3RlZCBCbHVldG9vdGggQTJkcCBkZXZpY2UgYXQgYSB0aW1lLgorICogRWFjaCBtZXRob2QgaXMgcHJvdGVjdGVkIHdpdGggaXRzIGFwcHJvcHJpYXRlIHBlcm1pc3Npb24uCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhBMmRwIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhBMmRwIGltcGxlbWVudHMgQmx1ZXRvb3RoUHJvZmlsZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhBMmRwIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwogCi0gICAgLyoqIGludCBleHRyYSBmb3IgQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NJTktfU1RBVEUgPQotICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYTJkcC5leHRyYS5TSU5LX1NUQVRFIjsKLSAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFVklPVVNfU0lOS19TVEFURSA9Ci0gICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hMmRwLmV4dHJhLlBSRVZJT1VTX1NJTktfU1RBVEUiOwotCi0gICAgLyoqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgYW4gQTJEUCBhdWRpbyBzaW5rIGhhcyBjaGFuZ2VkLgotICAgICAqIFRoaXMgaW50ZW50IHdpbGwgYWx3YXlzIGNvbnRhaW4gRVhUUkFfU0lOS19TVEFURSwKLSAgICAgKiBFWFRSQV9QUkVWSU9VU19TSU5LX1NUQVRFIGFuZCBCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFCi0gICAgICogZXh0cmFzLgorICAgIC8qKgorICAgICAqIEludGVudCB1c2VkIHRvIGJyb2FkY2FzdCB0aGUgY2hhbmdlIGluIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIEEyRFAKKyAgICAgKiBwcm9maWxlLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbnRlbnQgd2lsbCBoYXZlIDMgZXh0cmFzOgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IC0gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHByb2ZpbGUuCisgICAgICoge0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0tIFRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgcHJvZmlsZQorICAgICAqIHtAbGluayBCbHVldG9vdGhEZXZpY2UjRVhUUkFfREVWSUNFfSAtIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqCisgICAgICoge0BsaW5rICNFWFRSQV9TVEFURX0gb3Ige0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0gY2FuIGJlIGFueSBvZgorICAgICAqIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfSwge0BsaW5rICNTVEFURV9DT05ORUNUSU5HfSwKKyAgICAgKiB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0sIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVElOR30uCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USH0gdG8gcmVjZWl2ZS4KICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQgPQotICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYTJkcC5hY3Rpb24uU0lOS19TVEFURV9DSEFOR0VEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVElORyAgID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgICAgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOwotICAgIC8qKiBQbGF5aW5nIGltcGxpZXMgY29ubmVjdGVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUlORyAgICA9IDQ7CisgICAgLyoqCisgICAgICogSW50ZW50IHVzZWQgdG8gYnJvYWRjYXN0IHRoZSBjaGFuZ2UgaW4gdGhlIFBsYXlpbmcgc3RhdGUgb2YgdGhlIEEyRFAKKyAgICAgKiBwcm9maWxlLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbnRlbnQgd2lsbCBoYXZlIDMgZXh0cmFzOgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IC0gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHByb2ZpbGUuCisgICAgICoge0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0tIFRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgcHJvZmlsZQorICAgICAqIHtAbGluayBCbHVldG9vdGhEZXZpY2UjRVhUUkFfREVWSUNFfSAtIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqCisgICAgICoge0BsaW5rICNFWFRSQV9TVEFURX0gb3Ige0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0gY2FuIGJlIGFueSBvZgorICAgICAqIHtAbGluayAjU1RBVEVfUExBWUlOR30sIHtAbGluayAjU1RBVEVfTk9UX1BMQVlJTkd9LAorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHRvIHJlY2VpdmUuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUExBWUlOR19TVEFURV9DSEFOR0VEID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAucHJvZmlsZS5hY3Rpb24uUExBWUlOR19TVEFURV9DSEFOR0VEIjsKIAotICAgIC8qKiBEZWZhdWx0IHByaW9yaXR5IGZvciBhMmRwIGRldmljZXMgdGhhdCB3ZSB0cnkgdG8gYXV0by1jb25uZWN0Ci0gICAgICogYW5kIGFsbG93IGluY29taW5nIGNvbm5lY3Rpb25zICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfQVVUT19DT05ORUNUID0gMTAwMDsKLSAgICAvKiogRGVmYXVsdCBwcmlvcml0eSBmb3IgYTJkcCBkZXZpY2VzIHRoYXQgc2hvdWxkIGFsbG93IGluY29taW5nCi0gICAgICogY29ubmVjdGlvbnMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PTiA9IDEwMDsKLSAgICAvKiogRGVmYXVsdCBwcmlvcml0eSBmb3IgYTJkcCBkZXZpY2VzIHRoYXQgc2hvdWxkIG5vdCBhbGxvdyBpbmNvbWluZwotICAgICAqIGNvbm5lY3Rpb25zICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfT0ZGID0gMDsKLSAgICAvKiogRGVmYXVsdCBwcmlvcml0eSB3aGVuIG5vdCBzZXQgb3Igd2hlbiB0aGUgZGV2aWNlIGlzIHVucGFpcmVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfVU5ERUZJTkVEID0gLTE7CisgICAgLyoqCisgICAgICogQTJEUCBzaW5rIGRldmljZSBpcyBzdHJlYW1pbmcgbXVzaWMuIFRoaXMgc3RhdGUgY2FuIGJlIG9uZSBvZgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IG9yIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9IG9mCisgICAgICoge0BsaW5rICNBQ1RJT05fUExBWUlOR19TVEFURV9DSEFOR0VEfSBpbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUlORyAgID0gIDEwOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBJQmx1ZXRvb3RoQTJkcCBtU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgLyoqCisgICAgICogQTJEUCBzaW5rIGRldmljZSBpcyBOT1Qgc3RyZWFtaW5nIG11c2ljLiBUaGlzIHN0YXRlIGNhbiBiZSBvbmUgb2YKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSBvciB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfSBvZgorICAgICAqIHtAbGluayAjQUNUSU9OX1BMQVlJTkdfU1RBVEVfQ0hBTkdFRH0gaW50ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX05PVF9QTEFZSU5HICAgPSAgMTE7CisKKyAgICBwcml2YXRlIFNlcnZpY2VMaXN0ZW5lciBtU2VydmljZUxpc3RlbmVyOworICAgIHByaXZhdGUgSUJsdWV0b290aEEyZHAgbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoQTJkcCBwcm94eSBvYmplY3QgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGxvY2FsCiAgICAgICogQmx1ZXRvb3RoIEEyRFAgc2VydmljZS4KLSAgICAgKiBAcGFyYW0gYyBDb250ZXh0CisgICAgICoKICAgICAgKi8KLSAgICBwdWJsaWMgQmx1ZXRvb3RoQTJkcChDb250ZXh0IGMpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjOwotCisgICAgLypwYWNrYWdlKi8gQmx1ZXRvb3RoQTJkcChDb250ZXh0IG1Db250ZXh0LCBTZXJ2aWNlTGlzdGVuZXIgbCkgewogICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKEJsdWV0b290aEEyZHBTZXJ2aWNlLkJMVUVUT09USF9BMkRQX1NFUlZJQ0UpOworICAgICAgICBtU2VydmljZUxpc3RlbmVyID0gbDsKKyAgICAgICAgbUFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CiAgICAgICAgIGlmIChiICE9IG51bGwpIHsKICAgICAgICAgICAgIG1TZXJ2aWNlID0gSUJsdWV0b290aEEyZHAuU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgICAgIGlmIChtU2VydmljZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VydmljZUxpc3RlbmVyLm9uU2VydmljZUNvbm5lY3RlZChCbHVldG9vdGhQcm9maWxlLkEyRFAsIHRoaXMpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTG9nLncoVEFHLCAiQmx1ZXRvb3RoIEEyRFAgc2VydmljZSBub3QgYXZhaWxhYmxlISIpOwogCkBAIC0xMDksMTY3ICsxMjUsMjIyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiogSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIGFuIEEyRFAgc2luay4KLSAgICAgKiAgTGlzdGVuIGZvciBTSU5LX1NUQVRFX0NIQU5HRURfQUNUSU9OIHRvIGZpbmQgb3V0IHdoZW4gdGhlCi0gICAgICogIGNvbm5lY3Rpb24gaXMgY29tcGxldGVkLgotICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCi0gICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQotICAgICAqICBAaGlkZQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3RTaW5rKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0U2luaygiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0U2luayhkZXZpY2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdChkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqIEluaXRpYXRlIGRpc2Nvbm5lY3QgZnJvbSBhbiBBMkRQIHNpbmsuCi0gICAgICogIExpc3RlbiBmb3IgU0lOS19TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuCi0gICAgICogIGRpc2Nvbm5lY3QgaXMgY29tcGxldGVkLgotICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCi0gICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQotICAgICAqICBAaGlkZQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RTaW5rKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0U2luaygiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0U2luayhkZXZpY2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdChkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqIEluaXRpYXRlIHN1c3BlbmQgZnJvbSBhbiBBMkRQIHNpbmsuCi0gICAgICogIExpc3RlbiBmb3IgU0lOS19TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuCi0gICAgICogIHN1c3BlbmQgaXMgY29tcGxldGVkLgotICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCi0gICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQotICAgICAqICBAaGlkZQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcygpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWREZXZpY2VzKCkiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvRGV2aWNlU2V0KG1TZXJ2aWNlLmdldENvbm5lY3RlZERldmljZXMoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXZpY2VTZXQobmV3IEJsdWV0b290aERldmljZVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiB0b0RldmljZVNldChuZXcgQmx1ZXRvb3RoRGV2aWNlWzBdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW50W10gc3RhdGVzKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0RGV2aWNlc01hdGNoaW5nU3RhdGVzKCkiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvRGV2aWNlU2V0KG1TZXJ2aWNlLmdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoc3RhdGVzKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXZpY2VTZXQobmV3IEJsdWV0b290aERldmljZVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiB0b0RldmljZVNldChuZXcgQmx1ZXRvb3RoRGV2aWNlWzBdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldFN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKQorICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBpZiAoREJHKSBsb2coInNldFByaW9yaXR5KCIgKyBkZXZpY2UgKyAiLCAiICsgcHJpb3JpdHkgKyAiKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKQorICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICBpZiAocHJpb3JpdHkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5QUklPUklUWV9PRkYgJiYKKyAgICAgICAgICAgICAgICBwcmlvcml0eSAhPSBCbHVldG9vdGhQcm9maWxlLlBSSU9SSVRZX09OKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldFByaW9yaXR5KGRldmljZSwgcHJpb3JpdHkpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0UHJpb3JpdHkoIiArIGRldmljZSArICIpIik7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpCisgICAgICAgICAgICAmJiBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFByaW9yaXR5KGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5QUklPUklUWV9PRkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlBSSU9SSVRZX09GRjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBBMkRQIHByb2ZpbGUgaXMgc3RyZWFtaW5nIG11c2ljLgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIEJsdWV0b290aERldmljZSBkZXZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0EyZHBQbGF5aW5nKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKKyAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuaXNBMmRwUGxheWluZyhkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgc3VzcGVuZCBmcm9tIGFuIEEyRFAgc2luay4KKyAgICAgKgorICAgICAqIDxwPiBUaGlzIEFQSSB3aWxsIHJldHVybiBmYWxzZSBpbiBzY2VuYXJpb3MgbGlrZSB0aGUgQTJEUAorICAgICAqIGRldmljZSBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlIGV0Yy4gV2hlbiB0aGlzIEFQSSByZXR1cm5zLAorICAgICAqIHRydWUsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB7QGxpbmsgI0FDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUR9CisgICAgICogaW50ZW50IHdpbGwgYmUgYnJvYWRjYXN0ZWQgd2l0aCB0aGUgc3RhdGUuIFVzZXJzIGNhbiBnZXQgdGhlCisgICAgICogc3RhdGUgb2YgdGhlIEEyRFAgZGV2aWNlIGZyb20gdGhpcyBpbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USF9BRE1JTn0KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEEyRFAgc2luaworICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLAorICAgICAqICAgICAgICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1c3BlbmRTaW5rKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zdXNwZW5kU2luayhkZXZpY2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpCisgICAgICAgICAgICAmJiBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnN1c3BlbmRTaW5rKGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKiogSW5pdGlhdGUgcmVzdW1lIGZyb20gYW4gc3VzcGVuZGVkIEEyRFAgc2luay4KLSAgICAgKiAgTGlzdGVuIGZvciBTSU5LX1NUQVRFX0NIQU5HRURfQUNUSU9OIHRvIGZpbmQgb3V0IHdoZW4KLSAgICAgKiAgcmVzdW1lIGlzIGNvbXBsZXRlZC4KLSAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgotICAgICAqICBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKLSAgICAgKiAgQGhpZGUKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSByZXN1bWUgZnJvbSBhIHN1c3BlbmRlZCBBMkRQIHNpbmsuCisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBBUEkgd2lsbCByZXR1cm4gZmFsc2UgaW4gc2NlbmFyaW9zIGxpa2UgdGhlIEEyRFAKKyAgICAgKiBkZXZpY2UgaXMgbm90IGluIHN1c3BlbmRlZCBzdGF0ZSBldGMuIFdoZW4gdGhpcyBBUEkgcmV0dXJucywKKyAgICAgKiB0cnVlLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQge0BsaW5rICNBQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEfQorICAgICAqIGludGVudCB3aWxsIGJlIGJyb2FkY2FzdGVkIHdpdGggdGhlIHN0YXRlLiBVc2VycyBjYW4gZ2V0IHRoZQorICAgICAqIHN0YXRlIG9mIHRoZSBBMkRQIGRldmljZSBmcm9tIHRoaXMgaW50ZW50LgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBBMkRQIHNpbmsKKyAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwKKyAgICAgKiAgICAgICAgICAgICAgIHRydWUgb3RoZXJ3aXNlCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZXN1bWVTaW5rKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5yZXN1bWVTaW5rKGRldmljZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKKyAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UucmVzdW1lU2luayhkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqIENoZWNrIGlmIGEgc3BlY2lmaWVkIEEyRFAgc2luayBpcyBjb25uZWN0ZWQuCi0gICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KLSAgICAgKiAgQHJldHVybiBUcnVlIGlmIGNvbm5lY3RlZCAob3IgcGxheWluZyksIGZhbHNlIG90aGVyd2lzZSBhbmQgb24gZXJyb3IuCi0gICAgICogIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaW5rQ29ubmVjdGVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJpc1NpbmtDb25uZWN0ZWQoIiArIGRldmljZSArICIpIik7Ci0gICAgICAgIGludCBzdGF0ZSA9IGdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdGUgPT0gU1RBVEVfQ09OTkVDVEVEIHx8IHN0YXRlID09IFNUQVRFX1BMQVlJTkc7Ci0gICAgfQotCi0gICAgLyoqIENoZWNrIGlmIGFueSBBMkRQIHNpbmsgaXMgY29ubmVjdGVkLgotICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgc2V0IG9mIGNvbm5lY3RlZCBBMkRQIHNpbmtzLCBvciBudWxsIG9uIGVycm9yLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZFNpbmtzKCkgewotICAgICAgICBpZiAoREJHKSBsb2coImdldENvbm5lY3RlZFNpbmtzKCkiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXRDb25uZWN0ZWRTaW5rcygpKSkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBDaGVjayBpZiBhbnkgQTJEUCBzaW5rIGlzIGluIE5vbiBEaXNjb25uZWN0ZWQgc3RhdGUKLSAgICAgKiBpLmUgcGxheWluZywgY29ubmVjdGVkLCBjb25uZWN0aW5nLCBkaXNjb25uZWN0aW5nLgotICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgc2V0IG9mIGNvbm5lY3RlZCBBMkRQIHNpbmtzLCBvciBudWxsIG9uIGVycm9yLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldE5vbkRpc2Nvbm5lY3RlZFNpbmtzKCkgewotICAgICAgICBpZiAoREJHKSBsb2coImdldE5vbkRpc2Nvbm5lY3RlZFNpbmtzKCkiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXROb25EaXNjb25uZWN0ZWRTaW5rcygpKSkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHN0YXRlIG9mIGFuIEEyRFAgc2luawotICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCi0gICAgICogIEByZXR1cm4gU3RhdGUgY29kZSwgb25lIG9mIFNUQVRFXwotICAgICAqICBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2lua1N0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJnZXRTaW5rU3RhdGUoIiArIGRldmljZSArICIpIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0U2lua1N0YXRlKGRldmljZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBwcmlvcml0eSBvZiBhMmRwIHNpbmsuCi0gICAgICogUHJpb3JpdHkgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gQnkgZGVmYXVsdCBwYWlyZWQgc2lua3Mgd2lsbCBoYXZlCi0gICAgICogYSBwcmlvcml0eSBvZiBQUklPUklUWV9BVVRPLCBhbmQgdW5wYWlyZWQgaGVhZHNldCBQUklPUklUWV9OT05FICgwKS4KLSAgICAgKiBTaW5rcyB3aXRoIHByaW9yaXR5IGdyZWF0ZXIgdGhhbiB6ZXJvIHdpbGwgYWNjZXB0IGluY29taW5nIGNvbm5lY3Rpb25zCi0gICAgICogKGlmIG5vIHNpbmsgaXMgY3VycmVudGx5IGNvbm5lY3RlZCkuCi0gICAgICogUHJpb3JpdHkgZm9yIHVucGFpcmVkIHNpbmsgbXVzdCBiZSBQUklPUklUWV9OT05FLgotICAgICAqIEBwYXJhbSBkZXZpY2UgUGFpcmVkIHNpbmsKLSAgICAgKiBAcGFyYW0gcHJpb3JpdHkgSW50ZWdlciBwcmlvcml0eSwgZm9yIGV4YW1wbGUgUFJJT1JJVFlfQVVUTyBvcgotICAgICAqICAgICAgICAgICAgICAgICBQUklPUklUWV9OT05FCi0gICAgICogQHJldHVybiB0cnVlIGlmIHByaW9yaXR5IGlzIHNldCwgZmFsc2Ugb24gZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRTaW5rUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygic2V0U2lua1ByaW9yaXR5KCIgKyBkZXZpY2UgKyAiLCAiICsgcHJpb3JpdHkgKyAiKSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldFNpbmtQcmlvcml0eShkZXZpY2UsIHByaW9yaXR5KTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHByaW9yaXR5IG9mIGEyZHAgc2luay4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFNpbmsKLSAgICAgKiBAcmV0dXJuIG5vbi1uZWdhdGl2ZSBwcmlvcml0eSwgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNpbmtQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygiZ2V0U2lua1ByaW9yaXR5KCIgKyBkZXZpY2UgKyAiKSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFNpbmtQcmlvcml0eShkZXZpY2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gUFJJT1JJVFlfT0ZGOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEhlbHBlciBmb3IgY29udmVydGluZyBhIHN0YXRlIHRvIGEgc3RyaW5nLgorICAgICAvKioKKyAgICAgKiBIZWxwZXIgZm9yIGNvbnZlcnRpbmcgYSBzdGF0ZSB0byBhIHN0cmluZy4KKyAgICAgKgogICAgICAqIEZvciBkZWJ1ZyB1c2Ugb25seSAtIHN0cmluZ3MgYXJlIG5vdCBpbnRlcm5hdGlvbmFsaXplZC4KICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtMjg1LDEyICszNTYsMzEgQEAKICAgICAgICAgICAgIHJldHVybiAiZGlzY29ubmVjdGluZyI7CiAgICAgICAgIGNhc2UgU1RBVEVfUExBWUlORzoKICAgICAgICAgICAgIHJldHVybiAicGxheWluZyI7CisgICAgICAgIGNhc2UgU1RBVEVfTk9UX1BMQVlJTkc6CisgICAgICAgICAgcmV0dXJuICJub3QgcGxheWluZyI7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gIjx1bmtub3duIHN0YXRlICIgKyBzdGF0ZSArICI+IjsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgaWYgKG1BZGFwdGVyLmdldFN0YXRlKCkgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTikgcmV0dXJuIHRydWU7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHJldHVybiBmYWxzZTsKKworICAgICAgIGlmIChCbHVldG9vdGhBZGFwdGVyLmNoZWNrQmx1ZXRvb3RoQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKSkgcmV0dXJuIHRydWU7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PEJsdWV0b290aERldmljZT4gdG9EZXZpY2VTZXQoQmx1ZXRvb3RoRGV2aWNlW10gZGV2aWNlcykgeworICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCisgICAgICAgICAgbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPihBcnJheXMuYXNMaXN0KGRldmljZXMpKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBMb2cuZChUQUcsIG1zZyk7CisgICAgICBMb2cuZChUQUcsIG1zZyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBZGFwdGVyLmphdmEKaW5kZXggMzA0MDMxOS4uYzY2YjJkZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQWRhcHRlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtMjc5LDYgKzI4MCw2MSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0xPQ0FMX05BTUUgPSAiYW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5leHRyYS5MT0NBTF9OQU1FIjsKIAorICAgIC8qKgorICAgICAqIEludGVudCB1c2VkIHRvIGJyb2FkY2FzdCB0aGUgY2hhbmdlIGluIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIGxvY2FsCisgICAgICogQmx1ZXRvb3RoIGFkYXB0ZXIgdG8gYSBwcm9maWxlIG9mIHRoZSByZW1vdGUgZGV2aWNlLiBXaGVuIHRoZSBhZGFwdGVyIGlzCisgICAgICogbm90IGNvbm5lY3RlZCB0byBhbnkgcHJvZmlsZXMgb2YgYW55IHJlbW90ZSBkZXZpY2VzIGFuZCBpdCBhdHRlbXB0cyBhCisgICAgICogY29ubmVjdGlvbiB0byBhIHByb2ZpbGUgdGhpcyBpbnRlbnQgd2lsbCBzZW50LiBPbmNlIGNvbm5lY3RlZCwgdGhpcyBpbnRlbnQKKyAgICAgKiB3aWxsIG5vdCBiZSBzZW50IGZvciBhbnkgbW9yZSBjb25uZWN0aW9uIGF0dGVtcHRzIHRvIGFueSBwcm9maWxlcyBvZiBhbnkKKyAgICAgKiByZW1vdGUgZGV2aWNlLiBXaGVuIHRoZSBhZGFwdGVyIGRpc2Nvbm5lY3RzIGZyb20gdGhlIGxhc3QgcHJvZmlsZSBpdHMKKyAgICAgKiBjb25uZWN0ZWQgdG8gb2YgYW55IHJlbW90ZSBkZXZpY2UsIHRoaXMgaW50ZW50IHdpbGwgYmUgc2VudC4KKyAgICAgKgorICAgICAqIDxwPiBUaGlzIGludGVudCBpcyB1c2VmdWwgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBvbmx5IGNvbmNlcm5lZCBhYm91dAorICAgICAqIHdoZXRoZXIgdGhlIGxvY2FsIGFkYXB0ZXIgaXMgY29ubmVjdGVkIHRvIGFueSBwcm9maWxlIG9mIGFueSBkZXZpY2UgYW5kCisgICAgICogYXJlIG5vdCByZWFsbHkgY29uY2VybmVkIGFib3V0IHdoaWNoIHByb2ZpbGUuIEZvciBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbgorICAgICAqIHdoaWNoIGRpc3BsYXlzIGFuIGljb24gdG8gZGlzcGxheSB3aGV0aGVyIEJsdWV0b290aCBpcyBjb25uZWN0ZWQgb3Igbm90CisgICAgICogY2FuIHVzZSB0aGlzIGludGVudC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW50ZW50IHdpbGwgaGF2ZSAzIGV4dHJhczoKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSAtIFRoZSBjdXJyZW50IHN0YXRlLgorICAgICAqIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9LSBUaGUgcHJldmlvdXMuCisgICAgICoge0BsaW5rIEJsdWV0b290aERldmljZSNFWFRSQV9ERVZJQ0V9IC0gVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSBvciB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfSBjYW4gYmUgYW55IG9mCisgICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LCB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RJTkd9LAorICAgICAqIHtAbGluayAjU1RBVEVfQ09OTkVDVEVEfSwge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfS4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSB0byByZWNlaXZlLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hZGFwdGVyLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiOworCisgICAgLyoqCisgICAgICogRXh0cmEgdXNlZCBieSB7QGxpbmsgI0FDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUR9CisgICAgICoKKyAgICAgKiBUaGlzIGV4dHJhIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9DT05ORUNUSU9OX1NUQVRFID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmFkYXB0ZXIuZXh0cmEuQ09OTkVDVElPTl9TVEFURSI7CisKKyAgICAvKioKKyAgICAgKiBFeHRyYSB1c2VkIGJ5IHtAbGluayAjQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRH0KKyAgICAgKgorICAgICAqIFRoaXMgZXh0cmEgcmVwcmVzZW50cyB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19DT05ORUNUSU9OX1NUQVRFID0KKyAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5leHRyYS5QUkVWSU9VU19DT05ORUNUSU9OX1NUQVRFIjsKKworICAgIC8qKiBUaGUgcHJvZmlsZSBpcyBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURUQgID0gMDsKKyAgICAvKiogVGhlIHByb2ZpbGUgaXMgaW4gY29ubmVjdGluZyBzdGF0ZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgICAgPSAxOworICAgIC8qKiBUaGUgcHJvZmlsZSBpcyBpbiBjb25uZWN0ZWQgc3RhdGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgICAgID0gMjsKKyAgICAvKiogVGhlIHByb2ZpbGUgaXMgaW4gZGlzY29ubmVjdGluZyBzdGF0ZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOworCiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRVRPT1RIX1NFUlZJQ0UgPSAiYmx1ZXRvb3RoIjsKIApAQCAtODk2LDYgKzk1Miw1NCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKgorICAgICAqIEdldCB0aGUgcHJvZmlsZSBwcm94eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9maWxlLgorICAgICAqCisgICAgICogPHA+UHJvZmlsZSBjYW4gYmUgb25lIG9mIHtAbGluayBCbHVldG9vdGhQcm9maWxlLkhFQURTRVR9IG9yCisgICAgICoge0BsaW5rIEJsdWV0b290aFByb2ZpbGUuQTJEUH0uIENsaWVudHMgbXVzdCBpbXBsZW1lbnRzCisgICAgICoge0BsaW5rIEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyfSB0byBnZXQgbm90aWZpZWQgb2YKKyAgICAgKiB0aGUgY29ubmVjdGlvbiBzdGF0dXMgYW5kIHRvIGdldCB0aGUgcHJveHkgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIHNlcnZpY2UgTGlzdGVuZXIgZm9yIGNvbm5lY3Rpb24gY2FsbGJhY2tzLgorICAgICAqIEBwYXJhbSBwcm9maWxlCisgICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UHJvZmlsZVByb3h5KENvbnRleHQgY29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZS5TZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9maWxlKSB7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwgfHwgbGlzdGVuZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCkgeworICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldCBoZWFkc2V0ID0gbmV3IEJsdWV0b290aEhlYWRzZXQoY29udGV4dCwgbGlzdGVuZXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLkEyRFApIHsKKyAgICAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKGNvbnRleHQsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIHByb2ZpbGUgcHJveHkgdG8gdGhlIFNlcnZpY2UuCisgICAgICoKKyAgICAgKiA8cD4gQ2xpZW50cyBzaG91bGQgY2FsbCB0aGlzIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIHVzaW5nCisgICAgICogdGhlIHByb3h5IG9idGFpbmVkIGZyb20ge0BsaW5rICNnZXRQcm9maWxlUHJveHl9LgorICAgICAqIFByb2ZpbGUgY2FuIGJlIG9uZSBvZiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNIRUFEU0VUfSBvcgorICAgICAqIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0EyRFB9CisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvZmlsZQorICAgICAqIEBwYXJhbSBwcm94eSBQcm9maWxlIHByb3h5IG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlUHJvZmlsZVByb3h5KGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCkgeworICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldCBoZWFkc2V0ID0gKEJsdWV0b290aEhlYWRzZXQpcHJveHk7CisgICAgICAgICAgICBpZiAoaGVhZHNldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGVhZHNldC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiB0b0RldmljZVNldChTdHJpbmdbXSBhZGRyZXNzZXMpIHsKICAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oYWRkcmVzc2VzLmxlbmd0aCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSsrKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCmluZGV4IDZhODc4ZDcuLmU2MDRlNmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCkBAIC0yNTksNiArMjU5LDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9BMkRQID0gMTsKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX09QUCA9IDI7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9ISUQgPSAzOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfUEFOVSA9IDQ7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9OQVAgPSA1OwogCiAgICAgLyoqCiAgICAgICogQ2hlY2sgY2xhc3MgYml0cyBmb3IgcG9zc2libGUgYmx1ZXRvb3RoIHByb2ZpbGUgc3VwcG9ydC4KQEAgLTMyNCw2ICszMzAsMTQgQEAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBQUk9GSUxFX0hJRCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLlBFUklQSEVSQUwpID09IERldmljZS5NYWpvci5QRVJJUEhFUkFMOworICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gUFJPRklMRV9QQU5VIHx8IHByb2ZpbGUgPT0gUFJPRklMRV9OQVApeworICAgICAgICAgICAgLy8gTm8gZ29vZCB3YXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvLCBiYXNlZCBvbiBjbGFzcyBiaXRzLgorICAgICAgICAgICAgaWYgKGhhc1NlcnZpY2UoU2VydmljZS5ORVRXT1JLSU5HKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLk5FVFdPUktJTkcpID09IERldmljZS5NYWpvci5ORVRXT1JLSU5HOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEKaW5kZXggM2EwNzAzMy4uYzc5NGJlMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVBpY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQaWNrZXIuamF2YQpAQCAtNjQsNCArNjQsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX0FVRElPID0gMTsKICAgICAvKiogQXNrIGRldmljZSBwaWNrZXIgdG8gc2hvdyBCVCBkZXZpY2VzIHRoYXQgc3VwcG9ydCBPYmplY3QgVHJhbnNmZXIgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfVFlQRV9UUkFOU0ZFUiA9IDI7CisgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQKKyAgICAgKiBQZXJzb25hbCBBcmVhIE5ldHdvcmtpbmcgVXNlciAoUEFOVSkgcHJvZmlsZSovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSX1RZUEVfUEFOVSA9IDM7CisgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQgTmV0d29yayBBY2Nlc3MgUG9pbnQgKE5BUCkgcHJvZmlsZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX05BUCA9IDQ7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEKaW5kZXggZGYxZDk2MC4uZTQ2MDgzOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhBMmRwU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0yOCw2ICsyOSw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IaWVyYXJjaGljYWxTdGF0ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTsKIAoraW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKgogICogVGhpcyBjbGFzcyBpcyB0aGUgUHJvZmlsZSBjb25uZWN0aW9uIHN0YXRlIG1hY2hpbmUgYXNzb2NpYXRlZCB3aXRoIGEgcmVtb3RlCiAgKiBkZXZpY2UuIFdoZW4gdGhlIGRldmljZSBib25kcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQuCkBAIC01OCwxNiArNjEsMjAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOyAvL1NUT1BTSElQIC0gQ2hhbmdlIHRvIGZhbHNlCiAKKyAgICAvLyBUT0RPKCk6IFJlc3RydWN0dXJlIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIG1ha2UgaXQgc2NhbGFibGUgd2l0aCByZWdhcmQgdG8gcHJvZmlsZXMuCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9IRlBfT1VUR09JTkcgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSEZQX0lOQ09NSU5HID0gMjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0EyRFBfT1VUR09JTkcgPSAzOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfQTJEUF9JTkNPTUlORyA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9ISURfT1VUR09JTkcgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSElEX0lOQ09NSU5HID0gNjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfSU5DT01JTkcgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORyA9IDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HID0gODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX1BCQVBfT1VUR09JTkcgPSA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HID0gNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HID0gNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HID0gNTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HID0gNTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9ISURfT1VUR09JTkcgPSA1NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hJRF9JTkNPTUlORyA9IDU1OwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5QQUlSID0gMTAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fQ09OTkVDVF9QUk9GSUxFUyA9IDEwMTsKQEAgLTgwLDE4ICs4NywxOCBAQAogICAgIHByaXZhdGUgSW5jb21pbmdIYW5kc2ZyZWUgbUluY29taW5nSGFuZHNmcmVlID0gbmV3IEluY29taW5nSGFuZHNmcmVlKCk7CiAgICAgcHJpdmF0ZSBJbmNvbWluZ0EyZHAgbUluY29taW5nQTJkcCA9IG5ldyBJbmNvbWluZ0EyZHAoKTsKICAgICBwcml2YXRlIE91dGdvaW5nQTJkcCBtT3V0Z29pbmdBMmRwID0gbmV3IE91dGdvaW5nQTJkcCgpOworICAgIHByaXZhdGUgT3V0Z29pbmdIaWQgbU91dGdvaW5nSGlkID0gbmV3IE91dGdvaW5nSGlkKCk7CisgICAgcHJpdmF0ZSBJbmNvbWluZ0hpZCBtSW5jb21pbmdIaWQgPSBuZXcgSW5jb21pbmdIaWQoKTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIEJsdWV0b290aFNlcnZpY2UgbVNlcnZpY2U7CiAgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwU2VydmljZSBtQTJkcFNlcnZpY2U7CiAgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0ICBtSGVhZHNldFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhQYmFwICAgICBtUGJhcFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1IZWFkc2V0U2VydmljZUNvbm5lY3RlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVBiYXBTZXJ2aWNlQ29ubmVjdGVkOwogCiAgICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbURldmljZTsKLSAgICBwcml2YXRlIGludCBtSGVhZHNldFN0YXRlOwotICAgIHByaXZhdGUgaW50IG1BMmRwU3RhdGU7CisgICAgcHJpdmF0ZSBpbnQgbUhlYWRzZXRTdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOworICAgIHByaXZhdGUgaW50IG1BMmRwU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICBwcml2YXRlIGludCBtSGlkU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKIAogICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewogICAgICAgICBAT3ZlcnJpZGUKQEAgLTEwMCwzMiArMTA3LDQyIEBACiAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKTsKICAgICAgICAgICAgIGlmICghZGV2aWNlLmVxdWFscyhtRGV2aWNlKSkgcmV0dXJuOwogCi0gICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhIZWFkc2V0LkVYVFJBX1NUQVRFLCAwKTsKLSAgICAgICAgICAgICAgICBpbnQgb2xkU3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSGVhZHNldC5FWFRSQV9QUkVWSU9VU19TVEFURSwgMCk7Ci0gICAgICAgICAgICAgICAgaW50IGluaXRpYXRvciA9IGludGVudC5nZXRJbnRFeHRyYSgKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5FWFRSQV9ESVNDT05ORUNUX0lOSVRJQVRPUiwKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5MT0NBTF9ESVNDT05ORUNUKTsKLSAgICAgICAgICAgICAgICBtSGVhZHNldFN0YXRlID0gbmV3U3RhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICAgICAgIGluaXRpYXRvciA9PSBCbHVldG9vdGhIZWFkc2V0LlJFTU9URV9ESVNDT05ORUNUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBMmRwLkVYVFJBX1NJTktfU1RBVEUsIDApOwotICAgICAgICAgICAgICAgIGludCBvbGRTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBMmRwLkVYVFJBX1BSRVZJT1VTX1NJTktfU1RBVEUsIDApOworICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgb2xkU3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9QUkVWSU9VU19TVEFURSwgMCk7CiAgICAgICAgICAgICAgICAgbUEyZHBTdGF0ZSA9IG5ld1N0YXRlOwotICAgICAgICAgICAgICAgIGlmICgob2xkU3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEICYmCisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCB8fAorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfUFJFVklPVVNfU1RBVEUsIDApOworCisgICAgICAgICAgICAgICAgbUhlYWRzZXRTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCAmJgorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0hGUF9JTkNPTUlORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCB8fAorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgb2xkU3RhdGUgPQorICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBtSGlkU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICBpZiAob2xkU3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEICYmCisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0hJRF9JTkNPTUlORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9BQ0xfQ09OTkVDVEVEKSkgewpAQCAtMTY4LDUxICsxODUsMzcgQEAKICAgICAgICAgYWRkU3RhdGUobUluY29taW5nSGFuZHNmcmVlKTsKICAgICAgICAgYWRkU3RhdGUobUluY29taW5nQTJkcCk7CiAgICAgICAgIGFkZFN0YXRlKG1PdXRnb2luZ0EyZHApOworICAgICAgICBhZGRTdGF0ZShtT3V0Z29pbmdIaWQpOworICAgICAgICBhZGRTdGF0ZShtSW5jb21pbmdIaWQpOwogICAgICAgICBzZXRJbml0aWFsU3RhdGUobUJvbmRlZERldmljZSk7CiAKICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKICAgICAgICAgLy8gRmluZS1ncmFpbmVkIHN0YXRlIGJyb2FkY2FzdHMKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aERldmljZS5BQ1RJT05fQUNMX0NPTk5FQ1RFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CiAKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7CiAKLSAgICAgICAgSGVhZHNldFNlcnZpY2VMaXN0ZW5lciBsID0gbmV3IEhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIoKTsKLSAgICAgICAgUGJhcFNlcnZpY2VMaXN0ZW5lciBwID0gbmV3IFBiYXBTZXJ2aWNlTGlzdGVuZXIoKTsKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBhZGFwdGVyLmdldFByb2ZpbGVQcm94eShtQ29udGV4dCwgbUJsdWV0b290aFByb2ZpbGVTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBIZWFkc2V0U2VydmljZUxpc3RlbmVyIGltcGxlbWVudHMgQmx1ZXRvb3RoSGVhZHNldC5TZXJ2aWNlTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgSGVhZHNldFNlcnZpY2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIG1IZWFkc2V0U2VydmljZSA9IG5ldyBCbHVldG9vdGhIZWFkc2V0KG1Db250ZXh0LCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoKSB7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciBtQmx1ZXRvb3RoUHJvZmlsZVNlcnZpY2VMaXN0ZW5lciA9CisgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICBtSGVhZHNldFNlcnZpY2VDb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1IZWFkc2V0U2VydmljZSA9IChCbHVldG9vdGhIZWFkc2V0KSBwcm94eTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSkgewogICAgICAgICAgICAgc3luY2hyb25pemVkKEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXRTZXJ2aWNlQ29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUhlYWRzZXRTZXJ2aWNlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUGJhcFNlcnZpY2VMaXN0ZW5lciBpbXBsZW1lbnRzIEJsdWV0b290aFBiYXAuU2VydmljZUxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIFBiYXBTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBtUGJhcFNlcnZpY2UgPSBuZXcgQmx1ZXRvb3RoUGJhcChtQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkKEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgbVBiYXBTZXJ2aWNlQ29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICBtUGJhcFNlcnZpY2VDb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKyAgICB9OwogCiAgICAgcHJpdmF0ZSBjbGFzcyBCb25kZWREZXZpY2UgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtMjQ0LDggKzI0NywxMyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nQTJkcCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9QQkFQX09VVEdPSU5HOgotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZChESVNDT05ORUNUX1BCQVBfT1VUR09JTkcpOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1PdXRnb2luZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgICAgICBpZiAobUhlYWRzZXRTdGF0ZSAhPSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCkgewpAQCAtMjU2LDYgKzI2NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1IaWRTdGF0ZSAhPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfSElEX09VVEdPSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kKFVOUEFJUik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjYzLDE5ICsyNzUsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGhvbmVEb2NrZWQobURldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGF1dG8gY29ubmVjdCB0byBkb2Nrcy4KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtSGVhZHNldFNlcnZpY2VDb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSGVhZHNldFNlcnZpY2UgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0U2VydmljZS5nZXRQcmlvcml0eShtRGV2aWNlKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5QUklPUklUWV9BVVRPX0NPTk5FQ1QgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtSGVhZHNldFNlcnZpY2UuaXNDb25uZWN0ZWQobURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldFNlcnZpY2UuY29ubmVjdEhlYWRzZXQobURldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldFNlcnZpY2UuZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10ge0JsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HfSkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldFNlcnZpY2UuY29ubmVjdChtRGV2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQTJkcFNlcnZpY2UgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmdldFNpbmtQcmlvcml0eShtRGV2aWNlKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmdldFByaW9yaXR5KG1EZXZpY2UpID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmdldENvbm5lY3RlZFNpbmtzKCkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcFNlcnZpY2UuY29ubmVjdFNpbmsobURldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcFNlcnZpY2UuZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10ge0JsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HfSkubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcFNlcnZpY2UuY29ubmVjdChtRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KG1EZXZpY2UpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9BVVRPX0NPTk5FQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5jb25uZWN0SW5wdXREZXZpY2UobURldmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zNjUsNyArMzg3LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX1BCQVBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTQzMyw3ICs0NzEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBjYXVzZXMgaW5jb21pbmcgSEZQIHRvIGZhaWwsIGl0IGlzIG1vcmUgb2YgYSBoZWFkc2V0IHByb2JsZW0KICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgYm90aCBjb25uZWN0aW9ucyBhcmUgaW5jb21pbmcgb25lcy4KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX1BCQVBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNTIxLDcgKzU2NSwyMyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfUEJBUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNTg3LDcgKzY0NywxMyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfUEJBUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGlnbm9yZQogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIGNhc2UgQVVUT19DT05ORUNUX1BST0ZJTEVTOgogICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CkBAIC02MDMsMTEgKzY2OSwxNDggQEAKICAgICB9CiAKIAorICAgIHByaXZhdGUgY2xhc3MgT3V0Z29pbmdIaWQgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhdHVzID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgaW50IG1Db21tYW5kOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGxvZygiRW50ZXJpbmcgT3V0Z29pbmdIaWQgc3RhdGUgd2l0aDogIiArIGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCk7CisgICAgICAgICAgICBtQ29tbWFuZCA9IGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdDsKKyAgICAgICAgICAgIGlmIChtQ29tbWFuZCAhPSBDT05ORUNUX0hJRF9PVVRHT0lORyAmJgorICAgICAgICAgICAgICAgIG1Db21tYW5kICE9IERJU0NPTk5FQ1RfSElEX09VVEdPSU5HKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3I6IE91dGdvaW5nSGlkIHN0YXRlIHdpdGggY29tbWFuZDoiICsgbUNvbW1hbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXR1cyA9IHByb2Nlc3NDb21tYW5kKG1Db21tYW5kKTsKKyAgICAgICAgICAgIGlmICghbVN0YXR1cykgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgbG9nKCJPdXRnb2luZ0hpZCBTdGF0ZS0+UHJvY2Vzc2luZyBNZXNzYWdlOiAiICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIE1lc3NhZ2UgZGVmZXJNc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIC8vIGRlZmVyIGFsbCBvdXRnb2luZyBtZXNzYWdlcworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nSGFuZHNmcmVlKTsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0EyZHApOworCisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGNhbmNlbCBISUQgb3V0Z29pbmcgYXMgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgZ2V0IGNhbmNlbGVkLgorICAgICAgICAgICAgICAgICAgICAvLyBJdCBtaWdodCBhbHJlYWR5IGJlIGNvbm5lY3RlZCBidXQgd2UgbWlnaHQgbm90IGhhdmUgZ290IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFLiBIZW5jZSwgbm8gcG9pbnQgZGlzY29ubmVjdGluZyBoZXJlLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd29yc3QgY2FzZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBmYWlsLCByZXRyeS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgIC8vIEJsdWV6IHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBjb25mbGljdHMKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hGUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgYXJlIGFscmVhZHkgZGlzY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggSEZQLiBTb21ldGltZXMgSElEIGNvbm5lY3Rpb24gY2FuCisgICAgICAgICAgICAgICAgICAgIC8vIGZhaWwgZHVlIHRvIHRoZSBkaXNjb25uZWN0aW9uIG9mIEhGUC4gU28gYWRkIGEgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBISUQuCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSwgd2lsbCBiZSBoYW5kbGVkIGJ5IEJsdWV6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CisgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUUkFOU0lUSU9OX1RPX1NUQUJMRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Cb25kZWREZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlIGNsYXNzIEluY29taW5nSGlkIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgcHJpdmF0ZSBib29sZWFuIG1TdGF0dXMgPSBmYWxzZTsKKyAgICAgIHByaXZhdGUgaW50IG1Db21tYW5kOworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIGVudGVyKCkgeworICAgICAgICAgIGxvZygiRW50ZXJpbmcgSW5jb21pbmdIaWQgc3RhdGUgd2l0aDogIiArIGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCk7CisgICAgICAgICAgbUNvbW1hbmQgPSBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQ7CisgICAgICAgICAgaWYgKG1Db21tYW5kICE9IENPTk5FQ1RfSElEX0lOQ09NSU5HICYmCisgICAgICAgICAgICAgIG1Db21tYW5kICE9IERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HKSB7CisgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yOiBJbmNvbWluZ0hpZCBzdGF0ZSB3aXRoIGNvbW1hbmQ6IiArIG1Db21tYW5kKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbVN0YXR1cyA9IHByb2Nlc3NDb21tYW5kKG1Db21tYW5kKTsKKyAgICAgICAgICBpZiAoIW1TdGF0dXMpIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICBsb2coIkluY29taW5nSGlkIFN0YXRlLT5Qcm9jZXNzaW5nIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgIE1lc3NhZ2UgZGVmZXJNc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfSU5DT01JTkc6CisgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkbid0IGhhcHBlbiBidXQgaWYgZG9lcywgd2UgY2FuIGhhbmRsZSBpdC4KKyAgICAgICAgICAgICAgICAgIC8vIERlcGVuZHMgaWYgdGhlIGhlYWRzZXQgY2FuIGhhbmRsZSBpdC4KKyAgICAgICAgICAgICAgICAgIC8vIEluY29taW5nIEhJRCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXosIERpc2Nvbm5lY3QgSEZQCisgICAgICAgICAgICAgICAgICAvLyB0aGUgc29ja2V0IHdvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNsb3NlZC4KKyAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKKyAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CisgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBUUkFOU0lUSU9OX1RPX1NUQUJMRToKKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQm9uZGVkRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgIH0KKyAgfQorCiAKICAgICBzeW5jaHJvbml6ZWQgdm9pZCBjYW5jZWxDb21tYW5kKGludCBjb21tYW5kKSB7CiAgICAgICAgIGlmIChjb21tYW5kID09IENPTk5FQ1RfSEZQX09VVEdPSU5HICkgewogICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSBvdXRnb2luZyB0aHJlYWQuCi0gICAgICAgICAgICBpZiAobUhlYWRzZXRTZXJ2aWNlQ29ubmVjdGVkKSB7CisgICAgICAgICAgICBpZiAobUhlYWRzZXRTZXJ2aWNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtSGVhZHNldFNlcnZpY2UuY2FuY2VsQ29ubmVjdFRocmVhZCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gSGVhZHNldFNlcnZpY2UgaXMgZG93bi4gUGhvbmUgcHJvY2VzcyBtb3N0IGxpa2VseSBjcmFzaGVkLgpAQCAtNjE1LDcgKzgxOCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzeW5jaHJvbml6ZWQgdm9pZCBkZWZlclByb2ZpbGVTZXJ2aWNlTWVzc2FnZShpbnQgY29tbWFuZCkgeworICAgIHN5bmNocm9uaXplZCB2b2lkIGRlZmVySGVhZHNldE1lc3NhZ2UoaW50IGNvbW1hbmQpIHsKICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOwogICAgICAgICBtc2cud2hhdCA9IGNvbW1hbmQ7CiAgICAgICAgIGRlZmVyTWVzc2FnZShtc2cpOwpAQCAtNjI1LDEzICs4MjgsMTUgQEAKICAgICAgICAgbG9nKCJQcm9jZXNzaW5nIGNvbW1hbmQ6IiArIGNvbW1hbmQpOwogICAgICAgICBzd2l0Y2goY29tbWFuZCkgewogICAgICAgICAgICAgY2FzZSAgQ09OTkVDVF9IRlBfT1VUR09JTkc6Ci0gICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0U2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0U2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVySGVhZHNldE1lc3NhZ2UoY29tbWFuZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1IZWFkc2V0U2VydmljZS5jb25uZWN0SGVhZHNldEludGVybmFsKG1EZXZpY2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfSU5DT01JTkc6Ci0gICAgICAgICAgICAgICAgaWYgKCFtSGVhZHNldFNlcnZpY2VDb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJQcm9maWxlU2VydmljZU1lc3NhZ2UoY29tbWFuZCk7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0U2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVySGVhZHNldE1lc3NhZ2UoY29tbWFuZCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSGVhZHNldFN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVElORykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUhlYWRzZXRTZXJ2aWNlLmFjY2VwdEluY29taW5nQ29ubmVjdChtRGV2aWNlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1IZWFkc2V0U3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQpIHsKQEAgLTY0NiwxNSArODUxLDE0IEBACiAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIEJsdWV6IHRha2VzIGNhcmUKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNvbm5lY3RJbnB1dERldmljZUludGVybmFsKG1EZXZpY2UpOworICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfT1VUR09JTkc6Ci0gICAgICAgICAgICAgICAgaWYgKCFtSGVhZHNldFNlcnZpY2VDb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJQcm9maWxlU2VydmljZU1lc3NhZ2UoY29tbWFuZCk7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0U2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVySGVhZHNldE1lc3NhZ2UoY29tbWFuZCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGlzY29ubmVjdCBQQkFQCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oKTogQWRkIFBCQVAgdG8gdGhlIHN0YXRlIG1hY2hpbmUuCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG0ud2hhdCA9IERJU0NPTk5FQ1RfUEJBUF9PVVRHT0lORzsKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG0pOwogICAgICAgICAgICAgICAgICAgICBpZiAobUhlYWRzZXRTZXJ2aWNlLmdldFByaW9yaXR5KG1EZXZpY2UpID09CiAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhIZWFkc2V0LlBSSU9SSVRZX0FVVE9fQ09OTkVDVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRTZXJ2aWNlLnNldFByaW9yaXR5KG1EZXZpY2UsIEJsdWV0b290aEhlYWRzZXQuUFJJT1JJVFlfT04pOwpAQCAtNjcwLDIwICs4NzQsMjIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HOgogICAgICAgICAgICAgICAgIGlmIChtQTJkcFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUEyZHBTZXJ2aWNlLmdldFNpbmtQcmlvcml0eShtRGV2aWNlKSA9PQorICAgICAgICAgICAgICAgICAgICBpZiAobUEyZHBTZXJ2aWNlLmdldFByaW9yaXR5KG1EZXZpY2UpID09CiAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLnNldFNpbmtQcmlvcml0eShtRGV2aWNlLCBCbHVldG9vdGhIZWFkc2V0LlBSSU9SSVRZX09OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwU2VydmljZS5zZXRQcmlvcml0eShtRGV2aWNlLCBCbHVldG9vdGhIZWFkc2V0LlBSSU9SSVRZX09OKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUEyZHBTZXJ2aWNlLmRpc2Nvbm5lY3RTaW5rSW50ZXJuYWwobURldmljZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX1BCQVBfT1VUR09JTkc6Ci0gICAgICAgICAgICAgICAgaWYgKCFtUGJhcFNlcnZpY2VDb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJQcm9maWxlU2VydmljZU1lc3NhZ2UoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1QYmFwU2VydmljZS5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlKSA9PQorICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9BVVRPX0NPTk5FQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PTik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChtRGV2aWNlKTsKICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5yZW1vdmVCb25kSW50ZXJuYWwobURldmljZS5nZXRBZGRyZXNzKCkpOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTY5Miw2ICs4OTgsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisKICAgICAvKnBhY2thZ2UqLyBCbHVldG9vdGhEZXZpY2UgZ2V0RGV2aWNlKCkgewogICAgICAgICByZXR1cm4gbURldmljZTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXQuamF2YQppbmRleCBkYTFhYTQ1Li4wNDk2YjFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEKQEAgLTE4LDYgKzE4LDggQEAKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0yNiw2MyArMjgsNjYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKgotICogVGhlIEFuZHJvaWQgQmx1ZXRvb3RoIEFQSSBpcyBub3QgZmluYWxpemVkLCBhbmQgKndpbGwqIGNoYW5nZS4gVXNlIGF0IHlvdXIKLSAqIG93biByaXNrLgotICoKICAqIFB1YmxpYyBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBCbHVldG9vdGggSGVhZHNldCBTZXJ2aWNlLiBUaGlzIGluY2x1ZGVzIGJvdGgKLSAqIEJsdWV0b290aCBIZWFkc2V0IGFuZCBIYW5kc2ZyZWUgKHYxLjUpIHByb2ZpbGVzLiBUaGUgSGVhZHNldCBzZXJ2aWNlIHdpbGwKLSAqIGF0dGVtcHQgYSBoYW5kc2ZyZWUgY29ubmVjdGlvbiBmaXJzdCwgYW5kIGZhbGwgYmFjayB0byBoZWFkc2V0LgorICogQmx1ZXRvb3RoIEhlYWRzZXQgYW5kIEhhbmRzZnJlZSAodjEuNSkgcHJvZmlsZXMuCiAgKgotICogQmx1ZXRvb3RoSGVhZHNldCBpcyBhIHByb3h5IG9iamVjdCBmb3IgY29udHJvbGxpbmcgdGhlIEJsdWV0b290aCBIZWFkc2V0CisgKiA8cD5CbHVldG9vdGhIZWFkc2V0IGlzIGEgcHJveHkgb2JqZWN0IGZvciBjb250cm9sbGluZyB0aGUgQmx1ZXRvb3RoIEhlYWRzZXQKICAqIFNlcnZpY2UgdmlhIElQQy4KICAqCi0gKiBDcmVhdGluZyBhIEJsdWV0b290aEhlYWRzZXQgb2JqZWN0IHdpbGwgY3JlYXRlIGEgYmluZGluZyB3aXRoIHRoZQotICogQmx1ZXRvb3RoSGVhZHNldCBzZXJ2aWNlLiBVc2VycyBvZiB0aGlzIG9iamVjdCBzaG91bGQgY2FsbCBjbG9zZSgpIHdoZW4gdGhleQotICogYXJlIGZpbmlzaGVkIHdpdGggdGhlIEJsdWV0b290aEhlYWRzZXQsIHNvIHRoYXQgdGhpcyBwcm94eSBvYmplY3QgY2FuIHVuYmluZAotICogZnJvbSB0aGUgc2VydmljZS4KKyAqIDxwPiBVc2Uge0BsaW5rIEJsdWV0b290aEFkYXB0ZXIjZ2V0UHJvZmlsZVByb3h5fSB0byBnZXQKKyAqIHRoZSBCbHVldG9vdGhIZWFkc2V0IHByb3h5IG9iamVjdC4gVXNlCisgKiB7QGxpbmsgQmx1ZXRvb3RoQWRhcHRlciNjbG9zZVByb2ZpbGVQcm94eX0gdG8gY2xvc2UgdGhlIHNlcnZpY2UgY29ubmVjdGlvbi4KICAqCi0gKiBUaGlzIEJsdWV0b290aEhlYWRzZXQgb2JqZWN0IGlzIG5vdCBpbW1lZGlhdGVseSBib3VuZCB0byB0aGUKLSAqIEJsdWV0b290aEhlYWRzZXQgc2VydmljZS4gVXNlIHRoZSBTZXJ2aWNlTGlzdGVuZXIgaW50ZXJmYWNlIHRvIG9idGFpbiBhCi0gKiBub3RpZmljYXRpb24gd2hlbiBpdCBpcyBib3VuZCwgdGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBpZiB5b3Ugd2lzaCB0bwotICogaW1tZWRpYXRlbHkgY2FsbCBtZXRob2RzIG9uIEJsdWV0b290aEhlYWRzZXQgYWZ0ZXIgY29uc3RydWN0aW9uLgotICoKLSAqIEFuZHJvaWQgb25seSBzdXBwb3J0cyBvbmUgY29ubmVjdGVkIEJsdWV0b290aCBIZWFkc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAaGlkZQorICogPHA+IEFuZHJvaWQgb25seSBzdXBwb3J0cyBvbmUgY29ubmVjdGVkIEJsdWV0b290aCBIZWFkc2V0IGF0IGEgdGltZS4KKyAqIEVhY2ggbWV0aG9kIGlzIHByb3RlY3RlZCB3aXRoIGl0cyBhcHByb3ByaWF0ZSBwZXJtaXNzaW9uLgogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmx1ZXRvb3RoSGVhZHNldCB7Ci0KK3B1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhIZWFkc2V0IGltcGxlbWVudHMgQmx1ZXRvb3RoUHJvZmlsZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhIZWFkc2V0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwogCi0gICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBVEVfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5hY3Rpb24uU1RBVEVfQ0hBTkdFRCI7CiAgICAgLyoqCi0gICAgICogVE9ETyhBUEkgcmVsZWFzZSk6IENvbnNpZGVyIGluY29ycG9yYXRpbmcgYXMgbmV3IHN0YXRlIGluCi0gICAgICogSEVBRFNFVF9TVEFURV9DSEFOR0VECisgICAgICogSW50ZW50IHVzZWQgdG8gYnJvYWRjYXN0IHRoZSBjaGFuZ2UgaW4gY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgSGVhZHNldAorICAgICAqIHByb2ZpbGUuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGludGVudCB3aWxsIGhhdmUgMyBleHRyYXM6CisgICAgICoge0BsaW5rICNFWFRSQV9TVEFURX0gLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHJvZmlsZS4KKyAgICAgKiB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfS0gVGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBwcm9maWxlCisgICAgICoge0BsaW5rIEJsdWV0b290aERldmljZSNFWFRSQV9ERVZJQ0V9IC0gVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSBvciB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfSBjYW4gYmUgYW55IG9mCisgICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LCB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RJTkd9LAorICAgICAqIHtAbGluayAjU1RBVEVfQ09OTkVDVEVEfSwge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfS4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSB0byByZWNlaXZlLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LnByb2ZpbGUuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlbnQgdXNlZCB0byBicm9hZGNhc3QgdGhlIGNoYW5nZSBpbiB0aGUgQXVkaW8gQ29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUKKyAgICAgKiBBMkRQIHByb2ZpbGUuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGludGVudCB3aWxsIGhhdmUgMyBleHRyYXM6CisgICAgICoge0BsaW5rICNFWFRSQV9TVEFURX0gLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHJvZmlsZS4KKyAgICAgKiB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfS0gVGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBwcm9maWxlCisgICAgICoge0BsaW5rIEJsdWV0b290aERldmljZSNFWFRSQV9ERVZJQ0V9IC0gVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSBvciB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfSBjYW4gYmUgYW55IG9mCisgICAgICoge0BsaW5rICNTVEFURV9BVURJT19DT05ORUNURUR9LCB7QGxpbmsgI1NUQVRFX0FVRElPX0RJU0NPTk5FQ1RFRH0sCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USH0gdG8gcmVjZWl2ZS4KICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BVURJT19TVEFURV9DSEFOR0VEID0KLSAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmFjdGlvbi5BVURJT19TVEFURV9DSEFOR0VEIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TVEFURSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5leHRyYS5TVEFURSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFVklPVVNfU1RBVEUgPQotICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuUFJFVklPVVNfU1RBVEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FVRElPX1NUQVRFID0KLSAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLkFVRElPX1NUQVRFIjsKKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQucHJvZmlsZS5hY3Rpb24uQVVESU9fU1RBVEVfQ0hBTkdFRCI7CiAKLSAgICAvKiogRXh0cmEgdG8gYmUgdXNlZCB3aXRoIHRoZSBIZWFkc2V0IFN0YXRlIGNoYW5nZSBpbnRlbnQuCi0gICAgICogVGhpcyB3aWxsIGJlIHVzZWQgb25seSB3aGVuIEhlYWRzZXQgc3RhdGUgY2hhbmdlcyB0bwotICAgICAqIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfSBmcm9tIGFueSBwcmV2aW91cyBzdGF0ZS4KLSAgICAgKiBUaGlzIGV4dHJhIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCB3aWxsIGJlIHVzZWQgd2hlbgotICAgICAqIHdlIGhhdmUgZGV0ZXJtaW5pc3RpYyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgd2hldGhlcgotICAgICAqIHRoZSBkaXNjb25uZWN0IHdhcyBpbml0aWF0ZWQgYnkgdGhlIHJlbW90ZSBkZXZpY2Ugb3IKLSAgICAgKiBieSB0aGUgbG9jYWwgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ESVNDT05ORUNUX0lOSVRJQVRPUiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5leHRyYS5ESVNDT05ORUNUX0lOSVRJQVRPUiI7CiAKICAgICAvKioKICAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiBJbmRpY2F0ZXMgYSBoZWFkc2V0IGhhcyBwb3N0ZWQgYSB2ZW5kb3Itc3BlY2lmaWMgZXZlbnQuCkBAIC05MCw2ICs5NSw3IEBACiAgICAgICoge0BsaW5rICNFWFRSQV9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DTUR9LCBhbmQKICAgICAgKiB7QGxpbmsgI0VYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0FSR1N9LgogICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSB0byByZWNlaXZlLgorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlQgPQpAQCAtOTgsNiArMTA0LDcgQEAKICAgICAvKioKICAgICAgKiBBIFN0cmluZyBleHRyYSBmaWVsZCBpbiB7QGxpbmsgI0FDVElPTl9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVH0KICAgICAgKiBpbnRlbnRzIHRoYXQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBjb21tYW5kLgorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQ01EID0KICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLlZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRCI7CkBAIC0xMDgsNiArMTE1LDcgQEAKICAgICAgKiBjb21tYW5kLgogICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYmx1ZXRvb3RoLm9yZy9UZWNobmljYWwvQXNzaWduZWROdW1iZXJzL2lkZW50aWZpZXJzLmh0bSI+CiAgICAgICogQmx1ZXRvb3RoIFNJRyBBc3NpZ25lZCBOdW1iZXJzIC0gQ29tcGFueSBJZGVudGlmaWVyczwvYT4KKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NPTVBBTllfSUQgPQogICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQ09NUEFOWV9JRCI7CkBAIC0xMTYsMTA0ICsxMjQsNTIgQEAKICAgICAgKiBBIFBhcmNlbGFibGUgU3RyaW5nIGFycmF5IGV4dHJhIGZpZWxkIGluCiAgICAgICoge0BsaW5rICNBQ1RJT05fVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlR9IGludGVudHMgdGhhdCBjb250YWlucwogICAgICAqIHRoZSBhcmd1bWVudHMgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBjb21tYW5kLgorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQVJHUyA9CiAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5leHRyYS5WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9BUkdTIjsKIAorICAgIC8qCisgICAgICogSGVhZHNldCBzdGF0ZSB3aGVuIFNDTyBhdWRpbyBpcyBjb25uZWN0ZWQKKyAgICAgKiBUaGlzIHN0YXRlIGNhbiBiZSBvbmUgb2YKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSBvciB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfSBvZgorICAgICAqIHtAbGluayAjQUNUSU9OX0FVRElPX1NUQVRFX0NIQU5HRUR9IGludGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9BVURJT19DT05ORUNURUQgPSAxMDsKIAogICAgIC8qKgotICAgICAqIFRPRE8oQVBJIHJlbGVhc2UpOiBDb25zaWRlciBpbmNvcnBvcmF0aW5nIGFzIG5ldyBzdGF0ZSBpbgotICAgICAqIEhFQURTRVRfU1RBVEVfQ0hBTkdFRAorICAgICAqIEhlYWRzZXQgc3RhdGUgd2hlbiBTQ08gYXVkaW8gaXMgTk9UIGNvbm5lY3RlZAorICAgICAqIFRoaXMgc3RhdGUgY2FuIGJlIG9uZSBvZgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IG9yIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9IG9mCisgICAgICoge0BsaW5rICNBQ1RJT05fQVVESU9fU1RBVEVfQ0hBTkdFRH0gaW50ZW50LgogICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FVRElPX0RJU0NPTk5FQ1RFRCA9IDExOworCisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBTZXJ2aWNlTGlzdGVuZXIgbVNlcnZpY2VMaXN0ZW5lcjsKICAgICBwcml2YXRlIElCbHVldG9vdGhIZWFkc2V0IG1TZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFNlcnZpY2VMaXN0ZW5lciBtU2VydmljZUxpc3RlbmVyOwotCi0gICAgLyoqIFRoZXJlIHdhcyBhbiBlcnJvciB0cnlpbmcgdG8gb2J0YWluIHRoZSBzdGF0ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VSUk9SICAgICAgICA9IC0xOwotICAgIC8qKiBObyBoZWFkc2V0IGN1cnJlbnRseSBjb25uZWN0ZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURUQgPSAwOwotICAgIC8qKiBDb25uZWN0aW9uIGF0dGVtcHQgaW4gcHJvZ3Jlc3MgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HICAgPSAxOwotICAgIC8qKiBBIGhlYWRzZXQgaXMgY3VycmVudGx5IGNvbm5lY3RlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCAgICA9IDI7Ci0KLSAgICAvKiogQSBTQ08gYXVkaW8gY2hhbm5lbCBpcyBub3QgZXN0YWJsaXNoZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVURJT19TVEFURV9ESVNDT05ORUNURUQgPSAwOwotICAgIC8qKiBBIFNDTyBhdWRpbyBjaGFubmVsIGlzIGVzdGFibGlzaGVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVESU9fU1RBVEVfQ09OTkVDVEVEID0gMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9GQUlMVVJFID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfU1VDQ0VTUyA9IDE7Ci0gICAgLyoqIENvbm5lY3Rpb24gY2FuY2VsZWQgYmVmb3JlIGNvbXBsZXRpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0NBTkNFTEVEID0gMjsKLQotICAgIC8qKiBWYWx1ZXMgZm9yIHtAbGluayAjRVhUUkFfRElTQ09OTkVDVF9JTklUSUFUT1J9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFX0RJU0NPTk5FQ1QgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0RJU0NPTk5FQ1QgPSAxOwotCi0KLSAgICAvKiogRGVmYXVsdCBwcmlvcml0eSBmb3IgaGVhZHNldHMgZm9yIHdoaWNoIHdlIHdpbGwgYWNjZXB0Ci0gICAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIGF1dG8tY29ubmVjdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9BVVRPX0NPTk5FQ1QgPSAxMDAwOwotICAgIC8qKiBEZWZhdWx0IHByaW9yaXR5IGZvciBoZWFkc2V0cyBmb3Igd2hpY2ggd2Ugd2lsbCBhY2NlcHQKLSAgICAgKiBpbmNvbWluZyBjb25uZWN0aW9ucyBidXQgbm90IGF1dG8tY29ubmVjdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PTiA9IDEwMDsKLSAgICAvKiogRGVmYXVsdCBwcmlvcml0eSBmb3IgaGVhZHNldHMgdGhhdCBzaG91bGQgbm90IGJlIGF1dG8tY29ubmVjdGVkCi0gICAgICogYW5kIG5vdCBhbGxvdyBpbmNvbWluZyBjb25uZWN0aW9ucy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PRkYgPSAwOwotICAgIC8qKiBEZWZhdWx0IHByaW9yaXR5IHdoZW4gbm90IHNldCBvciB3aGVuIHRoZSBkZXZpY2UgaXMgdW5wYWlyZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9VTkRFRklORUQgPSAtMTsKLQotICAgIC8qKgotICAgICAqIEFuIGludGVyZmFjZSBmb3Igbm90aWZ5aW5nIEJsdWV0b290aEhlYWRzZXQgSVBDIGNsaWVudHMgd2hlbiB0aGV5IGhhdmUKLSAgICAgKiBiZWVuIGNvbm5lY3RlZCB0byB0aGUgQmx1ZXRvb3RoSGVhZHNldCBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgU2VydmljZUxpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB0byBub3RpZnkgdGhlIGNsaWVudCB3aGVuIHRoaXMgcHJveHkgb2JqZWN0IGhhcyBiZWVuCi0gICAgICAgICAqIGNvbm5lY3RlZCB0byB0aGUgQmx1ZXRvb3RoSGVhZHNldCBzZXJ2aWNlLiBDbGllbnRzIG11c3Qgd2FpdCBmb3IKLSAgICAgICAgICogdGhpcyBjYWxsYmFjayBiZWZvcmUgbWFraW5nIElQQyBjYWxscyBvbiB0aGUgQmx1ZXRvb3RoSGVhZHNldAotICAgICAgICAgKiBzZXJ2aWNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB0byBub3RpZnkgdGhlIGNsaWVudCB0aGF0IHRoaXMgcHJveHkgb2JqZWN0IGhhcyBiZWVuCi0gICAgICAgICAqIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBCbHVldG9vdGhIZWFkc2V0IHNlcnZpY2UuIENsaWVudHMgbXVzdCBub3QKLSAgICAgICAgICogbWFrZSBJUEMgY2FsbHMgb24gdGhlIEJsdWV0b290aEhlYWRzZXQgc2VydmljZSBhZnRlciB0aGlzIGNhbGxiYWNrLgotICAgICAgICAgKiBUaGlzIGNhbGxiYWNrIHdpbGwgY3VycmVudGx5IG9ubHkgb2NjdXIgaWYgdGhlIGFwcGxpY2F0aW9uIGhvc3RpbmcKLSAgICAgICAgICogdGhlIEJsdWV0b290aEhlYWRzZXQgc2VydmljZSwgYnV0IG1heSBiZSBjYWxsZWQgbW9yZSBvZnRlbiBpbiBmdXR1cmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoKTsKLSAgICB9CisgICAgQmx1ZXRvb3RoQWRhcHRlciBtQWRhcHRlcjsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIEJsdWV0b290aEhlYWRzZXQgcHJveHkgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBCbHVldG9vdGhIZWFkc2V0KENvbnRleHQgY29udGV4dCwgU2VydmljZUxpc3RlbmVyIGwpIHsKKyAgICAvKnBhY2thZ2UqLyBCbHVldG9vdGhIZWFkc2V0KENvbnRleHQgY29udGV4dCwgU2VydmljZUxpc3RlbmVyIGwpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtU2VydmljZUxpc3RlbmVyID0gbDsKKyAgICAgICAgbUFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CiAgICAgICAgIGlmICghY29udGV4dC5iaW5kU2VydmljZShuZXcgSW50ZW50KElCbHVldG9vdGhIZWFkc2V0LmNsYXNzLmdldE5hbWUoKSksIG1Db25uZWN0aW9uLCAwKSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGJpbmQgdG8gQmx1ZXRvb3RoIEhlYWRzZXQgU2VydmljZSIpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGJhY2tpbmcgc2VydmljZS4KICAgICAgKiBPdGhlciBwdWJsaWMgZnVuY3Rpb25zIG9mIEJsdWV0b290aEhlYWRzZXQgd2lsbCByZXR1cm4gZGVmYXVsdCBlcnJvcgogICAgICAqIHJlc3VsdHMgb25jZSBjbG9zZSgpIGhhcyBiZWVuIGNhbGxlZC4gTXVsdGlwbGUgaW52b2NhdGlvbnMgb2YgY2xvc2UoKQogICAgICAqIGFyZSBvay4KICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7CisgICAgLypwYWNrYWdlKi8gc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiY2xvc2UoKSIpOwogICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZShtQ29ubmVjdGlvbik7CkBAIC0yMjIsMTkwICsxNzgsMjEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBCbHVldG9vdGggSGVhZHNldCBzZXJ2aWNlLgotICAgICAqIEByZXR1cm4gT25lIG9mIHRoZSBTVEFURV8gcmV0dXJuIGNvZGVzLCBvciBTVEFURV9FUlJPUiBpZiB0aGlzIHByb3h5Ci0gICAgICogICAgICAgICBvYmplY3QgaXMgY3VycmVudGx5IG5vdCBjb25uZWN0ZWQgdG8gdGhlIEhlYWRzZXQgc2VydmljZS4KKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJnZXRTdGF0ZSgpIik7Ci0gICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0KGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgQmx1ZXRvb3RoRGV2aWNlIGZvciB0aGUgY3VycmVudCBoZWFkc2V0LgotICAgICAqIEByZXR1cm4gY3VycmVudCBoZWFkc2V0LCBvciBudWxsIGlmIG5vdCBpbiBjb25uZWN0ZWQgb3IgY29ubmVjdGluZwotICAgICAqICAgICAgICAgc3RhdGUsIG9yIGlmIHRoaXMgcHJveHkgb2JqZWN0IGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIEhlYWRzZXQKLSAgICAgKiAgICAgICAgIHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIEJsdWV0b290aERldmljZSBnZXRDdXJyZW50SGVhZHNldCgpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDdXJyZW50SGVhZHNldCgpIik7Ci0gICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRDdXJyZW50SGVhZHNldCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBpbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gYSBoZWFkc2V0LgotICAgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBibG9jay4gRmFpbHMgaWYgYSBoZWFkc2V0IGlzIGFscmVhZHkgY29ubmVjdGluZwotICAgICAqIG9yIGNvbm5lY3RlZC4KLSAgICAgKiBJbml0aWF0ZXMgYXV0by1jb25uZWN0aW9uIGlmIGRldmljZSBpcyBudWxsLiBUcmllcyB0byBjb25uZWN0IHRvIGFsbAotICAgICAqIGRldmljZXMgd2l0aCBwcmlvcml0eSBncmVhdGVyIHRoYW4gUFJJT1JJVFlfQVVUTyBpbiBkZXNjZW5kaW5nIG9yZGVyLgotICAgICAqIEBwYXJhbSBkZXZpY2UgZGV2aWNlIHRvIGNvbm5lY3QgdG8sIG9yIG51bGwgdG8gYXV0by1jb25uZWN0IGxhc3QgY29ubmVjdGVkCi0gICAgICogICAgICAgICAgICAgICBoZWFkc2V0Ci0gICAgICogQHJldHVybiAgICAgICBmYWxzZSBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIGluaXRpYXRpbmcgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiAgICAgICAgICAgICAgIHByb2NlZHVyZSwgYW5kIG5vIGZ1cnRoZXIgSEVBRFNFVF9TVEFURV9DSEFOR0VEIGludGVudHMKLSAgICAgKiAgICAgICAgICAgICAgIHdpbGwgYmUgZXhwZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29ubmVjdEhlYWRzZXQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3RIZWFkc2V0KCIgKyBkZXZpY2UgKyAiKSIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UuY29ubmVjdEhlYWRzZXQoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkge0xvZy5lKFRBRywgZS50b1N0cmluZygpKTt9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgfQorICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGhlYWRzZXQgaXMgY29ubmVjdGVkIChkb2VzIG5vdCBpbmNsdWRlCi0gICAgICogY29ubmVjdGluZykuIFJldHVybnMgZmFsc2UgaWYgbm90IGNvbm5lY3RlZCwgb3IgaWYgdGhpcyBwcm94eSBvYmplY3QKLSAgICAgKiBpZiBub3QgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgaGVhZHNldCBzZXJ2aWNlLgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJpc0Nvbm5lY3RlZCgiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0KCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSAmJgorICAgICAgICAgICAgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5pc0Nvbm5lY3RlZChkZXZpY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3QoZGV2aWNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIExvZy5lKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERpc2Nvbm5lY3RzIHRoZSBjdXJyZW50IGhlYWRzZXQuIEN1cnJlbnRseSB0aGlzIGNhbGwgYmxvY2tzLCBpdCBtYXkgc29vbgotICAgICAqIGJlIG1hZGUgYXN5bmNocm9ub3VzLiBSZXR1cm5zIGZhbHNlIGlmIHRoaXMgcHJveHkgb2JqZWN0IGlzCi0gICAgICogbm90IGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIEhlYWRzZXQgc2VydmljZS4KKyAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoREJHKSBsb2coImRpc2Nvbm5lY3RIZWFkc2V0KCkiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcygpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWREZXZpY2VzKCkiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2UuZGlzY29ubmVjdEhlYWRzZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0b0RldmljZVNldChtU2VydmljZS5nZXRDb25uZWN0ZWREZXZpY2VzKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0b0RldmljZVNldChuZXcgQmx1ZXRvb3RoRGV2aWNlWzBdKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gdG9EZXZpY2VTZXQobmV3IEJsdWV0b290aERldmljZVswXSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3RhcnQgQlQgVm9pY2UgUmVjb2duaXRpb24gbW9kZSwgYW5kIHNldCB1cCBCbHVldG9vdGggYXVkaW8gcGF0aC4KLSAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIG5vIGhlYWRzZXQgY29ubmVjdGVkLCBvciBpZiB0aGUKLSAgICAgKiBjb25uZWN0ZWQgaGVhZHNldCBkb2VzIG5vdCBzdXBwb3J0IHZvaWNlIHJlY29nbml0aW9uLCBvciBvbgotICAgICAqIGVycm9yLgorICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFZvaWNlUmVjb2duaXRpb24oKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygic3RhcnRWb2ljZVJlY29nbml0aW9uKCkiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbnRbXSBzdGF0ZXMpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMoKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc3RhcnRWb2ljZVJlY29nbml0aW9uKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkge0xvZy5lKFRBRywgZS50b1N0cmluZygpKTt9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXZpY2VTZXQobVNlcnZpY2UuZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhzdGF0ZXMpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXZpY2VTZXQobmV3IEJsdWV0b290aERldmljZVswXSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIHRvRGV2aWNlU2V0KG5ldyBCbHVldG9vdGhEZXZpY2VbMF0pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFN0b3AgQlQgVm9pY2UgUmVjb2duaXRpb24gbW9kZSwgYW5kIHNodXQgZG93biBCbHVldG9vdGggYXVkaW8gcGF0aC4KLSAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIG5vIGhlYWRzZXQgY29ubmVjdGVkLCBvciB0aGUgY29ubmVjdGVkCi0gICAgICogaGVhZHNldCBpcyBub3QgaW4gdm9pY2UgcmVjb2duaXRpb24gbW9kZSwgb3Igb24gZXJyb3IuCisgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN0b3BWb2ljZVJlY29nbml0aW9uKCkgewotICAgICAgICBpZiAoREJHKSBsb2coInN0b3BWb2ljZVJlY29nbml0aW9uKCkiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0Q29ubmVjdGlvblN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSAmJgorICAgICAgICAgICAgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zdG9wVm9pY2VSZWNvZ25pdGlvbigpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHByaW9yaXR5IG9mIGhlYWRzZXQuCi0gICAgICogUHJpb3JpdHkgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gQnkgZGVmYXVsdCBwYWlyZWQgaGVhZHNldHMgd2lsbCBoYXZlCi0gICAgICogYSBwcmlvcml0eSBvZiBQUklPUklUWV9BVVRPLCBhbmQgdW5wYWlyZWQgaGVhZHNldCBQUklPUklUWV9OT05FICgwKS4KLSAgICAgKiBIZWFkc2V0cyB3aXRoIHByaW9yaXR5IGdyZWF0ZXIgdGhhbiB6ZXJvIHdpbGwgYmUgYXV0by1jb25uZWN0ZWQsIGFuZAotICAgICAqIGluY29taW5nIGNvbm5lY3Rpb25zIHdpbGwgYmUgYWNjZXB0ZWQgKGlmIG5vIG90aGVyIGhlYWRzZXQgaXMKLSAgICAgKiBjb25uZWN0ZWQpLgotICAgICAqIEF1dG8tY29ubmVjdGlvbiBvY2N1cnMgYXQgdGhlIGZvbGxvd2luZyBldmVudHM6IGJvb3QsIGluY29taW5nIHBob25lCi0gICAgICogY2FsbCwgb3V0Z29pbmcgcGhvbmUgY2FsbC4KLSAgICAgKiBIZWFkc2V0cyB3aXRoIHByaW9yaXR5IGVxdWFsIHRvIHplcm8sIG9yIHRoYXQgYXJlIHVucGFpcmVkLCBhcmUgbm90Ci0gICAgICogYXV0by1jb25uZWN0ZWQuCi0gICAgICogSW5jb21pbmcgY29ubmVjdGlvbnMgYXJlIGlnbm9yZWQgcmVnYXJkbGVzcyBvZiBwcmlvcml0eSBpZiB0aGVyZSBpcwotICAgICAqIGFscmVhZHkgYSBoZWFkc2V0IGNvbm5lY3RlZC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIHBhaXJlZCBoZWFkc2V0Ci0gICAgICogQHBhcmFtIHByaW9yaXR5IEludGVnZXIgcHJpb3JpdHksIGZvciBleGFtcGxlIFBSSU9SSVRZX0FVVE8gb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgUFJJT1JJVFlfTk9ORQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB0aGVyZSB3YXMgc29tZSBlcnJvcgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHNldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgewogICAgICAgICBpZiAoREJHKSBsb2coInNldFByaW9yaXR5KCIgKyBkZXZpY2UgKyAiLCAiICsgcHJpb3JpdHkgKyAiKSIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSAmJgorICAgICAgICAgICAgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICBpZiAocHJpb3JpdHkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5QUklPUklUWV9PRkYgJiYKKyAgICAgICAgICAgICAgICBwcmlvcml0eSAhPSBCbHVldG9vdGhQcm9maWxlLlBSSU9SSVRZX09OKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldFByaW9yaXR5KGRldmljZSwgcHJpb3JpdHkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHByaW9yaXR5IG9mIGhlYWRzZXQuCi0gICAgICogQHBhcmFtIGRldmljZSBoZWFkc2V0Ci0gICAgICogQHJldHVybiBub24tbmVnYXRpdmUgcHJpb3JpdHksIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZXJyb3IKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJnZXRQcmlvcml0eSgiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UHJpb3JpdHkoZGV2aWNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBQUklPUklUWV9PRkY7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIFBSSU9SSVRZX09GRjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBCbHVldG9vdGggdm9pY2UgcmVjb2duaXRpb24uIFRoaXMgbWV0aG9kcyBzZW5kcyB0aGUgdm9pY2UKKyAgICAgKiByZWNvZ25pdGlvbiBBVCBjb21tYW5kIHRvIHRoZSBoZWFkc2V0IGFuZCBlc3RhYmxpc2hlcyB0aGUKKyAgICAgKiBhdWRpbyBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogPHA+IFVzZXJzIGNhbiBsaXN0ZW4gdG8ge0BsaW5rICNBQ1RJT05fQVVESU9fU1RBVEVfQ0hBTkdFRH0uCisgICAgICoge0BsaW5rICNFWFRSQV9TVEFURX0gd2lsbCBiZSBzZXQgdG8ge0BsaW5rICNTVEFURV9BVURJT19DT05ORUNURUR9CisgICAgICogd2hlbiB0aGUgYXVkaW8gY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBCbHVldG9vdGggaGVhZHNldAorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlcmUgaXMgbm8gaGVhZHNldCBjb25uZWN0ZWQgb2YgaWYgdGhlCisgICAgICogICAgICAgICAgICAgICBjb25uZWN0ZWQgaGVhZHNldCBkb2Vzbid0IHN1cHBvcnQgdm9pY2UgcmVjb2duaXRpb24KKyAgICAgKiAgICAgICAgICAgICAgIG9yIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0Vm9pY2VSZWNvZ25pdGlvbihCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygic3RhcnRWb2ljZVJlY29nbml0aW9uKCkiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc3RhcnRWb2ljZVJlY29nbml0aW9uKGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCBCbHVldG9vdGggVm9pY2UgUmVjb2duaXRpb24gbW9kZSwgYW5kIHNodXQgZG93biB0aGUKKyAgICAgKiBCbHVldG9vdGggYXVkaW8gcGF0aC4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBCbHVldG9vdGggaGVhZHNldAorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlcmUgaXMgbm8gaGVhZHNldCBjb25uZWN0ZWQKKyAgICAgKiAgICAgICAgICAgICAgIG9yIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0b3BWb2ljZVJlY29nbml0aW9uKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJzdG9wVm9pY2VSZWNvZ25pdGlvbigpIik7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpICYmCisgICAgICAgICAgICBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnN0b3BWb2ljZVJlY29nbml0aW9uKGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgQmx1ZXRvb3RoIFNDTyBhdWRpbyBpcyBjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USH0KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgQmx1ZXRvb3RoIGhlYWRzZXQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgU0NPIGlzIGNvbm5lY3RlZCwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZSBvciBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXVkaW9Db25uZWN0ZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImlzQXVkaW9Db25uZWN0ZWQoKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSAmJgorICAgICAgICAgICAgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuaXNBdWRpb0Nvbm5lY3RlZChkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgTG9nLmUoVEFHLCAgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKQEAgLTQxNiwyNCArMzk0LDI5IEBACiAgICAgICogYm9vdC4gVGhpcyBpcyBhIGdvb2QgaW5kaWNhdG9yIGZvciBzcGFtbXkgaGVhZHNldC9oYW5kc2ZyZWUgdW5pdHMgdGhhdAogICAgICAqIGNhbiBrZWVwIHRoZSBkZXZpY2UgYXdha2UgYnkgcG9sbGluZyBmb3IgY2VsbHVsYXIgc3RhdHVzIHVwZGF0ZXMuIEFzIGEKICAgICAgKiBydWxlIG9mIHRodW1iLCBlYWNoIEFUIGNvbW1hbmQgcHJldmVudHMgdGhlIENQVSBmcm9tIHNsZWVwaW5nIGZvciA1MDAgbXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIGJsdWV0b290aCBoZWFkc2V0LgogICAgICAqIEByZXR1cm4gbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGJhdHRlcnkgdXNhZ2UgaGludCwgb3IgYSBuZWdhdGl2ZSBlcnJvcgogICAgICAqICAgICAgICAgY29kZSBvbiBlcnJvcgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIGludCBnZXRCYXR0ZXJ5VXNhZ2VIaW50KCkgeworICAgIHB1YmxpYyBpbnQgZ2V0QmF0dGVyeVVzYWdlSGludChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0QmF0dGVyeVVzYWdlSGludCgpIik7Ci0gICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpICYmCisgICAgICAgICAgICBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEJhdHRlcnlVc2FnZUhpbnQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRCYXR0ZXJ5VXNhZ2VIaW50KGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIGlmIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMgdm9pY2UgZGlhbGluZyBvdmVyIGJsdWV0b290aCBTQ08uCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdm9pY2UgZGlhbGluZyBvdmVyIGJsdWV0b290aCBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNDQ0LDExICs0MjcsMTMgQEAKIAogICAgIC8qKgogICAgICAqIENhbmNlbCB0aGUgb3V0Z29pbmcgY29ubmVjdGlvbi4KKyAgICAgKiBOb3RlOiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uIGFuZCBzaG91bGRuJ3QgYmUgZXhwb3NlZAorICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWxDb25uZWN0VGhyZWFkKCkgewogICAgICAgICBpZiAoREJHKSBsb2coImNhbmNlbENvbm5lY3RUaHJlYWQiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNhbmNlbENvbm5lY3RUaHJlYWQoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KQEAgLTQ2MSwxMSArNDQ2LDEzIEBACiAKICAgICAvKioKICAgICAgKiBBY2NlcHQgdGhlIGluY29taW5nIGNvbm5lY3Rpb24uCisgICAgICogTm90ZTogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiBhbmQgc2hvdWxkbid0IGJlIGV4cG9zZWQKKyAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0SW5jb21pbmdDb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJhY2NlcHRJbmNvbWluZ0Nvbm5lY3QiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmFjY2VwdEluY29taW5nQ29ubmVjdChkZXZpY2UpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQpAQCAtNDc3LDEyICs0NjQsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGNvbm5lY3QgdGhyZWFkIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uLgorICAgICAqIENyZWF0ZSB0aGUgY29ubmVjdCB0aHJlYWQgZm9yIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uLgorICAgICAqIE5vdGU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gYW5kIHNob3VsZG4ndCBiZSBleHBvc2VkCisgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZUluY29taW5nQ29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiY3JlYXRlSW5jb21pbmdDb25uZWN0Iik7Ci0gICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jcmVhdGVJbmNvbWluZ0Nvbm5lY3QoZGV2aWNlKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KQEAgLTQ5NiwxMSArNDg1LDEyIEBACiAgICAgLyoqCiAgICAgICogQ29ubmVjdCB0byBhIEJsdWV0b290aCBIZWFkc2V0LgogICAgICAqIE5vdGU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gYW5kIHNob3VsZG4ndCBiZSBleHBvc2VkCisgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3RIZWFkc2V0SW50ZXJuYWwoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewogICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3RIZWFkc2V0SW50ZXJuYWwiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNvbm5lY3RIZWFkc2V0SW50ZXJuYWwoZGV2aWNlKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KQEAgLTUxNCwxMSArNTA0LDEyIEBACiAgICAgLyoqCiAgICAgICogRGlzY29ubmVjdCBhIEJsdWV0b290aCBIZWFkc2V0LgogICAgICAqIE5vdGU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gYW5kIHNob3VsZG4ndCBiZSBleHBvc2VkCisgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RIZWFkc2V0SW50ZXJuYWwoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewogICAgICAgICBpZiAoREJHKSBsb2coImRpc2Nvbm5lY3RIZWFkc2V0SW50ZXJuYWwiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0SGVhZHNldEludGVybmFsKGRldmljZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkge0xvZy5lKFRBRywgZS50b1N0cmluZygpKTt9CkBAIC01MjgsMjMgKzUxOSw2MSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1ZGlvIHN0YXRlIG9mIHRoZSBIZWFkc2V0LgorICAgICAqIE5vdGU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gYW5kIHNob3VsZG4ndCBiZSBleHBvc2VkCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldEF1ZGlvU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygic2V0QXVkaW9TdGF0ZSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc2V0QXVkaW9TdGF0ZShkZXZpY2UsIHN0YXRlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwcml2YXRlIFNlcnZpY2VDb25uZWN0aW9uIG1Db25uZWN0aW9uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uKCkgewogICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjbGFzc05hbWUsIElCaW5kZXIgc2VydmljZSkgewogICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiUHJveHkgb2JqZWN0IGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgbVNlcnZpY2UgPSBJQmx1ZXRvb3RoSGVhZHNldC5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOworCiAgICAgICAgICAgICBpZiAobVNlcnZpY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VMaXN0ZW5lci5vblNlcnZpY2VDb25uZWN0ZWQoKTsKKyAgICAgICAgICAgICAgICBtU2VydmljZUxpc3RlbmVyLm9uU2VydmljZUNvbm5lY3RlZChCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsIEJsdWV0b290aEhlYWRzZXQudGhpcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgY2xhc3NOYW1lKSB7CiAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJQcm94eSBvYmplY3QgZGlzY29ubmVjdGVkIik7CiAgICAgICAgICAgICBtU2VydmljZSA9IG51bGw7CiAgICAgICAgICAgICBpZiAobVNlcnZpY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VMaXN0ZW5lci5vblNlcnZpY2VEaXNjb25uZWN0ZWQoKTsKKyAgICAgICAgICAgICAgICBtU2VydmljZUxpc3RlbmVyLm9uU2VydmljZURpc2Nvbm5lY3RlZChCbHVldG9vdGhQcm9maWxlLkhFQURTRVQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKIAorICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgaWYgKG1BZGFwdGVyLmdldFN0YXRlKCkgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTikgcmV0dXJuIHRydWU7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHJldHVybiBmYWxzZTsKKworICAgICAgIGlmIChCbHVldG9vdGhBZGFwdGVyLmNoZWNrQmx1ZXRvb3RoQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKSkgcmV0dXJuIHRydWU7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PEJsdWV0b290aERldmljZT4gdG9EZXZpY2VTZXQoQmx1ZXRvb3RoRGV2aWNlW10gZGV2aWNlcykgeworICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCisgICAgICAgICAgbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPihBcnJheXMuYXNMaXN0KGRldmljZXMpKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewogICAgICAgICBMb2cuZChUQUcsIG1zZyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aElucHV0RGV2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzkzODM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aElucHV0RGV2aWNlLmphdmEKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogUHVibGljIEFQSSBmb3IgY29udHJvbGxpbmcgdGhlIEJsdWV0b290aCBISUQgKElucHV0IERldmljZSkgUHJvZmlsZQorICoKKyAqIEJsdWV0b290aElucHV0RGV2aWNlIGlzIGEgcHJveHkgb2JqZWN0IHVzZWQgdG8gbWFrZSBjYWxscyB0byBCbHVldG9vdGggU2VydmljZQorICogd2hpY2ggaGFuZGxlcyB0aGUgSElEIHByb2ZpbGUuCisgKgorICogQ3JlYXRpbmcgYSBCbHVldG9vdGhJbnB1dERldmljZSBvYmplY3Qgd2lsbCBpbml0aWF0ZSBhIGJpbmRpbmcgd2l0aCB0aGUKKyAqIEJsdWV0b290aCBzZXJ2aWNlLiBVc2VycyBvZiB0aGlzIG9iamVjdCBzaG91bGQgY2FsbCBjbG9zZSgpIHdoZW4gdGhleQorICogYXJlIGZpbmlzaGVkLCBzbyB0aGF0IHRoaXMgcHJveHkgb2JqZWN0IGNhbiB1bmJpbmQgZnJvbSB0aGUgc2VydmljZS4KKyAqCisgKiBDdXJyZW50bHkgdGhlIEJsdWV0b290aCBzZXJ2aWNlIHJ1bnMgaW4gdGhlIHN5c3RlbSBzZXJ2ZXIgYW5kIHRoaXMKKyAqIHByb3h5IG9iamVjdCB3aWxsIGJlIGltbWVkaWF0ZWx5IGJvdW5kIHRvIHRoZSBzZXJ2aWNlIG9uIGNvbnN0cnVjdGlvbi4KKyAqCisgKiAgQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJsdWV0b290aElucHV0RGV2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aElucHV0RGV2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworCisgICAgLyoqIGludCBleHRyYSBmb3IgQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmlucHV0ZGV2aWNlLmV4dHJhLklOUFVUX0RFVklDRV9TVEFURSI7CisgICAgLyoqIGludCBleHRyYSBmb3IgQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmlucHV0ZGV2aWNlLmV4dHJhLlBSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSI7CisKKyAgICAvKiogSW5kaWNhdGVzIHRoZSBzdGF0ZSBvZiBhbiBpbnB1dCBkZXZpY2UgaGFzIGNoYW5nZWQuCisgICAgICogVGhpcyBpbnRlbnQgd2lsbCBhbHdheXMgY29udGFpbiBFWFRSQV9JTlBVVF9ERVZJQ0VfU1RBVEUsCisgICAgICogRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFIGFuZCBCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFCisgICAgICogZXh0cmFzLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmlucHV0ZGV2aWNlLmFjdGlvbi5JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURUQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEICAgID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNUSU5HID0gMzsKKworICAgIC8qKgorICAgICAqIEF1dG8gY29ubmVjdGlvbiwgaW5jb21pbmcgYW5kIG91dGdvaW5nIGNvbm5lY3Rpb24gYXJlIGFsbG93ZWQgYXQgdGhpcworICAgICAqIHByaW9yaXR5IGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX0FVVE9fQ09OTkVDVCA9IDEwMDA7CisgICAgLyoqCisgICAgICogSW5jb21pbmcgYW5kIG91dGdvaW5nIGNvbm5lY3Rpb24gYXJlIGFsbG93ZWQgYXQgdGhpcyBwcmlvcml0eSBsZXZlbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX09OID0gMTAwOworICAgIC8qKgorICAgICAqIENvbm5lY3Rpb25zIHRvIHRoZSBkZXZpY2UgYXJlIG5vdCBhbGxvd2VkIGF0IHRoaXMgcHJpb3JpdHkgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfT0ZGID0gMDsKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHByaW9yaXR5IGxldmVsIHdoZW4gdGhlIGRldmljZSBpcyB1bnBhaXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9VTkRFRklORUQgPSAtMTsKKworICAgIHByaXZhdGUgZmluYWwgSUJsdWV0b290aCBtU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBCbHVldG9vdGhJbnB1dERldmljZSBwcm94eSBvYmplY3QgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGxvY2FsCisgICAgICogQmx1ZXRvb3RoIFNlcnZpY2Ugd2hpY2ggaGFuZGxlIHRoZSBISUQgcHJvZmlsZS4KKyAgICAgKiBAcGFyYW0gYyBDb250ZXh0CisgICAgICovCisgICAgcHVibGljIEJsdWV0b290aElucHV0RGV2aWNlKENvbnRleHQgYykgeworICAgICAgICBtQ29udGV4dCA9IGM7CisKKyAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShCbHVldG9vdGhBZGFwdGVyLkJMVUVUT09USF9TRVJWSUNFKTsKKyAgICAgICAgaWYgKGIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlcnZpY2UgPSBJQmx1ZXRvb3RoLlN0dWIuYXNJbnRlcmZhY2UoYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJCbHVldG9vdGggU2VydmljZSBub3QgYXZhaWxhYmxlISIpOworCisgICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbiB3aGljaCBwcmV2ZW50cyBwZW9wbGUgZnJvbSBnb2luZworICAgICAgICAgICAgLy8gaW50byBXaXJlbGVzcyBzZXR0aW5ncyBpbiB0aGUgZW11bGF0b3IuIExldCBpdCBjcmFzaCBsYXRlciB3aGVuIGl0IGlzIGFjdHVhbGx5IHVzZWQuCisgICAgICAgICAgICBtU2VydmljZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIGFuIElucHV0IGRldmljZS4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugb24gZXJyb3IgYW5kIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24KKyAgICAgKiAgYXR0ZW1wdCBpcyBiZWluZyBtYWRlLgorICAgICAqCisgICAgICogIExpc3RlbiBmb3IgSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRURfQUNUSU9OIHRvIGZpbmQgb3V0IHdoZW4gdGhlCisgICAgICogIGNvbm5lY3Rpb24gaXMgY29tcGxldGVkLgorICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqICBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdElucHV0RGV2aWNlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNvbm5lY3RJbnB1dERldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogSW5pdGlhdGUgZGlzY29ubmVjdCBmcm9tIGFuIElucHV0IERldmljZS4KKyAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm4gZmFsc2Ugb24gZXJyb3IgYW5kIHRydWUgaWYgdGhlIGRpc2Nvbm5lY3Rpb24KKyAgICAgKiAgYXR0ZW1wdCBpcyBiZWluZyBtYWRlLgorICAgICAqCisgICAgICogIExpc3RlbiBmb3IgSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRURfQUNUSU9OIHRvIGZpbmQgb3V0IHdoZW4KKyAgICAgKiAgZGlzY29ubmVjdCBpcyBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0SW5wdXREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImRpc2Nvbm5lY3RJbnB1dERldmljZSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0SW5wdXREZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIENoZWNrIGlmIGEgc3BlY2lmaWVkIElucHV0RGV2aWNlIGlzIGNvbm5lY3RlZC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogIEByZXR1cm4gVHJ1ZSBpZiBjb25uZWN0ZWQgLCBmYWxzZSBvdGhlcndpc2UgYW5kIG9uIGVycm9yLgorICAgICAqICBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXREZXZpY2VDb25uZWN0ZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImlzSW5wdXREZXZpY2VDb25uZWN0ZWQoIiArIGRldmljZSArICIpIik7CisgICAgICAgIGludCBzdGF0ZSA9IGdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0NPTk5FQ1RFRCkgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYW55IElucHV0IERldmljZSBpcyBjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgdW5tb2RpZmlhYmxlIHNldCBvZiBjb25uZWN0ZWQgSW5wdXQgRGV2aWNlcywgb3IgbnVsbCBvbiBlcnJvci4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KG1TZXJ2aWNlLmdldENvbm5lY3RlZElucHV0RGV2aWNlcygpKSkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBHZXQgdGhlIHN0YXRlIG9mIGFuIElucHV0IERldmljZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogIEByZXR1cm4gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIElucHV0IERldmljZQorICAgICAqICBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXREZXZpY2VTdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0SW5wdXREZXZpY2VTdGF0ZSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcHJpb3JpdHkgb2YgYW4gaW5wdXQgZGV2aWNlLgorICAgICAqCisgICAgICogUHJpb3JpdHkgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gUHJpb3JpdHkgY2FuIHRha2UgdGhlIGZvbGxvd2luZworICAgICAqIHZhbHVlczoKKyAgICAgKiB7QGxpbmsgUFJJT1JJVFlfT059LCB7QGxpbmsgUFJJT1JJVFlfT0ZGfSwge0BsaW5rIFBSSU9SSVRZX0FVVE9fQ09OTkVDVH0KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUGFpcmVkIGRldmljZS4KKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgSW50ZWdlciBwcmlvcml0eQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwcmlvcml0eSBpcyBzZXQsIGZhbHNlIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0SW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJzZXRJbnB1dERldmljZVByaW9yaXR5KCIgKyBkZXZpY2UgKyAiLCAiICsgcHJpb3JpdHkgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlLCBwcmlvcml0eSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJpb3JpdHkgYXNzb2NpYXRlZCB3aXRoIGFuIElucHV0IERldmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgSW5wdXQgRGV2aWNlCisgICAgICogQHJldHVybiBub24tbmVnYXRpdmUgcHJpb3JpdHksIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRJbnB1dERldmljZVByaW9yaXR5KCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIFBSSU9SSVRZX09GRjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgTG9nLmQoVEFHLCBtc2cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQYW4uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDBiM2YyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFBhbi5qYXZhCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhQYW4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoUGFuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworCisgICAgLyoqIGludCBleHRyYSBmb3IgQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUEFOX1NUQVRFID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLnBhbi5leHRyYS5TVEFURSI7CisgICAgLyoqIGludCBleHRyYSBmb3IgQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFVklPVVNfUEFOX1NUQVRFID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLnBhbi5leHRyYS5QUkVWSU9VU19TVEFURSI7CisKKyAgICAvKiogSW5kaWNhdGVzIHRoZSBzdGF0ZSBvZiBhbiBQQU4gZGV2aWNlIGhhcyBjaGFuZ2VkLgorICAgICAqIFRoaXMgaW50ZW50IHdpbGwgYWx3YXlzIGNvbnRhaW4gRVhUUkFfREVWSUNFX1NUQVRFLAorICAgICAqIEVYVFJBX1BSRVZJT1VTX0RFVklDRV9TVEFURSBhbmQgQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRQorICAgICAqIGV4dHJhcy4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRCA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5wYW4uYWN0aW9uLlNUQVRFX0NIQU5HRUQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFQX1JPTEUgPSAibmFwIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVBfQlJJREdFID0gInBhbjEiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTk5FQ1RJT05TID0gNzsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVElORyAgID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOworCisgICAgcHJpdmF0ZSBmaW5hbCBJQmx1ZXRvb3RoIG1TZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEJsdWV0b290aFBhbiBwcm94eSBvYmplY3QgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGxvY2FsCisgICAgICogQmx1ZXRvb3RoIFBhbiBzZXJ2aWNlLgorICAgICAqIEBwYXJhbSBjIENvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgQmx1ZXRvb3RoUGFuKENvbnRleHQgYykgeworICAgICAgICBtQ29udGV4dCA9IGM7CisKKyAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShCbHVldG9vdGhBZGFwdGVyLkJMVUVUT09USF9TRVJWSUNFKTsKKyAgICAgICAgaWYgKGIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlcnZpY2UgPSBJQmx1ZXRvb3RoLlN0dWIuYXNJbnRlcmZhY2UoYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJCbHVldG9vdGggU2VydmljZSBub3QgYXZhaWxhYmxlISIpOworCisgICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbiB3aGljaCBwcmV2ZW50cyBwZW9wbGUgZnJvbSBnb2luZworICAgICAgICAgICAgLy8gaW50byBXaXJlbGVzcyBzZXR0aW5ncyBpbiB0aGUgZW11bGF0b3IuIExldCBpdCBjcmFzaCBsYXRlcgorICAgICAgICAgICAgLy8gd2hlbiBpdCBpcyBhY3R1YWxseSB1c2VkLgorICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgYSBQQU4gY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbgorICAgICAqIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqIExpc3RlbiBmb3Ige0BsaW5rICNBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUR9IHRvIGZpbmQgb3V0IHdoZW4gdGhlCisgICAgICogY29ubmVjdGlvbiBpcyBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNvbm5lY3RQYW5EZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgZGlzY29ubmVjdCBmcm9tIFBBTi4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJuIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBkaXNjb25uZWN0aW9uCisgICAgICogYXR0ZW1wdCBpcyBiZWluZyBtYWRlLgorICAgICAqCisgICAgICogTGlzdGVuIGZvciB7QGxpbmsgI0FDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRH0gdG8gZmluZCBvdXQgd2hlbgorICAgICAqIGRpc2Nvbm5lY3QgaXMgY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0UGFuRGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBHZXQgdGhlIHN0YXRlIG9mIGEgUEFOIERldmljZS4KKyAgICAqCisgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50IHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgdGhlIFBBTiBjb25uZWN0aW9uCisgICAgKgorICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAqICBAcmV0dXJuIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBQQU4gRGV2aWNlCisgICAgKiAgQGhpZGUKKyAgICAqLworICAgcHVibGljIGludCBnZXRQYW5EZXZpY2VTdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgaWYgKERCRykgbG9nKCJnZXRQYW5EZXZpY2VTdGF0ZSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICB0cnkgeworICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgcmV0dXJuIFNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICB9CisgICB9CisKKyAgIC8qKiBSZXR1cm5zIGEgc2V0IG9mIGFsbCB0aGUgY29ubmVjdGVkIFBBTiBEZXZpY2VzCisgICAqCisgICAqIERvZXMgbm90IGluY2x1ZGUgZGV2aWNlcyB0aGF0IGFyZSBjdXJyZW50bHkgY29ubmVjdGluZyBvciBkaXNjb25uZWN0aW5nCisgICAqCisgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgc2V0IG9mIGNvbm5lY3RlZCBQQU4gRGV2aWNlcywgb3IgbnVsbCBvbiBlcnJvci4KKyAgICogQGhpZGUKKyAgICovCisgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcygpIHsKKyAgICAgIGlmIChEQkcpIGxvZygiZ2V0Q29ubmVjdGVkRGV2aWNlcyIpOworICAgICAgdHJ5IHsKKyAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KAorICAgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPigKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KG1TZXJ2aWNlLmdldENvbm5lY3RlZFBhbkRldmljZXMoKSkpKTsKKyAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIExvZy5kKFRBRywgbXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCbHVldG9vdGhUZXRoZXJpbmcoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUZXRoZXJpbmdPbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5pc1RldGhlcmluZ09uKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNGM4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZS5qYXZhCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFB1YmxpYyBBUElzIGZvciB0aGUgQmx1ZXRvb3RoIFByb2ZpbGVzLgorICoKKyAqIDxwPiBDbGllbnRzIHNob3VsZCBjYWxsIHtAbGluayBCbHVldG9vdGhBZGFwdGVyI2dldFByb2ZpbGVQcm94eX0sCisgKiB0byBnZXQgdGhlIFByb2ZpbGUgUHJveHkuIEVhY2ggcHVibGljIHByb2ZpbGUgaW1wbGVtZW50cyB0aGlzCisgKiBpbnRlcmZhY2UuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmx1ZXRvb3RoUHJvZmlsZSB7CisKKyAgICAvKioKKyAgICAgKiBFeHRyYSBmb3IgdGhlIGNvbm5lY3Rpb24gc3RhdGUgaW50ZW50cyBvZiB0aGUgaW5kaXZpZHVhbCBwcm9maWxlcy4KKyAgICAgKgorICAgICAqIFRoaXMgZXh0cmEgcmVwcmVzZW50cyB0aGUgY3VycmVudCBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlIG9mIHRoZQorICAgICAqIEJsdWV0b290aCBkZXZpY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU1RBVEUgPSAiYW5kcm9pZC5ibHVldG9vdGgucHJvZmlsZS5leHRyYS5TVEFURSI7CisKKyAgICAvKioKKyAgICAgKiBFeHRyYSBmb3IgdGhlIGNvbm5lY3Rpb24gc3RhdGUgaW50ZW50cyBvZiB0aGUgaW5kaXZpZHVhbCBwcm9maWxlcy4KKyAgICAgKgorICAgICAqIFRoaXMgZXh0cmEgcmVwcmVzZW50cyB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcHJvZmlsZSBvZiB0aGUKKyAgICAgKiBCbHVldG9vdGggZGV2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRVZJT1VTX1NUQVRFID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLnByb2ZpbGUuZXh0cmEuUFJFVklPVVNfU1RBVEUiOworCisgICAgLyoqIFRoZSBwcm9maWxlIGlzIGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRCAgPSAwOworICAgIC8qKiBUaGUgcHJvZmlsZSBpcyBpbiBjb25uZWN0aW5nIHN0YXRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVElORyAgICA9IDE7CisgICAgLyoqIFRoZSBwcm9maWxlIGlzIGluIGNvbm5lY3RlZCBzdGF0ZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCAgICAgPSAyOworICAgIC8qKiBUaGUgcHJvZmlsZSBpcyBpbiBkaXNjb25uZWN0aW5nIHN0YXRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElORyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBIZWFkc2V0IGFuZCBIYW5kc2ZyZWUgcHJvZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURTRVQgPSAxOworICAgIC8qKgorICAgICAqIEEyRFAgcHJvZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBMkRQID0gMjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJpb3JpdHkgZm9yIGRldmljZXMgdGhhdCB3ZSB0cnkgdG8gYXV0by1jb25uZWN0IHRvIGFuZAorICAgICAqIGFuZCBhbGxvdyBpbmNvbWluZyBjb25uZWN0aW9ucyBmb3IgdGhlIHByb2ZpbGUKKyAgICAgKiBAaGlkZQorICAgICAqKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9BVVRPX0NPTk5FQ1QgPSAxMDAwOworCisgICAgLyoqCisgICAgICogIERlZmF1bHQgcHJpb3JpdHkgZm9yIGRldmljZXMgdGhhdCBhbGxvdyBpbmNvbWluZworICAgICAqIGFuZCBvdXRnb2luZyBjb25uZWN0aW9ucyBmb3IgdGhlIHByb2ZpbGUKKyAgICAgKiBAaGlkZQorICAgICAqKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PTiA9IDEwMDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJpb3JpdHkgZm9yIGRldmljZXMgdGhhdCBkb2VzIG5vdCBhbGxvdyBpbmNvbWluZworICAgICAqIGNvbm5lY3Rpb25zIGFuZCBvdXRnb2luZyBjb25uZWN0aW9ucyBmb3IgdGhlIHByb2ZpbGUuCisgICAgICogQGhpZGUKKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfT0ZGID0gMDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJpb3JpdHkgd2hlbiBub3Qgc2V0IG9yIHdoZW4gdGhlIGRldmljZSBpcyB1bnBhaXJlZAorICAgICAqIEBoaWRlCisgICAgICogKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9VTkRFRklORUQgPSAtMTsKKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGNvbm5lY3Rpb24gdG8gYSBwcm9maWxlIG9mIHRoZSByZW1vdGUgYmx1ZXRvb3RoIGRldmljZS4KKyAgICAgKgorICAgICAqIDxwPiBDdXJyZW50bHksIHRoZSBzeXN0ZW0gc3VwcG9ydHMgb25seSAxIGNvbm5lY3Rpb24gdG8gdGhlCisgICAgICogQTJEUCBhbmQgSGVhZHNldC9IYW5kc2ZyZWUgcHJvZmlsZS4gVGhlIEFQSSB3aWxsIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBkaXNjb25uZWN0IGNvbm5lY3RlZCBkZXZpY2VzIGJlZm9yZSBjb25uZWN0aW5nLgorICAgICAqCisgICAgICogPHA+IFRoaXMgQVBJIHJldHVybnMgZmFsc2UgaW4gc2NlbmFyaW9zIGxpa2UgdGhlIHByb2ZpbGUgb24gdGhlCisgICAgICogZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkIG9yIEJsdWV0b290aCBpcyBub3QgdHVybmVkIG9uLgorICAgICAqIFdoZW4gdGhpcyBBUEkgcmV0dXJucyB0cnVlLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQKKyAgICAgKiBjb25uZWN0aW9uIHN0YXRlIGludGVudCBmb3IgdGhlIHByb2ZpbGUgd2lsbCBiZSBicm9hZGNhc3RlZCB3aXRoCisgICAgICogdGhlIHN0YXRlLiBVc2VycyBjYW4gZ2V0IHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlCisgICAgICogZnJvbSB0aGlzIGludGVudC4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQmx1ZXRvb3RoIERldmljZQorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLAorICAgICAqICAgICAgICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBkaXNjb25uZWN0aW9uIGZyb20gYSBwcm9maWxlCisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBBUEkgd2lsbCByZXR1cm4gZmFsc2UgaW4gc2NlbmFyaW9zIGxpa2UgdGhlIHByb2ZpbGUgb24gdGhlCisgICAgICogQmx1ZXRvb3RoIGRldmljZSBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlIGV0Yy4gV2hlbiB0aGlzIEFQSSByZXR1cm5zLAorICAgICAqIHRydWUsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UKKyAgICAgKiBpbnRlbnQgd2lsbCBiZSBicm9hZGNhc3RlZCB3aXRoIHRoZSBzdGF0ZS4gVXNlcnMgY2FuIGdldCB0aGUKKyAgICAgKiBkaXNjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlIGZyb20gdGhpcyBpbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD4gSWYgdGhlIGRpc2Nvbm5lY3Rpb24gaXMgaW5pdGlhdGVkIGJ5IGEgcmVtb3RlIGRldmljZSwgdGhlIHN0YXRlCisgICAgICogd2lsbCB0cmFuc2l0aW9uIGZyb20ge0BsaW5rICNTVEFURV9DT05ORUNURUR9IHRvCisgICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LiBJZiB0aGUgZGlzY29ubmVjdCBpcyBpbml0aWF0ZWQgYnkgdGhlCisgICAgICogaG9zdCAobG9jYWwpIGRldmljZSB0aGUgc3RhdGUgd2lsbCB0cmFuc2l0aW9uIGZyb20KKyAgICAgKiB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0gdG8gc3RhdGUge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfSB0bworICAgICAqIHN0YXRlIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfS4gVGhlIHRyYW5zaXRpb24gdG8KKyAgICAgKiB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RJTkd9IGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlCisgICAgICogdHdvIHNjZW5hcmlvcy4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQmx1ZXRvb3RoIERldmljZQorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLAorICAgICAqICAgICAgICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29ubmVjdGVkIGRldmljZXMgZm9yIHRoaXMgc3BlY2lmaWMgcHJvZmlsZS4KKyAgICAgKgorICAgICAqIDxwPiBSZXR1cm4gdGhlIHNldCBvZiBkZXZpY2VzIHdoaWNoIGFyZSBpbiBzdGF0ZSB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfQorICAgICAqCisgICAgICogQHJldHVybiBBbiB1bm1vZGlmaWFibGUgc2V0IG9mIGRldmljZXMuIFRoZSBzZXQgd2lsbCBiZSBlbXB0eSBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcygpOworCisgICAgLyoqCisgICAgICogR2V0IGEgc2V0IG9mIGRldmljZXMgdGhhdCBtYXRjaCBhbnkgb2YgdGhlIGdpdmVuIGNvbm5lY3Rpb24KKyAgICAgKiBzdGF0ZXMuCisgICAgICoKKyAgICAgKiA8cD4gSWYgbm9uZSBvZiBkZXZpY2VzIG1hdGNoIGFueSBvZiB0aGUgZ2l2ZW4gc3RhdGVzLAorICAgICAqIGFuIGVtcHR5IHNldCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGVzIEFycmF5IG9mIHN0YXRlcy4gU3RhdGVzIGNhbiBiZSBvbmUgb2YKKyAgICAgKiAgICAgICAgICAgICAge0BsaW5rICNTVEFURV9DT05ORUNURUR9LCB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RJTkd9LAorICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RFRH0sIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVElOR30sCisgICAgICogQHJldHVybiBBbiB1bm1vZGlmaWFibGUgc2V0IG9mIGRldmljZXMuIFRoZSBzZXQgd2lsbCBiZSBlbXB0eSBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbnRbXSBzdGF0ZXMpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHByb2ZpbGUKKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgYmx1ZXRvb3RoIGRldmljZS4KKyAgICAgKiBAcmV0dXJuIFN0YXRlIG9mIHRoZSBwcm9maWxlIGNvbm5lY3Rpb24uIE9uZSBvZgorICAgICAqICAgICAgICAgICAgICAge0BsaW5rICNTVEFURV9DT05ORUNURUR9LCB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RJTkd9LAorICAgICAqICAgICAgICAgICAgICAge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LCB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RJTkd9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgcHJpb3JpdHkgb2YgdGhlIHByb2ZpbGUKKyAgICAgKgorICAgICAqIDxwPiBUaGUgZGV2aWNlIHNob3VsZCBhbHJlYWR5IGJlIHBhaXJlZC4KKyAgICAgKiAgUHJpb3JpdHkgY2FuIGJlIG9uZSBvZiB7QGxpbmsgI1BSSU9SSVRZX09OfSBvcgorICAgICAqIHtAbGluayAjUFJJT1JJVFlfT0ZGfSwKKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBQYWlyZWQgYmx1ZXRvb3RoIGRldmljZQorICAgICAqIEBwYXJhbSBwcmlvcml0eQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwcmlvcml0eSBpcyBzZXQsIGZhbHNlIG9uIGVycm9yCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJpb3JpdHkpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgcHJvZmlsZS4KKyAgICAgKgorICAgICAqIDxwPiBUaGUgcHJpb3JpdHkgY2FuIGJlIGFueSBvZjoKKyAgICAgKiB7QGxpbmsgI1BSSU9SSVRZX0FVVE9fQ09OTkVDVH0sIHtAbGluayAjUFJJT1JJVFlfT0ZGfSwKKyAgICAgKiB7QGxpbmsgI1BSSU9SSVRZX09OfSwge0BsaW5rICNQUklPUklUWV9VTkRFRklORUR9CisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USH0KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgQmx1ZXRvb3RoIGRldmljZQorICAgICAqIEByZXR1cm4gcHJpb3JpdHkgb2YgdGhlIGRldmljZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKworICAgIC8qKgorICAgICAqIEFuIGludGVyZmFjZSBmb3Igbm90aWZ5aW5nIEJsdWV0b290aFByb2ZpbGUgSVBDIGNsaWVudHMgd2hlbiB0aGV5IGhhdmUKKyAgICAgKiBiZWVuIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQgdG8gdGhlIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBTZXJ2aWNlTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHRvIG5vdGlmeSB0aGUgY2xpZW50IHdoZW4gdGhlIHByb3h5IG9iamVjdCBoYXMgYmVlbgorICAgICAgICAgKiBjb25uZWN0ZWQgdG8gdGhlIHNlcnZpY2UuCisgICAgICAgICAqIEBwYXJhbSBwcm9maWxlIC0gT25lIG9mIHtAbGluayAjSEVBRFNFVH0gb3IKKyAgICAgICAgICogICAgICAgICAgICAgICAgICB7QGxpbmsgI0EyRFB9CisgICAgICAgICAqIEBwYXJhbSBwcm94eSAtIE9uZSBvZiB7QGxpbmsgQmx1ZXRvb3RoSGVhZHNldH0gb3IKKyAgICAgICAgICogICAgICAgICAgICAgICAge0BsaW5rIEJsdWV0b290aEEyZHB9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoaW50IHByb2ZpbGUsIEJsdWV0b290aFByb2ZpbGUgcHJveHkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gbm90aWZ5IHRoZSBjbGllbnQgdGhhdCB0aGlzIHByb3h5IG9iamVjdCBoYXMgYmVlbgorICAgICAgICAgKiBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgc2VydmljZS4KKyAgICAgICAgICogQHBhcmFtIHByb2ZpbGUgLSBPbmUgb2Yge0BsaW5rICNIRUFEU0VUfSBvcgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgIHtAbGluayAjQTJEUH0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhCmluZGV4IDk0NmRjYWEuLjdmNDJiYWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlU3RhdGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEKQEAgLTQzLDggKzQzLDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7IC8vIFNUT1BTSElQIC0gY2hhbmdlIHRvIGZhbHNlLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IEhGUCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgQTJEUCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEZQID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBMkRQID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISUQgPSAyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFRSQU5TSVRJT05fVE9fU1RBQkxFID0gMTAwOwogCkBAIC01OCwxNiArNTksMjIgQEAKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewogICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKIAotICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSGVhZHNldC5FWFRSQV9TVEFURSwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Qcm9maWxlID09IEhGUCAmJiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQpKSB7CisgICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIDApOworICAgICAgICAgICAgICAgIGlmIChtUHJvZmlsZSA9PSBIRlAgJiYgKG5ld1N0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEIHx8CisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKSkgewogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQTJkcC5FWFRSQV9TSU5LX1NUQVRFLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAobVByb2ZpbGUgPT0gQTJEUCAmJiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAobVByb2ZpbGUgPT0gQTJEUCAmJiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhJbnB1dERldmljZS5FWFRSQV9JTlBVVF9ERVZJQ0VfU1RBVEUsIDApOworICAgICAgICAgICAgICAgIGlmIChtUHJvZmlsZSA9PSBISUQgJiYgKG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCB8fAorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC04Miw4ICs4OSw5IEBACiAgICAgICAgIHNldEluaXRpYWxTdGF0ZShtU3RhYmxlU3RhdGUpOwogCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEKTsKICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhCmluZGV4IDQxNjRhM2QuLjNmYmZjNzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YQpAQCAtNDksMTAgKzQ5LDE4IEBACiAgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTBDLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBPYmV4T2JqZWN0UHVzaCA9CiAgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTA1LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBIaWQgPQorICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTEyNC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWQgUEFOVSA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTE1LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBOQVAgPQorICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTExNi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWQgQk5FUCA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAwMDBmLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkW10gUkVTRVJWRURfVVVJRFMgPSB7CiAgICAgICAgIEF1ZGlvU2luaywgQXVkaW9Tb3VyY2UsIEFkdkF1ZGlvRGlzdCwgSFNQLCBIYW5kc2ZyZWUsIEF2cmNwQ29udHJvbGxlciwgQXZyY3BUYXJnZXQsCi0gICAgICAgIE9iZXhPYmplY3RQdXNofTsKKyAgICAgICAgT2JleE9iamVjdFB1c2gsIFBBTlUsIE5BUH07CiAKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdWRpb1NvdXJjZShQYXJjZWxVdWlkIHV1aWQpIHsKICAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEF1ZGlvU291cmNlKTsKQEAgLTgyLDYgKzkwLDIxIEBACiAgICAgICAgIHJldHVybiB1dWlkLmVxdWFscyhBdnJjcFRhcmdldCk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5wdXREZXZpY2UoUGFyY2VsVXVpZCB1dWlkKSB7CisgICAgICAgIHJldHVybiB1dWlkLmVxdWFscyhIaWQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhbnUoUGFyY2VsVXVpZCB1dWlkKSB7CisgICAgICAgIHJldHVybiB1dWlkLmVxdWFscyhQQU5VKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOYXAoUGFyY2VsVXVpZCB1dWlkKSB7CisgICAgICAgIHJldHVybiB1dWlkLmVxdWFscyhOQVApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JuZXAoUGFyY2VsVXVpZCB1dWlkKSB7CisgICAgICAgIHJldHVybiB1dWlkLmVxdWFscyhCTkVQKTsKKyAgICB9CiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIFBhcmNlbFV1aWQgaXMgcHJlc2VudCBpbiB1dWlkQXJyYXkKICAgICAgKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKaW5kZXggNmRkOGRkNi4uY2MyMzE0NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwogCiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7CiAKIC8qKgpAQCAtNzYsNCArNzcsMTkgQEAKICAgICBib29sZWFuIGNvbm5lY3RIZWFkc2V0KFN0cmluZyBhZGRyZXNzKTsKICAgICBib29sZWFuIGRpc2Nvbm5lY3RIZWFkc2V0KFN0cmluZyBhZGRyZXNzKTsKICAgICBib29sZWFuIG5vdGlmeUluY29taW5nQ29ubmVjdGlvbihTdHJpbmcgYWRkcmVzcyk7CisKKyAgICAvLyBISUQgcHJvZmlsZSBBUElzCisgICAgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2UoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgYm9vbGVhbiBkaXNjb25uZWN0SW5wdXREZXZpY2UoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCk7ICAvLyBjaGFuZ2UgdG8gU2V0PD4gb25jZSBBSURMIHN1cHBvcnRzCisgICAgaW50IGdldElucHV0RGV2aWNlU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSk7CisgICAgaW50IGdldElucHV0RGV2aWNlUHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisKKyAgICBib29sZWFuIGlzVGV0aGVyaW5nT24oKTsKKyAgICB2b2lkIHNldEJsdWV0b290aFRldGhlcmluZyhib29sZWFuIHZhbHVlKTsKKyAgICBpbnQgZ2V0UGFuRGV2aWNlU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpOworICAgIGJvb2xlYW4gY29ubmVjdFBhbkRldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIGRpc2Nvbm5lY3RQYW5EZXZpY2UoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHAuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcC5haWRsCmluZGV4IDQwZjEwNTguLmM1MDQ0YzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcC5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcC5haWRsCkBAIC0xOSwyMSArMTksMjUgQEAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CiAKIC8qKgotICogU3lzdGVtIHByaXZhdGUgQVBJIGZvciBCbHVldG9vdGggQTJEUCBzZXJ2aWNlCisgKiBBUElzIGZvciBCbHVldG9vdGggQTJEUCBzZXJ2aWNlCiAgKgotICoge0BoaWRlfQorICogQGhpZGUKICAqLwogaW50ZXJmYWNlIElCbHVldG9vdGhBMmRwIHsKLSAgICBib29sZWFuIGNvbm5lY3RTaW5rKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIGJvb2xlYW4gZGlzY29ubmVjdFNpbmsoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgLy8gUHVibGljIEFQSQorICAgIGJvb2xlYW4gY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIGRpc2Nvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgLy8gY2hhbmdlIHRvIFNldDw+IG9uY2UgQUlETCBzdXBwb3J0cworICAgIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZERldmljZXMoKTsKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGluIGludFtdIHN0YXRlcyk7CisgICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIHNldFByaW9yaXR5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSk7CisgICAgaW50IGdldFByaW9yaXR5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gaXNBMmRwUGxheWluZyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKworICAgIC8vIEludGVybmFsIEFQSXMKICAgICBib29sZWFuIHN1c3BlbmRTaW5rKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwogICAgIGJvb2xlYW4gcmVzdW1lU2luayhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRTaW5rcygpOyAgLy8gY2hhbmdlIHRvIFNldDw+IG9uY2UgQUlETCBzdXBwb3J0cwotICAgIEJsdWV0b290aERldmljZVtdIGdldE5vbkRpc2Nvbm5lY3RlZFNpbmtzKCk7ICAvLyBjaGFuZ2UgdG8gU2V0PD4gb25jZSBBSURMIHN1cHBvcnRzCi0gICAgaW50IGdldFNpbmtTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBib29sZWFuIHNldFNpbmtQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJpb3JpdHkpOwotICAgIGludCBnZXRTaW5rUHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7Ci0KICAgICBib29sZWFuIGNvbm5lY3RTaW5rSW50ZXJuYWwoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiAgICAgYm9vbGVhbiBkaXNjb25uZWN0U2lua0ludGVybmFsKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFkc2V0LmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXQuYWlkbAppbmRleCBkOTZmMGNhLi44YmNmMTAzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXQuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXQuYWlkbApAQCAtMTksMjUgKzE5LDMyIEBACiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogCiAvKioKLSAqIFN5c3RlbSBwcml2YXRlIEFQSSBmb3IgQmx1ZXRvb3RoIEhlYWRzZXQgc2VydmljZQorICogQVBJIGZvciBCbHVldG9vdGggSGVhZHNldCBzZXJ2aWNlCiAgKgogICoge0BoaWRlfQogICovCiBpbnRlcmZhY2UgSUJsdWV0b290aEhlYWRzZXQgewotICAgIGludCBnZXRTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBCbHVldG9vdGhEZXZpY2UgZ2V0Q3VycmVudEhlYWRzZXQoKTsKLSAgICBib29sZWFuIGNvbm5lY3RIZWFkc2V0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIHZvaWQgZGlzY29ubmVjdEhlYWRzZXQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7Ci0gICAgYm9vbGVhbiBpc0Nvbm5lY3RlZChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBib29sZWFuIHN0YXJ0Vm9pY2VSZWNvZ25pdGlvbigpOwotICAgIGJvb2xlYW4gc3RvcFZvaWNlUmVjb2duaXRpb24oKTsKKyAgICAvLyBQdWJsaWMgQVBJCisgICAgYm9vbGVhbiBjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gZGlzY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICAvLyBDaGFuZ2UgdG8gU2V0PD4gd2hlbiBBSURMIHN1cHBvcnRzCisgICAgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkRGV2aWNlcygpOworICAgIEJsdWV0b290aERldmljZVtdIGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW4gaW50W10gc3RhdGVzKTsKKyAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwogICAgIGJvb2xlYW4gc2V0UHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KTsKICAgICBpbnQgZ2V0UHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7Ci0gICAgaW50IGdldEJhdHRlcnlVc2FnZUhpbnQoKTsKKyAgICBib29sZWFuIHN0YXJ0Vm9pY2VSZWNvZ25pdGlvbihpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIHN0b3BWb2ljZVJlY29nbml0aW9uKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gaXNBdWRpb0Nvbm5lY3RlZChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKIAorICAgIC8vIEFQSXMgdGhhdCBjYW4gYmUgbWFkZSBwdWJsaWMgaW4gZnV0dXJlCisgICAgaW50IGdldEJhdHRlcnlVc2FnZUhpbnQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisKKyAgICAvLyBJbnRlcm5hbCBmdW5jdGlvbnMsIG5vdCBiZSBtYWRlIHB1YmxpYwogICAgIGJvb2xlYW4gY3JlYXRlSW5jb21pbmdDb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwogICAgIGJvb2xlYW4gYWNjZXB0SW5jb21pbmdDb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwogICAgIGJvb2xlYW4gY2FuY2VsQ29ubmVjdFRocmVhZCgpOwogICAgIGJvb2xlYW4gY29ubmVjdEhlYWRzZXRJbnRlcm5hbChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKICAgICBib29sZWFuIGRpc2Nvbm5lY3RIZWFkc2V0SW50ZXJuYWwoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgYm9vbGVhbiBzZXRBdWRpb1N0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NWE5OWEuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL1Njb1NvY2tldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlci5XYWtlTG9jazsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIFRoZSBBbmRyb2lkIEJsdWV0b290aCBBUEkgaXMgbm90IGZpbmFsaXplZCwgYW5kICp3aWxsKiBjaGFuZ2UuIFVzZSBhdCB5b3VyCi0gKiBvd24gcmlzay4KLSAqCi0gKiBTaW1wbGUgU0NPIFNvY2tldC4KLSAqIEN1cnJlbnRseSBpbiBBbmRyb2lkLCB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZW5kaW5nIGRhdGEgb3ZlciBhIFNDTwotICogc29ja2V0IC0gdGhpcyBpcyBtYW5hZ2VkIGJ5IHRoZSBoYXJkd2FyZSBsaW5rIHRvIHRoZSBCbHVldG9vdGggQ2hpcC4gVGhpcwotICogY2xhc3MgaXMgaW5zdGVhZCBpbnRlbmRlZCBmb3IgbWFuYWdlbWVudCBvZiB0aGUgU0NPIHNvY2tldCBsaWZldGltZSwgCi0gKiBhbmQgaXMgdGFpbG9yZWQgZm9yIHVzZSB3aXRoIHRoZSBoZWFkc2V0IC8gaGFuZHNmcmVlIHByb2ZpbGVzLgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIFNjb1NvY2tldCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTY29Tb2NrZXQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZEQkcgPSBmYWxzZTsgIC8vIGV2ZW4gbW9yZSBsb2dnaW5nCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9SRUFEWSA9IDE7ICAgIC8vIFJlYWR5IGZvciB1c2UuIE5vIHRocmVhZHMgb3Igc29ja2V0cwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FDQ0VQVCA9IDI7ICAgLy8gYWNjZXB0KCkgdGhyZWFkIHJ1bm5pbmcKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HID0gMzsgIC8vIGNvbm5lY3QoKSB0aHJlYWQgcnVubmluZwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCA9IDQ7ICAgLy8gY29ubmVjdGVkLCB3YWl0aW5nIGZvciBjbG9zZSgpCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0xPU0VEID0gNTsgICAvLyB3YXMgY29ubmVjdGVkLCBub3cgY2xvc2VkLgotCi0gICAgcHJpdmF0ZSBpbnQgbVN0YXRlOwotICAgIHByaXZhdGUgaW50IG1OYXRpdmVEYXRhOwotICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIGludCBtQWNjZXB0ZWRDb2RlOwotICAgIHByaXZhdGUgaW50IG1Db25uZWN0ZWRDb2RlOwotICAgIHByaXZhdGUgaW50IG1DbG9zZWRDb2RlOwotCi0gICAgcHJpdmF0ZSBXYWtlTG9jayBtV2FrZUxvY2s7ICAvLyBoZWxkIHdoaWxlIGluIFNUQVRFX0NPTk5FQ1RJTkcKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGNsYXNzSW5pdE5hdGl2ZSgpOwotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgdm9pZCBjbGFzc0luaXROYXRpdmUoKTsKLQotICAgIHB1YmxpYyBTY29Tb2NrZXQoUG93ZXJNYW5hZ2VyIHBtLCBIYW5kbGVyIGhhbmRsZXIsIGludCBhY2NlcHRlZENvZGUsIGludCBjb25uZWN0ZWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgaW50IGNsb3NlZENvZGUpIHsKLSAgICAgICAgaW5pdE5hdGl2ZSgpOwotICAgICAgICBtU3RhdGUgPSBTVEFURV9SRUFEWTsKLSAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOwotICAgICAgICBtQWNjZXB0ZWRDb2RlID0gYWNjZXB0ZWRDb2RlOwotICAgICAgICBtQ29ubmVjdGVkQ29kZSA9IGNvbm5lY3RlZENvZGU7Ci0gICAgICAgIG1DbG9zZWRDb2RlID0gY2xvc2VkQ29kZTsKLSAgICAgICAgbVdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCAiU2NvU29ja2V0Iik7Ci0gICAgICAgIG1XYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKLSAgICAgICAgaWYgKFZEQkcpIGxvZyh0aGlzICsgIiBTQ08gT0JKRUNUIENUT1IiKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0TmF0aXZlKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKFZEQkcpIGxvZyh0aGlzICsgIiBTQ08gT0JKRUNUIERUT1IiKTsKLSAgICAgICAgICAgIGRlc3Ryb3lOYXRpdmUoKTsKLSAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja05vdygpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGRlc3Ryb3lOYXRpdmUoKTsKLQotICAgIC8qKiBDb25uZWN0IHRoaXMgU0NPIHNvY2tldCB0byB0aGUgZ2l2ZW4gQlQgYWRkcmVzcy4KLSAgICAgKiAgRG9lcyBub3QgYmxvY2suCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3QoU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCgpICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9SRUFEWSkgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KCk6IEJhZCBzdGF0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVXYWtlTG9jaygpOwotICAgICAgICBpZiAoY29ubmVjdE5hdGl2ZShhZGRyZXNzLCBuYW1lKSkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0TmF0aXZlKFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKiogQWNjZXB0IGluY29taW5nIFNDTyBjb25uZWN0aW9ucy4KLSAgICAgKiAgRG9lcyBub3QgYmxvY2suCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFjY2VwdCgpIHsKLSAgICAgICAgaWYgKFZEQkcpIGxvZygiYWNjZXB0KCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1JFQURZKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coIkJhZCBzdGF0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhY2NlcHROYXRpdmUoKSkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUNDRVBUOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBhY2NlcHROYXRpdmUoKTsKLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgY2xvc2UoKSBtU3RhdGUgPSAiICsgbVN0YXRlKTsKLSAgICAgICAgYWNxdWlyZVdha2VMb2NrKCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgY2xvc2VOYXRpdmUoKTsKLSAgICAgICAgcmVsZWFzZVdha2VMb2NrKCk7Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgY2xvc2VOYXRpdmUoKTsKLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgb25Db25uZWN0ZWQoaW50IHJlc3VsdCkgewotICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIG9uQ29ubmVjdGVkKCkgbVN0YXRlID0gIiArIG1TdGF0ZSArICIgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTk5FQ1RJTkcpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiU3RyYW5nZSBzdGF0ZSwgY2xvc2luZyAiICsgbVN0YXRlICsgIiAiICsgdGhpcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQ29ubmVjdGVkQ29kZSwgbVN0YXRlLCAtMSwgdGhpcykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIHJlbGVhc2VXYWtlTG9ja05vdygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgb25BY2NlcHRlZChpbnQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChWREJHKSBsb2coIm9uQWNjZXB0ZWQoKSAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNDRVBUKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coIlN0cmFuZ2Ugc3RhdGUgIiArIHRoaXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPj0gMCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICB9Ci0gICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UobUFjY2VwdGVkQ29kZSwgbVN0YXRlLCAtMSwgdGhpcykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkNsb3NlZCgpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJvbkNsb3NlZCgpICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DTE9TRUQpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UobUNsb3NlZENvZGUsIG1TdGF0ZSwgLTEsIHRoaXMpLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWNxdWlyZVdha2VMb2NrKCkgewotICAgICAgICBpZiAoIW1XYWtlTG9jay5pc0hlbGQoKSkgewotICAgICAgICAgICAgbVdha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5hY3F1aXJlKCkgIiArIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VXYWtlTG9jaygpIHsKLSAgICAgICAgaWYgKG1XYWtlTG9jay5pc0hlbGQoKSkgewotICAgICAgICAgICAgLy8gS2VlcCBhcHBzIHByb2Nlc3NvciBhd2FrZSBmb3IgYSBmdXJ0aGVyIDIgc2Vjb25kcy4KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIHJlc29sdmUgaXNzdWUgaHR0cDovL2IvMTYxNjI2MyAtIGluIHdoaWNoCi0gICAgICAgICAgICAvLyB3ZSBhcmUgbGVmdCBpbiBhIDgwIG1BIHBvd2VyIHN0YXRlIHdoZW4gcmVtb3RlbHkgdGVybWluYXRpbmcgYQotICAgICAgICAgICAgLy8gY2FsbCB3aGlsZSBjb25uZWN0ZWQgdG8gQlQgaGVhZHNldCAiSFRDIEJIIFMxMDAgIiB3aXRoIEEyRFAgYW5kCi0gICAgICAgICAgICAvLyBIRlAgcHJvZmlsZXMuCi0gICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJtV2FrZUxvY2sucmVsZWFzZSgpIGluIDIgc2VjIiArIHRoaXMpOwotICAgICAgICAgICAgbVdha2VMb2NrLmFjcXVpcmUoMjAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVdha2VMb2NrTm93KCkgewotICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJtV2FrZUxvY2sucmVsZWFzZSgpIG5vdyIgKyB0aGlzKTsKLSAgICAgICAgICAgIG1XYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgTG9nLmQoVEFHLCBtc2cpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0FzeW5jVGFza0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOWMwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0FzeW5jVGFza0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKKworLyoqCisgKiBBYnN0cmFjdCBMb2FkZXIgdGhhdCBwcm92aWRlcyBhbiB7QGxpbmsgQXN5bmNUYXNrfSB0byBkbyB0aGUgd29yay4KKyAqCisgKiBAcGFyYW0gPEQ+IHRoZSBkYXRhIHR5cGUgdG8gYmUgbG9hZGVkLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNUYXNrTG9hZGVyPEQ+IGV4dGVuZHMgTG9hZGVyPEQ+IHsKKyAgICBmaW5hbCBjbGFzcyBMb2FkVGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBEPiB7CisKKyAgICAgICAgcHJpdmF0ZSBEIHJlc3VsdDsKKworICAgICAgICAvKiBSdW5zIG9uIGEgd29ya2VyIHRocmVhZCAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEQgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFzeW5jVGFza0xvYWRlci50aGlzLmxvYWRJbkJhY2tncm91bmQoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBSdW5zIG9uIHRoZSBVSSB0aHJlYWQgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoRCBkYXRhKSB7CisgICAgICAgICAgICBBc3luY1Rhc2tMb2FkZXIudGhpcy5kaXNwYXRjaE9uTG9hZENvbXBsZXRlKGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgQXN5bmNUYXNrTG9hZGVyLnRoaXMub25DYW5jZWxsZWQocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExvYWRUYXNrIG1UYXNrOworCisgICAgcHVibGljIEFzeW5jVGFza0xvYWRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2UgYW4gYXN5bmNocm9ub3VzIGxvYWQuIFVubGlrZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSB0aGlzIHdpbGwgaWdub3JlIGEgcHJldmlvdXNseQorICAgICAqIGxvYWRlZCBkYXRhIHNldCBhbmQgbG9hZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZm9yY2VMb2FkKCkgeworICAgICAgICBjYW5jZWxMb2FkKCk7CisgICAgICAgIG1UYXNrID0gbmV3IExvYWRUYXNrKCk7CisgICAgICAgIG1UYXNrLmV4ZWN1dGUoKFZvaWRbXSkgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdCB0byBjYW5jZWwgdGhlIGN1cnJlbnQgbG9hZCB0YXNrLiBTZWUge0BsaW5rIEFzeW5jVGFzayNjYW5jZWwoYm9vbGVhbil9CisgICAgICogZm9yIG1vcmUgaW5mby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPHR0PmZhbHNlPC90dD4gaWYgdGhlIHRhc2sgY291bGQgbm90IGJlIGNhbmNlbGVkLAorICAgICAqICAgICAgICAgdHlwaWNhbGx5IGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgY29tcGxldGVkIG5vcm1hbGx5LCBvcgorICAgICAqICAgICAgICAgYmVjYXVzZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSBoYXNuJ3QgYmVlbiBjYWxsZWQsIGFuZAorICAgICAqICAgICAgICAgPHR0PnRydWU8L3R0PiBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWxMb2FkKCkgeworICAgICAgICBpZiAobVRhc2sgIT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiBjYW5jZWxsZWQgPSBtVGFzay5jYW5jZWwoZmFsc2UpOworICAgICAgICAgICAgbVRhc2sgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIGNhbmNlbGxlZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGlmIHRoZSB0YXNrIHdhcyBjYW5jZWxlZCBiZWZvcmUgaXQgd2FzIGNvbXBsZXRlZC4gIEdpdmVzIHRoZSBjbGFzcyBhIGNoYW5jZQorICAgICAqIHRvIHByb3Blcmx5IGRpc3Bvc2Ugb2YgdGhlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbGxlZChEIGRhdGEpIHsKKyAgICB9CisKKyAgICB2b2lkIGRpc3BhdGNoT25Mb2FkQ29tcGxldGUoRCBkYXRhKSB7CisgICAgICAgIG1UYXNrID0gbnVsbDsKKyAgICAgICAgZGVsaXZlclJlc3VsdChkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgb24gYSB3b3JrZXIgdGhyZWFkIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBsb2FkLiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCBkZWxpdmVyIHRoZQorICAgICAqIHJlc3VsdHMgZGlyZWN0bHksIGJ1dCBzaG91bGQgcmV0dXJuIHRoZW0gZnJvbSB0aGlzIG1ldGhvZCwgd2hpY2ggd2lsbCBldmVudHVhbGx5IGVuZCB1cAorICAgICAqIGNhbGxpbmcgZGVsaXZlclJlc3VsdCBvbiB0aGUgVUkgdGhyZWFkLiBJZiBpbXBsZW1lbnRhdGlvbnMgbmVlZCB0byBwcm9jZXNzCisgICAgICogdGhlIHJlc3VsdHMgb24gdGhlIFVJIHRocmVhZCB0aGV5IG1heSBvdmVycmlkZSBkZWxpdmVyUmVzdWx0IGFuZCBkbyBzbworICAgICAqIHRoZXJlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEQgbG9hZEluQmFja2dyb3VuZCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzEyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworcGFyY2VsYWJsZSBDbGlwRGF0YTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTliMTMyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhCkBAIC0wLDAgKzEsNDk0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSBjbGlwcGVkIGRhdGEgb24gdGhlIGNsaXBib2FyZC4KKyAqCisgKiA8cD5DbGlwcGVkRGF0YSBpcyBhIGNvbXBsZXggdHlwZSBjb250YWluaW5nIG9uZSBvciBJdGVtIGluc3RhbmNlcywKKyAqIGVhY2ggb2Ygd2hpY2ggY2FuIGhvbGQgb25lIG9yIG1vcmUgcmVwcmVzZW50YXRpb25zIG9mIGFuIGl0ZW0gb2YgZGF0YS4KKyAqIEZvciBkaXNwbGF5IHRvIHRoZSB1c2VyLCBpdCBhbHNvIGhhcyBhIGxhYmVsIGFuZCBpY29uaWMgcmVwcmVzZW50YXRpb24uPC9wPgorICoKKyAqIDxwPkEgQ2xpcERhdGEgaXMgYSBzdWItY2xhc3Mgb2Yge0BsaW5rIENsaXBEZXNjcmlwdGlvbn0sIHdoaWNoIGRlc2NyaWJlcworICogaW1wb3J0YW50IG1ldGEtZGF0YSBhYm91dCB0aGUgY2xpcC4gIEluIHBhcnRpY3VsYXIsIGl0cyB7QGxpbmsgI2dldE1pbWVUeXBlKGludCl9CisgKiBtdXN0IHJldHVybiBjb3JyZWN0IE1JTUUgdHlwZShzKSBkZXNjcmliaW5nIHRoZSBkYXRhIGluIHRoZSBjbGlwLiAgRm9yIGhlbHAKKyAqIGluIGNvcnJlY3RseSBjb25zdHJ1Y3RpbmcgYSBjbGlwIHdpdGggdGhlIGNvcnJlY3QgTUlNRSB0eXBlLCB1c2UKKyAqIHtAbGluayAjbmV3UGxhaW5UZXh0KENoYXJTZXF1ZW5jZSwgQml0bWFwLCBDaGFyU2VxdWVuY2UpfSwKKyAqIHtAbGluayAjbmV3VXJpKENvbnRlbnRSZXNvbHZlciwgQ2hhclNlcXVlbmNlLCBCaXRtYXAsIFVyaSl9LCBhbmQKKyAqIHtAbGluayAjbmV3SW50ZW50KENoYXJTZXF1ZW5jZSwgQml0bWFwLCBJbnRlbnQpfS4KKyAqCisgKiA8cD5FYWNoIEl0ZW0gaW5zdGFuY2UgY2FuIGJlIG9uZSBvZiB0aHJlZSBtYWluIGNsYXNzZXMgb2YgZGF0YTogYSBzaW1wbGUKKyAqIENoYXJTZXF1ZW5jZSBvZiB0ZXh0LCBhIHNpbmdsZSBJbnRlbnQgb2JqZWN0LCBvciBhIFVyaS4gIFNlZSB7QGxpbmsgSXRlbX0KKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogPGEgbmFtZT0iSW1wbGVtZW50aW5nUGFzdGUiPjwvYT4KKyAqIDxoMz5JbXBsZW1lbnRpbmcgUGFzdGUgb3IgRHJvcDwvaDM+CisgKgorICogPHA+VG8gaW1wbGVtZW50IGEgcGFzdGUgb3IgZHJvcCBvZiBhIENsaXBwZWREYXRhIG9iamVjdCBpbnRvIGFuIGFwcGxpY2F0aW9uLAorICogdGhlIGFwcGxpY2F0aW9uIG11c3QgY29ycmVjdGx5IGludGVycHJldCB0aGUgZGF0YSBmb3IgaXRzIHVzZS4gIElmIHRoZSB7QGxpbmsgSXRlbX0KKyAqIGl0IGNvbnRhaW5zIGlzIHNpbXBsZSB0ZXh0IG9yIGFuIEludGVudCwgdGhlcmUgaXMgbGl0dGxlIHRvIGJlIGRvbmU6IHRleHQKKyAqIGNhbiBvbmx5IGJlIGludGVycHJldGVkIGFzIHRleHQsIGFuZCBhbiBJbnRlbnQgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IKKyAqIGNyZWF0aW5nIHNob3J0Y3V0cyAoc3VjaCBhcyBwbGFjaW5nIGljb25zIG9uIHRoZSBob21lIHNjcmVlbikgb3Igb3RoZXIKKyAqIGFjdGlvbnMuCisgKgorICogPHA+SWYgYWxsIHlvdSB3YW50IGlzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGlwcGVkIGRhdGEsIHlvdQorICogY2FuIHVzZSB0aGUgY29udmVuaWVuY2UgbWV0aG9kIHtAbGluayBJdGVtI2NvZXJjZVRvVGV4dCBJdGVtLmNvZXJjZVRvVGV4dH0uCisgKiBJbiB0aGlzIGNhc2UgdGhlcmUgaXMgZ2VuZXJhbGx5IG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIE1JTUUgdHlwZXMKKyAqIHJlcG9ydGVkIGJ5IHtAbGluayAjZ2V0TWltZVR5cGUoaW50KX0sIHNpbmNlIGFueSBjbGlwIGl0ZW0gYW4gYWx3YXlzIGJlCisgKiBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuCisgKgorICogPHA+TW9yZSBjb21wbGljYXRlZCBleGNoYW5nZXMgd2lsbCBiZSBkb25lIHRocm91Z2ggVVJJcywgaW4gcGFydGljdWxhcgorICogImNvbnRlbnQ6IiBVUklzLiAgQSBjb250ZW50IFVSSSBhbGxvd3MgdGhlIHJlY2lwaWVudCBvZiBhIENsaXBwZWREYXRhIGl0ZW0KKyAqIHRvIGludGVyYWN0IGNsb3NlbHkgd2l0aCB0aGUgQ29udGVudFByb3ZpZGVyIGhvbGRpbmcgdGhlIGRhdGEgaW4gb3JkZXIgdG8KKyAqIG5lZ290aWF0ZSB0aGUgdHJhbnNmZXIgb2YgdGhhdCBkYXRhLiAgVGhlIGNsaXAgbXVzdCBhbHNvIGJlIGZpbGxlZCBpbiB3aXRoCisgKiB0aGUgYXZhaWxhYmxlIE1JTUUgdHlwZXM7IHtAbGluayAjbmV3VXJpKENvbnRlbnRSZXNvbHZlciwgQ2hhclNlcXVlbmNlLCBCaXRtYXAsIFVyaSl9CisgKiB3aWxsIHRha2UgY2FyZSBvZiBjb3JyZWN0bHkgZG9pbmcgdGhpcy4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgaGVyZSBpcyB0aGUgcGFzdGUgZnVuY3Rpb24gb2YgYSBzaW1wbGUgTm90ZVBhZCBhcHBsaWNhdGlvbi4KKyAqIFdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQsIGl0IGNhbiBkbyBlaXRoZXIgdHdvIHRoaW5nczoKKyAqIGlmIHRoZSBjbGlwYm9hcmQgY29udGFpbnMgYSBVUkkgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG5vdGUsIGl0IGNvcGllcworICogdGhlIGVudGlyZSBzdHJ1Y3R1cmUgb2YgdGhlIG5vdGUgaW50byBhIG5ldyBub3RlOyBvdGhlcndpc2UsIGl0IHNpbXBseQorICogY29lcmNlcyB0aGUgY2xpcCBpbnRvIHRleHQgYW5kIHVzZXMgdGhhdCBhcyB0aGUgbmV3IG5vdGUncyBjb250ZW50cy4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlRWRpdG9yLmphdmEKKyAqICAgICAgcGFzdGV9CisgKgorICogPHA+SW4gbWFueSBjYXNlcyBhbiBhcHBsaWNhdGlvbiBjYW4gcGFzdGUgdmFyaW91cyB0eXBlcyBvZiBzdHJlYW1zIG9mIGRhdGEuICBGb3IKKyAqIGV4YW1wbGUsIGFuIGUtbWFpbCBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byBhbGxvdyB0aGUgdXNlciB0byBwYXN0ZSBhbiBpbWFnZQorICogb3Igb3RoZXIgYmluYXJ5IGRhdGEgYXMgYW4gYXR0YWNobWVudC4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIHRocm91Z2ggdGhlCisgKiBDb250ZW50UmVzb2x2ZXIge0BsaW5rIENvbnRlbnRSZXNvbHZlciNnZXRTdHJlYW1UeXBlcyhVcmksIFN0cmluZyl9IGFuZAorICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwgU3RyaW5nLCBhbmRyb2lkLm9zLkJ1bmRsZSl9CisgKiBtZXRob2RzLiAgVGhlc2UgYWxsb3cgYSBjbGllbnQgdG8gZGlzY292ZXIgdGhlIHR5cGUocykgb2YgZGF0YSB0aGF0IGEgcGFydGljdWxhcgorICogY29udGVudCBVUkkgY2FuIG1ha2UgYXZhaWxhYmxlIGFzIGEgc3RyZWFtIGFuZCByZXRyaWV2ZSB0aGUgc3RyZWFtIG9mIGRhdGEuCisgKgorICogPHA+Rm9yIGV4YW1wbGUsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSXRlbSNjb2VyY2VUb1RleHQgSXRlbS5jb2VyY2VUb1RleHR9CisgKiBpdHNlbGYgdXNlcyB0aGlzIHRvIHRyeSB0byByZXRyaWV2ZSBhIFVSSSBjbGlwIGFzIGEgc3RyZWFtIG9mIHRleHQ6CisgKgorICoge0BzYW1wbGUgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YSBjb2VyY2VUb1RleHR9CisgKgorICogPGEgbmFtZT0iSW1wbGVtZW50aW5nQ29weSI+PC9hPgorICogPGgzPkltcGxlbWVudGluZyBDb3B5IG9yIERyYWc8L2gzPgorICoKKyAqIDxwPlRvIGJlIHRoZSBzb3VyY2Ugb2YgYSBjbGlwLCB0aGUgYXBwbGljYXRpb24gbXVzdCBjb25zdHJ1Y3QgYSBDbGlwcGVkRGF0YQorICogb2JqZWN0IHRoYXQgYW55IHJlY2lwaWVudCBjYW4gaW50ZXJwcmV0IGJlc3QgZm9yIHRoZWlyIGNvbnRleHQuICBJZiB0aGUgY2xpcAorICogaXMgdG8gY29udGFpbiBhIHNpbXBsZSB0ZXh0LCBJbnRlbnQsIG9yIFVSSSwgdGhpcyBpcyBlYXN5OiBhbiB7QGxpbmsgSXRlbX0KKyAqIGNvbnRhaW5pbmcgdGhlIGFwcHJvcHJpYXRlIGRhdGEgdHlwZSBjYW4gYmUgY29uc3RydWN0ZWQgYW5kIHVzZWQuCisgKgorICogPHA+TW9yZSBjb21wbGljYXRlZCBkYXRhIHR5cGVzIHJlcXVpcmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIHN1cHBvcnQgaW4KKyAqIGEgQ29udGVudFByb3ZpZGVyIGZvciBkZXNjcmliaW5nIGFuZCBnZW5lcmF0aW5nIHRoZSBkYXRhIGZvciB0aGUgcmVjaXBpZW50LgorICogQSBjb21tb24gc2NlbmFyaW8gaXMgb25lIHdoZXJlIGFuIGFwcGxpY2F0aW9uIHBsYWNlcyBvbiB0aGUgY2xpcGJvYXJkIHRoZQorICogY29udGVudDogVVJJIG9mIGFuIG9iamVjdCB0aGF0IHRoZSB1c2VyIGhhcyBjb3BpZWQsIHdpdGggdGhlIGRhdGEgYXQgdGhhdAorICogVVJJIGNvbnNpc3Rpbmcgb2YgYSBjb21wbGljYXRlZCBzdHJ1Y3R1cmUgdGhhdCBvbmx5IG90aGVyIGFwcGxpY2F0aW9ucyB3aXRoCisgKiBkaXJlY3Qga25vd2xlZGdlIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIHVzZS4KKyAqCisgKiA8cD5Gb3IgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IGhhdmUgaW50cmluc2ljIGtub3dsZWRnZSBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUsCisgKiB0aGUgY29udGVudCBwcm92aWRlciBob2xkaW5nIGl0IGNhbiBtYWtlIHRoZSBkYXRhIGF2YWlsYWJsZSBhcyBhbiBhcmJpdHJhcnkKKyAqIG51bWJlciBvZiB0eXBlcyBvZiBkYXRhIHN0cmVhbXMuICBUaGlzIGlzIGRvbmUgYnkgaW1wbGVtZW50aW5nIHRoZQorICogQ29udGVudFByb3ZpZGVyIHtAbGluayBDb250ZW50UHJvdmlkZXIjZ2V0U3RyZWFtVHlwZXMoVXJpLCBTdHJpbmcpfSBhbmQKKyAqIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblR5cGVkQXNzZXRGaWxlKFVyaSwgU3RyaW5nLCBhbmRyb2lkLm9zLkJ1bmRsZSl9CisgKiBtZXRob2RzLgorICoKKyAqIDxwPkdvaW5nIGJhY2sgdG8gb3VyIHNpbXBsZSBOb3RlUGFkIGFwcGxpY2F0aW9uLCB0aGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbgorICogaXQgbWF5IGhhdmUgdG8gY29udmVydCBhIHNpbmdsZSBub3RlIFVSSSAoY29uc2lzdGluZyBvZiBhIHRpdGxlIGFuZCB0aGUgbm90ZQorICogdGV4dCkgaW50byBhIHN0cmVhbSBvZiBwbGFpbiB0ZXh0IGRhdGEuCisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZFByb3ZpZGVyLmphdmEKKyAqICAgICAgc3RyZWFtfQorICoKKyAqIDxwPlRoZSBjb3B5IG9wZXJhdGlvbiBpbiBvdXIgTm90ZVBhZCBhcHBsaWNhdGlvbiBpcyBub3cganVzdCBhIHNpbXBsZSBtYXR0ZXIKKyAqIG9mIG1ha2luZyBhIGNsaXAgY29udGFpbmluZyB0aGUgVVJJIG9mIHRoZSBub3RlIGJlaW5nIGNvcGllZDoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpc3QuamF2YQorICogICAgICBjb3B5fQorICoKKyAqIDxwPk5vdGUgaWYgYSBwYXN0ZSBvcGVyYXRpb24gbmVlZHMgdGhpcyBjbGlwIGFzIHRleHQgKGZvciBleGFtcGxlIHRvIHBhc3RlCisgKiBpbnRvIGFuIGVkaXRvciksIHRoZW4ge0BsaW5rIEl0ZW0jY29lcmNlVG9UZXh0KENvbnRleHQpfSB3aWxsIGFzayB0aGUgY29udGVudAorICogcHJvdmlkZXIgZm9yIHRoZSBjbGlwIFVSSSBhcyB0ZXh0IGFuZCBzdWNjZXNzZnVsbHkgcGFzdGUgdGhlIGVudGlyZSBub3RlLgorICovCitwdWJsaWMgY2xhc3MgQ2xpcERhdGEgZXh0ZW5kcyBDbGlwRGVzY3JpcHRpb24geworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNSU1FVFlQRVNfVEVYVF9QTEFJTiA9IG5ldyBTdHJpbmdbXSB7IE1JTUVUWVBFX1RFWFRfUExBSU4gfTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUlNRVRZUEVTX1RFWFRfVVJJTElTVCA9IG5ldyBTdHJpbmdbXSB7IE1JTUVUWVBFX1RFWFRfVVJJTElTVCB9OworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNSU1FVFlQRVNfVEVYVF9JTlRFTlQgPSBuZXcgU3RyaW5nW10geyBNSU1FVFlQRV9URVhUX0lOVEVOVCB9OworCisgICAgZmluYWwgQml0bWFwIG1JY29uOworCisgICAgZmluYWwgQXJyYXlMaXN0PEl0ZW0+IG1JdGVtcyA9IG5ldyBBcnJheUxpc3Q8SXRlbT4oKTsKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGl0ZW0gaW4gYSBDbGlwcGVkRGF0YS4KKyAgICAgKgorICAgICAqIDxwPlRoZSB0eXBlcyB0aGFuIGFuIGluZGl2aWR1YWwgaXRlbSBjYW4gY3VycmVudGx5IGNvbnRhaW4gYXJlOjwvcD4KKyAgICAgKgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IFRleHQ6IGEgYmFzaWMgc3RyaW5nIG9mIHRleHQuICBUaGlzIGlzIGFjdHVhbGx5IGEgQ2hhclNlcXVlbmNlLAorICAgICAqIHNvIGl0IGNhbiBiZSBmb3JtYXR0ZWQgdGV4dCBzdXBwb3J0ZWQgYnkgY29ycmVzcG9uZGluZyBBbmRyb2lkIGJ1aWx0LWluCisgICAgICogc3R5bGUgc3BhbnMuICAoQ3VzdG9tIGFwcGxpY2F0aW9uIHNwYW5zIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlCisgICAgICogc3RyaXBwZWQgd2hlbiB0cmFuc3BvcnRpbmcgdGhyb3VnaCB0aGUgY2xpcGJvYXJkLikKKyAgICAgKiA8bGk+IEludGVudDogYW4gYXJiaXRyYXJ5IEludGVudCBvYmplY3QuICBBIHR5cGljYWwgdXNlIGlzIHRoZSBzaG9ydGN1dAorICAgICAqIHRvIGNyZWF0ZSB3aGVuIHBhc3RpbmcgYSBjbGlwcGVkIGl0ZW0gb24gdG8gdGhlIGhvbWUgc2NyZWVuLgorICAgICAqIDxsaT4gVXJpOiBhIFVSSSByZWZlcmVuY2UuICBUaGlzIG1heSBiZSBhbnkgVVJJIChzdWNoIGFzIGFuIGh0dHA6IFVSSQorICAgICAqIHJlcHJlc2VudGluZyBhIGJvb2ttYXJrKSwgaG93ZXZlciBpdCBpcyBvZnRlbiBhIGNvbnRlbnQ6IFVSSS4gIFVzaW5nCisgICAgICogY29udGVudCBwcm92aWRlciByZWZlcmVuY2VzIGFzIGNsaXBzIGxpa2UgdGhpcyBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8KKyAgICAgKiBzaGFyZSBjb21wbGV4IG9yIGxhcmdlIGNsaXBzIHRocm91Z2ggdGhlIHN0YW5kYXJkIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBmYWNpbGl0aWVzLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJdGVtIHsKKyAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIG1UZXh0OworICAgICAgICBmaW5hbCBJbnRlbnQgbUludGVudDsKKyAgICAgICAgZmluYWwgVXJpIG1Vcmk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBJdGVtIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgYmxvY2sgb2YgKHBvc3NpYmx5IHN0eWxlZCkgdGV4dC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgICAgICBtSW50ZW50ID0gbnVsbDsKKyAgICAgICAgICAgIG1VcmkgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBJdGVtIGNvbnNpc3Rpbmcgb2YgYW4gYXJiaXRyYXJ5IEludGVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtVXJpID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gSXRlbSBjb25zaXN0aW5nIG9mIGFuIGFyYml0cmFyeSBVUkkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlbShVcmkgdXJpKSB7CisgICAgICAgICAgICBtVGV4dCA9IG51bGw7CisgICAgICAgICAgICBtSW50ZW50ID0gbnVsbDsKKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgY29tcGxleCBJdGVtLCBjb250YWluaW5nIG11bHRpcGxlIHJlcHJlc2VudGF0aW9ucyBvZgorICAgICAgICAgKiB0ZXh0LCBpbnRlbnQsIGFuZC9vciBVUkkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlbShDaGFyU2VxdWVuY2UgdGV4dCwgSW50ZW50IGludGVudCwgVXJpIHVyaSkgeworICAgICAgICAgICAgbVRleHQgPSB0ZXh0OworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIHJhdyB0ZXh0IGNvbnRhaW5lZCBpbiB0aGlzIEl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIHJhdyBJbnRlbnQgY29udGFpbmVkIGluIHRoaXMgSXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnRlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIHJhdyBVUkkgY29udGFpbmVkIGluIHRoaXMgSXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBVcmkgZ2V0VXJpKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Vcmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVHVybiB0aGlzIGl0ZW0gaW50byB0ZXh0LCByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mIGRhdGEgaXQKKyAgICAgICAgICogYWN0dWFsbHkgY29udGFpbnMuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRoZSBhbGdvcml0aG0gZm9yIGRlY2lkaW5nIHdoYXQgdGV4dCB0byByZXR1cm4gaXM6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPiBJZiB7QGxpbmsgI2dldFRleHR9IGlzIG5vbi1udWxsLCByZXR1cm4gdGhhdC4KKyAgICAgICAgICogPGxpPiBJZiB7QGxpbmsgI2dldFVyaX0gaXMgbm9uLW51bGwsIHRyeSB0byByZXRyaWV2ZSBpdHMgZGF0YQorICAgICAgICAgKiBhcyBhIHRleHQgc3RyZWFtIGZyb20gaXRzIGNvbnRlbnQgcHJvdmlkZXIuICBJZiB0aGlzIHN1Y2NlZWRzLCBjb3B5CisgICAgICAgICAqIHRoZSB0ZXh0IGludG8gYSBTdHJpbmcgYW5kIHJldHVybiBpdC4gIElmIGl0IGlzIG5vdCBhIGNvbnRlbnQ6IFVSSSBvcgorICAgICAgICAgKiB0aGUgY29udGVudCBwcm92aWRlciBkb2VzIG5vdCBzdXBwbHkgYSB0ZXh0IHJlcHJlc2VudGF0aW9uLCByZXR1cm4KKyAgICAgICAgICogdGhlIHJhdyBVUkkgYXMgYSBzdHJpbmcuCisgICAgICAgICAqIDxsaT4gSWYge0BsaW5rICNnZXRJbnRlbnR9IGlzIG5vbi1udWxsLCBjb252ZXJ0IHRoYXQgdG8gYW4gaW50ZW50OgorICAgICAgICAgKiBVUkkgYW5kIHJldHVybml0LgorICAgICAgICAgKiA8bGk+IE90aGVyd2lzZSwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNhbGxlcidzIENvbnRleHQsIGZyb20gd2hpY2ggaXRzIENvbnRlbnRSZXNvbHZlcgorICAgICAgICAgKiBhbmQgb3RoZXIgdGhpbmdzIGNhbiBiZSByZXRyaWV2ZWQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXRlbSdzIHRleHR1YWwgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAqLworLy9CRUdJTl9JTkNMVURFKGNvZXJjZVRvVGV4dCkKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBjb2VyY2VUb1RleHQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIEl0ZW0gaGFzIGFuIGV4cGxpY2l0IHRleHR1YWwgdmFsdWUsIHNpbXBseSByZXR1cm4gdGhhdC4KKyAgICAgICAgICAgIGlmIChtVGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1UZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGlzIEl0ZW0gaGFzIGEgVVJJIHZhbHVlLCB0cnkgdXNpbmcgdGhhdC4KKyAgICAgICAgICAgIGlmIChtVXJpICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIC8vIEZpcnN0IHNlZSBpZiB0aGUgVVJJIGNhbiBiZSBvcGVuZWQgYXMgYSBwbGFpbiB0ZXh0IHN0cmVhbQorICAgICAgICAgICAgICAgIC8vIChvZiBhbnkgc3ViLXR5cGUpLiAgSWYgc28sIHRoaXMgaXMgdGhlIGJlc3QgdGV4dHVhbAorICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBpdC4KKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBBc2sgZm9yIGEgc3RyZWFtIG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZGVzY3IgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IobVVyaSwgInRleHQvKiIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBkZXNjci5jcmVhdGVJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtLCAiVVRGLTgiKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBHb3QgaXQuLi4gIGNvcHkgdGhlIHN0cmVhbSBpbnRvIGEgbG9jYWwgc3RyaW5nIGFuZCByZXR1cm4gaXQuCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcls4MTkyXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChsZW49cmVhZGVyLnJlYWQoYnVmZmVyKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVuYWJsZSB0byBvcGVuIGNvbnRlbnQgVVJJIGFzIHRleHQuLi4gIG5vdCByZWFsbHkgYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IsIGp1c3Qgc29tZXRoaW5nIHRvIGlnbm9yZS4KKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQuCisgICAgICAgICAgICAgICAgICAgIExvZy53KCJDbGlwcGVkRGF0YSIsICJGYWlsdXJlIGxvYWRpbmcgdGV4dCIsIGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgY291bGRuJ3Qgb3BlbiB0aGUgVVJJIGFzIGEgc3RyZWFtLCB0aGVuIHRoZSBVUkkgaXRzZWxmCisgICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgc2VydmVzIGZhaXJseSB3ZWxsIGFzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICAgICAgICByZXR1cm4gbVVyaS50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaW5hbGx5LCBpZiBhbGwgd2UgaGF2ZSBpcyBhbiBJbnRlbnQsIHRoZW4gd2UgY2FuIGp1c3QgdHVybiB0aGF0CisgICAgICAgICAgICAvLyBpbnRvIHRleHQuICBOb3QgdGhlIG1vc3QgdXNlci1mcmllbmRseSB0aGluZywgYnV0IGl0J3Mgc29tZXRoaW5nLgorICAgICAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtSW50ZW50LnRvVXJpKEludGVudC5VUklfSU5URU5UX1NDSEVNRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNob3VsZG4ndCBnZXQgaGVyZSwgYnV0IGp1c3QgaW4gY2FzZS4uLgorICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisvL0VORF9JTkNMVURFKGNvZXJjZVRvVGV4dCkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY2xpcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBMYWJlbCB0byBzaG93IHRvIHRoZSB1c2VyIGRlc2NyaWJpbmcgdGhpcyBjbGlwLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZXMgQW4gYXJyYXkgb2YgTUlNRSB0eXBlcyB0aGlzIGRhdGEgaXMgYXZhaWxhYmxlIGFzLgorICAgICAqIEBwYXJhbSBpY29uIEJpdG1hcCBwcm92aWRpbmcgdGhlIHVzZXIgd2l0aCBhbiBpY29uaW5nIHJlcHJlc2VudGF0aW9uIG9mCisgICAgICogdGhlIGNsaXAuCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBjbGlwLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwRGF0YShDaGFyU2VxdWVuY2UgbGFiZWwsIFN0cmluZ1tdIG1pbWVUeXBlcywgQml0bWFwIGljb24sIEl0ZW0gaXRlbSkgeworICAgICAgICBzdXBlcihsYWJlbCwgbWltZVR5cGVzKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpdGVtIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtSWNvbiA9IGljb247CisgICAgICAgIG1JdGVtcy5hZGQoaXRlbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IENsaXBEYXRhIGhvbGRpbmcgZGF0YSBvZiB0aGUgdHlwZSB7QGxpbmsgI01JTUVUWVBFX1RFWFRfUExBSU59LgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIFVzZXItdmlzaWJsZSBsYWJlbCBmb3IgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaWNvbiBJY29uaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgYWN0dWFsIHRleHQgaW4gdGhlIGNsaXAuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IENsaXBEYXRhIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgQ2xpcERhdGEgbmV3UGxhaW5UZXh0KENoYXJTZXF1ZW5jZSBsYWJlbCwgQml0bWFwIGljb24sIENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIEl0ZW0gaXRlbSA9IG5ldyBJdGVtKHRleHQpOworICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhKGxhYmVsLCBNSU1FVFlQRVNfVEVYVF9QTEFJTiwgaWNvbiwgaXRlbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IENsaXBEYXRhIGhvbGRpbmcgYW4gSW50ZW50IHdpdGggTUlNRSB0eXBlIHtAbGluayAjTUlNRVRZUEVfVEVYVF9JTlRFTlR9LgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIFVzZXItdmlzaWJsZSBsYWJlbCBmb3IgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaWNvbiBJY29uaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IGluIHRoZSBjbGlwLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBDbGlwRGF0YSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIENsaXBEYXRhIG5ld0ludGVudChDaGFyU2VxdWVuY2UgbGFiZWwsIEJpdG1hcCBpY29uLCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIEl0ZW0gaXRlbSA9IG5ldyBJdGVtKGludGVudCk7CisgICAgICAgIHJldHVybiBuZXcgQ2xpcERhdGEobGFiZWwsIE1JTUVUWVBFU19URVhUX0lOVEVOVCwgaWNvbiwgaXRlbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IENsaXBEYXRhIGhvbGRpbmcgYSBVUkkuICBJZiB0aGUgVVJJIGlzIGEgY29udGVudDogVVJJLAorICAgICAqIHRoaXMgd2lsbCBxdWVyeSB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIE1JTUUgdHlwZSBvZiBpdHMgZGF0YSBhbmQKKyAgICAgKiB1c2UgdGhhdCBhcyB0aGUgTUlNRSB0eXBlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgTUlNRSB0eXBlCisgICAgICoge0BsaW5rICNNSU1FVFlQRV9URVhUX1VSSUxJU1R9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc29sdmVyIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVVJJLgorICAgICAqIEBwYXJhbSBsYWJlbCBVc2VyLXZpc2libGUgbGFiZWwgZm9yIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIGljb24gSWNvbmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIGluIHRoZSBjbGlwLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBDbGlwRGF0YSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIENsaXBEYXRhIG5ld1VyaShDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsIENoYXJTZXF1ZW5jZSBsYWJlbCwKKyAgICAgICAgICAgIEJpdG1hcCBpY29uLCBVcmkgdXJpKSB7CisgICAgICAgIEl0ZW0gaXRlbSA9IG5ldyBJdGVtKHVyaSk7CisgICAgICAgIFN0cmluZ1tdIG1pbWVUeXBlcyA9IG51bGw7CisgICAgICAgIGlmICgiY29udGVudCIuZXF1YWxzKHVyaS5nZXRTY2hlbWUoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFsVHlwZSA9IHJlc29sdmVyLmdldFR5cGUodXJpKTsKKyAgICAgICAgICAgIG1pbWVUeXBlcyA9IHJlc29sdmVyLmdldFN0cmVhbVR5cGVzKHVyaSwgIiovKiIpOworICAgICAgICAgICAgaWYgKG1pbWVUeXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWxUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWltZVR5cGVzID0gbmV3IFN0cmluZ1tdIHsgcmVhbFR5cGUsIE1JTUVUWVBFX1RFWFRfVVJJTElTVCB9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gdG1wID0gbmV3IFN0cmluZ1ttaW1lVHlwZXMubGVuZ3RoICsgKHJlYWxUeXBlICE9IG51bGwgPyAyIDogMSldOworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICBpZiAocmVhbFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0bXBbMF0gPSByZWFsVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1pbWVUeXBlcywgMCwgdG1wLCBpLCBtaW1lVHlwZXMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB0bXBbaSArIG1pbWVUeXBlcy5sZW5ndGhdID0gTUlNRVRZUEVfVEVYVF9VUklMSVNUOworICAgICAgICAgICAgICAgIG1pbWVUeXBlcyA9IHRtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWltZVR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1pbWVUeXBlcyA9IE1JTUVUWVBFU19URVhUX1VSSUxJU1Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YShsYWJlbCwgbWltZVR5cGVzLCBpY29uLCBpdGVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ2xpcERhdGEgaG9sZGluZyBhbiBVUkkgd2l0aCBNSU1FIHR5cGUge0BsaW5rICNNSU1FVFlQRV9URVhUX1VSSUxJU1R9LgorICAgICAqIFVubGlrZSB7QGxpbmsgI25ld1VyaShDb250ZW50UmVzb2x2ZXIsIENoYXJTZXF1ZW5jZSwgQml0bWFwLCBVcmkpfSwgbm90aGluZworICAgICAqIGlzIGluZmVycmVkIGFib3V0IHRoZSBVUkkgLS0gaWYgaXQgaXMgYSBjb250ZW50OiBVUkkgaG9sZGluZyBhIGJpdG1hcCwKKyAgICAgKiB0aGUgcmVwb3J0ZWQgdHlwZSB3aWxsIHN0aWxsIGJlIHVyaS1saXN0LiAgVXNlIHRoaXMgd2l0aCBjYXJlIQorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIFVzZXItdmlzaWJsZSBsYWJlbCBmb3IgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaWNvbiBJY29uaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgaW4gdGhlIGNsaXAuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IENsaXBEYXRhIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgQ2xpcERhdGEgbmV3UmF3VXJpKENoYXJTZXF1ZW5jZSBsYWJlbCwgQml0bWFwIGljb24sIFVyaSB1cmkpIHsKKyAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0odXJpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YShsYWJlbCwgTUlNRVRZUEVTX1RFWFRfVVJJTElTVCwgaWNvbiwgaXRlbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSXRlbShJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpdGVtIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtSXRlbXMuYWRkKGl0ZW0pOworICAgIH0KKworICAgIHB1YmxpYyBCaXRtYXAgZ2V0SWNvbigpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlbSBnZXRJdGVtKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLmdldChpbmRleCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgc3VwZXIud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIGlmIChtSWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KDEpOworICAgICAgICAgICAgbUljb24ud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gbUl0ZW1zLnNpemUoKTsKKyAgICAgICAgZGVzdC53cml0ZUludChOKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgSXRlbSBpdGVtID0gbUl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKGl0ZW0ubVRleHQsIGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChpdGVtLm1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICAgICAgaXRlbS5tSW50ZW50LndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0ZW0ubVVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICBpdGVtLm1Vcmkud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDbGlwRGF0YShQYXJjZWwgaW4pIHsKKyAgICAgICAgc3VwZXIoaW4pOworICAgICAgICBpZiAoaW4ucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgIG1JY29uID0gQml0bWFwLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSWNvbiA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE4gPSBpbi5yZWFkSW50KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBpbi5yZWFkSW50KCkgIT0gMCA/IEludGVudC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pIDogbnVsbDsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBpbi5yZWFkSW50KCkgIT0gMCA/IFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pIDogbnVsbDsKKyAgICAgICAgICAgIG1JdGVtcy5hZGQobmV3IEl0ZW0odGV4dCwgaW50ZW50LCB1cmkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBEYXRhPiBDUkVBVE9SID0KKyAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxDbGlwRGF0YT4oKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGlwRGF0YSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhKHNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGlwRGF0YVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWZkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK3BhcmNlbGFibGUgQ2xpcERlc2NyaXB0aW9uOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZDgwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogTWV0YS1kYXRhIGRlc2NyaWJpbmcgdGhlIGNvbnRlbnRzIG9mIGEge0BsaW5rIENsaXBEYXRhfS4gIFByb3ZpZGVzIGVub3VnaAorICogaW5mb3JtYXRpb24gdG8ga25vdyBpZiB5b3UgY2FuIGhhbmRsZSB0aGUgQ2xpcERhdGEsIGJ1dCBub3QgdGhlIGRhdGEKKyAqIGl0c2VsZi4KKyAqLworcHVibGljIGNsYXNzIENsaXBEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIC8qKgorICAgICAqIFRoZSBNSU1FIHR5cGUgZm9yIGEgY2xpcCBob2xkaW5nIHBsYWluIHRleHQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRVRZUEVfVEVYVF9QTEFJTiA9ICJ0ZXh0L3BsYWluIjsKKworICAgIC8qKgorICAgICAqIFRoZSBNSU1FIHR5cGUgZm9yIGEgY2xpcCBob2xkaW5nIG9uZSBvciBtb3JlIFVSSXMuICBUaGlzIHNob3VsZCBiZQorICAgICAqIHVzZWQgZm9yIFVSSXMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB0byBhIHVzZXIgKHN1Y2ggYXMgYW4gaHR0cDogVVJJKS4KKyAgICAgKiBJdCBzaG91bGQgPGVtPm5vdDwvZW0+IGJlIHVzZWQgZm9yIGEgY29udGVudDogVVJJIHRoYXQgcmVmZXJlbmNlcyBzb21lCisgICAgICogb3RoZXIgcGllY2Ugb2YgZGF0YTsgaW4gdGhhdCBjYXNlIHRoZSBNSU1FIHR5cGUgc2hvdWxkIGJlIHRoZSB0eXBlCisgICAgICogb2YgdGhlIHJlZmVyZW5jZWQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FVFlQRV9URVhUX1VSSUxJU1QgPSAidGV4dC91cmktbGlzdCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTUlNRSB0eXBlIGZvciBhIGNsaXAgaG9sZGluZyBhbiBJbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRVRZUEVfVEVYVF9JTlRFTlQgPSAidGV4dC92bmQuYW5kcm9pZC5pbnRlbnQiOworCisgICAgZmluYWwgQ2hhclNlcXVlbmNlIG1MYWJlbDsKKyAgICBmaW5hbCBTdHJpbmdbXSBtTWltZVR5cGVzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNsaXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgTGFiZWwgdG8gc2hvdyB0byB0aGUgdXNlciBkZXNjcmliaW5nIHRoaXMgY2xpcC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVzIEFuIGFycmF5IG9mIE1JTUUgdHlwZXMgdGhpcyBkYXRhIGlzIGF2YWlsYWJsZSBhcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcERlc2NyaXB0aW9uKENoYXJTZXF1ZW5jZSBsYWJlbCwgU3RyaW5nW10gbWltZVR5cGVzKSB7CisgICAgICAgIGlmIChtaW1lVHlwZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJtaW1lVHlwZXMgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1MYWJlbCA9IGxhYmVsOworICAgICAgICBtTWltZVR5cGVzID0gbWltZVR5cGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNvcHkgb2YgYSBDbGlwRGVzY3JpcHRpb24uCisgICAgICovCisgICAgcHVibGljIENsaXBEZXNjcmlwdGlvbihDbGlwRGVzY3JpcHRpb24gbykgeworICAgICAgICBtTGFiZWwgPSBvLm1MYWJlbDsKKyAgICAgICAgbU1pbWVUeXBlcyA9IG8ubU1pbWVUeXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgdG8gY29tcGFyZSB0d28gTUlNRSB0eXBlcywgd2hlcmUgb25lIG1heSBiZSBhIHBhdHRlcm4uCisgICAgICogQHBhcmFtIGNvbmNyZXRlVHlwZSBBIGZ1bGx5LXNwZWNpZmllZCBNSU1FIHR5cGUuCisgICAgICogQHBhcmFtIGRlc2lyZWRUeXBlIEEgZGVzaXJlZCBNSU1FIHR5cGUgdGhhdCBtYXkgYmUgYSBwYXR0ZXJuIHN1Y2ggYXMgKlwvKi4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIE1JTUUgdHlwZXMgbWF0Y2guCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVNaW1lVHlwZXMoU3RyaW5nIGNvbmNyZXRlVHlwZSwgU3RyaW5nIGRlc2lyZWRUeXBlKSB7CisgICAgICAgIGZpbmFsIGludCB0eXBlTGVuZ3RoID0gZGVzaXJlZFR5cGUubGVuZ3RoKCk7CisgICAgICAgIGlmICh0eXBlTGVuZ3RoID09IDMgJiYgZGVzaXJlZFR5cGUuZXF1YWxzKCIqLyoiKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgc2xhc2hwb3MgPSBkZXNpcmVkVHlwZS5pbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChzbGFzaHBvcyA+IDApIHsKKyAgICAgICAgICAgIGlmICh0eXBlTGVuZ3RoID09IHNsYXNocG9zKzIgJiYgZGVzaXJlZFR5cGUuY2hhckF0KHNsYXNocG9zKzEpID09ICcqJykgeworICAgICAgICAgICAgICAgIGlmIChkZXNpcmVkVHlwZS5yZWdpb25NYXRjaGVzKDAsIGNvbmNyZXRlVHlwZSwgMCwgc2xhc2hwb3MrMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNpcmVkVHlwZS5lcXVhbHMoY29uY3JldGVUeXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFiZWwgZm9yIHRoaXMgY2xpcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldExhYmVsKCkgeworICAgICAgICByZXR1cm4gbUxhYmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGNsaXAgZGVzY3JpcHRpb24gY29udGFpbnMgdGhlIGdpdmVuIE1JTUUgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgZGVzaXJlZCBNSU1FIHR5cGUuICBNYXkgYmUgYSBwYXR0ZXJuLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIG9uZSBvZiB0aGUgTUlNRSB0eXBlcyBpbiB0aGUgY2xpcCBkZXNjcmlwdGlvbgorICAgICAqIG1hdGNoZXMgdGhlIGRlc2lyZWQgTUlNRSB0eXBlLCBlbHNlIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBmb3IgKGludCBpPTA7IGk8bU1pbWVUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbXBhcmVNaW1lVHlwZXMobU1pbWVUeXBlc1tpXSwgbWltZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciB0aGUgY2xpcCBkZXNjcmlwdGlvbiBNSU1FIHR5cGVzIGJ5IHRoZSBnaXZlbiBNSU1FIHR5cGUuICBSZXR1cm5zCisgICAgICogYWxsIE1JTUUgdHlwZXMgaW4gdGhlIGNsaXAgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gTUlNRSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIE1JTUUgdHlwZS4gIE1heSBiZSBhIHBhdHRlcm4uCisgICAgICogQHJldHVybiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBtYXRjaGluZyBNSU1FIHR5cGVzLiAgSWYgdGhlcmUgYXJlIG5vCisgICAgICogbWF0Y2hpbmcgTUlNRSB0eXBlcywgbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmlsdGVyTWltZVR5cGVzKFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhcnJheSA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWltZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29tcGFyZU1pbWVUeXBlcyhtTWltZVR5cGVzW2ldLCBtaW1lVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhcnJheSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcnJheS5hZGQobU1pbWVUeXBlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHJhd0FycmF5ID0gbmV3IFN0cmluZ1thcnJheS5zaXplKCldOworICAgICAgICBhcnJheS50b0FycmF5KHJhd0FycmF5KTsKKyAgICAgICAgcmV0dXJuIHJhd0FycmF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIE1JTUUgdHlwZXMgdGhlIGNsaXAgaXMgYXZhaWxhYmxlIGluLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWltZVR5cGVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW1lVHlwZXMubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBvbmUgb2YgdGhlIHBvc3NpYmxlIGNsaXAgTUlNRSB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbU1pbWVUeXBlc1tpbmRleF07CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgIGlmIChtTWltZVR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCBtaW1lIHR5cGVzIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1NaW1lVHlwZXMubGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm11c3QgaGF2ZSBhdCBsZWFzdCAxIG1pbWUgdHlwZSIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWltZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU1pbWVUeXBlc1tpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJtaW1lIHR5cGUgYXQgIiArIGkgKyAiIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1MYWJlbCwgZGVzdCwgZmxhZ3MpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nQXJyYXkobU1pbWVUeXBlcyk7CisgICAgfQorCisgICAgQ2xpcERlc2NyaXB0aW9uKFBhcmNlbCBpbikgeworICAgICAgICBtTGFiZWwgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICBtTWltZVR5cGVzID0gaW4uY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxDbGlwRGVzY3JpcHRpb24+IENSRUFUT1IgPQorICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBEZXNjcmlwdGlvbj4oKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgc291cmNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGVzY3JpcHRpb24oc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIENsaXBEZXNjcmlwdGlvbltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGVzY3JpcHRpb25bc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBib2FyZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTY3NjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBib2FyZE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIHRoZSBjbGlwYm9hcmQgc2VydmljZSwgZm9yIHBsYWNpbmcgYW5kIHJldHJpZXZpbmcgdGV4dCBpbgorICogdGhlIGdsb2JhbCBjbGlwYm9hcmQuCisgKgorICogPHA+CisgKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlfS4KKyAqCisgKiA8cD4KKyAqIFRoZSBDbGlwYm9hcmRNYW5hZ2VyIEFQSSBpdHNlbGYgaXMgdmVyeSBzaW1wbGU6IGl0IGNvbnNpc3RzIG9mIG1ldGhvZHMKKyAqIHRvIGF0b21pY2FsbHkgZ2V0IGFuZCBzZXQgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwYm9hcmQgZGF0YS4gIFRoYXQgZGF0YQorICogaXMgZXhwcmVzc2VkIGFzIGEge0BsaW5rIENsaXBEYXRhfSBvYmplY3QsIHdoaWNoIGRlZmluZXMgdGhlIHByb3RvY29sCisgKiBmb3IgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UKKyAqLworcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXIgZXh0ZW5kcyBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IHNTdGF0aWNMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIElDbGlwYm9hcmQgc1NlcnZpY2U7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyPiBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzCisgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuU3R1YigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKSB7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19SRVBPUlRfUFJJTUFSWV9DTElQX0NIQU5HRUQpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFUE9SVF9QUklNQVJZX0NMSVBfQ0hBTkdFRCA9IDE7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19SRVBPUlRfUFJJTUFSWV9DTElQX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB7CisgICAgICAgIHZvaWQgb25QcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBJQ2xpcGJvYXJkIGdldFNlcnZpY2UoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1N0YXRpY0xvY2spIHsKKyAgICAgICAgICAgIGlmIChzU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNTZXJ2aWNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIik7CisgICAgICAgICAgICBzU2VydmljZSA9IElDbGlwYm9hcmQuU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgICAgIHJldHVybiBzU2VydmljZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiB7QGhpZGV9ICovCisgICAgcHVibGljIENsaXBib2FyZE1hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwIG9uIHRoZSBjbGlwYm9hcmQuICBUaGlzIGlzIHRoZSBjbGlwIHRoYXQKKyAgICAgKiBpcyBpbnZvbHZlZCBpbiBub3JtYWwgY3V0IGFuZCBwYXN0ZSBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaXAgVGhlIGNsaXBwZWQgZGF0YSBpdGVtIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5Q2xpcChDbGlwRGF0YSBjbGlwKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRTZXJ2aWNlKCkuc2V0UHJpbWFyeUNsaXAoY2xpcCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwRGF0YSBnZXRQcmltYXJ5Q2xpcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0UHJpbWFyeUNsaXAobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBwcmltYXJ5IGNsaXAgb24gdGhlIGNsaXBib2FyZAorICAgICAqIGJ1dCBub3QgYSBjb3B5IG9mIGl0cyBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgY3VycmVudGx5IGEgcHJpbWFyeSBjbGlwIG9uIHRoZSBjbGlwYm9hcmQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmhhc1ByaW1hcnlDbGlwKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIHdoYXQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpZiAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZpY2UoKS5hZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeUNsaXBDaGFuZ2VkU2VydmljZUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuYWRkKHdoYXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB3aGF0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycykgeworICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUod2hhdCk7CisgICAgICAgICAgICBpZiAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZpY2UoKS5yZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeUNsaXBDaGFuZ2VkU2VydmljZUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFByaW1hcnlDbGlwKCl9IGluc3RlYWQuICBUaGlzIHJldHJpZXZlcworICAgICAqIHRoZSBwcmltYXJ5IGNsaXAgYW5kIHRyaWVzIHRvIGNvZXJjZSBpdCB0byBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoKSB7CisgICAgICAgIENsaXBEYXRhIGNsaXAgPSBnZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICBpZiAoY2xpcCAhPSBudWxsICYmIGNsaXAuZ2V0SXRlbUNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gY2xpcC5nZXRJdGVtKDApLmNvZXJjZVRvVGV4dChtQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEpfSBpbnN0ZWFkLiAgVGhpcworICAgICAqIGNyZWF0ZXMgYSBDbGlwcGVkSXRlbSBob2xkaW5nIHRoZSBnaXZlbiB0ZXh0IGFuZCBzZXRzIGl0IGFzIHRoZQorICAgICAqIHByaW1hcnkgY2xpcC4gIEl0IGhhcyBubyBsYWJlbCBvciBpY29uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3UGxhaW5UZXh0KG51bGwsIG51bGwsIHRleHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNoYXNQcmltYXJ5Q2xpcCgpfSBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmhhc1ByaW1hcnlDbGlwKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlcG9ydFByaW1hcnlDbGlwQ2hhbmdlZCgpIHsKKyAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJzOworCisgICAgICAgIHN5bmNocm9uaXplZCAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycykgeworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOIDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0ZW5lcnMgPSBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICgoT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcilsaXN0ZW5lcnNbaV0pLm9uUHJpbWFyeUNsaXBDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YQppbmRleCAxZDZlOGI4Li42YmIzMmMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTI4LDEzICsyOCwxNiBAQAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgpAQCAtNzYsNiArNzksOCBAQAogICogY3Jvc3MtcHJvY2VzcyBjYWxscy48L3A+CiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBDb21wb25lbnRDYWxsYmFja3MgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ29udGVudFByb3ZpZGVyIjsKKwogICAgIC8qCiAgICAgICogTm90ZTogaWYgeW91IGFkZCBtZXRob2RzIHRvIENvbnRlbnRQcm92aWRlciwgeW91IG11c3QgYWRkIHNpbWlsYXIgbWV0aG9kcyB0bwogICAgICAqICAgICAgIE1vY2tDb250ZW50UHJvdmlkZXIuCkBAIC0yNDksNiArMjU0LDE4IEBACiAgICAgICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyLnRoaXMuY2FsbChtZXRob2QsIHJlcXVlc3QsIGFyZ3MpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDb250ZW50UHJvdmlkZXIudGhpcy5nZXRTdHJlYW1UeXBlcyh1cmksIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVuZm9yY2VSZWFkUGVybWlzc2lvbih1cmkpOworICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlci50aGlzLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmksIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlUmVhZFBlcm1pc3Npb24oVXJpIHVyaSkgewogICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgICAgICBpZiAodWlkID09IG1NeVVpZCkgewpAQCAtNzU2LDYgKzc3MywxNDQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlcyBvZiBkYXRhIHN0cmVhbXMgdGhhdCB0aGlzCisgICAgICogY29udGVudCBwcm92aWRlciBzdXBwb3J0cyBmb3IgdGhlIGdpdmVuIFVSSS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogcmV0dXJucyBudWxsLCBtZWFuaW5nIG5vIHR5cGVzLiAgSWYgeW91ciBjb250ZW50IHByb3ZpZGVyIHN0b3JlcyBkYXRhCisgICAgICogb2YgYSBwYXJ0aWN1bGFyIHR5cGUsIHJldHVybiB0aGF0IE1JTUUgdHlwZSBpZiBpdCBtYXRjaGVzIHRoZSBnaXZlbgorICAgICAqIG1pbWVUeXBlRmlsdGVyLiAgSWYgaXQgY2FuIHBlcmZvcm0gdHlwZSBjb252ZXJzaW9ucywgcmV0dXJuIGFuIGFycmF5CisgICAgICogb2YgYWxsIHN1cHBvcnRlZCBNSU1FIHR5cGVzIHRoYXQgbWF0Y2ggbWltZVR5cGVGaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBkYXRhIGluIHRoZSBjb250ZW50IHByb3ZpZGVyIGJlaW5nIHF1ZXJpZWQuCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSB0eXBlIG9mIGRhdGEgdGhlIGNsaWVudCBkZXNpcmVzLiAgTWF5IGJlCisgICAgICogYSBwYXR0ZXJuLCBzdWNoIGFzICpcLyogdG8gcmV0cmlldmUgYWxsIHBvc3NpYmxlIGRhdGEgdHlwZXMuCisgICAgICogQHJldHVybiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vIHBvc3NpYmxlIGRhdGEgc3RyZWFtcyBmb3IgdGhlCisgICAgICogZ2l2ZW4gbWltZVR5cGVGaWx0ZXIuICBPdGhlcndpc2UgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgYXZhaWxhYmxlCisgICAgICogY29uY3JldGUgTUlNRSB0eXBlcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFR5cGUoVXJpKQorICAgICAqIEBzZWUgI29wZW5UeXBlZEFzc2V0RmlsZShVcmksIFN0cmluZywgQnVuZGxlKQorICAgICAqIEBzZWUgQ2xpcERlc2NyaXB0aW9uI2NvbXBhcmVNaW1lVHlwZXMoU3RyaW5nLCBTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBjbGllbnQgdG8gb3BlbiBhIHJlYWQtb25seSBzdHJlYW0gY29udGFpbmluZyBkYXRhIG9mIGEKKyAgICAgKiBwYXJ0aWN1bGFyIE1JTUUgdHlwZS4gIFRoaXMgaXMgbGlrZSB7QGxpbmsgI29wZW5Bc3NldEZpbGUoVXJpLCBTdHJpbmcpfSwKKyAgICAgKiBleGNlcHQgdGhlIGZpbGUgY2FuIG9ubHkgYmUgcmVhZC1vbmx5IGFuZCB0aGUgY29udGVudCBwcm92aWRlciBtYXkKKyAgICAgKiBwZXJmb3JtIGRhdGEgY29udmVyc2lvbnMgdG8gZ2VuZXJhdGUgZGF0YSBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAqCisgICAgICogPHA+VGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY29tcGFyZXMgdGhlIGdpdmVuIG1pbWVUeXBlIGFnYWluc3QgdGhlCisgICAgICogcmVzdWx0IG9mIHtAbGluayAjZ2V0VHlwZShVcmkpfSBhbmQsIGlmIHRoZSBtYXRjaCwgc2ltcGxlIGNhbGxzCisgICAgICoge0BsaW5rICNvcGVuQXNzZXRGaWxlKFVyaSwgU3RyaW5nKX0uCisgICAgICoKKyAgICAgKiA8cD5TZWUge0BsaW5rIENsaXBEYXRhfSBmb3IgZXhhbXBsZXMgb2YgdGhlIHVzZSBhbmQgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGRhdGEgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmVpbmcgcXVlcmllZC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVGaWx0ZXIgVGhlIHR5cGUgb2YgZGF0YSB0aGUgY2xpZW50IGRlc2lyZXMuICBNYXkgYmUKKyAgICAgKiBhIHBhdHRlcm4sIHN1Y2ggYXMgKlwvKiwgaWYgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIHNwZWNpZmljIHR5cGUKKyAgICAgKiByZXF1aXJlbWVudHM7IGluIHRoaXMgY2FzZSB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIHBpY2sgaXRzIGJlc3QKKyAgICAgKiB0eXBlIG1hdGNoaW5nIHRoZSBwYXR0ZXJuLgorICAgICAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgb3B0aW9ucyBmcm9tIHRoZSBjbGllbnQuICBUaGUgZGVmaW5pdGlvbnMgb2YKKyAgICAgKiB0aGVzZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmVpbmcgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IgZnJvbSB3aGljaCB0aGUgY2xpZW50IGNhbgorICAgICAqIHJlYWQgZGF0YSBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAqCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gVGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcworICAgICAqIG5vIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkkgb3IgdGhlIG1vZGUgaXMgaW52YWxpZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIFRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgZGF0YS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZQorICAgICAqIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIE1JTUUgdHlwZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFN0cmVhbVR5cGVzKFVyaSwgU3RyaW5nKQorICAgICAqIEBzZWUgI29wZW5Bc3NldEZpbGUoVXJpLCBTdHJpbmcpCisgICAgICogQHNlZSBDbGlwRGVzY3JpcHRpb24jY29tcGFyZU1pbWVUeXBlcyhTdHJpbmcsIFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpZiAoIiovKiIuZXF1YWxzKG1pbWVUeXBlRmlsdGVyKSkgeworICAgICAgICAgICAgLy8gSWYgdGhleSBjYW4gdGFrZSBhbnl0aGluZywgdGhlIHVudHlwZWQgb3BlbiBjYWxsIGlzIGdvb2QgZW5vdWdoLgorICAgICAgICAgICAgcmV0dXJuIG9wZW5Bc3NldEZpbGUodXJpLCAiciIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGdldFR5cGUodXJpKTsKKyAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgQ2xpcERlc2NyaXB0aW9uLmNvbXBhcmVNaW1lVHlwZXMoYmFzZVR5cGUsIG1pbWVUeXBlRmlsdGVyKSkgeworICAgICAgICAgICAgLy8gVXNlIG9sZCB1bnR5cGVkIG9wZW4gY2FsbCBpZiB0aGlzIHByb3ZpZGVyIGhhcyBhIHR5cGUgZm9yIHRoaXMKKyAgICAgICAgICAgIC8vIFVSSSBhbmQgaXQgbWF0Y2hlcyB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAgIHJldHVybiBvcGVuQXNzZXRGaWxlKHVyaSwgInIiKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBvcGVuICIgKyB1cmkgKyAiIGFzIHR5cGUgIiArIG1pbWVUeXBlRmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gd3JpdGUgYSBzdHJlYW0gb2YgZGF0YSB0byBhIHBpcGUuICBVc2Ugd2l0aAorICAgICAqIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblBpcGVIZWxwZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgUGlwZURhdGFXcml0ZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIGZyb20gYSBiYWNrZ3JvdW5kIHRocmVhZCB0byBzdHJlYW0gZGF0YSBvdXQgdG8gYSBwaXBlLgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIHBpcGUgaXMgYmxvY2tpbmcsIHNvIHRoaXMgdGhyZWFkIGNhbiBibG9jayBvbgorICAgICAgICAgKiB3cml0ZXMgZm9yIGFuIGFyYml0cmFyeSBhbW91bnQgb2YgdGltZSBpZiB0aGUgY2xpZW50IGlzIHNsb3cKKyAgICAgICAgICogYXQgcmVhZGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG91dHB1dCBUaGUgcGlwZSB3aGVyZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuLiAgVGhpcyB3aWxsIGJlCisgICAgICAgICAqIGNsb3NlZCBmb3IgeW91IHVwb24gcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHdob3NlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIHR5cGUgb2YgZGF0YSB0byBiZSB3cml0dGVuLgorICAgICAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIHN1cHBsaWVkIGJ5IGNhbGxlci4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgWW91ciBvd24gY3VzdG9tIGFyZ3VtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YVRvUGlwZShQYXJjZWxGaWxlRGVzY3JpcHRvciBvdXRwdXQsIFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICBCdW5kbGUgb3B0cywgVCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtAbGluayAjb3BlblR5cGVkQXNzZXRGaWxlfSwgZm9yCisgICAgICogY3JlYXRpbmcgYSBkYXRhIHBpcGUgYW5kIGJhY2tncm91bmQgdGhyZWFkIGFsbG93aW5nIHlvdSB0byBzdHJlYW0KKyAgICAgKiBnZW5lcmF0ZWQgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZXcKKyAgICAgKiBQYXJjZWxGaWxlRGVzY3JpcHRvciB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyICh0aGUgY2FsbGVyCisgICAgICogaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQpLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHdob3NlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgdHlwZSBvZiBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBzdXBwbGllZCBieSBjYWxsZXIuCisgICAgICogQHBhcmFtIGFyZ3MgWW91ciBvd24gY3VzdG9tIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gZnVuYyBJbnRlcmZhY2UgaW1wbGVtZW50aW5nIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYWN0dWFsbHkKKyAgICAgKiBzdHJlYW0gdGhlIGRhdGEuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yIGhvbGRpbmcgdGhlIHJlYWQgc2lkZSBvZgorICAgICAqIHRoZSBwaXBlLiAgVGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBmb3IgcmVhZGluZzsgdGhlIGNhbGxlcgorICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIGl0IHdoZW4gZG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5QaXBlSGVscGVyKGZpbmFsIFVyaSB1cmksIGZpbmFsIFN0cmluZyBtaW1lVHlwZSwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBvcHRzLCBmaW5hbCBUIGFyZ3MsIGZpbmFsIFBpcGVEYXRhV3JpdGVyPFQ+IGZ1bmMpCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yW10gZmRzID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuY3JlYXRlUGlwZSgpOworCisgICAgICAgICAgICBBc3luY1Rhc2s8T2JqZWN0LCBPYmplY3QsIE9iamVjdD4gdGFzayA9IG5ldyBBc3luY1Rhc2s8T2JqZWN0LCBPYmplY3QsIE9iamVjdD4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBkb0luQmFja2dyb3VuZChPYmplY3QuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmMud3JpdGVEYXRhVG9QaXBlKGZkc1sxXSwgdXJpLCBtaW1lVHlwZSwgb3B0cywgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZHNbMV0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbHVyZSBjbG9zaW5nIHBpcGUiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGFzay5leGVjdXRlKChPYmplY3RbXSludWxsKTsKKworICAgICAgICAgICAgcmV0dXJuIGZkc1swXTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiZmFpbHVyZSBtYWtpbmcgcGlwZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdGFuY2UgaXMgYSB0ZW1wb3JhcnkgY29udGVudCBwcm92aWRlci4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBpcyBhIHRlbXBvcmFyeSBjb250ZW50IHByb3ZpZGVyCiAgICAgICovCkBAIC03ODEsNiArOTM2LDExIEBACiAgICAgICogQHBhcmFtIGluZm8gUmVnaXN0ZXJlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQgcHJvdmlkZXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhdHRhY2hJbmZvKENvbnRleHQgY29udGV4dCwgUHJvdmlkZXJJbmZvIGluZm8pIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgbWF5IGJlIHVzaW5nIEFzeW5jVGFzayBmcm9tIGJpbmRlciB0aHJlYWRzLiAgTWFrZSBpdCBpbml0IGhlcmUKKyAgICAgICAgICogc28gaXRzIHN0YXRpYyBoYW5kbGVyIGlzIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgICovCisgICAgICAgIEFzeW5jVGFzay5pbml0KCk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogT25seSBhbGxvdyBpdCB0byBiZSBzZXQgb25jZSwgc28gYWZ0ZXIgdGhlIGNvbnRlbnQgc2VydmljZSBnaXZlcwpAQCAtODI5LDcgKzk4OSw3IEBACiAgICAgLyoqCiAgICAgICogQGhpZGUgLS0gdW50aWwgaW50ZXJmYWNlIGhhcyBwcm92ZW4gaXRzZWxmCiAgICAgICoKLSAgICAgKiBDYWxsIGFuIHByb3ZpZGVyLWRlZmluZWQgbWV0aG9kLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKKyAgICAgKiBDYWxsIGEgcHJvdmlkZXItZGVmaW5lZCBtZXRob2QuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudAogICAgICAqIGludGVyZmFjZXMgdGhhdCBhcmUgY2hlYXBlciB0aGFuIHVzaW5nIGEgQ3Vyc29yLgogICAgICAqCiAgICAgICogQHBhcmFtIG1ldGhvZCBNZXRob2QgbmFtZSB0byBjYWxsLiAgT3BhcXVlIHRvIGZyYW1ld29yay4KQEAgLTgzOSw0ICs5OTksMzEgQEAKICAgICBwdWJsaWMgQnVuZGxlIGNhbGwoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIHJlcXVlc3QsIEJ1bmRsZSBhcmdzKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGlzIHRvIHNodXQgZG93biB0aGUgQ29udGVudFByb3ZpZGVyIGluc3RhbmNlLiBZb3UgY2FuIHRoZW4KKyAgICAgKiBpbnZva2UgdGhpcyBtZXRob2QgaW4gdW5pdCB0ZXN0cy4KKyAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBBbmRyb2lkIG5vcm1hbGx5IGhhbmRsZXMgQ29udGVudFByb3ZpZGVyIHN0YXJ0dXAgYW5kIHNodXRkb3duCisgICAgICogYXV0b21hdGljYWxseS4gWW91IGRvIG5vdCBuZWVkIHRvIHN0YXJ0IHVwIG9yIHNodXQgZG93biBhCisgICAgICogQ29udGVudFByb3ZpZGVyLiBXaGVuIHlvdSBpbnZva2UgYSB0ZXN0IG1ldGhvZCBvbiBhIENvbnRlbnRQcm92aWRlciwKKyAgICAgKiBob3dldmVyLCBhIENvbnRlbnRQcm92aWRlciBpbnN0YW5jZSBpcyBzdGFydGVkIGFuZCBrZWVwcyBydW5uaW5nIGFmdGVyCisgICAgICogdGhlIHRlc3QgZmluaXNoZXMsIGV2ZW4gaWYgYSBzdWNjZWVkaW5nIHRlc3QgaW5zdGFudGlhdGVzIGFub3RoZXIKKyAgICAgKiBDb250ZW50UHJvdmlkZXIuIEEgY29uZmxpY3QgZGV2ZWxvcHMgYmVjYXVzZSB0aGUgdHdvIGluc3RhbmNlcyBhcmUKKyAgICAgKiB1c3VhbGx5IHJ1bm5pbmcgYWdhaW5zdCB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlIChmb3IgZXhhbXBsZSwgYW4KKyAgICAgKiBzcWxpdGUgZGF0YWJhc2UpLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJbXBsZW1lbnRpbmcgc2h1dERvd24oKSBhdm9pZHMgdGhpcyBjb25mbGljdCBieSBwcm92aWRpbmcgYSB3YXkgdG8KKyAgICAgKiB0ZXJtaW5hdGUgdGhlIENvbnRlbnRQcm92aWRlci4gVGhpcyBtZXRob2QgY2FuIGFsc28gcHJldmVudCBtZW1vcnkgbGVha3MKKyAgICAgKiBmcm9tIG11bHRpcGxlIGluc3RhbnRpYXRpb25zIG9mIHRoZSBDb250ZW50UHJvdmlkZXIsIGFuZCBpdCBjYW4gZW5zdXJlCisgICAgICogdW5pdCB0ZXN0IGlzb2xhdGlvbiBieSBhbGxvd2luZyB5b3UgdG8gY29tcGxldGVseSBjbGVhbiB1cCB0aGUgdGVzdAorICAgICAqIGZpeHR1cmUgYmVmb3JlIG1vdmluZyBvbiB0byB0aGUgbmV4dCB0ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKyAgICAgICAgTG9nLncoVEFHLCAiaW1wbGVtZW50IENvbnRlbnRQcm92aWRlciBzaHV0ZG93bigpIHRvIG1ha2Ugc3VyZSBhbGwgZGF0YWJhc2UgIiArCisgICAgICAgICAgICAgICAgImNvbm5lY3Rpb25zIGFyZSBncmFjZWZ1bGx5IHNodXRkb3duIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyQ2xpZW50LmphdmEKaW5kZXggMDg1OGVhNS4uMDU0MDEwOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJDbGllbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CkBAIC00Myw1MyArNDQsNzcgQEAKICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRlbnRSZXNvbHZlcjsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjcXVlcnl9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI3F1ZXJ5IENvbnRlbnRQcm92aWRlci5xdWVyeX0gKi8KICAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmwsIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCiAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIucXVlcnkodXJsLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sICBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRUeXBlfSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRUeXBlIENvbnRlbnRQcm92aWRlci5nZXRUeXBlfSAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJsKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuZ2V0VHlwZSh1cmwpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNpbnNlcnR9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2dldFN0cmVhbVR5cGVzIENvbnRlbnRQcm92aWRlci5nZXRTdHJlYW1UeXBlc30gKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuZ2V0U3RyZWFtVHlwZXModXJsLCBtaW1lVHlwZUZpbHRlcik7CisgICAgfQorCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2luc2VydCBDb250ZW50UHJvdmlkZXIuaW5zZXJ0fSAqLwogICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmwsIENvbnRlbnRWYWx1ZXMgaW5pdGlhbFZhbHVlcykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5pbnNlcnQodXJsLCBpbml0aWFsVmFsdWVzKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjYnVsa0luc2VydH0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjYnVsa0luc2VydCBDb250ZW50UHJvdmlkZXIuYnVsa0luc2VydH0gKi8KICAgICBwdWJsaWMgaW50IGJ1bGtJbnNlcnQoVXJpIHVybCwgQ29udGVudFZhbHVlc1tdIGluaXRpYWxWYWx1ZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5idWxrSW5zZXJ0KHVybCwgaW5pdGlhbFZhbHVlcyk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2RlbGV0ZX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZGVsZXRlIENvbnRlbnRQcm92aWRlci5kZWxldGV9ICovCiAgICAgcHVibGljIGludCBkZWxldGUoVXJpIHVybCwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5kZWxldGUodXJsLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciN1cGRhdGV9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI3VwZGF0ZSBDb250ZW50UHJvdmlkZXIudXBkYXRlfSAqLwogICAgIHB1YmxpYyBpbnQgdXBkYXRlKFVyaSB1cmwsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBTdHJpbmcgc2VsZWN0aW9uLAogICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLnVwZGF0ZSh1cmwsIHZhbHVlcywgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkZpbGV9ICovCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkZpbGUgQ29udGVudFByb3ZpZGVyLm9wZW5GaWxlfS4gIE5vdGUgdGhhdAorICAgICAqIHRoaXMgPGVtPmRvZXMgbm90PC9lbT4KKyAgICAgKiB0YWtlIGNhcmUgb2Ygbm9uLWNvbnRlbnQ6IFVSSXMgc3VjaCBhcyBmaWxlOi4gIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkCisgICAgICogeW91IHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuRmlsZURlc2NyaXB0b3IKKyAgICAgKiBDb250ZW50UmVzb2x2ZXIub3BlbkZpbGVEZXNjcmlwdG9yfSBBUEkgaW5zdGVhZC4KKyAgICAgKi8KICAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5vcGVuRmlsZSh1cmwsIG1vZGUpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlfSAqLworICAgIC8qKgorICAgICAqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5Bc3NldEZpbGUgQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGV9LgorICAgICAqIE5vdGUgdGhhdCB0aGlzIDxlbT5kb2VzIG5vdDwvZW0+CisgICAgICogdGFrZSBjYXJlIG9mIG5vbi1jb250ZW50OiBVUklzIHN1Y2ggYXMgZmlsZTouICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZAorICAgICAqIHlvdSB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3IKKyAgICAgKiBDb250ZW50UmVzb2x2ZXIub3BlbkFzc2V0RmlsZURlc2NyaXB0b3J9IEFQSSBpbnN0ZWFkLgorICAgICAqLwogICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5Bc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlKHVybCwgbW9kZSk7CiAgICAgfQogCi0gICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNhcHBseUJhdGNofSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuVHlwZWRBc3NldEZpbGUgQ29udGVudFByb3ZpZGVyLm9wZW5UeXBlZEFzc2V0RmlsZX0gKi8KKyAgICBwdWJsaWMgZmluYWwgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSB1cmksCisgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIub3BlblR5cGVkQXNzZXRGaWxlKHVyaSwgbWltZVR5cGUsIG9wdHMpOworICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNhcHBseUJhdGNoIENvbnRlbnRQcm92aWRlci5hcHBseUJhdGNofSAqLwogICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBPcGVyYXRpb25BcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmFwcGx5QmF0Y2gob3BlcmF0aW9ucyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YQppbmRleCBmZGIzZDIwLi5kMWFiOGQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEKQEAgLTI1Nyw2ICsyNTcsMzggQEAKICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVCdW5kbGUocmVzcG9uc2VCdW5kbGUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEdFVF9TVFJFQU1fVFlQRVNfVFJBTlNBQ1RJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUNvbnRlbnRQcm92aWRlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgVXJpIHVybCA9IFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZUZpbHRlciA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0eXBlcyA9IGdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nQXJyYXkodHlwZXMpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgT1BFTl9UWVBFRF9BU1NFVF9GSUxFX1RSQU5TQUNUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElDb250ZW50UHJvdmlkZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIFVyaSB1cmwgPSBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlIG9wdHMgPSBkYXRhLnJlYWRCdW5kbGUoKTsKKworICAgICAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkOworICAgICAgICAgICAgICAgICAgICBmZCA9IG9wZW5UeXBlZEFzc2V0RmlsZSh1cmwsIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmZC53cml0ZVRvUGFyY2VsKHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMud3JpdGVFeGNlcHRpb25Ub1BhcmNlbChyZXBseSwgZSk7CkBAIC01NjgsNSArNjAwLDUwIEBACiAgICAgICAgIHJldHVybiBidW5kbGU7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbnRlbnRQcm92aWRlci5kZXNjcmlwdG9yKTsKKworICAgICAgICB1cmwud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhtaW1lVHlwZUZpbHRlcik7CisKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChJQ29udGVudFByb3ZpZGVyLkdFVF9TVFJFQU1fVFlQRVNfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKworICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgU3RyaW5nW10gb3V0ID0gcmVwbHkuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworCisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworCisgICAgICAgIHVybC53cml0ZVRvUGFyY2VsKGRhdGEsIDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKG1pbWVUeXBlKTsKKyAgICAgICAgZGF0YS53cml0ZUJ1bmRsZShvcHRzKTsKKworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KElDb250ZW50UHJvdmlkZXIuT1BFTl9UWVBFRF9BU1NFVF9GSUxFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisKKyAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uV2l0aEZpbGVOb3RGb3VuZEV4Y2VwdGlvbkZyb21QYXJjZWwocmVwbHkpOworICAgICAgICBpbnQgaGFzID0gcmVwbHkucmVhZEludCgpOworICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gaGFzICE9IDAKKyAgICAgICAgICAgICAgICA/IEFzc2V0RmlsZURlc2NyaXB0b3IuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHJlcGx5KSA6IG51bGw7CisKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKworICAgICAgICByZXR1cm4gZmQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBJQmluZGVyIG1SZW1vdGU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRRdWVyeU1hcC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UXVlcnlNYXAuamF2YQppbmRleCBkYmNiNGE3Li5jOTU1MDk0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRRdWVyeU1hcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEKQEAgLTEyOSw3ICsxMjksOSBAQAogICAgIC8qKiBSZXF1ZXJpZXMgdGhlIGN1cnNvciBhbmQgcmVhZHMgdGhlIGNvbnRlbnRzIGludG8gdGhlIGNhY2hlICovCiAgICAgcHVibGljIHZvaWQgcmVxdWVyeSgpIHsKICAgICAgICAgbURpcnR5ID0gZmFsc2U7Ci0gICAgICAgIG1DdXJzb3IucmVxdWVyeSgpOworICAgICAgICBpZiAoIW1DdXJzb3IucmVxdWVyeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0cnlpbmcgdG8gcmVxdWVyeSBhbiBhbHJlYWR5IGNsb3NlZCBjdXJzb3IiKTsKKyAgICAgICAgfQogICAgICAgICByZWFkQ3Vyc29ySW50b0NhY2hlKCk7CiAgICAgICAgIHNldENoYW5nZWQoKTsKICAgICAgICAgbm90aWZ5T2JzZXJ2ZXJzKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQppbmRleCA4MWZmNDE0Li5kYTFhYWM0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKQEAgLTQ1LDkgKzQ1LDkgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIAogLyoqCkBAIC0yMjAsNiArMjIwLDM4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUXVlcnkgZm9yIHRoZSBwb3NzaWJsZSBNSU1FIHR5cGVzIGZvciB0aGUgcmVwcmVzZW50YXRpb25zIHRoZSBnaXZlbgorICAgICAqIGNvbnRlbnQgVVJMIGNhbiBiZSByZXR1cm5lZCB3aGVuIG9wZW5lZCBhcyBhcyBzdHJlYW0gd2l0aAorICAgICAqIHtAbGluayAjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcn0uICBOb3RlIHRoYXQgdGhlIHR5cGVzIGhlcmUgYXJlCisgICAgICogbm90IG5lY2Vzc2FyaWx5IGEgc3VwZXJzZXQgb2YgdGhlIHR5cGUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlfSAtLQorICAgICAqIG1hbnkgY29udGVudCBwcm92aWRlcnMgY2FuIG5vdCByZXR1cm4gYSByYXcgc3RyZWFtIGZvciB0aGUgc3RydWN0dXJlZAorICAgICAqIGRhdGEgdGhhdCB0aGV5IGNvbnRhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIEEgVXJpIGlkZW50aWZ5aW5nIGNvbnRlbnQgKGVpdGhlciBhIGxpc3Qgb3Igc3BlY2lmaWMgdHlwZSksCisgICAgICogdXNpbmcgdGhlIGNvbnRlbnQ6Ly8gc2NoZW1lLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZUZpbHRlciBUaGUgZGVzaXJlZCBNSU1FIHR5cGUuICBUaGlzIG1heSBiZSBhIHBhdHRlcm4sCisgICAgICogc3VjaCBhcyAqXC8qLCB0byBxdWVyeSBmb3IgYWxsIGF2YWlsYWJsZSBNSU1FIHR5cGVzIHRoYXQgbWF0Y2ggdGhlCisgICAgICogcGF0dGVybi4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYW4gYXJyYXkgb2YgTUlNRSB0eXBlIHN0cmluZ3MgZm9yIGFsbCBhdmFpbGFibGxlCisgICAgICogZGF0YSBzdHJlYW1zIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIG1pbWVUeXBlRmlsdGVyLiAgSWYgdGhlcmUgYXJlIG5vbmUsCisgICAgICogbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB7CisgICAgICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBhY3F1aXJlUHJvdmlkZXIodXJsKTsKKyAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5nZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworCQkJcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKKwkJfQorICAgIH0KKworICAgIC8qKgogICAgICAqIDxwPgogICAgICAqIFF1ZXJ5IHRoZSBnaXZlbiBVUkksIHJldHVybmluZyBhIHtAbGluayBDdXJzb3J9IG92ZXIgdGhlIHJlc3VsdCBzZXQuCiAgICAgICogPC9wPgpAQCAtMzY1LDcgKzM5Nyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSAiY29udGVudDoiIFVSSS4gIFRoaXMKKyAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhIFVSSS4gIFRoaXMKICAgICAgKiBpcyBsaWtlIHtAbGluayAjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcpfSwgYnV0IHVzZXMgdGhlCiAgICAgICogdW5kZXJseWluZyB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5GaWxlfQogICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuRmlsZSgpfSBtZXRob2QsIHNvIHdpbGwgPGVtPm5vdDwvZW0+IHdvcmsgd2l0aApAQCAtNDE1LDEwICs0NDcsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgImNvbnRlbnQ6IiBVUkkuICBUaGlzCisgICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSBVUkkuICBUaGlzCiAgICAgICogaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlfQotICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlKCl9IG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgYW55IGZpbGUgc3RvcmVkIHRoZXJlLgorICAgICAqIG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkksIHRvIHJldHJpZXZlIGFueSBmaWxlIHN0b3JlZCB0aGVyZS4KICAgICAgKgogICAgICAqIDxoNT5BY2NlcHRzIHRoZSBmb2xsb3dpbmcgVVJJIHNjaGVtZXM6PC9oNT4KICAgICAgKiA8dWw+CkBAIC00NTAsNiArNDgxLDExIEBACiAgICAgICogPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciByZWFkLW9ubHkgaW5wdXQgKG1vZGUgaXMgInIiKQorICAgICAqIG9uIGEgY29udGVudDogVVJJLCBpdCB3aWxsIGluc3RlYWQgY2FsbCB7QGxpbmsgI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3J9CisgICAgICogZm9yIHlvdSB3aXRoIGEgTUlNRSB0eXBlIG9mICIqXC8qIi4gIFRoaXMgYWxsb3dzIHN1Y2ggY2FsbGVycyB0byBiZW5lZml0CisgICAgICogZnJvbSBhbnkgYnVpbHQtaW4gZGF0YSBjb252ZXJzaW9uIHRoYXQgYSBwcm92aWRlciBpbXBsZW1lbnRzLgorICAgICAqCiAgICAgICogQHBhcmFtIHVyaSBUaGUgZGVzaXJlZCBVUkkgdG8gb3Blbi4KICAgICAgKiBAcGFyYW0gbW9kZSBUaGUgZmlsZSBtb2RlIHRvIHVzZSwgYXMgcGVyIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZQogICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlfS4KQEAgLTQ3NiwyOSArNTEyLDk3IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHVyaS5nZXRQYXRoKCkpLCBtb2RlVG9Nb2RlKHVyaSwgbW9kZSkpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgMCwgLTEpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmkpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHByb3ZpZGVyLm9wZW5Bc3NldEZpbGUodXJpLCBtb2RlKTsKLSAgICAgICAgICAgICAgICBpZihmZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKCJyIi5lcXVhbHMobW9kZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcih1cmksICIqLyoiLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmkpOworICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCksIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCBmZC5nZXRTdGFydE9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0RGVjbGFyZWRMZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBwcm92aWRlci5vcGVuQXNzZXRGaWxlKHVyaSwgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKGZkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLCBwcm92aWRlcik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2VzcyEgIERvbid0IHJlbGVhc2UgdGhlIHByb3ZpZGVyIHdoZW4gZXhpdGluZywgbGV0CisgICAgICAgICAgICAgICAgICAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIgZG8gdGhhdCB3aGVuIGl0IGlzIGNsb3NlZC4KKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIGZkLmdldFN0YXJ0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0RGVjbGFyZWRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRGVhZCBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIChwb3RlbnRpYWxseSB0eXBlIHRyYW5zZm9ybWVkKQorICAgICAqIGRhdGEgZnJvbSBhICJjb250ZW50OiIgVVJJLiAgVGhpcyBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZworICAgICAqIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblR5cGVkQXNzZXRGaWxlfSBtZXRob2Qgb2YgdGhlIHByb3ZpZGVyCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkksIHRvIHJldHJpZXZlIHJldHJpZXZlIGFueSBhcHByb3ByaWF0ZQorICAgICAqIGRhdGEgc3RyZWFtIGZvciB0aGUgZGF0YSBzdG9yZWQgdGhlcmUuCisgICAgICoKKyAgICAgKiA8cD5Vbmxpa2Uge0BsaW5rICNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcn0sIHRoaXMgZnVuY3Rpb24gb25seSB3b3JrcworICAgICAqIHdpdGggImNvbnRlbnQ6IiBVUklzLCBiZWNhdXNlIGNvbnRlbnQgcHJvdmlkZXJzIGFyZSB0aGUgb25seSBmYWNpbGl0eQorICAgICAqIHdpdGggYW4gYXNzb2NpYXRlZCBNSU1FIHR5cGUgdG8gZW5zdXJlIHRoYXQgdGhlIHJldHVybmVkIGRhdGEgc3RyZWFtCisgICAgICogaXMgb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgICAgKgorICAgICAqIDxwPkFsbCB0ZXh0Lyogc3RyZWFtcyBhcmUgZW5jb2RlZCBpbiBVVEYtOC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGRlc2lyZWQgVVJJIHRvIG9wZW4uCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIE1JTUUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgZGF0YS4gIFRoaXMgY2FuCisgICAgICogYmUgYSBwYXR0ZXJuIHN1Y2ggYXMgKlwvKiwgd2hpY2ggd2lsbCBhbGxvdyB0aGUgY29udGVudCBwcm92aWRlciB0bworICAgICAqIHNlbGVjdCBhIHR5cGUsIHRob3VnaCB0aGVyZSBpcyBubyB3YXkgZm9yIHlvdSB0byBkZXRlcm1pbmUgd2hhdCB0eXBlCisgICAgICogaXQgaXMgcmV0dXJuaW5nLgorICAgICAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgcHJvdmlkZXItZGVwZW5kZW50IG9wdGlvbnMuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZyb20gd2hpY2ggeW91IGNhbiByZWFkIHRoZQorICAgICAqIGRhdGEgc3RyZWFtIGZyb20gdGhlIHByb3ZpZGVyLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGEgcGlwZSwgbWVhbmluZworICAgICAqIHlvdSBjYW4ndCBzZWVrIGluIGl0LiAgVGhlIG9ubHkgc2VlayB5b3Ugc2hvdWxkIGRvIGlzIGlmIHRoZQorICAgICAqIEFzc2V0RmlsZURlc2NyaXB0b3IgY29udGFpbnMgYW4gb2Zmc2V0LCB0byBtb3ZlIHRvIHRoYXQgb2Zmc2V0IGJlZm9yZQorICAgICAqIHJlYWRpbmcuICBZb3Ugb3duIHRoaXMgZGVzY3JpcHRvciBhbmQgYXJlIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIGl0IHdoZW4gZG9uZS4KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBUaHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG9mIG5vCisgICAgICogZGF0YSBvZiB0aGUgZGVzaXJlZCB0eXBlIGV4aXN0cyB1bmRlciB0aGUgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpIHVyaSwKKyAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVyaSk7CisgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHByb3ZpZGVyLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmksIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgICAgIGlmIChmZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJEZWFkIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyKAorICAgICAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLCBwcm92aWRlcik7CisKKyAgICAgICAgICAgIC8vIFN1Y2Nlc3MhICBEb24ndCByZWxlYXNlIHRoZSBwcm92aWRlciB3aGVuIGV4aXRpbmcsIGxldAorICAgICAgICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBkbyB0aGF0IHdoZW4gaXQgaXMgY2xvc2VkLgorICAgICAgICAgICAgcHJvdmlkZXIgPSBudWxsOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCBmZC5nZXRTdGFydE9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICBmZC5nZXREZWNsYXJlZExlbmd0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkRlYWQgY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjE1LDEyICsxMzE5LDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgYSBzeW5jIGlzIGFjdGl2ZSByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBpdCwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisgICAgICogSWYgYSBzeW5jIGlzIGFjdGl2ZSByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBpdCwgb3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KKyAgICAgKiA8cD4KICAgICAgKiBAcmV0dXJuIHRoZSBTeW5jSW5mbyBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgc3luYyBvciBudWxsIGlmIG9uZSBpcyBub3QgYWN0aXZlLgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogU2luY2UgbXVsdGlwbGUgY29uY3VycmVudCBzeW5jcyBhcmUgbm93IHN1cHBvcnRlZCB5b3Ugc2hvdWxkIHVzZQorICAgICAqIHtAbGluayAjZ2V0Q3VycmVudFN5bmNzKCl9IHRvIGdldCB0aGUgYWNjdXJhdGUgbGlzdCBvZiBjdXJyZW50IHN5bmNzLgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGl0ZW0gZnJvbSB0aGUgbGlzdCBvZiBjdXJyZW50IHN5bmNzCisgICAgICogb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgU3luY0luZm8gZ2V0Q3VycmVudFN5bmMoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udGVudFNlcnZpY2UoKS5nZXRDdXJyZW50U3luYygpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTeW5jSW5mbz4gc3luY3MgPSBnZXRDb250ZW50U2VydmljZSgpLmdldEN1cnJlbnRTeW5jcygpOworICAgICAgICAgICAgaWYgKHN5bmNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN5bmNzLmdldCgwKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ0aGUgQ29udGVudFNlcnZpY2Ugc2hvdWxkIGFsd2F5cyBiZSByZWFjaGFibGUiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZSBhY3RpdmUgc3luY3MuIFRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5CisgICAgICogaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBzeW5jcy4KKyAgICAgKiBAcmV0dXJuIGEgTGlzdCBvZiBTeW5jSW5mbyBvYmplY3RzIGZvciB0aGUgY3VycmVudGx5IGFjdGl2ZSBzeW5jcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3luY0luZm8+IGdldEN1cnJlbnRTeW5jcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDb250ZW50U2VydmljZSgpLmdldEN1cnJlbnRTeW5jcygpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInRoZSBDb250ZW50U2VydmljZSBzaG91bGQgYWx3YXlzIGJlIHJlYWNoYWJsZSIsIGUpOwogICAgICAgICB9CkBAIC0xMzc2LDcgKzE1MDQsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ3Vyc29yV3JhcHBlcklubmVyIGV4dGVuZHMgQ3Vyc29yV3JhcHBlciB7Ci0gICAgICAgIHByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHPSJDdXJzb3JXcmFwcGVySW5uZXIiOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlRmxhZyA9IGZhbHNlOwogCkBAIC0xNDA1LDcgKzE1MzMsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBleHRlbmRzIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUc9IlBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIiOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlbGVhc2VQcm92aWRlckZsYWcgPSBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZS5qYXZhCmluZGV4IGZjMmRmYzAuLmFmZTg0ODMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRTZXJ2aWNlLmphdmEKQEAgLTM4NiwxOSArMzg2LDE1IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3luY0luZm8gZ2V0Q3VycmVudFN5bmMoKSB7CisgICAgcHVibGljIExpc3Q8U3luY0luZm8+IGdldEN1cnJlbnRTeW5jcygpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9TWU5DX1NUQVRTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIHN5bmMgc3RhdHMiKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKLSAgICAgICAgICAgIGlmIChzeW5jTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuZ2V0Q3VycmVudFN5bmMoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBnZXRTeW5jTWFuYWdlcigpLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuZ2V0Q3VycmVudFN5bmNzKCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIHB1YmxpYyBTeW5jU3RhdHVzSW5mbyBnZXRTeW5jU3RhdHVzKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YQppbmRleCA3NTc4N2NkLi4wZDI1ZjgwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YQpAQCAtNDE0LDYgKzQxNCw4IEBACiAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgIHJldHVybiAoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCkgIT0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGNhc3QgdmFsdWUgZm9yICIgKyBrZXkgKyAiIHRvIGEgQm9vbGVhbjogIiArIHZhbHVlLCBlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTQ0Niw2ICs0NDgsMTUgQEAKICAgICAgICAgcmV0dXJuIG1WYWx1ZXMuZW50cnlTZXQoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIGFsbCBvZiB0aGUga2V5cworICAgICAqCisgICAgICogQHJldHVybiBhIHNldCBvZiBhbGwgb2YgdGhlIGtleXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCkgeworICAgICAgICByZXR1cm4gbVZhbHVlcy5rZXlTZXQoKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxDb250ZW50VmFsdWVzPiBDUkVBVE9SID0KICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8Q29udGVudFZhbHVlcz4oKSB7CiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiZGVwcmVjYXRpb24iLCAidW5jaGVja2VkIn0pCkBAIC00ODgsNiArNDk5LDEwIEBACiAgICAgICAgIHJldHVybiAoQXJyYXlMaXN0PFN0cmluZz4pIG1WYWx1ZXMuZ2V0KGtleSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKaW5kZXggNjkzYmUyMS4uOWM4ZDY5OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKQEAgLTIxLDEwICsyMSwxMiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uT25TY2FuQ29tcGxldGVkTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTU4OCw2ICs1OTAsMzIgQEAKICAgICAgICAgICAgIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnkpOwogCiAgICAgLyoqCisgICAgICogT3BlbiBhIG5ldyBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRleHQncworICAgICAqIGFwcGxpY2F0aW9uIHBhY2thZ2UuICBDcmVhdGVzIHRoZSBkYXRhYmFzZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSAodW5pcXVlIGluIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlKSBvZiB0aGUgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIG1vZGUgT3BlcmF0aW5nIG1vZGUuICBVc2UgMCBvciB7QGxpbmsgI01PREVfUFJJVkFURX0gZm9yIHRoZQorICAgICAqICAgICBkZWZhdWx0IG9wZXJhdGlvbiwge0BsaW5rICNNT0RFX1dPUkxEX1JFQURBQkxFfQorICAgICAqICAgICBhbmQge0BsaW5rICNNT0RFX1dPUkxEX1dSSVRFQUJMRX0gdG8gY29udHJvbCBwZXJtaXNzaW9ucy4KKyAgICAgKiBAcGFyYW0gZmFjdG9yeSBBbiBvcHRpb25hbCBmYWN0b3J5IGNsYXNzIHRoYXQgaXMgY2FsbGVkIHRvIGluc3RhbnRpYXRlIGEKKyAgICAgKiAgICAgY3Vyc29yIHdoZW4gcXVlcnkgaXMgY2FsbGVkLgorICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgdGhlIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlCisgICAgICogY29ycnVwdGlvbi4gaWYgbnVsbCwge0BsaW5rIGFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyfSBpcyBhc3N1bWVkLgorICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIGEgbmV3bHkgY3JlYXRlZCBkYXRhYmFzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNNT0RFX1BSSVZBVEUKKyAgICAgKiBAc2VlICNNT0RFX1dPUkxEX1JFQURBQkxFCisgICAgICogQHNlZSAjTU9ERV9XT1JMRF9XUklURUFCTEUKKyAgICAgKiBAc2VlICNkZWxldGVEYXRhYmFzZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcik7CisKKyAgICAvKioKICAgICAgKiBEZWxldGUgYW4gZXhpc3RpbmcgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250ZXh0J3MKICAgICAgKiBhcHBsaWNhdGlvbiBwYWNrYWdlLgogICAgICAqCkBAIC0xMzU2LDcgKzEzODQsMTYgQEAKICAgICAgKiBAc2VlIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fU0VSVklDRSA9ICJsb2NhdGlvbiI7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9IHRvIHJldHJpZXZlIGEKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5RGV0ZWN0b3J9IGZvciBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdAorICAgICAqIHRoZSB1c2VyIGlzIGluLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVFJZX0RFVEVDVE9SID0gImNvdW50cnlfZGV0ZWN0b3IiOworCiAgICAgLyoqCiAgICAgICogVXNlIHdpdGgge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfSB0byByZXRyaWV2ZSBhIHtAbGluawogICAgICAqIGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXJ9IGZvciBoYW5kbGluZyBzZWFyY2hlcy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQppbmRleCBhNDQ3MTA4Li4zZjVkMjE1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKQEAgLTIwNCw2ICsyMDUsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG5hbWUsIG1vZGUsIGZhY3RvcnksIGVycm9ySGFuZGxlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgcmV0dXJuIG1CYXNlLmRlbGV0ZURhdGFiYXNlKG5hbWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ3Vyc29yTG9hZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0N1cnNvckxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzY4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0N1cnNvckxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CisKKy8qKgorICogQSBsb2FkZXIgdGhhdCBxdWVyaWVzIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSBhbmQgcmV0dXJucyBhIHtAbGluayBDdXJzb3J9LgorICovCitwdWJsaWMgY2xhc3MgQ3Vyc29yTG9hZGVyIGV4dGVuZHMgQXN5bmNUYXNrTG9hZGVyPEN1cnNvcj4geworICAgIEN1cnNvciBtQ3Vyc29yOworICAgIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciBtT2JzZXJ2ZXI7CisgICAgYm9vbGVhbiBtU3RvcHBlZDsKKyAgICBVcmkgbVVyaTsKKyAgICBTdHJpbmdbXSBtUHJvamVjdGlvbjsKKyAgICBTdHJpbmcgbVNlbGVjdGlvbjsKKyAgICBTdHJpbmdbXSBtU2VsZWN0aW9uQXJnczsKKyAgICBTdHJpbmcgbVNvcnRPcmRlcjsKKworICAgIC8qIFJ1bnMgb24gYSB3b3JrZXIgdGhyZWFkICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBsb2FkSW5CYWNrZ3JvdW5kKCkgeworICAgICAgICBDdXJzb3IgY3Vyc29yID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KG1VcmksIG1Qcm9qZWN0aW9uLCBtU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25BcmdzLCBtU29ydE9yZGVyKTsKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGN1cnNvciB3aW5kb3cgaXMgZmlsbGVkCisgICAgICAgICAgICBjdXJzb3IuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyKGN1cnNvciwgbU9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3Vyc29yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhbiBvYnNlcnZlciB0byBnZXQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICogd2hlbiB0aGUgY3Vyc29yIG5lZWRzIHRvIGJlIHJlZnJlc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckNvbnRlbnRPYnNlcnZlcihDdXJzb3IgY3Vyc29yLCBDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKKyAgICAgICAgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgfQorCisgICAgLyogUnVucyBvbiB0aGUgVUkgdGhyZWFkICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVsaXZlclJlc3VsdChDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChtU3RvcHBlZCkgeworICAgICAgICAgICAgLy8gQW4gYXN5bmMgcXVlcnkgY2FtZSBpbiB3aGlsZSB0aGUgbG9hZGVyIGlzIHN0b3BwZWQKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEN1cnNvciBvbGRDdXJzb3IgPSBtQ3Vyc29yOworICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOworICAgICAgICBzdXBlci5kZWxpdmVyUmVzdWx0KGN1cnNvcik7CisKKyAgICAgICAgaWYgKG9sZEN1cnNvciAhPSBudWxsICYmICFvbGRDdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgb2xkQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ3Vyc29yTG9hZGVyKENvbnRleHQgY29udGV4dCwgVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1PYnNlcnZlciA9IG5ldyBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIoKTsKKyAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgbVByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TG9hZGluZygpIHsKKyAgICAgICAgbVN0b3BwZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBkZWxpdmVyUmVzdWx0KG1DdXJzb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yY2VMb2FkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGluZygpIHsKKyAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCAmJiAhbUN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnNvciA9IG51bGw7CisKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBjYW5jZWwgdGhlIGN1cnJlbnQgbG9hZCB0YXNrIGlmIHBvc3NpYmxlLgorICAgICAgICBjYW5jZWxMb2FkKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYW55IG91dHN0YW5kaW5nIGxvYWRzIGNsZWFuIHRoZW1zZWx2ZXMgdXAgcHJvcGVybHkKKyAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsbGVkKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmICFjdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAvLyBFbnN1cmUgdGhlIGxvYWRlciBpcyBzdG9wcGVkCisgICAgICAgIHN0b3BMb2FkaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFVyaSBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBtVXJpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVyaShVcmkgdXJpKSB7CisgICAgICAgIG1VcmkgPSB1cmk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFByb2plY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtUHJvamVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0aW9uKFN0cmluZ1tdIHByb2plY3Rpb24pIHsKKyAgICAgICAgbVByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oU3RyaW5nIHNlbGVjdGlvbikgeworICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZWxlY3Rpb25BcmdzKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGlvbkFyZ3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uQXJncyhTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvcnRPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3J0T3JkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29ydE9yZGVyKFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgbVNvcnRPcmRlciA9IHNvcnRPcmRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDkwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyOworCisvKioKKyAqIFByb2dyYW1taW5nIGludGVyZmFjZSB0byB0aGUgY2xpcGJvYXJkLCB3aGljaCBhbGxvd3MgY29weWluZyBhbmQgcGFzdGluZworICogYmV0d2VlbiBhcHBsaWNhdGlvbnMuCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJQ2xpcGJvYXJkIHsKKyAgICB2b2lkIHNldFByaW1hcnlDbGlwKGluIENsaXBEYXRhIGNsaXApOworICAgIENsaXBEYXRhIGdldFByaW1hcnlDbGlwKFN0cmluZyBwa2cpOworICAgIENsaXBEZXNjcmlwdGlvbiBnZXRQcmltYXJ5Q2xpcERlc2NyaXB0aW9uKCk7CisgICAgYm9vbGVhbiBoYXNQcmltYXJ5Q2xpcCgpOworICAgIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoaW4gSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIHZvaWQgcmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoaW4gSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGlwYm9hcmQgY29udGFpbnMgdGV4dDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaGFzQ2xpcGJvYXJkVGV4dCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCA2N2U3NTgxLi44ZjEyMmNlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtNTksNiArNTksNyBAQAogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBPcGVyYXRpb25BcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKwogICAgIC8qKgogICAgICAqIEBoaWRlIC0tIHVudGlsIGludGVyZmFjZSBoYXMgcHJvdmVuIGl0c2VsZgogICAgICAqCkBAIC03MSw2ICs3MiwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBCdW5kbGUgY2FsbChTdHJpbmcgbWV0aG9kLCBTdHJpbmcgcmVxdWVzdCwgQnVuZGxlIGFyZ3MpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKKyAgICAvLyBEYXRhIGludGVyY2hhbmdlLgorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb247CisKICAgICAvKiBJUEMgY29uc3RhbnRzICovCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZXNjcmlwdG9yID0gImFuZHJvaWQuY29udGVudC5JQ29udGVudFByb3ZpZGVyIjsKIApAQCAtODQsNCArOTAsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BFTl9BU1NFVF9GSUxFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTQ7CiAgICAgc3RhdGljIGZpbmFsIGludCBBUFBMWV9CQVRDSF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE5OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1NUUkVBTV9UWVBFU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BFTl9UWVBFRF9BU1NFVF9GSUxFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjI7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50U2VydmljZS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFNlcnZpY2UuYWlkbAppbmRleCBhNjM2OGQ1Li44NmE5MzkyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50U2VydmljZS5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRTZXJ2aWNlLmFpZGwKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAqLwogICAgIGJvb2xlYW4gaXNTeW5jQWN0aXZlKGluIEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSk7CiAKLSAgICBTeW5jSW5mbyBnZXRDdXJyZW50U3luYygpOworICAgIExpc3Q8U3luY0luZm8+IGdldEN1cnJlbnRTeW5jcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdHlwZXMgb2YgdGhlIFN5bmNBZGFwdGVycyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIHN5c3RlbS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQyYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK29uZXdheSBpbnRlcmZhY2UgSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgeworICAgIHZvaWQgZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCmluZGV4IDcxNTRhZWUuLjRkMGI4YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQpAQCAtNTM0LDYgKzUzNCw3IEBACiAgKiAgICAgPGxpPiB7QGxpbmsgI0NBVEVHT1JZX0NBUl9ET0NLfQogICogICAgIDxsaT4ge0BsaW5rICNDQVRFR09SWV9ERVNLX0RPQ0t9CiAgKiAgICAgPGxpPiB7QGxpbmsgI0NBVEVHT1JZX0NBUl9NT0RFfQorICogICAgIDxsaT4ge0BsaW5rICNDQVRFR09SWV9BUFBfTUFSS0VUfQogICogPC91bD4KICAqCiAgKiA8aDM+U3RhbmRhcmQgRXh0cmEgRGF0YTwvaDM+CkBAIC05ODUsNiArOTg2LDE1IEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JTlNFUlQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLklOU0VSVCI7CiAgICAgLyoqCisgICAgICogQWN0aXZpdHkgQWN0aW9uOiBDcmVhdGUgYSBuZXcgaXRlbSBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyLCBpbml0aWFsaXppbmcgaXQKKyAgICAgKiBmcm9tIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQuCisgICAgICogPHA+SW5wdXQ6IHtAbGluayAjZ2V0RGF0YX0gaXMgVVJJIG9mIHRoZSBkaXJlY3RvcnkgKHZuZC5hbmRyb2lkLmN1cnNvci5kaXIvKikKKyAgICAgKiBpbiB3aGljaCB0byBwbGFjZSB0aGUgZGF0YS4KKyAgICAgKiA8cD5PdXRwdXQ6IFVSSSBvZiB0aGUgbmV3IGRhdGEgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBU1RFID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQVNURSI7CisgICAgLyoqCiAgICAgICogQWN0aXZpdHkgQWN0aW9uOiBEZWxldGUgdGhlIGdpdmVuIGRhdGEgZnJvbSBpdHMgY29udGFpbmVyLgogICAgICAqIDxwPklucHV0OiB7QGxpbmsgI2dldERhdGF9IGlzIFVSSSBvZiBkYXRhIHRvIGJlIGRlbGV0ZWQuCiAgICAgICogPHA+T3V0cHV0OiBub3RoaW5nLgpAQCAtMjAwMSw2ICsyMDExLDExIEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5JTlRFTlRfQ0FURUdPUlkpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfRU1CRUQgPSAiYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuRU1CRUQiOwogICAgIC8qKgorICAgICAqIFRoaXMgYWN0aXZpdHkgYWxsb3dzIHRoZSB1c2VyIHRvIGJyb3dzZSBhbmQgZG93bmxvYWQgbmV3IGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLklOVEVOVF9DQVRFR09SWSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9BUFBfTUFSS0VUID0gImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkFQUF9NQVJLRVQiOworICAgIC8qKgogICAgICAqIFRoaXMgYWN0aXZpdHkgbWF5IGJlIGV4ZXJjaXNlZCBieSB0aGUgbW9ua2V5IG9yIG90aGVyIGF1dG9tYXRlZCB0ZXN0IHRvb2xzLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuSU5URU5UX0NBVEVHT1JZKQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Mb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0MDk2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHBlcmZvcm1zIGFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIGRhdGEuIFdoaWxlIExvYWRlcnMgYXJlIGFjdGl2ZQorICogdGhleSBzaG91bGQgbW9uaXRvciB0aGUgc291cmNlIG9mIHRoZWlyIGRhdGEgYW5kIGRlbGl2ZXIgbmV3IHJlc3VsdHMgd2hlbiB0aGUgY29udGVudHMKKyAqIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gPEQ+IFRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiB0aGUgbG9hZCBpcyBjb21wbGV0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9hZGVyPEQ+IHsKKyAgICBpbnQgbUlkOworICAgIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbUxpc3RlbmVyOworICAgIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHVibGljIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRlbGl2ZXJTZWxmTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgb25Db250ZW50Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBvbiB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgTG9hZGVyIHdoZW4gdGhlIGxvYWQgaXMgY29tcGxldGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlciB0aGF0IGNvbXBsZXRlZCB0aGUgbG9hZAorICAgICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhd2F5IHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBjb250ZXh0LiBTaW5jZSBMb2FkZXJzIGNhbiBiZSB1c2VkCisgICAgICogYWNyb3NzIG11bHRpcGxlIGFjdGl2aXRpZXMgaXQncyBkYW5nZXJvdXMgdG8gc3RvcmUgdGhlIGNvbnRleHQgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxpdmVyUmVzdWx0KEQgZGF0YSkgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkxvYWRDb21wbGV0ZSh0aGlzLCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYW4gYXBwbGljYXRpb24gY29udGV4dCByZXRyaWV2ZWQgZnJvbSB0aGUgQ29udGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGlzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2xhc3MgdGhhdCB3aWxsIHJlY2VpdmUgY2FsbGJhY2tzIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlLiBUaGUgY2FsbGJhY2tzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBzbyBpdCdzIHNhZmUgdG8gcGFzcyB0aGUgcmVzdWx0cyB0byB3aWRnZXRzLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihpbnQgaWQsIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBhbHJlYWR5IGEgbGlzdGVuZXIgcmVnaXN0ZXJlZCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBtSWQgPSBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGxpc3RlbmVyIHJlZ2lzdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBsaXN0ZW5lcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXR0ZW1wdGluZyB0byB1bnJlZ2lzdGVyIHRoZSB3cm9uZyBsaXN0ZW5lciIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4gVGhlIGxvYWRlciB3aWxsIG1vbml0b3IgdGhlIHNvdXJjZSBvZgorICAgICAqIHRoZSBkYXRhIHNldCBhbmQgbWF5IGRlbGl2ZXIgZnV0dXJlIGNhbGxiYWNrcyBpZiB0aGUgc291cmNlIGNoYW5nZXMuIENhbGxpbmcKKyAgICAgKiB7QGxpbmsgI3N0b3BMb2FkaW5nfSB3aWxsIHN0b3AgdGhlIGRlbGl2ZXJ5IG9mIGNhbGxiYWNrcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRm9yY2UgYW4gYXN5bmNocm9ub3VzIGxvYWQuIFVubGlrZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSB0aGlzIHdpbGwgaWdub3JlIGEgcHJldmlvdXNseQorICAgICAqIGxvYWRlZCBkYXRhIHNldCBhbmQgbG9hZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZm9yY2VMb2FkKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBkZWxpdmVyeSBvZiB1cGRhdGVzIHVudGlsIHRoZSBuZXh0IHRpbWUge0BsaW5rICNzdGFydExvYWRpbmcoKX0gaXMgY2FsbGVkCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wTG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGxvYWRlciBhbmQgZnJlZXMgaXRzIHJlc291cmNlcywgbWFraW5nIGl0IHVudXNhYmxlLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4ge0BsaW5rIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcn0gZGV0ZWN0cyBhIGNoYW5nZS4gIENhbGxzIHtAbGluayAjZm9yY2VMb2FkKCl9CisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ29udGVudENoYW5nZWQoKSB7CisgICAgICAgIGZvcmNlTG9hZCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEKaW5kZXggMTQ4NDIwNC4uYzA3ODhmNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgYW5kIG1vZGlmeWluZyBwcmVmZXJlbmNlIGRhdGEgcmV0dXJuZWQgYnkge0BsaW5rCkBAIC03MSw2ICs3MiwxNyBAQAogICAgICAgICBFZGl0b3IgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7CiAgICAgICAgIAogICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgc2V0IG9mIFN0cmluZyB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbgorICAgICAgICAgKiBiYWNrIG9uY2Uge0BsaW5rICNjb21taXR9IGlzIGNhbGxlZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gbW9kaWZ5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBuZXcgdmFsdWVzIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIEVkaXRvciBvYmplY3QsIHNvIHlvdSBjYW4KKyAgICAgICAgICogY2hhaW4gcHV0IGNhbGxzIHRvZ2V0aGVyLgorICAgICAgICAgKi8KKyAgICAgICAgRWRpdG9yIHB1dFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiB2YWx1ZXMpOworICAgICAgICAKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCBhbiBpbnQgdmFsdWUgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbiBiYWNrIG9uY2UKICAgICAgICAgICoge0BsaW5rICNjb21taXR9IG9yIHtAbGluayAjYXBwbHl9IGFyZSBjYWxsZWQuCiAgICAgICAgICAqIApAQCAtMjE4LDYgKzIzMCwyMCBAQAogICAgIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGRlZlZhbHVlKTsKICAgICAKICAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHNldCBvZiBTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHByZWZlcmVuY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCisgICAgICogQHBhcmFtIGRlZlZhbHVlcyBWYWx1ZXMgdG8gcmV0dXJuIGlmIHRoaXMgcHJlZmVyZW5jZSBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZWZlcmVuY2UgdmFsdWVzIGlmIHRoZXkgZXhpc3QsIG9yIGRlZlZhbHVlcy4KKyAgICAgKiBUaHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJlZmVyZW5jZSB3aXRoIHRoaXMgbmFtZQorICAgICAqIHRoYXQgaXMgbm90IGEgU2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICovCisgICAgU2V0PFN0cmluZz4gZ2V0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IGRlZlZhbHVlcyk7CisgICAgCisgICAgLyoqCiAgICAgICogUmV0cmlldmUgYW4gaW50IHZhbHVlIGZyb20gdGhlIHByZWZlcmVuY2VzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNJbmZvLmphdmEKaW5kZXggNjE2YjA1Zi4uYWJmZTk2NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY0luZm8uamF2YQpAQCAtMTgsMTIgKzE4LDEzIEBACiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yOwogCiAvKioKICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBzeW5jIG9wZXJhdGlvbiB0aGF0IGlzIGN1cnJlbnRseSB1bmRlcndheS4KICAqLwotcHVibGljIGNsYXNzIFN5bmNJbmZvIHsKK3B1YmxpYyBjbGFzcyBTeW5jSW5mbyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewogICAgIC8qKiBAaGlkZSAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgYXV0aG9yaXR5SWQ7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQppbmRleCAyNmI2YWQ3Li5jOTExNWM1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCkBAIC0xNiw2ICsxNiwyMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKIAoraW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCkBAIC0zNCwxNyArNDgsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZWdpc3RlcmVkU2VydmljZXNDYWNoZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLldvcmtTb3VyY2U7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlsczsKQEAgLTU2LDEwICs1OSwxMyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIAogLyoqCkBAIC03OCwzMCArODQsMTcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9USU1FX1BFUl9TWU5DOwogCiAgICAgc3RhdGljIHsKLSAgICAgICAgU3RyaW5nIGxvY2FsU3luY0RlbGF5U3RyaW5nID0gU3lzdGVtUHJvcGVydGllcy5nZXQoInN5bmMubG9jYWxfc3luY19kZWxheSIpOwotICAgICAgICBsb25nIGxvY2FsU3luY0RlbGF5ID0gMzAgKiAxMDAwOyAvLyAzMCBzZWNvbmRzCi0gICAgICAgIGlmIChsb2NhbFN5bmNEZWxheVN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvY2FsU3luY0RlbGF5ID0gTG9uZy5wYXJzZUxvbmcobG9jYWxTeW5jRGVsYXlTdHJpbmcpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgdXNlIGRlZmF1bHQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMT0NBTF9TWU5DX0RFTEFZID0gbG9jYWxTeW5jRGVsYXk7Ci0KLSAgICAgICAgU3RyaW5nIG1heFRpbWVQZXJTeW5jU3RyaW5nID0gU3lzdGVtUHJvcGVydGllcy5nZXQoInN5bmMubWF4X3RpbWVfcGVyX3N5bmMiKTsKLSAgICAgICAgbG9uZyBtYXhUaW1lUGVyU3luYyA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlcwotICAgICAgICBpZiAobWF4VGltZVBlclN5bmNTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtYXhUaW1lUGVyU3luYyA9IExvbmcucGFyc2VMb25nKG1heFRpbWVQZXJTeW5jU3RyaW5nKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIHVzZSBkZWZhdWx0Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTUFYX1RJTUVfUEVSX1NZTkMgPSBtYXhUaW1lUGVyU3luYzsKKyAgICAgICAgTUFYX1NJTVVMVEFORU9VU19JTklUSUFMSVpBVElPTl9TWU5DUyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KCJzeW5jLm1heF9pbml0X3N5bmNzIiwgNSk7CisgICAgICAgIE1BWF9TSU1VTFRBTkVPVVNfUkVHVUxBUl9TWU5DUyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KCJzeW5jLm1heF9yZWd1bGFyX3N5bmNzIiwgMik7CisgICAgICAgIExPQ0FMX1NZTkNfREVMQVkgPQorICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuZ2V0TG9uZygic3luYy5sb2NhbF9zeW5jX2RlbGF5IiwgMzAgKiAxMDAwIC8qIDMwIHNlY29uZHMgKi8pOworICAgICAgICBNQVhfVElNRV9QRVJfU1lOQyA9CisgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5nZXRMb25nKCJzeW5jLm1heF90aW1lX3Blcl9zeW5jIiwgNSAqIDYwICogMTAwMCAvKiA1IG1pbnV0ZXMgKi8pOworICAgICAgICBTWU5DX05PVElGSUNBVElPTl9ERUxBWSA9CisgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5nZXRMb25nKCJzeW5jLm5vdGlmaWNhdGlvbl9kZWxheSIsIDMwICogMTAwMCAvKiAzMCBzZWNvbmRzICovKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNZTkNfTk9USUZJQ0FUSU9OX0RFTEFZID0gMzAgKiAxMDAwOyAvLyAzMCBzZWNvbmRzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTWU5DX05PVElGSUNBVElPTl9ERUxBWTsKIAogICAgIC8qKgogICAgICAqIFdoZW4gcmV0cnlpbmcgYSBzeW5jIGZvciB0aGUgZmlyc3QgdGltZSB1c2UgdGhpcyBkZWxheS4gQWZ0ZXIgdGhhdApAQCAtMTIwLDIyICsxMTMsMjEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMQVlfUkVUUllfU1lOQ19JTl9QUk9HUkVTU19JTl9TRUNPTkRTID0gMTA7CiAKLSAgICAvKioKLSAgICAgKiBBbiBlcnJvciBub3RpZmljYXRpb24gaXMgc2VudCBpZiBzeW5jIG9mIGFueSBvZiB0aGUgcHJvdmlkZXJzIGhhcyBiZWVuIGZhaWxpbmcgZm9yIHRoaXMgbG9uZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVSUk9SX05PVElGSUNBVElPTl9ERUxBWV9NUyA9IDEwMDAgKiA2MCAqIDEwOyAvLyAxMCBtaW51dGVzCi0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaQVRJT05fVU5CSU5EX0RFTEFZX01TID0gNTAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX1dBS0VfTE9DSyA9ICIqc3luYyoiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX1dBS0VfTE9DS19QUkVGSVggPSAiKnN5bmMqIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFX1NZTkNfQUxBUk1fV0FLRV9MT0NLID0gIlN5bmNNYW5hZ2VySGFuZGxlU3luY0FsYXJtIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19MT09QX1dBS0VfTE9DSyA9ICJTeW5jTG9vcFdha2VMb2NrIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU0lNVUxUQU5FT1VTX1JFR1VMQVJfU1lOQ1M7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TSU1VTFRBTkVPVVNfSU5JVElBTElaQVRJT05fU1lOQ1M7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIHZvbGF0aWxlIEFjY291bnRbXSBtQWNjb3VudHMgPSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZOwogCi0gICAgdm9sYXRpbGUgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVN5bmNXYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtSGFuZGxlQWxhcm1XYWtlTG9jazsKKyAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtU3luY01hbmFnZXJXYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbURhdGFDb25uZWN0aW9uSXNDb25uZWN0ZWQgPSBmYWxzZTsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbVN0b3JhZ2VJc0xvdyA9IGZhbHNlOwogCkBAIC0xNDUsMTAgKzEzNyw4IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTeW5jU3RvcmFnZUVuZ2luZSBtU3luY1N0b3JhZ2VFbmdpbmU7CiAgICAgcHVibGljIGZpbmFsIFN5bmNRdWV1ZSBtU3luY1F1ZXVlOwogCi0gICAgcHJpdmF0ZSBBY3RpdmVTeW5jQ29udGV4dCBtQWN0aXZlU3luY0NvbnRleHQgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEFjdGl2ZVN5bmNDb250ZXh0PiBtQWN0aXZlU3luY0NvbnRleHRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CiAKLSAgICAvLyBzZXQgaWYgdGhlIHN5bmMgZXJyb3IgaW5kaWNhdG9yIHNob3VsZCBiZSByZXBvcnRlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRTeW5jRXJyb3JOb3RpZmljYXRpb24gPSBmYWxzZTsKICAgICAvLyBzZXQgaWYgdGhlIHN5bmMgYWN0aXZlIGluZGljYXRvciBzaG91bGQgYmUgcmVwb3J0ZWQKICAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRTeW5jQWN0aXZlTm90aWZpY2F0aW9uID0gZmFsc2U7CiAKQEAgLTE5Niw2ICsxODYsMTEgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY291bnRbXSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZID0gbmV3IEFjY291bnRbMF07CiAKKyAgICBwcml2YXRlIGZpbmFsIFBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTWU5DX0FMQVJNX1RJTUVPVVRfTUlOID0gMzAgKiAxMDAwOyAvLyAzMCBzZWNvbmRzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTWU5DX0FMQVJNX1RJTUVPVVRfTUFYID0gMiAqIDYwICogNjAgKiAxMDAwOyAvLyB0d28gaG91cnMKKwogICAgIHB1YmxpYyB2b2lkIG9uQWNjb3VudHNVcGRhdGVkKEFjY291bnRbXSBhY2NvdW50cykgewogICAgICAgICAvLyByZW1lbWJlciBpZiB0aGlzIHdhcyB0aGUgZmlyc3QgdGltZSB0aGlzIHdhcyBjYWxsZWQgYWZ0ZXIgYW4gdXBkYXRlCiAgICAgICAgIGZpbmFsIGJvb2xlYW4ganVzdEJvb3RlZFVwID0gbUFjY291bnRzID09IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7CkBAIC0yMDMsMTEgKzE5OCwxMCBAQAogCiAgICAgICAgIC8vIGlmIGEgc3luYyBpcyBpbiBwcm9ncmVzcyB5ZXQgaXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBhY2NvdW50cyBsaXN0LAogICAgICAgICAvLyBjYW5jZWwgaXQKLSAgICAgICAgQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQgPSBtQWN0aXZlU3luY0NvbnRleHQ7Ci0gICAgICAgIGlmIChhY3RpdmVTeW5jQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIUFycmF5VXRpbHMuY29udGFpbnMoYWNjb3VudHMsIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmFjY291bnQpKSB7CisgICAgICAgIGZvciAoQWN0aXZlU3luY0NvbnRleHQgY3VycmVudFN5bmNDb250ZXh0IDogbUFjdGl2ZVN5bmNDb250ZXh0cykgeworICAgICAgICAgICAgaWYgKCFBcnJheVV0aWxzLmNvbnRhaW5zKGFjY291bnRzLCBjdXJyZW50U3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYWNjb3VudCkpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjYW5jZWxpbmcgc3luYyBzaW5jZSB0aGUgYWNjb3VudCBoYXMgYmVlbiByZW1vdmVkIik7Ci0gICAgICAgICAgICAgICAgc2VuZFN5bmNGaW5pc2hlZE9yQ2FuY2VsZWRNZXNzYWdlKGFjdGl2ZVN5bmNDb250ZXh0LAorICAgICAgICAgICAgICAgIHNlbmRTeW5jRmluaXNoZWRPckNhbmNlbGVkTWVzc2FnZShjdXJyZW50U3luY0NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIG5vIHJlc3VsdCBzaW5jZSB0aGlzIGlzIGEgY2FuY2VsICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjM0LDYgKzIyOCw3IEBACiAgICAgICAgICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgYm9vdHVwIGNhc2UgdGhlbiBkb24ndCBzeW5jIGV2ZXJ5dGhpbmcsIGluc3RlYWQgb25seQogICAgICAgICAgICAgLy8gc3luYyB0aG9zZSB0aGF0IGhhdmUgYW4gdW5rbm93biBzeW5jYWJsZSBzdGF0ZSwgd2hpY2ggd2lsbCBnaXZlIHRoZW0KICAgICAgICAgICAgIC8vIGEgY2hhbmNlIHRvIHNldCB0aGVpciBzeW5jYWJsZSBzdGF0ZS4KKwogICAgICAgICAgICAgYm9vbGVhbiBvbmx5VGhvc2VXaXRoVW5rb3duU3luY2FibGVTdGF0ZSA9IGp1c3RCb290ZWRVcDsKICAgICAgICAgICAgIHNjaGVkdWxlU3luYyhudWxsLCBudWxsLCBudWxsLCAwIC8qIG5vIGRlbGF5ICovLCBvbmx5VGhvc2VXaXRoVW5rb3duU3luY2FibGVTdGF0ZSk7CiAgICAgICAgIH0KQEAgLTM1NywxOCArMzUyLDI1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWdyID0gbnVsbDsKICAgICAgICAgfQotICAgICAgICBQb3dlck1hbmFnZXIgcG0gPSAoUG93ZXJNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKLSAgICAgICAgbVN5bmNXYWtlTG9jayA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgU1lOQ19XQUtFX0xPQ0spOwotICAgICAgICBtU3luY1dha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICBtUG93ZXJNYW5hZ2VyID0gKFBvd2VyTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CiAKICAgICAgICAgLy8gVGhpcyBXYWtlTG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHdlIHN0YXkgYXdha2UgYmV0d2VlbiB0aGUgdGltZSB0aGF0IHdlIHJlY2VpdmUKICAgICAgICAgLy8gYSBzeW5jIGFsYXJtIG5vdGlmaWNhdGlvbiBhbmQgd2hlbiB3ZSBmaW5pc2ggcHJvY2Vzc2luZyBpdC4gV2UgbmVlZCB0byBkbyB0aGlzCiAgICAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgZG8gdGhlIHdvcmsgaW4gdGhlIGFsYXJtIGhhbmRsZXIsIHJhdGhlciB3ZSBkbyBpdCBpbiBhIG1lc3NhZ2UKICAgICAgICAgLy8gaGFuZGxlci4KLSAgICAgICAgbUhhbmRsZUFsYXJtV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCisgICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrID0gbVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgSEFORExFX1NZTkNfQUxBUk1fV0FLRV9MT0NLKTsKICAgICAgICAgbUhhbmRsZUFsYXJtV2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CiAKKyAgICAgICAgLy8gVGhpcyBXYWtlTG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHdlIHN0YXkgYXdha2Ugd2hpbGUgcnVubmluZyB0aGUgc3luYyBsb29wCisgICAgICAgIC8vIG1lc3NhZ2UgaGFuZGxlci4gTm9ybWFsbHkgd2Ugd2lsbCBob2xkIGEgc3luYyBhZGFwdGVyIHdha2UgbG9jayB3aGlsZSBpdCBpcyBiZWluZworICAgICAgICAvLyBzeW5jZWQgYnV0IGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzeW5jIGxvb3AgaXQgbWlnaHQgZmluaXNoIGEgc3luYyBmb3IKKyAgICAgICAgLy8gb25lIHN5bmMgYWRhcHRlciBiZWZvcmUgc3RhcnRpbmcgdGhlIHN5bmMgZm9yIHRoZSBvdGhlciBzeW5jIGFkYXB0ZXIgYW5kIHdlCisgICAgICAgIC8vIGRvbid0IHdhbnQgdGhlIGRldmljZSB0byBnbyB0byBzbGVlcCBkdXJpbmcgdGhhdCB3aW5kb3cuCisgICAgICAgIG1TeW5jTWFuYWdlcldha2VMb2NrID0gbVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCisgICAgICAgICAgICAgICAgU1lOQ19MT09QX1dBS0VfTE9DSyk7CisgICAgICAgIG1TeW5jTWFuYWdlcldha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworCiAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5hZGRTdGF0dXNDaGFuZ2VMaXN0ZW5lcigKICAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIuU1lOQ19PQlNFUlZFUl9UWVBFX1NFVFRJTkdTLCBuZXcgSVN5bmNTdGF0dXNPYnNlcnZlci5TdHViKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGF0dXNDaGFuZ2VkKGludCB3aGljaCkgewpAQCAtNDI1LDggKzQyNyw4IEBACiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIGludGVudC5zZXRBY3Rpb24oImFuZHJvaWQuY29udGVudC5TeW5jQWRhcHRlciIpOwogICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KHN5bmNBZGFwdGVySW5mby5jb21wb25lbnROYW1lKTsKLSAgICAgICAgaWYgKCFtQ29udGV4dC5iaW5kU2VydmljZShpbnRlbnQsIG5ldyBJbml0aWFsaXplclNlcnZpY2VDb25uZWN0aW9uKGFjY291bnQsIGF1dGhvcml0eSwgbUNvbnRleHQsCi0gICAgICAgICAgICAgICAgbU1haW5IYW5kbGVyKSwKKyAgICAgICAgaWYgKCFtQ29udGV4dC5iaW5kU2VydmljZShpbnRlbnQsCisgICAgICAgICAgICAgICAgbmV3IEluaXRpYWxpemVyU2VydmljZUNvbm5lY3Rpb24oYWNjb3VudCwgYXV0aG9yaXR5LCBtQ29udGV4dCwgbU1haW5IYW5kbGVyKSwKICAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUgfCBDb250ZXh0LkJJTkRfTk9UX0ZPUkVHUk9VTkQpKSB7CiAgICAgICAgICAgICBMb2cudyhUQUcsICJpbml0aWFsaXplU3luY0FkYXB0ZXI6IGZhaWxlZCB0byBiaW5kIHRvICIgKyBpbnRlbnQpOwogICAgICAgICB9CkBAIC01MDYsOCArNTA4LDggQEAKICAgICAgKiBAcGFyYW0gcmVxdWVzdGVkQWNjb3VudCB0aGUgYWNjb3VudCB0byBzeW5jLCBtYXkgYmUgbnVsbCB0byBzaWduaWZ5IGFsbCBhY2NvdW50cwogICAgICAqIEBwYXJhbSByZXF1ZXN0ZWRBdXRob3JpdHkgdGhlIGF1dGhvcml0eSB0byBzeW5jLCBtYXkgYmUgbnVsbCB0byBpbmRpY2F0ZSBhbGwgYXV0aG9yaXRpZXMKICAgICAgKiBAcGFyYW0gZXh0cmFzIGEgTWFwIG9mIFN5bmNBZGFwdGVyLXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGNvbnRyb2wKLSogICAgICAgICAgc3luY3Mgb2YgYSBzcGVjaWZpYyBwcm92aWRlci4gQ2FuIGJlIG51bGwuIElzIGlnbm9yZWQKLSogICAgICAgICAgaWYgdGhlIHVybCBpcyBudWxsLgorICAgICAqICAgICAgICAgIHN5bmNzIG9mIGEgc3BlY2lmaWMgcHJvdmlkZXIuIENhbiBiZSBudWxsLiBJcyBpZ25vcmVkCisgICAgICogICAgICAgICAgaWYgdGhlIHVybCBpcyBudWxsLgogICAgICAqIEBwYXJhbSBkZWxheSBob3cgbWFueSBtaWxsaXNlY29uZHMgaW4gdGhlIGZ1dHVyZSB0byB3YWl0IGJlZm9yZSBwZXJmb3JtaW5nIHRoaXMKICAgICAgKiBAcGFyYW0gb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUKICAgICAgKi8KQEAgLTYxMSwxNiArNjEzLDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0xvZ2dhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJzY2hlZHVsZVN5bmM6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGVsYXkgIiArIGRlbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc291cmNlICIgKyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBhY2NvdW50ICIgKyBhY2NvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYXV0aG9yaXR5ICIgKyBhdXRob3JpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBleHRyYXMgIiArIGV4dHJhcyk7CisgICAgICAgICAgICAgICAgICAgIFBhaXI8TG9uZywgTG9uZz4gYmFja29mZiA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRCYWNrb2ZmKGFjY291bnQsIGF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgZGVsYXlVbnRpbCA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXREZWxheVVudGlsVGltZShhY2NvdW50LCBhdXRob3JpdHkpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGJhY2tvZmZUaW1lID0gYmFja29mZiAhPSBudWxsID8gYmFja29mZi5maXJzdCA6IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1N5bmNhYmxlIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIG5ld0V4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V4dHJhcy5wdXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19JTklUSUFMSVpFLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudCwgc291cmNlLCBhdXRob3JpdHksIG5ld0V4dHJhcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrb2ZmVGltZSwgZGVsYXlVbnRpbCkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY09wZXJhdGlvbihhY2NvdW50LCBzb3VyY2UsIGF1dGhvcml0eSwgZXh0cmFzLCBkZWxheSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInNjaGVkdWxlU3luYzoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGVsYXkgIiArIGRlbGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNvdXJjZSAiICsgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGFjY291bnQgIiArIGFjY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYXV0aG9yaXR5ICIgKyBhdXRob3JpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZXh0cmFzICIgKyBleHRyYXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY09wZXJhdGlvbihhY2NvdW50LCBzb3VyY2UsIGF1dGhvcml0eSwgZXh0cmFzLCBkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrb2ZmVGltZSwgZGVsYXlVbnRpbCkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02MzQsNyArNjQ5LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgU3luY0FkYXB0ZXJUeXBlW10gZ2V0U3luY0FkYXB0ZXJUeXBlcygpIHsKLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxSZWdpc3RlcmVkU2VydmljZXNDYWNoZS5TZXJ2aWNlSW5mbzxTeW5jQWRhcHRlclR5cGU+PiBzZXJ2aWNlSW5mb3MgPQorICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFJlZ2lzdGVyZWRTZXJ2aWNlc0NhY2hlLlNlcnZpY2VJbmZvPFN5bmNBZGFwdGVyVHlwZT4+CisgICAgICAgICAgICAgICAgc2VydmljZUluZm9zID0KICAgICAgICAgICAgICAgICBtU3luY0FkYXB0ZXJzLmdldEFsbFNlcnZpY2VzKCk7CiAgICAgICAgIFN5bmNBZGFwdGVyVHlwZVtdIHR5cGVzID0gbmV3IFN5bmNBZGFwdGVyVHlwZVtzZXJ2aWNlSW5mb3Muc2l6ZSgpXTsKICAgICAgICAgaW50IGkgPSAwOwpAQCAtNjY0LDYgKzY4MCwxNCBAQAogICAgICAgICBtU3luY0hhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgc2VuZENhbmNlbFN5bmNzTWVzc2FnZShmaW5hbCBBY2NvdW50IGFjY291bnQsIGZpbmFsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSBMb2cudihUQUcsICJzZW5kaW5nIE1FU1NBR0VfQ0FOQ0VMIik7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbVN5bmNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKKyAgICAgICAgbXNnLndoYXQgPSBTeW5jSGFuZGxlci5NRVNTQUdFX0NBTkNFTDsKKyAgICAgICAgbXNnLm9iaiA9IFBhaXIuY3JlYXRlKGFjY291bnQsIGF1dGhvcml0eSk7CisgICAgICAgIG1TeW5jSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOworICAgIH0KKwogICAgIGNsYXNzIFN5bmNIYW5kbGVyTWVzc2FnZVBheWxvYWQgewogICAgICAgICBwdWJsaWMgZmluYWwgQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQ7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBTeW5jUmVzdWx0IHN5bmNSZXN1bHQ7CkBAIC02ODEsMTEgKzcwNSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgY2xlYXJCYWNrb2ZmU2V0dGluZyhTeW5jT3BlcmF0aW9uIG9wKSB7Ci0gICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRCYWNrb2ZmKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5OT1RfSU5fQkFDS09GRl9NT0RFLCBTeW5jU3RvcmFnZUVuZ2luZS5OT1RfSU5fQkFDS09GRl9NT0RFKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgaW5jcmVhc2VCYWNrb2ZmU2V0dGluZyhTeW5jT3BlcmF0aW9uIG9wKSB7CiAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAKQEAgLTcxMSw2ICs3MzAsOSBAQAogCiAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRCYWNrb2ZmKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSwKICAgICAgICAgICAgICAgICBub3cgKyBuZXdEZWxheUluTXMsIG5ld0RlbGF5SW5Ncyk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSkgeworICAgICAgICAgICAgbVN5bmNRdWV1ZS5vbkJhY2tvZmZDaGFuZ2VkKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSwgbm93ICsgbmV3RGVsYXlJbk1zKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXREZWxheVVudGlsVGltZShTeW5jT3BlcmF0aW9uIG9wLCBsb25nIGRlbGF5VW50aWxTZWNvbmRzKSB7CkBAIC03MjMsNiArNzQ1LDkgQEAKICAgICAgICAgICAgIG5ld0RlbGF5VW50aWxUaW1lID0gMDsKICAgICAgICAgfQogICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0RGVsYXlVbnRpbFRpbWUob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5LCBuZXdEZWxheVVudGlsVGltZSk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSkgeworICAgICAgICAgICAgbVN5bmNRdWV1ZS5vbkRlbGF5VW50aWxUaW1lQ2hhbmdlZChvcC5hY2NvdW50LCBvcC5hdXRob3JpdHksIG5ld0RlbGF5VW50aWxUaW1lKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtNzMxLDIzICs3NTYsNyBAQAogICAgICAqIEBwYXJhbSBhdXRob3JpdHkgbGltaXQgdGhlIGNhbmNlbGF0aW9ucyB0byBzeW5jcyB3aXRoIHRoaXMgYXV0aG9yaXR5LCBpZiBub24tbnVsbAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNhbmNlbEFjdGl2ZVN5bmMoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7Ci0gICAgICAgIEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0ID0gbUFjdGl2ZVN5bmNDb250ZXh0OwotICAgICAgICBpZiAoYWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaWYgYW4gYXV0aG9yaXR5IHdhcyBzcGVjaWZpZWQgdGhlbiBvbmx5IGNhbmNlbCB0aGUgc3luYyBpZiBpdCBtYXRjaGVzCi0gICAgICAgICAgICBpZiAoYWNjb3VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50LmVxdWFscyhhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgYW4gYWNjb3VudCB3YXMgc3BlY2lmaWVkIHRoZW4gb25seSBjYW5jZWwgdGhlIHN5bmMgaWYgaXQgbWF0Y2hlcwotICAgICAgICAgICAgaWYgKGF1dGhvcml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhdXRob3JpdHkuZXF1YWxzKGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmF1dGhvcml0eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRTeW5jRmluaXNoZWRPckNhbmNlbGVkTWVzc2FnZShhY3RpdmVTeW5jQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBubyByZXN1bHQgc2luY2UgdGhpcyBpcyBhIGNhbmNlbCAqLyk7Ci0gICAgICAgIH0KKyAgICAgICAgc2VuZENhbmNlbFN5bmNzTWVzc2FnZShhY2NvdW50LCBhdXRob3JpdHkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzU2LDIyICs3NjUsNiBAQAogICAgICAqIEBwYXJhbSBzeW5jT3BlcmF0aW9uIHRoZSBTeW5jT3BlcmF0aW9uIHRvIHNjaGVkdWxlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKFN5bmNPcGVyYXRpb24gc3luY09wZXJhdGlvbikgewotICAgICAgICAvLyBJZiB0aGlzIG9wZXJhdGlvbiBpcyBleHBlZGl0ZWQgYW5kIHRoZXJlIGlzIGEgc3luYyBpbiBwcm9ncmVzcyB0aGVuCi0gICAgICAgIC8vIHJlc2NoZWR1bGUgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIGFuZCBzZW5kIGEgY2FuY2VsIGZvciBpdC4KLSAgICAgICAgZmluYWwgQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQgPSBtQWN0aXZlU3luY0NvbnRleHQ7Ci0gICAgICAgIGlmIChzeW5jT3BlcmF0aW9uLmV4cGVkaXRlZCAmJiBhY3RpdmVTeW5jQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1NhbWVLZXkgPQotICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5rZXkuZXF1YWxzKHN5bmNPcGVyYXRpb24ua2V5KTsKLSAgICAgICAgICAgIC8vIFRoaXMgcmVxdWVzdCBpcyBleHBlZGl0ZWQgYW5kIHRoZXJlIGlzIGEgc3luYyBpbiBwcm9ncmVzcy4KLSAgICAgICAgICAgIC8vIEludGVycnVwdCB0aGUgY3VycmVudCBzeW5jIG9ubHkgaWYgaXQgaXMgbm90IGV4cGVkaXRlZCBhbmQgaWYgaXQgaGFzIGEgZGlmZmVyZW50Ci0gICAgICAgICAgICAvLyBrZXkgdGhhbiB0aGUgb25lIHdlIGFyZSBzY2hlZHVsaW5nLgotICAgICAgICAgICAgaWYgKCFhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5leHBlZGl0ZWQgJiYgIWhhc1NhbWVLZXkpIHsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24obmV3IFN5bmNPcGVyYXRpb24oYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICBzZW5kU3luY0ZpbmlzaGVkT3JDYW5jZWxlZE1lc3NhZ2UoYWN0aXZlU3luY0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIG5vIHJlc3VsdCBzaW5jZSB0aGlzIGlzIGEgY2FuY2VsICovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIGJvb2xlYW4gcXVldWVDaGFuZ2VkOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKICAgICAgICAgICAgIHF1ZXVlQ2hhbmdlZCA9IG1TeW5jUXVldWUuYWRkKHN5bmNPcGVyYXRpb24pOwpAQCAtNzk2LDExICs3ODksMTEgQEAKICAgICAgKiBAcGFyYW0gYXV0aG9yaXR5IGxpbWl0IHRoZSByZW1vdmFscyB0byBvcGVyYXRpb25zIHdpdGggdGhpcyBhdXRob3JpdHksIGlmIG5vbi1udWxsCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJTY2hlZHVsZWRTeW5jT3BlcmF0aW9ucyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKLSAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEJhY2tvZmYoYWNjb3VudCwgYXV0aG9yaXR5LAotICAgICAgICAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLk5PVF9JTl9CQUNLT0ZGX01PREUsIFN5bmNTdG9yYWdlRW5naW5lLk5PVF9JTl9CQUNLT0ZGX01PREUpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKICAgICAgICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKGFjY291bnQsIGF1dGhvcml0eSk7CiAgICAgICAgIH0KKyAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEJhY2tvZmYoYWNjb3VudCwgYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLk5PVF9JTl9CQUNLT0ZGX01PREUsIFN5bmNTdG9yYWdlRW5naW5lLk5PVF9JTl9CQUNLT0ZGX01PREUpOwogICAgIH0KIAogICAgIHZvaWQgbWF5YmVSZXNjaGVkdWxlU3luYyhTeW5jUmVzdWx0IHN5bmNSZXN1bHQsIFN5bmNPcGVyYXRpb24gb3BlcmF0aW9uKSB7CkBAIC04MjcsNyArODIwLDggQEAKICAgICAgICAgaWYgKG9wZXJhdGlvbi5leHRyYXMuZ2V0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfRE9fTk9UX1JFVFJZLCBmYWxzZSkpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm5vdCByZXRyeWluZyBzeW5jIG9wZXJhdGlvbiBiZWNhdXNlIFNZTkNfRVhUUkFTX0RPX05PVF9SRVRSWSB3YXMgc3BlY2lmaWVkICIKICAgICAgICAgICAgICAgICAgICAgKyBvcGVyYXRpb24pOwotICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi5leHRyYXMuZ2V0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfVVBMT0FELCBmYWxzZSkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24uZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX1VQTE9BRCwgZmFsc2UpCisgICAgICAgICAgICAgICAgJiYgIXN5bmNSZXN1bHQuc3luY0FscmVhZHlJblByb2dyZXNzKSB7CiAgICAgICAgICAgICBvcGVyYXRpb24uZXh0cmFzLnJlbW92ZShDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfVVBMT0FEKTsKICAgICAgICAgICAgIExvZy5kKFRBRywgInJldHJ5aW5nIHN5bmMgb3BlcmF0aW9uIGFzIGEgdHdvLXdheSBzeW5jIGJlY2F1c2UgYW4gdXBsb2FkLW9ubHkgc3luYyAiCiAgICAgICAgICAgICAgICAgICAgICsgImVuY291bnRlcmVkIGFuIGVycm9yOiAiICsgb3BlcmF0aW9uKTsKQEAgLTg0OCw3ICs4NDIsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKG5ldyBTeW5jT3BlcmF0aW9uKG9wZXJhdGlvbi5hY2NvdW50LCBvcGVyYXRpb24uc3luY1NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmF1dGhvcml0eSwgb3BlcmF0aW9uLmV4dHJhcywKLSAgICAgICAgICAgICAgICAgICAgREVMQVlfUkVUUllfU1lOQ19JTl9QUk9HUkVTU19JTl9TRUNPTkRTICogMTAwMCkpOworICAgICAgICAgICAgICAgICAgICBERUxBWV9SRVRSWV9TWU5DX0lOX1BST0dSRVNTX0lOX1NFQ09ORFMgKiAxMDAwLAorICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYmFja29mZiwgb3BlcmF0aW9uLmRlbGF5VW50aWwpKTsKICAgICAgICAgfSBlbHNlIGlmIChzeW5jUmVzdWx0Lmhhc1NvZnRFcnJvcigpKSB7CiAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJldHJ5aW5nIHN5bmMgb3BlcmF0aW9uIGJlY2F1c2UgaXQgZW5jb3VudGVyZWQgYSBzb2Z0IGVycm9yOiAiCkBAIC04NzEsMTUgKzg2NiwzMyBAQAogICAgICAgICBmaW5hbCBsb25nIG1TdGFydFRpbWU7CiAgICAgICAgIGxvbmcgbVRpbWVvdXRTdGFydFRpbWU7CiAgICAgICAgIGJvb2xlYW4gbUJvdW5kOworICAgICAgICBmaW5hbCBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVN5bmNXYWtlTG9jazsKKyAgICAgICAgZmluYWwgaW50IG1TeW5jQWRhcHRlclVpZDsKKyAgICAgICAgU3luY0luZm8gbVN5bmNJbmZvOwogCi0gICAgICAgIHB1YmxpYyBBY3RpdmVTeW5jQ29udGV4dChTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgbG9uZyBoaXN0b3J5Um93SWQpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBBY3RpdmVTeW5jQ29udGV4dCBmb3IgYW4gaW1wZW5kaW5nIHN5bmMgYW5kIGdyYWIgdGhlIHdha2Vsb2NrIGZvciB0aGF0CisgICAgICAgICAqIHN5bmMgYWRhcHRlci4gU2luY2UgdGhpcyBncmFicyB0aGUgd2FrZWxvY2sgeW91IG5lZWQgdG8gYmUgc3VyZSB0byBjYWxsCisgICAgICAgICAqIGNsb3NlKCkgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIEFjdGl2ZVN5bmNDb250ZXh0LCB3aGV0aGVyIHRoZSBzeW5jIHN1Y2NlZWRlZAorICAgICAgICAgKiBvciBub3QuCisgICAgICAgICAqIEBwYXJhbSBzeW5jT3BlcmF0aW9uIHRoZSBTeW5jT3BlcmF0aW9uIHdlIGFyZSBhYm91dCB0byBzeW5jCisgICAgICAgICAqIEBwYXJhbSBoaXN0b3J5Um93SWQgdGhlIHJvdyBpbiB3aGljaCB0byByZWNvcmQgdGhlIGhpc3RvcnkgaW5mbyBmb3IgdGhpcyBzeW5jCisgICAgICAgICAqIEBwYXJhbSBzeW5jQWRhcHRlclVpZCB0aGUgVUlEIG9mIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBzeW5jIGFkYXB0ZXIKKyAgICAgICAgICogZm9yIHRoaXMgc3luYy4gVGhpcyBpcyB1c2VkIHRvIGF0dHJpYnV0ZSB0aGUgd2FrZWxvY2sgaG9sZCB0byB0aGF0IGFwcGxpY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFjdGl2ZVN5bmNDb250ZXh0KFN5bmNPcGVyYXRpb24gc3luY09wZXJhdGlvbiwgbG9uZyBoaXN0b3J5Um93SWQsCisgICAgICAgICAgICAgICAgaW50IHN5bmNBZGFwdGVyVWlkKSB7CiAgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgbVN5bmNBZGFwdGVyVWlkID0gc3luY0FkYXB0ZXJVaWQ7CiAgICAgICAgICAgICBtU3luY09wZXJhdGlvbiA9IHN5bmNPcGVyYXRpb247CiAgICAgICAgICAgICBtSGlzdG9yeVJvd0lkID0gaGlzdG9yeVJvd0lkOwogICAgICAgICAgICAgbVN5bmNBZGFwdGVyID0gbnVsbDsKICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgICAgIG1UaW1lb3V0U3RhcnRUaW1lID0gbVN0YXJ0VGltZTsKKyAgICAgICAgICAgIG1TeW5jV2FrZUxvY2sgPSBtU3luY0hhbmRsZXIuZ2V0U3luY1dha2VMb2NrKAorICAgICAgICAgICAgICAgICAgICBtU3luY09wZXJhdGlvbi5hY2NvdW50LnR5cGUsIG1TeW5jT3BlcmF0aW9uLmF1dGhvcml0eSk7CisgICAgICAgICAgICBtU3luY1dha2VMb2NrLnNldFdvcmtTb3VyY2UobmV3IFdvcmtTb3VyY2Uoc3luY0FkYXB0ZXJVaWQpKTsKKyAgICAgICAgICAgIG1TeW5jV2FrZUxvY2suYWNxdWlyZSgpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2VuZEhlYXJ0YmVhdCgpIHsKQEAgLTg4Nyw2ICs5MDAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2hlZChTeW5jUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSBMb2cudihUQUcsICJvbkZpbmlzaGVkOiAiICsgdGhpcyk7CiAgICAgICAgICAgICAvLyBpbmNsdWRlICJ0aGlzIiBpbiB0aGUgbWVzc2FnZSBzbyB0aGF0IHRoZSBoYW5kbGVyIGNhbiBpZ25vcmUgaXQgaWYgdGhpcwogICAgICAgICAgICAgLy8gQWN0aXZlU3luY0NvbnRleHQgaXMgbm8gbG9uZ2VyIHRoZSBtQWN0aXZlU3luY0NvbnRleHQgYXQgbWVzc2FnZSBoYW5kbGluZwogICAgICAgICAgICAgLy8gdGltZQpAQCAtOTM0LDYgKzk0OCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIGJpbmRSZXN1bHQ7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgdGhlIHJlcXVpcmVkIGNsZWFudXAsIHdoaWNoIGlzIHRoZSByZWxlYXNpbmcgb2YgdGhlIHdha2Vsb2NrIGFuZAorICAgICAgICAgKiB1bmJpbmRpbmcgZnJvbSB0aGUgc3luYyBhZGFwdGVyIChpZiBhY3R1YWxseSBib3VuZCkuCisgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZSgpIHsKICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInVuQmluZEZyb21TeW5jQWRhcHRlcjogY29ubmVjdGlvbiAiICsgdGhpcyk7CkBAIC05NDIsNiArOTYwLDggQEAKICAgICAgICAgICAgICAgICBtQm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKHRoaXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5zZXRXb3JrU291cmNlKG51bGwpOworICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5yZWxlYXNlKCk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTEwMDEsNjIgKzEwMjEsMjggQEAKICAgICAgICAgICAgIHB3LnByaW50bG4oIm5vIGFsYXJtIGlzIHNjaGVkdWxlZCAodGhlcmUgaGFkIGJldHRlciBub3QgYmUgYW55IHBlbmRpbmcgc3luY3MpIik7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBTeW5jTWFuYWdlci5BY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCA9IG1BY3RpdmVTeW5jQ29udGV4dDsKLQotICAgICAgICBwdy5wcmludCgiYWN0aXZlIHN5bmM6ICIpOyBwdy5wcmludGxuKGFjdGl2ZVN5bmNDb250ZXh0KTsKLQogICAgICAgICBwdy5wcmludCgibm90aWZpY2F0aW9uIGluZm86ICIpOwogICAgICAgICBzYi5zZXRMZW5ndGgoMCk7CiAgICAgICAgIG1TeW5jSGFuZGxlci5tU3luY05vdGlmaWNhdGlvbkluZm8udG9TdHJpbmcoc2IpOwogICAgICAgICBwdy5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwogCisgICAgICAgIHB3LnByaW50bG4oKTsKKyAgICAgICAgcHcucHJpbnRsbigiQWN0aXZlIFN5bmNzOiAiICsgbUFjdGl2ZVN5bmNDb250ZXh0cy5zaXplKCkpOworICAgICAgICBmb3IgKFN5bmNNYW5hZ2VyLkFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0IDogbUFjdGl2ZVN5bmNDb250ZXh0cykgeworICAgICAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbkluU2Vjb25kcyA9IChub3cgLSBhY3RpdmVTeW5jQ29udGV4dC5tU3RhcnRUaW1lKSAvIDEwMDA7CisgICAgICAgICAgICBwdy5wcmludCgiICAiKTsKKyAgICAgICAgICAgIHB3LnByaW50KERhdGVVdGlscy5mb3JtYXRFbGFwc2VkVGltZShkdXJhdGlvbkluU2Vjb25kcykpOworICAgICAgICAgICAgcHcucHJpbnQoIiAtICIpOworICAgICAgICAgICAgcHcucHJpbnQoYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uZHVtcChmYWxzZSkpOworICAgICAgICAgICAgcHcucHJpbnRsbigpOworICAgICAgICB9CisKICAgICAgICAgc3luY2hyb25pemVkIChtU3luY1F1ZXVlKSB7Ci0gICAgICAgICAgICBwdy5wcmludCgic3luYyBxdWV1ZTogIik7CiAgICAgICAgICAgICBzYi5zZXRMZW5ndGgoMCk7CiAgICAgICAgICAgICBtU3luY1F1ZXVlLmR1bXAoc2IpOwotICAgICAgICAgICAgcHcucHJpbnRsbihzYi50b1N0cmluZygpKTsKICAgICAgICAgfQotCi0gICAgICAgIFN5bmNJbmZvIGFjdGl2ZSA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRDdXJyZW50U3luYygpOwotICAgICAgICBpZiAoYWN0aXZlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLkF1dGhvcml0eUluZm8gYXV0aG9yaXR5Ci0gICAgICAgICAgICAgICAgICAgID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldEF1dGhvcml0eShhY3RpdmUuYXV0aG9yaXR5SWQpOwotICAgICAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbkluU2Vjb25kcyA9IChub3cgLSBhY3RpdmUuc3RhcnRUaW1lKSAvIDEwMDA7Ci0gICAgICAgICAgICBwdy5wcmludCgiQWN0aXZlIHN5bmM6ICIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludChhdXRob3JpdHkgIT0gbnVsbCA/IGF1dGhvcml0eS5hY2NvdW50IDogIjxubyBhY2NvdW50PiIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiICIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludChhdXRob3JpdHkgIT0gbnVsbCA/IGF1dGhvcml0eS5hdXRob3JpdHkgOiAiPG5vIGFjY291bnQ+Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTeW5jQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFU1sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uc3luY1NvdXJjZV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIsIGR1cmF0aW9uIGlzICIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKERhdGVVdGlscy5mb3JtYXRFbGFwc2VkVGltZShkdXJhdGlvbkluU2Vjb25kcykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHcucHJpbnRsbigiTm8gc3luYyBpcyBpbiBwcm9ncmVzcy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdDxTeW5jU3RvcmFnZUVuZ2luZS5QZW5kaW5nT3BlcmF0aW9uPiBvcHMKLSAgICAgICAgICAgICAgICA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRQZW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgICBpZiAob3BzICE9IG51bGwgJiYgb3BzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIlBlbmRpbmcgU3luY3MiKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBOID0gb3BzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5QZW5kaW5nT3BlcmF0aW9uIG9wID0gb3BzLmdldChpKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludCgiICAjIik7IHB3LnByaW50KGkpOyBwdy5wcmludCgiOiBhY2NvdW50PSIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KG9wLmFjY291bnQubmFtZSk7IHB3LnByaW50KCI6Iik7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQob3AuYWNjb3VudC50eXBlKTsgcHcucHJpbnQoIiBhdXRob3JpdHk9Iik7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQob3AuYXV0aG9yaXR5KTsgcHcucHJpbnQoIiBleHBlZGl0ZWQ9Iik7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbihvcC5leHBlZGl0ZWQpOwotICAgICAgICAgICAgICAgIGlmIChvcC5leHRyYXMgIT0gbnVsbCAmJiBvcC5leHRyYXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzYi5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgICAgIFN5bmNPcGVyYXRpb24uZXh0cmFzVG9TdHJpbmdCdWlsZGVyKG9wLmV4dHJhcywgc2IsIGZhbHNlIC8qIGFzS2V5ICovKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgICBleHRyYXM6ICIpOyBwdy5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBwdy5wcmludGxuKCk7CisgICAgICAgIHB3LnByaW50KHNiLnRvU3RyaW5nKCkpOwogCiAgICAgICAgIC8vIGpvaW4gdGhlIGluc3RhbGxlZCBzeW5jIGFkYXB0ZXIgd2l0aCB0aGUgYWNjb3VudHMgbGlzdCBhbmQgZW1pdCBmb3IgZXZlcnl0aGluZwogICAgICAgICBwdy5wcmludGxuKCk7CkBAIC0xMjU5LDcgKzEyNDUsNyBAQAogCiAgICAgICAgIC8qKiBDYWxsIHRvIGxldCB0aGUgdHJhY2tlciBrbm93IHRoYXQgdGhlIHN5bmMgc3RhdGUgbWF5IGhhdmUgY2hhbmdlZCAqLwogICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlKCkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N5bmNJblByb2dyZXNzID0gbUFjdGl2ZVN5bmNDb250ZXh0ICE9IG51bGw7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU3luY0luUHJvZ3Jlc3MgPSAhbUFjdGl2ZVN5bmNDb250ZXh0cy5pc0VtcHR5KCk7CiAgICAgICAgICAgICBpZiAoaXNTeW5jSW5Qcm9ncmVzcyA9PSBtTGFzdFdhc1N5bmNpbmcpIHJldHVybjsKICAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAgICAgICAgICAgICBpZiAoaXNTeW5jSW5Qcm9ncmVzcykgewpAQCAtMTI5OSwxNCArMTI4NSwxNCBAQAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9DSEVDS19BTEFSTVMgPSAzOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVJWSUNFX0NPTk5FQ1RFRCA9IDQ7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFUlZJQ0VfRElTQ09OTkVDVEVEID0gNTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfQ0FOQ0VMID0gNjsKIAogICAgICAgICBwdWJsaWMgZmluYWwgU3luY05vdGlmaWNhdGlvbkluZm8gbVN5bmNOb3RpZmljYXRpb25JbmZvID0gbmV3IFN5bmNOb3RpZmljYXRpb25JbmZvKCk7CiAgICAgICAgIHByaXZhdGUgTG9uZyBtQWxhcm1TY2hlZHVsZVRpbWUgPSBudWxsOwogICAgICAgICBwdWJsaWMgZmluYWwgU3luY1RpbWVUcmFja2VyIG1TeW5jVGltZVRyYWNrZXIgPSBuZXcgU3luY1RpbWVUcmFja2VyKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgUG93ZXJNYW5hZ2VyLldha2VMb2NrPiBtV2FrZUxvY2tzID0KKyAgICAgICAgICAgICAgICBNYXBzLm5ld0hhc2hNYXAoKTsKIAotICAgICAgICAvLyB1c2VkIHRvIHRyYWNrIGlmIHdlIGhhdmUgaW5zdGFsbGVkIHRoZSBlcnJvciBub3RpZmljYXRpb24gc28gdGhhdCB3ZSBkb24ndCByZWluc3RhbGwKLSAgICAgICAgLy8gaXQgaWYgc3luYyBpcyBzdGlsbCBmYWlsaW5nCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRXJyb3JOb3RpZmljYXRpb25JbnN0YWxsZWQgPSBmYWxzZTsKICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb3VudERvd25MYXRjaCBtUmVhZHlUb1J1bkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgICAgICBwdWJsaWMgdm9pZCBvbkJvb3RDb21wbGV0ZWQoKSB7CiAgICAgICAgICAgICBtQm9vdENvbXBsZXRlZCA9IHRydWU7CkBAIC0xMzE2LDYgKzEzMDIsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIGdldFN5bmNXYWtlTG9jayhTdHJpbmcgYWNjb3VudFR5cGUsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHdha2VMb2NrS2V5ID0gUGFpci5jcmVhdGUoYWNjb3VudFR5cGUsIGF1dGhvcml0eSk7CisgICAgICAgICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgd2FrZUxvY2sgPSBtV2FrZUxvY2tzLmdldCh3YWtlTG9ja0tleSk7CisgICAgICAgICAgICBpZiAod2FrZUxvY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gU1lOQ19XQUtFX0xPQ0tfUFJFRklYICsgIl8iICsgYXV0aG9yaXR5ICsgIl8iICsgYWNjb3VudFR5cGU7CisgICAgICAgICAgICAgICAgd2FrZUxvY2sgPSBtUG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgbmFtZSk7CisgICAgICAgICAgICAgICAgd2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdha2VMb2Nrcy5wdXQod2FrZUxvY2tLZXksIHdha2VMb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB3YWtlTG9jazsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgdm9pZCB3YWl0VW50aWxSZWFkeVRvUnVuKCkgewogICAgICAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBtUmVhZHlUb1J1bkxhdGNoOwogICAgICAgICAgICAgaWYgKGxhdGNoICE9IG51bGwpIHsKQEAgLTEzMzQsMTIgKzEzMzIsNiBAQAogICAgICAgICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBhIHN5bmMgbm90aWZpY2F0aW9uIGlzIGFjdGl2ZSBhbmQgd2hvIGl0IGlzIGZvci4KICAgICAgICAgICovCiAgICAgICAgIGNsYXNzIFN5bmNOb3RpZmljYXRpb25JbmZvIHsKLSAgICAgICAgICAgIC8vIG9ubHkgdmFsaWQgaWYgaXNBY3RpdmUgaXMgdHJ1ZQotICAgICAgICAgICAgcHVibGljIEFjY291bnQgYWNjb3VudDsKLQotICAgICAgICAgICAgLy8gb25seSB2YWxpZCBpZiBpc0FjdGl2ZSBpcyB0cnVlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGF1dGhvcml0eTsKLQogICAgICAgICAgICAgLy8gdHJ1ZSBpZmYgdGhlIG5vdGlmaWNhdGlvbiBtYW5hZ2VyIGhhcyBiZWVuIGFza2VkIHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUgPSBmYWxzZTsKIApAQCAtMTM0OCwxMCArMTM0MCw3IEBACiAgICAgICAgICAgICBwdWJsaWMgTG9uZyBzdGFydFRpbWUgPSBudWxsOwogCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJhY2NvdW50ICIpLmFwcGVuZChhY2NvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBhdXRob3JpdHkgIikuYXBwZW5kKGF1dGhvcml0eSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgaXNBY3RpdmUgIikuYXBwZW5kKGlzQWN0aXZlKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBzdGFydFRpbWUgIikuYXBwZW5kKHN0YXJ0VGltZSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJpc0FjdGl2ZSAiKS5hcHBlbmQoaXNBY3RpdmUpLmFwcGVuZCgiLCBzdGFydFRpbWUgIikuYXBwZW5kKHN0YXJ0VGltZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMTM2Nyw2MCArMTM1Niw3MiBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgTG9uZyBlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lID0gbnVsbDsKKyAgICAgICAgICAgIGxvbmcgZWFybGllc3RGdXR1cmVQb2xsVGltZSA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICAgICAgbG9uZyBuZXh0UGVuZGluZ1N5bmNUaW1lID0gTG9uZy5NQVhfVkFMVUU7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHdhaXRVbnRpbFJlYWR5VG9SdW4oKTsKKyAgICAgICAgICAgICAgICBtU3luY01hbmFnZXJXYWtlTG9jay5hY3F1aXJlKCk7CiAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGRvIHRoaXMgZmlyc3Qgc28gdGhhdCB3ZSBiZSBzdXJlIHRoYXQgYW55IHBlcmlvZGljIHN5bmNzIHRoYXQKICAgICAgICAgICAgICAgICAvLyBhcmUgcmVhZHkgdG8gcnVuIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW50byBwZW5kaW5nIHN5bmNzLiBUaGlzIGFsbG93cyB0aGUKICAgICAgICAgICAgICAgICAvLyBsb2dpYyB0aGF0IGNvbnNpZGVycyB0aGUgbmV4dCBzdGVwcyB0byB0YWtlIGJhc2VkIG9uIHRoZSBzZXQgb2YgcGVuZGluZyBzeW5jcwogICAgICAgICAgICAgICAgIC8vIHRvIGFsc28gdGFrZSBpbnRvIGFjY291bnQgdGhlIHBlcmlvZGljIHN5bmNzLgogICAgICAgICAgICAgICAgIGVhcmxpZXN0RnV0dXJlUG9sbFRpbWUgPSBzY2hlZHVsZVJlYWR5UGVyaW9kaWNTeW5jcygpOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTeW5jSGFuZGxlci5NRVNTQUdFX0NBTkNFTDogeworICAgICAgICAgICAgICAgICAgICAgICAgUGFpcjxBY2NvdW50LCBTdHJpbmc+IHBheWxvYWQgPSAoUGFpcjxBY2NvdW50LCBTdHJpbmc+KW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTeW5jSGFuZGxlck1lc3NhZ2U6IE1FU1NBR0VfU0VSVklDRV9DQU5DRUw6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGF5bG9hZC5maXJzdCArICIsICIgKyBwYXlsb2FkLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxBY3RpdmVTeW5jTG9ja2VkKHBheWxvYWQuZmlyc3QsIHBheWxvYWQuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQZW5kaW5nU3luY1RpbWUgPSBtYXliZVN0YXJ0TmV4dFN5bmNMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgY2FzZSBTeW5jSGFuZGxlci5NRVNTQUdFX1NZTkNfRklOSVNIRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJoYW5kbGVTeW5jSGFuZGxlck1lc3NhZ2U6IE1FU1NBR0VfU1lOQ19GSU5JU0hFRCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgU3luY0hhbmRsZXJNZXNzYWdlUGF5bG9hZCBwYXlsb2FkID0gKFN5bmNIYW5kbGVyTWVzc2FnZVBheWxvYWQpbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlU3luY0NvbnRleHQgIT0gcGF5bG9hZC5hY3RpdmVTeW5jQ29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImhhbmRsZVN5bmNIYW5kbGVyTWVzc2FnZTogc3luYyBjb250ZXh0IGRvZXNuJ3QgbWF0Y2gsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRyb3BwaW5nOiBtQWN0aXZlU3luY0NvbnRleHQgIiArIG1BY3RpdmVTeW5jQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICE9ICIgKyBwYXlsb2FkLmFjdGl2ZVN5bmNDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU3luY1N0aWxsQWN0aXZlKHBheWxvYWQuYWN0aXZlU3luY0NvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlU3luY0hhbmRsZXJNZXNzYWdlOiBkcm9wcGluZyBzaW5jZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3luYyBpcyBubyBsb25nZXIgYWN0aXZlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBheWxvYWQuYWN0aXZlU3luY0NvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3luY0ZpbmlzaGVkT3JDYW5jZWxlZChwYXlsb2FkLnN5bmNSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3luY0ZpbmlzaGVkT3JDYW5jZWxlZExvY2tlZChwYXlsb2FkLnN5bmNSZXN1bHQsIHBheWxvYWQuYWN0aXZlU3luY0NvbnRleHQpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgbm8gbG9uZ2VyIHN5bmNpbmcsIGNoZWNrIGlmIGl0IGlzIHRpbWUgdG8gc3RhcnQgYSBuZXcgc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhdGVJZGxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBhIHN5bmMganVzdCBmaW5pc2hlZCBjaGVjayBpZiBpdCBpcyB0aW1lIHRvIHN0YXJ0IGEgbmV3IHN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQZW5kaW5nU3luY1RpbWUgPSBtYXliZVN0YXJ0TmV4dFN5bmNMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU3luY0hhbmRsZXIuTUVTU0FHRV9TRVJWSUNFX0NPTk5FQ1RFRDogewogICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUNvbm5lY3Rpb25EYXRhIG1zZ0RhdGEgPSAoU2VydmljZUNvbm5lY3Rpb25EYXRhKW1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTeW5jSGFuZGxlck1lc3NhZ2U6IE1FU1NBR0VfU0VSVklDRV9DT05ORUNURUQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnRGF0YS5hY3RpdmVTeW5jQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFjdGl2ZSBpcyAiICsgbUFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnRGF0YS5hY3RpdmVTeW5jQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoaXMgaXNuJ3QgYW4gb2xkIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlU3luY0NvbnRleHQgPT0gbXNnRGF0YS5hY3RpdmVTeW5jQ29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJvdW5kVG9TeW5jQWRhcHRlcihtc2dEYXRhLnN5bmNBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1N5bmNTdGlsbEFjdGl2ZShtc2dEYXRhLmFjdGl2ZVN5bmNDb250ZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJvdW5kVG9TeW5jQWRhcHRlcihtc2dEYXRhLmFjdGl2ZVN5bmNDb250ZXh0LCBtc2dEYXRhLnN5bmNBZGFwdGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgY2FzZSBTeW5jSGFuZGxlci5NRVNTQUdFX1NFUlZJQ0VfRElTQ09OTkVDVEVEOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlQ29ubmVjdGlvbkRhdGEgbXNnRGF0YSA9IChTZXJ2aWNlQ29ubmVjdGlvbkRhdGEpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2ZVN5bmNDb250ZXh0IGN1cnJlbnRTeW5jQ29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU2VydmljZUNvbm5lY3Rpb25EYXRhKW1zZy5vYmopLmFjdGl2ZVN5bmNDb250ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlU3luY0hhbmRsZXJNZXNzYWdlOiBNRVNTQUdFX1NFUlZJQ0VfRElTQ09OTkVDVEVEOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZ0RhdGEuYWN0aXZlU3luY0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhY3RpdmUgaXMgIiArIG1BY3RpdmVTeW5jQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRTeW5jQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoaXMgaXNuJ3QgYW4gb2xkIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlU3luY0NvbnRleHQgPT0gbXNnRGF0YS5hY3RpdmVTeW5jQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3luY1N0aWxsQWN0aXZlKGN1cnJlbnRTeW5jQ29udGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5jZWwgdGhlIHN5bmMgaWYgd2UgaGF2ZSBhIHN5bmNhZGFwdGVyLCB3aGljaCBtZWFucyBvbmUgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzdGFuZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlU3luY0NvbnRleHQubVN5bmNBZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN5bmNDb250ZXh0Lm1TeW5jQWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQubVN5bmNBZGFwdGVyLmNhbmNlbFN5bmMobUFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTeW5jQ29udGV4dC5tU3luY0FkYXB0ZXIuY2FuY2VsU3luYyhjdXJyZW50U3luY0NvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byByZXRyeSB0aGlzIGluIHRoaXMgY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNDMwLDExICsxNDMxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgYSBzb2Z0IGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY1Jlc3VsdCBzeW5jUmVzdWx0ID0gbmV3IFN5bmNSZXN1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUmVzdWx0LnN0YXRzLm51bUlvRXhjZXB0aW9ucysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN5bmNGaW5pc2hlZE9yQ2FuY2VsZWQoc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3luY0ZpbmlzaGVkT3JDYW5jZWxlZExvY2tlZChzeW5jUmVzdWx0LCBjdXJyZW50U3luY0NvbnRleHQpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgYXJlIG5vIGxvbmdlciBzeW5jaW5nLCBjaGVjayBpZiBpdCBpcyB0aW1lIHRvIHN0YXJ0IGEgbmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXRlSWRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGEgc3luYyBqdXN0IGZpbmlzaGVkIGNoZWNrIGlmIGl0IGlzIHRpbWUgdG8gc3RhcnQgYSBuZXcgc3luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQZW5kaW5nU3luY1RpbWUgPSBtYXliZVN0YXJ0TmV4dFN5bmNMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNDQ3LDIyICsxNDQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGFybVNjaGVkdWxlVGltZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiaGFuZGxlU3luY0hhbmRsZXJNZXNzYWdlOiBzeW5jIGNvbnRleHQgaXMgYWN0aXZlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhdGVTeW5jaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGFib3ZlIGNhbGwgdG8gcnVuU3RhdGVTeW5jaW5nKCkgcmVzdWx0ZWQgaW4gdGhlIGVuZCBvZiBhIHN5bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQgaXMgdGltZSB0byBzdGFydCBhIG5ldyBzeW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVTeW5jQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xvZ2dhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJoYW5kbGVTeW5jSGFuZGxlck1lc3NhZ2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3luYyBjb250ZXh0IGlzIG5vdCBhY3RpdmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGF0ZUlkbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBlbmRpbmdTeW5jVGltZSA9IG1heWJlU3RhcnROZXh0U3luY0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlQWxhcm1XYWtlTG9jay5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNDczLDE4ICsxNDU4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJoYW5kbGVTeW5jSGFuZGxlck1lc3NhZ2U6IE1FU1NBR0VfQ0hFQ0tfQUxBUk1TIik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBhbGwgdGhlIHdvcmsgZm9yIHRoaXMgY2FzZSBpbiB0aGUgZmluYWxseSBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBlbmRpbmdTeW5jVGltZSA9IG1heWJlU3RhcnROZXh0U3luY0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU3luY0luUHJvZ3Jlc3MgPSBtQWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoIWlzU3luY0luUHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hbmFnZVN5bmNOb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtYW5hZ2VFcnJvck5vdGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIG1hbmFnZVN5bmNBbGFybShlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lKTsKKyAgICAgICAgICAgICAgICBtYW5hZ2VTeW5jTm90aWZpY2F0aW9uTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgbWFuYWdlU3luY0FsYXJtTG9ja2VkKGVhcmxpZXN0RnV0dXJlUG9sbFRpbWUsIG5leHRQZW5kaW5nU3luY1RpbWUpOwogICAgICAgICAgICAgICAgIG1TeW5jVGltZVRyYWNrZXIudXBkYXRlKCk7CisgICAgICAgICAgICAgICAgbVN5bmNNYW5hZ2VyV2FrZUxvY2sucmVsZWFzZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE0OTMsMTAgKzE0NzQsMTAgQEAKICAgICAgICAgICogQHJldHVybiB0aGUgZGVzaXJlZCBzdGFydCB0aW1lIG9mIHRoZSBlYXJsaWVzdCBmdXR1cmUgIHBlcmlvZGljIHN5bmMgb3BlcmF0aW9uLAogICAgICAgICAgKiBpbiBtaWxsaXNlY29uZHMgc2luY2UgYm9vdAogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBMb25nIHNjaGVkdWxlUmVhZHlQZXJpb2RpY1N5bmNzKCkgeworICAgICAgICBwcml2YXRlIGxvbmcgc2NoZWR1bGVSZWFkeVBlcmlvZGljU3luY3MoKSB7CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJhY2tncm91bmREYXRhVXNhZ2VBbGxvd2VkID0KICAgICAgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGl2aXR5TWFuYWdlcigpLmdldEJhY2tncm91bmREYXRhU2V0dGluZygpOwotICAgICAgICAgICAgTG9uZyBlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lID0gbnVsbDsKKyAgICAgICAgICAgIGxvbmcgZWFybGllc3RGdXR1cmVQb2xsVGltZSA9IExvbmcuTUFYX1ZBTFVFOwogICAgICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZCB8fCAhbVN5bmNTdG9yYWdlRW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZWFybGllc3RGdXR1cmVQb2xsVGltZTsKICAgICAgICAgICAgIH0KQEAgLTE1MjYsMjMgKzE1MDcsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgbG9uZyBuZXh0UG9sbFRpbWVBYnNvbHV0ZSA9IGxhc3RQb2xsVGltZUFic29sdXRlICsgcGVyaW9kSW5TZWNvbmRzICogMTAwMDsKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVhZHkgdG8gcnVuIHRoZW4gc2NoZWR1bGUgaXQgYW5kIG1hcmsgaXQgYXMgaGF2aW5nIGJlZW4gc2NoZWR1bGVkCiAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UG9sbFRpbWVBYnNvbHV0ZSA8PSBub3dBYnNvbHV0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFpcjxMb25nLCBMb25nPiBiYWNrb2ZmID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmdldEJhY2tvZmYoaW5mby5hY2NvdW50LCBpbmZvLmF1dGhvcml0eSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTeW5jT3BlcmF0aW9uKGluZm8uYWNjb3VudCwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX1BFUklPRElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYXV0aG9yaXR5LCBleHRyYXMsIDAgLyogZGVsYXkgKi8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmF1dGhvcml0eSwgZXh0cmFzLCAwIC8qIGRlbGF5ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tvZmYgIT0gbnVsbCA/IGJhY2tvZmYuZmlyc3QgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXREZWxheVVudGlsVGltZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYWNjb3VudCwgaW5mby5hdXRob3JpdHkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0UGVyaW9kaWNTeW5jVGltZShpLCBub3dBYnNvbHV0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpc24ndCByZWFkeSB0byBydW4sIHJlbWVtYmVyIHRoaXMgdGltZSBpZiBpdCBpcyBlYXJsaWVyIHRoYW4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhcmxpZXN0RnV0dXJlUG9sbFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmV4dFBvbGxUaW1lQWJzb2x1dGUgPCBlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFBvbGxUaW1lQWJzb2x1dGUgPCBlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFybGllc3RGdXR1cmVQb2xsVGltZSA9IG5leHRQb2xsVGltZUFic29sdXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoZWFybGllc3RGdXR1cmVQb2xsVGltZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoZWFybGllc3RGdXR1cmVQb2xsVGltZSA9PSBMb25nLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBMb25nLk1BWF9WQUxVRTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY29udmVydCBhYnNvbHV0ZSB0aW1lIHRvIGVsYXBzZWQgdGltZQpAQCAtMTU1Miw0NyArMTUzNywyMyBAQAogICAgICAgICAgICAgICAgICAgICAgIDogKGVhcmxpZXN0RnV0dXJlUG9sbFRpbWUgLSBub3dBYnNvbHV0ZSkpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJ1blN0YXRlU3luY2luZygpIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZSBzeW5jIHRpbWVvdXQgaGFzIGJlZW4gcmVhY2hlZCB0aGVuIGNhbmNlbCBpdAotICAgICAgICAgICAgQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQgPSBtQWN0aXZlU3luY0NvbnRleHQ7Ci0KLSAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICBpZiAobm93ID4gYWN0aXZlU3luY0NvbnRleHQubVRpbWVvdXRTdGFydFRpbWUgKyBNQVhfVElNRV9QRVJfU1lOQykgewotICAgICAgICAgICAgICAgIFBhaXI8U3luY09wZXJhdGlvbiwgTG9uZz4gbmV4dE9wQW5kUnVuVGltZTsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dE9wQW5kUnVuVGltZSA9IG1TeW5jUXVldWUubmV4dE9wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobmV4dE9wQW5kUnVuVGltZSAhPSBudWxsICYmIG5leHRPcEFuZFJ1blRpbWUuc2Vjb25kIDw9IG5vdykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjYW5jZWxpbmcgYW5kIHJlc2NoZWR1bGluZyBzeW5jIGJlY2F1c2UgaXQgcmFuIHRvbyBsb25nOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbihuZXcgU3luY09wZXJhdGlvbihhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICBzZW5kU3luY0ZpbmlzaGVkT3JDYW5jZWxlZE1lc3NhZ2UoYWN0aXZlU3luY0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBubyByZXN1bHQgc2luY2UgdGhpcyBpcyBhIGNhbmNlbCAqLyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVRpbWVvdXRTdGFydFRpbWUgPSBub3cgKyBNQVhfVElNRV9QRVJfU1lOQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2NoZWR1bGUgYW4gYWxhcm0sIGFzIHRoYXQgd2lsbCBiZSBkb25lIGJ5IG91ciBjYWxsZXIuCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcnVuU3RhdGVJZGxlKCkgewotICAgICAgICAgICAgYm9vbGVhbiBpc0xvZ2dhYmxlID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7Ci0gICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgTG9nLnYoVEFHLCAicnVuU3RhdGVJZGxlIik7CisgICAgICAgIHByaXZhdGUgbG9uZyBtYXliZVN0YXJ0TmV4dFN5bmNMb2NrZWQoKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzTG9nZ2FibGUgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKKyAgICAgICAgICAgIGlmIChpc0xvZ2dhYmxlKSBMb2cudihUQUcsICJtYXliZVN0YXJ0TmV4dFN5bmMiKTsKIAogICAgICAgICAgICAgLy8gSWYgd2UgYXJlbid0IHJlYWR5IHRvIHJ1biAoZS5nLiB0aGUgZGF0YSBjb25uZWN0aW9uIGlzIGRvd24pLCBnZXQgb3V0LgogICAgICAgICAgICAgaWYgKCFtRGF0YUNvbm5lY3Rpb25Jc0Nvbm5lY3RlZCkgewogICAgICAgICAgICAgICAgIGlmIChpc0xvZ2dhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInJ1blN0YXRlSWRsZTogbm8gZGF0YSBjb25uZWN0aW9uLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJtYXliZVN0YXJ0TmV4dFN5bmM6IG5vIGRhdGEgY29ubmVjdGlvbiwgc2tpcHBpbmciKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHJldHVybiBMb25nLk1BWF9WQUxVRTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1TdG9yYWdlSXNMb3cpIHsKICAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJydW5TdGF0ZUlkbGU6IG1lbW9yeSBsb3csIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm1heWJlU3RhcnROZXh0U3luYzogbWVtb3J5IGxvdywgc2tpcHBpbmciKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHJldHVybiBMb25nLk1BWF9WQUxVRTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSWYgdGhlIGFjY291bnRzIGFyZW4ndCBrbm93biB5ZXQgdGhlbiB3ZSBhcmVuJ3QgcmVhZHkgdG8gcnVuLiBXZSB3aWxsIGJlIGtpY2tlZApAQCAtMTYwMCw0NiArMTU2MSw1NiBAQAogICAgICAgICAgICAgQWNjb3VudFtdIGFjY291bnRzID0gbUFjY291bnRzOwogICAgICAgICAgICAgaWYgKGFjY291bnRzID09IElOSVRJQUxfQUNDT1VOVFNfQVJSQVkpIHsKICAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJydW5TdGF0ZUlkbGU6IGFjY291bnRzIG5vdCBrbm93biwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAibWF5YmVTdGFydE5leHRTeW5jOiBhY2NvdW50cyBub3Qga25vd24sIHNraXBwaW5nIik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5NQVhfVkFMVUU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjb25zdW1lIFN5bmNPcGVyYXRpb25zIGZyb20gdGhlIGhlYWQgb2YgdGhlIFN5bmNRdWV1ZSB1bnRpbCBvbmUgaXMKICAgICAgICAgICAgIC8vIGZvdW5kIHRoYXQgaXMgcnVubmFibGUgKG5vdCBkaXNhYmxlZCwgZXRjKS4gSWYgdGhhdCBvbmUgaXMgcmVhZHkgdG8gcnVuIHRoZW4KICAgICAgICAgICAgIC8vIHN0YXJ0IGl0LCBvdGhlcndpc2UganVzdCBnZXQgb3V0LgotICAgICAgICAgICAgU3luY09wZXJhdGlvbiBvcDsKLSAgICAgICAgICAgIGludCBzeW5jYWJsZVN0YXRlOwogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZCA9CiAgICAgICAgICAgICAgICAgICAgIGdldENvbm5lY3Rpdml0eU1hbmFnZXIoKS5nZXRCYWNrZ3JvdW5kRGF0YVNldHRpbmcoKTsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbWFzdGVyU3luY0F1dG9tYXRpY2FsbHkgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoKTsKIAotICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luY1F1ZXVlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBQYWlyPFN5bmNPcGVyYXRpb24sIExvbmc+IG5leHRPcEFuZFJ1blRpbWUgPSBtU3luY1F1ZXVlLm5leHRPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRPcEFuZFJ1blRpbWUgPT0gbnVsbCB8fCBuZXh0T3BBbmRSdW5UaW1lLnNlY29uZCA+IG5vdykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJydW5TdGF0ZUlkbGU6IG5vIG1vcmUgcmVhZHkgc3luYyBvcGVyYXRpb25zLCByZXR1cm5pbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvcCA9IG5leHRPcEFuZFJ1blRpbWUuZmlyc3Q7CisgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBlaXRoZXIgZ29pbmcgdG8gcnVuIHRoaXMgc3luYyBvciBkcm9wIGl0IHNvIGdvIGFoZWFkIGFuZAotICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXQgZnJvbSB0aGUgcXVldWUgbm93Ci0gICAgICAgICAgICAgICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKG9wKTsKKyAgICAgICAgICAgIC8vIHdpbGwgYmUgc2V0IHRvIHRoZSBuZXh0IHRpbWUgdGhhdCBhIHN5bmMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIHJ1bm5pbmcKKyAgICAgICAgICAgIGxvbmcgbmV4dFJlYWR5VG9SdW5UaW1lID0gTG9uZy5NQVhfVkFMVUU7CisKKyAgICAgICAgICAgIC8vIG9yZGVyIHRoZSBzeW5jIHF1ZXVlLCBkcm9wcGluZyBzeW5jcyB0aGF0IGFyZSBub3QgYWxsb3dlZAorICAgICAgICAgICAgQXJyYXlMaXN0PFN5bmNPcGVyYXRpb24+IG9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN5bmNPcGVyYXRpb24+KCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJidWlsZCB0aGUgb3BlcmF0aW9uIGFycmF5LCBzeW5jUXVldWUgc2l6ZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG1TeW5jUXVldWUubU9wZXJhdGlvbnNNYXAuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSXRlcmF0b3I8U3luY09wZXJhdGlvbj4gb3BlcmF0aW9uSXRlcmF0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNRdWV1ZS5tT3BlcmF0aW9uc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChvcGVyYXRpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBvcCA9IG9wZXJhdGlvbkl0ZXJhdG9yLm5leHQoKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHRoZSBzeW5jIGlmIHRoZSBhY2NvdW50IG9mIHRoaXMgb3BlcmF0aW9uIG5vIGxvbmdlciBleGlzdHMKICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheVV0aWxzLmNvbnRhaW5zKG1BY2NvdW50cywgb3AuYWNjb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmRlbGV0ZUZyb21QZW5kaW5nKG9wLnBlbmRpbmdPcGVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotCi0gICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgdGhpcyBzeW5jIHJlcXVlc3QgaWYgaXQgaXNuJ3Qgc3luY2FibGUsIGludGlhbGl6aW5nIHRoZSBzeW5jIGFkYXB0ZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN5bmNhYmxlIHN0YXRlIGlzIHNldCB0byAidW5rbm93biIKLSAgICAgICAgICAgICAgICAgICAgc3luY2FibGVTdGF0ZSA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRJc1N5bmNhYmxlKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgdGhpcyBzeW5jIHJlcXVlc3QgaWYgaXQgaXNuJ3Qgc3luY2FibGUKKyAgICAgICAgICAgICAgICAgICAgaW50IHN5bmNhYmxlU3RhdGUgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0SXNTeW5jYWJsZShvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3luY2FibGVTdGF0ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5kZWxldGVGcm9tUGVuZGluZyhvcC5wZW5kaW5nT3BlcmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5leHQgcnVuIHRpbWUgaXMgaW4gdGhlIGZ1dHVyZSwgbWVhbmluZyB0aGVyZSBhcmUgbm8gc3luY3MgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gcnVuLCByZXR1cm4gdGhlIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wLmVmZmVjdGl2ZVJ1blRpbWUgPiBub3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UmVhZHlUb1J1blRpbWUgPiBvcC5lZmZlY3RpdmVSdW5UaW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlYWR5VG9SdW5UaW1lID0gb3AuZWZmZWN0aXZlUnVuVGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTE2NTEsMzAgKzE2MjIsMTM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbVN5bmNTdG9yYWdlRW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmRlbGV0ZUZyb21QZW5kaW5nKG9wLnBlbmRpbmdPcGVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBnbyBhaGVhZCBhbmQgdHJ5IHRvIHN5bmMgdGhpcyBzeW5jT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgZG8gdGhpcyBzeW5jLiBSdW4gaXQgb3V0c2lkZSBvZiB0aGUgc3luY2hyb25pemVkIGJsb2NrLgotICAgICAgICAgICAgICAgIGlmIChpc0xvZ2dhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInJ1blN0YXRlSWRsZTogd2UgYXJlIGdvaW5nIHRvIHN5bmMgIiArIG9wKTsKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy5hZGQob3ApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gY29udmVydCB0aGUgb3AgaW50byBhbiBpbml0aWFsaXphdGlvbiBzeW5jIGlmIHRoZSBzeW5jYWJsZSBzdGF0ZSBpcyAidW5rbm93biIgYW5kCi0gICAgICAgICAgICAvLyBvcCBpc24ndCBhbHJlYWR5IGFuIGluaXRpYWxpemF0aW9uIHN5bmMuIElmIGl0IGlzIG1hcmtlZCBzeW5jYWJsZSB0aGVuIGNvbnZlcnQKLSAgICAgICAgICAgIC8vIHRoaXMgaW50byBhIHJlZ3VsYXIgc3luYwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplSXNTZXQgPQotICAgICAgICAgICAgICAgICAgICBvcC5leHRyYXMuZ2V0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSU5JVElBTElaRSwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHN5bmNhYmxlU3RhdGUgPCAwICYmICFpbml0aWFsaXplSXNTZXQpIHsKLSAgICAgICAgICAgICAgICBvcC5leHRyYXMucHV0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSU5JVElBTElaRSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgb3AgPSBuZXcgU3luY09wZXJhdGlvbihvcCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN5bmNhYmxlU3RhdGUgPiAwICYmIGluaXRpYWxpemVJc1NldCkgewotICAgICAgICAgICAgICAgIG9wLmV4dHJhcy5wdXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19JTklUSUFMSVpFLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgb3AgPSBuZXcgU3luY09wZXJhdGlvbihvcCk7CisgICAgICAgICAgICAvLyBmaW5kIHRoZSBuZXh0IG9wZXJhdGlvbiB0byBkaXNwYXRjaCwgaWYgb25lIGlzIHJlYWR5CisgICAgICAgICAgICAvLyBpdGVyYXRlIGZyb20gdGhlIHRvcCwga2VlcCBpc3N1aW5nICh3aGlsZSBwb3RlbnRpYWxseSBjYW5jZWxsaW5nIGV4aXN0aW5nIHN5bmNzKQorICAgICAgICAgICAgLy8gdW50aWwgdGhlIHF1b3RhcyBhcmUgZmlsbGVkLgorICAgICAgICAgICAgLy8gb25jZSB0aGUgcXVvdGFzIGFyZSBmaWxsZWQgaXRlcmF0ZSBvbmNlIG1vcmUgdG8gZmluZCB3aGVuIHRoZSBuZXh0IG9uZSB3b3VsZCBiZQorICAgICAgICAgICAgLy8gKGFsc28gY29uc2lkZXJpbmcgcHJlLWVtcHRpb24gcmVhc29ucykuCisgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgTG9nLnYoVEFHLCAic29ydCB0aGUgY2FuZGlkYXRlIG9wZXJhdGlvbnMsIHNpemUgIiArIG9wZXJhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQob3BlcmF0aW9ucyk7CisgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgTG9nLnYoVEFHLCAiZGlzcGF0Y2ggYWxsIHJlYWR5IHN5bmMgb3BlcmF0aW9ucyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIE4gPSBvcGVyYXRpb25zLnNpemUoKTsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gY2FuZGlkYXRlID0gb3BlcmF0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjYW5kaWRhdGVJc0luaXRpYWxpemF0aW9uID0gY2FuZGlkYXRlLmlzSW5pdGlhbGl6YXRpb24oKTsKKworICAgICAgICAgICAgICAgIGludCBudW1Jbml0ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbnVtUmVndWxhciA9IDA7CisgICAgICAgICAgICAgICAgQWN0aXZlU3luY0NvbnRleHQgY29uZmxpY3QgPSBudWxsOworICAgICAgICAgICAgICAgIEFjdGl2ZVN5bmNDb250ZXh0IGxvbmdSdW5uaW5nID0gbnVsbDsKKyAgICAgICAgICAgICAgICBBY3RpdmVTeW5jQ29udGV4dCB0b1Jlc2NoZWR1bGUgPSBudWxsOworCisgICAgICAgICAgICAgICAgZm9yIChBY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCA6IG1BY3RpdmVTeW5jQ29udGV4dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBhY3RpdmVPcCA9IGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uOworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlT3AuaXNJbml0aWFsaXphdGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1Jbml0Kys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1SZWd1bGFyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZU9wLmFjY291bnQudHlwZS5lcXVhbHMoY2FuZGlkYXRlLmFjY291bnQudHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3RpdmVPcC5hdXRob3JpdHkuZXF1YWxzKGNhbmRpZGF0ZS5hdXRob3JpdHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdCA9IGFjdGl2ZVN5bmNDb250ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYnJlYWsgb3V0IHNpbmNlIHdlIHdhbnQgdG8gZG8gYSBmdWxsIGNvdW50IG9mIHRoZSB2YXJpZXRpZXMKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGVJc0luaXRpYWxpemF0aW9uID09IGFjdGl2ZU9wLmlzSW5pdGlhbGl6YXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3RpdmVTeW5jQ29udGV4dC5tU3RhcnRUaW1lICsgTUFYX1RJTUVfUEVSX1NZTkMgPCBub3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nUnVubmluZyA9IGFjdGl2ZVN5bmNDb250ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGJyZWFrIG91dCBzaW5jZSB3ZSB3YW50IHRvIGRvIGEgZnVsbCBjb3VudCBvZiB0aGUgdmFyaWV0aWVzCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjYW5kaWRhdGUgIiArIChpICsgMSkgKyAiIG9mICIgKyBOICsgIjogIiArIGNhbmRpZGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIiAgbnVtQWN0aXZlSW5pdD0iICsgbnVtSW5pdCArICIsIG51bUFjdGl2ZVJlZ3VsYXI9IiArIG51bVJlZ3VsYXIpOworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICIgIGxvbmdSdW5uaW5nOiAiICsgbG9uZ1J1bm5pbmcpOworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICIgIGNvbmZsaWN0OiAiICsgY29uZmxpY3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjb25mbGljdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGVJc0luaXRpYWxpemF0aW9uICYmICFjb25mbGljdC5tU3luY09wZXJhdGlvbi5pc0luaXRpYWxpemF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBudW1Jbml0IDwgTUFYX1NJTVVMVEFORU9VU19JTklUSUFMSVpBVElPTl9TWU5DUykgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXNjaGVkdWxlID0gY29uZmxpY3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjYW5jZWxpbmcgYW5kIHJlc2NoZWR1bGluZyBzeW5jIHNpbmNlIGFuIGluaXRpYWxpemF0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRha2VzIGhpZ2hlciBwcmlvcml0eSwgIiArIGNvbmZsaWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5kaWRhdGUuZXhwZWRpdGVkICYmICFjb25mbGljdC5tU3luY09wZXJhdGlvbi5leHBlZGl0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FuZGlkYXRlSXNJbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBjb25mbGljdC5tU3luY09wZXJhdGlvbi5pc0luaXRpYWxpemF0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b1Jlc2NoZWR1bGUgPSBjb25mbGljdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImNhbmNlbGluZyBhbmQgcmVzY2hlZHVsaW5nIHN5bmMgc2luY2UgYW4gZXhwZWRpdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRha2VzIGhpZ2hlciBwcmlvcml0eSwgIiArIGNvbmZsaWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByb29tQXZhaWxhYmxlID0gY2FuZGlkYXRlSXNJbml0aWFsaXphdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bUluaXQgPCBNQVhfU0lNVUxUQU5FT1VTX0lOSVRJQUxJWkFUSU9OX1NZTkNTIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVtUmVndWxhciA8IE1BWF9TSU1VTFRBTkVPVVNfUkVHVUxBUl9TWU5DUzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvb21BdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGNhbmRpZGF0ZQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdSdW5uaW5nICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FuZGlkYXRlSXNJbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBsb25nUnVubmluZy5tU3luY09wZXJhdGlvbi5pc0luaXRpYWxpemF0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b1Jlc2NoZWR1bGUgPSBsb25nUnVubmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImNhbmNlbGluZyBhbmQgcmVzY2hlZHVsaW5nIHN5bmMgc2luY2UgaXQgcmFuIHJvbyBsb25nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxvbmdSdW5uaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRvUmVzY2hlZHVsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1blN5bmNGaW5pc2hlZE9yQ2FuY2VsZWRMb2NrZWQobnVsbCwgdG9SZXNjaGVkdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKHRvUmVzY2hlZHVsZS5tU3luY09wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSl7CisgICAgICAgICAgICAgICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKGNhbmRpZGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpc3BhdGNoU3luY09wZXJhdGlvbihjYW5kaWRhdGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV4dFJlYWR5VG9SdW5UaW1lOworICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRpc3BhdGNoU3luY09wZXJhdGlvbihTeW5jT3BlcmF0aW9uIG9wKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJtYXliZVN0YXJ0TmV4dFN5bmM6IHdlIGFyZSBnb2luZyB0byBzeW5jICIgKyBvcCk7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAibnVtIGFjdGl2ZSBzeW5jczogIiArIG1BY3RpdmVTeW5jQ29udGV4dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKEFjdGl2ZVN5bmNDb250ZXh0IHN5bmNDb250ZXh0IDogbUFjdGl2ZVN5bmNDb250ZXh0cykgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsIHN5bmNDb250ZXh0LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBpbml0aWFsaXphdGlvbiBzeW5jIGFuZCB0aGVyZSBpcyBhbHJlYWR5IGEgc3luYyBydW5uaW5nIHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIGFjY291bnQgdHlwZSBhbmQgYXV0aG9yaXR5IGNhbmNlbCB0aGF0IHN5bmMgYmVmb3JlIHN0YXJ0aW5nIHRoaXMgb25lCisgICAgICAgICAgICAvLyBzaW5jZSBvdGhlcndpc2UgdGhlIHN5bmNhZGFwdGVyIHdpbGwgbGlrZWx5IHJlamVjdCB0aGlzIHJlcXVlc3QKKyAgICAgICAgICAgIGlmIChvcC5pc0luaXRpYWxpemF0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvcjxBY3RpdmVTeW5jQ29udGV4dD4gaXRlcmF0b3IgPSBtQWN0aXZlU3luY0NvbnRleHRzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBBY3RpdmVTeW5jQ29udGV4dCBzeW5jQ29udGV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5pc0luaXRpYWxpemF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50LnR5cGUuZXF1YWxzKG9wLmFjY291bnQudHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hdXRob3JpdHkuZXF1YWxzKG9wLmF1dGhvcml0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNhbmNlbGluZyBhbmQgcmVzY2hlZHVsaW5nICIgKyBzeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2luY2Ugd2UgYXJlIGFib3V0IHRvIHN0YXJ0IGEgc3luYyB0aGF0IHVzZWQgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic2FtZSBzeW5jIGFkYXB0ZXIsICIgKyBvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN5bmNGaW5pc2hlZE9yQ2FuY2VsZWRMb2NrZWQobnVsbCwgc3luY0NvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKHN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGUgc3luYyBhZGFwdGVyCkBAIC0xNjg1LDYxICsxNzY1LDcwIEBACiAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2FuJ3QgZmluZCBhIHN5bmMgYWRhcHRlciBmb3IgIiArIHN5bmNBZGFwdGVyVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByZW1vdmluZyBzZXR0aW5ncyBmb3IgaXQiKTsKICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUucmVtb3ZlQXV0aG9yaXR5KG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSk7Ci0gICAgICAgICAgICAgICAgcnVuU3RhdGVJZGxlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aXZlU3luY0NvbnRleHQob3AsIGluc2VydFN0YXJ0U3luY0V2ZW50KG9wKSk7Ci0gICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQgPSBhY3RpdmVTeW5jQ29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGl2ZVN5bmNDb250ZXh0KG9wLCBpbnNlcnRTdGFydFN5bmNFdmVudChvcCksIHN5bmNBZGFwdGVySW5mby51aWQpOworICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNJbmZvID0gbVN5bmNTdG9yYWdlRW5naW5lLmFkZEFjdGl2ZVN5bmMoYWN0aXZlU3luY0NvbnRleHQpOworICAgICAgICAgICAgbUFjdGl2ZVN5bmNDb250ZXh0cy5hZGQoYWN0aXZlU3luY0NvbnRleHQpOwogICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicnVuU3RhdGVJZGxlOiBzZXR0aW5nIG1BY3RpdmVTeW5jQ29udGV4dCB0byAiICsgbUFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJkaXNwYXRjaFN5bmNPcGVyYXRpb246IHN0YXJ0aW5nICIgKyBhY3RpdmVTeW5jQ29udGV4dCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0QWN0aXZlU3luYyhtQWN0aXZlU3luY0NvbnRleHQpOwogICAgICAgICAgICAgaWYgKCFhY3RpdmVTeW5jQ29udGV4dC5iaW5kVG9TeW5jQWRhcHRlcihzeW5jQWRhcHRlckluZm8pKSB7CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQmluZCBhdHRlbXB0IGZhaWxlZCB0byAiICsgc3luY0FkYXB0ZXJJbmZvKTsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRBY3RpdmVTeW5jKG1BY3RpdmVTeW5jQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5zZXRXb3JrU291cmNlKG51bGwpOwotICAgICAgICAgICAgICAgIHJ1blN0YXRlSWRsZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBjbG9zZUFjdGl2ZVN5bmNDb250ZXh0KGFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1TeW5jV2FrZUxvY2suc2V0V29ya1NvdXJjZShuZXcgV29ya1NvdXJjZShzeW5jQWRhcHRlckluZm8udWlkKSk7Ci0gICAgICAgICAgICBtU3luY1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2NoZWR1bGUgYW4gYWxhcm0sIGFzIHRoYXQgd2lsbCBiZSBkb25lIGJ5IG91ciBjYWxsZXIuCi0KLSAgICAgICAgICAgIC8vIHRoZSBuZXh0IHN0ZXAgd2lsbCBvY2N1ciB3aGVuIHdlIGdldCBlaXRoZXIgYSB0aW1lb3V0IG9yIGEKLSAgICAgICAgICAgIC8vIE1FU1NBR0VfU0VSVklDRV9DT05ORUNURUQgb3IgTUVTU0FHRV9TRVJWSUNFX0RJU0NPTk5FQ1RFRCBtZXNzYWdlCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBydW5Cb3VuZFRvU3luY0FkYXB0ZXIoSVN5bmNBZGFwdGVyIHN5bmNBZGFwdGVyKSB7Ci0gICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQubVN5bmNBZGFwdGVyID0gc3luY0FkYXB0ZXI7Ci0gICAgICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24gPSBtQWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb247CisgICAgICAgIHByaXZhdGUgdm9pZCBydW5Cb3VuZFRvU3luY0FkYXB0ZXIoQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQsCisgICAgICAgICAgICAgIElTeW5jQWRhcHRlciBzeW5jQWRhcHRlcikgeworICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNBZGFwdGVyID0gc3luY0FkYXB0ZXI7CisgICAgICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24gPSBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbjsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3luY0FkYXB0ZXIuc3RhcnRTeW5jKG1BY3RpdmVTeW5jQ29udGV4dCwgc3luY09wZXJhdGlvbi5hdXRob3JpdHksCisgICAgICAgICAgICAgICAgc3luY0FkYXB0ZXIuc3RhcnRTeW5jKGFjdGl2ZVN5bmNDb250ZXh0LCBzeW5jT3BlcmF0aW9uLmF1dGhvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uYWNjb3VudCwgc3luY09wZXJhdGlvbi5leHRyYXMpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlbW90ZUV4YykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJ1blN0YXRlSWRsZTogY2F1Z2h0IGEgUmVtb3RlRXhjZXB0aW9uLCByZXNjaGVkdWxpbmciLCByZW1vdGVFeGMpOwotICAgICAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEFjdGl2ZVN5bmMobUFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtYXliZVN0YXJ0TmV4dFN5bmM6IGNhdWdodCBhIFJlbW90ZUV4Y2VwdGlvbiwgcmVzY2hlZHVsaW5nIiwgcmVtb3RlRXhjKTsKKyAgICAgICAgICAgICAgICBjbG9zZUFjdGl2ZVN5bmNDb250ZXh0KGFjdGl2ZVN5bmNDb250ZXh0KTsKICAgICAgICAgICAgICAgICBpbmNyZWFzZUJhY2tvZmZTZXR0aW5nKHN5bmNPcGVyYXRpb24pOwogICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbihuZXcgU3luY09wZXJhdGlvbihzeW5jT3BlcmF0aW9uKSk7CiAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEFjdGl2ZVN5bmMobUFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBjbG9zZUFjdGl2ZVN5bmNDb250ZXh0KGFjdGl2ZVN5bmNDb250ZXh0KTsKICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDYXVnaHQgUnVudGltZUV4Y2VwdGlvbiB3aGlsZSBzdGFydGluZyB0aGUgc3luYyAiICsgc3luY09wZXJhdGlvbiwgZXhjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBydW5TeW5jRmluaXNoZWRPckNhbmNlbGVkKFN5bmNSZXN1bHQgc3luY1Jlc3VsdCkgeworICAgICAgICBwcml2YXRlIHZvaWQgY2FuY2VsQWN0aXZlU3luY0xvY2tlZChBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBY3RpdmVTeW5jQ29udGV4dD4gYWN0aXZlU3luY3MgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PEFjdGl2ZVN5bmNDb250ZXh0PihtQWN0aXZlU3luY0NvbnRleHRzKTsKKyAgICAgICAgICAgIGZvciAoQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQgOiBhY3RpdmVTeW5jcykgeworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTeW5jQ29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFuIGF1dGhvcml0eSB3YXMgc3BlY2lmaWVkIHRoZW4gb25seSBjYW5jZWwgdGhlIHN5bmMgaWYgaXQgbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFjY291bnQuZXF1YWxzKGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmFjY291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFuIGFjY291bnQgd2FzIHNwZWNpZmllZCB0aGVuIG9ubHkgY2FuY2VsIHRoZSBzeW5jIGlmIGl0IG1hdGNoZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhvcml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF1dGhvcml0eS5lcXVhbHMoYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYXV0aG9yaXR5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBydW5TeW5jRmluaXNoZWRPckNhbmNlbGVkTG9ja2VkKG51bGwgLyogbm8gcmVzdWx0IHNpbmNlIHRoaXMgaXMgYSBjYW5jZWwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBydW5TeW5jRmluaXNoZWRPckNhbmNlbGVkTG9ja2VkKFN5bmNSZXN1bHQgc3luY1Jlc3VsdCwKKyAgICAgICAgICAgICAgICBBY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCkgewogICAgICAgICAgICAgYm9vbGVhbiBpc0xvZ2dhYmxlID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7Ci0gICAgICAgICAgICBmaW5hbCBBY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCA9IG1BY3RpdmVTeW5jQ29udGV4dDsKLSAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0QWN0aXZlU3luYyhtQWN0aXZlU3luY0NvbnRleHQpOworICAgICAgICAgICAgY2xvc2VBY3RpdmVTeW5jQ29udGV4dChhY3RpdmVTeW5jQ29udGV4dCk7CiAKICAgICAgICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gc3luY09wZXJhdGlvbiA9IGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uOwogCkBAIC0xNzU5LDE2ICsxODQ4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2V0IHRoZXNlIGNvcnJlY3RseSB3aGVuIHRoZSBTeW5jUmVzdWx0IGlzIGV4dGVuZGVkIHRvIGluY2x1ZGUgaXQKICAgICAgICAgICAgICAgICAgICAgZG93bnN0cmVhbUFjdGl2aXR5ID0gMDsKICAgICAgICAgICAgICAgICAgICAgdXBzdHJlYW1BY3Rpdml0eSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFyQmFja29mZlNldHRpbmcoc3luY09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgd2FzIGFuIGluaXRpYWxpemF0aW9uIHN5bmMgYW5kIHRoZSBzeW5jIGFkYXB0ZXIgaXMgbm93Ci0gICAgICAgICAgICAgICAgICAgIC8vIG1hcmtlZCBzeW5jYWJsZSB0aGVuIHJlc2NoZWR1bGUgdGhlIHN5bmMuIFRoZSBuZXh0IHRpbWUgaXQgcnVucyBpdAotICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIG1hZGUgaW50byBhIHJlZ3VsYXIgc3luYy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN5bmNPcGVyYXRpb24uZXh0cmFzLmdldEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19JTklUSUFMSVpFLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0SXNTeW5jYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY09wZXJhdGlvbi5hY2NvdW50LCBzeW5jT3BlcmF0aW9uLmF1dGhvcml0eSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24obmV3IFN5bmNPcGVyYXRpb24oc3luY09wZXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHN5bmMgb3BlcmF0aW9uICIgKyBzeW5jT3BlcmF0aW9uICsgIiwgIiArIHN5bmNSZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3BlcmF0aW9uIGZhaWxlZCBzbyBpbmNyZWFzZSB0aGUgYmFja29mZiB0aW1lCkBAIC0xODAzLDggKzE4ODIsNiBAQAogICAgICAgICAgICAgc3RvcFN5bmNFdmVudChhY3RpdmVTeW5jQ29udGV4dC5tSGlzdG9yeVJvd0lkLCBzeW5jT3BlcmF0aW9uLCBoaXN0b3J5TWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgdXBzdHJlYW1BY3Rpdml0eSwgZG93bnN0cmVhbUFjdGl2aXR5LCBlbGFwc2VkVGltZSk7CiAKLSAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0LmNsb3NlKCk7Ci0KICAgICAgICAgICAgIGlmIChzeW5jUmVzdWx0ICE9IG51bGwgJiYgc3luY1Jlc3VsdC50b29NYW55RGVsZXRpb25zKSB7CiAgICAgICAgICAgICAgICAgaW5zdGFsbEhhbmRsZVRvb01hbnlEZWxldGVzTm90aWZpY2F0aW9uKHN5bmNPcGVyYXRpb24uYWNjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LCBzeW5jUmVzdWx0LnN0YXRzLm51bURlbGV0ZXMpOwpAQCAtMTgxNSwxMSArMTg5MiwxOCBAQAogCiAgICAgICAgICAgICBpZiAoc3luY1Jlc3VsdCAhPSBudWxsICYmIHN5bmNSZXN1bHQuZnVsbFN5bmNSZXF1ZXN0ZWQpIHsKICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24obmV3IFN5bmNPcGVyYXRpb24oc3luY09wZXJhdGlvbi5hY2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgc3luY09wZXJhdGlvbi5zeW5jU291cmNlLCBzeW5jT3BlcmF0aW9uLmF1dGhvcml0eSwgbmV3IEJ1bmRsZSgpLCAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLnN5bmNTb3VyY2UsIHN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LCBuZXcgQnVuZGxlKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLmJhY2tvZmYsIHN5bmNPcGVyYXRpb24uZGVsYXlVbnRpbCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzY2hlZHVsZSBhbiBhbGFybSwgYXMgdGhhdCB3aWxsIGJlIGRvbmUgYnkgb3VyIGNhbGxlci4KICAgICAgICAgfQogCisgICAgICAgIHByaXZhdGUgdm9pZCBjbG9zZUFjdGl2ZVN5bmNDb250ZXh0KEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0KSB7CisgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5jbG9zZSgpOworICAgICAgICAgICAgbUFjdGl2ZVN5bmNDb250ZXh0cy5yZW1vdmUoYWN0aXZlU3luY0NvbnRleHQpOworICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnJlbW92ZUFjdGl2ZVN5bmMoYWN0aXZlU3luY0NvbnRleHQubVN5bmNJbmZvKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb252ZXJ0IHRoZSBlcnJvci1jb250YWluaW5nIFN5bmNSZXN1bHQgaW50byB0aGUgU3luYy5IaXN0b3J5IGVycm9yIG51bWJlci4gU2luY2UKICAgICAgICAgICogdGhlIFN5bmNSZXN1bHQgbWF5IGluZGljYXRlIG11bHRpcGxlIGVycm9ycyBhdCBvbmNlLCB0aGlzIG1ldGhvZCBqdXN0IHJldHVybnMgdGhlCkBAIC0xODQ5LDExICsxOTMzLDExIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3ZSBhcmUgbm90IGluIGFuIGVycm9yIHN0YXRlLCAiICsgc3luY1Jlc3VsdCk7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgbWFuYWdlU3luY05vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG1hbmFnZVN5bmNOb3RpZmljYXRpb25Mb2NrZWQoKSB7CiAgICAgICAgICAgICBib29sZWFuIHNob3VsZENhbmNlbDsKICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkSW5zdGFsbDsKIAotICAgICAgICAgICAgaWYgKG1BY3RpdmVTeW5jQ29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUFjdGl2ZVN5bmNDb250ZXh0cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBtU3luY05vdGlmaWNhdGlvbkluZm8uc3RhcnRUaW1lID0gbnVsbDsKIAogICAgICAgICAgICAgICAgIC8vIHdlIGFyZW4ndCBzeW5jaW5nLiBpZiB0aGUgbm90aWZpY2F0aW9uIGlzIGFjdGl2ZSB0aGVuIHJlbWVtYmVyIHRoYXQgd2UgbmVlZApAQCAtMTg2MiwzNCArMTk0NiwzOCBAQAogICAgICAgICAgICAgICAgIHNob3VsZEluc3RhbGwgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIHN5bmNpbmcKLSAgICAgICAgICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24gPSBtQWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb247Ci0KICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICAgICAgICAgIGlmIChtU3luY05vdGlmaWNhdGlvbkluZm8uc3RhcnRUaW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVN5bmNOb3RpZmljYXRpb25JbmZvLnN0YXJ0VGltZSA9IG5vdzsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBjYW5jZWwgdGhlIG5vdGlmaWNhdGlvbiBpZiBpdCBpcyB1cCBhbmQgdGhlIGF1dGhvcml0eSBvciBhY2NvdW50IGlzIHdyb25nCi0gICAgICAgICAgICAgICAgc2hvdWxkQ2FuY2VsID0gbVN5bmNOb3RpZmljYXRpb25JbmZvLmlzQWN0aXZlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoIXN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LmVxdWFscyhtU3luY05vdGlmaWNhdGlvbkluZm8uYXV0aG9yaXR5KQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXN5bmNPcGVyYXRpb24uYWNjb3VudC5lcXVhbHMobVN5bmNOb3RpZmljYXRpb25JbmZvLmFjY291bnQpKTsKLQotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBmb3VyIGNhc2VzOgotICAgICAgICAgICAgICAgIC8vIC0gdGhlIG5vdGlmaWNhdGlvbiBpcyB1cCBhbmQgdGhlcmUgaXMgbm8gY2hhbmdlOiBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgLy8gLSB0aGUgbm90aWZpY2F0aW9uIGlzIHVwIGJ1dCB3ZSBzaG91bGQgY2FuY2VsIHNpbmNlIGl0IGlzIHN0YWxlOgotICAgICAgICAgICAgICAgIC8vICAgbmVlZCB0byBpbnN0YWxsCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIHRocmVlIGNhc2VzOgorICAgICAgICAgICAgICAgIC8vIC0gdGhlIG5vdGlmaWNhdGlvbiBpcyB1cDogZG8gbm90aGluZwogICAgICAgICAgICAgICAgIC8vIC0gdGhlIG5vdGlmaWNhdGlvbiBpcyBub3QgdXAgYnV0IGl0IGlzbid0IHRpbWUgeWV0OiBkb24ndCBpbnN0YWxsCiAgICAgICAgICAgICAgICAgLy8gLSB0aGUgbm90aWZpY2F0aW9uIGlzIG5vdCB1cCBhbmQgaXQgaXMgdGltZTogbmVlZCB0byBpbnN0YWxsCiAKICAgICAgICAgICAgICAgICBpZiAobVN5bmNOb3RpZmljYXRpb25JbmZvLmlzQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZEluc3RhbGwgPSBzaG91bGRDYW5jZWw7CisgICAgICAgICAgICAgICAgICAgIHNob3VsZEluc3RhbGwgPSBzaG91bGRDYW5jZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBpdCBpc24ndCBjdXJyZW50bHkgdXAsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgIHNob3VsZENhbmNlbCA9IGZhbHNlOworCiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdGltZVRvU2hvd05vdGlmaWNhdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93ID4gbVN5bmNOb3RpZmljYXRpb25JbmZvLnN0YXJ0VGltZSArIFNZTkNfTk9USUZJQ0FUSU9OX0RFTEFZOwotICAgICAgICAgICAgICAgICAgICAvLyBzaG93IHRoZSBub3RpZmljYXRpb24gaW1tZWRpYXRlbHkgaWYgdGhpcyBpcyBhIG1hbnVhbCBzeW5jCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbWFudWFsU3luYyA9IHN5bmNPcGVyYXRpb24uZXh0cmFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX01BTlVBTCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBzaG91bGRJbnN0YWxsID0gdGltZVRvU2hvd05vdGlmaWNhdGlvbiB8fCBtYW51YWxTeW5jOworICAgICAgICAgICAgICAgICAgICBpZiAodGltZVRvU2hvd05vdGlmaWNhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSW5zdGFsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IHRoZSBub3RpZmljYXRpb24gaW1tZWRpYXRlbHkgaWYgdGhpcyBpcyBhIG1hbnVhbCBzeW5jCisgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRJbnN0YWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0IDogbUFjdGl2ZVN5bmNDb250ZXh0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbWFudWFsU3luYyA9IGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmV4dHJhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX01BTlVBTCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYW51YWxTeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEluc3RhbGwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTE5MDAsOTQgKzE5ODgsODIgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHNob3VsZEluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICBTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24gPSBtQWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb247CiAgICAgICAgICAgICAgICAgbU5lZWRTeW5jQWN0aXZlTm90aWZpY2F0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzZW5kU3luY1N0YXRlSW50ZW50KCk7CiAgICAgICAgICAgICAgICAgbVN5bmNOb3RpZmljYXRpb25JbmZvLmlzQWN0aXZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtU3luY05vdGlmaWNhdGlvbkluZm8uYWNjb3VudCA9IHN5bmNPcGVyYXRpb24uYWNjb3VudDsKLSAgICAgICAgICAgICAgICBtU3luY05vdGlmaWNhdGlvbkluZm8uYXV0aG9yaXR5ID0gc3luY09wZXJhdGlvbi5hdXRob3JpdHk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgd2VyZSBhbnkgbG9uZy1sYXN0aW5nIGVycm9ycywgaWYgc28gaW5zdGFsbCB0aGUgZXJyb3Igbm90aWZpY2F0aW9uLAotICAgICAgICAgKiBvdGhlcndpc2UgY2FuY2VsIHRoZSBlcnJvciBub3RpZmljYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgbWFuYWdlRXJyb3JOb3RpZmljYXRpb24oKSB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgbG9uZyB3aGVuID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldEluaXRpYWxTeW5jRmFpbHVyZVRpbWUoKTsKLSAgICAgICAgICAgIGlmICgod2hlbiA+IDApICYmICh3aGVuICsgRVJST1JfTk9USUZJQ0FUSU9OX0RFTEFZX01TIDwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRXJyb3JOb3RpZmljYXRpb25JbnN0YWxsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5lZWRTeW5jRXJyb3JOb3RpZmljYXRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBzZW5kU3luY1N0YXRlSW50ZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1FcnJvck5vdGlmaWNhdGlvbkluc3RhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtRXJyb3JOb3RpZmljYXRpb25JbnN0YWxsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5lZWRTeW5jRXJyb3JOb3RpZmljYXRpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFN5bmNTdGF0ZUludGVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRXJyb3JOb3RpZmljYXRpb25JbnN0YWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtYW5hZ2VTeW5jQWxhcm0oTG9uZyBlYXJsaWVzdEZ1dHVyZVBvbGxFbGFwc2VkVGltZSkgeworICAgICAgICBwcml2YXRlIHZvaWQgbWFuYWdlU3luY0FsYXJtTG9ja2VkKGxvbmcgbmV4dFBlcmlvZGljRXZlbnRFbGFwc2VkVGltZSwKKyAgICAgICAgICAgICAgICBsb25nIG5leHRQZW5kaW5nRXZlbnRFbGFwc2VkVGltZSkgewogICAgICAgICAgICAgLy8gaW4gZWFjaCBvZiB0aGVzZSBjYXNlcyB0aGUgc3luYyBsb29wIHdpbGwgYmUga2lja2VkLCB3aGljaCB3aWxsIGNhdXNlIHRoaXMKICAgICAgICAgICAgIC8vIG1ldGhvZCB0byBiZSBjYWxsZWQgYWdhaW4KICAgICAgICAgICAgIGlmICghbURhdGFDb25uZWN0aW9uSXNDb25uZWN0ZWQpIHJldHVybjsKICAgICAgICAgICAgIGlmIChtU3RvcmFnZUlzTG93KSByZXR1cm47CiAKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgICAgICAvLyBXaGVuIHRoZSBzdGF0dXMgYmFyIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgcmFpc2VkCisgICAgICAgICAgICBmaW5hbCBsb25nIG5vdGlmaWNhdGlvblRpbWUgPQorICAgICAgICAgICAgICAgICAgICAoIW1TeW5jSGFuZGxlci5tU3luY05vdGlmaWNhdGlvbkluZm8uaXNBY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtU3luY0hhbmRsZXIubVN5bmNOb3RpZmljYXRpb25JbmZvLnN0YXJ0VGltZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbVN5bmNIYW5kbGVyLm1TeW5jTm90aWZpY2F0aW9uSW5mby5zdGFydFRpbWUgKyBTWU5DX05PVElGSUNBVElPTl9ERUxBWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTG9uZy5NQVhfVkFMVUU7CiAKLSAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGFsYXJtIGZpcmUgdGltZToKLSAgICAgICAgICAgIC8vIC0gbm90IHN5bmNpbmc6IHRpbWUgb2YgdGhlIG5leHQgc3luYyBvcGVyYXRpb24KLSAgICAgICAgICAgIC8vIC0gc3luY2luZywgbm8gbm90aWZpY2F0aW9uOiB0aW1lIGZyb20gc3luYyBzdGFydCB0byBub3RpZmljYXRpb24gY3JlYXRlIHRpbWUKLSAgICAgICAgICAgIC8vIC0gc3luY2luZywgd2l0aCBub3RpZmljYXRpb246IHRpbWUgdGlsbCB0aW1lb3V0IG9mIHRoZSBhY3RpdmUgc3luYyBvcGVyYXRpb24KLSAgICAgICAgICAgIExvbmcgYWxhcm1UaW1lOwotICAgICAgICAgICAgQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQgPSBtQWN0aXZlU3luY0NvbnRleHQ7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlU3luY0NvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYWlyPFN5bmNPcGVyYXRpb24sIExvbmc+IGNhbmRpZGF0ZSA9IG1TeW5jUXVldWUubmV4dE9wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWFybGllc3RGdXR1cmVQb2xsRWxhcHNlZFRpbWUgPT0gbnVsbCAmJiBjYW5kaWRhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1UaW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlYXJsaWVzdEZ1dHVyZVBvbGxFbGFwc2VkVGltZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGFybVRpbWUgPSBjYW5kaWRhdGUuc2Vjb25kOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGFybVRpbWUgPSBlYXJsaWVzdEZ1dHVyZVBvbGxFbGFwc2VkVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsYXJtVGltZSA9IE1hdGgubWluKGVhcmxpZXN0RnV0dXJlUG9sbEVsYXBzZWRUaW1lLCBjYW5kaWRhdGUuc2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gV2hlbiB3ZSBzaG91bGQgY29uc2lkZXIgY2FuY2VsaW5nIGFuIGFjdGl2ZSBzeW5jCisgICAgICAgICAgICBsb25nIGVhcmxpZXN0VGltZW91dFRpbWUgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGZvciAoQWN0aXZlU3luY0NvbnRleHQgY3VycmVudFN5bmNDb250ZXh0IDogbUFjdGl2ZVN5bmNDb250ZXh0cykgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFN5bmNUaW1lb3V0VGltZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3luY0NvbnRleHQubVRpbWVvdXRTdGFydFRpbWUgKyBNQVhfVElNRV9QRVJfU1lOQzsKKyAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAibWFuYWdlU3luY0FsYXJtOiBhY3RpdmUgc3luYywgbVRpbWVvdXRTdGFydFRpbWUgKyBNQVggaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudFN5bmNUaW1lb3V0VGltZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIG5vdGlmaWNhdGlvblRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNIYW5kbGVyLm1TeW5jTm90aWZpY2F0aW9uSW5mby5zdGFydFRpbWUgKyBTWU5DX05PVElGSUNBVElPTl9ERUxBWTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHRpbWVvdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dC5tVGltZW91dFN0YXJ0VGltZSArIE1BWF9USU1FX1BFUl9TWU5DOwotICAgICAgICAgICAgICAgIGlmIChtU3luY0hhbmRsZXIubVN5bmNOb3RpZmljYXRpb25JbmZvLmlzQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsYXJtVGltZSA9IHRpbWVvdXRUaW1lOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsYXJtVGltZSA9IE1hdGgubWluKG5vdGlmaWNhdGlvblRpbWUsIHRpbWVvdXRUaW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoZWFybGllc3RUaW1lb3V0VGltZSA+IGN1cnJlbnRTeW5jVGltZW91dFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZWFybGllc3RUaW1lb3V0VGltZSA9IGN1cnJlbnRTeW5jVGltZW91dFRpbWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGFsYXJtVGltZSBzbyB0aGF0IHdlIHdpbGwgd2FrZSB1cCB3aGVuIGl0IGlzIHRpbWUgdG8KLSAgICAgICAgICAgIC8vIGluc3RhbGwgdGhlIGVycm9yIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgaWYgKCFtRXJyb3JOb3RpZmljYXRpb25JbnN0YWxsZWQpIHsKLSAgICAgICAgICAgICAgICBsb25nIHdoZW4gPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0SW5pdGlhbFN5bmNGYWlsdXJlVGltZSgpOwotICAgICAgICAgICAgICAgIGlmICh3aGVuID4gMCkgewotICAgICAgICAgICAgICAgICAgICB3aGVuICs9IEVSUk9SX05PVElGSUNBVElPTl9ERUxBWV9NUzsKLSAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB3aGVuIGZyb24gYWJzb2x1dGUgdGltZSB0byBlbGFwc2VkIHJ1biB0aW1lCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgZGVsYXkgPSB3aGVuIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoZW4gPSBub3cgKyBkZWxheTsKLSAgICAgICAgICAgICAgICAgICAgYWxhcm1UaW1lID0gYWxhcm1UaW1lICE9IG51bGwgPyBNYXRoLm1pbihhbGFybVRpbWUsIHdoZW4pIDogd2hlbjsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm1hbmFnZVN5bmNBbGFybTogbm90aWZpY2F0aW9uVGltZSBpcyAiICsgbm90aWZpY2F0aW9uVGltZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm1hbmFnZVN5bmNBbGFybTogZWFybGllc3RUaW1lb3V0VGltZSBpcyAiICsgZWFybGllc3RUaW1lb3V0VGltZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm1hbmFnZVN5bmNBbGFybTogbmV4dFBlcmlvZGljRXZlbnRFbGFwc2VkVGltZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5leHRQZXJpb2RpY0V2ZW50RWxhcHNlZFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAibWFuYWdlU3luY0FsYXJtOiBuZXh0UGVuZGluZ0V2ZW50RWxhcHNlZFRpbWUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXh0UGVuZGluZ0V2ZW50RWxhcHNlZFRpbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIGFsYXJtVGltZSA9IE1hdGgubWluKG5vdGlmaWNhdGlvblRpbWUsIGVhcmxpZXN0VGltZW91dFRpbWUpOworICAgICAgICAgICAgYWxhcm1UaW1lID0gTWF0aC5taW4oYWxhcm1UaW1lLCBuZXh0UGVyaW9kaWNFdmVudEVsYXBzZWRUaW1lKTsKKyAgICAgICAgICAgIGFsYXJtVGltZSA9IE1hdGgubWluKGFsYXJtVGltZSwgbmV4dFBlbmRpbmdFdmVudEVsYXBzZWRUaW1lKTsKKworICAgICAgICAgICAgLy8gQm91bmQgdGhlIGFsYXJtIHRpbWUuCisgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgaWYgKGFsYXJtVGltZSA8IG5vdyArIFNZTkNfQUxBUk1fVElNRU9VVF9NSU4pIHsKKyAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAibWFuYWdlU3luY0FsYXJtOiB0aGUgYWxhcm1UaW1lIGlzIHRvbyBzbWFsbCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWxhcm1UaW1lICsgIiwgc2V0dGluZyB0byAiICsgKG5vdyArIFNZTkNfQUxBUk1fVElNRU9VVF9NSU4pKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWxhcm1UaW1lID0gbm93ICsgU1lOQ19BTEFSTV9USU1FT1VUX01JTjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxhcm1UaW1lID4gbm93ICsgU1lOQ19BTEFSTV9USU1FT1VUX01BWCkgeworICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJtYW5hZ2VTeW5jQWxhcm06IHRoZSBhbGFybVRpbWUgaXMgdG9vIGxhcmdlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhbGFybVRpbWUgKyAiLCBzZXR0aW5nIHRvICIgKyAobm93ICsgU1lOQ19BTEFSTV9USU1FT1VUX01JTikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhbGFybVRpbWUgPSBub3cgKyBTWU5DX0FMQVJNX1RJTUVPVVRfTUFYOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBzZXQgb3IgY2FuY2VsIHRoZSBhbGFybQogICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRTZXQgPSBmYWxzZTsKICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQ2FuY2VsID0gZmFsc2U7CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsYXJtSXNBY3RpdmUgPSBtQWxhcm1TY2hlZHVsZVRpbWUgIT0gbnVsbDsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZEFsYXJtID0gYWxhcm1UaW1lICE9IG51bGw7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRBbGFybSA9IGFsYXJtVGltZSAhPSBMb25nLk1BWF9WQUxVRTsKICAgICAgICAgICAgIGlmIChuZWVkQWxhcm0pIHsKICAgICAgICAgICAgICAgICBpZiAoIWFsYXJtSXNBY3RpdmUgfHwgYWxhcm1UaW1lIDwgbUFsYXJtU2NoZWR1bGVUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNldCA9IHRydWU7CkBAIC0xOTk5LDYgKzIwNzUsMTEgQEAKICAgICAgICAgICAgIC8vIHNldCBvciBjYW5jZWwgdGhlIGFsYXJtIGFzIGRpcmVjdGVkCiAgICAgICAgICAgICBlbnN1cmVBbGFybVNlcnZpY2UoKTsKICAgICAgICAgICAgIGlmIChzaG91bGRTZXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicmVxdWVzdGluZyB0aGF0IHRoZSBhbGFybSBtYW5hZ2VyIHdha2UgdXMgdXAgYXQgZWxhcHNlZCB0aW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFsYXJtVGltZSArICIsIG5vdyBpcyAiICsgbm93ICsgIiwgIiArICgoYWxhcm1UaW1lIC0gbm93KSAvIDEwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlY3MgZnJvbSBub3ciKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUFsYXJtU2NoZWR1bGVUaW1lID0gYWxhcm1UaW1lOwogICAgICAgICAgICAgICAgIG1BbGFybVNlcnZpY2Uuc2V0KEFsYXJtTWFuYWdlci5FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwgYWxhcm1UaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNBbGFybUludGVudCk7CkBAIC0yMDEyLDcgKzIwOTMsNyBAQAogICAgICAgICAgICAgSW50ZW50IHN5bmNTdGF0ZUludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9TWU5DX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICAgICAgc3luY1N0YXRlSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7CiAgICAgICAgICAgICBzeW5jU3RhdGVJbnRlbnQucHV0RXh0cmEoImFjdGl2ZSIsIG1OZWVkU3luY0FjdGl2ZU5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICBzeW5jU3RhdGVJbnRlbnQucHV0RXh0cmEoImZhaWxpbmciLCBtTmVlZFN5bmNFcnJvck5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICBzeW5jU3RhdGVJbnRlbnQucHV0RXh0cmEoImZhaWxpbmciLCBmYWxzZSk7CiAgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KHN5bmNTdGF0ZUludGVudCk7CiAgICAgICAgIH0KIApAQCAtMjEwMSw0ICsyMTgyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE1lc3NhZ2UsIGRvd25zdHJlYW1BY3Rpdml0eSwgdXBzdHJlYW1BY3Rpdml0eSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTeW5jU3RpbGxBY3RpdmUoQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQpIHsKKyAgICAgICAgZm9yIChBY3RpdmVTeW5jQ29udGV4dCBzeW5jIDogbUFjdGl2ZVN5bmNDb250ZXh0cykgeworICAgICAgICAgICAgaWYgKHN5bmMgPT0gYWN0aXZlU3luY0NvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jT3BlcmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNPcGVyYXRpb24uamF2YQppbmRleCBiMDE2MDg4NS4uM2Q3ZjNmYmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY09wZXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY09wZXJhdGlvbi5qYXZhCkBAIC0zMyw5ICszMywxMiBAQAogICAgIHB1YmxpYyBsb25nIGVhcmxpZXN0UnVuVGltZTsKICAgICBwdWJsaWMgYm9vbGVhbiBleHBlZGl0ZWQ7CiAgICAgcHVibGljIFN5bmNTdG9yYWdlRW5naW5lLlBlbmRpbmdPcGVyYXRpb24gcGVuZGluZ09wZXJhdGlvbjsKKyAgICBwdWJsaWMgTG9uZyBiYWNrb2ZmOworICAgIHB1YmxpYyBsb25nIGRlbGF5VW50aWw7CisgICAgcHVibGljIGxvbmcgZWZmZWN0aXZlUnVuVGltZTsKIAogICAgIHB1YmxpYyBTeW5jT3BlcmF0aW9uKEFjY291bnQgYWNjb3VudCwgaW50IHNvdXJjZSwgU3RyaW5nIGF1dGhvcml0eSwgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIGxvbmcgZGVsYXlJbk1zKSB7CisgICAgICAgICAgICBsb25nIGRlbGF5SW5NcywgbG9uZyBiYWNrb2ZmLCBsb25nIGRlbGF5VW50aWwpIHsKICAgICAgICAgdGhpcy5hY2NvdW50ID0gYWNjb3VudDsKICAgICAgICAgdGhpcy5zeW5jU291cmNlID0gc291cmNlOwogICAgICAgICB0aGlzLmF1dGhvcml0eSA9IGF1dGhvcml0eTsKQEAgLTQ4LDYgKzUxLDggQEAKICAgICAgICAgcmVtb3ZlRmFsc2VFeHRyYShDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfRElTQ0FSRF9MT0NBTF9ERUxFVElPTlMpOwogICAgICAgICByZW1vdmVGYWxzZUV4dHJhKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19FWFBFRElURUQpOwogICAgICAgICByZW1vdmVGYWxzZUV4dHJhKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19PVkVSUklERV9UT09fTUFOWV9ERUxFVElPTlMpOworICAgICAgICB0aGlzLmRlbGF5VW50aWwgPSBkZWxheVVudGlsOworICAgICAgICB0aGlzLmJhY2tvZmYgPSBiYWNrb2ZmOwogICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICBpZiAoZGVsYXlJbk1zIDwgMCkgewogICAgICAgICAgICAgdGhpcy5leHBlZGl0ZWQgPSB0cnVlOwpAQCAtNTYsNiArNjEsNyBAQAogICAgICAgICAgICAgdGhpcy5leHBlZGl0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHRoaXMuZWFybGllc3RSdW5UaW1lID0gbm93ICsgZGVsYXlJbk1zOwogICAgICAgICB9CisgICAgICAgIHVwZGF0ZUVmZmVjdGl2ZVJ1blRpbWUoKTsKICAgICAgICAgdGhpcy5rZXkgPSB0b0tleSgpOwogICAgIH0KIApAQCAtNzIsNDkgKzc4LDc4IEBACiAgICAgICAgIHRoaXMuZXh0cmFzID0gbmV3IEJ1bmRsZShvdGhlci5leHRyYXMpOwogICAgICAgICB0aGlzLmV4cGVkaXRlZCA9IG90aGVyLmV4cGVkaXRlZDsKICAgICAgICAgdGhpcy5lYXJsaWVzdFJ1blRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKyAgICAgICAgdGhpcy5iYWNrb2ZmID0gb3RoZXIuYmFja29mZjsKKyAgICAgICAgdGhpcy5kZWxheVVudGlsID0gb3RoZXIuZGVsYXlVbnRpbDsKKyAgICAgICAgdGhpcy51cGRhdGVFZmZlY3RpdmVSdW5UaW1lKCk7CiAgICAgICAgIHRoaXMua2V5ID0gdG9LZXkoKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZHVtcCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGR1bXAoYm9vbGVhbiB1c2VPbmVMaW5lKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBzYi5hcHBlbmQoImF1dGhvcml0eTogIikuYXBwZW5kKGF1dGhvcml0eSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIGFjY291bnQ6ICIpLmFwcGVuZChhY2NvdW50KTsKLSAgICAgICAgc2IuYXBwZW5kKCIgZXh0cmFzOiAiKTsKLSAgICAgICAgZXh0cmFzVG9TdHJpbmdCdWlsZGVyKGV4dHJhcywgc2IsIGZhbHNlIC8qIGFzS2V5ICovKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgc3luY1NvdXJjZTogIikuYXBwZW5kKHN5bmNTb3VyY2UpOwotICAgICAgICBzYi5hcHBlbmQoIiB3aGVuOiAiKS5hcHBlbmQoZWFybGllc3RSdW5UaW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgZXhwZWRpdGVkOiAiKS5hcHBlbmQoZXhwZWRpdGVkKTsKKyAgICAgICAgc2IuYXBwZW5kKGFjY291bnQubmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiICgiICsgYWNjb3VudC50eXBlICsgIikiKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsICIgKyBhdXRob3JpdHkpOworICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgIHNiLmFwcGVuZChTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VTW3N5bmNTb3VyY2VdKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIGVhcmxpZXN0UnVuVGltZSAiICsgZWFybGllc3RSdW5UaW1lKTsKKyAgICAgICAgaWYgKGV4cGVkaXRlZCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIEVYUEVESVRFRCIpOworICAgICAgICB9CisgICAgICAgIGlmICghdXNlT25lTGluZSAmJiAhZXh0cmFzLmtleVNldCgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJcbiAgICAiKTsKKyAgICAgICAgICAgIGV4dHJhc1RvU3RyaW5nQnVpbGRlcihleHRyYXMsIHNiKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemF0aW9uKCkgeworICAgICAgICByZXR1cm4gZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lOSVRJQUxJWkUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpZ25vcmVCYWNrb2ZmKCkgeworICAgICAgICByZXR1cm4gZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lHTk9SRV9CQUNLT0ZGLCBmYWxzZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBTdHJpbmcgdG9LZXkoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBzYi5hcHBlbmQoImF1dGhvcml0eTogIikuYXBwZW5kKGF1dGhvcml0eSk7Ci0Jc2IuYXBwZW5kKCIgYWNjb3VudCB7bmFtZT0iICsgYWNjb3VudC5uYW1lICsgIiwgdHlwZT0iICsgYWNjb3VudC50eXBlICsgIn0iKTsKKyAgICAJc2IuYXBwZW5kKCIgYWNjb3VudCB7bmFtZT0iICsgYWNjb3VudC5uYW1lICsgIiwgdHlwZT0iICsgYWNjb3VudC50eXBlICsgIn0iKTsKICAgICAgICAgc2IuYXBwZW5kKCIgZXh0cmFzOiAiKTsKLSAgICAgICAgZXh0cmFzVG9TdHJpbmdCdWlsZGVyKGV4dHJhcywgc2IsIHRydWUgLyogYXNLZXkgKi8pOworICAgICAgICBleHRyYXNUb1N0cmluZ0J1aWxkZXIoZXh0cmFzLCBzYik7CiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleHRyYXNUb1N0cmluZ0J1aWxkZXIoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nQnVpbGRlciBzYiwgYm9vbGVhbiBhc0tleSkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleHRyYXNUb1N0cmluZ0J1aWxkZXIoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nQnVpbGRlciBzYikgewogICAgICAgICBzYi5hcHBlbmQoIlsiKTsKICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogYnVuZGxlLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgd3JpdGluZyB0aGlzIGFzIGEga2V5IGRvbid0IGNvbnNpZGVyIHdoZXRoZXIgdGhpcwotICAgICAgICAgICAgLy8gaXMgYW4gaW5pdGlhbGl6YXRpb24gc3luYyBvciBub3Qgd2hlbiBjb21wdXRpbmcgdGhlIGtleSBzaW5jZQotICAgICAgICAgICAgLy8gd2Ugc2V0IHRoaXMgZmxhZyBhcHByb3ByaWF0ZWx5IHdoZW4gZGlzcGF0Y2hpbmcgdGhlIHN5bmMgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChhc0tleSAmJiBDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSU5JVElBTElaRS5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgc2IuYXBwZW5kKGtleSkuYXBwZW5kKCI9IikuYXBwZW5kKGJ1bmRsZS5nZXQoa2V5KSkuYXBwZW5kKCIgIik7CiAgICAgICAgIH0KICAgICAgICAgc2IuYXBwZW5kKCJdIik7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdXBkYXRlRWZmZWN0aXZlUnVuVGltZSgpIHsKKyAgICAgICAgZWZmZWN0aXZlUnVuVGltZSA9IGlnbm9yZUJhY2tvZmYoKQorICAgICAgICAgICAgICAgID8gZWFybGllc3RSdW5UaW1lCisgICAgICAgICAgICAgICAgOiBNYXRoLm1heCgKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZWFybGllc3RSdW5UaW1lLCBkZWxheVVudGlsKSwKKyAgICAgICAgICAgICAgICAgICAgYmFja29mZik7CisgICAgfQorCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKICAgICAgICAgU3luY09wZXJhdGlvbiBvdGhlciA9IChTeW5jT3BlcmF0aW9uKW87Ci0gICAgICAgIGlmIChlYXJsaWVzdFJ1blRpbWUgPT0gb3RoZXIuZWFybGllc3RSdW5UaW1lKSB7CisKKyAgICAgICAgaWYgKGV4cGVkaXRlZCAhPSBvdGhlci5leHBlZGl0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBleHBlZGl0ZWQgPyAtMSA6IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZWZmZWN0aXZlUnVuVGltZSA9PSBvdGhlci5lZmZlY3RpdmVSdW5UaW1lKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKGVhcmxpZXN0UnVuVGltZSA8IG90aGVyLmVhcmxpZXN0UnVuVGltZSkgPyAtMSA6IDE7CisKKyAgICAgICAgcmV0dXJuIGVmZmVjdGl2ZVJ1blRpbWUgPCBvdGhlci5lZmZlY3RpdmVSdW5UaW1lID8gLTEgOiAxOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1F1ZXVlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNRdWV1ZS5qYXZhCmluZGV4IDI4YmFhMGQuLmY4MjYxNDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1F1ZXVlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jUXVldWUuamF2YQpAQCAtMTYsMTcgKzE2LDE4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCi1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKIAoraW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgogICoKQEAgLTM4LDcgKzM5LDcgQEAKIAogICAgIC8vIEEgTWFwIG9mIFN5bmNPcGVyYXRpb25zIG9wZXJhdGlvbktleSAtPiBTeW5jT3BlcmF0aW9uIHRoYXQgaXMgZGVzaWduZWQgZm9yCiAgICAgLy8gcXVpY2sgbG9va3VwIG9mIGFuIGVucXVldWVkIFN5bmNPcGVyYXRpb24uCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3luY09wZXJhdGlvbj4gbU9wZXJhdGlvbnNNYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBwdWJsaWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN5bmNPcGVyYXRpb24+IG1PcGVyYXRpb25zTWFwID0gTWFwcy5uZXdIYXNoTWFwKCk7CiAKICAgICBwdWJsaWMgU3luY1F1ZXVlKFN5bmNTdG9yYWdlRW5naW5lIHN5bmNTdG9yYWdlRW5naW5lKSB7CiAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZSA9IHN5bmNTdG9yYWdlRW5naW5lOwpAQCAtNDcsOCArNDgsMTEgQEAKICAgICAgICAgZmluYWwgaW50IE4gPSBvcHMuc2l6ZSgpOwogICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5QZW5kaW5nT3BlcmF0aW9uIG9wID0gb3BzLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIFBhaXI8TG9uZywgTG9uZz4gYmFja29mZiA9IHN5bmNTdG9yYWdlRW5naW5lLmdldEJhY2tvZmYob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KTsKICAgICAgICAgICAgIFN5bmNPcGVyYXRpb24gc3luY09wZXJhdGlvbiA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICBvcC5hY2NvdW50LCBvcC5zeW5jU291cmNlLCBvcC5hdXRob3JpdHksIG9wLmV4dHJhcywgMCAvKiBkZWxheSAqLyk7CisgICAgICAgICAgICAgICAgICAgIG9wLmFjY291bnQsIG9wLnN5bmNTb3VyY2UsIG9wLmF1dGhvcml0eSwgb3AuZXh0cmFzLCAwIC8qIGRlbGF5ICovLAorICAgICAgICAgICAgICAgICAgICBiYWNrb2ZmICE9IG51bGwgPyBiYWNrb2ZmLmZpcnN0IDogMCwKKyAgICAgICAgICAgICAgICAgICAgc3luY1N0b3JhZ2VFbmdpbmUuZ2V0RGVsYXlVbnRpbFRpbWUob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KSk7CiAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLmV4cGVkaXRlZCA9IG9wLmV4cGVkaXRlZDsKICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24ucGVuZGluZ09wZXJhdGlvbiA9IG9wOwogICAgICAgICAgICAgYWRkKHN5bmNPcGVyYXRpb24sIG9wKTsKQEAgLTExOSw2NSArMTIzLDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBvcGVyYXRpb24gdGhhdCBzaG91bGQgcnVuIG5leHQuIE9wZXJhdGlvbnMgYXJlIHNvcnRlZCBieSB0aGVpciBlYXJsaWVzdFJ1blRpbWUsCi0gICAgICogcHJpb3JpdGl6aW5nIGZpcnN0IHRob3NlIHdpdGggYSBzeW5jYWJsZSBzdGF0ZSBvZiAidW5rbm93biIgdGhhdCBhcmVuJ3QgcmV0cmllcyB0aGVuCi0gICAgICogZXhwZWRpdGVkIG9wZXJhdGlvbnMuCi0gICAgICogVGhlIGVhcmxpZXN0UnVuVGltZSBpcyBhZGp1c3RlZCBieSB0aGUgc3luYyBhZGFwdGVyJ3MgYmFja29mZiBhbmQgZGVsYXlVbnRpbCB0aW1lcywgaWYgYW55LgotICAgICAqIEByZXR1cm4gdGhlIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBydW4gbmV4dCBhbmQgd2hlbiBpdCBzaG91bGQgcnVuLiBUaGUgdGltZSBtYXkgYmUgaW4KLSAgICAgKiB0aGUgZnV0dXJlLiBJdCBpcyBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QuCi0gICAgICovCi0gICAgcHVibGljIFBhaXI8U3luY09wZXJhdGlvbiwgTG9uZz4gbmV4dE9wZXJhdGlvbigpIHsKLSAgICAgICAgU3luY09wZXJhdGlvbiBiZXN0ID0gbnVsbDsKLSAgICAgICAgbG9uZyBiZXN0UnVuVGltZSA9IDA7Ci0gICAgICAgIGJvb2xlYW4gYmVzdFN5bmNhYmxlSXNVbmtub3duQW5kTm90QVJldHJ5ID0gZmFsc2U7CisgICAgcHVibGljIHZvaWQgb25CYWNrb2ZmQ2hhbmdlZChBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUsIGxvbmcgYmFja29mZikgeworICAgICAgICAvLyBmb3IgZWFjaCBvcCB0aGF0IG1hdGNoZXMgdGhlIGFjY291bnQgYW5kIHByb3ZpZGVyIHVwZGF0ZSBpdHMKKyAgICAgICAgLy8gYmFja29mZiBhbmQgZWZmZWN0aXZlU3RhcnRUaW1lCiAgICAgICAgIGZvciAoU3luY09wZXJhdGlvbiBvcCA6IG1PcGVyYXRpb25zTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBsb25nIG9wUnVuVGltZSA9IG9wLmVhcmxpZXN0UnVuVGltZTsKLSAgICAgICAgICAgIGlmICghb3AuZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lHTk9SRV9CQUNLT0ZGLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICBQYWlyPExvbmcsIExvbmc+IGJhY2tvZmYgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0QmFja29mZihvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpOwotICAgICAgICAgICAgICAgIGxvbmcgZGVsYXlVbnRpbCA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXREZWxheVVudGlsVGltZShvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpOwotICAgICAgICAgICAgICAgIG9wUnVuVGltZSA9IE1hdGgubWF4KAotICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgob3BSdW5UaW1lLCBkZWxheVVudGlsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tvZmYgIT0gbnVsbCA/IGJhY2tvZmYuZmlyc3QgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHdlIGtub3cgYSBzeW5jIGlzIGEgcmV0cnkgaWYgdGhlIGludGlhbGl6YXRpb24gZmxhZyBpcyBzZXQsIHNpbmNlIHRoYXQgd2lsbCBvbmx5Ci0gICAgICAgICAgICAvLyBiZSBzZXQgYnkgdGhlIHN5bmMgZGlzcGF0Y2hpbmcgY29kZSwgdGh1cyBpZiBpdCBpcyBzZXQgaXQgbXVzdCBoYXZlIGFscmVhZHkgYmVlbgotICAgICAgICAgICAgLy8gZGlzcGF0Y2hlZAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzeW5jYWJsZUlzVW5rbm93bkFuZE5vdEFSZXRyeSA9Ci0gICAgICAgICAgICAgICAgICAgICFvcC5leHRyYXMuZ2V0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSU5JVElBTElaRSwgZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICYmIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRJc1N5bmNhYmxlKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSkgPCAwOwotICAgICAgICAgICAgLy8gaWYgdGhlIHVuc3luY2FibGUgc3RhdGUgZGlmZmVycywgbWFrZSB0aGUgY3VycmVudCB0aGUgYmVzdCBpZiBpdCBpcyB1bnN5bmNhYmxlCi0gICAgICAgICAgICAvLyBlbHNlLCBpZiB0aGUgZXhwZWRpdGVkIHN0YXRlIGRpZmZlcnMsIG1ha2UgdGhlIGN1cnJlbnQgdGhlIGJlc3QgaWYgaXQgaXMgZXhwZWRpdGVkCi0gICAgICAgICAgICAvLyBlbHNlLCBtYWtlIHRoZSBjdXJyZW50IHRoZSBiZXN0IGlmIGl0IGlzIGVhcmxpZXIgdGhhbiB0aGUgYmVzdAotICAgICAgICAgICAgaWYgKGJlc3QgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCAoKGJlc3RTeW5jYWJsZUlzVW5rbm93bkFuZE5vdEFSZXRyeSA9PSBzeW5jYWJsZUlzVW5rbm93bkFuZE5vdEFSZXRyeSkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gKGJlc3QuZXhwZWRpdGVkID09IG9wLmV4cGVkaXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvcFJ1blRpbWUgPCBiZXN0UnVuVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcC5leHBlZGl0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHN5bmNhYmxlSXNVbmtub3duQW5kTm90QVJldHJ5KSkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBvcDsKLSAgICAgICAgICAgICAgICBiZXN0U3luY2FibGVJc1Vua25vd25BbmROb3RBUmV0cnkgPSBzeW5jYWJsZUlzVW5rbm93bkFuZE5vdEFSZXRyeTsKLSAgICAgICAgICAgICAgICBiZXN0UnVuVGltZSA9IG9wUnVuVGltZTsKKyAgICAgICAgICAgIGlmIChvcC5hY2NvdW50LmVxdWFscyhhY2NvdW50KSAmJiBvcC5hdXRob3JpdHkuZXF1YWxzKHByb3ZpZGVyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBvcC5iYWNrb2ZmID0gYmFja29mZjsKKyAgICAgICAgICAgICAgICBvcC51cGRhdGVFZmZlY3RpdmVSdW5UaW1lKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKGJlc3QsIGJlc3RSdW5UaW1lKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBGaW5kIGFuZCByZXR1cm4gdGhlIFN5bmNPcGVyYXRpb24gdGhhdCBzaG91bGQgYmUgcnVuIG5leHQgYW5kIGlzIHJlYWR5IHRvIHJ1bi4KLSAgICAgKiBAcGFyYW0gbm93IHRoZSBjdXJyZW50IHtAbGluayBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZSgpfSwgdXNlZCB0bwotICAgICAqIGRlY2lkZSBpZiB0aGUgc3luYyBvcGVyYXRpb24gaXMgcmVhZHkgdG8gcnVuCi0gICAgICogQHJldHVybiB0aGUgU3luY09wZXJhdGlvbiB0aGF0IHNob3VsZCBiZSBydW4gbmV4dCBhbmQgaXMgcmVhZHkgdG8gcnVuLgotICAgICAqLwotICAgIHB1YmxpYyBQYWlyPFN5bmNPcGVyYXRpb24sIExvbmc+IG5leHRSZWFkeVRvUnVuKGxvbmcgbm93KSB7Ci0gICAgICAgIFBhaXI8U3luY09wZXJhdGlvbiwgTG9uZz4gbmV4dE9wQW5kUnVuVGltZSA9IG5leHRPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKG5leHRPcEFuZFJ1blRpbWUgPT0gbnVsbCB8fCBuZXh0T3BBbmRSdW5UaW1lLnNlY29uZCA+IG5vdykgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgcHVibGljIHZvaWQgb25EZWxheVVudGlsVGltZUNoYW5nZWQoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lLCBsb25nIGRlbGF5VW50aWwpIHsKKyAgICAgICAgLy8gZm9yIGVhY2ggb3AgdGhhdCBtYXRjaGVzIHRoZSBhY2NvdW50IGFuZCBwcm92aWRlciB1cGRhdGUgaXRzCisgICAgICAgIC8vIGRlbGF5VW50aWxUaW1lIGFuZCBlZmZlY3RpdmVTdGFydFRpbWUKKyAgICAgICAgZm9yIChTeW5jT3BlcmF0aW9uIG9wIDogbU9wZXJhdGlvbnNNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmIChvcC5hY2NvdW50LmVxdWFscyhhY2NvdW50KSAmJiBvcC5hdXRob3JpdHkuZXF1YWxzKHByb3ZpZGVyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBvcC5kZWxheVVudGlsID0gZGVsYXlVbnRpbDsKKyAgICAgICAgICAgICAgICBvcC51cGRhdGVFZmZlY3RpdmVSdW5UaW1lKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5leHRPcEFuZFJ1blRpbWU7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgewpAQCAtMjAwLDkgKzE2NSwxNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nQnVpbGRlciBzYikgeworICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICBzYi5hcHBlbmQoIlN5bmNRdWV1ZTogIikuYXBwZW5kKG1PcGVyYXRpb25zTWFwLnNpemUoKSkuYXBwZW5kKCIgb3BlcmF0aW9uKHMpXG4iKTsKICAgICAgICAgZm9yIChTeW5jT3BlcmF0aW9uIG9wZXJhdGlvbiA6IG1PcGVyYXRpb25zTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQob3BlcmF0aW9uKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICBpZiAob3BlcmF0aW9uLmVmZmVjdGl2ZVJ1blRpbWUgPD0gbm93KSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJSRUFEWSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoRGF0ZVV0aWxzLmZvcm1hdEVsYXBzZWRUaW1lKChvcGVyYXRpb24uZWZmZWN0aXZlUnVuVGltZSAtIG5vdykgLyAxMDAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAtICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG9wZXJhdGlvbi5kdW1wKGZhbHNlKSkuYXBwZW5kKCJcbiIpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZS5qYXZhCmluZGV4IGY5YTE2MzcuLjA2Mzk1NzMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1N0b3JhZ2VFbmdpbmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNTdG9yYWdlRW5naW5lLmphdmEKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFBlbmRpbmdPcGVyYXRpb24+IG1QZW5kaW5nT3BlcmF0aW9ucyA9CiAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFBlbmRpbmdPcGVyYXRpb24+KCk7CiAKLSAgICBwcml2YXRlIFN5bmNJbmZvIG1DdXJyZW50U3luYzsKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTeW5jSW5mbz4gbUN1cnJlbnRTeW5jcyA9IG5ldyBBcnJheUxpc3Q8U3luY0luZm8+KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PFN5bmNTdGF0dXNJbmZvPiBtU3luY1N0YXR1cyA9CiAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8U3luY1N0YXR1c0luZm8+KCk7CkBAIC02OTAsMjMgKzY5MCwxMiBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGN1cnJlbnRseSBhIHN5bmMgb3BlcmF0aW9uIGZvciB0aGUgZ2l2ZW4KLSAgICAgKiBhY2NvdW50IG9yIGF1dGhvcml0eSBpbiB0aGUgcGVuZGluZyBsaXN0LCBvciBhY3RpdmVseSBiZWluZyBwcm9jZXNzZWQuCisgICAgICogYWNjb3VudCBvciBhdXRob3JpdHkgYWN0aXZlbHkgYmVpbmcgcHJvY2Vzc2VkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU3luY0FjdGl2ZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIGludCBpID0gbVBlbmRpbmdPcGVyYXRpb25zLnNpemUoKTsKLSAgICAgICAgICAgIHdoaWxlIChpID4gMCkgewotICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGZyZWRxKTogdGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgY29uc2lkZXJpbmcKLSAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIG9wZXJhdGlvbnMuCi0gICAgICAgICAgICAgICAgUGVuZGluZ09wZXJhdGlvbiBvcCA9IG1QZW5kaW5nT3BlcmF0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wLmFjY291bnQuZXF1YWxzKGFjY291bnQpICYmIG9wLmF1dGhvcml0eS5lcXVhbHMoYXV0aG9yaXR5KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ3VycmVudFN5bmMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYWluZm8gPSBnZXRBdXRob3JpdHkobUN1cnJlbnRTeW5jLmF1dGhvcml0eUlkKTsKKyAgICAgICAgICAgIGZvciAoU3luY0luZm8gc3luY0luZm8gOiBtQ3VycmVudFN5bmNzKSB7CisgICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhaW5mbyA9IGdldEF1dGhvcml0eShzeW5jSW5mby5hdXRob3JpdHlJZCk7CiAgICAgICAgICAgICAgICAgaWYgKGFpbmZvICE9IG51bGwgJiYgYWluZm8uYWNjb3VudC5lcXVhbHMoYWNjb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFpbmZvLmF1dGhvcml0eS5lcXVhbHMoYXV0aG9yaXR5KSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTg4Nyw0MCArODc2LDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgc3luYyBpcyBjaGFuZ2luZyAodGhlcmUgY2FuIG9ubHkgYmUKLSAgICAgKiBvbmUgYXQgYSB0aW1lKS4gIEVpdGhlciBzdXBwbHkgYSB2YWxpZCBBY3RpdmVTeW5jQ29udGV4dCB3aXRoIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIHN5bmMsIG9yIG51bGwgdG8gc3RvcCB0aGUgY3VycmVudGx5IGFjdGl2ZSBzeW5jLgorICAgICAqIENhbGxlZCB3aGVuIGEgc3luYyBpcyBzdGFydGluZy4gU3VwcGx5IGEgdmFsaWQgQWN0aXZlU3luY0NvbnRleHQgd2l0aCBpbmZvcm1hdGlvbgorICAgICAqIGFib3V0IHRoZSBzeW5jLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVN5bmMoU3luY01hbmFnZXIuQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQpIHsKKyAgICBwdWJsaWMgU3luY0luZm8gYWRkQWN0aXZlU3luYyhTeW5jTWFuYWdlci5BY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCkgeworICAgICAgICBmaW5hbCBTeW5jSW5mbyBzeW5jSW5mbzsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVTeW5jQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInNldEFjdGl2ZVN5bmM6IGFjY291bnQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIgYXV0aD0iICsgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYXV0aG9yaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIgc3JjPSIgKyBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5zeW5jU291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZXh0cmFzPSIgKyBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5leHRyYXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTeW5jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0QWN0aXZlU3luYyBjYWxsZWQgd2l0aCBleGlzdGluZyBhY3RpdmUgc3luYyEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRBdXRob3JpdHlMb2NrZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgInNldEFjdGl2ZVN5bmMiKTsKLSAgICAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFN5bmMgPSBuZXcgU3luY0luZm8oYXV0aG9yaXR5LmlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5LmFjY291bnQsIGF1dGhvcml0eS5hdXRob3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3RhcnRUaW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSBMb2cudihUQUcsICJzZXRBY3RpdmVTeW5jOiBudWxsIik7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTeW5jID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInNldEFjdGl2ZVN5bmM6IGFjY291bnQ9IgorICAgICAgICAgICAgICAgICAgICArIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmFjY291bnQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGF1dGg9IiArIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmF1dGhvcml0eQorICAgICAgICAgICAgICAgICAgICArICIgc3JjPSIgKyBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5zeW5jU291cmNlCisgICAgICAgICAgICAgICAgICAgICsgIiBleHRyYXM9IiArIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmV4dHJhcyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50LAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgIC0xIC8qIGFzc2lnbiBhIG5ldyBpZGVudGlmaWVyIGlmIGNyZWF0aW5nIGEgbmV3IGF1dGhvcml0eSAqLywKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiB3cml0ZSB0byBzdG9yYWdlIGlmIHRoaXMgcmVzdWx0cyBpbiBhIGNoYW5nZSAqLyk7CisgICAgICAgICAgICBzeW5jSW5mbyA9IG5ldyBTeW5jSW5mbyhhdXRob3JpdHkuaWRlbnQsCisgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eS5hY2NvdW50LCBhdXRob3JpdHkuYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3RhcnRUaW1lKTsKKyAgICAgICAgICAgIG1DdXJyZW50U3luY3MuYWRkKHN5bmNJbmZvKTsKICAgICAgICAgfQogCi0gICAgICAgIHJlcG9ydENoYW5nZShDb250ZW50UmVzb2x2ZXIuU1lOQ19PQlNFUlZFUl9UWVBFX0FDVElWRSk7CisgICAgICAgIHJlcG9ydEFjdGl2ZUNoYW5nZSgpOworICAgICAgICByZXR1cm4gc3luY0luZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgYSBwcmV2aW91c2x5IGFjdGl2ZSBzeW5jIGlzIG5vIGxvbmdlciBhY3RpdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWN0aXZlU3luYyhTeW5jSW5mbyBzeW5jSW5mbykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicmVtb3ZlQWN0aXZlU3luYzogYWNjb3VudD0iCisgICAgICAgICAgICAgICAgICAgICAgICArIHN5bmNJbmZvLmFjY291bnQgKyAiIGF1dGg9IiArIHN5bmNJbmZvLmF1dGhvcml0eSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudFN5bmNzLnJlbW92ZShzeW5jSW5mbyk7CisgICAgICAgIH0KKworICAgICAgICByZXBvcnRBY3RpdmVDaGFuZ2UoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwOTIsMTMgKzEwODgsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgc3luYyBpbmZvcm1hdGlvbiwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubwotICAgICAqIGFjdGl2ZSBzeW5jLiAgTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBvYmplY3QgaXMgdGhlIHJlYWwsIGxpdmUgYWN0aXZlCi0gICAgICogc3luYyBvYmplY3QsIHNvIGJlIGNhcmVmdWwgd2hhdCB5b3UgZG8gd2l0aCBpdC4KKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN5bmNzLiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGl0ZW1zIGFyZSB0aGUKKyAgICAgKiByZWFsLCBsaXZlIGFjdGl2ZSBzeW5jIG9iamVjdHMsIHNvIGJlIGNhcmVmdWwgd2hhdCB5b3UgZG8gd2l0aCBpdC4KICAgICAgKi8KLSAgICBwdWJsaWMgU3luY0luZm8gZ2V0Q3VycmVudFN5bmMoKSB7CisgICAgcHVibGljIExpc3Q8U3luY0luZm8+IGdldEN1cnJlbnRTeW5jcygpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFN5bmM7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTeW5jSW5mbz4obUN1cnJlbnRTeW5jcyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvWG1sRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzYWQzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvWG1sRG9jdW1lbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIuT3BlblJlc291cmNlSWRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEEgcmVhZC1vbmx5IGNvbnRlbnQgcHJvdmlkZXIgd2hpY2ggZXh0cmFjdHMgZGF0YSBvdXQgb2YgYW4gWE1MIGRvY3VtZW50LgorICoKKyAqIDxwPkEgWFBhdGgtbGlrZSBzZWxlY3Rpb24gcGF0dGVybiBpcyB1c2VkIHRvIHNlbGVjdCBzb21lIG5vZGVzIGluIHRoZSBYTUwgZG9jdW1lbnQuIEVhY2ggc3VjaAorICogbm9kZSB3aWxsIGNyZWF0ZSBhIHJvdyBpbiB0aGUge0BsaW5rIEN1cnNvcn0gcmVzdWx0LjwvcD4KKyAqCisgKiBFYWNoIHJvdyBpcyB0aGVuIHBvcHVsYXRlZCB3aXRoIGNvbHVtbnMgdGhhdCBhcmUgYWxzbyBkZWZpbmVkIGFzIFhQYXRoLWxpa2UgcHJvamVjdGlvbnMuIFRoZXNlCisgKiBwcm9qZWN0aW9ucyBmZXRjaCBhdHRyaWJ1dGVzIHZhbHVlcyBvciB0ZXh0IGluIHRoZSBtYXRjaGluZyByb3cgbm9kZSBvciBpdHMgY2hpbGRyZW4uCisgKgorICogPHA+VG8gYWRkIHRoaXMgcHJvdmlkZXIgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IHNob3VsZCBhZGQgaXRzIGRlY2xhcmF0aW9uIHRvIHlvdXIgYXBwbGljYXRpb24KKyAqIG1hbmlmZXN0OgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O3Byb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlhtbERvY3VtZW50UHJvdmlkZXIiIGFuZHJvaWQ6YXV0aG9yaXRpZXM9InhtbGRvY3VtZW50IiAvJmd0OworICogPC9wcmU+CisgKiA8L3A+CisgKgorICogPGgyPk5vZGUgc2VsZWN0aW9uIHN5bnRheDwvaDI+CisgKiBUaGUgbm9kZSBzZWxlY3Rpb24gc3ludGF4IGlzIG1hZGUgb2YgdGhlIGNvbmNhdGVuYXRpb24gb2YgYW4gYXJiaXRyYXJ5IG51bWJlciAoYXQgbGVhc3Qgb25lKSBvZgorICogPGNvZGU+L25vZGVfbmFtZTwvY29kZT4gbm9kZSBzZWxlY3Rpb24gcGF0dGVybnMuCisgKgorICogPHA+VGhlIDxjb2RlPi9yb290L2NoaWxkMS9jaGlsZDI8L2NvZGU+IHBhdHRlcm4gd2lsbCBmb3IgaW5zdGFuY2UgbWF0Y2ggYWxsIG5vZGVzIG5hbWVkCisgKiA8Y29kZT5jaGlsZDI8L2NvZGU+IHdoaWNoIGFyZSBjaGlsZHJlbiBvZiBhIG5vZGUgbmFtZWQgPGNvZGU+Y2hpbGQxPC9jb2RlPiB3aGljaCBhcmUgdGhlbXNlbHZlcworICogY2hpbGRyZW4gb2YgYSByb290IG5vZGUgbmFtZWQgPGNvZGU+cm9vdDwvY29kZT4uPC9wPgorICoKKyAqIEFueSA8Y29kZT4vPC9jb2RlPiBzZXBhcmF0b3IgaW4gdGhlIHByZXZpb3VzIGV4cHJlc3Npb24gY2FuIGJlIHJlcGxhY2VkIGJ5IGEgPGNvZGU+Ly88L2NvZGU+CisgKiBzZXBhcmF0b3IgaW5zdGVhZCwgd2hpY2ggaW5kaWNhdGVkIGEgPGk+ZGVzY2VuZGFudDwvaT4gaW5zdGVhZCBvZiBhIGNoaWxkLgorICoKKyAqIDxwPlRoZSA8Y29kZT4vL25vZGUxLy9ub2RlMjwvY29kZT4gcGF0dGVybiB3aWxsIGZvciBpbnN0YW5jZSBtYXRjaCBhbGwgbm9kZXMgbmFtZWQKKyAqIDxjb2RlPm5vZGUyPC9jb2RlPiB3aGljaCBhcmUgZGVzY2VuZGFudCBvZiBhIG5vZGUgbmFtZWQgPGNvZGU+bm9kZTE8L2NvZGU+IGxvY2F0ZWQgYW55d2hlcmUgaW4KKyAqIHRoZSBkb2N1bWVudCBoaWVyYXJjaHkuPC9wPgorICoKKyAqIE5vZGUgbmFtZXMgY2FuIGNvbnRhaW4gbmFtZXNwYWNlcyBpbiB0aGUgZm9ybSA8Y29kZT5uYW1lc3BhY2U6bm9kZTwvY29kZT4uCisgKgorICogPGgyPlByb2plY3Rpb24gc3ludGF4PC9oMj4KKyAqIEZvciBldmVyeSBzZWxlY3RlZCBub2RlLCB0aGUgcHJvamVjdGlvbiB3aWxsIHRoZW4gZXh0cmFjdCBhY3R1YWwgZGF0YSBmcm9tIHRoaXMgbm9kZSBhbmQgaXRzCisgKiBkZXNjZW5kYW50LgorICoKKyAqIDxwPlVzZSBhIHN5bnRheCBzaW1pbGFyIHRvIHRoZSBzZWxlY3Rpb24gc3ludGF4IGRlc2NyaWJlZCBhYm92ZSB0byBzZWxlY3QgdGhlIHRleHQgYXNzb2NpYXRlZAorICogd2l0aCBhIGNoaWxkIG9mIHRoZSBzZWxlY3RlZCBub2RlLiBUaGUgaW1wbGljaXQgcm9vdCBvZiB0aGlzIHByb2plY3Rpb24gcGF0dGVybiBpcyB0aGUgc2VsZWN0ZWQKKyAqIG5vZGUuIDxjb2RlPi88L2NvZGU+IHdpbGwgaGVuY2UgcmVmZXIgdG8gdGhlIHRleHQgb2YgdGhlIHNlbGVjdGVkIG5vZGUsIHdoaWxlCisgKiA8Y29kZT4vY2hpbGQxPC9jb2RlPiB3aWxsIGZldGNoIHRoZSB0ZXh0IG9mIGl0cyBjaGlsZCBuYW1lZCA8Y29kZT5jaGlsZDE8L2NvZGU+IGFuZAorICogPGNvZGU+Ly9jaGlsZDE8L2NvZGU+IHdpbGwgbWF0Y2ggYW55IDxpPmRlc2NlbmRhbnQ8L2k+IG5hbWVkIDxjb2RlPmNoaWxkMTwvY29kZT4uIElmIHNldmVyYWwKKyAqIG5vZGVzIG1hdGNoIHRoZSBwcm9qZWN0aW9uIHBhdHRlcm4sIHRoZWlyIHRleHRzIGFyZSBhcHBlbmRlZCBhcyBhIHJlc3VsdC48L3A+CisgKgorICogQSBwcm9qZWN0aW9uIGNhbiBhbHNvIGZldGNoIGFueSBub2RlIGF0dHJpYnV0ZSBieSBhcHBlbmRpbmcgYSA8Y29kZT5AYXR0cmlidXRlX25hbWU8L2NvZGU+CisgKiBwYXR0ZXJuIHRvIHRoZSBwcmV2aW91c2x5IGRlc2NyaWJlZCBzeW50YXguIDxjb2RlPi8vY2hpbGQxQHByaWNlPC9jb2RlPiB3aWxsIGZvciBpbnN0YW5jZSBtYXRjaAorICogdGhlIGF0dHJpYnV0ZSA8Y29kZT5wcmljZTwvY29kZT4gb2YgYW55IDxjb2RlPmNoaWxkMTwvY29kZT4gZGVzY2VuZGFudC4KKyAqCisgKiA8cD5JZiBhIHByb2plY3Rpb24gZG9lcyBub3QgbWF0Y2ggYW55IG5vZGUvYXR0cmlidXRlLCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSB3aWxsIGJlIGFuIGVtcHR5CisgKiBzdHJpbmcuPC9wPgorICoKKyAqIDxoMj5FeGFtcGxlPC9oMj4KKyAqIFVzaW5nIHRoZSBmb2xsb3dpbmcgWE1MIGRvY3VtZW50OgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O2xpYnJhcnkmZ3Q7CisgKiAgICZsdDtib29rIGlkPSJFSDk0IiZndDsKKyAqICAgICAmbHQ7dGl0bGUmZ3Q7VGhlIE9sZCBNYW4gYW5kIHRoZSBTZWEmbHQ7L3RpdGxlJmd0OworICogICAgICZsdDthdXRob3ImZ3Q7RXJuZXN0IEhlbWluZ3dheSZsdDsvYXV0aG9yJmd0OworICogICAmbHQ7L2Jvb2smZ3Q7CisgKiAgICZsdDtib29rIGlkPSJYWDEwIiZndDsKKyAqICAgICAmbHQ7dGl0bGUmZ3Q7VGhlIEFyYWJpYW4gTmlnaHRzOiBUYWxlcyBvZiAxLDAwMSBOaWdodHMmbHQ7L3RpdGxlJmd0OworICogICAmbHQ7L2Jvb2smZ3Q7CisgKiAgICZsdDtuby1pZCZndDsKKyAqICAgICAmbHQ7Ym9vayZndDsKKyAqICAgICAgICZsdDt0aXRsZSZndDtBbmltYWwgRmFybSZsdDsvdGl0bGUmZ3Q7CisgKiAgICAgICAmbHQ7YXV0aG9yJmd0O0dlb3JnZSBPcndlbGwmbHQ7L2F1dGhvciZndDsKKyAqICAgICAmbHQ7L2Jvb2smZ3Q7CisgKiAgICZsdDsvbm8taWQmZ3Q7CisgKiAmbHQ7L2xpYnJhcnkmZ3Q7CisgKiA8L3ByZT4KKyAqIEEgc2VsZWN0aW9uIHBhdHRlcm4gb2YgPGNvZGU+L2xpYnJhcnkvL2Jvb2s8L2NvZGU+IHdpbGwgbWF0Y2ggdGhlIHRocmVlIGJvb2sgZW50cmllcyAod2hpbGUKKyAqIDxjb2RlPi9saWJyYXJ5L2Jvb2s8L2NvZGU+IHdpbGwgb25seSBtYXRjaCB0aGUgZmlyc3QgdHdvIG9uZXMpLgorICoKKyAqIDxwPkRlZmluaW5nIHRoZSBwcm9qZWN0aW9ucyBhcyA8Y29kZT4vdGl0bGU8L2NvZGU+LCA8Y29kZT4vYXV0aG9yPC9jb2RlPiBhbmQgPGNvZGU+QGlkPC9jb2RlPgorICogd2lsbCByZXRyaWV2ZSB0aGUgYXNzb2NpYXRlZCBkYXRhLiBOb3RlIHRoYXQgdGhlIGF1dGhvciBvZiB0aGUgc2Vjb25kIGJvb2sgYXMgd2VsbCBhcyB0aGUgaWQgb2YKKyAqIHRoZSB0aGlyZCBhcmUgZW1wdHkgc3RyaW5ncy4KKyAqLworcHVibGljIGNsYXNzIFhtbERvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgIC8qCisgICAgICogSWRlYXMgZm9yIGltcHJvdmVtZW50OgorICAgICAqIC0gRXhwYW5kIFhQYXRoLWxpa2Ugc3ludGF4IHRvIGFsbG93IGZvciBbbmJdIGNoaWxkIG51bWJlciBzZWxlY3RvcgorICAgICAqIC0gQWRkcmVzcyB0aGUgc3RhcnRpbmcgLiBidWcgaW4gQWJzdHJhY3RDdXJzb3Igd2hpY2ggcHJldmVudHMgYSB0cnVlIFhQYXRoIHN5bnRheC4KKyAgICAgKiAtIFByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUgdG8gY29uY2F0ZW5hdGlvbiB3aGVuIHNldmVyYWwgbm9kZSBtYXRjaCAobGlzdC1saWtlKS4KKyAgICAgKiAtIFN1cHBvcnQgbmFtZXNwYWNlcyBpbiBhdHRyaWJ1dGUgbmFtZXMuCisgICAgICogLSBJbmNyZW1lbnRhbCBDdXJzb3IgY3JlYXRpb24sIHBhZ2luYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJYbWxEb2N1bWVudFByb3ZpZGVyIjsKKyAgICBwcml2YXRlIEFuZHJvaWRIdHRwQ2xpZW50IG1IdHRwQ2xpZW50OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJ5IGRhdGEgZnJvbSB0aGUgWE1MIGRvY3VtZW50IHJlZmVyZW5jZWQgaW4gdGhlIFVSSS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBYTUwgZG9jdW1lbnQgY2FuIGJlIGEgbG9jYWwgcmVzb3VyY2Ugb3IgYSBmaWxlIHRoYXQgd2lsbCBiZSBkb3dubG9hZGVkIGZyb20gdGhlCisgICAgICogSW50ZXJuZXQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91ciBhcHBsaWNhdGlvbiBuZWVkcyB0byByZXF1ZXN0IHRoZSBJTlRFUk5FVCBwZXJtaXNzaW9uIGluCisgICAgICogaXRzIG1hbmlmZXN0LjwvcD4KKyAgICAgKgorICAgICAqIFRoZSBVUkkgd2lsbCBiZSBvZiB0aGUgZm9ybSA8Y29kZT5jb250ZW50Oi8veG1sZG9jdW1lbnQvP3Jlc291cmNlPVIueG1sLm15RmlsZTwvY29kZT4gZm9yIGEKKyAgICAgKiBsb2NhbCByZXNvdXJjZS4gPGNvZGU+eG1sZG9jdW1lbnQ8L2NvZGU+IHNob3VsZCBtYXRjaCB0aGUgYXV0aG9yaXR5IGRlY2xhcmVkIGZvciB0aGlzCisgICAgICogcHJvdmlkZXIgaW4geW91ciBtYW5pZmVzdC4gSW50ZXJuZXQgZG9jdW1lbnRzIGFyZSByZWZlcmVuY2VkIHVzaW5nCisgICAgICogPGNvZGU+Y29udGVudDovL3htbGRvY3VtZW50Lz91cmw9PC9jb2RlPiBmb2xsb3dlZCBieSBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIFVSTCBvZiB5b3VyCisgICAgICogZG9jdW1lbnQgKHNlZSB7QGxpbmsgVXJpI2VuY29kZShTdHJpbmcpfSkuCisgICAgICoKKyAgICAgKiA8cD5UaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIHJlc3VsdGluZyBDdXJzb3IgaXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHByb2plY3Rpb24KKyAgICAgKiBhcnJheSBwbHVzIG9uZSwgbmFtZWQgPGNvZGU+X2lkPC9jb2RlPiB3aGljaCB3aWxsIGNvbnRhaW4gYSB1bmlxdWUgcm93IGlkIChhbGxvd2luZyB0aGUKKyAgICAgKiBDdXJzb3IgdG8gYmUgdXNlZCB3aXRoIGEge0BsaW5rIEN1cnNvckFkYXB0ZXJ9KS4gVGhlIG90aGVyIGNvbHVtbnMnIG5hbWVzIGFyZSB0aGUgcHJvamVjdGlvbgorICAgICAqIHBhdHRlcm5zLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB5b3VyIGxvY2FsIHJlc291cmNlIG9yIEludGVybmV0IGRvY3VtZW50LgorICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIEEgc2V0IG9mIHBhdHRlcm5zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGV4dHJhY3QgZGF0YSBmcm9tIGVhY2ggc2VsZWN0ZWQKKyAgICAgKiBub2RlLiBTZWUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgcGF0dGVybiBzeW50YXguCisgICAgICogQHBhcmFtIHNlbGVjdGlvbiBBIHNlbGVjdGlvbiBwYXR0ZXJuIHdoaWNoIHdpbGwgc2VsZWN0IHRoZSBub2RlcyB0aGF0IHdpbGwgY3JlYXRlIHRoZQorICAgICAqIEN1cnNvcidzIHJvd3MuIFNlZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBwYXR0ZXJuIHN5bnRheC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBzb3J0T3JkZXIgVGhlIHJvdyBvcmRlciBpbiB0aGUgcmVzdWx0aW5nIGN1cnNvciBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIG5vZGUgb3JkZXIgaW4KKyAgICAgKiB0aGUgWE1MIGRvY3VtZW50LiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gQSBDdXJzb3Igb3IgbnVsbCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKKyAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpIHsKKworICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIG1IdHRwQ2xpZW50ID0gbnVsbDsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdXJsID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJ1cmwiKTsKKyAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJzZXIgPSBnZXRVcmlYbWxQdWxsUGFyc2VyKHVybCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2UgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoInJlc291cmNlIik7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFVyaSByZXNvdXJjZVVyaSA9IFVyaS5wYXJzZShDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UgKyAiOi8vIiArCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSArICIvIiArIHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBnZXRSZXNvdXJjZVhtbFB1bGxQYXJzZXIocmVzb3VyY2VVcmkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSB7CisgICAgICAgICAgICBYTUxDdXJzb3IgeG1sQ3Vyc29yID0gbmV3IFhNTEN1cnNvcihzZWxlY3Rpb24sIHByb2plY3Rpb24pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB4bWxDdXJzb3IucGFyc2VXaXRoKHBhcnNlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHhtbEN1cnNvcjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSS9PIGVycm9yIHdoaWxlIHBhcnNpbmcgWE1MICIgKyB1cmksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHBhcnNpbmcgWE1MICIgKyB1cmksIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAobUh0dHBDbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSHR0cENsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sUHVsbFBhcnNlciBmb3IgdGhlIHByb3ZpZGVkIFVSTC4gQ2FuIGJlIG92ZXJsb2FkZWQgdG8gcHJvdmlkZSB5b3VyIG93biBwYXJzZXIuCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBYTUwgZG9jdW1lbnQgdGhhdCBpcyB0byBiZSBwYXJzZWQuCisgICAgICogQHJldHVybiBBbiBYbWxQdWxsUGFyc2VyIG9uIHRoaXMgZG9jdW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFhtbFB1bGxQYXJzZXIgZ2V0VXJpWG1sUHVsbFBhcnNlcihTdHJpbmcgdXJsKSB7CisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIHBhcnNlciA9IGZhY3RvcnkubmV3UHVsbFBhcnNlcigpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmFibGUgdG8gY3JlYXRlIFhtbFB1bGxQYXJzZXIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgSHR0cEdldCBnZXQgPSBuZXcgSHR0cEdldCh1cmwpOworICAgICAgICAgICAgbUh0dHBDbGllbnQgPSBBbmRyb2lkSHR0cENsaWVudC5uZXdJbnN0YW5jZSgiQW5kcm9pZCIpOworICAgICAgICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gbUh0dHBDbGllbnQuZXhlY3V0ZShnZXQpOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgeworICAgICAgICAgICAgICAgIGZpbmFsIEh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gZW50aXR5LmdldENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFcnJvciB3aGlsZSByZXRyaWV2aW5nIFhNTCBmaWxlICIgKyB1cmwsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KGlucHV0U3RyZWFtLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBYTUwgZmlsZSBmcm9tICIgKyB1cmwsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFyc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sUHVsbFBhcnNlciBmb3IgdGhlIHByb3ZpZGVkIGxvY2FsIHJlc291cmNlLiBDYW4gYmUgb3ZlcmxvYWRlZCB0byBwcm92aWRlIHlvdXIKKyAgICAgKiBvd24gcGFyc2VyLgorICAgICAqIEBwYXJhbSByZXNvdXJjZVVyaSBBIGZ1bGx5IHF1YWxpZmllZCByZXNvdXJjZSBuYW1lIHJlZmVyZW5jaW5nIGEgbG9jYWwgWE1MIHJlc291cmNlLgorICAgICAqIEByZXR1cm4gQW4gWG1sUHVsbFBhcnNlciBvbiB0aGlzIHJlc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBYbWxQdWxsUGFyc2VyIGdldFJlc291cmNlWG1sUHVsbFBhcnNlcihVcmkgcmVzb3VyY2VVcmkpIHsKKyAgICAgICAgT3BlblJlc291cmNlSWRSZXN1bHQgcmVzb3VyY2VJZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlSWQgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkuZ2V0UmVzb3VyY2VJZChyZXNvdXJjZVVyaSk7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VJZC5yLmdldFhtbChyZXNvdXJjZUlkLmlkKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJYTUwgcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzb3VyY2VVcmkudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgInZuZC5hbmRyb2lkLmN1cnNvci5kaXIveG1sZG9jIi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworICAgICAgICByZXR1cm4gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIveG1sZG9jIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIENvbnRlbnRQcm92aWRlciBpcyByZWFkLW9ubHkuIFRoaXMgbWV0aG9kIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBDb250ZW50UHJvdmlkZXIgaXMgcmVhZC1vbmx5LiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBDb250ZW50UHJvdmlkZXIgaXMgcmVhZC1vbmx5LiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlKFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhNTEN1cnNvciBleHRlbmRzIE1hdHJpeEN1cnNvciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0dGVybiBtU2VsZWN0aW9uUGF0dGVybjsKKyAgICAgICAgcHJpdmF0ZSBQYXR0ZXJuW10gbVByb2plY3Rpb25QYXR0ZXJuczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQXR0cmlidXRlTmFtZXM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gbUN1cnJlbnRWYWx1ZXM7CisgICAgICAgIHByaXZhdGUgQml0U2V0W10gbUFjdGl2ZVRleHREZXB0aE1hc2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1OdW1iZXJPZlByb2plY3Rpb25zOworCisgICAgICAgIHB1YmxpYyBYTUxDdXJzb3IoU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gcHJvamVjdGlvbnMpIHsKKyAgICAgICAgICAgIHN1cGVyKHByb2plY3Rpb25zKTsKKyAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBjb2x1bW4gaW4gcHJvamVjdGlvbnMgaXMgdXNlZCBmb3IgdGhlIF9JRAorICAgICAgICAgICAgbU51bWJlck9mUHJvamVjdGlvbnMgPSBwcm9qZWN0aW9ucy5sZW5ndGggLSAxOworICAgICAgICAgICAgbVNlbGVjdGlvblBhdHRlcm4gPSBjcmVhdGVQYXR0ZXJuKHNlbGVjdGlvbik7CisgICAgICAgICAgICBjcmVhdGVQcm9qZWN0aW9uUGF0dGVybihwcm9qZWN0aW9ucyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gaW5wdXQucmVwbGFjZUFsbCgiLy8iLCAiLyguKi98KSIpLnJlcGxhY2VBbGwoIl4vIiwgIl4vIikgKyAiJCI7CisgICAgICAgICAgICByZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3Rpb25QYXR0ZXJuKFN0cmluZ1tdIHByb2plY3Rpb25zKSB7CisgICAgICAgICAgICBtUHJvamVjdGlvblBhdHRlcm5zID0gbmV3IFBhdHRlcm5bbU51bWJlck9mUHJvamVjdGlvbnNdOworICAgICAgICAgICAgbUF0dHJpYnV0ZU5hbWVzID0gbmV3IFN0cmluZ1ttTnVtYmVyT2ZQcm9qZWN0aW9uc107CisgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFzayA9IG5ldyBCaXRTZXRbbU51bWJlck9mUHJvamVjdGlvbnNdOworICAgICAgICAgICAgLy8gQWRkIGEgY29sdW1uIHRvIHN0b3JlIF9JRAorICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXMgPSBuZXcgU3RyaW5nW21OdW1iZXJPZlByb2plY3Rpb25zICsgMV07CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0gPSBuZXcgQml0U2V0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb2plY3Rpb24gPSBwcm9qZWN0aW9uc1tpICsgMV07IC8vICsxIHRvIHNraXAgdGhlIF9JRCBjb2x1bW4KKyAgICAgICAgICAgICAgICBpbnQgYXRJbmRleCA9IHByb2plY3Rpb24ubGFzdEluZGV4T2YoJ0AnLCBwcm9qZWN0aW9uLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXRJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVOYW1lc1tpXSA9IHByb2plY3Rpb24uc3Vic3RyaW5nKGF0SW5kZXgrMSk7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb24gPSBwcm9qZWN0aW9uLnN1YnN0cmluZygwLCBhdEluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlTmFtZXNbaV0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENvbmZvcm1zIHRvIFhQYXRoIHN0YW5kYXJkOiByZWZlcmVuY2UgdG8gbG9jYWwgY29udGV4dCBzdGFydHMgd2l0aCBhIC4KKyAgICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbi5jaGFyQXQoMCkgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb24gPSBwcm9qZWN0aW9uLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVByb2plY3Rpb25QYXR0ZXJuc1tpXSA9IGNyZWF0ZVBhdHRlcm4ocHJvamVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZVdpdGgoWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHBhdGggPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgU3RhY2s8SW50ZWdlcj4gcGF0aExlbmd0aFN0YWNrID0gbmV3IFN0YWNrPEludGVnZXI+KCk7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSB0d28gcGFyc2luZyBtb2RlOiBpbiByb290IG1vZGUsIHJvb3RQYXRoIGlzIHVwZGF0ZWQgYW5kIG5vZGVzIG1hdGNoaW5nCisgICAgICAgICAgICAvLyBzZWxlY3Rpb25QYXR0ZXJuIGFyZSBzZWFyY2hlZCBmb3IgYW5kIGN1cnJlbnROb2RlRGVwdGggaXMgbmVnYXRpdmUuCisgICAgICAgICAgICAvLyBXaGVuIGEgbm9kZSBtYXRjaGluZyBzZWxlY3Rpb25QYXR0ZXJuIGlzIGZvdW5kLCBjdXJyZW50Tm9kZURlcHRoIGlzIHNldCB0byAwIGFuZAorICAgICAgICAgICAgLy8gdXBkYXRlZCBhcyBjaGlsZHJlbiBhcmUgcGFyc2VkIGFuZCBwcm9qZWN0aW9uUGF0dGVybnMgYXJlIHNlYXJjaGVkIGluIG5vZGVQYXRoLgorICAgICAgICAgICAgaW50IGN1cnJlbnROb2RlRGVwdGggPSAtMTsKKworICAgICAgICAgICAgLy8gSW5kZXggd2hlcmUgbG9jYWwgc2VsZWN0ZWQgbm9kZSBwYXRoIHN0YXJ0cyBmcm9tIGluIHBhdGgKKyAgICAgICAgICAgIGludCBjdXJyZW50Tm9kZVBhdGhTdGFydEluZGV4ID0gMDsKKworICAgICAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgICAgIHdoaWxlIChldmVudFR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgcGF0aExlbmd0aFN0YWNrLnB1c2gocGF0aC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCcvJyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0UHJlZml4IGlzIG5vdCBzdXBwb3J0ZWQgYnkgbG9jYWwgWG1sIHJlc291cmNlIHBhcnNlcgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyc2VyLmdldFByZWZpeCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChwYXJzZXIuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVEZXB0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZURlcHRoKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG5vZGUgbWF0Y2hpbmcgc2VsZWN0aW9uIGlzIGZvdW5kOiBpbml0aWFsaXplIGNoaWxkIHBhcnNpbmcgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25QYXR0ZXJuLm1hdGNoZXIocGF0aC50b1N0cmluZygpKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZURlcHRoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZVBhdGhTdGFydEluZGV4ID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1swXSA9IEludGVnZXIudG9TdHJpbmcoZ2V0Q291bnQoKSk7IC8vIF9JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB2YWx1ZXMgdG8gZGVmYXVsdCAoZW1wdHkgc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1tpICsgMV0gPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaGFzIHRvIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBvbmUgYXMgY3VycmVudE5vZGVEZXB0aCBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gYmUgbW9kaWZpZWQgYWJvdmUgKHdoZW4gYSBub2RlIG1hdGNoaW5nIHNlbGVjdGlvbiBpcyBmb3VuZCkuCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5vZGVQYXRoID0gcGF0aC5zdWJzdHJpbmcoY3VycmVudE5vZGVQYXRoU3RhcnRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByb2plY3Rpb25QYXR0ZXJuc1tpXS5tYXRjaGVyKGxvY2FsTm9kZVBhdGgpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbUF0dHJpYnV0ZU5hbWVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzW2kgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5zZXQoY3VycmVudE5vZGVEZXB0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRykgeworICAgICAgICAgICAgICAgICAgICAvLyBQb3AgbGFzdCBub2RlIGZyb20gcGF0aAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcGF0aExlbmd0aFN0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgICAgICBwYXRoLnNldExlbmd0aChsZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWF2aW5nIGEgc2VsZWN0aW9uIG1hdGNoaW5nIG5vZGU6IGFkZCBhIG5ldyByb3cgd2l0aCByZXN1bHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUm93KG1DdXJyZW50VmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLnNldChjdXJyZW50Tm9kZURlcHRoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVEZXB0aC0tOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5URVhUKSAmJiAoIXBhcnNlci5pc1doaXRlc3BhY2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uZ2V0KGN1cnJlbnROb2RlRGVwdGgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzW2kgKyAxXSArPSBwYXJzZXIuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhCmluZGV4IGUyNmYxNjAuLmU2ODhjODYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YQpAQCAtMTQ5LDYgKzE0OSwyNyBAQAogICAgICAqIHtAbGluayBhbmRyb2lkLlIuYXR0ciNmaW5pc2hPbkNsb3NlU3lzdGVtRGlhbG9nc30gYXR0cmlidXRlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOSVNIX09OX0NMT1NFX1NZU1RFTV9ESUFMT0dTID0gMHgwMTAwOworICAgIC8qKiAKKyAgICAgKiBCaXQgaW4ge0BsaW5rICNmbGFnc30gY29ycmVzcG9uZGluZyB0byBhbiBpbW1lcnNpdmUgYWN0aXZpdHkKKyAgICAgKiB0aGF0IHdpc2hlcyBub3QgdG8gYmUgaW50ZXJydXB0ZWQgYnkgbm90aWZpY2F0aW9ucy4KKyAgICAgKiBBcHBsaWNhdGlvbnMgdGhhdCBoaWRlIHRoZSBzeXN0ZW0gbm90aWZpY2F0aW9uIGJhciB3aXRoCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNGTEFHX0ZVTExTQ1JFRU59CisgICAgICogbWF5IHN0aWxsIGJlIGludGVycnVwdGVkIGJ5IGhpZ2gtcHJpb3JpdHkgbm90aWZpY2F0aW9uczsgZm9yIGV4YW1wbGUsIGFuCisgICAgICogaW5jb21pbmcgcGhvbmUgY2FsbCBtYXkgdXNlCisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbiNmdWxsU2NyZWVuSW50ZW50IGZ1bGxTY3JlZW5JbnRlbnR9CisgICAgICogdG8gcHJlc2VudCBhIGZ1bGwtc2NyZWVuIGluLWNhbGwgYWN0aXZpdHkgdG8gdGhlIHVzZXIsIHBhdXNpbmcgdGhlCisgICAgICogY3VycmVudCBhY3Rpdml0eSBhcyBhIHNpZGUtZWZmZWN0LiBBbiBhY3Rpdml0eSB3aXRoCisgICAgICoge0BsaW5rICNGTEFHX0lNTUVSU0lWRX0gc2V0LCBob3dldmVyLCB3aWxsIG5vdCBiZSBpbnRlcnJ1cHRlZDsgdGhlCisgICAgICogbm90aWZpY2F0aW9uIG1heSBiZSBzaG93biBpbiBzb21lIG90aGVyIHdheSAoc3VjaCBhcyBhIHNtYWxsIGZsb2F0aW5nCisgICAgICogInRvYXN0IiB3aW5kb3cpLgorICAgICAqIHtAc2VlIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbiNGTEFHX0hJR0hfUFJJT1JJVFl9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19JTU1FUlNJVkUgPSAweDAyMDA7CisgICAgLyoqCisgICAgICogVmFsdWUgZm9yIHtAbGluayAjZmxhZ3N9OiB0cnVlIHdoZW4gdGhlIGFwcGxpY2F0aW9uJ3MgcmVuZGVyaW5nIHNob3VsZAorICAgICAqIGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAweDA0MDA7CiAgICAgLyoqCiAgICAgICogT3B0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZXQgaW4gdGhlIGFjdGl2aXR5IGRlY2xhcmF0aW9uIGluIHRoZQogICAgICAqIG1hbmlmZXN0LgpAQCAtMTU5LDYgKzE4MCw3IEBACiAgICAgICoge0BsaW5rICNGTEFHX1NUQVRFX05PVF9ORUVERUR9LCB7QGxpbmsgI0ZMQUdfRVhDTFVERV9GUk9NX1JFQ0VOVFN9LAogICAgICAqIHtAbGluayAjRkxBR19BTExPV19UQVNLX1JFUEFSRU5USU5HfSwge0BsaW5rICNGTEFHX05PX0hJU1RPUll9LAogICAgICAqIHtAbGluayAjRkxBR19GSU5JU0hfT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1N9LAorICAgICAqIHtAbGluayAjRkxBR19JTU1FUlNJVkV9LCB7QGxpbmsgI0ZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUR9CiAgICAgICovCiAgICAgcHVibGljIGludCBmbGFnczsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEKaW5kZXggMTc1ZDZkYjUuLjY0M2U3NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YQpAQCAtMjY5LDcgKzI2OSw2IEBACiAgICAgICogaW5jcmVhc2VkIGluIHNpemUgZm9yIGV4dHJhIGxhcmdlIHNjcmVlbnMuICBDb3JyZXNwb25kcyB0bwogICAgICAqIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0FuZHJvaWRNYW5pZmVzdFN1cHBvcnRzU2NyZWVuc194bGFyZ2VTY3JlZW5zCiAgICAgICogYW5kcm9pZDp4bGFyZ2VTY3JlZW5zfS4KLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1VQUE9SVFNfWExBUkdFX1NDUkVFTlMgPSAxPDwxOTsKICAgICAKQEAgLTMxMiw3ICszMTEsNyBAQAogICAgICAqIHtAbGluayAjRkxBR19BTExPV19DTEVBUl9VU0VSX0RBVEF9LCB7QGxpbmsgI0ZMQUdfVVBEQVRFRF9TWVNURU1fQVBQfSwKICAgICAgKiB7QGxpbmsgI0ZMQUdfVEVTVF9PTkxZfSwge0BsaW5rICNGTEFHX1NVUFBPUlRTX1NNQUxMX1NDUkVFTlN9LAogICAgICAqIHtAbGluayAjRkxBR19TVVBQT1JUU19OT1JNQUxfU0NSRUVOU30sCi0gICAgICoge0BsaW5rICNGTEFHX1NVUFBPUlRTX0xBUkdFX1NDUkVFTlN9LAorICAgICAqIHtAbGluayAjRkxBR19TVVBQT1JUU19MQVJHRV9TQ1JFRU5TfSwge0BsaW5rICNGTEFHX1NVUFBPUlRTX1hMQVJHRV9TQ1JFRU5TfSwKICAgICAgKiB7QGxpbmsgI0ZMQUdfUkVTSVpFQUJMRV9GT1JfU0NSRUVOU30sCiAgICAgICoge0BsaW5rICNGTEFHX1NVUFBPUlRTX1NDUkVFTl9ERU5TSVRJRVN9LCB7QGxpbmsgI0ZMQUdfVk1fU0FGRV9NT0RFfQogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQppbmRleCA4OTgzOWNlLi42Y2JjOWI1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQpAQCAtMTYsOSArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbTsKIAotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKQEAgLTMwLDE0ICsyNywxNCBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTQ5LDcgKzQ2LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CiAKQEAgLTEyNTQsNyArMTI1MCw4IEBACiAgICAgICAgICAgICAgICAgIjxwZXJtaXNzaW9uLWdyb3VwPiIsIHNhLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25Hcm91cF9uYW1lLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25Hcm91cF9sYWJlbCwKLSAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uR3JvdXBfaWNvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uR3JvdXBfaWNvbiwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uR3JvdXBfbG9nbykpIHsKICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1QYXJzZUVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9QQVJTRV9GQUlMRURfTUFOSUZFU1RfTUFMRk9STUVEOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMjg5LDcgKzEyODYsOCBAQAogICAgICAgICAgICAgICAgICI8cGVybWlzc2lvbj4iLCBzYSwKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX25hbWUsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbl9sYWJlbCwKLSAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX2ljb24sIDApKSB7CisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbl9pY29uLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25fbG9nbykpIHsKICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1QYXJzZUVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9QQVJTRV9GQUlMRURfTUFOSUZFU1RfTUFMRk9STUVEOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMzQyLDcgKzEzNDAsOCBAQAogICAgICAgICAgICAgICAgICI8cGVybWlzc2lvbi10cmVlPiIsIHNhLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25UcmVlX25hbWUsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvblRyZWVfbGFiZWwsCi0gICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvblRyZWVfaWNvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uVHJlZV9pY29uLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25UcmVlX2xvZ28pKSB7CiAgICAgICAgICAgICBzYS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICBtUGFyc2VFcnJvciA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfUEFSU0VfRkFJTEVEX01BTklGRVNUX01BTEZPUk1FRDsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTM4Niw3ICsxMzg1LDggQEAKICAgICAgICAgICAgIG1QYXJzZUluc3RydW1lbnRhdGlvbkFyZ3MgPSBuZXcgUGFyc2VQYWNrYWdlSXRlbUFyZ3Mob3duZXIsIG91dEVycm9yLAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25fbmFtZSwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0SW5zdHJ1bWVudGF0aW9uX2xhYmVsLAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25faWNvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEluc3RydW1lbnRhdGlvbl9pY29uLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25fbG9nbyk7CiAgICAgICAgICAgICBtUGFyc2VJbnN0cnVtZW50YXRpb25BcmdzLnRhZyA9ICI8aW5zdHJ1bWVudGF0aW9uPiI7CiAgICAgICAgIH0KICAgICAgICAgCkBAIC0xNDk2LDEwICsxNDk2LDE4IEBACiAgICAgICAgICAgICBhaS5ub25Mb2NhbGl6ZWRMYWJlbCA9IHYuY29lcmNlVG9TdHJpbmcoKTsKICAgICAgICAgfQogCisgICAgICAgIGludCBkZWZhdWx0VGhlbWUgPSAwOworICAgICAgICBpZiAob3duZXIuYXBwbGljYXRpb25JbmZvLnRhcmdldFNka1ZlcnNpb24gPj0gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkhPTkVZQ09NQikgeworICAgICAgICAgICAgLy8gQXMgb2YgaG9uZXljb21iLCB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0aGVtZSBpcyBob2xvZ3JhcGhpYy4KKyAgICAgICAgICAgIGRlZmF1bHRUaGVtZSA9IGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9Ib2xvOworICAgICAgICB9CisKICAgICAgICAgYWkuaWNvbiA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faWNvbiwgMCk7CisgICAgICAgIGFpLmxvZ28gPSBzYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2xvZ28sIDApOwogICAgICAgICBhaS50aGVtZSA9IHNhLmdldFJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fdGhlbWUsIDApOworICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX3RoZW1lLCBkZWZhdWx0VGhlbWUpOwogICAgICAgICBhaS5kZXNjcmlwdGlvblJlcyA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fZGVzY3JpcHRpb24sIDApOwogCkBAIC0xNTMxLDYgKzE1MzksMTAgQEAKICAgICAgICAgICAgIGFpLmZsYWdzIHw9IEFwcGxpY2F0aW9uSW5mby5GTEFHX1ZNX1NBRkVfTU9ERTsKICAgICAgICAgfQogCisgICAgICAgIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCA9IHNhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faGFyZHdhcmVBY2NlbGVyYXRlZCwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisKICAgICAgICAgaWYgKHNhLmdldEJvb2xlYW4oCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faGFzQ29kZSwKICAgICAgICAgICAgICAgICB0cnVlKSkgewpAQCAtMTYzMCw3ICsxNjQyLDggQEAKIAogICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwogICAgICAgICAgICAgaWYgKHRhZ05hbWUuZXF1YWxzKCJhY3Rpdml0eSIpKSB7Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlQWNjZWxlcmF0ZWQpOwogICAgICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVBhcnNlRXJyb3IgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1BBUlNFX0ZBSUxFRF9NQU5JRkVTVF9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE2MzksNyArMTY1Miw3IEBACiAgICAgICAgICAgICAgICAgb3duZXIuYWN0aXZpdGllcy5hZGQoYSk7CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZS5lcXVhbHMoInJlY2VpdmVyIikpIHsKLSAgICAgICAgICAgICAgICBBY3Rpdml0eSBhID0gcGFyc2VBY3Rpdml0eShvd25lciwgcmVzLCBwYXJzZXIsIGF0dHJzLCBmbGFncywgb3V0RXJyb3IsIHRydWUpOworICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVBhcnNlRXJyb3IgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1BBUlNFX0ZBSUxFRF9NQU5JRkVTVF9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE3NjIsNiArMTc3NSwxMSBAQAogICAgICAgICAgICAgb3V0SW5mby5ub25Mb2NhbGl6ZWRMYWJlbCA9IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgCisgICAgICAgIGludCBsb2dvVmFsID0gc2EuZ2V0UmVzb3VyY2VJZChsb2dvUmVzLCAwKTsKKyAgICAgICAgaWYgKGxvZ29WYWwgIT0gMCkgeworICAgICAgICAgICAgb3V0SW5mby5sb2dvID0gbG9nb1ZhbDsKKyAgICAgICAgfQorCiAgICAgICAgIFR5cGVkVmFsdWUgdiA9IHNhLnBlZWtWYWx1ZShsYWJlbFJlcyk7CiAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgKG91dEluZm8ubGFiZWxSZXM9di5yZXNvdXJjZUlkKSA9PSAwKSB7CiAgICAgICAgICAgICBvdXRJbmZvLm5vbkxvY2FsaXplZExhYmVsID0gdi5jb2VyY2VUb1N0cmluZygpOwpAQCAtMTc3NCw3ICsxNzkyLDggQEAKIAogICAgIHByaXZhdGUgQWN0aXZpdHkgcGFyc2VBY3Rpdml0eShQYWNrYWdlIG93bmVyLCBSZXNvdXJjZXMgcmVzLAogICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGZsYWdzLCBTdHJpbmdbXSBvdXRFcnJvciwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVjZWl2ZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBib29sZWFuIHJlY2VpdmVyLCBib29sZWFuIGhhcmR3YXJlQWNjZWxlcmF0ZWQpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBUeXBlZEFycmF5IHNhID0gcmVzLm9idGFpbkF0dHJpYnV0ZXMoYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHkpOwogCkBAIC0xNzgyLDcgKzE4MDEsOCBAQAogICAgICAgICAgICAgbVBhcnNlQWN0aXZpdHlBcmdzID0gbmV3IFBhcnNlQ29tcG9uZW50QXJncyhvd25lciwgb3V0RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X25hbWUsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2xhYmVsLAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9pY29uLCAwLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9pY29uLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9sb2dvLAogICAgICAgICAgICAgICAgICAgICBtU2VwYXJhdGVQcm9jZXNzZXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X3Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2Rlc2NyaXB0aW9uLApAQCAtMTg3OCw3ICsxODk4LDE5IEBACiAgICAgICAgICAgICBhLmluZm8uZmxhZ3MgfD0gQWN0aXZpdHlJbmZvLkZMQUdfRklOSVNIX09OX0NMT1NFX1NZU1RFTV9ESUFMT0dTOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHNhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfaW1tZXJzaXZlLAorICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgYS5pbmZvLmZsYWdzIHw9IEFjdGl2aXR5SW5mby5GTEFHX0lNTUVSU0lWRTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgaWYgKCFyZWNlaXZlcikgeworICAgICAgICAgICAgaWYgKHNhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2hhcmR3YXJlQWNjZWxlcmF0ZWQsCisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlQWNjZWxlcmF0ZWQpKSB7CisgICAgICAgICAgICAgICAgYS5pbmZvLmZsYWdzIHw9IEFjdGl2aXR5SW5mby5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBhLmluZm8ubGF1bmNoTW9kZSA9IHNhLmdldEludCgKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfbGF1bmNoTW9kZSwKICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLkxBVU5DSF9NVUxUSVBMRSk7CkBAIC0xOTkyLDcgKzIwMjQsOCBAQAogICAgICAgICAgICAgbVBhcnNlQWN0aXZpdHlBbGlhc0FyZ3MgPSBuZXcgUGFyc2VDb21wb25lbnRBcmdzKG93bmVyLCBvdXRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19uYW1lLAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eUFsaWFzX2xhYmVsLAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eUFsaWFzX2ljb24sIDAsCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5QWxpYXNfaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19sb2dvLAogICAgICAgICAgICAgICAgICAgICBtU2VwYXJhdGVQcm9jZXNzZXMsCiAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5QWxpYXNfZGVzY3JpcHRpb24sCkBAIC0yMTIwLDcgKzIxNTMsOCBAQAogICAgICAgICAgICAgbVBhcnNlUHJvdmlkZXJBcmdzID0gbmV3IFBhcnNlQ29tcG9uZW50QXJncyhvd25lciwgb3V0RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX25hbWUsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2xhYmVsLAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9pY29uLCAwLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9pY29uLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9sb2dvLAogICAgICAgICAgICAgICAgICAgICBtU2VwYXJhdGVQcm9jZXNzZXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX3Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2Rlc2NyaXB0aW9uLApAQCAtMjM5Miw3ICsyNDI2LDggQEAKICAgICAgICAgICAgIG1QYXJzZVNlcnZpY2VBcmdzID0gbmV3IFBhcnNlQ29tcG9uZW50QXJncyhvd25lciwgb3V0RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFNlcnZpY2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0U2VydmljZV9sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0U2VydmljZV9pY29uLCAwLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RTZXJ2aWNlX2ljb24sCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFNlcnZpY2VfbG9nbywKICAgICAgICAgICAgICAgICAgICAgbVNlcGFyYXRlUHJvY2Vzc2VzLAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RTZXJ2aWNlX3Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFNlcnZpY2VfZGVzY3JpcHRpb24sCkBAIC0yNjA2LDYgKzI2NDEsOSBAQAogICAgICAgICBvdXRJbmZvLmljb24gPSBzYS5nZXRSZXNvdXJjZUlkKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEludGVudEZpbHRlcl9pY29uLCAwKTsKICAgICAgICAgCisgICAgICAgIG91dEluZm8ubG9nbyA9IHNhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0SW50ZW50RmlsdGVyX2xvZ28sIDApOworCiAgICAgICAgIHNhLnJlY3ljbGUoKTsKIAogICAgICAgICBpbnQgb3V0ZXJEZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwpAQCAtMjg3Myw2ICsyOTExLDExIEBACiAgICAgICAgICAgICAgICAgb3V0SW5mby5ub25Mb2NhbGl6ZWRMYWJlbCA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBsb2dvVmFsID0gYXJncy5zYS5nZXRSZXNvdXJjZUlkKGFyZ3MubG9nb1JlcywgMCk7CisgICAgICAgICAgICBpZiAobG9nb1ZhbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgb3V0SW5mby5sb2dvID0gbG9nb1ZhbDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgVHlwZWRWYWx1ZSB2ID0gYXJncy5zYS5wZWVrVmFsdWUoYXJncy5sYWJlbFJlcyk7CiAgICAgICAgICAgICBpZiAodiAhPSBudWxsICYmIChvdXRJbmZvLmxhYmVsUmVzPXYucmVzb3VyY2VJZCkgPT0gMCkgewogICAgICAgICAgICAgICAgIG91dEluZm8ubm9uTG9jYWxpemVkTGFiZWwgPSB2LmNvZXJjZVRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEKaW5kZXggYTM3ZTRlOC4uMDFhZTFkYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQXNzZXRGaWxlRGVzY3JpcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YQpAQCAtMjUsOCArMjUsNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CiAKIC8qKgogICogRmlsZSBkZXNjcmlwdG9yIG9mIGFuIGVudHJ5IGluIHRoZSBBc3NldE1hbmFnZXIuICBUaGlzIHByb3ZpZGVzIHlvdXIgb3duCkBAIC01MSw3ICs0OSw3IEBACiAgICAgICogQHBhcmFtIHN0YXJ0T2Zmc2V0IFRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGZpbGUgdGhhdCB0aGUgYXNzZXQgc3RhcnRzLgogICAgICAqIFRoaXMgbXVzdCBiZSAwIGlmIGxlbmd0aCBpcyBVTktOT1dOX0xFTkdUSC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIGFzc2V0LCBvcgotICAgICAqIHtAbGluayAjVU5LTk9XTl9MRU5HVEggaWYgaXQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICAgICAqIHtAbGluayAjVU5LTk9XTl9MRU5HVEh9IGlmIGl0IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvcihQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCwgbG9uZyBzdGFydE9mZnNldCwKICAgICAgICAgICAgIGxvbmcgbGVuZ3RoKSB7CkBAIC0xMjUsMTMgKzEyMyw2IEBACiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtRmQuY2xvc2UoKTsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBmaWxlIGRlc2NyaXB0b3IgaXMgZm9yIGEgbWVtb3J5IGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWVtb3J5RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShtRmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgYXV0by1jbG9zZSBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgYXNzZXQuICBUaGlzCkBAIC0xNDIsMTIgKzEzMyw2IEBACiAgICAgICogc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG9uY2UgZm9yIGEgcGFydGljdWxhciBhc3NldC4KICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzTWVtb3J5RmlsZSgpKSB7Ci0gICAgICAgICAgICBpZiAobUxlbmd0aCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGaWxlIGxlbmd0aCB0b28gbGFyZ2UgZm9yIGEgbWVtb3J5IGZpbGU6ICIgKyBtTGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQXV0b0Nsb3NlTWVtb3J5RmlsZUlucHV0U3RyZWFtKG1GZCwgKGludCltTGVuZ3RoKTsKLSAgICAgICAgfQogICAgICAgICBpZiAobUxlbmd0aCA8IDApIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0obUZkKTsKICAgICAgICAgfQpAQCAtMjc2LDY2ICsyNjEsNiBAQAogICAgICAgICAgICAgc3VwZXIucmVzZXQoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBbiBpbnB1dCBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIGEgTWVtb3J5RmlsZSBhbmQgY2xvc2VzIGl0IHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0gICAgICogVGhpcyBleHRlbmRzIEZpbGVJbnB1dFN0cmVhbSBqdXN0IGJlY2F1c2Uge0BsaW5rICNjcmVhdGVJbnB1dFN0cmVhbX0gcmV0dXJucwotICAgICAqIGEgRmlsZUlucHV0U3RyZWFtLiBBbGwgdGhlIEZpbGVJbnB1dFN0cmVhbSBtZXRob2RzIGFyZQotICAgICAqIG92ZXJyaWRkZW4gdG8gdXNlIHRoZSBNZW1vcnlGaWxlIGluc3RlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXV0b0Nsb3NlTWVtb3J5RmlsZUlucHV0U3RyZWFtIGV4dGVuZHMgRmlsZUlucHV0U3RyZWFtIHsKLSAgICAgICAgcHJpdmF0ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBtUGFyY2VsRmQ7Ci0gICAgICAgIHByaXZhdGUgTWVtb3J5RmlsZSBtRmlsZTsKLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtU3RyZWFtOwotCi0gICAgICAgIHB1YmxpYyBBdXRvQ2xvc2VNZW1vcnlGaWxlSW5wdXRTdHJlYW0oUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQsIGludCBsZW5ndGgpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgbVBhcmNlbEZkID0gZmQ7Ci0gICAgICAgICAgICBtRmlsZSA9IG5ldyBNZW1vcnlGaWxlKGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGxlbmd0aCwgInIiKTsKLSAgICAgICAgICAgIG1TdHJlYW0gPSBtRmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLmF2YWlsYWJsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIG1QYXJjZWxGZC5jbG9zZSgpOyAgLy8gbXVzdCBjbG9zZSBQYXJjZWxGaWxlRGVzY3JpcHRvciwgbm90IGp1c3QgdGhlIGZpbGUgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgY291bGQgYmUgYSBzdWJjbGFzcyBvZiBQYXJjZWxGaWxlRGVzY3JpcHRvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRS5nLiBDb250ZW50UmVzb2x2ZXIuUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lci5jbG9zZSgpIHJlbGVhc2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgY29udGVudCBwcm92aWRlcgotICAgICAgICAgICAgbUZpbGUuY2xvc2UoKTsgICAgICAvLyB0byB1bm1hcCB0aGUgbWVtb3J5IGZpbGUgZnJvbSB0aGUgYWRkcmVzcyBzcGFjZS4KLSAgICAgICAgICAgIG1TdHJlYW0uY2xvc2UoKTsgICAgLy8gZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBGaWxlQ2hhbm5lbCBnZXRDaGFubmVsKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLnJlYWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0ucmVhZChidWZmZXIsIG9mZnNldCwgY291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0ucmVhZChidWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLnNraXAoY291bnQpOwotICAgICAgICB9Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogQW4gT3V0cHV0U3RyZWFtIHlvdSBjYW4gY3JlYXRlIG9uIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IsIHdoaWNoIHdpbGwKQEAgLTQyMiwxNSArMzQ3LDQgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEFzc2V0RmlsZURlc2NyaXB0b3IgZnJvbSBhIG1lbW9yeSBmaWxlLgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFzc2V0RmlsZURlc2NyaXB0b3IgZnJvbU1lbW9yeUZpbGUoTWVtb3J5RmlsZSBtZW1vcnlGaWxlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBtZW1vcnlGaWxlLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihmZCwgMCwgbWVtb3J5RmlsZS5sZW5ndGgoKSk7Ci0gICAgfQotCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db21wYXRpYmlsaXR5SW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29tcGF0aWJpbGl0eUluZm8uamF2YQppbmRleCBkMGJhNTkwLi40MDZiMDkxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db21wYXRpYmlsaXR5SW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbXBhdGliaWxpdHlJbmZvLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKQEAgLTM2Myw2ICszNjQsMTcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUcmFuc2xhdGUgYSBQb2ludCBpbiBzY3JlZW4gY29vcmRpbmF0ZXMgaW50byB0aGUgYXBwIHdpbmRvdydzIGNvb3JkaW5hdGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlUG9pbnRJblNjcmVlblRvQXBwV2luZG93KFBvaW50RiBwb2ludCkgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBhcHBsaWNhdGlvbkludmVydGVkU2NhbGU7CisgICAgICAgICAgICBpZiAoc2NhbGUgIT0gMS4wZikgeworICAgICAgICAgICAgICAgIHBvaW50LnggKj0gc2NhbGU7CisgICAgICAgICAgICAgICAgcG9pbnQueSAqPSBzY2FsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBUcmFuc2xhdGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdWIgd2luZG93LgogICAgICAgICAgKiBAcGFyYW0gcGFyYW1zCiAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDVhM2RkNDEuLjJmMTEwZjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEKQEAgLTYyLDcgKzYyLDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5MQVlPVVRfU0laRV9TTUFMTCA9IDB4MDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSRUVOTEFZT1VUX1NJWkVfTk9STUFMID0gMHgwMjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5MQVlPVVRfU0laRV9MQVJHRSA9IDB4MDM7Ci0gICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSRUVOTEFZT1VUX1NJWkVfWExBUkdFID0gMHgwNDsKICAgICAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5MQVlPVVRfTE9OR19NQVNLID0gMHgzMDsKQEAgLTg0LDcgKzgzLDcgQEAKICAgICAgKiA8cD5UaGUge0BsaW5rICNTQ1JFRU5MQVlPVVRfU0laRV9NQVNLfSBiaXRzIGRlZmluZSB0aGUgb3ZlcmFsbCBzaXplCiAgICAgICogb2YgdGhlIHNjcmVlbi4gIFRoZXkgbWF5IGJlIG9uZSBvZgogICAgICAqIHtAbGluayAjU0NSRUVOTEFZT1VUX1NJWkVfU01BTEx9LCB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX05PUk1BTH0sCi0gICAgICoge0BsaW5rICNTQ1JFRU5MQVlPVVRfU0laRV9MQVJHRX0uCisgICAgICoge0BsaW5rICNTQ1JFRU5MQVlPVVRfU0laRV9MQVJHRX0sIG9yIHtAbGluayAjU0NSRUVOTEFZT1VUX1NJWkVfWExBUkdFfS4KICAgICAgKiAKICAgICAgKiA8cD5UaGUge0BsaW5rICNTQ1JFRU5MQVlPVVRfTE9OR19NQVNLfSBkZWZpbmVzIHdoZXRoZXIgdGhlIHNjcmVlbgogICAgICAqIGlzIHdpZGVyL3RhbGxlciB0aGFuIG5vcm1hbC4gIFRoZXkgbWF5IGJlIG9uZSBvZgpAQCAtMjY3LDExICsyNjYsMTggQEAKICAgICAgICAgc2IuYXBwZW5kKCIvIik7CiAgICAgICAgIHNiLmFwcGVuZChuYXZpZ2F0aW9uSGlkZGVuKTsKICAgICAgICAgc2IuYXBwZW5kKCIgb3JpZW49Iik7Ci0gICAgICAgIHNiLmFwcGVuZChvcmllbnRhdGlvbik7Ci0gICAgICAgIHNiLmFwcGVuZCgiIGxheW91dD0iKTsKLSAgICAgICAgc2IuYXBwZW5kKHNjcmVlbkxheW91dCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIHVpTW9kZT0iKTsKLSAgICAgICAgc2IuYXBwZW5kKHVpTW9kZSk7CisgICAgICAgIHN3aXRjaChvcmllbnRhdGlvbikgeworICAgICAgICAgICAgY2FzZSBPUklFTlRBVElPTl9MQU5EU0NBUEU6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJMIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUklFTlRBVElPTl9QT1JUUkFJVDoKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlAiKTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChvcmllbnRhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCIgbGF5b3V0PTB4Iik7CisgICAgICAgIHNiLmFwcGVuZChqYXZhLmxhbmcuSW50ZWdlci50b0hleFN0cmluZyhzY3JlZW5MYXlvdXQpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgdWlNb2RlPTB4Iik7CisgICAgICAgIHNiLmFwcGVuZChqYXZhLmxhbmcuSW50ZWdlci50b0hleFN0cmluZyh1aU1vZGUpKTsKICAgICAgICAgaWYgKHNlcSAhPSAwKSB7CiAgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXE9Iik7CiAgICAgICAgICAgICBzYi5hcHBlbmQoc2VxKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1BsdXJhbFJ1bGVzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9QbHVyYWxSdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGNlM2MxLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1BsdXJhbFJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5jb250ZW50LnJlczsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLS8qCi0gKiBZdWNrLW8uICBUaGlzIGlzIG5vdCB0aGUgcmlnaHQgd2F5IHRvIGltcGxlbWVudCB0aGlzLiAgV2hlbiB0aGUgSUNVIFBsdXJhbFJ1bGVzCi0gKiBvYmplY3QgaGFzIGJlZW4gaW50ZWdyYXRlZCB0byBhbmRyb2lkLCB3ZSBzaG91bGQgc3dpdGNoIHRvIHRoYXQuICBGb3Igbm93LCB5dWNrLW8uCi0gKi8KLQotYWJzdHJhY3QgY2xhc3MgUGx1cmFsUnVsZXMgewotCi0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9PVEhFUiA9IDB4MDAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX1pFUk8gID0gMHgwMDAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfT05FICAgPSAweDAwMDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9UV08gICA9IDB4MDAwNDsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX0ZFVyAgID0gMHgwMDA4OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfTUFOWSAgPSAweDAwMTA7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IElEX09USEVSID0gMHgwMTAwMDAwNDsKLQotICAgIGFic3RyYWN0IGludCBxdWFudGl0eUZvck51bWJlcihpbnQgbik7Ci0KLSAgICBmaW5hbCBpbnQgYXR0ckZvck51bWJlcihpbnQgbikgewotICAgICAgICByZXR1cm4gUGx1cmFsUnVsZXMuYXR0ckZvclF1YW50aXR5KHF1YW50aXR5Rm9yTnVtYmVyKG4pKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IGF0dHJGb3JRdWFudGl0eShpbnQgcXVhbnRpdHkpIHsKLSAgICAgICAgLy8gc2VlIGluY2x1ZGUvdXRpbHMvUmVzb3VyY2VUeXBlcy5oCi0gICAgICAgIHN3aXRjaCAocXVhbnRpdHkpIHsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfWkVSTzogcmV0dXJuIDB4MDEwMDAwMDU7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX09ORTogIHJldHVybiAweDAxMDAwMDA2OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9UV086ICByZXR1cm4gMHgwMTAwMDAwNzsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfRkVXOiAgcmV0dXJuIDB4MDEwMDAwMDg7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX01BTlk6IHJldHVybiAweDAxMDAwMDA5OwotICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gSURfT1RIRVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHN0cmluZ0ZvclF1YW50aXR5KGludCBxdWFudGl0eSkgewotICAgICAgICBzd2l0Y2ggKHF1YW50aXR5KSB7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1pFUk86Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ6ZXJvIjsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfT05FOgotICAgICAgICAgICAgICAgIHJldHVybiAib25lIjsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfVFdPOgotICAgICAgICAgICAgICAgIHJldHVybiAidHdvIjsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfRkVXOgotICAgICAgICAgICAgICAgIHJldHVybiAiZmV3IjsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfTUFOWToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm1hbnkiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm90aGVyIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBQbHVyYWxSdWxlcyBydWxlRm9yTG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgU3RyaW5nIGxhbmcgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgaWYgKCJjcyIuZXF1YWxzKGxhbmcpKSB7Ci0gICAgICAgICAgICBpZiAoY3MgPT0gbnVsbCkgY3MgPSBuZXcgY3MoKTsKLSAgICAgICAgICAgIHJldHVybiBjczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChlbiA9PSBudWxsKSBlbiA9IG5ldyBlbigpOwotICAgICAgICAgICAgcmV0dXJuIGVuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGx1cmFsUnVsZXMgY3M7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgY3MgZXh0ZW5kcyBQbHVyYWxSdWxlcyB7Ci0gICAgICAgIGludCBxdWFudGl0eUZvck51bWJlcihpbnQgbikgewotICAgICAgICAgICAgaWYgKG4gPT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9PTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChuID49IDIgJiYgbiA8PSA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX0ZFVzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9PVEhFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFBsdXJhbFJ1bGVzIGVuOwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGVuIGV4dGVuZHMgUGx1cmFsUnVsZXMgewotICAgICAgICBpbnQgcXVhbnRpdHlGb3JOdW1iZXIoaW50IG4pIHsKLSAgICAgICAgICAgIGlmIChuID09IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT05FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcy5qYXZhCmluZGV4IGE2NTEzYWEuLjliMjNjMWUgMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcy5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50LnJlczsKIAotCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CkBAIC00Miw2ICs0MSw4IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKK2ltcG9ydCBsaWJjb3JlLmljdS5OYXRpdmVQbHVyYWxSdWxlczsKKwogLyoqCiAgKiBDbGFzcyBmb3IgYWNjZXNzaW5nIGFuIGFwcGxpY2F0aW9uJ3MgcmVzb3VyY2VzLiAgVGhpcyBzaXRzIG9uIHRvcCBvZiB0aGUKICAqIGFzc2V0IG1hbmFnZXIgb2YgdGhlIGFwcGxpY2F0aW9uIChhY2Nlc3NpYmxlIHRocm91Z2ggZ2V0QXNzZXRzKCkpIGFuZApAQCAtNTMsNiArNTQsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfQ09ORklHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBUUkFDRV9GT1JfUFJFTE9BRCA9IGZhbHNlOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX09USEVSID0gMHgwMTAwMDAwNDsKKwogICAgIC8vIFVzZSB0aGUgY3VycmVudCBTREsgdmVyc2lvbiBjb2RlLiAgSWYgd2UgYXJlIGEgZGV2ZWxvcG1lbnQgYnVpbGQsCiAgICAgLy8gYWxzbyBhbGxvdyB0aGUgcHJldmlvdXMgU0RLIHZlcnNpb24gKyAxLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzU2RrVmVyc2lvbiA9IEJ1aWxkLlZFUlNJT04uU0RLX0lOVApAQCAtOTEsNyArOTQsNyBAQAogICAgIC8qcGFja2FnZSovIGZpbmFsIEFzc2V0TWFuYWdlciBtQXNzZXRzOwogICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBtQ29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CiAgICAgLypwYWNrYWdlKi8gZmluYWwgRGlzcGxheU1ldHJpY3MgbU1ldHJpY3MgPSBuZXcgRGlzcGxheU1ldHJpY3MoKTsKLSAgICBQbHVyYWxSdWxlcyBtUGx1cmFsUnVsZTsKKyAgICBwcml2YXRlIE5hdGl2ZVBsdXJhbFJ1bGVzIG1QbHVyYWxSdWxlOwogICAgIAogICAgIHByaXZhdGUgQ29tcGF0aWJpbGl0eUluZm8gbUNvbXBhdGliaWxpdHlJbmZvOwogICAgIHByaXZhdGUgRGlzcGxheSBtRGVmYXVsdERpc3BsYXk7CkBAIC0yMDgsOSArMjExLDE3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciByZXNvdXJjZSBJRCBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICogbnVtZXJpY2FsIHF1YW50aXR5LgorICAgICAqCisgICAgICogPHA+U2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5odG1sI1BsdXJhbHMiPlN0cmluZworICAgICAqIFJlc291cmNlczwvYT4gZm9yIG1vcmUgb24gcXVhbnRpdHkgc3RyaW5ncy4KKyAgICAgKgogICAgICAqIEBwYXJhbSBpZCBUaGUgZGVzaXJlZCByZXNvdXJjZSBpZGVudGlmaWVyLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIGFhcHQKICAgICAgKiAgICAgICAgICAgdG9vbC4gVGhpcyBpbnRlZ2VyIGVuY29kZXMgdGhlIHBhY2thZ2UsIHR5cGUsIGFuZCByZXNvdXJjZQogICAgICAqICAgICAgICAgICBlbnRyeS4gVGhlIHZhbHVlIDAgaXMgYW4gaW52YWxpZCBpZGVudGlmaWVyLgorICAgICAqIEBwYXJhbSBxdWFudGl0eSBUaGUgbnVtYmVyIHVzZWQgdG8gZ2V0IHRoZSBjb3JyZWN0IHN0cmluZyBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UncworICAgICAqICAgICAgICAgICBwbHVyYWwgcnVsZXMuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIFRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gSUQgZG9lcyBub3QgZXhpc3QuCiAgICAgICoKQEAgLTIxOCwyOSArMjI5LDUyIEBACiAgICAgICogICAgICAgICBwb3NzaWJseSBzdHlsZWQgdGV4dCBpbmZvcm1hdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFF1YW50aXR5VGV4dChpbnQgaWQsIGludCBxdWFudGl0eSkgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgUGx1cmFsUnVsZXMgcnVsZSA9IGdldFBsdXJhbFJ1bGUoKTsKLSAgICAgICAgQ2hhclNlcXVlbmNlIHJlcyA9IG1Bc3NldHMuZ2V0UmVzb3VyY2VCYWdUZXh0KGlkLCBydWxlLmF0dHJGb3JOdW1iZXIocXVhbnRpdHkpKTsKKyAgICAgICAgTmF0aXZlUGx1cmFsUnVsZXMgcnVsZSA9IGdldFBsdXJhbFJ1bGUoKTsKKyAgICAgICAgQ2hhclNlcXVlbmNlIHJlcyA9IG1Bc3NldHMuZ2V0UmVzb3VyY2VCYWdUZXh0KGlkLAorICAgICAgICAgICAgICAgIGF0dHJGb3JRdWFudGl0eUNvZGUocnVsZS5xdWFudGl0eUZvckludChxdWFudGl0eSkpKTsKICAgICAgICAgaWYgKHJlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIHJlcyA9IG1Bc3NldHMuZ2V0UmVzb3VyY2VCYWdUZXh0KGlkLCBQbHVyYWxSdWxlcy5JRF9PVEhFUik7CisgICAgICAgIHJlcyA9IG1Bc3NldHMuZ2V0UmVzb3VyY2VCYWdUZXh0KGlkLCBJRF9PVEhFUik7CiAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oIlBsdXJhbCByZXNvdXJjZSBJRCAjMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhpZCkKICAgICAgICAgICAgICAgICArICIgcXVhbnRpdHk9IiArIHF1YW50aXR5Ci0gICAgICAgICAgICAgICAgKyAiIGl0ZW09IiArIFBsdXJhbFJ1bGVzLnN0cmluZ0ZvclF1YW50aXR5KHJ1bGUucXVhbnRpdHlGb3JOdW1iZXIocXVhbnRpdHkpKSk7CisgICAgICAgICAgICAgICAgKyAiIGl0ZW09IiArIHN0cmluZ0ZvclF1YW50aXR5Q29kZShydWxlLnF1YW50aXR5Rm9ySW50KHF1YW50aXR5KSkpOwogICAgIH0KIAotICAgIHByaXZhdGUgUGx1cmFsUnVsZXMgZ2V0UGx1cmFsUnVsZSgpIHsKKyAgICBwcml2YXRlIE5hdGl2ZVBsdXJhbFJ1bGVzIGdldFBsdXJhbFJ1bGUoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKICAgICAgICAgICAgIGlmIChtUGx1cmFsUnVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBsdXJhbFJ1bGUgPSBQbHVyYWxSdWxlcy5ydWxlRm9yTG9jYWxlKG1Db25maWd1cmF0aW9uLmxvY2FsZSk7CisgICAgICAgICAgICAgICAgbVBsdXJhbFJ1bGUgPSBOYXRpdmVQbHVyYWxSdWxlcy5mb3JMb2NhbGUobUNvbmZpZ3VyYXRpb24ubG9jYWxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBtUGx1cmFsUnVsZTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGludCBhdHRyRm9yUXVhbnRpdHlDb2RlKGludCBxdWFudGl0eUNvZGUpIHsKKyAgICAgICAgc3dpdGNoIChxdWFudGl0eUNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuWkVSTzogcmV0dXJuIDB4MDEwMDAwMDU7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLk9ORTogIHJldHVybiAweDAxMDAwMDA2OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5UV086ICByZXR1cm4gMHgwMTAwMDAwNzsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuRkVXOiAgcmV0dXJuIDB4MDEwMDAwMDg7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLk1BTlk6IHJldHVybiAweDAxMDAwMDA5OworICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURfT1RIRVI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyaW5nRm9yUXVhbnRpdHlDb2RlKGludCBxdWFudGl0eUNvZGUpIHsKKyAgICAgICAgc3dpdGNoIChxdWFudGl0eUNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuWkVSTzogcmV0dXJuICJ6ZXJvIjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuT05FOiAgcmV0dXJuICJvbmUiOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5UV086ICByZXR1cm4gInR3byI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLkZFVzogIHJldHVybiAiZmV3IjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuTUFOWTogcmV0dXJuICJtYW55IjsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvdGhlciI7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHN0cmluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHJlc291cmNlIElELiAgSXQKICAgICAgKiB3aWxsIGJlIHN0cmlwcGVkIG9mIGFueSBzdHlsZWQgdGV4dCBpbmZvcm1hdGlvbi4KQEAgLTI5NSw2ICszMjksOSBAQAogICAgICAqIHN0cmlwcGVkIG9mIGFueSBzdHlsZWQgdGV4dCBpbmZvcm1hdGlvbi4KICAgICAgKiB7QG1vcmV9CiAgICAgICoKKyAgICAgKiA8cD5TZWUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmh0bWwjUGx1cmFscyI+U3RyaW5nCisgICAgICogUmVzb3VyY2VzPC9hPiBmb3IgbW9yZSBvbiBxdWFudGl0eSBzdHJpbmdzLgorICAgICAqCiAgICAgICogQHBhcmFtIGlkIFRoZSBkZXNpcmVkIHJlc291cmNlIGlkZW50aWZpZXIsIGFzIGdlbmVyYXRlZCBieSB0aGUgYWFwdAogICAgICAqICAgICAgICAgICB0b29sLiBUaGlzIGludGVnZXIgZW5jb2RlcyB0aGUgcGFja2FnZSwgdHlwZSwgYW5kIHJlc291cmNlCiAgICAgICogICAgICAgICAgIGVudHJ5LiBUaGUgdmFsdWUgMCBpcyBhbiBpbnZhbGlkIGlkZW50aWZpZXIuCkBAIC0zMTcsNiArMzU0LDkgQEAKICAgICAgKiBSZXR1cm4gdGhlIHN0cmluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHJlc291cmNlIElEIGZvciBhIHBhcnRpY3VsYXIKICAgICAgKiBudW1lcmljYWwgcXVhbnRpdHkuCiAgICAgICoKKyAgICAgKiA8cD5TZWUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmh0bWwjUGx1cmFscyI+U3RyaW5nCisgICAgICogUmVzb3VyY2VzPC9hPiBmb3IgbW9yZSBvbiBxdWFudGl0eSBzdHJpbmdzLgorICAgICAqCiAgICAgICogQHBhcmFtIGlkIFRoZSBkZXNpcmVkIHJlc291cmNlIGlkZW50aWZpZXIsIGFzIGdlbmVyYXRlZCBieSB0aGUgYWFwdAogICAgICAqICAgICAgICAgICB0b29sLiBUaGlzIGludGVnZXIgZW5jb2RlcyB0aGUgcGFja2FnZSwgdHlwZSwgYW5kIHJlc291cmNlCiAgICAgICogICAgICAgICAgIGVudHJ5LiBUaGUgdmFsdWUgMCBpcyBhbiBpbnZhbGlkIGlkZW50aWZpZXIuCkBAIC0xMzE1LDcgKzEzNTUsNyBAQAogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKICAgICAgICAgICAgIGlmIChtUGx1cmFsUnVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBsdXJhbFJ1bGUgPSBQbHVyYWxSdWxlcy5ydWxlRm9yTG9jYWxlKGNvbmZpZy5sb2NhbGUpOworICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gTmF0aXZlUGx1cmFsUnVsZXMuZm9yTG9jYWxlKGNvbmZpZy5sb2NhbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTUxOSw3ICsxNTU5LDcgQEAKICAgICAvKioKICAgICAgKiBQYXJzZSBhIHNlcmllcyBvZiB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNFeHRyYSAmbHQ7ZXh0cmEmZ3Q7fSB0YWdzIGZyb20KICAgICAgKiBhbiBYTUwgZmlsZS4gIFlvdSBjYWxsIHRoaXMgd2hlbiB5b3UgYXJlIGF0IHRoZSBwYXJlbnQgdGFnIG9mIHRoZQotICAgICAqIGV4dHJhIHRhZ3MsIGFuZCBpdCByZXR1cm4gb25jZSBhbGwgb2YgdGhlIGNoaWxkIHRhZ3MgaGF2ZSBiZWVuIHBhcnNlZC4KKyAgICAgKiBleHRyYSB0YWdzLCBhbmQgaXQgd2lsbCByZXR1cm4gb25jZSBhbGwgb2YgdGhlIGNoaWxkIHRhZ3MgaGF2ZSBiZWVuIHBhcnNlZC4KICAgICAgKiBUaGlzIHdpbGwgY2FsbCB7QGxpbmsgI3BhcnNlQnVuZGxlRXh0cmF9IGZvciBlYWNoIGV4dHJhIHRhZyBlbmNvdW50ZXJlZC4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBwYXJzZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgZXh0cmFzLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKaW5kZXggYTVlNWU0Ni4uYmZhZWI4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCkBAIC0xOCwxNiArMTgsMTEgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtNTYsNiArNTEsMTAgQEAKICAgICBhYnN0cmFjdCBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uKTsKICAgICBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbik7CiAKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKICAgICAvLyBUT0RPIGltcGxlbWVudCBnZXRCbG9iIGluIGFsbCBjdXJzb3IgdHlwZXMKICAgICBwdWJsaWMgYnl0ZVtdIGdldEJsb2IoaW50IGNvbHVtbikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImdldEJsb2IgaXMgbm90IHN1cHBvcnRlZCIpOwpAQCAtODgsNyArODcsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1EYXRhU2V0T2JzZXJ2YWJsZS5ub3RpZnlJbnZhbGlkYXRlZCgpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlcnkoKSB7CiAgICAgICAgIGlmIChtU2VsZk9ic2VydmVyICE9IG51bGwgJiYgbVNlbGZPYnNlcnZlclJlZ2lzdGVyZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobU5vdGlmeVVyaSwgdHJ1ZSwgbVNlbGZPYnNlcnZlcik7CkBAIC0xMDksMjIgKzEwOCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLD8gZXh0ZW5kcyBNYXA8U3RyaW5nLE9iamVjdD4+IHZhbHVlcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGN1cnNvciBpcyBzdWNjZXNzZnVsbHkgc2Nyb2xsZWQKICAgICAgKiB0byBhIG5ldyBwb3NpdGlvbiwgZ2l2aW5nIHRoZSBzdWJjbGFzcyBhIGNoYW5jZSB0byB1cGRhdGUgYW55IHN0YXRlIGl0CiAgICAgICogbWF5IGhhdmUuIElmIGl0IHJldHVybnMgZmFsc2UgdGhlIG1vdmUgZnVuY3Rpb24gd2lsbCBhbHNvIGRvIHNvIGFuZCB0aGUKQEAgLTMyMCwxMzcgKzMwMyw2IEBACiAgICAgICAgIHJldHVybiBnZXRDb2x1bW5OYW1lcygpW2NvbHVtbkluZGV4XTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQmxvYihpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVN0cmluZyhpbnQgY29sdW1uSW5kZXgsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgU2hvcnQudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgSW50ZWdlci52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIExvbmcudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVGbG9hdChpbnQgY29sdW1uSW5kZXgsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIEZsb2F0LnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRG91YmxlKGludCBjb2x1bW5JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIERvdWJsZS52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVRvTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZShpbnQgY29sdW1uSW5kZXgsIE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1VwZGF0ZXMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9uZy52YWx1ZU9mKCkgcmV0dXJucyBudWxsIHNvbWV0aW1lcyEKLS8vICAgICAgICBMb25nIHJvd2lkID0gTG9uZy52YWx1ZU9mKGdldExvbmcobVJvd0lkQ29sdW1uSW5kZXgpKTsKLSAgICAgICAgTG9uZyByb3dpZCA9IG5ldyBMb25nKGdldExvbmcobVJvd0lkQ29sdW1uSW5kZXgpKTsKLSAgICAgICAgaWYgKHJvd2lkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgcm93aWQuIG1Sb3dJZENvbHVtbkluZGV4ID0gIiArIG1Sb3dJZENvbHVtbkluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcm93ID0gbVVwZGF0ZWRSb3dzLmdldChyb3dpZCk7Ci0gICAgICAgICAgICBpZiAocm93ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MucHV0KHJvd2lkLCByb3cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93LnB1dChnZXRDb2x1bW5OYW1lcygpW2NvbHVtbkluZGV4XSwgb2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1VwZGF0ZXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIHJldHVybiBtVXBkYXRlZFJvd3Muc2l6ZSgpID4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhYm9ydFVwZGF0ZXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIG1VcGRhdGVkUm93cy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBjb21taXRVcGRhdGVzKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtUm93SWRDb2x1bW5JbmRleCAhPSAtMTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCByZWdpc3RlckNvbnRlbnRPYnNlcnZlcihDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgbUNvbnRlbnRPYnNlcnZhYmxlLnJlZ2lzdGVyT2JzZXJ2ZXIob2JzZXJ2ZXIpOwogICAgIH0KQEAgLTQ3OCw5ICszMzAsOSBAQAogICAgICAgICByZXR1cm4gbURhdGFTZXRPYnNlcnZhYmxlOwogICAgICAgICAKICAgICB9CisKICAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFTZXRPYnNlcnZlcihEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgbURhdGFTZXRPYnNlcnZhYmxlLnJlZ2lzdGVyT2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlcikgewpAQCAtNTIyLDYgKzM3NCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIFVyaSBnZXROb3RpZmljYXRpb25VcmkoKSB7CisgICAgICAgIHJldHVybiBtTm90aWZ5VXJpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC01MzUsMzYgKzM5MSwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBoYXMgYmVlbiB1cGRhdGVkIGFuZCBpcwotICAgICAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI2dldFVwZGF0ZWRGaWVsZH0gdG8gYWxsb3cgc3ViY2xhc3NlcyB0bwotICAgICAqIHN1cHBvcnQgcmVhZGluZyB1bmNvbW1pdHRlZCB1cGRhdGVzLiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFuZAotICAgICAqIHtAbGluayAjZ2V0VXBkYXRlZEZpZWxkfSBzaG91bGQgYmUgY2FsbGVkIHRvZ2V0aGVyIGluc2lkZSBvZiBhCi0gICAgICogYmxvY2sgc3luY2hyb25pemVkIG9uIG1VcGRhdGVkUm93cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaGFzIGJlZW4gdXBkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQGRlcHJlY2F0ZWQgQWx3YXlzIHJldHVybnMgZmFsc2Ugc2luY2UgQ3Vyc29ycyBkbyBub3Qgc3VwcG9ydCB1cGRhdGluZyByb3dzCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpZWxkVXBkYXRlZChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKG1Sb3dJZENvbHVtbkluZGV4ICE9IC0xICYmIG1VcGRhdGVkUm93cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHVwZGF0ZXMgPSBtVXBkYXRlZFJvd3MuZ2V0KG1DdXJyZW50Um93SUQpOwotICAgICAgICAgICAgaWYgKHVwZGF0ZXMgIT0gbnVsbCAmJiB1cGRhdGVzLmNvbnRhaW5zS2V5KGdldENvbHVtbk5hbWVzKClbY29sdW1uSW5kZXhdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHVuY29tbWl0dGVkIHVwZGF0ZWQgdmFsdWUgZm9yIHRoZSBmaWVsZAotICAgICAqIGF0IGNvbHVtbkluZGV4LiAgTk9URTogVGhpcyBmdW5jdGlvbiBhbmQge0BsaW5rICNpc0ZpZWxkVXBkYXRlZH0gc2hvdWxkCi0gICAgICogYmUgY2FsbGVkIHRvZ2V0aGVyIGluc2lkZSBvZiBhIGJsb2NrIHN5bmNocm9uaXplZCBvbiBtVXBkYXRlZFJvd3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIGNvbHVtbiBpbmRleCBvZiB0aGUgZmllbGQgdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIHZhbHVlCisgICAgICogQGRlcHJlY2F0ZWQgQWx3YXlzIHJldHVybnMgbnVsbCBzaW5jZSBDdXJzb3JzIGRvIG5vdCBzdXBwb3J0IHVwZGF0aW5nIHJvd3MKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VXBkYXRlZEZpZWxkKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHVwZGF0ZXMgPSBtVXBkYXRlZFJvd3MuZ2V0KG1DdXJyZW50Um93SUQpOwotICAgICAgICByZXR1cm4gdXBkYXRlcy5nZXQoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0pOworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTYxNCwxMSArNDUzLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIEhhc2hNYXAgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gTG9uZyByb3dJRHMgdG8gYW5vdGhlciBNYXAKLSAgICAgKiB0aGF0IG1hcHMgZnJvbSBTdHJpbmcgY29sdW1uIG5hbWVzIHRvIG5ldyB2YWx1ZXMuIEEgTlVMTCB2YWx1ZSBtZWFucyB0bwotICAgICAqIHJlbW92ZSBhbiBleGlzdGluZyB2YWx1ZSwgYW5kIGFsbCBudW1lcmljIHZhbHVlcyBhcmUgaW4gdGhlaXIgY2xhc3MKLSAgICAgKiBmb3JtcywgaS5lLiBJbnRlZ2VyLCBMb25nLCBGbG9hdCwgZXRjLgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbmV2ZXIgdXBkYXRlZCBieSB0aGlzIGNsYXNzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBIYXNoTWFwPExvbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IG1VcGRhdGVkUm93czsKIAogICAgIC8qKgpAQCAtNjI4LDYgKzQ2NSwxMSBAQAogICAgIHByb3RlY3RlZCBpbnQgbVJvd0lkQ29sdW1uSW5kZXg7CiAKICAgICBwcm90ZWN0ZWQgaW50IG1Qb3M7CisgICAgLyoqCisgICAgICogSWYge0BsaW5rICNtUm93SWRDb2x1bW5JbmRleH0gaXMgbm90IC0xIHRoaXMgY29udGFpbnMgY29udGFpbnMgdGhlIHZhbHVlIG9mCisgICAgICogdGhlIGNvbHVtbiBhdCB7QGxpbmsgI21Sb3dJZENvbHVtbkluZGV4fSBmb3IgdGhlIGN1cnJlbnQgcm93IHRoaXMgY3Vyc29yIGlzCisgICAgICogcG9pbnRpbmcgYXQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExvbmcgbUN1cnJlbnRSb3dJRDsKICAgICBwcm90ZWN0ZWQgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNsb3NlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhCmluZGV4IDI3YTAyZTIuLjhhZGRhYTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEKQEAgLTE5LDIwMiArMTksMTA1IEBACiAvKioKICAqIEEgYmFzZSBjbGFzcyBmb3IgQ3Vyc29ycyB0aGF0IHN0b3JlIHRoZWlyIGRhdGEgaW4ge0BsaW5rIEN1cnNvcldpbmRvd31zLgogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciBleHRlbmRzIEFic3RyYWN0Q3Vyc29yCi17CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciBleHRlbmRzIEFic3RyYWN0Q3Vyc29yIHsKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJsb2IoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJsb2IoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChieXRlW10pZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEJsb2IobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW5JbmRleCkKLSAgICB7CisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldFN0cmluZyhtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29weVN0cmluZ1RvQnVmZmVyKGludCBjb2x1bW5JbmRleCwgQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikKLSAgICB7CisgICAgcHVibGljIHZvaWQgY29weVN0cmluZ1RvQnVmZmVyKGludCBjb2x1bW5JbmRleCwgQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuY29weVN0cmluZ1RvQnVmZmVyKGNvbHVtbkluZGV4LCBidWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICBtV2luZG93LmNvcHlTdHJpbmdUb0J1ZmZlcihtUG9zLCBjb2x1bW5JbmRleCwgYnVmZmVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zaG9ydFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRTaG9ydChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRJbnQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRJbnQobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRMb25nKG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5mbG9hdFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRGbG9hdChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXREb3VibGUobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KSA9PSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNOdWxsKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0VHlwZShtUG9zLCBjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgb2JqZWN0IGluc3RhbmNlb2YgYnl0ZVtdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNCbG9iKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNCbG9iKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0cmluZyhpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc1N0cmluZyhtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzTG9uZyhpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlciB8fCBvYmplY3QgaW5zdGFuY2VvZiBMb25nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzTG9uZyhtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzTG9uZyhpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoY29sdW1uSW5kZXgpID09IEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNGbG9hdChpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiAob2JqZWN0IGluc3RhbmNlb2YgRmxvYXQgfHwgb2JqZWN0IGluc3RhbmNlb2YgRG91YmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzRmxvYXQobVBvcywgY29sdW1uSW5kZXgpOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFR5cGV9CisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tQb3NpdGlvbigpCi0gICAgeworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgY2hlY2tQb3NpdGlvbigpOworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRUeXBlKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1Bvc2l0aW9uKCkgewogICAgICAgICBzdXBlci5jaGVja1Bvc2l0aW9uKCk7CiAgICAgICAgIAogICAgICAgICBpZiAobVdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVEYXRhRXhjZXB0aW9uKCJBY2Nlc3MgY2xvc2VkIGN1cnNvciIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFN0YWxlRGF0YUV4Y2VwdGlvbigiQXR0ZW1wdGluZyB0byBhY2Nlc3MgYSBjbG9zZWQgY3Vyc29yIik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YQppbmRleCBiYWE5NGQ4Li5mYTYyZDY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhCkBAIC0xNywxMyArMTcsMTAgQEAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKIC8qKgogICogTmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBidWxrIGN1cnNvci4gVGhpcyBpcyBvbmx5IGZvciB1c2UgaW4gaW1wbGVtZW50aW5nCkBAIC0xMjAsMjYgKzExNyw2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1JPV1NfVFJBTlNBQ1RJT046IHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gd2hhdCBDbGFzc0xvYWRlciBzaG91bGQgYmUgcGFzc2VkIHRvIHJlYWRIYXNoTWFwPwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gc3dpdGNoIHRvIEJ1bmRsZQotICAgICAgICAgICAgICAgICAgICBIYXNoTWFwPExvbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcyA9IGRhdGEucmVhZEhhc2hNYXAobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdXBkYXRlUm93cyh2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KChyZXN1bHQgPT0gdHJ1ZSA/IDEgOiAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFX1JPV19UUkFOU0FDVElPTjogewotICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGRlbGV0ZVJvdyhwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoKHJlc3VsdCA9PSB0cnVlID8gMSA6IDApKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgY2FzZSBPTl9NT1ZFX1RSQU5TQUNUSU9OOiB7CiAgICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZGF0YS5yZWFkSW50KCk7CkBAIC0zNDMsNDggKzMyMCw2IEBACiAgICAgICAgIHJldHVybiBjb3VudDsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKE1hcCB2YWx1ZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwotICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwotCi0gICAgICAgIGRhdGEud3JpdGVNYXAodmFsdWVzKTsKLQotICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KFVQREFURV9ST1dTX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7Ci0KLSAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJlc3VsdCA9IChyZXBseS5yZWFkSW50KCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7Ci0KLSAgICAgICAgZGF0YS5yZWN5Y2xlKCk7Ci0gICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdyhpbnQgcG9zaXRpb24pIHRocm93cyBSZW1vdGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwotICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwotCi0gICAgICAgIGRhdGEud3JpdGVJbnQocG9zaXRpb24pOwotCi0gICAgICAgIG1SZW1vdGUudHJhbnNhY3QoREVMRVRFX1JPV19UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOwotCi0gICAgICAgIERhdGFiYXNlVXRpbHMucmVhZEV4Y2VwdGlvbkZyb21QYXJjZWwocmVwbHkpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAocmVwbHkucmVhZEludCgpID09IDEgPyB0cnVlIDogZmFsc2UpOwotCi0gICAgICAgIGRhdGEucmVjeWNsZSgpOwotICAgICAgICByZXBseS5yZWN5Y2xlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRXYW50c0FsbE9uTW92ZUNhbGxzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEKaW5kZXggMTQ2OWVhMi4uMmNiMmFlYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YQpAQCAtMTYsMTIgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCiAvKioKICAqIEFkYXB0cyBhbiB7QGxpbmsgSUJ1bGtDdXJzb3J9IHRvIGEge0BsaW5rIEN1cnNvcn0gZm9yIHVzZSBpbiB0aGUgbG9jYWwKICAqIHByb2Nlc3MuCkBAIC0xNzQsMzggKzE3Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtQnVsa0N1cnNvci5kZWxldGVSb3cobVBvcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHdpbmRvdyBjb250YWlucyB0aGUgb2xkIHZhbHVlLCBkaXNjYXJkIGl0Ci0gICAgICAgICAgICAgICAgbVdpbmRvdyA9IG51bGw7Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gRml4IHVwIHRoZSBwb3NpdGlvbgotICAgICAgICAgICAgICAgIG1Db3VudCA9IG1CdWxrQ3Vyc29yLmNvdW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Qb3MgPCBtQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9sZFBvcyA9IG1Qb3M7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3MgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgbW92ZVRvUG9zaXRpb24ob2xkUG9zKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9zID0gbUNvdW50OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNoYW5nZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGRlbGV0ZSByb3cgYmVjYXVzZSB0aGUgcmVtb3RlIHByb2Nlc3MgaXMgZGVhZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgewogICAgICAgICBpZiAobUNvbHVtbnMgPT0gbnVsbCkgewpAQCAtMjE5LDQ0ICsxODUsNiBAQAogICAgICAgICByZXR1cm4gbUNvbHVtbnM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLAotICAgICAgICAgICAgPyBleHRlbmRzIE1hcDxTdHJpbmcsT2JqZWN0Pj4gYWRkaXRpb25hbFZhbHVlcykgewotICAgICAgICBpZiAoIXN1cHBvcnRzVXBkYXRlcygpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJjb21taXRVcGRhdGVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBjdXJzb3IsIGRpZCB5b3UgaW5jbHVkZSB0aGUgX2lkIGNvbHVtbj8iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MucHV0QWxsKGFkZGl0aW9uYWxWYWx1ZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVVwZGF0ZWRSb3dzLnNpemUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbUJ1bGtDdXJzb3IudXBkYXRlUm93cyhtVXBkYXRlZFJvd3MpOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MuY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGNvbW1pdCB1cGRhdGVzIGJlY2F1c2UgdGhlIHJlbW90ZSBwcm9jZXNzIGlzIGRlYWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEKaW5kZXggNjUzOTE1Ni4uYzAzYzU4NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEKQEAgLTMwLDYgKzMwLDI1IEBACiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIEN1cnNvci4KICAqLwogcHVibGljIGludGVyZmFjZSBDdXJzb3IgeworICAgIC8qCisgICAgICogVmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZShpbnQpfS4KKyAgICAgKiBUaGVzZSBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHR5cGVzIGRlZmluZWQgaW4gQ3Vyc29yV2luZG93LmgKKyAgICAgKi8KKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIG51bGwgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1RZUEVfTlVMTCA9IDA7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgIGNvbHVtbiB0eXBlIGlzIGludGVnZXIgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1RZUEVfSU5URUdFUiA9IDE7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgZmxvYXQgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1RZUEVfRkxPQVQgPSAyOworCisgICAgLyoqIFZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZShpbnQpfSBpZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGlzIHN0cmluZyAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9TVFJJTkcgPSAzOworCisgICAgLyoqIFZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZShpbnQpfSBpZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGlzIGJsb2IgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1RZUEVfQkxPQiA9IDQ7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXJzIG9mIHJvd3MgaW4gdGhlIGN1cnNvci4KICAgICAgKgpAQCAtMTQ2LDIyICsxNjUsNiBAQAogICAgIGJvb2xlYW4gaXNBZnRlckxhc3QoKTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHJvdyBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhCi0gICAgICogc3RvcmUuIEFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGN1cnNvciB3aWxsIGJlIHBvaW50aW5nIHRvIHRoZSByb3cKLSAgICAgKiBhZnRlciB0aGUgcm93IHRoYXQgaXMgZGVsZXRlZC4gVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGRlY3JlbWVudGluZwotICAgICAqIHRoZSByZXN1bHQgb2YgY291bnQoKSBieSBvbmUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHF1ZXJ5IG11c3QgaGF2ZSB0aGUgcm93IElEIGNvbHVtbiBpbiBpdHMgc2VsZWN0aW9uLCBvdGhlcndpc2UgdGhpcwotICAgICAqIGNhbGwgd2lsbCBmYWlsLgotICAgICAqIAotICAgICAqIEBoaWRlCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIHN1Y2Nlc3NmdWxseSBkZWxldGVkLgotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgQ29udGVudFJlc29sdmVyI2RlbGV0ZShVcmksIFN0cmluZywgU3RyaW5nW10pfQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBkZWxldGVSb3coKTsKLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHplcm8tYmFzZWQgaW5kZXggZm9yIHRoZSBnaXZlbiBjb2x1bW4gbmFtZSwgb3IgLTEgaWYgdGhlIGNvbHVtbiBkb2Vzbid0IGV4aXN0LgogICAgICAqIElmIHlvdSBleHBlY3QgdGhlIGNvbHVtbiB0byBleGlzdCB1c2Uge0BsaW5rICNnZXRDb2x1bW5JbmRleE9yVGhyb3coU3RyaW5nKX0gaW5zdGVhZCwgd2hpY2gKICAgICAgKiB3aWxsIG1ha2UgdGhlIGVycm9yIG1vcmUgY2xlYXIuCkBAIC0yOTUsNiArMjk4LDI3IEBACiAgICAgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBkYXRhIHR5cGUgb2YgdGhlIGdpdmVuIGNvbHVtbidzIHZhbHVlLgorICAgICAqIFRoZSBwcmVmZXJyZWQgdHlwZSBvZiB0aGUgY29sdW1uIGlzIHJldHVybmVkIGJ1dCB0aGUgZGF0YSBtYXkgYmUgY29udmVydGVkIHRvIG90aGVyIHR5cGVzCisgICAgICogYXMgZG9jdW1lbnRlZCBpbiB0aGUgZ2V0LXR5cGUgbWV0aG9kcyBzdWNoIGFzIHtAbGluayAjZ2V0SW50KGludCl9LCB7QGxpbmsgI2dldEZsb2F0KGludCl9CisgICAgICogZXRjLgorICAgICAqPHA+CisgICAgICogUmV0dXJuZWQgY29sdW1uIHR5cGVzIGFyZQorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfTlVMTH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9JTlRFR0VSfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0ZMT0FUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX1NUUklOR308L2xpPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9CTE9CfTwvbGk+CisgICAgICo8L3VsPgorICAgICAqPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgorICAgICAqIEByZXR1cm4gY29sdW1uIHZhbHVlIHR5cGUKKyAgICAgKi8KKyAgICBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgaW4gdGhlIGluZGljYXRlZCBjb2x1bW4gaXMgbnVsbC4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KQEAgLTMwMywxODggKzMyNyw2IEBACiAgICAgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbkluZGV4KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnNvciBzdXBwb3J0cyB1cGRhdGVzLgotICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBjdXJzb3Igc3VwcG9ydHMgdXBkYXRlcy4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29tbWl0dGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBoYXNVcGRhdGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlQmxvYihpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlU3RyaW5nKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVTaG9ydChpbnQgY29sdW1uSW5kZXgsIHNob3J0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVGbG9hdChpbnQgY29sdW1uSW5kZXgsIGZsb2F0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZVRvTnVsbChpbnQgY29sdW1uSW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogQXRvbWljYWxseSBjb21taXRzIGFsbCB1cGRhdGVzIHRvIHRoZSBiYWNraW5nIHN0b3JlLiBBZnRlciBjb21wbGV0aW9uLAotICAgICAqIHRoaXMgbWV0aG9kIGxlYXZlcyB0aGUgZGF0YSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYW5kIHlvdSBzaG91bGQgY2FsbAotICAgICAqIHtAbGluayAjcmVxdWVyeX0gYmVmb3JlIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBjdXJzb3IgYWdhaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIEF0b21pY2FsbHkgY29tbWl0cyBhbGwgdXBkYXRlcyB0byB0aGUgYmFja2luZyBzdG9yZSwgYXMgd2VsbCBhcyB0aGUKLSAgICAgKiB1cGRhdGVzIGluY2x1ZGVkIGluIHZhbHVlcy4gQWZ0ZXIgY29tcGxldGlvbiwKLSAgICAgKiB0aGlzIG1ldGhvZCBsZWF2ZXMgdGhlIGRhdGEgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlIGFuZCB5b3Ugc2hvdWxkIGNhbGwKLSAgICAgKiB7QGxpbmsgI3JlcXVlcnl9IGJlZm9yZSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgY3Vyc29yIGFnYWluLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlcyBBIG1hcCBmcm9tIHJvdyBJRHMgdG8gTWFwcyBhc3NvY2lhdGluZyBjb2x1bW4gbmFtZXMgd2l0aAotICAgICAqICAgICAgICAgICAgICAgdXBkYXRlZCB2YWx1ZXMuIEEgbnVsbCB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGZpZWxkIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLAotICAgICAgICAgICAgPyBleHRlbmRzIE1hcDxTdHJpbmcsT2JqZWN0Pj4gdmFsdWVzKTsKLQotICAgIC8qKgotICAgICAqIFJldmVydHMgYWxsIHVwZGF0ZXMgbWFkZSB0byB0aGUgY3Vyc29yIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KLSAgICAgKiBjb21taXRVcGRhdGVzLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgdm9pZCBhYm9ydFVwZGF0ZXMoKTsKLQotICAgIC8qKgogICAgICAqIERlYWN0aXZhdGVzIHRoZSBDdXJzb3IsIG1ha2luZyBhbGwgY2FsbHMgb24gaXQgZmFpbCB1bnRpbCB7QGxpbmsgI3JlcXVlcnl9IGlzIGNhbGxlZC4KICAgICAgKiBJbmFjdGl2ZSBDdXJzb3JzIHVzZSBmZXdlciByZXNvdXJjZXMgdGhhbiBhY3RpdmUgQ3Vyc29ycy4KICAgICAgKiBDYWxsaW5nIHtAbGluayAjcmVxdWVyeX0gd2lsbCBtYWtlIHRoZSBjdXJzb3IgYWN0aXZlIGFnYWluLgpAQCAtNDk2LDYgKzMzOCwxMCBAQAogICAgICAqIGNvbnRlbnRzLiBUaGlzIG1heSBiZSBkb25lIGF0IGFueSB0aW1lLCBpbmNsdWRpbmcgYWZ0ZXIgYSBjYWxsIHRvIHtAbGluawogICAgICAqICNkZWFjdGl2YXRlfS4KICAgICAgKgorICAgICAqIFNpbmNlIHRoaXMgbWV0aG9kIGNvdWxkIGV4ZWN1dGUgYSBxdWVyeSBvbiB0aGUgZGF0YWJhc2UgYW5kIHBvdGVudGlhbGx5IHRha2UKKyAgICAgKiBhIHdoaWxlLCBpdCBjb3VsZCBjYXVzZSBBTlIgaWYgaXQgaXMgY2FsbGVkIG9uIE1haW4gKFVJKSB0aHJlYWQuCisgICAgICogQSB3YXJuaW5nIGlzIHByaW50ZWQgaWYgdGhpcyBtZXRob2QgaXMgYmVpbmcgZXhlY3V0ZWQgb24gTWFpbiB0aHJlYWQuCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlcXVlcnkgc3VjY2VlZGVkLCBmYWxzZSBpZiBub3QsIGluIHdoaWNoIGNhc2UgdGhlCiAgICAgICogICAgICAgICBjdXJzb3IgYmVjb21lcyBpbnZhbGlkLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhCmluZGV4IDc0OGViOTkuLjhiYzdkZTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEKQEAgLTE2LDE2ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVNaXN1c2VFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIAogLyoqCiAgKiBXcmFwcyBhIEJ1bGtDdXJzb3IgYXJvdW5kIGFuIGV4aXN0aW5nIEN1cnNvciBtYWtpbmcgaXQgcmVtb3RhYmxlLgpAQCAtMzgsNyArMzQsNiBAQAogICAgIHByaXZhdGUgZmluYWwgQ3Jvc3NQcm9jZXNzQ3Vyc29yIG1DdXJzb3I7CiAgICAgcHJpdmF0ZSBDdXJzb3JXaW5kb3cgbVdpbmRvdzsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUHJvdmlkZXJOYW1lOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtUmVhZE9ubHk7CiAgICAgcHJpdmF0ZSBDb250ZW50T2JzZXJ2ZXJQcm94eSBtT2JzZXJ2ZXI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDb250ZW50T2JzZXJ2ZXJQcm94eSBleHRlbmRzIENvbnRlbnRPYnNlcnZlciAKQEAgLTk4LDcgKzkzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgIk9ubHkgQ3Jvc3NQcm9jZXNzQ3Vyc29yIGN1cnNvcnMgYXJlIHN1cHBvcnRlZCBhY3Jvc3MgcHJvY2VzcyBmb3Igbm93IiwgZSk7CiAgICAgICAgIH0KICAgICAgICAgbVByb3ZpZGVyTmFtZSA9IHByb3ZpZGVyTmFtZTsKLSAgICAgICAgbVJlYWRPbmx5ID0gIWFsbG93V3JpdGU7CiAKICAgICAgICAgY3JlYXRlQW5kUmVnaXN0ZXJPYnNlcnZlclByb3h5KG9ic2VydmVyKTsKICAgICB9CkBAIC0xOTcsMzEgKzE5MSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKE1hcDw/IGV4dGVuZHMgTG9uZywgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcykgewotICAgICAgICBpZiAobVJlYWRPbmx5KSB7Ci0gICAgICAgICAgICBMb2cudygiQ29udGVudFByb3ZpZGVyIiwgIlBlcm1pc3Npb24gRGVuaWFsOiBtb2RpZnlpbmcgIgotICAgICAgICAgICAgICAgICAgICArIG1Qcm92aWRlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gcGlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5jb21taXRVcGRhdGVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgewotICAgICAgICBpZiAobVJlYWRPbmx5KSB7Ci0gICAgICAgICAgICBMb2cudygiQ29udGVudFByb3ZpZGVyIiwgIlBlcm1pc3Npb24gRGVuaWFsOiBtb2RpZnlpbmcgIgotICAgICAgICAgICAgICAgICAgICArIG1Qcm92aWRlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gcGlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUN1cnNvci5tb3ZlVG9Qb3NpdGlvbihwb3NpdGlvbikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0RXh0cmFzKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YQppbmRleCBjNzU2ODI1Li41OTk0MzFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YQpAQCAtMjE3LDE4ICsyMTcsMTMgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyB7QGNvZGUgTlVMTH0KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzTnVsbF9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlKHJvdywgY29sKSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KICAgICAKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzTnVsbF9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGJ5dGUgYXJyYXkgZm9yIHRoZSBnaXZlbiBmaWVsZC4KICAgICAgKgpAQCAtMjQ4LDE5ICsyNDMsNDMgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBieXRlW10gZ2V0QmxvYl9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gY29sdW1uJ3MgdmFsdWUuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCBjb2x1bW4gdHlwZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdworICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0eXBlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCByb3csIGludCBjb2wpIHsKKyAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIENoZWNrcyBpZiBhIGZpZWxkIGNvbnRhaW5zIGVpdGhlciBhIGJsb2Igb3IgaXMgbnVsbC4KICAgICAgKgogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIHtAY29kZSBOVUxMfSBvciBhIGJsb2IKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNCbG9iKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzQmxvYl9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGludCB0eXBlID0gZ2V0VHlwZShyb3csIGNvbCk7CisgICAgICAgIHJldHVybiB0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX0JMT0IgfHwgdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjY5LDE0ICsyODgsMTEgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyBhIGxvbmcKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzSW50ZWdlcl9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlKHJvdywgY29sKSA9PSBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjg1LDE0ICszMDEsMTEgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyBhIGZsb2F0CisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0VHlwZShpbnQsIGludCl9IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzRmxvYXQoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNGbG9hdF9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlKHJvdywgY29sKSA9PSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKICAgICB9CiAKICAgICAvKioKQEAgLTMwMSwyMCArMzE0LDE1IEBACiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMge0Bjb2RlIE5VTEx9IG9yIGEgU3RyaW5nCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0VHlwZShpbnQsIGludCl9IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzU3RyaW5nX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IHR5cGUgPSBnZXRUeXBlKHJvdywgY29sKTsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HIHx8IHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKICAgICB9CiAKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzQmxvYl9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc1N0cmluZ19uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0ludGVnZXJfbmF0aXZlKGludCByb3csIGludCBjb2wpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNGbG9hdF9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IGdldFR5cGVfbmF0aXZlKGludCByb3csIGludCBjb2wpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIFN0cmluZyBmb3IgdGhlIGdpdmVuIGZpZWxkLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhCmluZGV4IGYwYWE3ZDcuLjNjM2JkNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldyYXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEKQEAgLTE3LDI4ICsxNywyNiBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNoYXJBcnJheUJ1ZmZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiAKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCiAvKioKLSAqIFdyYXBwZXIgY2xhc3MgZm9yIEN1cnNvciB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgdG8gdGhlIGFjdHVhbCBjdXJzb3Igb2JqZWN0CisgKiBXcmFwcGVyIGNsYXNzIGZvciBDdXJzb3IgdGhhdCBkZWxlZ2F0ZXMgYWxsIGNhbGxzIHRvIHRoZSBhY3R1YWwgY3Vyc29yIG9iamVjdC4gIFRoZSBwcmltYXJ5CisgKiB1c2UgZm9yIHRoaXMgY2xhc3MgaXMgdG8gZXh0ZW5kIGEgY3Vyc29yIHdoaWxlIG92ZXJyaWRpbmcgb25seSBhIHN1YnNldCBvZiBpdHMgbWV0aG9kcy4KICAqLwotCiBwdWJsaWMgY2xhc3MgQ3Vyc29yV3JhcHBlciBpbXBsZW1lbnRzIEN1cnNvciB7CiAKKyAgICBwcml2YXRlIGZpbmFsIEN1cnNvciBtQ3Vyc29yOworCiAgICAgcHVibGljIEN1cnNvcldyYXBwZXIoQ3Vyc29yIGN1cnNvcikgewogICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIGN1cnNvcgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFib3J0VXBkYXRlcygpIHsKLSAgICAgICAgbUN1cnNvci5hYm9ydFVwZGF0ZXMoKTsKKyAgICBwdWJsaWMgQ3Vyc29yIGdldFdyYXBwZWRDdXJzb3IoKSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewpAQCAtNDksMjMgKzQ3LDYgQEAKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNDbG9zZWQoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuY29tbWl0VXBkYXRlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKAotICAgICAgICAgICAgTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmNvbW1pdFVwZGF0ZXModmFsdWVzKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRDb3VudCgpOwogICAgIH0KQEAgLTc0LDE0ICs1NSw2IEBACiAgICAgICAgIG1DdXJzb3IuZGVhY3RpdmF0ZSgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb0ZpcnN0KCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5tb3ZlVG9GaXJzdCgpOwogICAgIH0KQEAgLTE0NywxNCArMTIwLDYgQEAKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5oYXNVcGRhdGVzKCk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCk7CiAgICAgfQpAQCAtMTcxLDYgKzEzNiwxMCBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5pc0xhc3QoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFR5cGUoY29sdW1uSW5kZXgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KTsKICAgICB9CkBAIC0yMTksMTQgKzE4OCw2IEBACiAgICAgICAgIG1DdXJzb3Iuc2V0Tm90aWZpY2F0aW9uVXJpKGNyLCB1cmkpOyAgICAgICAgCiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3Iuc3VwcG9ydHNVcGRhdGVzKCk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG9ic2VydmVyKTsgICAgICAgIAogICAgIH0KQEAgLTIzNCw3MiArMTk1LDUgQEAKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwogICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlRG91YmxlKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlRmxvYXQoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlSW50KGludCBjb2x1bW5JbmRleCwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUludChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVMb25nKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlU2hvcnQoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU3RyaW5nKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZVN0cmluZyhjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUJsb2IoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVUb051bGwoY29sdW1uSW5kZXgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOwotICAgIAogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YQppbmRleCA5MjAwZTgxLi41MWM3MmMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEKQEAgLTI3LDggKzI3LDEyIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCgpIHsKICAgICAgICAgc3luY2hyb25pemVkKG1PYnNlcnZlcnMpIHsKLSAgICAgICAgICAgIGZvciAoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyIDogbU9ic2VydmVycykgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLm9uQ2hhbmdlZCgpOworICAgICAgICAgICAgLy8gc2luY2Ugb25DaGFuZ2VkKCkgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGFwcCwgaXQgY291bGQgZG8gYW55dGhpbmcsIGluY2x1ZGluZworICAgICAgICAgICAgLy8gcmVtb3ZpbmcgaXRzZWxmIGZyb20ge0BsaW5rIG1PYnNlcnZlcnN9IC0gYW5kIHRoYXQgY291bGQgY2F1c2UgcHJvYmxlbXMgaWYKKyAgICAgICAgICAgIC8vIGFuIGl0ZXJhdG9yIGlzIHVzZWQgb24gdGhlIEFycmF5TGlzdCB7QGxpbmsgbU9ic2VydmVyc30uCisgICAgICAgICAgICAvLyB0byBhdm9pZCBzdWNoIHByb2JsZW1zLCBqdXN0IG1hcmNoIHRocnUgdGhlIGxpc3QgaW4gdGhlIHJldmVyc2Ugb3JkZXIuCisgICAgICAgICAgICBmb3IgKGludCBpID0gbU9ic2VydmVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1PYnNlcnZlcnMuZ2V0KGkpLm9uQ2hhbmdlZCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzksOCArNDMsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUludmFsaWRhdGVkKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1PYnNlcnZlcnMpIHsKLSAgICAgICAgICAgIGZvciAoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyIDogbU9ic2VydmVycykgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLm9uSW52YWxpZGF0ZWQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtT2JzZXJ2ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbU9ic2VydmVycy5nZXQoaSkub25JbnZhbGlkYXRlZCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworCisvKioKKyAqIEFuIGludGVyZmFjZSB0byBsZXQgdGhlIGFwcHMgZGVmaW5lIHRoZSBhY3Rpb25zIHRvIHRha2Ugd2hlbiB0aGUgZm9sbG93aW5nIGVycm9ycyBhcmUgZGV0ZWN0ZWQKKyAqICAgZGF0YWJhc2UgY29ycnVwdGlvbgorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlRXJyb3JIYW5kbGVyIHsKKworICAgIC8qKgorICAgICAqIGRlZmluZXMgdGhlIG1ldGhvZCB0byBiZSBpbnZva2VkIHdoZW4gZGF0YWJhc2UgY29ycnVwdGlvbiBpcyBkZXRlY3RlZC4KKyAgICAgKiBAcGFyYW0gZGJPYmogdGhlIHtAbGluayBTUUxpdGVEYXRhYmFzZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGF0YWJhc2Ugb24gd2hpY2ggY29ycnVwdGlvbgorICAgICAqIGlzIGRldGVjdGVkLgorICAgICAqLworICAgIHZvaWQgb25Db3JydXB0aW9uKFNRTGl0ZURhdGFiYXNlIGRiT2JqKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQppbmRleCA5NWZjMWZkLi43MGE3ZmI2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUHJvZ3JhbTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTUwLDYgKzUxLDI5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IERFQlVHID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNvdW50UHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXXsiY291bnQoKikifTsKKworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX1NFTEVDVCA9IDE7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfVVBEQVRFID0gMjsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9BVFRBQ0ggPSAzOworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0JFR0lOID0gNDsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9DT01NSVQgPSA1OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0FCT1JUID0gNjsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9QUkFHTUEgPSA3OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0RETCA9IDg7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfVU5QUkVQQVJFRCA9IDk7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfT1RIRVIgPSA5OTsKKwogICAgIC8qKgogICAgICAqIFNwZWNpYWwgZnVuY3Rpb24gZm9yIHdyaXRpbmcgYW4gZXhjZXB0aW9uIHJlc3VsdCBhdCB0aGUgaGVhZGVyIG9mCiAgICAgICogYSBwYXJjZWwsIHRvIGJlIHVzZWQgd2hlbiByZXR1cm5pbmcgYW4gZXhjZXB0aW9uIGZyb20gYSB0cmFuc2FjdGlvbi4KQEAgLTE5MSw2ICsyMTUsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0J3MgdmFsdWUuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCB2YWx1ZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgdHlwZSBpcyB0byBiZSByZXR1cm5lZAorICAgICAqIEByZXR1cm4gb2JqZWN0IHZhbHVlIHR5cGUKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGVPZk9iamVjdChPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgYnl0ZVtdKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmogaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMb25nIHx8IG9iaiBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEFwcGVuZHMgYW4gU1FMIHN0cmluZyB0byB0aGUgZ2l2ZW4gU3RyaW5nQnVpbGRlciwgaW5jbHVkaW5nIHRoZSBvcGVuaW5nCiAgICAgICogYW5kIGNsb3Npbmcgc2luZ2xlIHF1b3Rlcy4gQW55IHNpbmdsZSBxdW90ZXMgaW50ZXJuYWwgdG8gc3FsU3RyaW5nIHdpbGwKICAgICAgKiBiZSBlc2NhcGVkLgpAQCAtNjU2LDE0ICs3MTEsOCBAQAogICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBsb25nRm9yUXVlcnkoU1FMaXRlU3RhdGVtZW50IHByb2csIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbkFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHNpemUgPSBzZWxlY3Rpb25BcmdzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYmluZE9iamVjdFRvUHJvZ3JhbShwcm9nLCBpICsgMSwgc2VsZWN0aW9uQXJnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB2YWx1ZSA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgcHJvZy5iaW5kQWxsQXJnc0FzU3RyaW5ncyhzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgcmV0dXJuIHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02ODQsMTQgKzczMywzNiBAQAogICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0ZvclF1ZXJ5KFNRTGl0ZVN0YXRlbWVudCBwcm9nLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25BcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzaXplID0gc2VsZWN0aW9uQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGJpbmRPYmplY3RUb1Byb2dyYW0ocHJvZywgaSArIDEsIHNlbGVjdGlvbkFyZ3NbaV0pOwotICAgICAgICAgICAgfQorICAgICAgICBwcm9nLmJpbmRBbGxBcmdzQXNTdHJpbmdzKHNlbGVjdGlvbkFyZ3MpOworICAgICAgICByZXR1cm4gcHJvZy5zaW1wbGVRdWVyeUZvclN0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHJ1biB0aGUgcXVlcnkgb24gdGhlIGRiIGFuZCByZXR1cm4gdGhlIGJsb2IgdmFsdWUgaW4gdGhlCisgICAgICogZmlyc3QgY29sdW1uIG9mIHRoZSBmaXJzdCByb3cuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgcmVhZC1vbmx5IGZpbGUgZGVzY3JpcHRvciBmb3IgYSBjb3B5IG9mIHRoZSBibG9iIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3IgYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkoU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICBTdHJpbmcgcXVlcnksIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBkYi5jb21waWxlU3RhdGVtZW50KHF1ZXJ5KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeShwcm9nLCBzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb2cuY2xvc2UoKTsKICAgICAgICAgfQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBydW4gdGhlIHByZS1jb21waWxlZCBxdWVyeSBhbmQgcmV0dXJuIHRoZSBibG9iIHZhbHVlIGluIHRoZQorICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgorICAgICAqCisgICAgICogQHJldHVybiBBIHJlYWQtb25seSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgY29weSBvZiB0aGUgYmxvYiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5KFNRTGl0ZVN0YXRlbWVudCBwcm9nLAorICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICBwcm9nLmJpbmRBbGxBcmdzQXNTdHJpbmdzKHNlbGVjdGlvbkFyZ3MpOworICAgICAgICByZXR1cm4gcHJvZy5zaW1wbGVRdWVyeUZvckJsb2JGaWxlRGVzY3JpcHRvcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzA0LDggKzc3NSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChDdXJzb3IgY3Vyc29yLCBDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4pIHsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhjb2x1bW4pOwotICAgICAgICBpZiAoIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW4pOworICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CiAgICAgICAgICAgICB2YWx1ZXMucHV0KGNvbHVtbiwgY3Vyc29yLmdldFN0cmluZyhpbmRleCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzIwLDggKzc5MSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoQ3Vyc29yIGN1cnNvciwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgY29sdW1uKSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coY29sdW1uKTsKLSAgICAgICAgaWYgKCFjdXJzb3IuaXNOdWxsKGluZGV4KSkgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmICFjdXJzb3IuaXNOdWxsKGluZGV4KSkgewogICAgICAgICAgICAgdmFsdWVzLnB1dChjb2x1bW4sIGN1cnNvci5nZXRMb25nKGluZGV4KSk7CiAgICAgICAgIH0KICAgICB9CkBAIC03MzYsOCArODA3LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29yU2hvcnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoQ3Vyc29yIGN1cnNvciwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgY29sdW1uKSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coY29sdW1uKTsKLSAgICAgICAgaWYgKCFjdXJzb3IuaXNOdWxsKGluZGV4KSkgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmICFjdXJzb3IuaXNOdWxsKGluZGV4KSkgewogICAgICAgICAgICAgdmFsdWVzLnB1dChjb2x1bW4sIGN1cnNvci5nZXRTaG9ydChpbmRleCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzUyLDggKzgyMyw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChDdXJzb3IgY3Vyc29yLCBDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4pIHsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhjb2x1bW4pOwotICAgICAgICBpZiAoIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW4pOworICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CiAgICAgICAgICAgICB2YWx1ZXMucHV0KGNvbHVtbiwgY3Vyc29yLmdldEludChpbmRleCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzY4LDggKzgzOSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvckZsb2F0VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KEN1cnNvciBjdXJzb3IsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLAogICAgICAgICAgICAgU3RyaW5nIGNvbHVtbikgewotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGNvbHVtbik7Ci0gICAgICAgIGlmICghY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbik7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSAmJiAhY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKICAgICAgICAgICAgIHZhbHVlcy5wdXQoY29sdW1uLCBjdXJzb3IuZ2V0RmxvYXQoaW5kZXgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTc4NCw4ICs4NTUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JEb3VibGVUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoQ3Vyc29yIGN1cnNvciwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgY29sdW1uKSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coY29sdW1uKTsKLSAgICAgICAgaWYgKCFjdXJzb3IuaXNOdWxsKGluZGV4KSkgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmICFjdXJzb3IuaXNOdWxsKGluZGV4KSkgewogICAgICAgICAgICAgdmFsdWVzLnB1dChjb2x1bW4sIGN1cnNvci5nZXREb3VibGUoaW5kZXgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTExNTIsNCArMTIyMyw2NiBAQAogICAgICAgICBkYi5zZXRWZXJzaW9uKGRiVmVyc2lvbik7CiAgICAgICAgIGRiLmNsb3NlKCk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB3aGljaCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFNRTCBzdGF0ZW1lbnQuCisgICAgICogPG9sPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX1NFTEVDVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX1VQREFURX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0FUVEFDSH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0JFR0lOfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQ09NTUlUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQUJPUlR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9PVEhFUn08L2xpPgorICAgICAqIDwvb2w+CisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB3aG9zZSB0eXBlIGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kCisgICAgICogQHJldHVybiBvbmUgb2YgdGhlIHZhbHVlcyBsaXN0ZWQgYWJvdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgc3FsID0gc3FsLnRyaW0oKTsKKyAgICAgICAgaWYgKHNxbC5sZW5ndGgoKSA8IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByZWZpeFNxbCA9IHNxbC5zdWJzdHJpbmcoMCwgMykudG9VcHBlckNhc2UoKTsKKyAgICAgICAgaWYgKHByZWZpeFNxbC5lcXVhbHMoIlNFTCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1NFTEVDVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJJTlMiKSB8fAorICAgICAgICAgICAgICAgIHByZWZpeFNxbC5lcXVhbHMoIlVQRCIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFscygiUkVQIikgfHwKKyAgICAgICAgICAgICAgICBwcmVmaXhTcWwuZXF1YWxzKCJERUwiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9VUERBVEU7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQVRUIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQVRUQUNIOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkNPTSIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0NPTU1JVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJFTkQiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9DT01NSVQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiUk9MIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQUJPUlQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQkVHIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQkVHSU47CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiUFJBIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfUFJBR01BOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkNSRSIpIHx8IHByZWZpeFNxbC5lcXVhbHMoIkRSTyIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFscygiQUxUIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfRERMOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkFOQSIpIHx8IHByZWZpeFNxbC5lcXVhbHMoIkRFVCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1VOUFJFUEFSRUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9PVEhFUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIG9uZSBzZXQgb2Ygc2VsZWN0aW9uIGFyZ3MgdG8gYW5vdGhlci4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhZGRpbmcgYSBzZWxlY3Rpb24KKyAgICAgKiBhcmd1bWVudCB0byBhIHVzZXIgcHJvdmlkZWQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXBwZW5kU2VsZWN0aW9uQXJncyhTdHJpbmdbXSBvcmlnaW5hbFZhbHVlcywgU3RyaW5nW10gbmV3VmFsdWVzKSB7CisgICAgICAgIGlmIChvcmlnaW5hbFZhbHVlcyA9PSBudWxsIHx8IG9yaWdpbmFsVmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWVzOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbb3JpZ2luYWxWYWx1ZXMubGVuZ3RoICsgbmV3VmFsdWVzLmxlbmd0aCBdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsVmFsdWVzLCAwLCByZXN1bHQsIDAsIG9yaWdpbmFsVmFsdWVzLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3VmFsdWVzLCAwLCByZXN1bHQsIG9yaWdpbmFsVmFsdWVzLmxlbmd0aCwgbmV3VmFsdWVzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE5ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCisvKioKKyAqIERlZmF1bHQgY2xhc3MgdXNlZCBkZWZpbmluZyB0aGUgYWN0aW9ucyB0byB0YWtlIHdoZW4gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIGRldGVjdGVkCisgKiAgIGRhdGFiYXNlIGNvcnJ1cHRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIERhdGFiYXNlRXJyb3JIYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIjsKKworICAgIC8qKgorICAgICAqIGRlZmluZXMgdGhlIGRlZmF1bHQgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25Db3JydXB0aW9uKFNRTGl0ZURhdGFiYXNlIGRiT2JqKSB7CisgICAgICAgIExvZy5lKFRBRywgIkNvcnJ1cHRpb24gcmVwb3J0ZWQgYnkgc3FsaXRlIG9uIGRhdGFiYXNlOiAiICsgZGJPYmouZ2V0UGF0aCgpKTsKKworICAgICAgICAvLyBpcyB0aGUgY29ycnVwdGlvbiBkZXRlY3RlZCBldmVuIGJlZm9yZSBkYXRhYmFzZSBjb3VsZCBiZSAnb3BlbmVkJz8KKyAgICAgICAgaWYgKCFkYk9iai5pc09wZW4oKSkgeworICAgICAgICAgICAgLy8gZGF0YWJhc2UgZmlsZXMgYXJlIG5vdCBldmVuIG9wZW5hYmxlLiBkZWxldGUgdGhpcyBkYXRhYmFzZSBmaWxlLgorICAgICAgICAgICAgLy8gTk9URSBpZiB0aGUgZGF0YWJhc2UgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcywgdGhlbiBhbnkgb2YgdGhlbSBjb3VsZCBiZSBjb3JydXB0LgorICAgICAgICAgICAgLy8gYW5kIG5vdCBkZWxldGluZyBhbGwgb2YgdGhlbSBjb3VsZCBjYXVzZSBjb3JydXB0ZWQgZGF0YWJhc2UgZmlsZSB0byByZW1haW4gYW5kIAorICAgICAgICAgICAgLy8gbWFrZSB0aGUgYXBwbGljYXRpb24gY3Jhc2ggb24gZGF0YWJhc2Ugb3BlbiBvcGVyYXRpb24uIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwKKyAgICAgICAgICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcHJvdmlkZSBpdHMgb3duIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gaW1wbCBjbGFzcworICAgICAgICAgICAgLy8gdG8gZGVsZXRlIEFMTCBmaWxlcyBvZiB0aGUgZGF0YWJhc2UgKGluY2x1ZGluZyB0aGUgYXR0YWNoZWQgZGF0YWJhc2VzKS4KKyAgICAgICAgICAgIGRlbGV0ZURhdGFiYXNlRmlsZShkYk9iai5nZXRQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UsIHdoaWNoIHdpbGwgY2F1c2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zIHRvIGZhaWwuCisgICAgICAgICAgICAvLyBiZWZvcmUgdGhhdCwgZ2V0IHRoZSBhdHRhY2hlZCBkYXRhYmFzZSBsaXN0IGZpcnN0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYk9iai5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgZmlsZXMgb2YgdGhpcyBjb3JydXB0IGRhdGFiYXNlIGFuZC9vciBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChQYWlyPFN0cmluZywgU3RyaW5nPiBwIDogYXR0YWNoZWREYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKHAuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGF0dGFjaGVkRGJzID0gbnVsbCBpcyBwb3NzaWJsZSB3aGVuIHRoZSBkYXRhYmFzZSBpcyBzbyBjb3JydXB0IHRoYXQgZXZlbgorICAgICAgICAgICAgICAgIC8vICJQUkFHTUEgZGF0YWJhc2VfbGlzdDsiIGFsc28gZmFpbHMuIGRlbGV0ZSB0aGUgbWFpbiBkYXRhYmFzZSBmaWxlCisgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKGRiT2JqLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlRGF0YWJhc2VGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBpZiAoZmlsZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeToiKSB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExvZy5lKFRBRywgImRlbGV0aW5nIHRoZSBkYXRhYmFzZSBmaWxlOiAiICsgZmlsZU5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEZpbGUoZmlsZU5hbWUpLmRlbGV0ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLyogcHJpbnQgd2FybmluZyBhbmQgaWdub3JlIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgTG9nLncoVEFHLCAiZGVsZXRlIGZhaWxlZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCmluZGV4IDQ2NzkwYTMuLjI0NGM4OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQpAQCAtMTYsMTYgKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbG93LWxldmVsIHdheSB0byBwYXNzIGJ1bGsgY3Vyc29yIGRhdGEgYWNyb3NzCi0gKiBib3RoIHByb2Nlc3MgYW5kIGxhbmd1YWdlIGJvdW5kcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKKyAqIGJvdGggcHJvY2VzcyBhbmQgbGFuZ3VhZ2UgYm91bmRhcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKICAqIGludGVyZmFjZSBkaXJlY3RseS4KICAqCiAgKiB7QGhpZGV9CkBAIC01NCwxMCArNTIsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKE1hcDw/IGV4dGVuZHMgTG9uZywgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdyhpbnQgcG9zaXRpb24pIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0KICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKQEAgLTc2LDggKzcwLDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9DVVJTT1JfV0lORE9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NPTFVNTl9OQU1FU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfUk9XU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBERUxFVEVfUk9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKICAgICBzdGF0aWMgZmluYWwgaW50IERFQUNUSVZBVEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVSWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CiAgICAgc3RhdGljIGZpbmFsIGludCBPTl9NT1ZFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01hdHJpeEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKaW5kZXggZDVjM2EzMi4uNWMxYjk2OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKQEAgLTI3Miw2ICsyNzIsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VVdGlscy5nZXRUeXBlT2ZPYmplY3QoZ2V0KGNvbHVtbikpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKSB7CiAgICAgICAgIHJldHVybiBnZXQoY29sdW1uKSA9PSBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhCmluZGV4IDcyMmQ3MDcuLjJjMjVkYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YQpAQCAtOTIsMzIgKzkyLDYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gbUN1cnNvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ3Vyc29yc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvcnNbaV0uY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uKQogICAgIHsKQEAgLTE1NSw2ICsxMjksMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRUeXBlKGNvbHVtbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pCiAgICAgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTUwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKKy8qKgorICogQW4gZXhjZXB0aW9uIHRoYXQgaW5kaWNhdGVzIGludm9raW5nIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBvbiBNYWluIHRocmVhZCBjb3VsZCBjYXVzZSBBTlIuCisgKiBUaGlzIGV4Y2VwdGlvbiBzaG91bGQgZW5jb3VyYWdlIGFwcHMgdG8gaW52b2tlIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBpbiBhIGJhY2tncm91bmQgdGhyZWFkLiAKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHB1YmxpYyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgc3VwZXIoIkluICIgKyBwYWNrYWdlTmFtZSArICIgUmVxdWVyeSBpcyBleGVjdXRpbmcgb24gbWFpbiAoVUkpIHRocmVhZC4gY291bGQgY2F1c2UgQU5SLiAiICsKKyAgICAgICAgICAgICAgICAiZG8gaXQgaW4gYmFja2dyb3VuZCB0aHJlYWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhOWQyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBBIGNvbm5lY3Rpb24gcG9vbCB0byBiZSB1c2VkIGJ5IHJlYWRlcnMuCisgKiBOb3RlIHRoYXQgZWFjaCBjb25uZWN0aW9uIGNhbiBiZSB1c2VkIGJ5IG9ubHkgb25lIHJlYWRlciBhdCBhIHRpbWUuCisgKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlQ29ubmVjdGlvblBvb2wiOworCisgICAgLyoqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gcG9vbCBzaXplLiAqLworICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IG1NYXhQb29sU2l6ZSA9CisgICAgICAgIFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRJbnRlZ2VyKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5kYl9jb25uZWN0aW9uX3Bvb2xfc2l6ZSk7CisKKyAgICAvKiogVGhlIGNvbm5lY3Rpb24gcG9vbCBvYmplY3RzIGFyZSBzdG9yZWQgaW4gdGhpcyBtZW1iZXIuCisgICAgICogVE9ETzogcmV2aXNpdCB0aGlzIGRhdGEgc3RydWN0IGFzIHRoZSBudW1iZXIgb2YgcG9vbGVkIGNvbm5lY3Rpb25zIGluY3JlYXNlIGJleW9uZAorICAgICAqIHNpbmdsZS1kaWdpdCB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UG9vbE9iaj4gbVBvb2wgPSBuZXcgQXJyYXlMaXN0PFBvb2xPYmo+KG1NYXhQb29sU2l6ZSk7CisKKyAgICAvKiogdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiB0byB3aGljaCB0aGlzIGNvbm5lY3Rpb24gcG9vbCBpcyBhdHRhY2hlZCAqLworICAgIHByaXZhdGUgZmluYWwgU1FMaXRlRGF0YWJhc2UgbVBhcmVudERiT2JqOworCisgICAgLyoqIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHVzZWQgdG8gcGljayBhIGZyZWUgY29ubmVjdGlvbiBvdXQgb2YgdGhlIHBvb2wgKi8KKyAgICBwcml2YXRlIFJhbmRvbSByYW5kOyAvLyBsYXppbHkgaW5pdGlhbGl6ZWQKKworICAgIC8qIHBhY2thZ2UgKi8gRGF0YWJhc2VDb25uZWN0aW9uUG9vbChTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICB0aGlzLm1QYXJlbnREYk9iaiA9IGRiOworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJNYXggUG9vbCBTaXplOiAiICsgbU1heFBvb2xTaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNsb3NlIGFsbCBkYXRhYmFzZSBjb25uZWN0aW9ucyBpbiB0aGUgcG9vbCAtIGV2ZW4gaWYgdGhleSBhcmUgaW4gdXNlIQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkNsb3NpbmcgdGhlIGNvbm5lY3Rpb24gcG9vbCBvbiAiICsgbVBhcmVudERiT2JqLmdldFBhdGgoKSArIHRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBtUG9vbC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbVBvb2wuZ2V0KGkpLm1EYi5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIG1Qb29sLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgZnJlZSBjb25uZWN0aW9uIGZyb20gdGhlIHBvb2wKKyAgICAgKgorICAgICAqIEBwYXJhbSBzcWwgaWYgbm90IG51bGwsIHRyeSB0byBmaW5kIGEgY29ubmVjdGlvbiBpbnRoZSBwb29sIHdoaWNoIGFscmVhZHkgaGFzIGNhY2hlZAorICAgICAqIHRoZSBjb21waWxlZCBzdGF0ZW1lbnQgZm9yIHRoaXMgc3FsLgorICAgICAqIEByZXR1cm4gdGhlIERhdGFiYXNlIGNvbm5lY3Rpb24gdGhhdCB0aGUgY2FsbGVyIGNhbiB1c2UKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXQoU3RyaW5nIHNxbCkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG51bGw7CisgICAgICAgIFBvb2xPYmogcG9vbE9iaiA9IG51bGw7CisgICAgICAgIGludCBwb29sU2l6ZSA9IG1Qb29sLnNpemUoKTsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgYXNzZXJ0IHNxbCAhPSBudWxsOworICAgICAgICAgICAgZG9Bc3NlcnRzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldEZyZWVQb29sU2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIG5vIGZyZWUgKCA9IGF2YWlsYWJsZSkgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChtTWF4UG9vbFNpemUgPT0gcG9vbFNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBtYXhlZCBvdXQuIGNhbid0IG9wZW4gYW55IG1vcmUgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBjYWxsZXIgd2FpdCBvbiBvbmUgb2YgdGhlIHBvb2xlZCBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIC8vIHByZWZlcmFibHkgYSBjb25uZWN0aW9uIGNhY2hpbmcgdGhlIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgb2YgdGhlIGdpdmVuIFNRTAorICAgICAgICAgICAgICAgIGlmIChtTWF4UG9vbFNpemUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1heFBvb2xTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9vbC5nZXQoaSkubURiLmlzSW5TdGF0ZW1lbnRDYWNoZShzcWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocG9vbE9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgbm8gZGF0YWJhc2UgY29ubmVjdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gU1FMIHByZS1jb21waWxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rIHRvIHJldHVybiBhbnkgb2YgdGhlIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmQgPSBuZXcgUmFuZG9tKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQocmFuZC5uZXh0SW50KG1NYXhQb29sU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRiID0gcG9vbE9iai5tRGI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIHBvb2wsIHNpbmNlIHdlIGhhdmVuJ3QgcmVhY2hlZAorICAgICAgICAgICAgICAgIC8vIG1heCBwb29sIHNpemUgYWxsb3dlZAorICAgICAgICAgICAgICAgIGRiID0gbVBhcmVudERiT2JqLmNyZWF0ZVBvb2xDb25uZWN0aW9uKChzaG9ydCkocG9vbFNpemUgKyAxKSk7CisgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG5ldyBQb29sT2JqKGRiKTsKKyAgICAgICAgICAgICAgICBtUG9vbC5hZGQocG9vbFNpemUsIHBvb2xPYmopOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGZyZWUgY29ubmVjdGlvbnMgYXZhaWxhYmxlLiBwaWNrIG9uZQorICAgICAgICAgICAgLy8gcHJlZmVyYWJseSBhIGNvbm5lY3Rpb24gY2FjaGluZyB0aGUgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBvZiB0aGUgZ2l2ZW4gU1FMCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvb2xTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpICYmIG1Qb29sLmdldChpKS5tRGIuaXNJblN0YXRlbWVudENhY2hlKHNxbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvb2xPYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGEgZnJlZSBkYXRhYmFzZSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIFNRTCBhbHJlYWR5CisgICAgICAgICAgICAgICAgLy8gcHJlLWNvbXBpbGVkLiByZXR1cm4gYSBmcmVlIGNvbm5lY3Rpb24gKHRoaXMgbWVhbnMsIHRoZSBzYW1lIFNRTCBjb3VsZCBiZQorICAgICAgICAgICAgICAgIC8vIHByZS1jb21waWxlZCBvbiBtb3JlIHRoYW4gb25lIGRhdGFiYXNlIGNvbm5lY3Rpb24uIHBvdGVudGlhbCB3YXN0ZWQgbWVtb3J5LikKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvb2xTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5pc0ZyZWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGIgPSBwb29sT2JqLm1EYjsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCBwb29sT2JqICE9IG51bGw7CisgICAgICAgIGFzc2VydCBwb29sT2JqLm1EYiA9PSBkYjsKKworICAgICAgICBwb29sT2JqLmFjcXVpcmUoKTsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRU5EIGdldC1jb25uZWN0aW9uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRiOworICAgICAgICAvLyBUT0RPIGlmIGEgdGhyZWFkIGFjcXVpcmVzIGEgY29ubmVjdGlvbiBhbmQgZGllcyB3aXRob3V0IHJlbGVhc2luZyB0aGUgY29ubmVjdGlvbiwgdGhlbgorICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSBhIGNvbm5lY3Rpb24gbGVhay4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWxlYXNlIHRoZSBnaXZlbiBkYXRhYmFzZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuCisgICAgICogQHBhcmFtIGRiIHRoZSBjb25uZWN0aW9uIHRvIGJlIHJlbGVhc2VkCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIGFzc2VydCBkYi5tQ29ubmVjdGlvbk51bSA+IDA7CisgICAgICAgICAgICBkb0Fzc2VydHMoKTsKKyAgICAgICAgICAgIGFzc2VydCBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKS5tRGIgPT0gZGI7CisgICAgICAgIH0KKworICAgICAgICBQb29sT2JqIHBvb2xPYmogPSBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKTsKKworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJCRUdJTiByZWxlYXNlLWNvbm46ICIgKyB0b1N0cmluZygpICsgcG9vbE9iai50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb29sT2JqLmlzRnJlZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZWxlYXNpbmcgb2JqZWN0IGFscmVhZHkgZnJlZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICBkYi5tQ29ubmVjdGlvbk51bSk7CisgICAgICAgIH0KKworICAgICAgICBwb29sT2JqLnJlbGVhc2UoKTsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRU5EIHJlbGVhc2UtY29ubjogIiArIHRvU3RyaW5nKCkgKyBwb29sT2JqLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sIChib3RoIGZyZWUgYW5kIGJ1c3kgY29ubmVjdGlvbnMpLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiAiYWRiIGJ1Z3JlcG9ydCIgaXMgZG9uZS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGdldENvbm5lY3Rpb25MaXN0KCkgeworICAgICAgICBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPigpOworICAgICAgICBmb3IgKGludCBpID0gbVBvb2wuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGxpc3QuYWRkKG1Qb29sLmdldChpKS5tRGIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIHBhY2thZ2UgbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuIG90aGVyd2lzZSwgcHJpdmF0ZSBzaG91bGQgYmUgc3VmZmljaWVudC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRGcmVlUG9vbFNpemUoKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBtUG9vbC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5pc0ZyZWUoKSkgeworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50Kys7CisgICAgfQorCisgICAgLyoqCisgICAgICogb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gQXJyYXlMaXN0PFBvb2xPYmo+IGdldFBvb2woKSB7CisgICAgICAgIHJldHVybiBtUG9vbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWZmLmFwcGVuZCgiZGI6ICIpOworICAgICAgICBidWZmLmFwcGVuZChtUGFyZW50RGJPYmouZ2V0UGF0aCgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgdG90YWxzaXplID0gIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKG1Qb29sLnNpemUoKSk7CisgICAgICAgIGJ1ZmYuYXBwZW5kKCIsICNmcmVlID0gIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKGdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgbWF4cG9vbHNpemUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQobU1heFBvb2xTaXplKTsKKyAgICAgICAgZm9yIChQb29sT2JqIHAgOiBtUG9vbCkgeworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChwLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvQXNzZXJ0cygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUG9vbC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbVBvb2wuZ2V0KGkpLnZlcmlmeSgpOworICAgICAgICAgICAgYXNzZXJ0IG1Qb29sLmdldChpKS5tRGIubUNvbm5lY3Rpb25OdW0gPT0gKGkgKyAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBvbmx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNYXhQb29sU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBtTWF4UG9vbFNpemUgPSBzaXplOworICAgIH0KKworICAgIC8qKiBvbmx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgaW50IGdldE1heFBvb2xTaXplKCkgeworICAgICAgICByZXR1cm4gbU1heFBvb2xTaXplOworICAgIH0KKworICAgIC8qKiBvbmx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGlzRGF0YWJhc2VPYmpGcmVlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIHJldHVybiBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKS5pc0ZyZWUoKTsKKyAgICB9CisKKyAgICAvKiogb25seSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldFNpemUoKSB7CisgICAgICAgIHJldHVybiBtUG9vbC5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwcmVzZW50cyBvYmplY3RzIGluIHRoZSBjb25uZWN0aW9uIHBvb2wuCisgICAgICogcGFja2FnZS1sZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBQb29sT2JqIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZURhdGFiYXNlIG1EYjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GcmVlQnVzeUZsYWcgPSBGUkVFOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZSRUUgPSB0cnVlOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEJVU1kgPSBmYWxzZTsKKworICAgICAgICAvKiogdGhlIG51bWJlciBvZiB0aHJlYWRzIGhvbGRpbmcgdGhpcyBjb25uZWN0aW9uICovCisgICAgICAgIC8vIEBHdWFyZGVkQnkoInRoaXMiKQorICAgICAgICBwcml2YXRlIGludCBtTnVtSG9sZGVycyA9IDA7CisKKyAgICAgICAgLyoqIGNvbnRhaW5zIHRoZSB0aHJlYWRJZHMgb2YgdGhlIHRocmVhZHMgaG9sZGluZyB0aGlzIGNvbm5lY3Rpb24uCisgICAgICAgICAqIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgorICAgICAgICAgKi8KKyAgICAgICAgLy8gQEd1YXJkZWRCeSgidGhpcyIpCisgICAgICAgIHByaXZhdGUgSGFzaFNldDxMb25nPiBtSG9sZGVySWRzID0gbmV3IEhhc2hTZXQ8TG9uZz4oKTsKKworICAgICAgICBwdWJsaWMgUG9vbE9iaihTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICAgbURiID0gZGI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFjcXVpcmUoKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzRnJlZSgpOworICAgICAgICAgICAgICAgIGxvbmcgaWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0ICFtSG9sZGVySWRzLmNvbnRhaW5zKGlkKTsKKyAgICAgICAgICAgICAgICBtSG9sZGVySWRzLmFkZChpZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1OdW1Ib2xkZXJzKys7CisgICAgICAgICAgICBtRnJlZUJ1c3lGbGFnID0gQlVTWTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBsb25nIGlkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpOworICAgICAgICAgICAgICAgIGFzc2VydCBtSG9sZGVySWRzLnNpemUoKSA9PSBtTnVtSG9sZGVyczsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbUhvbGRlcklkcy5jb250YWlucyhpZCk7CisgICAgICAgICAgICAgICAgbUhvbGRlcklkcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTnVtSG9sZGVycy0tOworICAgICAgICAgICAgaWYgKG1OdW1Ib2xkZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1c3lGbGFnID0gRlJFRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGcmVlKCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIHZlcmlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChtRnJlZUJ1c3lGbGFnID09IEZSRUUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgICAgICBpZiAobUZyZWVCdXN5RmxhZyA9PSBGUkVFKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1OdW1Ib2xkZXJzID09IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydCBtTnVtSG9sZGVycyA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAgICAgKi8KKyAgICAgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgaW50IGdldE51bUhvbGRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bUhvbGRlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBjb25uICMgIik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChtRGIubUNvbm5lY3Rpb25OdW0pOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgbUNvdW50SG9sZGVycyA9ICIpOworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChtTnVtSG9sZGVycyk7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgZnJlZUJ1c3lGbGFnID0gIik7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQobUZyZWVCdXN5RmxhZyk7CisgICAgICAgICAgICAgICAgZm9yIChMb25nIGwgOiBtSG9sZGVySWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGlkID0gIiArIGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDhhYzRjMGYuLmYyOGM3MGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCkBAIC0yMSwxMyArMjEsMTEgQEAKICAqIHRoYXQgaXMgbm90IGV4cGxpY2l0bHkgY2xvc2VkCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17CitwdWJsaWMgY2xhc3MgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcyA9ICJBcHBsaWNhdGlvbiBkaWQgbm90IGNsb3NlIHRoZSBjdXJzb3Igb3IgZGF0YWJhc2Ugb2JqZWN0ICIgKwogICAgICAgICAgICAgInRoYXQgd2FzIG9wZW5lZCBoZXJlIjsKIAotICAgIHB1YmxpYyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpCi0gICAgeworICAgIHB1YmxpYyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIocyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4ZGE0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gY2xhc3MgaXMgdXNlZCB3aGVuIHNxbGl0ZSBjYW4ndCBhY2Nlc3MgdGhlIGRhdGFiYXNlIGZpbGUKKyAqIGR1ZSB0byBsYWNrIG9mIHBlcm1pc3Npb25zIG9uIHRoZSBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmMmY5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworLyoqCisgKiBUaHJvd24gaWYgdGhlIHRoZSBiaW5kIG9yIGNvbHVtbiBwYXJhbWV0ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjY3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjAxNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNsb3NhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2xvc2FibGUuamF2YQppbmRleCAxODMwZjZjLi45NmU2ZjIyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2xvc2FibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2xvc2FibGUuamF2YQpAQCAtMjMsMTMgKzIzLDE0IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTUUxpdGVDbG9zYWJsZSB7CiAgICAgcHJpdmF0ZSBpbnQgbVJlZmVyZW5jZUNvdW50ID0gMTsKLSAgICBwcml2YXRlIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsgLy8gU1RPUFNISVAgcmVtb3ZlIHRoaXMgbGluZQogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKTsKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZEZyb21Db250YWluZXIoKSB7fQogCiAgICAgcHVibGljIHZvaWQgYWNxdWlyZVJlZmVyZW5jZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgeyAvLyBTVE9QU0hJUCBjaGFuZ2UgJ21Mb2NrJyB0byAndGhpcycKKyAgICAgICAgICAgIGNoZWNrUmVmQ291bnQoKTsKICAgICAgICAgICAgIGlmIChtUmVmZXJlbmNlQ291bnQgPD0gMCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdCB0byByZS1vcGVuIGFuIGFscmVhZHktY2xvc2VkIG9iamVjdDogIiArIGdldE9iakluZm8oKSk7CkBAIC0zOSw3ICs0MCw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVsZWFzZVJlZmVyZW5jZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgeyAvLyBTVE9QU0hJUCBjaGFuZ2UgJ21Mb2NrJyB0byAndGhpcycKKyAgICAgICAgICAgIGNoZWNrUmVmQ291bnQoKTsKICAgICAgICAgICAgIG1SZWZlcmVuY2VDb3VudC0tOwogICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKTsKQEAgLTQ4LDcgKzUwLDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVmZXJlbmNlRnJvbUNvbnRhaW5lcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgeyAvLyBTVE9QU0hJUCBjaGFuZ2UgJ21Mb2NrJyB0byAndGhpcycKKyAgICAgICAgICAgIGNoZWNrUmVmQ291bnQoKTsKICAgICAgICAgICAgIG1SZWZlcmVuY2VDb3VudC0tOwogICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCk7CkBAIC02Myw4ICs2Niw3IEBACiAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgU1FMaXRlRGF0YWJhc2UpIHsKICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCJkYXRhYmFzZSA9ICIpOwogICAgICAgICAgICAgYnVmZi5hcHBlbmQoKChTUUxpdGVEYXRhYmFzZSl0aGlzKS5nZXRQYXRoKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBTUUxpdGVQcm9ncmFtIHx8IHRoaXMgaW5zdGFuY2VvZiBTUUxpdGVTdGF0ZW1lbnQgfHwKLSAgICAgICAgICAgICAgICB0aGlzIGluc3RhbmNlb2YgU1FMaXRlUXVlcnkpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzIGluc3RhbmNlb2YgU1FMaXRlUHJvZ3JhbSkgewogICAgICAgICAgICAgYnVmZi5hcHBlbmQoIm1TcWwgPSAiKTsKICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCgoU1FMaXRlUHJvZ3JhbSl0aGlzKS5tU3FsKTsKICAgICAgICAgfSBlbHNlIGlmICh0aGlzIGluc3RhbmNlb2YgQ3Vyc29yV2luZG93KSB7CkBAIC03NCw0ICs3NiwxMiBAQAogICAgICAgICBidWZmLmFwcGVuZCgiKSAiKTsKICAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKICAgICB9CisKKyAgICAvLyBTVE9QU0hJUCByZW1vdmUgdGhpcyBtZXRob2QgYmVmb3JlIHNoaXBwaW5nCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVmQ291bnQoKSB7CisgICAgICAgIGlmIChtUmVmZXJlbmNlQ291bnQgPiAxMDAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJiYWQgcmVmY291bnQ6ICIgKyBtUmVmZXJlbmNlQ291bnQgKworICAgICAgICAgICAgICAgICAgICAiLiBmaWxlIGJ1ZyBhZ2FpbnN0IGZyYW1ld29ya3MtPmRhdGFiYXNlIiArIGdldE9iakluZm8oKSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCmluZGV4IDAwM2QwZjIuLmE3YWQ3NTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCkBAIC0zMiwxMiArMzIsMTIgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNRTGl0ZUNvbXBpbGVkU3FsIjsKIAogICAgIC8qKiBUaGUgZGF0YWJhc2UgdGhpcyBwcm9ncmFtIGlzIGNvbXBpbGVkIGFnYWluc3QuICovCi0gICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CiAKICAgICAvKioKICAgICAgKiBOYXRpdmUgbGlua2FnZSwgZG8gbm90IG1vZGlmeS4gVGhpcyBjb21lcyBmcm9tIHRoZSBkYXRhYmFzZS4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIGludCBuSGFuZGxlID0gMDsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIGludCBuSGFuZGxlOwogCiAgICAgLyoqCiAgICAgICogTmF0aXZlIGxpbmthZ2UsIGRvIG5vdCBtb2RpZnkuIFdoZW4gbm9uLTAgdGhpcyBob2xkcyBhIHJlZmVyZW5jZSB0byBhIHZhbGlkCkBAIC01NSw2MSArNTUsMjEgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUluVXNlID0gZmFsc2U7CiAKICAgICAvKiBwYWNrYWdlICovIFNRTGl0ZUNvbXBpbGVkU3FsKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7Ci0gICAgICAgIGlmICghZGIuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBkYi5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KKyAgICAgICAgZGIudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgZGIudmVyaWZ5TG9ja093bmVyKCk7CiAgICAgICAgIG1EYXRhYmFzZSA9IGRiOwogICAgICAgICBtU3FsU3RtdCA9IHNxbDsKICAgICAgICAgbVN0YWNrVHJhY2UgPSBuZXcgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24oKS5maWxsSW5TdGFja1RyYWNlKCk7Ci0gICAgICAgIHRoaXMubkhhbmRsZSA9IGRiLm1OYXRpdmVIYW5kbGU7Ci0gICAgICAgIGNvbXBpbGUoc3FsLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gU1FMIGludG8gYSBTUUxpdGUgYnl0ZSBjb2RlIHByb2dyYW0gdXNpbmcgc3FsaXRlM19wcmVwYXJlX3YyKCkuIElmCi0gICAgICogdGhpcyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHByZXZpb3VzbHkgd2l0aG91dCBhIGNhbGwgdG8gY2xvc2UgYW5kIGZvckNvbXBpbGF0aW9uIGlzIHNldAotICAgICAqIHRvIGZhbHNlIHRoZSBwcmV2aW91cyBjb21waWxhdGlvbiB3aWxsIGJlIHVzZWQuIFNldHRpbmcgZm9yY2VDb21waWxhdGlvbiB0byB0cnVlIHdpbGwKLSAgICAgKiBhbHdheXMgcmUtY29tcGlsZSB0aGUgcHJvZ3JhbSBhbmQgc2hvdWxkIGJlIGRvbmUgaWYgeW91IHBhc3MgZGlmZmVyaW5nIFNRTCBzdHJpbmdzIHRvIHRoaXMKLSAgICAgKiBtZXRob2QuCi0gICAgICoKLSAgICAgKiA8UD5Ob3RlOiB0aGlzIG1ldGhvZCBhY3F1aXJlcyB0aGUgZGF0YWJhc2UgbG9jay48L1A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3FsIHRoZSBTUUwgc3RyaW5nIHRvIGNvbXBpbGUKLSAgICAgKiBAcGFyYW0gZm9yY2VDb21waWxhdGlvbiBmb3JjZXMgdGhlIFNRTCB0byBiZSByZWNvbXBpbGVkIGluIHRoZSBldmVudCB0aGF0IHRoZXJlIGlzIGFuCi0gICAgICogIGV4aXN0aW5nIGNvbXBpbGVkIFNRTCBwcm9ncmFtIGFscmVhZHkgYXJvdW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXBpbGUoU3RyaW5nIHNxbCwgYm9vbGVhbiBmb3JjZUNvbXBpbGF0aW9uKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBPbmx5IGNvbXBpbGUgaWYgd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIHN0YXRlbWVudCBhbHJlYWR5IG9yIHRoZSBjYWxsZXIgaGFzCi0gICAgICAgIC8vIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGEgcmVjb21waWxlLgotICAgICAgICBpZiAoZm9yY2VDb21waWxhdGlvbikgewotICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBuYXRpdmVfY29tcGlsZSgpIHRha2VzIGNhcmUgb2YgZGVzdHJveWluZyBhbnkgcHJldmlvdXNseQotICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHByb2dyYW1zIGJlZm9yZSBpdCBjb21waWxlcy4KLSAgICAgICAgICAgICAgICBuYXRpdmVfY29tcGlsZShzcWwpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbkhhbmRsZSA9IGRiLm1OYXRpdmVIYW5kbGU7CisgICAgICAgIG5hdGl2ZV9jb21waWxlKHNxbCk7CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIHJlbGVhc2VTcWxTdGF0ZW1lbnQoKSB7CiAgICAgICAgIC8vIE5vdGUgdGhhdCBuYXRpdmVfZmluYWxpemUoKSBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgblN0YXRlbWVudCBpcwogICAgICAgICAvLyBub24tbnVsbCBiZWZvcmUgZGVzdHJveWluZyBpdC4KICAgICAgICAgaWYgKG5TdGF0ZW1lbnQgIT0gMCkgewotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY2xvc2VkIGFuZCBkZWFsbG9jYXRlZCBEYk9iaiAoaWQjIiArIG5TdGF0ZW1lbnQgKyIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7Ci0gICAgICAgICAgICAgICAgblN0YXRlbWVudCA9IDA7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5maW5hbGl6ZVN0YXRlbWVudExhdGVyKG5TdGF0ZW1lbnQpOworICAgICAgICAgICAgblN0YXRlbWVudCA9IDA7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExOCwyMyArNzgsMjQgQEAKICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBib29sZWFuIGFjcXVpcmUoKSB7CiAgICAgICAgIGlmIChtSW5Vc2UpIHsKLSAgICAgICAgICAgIC8vIHNvbWVvbmUgYWxyZWFkeSBoYXMgYWNxdWlyZWQgaXQuCisgICAgICAgICAgICAvLyBpdCBpcyBhbHJlYWR5IGluIHVzZS4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtSW5Vc2UgPSB0cnVlOwotICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgIExvZy52KFRBRywgIkFjcXVpcmVkIERiT2JqIChpZCMiICsgblN0YXRlbWVudCArICIpIGZyb20gREIgY2FjaGUiKTsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewotICAgICAgICAgICAgTG9nLnYoVEFHLCAiUmVsZWFzZWQgRGJPYmogKGlkIyIgKyBuU3RhdGVtZW50ICsgIikgYmFjayB0byBEQiBjYWNoZSIpOwotICAgICAgICB9CiAgICAgICAgIG1JblVzZSA9IGZhbHNlOwogICAgIH0KIAorICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZUlmTm90SW5Vc2UoKSB7CisgICAgICAgIC8vIGlmIGl0IGlzIG5vdCBpbiB1c2UsIHJlbGVhc2UgaXRzIG1lbW9yeSBmcm9tIHRoZSBkYXRhYmFzZQorICAgICAgICBpZiAoIW1JblVzZSkgeworICAgICAgICAgICAgcmVsZWFzZVNxbFN0YXRlbWVudCgpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTWFrZSBzdXJlIHRoYXQgdGhlIG5hdGl2ZSByZXNvdXJjZSBpcyBjbGVhbmVkIHVwLgogICAgICAqLwpAQCAtMTQzLDEwICsxMDQsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChuU3RhdGVtZW50ID09IDApIHJldHVybjsKICAgICAgICAgICAgIC8vIGZpbmFsaXplciBzaG91bGQgTkVWRVIgZ2V0IGNhbGxlZAotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiKiogd2FybmluZyAqKiBGaW5hbGl6ZWQgRGJPYmogKGlkIyIgKyBuU3RhdGVtZW50ICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChTdHJpY3RNb2RlLnZtU3FsaXRlT2JqZWN0TGVha3NFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIGJ1dCBpZiB0aGUgZGF0YWJhc2UgaXRzZWxmIGlzIG5vdCBjbG9zZWQgYW5kIGlzIEdDJ2VkLCB0aGVuCisgICAgICAgICAgICAvLyBhbGwgc3ViLW9iamVjdHMgYXR0YWNoZWQgdG8gdGhlIGRhdGFiYXNlIGNvdWxkIGVuZCB1cCBnZXR0aW5nIEdDJ2VkIHRvby4KKyAgICAgICAgICAgIC8vIGluIHRoYXQgY2FzZSwgZG9uJ3QgcHJpbnQgYW55IHdhcm5pbmcuCisgICAgICAgICAgICBpZiAobUluVXNlICYmIFN0cmljdE1vZGUudm1TcWxpdGVPYmplY3RMZWFrc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgIGludCBsZW4gPSBtU3FsU3RtdC5sZW5ndGgoKTsKICAgICAgICAgICAgICAgICBTdHJpY3RNb2RlLm9uU3FsaXRlT2JqZWN0TGVha2VkKAogICAgICAgICAgICAgICAgICAgICAiUmVsZWFzaW5nIHN0YXRlbWVudCBpbiBhIGZpbmFsaXplci4gUGxlYXNlIGVuc3VyZSAiICsKQEAgLTE2MCw2ICsxMjEsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIgblN0YXRlbWVudD0iKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG5TdGF0ZW1lbnQpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgbUluVXNlPSIpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQobUluVXNlKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGRiPSIpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQobURhdGFiYXNlLmdldFBhdGgoKSk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBkYl9jb25uZWN0aW9uTnVtPSIpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQobURhdGFiYXNlLm1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIHNxbD0iKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBtU3FsU3RtdC5sZW5ndGgoKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1TcWxTdG10LnN1YnN0cmluZygwLCAobGVuID4gMTAwKSA/IDEwMCA6IGxlbikpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbXBpbGVzIFNRTCBpbnRvIGEgU1FMaXRlIHByb2dyYW0uCiAgICAgICoKQEAgLTE2Nyw1ICsxNDYsNCBAQAogICAgICAqIEBwYXJhbSBzcWwgVGhlIFNRTCB0byBjb21waWxlLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2NvbXBpbGUoU3RyaW5nIHNxbCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb250ZW50SGVscGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29udGVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODAwZDg2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb250ZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lbW9yeUZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdXNpbmcgU1FMaXRlIGRhdGFiYXNlIHRvIGltcGxlbWVudCBjb250ZW50IHByb3ZpZGVycy4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU1FMaXRlQ29udGVudEhlbHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIGFuIFNRTGl0ZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBBc3NldEZpbGVEZXNjcmlwdG9yIGZvciB0aGUKLSAgICAgKiBibG9iIGluIGNvbHVtbiAwIG9mIHRoZSBmaXJzdCByb3cuIElmIHRoZSBmaXJzdCBjb2x1bW4gZG9lcwotICAgICAqIG5vdCBjb250YWluIGEgYmxvYiwgYW4gdW5zcGVjaWZpZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYiBIYW5kbGUgdG8gYSByZWFkYWJsZSBkYXRhYmFzZS4KLSAgICAgKiBAcGFyYW0gc3FsIFNRTCBxdWVyeSwgcG9zc2libHkgd2l0aCBxdWVyeSBhcmd1bWVudHMuCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgUXVlcnkgYXJndW1lbnQgdmFsdWVzLCBvciB7QGNvZGUgbnVsbH0gZm9yIG5vIGFyZ3VtZW50LgotICAgICAqIEByZXR1cm4gSWYgbm8gZXhjZXB0aW9uIGlzIHRocm93biwgYSBub24tbnVsbCBBc3NldEZpbGVEZXNjcmlwdG9yIGlzIHJldHVybmVkLgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIElmIHRoZSBxdWVyeSByZXR1cm5zIG5vIHJlc3VsdHMgb3IgdGhlCi0gICAgICogICAgICAgICB2YWx1ZSBvZiBjb2x1bW4gMCBpcyBOVUxMLCBvciBpZiB0aGVyZSBpcyBhbiBlcnJvciBjcmVhdGluZyB0aGUKLSAgICAgKiAgICAgICAgIGFzc2V0IGZpbGUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFzc2V0RmlsZURlc2NyaXB0b3IgZ2V0QmxvYkNvbHVtbkFzQXNzZXRGaWxlKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsLAotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBzaW1wbGVRdWVyeUZvckJsb2JNZW1vcnlGaWxlKGRiLCBzcWwsIHNlbGVjdGlvbkFyZ3MpOwotICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIHJlc3VsdHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQXNzZXRGaWxlRGVzY3JpcHRvci5mcm9tTWVtb3J5RmlsZShmaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIGFuIFNRTGl0ZSBxdWVyeSBhbmQgcmV0dXJucyBhIE1lbW9yeUZpbGUgZm9yIHRoZQotICAgICAqIGJsb2IgaW4gY29sdW1uIDAgb2YgdGhlIGZpcnN0IHJvdy4gSWYgdGhlIGZpcnN0IGNvbHVtbiBkb2VzCi0gICAgICogbm90IGNvbnRhaW4gYSBibG9iLCBhbiB1bnNwZWNpZmllZCBleGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqCi0gICAgICogQHJldHVybiBBIG1lbW9yeSBmaWxlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHF1ZXJ5IHJldHVybnMgbm8gcmVzdWx0cwotICAgICAqICAgICAgICAgb3IgdGhlIHZhbHVlIGNvbHVtbiAwIGlzIE5VTEwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGVyZSBpcyBhbiBlcnJvciBjcmVhdGluZyB0aGUgbWVtb3J5IGZpbGUuCi0gICAgICovCi0gICAgLy8gVE9ETzogbWFrZSB0aGlzIG5hdGl2ZSBhbmQgdXNlIHRoZSBTUUxpdGUgYmxvYiBBUEkgdG8gcmVkdWNlIGNvcHlpbmcKLSAgICBwcml2YXRlIHN0YXRpYyBNZW1vcnlGaWxlIHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucmF3UXVlcnkoc3FsLCBzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY3Vyc29yLmdldEJsb2IoMCk7Ci0gICAgICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUobnVsbCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZpbGUud3JpdGVCeXRlcyhieXRlcywgMCwgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZpbGUuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCmluZGV4IGQ4ZGNhZjcuLmFiYTM3YTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKQEAgLTE2LDIxICsxNiwyMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwotCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwogCkBAIC00MiwzMiArNDEsMjkgQEAKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgU1FMaXRlQ3Vyc29yLgogICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3Vyc29yIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVDdXJzb3IiOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09VTlQgPSAtMTsKIAogICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZWRpdCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1FZGl0VGFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUVkaXRUYWJsZTsKIAogICAgIC8qKiBUaGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHJvd3MgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1Db2x1bW5zOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbUNvbHVtbnM7CiAKICAgICAvKiogVGhlIHF1ZXJ5IG9iamVjdCBmb3IgdGhlIGN1cnNvciAqLwogICAgIHByaXZhdGUgU1FMaXRlUXVlcnkgbVF1ZXJ5OwogCi0gICAgLyoqIFRoZSBkYXRhYmFzZSB0aGUgY3Vyc29yIHdhcyBjcmVhdGVkIGZyb20gKi8KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKLQogICAgIC8qKiBUaGUgY29tcGlsZWQgcXVlcnkgdGhpcyBjdXJzb3IgY2FtZSBmcm9tICovCi0gICAgcHJpdmF0ZSBTUUxpdGVDdXJzb3JEcml2ZXIgbURyaXZlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZUN1cnNvckRyaXZlciBtRHJpdmVyOwogCiAgICAgLyoqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY3Vyc29yICovCi0gICAgcHJpdmF0ZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CiAKICAgICAvKiogQSBtYXBwaW5nIG9mIGNvbHVtbiBuYW1lcyB0byBjb2x1bW4gaW5kaWNlcywgdG8gc3BlZWQgdXAgbG9va3VwcyAqLwogICAgIHByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gbUNvbHVtbk5hbWVNYXA7CiAKICAgICAvKiogVXNlZCB0byBmaW5kIG91dCB3aGVyZSBhIGN1cnNvciB3YXMgYWxsb2NhdGVkIGluIGNhc2UgaXQgbmV2ZXIgZ290IHJlbGVhc2VkLiAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIG1TdGFja1RyYWNlOworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIG1TdGFja1RyYWNlOwogICAgIAogICAgIC8qKiAKICAgICAgKiAgbU1heFJlYWQgaXMgdGhlIG1heCBpdGVtcyB0aGF0IGVhY2ggY3Vyc29yIHdpbmRvdyByZWFkcyAKQEAgLTc4LDYgKzc0LDExIEBACiAgICAgcHJpdmF0ZSBpbnQgbUN1cnNvclN0YXRlID0gMDsKICAgICBwcml2YXRlIFJlZW50cmFudExvY2sgbUxvY2sgPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0RhdGEgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYnkge0BsaW5rICNyZXF1ZXJ5KCl9IHRvIHJlbWVtYmVyIGZvciB3aGljaCBkYXRhYmFzZSB3ZSd2ZSBhbHJlYWR5IHNob3duIHRoZSB3YXJuaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBzQWxyZWFkeVdhcm5lZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKICAgICAKICAgICAvKioKICAgICAgKiAgc3VwcG9ydCBmb3IgYSBjdXJzb3IgdmFyaWFudCB0aGF0IGRvZXNuJ3QgYWx3YXlzIHJlYWQgYWxsIHJlc3VsdHMKQEAgLTEzNywxNCArMTM4LDIyIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtUXVlcnkuZmlsbFdpbmRvdyhjdywgbU1heFJlYWQsIG1Db3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiAtMSBtZWFucyBub3QgZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gZ2V0UXVlcnkoKS5maWxsV2luZG93KGN3LCBtTWF4UmVhZCwgbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIHRoZXJlIGlzIHN0aWxsIG1vcmUgZGF0YSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVzdWx0c2V0CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gTk9fQ09VTlQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudCArPSBtTWF4UmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlY2VpdmVkIC0xIGZyb20gbmF0aXZlX2ZpbGxfd2luZG93LiByZWFkICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudCArICIgcm93cyBzbyBmYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWNlaXZlZCBhbGwgZGF0YSBmcm9tIG5hdGl2ZV9maWxsX3dpbmRvdy4gcmVhZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgKyAiIHJvd3MuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMDIsMjQgKzIxMSw0NiBAQAogICAgICAqIGhhcyBwYWNrYWdlIHNjb3BlLgogICAgICAqCiAgICAgICogQHBhcmFtIGRiIGEgcmVmZXJlbmNlIHRvIGEgRGF0YWJhc2Ugb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBjb25zdHJ1Y3RlZAotICAgICAqICAgICBhbmQgb3BlbmVkCisgICAgICogICAgIGFuZCBvcGVuZWQuIFRoaXMgcGFyYW0gaXMgbm90IHVzZWQgYW55IGxvbmdlcgogICAgICAqIEBwYXJhbSBlZGl0VGFibGUgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHVzZWQgZm9yIHRoaXMgcXVlcnkKICAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIHJlc3Qgb2YgdGhlIHF1ZXJ5IHRlcm1zCiAgICAgICogICAgIGN1cnNvciBpcyBmaW5hbGl6ZWQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNTUUxpdGVDdXJzb3IoU1FMaXRlQ3Vyc29yRHJpdmVyLCBTdHJpbmcsIFNRTGl0ZVF1ZXJ5KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFNRTGl0ZUN1cnNvcihTUUxpdGVEYXRhYmFzZSBkYiwgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciwKICAgICAgICAgICAgIFN0cmluZyBlZGl0VGFibGUsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIHRoaXMoZHJpdmVyLCBlZGl0VGFibGUsIHF1ZXJ5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgcXVlcnkgYW5kIHByb3ZpZGUgYWNjZXNzIHRvIGl0cyByZXN1bHQgc2V0IHRocm91Z2ggYSBDdXJzb3IKKyAgICAgKiBpbnRlcmZhY2UuIEZvciBhIHF1ZXJ5IHN1Y2ggYXM6IHtAY29kZSBTRUxFQ1QgbmFtZSwgYmlydGgsIHBob25lIEZST00KKyAgICAgKiBteVRhYmxlIFdIRVJFIC4uLiBMSU1JVCAxLDIwIE9SREVSIEJZLi4ufSB0aGUgY29sdW1uIG5hbWVzIChuYW1lLCBiaXJ0aCwKKyAgICAgKiBwaG9uZSkgd291bGQgYmUgaW4gdGhlIHByb2plY3Rpb24gYXJndW1lbnQgYW5kIGV2ZXJ5dGhpbmcgZnJvbQorICAgICAqIHtAY29kZSBGUk9NfSBvbndhcmQgd291bGQgYmUgaW4gdGhlIHBhcmFtcyBhcmd1bWVudC4gVGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIGhhcyBwYWNrYWdlIHNjb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIGVkaXRUYWJsZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdXNlZCBmb3IgdGhpcyBxdWVyeQorICAgICAqIEBwYXJhbSBxdWVyeSB0aGUge0BsaW5rIFNRTGl0ZVF1ZXJ5fSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY3Vyc29yIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMaXRlQ3Vyc29yKFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIsIFN0cmluZyBlZGl0VGFibGUsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CiAgICAgICAgIC8vIFRoZSBBYnN0cmFjdEN1cnNvciBjb25zdHJ1Y3RvciBuZWVkcyB0byBkbyBzb21lIHNldHVwLgogICAgICAgICBzdXBlcigpOworICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgb2JqZWN0IGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5Lm1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeS5tRGF0YWJhc2UgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQogICAgICAgICBtU3RhY2tUcmFjZSA9IG5ldyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpLmZpbGxJblN0YWNrVHJhY2UoKTsKLSAgICAgICAgbURhdGFiYXNlID0gZGI7CiAgICAgICAgIG1Ecml2ZXIgPSBkcml2ZXI7CiAgICAgICAgIG1FZGl0VGFibGUgPSBlZGl0VGFibGU7CiAgICAgICAgIG1Db2x1bW5OYW1lTWFwID0gbnVsbDsKICAgICAgICAgbVF1ZXJ5ID0gcXVlcnk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgIHF1ZXJ5Lm1EYXRhYmFzZS5sb2NrKCk7CiAKICAgICAgICAgICAgIC8vIFNldHVwIHRoZSBsaXN0IG9mIGNvbHVtbnMKICAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCA9IG1RdWVyeS5jb2x1bW5Db3VudExvY2tlZCgpOwpAQCAtMjQwLDcgKzI3MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICBxdWVyeS5tRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0OCw3ICsyNzksOSBAQAogICAgICAqIEByZXR1cm4gdGhlIFNRTGl0ZURhdGFiYXNlIHRoYXQgdGhpcyBjdXJzb3IgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVF1ZXJ5Lm1EYXRhYmFzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjg0LDEzICszMTcsMjcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVdpbmRvdy5zZXRTdGFydFBvc2l0aW9uKHN0YXJ0UG9zKTsKLSAgICAgICAgbUNvdW50ID0gbVF1ZXJ5LmZpbGxXaW5kb3cobVdpbmRvdywgbUluaXRpYWxSZWFkLCAwKTsKLSAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIG5vdCBmaW5pc2hlZAotICAgICAgICBpZiAobUNvdW50ID09IE5PX0NPVU5UKXsKKyAgICAgICAgaW50IGNvdW50ID0gZ2V0UXVlcnkoKS5maWxsV2luZG93KG1XaW5kb3csIG1Jbml0aWFsUmVhZCwgMCk7CisgICAgICAgIC8vIHJldHVybiAtMSBtZWFucyB0aGVyZSBpcyBzdGlsbCBtb3JlIGRhdGEgdG8gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlc3VsdHNldAorICAgICAgICBpZiAoY291bnQgPT0gTk9fQ09VTlQpewogICAgICAgICAgICAgbUNvdW50ID0gc3RhcnRQb3MgKyBtSW5pdGlhbFJlYWQ7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVjZWl2ZWQgLTEgZnJvbSBuYXRpdmVfZmlsbF93aW5kb3cuIHJlYWQgIiArIG1Db3VudCArICIgcm93cyBzbyBmYXIiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUXVlcnlUaHJlYWQobUN1cnNvclN0YXRlKSwgInF1ZXJ5IHRocmVhZCIpOwogICAgICAgICAgICAgdC5zdGFydCgpOwotICAgICAgICB9IAorICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0UG9zID09IDApIHsgLy8gbmF0aXZlX2ZpbGxfd2luZG93IHJldHVybnMgY291bnQoKikgb25seSBmb3Igc3RhcnRQb3MgPSAwCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVjZWl2ZWQgY291bnQoKikgZnJvbSBuYXRpdmVfZmlsbF93aW5kb3c6ICIgKyBjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ291bnQgPSBjb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChtQ291bnQgPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY291bnQgc2hvdWxkIG5ldmVyIGJlIG5vbi16ZXJvIG5lZ2F0aXZlIG51bWJlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1FMaXRlUXVlcnkgZ2V0UXVlcnkoKSB7CisgICAgICAgIHJldHVybiBtUXVlcnk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zMjIsMTY2ICszNjksMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICAvLyBPbmx5IGFsbG93IGRlbGV0ZXMgaWYgdGhlcmUgaXMgYW4gSUQgY29sdW1uLCBhbmQgdGhlIElEIGhhcyBiZWVuIHJlYWQgZnJvbSBpdAotICAgICAgICBpZiAobVJvd0lkQ29sdW1uSW5kZXggPT0gLTEgfHwgbUN1cnJlbnRSb3dJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVsZXRlIHJvdyBiZWNhdXNlIGVpdGhlciB0aGUgcm93IElEIGNvbHVtbiBpcyBub3QgYXZhaWxhYmxlIG9yIGl0IiArCi0gICAgICAgICAgICAgICAgICAgICJoYXMgbm90IGJlZW4gcmVhZC4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBFbnN1cmUgd2UgZG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgZGF0YWJhc2Ugd2hlbiBhbm90aGVyCi0gICAgICAgICAqIHRocmVhZCBpcyBob2xkaW5nIHRoZSBkYXRhYmFzZSBsb2NrLiByZXF1ZXJ5KCkgYW5kIG1vdmVUbygpIGFyZSBhbHNvCi0gICAgICAgICAqIHN5bmNocm9uaXplZCBoZXJlIHRvIG1ha2Ugc3VyZSB0aGV5IGdldCB0aGUgc3RhdGUgb2YgdGhlIGRhdGFiYXNlCi0gICAgICAgICAqIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgREVMRVRFLgotICAgICAgICAgKi8KLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShtRWRpdFRhYmxlLCBtQ29sdW1uc1ttUm93SWRDb2x1bW5JbmRleF0gKyAiPT8iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHttQ3VycmVudFJvd0lELnRvU3RyaW5nKCl9KTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcG9zID0gbVBvczsKLSAgICAgICAgICAgIHJlcXVlcnkoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEVuc3VyZSBwcm9wZXIgY3Vyc29yIHN0YXRlLiBOb3RlIHRoYXQgbUN1cnJlbnRSb3dJRCBjaGFuZ2VzCi0gICAgICAgICAgICAgKiBpbiB0aGlzIGNhbGwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1vdmVUb1Bvc2l0aW9uKHBvcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKICAgICAgICAgcmV0dXJuIG1Db2x1bW5zOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zdXBwb3J0c1VwZGF0ZXMoKSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkobUVkaXRUYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLAotICAgICAgICAgICAgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IGFkZGl0aW9uYWxWYWx1ZXMpIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1VwZGF0ZXMoKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiY29tbWl0VXBkYXRlcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgY3Vyc29yLCBkaWQgeW91ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiaW5jbHVkZSB0aGUgX2lkIGNvbHVtbj8iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFByZXZlbnQgb3RoZXIgdGhyZWFkcyBmcm9tIGNoYW5naW5nIHRoZSB1cGRhdGVkIHJvd3Mgd2hpbGUgdGhleSdyZQotICAgICAgICAgKiBiZWluZyBwcm9jZXNzZWQgaGVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHN5bmNocm9uaXplZCAobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoYWRkaXRpb25hbFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLnB1dEFsbChhZGRpdGlvbmFsVmFsdWVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1VcGRhdGVkUm93cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUHJldmVudCBvdGhlciB0aHJlYWRzIGZyb20gY2hhbmdpbmcgdGhlIGRhdGFiYXNlIHN0YXRlIHdoaWxlCi0gICAgICAgICAgICAgKiB3ZSBwcm9jZXNzIHRoZSB1cGRhdGVkIHJvd3MsIGFuZCBwcmV2ZW50cyB1cyBmcm9tIGNoYW5naW5nIHRoZQotICAgICAgICAgICAgICogZGF0YWJhc2UgYmVoaW5kIHRoZSBiYWNrIG9mIGFub3RoZXIgdGhyZWFkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCByb3cgdGhhdCBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gcm93RW50cnkgOgotICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMgPSByb3dFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBMb25nIHJvd0lkT2JqID0gcm93RW50cnkuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0lkT2JqID09IG51bGwgfHwgdmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgcm93SWQgb3IgdmFsdWVzIGZvdW5kISByb3dJZCA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3dJZE9iaiArICIsIHZhbHVlcyA9ICIgKyB2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gcm93SWRPYmoubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzSXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgICAgICBzcWwuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCJVUERBVEUgIiArIG1FZGl0VGFibGUgKyAiIFNFVCAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBjb2x1bW4gdmFsdWUgdGhhdCBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGJpbmRpbmdzID0gbmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSB2YWx1ZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiPT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzW2ldID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIgV0hFUkUgIiArIG1Db2x1bW5zW21Sb3dJZENvbHVtbkluZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJz0nICsgcm93SWQpOwotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKHNxbC50b1N0cmluZygpLCBiaW5kaW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5yb3dVcGRhdGVkKG1FZGl0VGFibGUsIHJvd0lkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMZXQgYW55IGNoYW5nZSBvYnNlcnZlcnMga25vdyBhYm91dCB0aGUgdXBkYXRlCi0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBkZWFjdGl2YXRlQ29tbW9uKCkgewogICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KFRBRywgIjw8PCBSZWxlYXNpbmcgY3Vyc29yICIgKyB0aGlzKTsKICAgICAgICAgbUN1cnNvclN0YXRlID0gMDsKQEAgLTUwMiw5ICszOTQsMzQgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKICAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgZGVhY3RpdmF0ZUNvbW1vbigpOwotICAgICAgICBtUXVlcnkuY2xvc2UoKTsKLSAgICAgICAgbURyaXZlci5jdXJzb3JDbG9zZWQoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBkZWFjdGl2YXRlQ29tbW9uKCk7CisgICAgICAgICAgICBtUXVlcnkuY2xvc2UoKTsKKyAgICAgICAgICAgIG1Ecml2ZXIuY3Vyc29yQ2xvc2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IGEgd2FybmluZyBhZ2FpbnN0IHRoZSB1c2Ugb2YgcmVxdWVyeSgpIGlmIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICogVGhpcyB3YXJuaW5nIGlzIHNob3duIHBlciBkYXRhYmFzZSBwZXIgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FybklmVWlUaHJlYWQoKSB7CisgICAgICAgIGlmIChMb29wZXIuZ2V0TWFpbkxvb3BlcigpID09IExvb3Blci5teUxvb3BlcigpKSB7CisgICAgICAgICAgICBTdHJpbmcgZGF0YWJhc2VQYXRoID0gZ2V0UXVlcnkoKS5tRGF0YWJhc2UuZ2V0UGF0aCgpOworICAgICAgICAgICAgLy8gV2Ugc2hvdyB0aGUgd2FybmluZyBvbmNlIHBlciBkYXRhYmFzZSBpbiBvcmRlciBub3QgdG8gc3BhbSBsb2djYXQuCisgICAgICAgICAgICBpZiAoIXNBbHJlYWR5V2FybmVkLmNvbnRhaW5zS2V5KGRhdGFiYXNlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBzQWxyZWFkeVdhcm5lZC5wdXQoZGF0YWJhc2VQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gU1RPUFNISVAgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAgICAgICAgIHQgPSBuZXcgUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24ocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgIC8vIEVORCBTVE9QU0hJUAorICAgICAgICAgICAgICAgIFN0cmluZyBzID0gcGFja2FnZU5hbWUgPT0gbnVsbCA/ICIndW5rbm93biciIDogcGFja2FnZU5hbWU7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvdWxkIG5vdCBhdHRlbXB0IHJlcXVlcnkgb24gbWFpbiAoVUkpIHRocmVhZDogYXBwID0gIiArIHMgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAoZGF0YWJhc2U6ICIgKyBtUXVlcnkubURhdGFiYXNlLmdldFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBxdWVyeTogIiArIG1RdWVyeS5tU3FsICsgIikiLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNTEyLDIwICs0MjksMzAgQEAKICAgICAgICAgaWYgKGlzQ2xvc2VkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgICAgICB3YXJuSWZVaVRocmVhZCgpOwogICAgICAgICBsb25nIHRpbWVTdGFydCA9IDA7CiAgICAgICAgIGlmIChDb25maWcuTE9HVikgewogICAgICAgICAgICAgdGltZVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3luY2hyb25pemUgb24gdGhlIGRhdGFiYXNlIGxvY2sgdG8gZW5zdXJlIHRoYXQgbUNvdW50IG1hdGNoZXMgdGhlCi0gICAgICAgICAqIHJlc3VsdHMgb2YgbVF1ZXJ5LnJlcXVlcnkoKS4KLSAgICAgICAgICovCi0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVdpbmRvdy5jbGVhcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBvcyA9IC0xOworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtUXVlcnkubURhdGFiYXNlLmdldERhdGFiYXNlSGFuZGxlKG1RdWVyeS5tU3FsKTsKKyAgICAgICAgICAgIGlmICghZGIuZXF1YWxzKG1RdWVyeS5tRGF0YWJhc2UpKSB7CisgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgbmVlZCB0byB1c2UgYSBkaWZmZXJlbnQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUsCisgICAgICAgICAgICAgICAgLy8gcmUtY29tcGlsZSB0aGUgcXVlcnkKKyAgICAgICAgICAgICAgICBkYi5sb2NrKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIG9sZCBtUXVlcnkgb2JqZWN0IGFuZCBvcGVuIGEgbmV3IG9uZQorICAgICAgICAgICAgICAgICAgICBtUXVlcnkuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVF1ZXJ5ID0gbmV3IFNRTGl0ZVF1ZXJ5KGRiLCBtUXVlcnkpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGRiLnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRoaXMgb25lIHdpbGwgcmVjcmVhdGUgdGhlIHRlbXAgdGFibGUsIGFuZCBnZXQgaXRzIGNvdW50CiAgICAgICAgICAgICBtRHJpdmVyLmN1cnNvclJlcXVlcmllZCh0aGlzKTsKICAgICAgICAgICAgIG1Db3VudCA9IE5PX0NPVU5UOwpAQCAtNTM2LDggKzQ2Myw2IEBACiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHF1ZXJ5VGhyZWFkVW5sb2NrKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIHsKQEAgLTU4Nyw3ICs1MTIsNyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gbVF1ZXJ5Lm1TcWwubGVuZ3RoKCk7CiAgICAgICAgICAgICAgICAgICAgIFN0cmljdE1vZGUub25TcWxpdGVPYmplY3RMZWFrZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAiRmluYWxpemluZyBhIEN1cnNvciB0aGF0IGhhcyBub3QgYmVlbiBkZWFjdGl2YXRlZCBvciBjbG9zZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFiYXNlID0gIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiLCB0YWJsZSA9ICIgKyBtRWRpdFRhYmxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhYmFzZSA9ICIgKyBtUXVlcnkubURhdGFiYXNlLmdldFBhdGgoKSArICIsIHRhYmxlID0gIiArIG1FZGl0VGFibGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcXVlcnkgPSAiICsgbVF1ZXJ5Lm1TcWwuc3Vic3RyaW5nKDAsIChsZW4gPiAxMDApID8gMTAwIDogbGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFja1RyYWNlKTsKICAgICAgICAgICAgICAgICB9CkBAIC01OTUsNyArNTIwLDcgQEAKICAgICAgICAgICAgICAgICBTUUxpdGVEZWJ1Zy5ub3RpZnlBY3RpdmVDdXJzb3JGaW5hbGl6ZWQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkZpbmFsaXppbmcgY3Vyc29yIG9uIGRhdGFiYXNlID0gIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJGaW5hbGl6aW5nIGN1cnNvciBvbiBkYXRhYmFzZSA9ICIgKyBtUXVlcnkubURhdGFiYXNlLmdldFBhdGgoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgdGFibGUgPSAiICsgbUVkaXRUYWJsZSArICIsIHF1ZXJ5ID0gIiArIG1RdWVyeS5tU3FsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC02MDMsNCArNTI4LDExIEBACiAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogdGhpcyBpcyBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldE1Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db3VudDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yRHJpdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yRHJpdmVyLmphdmEKaW5kZXggZWRhMWI3OC4uYjM5NjNmOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvckRyaXZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YQpAQCAtNDAsOCArNDAsNiBAQAogCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGEgU1FMaXRlQ3Vyc29yIHdoZW4gaXQgaXMgcmVxdWVyeWVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG5ldyBjb3VudCB2YWx1ZS4KICAgICAgKi8KICAgICB2b2lkIGN1cnNvclJlcXVlcmllZChDdXJzb3IgY3Vyc29yKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YQppbmRleCBjZGM5YmJiLi4wZTkyMWU5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YQpAQCAtMTYsMTYgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQXBwR2xvYmFsczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEZWJ1Zy5EYlN0YXRzOwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CitpbXBvcnQgYW5kcm9pZC5vcy5TdGF0RnM7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTM4LDE1ICszOCwxMyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwpAQCAtNjcsNyArNjUsNyBAQAogICogaXMgdGhlIFVuaWNvZGUgQ29sbGF0aW9uIEFsZ29yaXRobSBhbmQgbm90IHRhaWxvcmVkIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KICAqLwogcHVibGljIGNsYXNzIFNRTGl0ZURhdGFiYXNlIGV4dGVuZHMgU1FMaXRlQ2xvc2FibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU1FMaXRlRGF0YWJhc2UiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQl9PUEVSQVRJT04gPSA1MjAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREJfQ09SUlVQVCA9IDc1MDA0OwogCkBAIC0xOTIsNiArMTkwLDExIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIG1UcmFuc2FjdGlvbkxpc3RlbmVyOwogCisgICAgLyoqCisgICAgICogdGhpcyBtZW1iZXIgaXMgc2V0IGlmIHtAbGluayAjZXhlY1NRTChTdHJpbmcpfSBpcyB1c2VkIHRvIGJlZ2luIGFuZCBlbmQgdHJhbnNhY3Rpb25zLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWw7CisKICAgICAvKiogU3luY2hyb25pemUgb24gdGhpcyB3aGVuIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UgKi8KICAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgbUxvY2sgPSBuZXcgUmVlbnRyYW50TG9jayh0cnVlKTsKIApAQCAtMjMzLDk0ICsyMzYsMTM4IEBACiAgICAgLy8gbG9jayBhY3F1aXN0aW9ucyBvZiB0aGUgZGF0YWJhc2UuCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9MT0NLX0xPR19QUkVGSVggPSAiR0VUTE9DSzoiOwogCi0gICAgLyoqIFVzZWQgYnkgbmF0aXZlIGNvZGUsIGRvIG5vdCByZW5hbWUgKi8KLSAgICAvKiBwYWNrYWdlICovIGludCBtTmF0aXZlSGFuZGxlID0gMDsKKyAgICAvKiogVXNlZCBieSBuYXRpdmUgY29kZSwgZG8gbm90IHJlbmFtZS4gbWFrZSBpdCB2b2xhdGlsZSwgc28gaXQgaXMgdGhyZWFkLXNhZmUuICovCisgICAgLyogcGFja2FnZSAqLyB2b2xhdGlsZSBpbnQgbU5hdGl2ZUhhbmRsZSA9IDA7CiAKLSAgICAvKiogVXNlZCB0byBtYWtlIHRlbXAgdGFibGUgbmFtZXMgdW5pcXVlICovCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbVRlbXBUYWJsZVNlcXVlbmNlID0gMDsKKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGEgYmxvY2sgb24gIi9kYXRhIi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVW5peAorICAgICAqIHN0YXRmcy5mX2JzaXplIGZpZWxkLiBub3RlIHRoYXQgdGhpcyBmaWVsZCBpcyBsYXppbHkgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNCbG9ja1NpemUgPSAwOwogCiAgICAgLyoqIFRoZSBwYXRoIGZvciB0aGUgZGF0YWJhc2UgZmlsZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYXRoOwogCiAgICAgLyoqIFRoZSBhbm9ueW1pemVkIHBhdGggZm9yIHRoZSBkYXRhYmFzZSBmaWxlIGZvciBsb2dnaW5nIHB1cnBvc2VzICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhdGhGb3JMb2dzID0gbnVsbDsgIC8vIGxhemlseSBwb3B1bGF0ZWQKIAogICAgIC8qKiBUaGUgZmxhZ3MgcGFzc2VkIHRvIG9wZW4vY3JlYXRlICovCi0gICAgcHJpdmF0ZSBpbnQgbUZsYWdzOworICAgIHByaXZhdGUgZmluYWwgaW50IG1GbGFnczsKIAogICAgIC8qKiBUaGUgb3B0aW9uYWwgZmFjdG9yeSB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgQ3Vyc29ycyAqLwotICAgIHByaXZhdGUgQ3Vyc29yRmFjdG9yeSBtRmFjdG9yeTsKKyAgICBwcml2YXRlIGZpbmFsIEN1cnNvckZhY3RvcnkgbUZhY3Rvcnk7CiAKLSAgICBwcml2YXRlIFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+IG1Qcm9ncmFtczsKKyAgICBwcml2YXRlIGZpbmFsIFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+IG1Qcm9ncmFtczsKIAogICAgIC8qKgotICAgICAqIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGEgY2FjaGUgaXMgbWFpbnRhaW5lZCB0byBzdG9yZQorICAgICAqIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGEgTFJVIGNhY2hlIGlzIG1haW50YWluZWQgdG8gc3RvcmUKICAgICAgKiB0aGUgY29tcGlsZWQgcXVlcnkgc3RhdGVtZW50IGlkcyByZXR1cm5lZCBieSBzcWxpdGUgZGF0YWJhc2UuCi0gICAgICogICAgIGtleSA9IHNxbCBzdGF0ZW1lbnQgd2l0aCAiPyIgZm9yIGJpbmQgYXJncworICAgICAqICAgICBrZXkgPSBTUUwgc3RhdGVtZW50IHdpdGggIj8iIGZvciBiaW5kIGFyZ3MKICAgICAgKiAgICAgdmFsdWUgPSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9CiAgICAgICogSWYgYW4gYXBwbGljYXRpb24gb3BlbnMgdGhlIGRhdGFiYXNlIGFuZCBrZWVwcyBpdCBvcGVuIGR1cmluZyBpdHMgZW50aXJlIGxpZmUsIHRoZW4KLSAgICAgKiB0aGVyZSB3aWxsIG5vdCBiZSBhbiBvdmVyaGVhZCBvZiBjb21waWxhdGlvbiBvZiBzcWwgc3RhdGVtZW50cyBieSBzcWxpdGUuCisgICAgICogdGhlcmUgd2lsbCBub3QgYmUgYW4gb3ZlcmhlYWQgb2YgY29tcGlsYXRpb24gb2YgU1FMIHN0YXRlbWVudHMgYnkgc3FsaXRlLgogICAgICAqCiAgICAgICogd2h5IGlzIHRoaXMgY2FjaGUgTk9UIHN0YXRpYz8gYmVjYXVzZSBzcWxpdGUgYXR0YWNoZXMgY29tcGlsZWRzcWwgc3RhdGVtZW50cyB0byB0aGUKICAgICAgKiBzdHJ1Y3QgY3JlYXRlZCB3aGVuIHtAbGluayBTUUxpdGVEYXRhYmFzZSNvcGVuRGF0YWJhc2UoU3RyaW5nLCBDdXJzb3JGYWN0b3J5LCBpbnQpfSBpcwogICAgICAqIGludm9rZWQuCiAgICAgICoKICAgICAgKiB0aGlzIGNhY2hlIGhhcyBhbiB1cHBlciBsaW1pdCBvZiBtTWF4U3FsQ2FjaGVTaXplIChzZXR0YWJsZSBieSBjYWxsaW5nIHRoZSBtZXRob2QKLSAgICAgKiAoQGxpbmsgc2V0TWF4Q2FjaGVTaXplKGludCl9KS4gaXRzIGRlZmF1bHQgaXMgMCAtIGkuZS4sIG5vIGNhY2hpbmcgYnkgZGVmYXVsdCBiZWNhdXNlCi0gICAgICogbW9zdCBvZiB0aGUgYXBwcyBkb24ndCB1c2UgIj8iIHN5bnRheCBpbiB0aGVpciBzcWwsIGNhY2hpbmcgaXMgbm90IHVzZWZ1bCBmb3IgdGhlbS4KKyAgICAgKiAoQGxpbmsgI3NldE1heFNxbENhY2hlU2l6ZShpbnQpfSkuCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBNYXA8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gbUNvbXBpbGVkUXVlcmllcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIC8vIGRlZmF1bHQgc3RhdGVtZW50LWNhY2hlIHNpemUgcGVyIGRhdGFiYXNlIGNvbm5lY3Rpb24gKCA9IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MpCisgICAgcHJpdmF0ZSBpbnQgbU1heFNxbENhY2hlU2l6ZSA9IDI1OworICAgIC8vIGd1YXJkZWQgYnkgaXRzZWxmCisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBNYXA8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gbUNvbXBpbGVkUXVlcmllcyA9CisgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+KG1NYXhTcWxDYWNoZVNpemUgKyAxLCAwLjc1ZiwgdHJ1ZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnk8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gZWxkZXN0KSB7CisgICAgICAgICAgICAgICAgLy8gZWxkZXN0ID0gbGVhc3QtcmVjZW50bHkgdXNlZCBlbnRyeQorICAgICAgICAgICAgICAgIC8vIGlmIGl0IG5lZWRzIHRvIGJlIHJlbW92ZWQgdG8gYWNjb21tb2RhdGUgYSBuZXcgZW50cnksCisgICAgICAgICAgICAgICAgLy8gICAgIGNsb3NlIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gcmVwcmVzZW50ZWQgYnkgdGhpcyBlbnRyeSwgaWYgbm90IGluIHVzZQorICAgICAgICAgICAgICAgIC8vICAgICBhbmQgdGhlbiBsZXQgaXQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBNYXAuCisgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGlzIGlzIGNhbGxlZCwgdGhlIGNhbGxlciBtdXN0IGJlIHRyeWluZyB0byBhZGQgYSBqdXN0LWNvbXBpbGVkIHN0bXQKKyAgICAgICAgICAgICAgICAvLyB0byBjYWNoZTsgaS5lLiwgY2FsbGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgYWNxdWlyZWQgZGF0YWJhc2UgbG9jayBBTkQKKyAgICAgICAgICAgICAgICAvLyB0aGUgbG9jayBvbiBtQ29tcGlsZWRRdWVyaWVzLiBkbyBhcyBhc3NlcnQgb2YgdGhlc2UgdHdvIDIgZmFjdHMuCisgICAgICAgICAgICAgICAgdmVyaWZ5TG9ja093bmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSgpIDw9IG1NYXhTcWxDYWNoZVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgbm90IGZ1bGwuIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNhY2hlIGlzIGZ1bGwuIGVsZGVzdCB3aWxsIGJlIHJlbW92ZWQuCisgICAgICAgICAgICAgICAgZWxkZXN0LmdldFZhbHVlKCkucmVsZWFzZUlmTm90SW5Vc2UoKTsKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSwgc28gdGhhdCB0aGlzIGVudHJ5IGlzIHJlbW92ZWQgYXV0b21hdGljYWxseSBieSB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OwogICAgIC8qKgotICAgICAqIEBoaWRlCisgICAgICogYWJzb2x1dGUgbWF4IHZhbHVlIHRoYXQgY2FuIGJlIHNldCBieSB7QGxpbmsgI3NldE1heFNxbENhY2hlU2l6ZShpbnQpfQorICAgICAqIHNpemUgb2YgZWFjaCBwcmVwYXJlZC1zdGF0ZW1lbnQgaXMgYmV0d2VlbiAxSyAtIDZLLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBsZXhpdHkgb2YgdGhlCisgICAgICogU1FMIHN0YXRlbWVudCAmIHNjaGVtYS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU1FMX0NBQ0hFX1NJWkUgPSAyNTA7Ci0gICAgcHJpdmF0ZSBpbnQgbU1heFNxbENhY2hlU2l6ZSA9IE1BWF9TUUxfQ0FDSEVfU0laRTsgLy8gbWF4IGNhY2hlIHNpemUgcGVyIERhdGFiYXNlIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBpbnQgbUNhY2hlRnVsbFdhcm5pbmdzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTiA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NRTF9DQUNIRV9TSVpFID0gMTAwOworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FjaGVGdWxsV2FybmluZzsKIAotICAgIC8qKiBtYWludGFpbiBzdGF0cyBhYm91dCBudW1iZXIgb2YgY2FjaGUgaGl0cyBhbmQgbWlzc2VzICovCisgICAgLyoqIE51bWJlciBvZiBjYWNoZSBoaXRzIG9uIHRoaXMgZGF0YWJhc2UgY29ubmVjdGlvbi4gZ3VhcmRlZCBieSB7QGxpbmsgI21Db21waWxlZFF1ZXJpZXN9LiAqLwogICAgIHByaXZhdGUgaW50IG1OdW1DYWNoZUhpdHM7CisgICAgLyoqIE51bWJlciBvZiBjYWNoZSBtaXNzZXMgb24gdGhpcyBkYXRhYmFzZSBjb25uZWN0aW9uLiBndWFyZGVkIGJ5IHtAbGluayAjbUNvbXBpbGVkUXVlcmllc30uICovCiAgICAgcHJpdmF0ZSBpbnQgbU51bUNhY2hlTWlzc2VzOwogCi0gICAgLyoqIHRoZSBmb2xsb3dpbmcgMiBtZW1iZXJzIG1haW50YWluIHRoZSB0aW1lIHdoZW4gYSBkYXRhYmFzZSBpcyBvcGVuZWQgYW5kIGNsb3NlZCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1UaW1lT3BlbmVkID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtVGltZUNsb3NlZCA9IG51bGw7Ci0KICAgICAvKiogVXNlZCB0byBmaW5kIG91dCB3aGVyZSB0aGlzIG9iamVjdCB3YXMgY3JlYXRlZCBpbiBjYXNlIGl0IG5ldmVyIGdvdCBjbG9zZWQuICovCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgbVN0YWNrVHJhY2UgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIG1TdGFja1RyYWNlOwogCiAgICAgLy8gU3lzdGVtIHByb3BlcnR5IHRoYXQgZW5hYmxlcyBsb2dnaW5nIG9mIHNsb3cgcXVlcmllcy4gU3BlY2lmeSB0aGUgdGhyZXNob2xkIGluIG1zLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfU0xPV19RVUVSSUVTX1BST1BFUlRZID0gImRiLmxvZy5zbG93X3F1ZXJ5X3RocmVzaG9sZCI7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNsb3dRdWVyeVRocmVzaG9sZDsKIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbG9zYWJsZQorICAgIC8qKiBzdG9yZXMgdGhlIGxpc3Qgb2Ygc3RhdGVtZW50IGlkcyB0aGF0IG5lZWQgdG8gYmUgZmluYWxpemVkIGJ5IHNxbGl0ZSAqLworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1DbG9zZWRTdGF0ZW1lbnRJZHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisKKyAgICAvKioge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gU1FMaXRlIHJldHVybnMgYW55IG9mIHRoZSBmb2xsb3dpbmcgZXJyb3JzCisgICAgICogICAgQ29ycnVwdGlvbgorICAgICAqICovCisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUVycm9ySGFuZGxlciBtRXJyb3JIYW5kbGVyOworCisgICAgLyoqIFRoZSBEYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wge0BsaW5rIERhdGFiYXNlQ29ubmVjdGlvblBvb2x9LgorICAgICAqIFZpc2liaWxpdHkgaXMgcGFja2FnZS1wcml2YXRlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBvdGhlcndpc2UsIHByaXZhdGUgdmlzaWJpbGl0eSBpcyBlbm91Z2guCiAgICAgICovCi0gICAgdm9pZCBhZGRTUUxpdGVDbG9zYWJsZShTUUxpdGVDbG9zYWJsZSBjbG9zYWJsZSkgewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtUHJvZ3JhbXMucHV0KGNsb3NhYmxlLCBudWxsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgLyogcGFja2FnZSAqLyB2b2xhdGlsZSBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIG1Db25uZWN0aW9uUG9vbCA9IG51bGw7CisKKyAgICAvKiogRWFjaCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSBpbiB0aGUgcG9vbCBpcyBhc3NpZ25lZCBhIG51bWJlciAxLi5OLCB3aGVyZSBOIGlzIHRoZQorICAgICAqIHNpemUgb2YgdGhlIGNvbm5lY3Rpb24gcG9vbC4KKyAgICAgKiBUaGUgbWFpbiBjb25uZWN0aW9uIGhhbmRsZSB0byB3aGljaCB0aGUgcG9vbCBpcyBhdHRhY2hlZCBpcyBhc3NpZ25lZCBhIHZhbHVlIG9mIDAuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBzaG9ydCBtQ29ubmVjdGlvbk51bTsKKworICAgIC8qKiBvbiBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbnMsIHRoaXMgbWVtYmVyIHBvaW50cyB0byB0aGUgcGFyZW50ICggPSBtYWluKQorICAgICAqIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlLgorICAgICAqIHBhY2thZ2UgdmlzaWJpbGl0eSBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBtUGFyZW50Q29ubk9iaiA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNT1JZX0RCX1BBVEggPSAiOm1lbW9yeToiOworCisgICAgLyoqIHNldCB0byB0cnVlIGlmIHRoZSBkYXRhYmFzZSBoYXMgYXR0YWNoZWQgZGF0YWJhc2VzICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1IYXNBdHRhY2hlZERicyA9IGZhbHNlOworCisgICAgLyoqIHN0b3JlcyByZWZlcmVuY2UgdG8gYWxsIGRhdGFiYXNlcyBvcGVuZWQgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+IG1BY3RpdmVEYXRhYmFzZXMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4oKTsKKworICAgIHN5bmNocm9uaXplZCB2b2lkIGFkZFNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7CisgICAgICAgIC8vIG1Qcm9ncmFtcyBpcyBwZXIgaW5zdGFuY2Ugb2YgU1FMaXRlRGF0YWJhc2UgYW5kIGl0IGRvZXNuJ3QgYWN0dWFsbHkgdG91Y2ggdGhlIGRhdGFiYXNlCisgICAgICAgIC8vIGl0c2VsZi4gc28sIHRoZXJlIGlzIG5vIG5lZWQgdG8gbG9jaygpLgorICAgICAgICBtUHJvZ3JhbXMucHV0KGNsb3NhYmxlLCBudWxsKTsKICAgICB9CiAKLSAgICB2b2lkIHJlbW92ZVNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Qcm9ncmFtcy5yZW1vdmUoY2xvc2FibGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTUUxpdGVDbG9zYWJsZShTUUxpdGVDbG9zYWJsZSBjbG9zYWJsZSkgeworICAgICAgICBtUHJvZ3JhbXMucmVtb3ZlKGNsb3NhYmxlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpIHsKICAgICAgICAgaWYgKGlzT3BlbigpKSB7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVDbG9zZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYmNsb3NlKCk7CisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2Ugd2hpY2ggd2lsbCBjbG9zZSBhbGwgcGVuZGluZyBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZCBhbHNvCisgICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTAsMTkgKzM5Nyw4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NraW5nRW5hYmxlZCA9IHRydWU7CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgb25Db3JydXB0aW9uKCkgewotICAgICAgICBMb2cuZShUQUcsICJSZW1vdmluZyBjb3JydXB0IGRhdGFiYXNlOiAiICsgbVBhdGgpOwogICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UX0RCX0NPUlJVUFQsIG1QYXRoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkYXRhYmFzZSAoaWYgd2UgY2FuKSwgd2hpY2ggd2lsbCBjYXVzZSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgdG8gZmFpbC4KLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBEZWxldGUgdGhlIGNvcnJ1cHQgZmlsZS4gIERvbid0IHJlLWNyZWF0ZSBpdCBub3cgLS0gdGhhdCB3b3VsZCBqdXN0IGNvbmZ1c2UgcGVvcGxlCi0gICAgICAgICAgICAvLyAtLSBidXQgdGhlIG5leHQgdGltZSBzb21lb25lIHRyaWVzIHRvIG9wZW4gaXQsIHRoZXkgY2FuIHNldCBpdCB1cCBmcm9tIHNjcmF0Y2guCi0gICAgICAgICAgICBpZiAoIW1QYXRoLmVxdWFsc0lnbm9yZUNhc2UoIjptZW1vcnkiKSkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpcyBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlIGZpbGVzCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUobVBhdGgpLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1FcnJvckhhbmRsZXIub25Db3JydXB0aW9uKHRoaXMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzc0LDcgKzQxMCwxNiBAQAogICAgICAqIEBzZWUgI3VubG9jaygpCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGxvY2soKSB7Ci0gICAgICAgIGlmICghbUxvY2tpbmdFbmFibGVkKSByZXR1cm47CisgICAgICAgIGxvY2soZmFsc2UpOworICAgIH0KKyAgICBwcml2YXRlIHZvaWQgbG9jayhib29sZWFuIGZvcmNlZCkgeworICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyBtZXRob2QgaXMgTk9UIGJlaW5nIGNhbGxlZCBmcm9tIGEgJ3N5bmNocm9uaXplZCcgbWV0aG9kCisgICAgICAgIGlmIChUaHJlYWQuaG9sZHNMb2NrKHRoaXMpKSB7CisgICAgICAgICAgICAvLyBTVE9QU0hJUCBjaGFuZ2UgdGhlIGZvbGxvd2luZyBsaW5lIHRvIExvZy53KCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRvbid0IGxvY2soKSB3aGlsZSBpbiBhIHN5bmNocm9uaXplZCBtZXRob2QiKTsKKyAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBpZiAoIWZvcmNlZCAmJiAhbUxvY2tpbmdFbmFibGVkKSByZXR1cm47CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0xPQ0tfVElNRV9UUkFDS0lORykgewogICAgICAgICAgICAgaWYgKG1Mb2NrLmdldEhvbGRDb3VudCgpID09IDEpIHsKQEAgLTM4NCw3ICs0MjksNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCiAgICAgLyoqCiAgICAgICogTG9ja3MgdGhlIGRhdGFiYXNlIGZvciBleGNsdXNpdmUgYWNjZXNzLiBUaGUgZGF0YWJhc2UgbG9jayBtdXN0IGJlIGhlbGQgd2hlbgogICAgICAqIHRvdWNoIHRoZSBuYXRpdmUgc3FsaXRlMyogb2JqZWN0IHNpbmNlIGl0IGlzIHNpbmdsZSB0aHJlYWRlZCBhbmQgdXNlcwpAQCAtMzk0LDE0ICs0MzgsNyBAQAogICAgICAqIEBzZWUgI3VubG9ja0ZvcmNlZCgpCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGxvY2tGb3JjZWQoKSB7Ci0gICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0xPQ0tfVElNRV9UUkFDS0lORykgewotICAgICAgICAgICAgaWYgKG1Mb2NrLmdldEhvbGRDb3VudCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgZWxhcHNlZCByZWFsLXRpbWUgc2luY2UgdGhlIENQVSBtYXkgc2xlZXAgd2hlbiB3YWl0aW5nIGZvciBJTwotICAgICAgICAgICAgICAgIG1Mb2NrQWNxdWlyZWRXYWxsVGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwotICAgICAgICAgICAgICAgIG1Mb2NrQWNxdWlyZWRUaHJlYWRUaW1lID0gRGVidWcudGhyZWFkQ3B1VGltZU5hbm9zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbG9jayh0cnVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ2MCwxMSArNDk3LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBFWENMVVNJVkUgbW9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4KKyAgICAgKiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKICAgICAgKiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24gYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvcgogICAgICAqIHJvbGxlZCBiYWNrLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCiAgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5IHdpbGwgYmUgY29tbWl0dGVkLgotICAgICAqCisgICAgICogPC9wPgogICAgICAqIDxwPkhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CiAgICAgICoKICAgICAgKiA8cHJlPgpAQCAtNDc4LDE1ICs1MTgsNDIgQEAKICAgICAgKiA8L3ByZT4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uKCkgewotICAgICAgICBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyKG51bGwgLyogdHJhbnNhY3Rpb25TdGF0dXNDYWxsYmFjayAqLyk7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIElNTUVESUFURSBtb2RlLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbgorICAgICAqIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YgdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uCisgICAgICogYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvciByb2xsZWQgYmFjay4gVGhlCisgICAgICogY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCisgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5CisgICAgICogd2lsbCBiZSBjb21taXR0ZWQuCisgICAgICogPHA+CisgICAgICogSGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogICBkYi5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gRVhDTFVTSVZFIG1vZGUuCisgICAgICogPHA+CisgICAgICogVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuCisgICAgICogV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCiAgICAgICogdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3IKICAgICAgKiByb2xsZWQgYmFjay4gVGhlIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZwogICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleSB3aWxsIGJlIGNvbW1pdHRlZC4KLSAgICAgKgorICAgICAqIDwvcD4KICAgICAgKiA8cD5IZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgogICAgICAqCiAgICAgICogPHByZT4KQEAgLTQ5OCwxNSArNTY1LDQ4IEBACiAgICAgICogICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CiAgICAgICogICB9CiAgICAgICogPC9wcmU+CisgICAgICoKICAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBiZWdpbnMsCiAgICAgICogY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlciBleHBsaWNpdGx5IG9yIGJ5IGEgY2FsbCB0bwogICAgICAqIHtAbGluayAjeWllbGRJZkNvbnRlbmRlZFNhZmVseX0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lcihTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIHRyYW5zYWN0aW9uTGlzdGVuZXIpIHsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbih0cmFuc2FjdGlvbkxpc3RlbmVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBJTU1FRElBVEUgbW9kZS4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4KKyAgICAgKiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbgorICAgICAqIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIFRoZQorICAgICAqIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZworICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleQorICAgICAqIHdpbGwgYmUgY29tbWl0dGVkLgorICAgICAqIDxwPgorICAgICAqIEhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICAgZGIuYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZShsaXN0ZW5lcik7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJlZ2lucywgY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlcgorICAgICAqICAgICAgICAgICAgZXhwbGljaXRseSBvciBieSBhIGNhbGwgdG8ge0BsaW5rICN5aWVsZElmQ29udGVuZGVkU2FmZWx5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKAorICAgICAgICAgICAgU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciB0cmFuc2FjdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25MaXN0ZW5lciwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiZWdpblRyYW5zYWN0aW9uKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgdHJhbnNhY3Rpb25MaXN0ZW5lciwKKyAgICAgICAgICAgIGJvb2xlYW4gZXhjbHVzaXZlKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGxvY2tGb3JjZWQoKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQogICAgICAgICBib29sZWFuIG9rID0gZmFsc2U7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBhbHJlYWR5IGhhZCB0aGUgbG9jayB0aGVuIGdldCBvdXQKQEAgLTUyNCw3ICs2MjQsMTEgQEAKIAogICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgZGlkbid0IGFscmVhZHkgaGF2ZSB0aGUgbG9jaywgc28gYmVnaW4gYSBkYXRhYmFzZQogICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gbm93LgotICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gRVhDTFVTSVZFOyIpOworICAgICAgICAgICAgaWYgKGV4Y2x1c2l2ZSAmJiBtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4ZWNTUUwoIkJFR0lOIEVYQ0xVU0lWRTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gSU1NRURJQVRFOyIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVRyYW5zYWN0aW9uTGlzdGVuZXIgPSB0cmFuc2FjdGlvbkxpc3RlbmVyOwogICAgICAgICAgICAgbVRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gdHJ1ZTsKICAgICAgICAgICAgIG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gZmFsc2U7CkBAIC01NTEsMTIgKzY1NSw3IEBACiAgICAgICogYXJlIGNvbW1pdHRlZCBhbmQgcm9sbGVkIGJhY2suCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtTG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm8gdHJhbnNhY3Rpb24gcGVuZGluZyIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsKSB7CiAgICAgICAgICAgICAgICAgbUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwgPSBmYWxzZTsKQEAgLTU4MSw2ICs2ODAsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwpIHsKICAgICAgICAgICAgICAgICBleGVjU1FMKENPTU1JVF9TUUwpOworICAgICAgICAgICAgICAgIC8vIGlmIHdyaXRlLWFoZWFkIGxvZ2dpbmcgaXMgdXNlZCwgd2UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgY2hlY2twb2ludC4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYXBwbGljYXRpb25zIGJlIGdpdmVuIHRoZSBmbGV4aWJpbGl0eSBvZiBjaG9vc2luZyB3aGVuIHRvCisgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBjaGVja3BvaW50PworICAgICAgICAgICAgICAgIC8vIGZvciBub3csIGRvIGNoZWNrcG9pbnQgYWZ0ZXIgZXZlcnkgQ09NTUlUIGJlY2F1c2UgdGhhdCBpcyB0aGUgZmFzdGVzdAorICAgICAgICAgICAgICAgIC8vIHdheSB0byBndWFyYW50ZWUgdGhhdCByZWFkZXJzIHdpbGwgc2VlIGxhdGVzdCBkYXRhLgorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIHRoZSBzbG93ZXN0IHdheSB0byBydW4gc3FsaXRlIHdpdGggaW4gd3JpdGUtYWhlYWQgbG9nZ2luZyBtb2RlLgorICAgICAgICAgICAgICAgIGlmICh0aGlzLm1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWNTUUwoIlBSQUdNQSB3YWxfY2hlY2twb2ludDsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJQUkFHTUEgd2FsX0NoZWNrcG9pbnQgZG9uZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBleGVjU1FMKCJST0xMQkFDSzsiKTsKQEAgLTYxNCw5ICs3MjUsNyBAQAogICAgICAqIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgbWFya2VkIGFzIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGlmICghbUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vIHRyYW5zYWN0aW9uIHBlbmRpbmciKTsKICAgICAgICAgfQpAQCAtNjMxLDcgKzc0MCw1MCBAQAogICAgICAqIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gcGVuZGluZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGluVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBtTG9jay5nZXRIb2xkQ291bnQoKSA+IDA7CisgICAgICAgIHJldHVybiBtTG9jay5nZXRIb2xkQ291bnQoKSA+IDAgfHwgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJmb3VuZCBleGVjU1FMKCdiZWdpbiB0cmFuc2FjdGlvbicpIik7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBpZiAobVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiZm91bmQgZXhlY1NRTCgnY29tbWl0IG9yIGVuZCBvciByb2xsYmFjaycpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuCisgICAgICogPHA+CisgICAgICogQ2FsbGVyIGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaWYgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZQorICAgICAqIDxvbD4KKyAgICAgKiAgIDxsaT5JZiB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIGJ5IGNhbGxpbmcgYmVnaW5UcmFuc2FjdGlvbigpIG1ldGhvZHMgQU5EIGlmIHRoZSBjYWxsZXIgaXMKKyAgICAgKiAgIGluIHRoZSBzYW1lIHRocmVhZCBhcyB0aGUgdGhyZWFkIHRoYXQgc3RhcnRlZCB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogICA8L2xpPgorICAgICAqICAgPGxpPklmIHRoZSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIGJ5IGNhbGxpbmcge0BsaW5rICNleGVjU1FMKFN0cmluZyl9IGxpa2UgdGhpczoKKyAgICAgKiAgIGV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuIEluIHRoaXMgY2FzZSwgZXZlcnkgdGhyZWFkIGluIHRoZSBwcm9jZXNzIGlzIGNvbnNpZGVyZWQKKyAgICAgKiAgIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjYWxsZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhbUlJblRyYW5zYWN0aW9uKCkgeworICAgICAgICAvLyBhbHdheXMgZG8gdGhpcyB0ZXN0IG9uIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gLSBOT1Qgb24gcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gc2luY2UgdHJhbnNhY3Rpb25zIGFsd2F5cyBvY2N1ciBvbiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9ucyBvbmx5LgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgPyBtUGFyZW50Q29ubk9iaiA6IHRoaXM7CisgICAgICAgIGJvb2xlYW4gYiA9ICghZGIuaW5UcmFuc2FjdGlvbigpKSA/IGZhbHNlIDoKKyAgICAgICAgICAgICAgICBkYi5tVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWwgfHwgZGIubUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCk7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImFtSWluVHJhbnNhY3Rpb246ICIgKyBiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYjsKICAgICB9CiAKICAgICAvKioKQEAgLTczNSw1NCArODg3LDEyIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8qKiBNYXBzIHRhYmxlIG5hbWVzIHRvIGluZm8gYWJvdXQgd2hhdCB0byB3aGljaCBfc3luY190aW1lIGNvbHVtbiB0byBzZXQKLSAgICAgKiB0byBOVUxMIG9uIGFuIHVwZGF0ZS4gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgc3luY2luZy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN5bmNVcGRhdGVJbmZvPiBtU3luY1VwZGF0ZUluZm8gPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTeW5jVXBkYXRlSW5mbz4oKTsKLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFN5bmNlZFRhYmxlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdGFibGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB0YWJsZSA6IG1TeW5jVXBkYXRlSW5mby5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIFN5bmNVcGRhdGVJbmZvIGluZm8gPSBtU3luY1VwZGF0ZUluZm8uZ2V0KHRhYmxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5kZWxldGVkVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0YWJsZXMucHV0KHRhYmxlLCBpbmZvLmRlbGV0ZWRUYWJsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRhYmxlczsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgotICAgICAqIEludGVybmFsIGNsYXNzIHVzZWQgdG8ga2VlcCB0cmFjayB3aGF0IG5lZWRzIHRvIGJlIG1hcmtlZCBhcyBjaGFuZ2VkCi0gICAgICogd2hlbiBhbiB1cGRhdGUgb2NjdXJzLiBUaGlzIGlzIHVzZWQgZm9yIHN5bmNpbmcsIHNvIHRoZSBzeW5jIGVuZ2luZQotICAgICAqIGtub3dzIHdoYXQgZGF0YSBoYXMgYmVlbiB1cGRhdGVkIGxvY2FsbHkuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgY2xhc3MgU3luY1VwZGF0ZUluZm8gewotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyB0aGUgU3luY1VwZGF0ZUluZm8gY2xhc3MuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtYXN0ZXJUYWJsZSBUaGUgdGFibGUgdG8gc2V0IF9zeW5jX3RpbWUgdG8gTlVMTCBpbgotICAgICAgICAgKiBAcGFyYW0gZGVsZXRlZFRhYmxlIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gICAgICAgICAqICAgICAgICAgIG1hc3RlciB0YWJsZQotICAgICAgICAgKiBAcGFyYW0gZm9yZWlnbktleSBUaGUga2V5IHRoYXQgcmVmZXJzIHRvIHRoZSBwcmltYXJ5IGtleSBpbiB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgU3luY1VwZGF0ZUluZm8oU3RyaW5nIG1hc3RlclRhYmxlLCBTdHJpbmcgZGVsZXRlZFRhYmxlLAotICAgICAgICAgICAgICAgIFN0cmluZyBmb3JlaWduS2V5KSB7Ci0gICAgICAgICAgICB0aGlzLm1hc3RlclRhYmxlID0gbWFzdGVyVGFibGU7Ci0gICAgICAgICAgICB0aGlzLmRlbGV0ZWRUYWJsZSA9IGRlbGV0ZWRUYWJsZTsKLSAgICAgICAgICAgIHRoaXMuZm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogVGhlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIF9zeW5jX3RpbWUgY29sdW1uICovCi0gICAgICAgIFN0cmluZyBtYXN0ZXJUYWJsZTsKLQotICAgICAgICAvKiogVGhlIGRlbGV0ZWQgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWFzdGVyIHRhYmxlICovCi0gICAgICAgIFN0cmluZyBkZWxldGVkVGFibGU7Ci0KLSAgICAgICAgLyoqIFRoZSBrZXkgaW4gdGhlIGxvY2FsIHRhYmxlIHRoZSByb3cgaW4gdGFibGUuIEl0IG1heSBiZSBfaWQsIGlmIHRhYmxlCi0gICAgICAgICAqIGlzIHRoZSBsb2NhbCB0YWJsZS4gKi8KLSAgICAgICAgU3RyaW5nIGZvcmVpZ25LZXk7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTeW5jZWRUYWJsZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03OTEsOCArOTAxLDcgQEAKICAgICBwdWJsaWMgaW50ZXJmYWNlIEN1cnNvckZhY3RvcnkgewogICAgICAgICAvKioKICAgICAgICAgICogU2VlCi0gICAgICAgICAqIHtAbGluayBTUUxpdGVDdXJzb3IjU1FMaXRlQ3Vyc29yKFNRTGl0ZURhdGFiYXNlLCBTUUxpdGVDdXJzb3JEcml2ZXIsCi0gICAgICAgICAqIFN0cmluZywgU1FMaXRlUXVlcnkpfS4KKyAgICAgICAgICoge0BsaW5rIFNRTGl0ZUN1cnNvciNTUUxpdGVDdXJzb3IoU1FMaXRlQ3Vyc29yRHJpdmVyLCBTdHJpbmcsIFNRTGl0ZVF1ZXJ5KX0uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQ3Vyc29yIG5ld0N1cnNvcihTUUxpdGVEYXRhYmFzZSBkYiwKICAgICAgICAgICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgbWFzdGVyUXVlcnksIFN0cmluZyBlZGl0VGFibGUsCkBAIC04MTQsMzAgKzkyMyw4MCBAQAogICAgICAqIEB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBjYW5ub3QgYmUgb3BlbmVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIHNxbGl0ZURhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkYXRhYmFzZSBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIHtAbGluayAjT1BFTl9SRUFEV1JJVEV9CisgICAgICoge0BsaW5rICNPUEVOX1JFQURPTkxZfSB7QGxpbmsgI0NSRUFURV9JRl9ORUNFU1NBUll9IGFuZC9vciB7QGxpbmsgI05PX0xPQ0FMSVpFRF9DT0xMQVRPUlN9LgorICAgICAqCisgICAgICogPHA+U2V0cyB0aGUgbG9jYWxlIG9mIHRoZSBkYXRhYmFzZSB0byB0aGUgIHRoZSBzeXN0ZW0ncyBjdXJyZW50IGxvY2FsZS4KKyAgICAgKiBDYWxsIHtAbGluayAjc2V0TG9jYWxlfSBpZiB5b3Ugd291bGQgbGlrZSBzb21ldGhpbmcgZWxzZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0byBkYXRhYmFzZSBmaWxlIHRvIG9wZW4gYW5kL29yIGNyZWF0ZQorICAgICAqIEBwYXJhbSBmYWN0b3J5IGFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyBjYWxsZWQgdG8gaW5zdGFudGlhdGUgYQorICAgICAqICAgICAgICAgICAgY3Vyc29yIHdoZW4gcXVlcnkgaXMgY2FsbGVkLCBvciBudWxsIGZvciBkZWZhdWx0CisgICAgICogQHBhcmFtIGZsYWdzIHRvIGNvbnRyb2wgZGF0YWJhc2UgYWNjZXNzIG1vZGUKKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IG9iaiB0byBiZSB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uCisgICAgICogd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgb3BlbmVkIGRhdGFiYXNlCisgICAgICogQHRocm93cyBTUUxpdGVFeGNlcHRpb24gaWYgdGhlIGRhdGFiYXNlIGNhbm5vdCBiZSBvcGVuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5EYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2Ugc3FsaXRlRGF0YWJhc2UgPSBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIGVycm9ySGFuZGxlciwKKyAgICAgICAgICAgICAgICAoc2hvcnQpIDAgLyogdGhlIG1haW4gY29ubmVjdGlvbiBoYW5kbGUgKi8pOworCisgICAgICAgIC8vIHNldCBzcWxpdGUgcGFnZXNpemUgdG8gbUJsb2NrU2l6ZQorICAgICAgICBpZiAoc0Jsb2NrU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBUT0RPOiAiL2RhdGEiIHNob3VsZCBiZSBhIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uc3RhbnQgc29tZXdoZXJlLiBpdCBpcyBoYXJkY29kZWQKKyAgICAgICAgICAgIC8vIGluIHNldmVyYWwgcGxhY2VzIHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIHNCbG9ja1NpemUgPSBuZXcgU3RhdEZzKCIvZGF0YSIpLmdldEJsb2NrU2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHNxbGl0ZURhdGFiYXNlLnNldFBhZ2VTaXplKHNCbG9ja1NpemUpOworICAgICAgICAvL1NUT1BTSElQIC0gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAvL3NxbGl0ZURhdGFiYXNlLnNldEpvdXJuYWxNb2RlKHBhdGgsICJUUlVOQ0FURSIpOworICAgICAgICAvLyBTVE9QU0hJUCByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lcworICAgICAgICBpZiAoIXBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIFNUT1BTSElQCisKKyAgICAgICAgLy8gYWRkIHRoaXMgZGF0YWJhc2UgdG8gdGhlIGxpc3Qgb2YgZGF0YWJhc2VzIG9wZW5lZCBpbiB0aGlzIHByb2Nlc3MKKyAgICAgICAgc3luY2hyb25pemVkKG1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgICAgIG1BY3RpdmVEYXRhYmFzZXMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPihzcWxpdGVEYXRhYmFzZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzcWxpdGVEYXRhYmFzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyLCBzaG9ydCBjb25uZWN0aW9uTnVtKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbmV3IFNRTGl0ZURhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm9wZW5pbmcgdGhlIGRiIDogIiArIHBhdGgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gT3BlbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICBzcWxpdGVEYXRhYmFzZSA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncyk7CisgICAgICAgICAgICBkYi5kYm9wZW4ocGF0aCwgZmxhZ3MpOworICAgICAgICAgICAgZGIuc2V0TG9jYWxlKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7Ci0gICAgICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UuZW5hYmxlU3FsVHJhY2luZyhwYXRoKTsKKyAgICAgICAgICAgICAgICBkYi5lbmFibGVTcWxUcmFjaW5nKHBhdGgsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9USU1FKSB7Ci0gICAgICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UuZW5hYmxlU3FsUHJvZmlsaW5nKHBhdGgpOworICAgICAgICAgICAgICAgIGRiLmVuYWJsZVNxbFByb2ZpbGluZyhwYXRoLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYjsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byByZWNvdmVyIGZyb20gdGhpcywgaWYgd2UgY2FuLgotICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGRvIHRoaXMgZm9yIG90aGVyIG9wZW4gZmFpbHVyZXM/Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJEZWxldGluZyBhbmQgcmUtY3JlYXRpbmcgY29ycnVwdCBkYXRhYmFzZSAiICsgcGF0aCwgZSk7Ci0gICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UX0RCX0NPUlJVUFQsIHBhdGgpOwotICAgICAgICAgICAgaWYgKCFwYXRoLmVxdWFsc0lnbm9yZUNhc2UoIjptZW1vcnkiKSkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpcyBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlIGZpbGVzCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUocGF0aCkuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcWxpdGVEYXRhYmFzZSA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncyk7CisgICAgICAgICAgICBkYi5tRXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYik7CisgICAgICAgICAgICByZXR1cm4gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIG9wZW4gdGhlIGRhdGFiYXNlLiBjbG9zaW5nIGl0LiIsIGUpOworICAgICAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0KLSAgICAgICAgQWN0aXZlRGF0YWJhc2VzLmdldEluc3RhbmNlKCkubUFjdGl2ZURhdGFiYXNlcy5hZGQoCi0gICAgICAgICAgICAgICAgbmV3IFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+KHNxbGl0ZURhdGFiYXNlKSk7Ci0gICAgICAgIHJldHVybiBzcWxpdGVEYXRhYmFzZTsKICAgICB9CiAKICAgICAvKioKQEAgLTg1NSw2ICsxMDE0LDI1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgZXJyb3JIYW5kbGVyKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZLCBlcnJvckhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRKb3VybmFsTW9kZShmaW5hbCBTdHJpbmcgZGJQYXRoLCBmaW5hbCBTdHJpbmcgbW9kZSkgeworICAgICAgICAvLyBqb3VybmFsIG1vZGUgY2FuIGJlIHNldCBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlcworICAgICAgICBpZiAoIWRiUGF0aC5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9EQl9QQVRIKSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBEYXRhYmFzZVV0aWxzLnN0cmluZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgam91cm5hbF9tb2RlPSIgKyBtb2RlLCBudWxsKTsKKyAgICAgICAgICAgIGlmICghcy5lcXVhbHNJZ25vcmVDYXNlKG1vZGUpKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2V0dGluZyBqb3VybmFsX21vZGUgdG8gIiArIG1vZGUgKyAiIGZhaWxlZCBmb3IgZGI6ICIgKyBkYlBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgIiAob24gcHJhZ21hIHNldCBqb3VybmFsX21vZGUsIHNxbGl0ZSByZXR1cm5lZDoiICsgcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYSBtZW1vcnkgYmFja2VkIFNRTGl0ZSBkYXRhYmFzZS4gIEl0cyBjb250ZW50cyB3aWxsIGJlIGRlc3Ryb3llZAogICAgICAqIHdoZW4gdGhlIGRhdGFiYXNlIGlzIGNsb3NlZC4KICAgICAgKgpAQCAtODY3LDcgKzEwNDUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2UgY3JlYXRlKEN1cnNvckZhY3RvcnkgZmFjdG9yeSkgewogICAgICAgICAvLyBUaGlzIGlzIGEgbWFnaWMgc3RyaW5nIHdpdGggc3BlY2lhbCBtZWFuaW5nIGZvciBTUUxpdGUuCi0gICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UoIjptZW1vcnk6IiwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSk7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UoTUVNT1JZX0RCX1BBVEgsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODc1LDIwICsxMDUzLDM4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBjbG9zZWQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjbG9zaW5nIGRiOiAiICsgbVBhdGggKyAiIChjb25uZWN0aW9uICMgIiArIG1Db25uZWN0aW9uTnVtKTsKICAgICAgICAgfQogICAgICAgICBsb2NrKCk7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBzb21lIG90aGVyIHRocmVhZCBjb3VsZCBoYXZlIGNsb3NlZCB0aGlzIGRhdGFiYXNlIHdoaWxlIEkgd2FzIHdhaXRpbmcgZm9yIGxvY2suCisgICAgICAgICAgICAvLyBjaGVjayB0aGUgZGF0YWJhc2Ugc3RhdGUKKyAgICAgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbG9zZUNsb3NhYmxlKCk7CisgICAgICAgICAgICAvLyBmaW5hbGl6ZSBBTEwgc3RhdGVtZW50cyBxdWV1ZWQgdXAgc28gZmFyCisgICAgICAgICAgICBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgICAgICByZWxlYXNlQ3VzdG9tRnVuY3Rpb25zKCk7CiAgICAgICAgICAgICAvLyBjbG9zZSB0aGlzIGRhdGFiYXNlIGluc3RhbmNlIC0gcmVnYXJkbGVzcyBvZiBpdHMgcmVmZXJlbmNlIGNvdW50IHZhbHVlCi0gICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgY2xvc2VEYXRhYmFzZSgpOworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbUNvbm5lY3Rpb25Qb29sICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbUNvbm5lY3Rpb25Qb29sLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgdW5sb2NrKCk7ICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2xvc2VDbG9zYWJsZSgpIHsKLSAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgc3FsIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KKyAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgU1FMIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KICAgICAgICAgICogdGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgZGUtcmVmZXJlbmNpbmcgYWxsIHtAbGluayBTUUxpdGVDbG9zYWJsZX0gb2JqZWN0cwogICAgICAgICAgKiBmcm9tIHRoaXMgZGF0YWJhc2Ugb2JqZWN0IGJlY2F1c2UgY2FsbGluZwogICAgICAgICAgKiB7QGxpbmsgU1FMaXRlQ2xvc2FibGUjb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCl9IGNvdWxkIGNhdXNlIHRoZSBkYXRhYmFzZQpAQCAtOTA4LDI5ICsxMTA0LDEwNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHBhY2thZ2UgbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGNsb3NlRGF0YWJhc2UoKSB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRiY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uIGUpICB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBtc2cuc3BsaXQoIiwiLCAyKTsKKyAgICAgICAgICAgIGludCBzdG10SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vuc1swXSk7CisgICAgICAgICAgICAvLyBnZXQgZXh0cmEgaW5mbyBhYm91dCB0aGlzIHN0YXRlbWVudCwgaWYgaXQgaXMgc3RpbGwgdG8gYmUgcmVsZWFzZWQgYnkgY2xvc2VDbG9zYWJsZSgpCisgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U1FMaXRlQ2xvc2FibGUsIE9iamVjdD4+IGl0ZXIgPSBtUHJvZ3JhbXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+IGVudHJ5ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU1FMaXRlQ2xvc2FibGUgcHJvZ3JhbSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtICE9IG51bGwgJiYgcHJvZ3JhbSBpbnN0YW5jZW9mIFNRTGl0ZVByb2dyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3FsID0gKChTUUxpdGVQcm9ncmFtKXByb2dyYW0pLm1Db21waWxlZFNxbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21waWxlZFNxbC5uU3RhdGVtZW50ID09IHN0bXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNvbXBpbGVkU3FsLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGVtZW50IGlzIGFscmVhZHkgcmVsZWFzZWQgYnkgY2xvc2VDbG9zYWJsZSgpLiBpcyBpdCB3YWl0aW5nIHRvIGJlCisgICAgICAgICAgICAgICAgLy8gZmluYWxpemVkPworICAgICAgICAgICAgICAgIGlmIChtQ2xvc2VkU3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAidGhpcyBzaG91bGRuJ3QgaGFwcGVuLiBmaW5hbGl6aW5nIHRoZSBzdGF0ZW1lbnQgbm93OiAiKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gY2xvc2UgdGhlIGRhdGFiYXNlIGFnYWluCisgICAgICAgICAgICAgICAgICAgIGNsb3NlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZSBzdGF0ZW1lbnQgaXMgbm90IHlldCBjbG9zZWQuIG1vc3QgcHJvYmFibHkgcHJvZ3JhbW1pbmcgZXJyb3IgaW4gdGhlIGFwcC4KKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJkYmNsb3NlIGZhaWxlZCBkdWUgdG8gdW4tY2xvc2UoKWQgU1FMIHN0YXRlbWVudHM6ICIgKyBtc2cpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBjbG9zZSB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBkYmNsb3NlKCk7CiAKICAgICAvKioKKyAgICAgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgYSBjdXN0b20gc3FsaXRlMyBmdW5jdGlvbi4KKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogc3FsaXRlMyBkYXRhYmFzZSB0cmlnZ2Vycy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tRnVuY3Rpb24geworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsYmFjayhTdHJpbmdbXSBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBDdXN0b21GdW5jdGlvbiBjYWxsYmFjayBhcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogc3FsaXRlMyBkYXRhYmFzZSB0cmlnZ2Vycy4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3FsaXRlMyBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBudW1BcmdzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gZnVuY3Rpb24gY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ3VzdG9tRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBudW1BcmdzLCBDdXN0b21GdW5jdGlvbiBmdW5jdGlvbikgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1DdXN0b21GdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGludCByZWYgPSBuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24obmFtZSwgbnVtQXJncywgZnVuY3Rpb24pOworICAgICAgICAgICAgaWYgKHJlZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gZm9yIGNsZWFudXAgbGF0ZXIKKyAgICAgICAgICAgICAgICBtQ3VzdG9tRnVuY3Rpb25zLmFkZChuZXcgSW50ZWdlcihyZWYpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTGl0ZUV4Y2VwdGlvbigiZmFpbGVkIHRvIGFkZCBjdXN0b20gZnVuY3Rpb24gIiArIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VDdXN0b21GdW5jdGlvbnMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUN1c3RvbUZ1bmN0aW9ucykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ3VzdG9tRnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBmdW5jdGlvbiA9IG1DdXN0b21GdW5jdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oZnVuY3Rpb24uaW50VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VzdG9tRnVuY3Rpb25zLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBsaXN0IG9mIEN1c3RvbUZ1bmN0aW9uIHJlZmVyZW5jZXMgc28gd2UgY2FuIGNsZWFuIHVwIHdoZW4gdGhlIGRhdGFiYXNlIGNsb3NlcworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1DdXN0b21GdW5jdGlvbnMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihTdHJpbmcgbmFtZSwgaW50IG51bUFyZ3MsIEN1c3RvbUZ1bmN0aW9uIGZ1bmN0aW9uKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oaW50IGZ1bmN0aW9uKTsKKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGFiYXNlIHZlcnNpb24uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhYmFzZSB2ZXJzaW9uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgIlBSQUdNQSB1c2VyX3ZlcnNpb247Iik7Ci0gICAgICAgICAgICBsb25nIHZlcnNpb24gPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZlcnNpb247Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gKChMb25nKSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIHVzZXJfdmVyc2lvbjsiLCBudWxsKSkuaW50VmFsdWUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk0OCwyMCArMTIyMSw4IEBACiAgICAgICogQHJldHVybiB0aGUgbmV3IG1heGltdW0gZGF0YWJhc2Ugc2l6ZQogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1TaXplKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudDsiKTsKLSAgICAgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBwYWdlQ291bnQgKiBnZXRQYWdlU2l6ZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIG1heF9wYWdlX2NvdW50OyIsIG51bGwpOworICAgICAgICByZXR1cm4gcGFnZUNvdW50ICogZ2V0UGFnZVNpemUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk3MiwyNiArMTIzMywxNSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldyBtYXhpbXVtIGRhdGFiYXNlIHNpemUKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzZXRNYXhpbXVtU2l6ZShsb25nIG51bUJ5dGVzKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOworICAgICAgICBsb25nIHBhZ2VTaXplID0gZ2V0UGFnZVNpemUoKTsKKyAgICAgICAgbG9uZyBudW1QYWdlcyA9IG51bUJ5dGVzIC8gcGFnZVNpemU7CisgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCisgICAgICAgIGlmICgobnVtQnl0ZXMgJSBwYWdlU2l6ZSkgIT0gMCkgeworICAgICAgICAgICAgbnVtUGFnZXMrKzsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyBwYWdlU2l6ZSA9IGdldFBhZ2VTaXplKCk7Ci0gICAgICAgICAgICBsb25nIG51bVBhZ2VzID0gbnVtQnl0ZXMgLyBwYWdlU2l6ZTsKLSAgICAgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCi0gICAgICAgICAgICBpZiAoKG51bUJ5dGVzICUgcGFnZVNpemUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBudW1QYWdlcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudCA9ICIgKyBudW1QYWdlcyk7Ci0gICAgICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3UGFnZUNvdW50ICogcGFnZVNpemU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgbWF4X3BhZ2VfY291bnQgPSAiICsgbnVtUGFnZXMsCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIHJldHVybiBuZXdQYWdlQ291bnQgKiBwYWdlU2l6ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMDAsMjAgKzEyNTAsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGRhdGFiYXNlIHBhZ2Ugc2l6ZSwgaW4gYnl0ZXMKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRQYWdlU2l6ZSgpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJQUkFHTUEgcGFnZV9zaXplOyIpOwotICAgICAgICAgICAgbG9uZyBzaXplID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgcGFnZV9zaXplOyIsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAzNCw5ICsxMjcxLDEwIEBACiAgICAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBtYXJrIGFzIHN5bmNhYmxlCiAgICAgICogQHBhcmFtIGRlbGV0ZWRUYWJsZSBUaGUgZGVsZXRlZCB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQogICAgICAqICAgICAgICAgIHN5bmNhYmxlIHRhYmxlCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBkZWxldGVkVGFibGUpIHsKLSAgICAgICAgbWFya1RhYmxlU3luY2FibGUodGFibGUsICJfaWQiLCB0YWJsZSwgZGVsZXRlZFRhYmxlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNDksNjAgKzEyODcsMTAgQEAKICAgICAgKiBAcGFyYW0gZm9yZWlnbktleSB0aGlzIGlzIHRoZSBjb2x1bW4gaW4gdGFibGUgd2hvc2UgdmFsdWUgaXMgYW4gX2lkIGluCiAgICAgICogICAgICAgICAgdXBkYXRlVGFibGUKICAgICAgKiBAcGFyYW0gdXBkYXRlVGFibGUgdGhpcyBpcyB0aGUgdGFibGUgdGhhdCB3aWxsIGhhdmUgaXRzIF9zeW5jX2RpcnR5CisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwKLSAgICAgICAgICAgIFN0cmluZyB1cGRhdGVUYWJsZSkgewotICAgICAgICBtYXJrVGFibGVTeW5jYWJsZSh0YWJsZSwgZm9yZWlnbktleSwgdXBkYXRlVGFibGUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcmsgdGhpcyB0YWJsZSBhcyBzeW5jYWJsZSwgd2l0aCB0aGUgX3N5bmNfZGlydHkgcmVzaWRpbmcgaW4gYW5vdGhlcgotICAgICAqIHRhYmxlLiBXaGVuIGFuIHVwZGF0ZSBvY2N1cnMgaW4gdGhpcyB0YWJsZSB0aGUgX3N5bmNfZGlydHkgZmllbGQgb2YgdGhlCi0gICAgICogcm93IGluIHVwZGF0ZVRhYmxlIHdpdGggdGhlIF9pZCBpbiBmb3JlaWduS2V5IHdpbGwgYmUgc2V0IHRvCi0gICAgICogZW5zdXJlIHByb3BlciBzeW5jaW5nIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSBhbiB1cGRhdGUgb24gdGhpcyB0YWJsZSB3aWxsIHRyaWdnZXIgYSBzeW5jIHRpbWUgcmVtb3ZhbAotICAgICAqIEBwYXJhbSBmb3JlaWduS2V5IHRoaXMgaXMgdGhlIGNvbHVtbiBpbiB0YWJsZSB3aG9zZSB2YWx1ZSBpcyBhbiBfaWQgaW4KLSAgICAgKiAgICAgICAgICB1cGRhdGVUYWJsZQotICAgICAqIEBwYXJhbSB1cGRhdGVUYWJsZSB0aGlzIGlzIHRoZSB0YWJsZSB0aGF0IHdpbGwgaGF2ZSBpdHMgX3N5bmNfZGlydHkKLSAgICAgKiBAcGFyYW0gZGVsZXRlZFRhYmxlIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gICAgICogICAgICAgICAgdXBkYXRlVGFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwKLSAgICAgICAgICAgIFN0cmluZyB1cGRhdGVUYWJsZSwgU3RyaW5nIGRlbGV0ZWRUYWJsZSkgewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTCgiU0VMRUNUIF9zeW5jX2RpcnR5IEZST00gIiArIHVwZGF0ZVRhYmxlCi0gICAgICAgICAgICAgICAgICAgICsgIiBMSU1JVCAwIik7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTCgiU0VMRUNUICIgKyBmb3JlaWduS2V5ICsgIiBGUk9NICIgKyB0YWJsZQotICAgICAgICAgICAgICAgICAgICArICIgTElNSVQgMCIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvID0gbmV3IFN5bmNVcGRhdGVJbmZvKHVwZGF0ZVRhYmxlLCBkZWxldGVkVGFibGUsCi0gICAgICAgICAgICAgICAgZm9yZWlnbktleSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNVcGRhdGVJbmZvKSB7Ci0gICAgICAgICAgICBtU3luY1VwZGF0ZUluZm8ucHV0KHRhYmxlLCBpbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgZm9yIGVhY2ggcm93IHRoYXQgaXMgdXBkYXRlZCBpbiBhIGN1cnNvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdGhlIHJvdyBpcyBpbgotICAgICAqIEBwYXJhbSByb3dJZCB0aGUgcm93IElEIG9mIHRoZSB1cGRhdGVkIHJvdwotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByb3dVcGRhdGVkKFN0cmluZyB0YWJsZSwgbG9uZyByb3dJZCkgewotICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgaW5mbyA9IG1TeW5jVXBkYXRlSW5mby5nZXQodGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV4ZWNTUUwoIlVQREFURSAiICsgaW5mby5tYXN0ZXJUYWJsZQotICAgICAgICAgICAgICAgICAgICArICIgU0VUIF9zeW5jX2RpcnR5PTEgV0hFUkUgX2lkPShTRUxFQ1QgIiArIGluZm8uZm9yZWlnbktleQotICAgICAgICAgICAgICAgICAgICArICIgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIF9pZD0iICsgcm93SWQgKyAiKSIpOwotICAgICAgICB9CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBmb3JlaWduS2V5LCBTdHJpbmcgdXBkYXRlVGFibGUpIHsKICAgICB9CiAKICAgICAvKioKQEAgLTExMzQsNiArMTMyMiw4IEBACiAgICAgICogc3RhdGVtZW50IGFuZCBmaWxsIGluIHRob3NlIHZhbHVlcyB3aXRoIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRTdHJpbmd9CiAgICAgICogYW5kIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRMb25nfSBlYWNoIHRpbWUgeW91IHdhbnQgdG8gcnVuIHRoZQogICAgICAqIHN0YXRlbWVudC4gU3RhdGVtZW50cyBtYXkgbm90IHJldHVybiByZXN1bHQgc2V0cyBsYXJnZXIgdGhhbiAxeDEuCisgICAgICo8cD4KKyAgICAgKiBObyB0d28gdGhyZWFkcyBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gYXQgdGhlIHNhbWUgdGltZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBzcWwgVGhlIHJhdyBTUUwgc3RhdGVtZW50LCBtYXkgY29udGFpbiA/IGZvciB1bmtub3duIHZhbHVlcyB0byBiZQogICAgICAqICAgICAgICAgICAgYm91bmQgbGF0ZXIuCkBAIC0xMTQxLDE1ICsxMzMxLDggQEAKICAgICAgKiB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVTdGF0ZW1lbnQgY29tcGlsZVN0YXRlbWVudChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMjYsOSArMTQwOSw3IEBACiAgICAgICAgICAgICBib29sZWFuIGRpc3RpbmN0LCBTdHJpbmcgdGFibGUsIFN0cmluZ1tdIGNvbHVtbnMsCiAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgZ3JvdXBCeSwKICAgICAgICAgICAgIFN0cmluZyBoYXZpbmcsIFN0cmluZyBvcmRlckJ5LCBTdHJpbmcgbGltaXQpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBTdHJpbmcgc3FsID0gU1FMaXRlUXVlcnlCdWlsZGVyLmJ1aWxkUXVlcnlTdHJpbmcoCiAgICAgICAgICAgICAgICAgZGlzdGluY3QsIHRhYmxlLCBjb2x1bW5zLCBzZWxlY3Rpb24sIGdyb3VwQnksIGhhdmluZywgb3JkZXJCeSwgbGltaXQpOwogCkBAIC0xMzM5LDkgKzE1MjAsNyBAQAogICAgIHB1YmxpYyBDdXJzb3IgcmF3UXVlcnlXaXRoRmFjdG9yeSgKICAgICAgICAgICAgIEN1cnNvckZhY3RvcnkgY3Vyc29yRmFjdG9yeSwgU3RyaW5nIHNxbCwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKICAgICAgICAgICAgIFN0cmluZyBlZGl0VGFibGUpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gMDsKIApAQCAtMTM0OSw3ICsxNTI4LDggQEAKICAgICAgICAgICAgIHRpbWVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICB9CiAKLSAgICAgICAgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciA9IG5ldyBTUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIodGhpcywgc3FsLCBlZGl0VGFibGUpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGdldERiQ29ubmVjdGlvbihzcWwpOworICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyID0gbmV3IFNRTGl0ZURpcmVjdEN1cnNvckRyaXZlcihkYiwgc3FsLCBlZGl0VGFibGUpOwogCiAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTM3NSw2ICsxNTU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI8bnVsbD4iKSAgKyAiLCBjb3VudCBpcyAiICsgY291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbGVhc2VEYkNvbm5lY3Rpb24oZGIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjdXJzb3I7CiAgICAgfQpAQCAtMTUwMSw4NCArMTY4Miw0MSBAQAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGluc2VydFdpdGhPbkNvbmZsaWN0KFN0cmluZyB0YWJsZSwgU3RyaW5nIG51bGxDb2x1bW5IYWNrLAogICAgICAgICAgICAgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzLCBpbnQgY29uZmxpY3RBbGdvcml0aG0pIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNZWFzdXJlbWVudHMgc2hvdyBtb3N0IHNxbCBsZW5ndGhzIDw9IDE1MgotICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKDE1Mik7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc3FsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgc3FsLmFwcGVuZCgiSU5TRVJUIik7CiAgICAgICAgIHNxbC5hcHBlbmQoQ09ORkxJQ1RfVkFMVUVTW2NvbmZsaWN0QWxnb3JpdGhtXSk7CiAgICAgICAgIHNxbC5hcHBlbmQoIiBJTlRPICIpOwogICAgICAgICBzcWwuYXBwZW5kKHRhYmxlKTsKLSAgICAgICAgLy8gTWVhc3VyZW1lbnRzIHNob3cgbW9zdCB2YWx1ZXMgbGVuZ3RocyA8IDQwCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoNDApOworICAgICAgICBzcWwuYXBwZW5kKCcoJyk7CiAKLSAgICAgICAgU2V0PE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gbnVsbDsKLSAgICAgICAgaWYgKGluaXRpYWxWYWx1ZXMgIT0gbnVsbCAmJiBpbml0aWFsVmFsdWVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGVudHJ5U2V0ID0gaW5pdGlhbFZhbHVlcy52YWx1ZVNldCgpOwotICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgc3FsLmFwcGVuZCgnKCcpOwotCi0gICAgICAgICAgICBib29sZWFuIG5lZWRTZXBhcmF0b3IgPSBmYWxzZTsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFNlcGFyYXRvcikgewotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZWVkU2VwYXJhdG9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cmllc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoJz8nKTsKKyAgICAgICAgT2JqZWN0W10gYmluZEFyZ3MgPSBudWxsOworICAgICAgICBpbnQgc2l6ZSA9IChpbml0aWFsVmFsdWVzICE9IG51bGwgJiYgaW5pdGlhbFZhbHVlcy5zaXplKCkgPiAwKSA/IGluaXRpYWxWYWx1ZXMuc2l6ZSgpIDogMDsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICBiaW5kQXJncyA9IG5ldyBPYmplY3Rbc2l6ZV07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBjb2xOYW1lIDogaW5pdGlhbFZhbHVlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKGkgPiAwKSA/ICIsIiA6ICIiKTsKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbE5hbWUpOworICAgICAgICAgICAgICAgIGJpbmRBcmdzW2krK10gPSBpbml0aWFsVmFsdWVzLmdldChjb2xOYW1lKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgc3FsLmFwcGVuZCgnKScpOworICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFZBTFVFUyAoIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgoaSA+IDApID8gIiw/IiA6ICI/Iik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcWwuYXBwZW5kKCIoIiArIG51bGxDb2x1bW5IYWNrICsgIikgIik7Ci0gICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCJOVUxMIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKG51bGxDb2x1bW5IYWNrICsgIikgVkFMVUVTIChOVUxMIik7CiAgICAgICAgIH0KKyAgICAgICAgc3FsLmFwcGVuZCgnKScpOwogCi0gICAgICAgIHNxbC5hcHBlbmQoIiBWQUxVRVMoIik7Ci0gICAgICAgIHNxbC5hcHBlbmQodmFsdWVzKTsKLSAgICAgICAgc3FsLmFwcGVuZCgiKTsiKTsKLQotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwudG9TdHJpbmcoKSwgYmluZEFyZ3MpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudChzcWwudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgdGhlIHZhbHVlcwotICAgICAgICAgICAgaWYgKGVudHJ5U2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGVudHJ5U2V0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyaWVzSXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgaSArIDEsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUnVuIHRoZSBwcm9ncmFtIGFuZCB0aGVuIGNsZWFudXAKLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7Ci0KLSAgICAgICAgICAgIGxvbmcgaW5zZXJ0ZWRSb3dJZCA9IGxhc3RJbnNlcnRSb3coKTsKLSAgICAgICAgICAgIGlmIChpbnNlcnRlZFJvd0lkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW5zZXJ0aW5nICIgKyBpbml0aWFsVmFsdWVzICsgIiB1c2luZyAiICsgc3FsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEICYmIExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkluc2VydGluZyByb3cgIiArIGluc2VydGVkUm93SWQgKyAiIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdGlhbFZhbHVlcyArICIgdXNpbmcgIiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluc2VydGVkUm93SWQ7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVJbnNlcnQoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU5MywzMiArMTczMSwxNSBAQAogICAgICAqICAgICAgICAgd2hlcmVDbGF1c2UuCiAgICAgICovCiAgICAgcHVibGljIGludCBkZWxldGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgd2hlcmVDbGF1c2UsIFN0cmluZ1tdIHdoZXJlQXJncykgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgIkRFTEVURSBGUk9NICIgKyB0YWJsZSArCisgICAgICAgICAgICAgICAgKCFUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZUNsYXVzZSkgPyAiIFdIRVJFICIgKyB3aGVyZUNsYXVzZSA6ICIiKSwgd2hlcmVBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoIkRFTEVURSBGUk9NICIgKyB0YWJsZQotICAgICAgICAgICAgICAgICAgICArICghVGV4dFV0aWxzLmlzRW1wdHkod2hlcmVDbGF1c2UpCi0gICAgICAgICAgICAgICAgICAgID8gIiBXSEVSRSAiICsgd2hlcmVDbGF1c2UgOiAiIikpOwotICAgICAgICAgICAgaWYgKHdoZXJlQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bUFyZ3MgPSB3aGVyZUFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGkgKyAxLCB3aGVyZUFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdENoYW5nZUNvdW50KCk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY0OSw4ICsxNzcwLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHVwZGF0ZVdpdGhPbkNvbmZsaWN0KFN0cmluZyB0YWJsZSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgd2hlcmVDbGF1c2UsIFN0cmluZ1tdIHdoZXJlQXJncywgaW50IGNvbmZsaWN0QWxnb3JpdGhtKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGludCBzZXRWYWx1ZXNTaXplID0gdmFsdWVzLnNpemUoKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHNldFZhbHVlc1NpemUgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW1wdHkgdmFsdWVzIik7CiAgICAgICAgIH0KIApAQCAtMTY2MCw5OCArMTc4MSw3MSBAQAogICAgICAgICBzcWwuYXBwZW5kKHRhYmxlKTsKICAgICAgICAgc3FsLmFwcGVuZCgiIFNFVCAiKTsKIAotICAgICAgICBTZXQ8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTZXQgPSB2YWx1ZXMudmFsdWVTZXQoKTsKLSAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyaWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBzcWwuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgLy8gbW92ZSBhbGwgYmluZCBhcmdzIHRvIG9uZSBhcnJheQorICAgICAgICBpbnQgYmluZEFyZ3NTaXplID0gKHdoZXJlQXJncyA9PSBudWxsKSA/IHNldFZhbHVlc1NpemUgOiAoc2V0VmFsdWVzU2l6ZSArIHdoZXJlQXJncy5sZW5ndGgpOworICAgICAgICBPYmplY3RbXSBiaW5kQXJncyA9IG5ldyBPYmplY3RbYmluZEFyZ3NTaXplXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKFN0cmluZyBjb2xOYW1lIDogdmFsdWVzLmtleVNldCgpKSB7CisgICAgICAgICAgICBzcWwuYXBwZW5kKChpID4gMCkgPyAiLCIgOiAiIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbE5hbWUpOworICAgICAgICAgICAgYmluZEFyZ3NbaSsrXSA9IHZhbHVlcy5nZXQoY29sTmFtZSk7CiAgICAgICAgICAgICBzcWwuYXBwZW5kKCI9PyIpOwotICAgICAgICAgICAgaWYgKGVudHJpZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdoZXJlQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBzZXRWYWx1ZXNTaXplOyBpIDwgYmluZEFyZ3NTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBiaW5kQXJnc1tpXSA9IHdoZXJlQXJnc1tpIC0gc2V0VmFsdWVzU2l6ZV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlQ2xhdXNlKSkgewogICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFdIRVJFICIpOwogICAgICAgICAgICAgc3FsLmFwcGVuZCh3aGVyZUNsYXVzZSk7CiAgICAgICAgIH0KIAotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbC50b1N0cmluZygpLCBiaW5kQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gQmluZCB0aGUgdmFsdWVzCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IGVudHJ5U2V0LnNpemUoKTsKLSAgICAgICAgICAgIGVudHJpZXNJdGVyID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGludCBiaW5kQXJnID0gMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmJpbmRPYmplY3RUb1Byb2dyYW0oc3RhdGVtZW50LCBiaW5kQXJnLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBiaW5kQXJnKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aGVyZUFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNpemUgPSB3aGVyZUFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kU3RyaW5nKGJpbmRBcmcsIHdoZXJlQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRBcmcrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJ1biB0aGUgcHJvZ3JhbSBhbmQgdGhlbiBjbGVhbnVwCi0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgaW50IG51bUNoYW5nZWRSb3dzID0gbGFzdENoYW5nZUNvdW50KCk7Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QgJiYgTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJVcGRhdGVkICIgKyBudW1DaGFuZ2VkUm93cyArICIgdXNpbmcgIiArIHZhbHVlcyArICIgYW5kICIgKyBzcWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bUNoYW5nZWRSb3dzOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5leGVjdXRlVXBkYXRlRGVsZXRlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciB1cGRhdGluZyAiICsgdmFsdWVzICsgIiB1c2luZyAiICsgc3FsKTsKLSAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsIENSRUFURQotICAgICAqIFRBQkxFLCBERUxFVEUsIElOU0VSVCwgZXRjLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSA7cyBhcmUgbm90Ci0gICAgICogc3VwcG9ydGVkLiBpdCB0YWtlcyBhIHdyaXRlIGxvY2sKKyAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBOT1QgYSBTRUxFQ1QKKyAgICAgKiBvciBhbnkgb3RoZXIgU1FMIHN0YXRlbWVudCB0aGF0IHJldHVybnMgZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBoYXMgbm8gbWVhbnMgdG8gcmV0dXJuIGFueSBkYXRhIChzdWNoIGFzIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgcm93cykuCisgICAgICogSW5zdGVhZCwgeW91J3JlIGVuY291cmFnZWQgdG8gdXNlIHtAbGluayAjaW5zZXJ0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX0sCisgICAgICoge0BsaW5rICN1cGRhdGUoU3RyaW5nLCBDb250ZW50VmFsdWVzLCBTdHJpbmcsIFN0cmluZ1tdKX0sIGV0IGFsLCB3aGVuIHBvc3NpYmxlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHVzaW5nIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0sIGpvdXJuYWxfbW9kZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgbWFuYWdlZCBieSB0aGlzIGNsYXNzLiBTbywgZG8gbm90IHNldCBqb3VybmFsX21vZGUKKyAgICAgKiB1c2luZyAiUFJBR01BIGpvdXJuYWxfbW9kZSc8dmFsdWU+IiBzdGF0ZW1lbnQgaWYgeW91ciBhcHAgaXMgdXNpbmcKKyAgICAgKiB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9CisgICAgICogPC9wPgogICAgICAqCisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZC4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyBhcmUKKyAgICAgKiBub3Qgc3VwcG9ydGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY1NRTChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7CisgICAgICAgIGludCBzdG10VHlwZSA9IERhdGFiYXNlVXRpbHMuZ2V0U3FsU3RhdGVtZW50VHlwZShzcWwpOworICAgICAgICBpZiAoc3RtdFR5cGUgPT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQVRUQUNIKSB7CisgICAgICAgICAgICBkaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgfQogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgbG9nVGltZVN0YXQobUxhc3RTcWxTdGF0ZW1lbnQsIHRpbWVTdGFydCwgR0VUX0xPQ0tfTE9HX1BSRUZJWCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTChzcWwpOwotICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVNxbChzcWwsIG51bGwpOwogCisgICAgICAgIGlmIChzdG10VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9BVFRBQ0gpIHsKKyAgICAgICAgICAgIG1IYXNBdHRhY2hlZERicyA9IHRydWU7CisgICAgICAgIH0KICAgICAgICAgLy8gTG9nIGNvbW1pdCBzdGF0ZW1lbnRzIGFsb25nIHdpdGggdGhlIG1vc3QgcmVjZW50bHkgZXhlY3V0ZWQKLSAgICAgICAgLy8gU1FMIHN0YXRlbWVudCBmb3IgZGlzYW1iaWd1YXRpb24uICBOb3RlIHRoYXQgaW5zdGFuY2UKLSAgICAgICAgLy8gZXF1YWxpdHkgdG8gQ09NTUlUX1NRTCBpcyBzYWZlIGhlcmUuCi0gICAgICAgIGlmIChzcWwgPT0gQ09NTUlUX1NRTCkgeworICAgICAgICAvLyBTUUwgc3RhdGVtZW50IGZvciBkaXNhbWJpZ3VhdGlvbi4KKyAgICAgICAgaWYgKHN0bXRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0NPTU1JVCkgewogICAgICAgICAgICAgbG9nVGltZVN0YXQobUxhc3RTcWxTdGF0ZW1lbnQsIHRpbWVTdGFydCwgQ09NTUlUX1NRTCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBsb2dUaW1lU3RhdChzcWwsIHRpbWVTdGFydCwgbnVsbCk7CkBAIC0xNzU5LDY1ICsxODUzLDEwMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudCB0aGF0IGlzIG5vdCBhIHF1ZXJ5LiBGb3IgZXhhbXBsZSwgQ1JFQVRFCi0gICAgICogVEFCTEUsIERFTEVURSwgSU5TRVJULCBldGMuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IDtzIGFyZSBub3QKLSAgICAgKiBzdXBwb3J0ZWQuIGl0IHRha2VzIGEgd3JpdGUgbG9jaywKKyAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBOT1QgYSBTRUxFQ1QvSU5TRVJUL1VQREFURS9ERUxFVEUuCisgICAgICogPHA+CisgICAgICogRm9yIElOU0VSVCBzdGF0ZW1lbnRzLCB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNpbnNlcnQoU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNpbnNlcnRPclRocm93KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0V2l0aE9uQ29uZmxpY3QoU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIGludCl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBVUERBVEUgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjdXBkYXRlKFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI3VwZGF0ZVdpdGhPbkNvbmZsaWN0KFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSwgaW50KX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRm9yIERFTEVURSBzdGF0ZW1lbnRzLCB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNkZWxldGUoU3RyaW5nLCBTdHJpbmcsIFN0cmluZ1tdKX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYXJlIGdvb2QgY2FuZGlkYXRlcyBmb3IgdXNpbmcgdGhpcyBtZXRob2Q6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFMVEVSIFRBQkxFPC9saT4KKyAgICAgKiAgIDxsaT5DUkVBVEUgb3IgRFJPUCB0YWJsZSAvIHRyaWdnZXIgLyB2aWV3IC8gaW5kZXggLyB2aXJ0dWFsIHRhYmxlPC9saT4KKyAgICAgKiAgIDxsaT5SRUlOREVYPC9saT4KKyAgICAgKiAgIDxsaT5SRUxFQVNFPC9saT4KKyAgICAgKiAgIDxsaT5TQVZFUE9JTlQ8L2xpPgorICAgICAqICAgPGxpPlBSQUdNQSB0aGF0IHJldHVybnMgbm8gZGF0YTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB1c2luZyB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LCBqb3VybmFsX21vZGUgaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gU28sIGRvIG5vdCBzZXQgam91cm5hbF9tb2RlCisgICAgICogdXNpbmcgIlBSQUdNQSBqb3VybmFsX21vZGUnPHZhbHVlPiIgc3RhdGVtZW50IGlmIHlvdXIgYXBwIGlzIHVzaW5nCisgICAgICoge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfQorICAgICAqIDwvcD4KICAgICAgKgotICAgICAqIEBwYXJhbSBzcWwKKyAgICAgKiBAcGFyYW0gc3FsIHRoZSBTUUwgc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSBzZW1pY29sb25zIGFyZQorICAgICAqIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQHBhcmFtIGJpbmRBcmdzIG9ubHkgYnl0ZVtdLCBTdHJpbmcsIExvbmcgYW5kIERvdWJsZSBhcmUgc3VwcG9ydGVkIGluIGJpbmRBcmdzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY1NRTChTdHJpbmcgc3FsLCBPYmplY3RbXSBiaW5kQXJncykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwogICAgICAgICBpZiAoYmluZEFyZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW1wdHkgYmluZEFyZ3MiKTsKICAgICAgICAgfQorICAgICAgICBleGVjdXRlU3FsKHNxbCwgYmluZEFyZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGV4ZWN1dGVTcWwoU3RyaW5nIHNxbCwgT2JqZWN0W10gYmluZEFyZ3MpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIGludCBuOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwsIGJpbmRBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKLSAgICAgICAgICAgIGlmIChiaW5kQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bUFyZ3MgPSBiaW5kQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgaSArIDEsIGJpbmRBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOworICAgICAgICAgICAgbiA9IHN0YXRlbWVudC5leGVjdXRlVXBkYXRlRGVsZXRlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgbG9nVGltZVN0YXQoc3FsLCB0aW1lU3RhcnQpOworICAgICAgICByZXR1cm4gbjsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKGlzT3BlbigpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJjbG9zZSgpIHdhcyBuZXZlciBleHBsaWNpdGx5IGNhbGxlZCBvbiBkYXRhYmFzZSAnIiArCi0gICAgICAgICAgICAgICAgICAgIG1QYXRoICsgIicgIiwgbVN0YWNrVHJhY2UpOwotICAgICAgICAgICAgY2xvc2VDbG9zYWJsZSgpOwotICAgICAgICAgICAgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2xvc2UoKSB3YXMgbmV2ZXIgZXhwbGljaXRseSBjYWxsZWQgb24gZGF0YWJhc2UgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGggKyAiJyAiLCBtU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgY2xvc2VDbG9zYWJsZSgpOworICAgICAgICAgICAgICAgIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZUN1c3RvbUZ1bmN0aW9ucygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IuIFNlZSB7QGxpbmsgI2NyZWF0ZX0gYW5kIHtAbGluayAjb3BlbkRhdGFiYXNlfS4KKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKICAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSB0byB1c2Ugd2hlbiBjcmVhdGluZyBjdXJzb3JzLCBtYXkgYmUgTlVMTC4KICAgICAgKiBAcGFyYW0gZmxhZ3MgMCBvciB7QGxpbmsgI05PX0xPQ0FMSVpFRF9DT0xMQVRPUlN9LiAgSWYgdGhlIGRhdGFiYXNlIGZpbGUgYWxyZWFkeQogICAgICAqICAgICAgICAgICAgICBleGlzdHMsIG1GbGFncyB3aWxsIGJlIHVwZGF0ZWQgYXBwcm9wcmlhdGVseS4KKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIFRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uIG1heSBiZSBOVUxMLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTnVtIDAgZm9yIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuIDEuLk4gZm9yIHBvb2xlZCBkYXRhYmFzZQorICAgICAqIGNvbm5lY3Rpb24gaGFuZGxlcy4KICAgICAgKi8KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncykgeworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyLCBzaG9ydCBjb25uZWN0aW9uTnVtKSB7CiAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhdGggc2hvdWxkIG5vdCBiZSBudWxsIik7CiAgICAgICAgIH0KQEAgLTE4MjYsMjUgKzE5NTUsMTEgQEAKICAgICAgICAgbVNsb3dRdWVyeVRocmVzaG9sZCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KExPR19TTE9XX1FVRVJJRVNfUFJPUEVSVFksIC0xKTsKICAgICAgICAgbVN0YWNrVHJhY2UgPSBuZXcgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24oKS5maWxsSW5TdGFja1RyYWNlKCk7CiAgICAgICAgIG1GYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgZGJvcGVuKG1QYXRoLCBtRmxhZ3MpOwotICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICBtVGltZU9wZW5lZCA9IGdldFRpbWUoKTsKLSAgICAgICAgfQogICAgICAgICBtUHJvZ3JhbXMgPSBuZXcgV2Vha0hhc2hNYXA8U1FMaXRlQ2xvc2FibGUsT2JqZWN0PigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0TG9jYWxlKExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzZXRMb2NhbGUoKSB3aGVuIGNvbnN0cnVjdGluZywgY2xvc2luZyB0aGUgZGF0YWJhc2UiLCBlKTsKLSAgICAgICAgICAgIGRiY2xvc2UoKTsKLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBtVGltZUNsb3NlZCA9IGdldFRpbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUaW1lKCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MuU1NTICIpLmZvcm1hdChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIC8vIFNldCB0aGUgRGF0YWJhc2VFcnJvckhhbmRsZXIgdG8gYmUgdXNlZCB3aGVuIFNRTGl0ZSByZXBvcnRzIGNvcnJ1cHRpb24uCisgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgc2V0cyBlcnJvckhhbmRsZXIgPSBudWxsLCB0aGVuIHVzZSBkZWZhdWx0IGVycm9yaGFuZGxlci4KKyAgICAgICAgbUVycm9ySGFuZGxlciA9IChlcnJvckhhbmRsZXIgPT0gbnVsbCkgPyBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkgOiBlcnJvckhhbmRsZXI7CisgICAgICAgIG1Db25uZWN0aW9uTnVtID0gY29ubmVjdGlvbk51bTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5MDEsNyArMjAxNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGR1cmF0aW9uTWlsbGlzID49IHNRdWVyeUxvZ1RpbWVJbk1pbGxpcykgewogICAgICAgICAgICAgc2FtcGxlUGVyY2VudCA9IDEwMDsKLSAgICAgICAgfSBlbHNlIHs7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzYW1wbGVQZXJjZW50ID0gKGludCkgKDEwMCAqIGR1cmF0aW9uTWlsbGlzIC8gc1F1ZXJ5TG9nVGltZUluTWlsbGlzKSArIDE7CiAgICAgICAgICAgICBpZiAobVJhbmRvbS5uZXh0SW50KDEwMCkgPj0gc2FtcGxlUGVyY2VudCkgcmV0dXJuOwogICAgICAgICB9CkBAIC0xOTcwLDY2ICsyMDg1LDYyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKgotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKgotICAgICAqICAgICAgIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBkZWFsIHdpdGggY29tcGlsZWQtc3FsIGNhY2hlCi0gICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB2ZXJpZnlEYklzT3BlbigpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIGdldFBhdGgoKSArICIgKGNvbm4jICIgKworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbk51bSArICIpIGFscmVhZHkgY2xvc2VkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgdmVyaWZ5TG9ja093bmVyKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBpZiAobUxvY2tpbmdFbmFibGVkICYmICFpc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRvbid0IGhhdmUgZGF0YWJhc2UgbG9jayEiKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgotICAgICAqIGFkZHMgdGhlIGdpdmVuIHNxbCBhbmQgaXRzIGNvbXBpbGVkLXN0YXRlbWVudC1pZC1yZXR1cm5lZC1ieS1zcWxpdGUgdG8gdGhlCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gU1FMIGFuZCBpdHMgY29tcGlsZWQtc3RhdGVtZW50LWlkLXJldHVybmVkLWJ5LXNxbGl0ZSB0byB0aGUKICAgICAgKiBjYWNoZSBvZiBjb21waWxlZFF1ZXJpZXMgYXR0YWNoZWQgdG8gJ3RoaXMnLgotICAgICAqCi0gICAgICogaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gaW4gY29tcGlsZWRRdWVyaWVzIGZvciB0aGUgZ2l2ZW4gc3FsLAorICAgICAqIDxwPgorICAgICAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGluIGNvbXBpbGVkUXVlcmllcyBmb3IgdGhlIGdpdmVuIFNRTCwKICAgICAgKiB0aGUgbmV3IHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gb2JqZWN0IGlzIE5PVCBpbnNlcnRlZCBpbnRvIHRoZSBjYWNoZSAoaS5lLix0aGUgY3VycmVudAogICAgICAqIG1hcHBpbmcgaXMgTk9UIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBtYXBwaW5nKS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgYWRkVG9Db21waWxlZFF1ZXJpZXMoU3RyaW5nIHNxbCwgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQpIHsKLSAgICAgICAgaWYgKG1NYXhTcWxDYWNoZVNpemUgPT0gMCkgewotICAgICAgICAgICAgLy8gZm9yIHRoaXMgZGF0YWJhc2UsIHRoZXJlIGlzIG5vIGNhY2hlIG9mIGNvbXBpbGVkIHNxbC4KLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8Tk9UIGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArIHNxbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFNxbCA9IG51bGw7CiAgICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7CiAgICAgICAgICAgICAvLyBkb24ndCBpbnNlcnQgdGhlIG5ldyBtYXBwaW5nIGlmIGEgbWFwcGluZyBhbHJlYWR5IGV4aXN0cwotICAgICAgICAgICAgY29tcGlsZWRTcWwgPSBtQ29tcGlsZWRRdWVyaWVzLmdldChzcWwpOwotICAgICAgICAgICAgaWYgKGNvbXBpbGVkU3FsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtQ29tcGlsZWRRdWVyaWVzLmNvbnRhaW5zS2V5KHNxbCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhZGQgdGhpcyA8c3FsLCBjb21waWxlZFN0YXRlbWVudD4gdG8gdGhlIGNhY2hlCi0gICAgICAgICAgICBpZiAobUNvbXBpbGVkUXVlcmllcy5zaXplKCkgPT0gbU1heFNxbENhY2hlU2l6ZSkgeworCisgICAgICAgICAgICBpbnQgbWF4Q2FjaGVTeiA9IChtQ29ubmVjdGlvbk51bSA9PSAwKSA/IG1NYXhTcWxDYWNoZVNpemUgOgorICAgICAgICAgICAgICAgICAgICBtUGFyZW50Q29ubk9iai5tTWF4U3FsQ2FjaGVTaXplOworICAgICAgICAgICAgYm9vbGVhbiBwcmludFdhcm5pbmcgPQorICAgICAgICAgICAgICAgICAgICAobUNvbm5lY3Rpb25OdW0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICghbUNhY2hlRnVsbFdhcm5pbmcgJiYgbUNvbXBpbGVkUXVlcmllcy5zaXplKCkgPT0gbWF4Q2FjaGVTeikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICghbVBhcmVudENvbm5PYmoubUNhY2hlRnVsbFdhcm5pbmcgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyZW50Q29ubk9iai5tQ29tcGlsZWRRdWVyaWVzLnNpemUoKSA9PSBtYXhDYWNoZVN6KTsKKyAgICAgICAgICAgaWYgKHByaW50V2FybmluZykgewogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogY2FjaGUgc2l6ZSBvZiB7QGxpbmsgI21NYXhTcWxDYWNoZVNpemV9IGlzIG5vdCBlbm91Z2ggZm9yIHRoaXMgYXBwLgotICAgICAgICAgICAgICAgICAqIGxvZyBhIHdhcm5pbmcgTUFYX1dBUk5JTkdTX09OX0NBQ0hFU0laRV9DT05ESVRJT04gdGltZXMKLSAgICAgICAgICAgICAgICAgKiBjaGFuY2VzIGFyZSBpdCBpcyBOT1QgdXNpbmcgPyBmb3IgYmluZGFyZ3MgLSBzbyBjYWNoaW5nIGlzIHVzZWxlc3MuCi0gICAgICAgICAgICAgICAgICogVE9ETzogZWl0aGVyIGxldCB0aGUgY2FsbGVycyBzZXQgbWF4IGNjaGVzaXplIGZvciB0aGVpciBhcHAsIG9yIGludGVsbGlnZW50bHkKLSAgICAgICAgICAgICAgICAgKiBmaWd1cmUgb3V0IHdoYXQgc2hvdWxkIGJlIGNhY2hlZCBmb3IgYSBnaXZlbiBhcHAuCisgICAgICAgICAgICAgICAgICogbG9nIGEgd2FybmluZy4KKyAgICAgICAgICAgICAgICAgKiBjaGFuY2VzIGFyZSBpdCBpcyBOT1QgdXNpbmcgPyBmb3IgYmluZGFyZ3MgLSBvciBjYWNoZXNpemUgaXMgdG9vIHNtYWxsLgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICgrK21DYWNoZUZ1bGxXYXJuaW5ncyA9PSBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTikgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWFjaGVkIE1BWCBzaXplIGZvciBjb21waWxlZC1zcWwgc3RhdGVtZW50IGNhY2hlIGZvciBkYXRhYmFzZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAiOyBpLmUuLCBOTyBzcGFjZSBmb3IgdGhpcyBzcWwgc3RhdGVtZW50IGluIGNhY2hlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWwgKyAiLiBQbGVhc2UgY2hhbmdlIHlvdXIgc3FsIHN0YXRlbWVudHMgdG8gdXNlICc/JyBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpbmRhcmdzLCBpbnN0ZWFkIG9mIHVzaW5nIGFjdHVhbCB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWRkIHRoaXMgZW50cnkgdG8gY2FjaGUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgTk9UIGZ1bGwuIGFkZCB0aGlzIHRvIGNhY2hlLgotICAgICAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMucHV0KHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5zaXplKCkgKyAifCIgKyBzcWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWFjaGVkIE1BWCBzaXplIGZvciBjb21waWxlZC1zcWwgc3RhdGVtZW50IGNhY2hlIGZvciBkYXRhYmFzZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICIuIFVzZSBzZXRNYXhTcWxDYWNoZVNpemUoKSB0byBpbmNyZWFzZSBjYWNoZXNpemUuICIpOworICAgICAgICAgICAgICAgIG1DYWNoZUZ1bGxXYXJuaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICAvKiBhZGQgdGhlIGdpdmVuIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50IHRvIGNhY2hlLgorICAgICAgICAgICAgICogbm8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgY2FjaGUgc2l6ZSAtIGJlY2F1c2Uge0BsaW5rICNtQ29tcGlsZWRRdWVyaWVzfQorICAgICAgICAgICAgICogc2VsZi1saW1pdHMgaXRzIHNpemUgdG8ge0BsaW5rICNtTWF4U3FsQ2FjaGVTaXplfS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5wdXQoc3FsLCBjb21waWxlZFN0YXRlbWVudCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwogICAgIH0KIAotCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWxsb2NDYWNoZWRTcWxTdGF0ZW1lbnRzKCkgeworICAgIC8qKiBwYWNrYWdlLWxldmVsIGFjY2VzcyBmb3IgdGVzdGluZyBwdXJwb3NlcyAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBkZWFsbG9jQ2FjaGVkU3FsU3RhdGVtZW50cygpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQ29tcGlsZWRRdWVyaWVzKSB7CiAgICAgICAgICAgICBmb3IgKFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3FsIDogbUNvbXBpbGVkUXVlcmllcy52YWx1ZXMoKSkgewogICAgICAgICAgICAgICAgIGNvbXBpbGVkU3FsLnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKQEAgLTIwMzksMTk5ICsyMTUwLDQ2NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIGZyb20gdGhlIGNvbXBpbGVkUXVlcmllcyBjYWNoZSwgcmV0dXJucyB0aGUgY29tcGlsZWQtc3RhdGVtZW50LWlkIGZvciB0aGUgZ2l2ZW4gc3FsLgotICAgICAqIHJldHVybnMgbnVsbCwgaWYgbm90IGZvdW5kIGluIHRoZSBjYWNoZS4KKyAgICAgKiBGcm9tIHRoZSBjb21waWxlZFF1ZXJpZXMgY2FjaGUsIHJldHVybnMgdGhlIGNvbXBpbGVkLXN0YXRlbWVudC1pZCBmb3IgdGhlIGdpdmVuIFNRTC4KKyAgICAgKiBSZXR1cm5zIG51bGwsIGlmIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVDb21waWxlZFNxbCBnZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChTdHJpbmcgc3FsKSB7Ci0gICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50ID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBjYWNoZUhpdDsKLSAgICAgICAgc3luY2hyb25pemVkKG1Db21waWxlZFF1ZXJpZXMpIHsKLSAgICAgICAgICAgIGlmIChtTWF4U3FsQ2FjaGVTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBkYXRhYmFzZSwgdGhlcmUgaXMgbm8gY2FjaGUgb2YgY29tcGlsZWQgc3FsLgotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifGNhY2hlIE5PVCBmb3VuZHwiICsgZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobUNvbXBpbGVkUXVlcmllcykgeworICAgICAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQgPSBtQ29tcGlsZWRRdWVyaWVzLmdldChzcWwpOworICAgICAgICAgICAgaWYgKGNvbXBpbGVkU3RhdGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTnVtQ2FjaGVNaXNzZXMrKzsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhY2hlSGl0ID0gKGNvbXBpbGVkU3RhdGVtZW50ID0gbUNvbXBpbGVkUXVlcmllcy5nZXQoc3FsKSkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FjaGVIaXQpIHsKICAgICAgICAgICAgIG1OdW1DYWNoZUhpdHMrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1OdW1DYWNoZU1pc3NlcysrOworICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVkU3RhdGVtZW50OwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgTG9nLnYoVEFHLCAifGNhY2hlX3N0YXRzfCIgKwotICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAifCIgKyBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArCi0gICAgICAgICAgICAgICAgICAgICJ8IiArIG1OdW1DYWNoZUhpdHMgKyAifCIgKyBtTnVtQ2FjaGVNaXNzZXMgKwotICAgICAgICAgICAgICAgICAgICAifCIgKyBjYWNoZUhpdCArICJ8IiArIG1UaW1lT3BlbmVkICsgInwiICsgbVRpbWVDbG9zZWQgKyAifCIgKyBzcWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21waWxlZFN0YXRlbWVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNxbCBpcyBjYWNoZWQgaW4gY29tcGlsZWQtc3FsIGNhY2hlLgotICAgICAqIEBoaWRlCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBwcmVwYXJlZC1zdGF0ZW1lbnQgY2FjaGUgZm9yIHRoaXMgZGF0YWJhc2UuCisgICAgICogKHNpemUgb2YgdGhlIGNhY2hlID0gbnVtYmVyIG9mIGNvbXBpbGVkLXNxbC1zdGF0ZW1lbnRzIHN0b3JlZCBpbiB0aGUgY2FjaGUpLgorICAgICAqPHA+CisgICAgICogTWF4aW11bSBjYWNoZSBzaXplIGNhbiBPTkxZIGJlIGluY3JlYXNlZCBmcm9tIGl0cyBjdXJyZW50IHNpemUgKGRlZmF1bHQgPSAxMCkuCisgICAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggc21hbGxlciBzaXplIHRoYW4gdGhlIGN1cnJlbnQgbWF4aW11bSB2YWx1ZSwKKyAgICAgKiB0aGVuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICo8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aHJlYWQtc2FmZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWNoZVNpemUgdGhlIHNpemUgb2YgdGhlIGNhY2hlLiBjYW4gYmUgKDAgdG8ge0BsaW5rICNNQVhfU1FMX0NBQ0hFX1NJWkV9KQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGlucHV0IGNhY2hlU2l6ZSA+IHtAbGluayAjTUFYX1NRTF9DQUNIRV9TSVpFfSBvcgorICAgICAqIHRoZSB2YWx1ZSBzZXQgd2l0aCBwcmV2aW91cyBzZXRNYXhTcWxDYWNoZVNpemUoKSBjYWxsLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW5Db21waWxlZFNxbENhY2hlKFN0cmluZyBzcWwpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhTcWxDYWNoZVNpemUoaW50IGNhY2hlU2l6ZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgeworICAgICAgICAgICAgaWYgKGNhY2hlU2l6ZSA+IE1BWF9TUUxfQ0FDSEVfU0laRSB8fCBjYWNoZVNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZXhwZWN0ZWQgdmFsdWUgYmV0d2VlbiAwIGFuZCAiICsgTUFYX1NRTF9DQUNIRV9TSVpFKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FjaGVTaXplIDwgbU1heFNxbENhY2hlU2l6ZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBzZXQgY2FjaGVTaXplIHRvIGEgdmFsdWUgbGVzcyB0aGFuIHRoZSB2YWx1ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgd2l0aCBwcmV2aW91cyBzZXRNYXhTcWxDYWNoZVNpemUoKSBjYWxsLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1heFNxbENhY2hlU2l6ZSA9IGNhY2hlU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc0luU3RhdGVtZW50Q2FjaGUoU3RyaW5nIHNxbCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db21waWxlZFF1ZXJpZXMpIHsKICAgICAgICAgICAgIHJldHVybiBtQ29tcGlsZWRRdWVyaWVzLmNvbnRhaW5zS2V5KHNxbCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBwdXJnZXMgdGhlIGdpdmVuIHNxbCBmcm9tIHRoZSBjb21waWxlZC1zcWwgY2FjaGUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXJnZUZyb21Db21waWxlZFNxbENhY2hlKFN0cmluZyBzcWwpIHsKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVsZWFzZUNvbXBpbGVkU3FsT2JqKFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3FsKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUNvbXBpbGVkUXVlcmllcykgeworICAgICAgICAgICAgaWYgKG1Db21waWxlZFF1ZXJpZXMuY29udGFpbnNWYWx1ZShjb21waWxlZFNxbCkpIHsKKyAgICAgICAgICAgICAgICAvLyBpdCBpcyBpbiBjYWNoZSAtIHJlc2V0IGl0cyBpblVzZSBmbGFnCisgICAgICAgICAgICAgICAgY29tcGlsZWRTcWwucmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpdCBpcyBOT1QgaW4gY2FjaGUuIGZpbmFsaXplIGl0LgorICAgICAgICAgICAgICAgIGNvbXBpbGVkU3FsLnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldENhY2hlSGl0TnVtKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5yZW1vdmUoc3FsKTsKKyAgICAgICAgICAgIHJldHVybiBtTnVtQ2FjaGVIaXRzOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY29tcGlsZWQgc3FsIGNhY2hlCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbXBpbGVkU3FsQ2FjaGUoKSB7CisgICAgcHJpdmF0ZSBpbnQgZ2V0Q2FjaGVNaXNzTnVtKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIG1OdW1DYWNoZU1pc3NlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldENhY2hlc2l6ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1Db21waWxlZFF1ZXJpZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBmaW5hbGl6ZVN0YXRlbWVudExhdGVyKGludCBpZCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBkYXRhYmFzZSBhbHJlYWR5IGNsb3NlZC4gdGhpcyBzdGF0ZW1lbnQgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkKG1DbG9zZWRTdGF0ZW1lbnRJZHMpIHsKKyAgICAgICAgICAgIGlmIChtQ2xvc2VkU3RhdGVtZW50SWRzLmNvbnRhaW5zKGlkKSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RhdGVtZW50IGlkIGlzIGFscmVhZHkgcXVldWVkIHVwIGZvciBmaW5hbGl6YXRpb24uCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5hZGQoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgZGF0YWJhc2UgaXMgYWxyZWFkeSBjbG9zZWQsIG5vIG5lZWQgdG8gZmluYWxpemUgYW55dGhpbmcuCisgICAgICAgICAgICBtQ2xvc2VkU3RhdGVtZW50SWRzLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdmVyaWZ5TG9ja093bmVyKCk7CisgICAgICAgIC8qIHRvIG1pbmltaXplIHN5bmNocm9uaXphdGlvbiBvbiBtQ2xvc2VkU3RhdGVtZW50SWRzLCBtYWtlIGEgY29weSBvZiB0aGUgbGlzdCAqLworICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4obUNsb3NlZFN0YXRlbWVudElkcy5zaXplKCkpOworICAgICAgICBzeW5jaHJvbml6ZWQobUNsb3NlZFN0YXRlbWVudElkcykgeworICAgICAgICAgICAgbGlzdC5hZGRBbGwobUNsb3NlZFN0YXRlbWVudElkcyk7CisgICAgICAgICAgICBtQ2xvc2VkU3RhdGVtZW50SWRzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmluYWxpemUgYWxsIHRoZSBzdGF0ZW1lbnRzIGZyb20gdGhlIGNvcGllZCBsaXN0CisgICAgICAgIGludCBzaXplID0gbGlzdC5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUobGlzdC5nZXQoaSkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHRoZSBjdXJyZW50IG1heENhY2hlU3FsQ2FjaGVTaXplCi0gICAgICogQGhpZGUKKyAgICAgKiBmb3IgdGVzdGluZyBvbmx5CiAgICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TWF4U3FsQ2FjaGVTaXplKCkgewotICAgICAgICByZXR1cm4gbU1heFNxbENhY2hlU2l6ZTsKKyAgICAvKiBwYWNrYWdlICovIEFycmF5TGlzdDxJbnRlZ2VyPiBnZXRRdWV1ZWRVcFN0bXRMaXN0KCkgeworICAgICAgICByZXR1cm4gbUNsb3NlZFN0YXRlbWVudElkczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBzZXQgdGhlIG1heCBzaXplIG9mIHRoZSBjb21waWxlZCBzcWwgY2FjaGUgZm9yIHRoaXMgZGF0YWJhc2UgYWZ0ZXIgcHVyZ2luZyB0aGUgY2FjaGUuCi0gICAgICogKHNpemUgb2YgdGhlIGNhY2hlID0gbnVtYmVyIG9mIGNvbXBpbGVkLXNxbC1zdGF0ZW1lbnRzIHN0b3JlZCBpbiB0aGUgY2FjaGUpLgorICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqIEl0IGRvZXMgdGhpcyBieSBvcGVuaW5nIG11bHRpcGxlIGhhbmRsZXMgdG8gdGhlIGRhdGFiYXNlIGFuZCB1c2luZyBhIGRpZmZlcmVudAorICAgICAqIGRhdGFiYXNlIGhhbmRsZSBmb3IgZWFjaCBxdWVyeS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzIG9uIG9uZSBjb25uZWN0aW9uIGhhbmRsZSBhbmQgc2F5LCBhIHRhYmxlIGlzIHVwZGF0ZWQgaW4gdGhlCisgICAgICogdHJhbnNhY3Rpb24sIHRoZW4gcXVlcnkgb24gdGhlIHNhbWUgdGFibGUgb24gYW5vdGhlciBjb25uZWN0aW9uIGhhbmRsZSB3aWxsIGJsb2NrIGZvciB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZS4gQnV0IHRoaXMgbWV0aG9kIGVuYWJsZXMgc3VjaCBxdWVyaWVzIHRvIGV4ZWN1dGUgYnkgaGF2aW5nIHRoZW0KKyAgICAgKiByZXR1cm4gb2xkIHZlcnNpb24gb2YgdGhlIGRhdGEgZnJvbSB0aGUgdGFibGUuIE1vc3Qgb2Z0ZW4gaXQgaXMgdGhlIGRhdGEgdGhhdCBleGlzdGVkIGluIHRoZQorICAgICAqIHRhYmxlIHByaW9yIHRvIHRoZSBhYm92ZSB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIHRoYXQgdGFibGUuCisgICAgICogPHA+CisgICAgICogTWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGhhbmRsZXMgdXNlZCB0byBleGVjdXRlIHF1ZXJpZXMgaW4gcGFyYWxsZWwgaXMKKyAgICAgKiBkZXBlbmRlbnQgdXBvbiB0aGUgZGV2aWNlIG1lbW9yeSBhbmQgcG9zc2libHkgb3RoZXIgcHJvcGVydGllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBleGVjdXRpb24gb2YgcXVlcmllcyBpbiBwYXJhbGxlbCBpcyBlbmFibGVkIGFzIGxvbmcgYXMgdGhpcworICAgICAqIGRhdGFiYXNlIGhhbmRsZSBpcyBvcGVuLiBUbyBkaXNhYmxlIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGluIHBhcmFsbGVsLCBkYXRhYmFzZSBzaG91bGQKKyAgICAgKiBiZSBjbG9zZWQgYW5kIHJlb3BlbmVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgcXVlcnkgaXMgcGFydCBvZiBhIHRyYW5zYWN0aW9uLCB0aGVuIGl0IGlzIGV4ZWN1dGVkIG9uIHRoZSBzYW1lIGRhdGFiYXNlIGhhbmRsZSB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiB3YXMgYmVndW4uCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGRhdGFiYXNlIGhhcyBhbnkgYXR0YWNoZWQgZGF0YWJhc2VzLCB0aGVuIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGluIHBhcmFsZWwgaXMgTk9UCisgICAgICogcG9zc2libGUuIEluIHN1Y2ggY2FzZXMsIGEgbWVzc2FnZSBpcyBwcmludGVkIHRvIGxvZ2NhdCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogPHA+CisgICAgICogVGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgZm9yIDptZW1vcnk6IGRhdGFiYXNlcy4gSW4gc3VjaCBjYXNlcywKKyAgICAgKiBhIG1lc3NhZ2UgaXMgcHJpbnRlZCB0byBsb2djYXQgYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIDxwPgorICAgICAqIEEgdHlwaWNhbCB3YXkgdG8gdXNlIHRoaXMgbWV0aG9kIGlzIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHByZT4KKyAgICAgKiAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UoImRiX2ZpbGVuYW1lIiwgY3Vyc29yRmFjdG9yeSwKKyAgICAgKiAgICAgICAgICAgICBDUkVBVEVfSUZfTkVDRVNTQVJZLCBteURhdGFiYXNlRXJyb3JIYW5kbGVyKTsKKyAgICAgKiAgICAgZGIuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiBXcml0ZXJzIHNob3VsZCB1c2Uge0BsaW5rICNiZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCl9IG9yCisgICAgICoge0BsaW5rICNiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIpfQorICAgICAqIHRvIHN0YXJ0IGEgdHJzbnNhY3Rpb24uCisgICAgICogTm9uLWV4Y2x1c2l2ZSBtb2RlIGFsbG93cyBkYXRhYmFzZSBmaWxlIHRvIGJlIGluIHJlYWRhYmxlIGJ5IHRocmVhZHMgZXhlY3V0aW5nIHF1ZXJpZXMuCisgICAgICogPC9wPgogICAgICAqCi0gICAgICogbWF4IGNhY2hlIHNpemUgY2FuIE9OTFkgYmUgaW5jcmVhc2VkIGZyb20gaXRzIGN1cnJlbnQgc2l6ZSAoZGVmYXVsdCA9IDApLgotICAgICAqIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHNtYWxsZXIgc2l6ZSB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9mIG1NYXhTcWxDYWNoZVNpemUsCi0gICAgICogdGhlbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duCi0gICAgICoKLSAgICAgKiBzeW5jaHJvbml6ZWQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHQgdGhyZWFkcyB0byBjaGFuZ2UgY2FjaGUgc2l6ZSBhdCB0aGUgc2FtZSB0aW1lLgotICAgICAqIEBwYXJhbSBjYWNoZVNpemUgdGhlIHNpemUgb2YgdGhlIGNhY2hlLiBjYW4gYmUgKDAgdG8gTUFYX1NRTF9DQUNIRV9TSVpFKQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGlucHV0IGNhY2hlU2l6ZSA+IE1BWF9TUUxfQ0FDSEVfU0laRSBvciA8IDAgb3IKLSAgICAgKiA8IHRoZSB2YWx1ZSBzZXQgd2l0aCBwcmV2aW91cyBzZXRNYXhTcWxDYWNoZVNpemUoKSBjYWxsLgotICAgICAqCi0gICAgICogQGhpZGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgd3JpdGUtYWhlYWQtbG9nZ2luZyBpcyBzZXQuIGZhbHNlIG90aGVyd2lzZQogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNYXhTcWxDYWNoZVNpemUoaW50IGNhY2hlU2l6ZSkgewotICAgICAgICBpZiAoY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIHx8IGNhY2hlU2l6ZSA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGVjdGVkIHZhbHVlIGJldHdlZW4gMCBhbmQgIiArIE1BWF9TUUxfQ0FDSEVfU0laRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2FjaGVTaXplIDwgbU1heFNxbENhY2hlU2l6ZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IHNldCBjYWNoZVNpemUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHZhbHVlICIgKwotICAgICAgICAgICAgICAgICAgICAic2V0IHdpdGggcHJldmlvdXMgc2V0TWF4U3FsQ2FjaGVTaXplKCkgY2FsbC4iKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgLy8gYWNxdWlyZSBsb2NrIC0gbm8gdGhhdCBubyBvdGhlciB0aHJlYWQgaXMgZW5hYmxpbmcgV0FMIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBlbmFibGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJjYW4ndCBlbmFibGUgV0FMIGZvciBtZW1vcnkgZGF0YWJhc2VzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoaXMgZGF0YWJhc2UgaGFzIE5PIGF0dGFjaGVkIGRhdGFiYXNlcyBiZWNhdXNlIHNxbGl0ZSdzIHdyaXRlLWFoZWFkLWxvZ2dpbmcKKyAgICAgICAgICAgIC8vIGRvZXNuJ3Qgd29yayBmb3IgZGF0YWJhc2VzIHdpdGggYXR0YWNoZWQgZGF0YWJhc2VzCisgICAgICAgICAgICBpZiAobUhhc0F0dGFjaGVkRGJzKSB7CisgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgZGF0YWJhc2U6ICIgKyBtUGF0aCArICIgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcy4gY2FuJ3QgIGVuYWJsZSBXQUwuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbCA9IG5ldyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKHRoaXMpOworICAgICAgICAgICAgc2V0Sm91cm5hbE1vZGUobVBhdGgsICJXQUwiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CiAgICAgICAgIH0KLSAgICAgICAgbU1heFNxbENhY2hlU2l6ZSA9IGNhY2hlU2l6ZTsKICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgQWN0aXZlRGF0YWJhc2VzIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWN0aXZlRGF0YWJhc2VzIGFjdGl2ZURhdGFiYXNlcyA9IG5ldyBBY3RpdmVEYXRhYmFzZXMoKTsKLSAgICAgICAgcHJpdmF0ZSBIYXNoU2V0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiBtQWN0aXZlRGF0YWJhc2VzID0KLSAgICAgICAgICAgIG5ldyBIYXNoU2V0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PigpOwotICAgICAgICBwcml2YXRlIEFjdGl2ZURhdGFiYXNlcygpIHt9IC8vIGRpc2FibGUgaW5zdGFudGlhdGlvbiBvZiB0aGlzIGNsYXNzCi0gICAgICAgIHN0YXRpYyBBY3RpdmVEYXRhYmFzZXMgZ2V0SW5zdGFuY2UoKSB7cmV0dXJuIGFjdGl2ZURhdGFiYXNlczt9CisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZGlzYWJsZXMgdGhlIGZlYXR1cmVzIGVuYWJsZWQgYnkge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgLy8gZ3JhYiBkYXRhYmFzZSBsb2NrIHNvIHRoYXQgd3JpdGVBaGVhZExvZ2dpbmcgaXMgbm90IGRpc2FibGVkIGZyb20gMiBkaWZmZXJlbnQgdGhyZWFkcworICAgICAgICAvLyBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgIGxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBkaXNhYmxlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbm5lY3Rpb25Qb29sLmNsb3NlKCk7CisgICAgICAgICAgICBzZXRKb3VybmFsTW9kZShtUGF0aCwgIlRSVU5DQVRFIik7CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wgPSBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGdldERhdGFiYXNlSGFuZGxlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgaWYgKGlzUG9vbGVkQ29ubmVjdGlvbigpKSB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIGEgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIHVzZSBpdCBpZiBpdCBpcyBvcGVuIEFORCBpZiBJIGFtIG5vdCBjdXJyZW50bHkgcGFydCBvZiBhIHRyYW5zYWN0aW9uCisgICAgICAgICAgICBpZiAoaXNPcGVuKCkgJiYgIWFtSUluVHJhbnNhY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBhbm90aGVyIGNvbm5lY3Rpb24gZnJvbSB0aGUgcG9vbAorICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gQU5EIGlmIHRoZXJlIGFyZSBmcmVlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZSBwb29sZWQgY29ubmVjdGlvbiBpcyBub3Qgb3BlbiEgY291bGQgaGF2ZSBiZWVuIGNsb3NlZCBlaXRoZXIgZHVlCisgICAgICAgICAgICAgICAgLy8gdG8gY29ycnVwdGlvbiBvbiB0aGlzIG9yIHNvbWUgb3RoZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UKKyAgICAgICAgICAgICAgICAvLyBPUiwgbWF5YmUgdGhlIGNvbm5lY3Rpb24gcG9vbCBpcyBkaXNhYmxlZCBhZnRlciB0aGlzIGNvbm5lY3Rpb24gaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQgdG8gbWUuIHRyeSB0byBnZXQgc29tZSBvdGhlciBwb29sZWQgb3IgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudERiQ29ubk9iaigpLmdldERiQ29ubmVjdGlvbihzcWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBOT1QgYSBwb29sZWQgY29ubmVjdGlvbi4gY2FuIHdlIGdldCBvbmU/CisgICAgICAgICAgICByZXR1cm4gZ2V0RGJDb25uZWN0aW9uKHNxbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGNyZWF0ZVBvb2xDb25uZWN0aW9uKHNob3J0IGNvbm5lY3Rpb25OdW0pIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBvcGVuRGF0YWJhc2UobVBhdGgsIG1GYWN0b3J5LCBtRmxhZ3MsIG1FcnJvckhhbmRsZXIsIGNvbm5lY3Rpb25OdW0pOworICAgICAgICBkYi5tUGFyZW50Q29ubk9iaiA9IHRoaXM7CisgICAgICAgIHJldHVybiBkYjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXRQYXJlbnREYkNvbm5PYmooKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50Q29ubk9iajsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQb29sZWRDb25uZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQ29ubmVjdGlvbk51bSA+IDA7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBnZXREYkNvbm5lY3Rpb24oU3RyaW5nIHNxbCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuCisgICAgICAgIC8vIHRoZSBvbmx5IHRpbWUgd2hlbiBpdCBpcyBjYWxsZWQgd2l0aCBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgaXMKKyAgICAgICAgLy8gY29ycnVwdGlvbiBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIG9wZW4gYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuCisgICAgICAgIC8vIGluIHRoYXQgY2FzZSwgc2ltcGx5IHJldHVybiAndGhpcycgaGFuZGxlCisgICAgICAgIGlmIChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBoYW5kbGUgaWYKKyAgICAgICAgLy8gMS4gaWYgdGhlIGNhbGxlciBpcyBwYXJ0IG9mIHRoZSBvbmdvaW5nIHRyYW5zYWN0aW9uLCBpZiBhbnkKKyAgICAgICAgLy8gMi4gT1IsIGlmIHRoZXJlIGlzIE5PIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgc2V0dXAKKyAgICAgICAgaWYgKGFtSUluVHJhbnNhY3Rpb24oKSB8fCBtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBnZXQgYSBjb25uZWN0aW9uIGhhbmRsZSBmcm9tIHRoZSBwb29sCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Db25uZWN0aW9uUG9vbCAhPSBudWxsOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbUNvbm5lY3Rpb25Qb29sLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uUG9vbC5nZXQoc3FsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlRGJDb25uZWN0aW9uKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIC8vIGlnbm9yZSB0aGlzIHJlbGVhc2UgY2FsbCBpZgorICAgICAgICAvLyAxLiB0aGUgZGF0YWJhc2UgaXMgY2xvc2VkCisgICAgICAgIC8vIDIuIE9SLCBpZiBkYiBpcyBOT1QgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgLy8gMy4gT1IsIGlmIHRoZSBkYXRhYmFzZSBiZWluZyByZWxlYXNlZCBpcyBzYW1lIGFzICd0aGlzJyAodGhpcyBjb25kaXRpb24gbWVhbnMKKyAgICAgICAgLy8gICAgIHRoYXQgd2Ugc2hvdWxkIGFsd2F5cyBiZSByZWxlYXNpbmcgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUgYnkgY2FsbGluZyB0aGlzIG1ldGhvZAorICAgICAgICAvLyAgICAgZnJvbSB0aGUgJ21haW4nIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgICAgIGlmICghaXNPcGVuKCkgfHwgIWRiLmlzUG9vbGVkQ29ubmVjdGlvbigpIHx8IChkYiA9PSB0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIGFzc2VydCBpc1Bvb2xlZENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGFzc2VydCBtQ29ubmVjdGlvblBvb2wgIT0gbnVsbDsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2VEYkNvbm5lY3Rpb24gdGhyZWFkaWQgPSAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsKKyAgICAgICAgICAgICAgICAgICAgIiwgcmVsZWFzaW5nICMgIiArIGRiLm1Db25uZWN0aW9uTnVtICsgIiwgIiArIGdldFBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rpb25Qb29sLnJlbGVhc2UoZGIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29sbGVjdCBkYXRhIGFib3V0IEFMTCBvcGVuIGRhdGFiYXNlcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzLgotICAgICAqIGJ1Z3JlcG9ydCBpcyBhIHVzZXIgb2YgdGhpcyBkYXRhLiAKKyAgICAgKiBidWdyZXBvcnQgaXMgYSB1c2VyIG9mIHRoaXMgZGF0YS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBBcnJheUxpc3Q8RGJTdGF0cz4gZ2V0RGJTdGF0cygpIHsKICAgICAgICAgQXJyYXlMaXN0PERiU3RhdHM+IGRiU3RhdHNMaXN0ID0gbmV3IEFycmF5TGlzdDxEYlN0YXRzPigpOwotICAgICAgICBmb3IgKFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+IHcgOiBBY3RpdmVEYXRhYmFzZXMuZ2V0SW5zdGFuY2UoKS5tQWN0aXZlRGF0YWJhc2VzKSB7CisgICAgICAgIC8vIG1ha2UgYSBsb2NhbCBjb3B5IG9mIG1BY3RpdmVEYXRhYmFzZXMgLSBzbyB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBjb21wZXRpbmcKKyAgICAgICAgLy8gZm9yIHN5bmNocm9uaXphdGlvbiBsb2NrIG9uIG1BY3RpdmVEYXRhYmFzZXMKKyAgICAgICAgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiB0ZW1wTGlzdDsKKyAgICAgICAgc3luY2hyb25pemVkKG1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgICAgIHRlbXBMaXN0ID0gKEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4pbUFjdGl2ZURhdGFiYXNlcy5jbG9uZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4gdyA6IHRlbXBMaXN0KSB7CiAgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IHcuZ2V0KCk7CiAgICAgICAgICAgICBpZiAoZGIgPT0gbnVsbCB8fCAhZGIuaXNPcGVuKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGdldCBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZm9yIHRoZSBkYgotICAgICAgICAgICAgaW50IGxvb2thc2lkZVVzZWQgPSBkYi5uYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsKIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXN0bm9kZSBvZiB0aGUgZGJuYW1lCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRiLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGludCBpbmR4ID0gcGF0aC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICAgICAgU3RyaW5nIGxhc3Rub2RlID0gcGF0aC5zdWJzdHJpbmcoKGluZHggIT0gLTEpID8gKytpbmR4IDogMCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGdldCBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZm9yIHRoZSBkYgorICAgICAgICAgICAgICAgIGludCBsb29rYXNpZGVVc2VkID0gZGIubmF0aXZlX2dldERiTG9va2FzaWRlKCk7CiAKLSAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGF0dGFjaGVkIGRicyBhbmQgZm9yIGVhY2ggZGIsIGdldCBpdHMgc2l6ZSBhbmQgcGFnZXNpemUKLSAgICAgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBnZXRBdHRhY2hlZERicyhkYik7Ci0gICAgICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBnZXRQcmFnbWFWYWwoZGIsIHAuZmlyc3QgKyAiLnBhZ2VfY291bnQ7Iik7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXN0bm9kZSBvZiB0aGUgZGJuYW1lCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYi5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgaW50IGluZHggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxhc3Rub2RlID0gcGF0aC5zdWJzdHJpbmcoKGluZHggIT0gLTEpID8gKytpbmR4IDogMCk7CiAKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBlbnRyeSBpbiB0aGUgYXR0YWNoZWQgZGIgbGlzdCBpcyBhbHdheXMgdGhlIG1haW4gZGF0YWJhc2UKLSAgICAgICAgICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBwcmVmaXhpbmcgdGhlIGRibmFtZSB3aXRoICJtYWluIgotICAgICAgICAgICAgICAgIFN0cmluZyBkYk5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSBsYXN0bm9kZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBsb29rYXNpZGUgaXMgb25seSByZWxldmFudCBmb3IgdGhlIG1haW4gZGIKLSAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGRiTmFtZSA9ICIgIChhdHRhY2hlZCkgIiArIHAuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhdHRhY2hlZCBkYiBoYXMgYSBwYXRoLCBhdHRhY2ggdGhlIGxhc3Rub2RlIGZyb20gdGhlIHBhdGggdG8gYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgaWYgKHAuc2Vjb25kLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBwLnNlY29uZC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lICs9ICIgOiAiICsgcC5zZWNvbmQuc3Vic3RyaW5nKChpZHggIT0gLTEpID8gKytpZHggOiAwKTsKKyAgICAgICAgICAgICAgICAvLyBnZXQgbGlzdCBvZiBhdHRhY2hlZCBkYnMgYW5kIGZvciBlYWNoIGRiLCBnZXQgaXRzIHNpemUgYW5kIHBhZ2VzaXplCisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0YWNoZWREYnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA9IGF0dGFjaGVkRGJzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwgIlBSQUdNQSAiICsgcC5maXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5wYWdlX2NvdW50OyIsIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVudHJ5IGluIHRoZSBhdHRhY2hlZCBkYiBsaXN0IGlzIGFsd2F5cyB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBwcmVmaXhpbmcgdGhlIGRibmFtZSB3aXRoICJtYWluIgorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGJOYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSBsYXN0bm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2thc2lkZSBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgbWFpbiBkYgorICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSAiICAoYXR0YWNoZWQpICIgKyBwLmZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGF0dGFjaGVkIGRiIGhhcyBhIHBhdGgsIGF0dGFjaCB0aGUgbGFzdG5vZGUgZnJvbSB0aGUgcGF0aCB0byBhYm92ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuc2Vjb25kLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcC5zZWNvbmQubGFzdEluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgKz0gIiA6ICIgKyBwLnNlY29uZC5zdWJzdHJpbmcoKGlkeCAhPSAtMSkgPyArK2lkeCA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoZGJOYW1lLCBwYWdlQ291bnQsIGRiLmdldFBhZ2VTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQsIGRiLmdldENhY2hlSGl0TnVtKCksIGRiLmdldENhY2hlTWlzc051bSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5nZXRDYWNoZXNpemUoKSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwYWdlQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRiU3RhdHNMaXN0LmFkZChuZXcgRGJTdGF0cyhkYk5hbWUsIHBhZ2VDb3VudCwgZGIuZ2V0UGFnZVNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkKSk7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIHBvb2xlZCBjb25uZWN0aW9ucywgcmV0dXJuIHRoZSBjYWNoZSBzdGF0cyBmb3IgdGhlbSBhbHNvLgorICAgICAgICAgICAgICAgIC8vIHdoaWxlIHdlIGFyZSB0cnlpbmcgdG8gcXVlcnkgdGhlIHBvb2xlZCBjb25uZWN0aW9ucyBmb3Igc3RhdHMsIHNvbWUgb3RoZXIgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gY291bGQgYmUgZGlzYWJsaW5nIGNvbm5lY2l0b24gcG9vbC4gc28sIGdyYWIgYSByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24gcG9vbC4KKyAgICAgICAgICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIGNvbm5Qb29sID0gZGIubUNvbm5lY3Rpb25Qb29sOworICAgICAgICAgICAgICAgIGlmIChjb25uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgcERiIDogY29ublBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0c0xpc3QuYWRkKG5ldyBEYlN0YXRzKCIocG9vbGVkICMgIiArIHBEYi5tQ29ubmVjdGlvbk51bSArICIpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsYXN0bm9kZSwgMCwgMCwgMCwgcERiLmdldENhY2hlSGl0TnVtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYi5nZXRDYWNoZU1pc3NOdW0oKSwgcERiLmdldENhY2hlc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZS4gd2UgZG9uJ3QgY2FyZSBhYm91dCBleGNlcHRpb25zIHdoZW4gd2UgYXJlIHRha2luZyBhZGIKKyAgICAgICAgICAgICAgICAvLyBidWdyZXBvcnQhCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGRiU3RhdHNMaXN0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIGdldCB0aGUgc3BlY2lmaWVkIHByYWdtYSB2YWx1ZSBmcm9tIHNxbGl0ZSBmb3IgdGhlIHNwZWNpZmllZCBkYXRhYmFzZS4KLSAgICAgKiBvbmx5IGhhbmRsZXMgcHJhZ21hJ3MgdGhhdCByZXR1cm4gaW50L2xvbmcuCi0gICAgICogTk8gSkFWQSBsb2NrcyBhcmUgaGVsZCBpbiB0aGlzIG1ldGhvZC4KLSAgICAgKiBUT0RPOiB1c2UgdGhpcyB0byBkbyBhbGwgcHJhZ21hJ3MgaW4gdGhpcyBjbGFzcworICAgICAqIFJldHVybnMgbGlzdCBvZiBmdWxsIHBhdGhuYW1lcyBvZiBhbGwgYXR0YWNoZWQgZGF0YWJhc2VzIGluY2x1ZGluZyB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAqIGJ5IGV4ZWN1dGluZyAncHJhZ21hIGRhdGFiYXNlX2xpc3QnIG9uIHRoZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXJyYXlMaXN0IG9mIHBhaXJzIG9mIChkYXRhYmFzZSBuYW1lLCBkYXRhYmFzZSBmaWxlIHBhdGgpIG9yIG51bGwgaWYgdGhlIGRhdGFiYXNlCisgICAgICogaXMgbm90IG9wZW4uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRQcmFnbWFWYWwoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBwcmFnbWEpIHsKLSAgICAgICAgaWYgKCFkYi5pc09wZW4oKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQoZGIsICJQUkFHTUEgIiArIHByYWdtYSk7Ci0gICAgICAgICAgICBsb25nIHZhbCA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyBsaXN0IG9mIGZ1bGwgcGF0aG5hbWVzIG9mIGFsbCBhdHRhY2hlZCBkYXRhYmFzZXMKLSAgICAgKiBpbmNsdWRpbmcgdGhlIG1haW4gZGF0YWJhc2UKLSAgICAgKiBUT0RPOiBtb3ZlIHRoaXMgdG8ge0BsaW5rIERhdGFiYXNlVXRpbHN9Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBnZXRBdHRhY2hlZERicyhTUUxpdGVEYXRhYmFzZSBkYk9iaikgewotICAgICAgICBpZiAoIWRiT2JqLmlzT3BlbigpKSB7CisgICAgcHVibGljIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZ2V0QXR0YWNoZWREYnMoKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBuZXcgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICBDdXJzb3IgYyA9IGRiT2JqLnJhd1F1ZXJ5KCJwcmFnbWEgZGF0YWJhc2VfbGlzdDsiLCBudWxsKTsKLSAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgYXR0YWNoZWREYnMuYWRkKG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPihjLmdldFN0cmluZygxKSwgYy5nZXRTdHJpbmcoMikpKTsKKyAgICAgICAgaWYgKCFtSGFzQXR0YWNoZWREYnMpIHsKKyAgICAgICAgICAgIC8vIE5vIGF0dGFjaGVkIGRhdGFiYXNlcy4KKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgc21hbGwgd2luZG93IHdoZXJlIGF0dGFjaGVkIGRhdGFiYXNlcyBleGlzdCBidXQgdGhpcyBmbGFnIGlzIG5vdCBzZXQgeWV0LgorICAgICAgICAgICAgLy8gVGhpcyBjYW4gb2NjdXIgd2hlbiB0aGlzIHRocmVhZCBpcyBpbiBhIHJhY2UgY29uZGl0aW9uIHdpdGggYW5vdGhlciB0aHJlYWQKKyAgICAgICAgICAgIC8vIHRoYXQgaXMgZXhlY3V0aW5nIHRoZSBTUUwgc3RhdGVtZW50OiAiYXR0YWNoIGRhdGFiYXNlIDxibGFoPiBhcyA8Zm9vPiIKKyAgICAgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIE5PVCBvayB3aXRoIHN1Y2ggYSByYWNlIGNvbmRpdGlvbiAoYW5kIHRodXMgcG9zc2libHkgbm90IHJlY2VpdmUKKyAgICAgICAgICAgIC8vIHRoZSBlbnRpcmUgbGlzdCBvZiBhdHRhY2hlZCBkYXRhYmFzZXMpLCB0aGVuIHRoZSBjYWxsZXIgc2hvdWxkIGVuc3VyZSB0aGF0IG5vIHRocmVhZAorICAgICAgICAgICAgLy8gaXMgZXhlY3V0aW5nIGFueSBTUUwgc3RhdGVtZW50cyB3aGlsZSBhIHRocmVhZCBpcyBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICAgICAgLy8gVHlwaWNhbGx5LCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiAnYWRiIGJ1Z3JlcG9ydCcgaXMgZG9uZSBvciB0aGUgY2FsbGVyIHdhbnRzIHRvCisgICAgICAgICAgICAvLyBjb2xsZWN0IHN0YXRzIG9uIHRoZSBkYXRhYmFzZSBhbmQgYWxsIGl0cyBhdHRhY2hlZCBkYXRhYmFzZXMuCisgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KCJtYWluIiwgbVBhdGgpKTsKKyAgICAgICAgICAgIHJldHVybiBhdHRhY2hlZERiczsKICAgICAgICAgfQotICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIC8vIGhhcyBhdHRhY2hlZCBkYXRhYmFzZXMuIHF1ZXJ5IHNxbGl0ZSB0byBnZXQgdGhlIGxpc3Qgb2YgYXR0YWNoZWQgZGF0YWJhc2VzLgorICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gcmF3UXVlcnkoInByYWdtYSBkYXRhYmFzZV9saXN0OyIsIG51bGwpOworICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgLy8gc3FsaXRlIHJldHVybnMgYSByb3cgZm9yIGVhY2ggZGF0YWJhc2UgaW4gdGhlIHJldHVybmVkIGxpc3Qgb2YgZGF0YWJhc2VzLgorICAgICAgICAgICAgICAgIC8vICAgaW4gZWFjaCByb3csCisgICAgICAgICAgICAgICAgLy8gICAgICAgMXN0IGNvbHVtbiBpcyB0aGUgZGF0YWJhc2UgbmFtZSBzdWNoIGFzIG1haW4sIG9yIHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBzcGVjaWZpZWQgb24gdGhlICJBVFRBQ0giIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAvLyAgICAgICAybmQgY29sdW1uIGlzIHRoZSBkYXRhYmFzZSBmaWxlIHBhdGguCisgICAgICAgICAgICAgICAgYXR0YWNoZWREYnMuYWRkKG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPihjLmdldFN0cmluZygxKSwgYy5nZXRTdHJpbmcoMikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGF0dGFjaGVkRGJzOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJ1bnMgJ3ByYWdtYSBpbnRlZ3JpdHlfY2hlY2snIG9uIHRoZSBnaXZlbiBkYXRhYmFzZSAoYW5kIGFsbCB0aGUgYXR0YWNoZWQgZGF0YWJhc2VzKQorICAgICAqIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGFiYXNlIChhbmQgYWxsIGl0cyBhdHRhY2hlZCBkYXRhYmFzZXMpIHBhc3MgaW50ZWdyaXR5X2NoZWNrLAorICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKjxwPgorICAgICAqIElmIHRoZSByZXN1bHQgaXMgZmFsc2UsIHRoZW4gdGhpcyBtZXRob2QgbG9ncyB0aGUgZXJyb3JzIHJlcG9ydGVkIGJ5IHRoZSBpbnRlZ3JpdHlfY2hlY2sKKyAgICAgKiBjb21tYW5kIGV4ZWN1dGlvbi4KKyAgICAgKjxwPgorICAgICAqIE5vdGUgdGhhdCAncHJhZ21hIGludGVncml0eV9jaGVjaycgb24gYSBkYXRhYmFzZSBjYW4gdGFrZSBhIGxvbmcgdGltZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YWJhc2UgKGFuZCBhbGwgaXRzIGF0dGFjaGVkIGRhdGFiYXNlcykgcGFzcyBpbnRlZ3JpdHlfY2hlY2ssCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YWJhc2VJbnRlZ3JpdHlPaygpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhdHRhY2hlZERicyA9IGdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlbGlzdCBmb3I6ICIgKyBnZXRQYXRoKCkgKyAiIGNvdWxkbid0ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgImJlIHJldHJpZXZlZC4gcHJvYmFibHkgYmVjYXVzZSB0aGUgZGF0YWJhc2UgaXMgY2xvc2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjYW4ndCBnZXQgYXR0YWNoZWREYiBsaXN0LiBkbyBpbnRlZ3JpdHkgY2hlY2sgb24gdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgICAgICAgIGF0dGFjaGVkRGJzID0gbmV3IEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGF0dGFjaGVkRGJzLmFkZChuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oIm1haW4iLCB0aGlzLm1QYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA9IGF0dGFjaGVkRGJzLmdldChpKTsKKyAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvZyA9IGNvbXBpbGVTdGF0ZW1lbnQoIlBSQUdNQSAiICsgcC5maXJzdCArICIuaW50ZWdyaXR5X2NoZWNrKDEpOyIpOworICAgICAgICAgICAgICAgIFN0cmluZyByc2x0ID0gcHJvZy5zaW1wbGVRdWVyeUZvclN0cmluZygpOworICAgICAgICAgICAgICAgIGlmICghcnNsdC5lcXVhbHNJZ25vcmVDYXNlKCJvayIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGludGVncml0eV9jaGVja2VyIGZhaWxlZCBvbiBtYWluIG9yIGF0dGFjaGVkIGRhdGFiYXNlcworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJQUkFHTUEgaW50ZWdyaXR5X2NoZWNrIG9uICIgKyBwLnNlY29uZCArICIgcmV0dXJuZWQ6ICIgKyByc2x0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgogICAgICAqIE5hdGl2ZSBjYWxsIHRvIG9wZW4gdGhlIGRhdGFiYXNlLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKQEAgLTIyMzksNTEgKzI2MTUsMzQgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGRib3BlbihTdHJpbmcgcGF0aCwgaW50IGZsYWdzKTsKIAogICAgIC8qKgotICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHRyYWNpbmcgb2YgYWxsIHNxbCBzdGF0ZW1lbnRzCisgICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgdHJhY2luZyBvZiBhbGwgU1FMIHN0YXRlbWVudHMKICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OdW0gY29ubmVjdGlvbiBudW1iZXI6IDAgLSBOLCB3aGVyZSB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgY29ubmVjdGlvbiBoYW5kbGUgaXMgbnVtYmVyZWQgMCBhbmQgdGhlIGNvbm5lY3Rpb24gaGFuZGxlcyBpbiB0aGUgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgICAgcG9vbCBhcmUgbnVtYmVyZWQgMS4uTi4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFRyYWNpbmcoU3RyaW5nIHBhdGgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhTdHJpbmcgcGF0aCwgc2hvcnQgY29ubmVjdGlvbk51bSk7CiAKICAgICAvKioKLSAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCBwcm9maWxpbmcgb2YgYWxsIHNxbCBzdGF0ZW1lbnRzLgorICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHByb2ZpbGluZyBvZiBhbGwgU1FMIHN0YXRlbWVudHMuCiAgICAgICogY3VycmVudGx5LCBzcWxpdGUncyBwcm9maWxpbmcgPSBwcmludGluZyBvZiBleGVjdXRpb24tdGltZQotICAgICAqICh3YWxsLWNsb2NrIHRpbWUpIG9mIGVhY2ggb2YgdGhlIHNxbCBzdGF0ZW1lbnRzLCBhcyB0aGV5CisgICAgICogKHdhbGwtY2xvY2sgdGltZSkgb2YgZWFjaCBvZiB0aGUgU1FMIHN0YXRlbWVudHMsIGFzIHRoZXkKICAgICAgKiBhcmUgZXhlY3V0ZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTnVtIGNvbm5lY3Rpb24gbnVtYmVyOiAwIC0gTiwgd2hlcmUgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgIGNvbm5lY3Rpb24gaGFuZGxlIGlzIG51bWJlcmVkIDAgYW5kIHRoZSBjb25uZWN0aW9uIGhhbmRsZXMgaW4gdGhlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHBvb2wgYXJlIG51bWJlcmVkIDEuLk4uCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoU3RyaW5nIHBhdGgpOwotCi0gICAgLyoqCi0gICAgICogTmF0aXZlIGNhbGwgdG8gZXhlY3V0ZSBhIHJhdyBTUUwgc3RhdGVtZW50LiB7QGxpbmsgI2xvY2t9IG11c3QgYmUgaGVsZAotICAgICAqIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcWwgVGhlIHJhdyBTUUwgc3RyaW5nCi0gICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjU1FMKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb247CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoU3RyaW5nIHBhdGgsIHNob3J0IGNvbm5lY3Rpb25OdW0pOwogCiAgICAgLyoqCiAgICAgICogTmF0aXZlIGNhbGwgdG8gc2V0IHRoZSBsb2NhbGUuICB7QGxpbmsgI2xvY2t9IG11c3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcKICAgICAgKiB0aGlzIG1ldGhvZC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIHZvaWQgbmF0aXZlX3NldExvY2FsZShTdHJpbmcgbG9jLCBpbnQgZmxhZ3MpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcm93IElEIG9mIHRoZSBsYXN0IHJvdyBpbnNlcnRlZCBpbnRvIHRoZSBkYXRhYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJvdyBJRCBvZiB0aGUgbGFzdCByb3cgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgbG9uZyBsYXN0SW5zZXJ0Um93KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhbmdlcyBtYWRlIGluIHRoZSBsYXN0IHN0YXRlbWVudCBleGVjdXRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFuZ2VzIG1hZGUgaW4gdGhlIGxhc3Qgc3RhdGVtZW50IGV4ZWN1dGVkLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIGludCBsYXN0Q2hhbmdlQ291bnQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRMb2NhbGUoU3RyaW5nIGxvYywgaW50IGZsYWdzKTsKIAogICAgIC8qKgogICAgICAqIHJldHVybiB0aGUgU1FMSVRFX0RCU1RBVFVTX0xPT0tBU0lERV9VU0VEIGRvY3VtZW50ZWQgaGVyZQpAQCAtMjI5MSw0ICsyNjUwLDExIEBACiAgICAgICogQHJldHVybiBpbnQgdmFsdWUgb2YgU1FMSVRFX0RCU1RBVFVTX0xPT0tBU0lERV9VU0VECiAgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZSgpOworCisgICAgLyoqCisgICAgICogZmluYWxpemVzIHRoZSBnaXZlbiBzdGF0ZW1lbnQgaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGVtZW50SWQgc3RhdGVtZW50IHRvIGJlIGZpbnpsaWVkIGJ5IHNxbGl0ZQorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2ZpbmFsaXplKGludCBzdGF0ZW1lbnRJZCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZTJkODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworLyoqCisgKiBUaHJvd24gaWYgIHRoZSBkYXRhYmFzZSBlbmdpbmUgd2FzIHVuYWJsZSB0byBhY3F1aXJlIHRoZQorICogZGF0YWJhc2UgbG9ja3MgaXQgbmVlZHMgdG8gZG8gaXRzIGpvYi4gIElmIHRoZSBzdGF0ZW1lbnQgaXMgYSBbQ09NTUlUXQorICogb3Igb2NjdXJzIG91dHNpZGUgb2YgYW4gZXhwbGljaXQgdHJhbnNhY3Rpb24sIHRoZW4geW91IGNhbiByZXRyeSB0aGUKKyAqIHN0YXRlbWVudC4gIElmIHRoZSBzdGF0ZW1lbnQgaXMgbm90IGEgW0NPTU1JVF0gYW5kIG9jY3VycyB3aXRoaW4gYQorICogZXhwbGljaXQgdHJhbnNhY3Rpb24gdGhlbiB5b3Ugc2hvdWxkIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiBiZWZvcmUKKyAqIGNvbnRpbnVpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODI1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCmluZGV4IGIyYTE2NmIuLjk0OTYwNzkxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YQpAQCAtMTMyLDExICsxMzIsMTYgQEAKICAgICAgICAgLyoqIGRvY3VtZW50ZWQgaGVyZSBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvYzNyZWYvY19kYnN0YXR1c19sb29rYXNpZGVfdXNlZC5odG1sICovCiAgICAgICAgIHB1YmxpYyBpbnQgbG9va2FzaWRlOwogCi0gICAgICAgIHB1YmxpYyBEYlN0YXRzKFN0cmluZyBkYk5hbWUsIGxvbmcgcGFnZUNvdW50LCBsb25nIHBhZ2VTaXplLCBpbnQgbG9va2FzaWRlKSB7CisgICAgICAgIC8qKiBzdGF0ZW1lbnQgY2FjaGUgc3RhdHM6IGhpdHMvbWlzc2VzL2NhY2hlc2l6ZSAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGNhY2hlOworCisgICAgICAgIHB1YmxpYyBEYlN0YXRzKFN0cmluZyBkYk5hbWUsIGxvbmcgcGFnZUNvdW50LCBsb25nIHBhZ2VTaXplLCBpbnQgbG9va2FzaWRlLAorICAgICAgICAgICAgaW50IGhpdHMsIGludCBtaXNzZXMsIGludCBjYWNoZXNpemUpIHsKICAgICAgICAgICAgIHRoaXMuZGJOYW1lID0gZGJOYW1lOwogICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplIC8gMTAyNDsKICAgICAgICAgICAgIGRiU2l6ZSA9IChwYWdlQ291bnQgKiBwYWdlU2l6ZSkgLyAxMDI0OwogICAgICAgICAgICAgdGhpcy5sb29rYXNpZGUgPSBsb29rYXNpZGU7CisgICAgICAgICAgICB0aGlzLmNhY2hlID0gaGl0cyArICIvIiArIG1pc3NlcyArICIvIiArIGNhY2hlc2l6ZTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhCmluZGV4IDIxNDRmYzMuLmRlMmZjYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEKQEAgLTM5LDE4ICszOSwxNiBAQAogCiAgICAgcHVibGljIEN1cnNvciBxdWVyeShDdXJzb3JGYWN0b3J5IGZhY3RvcnksIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKICAgICAgICAgLy8gQ29tcGlsZSB0aGUgcXVlcnkKLSAgICAgICAgU1FMaXRlUXVlcnkgcXVlcnkgPSBuZXcgU1FMaXRlUXVlcnkobURhdGFiYXNlLCBtU3FsLCAwLCBzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgU1FMaXRlUXVlcnkgcXVlcnkgPSBudWxsOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBBcmcgYmluZGluZwotICAgICAgICAgICAgaW50IG51bUFyZ3MgPSBzZWxlY3Rpb25BcmdzID09IG51bGwgPyAwIDogc2VsZWN0aW9uQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgICAgIHF1ZXJ5LmJpbmRTdHJpbmcoaSArIDEsIHNlbGVjdGlvbkFyZ3NbaV0pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgICAgICBxdWVyeSA9IG5ldyBTUUxpdGVRdWVyeShtRGF0YWJhc2UsIG1TcWwsIDAsIHNlbGVjdGlvbkFyZ3MpOwogCiAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGN1cnNvcgogICAgICAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBuZXcgU1FMaXRlQ3Vyc29yKG1EYXRhYmFzZSwgdGhpcywgbUVkaXRUYWJsZSwgcXVlcnkpOworICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBuZXcgU1FMaXRlQ3Vyc29yKHRoaXMsIG1FZGl0VGFibGUsIHF1ZXJ5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbUN1cnNvciA9IGZhY3RvcnkubmV3Q3Vyc29yKG1EYXRhYmFzZSwgdGhpcywgbUVkaXRUYWJsZSwgcXVlcnkpOwogICAgICAgICAgICAgfQpAQCAtNjEsNiArNTksNyBAQAogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgb2JqZWN0IGlzIGNsZWFuZWQgdXAgaWYgc29tZXRoaW5nIGhhcHBlbnMKICAgICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKSBxdWVyeS5jbG9zZSgpOworICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02OSwxMCArNjgsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEJpbmRBcmd1bWVudHMoU3RyaW5nW10gYmluZEFyZ3MpIHsKLSAgICAgICAgZmluYWwgaW50IG51bUFyZ3MgPSBiaW5kQXJncy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICBtUXVlcnkuYmluZFN0cmluZyhpICsgMSwgYmluZEFyZ3NbaV0pOwotICAgICAgICB9CisgICAgICAgIG1RdWVyeS5iaW5kQWxsQXJnc0FzU3RyaW5ncyhiaW5kQXJncyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY3Vyc29yRGVhY3RpdmF0ZWQoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlTWlzdXNlRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlTWlzdXNlRXhjZXB0aW9uLmphdmEKaW5kZXggNjg1ZjNlYS4uNTQ2ZWMwOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU1pc3VzZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVNaXN1c2VFeGNlcHRpb24uamF2YQpAQCAtMTYsNiArMTYsMTggQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAorLyoqCisgKiBUaGlzIGVycm9yIGNhbiBvY2N1ciBpZiB0aGUgYXBwbGljYXRpb24gY3JlYXRlcyBhIFNRTGl0ZVN0YXRlbWVudCBvYmplY3QgYW5kIGFsbG93cyBtdWx0aXBsZQorICogdGhyZWFkcyBpbiB0aGUgYXBwbGljYXRpb24gdXNlIGl0IGF0IHRoZSBzYW1lIHRpbWUuCisgKiBTcWxpdGUgcmV0dXJucyB0aGlzIGVycm9yIGlmIGJpbmQgYW5kIGV4ZWN1dGUgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCBvY2N1ciBhdCB0aGUgc2FtZSB0aW1lCisgKiBmcm9tIG11bHRpcGxlIHRocmVhZHMsIGxpa2Ugc286CisgKiAgICAgdGhyZWFkICMgMTogaW4gZXhlY3V0ZSgpIG1ldGhvZCBvZiB0aGUgU1FMaXRlU3RhdGVtZW50IG9iamVjdAorICogICAgIHdoaWxlIHRocmVhZCAjIDI6IGlzIGluIGJpbmQuLigpIG9uIHRoZSBzYW1lIG9iamVjdC4KKyAqPC9wPgorICogRklYIHRoaXMgYnkgTkVWRVIgc2hhcmluZyB0aGUgc2FtZSBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0IGJldHdlZW4gdGhyZWFkcy4KKyAqIENyZWF0ZSBhIGxvY2FsIGluc3RhbmNlIG9mIHRoZSBTUUxpdGVTdGF0ZW1lbnQgd2hlbmV2ZXIgaXQgaXMgbmVlZGVkLCB1c2UgaXQgYW5kIGNsb3NlIGl0IEFTQVAuCisgKiBORVZFUiBtYWtlIGl0IGdsb2JhbGx5IGF2YWlsYWJsZS4KKyAqLwogcHVibGljIGNsYXNzIFNRTGl0ZU1pc3VzZUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CiAgICAgcHVibGljIFNRTGl0ZU1pc3VzZUV4Y2VwdGlvbigpIHt9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCmluZGV4IGI0NjE1ZWIuLmNjZjhkNjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQpAQCAtMTcsNiArMTcsOCBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC01MSw2ICs1Myw3IEBACiAKICAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0luaXRpYWxpemluZyA9IGZhbHNlOworICAgIHByaXZhdGUgZmluYWwgRGF0YWJhc2VFcnJvckhhbmRsZXIgbUVycm9ySGFuZGxlcjsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIGhlbHBlciBvYmplY3QgdG8gY3JlYXRlLCBvcGVuLCBhbmQvb3IgbWFuYWdlIGEgZGF0YWJhc2UuCkBAIC02NSwxMiArNjgsMzcgQEAKICAgICAgKiAgICAge0BsaW5rICNvblVwZ3JhZGV9IHdpbGwgYmUgdXNlZCB0byB1cGdyYWRlIHRoZSBkYXRhYmFzZQogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVPcGVuSGVscGVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBuYW1lLCBmYWN0b3J5LCB2ZXJzaW9uLCBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGhlbHBlciBvYmplY3QgdG8gY3JlYXRlLCBvcGVuLCBhbmQvb3IgbWFuYWdlIGEgZGF0YWJhc2UuCisgICAgICogVGhlIGRhdGFiYXNlIGlzIG5vdCBhY3R1YWxseSBjcmVhdGVkIG9yIG9wZW5lZCB1bnRpbCBvbmUgb2YKKyAgICAgKiB7QGxpbmsgI2dldFdyaXRhYmxlRGF0YWJhc2V9IG9yIHtAbGluayAjZ2V0UmVhZGFibGVEYXRhYmFzZX0gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdG8gdXNlIHRvIG9wZW4gb3IgY3JlYXRlIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBmaWxlLCBvciBudWxsIGZvciBhbiBpbi1tZW1vcnkgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSB0byB1c2UgZm9yIGNyZWF0aW5nIGN1cnNvciBvYmplY3RzLCBvciBudWxsIGZvciB0aGUgZGVmYXVsdAorICAgICAqIEBwYXJhbSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGF0YWJhc2UgKHN0YXJ0aW5nIGF0IDEpOyBpZiB0aGUgZGF0YWJhc2UgaXMgb2xkZXIsCisgICAgICogICAgIHtAbGluayAjb25VcGdyYWRlfSB3aWxsIGJlIHVzZWQgdG8gdXBncmFkZSB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uCisgICAgICovCisgICAgcHVibGljIFNRTGl0ZU9wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgewogICAgICAgICBpZiAodmVyc2lvbiA8IDEpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZlcnNpb24gbXVzdCBiZSA+PSAxLCB3YXMgIiArIHZlcnNpb24pOworICAgICAgICBpZiAoZXJyb3JIYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRhdGFiYXNlRXJyb3JIYW5kbGVyIHBhcmFtIHZhbHVlIGNhbid0IGJlIG51bGwuIik7CisgICAgICAgIH0KIAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1OYW1lID0gbmFtZTsKICAgICAgICAgbUZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgICBtTmV3VmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIG1FcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7CiAgICAgfQogCiAgICAgLyoqCkBAIC05Myw4ICsxMjEsMTMgQEAKICAgICAgKiBAcmV0dXJuIGEgcmVhZC93cml0ZSBkYXRhYmFzZSBvYmplY3QgdmFsaWQgdW50aWwge0BsaW5rICNjbG9zZX0gaXMgY2FsbGVkCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXRXcml0YWJsZURhdGFiYXNlKCkgewotICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwgJiYgbURhdGFiYXNlLmlzT3BlbigpICYmICFtRGF0YWJhc2UuaXNSZWFkT25seSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURhdGFiYXNlOyAgLy8gVGhlIGRhdGFiYXNlIGlzIGFscmVhZHkgb3BlbiBmb3IgYnVzaW5lc3MKKyAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICAgICAgICAgIC8vIGRhcm4hIHRoZSB1c2VyIGNsb3NlZCB0aGUgZGF0YWJhc2UgYnkgY2FsbGluZyBtRGF0YWJhc2UuY2xvc2UoKQorICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtRGF0YWJhc2UuaXNSZWFkT25seSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsgIC8vIFRoZSBkYXRhYmFzZSBpcyBhbHJlYWR5IG9wZW4gZm9yIGJ1c2luZXNzCisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUlzSW5pdGlhbGl6aW5nKSB7CkBAIC0xMTUsMTAgKzE0OCwxNCBAQAogICAgICAgICAgICAgaWYgKG1OYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBkYiA9IFNRTGl0ZURhdGFiYXNlLmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGIgPSBtQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShtTmFtZSwgMCwgbUZhY3RvcnkpOworICAgICAgICAgICAgICAgIGRiID0gbUNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UobU5hbWUsIDAsIG1GYWN0b3J5LCBtRXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IHZlcnNpb24gPSBkYi5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICBpZiAodmVyc2lvbiA+IG1OZXdWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGF0YWJhc2UgIiArIG1OYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIGRvd25ncmFkZWQuIGluc3RlYWQsIHBsZWFzZSB1bmluc3RhbGwgbmV3IHZlcnNpb24gZmlyc3QuIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBtTmV3VmVyc2lvbikgewogICAgICAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgICAgICB0cnkgewpAQCAtMTc1LDggKzIxMiwxMyBAQAogICAgICAqICAgICBvciB7QGxpbmsgI2Nsb3NlfSBpcyBjYWxsZWQuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXRSZWFkYWJsZURhdGFiYXNlKCkgewotICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwgJiYgbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURhdGFiYXNlOyAgLy8gVGhlIGRhdGFiYXNlIGlzIGFscmVhZHkgb3BlbiBmb3IgYnVzaW5lc3MKKyAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICAgICAgICAgIC8vIGRhcm4hIHRoZSB1c2VyIGNsb3NlZCB0aGUgZGF0YWJhc2UgYnkgY2FsbGluZyBtRGF0YWJhc2UuY2xvc2UoKQorICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YWJhc2U7ICAvLyBUaGUgZGF0YWJhc2UgaXMgYWxyZWFkeSBvcGVuIGZvciBidXNpbmVzcworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1Jc0luaXRpYWxpemluZykgewpAQCAtMTk0LDcgKzIzNiw4IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtSXNJbml0aWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBtQ29udGV4dC5nZXREYXRhYmFzZVBhdGgobU5hbWUpLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIG1GYWN0b3J5LCBTUUxpdGVEYXRhYmFzZS5PUEVOX1JFQURPTkxZKTsKKyAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIG1GYWN0b3J5LCBTUUxpdGVEYXRhYmFzZS5PUEVOX1JFQURPTkxZLAorICAgICAgICAgICAgICAgICAgICBtRXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgIGlmIChkYi5nZXRWZXJzaW9uKCkgIT0gbU5ld1ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1FMaXRlRXhjZXB0aW9uKCJDYW4ndCB1cGdyYWRlIHJlYWQtb25seSBkYXRhYmFzZSBmcm9tIHZlcnNpb24gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICBkYi5nZXRWZXJzaW9uKCkgKyAiIHRvICIgKyBtTmV3VmVyc2lvbiArICI6ICIgKyBwYXRoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjZThiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQppbmRleCA0ZDk2ZjEyLi44MzYyMWYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKQEAgLTE2LDEyICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKwogLyoqCiAgKiBBIGJhc2UgY2xhc3MgZm9yIGNvbXBpbGVkIFNRTGl0ZSBwcm9ncmFtcy4KLSAqCi0gKiBTUUxpdGVQcm9ncmFtIGlzIG5vdCBpbnRlcm5hbGx5IHN5bmNocm9uaXplZCBzbyBjb2RlIHVzaW5nIGEgU1FMaXRlUHJvZ3JhbSBmcm9tIG11bHRpcGxlCisgKjxwPgorICogU1FMaXRlUHJvZ3JhbSBpcyBOT1QgaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQgc28gY29kZSB1c2luZyBhIFNRTGl0ZVByb2dyYW0gZnJvbSBtdWx0aXBsZQogICogdGhyZWFkcyBzaG91bGQgcGVyZm9ybSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIHVzaW5nIHRoZSBTUUxpdGVQcm9ncmFtLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1FMaXRlUHJvZ3JhbSBleHRlbmRzIFNRTGl0ZUNsb3NhYmxlIHsKQEAgLTQzLDEyICs0NywxMiBAQAogICAgICAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcwogICAgICAqLwogICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIGludCBuSGFuZGxlID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IG5IYW5kbGU7CiAKICAgICAvKioKICAgICAgKiB0aGUgU1FMaXRlQ29tcGlsZWRTcWwgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gc3FsIHN0YXRlbWVudC4KICAgICAgKi8KLSAgICBwcml2YXRlIFNRTGl0ZUNvbXBpbGVkU3FsIG1Db21waWxlZFNxbDsKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZUNvbXBpbGVkU3FsIG1Db21waWxlZFNxbDsKIAogICAgIC8qKgogICAgICAqIFNRTGl0ZUNvbXBpbGVkU3FsIHN0YXRlbWVudCBpZCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QgZnJvbSB0aGUgYWJvdmUKQEAgLTU2LDQxICs2MCw5NyBAQAogICAgICAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcwogICAgICAqLwogICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIGludCBuU3RhdGVtZW50ID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IG5TdGF0ZW1lbnQ7CisKKyAgICAvKioKKyAgICAgKiBJbiB0aGUgY2FzZSBvZiB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fSwgdGhpcyBtZW1iZXIgc3RvcmVzIHRoZSBiaW5kYXJncyBwYXNzZWQKKyAgICAgKiB0byB0aGUgZm9sbG93aW5nIG1ldGhvZHMsIGluc3RlYWQgb2YgYWN0dWFsbHkgZG9pbmcgdGhlIGJpbmRpbmcuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjYmluZEJsb2IoaW50LCBieXRlW10pfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kRG91YmxlKGludCwgZG91YmxlKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZExvbmcoaW50LCBsb25nKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZE51bGwoaW50KX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZFN0cmluZyhpbnQsIFN0cmluZyl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgUGFpciBvZgorICAgICAqIDxvbD4KKyAgICAgKiAgIDxsaT5iaW5kIGFyZyBwb3NpdGlvbiBudW1iZXI8L2xpPgorICAgICAqICAgPGxpPnRoZSB2YWx1ZSB0byBiZSBib3VuZCB0byB0aGUgYmluZGFyZzwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgaW4gdGhlIGFib3ZlIGJpbmQgbWV0aG9kcworICAgICAqIGFuZCBpdCBpcyBjbGVhcmVkIGluIHtAbGluayAjY2xlYXJCaW5kaW5ncygpfSBtZXRob2QuCisgICAgICogPHA+CisgICAgICogSXQgaXMgcHJvdGVjdGVkIChpbiBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudCkgYnkge0BsaW5rIFNRTGl0ZVByb2dyYW19LnRoaXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEhhc2hNYXA8SW50ZWdlciwgT2JqZWN0PiBtQmluZEFyZ3MgPSBudWxsOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgaW50IG1TdGF0ZW1lbnRUeXBlOworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfQ0FDSEVBQkxFID0gMTY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9ET05UX1BSRVBBUkUgPSAzMjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX1VTRV9QT09MRURfQ09OTiA9IDY0OworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfVFlQRV9NQVNLID0gMHgwZjsKIAogICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUHJvZ3JhbShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgewotICAgICAgICBtRGF0YWJhc2UgPSBkYjsKKyAgICAgICAgdGhpcyhkYiwgc3FsLCBudWxsLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVByb2dyYW0oU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzLAorICAgICAgICAgICAgYm9vbGVhbiBjb21waWxlRmxhZykgewogICAgICAgICBtU3FsID0gc3FsLnRyaW0oKTsKKyAgICAgICAgaW50IG4gPSBEYXRhYmFzZVV0aWxzLmdldFNxbFN0YXRlbWVudFR5cGUobVNxbCk7CisgICAgICAgIHN3aXRjaCAobikgeworICAgICAgICAgICAgY2FzZSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9VUERBVEU6CisgICAgICAgICAgICAgICAgbVN0YXRlbWVudFR5cGUgPSBuIHwgU1RBVEVNRU5UX0NBQ0hFQUJMRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfU0VMRUNUOgorICAgICAgICAgICAgICAgIG1TdGF0ZW1lbnRUeXBlID0gbiB8IFNUQVRFTUVOVF9DQUNIRUFCTEUgfCBTVEFURU1FTlRfVVNFX1BPT0xFRF9DT05OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9BVFRBQ0g6CisgICAgICAgICAgICBjYXNlIERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0JFR0lOOgorICAgICAgICAgICAgY2FzZSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9DT01NSVQ6CisgICAgICAgICAgICBjYXNlIERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0FCT1JUOgorICAgICAgICAgICAgY2FzZSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9EREw6CisgICAgICAgICAgICBjYXNlIERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX1VOUFJFUEFSRUQ6CisgICAgICAgICAgICAgICAgbVN0YXRlbWVudFR5cGUgPSBuIHwgU1RBVEVNRU5UX0RPTlRfUFJFUEFSRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgbVN0YXRlbWVudFR5cGUgPSBuOworICAgICAgICB9CiAgICAgICAgIGRiLmFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgZGIuYWRkU1FMaXRlQ2xvc2FibGUodGhpcyk7Ci0gICAgICAgIHRoaXMubkhhbmRsZSA9IGRiLm1OYXRpdmVIYW5kbGU7CisgICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICBuSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgaWYgKGJpbmRBcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBzaXplID0gYmluZEFyZ3MubGVuZ3RoOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0aGlzLmFkZFRvQmluZEFyZ3MoaSArIDEsIGJpbmRBcmdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcGlsZUZsYWcpIHsKKyAgICAgICAgICAgIGNvbXBpbGVBbmRiaW5kQWxsQXJncygpOworICAgICAgICB9CisgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBpbGVTcWwoKSB7CiAgICAgICAgIC8vIG9ubHkgY2FjaGUgQ1JVRCBzdGF0ZW1lbnRzCi0gICAgICAgIFN0cmluZyBwcmVmaXhTcWwgPSBtU3FsLnN1YnN0cmluZygwLCA2KTsKLSAgICAgICAgaWYgKCFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiSU5TRVJUIikgJiYgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJVUERBVEUiKSAmJgotICAgICAgICAgICAgICAgICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiUkVQTEFDIikgJiYKLSAgICAgICAgICAgICAgICAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIkRFTEVURSIpICYmICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiU0VMRUNUIikpIHsKLSAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChkYiwgc3FsKTsKKyAgICAgICAgaWYgKChtU3RhdGVtZW50VHlwZSAmIFNUQVRFTUVOVF9DQUNIRUFCTEUpID09IDApIHsKKyAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogICAgICAgICAgICAgblN0YXRlbWVudCA9IG1Db21waWxlZFNxbC5uU3RhdGVtZW50OwogICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgbm90IGluIHRoZSBjYWNoZSwgbm8gbmVlZCB0byBhY3F1aXJlKCkgaXQuCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBpdCBpcyBub3QgcHJhZ21hCi0gICAgICAgIG1Db21waWxlZFNxbCA9IGRiLmdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKHNxbCk7CisgICAgICAgIG1Db21waWxlZFNxbCA9IG1EYXRhYmFzZS5nZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChtU3FsKTsKICAgICAgICAgaWYgKG1Db21waWxlZFNxbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY29tcGlsZWQtc3FsIG9iagotICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOworICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKG1EYXRhYmFzZSwgbVNxbCk7CiAKICAgICAgICAgICAgIC8vIGFkZCBpdCB0byB0aGUgY2FjaGUgb2YgY29tcGlsZWQtc3FscwogICAgICAgICAgICAgLy8gYnV0IGJlZm9yZSBhZGRpbmcgaXQgYW5kIHRodXMgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgYW55b25lIGVsc2UgdG8gdXNlIGl0LAogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGlzIGFjcXVpcmVkIGJ5IG1lLgogICAgICAgICAgICAgbUNvbXBpbGVkU3FsLmFjcXVpcmUoKTsKLSAgICAgICAgICAgIGRiLmFkZFRvQ29tcGlsZWRRdWVyaWVzKHNxbCwgbUNvbXBpbGVkU3FsKTsKLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkNyZWF0ZWQgRGJPYmogKGlkIyIgKyBtQ29tcGlsZWRTcWwublN0YXRlbWVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3Igc3FsOiAiICsgc3FsKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5hZGRUb0NvbXBpbGVkUXVlcmllcyhtU3FsLCBtQ29tcGlsZWRTcWwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gaXQgaXMgYWxyZWFkeSBpbiBjb21waWxlZC1zcWwgY2FjaGUuCiAgICAgICAgICAgICAvLyB0cnkgdG8gYWNxdWlyZSB0aGUgb2JqZWN0LgpAQCAtMTAwLDEzICsxNjAsNyBAQAogICAgICAgICAgICAgICAgIC8vIHdlIGNhbid0IGhhdmUgdHdvIGRpZmZlcmVudCBTUUxpdGVQcm9nYW0gb2JqZWN0cyBjYW4ndCBzaGFyZSB0aGUgc2FtZQogICAgICAgICAgICAgICAgIC8vIENvbXBpbGVkU3FsIG9iamVjdC4gY3JlYXRlIGEgbmV3IG9uZS4KICAgICAgICAgICAgICAgICAvLyBmaW5hbGl6ZSBpdCB3aGVuIEkgYW0gZG9uZSB3aXRoIGl0IGluICJ0aGlzIiBvYmplY3QuCi0gICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICIqKiBwb3NzaWJsZSBidWcgKiogQ3JlYXRlZCBORVcgRGJPYmogKGlkIyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbC5uU3RhdGVtZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBiZWNhdXNlIHRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgRGJPYmogKGlkIyIgKyBsYXN0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB3YXMgbm90IHJlbGVhc2VkIGZvciBzcWw6IiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIG5vdCBpbiB0aGUgY2FjaGUsIG5vIG5lZWQgdG8gYWNxdWlyZSgpIGl0LgogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTUsNDIgKzE2OSw0NSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKSB7Ci0gICAgICAgIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpOwotICAgICAgICBtRGF0YWJhc2UucmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICByZWxlYXNlKCk7CiAgICAgICAgIG1EYXRhYmFzZS5yZW1vdmVTUUxpdGVDbG9zYWJsZSh0aGlzKTsKKyAgICAgICAgbURhdGFiYXNlLnJlbGVhc2VSZWZlcmVuY2UoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZEZyb21Db250YWluZXIoKSB7Ci0gICAgICAgIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpOworICAgICAgICByZWxlYXNlKCk7CiAgICAgICAgIG1EYXRhYmFzZS5yZWxlYXNlUmVmZXJlbmNlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpIHsKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVsZWFzZSgpIHsKICAgICAgICAgaWYgKG1Db21waWxlZFNxbCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkKG1EYXRhYmFzZS5tQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5tQ29tcGlsZWRRdWVyaWVzLmNvbnRhaW5zVmFsdWUobUNvbXBpbGVkU3FsKSkgewotICAgICAgICAgICAgICAgIC8vIGl0IGlzIE5PVCBpbiBjb21waWxlZC1zcWwgY2FjaGUuIGkuZS4sIHJlc3BvbnNpYmlsaXR5IG9mCi0gICAgICAgICAgICAgICAgLy8gcmVsZWFzaW5nIHRoaXMgc3RhdGVtZW50IGlzIG9uIG1lLgotICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbC5yZWxlYXNlU3FsU3RhdGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaXQgaXMgaW4gY29tcGlsZWQtc3FsIGNhY2hlLiByZXNldCBpdHMgQ29tcGlsZWRTcWwjbUluVXNlIGZsYWcKLSAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IAorICAgICAgICBtRGF0YWJhc2UucmVsZWFzZUNvbXBpbGVkU3FsT2JqKG1Db21waWxlZFNxbCk7CisgICAgICAgIG1Db21waWxlZFNxbCA9IG51bGw7CisgICAgICAgIG5TdGF0ZW1lbnQgPSAwOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwcm9ncmFtLgogICAgICAqCiAgICAgICogQHJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHByb2dyYW0KKyAgICAgKiBAZGVwcmVjYXRlZCBkbyBub3QgdXNlIHRoaXMgbWV0aG9kLiBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSBhY3Jvc3MgZXhlY3V0aW9ucyBvZgorICAgICAqIHRoZSBTUUwgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VW5pcXVlSWQoKSB7Ci0gICAgICAgIHJldHVybiBuU3RhdGVtZW50OworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVzZWQgb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldFNxbFN0YXRlbWVudElkKCkgeworICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgcmV0dXJuIChtQ29tcGlsZWRTcWwgPT0gbnVsbCkgPyAwIDogblN0YXRlbWVudDsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIFN0cmluZyBnZXRTcWxTdHJpbmcoKSB7CkBAIC0xNjksNiArMjI2LDM3IEBACiAgICAgICAgIC8vIFRPRE8gaXMgdGhlcmUgYSBuZWVkIGZvciB0aGlzPwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBiaW5kKGludCB0eXBlLCBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgYWRkVG9CaW5kQXJncyhpbmRleCwgKHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTCkgPyBudWxsIDogdmFsdWUpOworICAgICAgICBpZiAoblN0YXRlbWVudCA+IDApIHsKKyAgICAgICAgICAgIC8vIGJpbmQgb25seSBpZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBjb21waWxlZAorICAgICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbnVsbChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9CTE9COgorICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfYmxvYihpbmRleCwgKGJ5dGVbXSkgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9kb3VibGUoaW5kZXgsIChEb3VibGUpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAoTG9uZykgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfc3RyaW5nKGluZGV4LCAoU3RyaW5nKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEJpbmQgYSBOVUxMIHZhbHVlIHRvIHRoaXMgc3RhdGVtZW50LiBUaGUgdmFsdWUgcmVtYWlucyBib3VuZCB1bnRpbAogICAgICAqIHtAbGluayAjY2xlYXJCaW5kaW5nc30gaXMgY2FsbGVkLgpAQCAtMTc2LDM0ICsyNjQsMTggQEAKICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIDEtYmFzZWQgaW5kZXggdG8gdGhlIHBhcmFtZXRlciB0byBiaW5kIG51bGwgdG8KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiaW5kTnVsbChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTCwgaW5kZXgsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEJpbmQgYSBsb25nIHZhbHVlIHRvIHRoaXMgc3RhdGVtZW50LiBUaGUgdmFsdWUgcmVtYWlucyBib3VuZCB1bnRpbAogICAgICAqIHtAbGluayAjY2xlYXJCaW5kaW5nc30gaXMgY2FsbGVkLgotICAgICAqCisgICAgICphZGRUb0JpbmRBcmdzCiAgICAgICogQHBhcmFtIGluZGV4IFRoZSAxLWJhc2VkIGluZGV4IHRvIHRoZSBwYXJhbWV0ZXIgdG8gYmluZAogICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmluZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmRMb25nKGludCBpbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUiwgaW5kZXgsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNCwxNSArMjg2LDcgQEAKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJpbmQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiaW5kRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9kb3VibGUoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FULCBpbmRleCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjM2LDE1ICszMDAsNyBAQAogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGJpbmQgdmFsdWUgYXQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBudWxsIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX3N0cmluZyhpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HLCBpbmRleCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjU4LDI0ICszMTQsMTggQEAKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBiaW5kIHZhbHVlIGF0IGluZGV4ICIgKyBpbmRleCArICIgaXMgbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9ibG9iKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9CTE9CLCBpbmRleCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENsZWFycyBhbGwgZXhpc3RpbmcgYmluZGluZ3MuIFVuc2V0IGJpbmRpbmdzIGFyZSB0cmVhdGVkIGFzIE5VTEwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJCaW5kaW5ncygpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOworICAgICAgICBtQmluZEFyZ3MgPSBudWxsOworICAgICAgICBpZiAodGhpcy5uU3RhdGVtZW50ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmF0aXZlX2NsZWFyX2JpbmRpbmdzKCk7CkBAIC0yODgsMTUgKzMzOCw3OSBAQAogICAgICAqIFJlbGVhc2UgdGhpcyBwcm9ncmFtJ3MgcmVzb3VyY2VzLCBtYWtpbmcgaXQgaW52YWxpZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKKyAgICAgICAgbUJpbmRBcmdzID0gbnVsbDsKKyAgICAgICAgaWYgKG5IYW5kbGUgPT0gMCB8fCAhbURhdGFiYXNlLmlzT3BlbigpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRUb0JpbmRBcmdzKGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChtQmluZEFyZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgbUJpbmRBcmdzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgT2JqZWN0PigpOwogICAgICAgICB9CisgICAgICAgIG1CaW5kQXJncy5wdXQoaW5kZXgsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCkgeworICAgICAgICBpZiAoKG1TdGF0ZW1lbnRUeXBlICYgU1RBVEVNRU5UX0RPTlRfUFJFUEFSRSkgPiAwKSB7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHByZXBhcmUgdGhpcyBTUUwgc3RhdGVtZW50CisgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1NUQVRFTUVOVFMpIHsKKyAgICAgICAgICAgICAgICBpZiAobUJpbmRBcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gbmVlZCB0byBwYXNzIGJpbmRhcmdzIGZvciB0aGlzIHNxbCA6IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNxbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChuU3RhdGVtZW50ID09IDApIHsKKyAgICAgICAgICAgIC8vIFNRTCBzdGF0ZW1lbnQgaXMgbm90IGNvbXBpbGVkIHlldC4gY29tcGlsZSBpdCBub3cuCisgICAgICAgICAgICBjb21waWxlU3FsKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CaW5kQXJncyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaW5kZXggOiBtQmluZEFyZ3Mua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1CaW5kQXJncy5nZXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9udWxsKGluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgKChOdW1iZXIpIHZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAoKE51bWJlcikgdmFsdWUpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICAgICAgQm9vbGVhbiBib29sID0gKEJvb2xlYW4pdmFsdWU7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgKGJvb2wpID8gMSA6IDApOworICAgICAgICAgICAgICAgIGlmIChib29sKSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10peworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IoaW5kZXgsIChieXRlW10pIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfc3RyaW5nKGluZGV4LCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGFuIGFycmF5IG9mIFN0cmluZyBiaW5kQXJncywgdGhpcyBtZXRob2QgYmluZHMgYWxsIG9mIHRoZW0gaW4gb25lIHNpbmdsZSBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRBcmdzIHRoZSBTdHJpbmcgYXJyYXkgb2YgYmluZCBhcmdzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJpbmRBbGxBcmdzQXNTdHJpbmdzKFN0cmluZ1tdIGJpbmRBcmdzKSB7CisgICAgICAgIGlmIChiaW5kQXJncyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IHNpemUgPSBiaW5kQXJncy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBiaW5kU3RyaW5nKGkgKyAxLCBiaW5kQXJnc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIHNldE5hdGl2ZUhhbmRsZShpbnQgbkhhbmRsZSkgeworICAgICAgICB0aGlzLm5IYW5kbGUgPSBuSGFuZGxlOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQppbmRleCA5MDViNjZiLi5lOWUwMTcyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQpAQCAtMjgsMjggKzI4LDM4IEBACiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVF1ZXJ5LgogICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlUXVlcnkgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN1cnNvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVRdWVyeSI7CiAKICAgICAvKiogVGhlIGluZGV4IG9mIHRoZSB1bmJvdW5kIE9GRlNFVCBwYXJhbWV0ZXIgKi8KLSAgICBwcml2YXRlIGludCBtT2Zmc2V0SW5kZXg7Ci0gICAgCi0gICAgLyoqIEFyZ3MgdG8gYmluZCBvbiByZXF1ZXJ5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtQmluZEFyZ3M7CisgICAgcHJpdmF0ZSBpbnQgbU9mZnNldEluZGV4ID0gMDsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2VkID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBwZXJzaXN0ZW50IHF1ZXJ5IG9iamVjdC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBkYiBUaGUgZGF0YWJhc2UgdGhhdCB0aGlzIHF1ZXJ5IG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGgKICAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIFNRTCBzdHJpbmcgZm9yIHRoaXMgcXVlcnkuIAogICAgICAqIEBwYXJhbSBvZmZzZXRJbmRleCBUaGUgMS1iYXNlZCBpbmRleCB0byB0aGUgT0ZGU0VUIHBhcmFtZXRlciwgCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVRdWVyeShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHF1ZXJ5LCBpbnQgb2Zmc2V0SW5kZXgsIFN0cmluZ1tdIGJpbmRBcmdzKSB7CiAgICAgICAgIHN1cGVyKGRiLCBxdWVyeSk7Ci0KICAgICAgICAgbU9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7Ci0gICAgICAgIG1CaW5kQXJncyA9IGJpbmRBcmdzOworICAgICAgICBiaW5kQWxsQXJnc0FzU3RyaW5ncyhiaW5kQXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlIHRvIHJlcGxhY2UgYSBnaXZlbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB3aGVuIHRoZSBjdXJyZW50IFF1ZXJ5IG9iamVjdCBpcyBub3cgYXNzb2NpYXRlZCB3aXRoIGEgZGlmZmVyZW50CisgICAgICoge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgVGhlIGRhdGFiYXNlIHRoYXQgdGhpcyBxdWVyeSBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgU1FMaXRlUXVlcnl9IHRvIGJlIHJlcGxhY2VkCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVRdWVyeShTUUxpdGVEYXRhYmFzZSBkYiwgU1FMaXRlUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgc3VwZXIoZGIsIHF1ZXJ5Lm1TcWwpOworICAgICAgICB0aGlzLm1CaW5kQXJncyA9IHF1ZXJ5Lm1CaW5kQXJnczsKKyAgICAgICAgdGhpcy5tT2Zmc2V0SW5kZXggPSBxdWVyeS5tT2Zmc2V0SW5kZXg7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MCwxMyArODAsOCBAQAogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzdGFydCBwb3MgaXMgbm90IGVxdWFsIHRvIDAsIHRoZW4gbW9zdCBsaWtlbHkgd2luZG93IGlzCiAgICAgICAgICAgICAgICAgLy8gdG9vIHNtYWxsIGZvciB0aGUgZGF0YSBzZXQsIGxvYWRpbmcgYnkgYW5vdGhlciB0aHJlYWQKICAgICAgICAgICAgICAgICAvLyBpcyBub3Qgc2FmZSBpbiB0aGlzIHNpdHVhdGlvbi4gdGhlIG5hdGl2ZSBjb2RlIHdpbGwgaWdub3JlIG1heFJlYWQKLSAgICAgICAgICAgICAgICBpbnQgbnVtUm93cyA9IG5hdGl2ZV9maWxsX3dpbmRvdyh3aW5kb3csIHdpbmRvdy5nZXRTdGFydFBvc2l0aW9uKCksIG1PZmZzZXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlYWQsIGxhc3RQb3MpOwotCi0gICAgICAgICAgICAgICAgLy8gTG9nZ2luZwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmaWxsV2luZG93KCk6ICIgKyBtU3FsKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG51bVJvd3MgPSBuYXRpdmVfZmlsbF93aW5kb3cod2luZG93LCB3aW5kb3cuZ2V0U3RhcnRQb3NpdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU9mZnNldEluZGV4LCBtYXhSZWFkLCBsYXN0UG9zKTsKICAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVtUm93czsKICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKXsKQEAgLTg1LDYgKzkwLDkgQEAKICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgbURhdGFiYXNlLm9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpICsgIjsgcXVlcnk6ICIgKyBtU3FsKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICB3aW5kb3cucmVsZWFzZVJlZmVyZW5jZSgpOwogICAgICAgICAgICAgfQpAQCAtMTQxLDUxICsxNDksMTMgQEAKICAgICAgKiBDYWxsZWQgYnkgU1FMaXRlQ3Vyc29yIHdoZW4gaXQgaXMgcmVxdWVyaWVkLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZXF1ZXJ5KCkgewotICAgICAgICBpZiAobUJpbmRBcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsZW4gPSBtQmluZEFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLmJpbmRTdHJpbmcoaSArIDEsIG1CaW5kQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlTWlzdXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVyck1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJtU3FsICIgKyBtU3FsKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZChtQmluZEFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGxlYWtQcm9ncmFtID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyck1zZy50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBsZWFrUHJvZ3JhbTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtQ2xvc2VkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJyZXF1ZXJ5aW5nIGEgY2xvc2VkIGN1cnNvciIpOwogICAgICAgICB9CisgICAgICAgIGNvbXBpbGVBbmRiaW5kQWxsQXJncygpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmROdWxsKGludCBpbmRleCkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IG51bGw7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZE51bGwoaW5kZXgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmRMb25nKGludCBpbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IExvbmcudG9TdHJpbmcodmFsdWUpOwotICAgICAgICBpZiAoIW1DbG9zZWQpIHN1cGVyLmJpbmRMb25nKGluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmluZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IERvdWJsZS50b1N0cmluZyh2YWx1ZSk7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZERvdWJsZShpbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmRTdHJpbmcoaW50IGluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbUJpbmRBcmdzW2luZGV4IC0gMV0gPSB2YWx1ZTsKLSAgICAgICAgaWYgKCFtQ2xvc2VkKSBzdXBlci5iaW5kU3RyaW5nKGluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9maWxsX3dpbmRvdyhDdXJzb3JXaW5kb3cgd2luZG93LCAKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2ZpbGxfd2luZG93KEN1cnNvcldpbmRvdyB3aW5kb3csCiAgICAgICAgICAgICBpbnQgc3RhcnRQb3MsIGludCBvZmZzZXRQYXJhbSwgaW50IG1heFJlYWQsIGludCBsYXN0UG9zKTsKIAogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfY29sdW1uX2NvdW50KCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjYzM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCmluZGV4IDllNDI1YzMuLjVlOTY5MjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKQEAgLTE2LDcgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5CbG9ja0d1YXJkOwogCkBAIC0yNSw0NCArMzAsNzAgQEAKICAqIFRoZSBzdGF0ZW1lbnQgY2Fubm90IHJldHVybiBtdWx0aXBsZSByb3dzLCBidXQgMXgxIHJlc3VsdCBzZXRzIGFyZSBhbGxvd2VkLgogICogRG9uJ3QgdXNlIFNRTGl0ZVN0YXRlbWVudCBjb25zdHJ1Y3RvciBkaXJlY3RseSwgcGxlYXNlIHVzZQogICoge0BsaW5rIFNRTGl0ZURhdGFiYXNlI2NvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nKX0KLSAqCi0gKiBTUUxpdGVTdGF0ZW1lbnQgaXMgbm90IGludGVybmFsbHkgc3luY2hyb25pemVkIHNvIGNvZGUgdXNpbmcgYSBTUUxpdGVTdGF0ZW1lbnQgZnJvbSBtdWx0aXBsZQorICo8cD4KKyAqIFNRTGl0ZVN0YXRlbWVudCBpcyBOT1QgaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQgc28gY29kZSB1c2luZyBhIFNRTGl0ZVN0YXRlbWVudCBmcm9tIG11bHRpcGxlCiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVN0YXRlbWVudC4KICAqLworQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKIHB1YmxpYyBjbGFzcyBTUUxpdGVTdGF0ZW1lbnQgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtCiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVTdGF0ZW1lbnQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFEID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1PcmlnRGI7CisgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOworICAgIC8qKiBwb3NzaWJsZSB2YWx1ZSBmb3Ige0BsaW5rICNtU3RhdGV9LiBpbmRpY2F0ZXMgdGhhdCBhIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQU5TX1NUQVJURUQgPSAxOworICAgIC8qKiBwb3NzaWJsZSB2YWx1ZSBmb3Ige0BsaW5rICNtU3RhdGV9LiBpbmRpY2F0ZXMgdGhhdCBhIGxvY2sgaXMgYWNxdWlyZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfQUNRVUlSRUQgPSAyOworCiAgICAgLyoqCiAgICAgICogRG9uJ3QgdXNlIFNRTGl0ZVN0YXRlbWVudCBjb25zdHJ1Y3RvciBkaXJlY3RseSwgcGxlYXNlIHVzZQogICAgICAqIHtAbGluayBTUUxpdGVEYXRhYmFzZSNjb21waWxlU3RhdGVtZW50KFN0cmluZyl9CiAgICAgICogQHBhcmFtIGRiCiAgICAgICogQHBhcmFtIHNxbAogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlU3RhdGVtZW50KFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN1cGVyKGRiLCBzcWwpOworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlU3RhdGVtZW50KFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsLCBPYmplY3RbXSBiaW5kQXJncykgeworICAgICAgICBzdXBlcihkYiwgc3FsLCBiaW5kQXJncywgZmFsc2UgLyogZG9uJ3QgY29tcGlsZSBzcWwgc3RhdGVtZW50ICovKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoaXMgU1FMIHN0YXRlbWVudCwgaWYgaXQgaXMgbm90IGEgcXVlcnkuIEZvciBleGFtcGxlLAotICAgICAqIENSRUFURSBUQUJMRSwgREVMVEUsIElOU0VSVCwgZXRjLgorICAgICAqIEV4ZWN1dGUgdGhpcyBTUUwgc3RhdGVtZW50LCBpZiBpdCBpcyBub3QgYSBTRUxFQ1QgLyBJTlNFUlQgLyBERUxFVEUgLyBVUERBVEUsIGZvciBleGFtcGxlCisgICAgICogQ1JFQVRFIC8gRFJPUCB0YWJsZSwgdmlldywgdHJpZ2dlciwgaW5kZXggZXRjLgogICAgICAqCiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvcgogICAgICAqICAgICAgICAgc29tZSByZWFzb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgIGV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKKyAgICB9CiAKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhpcyBTUUwgc3RhdGVtZW50LCBpZiB0aGUgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGV4ZWN1dGlvbiBvZiB0aGlzIFNRTAorICAgICAqIHN0YXRlbWVudCBpcyBvZiBhbnkgaW1wb3J0YW5jZSB0byB0aGUgY2FsbGVyIC0gZm9yIGV4YW1wbGUsIFVQREFURSAvIERFTEVURSBTUUwgc3RhdGVtZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IHRoaXMgU1FMIHN0YXRlbWVudCBleGVjdXRpb24uCisgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvcgorICAgICAqICAgICAgICAgc29tZSByZWFzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGVEZWxldGUoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhXUklURSk7CisgICAgICAgICAgICBpbnQgbnVtQ2hhbmdlcyA9IDA7CisgICAgICAgICAgICBpZiAoKG1TdGF0ZW1lbnRUeXBlICYgU1RBVEVNRU5UX0RPTlRfUFJFUEFSRSkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXRlbWVudCBkb2Vzbid0IGhhdmUgdG8gYmUgcHJlcGFyZWQsCisgICAgICAgICAgICAgICAgLy8gY2FsbCB0aGUgZm9sbG93aW5nIG5hdGl2ZSBtZXRob2Qgd2hpY2ggd2lsbCBub3QgcHJlcGFyZQorICAgICAgICAgICAgICAgIC8vIHRoZSBxdWVyeSBwbGFuCisgICAgICAgICAgICAgICAgbmF0aXZlX2V4ZWN1dGVTcWwobVNxbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG51bUNoYW5nZXMgPSBuYXRpdmVfZXhlY3V0ZSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICByZXR1cm4gbnVtQ2hhbmdlczsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgICAgIHJlbGVhc2VBbmRVbmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzYsMjEgKzEwNywxMyBAQAogICAgICAqICAgICAgICAgc29tZSByZWFzb24KICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBleGVjdXRlSW5zZXJ0KCkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soV1JJVEUpOworICAgICAgICAgICAgbG9uZyBsYXN0SW5zZXJ0ZWRSb3dJZCA9IG5hdGl2ZV9leGVjdXRlSW5zZXJ0KCk7CiAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKLSAgICAgICAgICAgIHJldHVybiAobURhdGFiYXNlLmxhc3RDaGFuZ2VDb3VudCgpID4gMCkgPyBtRGF0YWJhc2UubGFzdEluc2VydFJvdygpIDogLTE7CisgICAgICAgICAgICByZXR1cm4gbGFzdEluc2VydGVkUm93SWQ7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwMywyMSArMTI2LDEzIEBACiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEb25lRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSByZXR1cm5zIHplcm8gcm93cwogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHNpbXBsZVF1ZXJ5Rm9yTG9uZygpIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFJFQUQpOwogICAgICAgICAgICAgbG9uZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfbG9uZygpOwogICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzMCwyNSArMTQ1LDEzNiBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CiAgICAgICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSBuYXRpdmVfMXgxX3N0cmluZygpOwogICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjdXRlKCk7CisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zIGEgMSBieSAxIHRhYmxlIHdpdGggYSBibG9iIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiBBIHJlYWQtb25seSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgY29weSBvZiB0aGUgYmxvYiB2YWx1ZSwgb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciBjb3VsZCBub3QgYmUgcmVhZCBmb3Igc29tZSByZWFzb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURvbmVFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IHJldHVybnMgemVybyByb3dzCisgICAgICovCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHNpbXBsZVF1ZXJ5Rm9yQmxvYkZpbGVEZXNjcmlwdG9yKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhSRUFEKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHJldFZhbHVlID0gbmF0aXZlXzF4MV9ibG9iX2FzaG1lbSgpOworICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJzaW1wbGVRdWVyeUZvckJsb2JGaWxlRGVzY3JpcHRvcigpIGZhaWxlZCIsIGV4KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJlZm9yZSBldmVyeSBtZXRob2QgaW4gdGhpcyBjbGFzcyBiZWZvcmUgZXhlY3V0aW5nIGEgU1FMIHN0YXRlbWVudCwKKyAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPm1ha2Ugc3VyZSB0aGUgZGF0YWJhc2UgaXMgb3BlbjwvbGk+CisgICAgICogICA8bGk+Z2V0IGEgZGF0YWJhc2UgY29ubmVjdGlvbiBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wsaWYgcG9zc2libGU8L2xpPgorICAgICAqICAgPGxpPm5vdGlmaWVzIHtAbGluayBCbG9ja0d1YXJkfSBvZiByZWFkL3dyaXRlPC9saT4KKyAgICAgKiAgIDxsaT5pZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBhbiB1cGRhdGUsIHN0YXJ0IHRyYW5zYWN0aW9uIGlmIG5vdCBhbHJlYWR5IGluIG9uZS4KKyAgICAgKiAgIG90aGVyd2lzZSwgZ2V0IGxvY2sgb24gdGhlIGRhdGFiYXNlPC9saT4KKyAgICAgKiAgIDxsaT5hY3F1aXJlIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdDwvbGk+CisgICAgICogICA8bGk+YW5kIHRoZW4gcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgX2JlZm9yZV8gdGhlIGRhdGFiYXNlIGxvY2sgd2FzIGFjcXVpcmVkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGR1cGxpY2F0ZSBjb2RlIGZyb20gdGhlIG90aGVyIHB1YmxpYworICAgICAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgYWNxdWlyZUFuZExvY2soYm9vbGVhbiByd0ZsYWcpIHsKKyAgICAgICAgbVN0YXRlID0gMDsKKyAgICAgICAgLy8gdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZXMgZm9yIFNFTEVDVCBTUUwgc3RhdGVtZW50cworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSAoKG1TdGF0ZW1lbnRUeXBlICYgU1FMaXRlUHJvZ3JhbS5TVEFURU1FTlRfVVNFX1BPT0xFRF9DT05OKSA+IDApCisgICAgICAgICAgICAgICAgPyBtRGF0YWJhc2UuZ2V0RGJDb25uZWN0aW9uKG1TcWwpIDogbURhdGFiYXNlOworICAgICAgICAvLyB1c2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gb2J0YWluZWQgYWJvdmUKKyAgICAgICAgbU9yaWdEYiA9IG1EYXRhYmFzZTsKKyAgICAgICAgbURhdGFiYXNlID0gZGI7CisgICAgICAgIHNldE5hdGl2ZUhhbmRsZShtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSk7CisgICAgICAgIGlmIChyd0ZsYWcgPT0gV1JJVEUpIHsKKyAgICAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mIFNRTGl0ZURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuCisgICAgICAgICAqIHdlIGtub3cgaXQgaXMgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKSBmcm9tIHRoZSBjYWxsZXIgSUYgdGhlcmUgaXMgbm8gbG9jayBoZWxkLgorICAgICAgICAgKiBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBpbiBTUUxpdGVEYXRhYmFzZSBjYWxsIGxvY2tGb3JjZWQoKSBiZWZvcmUKKyAgICAgICAgICogY2FsbGluZyBleGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChtU3RhdGVtZW50VHlwZSAmIFNRTGl0ZVByb2dyYW0uU1RBVEVNRU5UX1RZUEVfTUFTSykgPT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQkVHSU4pIHsKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uIGlzICBOT1Qgc3RhcnRlZCBieSBjYWxsaW5nIGJlZ2luVHJhbnNhY3Rpb24oKSBtZXRob2RzIGluCisgICAgICAgICAgICAgICAgLy8gU1FMaXRlRGF0YWJhc2UKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKG1TdGF0ZW1lbnRUeXBlICYgU1FMaXRlUHJvZ3JhbS5TVEFURU1FTlRfVFlQRV9NQVNLKSA9PQorICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX1VQREFURSkgeworICAgICAgICAgICAgLy8gZ290IHVwZGF0ZSBTUUwgc3RhdGVtZW50LiBpZiB0aGVyZSBpcyBOTyBwZW5kaW5nIHRyYW5zYWN0aW9uLCBzdGFydCBvbmUKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gVFJBTlNfU1RBUlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBkbyBJIGhhdmUgZGF0YWJhc2UgbG9jaz8gaWYgbm90LCBncmFiIGl0LgorICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBMT0NLX0FDUVVJUkVEOworICAgICAgICB9CisKKyAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICBjb21waWxlQW5kYmluZEFsbEFyZ3MoKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIG1ldGhvZCByZWxlYXNlcyBsb2NrcyBhbmQgcmVmZXJlbmNlcyBhY3F1aXJlZCBpbiB7QGxpbmsgI2FjcXVpcmVBbmRMb2NrKGJvb2xlYW4pfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQW5kVW5sb2NrKCkgeworICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIGlmIChtU3RhdGUgPT0gVFJBTlNfU1RBUlRFRCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBMT0NLX0FDUVVJUkVEKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtU3RhdGVtZW50VHlwZSAmIFNRTGl0ZVByb2dyYW0uU1RBVEVNRU5UX1RZUEVfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9DT01NSVQgfHwKKyAgICAgICAgICAgICAgICAobVN0YXRlbWVudFR5cGUgJiBTUUxpdGVQcm9ncmFtLlNUQVRFTUVOVF9UWVBFX01BU0spID09CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQUJPUlQpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5yZXNldFRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsRmxhZygpOworICAgICAgICB9CisgICAgICAgIGNsZWFyQmluZGluZ3MoKTsKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgY29tcGlsZWQgc3FsIHN0YXRlbWVudCBzbyB0aGF0IHRoZSBjYWxsZXIncyBTUUxpdGVTdGF0ZW1lbnQgbm8gbG9uZ2VyCisgICAgICAgIC8vIGhhcyBhIGhhcmQgcmVmZXJlbmNlIHRvIGEgZGF0YWJhc2Ugb2JqZWN0IHRoYXQgbWF5IGdldCBkZWFsbG9jYXRlZCBhdCBhbnkgcG9pbnQuCisgICAgICAgIHJlbGVhc2UoKTsKKyAgICAgICAgLy8gcmVzdG9yZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgdG8gdGhlIG9yaWdpbmFsIHZhbHVlCisgICAgICAgIG1EYXRhYmFzZSA9IG1PcmlnRGI7CisgICAgICAgIHNldE5hdGl2ZUhhbmRsZShtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9leGVjdXRlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgbG9uZyBuYXRpdmVfZXhlY3V0ZUluc2VydCgpOwogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGxvbmcgbmF0aXZlXzF4MV9sb25nKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgU3RyaW5nIG5hdGl2ZV8xeDFfc3RyaW5nKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmF0aXZlXzF4MV9ibG9iX2FzaG1lbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjdXRlU3FsKFN0cmluZyBzcWwpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc4ZGYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVVbmZpbmFsaXplZE9iamVjdHNFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVVbmZpbmFsaXplZE9iamVjdHNFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Y5NWUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCisvKioKKyAqIFRocm93biBpZiB0aGUgZGF0YWJhc2UgY2FuJ3QgYmUgY2xvc2VkIGJlY2F1c2Ugb2Ygc29tZSB1bi1jbG9zZWQKKyAqIEN1cnNvciBvciBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0cy4gQ291bGQgaGFwcGVuIHdoZW4gYSB0aHJlYWQgaXMgdHJ5aW5nIHRvIGNsb3NlCisgKiB0aGUgZGF0YWJhc2Ugd2hpbGUgYW5vdGhlciB0aHJlYWQgc3RpbGwgaGFzbid0IGNsb3NlZCBhIEN1cnNvciBvbiB0aGF0IGRhdGFiYXNlLgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFNRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvVXNiLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YQppbmRleCA1NzI3MWQ0Li5lYmI4Mjk2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YQpAQCAtMTcsNiArMTcsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlOwogCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIC8qKgogICogQ2xhc3MgZm9yIGFjY2Vzc2luZyBVU0Igc3RhdGUgaW5mb3JtYXRpb24uCiAgKiBAaGlkZQpAQCAtNTUsNiArNTksMjQgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVNCX1NUQVRFID0KICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfU1RBVEUiOwogCisgICAvKioKKyAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiAgQSBicm9hZGNhc3QgZm9yIFVTQiBjYW1lcmEgYXR0YWNoZWQgZXZlbnQuCisgICAgICoKKyAgICAgKiBUaGlzIGludGVudCBpcyBzZW50IHdoZW4gYSBVU0IgZGV2aWNlIHN1cHBvcnRpbmcgUFRQIGlzIGF0dGFjaGVkIHRvIHRoZSBob3N0IFVTQiBidXMuCisgICAgICogVGhlIGludGVudCdzIGRhdGEgY29udGFpbnMgYSBVcmkgZm9yIHRoZSBkZXZpY2UgaW4gdGhlIE1UUCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVNCX0NBTUVSQV9BVFRBQ0hFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9BVFRBQ0hFRCI7CisKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCBmb3IgVVNCIGNhbWVyYSBkZXRhY2hlZCBldmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgaW50ZW50IGlzIHNlbnQgd2hlbiBhIFVTQiBkZXZpY2Ugc3VwcG9ydGluZyBQVFAgaXMgZGV0YWNoZWQgZnJvbSB0aGUgaG9zdCBVU0IgYnVzLgorICAgICAqIFRoZSBpbnRlbnQncyBkYXRhIGNvbnRhaW5zIGEgVXJpIGZvciB0aGUgZGV2aWNlIGluIHRoZSBNVFAgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1VTQl9DQU1FUkFfREVUQUNIRUQgPQorICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DQU1FUkFfREVUQUNIRUQiOworCiAgICAgLyoqCiAgICAgICogQm9vbGVhbiBleHRyYSBpbmRpY2F0aW5nIHdoZXRoZXIgVVNCIGlzIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQuCiAgICAgICogVXNlZCBpbiBleHRyYXMgZm9yIHRoZSB7QGxpbmsgI0FDVElPTl9VU0JfU1RBVEV9IGJyb2FkY2FzdC4KQEAgLTk2LDQgKzExOCwzMCBAQAogICAgICAqIFVzZWQgaW4gZXh0cmFzIGZvciB0aGUge0BsaW5rICNBQ1RJT05fVVNCX0NPTk5FQ1RFRH0gYnJvYWRjYXN0CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0ZVTkNUSU9OX0RJU0FCTEVEID0gImRpc2FibGVkIjsKKworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0RnVuY3Rpb25FbmFibGVGaWxlKFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoIi9zeXMvY2xhc3MvdXNiX2NvbXBvc2l0ZS8iICsgZnVuY3Rpb24gKyAiL2VuYWJsZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFVTQiBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC4KKyAgICAgKiBOb3RlIHRoYXQgYSBVU0IgZnVuY3Rpb24gbWF5YmUgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGdW5jdGlvblN1cHBvcnRlZChTdHJpbmcgZnVuY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uRW5hYmxlRmlsZShmdW5jdGlvbikuZXhpc3RzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVVNCIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Z1bmN0aW9uRW5hYmxlZChTdHJpbmcgZnVuY3Rpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGdldEZ1bmN0aW9uRW5hYmxlRmlsZShmdW5jdGlvbikpOworICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gKHN0cmVhbS5yZWFkKCkgPT0gJzEnKTsKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWQ7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9BYnN0cmFjdElucHV0TWV0aG9kU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0Fic3RyYWN0SW5wdXRNZXRob2RTZXJ2aWNlLmphdmEKaW5kZXggMzYxOTY1My4uMjdhZjAxMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0Fic3RyYWN0SW5wdXRNZXRob2RTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0Fic3RyYWN0SW5wdXRNZXRob2RTZXJ2aWNlLmphdmEKQEAgLTE3Nyw2ICsxNzcsNyBAQAogICAgICAqIEltcGxlbWVudCB0aGlzIHRvIGhhbmRsZSB7QGxpbmsgYW5kcm9pZC5vcy5CaW5kZXIjZHVtcCBCaW5kZXIuZHVtcCgpfQogICAgICAqIGNhbGxzIG9uIHlvdXIgaW5wdXQgbWV0aG9kLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIGZvdXQsIFN0cmluZ1tdIGFyZ3MpIHsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0RWRpdFRleHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0RWRpdFRleHQuamF2YQppbmRleCA4YTUyZTQwLi4yMjk2OGIwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEVkaXRUZXh0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RFZGl0VGV4dC5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRXh0cmFjdGVkVGV4dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIApAQCAtMjksNyArMjgsNiBAQAogcHVibGljIGNsYXNzIEV4dHJhY3RFZGl0VGV4dCBleHRlbmRzIEVkaXRUZXh0IHsKICAgICBwcml2YXRlIElucHV0TWV0aG9kU2VydmljZSBtSU1FOwogICAgIHByaXZhdGUgaW50IG1TZXR0aW5nRXh0cmFjdGVkVGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNvbnRleHRNZW51U2hvdWxkQmVIYW5kbGVkQnlTdXBlciA9IGZhbHNlOwogICAgIAogICAgIHB1YmxpYyBFeHRyYWN0RWRpdFRleHQoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwpOwpAQCAtOTksMTkgKzk3LDEyIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51KSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSk7Ci0gICAgICAgIG1Db250ZXh0TWVudVNob3VsZEJlSGFuZGxlZEJ5U3VwZXIgPSB0cnVlOwotICAgIH0KLQogICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRleHRDb250ZXh0TWVudUl0ZW0oaW50IGlkKSB7Ci0gICAgICAgIGlmIChtSU1FICE9IG51bGwgJiYgIW1Db250ZXh0TWVudVNob3VsZEJlSGFuZGxlZEJ5U3VwZXIpIHsKKyAgICAgICAgaWYgKG1JTUUgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1JTUUub25FeHRyYWN0VGV4dENvbnRleHRNZW51SXRlbShpZCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtQ29udGV4dE1lbnVTaG91bGRCZUhhbmRsZWRCeVN1cGVyID0gZmFsc2U7CiAgICAgICAgIHJldHVybiBzdXBlci5vblRleHRDb250ZXh0TWVudUl0ZW0oaWQpOwogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9JSW5wdXRNZXRob2RXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvSUlucHV0TWV0aG9kV3JhcHBlci5qYXZhCmluZGV4IDM1ZmQ0NmYuLjI0ZWE3ZDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9JSW5wdXRNZXRob2RXcmFwcGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0lJbnB1dE1ldGhvZFdyYXBwZXIuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFNlc3Npb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU3VidHlwZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKQEAgLTY0LDYgKzY1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9fUkVWT0tFX1NFU1NJT04gPSA1MDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9fU0hPV19TT0ZUX0lOUFVUID0gNjA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPX0hJREVfU09GVF9JTlBVVCA9IDcwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET19DSEFOR0VfSU5QVVRNRVRIT0RfU1VCVFlQRSA9IDgwOwogICAgCiAgICAgZmluYWwgV2Vha1JlZmVyZW5jZTxBYnN0cmFjdElucHV0TWV0aG9kU2VydmljZT4gbVRhcmdldDsKICAgICBmaW5hbCBIYW5kbGVyQ2FsbGVyIG1DYWxsZXI7CkBAIC0xNzgsNiArMTgwLDkgQEAKICAgICAgICAgICAgIGNhc2UgRE9fSElERV9TT0ZUX0lOUFVUOgogICAgICAgICAgICAgICAgIGlucHV0TWV0aG9kLmhpZGVTb2Z0SW5wdXQobXNnLmFyZzEsIChSZXN1bHRSZWNlaXZlciltc2cub2JqKTsKICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIERPX0NIQU5HRV9JTlBVVE1FVEhPRF9TVUJUWVBFOgorICAgICAgICAgICAgICAgIGlucHV0TWV0aG9kLmNoYW5nZUlucHV0TWV0aG9kU3VidHlwZSgoSW5wdXRNZXRob2RTdWJ0eXBlKW1zZy5vYmopOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBMb2cudyhUQUcsICJVbmhhbmRsZWQgbWVzc2FnZSBjb2RlOiAiICsgbXNnLndoYXQpOwogICAgIH0KQEAgLTI2Nyw0ICsyNzIsOSBAQAogICAgICAgICBtQ2FsbGVyLmV4ZWN1dGVPclNlbmRNZXNzYWdlKG1DYWxsZXIub2J0YWluTWVzc2FnZUlPKERPX0hJREVfU09GVF9JTlBVVCwKICAgICAgICAgICAgICAgICBmbGFncywgcmVzdWx0UmVjZWl2ZXIpKTsKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VJbnB1dE1ldGhvZFN1YnR5cGUoSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUpIHsKKyAgICAgICAgbUNhbGxlci5leGVjdXRlT3JTZW5kTWVzc2FnZShtQ2FsbGVyLm9idGFpbk1lc3NhZ2VPKERPX0NIQU5HRV9JTlBVVE1FVEhPRF9TVUJUWVBFLAorICAgICAgICAgICAgICAgIHN1YnR5cGUpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvSW5wdXRNZXRob2RTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvSW5wdXRNZXRob2RTZXJ2aWNlLmphdmEKaW5kZXggMWEyNjFkMy4uNjA4OTAxMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0lucHV0TWV0aG9kU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9JbnB1dE1ldGhvZFNlcnZpY2UuamF2YQpAQCAtNTIsNiArNTIsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU3VidHlwZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CkBAIC0yNzAsNyArMjcxLDcgQEAKIAogICAgIGZpbmFsIEluc2V0cyBtVG1wSW5zZXRzID0gbmV3IEluc2V0cygpOwogICAgIGZpbmFsIGludFtdIG1UbXBMb2NhdGlvbiA9IG5ldyBpbnRbMl07Ci0gICAgCisKICAgICBmaW5hbCBWaWV3VHJlZU9ic2VydmVyLk9uQ29tcHV0ZUludGVybmFsSW5zZXRzTGlzdGVuZXIgbUluc2V0c0NvbXB1dGVyID0KICAgICAgICAgICAgIG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uQ29tcHV0ZUludGVybmFsSW5zZXRzTGlzdGVuZXIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcHV0ZUludGVybmFsSW5zZXRzKFZpZXdUcmVlT2JzZXJ2ZXIuSW50ZXJuYWxJbnNldHNJbmZvIGluZm8pIHsKQEAgLTM5NCw4ICszOTUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbnB1dE1ldGhvZE1hbmFnZXIuUkVTVUxUX1VOQ0hBTkdFRF9ISURERU4pLCBudWxsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5nZUlucHV0TWV0aG9kU3VidHlwZShJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSkgeworICAgICAgICAgICAgb25DdXJyZW50SW5wdXRNZXRob2RTdWJ0eXBlQ2hhbmdlZChzdWJ0eXBlKTsKKyAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mCiAgICAgICoge0BsaW5rIEFic3RyYWN0SW5wdXRNZXRob2RTZXJ2aWNlLkFic3RyYWN0SW5wdXRNZXRob2RTZXNzaW9uSW1wbH0gdGhhdCBwcm92aWRlcwpAQCAtNTQxLDYgKzU0Niw3IEBACiAgICAgICogd2lsbCB0eXBpY2FsbHkgY2FsbCBpdCBpbiB5b3VyIGNvbnN0cnVjdG9yIHdpdGggdGhlIHJlc291cmNlIElECiAgICAgICogb2YgeW91ciBjdXN0b20gdGhlbWUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VGhlbWUoaW50IHRoZW1lKSB7CiAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk11c3QgYmUgY2FsbGVkIGJlZm9yZSBvbkNyZWF0ZSgpIik7CkBAIC01NTgsNyArNTY0LDcgQEAKICAgICAgICAgaW5pdFZpZXdzKCk7CiAgICAgICAgIG1XaW5kb3cuZ2V0V2luZG93KCkuc2V0TGF5b3V0KE1BVENIX1BBUkVOVCwgV1JBUF9DT05URU5UKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUaGlzIGlzIGEgaG9vayB0aGF0IHN1YmNsYXNzZXMgY2FuIHVzZSB0byBwZXJmb3JtIGluaXRpYWxpemF0aW9uIG9mCiAgICAgICogdGhlaXIgaW50ZXJmYWNlLiAgSXQgaXMgY2FsbGVkIGZvciB5b3UgcHJpb3IgdG8gYW55IG9mIHlvdXIgVUkgb2JqZWN0cwpAQCAtNTY3LDE0ICs1NzMsMTQgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvbkluaXRpYWxpemVJbnRlcmZhY2UoKSB7CiAgICAgfQotICAgIAorCiAgICAgdm9pZCBpbml0aWFsaXplKCkgewogICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZUludGVyZmFjZSgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCBpbml0Vmlld3MoKSB7CiAgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwogICAgICAgICBtV2luZG93Q3JlYXRlZCA9IGZhbHNlOwpAQCAtNjEwLDcgKzYxNiw3IEBACiAgICAgICAgIG1DYW5kaWRhdGVzRnJhbWUuc2V0VmlzaWJpbGl0eShtQ2FuZGlkYXRlc1Zpc2liaWxpdHkpOwogICAgICAgICBtSW5wdXRGcmFtZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CiAgICAgICAgIG1Sb290Vmlldy5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlT25Db21wdXRlSW50ZXJuYWxJbnNldHNMaXN0ZW5lcigKQEAgLTY3Nyw2ICs2ODMsNyBAQAogICAgICAqIEltcGxlbWVudCB0byByZXR1cm4gb3VyIHN0YW5kYXJkIHtAbGluayBJbnB1dE1ldGhvZEltcGx9LiAgU3ViY2xhc3NlcwogICAgICAqIGNhbiBvdmVycmlkZSB0byBwcm92aWRlIHRoZWlyIG93biBjdXN0b21pemVkIHZlcnNpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFic3RyYWN0SW5wdXRNZXRob2RJbXBsIG9uQ3JlYXRlSW5wdXRNZXRob2RJbnRlcmZhY2UoKSB7CiAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RJbXBsKCk7CiAgICAgfQpAQCAtNjg1LDYgKzY5Miw3IEBACiAgICAgICogSW1wbGVtZW50IHRvIHJldHVybiBvdXIgc3RhbmRhcmQge0BsaW5rIElucHV0TWV0aG9kU2Vzc2lvbkltcGx9LiAgU3ViY2xhc3NlcwogICAgICAqIGNhbiBvdmVycmlkZSB0byBwcm92aWRlIHRoZWlyIG93biBjdXN0b21pemVkIHZlcnNpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFic3RyYWN0SW5wdXRNZXRob2RTZXNzaW9uSW1wbCBvbkNyZWF0ZUlucHV0TWV0aG9kU2Vzc2lvbkludGVyZmFjZSgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dE1ldGhvZFNlc3Npb25JbXBsKCk7CiAgICAgfQpAQCAtMTY1Niw2ICsxNjY0LDcgQEAKICAgICAgICAgcmV0dXJuIGRvTW92ZW1lbnRLZXkoa2V5Q29kZSwgZXZlbnQsIE1PVkVNRU5UX1VQKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xNjk0LDcgKzE3MDMsNyBAQAogICAgICAgICAgICAgICAgIGR5ID0gY291bnQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgb25FeHRyYWN0ZWRDdXJzb3JNb3ZlbWVudChkeCwgZHkpOyAgICAgICAKKyAgICAgICAgb25FeHRyYWN0ZWRDdXJzb3JNb3ZlbWVudChkeCwgZHkpOwogICAgIH0KICAgICAKICAgICBib29sZWFuIGRvTW92ZW1lbnRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50LCBpbnQgY291bnQpIHsKQEAgLTIwNjQsNyArMjA3MywyNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgLy8gVE9ETzogSGFuZGxlIHRoZSBzdWJ0eXBlIGNoYW5nZSBldmVudAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdWJ0eXBlIHdhcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBuZXdTdWJ0eXBlIHRoZSBzdWJ0eXBlIHdoaWNoIGlzIGJlaW5nIGNoYW5nZWQgdG8uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgb25DdXJyZW50SW5wdXRNZXRob2RTdWJ0eXBlQ2hhbmdlZChJbnB1dE1ldGhvZFN1YnR5cGUgbmV3U3VidHlwZSkgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIGludCBuYW1lUmVzSWQgPSBuZXdTdWJ0eXBlLmdldE5hbWVSZXNJZCgpOworICAgICAgICAgICAgaW50IG1vZGVSZXNJZCA9IG5ld1N1YnR5cGUuZ2V0TW9kZVJlc0lkKCk7CisgICAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gImNoYW5nZUlucHV0TWV0aG9kU3VidHlwZToiCisgICAgICAgICAgICAgICAgKyAobmFtZVJlc0lkID09IDAgPyAiPG5vbmU+IiA6IGdldFN0cmluZyhuYW1lUmVzSWQpKSArICIsIgorICAgICAgICAgICAgICAgICsgKG1vZGVSZXNJZCA9PSAwID8gIjxub25lPiIgOiBnZXRTdHJpbmcobW9kZVJlc0lkKSkgKyAiLCIKKyAgICAgICAgICAgICAgICArIG5ld1N1YnR5cGUuZ2V0TG9jYWxlKCkgKyAiLCIgKyBuZXdTdWJ0eXBlLmdldEV4dHJhVmFsdWUoKTsKKyAgICAgICAgICAgIExvZy52KFRBRywgIi0tLSAiICsgb3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIGEgZHVtcCBvZiB0aGUgSW5wdXRNZXRob2RTZXJ2aWNlJ3MgaW50ZXJuYWwgc3RhdGUuICBPdmVycmlkZQogICAgICAqIHRvIGFkZCB5b3VyIG93biBpbmZvcm1hdGlvbiB0byB0aGUgZHVtcC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9LZXlib2FyZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEKaW5kZXggMjY5ZTFjOS4uNzVjOTQ1YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEKQEAgLTUwNCw3ICs1MDQsMzAgQEAKICAgICBwdWJsaWMgS2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQpIHsKICAgICAgICAgdGhpcyhjb250ZXh0LCB4bWxMYXlvdXRSZXNJZCwgMCk7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGtleWJvYXJkIGZyb20gdGhlIGdpdmVuIHhtbCBrZXkgbGF5b3V0IGZpbGUuIFdlZWRzIG91dCByb3dzCisgICAgICogdGhhdCBoYXZlIGEga2V5Ym9hcmQgbW9kZSBkZWZpbmVkIGJ1dCBkb24ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIG1vZGUuCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGFwcGxpY2F0aW9uIG9yIHNlcnZpY2UgY29udGV4dAorICAgICAqIEBwYXJhbSB4bWxMYXlvdXRSZXNJZCB0aGUgcmVzb3VyY2UgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBrZXlib2FyZCBsYXlvdXQgYW5kIGtleXMuCisgICAgICogQHBhcmFtIG1vZGVJZCBrZXlib2FyZCBtb2RlIGlkZW50aWZpZXIKKyAgICAgKiBAcGFyYW0gd2lkdGggc2V0cyB3aWR0aCBvZiBrZXlib2FyZAorICAgICAqIEBwYXJhbSBoZWlnaHQgc2V0cyBoZWlnaHQgb2Yga2V5Ym9hcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQsIGludCBtb2RlSWQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtRGlzcGxheVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gaGVpZ2h0OworCisgICAgICAgIG1EZWZhdWx0SG9yaXpvbnRhbEdhcCA9IDA7CisgICAgICAgIG1EZWZhdWx0V2lkdGggPSBtRGlzcGxheVdpZHRoIC8gMTA7CisgICAgICAgIG1EZWZhdWx0VmVydGljYWxHYXAgPSAwOworICAgICAgICBtRGVmYXVsdEhlaWdodCA9IG1EZWZhdWx0V2lkdGg7CisgICAgICAgIG1LZXlzID0gbmV3IEFycmF5TGlzdDxLZXk+KCk7CisgICAgICAgIG1Nb2RpZmllcktleXMgPSBuZXcgQXJyYXlMaXN0PEtleT4oKTsKKyAgICAgICAgbUtleWJvYXJkTW9kZSA9IG1vZGVJZDsKKyAgICAgICAgbG9hZEtleWJvYXJkKGNvbnRleHQsIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0WG1sKHhtbExheW91dFJlc0lkKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIGtleWJvYXJkIGZyb20gdGhlIGdpdmVuIHhtbCBrZXkgbGF5b3V0IGZpbGUuIFdlZWRzIG91dCByb3dzCiAgICAgICogdGhhdCBoYXZlIGEga2V5Ym9hcmQgbW9kZSBkZWZpbmVkIGJ1dCBkb24ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIG1vZGUuIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhCmluZGV4IDRiNDg0MDkuLmFiNWM3OGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9LZXlib2FyZFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEKQEAgLTExMjgsNyArMTEyOCw5IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gb25Nb2RpZmllZFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgbWUsIGJvb2xlYW4gcG9zc2libGVQb2x5KSB7CiAgICAgICAgIGludCB0b3VjaFggPSAoaW50KSBtZS5nZXRYKCkgLSBtUGFkZGluZ0xlZnQ7Ci0gICAgICAgIGludCB0b3VjaFkgPSAoaW50KSBtZS5nZXRZKCkgKyBtVmVydGljYWxDb3JyZWN0aW9uIC0gbVBhZGRpbmdUb3A7CisgICAgICAgIGludCB0b3VjaFkgPSAoaW50KSBtZS5nZXRZKCkgLSBtUGFkZGluZ1RvcDsKKyAgICAgICAgaWYgKHRvdWNoWSA+PSAtbVZlcnRpY2FsQ29ycmVjdGlvbikKKyAgICAgICAgICAgIHRvdWNoWSArPSBtVmVydGljYWxDb3JyZWN0aW9uOwogICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gbWUuZ2V0QWN0aW9uKCk7CiAgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRUaW1lID0gbWUuZ2V0RXZlbnRUaW1lKCk7CiAgICAgICAgIG1PbGRFdmVudFRpbWUgPSBldmVudFRpbWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCAxY2ZlNDE5YjcuLmRkOWM4ZjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQpAQCAtMjY0LDYgKzI2NCwyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldEFjdGl2ZUxpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEFjdGl2ZUxpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhpbnQgbmV0d29ya1R5cGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRMaW5rUHJvcGVydGllcyhuZXR3b3JrVHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiB7QGhpZGV9ICovCiAgICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW9zKGJvb2xlYW4gdHVybk9uKSB7CiAgICAgICAgIHRyeSB7CkBAIC0zNjcsMTQgKzM4NSwxNCBAQAogICAgICAqIDxwPgogICAgICAqIEFsbCBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIGJhY2tncm91bmQgc2VydmljZXMgdGhhdCB1c2UgdGhlIG5ldHdvcmsKICAgICAgKiBzaG91bGQgbGlzdGVuIHRvIHtAbGluayAjQUNUSU9OX0JBQ0tHUk9VTkRfREFUQV9TRVRUSU5HX0NIQU5HRUR9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBXaGV0aGVyIGJhY2tncm91bmQgZGF0YSB1c2FnZSBpcyBhbGxvd2VkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEJhY2tncm91bmREYXRhU2V0dGluZygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRCYWNrZ3JvdW5kRGF0YVNldHRpbmcoKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEVyciBvbiB0aGUgc2lkZSBvZiBzYWZldHkgCisgICAgICAgICAgICAvLyBFcnIgb24gdGhlIHNpZGUgb2Ygc2FmZXR5CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC01MzIsNiArNTUwLDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioge0BoaWRlfSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFVEhFUl9FUlJPUl9OT19FUlJPUiAgICAgICAgICAgPSAwOwogICAgIC8qKiB7QGhpZGV9ICovCkBAIC01NzAsNiArNTk5LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRW5zdXJlIHRoZSBkZXZpY2Ugc3RheXMgYXdha2UgdW50aWwgd2UgY29ubmVjdCB3aXRoIHRoZSBuZXh0IG5ldHdvcmsKKyAgICAgKiBAcGFyYW0gZm9yV2hvbWUgVGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgZ29pbmcgZG93biBmb3IgbG9nZ2luZyBwdXJwb3NlcworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhTdHJpbmcgZm9yV2hvbSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UucmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soZm9yV2hvbSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEBwYXJhbSBuZXR3b3JrVHlwZSBUaGUgdHlwZSBvZiBuZXR3b3JrIHlvdSB3YW50IHRvIHJlcG9ydCBvbgogICAgICAqIEBwYXJhbSBwZXJjZW50YWdlIFRoZSBxdWFsaXR5IG9mIHRoZSBjb25uZWN0aW9uIDAgaXMgYmFkLCAxMDAgaXMgZ29vZAogICAgICAqIHtAaGlkZX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9EaGNwSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0RoY3BJbmZvLmphdmEKaW5kZXggMTE3OGJlYy4uOWM4MWMxOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0RoY3BJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0RoY3BJbmZvLmphdmEKQEAgLTM3LDYgKzM3LDE5IEBACiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCisgICAgLyoqIGNvcHkgY29uc3RydWN0b3Ige0BoaWRlfSAqLworICAgIHB1YmxpYyBEaGNwSW5mbyhEaGNwSW5mbyBzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpcEFkZHJlc3MgPSBzb3VyY2UuaXBBZGRyZXNzOworICAgICAgICAgICAgZ2F0ZXdheSA9IHNvdXJjZS5nYXRld2F5OworICAgICAgICAgICAgbmV0bWFzayA9IHNvdXJjZS5uZXRtYXNrOworICAgICAgICAgICAgZG5zMSA9IHNvdXJjZS5kbnMxOworICAgICAgICAgICAgZG5zMiA9IHNvdXJjZS5kbnMyOworICAgICAgICAgICAgc2VydmVyQWRkcmVzcyA9IHNvdXJjZS5zZXJ2ZXJBZGRyZXNzOworICAgICAgICAgICAgbGVhc2VEdXJhdGlvbiA9IHNvdXJjZS5sZWFzZUR1cmF0aW9uOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhCmluZGV4IGZkMzM3ODEuLmRkZGU1YzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEKQEAgLTQzMCwxMSArNDMwLDEwIEBACiAKICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CiAKLSAgICAgICAgICAgIEN1cnNvciBjID0gY3IucXVlcnkoCi0gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJpLCBET1dOTE9BRFNfUFJPSkVDVElPTiwgbnVsbCAvKiBzZWxlY3Rpb24gKi8sIG51bGwgLyogc2VsZWN0aW9uIGFyZ3MgKi8sCi0gICAgICAgICAgICAgICAgICAgIG51bGwgLyogc29ydCBvcmRlciAqLyk7CisgICAgICAgICAgICBDdXJzb3IgYyA9IGNyLnF1ZXJ5KGRvd25sb2FkVXJpLCBET1dOTE9BRFNfUFJPSkVDVElPTiwgbnVsbCAvKiBzZWxlY3Rpb24gKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc2VsZWN0aW9uIGFyZ3MgKi8sIG51bGwgLyogc29ydCBvcmRlciAqLyk7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICghYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsIHx8ICFjLm1vdmVUb05leHQoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbAppbmRleCBhZmNjZGQ5Li4zNTA1NGQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbApAQCAtMSwyMSArMSwyMiBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogCkBAIC0zNiw2ICszNywxMCBAQAogCiAgICAgTmV0d29ya0luZm9bXSBnZXRBbGxOZXR3b3JrSW5mbygpOwogCisgICAgTGlua1Byb3BlcnRpZXMgZ2V0QWN0aXZlTGlua1Byb3BlcnRpZXMoKTsKKworICAgIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKGludCBuZXR3b3JrVHlwZSk7CisKICAgICBib29sZWFuIHNldFJhZGlvcyhib29sZWFuIG9uT2ZmKTsKIAogICAgIGJvb2xlYW4gc2V0UmFkaW8oaW50IG5ldHdvcmtUeXBlLCBib29sZWFuIHR1cm5Pbik7CkBAIC03NSw1ICs4MCw5IEBACiAKICAgICBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpOwogCisgICAgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpOworCisgICAgdm9pZCByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhpbiBTdHJpbmcgZm9yV2hvbSk7CisKICAgICB2b2lkIHJlcG9ydEluZXRDb25kaXRpb24oaW50IG5ldHdvcmtUeXBlLCBpbnQgcGVyY2VudGFnZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua0FkZHJlc3MuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rQWRkcmVzcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDg2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua0FkZHJlc3MuYWlkbApAQCAtMCwwICsxLDIxIEBACisvKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK3BhcmNlbGFibGUgTGlua0FkZHJlc3M7CisKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rQWRkcmVzcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtBZGRyZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwM2EyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rQWRkcmVzcy5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkludGVyZmFjZUFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CisKKy8qKgorICogSWRlbnRpZmllcyBhbiBhZGRyZXNzIG9mIGEgbmV0d29yayBsaW5rCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTGlua0FkZHJlc3MgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAvKioKKyAgICAgKiBJUHY0IG9yIElQdjYgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEluZXRBZGRyZXNzIGFkZHJlc3M7CisKKyAgICAvKioKKyAgICAgKiBOZXR3b3JrIHByZWZpeCBsZW5ndGgKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBwcmVmaXhMZW5ndGg7CisKKyAgICBwdWJsaWMgTGlua0FkZHJlc3MoSW5ldEFkZHJlc3MgYWRkcmVzcywgSW5ldEFkZHJlc3MgbWFzaykgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGNvbXB1dGVwcmVmaXhMZW5ndGgobWFzayk7CisgICAgfQorCisgICAgcHVibGljIExpbmtBZGRyZXNzKEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwcmVmaXhMZW5ndGgpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgdGhpcy5wcmVmaXhMZW5ndGggPSBwcmVmaXhMZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIExpbmtBZGRyZXNzKEludGVyZmFjZUFkZHJlc3MgaW50ZXJmYWNlQWRkcmVzcykgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBpbnRlcmZhY2VBZGRyZXNzLmdldEFkZHJlc3MoKTsKKyAgICAgICAgdGhpcy5wcmVmaXhMZW5ndGggPSBpbnRlcmZhY2VBZGRyZXNzLmdldE5ldHdvcmtQcmVmaXhMZW5ndGgoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY29tcHV0ZXByZWZpeExlbmd0aChJbmV0QWRkcmVzcyBtYXNrKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoYnl0ZSBiIDogbWFzay5nZXRBZGRyZXNzKCkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKChiICYgKDEgPDwgaSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAoYWRkcmVzcyA9PSBudWxsID8gIiIgOiAoYWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpICsgIi8iICsgcHJlZml4TGVuZ3RoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhpcyB7QGNvZGUgTGlua0FkZHJlc3N9IGluc3RhbmNlIGFnYWluc3QgdGhlIHNwZWNpZmllZCBhZGRyZXNzCisgICAgICogaW4ge0Bjb2RlIG9ian0uIFR3byBhZGRyZXNzZXMgYXJlIGVxdWFsIGlmIHRoZWlyIEluZXRBZGRyZXNzIGFuZCBwcmVmaXhMZW5ndGgKKyAgICAgKiBhcmUgZXF1YWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQgZm9yIGVxdWFsaXR5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGJvdGggb2JqZWN0cyBhcmUgZXF1YWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIExpbmtBZGRyZXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIExpbmtBZGRyZXNzIGxpbmtBZGRyZXNzID0gKExpbmtBZGRyZXNzKSBvYmo7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3MuZXF1YWxzKGxpbmtBZGRyZXNzLmFkZHJlc3MpICYmCisgICAgICAgICAgICB0aGlzLnByZWZpeExlbmd0aCA9PSBsaW5rQWRkcmVzcy5wcmVmaXhMZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSW5ldEFkZHJlc3MgZm9yIHRoaXMgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG5ldHdvcmsgcHJlZml4IGxlbmd0aAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TmV0d29ya1ByZWZpeExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeExlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKGFkZHJlc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KGFkZHJlc3MuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQocHJlZml4TGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxMaW5rQWRkcmVzcz4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBDcmVhdG9yPExpbmtBZGRyZXNzPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBMaW5rQWRkcmVzcyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGFkZHJlc3MgPSBudWxsOworICAgICAgICAgICAgICAgIGludCBwcmVmaXhMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGlmIChpbi5yZWFkQnl0ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaW4uY3JlYXRlQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4TGVuZ3RoID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5rQWRkcmVzcyhhZGRyZXNzLCBwcmVmaXhMZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlua0FkZHJlc3NbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlua0FkZHJlc3Nbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua0NhcGFiaWxpdGllcy5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtDYXBhYmlsaXRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjcyNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtDYXBhYmlsaXRpZXMuYWlkbApAQCAtMCwwICsxLDIxIEBACisvKgorKioKKyoqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitwYXJjZWxhYmxlIExpbmtDYXBhYmlsaXRpZXM7CisKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rQ2FwYWJpbGl0aWVzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua0NhcGFiaWxpdGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTE2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua0NhcGFiaWxpdGllcy5qYXZhCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGNhcGFiaWxpdGllcyBvZiBhIGxpbmsKKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTGlua0NhcGFiaWxpdGllcyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTGlua0NhcGFiaWxpdGllcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qKiBUaGUgTWFwIG9mIEtleXMgdG8gVmFsdWVzICovCisgICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4gbUNhcGFiaWxpdGllczsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBrZXlzIGRlZmluZWQgZm9yIGEgbGlua3MgY2FwYWJpbGl0aWVzLgorICAgICAqCisgICAgICogS2V5cyBzdGFydGluZyB3aXRoIFJXIGFyZSByZWFkICsgd3JpdGUsIGkuZS4gdGhlIGFwcGxpY2F0aW9uCisgICAgICogY2FuIHJlcXVlc3QgZm9yIGEgY2VydGFpbiByZXF1aXJlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoYXQga2V5LgorICAgICAqIEtleXMgc3RhcnRpbmcgd2l0aCBSTyBhcmUgcmVhZCBvbmx5LCBpLmUuIHRoZSB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBjYW4gcmVhZCB0aGUgdmFsdWUgb2YgdGhhdCBrZXkgZnJvbSB0aGUgc29ja2V0IGJ1dCBjYW5ub3QgcmVxdWVzdAorICAgICAqIGEgY29ycmVzcG9uZGluZyByZXF1aXJlbWVudC4KKyAgICAgKgorICAgICAqIFRPRE86IFByb3ZpZGUgYSBkb2N1bWVudGF0aW9uIHRlY2huaXF1ZSBmb3IgY29uY2lzZWx5IGFuZCBwcmVjaXNlbHkKKyAgICAgKiBkZWZpbmUgdGhlIHN5bnRheCBmb3IgZWFjaCB2YWx1ZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEga2V5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgS2V5IHsKKyAgICAgICAgLyoqIE5vIGNvbnN0cnVjdG9yICovCisgICAgICAgIHByaXZhdGUgS2V5KCkge30KKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG5ldHdvcmsgdHlwZS4KKyAgICAgICAgICogQHNlZSBDb25uZWN0aXZpdHlNYW5hZ2VyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBST19ORVRXT1JLX1RZUEUgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXNpcmVkIG1pbmltdW0gZm9yd2FyZCBsaW5rIChkb3dubG9hZCkgYmFuZHdpZHRoIGZvciB0aGUKKyAgICAgICAgICogaW4ga2lsb2JpdHMgcGVyIHNlY29uZCAoa2JwcykuIFZhbHVlcyBzaG91bGQgYmUgc3RyaW5ncyBzdWNoCisgICAgICAgICAqICI1MCIsICIxMDAiLCAiMTUwMCIsIGV0Yy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJXX0RFU0lSRURfRldEX0JXID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWlyZWQgbWluaW11bSBmb3J3YXJkIGxpbmsgKGRvd25sb2FkKSBiYW5kd2lkdGgsIGluCisgICAgICAgICAqIHBlciBzZWNvbmQgKGticHMpLCBiZWxvdyB3aGljaCB0aGUgc29ja2V0IGNhbm5vdCBmdW5jdGlvbi4KKyAgICAgICAgICogVmFsdWVzIHNob3VsZCBiZSBzdHJpbmdzIHN1Y2ggYXMgIjUwIiwgIjEwMCIsICIxNTAwIiwgZXRjLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUldfUkVRVUlSRURfRldEX0JXID0gMzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQXZhaWxhYmxlIGZvcndhcmQgbGluayAoZG93bmxvYWQpIGJhbmR3aWR0aCBmb3IgdGhlIHNvY2tldC4KKyAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBpbiBraWxvYml0cyBwZXIgc2Vjb25kIChrYnBzKS4KKyAgICAgICAgICogVmFsdWVzIHdpbGwgYmUgc3RyaW5ncyBzdWNoIGFzICI1MCIsICIxMDAiLCAiMTUwMCIsIGV0Yy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJPX0FWQUlMQUJMRV9GV0RfQlcgPSA0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXNpcmVkIG1pbmltdW0gcmV2ZXJzZSBsaW5rICh1cGxvYWQpIGJhbmR3aWR0aCBmb3IgdGhlIHNvY2tldAorICAgICAgICAgKiBpbiBraWxvYml0cyBwZXIgc2Vjb25kIChrYnBzKS4KKyAgICAgICAgICogVmFsdWVzIHNob3VsZCBiZSBzdHJpbmdzIHN1Y2ggYXMgIjUwIiwgIjEwMCIsICIxNTAwIiwgZXRjLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBrZXkgaXMgc2V0IHZpYSB0aGUgbmVlZHMgbWFwLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUldfREVTSVJFRF9SRVZfQlcgPSA1OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1aXJlZCBtaW5pbXVtIHJldmVyc2UgbGluayAodXBsb2FkKSBiYW5kd2lkdGgsIGluIGtpbG9iaXRzCisgICAgICAgICAqIHBlciBzZWNvbmQgKGticHMpLCBiZWxvdyB3aGljaCB0aGUgc29ja2V0IGNhbm5vdCBmdW5jdGlvbi4KKyAgICAgICAgICogSWYgYSByYXRlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHJhdGUgb2Yga2JwcyB3aWxsIGJlCisgICAgICAgICAqIFZhbHVlcyBzaG91bGQgYmUgc3RyaW5ncyBzdWNoIGFzICI1MCIsICIxMDAiLCAiMTUwMCIsIGV0Yy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJXX1JFUVVJUkVEX1JFVl9CVyA9IDY7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF2YWlsYWJsZSByZXZlcnNlIGxpbmsgKHVwbG9hZCkgYmFuZHdpZHRoIGZvciB0aGUgc29ja2V0LgorICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIGluIGtpbG9iaXRzIHBlciBzZWNvbmQgKGticHMpLgorICAgICAgICAgKiBWYWx1ZXMgd2lsbCBiZSBzdHJpbmdzIHN1Y2ggYXMgIjUwIiwgIjEwMCIsICIxNTAwIiwgZXRjLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUk9fQVZBSUxBQkxFX1JFVl9CVyA9IDc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1heGltdW0gbGF0ZW5jeSBmb3IgdGhlIHNvY2tldCwgaW4gbWlsbGlzZWNvbmRzLCBhYm92ZSB3aGljaAorICAgICAgICAgKiBzb2NrZXQgY2Fubm90IGZ1bmN0aW9uLgorICAgICAgICAgKiBWYWx1ZXMgc2hvdWxkIGJlIHN0cmluZ3Mgc3VjaCBhcyAiNTAiLCAiMzAwIiwgIjUwMCIsIGV0Yy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJXX01BWF9BTExPV0VEX0xBVEVOQ1kgPSA4OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRlcmZhY2UgdGhhdCB0aGUgc29ja2V0IGlzIGJvdW5kIHRvLiBUaGlzIGNhbiBiZSBhIHZpcnR1YWwKKyAgICAgICAgICogaW50ZXJmYWNlIChlLmcuIFZQTiBvciBNb2JpbGUgSVApIG9yIGEgcGh5c2ljYWwgaW50ZXJmYWNlCisgICAgICAgICAqIChlLmcuIHdsYW4wIG9yIHJtbmV0MCkuCisgICAgICAgICAqIFZhbHVlcyB3aWxsIGJlIHN0cmluZ3Mgc3VjaCBhcyAid2xhbjAiLCAicm1uZXQwIgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUk9fQk9VTkRfSU5URVJGQUNFID0gOTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGh5c2ljYWwgaW50ZXJmYWNlIHRoYXQgdGhlIHNvY2tldCBpcyByb3V0ZWQgb24uCisgICAgICAgICAqIFRoaXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEJPVU5EX0lOVEVSRkFDRSBpbiBjYXNlcyBzdWNoIGFzCisgICAgICAgICAqIFZQTiBvciBNb2JpbGUgSVAuIFRoZSBwaHlzaWNhbCBpbnRlcmZhY2UgbWF5IGNoYW5nZSBvdmVyIHRpbWUKKyAgICAgICAgICogaWYgc2VhbWxlc3MgbW9iaWxpdHkgaXMgc3VwcG9ydGVkLgorICAgICAgICAgKiBWYWx1ZXMgd2lsbCBiZSBzdHJpbmdzIHN1Y2ggYXMgIndsYW4wIiwgInJtbmV0MCIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJPX1BIWVNJQ0FMX0lOVEVSRkFDRSA9IDEwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJvbGUgaW5mb3JtcyB0aGUgTGlua1NvY2tldCBhYm91dCB0aGUgZGF0YSB1c2FnZSBwYXR0ZXJucyBvZiB5b3VyCisgICAgICogYXBwbGljYXRpb24uCisgICAgICogPFA+CisgICAgICoge0Bjb2RlIFJvbGUuREVGQVVMVH0gaXMgdGhlIGRlZmF1bHQgcm9sZSwgYW5kIGlzIHVzZWQgd2hlbmV2ZXIKKyAgICAgKiBhIHJvbGUgaXNuJ3Qgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm9sZSB7CisgICAgICAgIC8qKiBObyBjb25zdHJ1Y3RvciAqLworICAgICAgICBwcml2YXRlIFJvbGUoKSB7fQorCisgICAgICAgIC8vIGV4YW1wbGVzIG9ubHksIGRpc2N1c3Mgd2hpY2ggcm9sZXMgc2hvdWxkIGJlIGRlZmluZWQsIGFuZCB0aGVuCisgICAgICAgIC8vIGNvZGUgdGhlc2UgdG8gbWF0Y2gKKworICAgICAgICAvKiogRGVmYXVsdCBSb2xlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiZGVmYXVsdCI7CisgICAgICAgIC8qKiBCdWxrIGRvd24gbG9hZCAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUxLX0RPV05MT0FEID0gImJ1bGsuZG93bmxvYWQiOworICAgICAgICAvKiogQnVsayB1cGxvYWQgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVMS19VUExPQUQgPSAiYnVsay51cGxvYWQiOworCisgICAgICAgIC8qKiBWb0lQIEFwcGxpY2F0aW9uIGF0IDI0a2JwcyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lQXzI0S0JQUyA9ICJ2b2lwLjI0ayI7CisgICAgICAgIC8qKiBWb0lQIEFwcGxpY2F0aW9uIGF0IDMya2JwcyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lQXzMyS0JQUyA9ICJ2b2lwLjMyayI7CisKKyAgICAgICAgLyoqIFZpZGVvIFN0cmVhbWluZyBhdCA0ODBwICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJREVPX1NUUkVBTUlOR180ODBQID0gInZpZGVvLnN0cmVhbWluZy40ODBwIjsKKyAgICAgICAgLyoqIFZpZGVvIFN0cmVhbWluZyBhdCA3MjBwICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJREVPX1NUUkVBTUlOR183MjBJID0gInZpZGVvLnN0cmVhbWluZy43MjBpIjsKKworICAgICAgICAvKiogVmlkZW8gQ2hhdCBBcHBsaWNhdGlvbiBhdCAzNjBwICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJREVPX0NIQVRfMzYwUCA9ICJ2aWRlby5jaGF0LjM2MHAiOworICAgICAgICAvKiogVmlkZW8gQ2hhdCBBcHBsaWNhdGlvbiBhdCA0ODBwICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJREVPX0NIQVRfNDgwUCA9ICJ2aWRlby5jaGF0LjQ4MGkiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMoKSB7CisgICAgICAgIG1DYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua0NhcGFiaWxpdGllcyhMaW5rQ2FwYWJpbGl0aWVzIHNvdXJjZSkgeworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KHNvdXJjZS5tQ2FwYWJpbGl0aWVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIHtAY29kZSBMaW5rQ2FwYWJpbGl0aWVzfSB3aXRoIHZhbHVlcyBkZXBlbmRpbmcgb24gcm9sZSB0eXBlLgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvblJvbGUgYSB7QGNvZGUgTGlua1NvY2tldC5Sb2xlfQorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBMaW5rQ2FwYWJpbGl0aWVzfSBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uUm9sZSwgZW1wdHkgaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlua0NhcGFiaWxpdGllcyBjcmVhdGVOZWVkc01hcChTdHJpbmcgYXBwbGljYXRpb25Sb2xlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY3JlYXRlTmVlZGVkQ2FwYWJpbGl0aWVzKGFwcGxpY2F0aW9uUm9sZSkgRVgiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rQ2FwYWJpbGl0aWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCBjYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbUNhcGFiaWxpdGllcy5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gbUNhcGFiaWxpdGllcy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbWFwLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DYXBhYmlsaXRpZXMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIHRoZSBrZXkgcmV0dXJuIHRoZSBjYXBhYmlsaXR5IHN0cmluZworICAgICAqCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEByZXR1cm4gdGhlIGNhcGFiaWxpdHkgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXQoaW50IGtleSkgeworICAgICAgICByZXR1cm4gbUNhcGFiaWxpdGllcy5nZXQoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUga2V5L3ZhbHVlIGNhcGFiaWxpdHkgcGFpcgorICAgICAqCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dChpbnQga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgbUNhcGFiaWxpdGllcy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgbWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQga2V5LAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoaW50IGtleSkgeworICAgICAgICByZXR1cm4gbUNhcGFiaWxpdGllcy5jb250YWluc0tleShrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBtQ2FwYWJpbGl0aWVzLmNvbnRhaW5zVmFsdWUodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgY29udGFpbmluZyBhbGwgb2YgdGhlIG1hcHBpbmdzIGluIHRoaXMgbWFwLiBFYWNoIG1hcHBpbmcgaXMKKyAgICAgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWFwLkVudHJ5fS4gQXMgdGhlIHNldCBpcyBiYWNrZWQgYnkgdGhpcyBtYXAsCisgICAgICogY2hhbmdlcyBpbiBvbmUgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIG90aGVyLgorICAgICAqCisgICAgICogQHJldHVybiBhIHNldCBvZiB0aGUgbWFwcGluZ3MuCisgICAgICovCisgICAgcHVibGljIFNldDxFbnRyeTxJbnRlZ2VyLCBTdHJpbmc+PiBlbnRyeVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1DYXBhYmlsaXRpZXMuZW50cnlTZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgdGhlIGtleXMuCisgICAgICovCisgICAgcHVibGljIFNldDxJbnRlZ2VyPiBrZXlTZXQoKSB7CisgICAgICAgIHJldHVybiBtQ2FwYWJpbGl0aWVzLmtleVNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1DYXBhYmlsaXRpZXMudmFsdWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRvIHN0cmluZyBmb3IgZGVidWdnaW5nCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgieyIpOworICAgICAgICBib29sZWFuIGZpcnN0VGltZSA9IHRydWU7CisgICAgICAgIGZvciAoRW50cnk8SW50ZWdlciwgU3RyaW5nPiBlbnRyeSA6IG1DYXBhYmlsaXRpZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkgeworICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjpcIiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgcmV0dXJuIG1DYXBhYmlsaXRpZXMudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUNhcGFiaWxpdGllcy5zaXplKCkpOworICAgICAgICBmb3IgKEVudHJ5PEludGVnZXIsIFN0cmluZz4gZW50cnkgOiBtQ2FwYWJpbGl0aWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoZW50cnkuZ2V0S2V5KCkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxMaW5rQ2FwYWJpbGl0aWVzPiBDUkVBVE9SID0KKyAgICAgICAgbmV3IENyZWF0b3I8TGlua0NhcGFiaWxpdGllcz4oKSB7CisgICAgICAgICAgICBwdWJsaWMgTGlua0NhcGFiaWxpdGllcyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIExpbmtDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzID0gbmV3IExpbmtDYXBhYmlsaXRpZXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc2l6ZS0tICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGtleSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMubUNhcGFiaWxpdGllcy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjYXBhYmlsaXRpZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaW5rQ2FwYWJpbGl0aWVzW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtDYXBhYmlsaXRpZXNbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBEZWJ1ZyBsb2dnaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgICAgICBMb2cuZChUQUcsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkMDZkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5haWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK3BhcmNlbGFibGUgTGlua1Byb3BlcnRpZXM7CisKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1NDVlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGFuZHJvaWQubmV0LlByb3h5UHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvKioKKyAqIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiBhIG5ldHdvcmsgbGluay4KKyAqIFRPRE8gLSBjb25zaWRlciBhZGRpbmcgb3B0aW9uYWwgZmllbGRzIGxpa2UgQXBuIGFuZCBBcG5UeXBlCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTGlua1Byb3BlcnRpZXMgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKworICAgIFN0cmluZyBtSWZhY2VOYW1lOworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxMaW5rQWRkcmVzcz4gbUxpbmtBZGRyZXNzZXM7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBtRG5zZXM7CisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBtR2F0ZXdheTsKKyAgICBwcml2YXRlIFByb3h5UHJvcGVydGllcyBtSHR0cFByb3h5OworCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICBjbGVhcigpOworICAgIH0KKworICAgIC8vIGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBjbG9uZQorICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyhMaW5rUHJvcGVydGllcyBzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtSWZhY2VOYW1lID0gc291cmNlLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgICAgIG1MaW5rQWRkcmVzc2VzID0gc291cmNlLmdldExpbmtBZGRyZXNzZXMoKTsKKyAgICAgICAgICAgIG1EbnNlcyA9IHNvdXJjZS5nZXREbnNlcygpOworICAgICAgICAgICAgbUdhdGV3YXkgPSBzb3VyY2UuZ2V0R2F0ZXdheSgpOworICAgICAgICAgICAgbUh0dHBQcm94eSA9IG5ldyBQcm94eVByb3BlcnRpZXMoc291cmNlLmdldEh0dHBQcm94eSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludGVyZmFjZU5hbWUoU3RyaW5nIGlmYWNlKSB7CisgICAgICAgIG1JZmFjZU5hbWUgPSBpZmFjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBtSWZhY2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBnZXRBZGRyZXNzZXMoKSB7CisgICAgICAgIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGFkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3Q8SW5ldEFkZHJlc3M+KCk7CisgICAgICAgIGZvciAoTGlua0FkZHJlc3MgbGlua0FkZHJlc3MgOiBtTGlua0FkZHJlc3NlcykgeworICAgICAgICAgICAgYWRkcmVzc2VzLmFkZChsaW5rQWRkcmVzcy5nZXRBZGRyZXNzKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGFkZHJlc3Nlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTGlua0FkZHJlc3MoTGlua0FkZHJlc3MgYWRkcmVzcykgeworICAgICAgICBtTGlua0FkZHJlc3Nlcy5hZGQoYWRkcmVzcyk7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248TGlua0FkZHJlc3M+IGdldExpbmtBZGRyZXNzZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG1MaW5rQWRkcmVzc2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGREbnMoSW5ldEFkZHJlc3MgZG5zKSB7CisgICAgICAgIG1EbnNlcy5hZGQoZG5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZ2V0RG5zZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG1EbnNlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2F0ZXdheShJbmV0QWRkcmVzcyBnYXRld2F5KSB7CisgICAgICAgIG1HYXRld2F5ID0gZ2F0ZXdheTsKKyAgICB9CisgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEdhdGV3YXkoKSB7CisgICAgICAgIHJldHVybiBtR2F0ZXdheTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIdHRwUHJveHkoUHJveHlQcm9wZXJ0aWVzIHByb3h5KSB7CisgICAgICAgIG1IdHRwUHJveHkgPSBwcm94eTsKKyAgICB9CisgICAgcHVibGljIFByb3h5UHJvcGVydGllcyBnZXRIdHRwUHJveHkoKSB7CisgICAgICAgIHJldHVybiBtSHR0cFByb3h5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBtSWZhY2VOYW1lID0gbnVsbDsKKyAgICAgICAgbUxpbmtBZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0PExpbmtBZGRyZXNzPigpOworICAgICAgICBtRG5zZXMgPSBuZXcgQXJyYXlMaXN0PEluZXRBZGRyZXNzPigpOworICAgICAgICBtR2F0ZXdheSA9IG51bGw7CisgICAgICAgIG1IdHRwUHJveHkgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIGlmYWNlTmFtZSA9IChtSWZhY2VOYW1lID09IG51bGwgPyAiIiA6ICJJbnRlcmZhY2VOYW1lOiAiICsgbUlmYWNlTmFtZSArICIgIik7CisKKyAgICAgICAgU3RyaW5nIGxpbmtBZGRyZXNzZXMgPSAiTGlua0FkZHJlc3NlczogWyI7CisgICAgICAgIGZvciAoTGlua0FkZHJlc3MgYWRkciA6IG1MaW5rQWRkcmVzc2VzKSBsaW5rQWRkcmVzc2VzICs9IGFkZHIudG9TdHJpbmcoKTsKKyAgICAgICAgbGlua0FkZHJlc3NlcyArPSAiXSAiOworCisgICAgICAgIFN0cmluZyBkbnMgPSAiRG5zQWRkcmVzc2VzOiBbIjsKKyAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBhZGRyIDogbURuc2VzKSBkbnMgKz0gYWRkci5nZXRIb3N0QWRkcmVzcygpICsgIiwiOworICAgICAgICBkbnMgKz0gIl0gIjsKKworICAgICAgICBTdHJpbmcgcHJveHkgPSAobUh0dHBQcm94eSA9PSBudWxsID8gIiIgOiAiSHR0cFByb3h5OiAiICsgbUh0dHBQcm94eS50b1N0cmluZygpICsgIiAiKTsKKyAgICAgICAgU3RyaW5nIGdhdGV3YXkgPSAobUdhdGV3YXkgPT0gbnVsbCA/ICIiIDogIkdhdGV3YXk6ICIgKyBtR2F0ZXdheS5nZXRIb3N0QWRkcmVzcygpICsgIiAiKTsKKworICAgICAgICByZXR1cm4gaWZhY2VOYW1lICsgbGlua0FkZHJlc3NlcyArIGdhdGV3YXkgKyBkbnMgKyBwcm94eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcoZ2V0SW50ZXJmYWNlTmFtZSgpKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtTGlua0FkZHJlc3Nlcy5zaXplKCkpOworICAgICAgICBmb3IoTGlua0FkZHJlc3MgbGlua0FkZHJlc3MgOiBtTGlua0FkZHJlc3NlcykgeworICAgICAgICAgICAgZGVzdC53cml0ZVBhcmNlbGFibGUobGlua0FkZHJlc3MsIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlc3Qud3JpdGVJbnQobURuc2VzLnNpemUoKSk7CisgICAgICAgIGZvcihJbmV0QWRkcmVzcyBkIDogbURuc2VzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KGQuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUdhdGV3YXkgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KG1HYXRld2F5LmdldEFkZHJlc3MoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUh0dHBQcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkxKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1IdHRwUHJveHksIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxMaW5rUHJvcGVydGllcz4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBDcmVhdG9yPExpbmtQcm9wZXJ0aWVzPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIExpbmtQcm9wZXJ0aWVzIG5ldFByb3AgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWZhY2UgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldFByb3Auc2V0SW50ZXJmYWNlTmFtZShpZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYWRkcmVzc0NvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhZGRyZXNzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLmFkZExpbmtBZGRyZXNzKChMaW5rQWRkcmVzcylpbi5yZWFkUGFyY2VsYWJsZShudWxsKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZHJlc3NDb3VudCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8YWRkcmVzc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldFByb3AuYWRkRG5zKEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhpbi5jcmVhdGVCeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluLnJlYWRCeXRlKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5zZXRHYXRld2F5KEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhpbi5jcmVhdGVCeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW4ucmVhZEJ5dGUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG5ldFByb3Auc2V0SHR0cFByb3h5KChQcm94eVByb3BlcnRpZXMpaW4ucmVhZFBhcmNlbGFibGUobnVsbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV0UHJvcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtTb2NrZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rU29ja2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhNjQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rU29ja2V0LmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rU29ja2V0Tm90aWZpZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKiBAaGlkZSAqLworcHVibGljIGNsYXNzIExpbmtTb2NrZXQgZXh0ZW5kcyBTb2NrZXQgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTGlua1NvY2tldCI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBEQkcgPSB0cnVlOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBMaW5rU29ja2V0KCkgeworICAgICAgICBpZiAoREJHKSBsb2coIkxpbmtTb2NrZXQoKSBFWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgc29ja2V0LgorICAgICAqIEBwYXJhbSBub3RpZmllciBhIHJlZmVyZW5jZSB0byBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB7QGNvZGUgTGlua1NvY2tldE5vdGlmaWVyfQorICAgICAqLworICAgIHB1YmxpYyBMaW5rU29ja2V0KExpbmtTb2NrZXROb3RpZmllciBub3RpZmllcikgeworICAgICAgICBpZiAoREJHKSBsb2coIkxpbmtTb2NrZXQobm90aWZpZXIpIEVYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB1bmNvbm5lY3RlZCBzb2NrZXQgdXNpZ24gdGhlIGdpdmVuIHByb3h5IHR5cGUuCisgICAgICogQHBhcmFtIG5vdGlmaWVyIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHtAY29kZSBMaW5rU29ja2V0Tm90aWZpZXJ9CisgICAgICogQHBhcmFtIHByb3h5IHRoZSBzcGVjaWZpZWQgcHJveHkgZm9yIHRoaXMgc29ja2V0CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50IHByb3h5IGlzIG51bGwgb3Igb2YgYW4gaW52YWxpZCB0eXBlLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXQgZGVuaWVzIHRoZSBwZXJtaXNzaW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjb25uZWN0IHRvIHRoZSBnaXZlbiBwcm94eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1NvY2tldChMaW5rU29ja2V0Tm90aWZpZXIgbm90aWZpZXIsIFByb3h5IHByb3h5KSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiTGlua1NvY2tldChub3RpZmllciwgcHJveHkpIEVYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIExpbmtQcm9wZXJ0aWVzfSBmb3IgdGhlIHNvY2tldAorICAgICAqLworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcygpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJMaW5rUHJvcGVydGllcygpIEVYIik7CisgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHtAY29kZSBMaW5rQ2FwYWJpbGllc30gbmVlZGVkIGZvciB0aGlzIHNvY2tldC4gIElmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQKKyAgICAgKiBvciBpcyBhIGR1cGxpY2F0ZSBzb2NrZXQgdGhlIHJlcXVlc3QgaXMgaWdub3JlZCBhbmQge0Bjb2RlIGZhbHNlfSB3aWxsCisgICAgICogYmUgcmV0dXJuZWQuIEEgbmVlZHMgbWFwIGNhbiBiZSBjcmVhdGVkIHZpYSB0aGUge0Bjb2RlIGNyZWF0ZU5lZWRzTWFwfSBzdGF0aWMKKyAgICAgKiBtZXRob2QuCisgICAgICogQHBhcmFtIG5lZWRzIHRoZSBuZWVkcyBvZiB0aGUgc29ja2V0CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgbmVlZHMgYXJlIHN1Y2Nlc3NmdWxseSBzZXQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0TmVlZGVkQ2FwYWJpbGl0aWVzKExpbmtDYXBhYmlsaXRpZXMgbmVlZHMpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJzZXROZWVkcygpIEVYIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBMaW5rQ2FwYWJpbGl0ZXMgc2V0IGJ5IHNldE5lZWRlZENhcGFiaWxpdGllcywgZW1wdHkgaWYgbm9uZSBoYXMgYmVlbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua0NhcGFiaWxpdGllcyBnZXROZWVkZWRDYXBhYmlsaXRpZXMoKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0TmVlZHMoKSBFWCIpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGFsbCBvZiB0aGUge0Bjb2RlIExpbmtDYXBhYmlsaXRpZXN9IG9mIHRoZSBsaW5rIHVzZWQgYnkgdGhpcyBzb2NrZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua0NhcGFiaWxpdGllcyBnZXRDYXBhYmlsaXRpZXMoKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0Q2FwYWJpbGl0aWVzKCkgRVgiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIExpbmtTb2NrZXRzIHNldCBvZiBjYXBhYmlsaXRpZXMsIGZpbHRlcmVkIGFjY29yZGluZyB0bworICAgICAqIHRoZSBnaXZlbiB7QGNvZGUgU2V0fS4gIENhcGFiaWxpdGllcyBpbiB0aGUgU2V0IGJ1dCBub3QgYXZhaWxhYmxlIGZyb20KKyAgICAgKiB0aGUgbGluayB3aWxsIG5vdCBiZSByZXBvcnRlZCBpbiB0aGUgcmVzdWx0cy4gIENhcGFiaWxpdGllcyBvZiB0aGUgbGluaworICAgICAqIGJ1dCBub3QgbGlzdGVkIGluIHRoZSBTZXQgd2lsbCBhbHNvIG5vdCBiZSByZXBvcnRlZCBpbiB0aGUgcmVzdWx0cy4KKyAgICAgKiBAcGFyYW0gY2FwYWJpbGl0aWVzIHtAY29kZSBTZXR9IG9mIGNhcGFiaWxpdGllcyByZXF1ZXN0ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCB7QGNvZGUgTGlua0NhcGFiaWxpdGllc30gb2YgdGhpcyBMaW5rU29ja2V0LCBtYXkgYmUgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua0NhcGFiaWxpdGllcyBnZXRDYXBhYmlsaXRpZXMoU2V0PEludGVnZXI+IGNhcGFiaWxpdGllcykgeworICAgICAgICBpZiAoREJHKSBsb2coImdldENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpIEVYIik7CisgICAgICAgIHJldHVybiBuZXcgTGlua0NhcGFiaWxpdGllcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgdGhlIHNldCBvZiBjYXBhYmlsaXRpZXMgdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gdHJhY2tpbmcKKyAgICAgKiBmb3IgdGhpcyBMaW5rU29ja2V0LgorICAgICAqIEBwYXJhbSBjYXBhYmlsaXRpZXMgYSB7QGNvZGUgU2V0fSBvZiBjYXBhYmlsaXRpZXMgdG8gdHJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFja2VkQ2FwYWJpbGl0aWVzKFNldDxJbnRlZ2VyPiBjYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJzZXRUcmFja2VkQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcykgRVgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgTGlua0NhcGFiaWxpdGllc30gdGhhdCBhcmUgdHJhY2tlZCwgZW1wdHkgaWYgbm9uZSBoYXMgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIFNldDxJbnRlZ2VyPiBnZXRUcmFja2VkQ2FwYWJpbGl0aWVzKCkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldFRyYWNrZWRDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKSBFWCIpOworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGlzIHNvY2tldCB0byB0aGUgZ2l2ZW4gcmVtb3RlIGhvc3QgYWRkcmVzcyBhbmQgcG9ydCBzcGVjaWZpZWQKKyAgICAgKiBieSBkc3ROYW1lIGFuZCBkc3RQb3J0LgorICAgICAqIEBwYXJhbSBkc3ROYW1lIHRoZSBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICogQHBhcmFtIGRzdFBvcnQgdGhlIHBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QKKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgb3IgMCBmb3IgaW5maW5pdGUgdGltZW91dAorICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGRzdE5hbWUgaXMgaW52YWxpZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCBvciBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGNvbm5lY3RpbmcKKyAgICAgKiBAdGhyb3dzIFNvY2tldFRpbWVvdXRFeGNlcHRpb24gaWYgdGhlIHRpbWVvdXQgZmlyZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KFN0cmluZyBkc3ROYW1lLCBpbnQgZHN0UG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgICAgICB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KGRzdE5hbWUsIGRzdFBvcnQsIHRpbWVvdXQpIEVYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhpcyBzb2NrZXQgdG8gdGhlIGdpdmVuIHJlbW90ZSBob3N0IGFkZHJlc3MgYW5kIHBvcnQgc3BlY2lmaWVkCisgICAgICogYnkgZHN0TmFtZSBhbmQgZHN0UG9ydC4KKyAgICAgKiBAcGFyYW0gZHN0TmFtZSB0aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGhvc3QgdG8gY29ubmVjdCB0bworICAgICAqIEBwYXJhbSBkc3RQb3J0IHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0CisgICAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gZHN0TmFtZSBpcyBpbnZhbGlkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkIG9yIGFuIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgICAgICAgICAgd2hpbGUgY29ubmVjdGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoU3RyaW5nIGRzdE5hbWUsIGludCBkc3RQb3J0KQorICAgICAgICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdChkc3ROYW1lLCBkc3RQb3J0LCB0aW1lb3V0KSBFWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoaXMgc29ja2V0IHRvIHRoZSBnaXZlbiByZW1vdGUgaG9zdCBhZGRyZXNzIGFuZCBwb3J0IHNwZWNpZmllZAorICAgICAqIGJ5IHRoZSBTb2NrZXRBZGRyZXNzIHdpdGggdGhlIHNwZWNpZmllZCB0aW1lb3V0LgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGNvZGUgY29ubmVjdChTdHJpbmcgZHN0TmFtZSwgaW50IGRzdFBvcnQsIGludCB0aW1lb3V0KX0KKyAgICAgKiAgICAgICAgICAgICBpbnN0ZWFkLiAgVXNpbmcgdGhpcyBtZXRob2QgbWF5IHJlc3VsdCBpbiByZWR1Y2VkIGZ1bmN0aW9uYWxpdHkuCisgICAgICogQHBhcmFtIHJlbW90ZUFkZHIgdGhlIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIHJlbW90ZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gU29ja2V0QWRkcmVzcyBpcyBpbnZhbGlkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkIG9yIGFuIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgICAgICAgICAgd2hpbGUgY29ubmVjdGluZworICAgICAqIEB0aHJvd3MgU29ja2V0VGltZW91dEV4Y2VwdGlvbiBpZiB0aGUgdGltZW91dCBleHBpcmVzCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkciwgaW50IHRpbWVvdXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNvY2tldFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QocmVtb3RlQWRkciwgdGltZW91dCkgRVggREVQUkVDQVRFRCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoaXMgc29ja2V0IHRvIHRoZSBnaXZlbiByZW1vdGUgaG9zdCBhZGRyZXNzIGFuZCBwb3J0IHNwZWNpZmllZAorICAgICAqIGJ5IHRoZSBTb2NrZXRBZGRyZXNzLgorICAgICAqIFRPRE8gYWRkIGNvbW1lbnQgb24gYWxsIHRoZXNlIHRoYXQgdGhlIG5ldHdvcmsgc2VsZWN0aW9uIGhhcHBlbnMgZHVyaW5nIGNvbm5lY3QKKyAgICAgKiBhbmQgbWF5IHRha2UgMzAgc2Vjb25kcworICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGNvZGUgY29ubmVjdChTdHJpbmcgZHN0TmFtZSwgaW50IGRzdFBvcnQpfQorICAgICAqICAgICAgICAgICAgIFVzaW5nIHRoaXMgbWV0aG9kIG1heSByZXN1bHQgaW4gcmVkdWNlZCBmdW5jdGlvbmFsaXR5LgorICAgICAqIEBwYXJhbSByZW1vdGVBZGRyIHRoZSBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSByZW1vdGUgaG9zdCB0byBjb25uZWN0IHRvLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBTb2NrZXRBZGRyZXNzIGlzIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgb3IgYW4gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICB3aGlsZSBjb25uZWN0aW5nCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KFNvY2tldEFkZHJlc3MgcmVtb3RlQWRkcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KHJlbW90ZUFkZHIpIEVYIERFUFJFQ0FURUQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IGEgZHVwbGljYXRlIHNvY2tldCBzb2NrZXQgdG8gdGhlIHNhbWUgcmVtb3RlIGhvc3QgYWRkcmVzcyBhbmQgcG9ydAorICAgICAqIGFzIHRoZSBvcmlnaW5hbCB3aXRoIGEgdGltZW91dCBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzIG9yIDAgZm9yIGluZmluaXRlIHRpbWVvdXQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgb3IgYW4gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICB3aGlsZSBjb25uZWN0aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdChpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KHRpbWVvdXQpIEVYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCBhIGR1cGxpY2F0ZSBzb2NrZXQgc29ja2V0IHRvIHRoZSBzYW1lIHJlbW90ZSBob3N0IGFkZHJlc3MgYW5kIHBvcnQKKyAgICAgKiBhcyB0aGUgb3JpZ2luYWwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkIG9yIGFuIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgICAgICAgICAgd2hpbGUgY29ubmVjdGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoKSBFWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc29ja2V0LiAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlY29ubmVjdCBvciByZWJpbmQgdG8gdGhpcworICAgICAqIHNvY2tldCB0aGVyZWFmdGVyIHdoaWNoIG1lYW5zIGEgbmV3IHNvY2tldCBpbnN0YW5jZSBoYXMgdG8gYmUgY3JlYXRlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoZSBzb2NrZXQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoREJHKSBsb2coImNsb3NlKCkgRVgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHRoYXQgYSBuZXcgTGlua1NvY2tldCBiZSBjcmVhdGVkIHVzaW5nIGEgZGlmZmVyZW50IHJhZGlvCisgICAgICogKHN1Y2ggYXMgV2lGaSBvciAzRykgdGhhbiB0aGUgY3VycmVudCBMaW5rU29ja2V0LiAgSWYgYSBkaWZmZXJlbnQKKyAgICAgKiByYWRpbyBpcyBhdmFpbGFibGUgYSBjYWxsIGJhY2sgd2lsbCBiZSBtYWRlIHZpYSB7QGNvZGUgb25CZXR0ZXJMaW5rQXZhaWx9LgorICAgICAqIElmIHVuYWJsZSB0byBmaW5kIGEgYmV0dGVyIHJhZGlvLCBhcHBsaWNhdGlvbiB3aWxsIGJlIG5vdGlmaWVkIHZpYQorICAgICAqIHtAY29kZSBvbk5ld0xpbmtVbmF2YWlsYWJsZX0KKyAgICAgKiBAc2VlIExpbmtTb2NrZXROb3RpZmllciNvbkJldHRlckxpbmtBdmFpbGFibGUoTGlua1NvY2tldCwgTGlua1NvY2tldCkKKyAgICAgKiBAcGFyYW0gbGlua1JlcXVlc3RSZWFzb24gcmVhc29uIGZvciByZXF1ZXN0aW5nIGEgbmV3IGxpbmsuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVxdWVzdE5ld0xpbmsoTGlua1JlcXVlc3RSZWFzb24gbGlua1JlcXVlc3RSZWFzb24pIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJyZXF1ZXN0TmV3TGluayhsaW5rUmVxdWVzdFJlYXNvbikgRVgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBMaW5rU29ja2V0IHdpbGwgYXV0b21hdGljYWxseSBwaWNrIHRoZSBvcHRpbXVtIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgIHRvIGJpbmQgdG8KKyAgICAgKiBAcGFyYW0gbG9jYWxBZGRyIHRoZSBzcGVjaWZpYyBhZGRyZXNzIGFuZCBwb3J0IG9uIHRoZSBsb2NhbCBtYWNoaW5lCisgICAgICogICAgICAgICAgICAgICAgICB0byBiaW5kIHRvCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBhbHdheXMgYXMgdGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBmb3IgTGlua1NvY2tldAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgYmluZChTb2NrZXRBZGRyZXNzIGxvY2FsQWRkcikgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJiaW5kKGxvY2FsQWRkcikgRVggdGhyb3dzIElPRXhjZXB0aW9uIik7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiYmluZCBpcyBkZXByZWNhdGVkIGZvciBMaW5rU29ja2V0Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhc29uIGNvZGVzIGFuIGFwcGxpY2F0aW9uIGNhbiBzcGVjaWZ5IHdoZW4gcmVxdWVzdGluZyBmb3IgYSBuZXcgbGluay4KKyAgICAgKiBUT0RPOiBuZWVkIGJldHRlciBkb2N1bWVudGF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMaW5rUmVxdWVzdFJlYXNvbiB7CisgICAgICAgIC8qKiBObyBjb25zdHJ1Y3RvciAqLworICAgICAgICBwcml2YXRlIExpbmtSZXF1ZXN0UmVhc29uKCkge30KKworICAgICAgICAvKiogVGhpcyBsaW5rIGlzIHdvcmtpbmcgcHJvcGVybHkgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElOS19QUk9CTEVNX05PTkUgPSAwOworICAgICAgICAvKiogVGhpcyBsaW5rIGhhcyBhbiB1bmtub3duIGlzc3VlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTktfUFJPQkxFTV9VTktOT1dOID0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWJ1ZyBsb2dnaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgICAgICBMb2cuZChUQUcsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rU29ja2V0Tm90aWZpZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rU29ja2V0Tm90aWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGUyODM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtTb2NrZXROb3RpZmllci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBJbnRlcmZhY2UgdXNlZCB0byBnZXQgZmVlZGJhY2sgYWJvdXQgYSB7QGxpbmsgYW5kcm9pZC5uZXQuTGlua1NvY2tldH0uICBJbnN0YW5jZSBpcyBvcHRpb25hbGx5CisgKiBwYXNzZWQgd2hlbiBhIExpbmtTb2NrZXQgaXMgY29uc3RydWN0ZWQuICBNdWx0aXBsZSBMaW5rU29ja2V0cyBtYXkgdXNlIHRoZSBzYW1lIG5vdGlmaWVyLgorICogQGhpZGUKKyAqLworcHVibGljIGludGVyZmFjZSBMaW5rU29ja2V0Tm90aWZpZXIgeworICAgIC8qKgorICAgICAqIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaWYgYSBiZXR0ZXIgbGluaworICAgICAqIGJlY29tZXMgYXZhaWxhYmxlLgorICAgICAqIFRPRE8gLSB0aGlzIHNob3VsZG4ndCBiZSBjaGVja2VkIGZvciBhbGwgY2FzZXMgLSB3aGF0J3MgdGhlIGNvbmRpdGlvbmFsCisgICAgICogICAgICAgIGZsYWc/CisgICAgICogSWYgdGhlIGR1cGxpY2F0ZSBzb2NrZXQgaXMgYWNjZXB0ZWQsIHRoZSBvcmlnaW5hbCB3aWxsIGJlIG1hcmtlZCBpbnZhbGlkCisgICAgICogYW5kIGFkZGl0aW9uYWwgdXNlIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KKyAgICAgKiBAcGFyYW0gb3JpZ2luYWwgdGhlIG9yaWdpbmFsIExpbmtTb2NrZXQKKyAgICAgKiBAcGFyYW0gZHVwbGljYXRlIHRoZSBuZXcgTGlua1NvY2tldCB0aGF0IGJldHRlciBtZWV0cyB0aGUgYXBwbGljYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50cworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBhcHBsaWNhdGlvbiBpbnRlbmRzIHRvIHVzZSB0aGlzIGxpbmsKKyAgICAgKgorICAgICAqIFJFTQorICAgICAqIFRPRE8gLSBob3cgYWdyZXNzaXZlIHNob3VsZCB3ZSBiZT8KKyAgICAgKiBBdCBhIG1pbmltdW0gQ1MgdHJhY2tzIHdoaWNoIExTIGhhdmUgdGhpcyB0dXJuZWQgb24gYW5kIHRyYWNrcyB0aGUgcmVxdWlyZW1lbnRzCisgICAgICogV2hlbiBhIG5ldyBsaW5rIGJlY29tZXMgYXZhaWxhYmxlLCBhdXRvbWF0aWNhbGx5IGNoZWNrIGlmIGFueSBvZiB0aGUgTGlua1NvY2tldHMKKyAgICAgKiAgIHdpbGwgY2FyZS4KKyAgICAgKiBJZiBmb3VuZCwgZ3JhYiBhIHJlZmNvdW50IG9uIHRoZSBsaW5rIHNvIGl0IGRvZXNuJ3QgZ28gYXdheSBhbmQgc2VuZCBub3RpZmljYXRpb24KKyAgICAgKiBPcHRpb25hbGx5LCBwZXJpb2RpY2FsbHkgc2V0dXAgY29ubmVjdGlvbiBvbiBhdmFpbGFibGUgbmV0d29ya3MgdG8gY2hlY2sgZm9yIGJldHRlciBsaW5rcworICAgICAqIE1heWJlIHBhc3MgdGhpcyBpbmZvIGludG8gdGhlIExpbmtGYWN0b3JpZXMgc28gY29uZGl0aW9uIGNoYW5nZXMgY2FuIGJlIGFjdGVkIG9uIG1vcmUgcXVpY2tseQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uQmV0dGVyTGlua0F2YWlsYWJsZShMaW5rU29ja2V0IG9yaWdpbmFsLCBMaW5rU29ja2V0IGR1cGxpY2F0ZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBMaW5rU29ja2V0IG5vIGxvbmdlciBoYXMKKyAgICAgKiBhbiBhY3RpdmUgbGluay4KKyAgICAgKiBAcGFyYW0gc29ja2V0IHRoZSBMaW5rU29ja2V0IHRoYXQgbG9zdCBpdHMgbGluaworICAgICAqCisgICAgICogUkVNCisgICAgICogTmV0d29ya1N0YXRlVHJhY2tlciB0ZWxscyB1cyBpdCBpcyBkaXNjb25uZWN0ZWQKKyAgICAgKiBDUyBjaGVja3MgdGhlIHRhYmxlIGZvciBMUyBvbiB0aGF0IGxpbmsKKyAgICAgKiBDUyBjYWxscyBlYWNoIGNhbGxiYWNrIChuZWVkIHRvIHdvcmsgb3V0IHAycCBjcm9zcyBwcm9jZXNzIGNhbGxiYWNrKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTGlua0xvc3QoTGlua1NvY2tldCBzb2NrZXQpOworCisgICAgLyoqCisgICAgICogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIGNhbGxzCisgICAgICogcmVxdWVzdE5ld0xpbmsgb24gYSBMaW5rU29ja2V0IGJ1dCB0aGUgTGlua1NvY2tldCBpcyB1bmFibGUgdG8gZmluZAorICAgICAqIGEgc3VpdGFibGUgbmV3IGxpbmsuCisgICAgICogQHBhcmFtIHNvY2tldCB0aGUgTGlua1NvY2tldCBmb3Igd2hpY2ggYSBuZXcgbGluayB3YXMgbm90IGZvdW5kCisgICAgICogVE9ETyAtIHdoeSB0aGUgZGlmZiBiZXR3ZWVuIGluaXRpYWwgcmVxdWVzdCAoc3luYykgYW5kIHJlcXVlc3ROZXdMaW5rPworICAgICAqCisgICAgICogUkVNCisgICAgICogQ1MgcHJvY2VzcyBvZiB0cnlpbmcgdG8gZmluZCBhIG5ldyBsaW5rIG11c3QgdHJhY2sgdGhlIExTIHRoYXQgc3RhcnRlZCBpdAorICAgICAqIG9uIGZhaWx1cmUsIGNhbGwgY2FsbGJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbk5ld0xpbmtVbmF2YWlsYWJsZShMaW5rU29ja2V0IHNvY2tldCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gYW55IG9mIHRoZSBub3RpZmljYXRpb24tbWFya2VkCisgICAgICogY2FwYWJpbGl0aWVzIG9mIHRoZSBMaW5rU29ja2V0IChlLmcuIHVwc3RyZWFtIGJhbmR3aWR0aCkgaGF2ZSBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBzb2NrZXQgdGhlIGxpbmtTb2NldCBmb3Igd2hpY2ggY2FwYWJpbGl0aWVzIGhhdmUgY2hhbmdlZAorICAgICAqIEBwYXJhbSBjaGFuZ2VkQ2FwYWJpbGl0aWVzIHRoZSBzZXQgb2YgY2FwYWJpbGl0aWVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW50ZXJlc3RlZCBpbiBhbmQgaGF2ZSBjaGFuZ2VkICh3aXRoIG5ldyB2YWx1ZXMpCisgICAgICoKKyAgICAgKiBSRU0KKyAgICAgKiBNYXliZSBwYXNzIHRoZSBpbnRlcmVzdGluZyBjYXBhYmlsaXRpZXMgaW50byB0aGUgTGlua3MuCisgICAgICogR2V0IG5vdGlmaWVkIG9mIGV2ZXJ5IGNhcGFiaWxpdHkgY2hhbmdlCisgICAgICogY2hlY2sgZm9yIExpbmtTb2NrZXRzIG9uIHRoYXQgTGluayB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRoYXQgQ2FwYWJpbGl0eSAtIGNhbGwgdGhlbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ2FwYWJpbGl0aWVzQ2hhbmdlZChMaW5rU29ja2V0IHNvY2tldCwgTGlua0NhcGFiaWxpdGllcyBjaGFuZ2VkQ2FwYWJpbGl0aWVzKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDhkMThlYmEuLjNkZjhlYzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTYsMTkgKzE2LDIxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQ7CiAKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueUludGVudHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTQwLDE5ICs0MiwyNSBAQAogICoKICAqIHtAaGlkZX0KICAqLwotcHVibGljIGNsYXNzIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKK3B1YmxpYyBjbGFzcyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGltcGxlbWVudHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1vYmlsZURhdGFTdGF0ZVRyYWNrZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwogCiAgICAgcHJpdmF0ZSBQaG9uZS5EYXRhU3RhdGUgbU1vYmlsZURhdGFTdGF0ZTsKICAgICBwcml2YXRlIElUZWxlcGhvbnkgbVBob25lU2VydmljZTsKIAogICAgIHByaXZhdGUgU3RyaW5nIG1BcG5UeXBlOwotICAgIHByaXZhdGUgU3RyaW5nIG1BcG5UeXBlVG9XYXRjaEZvcjsKLSAgICBwcml2YXRlIFN0cmluZyBtQXBuTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtU3RhdGVSZWNlaXZlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzRG5zUHJvcE5hbWVzOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOworICAgIHByaXZhdGUgYm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbVRhcmdldDsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBMaW5rQ2FwYWJpbGl0aWVzIG1MaW5rQ2FwYWJpbGl0aWVzOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbURlZmF1bHRHYXRld2F5QWRkciA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZWZhdWx0Um91dGVTZXQgPSBmYWxzZTsKIAogICAgIC8vIERFRkFVTFQgYW5kIEhJUFJJIGFyZSB0aGUgc2FtZSBjb25uZWN0aW9uLiAgSWYgd2UncmUgb25lIG9mIHRoZXNlIHdlIG5lZWQgdG8gY2hlY2sgaWYKICAgICAvLyB0aGUgb3RoZXIgaXMgYWxzbyBkaXNjb25uZWN0ZWQgYmVmb3JlIHdlIHJlc2V0IHNvY2tldHMKQEAgLTYwLDM1ICs2OCwyMiBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbmV3IE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gY29udGV4dCBvZiB0aGUgY2FsbGVyCi0gICAgICogQHBhcmFtIHRhcmdldCBhIG1lc3NhZ2UgaGFuZGxlciBmb3IgZ2V0dGluZyBjYWxsYmFja3MgYWJvdXQgc3RhdGUgY2hhbmdlcwogICAgICAqIEBwYXJhbSBuZXRUeXBlIHRoZSBDb25uZWN0aXZpdHlNYW5hZ2VyIG5ldHdvcmsgdHlwZQotICAgICAqIEBwYXJhbSBhcG5UeXBlIHRoZSBQaG9uZSBhcG5UeXBlCiAgICAgICogQHBhcmFtIHRhZyB0aGUgbmFtZSBvZiB0aGlzIG5ldHdvcmsKICAgICAgKi8KLSAgICBwdWJsaWMgTW9iaWxlRGF0YVN0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0LCBpbnQgbmV0VHlwZSwgU3RyaW5nIHRhZykgewotICAgICAgICBzdXBlcihjb250ZXh0LCB0YXJnZXQsIG5ldFR5cGUsCisgICAgcHVibGljIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIoaW50IG5ldFR5cGUsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKG5ldFR5cGUsCiAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0TmV0d29ya1R5cGUoKSwgdGFnLAogICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldE5ldHdvcmtUeXBlTmFtZSgpKTsKICAgICAgICAgbUFwblR5cGUgPSBuZXR3b3JrVHlwZVRvQXBuVHlwZShuZXRUeXBlKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMobUFwblR5cGUsIFBob25lLkFQTl9UWVBFX0hJUFJJKSkgewotICAgICAgICAgICAgbUFwblR5cGVUb1dhdGNoRm9yID0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BcG5UeXBlVG9XYXRjaEZvciA9IG1BcG5UeXBlOwotICAgICAgICB9CiAgICAgICAgIGlmIChuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUgfHwKICAgICAgICAgICAgICAgICBuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfSElQUkkpIHsKICAgICAgICAgICAgIG1Jc0RlZmF1bHRPckhpcHJpID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIG1QaG9uZVNlcnZpY2UgPSBudWxsOwotICAgICAgICBpZihuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIH0KIAotICAgICAgICBtRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgc0Ruc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMSIsCiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMiIsCiAgICAgICAgICAgICAgICAgIm5ldC5ldGgwLmRuczEiLApAQCAtOTksMTY1ICs5NCwxNjggQEAKICAgICAgICAgICAgICAgICAibmV0LmdwcnMuZG5zMiIsCiAgICAgICAgICAgICAgICAgIm5ldC5wcHAwLmRuczEiLAogICAgICAgICAgICAgICAgICJuZXQucHBwMC5kbnMyIn07Ci0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbiBtb25pdG9yaW5nIG1vYmlsZSBkYXRhIGNvbm5lY3Rpdml0eS4KKyAgICAgKiBCZWdpbiBtb25pdG9yaW5nIGRhdGEgY29ubmVjdGl2aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgaXMgdGhlIGN1cnJlbnQgQW5kcm9pZCBjb250ZXh0CisgICAgICogQHBhcmFtIHRhcmdldCBpcyB0aGUgSGFuZGVyIHRvIHdoaWNoIHRvIHJldHVybiB0aGUgZXZlbnRzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZyhDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fU0VSVklDRV9TVEFURV9DSEFOR0VEKTsKIAotICAgICAgICBtU3RhdGVSZWNlaXZlciA9IG5ldyBNb2JpbGVEYXRhU3RhdGVSZWNlaXZlcigpOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU3RhdGVSZWNlaXZlciwgZmlsdGVyKTsKLSAgICAgICAgaWYgKGludGVudCAhPSBudWxsKQotICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihuZXcgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIoKSwgZmlsdGVyKTsKKyAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQaG9uZS5EYXRhU3RhdGUgZ2V0TW9iaWxlRGF0YVN0YXRlKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5TVEFURV9LRVkpOwotICAgICAgICBpZiAoc3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVkpOwotICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUluY2x1ZGVkKGFwblR5cGVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbnVtLnZhbHVlT2YoUGhvbmUuRGF0YVN0YXRlLmNsYXNzLCBzdHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoZSBtb2JpbGUgZGF0YQorICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERuc1Byb3BOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHNEbnNQcm9wTmFtZXM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXBuVHlwZUluY2x1ZGVkKFN0cmluZyB0eXBlTGlzdCkgewotICAgICAgICAvKiBjb21tYSBzZXBlcmF0ZWQgbGlzdCAtIHNwbGl0IGFuZCBjaGVjayAqLwotICAgICAgICBpZiAodHlwZUxpc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQ7CisgICAgfQogCi0gICAgICAgIFN0cmluZ1tdIGxpc3QgPSB0eXBlTGlzdC5zcGxpdCgiLCIpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgbUFwblR5cGVUb1dhdGNoRm9yKSB8fAotICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgUGhvbmUuQVBOX1RZUEVfQUxMKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgdm9pZCBwcml2YXRlRG5zUm91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBlbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0R2F0ZXdheUFkZHI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlU2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURlZmF1bHRSb3V0ZVNldCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CisgICAgICAgIElDb25uZWN0aXZpdHlNYW5hZ2VyIG1Db25uZWN0aXZpdHlNYW5hZ2VyOworCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVGVsZXBob255SW50ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwbk5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGVMaXN0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BcG5OYW1lID0gYXBuTmFtZTsKKyAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFRlbGVwaG9ueUludGVudHMuCisgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVkpOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhhcG5UeXBlLCBtQXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUgPSBFbnVtLnZhbHVlT2YoUGhvbmUuRGF0YVN0YXRlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0tFWSkpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSghaW50ZW50LmdldEJvb2xlYW5FeHRyYShQaG9uZS5ORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgYXBuVHlwZUxpc3QuICBJdCdzIGFsbCB0aGUgc2FtZSByYWRpby9uZXR3b3JrCi0gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVybmVhdGgKLSAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKCF1bmF2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlICsgIiwgcmVhc29uPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0FwblR5cGVJbmNsdWRlZChhcG5UeXBlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBlbmFibGVkIGJ1dCB0aGUgQVBOIFR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZWNvcmQgdGhlIGludGVyZmFjZSBuYW1lIGlmIG9uZSdzIHByb3ZpZGVkLiAgSWYgdGhlIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJucyBvbiB0aGlzIG5ldHdvcmsgd2Ugd2lsbCBuZWVkIHRoZSBpbnRlcmZhY2VuYW1lIGJ1dCB3b24ndCBnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZyZXNoIGNvbm5lY3RlZCBtZXNzYWdlIC0gVE9ETyBmaXggdGhpcyB3aGVuIHdlIGdldCBwZXItQVBOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInJlcGxhY2luZyBvbGQgbUludGVyZmFjZU5hbWUgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lICsgIikgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yICIgKyBtQXBuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVkpOworICAgICAgICAgICAgICAgIGlmIChtTW9iaWxlRGF0YVN0YXRlICE9IHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSArICIsIHJlYXNvbj0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogcmVhc29uKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgYXBuVHlwZUxpc3Q9ICIgKyBhcG5UeXBlTGlzdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb2JpbGVEYXRhU3RhdGUgIT0gc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb1Jlc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGRlZmF1bHQgYW5kIGhpcHJpIG11c3QgZ28gZG93biBiZWZvcmUgd2UgcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVUb0NoZWNrID0gKFBob25lLkFQTl9UWVBFX0RFRkFVTFQuZXF1YWxzKG1BcG5UeXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpdml0eU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9IElDb25uZWN0aXZpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRvUmVzZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBkZWZhdWx0IGFuZCBoaXByaSBtdXN0IGdvIGRvd24gYmVmb3JlIHdlIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZVRvQ2hlY2sgPSAoUGhvbmUuQVBOX1RZUEVfREVGQVVMVC5lcXVhbHMobUFwblR5cGUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aXZpdHlNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGl2aXR5TWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IG1Db25uZWN0aXZpdHlNYW5hZ2VyLmdldE5ldHdvcmtJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUb0NoZWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uaXNDb25uZWN0ZWQoKSA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9DaGVjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVzZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGdvIGFoZWFkIHdpdGggdGhlIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdHJ5aW5nIHRvIGNvbnRhY3QgQ29ublNlcnZpY2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9SZXNldCAmJiBtSW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgZG8gdGhpcyBoZXJlIC0gQ29ubmVjdGl2aXR5U2VydmljZSBuZWVkcyBpdCB0byBjbGVhciBzdHVmZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG9rIHRob3VnaCAtIGp1c3QgbGVhdmUgaXQgdG8gYmUgcmVmcmVzaGVkIG5leHQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25uZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChEQkcpIExvZy5kKFRBRywgImNsZWFyaW5nIG1JbnRlcmZhY2VOYW1lIGZvciAiKyBtQXBuVHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAiIGFzIGl0IERJU0NPTk5FQ1RFRCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21JbnRlcmZhY2VOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgcmVhc29uLCBhcG5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVNQRU5ERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5TVVNQRU5ERUQsIHJlYXNvbiwgYXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNPTk5FQ1RFRCBldmVudCBkaWQgbm90IHN1cHBseSBpbnRlcmZhY2UgbmFtZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdEdhdGV3YXlBZGRyID0gaW50ZW50LmdldEludEV4dHJhKFBob25lLkRBVEFfR0FURVdBWV9LRVksIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvUmVzZXQgJiYgbUxpbmtQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlmYWNlID0gbUxpbmtQcm9wZXJ0aWVzLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKGlmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGNoZWNrIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBkbyB0aGlzIGhlcmUgLSBDb25uZWN0aXZpdHlTZXJ2aWNlIG5lZWRzIGl0IHRvIGNsZWFyIHN0dWZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBvayB0aG91Z2ggLSBqdXN0IGxlYXZlIGl0IHRvIGJlIHJlZnJlc2hlZCBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25uZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKERCRykgTG9nLmQoVEFHLCAiY2xlYXJpbmcgbUludGVyZmFjZU5hbWUgZm9yICIrIG1BcG5UeXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIiBhcyBpdCBESVNDT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21JbnRlcmZhY2VOYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21EZWZhdWx0R2F0ZXdheUFkZHIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HLCByZWFzb24sIGFwbk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVNQRU5ERUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLlNVU1BFTkRFRCwgcmVhc29uLCBhcG5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZS5EQVRBX0xJTktfUFJPUEVSVElFU19LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGlua1Byb3BlcnRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDT05ORUNURUQgZXZlbnQgZGlkIG5vdCBzdXBwbHkgbGluayBwcm9wZXJ0aWVzLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmtDYXBhYmlsaXRpZXMgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUuREFUQV9MSU5LX0NBUEFCSUxJVElFU19LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGlua0NhcGFiaWxpdGllcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNPTk5FQ1RFRCBldmVudCBkaWQgbm90IHN1cHBseSBsaW5rIGNhcGFiaWxpdGllcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmtDYXBhYmlsaXRpZXMgPSBuZXcgTGlua0NhcGFiaWxpdGllcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5GQUlMVVJFX1JFQVNPTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJSZWNlaXZlZCAiICsgaW50ZW50LmdldEFjdGlvbigpICsgIiBicm9hZGNhc3QiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24gPT0gbnVsbCA/ICIiIDogIigiICsgcmVhc29uICsgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkZBSUxFRCwgcmVhc29uLCBhcG5OYW1lKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlciB0bSA9IFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgICAgIHNldFJvYW1pbmdTdGF0dXModG0uaXNOZXR3b3JrUm9hbWluZygpKTsKLSAgICAgICAgICAgICAgICBzZXRTdWJ0eXBlKHRtLmdldE5ldHdvcmtUeXBlKCksIHRtLmdldE5ldHdvcmtUeXBlTmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLgorICAgICAgICAgICAgICAgICAgICBlcXVhbHMoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBuVHlwZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuZXF1YWxzKGFwblR5cGUsIG1BcG5UeXBlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuRkFJTFVSRV9SRUFTT05fS0VZKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgbUFwblR5cGUgKyAiUmVjZWl2ZWQgIiArIGludGVudC5nZXRBY3Rpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJyb2FkY2FzdCIgKyByZWFzb24gPT0gbnVsbCA/ICIiIDogIigiICsgcmVhc29uICsgIikiKTsKKyAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRkFJTEVELCByZWFzb24sIGFwbk5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjcyLDMzICsyNzAsNyBAQAogICAgICAqIFJlcG9ydCB3aGV0aGVyIGRhdGEgY29ubmVjdGl2aXR5IGlzIHBvc3NpYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgewotICAgICAgICBnZXRQaG9uZVNlcnZpY2UoZmFsc2UpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHRoZSBwaG9uZSBwcm9jZXNzIGhhcyBjcmFzaGVkIGluIHRoZSBwYXN0LCB3ZSdsbCBnZXQgYQotICAgICAgICAgKiBSZW1vdGVFeGNlcHRpb24gYW5kIG5lZWQgdG8gcmUtcmVmZXJlbmNlIHRoZSBzZXJ2aWNlLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAwOyByZXRyeSA8IDI7IHJldHJ5KyspIHsKLSAgICAgICAgICAgIGlmIChtUGhvbmVTZXJ2aWNlID09IG51bGwpIGJyZWFrOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUGhvbmVTZXJ2aWNlLmlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEZpcnN0LXRpbWUgZmFpbGVkLCBnZXQgdGhlIHBob25lIHNlcnZpY2UgYWdhaW4KLSAgICAgICAgICAgICAgICBpZiAocmV0cnkgPT0gMCkgZ2V0UGhvbmVTZXJ2aWNlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBUaGUgbW9iaWxlIGRhdGEgbmV0d29yayBzdWJ0eXBlIGluZGljYXRlcyB3aGF0IGdlbmVyYXRpb24gbmV0d29yayB0ZWNobm9sb2d5IGlzIGluIGVmZmVjdCwKLSAgICAgKiBlLmcuLCBHUFJTLCBFREdFLCBVTVRTLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROZXR3b3JrU3VidHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldE5ldHdvcmtUeXBlKCk7CisgICAgICAgIHJldHVybiBtTmV0d29ya0luZm8uaXNBdmFpbGFibGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM1MCw3MCArMzIyLDc0IEBACiAgICAgLyoqCiAgICAgICogVGVhciBkb3duIG1vYmlsZSBkYXRhIGNvbm5lY3Rpdml0eSwgaS5lLiwgZGlzYWJsZSB0aGUgYWJpbGl0eSB0byBjcmVhdGUKICAgICAgKiBtb2JpbGUgZGF0YSBjb25uZWN0aW9ucy4KKyAgICAgKiBUT0RPIC0gbWFrZSBhc3luYyBhbmQgcmV0dXJuIG5vdGhpbmc/CiAgICAgICovCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gdGVhcmRvd24oKSB7Ci0gICAgICAgIC8vIHNpbmNlIHdlIHdvbid0IGdldCBhIG5vdGlmaWNhdGlvbiBjdXJyZW50bHkgKFRPRE8gLSBwZXIgQVBOIG5vdGlmaWNhdGlvbnMpCi0gICAgICAgIC8vIHdlIHdvbid0IGdldCBhIGRpc2Nvbm5lY3QgbWVzc2FnZSB1bnRpbCBhbGwgQVBOJ3Mgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbidzCi0gICAgICAgIC8vIEFQTiBsaXN0IGFyZSBkaXNhYmxlZC4gIFRoYXQgbWVhbnMgcHJpdmF0ZVJvdXRlcyBmb3IgRE5TIGFuZCBzdWNoIHdpbGwgcmVtYWluIG9uIC0KLSAgICAgICAgLy8gbm90IGEgcHJvYmxlbSBzaW5jZSB0aGF0J3MgYWxsIHNoYXJlZCB3aXRoIHdoYXRldmVyIG90aGVyIEFQTiBpcyBzdGlsbCBvbiwgYnV0Ci0gICAgICAgIC8vIHVnbHkuCiAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKHRydWUpOwogICAgICAgICByZXR1cm4gKHNldEVuYWJsZUFwbihtQXBuVHlwZSwgZmFsc2UpICE9IFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRCk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCisgICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCisgICAgICogYW55IGxpc3RlbmVycy4KKyAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KKyAgICAgKiBAcGFyYW0gcmVhc29uIGEge0Bjb2RlIFN0cmluZ30gaW5kaWNhdGluZyBhIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSwKKyAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBwYXJhbSBleHRyYUluZm8gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBjaGFuZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldERldGFpbGVkIHN0YXRlLCBvbGQgPSIKKyAgICAgICAgICAgICAgICArIG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkgKyAiIGFuZCBuZXcgc3RhdGU9IiArIHN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gd2FzQ29ubmVjdGluZyA9IChtTmV0d29ya0luZm8uZ2V0U3RhdGUoKSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5DT05ORUNUSU5HKTsKKyAgICAgICAgICAgIFN0cmluZyBsYXN0UmVhc29uID0gbU5ldHdvcmtJbmZvLmdldFJlYXNvbigpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIGEgcmVhc29uIHdhcyBzdXBwbGllZCB3aGVuIHRoZSBDT05ORUNUSU5HIHN0YXRlIHdhcyBlbnRlcmVkLCBhbmQgbm8KKyAgICAgICAgICAgICAqIHJlYXNvbiB3YXMgc3VwcGxpZWQgZm9yIGVudGVyaW5nIHRoZSBDT05ORUNURUQgc3RhdGUsIHRoZW4gcmV0YWluIHRoZQorICAgICAgICAgICAgICogcmVhc29uIHRoYXQgd2FzIHN1cHBsaWVkIHdoZW4gZ29pbmcgdG8gQ09OTkVDVElORy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHdhc0Nvbm5lY3RpbmcgJiYgc3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYgcmVhc29uID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgbGFzdFJlYXNvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlYXNvbiA9IGxhc3RSZWFzb247CisgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgcmVhc29uLCBleHRyYUluZm8pOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU1RBVEVfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRlYXJkb3duUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkID0gaXNSZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUZWFyZG93blJlcXVlc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZWFyZG93blJlcXVlc3RlZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZS1lbmFibGUgbW9iaWxlIGRhdGEgY29ubmVjdGl2aXR5IGFmdGVyIGEge0BsaW5rICN0ZWFyZG93bigpfS4KKyAgICAgKiBUT0RPIC0gbWFrZSBhc3luYyBhbmQgYWx3YXlzIGdldCBhIG5vdGlmaWNhdGlvbj8KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7CisgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsgLy9jb25uZWN0ZWQgb3IgZXhwZWN0IHRvIGJlPwogICAgICAgICBzZXRUZWFyZG93blJlcXVlc3RlZChmYWxzZSk7CiAgICAgICAgIHN3aXRjaCAoc2V0RW5hYmxlQXBuKG1BcG5UeXBlLCB0cnVlKSkgewogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fQUxSRUFEWV9BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAtIHJlbW92ZSB0aGlzIHdoZW4gd2UgZ2V0IHBlci1hcG4gbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHNldCBzZWxmIHRvIENPTk5FQ1RJTkcgc28gdGhlIGJlbG93IG1lc3NhZ2UgaXMgaGFuZGxlZC4KLSAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RJTkcsIFBob25lLlJFQVNPTl9BUE5fQ0hBTkdFRCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgLy9zZW5kIG91dCBhIGNvbm5lY3RlZCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVGVsZXBob255SW50ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9LRVksIFBob25lLkRhdGFTdGF0ZS5DT05ORUNURUQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZLCBQaG9uZS5SRUFTT05fQVBOX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVksIG1BcG5UeXBlVG9XYXRjaEZvcik7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX0tFWSwgbUFwbk5hbWUpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZLCBtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLk5FVFdPUktfVU5BVkFJTEFCTEVfS0VZLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZVJlY2VpdmVyICE9IG51bGwpIG1TdGF0ZVJlY2VpdmVyLm9uUmVjZWl2ZShtQ29udGV4dCwgaW50ZW50KTsKKyAgICAgICAgICAgICAgICByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ6Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgLSB3ZSdyZSBhbHJlYWR5IGR1ZSBzb21lIHN0YXR1cyB1cGRhdGUgaW50ZW50cworICAgICAgICAgICAgICAgIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX1JFUVVFU1RfRkFJTEVEOgotICAgICAgICAgICAgICAgIGlmIChtUGhvbmVTZXJ2aWNlID09IG51bGwgJiYgbUFwblR5cGUgPT0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICAvLyBvbiBzdGFydHVwIHdlIG1heSB0cnkgdG8gdGFsayB0byB0aGUgcGhvbmUgYmVmb3JlIGl0J3MgcmVhZHkKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHBob25lIHdpbGwgY29tZSB1cCBlbmFibGVkLCBnbyB3aXRoIHRoYXQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB0aGlzIGFsc28gY29tZXMgdXAgb24gdGVsZXBob255IGNyYXNoOiBpZiB3ZSB0aGluayBtb2JpbGUgZGF0YSBpcwotICAgICAgICAgICAgICAgICAgICAvLyBvZmYgYW5kIHRoZSB0ZWxlcGhvbnkgc3R1ZmYgY3Jhc2hlcyBhbmQgaGFzIHRvIHJlc3RhcnQgaXQgd2lsbCBjb21lIHVwCi0gICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQgKG1ha2luZyBhIGRhdGEgY29ubmVjdGlvbikuICBXZSB3aWxsIHRoZW4gYmUgb3V0IG9mIHN5bmMuCi0gICAgICAgICAgICAgICAgICAgIC8vIEEgcG9zc2libGUgc29sdXRpb24gaXMgYSBicm9hZGNhc3Qgd2hlbiB0ZWxlcGhvbnkgcmVzdGFydHMuCi0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBlbHNlIGZhbGwgdGhyb3VnaAogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fVFlQRV9OT1RfQVZBSUxBQkxFOgotICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgYWx3YXlzIGF2YWlsYWJsZSwgYnV0IG1heSBiZSBvZmYgZHVlIHRvCi0gICAgICAgICAgICAgICAgLy8gQWlycGxhbmVNb2RlIG9yIEUtQ2FsbCBvciB3aGF0ZXZlci4uCi0gICAgICAgICAgICAgICAgaWYgKG1BcG5UeXBlICE9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGluIHJlY29ubmVjdCAtIHVuZXhwZWN0ZWQgcmVzcG9uc2UuIik7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbUVuYWJsZWQ7CisgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ4NiwyNSArNDYyLDYgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBob3N0IHZpYSB0aGUgbW9iaWxlIGRhdGEgbmV0d29yay4KLSAgICAgKiBAcGFyYW0gaG9zdEFkZHJlc3MgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHJvdXRlIGlzIGRlc2lyZWQsCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KEluZXRBZGRyZXNzIGhvc3RBZGRyZXNzKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlJlcXVlc3RlZCBob3N0IHJvdXRlIHRvICIgKyBob3N0QWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBmb3IgIiArIG1BcG5UeXBlICsgIigiICsgbUludGVyZmFjZU5hbWUgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgaG9zdEFkZHJlc3MsIG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiTW9iaWxlIGRhdGEgc3RhdGU6ICIpOwpAQCAtNTY2LDQgKzUyMywxOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyI2dldExpbmtQcm9wZXJ0aWVzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMobUxpbmtQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXIjZ2V0TGlua0NhcGFiaWxpdGllcygpCisgICAgICovCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgZ2V0TGlua0NhcGFiaWxpdGllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rQ2FwYWJpbGl0aWVzKG1MaW5rQ2FwYWJpbGl0aWVzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhCmluZGV4IDY0OWNiOGMuLjVmNWUxMWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICAgIHN0YXRlTWFwLnB1dChEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgU3RhdGUuRElTQ09OTkVDVEVEKTsKICAgICAgICAgc3RhdGVNYXAucHV0KERldGFpbGVkU3RhdGUuRkFJTEVELCBTdGF0ZS5ESVNDT05ORUNURUQpOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgaW50IG1OZXR3b3JrVHlwZTsKICAgICBwcml2YXRlIGludCBtU3VidHlwZTsKICAgICBwcml2YXRlIFN0cmluZyBtVHlwZU5hbWU7CkBAIC0xMjEsNyArMTIxLDEwIEBACiAgICAgICovCiAgICAgcHVibGljIE5ldHdvcmtJbmZvKGludCB0eXBlKSB7fQogCi0gICAgTmV0d29ya0luZm8oaW50IHR5cGUsIGludCBzdWJ0eXBlLCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgeworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIE5ldHdvcmtJbmZvKGludCB0eXBlLCBpbnQgc3VidHlwZSwgU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKICAgICAgICAgaWYgKCFDb25uZWN0aXZpdHlNYW5hZ2VyLmlzTmV0d29ya1R5cGVWYWxpZCh0eXBlKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBuZXR3b3JrIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICAgfQpAQCAtMTQxLDcgKzE0NCw5IEBACiAgICAgICogQHJldHVybiB0aGUgbmV0d29yayB0eXBlCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gbU5ldHdvcmtUeXBlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmV0d29ya1R5cGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE1MCwxMiArMTU1LDE2IEBACiAgICAgICogQHJldHVybiB0aGUgbmV0d29yayBzdWJ0eXBlCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRTdWJ0eXBlKCkgewotICAgICAgICByZXR1cm4gbVN1YnR5cGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdWJ0eXBlOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBzZXRTdWJ0eXBlKGludCBzdWJ0eXBlLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKLSAgICAgICAgbVN1YnR5cGUgPSBzdWJ0eXBlOwotICAgICAgICBtU3VidHlwZU5hbWUgPSBzdWJ0eXBlTmFtZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtU3VidHlwZSA9IHN1YnR5cGU7CisgICAgICAgICAgICBtU3VidHlwZU5hbWUgPSBzdWJ0eXBlTmFtZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTY0LDcgKzE3Myw5IEBACiAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbmV0d29yayB0eXBlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlTmFtZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGVOYW1lOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzIsNyArMTgzLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIHN1YnR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YnR5cGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVN1YnR5cGVOYW1lOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZU5hbWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE4NSw3ICsxOTgsOSBAQAogICAgICAqIG9mIGJlaW5nIGVzdGFibGlzaGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZE9yQ29ubmVjdGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQgfHwgbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RJTkc7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQgfHwgbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RJTkc7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE5NCw3ICsyMDksOSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG5ldHdvcmsgY29ubmVjdGl2aXR5IGV4aXN0cywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTAsNyArMjI3LDkgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbmV0d29yayBpcyBhdmFpbGFibGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBtSXNBdmFpbGFibGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1Jc0F2YWlsYWJsZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjIwLDcgKzIzOSw5IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJc0F2YWlsYWJsZShib29sZWFuIGlzQXZhaWxhYmxlKSB7Ci0gICAgICAgIG1Jc0F2YWlsYWJsZSA9IGlzQXZhaWxhYmxlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1Jc0F2YWlsYWJsZSA9IGlzQXZhaWxhYmxlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzEsNyArMjUyLDkgQEAKICAgICAgKiBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsb3ZlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0ZhaWxvdmVyOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNGYWlsb3ZlcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjQxLDcgKzI2NCw5IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGYWlsb3Zlcihib29sZWFuIGlzRmFpbG92ZXIpIHsKLSAgICAgICAgbUlzRmFpbG92ZXIgPSBpc0ZhaWxvdmVyOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1Jc0ZhaWxvdmVyID0gaXNGYWlsb3ZlcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjUxLDExICsyNzYsMTUgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiByb2FtaW5nIGlzIGluIGVmZmVjdCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNSb2FtaW5nKCkgewotICAgICAgICByZXR1cm4gbUlzUm9hbWluZzsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzUm9hbWluZzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgc2V0Um9hbWluZyhib29sZWFuIGlzUm9hbWluZykgewotICAgICAgICBtSXNSb2FtaW5nID0gaXNSb2FtaW5nOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1Jc1JvYW1pbmcgPSBpc1JvYW1pbmc7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI2Myw3ICsyOTIsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIGNvYXJzZS1ncmFpbmVkIHN0YXRlCiAgICAgICovCiAgICAgcHVibGljIFN0YXRlIGdldFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RhdGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI3MSw3ICszMDIsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIGZpbmUtZ3JhaW5lZCBzdGF0ZQogICAgICAqLwogICAgIHB1YmxpYyBEZXRhaWxlZFN0YXRlIGdldERldGFpbGVkU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtRGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbURldGFpbGVkU3RhdGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI4MSwxMiArMzE0LDE1IEBACiAgICAgICogaWYgb25lIHdhcyBzdXBwbGllZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KICAgICAgKiBAcGFyYW0gZXh0cmFJbmZvIGFuIG9wdGlvbmFsIHtAY29kZSBTdHJpbmd9IHByb3ZpZGluZyBhZGRkaXRpb25hbCBuZXR3b3JrIHN0YXRlCiAgICAgICogaW5mb3JtYXRpb24gcGFzc2VkIHVwIGZyb20gdGhlIGxvd2VyIG5ldHdvcmtpbmcgbGF5ZXJzLgorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgdm9pZCBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUgZGV0YWlsZWRTdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgewotICAgICAgICB0aGlzLm1EZXRhaWxlZFN0YXRlID0gZGV0YWlsZWRTdGF0ZTsKLSAgICAgICAgdGhpcy5tU3RhdGUgPSBzdGF0ZU1hcC5nZXQoZGV0YWlsZWRTdGF0ZSk7Ci0gICAgICAgIHRoaXMubVJlYXNvbiA9IHJlYXNvbjsKLSAgICAgICAgdGhpcy5tRXh0cmFJbmZvID0gZXh0cmFJbmZvOworICAgIHB1YmxpYyB2b2lkIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZSBkZXRhaWxlZFN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgdGhpcy5tRGV0YWlsZWRTdGF0ZSA9IGRldGFpbGVkU3RhdGU7CisgICAgICAgICAgICB0aGlzLm1TdGF0ZSA9IHN0YXRlTWFwLmdldChkZXRhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgIHRoaXMubVJlYXNvbiA9IHJlYXNvbjsKKyAgICAgICAgICAgIHRoaXMubUV4dHJhSW5mbyA9IGV4dHJhSW5mbzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjk1LDcgKzMzMSw5IEBACiAgICAgICogQHJldHVybiB0aGUgcmVhc29uIGZvciBmYWlsdXJlLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvbigpIHsKLSAgICAgICAgcmV0dXJuIG1SZWFzb247CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1SZWFzb247CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwNSwyMCArMzQzLDI0IEBACiAgICAgICogQHJldHVybiB0aGUgZXh0cmEgaW5mb3JtYXRpb24sIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0cmFJbmZvKCkgewotICAgICAgICByZXR1cm4gbUV4dHJhSW5mbzsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUV4dHJhSW5mbzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCJOZXR3b3JrSW5mbzogIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0eXBlOiAiKS5hcHBlbmQoZ2V0VHlwZU5hbWUoKSkuYXBwZW5kKCJbIikuYXBwZW5kKGdldFN1YnR5cGVOYW1lKCkpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiXSwgc3RhdGU6ICIpLmFwcGVuZChtU3RhdGUpLmFwcGVuZCgiLyIpLmFwcGVuZChtRGV0YWlsZWRTdGF0ZSkuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIHJlYXNvbjogIikuYXBwZW5kKG1SZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IG1SZWFzb24pLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBleHRyYTogIikuYXBwZW5kKG1FeHRyYUluZm8gPT0gbnVsbCA/ICIobm9uZSkiIDogbUV4dHJhSW5mbykuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIHJvYW1pbmc6ICIpLmFwcGVuZChtSXNSb2FtaW5nKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgZmFpbG92ZXI6ICIpLmFwcGVuZChtSXNGYWlsb3ZlcikuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIGlzQXZhaWxhYmxlOiAiKS5hcHBlbmQobUlzQXZhaWxhYmxlKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiTmV0d29ya0luZm86ICIpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoInR5cGU6ICIpLmFwcGVuZChnZXRUeXBlTmFtZSgpKS5hcHBlbmQoIlsiKS5hcHBlbmQoZ2V0U3VidHlwZU5hbWUoKSkuCisgICAgICAgICAgICBhcHBlbmQoIl0sIHN0YXRlOiAiKS5hcHBlbmQobVN0YXRlKS5hcHBlbmQoIi8iKS5hcHBlbmQobURldGFpbGVkU3RhdGUpLgorICAgICAgICAgICAgYXBwZW5kKCIsIHJlYXNvbjogIikuYXBwZW5kKG1SZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IG1SZWFzb24pLgorICAgICAgICAgICAgYXBwZW5kKCIsIGV4dHJhOiAiKS5hcHBlbmQobUV4dHJhSW5mbyA9PSBudWxsID8gIihub25lKSIgOiBtRXh0cmFJbmZvKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCByb2FtaW5nOiAiKS5hcHBlbmQobUlzUm9hbWluZykuCisgICAgICAgICAgICBhcHBlbmQoIiwgZmFpbG92ZXI6ICIpLmFwcGVuZChtSXNGYWlsb3ZlcikuCisgICAgICAgICAgICBhcHBlbmQoIiwgaXNBdmFpbGFibGU6ICIpLmFwcGVuZChtSXNBdmFpbGFibGUpOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzM0LDE3ICszNzYsMTkgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgewotICAgICAgICBkZXN0LndyaXRlSW50KG1OZXR3b3JrVHlwZSk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobVN1YnR5cGUpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1UeXBlTmFtZSk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnR5cGVOYW1lKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3RhdGUubmFtZSgpKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRGV0YWlsZWRTdGF0ZS5uYW1lKCkpOwotICAgICAgICBkZXN0LndyaXRlSW50KG1Jc0ZhaWxvdmVyID8gMSA6IDApOwotICAgICAgICBkZXN0LndyaXRlSW50KG1Jc0F2YWlsYWJsZSA/IDEgOiAwKTsKLSAgICAgICAgZGVzdC53cml0ZUludChtSXNSb2FtaW5nID8gMSA6IDApOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1SZWFzb24pOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1FeHRyYUluZm8pOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobU5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobVN1YnR5cGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtVHlwZU5hbWUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZU5hbWUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3RhdGUubmFtZSgpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobURldGFpbGVkU3RhdGUubmFtZSgpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRmFpbG92ZXIgPyAxIDogMCk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1Jc0F2YWlsYWJsZSA/IDEgOiAwKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzUm9hbWluZyA/IDEgOiAwKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVJlYXNvbik7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1FeHRyYUluZm8pOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQppbmRleCBjMTYxZjNhLi44YWZkY2VlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKQEAgLTE2LDM2NyArMTYsMTI5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQ7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLQotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQoraW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIAogLyoqCi0gKiBFYWNoIHN1YmNsYXNzIG9mIHRoaXMgY2xhc3Mga2VlcHMgdHJhY2sgb2YgdGhlIHN0YXRlIG9mIGNvbm5lY3Rpdml0eQotICogb2YgYSBuZXR3b3JrIGludGVyZmFjZS4gQWxsIHN0YXRlIGluZm9ybWF0aW9uIGZvciBhIG5ldHdvcmsgc2hvdWxkCi0gKiBiZSBrZXB0IGluIGEgVHJhY2tlciBjbGFzcy4gVGhpcyBzdXBlcmNsYXNzIG1hbmFnZXMgdGhlCi0gKiBuZXR3b3JrLXR5cGUtaW5kZXBlbmRlbnQgYXNwZWN0cyBvZiBuZXR3b3JrIHN0YXRlLgorICogSW50ZXJmYWNlIHByb3ZpZGVzIHRoZSB7QGxpbmsgY29tLmFuZHJvaWQuc2VydmVyLkNvbm5lY3Rpdml0eVNlcnZpY2V9CisgKiB3aXRoIHRocmVlIHNlcnZpY2VzLiBFdmVudHMgdG8gdGhlIENvbm5lY3Rpdml0eVNlcnZpY2Ugd2hlbgorICogY2hhbmdlcyBvY2N1ciwgYW4gQVBJIGZvciBjb250cm9sbGluZyB0aGUgbmV0d29yayBhbmQgc3RvcmFnZQorICogZm9yIG5ldHdvcmsgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgKgorICogVGhlIENvbm5lY3Rpdml0eSB3aWxsIGNhbGwgc3RhcnRNb25pdG9yaW5nIGJlZm9yZSBhbnkgb3RoZXIKKyAqIG1ldGhvZCBpcyBjYWxsZWQuCiAgKgogICoge0BoaWRlfQogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV0d29ya1N0YXRlVHJhY2tlciBleHRlbmRzIEhhbmRsZXIgeworcHVibGljIGludGVyZmFjZSBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAotICAgIHByb3RlY3RlZCBOZXR3b3JrSW5mbyBtTmV0d29ya0luZm87Ci0gICAgcHJvdGVjdGVkIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIEhhbmRsZXIgbVRhcmdldDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1JbnRlcmZhY2VOYW1lOwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtRG5zUHJvcE5hbWVzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0OwotICAgIHByb3RlY3RlZCBpbnQgbURlZmF1bHRHYXRld2F5QWRkcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBEQkcgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5ldHdvcmtTdGF0ZVRyYWNrZXIiOworICAgIC8qKgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBFdmVudCBJbnRlcmZhY2UgYmFjayB0byBDb25uZWN0aXZpdHlTZXJ2aWNlLgorICAgICAqCisgICAgICogVGhlIGV2ZW50cyB0aGF0IGFyZSB0byBiZSBzZW50IGJhY2sgdG8gdGhlIEhhbmRsZXIgcGFzc2VkCisgICAgICogdG8gc3RhcnRNb25pdG9yaW5nIHdoZW4gdGhlIHBhcnRpY3VsYXIgZXZlbnQgb2NjdXJzLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKi8KIAogICAgIC8vIFNoYXJlIHRoZSBldmVudCBzcGFjZSB3aXRoIENvbm5lY3Rpdml0eVNlcnZpY2UgKHdoaWNoIHdlIGNhbid0IHNlZSwgYnV0CiAgICAgLy8gbXVzdCBzZW5kIGV2ZW50cyB0bykuICBJZiB5b3UgY2hhbmdlIHRoZXNlLCBjaGFuZ2UgQ29ubmVjdGl2aXR5U2VydmljZQogICAgIC8vIHRvby4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX05FVFdPUktfU1RBVEVfVFJBQ0tFUl9FVkVOVCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ORVRXT1JLX1NUQVRFX1RSQUNLRVJfRVZFTlQgPSAxMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBNSU5fTkVUV09SS19TVEFURV9UUkFDS0VSX0VWRU5UID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9ORVRXT1JLX1NUQVRFX1RSQUNLRVJfRVZFTlQgPSAxMDA7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVEFURV9DSEFOR0VEID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFID0gMjsKICAgICAvKioKLSAgICAgKiBhcmcxOiAxIHRvIHNob3csIDAgdG8gaGlkZQotICAgICAqIGFyZzI6IElEIG9mIHRoZSBub3RpZmljYXRpb24KLSAgICAgKiBvYmo6IE5vdGlmaWNhdGlvbiAoaWYgc2hvd2luZykKKyAgICAgKiBUaGUgbmV0d29yayBzdGF0ZSBoYXMgY2hhbmdlZCBhbmQgdGhlIE5ldHdvcmtJbmZvIG9iamVjdAorICAgICAqIGNvbnRhaW5zIHRoZSBuZXcgc3RhdGUuCisgICAgICoKKyAgICAgKiBtc2cud2hhdCA9IEVWRU5UX1NUQVRFX0NIQU5HRUQKKyAgICAgKiBtc2cub2JqID0gTmV0d29ya0luZm8gb2JqZWN0CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUk9BTUlOR19DSEFOR0VEID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ORVRXT1JLX1NVQlRZUEVfQ0hBTkdFRCA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1RBVEVfQ0hBTkdFRCA9IDE7CiAKLSAgICBwdWJsaWMgTmV0d29ya1N0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBIYW5kbGVyIHRhcmdldCwKLSAgICAgICAgICAgIGludCBuZXR3b3JrVHlwZSwKLSAgICAgICAgICAgIGludCBzdWJUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7CisgICAgLyoqCisgICAgICogbXNnLndoYXQgPSBFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQKKyAgICAgKiBtc2cub2JqID0gTmV0d29ya0luZm8gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VEID0gMzsKIAotICAgICAgICB0aGlzLm1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhuZXR3b3JrVHlwZSwgc3ViVHlwZSwgdHlwZU5hbWUsIHN1YnR5cGVOYW1lKTsKLSAgICB9CisgICAgLyoqCisgICAgICogbXNnLndoYXQgPSBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSworICAgICAqIG1zZy5vYmogPSBGZWF0dXJlVXNlciBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSyA9IDY7CiAKLSAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKSB7Ci0gICAgICAgIHJldHVybiBtTmV0d29ya0luZm87Ci0gICAgfQorICAgIC8qKgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBDb250cm9sIEludGVyZmFjZQorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBCZWdpbiBtb25pdG9yaW5nIGRhdGEgY29ubmVjdGl2aXR5LgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgZmlyc3QgbWV0aG9kIGNhbGxlZCB3aGVuIHRoaXMgaW50ZXJmYWNlIGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBpcyB0aGUgY3VycmVudCBBbmRyb2lkIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IGlzIHRoZSBIYW5kZXIgdG8gd2hpY2ggdG8gcmV0dXJuIHRoZSBldmVudHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRNb25pdG9yaW5nKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpOworCisgICAgLyoqCisgICAgICogRmV0Y2ggTmV0d29ya0luZm8gZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExpbmtQcm9wZXJ0aWVzIGZvciB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBMaW5rUHJvcGVydGllcywgaXMgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKTsKKworICAgIC8qKgorICAgICAqIEEgY2FwYWJpbGl0eSBpcyBhbiBJbnRlZ2VyL1N0cmluZyBwYWlyLCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICogYXJlIGRlZmluZWQgaW4gdGhlIGNsYXNzIExpbmtTb2NrZXQjS2V5LgorICAgICAqCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBjb25uZWN0aW9ucyBjYXBhYmlsaXRpZXMsIG1heSBiZSBlbXB0eSBidXQgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua0NhcGFiaWxpdGllcyBnZXRMaW5rQ2FwYWJpbGl0aWVzKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCiAgICAgICogZm9yIHRoaXMgbmV0d29yay4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoZSBtb2JpbGUgZGF0YQotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZVNlcnZlckxpc3QobURuc1Byb3BOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhpcwotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzIHRoZSBuYW1lcyBvZiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzCi0gICAgICogZ2l2ZSB0aGUgSVAgYWRkcmVzc2VzLiBQcm9wZXJ0aWVzIHdpdGggbm8gdmFsdWVzIGFyZSBza2lwcGVkLgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Yge0Bjb2RlIFN0cmluZ31zIGNvbnRhaW5pbmcgdGhlIElQIGFkZHJlc3NlcwotICAgICAqIG9mIHRoZSBETlMgc2VydmVycywgaW4gZG90LW5vdGF0aW9uLiBUaGlzIG1heSBoYXZlIGZld2VyCi0gICAgICogbm9uLW51bGwgZW50cmllcyB0aGFuIHRoZSBsaXN0IG9mIG5hbWVzIHBhc3NlZCBpbiwgc2luY2UKLSAgICAgKiBzb21lIG9mIHRoZSBwYXNzZWQtaW4gbmFtZXMgbWF5IGhhdmUgZW1wdHkgdmFsdWVzLgotICAgICAqLwotICAgIHN0YXRpYyBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TmFtZVNlcnZlckxpc3QoU3RyaW5nW10gcHJvcGVydHlOYW1lcykgewotICAgICAgICBTdHJpbmdbXSBkbnNBZGRyZXNzZXMgPSBuZXcgU3RyaW5nW3Byb3BlcnR5TmFtZXMubGVuZ3RoXTsKLSAgICAgICAgaW50IGksIGo7Ci0KLSAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWVzW2ldKTsKLSAgICAgICAgICAgIC8vIFRoZSBHU00gbGF5ZXIgc29tZXRpbWVzIHNldHMgYSBib2d1cyBETlMgc2VydmVyIGFkZHJlc3Mgb2YKLSAgICAgICAgICAgIC8vIDAuMC4wLjAKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpICYmICFUZXh0VXRpbHMuZXF1YWxzKHZhbHVlLCAiMC4wLjAuMCIpKSB7Ci0gICAgICAgICAgICAgICAgZG5zQWRkcmVzc2VzW2orK10gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG5zQWRkcmVzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByaXZhdGVEbnNSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyB0aGlzICsKLSAgICAgICAgICAgICAgICAgICAgIigiICsgbUludGVyZmFjZU5hbWUgKyAiKSAtIG1Qcml2YXRlRG5zUm91dGVTZXQgPSAiK21Qcml2YXRlRG5zUm91dGVTZXQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsICYmICFtUHJpdmF0ZURuc1JvdXRlU2V0KSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBhZGRyU3RyaW5nIDogZ2V0TmFtZVNlcnZlcnMoKSkgewotICAgICAgICAgICAgICAgIGlmIChhZGRyU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFkZHJTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiICBhZGRpbmcgIiArIGFkZHJTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUobUludGVyZmFjZU5hbWUsIGluZXRBZGRyZXNzLCBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICIgRE5TIGFkZHJlc3MgIiArIGFkZHJTdHJpbmcgKyAiIDogRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByaXZhdGVEbnNSb3V0ZXMoKSB7Ci0gICAgICAgIC8vIFRPRE8gLSB3ZSBzaG91bGQgZG8gdGhpcyBleHBsaWNpdGx5IGJ1dCB0aGUgTmV0VXRpbHMgYXBpIGRvZXNudAotICAgICAgICAvLyBzdXBwb3J0IHRoaXMgeWV0IC0gbXVzdCByZW1vdmUgYWxsLiAgTm8gd29yc2UgdGhhbiBiZWZvcmUKLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgbVByaXZhdGVEbnNSb3V0ZVNldCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgbUludGVyZmFjZU5hbWUgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZUhvc3RSb3V0ZXMobUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRGVmYXVsdFJvdXRlKCkgewotICAgICAgICBpZiAoKG1JbnRlcmZhY2VOYW1lICE9IG51bGwpICYmIChtRGVmYXVsdEdhdGV3YXlBZGRyICE9IDApKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkRGVmYXVsdFJvdXRlIGZvciAiICsgbU5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIG1JbnRlcmZhY2VOYW1lICsgIiksIEdhdGV3YXlBZGRyPSIgKyBtRGVmYXVsdEdhdGV3YXlBZGRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MobURlZmF1bHRHYXRld2F5QWRkcik7Ci0gICAgICAgICAgICBpZiAoaW5ldEFkZHJlc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiBVbmFibGUgdG8gYWRkIGRlZmF1bHQgcm91dGUuIG1EZWZhdWx0R2F0ZXdheUFkZHIgRXJyb3IiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFOZXR3b3JrVXRpbHMuYWRkRGVmYXVsdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBpbmV0QWRkcmVzcykgJiYgREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiAgVW5hYmxlIHRvIGFkZCBkZWZhdWx0IHJvdXRlLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZURlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVEZWZhdWx0Um91dGUgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArICIgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZURlZmF1bHRSb3V0ZShtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbmV0d29yayBzcGVjaWZpYyBUQ1AgYnVmZmVyIHNpemVzIGZyb20gU3lzdGVtUHJvcGVydGllcwotICAgICAqIG5ldC50Y3AuYnVmZmVyc2l6ZS5bZGVmYXVsdHx3aWZpfHVtdHN8ZWRnZXxncHJzXSBhbmQgc2V0IHRoZW0gZm9yIHN5c3RlbQotICAgICAqIHdpZGUgdXNlCi0gICAgICovCi0gICBwdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU2V0dGluZ3MoKSB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywga2V5ICsgIiBub3QgZm91bmQgaW4gc3lzdGVtIHByb3BlcnRpZXMuIFVzaW5nIGRlZmF1bHRzIik7Ci0KLSAgICAgICAgICAgIC8vIFNldHRpbmcgdG8gZGVmYXVsdCB2YWx1ZXMgc28gd2Ugd29uJ3QgYmUgc3R1Y2sgdG8gcHJldmlvdXMgdmFsdWVzCi0gICAgICAgICAgICBrZXkgPSAibmV0LnRjcC5idWZmZXJzaXplLmRlZmF1bHQiOwotICAgICAgICAgICAgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHZhbHVlcyBpbiBrZXJuZWwKLSAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJTZXR0aW5nIFRDUCB2YWx1ZXM6IFsiICsgYnVmZmVyU2l6ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gd2hpY2ggY29tZXMgZnJvbSBbIiArIGtleSArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRCdWZmZXJTaXplKGJ1ZmZlclNpemVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbGVhc2UgdGhlIHdha2Vsb2NrLCBpZiBhbnksIHRoYXQgbWF5IGJlIGhlbGQgd2hpbGUgaGFuZGxpbmcgYQotICAgICAqIGRpc2Nvbm5lY3Qgb3BlcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VXYWtlTG9jaygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgVENQIGJ1ZmZlciBzaXplcyB0byAvc3lzL2tlcm5lbC9pcHY0L3RjcF9bci93XW1lbV9bbWluL2RlZi9tYXhdCi0gICAgICogd2hpY2ggbWFwcyB0byAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwX3JtZW0gYW5kIHRjcHdtZW0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZXMgaW4gdGhlIGZvcm1hdCBvZiAicmVhZE1pbiwgcmVhZEluaXRpYWwsIHJlYWRNYXgsCi0gICAgICogICAgICAgIHdyaXRlTWluLCB3cml0ZUluaXRpYWwsIHdyaXRlTWF4IgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRCdWZmZXJTaXplKFN0cmluZyBidWZmZXJTaXplcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gYnVmZmVyU2l6ZXMuc3BsaXQoIiwiKTsKLQotICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gNikgewotICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gIi9zeXMva2VybmVsL2lwdjQvdGNwXyI7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21pbiIsIHZhbHVlc1swXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX2RlZiIsIHZhbHVlc1sxXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21heCIsIHZhbHVlc1syXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21pbiIsIHZhbHVlc1szXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX2RlZiIsIHZhbHVlc1s0XSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21heCIsIHZhbHVlc1s1XSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkludmFsaWQgYnVmZmVyc2l6ZSBzdHJpbmc6ICIgKyBidWZmZXJTaXplcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IHNldCB0Y3AgYnVmZmVyIHNpemVzOiIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBzdHJpbmcgdG8gZmlsZS4gQmFzaWNhbGx5IHNhbWUgYXMgImVjaG8gLW4gJHN0cmluZyA+ICRmaWxlbmFtZSIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdHJpbmdUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dC53cml0ZShzdHJpbmcpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKLSAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KLSAgICAgKiBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgewotICAgICAgICBzZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKLSAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KLSAgICAgKiBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQotICAgICAqIEBwYXJhbSByZWFzb24gYSB7QGNvZGUgU3RyaW5nfSBpbmRpY2F0aW5nIGEgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLAotICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCi0gICAgICogQHBhcmFtIGV4dHJhSW5mbyBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIGNoYW5nZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgewotICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXREZXRhaWxlZCBzdGF0ZSwgb2xkID0iK21OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkrIiBhbmQgbmV3IHN0YXRlPSIrc3RhdGUpOwotICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgewotICAgICAgICAgICAgYm9vbGVhbiB3YXNDb25uZWN0aW5nID0gKG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpID09IE5ldHdvcmtJbmZvLlN0YXRlLkNPTk5FQ1RJTkcpOwotICAgICAgICAgICAgU3RyaW5nIGxhc3RSZWFzb24gPSBtTmV0d29ya0luZm8uZ2V0UmVhc29uKCk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogSWYgYSByZWFzb24gd2FzIHN1cHBsaWVkIHdoZW4gdGhlIENPTk5FQ1RJTkcgc3RhdGUgd2FzIGVudGVyZWQsIGFuZCBubwotICAgICAgICAgICAgICogcmVhc29uIHdhcyBzdXBwbGllZCBmb3IgZW50ZXJpbmcgdGhlIENPTk5FQ1RFRCBzdGF0ZSwgdGhlbiByZXRhaW4gdGhlCi0gICAgICAgICAgICAgKiByZWFzb24gdGhhdCB3YXMgc3VwcGxpZWQgd2hlbiBnb2luZyB0byBDT05ORUNUSU5HLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAod2FzQ29ubmVjdGluZyAmJiBzdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCAmJiByZWFzb24gPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBsYXN0UmVhc29uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmVhc29uID0gbGFzdFJlYXNvbjsKLSAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCByZWFzb24sIGV4dHJhSW5mbyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TVEFURV9DSEFOR0VELCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZUludGVybmFsKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRlYXJkb3duUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXF1ZXN0ZWQpIHsKLSAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkID0gaXNSZXF1ZXN0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUZWFyZG93blJlcXVlc3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1UZWFyZG93blJlcXVlc3RlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VuZCBhICBub3RpZmljYXRpb24gdGhhdCB0aGUgcmVzdWx0cyBvZiBhIHNjYW4gZm9yIG5ldHdvcmsgYWNjZXNzCi0gICAgICogcG9pbnRzIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzIGFyZSBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFLCBtTmV0d29ya0luZm8pOwotICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb3JkIHRoZSByb2FtaW5nIHN0YXR1cyBvZiB0aGUgZGV2aWNlLCBhbmQgaWYgaXQgaXMgYSBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMKLSAgICAgKiBzdGF0dXMsIHNlbmQgYSBub3RpZmljYXRpb24gdG8gYW55IGxpc3RlbmVycy4KLSAgICAgKiBAcGFyYW0gaXNSb2FtaW5nIHtAY29kZSB0cnVlfSBpZiB0aGUgZGV2aWNlIGlzIG5vdyByb2FtaW5nLCB7QGNvZGUgZmFsc2V9Ci0gICAgICogaWYgaXQgaXMgbm8gbG9uZ2VyIHJvYW1pbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Um9hbWluZ1N0YXR1cyhib29sZWFuIGlzUm9hbWluZykgewotICAgICAgICBpZiAoaXNSb2FtaW5nICE9IG1OZXR3b3JrSW5mby5pc1JvYW1pbmcoKSkgewotICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldFJvYW1pbmcoaXNSb2FtaW5nKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1JPQU1JTkdfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFN1YnR5cGUoaW50IHN1YnR5cGUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgewotICAgICAgICBpZiAobU5ldHdvcmtJbmZvLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIGludCBvbGRTdWJ0eXBlID0gbU5ldHdvcmtJbmZvLmdldFN1YnR5cGUoKTsKLSAgICAgICAgICAgIGlmIChzdWJ0eXBlICE9IG9sZFN1YnR5cGUpIHsKLSAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0U3VidHlwZShzdWJ0eXBlLCBzdWJ0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBFVkVOVF9ORVRXT1JLX1NVQlRZUEVfQ0hBTkdFRCwgb2xkU3VidHlwZSwgMCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydE1vbml0b3JpbmcoKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKIAogICAgIC8qKgogICAgICAqIERpc2FibGUgY29ubmVjdGl2aXR5IHRvIGEgbmV0d29yawogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgdGVhcmRvd24gb2NjdXJyZWQsIHtAY29kZSBmYWxzZX0gaWYgdGhlCiAgICAgICogdGVhcmRvd24gZGlkIG5vdCBvY2N1ci4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB0ZWFyZG93bigpOworICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCk7CiAKICAgICAvKioKICAgICAgKiBSZWVuYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrIGFmdGVyIGEge0BsaW5rICN0ZWFyZG93bigpfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB3ZSdyZSBjb25uZWN0ZWQgb3IgZXhwZWN0IHRvIGJlIGNvbm5lY3RlZAogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlY29ubmVjdCgpOworICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpOwogCiAgICAgLyoqCiAgICAgICogVHVybiB0aGUgd2lyZWxlc3MgcmFkaW8gb2ZmIGZvciBhIG5ldHdvcmsuCiAgICAgICogQHBhcmFtIHR1cm5PbiB7QGNvZGUgdHJ1ZX0gdG8gdHVybiB0aGUgcmFkaW8gb24sIHtAY29kZSBmYWxzZX0KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5Pbik7CisgICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhpcyBuZXR3b3JrIGlzIGF2YWlsYWJsZSBmb3IKICAgICAgKiBjb25uZWN0aW9ucy4gQSB2YWx1ZSBvZiB7QGNvZGUgZmFsc2V9IG1lYW5zIHRoYXQgc29tZSBxdWFzaS1wZXJtYW5lbnQKICAgICAgKiBjb25kaXRpb24gcHJldmVudHMgY29ubmVjdGl2aXR5IHRvIHRoaXMgbmV0d29yay4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0F2YWlsYWJsZSgpOworICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaCBkZWZhdWx0IGdhdGV3YXkgYWRkcmVzcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpOwogCiAgICAgLyoqCiAgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIHdhbnRzIHRvCkBAIC0zOTAsNyArMTUyLDcgQEAKICAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQogICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKKyAgICBwdWJsaWMgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKIAogICAgIC8qKgogICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBpcyBmaW5pc2hlZApAQCAtNDA0LDIzICsxNjYsNDMgQEAKICAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQogICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOworICAgIHB1YmxpYyBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CiAKICAgICAvKioKLSAgICAgKiBFbnN1cmUgdGhhdCBhIG5ldHdvcmsgcm91dGUgZXhpc3RzIHRvIGRlbGl2ZXIgdHJhZmZpYyB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogaG9zdCB2aWEgdGhpcyBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcGFyYW0gaG9zdEFkZHJlc3MgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHJvdXRlIGlzIGRlc2lyZWQKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogU3RvcmFnZSBBUEkgdXNlZCBieSBDb25uZWN0aXZpdHlTZXJ2aWNlIGZvciBzYXZpbmcKKyAgICAgKiBOZXR3b3JrIHNwZWNpZmljIGluZm9ybWF0aW9uLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3QoSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KIAogICAgIC8qKgotICAgICAqIEludGVycHJldHMgc2NhbiByZXN1bHRzLiBUaGlzIHdpbGwgYmUgY2FsbGVkIGF0IGEgc2FmZSB0aW1lIGZvcgotICAgICAqIHByb2Nlc3NpbmcsIGFuZCBmcm9tIGEgc2FmZSB0aHJlYWQuCisgICAgICogQ2hlY2sgaWYgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0IGZvciB0aGUgbmV0d29yawogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludGVycHJldFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpOworCisgICAgLyoqCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaXZhdGVEbnNSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgZGVmYXVsdCByb3V0ZSBpcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSb3V0ZVNldCgpOworCisgICAgLyoqCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIGRlZmF1bHQgcm91dGUgaXMgc2V0IGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGVhciBkb3duIHdhcyByZXF1ZXN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB0ZWFyIGRvd24gcmVxdWVzdGVkIGZyb20gY29ubmVjdGl2aXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCk7CiAKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YQppbmRleCA1ZDRiMDk5Li42YjFmZTk5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhCkBAIC01Miw3ICs1MiwxMSBAQAogICAgICAgICAgIGludCBwcmVmaXhMZW5ndGgsIFN0cmluZyBndyk7CiAKICAgICAvKiogUmV0dXJuIHRoZSBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBkZWZhdWx0IHJvdXRlIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwotICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBnZXREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUpOworICAgIHB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0RGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CisgICAgICAgIGludCBhZGRyID0gZ2V0RGVmYXVsdFJvdXRlTmF0aXZlKGludGVyZmFjZU5hbWUpOworICAgICAgICByZXR1cm4gaW50VG9JbmV0QWRkcmVzcyhhZGRyKTsKKyAgICB9CisgICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIGludCBnZXREZWZhdWx0Um91dGVOYXRpdmUoU3RyaW5nIGludGVyZmFjZU5hbWUpOwogCiAgICAgLyoqIFJlbW92ZSBob3N0IHJvdXRlcyB0aGF0IHVzZXMgdGhlIG5hbWVkIGludGVyZmFjZS4gKi8KICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgcmVtb3ZlSG9zdFJvdXRlcyhTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CkBAIC0xNDIsNiArMTQ2LDU3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ29udmVydCBhIElQdjQgYWRkcmVzcyBmcm9tIGFuIEluZXRBZGRyZXNzIHRvIGFuIGludGVnZXIKKyAgICAgKiBAcGFyYW0gaW5ldEFkZHIgaXMgYW4gSW5ldEFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUgSVB2NCBhZGRyZXNzCisgICAgICogQHJldHVybiB0aGUgSVAgYWRkcmVzcyBhcyBhbiBpbnRlZ2VyIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGluZXRBZGRyZXNzVG9JbnQoSW5ldEFkZHJlc3MgaW5ldEFkZHIpCisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZSBbXSBhZGRyID0gaW5ldEFkZHIuZ2V0QWRkcmVzcygpOworICAgICAgICBpZiAoYWRkci5sZW5ndGggIT0gNCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IGFuIElQdjQgYWRkcmVzcyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKGFkZHJbM10gJiAweGZmKSA8PCAyNCkgfCAoKGFkZHJbMl0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgoYWRkclsxXSAmIDB4ZmYpIDw8IDgpIHwgKGFkZHJbMF0gJiAweGZmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgbmV0d29yayBwcmVmaXggbGVuZ3RoIHRvIGFuIElQdjQgbmV0bWFzayBpbnRlZ2VyCisgICAgICogQHBhcmFtIHByZWZpeExlbmd0aAorICAgICAqIEByZXR1cm4gdGhlIElQdjQgbmV0bWFzayBhcyBhbiBpbnRlZ2VyIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHByZWZpeExlbmd0aFRvTmV0bWFza0ludChpbnQgcHJlZml4TGVuZ3RoKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcmVmaXhMZW5ndGggPCAwIHx8IHByZWZpeExlbmd0aCA+IDMyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHByZWZpeCBsZW5ndGggKDAgPD0gcHJlZml4IDw9IDMyKSIpOworICAgICAgICB9CisgICAgICAgIGludCB2YWx1ZSA9IDB4ZmZmZmZmZmYgPDwgKDMyIC0gcHJlZml4TGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIEludGVnZXIucmV2ZXJzZUJ5dGVzKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJcEFkZHJlc3MoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgLy9UT0RPOiBBZGQgTmV0d29ya1V0aWxzIHN1cHBvcnQgZm9yIElQdjYgY29uZmlndXJhdGlvbiBhbmQKKyAgICAgICAgLy9yZW1vdmUgSVB2NCB2YWxpZGF0aW9uIGFuZCB1c2UgYSBnZW5lcmljIEluZXRBZGRyZXNzIHZhbGlkYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gYWRkcmVzcy5zcGxpdCgiXFwuIik7CisgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9IDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pOworICAgICAgICAgICAgaWYgKGEgPCAwIHx8IGEgPiAyNTUpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKTsKKyAgICAgICAgICAgIGlmIChhIDwgMCB8fCBhID4gMjU1KSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBhID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSk7CisgICAgICAgICAgICBpZiAoYSA8IDAgfHwgYSA+IDI1NSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pOworICAgICAgICAgICAgaWYgKGEgPCAwIHx8IGEgPiAyNTUpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQWRkIGEgZGVmYXVsdCByb3V0ZSB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgZ2F0ZXdheS4KICAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIHJvdXRlIHNob3VsZCBiZSBhZGRlZAogICAgICAqIEBwYXJhbSBndyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgZ2F0ZXdheSB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKQEAgLTE5NCwxOSArMjQ5LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYWRkUm91dGUoaW50ZXJmYWNlTmFtZSwgZHN0U3RyLCBwcmVmaXhMZW5ndGgsIGd3U3RyKSA9PSAwOwogICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHY0U3RyaW5nVG9JbnQoU3RyaW5nIHN0cikgewotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgU3RyaW5nW10gYXJyYXkgPSBzdHIuc3BsaXQoIlxcLiIpOwotICAgICAgICBpZiAoYXJyYXkubGVuZ3RoICE9IDQpIHJldHVybiAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gSW50ZWdlci5wYXJzZUludChhcnJheVszXSk7Ci0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgSW50ZWdlci5wYXJzZUludChhcnJheVsyXSk7Ci0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgSW50ZWdlci5wYXJzZUludChhcnJheVsxXSk7Ci0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgSW50ZWdlci5wYXJzZUludChhcnJheVswXSk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKaW5kZXggMjJjMzBhNS4uODMwZmYwNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKQEAgLTE2LDMyICsxNiwxNzMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdDsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlByb3h5U2VsZWN0b3I7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlUGxhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlByb3h5U2VsZWN0b3JSb3V0ZVBsYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0OworCiAvKioKICAqIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGFjY2Vzc2luZyB0aGUgdXNlciBhbmQgZGVmYXVsdCBwcm94eQogICogc2V0dGluZ3MuCiAgKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBQcm94eSB7CitwdWJsaWMgZmluYWwgY2xhc3MgUHJveHkgewogCiAgICAgLy8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGV4dHJhIGRlYnVnZ2luZy4KLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgUFJPWFlfQ0hBTkdFX0FDVElPTiA9CisgICAgLy8gVXNlZCB0byBub3RpZnkgYW4gYXBwIHRoYXQncyBjYWNoaW5nIHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gcHJveHkKKyAgICAvLyB0aGF0IGVpdGhlciB0aGUgZGVmYXVsdCBjb25uZWN0aW9uIG9yIGl0cyBwcm94eSBoYXMgY2hhbmdlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NIQU5HRV9BQ1RJT04gPQogICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBST1hZX0NIQU5HRSI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBSZWFkV3JpdGVMb2NrIHNQcm94eUluZm9Mb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKworICAgIHByaXZhdGUgc3RhdGljIFNldHRpbmdzT2JzZXJ2ZXIgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIFByb3h5U3BlYyBzR2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIENvbm5lY3Rpdml0eU1hbmFnZXIgc0Nvbm5lY3Rpdml0eU1hbmFnZXIgPSBudWxsOworCisgICAgLy8gSG9zdG5hbWUgLyBJUCBSRUdFWCB2YWxpZGF0aW9uCisgICAgLy8gTWF0Y2hlcyBibGFuayBpbnB1dCwgaXBzLCBhbmQgZG9tYWluIG5hbWVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfSVBfUkVHRVggPQorICAgICAgICAiW2EtekEtWjAtOV0rKFxcLVthLXpBLVowLTldKykqKFxcLlthLXpBLVowLTldKyhcXC1bYS16QS1aMC05XSspKikqIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUTkFNRV9SRUdFWFAgPSAiXiR8XiIgKyBOQU1FX0lQX1JFR0VYICsgIiQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBIT1NUTkFNRV9QQVRURVJOOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xMSVNUX1JFR0VYUCA9ICIkfF4oLj8iICsgTkFNRV9JUF9SRUdFWAorICAgICAgICArICIpKygsKC4/IiArIE5BTUVfSVBfUkVHRVggKyAiKSkqJCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEVYQ0xMSVNUX1BBVFRFUk47CisKKyAgICBzdGF0aWMgeworICAgICAgICBIT1NUTkFNRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKEhPU1ROQU1FX1JFR0VYUCk7CisgICAgICAgIEVYQ0xMSVNUX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoRVhDTExJU1RfUkVHRVhQKTsKKyAgICB9CisKKyAgICAvLyB1c2VmdWwgYmVjYXVzZSBpdCBob2xkcyB0aGUgcHJvY2Vzc2VkIGV4Y2x1c2lvbiBsaXN0IC0gZG9uJ3Qgd2FudCB0byByZXBhcnNlIGl0IGVhY2ggdGltZQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5U3BlYyB7CisgICAgICAgIFN0cmluZ1tdIGV4Y2x1c2lvbkxpc3Q7CisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGFkZHJlc3MgPSBudWxsOworICAgICAgICBwdWJsaWMgUHJveHlTcGVjKCkgeworICAgICAgICAgICAgZXhjbHVzaW9uTGlzdCA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VSTEluRXhjbHVzaW9uTGlzdChTdHJpbmcgdXJsLCBTdHJpbmdbXSBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFVyaSB1ID0gVXJpLnBhcnNlKHVybCk7CisgICAgICAgIFN0cmluZyB1cmxEb21haW4gPSB1LmdldEhvc3QoKTsKKyAgICAgICAgLy8gSWYgdGhlIGRvbWFpbiBpcyBkZWZpbmVkIGFzICIuYW5kcm9pZC5jb20iIG9yICJhbmRyb2lkLmNvbSIsIHdlIHdpc2ggdG8gbWF0Y2gKKyAgICAgICAgLy8gaHR0cDovL2FuZHJvaWQuY29tIGFzIHdlbGwgYXMgaHR0cDovL3h4eC5hbmRyb2lkLmNvbSAsIGJ1dCBub3QKKyAgICAgICAgLy8gaHR0cDovL215YW5kcm9pZC5jb20gLiBUaGlzIGNvZGUgd29ya3Mgb3V0IHRoZSBsb2dpYy4KKyAgICAgICAgZm9yIChTdHJpbmcgZXhjbHVkZWREb21haW4gOiBleGNsdXNpb25MaXN0KSB7CisgICAgICAgICAgICBTdHJpbmcgZG90RG9tYWluID0gIi4iICsgZXhjbHVkZWREb21haW47CisgICAgICAgICAgICBpZiAodXJsRG9tYWluLmVxdWFscyhleGNsdWRlZERvbWFpbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1cmxEb21haW4uZW5kc1dpdGgoZG90RG9tYWluKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIG1hdGNoCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyc2VIb3N0KFN0cmluZyBwcm94eVNwZWMpIHsKKyAgICAgICAgaW50IGkgPSBwcm94eVNwZWMuaW5kZXhPZignOicpOworICAgICAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJveHlTcGVjLmxlbmd0aCgpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3h5U3BlYy5zdWJzdHJpbmcoMCwgaSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlUG9ydChTdHJpbmcgcHJveHlTcGVjKSB7CisgICAgICAgIGludCBpID0gcHJveHlTcGVjLmluZGV4T2YoJzonKTsKKyAgICAgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHByb3h5U3BlYy5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGkgPCBwcm94eVNwZWMubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHByb3h5U3BlYy5zdWJzdHJpbmcoaSsxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm94eSBvYmplY3QgdG8gYmUgdXNlZCBmb3IgdGhlIFVSTCBnaXZlbiBhcyBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGN0eCBBIENvbnRleHQgdXNlZCB0byBnZXQgdGhlIHNldHRpbmdzIGZvciB0aGUgcHJveHkgaG9zdC4KKyAgICAgKiBAcGFyYW0gdXJsIEEgVVJMIHRvIGJlIGFjY2Vzc2VkLiBVc2VkIHRvIGV2YWx1YXRlIGV4Y2x1c2lvbiBsaXN0LgorICAgICAqIEByZXR1cm4gUHJveHkgKGphdmEubmV0KSBvYmplY3QgY29udGFpbmluZyB0aGUgaG9zdCBuYW1lLiBJZiB0aGUKKyAgICAgKiAgICAgICAgIHVzZXIgZGlkIG5vdCBzZXQgYSBob3N0bmFtZSBpdCByZXR1cm5zIHRoZSBkZWZhdWx0IGhvc3QuCisgICAgICogICAgICAgICBBIG51bGwgdmFsdWUgbWVhbnMgdGhhdCBubyBob3N0IGlzIHRvIGJlIHVzZWQuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkgZ2V0UHJveHkoQ29udGV4dCBjdHgsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIGphdmEubmV0LlByb3h5IHJldHZhbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyc1JlYWRMb2NrZWQoY3R4KTsKKyAgICAgICAgICAgICAgICBwYXJzZUdsb2JhbFByb3h5SW5mb1JlYWRMb2NrZWQoY3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBQcm94eSBkZWZpbmVkIC0gQXBwbHkgZXhjbHVzaW9uIHJ1bGVzCisgICAgICAgICAgICAgICAgaWYgKGlzVVJMSW5FeGNsdXNpb25MaXN0KHVybCwgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbm8gcHJveHkKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLm5ldC5Qcm94eShqYXZhLm5ldC5Qcm94eS5UeXBlLkhUVFAsIHNHbG9iYWxQcm94eVNwZWMuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBnZXREZWZhdWx0UHJveHkoY3R4LCB1cmwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldHZhbCAhPSBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWSkgJiYgKGlzTG9jYWxIb3N0KHVybCkpKSB7CisgICAgICAgICAgICByZXR2YWwgPSBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwcm94eSBob3N0IHNldCBieSB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBob3N0LgpAQCAtNDksODMgKzE5MCw4MiBAQAogICAgICAqICAgICAgICAgbmFtZSBpdCByZXR1cm5zIHRoZSBkZWZhdWx0IGhvc3QuIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGF0IG5vCiAgICAgICogICAgICAgICBob3N0IGlzIHRvIGJlIHVzZWQuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdChDb250ZXh0IGN0eCkgewotICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gY3R4LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjb250ZW50UmVzb2x2ZXIpOwotICAgICAgICBTdHJpbmcgaG9zdCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGkgPSBob3N0LmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGhvc3QubGVuZ3RoKCkgPT0gMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhvc3Quc3Vic3RyaW5nKDAsIGkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEhvc3QoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgamF2YS5uZXQuUHJveHkgcHJveHkgPSBnZXRQcm94eShjdHgsIG51bGwpOworICAgICAgICBpZiAocHJveHkgPT0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFkpIHJldHVybiBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoSW5ldFNvY2tldEFkZHJlc3MpKHByb3h5LmFkZHJlc3MoKSkpLmdldEhvc3ROYW1lKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEhvc3QoKTsKICAgICB9CiAKKyAgICAvLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBmdW5jdGlvbgogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcHJveHkgcG9ydCBzZXQgYnkgdGhlIHVzZXIuCiAgICAgICogQHBhcmFtIGN0eCBBIENvbnRleHQgdXNlZCB0byBnZXQgdGhlIHNldHRpbmdzIGZvciB0aGUgcHJveHkgcG9ydC4KICAgICAgKiBAcmV0dXJuIFRoZSBwb3J0IG51bWJlciB0byB1c2Ugb3IgLTEgaWYgbm8gcHJveHkgaXMgdG8gYmUgdXNlZC4KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIGludCBnZXRQb3J0KENvbnRleHQgY3R4KSB7Ci0gICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBjdHguZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGNvbnRlbnRSZXNvbHZlcik7Ci0gICAgICAgIFN0cmluZyBob3N0ID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBjb250ZW50UmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOwotICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IGhvc3QuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKGkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaG9zdC5sZW5ndGgoKSA9PSAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaSA8IGhvc3QubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoaG9zdC5zdWJzdHJpbmcoaSsxKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0UG9ydChDb250ZXh0IGN0eCkgeworICAgICAgICBqYXZhLm5ldC5Qcm94eSBwcm94eSA9IGdldFByb3h5KGN0eCwgbnVsbCk7CisgICAgICAgIGlmIChwcm94eSA9PSBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWSkgcmV0dXJuIC0xOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICgoSW5ldFNvY2tldEFkZHJlc3MpKHByb3h5LmFkZHJlc3MoKSkpLmdldFBvcnQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFBvcnQoKTsKICAgICB9CiAKKyAgICAvLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBmdW5jdGlvbgogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBwcm94eSBob3N0IHNwZWNpZmllZCBieSB0aGUgY2Fycmllci4KICAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBob3N0IG5hbWUgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBwcm94eSBmb3IKICAgICAgKiB0aGlzIGNhcnJpZXIuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEhvc3QoKSB7Ci0gICAgICAgIFN0cmluZyBob3N0ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIm5ldC5ncHJzLmh0dHAtcHJveHkiKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgVXJpIHUgPSBVcmkucGFyc2UoaG9zdCk7Ci0gICAgICAgICAgICBob3N0ID0gdS5nZXRIb3N0KCk7Ci0gICAgICAgICAgICByZXR1cm4gaG9zdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdEhvc3QoKSB7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHByb3h5IHBvcnQgc3BlY2lmaWVkIGJ5IHRoZSBjYXJyaWVyLgogICAgICAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyIHRvIGJlIHVzZWQgd2l0aCB0aGUgcHJveHkgaG9zdCBvciAtMSBpZiB0aGVyZSBpcwogICAgICAqIG5vIHByb3h5IGZvciB0aGlzIGNhcnJpZXIuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdFBvcnQoKSB7Ci0gICAgICAgIFN0cmluZyBob3N0ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIm5ldC5ncHJzLmh0dHAtcHJveHkiKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgVXJpIHUgPSBVcmkucGFyc2UoaG9zdCk7Ci0gICAgICAgICAgICByZXR1cm4gdS5nZXRQb3J0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBnZXREZWZhdWx0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAorICAgIC8vIFRPRE8gLSBjYWNoZSB0aGUgZGV0YWlscyBmb3IgZWFjaCBuZXR3b3JrIHNvIHdlIGRvbid0IGhhdmUgdG8gZmV0Y2ggYW5kIHBhcnNlCisgICAgLy8gb24gZWFjaCByZXF1ZXN0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkgZ2V0RGVmYXVsdFByb3h5KENvbnRleHQgY29udGV4dCwgU3RyaW5nIHVybCkgeworICAgICAgICBpZiAoc0Nvbm5lY3Rpdml0eU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc0Nvbm5lY3Rpdml0eU1hbmFnZXIgPSAoQ29ubmVjdGl2aXR5TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIGlmIChzQ29ubmVjdGl2aXR5TWFuYWdlciA9PSBudWxsKSByZXR1cm4gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBzQ29ubmVjdGl2aXR5TWFuYWdlci5nZXRBY3RpdmVMaW5rUHJvcGVydGllcygpOworCisgICAgICAgIGlmIChsaW5rUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBQcm94eVByb3BlcnRpZXMgcHJveHlQcm9wZXJ0aWVzID0gbGlua1Byb3BlcnRpZXMuZ2V0SHR0cFByb3h5KCk7CisKKyAgICAgICAgICAgIGlmIChwcm94eVByb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0ID0gcHJveHlQcm9wZXJ0aWVzLmdldEV4Y2x1c2lvbkxpc3QoKTsKKyAgICAgICAgICAgICAgICBTb2NrZXRBZGRyZXNzIHNvY2tldEFkZHIgPSBwcm94eVByb3BlcnRpZXMuZ2V0U29ja2V0QWRkcmVzcygpOworICAgICAgICAgICAgICAgIGlmIChzb2NrZXRBZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFyc2VkRXhjbHVzaW9uQXJyYXkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEV4Y2x1c2lvbkFycmF5ID0gcGFyc2VFeGNsdXNpb25MaXN0KGV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVVJMSW5FeGNsdXNpb25MaXN0KHVybCwgcGFyc2VkRXhjbHVzaW9uQXJyYXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGphdmEubmV0LlByb3h5KGphdmEubmV0LlByb3h5LlR5cGUuSFRUUCwgc29ja2V0QWRkcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGphdmEubmV0LlByb3h5Lk5PX1BST1hZOworICAgIH0KKworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZ1bmN0aW9uIC8gZGVwcmVjYXRlCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHByb3h5IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4gVGhpcyBpcyBhIHdyYXBwZXIKICAgICAgKiBhcm91bmQge0BsaW5rIGFuZHJvaWQubmV0LlByb3h5I2dldEhvc3QoKX0uIEN1cnJlbnRseSBubyBwcm94eSB3aWxsCkBAIC0xMzgsMjYgKzI3OCwyMyBAQAogICAgICAqIGFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURQogICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcm94eSB0byBiZSB1c2VkIGJ5IGNsaWVudHMsIG9yIG51bGwgaWYgdGhlcmUKICAgICAgKiBpcyBubyBwcm94eS4KLSAgICAgKgogICAgICAqIHtAaGlkZX0KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIEh0dHBIb3N0IGdldFByZWZlcnJlZEh0dHBIb3N0KENvbnRleHQgY29udGV4dCwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEh0dHBIb3N0IGdldFByZWZlcnJlZEh0dHBIb3N0KENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKCFpc0xvY2FsSG9zdCh1cmwpICYmICFpc05ldHdvcmtXaWZpKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJveHlIb3N0ID0gUHJveHkuZ2V0SG9zdChjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChwcm94eUhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhvc3QocHJveHlIb3N0LCBQcm94eS5nZXRQb3J0KGNvbnRleHQpLCAiaHR0cCIpOwotICAgICAgICAgICAgfQorICAgICAgICBqYXZhLm5ldC5Qcm94eSBwcmVmUHJveHkgPSBnZXRQcm94eShjb250ZXh0LCB1cmwpOworICAgICAgICBpZiAocHJlZlByb3h5LmVxdWFscyhqYXZhLm5ldC5Qcm94eS5OT19QUk9YWSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSAoSW5ldFNvY2tldEFkZHJlc3MpcHJlZlByb3h5LmFkZHJlc3MoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhvc3Qoc2EuZ2V0SG9zdE5hbWUoKSwgc2EuZ2V0UG9ydCgpLCAiaHR0cCIpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc0xvY2FsSG9zdChTdHJpbmcgdXJsKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xvY2FsSG9zdChTdHJpbmcgdXJsKSB7CiAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKHVybCk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaG9zdCA9IHVyaS5nZXRIb3N0KCk7CkBAIC0xNzQsMjUgKzMxMSwxNzAgQEAKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlleCkgewogICAgICAgICAgICAgLy8gSWdub3JlIChVUkkuY3JlYXRlKQogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNOZXR3b3JrV2lmaShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworCisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICBTZXR0aW5nc09ic2VydmVyKENvbnRleHQgY3R4KSB7CisgICAgICAgICAgICBzdXBlcihuZXcgSGFuZGxlcihjdHguZ2V0TWFpbkxvb3BlcigpKSk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGN0eDsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIENvbm5lY3Rpdml0eU1hbmFnZXIgY29ubmVjdGl2aXR5ID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpCi0gICAgICAgICAgICBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7Ci0gICAgICAgIGlmIChjb25uZWN0aXZpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgTmV0d29ya0luZm8gaW5mbyA9IGNvbm5lY3Rpdml0eS5nZXRBY3RpdmVOZXR3b3JrSW5mbygpOwotICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBpbmZvLmdldFR5cGUoKSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChtQ29udGV4dCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCByZWdpc3RlckNvbnRlbnRPYnNlcnZlcnNSZWFkTG9ja2VkKENvbnRleHQgY3R4KSB7CisgICAgICAgIFVyaSB1cmlHbG9iYWxQcm94eSA9IFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOworICAgICAgICBVcmkgdXJpR2xvYmFsRXhjbExpc3QgPQorICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCk7CisKKyAgICAgICAgLy8gTm8gbG9jayB1cGdyYWRpbmcgKGZyb20gcmVhZCB0byB3cml0ZSkgYWxsb3dlZAorICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihjdHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRG93bmdyYWRpbmcgbG9ja3MgKGZyb20gd3JpdGUgdG8gcmVhZCkgaXMgYWxsb3dlZAorICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBjdHguZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIodXJpR2xvYmFsUHJveHksIGZhbHNlLAorICAgICAgICAgICAgICAgIHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlcik7CisgICAgICAgIGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcih1cmlHbG9iYWxFeGNsTGlzdCwgZmFsc2UsCisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChDb250ZXh0IGN0eCkgeworICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gY3R4LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBTdHJpbmcgcHJveHlIb3N0ID0gIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZKTsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHByb3h5SG9zdCkpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIHNpZ25hbAorICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHNHbG9iYWxQcm94eVNwZWMgPSBudWxsOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZXhjbHVzaW9uTGlzdFNwZWMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCk7CisgICAgICAgIFN0cmluZyBob3N0ID0gcGFyc2VIb3N0KHByb3h5SG9zdCk7CisgICAgICAgIGludCBwb3J0ID0gcGFyc2VQb3J0KHByb3h5SG9zdCk7CisgICAgICAgIFByb3h5U3BlYyB0bXBQcm94eVNwZWMgPSBudWxsOworICAgICAgICBpZiAocHJveHlIb3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRtcFByb3h5U3BlYyA9IG5ldyBQcm94eVNwZWMoKTsKKyAgICAgICAgICAgIHRtcFByb3h5U3BlYy5hZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpOworICAgICAgICAgICAgdG1wUHJveHlTcGVjLmV4Y2x1c2lvbkxpc3QgPSBwYXJzZUV4Y2x1c2lvbkxpc3QoZXhjbHVzaW9uTGlzdFNwZWMpOworICAgICAgICB9CisgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgc0dsb2JhbFByb3h5U3BlYyA9IHRtcFByb3h5U3BlYzsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHBhcnNlRXhjbHVzaW9uTGlzdChTdHJpbmcgZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBTdHJpbmdbXSBwcm9jZXNzZWRBcnJheSA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZXhjbHVzaW9uTGlzdCkpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGV4Y2x1c2lvbkxpc3RBcnJheSA9IGV4Y2x1c2lvbkxpc3QudG9Mb3dlckNhc2UoKS5zcGxpdCgiLCIpOworICAgICAgICAgICAgcHJvY2Vzc2VkQXJyYXkgPSBuZXcgU3RyaW5nW2V4Y2x1c2lvbkxpc3RBcnJheS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdXNpb25MaXN0QXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnkgPSBleGNsdXNpb25MaXN0QXJyYXlbaV0udHJpbSgpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCIuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb2Nlc3NlZEFycmF5W2ldID0gZW50cnk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBwcm9jZXNzZWRBcnJheTsKICAgICB9Ci19OworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgc3ludGF4IG9mIGhvc3RuYW1lLCBwb3J0IGFuZCBleGNsdXNpb24gbGlzdCBlbnRyaWVzCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShTdHJpbmcgaG9zdG5hbWUsIFN0cmluZyBwb3J0LCBTdHJpbmcgZXhjbExpc3QpIHsKKyAgICAgICAgTWF0Y2hlciBtYXRjaCA9IEhPU1ROQU1FX1BBVFRFUk4ubWF0Y2hlcihob3N0bmFtZSk7CisgICAgICAgIE1hdGNoZXIgbGlzdE1hdGNoID0gRVhDTExJU1RfUEFUVEVSTi5tYXRjaGVyKGV4Y2xMaXN0KTsKKworICAgICAgICBpZiAoIW1hdGNoLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsaXN0TWF0Y2gubWF0Y2hlcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaG9zdG5hbWUubGVuZ3RoKCkgPiAwICYmIHBvcnQubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoaG9zdG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwb3J0VmFsID0gLTE7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBvcnRWYWwgPSBJbnRlZ2VyLnBhcnNlSW50KHBvcnQpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcnRWYWwgPD0gMCB8fCBwb3J0VmFsID4gMHhGRkZGKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEFuZHJvaWRQcm94eVNlbGVjdG9yUm91dGVQbGFubmVyCisgICAgICAgICAgICBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uUHJveHlTZWxlY3RvclJvdXRlUGxhbm5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIHB1YmxpYyBBbmRyb2lkUHJveHlTZWxlY3RvclJvdXRlUGxhbm5lcihTY2hlbWVSZWdpc3RyeSBzY2hyZWcsIFByb3h5U2VsZWN0b3IgcHJvc2VsLAorICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoc2NocmVnLCBwcm9zZWwpOworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBqYXZhLm5ldC5Qcm94eSBjaG9vc2VQcm94eShMaXN0PGphdmEubmV0LlByb3h5PiBwcm94aWVzLCBIdHRwSG9zdCB0YXJnZXQsCisgICAgICAgICAgICAgICAgSHR0cFJlcXVlc3QgcmVxdWVzdCwgSHR0cENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFByb3h5KG1Db250ZXh0LCB0YXJnZXQuZ2V0SG9zdE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEh0dHBIb3N0IGRldGVybWluZVByb3h5KEh0dHBIb3N0IHRhcmdldCwgSHR0cFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICBIdHRwQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsIHRhcmdldC5nZXRIb3N0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSHR0cFJvdXRlIGRldGVybWluZVJvdXRlKEh0dHBIb3N0IHRhcmdldCwgSHR0cFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICBIdHRwQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBIdHRwSG9zdCBwcm94eSA9IGdldFByZWZlcnJlZEh0dHBIb3N0KG1Db250ZXh0LCB0YXJnZXQuZ2V0SG9zdE5hbWUoKSk7CisgICAgICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cFJvdXRlKHRhcmdldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cFJvdXRlKHRhcmdldCwgbnVsbCwgcHJveHksIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSHR0cFJvdXRlUGxhbm5lciBnZXRBbmRyb2lkUHJveHlTZWxlY3RvclJvdXRlUGxhbm5lcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgQW5kcm9pZFByb3h5U2VsZWN0b3JSb3V0ZVBsYW5uZXIgcmV0ID0gbmV3IEFuZHJvaWRQcm94eVNlbGVjdG9yUm91dGVQbGFubmVyKAorICAgICAgICAgICAgICAgIG5ldyBTY2hlbWVSZWdpc3RyeSgpLCBQcm94eVNlbGVjdG9yLmdldERlZmF1bHQoKSwgY29udGV4dCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5UHJvcGVydGllcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5UHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDBkODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHlQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGNvbnRhaW5lciBjbGFzcyBmb3IgdGhlIGh0dHAgcHJveHkgaW5mbworICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFByb3h5UHJvcGVydGllcyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgcHJpdmF0ZSBJbmV0U29ja2V0QWRkcmVzcyBtUHJveHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4Y2x1c2lvbkxpc3Q7CisKKyAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzKCkgeworICAgIH0KKworICAgIC8vIGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBjbG9uZQorICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXMoUHJveHlQcm9wZXJ0aWVzIHNvdXJjZSkgeworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcm94eSA9IHNvdXJjZS5nZXRTb2NrZXRBZGRyZXNzKCk7CisgICAgICAgICAgICBTdHJpbmcgZXhjbHVzaW9uTGlzdCA9IHNvdXJjZS5nZXRFeGNsdXNpb25MaXN0KCk7CisgICAgICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUV4Y2x1c2lvbkxpc3QgPSBuZXcgU3RyaW5nKGV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEluZXRTb2NrZXRBZGRyZXNzIGdldFNvY2tldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBtUHJveHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29ja2V0QWRkcmVzcyhJbmV0U29ja2V0QWRkcmVzcyBwcm94eSkgeworICAgICAgICBtUHJveHkgPSBwcm94eTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2x1c2lvbkxpc3QoKSB7CisgICAgICAgIHJldHVybiBtRXhjbHVzaW9uTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdXNpb25MaXN0KFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIG1FeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKG1Qcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQobVByb3h5LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKG1FeGNsdXNpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgeGw9IikuYXBwZW5kKG1FeGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBudWxsOworICAgICAgICBpZiAobVByb3h5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IG1Qcm94eS5nZXRBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBob3N0ID0gYWRkci5nZXRIb3N0QWRkcmVzcygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvZXMgbm90IHJlc29sdmUgd2hlbiBhZGRyIGlzIG51bGwgKi8KKyAgICAgICAgICAgICAgICAgICAgaG9zdCA9IG1Qcm94eS5nZXRIb3N0TmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTEpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhob3N0KTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobVByb3h5LmdldFBvcnQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkwKTsKKyAgICAgICAgfQorICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1FeGNsdXNpb25MaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDcmVhdG9yPFByb3h5UHJvcGVydGllcz4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBDcmVhdG9yPFByb3h5UHJvcGVydGllcz4oKSB7CisgICAgICAgICAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgUHJveHlQcm9wZXJ0aWVzIHByb3h5UHJvcGVydGllcyA9IG5ldyBQcm94eVByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW4ucmVhZEJ5dGUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlQcm9wZXJ0aWVzLnNldFNvY2tldEFkZHJlc3MoSW5ldFNvY2tldEFkZHJlc3MuY3JlYXRlVW5yZXNvbHZlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCwgcG9ydCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb3h5UHJvcGVydGllcy5zZXRFeGNsdXNpb25MaXN0KGluLnJlYWRTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5UHJvcGVydGllczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFByb3h5UHJvcGVydGllc1tdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm94eVByb3BlcnRpZXNbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVXJpLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVXJpLmphdmEKaW5kZXggNDdmYWFiYS4uM2IyMTU5MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9VcmkuamF2YQpAQCAtMjgsOCArMjgsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBJbW11dGFibGUgVVJJIHJlZmVyZW5jZS4gQSBVUkkgcmVmZXJlbmNlIGluY2x1ZGVzIGEgVVJJIGFuZCBhIGZyYWdtZW50LCB0aGUKQEAgLTQ3LDcgKzQ5LDcgQEAKICAgICAvKgogCiAgICAgVGhpcyBjbGFzcyBhaW1zIHRvIGRvIGFzIGxpdHRsZSB1cCBmcm9udCB3b3JrIGFzIHBvc3NpYmxlLiBUbyBhY2NvbXBsaXNoCi0gICAgdGhhdCwgd2UgdmFyeSB0aGUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW5kaW5nIG9uIHdoYXQgdGhlIHVzZXIgcGFzc2VzIGluLgorICAgIHRoYXQsIHdlIHZhcnkgdGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGluZyBvbiB3aGF0IHRoZSB1c2VyIHBhc3NlcyBpbi4KICAgICBGb3IgZXhhbXBsZSwgd2UgaGF2ZSBvbmUgaW1wbGVtZW50YXRpb24gaWYgdGhlIHVzZXIgcGFzc2VzIGluIGEKICAgICBVUkkgc3RyaW5nIChTdHJpbmdVcmkpIGFuZCBhbm90aGVyIGlmIHRoZSB1c2VyIHBhc3NlcyBpbiB0aGUKICAgICBpbmRpdmlkdWFsIGNvbXBvbmVudHMgKE9wYXF1ZVVyaSkuCkBAIC0xMjUzLDE0ICsxMjU1LDE2IEBACiAgICAgICogY29uY3VycmVudCB1c2UuCiAgICAgICoKICAgICAgKiA8cD5BbiBhYnNvbHV0ZSBoaWVyYXJjaGljYWwgVVJJIHJlZmVyZW5jZSBmb2xsb3dzIHRoZSBwYXR0ZXJuOgotICAgICAqIHtAY29kZSAmbHQ7c2NoZW1lJmd0OzovLyZsdDthdXRob3JpdHkmZ3Q7Jmx0O2Fic29sdXRlIHBhdGgmZ3Q7PyZsdDtxdWVyeSZndDsjJmx0O2ZyYWdtZW50Jmd0O30KKyAgICAgKiB7QGNvZGUgPHNjaGVtZT46Ly88YXV0aG9yaXR5PjxhYnNvbHV0ZSBwYXRoPj88cXVlcnk+IzxmcmFnbWVudD59CiAgICAgICoKICAgICAgKiA8cD5SZWxhdGl2ZSBVUkkgcmVmZXJlbmNlcyAod2hpY2ggYXJlIGFsd2F5cyBoaWVyYXJjaGljYWwpIGZvbGxvdyBvbmUKLSAgICAgKiBvZiB0d28gcGF0dGVybnM6IHtAY29kZSAmbHQ7cmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCZndDs/Jmx0O3F1ZXJ5Jmd0OyMmbHQ7ZnJhZ21lbnQmZ3Q7fQotICAgICAqIG9yIHtAY29kZSAvLyZsdDthdXRob3JpdHkmZ3Q7Jmx0O2Fic29sdXRlIHBhdGgmZ3Q7PyZsdDtxdWVyeSZndDsjJmx0O2ZyYWdtZW50Jmd0O30KKyAgICAgKiBvZiB0d28gcGF0dGVybnM6IHtAY29kZSA8cmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aD4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+fQorICAgICAqIG9yIHtAY29kZSAvLzxhdXRob3JpdHk+PGFic29sdXRlIHBhdGg+PzxxdWVyeT4jPGZyYWdtZW50Pn0KICAgICAgKgogICAgICAqIDxwPkFuIG9wYXF1ZSBVUkkgZm9sbG93cyB0aGlzIHBhdHRlcm46Ci0gICAgICoge0Bjb2RlICZsdDtzY2hlbWUmZ3Q7OiZsdDtvcGFxdWUgcGFydCZndDsjJmx0O2ZyYWdtZW50Jmd0O30KKyAgICAgKiB7QGNvZGUgPHNjaGVtZT46PG9wYXF1ZSBwYXJ0PiM8ZnJhZ21lbnQ+fQorICAgICAqIAorICAgICAqIDxwPlVzZSB7QGxpbmsgVXJpI2J1aWxkVXBvbigpfSB0byBvYnRhaW4gYSBidWlsZGVyIHJlcHJlc2VudGluZyBhbiBleGlzdGluZyBVUkkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKIApAQCAtMTQ0Nyw2ICsxNDUxLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogQ2xlYXJzIHRoZSB0aGUgcHJldmlvdXNseSBzZXQgcXVlcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBjbGVhclF1ZXJ5KCkgeworICAgICAgICAgIHJldHVybiBxdWVyeSgoUGFydCkgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogQ29uc3RydWN0cyBhIFVyaSB3aXRoIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMuCiAgICAgICAgICAqCiAgICAgICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIFVSSSBpcyBvcGFxdWUgYW5kIHRoZQpAQCAtMTQ5MSwxOSArMTUwMiw2MCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgb2YgdGhlIHVuaXF1ZSBuYW1lcyBvZiBhbGwgcXVlcnkgcGFyYW1ldGVycy4gSXRlcmF0aW5nCisgICAgICogb3ZlciB0aGUgc2V0IHdpbGwgcmV0dXJuIHRoZSBuYW1lcyBpbiBvcmRlciBvZiB0aGVpciBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAqCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIGlzbid0IGEgaGllcmFyY2hpY2FsIFVSSQorICAgICAqCisgICAgICogQHJldHVybiBhIHNldCBvZiBkZWNvZGVkIG5hbWVzCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgIGlmIChpc09wYXF1ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTk9UX0hJRVJBUkNISUNBTCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcXVlcnkgPSBnZXRFbmNvZGVkUXVlcnkoKTsKKyAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICB9CisKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBuZXh0ID0gcXVlcnkuaW5kZXhPZignJicsIHN0YXJ0KTsKKyAgICAgICAgICAgIGludCBlbmQgPSAobmV4dCA9PSAtMSkgPyBxdWVyeS5sZW5ndGgoKSA6IG5leHQ7CisKKyAgICAgICAgICAgIGludCBzZXBhcmF0b3IgPSBxdWVyeS5pbmRleE9mKCc9Jywgc3RhcnQpOworICAgICAgICAgICAgaWYgKHNlcGFyYXRvciA+IGVuZCB8fCBzZXBhcmF0b3IgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBlbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcXVlcnkuc3Vic3RyaW5nKHN0YXJ0LCBzZXBhcmF0b3IpOworICAgICAgICAgICAgbmFtZXMuYWRkKGRlY29kZShuYW1lKSk7CisKKyAgICAgICAgICAgIC8vIE1vdmUgc3RhcnQgdG8gZW5kIG9mIG5hbWUuCisgICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7CisgICAgICAgIH0gd2hpbGUgKHN0YXJ0IDwgcXVlcnkubGVuZ3RoKCkpOworCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmFtZXMpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNlYXJjaGVzIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHBhcmFtZXRlciB2YWx1ZXMgd2l0aCB0aGUgZ2l2ZW4ga2V5LgogICAgICAqCiAgICAgICogQHBhcmFtIGtleSB3aGljaCB3aWxsIGJlIGVuY29kZWQKICAgICAgKgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBpc24ndCBhIGhpZXJhcmNoaWNhbCBVUkkKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGtleSBpcyBudWxsCi0gICAgICoKICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkZWNvZGVkIHZhbHVlcwogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UXVlcnlQYXJhbWV0ZXJzKFN0cmluZyBrZXkpIHsKICAgICAgICAgaWYgKGlzT3BhcXVlKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihOT1RfSElFUkFSQ0hJQ0FMKTsKICAgICAgICAgfQorICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImtleSIpOworICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZ2V0RW5jb2RlZFF1ZXJ5KCk7CiAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CkBAIC0xNTE3LDM5ICsxNTY5LDM0IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBQcmVwZW5kIHF1ZXJ5IHdpdGggIiYiIG1ha2luZyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRoZSBzYW1lIGFzIHRoZQotICAgICAgICAvLyByZXN0LgotICAgICAgICBxdWVyeSA9ICImIiArIHF1ZXJ5OwotCi0gICAgICAgIC8vIFBhcmFtZXRlciBwcmVmaXguCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiJiIgKyBlbmNvZGVkS2V5ICsgIj0iOwotCiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogCiAgICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGludCBsZW5ndGggPSBxdWVyeS5sZW5ndGgoKTsKLSAgICAgICAgd2hpbGUgKHN0YXJ0IDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICBzdGFydCA9IHF1ZXJ5LmluZGV4T2YocHJlZml4LCBzdGFydCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBuZXh0QW1wZXJzYW5kID0gcXVlcnkuaW5kZXhPZignJicsIHN0YXJ0KTsKKyAgICAgICAgICAgIGludCBlbmQgPSBuZXh0QW1wZXJzYW5kICE9IC0xID8gbmV4dEFtcGVyc2FuZCA6IHF1ZXJ5Lmxlbmd0aCgpOwogCi0gICAgICAgICAgICBpZiAoc3RhcnQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBtb3JlIHZhbHVlcy4KKyAgICAgICAgICAgIGludCBzZXBhcmF0b3IgPSBxdWVyeS5pbmRleE9mKCc9Jywgc3RhcnQpOworICAgICAgICAgICAgaWYgKHNlcGFyYXRvciA+IGVuZCB8fCBzZXBhcmF0b3IgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBlbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgLSBzdGFydCA9PSBlbmNvZGVkS2V5Lmxlbmd0aCgpCisgICAgICAgICAgICAgICAgICAgICYmIHF1ZXJ5LnJlZ2lvbk1hdGNoZXMoc3RhcnQsIGVuY29kZWRLZXksIDAsIGVuY29kZWRLZXkubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlcGFyYXRvciA9PSBlbmQpIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKGRlY29kZShxdWVyeS5zdWJzdHJpbmcoc2VwYXJhdG9yICsgMSwgZW5kKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW92ZSBzdGFydCB0byBlbmQgb2YgbmFtZS4KKyAgICAgICAgICAgIGlmIChuZXh0QW1wZXJzYW5kICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBuZXh0QW1wZXJzYW5kICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE1vdmUgc3RhcnQgdG8gc3RhcnQgb2YgdmFsdWUuCi0gICAgICAgICAgICBzdGFydCArPSBwcmVmaXgubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIC8vIEZpbmQgZW5kIG9mIHZhbHVlLgotICAgICAgICAgICAgaW50IGVuZCA9IHF1ZXJ5LmluZGV4T2YoJyYnLCBzdGFydCk7Ci0gICAgICAgICAgICBpZiAoZW5kID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZW5kID0gcXVlcnkubGVuZ3RoKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHF1ZXJ5LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICAgICAgICAgIHZhbHVlcy5hZGQoZGVjb2RlKHZhbHVlKSk7Ci0KLSAgICAgICAgICAgIHN0YXJ0ID0gZW5kOwotICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHZhbHVlcyk7CiAgICAgfQpAQCAtMTU2MCw3ICsxNjA3LDYgQEAKICAgICAgKiBAcGFyYW0ga2V5IHdoaWNoIHdpbGwgYmUgZW5jb2RlZAogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBpc24ndCBhIGhpZXJhcmNoaWNhbCBVUkkKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGtleSBpcyBudWxsCi0gICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHZhbHVlIG9yIG51bGwgaWYgbm8gcGFyYW1ldGVyIGlzIGZvdW5kCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtZXRlcihTdHJpbmcga2V5KSB7CkBAIC0xNTY4LDcgKzE2MTQsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE5PVF9ISUVSQVJDSElDQUwpOwogICAgICAgICB9CiAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigia2V5Iik7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImtleSIpOwogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgU3RyaW5nIHF1ZXJ5ID0gZ2V0RW5jb2RlZFF1ZXJ5KCk7CkBAIC0xNTc3LDM3ICsxNjIzLDU0IEBACiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEtleSA9IGVuY29kZShrZXksIG51bGwpOwotICAgICAgICBmaW5hbCBpbnQgZW5jb2RlZEtleUxlbmd0aCA9IGVuY29kZWRLZXkubGVuZ3RoKCk7CisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBxdWVyeS5sZW5ndGgoKTsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IG5leHRBbXBlcnNhbmQgPSBxdWVyeS5pbmRleE9mKCcmJywgc3RhcnQpOworICAgICAgICAgICAgaW50IGVuZCA9IG5leHRBbXBlcnNhbmQgIT0gLTEgPyBuZXh0QW1wZXJzYW5kIDogbGVuZ3RoOwogCi0gICAgICAgIGludCBlbmNvZGVkS2V5U2VhcmNoSW5kZXggPSAwOwotICAgICAgICBmaW5hbCBpbnQgZW5jb2RlZEtleVNlYXJjaEVuZCA9IHF1ZXJ5Lmxlbmd0aCgpIC0gKGVuY29kZWRLZXlMZW5ndGggKyAxKTsKKyAgICAgICAgICAgIGludCBzZXBhcmF0b3IgPSBxdWVyeS5pbmRleE9mKCc9Jywgc3RhcnQpOworICAgICAgICAgICAgaWYgKHNlcGFyYXRvciA+IGVuZCB8fCBzZXBhcmF0b3IgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBlbmQ7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgd2hpbGUgKGVuY29kZWRLZXlTZWFyY2hJbmRleCA8PSBlbmNvZGVkS2V5U2VhcmNoRW5kKSB7Ci0gICAgICAgICAgICBpbnQga2V5SW5kZXggPSBxdWVyeS5pbmRleE9mKGVuY29kZWRLZXksIGVuY29kZWRLZXlTZWFyY2hJbmRleCk7Ci0gICAgICAgICAgICBpZiAoa2V5SW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBlcXVhbHNJbmRleCA9IGtleUluZGV4ICsgZW5jb2RlZEtleUxlbmd0aDsKLSAgICAgICAgICAgIGlmIChlcXVhbHNJbmRleCA+PSBxdWVyeS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHF1ZXJ5LmNoYXJBdChlcXVhbHNJbmRleCkgIT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEtleVNlYXJjaEluZGV4ID0gZXF1YWxzSW5kZXggKyAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleUluZGV4ID09IDAgfHwgcXVlcnkuY2hhckF0KGtleUluZGV4IC0gMSkgPT0gJyYnKSB7Ci0gICAgICAgICAgICAgICAgaW50IGVuZCA9IHF1ZXJ5LmluZGV4T2YoJyYnLCBlcXVhbHNJbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBlbmQgPSBxdWVyeS5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgLSBzdGFydCA9PSBlbmNvZGVkS2V5Lmxlbmd0aCgpCisgICAgICAgICAgICAgICAgICAgICYmIHF1ZXJ5LnJlZ2lvbk1hdGNoZXMoc3RhcnQsIGVuY29kZWRLZXksIDAsIGVuY29kZWRLZXkubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlcGFyYXRvciA9PSBlbmQpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZShxdWVyeS5zdWJzdHJpbmcoc2VwYXJhdG9yICsgMSwgZW5kKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGUocXVlcnkuc3Vic3RyaW5nKGVxdWFsc0luZGV4ICsgMSwgZW5kKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRLZXlTZWFyY2hJbmRleCA9IGVxdWFsc0luZGV4ICsgMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNb3ZlIHN0YXJ0IHRvIGVuZCBvZiBuYW1lLgorICAgICAgICAgICAgaWYgKG5leHRBbXBlcnNhbmQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IG5leHRBbXBlcnNhbmQgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNlYXJjaGVzIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoZSBmaXJzdCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIGludGVycHJldHMgaXQKKyAgICAgKiBhcyBhIGJvb2xlYW4gdmFsdWUuICJmYWxzZSIgYW5kICIwIiBhcmUgaW50ZXJwcmV0ZWQgYXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBldmVyeXRoaW5nCisgICAgICogZWxzZSBpcyBpbnRlcnByZXRlZCBhcyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgd2hpY2ggd2lsbCBiZSBkZWNvZGVkCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlcmUgaXMgbm8gcXVlcnkgcGFyYW1ldGVyIGZvciBrZXkKKyAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuIGludGVycHJldGF0aW9uIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIga2V5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblF1ZXJ5UGFyYW1ldGVyKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIFN0cmluZyBmbGFnID0gZ2V0UXVlcnlQYXJhbWV0ZXIoa2V5KTsKKyAgICAgICAgaWYgKGZsYWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBmbGFnID0gZmxhZy50b0xvd2VyQ2FzZSgpOworICAgICAgICByZXR1cm4gKCEiZmFsc2UiLmVxdWFscyhmbGFnKSAmJiAhIjAiLmVxdWFscyhmbGFnKSk7CisgICAgfQorCiAgICAgLyoqIElkZW50aWZpZXMgYSBudWxsIHBhcmNlbGxlZCBVcmkuICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTExfVFlQRV9JRCA9IDA7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9XZWJBZGRyZXNzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvV2ViQWRkcmVzcy5qYXZhCmluZGV4IDQxMDFhYjQuLjljNGQ2ZTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9XZWJBZGRyZXNzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3MuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICAgIHN0YXRpYyBQYXR0ZXJuIHNBZGRyZXNzUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKICAgICAgICAgICAgIC8qIHNjaGVtZSAgICAqLyAiKD86KGh0dHB8aHR0cHN8ZmlsZSlcXDpcXC9cXC8pPyIgKwogICAgICAgICAgICAgLyogYXV0aG9yaXR5ICovICIoPzooWy1BLVphLXowLTkkXy4rISonKCksOz8mPV0rKD86XFw6Wy1BLVphLXowLTkkXy4rISonKCksOz8mPV0rKT8pQCk/IiArCi0gICAgICAgICAgICAvKiBob3N0ICAgICAgKi8gIihbLSIgKyBHT09EX0lSSV9DSEFSICsgIiVfXSsoPzpcXC5bLSIgKyBHT09EX0lSSV9DSEFSICsgIiVfXSspKnxcXFtbMC05YS1mQS1GOlxcLl0rXFxdKT8iICsKKyAgICAgICAgICAgIC8qIGhvc3QgICAgICAqLyAiKFsiICsgR09PRF9JUklfQ0hBUiArICIlXy1dWyIgKyBHT09EX0lSSV9DSEFSICsgIiVfXFwuLV0qfFxcW1swLTlhLWZBLUY6XFwuXStcXF0pPyIgKwogICAgICAgICAgICAgLyogcG9ydCAgICAgICovICIoPzpcXDooWzAtOV0qKSk/IiArCiAgICAgICAgICAgICAvKiBwYXRoICAgICAgKi8gIihcXC8/W14jXSopPyIgKwogICAgICAgICAgICAgLyogYW5jaG9yICAgICovICIuKiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQppbmRleCBlMDdlZTU5Li45MTVlMzQyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5TU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuU1NMU2Vzc2lvbkNhY2hlOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCkBAIC04MSw2ICs4MiwxMSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBbmRyb2lkSHR0cENsaWVudCI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXh0Q29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJ0ZXh0LyIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIgorICAgIH07CiAKICAgICAvKiogSW50ZXJjZXB0b3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhlY3V0aW5nIHRocmVhZCBpcyBibG9ja2VkICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSHR0cFJlcXVlc3RJbnRlcmNlcHRvciBzVGhyZWFkQ2hlY2tJbnRlcmNlcHRvciA9CkBAIC0zNTgsNyArMzY0LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAobGV2ZWwgPCBMb2cuVkVSQk9TRSB8fCBsZXZlbCA+IExvZy5BU1NFUlQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxldmVsIGlzIG91dCBvZiByYW5nZSBbIgotICAgICAgICAgICAgICAgICsgTG9nLlZFUkJPU0UgKyAiLi4iICsgTG9nLkFTU0VSVCArICJdIik7ICAgIAorICAgICAgICAgICAgICAgICsgTG9nLlZFUkJPU0UgKyAiLi4iICsgTG9nLkFTU0VSVCArICJdIik7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJsQ29uZmlndXJhdGlvbiA9IG5ldyBMb2dnaW5nQ29uZmlndXJhdGlvbihuYW1lLCBsZXZlbCk7CkBAIC00MzEsMTIgKzQzNywxNyBAQAogICAgICAgICAgICAgICAgIGlmIChlbnRpdHkuZ2V0Q29udGVudExlbmd0aCgpIDwgMTAyNCkgewogICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgICBlbnRpdHkud3JpdGVUbyhzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5U3RyaW5nID0gc3RyZWFtLnRvU3RyaW5nKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgdGhlIGNvbnRlbnQgdHlwZSwgdG9vLgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1hc2NpaSBcIiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChlbnRpdHlTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmluYXJ5Q29udGVudChyZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJhc2U2NCA9IEJhc2U2NC5lbmNvZGVUb1N0cmluZyhzdHJlYW0udG9CeXRlQXJyYXkoKSwgQmFzZTY0Lk5PX1dSQVApOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5pbnNlcnQoMCwgImVjaG8gJyIgKyBiYXNlNjQgKyAiJyB8IGJhc2U2NCAtZCA+IC90bXAvJCQuYmluOyAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgLS1kYXRhLWJpbmFyeSBAL3RtcC8kJC5iaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbnRpdHlTdHJpbmcgPSBzdHJlYW0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgLS1kYXRhLWFzY2lpIFwiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChlbnRpdHlTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIFtUT08gTVVDSCBEQVRBIFRPIElOQ0xVREVdIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDQ2LDYgKzQ1NywzMCBAQAogICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCaW5hcnlDb250ZW50KEh0dHBVcmlSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgSGVhZGVyW10gaGVhZGVyczsKKyAgICAgICAgaGVhZGVycyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpOworICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEhlYWRlciBoZWFkZXIgOiBoZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKCJnemlwIi5lcXVhbHNJZ25vcmVDYXNlKGhlYWRlci5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBoZWFkZXJzID0gcmVxdWVzdC5nZXRIZWFkZXJzKEhlYWRlcnMuQ09OVEVOVF9UWVBFKTsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIZWFkZXIgaGVhZGVyIDogaGVhZGVycykgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvbnRlbnRUeXBlIDogdGV4dENvbnRlbnRUeXBlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLmdldFZhbHVlKCkuc3RhcnRzV2l0aChjb250ZW50VHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkYXRlIG9mIHRoZSBnaXZlbiBIVFRQIGRhdGUgc3RyaW5nLiBUaGlzIG1ldGhvZCBjYW4gaWRlbnRpZnkKICAgICAgKiBhbmQgcGFyc2UgdGhlIGRhdGUgZm9ybWF0cyBlbWl0dGVkIGJ5IGNvbW1vbiBIVFRQIHNlcnZlcnMsIHN1Y2ggYXMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQppbmRleCA0Y2E1OTAzLi41MDNjNDcwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCkBAIC04MCwxNCArODAsMTAgQEAKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZVtdIHNlcnZlckNlcnRpZmljYXRlcyA9IG51bGw7CiAKLSAgICAgICAgLy8gc3RhcnQgaGFuZHNoYWtlLCBjbG9zZSB0aGUgc29ja2V0IGlmIHdlIGZhaWwKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNzbFNvY2tldC5zZXRVc2VDbGllbnRNb2RlKHRydWUpOwotICAgICAgICAgICAgc3NsU29ja2V0LnN0YXJ0SGFuZHNoYWtlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGNsb3NlU29ja2V0VGhyb3dFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgc3NsU29ja2V0LCBlLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHBlcmZvcm0gU1NMIGhhbmRzaGFrZSIpOworICAgICAgICAvLyBnZXQgYSB2YWxpZCBTU0xTZXNzaW9uLCBjbG9zZSB0aGUgc29ja2V0IGlmIHdlIGZhaWwKKyAgICAgICAgU1NMU2Vzc2lvbiBzc2xTZXNzaW9uID0gc3NsU2Vzc2lvbiA9IHNzbFNvY2tldC5nZXRTZXNzaW9uKCk7CisgICAgICAgIGlmICghc3NsU2Vzc2lvbi5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGNsb3NlU29ja2V0VGhyb3dFeGNlcHRpb24oc3NsU29ja2V0LCAiZmFpbGVkIHRvIHBlcmZvcm0gU1NMIGhhbmRzaGFrZSIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gcmV0cmlldmUgdGhlIGNoYWluIG9mIHRoZSBzZXJ2ZXIgcGVlciBjZXJ0aWZpY2F0ZXMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEKaW5kZXggNWZiMWQ3Yy4uZjAzMDlkNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEKQEAgLTE2LDE2ICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQub3M7CiAKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogLyoqCkBAIC0zNiw4ICszNiw4IEBACiAgKiA8cD5BbiBhc3luY2hyb25vdXMgdGFzayBpcyBkZWZpbmVkIGJ5IGEgY29tcHV0YXRpb24gdGhhdCBydW5zIG9uIGEgYmFja2dyb3VuZCB0aHJlYWQgYW5kCiAgKiB3aG9zZSByZXN1bHQgaXMgcHVibGlzaGVkIG9uIHRoZSBVSSB0aHJlYWQuIEFuIGFzeW5jaHJvbm91cyB0YXNrIGlzIGRlZmluZWQgYnkgMyBnZW5lcmljCiAgKiB0eXBlcywgY2FsbGVkIDxjb2RlPlBhcmFtczwvY29kZT4sIDxjb2RlPlByb2dyZXNzPC9jb2RlPiBhbmQgPGNvZGU+UmVzdWx0PC9jb2RlPiwKLSAqIGFuZCA0IHN0ZXBzLCBjYWxsZWQgPGNvZGU+YmVnaW48L2NvZGU+LCA8Y29kZT5kb0luQmFja2dyb3VuZDwvY29kZT4sCi0gKiA8Y29kZT5wcm9jZXNzUHJvZ3Jlc3M8L2NvZGU+IGFuZCA8Y29kZT5lbmQ8L2NvZGU+LjwvcD4KKyAqIGFuZCA0IHN0ZXBzLCBjYWxsZWQgPGNvZGU+b25QcmVFeGVjdXRlPC9jb2RlPiwgPGNvZGU+ZG9JbkJhY2tncm91bmQ8L2NvZGU+LAorICogPGNvZGU+b25Qcm9ncmVzc1VwZGF0ZTwvY29kZT4gYW5kIDxjb2RlPm9uUG9zdEV4ZWN1dGU8L2NvZGU+LjwvcD4KICAqCiAgKiA8aDI+VXNhZ2U8L2gyPgogICogPHA+QXN5bmNUYXNrIG11c3QgYmUgc3ViY2xhc3NlZCB0byBiZSB1c2VkLiBUaGUgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSBhdCBsZWFzdApAQCAtMTIzLDYgKzEyMywxNiBAQAogICogICAgIDxsaT5UaGUgdGFzayBjYW4gYmUgZXhlY3V0ZWQgb25seSBvbmNlIChhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYKICAqICAgICBhIHNlY29uZCBleGVjdXRpb24gaXMgYXR0ZW1wdGVkLik8L2xpPgogICogPC91bD4KKyAqCisgKiA8aDI+TWVtb3J5IG9ic2VydmFiaWxpdHk8L2gyPgorICogPHA+QXN5bmNUYXNrIGd1YXJhbnRlZXMgdGhhdCBhbGwgY2FsbGJhY2sgY2FsbHMgYXJlIHN5bmNocm9uaXplZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIGZvbGxvd2luZworICogb3BlcmF0aW9ucyBhcmUgc2FmZSB3aXRob3V0IGV4cGxpY2l0IHN5bmNocm9uaXphdGlvbnMuPC9wPgorICogPHVsPgorICogICAgIDxsaT5TZXQgbWVtYmVyIGZpZWxkcyBpbiB0aGUgY29uc3RydWN0b3Igb3Ige0BsaW5rICNvblByZUV4ZWN1dGV9LCBhbmQgcmVmZXIgdG8gdGhlbQorICogICAgIGluIHtAbGluayAjZG9JbkJhY2tncm91bmR9LgorICogICAgIDxsaT5TZXQgbWVtYmVyIGZpZWxkcyBpbiB7QGxpbmsgI2RvSW5CYWNrZ3JvdW5kfSwgYW5kIHJlZmVyIHRvIHRoZW0gaW4KKyAqICAgICB7QGxpbmsgI29uUHJvZ3Jlc3NVcGRhdGV9IGFuZCB7QGxpbmsgI29uUG9zdEV4ZWN1dGV9LgorICogPC91bD4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFzeW5jVGFzazxQYXJhbXMsIFByb2dyZXNzLCBSZXN1bHQ+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBc3luY1Rhc2siOwpAQCAtMTc1LDYgKzE4NSwxMSBAQAogICAgICAgICBGSU5JU0hFRCwKICAgICB9CiAKKyAgICAvKiogQGhpZGUgVXNlZCB0byBmb3JjZSBzdGF0aWMgaGFuZGxlciB0byBiZSBjcmVhdGVkLiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgeworICAgICAgICBzSGFuZGxlci5nZXRMb29wZXIoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IGFzeW5jaHJvbm91cyB0YXNrLiBUaGlzIGNvbnN0cnVjdG9yIG11c3QgYmUgaW52b2tlZCBvbiB0aGUgVUkgdGhyZWFkLgogICAgICAqLwpAQCAtMTg3LDYgKzIwMiwxNyBAQAogICAgICAgICB9OwogCiAgICAgICAgIG1GdXR1cmUgPSBuZXcgRnV0dXJlVGFzazxSZXN1bHQ+KG1Xb3JrZXIpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXQoUmVzdWx0IHYpIHsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXQodik7CisgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gc0hhbmRsZXIub2J0YWluTWVzc2FnZShNRVNTQUdFX1BPU1RfQ0FOQ0VMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY1Rhc2tSZXN1bHQ8UmVzdWx0PihBc3luY1Rhc2sudGhpcywgKFJlc3VsdFtdKSBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvbmUoKSB7CiAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlOwpAQCAtNDAyLDE0ICs0MjgsMTkgQEAKICAgICAgKiBzdGlsbCBydW5uaW5nLiBFYWNoIGNhbGwgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBleGVjdXRpb24gb2YKICAgICAgKiB7QGxpbmsgI29uUHJvZ3Jlc3NVcGRhdGV9IG9uIHRoZSBVSSB0aHJlYWQuCiAgICAgICoKKyAgICAgKiB7QGxpbmsgI29uUHJvZ3Jlc3NVcGRhdGV9IHdpbGwgbm90ZSBiZSBjYWxsZWQgaWYgdGhlIHRhc2sgaGFzIGJlZW4KKyAgICAgKiBjYW5jZWxlZC4KKyAgICAgKgogICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHByb2dyZXNzIHZhbHVlcyB0byB1cGRhdGUgdGhlIFVJIHdpdGguCiAgICAgICoKICAgICAgKiBAc2VlICNvblByb2dyZXNzVXBkYXRlCiAgICAgICogQHNlZSAjZG9JbkJhY2tncm91bmQKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwdWJsaXNoUHJvZ3Jlc3MoUHJvZ3Jlc3MuLi4gdmFsdWVzKSB7Ci0gICAgICAgIHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX1BST0dSRVNTLAotICAgICAgICAgICAgICAgIG5ldyBBc3luY1Rhc2tSZXN1bHQ8UHJvZ3Jlc3M+KHRoaXMsIHZhbHVlcykpLnNlbmRUb1RhcmdldCgpOworICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgIHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX1BST0dSRVNTLAorICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFByb2dyZXNzPih0aGlzLCB2YWx1ZXMpKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBmaW5pc2goUmVzdWx0IHJlc3VsdCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQmF0dGVyeU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0JhdHRlcnlNYW5hZ2VyLmphdmEKaW5kZXggNDRiNzNjNS4uNWZkMjI0NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQmF0dGVyeU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CYXR0ZXJ5TWFuYWdlci5qYXZhCkBAIC04NCw3ICs4NCwxNSBAQAogICAgICAqIFN0cmluZyBkZXNjcmliaW5nIHRoZSB0ZWNobm9sb2d5IG9mIHRoZSBjdXJyZW50IGJhdHRlcnkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVDSE5PTE9HWSA9ICJ0ZWNobm9sb2d5IjsKLSAgICAKKworICAgIC8qKgorICAgICAqIEV4dHJhIGZvciB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNBQ1RJT05fQkFUVEVSWV9DSEFOR0VEfToKKyAgICAgKiBCb29sZWFuIHZhbHVlIHNldCB0byB0cnVlIGlmIGFuIHVuc3VwcG9ydGVkIGNoYXJnZXIgaXMgYXR0YWNoZWQKKyAgICAgKiB0byB0aGUgZGV2aWNlLgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JTlZBTElEX0NIQVJHRVIgPSAiaW52YWxpZF9jaGFyZ2VyIjsKKwogICAgIC8vIHZhbHVlcyBmb3IgInN0YXR1cyIgZmllbGQgaW4gdGhlIEFDVElPTl9CQVRURVJZX0NIQU5HRUQgSW50ZW50CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9TVEFUVVNfVU5LTk9XTiA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9TVEFUVVNfQ0hBUkdJTkcgPSAyOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKaW5kZXggODkyNWJkMC4uOTI2OGNkMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCkBAIC0xOTksNiArMTk5LDE4IEBACiAgICAgICAgICAqIDwvdWw+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHSU5HRVJCUkVBRCA9IENVUl9ERVZFTE9QTUVOVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogTmV4dCBuZXh0IHZlcnNpb24gb2YgQW5kcm9pZC4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+QXBwbGljYXRpb25zIHRhcmdldGluZyB0aGlzIG9yIGEgbGF0ZXIgcmVsZWFzZSB3aWxsIGdldCB0aGVzZQorICAgICAgICAgKiBuZXcgY2hhbmdlcyBpbiBiZWhhdmlvcjo8L3A+CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPiBUaGUgZGVmYXVsdCB0aGVtZSBmb3IgYXBwbGljYXRpb25zIGlzIG5vdyBkYXJrIGhvbG9ncmFwaGljOgorICAgICAgICAgKiAgICAgIHtAbGluayBhbmRyb2lkLlIuc3R5bGUjVGhlbWVfSG9sb30uCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT05FWUNPTUIgPSBDVVJfREVWRUxPUE1FTlQ7CiAgICAgfQogICAgIAogICAgIC8qKiBUaGUgdHlwZSBvZiBidWlsZCwgbGlrZSAidXNlciIgb3IgImVuZyIuICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQppbmRleCA4NmY5YTZiLi4yYjRmMzlhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKQEAgLTczMSw3ICs3MzEsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIER1bXAgImhwcm9mIiBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgd2lsbCBjYXVzZSBhIEdDLgorICAgICAqIER1bXAgImhwcm9mIiBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgbWF5IGNhdXNlIGEgR0MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUgRnVsbCBwYXRobmFtZSBvZiBvdXRwdXQgZmlsZSAoZS5nLiAiL3NkY2FyZC9kdW1wLmhwcm9mIikuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgVk0gd2FzIGJ1aWx0IHdpdGhvdXQKQEAgLTc0MywxMSArNzQzLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29sbGVjdCAiaHByb2YiIGFuZCBzZW5kIGl0IHRvIERETVMuICBUaGlzIHdpbGwgY2F1c2UgYSBHQy4KKyAgICAgKiBMaWtlIGR1bXBIcHJvZkRhdGEoU3RyaW5nKSwgYnV0IHRha2VzIGFuIGFscmVhZHktb3BlbmVkCisgICAgICogRmlsZURlc2NyaXB0b3IgdG8gd2hpY2ggdGhlIHRyYWNlIGlzIHdyaXR0ZW4uICBUaGUgZmlsZSBuYW1lIGlzIGFsc28KKyAgICAgKiBzdXBwbGllZCBzaW1wbHkgZm9yIGxvZ2dpbmcuICBNYWtlcyBhIGR1cCBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogUHJpbWFyaWx5IGZvciB1c2UgYnkgdGhlICJhbSIgc2hlbGwgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBIcHJvZkRhdGEoU3RyaW5nIGZpbGVOYW1lLCBGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFZNRGVidWcuZHVtcEhwcm9mRGF0YShmaWxlTmFtZSwgZmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3QgImhwcm9mIiBhbmQgc2VuZCBpdCB0byBERE1TLiAgVGhpcyBtYXkgY2F1c2UgYSBHQy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIFZNIHdhcyBidWlsdCB3aXRob3V0CiAgICAgICogICAgICAgICBIUFJPRiBzdXBwb3J0LgotICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcEhwcm9mRGF0YURkbXMoKSB7CkBAIC03NTUsNiArNzY4LDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogV3JpdGVzIG5hdGl2ZSBoZWFwIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZHVtcE5hdGl2ZUhlYXAoRmlsZURlc2NyaXB0b3IgZmQpOworCisgICAgLyoqCisgICAgICAqIFJldHVybnMgYSBjb3VudCBvZiB0aGUgZXh0YW50IGluc3RhbmNlcyBvZiBhIGNsYXNzLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgY291bnRJbnN0YW5jZXNPZkNsYXNzKENsYXNzIGNscykgeworICAgICAgICByZXR1cm4gVk1EZWJ1Zy5jb3VudEluc3RhbmNlc09mQ2xhc3MoY2xzKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2VudCB0cmFuc2FjdGlvbnMgZnJvbSB0aGlzIHByb2Nlc3MuCiAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHNlbnQgdHJhbnNhY3Rpb25zIG9yIC0xIGlmIGl0IGNvdWxkIG5vdCByZWFkIHQuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhCmluZGV4IGExN2I3ZmUuLjcyZTIxZGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhCkBAIC04NSw2ICs4NSw4IEBACiAKICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0UGVybWlzc2lvbnMoU3RyaW5nIGZpbGUsIGludFtdIG91dFBlcm1pc3Npb25zKTsKIAorICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBzZXRVTWFzayhpbnQgbWFzayk7CisKICAgICAvKiogcmV0dXJucyB0aGUgRkFUIGZpbGUgc3lzdGVtIHZvbHVtZSBJRCBmb3IgdGhlIHZvbHVtZSBtb3VudGVkIAogICAgICAqIGF0IHRoZSBnaXZlbiBtb3VudCBwb2ludCwgb3IgLTEgZm9yIGZhaWx1cmUKICAgICAgKiBAcGFyYW0gbW91bnQgcG9pbnQgZm9yIEZBVCB2b2x1bWUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0hhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0hhbmRsZXIuamF2YQppbmRleCAzYjJiZjFlLi4xNjVlNDM4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9IYW5kbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvSGFuZGxlci5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAgKiB0aGV5IGNyZWF0ZS4gIFlvdSBjYW4gY3JlYXRlIHlvdXIgb3duIHRocmVhZHMsIGFuZCBjb21tdW5pY2F0ZSBiYWNrIHdpdGgKICAqIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZCB0aHJvdWdoIGEgSGFuZGxlci4gIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nCiAgKiB0aGUgc2FtZSA8ZW0+cG9zdDwvZW0+IG9yIDxlbT5zZW5kTWVzc2FnZTwvZW0+IG1ldGhvZHMgYXMgYmVmb3JlLCBidXQgZnJvbQotICogeW91ciBuZXcgdGhyZWFkLiAgVGhlIGdpdmVuIFJ1bm5hYmxlIG9yIE1lc3NhZ2Ugd2lsbCB0aGFuIGJlIHNjaGVkdWxlZAorICogeW91ciBuZXcgdGhyZWFkLiAgVGhlIGdpdmVuIFJ1bm5hYmxlIG9yIE1lc3NhZ2Ugd2lsbCB0aGVuIGJlIHNjaGVkdWxlZAogICogaW4gdGhlIEhhbmRsZXIncyBtZXNzYWdlIHF1ZXVlIGFuZCBwcm9jZXNzZWQgd2hlbiBhcHByb3ByaWF0ZS4KICAqLwogcHVibGljIGNsYXNzIEhhbmRsZXIgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVtb3J5RmlsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVtb3J5RmlsZS5qYXZhCmluZGV4IGE4MWUxNmIuLmY4MjcwMmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lbW9yeUZpbGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZW1vcnlGaWxlLmphdmEKQEAgLTU4LDcgKzU4LDYgQEAKICAgICBwcml2YXRlIGludCBtQWRkcmVzczsgICAvLyBhZGRyZXNzIG9mIGFzaG1lbSBtZW1vcnkKICAgICBwcml2YXRlIGludCBtTGVuZ3RoOyAgICAvLyB0b3RhbCBsZW5ndGggb2Ygb3VyIGFzaG1lbSByZWdpb24KICAgICBwcml2YXRlIGJvb2xlYW4gbUFsbG93UHVyZ2luZyA9IGZhbHNlOyAgLy8gdHJ1ZSBpZiBvdXIgYXNobWVtIHJlZ2lvbiBpcyB1bnBpbm5lZAotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtT3duc1JlZ2lvbjsgIC8vIGZhbHNlIGlmIHRoaXMgaXMgYSByZWYgdG8gYW4gZXhpc3RpbmcgYXNobWVtIHJlZ2lvbgogCiAgICAgLyoqCiAgICAgICogQWxsb2NhdGVzIGEgbmV3IGFzaG1lbSByZWdpb24uIFRoZSByZWdpb24gaXMgaW5pdGlhbGx5IG5vdCBwdXJnYWJsZS4KQEAgLTcwLDM4ICs2OSwxMSBAQAogICAgIHB1YmxpYyBNZW1vcnlGaWxlKFN0cmluZyBuYW1lLCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICBtRkQgPSBuYXRpdmVfb3BlbihuYW1lLCBsZW5ndGgpOwotICAgICAgICBtQWRkcmVzcyA9IG5hdGl2ZV9tbWFwKG1GRCwgbGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKLSAgICAgICAgbU93bnNSZWdpb24gPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZWZlcmVuY2UgdG8gYW4gZXhpc3RpbmcgbWVtb3J5IGZpbGUuIENoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIGZpbGUKLSAgICAgKiB3aWxsIGJlIGF2YWlsYWJsZSB0aHJvdWdoIHRoaXMgcmVmZXJlbmNlLgotICAgICAqIENhbGxzIHRvIHtAbGluayAjYWxsb3dQdXJnaW5nKGJvb2xlYW4pfSBvbiB0aGUgcmV0dXJuZWQgTWVtb3J5RmlsZSB3aWxsIGZhaWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmQgRmlsZSBkZXNjcmlwdG9yIGZvciBhbiBleGlzdGluZyBtZW1vcnkgZmlsZSwgYXMgcmV0dXJuZWQgYnkKLSAgICAgKiAgICAgICAge0BsaW5rICNnZXRGaWxlRGVzY3JpcHRvcigpfS4gVGhpcyBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSBjbG9zZWQKLSAgICAgKiAgICAgICAgYnkge0BsaW5rICNjbG9zZSgpfS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgbWVtb3J5IGZpbGUgaW4gYnl0ZXMuCi0gICAgICogQHBhcmFtIG1vZGUgRmlsZSBtb2RlLiBDdXJyZW50bHkgb25seSAiciIgZm9yIHJlYWQtb25seSBhY2Nlc3MgaXMgc3VwcG9ydGVkLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+ZmQ8L2NvZGU+IGlzIG51bGwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiA8Y29kZT5mZDwvY29kZT4gZG9lcyBub3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgbWVtb3J5IGZpbGUsCi0gICAgICogICAgICAgICBvciBpZiB0aGUgZmlsZSBtb2RlIG9mIHRoZSBleGlzdGluZyBtZW1vcnkgZmlsZSBpcyBtb3JlIHJlc3RyaWN0aXZlCi0gICAgICogICAgICAgICB0aGFuIDxjb2RlPm1vZGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvciBmZCwgaW50IGxlbmd0aCwgU3RyaW5nIG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkZpbGUgZGVzY3JpcHRvciBpcyBudWxsLiIpOworICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbUFkZHJlc3MgPSBuYXRpdmVfbW1hcChtRkQsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWRkcmVzcyA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFpc01lbW9yeUZpbGUoZmQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSBtZW1vcnkgZmlsZS4iKTsKLSAgICAgICAgfQotICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICBtRkQgPSBmZDsKLSAgICAgICAgbUFkZHJlc3MgPSBuYXRpdmVfbW1hcChtRkQsIGxlbmd0aCwgbW9kZVRvUHJvdChtb2RlKSk7Ci0gICAgICAgIG1Pd25zUmVnaW9uID0gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjIsNyArOTQsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgeworICAgIHZvaWQgZGVhY3RpdmF0ZSgpIHsKICAgICAgICAgaWYgKCFpc0RlYWN0aXZhdGVkKCkpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbmF0aXZlX211bm1hcChtQWRkcmVzcywgbUxlbmd0aCk7CkBAIC0xODEsOSArMTUzLDYgQEAKICAgICAgKiBAcmV0dXJuIHByZXZpb3VzIHZhbHVlIG9mIGFsbG93UHVyZ2luZwogICAgICAqLwogICAgIHN5bmNocm9uaXplZCBwdWJsaWMgYm9vbGVhbiBhbGxvd1B1cmdpbmcoYm9vbGVhbiBhbGxvd1B1cmdpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbU93bnNSZWdpb24pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiT25seSB0aGUgb3duZXIgY2FuIG1ha2UgYXNobWVtIHJlZ2lvbnMgcHVyZ2FibGUuIik7Ci0gICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBvbGRWYWx1ZSA9IG1BbGxvd1B1cmdpbmc7CiAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBhbGxvd1B1cmdpbmcpIHsKICAgICAgICAgICAgIG5hdGl2ZV9waW4obUZELCAhYWxsb3dQdXJnaW5nKTsKQEAgLTI2MCwyOCArMjI5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgZmlsZS4gU2VlIHtAbGluayAjZ2V0RmlsZURlc2NyaXB0b3IoKX0KLSAgICAgKiBmb3IgY2F2ZWF0cy4gVGhpcyBtdXN0IGJlIGhlcmUgdG8gYWxsb3cgY2xhc3NlcyBvdXRzaWRlIDxjb2RlPmFuZHJvaWQub3M8L2NvZGU8IHRvCi0gICAgICogbWFrZSBQYXJjZWxGaWxlRGVzY3JpcHRvcnMgZnJvbSBNZW1vcnlGaWxlcywgYXMKLSAgICAgKiB7QGxpbmsgUGFyY2VsRmlsZURlc2NyaXB0b3IjUGFyY2VsRmlsZURlc2NyaXB0b3IoRmlsZURlc2NyaXB0b3IpfSBpcyBwYWNrYWdlIHByaXZhdGUuCi0gICAgICoKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGZpbGUgZGVzY3JpcHRvciBvd25lZCBieSB0aGlzIG1lbW9yeSBmaWxlIG9iamVjdC4KLSAgICAgKiAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGR1cGxpY2F0ZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGUgbWVtb3J5IGZpbGUgaGFzIGJlZW4gY2xvc2VkLgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3IgZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IGdldEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIHJldHVybiBmZCAhPSBudWxsID8gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIEZpbGVEZXNjcmlwdG9yIGZvciB0aGUgbWVtb3J5IGZpbGUuIE5vdGUgdGhhdCB0aGlzIGZpbGUgZGVzY3JpcHRvcgotICAgICAqIGlzIG9ubHkgc2FmZSB0byBwYXNzIHRvIHtAbGluayAjTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvcixpbnQpfSkuIEl0Ci0gICAgICogc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggZmlsZSBkZXNjcmlwdG9yIG9wZXJhdGlvbnMgdGhhdCBleHBlY3QgYSBmaWxlIGRlc2NyaXB0b3IKLSAgICAgKiBmb3IgYSBub3JtYWwgZmlsZS4KKyAgICAgKiBHZXRzIGEgRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgZmlsZS4KICAgICAgKgogICAgICAqIFRoZSByZXR1cm5lZCBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGR1cGxpY2F0ZWQuCiAgICAgICoKQEAgLTI5NCwxNyArMjQyLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIHJlZmVycyB0byBhIG1lbW9yeSBmaWxlLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiA8Y29kZT5mZDwvY29kZT4gaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKG5hdGl2ZV9nZXRfc2l6ZShmZCkgPj0gMCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZpbGUgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yIHJlZmVycyB0bywKICAgICAgKiBvciAtMSBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGRvZXMgbm90IHJlZmVyIHRvIGEgbWVtb3J5IGZpbGUuCiAgICAgICoKQEAgLTMxNiwyMCArMjUzLDYgQEAKICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRfc2l6ZShmZCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBmaWxlIG1vZGUgc3RyaW5nIHRvIGEgPGNvZGU+cHJvdDwvY29kZT4gdmFsdWUgYXMgZXhwZWN0ZWQgYnkKLSAgICAgKiBuYXRpdmVfbW1hcCgpLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpbGUgbW9kZSBpcyBpbnZhbGlkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBtb2RlVG9Qcm90KFN0cmluZyBtb2RlKSB7Ci0gICAgICAgIGlmICgiciIuZXF1YWxzKG1vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUFJPVF9SRUFEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZmlsZSBtb2RlOiAnIiArIG1vZGUgKyAiJyIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBNZW1vcnlJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKIAogICAgICAgICBwcml2YXRlIGludCBtTWFyayA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEKaW5kZXggNDliNzJmZS4uZWI5NDFlNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YQpAQCAtNzMsNyArNzMsMTggQEAKICAgICAgKiByZWNlaXZlci4KICAgICAgKi8KICAgICBwdWJsaWMgTWVzc2VuZ2VyIHJlcGx5VG87Ci0gICAgCisKKyAgICAvKiogSWYgc2V0IG1lc3NhZ2UgaXMgaW4gdXNlICovCisgICAgLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIGludCBGTEFHX0lOX1VTRSA9IDE7CisKKyAgICAvKiogRmxhZ3MgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKEFsbCBhcmUgcmVzZXJ2ZWQgZm9yIG5vdykgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEZMQUdTX1JFU0VSVkVEID0gfkZMQUdfSU5fVVNFOworCisgICAgLyoqIEZsYWdzIHRvIGNsZWFyIGluIHRoZSBjb3B5RnJvbSBtZXRob2QgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEZMQUdTX1RPX0NMRUFSX09OX0NPUFlfRlJPTSA9IEZMQUdTX1JFU0VSVkVEIHwgRkxBR19JTl9VU0U7CisKKyAgICAvKnBhY2thZ2UqLyBpbnQgZmxhZ3M7CisKICAgICAvKnBhY2thZ2UqLyBsb25nIHdoZW47CiAgICAgCiAgICAgLypwYWNrYWdlKi8gQnVuZGxlIGRhdGE7CkBAIC0yNTMsNiArMjY0LDcgQEAKICAgICAgKiB0YXJnZXQvY2FsbGJhY2sgb2YgdGhlIG9yaWdpbmFsIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29weUZyb20oTWVzc2FnZSBvKSB7CisgICAgICAgIHRoaXMuZmxhZ3MgPSBvLmZsYWdzICYgfkZMQUdTX1RPX0NMRUFSX09OX0NPUFlfRlJPTTsKICAgICAgICAgdGhpcy53aGF0ID0gby53aGF0OwogICAgICAgICB0aGlzLmFyZzEgPSBvLmFyZzE7CiAgICAgICAgIHRoaXMuYXJnMiA9IG8uYXJnMjsKQEAgLTM1MCw2ICszNjIsNyBAQAogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHZvaWQgY2xlYXJGb3JSZWN5Y2xlKCkgeworICAgICAgICBmbGFncyA9IDA7CiAgICAgICAgIHdoYXQgPSAwOwogICAgICAgICBhcmcxID0gMDsKICAgICAgICAgYXJnMiA9IDA7CkBAIC0zNjEsNiArMzc0LDE0IEBACiAgICAgICAgIGRhdGEgPSBudWxsOwogICAgIH0KIAorICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNJblVzZSgpIHsKKyAgICAgICAgcmV0dXJuICgoZmxhZ3MgJiBGTEFHX0lOX1VTRSkgPT0gRkxBR19JTl9VU0UpOworICAgIH0KKworICAgIC8qcGFja2FnZSovIHZvaWQgbWFya0luVXNlKCkgeworICAgICAgICBmbGFncyB8PSBGTEFHX0lOX1VTRTsKKyAgICB9CisKICAgICAvKiogQ29uc3RydWN0b3IgKGJ1dCB0aGUgcHJlZmVycmVkIHdheSB0byBnZXQgYSBNZXNzYWdlIGlzIHRvIGNhbGwge0BsaW5rICNvYnRhaW4oKSBNZXNzYWdlLm9idGFpbigpfSkuCiAgICAgKi8KICAgICBwdWJsaWMgTWVzc2FnZSgpIHsKQEAgLTQ1Myw0ICs0NzQsMyBAQAogICAgICAgICByZXBseVRvID0gTWVzc2VuZ2VyLnJlYWRNZXNzZW5nZXJPck51bGxGcm9tUGFyY2VsKHNvdXJjZSk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhCmluZGV4IDAwOTAxNzcuLmJiMDc4MjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhCkBAIC0xMjksNiArMTI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlcyA9IG1zZy5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm5leHQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudigiTWVzc2FnZVF1ZXVlIiwgIlJldHVybmluZyBtZXNzYWdlOiAiICsgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5tYXJrSW5Vc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UG9sbFRpbWVvdXRNaWxsaXMgPSAoaW50KSBNYXRoLm1pbih3aGVuIC0gbm93LCBJbnRlZ2VyLk1BWF9WQUxVRSk7CkBAIC0xODMsNyArMTg0LDcgQEAKICAgICB9CiAKICAgICBmaW5hbCBib29sZWFuIGVucXVldWVNZXNzYWdlKE1lc3NhZ2UgbXNnLCBsb25nIHdoZW4pIHsKLSAgICAgICAgaWYgKG1zZy53aGVuICE9IDApIHsKKyAgICAgICAgaWYgKG1zZy5pc0luVXNlKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbihtc2cKICAgICAgICAgICAgICAgICAgICAgKyAiIFRoaXMgbWVzc2FnZSBpcyBhbHJlYWR5IGluIHVzZS4iKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yLmphdmEKaW5kZXggOWQyMTNiMy4uYzFhMTgwOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhCkBAIC0xMzQsNiArMTM0LDQ1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEZpbGVEZXNjcmlwdG9yIGdldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldChTb2NrZXQgc29ja2V0KTsKIAogICAgIC8qKgorICAgICAqIENyZWF0ZSB0d28gUGFyY2VsRmlsZURlc2NyaXB0b3JzIHN0cnVjdHVyZWQgYXMgYSBkYXRhIHBpcGUuICBUaGUgZmlyc3QKKyAgICAgKiBQYXJjZWxGaWxlRGVzY3JpcHRvciBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhlIHJlYWQgc2lkZTsgdGhlIHNlY29uZAorICAgICAqIGlzIHRoZSB3cml0ZSBzaWRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBjcmVhdGVQaXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZURlc2NyaXB0b3JbXSBmZHMgPSBuZXcgRmlsZURlc2NyaXB0b3JbMl07CisgICAgICAgIGludCByZXMgPSBjcmVhdGVQaXBlTmF0aXZlKGZkcyk7CisgICAgICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwZmRzID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yWzJdOworICAgICAgICAgICAgcGZkc1swXSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcihmZHNbMF0pOworICAgICAgICAgICAgcGZkc1sxXSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcihmZHNbMV0pOworICAgICAgICAgICAgcmV0dXJuIHBmZHM7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIHBpcGU6IGVycm5vPSIgKyAtcmVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGNyZWF0ZVBpcGVOYXRpdmUoRmlsZURlc2NyaXB0b3JbXSBvdXRGZHMpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgZ2l2ZW4gZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gY29weS4KKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgbWF5IGJhY2sgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKiAgICAgICAgVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpdmUgYW5kIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBBIFBhcmNlbEZpbGVEZXNjcmlwdG9yLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIHNoYXJlZCBtZW1vcnkgYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZyb21EYXRhKGJ5dGVbXSBkYXRhLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKG5hbWUsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZmlsZS53cml0ZUJ5dGVzKGRhdGEsIDAsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBmaWxlLmRlYWN0aXZhdGUoKTsKKyAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBmaWxlLmdldEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIHJldHVybiBmZCAhPSBudWxsID8gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGFjdHVhbCBGaWxlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBGaWxlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Qcm9jZXNzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Qcm9jZXNzLmphdmEKaW5kZXggZjY5NWRiYi4uMTIzNWI0ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUHJvY2Vzcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1Byb2Nlc3MuamF2YQpAQCAtODYsNiArODYsMTIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX1VJRCA9IDEwMTA7CiAKICAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBHSUQgZm9yIHRoZSBncm91cCB0aGF0IGFsbG93cyB3cml0ZSBhY2Nlc3MgdG8gdGhlIFNEIGNhcmQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRENBUkRfUldfR0lEID0gMTAxNTsKKworICAgIC8qKgogICAgICAqIERlZmluZXMgdGhlIHN0YXJ0IG9mIGEgcmFuZ2Ugb2YgVUlEcyAoYW5kIEdJRHMpLCBnb2luZyBmcm9tIHRoaXMKICAgICAgKiBudW1iZXIgdG8ge0BsaW5rICNMQVNUX0FQUExJQ0FUSU9OX1VJRH0gdGhhdCBhcmUgcmVzZXJ2ZWQgZm9yIGFzc2lnbmluZwogICAgICAqIHRvIGFwcGxpY2F0aW9ucy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1N5c3RlbVNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1N5c3RlbVNlcnZpY2UuamF2YQppbmRleCA0NDdjZDFmLi5kYTI3ZGI1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9TeXN0ZW1TZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvU3lzdGVtU2VydmljZS5qYXZhCkBAIC0yOCw0ICsyOCw5IEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3AoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoImN0bC5zdG9wIiwgbmFtZSk7CiAgICAgfQorCisgICAgLyoqIFJlcXVlc3QgdGhhdCB0aGUgaW5pdCBkYWVtb24gcmVzdGFydCBhIG5hbWVkIHNlcnZpY2UuICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoImN0bC5yZXN0YXJ0IiwgbmFtZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhCmluZGV4IDdiODgzYTcuLmQzZDM5ZDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogLyoqCiAgKiBVc2VkIGZvciByZWNlaXZpbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBTdG9yYWdlTWFuYWdlcgotICogQGhpZGUKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFN0b3JhZ2VFdmVudExpc3RlbmVyIHsKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQppbmRleCAyZWJkMDQ5Li44NTU0ZWNlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCkBAIC0zMjEsNyArMzIxLDYgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBsaXN0ZW5lciBBIHtAbGluayBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIgU3RvcmFnZUV2ZW50TGlzdGVuZXJ9IG9iamVjdC4KICAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihTdG9yYWdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewpAQCAtMzM4LDcgKzMzNyw2IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQSB7QGxpbmsgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIFN0b3JhZ2VFdmVudExpc3RlbmVyfSBvYmplY3QuCiAgICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihTdG9yYWdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewpAQCAtMzU5LDggKzM1Nyw2IEBACiAKICAgICAvKioKICAgICAgKiBFbmFibGVzIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgb24gdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5hYmxlVXNiTWFzc1N0b3JhZ2UoKSB7CiAgICAgICAgIHRyeSB7CkBAIC0zNzIsOCArMzY4LDYgQEAKIAogICAgIC8qKgogICAgICAqIERpc2FibGVzIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgb24gdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGlzYWJsZVVzYk1hc3NTdG9yYWdlKCkgewogICAgICAgICB0cnkgewpAQCAtMzg2LDggKzM4MCw2IEBACiAgICAgLyoqCiAgICAgICogUXVlcnkgaWYgYSBVU0IgTWFzcyBTdG9yYWdlIChVTVMpIGhvc3QgaXMgY29ubmVjdGVkLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBVTVMgaG9zdCBpcyBjb25uZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVXNiTWFzc1N0b3JhZ2VDb25uZWN0ZWQoKSB7CiAgICAgICAgIHRyeSB7CkBAIC00MDEsOCArMzkzLDYgQEAKICAgICAvKioKICAgICAgKiBRdWVyeSBpZiBhIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgaXMgZW5hYmxlZCBvbiB0aGUgZGV2aWNlLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBVTVMgaG9zdCBpcyBlbmFibGVkLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzYk1hc3NTdG9yYWdlRW5hYmxlZCgpIHsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YQppbmRleCAwNzVmNDdmLi4wN2Q5NWRmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiAvKioKICAqIENsYXNzIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGNvbnN0YW50cyByZXR1cm5lZCBmcm9tIFN0b3JhZ2VNYW5hZ2VyCiAgKiBhbmQgbG93ZXIgbGV2ZWwgTW91bnRTZXJ2aWNlIEFQSXMuCi0gKgotICogQGhpZGUKICAqLwogcHVibGljIGNsYXNzIFN0b3JhZ2VSZXN1bHRDb2RlCiB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQppbmRleCBmNWUxYmFjLi4yODI0MTdkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKQEAgLTIwNiwxMCArMjA2LDcgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKGFsbERheSkgewotICAgICAgICAJLy8gVE9ETzogYWxzbyBjaGFuZ2UgdHppZCB0byBiZSBVVEM/ICB0aGF0IHdvdWxkIGJlIGNvbnNpc3RlbnQsIGJ1dAotICAgICAgICAJLy8gdGhhdCB3b3VsZCBub3QgcmVmbGVjdCB0aGUgb3JpZ2luYWwgdGltZXpvbmUgdmFsdWUgYmFjayB0byB0aGUKLSAgICAgICAgCS8vIHNlcnZlci4KLSAgICAgICAgCXN0YXJ0LnRpbWV6b25lID0gVGltZS5USU1FWk9ORV9VVEM7CisgICAgICAgICAgICBzdGFydC50aW1lem9uZSA9IFRpbWUuVElNRVpPTkVfVVRDOwogICAgICAgICB9CiAgICAgICAgIGxvbmcgbWlsbGlzID0gc3RhcnQudG9NaWxsaXMoZmFsc2UgLyogdXNlIGlzRHN0ICovKTsKICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhci5FdmVudHMuRFRTVEFSVCwgbWlsbGlzKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2ZlOTgwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRleHRVdGlscyBlc3BlY2lhbGx5IGZvciBKYXBhbmVzZS4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBKYXBhbmVzZVV0aWxzIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBNYXA8Q2hhcmFjdGVyLCBTdHJpbmc+IHNIYWxmV2lkdGhNYXAgPQotICAgICAgICBuZXcgSGFzaE1hcDxDaGFyYWN0ZXIsIFN0cmluZz4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDEnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDInLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEMnLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEQnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMUMnLCAifiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQxJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDREJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDczJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdEJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlCJywgIlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlDJywgIlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEExJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFEJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQzJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEREJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY0JywgIlx1RkY3M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY1JywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY2JywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZCJywgIlx1RkY2NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZDJywgIlx1RkY3MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAxJywgIiEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMicsICJcIiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAzJywgIiMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNCcsICIkIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDUnLCAiJSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA2JywgIiYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNycsICInIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDgnLCAiKCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA5JywgIikiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwQScsICIqIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEInLCAiKyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBDJywgIiwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwRCcsICItIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEUnLCAiLiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBGJywgIi8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMCcsICIwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTEnLCAiMSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjEyJywgIjIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMycsICIzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTQnLCAiNCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE1JywgIjUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNicsICI2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTcnLCAiNyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE4JywgIjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxOScsICI5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUEnLCAiOiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFCJywgIjsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxQycsICI8Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUQnLCAiPSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFFJywgIj4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxRicsICI/Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjAnLCAiQCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIxJywgIkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMicsICJCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjMnLCAiQyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI0JywgIkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNScsICJFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjYnLCAiRiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI3JywgIkciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyOCcsICJIIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjknLCAiSSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJBJywgIkoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyQicsICJLIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkMnLCAiTCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJEJywgIk0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyRScsICJOIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkYnLCAiTyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMwJywgIlAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMScsICJRIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzInLCAiUiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMzJywgIlMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNCcsICJUIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzUnLCAiVSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM2JywgIlYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNycsICJXIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzgnLCAiWCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM5JywgIlkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzQScsICJaIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0InLCAiWyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNDJywgIlxcIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0QnLCAiXSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNFJywgIl4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzRicsICJfIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDEnLCAiYSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQyJywgImIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0MycsICJjIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDQnLCAiZCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ1JywgImUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NicsICJmIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDcnLCAiZyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ4JywgImgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0OScsICJpIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEEnLCAiaiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRCJywgImsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0QycsICJsIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEQnLCAibSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRFJywgIm4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0RicsICJvIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTAnLCAicCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUxJywgInEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MicsICJyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTMnLCAicyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU0JywgInQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NScsICJ1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTYnLCAidiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU3JywgInciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1OCcsICJ4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTknLCAieSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVBJywgInoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1QicsICJ7Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUMnLCAifCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVEJywgIn0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1RScsICJ+Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjEnLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjInLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjMnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjQnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjUnLCAiXHVGRjY1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjYnLCAiXHVGRjY2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjcnLCAiXHVGRjY3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjgnLCAiXHVGRjY4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjknLCAiXHVGRjY5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkEnLCAiXHVGRjZBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkInLCAiXHVGRjZCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkMnLCAiXHVGRjZDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkQnLCAiXHVGRjZEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkUnLCAiXHVGRjZFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkYnLCAiXHVGRjZGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzAnLCAiXHVGRjcwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzEnLCAiXHVGRjcxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzInLCAiXHVGRjcyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzMnLCAiXHVGRjczIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzQnLCAiXHVGRjc0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzUnLCAiXHVGRjc1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzYnLCAiXHVGRjc2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzcnLCAiXHVGRjc3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzgnLCAiXHVGRjc4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzknLCAiXHVGRjc5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0EnLCAiXHVGRjdBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0InLCAiXHVGRjdCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0MnLCAiXHVGRjdDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0QnLCAiXHVGRjdEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0UnLCAiXHVGRjdFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0YnLCAiXHVGRjdGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODAnLCAiXHVGRjgwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODEnLCAiXHVGRjgxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODInLCAiXHVGRjgyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODMnLCAiXHVGRjgzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODQnLCAiXHVGRjg0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODUnLCAiXHVGRjg1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODYnLCAiXHVGRjg2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODcnLCAiXHVGRjg3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODgnLCAiXHVGRjg4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODknLCAiXHVGRjg5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEEnLCAiXHVGRjhBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEInLCAiXHVGRjhCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEMnLCAiXHVGRjhDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEQnLCAiXHVGRjhEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEUnLCAiXHVGRjhFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEYnLCAiXHVGRjhGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTAnLCAiXHVGRjkwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTEnLCAiXHVGRjkxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTInLCAiXHVGRjkyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTMnLCAiXHVGRjkzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTQnLCAiXHVGRjk0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTUnLCAiXHVGRjk1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTYnLCAiXHVGRjk2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTcnLCAiXHVGRjk3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTgnLCAiXHVGRjk4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTknLCAiXHVGRjk5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUEnLCAiXHVGRjlBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUInLCAiXHVGRjlCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUMnLCAiXHVGRjlDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUQnLCAiXHVGRjlEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUUnLCAiXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUYnLCAiXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGRTUnLCAiXHUwMDVDXHUwMDVDIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBoYWxmLXdpZHRoIHZlcnNpb24gb2YgdGhhdCBjaGFyYWN0ZXIgaWYgcG9zc2libGUuIFJldHVybnMgbnVsbCBpZiBub3QgcG9zc2libGUKLSAgICAgKiBAcGFyYW0gY2ggaW5wdXQgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiBDaGFyU2VxdWVuY2Ugb2JqZWN0IGlmIHRoZSBtYXBwaW5nIGZvciBjaCBleGlzdHMuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cnlHZXRIYWxmV2lkdGhUZXh0KGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKHNIYWxmV2lkdGhNYXAuY29udGFpbnNLZXkoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc0hhbGZXaWR0aE1hcC5nZXQoY2gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZjZlYmUuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyB3aGljaCBsZXRzIHVzZXJzIGNyZWF0ZSB0aGVpciBvd24gdkNhcmQgU3RyaW5nLiBUeXBpY2FsIHVzYWdlIGlzIGFzIGZvbGxvd3M6Ci0gKiA8L3A+Ci0gKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+ZmluYWwgVkNhcmRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVkNhcmRCdWlsZGVyKHZjYXJkVHlwZSk7Ci0gKiBidWlsZGVyLmFwcGVuZE5hbWVQcm9wZXJ0aWVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZE5pY2tOYW1lcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRQaG9uZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kRW1haWxzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZFBvc3RhbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRPcmdhbml6YXRpb25zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRXZWJzaXRlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZFBob3Rvcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmROb3Rlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZEV2ZW50cyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRJbXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEltLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kUmVsYXRpb24oY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gKiByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOzwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRCdWlsZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEJ1aWxkZXIiOwotCi0gICAgLy8gSWYgeW91IGFkZCB0aGUgb3RoZXIgZWxlbWVudCwgcGxlYXNlIGNoZWNrIGFsbCB0aGUgY29sdW1ucyBhcmUgYWJsZSB0byBiZQotICAgIC8vIGNvbnZlcnRlZCB0byBTdHJpbmcuCi0gICAgLy8KLSAgICAvLyBlLmcuIEJMT0IgaXMgbm90IHdoYXQgd2UgY2FuIGhhbmRsZSBoZXJlIG5vdy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQWxsb3dlZEFuZHJvaWRQcm9wZXJ0eVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QSE9ORV9UWVBFID0gUGhvbmUuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9TVEFMX1RZUEUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VNQUlMX1RZUEUgPSBFbWFpbC5UWVBFX09USEVSOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfVkNBUkQgPSAiVkNBUkQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9EQVRBX1BVQkxJQyA9ICJQVUJMSUMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfRU5EX09GX0xJTkUgPSAiXHJcbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfU0VQQVJBVE9SID0gIjoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9JVEVNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfV1MgPSAiICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VRVUFMID0gIj0iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQID0KLSAgICAgICAgICAgICJFTkNPRElORz0iICsgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfUVA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMjEgPQotICAgICAgICAgICAgIkVOQ09ESU5HPSIgKyBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9BU19CID0KLSAgICAgICAgICAgICJFTkNPRElORz0iICsgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzVjMwT3JWNDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0phcGFuZXNlTW9iaWxlUGhvbmU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0RvQ29NbzsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVNob3VsZFVzZVF1b3RlZFByaW50YWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNBbmRyb2lkUHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzRGVmYWN0UHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1BcHBlbmRUeXBlUGFyYW1OYW1lOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2hhcnNldDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5kQXBwZW5kZWQ7Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgLy8gRGVmYXVsdCBjaGFyc2V0IHNob3VsZCBiZSB1c2VkCi0gICAgICAgIHRoaXModmNhcmRUeXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmNhcmRUeXBlCi0gICAgICogQHBhcmFtIGNoYXJzZXQgSWYgbnVsbCwgd2UgdXNlIGRlZmF1bHQgY2hhcnNldCBmb3IgZXhwb3J0LgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQnVpbGRlcihmaW5hbCBpbnQgdmNhcmRUeXBlLCBTdHJpbmcgY2hhcnNldCkgewotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAiU2hvdWxkIG5vdCB1c2UgdkNhcmQgNC4wIHdoZW4gYnVpbGRpbmcgdkNhcmQuICIgKwotICAgICAgICAgICAgICAgICAgICAiSXQgaXMgbm90IG9mZmljaWFsbHkgcHVibGlzaGVkIHlldC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Jc1YzME9yVjQwID0gVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSB8fCBWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpOwotICAgICAgICBtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlID0gVkNhcmRDb25maWcuc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jc0phcGFuZXNlTW9iaWxlUGhvbmUgPSBWQ2FyZENvbmZpZy5uZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUgPSBWQ2FyZENvbmZpZy5vbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNBbmRyb2lkUHJvcGVydHkgPSBWQ2FyZENvbmZpZy51c2VzQW5kcm9pZFNwZWNpZmljUHJvcGVydHkodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNEZWZhY3RQcm9wZXJ0eSA9IFZDYXJkQ29uZmlnLnVzZXNEZWZhY3RQcm9wZXJ0eSh2Y2FyZFR5cGUpOwotICAgICAgICBtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgPSBWQ2FyZENvbmZpZy5zaG91bGRSZWZyYWluUVBUb05hbWVQcm9wZXJ0aWVzKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1BcHBlbmRUeXBlUGFyYW1OYW1lID0gVkNhcmRDb25maWcuYXBwZW5kVHlwZVBhcmFtTmFtZSh2Y2FyZFR5cGUpOwotICAgICAgICBtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyA9IFZDYXJkQ29uZmlnLm5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcodmNhcmRUeXBlKTsKLQotICAgICAgICAvLyB2Q2FyZCAyLjEgcmVxdWlyZXMgY2hhcnNldC4KLSAgICAgICAgLy8gdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IGl0IGJ1dCB3ZSBmb3VuZCBzb21lIGRldmljZXMgdXNlIGl0IHRvIGRldGVybWluZQotICAgICAgICAvLyB0aGUgZXhhY3QgY2hhcnNldC4KLSAgICAgICAgLy8gV2UgY3VycmVudGx5IGFwcGVuZCBpdCBvbmx5IHdoZW4gY2hhcnNldCBvdGhlciB0aGFuIFVURl84IGlzIHVzZWQuCi0gICAgICAgIG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gPQotICAgICAgICAgICAgICAgICEoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSAmJiAiVVRGLTgiLmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpOwotCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAoIVNISUZUX0pJUy5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY2hhcnNldCBcIiIgKyBjaGFyc2V0ICsgIlwiIGlzIHVzZWQgd2hpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBTSElGVF9KSVMgKyAiIGlzIG5lZWRlZCB0byBiZSB1c2VkLiIpOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0KSkgewotICAgICAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKGNoYXJzZXQpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJlZXItc3BlY2lmaWMgXCIiICsgY2hhcnNldCArICJcIiB3YXMgbm90IGZvdW5kIChhcyB1c3VhbCkuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIGl0IGFzIGlzLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gY2hhcnNldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMsICJkb2NvbW8iKS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9Db01vLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJlZXItc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBTSElGVF9KSVM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY2hhcnNldCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSB0aGUgY2hhcnNldCBcIiIgKyBWQ2FyZENvbmZpZy5ERUZBVUxUX0VYUE9SVF9DSEFSU0VUCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcIiBmb3IgZXhwb3J0LiIpOwotICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gVkNhcmRDb25maWcuREVGQVVMVF9FWFBPUlRfQ0hBUlNFVDsKLSAgICAgICAgICAgICAgICBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyID0gIkNIQVJTRVQ9IiArIFZDYXJkQ29uZmlnLkRFRkFVTFRfRVhQT1JUX0NIQVJTRVQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihjaGFyc2V0KS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FyZWVyLXNwZWNpZmljIFwiIiArIGNoYXJzZXQgKyAiXCIgd2FzIG5vdCBmb3VuZCAoYXMgdXN1YWwpLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIGl0IGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IGNoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBjaGFyc2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbUVuZEFwcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkVHSU4sIFZDQVJEX0RBVEFfVkNBUkQpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTiwgVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WNDApOwotICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04sIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjMwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghVkNhcmRDb25maWcuaXNWZXJzaW9uMjEobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVW5rbm93biB2Q2FyZCB2ZXJzaW9uIGRldGVjdGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OLCBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YyMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNOb25FbXB0eU5hbWUoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNGYW1pbHlOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTWlkZGxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0dpdmVuTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUpOwotICAgICAgICByZXR1cm4gIShUZXh0VXRpbHMuaXNFbXB0eShmYW1pbHlOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShtaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KGdpdmVuTmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocHJlZml4KSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHN1ZmZpeCkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbnRlbnRWYWx1ZXMgZ2V0UHJpbWFyeUNvbnRlbnRWYWx1ZShmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBDb250ZW50VmFsdWVzIHN1YnByaW1hcnlDb250ZW50VmFsdWVzID0gbnVsbDsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbnRlZ2VyIGlzU3VwZXJQcmltYXJ5ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZE5hbWUuSVNfU1VQRVJfUFJJTUFSWSk7Ci0gICAgICAgICAgICBpZiAoaXNTdXBlclByaW1hcnkgIT0gbnVsbCAmJiBpc1N1cGVyUHJpbWFyeSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgInN1cGVyIHByaW1hcnkiIENvbnRlbnRWYWx1ZXMuCi0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIHRoZSBmaXJzdCAicHJpbWFyeSIgQ29udGVudFZhbHVlcwotICAgICAgICAgICAgICAgIC8vIGlmICJzdXBlciBwcmltYXJ5IiBDb250ZW50VmFsdWVzIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWFyeSAhPSBudWxsICYmIGlzUHJpbWFyeSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zTm9uRW1wdHlOYW1lKGNvbnRlbnRWYWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGJyZWFrLCBzaW5jZSB0aGVyZSBtYXkgYmUgQ29udGVudFZhbHVlcyB3aXRoICJzdXBlciBwcmltYXJ5IgotICAgICAgICAgICAgICAgICAgICAvLyBhZnRlcndvcmQuCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc05vbkVtcHR5TmFtZShjb250ZW50VmFsdWVzKSkgewotICAgICAgICAgICAgICAgICAgICBzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzdWJwcmltYXJ5Q29udGVudFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIHRoZSBmaXJzdCBDb250ZW50VmFsdWVzIGlmIGFueSAicHJpbWFyeSIgQ29udGVudFZhbHVlcyBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IHN1YnByaW1hcnlDb250ZW50VmFsdWVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQWxsIENvbnRlbnRWYWx1ZXMgZ2l2ZW4gZnJvbSBkYXRhYmFzZSBpcyBlbXB0eS4iKTsKLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJpbWFyeUNvbnRlbnRWYWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gYXZvaWQgdW5uZWNlc3NhcnkgY29tcGxpY2F0aW9uIGluIGxvZ2ljLCB3ZSB1c2UgdGhpcyBtZXRob2QgdG8gY29uc3RydWN0IE4sIEZOCi0gICAgICogcHJvcGVydGllcyBmb3IgdkNhcmQgNC4wLgotICAgICAqLwotICAgIHByaXZhdGUgVkNhcmRCdWlsZGVyIGFwcGVuZE5hbWVQcm9wZXJ0aWVzVjQwKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKG1Jc0RvQ29NbyB8fCBtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZykgewotICAgICAgICAgICAgLy8gSWdub3JlIGFsbCBmbGFncyB0aGF0IGxvb2sgc3RhbGUgZnJvbSB0aGUgdmlldyBvZiB2Q2FyZCA0LjAgdG8KLSAgICAgICAgICAgIC8vIHNpbXBsaWZ5IGNvbnN0cnVjdGlvbiBhbGdvcml0aG0uIEFjdHVhbGx5IHdlIGRvbid0IGhhdmUgYW55IHZDYXJkIGZpbGUKLSAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHJlYWwgd29ybGQgeWV0LCBzbyB3ZSBtYXkgbmVlZCB0byByZS1lbmFibGUgc29tZSBvZiB0aGVzZQotICAgICAgICAgICAgLy8gaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbnZhbGlkIGZsYWcgaXMgdXNlZCBpbiB2Q2FyZCA0LjAgY29uc3RydWN0aW9uLiBJZ25vcmVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCAiIik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGhhdmUgZGlmZmljdWx0eSBoZXJlLiBIb3cgY2FuIHdlIGFwcHJvcHJpYXRlbHkgaGFuZGxlIFN0cnVjdHVyZWROYW1lIHdpdGgKLSAgICAgICAgLy8gbWlzc2luZyBwYXJ0cyBuZWNlc3NhcnkgZm9yIGRpc3BsYXlpbmcgd2hpbGUgaXQgaGFzIHN1cHByZW1lbnRhbCBpbmZvcm1hdGlvbi4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gZS5nLiBIb3cgdG8gaGFuZGxlIG5vbi1lbXB0eSBwaG9uZXRpYyBuYW1lcyB3aXRoIGVtcHR5IHN0cnVjdHVyZWQgbmFtZXM/Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gZ2V0UHJpbWFyeUNvbnRlbnRWYWx1ZShjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgIFN0cmluZyBmYW1pbHlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkoZ2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkocHJlZml4KQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHN1ZmZpeCkpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShmb3JtYXR0ZWROYW1lKSkgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZhbWlseU5hbWUgPSBmb3JtYXR0ZWROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljRmFtaWx5TmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY01pZGRsZU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNHaXZlbk5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkRmFtaWx5ID0gZXNjYXBlQ2hhcmFjdGVycyhmYW1pbHlOYW1lKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRHaXZlbiA9IGVzY2FwZUNoYXJhY3RlcnMoZ2l2ZW5OYW1lKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRNaWRkbGUgPSBlc2NhcGVDaGFyYWN0ZXJzKG1pZGRsZU5hbWUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXNjYXBlZFByZWZpeCA9IGVzY2FwZUNoYXJhY3RlcnMocHJlZml4KTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRTdWZmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHN1ZmZpeCk7Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotCi0gICAgICAgIGlmICghKFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvcnRBcyA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICArICc7JyArIGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNHaXZlbk5hbWUpCi0gICAgICAgICAgICAgICAgICAgICsgJzsnICsgZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKCJTT1JULUFTPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0FzVjQwUGFyYW1WYWx1ZShzb3J0QXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVkRmFtaWx5KTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZWRHaXZlbik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVkTWlkZGxlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZWRQcmVmaXgpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlZFN1ZmZpeCk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0KLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGZvcm1hdHRlZE5hbWUpKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOgotICAgICAgICAgICAgLy8gRElTUExBWV9OQU1FIGRvZXNuJ3QgZXhpc3Qgd2hpbGUgc29tZSBvdGhlciBlbGVtZW50cyBkbywgd2hpY2ggaXMgdXN1YWxseQotICAgICAgICAgICAgLy8gd2VpcmQgaW4gQW5kcm9pZCwgYXMgRElTUExBWV9OQU1FIHNob3VsZCAodXN1YWxseSkgYmUgY29uc3RydWN0ZWQKLSAgICAgICAgICAgIC8vIGZyb20gdGhlIG90aGVycyB1c2luZyBsb2NhbGUgaW5mb3JtYXRpb24gYW5kIGl0cyBjb2RlIHBvaW50cy4KLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJESVNQTEFZX05BTUUgaXMgZW1wdHkuIik7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkID0gZXNjYXBlQ2hhcmFjdGVycyhWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmdldE5hbWVPcmRlclR5cGUobVZDYXJkVHlwZSksCi0gICAgICAgICAgICAgICAgICAgIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwgcHJlZml4LCBzdWZmaXgpKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sIGVzY2FwZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRGb3JtYXR0ZWQgPSBlc2NhcGVDaGFyYWN0ZXJzKGZvcm1hdHRlZE5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlZEZvcm1hdHRlZCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgbWF5IG5lZWQgWC0gcHJvcGVydGllcyBmb3IgcGhvbmV0aWMgbmFtZXMuCi0gICAgICAgIGFwcGVuZFBob25ldGljTmFtZUZpZWxkcyhjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHNhZmV0eSwgd2UnbGwgZW1pdCBqdXN0IG9uZSB2YWx1ZSBhcm91bmQgU3RydWN0dXJlZE5hbWUsIGFzIGV4dGVybmFsIGltcG9ydGVycwotICAgICAqIG1heSBnZXQgY29uZnVzZWQgd2l0aCBtdWx0aXBsZSAiTiIsICJGTiIsIGV0Yy4gcHJvcGVydGllcywgdGhvdWdoIGl0IGlzIHZhbGlkIGluCi0gICAgICogdkNhcmQgc3BlYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5hbWVQcm9wZXJ0aWVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kTmFtZVByb3BlcnRpZXNWNDAoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgcmVxdWlyZXMgIk4iIGFuZCAiRk4iIHByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgLy8gdkNhcmQgNC4wIGRvZXMgTk9UIHJlcXVpcmUgTiwgYnV0IHdlIHRha2UgY2FyZSBvZiBwb3NzaWJsZSBiYWNrd2FyZAotICAgICAgICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgaXNzdWVzLgotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IGdldFByaW1hcnlDb250ZW50VmFsdWUoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUFJFRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN1ZmZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuU1VGRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUpOwotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZmFtaWx5TmFtZSkgfHwgIVRleHRVdGlscy5pc0VtcHR5KGdpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShmYW1pbHlOYW1lLCBnaXZlbk5hbWUsIG1pZGRsZU5hbWUsIHByZWZpeCwgc3VmZml4KTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lID0KLSAgICAgICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShnaXZlbk5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShtaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocHJlZml4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoc3VmZml4KSkpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkTmFtZTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGVkTmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZWROYW1lID0gVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuZ2V0TmFtZU9yZGVyVHlwZShtVkNhcmRUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwgcHJlZml4LCBzdWZmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9GTiA9Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShmb3JtYXR0ZWROYW1lKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9GTiA9Ci0gICAgICAgICAgICAgICAgICAgICFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZvcm1hdHRlZE5hbWUpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZhbWlseTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkR2l2ZW47Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZE1pZGRsZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUHJlZml4OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRTdWZmaXg7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZhbWlseSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShmYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkR2l2ZW4gPSBlbmNvZGVRdW90ZWRQcmludGFibGUoZ2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTWlkZGxlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKG1pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQcmVmaXggPSBlbmNvZGVRdW90ZWRQcmludGFibGUocHJlZml4KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3VmZml4ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHN1ZmZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRGYW1pbHkgPSBlc2NhcGVDaGFyYWN0ZXJzKGZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRHaXZlbiA9IGVzY2FwZUNoYXJhY3RlcnMoZ2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTWlkZGxlID0gZXNjYXBlQ2hhcmFjdGVycyhtaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUHJlZml4ID0gZXNjYXBlQ2hhcmFjdGVycyhwcmVmaXgpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdWZmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRm9ybWF0dGVkbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0ZOID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVRdW90ZWRQcmludGFibGUoZm9ybWF0dGVkTmFtZSkgOiBlc2NhcGVDaGFyYWN0ZXJzKGZvcm1hdHRlZE5hbWUpKTsKLQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgLy8gRG9Db01vIHBob25lcyByZXF1aXJlIHRoYXQgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgImZhbWlseSBuYW1lIiBmaWVsZC4KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZm9ybWF0dGVkTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEZhbWlseSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEdpdmVuKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkTWlkZGxlKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUHJlZml4KTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0KLSAgICAgICAgICAgIC8vIEZOIHByb3BlcnR5Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pOwotICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb0ZOKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRk4pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRm9ybWF0dGVkbmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSA9Ci0gICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShkaXNwbGF5TmFtZSkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWREaXNwbGF5TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRGlzcGxheU5hbWUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVF1b3RlZFByaW50YWJsZShkaXNwbGF5TmFtZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVDaGFyYWN0ZXJzKGRpc3BsYXlOYW1lKTsKLQotICAgICAgICAgICAgLy8gTgotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWREaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLQotICAgICAgICAgICAgLy8gRk4KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTik7Ci0KLSAgICAgICAgICAgIC8vIE5vdGU6ICJDSEFSU0VUIiBwYXJhbSBpcyBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAsIGJ1dCB3ZSBtYXkgYWRkIGl0Ci0gICAgICAgICAgICAvLyAgICAgICB3aGVuIGl0IHdvdWxkIGJlIHVzZWZ1bCBvciBuZWNlc3NhcnkgZm9yIGV4dGVybmFsIGltcG9ydGVycywKLSAgICAgICAgICAgIC8vICAgICAgIGFzc3VtaW5nIHRoZSBleHRlcm5hbCBpbXBvcnRlciBhbGxvd3MgdGhpcyB2aW9yYXRpb24gb2YgdGhlIHNwZWMuCi0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZERpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTiwgIiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBhcHBlbmRQaG9uZXRpY05hbWVGaWVsZHMoY29udGVudFZhbHVlcyk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtaXRzIFNPVU5EO0lSTUMsIFNPUlQtU1RSSU5HLCBhbmQgZGUtZmFjdCB2YWx1ZXMgZm9yIHBob25ldGljIG5hbWVzIGxpa2UgWC1QSE9ORVRJQy1GQU1JTFkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBob25ldGljTmFtZUZpZWxkcyhmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wUGhvbmV0aWNGYW1pbHlOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBQaG9uZXRpY01pZGRsZU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRtcFBob25ldGljR2l2ZW5OYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUpOwotICAgICAgICAgICAgaWYgKG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIHBob25ldGljTWlkZGxlTmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0dpdmVuTmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUgPSB0bXBQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lID0gdG1wUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lID0gdG1wUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCBTT1JULVNUUklORyBhbnl3YXkuCi0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3J0U3RyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKG1WQ2FyZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lLCBwaG9uZXRpY01pZGRsZU5hbWUsIHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1JUX1NUUklORyk7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkgJiYgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHNvcnRTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGRvZXMgbm90IGZvcmNlIHVzIHRvIHVzZSBVVEYtOCBhbmQgYWN0dWFsbHkgd2Ugc2VlIHNvbWUKLSAgICAgICAgICAgICAgICAvLyBwcm9ncmFtcyB3aGljaCBlbWl0IHRoaXMgdmFsdWUuIEl0IGlzIGluY29ycmVjdCBmcm9tIHRoZSB2aWV3IG9mCi0gICAgICAgICAgICAgICAgLy8gc3BlY2lmaWNhdGlvbiwgYnV0IGFjdHVhbGx5IG5lY2Vzc2FyeSBmb3IgcGFyc2luZyB2Q2FyZCB3aXRoIG5vbi1VVEYtOAotICAgICAgICAgICAgICAgIC8vIGNoYXJzZXRzLCBleHBlY3Rpbmcgb3RoZXIgcGFyc2VycyBub3QgZ2V0IGNvbmZ1c2VkIHdpdGggdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZUNoYXJhY3RlcnMoc29ydFN0cmluZykpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSXNKYXBhbmVzZU1vYmlsZVBob25lKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBUaGVyZSBpcyBubyBhcHByb3ByaWF0ZSBwcm9wZXJ0eSBmb3IgZXhwcmVzc2luZwotICAgICAgICAgICAgLy8gICAgICAgcGhvbmV0aWMgbmFtZSAoWW9taWdhbmEgaW4gSmFwYW5lc2UpIGluIHZDYXJkIDIuMSwgd2hpbGUgdGhlcmUgaXMgaW4KLSAgICAgICAgICAgIC8vICAgICAgIHZDYXJkIDMuMCAoU09SVC1TVFJJTkcpLgotICAgICAgICAgICAgLy8gICAgICAgV2UgdXNlIERvQ29NbydzIHdheSB3aGVuIHRoZSBkZXZpY2UgaXMgSmFwYW5lc2Ugb25lIHNpbmNlIGl0IGlzIGFscmVhZHkKLSAgICAgICAgICAgIC8vICAgICAgIHN1cHBvcnRlZCBieSBhIGxvdCBvZiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzLgotICAgICAgICAgICAgLy8gICAgICAgVGhpcyBpcyAiWC0iIHByb3BlcnR5LCBzbyBhbnkgcGFyc2VyIGhvcGVmdWxseSB3b3VsZCBub3QgZ2V0Ci0gICAgICAgICAgICAvLyAgICAgICBjb25mdXNlZCB3aXRoIHRoaXMuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gICAgICAgQWxzbywgRG9Db01vJ3Mgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB2Q2FyZCBjb21wb3NlciB0byB1c2UganVzdCB0aGUgZmlyc3QKLSAgICAgICAgICAgIC8vICAgICAgIGNvbHVtbi4KLSAgICAgICAgICAgIC8vICAgICAgIGkuZS4KLSAgICAgICAgICAgIC8vICAgICAgIGdvb2Q6ICBTT1VORDtYLUlSTUMtTjpNaXlha2F3YSBEYWlzdWtlOzs7OwotICAgICAgICAgICAgLy8gICAgICAgYmFkIDogIFNPVU5EO1gtSVJNQy1OOk1peWFrYXdhO0RhaXN1a2U7OzsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1VORCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKTsKLQotICAgICAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICghbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNHaXZlbk5hbWUpKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUsIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBmYW1pbHk7Z2l2ZW4KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBnaXZlbjttaWRkbGUKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBtaWRkbGU7cHJlZml4Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gcHJlZml4O3N1ZmZpeAotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfQotCi0gICAgICAgIExvZy5kKCJAQEAiLCAiaG9nZSIpOwotICAgICAgICBpZiAobVVzZXNEZWZhY3RQcm9wZXJ0eSkgewotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHBob25ldGljR2l2ZW5OYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX0ZJUlNUX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0gIC8vIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpKQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwaG9uZXRpY01pZGRsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9ICAvLyBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocGhvbmV0aWNGYW1pbHlOYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHBob25ldGljRmFtaWx5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0gIC8vIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSkKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTmlja05hbWVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiB1c2VBbmRyb2lkUHJvcGVydHk7Ci0gICAgICAgIGlmIChtSXNWMzBPclY0MCkgeyAgIC8vIFRoZXNlIHNwZWNpZmljYXRpb25zIGhhdmUgTklDS05BTUUgcHJvcGVydHkuCi0gICAgICAgICAgICB1c2VBbmRyb2lkUHJvcGVydHkgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChtVXNlc0FuZHJvaWRQcm9wZXJ0eSkgewotICAgICAgICAgICAgdXNlQW5kcm9pZFByb3BlcnR5ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gd2F5IHRvIGFkZCB0aGlzIGZpZWxkLgotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmlja25hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE5pY2tuYW1lLk5BTUUpOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShuaWNrbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh1c2VBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05JQ0tOQU1FLCBuaWNrbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUGhvbmVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBwaG9uZUxpbmVFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHBob25lU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzT2JqZWN0ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoUGhvbmUuVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhQaG9uZS5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihQaG9uZS5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhQaG9uZS5OVU1CRVIpOwotICAgICAgICAgICAgICAgIGlmIChwaG9uZU51bWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVyID0gcGhvbmVOdW1iZXIudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGhvbmVOdW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFBBR0VSIG51bWJlciBuZWVkcyB1bmZvcm1hdHRlZCAicGhvbmUgbnVtYmVyIi4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9ICh0eXBlQXNPYmplY3QgIT0gbnVsbCA/IHR5cGVBc09iamVjdCA6IERFRkFVTFRfUEhPTkVfVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9QQUdFUiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcucmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZUxpbmVFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBob25lU2V0LmNvbnRhaW5zKHBob25lTnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXQuYWRkKHBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRlbExpbmUodHlwZSwgbGFiZWwsIHBob25lTnVtYmVyLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25lTnVtYmVyTGlzdCA9IHNwbGl0QW5kVHJpbVBob25lTnVtYmVycyhwaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaG9uZU51bWJlckxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwaG9uZUxpbmVFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBhY3R1YWxQaG9uZU51bWJlciA6IHBob25lTnVtYmVyTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwaG9uZVNldC5jb250YWlucyhhY3R1YWxQaG9uZU51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0ID0gVkNhcmRVdGlscy5nZXRQaG9uZU51bWJlckZvcm1hdChtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkUGhvbmVOdW1iZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoYWN0dWFsUGhvbmVOdW1iZXIsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXQuYWRkKGFjdHVhbFBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUZWxMaW5lKHR5cGUsIGxhYmVsLCBmb3JtYXR0ZWRQaG9uZU51bWJlciwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSAgLy8gZm9yIChTdHJpbmcgYWN0dWFsUGhvbmVOdW1iZXIgOiBwaG9uZU51bWJlckxpc3QpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXBob25lTGluZUV4aXN0cyAmJiBtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZFRlbExpbmUoUGhvbmUuVFlQRV9IT01FLCAiIiwgIiIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBleHByZXNzaW5nIHBob25lIG51bWJlcnMgaW50byBzZXZlcmFsIHN0cmluZ3MsIGFuZCByZW1vdmUKLSAgICAgKiB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzIGluc2lkZSB0aGVtLiBUaGUgc2l6ZSBvZiBhIHJldHVybmVkIGxpc3QgYmVjb21lcyAxIHdoZW4KLSAgICAgKiBubyBzcGxpdCBpcyBuZWVkZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBnaXZlbiBudW1iZXIgIm1heSIgaGF2ZSBzZXZlcmFsIHBob25lIG51bWJlcnMgd2hlbiB0aGUgY29udGFjdCBlbnRyeSBpcyBjb3JydXB0ZWQKLSAgICAgKiBiZWNhdXNlIG9mIGl0cyBvcmlnaW5hbCBzb3VyY2UuCi0gICAgICogZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSlcbjQ0NC01NTUtNjY2NiAoQnJvd2FyZDsgMzA1LTY1My02Nzk2IChNaWFtaSkiCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMga2luZCBvZiAicGhvbmUgbnVtYmVycyIgd2lsbCBub3QgYmUgY3JlYXRlZCB3aXRoIEFuZHJvaWQgdkNhcmQgaW1wbGVtZW50YXRpb24sCi0gICAgICogYnV0IHdlIG1heSBlbmNvdW50ZXIgdGhlbSBpZiB0aGUgc291cmNlIG9mIHRoZSBpbnB1dCBkYXRhIGhhcyBhbHJlYWR5IGNvcnJ1cHRlZAotICAgICAqIGltcGxlbWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUbyBoYW5kbGUgdGhpcyBjYXNlLCB0aGlzIG1ldGhvZCBmaXJzdCBzcGxpdHMgaXRzIGlucHV0IGludG8gbXVsdGlwbGUgcGFydHMKLSAgICAgKiAoZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSkiLCAiNDQ0LTU1NS02NjY2IChCcm93YXJkIiwgYW5kIDMwNTY1My02Nzk2IChNaWFtaSkiKSBhbmQKLSAgICAgKiByZW1vdmVzIHVubmVjZXNzYXJ5IHN0cmluZ3MgbGlrZSAiKE1pYW1pKSIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdHJpbW1pbmcgaXMgaW5hcHByb3ByaWF0ZSBmb3IgaXRzIHJlY2VpdmVycy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3BsaXRBbmRUcmltUGhvbmVOdW1iZXJzKGZpbmFsIFN0cmluZyBwaG9uZU51bWJlcikgewotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGhvbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHBob25lTnVtYmVyLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gcGhvbmVOdW1iZXIuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNoKSB8fCBjaCA9PSAnKycpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChjaCA9PSAnOycgfHwgY2ggPT0gJ1xuJykgJiYgYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwaG9uZUxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBwaG9uZUxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGhvbmVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kRW1haWxzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBlbWFpbEFkZHJlc3NFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFkZHJlc3NTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRW1haWwuREFUQSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVtYWlsQWRkcmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtYWlsQWRkcmVzcyA9IGVtYWlsQWRkcmVzcy50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShlbWFpbEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHR5cGVBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEVtYWlsLlRZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gKHR5cGVBc09iamVjdCAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc09iamVjdCA6IERFRkFVTFRfRU1BSUxfVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhFbWFpbC5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFbWFpbC5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZW1haWxBZGRyZXNzRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3NTZXQuY29udGFpbnMoZW1haWxBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzU2V0LmFkZChlbWFpbEFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICBhcHBlbmRFbWFpbExpbmUodHlwZSwgbGFiZWwsIGVtYWlsQWRkcmVzcywgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVtYWlsQWRkcmVzc0V4aXN0cyAmJiBtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZEVtYWlsTGluZShFbWFpbC5UWVBFX0hPTUUsICIiLCAiIiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRQb3N0YWxzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZFBvc3RhbHNGb3JEb0NvTW8oY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRQb3N0YWxzRm9yR2VuZXJpYyhjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgSW50ZWdlcj4gc1Bvc3RhbFR5cGVQcmlvcml0eU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSwgMCk7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLLCAxKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSLCAyKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSwgMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gYXBwZW5kIGp1c3Qgb25lIGxpbmUuIElmIHRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWRkcmVzcwotICAgICAqIGluZm9ybWF0aW9uLCBhcHBlbmQgYW4gZW1wdHkgbGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUG9zdGFsc0ZvckRvQ29NbyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGludCBjdXJyZW50UHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgaW50IGN1cnJlbnRUeXBlID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY3VycmVudENvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUpOwotICAgICAgICAgICAgZmluYWwgSW50ZWdlciBwcmlvcml0eUFzSW50ZWdlciA9IHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAuZ2V0KHR5cGVBc0ludGVnZXIpOwotICAgICAgICAgICAgZmluYWwgaW50IHByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgKHByaW9yaXR5QXNJbnRlZ2VyICE9IG51bGwgPyBwcmlvcml0eUFzSW50ZWdlciA6IEludGVnZXIuTUFYX1ZBTFVFKTsKLSAgICAgICAgICAgIGlmIChwcmlvcml0eSA8IGN1cnJlbnRQcmlvcml0eSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgICAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gdHlwZUFzSW50ZWdlcjsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgaWYgKHByaW9yaXR5ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTaG91bGQgbm90IGNvbWUgaGVyZS4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwb3N0YWwgZGF0YS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGN1cnJlbnRDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwpOwotICAgICAgICBhcHBlbmRQb3N0YWxMaW5lKGN1cnJlbnRUeXBlLCBsYWJlbCwgY3VycmVudENvbnRlbnRWYWx1ZXMsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUG9zdGFsc0ZvckdlbmVyaWMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSAodHlwZUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzSW50ZWdlciA6IERFRkFVTFRfUE9TVEFMX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMKTsKLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICBhcHBlbmRQb3N0YWxMaW5lKHR5cGUsIGxhYmVsLCBjb250ZW50VmFsdWVzLCBpc1ByaW1hcnksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvc3RhbFN0cnVjdCB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhZGRyZXNzRGF0YTsKLSAgICAgICAgcHVibGljIFBvc3RhbFN0cnVjdChmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQsIGZpbmFsIFN0cmluZyBhZGRyZXNzRGF0YSkgewotICAgICAgICAgICAgdGhpcy5yZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSByZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgICAgICB0aGlzLmFwcGVuZENoYXJzZXQgPSBhcHBlbmRDaGFyc2V0OwotICAgICAgICAgICAgdGhpcy5hZGRyZXNzRGF0YSA9IGFkZHJlc3NEYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBudWxsIHdoZW4gdGhlcmUncyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gY29uc3RydWN0IHRoZSBkYXRhLgotICAgICAqLwotICAgIHByaXZhdGUgUG9zdGFsU3RydWN0IHRyeUNvbnN0cnVjdFBvc3RhbFN0cnVjdChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgLy8gYWRyLXZhbHVlICAgID0gMCo2KHRleHQtdmFsdWUgIjsiKSB0ZXh0LXZhbHVlCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkcmVzcywgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgIGZpbmFsIFN0cmluZyByYXdQb0JveCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdOZWlnaGJvcmhvb2QgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTkVJR0hCT1JIT09EKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1N0cmVldCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TG9jYWxpdHkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdSZWdpb24gPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1Bvc3RhbENvZGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3Q291bnRyeSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcmF3QWRkcmVzc0FycmF5ID0gbmV3IFN0cmluZ1tdewotICAgICAgICAgICAgICAgIHJhd1BvQm94LCByYXdOZWlnaGJvcmhvb2QsIHJhd1N0cmVldCwgcmF3TG9jYWxpdHksCi0gICAgICAgICAgICAgICAgcmF3UmVnaW9uLCByYXdQb3N0YWxDb2RlLCByYXdDb3VudHJ5fTsKLSAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmFyZUFsbEVtcHR5KHJhd0FkZHJlc3NBcnJheSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd0FkZHJlc3NBcnJheSkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0ID0KLSAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShyYXdBZGRyZXNzQXJyYXkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQb0JveDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkU3RyZWV0OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRMb2NhbGl0eTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUmVnaW9uOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQb3N0YWxDb2RlOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRDb3VudHJ5OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWROZWlnaGJvcmhvb2Q7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdMb2NhbGl0eTI7Ci0gICAgICAgICAgICAvLyBUaGlzIGxvb2tzIGluZWZmaWNpZW50IHNpbmNlIHdlIGVuY29kZSByYXdMb2NhbGl0eSBhbmQgcmF3TmVpZ2hib3Job29kIHR3aWNlLAotICAgICAgICAgICAgLy8gYnV0IHRoaXMgaXMgaW50ZW50aW9uYWwuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gUVAgZW5jb2RpbmcgbWF5IGFkZCBsaW5lIGZlZWRzIHdoZW4gbmVlZGVkIGFuZCB0aGUgcmVzdWx0IG9mCi0gICAgICAgICAgICAvLyAtIGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdMb2NhbGl0eSArICIgIiArIHJhd05laWdoYm9yaG9vZCkKLSAgICAgICAgICAgIC8vIG1heSBiZSBkaWZmZXJlbnQgZnJvbQotICAgICAgICAgICAgLy8gLSBlbmNvZGVkTG9jYWxpdHkgKyAiICIgKyBlbmNvZGVkTmVpZ2hib3Job29kLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFdlIHVzZSBzYWZlciB3YXkuCi0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3TG9jYWxpdHkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd05laWdoYm9yaG9vZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gIiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TmVpZ2hib3Job29kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd05laWdoYm9yaG9vZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TG9jYWxpdHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TG9jYWxpdHkgKyAiICIgKyByYXdOZWlnaGJvcmhvb2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRQb0JveCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdQb0JveCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN0cmVldCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdTdHJlZXQpOwotICAgICAgICAgICAgICAgIGVuY29kZWRMb2NhbGl0eSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdMb2NhbGl0eTIpOwotICAgICAgICAgICAgICAgIGVuY29kZWRSZWdpb24gPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UmVnaW9uKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9zdGFsQ29kZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdQb3N0YWxDb2RlKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkQ291bnRyeSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdDb3VudHJ5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvQm94ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdQb0JveCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN0cmVldCA9IGVzY2FwZUNoYXJhY3RlcnMocmF3U3RyZWV0KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTG9jYWxpdHkgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0xvY2FsaXR5Mik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFJlZ2lvbiA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UmVnaW9uKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9zdGFsQ29kZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZENvdW50cnkgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0NvdW50cnkpOwotICAgICAgICAgICAgICAgIGVuY29kZWROZWlnaGJvcmhvb2QgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd05laWdoYm9yaG9vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGFkZHJlc3NCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkUG9Cb3gpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIFBPIEJPWCA7IEV4dGVuZGVkIEFkZHJlc3MKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBFeHRlbmRlZCBBZGRyZXNzIDogU3RyZWV0Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZFN0cmVldCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gU3RyZWV0IDogTG9jYWxpdHkKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkTG9jYWxpdHkpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIExvY2FsaXR5IDogUmVnaW9uCi0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZFJlZ2lvbik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gUmVnaW9uIDogUG9zdGFsIENvZGUKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkUG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gUG9zdGFsIENvZGUgOiBDb3VudHJ5Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZENvdW50cnkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3N0YWxTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSwgYXBwZW5kQ2hhcnNldCwgYWRkcmVzc0J1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZWxzZSB7ICAvLyBWQ2FyZFV0aWxzLmFyZUFsbEVtcHR5KHJhd0FkZHJlc3NBcnJheSkgPT0gdHJ1ZQotICAgICAgICAgICAgLy8gVHJ5IHRvIHVzZSBGT1JNQVRURURfQUREUkVTUyBpbnN0ZWFkLgotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd0Zvcm1hdHRlZEFkZHJlc3MgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUyk7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3Rm9ybWF0dGVkQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd0Zvcm1hdHRlZEFkZHJlc3MpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3M7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3MgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBzZWNvbmQgdmFsdWUgKCJFeHRlbmRlZCBBZGRyZXNzIikganVzdCBiZWNhdXNlIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMKLSAgICAgICAgICAgIC8vIGRvIHNvLiBJZiB0aGUgb3RoZXIgaW1wb3J0ZXIgZXhwZWN0cyB0aGUgdmFsdWUgYmUgaW4gdGhlIG90aGVyIGZpZWxkLCBzb21lIGZsYWcgbWF5Ci0gICAgICAgICAgICAvLyBiZSBuZWVkZWQuCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGFkZHJlc3NCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBQTyBCT1ggOyBFeHRlbmRlZCBBZGRyZXNzCi0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIEV4dGVuZGVkIEFkZHJlc3MgOiBTdHJlZXQKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBTdHJlZXQgOiBMb2NhbGl0eQotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIExvY2FsaXR5IDogUmVnaW9uCi0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gUmVnaW9uIDogUG9zdGFsIENvZGUKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBQb3N0YWwgQ29kZSA6IENvdW50cnkKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zdGFsU3RydWN0KAotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsIGFwcGVuZENoYXJzZXQsIGFkZHJlc3NCdWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRJbXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgcHJvdG9jb2xBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLlBST1RPQ09MKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xBc09iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lID0gVkNhcmRVdGlscy5nZXRQcm9wZXJ0eU5hbWVGb3JJbShwcm90b2NvbEFzT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhJbS5EQVRBKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZUFzU3RyaW5nOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZUFzSW50ZWdlciAhPSBudWxsID8gdHlwZUFzSW50ZWdlciA6IEltLlRZUEVfT1RIRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhJbS5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gKGxhYmVsICE9IG51bGwgPyAiWC0iICsgbGFiZWwgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9PVEhFUjogIC8vIElnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodHlwZUFzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh0eXBlQXNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFdlYnNpdGVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2Vic2l0ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoV2Vic2l0ZS5VUkwpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJzaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd2Vic2l0ZSA9IHdlYnNpdGUudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBhbnkgcGFyYW1ldGVyIGFkZGl0aW9uIHRvd2FyZCAiVVJMIgotICAgICAgICAgICAgICAgIC8vICAgICAgIHByb3BlcnR5LCB3aGlsZSB0aGVyZSdzIG5vIGRvY3VtZW50IGluIHZDYXJkIDIuMS4KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHdlYnNpdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1VSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kT3JnYW5pemF0aW9ucyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBhbnkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5DT01QQU5ZKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBhbnkgPSBjb21wYW55LnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlcGFydG1lbnQgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5UKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVwYXJ0bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQgPSBkZXBhcnRtZW50LnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhPcmdhbml6YXRpb24uVElUTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgb3JnQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjb21wYW55KSkgewotICAgICAgICAgICAgICAgICAgICBvcmdCdWlsZGVyLmFwcGVuZChjb21wYW55KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZXBhcnRtZW50KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAob3JnQnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZ0J1aWxkZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3JnQnVpbGRlci5hcHBlbmQoZGVwYXJ0bWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvcmdsaW5lID0gb3JnQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfT1JHLCBvcmdsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkob3JnbGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkob3JnbGluZSkpKTsKLQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVElUTEUsIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHRpdGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHRpdGxlKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFBob3RvcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBjb250ZW50VmFsdWVzLmdldEFzQnl0ZUFycmF5KFBob3RvLlBIT1RPKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGhvdG9UeXBlID0gVkNhcmRVdGlscy5ndWVzc0ltYWdlVHlwZShkYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9UeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlVua25vd24gcGhvdG8gdHlwZS4gSWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHRoaXMgd29ya3MgZmluZS4KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGhvdG9TdHJpbmcgPSBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGUoZGF0YSwgQmFzZTY0Lk5PX1dSQVApKTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob3RvU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRQaG90b0xpbmUocGhvdG9TdHJpbmcsIHBob3RvVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTm90ZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG5vdGVCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBub3RlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOb3RlLk5PVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobm90ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RlID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vdGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlQnVpbGRlci5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RlQnVpbGRlci5hcHBlbmQobm90ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5vdGVTdHIgPSBub3RlQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgd2Ugc2NhbiBub3RlU3RyIGNvbXBsZXRlbHkgdHdpY2UsIHdoaWNoIGlzIHJlZHVuZGFudC4KLSAgICAgICAgICAgICAgICAvLyBCdXQgZm9yIG5vdywgd2UgYXNzdW1lIHRoaXMgaXMgbm90IHNvIHRpbWUtY29uc3VtaW5nLi4KLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkobm90ZVN0cik7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobm90ZVN0cikpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTk9URSwgbm90ZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvLCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBub3RlU3RyID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOb3RlLk5PVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG5vdGVTdHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkobm90ZVN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobm90ZVN0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFLCBub3RlU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbywgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEV2ZW50cyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIC8vIFRoZXJlJ3MgcG9zc2liaWxpdHkgd2hlcmUgYSBnaXZlbiBvYmplY3QgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBiaXJ0aGRheSwgd2hpY2gKLSAgICAgICAgLy8gaXMgaW5hcHByb3ByaWF0ZS4gV2UganVzdCBidWlsZCBvbmUgYmlydGhkYXkuCi0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJpbWFyeUJpcnRoZGF5ID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBzZWNvbmRhcnlCaXJ0aGRheSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBldmVudFR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFdmVudC5UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZXZlbnRUeXBlOwotICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGVBc0ludGVnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBldmVudFR5cGVBc0ludGVnZXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRXZlbnQuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBFdmVudC5UWVBFX0JJUlRIREFZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBiaXJ0aGRheUNhbmRpZGF0ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRXZlbnQuU1RBUlRfREFURSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaXJ0aGRheUNhbmRpZGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEV2ZW50LklTX1NVUEVSX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU3VwZXJQcmltYXJ5ID0gKGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdXBlclByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJzdXBlciBwcmltYXJ5IiBiaXJ0aGRheSBzaG91bGQgdGhlIHByZWZlcmVkIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRXZlbnQuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGJyZWFrIGhlcmUgc2luY2UgInN1cGVyIHByaW1hcnkiIGJpcnRoZGF5IG1heSBleGlzdCBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZGFyeUJpcnRoZGF5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGVudHJ5IGlzIHNldCB0byB0aGUgInNlY29uZGFyeSIgY2FuZGlkYXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZXNBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgdHlwZXMgb3RoZXIgdGhhbiBCaXJ0aGRheSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHZDYXJkLgotICAgICAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShFdmVudC5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByaW1hcnlCaXJ0aGRheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheS50cmltKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRhcnlCaXJ0aGRheSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5QmlydGhkYXkudHJpbSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFJlbGF0aW9uKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKG1Vc2VzQW5kcm9pZFByb3BlcnR5ICYmIGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVtaXRFdmVyeVRpbWUgSWYgdHJ1ZSwgYnVpbGRlciBidWlsZHMgdGhlIGxpbmUgZXZlbiB3aGVuIHRoZXJlJ3Mgbm8gZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kUG9zdGFsTGluZShmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnksIGZpbmFsIGJvb2xlYW4gZW1pdEV2ZXJ5VGltZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0OwotICAgICAgICBmaW5hbCBTdHJpbmcgYWRkcmVzc1ZhbHVlOwotICAgICAgICB7Ci0gICAgICAgICAgICBQb3N0YWxTdHJ1Y3QgcG9zdGFsU3RydWN0ID0gdHJ5Q29uc3RydWN0UG9zdGFsU3RydWN0KGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgaWYgKHBvc3RhbFN0cnVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVtaXRFdmVyeVRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZENoYXJzZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1ZhbHVlID0gIiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gcG9zdGFsU3RydWN0LnJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgICAgICAgICBhcHBlbmRDaGFyc2V0ID0gcG9zdGFsU3RydWN0LmFwcGVuZENoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgYWRkcmVzc1ZhbHVlID0gcG9zdGFsU3RydWN0LmFkZHJlc3NEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGxhYmVsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3Qgc3VyZSB3aGV0aGVyIHRoZSBsYWJlbCBpcyB2YWxpZCBpbiB0aGUgc3BlYwotICAgICAgICAgICAgICAgICAgICAvLyAoIklBTkEtdG9rZW4iIGluIHRoZSB2Q2FyZCAzLjAgaXMgdW5jbGVhci4uLikKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCAgZm9yIHNhZmV0eSwgd2UgYWRkICJYLSIgYXQgdGhlIGJlZ2dpbmluZyBvZiBlYWNoIGxhYmVsLgotICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIGNoZWNrcyB0aGUgbGFiZWwgb2JleXMgd2l0aCB2Q2FyZCAzLjAgc3BlYy4KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoIlgtIiArIGxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIFN0cnVjdHVyZWRQb3N0YWwgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUik7Ci0gICAgICAgIGlmICghcGFyYW1ldGVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFwcGVuZENoYXJzZXQpIHsKLSAgICAgICAgICAgIC8vIFN0cmljdGx5LCB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgZXhwb3J0ZXJzIHRvIGVtaXQgY2hhcnNldCBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgIC8vIGJ1dCB3ZSB3aWxsIGFkZCBpdCBzaW5jZSB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHVzZWZ1bCBmb3IgaW1wb3J0ZXJzLAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEFzc3VtZSBubyBwYXJzZXIgZG9lcyBub3QgZW1pdCBlcnJvciB3aXRoIHRoaXMgcGFyYW1ldGVyIGluIHZDYXJkIDMuMC4KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoYWRkcmVzc1ZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRFbWFpbExpbmUoZmluYWwgaW50IHR5cGUsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVBc1N0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgaWYgKFZDYXJkVXRpbHMuaXNNb2JpbGVQaG9uZUxhYmVsKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9ICJYLSIgKyBsYWJlbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX01PQklMRTogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBFbWFpbCB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0eXBlQXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh0eXBlQXNTdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRU1BSUwsIHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICAgICAgcmF3VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRlbExpbmUoZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyLCBmaW5hbCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVEVMKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0KLSAgICAgICAgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIGlmICh0eXBlQXNJbnRlZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX09USEVSOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHlwZSA9IHR5cGVBc0ludGVnZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9GQVhfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfRkFYX1dPUks6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01PQklMRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfUEFHRVI6IHsKLSAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSByZWFzb24sIGJ1dCBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBoYWQKLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCAiVk9JQ0UiIGluc3RlYWQgb2YgIlBBR0VSIgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DQVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfQ09NUEFOWV9NQUlOOiB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyByZWxldmFudCBmaWVsZCBpbiB2Q2FyZCAoYXQgbGVhc3QgMi4xKS4KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspOwotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfSVNETjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSVNETik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTUFJTjogewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfT1RIRVJfRkFYOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1RFTEVYOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9UTFgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1dPUktfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SS19QQUdFUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgLy8gU2VlIGFib3ZlLgotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01NUzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTVNHKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIHRoZSBjdXN0b20gdHlwZS4KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChWQ2FyZFV0aWxzLmlzTW9iaWxlUGhvbmVMYWJlbChsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc1YzME9yVjQwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbGFiZWwgaXMgYXBwcm9wcmlhdGVseSBlbmNvZGVkIGluIGFwcGVuZFR5cGVQYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChsYWJlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVwcGVyTGFiZWwgPSBsYWJlbC50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoVkNhcmRVdGlscy5pc1ZhbGlkSW5WMjFCdXRVbmtub3duVG9Db250YWN0c1Bob3RlVHlwZSh1cHBlckxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQodXBwZXJMYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogU3RyaWN0bHksIHZDYXJkIDIuMSBkb2VzIG5vdCBhbGxvdyAiWC0iIHBhcmFtZXRlciB3aXRob3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAiVFlQRT0iIHN0cmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKCJYLSIgKyBsYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfUkFESU86Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfVFRZX1RERDoKLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFwcGVuZFVuY29tbW9uUGhvbmVUeXBlKG1CdWlsZGVyLCB0eXBlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKHBhcmFtZXRlckxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBwaG9uZSB0eXBlIHN0cmluZyB3aGljaCBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFVuY29tbW9uUGhvbmVUeXBlKGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgZmluYWwgSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBmb3IgRG9Db01vIGhhZCBiZWVuIGNvbnNlcnZhdGl2ZQotICAgICAgICAgICAgLy8gYWJvdXQgbWlzY2VsbGFuZW91cyB0eXBlcy4KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHBob25lVHlwZSA9IFZDYXJkVXRpbHMuZ2V0UGhvbmVUeXBlU3RyaW5nKHR5cGUpOwotICAgICAgICAgICAgaWYgKHBob25lVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcihwaG9uZVR5cGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBvciB1bnN1cHBvcnRlZCAoYnkgdkNhcmQpIFBob25lIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbmNvZGVkVmFsdWUgTXVzdCBiZSBlbmNvZGVkIGJ5IEJBU0U2NCAKLSAgICAgKiBAcGFyYW0gcGhvdG9UeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kUGhvdG9MaW5lKGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWUsIGZpbmFsIFN0cmluZyBwaG90b1R5cGUpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciB0bXBCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfUEhPVE8pOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICBpZiAobUlzVjMwT3JWNDApIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9BU19CKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMjEpOwotICAgICAgICB9Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIodG1wQnVpbGRlciwgcGhvdG9UeXBlKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyB0bXBTdHIgPSB0bXBCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIHRtcEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnQgbGluZUNvdW50ID0gMDsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRtcFN0ci5sZW5ndGgoKTsKLSAgICAgICAgZmluYWwgaW50IG1heE51bUZvckZpcnN0TGluZSA9IFZDYXJkQ29uc3RhbnRzLk1BWF9DSEFSQUNURVJfTlVNU19CQVNFNjRfVjMwCi0gICAgICAgICAgICAgICAgLSBWQ0FSRF9FTkRfT0ZfTElORS5sZW5ndGgoKTsKLSAgICAgICAgZmluYWwgaW50IG1heE51bUluR2VuZXJhbCA9IG1heE51bUZvckZpcnN0TGluZSAtIFZDQVJEX1dTLmxlbmd0aCgpOwotICAgICAgICBpbnQgbWF4TnVtID0gbWF4TnVtRm9yRmlyc3RMaW5lOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCh0bXBTdHIuY2hhckF0KGkpKTsKLSAgICAgICAgICAgIGxpbmVDb3VudCsrOwotICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA+IG1heE51bSkgewotICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9XUyk7Ci0gICAgICAgICAgICAgICAgbWF4TnVtID0gbWF4TnVtSW5HZW5lcmFsOwotICAgICAgICAgICAgICAgIGxpbmVDb3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKHRtcEJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBpZiAoIXNBbGxvd2VkQW5kcm9pZFByb3BlcnR5U2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoImRhdGEiICsgaSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByYXdWYWx1ZUxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgKG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FORFJPSURfQ1VTVE9NKTsKLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1pbWVUeXBlKTsgIC8vIFNob3VsZCBub3QgYmUgZW5jb2RlZC4KLSAgICAgICAgZm9yIChTdHJpbmcgcmF3VmFsdWUgOiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogb25lIGxpbmUgbWF5IGJlIHRvbyBodWdlLCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiB2Q2FyZCAzLjAKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKHdoaWNoIHNheXMgIldoZW4gZ2VuZXJhdGluZyBhIGNvbnRlbnQgbGluZSwgbGluZXMgbG9uZ2VyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgNzUgY2hhcmFjdGVycyBTSE9VTEQgYmUgZm9sZGVkIiksIHRob3VnaCBzZXZlcmFsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbigKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZUxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd1ZhbHVlKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWUpKTsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICAgICAgcmF3VmFsdWUsIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBib29sZWFuIG5lZWRDaGFyc2V0ID0KLSAgICAgICAgICAgIChtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgb25lIGxpbmUgd2l0aCBhIGdpdmVuIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHJhd1ZhbHVlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcmF3VmFsdWVMaXN0LCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZSwgbmVlZENoYXJzZXQsIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdCAhPSBudWxsICYmIHBhcmFtZXRlckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZTsKLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgc3BlYywgdGhvdWdoCi0gICAgICAgICAgICAvLyAgICAgICBzZXZlcmFsIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGF0IHZpb2xhdGlvbi4KLSAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwgYm9vbGVhbiBuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZUxpc3QsIG5lZWRDaGFyc2V0LCBuZWVkUXVvdGVkUHJpbnRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICBtQnVpbGRlci5hcHBlbmQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlckxpc3QgIT0gbnVsbCAmJiBwYXJhbWV0ZXJMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIHJhd1ZhbHVlIDogcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlOwotICAgICAgICAgICAgaWYgKG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3VmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBvbmUgbGluZSBtYXkgYmUgdG9vIGh1Z2UsIHdoaWNoIG1heSBiZSBpbnZhbGlkIGluIHZDYXJkIDMuMAotICAgICAgICAgICAgICAgIC8vICAgICAgICAod2hpY2ggc2F5cyAiV2hlbiBnZW5lcmF0aW5nIGEgY29udGVudCBsaW5lLCBsaW5lcyBsb25nZXIgdGhhbgotICAgICAgICAgICAgICAgIC8vICAgICAgICA3NSBjaGFyYWN0ZXJzIFNIT1VMRCBiZSBmb2xkZWQiKSwgdGhvdWdoIHNldmVyYWwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKGV2ZW4gd2VsbC1rbm93bikgYXBwbGljYXRpb25zIGRvIG5vdCBjYXJlIHRoaXMuCi0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiBtdXN0IGJlIGFwcGVuZGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBiZWluZyBjYWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKGZpbmFsIExpc3Q8U3RyaW5nPiB0eXBlcykgewotICAgICAgICAvLyBXZSBtYXkgaGF2ZSB0byBtYWtlIHRoaXMgY29tbWEgc2VwYXJhdGVkIGZvcm0gbGlrZSAiVFlQRT1ET00sV09SSyIgaW4gdGhlIGZ1dHVyZSwKLSAgICAgICAgLy8gd2hpY2ggd291bGQgYmUgcmVjb21tZW5kZWQgd2F5IGluIHZjYXJkIDMuMCB0aG91Z2ggbm90IHZhbGlkIGluIHZDYXJkIDIuMS4KLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHR5cGVWYWx1ZSA6IHR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZCA9IFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUodHlwZVZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogdkNhcmQgMy4wIHNwZWNpZmllcyB0aGUgZGlmZmVyZW50IHR5cGUgb2YgYWNjZXB0YWJsZSB0eXBlIFN0cmluZ3MsIGJ1dAotICAgICAgICAgICAgICAgIC8vICAgICAgIHdlIGRvbid0IGVtaXQgdGhhdCBraW5kIG9mIHZDYXJkIDMuMCBzcGVjaWZpYyB0eXBlIHNpbmNlIHRoZXJlIHNob3VsZCBiZQotICAgICAgICAgICAgICAgIC8vICAgICAgIGhpZ2ggcHJvYmFiaWx5dHkgaW4gd2hpY2ggZXh0ZXJuYWwgaW1wb3J0ZXJzIGNhbm5vdCB1bmRlcnN0YW5kIHRoZW0uCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBlLmcuIFRZUEU9Ilx1NTc4Qlx1MzA2Qlx1MzA4NyIgKHZDYXJkIDMuMCBhbGxvd3Mgbm9uLUFzY2lpIGNoYXJhY3RlcnMgaWYgdGhleQotICAgICAgICAgICAgICAgIC8vICAgICAgYXJlIHF1b3RlZC4pCi0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIoZW5jb2RlZCk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAgLy8gdkNhcmQgMi4xCi0gICAgICAgICAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmlzVjIxV29yZCh0eXBlVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcih0eXBlVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkNBUkRfUEFSQU1fU0VQQVJBVE9SIG11c3QgYmUgYXBwZW5kZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGJlaW5nIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVHlwZVBhcmFtZXRlcihmaW5hbCBTdHJpbmcgdHlwZSkgewotICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKG1CdWlsZGVyLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVHlwZVBhcmFtZXRlcihmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIC8vIFJlZnJhaW4gZnJvbSB1c2luZyBhcHBlbmRUeXBlKCkgc28gdGhhdCAiVFlQRT0iIGlzIG5vdCBiZSBhcHBlbmRlZCB3aGVuIHRoZQotICAgICAgICAvLyBkZXZpY2UgaXMgRG9Db01vJ3MgKGp1c3QgZm9yIHNhZmV0eSkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vdGU6IEluIHZDYXJkIDMuMCwgVHlwZSBzdHJpbmdzIGFsc28gY2FuIGJlIGxpa2UgdGhpczogIlRZUEU9SE9NRSxQUkVGIgotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAobVZDYXJkVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAoKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpIHx8IG1BcHBlbmRUeXBlUGFyYW1OYW1lKSAmJiAhbUlzRG9Db01vKSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSkuYXBwZW5kKFZDQVJEX1BBUkFNX0VRVUFMKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLmFwcGVuZCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcHJvcGVydHkgbGluZSBzaG91bGQgY29udGFpbiBjaGFyc2V0IHBhcmFtZXRlcgotICAgICAqIGluZm9ybWF0aW9uLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRydWUgZXZlbiB3aGVuIHZDYXJkIHZlcnNpb24gaXMgMy4wLgotICAgICAqCi0gICAgICogU3RyaWN0bHksIGFkZGluZyBjaGFyc2V0IGluZm9ybWF0aW9uIGlzIGludmFsaWQgaW4gVkNhcmQgMy4wLgotICAgICAqIEhvd2V2ZXIgd2UnbGwgYWRkIHRoZSBpbmZvIG9ubHkgd2hlbiBjaGFyc2V0IHdlIHVzZSBpcyBub3QgVVRGLTgKLSAgICAgKiBpbiB2Q2FyZCAzLjAgZm9ybWF0LCBzaW5jZSBwYXJzZXIgc2lkZSBtYXkgYmUgYWJsZSB0byB1c2UgdGhlIGNoYXJzZXQKLSAgICAgKiB2aWEgdGhpcyBmaWVsZCwgdGhvdWdoIHdlIG1heSBlbmNvdW50ZXIgYW5vdGhlciBwcm9ibGVtIGJ5IGFkZGluZyBpdC4KLSAgICAgKgotICAgICAqIGUuZy4gSmFwYW5lc2UgbW9iaWxlIHBob25lcyB1c2UgU2hpZnRfSmlzIHdoaWxlIFJGQyAyNDI2Ci0gICAgICogcmVjb21tZW5kcyBVVEYtOC4gQnkgYWRkaW5nIHRoaXMgZmllbGQsIHBhcnNlcnMgbWF5IGJlIGFibGUKLSAgICAgKiB0byBrbm93IHRoaXMgdGV4dCBpcyBOT1QgVVRGLTggYnV0IFNoaWZ0X0ppcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKFN0cmluZy4uLnByb3BlcnR5VmFsdWVMaXN0KSB7Ci0gICAgICAgIGlmICghbVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU3RyaW5nIHByb3BlcnR5VmFsdWUgOiBwcm9wZXJ0eVZhbHVlTGlzdCkgewotICAgICAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHByb3BlcnR5VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZVF1b3RlZFByaW50YWJsZShmaW5hbCBTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzdHIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBpbnQgbGluZUNvdW50ID0gMDsKLSAgICAgICAgYnl0ZVtdIHN0ckFycmF5ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyQXJyYXkgPSBzdHIuZ2V0Qnl0ZXMobUNoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJDaGFyc2V0ICIgKyBtQ2hhcnNldCArICIgY2Fubm90IGJlIHVzZWQuICIKLSAgICAgICAgICAgICAgICAgICAgKyAiVHJ5IGRlZmF1bHQgY2hhcnNldCIpOwotICAgICAgICAgICAgc3RyQXJyYXkgPSBzdHIuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaW5kZXggPCBzdHJBcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIj0lMDJYIiwgc3RyQXJyYXlbaW5kZXhdKSk7Ci0gICAgICAgICAgICBpbmRleCArPSAxOwotICAgICAgICAgICAgbGluZUNvdW50ICs9IDM7Ci0KLSAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPj0gNjcpIHsKLSAgICAgICAgICAgICAgICAvLyBTcGVjaWZpY2F0aW9uIHJlcXVpcmVzIENSTEYgbXVzdCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlCi0gICAgICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIHRoZSBsaW5lCi0gICAgICAgICAgICAgICAgLy8gYmVjb21lcyBtb3JlIHRoYW4gNzYuCi0gICAgICAgICAgICAgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciwKLSAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGJlY29tZQotICAgICAgICAgICAgICAgIC8vIDYgYnl0ZXMuCi0gICAgICAgICAgICAgICAgLy8gNzYgLSA2IC0gMyA9IDY3Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIj1cclxuIik7Ci0gICAgICAgICAgICAgICAgbGluZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kICdcJyB0byB0aGUgY2hhcmFjdGVycyB3aGljaCBzaG91bGQgYmUgZXNjYXBlZC4gVGhlIGNoYXJhY3RlciBzZXQgaXMgZGlmZmVyZW50Ci0gICAgICogbm90IG9ubHkgYmV0d2VlbiB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBidXQgYWxzbyBhbW9uZyBlYWNoIGRldmljZS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCBRdW90ZWQtUHJpbnRhYmxlIHN0cmluZyBtdXN0IG5vdCBiZSBpbnB1dCBoZXJlLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJmYWxsdGhyb3VnaCIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXNjYXBlQ2hhcmFjdGVycyhmaW5hbCBTdHJpbmcgdW5lc2NhcGVkKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh1bmVzY2FwZWQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRtcEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdW5lc2NhcGVkLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gdW5lc2NhcGVkLmNoYXJBdChpKTsKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICAgICAgICBjYXNlICc7JzogewotICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzogewotICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoYXIgPSB1bmVzY2FwZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICdcbic6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gdkNhcmQgMi4xLCB0aGVyZSdzIG5vIHNwZWNpZmljYXRpb24gYWJvdXQgdGhpcywgd2hpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGV4cGxpY2l0bHkgcmVxdWlyZXMgdGhpcyBzaG91bGQgYmUgZW5jb2RlZCB0byAiXG4iLgotICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICdcXCc6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1YzME9yVjQwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBjYXNlICc+JzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnLCc6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1YzME9yVjQwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFwsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRtcEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoIW1FbmRBcHBlbmRlZCkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9DTEFTUywgVkNBUkRfREFUQV9QVUJMSUMpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9SRURVQ1RJT04sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTk8sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfRENNX0hNTl9NT0RFLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0VORCwgVkNBUkRfREFUQV9WQ0FSRCk7Ci0gICAgICAgICAgICBtRW5kQXBwZW5kZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbXBvc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTNjZjFlLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbXBvc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5Lk5hbWVkQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzRW50aXR5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIGZvciBjb21wb3NpbmcgdkNhcmQgZnJvbSBDb250YWN0cyBpbmZvcm1hdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogVXN1YWxseSwgdGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCBsaWtlIHRoaXMuCi0gKiA8L3A+Ci0gKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+VkNhcmRDb21wb3NlciBjb21wb3NlciA9IG51bGw7Ci0gKiB0cnkgewotICogICAgIGNvbXBvc2VyID0gbmV3IFZDYXJkQ29tcG9zZXIoY29udGV4dCk7Ci0gKiAgICAgY29tcG9zZXIuYWRkSGFuZGxlcigKLSAqICAgICAgICAgICAgIGNvbXBvc2VyLm5ldyBIYW5kbGVyRm9yT3V0cHV0U3RyZWFtKG91dHB1dFN0cmVhbSkpOwotICogICAgIGlmICghY29tcG9zZXIuaW5pdCgpKSB7Ci0gKiAgICAgICAgIC8vIERvIHNvbWV0aGluZyBoYW5kbGluZyB0aGUgc2l0dWF0aW9uLgotICogICAgICAgICByZXR1cm47Ci0gKiAgICAgfQotICogICAgIHdoaWxlICghY29tcG9zZXIuaXNBZnRlckxhc3QoKSkgewotICogICAgICAgICBpZiAobUNhbmNlbGVkKSB7Ci0gKiAgICAgICAgICAgICAvLyBBc3N1bWUgYSB1c2VyIG1heSBjYW5jZWwgdGhpcyBvcGVyYXRpb24gZHVyaW5nIHRoZSBleHBvcnQuCi0gKiAgICAgICAgICAgICByZXR1cm47Ci0gKiAgICAgICAgIH0KLSAqICAgICAgICAgaWYgKCFjb21wb3Nlci5jcmVhdGVPbmVFbnRyeSgpKSB7Ci0gKiAgICAgICAgICAgICAvLyBEbyBzb21ldGhpbmcgaGFuZGxpbmcgdGhlIGVycm9yIHNpdHVhdGlvbi4KLSAqICAgICAgICAgICAgIHJldHVybjsKLSAqICAgICAgICAgfQotICogICAgIH0KLSAqIH0gZmluYWxseSB7Ci0gKiAgICAgaWYgKGNvbXBvc2VyICE9IG51bGwpIHsKLSAqICAgICAgICAgY29tcG9zZXIudGVybWluYXRlKCk7Ci0gKiAgICAgfQotICogfTwvcHJlPgotICogPHA+Ci0gKiBVc2VycyBoYXZlIHRvIG1hbnVhbGx5IHRha2UgY2FyZSBvZiBtZW1vcnkgZWZmaWNpZW5jeS4gRXZlbiBvbmUgdkNhcmQgbWF5IGNvbnRhaW4KLSAqIGltYWdlIG9mIG5vbi10cml2aWFsIHNpemUgZm9yIG1vYmlsZSBkZXZpY2VzLgotICogPC9wPgotICogPHA+Ci0gKiB7QGxpbmsgVkNhcmRCdWlsZGVyfSBpcyB1c2VkIHRvIGJ1aWxkIGVhY2ggdkNhcmQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbXBvc2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZENvbXBvc2VyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX0ZBSUxFRF9UT19HRVRfREFUQUJBU0VfSU5GTyA9Ci0gICAgICAgICJGYWlsZWQgdG8gZ2V0IGRhdGFiYXNlIGluZm9ybWF0aW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX05PX0VOVFJZID0KLSAgICAgICAgIlRoZXJlJ3Mgbm8gZXhwb3J0YWJsZSBpbiB0aGUgZGF0YWJhc2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fTk9UX0lOSVRJQUxJWkVEID0KLSAgICAgICAgIlRoZSB2Q2FyZCBjb21wb3NlciBvYmplY3QgaXMgbm90IGNvcnJlY3RseSBpbml0aWFsaXplZCI7Ci0KLSAgICAvKiogU2hvdWxkIGJlIHZpc2libGUgb25seSBmcm9tIGRldmVsb3BlcnMuLi4gKG5vIG5lZWQgdG8gdHJhbnNsYXRlLCBob3BlZnVsbHkpICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fVU5TVVBQT1JURURfVVJJID0KLSAgICAgICAgIlRoZSBVcmkgdkNhcmQgY29tcG9zZXIgcmVjZWl2ZWQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9zZXIuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0VSUk9SID0gIk5vIGVycm9yIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfU1RSSU5HX0RPQ09NTyA9ICJkb2NvbW8iOwotCi0gICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsICJTaGlmdF9KSVMiIGlzIHRoZSBtb3N0IGFwcHJvcHJpYXRlLCBidXQgd2UgdXNlIHVwcGVyIHZlcnNpb24gaGVyZSwKLSAgICAvLyBzaW5jZSB1c3VhbCB2Q2FyZCBkZXZpY2VzIGZvciBKYXBhbmVzZSBkZXZpY2VzIGFscmVhZHkgdXNlIGl0LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lhbCBVUkkgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVEVTVF9BVVRIT1JJVFkgPSAiY29tLmFuZHJvaWQudW5pdF90ZXN0cy52Y2FyZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIFZDQVJEX1RFU1RfQVVUSE9SSVRZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05UQUNUU19URVNUX0NPTlRFTlRfVVJJID0KLSAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJLCAiY29udGFjdHMiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNJbU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNJbU1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9BSU0sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9NU04sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9ZQUhPTywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ZQUhPTyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSUNRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSkFCQkVSLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUik7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfU0tZUEUsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUpOwotICAgICAgICAvLyBXZSBkb24ndCBhZGQgR29vZ2xlIHRhbGsgaGVyZSBzaW5jZSBpdCBoYXMgdG8gYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpOwotICAgICAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFuIHVzZWZ1bCBoYW5kbGVyIGZvciBlbWl0dGluZyB2Q2FyZCBTdHJpbmcgdG8gYW4gT3V0cHV0U3RyZWFtIG9iamVjdCBvbmUgYnkgb25lLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgaW5wdXQgT3V0cHV0U3RyZWFtIG9iamVjdCBpcyBjbG9zZWQoKSBvbiB7QGxpbmsgI29uVGVybWluYXRlKCl9LgotICAgICAqIE11c3Qgbm90IGNsb3NlIHRoZSBzdHJlYW0gb3V0c2lkZSB0aGlzIGNsYXNzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgY2xhc3MgSGFuZGxlckZvck91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIE9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZENvbXBvc2VyLkhhbmRsZXJGb3JPdXRwdXRTdHJlYW0iOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IGZhbHNlOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW07IC8vIG1Xcml0ZXIgd2lsbCBjbG9zZSB0aGlzLgotICAgICAgICBwcml2YXRlIFdyaXRlciBtV3JpdGVyOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgb24gdGhlIGRldHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSGFuZGxlckZvck91dHB1dFN0cmVhbShmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Jbml0KGZpbmFsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLCBtQ2hhcnNldCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbnN1cHBvcnRlZCBjaGFyc2V0OiAiICsgbUNoYXJzZXQpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJFbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkICh1c3VhbGx5IHRoaXMgZG9lcyBub3QgaGFwcGVuISk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG9uZSBlbXB0eSBlbnRyeS4KLSAgICAgICAgICAgICAgICAgICAgbVdyaXRlci53cml0ZShjcmVhdGVPbmVFbnRyeUludGVybmFsKCItMSIsIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWQ2FyZEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24gZHVyaW5nIG9uIEluaXQoKTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhwb3J0T25lQ29udGFjdERhdGE6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSAiSU9FeGNlcHRpb24gb2NjdXJyZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xcml0ZXIud3JpdGUodmNhcmQpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGV4cG9ydE9uZUNvbnRhY3REYXRhOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZDogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgICAgICAgICBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVdyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggYW5kIHN5bmMgdGhlIGRhdGEgc28gdGhhdCBhIHVzZXIgaXMgYWJsZSB0byBwdWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTRENhcmQganVzdCBhZnRlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhwb3J0LgotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtT3V0cHV0U3RyZWFtIGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRmlsZU91dHB1dFN0cmVhbSkgbU91dHB1dFN0cmVhbSkuZ2V0RkQoKS5zeW5jKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIGR1cmluZyBjbG9zaW5nIHRoZSBvdXRwdXQgc3RyZWFtOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtV3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIklPRXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgY2xvc2UoKS4gSWdub3JpbmcuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgICAgICBpZiAoIW1PblRlcm1pbmF0ZUlzQ2FsbGVkKSB7Ci0gICAgICAgICAgICAgICAgb25UZXJtaW5hdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQ2FyZUhhbmRsZXJFcnJvcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNEb0NvTW87Ci0gICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKLSAgICBwcml2YXRlIGludCBtSWRDb2x1bW47Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2hhcnNldDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRlcm1pbmF0ZUlzQ2FsbGVkOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPbmVFbnRyeUhhbmRsZXI+IG1IYW5kbGVyTGlzdDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1FcnJvclJlYXNvbiA9IE5PX0VSUk9SOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc0NvbnRhY3RzUHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIENvbnRhY3RzLl9JRCwKLSAgICB9OwotCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ERUZBVUxULCBudWxsLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFyaWFudCB3aGljaCBzZXRzIGNoYXJzZXQgdG8gbnVsbCBhbmQgc2V0cyBjYXJlSGFuZGxlckVycm9ycyB0byB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKENvbnRleHQgY29udGV4dCwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIHZjYXJkVHlwZSwgbnVsbCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgdmNhcmRUeXBlLCBTdHJpbmcgY2hhcnNldCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIHZjYXJkVHlwZSwgY2hhcnNldCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHZhcmlhbnQgd2hpY2ggc2V0cyBjaGFyc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIHZjYXJkVHlwZSwgbnVsbCwgY2FyZUhhbmRsZXJFcnJvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBmb3Igc3VwcG9ydGluZyBjYWxsIGxvZyBlbnRyeSB2Q2FyZCBjb21wb3NpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIHVzZWQgZHVyaW5nIHRoZSBjb21wb3NpdGlvbi4KLSAgICAgKiBAcGFyYW0gdmNhcmRUeXBlIFRoZSB0eXBlIG9mIHZDYXJkLCB0eXBpY2FsbHkgYXZhaWxhYmxlIHZpYSB7QGxpbmsgVkNhcmRDb25maWd9LgotICAgICAqIEBwYXJhbSBjaGFyc2V0IFRoZSBjaGFyc2V0IHRvIGJlIHVzZWQuIFVzZSBudWxsIHdoZW4geW91IGRvbid0IG5lZWQgdGhlIGNoYXJzZXQuCi0gICAgICogQHBhcmFtIGNhcmVIYW5kbGVyRXJyb3JzIElmIHRydWUsIFRoaXMgb2JqZWN0IHJldHVybnMgZmFsc2UgZXZlcnl0aW1lCi0gICAgICogYSBIYW5kbGVyIG9iamVjdCBnaXZlbiB2aWEge3tAbGluayAjYWRkSGFuZGxlcihPbmVFbnRyeUhhbmRsZXIpfSByZXR1cm5zIGZhbHNlLgotICAgICAqIElmIGZhbHNlLCB0aGlzIGlnbm9yZXMgdGhvc2UgZXJyb3JzLgotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUNhcmVIYW5kbGVyRXJyb3JzID0gY2FyZUhhbmRsZXJFcnJvcnM7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1IYW5kbGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8T25lRW50cnlIYW5kbGVyPigpOwotCi0gICAgICAgIGNoYXJzZXQgPSAoVGV4dFV0aWxzLmlzRW1wdHkoY2hhcnNldCkgPyBWQ2FyZENvbmZpZy5ERUZBVUxUX0VYUE9SVF9DSEFSU0VUIDogY2hhcnNldCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtID0gISgKLSAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpICYmIFVURl84LmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpOwotCi0gICAgICAgIGlmIChtSXNEb0NvTW8gfHwgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKSB7Ci0gICAgICAgICAgICBpZiAoU0hJRlRfSklTLmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTLCAiZG9jb21vIikubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvQ29Nby1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTKS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FyZWVyLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gY2hhcnNldDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY2hhcnNldCBcIiIgKyBjaGFyc2V0ICsgIlwiIGlzIHVzZWQgd2hpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBTSElGVF9KSVMgKyAiIGlzIG5lZWRlZCB0byBiZSB1c2VkLiIpOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0KSkgewotICAgICAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKGNoYXJzZXQpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJlZXItc3BlY2lmaWMgXCIiICsgY2hhcnNldCArICJcIiB3YXMgbm90IGZvdW5kIChhcyB1c3VhbCkuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIGl0IGFzIGlzLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gY2hhcnNldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY2hhcnNldCkpIHsKLSAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IFVURl84OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoY2hhcnNldCkubmFtZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcmVlci1zcGVjaWZpYyBcIiIgKyBjaGFyc2V0ICsgIlwiIHdhcyBub3QgZm91bmQgKGFzIHVzdWFsKS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBpdCBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlVzZSB0aGUgY2hhcnNldCBcIiIgKyBtQ2hhcnNldCArICJcIiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgI2luaXQoKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihPbmVFbnRyeUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlckxpc3QuYWRkKGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBzdWNjZXNzZnVsIGFuZCBhbGwgdGhlIG90aGVyCi0gICAgICogICAgICAgICAgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KCkgewotICAgICAgICByZXR1cm4gaW5pdChudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGluaXQoQ29udGFjdHMuQ09OVEVOVF9VUkksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgdW5zdGFibGUgaW50ZXJmYWNlLCBtYXkgYmUgZGVsZXRlZCBpbiB0aGUgZnV0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoZmluYWwgVXJpIGNvbnRlbnRVcmksIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBmaW5hbCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIGlmIChjb250ZW50VXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8T25lRW50cnlIYW5kbGVyPiBmaW5pc2hlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE9uZUVudHJ5SGFuZGxlcj4oCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci5vbkluaXQobUNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGZpbmlzaGVkIDogZmluaXNoZWRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZC5vblRlcm1pbmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSB0aGUgZmFsc2UgcmV0dXJuZWQgZnJvbSBvbkluaXQoKS4KLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uSW5pdChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwcm9qZWN0aW9uOwotICAgICAgICBpZiAoQ29udGFjdHMuQ09OVEVOVF9VUkkuZXF1YWxzKGNvbnRlbnRVcmkpIHx8Ci0gICAgICAgICAgICAgICAgQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSS5lcXVhbHMoY29udGVudFVyaSkpIHsKLSAgICAgICAgICAgIHByb2plY3Rpb24gPSBzQ29udGFjdHNQcm9qZWN0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fVU5TVVBQT1JURURfVVJJOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJzb3IgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KAotICAgICAgICAgICAgICAgIGNvbnRlbnRVcmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKLQotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9GQUlMRURfVE9fR0VUX0RBVEFCQVNFX0lORk87Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0Q291bnQoKSA9PSAwIHx8ICFtQ3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU1FMaXRlRXhjZXB0aW9uIG9uIEN1cnNvciNjbG9zZSgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9OT19FTlRSWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZENvbHVtbiA9IG1DdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ29udGFjdHMuX0lEKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU9uZUVudHJ5KG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCBGb3IgRGVwZW5kZW5jeSBJbmplY3Rpb24uCi0gICAgICogQGhpZGUganVzdCBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeShNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCB8fCBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCkpIHsKLSAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX05PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgdmNhcmQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUlkQ29sdW1uID49IDApIHsKLSAgICAgICAgICAgICAgICB2Y2FyZCA9IGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwobUN1cnNvci5nZXRTdHJpbmcobUlkQ29sdW1uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkluY29ycmVjdCBtSWRDb2x1bW46ICIgKyBtSWRDb2x1bW4pOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVkNhcmRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGVycm9yKSB7Ci0gICAgICAgICAgICAvLyBNYXliZSBzb21lIGRhdGEgKGUuZy4gcGhvdG8pIGlzIHRvbyBiaWcgdG8gaGF2ZSBpbiBtZW1vcnkuIEJ1dCBpdAotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHJhcmUuCi0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3V0T2ZNZW1vcnlFcnJvciBvY2N1cmVkLiBJZ25vcmUgdGhlIGVudHJ5LiIpOwotICAgICAgICAgICAgU3lzdGVtLmdjKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgdGVsbCB1c2VycyB3aGF0IGhhcHBlbmVkPwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb05leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2FyZSB0aGUgT3V0T2ZNZW1vcnlFcnJvciBvbiB0aGUgaGFuZGxlciBzaWRlIDotUAotICAgICAgICBpZiAobUNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgICAgICBMaXN0PE9uZUVudHJ5SGFuZGxlcj4gZmluaXNoZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxPbmVFbnRyeUhhbmRsZXI+KAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlckxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXIub25FbnRyeUNyZWF0ZWQodmNhcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5vbkVudHJ5Q3JlYXRlZCh2Y2FyZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVPbmVFbnRyeUludGVybmFsKGZpbmFsIFN0cmluZyBjb250YWN0SWQsCi0gICAgICAgICAgICBmaW5hbCBNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+IGNvbnRlbnRWYWx1ZXNMaXN0TWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+KCk7Ci0gICAgICAgIC8vIFRoZSByZXNvbHZlciBtYXkgcmV0dXJuIHRoZSBlbnRpdHkgaXRlcmF0b3Igd2l0aCBubyBkYXRhLiBJdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgLy8gZS5nLiBJZiBhbGwgdGhlIGRhdGEgaW4gdGhlIGNvbnRhY3Qgb2YgdGhlIGdpdmVuIGNvbnRhY3QgaWQgYXJlIG5vdCBleHBvcnRhYmxlIG9uZXMsCi0gICAgICAgIC8vICAgICAgdGhleSBhcmUgaGlkZGVuIGZyb20gdGhlIHZpZXcgb2YgdGhpcyBtZXRob2QsIHRob3VnaCBjb250YWN0IGlkIGl0c2VsZiBleGlzdHMuCi0gICAgICAgIEVudGl0eUl0ZXJhdG9yIGVudGl0eUl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBSYXdDb250YWN0c0VudGl0eS5DT05URU5UX1VSSS5idWlsZFVwb24oKQotICAgICAgICAgICAgICAgICAgICAvLyAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImZvcl9leHBvcnRfb25seSIsICIxIikKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKERhdGEuRk9SX0VYUE9SVF9PTkxZLCAiMSIpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiA9IERhdGEuQ09OVEFDVF9JRCArICI9PyI7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzID0gbmV3IFN0cmluZ1tdIHtjb250YWN0SWR9OwotICAgICAgICAgICAgaWYgKGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgYnJhbmNoIGlzIGV4ZWN1dGVkIGJ5IHVuaXQgdGVzdHMgb25seQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yID0gKEVudGl0eUl0ZXJhdG9yKWdldEVudGl0eUl0ZXJhdG9yTWV0aG9kLmludm9rZShudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIsIHVyaSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlRWxlbWVudHMgPSBlLmdldENhdXNlKCkuZ2V0U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IGVsZW1lbnQgOiBzdGFja1RyYWNlRWxlbWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICIgICAgYXQgIiArIGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbnRpdHlJdGVyYXRvciA9IFJhd0NvbnRhY3RzLm5ld0VudGl0eUl0ZXJhdG9yKG1Db250ZW50UmVzb2x2ZXIucXVlcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmksIG51bGwsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZW50aXR5SXRlcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJFbnRpdHlJdGVyYXRvciBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVudGl0eUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJEYXRhIGRvZXMgbm90IGV4aXN0LiBjb250YWN0SWQ6ICIgKyBjb250YWN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKGVudGl0eUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBlbnRpdHlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChOYW1lZENvbnRlbnRWYWx1ZXMgbmFtZWRDb250ZW50VmFsdWVzIDogZW50aXR5LmdldFN1YlZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5hbWVkQ29udGVudFZhbHVlcy52YWx1ZXM7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKERhdGEuTUlNRVRZUEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXM+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0xpc3RNYXAucHV0KGtleSwgY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0xpc3QuYWRkKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGVudGl0eUl0ZXJhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbnRpdHlJdGVyYXRvci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkVkNhcmQoY29udGVudFZhbHVlc0xpc3RNYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhbmQgcmV0dXJucyB2Q2FyZCB1c2luZyBnaXZlbiBtYXAsIHdob3NlIGtleSBpcyBDT05URU5UX0lURU1fVFlQRSBkZWZpbmVkIGluCi0gICAgICoge0NvbnRhY3RzQ29udHJhY3R9LiBEZXZlbG9wZXJzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIG91dHB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkVkNhcmQoZmluYWwgTWFwPFN0cmluZywgTGlzdDxDb250ZW50VmFsdWVzPj4gY29udGVudFZhbHVlc0xpc3RNYXApIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJUaGUgZ2l2ZW4gbWFwIGlzIG51bGwuIElnbm9yZSBhbmQgcmV0dXJuIGVtcHR5IFN0cmluZyIpOwotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgVkNhcmRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVkNhcmRCdWlsZGVyKG1WQ2FyZFR5cGUsIG1DaGFyc2V0KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kTmFtZVByb3BlcnRpZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZE5pY2tOYW1lcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUGhvbmVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRFbWFpbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFBvc3RhbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kT3JnYW5pemF0aW9ucyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFdlYnNpdGVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgICAgICBpZiAoKG1WQ2FyZFR5cGUgJiBWQ2FyZENvbmZpZy5GTEFHX1JFRlJBSU5fSU1BR0VfRVhQT1JUKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRQaG90b3MoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZE5vdGVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZEV2ZW50cyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kSW1zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChJbS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRSZWxhdGlvbihjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpKTsKLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB7Ci0gICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgIGhhbmRsZXIub25UZXJtaW5hdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU1FMaXRlRXhjZXB0aW9uIG9uIEN1cnNvciNjbG9zZSgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnNvciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVybWluYXRlSXNDYWxsZWQgPSB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZpbmFsaXplKCkgewotICAgICAgICBpZiAoIW1UZXJtaW5hdGVJc0NhbGxlZCkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInRlcm1pbmF0ZSgpIGlzIG5vdCBjYWxsZWQgeWV0LiBXZSBjYWxsIGl0IGluIGZpbmFsaXplKCkgc3RlcC4iKTsKLSAgICAgICAgICAgIHRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGVudGl0aWVzLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZAotICAgICAqIHdoZW4gdGhpcyBvYmplY3QgaXMgbm90IHJlYWR5IHlldCAodHlwaWNhbGx5IHdoZW4ge3tAbGluayAjaW5pdCgpfSBpcyBub3QgY2FsbGVkCi0gICAgICogb3Igd2hlbiB7QGxpbmsgI3Rlcm1pbmF0ZSgpfSBpcyBhbHJlYWR5IGNhbGxlZCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlRoaXMgb2JqZWN0IGlzIG5vdCByZWFkeSB5ZXQuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRDb3VudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZXJlJ3Mgbm8gZW50aXR5IHRvIGJlIGJ1aWx0LiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZAotICAgICAqIHdoZW4gdGhpcyBvYmplY3QgaXMgbm90IHJlYWR5IHlldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlRoaXMgb2JqZWN0IGlzIG5vdCByZWFkeSB5ZXQuIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNBZnRlckxhc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVycm9yIHJlYXNvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yUmVhc29uKCkgewotICAgICAgICByZXR1cm4gbUVycm9yUmVhc29uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzU5ZTMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoZSBjbGFzcyByZXByZXNlbnRpbmcgVkNhcmQgcmVsYXRlZCBjb25maWd1cmF0aW9ucy4gVXNlZnVsIHN0YXRpYyBtZXRob2RzIGFyZSBub3QgaW4gdGhpcyBjbGFzcwotICogYnV0IGluIFZDYXJkVXRpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbmZpZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRDb25maWciOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9OT05FID0gMDsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1BFUkZPUk1BTkNFX01FQVNVUkVNRU5UID0gMHgxOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfU0hPV19XQVJOSU5HID0gMHgyOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfVkVSQk9TRSA9Ci0gICAgICAgIExPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCB8IExPR19MRVZFTF9TSE9XX1dBUk5JTkc7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMID0gTE9HX0xFVkVMX05PTkU7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2hhcnNldCB1c2VkIGR1cmluZyBpbXBvcnQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIGNhbm5vdCBkZXRlcm1pbmUgd2hpY2ggY2hhcnNldCBzaG91bGQgYmUgdXNlZCB0byBpbnRlcnByZXQgbGluZXMgaW4gdkNhcmQsCi0gICAgICogd2hpbGUgSmF2YSByZXF1aXJlcyB1cyB0byBzcGVjaWZ5IGl0IHdoZW4gSW5wdXRTdHJlYW0gaXMgdXNlZC4KLSAgICAgKiBXZSBuZWVkIHRvIHJlbHkgb24gdGhlIG1lY2hhbmlzbSBkdWUgdG8gc29tZSBwZXJmb3JtYW5jZSByZWFzb24uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEluIG9yZGVyIHRvIGF2b2lkICJtaXNpbnRlcnByZXRhdGlvbiIgb2YgY2hhcnNldCBhbmQgbG9zZSBhbnkgZGF0YSBpbiB2Q2FyZCwKLSAgICAgKiAiSVNPLTg4NTktMSIgaXMgZmlyc3QgdXNlZCBmb3IgcmVhZGluZyB0aGUgc3RyZWFtLgotICAgICAqIFdoZW4gYSBjaGFyc2V0IGlzIHNwZWNpZmllZCBpbiBhIHByb3BlcnR5ICh3aXRoICJDSEFSU0VUPS4uLiIgcGFyYW1ldGVyKSwKLSAgICAgKiB0aGUgc3RyaW5nIGlzIGRlY29kZWQgdG8gcmF3IGJ5dGVzIGFuZCBlbmNvZGVkIGludG8gdGhlIHNwZWNpZmljIGNoYXJzZXQsCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFVuaWNvZGUgc3BlY2lmaWNhdGlvbiB0aGVyZSdzIGEgb25lIHRvIG9uZSBtYXBwaW5nIGJldHdlZW4gZWFjaCBieXRlIGluIElTTy04ODU5LTEKLSAgICAgKiBhbmQgYSBjb2RlcG9pbnQsIGFuZCBKYXZhIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgcnVudGltZSBtdXN0IGhhdmUgdGhlIGNoYXJzZXQuCi0gICAgICogVGh1cywgSVNPLTg4NTktMSBpcyBvbmUgZWZmZWN0aXZlIG1hcHBpbmcgZm9yIGludGVybWVkaWF0ZSBtYXBwaW5nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUID0gIklTTy04ODU5LTEiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgdXNlZCB3aGVuIHRoZXJlJ3Mgbm8gaW5mb3JtYXRpb24gYWZmYm91dCB3aGF0IGNoYXJzZXQgc2hvdWxkIGJlIHVzZWQgdG8KLSAgICAgKiBlbmNvZGUgdGhlIGJpbmFyeSBnaXZlbiBmcm9tIHZDYXJkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU1QT1JUX0NIQVJTRVQgPSAiVVRGLTgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhQT1JUX0NIQVJTRVQgPSAiVVRGLTgiOwotCi0gICAgLyoqCi0gICAgICogRG8gbm90IHVzZSBzdGF0aWNhbGx5IGxpa2UgInZlcnNpb24gPT0gVkVSU0lPTl9WMjEiCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8yMSA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8zMCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl80MCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9NQVNLID0gMzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfREVGQVVMVCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9FVVJPUEUgPSAweDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9KQVBBTkVTRSA9IDB4ODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9NQVNLID0gMHhDOwotCi0gICAgLy8gMHgxMCBpcyByZXNlcnZlZCBmb3Igc2FmZXR5Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciB3aWxsIGFkZCBzb21lICJYLSIgcHJvcGVydGllcyB1c2VkIG9ubHkgaW4gQW5kcm9pZAotICAgICAqIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYXBwcm9wcmlhdGUgZmllbGRzIGZvciB0aGF0IGRhdGEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlLCBBbmRyb2lkIGFjY2VwdHMgbmlja25hbWUgaW5mb3JtYXRpb24gd2hpbGUgdkNhcmQgMi4xIGRvZXMgbm90LgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIG9uLCB2Q2FyZCBjb21wb3NlciBlbWl0cyBhbHRlcm5hdGl2ZSAiWC0iIHByb3BlcnR5IChsaWtlICJYLU5JQ0tOQU1FIikKLSAgICAgKiBpbnN0ZWFkIG9mIGp1c3QgZHJvcHBpbmcgaXQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIHZDYXJkIHBhcnNlciBjb2RlIGF1dG9tYXRpY2FsbHkgcGFyc2VzIHRoZSBmaWVsZCBlbWl0dGVkIGV2ZW4gd2hlbiB0aGlzIGZsYWcgaXMgb2ZmLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSA9IDB4ODAwMDAwMDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgd2lsbCBhZGQgc29tZSAiWC0iIHByb3BlcnRpZXMgc2VlbiBpbiB0aGUKLSAgICAgKiB2Q2FyZCBkYXRhIGVtaXR0ZWQgYnkgdGhlIG90aGVyIHNvZnR3YXJlcy9kZXZpY2VzIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uCi0gICAgICogZG9lcyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBmaWVsZChzKSBmb3IgdGhhdCBkYXRhLgotICAgICAqIDwvcD4gCi0gICAgICogPHA+Ci0gICAgICogT25lIGV4YW1wbGUgaXMgWC1QSE9ORVRJQy1GSVJTVC1OQU1FL1gtUEhPTkVUSUMtTUlERExFLU5BTUUvWC1QSE9ORVRJQy1MQVNULU5BTUUsIHdoaWNoIGFyZQotICAgICAqIGZvciBwaG9uZXRpYyBuYW1lIChob3cgdGhlIG5hbWUgaXMgcHJvbm91bmNlZCksIHNlZW4gaW4gdGhlIHZDYXJkIGVtaXR0ZWQgYnkgc29tZSBvdGhlcgotICAgICAqIG5vbi1BbmRyb2lkIGRldmljZXMvc29mdHdhcmVzLiBXZSBjaG9zZSB0byBlbmFibGUgdGhlIHZDYXJkIGNvbXBvc2VyIHRvIHVzZSB0aG9zZQotICAgICAqIGRlZmFjdCBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgYXJlIGFsc28gdXNlZnVsIGZvciBBbmRyb2lkIGRldmljZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgZm9yIGRldmVsb3BlcnM6IG9ubHkgIlgtIiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBhZGRlZCB3aXRoIHRoaXMgZmxhZy4gdkNhcmQgMi4xLzMuMAotICAgICAqIGFsbG93cyBhbnkga2luZCBvZiAiWC0iIHByb3BlcnRpZXMgYnV0IGRvZXMgbm90IGFsbG93IG5vbi0iWC0iIHByb3BlcnRpZXMgKGV4Y2VwdCBJQU5BIHRva2VucwotICAgICAqIGluIHZDYXJkIDMuMCkuIFNvbWUgZXh0ZXJuYWwgcGFyc2VycyBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggbm9uLXZhbGlkLCBub24tIlgtIiBwcm9wZXJ0aWVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZID0gMHg0MDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgc29tZSBzcGVjaWZpYyBkaWFsZWN0IHNlZW4gaW4gdkNhcmQgb2YgRG9Db01vIChvbmUgb2YgSmFwYW5lc2UKLSAgICAgKiBtb2JpbGUgY2FyZWVycykgc2hvdWxkIGJlIHVzZWQuIFRoaXMgZmxhZyBkb2VzIG5vdCBpbmNsdWRlIGFueSBvdGhlciBpbmZvcm1hdGlvbiBsaWtlCi0gICAgICogdGhhdCAidGhlIHZDYXJkIGlzIGZvciBKYXBhbmVzZSIuIFNvIGl0IGlzICJwb3NzaWJsZSIgdGhhdCAidGhlIHZDYXJkIHNob3VsZCBoYXZlIERvQ29NbydzCi0gICAgICogZGlhbGVjdCBidXQgdGhlIG5hbWUgb3JkZXIgc2hvdWxkIGJlIEV1cm9wZWFuIiwgYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfRE9DT01PID0gMHgyMDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIGRvZXMgIk5PVCIgdXNlIFF1b3RlZC1QcmludGFibGUgdG93YXJkICJwcmltYXJ5IgotICAgICAqIHByb3BlcnRpZXMgZXZlbiB0aG91Z2ggaXQgaXMgcmVxdWlyZWQgYnkgdkNhcmQgMi4xIChRUCBpcyBwcm9oaWJpdGVkIGluIHZDYXJkIDMuMCkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIGFjdHVhbGx5IGNhbm5vdCBkZWZpbmUgd2hhdCBpcyB0aGUgInByaW1hcnkiIHByb3BlcnR5LiBOb3RlIHRoYXQgdGhpcyBpcyBOT1QgZGVmaW5lZAotICAgICAqIGluIHZDYXJkIHNwZWNpZmljYXRpb24gZWl0aGVyLiBBbHNvIGJlIGF3YXJlIHRoYXQgaXQgaXMgTk9UIHJlbGF0ZWQgdG8gInByaW1hcnkiIG5vdGlvbgotICAgICAqIHVzZWQgaW4ge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdH0uCi0gICAgICogVGhpcyBub3Rpb24gaXMganVzdCBmb3IgdkNhcmQgY29tcG9zaXRpb24gaW4gQW5kcm9pZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogV2UgYWRkZWQgdGhpcyBBbmRyb2lkLXNwZWNpZmljIG5vdGlvbiBzaW5jZSBzb21lIChpbmNvbXBsZXRlKSB2Q2FyZCBleHBvcnRlcnMgZm9yIHZDYXJkIDIuMQotICAgICAqIGRvIE5PVCB1c2UgUXVvdGVkLVByaW50YWJsZSBlbmNvZGluZyB0b3dhcmQgc29tZSBwcm9wZXJ0aWVzIHJlbGF0ZWQgbmFtZXMgbGlrZSAiTiIsICJGTiIsIGV0Yy4KLSAgICAgKiBldmVuIHdoZW4gdGhlaXIgdmFsdWVzIGNvbnRhaW4gbm9uLWFzY2lpIG9yL2FuZCBDUi9MRiwgd2hpbGUgdGhleSB1c2UgdGhlIGVuY29kaW5nIGluIHRoZQotICAgICAqIG90aGVyIHByb3BlcnRpZXMgbGlrZSAiQURSIiwgIk9SRyIsIGV0Yy4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBhcmUgYWZyYWlkIG9mIHRoZSBjYXNlIHdoZXJlIHNvbWUgdkNhcmQgaW1wb3J0ZXIgYWxzbyBmb3JnZXQgaGFuZGxpbmcgUVAgcHJlc3VtaW5nIFFQIGlzCi0gICAgICogbm90IHVzZWQgaW4gc3VjaCBmaWVsZHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZmxhZyBpcyB1c2VmdWwgd2hlbiBzb21lIHRhcmdldCBpbXBvcnRlciB5b3UgYXJlIGdvaW5nIHRvIGZvY3VzIG9uIGRvZXMgbm90IGFjY2VwdAotICAgICAqIHN1Y2ggcHJvcGVydGllcyB3aXRoIFF1b3RlZC1QcmludGFibGUgZW5jb2RpbmcuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEFnYWluLCB3ZSBzaG91bGQgbm90IHVzZSB0aGlzIGZsYWcgYXQgYWxsIGZvciBjb21wbHlpbmcgdkNhcmQgMi4xIHNwZWMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEluIHZDYXJkIDMuMCwgUXVvdGVkLVByaW50YWJsZSBpcyBleHBsaWNpdGx5ICJwcm9oaWJpdHRlZCIsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FyZSB0aGlzCi0gICAgICoga2luZCBvZiBwcm9ibGVtIChob3BlZnVsbHkpLgotICAgICAqIDwvcD4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9RUF9UT19OQU1FX1BST1BFUlRJRVMgPSAweDEwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHBob25ldGljIG5hbWUgcmVsYXRlZCBmaWVsZHMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8KLSAgICAgKiBhcHByb3ByaWF0ZSBmb3JtLiBOb3RlIHRoYXQgImFwcHJvcHJpYXRlIiBpcyBub3QgZGVmaW5lZCBpbiBhbnkgdkNhcmQgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBUaGlzIGlzIEFuZHJvaWQtc3BlY2lmaWMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE9uZSB0eXBpY2FsIChhbmQgY3VycmVudGx5IHNvbGUpIGV4YW1wbGUgd2hlcmUgd2UgbmVlZCB0aGlzIGZsYWcgaXMgdGhlIHRpbWUgd2hlbgotICAgICAqIHdlIG5lZWQgdG8gZW1pdCBKYXBhbmVzZSBwaG9uZXRpYyBuYW1lcyBpbnRvIHZDYXJkIGVudHJpZXMuIFRoZSBwcm9wZXJ0eSB2YWx1ZXMKLSAgICAgKiBzaG91bGQgYmUgZW5jb2RlZCBpbnRvIGhhbGYtd2lkdGgga2F0YWthbmEgd2hlbiB0aGUgdGFyZ2V0IGltcG9ydGVyIGlzIEphcGFuZXNlIG1vYmlsZQotICAgICAqIHBob25lcycsIHdoaWNoIGFyZSBwcm9iYWJseSBub3QgYWJsZSB0byBwYXJzZSBmdWxsLXdpZHRoIGhpcmFnYW5hL2thdGFrYW5hIGZvcgotICAgICAqIGhpc3RvcmljYWwgcmVhc29ucywgd2hpbGUgdGhlIHZDYXJkIGltcG9ydGVycyBlbWJlZGRlZCB0byBzb2Z0d2FyZXMgZm9yIFBDIHNob3VsZCBiZQotICAgICAqIGFibGUgdG8gcGFyc2UgdGhlbSBhcyB3ZSBleHBlY3QuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MgPSAweDA4MDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgImZvciAyLjEiIGVtaXRzICJUWVBFPSIgc3RyaW5nIHRvd2FyZCBUWVBFIHBhcmFtcwotICAgICAqIGV2ZXJ5IHRpbWUgcG9zc2libGUuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGRvZXMgbm90IGVtaXQgaXQgYW5kIGlzIHZhbGlkIGluIHRoZSBzcGVjLgotICAgICAqIEluIHZDcmFkIDMuMCwgdGhpcyBmbGFnIGlzIHVubmVjZXNzYXJ5LCBzaW5jZSAiVFlQRT0iIGlzIE1VU1QgaW4gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERldGFpbDoKLSAgICAgKiBIb3cgbW9yZSB0aGFuIG9uZSBUWVBFIGZpZWxkcyBhcmUgZXhwcmVzc2VkIGlzIGRpZmZlcmVudCBiZXR3ZWVuIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBlLmcuCi0gICAgICogPC9wPgotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+UHJvYmFibHkgdmFsaWQgaW4gYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMDogIkFEUjtUWVBFPURPTTtUWVBFPUhPTUU6Li4uIjwvbGk+Ci0gICAgICogPGxpPlZhbGlkIGluIHZDYXJkIDIuMSBidXQgbm90IGluIHZDYXJkIDMuMDogIkFEUjtET007SE9NRTouLi4iPC9saT4KLSAgICAgKiA8bGk+VmFsaWQgaW4gdkNhcmQgMy4wIGJ1dCBub3QgaW4gdkNhcmQgMi4xOiAiQURSO1RZUEU9RE9NLEhPTUU6Li4uIjwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3UgYXJlIHRhcmdldGluZyB0byB0aGUgaW1wb3J0ZXIgd2hpY2ggY2Fubm90IGFjY2VwdCBUWVBFIHBhcmFtcyB3aXRob3V0ICJUWVBFPSIKLSAgICAgKiBzdHJpbmdzICh3aGljaCBzaG91bGQgYmUgcmFyZSB0aG91Z2gpLCBwbGVhc2UgdXNlIHRoaXMgZmxhZy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRXhhbXBsZSB1c2FnZToKLSAgICAgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+aW50IHR5cGUgPSAoVkNBUkRfVFlQRV9WMjFfR0VORVJJQyB8IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU0pOzwvcHJlPgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNID0gMHgwNDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIGRvZXMgdG91Y2ggbm90aGluZyB0b3dhcmQgcGhvbmUgbnVtYmVyIFN0cmluZ3MKLSAgICAgKiBidXQgbGVhdmUgaXQgYXMgaXMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSB2Q2FyZCBzcGVjaWZpY2F0aW9ucyBtZW50aW9uIG5vdGhpbmcgdG93YXJkIHBob25lIG51bWJlcnMsIHdoaWxlIHNvbWUgZGV2aWNlcwotICAgICAqIGRvICh3cm9uZ2x5LCBidXQgd2l0aCBpbm5ldml0YWJsZSByZWFzb25zKS4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdGhlcmUncyBhIHBvc3NpYmlsaXR5IEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgYXJlIGV4cGVjdGVkIHRvIGhhdmUKLSAgICAgKiBqdXN0IG51bWJlcnMsIGh5cGVucywgcGx1cywgZXRjLiBidXQgbm90IHVzdWFsIGFscGhhYmV0cywgd2hpbGUgVVMgbW9iaWxlIHBob25lcwotICAgICAqIHNob3VsZCBnZXQgc3VjaCBjaGFyYWN0ZXJzLiBUbyBtYWtlIGV4cG9ydGVkIHZDYXJkIHNpbXBsZSBmb3IgZXh0ZXJuYWwgcGFyc2VycywKLSAgICAgKiB3ZSBoYXZlIHVzZWQge0BsaW5rIFBob25lTnVtYmVyVXRpbHMjZm9ybWF0TnVtYmVyKFN0cmluZyl9IGR1cmluZyBleHBvcnQsIGFuZAotICAgICAqIHJlbW92ZWQgdW5uZWNlc3NhcnkgY2hhcmFjdGVycyBpbnNpZGUgdGhlIG51bWJlciAoZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSkiCi0gICAgICogYmVjb21lcyAiMTExLTIyMi0zMzMzIikuCi0gICAgICogVW5mb3J0dW5hdGUgc2lkZSBlZmZlY3Qgb2YgdGhhdCB1c2Ugd2FzIHNvbWUgY29udHJvbCBjaGFyYWN0ZXJzIHVzZWQgaW4gdGhlIG90aGVyCi0gICAgICogYXJlYXMgbWF5IGJlIGJhZGx5IGFmZmVjdGVkIGJ5IHRoZSBmb3JtYXR0aW5nLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgZGlzYWJsZXMgdGhhdCBmb3JtYXR0aW5nLCBhZmZlY3RpbmcgYm90aCBpbXBvcnRlciBhbmQgZXhwb3J0ZXIuCi0gICAgICogSWYgdGhlIHVzZXIgaXMgYXdhcmUgb2Ygc29tZSBzaWRlIGVmZmVjdHMgZHVlIHRvIHRoZSBpbXBsaWNpdCBmb3JtYXR0aW5nLCB1c2UgdGhpcyBmbGFnLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fUEhPTkVfTlVNQkVSX0ZPUk1BVFRJTkcgPSAweDAyMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRm9yIGltcG9ydGVyIG9ubHkuIElnbm9yZWQgaW4gZXhwb3J0ZXIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHBhcnNlciBzaG91bGQgaGFuZGxlIGEgbmVzdGVkIHZDYXJkLCBpbiB3aGljaCB2Q2FyZCBjbGF1c2Ugc3RhcnRzCi0gICAgICogaW4gYW5vdGhlciB2Q2FyZCBjbGF1c2UuIEhlcmUncyBhIHR5cGljYWwgZXhhbXBsZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPkJFR0lOOlZDQVJECi0gICAgICogQkVHSU46VkNBUkQKLSAgICAgKiBWRVJTSU9OOjIuMQotICAgICAqIC4uLgotICAgICAqIEVORDpWQ0FSRAotICAgICAqIEVORDpWQ0FSRDwvcHJlPgotICAgICAqIDxwPgotICAgICAqIFRoZSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBhbGxvd3MgdGhlIG5lc3QsIGJ1dCBhbHNvIGxldCBwYXJzZXJzIGlnbm9yZSBuZXN0ZWQgZW50cmllcywKLSAgICAgKiB3aGlsZSBzb21lIG1vYmlsZSBkZXZpY2VzIGVtaXQgbmVzdGVkIG9uZXMgYXMgcHJpbWFyeSBkYXRhIHRvIGJlIGltcG9ydGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgZm9yY2VzIGEgdkNhcmQgcGFyc2VyIHRvIHRvcmVsYXRlIHN1Y2ggYSBuZXN0IGFuZCB1bmRlcnN0YW5kIGl0cyBjb250ZW50LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1RPUkVMQVRFX05FU1QgPSAweDAxMDAwMDAwOwotCi0gICAgLy8vLyBUaGUgZm9sbG93aW5ncyBhcmUgVkNhcmQgdHlwZXMgYXZhaWxhYmxlIGZyb20gaW1wb3J0ZXIvZXhwb3J0ZXIuIC8vLy8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9JTUFHRV9FWFBPUlQgPSAweDAwODAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIHR5cGUgaW5kaWNhdGluZyBub3RoaW5nLiBVc2VkIGJ5IHtAbGluayBWQ2FyZFNvdXJjZURldGVjdG9yfSB3aGVuIGl0Ci0gICAgICogd2FzIG5vdCBhYmxlIHRvIGd1ZXNzIHRoZSBleGFjdCB2Q2FyZCB0eXBlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogR2VuZXJpYyB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdkNhcmQgMi4xLiBXaGVuIGNvbXBvc2luZyBhIHZDYXJkIGVudHJ5LAotICAgICAqIHRoZSBVUyBjb252ZW5zaW9uIHdpbGwgYmUgdXNlZCB0b3dhcmQgZm9ybWF0dGluZyBzb21lIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogZS5nLiBUaGUgb3JkZXIgb2YgdGhlIGRpc3BsYXkgbmFtZSB3b3VsZCBiZSAiUHJlZml4IEdpdmVuIE1pZGRsZSBGYW1pbHkgU3VmZml4IiwKLSAgICAgKiB3aGlsZSBpdCBzaG91bGQgYmUgIlByZWZpeCBGYW1pbHkgTWlkZGxlIEdpdmVuIFN1ZmZpeCIgaW4gSmFwYW4gZm9yIGV4YW1wbGUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFVzZXMgVVRGLTggZm9yIHRoZSBjaGFyc2V0IGFzIGEgY2hhcnNldCBmb3IgZXhwb3J0aW5nLiBOb3RlIHRoYXQgb2xkIHZDYXJkIGltcG9ydGVyCi0gICAgICogb3V0c2lkZSBBbmRyb2lkIGNhbm5vdCBhY2NlcHQgaXQgc2luY2UgdkNhcmQgMi4xIHNwZWNpZmljYWxseSBkb2VzIG5vdCBhbGxvdwotICAgICAqIHRoYXQgY2hhcnNldCwgd2hpbGUgd2UgbmVlZCB0byB1c2UgaXQgdG8gc3VwcG9ydCB2YXJpb3VzIGxhbmd1YWdlcyBhcm91bmQgdGhlIHdvcmxkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3Ugd2FudCB0byB1c2UgYWx0ZXJuYXRpdmUgY2hhcnNldCwgeW91IHNob3VsZCBub3RpZnkgdGhlIGNoYXJzZXQgdG8gdGhlIG90aGVyCi0gICAgICogY29tcG9udGVudCB0byBiZSB1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDID0KLSAgICAgICAgKFZFUlNJT05fMjEgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1NUUiA9ICJ2MjFfZ2VuZXJpYyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiAzLjAuIFVzZXMgVVRGLTggZm9yIHRoZSBjaGFyc2V0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3QgZnVsbHkgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDID0KLSAgICAgICAgKFZFUlNJT05fMzAgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1NUUiA9ICJ2MzBfZ2VuZXJpYyI7Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2ZXJzaW9uIDQuMC4KLSAgICAgKiBAaGlkZSB2Q2FyZCA0LjAgaXMgbm90IHB1Ymxpc2hlZCB5ZXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WNDBfR0VORVJJQyA9Ci0gICAgICAgIChWRVJTSU9OXzQwIHwgTkFNRV9PUkRFUl9ERUZBVUxUIHwgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WNDBfR0VORVJJQ19TVFIgPSAidjQwX2dlbmVyaWMiOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgZm9yIHRoZSB2Q2FyZCAyLjEgd2l0aCBzb21lIEV1cm9wZSBjb252ZW5zaW9uLiBVc2VzIFV0Zi04LgotICAgICAqIEN1cnJlbnRseSwgb25seSBuYW1lIG9yZGVyIGlzIGNvbnNpZGVyZWQgKCJQcmVmaXggTWlkZGxlIEdpdmVuIEZhbWlseSBTdWZmaXgiKQotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9FVVJPUEUgPQotICAgICAgICAoVkVSU0lPTl8yMSB8IE5BTUVfT1JERVJfRVVST1BFIHwgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfRVVST1BFX1NUUiA9ICJ2MjFfZXVyb3BlIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2ZXJzaW9uIDMuMCB3aXRoIHNvbWUgRXVyb3BlIGNvbnZlbnNpb24uIFVzZXMgVVRGLTguCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0VVUk9QRSA9Ci0gICAgICAgIChWRVJTSU9OXzMwIHwgTkFNRV9PUkRFUl9FVVJPUEUgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLSAgICAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfRVVST1BFX1NUUiA9ICJ2MzBfZXVyb3BlIjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSB2Q2FyZCAyLjEgZm9ybWF0IGZvciBtaXNjZWxsYW5lb3VzIEphcGFuZXNlIGRldmljZXMsIHVzaW5nIFVURi04IGFzIGRlZmF1bHQgY2hhcnNldC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UgPQotICAgICAgICAoVkVSU0lPTl8yMSB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TVFIgPSAidjIxX2phcGFuZXNlX3V0ZjgiOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZDYXJkIDMuMCBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgVVRGLTggYXMgZGVmYXVsdCBjaGFyc2V0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSA9Ci0gICAgICAgIChWRVJTSU9OXzMwIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NUUiA9ICJ2MzBfamFwYW5lc2VfdXRmOCI7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdkNhcmQgMi4xIGJhc2VkIGZvcm1hdCB3aGljaCAocGFydGlhbGx5KSBjb25zaWRlcnMgdGhlIGNvbnZlbnRpb24gaW4gSmFwYW5lc2UKLSAgICAgKiBtb2JpbGUgcGhvbmVzLCB3aGVyZSBwaG9uZXRpYyBuYW1lcyBhcmUgdHJhbnNsYXRlZCB0byBoYWxmLXdpZHRoIGthdGFrYW5hIGlmCi0gICAgICogcG9zc2libGUsIGV0Yy4gSXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBTaGlmdF9KSVMgYXMgYSBjaGFyc2V0IGZvciBtYXhpbXVtCi0gICAgICogY29tcGF0aWJpbGl0eS4KLSAgICAgKiA8L3A+Ci0gICAgICogQGhpZGUgU2hvdWxkIG5vdCBiZSBhdmFpbGFibGUgd29ybGQgd2lkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUgPQotICAgICAgICAoVkVSU0lPTl8yMSB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfAotICAgICAgICAgICAgICAgIEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MgfCBGTEFHX1JFRlJBSU5fUVBfVE9fTkFNRV9QUk9QRVJUSUVTKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEVfU1RSID0gInYyMV9qYXBhbmVzZV9tb2JpbGUiOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZDYXJkIGZvcm1hdCB1c2VkIGluIERvQ29Nbywgd2hpY2ggaXMgb25lIG9mIEphcGFuZXNlIG1vYmlsZSBwaG9uZSBjYXJlZXJzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBCYXNlIHZlcnNpb24gaXMgdkNhcmQgMi4xLCBidXQgdGhlIGRhdGEgaGFzIHNldmVyYWwgRG9Db01vLXNwZWNpZmljIGNvbnZlbnNpb25zLgotICAgICAqIE5vIEFuZHJvaWQtc3BlY2lmaWMgcHJvcGVydHkgbm9yIGRlZmFjdCBwcm9wZXJ0eSBpcyBpbmNsdWRlZC4gVGhlICJQcmltYXJ5IiBwcm9wZXJ0aWVzCi0gICAgICogYXJlIE5PVCBlbmNvZGVkIHRvIFF1b3RlZC1QcmludGFibGUuCi0gICAgICogPC9wPgotICAgICAqIEBoaWRlIFNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHdvcmxkIHdpZGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9ET0NPTU8gPQotICAgICAgICAoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFIHwgRkxBR19ET0NPTU8pOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfRE9DT01PX1NUUiA9ICJkb2NvbW8iOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgVkNBUkRfVFlQRV9ERUZBVUxUID0gVkNBUkRfVFlQRV9WMjFfR0VORVJJQzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IHNWQ2FyZFR5cGVNYXA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PEludGVnZXI+IHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQ7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19TVFIsIFZDQVJEX1RZUEVfVjIxX0dFTkVSSUMpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1NUUiwgVkNBUkRfVFlQRV9WMzBfR0VORVJJQyk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9TVFIsIFZDQVJEX1RZUEVfVjIxX0VVUk9QRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjMwX0VVUk9QRV9TVFIsIFZDQVJEX1RZUEVfVjMwX0VVUk9QRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NUUiwgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TVFIsIFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFX1NUUiwgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9ET0NPTU9fU1RSLCBWQ0FSRF9UWVBFX0RPQ09NTyk7Ci0KLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldCA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VkNhcmRUeXBlRnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgdmNhcmRUeXBlU3RyaW5nKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsb3dlcmVkS2V5ID0gdmNhcmRUeXBlU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIGlmIChzVkNhcmRUeXBlTWFwLmNvbnRhaW5zS2V5KGxvd2VyZWRLZXkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc1ZDYXJkVHlwZU1hcC5nZXQobG93ZXJlZEtleSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoImRlZmF1bHQiLmVxdWFsc0lnbm9yZUNhc2UodmNhcmRUeXBlU3RyaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIFZDQVJEX1RZUEVfREVGQVVMVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIHZDYXJkIHR5cGUgU3RyaW5nOiBcIiIgKyB2Y2FyZFR5cGVTdHJpbmcgKyAiXCIiKTsKLSAgICAgICAgICAgIHJldHVybiBWQ0FSRF9UWVBFX0RFRkFVTFQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uMjEoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKHZjYXJkVHlwZSAmIFZFUlNJT05fTUFTSykgPT0gVkVSU0lPTl8yMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uMzAoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKHZjYXJkVHlwZSAmIFZFUlNJT05fTUFTSykgPT0gVkVSU0lPTl8zMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uNDAoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKHZjYXJkVHlwZSAmIFZFUlNJT05fTUFTSykgPT0gVkVSU0lPTl80MDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICFpc1ZlcnNpb24zMCh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE5hbWVPcmRlclR5cGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gdmNhcmRUeXBlICYgTkFNRV9PUkRFUl9NQVNLOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc0RlZmFjdFByb3BlcnR5KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd1BlcmZvcm1hbmNlTG9nKCkgewotICAgICAgICByZXR1cm4gKFZDYXJkQ29uZmlnLkxPR19MRVZFTCAmIFZDYXJkQ29uZmlnLkxPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCkgIT0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkUmVmcmFpblFQVG9OYW1lUHJvcGVydGllcyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgcmV0dXJuICghc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKHZjYXJkVHlwZSkgfHwKLSAgICAgICAgICAgICAgICgodmNhcmRUeXBlICYgRkxBR19SRUZSQUlOX1FQX1RPX05BTUVfUFJPUEVSVElFUykgIT0gMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcHBlbmRUeXBlUGFyYW1OYW1lKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIChpc1ZlcnNpb24zMCh2Y2FyZFR5cGUpIHx8ICgodmNhcmRUeXBlICYgRkxBR19BUFBFTkRfVFlQRV9QQVJBTSkgIT0gMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIEphcGFuZXNlIGFuZCBzb21lIEphcGFuZXNlIGNvbnZlbnNpb24gaXMKLSAgICAgKiBhcHBsaWVkIHRvIGNyZWF0aW5nICJmb3JtYXR0ZWQiIHNvbWV0aGluZyBsaWtlIEZPUk1BVFRFRF9BRERSRVNTLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phcGFuZXNlRGV2aWNlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgLy8gVE9ETzogU29tZSBtYXNrIHdpbGwgYmUgcmVxdWlyZWQgc28gdGhhdCB0aGlzIG1ldGhvZCB3cm9uZ2x5IGludGVycHJldAotICAgICAgICAvLyAgICAgICAgSmFwYW5lc2UiLWxpa2UiIHZDYXJkIHR5cGUuCi0gICAgICAgIC8vICAgICAgICBlLmcuIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMgfCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNUwotICAgICAgICByZXR1cm4gc0phcGFuZXNlTW9iaWxlVHlwZVNldC5jb250YWlucyh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gcmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHZjYXJkVHlwZSA9PSBWQ0FSRF9UWVBFX0RPQ09NTzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb0NvTW8oZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0RPQ09NTykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWQ2FyZENvbmZpZygpIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uc3RhbnRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzNzFlZjkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGluIGJvdGggZXhwb3J0ZXIgYW5kIGltcG9ydGVyIGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9WMjEgPSAiMi4xIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1YzMCA9ICIzLjAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVjQwID0gIjQuMCI7Ci0KLSAgICAvLyBUaGUgcHJvcGVydHkgbmFtZXMgdmFsaWQgYm90aCBpbiB2Q2FyZCAyLjEgYW5kIDMuMC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CRUdJTiA9ICJCRUdJTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkVSU0lPTiA9ICJWRVJTSU9OIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OID0gIk4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZOID0gIkZOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BRFIgPSAiQURSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTUFJTCA9ICJFTUFJTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTk9URSA9ICJOT1RFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PUkcgPSAiT1JHIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TT1VORCA9ICJTT1VORCI7ICAvLyBOb3QgZnVsbHkgc3VwcG9ydGVkLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RFTCA9ICJURUwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RJVExFID0gIlRJVExFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ST0xFID0gIlJPTEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1BIT1RPID0gIlBIT1RPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9MT0dPID0gIkxPR08iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1VSTCA9ICJVUkwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JEQVkgPSAiQkRBWSI7ICAvLyBCaXJ0aGRheSAoMy4wLCA0LjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQklSVEggPSAiQklSVEgiOyAgLy8gUGxhY2Ugb2YgYmlydGggKDQuMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BTk5JVkVSU0FSWSA9ICJBTk5JVkVSU0FSWSI7ICAvLyBEYXRlIG9mIG1hcnJpYWdlICg0LjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJOQU1FIjsgIC8vICgzLjAsIDQsMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OSUNLTkFNRSA9ICJOSUNLTkFNRSI7ICAvLyAoMy4wLCA0LjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU09SVF9TVFJJTkcgPSAiU09SVC1TVFJJTkciOyAgLy8gKDMuMCwgNC4wKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VORCA9ICJFTkQiOwotCi0gICAgLy8gVmFsaWQgcHJvcGVydHkgbmFtZXMgbm90IHN1cHBvcnRlZCAobm90IGFwcHJvcHJpYXRlbHkgaGFuZGxlZCkgYnkgb3VyIGltcG9ydGVyLgotICAgIC8vIFRPRE86IFNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIHZpZXcgb2YgbWVtb3J5IGVmZmljaWVuY3k/Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUkVWID0gIlJFViI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQUdFTlQgPSAiQUdFTlQiOyAgLy8gKDMuMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9EREFZID0gIkREQVkiOyAgLy8gRGF0ZSBvZiBkZWF0aCAoNC4wKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFQVRIID0gIkRFQVRIIjsgIC8vIFBsYWNlIG9mIGRlYXRoICg0LjApCi0KLSAgICAvLyBBdmFpbGFibGUgaW4gdkNhcmQgMy4wLiBTaG91ZCBub3QgdXNlIHdoZW4gY29tcG9zaW5nIHZDYXJkIDIuMSBmaWxlLgotICAgIAotICAgIC8vIERlLWZhY3QgcHJvcGVydHkgdmFsdWVzIGV4cHJlc3NpbmcgcGhvbmV0aWMgbmFtZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FID0gIlgtUEhPTkVUSUMtRklSU1QtTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSA9ICJYLVBIT05FVElDLU1JRERMRS1OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX0xBU1RfTkFNRSA9ICJYLVBIT05FVElDLUxBU1QtTkFNRSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzIGJvdGggQ29udGFjdHNTdHJ1Y3QgYW5kIGRlLWZhY3QgdkNhcmQgZXh0ZW5zaW9ucwotICAgIC8vIFNob3duIGluIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVkNhcmQgc3VwcG9ydCBhcmUgZGVmaW5lZCBoZXJlLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfQUlNID0gIlgtQUlNIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX01TTiA9ICJYLU1TTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9ZQUhPTyA9ICJYLVlBSE9PIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0lDUSA9ICJYLUlDUSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9KQUJCRVIgPSAiWC1KQUJCRVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfR09PR0xFX1RBTEsgPSAiWC1HT09HTEUtVEFMSyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSA9ICJYLVNLWVBFLVVTRVJOQU1FIjsKLSAgICAvLyBQcm9wZXJ0aWVzIG9ubHkgQ29udGFjdHNTdHJ1Y3QgaGFzLiBXZSBhbHNlIHVzZSB0aGlzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUVEgPSAiWC1RUSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9ORVRNRUVUSU5HID0gIlgtTkVUTUVFVElORyI7Ci0KLSAgICAvLyBQaG9uZSBudW1iZXIgZm9yIFNreXBlLCBhdmFpbGFibGUgYXMgdXN1YWwgcGhvbmUuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9TS1lQRV9QU1ROTlVNQkVSID0gIlgtU0tZUEUtUFNUTk5VTUJFUiI7Ci0KLSAgICAvLyBQcm9wZXJ0eSBmb3IgQW5kcm9pZC1zcGVjaWZpYyBmaWVsZHMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSA9ICJYLUFORFJPSUQtQ1VTVE9NIjsKLQotICAgIC8vIFByb3BlcnRpZXMgZm9yIERvQ29NbyB2Q2FyZC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0NMQVNTID0gIlgtQ0xBU1MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUkVEVUNUSU9OID0gIlgtUkVEVUNUSU9OIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05PID0gIlgtTk8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfRENNX0hNTl9NT0RFID0gIlgtRENNLUhNTi1NT0RFIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEUgPSAiVFlQRSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0hPTUUgPSAiSE9NRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9XT1JLID0gIldPUksiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfRkFYID0gIkZBWCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9DRUxMID0gIkNFTEwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVk9JQ0UgPSAiVk9JQ0UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfSU5URVJORVQgPSAiSU5URVJORVQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQ0hBUlNFVCA9ICJDSEFSU0VUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElORyA9ICJFTkNPRElORyI7Ci0KLSAgICAvLyBBYmJyZXZpYXRpb24gb2YgInByZWZlcmVkIiBhY2NvcmRpbmcgdG8gdkNhcmQgMi4xIHNwZWNpZmljYXRpb24uCi0gICAgLy8gV2UgaW50ZXJwcmV0IHRoaXMgdmFsdWUgYXMgInByaW1hcnkiIHByb3BlcnR5IGR1cmluZyBpbXBvcnQvZXhwb3J0LgotICAgIC8vCi0gICAgLy8gTm90ZTogQm90aCB2Q2FyZCBzcGVjcyBkb2VzIG5vdCBtZW50aW9uIGFueXRoaW5nIGFib3V0IHRoZSByZXF1aXJlbWVudCBmb3IgdGhpcyBwYXJhbWV0ZXIsCi0gICAgLy8gICAgICAgYnV0IHRoZXJlIG1heSBiZSBzb21lIHZDYXJkIGltcG9ydGVyIHdoaWNoIHdpbGwgZ2V0IGNvbmZ1c2VkIHdpdGggbW9yZSB0aGFuCi0gICAgLy8gICAgICAgb25lICJQUkVGInMgaW4gb25lIHByb3BlcnR5IG5hbWUsIHdoaWxlIEFuZHJvaWQgYWNjZXB0cyB0aGVtLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfUFJFRiA9ICJQUkVGIjsKLQotICAgIC8vIFBob25lIHR5cGUgcGFyYW1ldGVycyB2YWxpZCBpbiB2Q2FyZCBhbmQga25vd24gdG8gQ29udGFjdHNDb250cmFjdCwgYnV0IG5vdCBzbyBjb21tb24uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9DQVIgPSAiQ0FSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0lTRE4gPSAiSVNETiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9QQUdFUiA9ICJQQUdFUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9UTFggPSAiVExYIjsgIC8vIFRlbGV4Ci0KLSAgICAvLyBQaG9uZSB0eXBlcyBleGlzdGluZyBpbiB2Q2FyZCAyLjEgYnV0IG5vdCBrbm93biB0byBDb250YWN0c0NvbnRyYWN0LgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfTU9ERU0gPSAiTU9ERU0iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfTVNHID0gIk1TRyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9CQlMgPSAiQkJTIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1ZJREVPID0gIlZJREVPIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VOQ09ESU5HXzdCSVQgPSAiN0JJVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRU5DT0RJTkdfOEJJVCA9ICI4QklUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElOR19RUCA9ICJRVU9URUQtUFJJTlRBQkxFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElOR19CQVNFNjQgPSAiQkFTRTY0IjsgIC8vIEF2YWlsYWJsZSBpbiB2Q2FyZCAyLjEKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElOR19CID0gIkIiOyAgLy8gQXZhaWxhYmxlIGluIHZDYXJkIDMuMAotCi0gICAgLy8gVFlQRSBwYXJhbWV0ZXJzIGZvciBQaG9uZXMsIHdoaWNoIGFyZSBub3QgZm9ybWFsbHkgdmFsaWQgaW4gdkNhcmQgKGF0IGxlYXN0IDIuMSkuCi0gICAgLy8gVGhlc2UgdHlwZXMgYXJlIGJhc2ljYWxseSBlbmNvZGVkIHRvICJYLSIgcGFyYW1ldGVycyB3aGVuIGNvbXBvc2luZyB2Q2FyZC4KLSAgICAvLyBQYXJzZXIgcGFzc2VzIHRoZXNlIHdoZW4gIlgtIiBpcyBhZGRlZCB0byB0aGUgcGFyYW1ldGVyIG9yIG5vdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NBTExCQUNLID0gIkNBTExCQUNLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1JBRElPID0gIlJBRElPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1RUWV9UREQgPSAiVFRZLVRERCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9BU1NJU1RBTlQgPSAiQVNTSVNUQU5UIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiV09SSyIgKyAiUFJFRiIuIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DT01QQU5ZX01BSU4gPSAiQ09NUEFOWS1NQUlOIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiVk9JQ0UiIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9PVEhFUiA9ICJPVEhFUiI7Ci0KLSAgICAvLyBUWVBFIHBhcmFtZXRlcnMgZm9yIHBvc3RhbCBhZGRyZXNzZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfUEFSQ0VMID0gIlBBUkNFTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfRE9NID0gIkRPTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfSU5UTCA9ICJJTlRMIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0xBTkdVQUdFID0gIkxBTkdVQUdFIjsKLQotICAgIC8vIFNPUlQtQVMgcGFyYW1ldGVyIGludHJvZHVjZWQgaW4gdkNhcmQgNC4wIChhcyBvZiByZXYuMTMpCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU09SVF9BUyA9ICJTT1JULUFTIjsKLQotICAgIC8vIFRZUEUgcGFyYW1ldGVycyBub3Qgb2ZmaWNpYWxseSB2YWxpZCBidXQgdXNlZCBpbiBzb21lIHZDYXJkIGV4cG9ydGVyLgotICAgIC8vIERvIG5vdCB1c2UgaW4gY29tcG9zZXIgc2lkZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FWFRSQV9UWVBFX0NPTVBBTlkgPSAiQ09NUEFOWSI7Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEltcG9ydE9ubHkgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05JQ0tOQU1FID0gIlgtTklDS05BTUUiOwotICAgICAgICAvLyBTb21lIGRldmljZSBlbWl0cyB0aGlzICJYLSIgcGFyYW1ldGVyIGZvciBleHByZXNzaW5nIEdvb2dsZSBUYWxrLAotICAgICAgICAvLyB3aGljaCBpcyBzcGVjaWZpY2FsbHkgaW52YWxpZCBidXQgc2hvdWxkIGJlIGFsd2F5cyBwcm9wZXJseSBhY2NlcHRlZCwgYW5kIGVtaXR0ZWQKLSAgICAgICAgLy8gaW4gc29tZSBzcGVjaWFsIGNhc2UgKGZvciB0aGF0IGRldmljZS9hcHBsaWNhdGlvbikuCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfR09PR0xFX1RBTEtfV0lUSF9TUEFDRSA9ICJYLUdPT0dMRSBUQUxLIjsKLSAgICB9Ci0KLSAgICAvLy8vIE1haW5seSBmb3IgcGFja2FnZSBjb25zdGFudHMuCi0KLSAgICAvLyBEb0NvTW8gc3BlY2lmaWMgdHlwZSBwYXJhbWV0ZXIuIFVzZWQgd2l0aCAiU09VTkQiIHByb3BlcnR5LCB3aGljaCBpcyBhbHRlcm5hdGUgb2YKLSAgICAvLyBTT1JULVNUUklORyBpbnZDYXJkIDMuMC4KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9YX0lSTUNfTiA9ICJYLUlSTUMtTiI7Ci0KLSAgICAvLyBVc2VkIGluIHVuaXQgdGVzdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfREFUQV9DT0xVTU4gPSAxNTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBNQVhfQ0hBUkFDVEVSX05VTVNfUVAgPSA3NjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9DSEFSQUNURVJfTlVNU19CQVNFNjRfVjMwID0gNzU7Ci0KLSAgICBwcml2YXRlIFZDYXJkQ29uc3RhbnRzKCkgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlMTY3NC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50Lk9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuR3JvdXBNZW1iZXJzaGlwOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0Lkdyb3VwczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBicmlkZ2VzIGJldHdlZW4gZGF0YSBzdHJ1Y3R1cmUgb2YgQ29udGFjdCBhcHAgYW5kIFZDYXJkIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEVudHJ5IjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFID0gT3JnYW5pemF0aW9uLlRZUEVfV09SSzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEVfR09PR0xFID0gImNvbS5nb29nbGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT09HTEVfTVlfQ09OVEFDVFNfR1JPVVAgPSAiU3lzdGVtIEdyb3VwOiBNeSBDb250YWN0cyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzSW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNLCBJbS5QUk9UT0NPTF9BSU0pOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOLCBJbS5QUk9UT0NPTF9NU04pOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfWUFIT08sIEltLlBST1RPQ09MX1lBSE9PKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSwgSW0uUFJPVE9DT0xfSUNRKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUiwgSW0uUFJPVE9DT0xfSkFCQkVSKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FLCBJbS5QUk9UT0NPTF9TS1lQRSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9HT09HTEVfVEFMSywgSW0uUFJPVE9DT0xfR09PR0xFX1RBTEspOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLkltcG9ydE9ubHkuUFJPUEVSVFlfWF9HT09HTEVfVEFMS19XSVRIX1NQQUNFLAotICAgICAgICAgICAgICAgIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBob25lRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICAvLyBpc1ByaW1hcnkgaXMgKG5vdCBmaW5hbCBidXQpIGNoYW5nYWJsZSwgb25seSB3aGVuIHRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgb25lIGV4aXN0aW5nCi0gICAgICAgIC8vIGluIHRoZSBvcmlnaW5hbCBWQ2FyZC4KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotICAgICAgICBwdWJsaWMgUGhvbmVEYXRhKGludCB0eXBlLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGhvbmVEYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBob25lRGF0YSBwaG9uZURhdGEgPSAoUGhvbmVEYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBwaG9uZURhdGEudHlwZSAmJiBkYXRhLmVxdWFscyhwaG9uZURhdGEuZGF0YSkgJiYKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwuZXF1YWxzKHBob25lRGF0YS5sYWJlbCkgJiYgaXNQcmltYXJ5ID09IHBob25lRGF0YS5pc1ByaW1hcnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGRhdGE6ICVzLCBsYWJlbDogJXMsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBkYXRhLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1haWxEYXRhIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGRhdGE7Ci0gICAgICAgIC8vIFVzZWQgb25seSB3aGVuIFRZUEUgaXMgVFlQRV9DVVNUT00uCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgcHVibGljIEVtYWlsRGF0YShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEVtYWlsRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbWFpbERhdGEgZW1haWxEYXRhID0gKEVtYWlsRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gZW1haWxEYXRhLnR5cGUgJiYgZGF0YS5lcXVhbHMoZW1haWxEYXRhLmRhdGEpICYmCi0gICAgICAgICAgICAgICAgICAgIGxhYmVsLmVxdWFscyhlbWFpbERhdGEubGFiZWwpICYmIGlzUHJpbWFyeSA9PSBlbWFpbERhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBkYXRhOiAlcywgbGFiZWw6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvc3RhbERhdGEgewotICAgICAgICAvLyBEZXRlcm1pbmVkIGJ5IHZDYXJkIHNwZWNpZmljYXRpb24uCi0gICAgICAgIC8vIC0gUE8gQm94LCBFeHRlbmRlZCBBZGRyLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLCBDb3VudHJ5IE5hbWUKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREUl9NQVhfREFUQV9TSVpFID0gNzsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBkYXRhQXJyYXk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcG9ib3g7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHN0cmVldDsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsb2NhbHR5OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHJlZ2lvbjsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwb3N0YWxDb2RlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvdW50cnk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBQb3N0YWxEYXRhKGZpbmFsIGludCB0eXBlLCBmaW5hbCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgZGF0YUFycmF5ID0gbmV3IFN0cmluZ1tBRERSX01BWF9EQVRBX1NJWkVdOwotCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IHByb3BWYWx1ZUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiBBRERSX01BWF9EQVRBX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gQUREUl9NQVhfREFUQV9TSVpFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZHItdmFsdWUgPSAwKjYodGV4dC12YWx1ZSAiOyIpIHRleHQtdmFsdWUKLSAgICAgICAgICAgIC8vICAgICAgICAgICA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkcmVzcywgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwKLSAgICAgICAgICAgIC8vICAgICAgICAgICA7IENvZGUsIENvdW50cnkgTmFtZQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFVzZSBJdGVyYXRvciBhc3N1bWluZyBMaXN0IG1heSBiZSBMaW5rZWRMaXN0LCB0aG91Z2ggYWN0dWFsbHkgaXQgaXMKLSAgICAgICAgICAgIC8vIGFsd2F5cyBBcnJheUxpc3QgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBhZGRyZXNzRWxlbWVudCA6IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBkYXRhQXJyYXlbaV0gPSBhZGRyZXNzRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoKytpID49IHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGkgPCBBRERSX01BWF9EQVRBX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBkYXRhQXJyYXlbaSsrXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMucG9ib3ggPSBkYXRhQXJyYXlbMF07Ci0gICAgICAgICAgICB0aGlzLmV4dGVuZGVkQWRkcmVzcyA9IGRhdGFBcnJheVsxXTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWV0ID0gZGF0YUFycmF5WzJdOwotICAgICAgICAgICAgdGhpcy5sb2NhbHR5ID0gZGF0YUFycmF5WzNdOwotICAgICAgICAgICAgdGhpcy5yZWdpb24gPSBkYXRhQXJyYXlbNF07Ci0gICAgICAgICAgICB0aGlzLnBvc3RhbENvZGUgPSBkYXRhQXJyYXlbNV07Ci0gICAgICAgICAgICB0aGlzLmNvdW50cnkgPSBkYXRhQXJyYXlbNl07Ci0gICAgICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUG9zdGFsRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBQb3N0YWxEYXRhIHBvc3RhbERhdGEgPSAoUG9zdGFsRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKEFycmF5cy5lcXVhbHMoZGF0YUFycmF5LCBwb3N0YWxEYXRhLmRhdGFBcnJheSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gcG9zdGFsRGF0YS50eXBlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWwgPT0gcG9zdGFsRGF0YS5sYWJlbCkgOiB0cnVlKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeSA9PSBwb3N0YWxEYXRhLmlzUHJpbWFyeSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXR0ZWRBZGRyZXNzKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBib29sZWFuIGVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc0phcGFuZXNlRGV2aWNlKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBJbiBKYXBhbiwgdGhlIG9yZGVyIGlzIHJldmVyc2VkLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBBRERSX01BWF9EQVRBX1NJWkUgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc1BhcnQgPSBkYXRhQXJyYXlbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoYWRkcmVzc1BhcnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGFkZHJlc3NQYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBRERSX01BWF9EQVRBX1NJWkU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc1BhcnQgPSBkYXRhQXJyYXlbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoYWRkcmVzc1BhcnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGFkZHJlc3NQYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgbGFiZWw6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9yZ2FuaXphdGlvbkRhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIC8vIG5vbi1maW5hbCBpcyBJbnRlbnRpb25hbDogd2UgbWF5IGNoYW5nZSB0aGUgdmFsdWVzIHNpbmNlIHRoaXMgaW5mbyBpcyBzZXBhcmF0ZWQgaW50bwotICAgICAgICAvLyB0d28gcGFydHMgaW4gdkNhcmQ6ICJPUkciICsgIlRJVExFIiwgYW5kIHdlIGhhdmUgdG8gY29wZSB3aXRoIGVhY2ggZmllbGQgaW4KLSAgICAgICAgLy8gZGlmZmVyZW50IHRpbWluZy4KLSAgICAgICAgcHVibGljIFN0cmluZyBjb21wYW55TmFtZTsKLSAgICAgICAgcHVibGljIFN0cmluZyBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgcHVibGljIFN0cmluZyB0aXRsZU5hbWU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lOyAgLy8gV2Ugd29uJ3QgaGF2ZSB0aGlzIGluICJUSVRMRSIgcHJvcGVydHkuCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgT3JnYW5pemF0aW9uRGF0YShpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29tcGFueU5hbWUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lLAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZU5hbWUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTmFtZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudE5hbWUgPSBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgICAgIHRoaXMudGl0bGVOYW1lID0gdGl0bGVOYW1lOwotICAgICAgICAgICAgdGhpcy5waG9uZXRpY05hbWUgPSBwaG9uZXRpY05hbWU7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbiA9IChPcmdhbml6YXRpb25EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBvcmdhbml6YXRpb24udHlwZSAmJgotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGNvbXBhbnlOYW1lLCBvcmdhbml6YXRpb24uY29tcGFueU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMoZGVwYXJ0bWVudE5hbWUsIG9yZ2FuaXphdGlvbi5kZXBhcnRtZW50TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyh0aXRsZU5hbWUsIG9yZ2FuaXphdGlvbi50aXRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9PSBvcmdhbml6YXRpb24uaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY29tcGFueU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29tcGFueU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRlcGFydG1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZGVwYXJ0bWVudE5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRpdGxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAidHlwZTogJWQsIGNvbXBhbnk6ICVzLCBkZXBhcnRtZW50OiAlcywgdGl0bGU6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCB0aXRsZU5hbWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgcHJvdG9jb2w7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3VzdG9tUHJvdG9jb2w7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIEltRGF0YShmaW5hbCBpbnQgcHJvdG9jb2wsIGZpbmFsIFN0cmluZyBjdXN0b21Qcm90b2NvbCwgZmluYWwgaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEsIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgICAgICB0aGlzLmN1c3RvbVByb3RvY29sID0gY3VzdG9tUHJvdG9jb2w7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBJbURhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW1EYXRhIGltRGF0YSA9IChJbURhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IGltRGF0YS50eXBlICYmIHByb3RvY29sID09IGltRGF0YS5wcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAmJiAoY3VzdG9tUHJvdG9jb2wgIT0gbnVsbCA/IGN1c3RvbVByb3RvY29sLmVxdWFscyhpbURhdGEuY3VzdG9tUHJvdG9jb2wpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbURhdGEuY3VzdG9tUHJvdG9jb2wgPT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgICYmIChkYXRhICE9IG51bGwgPyBkYXRhLmVxdWFscyhpbURhdGEuZGF0YSkgOiAoaW1EYXRhLmRhdGEgPT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzUHJpbWFyeSA9PSBpbURhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJ0eXBlOiAlZCwgcHJvdG9jb2w6ICVkLCBjdXN0b21fcHJvdGNvbDogJXMsIGRhdGE6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgcHJvdG9jb2wsIGN1c3RvbVByb3RvY29sLCBkYXRhLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQaG90b0RhdGEgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfRkxBU0ggPSAiU1dGIjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZvcm1hdE5hbWU7ICAvLyB1c2VkIHdoZW4gdHlwZSBpcyBub3QgZGVmaW5lZCBpbiBDb250YWN0c0NvbnRyYWN0LgotICAgICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIHBob3RvQnl0ZXM7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgUGhvdG9EYXRhKGludCB0eXBlLCBTdHJpbmcgZm9ybWF0TmFtZSwgYnl0ZVtdIHBob3RvQnl0ZXMsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5mb3JtYXROYW1lID0gZm9ybWF0TmFtZTsKLSAgICAgICAgICAgIHRoaXMucGhvdG9CeXRlcyA9IHBob3RvQnl0ZXM7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGhvdG9EYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBob3RvRGF0YSBwaG90b0RhdGEgPSAoUGhvdG9EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBwaG90b0RhdGEudHlwZSAmJgotICAgICAgICAgICAgICAgICAgICAoZm9ybWF0TmFtZSA9PSBudWxsID8gKHBob3RvRGF0YS5mb3JtYXROYW1lID09IG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXROYW1lLmVxdWFscyhwaG90b0RhdGEuZm9ybWF0TmFtZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIChBcnJheXMuZXF1YWxzKHBob3RvQnl0ZXMsIHBob3RvRGF0YS5waG90b0J5dGVzKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeSA9PSBwaG90b0RhdGEuaXNQcmltYXJ5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZm9ybWF0OiAlczogc2l6ZTogJWQsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBmb3JtYXROYW1lLCBwaG90b0J5dGVzLmxlbmd0aCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFByb3BlcnR5IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IG1QYXJhbWV0ZXJNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+KCk7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1Qcm9wZXJ0eVZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBtUHJvcGVydHlCeXRlczsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihmaW5hbCBTdHJpbmcgcGFyYW1OYW1lLCBmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlczsKLSAgICAgICAgICAgIGlmICghbVBhcmFtZXRlck1hcC5jb250YWluc0tleShwYXJhbU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIlRZUEUiKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJNYXAucHV0KHBhcmFtTmFtZSwgdmFsdWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gbVBhcmFtZXRlck1hcC5nZXQocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlcy5hZGQocGFyYW1WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUb1Byb3BlcnR5VmFsdWVMaXN0KGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlWYWx1ZUxpc3QuYWRkKHByb3BlcnR5VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlCeXRlcyhmaW5hbCBieXRlW10gcHJvcGVydHlCeXRlcykgewotICAgICAgICAgICAgbVByb3BlcnR5Qnl0ZXMgPSBwcm9wZXJ0eUJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQYXJhbWV0ZXJzKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhcmFtZXRlck1hcC5nZXQodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldFByb3BlcnR5VmFsdWVMaXN0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eVZhbHVlTGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgbVByb3BlcnR5TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBtUGFyYW1ldGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJvcGVydHlWYWx1ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eUJ5dGVzID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE8oZG1peWFrYXdhKTogdkNhcmQgNC4wIGxvZ2ljYWxseSBoYXMgbXVsdGlwbGUgZm9ybWF0dGVkIG5hbWVzIGFuZCB3ZSBuZWVkIHRvCi0gICAgLy8gc2VsZWN0IHRoZSBtb3N0IHByZWZlcmFibGUgb25lIHVzaW5nIFBSRUYgcGFyYW1ldGVyLgotICAgIC8vCi0gICAgLy8gZS5nLiAoYmFzZWQgb24gcmV2LjEzKQotICAgIC8vIEZOO1BSRUY9MTpKb2huIE0uIERvZQotICAgIC8vIEZOO1BSRUY9MjpKb2huIERvZQotICAgIC8vIEZOO1BSRUY9MztKb2huCi0KLSAgICBwcml2YXRlIFN0cmluZyBtRmFtaWx5TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtR2l2ZW5OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1NaWRkbGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QcmVmaXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVN1ZmZpeDsKLQotICAgIC8vIFVzZWQgb25seSB3aGVuIG5vIGZhbWlseSBub3IgZ2l2ZW4gbmFtZSBpcyBmb3VuZC4KLSAgICBwcml2YXRlIFN0cmluZyBtRm9ybWF0dGVkTmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljR2l2ZW5OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY01pZGRsZU5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNGdWxsTmFtZTsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1OaWNrTmFtZUxpc3Q7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtQmlydGhkYXk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFubml2ZXJzYXJ5OwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU5vdGVMaXN0OwotICAgIHByaXZhdGUgTGlzdDxQaG9uZURhdGE+IG1QaG9uZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEVtYWlsRGF0YT4gbUVtYWlsTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8UG9zdGFsRGF0YT4gbVBvc3RhbExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PE9yZ2FuaXphdGlvbkRhdGE+IG1Pcmdhbml6YXRpb25MaXN0OwotICAgIHByaXZhdGUgTGlzdDxJbURhdGE+IG1JbUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFBob3RvRGF0YT4gbVBob3RvTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtV2Vic2l0ZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PExpc3Q8U3RyaW5nPj4gbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3Q7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgQWNjb3VudCBtQWNjb3VudDsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5KCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5KGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyh2Y2FyZFR5cGUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5KGludCB2Y2FyZFR5cGUsIEFjY291bnQgYWNjb3VudCkgewotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtQWNjb3VudCA9IGFjY291bnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBob25lKGludCB0eXBlLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobVBob25lTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxQaG9uZURhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRyaW1lZCA9IGRhdGEudHJpbSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkTnVtYmVyOwotICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX1BBR0VSIHx8IFZDYXJkQ29uZmlnLnJlZnJhaW5QaG9uZU51bWJlckZvcm1hdHRpbmcobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGZvcm1hdHRlZE51bWJlciA9IHRyaW1lZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB0cmltZWQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IHRyaW1lZC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fCAoaSA9PSAwICYmIGNoID09ICcrJykpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgaW50IGZvcm1hdHRpbmdUeXBlID0gVkNhcmRVdGlscy5nZXRQaG9uZU51bWJlckZvcm1hdChtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgIGZvcm1hdHRlZE51bWJlciA9IFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKGJ1aWxkZXIudG9TdHJpbmcoKSwgZm9ybWF0dGluZ1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIFBob25lRGF0YSBwaG9uZURhdGEgPSBuZXcgUGhvbmVEYXRhKHR5cGUsIGZvcm1hdHRlZE51bWJlciwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIG1QaG9uZUxpc3QuYWRkKHBob25lRGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5pY2tOYW1lKGZpbmFsIFN0cmluZyBuaWNrTmFtZSkgewotICAgICAgICBpZiAobU5pY2tOYW1lTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTmlja05hbWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbU5pY2tOYW1lTGlzdC5hZGQobmlja05hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRFbWFpbChpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpewotICAgICAgICBpZiAobUVtYWlsTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRW1haWxMaXN0ID0gbmV3IEFycmF5TGlzdDxFbWFpbERhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUVtYWlsTGlzdC5hZGQobmV3IEVtYWlsRGF0YSh0eXBlLCBkYXRhLCBsYWJlbCwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBvc3RhbChpbnQgdHlwZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpewotICAgICAgICBpZiAobVBvc3RhbExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbVBvc3RhbExpc3QgPSBuZXcgQXJyYXlMaXN0PFBvc3RhbERhdGE+KDApOwotICAgICAgICB9Ci0gICAgICAgIG1Qb3N0YWxMaXN0LmFkZChuZXcgUG9zdGFsRGF0YSh0eXBlLCBwcm9wVmFsdWVMaXN0LCBsYWJlbCwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCB2aWEge0BsaW5rICNoYW5kbGVPcmdWYWx1ZShpbnQsIExpc3QsIE1hcCwgYm9vbGVhbikgb3IKLSAgICAgKiB7QGxpbmsgI2hhbmRsZVRpdGxlVmFsdWUoU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5ld09yZ2FuaXphdGlvbihpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGNvbXBhbnlOYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpdGxlTmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY05hbWUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbU9yZ2FuaXphdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9yZ2FuaXphdGlvbkRhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbU9yZ2FuaXphdGlvbkxpc3QuYWRkKG5ldyBPcmdhbml6YXRpb25EYXRhKHR5cGUsIGNvbXBhbnlOYW1lLAotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lLCB0aXRsZU5hbWUsIHBob25ldGljTmFtZSwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IHNFbXB0eUxpc3QgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCkpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYnVpbGRTaW5nbGVQaG9uZXRpY05hbWVGcm9tU29ydEFzUGFyYW0oTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBwYXJhbU1hcCkgewotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gc29ydEFzQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9TT1JUX0FTKTsKLSAgICAgICAgaWYgKHNvcnRBc0NvbGxlY3Rpb24gIT0gbnVsbCAmJiBzb3J0QXNDb2xsZWN0aW9uLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoc29ydEFzQ29sbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkluY29ycmVjdCBtdWx0aXBsZSBTT1JUX0FTIHBhcmFtZXRlcnMgZGV0ZWN0ZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKHNvcnRBc0NvbGxlY3Rpb24udG9BcnJheSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gc29ydE5hbWVzID0KLSAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHNvcnRBc0NvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZWxlbSA6IHNvcnROYW1lcykgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVsZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0ICJPUkciIHJlbGF0ZWQgdmFsdWVzIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhLiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiB7QGxpbmsgT3JnYW5pemF0aW9uRGF0YX0gb2JqZWN0cywgdGhpcyBpbnB1dCBkYXRhIGFyZSBhdHRhY2hlZCB0byB0aGUgbGFzdCBvbmUgd2hpY2gKLSAgICAgKiBkb2VzIG5vdCBoYXZlIHZhbGlkIHZhbHVlcyAobm90IGluY2x1ZGluZyBlbXB0eSBidXQgb25seSBudWxsKS4gSWYgdGhlcmUncyBubwotICAgICAqIHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBvYmplY3QsIGEgbmV3IHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBpcyBjcmVhdGVkLAotICAgICAqIHdob3NlIHRpdGxlIGlzIHNldCB0byBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVPcmdWYWx1ZShmaW5hbCBpbnQgdHlwZSwgTGlzdDxTdHJpbmc+IG9yZ0xpc3QsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBhcmFtTWFwLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lID0gYnVpbGRTaW5nbGVQaG9uZXRpY05hbWVGcm9tU29ydEFzUGFyYW0ocGFyYW1NYXApOwotICAgICAgICBpZiAob3JnTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvcmdMaXN0ID0gc0VtcHR5TGlzdDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgY29tcGFueU5hbWU7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBvcmdMaXN0LnNpemUoKTsKLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICBjYXNlIDA6IHsKLSAgICAgICAgICAgICAgICBjb21wYW55TmFtZSA9ICIiOwotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgIGNvbXBhbnlOYW1lID0gb3JnTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogeyAgLy8gTW9yZSB0aGFuIDEuCi0gICAgICAgICAgICAgICAgY29tcGFueU5hbWUgPSBvcmdMaXN0LmdldCgwKTsKLSAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3Qgc3VyZSB3aGljaCBpcyB0aGUgY29ycmVjdCBzdHJpbmcgZm9yIGRlcGFydG1lbnQuCi0gICAgICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8ga2VlcCBhbGwgdGhlIGRhdGEsIGNvbmNhdGluYXRlIHRoZSByZXN0IG9mIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG9yZ0xpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Pcmdhbml6YXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgZmlyc3Qgb3JnYW5pemF0aW9uIGVudHJ5LCB3aXRoICJudWxsIiB0aXRsZSB3aGljaCBtYXkgYmUKLSAgICAgICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVUaXRsZVZhbHVlKCkuCi0gICAgICAgICAgICBhZGROZXdPcmdhbml6YXRpb24odHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCBudWxsLCBwaG9uZXRpY05hbWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbkRhdGEgOiBtT3JnYW5pemF0aW9uTGlzdCkgewotICAgICAgICAgICAgLy8gTm90IHVzZSBUZXh0VXRpbHMuaXNFbXB0eSgpIHNpbmNlIE9SRyB3YXMgc2V0IGJ1dCB0aGUgZWxlbWVudHMgbWlnaHQgYmUgZW1wdHkuCi0gICAgICAgICAgICAvLyBlLmcuICJPUkc7UFJFRjo7IiAtPiBCb3RoIGNvbXBhbnlOYW1lIGFuZCBkZXBhcnRtZW50TmFtZSBiZWNvbWUgZW1wdHkgYnV0IG5vdCBudWxsLgotICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBQcm9iYWJseSB0aGUgIlRJVExFIiBwcm9wZXJ0eSBjb21lcyBiZWZvcmUgdGhlICJPUkciIHByb3BlcnR5IHZpYQotICAgICAgICAgICAgICAgIC8vIGhhbmRsZVRpdGxlTGluZSgpLgotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID0gZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIE9yZ2FuaXphdGlvRGF0YSBpcyBhdmFpbGFibGUuIENyZWF0ZSBhbm90aGVyIG9uZSwgd2l0aCAibnVsbCIgdGl0bGUsIHdoaWNoIG1heSBiZQotICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlVGl0bGVWYWx1ZSgpLgotICAgICAgICBhZGROZXdPcmdhbml6YXRpb24odHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCBudWxsLCBwaG9uZXRpY05hbWUsIGlzUHJpbWFyeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0ICJ0aXRsZSIgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGEuIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZQotICAgICAqIE9yZ2FuaXphdGlvbkRhdGEgb2JqZWN0cywgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byB0aGUgbGFzdCBvbmUgd2hpY2ggZG9lcyBub3QKLSAgICAgKiBoYXZlIHZhbGlkIHRpdGxlIHZhbHVlIChub3QgaW5jbHVkaW5nIGVtcHR5IGJ1dCBvbmx5IG51bGwpLiBJZiB0aGVyZSdzIG5vCi0gICAgICogT3JnYW5pemF0aW9uRGF0YSBvYmplY3QsIGEgbmV3IE9yZ2FuaXphdGlvbkRhdGEgaXMgY3JlYXRlZCwgd2hvc2UgY29tcGFueSBuYW1lIGlzCi0gICAgICogc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRpdGxlVmFsdWUoZmluYWwgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGZpcnN0IG9yZ2FuaXphdGlvbiBlbnRyeSwgd2l0aCAibnVsbCIgb3RoZXIgaW5mbywgd2hpY2ggbWF5IGJlCi0gICAgICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlT3JnVmFsdWUoKS4KLSAgICAgICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbihERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFLCBudWxsLCBudWxsLCB0aXRsZSwgbnVsbCwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb25EYXRhIDogbU9yZ2FuaXphdGlvbkxpc3QpIHsKLSAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUgPSB0aXRsZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm8gT3JnYW5pemF0aW9uIGlzIGF2YWlsYWJsZS4gQ3JlYXRlIGFub3RoZXIgb25lLCB3aXRoICJudWxsIiBvdGhlciBpbmZvLCB3aGljaCBtYXkgYmUKLSAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZU9yZ1ZhbHVlKCkuCi0gICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbihERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFLCBudWxsLCBudWxsLCB0aXRsZSwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRJbShpbnQgcHJvdG9jb2wsIFN0cmluZyBjdXN0b21Qcm90b2NvbCwgaW50IHR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgcHJvcFZhbHVlLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobUltTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtSW1MaXN0ID0gbmV3IEFycmF5TGlzdDxJbURhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUltTGlzdC5hZGQobmV3IEltRGF0YShwcm90b2NvbCwgY3VzdG9tUHJvdG9jb2wsIHR5cGUsIHByb3BWYWx1ZSwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5vdGUoZmluYWwgU3RyaW5nIG5vdGUpIHsKLSAgICAgICAgaWYgKG1Ob3RlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTm90ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU5vdGVMaXN0LmFkZChub3RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGhvdG9CeXRlcyhTdHJpbmcgZm9ybWF0TmFtZSwgYnl0ZVtdIHBob3RvQnl0ZXMsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtUGhvdG9MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG90b0xpc3QgPSBuZXcgQXJyYXlMaXN0PFBob3RvRGF0YT4oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgUGhvdG9EYXRhIHBob3RvRGF0YSA9IG5ldyBQaG90b0RhdGEoMCwgbnVsbCwgcGhvdG9CeXRlcywgaXNQcmltYXJ5KTsKLSAgICAgICAgbVBob3RvTGlzdC5hZGQocGhvdG9EYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byBleHRyYWN0IHBhcmFtTWFwLCBjb25zdHJ1Y3RzIFNPUlQtQVMgcGFyYW1ldGVyIHZhbHVlcywgYW5kIHN0b3JlIHRoZW0gaW4KLSAgICAgKiBhcHByb3ByaWF0ZSBwaG9uZXRpYyBuYW1lIHZhcmlhYmxlcy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNhcmUgdGhlIHZDYXJkIHZlcnNpb24uIEV2ZW4gd2hlbiB3ZSBoYXZlIFNPUlQtQVMgcGFyYW1ldGVycyBpbgotICAgICAqIGludmFsaWQgdmVyc2lvbnMgKGkuZS4gMi4xIGFuZCAzLjApLCB3ZSBzY2lsZW50bHkgYWNjZXB0IHRoZW0gc28gdGhhdCB3ZSB3b24ndCBkcm9wCi0gICAgICogbWVhbmluZ2Z1bCBpbmZvcm1hdGlvbi4gSWYgd2UgaGFkIHRoaXMgcGFyYW1ldGVyIGluIHRoZSBOIGZpZWxkIG9mIHZDYXJkIDMuMCwgYW5kCi0gICAgICogdGhlIGNvbnRhY3QgZGF0YSBhbHNvIGhhdmUgU09SVC1TVFJJTkcsIHdlIHdpbGwgcHJlZmVyIFNPUlQtU1RSSU5HLCBzaW5jZSBpdCBpcwotICAgICAqIHJlZ2l0aW1hdGUgcHJvcGVydHkgdG8gYmUgdW5kZXJzdG9vZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdHJ5SGFuZGxlU29ydEFzTmFtZShmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBhcmFtTWFwKSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSAmJgotICAgICAgICAgICAgICAgICEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHNvcnRBc0NvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fU09SVF9BUyk7Ci0gICAgICAgIGlmIChzb3J0QXNDb2xsZWN0aW9uICE9IG51bGwgJiYgc29ydEFzQ29sbGVjdGlvbi5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKHNvcnRBc0NvbGxlY3Rpb24uc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbmNvcnJlY3QgbXVsdGlwbGUgU09SVF9BUyBwYXJhbWV0ZXJzIGRldGVjdGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhzb3J0QXNDb2xsZWN0aW9uLnRvQXJyYXkoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHNvcnROYW1lcyA9Ci0gICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShzb3J0QXNDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgaW50IHNpemUgPSBzb3J0TmFtZXMuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAzKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgMzogbVBob25ldGljTWlkZGxlTmFtZSA9IHNvcnROYW1lcy5nZXQoMik7IC8vJEZBTEwtVEhST1VHSCQKLSAgICAgICAgICAgIGNhc2UgMjogbVBob25ldGljR2l2ZW5OYW1lID0gc29ydE5hbWVzLmdldCgxKTsgLy8kRkFMTC1USFJPVUdIJAotICAgICAgICAgICAgZGVmYXVsdDogbVBob25ldGljRmFtaWx5TmFtZSA9IHNvcnROYW1lcy5nZXQoMCk7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTlByb3BlcnR5KGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbVZhbHVlcywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gcGFyYW1NYXApIHsKLSAgICAgICAgLy8gaW4gdkNhcmQgNC4wLCBTT1JULUFTIHBhcmFtZXRlciBpcyBhdmFpbGFibGUuCi0gICAgICAgIHRyeUhhbmRsZVNvcnRBc05hbWUocGFyYW1NYXApOwotCi0gICAgICAgIC8vIEZhbWlseSwgR2l2ZW4sIE1pZGRsZSwgUHJlZml4LCBTdWZmaXguICgxIC0gNSkKLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGlmIChwYXJhbVZhbHVlcyA9PSBudWxsIHx8IChzaXplID0gcGFyYW1WYWx1ZXMuc2l6ZSgpKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2l6ZSA+IDUpIHsKLSAgICAgICAgICAgIHNpemUgPSA1OwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgIC8vIEZhbGwtdGhyb3VnaC4KLSAgICAgICAgY2FzZSA1OiBtU3VmZml4ID0gcGFyYW1WYWx1ZXMuZ2V0KDQpOwotICAgICAgICBjYXNlIDQ6IG1QcmVmaXggPSBwYXJhbVZhbHVlcy5nZXQoMyk7Ci0gICAgICAgIGNhc2UgMzogbU1pZGRsZU5hbWUgPSBwYXJhbVZhbHVlcy5nZXQoMik7Ci0gICAgICAgIGNhc2UgMjogbUdpdmVuTmFtZSA9IHBhcmFtVmFsdWVzLmdldCgxKTsKLSAgICAgICAgZGVmYXVsdDogbUZhbWlseU5hbWUgPSBwYXJhbVZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlOiBTb21lIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgdXNlIHRoaXMgZmllbGQgZm9yIHBob25ldGljIG5hbWUsCi0gICAgICogICAgICAgc2luY2UgdkNhcmQgMi4xIGRvZXMgbm90IGhhdmUgIlNPUlQtU1RSSU5HIiB0eXBlLgotICAgICAqICAgICAgIEFsc28sIGluIHNvbWUgY2FzZXMsIHRoZSBmaWVsZCBoYXMgc29tZSAnOydzIGluIGl0LgotICAgICAqICAgICAgIEFzc3VtZSB0aGUgJzsnIG1lYW5zIHRoZSBzYW1lIG1lYW5pbmcgaW4gTiBwcm9wZXJ0eQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJmYWxsdGhyb3VnaCIpCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBob25ldGljTmFtZUZyb21Tb3VuZChMaXN0PFN0cmluZz4gZWxlbXMpIHsKLSAgICAgICAgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0dpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoZSBvdGhlciBwcm9wZXJ0aWVzIGxpa2UgIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIgd2FzIGFscmVhZHkgZm91bmQuCi0gICAgICAgICAgICAvLyBJZ25vcmUgIlNPVU5EO1gtSVJNQy1OIi4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzaXplOwotICAgICAgICBpZiAoZWxlbXMgPT0gbnVsbCB8fCAoc2l6ZSA9IGVsZW1zLnNpemUoKSkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBc3N1bWUgdGhhdCB0aGUgb3JkZXIgaXMgIkZhbWlseSwgR2l2ZW4sIE1pZGRsZSIuCi0gICAgICAgIC8vIFRoaXMgaXMgbm90IGZyb20gc3BlY2lmaWNhdGlvbiBidXQgbWVyZSBhc3N1bXB0aW9uLiBTb21lIEphcGFuZXNlIHBob25lcyB1c2UgdGhpcyBvcmRlci4KLSAgICAgICAgaWYgKHNpemUgPiAzKSB7Ci0gICAgICAgICAgICBzaXplID0gMzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbGVtcy5nZXQoMCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBib29sZWFuIG9ubHlGaXJzdEVsZW1Jc05vbkVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1zLmdldChpKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb25seUZpcnN0RWxlbUlzTm9uRW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9ubHlGaXJzdEVsZW1Jc05vbkVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbmFtZXNBcnJheSA9IGVsZW1zLmdldCgwKS5zcGxpdCgiICIpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBuYW1lQXJyYXlMZW5ndGggPSBuYW1lc0FycmF5Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAobmFtZUFycmF5TGVuZ3RoID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBzdHJpbmcgaXMgIkZhbWlseSBNaWRkbGUgR2l2ZW4iLgotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lID0gbmFtZXNBcnJheVswXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljTWlkZGxlTmFtZSA9IG5hbWVzQXJyYXlbMV07Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0dpdmVuTmFtZSA9IG5hbWVzQXJyYXlbMl07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lQXJyYXlMZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIHN0cmluZyBpcyAiRmFtaWx5IEdpdmVuIiBiYXNlZCBvbiB0aGUgSmFwYW5lc2UgbW9iaWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIHBob25lcycgcHJlZmVyZW5jZS4KLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IG5hbWVzQXJyYXlbMF07Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0dpdmVuTmFtZSA9IG5hbWVzQXJyYXlbMV07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljRnVsbE5hbWUgPSBlbGVtcy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgIGNhc2UgMzogbVBob25ldGljTWlkZGxlTmFtZSA9IGVsZW1zLmdldCgyKTsKLSAgICAgICAgICAgIGNhc2UgMjogbVBob25ldGljR2l2ZW5OYW1lID0gZWxlbXMuZ2V0KDEpOwotICAgICAgICAgICAgZGVmYXVsdDogbVBob25ldGljRmFtaWx5TmFtZSA9IGVsZW1zLmdldCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KGZpbmFsIFByb3BlcnR5IHByb3BlcnR5KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5Lm1Qcm9wZXJ0eU5hbWU7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gcGFyYW1NYXAgPSBwcm9wZXJ0eS5tUGFyYW1ldGVyTWFwOwotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCA9IHByb3BlcnR5Lm1Qcm9wZXJ0eVZhbHVlTGlzdDsKLSAgICAgICAgYnl0ZVtdIHByb3BCeXRlcyA9IHByb3BlcnR5Lm1Qcm9wZXJ0eUJ5dGVzOwotCi0gICAgICAgIGlmIChwcm9wVmFsdWVMaXN0LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGxpc3RUb1N0cmluZyhwcm9wVmFsdWVMaXN0KS50cmltKCk7Ci0KLSAgICAgICAgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgdmVyc2lvbi4gSWdub3JlIHRoaXMuCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOKSkgewotICAgICAgICAgICAgbUZvcm1hdHRlZE5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05BTUUpICYmIG1Gb3JtYXR0ZWROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE9ubHkgaW4gdkNhcmQgMy4wLiBVc2UgdGhpcyBpZiBGTiwgd2hpY2ggbXVzdCBleGlzdCBpbiB2Q2FyZCAzLjAgYnV0IG1heSBub3QKLSAgICAgICAgICAgIC8vIGFjdHVhbGx5IGV4aXN0IGluIHRoZSByZWFsIHZDYXJkIGRhdGEsIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgbUZvcm1hdHRlZE5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pKSB7Ci0gICAgICAgICAgICBoYW5kbGVOUHJvcGVydHkocHJvcFZhbHVlTGlzdCwgcGFyYW1NYXApOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1JUX1NUUklORykpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OSUNLTkFNRSkgfHwKLSAgICAgICAgICAgICAgICBwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuSW1wb3J0T25seS5QUk9QRVJUWV9YX05JQ0tOQU1FKSkgewotICAgICAgICAgICAgYWRkTmlja05hbWUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiB0eXBlQ29sbGVjdGlvbi5jb250YWlucyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKSkgewotICAgICAgICAgICAgICAgIC8vIEFzIG9mIDIwMDktMTAtMDgsIFBhcnNlciBzaWRlIGRvZXMgbm90IHNwbGl0IGEgcHJvcGVydHkgdmFsdWUgaW50byBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgdXNpbmcgJzsnIChpbiBvdGhlciB3b3JkcywgcHJvcFZhbHVlTGlzdC5zaXplKCkgPT0gMSksCi0gICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgY29ycmVjdCBiZWhhdmlvciBmcm9tIHRoZSB2aWV3IG9mIHZDYXJkIDIuMS4KLSAgICAgICAgICAgICAgICAvLyBCdXQgd2Ugd2FudCBpdCB0byBiZSBzZXBhcmF0ZWQsIHNvIGRvIHRoZSBzZXBhcmF0aW9uIGhlcmUuCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25ldGljTmFtZUxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHByb3BWYWx1ZSwgbVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUGhvbmV0aWNOYW1lRnJvbVNvdW5kKHBob25ldGljTmFtZUxpc3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhpcyBmaWVsZCBzaW5jZSBBbmRyb2lkIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgaXQgaXMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUikpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gdmFsdWVzQXJlQWxsRW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXNBcmVBbGxFbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWVzQXJlQWxsRW1wdHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nLmVxdWFsc0lnbm9yZUNhc2UoVkNhcmRDb25zdGFudHMuUEFSQU1fRVhUUkFfVFlQRV9DT01QQU5ZKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIkNPTVBBTlkiIHNlZW1zIGVtaXR0ZWQgYnkgV2luZG93cyBNb2JpbGUsIHdoaWNoIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWNhbGx5IHN1cHBvcnRlZCBieSB2Q2FyZCAyLjEuIFdlIGFzc3VtZSB0aGlzIGlzIHNhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzICJXT1JLIi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fQURSX1RZUEVfUEFSQ0VMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0FEUl9UWVBFX0RPTSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9BRFJfVFlQRV9JTlRMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgYW55IGFwcHJvcHJpYXRlIHdheSB0byBzdG9yZSB0aGlzIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuc3RhcnRzV2l0aCgiWC0iKSAmJiB0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbi4gQWxzbyBzb21lIHZDYXJkIDIuMSBleHBvcnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtaXQgbm9uLXN0YW5kYXJkIHR5cGVzLiBXZSBkbyBub3QgaGFuZGxlIHRoZWlyIHZhbHVlcyBub3cuCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFdlIHVzZSAiSE9NRSIgYXMgZGVmYXVsdAotICAgICAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRQb3N0YWwodHlwZSwgcHJvcFZhbHVlTGlzdCwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0VNQUlMKSkgewotICAgICAgICAgICAgaW50IHR5cGUgPSAtMTsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX01PQklMRTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLnN0YXJ0c1dpdGgoIlgtIikgJiYgdHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy5zdWJzdHJpbmcoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgYWxsb3dzIGlhbmEtdG9rZW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXkgaGF2ZSBJTlRFUk5FVCAoc3BlY2lmaWVkIGluIHZDYXJkIHNwZWMpLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0NIT09MLCBldGMuCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9DVVNUT007Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEVtYWlsKHR5cGUsIHByb3BWYWx1ZSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX09SRykpIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIHNwZWNpZmljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSBvdGhlciB0eXBlcy4KLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gT3JnYW5pemF0aW9uLlRZUEVfV09SSzsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZU9yZ1ZhbHVlKHR5cGUsIHByb3BWYWx1ZUxpc3QsIHBhcmFtTWFwLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9USVRMRSkpIHsKLSAgICAgICAgICAgIGhhbmRsZVRpdGxlVmFsdWUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfUk9MRSkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY29uZmxpY3RzIHdpdGggVElUTEUuIElnbm9yZSBmb3Igbm93Li4uCi0gICAgICAgICAgICAvLyBoYW5kbGVUaXRsZVZhbHVlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1BIT1RPKSB8fAotICAgICAgICAgICAgICAgIHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9MT0dPKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHBhcmFtTWFwVmFsdWUgPSBwYXJhbU1hcC5nZXQoIlZBTFVFIik7Ci0gICAgICAgICAgICBpZiAocGFyYW1NYXBWYWx1ZSAhPSBudWxsICYmIHBhcmFtTWFwVmFsdWUuY29udGFpbnMoIlVSTCIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5IHdlIGRvIG5vdCBoYXZlIGFwcHJvcHJpYXRlIGV4YW1wbGUgZm9yIHRlc3RpbmcgdGhpcyBjYXNlLgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoIlRZUEUiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlVmFsdWUgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRi5lcXVhbHModHlwZVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdE5hbWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0TmFtZSA9IHR5cGVWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRQaG90b0J5dGVzKGZvcm1hdE5hbWUsIHByb3BCeXRlcywgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVEVMKSkgewotICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHR5cGVPYmplY3QgPQotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuZ2V0UGhvbmVUeXBlRnJvbVN0cmluZ3ModHlwZUNvbGxlY3Rpb24sIHByb3BWYWx1ZSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgICAgIGlmICh0eXBlT2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgICAgIHR5cGUgPSAoSW50ZWdlcil0eXBlT2JqZWN0OwotICAgICAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZU9iamVjdC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsICYmIHR5cGVDb2xsZWN0aW9uLmNvbnRhaW5zKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFBob25lKHR5cGUsIHByb3BWYWx1ZSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfUFNUTk5VTUJFUikpIHsKLSAgICAgICAgICAgIC8vIFRoZSBwaG9uZSBudW1iZXIgYXZhaWxhYmxlIHZpYSBTa3lwZS4KLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gUGhvbmUuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwgJiYgdHlwZUNvbGxlY3Rpb24uY29udGFpbnMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkUGhvbmUodHlwZSwgcHJvcFZhbHVlLCBudWxsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHNJbU1hcC5jb250YWluc0tleShwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcm90b2NvbCA9IHNJbU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gSW0uVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfSE9NRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEltKHByb3RvY29sLCBudWxsLCB0eXBlLCBwcm9wVmFsdWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05PVEUpKSB7Ci0gICAgICAgICAgICBhZGROb3RlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1VSTCkpIHsKLSAgICAgICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1XZWJzaXRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1XZWJzaXRlTGlzdC5hZGQocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSkpIHsKLSAgICAgICAgICAgIG1CaXJ0aGRheSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQU5OSVZFUlNBUlkpKSB7Ci0gICAgICAgICAgICBtQW5uaXZlcnNhcnkgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfRklSU1RfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0dpdmVuTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY01pZGRsZU5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSkpIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgPQotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wVmFsdWUsIG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgaGFuZGxlQW5kcm9pZEN1c3RvbVByb3BlcnR5KGN1c3RvbVByb3BlcnR5TGlzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQW5kcm9pZEN1c3RvbVByb3BlcnR5KGZpbmFsIExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QpIHsKLSAgICAgICAgaWYgKG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3QuYWRkKGN1c3RvbVByb3BlcnR5TGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSBkaXNwbGF5IG5hbWUuIFRoZSBjb25zdHJ1Y3RlZCBkYXRhIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbnN0cnVjdERpc3BsYXlOYW1lKCkgewotICAgICAgICAvLyBGdWxsTmFtZSAoY3JlYXRlZCB2aWEgIkZOIiBvciAiTkFNRSIgZmllbGQpIGlzIHByZWZlcmVkLgotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1Gb3JtYXR0ZWROYW1lKSkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbUZvcm1hdHRlZE5hbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkobUdpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMobVZDYXJkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgbUZhbWlseU5hbWUsIG1NaWRkbGVOYW1lLCBtR2l2ZW5OYW1lLCBtUHJlZml4LCBtU3VmZml4KTsKLSAgICAgICAgfSBlbHNlIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lLCBtUGhvbmV0aWNNaWRkbGVOYW1lLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCAmJiBtRW1haWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1FbWFpbExpc3QuZ2V0KDApLmRhdGE7Ci0gICAgICAgIH0gZWxzZSBpZiAobVBob25lTGlzdCAhPSBudWxsICYmIG1QaG9uZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbVBob25lTGlzdC5nZXQoMCkuZGF0YTsKLSAgICAgICAgfSBlbHNlIGlmIChtUG9zdGFsTGlzdCAhPSBudWxsICYmIG1Qb3N0YWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1Qb3N0YWxMaXN0LmdldCgwKS5nZXRGb3JtYXR0ZWRBZGRyZXNzKG1WQ2FyZFR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Pcmdhbml6YXRpb25MaXN0ICE9IG51bGwgJiYgbU9yZ2FuaXphdGlvbkxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbU9yZ2FuaXphdGlvbkxpc3QuZ2V0KDApLmdldEZvcm1hdHRlZFN0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnNvbGlkYXRlIHNldmVyYWwgZmllbHNkcyAobGlrZSBtTmFtZSkgdXNpbmcgbmFtZSBjYW5kaWRhdGVzLAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnNvbGlkYXRlRmllbGRzKCkgewotICAgICAgICBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpOwotCi0gICAgICAgIGlmIChtUGhvbmV0aWNGdWxsTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IG1QaG9uZXRpY0Z1bGxOYW1lLnRyaW0oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBVcmkgcHVzaEludG9Db250ZW50UmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbkxpc3QgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+KCk7Ci0gICAgICAgIC8vIEFmdGVyIGFwcGx5aW5nIHRoZSBiYXRjaCB0aGUgZmlyc3QgcmVzdWx0J3MgVXJpIGlzIHJldHVybmVkIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0Ci0gICAgICAgIC8vIHRoZSBSYXdDb250YWN0IGlzIHRoZSBmaXJzdCBvcGVyYXRpb24gdGhhdCBnZXRzIGluc2VydGVkIGludG8gdGhlIGxpc3QKLSAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgU3RyaW5nIG15R3JvdXBzSWQgPSBudWxsOwotICAgICAgICBpZiAobUFjY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBtQWNjb3VudC5uYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbUFjY291bnQudHlwZSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGNhbGxlciBzaWRlIGNyZWF0ZXMgdGhpcyBncm91cCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgIGlmIChBQ0NPVU5UX1RZUEVfR09PR0xFLmVxdWFscyhtQWNjb3VudC50eXBlKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSByZXNvbHZlci5xdWVyeShHcm91cHMuQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuU09VUkNFX0lEIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuVElUTEUgKyAiPT8iLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX01ZX0NPTlRBQ1RTX0dST1VQIH0sIG51bGwpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXlHcm91cHNJZCA9IGN1cnNvci5nZXRTdHJpbmcoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBudWxsKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICBpZiAoIW5hbWVGaWVsZHNBcmVFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkTmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsIG1HaXZlbk5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsIG1GYW1pbHlOYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCBtTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsIG1QcmVmaXgpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuU1VGRklYLCBtU3VmZml4KTsKLQotICAgICAgICAgICAgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCBtUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgbVBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNGdWxsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1OaWNrTmFtZUxpc3QgIT0gbnVsbCAmJiBtTmlja05hbWVMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5pY2tOYW1lIDogbU5pY2tOYW1lTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOaWNrbmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE5pY2tuYW1lLlRZUEUsIE5pY2tuYW1lLlRZUEVfREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoTmlja25hbWUuTkFNRSwgbmlja05hbWUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob25lTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob25lRGF0YSBwaG9uZURhdGEgOiBtUGhvbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob25lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5UWVBFLCBwaG9uZURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob25lRGF0YS50eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLkxBQkVMLCBwaG9uZURhdGEubGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5OVU1CRVIsIHBob25lRGF0YS5kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE9yZ2FuaXphdGlvbi5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uVFlQRSwgb3JnYW5pemF0aW9uRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5DT01QQU5ZLCBvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgb3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5USVRMRSwgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5waG9uZXRpY05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uUEhPTkVUSUNfTkFNRSwgb3JnYW5pemF0aW9uRGF0YS5waG9uZXRpY05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbWFpbERhdGEgZW1haWxEYXRhIDogbUVtYWlsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShFbWFpbC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuVFlQRSwgZW1haWxEYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEudHlwZSA9PSBFbWFpbC5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5MQUJFTCwgZW1haWxEYXRhLmxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuREFUQSwgZW1haWxEYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBvc3RhbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQb3N0YWxEYXRhIHBvc3RhbERhdGEgOiBtUG9zdGFsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuaW5zZXJ0U3RydWN0dXJlZFBvc3RhbERhdGFVc2luZ0NvbnRhY3RzU3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVZDYXJkVHlwZSwgYnVpbGRlciwgcG9zdGFsRGF0YSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW1MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSW1EYXRhIGltRGF0YSA6IG1JbUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoSW0uUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEltLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5UWVBFLCBpbURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uUFJPVE9DT0wsIGltRGF0YS5wcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uREFUQSwgaW1EYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChpbURhdGEucHJvdG9jb2wgPT0gSW0uUFJPVE9DT0xfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEltLkNVU1RPTV9QUk9UT0NPTCwgaW1EYXRhLmN1c3RvbVByb3RvY29sKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGltRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTm90ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbm90ZSA6IG1Ob3RlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOb3RlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShOb3RlLk5PVEUsIG5vdGUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob3RvTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob3RvRGF0YSBwaG90b0RhdGEgOiBtUGhvdG9MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob3RvLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvdG8uUEhPVE8sIHBob3RvRGF0YS5waG90b0J5dGVzKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG90by5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgd2Vic2l0ZSA6IG1XZWJzaXRlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShXZWJzaXRlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlVSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBVUkwgaW4gdkNhcmQuCi0gICAgICAgICAgICAgICAgLy8gV2UgdXNlIFRZUEVfSE9NRVBBR0UgZm9yIHNhZmV0eS4KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9IT01FUEFHRSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUJpcnRoZGF5KSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRXZlbnQuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuU1RBUlRfREFURSwgbUJpcnRoZGF5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUFubml2ZXJzYXJ5KSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRXZlbnQuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuU1RBUlRfREFURSwgbUFubml2ZXJzYXJ5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgOiBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCkgewotICAgICAgICAgICAgICAgIGludCBzaXplID0gY3VzdG9tUHJvcGVydHlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIgfHwgVGV4dFV0aWxzLmlzRW1wdHkoY3VzdG9tUHJvcGVydHlMaXN0LmdldCgwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID4gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMSkgewotICAgICAgICAgICAgICAgICAgICBzaXplID0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMTsKLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tUHJvcGVydHlMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnR5TGlzdC5zdWJMaXN0KDAsIFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTiArIDIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBjdXN0b21Qcm9wZXJ0eVZhbHVlIDogY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGN1c3RvbVByb3BlcnR5VmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShHcm91cE1lbWJlcnNoaXAuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gMSA8PSBpICYmIGkgPD0gTUFYX0RBVEFfQ09MVU1OUwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjdXN0b21Qcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKCJkYXRhIiArIGksIGN1c3RvbVByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG15R3JvdXBzSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoR3JvdXBNZW1iZXJzaGlwLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEdyb3VwTWVtYmVyc2hpcC5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShHcm91cE1lbWJlcnNoaXAuR1JPVVBfU09VUkNFX0lELCBteUdyb3Vwc0lkKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gcmVzdWx0cyA9IHJlc29sdmVyLmFwcGx5QmF0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkFVVEhPUklUWSwgb3BlcmF0aW9uTGlzdCk7Ci0gICAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVzdWx0IGlzIGFsd2F5cyB0aGUgcmF3X2NvbnRhY3QuIHJldHVybiBpdCdzIHVyaSBzbwotICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4gYmUgZm91bmQgbGF0ZXIuIGRvIG51bGwgY2hlY2tpbmcgZm9yIGJhZGx5IGJlaGF2aW5nCi0gICAgICAgICAgICAvLyBDb250ZW50UmVzb2x2ZXJzCi0gICAgICAgICAgICByZXR1cm4gKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA9PSAwIHx8IHJlc3VsdHNbMF0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHJlc3VsdHNbMF0udXJpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXM6ICVzIiwgZS50b1N0cmluZygpLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsIFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIGUudG9TdHJpbmcoKSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWQ2FyZEVudHJ5IGJ1aWxkRnJvbVJlc29sdmVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICByZXR1cm4gYnVpbGRGcm9tUmVzb2x2ZXIocmVzb2x2ZXIsIENvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZDYXJkRW50cnkgYnVpbGRGcm9tUmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBVcmkgdXJpKSB7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5hbWVGaWVsZHNBcmVFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QcmVmaXgpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVN1ZmZpeCkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtRm9ybWF0dGVkTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0Z1bGxOYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwbGF5TmFtZSgpLmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGlzdFRvU3RyaW5nKExpc3Q8U3RyaW5nPiBsaXN0KXsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPiAxKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA8IHNpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0LmdldCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFsbCBnZXR0ZXIgbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHksIHNpbmNlIHRoZXkgbWF5IGNoYW5nZQotICAgIC8vIGluIHRoZSBmdXR1cmUgYXMgb2YgMjAwOS0xMC0wNSwgb24gd2hpY2ggSSBjYW5ub3QgYmUgc3VyZSB0aGlzIHN0cnVjdHVyZQotICAgIC8vIGlzIGNvbXBsZXRlbHkgY29uc29saWRhdGVkLgotICAgIC8vCi0gICAgLy8gQWxzbyBub3RlIHRoYXQgdGhlc2UgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgb25seSBhZnRlcgotICAgIC8vIGFsbCBwcm9wZXJ0aWVzIGJlaW5nIHB1c2hlZCBpbnRvIHRoaXMgb2JqZWN0LiBJZiBub3QsIGluY29ycmVjdAotICAgIC8vIHZhbHVlIHdpbGwgImJlIHN0b3JlZCBpbiB0aGUgbG9jYWwgY2FjaGUgYW5kIiBiZSByZXR1cm5lZCB0byB5b3UuCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhbWlseU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtRmFtaWx5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdpdmVuTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1HaXZlbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNaWRkbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbU1pZGRsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBtUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotICAgICAgICByZXR1cm4gbVN1ZmZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotICAgICAgICByZXR1cm4gbUZvcm1hdHRlZE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0ZhbWlseU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNHaXZlbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY01pZGRsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNGdWxsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY0Z1bGxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Tmlja05hbWVMaXN0KCkgewotICAgICAgICByZXR1cm4gbU5pY2tOYW1lTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpcnRoZGF5KCkgewotICAgICAgICByZXR1cm4gbUJpcnRoZGF5OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Tm90ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTm90ZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8UGhvbmVEYXRhPiBnZXRQaG9uZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PEVtYWlsRGF0YT4gZ2V0RW1haWxMaXN0KCkgewotICAgICAgICByZXR1cm4gbUVtYWlsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxQb3N0YWxEYXRhPiBnZXRQb3N0YWxMaXN0KCkgewotICAgICAgICByZXR1cm4gbVBvc3RhbExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8T3JnYW5pemF0aW9uRGF0YT4gZ2V0T3JnYW5pemF0aW9uTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Pcmdhbml6YXRpb25MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PEltRGF0YT4gZ2V0SW1MaXN0KCkgewotICAgICAgICByZXR1cm4gbUltTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxQaG90b0RhdGE+IGdldFBob3RvTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG90b0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRXZWJzaXRlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1XZWJzaXRlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotICAgICAgICBpZiAobURpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnN0cnVjdERpc3BsYXlOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbW1pdHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb21taXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjODA1Ny4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogPFA+Ci0gKiB7QGxpbmsgVkNhcmRFbnRyeUhhbmRsZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGNvbW1pdHMgdGhlIGVudHJ5IHRvIENvbnRlbnRSZXNvbHZlci4KLSAqIDwvUD4KLSAqIDxQPgotICogTm90ZTo8QlIgLz4KLSAqIEVhY2ggdkNhcmQgbWF5IGNvbnRhaW4gYmlnIHBob3RvIGltYWdlcyBlbmNvZGVkIGJ5IEJBU0U2NCwKLSAqIElmIHdlIHN0b3JlIGFsbCB2Q2FyZCBlbnRyaWVzIGluIG1lbW9yeSwgT3V0T2ZNZW1vcnlFcnJvciBtYXkgYmUgdGhyb3duLgotICogVGh1cywgdGhpcyBjbGFzcyBwdXNoIGVhY2ggVkNhcmQgZW50cnkgaW50byBDb250ZW50UmVzb2x2ZXIgaW1tZWRpYXRlbHkuCi0gKiA8L1A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5Q29tbWl0dGVyIGltcGxlbWVudHMgVkNhcmRFbnRyeUhhbmRsZXIgewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRFbnRyeUNvbWl0dGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lVG9Db21taXQ7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8VXJpPiBtQ3JlYXRlZFVyaXMgPSBuZXcgQXJyYXlMaXN0PFVyaT4oKTsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29tbWl0dGVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVuZCgpIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLnNob3dQZXJmb3JtYW5jZUxvZygpKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KCJ0aW1lIHRvIGNvbW1pdCBlbnRyaWVzOiAlZCBtcyIsIG1UaW1lVG9Db21taXQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKGZpbmFsIFZDYXJkRW50cnkgdmNhcmRFbnRyeSkgewotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1DcmVhdGVkVXJpcy5hZGQodmNhcmRFbnRyeS5wdXNoSW50b0NvbnRlbnRSZXNvbHZlcihtQ29udGVudFJlc29sdmVyKSk7Ci0gICAgICAgIG1UaW1lVG9Db21taXQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNyZWF0ZWQgVXJpcy4gVGhpcyBsaXN0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYnkgdGhlIGNhbGxlciBhcyBpdCBpcwotICAgICAqIG5vdCBhIGNsb25lLgotICAgICAqLwotICAgcHVibGljIEFycmF5TGlzdDxVcmk+IGdldENyZWF0ZWRVcmlzKCkgewotICAgICAgICByZXR1cm4gbUNyZWF0ZWRVcmlzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbnN0cnVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhM2UzZTIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb25zdHJ1Y3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gaW1wbGVtZW50YXRpb24gd2hpY2ggZW5hYmxlcyB7QGxpbmsgVkNhcmRFbnRyeUhhbmRsZXJ9IG9iamVjdHMKLSAqIHRvIGVhc2lseSBoYW5kbGUgZWFjaCB2Q2FyZCBlbnRyeS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB1bmRlcnN0YW5kIGRldGFpbHMgaW5zaWRlIHZDYXJkIGFuZCB0cmFuc2xhdGVzIGl0IHRvIHtAbGluayBWQ2FyZEVudHJ5fS4KLSAqIFRoZW4gdGhlIGNsYXNzIHRocm93IGl0IHRvIHtAbGluayBWQ2FyZEVudHJ5SGFuZGxlcn0gcmVnaXN0ZXJlZCB2aWEKLSAqIHtAbGluayAjYWRkRW50cnlIYW5kbGVyKFZDYXJkRW50cnlIYW5kbGVyKX0sIHNvIHRoYXQgYWxsIHRob3NlIHJlZ2lzdGVyZWQgb2JqZWN0cwotICogYXJlIGFibGUgdG8gaGFuZGxlIHRoZSB7QGxpbmsgVkNhcmRFbnRyeX0gb2JqZWN0LgotICogPC9wPgotICogPHA+Ci0gKiBJZiB5b3Ugd2FudCB0byBrbm93IHRoZSBkZXRhaWwgaW5zaWRlIHZDYXJkLCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaW1wbGVtZW50Ci0gKiB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gZGlyZWN0bHksIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGlzIGNsYXNzIGFuZAotICoge0BsaW5rIFZDYXJkRW50cnl9IGNyZWF0ZWQgYnkgdGhlIG9iamVjdC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnlDb25zdHJ1Y3RvciI7Ci0KLSAgICBwcml2YXRlIFZDYXJkRW50cnkuUHJvcGVydHkgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgcHJpdmF0ZSBWQ2FyZEVudHJ5IG1DdXJyZW50VkNhcmRFbnRyeTsKLSAgICBwcml2YXRlIFN0cmluZyBtUGFyYW1UeXBlOwotICAgIAotICAgIC8vIFRoZSBjaGFyc2V0IHVzaW5nIHdoaWNoIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBwYXJzZXMgdGhlIHRleHQuCi0gICAgLy8gRWFjaCBTdHJpbmcgaXMgZmlyc3QgZGVjb2RlZCBpbnRvIGJpbmFyeSBzdHJlYW0gd2l0aCB0aGlzIGNoYXJzZXQsIGFuZCBlbmNvZGVkIGJhY2sKLSAgICAvLyB0byAidGFyZ2V0IGNoYXJzZXQiLCB3aGljaCBtYXkgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgdGhlIHZDYXJkIHdpdGggIkNIQVJTRVQiCi0gICAgLy8gcHJvcGVydHkgb3IgaW1wbGljaXRseSBtZW50aW9uZWQgYnkgaXRzIHZlcnNpb24gKGUuZy4gdkNhcmQgMy4wIHJlY29tbWVuZHMgVVRGLTgpLgotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Tb3VyY2VDaGFyc2V0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TdHJpY3RMaW5lQnJlYWtpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIEFjY291bnQgbUFjY291bnQ7Ci0gICAgCi0gICAgLy8gRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlcjsKLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxWQ2FyZEVudHJ5SGFuZGxlcj4gbUVudHJ5SGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PFZDYXJkRW50cnlIYW5kbGVyPigpOwotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcigpIHsKLSAgICAgICAgdGhpcyhWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyh2Y2FyZFR5cGUsIG51bGwsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUsIGZpbmFsIEFjY291bnQgYWNjb3VudCkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgYWNjb3VudCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IoZmluYWwgaW50IHZjYXJkVHlwZSwgZmluYWwgQWNjb3VudCBhY2NvdW50LAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlucHV0Q2hhcnNldCkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgYWNjb3VudCwgaW5wdXRDaGFyc2V0LCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUgSnVzdCBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUsIGZpbmFsIEFjY291bnQgYWNjb3VudCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbnB1dENoYXJzZXQsIGZpbmFsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICBpZiAoaW5wdXRDaGFyc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Tb3VyY2VDaGFyc2V0ID0gaW5wdXRDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUOwotICAgICAgICB9Ci0gICAgICAgIG1TdHJpY3RMaW5lQnJlYWtpbmcgPSBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtQWNjb3VudCA9IGFjY291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRW50cnlIYW5kbGVyKFZDYXJkRW50cnlIYW5kbGVyIGVudHJ5SGFuZGxlcikgewotICAgICAgICBtRW50cnlIYW5kbGVycy5hZGQoZW50cnlIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uU3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5ID0gbnVsbDsKLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VkNhcmRFbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTmVzdGVkIFZDYXJkIGNvZGUgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5ID0gbmV3IFZDYXJkRW50cnkobVZDYXJkVHlwZSwgbUFjY291bnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ3VycmVudFZDYXJkRW50cnkuY29uc29saWRhdGVGaWVsZHMoKTsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW50cnlDcmVhdGVkKG1DdXJyZW50VkNhcmRFbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BlcnR5LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50VkNhcmRFbnRyeS5hZGRQcm9wZXJ0eShtQ3VycmVudFByb3BlcnR5KTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlOYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInByb3BlcnR5UGFyYW1UeXBlKCkgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICIgKwotICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIHByb3BlcnR5UGFyYW1WYWx1ZSgpIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1QYXJhbVR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRnJvbSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4gdkNhcmQgMy4wIGZvcm1hbGx5IGRvZXMgbm90IGFsbG93IHRoaXMgY2FzZS4KLSAgICAgICAgICAgIG1QYXJhbVR5cGUgPSAiVFlQRSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4odmFsdWUpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IFZDYXJkVXRpbHMuY29udmVydFN0cmluZ0NoYXJzZXQoCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLCBtU291cmNlQ2hhcnNldCwgVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5hZGRQYXJhbWV0ZXIobVBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICBtUGFyYW1UeXBlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBoYW5kbGVPbmVWYWx1ZShTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBTdHJpbmcgc291cmNlQ2hhcnNldCwgU3RyaW5nIHRhcmdldENoYXJzZXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB3aGVuIHNvbWUgb2YgbXVsdGlwbGUgdmFsdWVzIGFyZSBlbXB0eS4KLSAgICAgICAgLy8gZS5nLiBOOjthOzs7IC0+IHZhbHVlcyBhcmUgIiIsICJhIiwgIiIsICIiLCBhbmQgIiIuCi0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKCJCQVNFNjQiKSB8fCBlbmNvZGluZy5lcXVhbHMoIkIiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlCeXRlcyhCYXNlNjQuZGVjb2RlKHZhbHVlLmdldEJ5dGVzKCksIEJhc2U2NC5ERUZBVUxUKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZy5lcXVhbHMoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZFV0aWxzLnBhcnNlUXVvdGVkUHJpbnRhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG1TdHJpY3RMaW5lQnJlYWtpbmcsIHNvdXJjZUNoYXJzZXQsIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVua25vd24gZW5jb2RpbmcuIEZhbGwgYmFjayB0byBkZWZhdWx0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSnVzdCB0cmFuc2xhdGUgdGhlIGNoYXJzZXQgb2YgYSBnaXZlbiBTdHJpbmcgZnJvbSBpbnB1dENoYXJzZXQgdG8gYSBzeXN0ZW0gb25lLiAKLSAgICAgICAgcmV0dXJuIFZDYXJkVXRpbHMuY29udmVydFN0cmluZ0NoYXJzZXQodmFsdWUsIHNvdXJjZUNoYXJzZXQsIHRhcmdldENoYXJzZXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gY2hhcnNldENvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgIG1DdXJyZW50UHJvcGVydHkuZ2V0UGFyYW1ldGVycyhWQ2FyZENvbnN0YW50cy5QQVJBTV9DSEFSU0VUKTsKLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGVuY29kaW5nQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5nZXRQYXJhbWV0ZXJzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kaW5nID0KLSAgICAgICAgICAgICgoZW5jb2RpbmdDb2xsZWN0aW9uICE9IG51bGwpID8gZW5jb2RpbmdDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpIDogbnVsbCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRDaGFyc2V0ID0gQ2hhcnNldFV0aWxzLm5hbWVGb3JEZWZhdWx0VmVuZG9yKAotICAgICAgICAgICAgICAgICgoY2hhcnNldENvbGxlY3Rpb24gIT0gbnVsbCkgPyBjaGFyc2V0Q29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA6IG51bGwpKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICB0YXJnZXRDaGFyc2V0ID0gVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BlcnR5LmFkZFRvUHJvcGVydHlWYWx1ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCBtU291cmNlQ2hhcnNldCwgdGFyZ2V0Q2hhcnNldCwgZW5jb2RpbmcpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1BlcmZvcm1hbmNlSW5mbygpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRpbWUgZm9yIGluc2VydCBDb250YWN0U3RydWN0IHRvIGRhdGFiYXNlOiAiICsgCi0gICAgICAgICAgICAgICAgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlciArICIgbXMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFiNTBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIGNsYXNzIHdoaWNoIGp1c3QgY291bnRzIHRoZSBudW1iZXIgb2YgdkNhcmQgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGlucHV0LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvdW50ZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIGludCBtQ291bnQ7Ci0KLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICByZXR1cm4gbUNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJmNjlkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIDxwPgotICogVGhlIGludGVyZmFjZSBjYWxsZWQgYnkge0BsaW5rIFZDYXJkRW50cnlDb25zdHJ1Y3Rvcn0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgdXNlZnVsIHdoZW4geW91IGRvbid0IHdhbnQgdG8ga25vdyB2Q2FyZCBkYXRhIGluIGRldGFpbC4gSWYgeW91IHdhbnQgdG8ga25vdwotICogaXQsIGl0IHdvdWxkIGJlIGJldHRlciB0byBjb25zaWRlciB1c2luZyB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVkNhcmRFbnRyeUhhbmRsZXIgewotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBwYXJzaW5nIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGhvZCBjYWxsZWQgd2hlbiBvbmUgVkNhcmQgZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChmaW5hbCBWQ2FyZEVudHJ5IGVudHJ5KTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBwYXJzaW5nIGVuZGVkLgotICAgICAqIEFibGUgdG8gYmUgdXNlIHRoaXMgbWV0aG9kIGZvciBzaG93aW5nIHBlcmZvcm1hbmNlIGxvZywgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3MDRhMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDxQPgotICogVGhlIGludGVyZmFjZSB3aGljaCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNsYXNzZXMgd2hpY2ggaGF2ZSB0byBhbmFseXplIGVhY2gKLSAqIHZDYXJkIGVudHJ5IG1pbnV0ZWx5LgotICogPC9QPgotICogPFA+Ci0gKiBIZXJlLCB0aGVyZSBhcmUgc2V2ZXJhbCB0ZXJtcyBzcGVjaWZpYyB0byB2Q2FyZCAoYW5kIHRoaXMgbGlicmFyeSkuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIFRoZSB0ZXJtICJlbnRyeSIgaXMgb25lIHZDYXJkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBpbnB1dCwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggIkJFR0lOOlZDQVJEIgotICogYW5kIGVuZCB3aXRoICJFTkQ6VkNBUkQiLgotICogPC9QPgotICogPFA+Ci0gKiBUaGUgdGVybSAicHJvcGVydHkiIGlzIG9uZSBsaW5lIGluIHZDYXJkIGVudHJ5LCB3aGljaCBjb25zaXN0cyBvZiAiZ3JvdXAiLCAicHJvcGVydHkgbmFtZSIsCi0gKiAicGFyYW1ldGVyKHBhcmFtKSBuYW1lcyBhbmQgdmFsdWVzIiwgYW5kICJwcm9wZXJ0eSB2YWx1ZXMiLgotICogPC9QPgotICogPFA+Ci0gKiBlLmcuIGdyb3VwMS5wcm9wTmFtZTtwYXJhbU5hbWUxPXBhcmFtVmFsdWUxO3BhcmFtTmFtZTI9cGFyYW1WYWx1ZTI7cHJvcGVydHlWYWx1ZTE7cHJvcGVydHlWYWx1ZTIuLi4KLSAqIDwvUD4KLSAqLwotcHVibGljIGludGVyZmFjZSBWQ2FyZEludGVycHJldGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2Q2FyZCBpbnRlcnByZXRhdGlvbiBzdGFydGVkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHZDYXJkIGludGVycHJldGF0aW9uIGZpbmlzaGVkLgotICAgICAqLwotICAgIHZvaWQgZW5kKCk7Ci0KLSAgICAvKiogCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgc3RhcnRlZC4KLSAgICAgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gIkJFR0lOOlZDQVJEIiBpcyByZWFkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRFbnRyeSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgZW5kZWQuCi0gICAgICogTW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICJFTkQ6VkNBUkQiIGlzIHJlYWQuCi0gICAgICogTm90ZSB0aGF0IHtAbGluayAjc3RhcnRFbnRyeSgpfSBtYXkgYmUgY2FsbGVkIHNpbmNlCi0gICAgICogdkNhcmQgKGVzcGVjaWFsbHkgMi4xKSBhbGxvd3MgbmVzdGVkIHZDYXJkLgotICAgICAqLwotICAgIHZvaWQgZW5kRW50cnkoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHJlYWRpbmcgb25lIHByb3BlcnR5IHN0YXJ0ZWQuCi0gICAgICovCi0gICAgdm9pZCBzdGFydFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiByZWFkaW5nIG9uZSBwcm9wZXJ0eSBlbmRlZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZ3JvdXAgQSBncm91cCBuYW1lLiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9yIG1heSBub3QgYmUKLSAgICAgKiBjYWxsZWQgYXQgYWxsLCBkZXBlbmRpbmcgb24gaG93IG1hbnkgZ3J1b3VwcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgQSBwcm9wZXJ0eSBuYW1lIGxpa2UgIk4iLCAiRk4iLCAiQURSIiwgZXRjLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlIEEgcGFyYW1ldGVyIG5hbWUgbGlrZSAiRU5DT0RJTkciLCAiQ0hBUlNFVCIsIGV0Yy4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZSBBIHBhcmFtZXRlciB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB3aXRob3V0Ci0gICAgICoge0BsaW5rICNwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcpfSBiZWluZyBjYWxsZWQgKHdoZW4gdGhlIHZDYXJkIGlzIHZDYXJkIDIuMSkuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZXMgTGlzdCBvZiBwcm9wZXJ0eSB2YWx1ZXMuIFRoZSBzaXplIG9mIHZhbHVlcyB3b3VsZCBiZSAxIHVubGVzcwotICAgICAqIGNvcmVzc3BvbmRpbmcgcHJvcGVydHkgbmFtZSBpcyAiTiIsICJBRFIiLCBvciAiT1JHIi4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNDRhMC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGFnZ3JlZ2F0ZXMgbW9yZSB0aGFuIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdHMgYW5kIG1ha2UgYSB1c2VyIG9iamVjdCB0cmVhdCB0aGVtIGFzIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFZDYXJkSW50ZXJwcmV0ZXI+IG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24oQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBpbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgbUludGVycHJldGVyQ29sbGVjdGlvbiA9IGludGVycHJldGVyQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBnZXRDb2xsZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gbUludGVycHJldGVyQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5zdGFydEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5R3JvdXAoZ3JvdXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eU5hbWUobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUodHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlWYWx1ZXModmFsdWVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjkzNjkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVkNhcmRQYXJzZXIgewotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gc3RyZWFtIGFuZCBzZW5kIHRoZSB2Q2FyZCBkYXRhIGludG8gVkNhcmRCdWlsZGVyQmFzZSBvYmplY3QuCi0gICAgICogPC9wPi4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gYWxsb3dzICJDSEFSU0VUIiBwYXJhbWV0ZXIsIGFuZCBzb21lIGNhcmVlciBzZXRzCi0gICAgICogbG9jYWwgZW5jb2RpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBKYXBhbmVzZSBwaG9uZSBjYXJlZXIgdXNlcyBTaGlmdF9KSVMsIHdoaWNoIGlzCi0gICAgICogZm9ybWFsbHkgYWxsb3dlZCBpbiB2Q2FyZCAyLjEsIGJ1dCBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAuIEluIHZDYXJkIDIuMSwKLSAgICAgKiBJbiBzb21lIGV4cmVtZSBjYXNlLCBpdCBpcyBhbGxvd2VkIGZvciB2Q2FyZCB0byBoYXZlIGRpZmZlcmVudCBjaGFyc2V0cyBpbiBvbmUgdkNhcmQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIHJlY29tbWVuZCB5b3UgdXNlIHtAbGluayBWQ2FyZFNvdXJjZURldGVjdG9yfSBhbmQgZGV0ZWN0IHdoaWNoIGtpbmQgb2Ygc291cmNlIHRoZQotICAgICAqIHZDYXJkIGNvbWVzIGZyb20gYW5kIGV4cGxpY2l0bHkgc3BlY2lmeSBhIGNoYXJzZXQgdXNpbmcgdGhlIHJlc3VsdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMgVGhlIHNvdXJjZSB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gaW50ZXJlcHJldGVyIEEge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdCB3aGljaCB1c2VkIHRvIGNvbnN0cnVjdCBkYXRhLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENhbmNlbCBwYXJzaW5nIHZDYXJkLiBVc2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzdG9wIHRoZSBwYXJzZSBpbiB0aGUgb3RoZXIgdGhyZWFkcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogQWN0dWFsIGNhbmNlbCBpcyBkb25lIGFmdGVyIHBhcnNpbmcgdGhlIGN1cnJlbnQgdmNhcmQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNhbmNlbCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WMjEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzY1ZWIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmROZXN0ZWRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkVmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIEJhc2ljIGltcGxlbWVudGF0aW9uIGFjaGlldmluZyB2Q2FyZCBwYXJzaW5nLiBCYXNlZCBvbiB2Q2FyZCAyLjEsCi0gKiA8L3A+Ci0gKiBAaGlkZQotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIFZDYXJkUGFyc2VySW1wbF9WMjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkUGFyc2VySW1wbF9WMjEiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRW1wdHlJbnRlcnByZXRlciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIEN1c3RvbUJ1ZmZlcmVkUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgewotICAgICAgICBwcml2YXRlIGxvbmcgbVRpbWU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5lZWRlZCBzaW5jZSAibmV4dCBsaW5lIiBtYXkgYmUgbnVsbCBkdWUgdG8gZW5kIG9mIGxpbmUuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU5leHRMaW5lSXNWYWxpZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5leHRMaW5lOwotCi0gICAgICAgIHB1YmxpYyBDdXN0b21CdWZmZXJlZFJlYWRlcihSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgIHN1cGVyKGluKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChtTmV4dExpbmVJc1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJldCA9IG1OZXh0TGluZTsKLSAgICAgICAgICAgICAgICBtTmV4dExpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgIG1OZXh0TGluZUlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IHN1cGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbVRpbWUgKz0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgICAgICByZXR1cm4gbGluZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIG9uZSBsaW5lLCBidXQgbWFrZSB0aGlzIG9iamVjdCBzdG9yZSBpdCBpbiBpdHMgcXVldWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIHBlZWtMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICghbU5leHRMaW5lSXNWYWxpZCkgewotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IHN1cGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBtVGltZSArPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgICAgIG1OZXh0TGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgbU5leHRMaW5lSXNWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtTmV4dExpbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbG1pbGxpc2Vjb25kKCkgewotICAgICAgICAgICAgcmV0dXJuIG1UaW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiOEJJVCI7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2FuY2VsZWQ7Ci0gICAgcHJvdGVjdGVkIFZDYXJkSW50ZXJwcmV0ZXIgbUludGVycHJldGVyOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtSW50ZXJtZWRpYXRlQ2hhcnNldDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBlbmNvZGluZyB0eXBlIGZvciBkZWNvbmRpbmcgYnl0ZSBzdHJlYW1zLiBUaGlzIG1lbWJlciB2YXJpYWJsZSBpcwotICAgICAqIHJlc2V0IHRvIGEgZGVmYXVsdCBlbmNvZGluZyBldmVyeSB0aW1lIHdoZW4gYSBuZXcgaXRlbSBjb21lcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogIkVuY29kaW5nIiBpbiB2Q2FyZCBpcyBkaWZmZXJlbnQgZnJvbSAiQ2hhcnNldCIuIEl0IGlzIG1haW5seSB1c2VkIGZvcgotICAgICAqIGFkZHJlc3Nlcywgbm90ZXMsIGltYWdlcy4gIjdCSVQiLCAiOEJJVCIsICJCQVNFNjQiLCBhbmQKLSAgICAgKiAiUVVPVEVELVBSSU5UQUJMRSIgYXJlIGtub3duIGV4YW1wbGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1DdXJyZW50RW5jb2Rpbmc7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVhZGVyIG9iamVjdCB0byBiZSB1c2VkIGludGVybmFsbHkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERldmVsb3BlcnMgc2hvdWxkIG5vdCBkaXJlY3RseSByZWFkIGEgbGluZSBmcm9tIHRoaXMgb2JqZWN0LiBVc2UKLSAgICAgKiBnZXRMaW5lKCkgdW5sZXNzIHRoZXJlIHNvbWUgcmVhc29uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ3VzdG9tQnVmZmVyZWRSZWFkZXIgbVJlYWRlcjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFNldCBmb3Igc3RvcmluZyB1bmtvbnduIFRZUEUgYXR0cmlidXRlcywgd2hpY2ggaXMgbm90IGFjY2VwdGFibGUgaW4gdkNhcmQKLSAgICAgKiBzcGVjaWZpY2F0aW9uLCBidXQgaGFwcGVucyB0byBiZSBzZWVuIGluIHJlYWwgd29ybGQgdkNhcmQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8U3RyaW5nPiBtVW5rbm93blR5cGVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBTZXQgZm9yIHN0b3JpbmcgdW5rb253biBWQUxVRSBhdHRyaWJ1dGVzLCB3aGljaCBpcyBub3QgYWNjZXB0YWJsZSBpbgotICAgICAqIHZDYXJkIHNwZWNpZmljYXRpb24sIGJ1dCBoYXBwZW5zIHRvIGJlIHNlZW4gaW4gcmVhbCB3b3JsZCB2Q2FyZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG1Vbmtub3duVmFsdWVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLQotICAgIC8vIEluIHNvbWUgY2FzZXMsIHZDYXJkIGlzIG5lc3RlZC4gQ3VycmVudGx5LCB3ZSBvbmx5IGNvbnNpZGVyIHRoZSBtb3N0Ci0gICAgLy8gaW50ZXJpb3IgdkNhcmQgZGF0YS4KLSAgICAvLyBTZWUgdjIxX2ZvbWFfMS52Y2YgaW4gdGVzdCBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgLy8gVE9ETzogRG9uJ3QgaWdub3JlIGJ5IHVzaW5nIGNvdW50LCBidXQgcmVhZCBhbGwgb2YgaW5mb3JtYXRpb24gb3V0c2lkZSB2Q2FyZC4KLSAgICBwcml2YXRlIGludCBtTmVzdENvdW50OwotCi0gICAgLy8gVXNlZCBvbmx5IGZvciBwYXJzaW5nIEVORDpWQ0FSRC4KLSAgICBwcml2YXRlIFN0cmluZyBtUHJldmlvdXNMaW5lOwotCi0gICAgLy8gRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVUb3RhbDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVSZWFkU3RhcnRSZWNvcmQ7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUmVhZEVuZFJlY29yZDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVTdGFydFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZUVuZFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlSXRlbXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXA7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlczsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZUFkck9yZ047Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWU7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZUJhc2U2NDsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlckltcGxfVjIxKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfREVGQVVMVCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WMjEoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBpZiAoKHZjYXJkVHlwZSAmIFZDYXJkQ29uZmlnLkZMQUdfVE9SRUxBVEVfTkVTVCkgIT0gMCkgewotICAgICAgICAgICAgbU5lc3RDb3VudCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBtSW50ZXJtZWRpYXRlQ2hhcnNldCA9ICBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIC8vIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij52Y2FyZF9maWxlID0gW3dzbHNdIHZjYXJkIFt3c2xzXTwvcHJlPgotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlVkNhcmRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gcmVhZGluZ0ZpcnN0RmlsZSA9IHRydWU7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAobUNhbmNlbGVkKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBhcnNlT25lVkNhcmQocmVhZGluZ0ZpcnN0RmlsZSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlYWRpbmdGaXJzdEZpbGUgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTmVzdENvdW50ID4gMCkgewotICAgICAgICAgICAgYm9vbGVhbiB1c2VDYWNoZSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHJlYWRFbmRWQ2FyZCh1c2VDYWNoZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdXNlQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGEgZ2l2ZW4gcHJvcGVydHkgbmFtZSBpcyBhIHZhbGlkIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByb3BlcnR5TmFtZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIGlmICghKGdldEtub3duUHJvcGVydHlOYW1lU2V0KCkuY29udGFpbnMocHJvcGVydHlOYW1lLnRvVXBwZXJDYXNlKCkpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoIlgtIikpCi0gICAgICAgICAgICAgICAgJiYgIW1Vbmtub3duVHlwZVNldC5jb250YWlucyhwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICBtVW5rbm93blR5cGVTZXQuYWRkKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiUHJvcGVydHkgbmFtZSB1bnN1cHBvcnRlZCBieSB2Q2FyZCAyLjE6ICIgKyBwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nLiBJdCBtYXkgYmUgbnVsbCwgb3IgaXRzIGxlbmd0aCBtYXkgYmUgMAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkTGluZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcGVla0xpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVJlYWRlci5wZWVrTGluZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nIHdpdGggaXQncyBsZW5ndGggPiAwCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24gd2hlbiB0aGUgc3RyZWFtIHJlYWNoZWQgZW5kIG9mIGxpbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vbkVtcHR5TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJSZWFjaGVkIGVuZCBvZiBidWZmZXIuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiB2Y2FyZCA9ICJCRUdJTiIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiIFt3c10gMSpDUkxGCi0gICAgICogICAgICAgICBpdGVtcyAqQ1JMRgotICAgICAqICAgICAgICAgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlT25lVkNhcmQoYm9vbGVhbiBmaXJzdFJlYWQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGFsbG93R2FyYmFnZSA9IGZhbHNlOwotICAgICAgICBpZiAoZmlyc3RSZWFkKSB7Ci0gICAgICAgICAgICBpZiAobU5lc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhbGxvd0dhcmJhZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVhZEJlZ2luVkNhcmQoYWxsb3dHYXJiYWdlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlU3RhcnRFbnRyeSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBtSW50ZXJwcmV0ZXIuc3RhcnRFbnRyeSgpOwotICAgICAgICBtVGltZVJlYWRTdGFydFJlY29yZCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZVN0YXJ0RW50cnk7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVQYXJzZUl0ZW1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHBhcnNlSXRlbXMoKTsKLSAgICAgICAgbVRpbWVQYXJzZUl0ZW1zICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVmb3JlUGFyc2VJdGVtczsKLQotICAgICAgICByZWFkRW5kVkNhcmQodHJ1ZSwgZmFsc2UpOwotCi0gICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlRW5kRW50cnkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUludGVycHJldGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgIG1UaW1lUmVhZEVuZFJlY29yZCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZUVuZEVudHJ5OwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRydWUgd2hlbiBzdWNjZXNzZnVsLiBGYWxzZSB3aGVuIHJlYWNoaW5nIHRoZSBlbmQgb2YgbGluZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEJlZ2luVkNhcmQoYm9vbGVhbiBhbGxvd0dhcmJhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHN0ckFycmF5ID0gbGluZS5zcGxpdCgiOiIsIDIpOwotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHN0ckFycmF5Lmxlbmd0aDsKLQotICAgICAgICAgICAgLy8gQWx0aG91Z2ggdkNhcmQgMi4xLzMuMCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IGxvd2VyIGNhc2VzLAotICAgICAgICAgICAgLy8gd2UgZm91bmQgdkNhcmQgZmlsZSBlbWl0dGVkIGJ5IHNvbWUgZXh0ZXJuYWwgdkNhcmQgZXhwb3RlciBoYXZlIHN1Y2gKLSAgICAgICAgICAgIC8vIGludmFsaWQgU3RyaW5ncy4KLSAgICAgICAgICAgIC8vIFNvIHdlIGFsbG93IGl0LgotICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgLy8gQkVHSU46dkNhcmQKLSAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMiAmJiBzdHJBcnJheVswXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiQkVHSU4iKQotICAgICAgICAgICAgICAgICAgICAmJiBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dHYXJiYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJFeHBlY3RlZCBTdHJpbmcgXCJCRUdJTjpWQ0FSRFwiIGRpZCBub3QgY29tZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKEluc3RlYWQsIFwiIiArIGxpbmUgKyAiXCIgY2FtZSkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGFsbG93R2FyYmFnZSk7Ci0KLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJSZWFjaGVkIHdoZXJlIG11c3Qgbm90IGJlIHJlYWNoZWQuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFyZ3VtZW50cyB1c2VDYWNoZSBhbmQgYWxsb3dHYXJiYXNlIGFyZSB1c3VhbGx5IHRydWUgYW5kIGZhbHNlCi0gICAgICogYWNjb3JkaW5nbHkgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvdXRzaWRlIHRoaXMgZnVuY3Rpb24gaXRzZWxmLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNlQ2FjaGUgV2hlbiB0cnVlLCBsaW5lIGlzIG9idGFpbmVkIGZyb20gbVByZXZpb3VzbGluZS4KLSAgICAgKiAgICAgICAgICAgIE90aGVyd2lzZSwgZ2V0TGluZSgpIGlzIHVzZWQuCi0gICAgICogQHBhcmFtIGFsbG93R2FyYmFnZSBXaGVuIHRydWUsIGlnbm9yZSBub24gIkVORDpWQ0FSRCIgbGluZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRFbmRWQ2FyZChib29sZWFuIHVzZUNhY2hlLCBib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKHVzZUNhY2hlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhvdWdoIHZDYXJkIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgbG93ZXIgY2FzZXMsCi0gICAgICAgICAgICAgICAgLy8gc29tZSBkYXRhIG1heSBoYXZlIHRoZW0sIHNvIHdlIGFsbG93IGl0LgotICAgICAgICAgICAgICAgIGxpbmUgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkV4cGVjdGVkIEVORDpWQ0FSRCB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gbGluZS5zcGxpdCgiOiIsIDIpOwotICAgICAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyICYmIHN0ckFycmF5WzBdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKQotICAgICAgICAgICAgICAgICAgICAmJiBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93R2FyYmFnZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiRU5EOlZDQVJEICE9IFwiIiArIG1QcmV2aW91c0xpbmUgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVzZUNhY2hlID0gZmFsc2U7Ci0gICAgICAgIH0gd2hpbGUgKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpdGVtcyA9ICpDUkxGIGl0ZW0gLyBpdGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VJdGVtcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGVuZGVkID0gZmFsc2U7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVCZWdpblByb3BlcnR5ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1JbnRlcnByZXRlci5zdGFydFByb3BlcnR5KCk7Ci0gICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZUJlZ2luUHJvcGVydHk7Ci0gICAgICAgIGVuZGVkID0gcGFyc2VJdGVtKCk7Ci0gICAgICAgIGlmICghZW5kZWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlRW5kUHJvcGVydHkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1JbnRlcnByZXRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgbVRpbWVFbmRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZUVuZFByb3BlcnR5OwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFlbmRlZCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVTdGFydFByb3BlcnR5ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgbVRpbWVTdGFydFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVmb3JlU3RhcnRQcm9wZXJ0eTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW5kZWQgPSBwYXJzZUl0ZW0oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW52YWxpZCBsaW5lIHdoaWNoIGxvb2tzIGxpa2Ugc29tZSBjb21tZW50IHdhcyBmb3VuZC4gSWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICBlbmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVFbmRQcm9wZXJ0eSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIG1UaW1lRW5kUHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmVFbmRQcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogaXRlbSA9IFtncm91cHMgIi4iXSBuYW1lIFtwYXJhbXNdICI6IiB2YWx1ZSBDUkxGIC8gW2dyb3VwcyAiLiJdICJBRFIiCi0gICAgICogW3BhcmFtc10gIjoiIGFkZHJlc3NwYXJ0cyBDUkxGIC8gW2dyb3VwcyAiLiJdICJPUkciIFtwYXJhbXNdICI6IiBvcmdwYXJ0cwotICAgICAqIENSTEYgLyBbZ3JvdXBzICIuIl0gIk4iIFtwYXJhbXNdICI6IiBuYW1lcGFydHMgQ1JMRiAvIFtncm91cHMgIi4iXQotICAgICAqICJBR0VOVCIgW3BhcmFtc10gIjoiIHZjYXJkIENSTEYKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUl0ZW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbUN1cnJlbnRFbmNvZGluZyA9IERFRkFVTFRfRU5DT0RJTkc7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBnZXROb25FbXB0eUxpbmUoKTsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnR5TmFtZUFuZFZhbHVlID0gc2VwYXJhdGVMaW5lQW5kSGFuZGxlR3JvdXAobGluZSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHlOYW1lQW5kVmFsdWUubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uKCJJbnZhbGlkIGxpbmUgXCIiICsgbGluZSArICJcIiIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXS50b1VwcGVyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdOwotCi0gICAgICAgIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXAgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLQotICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiQURSIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscygiT1JHIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscygiTiIpKSB7Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaGFuZGxlTXVsdGlwbGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBtVGltZVBhcnNlQWRyT3JnTiArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkFHRU5UIikpIHsKLSAgICAgICAgICAgIGhhbmRsZUFnZW50KHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKGlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkJFR0lOIikpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZS5lcXVhbHMoIlZDQVJEIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkTmVzdGVkRXhjZXB0aW9uKCJUaGlzIHZDYXJkIGhhcyBuZXN0ZWQgdkNhcmQgZGF0YSBpbiBpdC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gQkVHSU4gdHlwZTogIiArIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiVkVSU0lPTiIpICYmICFwcm9wZXJ0eVZhbHVlLmVxdWFscyhnZXRWZXJzaW9uU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkVmVyc2lvbkV4Y2VwdGlvbigiSW5jb21wYXRpYmxlIHZlcnNpb246ICIgKyBwcm9wZXJ0eVZhbHVlICsgIiAhPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGdldFZlcnNpb25TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaGFuZGxlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgbVRpbWVQYXJzZVByb3BlcnR5VmFsdWVzICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gcHJvcGVydHkgbmFtZTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIik7Ci0gICAgfQotCi0gICAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbiwgdGhlIHN0YXRlcyBmb3IgZ3JvdXAgYW5kIHByb3BlcnR5IG5hbWUgYXJlIG1lcmdlZCBpbnRvIG9uZS4KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfR1JPVVBfT1JfUFJPUEVSVFlfTkFNRSA9IDA7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX1BBUkFNUyA9IDE7Ci0gICAgLy8gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gYWxsb3dzIGRvdWJsZS1xdW90ZWQgcGFyYW1ldGVycywgd2hpbGUgdkNhcmQgMi4xIGRvZXMgbm90LgotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9QQVJBTVNfSU5fRFFVT1RFID0gMjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzZXBhcmF0ZUxpbmVBbmRIYW5kbGVHcm91cChTdHJpbmcgbGluZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lQW5kVmFsdWUgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLSAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgbGluZS5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IFNUQVRFX0dST1VQX09SX1BST1BFUlRZX05BTUU7Ci0gICAgICAgIGludCBuYW1lSW5kZXggPSAwOwotCi0gICAgICAgIC8vIFRoaXMgbG9vcCBpcyBkZXZlbG9wZWQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHRha2UgY2FyZSBvZiBib3R0bGUgbmVjayBoZXJlLgotICAgICAgICAvLyBSZWZhY3RvciBjYXJlZnVsbHkgd2hlbiB5b3UgbmVlZCB0byBkbyBzby4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IGxpbmUuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfR1JPVVBfT1JfUFJPUEVSVFlfTkFNRTogewotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzonKSB7ICAvLyBFbmQgb2YgYSBwcm9wZXJ0eSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gbGluZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZUFuZFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcuJykgeyAgLy8gRWFjaCBncm91cCBpcyBmb2xsb3dlZCBieSB0aGUgZG90LgotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdyb3VwTmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRW1wdHkgZ3JvdXAgZm91bmQuIElnbm9yaW5nLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlHcm91cChncm91cE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7ICAvLyBOZXh0IHNob3VsZCBiZSBhbm90aGVyIGdyb3VwIG9yIGEgcHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsgIC8vIEVuZCBvZiBwcm9wZXJ0eSBuYW1lIGFuZCBiZWdpbm5lbmcgb2YgcGFyYW1ldGVycy4gIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QQVJBTVM7ICAvLyBTdGFydCBwYXJhbWV0ZXIgcGFyc2luZy4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb21tYSBzdXBwb3J0IChpbiB2Q2FyZCAzLjAgYW5kIDQuMCkuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BBUkFNUzogewotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjEuZXF1YWxzSWdub3JlQ2FzZShnZXRWZXJzaW9uU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkRvdWJsZS1xdW90ZWQgcGFyYW1zIGZvdW5kIGluIHZDYXJkIDIuMS4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2lsZW50bHkgYWxsb3cgaXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUEFSQU1TX0lOX0RRVU9URTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsgIC8vIFN0YXJ0cyBhbm90aGVyIHBhcmFtLgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFyYW1zKGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzonKSB7ICAvLyBFbmQgb2YgcGFyYW0gYW5kIGJlZ2luZW5uaW5nIG9mIHZhbHVlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhcmFtcyhsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gbGluZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZUFuZFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BBUkFNU19JTl9EUVVPVEU6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxLmVxdWFsc0lnbm9yZUNhc2UoZ2V0VmVyc2lvblN0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJEb3VibGUtcXVvdGVkIHBhcmFtcyBmb3VuZCBpbiB2Q2FyZCAyLjEuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbGVudGx5IGFsbG93IGl0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BBUkFNUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigiSW52YWxpZCBsaW5lOiBcIiIgKyBsaW5lICsgIlwiIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBwYXJhbXMgPSAiOyIgW3dzXSBwYXJhbWxpc3QgcGFyYW1saXN0ID0gcGFyYW1saXN0IFt3c10gIjsiIFt3c10gcGFyYW0gLwotICAgICAqIHBhcmFtIHBhcmFtID0gIlRZUEUiIFt3c10gIj0iIFt3c10gcHR5cGV2YWwgLyAiVkFMVUUiIFt3c10gIj0iIFt3c10KLSAgICAgKiBwdmFsdWV2YWwgLyAiRU5DT0RJTkciIFt3c10gIj0iIFt3c10gcGVuY29kaW5ndmFsIC8gIkNIQVJTRVQiIFt3c10gIj0iCi0gICAgICogW3dzXSBjaGFyc2V0dmFsIC8gIkxBTkdVQUdFIiBbd3NdICI9IiBbd3NdIGxhbmd2YWwgLyAiWC0iIHdvcmQgW3dzXSAiPSIKLSAgICAgKiBbd3NdIHdvcmQgLyBrbm93bnR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gc3RyQXJyYXkgPSBwYXJhbXMuc3BsaXQoIj0iLCAyKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gc3RyQXJyYXlbMF0udHJpbSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHN0ckFycmF5WzFdLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJWQUxVRSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkVOQ09ESU5HIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFbmNvZGluZyhwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiQ0hBUlNFVCIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2hhcnNldChwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiTEFOR1VBR0UiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUFueVBhcmFtKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biB0eXBlIFwiIiArIHBhcmFtTmFtZSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShzdHJBcnJheVswXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgcGFyc2VyIGltcGxlbWVudGF0aW9uIG1heSB0aHJvdyBWQ2FyZEV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbVdpdGhvdXROYW1lKGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogcHR5cGV2YWwgPSBrbm93bnR5cGUgLyAiWC0iIHdvcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUeXBlKGZpbmFsIFN0cmluZyBwdHlwZXZhbCkgewotICAgICAgICBpZiAoIShnZXRLbm93blR5cGVTZXQoKS5jb250YWlucyhwdHlwZXZhbC50b1VwcGVyQ2FzZSgpKQotICAgICAgICAgICAgICAgIHx8IHB0eXBldmFsLnN0YXJ0c1dpdGgoIlgtIikpCi0gICAgICAgICAgICAgICAgJiYgIW1Vbmtub3duVHlwZVNldC5jb250YWlucyhwdHlwZXZhbCkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZVNldC5hZGQocHR5cGV2YWwpOwotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiVFlQRSB1bnN1cHBvcnRlZCBieSAlczogIiwgZ2V0VmVyc2lvbigpLCBwdHlwZXZhbCkpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHB0eXBldmFsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHB2YWx1ZXZhbCA9ICJJTkxJTkUiIC8gIlVSTCIgLyAiQ09OVEVOVC1JRCIgLyAiQ0lEIiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVZhbHVlKGZpbmFsIFN0cmluZyBwdmFsdWV2YWwpIHsKLSAgICAgICAgaWYgKCEoZ2V0S25vd25WYWx1ZVNldCgpLmNvbnRhaW5zKHB2YWx1ZXZhbC50b1VwcGVyQ2FzZSgpKQotICAgICAgICAgICAgICAgIHx8IHB2YWx1ZXZhbC5zdGFydHNXaXRoKCJYLSIpCi0gICAgICAgICAgICAgICAgfHwgbVVua25vd25WYWx1ZVNldC5jb250YWlucyhwdmFsdWV2YWwpKSkgewotICAgICAgICAgICAgbVVua25vd25WYWx1ZVNldC5hZGQocHZhbHVldmFsKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJUaGUgdmFsdWUgdW5zdXBwb3J0ZWQgYnkgVFlQRSBvZiAlczogIiwgZ2V0VmVyc2lvbigpLCBwdmFsdWV2YWwpKTsKLSAgICAgICAgfQotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIlZBTFVFIik7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUocHZhbHVldmFsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHBlbmNvZGluZ3ZhbCA9ICI3QklUIiAvICI4QklUIiAvICJRVU9URUQtUFJJTlRBQkxFIiAvICJCQVNFNjQiIC8gIlgtIiB3b3JkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRW5jb2RpbmcoU3RyaW5nIHBlbmNvZGluZ3ZhbCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldEF2YWlsYWJsZUVuY29kaW5nU2V0KCkuY29udGFpbnMocGVuY29kaW5ndmFsKSB8fAotICAgICAgICAgICAgICAgIHBlbmNvZGluZ3ZhbC5zdGFydHNXaXRoKCJYLSIpKSB7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIkVOQ09ESU5HIik7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHBlbmNvZGluZ3ZhbCk7Ci0gICAgICAgICAgICBtQ3VycmVudEVuY29kaW5nID0gcGVuY29kaW5ndmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIGVuY29kaW5nIFwiIiArIHBlbmNvZGluZ3ZhbCArICJcIiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gb25seSBhbGxvd3MgdXMtYXNjaWkgYW5kIGlzby04ODU5LXh4eCAoU2VlIFJGQyAxNTIxKSwKLSAgICAgKiBidXQgcmVjZW50IHZDYXJkIGZpbGVzIG9mdGVuIGNvbnRhaW4gb3RoZXIgY2hhcnNldCBsaWtlIFVURi04LCBTSElGVF9KSVMsIGV0Yy4KLSAgICAgKiBXZSBhbGxvdyBhbnkgY2hhcnNldC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhcnNldChTdHJpbmcgY2hhcnNldHZhbCkgewotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIkNIQVJTRVQiKTsKLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1WYWx1ZShjaGFyc2V0dmFsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgYWxzbyBTZWN0aW9uIDcuMSBvZiBSRkMgMTUyMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUxhbmd1YWdlKFN0cmluZyBsYW5ndmFsKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IGxhbmd2YWwuc3BsaXQoIi0iKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludmFsaWQgTGFuZ3VhZ2U6IFwiIiArIGxhbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdG1wID0gc3RyQXJyYXlbMF07Ci0gICAgICAgIGludCBsZW5ndGggPSB0bXAubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNBc2NpaUxldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRtcCA9IHN0ckFycmF5WzFdOwotICAgICAgICBsZW5ndGggPSB0bXAubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNBc2NpaUxldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZShWQ2FyZENvbnN0YW50cy5QQVJBTV9MQU5HVUFHRSk7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUobGFuZ3ZhbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXNjaWlMZXR0ZXIoY2hhciBjaCkgewotICAgICAgICBpZiAoKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1haW5seSBmb3IgIlgtIiB0eXBlLiBUaGlzIGFjY2VwdHMgYW55IGtpbmQgb2YgdHlwZSB3aXRob3V0IGNoZWNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZShwYXJhbU5hbWUpOwotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHVwcGVyRW5jb2RpbmcgPSBtQ3VycmVudEVuY29kaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgIGlmICh1cHBlckVuY29kaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19RUCkpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBnZXRRdW90ZWRQcmludGFibGUocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICB2LmFkZChyZXN1bHQpOwotICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5VmFsdWVzKHYpOwotICAgICAgICAgICAgbVRpbWVIYW5kbGVRdW90ZWRQcmludGFibGUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfSBlbHNlIGlmICh1cHBlckVuY29kaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQpCi0gICAgICAgICAgICAgICAgfHwgdXBwZXJFbmNvZGluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQikpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIC8vIEl0IGlzIHZlcnkgcmFyZSwgYnV0IHNvbWUgQkFTRTY0IGRhdGEgbWF5IGJlIHNvIGJpZyB0aGF0Ci0gICAgICAgICAgICAvLyBPdXRPZk1lbW9yeUVycm9yIG9jY3Vycy4gVG8gaWdub3JlIHN1Y2ggY2FzZXMsIHVzZSB0cnktY2F0Y2guCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGFycmF5TGlzdC5hZGQoZ2V0QmFzZTY0KHByb3BlcnR5VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlWYWx1ZXMoYXJyYXlMaXN0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3V0T2ZNZW1vcnlFcnJvciBoYXBwZW5lZCBkdXJpbmcgcGFyc2luZyBCQVNFNjQgZGF0YSEiKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlWYWx1ZXMobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZUJhc2U2NCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCEodXBwZXJFbmNvZGluZy5lcXVhbHMoIjdCSVQiKSB8fCB1cHBlckVuY29kaW5nLmVxdWFscygiOEJJVCIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHVwcGVyRW5jb2Rpbmcuc3RhcnRzV2l0aCgiWC0iKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiVGhlIGVuY29kaW5nIFwiJXNcIiBpcyB1bnN1cHBvcnRlZCBieSB2Q2FyZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50RW5jb2RpbmcsIGdldFZlcnNpb25TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTb21lIGRldmljZSB1c2VzIGxpbmUgZm9sZGluZyBkZWZpbmVkIGluIFJGQyAyNDI1LCB3aGljaCBpcyBub3QgYWxsb3dlZAotICAgICAgICAgICAgLy8gaW4gdkNhcmQgMi4xICh3aGlsZSBuZWVkZWQgaW4gdkNhcmQgMy4wKS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAvLyBCRUdJTjpWQ0FSRAotICAgICAgICAgICAgLy8gVkVSU0lPTjoyLjEKLSAgICAgICAgICAgIC8vIE46O09tZWdhOzs7Ci0gICAgICAgICAgICAvLyBFTUFJTDtJTlRFUk5FVDoiT21lZ2EiCi0gICAgICAgICAgICAvLyAgIDxvbWVnYUBleGFtcGxlLmNvbT4KLSAgICAgICAgICAgIC8vIEZOOk9tZWdhCi0gICAgICAgICAgICAvLyBFTkQ6VkNBUkQKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBUaGUgdkNhcmQgYWJvdmUgYXNzdW1lcyB0aGF0IGVtYWlsIGFkZHJlc3Mgc2hvdWxkIGJlY29tZToKLSAgICAgICAgICAgIC8vICJPbWVnYSIgPG9tZWdhQGV4YW1wbGUuY29tPgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEJ1dCB2Q2FyZCAyLjEgcmVxdWlyZXMgUXVvdGUtUHJpbnRhYmxlIHdoZW4gYSBsaW5lIGNvbnRhaW5zIGxpbmUgYnJlYWsocykuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbGluZSBmb2xkaW5nLAotICAgICAgICAgICAgLy8gc2VlICI1LjguMS4gTGluZSBkZWxpbWl0aW5nIGFuZCBmb2xkaW5nIiBpbiBSRkMgMjQyNS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBXZSB0YWtlIGNhcmUgb2YgdGhpcyBjYXNlIG1vcmUgZm9ybWFsbHkgaW4gdkNhcmQgMy4wLCBzbyB3ZSBvbmx5IG5lZWQgdG8KLSAgICAgICAgICAgIC8vIGRvIHRoaXMgaW4gdkNhcmQgMi4xLgotICAgICAgICAgICAgaWYgKGdldFZlcnNpb24oKSA9PSBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmV4dExpbmUgPSBwZWVrTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGNhcmUgdG9vIG11Y2ggYWJvdXQgdGhpcyBleGNlcHRpb25hbCBjYXNlLAotICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugc2hvdWxkIG5vdCB3cm9uZ2x5IGVhdCB1cCAiRU5EOlZDQVJEIiwgc2luY2UgaXQgY3JpdGljYWxseQotICAgICAgICAgICAgICAgICAgICAvLyBicmVha3MgdGhpcyBwYXJzZXIncyBzdGF0ZSBtYWNoaW5lLgotICAgICAgICAgICAgICAgICAgICAvLyBUaHVzIHdlIHJvdWdobHkgbG9vayBvdmVyIHRoZSBuZXh0IGxpbmUgYW5kIGNvbmZpcm0gaXQgaXMgYXQgbGVhc3Qgbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vICJFTkQ6VkNBUkQiLiBUaGlzIGV4dHJhIGZlZSBpcyB3b3J0aCBwYXlpbmcuIFRoaXMgaXMgZXhjZXB0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgLy8gYW55d2F5LgotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG5leHRMaW5lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaW5lLmNoYXJBdCgwKSA9PSAnICcgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIkVORDpWQ0FSRCIuY29udGFpbnMobmV4dExpbmUudG9VcHBlckNhc2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmUoKTsgIC8vIERyb3AgdGhlIG5leHQgbGluZS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dExpbmUuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIHYuYWRkKG1heWJlVW5lc2NhcGVUZXh0KHByb3BlcnR5VmFsdWUpKTsKLSAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVZhbHVlcyh2KTsKLSAgICAgICAgICAgIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyBhbmQgcmV0dXJucyBRdW90ZWQtUHJpbnRhYmxlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaXJzdFN0cmluZyBUaGUgc3RyaW5nIGZvbGxvd2luZyBhIHBhcmFtZXRlciBuYW1lIGFuZCBhdHRyaWJ1dGVzLgotICAgICAqICAgICAgICAgICAgRXhhbXBsZTogInN0cmluZyIgaW4KLSAgICAgKiAgICAgICAgICAgICJBRFI6RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpzdHJpbmdcblxyIi4KLSAgICAgKiBAcmV0dXJuIHdob2xlIFF1b3RlZC1QcmludGFibGUgc3RyaW5nLCBpbmNsdWRpbmcgYSBnaXZlbiBhcmd1bWVudCBhbmQKLSAgICAgKiAgICAgICAgIGZvbGxvd2luZyBsaW5lcy4gRXhjbHVkZXMgdGhlIGxhc3QgZW1wdHkgbGluZSBmb2xsb3dpbmcgdG8gUXVvdGVkCi0gICAgICogICAgICAgICBQcmludGFibGUgbGluZXMuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRRdW90ZWRQcmludGFibGUoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCB0aGVyZSBtYXkgYmUgc29tZSBwYWRkaW5nIGJldHdlZW4gPSBhbmQgQ1JMRi4KLSAgICAgICAgLy8gU2VlIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIHFwLWxpbmUgOj0gKihxcC1zZWdtZW50IHRyYW5zcG9ydC1wYWRkaW5nIENSTEYpCi0gICAgICAgIC8vIHFwLXBhcnQgdHJhbnNwb3J0LXBhZGRpbmcKLSAgICAgICAgLy8gcXAtc2VnbWVudCA6PSBxcC1zZWN0aW9uICooU1BBQ0UgLyBUQUIpICI9IgotICAgICAgICAvLyA7IE1heGltdW0gbGVuZ3RoIG9mIDc2IGNoYXJhY3RlcnMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gZS5nLiAoZnJvbSBSRkMgMjA0NSkKLSAgICAgICAgLy8gTm93J3MgdGhlIHRpbWUgPQotICAgICAgICAvLyBmb3IgYWxsIGZvbGsgdG8gY29tZT0KLSAgICAgICAgLy8gdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LgotICAgICAgICBpZiAoZmlyc3RTdHJpbmcudHJpbSgpLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSAidHJhbnNwb3J0LXBhZGRpbmciCi0gICAgICAgICAgICBpbnQgcG9zID0gZmlyc3RTdHJpbmcubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgd2hpbGUgKGZpcnN0U3RyaW5nLmNoYXJBdChwb3MpICE9ICc9JykgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nLnN1YnN0cmluZygwLCBwb3MgKyAxKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgYSBRdW90ZWQtUHJpbnRhYmxlIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkuZW5kc1dpdGgoIj0iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgInRyYW5zcG9ydC1wYWRkaW5nIgotICAgICAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxpbmUuY2hhckF0KHBvcykgIT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZS5zdWJzdHJpbmcoMCwgcG9zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpcnN0U3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlNjQoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoZmlyc3RTdHJpbmcpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGJpbmFyeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1haW5seSBmb3IgIkFEUiIsICJPUkciLCBhbmQgIk4iCi0gICAgICogPC9wPgotICAgICAqLwotICAgIC8qCi0gICAgICogYWRkcmVzc3BhcnRzID0gMCo2KHN0cm5vc2VtaSAiOyIpIHN0cm5vc2VtaSA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkciwKLSAgICAgKiBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLCBDb3VudHJ5IE5hbWUgb3JncGFydHMgPQotICAgICAqICooc3Rybm9zZW1pICI7Iikgc3Rybm9zZW1pIDsgRmlyc3QgaXMgT3JnYW5pemF0aW9uIE5hbWUsIHJlbWFpbmRlciBhcmUKLSAgICAgKiBPcmdhbml6YXRpb24gVW5pdHMuIG5hbWVwYXJ0cyA9IDAqNChzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkgOyBGYW1pbHksCi0gICAgICogR2l2ZW4sIE1pZGRsZSwgUHJlZml4LCBTdWZmaXguIDsgRXhhbXBsZTpQdWJsaWM7Sm9objtRLjtSZXZlcmVuZCBEci47SUlJLAotICAgICAqIEVzcS4gc3Rybm9zZW1pID0gKigqbm9uc2VtaSAoIlw7IiAvICJcIiBDUkxGKSkgKm5vbnNlbWkgOyBUbyBpbmNsdWRlIGEKLSAgICAgKiBzZW1pY29sb24gaW4gdGhpcyBzdHJpbmcsIGl0IG11c3QgYmUgZXNjYXBlZCA7IHdpdGggYSAiXCIgY2hhcmFjdGVyLiBXZQotICAgICAqIGRvIG5vdCBjYXJlIHRoZSBudW1iZXIgb2YgInN0cm5vc2VtaSIgaGVyZS4gV2UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgd2UKLSAgICAgKiBzaG91bGQgYWRkICJcIiBDUkxGIHRvIGVhY2ggdmFsdWUuIFdlIGV4Y2x1ZGUgdGhlbSBmb3Igbm93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyB2Q2FyZCAyLjEgZG9lcyBub3QgYWxsb3cgUVVPVEVELVBSSU5UQUJMRSBoZXJlLCBidXQgc29tZQotICAgICAgICAvLyBzb2Z0d2FyZXMvZGV2aWNlcwotICAgICAgICAvLyBlbWl0IHN1Y2ggZGF0YS4KLSAgICAgICAgaWYgKG1DdXJyZW50RW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiUVVPVEVELVBSSU5UQUJMRSIpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0gZ2V0UXVvdGVkUHJpbnRhYmxlKHByb3BlcnR5VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5VmFsdWVzKFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wZXJ0eVZhbHVlLAotICAgICAgICAgICAgICAgIGdldFZlcnNpb24oKSkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogdkNhcmQgMi4xIHNwZWNpZmllcyBBR0VOVCBhbGxvd3Mgb25lIHZjYXJkIGVudHJ5LiBDdXJyZW50bHkgd2UgZW1pdCBhbgotICAgICAqIGVycm9yIHRvd2FyZCB0aGUgQUdFTlQgcHJvcGVydHkuCi0gICAgICogLy8gVE9ETzogU3VwcG9ydCBBR0VOVCBwcm9wZXJ0eS4KLSAgICAgKiBpdGVtID0KLSAgICAgKiAuLi4gLyBbZ3JvdXBzICIuIl0gIkFHRU5UIiBbcGFyYW1zXSAiOiIgdmNhcmQgQ1JMRiB2Y2FyZCA9ICJCRUdJTiIgW3dzXQotICAgICAqICI6IiBbd3NdICJWQ0FSRCIgW3dzXSAxKkNSTEYgaXRlbXMgKkNSTEYgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWdlbnQoZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcHJvcGVydHlWYWx1ZS50b1VwcGVyQ2FzZSgpLmNvbnRhaW5zKCJCRUdJTjpWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAvLyBBcHBhcmVudGx5IGludmFsaWQgbGluZSBzZWVuIGluIFdpbmRvd3MgTW9iaWxlIDYuNS4gSWdub3JlIHRoZW0uCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQUdFTlQgUHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdkNhcmQgMy4wLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB1bmVzY2FwZWQgU3RyaW5nIGlmIHRoZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIHVuZXNjYXBlZC4gUmV0dXJuCi0gICAgICogbnVsbCBvdGhlcndpc2UuIGUuZy4gSW4gdkNhcmQgMi4xLCAiXDsiIHNob3VsZCBiZSB1bmVzY2FwZWQgaW50byAiOyIKLSAgICAgKiB3aGlsZSAiXHgiIHNob3VsZCBub3QgYmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlQ2hhcmFjdGVyKGNoKTsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICAvLyBPcmlnaW5hbCB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyB0cmFuc2Zvcm1hdGlvbgotICAgICAgICAvLyAiXDoiIC0+ICI6IiwgIlwsIiAtPiAiLCIsIGFuZCAiXFwiIC0+ICJcIiwgYnV0IHByZXZpb3VzCi0gICAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mCi0gICAgICAgIC8vIHRoaXMgY2xhc3MgYWxsb3dlZCB0aGVtLCBzbyBrZWVwIGl0IGFzIGlzLgotICAgICAgICBpZiAoY2ggPT0gJ1xcJyB8fCBjaCA9PSAnOycgfHwgY2ggPT0gJzonIHx8IGNoID09ICcsJykgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dQZXJmb3JtYW5jZUluZm8oKSB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUb3RhbCBwYXJzaW5nIHRpbWU6ICAiICsgbVRpbWVUb3RhbCArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRvdGFsIHJlYWRMaW5lIHRpbWU6ICIgKyBtUmVhZGVyLmdldFRvdGFsbWlsbGlzZWNvbmQoKSArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIHRoZSBiZWdnaW5pbmcgb2YgdGhlIHJlY29yZDogIiArIG1UaW1lUmVhZFN0YXJ0UmVjb3JkCi0gICAgICAgICAgICAgICAgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyB0aGUgZW5kIG9mIHRoZSByZWNvcmQ6ICIgKyBtVGltZVJlYWRFbmRSZWNvcmQgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIGxpbmUsIGFuZCBoYW5kbGluZyBncm91cDogIiArIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXAKLSAgICAgICAgICAgICAgICArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgQURSLCBPUkcsIGFuZCBOIGZpZWxkczoiICsgbVRpbWVQYXJzZUFkck9yZ04gKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIHByb3BlcnR5IHZhbHVlczogIiArIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlcyArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIG5vcm1hbCBwcm9wZXJ0eSB2YWx1ZXM6ICIgKyBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlCi0gICAgICAgICAgICAgICAgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBRdW90ZWQtUHJpbnRhYmxlOiAiICsgbVRpbWVIYW5kbGVRdW90ZWRQcmludGFibGUgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBCYXNlNjQ6ICIgKyBtVGltZUhhbmRsZUJhc2U2NCArICIgbXMiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHtAbGluayBWQ2FyZENvbmZpZyNWRVJTSU9OXzIxfQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZFUlNJT05fMjE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7QGxpbmsgVkNhcmRDb25maWcjVkVSU0lPTl8zMH0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YyMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0S25vd25Qcm9wZXJ0eU5hbWVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0tub3duUHJvcGVydHlOYW1lU2V0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRLbm93blR5cGVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0tub3duVHlwZVNldDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0S25vd25WYWx1ZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkUGFyc2VyX1YyMS5zS25vd25WYWx1ZVNldDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0QXZhaWxhYmxlRW5jb2RpbmdTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0F2YWlsYWJsZUVuY29kaW5nOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9FTkNPRElORzsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVycHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIklucHV0U3RyZWFtIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciB0bXBSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIG1JbnRlcm1lZGlhdGVDaGFyc2V0KTsKLSAgICAgICAgbVJlYWRlciA9IG5ldyBDdXN0b21CdWZmZXJlZFJlYWRlcih0bXBSZWFkZXIpOwotCi0gICAgICAgIG1JbnRlcnByZXRlciA9IChpbnRlcnByZXRlciAhPSBudWxsID8gaW50ZXJwcmV0ZXIgOiBuZXcgRW1wdHlJbnRlcnByZXRlcigpKTsKLQotICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGlmIChtSW50ZXJwcmV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUludGVycHJldGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VWQ2FyZEZpbGUoKTsKLSAgICAgICAgaWYgKG1JbnRlcnByZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIuZW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVUb3RhbCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgc2hvd1BlcmZvcm1hbmNlSW5mbygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtQ2FuY2VsZWQgPSB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjMwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJJbXBsX1YzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFkOWEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBhY2hpZXZpbmcgdkNhcmQgMy4wIHBhcnNpbmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaW5oZXJpdHMgdkNhcmQgMi4xIGltcGxlbWVudGF0aW9uIHNpbmNlIHRlY2huaWNhbGx5IHRoZXkgYXJlIHNpbWlsYXIsCi0gKiB3aGlsZSBzcGVjaWZpY2FsbHkgdGhlcmUncyBsb2dpY2FsIG5vIHJlbGV2YW5jZSBiZXR3ZWVuIHRoZW0uCi0gKiBTbyB0aGF0IGRldmVsb3BlcnMgYXJlIG5vdCBjb25mdXNlZCB3aXRoIHRoZSBpbmhlcml0YW5jZSwKLSAqIHtAbGluayBWQ2FyZFBhcnNlcl9WMzB9IGRvZXMgbm90IGluaGVyaXQge0BsaW5rIFZDYXJkUGFyc2VyX1YyMX0sIHdoaWxlCi0gKiB7QGxpbmsgVkNhcmRQYXJzZXJJbXBsX1YzMH0gaW5oZXJpdHMge0BsaW5rIFZDYXJkUGFyc2VySW1wbF9WMjF9LgotICogPC9wPgotICogQGhpZGUKLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBWQ2FyZFBhcnNlckltcGxfVjMwIGV4dGVuZHMgVkNhcmRQYXJzZXJJbXBsX1YyMSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRQYXJzZXJJbXBsX1YzMCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUHJldmlvdXNMaW5lOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW1pdHRlZEFnZW50V2FybmluZyA9IGZhbHNlOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WMzAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WMzAoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBzdXBlcih2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZFUlNJT05fMzA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMzA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmUgd2l0aCBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCi0gICAgICogbXVzdCBiZSBjb21iaW5lZCB3aXRoIHByZXZpb3VzIGxpbmUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROb25FbXB0eUxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBsaW5lID0gbVJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiUmVhY2hlZCBlbmQgb2YgYnVmZmVyLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5jaGFyQXQoMCkgPT0gJyAnIHx8IGxpbmUuY2hhckF0KDApID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBTZWN0aW9uIDUuOC4xIG9mIFJGQyAyNDI1IChNSU1FLURJUiBkb2N1bWVudCkuCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBpcyB0aGUgZXhjZXJwdHMgZnJvbSBpdC4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24gdGhhdCBleGlzdHMgb24gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIENhbiBiZSByZXByZXNlbnRlZCBhczoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gIHRoYXQgZXhpc3RzIG9uIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBJdCBjb3VsZCBhbHNvIGJlIHJlcHJlc2VudGVkIGFzOgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBERVNDUklQVElPTjpUaGlzIGlzIGEgbG9uZyBkZXNjcmlwCi0gICAgICAgICAgICAgICAgICAgIC8vICB0aW9uIHRoYXQgZXhpc3RzIG8KLSAgICAgICAgICAgICAgICAgICAgLy8gIG4gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobVByZXZpb3VzTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJTcGFjZSBleGlzdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2aW91c0xpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHZjYXJkID0gW2dyb3VwICIuIl0gIkJFR0lOIiAiOiIgIlZDQVJEIiAxICogQ1JMRgotICAgICAqICAgICAgICAgMSAqIChjb250ZW50bGluZSkKLSAgICAgKiAgICAgICAgIDtBIHZDYXJkIG9iamVjdCBNVVNUIGluY2x1ZGUgdGhlIFZFUlNJT04sIEZOIGFuZCBOIHR5cGVzLgotICAgICAqICAgICAgICAgW2dyb3VwICIuIl0gIkVORCIgIjoiICJWQ0FSRCIgMSAqIENSTEYKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkQmVnaW5WQ2FyZChib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVuZFZDYXJkKGJvb2xlYW4gdXNlQ2FjaGUsIGJvb2xlYW4gYWxsb3dHYXJiYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgc3VwZXIucmVhZEVuZFZDYXJkKHVzZUNhY2hlLCBhbGxvd0dhcmJhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbiBhcyBwYXJhbVR5cGUsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoZmluYWwgU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBtYXliZSBJQU5BIHR5cGUKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gcGFyYW1zLnNwbGl0KCI9IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbnlQYXJhbShzdHJBcnJheVswXSwgc3RyQXJyYXlbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBNdXN0IG5vdCBjb21lIGhlcmUgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcGFyYW1zIHZhbHVlOiAiICsgcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKGZpbmFsIFN0cmluZyBwYXJhbU5hbWUsIGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZShwYXJhbU5hbWUpOwotICAgICAgICBzcGxpdEFuZFB1dFBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIHZDYXJkIDMuMCBkZWZpbmVzCi0gICAgICoKLSAgICAgKiAgcGFyYW0gICAgICAgICA9IHBhcmFtLW5hbWUgIj0iIHBhcmFtLXZhbHVlICooIiwiIHBhcmFtLXZhbHVlKQotICAgICAqICBwYXJhbS1uYW1lICAgID0gaWFuYS10b2tlbiAvIHgtbmFtZQotICAgICAqICBwYXJhbS12YWx1ZSAgID0gcHRleHQgLyBxdW90ZWQtc3RyaW5nCi0gICAgICogIHF1b3RlZC1zdHJpbmcgPSBEUVVPVEUgUVNBRkUtQ0hBUiBEUVVPVEUKLSAgICAgKiAgUVNBRkUtQ0hBUiAgICA9IFdTUCAvICV4MjEgLyAleDIzLTdFIC8gTk9OLUFTQ0lJCi0gICAgICogICAgICAgICAgICAgICAgOyBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBDVExzLCBEUVVPVEUKLSAgICAgKgotICAgICAqICBRU0FGRS1DSEFSIG11c3Qgbm90IGNvbnRhaW4gRFFVT1RFLCBpbmNsdWRpbmcgZXNjYXBlZCBvbmUgKFwiKS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUeXBlKGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICBzcGxpdEFuZFB1dFBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BsaXRzIHBhcmFtZXRlciB2YWx1ZXMgaW50byBwaWVjZXMgaW4gYWNjb3JkYW5jZSB3aXRoIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uIGFuZAotICAgICAqIHB1dHMgcGllY2VzIGludG8gbUludGVycHJldGVyLgotICAgICAqLwotICAgIC8qCi0gICAgICogIHBhcmFtLXZhbHVlICAgPSBwdGV4dCAvIHF1b3RlZC1zdHJpbmcKLSAgICAgKiAgcXVvdGVkLXN0cmluZyA9IERRVU9URSBRU0FGRS1DSEFSIERRVU9URQotICAgICAqICBRU0FGRS1DSEFSICAgID0gV1NQIC8gJXgyMSAvICV4MjMtN0UgLyBOT04tQVNDSUkKLSAgICAgKiAgICAgICAgICAgICAgICA7IEFueSBjaGFyYWN0ZXIgZXhjZXB0IENUTHMsIERRVU9URQotICAgICAqCi0gICAgICogIFFTQUZFLUNIQVIgbXVzdCBub3QgY29udGFpbiBEUVVPVEUsIGluY2x1ZGluZyBlc2NhcGVkIG9uZSAoXCIpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNwbGl0QW5kUHV0UGFyYW1WYWx1ZShTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICAvLyAiY29tbWEsc2VwYXJhdGVkOmluc2lkZS5kcXVvdGUiLHByZWYKLSAgICAgICAgLy8gICAtLT4KLSAgICAgICAgLy8gLSBjb21tYSxzZXBhcmF0ZWQ6aW5zaWRlLmRxdW90ZQotICAgICAgICAvLyAtIHByZWYKLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm90ZTogVGhvdWdoIHRoZXJlJ3MgYSBjb2RlLCB3ZSBkb24ndCBuZWVkIHRvIHRha2UgbXVjaCBjYXJlIG9mCi0gICAgICAgIC8vIHdyb25nbHktYWRkZWQgcXVvdGVzIGxpa2UgdGhlIGV4YW1wbGUgYWJvdmUsIGFzIHRoZXkgaW5kdWNlCi0gICAgICAgIC8vIHBhcnNlIGVycm9ycyBhdCB0aGUgdG9wIGxldmVsICh3aGVuIHNwbGl0dGluZyBhIGxpbmUgaW50byBwYXJ0cykuCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7ICAvLyBEZWxheSBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgYm9vbGVhbiBpbnNpZGVEcXVvdGUgPSBmYWxzZTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHBhcmFtVmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBwYXJhbVZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5zaWRlRHF1b3RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBEcXVvdGUuCi0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGluc2lkZURxdW90ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVmInF1b3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVW5leHBlY3RlZCBEcXVvdGUgaW5zaWRlIHByb3BlcnR5LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZiwicXVvdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJxdW90ZWQiLHByZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5zaWRlRHF1b3RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcsJyAmJiAhaW5zaWRlRHF1b3RlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQ29tbWEgaXMgdXNlZCBiZWZvcmUgYWN0dWFsIHN0cmluZyBjb21lcy4gKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUbyBzdG9wIGNyZWF0aW5nIGVtcHR5IFN0cmluZ0J1ZmZlciBhdCB0aGUgZW5kIG9mIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAvLyB3ZSBkZWxheSBjcmVhdGluZyB0aGlzIG9iamVjdCB1bnRpbCB0aGlzIHBvaW50LgotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaW5zaWRlRHF1b3RlKSB7Ci0gICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAvLyAibm9uLXF1b3RlLWF0LWVuZAotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIkRhbmdsaW5nIERxdW90ZS4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVuaW50ZW5kZWQgYmVoYXZpb3IuIFdlIG11c3Qgbm90IHNlZSBlbXB0eSBTdHJpbmdCdWlsZGVyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImF0IHRoZSBlbmQgb2YgcGFyYW1ldGVyIHZhbHVlIHBhcnNpbmcuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFnZW50KGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIC8vIFRoZSB3YXkgaG93IHZDYXJkIDMuMCBzdXBwb3J0cyAiQUdFTlQiIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gdkNhcmQgMi4xLgotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuCi0gICAgICAgIC8vIEFHRU5UOkJFR0lOOlZDQVJEXG5GTjpKb2UgRnJpZGF5XG5URUw6KzEtOTE5LTU1NS03ODc4XG4KLSAgICAgICAgLy8gIFRJVExFOkFyZWEgQWRtaW5pc3RyYXRvclwsIEFzc2lzdGFudFxuIEVNQUlMXDtUWVBFPUlOVEVSTlxuCi0gICAgICAgIC8vICBFVDpqZnJpZGF5QGhvc3QuY29tXG5FTkQ6VkNBUkRcbgotICAgICAgICAvLwotICAgICAgICAvLyBUT0RPOiBmaXggdGhpcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gaXNzdWU6Ci0gICAgICAgIC8vICB2Q2FyZCAzLjAgYWxzbyBhbGxvd3MgdGhpcyBhcyBhbiBleGFtcGxlLgotICAgICAgICAvLwotICAgICAgICAvLyBBR0VOVDtWQUxVRT11cmk6Ci0gICAgICAgIC8vICBDSUQ6SlFQVUJMSUMucGFydDMuOTYwMTI5VDA4MzAyMC54eXpNYWlsQGhvc3QzLmNvbQotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGlzIG5vdCB2Q2FyZC4gU2hvdWxkIHdlIHN1cHBvcnQgdGhpcz8KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGxpbmUgZm9yIG5vdywgc2luY2Ugd2UgY2Fubm90IGtub3cgaG93IHRvIGhhbmRsZSBpdC4uLgotICAgICAgICBpZiAoIW1FbWl0dGVkQWdlbnRXYXJuaW5nKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQUdFTlQgaW4gdkNhcmQgMy4wIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBJZ25vcmUgaXQiKTsKLSAgICAgICAgICAgIG1FbWl0dGVkQWdlbnRXYXJuaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBkb2VzIG5vdCByZXF1aXJlIHR3byBDUkxGIGF0IHRoZSBsYXN0IG9mIEJBU0U2NCBkYXRhLgotICAgICAqIEl0IG9ubHkgcmVxdWlyZXMgdGhhdCBkYXRhIHNob3VsZCBiZSBNSU1FLWVuY29kZWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlNjQoZmluYWwgU3RyaW5nIGZpcnN0U3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJGaWxlIGVuZGVkIGR1cmluZyBwYXJzaW5nIEJBU0U2NCBiaW5hcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxpbmUuc3RhcnRzV2l0aCgiICIpICYmICFsaW5lLnN0YXJ0c1dpdGgoIlx0IikpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFU0NBUEVELUNIQVIgPSAiXFwiIC8gIlw7IiAvICJcLCIgLyAiXG4iIC8gIlxOIikKLSAgICAgKiAgICAgICAgICAgICAgOyBcXCBlbmNvZGVzIFwsIFxuIG9yIFxOIGVuY29kZXMgbmV3bGluZQotICAgICAqICAgICAgICAgICAgICA7IFw7IGVuY29kZXMgOywgXCwgZW5jb2RlcyAsCi0gICAgICoKLSAgICAgKiBOb3RlOiBBcHBsZSBlc2NhcGVzICc6JyBpbnRvICdcOicgd2hpbGUgZG9lcyBub3QgZXNjYXBlICdcJwotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlVGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgY2hhciBuZXh0X2NoID0gdGV4dC5jaGFyQXQoKytpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dF9jaCA9PSAnbicgfHwgbmV4dF9jaCA9PSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dF9jaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVDaGFyYWN0ZXIoY2gpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKGNoID09ICduJyB8fCBjaCA9PSAnTicpIHsKLSAgICAgICAgICAgIHJldHVybiAiXG4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRLbm93blByb3BlcnR5TmFtZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkUGFyc2VyX1YzMC5zS25vd25Qcm9wZXJ0eU5hbWVTZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WNDAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTc2YmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WNDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIEJhc2ljIGltcGxlbWVudGF0aW9uIHBhcnNpbmcgdkNhcmQgNC4wLgotICogPC9wPgotICogPHA+Ci0gKiB2Q2FyZCA0LjAgaXMgbm90IHB1Ymxpc2hlZCB5ZXQuIEFsc28gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBwcmVtYXR1cmUuIAotICogPC9wPgotICogQGhpZGUKLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBWQ2FyZFBhcnNlckltcGxfVjQwIGV4dGVuZHMgVkNhcmRQYXJzZXJJbXBsX1YzMCB7Ci0gICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRQYXJzZXJJbXBsX1Y0MCI7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJJbXBsX1Y0MCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJJbXBsX1Y0MChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHN1cGVyKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkVSU0lPTl80MDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1Y0MDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSBlc2NhcGUgIlxOIiBpbnRvIG5ldyBsaW5lIGZvciBzYWZldHkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVUZXh0KHRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewotICAgICAgICAvLyBUT0RPOiBtb3JlIHN0cmljdGx5LCB2Q2FyZCA0LjAgcmVxdWlyZXMgZGlmZmVyZW50IHR5cGUgb2YgdW5lc2NhcGluZyBydWxlCi0gICAgICAgIC8vICAgICAgIHRvd2FyZCBlYWNoIHByb3BlcnR5LgotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGNoID09ICdcXCcgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIG5leHRfY2ggPSB0ZXh0LmNoYXJBdCgrK2kpOwotICAgICAgICAgICAgICAgIGlmIChuZXh0X2NoID09ICduJyB8fCBuZXh0X2NoID09ICdOJykgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0X2NoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKGNoID09ICduJyB8fCBjaCA9PSAnTicpIHsKLSAgICAgICAgICAgIHJldHVybiAiXG4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRLbm93blByb3BlcnR5TmFtZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkUGFyc2VyX1Y0MC5zS25vd25Qcm9wZXJ0eU5hbWVTZXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3YTE3Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPC9wPgotICogdkNhcmQgcGFyc2VyIGZvciB2Q2FyZCAyLjEuIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWwgYWJvdXQgdGhlIHNwZWMgaXRzZWxmLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgc3BlYyBpcyB3cml0dGVuIGluIDE5OTYsIGFuZCBjdXJyZW50bHkgdmFyaW91cyB0eXBlcyBvZiAidkNhcmQgMi4xIiBleGlzdC4KLSAqIFRvIGhhbmRsZSByZWFsIHRoZSB3b3JsZCB2Q2FyZCBmb3JtYXRzIGFwcHJvcHJpYXRlbHkgYW5kIGVmZmVjdGl2ZWx5LCB0aGlzIGNsYXNzIGRvZXMgbm90Ci0gKiBvYmV5IHdpdGggc3RyaWN0IHZDYXJkIDIuMS4KLSAqIEluIHN0ZWFkLCBub3Qgb25seSB2Q2FyZCBzcGVjIGJ1dCBhbHNvIHJlYWwgd29ybGQgdkNhcmQgaXMgY29uc2lkZXJlZC4KLSAqIDwvcD4KLSAqIGUuZy4gQSBsb3Qgb2YgZGV2aWNlcyBhbmQgc29mdHdhcmVzIGxldCB2Q2FyZCBpbXBvcnRlci9leHBvcnRlciB0byB1c2UKLSAqIHRoZSBQTkcgZm9ybWF0IHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBpbWFnZSwgd2hpbGUgaXQgaXMgbm90IGFsbG93ZWQgaW4KLSAqIHRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uLiBBcyBvZiAyMDEwLCB3ZSBjYW4gc2VlIGV2ZW4gdGhlIEZMViBmb3JtYXQKLSAqIChwb3NzaWJsZSBpbiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzKS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZDYXJkUGFyc2VyX1YyMSBpbXBsZW1lbnRzIFZDYXJkUGFyc2VyIHsKLSAgICAvKioKLSAgICAgKiBBIHVubW9kaWZpYWJsZSBTZXQgc3RvcmluZyB0aGUgcHJvcGVydHkgbmFtZXMgYXZhaWxhYmxlIGluIHRoZSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25Qcm9wZXJ0eU5hbWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWRVJTSU9OIiwgIlRFTCIsICJFTUFJTCIsICJUWiIsICJHRU8iLCAiTk9URSIsICJVUkwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIikpKTsKLQotICAgIC8qKgotICAgICAqIEEgdW5tb2RpZmlhYmxlIFNldCBzdG9yaW5nIHRoZSB0eXBlcyBrbm93biBpbiB2Q2FyZCAyLjEuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0tub3duVHlwZVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiRE9NIiwgIklOVEwiLCAiUE9TVEFMIiwgIlBBUkNFTCIsICJIT01FIiwgIldPUksiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUkVGIiwgIlZPSUNFIiwgIkZBWCIsICJNU0ciLCAiQ0VMTCIsICJQQUdFUiIsICJCQlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNT0RFTSIsICJDQVIiLCAiSVNETiIsICJWSURFTyIsICJBT0wiLCAiQVBQTEVMSU5LIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUTUFJTCIsICJDSVMiLCAiRVdPUkxEIiwgIklOVEVSTkVUIiwgIklCTU1BSUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNQ0lNQUlMIiwgIlBPV0VSU0hBUkUiLCAiUFJPRElHWSIsICJUTFgiLCAiWDQwMCIsICJHSUYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDR00iLCAiV01GIiwgIkJNUCIsICJNRVQiLCAiUE1CIiwgIkRJQiIsICJQSUNUIiwgIlRJRkYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQREYiLCAiUFMiLCAiSlBFRyIsICJRVElNRSIsICJNUEVHIiwgIk1QRUcyIiwgIkFWSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBVkUiLCAiQUlGRiIsICJQQ00iLCAiWDUwOSIsICJQR1AiKSkpOwotCi0gICAgLyoqCi0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGUgIlZBTFVFIiwgYXZhaWxhYmxlIGluIHRoZSB2Q2FyZCAyLjEuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0tub3duVmFsdWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIklOTElORSIsICJVUkwiLCAiQ09OVEVOVC1JRCIsICJDSUQiKSkpOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGUgIkVOQ09ESU5HIiwgYXZhaWxhYmxlIGluIHRoZSB2Q2FyZCAyLjEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRob3VnaCB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyAiQiIgZW5jb2RpbmcsIHNvbWUgZGF0YSBtYXkgaGF2ZSBpdC4KLSAgICAgKiBXZSBhbGxvdyBpdCBmb3Igc2FmZXR5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQXZhaWxhYmxlRW5jb2RpbmcgPQotICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HXzdCSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR184QklULAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfUVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CKSkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFBhcnNlckltcGxfVjIxIG1WQ2FyZFBhcnNlckltcGw7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjIxKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsID0gbmV3IFZDYXJkUGFyc2VySW1wbF9WMjEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjIxKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjIxKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwucGFyc2UoaXMsIGludGVyZXByZXRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLmNhbmNlbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4ZDNhOC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIHZDYXJkIHBhcnNlciBmb3IgdkNhcmQgMy4wLiBTZWUgUkZDIDI0MjYgZm9yIG1vcmUgZGV0YWlsLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIHBhcnNlciBhbGxvd3MgdkNhcmQgZm9ybWF0IHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBSRkMsIHNpbmNlCi0gKiB3ZSBoYXZlIHNlZW4gc2V2ZXJhbCB2Q2FyZCAzLjAgZmlsZXMgd2hpY2ggZG9uJ3QgY29tcGx5IHdpdGggaXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIGUuZy4gdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93ICJDSEFSU0VUIiBhdHRyaWJ1dGUsIGJ1dCBzb21lIGFjdHVhbCBmaWxlcwotICogaGF2ZSBpdCBhbmQgdGhleSB1c2VzIG5vbiBVVEYtOCBjaGFyc2V0cy4gVVRGLTggaXMgcmVjb21tZW5kZWQgaW4gUkZDIDI0MjYsCi0gKiBidXQgaXQgaXMgbm90IGEgbXVzdC4gV2Ugc2lsZW50bHkgYWxsb3cgIkNIQVJTRVQiLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRQYXJzZXJfVjMwIGltcGxlbWVudHMgVkNhcmRQYXJzZXIgewotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNLbm93blByb3BlcnR5TmFtZVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAiQkVHSU4iLCAiTE9HTyIsICJQSE9UTyIsICJMQUJFTCIsICJGTiIsICJUSVRMRSIsICJTT1VORCIsIAotICAgICAgICAgICAgICAgICAgICAiVkVSU0lPTiIsICJURUwiLCAiRU1BSUwiLCAiVFoiLCAiR0VPIiwgIk5PVEUiLCAiVVJMIiwKLSAgICAgICAgICAgICAgICAgICAgIkJEQVkiLCAiUk9MRSIsICJSRVYiLCAiVUlEIiwgIktFWSIsICJNQUlMRVIiLCAvLyAyLjEKLSAgICAgICAgICAgICAgICAgICAgIk5BTUUiLCAiUFJPRklMRSIsICJTT1VSQ0UiLCAiTklDS05BTUUiLCAiQ0xBU1MiLAotICAgICAgICAgICAgICAgICAgICAiU09SVC1TVFJJTkciLCAiQ0FURUdPUklFUyIsICJQUk9ESUQiKSkpOyAvLyAzLjAKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEEgdW5tb2RpZmlhYmxlIFNldCBzdG9yaW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSB0eXBlICJFTkNPRElORyIsIGF2YWlsYWJsZSBpbiB0aGUgdkNhcmQgMy4wLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaG91Z2ggdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgIjdCSVQiIG9yICJCQVNFNjQiLCB3ZSBhbGxvdyB0aGVtIGZvciBzYWZldHkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqICJRVU9URUQtUFJJTlRBQkxFIiBpcyBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAgYW5kIG5vdCBpbiB0aGlzIHBhcnNlciBlaXRoZXIsCi0gICAgICogYmVjYXVzZSB0aGUgZW5jb2RpbmcgYW1iaWd1YXRlcyBob3cgdGhlIHZDYXJkIGZpbGUgdG8gYmUgcGFyc2VkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQWNjZXB0YWJsZUVuY29kaW5nID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HXzdCSVQsCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HXzhCSVQsCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HX0JBU0U2NCwKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQikpKTsKLQotICAgIHByaXZhdGUgZmluYWwgVkNhcmRQYXJzZXJJbXBsX1YzMCBtVkNhcmRQYXJzZXJJbXBsOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YzMCgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjMwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YzMChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwgPSBuZXcgVkNhcmRQYXJzZXJJbXBsX1YzMCh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVyZXByZXRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLnBhcnNlKGlzLCBpbnRlcmVwcmV0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbC5jYW5jZWwoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjQwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTJmNjguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1Y0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiB2Q2FyZCBwYXJzZXIgZm9yIHZDYXJkIDQuMC4KLSAqIDwvcD4KLSAqIDxwPgotICogQ3VycmVudGx5IHRoaXMgcGFyc2VyIGlzIGJhc2VkIG9uIHZDYXJkIDQuMCBzcGVjaWZpY2F0aW9uIHJldiAxMS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkUGFyc2VyX1Y0MCBpbXBsZW1lbnRzIFZDYXJkUGFyc2VyIHsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25Qcm9wZXJ0eU5hbWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgIkJFR0lOIiwgIkVORCIsICJTT1VSQ0UiLCAiTkFNRSIsICJLSU5EIiwgIlhNTCIsCi0gICAgICAgICAgICAgICAgICAgICJGTiIsICJOIiwgIk5JQ0tOQU1FIiwgIlBIT1RPIiwgIkJEQVkiLCAiRERBWSIsCi0gICAgICAgICAgICAgICAgICAgICJCSVJUSCIsICJERUFUSCIsICJBTk5JVkVSU0FSWSIsICJTRVgiLCAiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgIkxBQkVMIiwgIlRFTCIsICJFTUFJTCIsICJJTVBQIiwgIkxBTkciLCAiVFoiLAotICAgICAgICAgICAgICAgICAgICAiR0VPIiwgIlRJVExFIiwgIlJPTEUiLCAiTE9HTyIsICJPUkciLCAiTUVNQkVSIiwKLSAgICAgICAgICAgICAgICAgICAgIlJFTEFURUQiLCAiQ0FURUdPUklFUyIsICJOT1RFIiwgIlBST0RJRCIsCi0gICAgICAgICAgICAgICAgICAgICJSRVYiLCAiU09VTkQiLCAiVUlEIiwgIkNMSUVOVFBJRE1BUCIsCi0gICAgICAgICAgICAgICAgICAgICJVUkwiLCAiVkVSU0lPTiIsICJDTEFTUyIsICJLRVkiLCAiRkJVUkwiLCAiQ0FMRU5EUlVSSSIsCi0gICAgICAgICAgICAgICAgICAgICJDQUxVUkkiKSkpOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGUgIkVOQ09ESU5HIiwgYXZhaWxhYmxlIGluIHZDYXJkIDQuMC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0FjY2VwdGFibGVFbmNvZGluZyA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR184QklULAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CKSkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFBhcnNlckltcGxfVjMwIG1WQ2FyZFBhcnNlckltcGw7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjQwKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsID0gbmV3IFZDYXJkUGFyc2VySW1wbF9WNDAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjQwKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjQwKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwucGFyc2UoaXMsIGludGVyZXByZXRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLmNhbmNlbCgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkU291cmNlRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2NDYxZS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyB3aGljaCB0cmllcyB0byBkZXRlY3RzIHRoZSBzb3VyY2Ugb2YgYSB2Q2FyZCBmaWxlIGZyb20gaXRzIGNvbnRlbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgc3BlY2lmaWNhdGlvbiBvZiB2Q2FyZCAoaW5jbHVkaW5nIGJvdGggMi4xIGFuZCAzLjApIGlzIG5vdCBzbyBzdHJpY3QgYXMgdG8KLSAqIGd1ZXNzIGl0cyBmb3JtYXQganVzdCBieSByZWFkaW5nIGJlZ2lubmluZyBmZXcgbGluZXMgKHVzdWFsbHkgd2UgY2FuLCBidXQgaW4KLSAqIHNvbWUgbW9zdCBwZXNzaW1pc3RpYyBjYXNlLCB3ZSBjYW5ub3QgdW50aWwgYXQgYWxtb3N0IHRoZSBlbmQgb2YgdGhlIGZpbGUpLgotICogQWxzbyB3ZSBjYW5ub3Qgc3RvcmUgYWxsIHZDYXJkIGVudHJpZXMgaW4gbWVtb3J5LCB3aGlsZSB0aGVyZSdzIG5vIHNwZWNpZmljYXRpb24KLSAqIGhvdyBiaWcgdGhlIHZDYXJkIGVudHJ5IHdvdWxkIGJlY29tZSBhZnRlciB0aGUgcGFyc2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgdXN1YWxseSB1c2VkIGZvciB0aGUgImZpcnN0IHNjYW4iLCBpbiB3aGljaCB3ZSBjYW4gdW5kZXJzdGFuZCB3aGljaCB2Q2FyZAotICogdmVyc2lvbiBpcyB1c2VkIChhbmQgaG93IG1hbnkgZW50cmllcyBleGlzdCBpbiBhIGZpbGUpLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRTb3VyY2VEZXRlY3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkU291cmNlRGV0ZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gQVBQTEVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiWC1QSE9ORVRJQy1MQVNULU5BTUUiLAotICAgICAgICAgICAgIlgtQUJBRFIiLCAiWC1BQlVJRCIpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1HTk8iLCAiWC1HTiIsICJYLVJFRFVDVElPTiIpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBXSU5ET1dTX01PQklMRV9QSE9ORV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLU1JQ1JPU09GVC1BU1NUX1RFTCIsICJYLU1JQ1JPU09GVC1BU1NJU1RBTlQiLCAiWC1NSUNST1NPRlQtT0ZGSUNFTE9DIikpOwotICAgIAotICAgIC8vIE5vdGU6IHRoZXNlIHNpZ25lcyBhcHBlYXJzIGJlZm9yZSB0aGUgc2lnbnMgb2YgdGhlIG90aGVyIHR5cGUgKGUuZy4gIlgtR04iKS4KLSAgICAvLyBJbiBvdGhlciB3b3JkcywgSmFwYW5lc2UgRk9NQSBtb2JpbGUgcGhvbmVzIGFyZSBkZXRlY3RlZCBhcyBGT01BLCBub3QgSkFQQU5FU0VfTU9CSUxFX1BIT05FUy4KLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBGT01BX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtU0QtVkVSTiIsICJYLVNELUZPUk1BVF9WRVIiLCAiWC1TRC1DQVRFR09SSUVTIiwgIlgtU0QtQ0xBU1MiLCAiWC1TRC1EQ1JFQVRFRCIsCi0gICAgICAgICAgICAiWC1TRC1ERVNDUklQVElPTiIpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVFlQRV9GT01BX0NIQVJTRVRfU0lHTiA9ICJYLVNELUNIQVJfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIHRoYXQgbm8gZXN0aW1hdGlvbiBpcyBhdmFpbGFibGUuIFVzZXJzIG9mIHRoaXMgY2xhc3MgaXMgYWJsZSB0byB0aGlzCi0gICAgICogY29uc3RhbnQgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byBsZXQgYSB2Q2FyZCBwYXJzZXIgcmVseSBvbiBlc3RpbWF0aW9uIGZvciBwYXJzZSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfVU5LTk9XTiA9IDA7Ci0KLSAgICAvLyBGb3IgQXBwbGUncyBzb2Z0d2FyZSwgd2hpY2ggZG9lcyBub3QgbWVhbiB0aGlzIHR5cGUgaXMgZWZmZWN0aXZlIGZvciBhbGwgaXRzIHByb2R1Y3RzLgotICAgIC8vIFdlIGNvbmZpcm1lZCB0aGV5IHVzdWFsbHkgdXNlIFVURi04LCBidXQgbm90IHN1cmUgYWJvdXQgdkNhcmQgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9BUFBMRSA9IDE7Ci0gICAgLy8gRm9yIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMsIHdoaWNoIGFyZSB1c3VhbGx5IHVzaW5nIFNoaWZ0X0pJUyBhcyBhIGNoYXJzZXQuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQID0gMjsKLSAgICAvLyBGb3Igc29tZSBvZiBtb2JpbGUgcGhvbmVzIHJlbGVhc2VkIGZyb20gRG9Db01vLCB3aGljaCB1c2UgbmVzdGVkIHZDYXJkLiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVCA9IDM7Ci0gICAgLy8gRm9yIEphcGFuZXNlIFdpbmRvd3MgTW9iZWwgcGhvbmVzLiBJdCdzIHZlcnNpb24gaXMgc3VwcG9zZWQgdG8gYmUgNi41LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX1Y2NV9KUCA9IDQ7Ci0KLSAgICBwcml2YXRlIGludCBtUGFyc2VUeXBlID0gMDsgIC8vIE5vdCBzdXJlLgotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVG9QYXJzZVZlcnNpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtVmVyc2lvbiA9IC0xOyAgLy8gLTEgPT0gdW5rbm93bgotCi0gICAgLy8gU29tZSBtb2JpbGUgcGhvbmVzIChsaWtlIEZPTUEpIHRlbGxzIHVzIHRoZSBjaGFyc2V0IG9mIHRoZSBkYXRhLgotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFRvUGFyc2VDaGFyc2V0OwotICAgIHByaXZhdGUgU3RyaW5nIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbU5lZWRUb1BhcnNlQ2hhcnNldCA9IGZhbHNlOwotICAgICAgICBtTmVlZFRvUGFyc2VWZXJzaW9uID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICBtTmVlZFRvUGFyc2VWZXJzaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFlQRV9GT01BX0NIQVJTRVRfU0lHTikpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX0RPQ09NT19UT1JFTEFURV9ORVNUOwotICAgICAgICAgICAgLy8gUHJvYmFibHkgU2hpZnRfSklTIGlzIHVzZWQsIGJ1dCB3ZSBzaG91bGQgZG91YmxlIGNvbmZpcm0uCi0gICAgICAgICAgICBtTmVlZFRvUGFyc2VDaGFyc2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBhcnNlVHlwZSAhPSBQQVJTRV9UWVBFX1VOS05PV04pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoV0lORE9XU19NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX1Y2NV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChGT01BX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtUGFyc2VUeXBlID0gUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVDsKLSAgICAgICAgfSBlbHNlIGlmIChKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChBUFBMRV9TSUdOUy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgbVBhcnNlVHlwZSA9IFBBUlNFX1RZUEVfQVBQTEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmIChtTmVlZFRvUGFyc2VWZXJzaW9uICYmIHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvblN0cmluZyA9IHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAodmVyc2lvblN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjEpKSB7Ci0gICAgICAgICAgICAgICAgbVZlcnNpb24gPSBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YzMCkpIHsKLSAgICAgICAgICAgICAgICBtVmVyc2lvbiA9IFZDYXJkQ29uZmlnLlZFUlNJT05fMzA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25TdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjQwKSkgewotICAgICAgICAgICAgICAgIG1WZXJzaW9uID0gVkNhcmRDb25maWcuVkVSU0lPTl80MDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkludmFsaWQgdmVyc2lvbiBzdHJpbmc6ICIgKyB2ZXJzaW9uU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtTmVlZFRvUGFyc2VDaGFyc2V0ICYmIHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU3BlY2lmaWVkQ2hhcnNldCA9IHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhdmFpbGFibGUgdHlwZSBjYW4gYmUgdXNlZCB3aXRoIHZDYXJkIHBhcnNlci4gWW91IHByb2JhYmx5IG5lZWQgdG8KLSAgICAgKiB1c2Uge3tAbGluayAjZ2V0RXN0aW1hdGVkQ2hhcnNldCgpfSB0byB1bmRlcnN0YW5kIHRoZSBjaGFyc2V0IHRvIGJlIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRFc3RpbWF0ZWRUeXBlKCkgewotICAgICAgICBzd2l0Y2ggKG1QYXJzZVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8gfCBWQ2FyZENvbmZpZy5GTEFHX1RPUkVMQVRFX05FU1Q7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQOgotICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEU7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfQVBQTEU6Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfVjY1X0pQOgotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGlmIChtVmVyc2lvbiA9PSBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZlcnNpb24gPT0gVkNhcmRDb25maWcuVkVSU0lPTl8zMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfR0VORVJJQzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WZXJzaW9uID09IFZDYXJkQ29uZmlnLlZFUlNJT05fNDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjQwX0dFTkVSSUM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVU5LTk9XTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGNoYXJzZXQgU3RyaW5nIGd1ZXNzZWQgZnJvbSB0aGUgc291cmNlJ3MgcHJvcGVydGllcy4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBwYXJzaW5nIHRhcmdldCBmaWxlKHMpLgotICAgICAqIDwvcD4KLSAgICAgKiBAcmV0dXJuIENoYXJzZXQgU3RyaW5nLiBOdWxsIGlzIHJldHVybmVkIGlmIGd1ZXNzaW5nIHRoZSBzb3VyY2UgZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFc3RpbWF0ZWRDaGFyc2V0KCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobVNwZWNpZmllZENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNwZWNpZmllZENoYXJzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChtUGFyc2VUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfVjY1X0pQOgotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX0RPQ09NT19UT1JFTEFURV9ORVNUOgotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNISUZUX0pJUyI7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfQVBQTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtOCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiY2VjYTAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkRlY29kZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5RdW90ZWRQcmludGFibGVDb2RlYzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgVkNhcmQgaGFuZGxpbmcgY29kZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFV0aWxzIjsKLQotICAgIC8vIE5vdGUgdGhhdCBub3QgYWxsIHR5cGVzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIG1hcC9zZXQsIHNpbmNlLCBmb3IgZXhhbXBsZSwgVFlQRV9IT01FX0ZBWCBpcwotICAgIC8vIGNvbnZlcnRlZCB0byB0d28gcGFyYW1ldGVyIFN0cmluZ3MuIFRoZXNlIG9ubHkgY29udGFpbiBzb21lIG1pbm9yIGZpZWxkcyB2YWxpZCBpbiBib3RoCi0gICAgLy8gdkNhcmQgYW5kIGN1cnJlbnQgKGFzIG9mIDIwMDktMDgtMDcpIENvbnRhY3RzIHN0cnVjdHVyZS4gCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0tub3duUGhvbmVUeXBlc01hcF9JdG9TOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc0tub3duUGhvbmVUeXBlTWFwX1N0b0k7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNNb2JpbGVQaG9uZUxhYmVsU2V0OwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfQ0FSLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUiwgUGhvbmUuVFlQRV9DQVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfUEFHRVIsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUiwgUGhvbmUuVFlQRV9QQUdFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9JU0ROLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0lTRE4pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9JU0ROLCBQaG9uZS5UWVBFX0lTRE4pOwotICAgICAgICAKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgUGhvbmUuVFlQRV9XT1JLKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9PVEhFUiwgUGhvbmUuVFlQRV9PVEhFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NBTExCQUNLLAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfQ0FMTEJBQ0spOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoCi0gICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DT01QQU5ZX01BSU4sIFBob25lLlRZUEVfQ09NUEFOWV9NQUlOKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfUkFESU8sIFBob25lLlRZUEVfUkFESU8pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9UVFlfVERELAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfVFRZX1RERCk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgICAgICBQaG9uZS5UWVBFX0FTU0lTVEFOVCk7Ci0KLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NT0RFTSk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTVNHKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9CQlMpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZJREVPKTsKLQotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfQUlNLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FJTSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfTVNOLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX01TTik7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfWUFIT08sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfWUFIT08pOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX1NLWVBFLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9HT09HTEVfVEFMSywKLSAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0dPT0dMRV9UQUxLKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9JQ1EsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSUNRKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9KQUJCRVIsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSkFCQkVSKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9RUSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9RUSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfTkVUTUVFVElORywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ORVRNRUVUSU5HKTsKLQotICAgICAgICAvLyBcdTY0M0FcdTVFMkZcdTk2RkJcdThBNzEgPSBGdWxsLXdpZHRoIEhpcmFnYW5hICJLZWl0YWktRGVud2EiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIC8vIFx1NjQzQVx1NUUyRiA9IEZ1bGwtd2lkdGggSGlyYWdhbmEgIktlaXRhaSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgLy8gXHUzMEIxXHUzMEE0XHUzMEJGXHUzMEE0ID0gRnVsbC13aWR0aCBLYXRha2FuYSAiS2VpdGFpIiAobW9iaWxlIHBob25lKQotICAgICAgICAvLyBcdUZGNzlcdUZGNzJcdUZGODBcdUZGNzIgPSBIYWxmLXdpZHRoIEthdGFrYW5hICJLZWl0YWkiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIHNNb2JpbGVQaG9uZUxhYmVsU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICJNT0JJTEUiLCAiXHU2NDNBXHU1RTJGXHU5NkZCXHU4QTcxIiwgIlx1NjQzQVx1NUUyRiIsICJcdTMwQjFcdTMwQTRcdTMwQkZcdTMwQTQiLAotICAgICAgICAgICAgICAgICJcdUZGNzlcdUZGNzJcdUZGODBcdUZGNzIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGhvbmVUeXBlU3RyaW5nKEludGVnZXIgdHlwZSkgewotICAgICAgICByZXR1cm4gc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLmdldCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIEludGVyZ2VyIHdoZW4gdGhlIGdpdmVuIHR5cGVzIGNhbiBiZSBwYXJzZWQgYXMga25vd24gdHlwZS4gUmV0dXJucyBTdHJpbmcgb2JqZWN0Ci0gICAgICogd2hlbiBub3QsIHdoaWNoIHNob3VsZCBiZSBzZXQgdG8gbGFiZWwuIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFBob25lVHlwZUZyb21TdHJpbmdzKENvbGxlY3Rpb248U3RyaW5nPiB0eXBlcywKLSAgICAgICAgICAgIFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgaWYgKG51bWJlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBudW1iZXIgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotICAgICAgICBib29sZWFuIGlzRmF4ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaGFzUHJlZiA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlcykgewotICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzUHJlZiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYXggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLnN0YXJ0c1dpdGgoIlgtIikgJiYgdHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHRtcCA9IHNLbm93blBob25lVHlwZU1hcF9TdG9JLmdldCh0eXBlU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZUNhbmRpZGF0ZSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfUEFHRVIgaXMgcHJlZmVyZWQgd2hlbiB0aGUgbnVtYmVyIGNvbnRhaW5zIEAgc3Vycm9uZGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHBhZ2VyIG51bWJlciBhbmQgYSBkb21haW4gbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG8gMTExMUBkb21haW4uY29tCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB4IEBkb21haW4uY29tCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB4IDExMTFACi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXhPZkF0ID0gbnVtYmVyLmluZGV4T2YoIkAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZUNhbmRpZGF0ZSA9PSBQaG9uZS5UWVBFX1BBR0VSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIDAgPCBpbmRleE9mQXQgJiYgaW5kZXhPZkF0IDwgbnVtYmVyLmxlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBQaG9uZS5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgIGlmIChoYXNQcmVmKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfTUFJTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBUWVBFX0hPTUUKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9IT01FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0ZheCkgewotICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9IT01FKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfRkFYX0hPTUU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9XT1JLKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfRkFYX1dPUks7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9PVEhFUikgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX09USEVSX0ZBWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vYmlsZVBob25lTGFiZWwoZmluYWwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotICAgICAgICAvLyBEZXRhaWw6IFVudGlsIERvbnV0LCB0aGVyZSBpc24ndCBUWVBFX01PQklMRSBmb3IgZW1haWwgd2hpbGUgdGhlcmUgaXMgbm93LgotICAgICAgICAvLyAgICAgICAgIFRvIHN1cHBvcnQgbW9iaWxlIHR5cGUgYXQgdGhhdCB0aW1lLCB0aGlzIGN1c3RvbSBsYWJlbCBoYWQgYmVlbiB1c2VkLgotICAgICAgICByZXR1cm4gKCJfQVVUT19DRUxMIi5lcXVhbHMobGFiZWwpIHx8IHNNb2JpbGVQaG9uZUxhYmVsU2V0LmNvbnRhaW5zKGxhYmVsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJblYyMUJ1dFVua25vd25Ub0NvbnRhY3RzUGhvdGVUeXBlKGZpbmFsIFN0cmluZyBsYWJlbCkgewotICAgICAgICByZXR1cm4gc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5jb250YWlucyhsYWJlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lRm9ySW0oZmluYWwgaW50IHByb3RvY29sKSB7Ci0gICAgICAgIHJldHVybiBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MuZ2V0KHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNvcnROYW1lRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaXN0ID0gbmV3IFN0cmluZ1szXTsKLSAgICAgICAgZmluYWwgaW50IG5hbWVPcmRlclR5cGUgPSBWQ2FyZENvbmZpZy5nZXROYW1lT3JkZXJUeXBlKHZjYXJkVHlwZSk7Ci0gICAgICAgIHN3aXRjaCAobmFtZU9yZGVyVHlwZSkgewotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5OQU1FX09SREVSX0pBUEFORVNFOiB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc09ubHlQcmludGFibGVBc2NpaShnaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaXN0WzBdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsxXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5OQU1FX09SREVSX0VVUk9QRTogewotICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsyXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgbGlzdFswXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzFdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQaG9uZU51bWJlckZvcm1hdChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc0phcGFuZXNlRGV2aWNlKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5zZXJ0cyBwb3N0YWwgZGF0YSBpbnRvIHRoZSBidWlsZGVyIG9iamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBDb250YWN0c0NvbnRyYWN0IGlzIGRpZmZlcmVudCBmcm9tIHRoYXQgZGVmaW5lZCBpbiB2Q2FyZC4KLSAgICAgKiBTbyBzb21lIGNvbnZlcnNpb24gbWF5IGJlIHBlcmZvcm1lZCBpbiB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFN0cnVjdHVyZWRQb3N0YWxEYXRhVXNpbmdDb250YWN0c1N0cnVjdChpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkRW50cnkuUG9zdGFsRGF0YSBwb3N0YWxEYXRhKSB7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkUG9zdGFsLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBwb3N0YWxEYXRhLnR5cGUpOwotICAgICAgICBpZiAocG9zdGFsRGF0YS50eXBlID09IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsIHBvc3RhbERhdGEubGFiZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHN0cmVldFN0cmluZzsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuc3RyZWV0KSkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuc3RyZWV0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLnN0cmVldCArICIgIiArIHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsIHBvc3RhbERhdGEucG9ib3gpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgc3RyZWV0U3RyaW5nKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCBwb3N0YWxEYXRhLmxvY2FsdHkpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgcG9zdGFsRGF0YS5yZWdpb24pOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCBwb3N0YWxEYXRhLnBvc3RhbENvZGUpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksIHBvc3RhbERhdGEuY291bnRyeSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICBwb3N0YWxEYXRhLmdldEZvcm1hdHRlZEFkZHJlc3ModmNhcmRUeXBlKSk7Ci0gICAgICAgIGlmIChwb3N0YWxEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICByZXR1cm4gY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBTdHJpbmcgc3VmZml4KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVMaXN0ID0gc29ydE5hbWVFbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHByZWZpeCkpIHsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG5hbWVQYXJ0IDogbmFtZUxpc3QpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmFtZVBhcnQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmFtZVBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSkgewotICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzdWZmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BsaXRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIHBpZWNlcyB1c2luZyB0aGUgZGVsaW1pdGVyICc7JyBpbnNpZGUgaXQuCi0gICAgICoKLSAgICAgKiBFc2NhcGVkIGNoYXJhY3RlcnMgaW4gdGhvc2UgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IHVuZXNjYXBlZCBpbnRvIG9yaWdpbmFsIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gY29uc3RydWN0TGlzdEZyb21WYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1bmVzY2FwZWRTdHJpbmc7Ci0gICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkU3RyaW5nID0gVkNhcmRQYXJzZXJJbXBsX1Y0MC51bmVzY2FwZUNoYXJhY3RlcihuZXh0Q2gpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcgPSBWQ2FyZFBhcnNlckltcGxfVjMwLnVuZXNjYXBlQ2hhcmFjdGVyKG5leHRDaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIHZDYXJkIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVbmtub3duIHZDYXJkIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcgPSBWQ2FyZFBhcnNlckltcGxfVjIxLnVuZXNjYXBlQ2hhcmFjdGVyKG5leHRDaCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHVuZXNjYXBlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzUHJpbnRhYmxlQXNjaWlPbmx5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNoZWNraW5nIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGVuY29kZWQgaW50byBxdW90ZWQtcHJpbnRhYmxlCi0gICAgICogb3Igbm90LCB3aGljaCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiAiN2JpdCIgaW4gdkNhcmQgMi4xIHNwZWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUZpcnN0ID0gMHgyMDsKLSAgICAgICAgZmluYWwgaW50IGFzY2lpTGFzdCA9IDB4N0U7ICAvLyBpbmNsdWRlZAotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB2YWx1ZS5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYyA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgICAgIGlmICghKGFzY2lpRmlyc3QgPD0gYyAmJiBjIDw9IGFzY2lpTGFzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q2hhcmFjdGVyPiBzVW5BY2NlcHRhYmxlQXNjaWlJblYyMVdvcmRTZXQgPQotICAgICAgICBuZXcgSGFzaFNldDxDaGFyYWN0ZXI+KEFycmF5cy5hc0xpc3QoJ1snLCAnXScsICc9JywgJzonLCAnLicsICcsJywgJyAnKSk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCBzaW5jZSB2Q2FyZCAzLjAgb2Z0ZW4gcmVxdWlyZXMgdGhlICgiWC0iKSBwcm9wZXJ0aWVzIGFuZCBncm91cHMKLSAgICAgKiBzaG91bGQgY29udGFpbiBvbmx5IGFscGhhYmV0cywgZGlnaXRzLCBhbmQgaHlwaGVuLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4gCi0gICAgICogTm90ZTogSXQgaXMgYWxyZWFkeSBrbm93biBzb21lIGRldmljZXMgKHdyb25nbHkpIG91dHB1dHMgcHJvcGVydGllcyB3aXRoIGNoYXJhY3RlcnMKLSAgICAgKiAgICAgICB3aGljaCBzaG91bGQgbm90IGJlIGluIHRoZSBmaWVsZC4gT25lIGV4YW1wbGUgaXMgIlgtR09PR0xFIFRBTEsiLiBXZSBhY2NlcHQKLSAgICAgKiAgICAgICBzdWNoIGtpbmQgb2YgaW5wdXQgYnV0IG11c3QgbmV2ZXIgb3V0cHV0IGl0IHVubGVzcyB0aGUgdGFyZ2V0IGlzIHZlcnkgc3BlY2lmaWMKLSAgICAgKiAgICAgICB0byB0aGUgZGV2aWNlIHdoaWNoIGlzIGFibGUgdG8gcGFyc2UgdGhlIG1hbGZvcm1lZCBpbnB1dC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHVwcGVyQWxwaGFiZXRGaXJzdCA9IDB4NDE7ICAvLyBBCi0gICAgICAgIGZpbmFsIGludCB1cHBlckFscGhhYmV0QWZ0ZXJMYXN0ID0gMHg1YjsgIC8vIFsKLSAgICAgICAgZmluYWwgaW50IGxvd2VyQWxwaGFiZXRGaXJzdCA9IDB4NjE7ICAvLyBhCi0gICAgICAgIGZpbmFsIGludCBsb3dlckFscGhhYmV0QWZ0ZXJMYXN0ID0gMHg3YjsgIC8vIHsKLSAgICAgICAgZmluYWwgaW50IGRpZ2l0Rmlyc3QgPSAweDMwOyAgLy8gMAotICAgICAgICBmaW5hbCBpbnQgZGlnaXRBZnRlckxhc3QgPSAweDNBOyAgLy8gOgotICAgICAgICBmaW5hbCBpbnQgaHlwaGVuID0gJy0nOwotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBzdHIgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzdHIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSBzdHIub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGVwb2ludCA9IHN0ci5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoISgobG93ZXJBbHBoYWJldEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCBsb3dlckFscGhhYmV0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAodXBwZXJBbHBoYWJldEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCB1cHBlckFscGhhYmV0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAoZGlnaXRGaXJzdCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDwgZGlnaXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjb2RlcG9pbnQgPT0gaHlwaGVuKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5V2hpdGVTcGFjZXMoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seVdoaXRlU3BhY2VzKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVdoaXRlU3BhY2VzKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBzdHIgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzdHIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSBzdHIub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHN0ci5jb2RlUG9pbnRBdChpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZ2l2ZW4gU3RyaW5nIGlzIGNhdGVnb3JpemVkIGFzICJ3b3JkIiBzcGVjaWZpZWQgaW4gdkNhcmQgc3BlYyAyLjEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpZXM6PGJyIC8+Ci0gICAgICogd29yZCA9ICZsdDthbnkgcHJpbnRhYmxlIDdiaXQgdXMtYXNjaWkgZXhjZXB0IFtdPTouLCAmZ3Q7Ci0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1YyMVdvcmQoZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUZpcnN0ID0gMHgyMDsKLSAgICAgICAgZmluYWwgaW50IGFzY2lpTGFzdCA9IDB4N0U7ICAvLyBpbmNsdWRlZAotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gdmFsdWUub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYyA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgaWYgKCEoYXNjaWlGaXJzdCA8PSBjICYmIGMgPD0gYXNjaWlMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICBzVW5BY2NlcHRhYmxlQXNjaWlJblYyMVdvcmRTZXQuY29udGFpbnMoKGNoYXIpYykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc0VzY2FwZUluZGljYXRvcnNWMzAgPSBuZXcgaW50W117Ci0gICAgICAgICc6JywgJzsnLCAnLCcsICcgJwotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzRXNjYXBlSW5kaWNhdG9yc1Y0MCA9IG5ldyBpbnRbXXsKLSAgICAgICAgJzsnLCAnOicKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogUmV0dXJucyBTdHJpbmcgYXZhaWxhYmxlIGFzIHBhcmFtZXRlciB2YWx1ZSBpbiB2Q2FyZCAzLjAuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFJGQyAyNDI2IHJlcXVpcmVzIHZDYXJkIGNvbXBvc2VyIHRvIHF1b3RlIHBhcmFtZXRlciB2YWx1ZXMgd2hlbiBpdCBjb250YWlucwotICAgICAqIHNlbWktY29sb24sIGZvciBleGFtcGxlIChTZWUgUkZDIDI0MjYgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBTdHJpbmcgY2FuIGJlIHVzZWQgd2l0aG91dCBxdW90ZXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdGU6IFdlIHJlbW92ZSBEUVVPVEUgaW5zaWRlIHRoZSBnaXZlbiB2YWx1ZSBzaWxlbnRseSBmb3Igbm93LgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nQXNQYXJhbVZhbHVlKHZhbHVlLCBzRXNjYXBlSW5kaWNhdG9yc1YzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdBc1Y0MFBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB0b1N0cmluZ0FzUGFyYW1WYWx1ZSh2YWx1ZSwgc0VzY2FwZUluZGljYXRvcnNWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZ0FzUGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUsIGZpbmFsIGludFtdIGVzY2FwZUluZGljYXRvcnMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgYXNjaWlGaXJzdCA9IDB4MjA7Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUxhc3QgPSAweDdFOyAgLy8gaW5jbHVkZWQKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICBib29sZWFuIG5lZWRRdW90ZSA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHZhbHVlLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvZGVQb2ludCA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8IGFzY2lpRmlyc3QgfHwgY29kZVBvaW50ID09ICciJykgewotICAgICAgICAgICAgICAgIC8vIENUTCBjaGFyYWN0ZXJzIGFuZCBEUVVPVEUgYXJlIG5ldmVyIGFjY2VwdGVkLiBSZW1vdmUgdGhlbS4KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kQ29kZVBvaW50KGNvZGVQb2ludCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpbmRpY2F0b3IgOiBlc2NhcGVJbmRpY2F0b3JzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PSBpbmRpY2F0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZFF1b3RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuICgocmVzdWx0LmlzRW1wdHkoKSB8fCBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVdoaXRlU3BhY2VzKHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgIDogKG5lZWRRdW90ZSA/ICgnIicgKyByZXN1bHQgKyAnIicpCi0gICAgICAgICAgICAgICAgOiByZXN1bHQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0hhbGZXaWR0aFN0cmluZyhmaW5hbCBTdHJpbmcgb3JnU3RyaW5nKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShvcmdTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gb3JnU3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IG9yZ1N0cmluZy5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIC8vIEFsbCBKYXBhbmVzZSBjaGFyYWN0ZXIgaXMgYWJsZSB0byBiZSBleHByZXNzZWQgYnkgY2hhci4KLSAgICAgICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIHVzZSBTdHJpbmcjY29kZXBQb2ludEF0KCkuCi0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gb3JnU3RyaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYWxmV2lkdGhUZXh0ID0gSmFwYW5lc2VVdGlscy50cnlHZXRIYWxmV2lkdGhUZXh0KGNoKTsKLSAgICAgICAgICAgIGlmIChoYWxmV2lkdGhUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChoYWxmV2lkdGhUZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3Vlc3NlcyB0aGUgZm9ybWF0IG9mIGlucHV0IGltYWdlLiBDdXJyZW50bHkganVzdCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGFyZSB1c2VkLgotICAgICAqIFRoZSB0eXBlICJHSUYiLCAiUE5HIiwgb3IgIkpQRUciIGlzIHJldHVybmVkIHdoZW4gcG9zc2libGUuIFJldHVybnMgbnVsbCB3aGVuCi0gICAgICogdGhlIGd1ZXNzIGZhaWxlZC4KLSAgICAgKiBAcGFyYW0gaW5wdXQgSW1hZ2UgYXMgYnl0ZSBhcnJheS4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbWFnZSB0eXBlIG9yIG51bGwgd2hlbiB0aGUgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0ltYWdlVHlwZShmaW5hbCBieXRlW10gaW5wdXQpIHsKLSAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC5sZW5ndGggPj0gMyAmJiBpbnB1dFswXSA9PSAnRycgJiYgaW5wdXRbMV0gPT0gJ0knICYmIGlucHV0WzJdID09ICdGJykgewotICAgICAgICAgICAgcmV0dXJuICJHSUYiOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSA0ICYmIGlucHV0WzBdID09IChieXRlKSAweDg5Ci0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gJ1AnICYmIGlucHV0WzJdID09ICdOJyAmJiBpbnB1dFszXSA9PSAnRycpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDIuMSBvZmZpY2lhbGx5IGRvZXMgbm90IHN1cHBvcnQgUE5HLCBidXQgd2UgbWF5IGhhdmUgaXQgYW5kCi0gICAgICAgICAgICAvLyAgICAgICB1c2luZyBYLSB3b3JkIGxpa2UgIlgtUE5HIiBtYXkgbm90IGxldCBpbXBvcnRlcnMga25vdyBpdCBpcyBQTkcuCi0gICAgICAgICAgICAvLyAgICAgICBTbyB3ZSB1c2UgdGhlIFN0cmluZyAiUE5HIiBhcyBpcy4uLgotICAgICAgICAgICAgcmV0dXJuICJQTkciOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSAyICYmIGlucHV0WzBdID09IChieXRlKSAweGZmCi0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gKGJ5dGUpIDB4ZDgpIHsKLSAgICAgICAgICAgIHJldHVybiAiSlBFRyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVHJ1ZSB3aGVuIGFsbCB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSBudWxsIG9yIGVtcHR5IFN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFyZUFsbEVtcHR5KGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vLy8gVGhlIG1ldGhvZHMgYmVsbG93IG1heSBiZSB1c2VkIGJ5IHVuaXQgdGVzdC4KLQotICAgIC8qKgotICAgICAqIFVucXVvdGVzIGdpdmVuIFF1b3RlZC1QcmludGFibGUgdmFsdWUuIHZhbHVlIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VRdW90ZWRQcmludGFibGUoCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFraW5nLAotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUNoYXJzZXQsIFN0cmluZyB0YXJnZXRDaGFyc2V0KSB7Ci0gICAgICAgIC8vICI9ICIgLT4gIiAiLCAiPVx0IiAtPiAiXHQiLgotICAgICAgICAvLyBQcmV2aW91cyBjb2RlIGhhZCBkb25lIHRoaXMgcmVwbGFjZW1lbnQuIEtlZXAgb24gdGhlIHNhZmUgc2lkZS4KLSAgICAgICAgZmluYWwgU3RyaW5nIHF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICcgJyB8fCBuZXh0Q2ggPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dENoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHF1b3RlZFByaW50YWJsZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGxpbmVzOwotICAgICAgICBpZiAoc3RyaWN0TGluZUJyZWFraW5nKSB7Ci0gICAgICAgICAgICBsaW5lcyA9IHF1b3RlZFByaW50YWJsZS5zcGxpdCgiXHJcbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBxdW90ZWRQcmludGFibGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhc3RMaW5lID0gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKGxhc3RMaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGxhc3RMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbmVzID0gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1N0cmluZyA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd1N0cmluZykpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJHaXZlbiByYXcgc3RyaW5nIGlzIGVtcHR5LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJhd0J5dGVzID0gcmF3U3RyaW5nLmdldEJ5dGVzKHNvdXJjZUNoYXJzZXQpOyAKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRmFpbGVkIHRvIGRlY29kZTogIiArIHNvdXJjZUNoYXJzZXQpOwotICAgICAgICAgICAgcmF3Qnl0ZXMgPSByYXdTdHJpbmcuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSBkZWNvZGVkQnl0ZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVjb2RlZEJ5dGVzID0gUXVvdGVkUHJpbnRhYmxlQ29kZWMuZGVjb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0J5dGVzKTsKLSAgICAgICAgfSBjYXRjaCAoRGVjb2RlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRGVjb2RlckV4Y2VwdGlvbiBpcyB0aHJvd24uIik7Ci0gICAgICAgICAgICBkZWNvZGVkQnl0ZXMgPSByYXdCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkZWNvZGVkQnl0ZXMsIHRhcmdldENoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRlY29kZWRCeXRlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZDYXJkUGFyc2VyIGdldEFwcHJvcHJpYXRlUGFyc2VyKGludCB2Y2FyZFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBWQ2FyZFBhcnNlcl9WMjEoKTsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZDYXJkUGFyc2VyX1YzMCgpOwotICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVkNhcmRQYXJzZXJfVjQwKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlZlcnNpb24gaXMgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29udmVydFN0cmluZ0NoYXJzZXQoCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIFN0cmluZyBzb3VyY2VDaGFyc2V0LCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCkgewotICAgICAgICBpZiAoc291cmNlQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKHNvdXJjZUNoYXJzZXQpOwotICAgICAgICBmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB1dGlsaXRpZXMgZm9yIHZDYXJkIDQuMDogZGF0ZXRpbWUsIHRpbWVzdGFtcCwgaW50ZWdlciwgZmxvYXQsIGFuZCBib29sZWFuCi0KLSAgICBwcml2YXRlIFZDYXJkVXRpbHMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyYzdkZi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1NzIxOS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVkNhcmRFeGNlcHRpb24gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFZDYXJkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBWQ2FyZEV4Y2VwdGlvbiBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RiNjJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiB0aGUgdkNhcmQgaGFzIHNvbWUgbGluZSBzdGFydGluZyB3aXRoICcjJy4gSW4gdGhlIHNwZWNpZmljYXRpb24sCi0gKiBib3RoIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IHN1Y2ggbGluZSwgYnV0IHNvbWUgYWN0dWFsIGV4cG9ydGVyIGVtaXQKLSAqIHN1Y2ggbGluZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwNTg0Yi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVGhyb3duIHdoZW4gdGhlIHZDYXJkIGhhcyBzb21lIGxpbmUgc3RhcnRpbmcgd2l0aCAnIycuIEluIHRoZSBzcGVjaWZpY2F0aW9uLAotICogYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBzdWNoIGxpbmUsIGJ1dCBzb21lIGFjdHVhbCBleHBvcnRlciBlbWl0Ci0gKiBzdWNoIGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2MyZmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHRocm93biB3aGVuIFZDYXJkIGlzIG5lc3RlZCB3aXRob3V0IFZDYXJkUGFyc2VyJ3MgYmVpbmcgbm90aWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmROZXN0ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmFhNzc2My4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBleGNlcHRpb24gd2hpY2ggdGVsbHMgdGhhdCB0aGUgaW5wdXQgVkNhcmQgaXMgcHJvYmFibHkgdmFsaWQgZnJvbSB0aGUgdmlldyBvZgotICogc3BlY2lmaWNhdGlvbiBidXQgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBmcmFtZXdvcmsgZm9yIG5vdy4KLSAqIAotICogVGhpcyBpcyBhIGtpbmQgb2YgYSBnb29kIG5ld3MgZnJvbSB0aGUgdmlldyBvZiBkZXZlbG9wbWVudC4KLSAqIEl0IG1heSBiZSBnb29kIHRvIGFzayB1c2VycyB0byBzZW5kIGEgcmVwb3J0IHdpdGggdGhlIFZDYXJkIGV4YW1wbGUKLSAqIGZvciB0aGUgZnV0dXJlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzA5ZmU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHVzZWQgb25seSB3aGVuIHRoZSB2ZXJzaW9uIG9mIHRoZSB2Q2FyZCBpcyBkaWZmZXJlbnQuIAotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRWZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLXtAaGlkZX0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08SFRNTD4KLTxCT0RZPgote0BoaWRlfQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNTU1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB7QGxpbmsgUHJlZmVyZW5jZX0gdGhhdCBkaXNwbGF5cyBhIGxpc3Qgb2YgZW50cmllcyBhcworICogYSBkaWFsb2cuCisgKiA8cD4KKyAqIFRoaXMgcHJlZmVyZW5jZSB3aWxsIHN0b3JlIGEgc2V0IG9mIHN0cmluZ3MgaW50byB0aGUgU2hhcmVkUHJlZmVyZW5jZXMuCisgKiBUaGlzIHNldCB3aWxsIGNvbnRhaW4gb25lIG9yIG1vcmUgdmFsdWVzIGZyb20gdGhlCisgKiB7QGxpbmsgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKX0gYXJyYXkuCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cmllcworICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyeVZhbHVlcworICovCitwdWJsaWMgY2xhc3MgTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSBleHRlbmRzIERpYWxvZ1ByZWZlcmVuY2UgeworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlW10gbUVudHJpZXM7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2VbXSBtRW50cnlWYWx1ZXM7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtVmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbU5ld1ZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByZWZlcmVuY2VDaGFuZ2VkOworICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLCAwLCAwKTsKKyAgICAgICAgbUVudHJpZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJpZXMpOworICAgICAgICBtRW50cnlWYWx1ZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJ5VmFsdWVzKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBodW1hbi1yZWFkYWJsZSBlbnRyaWVzIHRvIGJlIHNob3duIGluIHRoZSBsaXN0LiBUaGlzIHdpbGwgYmUKKyAgICAgKiBzaG93biBpbiBzdWJzZXF1ZW50IGRpYWxvZ3MuCisgICAgICogPHA+CisgICAgICogRWFjaCBlbnRyeSBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGluZGV4IGluCisgICAgICoge0BsaW5rICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbnRyaWVzIFRoZSBlbnRyaWVzLgorICAgICAqIEBzZWUgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoQ2hhclNlcXVlbmNlW10gZW50cmllcykgeworICAgICAgICBtRW50cmllcyA9IGVudHJpZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgI3NldEVudHJpZXMoQ2hhclNlcXVlbmNlW10pCisgICAgICogQHBhcmFtIGVudHJpZXNSZXNJZCBUaGUgZW50cmllcyBhcnJheSBhcyBhIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoaW50IGVudHJpZXNSZXNJZCkgeworICAgICAgICBzZXRFbnRyaWVzKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0QXJyYXkoZW50cmllc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIGVudHJpZXMgdG8gYmUgc2hvd24gaW4gdGhlIGxpc3QgaW4gc3Vic2VxdWVudCBkaWFsb2dzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGxpc3QgYXMgYW4gYXJyYXkuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZVtdIGdldEVudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBtRW50cmllczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgKiBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIG9uIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgKiBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGVudHJ5VmFsdWVzIFRoZSBhcnJheSB0byBiZSB1c2VkIGFzIHZhbHVlcyB0byBzYXZlIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSBlbnRyeVZhbHVlcykgeworICAgICAgICBtRW50cnlWYWx1ZXMgPSBlbnRyeVZhbHVlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSkKKyAgICAgKiBAcGFyYW0gZW50cnlWYWx1ZXNSZXNJZCBUaGUgZW50cnkgdmFsdWVzIGFycmF5IGFzIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cnlWYWx1ZXMoaW50IGVudHJ5VmFsdWVzUmVzSWQpIHsKKyAgICAgICAgc2V0RW50cnlWYWx1ZXMoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFRleHRBcnJheShlbnRyeVZhbHVlc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHZhbHVlcyB0byBiZSBzYXZlZCBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2YgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2VbXSBnZXRFbnRyeVZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyeVZhbHVlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGtleS4gVGhpcyBzaG91bGQgY29udGFpbiBlbnRyaWVzIGluCisgICAgICoge0BsaW5rICNnZXRFbnRyeVZhbHVlcygpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gc2V0IGZvciB0aGUga2V5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgbVZhbHVlcyA9IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHBlcnNpc3RTdHJpbmdTZXQodmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBrZXkuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiB2YWx1ZSAoaW4gdGhlIGVudHJ5IHZhbHVlcyBhcnJheSkuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB3aG9zZSBpbmRleCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIHZhbHVlLCBvciAtMSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIGludCBmaW5kSW5kZXhPZlZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBtRW50cnlWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1FbnRyeVZhbHVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGlmIChtRW50cnlWYWx1ZXNbaV0uZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblByZXBhcmVEaWFsb2dCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICBzdXBlci5vblByZXBhcmVEaWFsb2dCdWlsZGVyKGJ1aWxkZXIpOworICAgICAgICAKKyAgICAgICAgaWYgKG1FbnRyaWVzID09IG51bGwgfHwgbUVudHJ5VmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIHJlcXVpcmVzIGFuIGVudHJpZXMgYXJyYXkgYW5kICIgKworICAgICAgICAgICAgICAgICAgICAiYW4gZW50cnlWYWx1ZXMgYXJyYXkuIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW5bXSBjaGVja2VkSXRlbXMgPSBnZXRTZWxlY3RlZEl0ZW1zKCk7CisgICAgICAgIGJ1aWxkZXIuc2V0TXVsdGlDaG9pY2VJdGVtcyhtRW50cmllcywgY2hlY2tlZEl0ZW1zLAorICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25NdWx0aUNob2ljZUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoLCBib29sZWFuIGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLmFkZChtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLnJlbW92ZShtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgbU5ld1ZhbHVlcy5jbGVhcigpOworICAgICAgICBtTmV3VmFsdWVzLmFkZEFsbChtVmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuW10gZ2V0U2VsZWN0ZWRJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlW10gZW50cmllcyA9IG1FbnRyaWVzOworICAgICAgICBmaW5hbCBpbnQgZW50cnlDb3VudCA9IGVudHJpZXMubGVuZ3RoOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB2YWx1ZXMgPSBtVmFsdWVzOworICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bZW50cnlDb3VudF07CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5Q291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gdmFsdWVzLmNvbnRhaW5zKGVudHJpZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGlhbG9nQ2xvc2VkKGJvb2xlYW4gcG9zaXRpdmVSZXN1bHQpIHsKKyAgICAgICAgc3VwZXIub25EaWFsb2dDbG9zZWQocG9zaXRpdmVSZXN1bHQpOworICAgICAgICAKKyAgICAgICAgaWYgKHBvc2l0aXZlUmVzdWx0ICYmIG1QcmVmZXJlbmNlQ2hhbmdlZCkgeworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gdmFsdWVzID0gbU5ld1ZhbHVlczsKKyAgICAgICAgICAgIGlmIChjYWxsQ2hhbmdlTGlzdGVuZXIodmFsdWVzKSkgeworICAgICAgICAgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKFR5cGVkQXJyYXkgYSwgaW50IGluZGV4KSB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZVtdIGRlZmF1bHRWYWx1ZXMgPSBhLmdldFRleHRBcnJheShpbmRleCk7CisgICAgICAgIGZpbmFsIGludCB2YWx1ZUNvdW50ID0gZGVmYXVsdFZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKGRlZmF1bHRWYWx1ZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2V0SW5pdGlhbFZhbHVlKGJvb2xlYW4gcmVzdG9yZVZhbHVlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHNldFZhbHVlcyhyZXN0b3JlVmFsdWUgPyBnZXRQZXJzaXN0ZWRTdHJpbmdTZXQobVZhbHVlcykgOiAoU2V0PFN0cmluZz4pIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CisgICAgICAgIGZpbmFsIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgaWYgKGlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNhdmUgaW5zdGFuY2Ugc3RhdGUKKyAgICAgICAgICAgIHJldHVybiBzdXBlclN0YXRlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaW5hbCBTYXZlZFN0YXRlIG15U3RhdGUgPSBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlKTsKKyAgICAgICAgbXlTdGF0ZS52YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKKyAgICAgICAgcmV0dXJuIG15U3RhdGU7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIFNldDxTdHJpbmc+IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gc291cmNlLnJlYWRTdHJpbmdBcnJheSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RyaW5nQ291bnQgPSBzdHJpbmdzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoc3RyaW5nc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoc3VwZXJTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZ0FycmF5KHZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCmluZGV4IGRkZTY0OTMuLjE3YjJlODIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCkBAIC0xNiw4ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkNoYXJTZXF1ZW5jZXM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMjgsNyArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5DaGFyU2VxdWVuY2VzOwogaW1wb3J0IGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTM2LDYgKzM0LDEwIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKgogICogUmVwcmVzZW50cyB0aGUgYmFzaWMgUHJlZmVyZW5jZSBVSSBidWlsZGluZwogICogYmxvY2sgZGlzcGxheWVkIGJ5IGEge0BsaW5rIFByZWZlcmVuY2VBY3Rpdml0eX0gaW4gdGhlIGZvcm0gb2YgYQpAQCAtNTQsNiArNTYsNyBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV90aXRsZQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9zdW1tYXJ5CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX29yZGVyCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2ZyYWdtZW50CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2xheW91dAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV93aWRnZXRMYXlvdXQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VfZW5hYmxlZApAQCAtODYsNiArODksOCBAQAogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdW1tYXJ5OwogICAgIHByaXZhdGUgU3RyaW5nIG1LZXk7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIFN0cmluZyBtRnJhZ21lbnQ7CisgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZWN0YWJsZSA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXF1aXJlc0tleTsKQEAgLTIwOCw2ICsyMTMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbU9yZGVyID0gYS5nZXRJbnQoYXR0ciwgbU9yZGVyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VfZnJhZ21lbnQ6CisgICAgICAgICAgICAgICAgICAgIG1GcmFnbWVudCA9IGEuZ2V0U3RyaW5nKGF0dHIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZV9sYXlvdXQ6CiAgICAgICAgICAgICAgICAgICAgIG1MYXlvdXRSZXNJZCA9IGEuZ2V0UmVzb3VyY2VJZChhdHRyLCBtTGF5b3V0UmVzSWQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTMxMyw2ICszMjIsNDQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGFzcyBuYW1lIG9mIGEgZnJhZ21lbnQgdG8gYmUgc2hvd24gd2hlbiB0aGlzIFByZWZlcmVuY2UgaXMgY2xpY2tlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgZnJhZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcmFnbWVudChTdHJpbmcgZnJhZ21lbnQpIHsKKyAgICAgICAgbUZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmcmFnbWVudCBjbGFzcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBjbGFzcyBuYW1lIGxhc3Qgc2V0IHZpYSB7QGxpbmsgI3NldEZyYWdtZW50fSBvciBYTUwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGcmFnbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dHJhcyBCdW5kbGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZlcmVuY2UsIGNyZWF0aW5nCisgICAgICogYSBuZXcgQnVuZGxlIGlmIHRoZXJlIGN1cnJlbnRseSBpc24ndCBvbmUuICBZb3UgY2FuIHVzZSB0aGlzIHRvIGdldCBhbmQKKyAgICAgKiBzZXQgaW5kaXZpZHVhbCBleHRyYSBrZXkvdmFsdWUgcGFpcnMuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIGlmIChtRXh0cmFzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleHRyYXMgQnVuZGxlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcmVmZXJlbmNlLAorICAgICAqIHJldHVybmluZyBudWxsIGlmIHRoZXJlIGlzIG5vdCBjdXJyZW50bHkgb25lLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgcGVla0V4dHJhcygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbGF5b3V0IHJlc291cmNlIHRoYXQgaXMgaW5mbGF0ZWQgYXMgdGhlIHtAbGluayBWaWV3fSB0byBiZSBzaG93bgogICAgICAqIGZvciB0aGlzIFByZWZlcmVuY2UuIEluIG1vc3QgY2FzZXMsIHRoZSBkZWZhdWx0IGxheW91dCBpcyBzdWZmaWNpZW50IGZvcgogICAgICAqIGN1c3RvbSBQcmVmZXJlbmNlIG9iamVjdHMgYW5kIG9ubHkgdGhlIHdpZGdldCBsYXlvdXQgbmVlZHMgdG8gYmUgY2hhbmdlZC4KQEAgLTEyNTAsNiArMTI5Nyw2MSBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBwZXJzaXN0IGEgc2V0IG9mIFN0cmluZ3MgdG8gdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgd2lsbCBjaGVjayBpZiB0aGlzIFByZWZlcmVuY2UgaXMgcGVyc2lzdGVudCwgZ2V0IGFuIGVkaXRvciBmcm9tCisgICAgICogdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0sIHB1dCBpbiB0aGUgc3RyaW5ncywgYW5kIGNoZWNrIGlmIHdlIHNob3VsZCBjb21taXQgKGFuZAorICAgICAqIGNvbW1pdCBpZiBzbykuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIHBlcnNpc3QuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBQcmVmZXJlbmNlIGlzIHBlcnNpc3RlbnQuIChUaGlzIGlzIG5vdCB3aGV0aGVyIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgd2FzIHBlcnNpc3RlZCwgc2luY2Ugd2UgbWF5IG5vdCBuZWNlc3NhcmlseSBjb21taXQgaWYgdGhlcmUKKyAgICAgKiAgICAgICAgIHdpbGwgYmUgYSBiYXRjaCBjb21taXQgbGF0ZXIuKQorICAgICAqIEBzZWUgI2dldFBlcnNpc3RlZFN0cmluZyhTZXQpCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0U3RyaW5nU2V0KFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICBpZiAoc2hvdWxkUGVyc2lzdCgpKSB7CisgICAgICAgICAgICAvLyBTaG91bGRuJ3Qgc3RvcmUgbnVsbAorICAgICAgICAgICAgaWYgKHZhbHVlcy5lcXVhbHMoZ2V0UGVyc2lzdGVkU3RyaW5nU2V0KG51bGwpKSkgeworICAgICAgICAgICAgICAgIC8vIEl0J3MgYWxyZWFkeSB0aGVyZSwgc28gdGhlIHNhbWUgYXMgcGVyc2lzdGluZworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgZWRpdG9yID0gbVByZWZlcmVuY2VNYW5hZ2VyLmdldEVkaXRvcigpOworICAgICAgICAgICAgZWRpdG9yLnB1dFN0cmluZ1NldChtS2V5LCB2YWx1ZXMpOworICAgICAgICAgICAgdHJ5Q29tbWl0KGVkaXRvcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gZ2V0IGEgcGVyc2lzdGVkIHNldCBvZiBTdHJpbmdzIGZyb20gdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlc30uCisgICAgICogPHA+CisgICAgICogVGhpcyB3aWxsIGNoZWNrIGlmIHRoaXMgUHJlZmVyZW5jZSBpcyBwZXJzaXN0ZW50LCBnZXQgdGhlIFNoYXJlZFByZWZlcmVuY2VzCisgICAgICogZnJvbSB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSwgYW5kIGdldCB0aGUgdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtIGRlZmF1bHRSZXR1cm5WYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgZWl0aGVyIHRoZQorICAgICAqICAgICAgICAgICAgUHJlZmVyZW5jZSBpcyBub3QgcGVyc2lzdGVudCBvciB0aGUgUHJlZmVyZW5jZSBpcyBub3QgaW4gdGhlCisgICAgICogICAgICAgICAgICBzaGFyZWQgcHJlZmVyZW5jZXMuCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgZnJvbSB0aGUgU2hhcmVkUHJlZmVyZW5jZXMgb3IgdGhlIGRlZmF1bHQgcmV0dXJuCisgICAgICogICAgICAgICB2YWx1ZS4KKyAgICAgKiBAc2VlICNwZXJzaXN0U3RyaW5nU2V0KFNldCkKKyAgICAgKiAKKyAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBhcHByb3ZhbAorICAgICAqLworICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRQZXJzaXN0ZWRTdHJpbmdTZXQoU2V0PFN0cmluZz4gZGVmYXVsdFJldHVyblZhbHVlKSB7CisgICAgICAgIGlmICghc2hvdWxkUGVyc2lzdCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFJldHVyblZhbHVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFNoYXJlZFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nU2V0KG1LZXksIGRlZmF1bHRSZXR1cm5WYWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIEF0dGVtcHRzIHRvIHBlcnNpc3QgYW4gaW50IHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHBlcnNpc3QuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQppbmRleCA3MjY3OTNkLi5hNTliMmY4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKQEAgLTE2LDEzNSArMTYsNzc4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50QnJlYWRDcnVtYnM7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCi0gKiBTaG93cyBhIGhpZXJhcmNoeSBvZiB7QGxpbmsgUHJlZmVyZW5jZX0gb2JqZWN0cyBhcwotICogbGlzdHMsIHBvc3NpYmx5IHNwYW5uaW5nIG11bHRpcGxlIHNjcmVlbnMuIFRoZXNlIHByZWZlcmVuY2VzIHdpbGwKLSAqIGF1dG9tYXRpY2FsbHkgc2F2ZSB0byB7QGxpbmsgU2hhcmVkUHJlZmVyZW5jZXN9IGFzIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoCi0gKiB0aGVtLiBUbyByZXRyaWV2ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2hhcmVkUHJlZmVyZW5jZXN9IHRoYXQgdGhlCi0gKiBwcmVmZXJlbmNlIGhpZXJhcmNoeSBpbiB0aGlzIGFjdGl2aXR5IHdpbGwgdXNlLCBjYWxsCi0gKiB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXIjZ2V0RGVmYXVsdFNoYXJlZFByZWZlcmVuY2VzKGFuZHJvaWQuY29udGVudC5Db250ZXh0KX0KLSAqIHdpdGggYSBjb250ZXh0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhpcyBhY3Rpdml0eS4KLSAqIDxwPgotICogRnVydGhlcm1vcmUsIHRoZSBwcmVmZXJlbmNlcyBzaG93biB3aWxsIGZvbGxvdyB0aGUgdmlzdWFsIHN0eWxlIG9mIHN5c3RlbQotICogcHJlZmVyZW5jZXMuIEl0IGlzIGVhc3kgdG8gY3JlYXRlIGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzICh0aGF0IGNhbiBiZQotICogc2hvd24gb24gbXVsdGlwbGUgc2NyZWVucykgdmlhIFhNTC4gRm9yIHRoZXNlIHJlYXNvbnMsIGl0IGlzIHJlY29tbWVuZGVkIHRvCi0gKiB1c2UgdGhpcyBhY3Rpdml0eSAoYXMgYSBzdXBlcmNsYXNzKSB0byBkZWFsIHdpdGggcHJlZmVyZW5jZXMgaW4gYXBwbGljYXRpb25zLgotICogPHA+Ci0gKiBBIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBvYmplY3Qgc2hvdWxkIGJlIGF0IHRoZSB0b3Agb2YgdGhlIHByZWZlcmVuY2UKLSAqIGhpZXJhcmNoeS4gRnVydGhlcm1vcmUsIHN1YnNlcXVlbnQge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IGluIHRoZSBoaWVyYXJjaHkKLSAqIGRlbm90ZSBhIHNjcmVlbiBicmVhay0tdGhhdCBpcyB0aGUgcHJlZmVyZW5jZXMgY29udGFpbmVkIHdpdGhpbiBzdWJzZXF1ZW50Ci0gKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gc2hvdWxkIGJlIHNob3duIG9uIGFub3RoZXIgc2NyZWVuLiBUaGUgcHJlZmVyZW5jZQotICogZnJhbWV3b3JrIGhhbmRsZXMgc2hvd2luZyB0aGVzZSBvdGhlciBzY3JlZW5zIGZyb20gdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5LgotICogPHA+Ci0gKiBUaGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgY2FuIGJlIGZvcm1lZCBpbiBtdWx0aXBsZSB3YXlzOgotICogPGxpPiBGcm9tIGFuIFhNTCBmaWxlIHNwZWNpZnlpbmcgdGhlIGhpZXJhcmNoeQotICogPGxpPiBGcm9tIGRpZmZlcmVudCB7QGxpbmsgQWN0aXZpdHkgQWN0aXZpdGllc30gdGhhdCBlYWNoIHNwZWNpZnkgaXRzIG93bgotICogcHJlZmVyZW5jZXMgaW4gYW4gWE1MIGZpbGUgdmlhIHtAbGluayBBY3Rpdml0eX0gbWV0YS1kYXRhCi0gKiA8bGk+IEZyb20gYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0KLSAqIDxwPgotICogVG8gaW5mbGF0ZSBmcm9tIFhNTCwgdXNlIHRoZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCl9LiBUaGUKLSAqIHJvb3QgZWxlbWVudCBzaG91bGQgYmUgYSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uIFN1YnNlcXVlbnQgZWxlbWVudHMgY2FuIHBvaW50Ci0gKiB0byBhY3R1YWwge0BsaW5rIFByZWZlcmVuY2V9IHN1YmNsYXNzZXMuIEFzIG1lbnRpb25lZCBhYm92ZSwgc3Vic2VxdWVudAotICoge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IGluIHRoZSBoaWVyYXJjaHkgd2lsbCByZXN1bHQgaW4gdGhlIHNjcmVlbiBicmVhay4KLSAqIDxwPgotICogVG8gc3BlY2lmeSBhbiB7QGxpbmsgSW50ZW50fSB0byBxdWVyeSB7QGxpbmsgQWN0aXZpdHkgQWN0aXZpdGllc30gdGhhdCBlYWNoCi0gKiBoYXZlIHByZWZlcmVuY2VzLCB1c2Uge0BsaW5rICNhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnR9LiBFYWNoCi0gKiB7QGxpbmsgQWN0aXZpdHl9IGNhbiBzcGVjaWZ5IG1ldGEtZGF0YSBpbiB0aGUgbWFuaWZlc3QgKHZpYSB0aGUga2V5Ci0gKiB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXIjTUVUQURBVEFfS0VZX1BSRUZFUkVOQ0VTfSkgdGhhdCBwb2ludHMgdG8gYW4gWE1MCi0gKiByZXNvdXJjZS4gVGhlc2UgWE1MIHJlc291cmNlcyB3aWxsIGJlIGluZmxhdGVkIGludG8gYSBzaW5nbGUgcHJlZmVyZW5jZQotICogaGllcmFyY2h5IGFuZCBzaG93biBieSB0aGlzIGFjdGl2aXR5LgotICogPHA+Ci0gKiBUbyBzcGVjaWZ5IGFuIG9iamVjdCBoaWVyYXJjaHkgcm9vdGVkIHdpdGgge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LCB1c2UKLSAqIHtAbGluayAjc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuKX0uCi0gKiA8cD4KLSAqIEFzIGEgY29udmVuaWVuY2UsIHRoaXMgYWN0aXZpdHkgaW1wbGVtZW50cyBhIGNsaWNrIGxpc3RlbmVyIGZvciBhbnkKLSAqIHByZWZlcmVuY2UgaW4gdGhlIGN1cnJlbnQgaGllcmFyY2h5LCBzZWUKLSAqIHtAbGluayAjb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4sIFByZWZlcmVuY2UpfS4KLSAqIAotICogQHNlZSBQcmVmZXJlbmNlCi0gKiBAc2VlIFByZWZlcmVuY2VTY3JlZW4KKyAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFuIGFjdGl2aXR5IHRvIHNob3cgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXMKKyAqIHRvIHRoZSB1c2VyLiAgUHJpb3IgdG8ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgKiB0aGlzIGNsYXNzIG9ubHkgYWxsb3dlZCB0aGUgZGlzcGxheSBvZiBhIHNpbmdsZSBzZXQgb2YgcHJlZmVyZW5jZTsgdGhpcworICogZnVuY3Rpb25hbGl0eSBzaG91bGQgbm93IGJlIGZvdW5kIGluIHRoZSBuZXcge0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0KKyAqIGNsYXNzLiAgSWYgeW91IGFyZSB1c2luZyBQcmVmZXJlbmNlQWN0aXZpdHkgaW4gaXRzIG9sZCBtb2RlLCB0aGUgZG9jdW1lbnRhdGlvbgorICogdGhlcmUgYXBwbGllcyB0byB0aGUgZGVwcmVjYXRlZCBBUElzIGhlcmUuCisgKgorICogPHA+VGhpcyBhY3Rpdml0eSBzaG93cyBvbmUgb3IgbW9yZSBoZWFkZXJzIG9mIHByZWZlcmVuY2VzLCBlYWNoIG9mIHdpdGgKKyAqIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBQcmVmZXJlbmNlRnJhZ21lbnR9IHRvIGRpc3BsYXkgdGhlIHByZWZlcmVuY2VzCisgKiBvZiB0aGF0IGhlYWRlci4gIFRoZSBhY3R1YWwgbGF5b3V0IGFuZCBkaXNwbGF5IG9mIHRoZXNlIGFzc29jaWF0aW9ucyBjYW4KKyAqIGhvd2V2ZXIgdmFyeTsgY3VycmVudGx5IHRoZXJlIGFyZSB0d28gbWFqb3IgYXBwcm9hY2hlcyBpdCBtYXkgdGFrZToKKyAqCisgKiA8dWw+CisgKiA8bGk+T24gYSBzbWFsbCBzY3JlZW4gaXQgbWF5IGRpc3BsYXkgb25seSB0aGUgaGVhZGVycyBhcyBhIHNpbmdsZSBsaXN0CisgKiB3aGVuIGZpcnN0IGxhdW5jaGVkLiAgU2VsZWN0aW5nIG9uZSBvZiB0aGUgaGVhZGVyIGl0ZW1zIHdpbGwgcmUtbGF1bmNoCisgKiB0aGUgYWN0aXZpdHkgd2l0aCBpdCBvbmx5IHNob3dpbmcgdGhlIFByZWZlcmVuY2VGcmFnbWVudCBvZiB0aGF0IGhlYWRlci4KKyAqIDxsaT5PbiBhIGxhcmdlIHNjcmVlbiBpbiBtYXkgZGlzcGxheSBib3RoIHRoZSBoZWFkZXJzIGFuZCBjdXJyZW50CisgKiBQcmVmZXJlbmNlRnJhZ21lbnQgdG9nZXRoZXIgYXMgcGFuZXMuICBTZWxlY3RpbmcgYSBoZWFkZXIgaXRlbSBzd2l0Y2hlcworICogdG8gc2hvd2luZyB0aGUgY29ycmVjdCBQcmVmZXJlbmNlRnJhZ21lbnQgZm9yIHRoYXQgaXRlbS4KKyAqIDwvdWw+CisgKgorICogPHA+U3ViY2xhc3NlcyBvZiBQcmVmZXJlbmNlQWN0aXZpdHkgc2hvdWxkIGltcGxlbWVudAorICoge0BsaW5rICNvbkJ1aWxkSGVhZGVyc30gdG8gcG9wdWxhdGUgdGhlIGhlYWRlciBsaXN0IHdpdGggdGhlIGRlc2lyZWQKKyAqIGl0ZW1zLiAgRG9pbmcgdGhpcyBpbXBsaWNpdGx5IHN3aXRjaGVzIHRoZSBjbGFzcyBpbnRvIGl0cyBuZXcgImhlYWRlcnMKKyAqICsgZnJhZ21lbnRzIiBtb2RlIHJhdGhlciB0aGFuIHRoZSBvbGQgc3R5bGUgb2YganVzdCBzaG93aW5nIGEgc2luZ2xlCisgKiBwcmVmZXJlbmNlcyBsaXN0LgorICoKKyAqIDxhIG5hbWU9IlNhbXBsZUNvZGUiPjwvYT4KKyAqIDxoMz5TYW1wbGUgQ29kZTwvaDM+CisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzYW1wbGUgY29kZSBzaG93cyBhIHNpbXBsZSBwcmVmZXJlbmNlIGFjdGl2aXR5IHRoYXQKKyAqIGhhcyB0d28gZGlmZmVyZW50IHNldHMgb2YgcHJlZmVyZW5jZXMuICBUaGUgaW1wbGVtZW50YXRpb24sIGNvbnNpc3RpbmcKKyAqIG9mIHRoZSBhY3Rpdml0eSBpdHNlbGYgYXMgd2VsbCBhcyBpdHMgdHdvIHByZWZlcmVuY2UgZnJhZ21lbnRzIGlzOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlV2l0aEhlYWRlcnMuamF2YQorICogICAgICBhY3Rpdml0eX0KKyAqCisgKiA8cD5UaGUgcHJlZmVyZW5jZV9oZWFkZXJzIHJlc291cmNlIGRlc2NyaWJlcyB0aGUgaGVhZGVycyB0byBiZSBkaXNwbGF5ZWQKKyAqIGFuZCB0aGUgZnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiAgSXQgaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VfaGVhZGVycy54bWwgaGVhZGVyc30KKyAqCisgKiA8cD5UaGUgZmlyc3QgaGVhZGVyIGlzIHNob3duIGJ5IFByZWZzMUZyYWdtZW50LCB3aGljaCBwb3B1bGF0ZXMgaXRzZWxmCisgKiBmcm9tIHRoZSBmb2xsb3dpbmcgWE1MIHJlc291cmNlOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZnJhZ21lbnRlZF9wcmVmZXJlbmNlcy54bWwgcHJlZmVyZW5jZXN9CisgKgorICogPHA+Tm90ZSB0aGF0IHRoaXMgWE1MIHJlc291cmNlIGNvbnRhaW5zIGEgcHJlZmVyZW5jZSBzY3JlZW4gaG9sZGluZyBhbm90aGVyCisgKiBmcmFnbWVudCwgdGhlIFByZWZzMUZyYWdtZW50SW5uZXIgaW1wbGVtZW50ZWQgaGVyZS4gIFRoaXMgYWxsb3dzIHRoZSB1c2VyCisgKiB0byB0cmF2ZXJzZSBkb3duIGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzOyBwcmVzc2luZyBiYWNrIHdpbGwgcG9wIGVhY2gKKyAqIGZyYWdtZW50IG9mZiB0aGUgc3RhY2sgdG8gcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBwcmVmZXJlbmNlcy4KKyAqCisgKiA8cD5TZWUge0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0gZm9yIGluZm9ybWF0aW9uIG9uIGltcGxlbWVudGluZyB0aGUKKyAqIGZyYWdtZW50cyB0aGVtc2VsdmVzLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUFjdGl2aXR5IGV4dGVuZHMgTGlzdEFjdGl2aXR5IGltcGxlbWVudHMKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFU19UQUcgPSAiYW5kcm9pZDpwcmVmZXJlbmNlcyI7Ci0gICAgCisgICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLk9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyLAorICAgICAgICBQcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlByZWZlcmVuY2VBY3Rpdml0eSI7CisKKyAgICAvLyBDb25zdGFudHMgZm9yIHN0YXRlIHNhdmUvcmVzdG9yZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJTX1RBRyA9ICI6YW5kcm9pZDpoZWFkZXJzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSX0hFQURFUl9UQUcgPSAiOmFuZHJvaWQ6Y3VyX2hlYWRlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VTX1RBRyA9ICI6YW5kcm9pZDpwcmVmZXJlbmNlcyI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHN0YXJ0aW5nIHRoaXMgYWN0aXZpdHksIHRoZSBpbnZva2luZyBJbnRlbnQgY2FuIGNvbnRhaW4gdGhpcyBleHRyYQorICAgICAqIHN0cmluZyB0byBzcGVjaWZ5IHdoaWNoIGZyYWdtZW50IHNob3VsZCBiZSBpbml0aWFsbHkgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NIT1dfRlJBR01FTlQgPSAiOmFuZHJvaWQ6c2hvd19mcmFnbWVudCI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHN0YXJ0aW5nIHRoaXMgYWN0aXZpdHkgYW5kIHVzaW5nIHtAbGluayAjRVhUUkFfU0hPV19GUkFHTUVOVH0sCisgICAgICogdGhpcyBleHRyYSBjYW4gYWxzbyBiZSBzcGVjaWZ5IHRvIHN1cHBseSBhIEJ1bmRsZSBvZiBhcmd1bWVudHMgdG8gcGFzcworICAgICAqIHRvIHRoYXQgZnJhZ21lbnQgd2hlbiBpdCBpcyBpbnN0YW50aWF0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIGNyZWF0aW9uCisgICAgICogb2YgUHJlZmVyZW5jZUFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTID0gIjphbmRyb2lkOnNob3dfZnJhZ21lbnRfYXJncyI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHN0YXJ0aW5nIHRoaXMgYWN0aXZpdHksIHRoZSBpbnZva2luZyBJbnRlbnQgY2FuIGNvbnRhaW4gdGhpcyBleHRyYQorICAgICAqIGJvb2xlYW4gdGhhdCB0aGUgaGVhZGVyIGxpc3Qgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQuICBUaGlzIGlzIG1vc3Qgb2Z0ZW4KKyAgICAgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rICNFWFRSQV9TSE9XX0ZSQUdNRU5UfSB0byBsYXVuY2gKKyAgICAgKiB0aGUgYWN0aXZpdHkgdG8gZGlzcGxheSBhIHNwZWNpZmljIGZyYWdtZW50IHRoYXQgdGhlIHVzZXIgaGFzIG5hdmlnYXRlZAorICAgICAqIHRvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05PX0hFQURFUlMgPSAiOmFuZHJvaWQ6bm9faGVhZGVycyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS19TVEFDS19QUkVGUyA9ICI6YW5kcm9pZDpwcmVmcyI7CisKKyAgICAvLyBleHRyYXMgdGhhdCBhbGxvdyBhbnkgcHJlZmVyZW5jZSBhY3Rpdml0eSB0byBiZSBsYXVuY2hlZCBhcyBwYXJ0IG9mIGEgd2l6YXJkCisKKyAgICAvLyBzaG93IEJhY2sgYW5kIE5leHQgYnV0dG9ucz8gdGFrZXMgYm9vbGVhbiBwYXJhbWV0ZXIKKyAgICAvLyBCYWNrIHdpbGwgdGhlbiByZXR1cm4gUkVTVUxUX0NBTkNFTEVEIGFuZCBOZXh0IFJFU1VMVF9PSworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TSE9XX0JVVFRPTl9CQVIgPSAiZXh0cmFfcHJlZnNfc2hvd19idXR0b25fYmFyIjsKKworICAgIC8vIGFkZCBhIFNraXAgYnV0dG9uPworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TSE9XX1NLSVAgPSAiZXh0cmFfcHJlZnNfc2hvd19za2lwIjsKKworICAgIC8vIHNwZWNpZnkgY3VzdG9tIHRleHQgZm9yIHRoZSBCYWNrIG9yIE5leHQgYnV0dG9ucywgb3IgY2F1c2UgYSBidXR0b24gdG8gbm90IGFwcGVhcgorICAgIC8vIGF0IGFsbCBieSBzZXR0aW5nIGl0IHRvIG51bGwKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCA9ICJleHRyYV9wcmVmc19zZXRfbmV4dF90ZXh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0VUX0JBQ0tfVEVYVCA9ICJleHRyYV9wcmVmc19zZXRfYmFja190ZXh0IjsKKworICAgIC8vIC0tLSBTdGF0ZSBmb3IgbmV3IG1vZGUgd2hlbiBzaG93aW5nIGEgbGlzdCBvZiBoZWFkZXJzICsgcHJlZnMgZnJhZ21lbnQKKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEhlYWRlcj4gbUhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PEhlYWRlcj4oKTsKKworICAgIHByaXZhdGUgSGVhZGVyQWRhcHRlciBtQWRhcHRlcjsKKworICAgIHByaXZhdGUgRnJhbWVMYXlvdXQgbUxpc3RGb290ZXI7CisKKyAgICBwcml2YXRlIFZpZXcgbVByZWZzQ29udGFpbmVyOworCisgICAgcHJpdmF0ZSBGcmFnbWVudEJyZWFkQ3J1bWJzIG1GcmFnbWVudEJyZWFkQ3J1bWJzOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1TaW5nbGVQYW5lOworCisgICAgcHJpdmF0ZSBIZWFkZXIgbUN1ckhlYWRlcjsKKworICAgIC8vIC0tLSBTdGF0ZSBmb3Igb2xkIG1vZGUgd2hlbiBzaG93aW5nIGEgc2luZ2xlIHByZWZlcmVuY2UgbGlzdAorCiAgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7Ci0gICAgCisKICAgICBwcml2YXRlIEJ1bmRsZSBtU2F2ZWRJbnN0YW5jZVN0YXRlOwogCisgICAgLy8gLS0tIENvbW1vbiBzdGF0ZQorCisgICAgcHJpdmF0ZSBCdXR0b24gbU5leHRCdXR0b247CisKICAgICAvKioKICAgICAgKiBUaGUgc3RhcnRpbmcgcmVxdWVzdCBjb2RlIGdpdmVuIG91dCB0byBwcmVmZXJlbmNlIGZyYW1ld29yay4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUkVRVUVTVF9DT0RFID0gMTAwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0JJTkRfUFJFRkVSRU5DRVMgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQlVJTERfSEVBREVSUyA9IDI7CiAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSBNU0dfQklORF9QUkVGRVJFTkNFUzoKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19CSU5EX1BSRUZFUkVOQ0VTOiB7CiAgICAgICAgICAgICAgICAgICAgIGJpbmRQcmVmZXJlbmNlcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0JVSUxEX0hFQURFUlM6IHsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEhlYWRlcj4gb2xkSGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8SGVhZGVyPihtSGVhZGVycyk7CisgICAgICAgICAgICAgICAgICAgIG1IZWFkZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG9uQnVpbGRIZWFkZXJzKG1IZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbUFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG9uR2V0TmV3SGVhZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCAmJiBoZWFkZXIuZnJhZ21lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyIG1hcHBlZEhlYWRlciA9IGZpbmRCZXN0TWF0Y2hpbmdIZWFkZXIoaGVhZGVyLCBvbGRIZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRIZWFkZXIgPT0gbnVsbCB8fCBtQ3VySGVhZGVyICE9IG1hcHBlZEhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUN1ckhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgbWFwcGVkSGVhZGVyID0gZmluZEJlc3RNYXRjaGluZ0hlYWRlcihtQ3VySGVhZGVyLCBtSGVhZGVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVkSGVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEhlYWRlcihtYXBwZWRIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGVhZGVyQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxIZWFkZXI+IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGVhZGVyVmlld0hvbGRlciB7CisgICAgICAgICAgICBJbWFnZVZpZXcgaWNvbjsKKyAgICAgICAgICAgIFRleHRWaWV3IHRpdGxlOworICAgICAgICAgICAgVGV4dFZpZXcgc3VtbWFyeTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyOworCisgICAgICAgIHB1YmxpYyBIZWFkZXJBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxIZWFkZXI+IG9iamVjdHMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIG9iamVjdHMpOworICAgICAgICAgICAgbUluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgSGVhZGVyVmlld0hvbGRlciBob2xkZXI7CisgICAgICAgICAgICBWaWV3IHZpZXc7CisKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlldyA9IG1JbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfaGVhZGVyX2l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBob2xkZXIgPSBuZXcgSGVhZGVyVmlld0hvbGRlcigpOworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pY29uKTsKKyAgICAgICAgICAgICAgICBob2xkZXIudGl0bGUgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGl0bGUpOworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5ID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnN1bW1hcnkpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0VGFnKGhvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZpZXcgPSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBob2xkZXIgPSAoSGVhZGVyVmlld0hvbGRlcikgdmlldy5nZXRUYWcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWxsIHZpZXcgZmllbGRzIG11c3QgYmUgdXBkYXRlZCBldmVyeSB0aW1lLCBiZWNhdXNlIHRoZSB2aWV3IG1heSBiZSByZWN5Y2xlZCAKKyAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBnZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGhvbGRlci5pY29uLnNldEltYWdlUmVzb3VyY2UoaGVhZGVyLmljb25SZXMpOworICAgICAgICAgICAgaG9sZGVyLnRpdGxlLnNldFRleHQoaGVhZGVyLnRpdGxlKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShoZWFkZXIuc3VtbWFyeSkpIHsKKyAgICAgICAgICAgICAgICBob2xkZXIuc3VtbWFyeS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBob2xkZXIuc3VtbWFyeS5zZXRUZXh0KGhlYWRlci5zdW1tYXJ5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZhbHVlIGZvciB7QGxpbmsgSGVhZGVyI2lkIEhlYWRlci5pZH0gaW5kaWNhdGluZyB0aGF0IG5vCisgICAgICogaWRlbnRpZmllciB2YWx1ZSBpcyBzZXQuICBBbGwgb3RoZXIgdmFsdWVzIChpbmNsdWRpbmcgdGhvc2UgYmVsb3cgLTEpCisgICAgICogYXJlIHZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBIRUFERVJfSURfVU5ERUZJTkVEID0gLTE7CisgICAgCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgSGVhZGVyIGl0ZW0gdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSGVhZGVyIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJZGVudGlmaWVyIGZvciB0aGlzIGhlYWRlciwgdG8gY29ycmVsYXRlIHdpdGggYSBuZXcgbGlzdCB3aGVuCisgICAgICAgICAqIGl0IGlzIHVwZGF0ZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcworICAgICAgICAgKiB7QGxpbmsgUHJlZmVyZW5jZUFjdGl2aXR5I0hFQURFUl9JRF9VTkRFRklORUR9LCBtZWFuaW5nIG5vIGlkLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX2lkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgbG9uZyBpZCA9IEhFQURFUl9JRF9VTkRFRklORUQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRpdGxlIG9mIHRoZSBoZWFkZXIgdGhhdCBpcyBzaG93biB0byB0aGUgdXNlci4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl90aXRsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSB0aXRsZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgc3VtbWFyeSBkZXNjcmliaW5nIHdoYXQgdGhpcyBoZWFkZXIgY29udHJvbHMuCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VIZWFkZXJfc3VtbWFyeQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdW1tYXJ5OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCB0ZXh0IHRvIHNob3cgYXMgdGhlIHRpdGxlIGluIHRoZSBicmVhZCBjcnVtYi4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9icmVhZENydW1iVGl0bGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgYnJlYWRDcnVtYlRpdGxlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCB0ZXh0IHRvIHNob3cgYXMgdGhlIHNob3J0IHRpdGxlIGluIHRoZSBicmVhZCBjcnVtYi4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9icmVhZENydW1iU2hvcnRUaXRsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBicmVhZENydW1iU2hvcnRUaXRsZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgaWNvbiByZXNvdXJjZSB0byBzaG93IGZvciB0aGlzIGhlYWRlci4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9pY29uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGljb25SZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gZGlzcGxheSB3aGVuIHRoaXMgaGVhZGVyIGlzCisgICAgICAgICAqIHNlbGVjdGVkLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX2ZyYWdtZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGZyYWdtZW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudCB3aGVuIGl0IGlzCisgICAgICAgICAqIGluc3RhbnRpYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZnJhZ21lbnRBcmd1bWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludGVudCB0byBsYXVuY2ggd2hlbiB0aGUgcHJlZmVyZW5jZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJbnRlbnQgaW50ZW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBhZGRpdGlvbmFsIGRhdGEgZm9yIHVzZSBieSBzdWJjbGFzc2VzIG9mIFByZWZlcmVuY2VBY3Rpdml0eS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZXh0cmFzOworCisgICAgICAgIHB1YmxpYyBIZWFkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlTG9uZyhpZCk7CisgICAgICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbCh0aXRsZSwgZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwoc3VtbWFyeSwgZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwoYnJlYWRDcnVtYlRpdGxlLCBkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbChicmVhZENydW1iU2hvcnRUaXRsZSwgZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgZGVzdC53cml0ZUludChpY29uUmVzKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcoZnJhZ21lbnQpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ1bmRsZShmcmFnbWVudEFyZ3VtZW50cyk7CisgICAgICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDEpOworICAgICAgICAgICAgICAgIGludGVudC53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUoZXh0cmFzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgaWQgPSBpbi5yZWFkTG9uZygpOworICAgICAgICAgICAgdGl0bGUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgc3VtbWFyeSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICBicmVhZENydW1iVGl0bGUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgYnJlYWRDcnVtYlNob3J0VGl0bGUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgaWNvblJlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGZyYWdtZW50ID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgZnJhZ21lbnRBcmd1bWVudHMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgICAgICAgICBpZiAoaW4ucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4dHJhcyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEhlYWRlcihQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxIZWFkZXI+IENSRUFUT1IgPSBuZXcgQ3JlYXRvcjxIZWFkZXI+KCkgeworICAgICAgICAgICAgcHVibGljIEhlYWRlciBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRlcihzb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIEhlYWRlcltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIZWFkZXJbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50KTsKLSAgICAgICAgCi0gICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG9uQ3JlYXRlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBtTGlzdEZvb3RlciA9IChGcmFtZUxheW91dClmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5saXN0X2Zvb3Rlcik7CisgICAgICAgIG1QcmVmc0NvbnRhaW5lciA9IGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzKTsKKyAgICAgICAgYm9vbGVhbiBoaWRpbmdIZWFkZXJzID0gb25Jc0hpZGluZ0hlYWRlcnMoKTsKKyAgICAgICAgbVNpbmdsZVBhbmUgPSBoaWRpbmdIZWFkZXJzIHx8ICFvbklzTXVsdGlQYW5lKCk7CisgICAgICAgIFN0cmluZyBpbml0aWFsRnJhZ21lbnQgPSBnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UKTsKKyAgICAgICAgQnVuZGxlIGluaXRpYWxBcmd1bWVudHMgPSBnZXRJbnRlbnQoKS5nZXRCdW5kbGVFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UX0FSR1VNRU5UUyk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgcmVzdGFydGluZyBmcm9tIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGU7IHVzZWQgdGhhdCB0bworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSwgaW5zdGVhZCBvZiBzdGFydGluZyBmcmVzaC4KKyAgICAgICAgICAgIEFycmF5TGlzdDxIZWFkZXI+IGhlYWRlcnMgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdChIRUFERVJTX1RBRyk7CisgICAgICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlcnMuYWRkQWxsKGhlYWRlcnMpOworICAgICAgICAgICAgICAgIGludCBjdXJIZWFkZXIgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KENVUl9IRUFERVJfVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludClIRUFERVJfSURfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VySGVhZGVyID49IDAgJiYgY3VySGVhZGVyIDwgbUhlYWRlcnMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkSGVhZGVyKG1IZWFkZXJzLmdldChjdXJIZWFkZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsRnJhZ21lbnQgIT0gbnVsbCAmJiBtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBqdXN0IHNob3dpbmcgYSBmcmFnbWVudCwgd2Ugd2FudCB0byBydW4gaW4KKyAgICAgICAgICAgICAgICAvLyBuZXcgZnJhZ21lbnQgbW9kZSwgYnV0IGRvbid0IG5lZWQgdG8gY29tcHV0ZSBhbmQgc2hvdworICAgICAgICAgICAgICAgIC8vIHRoZSBoZWFkZXJzLgorICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGluaXRpYWxGcmFnbWVudCwgaW5pdGlhbEFyZ3VtZW50cyk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0cnkgdG8gYnVpbGQgdGhlIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgb25CdWlsZEhlYWRlcnMobUhlYWRlcnMpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGhlYWRlcnMsIHRoZW4gYXQgdGhpcyBwb2ludCB3ZSBuZWVkIHRvIHNob3cKKyAgICAgICAgICAgICAgICAvLyB0aGVtIGFuZCwgZGVwZW5kaW5nIG9uIHRoZSBzY3JlZW4sIHdlIG1heSBhbHNvIHNob3cgaW4tbGluZQorICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgICAgICAgICAgICBpZiAobUhlYWRlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEZyYWdtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaCA9IG9uR2V0SW5pdGlhbEhlYWRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihpbml0aWFsRnJhZ21lbnQsIGluaXRpYWxBcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyB0byBvbmx5IHNob3cgdGhlIGxpc3Qgdmlldy4gIEFkanVzdAorICAgICAgICAvLyB2aXNpYmlsaXR5IGZvciBvdGhlciBjb25maWd1cmF0aW9ucy4KKyAgICAgICAgaWYgKGluaXRpYWxGcmFnbWVudCAhPSBudWxsICYmIG1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAvLyBTaW5nbGUgcGFuZSwgc2hvd2luZyBqdXN0IGEgcHJlZnMgZnJhZ21lbnQuCisgICAgICAgICAgICBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5oZWFkZXJzKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtUHJlZnNDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgaWYgKG1IZWFkZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IEhlYWRlckFkYXB0ZXIodGhpcywgbUhlYWRlcnMpOworICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgaWYgKCFtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgICAgIC8vIE11bHRpLXBhbmUuCisgICAgICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRDaG9pY2VNb2RlKEFic0xpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJIZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEhlYWRlcihtQ3VySGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVByZWZzQ29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBoZWFkZXJzLCB3ZSBhcmUgaW4gdGhlIG9sZCAianVzdCBzaG93IGEgc2NyZWVuCisgICAgICAgICAgICAvLyBvZiBwcmVmZXJlbmNlcyIgbW9kZS4KKyAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcih0aGlzLCBGSVJTVF9SRVFVRVNUX0NPREUpOworICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLnNldE9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRTY3JvbGxCYXJTdHlsZShWaWV3LlNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVkpOworCisgICAgICAgIC8vIHNlZSBpZiB3ZSBzaG91bGQgc2hvdyBCYWNrL05leHQgYnV0dG9ucworICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX1BSRUZTX1NIT1dfQlVUVE9OX0JBUiwgZmFsc2UpKSB7CisKKyAgICAgICAgICAgIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmJ1dHRvbl9iYXIpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgQnV0dG9uIGJhY2tCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmJhY2tfYnV0dG9uKTsKKyAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9DQU5DRUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgQnV0dG9uIHNraXBCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnNraXBfYnV0dG9uKTsKKyAgICAgICAgICAgIHNraXBCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbU5leHRCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLm5leHRfYnV0dG9uKTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0spOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gc2V0IG91ciB2YXJpb3VzIGJ1dHRvbiBwYXJhbWV0ZXJzCisgICAgICAgICAgICBpZiAoaW50ZW50Lmhhc0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9ORVhUX1RFWFQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCk7CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGJ1dHRvblRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFRleHQoYnV0dG9uVGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGludGVudC5oYXNFeHRyYShFWFRSQV9QUkVGU19TRVRfQkFDS19URVhUKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQpOworICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShidXR0b25UZXh0KSkgeworICAgICAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0VGV4dChidXR0b25UZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9QUkVGU19TSE9XX1NLSVAsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIHNraXBCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYWN0aXZpdHkgaXMgY3VycmVudGx5IHNob3dpbmcgdGhlIGhlYWRlciBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRMaXN0VmlldygpLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUKKyAgICAgICAgICAgICAgICAmJiBtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBhY3Rpdml0eSBpcyBzaG93aW5nIG11bHRpcGxlIHBhbmVzIC0tIHRoZSBoZWFkZXJzCisgICAgICogYW5kIGEgcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpUGFuZSgpIHsKKyAgICAgICAgcmV0dXJuIGhhc0hlYWRlcnMoKSAmJiBtUHJlZnNDb250YWluZXIuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhY3Rpdml0eSBzaG91bGQgcnVuIGluIG11bHRpLXBhbmUgbW9kZS4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHNjcmVlbiBpcyBsYXJnZQorICAgICAqIGVub3VnaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbklzTXVsdGlQYW5lKCkgeworICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKChjb25maWcuc2NyZWVuTGF5b3V0JkNvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICA9PSBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb25maWcuc2NyZWVuTGF5b3V0JkNvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICA9PSBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX0xBUkdFCisgICAgICAgICAgICAgICAgJiYgY29uZmlnLm9yaWVudGF0aW9uID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBoZWFkZXIgbGlzdCBzaG91bGQgYmUgaGlkZGVuLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlCisgICAgICogdmFsdWUgZ2l2ZW4gaW4ge0BsaW5rICNFWFRSQV9OT19IRUFERVJTfSBvciBmYWxzZSBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuCisgICAgICogVGhpcyBpcyBzZXQgdG8gZmFsc2UsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBiZWluZyByZS1sYXVuY2hlZAorICAgICAqIHRvIHNob3cgYSBwYXJ0aWN1bGFyIHByZWZlcmVuY2UgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25Jc0hpZGluZ0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRJbnRlbnQoKS5nZXRCb29sZWFuRXh0cmEoRVhUUkFfTk9fSEVBREVSUywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGluaXRpYWwgaGVhZGVyIHRvIGJlIHNob3duLiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgZnJhZ21lbnQgb2YgdGhlIGZpcnN0IGhlYWRlci4gIE5vdGUKKyAgICAgKiB0aGF0IHRoZSByZXR1cm5lZCBIZWFkZXIgb2JqZWN0IGRvZXMgbm90IGFjdHVhbGx5IG5lZWQgdG8gZXhpc3QgaW4KKyAgICAgKiB5b3VyIGhlYWRlciBsaXN0IC0tIHdoYXRldmVyIGl0cyBmcmFnbWVudCBpcyB3aWxsIHNpbXBseSBiZSB1c2VkIHRvCisgICAgICogc2hvdyBmb3IgdGhlIGluaXRpYWwgVUkuCisgICAgICovCisgICAgcHVibGljIEhlYWRlciBvbkdldEluaXRpYWxIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBtSGVhZGVycy5nZXQoMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBoZWFkZXIgbGlzdCBoYXMgYmVlbiB1cGRhdGVkICh7QGxpbmsgI29uQnVpbGRIZWFkZXJzfQorICAgICAqIGhhcyBiZWVuIGNhbGxlZCBhbmQgcmV0dXJuZWQgZHVlIHRvIHtAbGluayAjaW52YWxpZGF0ZUhlYWRlcnMoKX0pIHRvCisgICAgICogc3BlY2lmeSB0aGUgaGVhZGVyIHRoYXQgc2hvdWxkIG5vdyBiZSBzZWxlY3RlZC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogcmV0dXJucyBudWxsIHRvIGtlZXAgd2hhdGV2ZXIgaGVhZGVyIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGVhZGVyIG9uR2V0TmV3SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgbmVlZHMgaXRzIGxpc3Qgb2YgaGVhZGVycyBidWlsZC4gIEJ5CisgICAgICogaW1wbGVtZW50aW5nIHRoaXMgYW5kIGFkZGluZyBhdCBsZWFzdCBvbmUgaXRlbSB0byB0aGUgbGlzdCwgeW91CisgICAgICogd2lsbCBjYXVzZSB0aGUgYWN0aXZpdHkgdG8gcnVuIGluIGl0cyBtb2Rlcm4gZnJhZ21lbnQgbW9kZS4gIE5vdGUKKyAgICAgKiB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBhbHdheXMgYmUgY2FsbGVkOyBmb3IgZXhhbXBsZSwgaWYgdGhlCisgICAgICogYWN0aXZpdHkgaGFzIGJlZW4gYXNrZWQgdG8gZGlzcGxheSBhIHBhcnRpY3VsYXIgZnJhZ21lbnQgd2l0aG91dAorICAgICAqIHRoZSBoZWFkZXIgbGlzdCwgdGhlcmUgaXMgbm8gbmVlZCB0byBidWlsZCB0aGUgaGVhZGVycy4KKyAgICAgKgorICAgICAqIDxwPlR5cGljYWwgaW1wbGVtZW50YXRpb25zIHdpbGwgdXNlIHtAbGluayAjbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2V9CisgICAgICogdG8gZmlsbCBpbiB0aGUgbGlzdCBmcm9tIGEgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBsaXN0IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBoZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQnVpbGRIZWFkZXJzKExpc3Q8SGVhZGVyPiB0YXJnZXQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHdoZW4geW91IG5lZWQgdG8gY2hhbmdlIHRoZSBoZWFkZXJzIGJlaW5nIGRpc3BsYXllZC4gIFdpbGwgcmVzdWx0CisgICAgICogaW4gb25CdWlsZEhlYWRlcnMoKSBsYXRlciBiZWluZyBjYWxsZWQgdG8gcmV0cmlldmUgdGhlIG5ldyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVIZWFkZXJzKCkgeworICAgICAgICBpZiAoIW1IYW5kbGVyLmhhc01lc3NhZ2VzKE1TR19CVUlMRF9IRUFERVJTKSkgeworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfQlVJTERfSEVBREVSUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZ2l2ZW4gWE1MIGZpbGUgYXMgYSBoZWFkZXIgZGVzY3JpcHRpb24sIGFkZGluZyBlYWNoCisgICAgICogcGFyc2VkIEhlYWRlciBpbnRvIHRoZSB0YXJnZXQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNpZCBUaGUgWE1MIHJlc291cmNlIHRvIGxvYWQgYW5kIHBhcnNlLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIGxpc3QgaW4gd2hpY2ggdGhlIHBhcnNlZCBoZWFkZXJzIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UoaW50IHJlc2lkLCBMaXN0PEhlYWRlcj4gdGFyZ2V0KSB7CisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBnZXRSZXNvdXJjZXMoKS5nZXRYbWwocmVzaWQpOworICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzID0gWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlcik7CisKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgd2hpbGUgKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghInByZWZlcmVuY2UtaGVhZGVycyIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlhNTCBkb2N1bWVudCBtdXN0IHN0YXJ0IHdpdGggPHByZWZlcmVuY2UtaGVhZGVycz4gdGFnOyBmb3VuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbm9kZU5hbWUgKyAiIGF0ICIgKyBwYXJzZXIuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQnVuZGxlIGN1ckJ1bmRsZSA9IG51bGw7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICB3aGlsZSAoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAgICAmJiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBvdXRlckRlcHRoKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCB0eXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCJoZWFkZXIiLmVxdWFscyhub2RlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBUeXBlZEFycmF5IHNhID0gZ2V0UmVzb3VyY2VzKCkub2J0YWluQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmlkID0gc2EuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpSEVBREVSX0lEX1VOREVGSU5FRCk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNhLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl90aXRsZSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5zdW1tYXJ5ID0gc2EuZ2V0VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX3N1bW1hcnkpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIuYnJlYWRDcnVtYlRpdGxlID0gc2EuZ2V0VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2JyZWFkQ3J1bWJUaXRsZSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5icmVhZENydW1iU2hvcnRUaXRsZSA9IHNhLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl9icmVhZENydW1iU2hvcnRUaXRsZSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pY29uUmVzID0gc2EuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2ljb24sIDApOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIuZnJhZ21lbnQgPSBzYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl9mcmFnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1ckJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbm5lckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gaW5uZXJEZXB0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCB0eXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5uZXJOb2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJOb2RlTmFtZS5lcXVhbHMoImV4dHJhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5wYXJzZUJ1bmRsZUV4dHJhKCJleHRyYSIsIGF0dHJzLCBjdXJCdW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5uZXJOb2RlTmFtZS5lcXVhbHMoImludGVudCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmludGVudCA9IEludGVudC5wYXJzZUludGVudChnZXRSZXNvdXJjZXMoKSwgcGFyc2VyLCBhdHRycyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJCdW5kbGUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmZyYWdtZW50QXJndW1lbnRzID0gY3VyQnVuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyQnVuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGQoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIGhlYWRlcnMiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgaGVhZGVycyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgZm9vdGVyIHRoYXQgc2hvdWxkIGJlIHNob3duIGF0IHRoZSBib3R0b20gb2YgdGhlIGhlYWRlciBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RGb290ZXIoVmlldyB2aWV3KSB7CisgICAgICAgIG1MaXN0Rm9vdGVyLnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIG1MaXN0Rm9vdGVyLmFkZFZpZXcodmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVN0b3AoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgICAgIAotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CiAKLSAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwotICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5zYXZlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKLSAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShQUkVGRVJFTkNFU19UQUcsIGNvbnRhaW5lcik7CisgICAgICAgIGlmIChtSGVhZGVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEhFQURFUlNfVEFHLCBtSGVhZGVycyk7CisgICAgICAgICAgICBpZiAobUN1ckhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUhlYWRlcnMuaW5kZXhPZihtQ3VySGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoQ1VSX0hFQURFUl9UQUcsIGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4uc2F2ZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRywgY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHN0YXRlKSB7Ci0gICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7Ci0gICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5yZXN0b3JlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBtU2F2ZWRJbnN0YW5jZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4ucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TYXZlZEluc3RhbmNlU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNTYsMTQgKzc5OSwyMjAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CiAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworCisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Db250ZW50Q2hhbmdlZCgpIHsKICAgICAgICAgc3VwZXIub25Db250ZW50Q2hhbmdlZCgpOwotICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgc3VwZXIub25MaXN0SXRlbUNsaWNrKGwsIHYsIHBvc2l0aW9uLCBpZCk7CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9uSGVhZGVyQ2xpY2sobUhlYWRlcnMuZ2V0KHBvc2l0aW9uKSwgcG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIGluIHRoZSBoZWFkZXIgbGlzdC4gIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gd2lsbCBjYWxsIGVpdGhlciB7QGxpbmsgI3N0YXJ0V2l0aEZyYWdtZW50KFN0cmluZywgQnVuZGxlKX0KKyAgICAgKiBvciB7QGxpbmsgI3N3aXRjaFRvSGVhZGVyKEhlYWRlcil9IGFzIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgaGVhZGVyJ3MgcG9zaXRpb24gaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25IZWFkZXJDbGljayhIZWFkZXIgaGVhZGVyLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKGhlYWRlci5mcmFnbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVNpbmdsZVBhbmUpIHsKKyAgICAgICAgICAgICAgICBzdGFydFdpdGhGcmFnbWVudChoZWFkZXIuZnJhZ21lbnQsIGhlYWRlci5mcmFnbWVudEFyZ3VtZW50cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGhlYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyLmludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGhlYWRlci5pbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBhY3Rpdml0eSwgc2hvd2luZyBvbmx5IHRoZSBnaXZlbgorICAgICAqIHByZWZlcmVuY2UgZnJhZ21lbnQuICBXaGVuIGxhdW5jaGVkIGluIHRoaXMgbW9kZSwgdGhlIGhlYWRlciBsaXN0CisgICAgICogd2lsbCBiZSBoaWRkZW4gYW5kIHRoZSBnaXZlbiBwcmVmZXJlbmNlIGZyYWdtZW50IHdpbGwgYmUgaW5zdGFudGlhdGVkCisgICAgICogYW5kIGZpbGwgdGhlIGVudGlyZSBhY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGRpc3BsYXkuCisgICAgICogQHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRXaXRoRnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50TmFtZSwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIGdldENsYXNzKCkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfU0hPV19GUkFHTUVOVCwgZnJhZ21lbnROYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTLCBhcmdzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX05PX0hFQURFUlMsIHRydWUpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hhbmdlIHRoZSBiYXNlIHRpdGxlIG9mIHRoZSBicmVhZCBjcnVtYnMgZm9yIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzLgorICAgICAqIFRoaXMgd2lsbCBub3JtYWxseSBiZSBjYWxsZWQgZm9yIHlvdS4gIFNlZQorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudEJyZWFkQ3J1bWJzfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93QnJlYWRDcnVtYnMoQ2hhclNlcXVlbmNlIHRpdGxlLCBDaGFyU2VxdWVuY2Ugc2hvcnRUaXRsZSkgeworICAgICAgICBpZiAobUZyYWdtZW50QnJlYWRDcnVtYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUZyYWdtZW50QnJlYWRDcnVtYnMgPSBuZXcgRnJhZ21lbnRCcmVhZENydW1icyh0aGlzKTsKKyAgICAgICAgICAgIG1GcmFnbWVudEJyZWFkQ3J1bWJzLnNldEFjdGl2aXR5KHRoaXMpOworICAgICAgICAgICAgZ2V0QWN0aW9uQmFyKCkuc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUobUZyYWdtZW50QnJlYWRDcnVtYnMpOworICAgICAgICB9CisgICAgICAgIG1GcmFnbWVudEJyZWFkQ3J1bWJzLnNldFRpdGxlKHRpdGxlLCBzaG9ydFRpdGxlKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNlbGVjdGVkSGVhZGVyKEhlYWRlciBoZWFkZXIpIHsKKyAgICAgICAgbUN1ckhlYWRlciA9IGhlYWRlcjsKKyAgICAgICAgaW50IGluZGV4ID0gbUhlYWRlcnMuaW5kZXhPZihoZWFkZXIpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRJdGVtQ2hlY2tlZChpbmRleCwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRMaXN0VmlldygpLmNsZWFyQ2hvaWNlcygpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gaGVhZGVyLmJyZWFkQ3J1bWJUaXRsZTsKKyAgICAgICAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB0aXRsZSA9IGhlYWRlci50aXRsZTsKKyAgICAgICAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB0aXRsZSA9IGdldFRpdGxlKCk7CisgICAgICAgICAgICBzaG93QnJlYWRDcnVtYnModGl0bGUsIGhlYWRlci5icmVhZENydW1iU2hvcnRUaXRsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaG93QnJlYWRDcnVtYnMoZ2V0VGl0bGUoKSwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hUb0hlYWRlcklubmVyKFN0cmluZyBmcmFnbWVudE5hbWUsIEJ1bmRsZSBhcmdzLCBib29sZWFuIG5leHQpIHsKKyAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkucG9wQmFja1N0YWNrKEJBQ0tfU1RBQ0tfUFJFRlMsIFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSk7CisgICAgICAgIEZyYWdtZW50IGYgPSBGcmFnbWVudC5pbnN0YW50aWF0ZSh0aGlzLCBmcmFnbWVudE5hbWUsIGFyZ3MpOworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zaXRpb24obmV4dCA/CisgICAgICAgICAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX05FWFQgOgorICAgICAgICAgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9QUkVWKTsKKyAgICAgICAgdHJhbnNhY3Rpb24ucmVwbGFjZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzLCBmKTsKKyAgICAgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBpbiB0d28tcGFuZSBtb2RlLCBzd2l0Y2ggdGhlIGZyYWdtZW50IHBhbmUgdG8gc2hvdyB0aGUgZ2l2ZW4KKyAgICAgKiBwcmVmZXJlbmNlIGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gZGlzcGxheS4KKyAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hUb0hlYWRlcihTdHJpbmcgZnJhZ21lbnROYW1lLCBCdW5kbGUgYXJncykgeworICAgICAgICBzZXRTZWxlY3RlZEhlYWRlcihudWxsKTsKKyAgICAgICAgc3dpdGNoVG9IZWFkZXJJbm5lcihmcmFnbWVudE5hbWUsIGFyZ3MsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gaW4gdHdvLXBhbmUgbW9kZSwgc3dpdGNoIHRvIHRoZSBmcmFnbWVudCBwYW5lIHRvIHNob3cgdGhlIGdpdmVuCisgICAgICogcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIG5ldyBoZWFkZXIgdG8gZGlzcGxheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hUb0hlYWRlcihIZWFkZXIgaGVhZGVyKSB7CisgICAgICAgIHN3aXRjaFRvSGVhZGVySW5uZXIoaGVhZGVyLmZyYWdtZW50LCBoZWFkZXIuZnJhZ21lbnRBcmd1bWVudHMsCisgICAgICAgICAgICAgICAgbUhlYWRlcnMuaW5kZXhPZihoZWFkZXIpID4gbUhlYWRlcnMuaW5kZXhPZihtQ3VySGVhZGVyKSk7CisgICAgICAgIHNldFNlbGVjdGVkSGVhZGVyKGhlYWRlcik7CisgICAgfQorCisgICAgSGVhZGVyIGZpbmRCZXN0TWF0Y2hpbmdIZWFkZXIoSGVhZGVyIGN1ciwgQXJyYXlMaXN0PEhlYWRlcj4gZnJvbSkgeworICAgICAgICBBcnJheUxpc3Q8SGVhZGVyPiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDxIZWFkZXI+KCk7CisgICAgICAgIGZvciAoaW50IGo9MDsgajxmcm9tLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBIZWFkZXIgb2ggPSBmcm9tLmdldChqKTsKKyAgICAgICAgICAgIGlmIChjdXIgPT0gb2ggfHwgKGN1ci5pZCAhPSBIRUFERVJfSURfVU5ERUZJTkVEICYmIGN1ci5pZCA9PSBvaC5pZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIHRoaXMgb25lLgorICAgICAgICAgICAgICAgIG1hdGNoZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChvaCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3VyLmZyYWdtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyLmZyYWdtZW50LmVxdWFscyhvaC5mcmFnbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQob2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyLmludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1ci5pbnRlbnQuZXF1YWxzKG9oLmludGVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQob2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyLnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyLnRpdGxlLmVxdWFscyhvaC50aXRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQob2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTk0gPSBtYXRjaGVzLnNpemUoKTsKKyAgICAgICAgaWYgKE5NID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVzLmdldCgwKTsKKyAgICAgICAgfSBlbHNlIGlmIChOTSA+IDEpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxOTTsgaisrKSB7CisgICAgICAgICAgICAgICAgSGVhZGVyIG9oID0gbWF0Y2hlcy5nZXQoaik7CisgICAgICAgICAgICAgICAgaWYgKGN1ci5mcmFnbWVudEFyZ3VtZW50cyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjdXIuZnJhZ21lbnRBcmd1bWVudHMuZXF1YWxzKG9oLmZyYWdtZW50QXJndW1lbnRzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjdXIuZXh0cmFzICE9IG51bGwgJiYgY3VyLmV4dHJhcy5lcXVhbHMob2guZXh0cmFzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjdXIudGl0bGUgIT0gbnVsbCAmJiBjdXIudGl0bGUuZXF1YWxzKG9oLnRpdGxlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBzdGFydAorICAgICAqIEBwYXJhbSBwdXNoIElmIHRydWUsIHRoZSBjdXJyZW50IGZyYWdtZW50IHdpbGwgYmUgcHVzaGVkIG9udG8gdGhlIGJhY2sgc3RhY2suICBJZiBmYWxzZSwKKyAgICAgKiB0aGUgY3VycmVudCBmcmFnbWVudCB3aWxsIGJlIHJlcGxhY2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZmVyZW5jZUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBib29sZWFuIHB1c2gpIHsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICBzdGFydFByZWZlcmVuY2VGcmFnbWVudChmcmFnbWVudCwgdHJhbnNhY3Rpb24pOworICAgICAgICBpZiAocHVzaCkgeworICAgICAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpdGlvbihGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfT1BFTik7CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5hZGRUb0JhY2tTdGFjayhCQUNLX1NUQUNLX1BSRUZTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zaXRpb24oRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX05FWFQpOworICAgICAgICB9CisgICAgICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBzdGFydAorICAgICAqIEBwYXJhbSBmdCBUaGUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbiB3aGljaCB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLgorICAgICAqIFdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBiYWNrIHN0YWNrIG9yIGNvbW1pdHRlZCBmb3IgeW91OyB5b3UgdXNlIGRvIHRoYXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRQcmVmZXJlbmNlRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICAgICAgZnQucmVwbGFjZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzLCBmcmFnbWVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudChQcmVmZXJlbmNlRnJhZ21lbnQgY2FsbGVyLCBQcmVmZXJlbmNlIHByZWYpIHsKKyAgICAgICAgRnJhZ21lbnQgZiA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKHRoaXMsIHByZWYuZ2V0RnJhZ21lbnQoKSwgcHJlZi5nZXRFeHRyYXMoKSk7CisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgc3RhcnRQcmVmZXJlbmNlRnJhZ21lbnQoZiwgdHJhbnNhY3Rpb24pOworICAgICAgICB0cmFuc2FjdGlvbi5zZXRCcmVhZENydW1iVGl0bGUocHJlZi5nZXRUaXRsZSgpKTsKKyAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpdGlvbihGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfT1BFTik7CisgICAgICAgIHRyYW5zYWN0aW9uLmFkZFRvQmFja1N0YWNrKEJBQ0tfU1RBQ0tfUFJFRlMpOworICAgICAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzYsNyArMTAyNSw3IEBACiAgICAgICAgIGlmIChtSGFuZGxlci5oYXNNZXNzYWdlcyhNU0dfQklORF9QUkVGRVJFTkNFUykpIHJldHVybjsKICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQklORF9QUkVGRVJFTkNFUykuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIGJpbmRQcmVmZXJlbmNlcygpIHsKICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwogICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CkBAIC0xODcsMzggKzEwMzYsNDEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGFjdGl2aXR5LgotICAgICAqLwotICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgb25DcmVhdGVQcmVmZXJlbmNlTWFuYWdlcigpIHsKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIgcHJlZmVyZW5jZU1hbmFnZXIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIodGhpcywgRklSU1RfUkVRVUVTVF9DT0RFKTsKLSAgICAgICAgcHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHJldHVybiBwcmVmZXJlbmNlTWFuYWdlcjsKLSAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9IHVzZWQgYnkgdGhpcyBhY3Rpdml0eS4KICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFByZWZlcmVuY2VNYW5hZ2VyIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkgewogICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgdm9pZCByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKSB7CiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTW9kZXJuIHR3by1wYW5lIFByZWZlcmVuY2VBY3Rpdml0eSByZXF1aXJlcyB1c2Ugb2YgYSBQcmVmZXJlbmNlRnJhZ21lbnQiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBhY3Rpdml0eSBpcyBzaG93aW5nLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByZWZlcmVuY2VTY3JlZW4gVGhlIHJvb3Qge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VTY3JlZW4oUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuKSB7CisgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOworCiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIuc2V0UHJlZmVyZW5jZXMocHJlZmVyZW5jZVNjcmVlbikgJiYgcHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CiAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCkuZ2V0VGl0bGUoKTsKQEAgLTIyOCw2MSArMTA4MCw4NCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gdGhhdCBpcyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZQogICAgICAqICAgICAgICAgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFByZWZlcmVuY2VTY3JlZW4gZ2V0UHJlZmVyZW5jZVNjcmVlbigpIHsKLSAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQWRkcyBwcmVmZXJlbmNlcyBmcm9tIGFjdGl2aXRpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4ge0BsaW5rIEludGVudH0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSB7QGxpbmsgSW50ZW50fSB0byBxdWVyeSBhY3Rpdml0aWVzLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50KEludGVudCBpbnRlbnQpIHsKICAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0gICAgICAgIAorCiAgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4obVByZWZlcmVuY2VNYW5hZ2VyLmluZmxhdGVGcm9tSW50ZW50KGludGVudCwgZ2V0UHJlZmVyZW5jZVNjcmVlbigpKSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogSW5mbGF0ZXMgdGhlIGdpdmVuIFhNTCByZXNvdXJjZSBhbmQgYWRkcyB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdG8gdGhlIGN1cnJlbnQKICAgICAgKiBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlc1Jlc0lkIFRoZSBYTUwgcmVzb3VyY2UgSUQgdG8gaW5mbGF0ZS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCBwcmVmZXJlbmNlc1Jlc0lkKSB7CiAgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICAKKwogICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbVJlc291cmNlKHRoaXMsIHByZWZlcmVuY2VzUmVzSWQsCiAgICAgICAgICAgICAgICAgZ2V0UHJlZmVyZW5jZVNjcmVlbigpKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSBwcmVmZXJlbmNlKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGaW5kcyBhIHtAbGluayBQcmVmZXJlbmNlfSBiYXNlZCBvbiBpdHMga2V5LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBwcmVmZXJlbmNlIHRvIHJldHJpZXZlLgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlfSB3aXRoIHRoZSBrZXksIG9yIG51bGwuCiAgICAgICogQHNlZSBQcmVmZXJlbmNlR3JvdXAjZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlKQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFByZWZlcmVuY2UgZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlIGtleSkgewotICAgICAgICAKKwogICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZmluZFByZWZlcmVuY2Uoa2V5KTsKICAgICB9CiAKQEAgLTI5Miw1ICsxMTY3LDE0IEBACiAgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hOZXdJbnRlbnQoaW50ZW50KTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8vIGdpdmUgc3ViY2xhc3NlcyBhY2Nlc3MgdG8gdGhlIE5leHQgYnV0dG9uCisgICAgLyoqIEBoaWRlICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dEJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1OZXh0QnV0dG9uICE9IG51bGw7CisgICAgfQorICAgIC8qKiBAaGlkZSAqLworICAgIHByb3RlY3RlZCBCdXR0b24gZ2V0TmV4dEJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1OZXh0QnV0dG9uOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjljMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCisvKioKKyAqIFNob3dzIGEgaGllcmFyY2h5IG9mIHtAbGluayBQcmVmZXJlbmNlfSBvYmplY3RzIGFzCisgKiBsaXN0cy4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbAorICogYXV0b21hdGljYWxseSBzYXZlIHRvIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gYXMgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGgKKyAqIHRoZW0uIFRvIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gdGhhdCB0aGUKKyAqIHByZWZlcmVuY2UgaGllcmFyY2h5IGluIHRoaXMgZnJhZ21lbnQgd2lsbCB1c2UsIGNhbGwKKyAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNnZXREZWZhdWx0U2hhcmVkUHJlZmVyZW5jZXMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpfQorICogd2l0aCBhIGNvbnRleHQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGlzIGZyYWdtZW50LgorICogPHA+CisgKiBGdXJ0aGVybW9yZSwgdGhlIHByZWZlcmVuY2VzIHNob3duIHdpbGwgZm9sbG93IHRoZSB2aXN1YWwgc3R5bGUgb2Ygc3lzdGVtCisgKiBwcmVmZXJlbmNlcy4gSXQgaXMgZWFzeSB0byBjcmVhdGUgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXMgKHRoYXQgY2FuIGJlCisgKiBzaG93biBvbiBtdWx0aXBsZSBzY3JlZW5zKSB2aWEgWE1MLiBGb3IgdGhlc2UgcmVhc29ucywgaXQgaXMgcmVjb21tZW5kZWQgdG8KKyAqIHVzZSB0aGlzIGZyYWdtZW50IChhcyBhIHN1cGVyY2xhc3MpIHRvIGRlYWwgd2l0aCBwcmVmZXJlbmNlcyBpbiBhcHBsaWNhdGlvbnMuCisgKiA8cD4KKyAqIEEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9iamVjdCBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiB0aGUgcHJlZmVyZW5jZQorICogaGllcmFyY2h5LiBGdXJ0aGVybW9yZSwgc3Vic2VxdWVudCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeQorICogZGVub3RlIGEgc2NyZWVuIGJyZWFrLS10aGF0IGlzIHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgd2l0aGluIHN1YnNlcXVlbnQKKyAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBzaG91bGQgYmUgc2hvd24gb24gYW5vdGhlciBzY3JlZW4uIFRoZSBwcmVmZXJlbmNlCisgKiBmcmFtZXdvcmsgaGFuZGxlcyBzaG93aW5nIHRoZXNlIG90aGVyIHNjcmVlbnMgZnJvbSB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgKiA8cD4KKyAqIFRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSBjYW4gYmUgZm9ybWVkIGluIG11bHRpcGxlIHdheXM6CisgKiA8bGk+IEZyb20gYW4gWE1MIGZpbGUgc3BlY2lmeWluZyB0aGUgaGllcmFyY2h5CisgKiA8bGk+IEZyb20gZGlmZmVyZW50IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2ggc3BlY2lmeSBpdHMgb3duCisgKiBwcmVmZXJlbmNlcyBpbiBhbiBYTUwgZmlsZSB2aWEge0BsaW5rIEFjdGl2aXR5fSBtZXRhLWRhdGEKKyAqIDxsaT4gRnJvbSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufQorICogPHA+CisgKiBUbyBpbmZsYXRlIGZyb20gWE1MLCB1c2UgdGhlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50KX0uIFRoZQorICogcm9vdCBlbGVtZW50IHNob3VsZCBiZSBhIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4gU3Vic2VxdWVudCBlbGVtZW50cyBjYW4gcG9pbnQKKyAqIHRvIGFjdHVhbCB7QGxpbmsgUHJlZmVyZW5jZX0gc3ViY2xhc3Nlcy4gQXMgbWVudGlvbmVkIGFib3ZlLCBzdWJzZXF1ZW50CisgKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeSB3aWxsIHJlc3VsdCBpbiB0aGUgc2NyZWVuIGJyZWFrLgorICogPHA+CisgKiBUbyBzcGVjaWZ5IGFuIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2gKKyAqIGhhdmUgcHJlZmVyZW5jZXMsIHVzZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbUludGVudH0uIEVhY2gKKyAqIHtAbGluayBBY3Rpdml0eX0gY2FuIHNwZWNpZnkgbWV0YS1kYXRhIGluIHRoZSBtYW5pZmVzdCAodmlhIHRoZSBrZXkKKyAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNNRVRBREFUQV9LRVlfUFJFRkVSRU5DRVN9KSB0aGF0IHBvaW50cyB0byBhbiBYTUwKKyAqIHJlc291cmNlLiBUaGVzZSBYTUwgcmVzb3VyY2VzIHdpbGwgYmUgaW5mbGF0ZWQgaW50byBhIHNpbmdsZSBwcmVmZXJlbmNlCisgKiBoaWVyYXJjaHkgYW5kIHNob3duIGJ5IHRoaXMgZnJhZ21lbnQuCisgKiA8cD4KKyAqIFRvIHNwZWNpZnkgYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0sIHVzZQorICoge0BsaW5rICNzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4pfS4KKyAqIDxwPgorICogQXMgYSBjb252ZW5pZW5jZSwgdGhpcyBmcmFnbWVudCBpbXBsZW1lbnRzIGEgY2xpY2sgbGlzdGVuZXIgZm9yIGFueQorICogcHJlZmVyZW5jZSBpbiB0aGUgY3VycmVudCBoaWVyYXJjaHksIHNlZQorICoge0BsaW5rICNvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSl9LgorICoKKyAqIDxhIG5hbWU9IlNhbXBsZUNvZGUiPjwvYT4KKyAqIDxoMz5TYW1wbGUgQ29kZTwvaDM+CisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzYW1wbGUgY29kZSBzaG93cyBhIHNpbXBsZSBwcmVmZXJlbmNlIGZyYWdtZW50IHRoYXQgaXMKKyAqIHBvcHVsYXRlZCBmcm9tIGEgcmVzb3VyY2UuICBUaGUgcmVzb3VyY2UgaXQgbG9hZHMgaXM6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlcy54bWwgcHJlZmVyZW5jZXN9CisgKgorICogPHA+VGhlIGZyYWdtZW50IGltcGxlbWVudGF0aW9uIGl0c2VsZiBzaW1wbHkgcG9wdWxhdGVzIHRoZSBwcmVmZXJlbmNlcworICogd2hlbiBjcmVhdGVkLiAgTm90ZSB0aGF0IHRoZSBwcmVmZXJlbmNlcyBmcmFtZXdvcmsgdGFrZXMgY2FyZSBvZiBsb2FkaW5nCisgKiB0aGUgY3VycmVudCB2YWx1ZXMgb3V0IG9mIHRoZSBhcHAgcHJlZmVyZW5jZXMgYW5kIHdyaXRpbmcgdGhlbSB3aGVuIGNoYW5nZWQ6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0ZyYWdtZW50UHJlZmVyZW5jZXMuamF2YQorICogICAgICBmcmFnbWVudH0KKyAqCisgKiBAc2VlIFByZWZlcmVuY2UKKyAqIEBzZWUgUHJlZmVyZW5jZVNjcmVlbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgaW1wbGVtZW50cworICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5PblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRVNfVEFHID0gImFuZHJvaWQ6cHJlZmVyZW5jZXMiOworCisgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVQcmVmczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXREb25lOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXJ0aW5nIHJlcXVlc3QgY29kZSBnaXZlbiBvdXQgdG8gcHJlZmVyZW5jZSBmcmFtZXdvcmsuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1JFUVVFU1RfQ09ERSA9IDEwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDE7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19CSU5EX1BSRUZFUkVOQ0VTOgorICAgICAgICAgICAgICAgICAgICBiaW5kUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgZmluYWwgcHJpdmF0ZSBSdW5uYWJsZSBtUmVxdWVzdEZvY3VzID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtTGlzdC5mb2N1c2FibGVWaWV3QXZhaWxhYmxlKG1MaXN0KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdGhhdCBQcmVmZXJlbmNlRnJhZ21lbnQncyBjb250YWluaW5nIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGltcGxlbWVudCB0byBiZSBhYmxlIHRvIHByb2Nlc3MgcHJlZmVyZW5jZSBpdGVtcyB0aGF0IHdpc2ggdG8KKyAgICAgKiBzd2l0Y2ggdG8gYSBuZXcgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGNsaWNrZWQgb24gYSBQcmVmZXJlbmNlIHRoYXQgaGFzCisgICAgICAgICAqIGEgZnJhZ21lbnQgY2xhc3MgbmFtZSBhc3NvY2lhdGVkIHdpdGggaXQuICBUaGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogdG8gc2hvdWxkIGluc3RhbnRpYXRlIGFuZCBzd2l0Y2ggdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuCisgICAgICAgICAqIGZyYWdtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBvblByZWZlcmVuY2VTdGFydEZyYWdtZW50KFByZWZlcmVuY2VGcmFnbWVudCBjYWxsZXIsIFByZWZlcmVuY2UgcHJlZik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoZ2V0QWN0aXZpdHkoKSwgRklSU1RfUkVRVUVTVF9DT0RFKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLnNldEZyYWdtZW50KHRoaXMpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfY29udGVudCwKKyAgICAgICAgICAgICAgICBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0U2Nyb2xsQmFyU3R5bGUoVmlldy5TQ1JPTExCQVJTX0lOU0lERV9PVkVSTEFZKTsKKworICAgICAgICBpZiAobUhhdmVQcmVmcykgeworICAgICAgICAgICAgYmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgIH0KKworICAgICAgICBtSW5pdERvbmUgPSB0cnVlOworCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4ucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95VmlldygpIHsKKyAgICAgICAgbUxpc3QgPSBudWxsOworICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJlcXVlc3RGb2N1cyk7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveVZpZXcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnNhdmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRywgY29udGFpbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGZyYWdtZW50LgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCisgICAgICovCisgICAgcHVibGljIFByZWZlcmVuY2VNYW5hZ2VyIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBmcmFnbWVudCBpcyBzaG93aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZlcmVuY2VTY3JlZW4gVGhlIHJvb3Qge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbikgeworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyLnNldFByZWZlcmVuY2VzKHByZWZlcmVuY2VTY3JlZW4pICYmIHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgbUhhdmVQcmVmcyA9IHRydWU7CisgICAgICAgICAgICBpZiAobUluaXREb25lKSB7CisgICAgICAgICAgICAgICAgcG9zdEJpbmRQcmVmZXJlbmNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGZyYWdtZW50IGlzIHNob3dpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gdGhhdCBpcyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZQorICAgICAqICAgICAgICAgaGllcmFyY2h5LgorICAgICAqLworICAgIHB1YmxpYyBQcmVmZXJlbmNlU2NyZWVuIGdldFByZWZlcmVuY2VTY3JlZW4oKSB7CisgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgcHJlZmVyZW5jZXMgZnJvbSBhY3Rpdml0aWVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHtAbGluayBJbnRlbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVudCBUaGUge0BsaW5rIEludGVudH0gdG8gcXVlcnkgYWN0aXZpdGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbUludGVudChpbnRlbnQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZmxhdGVzIHRoZSBnaXZlbiBYTUwgcmVzb3VyY2UgYW5kIGFkZHMgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRvIHRoZSBjdXJyZW50CisgICAgICogcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZXNSZXNJZCBUaGUgWE1MIHJlc291cmNlIElEIHRvIGluZmxhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50IHByZWZlcmVuY2VzUmVzSWQpIHsKKyAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKKyAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21SZXNvdXJjZShnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzUmVzSWQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuLAorICAgICAgICAgICAgUHJlZmVyZW5jZSBwcmVmZXJlbmNlKSB7CisgICAgICAgIGlmIChwcmVmZXJlbmNlLmdldEZyYWdtZW50KCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkgaW5zdGFuY2VvZiBPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiAoKE9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjaylnZXRBY3Rpdml0eSgpKS5vblByZWZlcmVuY2VTdGFydEZyYWdtZW50KAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBwcmVmZXJlbmNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSB7QGxpbmsgUHJlZmVyZW5jZX0gYmFzZWQgb24gaXRzIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZX0gd2l0aCB0aGUga2V5LCBvciBudWxsLgorICAgICAqIEBzZWUgUHJlZmVyZW5jZUdyb3VwI2ZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlZmVyZW5jZSBmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2Uga2V5KSB7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5maW5kUHJlZmVyZW5jZShrZXkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0QmluZFByZWZlcmVuY2VzKCkgeworICAgICAgICBpZiAobUhhbmRsZXIuaGFzTWVzc2FnZXMoTVNHX0JJTkRfUFJFRkVSRU5DRVMpKSByZXR1cm47CisgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0JJTkRfUFJFRkVSRU5DRVMpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiaW5kUHJlZmVyZW5jZXMoKSB7CisgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5iaW5kKGdldExpc3RWaWV3KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIExpc3RWaWV3IGdldExpc3RWaWV3KCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlTGlzdCgpIHsKKyAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHJvb3QgPSBnZXRWaWV3KCk7CisgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRlbnQgdmlldyBub3QgeWV0IGNyZWF0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHJhd0xpc3RWaWV3ID0gcm9vdC5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmxpc3QpOworICAgICAgICBpZiAoIShyYXdMaXN0VmlldyBpbnN0YW5jZW9mIExpc3RWaWV3KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDb250ZW50IGhhcyB2aWV3IHdpdGggaWQgYXR0cmlidXRlICdhbmRyb2lkLlIuaWQubGlzdCcgIgorICAgICAgICAgICAgICAgICAgICArICJ0aGF0IGlzIG5vdCBhIExpc3RWaWV3IGNsYXNzIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3QgPSAoTGlzdFZpZXcpcmF3TGlzdFZpZXc7CisgICAgICAgIGlmIChtTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIllvdXIgY29udGVudCBtdXN0IGhhdmUgYSBMaXN0VmlldyB3aG9zZSBpZCBhdHRyaWJ1dGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICInYW5kcm9pZC5SLmlkLmxpc3QnIik7CisgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIucG9zdChtUmVxdWVzdEZvY3VzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlSW5mbGF0ZXIuamF2YQppbmRleCA3NzllNzQ2Li5jMjFhYTE4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUluZmxhdGVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zOSw2ICs0MSw3IEBACiBjbGFzcyBQcmVmZXJlbmNlSW5mbGF0ZXIgZXh0ZW5kcyBHZW5lcmljSW5mbGF0ZXI8UHJlZmVyZW5jZSwgUHJlZmVyZW5jZUdyb3VwPiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQcmVmZXJlbmNlSW5mbGF0ZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFTlRfVEFHX05BTUUgPSAiaW50ZW50IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEFHX05BTUUgPSAiZXh0cmEiOwogCiAgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7CiAgICAgCkBAIC03Myw4ICs3NiwxMCBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQucGFyc2VJbnRlbnQoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLCBwYXJzZXIsIGF0dHJzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgcGFyc2UgSW50ZW50LiIpOwotICAgICAgICAgICAgICAgIExvZy53KFRBRywgZSk7CisgICAgICAgICAgICAgICAgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCA9IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgcHJlZmVyZW5jZSIpOworICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKGludGVudCAhPSBudWxsKSB7CkBAIC04Miw2ICs4NywxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcuZXF1YWxzKEVYVFJBX1RBR19OQU1FKSkgeworICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLnBhcnNlQnVuZGxlRXh0cmEoRVhUUkFfVEFHX05BTUUsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnRQcmVmZXJlbmNlLmdldEV4dHJhcygpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4ID0gbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBwcmVmZXJlbmNlIik7CisgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXIuamF2YQppbmRleCBmYTgzODk3Li40MjE1MGVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlTWFuYWdlci5qYXZhCkBAIC0xNiwxMiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMzQsNiArMjksMTAgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogLyoqCiAgKiBVc2VkIHRvIGhlbHAgY3JlYXRlIHtAbGluayBQcmVmZXJlbmNlfSBoaWVyYXJjaGllcwogICogZnJvbSBhY3Rpdml0aWVzIG9yIFhNTC4KQEAgLTYxLDYgKzYwLDExIEBACiAgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQWN0aXZpdHk7CiAKICAgICAvKioKKyAgICAgKiBGcmFnbWVudCB0aGF0IG93bnMgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByZWZlcmVuY2VGcmFnbWVudCBtRnJhZ21lbnQ7CisKKyAgICAvKioKICAgICAgKiBUaGUgY29udGV4dCB0byB1c2UuIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzZXQuCiAgICAgICogCiAgICAgICogQHNlZSAjbUFjdGl2aXR5CkBAIC0xNTgsNyArMTYyLDIxIEBACiAgICAgICAgIAogICAgICAgICBzZXRTaGFyZWRQcmVmZXJlbmNlc05hbWUoZ2V0RGVmYXVsdFNoYXJlZFByZWZlcmVuY2VzTmFtZShjb250ZXh0KSk7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3duaW5nIHByZWZlcmVuY2UgZnJhZ21lbnQKKyAgICAgKi8KKyAgICB2b2lkIHNldEZyYWdtZW50KFByZWZlcmVuY2VGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBtRnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvd25pbmcgcHJlZmVyZW5jZSBmcmFnbWVudCwgaWYgYW55LgorICAgICAqLworICAgIFByZWZlcmVuY2VGcmFnbWVudCBnZXRGcmFnbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgQWN0aXZpdHl9IChpbmRpcmVjdGx5KSB0aGF0IG1hdGNoIGEgZ2l2ZW4KICAgICAgKiB7QGxpbmsgSW50ZW50fS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKaW5kZXggOTVlNTQzMjQuLmM3ZjhhYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCkBAIC05MSw3ICs5MSw4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGFkYXB0ZXIgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB7QGxpbmsgUHJlZmVyZW5jZUFjdGl2aXR5fQotICAgICAqIHRvIHNob3cgdGhlIHByZWZlcmVuY2VzIGNvbnRhaW5lZCBpbiB0aGlzIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4KKyAgICAgKiBvciB7QGxpbmsgUHJlZmVyZW5jZUZyYWdtZW50fSB0byBzaG93IHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgaW4gdGhpcworICAgICAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4KICAgICAgKiA8cD4KICAgICAgKiBUaGlzIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSB3aWxsIE5PVCBhcHBlYXIgaW4gdGhlIHJldHVybmVkIGFkYXB0ZXIsIGluc3RlYWQKICAgICAgKiBpdCBhcHBlYXJzIGluIHRoZSBoaWVyYXJjaHkgYWJvdmUgdGhpcyB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uCkBAIC0xMzYsNyArMTM3LDcgQEAKICAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNsaWNrKCkgewotICAgICAgICBpZiAoZ2V0SW50ZW50KCkgIT0gbnVsbCB8fCBnZXRQcmVmZXJlbmNlQ291bnQoKSA9PSAwKSB7CisgICAgICAgIGlmIChnZXRJbnRlbnQoKSAhPSBudWxsIHx8IGdldEZyYWdtZW50KCkgIT0gbnVsbCB8fCBnZXRQcmVmZXJlbmNlQ291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1Jpbmd0b25lUHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9SaW5ndG9uZVByZWZlcmVuY2UuamF2YQppbmRleCBiNDZmMTgwLi5jZjE0MDk3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1Jpbmd0b25lUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUmluZ3RvbmVQcmVmZXJlbmNlLmphdmEKQEAgLTI0LDcgKzI0LDYgQEAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBBIHtAbGluayBQcmVmZXJlbmNlfSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSByaW5ndG9uZSBmcm9tIHRob3NlIG9uIHRoZSBkZXZpY2UuIApAQCAtMTM3LDcgKzEzNiwxMiBAQAogICAgICAgICAvLyBMYXVuY2ggdGhlIHJpbmd0b25lIHBpY2tlcgogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChSaW5ndG9uZU1hbmFnZXIuQUNUSU9OX1JJTkdUT05FX1BJQ0tFUik7CiAgICAgICAgIG9uUHJlcGFyZVJpbmd0b25lUGlja2VySW50ZW50KGludGVudCk7Ci0gICAgICAgIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkuZ2V0QWN0aXZpdHkoKS5zdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGludGVudCwgbVJlcXVlc3RDb2RlKTsKKyAgICAgICAgUHJlZmVyZW5jZUZyYWdtZW50IG93bmluZ0ZyYWdtZW50ID0gZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKS5nZXRGcmFnbWVudCgpOworICAgICAgICBpZiAob3duaW5nRnJhZ21lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgb3duaW5nRnJhZ21lbnQuc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIG1SZXF1ZXN0Q29kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRQcmVmZXJlbmNlTWFuYWdlcigpLmdldEFjdGl2aXR5KCkuc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIG1SZXF1ZXN0Q29kZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQppbmRleCAyZmJhMWQ3OS4uMTRkNjQ4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQpAQCAtMTcsMjIgKzE3LDMwIEBACiBwYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlckNvbnRyYWN0LkJvb2ttYXJrczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJyb3dzZXJDb250cmFjdC5IaXN0b3J5OworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlckNvbnRyYWN0LlNlYXJjaGVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlOwogCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KIHB1YmxpYyBjbGFzcyBCcm93c2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gImJyb3dzZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIEJPT0tNQVJLU19VUkkgPQotICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL2Jvb2ttYXJrcyIpOworCisgICAgLyoqCisgICAgICogQSB0YWJsZSBjb250YWluaW5nIGJvdGggYm9va21hcmtzIGFuZCBoaXN0b3J5IGl0ZW1zLiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUgYXJlIGRlZmluZWQgaW4KKyAgICAgKiB7QGxpbmsgQm9va21hcmtDb2x1bW5zfS4gUmVhZGluZyB0aGlzIHRhYmxlIHJlcXVpcmVzIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbiBhbmQgd3JpdGluZyB0byBpdAorICAgICAqIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfSBwZXJtaXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIEJPT0tNQVJLU19VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL2Jvb2ttYXJrcyIpOwogCiAgICAgLyoqCiAgICAgICogVGhlIG5hbWUgb2YgZXh0cmEgZGF0YSB3aGVuIHN0YXJ0aW5nIEJyb3dzZXIgd2l0aCBBQ1RJT05fVklFVyBvcgpAQCAtNDksMTIgKzU3LDExIEBACiAgICAgICogYXBwbGljYXRpb24uCiAgICAgICogPHA+CiAgICAgICogVGhlIHZhbHVlIGlzIGEgdW5pcXVlIGlkZW50aWZpY2F0aW9uIHN0cmluZyB0aGF0IHdpbGwgYmUgdXNlZCB0bwotICAgICAqIGluZGVudGlmeSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gVGhlIEJyb3dzZXIgd2lsbCBhdHRlbXB0IHRvIHJldXNlIHRoZQorICAgICAqIGlkZW50aWZ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBUaGUgQnJvd3NlciB3aWxsIGF0dGVtcHQgdG8gcmV1c2UgdGhlCiAgICAgICogc2FtZSB3aW5kb3cgZWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiBsYXVuY2hlcyB0aGUgQnJvd3NlciB3aXRoIHRoZSBzYW1lCiAgICAgICogaWRlbnRpZmllci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BUFBMSUNBVElPTl9JRCA9Ci0gICAgICAgICJjb20uYW5kcm9pZC5icm93c2VyLmFwcGxpY2F0aW9uX2lkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BUFBMSUNBVElPTl9JRCA9ICJjb20uYW5kcm9pZC5icm93c2VyLmFwcGxpY2F0aW9uX2lkIjsKIAogICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIHRoZSBleHRyYSBkYXRhIGluIHRoZSBWSUVXIGludGVudC4gVGhlIGRhdGEgYXJlIGtleS92YWx1ZQpAQCAtNjgsMTAgKzc1LDE3IEBACiAgICAgLyogaWYgeW91IGNoYW5nZSBjb2x1bW4gb3JkZXIgeW91IG11c3QgYWxzbyBjaGFuZ2UgaW5kaWNlcwogICAgICAgIGJlbG93ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBISVNUT1JZX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBCb29rbWFya0NvbHVtbnMuX0lELCBCb29rbWFya0NvbHVtbnMuVVJMLCBCb29rbWFya0NvbHVtbnMuVklTSVRTLAotICAgICAgICBCb29rbWFya0NvbHVtbnMuREFURSwgQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLLCBCb29rbWFya0NvbHVtbnMuVElUTEUsCi0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5GQVZJQ09OLCBCb29rbWFya0NvbHVtbnMuVEhVTUJOQUlMLAotICAgICAgICBCb29rbWFya0NvbHVtbnMuVE9VQ0hfSUNPTiwgQm9va21hcmtDb2x1bW5zLlVTRVJfRU5URVJFRCB9OworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlVSTCwgLy8gMQorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlZJU0lUUywgLy8gMgorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkRBVEUsIC8vIDMKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSywgLy8gNAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlRJVExFLCAvLyA1CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuRkFWSUNPTiwgLy8gNgorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlRIVU1CTkFJTCwgLy8gNworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlRPVUNIX0lDT04sIC8vIDgKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5VU0VSX0VOVEVSRUQsIC8vIDkKKyAgICB9OwogCiAgICAgLyogdGhlc2UgaW5kaWNlcyBkZXBlbmRlbnQgb24gSElTVE9SWV9QUk9KRUNUSU9OICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYID0gMDsKQEAgLTkyLDE5ICsxMDYsMzMgQEAKIAogICAgIC8qIGNvbHVtbnMgbmVlZGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHRydW5jYXRlIGhpc3RvcnkgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5fSUQsIEJvb2ttYXJrQ29sdW1ucy5EQVRFLCB9OworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5EQVRFLAorICAgIH07CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVggPSAwOwogCiAgICAgLyogdHJ1bmNhdGUgdGhpcyBtYW55IGhpc3RvcnkgaXRlbXMgYXQgYSB0aW1lICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJVTkNBVEVfTl9PTERFU1QgPSA1OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgU0VBUkNIRVNfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vYnJvd3Nlci9zZWFyY2hlcyIpOworICAgIC8qKgorICAgICAqIEEgdGFibGUgY29udGFpbmluZyBhIGxvZyBvZiBicm93c2VyIHNlYXJjaGVzLiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUgYXJlIGRlZmluZWQgaW4KKyAgICAgKiB7QGxpbmsgU2VhcmNoQ29sdW1uc30uIFJlYWRpbmcgdGhpcyB0YWJsZSByZXF1aXJlcyB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9IHBlcm1pc3Npb24gYW5kIHdyaXRpbmcgdG8gaXQKKyAgICAgKiByZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBTRUFSQ0hFU19VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL3NlYXJjaGVzIik7CiAKLSAgICAvKiBpZiB5b3UgY2hhbmdlIGNvbHVtbiBvcmRlciB5b3UgbXVzdCBhbHNvIGNoYW5nZSBpbmRpY2VzCi0gICAgICAgYmVsb3cgKi8KKyAgICAvKioKKyAgICAgKiBBIHByb2plY3Rpb24gb2Yge0BsaW5rICNTRUFSQ0hFU19VUkl9IHRoYXQgY29udGFpbnMge0BsaW5rIFNlYXJjaENvbHVtbnMjX0lEfSwKKyAgICAgKiB7QGxpbmsgU2VhcmNoQ29sdW1ucyNTRUFSQ0h9LCBhbmQge0BsaW5rIFNlYXJjaENvbHVtbnMjREFURX0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTRUFSQ0hFU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgU2VhcmNoQ29sdW1ucy5fSUQsIFNlYXJjaENvbHVtbnMuU0VBUkNILCBTZWFyY2hDb2x1bW5zLkRBVEUgfTsKKyAgICAgICAgICAgIC8vIGlmIHlvdSBjaGFuZ2UgY29sdW1uIG9yZGVyIHlvdSBtdXN0IGFsc28gY2hhbmdlIGluZGljZXMgYmVsb3cKKyAgICAgICAgICAgIFNlYXJjaENvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBTZWFyY2hDb2x1bW5zLlNFQVJDSCwgLy8gMQorICAgICAgICAgICAgU2VhcmNoQ29sdW1ucy5EQVRFLCAvLyAyCisgICAgfTsKIAogICAgIC8qIHRoZXNlIGluZGljZXMgZGVwZW5kZW50IG9uIFNFQVJDSEVTX1BST0pFQ1RJT04gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hFU19QUk9KRUNUSU9OX1NFQVJDSF9JTkRFWCA9IDE7CkBAIC0xMjEsOSArMTQ5LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ISVNUT1JZX0NPVU5UID0gMjUwOwogCiAgICAgLyoqCi0gICAgICogIE9wZW4gdGhlIEFkZEJvb2ttYXJrIGFjdGl2aXR5IHRvIHNhdmUgYSBib29rbWFyay4gIExhdW5jaCB3aXRoCi0gICAgICogIGFuZC9vciB1cmwsIHdoaWNoIGNhbiBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHNhdmluZy4KLSAgICAgKiAgQHBhcmFtIGMgICAgICAgIENvbnRleHQgdXNlZCB0byBsYXVuY2ggdGhlIEFkZEJvb2ttYXJrIGFjdGl2aXR5LgorICAgICAqICBPcGVuIGFuIGFjdGl2aXR5IHRvIHNhdmUgYSBib29rbWFyay4gTGF1bmNoIHdpdGggYSB0aXRsZQorICAgICAqICBhbmQvb3IgYSB1cmwsIGJvdGggb2Ygd2hpY2ggY2FuIGJlIGVkaXRlZCBieSB0aGUgdXNlciBiZWZvcmUgc2F2aW5nLgorICAgICAqCisgICAgICogIEBwYXJhbSBjICAgICAgICBDb250ZXh0IHVzZWQgdG8gbGF1bmNoIHRoZSBhY3Rpdml0eSB0byBhZGQgYSBib29rbWFyay4KICAgICAgKiAgQHBhcmFtIHRpdGxlICAgIFRpdGxlIGZvciB0aGUgYm9va21hcmsuIENhbiBiZSBudWxsIG9yIGVtcHR5IHN0cmluZy4KICAgICAgKiAgQHBhcmFtIHVybCAgICAgIFVybCBmb3IgdGhlIGJvb2ttYXJrLiBDYW4gYmUgbnVsbCBvciBlbXB0eSBzdHJpbmcuCiAgICAgICovCkBAIC0xNTIsOCArMTgxLDE1IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhUUkFfU0hBUkVfRkFWSUNPTiA9ICJzaGFyZV9mYXZpY29uIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZW5kU3RyaW5nKENvbnRleHQgYywgU3RyaW5nIHMpIHsKLSAgICAgICAgc2VuZFN0cmluZyhjLCBzLCBjLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZW5kVGV4dCkpOworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgYW4gSW50ZW50IHdpdGgge0BsaW5rIEludGVudCNBQ1RJT05fU0VORH0gYW5kIGEgbWltZSB0eXBlCisgICAgICogb2YgdGV4dC9wbGFpbi4gVGhlIHN0cmluZyBpcyBwdXQgaW50byB7QGxpbmsgSW50ZW50I0VYVFJBX1RFWFR9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdXNlZCB0byBzdGFydCB0aGUgYWN0aXZpdHkKKyAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gc2VuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZW5kU3RyaW5nKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHN0cmluZykgeworICAgICAgICBzZW5kU3RyaW5nKGNvbnRleHQsIHN0cmluZywgY29udGV4dC5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc2VuZFRleHQpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3NCw0OCArMjEwLDQ5IEBACiAgICAgICAgIHNlbmQucHV0RXh0cmEoSW50ZW50LkVYVFJBX1RFWFQsIHN0cmluZ1RvU2VuZCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMuc3RhcnRBY3Rpdml0eShJbnRlbnQuY3JlYXRlQ2hvb3NlcihzZW5kLCBjaG9vc2VyRGlhbG9nVGl0bGUpKTsKKyAgICAgICAgICAgIEludGVudCBpID0gSW50ZW50LmNyZWF0ZUNob29zZXIoc2VuZCwgY2hvb3NlckRpYWxvZ1RpdGxlKTsKKyAgICAgICAgICAgIC8vIEluIGNhc2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBvdXRzaWRlIGFuIEFjdGl2aXR5CisgICAgICAgICAgICBpLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgIGMuc3RhcnRBY3Rpdml0eShpKTsKICAgICAgICAgfSBjYXRjaChhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gaWYgbm8gYXBwIGhhbmRsZXMgaXQsIGRvIG5vdGhpbmcKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB0aGUgYm9va21hcmtzLgorICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB0aGUgYm9va21hcmtzLiBUaGUgY3Vyc29yIHdpbGwgaGF2ZSBhIHNpbmdsZQorICAgICAqICBjb2x1bW4sIHtAbGluayBCb29rbWFya0NvbHVtbnMjVVJMfS4KKyAgICAgKiAgPHA+CiAgICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKgogICAgICAqICBAcGFyYW0gY3IgICBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBnZXRBbGxCb29rbWFya3MoQ29udGVudFJlc29sdmVyIGNyKSB0aHJvd3MgCiAgICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3IucXVlcnkoQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBCb29rbWFya0NvbHVtbnMuVVJMIH0sIAotICAgICAgICAgICAgICAgICJib29rbWFyayA9IDEiLCBudWxsLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEJvb2ttYXJrcy5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBCb29rbWFya3MuVVJMIH0sIAorICAgICAgICAgICAgICAgIEJvb2ttYXJrcy5JU19GT0xERVIgKyAiID0gMCIsIG51bGwsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB2aXNpdGVkIHNpdGUgdXJscy4KKyAgICAgKiAgUmV0dXJuIGEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBhbGwgdmlzaXRlZCBzaXRlIHVybHMuIFRoZSBjdXJzb3Igd2lsbAorICAgICAqICBoYXZlIGEgc2luZ2xlIGNvbHVtbiwge0BsaW5rIEJvb2ttYXJrQ29sdW1ucyNVUkx9LgorICAgICAqICA8cD4KICAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqCiAgICAgICogIEBwYXJhbSBjciAgIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIGdldEFsbFZpc2l0ZWRVcmxzKENvbnRlbnRSZXNvbHZlciBjcikgdGhyb3dzCiAgICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3IucXVlcnkoQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBCb29rbWFya0NvbHVtbnMuVVJMIH0sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICByZXR1cm4gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBIaXN0b3J5LlVSTCB9LCBudWxsLCBudWxsLCBudWxsKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGFkZE9yVXJsRXF1YWxzKFN0cmluZ0J1aWxkZXIgc2IpIHsKICAgICAgICAgc2IuYXBwZW5kKCIgT1IgIiArIEJvb2ttYXJrQ29sdW1ucy5VUkwgKyAiID0gIik7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogIFJldHVybiBhIEN1cnNvciB3aXRoIGFsbCBoaXN0b3J5L2Jvb2ttYXJrcyB0aGF0IGFyZSBzaW1pbGFyIHRvIHVybCwKLSAgICAgKiAgd2hlcmUgc2ltaWxhciBtZWFucyAnaHR0cChzKTovLycgYW5kICd3d3cuJyBhcmUgb3B0aW9uYWwsIGJ1dCB0aGUgcmVzdAotICAgICAqICBvZiB0aGUgdXJsIGlzIHRoZSBzYW1lLgotICAgICAqICBAcGFyYW0gY3IgICBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KLSAgICAgKiAgQHBhcmFtIHVybCAgVGhlIHVybCB0byBjb21wYXJlIHRvLgotICAgICAqICBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIGdldFZpc2l0ZWRMaWtlKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHVybCkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEN1cnNvciBnZXRWaXNpdGVkTGlrZShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyB1cmwpIHsKICAgICAgICAgYm9vbGVhbiBzZWN1cmUgPSBmYWxzZTsKICAgICAgICAgU3RyaW5nIGNvbXBhcmVTdHJpbmcgPSB1cmw7CiAgICAgICAgIGlmIChjb21wYXJlU3RyaW5nLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgewpAQCAtMjI5LDE0ICsyNjYsMTQgQEAKICAgICAgICAgfQogICAgICAgICBTdHJpbmdCdWlsZGVyIHdoZXJlQ2xhdXNlID0gbnVsbDsKICAgICAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICAgICAgd2hlcmVDbGF1c2UgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya0NvbHVtbnMuVVJMICsgIiA9ICIpOworICAgICAgICAgICAgd2hlcmVDbGF1c2UgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya3MuVVJMICsgIiA9ICIpOwogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly8iICsgY29tcGFyZVN0cmluZyk7CiAgICAgICAgICAgICBhZGRPclVybEVxdWFscyh3aGVyZUNsYXVzZSk7CiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcod2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3d3dy4iICsgY29tcGFyZVN0cmluZyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3aGVyZUNsYXVzZSA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrQ29sdW1ucy5VUkwgKyAiID0gIik7CisgICAgICAgICAgICB3aGVyZUNsYXVzZSA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrcy5VUkwgKyAiID0gIik7CiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcod2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJpbmcpOwogICAgICAgICAgICAgYWRkT3JVcmxFcXVhbHMod2hlcmVDbGF1c2UpOwpAQCAtMjUwLDcgKzI4Nyw3IEBACiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcod2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vIiArIHd3d1N0cmluZyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksIEhJU1RPUllfUFJPSkVDVElPTiwKKyAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7IEhpc3RvcnkuX0lELCBIaXN0b3J5LlZJU0lUUyB9LAogICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLnRvU3RyaW5nKCksIG51bGwsIG51bGwpOwogICAgIH0KIApAQCAtMjY2LDI2ICszMDMsMjQgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgdXBkYXRlVmlzaXRlZEhpc3RvcnkoQ29udGVudFJlc29sdmVyIGNyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsLCBib29sZWFuIHJlYWwpIHsKLSAgICAgICAgbG9uZyBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYyA9IGdldFZpc2l0ZWRMaWtlKGNyLCB1cmwpOwogICAgICAgICAgICAgLyogV2Ugc2hvdWxkIG9ubHkgZ2V0IG9uZSBhbnN3ZXIgdGhhdCBpcyBleGFjdGx5IHRoZSBzYW1lLiAqLwogICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVklTSVRTLCBjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludChISVNUT1JZX1BST0pFQ1RJT05fVklTSVRTX0lOREVYKSArIDEpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVklTSVRTLCBjLmdldEludCgxKSArIDEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlVTRVJfRU5URVJFRCwgMSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5VU0VSX0VOVEVSRUQsIDEpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5EQVRFLCBub3cpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24gPSBuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICAgICAgICAgIHsgSW50ZWdlci52YWx1ZU9mKGMuZ2V0SW50KDApKS50b1N0cmluZygpIH07Ci0gICAgICAgICAgICAgICAgY3IudXBkYXRlKEJPT0tNQVJLU19VUkksIG1hcCwgIl9pZCA9ID8iLCBwcm9qZWN0aW9uKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuREFURV9MQVNUX1ZJU0lURUQsIG5vdyk7CisgICAgICAgICAgICAgICAgY3IudXBkYXRlKENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKEhpc3RvcnkuQ09OVEVOVF9VUkksIGMuZ2V0TG9uZygwKSksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cnVuY2F0ZUhpc3RvcnkoY3IpOwotICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CiAgICAgICAgICAgICAgICAgaW50IHZpc2l0czsKICAgICAgICAgICAgICAgICBpbnQgdXNlcl9lbnRlcmVkOwogICAgICAgICAgICAgICAgIGlmIChyZWFsKSB7CkBAIC0yOTUsMTQgKzMzMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICB2aXNpdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICB1c2VyX2VudGVyZWQgPSAxOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5VUkwsIHVybCk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVklTSVRTLCB2aXNpdHMpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkRBVEUsIG5vdyk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuQk9PS01BUkssIDApOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlRJVExFLCB1cmwpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkNSRUFURUQsIDApOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlVTRVJfRU5URVJFRCwgdXNlcl9lbnRlcmVkKTsKLSAgICAgICAgICAgICAgICBjci5pbnNlcnQoQk9PS01BUktTX1VSSSwgbWFwKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVVJMLCB1cmwpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5WSVNJVFMsIHZpc2l0cyk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LkRBVEVfTEFTVF9WSVNJVEVELCBub3cpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5USVRMRSwgdXJsKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuREFURV9DUkVBVEVELCAwKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVVNFUl9FTlRFUkVELCB1c2VyX2VudGVyZWQpOworICAgICAgICAgICAgICAgIGNyLmluc2VydChIaXN0b3J5LkNPTlRFTlRfVVJJLCB2YWx1ZXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAidXBkYXRlVmlzaXRlZEhpc3RvcnkiLCBlKTsKQEAgLTMyMiwxMCArMzU2LDEwIEBACiAgICAgICAgIFN0cmluZ1tdIHN0ciA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAidXJsIgorICAgICAgICAgICAgICAgICAgICBIaXN0b3J5LlVSTCwKICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBjID0gY3IucXVlcnkoQk9PS01BUktTX1VSSSwgcHJvamVjdGlvbiwgInZpc2l0cyA+IDAiLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIGMgPSBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLCBwcm9qZWN0aW9uLCBIaXN0b3J5LlZJU0lUUyArICIgPiAwIiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSByZXR1cm4gbmV3IFN0cmluZ1swXTsKICAgICAgICAgICAgIHN0ciA9IG5ldyBTdHJpbmdbYy5nZXRDb3VudCgpXTsKICAgICAgICAgICAgIGludCBpID0gMDsKICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewpAQCAtMzUzLDMxICszODcsMjkgQEAKICAgICAgKiBAcGFyYW0gY3IgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHRydW5jYXRlSGlzdG9yeShDb250ZW50UmVzb2x2ZXIgY3IpIHsKLSAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICAvLyBUT0RPIG1ha2UgYSBzaW5nbGUgcmVxdWVzdCB0byB0aGUgcHJvdmlkZXIgdG8gZG8gdGhpcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbgorICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgLy8gU2VsZWN0IG5vbi1ib29rbWFyayBoaXN0b3J5LCBvcmRlcmVkIGJ5IGRhdGUKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAiYm9va21hcmsgPSAwIiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkRBVEUpOwotICAgICAgICAgICAgLy8gTG9nLnYoTE9HVEFHLCAiaGlzdG9yeSBjb3VudCAiICsgYy5jb3VudCgpKTsKLSAgICAgICAgICAgIGlmIChjLm1vdmVUb0ZpcnN0KCkgJiYgYy5nZXRDb3VudCgpID49IE1BWF9ISVNUT1JZX0NPVU5UKSB7CisgICAgICAgICAgICBjdXJzb3IgPSBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBIaXN0b3J5Ll9JRCwgSGlzdG9yeS5VUkwsIEhpc3RvcnkuREFURV9MQVNUX1ZJU0lURUQgfSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgSGlzdG9yeS5EQVRFX0xBU1RfVklTSVRFRCArICIgQVNDIik7CisKKyAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvRmlyc3QoKSAmJiBjdXJzb3IuZ2V0Q291bnQoKSA+PSBNQVhfSElTVE9SWV9DT1VOVCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFdlYkljb25EYXRhYmFzZSBpY29uRGIgPSBXZWJJY29uRGF0YWJhc2UuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgICAgICAgICAvKiBlbGltaW5hdGUgb2xkZXN0IGhpc3RvcnkgaXRlbXMgKi8KICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRSVU5DQVRFX05fT0xERVNUOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTG9nLnYoTE9HVEFHLCAidHJ1bmNhdGUgaGlzdG9yeSAiICsKLSAgICAgICAgICAgICAgICAgICAgLy8gYy5nZXRJbnQoVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShCT09LTUFSS1NfVVJJLCAiX2lkID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRJbnQoVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjLm1vdmVUb05leHQoKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChIaXN0b3J5LkNPTlRFTlRfVVJJLCBjdXJzb3IuZ2V0TG9uZygwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGljb25EYi5yZWxlYXNlSWNvbkZvclBhZ2VVcmwoY3Vyc29yLmdldFN0cmluZygxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLm1vdmVUb05leHQoKSkgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAidHJ1bmNhdGVIaXN0b3J5IiwgZSk7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zODgsMjMgKzQyMCwxNyBAQAogICAgICAqIEByZXR1cm4gYm9vbGVhbiAgVHJ1ZSBpZiB0aGUgaGlzdG9yeSBjYW4gYmUgY2xlYXJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FuQ2xlYXJIaXN0b3J5KENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KAotICAgICAgICAgICAgICAgIEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IEJvb2ttYXJrQ29sdW1ucy5fSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuQk9PS01BUkssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMgfSwKLSAgICAgICAgICAgICAgICAiYm9va21hcmsgPSAwIE9SIHZpc2l0cyA+IDAiLCAKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgcmV0ID0gYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgY3Vyc29yID0gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHsgSGlzdG9yeS5fSUQsIEhpc3RvcnkuVklTSVRTIH0sCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZXQgPSBjdXJzb3IuZ2V0Q291bnQoKSA+IDA7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJjYW5DbGVhckhpc3RvcnkiLCBlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC00MjAsNjcgKzQ0NiwzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBkZWxldGUgYWxsIGhpc3RvcnkgaXRlbXMgYW5kIHJldmVydCBhbGwKLSAgICAgKiBib29rbWFya3MgdG8gemVybyB2aXNpdHMgd2hpY2ggbWVldCB0aGUgY3JpdGVyaWEgcHJvdmlkZWQuCi0gICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30KLSAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGVsZXRlIGFsbCBoaXN0b3J5IGl0ZW1zIGFuZCByZWxlYXNlIHRoZSBpY29ucyBmb3IgdGhlbSBpbiB0aGUKKyAgICAgKiB7QGxpbmsgV2ViSWNvbkRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKiBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqCiAgICAgICogQHBhcmFtIGNyICAgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCiAgICAgICogQHBhcmFtIHdoZXJlQ2xhdXNlICAgU3RyaW5nIHRvIGxpbWl0IHRoZSBpdGVtcyBhZmZlY3RlZC4KICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBudWxsIG1lYW5zIGFsbCBpdGVtcy4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGRlbGV0ZUhpc3RvcnlXaGVyZShDb250ZW50UmVzb2x2ZXIgY3IsCi0gICAgICAgICAgICBTdHJpbmcgd2hlcmVDbGF1c2UpIHsKLSAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgZGVsZXRlSGlzdG9yeVdoZXJlKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHdoZXJlQ2xhdXNlKSB7CisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgSElTVE9SWV9QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICBjdXJzb3IgPSBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLCBuZXcgU3RyaW5nW10geyBIaXN0b3J5LlVSTCB9LCB3aGVyZUNsYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBXZWJJY29uRGF0YWJhc2UgaWNvbkRiID0gV2ViSWNvbkRhdGFiYXNlLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIGZhdmljb25zLCBhbmQgcmV2ZXJ0IGJvb2ttYXJrcyB3aGljaCBoYXZlIGJlZW4gdmlzaXRlZAotICAgICAgICAgICAgICAgICAqIHRvIHNpbXBseSBib29rbWFya3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RUaW1lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBjLmdldFN0cmluZyhISVNUT1JZX1BST0pFQ1RJT05fVVJMX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Jvb2ttYXJrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0SW50KEhJU1RPUllfUFJPSkVDVElPTl9CT09LTUFSS19JTkRFWCkgPT0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQm9va21hcmspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgT1IgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiggX2lkID0gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYy5nZXRJbnQoMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgKSIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkRiLnJlbGVhc2VJY29uRm9yUGFnZVVybCh1cmwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAvLyBEZWxldGUgZmF2aWNvbnMKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBkb24ndCByZWxlYXNlIGlmIHRoZSBVUkwgaXMgYm9va21hcmtlZAorICAgICAgICAgICAgICAgICAgICBpY29uRGIucmVsZWFzZUljb25Gb3JQYWdlVXJsKGN1cnNvci5nZXRTdHJpbmcoMCkpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci5tb3ZlVG9OZXh0KCkpOwogCi0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsIDApOwotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5EQVRFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IFNob3VsZCBJIGFsc28gcmVtb3ZlIHRoZSB0aXRsZT8gKi8KLSAgICAgICAgICAgICAgICAgICAgY3IudXBkYXRlKEJPT0tNQVJLU19VUkksIG1hcCwgc2IudG9TdHJpbmcoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGRlbGV0ZVdoZXJlQ2xhdXNlID0gQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLICsgIiA9IDAiOwotICAgICAgICAgICAgICAgIGlmICh3aGVyZUNsYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZVdoZXJlQ2xhdXNlICs9ICIgQU5EICIgKyB3aGVyZUNsYXVzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3IuZGVsZXRlKEJPT0tNQVJLU19VUkksIGRlbGV0ZVdoZXJlQ2xhdXNlLCBudWxsKTsKKyAgICAgICAgICAgICAgICBjci5kZWxldGUoSGlzdG9yeS5DT05URU5UX1VSSSwgd2hlcmVDbGF1c2UsIG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiZGVsZXRlSGlzdG9yeVdoZXJlIiwgZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MjAsMTAgKzUxNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGRlbGV0ZUZyb21IaXN0b3J5KENvbnRlbnRSZXNvbHZlciBjciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrQ29sdW1ucy5VUkwgKyAiID0gIik7Ci0gICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyhzYiwgdXJsKTsKLSAgICAgICAgU3RyaW5nIG1hdGNoZXNVcmwgPSBzYi50b1N0cmluZygpOwotICAgICAgICBkZWxldGVIaXN0b3J5V2hlcmUoY3IsIG1hdGNoZXNVcmwpOworICAgICAgICBjci5kZWxldGUoSGlzdG9yeS5DT05URU5UX1VSSSwgSGlzdG9yeS5VUkwgKyAiPT8iLCBuZXcgU3RyaW5nW10geyB1cmwgfSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MzQsMzAgKzUyNiwxMyBAQAogICAgICAqIEBwYXJhbSBzZWFyY2ggICAgVGhlIHN0cmluZyB0byBhZGQgdG8gdGhlIHNlYXJjaGVzIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhZGRTZWFyY2hVcmwoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgc2VhcmNoKSB7Ci0gICAgICAgIGxvbmcgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICBTRUFSQ0hFU19VUkksCi0gICAgICAgICAgICAgICAgU0VBUkNIRVNfUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICBTRUFSQ0hFU19XSEVSRV9DTEFVU0UsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IHNlYXJjaCB9LAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgbWFwLnB1dChTZWFyY2hDb2x1bW5zLlNFQVJDSCwgc2VhcmNoKTsKLSAgICAgICAgICAgIG1hcC5wdXQoU2VhcmNoQ29sdW1ucy5EQVRFLCBub3cpOwotICAgICAgICAgICAgLyogV2Ugc2hvdWxkIG9ubHkgZ2V0IG9uZSBhbnN3ZXIgdGhhdCBpcyBleGFjdGx5IHRoZSBzYW1lLiAqLwotICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIGNyLnVwZGF0ZShTRUFSQ0hFU19VUkksIG1hcCwgIl9pZCA9ICIgKyBjLmdldEludCgwKSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNyLmluc2VydChTRUFSQ0hFU19VUkksIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dUQUcsICJhZGRTZWFyY2hVcmwiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKLSAgICAgICAgfQorICAgICAgICAvLyBUaGUgY29udGVudCBwcm92aWRlciB3aWxsIHRha2UgY2FyZSBvZiB1cGRhdGluZyBleGlzdGluZyBzZWFyY2hlcyBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWVzLnB1dChTZWFyY2hlcy5TRUFSQ0gsIHNlYXJjaCk7CisgICAgICAgIHZhbHVlcy5wdXQoU2VhcmNoZXMuREFURSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBjci5pbnNlcnQoU2VhcmNoZXMuQ09OVEVOVF9VUkksIHZhbHVlcyk7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIGFsbCBzZWFyY2hlcyBmcm9tIHRoZSBzZWFyY2ggZGF0YWJhc2UuCiAgICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9CkBAIC01NjcsNyArNTQyLDcgQEAKICAgICAgICAgLy8gRklYTUU6IFNob3VsZCB0aGlzIGNsZWFyIHRoZSB1cmxzIHRvIHdoaWNoIHRoZXNlIHNlYXJjaGVzIGxlYWQ/CiAgICAgICAgIC8vIChpLmUuIHJlbW92ZSBnb29nbGUuY29tL3F1ZXJ5PSBibGFoIGJsYWggYmxhaCkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyLmRlbGV0ZShTRUFSQ0hFU19VUkksIG51bGwsIG51bGwpOworICAgICAgICAgICAgY3IuZGVsZXRlKFNlYXJjaGVzLkNPTlRFTlRfVVJJLCBudWxsLCBudWxsKTsKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImNsZWFyU2VhcmNoZXMiLCBlKTsKICAgICAgICAgfQpAQCAtNTg2LDM1ICs1NjEsOTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVxdWVzdEFsbEljb25zKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHdoZXJlLAogICAgICAgICAgICAgV2ViSWNvbkRhdGFiYXNlLkljb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBXZWJJY29uRGF0YWJhc2UuZ2V0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5idWxrUmVxdWVzdEljb25Gb3JQYWdlVXJsKGNyLCB3aGVyZSwgbGlzdGVuZXIpOworICAgICAgICBXZWJJY29uRGF0YWJhc2UuZ2V0SW5zdGFuY2UoKS5idWxrUmVxdWVzdEljb25Gb3JQYWdlVXJsKGNyLCB3aGVyZSwgbGlzdGVuZXIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbHVtbiBkZWZpbml0aW9ucyBmb3IgdGhlIG1peGVkIGJvb2ttYXJrIGFuZCBoaXN0b3J5IGl0ZW1zIGF2YWlsYWJsZQorICAgICAqIGF0IHtAbGluayAjQk9PS01BUktTX1VSSX0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb29rbWFya0NvbHVtbnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBib29rbWFyayBvciBoaXN0b3J5IGl0ZW0uCisgICAgICAgICAqIDxwPlR5cGU6IFRFWFQgKFVSTCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiB0aW1lIHRoZSBpdGVtIGhhcyBiZWVuIHZpc2l0ZWQuCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUjwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lUUyA9ICJ2aXNpdHMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgaXRlbSB3YXMgbGFzdCB2aXNpdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFID0gImRhdGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCBhbiBpdGVtIGlzIGEgYm9va21hcmsuIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgYSBib29rbWFyaywgYSB2YWx1ZQorICAgICAgICAgKiBvZiAwIGluZGljYXRlcyBhIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSSyA9ICJib29rbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIHZpc2libGUgdGl0bGUgb2YgdGhlIGJvb2ttYXJrIG9yIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogVEVYVDwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIGl0ZW0gY3JlYXRlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSIChkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzApPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFRCA9ICJjcmVhdGVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZhdmljb24gb2YgdGhlIGJvb2ttYXJrLiBNdXN0IGRlY29kZSB2aWEge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlQnl0ZUFycmF5fS4KKyAgICAgICAgICogPHA+VHlwZTogQkxPQiAoaW1hZ2UpPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWSUNPTiA9ICJmYXZpY29uIjsKKwogICAgICAgICAvKioKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CTkFJTCA9ICJ0aHVtYm5haWwiOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9VQ0hfSUNPTiA9ICJ0b3VjaF9pY29uIjsKKwogICAgICAgICAvKioKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfRU5URVJFRCA9ICJ1c2VyX2VudGVyZWQiOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbHVtbiBkZWZpbml0aW9ucyBmb3IgdGhlIHNlYXJjaCBoaXN0b3J5IHRhYmxlLCBhdmFpbGFibGUgYXQge0BsaW5rICNTRUFSQ0hFU19VUkl9LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VhcmNoQ29sdW1ucyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBkZXByZWNhdGVkIE5vdCB1c2VkLgorICAgICAgICAgKi8KKyAgICAgICAgQERlcHJlY2F0ZWQKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIGVudGVyZWQgc2VhcmNoIHRlcm0uCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0ggPSAic2VhcmNoIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIHNlYXJjaCB3YXMgcGVyZm9ybWVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFID0gImRhdGUiOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXJDb250cmFjdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3NlckNvbnRyYWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiYzQxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXJDb250cmFjdC5qYXZhCkBAIC0wLDAgKzEsNTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEJyb3dzZXJDb250cmFjdCB7CisgICAgLyoqIFRoZSBhdXRob3JpdHkgZm9yIHRoZSBicm93c2VyIHByb3ZpZGVyICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5hbmRyb2lkLmJyb3dzZXIiOworCisgICAgLyoqIEEgY29udGVudDovLyBzdHlsZSB1cmkgdG8gdGhlIGF1dGhvcml0eSBmb3IgdGhlIGJyb3dzZXIgcHJvdmlkZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBBVVRIT1JJVFlfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSk7CisKKyAgICAvKioKKyAgICAgKiBBbiBvcHRpb25hbCBpbnNlcnQsIHVwZGF0ZSBvciBkZWxldGUgVVJJIHBhcmFtZXRlciB0aGF0IGFsbG93cyB0aGUgY2FsbGVyCisgICAgICogdG8gc3BlY2lmeSB0aGF0IGl0IGlzIGEgc3luYyBhZGFwdGVyLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gSWYgdHJ1ZQorICAgICAqIHRoZSBkaXJ0eSBmbGFnIGlzIG5vdCBhdXRvbWF0aWNhbGx5IHNldCBhbmQgdGhlICJzeW5jVG9OZXR3b3JrIiBwYXJhbWV0ZXIKKyAgICAgKiBpcyBzZXQgdG8gZmFsc2Ugd2hlbiBjYWxsaW5nCisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNub3RpZnlDaGFuZ2UoYW5kcm9pZC5uZXQuVXJpLCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciwgYm9vbGVhbil9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTExFUl9JU19TWU5DQURBUFRFUiA9ICJjYWxsZXJfaXNfc3luY2FkYXB0ZXIiOworCisgICAgLyoqCisgICAgICogQSBwYXJhbWV0ZXIgZm9yIHVzZSB3aGVuIHF1ZXJ5aW5nIGFueSB0YWJsZSB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIGEgbGltaXQgb24gdGhlIG51bWJlcgorICAgICAqIG9mIHJvd3MgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTElNSVQgPSAibGltaXQiOworCisgICAgLyoqCisgICAgICogR2VuZXJpYyBjb2x1bW5zIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZgorICAgICAqIHRoZXNlIGNvbHVtbnMgYXJlIHByaXZhdGUgdG8gdGhlIHN5bmMgYWRhcHRlci4gT3RoZXIgY2xpZW50cyBvZiB0aGUgQVBJCisgICAgICogc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGVpdGhlciByZWFkIG9yIHdyaXRlIHRoZXNlIGNvbHVtbnMuCisgICAgICovCisgICAgaW50ZXJmYWNlIEJhc2VTeW5jQ29sdW1ucyB7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMxID0gInN5bmMxIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzIgPSAic3luYzIiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMyA9ICJzeW5jMyI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM0ID0gInN5bmM0IjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzUgPSAic3luYzUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGRlZmluaXRpb25zIGZvciB1c2UgaW4gaW1wbGVtZW50aW5nIGNocm9tZSBib29rbWFya3Mgc3luYyBpbiB0aGUgQm9va21hcmtzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2hyb21lU3luY0NvbHVtbnMgeworICAgICAgICBwcml2YXRlIENocm9tZVN5bmNDb2x1bW5zKCkge30KKworICAgICAgICAvKiogVGhlIHNlcnZlciB1bmlxdWUgSUQgZm9yIGFuIGl0ZW0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1VOSVFVRSA9IEJhc2VTeW5jQ29sdW1ucy5TWU5DMzsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9ST09UID0gImdvb2dsZV9jaHJvbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9CT09LTUFSS1MgPSAiZ29vZ2xlX2Nocm9tZV9ib29rbWFya3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9CT09LTUFSS1NfQkFSID0gImJvb2ttYXJrX2JhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9OQU1FX09USEVSX0JPT0tNQVJLUyA9ICJvdGhlcl9ib29rbWFya3MiOworCisgICAgICAgIC8qKiBUaGUgY2xpZW50IHVuaXF1ZSBJRCBmb3IgYW4gaXRlbSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfVU5JUVVFID0gQmFzZVN5bmNDb2x1bW5zLlNZTkM0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgdGhhdCBhcHBlYXIgd2hlbiBlYWNoIHJvdyBvZiBhIHRhYmxlIGJlbG9uZ3MgdG8gYSBzcGVjaWZpYworICAgICAqIGFjY291bnQsIGluY2x1ZGluZyBzeW5jIGluZm9ybWF0aW9uIHRoYXQgYW4gYWNjb3VudCBtYXkgbmVlZC4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgU3luY0NvbHVtbnMgZXh0ZW5kcyBCYXNlU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudF9uYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9OQU1FfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50X3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgcm93IHRvIGl0cyBzb3VyY2UgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9JRCA9ICJzb3VyY2VpZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZlcnNpb24gbnVtYmVyIHRoYXQgaXMgdXBkYXRlZCB3aGVuZXZlciB0aGlzIHJvdyBvciBpdHMgcmVsYXRlZCBkYXRhCisgICAgICAgICAqIGNoYW5nZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB7QGxpbmsgI1ZFUlNJT059IGhhcyBjaGFuZ2VkLCBhbmQgdGhpcyByb3cgbmVlZHMKKyAgICAgICAgICogdG8gYmUgc3luY2hyb25pemVkIGJ5IGl0cyBvd25pbmcgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJUWSA9ICJkaXJ0eSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoYXQgdGhpcyByb3cgd2FzIGxhc3QgbW9kaWZpZWQgYnkgYSBjbGllbnQgKG1zZWNzIHNpbmNlIHRoZSBlcG9jaCkuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX01PRElGSUVEID0gIm1vZGlmaWVkIjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ29tbW9uQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfSUQgPSAiX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBvZiB0aGUgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgdmlzaWJsZSB0aXRsZSBvZiB0aGUgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJ0aXRsZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoYXQgdGhpcyByb3cgd2FzIGNyZWF0ZWQgb24gaXRzIG9yaWdpbmF0aW5nIGNsaWVudCAobXNlY3MKKyAgICAgICAgICogc2luY2UgdGhlIGVwb2NoKS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJjcmVhdGVkIjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSW1hZ2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBmYXZpY29uIG9mIHRoZSBib29rbWFyaywgbWF5IGJlIE5VTEwuCisgICAgICAgICAqIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVZJQ09OID0gImZhdmljb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHRodW1ibmFpbCBvZiB0aGUgcGFnZSxtYXkgYmUgTlVMTC4KKyAgICAgICAgICogTXVzdCBkZWNvZGUgdmlhIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZUJ5dGVBcnJheX0uCisgICAgICAgICAqIDxwPlR5cGU6IEJMT0IgKGltYWdlKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CTkFJTCA9ICJ0aHVtYm5haWwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdG91Y2ggaWNvbiBmb3IgdGhlIHdlYiBwYWdlLCBtYXkgYmUgTlVMTC4KKyAgICAgICAgICogTXVzdCBkZWNvZGUgdmlhIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZUJ5dGVBcnJheX0uCisgICAgICAgICAqIDxwPlR5cGU6IEJMT0IgKGltYWdlKTwvcD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVUNIX0lDT04gPSAidG91Y2hfaWNvbiI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEhpc3RvcnlDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBpdGVtIHdhcyBsYXN0IHZpc2l0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IElOVEVHRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0xBU1RfVklTSVRFRCA9ICJkYXRlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgaXRlbSBoYXMgYmVlbiB2aXNpdGVkLgorICAgICAgICAgKiA8cD5UeXBlOiBJTlRFR0VSPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSVRTID0gInZpc2l0cyI7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9FTlRFUkVEID0gInVzZXJfZW50ZXJlZCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJvb2ttYXJrcyB0YWJsZSwgd2hpY2ggaG9sZHMgdGhlIHVzZXIncyBicm93c2VyIGJvb2ttYXJrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJvb2ttYXJrcyBpbXBsZW1lbnRzIENvbW1vbkNvbHVtbnMsIEltYWdlQ29sdW1ucywgU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEJvb2ttYXJrcygpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAiYm9va21hcmtzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhlIGRlZmF1bHQgZm9sZGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSV9ERUZBVUxUX0ZPTERFUiA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQ09OVEVOVF9VUkksICJmb2xkZXIiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcnkgcGFyYW1ldGVyIHVzZWQgdG8gc3BlY2lmeSBhbiBhY2NvdW50IG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0FDQ09VTlRfTkFNRSA9ICJhY2N0X25hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWVyeSBwYXJhbWV0ZXIgdXNlZCB0byBzcGVjaWZ5IGFuIGFjY291bnQgdHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQUNDT1VOVF9UWVBFID0gImFjY3RfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkcyBhIFVSSSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtIGZvbGRlcklkIHRoZSBJRCBvZiB0aGUgZm9sZGVyIHRvIHBvaW50IHRvCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBidWlsZEZvbGRlclVyaShsb25nIGZvbGRlcklkKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoQ09OVEVOVF9VUklfREVGQVVMVF9GT0xERVIsIGZvbGRlcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9IHByb3ZpZGluZyBhIGRpcmVjdG9yeSBvZiBib29rbWFya3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9ib29rbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvZiBhIHNpbmdsZSBib29rbWFyay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL2Jvb2ttYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcnkgcGFyYW1ldGVyIHRvIHVzZSBpZiB5b3Ugd2FudCB0byBzZWUgZGVsZXRlZCBib29rbWFya3MgdGhhdCBhcmUgc3RpbGwKKyAgICAgICAgICogYXJvdW5kIG9uIHRoZSBkZXZpY2UgYW5kIGhhdmVuJ3QgYmVlbiBzeW5jZWQgeWV0LgorICAgICAgICAgKiBAc2VlICNJU19ERUxFVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9QQVJBTUVURVJfU0hPV19ERUxFVEVEID0gInNob3dfZGVsZXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyBpZiBhbiBpdGVtIGlzIGEgZm9sZGVyIG9yIGJvb2ttYXJrLiBOb24temVybyB2YWx1ZXMgaW5kaWNhdGUKKyAgICAgICAgICogYSBmb2xkZXIgYW5kIHplcm8gaW5kaWNhdGVzIGEgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfRk9MREVSID0gImZvbGRlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgcGFyZW50IGZvbGRlci4gSUQgMCBpcyB0aGUgcm9vdCBmb2xkZXIuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKHJlZmVyZW5jZSB0byBpdGVtIGluIHRoZSBzYW1lIHRhYmxlKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVCA9ICJwYXJlbnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc291cmNlIElEIGZvciBhbiBpdGVtJ3MgcGFyZW50LiBSZWFkLW9ubHkuCisgICAgICAgICAqIEBzZWUgI1BBUkVOVAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX1NPVVJDRV9JRCA9ICJwYXJlbnRfc291cmNlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBib29rbWFyayBpbiByZWxhdGlvbiB0byBpdCdzIHNpYmxpbmdzIHRoYXQgc2hhcmUgdGhlIHNhbWUKKyAgICAgICAgICoge0BsaW5rICNQQVJFTlR9LiBNYXkgYmUgbmVnYXRpdmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NJVElPTiA9ICJwb3NpdGlvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpdGVtIHRoYXQgdGhlIGJvb2ttYXJrIHNob3VsZCBiZSBpbnNlcnRlZCBhZnRlci4KKyAgICAgICAgICogTWF5IGJlIG5lZ2F0aXZlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX0FGVEVSID0gImluc2VydF9hZnRlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzb3VyY2UgSUQgZm9yIHRoZSBpdGVtIHRoYXQgdGhlIGJvb2ttYXJrIHNob3VsZCBiZSBpbnNlcnRlZCBhZnRlci4gUmVhZC1vbmx5LgorICAgICAgICAgKiBNYXkgYmUgbmVnYXRpdmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqIEBzZWUgI0lOU0VSVF9BRlRFUgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX0FGVEVSX1NPVVJDRV9JRCA9ICJpbnNlcnRfYWZ0ZXJfc291cmNlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBmbGFnIHRvIGluZGljYXRlIGlmIGFuIGl0ZW0gaGFzIGJlZW4gZGVsZXRlZC4gUXVlcmllcyB3aWxsIG5vdCByZXR1cm4gZGVsZXRlZAorICAgICAgICAgKiBlbnRyaWVzIHVubGVzcyB5b3UgYWRkIHRoZSB7QGxpbmsgI1FVRVJZX1BBUkFNRVRFUl9TSE9XX0RFTEVURUR9IHF1ZXJ5IHBhcmFtdGVyCisgICAgICAgICAqIHRvIHRoZSBVUkkgd2hlbiBwZXJmb3JtaW5nIHlvdXIgcXVlcnkuCisgICAgICAgICAqIDxwPlR5cGU6IElOVEVHRVIgKG5vbi16ZXJvIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGRlbGV0ZWQsIHplcm8gaWYgaXQgaGFzbid0KQorICAgICAgICAgKiBAc2VlICNRVUVSWV9QQVJBTUVURVJfU0hPV19ERUxFVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19ERUxFVEVEID0gImRlbGV0ZWQiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQtb25seSB0YWJsZSB0aGF0IGxpc3RzIGFsbCB0aGUgYWNjb3VudHMgdGhhdCBhcmUgdXNlZCB0byBwcm92aWRlIGJvb2ttYXJrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFjY291bnRzIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpcmVjdG9yeSB1bmRlciB7QGxpbmsgQm9va21hcmtzI0NPTlRFTlRfVVJJfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICAgICAgICAgIEFVVEhPUklUWV9VUkkuYnVpbGRVcG9uKCkuYXBwZW5kUGF0aCgiYWNjb3VudHMiKS5idWlsZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhpc3RvcnkgdGFibGUsIHdoaWNoIGhvbGRzIHRoZSBicm93c2luZyBoaXN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSGlzdG9yeSBpbXBsZW1lbnRzIENvbW1vbkNvbHVtbnMsIEhpc3RvcnlDb2x1bW5zLCBJbWFnZUNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEhpc3RvcnkoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImhpc3RvcnkiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YgYnJvd3NlciBoaXN0b3J5IGl0ZW1zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvYnJvd3Nlci1oaXN0b3J5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9mIGEgc2luZ2xlIGJyb3dzZXIgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vYnJvd3Nlci1oaXN0b3J5IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VhcmNoIGhpc3RvcnkgdGFibGUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlYXJjaGVzIHsKKyAgICAgICAgcHJpdmF0ZSBTZWFyY2hlcygpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAic2VhcmNoZXMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YgYnJvd3NlciBzZWFyY2ggaXRlbXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9zZWFyY2hlcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvZiBhIHNpbmdsZSBicm93c2VyIHNlYXJjaCBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vc2VhcmNoZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfSUQgPSAiX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgZW50ZXJlZCBzZWFyY2ggdGVybS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSCA9ICJzZWFyY2giOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgc2VhcmNoIHdhcyBwZXJmb3JtZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiZGF0ZSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWJsZSBwcm92aWRlZCBmb3Igc3luYyBhZGFwdGVycyB0byB1c2UgZm9yIHN0b3JpbmcgcHJpdmF0ZSBzeW5jIHN0YXRlIGRhdGEuCisgICAgICoKKyAgICAgKiBAc2VlIFN5bmNTdGF0ZUNvbnRyYWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTeW5jU3RhdGUgaW1wbGVtZW50cyBTeW5jU3RhdGVDb250cmFjdC5Db2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN5bmNTdGF0ZSgpIHt9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPQorICAgICAgICAgICAgICAgIFN5bmNTdGF0ZUNvbnRyYWN0LkNvbnN0YW50cy5DT05URU5UX0RJUkVDVE9SWTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgQ09OVEVOVF9ESVJFQ1RPUlkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFuZHJvaWQucHJvdmlkZXIuU3luY1N0YXRlQ29udHJhY3QuSGVscGVycyNnZXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldChDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIEFjY291bnQgYWNjb3VudCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLmdldChwcm92aWRlciwgQ09OVEVOVF9VUkksIGFjY291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI2dldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBQYWlyPFVyaSwgYnl0ZVtdPiBnZXRXaXRoVXJpKENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgQWNjb3VudCBhY2NvdW50KQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIFN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMuZ2V0V2l0aFVyaShwcm92aWRlciwgQ09OVEVOVF9VUkksIGFjY291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI3NldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIEFjY291bnQgYWNjb3VudCwgYnl0ZVtdIGRhdGEpCisgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLnNldChwcm92aWRlciwgQ09OVEVOVF9VUkksIGFjY291bnQsIGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI25ld1NldE9wZXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gbmV3U2V0T3BlcmF0aW9uKEFjY291bnQgYWNjb3VudCwgYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLm5ld1NldE9wZXJhdGlvbihDT05URU5UX1VSSSwgYWNjb3VudCwgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgaW1hZ2VzIGZvciBVUkxzLiBPbmx5IHN1cHBvcnQgcXVlcnkoKSBhbmQgdXBkYXRlKCkuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEltYWdlcyBpbXBsZW1lbnRzIEltYWdlQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHV0aWxpdHkgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBJbWFnZXMoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImltYWdlcyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIHRoZSBpbWFnZXMgY2FtZSBmcm9tLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybF9rZXkiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29tYmluZWQgdmlldyBvZiBib29rbWFya3MgYW5kIGhpc3RvcnkuIEFsbCBib29rbWFya3MgaW4gYWxsIGZvbGRlcnMgYXJlIGluY2x1ZGVkIGFuZAorICAgICAqIG5vIGZvbGRlcnMgYXJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29tYmluZWQgaW1wbGVtZW50cyBDb21tb25Db2x1bW5zLCBIaXN0b3J5Q29sdW1ucywgSW1hZ2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIENvbWJpbmVkKCkge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKEFVVEhPUklUWV9VUkksICJjb21iaW5lZCIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCBhbiBpdGVtIGlzIGEgYm9va21hcmsuIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgYSBib29rbWFyaywgYSB2YWx1ZQorICAgICAgICAgKiBvZiAwIGluZGljYXRlcyBhIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19CT09LTUFSSyA9ICJib29rbWFyayI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWJsZSB0aGF0IHN0b3JlcyBzZXR0aW5ncyBzcGVjaWZpYyB0byB0aGUgYnJvd3Nlci4gT25seSBzdXBwb3J0IHF1ZXJ5IGFuZCBpbnNlcnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXR0aW5ncyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHV0aWxpdHkgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTZXR0aW5ncygpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAic2V0dGluZ3MiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogS2V5IGZvciBhIHNldHRpbmcgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSAia2V5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVmFsdWUgZm9yIGEgc2V0dGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogSWYgc2V0IHRvIG5vbi0wIHRoZSB1c2VyIGhhcyBvcHRlZCBpbnRvIGJvb2ttYXJrIHN5bmMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1lOQ19FTkFCTEVEID0gInN5bmNfZW5hYmxlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBib29rbWFyayBzeW5jIGlzIGVuYWJsZWQKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc1N5bmNFbmFibGVkKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGN1cnNvciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7IFZBTFVFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBLRVkgKyAiPT8iLCBuZXcgU3RyaW5nW10geyBLRVlfU1lOQ19FTkFCTEVEIH0sIG51bGwpOworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCB8fCAhY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldEludCgwKSAhPSAwOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGJvb2ttYXJrIHN5bmMgZW5hYmxlZCBzZXR0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHB1YmxpYyB2b2lkIHNldFN5bmNFbmFibGVkKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KEtFWSwgS0VZX1NZTkNfRU5BQkxFRCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KFZBTFVFLCBlbmFibGVkID8gMSA6IDApOworICAgICAgICAgICAgY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5pbnNlcnQoQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQppbmRleCA2MzU1YTljLi44OGNlMGYwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKQEAgLTc2LDExICs3NiwxMDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMRVJfSVNfU1lOQ0FEQVBURVIgPSAiY2FsbGVyX2lzX3N5bmNhZGFwdGVyIjsKIAorCisgICAgLyoqCisgICAgICogR2VuZXJpYyBjb2x1bW5zIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZgorICAgICAqIHRoZXNlIGNvbHVtbnMgYXJlIHByaXZhdGUgdG8gdGhlIHN5bmMgYWRhcHRlci4gT3RoZXIgY2xpZW50cyBvZiB0aGUgQVBJCisgICAgICogc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGVpdGhlciByZWFkIG9yIHdyaXRlIHRoaXMgY29sdW1uLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgQmFzZVN5bmNDb2x1bW5zIHsKKworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMSA9ICJzeW5jMSI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMyID0gInN5bmMyIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzMgPSAic3luYzMiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DNCA9ICJzeW5jNCI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM1ID0gInN5bmM1IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZvciBTeW5jIGluZm9ybWF0aW9uIHVzZWQgYnkgQ2FsZW5kYXJzIGFuZCBFdmVudHMgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgU3luY0NvbHVtbnMgZXh0ZW5kcyBCYXNlU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVCA9ICJfc3luY19hY2NvdW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVF9UWVBFID0gIl9zeW5jX2FjY291bnRfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93IGFzc2lnbmVkIGJ5IHRoZSBzeW5jIHNvdXJjZS4gTlVMTCBpZiB0aGUgcm93IGhhcyBuZXZlciBiZWVuIHN5bmNlZC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0lEID0gIl9zeW5jX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxhc3QgdGltZSwgZnJvbSB0aGUgc3luYyBzb3VyY2UncyBwb2ludCBvZiB2aWV3LCB0aGF0IHRoaXMgcm93IGhhcyBiZWVuIHN5bmNocm9uaXplZC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19USU1FID0gIl9zeW5jX3RpbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm93LCBhcyBhc3NpZ25lZCBieSB0aGUgc2VydmVyLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVkVSU0lPTiA9ICJfc3luY192ZXJzaW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIHVzZSBieSBzeW5jIGFkYXB0ZXIgYXQgaXRzIGRpc2NyZXRpb247IG5vdCBtb2RpZmllZCBieSBDYWxlbmRhclByb3ZpZGVyCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbHVtbiB3YXMgZm9ybWVybHkgbmFtZWQgX1NZTkNfTE9DQUxfSUQuICBXZSBhcmUgdXNpbmcgaXQgdG8gYXZvaWQgYQorICAgICAgICAgKiBzY2hlbWEgY2hhbmdlLgorICAgICAgICAgKiBUT0RPIFJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBtb3JlIGdlbmVyYWwgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19EQVRBID0gIl9zeW5jX2xvY2FsX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCBvbmx5IGluIHBlcnNpc3RlbnQgcHJvdmlkZXJzLCBhbmQgb25seSBkdXJpbmcgbWVyZ2luZy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19NQVJLID0gIl9zeW5jX21hcmsiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbG9jYWwsIHVuc3luY2VkLCBjaGFuZ2VzIGFyZSBwcmVzZW50LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RJUlRZID0gIl9zeW5jX2RpcnR5IjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQWNjb3VudCBpbmZvcm1hdGlvbiB1c2VkIGJ5IENhbGVuZGFycyBhbmQgRXZlbnRzIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEFjY291bnRDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb2x1bW5zIGZyb20gdGhlIENhbGVuZGFycyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyc0NvbHVtbnMKLSAgICB7CisgICAgcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoY29sb3IgdmFsdWUpPC9QPgpAQCAtMTM1LDc1ICsyMzAsMTAzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfU1RBVEUgPSAic3luY19zdGF0ZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICogV2hldGhlciB0aGUgcm93IGhhcyBiZWVuIGRlbGV0ZWQuICBBIGRlbGV0ZWQgcm93IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlQgPSAiX3N5bmNfYWNjb3VudCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlRfVFlQRSA9ICJfc3luY19hY2NvdW50X3R5cGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdyBhc3NpZ25lZCBieSB0aGUgc3luYyBzb3VyY2UuIE5VTEwgaWYgdGhlIHJvdyBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19JRCA9ICJfc3luY19pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBsYXN0IHRpbWUsIGZyb20gdGhlIHN5bmMgc291cmNlJ3MgcG9pbnQgb2YgdmlldywgdGhhdCB0aGlzIHJvdyBoYXMgYmVlbiBzeW5jaHJvbml6ZWQuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVElNRSA9ICJfc3luY190aW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHJvdywgYXMgYXNzaWduZWQgYnkgdGhlIHNlcnZlci4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1ZFUlNJT04gPSAiX3N5bmNfdmVyc2lvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uOyBub3QgbW9kaWZpZWQgYnkgQ2FsZW5kYXJQcm92aWRlcgotICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2x1bW4gd2FzIGZvcm1lcmx5IG5hbWVkIF9TWU5DX0xPQ0FMX0lELiAgV2UgYXJlIHVzaW5nIGl0IHRvIGF2b2lkIGEKLSAgICAgICAgICogc2NoZW1hIGNoYW5nZS4KLSAgICAgICAgICogVE9ETyBSZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluIHRoZSBmdXR1cmUuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfREFUQSA9ICJfc3luY19sb2NhbF9pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVzZWQgb25seSBpbiBwZXJzaXN0ZW50IHByb3ZpZGVycywgYW5kIG9ubHkgZHVyaW5nIG1lcmdpbmcuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfTUFSSyA9ICJfc3luY19tYXJrIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsLCB1bnN5bmNlZCwgY2hhbmdlcyBhcmUgcHJlc2VudC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19ESVJUWSA9ICJfc3luY19kaXJ0eSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKLSAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAotICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFRCA9ICJkZWxldGVkIjsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBDYWxlbmRhciBFbnRpdHkuIFRoZXJlIGlzIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCisgICAgICAgICAgICAgICAgIi9jYWxlbmRhcl9lbnRpdGllcyIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IsIHJlc29sdmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwKKyAgICAgICAgICAgICAgICBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50aXR5SXRlcmF0b3JJbXBsIGV4dGVuZHMgQ3Vyc29yRW50aXR5SXRlcmF0b3IgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UHJvdmlkZXJDbGllbnQgbVByb3ZpZGVyOworCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7CisgICAgICAgICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEVudGl0eUl0ZXJhdG9ySW1wbChDdXJzb3IgY3Vyc29yLCBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOworICAgICAgICAgICAgICAgIG1SZXNvbHZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEVudGl0eSBnZXRFbnRpdHlBbmRJbmNyZW1lbnRDdXJzb3IoQ3Vyc29yIGN1cnNvcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgLy8gd2UgZXhwZWN0IHRoZSBjdXJzb3IgaXMgYWxyZWFkeSBhdCB0aGUgcm93IHdlIG5lZWQgdG8gcmVhZCBmcm9tCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBjYWxlbmRhcklkID0gY3Vyc29yLmdldExvbmcoY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhfSUQpKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29udGVudCB2YWx1ZQorICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgY3YgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgIGN2LnB1dChfSUQsIGNhbGVuZGFySWQpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfQUNDT1VOVCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfQUNDT1VOVF9UWVBFKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0lEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19USU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19EQVRBKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfRElSVFkpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19NQVJLKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMyKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DNCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkM1KTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5OQU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkRJU1BMQVlfTkFNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLkNPTE9SKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBBQ0NFU1NfTEVWRUwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFNFTEVDVEVEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBTWU5DX0VWRU5UUyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBUSU1FWk9ORSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5PV05FUl9BQ0NPVU5UKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLk9SR0FOSVpFUl9DQU5fUkVTUE9ORCk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBERUxFVEVEKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgRW50aXR5IGZyb20gdGhlIENvbnRlbnRWYWx1ZQorICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KGN2KTsKKworICAgICAgICAgICAgICAgIC8vIFNldCBjdXJzb3IgdG8gbmV4dCByb3cKKyAgICAgICAgICAgICAgICBjdXJzb3IubW92ZVRvTmV4dCgpOworCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjcmVhdGVkIEVudGl0eQorICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCiAgICAgICogQ29udGFpbnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBjYWxlbmRhcnMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIENhbGVuZGFyc0NvbHVtbnMKICAgICB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9ERUxFVEVfRk9SX0FDQ09VTlQgPSBDYWxlbmRhcnMuX1NZTkNfQUNDT1VOVCArICI9PyIKICAgICAgICAgICAgICAgICArICIgQU5EICIgKyBDYWxlbmRhcnMuX1NZTkNfQUNDT1VOVF9UWVBFICsgIj0/IjsKQEAgLTI1OCw2ICszODEsMjQgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciBpdHNlbGYKKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEZfVVJMID0gInNlbGZVcmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgdG8gYmUgZWRpdGVkCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1VSTCA9ICJlZGl0VXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIGV2ZW50cworICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRTX1VSTCA9ICJldmVudHNVcmwiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCkBAIC0yNzYsMTIgKzQxNyw2IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OID0gImxvY2F0aW9uIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogU2hvdWxkIHRoZSBjYWxlbmRhciBiZSBoaWRkZW4gaW4gdGhlIGNhbGVuZGFyIHNlbGVjdGlvbiBwYW5lbD8KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISURERU4gPSAiaGlkZGVuIjsKLQotICAgICAgICAvKioKICAgICAgICAgICogVGhlIG93bmVyIGFjY291bnQgZm9yIHRoaXMgY2FsZW5kYXIsIGJhc2VkIG9uIHRoZSBjYWxlbmRhciBmZWVkLgogICAgICAgICAgKiBUaGlzIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIF9TWU5DX0FDQ09VTlQgZm9yIGRlbGVnYXRlZCBjYWxlbmRhcnMuCiAgICAgICAgICAqIDxQPlR5cGU6IFN0cmluZzwvUD4KQEAgLTI5Niw2ICs0MzEsOSBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdBTklaRVJfQ0FOX1JFU1BPTkQgPSAib3JnYW5pemVyQ2FuUmVzcG9uZCI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmcm9tIHRoZSBBdHRlbmRlZXMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCisgICAgICovCiAgICAgcHVibGljIGludGVyZmFjZSBBdHRlbmRlZXNDb2x1bW5zIHsKIAogICAgICAgICAvKioKQEAgLTM2MSw4ICs0OTksNyBAQAogICAgIC8qKgogICAgICAqIENvbHVtbnMgZnJvbSB0aGUgRXZlbnRzIHRhYmxlIHRoYXQgb3RoZXIgdGFibGVzIGpvaW4gaW50byB0aGVtc2VsdmVzLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRzQ29sdW1ucwotICAgIHsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c0NvbHVtbnMgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNhbGVuZGFyIHRoZSBldmVudCBiZWxvbmdzIHRvCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGZvcmVpZ24ga2V5IHRvIHRoZSBDYWxlbmRhcnMgdGFibGUpPC9QPgpAQCAtNDM4LDYgKzU3NSwxOCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORCA9ICJkdGVuZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBzdGFydHMgd2l0aCBhbGxEYXkgZXZlbnRzIGluIGEgbG9jYWwgdHoKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUU1RBUlQyID0gImR0c3RhcnQyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IGVuZHMgd2l0aCBhbGxEYXkgZXZlbnRzIGluIGEgbG9jYWwgdHoKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EMiA9ICJkdGVuZDIiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIGV2ZW50CiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKGR1cmF0aW9uIGluIFJGQzI0NDUgZm9ybWF0KTwvUD4KICAgICAgICAgICovCkBAIC00NTAsNiArNTk5LDEyIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1RJTUVaT05FID0gImV2ZW50VGltZXpvbmUiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZXpvbmUgZm9yIHRoZSBldmVudCwgYWxsRGF5IGV2ZW50cyB3aWxsIGhhdmUgYSBsb2NhbCB0eiBpbnN0ZWFkIG9mIFVUQworICAgICAgICAgKiA8UD5UeXBlOiBURVhUCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9USU1FWk9ORTIgPSAiZXZlbnRUaW1lem9uZTIiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIHRoZSBldmVudCBsYXN0cyBhbGwgZGF5IG9yIG5vdAogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCkBAIC01OTgsNyArNzUzLDggQEAKICAgICAvKioKICAgICAgKiBDb250YWlucyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyIGV2ZW50LiBSZWN1cnJpbmcgZXZlbnRzIHNob3cgdXAgYXMgYSBzaW5nbGUgZW50cnkuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEFjY291bnRDb2x1bW5zLAorICAgICAgICAgICAgRXZlbnRzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoaXMgdGFibGUKICAgICAgICAgICovCkBAIC03MDMsOCArODU5LDggQEAKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19EQVRBKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfRElSVFkpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERFTEVURUQpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5VUkwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEV2ZW50c0NvbHVtbnMuREVMRVRFRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMxKTsKIAogICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KGN2KTsKICAgICAgICAgICAgICAgICBDdXJzb3Igc3ViQ3Vyc29yOwpAQCAtNzk1LDcgKzk1MSw4IEBACiAgICAgLyoqCiAgICAgICogQ29udGFpbnMgb25lIGVudHJ5IHBlciBjYWxlbmRhciBldmVudC4gUmVjdXJyaW5nIGV2ZW50cyBzaG93IHVwIGFzIGEgc2luZ2xlIGVudHJ5LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIEV2ZW50c0NvbHVtbnMgewogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZFVENIX0VOVFJZX0NPTFVNTlMgPQogICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEV2ZW50cy5fU1lOQ19BQ0NPVU5ULCBFdmVudHMuX1NZTkNfSUQgfTsKQEAgLTg2MCw2ICsxMDE3LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kLCBTdHJpbmcgc2VhcmNoUXVlcnkpIHsKKyAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1NFQVJDSF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOworICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHNlYXJjaFF1ZXJ5IH0sIERFRkFVTFRfU09SVF9PUkRFUik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kLCBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7CiAgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7CiAgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CkBAIC04NzMsNiArMTAzOSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG9yZGVyQnkgPT0gbnVsbCA/IERFRkFVTFRfU09SVF9PUkRFUiA6IG9yZGVyQnkpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBsb25nIGJlZ2luLAorICAgICAgICAgICAgICAgIGxvbmcgZW5kLCBTdHJpbmcgc2VhcmNoUXVlcnksIFN0cmluZyB3aGVyZSwgU3RyaW5nIG9yZGVyQnkpIHsKKyAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1NFQVJDSF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOworICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIuYXBwZW5kUGF0aChzZWFyY2hRdWVyeSk7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkod2hlcmUpKSB7CisgICAgICAgICAgICAgICAgd2hlcmUgPSBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoZXJlID0gIigiICsgd2hlcmUgKyAiKSBBTkQgIiArIFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShidWlsZGVyLmJ1aWxkKCksIHByb2plY3Rpb24sIHdoZXJlLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoaXMgdGFibGUKICAgICAgICAgICovCkBAIC04ODAsNiArMTA2MSwxMCBAQAogICAgICAgICAgICAgICAgICIvaW5zdGFuY2VzL3doZW4iKTsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9CWV9EQVlfVVJJID0KICAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2luc3RhbmNlcy93aGVuYnlkYXkiKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9TRUFSQ0hfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCisgICAgICAgICAgICAgICAgIi9pbnN0YW5jZXMvc2VhcmNoIik7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfU0VBUkNIX0JZX0RBWV9VUkkgPQorICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvaW5zdGFuY2VzL3NlYXJjaGJ5ZGF5Iik7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgZm9yIHRoaXMgdGFibGUuCkBAIC04OTYsNyArMTA4MSw2IEBACiAgICAgICAgICAqIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcywgaXQganVzdCBhZGRzIGEgbmljZSB0b3VjaC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfQ0FMRU5EQVJfVklFVyA9ICJiZWdpbiBBU0MsIGVuZCBERVNDLCB0aXRsZSBBU0MiOwotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgYmVnaW5uaW5nIHRpbWUgb2YgdGhlIGluc3RhbmNlLCBpbiBVVEMgbWlsbGlzZWNvbmRzCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CkBAIC0xMDU1LDcgKzEyMzksNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfRVZFTlREQVlTID0gIm1heEV2ZW50RGF5cyI7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxlbmRhck1ldGFEYXRhIGltcGxlbWVudHMgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsZW5kYXJNZXRhRGF0YSBpbXBsZW1lbnRzIENhbGVuZGFyTWV0YURhdGFDb2x1bW5zLCBCYXNlQ29sdW1ucyB7CiAgICAgfQogCiAgICAgcHVibGljIGludGVyZmFjZSBFdmVudERheXNDb2x1bW5zIHsKQEAgLTE0NTMsNCArMTYzNyw0MyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CiAgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQ2FsZW5kYXIuQ09OVEVOVF9VUkksIENPTlRFTlRfRElSRUNUT1JZKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEV2ZW50c1Jhd1RpbWVzIHRhYmxlCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBFdmVudHNSYXdUaW1lc0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgaWQKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBzdGFydHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUU1RBUlRfMjQ0NSA9ICJkdHN0YXJ0MjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBlbmRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORF8yNDQ1ID0gImR0ZW5kMjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCBvcmlnaW5hbCBpbnN0YW5jZSB0aW1lIG9mIHRoZSByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMKKyAgICAgICAgICogZXZlbnQgaXMgYW4gZXhjZXB0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfSU5TVEFOQ0VfVElNRV8yNDQ1ID0gIm9yaWdpbmFsSW5zdGFuY2VUaW1lMjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCBsYXN0IGRhdGUgdGhpcyBldmVudCByZXBlYXRzIG9uLCBvciBOVUxMIGlmIGl0IG5ldmVyIGVuZHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfREFURV8yNDQ1ID0gImxhc3REYXRlMjQ0NSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNSYXdUaW1lcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNSYXdUaW1lc0NvbHVtbnMgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2cuamF2YQppbmRleCBkNTI2MzJiLi5iZjA1MWY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxsTG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsbExvZy5qYXZhCkBAIC04OCw2ICs4OCwxNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVIgPSAibnVtYmVyIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlIG9mIHRoZSBjb3VudHJ5IHdoZXJlIHRoZQorICAgICAgICAgKiB1c2VyIHJlY2VpdmVkIG9yIG1hZGUgdGhlIGNhbGwuCisgICAgICAgICAqIDxQPgorICAgICAgICAgKiBUeXBlOiBURVhUCisgICAgICAgICAqIDwvUD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5UUllfSVNPID0gImNvdW50cnlpc28iOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgY2FsbCBvY2N1cmVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgogICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQppbmRleCA3NDg0OTY0Li4zNmUyYzU2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCkBAIC0zMCw5ICszMCw5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaS5CdWlsZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwpAQCAtNDEsNiArNDEsNyBAQAogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgogICogPHA+CkBAIC0xMzAsNiArMTMxLDIwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVElOR19QQUNLQUdFX1BBUkFNX0tFWSA9ICJyZXF1ZXN0aW5nX3BhY2thZ2UiOwogCiAgICAgLyoqCisgICAgICogUXVlcnkgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGNsaWVudCB0byBhY2Nlc3MgYSBzcGVjaWZpYworICAgICAqIHtAbGluayBEaXJlY3Rvcnl9LiBUaGUgcGFyYW1ldGVyIHZhbHVlIHNob3VsZCBiZSB0aGUgX0lEIG9mIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogZGlyZWN0b3J5LCBlLmcuCisgICAgICoge0Bjb2RlIGNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9kYXRhL2VtYWlscy9maWx0ZXIvYWNtZT9kaXJlY3Rvcnk9M30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfUEFSQU1fS0VZID0gImRpcmVjdG9yeSI7CisKKyAgICAvKioKKyAgICAgKiBBIHF1ZXJ5IHBhcmFtZXRlciB0aGF0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgcmV0dXJuZWQuIFRoZQorICAgICAqIHBhcmFtZXRlciB2YWx1ZSBzaG91bGQgYmUgYW4gaW50ZWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU1JVF9QQVJBTV9LRVkgPSAibGltaXQiOworCisgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByZWZlcmVuY2VzIHsKQEAgLTE4MSw2ICsxOTYsMzI2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQSBEaXJlY3RvcnkgcmVwcmVzZW50cyBhIGNvbnRhY3RzIGNvcnB1cywgZS5nLiBMb2NhbCBjb250YWN0cywKKyAgICAgKiBHb29nbGUgQXBwcyBHbG9iYWwgQWRkcmVzcyBMaXN0IG9yIENvcnBvcmF0ZSBHbG9iYWwgQWRkcmVzcyBMaXN0LgorICAgICAqIDxwPgorICAgICAqIEEgRGlyZWN0b3J5IGlzIGltcGxlbWVudGVkIGFzIGEgY29udGVudCBwcm92aWRlciB3aXRoIGl0cyB1bmlxdWUgYXV0aG9yaXR5IGFuZAorICAgICAqIHRoZSBzYW1lIEFQSSBhcyB0aGUgbWFpbiBDb250YWN0cyBQcm92aWRlci4gIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGV4cGVjdGF0aW9uIHRoYXQKKyAgICAgKiBldmVyeSBkaXJlY3RvcnkgcHJvdmlkZXIgd2lsbCBpbXBsZW1lbnQgdGhpcyBDb250cmFjdCBpbiBpdHMgZW50aXJldHkuICBJZiBhCisgICAgICogZGlyZWN0b3J5IHByb3ZpZGVyIGRvZXMgbm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgcmVxdWVzdCwgaXQKKyAgICAgKiBzaG91bGQgdGhyb3cgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBtb3N0IGltcG9ydGFudCB1c2UgY2FzZSBmb3IgRGlyZWN0b3JpZXMgaXMgc2VhcmNoLiAgQSBEaXJlY3RvcnkgcHJvdmlkZXIgaXMKKyAgICAgKiBleHBlY3RlZCB0byBzdXBwb3J0IGF0IGxlYXN0IHtAbGluayBDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzI0NPTlRFTlRfRklMVEVSX1VSSQorICAgICAqIENvbnRhY3RzLkNPTlRFTlRfRklMVEVSX1VSSX0uICBJZiBhIERpcmVjdG9yeSBwcm92aWRlciB3YW50cyB0byBwYXJ0aWNpcGF0ZQorICAgICAqIGluIGVtYWlsIGFuZCBwaG9uZSBsb29rdXAgZnVuY3Rpb25hbGl0aWVzLCBpdCBzaG91bGQgYWxzbyBpbXBsZW1lbnQKKyAgICAgKiB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLkVtYWlsI0NPTlRFTlRfRklMVEVSX1VSSSBDb21tb25EYXRhS2luZHMuRW1haWwuQ09OVEVOVF9GSUxURVJfVVJJfQorICAgICAqIGFuZAorICAgICAqIHtAbGluayBDb21tb25EYXRhS2luZHMuUGhvbmUjQ09OVEVOVF9GSUxURVJfVVJJIENvbW1vbkRhdGFLaW5kcy5QaG9uZS5DT05URU5UX0ZJTFRFUl9VUkl9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRpcmVjdG9yeSBwcm92aWRlciBzaG91bGQgcmV0dXJuIE5VTEwgZm9yIGV2ZXJ5IHByb2plY3Rpb24gZmllbGQgaXQgZG9lcyBub3QKKyAgICAgKiByZWNvZ25pemUsIHJhdGhlciB0aGFuIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIFRoaXMgd2F5IGl0IHdpbGwgbm90IGJlIGJyb2tlbgorICAgICAqIGlmIENvbnRhY3RzQ29udHJhY3QgaXMgZXh0ZW5kZWQgd2l0aCBuZXcgZmllbGRzIGluIHRoZSBmdXR1cmUuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBjbGllbnQgaW50ZXJhY3RzIHdpdGggYSBkaXJlY3RvcnkgdmlhIENvbnRhY3RzIFByb3ZpZGVyIGJ5IHN1cHBseWluZyBhbgorICAgICAqIG9wdGlvbmFsIHtAY29kZSBkaXJlY3Rvcnk9fSBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICogPHA+CisgICAgICogPHA+CisgICAgICogV2hlbiB0aGUgQ29udGFjdHMgUHJvdmlkZXIgcmVjZWl2ZXMgdGhlIHJlcXVlc3QsIGl0IHRyYW5zZm9ybXMgdGhlIFVSSSBhbmQgZm9yd2FyZHMKKyAgICAgKiB0aGUgcmVxdWVzdCB0byB0aGUgY29ycmVzcG9uZGluZyBkaXJlY3RvcnkgY29udGVudCBwcm92aWRlci4KKyAgICAgKiBUaGUgVVJJIGlzIHRyYW5zZm9ybWVkIGluIHRoZSBmb2xsb3dpbmcgZmFzaGlvbjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSBVUkkgYXV0aG9yaXR5IGlzIHJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rICNESVJFQ1RPUllfQVVUSE9SSVRZfS48L2xpPgorICAgICAqIDxsaT5UaGUge0Bjb2RlIGFjY291bnROYW1lPX0gYW5kIHtAY29kZSBhY2NvdW50VHlwZT19IHBhcmFtZXRlcnMgYXJlIGFkZGVkIG9yCisgICAgICogcmVwbGFjZWQgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGFuZCB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gdmFsdWVzLjwvbGk+CisgICAgICogPGxpPklmIHRoZSBVUkkgaXMgbWlzc2luZyBhIENvbnRhY3RzQ29udHJhY3QuUkVRVUVTVElOR19QQUNLQUdFX1BBUkFNX0tFWQorICAgICAqIHBhcmFtZXRlciwgdGhpcyBwYXJhbWV0ZXIgaXMgYWRkZWQuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBDbGllbnRzIHNob3VsZCBzZW5kIGRpcmVjdG9yeSByZXF1ZXN0cyB0byBDb250YWN0cyBQcm92aWRlciBhbmQgbGV0IGl0CisgICAgICogZm9yd2FyZCB0aGVtIHRvIHRoZSByZXNwZWN0aXZlIHByb3ZpZGVycyByYXRoZXIgdGhhbiBjb25zdHJ1Y3RpbmcKKyAgICAgKiBkaXJlY3RvcnkgcHJvdmlkZXIgVVJJcyBieSB0aGVtc2VsdmVzLiBUaGlzIGxldmVsIG9mIGluZGlyZWN0aW9uIGFsbG93cworICAgICAqIENvbnRhY3RzIFByb3ZpZGVyIHRvIGltcGxlbWVudCBhZGRpdGlvbmFsIHN5c3RlbS1sZXZlbCBmZWF0dXJlcyBhbmQKKyAgICAgKiBvcHRpbWl6YXRpb25zLiBBY2Nlc3MgdG8gQ29udGFjdHMgUHJvdmlkZXIgaXMgcHJvdGVjdGVkIGJ5IHRoZQorICAgICAqIFJFQURfQ09OVEFDVFMgcGVybWlzc2lvbiwgYnV0IGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIGlzIG5vdC4KKyAgICAgKiBUaGVyZWZvcmUgZGlyZWN0b3J5IHByb3ZpZGVycyBtdXN0IHJlamVjdCByZXF1ZXN0cyBjb21pbmcgZnJvbSBjbGllbnRzCisgICAgICogb3RoZXIgdGhhbiB0aGUgQ29udGFjdHMgUHJvdmlkZXIgaXRzZWxmLiBBbiBlYXN5IHdheSB0byBwcmV2ZW50IHN1Y2gKKyAgICAgKiB1bmF1dGhvcml6ZWQgYWNjZXNzIGlzIHRvIGNoZWNrIHRoZSBuYW1lIG9mIHRoZSBjYWxsaW5nIHBhY2thZ2U6CisgICAgICogPHByZT4KKyAgICAgKiBwcml2YXRlIGJvb2xlYW4gaXNDYWxsZXJBbGxvd2VkKCkgeworICAgICAqICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgKiAgIGZvciAoU3RyaW5nIHBhY2thZ2VOYW1lOiBwbS5nZXRQYWNrYWdlc0ZvclVpZChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKSkgeworICAgICAqICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKCJjb20uYW5kcm9pZC5wcm92aWRlcnMuY29udGFjdHMiKSkgeworICAgICAqICAgICAgIHJldHVybiB0cnVlOworICAgICAqICAgICB9CisgICAgICogICB9CisgICAgICogICByZXR1cm4gZmFsc2U7CisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgRGlyZWN0b3J5IHRhYmxlIGlzIHJlYWQtb25seSBhbmQgaXMgbWFpbnRhaW5lZCBieSB0aGUgQ29udGFjdHMgUHJvdmlkZXIKKyAgICAgKiBhdXRvbWF0aWNhbGx5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5JdCBhbHdheXMgaGFzIGF0IGxlYXN0IHRoZXNlIHR3byByb3dzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+CisgICAgICogVGhlIGxvY2FsIGRpcmVjdG9yeS4gSXQgaGFzIHtAbGluayBEaXJlY3RvcnkjX0lEIERpcmVjdG9yeS5fSUR9ID0KKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5I0RFRkFVTFQgRGlyZWN0b3J5LkRFRkFVTFR9LiBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgbG9jYWxseQorICAgICAqIHN0b3JlZCBjb250YWN0cy4gVGhlIHNhbWUgY2FuIGJlIGFjaGlldmVkIGJ5IG9taXR0aW5nIHRoZSB7QGNvZGUgZGlyZWN0b3J5PX0KKyAgICAgKiBwYXJhbWV0ZXIgYWx0b2dldGhlci4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiBUaGUgbG9jYWwgaW52aXNpYmxlIGNvbnRhY3RzLiBUaGUgY29ycmVzcG9uZGluZyBkaXJlY3RvcnkgSUQgaXMKKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5I0xPQ0FMX0lOVklTSUJMRSBEaXJlY3RvcnkuTE9DQUxfSU5WSVNJQkxFfS4KKyAgICAgKiA8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPkN1c3RvbSBEaXJlY3RvcmllcyBhcmUgZGlzY292ZXJlZCBieSB0aGUgQ29udGFjdHMgUHJvdmlkZXIgZm9sbG93aW5nIHRoaXMgcHJvY2VkdXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SXQgZmluZHMgYWxsIGluc3RhbGxlZCBjb250ZW50IHByb3ZpZGVycyB3aXRoIG1ldGEgZGF0YSBpZGVudGlmeWluZyB0aGVtCisgICAgICogYXMgZGlyZWN0b3J5IHByb3ZpZGVycyBpbiBBbmRyb2lkTWFuaWZlc3QueG1sOgorICAgICAqIDxjb2RlPgorICAgICAqICZsdDttZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuQ29udGFjdERpcmVjdG9yeSIKKyAgICAgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9InRydWUiIC8mZ3Q7CisgICAgICogPC9jb2RlPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgdGFnIHNob3VsZCBiZSBwbGFjZWQgaW5zaWRlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgcHJvdmlkZXIgZGVjbGFyYXRpb24uCisgICAgICogPC9wPgorICAgICAqIDwvbGk+CisgICAgICogPGxpPgorICAgICAqIFRoZW4gQ29udGFjdHMgUHJvdmlkZXIgc2VuZHMgYSB7QGxpbmsgRGlyZWN0b3J5I0NPTlRFTlRfVVJJIERpcmVjdG9yeS5DT05URU5UX1VSSX0KKyAgICAgKiBxdWVyeSB0byBlYWNoIG9mIHRoZSBkaXJlY3RvcnkgYXV0aG9yaXRpZXMuICBBIGRpcmVjdG9yeSBwcm92aWRlciBtdXN0IGltcGxlbWVudAorICAgICAqIHRoaXMgcXVlcnkgYW5kIHJldHVybiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMuICBFYWNoIGRpcmVjdG9yeSByZXR1cm5lZCBieQorICAgICAqIHRoZSBwcm92aWRlciBtdXN0IGhhdmUgYSB1bmlxdWUgY29tYmluYXRpb24gZm9yIHRoZSB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gYW5kCisgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGNvbHVtbnMgKG51bGxzIGFyZSBhbGxvd2VkKS4gIFNpbmNlIGRpcmVjdG9yeSBJRHMgYXJlIGFzc2lnbmVkCisgICAgICogYXV0b21hdGljYWxseSwgdGhlIF9JRCBmaWVsZCB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZSBxdWVyeSBwcm9qZWN0aW9uLgorICAgICAqIDwvbGk+CisgICAgICogPGxpPkNvbnRhY3RzIFByb3ZpZGVyIGNvbXBpbGVzIGRpcmVjdG9yeSBsaXN0cyByZWNlaXZlZCBmcm9tIGFsbCBkaXJlY3RvcnkKKyAgICAgKiBwcm92aWRlcnMgaW50byBvbmUsIGFzc2lnbnMgZWFjaCBpbmRpdmlkdWFsIGRpcmVjdG9yeSBhIGdsb2JhbGx5IHVuaXF1ZSBJRCBhbmQKKyAgICAgKiBzdG9yZXMgYWxsIGRpcmVjdG9yeSByZWNvcmRzIGluIHRoZSBEaXJlY3RvcnkgdGFibGUuCisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5Db250YWN0cyBQcm92aWRlciBhdXRvbWF0aWNhbGx5IGludGVycm9nYXRlcyBuZXdseSBpbnN0YWxsZWQgb3IgcmVwbGFjZWQgcGFja2FnZXMuCisgICAgICogVGh1cyBzaW1wbHkgaW5zdGFsbGluZyBhIHBhY2thZ2UgY29udGFpbmluZyBhIGRpcmVjdG9yeSBwcm92aWRlciBpcyBzdWZmaWNpZW50CisgICAgICogdG8gaGF2ZSB0aGF0IHByb3ZpZGVyIHJlZ2lzdGVyZWQuICBBIHBhY2thZ2Ugc3VwcGx5aW5nIGEgZGlyZWN0b3J5IHByb3ZpZGVyIGRvZXMKKyAgICAgKiBub3QgaGF2ZSB0byBjb250YWluIGxhdW5jaGFibGUgYWN0aXZpdGllcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogRXZlcnkgcm93IGluIHRoZSBEaXJlY3RvcnkgdGFibGUgaXMgYXV0b21hdGljYWxseSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcGFja2FnZQorICAgICAqIChhcGspLiAgSWYgdGhlIHBhY2thZ2UgaXMgbGF0ZXIgdW5pbnN0YWxsZWQsIGFsbCBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeSByb3dzCisgICAgICogYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBDb250YWN0cyBQcm92aWRlci4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBoYW5kbGVkIGJ5IGEgZGlyZWN0b3J5IHByb3ZpZGVyIGNoYW5nZXMKKyAgICAgKiAoZm9yIGluc3RhbmNlIHdoZW4gdGhlIHVzZXIgYWRkcyBhIG5ldyBEaXJlY3RvcnkgYWNjb3VudCksIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIKKyAgICAgKiBzaG91bGQgY2FsbCB7QGxpbmsgI25vdGlmeURpcmVjdG9yeUNoYW5nZX0gdG8gbm90aWZ5IHRoZSBDb250YWN0cyBQcm92aWRlciBvZiB0aGUgY2hhbmdlLgorICAgICAqIEluIHJlc3BvbnNlLCB0aGUgQ29udGFjdHMgUHJvdmlkZXIgd2lsbCByZXF1ZXJ5IHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIgdG8gb2J0YWluIHRoZQorICAgICAqIG5ldyBsaXN0IG9mIGRpcmVjdG9yaWVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRpcmVjdG9yeSByb3cgY2FuIGJlIG9wdGlvbmFsbHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGFjY291bnQKKyAgICAgKiAoc2VlIHtAbGluayBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyfSkuIElmIHRoZSBhY2NvdW50IGlzIGxhdGVyIHJlbW92ZWQsCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IHJvd3MgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBDb250YWN0cyBQcm92aWRlci4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEaXJlY3RvcnkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdCBpbnN0YW50aWFibGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIERpcmVjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUuICBSZXF1ZXN0cyB0byB0aGlzIFVSSSBjYW4gYmUKKyAgICAgICAgICogcGVyZm9ybWVkIG9uIHRoZSBVSSB0aHJlYWQgYmVjYXVzZSB0aGV5IGFyZSBhbHdheXMgdW5ibG9ja2luZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KKyAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAiZGlyZWN0b3JpZXMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUtdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YKKyAgICAgICAgICogY29udGFjdCBkaXJlY3Rvcmllcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9CisgICAgICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvY29udGFjdF9kaXJlY3RvcmllcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPQorICAgICAgICAgICAgICAgICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9jb250YWN0X2RpcmVjdG9yeSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIF9JRCBvZiB0aGUgZGVmYXVsdCBkaXJlY3RvcnksIHdoaWNoIHJlcHJlc2VudHMgbG9jYWxseSBzdG9yZWQgY29udGFjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIF9JRCBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgcmVwcmVzZW50cyBsb2NhbGx5IHN0b3JlZCBpbnZpc2libGUgY29udGFjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTE9DQUxfSU5WSVNJQkxFID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCBvd25zIHRoaXMgZGlyZWN0b3J5LiBDb250YWN0cyBQcm92aWRlcgorICAgICAgICAgKiBmaWxsIGl0IGluIHdpdGggdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyLgorICAgICAgICAgKiBJZiB0aGUgcGFja2FnZSBpcyBsYXRlciB1bmluc3RhbGxlZCwgdGhlIGRpcmVjdG9yaWVzIGl0IG93bnMgYXJlCisgICAgICAgICAqIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoaXMgdGFibGUuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IFRFWFQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAicGFja2FnZU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBkaXJlY3RvcnkgY2FwdHVyZWQgYXMgYSByZXNvdXJjZSBJRCBpbiB0aGUgY29udGV4dCBvZiB0aGUKKyAgICAgICAgICogcGFja2FnZSB7QGxpbmsgI1BBQ0tBR0VfTkFNRX0sIGUuZy4gIkNvcnBvcmF0ZSBEaXJlY3RvcnkiCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IElOVEVHRVI8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1JFU09VUkNFX0lEID0gInR5cGVSZXNvdXJjZUlkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gb3B0aW9uYWwgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBVSSB0byByZXByZXNlbnQgdGhpcyBkaXJlY3RvcnksCisgICAgICAgICAqIGUuZy4gIkFjbWUgQ29ycCIKKyAgICAgICAgICogPHA+VFlQRTogdGV4dDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlfTkFNRSA9ICJkaXNwbGF5TmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgYXV0aG9yaXR5IG9mIHRoZSBEaXJlY3RvcnkgUHJvdmlkZXIuIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwKKyAgICAgICAgICogdXNlIHRoaXMgYXV0aG9yaXR5IHRvIGZvcndhcmQgcmVxdWVzdHMgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICogQSBkaXJlY3RvcnkgcHJvdmlkZXIgY2FuIGxlYXZlIHRoaXMgY29sdW1uIGVtcHR5IC0gQ29udGFjdHMgUHJvdmlkZXIgd2lsbCBmaWxsIGl0IGluLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBDbGllbnRzIG9mIHRoaXMgQVBJIHNob3VsZCBub3Qgc2VuZCByZXF1ZXN0cyBkaXJlY3RseSB0byB0aGlzIGF1dGhvcml0eS4KKyAgICAgICAgICogQWxsIGRpcmVjdG9yeSByZXF1ZXN0cyBtdXN0IGJlIHJvdXRlZCB0aHJvdWdoIENvbnRhY3RzIFByb3ZpZGVyLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfQVVUSE9SSVRZID0gImF1dGhvcml0eSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHR5cGUgd2hpY2ggdGhpcyBkaXJlY3RvcnkgaXMgYXNzb2NpYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VFlQRTogdGV4dDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50VHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHdpdGggd2hpY2ggdGhpcyBkaXJlY3RvcnkgaXMgYXNzb2NpYXRlZC4gSWYgdGhlIGFjY291bnQgaXMgbGF0ZXIKKyAgICAgICAgICogcmVtb3ZlZCwgdGhlIGRpcmVjdG9yaWVzIGl0IG93bnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoaXMgdGFibGUuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudE5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPbmUgb2Yge0BsaW5rICNFWFBPUlRfU1VQUE9SVF9OT05FfSwge0BsaW5rICNFWFBPUlRfU1VQUE9SVF9BTllfQUNDT1VOVH0sCisgICAgICAgICAqIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfU0FNRV9BQ0NPVU5UX09OTFl9LiBUaGlzIGlzIHRoZSBleHBlY3RhdGlvbiB0aGUKKyAgICAgICAgICogZGlyZWN0b3J5IGhhcyBmb3IgZGF0YSBleHBvcnRlZCBmcm9tIGl0LiAgQ2xpZW50cyBtdXN0IG9iZXkgdGhpcyBzZXR0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1NVUFBPUlQgPSAiZXhwb3J0U3VwcG9ydCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGRvZXMgbm90IGFsbG93IGFueSBkYXRhIHRvIGJlIGNvcGllZCBvdXQgb2YgaXQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9OT05FID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNFWFBPUlRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgaXRzIGRhdGEgY29waWVkIG9ubHkgdG8gdGhlIGFjY291bnQgc3BlY2lmaWVkIGJ5CisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfS97QGxpbmsgI0FDQ09VTlRfTkFNRX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9TQU1FX0FDQ09VTlRfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGl0cyBkYXRhIGNvcGllZCB0byBhbnkgY29udGFjdHMgYWNjb3VudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9TVVBQT1JUX0FOWV9BQ0NPVU5UID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25lIG9mIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9OT05FfSwge0BsaW5rICNTSE9SVENVVF9TVVBQT1JUX0RBVEFfSVRFTVNfT05MWX0sCisgICAgICAgICAqIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9GVUxMfS4gVGhpcyBpcyB0aGUgZXhwZWN0YXRpb24gdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBoYXMgZm9yIHNob3J0Y3V0cyBjcmVhdGVkIGZvciBpdHMgZWxlbWVudHMuIENsaWVudHMgbXVzdCBvYmV5IHRoaXMgc2V0dGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUQ1VUX1NVUFBPUlQgPSAic2hvcnRjdXRTdXBwb3J0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNTSE9SVENVVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBhbGxvdyBhbnkgc2hvcnRjdXRzIGNyZWF0ZWQgZm9yIGl0cyBjb250YWN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUQ1VUX1NVUFBPUlRfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgY3JlYXRpb24gb2Ygc2hvcnRjdXRzIGZvciBkYXRhIGl0ZW1zIGxpa2UgZW1haWwsIHBob25lIG9yIHBvc3RhbCBhZGRyZXNzLAorICAgICAgICAgKiBidXQgbm90IHRoZSBlbnRpcmUgY29udGFjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUQ1VUX1NVUFBPUlRfREFUQV9JVEVNU19PTkxZID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNTSE9SVENVVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBhbGxvdyBjcmVhdGlvbiBvZiBzaG9ydGN1dHMgZm9yIGNvbnRhY3QgYXMgd2VsbCBhcyB0aGVpciBjb25zdGl0dWVudCBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUQ1VUX1NVUFBPUlRfRlVMTCA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9uZSBvZiB7QGxpbmsgI1BIT1RPX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjUEhPVE9fU1VQUE9SVF9USFVNQk5BSUxfT05MWX0sCisgICAgICAgICAqIHtAbGluayAjUEhPVE9fU1VQUE9SVF9GVUxMfS4gVGhpcyBpcyBhIGZlYXR1cmUgZmxhZyBpbmRpY2F0aW5nIHRoZSBleHRlbnQKKyAgICAgICAgICogdG8gd2hpY2ggdGhlIGRpcmVjdG9yeSBzdXBwb3J0cyBjb250YWN0IHBob3Rvcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT1RPX1NVUFBPUlQgPSAicGhvdG9TdXBwb3J0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNQSE9UT19TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBwcm92aWRlIGFueSBwaG90b3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSE9UT19TVVBQT1JUX05PTkUgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI1BIT1RPX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGNhbiBvbmx5IHByb2R1Y2Ugc21hbGwgc2l6ZSB0aHVtYm5haWxzIG9mIGNvbnRhY3QgcGhvdG9zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEhPVE9fU1VQUE9SVF9USFVNQk5BSUxfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjUEhPVE9fU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogaGFzIGZ1bGwtc2l6ZSBjb250YWN0IHBob3RvcywgYnV0IGNhbm5vdCBwcm92aWRlIHNjYWxlZCB0aHVtYm5haWxzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEhPVE9fU1VQUE9SVF9GVUxMX1NJWkVfT05MWSA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjUEhPVE9fU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogY2FuIHByb2R1Y2UgdGh1bWJuYWlscyBhcyB3ZWxsIGFzIGZ1bGwtc2l6ZSBjb250YWN0IHBob3Rvcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBIT1RPX1NVUFBPUlRfRlVMTCA9IDM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdGlmaWVzIHRoZSBzeXN0ZW0gb2YgYSBjaGFuZ2UgaW4gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaGFuZGxlZCBieQorICAgICAgICAgKiBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IHByb3ZpZGVyLiBUaGUgQ29udGFjdHMgcHJvdmlkZXIgd2lsbCB0dXJuIGFyb3VuZAorICAgICAgICAgKiBhbmQgc2VuZCBhIHF1ZXJ5IHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIgZm9yIHRoZSBmdWxsIGxpc3Qgb2YgZGlyZWN0b3JpZXMsCisgICAgICAgICAqIHdoaWNoIHdpbGwgcmVwbGFjZSB0aGUgcHJldmlvdXMgbGlzdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBub3RpZnlEaXJlY3RvcnlDaGFuZ2UoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gdHJpZ2dlciBhIHF1ZXJ5IGJ5IENvbnRhY3RzIFByb3ZpZGVyIGJhY2sgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICAgIC8vIE5vIGRhdGEgbmVlZHMgdG8gYmUgc2VudCBiYWNrLCBiZWNhdXNlIHRoZSBwcm92aWRlciBjYW4gaW5mZXIgdGhlIGNhbGxpbmcKKyAgICAgICAgICAgIC8vIHBhY2thZ2UgZnJvbSBiaW5kZXIuCisgICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgcmVzb2x2ZXIudXBkYXRlKERpcmVjdG9yeS5DT05URU5UX1VSSSwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAaGlkZSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHVzZXJzIGFyZSB1cGRhdGVkIHRvIHJlZmVyIHRvIFN5bmNTdGF0ZQogICAgICAqIEBkZXByZWNhdGVkIHVzZSBTeW5jU3RhdGUgaW5zdGVhZAogICAgICAqLwpAQCAtMzcyLDEyICs3MDcsNDIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9SQVdfQ09OVEFDVF9JRCA9ICJuYW1lX3Jhd19jb250YWN0X2lkIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogUmVmZXJlbmNlIHRvIHRoZSByb3cgaW4gdGhlIGRhdGEgdGFibGUgaG9sZGluZyB0aGUgcGhvdG8uCisgICAgICAgICAqIFJlZmVyZW5jZSB0byB0aGUgcm93IGluIHRoZSBkYXRhIHRhYmxlIGhvbGRpbmcgdGhlIHBob3RvLiAgQSBwaG90byBjYW4KKyAgICAgICAgICogYmUgcmVmZXJyZWQgdG8gZWl0aGVyIGJ5IElEICh0aGlzIGZpZWxkKSBvciBieSBVUkkgKHNlZSB7QGxpbmsgI1BIT1RPX1RIVU1CTkFJTF9VUkl9CisgICAgICAgICAqIGFuZCB7QGxpbmsgI1BIT1RPX1VSSX0pLgorICAgICAgICAgKiBJZiBQSE9UT19JRCBpcyBudWxsLCBjb25zdWx0IHtAbGluayAjUEhPVE9fVVJJfSBvciB7QGxpbmsgI1BIT1RPX1RIVU1CTkFJTF9VUkl9LAorICAgICAgICAgKiB3aGljaCBpcyBhIG1vcmUgZ2VuZXJpYyBtZWNoYW5pc20gZm9yIHJlZmVyZW5jaW5nIHRoZSBjb250YWN0IHBob3RvLCBlc3BlY2lhbGx5IGZvcgorICAgICAgICAgKiBjb250YWN0cyByZXR1cm5lZCBieSBub24tbG9jYWwgZGlyZWN0b3JpZXMgKHNlZSB7QGxpbmsgRGlyZWN0b3J5fSkuCisgICAgICAgICAqCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgUkVGRVJFTkNFUyBkYXRhKF9pZCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9UT19JRCA9ICJwaG90b19pZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEEgVVJJIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGNvbnRhY3QncyBmdWxsLXNpemUgcGhvdG8uCisgICAgICAgICAqIEEgcGhvdG8gY2FuIGJlIHJlZmVycmVkIHRvIGVpdGhlciBieSBhIFVSSSAodGhpcyBmaWVsZCkgb3IgYnkgSUQKKyAgICAgICAgICogKHNlZSB7QGxpbmsgI1BIT1RPX0lEfSkuIElmIFBIT1RPX0lEIGlzIG5vdCBudWxsLCBQSE9UT19VUkkgYW5kCisgICAgICAgICAqIFBIT1RPX1RIVU1CTkFJTF9VUkkgc2hhbGwgbm90IGJlIG51bGwgKGJ1dCBub3QgbmVjZXNzYXJpbHkgdmljZSB2ZXJzYSkuCisgICAgICAgICAqIFRodXMgdXNpbmcgUEhPVE9fVVJJIGlzIGEgbW9yZSByb2J1c3QgbWV0aG9kIG9mIHJldHJpZXZpbmcgY29udGFjdCBwaG90b3MuCisgICAgICAgICAqCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9UT19VUkkgPSAicGhvdG9fdXJpIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBVUkkgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIHRodW1ibmFpbCBvZiB0aGUgY29udGFjdCdzIHBob3RvLgorICAgICAgICAgKiBBIHBob3RvIGNhbiBiZSByZWZlcnJlZCB0byBlaXRoZXIgYnkgYSBVUkkgKHRoaXMgZmllbGQgb3Ige0BsaW5rICNQSE9UT19VUkl9KQorICAgICAgICAgKiBvciBieSBJRCAoc2VlIHtAbGluayAjUEhPVE9fSUR9KS4gSWYgUEhPVE9fSUQgaXMgbm90IG51bGwsIFBIT1RPX1VSSSBhbmQKKyAgICAgICAgICogUEhPVE9fVEhVTUJOQUlMX1VSSSBzaGFsbCBub3QgYmUgbnVsbCAoYnV0IG5vdCBuZWNlc3NhcmlseSB2aWNlIHZlcnNhKS4KKyAgICAgICAgICogSWYgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGZ1bGwtc2l6ZSBwaG90b3MKKyAgICAgICAgICogYW5kIHRodW1ibmFpbCBwaG90b3MsIFBIT1RPX1RIVU1CTkFJTF9VUkkgYW5kIHtAbGluayAjUEhPVE9fVVJJfSBjYW4gY29udGFpbgorICAgICAgICAgKiB0aGUgc2FtZSB2YWx1ZSwgYnV0IGVpdGhlciBib3RoIHNoZWxsIGJlIG51bGwgb3IgYm90aCBub3QgbnVsbC4KKyAgICAgICAgICoKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT1RPX1RIVU1CTkFJTF9VUkkgPSAicGhvdG9fdGh1bWJfdXJpIjsKKworICAgICAgICAvKioKICAgICAgICAgICogTG9va3VwIHZhbHVlIHRoYXQgcmVmbGVjdHMgdGhlIHtAbGluayBHcm91cHMjR1JPVVBfVklTSUJMRX0gc3RhdGUgb2YKICAgICAgICAgICogYW55IHtAbGluayBDb21tb25EYXRhS2luZHMuR3JvdXBNZW1iZXJzaGlwfSBmb3IgdGhpcyBjb250YWN0LgogICAgICAgICAgKi8KQEAgLTQxMiw3ICs3NzcsNiBAQAogICAgICAgICAgKiBDb250YWN0IENoYXQgQ2FwYWJpbGl0aWVzLiBTZWUge0BsaW5rIFN0YXR1c1VwZGF0ZXN9IGZvciBpbmRpdmlkdWFsCiAgICAgICAgICAqIGRlZmluaXRpb25zLgogICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVI8L3A+Ci0gICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUNUX0NIQVRfQ0FQQUJJTElUWSA9ICJjb250YWN0X2NoYXRfY2FwYWJpbGl0eSI7CiAKQEAgLTQ1OCw3ICs4MjIsNiBAQAogICAgICAqICdmYW1pbHkgbmFtZScsICdnaXZlbiBuYW1lJyAnbWlkZGxlIG5hbWUnLiAgVGhlIENKSyB0cmFkaXRpb24gaXMKICAgICAgKiAnZmFtaWx5IG5hbWUnICdtaWRkbGUgbmFtZScgJ2dpdmVuIG5hbWUnLCB3aXRoIEphcGFuZXNlIGZhdm9yaW5nIGEgc3BhY2UgYmV0d2VlbgogICAgICAqIHRoZSBuYW1lcyBhbmQgQ2hpbmVzZSBvbWl0dGluZyB0aGUgc3BhY2UuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIEZ1bGxOYW1lU3R5bGUgewogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSAwOwpAQCAtNDc3LDcgKzg0MCw2IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdGFudHMgZm9yIHZhcmlvdXMgc3R5bGVzIG9mIGNhcHR1cmluZyB0aGUgcHJvbnVuY2lhdGlvbiBvZiBhIHBlcnNvbidzIG5hbWUuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIFBob25ldGljTmFtZVN0eWxlIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUwMyw4ICs4NjUsNiBAQAogICAgIC8qKgogICAgICAqIFR5cGVzIG9mIGRhdGEgdXNlZCB0byBwcm9kdWNlIHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgY29udGFjdC4gTGlzdGVkIGluIHRoZSBvcmRlcgogICAgICAqIG9mIGluY3JlYXNpbmcgcHJpb3JpdHkuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheU5hbWVTb3VyY2VzIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUyMCwxNSArODgwLDEyIEBACiAgICAgICoKICAgICAgKiBAc2VlIENvbnRhY3RzCiAgICAgICogQHNlZSBSYXdDb250YWN0cwotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludGVyZmFjZSBDb250YWN0TmFtZUNvbHVtbnMgewogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUga2luZCBvZiBkYXRhIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGUgY29udGFjdCwgc3VjaCBhcwotICAgICAgICAgKiBzdHJ1Y3R1cmVkIG5hbWUgb3IgZW1haWwgYWRkcmVzcy4gIFNlZSBEaXNwbGF5TmFtZVNvdXJjZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgRGlzcGxheU5hbWVTb3VyY2VzIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICogc3RydWN0dXJlZCBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuICBTZWUge0BsaW5rIERpc3BsYXlOYW1lU291cmNlc30uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfU09VUkNFID0gImRpc3BsYXlfbmFtZV9zb3VyY2UiOwogCkBAIC01NzYsOSArOTMzLDcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHBob25ldGljIGFscGhhYmV0IHVzZWQgdG8gcmVwcmVzZW50IHRoZSB7QGxpbmsgI1BIT05FVElDX05BTUV9LiAgU2VlCi0gICAgICAgICAqIFBob25ldGljTmFtZVN0eWxlLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBjb252ZXJ0IFBob25ldGljTmFtZVN0eWxlIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICoge0BsaW5rIFBob25ldGljTmFtZVN0eWxlfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX05BTUVfU1RZTEUgPSAicGhvbmV0aWNfbmFtZV9zdHlsZSI7CiAKQEAgLTU4OCwxMyArOTQzLDEwIEBACiAgICAgICAgICAqIHtAbGluayAjUEhPTkVUSUNfTkFNRV9TVFlMRX0uCiAgICAgICAgICAqIDwvcD4KICAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgotICAgICAgICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgaXMgb2YgaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMKLSAgICAgICAgICogd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljCi0gICAgICAgICAqIGFscGhhYmV0cywgc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuICBTZWUgUGhvbmV0aWNOYW1lU3R5bGUuCisgICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLiBUaGlzIGNhcGFiaWxpdHkgaXMgb2YKKyAgICAgICAgICogaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMgd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljIGFscGhhYmV0cywKKyAgICAgICAgICogc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuIFNlZSB7QGxpbmsgUGhvbmV0aWNOYW1lU3R5bGV9LgogICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgUGhvbmV0aWNOYW1lU3R5bGUgdG8gYSBsaW5rIGFmdGVyIGl0IGlzIHVuLWhpZGRlbgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVUSUNfTkFNRSA9ICJwaG9uZXRpY19uYW1lIjsKIApAQCAtNzQxLDYgKzEwOTMsMjAgQEAKICAgICAgKiB0aGF0IG1pbWUgdHlwZS48L3RkPgogICAgICAqIDwvdHI+CiAgICAgICogPHRyPgorICAgICAqIDx0ZD5sb25nPC90ZD4KKyAgICAgKiA8dGQ+e0BsaW5rICNQSE9UT19VUkl9PC90ZD4KKyAgICAgKiA8dGQ+cmVhZC1vbmx5PC90ZD4KKyAgICAgKiA8dGQ+QSBVUkkgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgY29udGFjdCdzIGZ1bGwtc2l6ZSBwaG90by4gVGhpcworICAgICAqIGNvbHVtbiBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBvZiByZXRyaWV2aW5nIHRoZSBjb250YWN0IHBob3RvLjwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPmxvbmc8L3RkPgorICAgICAqIDx0ZD57QGxpbmsgI1BIT1RPX1RIVU1CTkFJTF9VUkl9PC90ZD4KKyAgICAgKiA8dGQ+cmVhZC1vbmx5PC90ZD4KKyAgICAgKiA8dGQ+QSBVUkkgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgdGh1bWJuYWlsIG9mIGNvbnRhY3QncyBwaG90by4gIFRoaXMKKyAgICAgKiBjb2x1bW4gaXMgdGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgcmV0cmlldmluZyB0aGUgY29udGFjdCBwaG90by48L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgogICAgICAqIDx0ZD5pbnQ8L3RkPgogICAgICAqIDx0ZD57QGxpbmsgI0lOX1ZJU0lCTEVfR1JPVVB9PC90ZD4KICAgICAgKiA8dGQ+cmVhZC1vbmx5PC90ZD4KQEAgLTk3NiwxMCArMTM0MiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIE1hcmsgYSBjb250YWN0IGFzIGhhdmluZyBiZWVuIGNvbnRhY3RlZC4gIFRoaXMgdXBkYXRlcyB0aGUKLSAgICAgICAgICoge0BsaW5rICNUSU1FU19DT05UQUNURUR9IGFuZCB7QGxpbmsgI0xBU1RfVElNRV9DT05UQUNURUR9IGZvciB0aGUKLSAgICAgICAgICogY29udGFjdCwgcGx1cyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgb2YgYW55IGFzc29jaWF0ZWQgcmF3Ci0gICAgICAgICAqIGNvbnRhY3RzLgorICAgICAgICAgKiBNYXJrIGEgY29udGFjdCBhcyBoYXZpbmcgYmVlbiBjb250YWN0ZWQuIFVwZGF0ZXMgdHdvIGZpZWxkczoKKyAgICAgICAgICoge0BsaW5rICNUSU1FU19DT05UQUNURUR9IGFuZCB7QGxpbmsgI0xBU1RfVElNRV9DT05UQUNURUR9LiBUaGUKKyAgICAgICAgICogVElNRVNfQ09OVEFDVEVEIGZpZWxkIGlzIGluY3JlbWVudGVkIGJ5IDEgYW5kIHRoZSBMQVNUX1RJTUVfQ09OVEFDVEVECisgICAgICAgICAqIGZpZWxkIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgdGhlIENvbnRlbnRSZXNvbHZlciB0byB1c2UKICAgICAgICAgICogQHBhcmFtIGNvbnRhY3RJZCB0aGUgcGVyc29uIHdobyB3YXMgY29udGFjdGVkCkBAIC0xMDQxLDcgKzE0MDcsOCBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgY29udGFjdCB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgY29uc3RpdHVlbnQgcmF3IGNvbnRhY3QKLSAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuRGF0YX0gcm93cy4KKyAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuRGF0YX0gcm93cy4gIFRoaXMgZGlyZWN0b3J5IGNhbiBiZSB1c2VkIGVpdGhlcgorICAgICAgICAgKiB3aXRoIGEge0BsaW5rICNDT05URU5UX1VSSX0gb3Ige0BsaW5rICNDT05URU5UX0xPT0tVUF9VUkl9LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEYXRhIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIERhdGFDb2x1bW5zIHsKICAgICAgICAgICAgIC8qKgpAQCAtMTA1Nyw2ICsxNDI0LDU3IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBjb250YWN0IHRoYXQgY29udGFpbnMgYWxsIG9mIGl0cworICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0c30gYXMgd2VsbCBhcworICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLiBUbyBhY2Nlc3MgdGhpcyBkaXJlY3RvcnkgYXBwZW5kCisgICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSBjb250YWN0IFVSSS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogRW50aXR5IGhhcyB0aHJlZSBJRCBmaWVsZHM6IHtAbGluayAjQ09OVEFDVF9JRH0gZm9yIHRoZSBjb250YWN0LAorICAgICAgICAgKiB7QGxpbmsgI1JBV19DT05UQUNUX0lEfSBmb3IgdGhlIHJhdyBjb250YWN0IGFuZCB7QGxpbmsgI0RBVEFfSUR9IGZvcgorICAgICAgICAgKiB0aGUgZGF0YSByb3dzLiBFbnRpdHkgYWx3YXlzIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSByb3cgcGVyCisgICAgICAgICAqIGNvbnN0aXR1ZW50IHJhdyBjb250YWN0LCBldmVuIGlmIHRoZXJlIGFyZSBubyBhY3R1YWwgZGF0YSByb3dzLiBJbgorICAgICAgICAgKiB0aGlzIGNhc2UgdGhlIHtAbGluayAjREFUQV9JRH0gZmllbGQgd2lsbCBiZSBudWxsLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBFbnRpdHkgcmVhZHMgYWxsIGRhdGEgZm9yIHRoZSBlbnRpcmUgY29udGFjdCBpbiBvbmUgdHJhbnNhY3Rpb24sIHRvCisgICAgICAgICAqIGd1YXJhbnRlZSBjb25zaXN0ZW5jeS4gIFRoZXJlIGlzIHNpZ25pZmljYW50IGRhdGEgZHVwbGljYXRpb24KKyAgICAgICAgICogaW4gdGhlIEVudGl0eSAoZWFjaCByb3cgcmVwZWF0cyBhbGwgQ29udGFjdCBjb2x1bW5zIGFuZCBhbGwgUmF3Q29udGFjdAorICAgICAgICAgKiBjb2x1bW5zKSwgc28gdGhlIGJlbmVmaXRzIG9mIHRyYW5zYWN0aW9uYWwgY29uc2lzdGVuY3kgc2hvdWxkIGJlIHdlaWdoZWQKKyAgICAgICAgICogYWdhaW5zdCB0aGUgY29zdCBvZiB0cmFuc2ZlcnJpbmcgbGFyZ2UgYW1vdW50cyBvZiBkZW5vcm1hbGl6ZWQgZGF0YQorICAgICAgICAgKiBmcm9tIHRoZSBQcm92aWRlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ29udGFjdHNDb2x1bW5zLAorICAgICAgICAgICAgICAgIENvbnRhY3ROYW1lQ29sdW1ucywgUmF3Q29udGFjdHNDb2x1bW5zLCBCYXNlU3luY0NvbHVtbnMsIFN5bmNDb2x1bW5zLCBEYXRhQ29sdW1ucywKKyAgICAgICAgICAgICAgICBTdGF0dXNDb2x1bW5zLCBDb250YWN0T3B0aW9uc0NvbHVtbnMsIENvbnRhY3RTdGF0dXNDb2x1bW5zIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogbm8gcHVibGljIGNvbnN0cnVjdG9yIHNpbmNlIHRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByaXZhdGUgRW50aXR5KCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBkaXJlY3RvcnkgdHdpZyBmb3IgdGhpcyBzdWItdGFibGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAiZW50aXRpZXMiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgcmF3IGNvbnRhY3Qgcm93LgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFXX0NPTlRBQ1RfSUQgPSAicmF3X2NvbnRhY3RfaWQiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZGF0YSByb3cuIFRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhpcyByYXcgY29udGFjdCBoYXMgbm8KKyAgICAgICAgICAgICAqIGRhdGEgcm93cy4KKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfSUQgPSAiZGF0YV9pZCI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+CiAgICAgICAgICAqIEEgPGk+cmVhZC1vbmx5PC9pPiBzdWItZGlyZWN0b3J5IG9mIGEgc2luZ2xlIGNvbnRhY3QgYWdncmVnYXRlIHRoYXQKICAgICAgICAgICogY29udGFpbnMgYWxsIGFnZ3JlZ2F0aW9uIHN1Z2dlc3Rpb25zIChvdGhlciBjb250YWN0cykuIFRoZQogICAgICAgICAgKiBhZ2dyZWdhdGlvbiBzdWdnZXN0aW9ucyBhcmUgY29tcHV0ZWQgYmFzZWQgb24gYXBwcm94aW1hdGUgZGF0YQpAQCAtMTA4MSw5ICsxNDk5LDEzIEBACiAgICAgICAgICAqIDwvcHJlPgogICAgICAgICAgKgogICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCBlaXRoZXIgd2l0aCBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9yCisgICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9MT09LVVBfVVJJfS4KKyAgICAgICAgICogPC9wPgogICAgICAgICAgKi8KLSAgICAgICAgLy8gVE9ETzogYWRkIENvbnRhY3RPcHRpb25zQ29sdW1ucywgQ29udGFjdFN0YXR1c0NvbHVtbnMKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIENvbnRhY3RzQ29sdW1ucyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWdncmVnYXRpb25TdWdnZXN0aW9ucyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBDb250YWN0c0NvbHVtbnMsCisgICAgICAgICAgICAgICAgQ29udGFjdE9wdGlvbnNDb2x1bW5zLCBDb250YWN0U3RhdHVzQ29sdW1ucyB7CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBzaW5jZSB0aGlzIGlzIGEgdXRpbGl0eSBjbGFzcwogICAgICAgICAgICAgICovCkBAIC0xMDk1LDYgKzE1MTcsMTA2IEBACiAgICAgICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzI0NPTlRFTlRfRklMVEVSX1VSSX0uCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZID0gInN1Z2dlc3Rpb25zIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX05BTUUgPSAibmFtZSI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayBCdWlsZGVyI2FkZFBhcmFtZXRlcn0gdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgZGF0YSBpcworICAgICAgICAgICAgICogc3VwcGxpZWQgZm9yIHRoZSBzdWdnZXN0aW9uIHF1ZXJ5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9NQVRDSF9FTUFJTCA9ICJlbWFpbCI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayBCdWlsZGVyI2FkZFBhcmFtZXRlcn0gdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgZGF0YSBpcworICAgICAgICAgICAgICogc3VwcGxpZWQgZm9yIHRoZSBzdWdnZXN0aW9uIHF1ZXJ5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9NQVRDSF9QSE9ORSA9ICJwaG9uZSI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayBCdWlsZGVyI2FkZFBhcmFtZXRlcn0gdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgZGF0YSBpcworICAgICAgICAgICAgICogc3VwcGxpZWQgZm9yIHRoZSBzdWdnZXN0aW9uIHF1ZXJ5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9NQVRDSF9OSUNLTkFNRSA9ICJuaWNrbmFtZSI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQSBjb252ZW5pZW5jZSBidWlsZGVyIGZvciBhZ2dyZWdhdGlvbiBzdWdnZXN0aW9uIGNvbnRlbnQgVVJJcy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUT0RPOiBjaGFuZ2UgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB0byB1c2UgdGhlIGJ1aWxkZXIuCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBtQ29udGFjdElkOworICAgICAgICAgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUtpbmRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUxpbWl0OworCisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogT3B0aW9uYWwgZXhpc3RpbmcgY29udGFjdCBJRC4gIElmIGl0IGlzIG5vdCBwcm92aWRlZCwgdGhlIHNlYXJjaAorICAgICAgICAgICAgICAgICAqIHdpbGwgYmUgYmFzZWQgZXhjbHVzaXZlbHkgb24gdGhlIHZhbHVlcyBzdXBwbGllZCB3aXRoIHtAbGluayAjYWRkUGFyYW1ldGVyfS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb250YWN0SWQobG9uZyBjb250YWN0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tQ29udGFjdElkID0gY29udGFjdElkOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBBIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGFuIGFnZ3JlZ2F0aW9uCisgICAgICAgICAgICAgICAgICogc3VnZ2VzdGlvbi4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIEBwYXJhbSBraW5kIGNhbiBiZSBvbmUgb2YKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zI1BBUkFNRVRFUl9NQVRDSF9OQU1FfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zI1BBUkFNRVRFUl9NQVRDSF9FTUFJTH0sCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQWdncmVnYXRpb25TdWdnZXN0aW9ucyNQQVJBTUVURVJfTUFUQ0hfTklDS05BTUV9LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMjUEFSQU1FVEVSX01BVENIX1BIT05FfQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFBhcmFtZXRlcihTdHJpbmcga2luZCwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtS2luZHMuYWRkKGtpbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlcy5hZGQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldExpbWl0KGludCBsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBtTGltaXQgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIFVyaSBidWlsZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5uZXQuVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENvbnRhY3RzLkNPTlRFTlRfVVJJLmJ1aWxkVXBvbigpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZEVuY29kZWRQYXRoKFN0cmluZy52YWx1ZU9mKG1Db250YWN0SWQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRQYXRoKENvbnRhY3RzLkFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMuQ09OVEVOVF9ESVJFQ1RPUlkpOworICAgICAgICAgICAgICAgICAgICBpZiAobUxpbWl0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImxpbWl0IiwgU3RyaW5nLnZhbHVlT2YobUxpbWl0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtS2luZHMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoInF1ZXJ5IiwgbUtpbmRzLmdldChpKSArICI6IiArIG1WYWx1ZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnVpbGRlciBidWlsZGVyKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xMTMwLDkgKzE2NTIsMTIgQEAKICAgICAgICAgICogPHA+WW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIHVzaW5nIHRoZSBjb252ZW5pZW5jZSBtZXRob2QKICAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMjb3BlbkNvbnRhY3RQaG90b0lucHV0U3RyZWFtKENvbnRlbnRSZXNvbHZlciwgVXJpKX0KICAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgZWl0aGVyIHdpdGggYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvcgorICAgICAgICAgKiB7QGxpbmsgI0NPTlRFTlRfTE9PS1VQX1VSSX0uCisgICAgICAgICAqIDwvcD4KICAgICAgICAgICovCi0gICAgICAgIC8vIFRPRE86IGNoYW5nZSBEYXRhQ29sdW1ucyB0byBEYXRhQ29sdW1uc1dpdGhKb2lucwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBob3RvIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIERhdGFDb2x1bW5zIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQaG90byBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBEYXRhQ29sdW1uc1dpdGhKb2lucyB7CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciBzaW5jZSB0aGlzIGlzIGEgdXRpbGl0eSBjbGFzcwogICAgICAgICAgICAgICovCkBAIC0xMTQ4LDcgKzE2NzMsNiBAQAogICAgICAgICAgICAgICogdGhhdCBjb3VsZCBiZSBpbmZsYXRlZCB1c2luZyB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5fS4KICAgICAgICAgICAgICAqIDxwPgogICAgICAgICAgICAgICogVHlwZTogQkxPQgotICAgICAgICAgICAgICogQGhpZGUgVE9ETzogVW5oaWRlIGluIGEgc2VwYXJhdGUgQ0wKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPVE8gPSBEQVRBMTU7CiAgICAgICAgIH0KQEAgLTExNTcsNyArMTY4MSwxMCBAQAogICAgICAgICAgKiBPcGVucyBhbiBJbnB1dFN0cmVhbSBmb3IgdGhlIGNvbnRhY3RzJ3MgZGVmYXVsdCBwaG90byBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgICogcGhvdG8gYXMgYSBieXRlIHN0cmVhbS4gSWYgdGhlcmUgaXMgbm90IHBob3RvIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbnRhY3RVcmkgdGhlIGNvbnRhY3Qgd2hvc2UgcGhvdG8gc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgICogQHBhcmFtIGNvbnRhY3RVcmkgdGhlIGNvbnRhY3Qgd2hvc2UgcGhvdG8gc2hvdWxkIGJlIHVzZWQuIFRoaXMgY2FuIGJlIHVzZWQgd2l0aAorICAgICAgICAgKiBlaXRoZXIgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvciBhIHtAbGluayAjQ09OVEVOVF9MT09LVVBfVVJJfSBVUkkuCisgICAgICAgICAqIDwvcD4KKwogICAgICAgICAgKiBAcmV0dXJuIGFuIElucHV0U3RyZWFtIG9mIHRoZSBwaG90bywgb3IgbnVsbCBpZiBubyBwaG90byBpcyBwcmVzZW50CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIG9wZW5Db250YWN0UGhvdG9JbnB1dFN0cmVhbShDb250ZW50UmVzb2x2ZXIgY3IsIFVyaSBjb250YWN0VXJpKSB7CkBAIC0xMjQ1LDYgKzE3NzIsMTMgQEAKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfVkVSSUZJRUQgPSAibmFtZV92ZXJpZmllZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAicmVhZC1vbmx5IiBmbGFnOiAiMCIgYnkgZGVmYXVsdCwgIjEiIGlmIHRoZSByb3cgY2Fubm90IGJlIG1vZGlmaWVkIG9yCisgICAgICAgICAqIGRlbGV0ZWQgZXhjZXB0IGJ5IGEgc3luYyBhZGFwdGVyLiAgU2VlIHtAbGluayBDb250YWN0c0NvbnRyYWN0I0NBTExFUl9JU19TWU5DQURBUFRFUn0uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVdfQ09OVEFDVF9JU19SRUFEX09OTFkgPSAicmF3X2NvbnRhY3RfaXNfcmVhZF9vbmx5IjsKICAgICB9CiAKICAgICAvKioKQEAgLTE2MzAsMTAgKzIxNjQsMTAgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdHUkVHQVRJT05fTU9ERV9ERUZBVUxUID0gMDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogRG8gbm90IHVzZS4KLSAgICAgICAgICoKLSAgICAgICAgICogVE9ETzogZGVwcmVjYXRlIGluIGZhdm9yIG9mIHtAbGluayAjQUdHUkVHQVRJT05fTU9ERV9ERUZBVUxUfQorICAgICAgICAgKiBBZ2dyZWdhdGlvbiBtb2RlOiBhZ2dyZWdhdGUgYXQgdGhlIHRpbWUgdGhlIHJhdyBjb250YWN0IGlzIGluc2VydGVkL3VwZGF0ZWQuCisgICAgICAgICAqIEBkZXByZWNhdGVkIEFnZ3JlZ2F0aW9uIGlzIHN5bmNocm9ub3VzLCB0aGlzIGhpc3RvcmljIHZhbHVlIGlzIGEgbm8tb3AKICAgICAgICAgICovCisgICAgICAgIEBEZXByZWNhdGVkCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHR1JFR0FUSU9OX01PREVfSU1NRURJQVRFID0gMTsKIAogICAgICAgICAvKioKQEAgLTE3MDEsOSArMjIzNSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgcmF3IGNvbnRhY3QgdGhhdCBjb250YWlucyBhbGwgb2YgaXRzCiAgICAgICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LkRhdGF9IHJvd3MuIFRvIGFjY2VzcyB0aGlzIGRpcmVjdG9yeQotICAgICAgICAgKiBhcHBlbmQge0BsaW5rIERhdGEjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSBjb250YWN0IFVSSS4KLSAgICAgICAgICoKLSAgICAgICAgICogVE9ETzogZGVwcmVjYXRlIGluIGZhdm9yIG9mIHtAbGluayBSYXdDb250YWN0cy5FbnRpdHl9LgorICAgICAgICAgKiBhcHBlbmQge0BsaW5rIERhdGEjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSByYXcgY29udGFjdCBVUkkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERhdGEgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRGF0YUNvbHVtbnMgewogICAgICAgICAgICAgLyoqCkBAIC0xNzIyLDcgKzIyNTQsNyBAQAogICAgICAgICAgKiA8cD4KICAgICAgICAgICogQSBzdWItZGlyZWN0b3J5IG9mIGEgc2luZ2xlIHJhdyBjb250YWN0IHRoYXQgY29udGFpbnMgYWxsIG9mIGl0cwogICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLiBUbyBhY2Nlc3MgdGhpcyBkaXJlY3RvcnkgYXBwZW5kCi0gICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSBjb250YWN0IFVSSS4gU2VlCisgICAgICAgICAqIHtAbGluayBSYXdDb250YWN0cy5FbnRpdHkjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSByYXcgY29udGFjdCBVUkkuIFNlZQogICAgICAgICAgKiB7QGxpbmsgUmF3Q29udGFjdHNFbnRpdHl9IGZvciBhIHN0YW5kLWFsb25lIHRhYmxlIGNvbnRhaW5pbmcgdGhlIHNhbWUKICAgICAgICAgICogZGF0YS4KICAgICAgICAgICogPC9wPgpAQCAtMTczNCwxMCArMjI2NiwxMCBAQAogICAgICAgICAgKiBudWxsLgogICAgICAgICAgKiA8L3A+CiAgICAgICAgICAqIDxwPgotICAgICAgICAgKiBFbnRpdHkgcmVhZHMgYWxsCi0gICAgICAgICAqIGRhdGEgZm9yIGEgcmF3IGNvbnRhY3QgaW4gb25lIHRyYW5zYWN0aW9uLCB0byBndWFyYW50ZWUKLSAgICAgICAgICogY29uc2lzdGVuY3kuCi0gICAgICAgICAqIDwvcD4KKyAgICAgICAgICogVXNpbmcgRW50aXR5IHNob3VsZCBiZSBwcmVmZXJyZWQgdG8gdXNpbmcgdHdvIHNlcGFyYXRlIHF1ZXJpZXM6CisgICAgICAgICAqIFJhd0NvbnRhY3RzIGZvbGxvd2VkIGJ5IERhdGEuIFRoZSByZWFzb24gaXMgdGhhdCBFbnRpdHkgcmVhZHMgYWxsCisgICAgICAgICAqIGRhdGEgZm9yIGEgcmF3IGNvbnRhY3QgaW4gb25lIHRyYW5zYWN0aW9uLCBzbyB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eQorICAgICAgICAgKiBvZiB0aGUgZGF0YSBjaGFuZ2luZyBiZXR3ZWVuIHRoZSB0d28gcXVlcmllcy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIERhdGFDb2x1bW5zIHsKICAgICAgICAgICAgIC8qKgpAQCAtMTc1Miw3ICsyMjg0LDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZID0gImVudGl0eSI7CiAKICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIElEIG9mIHRoZSBkYXRhIGNvbHVtbi4gVGhlIHZhbHVlIHdpbGwgYmUgbnVsbCBpZiB0aGlzIHJhdyBjb250YWN0IGhhcyBubworICAgICAgICAgICAgICogVGhlIElEIG9mIHRoZSBkYXRhIHJvdy4gVGhlIHZhbHVlIHdpbGwgYmUgbnVsbCBpZiB0aGlzIHJhdyBjb250YWN0IGhhcyBubwogICAgICAgICAgICAgICogZGF0YSByb3dzLgogICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KICAgICAgICAgICAgICAqLwpAQCAtMTg0MCwyOCArMjM3MiwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuREFUQV9WRVJTSU9OKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogREFUQV9LRVlTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzTnVsbChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBwdXQgYW55dGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3Vyc29yLmdldFR5cGUoY29sdW1uSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBwdXQgYW55dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2LnB1dChrZXksIGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0JMT0I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2LnB1dChrZXksIGN1cnNvci5nZXRCbG9iKGNvbHVtbkluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIG9yIHVuaGFuZGxlZCBkYXRhIHR5cGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGdvIGJhY2sgdG8gdGhpcyB2ZXJzaW9uIG9mIHRoZSBjb2RlIHdoZW4gYnVnCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yMzA2MzcwIGlzIGZpeGVkLgotLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzTnVsbChjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc0xvbmcoY29sdW1uSW5kZXgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KGtleSwgY3Vyc29yLmdldExvbmcoY29sdW1uSW5kZXgpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuaXNGbG9hdChjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0RmxvYXQoY29sdW1uSW5kZXgpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuaXNTdHJpbmcoY29sdW1uSW5kZXgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KGtleSwgY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc0Jsb2IoY29sdW1uSW5kZXgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KGtleSwgY3Vyc29yLmdldEJsb2IoY29sdW1uSW5kZXgpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuYWRkU3ViVmFsdWUoQ29udGFjdHNDb250cmFjdC5EYXRhLkNPTlRFTlRfVVJJLCBjdik7CiAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSk7CkBAIC0xOTYyLDI3ICsyNDg3LDI0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb250YWN0J3MgYXVkaW8vdmlkZW8gY2hhdCBjYXBhYmlsaXR5IGxldmVsLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChvbmUgb2YgdGhlIHZhbHVlcyBiZWxvdyk8L1A+Ci0gICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFUX0NBUEFCSUxJVFkgPSAiY2hhdF9jYXBhYmlsaXR5IjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQW4gYWxsb3dlZCB2YWx1ZSBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWN0J3MgZGV2aWNlIGNhbgorICAgICAgICAgKiBBbiBhbGxvd2VkIGZsYWcgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgYXVkaW8tY2hhdCBjYXBhYmlsaXR5IChtaWNyb3Bob25lCisgICAgICAgICAqIGFuZCBzcGVha2VyKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUJJTElUWV9IQVNfVk9JQ0UgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBhbGxvd2VkIGZsYWcgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBjYW4KICAgICAgICAgICogZGlzcGxheSBhIHZpZGVvIGZlZWQuCi0gICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBBQklMSVRZX0hBU19WSURFT19QTEFZQkFDS19PTkxZID0gMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUJJTElUWV9IQVNfVklERU8gPSAyOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhbGxvd2VkIHZhbHVlIG9mIHtAbGluayAjQ0hBVF9DQVBBQklMSVRZfS4gSW5kaWNhdGVzIGF1ZGlvLWNoYXQgY2FwYWJpbGl0eS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX1ZPSUNFID0gMjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gYWxsb3dlZCB2YWx1ZSBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWN0J3MgZGV2aWNlIGhhcyBhCisgICAgICAgICAqIEFuIGFsbG93ZWQgZmxhZyBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWN0J3MgZGV2aWNlIGhhcyBhCiAgICAgICAgICAqIGNhbWVyYSB0aGF0IGNhbiBiZSB1c2VkIGZvciB2aWRlbyBjaGF0IChlLmcuIGEgZnJvbnQtZmFjaW5nIGNhbWVyYSBvbiBhIHBob25lKS4KLSAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX0NBTUVSQSA9IDQ7CiAgICAgfQpAQCAtMjAyOCw2ICsyNTUwLDEzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NVUEVSX1BSSU1BUlkgPSAiaXNfc3VwZXJfcHJpbWFyeSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAicmVhZC1vbmx5IiBmbGFnOiAiMCIgYnkgZGVmYXVsdCwgIjEiIGlmIHRoZSByb3cgY2Fubm90IGJlIG1vZGlmaWVkIG9yCisgICAgICAgICAqIGRlbGV0ZWQgZXhjZXB0IGJ5IGEgc3luYyBhZGFwdGVyLiAgU2VlIHtAbGluayBDb250YWN0c0NvbnRyYWN0I0NBTExFUl9JU19TWU5DQURBUFRFUn0uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19SRUFEX09OTFkgPSAiaXNfcmVhZF9vbmx5IjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhpcyBkYXRhIHJlY29yZC4gVGhpcyBpcyBhIHJlYWQtb25seSB2YWx1ZS4gVGhlIGRhdGEgY29sdW1uIGlzCiAgICAgICAgICAqIGd1YXJhbnRlZWQgdG8gbm90IGNoYW5nZSB3aXRob3V0IHRoZSB2ZXJzaW9uIGdvaW5nIHVwLiBUaGlzIHZhbHVlIGlzIG1vbm90b25pY2FsbHkKICAgICAgICAgICogaW5jcmVhc2luZy4KQEAgLTI4NjIsNiArMzM5MSwxNCBAQAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAibGFiZWwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVyJ3MgRTE2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTElaRURfTlVNQkVSID0gIm5vcm1hbGl6ZWRfbnVtYmVyIjsKICAgICB9CiAKICAgICAvKioKQEAgLTMxMjQsNiArMzY2MSwzMiBAQAogICAgICAqIDxsaT57QGxpbmsgI0FWQUlMQUJMRX08L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFNpbmNlIHByZXNlbmNlIHN0YXR1cyBpcyBpbmhlcmVudGx5IHZvbGF0aWxlLCB0aGUgY29udGVudCBwcm92aWRlcgorICAgICAqIG1heSBjaG9vc2Ugbm90IHRvIHN0b3JlIHRoaXMgZmllbGQgaW4gbG9uZy10ZXJtIHN0b3JhZ2UuCisgICAgICogPC9wPgorICAgICAqIDwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPmludDwvdGQ+CisgICAgICogPHRkPntAbGluayAjQ0hBVF9DQVBBQklMSVRZfTwvdGQ+CisgICAgICogPHRkPnJlYWQvd3JpdGU8L3RkPgorICAgICAqIDx0ZD5Db250YWN0IElNIGNoYXQgY29tcGF0aWJpbGl0eSB2YWx1ZS4gVGhlIGFsbG93ZWQgdmFsdWVzIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nCisgICAgICogZmxhZ3MuIElmIE5vbmUgb2YgdGhlc2UgZmxhZ3MgaXMgc2V0LCB0aGUgZGV2aWNlIGNhbiBvbmx5IGRvIHRleHQgbWVzc2FnaW5nLgorICAgICAqIDxwPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNDQVBBQklMSVRZX0hBU19WSURFT308L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0NBUEFCSUxJVFlfSEFTX1ZPSUNFfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQ0FQQUJJTElUWV9IQVNfQ0FNRVJBfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogU2luY2UgY2hhdCBjb21wYXRpYmlsaXR5IGlzIGluaGVyZW50bHkgdm9sYXRpbGUgYXMgdGhlIGNvbnRhY3QncyBhdmFpbGFiaWxpdHkgbW92ZXMgZnJvbQorICAgICAqIG9uZSBkZXZpY2UgdG8gYW5vdGhlciwgdGhlIGNvbnRlbnQgcHJvdmlkZXIgbWF5IGNob29zZSBub3QgdG8gc3RvcmUgdGhpcyBmaWVsZCBpbiBsb25nLXRlcm0KKyAgICAgKiBzdG9yYWdlLgorICAgICAqIDwvcD4KKyAgICAgKiA8L3RkPgorICAgICAqIDwvdHI+CiAgICAgICogPHRyPgogICAgICAqIDx0ZD5TdHJpbmc8L3RkPgogICAgICAqIDx0ZD57QGxpbmsgI1NUQVRVU308L3RkPgpAQCAtMzY5MSw2ICs0MjU0LDE0IEBACiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVIgPSBEQVRBOwogCiAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXIncyBFMTY0IHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1JNQUxJWkVEX05VTUJFUiA9IERBVEE0OworCisgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGVMYWJlbChSZXNvdXJjZXMsIGludCwgQ2hhclNlcXVlbmNlKX0gaW5zdGVhZC4KICAgICAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAgICAgKi8KQEAgLTM3NzIsNyArNDM0Myw3IEBACiAgICAgICAgICAqIDwvdHI+CiAgICAgICAgICAqIDx0cj4KICAgICAgICAgICogPHRkPlN0cmluZzwvdGQ+Ci0gICAgICAgICAqIDx0ZD57QGxpbmsgI0RBVEF9PC90ZD4KKyAgICAgICAgICogPHRkPntAbGluayAjQUREUkVTU308L3RkPgogICAgICAgICAgKiA8dGQ+e0BsaW5rICNEQVRBMX08L3RkPgogICAgICAgICAgKiA8dGQ+RW1haWwgYWRkcmVzcyBpdHNlbGYuPC90ZD4KICAgICAgICAgICogPC90cj4KQEAgLTM4NjMsNyArNDQzNCw2IEBACiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzLgogICAgICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICAgICAqIEBoaWRlIFRPRE86IFVuaGlkZSBpbiBhIHNlcGFyYXRlIENMCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1MgPSBEQVRBMTsKIApAQCAtNTAyNyw2ICs1NTk3LDIzIEBACiAgICAgICAgICAqIFR5cGU6IElOVEVHRVIgKGJvb2xlYW4pCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfU1lOQyA9ICJzaG91bGRfc3luYyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFueSBuZXdseSBjcmVhdGVkIGNvbnRhY3RzIHdpbGwgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBncm91cHMgdGhhdCBoYXZlIHRoaXMKKyAgICAgICAgICogZmxhZyBzZXQgdG8gdHJ1ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFR5cGU6IElOVEVHRVIgKGJvb2xlYW4pCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0FERCA9ICJhdXRvX2FkZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZW4gYSBjb250YWN0cyBpcyBtYXJrZWQgYXMgYSBmYXZvcml0ZXMgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkCisgICAgICAgICAqIHRvIHRoZSBncm91cHMgdGhhdCBoYXZlIHRoaXMgZmxhZyBzZXQsIGFuZCB3aGVuIGl0IGlzIHJlbW92ZWQgZnJvbSBmYXZvcml0ZXMKKyAgICAgICAgICogaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlc2UgZ3JvdXBzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVk9SSVRFUyA9ICJmYXZvcml0ZXMiOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTE2Nyw2ICs1NzU0LDggQEAKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIERFTEVURUQpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBOT1RFUyk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIFNIT1VMRF9TWU5DKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgRkFWT1JJVEVTKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgQVVUT19BREQpOwogICAgICAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9OZXh0KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHkodmFsdWVzKTsKICAgICAgICAgICAgIH0KQEAgLTU2ODMsNiArNjI3MiwyOCBAQAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uU0hPV19PUl9DUkVBVEVfQ09OVEFDVCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFN0YXJ0cyBhbiBBY3Rpdml0eSB0aGF0IGxldHMgdGhlIHVzZXIgc2VsZWN0IHRoZSBtdWx0aXBsZSBwaG9uZXMgZnJvbSBhCisgICAgICAgICAqIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyB3aGljaCBjb21lIGZyb20gdGhlIGNvbnRhY3RzIG9yCisgICAgICAgICAqIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU30uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVycyBiZWluZyBwYXNzZWQgaW4gdGhyb3VnaCB7QGxpbmsgI0VYVFJBX1BIT05FX1VSSVN9CisgICAgICAgICAqIGNvdWxkIGJlbG9uZyB0byB0aGUgY29udGFjdHMgb3Igbm90LCBhbmQgd2lsbCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHVzZXIncyBzZWxlY3Rpb24gd2lsbCBiZSByZXR1cm5lZCBmcm9tCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50KX0KKyAgICAgICAgICogaWYgdGhlIHJlc3VsdENvZGUgaXMKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I1JFU1VMVF9PS30sIHRoZSBhcnJheSBvZiBwaWNrZWQgcGhvbmUKKyAgICAgICAgICogbnVtYmVycyBhcmUgaW4gdGhlIEludGVudCdzCisgICAgICAgICAqIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU307IG90aGVyd2lzZSwgdGhlCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNSRVNVTFRfQ0FOQ0VMRUR9IGlzIHJldHVybmVkIGlmIHRoZSB1c2VyCisgICAgICAgICAqIGxlZnQgdGhlIEFjdGl2aXR5IHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfTVVMVElQTEVfUEhPTkVTID0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29udGFjdHMuYWN0aW9uLkdFVF9NVUxUSVBMRV9QSE9ORVMiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNTSE9XX09SX0NSRUFURV9DT05UQUNUfSB0byBmb3JjZSBjcmVhdGluZyBhIG5ldwogICAgICAgICAgKiBjb250YWN0IGlmIG5vIG1hdGNoaW5nIGNvbnRhY3QgZm91bmQuIE90aGVyd2lzZSwgZGVmYXVsdCBiZWhhdmlvciBpcwogICAgICAgICAgKiB0byBwcm9tcHQgdXNlciB3aXRoIGRpYWxvZyBiZWZvcmUgY3JlYXRpbmcuCkBAIC01NzAzLDYgKzYzMTQsMjMgQEAKICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uQ1JFQVRFX0RFU0NSSVBUSU9OIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX0dFVF9NVUxUSVBMRV9QSE9ORVN9IGFzIHRoZSBpbnB1dCBvciBvdXRwdXQgdmFsdWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVycyB3YW50IHRvIGJlIHBpY2tlZCBieSBkZWZhdWx0IHNob3VsZCBiZSBwYXNzZWQgaW4gYXMKKyAgICAgICAgICogaW5wdXQgdmFsdWUuIFRoZXNlIHBob25lIG51bWJlcnMgY291bGQgYmVsb25nIHRvIHRoZSBjb250YWN0cyBvciBub3QuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVycyB3aGljaCB3ZXJlIHBpY2tlZCBieSB0aGUgdXNlciBhcmUgcmV0dXJuZWQgYXMgb3V0cHV0CisgICAgICAgICAqIHZhbHVlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogYXJyYXkgb2YgVVJJcywgdGhlIHRlbCBVUkkgaXMgdXNlZCBmb3IgdGhlIHBob25lIG51bWJlcnMgd2hpY2ggZG9uJ3QKKyAgICAgICAgICogYmVsb25nIHRvIGFueSBjb250YWN0LCB0aGUgY29udGVudCBVUkkgaXMgdXNlZCBmb3IgcGhvbmUgaWQgaW4gY29udGFjdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QSE9ORV9VUklTID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5leHRyYS5QSE9ORV9VUklTIjsKKworICAgICAgICAvKioKICAgICAgICAgICogT3B0aW9uYWwgZXh0cmEgdXNlZCB3aXRoIHtAbGluayAjU0hPV19PUl9DUkVBVEVfQ09OVEFDVH0gdG8gc3BlY2lmeSBhCiAgICAgICAgICAqIGRpYWxvZyBsb2NhdGlvbiB1c2luZyBzY3JlZW4gY29vcmRpbmF0ZXMuIFdoZW4gbm90IHNwZWNpZmllZCwgdGhlCiAgICAgICAgICAqIGRpYWxvZyB3aWxsIGJlIGNlbnRlcmVkLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRHJtU3RvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0RybVN0b3JlLmphdmEKaW5kZXggYzQzOGFjNC4uMzRmMmYwZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRHJtU3RvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZS5qYXZhCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBpbnNlcnRpbmcgYSBmaWxlIHN0cmVhbSBpbnRvIHRoZSBEUk0gY29udGVudCBwcm92aWRlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBjciBUaGUgY29udGVudCByZXNvbHZlciB0byB1c2UKLSAgICAgKiBAcGFyYW0gZmlsZVN0cmVhbSBUaGUgRmlsZUlucHV0U3RyZWFtIHRvIGluc2VydAorICAgICAqIEBwYXJhbSBmaXMgVGhlIEZpbGVJbnB1dFN0cmVhbSB0byBpbnNlcnQKICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIGZvciB0aGUgY29udGVudCAob3IgbnVsbCkKICAgICAgKiBAcmV0dXJuIHVyaSB0byB0aGUgRFJNIHJlY29yZCBvciBudWxsCiAgICAgICovCkBAIC0xNDMsMTEgKzE0MywxMSBAQAogICAgICAgICAgICAgRHJtUmF3Q29udGVudCBjb250ZW50ID0gbmV3IERybVJhd0NvbnRlbnQoZmlzLCAoaW50KSBmaXMuYXZhaWxhYmxlKCksCiAgICAgICAgICAgICAgICAgICAgIERybVJhd0NvbnRlbnQuRFJNX01JTUVUWVBFX01FU1NBR0VfU1RSSU5HKTsKICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGNvbnRlbnQuZ2V0Q29udGVudFR5cGUoKTsKKyAgICAgICAgICAgIGxvbmcgc2l6ZSA9IGZpcy5nZXRDaGFubmVsKCkuc2l6ZSgpOwogCiAgICAgICAgICAgICBEcm1SaWdodHNNYW5hZ2VyIG1hbmFnZXIgPSBtYW5hZ2VyID0gRHJtUmlnaHRzTWFuYWdlci5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgRHJtUmlnaHRzIHJpZ2h0cyA9IG1hbmFnZXIucXVlcnlSaWdodHMoY29udGVudCk7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBjb250ZW50LmdldENvbnRlbnRJbnB1dFN0cmVhbShyaWdodHMpOwotICAgICAgICAgICAgbG9uZyBzaXplID0gc3RyZWFtLmF2YWlsYWJsZSgpOwogCiAgICAgICAgICAgICBVcmkgY29udGVudFVyaSA9IG51bGw7CiAgICAgICAgICAgICBpZiAobWltZVR5cGUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQppbmRleCAwNzVkYTMzLi5iNzRlNzZmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCkBAIC0yNTMsOSArMjUzLDEwMyBAQAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFID0gIm1pbWVfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNVFAgb2JqZWN0IGhhbmRsZSBvZiBhIG5ld2x5IHRyYW5zZmVyZWQgZmlsZS4KKyAgICAgICAgICogVXNlZCB0byBwYXNzIHRoZSBuZXcgZmlsZSdzIG9iamVjdCBoYW5kbGUgdGhyb3VnaCB0aGUgbWVkaWEgc2Nhbm5lcgorICAgICAgICAgKiBmcm9tIE1UUCB0byB0aGUgbWVkaWEgcHJvdmlkZXIKKyAgICAgICAgICogRm9yIGludGVybmFsIHVzZSBvbmx5IGJ5IE1UUCwgbWVkaWEgc2Nhbm5lciBhbmQgbWVkaWEgcHJvdmlkZXIuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9TQ0FOTkVSX05FV19PQkpFQ1RfSUQgPSAibWVkaWFfc2Nhbm5lcl9uZXdfb2JqZWN0X2lkIjsKICAgICAgfQogCiAgICAgLyoqCisgICAgICogTWVkaWEgcHJvdmlkZXIgdGFibGUgY29udGFpbmluZyBhbiBpbmRleCBvZiBhbGwgZmlsZXMgaW4gdGhlIHN0b3JhZ2UuCisgICAgICogVGhpcyBjYW4gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgdG8gZmluZCBhbGwgZG9jdW1lbnRzIG9mIGEgcGFydGljdWxhciB0eXBlCisgICAgICogYW5kIGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBkZXZpY2Ugc2lkZSBNVFAgaW1wbGVtZW50YXRpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVzIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKFN0cmluZyB2b2x1bWVOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIvZmlsZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgZ2V0Q29udGVudFVyaShTdHJpbmcgdm9sdW1lTmFtZSwKKyAgICAgICAgICAgICAgICBsb25nIGZpbGVJZCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9TTEFTSCArIHZvbHVtZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiL2ZpbGUvIiArIGZpbGVJZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRNdHBPYmplY3RzVXJpKFN0cmluZyB2b2x1bWVOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIvb2JqZWN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBnZXRNdHBPYmplY3RzVXJpKFN0cmluZyB2b2x1bWVOYW1lLAorICAgICAgICAgICAgICAgIGxvbmcgZmlsZUlkKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBmaWxlSWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXNlZCB0byBpbXBsZW1lbnQgdGhlIE1UUCBHZXRPYmplY3RSZWZlcmVuY2VzIGFuZCBTZXRPYmplY3RSZWZlcmVuY2VzIGNvbW1hbmRzLgorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBnZXRNdHBSZWZlcmVuY2VzVXJpKFN0cmluZyB2b2x1bWVOYW1lLAorICAgICAgICAgICAgICAgIGxvbmcgZmlsZUlkKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBmaWxlSWQgKyAiL3JlZmVyZW5jZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWVsZHMgZm9yIG1hc3RlciB0YWJsZSBmb3IgYWxsIG1lZGlhIGZpbGVzLgorICAgICAgICAgKiBUYWJsZSBhbHNvIGNvbnRhaW5zIE1lZGlhQ29sdW1ucy5fSUQsIERBVEEsIFNJWkUgYW5kIERBVEVfTU9ESUZJRUQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIEZpbGVDb2x1bW5zIGV4dGVuZHMgTWVkaWFDb2x1bW5zIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIE1UUCBmb3JtYXQgY29kZSBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEUgPSAibWltZV90eXBlIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGNvbnRlbnQKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgbWVkaWEgdHlwZSAoYXVkaW8sIHZpZGVvLCBpbWFnZSBvciBwbGF5bGlzdCkKKyAgICAgICAgICAgICAqIG9mIHRoZSBmaWxlLCBvciAwIGZvciBub3QgYSBtZWRpYSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9UWVBFID0gIm1lZGlhX3R5cGUiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENvbnN0YW50cyBmb3IgTUVESUFfVFlQRQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX05PTkUgPSAwOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9JTUFHRSA9IDE7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX0FVRElPID0gMjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfVklERU8gPSAzOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9QTEFZTElTVCA9IDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBJbWFnZXMuVGh1bWJuYWlscyBhbmQgVmlkZW8uVGh1bWJuYWlscywgaXQncyBub3QgaW50ZW5kZWQKICAgICAgKiB0byBiZSBhY2Nlc3NlZCBlbHNld2hlcmUuCiAgICAgICovCkBAIC0zMzUsMjYgKzQyOSwyNyBAQAogICAgICAgICAgICAgLy8gTG9nLnYoVEFHLCAiZ2V0VGh1bWJuYWlsOiBvcmlnSWQ9IitvcmlnSWQrIiwga2luZD0iK2tpbmQrIiwgaXNWaWRlbz0iK2lzVmlkZW8pOwogICAgICAgICAgICAgLy8gSWYgdGhlIG1hZ2ljIGlzIG5vbi16ZXJvLCB3ZSBzaW1wbHkgcmV0dXJuIHRodW1ibmFpbCBpZiBpdCBkb2VzIGV4aXN0LgogICAgICAgICAgICAgLy8gcXVlcnlpbmcgTWVkaWFQcm92aWRlciBhbmQgc2ltcGx5IHJldHVybiB0aHVtYm5haWwuCi0gICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IE1pbmlUaHVtYkZpbGUuaW5zdGFuY2UoYmFzZVVyaSk7Ci0gICAgICAgICAgICBsb25nIG1hZ2ljID0gdGh1bWJGaWxlLmdldE1hZ2ljKG9yaWdJZCk7Ci0gICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChraW5kID09IE1JQ1JPX0tJTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGh1bWJCdWZMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVGh1bWJCdWYgPSBuZXcgYnl0ZVtNaW5pVGh1bWJGaWxlLkJZVEVTX1BFUl9NSU5USFVNQl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoc1RodW1iQnVmLCAwLCBzVGh1bWJCdWYubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IG5ldyBNaW5pVGh1bWJGaWxlKGlzVmlkZW8gPyBWaWRlby5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSQorICAgICAgICAgICAgICAgICAgICA6IEltYWdlcy5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSSk7CisgICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbWFnaWMgPSB0aHVtYkZpbGUuZ2V0TWFnaWMob3JpZ0lkKTsKKyAgICAgICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBNSUNST19LSU5EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUaHVtYkJ1ZkxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RodW1iQnVmID0gbmV3IGJ5dGVbTWluaVRodW1iRmlsZS5CWVRFU19QRVJfTUlOVEhVTUJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHNUaHVtYkJ1ZiwgMCwgc1RodW1iQnVmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT0gTUlOSV9LSU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4gPSBpc1ZpZGVvID8gInZpZGVvX2lkPSIgOiAiaW1hZ2VfaWQ9IjsKLSAgICAgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IE1JTklfS0lORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbHVtbiA9IGlzVmlkZW8gPyAidmlkZW9faWQ9IiA6ICJpbWFnZV9pZD0iOwogICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJhc2VVcmksIFBST0pFQ1RJT04sIGNvbHVtbiArIG9yaWdJZCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IGdldE1pbmlUaHVtYkZyb21GaWxlKGMsIGJhc2VVcmksIGNyLCBvcHRpb25zKTsKQEAgLTM2MiwxNyArNDU3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFVyaSBibG9ja2luZ1VyaSA9IGJhc2VVcmkuYnVpbGRVcG9uKCkuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImJsb2NraW5nIiwgIjEiKQogICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJvcmlnX2lkIiwgU3RyaW5nLnZhbHVlT2Yob3JpZ0lkKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigiZ3JvdXBfaWQiLCBTdHJpbmcudmFsdWVPZihncm91cElkKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJsb2NraW5nVXJpLCBQUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBvcmlnaW5hbCBpbWFnZS92aWRlbyBkb2Vzbid0IGV4aXN0LgogICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIHJldHVybiBudWxsOwpAQCAtNDIzLDYgKzUxNCw5IEBACiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBleCk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBhcHBsaWNhdGlvbiBwcm9jZXNzLgorICAgICAgICAgICAgICAgIHRodW1iRmlsZS5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgICAgICAgdGh1bWJGaWxlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgIH0KQEAgLTExNDAsNiArMTIzNCwxOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEdldCB0aGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHF1ZXJ5aW5nIHRoZSBnZW5yZXMgb2YgYW4gYXVkaW8gZmlsZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gdm9sdW1lTmFtZSB0aGUgbmFtZSBvZiB0aGUgdm9sdW1lIHRvIGdldCB0aGUgVVJJIGZvcgorICAgICAgICAgICAgICogQHBhcmFtIGF1ZGlvSWQgdGhlIElEIG9mIHRoZSBhdWRpbyBmaWxlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgZ2VucmVzCisgICAgICAgICAgICAgKiBAcmV0dXJuIHRoZSBVUkkgdG8gZm9yIHF1ZXJ5aW5nIHRoZSBnZW5yZXMgZm9yIHRoZSBhdWRpbyBmaWxlCisgICAgICAgICAgICAgKiB3aXRoIHRoZSBnaXZlbiB0aGUgdm9sdW1lIGFuZCBhdWRpb0lECisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmlGb3JBdWRpb0lkKFN0cmluZyB2b2x1bWVOYW1lLCBpbnQgYXVkaW9JZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIvYXVkaW8vbWVkaWEvIiArIGF1ZGlvSWQgKyAiL2dlbnJlcyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhlIGludGVybmFsIHN0b3JhZ2UuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIElOVEVSTkFMX0NPTlRFTlRfVVJJID0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTXRwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxNjFlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogVGhlIE1UUCBwcm92aWRlciBzdXBwb3J0cyBhY2Nlc3NpbmcgY29udGVudCBvbiBNVFAgYW5kIFBUUCBkZXZpY2VzLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE10cAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTXRwIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJtdHAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIID0gImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggPSAiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2RldmljZS8iOworCisKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGFuIE1UUCBzZXNzaW9uIHdpdGggdGhlIGhvc3QuCisgICAgICogVGhpcyBicm9hZGNhc3QgaXMgb25seSBzZW50IGlmIE1UUCBhY3Rpdml0eSBoYXMgbW9kaWZpZWQgdGhlIG1lZGlhIGRhdGFiYXNlIGR1cmluZyB0aGUKKyAgICAgKiBtb3N0IHJlY2VudCBNVFAgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NVFBfU0VTU0lPTl9FTkQgPSAiYW5kcm9pZC5wcm92aWRlci5hY3Rpb24uTVRQX1NFU1NJT05fRU5EIjsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2YgYWxsIE1UUC9QVFAgZGV2aWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGV2aWNlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgImRldmljZSIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9ICJtb2RlbCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBzdG9yYWdlIHVuaXRzIGZvciBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RvcmFnZSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRCArICIvc3RvcmFnZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQsIGxvbmcgc3RvcmFnZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEICsgIi9zdG9yYWdlLyIgKyBzdG9yYWdlSUQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3JhZ2UgdW5pdCBpZGVudGlmaWVyCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSID0gImlkZW50aWZpZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9yYWdlIHVuaXQgZGVzY3JpcHRpb24KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBsaXN0IG9mIG9iamVjdHMgb24gYW4gTVRQL1BUUCBkZXZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE9iamVjdCBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCwgbG9uZyBvYmplY3RJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRAorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBvYmplY3RJRCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpRm9yT2JqZWN0Q2hpbGRyZW4oaW50IGRldmljZUlELCBsb25nIG9iamVjdElEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElEICsgIi9jaGlsZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihpbnQgZGV2aWNlSUQsIGxvbmcgc3RvcmFnZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9zdG9yYWdlLyIgKyBzdG9yYWdlSUQgKyAiL2NoaWxkIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyBjb2x1bW5zIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkcyBpbiB0aGUgT2JqZWN0SW5mbyBkYXRhc2V0CisgICAgICAgICAqIGFzIGRlc2NyaWJlZCBpbiB0aGUgTVRQIHNwZWNpZmljYXRpb24uCisgICAgICAgICAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIHN0b3JhZ2UgdW5pdCBjb250YWluaW5nIHRoZSBvYmplY3QuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SQUdFX0lEID0gInN0b3JhZ2VfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2JqZWN0J3MgZm9ybWF0LiAgQ2FuIGJlIG9uZSBvZiB0aGUgRk9STUFUXyogc3ltYm9scyBiZWxvdywKKyAgICAgICAgICogb3IgYW55IG9mIHRoZSB2YWxpZCBNVFAgb2JqZWN0IGZvcm1hdHMgYXMgZGVmaW5lZCBpbiB0aGUgTVRQIHNwZWNpZmljYXRpb24uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVQgPSAiZm9ybWF0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHByb3RlY3Rpb24gc3RhdHVzIG9mIHRoZSBvYmplY3QuICBTZWUgdGhlIFBST1RFQ1RJT05fU1RBVFVTXypzeW1ib2xzIGJlbG93LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVEVDVElPTl9TVEFUVVMgPSAicHJvdGVjdGlvbl9zdGF0dXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGluIGJ5dGVzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0laRSA9ICJzaXplIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCdzIHRodW1ibmFpbCBmb3JtYXQuICBDYW4gYmUgb25lIG9mIHRoZSBGT1JNQVRfKiBzeW1ib2xzIGJlbG93LAorICAgICAgICAgKiBvciBhbnkgb2YgdGhlIHZhbGlkIE1UUCBvYmplY3QgZm9ybWF0cyBhcyBkZWZpbmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CX0ZPUk1BVCA9ICJ0aHVtYl9mb3JtYXQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0J3MgdGh1bWJuYWlsIGluIGJ5dGVzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfU0laRSA9ICJ0aHVtYl9zaXplIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfV0lEVEggPSAidGh1bWJfd2lkdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfSEVJR0hUID0gInRodW1iX2hlaWdodCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QncyB0aHVtYm5haWwuCisgICAgICAgICAqIDxQPlR5cGU6IEJMT0I8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQiA9ICJ0aHVtYiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgb2JqZWN0IGluIHBpeGVscy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX1dJRFRIID0gImltYWdlX3dpZHRoIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgb2JqZWN0IGluIHBpeGVscy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0hFSUdIVCA9ICJpbWFnZV9oZWlnaHQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVwdGggb2YgdGhlIG9iamVjdCBpbiBiaXRzIHBlciBwaXhlbC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0RFUFRIID0gImltYWdlX2RlcHRoIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIElEIG9mIHRoZSBvYmplY3QncyBwYXJlbnQsIG9yIHplcm8gaWYgdGhlIG9iamVjdAorICAgICAgICAgKiBpcyBpbiB0aGUgcm9vdCBvZiBpdHMgc3RvcmFnZSB1bml0LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UID0gInBhcmVudCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhc3NvY2lhdGlvbiB0eXBlIGZvciBhIGNvbnRhaW5lciBvYmplY3QuCisgICAgICAgICAqIEZvciBmb2xkZXJzIHRoaXMgaXMgdHlwaWNhbGx5IHtAbGluayAjQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUn0KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX1RZUEUgPSAiYXNzb2NpYXRpb25fdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnRhaW5zIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIG9iamVjdHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NPQ0lBVElPTl9ERVNDID0gImFzc29jaWF0aW9uX2Rlc2MiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBvYmplY3QsIHR5cGljYWxseSB1c2VkIGZvciBhbiBhc3NvY2lhdGlvbgorICAgICAgICAgKiBjb250YWluaW5nIGltYWdlcyB0YWtlbiBpbiBzZXF1ZW5jZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX05VTUJFUiA9ICJzZXF1ZW5jZV9udW1iZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIG9iamVjdCB3YXMgY3JlYXRlZCwgaW4gc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0NSRUFURUQgPSAiZGF0ZV9jcmVhdGVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIG9iamVjdCB3YXMgbGFzdCBtb2RpZmllZCwgaW4gc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX01PRElGSUVEID0gImRhdGVfbW9kaWZpZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGxpc3Qgb2Yga2V5d29yZHMgYXNzb2NpYXRlZCB3aXRoIGFuIG9iamVjdCwgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVdPUkRTID0gImtleXdvcmRzIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCA5OWQ0ZTg3Li5jZjk1ODcyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKQEAgLTE2LDE0ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFF1ZXJ5TWFwOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC0zNywyMCArMzQsMTggQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy4qOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAKIC8qKgpAQCAtMTAyMyw3ICsxMDE4LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0ludGVyZXN0aW5nQ29uZmlndXJhdGlvbkNoYW5nZXMoaW50IGNoYW5nZXMpIHsKICAgICAgICAgICAgIHJldHVybiAoY2hhbmdlcyZBY3Rpdml0eUluZm8uQ09ORklHX0ZPTlRfU0NBTEUpICE9IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNob3dHVGFsa1NlcnZpY2VTdGF0dXMoQ29udGVudFJlc29sdmVyIGNyKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0SW50KGNyLCBTSE9XX0dUQUxLX1NFUlZJQ0VfU1RBVFVTLCAwKSAhPSAwOwogICAgICAgICB9CkBAIC0xMTQ3LDYgKzExNDIsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9TTEVFUF9QT0xJQ1lfTkVWRVIgPSAyOwogCisgICAgICAgIC8vVE9ETzogZGVwcmVjYXRlIHN0YXRpYyBJUCBjb25zdGFudHMKICAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZXRoZXIgdG8gdXNlIHN0YXRpYyBJUCBhbmQgb3RoZXIgc3RhdGljIG5ldHdvcmsgYXR0cmlidXRlcy4KICAgICAgICAgICogPHA+CkBAIC0xMjMwLDcgKzEyMjYsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1BBVFRFUk5fVklTSUJMRSA9ICJsb2NrX3BhdHRlcm5fdmlzaWJsZV9wYXR0ZXJuIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIAorICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UKICAgICAgICAgICoge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI0xPQ0tfUEFUVEVSTl9UQUNUSUxFX0ZFRURCQUNLX0VOQUJMRUR9CiAgICAgICAgICAqIGluc3RlYWQKICAgICAgICAgICovCkBAIC0xNTEyLDYgKzE1MDgsMTIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19USU1FID0gImF1dG9fdGltZSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFZhbHVlIHRvIHNwZWNpZnkgaWYgdGhlIHVzZXIgcHJlZmVycyB0aGUgdGltZSB6b25lCisgICAgICAgICAqIHRvIGJlIGF1dG9tYXRpY2FsbHkgZmV0Y2hlZCBmcm9tIHRoZSBuZXR3b3JrIChOSVRaKS4gMT15ZXMsIDA9bm8KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fVElNRV9aT05FID0gImF1dG9fdGltZV96b25lIjsKKworICAgICAgICAvKioKICAgICAgICAgICogRGlzcGxheSB0aW1lcyBhcyAxMiBvciAyNCBob3VycwogICAgICAgICAgKiAgIDEyCiAgICAgICAgICAqICAgMjQKQEAgLTE3ODgsNiArMTc5MCwxMiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxPQ0tfU09VTkQgPSAidW5sb2NrX3NvdW5kIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgYXBwZWFyIGFzIGEgUFRQIGRldmljZSBpbnN0ZWFkIG9mIE1UUC4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9QVFBfSU5URVJGQUNFID0gInVzZV9wdHBfaW50ZXJmYWNlIjsKKworICAgICAgICAvKioKICAgICAgICAgICogUmVjZWl2ZSBpbmNvbWluZyBTSVAgY2FsbHM/CiAgICAgICAgICAqIDAgPSBubwogICAgICAgICAgKiAxID0geWVzCkBAIC0xODY3LDYgKzE4NzUsNyBAQAogICAgICAgICAgICAgVEVYVF9BVVRPX1BVTkNUVUFURSwKICAgICAgICAgICAgIFRFWFRfU0hPV19QQVNTV09SRCwKICAgICAgICAgICAgIEFVVE9fVElNRSwKKyAgICAgICAgICAgIEFVVE9fVElNRV9aT05FLAogICAgICAgICAgICAgVElNRV8xMl8yNCwKICAgICAgICAgICAgIERBVEVfRk9STUFULAogICAgICAgICAgICAgQUNDRUxFUk9NRVRFUl9ST1RBVElPTiwKQEAgLTE4ODMsNiArMTg5Miw3IEBACiAgICAgICAgICAgICBMT0NLU0NSRUVOX1NPVU5EU19FTkFCTEVELAogICAgICAgICAgICAgU0hPV19XRUJfU1VHR0VTVElPTlMsCiAgICAgICAgICAgICBOT1RJRklDQVRJT05fTElHSFRfUFVMU0UsCisgICAgICAgICAgICBVU0VfUFRQX0lOVEVSRkFDRSwKICAgICAgICAgICAgIFNJUF9DQUxMX09QVElPTlMsCiAgICAgICAgICAgICBTSVBfUkVDRUlWRV9DQUxMUywKICAgICAgICAgICAgIE5GQ19PTiwKQEAgLTI0MzMsNiArMjQ0MywxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUga2V5IHRoYXQgcmV0cmlldmVzIGEgYmx1ZXRvb3RoIElucHV0IERldmljZSdzIHByaW9yaXR5LgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShTdHJpbmcgYWRkcmVzcykgeworICAgICAgICAgICAgcmV0dXJuICgiYmx1ZXRvb3RoX2lucHV0X2RldmljZV9wcmlvcml0eV8iICsgYWRkcmVzcy50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCBkYXRhIHJvYW1pbmcgaXMgZW5hYmxlZC4gKDAgPSBmYWxzZSwgMSA9IHRydWUpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1JPQU1JTkcgPSAiZGF0YV9yb2FtaW5nIjsKQEAgLTI0NDQsNiArMjQ2MiwxMyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOUFVUX01FVEhPRCA9ICJkZWZhdWx0X2lucHV0X21ldGhvZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFNldHRpbmcgdG8gcmVjb3JkIHRoZSBpbnB1dCBtZXRob2Qgc3VidHlwZSB1c2VkIGJ5IGRlZmF1bHQsIGhvbGRpbmcgdGhlIElECisgICAgICAgICAqIG9mIHRoZSBkZXNpcmVkIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVEVEX0lOUFVUX01FVEhPRF9TVUJUWVBFID0KKyAgICAgICAgICAgICAgICAic2VsZWN0ZWRfaW5wdXRfbWV0aG9kX3N1YnR5cGUiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIHRoZSBkZXZpY2UgaGFzIGJlZW4gcHJvdmlzaW9uZWQgKDAgPSBmYWxzZSwgMSA9IHRydWUpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfUFJPVklTSU9ORUQgPSAiZGV2aWNlX3Byb3Zpc2lvbmVkIjsKQEAgLTI0NjQsMTEgKzI0ODksMzIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfU1lTVEVNX0lOUFVUX01FVEhPRFMgPSAiZGlzYWJsZWRfc3lzdGVtX2lucHV0X21ldGhvZHMiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBIb3N0IG5hbWUgYW5kIHBvcnQgZm9yIGEgdXNlci1zZWxlY3RlZCBwcm94eS4KKyAgICAgICAgICogSG9zdCBuYW1lIGFuZCBwb3J0IGZvciBnbG9iYWwgcHJveHkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZID0gImh0dHBfcHJveHkiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBFeGNsdXNpb24gbGlzdCBmb3IgZ2xvYmFsIHByb3h5LiBUaGlzIHN0cmluZyBjb250YWlucyBhIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkCisgICAgICAgICAqIGRvbWFpbnMgd2hlcmUgdGhlIGdsb2JhbCBwcm94eSBkb2VzIG5vdCBhcHBseS4gRG9tYWlucyBzaG91bGQgYmUgbGlzdGVkIGluIGEgY29tbWEtCisgICAgICAgICAqIHNlcGFyYXRlZCBsaXN0LiBFeGFtcGxlIG9mIGFjY2VwdGFibGUgZm9ybWF0czogIi5kb21haW4xLmNvbSxteS5kb21haW4yLmNvbSIKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPWFlfRVhDTFVTSU9OX0xJU1QgPSAiaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVuYWJsZXMgdGhlIFVJIHNldHRpbmcgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZ2xvYmFsIEhUVFAgcHJveHkKKyAgICAgICAgICogYW5kIGFzc29jaWF0ZWQgZXhjbHVzaW9uIGxpc3QuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfR0xPQkFMX0hUVFBfUFJPWFkgPSAic2V0X2dsb2JhbF9odHRwX3Byb3h5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0dGluZyBmb3IgZGVmYXVsdCBETlMgaW4gY2FzZSBub2JvZHkgc3VnZ2VzdHMgb25lCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ROU19TRVJWRVIgPSAiZGVmYXVsdF9kbnNfc2VydmVyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgcGFja2FnZSBpbnN0YWxsZXIgc2hvdWxkIGFsbG93IGluc3RhbGxhdGlvbiBvZiBhcHBzIGRvd25sb2FkZWQgZnJvbQogICAgICAgICAgKiBzb3VyY2VzIG90aGVyIHRoYW4gdGhlIEFuZHJvaWQgTWFya2V0ICh2ZW5kaW5nIG1hY2hpbmUpLgogICAgICAgICAgKgpAQCAtMjQ5OSw2ICsyNTQ1LDE0IEBACiAgICAgICAgICAgICAibG9ja19wYXR0ZXJuX3RhY3RpbGVfZmVlZGJhY2tfZW5hYmxlZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgcHJlZmVyZW5jZSBhbGxvd3MgdGhlIGRldmljZSB0byBiZSBsb2NrZWQgZ2l2ZW4gdGltZSBhZnRlciBzY3JlZW4gZ29lcyBvZmYsCisgICAgICAgICAqIHN1YmplY3QgdG8gY3VycmVudCBEZXZpY2VBZG1pbiBwb2xpY3kgbGltaXRzLgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19TQ1JFRU5fTE9DS19BRlRFUl9USU1FT1VUID0gImxvY2tfc2NyZWVuX2xvY2tfYWZ0ZXJfdGltZW91dCI7CisKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciBhc3Npc3RlZCBHUFMgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KQEAgLTI1NTksNiArMjYxMywxNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRBTF9DT05UUk9MX1JFRElSRUNUX1VSTCA9ICJwYXJlbnRhbF9jb250cm9sX3JlZGlyZWN0X3VybCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEEgcG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoZSBmcmVxdWVuY3kgb2YgU2FtcGxpbmdQcm9maWxlcgorICAgICAgICAgKiB0YWtpbmcgc25hcHNob3RzIGluIGhlcnR6LiBaZXJvIHZhbHVlIG1lYW5zIFNhbXBsaW5nUHJvZmlsZXIgaXMgZGlzYWJsZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTElOR19QUk9GSUxFUl9IWiA9ICJzYW1wbGluZ19wcm9maWxlcl9oeiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHRpbmdzIGNsYXNzbmFtZSB0byBsYXVuY2ggd2hlbiBTZXR0aW5ncyBpcyBjbGlja2VkIGZyb20gQWxsCiAgICAgICAgICAqIEFwcGxpY2F0aW9ucy4gIE5lZWRlZCBiZWNhdXNlIG9mIHVzZXIgdGVzdGluZyBiZXR3ZWVuIHRoZSBvbGQKICAgICAgICAgICogYW5kIG5ldyBTZXR0aW5ncyBhcHBzLgpAQCAtMjU4OSw2ICsyNjUxLDYwIEBACiAgICAgICAgICAgICAiZW5hYmxlZF9hY2Nlc3NpYmlsaXR5X3NlcnZpY2VzIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogSWYgaW5qZWN0aW9uIG9mIGFjY2Vzc2liaWxpdHkgZW5oYW5jaW5nIEphdmFTY3JpcHQgc2NyaXB0cworICAgICAgICAgKiBpcyBlbmFibGVkLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBOb3RlOiBBY2Nlc3NpYmlsaXR5IGluamVjdGluZyBzY3JpcHRzIGFyZSBzZXJ2ZWQgYnkgdGhlCisgICAgICAgICAqICAgR29vZ2xlIGluZnJhc3RydWN0dXJlIGFuZCBlbmFibGUgdXNlcnMgd2l0aCBkaXNhYmlsaXRpZXMgdG8KKyAgICAgICAgICogICBlZmZpY2lhbnRseSBuYXZpZ2F0ZSBpbiBhbmQgZXhwbG9yZSB3ZWIgY29udGVudC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBUaGlzIHByb3BlcnR5IHJlcHJlc2VudHMgYSBib29sZWFuIHZhbHVlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04gPQorICAgICAgICAgICAgImFjY2Vzc2liaWxpdHlfc2NyaXB0X2luamVjdGlvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEtleSBiaW5kaW5ncyBmb3IgbmF2aWdhdGlvbiBpbiBidWlsdC1pbiBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgZm9yIHdlYiBjb250ZW50LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBOb3RlOiBUaGVzZSBrZXkgYmluZGluZ3MgYXJlIGZvciB0aGUgYnVpbHQtaW4gYWNjZXNzaWJpbGl0eSBuYXZpZ2F0aW9uIGZvcgorICAgICAgICAgKiAgIHdlYiBjb250ZW50IHdoaWNoIGlzIHVzZWQgYXMgYSBmYWxsIGJhY2sgc29sdXRpb24gaWYgSmF2YVNjcmlwdCBpbiBhIFdlYlZpZXcKKyAgICAgICAgICogICBpcyBub3QgZW5hYmxlZCBvciB0aGUgdXNlciBoYXMgbm90IG9wdGVkLWluIHNjcmlwdCBpbmplY3Rpb24gZnJvbSBHb29nbGUuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqICAgVGhlIGJpbmRpbmdzIGFyZSBzZXBhcmF0ZWQgYnkgc2VtaS1jb2xvbi4gQSBiaW5kaW5nIGlzIGEgbWFwcGluZyBmcm9tCisgICAgICAgICAqICAgYSBrZXkgdG8gYSBzZXF1ZW5jZSBvZiBhY3Rpb25zIChmb3IgbW9yZSBkZXRhaWxzIGxvb2sgYXQKKyAgICAgICAgICogICBhbmRyb2lkLndlYmtpdC5BY2Nlc3NpYmlsaXR5SW5qZWN0b3IpLiBBIGtleSBpcyByZXByZXNlbnRlZCBhcyB0aGUgaGV4YWRlbWljYWwKKyAgICAgICAgICogICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBvYnRhaW5lZCBmcm9tIGEgbWV0YSBzdGF0ZSAob3B0aW9uYWwpIHNoaWZ0ZWQKKyAgICAgICAgICogICBzaXh0ZWVuIHRpbWVzIGxlZnQgYW5kIGJpdHdpc2Ugb3JlZCB3aXRoIGEga2V5IGNvZGUuIEFuIGFjdGlvbiBpcyByZXByZXNlbnRlZAorICAgICAgICAgKiAgIGFzIGEgaGV4YWRlbWljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgd2hlcmUgdGhlIGZpcnN0IHR3byBkaWdpdHMKKyAgICAgICAgICogICBhcmUgbmF2aWdhdGlvbiBhY3Rpb24gaW5kZXgsIHRoZSBzZWNvbmQsIHRoZSB0aGlyZCwgYW5kIHRoZSBmb3VydGggZGlnaXQgcGFpcnMKKyAgICAgICAgICogICByZXByZXNlbnQgdGhlIGFjdGlvbiBhcmd1bWVudHMuIFRoZSBzZXBhcmF0ZSBhY3Rpb25zIGluIGEgYmluZGluZyBhcmUgY29sb24KKyAgICAgICAgICogICBzZXBhcmF0ZWQuIFRoZSBrZXkgYW5kIHRoZSBhY3Rpb24gc2VxdWVuY2UgaXQgbWFwcyB0byBhcmUgc2VwYXJhdGVkIGJ5IGVxdWFscy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBGb3IgZXhhbXBsZSwgdGhlIGJpbmRpbmcgYmVsb3cgbWFwcyB0aGUgRFBBRCByaWdodCBidXR0b24gdG8gdHJhdmVyc2UgdGhlCisgICAgICAgICAqICAgY3VycmVudCBuYXZpZ2F0aW9uIGF4aXMgb25jZSB3aXRob3V0IGZpcmluZyBhbiBhY2Nlc3NpYmlsaXR5IGV2ZW50IGFuZCB0bworICAgICAgICAgKiAgIHBlcmZvcm0gdGhlIHNhbWUgdHJhdmVyc2FsIGFnYWluIGJ1dCB0byBmaXJlIGFuIGV2ZW50OgorICAgICAgICAgKiAgIDxjb2RlPgorICAgICAgICAgKiAgICAgMHgxNj0weDAxMDAwMTAwOjB4MDEwMDAxMDE7CisgICAgICAgICAqICAgPC9jb2RlPgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiAgIFRoZSBnb2FsIG9mIHRoaXMgYmluZGluZyBpcyB0byBlbmFibGUgZHluYW1pYyByZWJpbmRpbmcgb2Yga2V5cyB0bworICAgICAgICAgKiAgIG5hdmlnYXRpb24gYWN0aW9ucyBmb3Igd2ViIGNvbnRlbnQgd2l0aG91dCByZXF1aXJpbmcgYSBmcmFtZXdvcmsgY2hhbmdlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiAgIFRoaXMgcHJvcGVydHkgcmVwcmVzZW50cyBhIHN0cmluZyB2YWx1ZS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTSUJJTElUWV9XRUJfQ09OVEVOVF9LRVlfQklORElOR1MgPQorICAgICAgICAgICAgImFjY2Vzc2liaWxpdHlfd2ViX2NvbnRlbnRfa2V5X2JpbmRpbmdzIjsKKworICAgICAgICAvKioKICAgICAgICAgICogU2V0dGluZyB0byBhbHdheXMgdXNlIHRoZSBkZWZhdWx0IHRleHQtdG8tc3BlZWNoIHNldHRpbmdzIHJlZ2FyZGxlc3MKICAgICAgICAgICogb2YgdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLgogICAgICAgICAgKiAxID0gb3ZlcnJpZGUgYXBwbGljYXRpb24gc2V0dGluZ3MsCkBAIC0zNTY4LDYgKzM2ODQsNyBAQAogICAgICAgICAgICAgUEFSRU5UQUxfQ09OVFJPTF9SRURJUkVDVF9VUkwsCiAgICAgICAgICAgICBVU0JfTUFTU19TVE9SQUdFX0VOQUJMRUQsCiAgICAgICAgICAgICBBQ0NFU1NJQklMSVRZX0VOQUJMRUQsCisgICAgICAgICAgICBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04sCiAgICAgICAgICAgICBCQUNLVVBfQVVUT19SRVNUT1JFLAogICAgICAgICAgICAgRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTLAogICAgICAgICAgICAgVFRTX1VTRV9ERUZBVUxUUywKQEAgLTM3NTEsMjAgKzM4NjgsOCBAQAogICAgICAgICAgICAgLy8gSWYgYSBzaG9ydGN1dCBpcyBzdXBwbGllZCwgYW5kIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBmb3IKICAgICAgICAgICAgIC8vIGFub3RoZXIgYm9va21hcmssIHRoZW4gcmVtb3ZlIHRoZSBvbGQgZGVmaW5pdGlvbi4KICAgICAgICAgICAgIGlmIChzaG9ydGN1dCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeShDT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNTaG9ydGN1dFByb2plY3Rpb24sIHNTaG9ydGN1dFNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKChpbnQpIHNob3J0Y3V0KSB9LCBudWxsKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5nZXRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYy5kZWxldGVSb3coKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgZGVsZXRlIGV4aXN0aW5nIHNob3J0Y3V0IHJvdyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3IuZGVsZXRlKENPTlRFTlRfVVJJLCBzU2hvcnRjdXRTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZigoaW50KSBzaG9ydGN1dCkgfSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhBMmRwU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEEyZHBTZXJ2aWNlLmphdmEKaW5kZXggYTUyYTIyMS4uOTQ2YzI2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEEyZHBTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEEyZHBTZXJ2aWNlLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVXVpZDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQTJkcDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CkBAIC0zMiwxNyArMzMsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKKwogCiBwdWJsaWMgY2xhc3MgQmx1ZXRvb3RoQTJkcFNlcnZpY2UgZXh0ZW5kcyBJQmx1ZXRvb3RoQTJkcC5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aEEyZHBTZXJ2aWNlIjsKQEAgLTU3LDExICs1Niw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU1RBVEUgPSAiU3RhdGUiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTktfU1RBVEVfRElTQ09OTkVDVEVEID0gImRpc2Nvbm5lY3RlZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTktfU1RBVEVfQ09OTkVDVElORyA9ICJjb25uZWN0aW5nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOS19TVEFURV9DT05ORUNURUQgPSAiY29ubmVjdGVkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOS19TVEFURV9QTEFZSU5HID0gInBsYXlpbmciOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1TaW5rQ291bnQ7CiAKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CkBAIC03Miw2ICs2Niw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwogICAgIHByaXZhdGUgaW50ICAgbVRhcmdldEEyZHBTdGF0ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUFkanVzdGVkUHJpb3JpdHkgPSBmYWxzZTsKKyAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtUGxheWluZ0EyZHBEZXZpY2U7CiAKICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCkBAIC05NSwxMiArOTAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5FUlJPUik7CiAgICAgICAgICAgICAgICAgc3dpdGNoKGJvbmRTdGF0ZSkgewogICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2lua1ByaW9yaXR5KGRldmljZSkgPT0gQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9VTkRFRklORUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpbmtQcmlvcml0eShkZXZpY2UsIEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT04pOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0UHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX1VOREVGSU5FRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJpb3JpdHkoZGV2aWNlLCBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX09OKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX05PTkU6Ci0gICAgICAgICAgICAgICAgICAgIHNldFNpbmtQcmlvcml0eShkZXZpY2UsIEJsdWV0b290aEEyZHAuUFJJT1JJVFlfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UHJpb3JpdHkoZGV2aWNlLCBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX1VOREVGSU5FRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0FDTF9ESVNDT05ORUNURUQpKSB7CkBAIC0xMTMsNyArMTA4LDggQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBdWRpb01hbmFnZXIuVk9MVU1FX0NIQU5HRURfQUNUSU9OKSkgewogICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlID0gaW50ZW50LmdldEludEV4dHJhKEF1ZGlvTWFuYWdlci5FWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUsIC0xKTsKICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtVHlwZSA9PSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBzaW5rc1tdID0gZ2V0Q29ubmVjdGVkU2lua3MoKTsKKyAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIHNpbmtzW10gPSBnZXRDb25uZWN0ZWREZXZpY2VzKCk7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKHNpbmtzLmxlbmd0aCAhPSAwICYmIGlzUGhvbmVEb2NrZWQoc2lua3NbMF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IHNpbmtzWzBdLmdldEFkZHJlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdWb2xMZXZlbCA9CkBAIC0yNTQsNyArMjUwLDcgQEAKICAgICAgICAgICAgIEJsdWV0b290aERldmljZVtdIGRldmljZXMgPSBuZXcgQmx1ZXRvb3RoRGV2aWNlW21BdWRpb0RldmljZXMuc2l6ZSgpXTsKICAgICAgICAgICAgIGRldmljZXMgPSBtQXVkaW9EZXZpY2VzLmtleVNldCgpLnRvQXJyYXkoZGV2aWNlcyk7CiAgICAgICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gZ2V0U2lua1N0YXRlKGRldmljZSk7CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORzoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRDoKQEAgLTI3Nyw3ICsyNzMsNyBAQAogCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Nvbm5lY3RTaW5rRmVhc2libGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewogICAgICAgICBpZiAoIW1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpIHx8ICFpc1NpbmtEZXZpY2UoZGV2aWNlKSB8fAotICAgICAgICAgICAgICAgIGdldFNpbmtQcmlvcml0eShkZXZpY2UpID09IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT0ZGKSB7CisgICAgICAgICAgICAgICAgZ2V0UHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX09GRikgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIApAQCAtMjkyLDEyICsyODgsMjYgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0U2luayhCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQTJkcFBsYXlpbmcoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBpZiAoREJHKSBsb2coImlzQTJkcFBsYXlpbmcoIiArIGRldmljZSArICIpIik7CisgICAgICAgIGlmIChkZXZpY2UuZXF1YWxzKG1QbGF5aW5nQTJkcERldmljZSkpIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOwogICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3RTaW5rKCIgKyBkZXZpY2UgKyAiKSIpOwogICAgICAgICBpZiAoIWlzQ29ubmVjdFNpbmtGZWFzaWJsZShkZXZpY2UpKSByZXR1cm4gZmFsc2U7CiAKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2Ugc2lua0RldmljZSA6IG1BdWRpb0RldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRDb25uZWN0aW9uU3RhdGUoc2lua0RldmljZSkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0KHNpbmtEZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhTZXJ2aWNlLmNvbm5lY3RTaW5rKGRldmljZS5nZXRBZGRyZXNzKCkpOwogICAgIH0KIApAQCAtMzA3LDE3ICszMTcsMTUgQEAKICAgICAgICAgaW50IHN0YXRlID0gbUF1ZGlvRGV2aWNlcy5nZXQoZGV2aWNlKTsKIAogICAgICAgICAvLyBpZ25vcmUgaWYgdGhlcmUgYXJlIGFueSBhY3RpdmUgc2lua3MKLSAgICAgICAgaWYgKGxvb2t1cFNpbmtzTWF0Y2hpbmdTdGF0ZXMobmV3IGludFtdIHsKKyAgICAgICAgaWYgKGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMobmV3IGludFtdIHsKICAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkcsCiAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HLAotICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVElOR30pLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HfSkubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkc6CiAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HOgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORzoKQEAgLTM0MywxNyArMzUxLDE2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgc3RhdGUgPSBnZXRTaW5rU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgaW50IHN0YXRlID0gZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CiAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdFNpbmsoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKICAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0U2luaygiICsgZGV2aWNlICsgIikiKTsKQEAgLTM2Miw3ICszNjksNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0U2lua0ludGVybmFsKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IHN0YXRlID0gZ2V0U2lua1N0YXRlKGRldmljZSk7CisgICAgICAgIGludCBzdGF0ZSA9IGdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOwogICAgICAgICBTdHJpbmcgcGF0aCA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKIAogICAgICAgICAvLyBTdGF0ZSBpcyBDT05ORUNUSU5HIG9yIENPTk5FQ1RFRCBvciBQTEFZSU5HCkBAIC00MDgsMjQgKzQxNSw3IEBACiAgICAgICAgIHJldHVybiBjaGVja1NpbmtTdXNwZW5kU3RhdGUoc3RhdGUuaW50VmFsdWUoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRTaW5rcygpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOwotICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBzaW5rcyA9IGxvb2t1cFNpbmtzTWF0Y2hpbmdTdGF0ZXMoCi0gICAgICAgICAgICAgICAgbmV3IGludFtdIHtCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCwgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HfSk7Ci0gICAgICAgIHJldHVybiBzaW5rcy50b0FycmF5KG5ldyBCbHVldG9vdGhEZXZpY2Vbc2lua3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBCbHVldG9vdGhEZXZpY2VbXSBnZXROb25EaXNjb25uZWN0ZWRTaW5rcygpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOwotICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBzaW5rcyA9IGxvb2t1cFNpbmtzTWF0Y2hpbmdTdGF0ZXMoCi0gICAgICAgICAgICAgICAgbmV3IGludFtdIHtCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVElOR30pOwotICAgICAgICByZXR1cm4gc2lua3MudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW3NpbmtzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFNpbmtTdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOwogICAgICAgICBJbnRlZ2VyIHN0YXRlID0gbUF1ZGlvRGV2aWNlcy5nZXQoZGV2aWNlKTsKICAgICAgICAgaWYgKHN0YXRlID09IG51bGwpCkBAIC00MzMsMTkgKzQyMyw0MSBAQAogICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U2lua1ByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZERldmljZXMoKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlW10gc2lua3MgPSBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKAorICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Qmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUR9KTsKKyAgICAgICAgcmV0dXJuIHNpbmtzOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbnRbXSBzdGF0ZXMpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBzaW5rcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaWYgKG1BdWRpb0RldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gc2lua3MudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW3NpbmtzLnNpemUoKV0pOworICAgICAgICB9CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbUF1ZGlvRGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaW50IHNpbmtTdGF0ZSA9IGdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOworICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gc2lua1N0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIHNpbmtzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpbmtzLnRvQXJyYXkobmV3IEJsdWV0b290aERldmljZVtzaW5rcy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aEEyZHBTaW5rUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksCiAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9VTkRFRklORUQpOwogICAgIH0KIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRTaW5rUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOwotICAgICAgICBpZiAoIUJsdWV0b290aEFkYXB0ZXIuY2hlY2tCbHVldG9vdGhBZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aEEyZHBTaW5rUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksIHByaW9yaXR5KTsKICAgICB9CkBAIC00NzEsOCArNDgzLDE3IEBACiAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdXRob3JpemVkIGl0IGFuZCBibHVleiBzdGF0ZSBoYXMgY2hhbmdlZC4KICAgICAgICAgICAgICAgICBhZGRBdWRpb1NpbmsoZGV2aWNlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHByZXZTdGF0ZSA9IG1BdWRpb0RldmljZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2lua1N0YXRlQ2hhbmdlKGRldmljZSwgcHJldlN0YXRlLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORyAmJiBtUGxheWluZ0EyZHBEZXZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgIG1QbGF5aW5nQTJkcERldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgICAgICAgICBoYW5kbGVTaW5rUGxheWluZ1N0YXRlQ2hhbmdlKGRldmljZSwgc3RhdGUsIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQgJiYgbVBsYXlpbmdBMmRwRGV2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXlpbmdBMmRwRGV2aWNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lua1BsYXlpbmdTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgaW50IHByZXZTdGF0ZSA9IG1BdWRpb0RldmljZXMuZ2V0KGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lua1N0YXRlQ2hhbmdlKGRldmljZSwgcHJldlN0YXRlLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDg0LDE4ICs1MDUsMTkgQEAKICAgICAgICAgICAgICAgICBtU2lua0NvdW50LS07CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICAgICAgbVNpbmtDb3VudCArKzsKKyAgICAgICAgICAgICAgICBtUGxheWluZ0EyZHBEZXZpY2UgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvRGV2aWNlcy5wdXQoZGV2aWNlLCBzdGF0ZSk7CiAKICAgICAgICAgICAgIGNoZWNrU2lua1N1c3BlbmRTdGF0ZShzdGF0ZSk7CiAgICAgICAgICAgICBtVGFyZ2V0QTJkcFN0YXRlID0gLTE7CiAKLSAgICAgICAgICAgIGlmIChnZXRTaW5rUHJpb3JpdHkoZGV2aWNlKSA+IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT0ZGICYmCisgICAgICAgICAgICBpZiAoZ2V0UHJpb3JpdHkoZGV2aWNlKSA+IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT0ZGICYmCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORyB8fAogICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29ubmVjdGVkIG9yIGF0dGVtcHRpbmcgdG8gY29ubmVjdC4KICAgICAgICAgICAgICAgICAvLyBCdW1wIHByaW9yaXR5Ci0gICAgICAgICAgICAgICAgc2V0U2lua1ByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9BVVRPX0NPTk5FQ1QpOworICAgICAgICAgICAgICAgIHNldFByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9BVVRPX0NPTk5FQ1QpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQpIHsKQEAgLTUwNCw0NSArNTI2LDM4IEBACiAgICAgICAgICAgICAgICAgYWRqdXN0T3RoZXJTaW5rUHJpb3JpdGllcyhkZXZpY2UpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aEEyZHAuRVhUUkFfUFJFVklPVVNfU0lOS19TVEFURSwgcHJldlN0YXRlKTsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhBMmRwLkVYVFJBX1NJTktfU1RBVEUsIHN0YXRlKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1BSRVZJT1VTX1NUQVRFLCBwcmV2U3RhdGUpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIHN0YXRlKTsKICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CiAKICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiQTJEUCBzdGF0ZSA6IGRldmljZTogIiArIGRldmljZSArICIgU3RhdGU6IiArIHByZXZTdGF0ZSArICItPiIgKyBzdGF0ZSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2lua1BsYXlpbmdTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUsIGludCBwcmV2U3RhdGUpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fUExBWUlOR19TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIGRldmljZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1BSRVZJT1VTX1NUQVRFLCBwcmV2U3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwgc3RhdGUpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX1BFUk0pOworCisgICAgICAgIGlmIChEQkcpIGxvZygiQTJEUCBQbGF5aW5nIHN0YXRlIDogZGV2aWNlOiAiICsgZGV2aWNlICsgIiBTdGF0ZToiICsgcHJldlN0YXRlICsgIi0+IiArIHN0YXRlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYWRqdXN0T3RoZXJTaW5rUHJpb3JpdGllcyhCbHVldG9vdGhEZXZpY2UgY29ubmVjdGVkRGV2aWNlKSB7CiAgICAgICAgIGlmICghbUFkanVzdGVkUHJpb3JpdHkpIHsKICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IG1BZGFwdGVyLmdldEJvbmRlZERldmljZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChnZXRTaW5rUHJpb3JpdHkoZGV2aWNlKSA+PSBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCAmJgorICAgICAgICAgICAgICAgIGlmIChnZXRQcmlvcml0eShkZXZpY2UpID49IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfQVVUT19DT05ORUNUICYmCiAgICAgICAgICAgICAgICAgICAgICFkZXZpY2UuZXF1YWxzKGNvbm5lY3RlZERldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U2lua1ByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9PTik7CisgICAgICAgICAgICAgICAgICAgIHNldFByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9PTik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUFkanVzdGVkUHJpb3JpdHkgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU2V0PEJsdWV0b290aERldmljZT4gbG9va3VwU2lua3NNYXRjaGluZ1N0YXRlcyhpbnRbXSBzdGF0ZXMpIHsKLSAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gc2lua3MgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7Ci0gICAgICAgIGlmIChtQXVkaW9EZXZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHNpbmtzOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbUF1ZGlvRGV2aWNlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgaW50IHNpbmtTdGF0ZSA9IGdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gc2lua1N0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpbmtzLmFkZChkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNpbmtzOwotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1NpbmtTdXNwZW5kU3RhdGUoaW50IHN0YXRlKSB7CiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKIApAQCAtNTY4LDcgKzU4Myw3IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgoZGV2aWNlT2JqZWN0UGF0aCk7CiAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gZ2V0U2lua1N0YXRlKGRldmljZSk7CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CiAgICAgICAgICAgICAgICAgaGFuZGxlU2lua1N0YXRlQ2hhbmdlKGRldmljZSwgc3RhdGUsIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCmluZGV4IDc1ODA3YmYuLjRlZGMwMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKQEAgLTIwLDYgKzIwLDkgQEAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENsYXNzOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhJbnB1dERldmljZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC01Miw2ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbVBhc3NrZXlBZ2VudFJlcXVlc3REYXRhOwogICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoU2VydmljZSBtQmx1ZXRvb3RoU2VydmljZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1BMmRwOwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICAvLyBUaGUgV2FrZUxvY2sgaXMgdXNlZCBmb3IgYnJpbmdpbmcgdXAgdGhlIExDRCBkdXJpbmcgYSBwYWlyaW5nIHJlcXVlc3QKICAgICAvLyBmcm9tIHJlbW90ZSBkZXZpY2Ugd2hlbiBBbmRyb2lkIGlzIGluIFN1c3BlbmQgc3RhdGUuCkBAIC0xMTYsOCArMTIwLDIxIEBACiAgICAgICAgICAgICAgICAgfCBQb3dlck1hbmFnZXIuT05fQUZURVJfUkVMRUFTRSwgVEFHKTsKICAgICAgICAgbVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwogICAgICAgICBpbml0aWFsaXplTmF0aXZlRGF0YU5hdGl2ZSgpOworCisgICAgICAgIG1BZGFwdGVyLmdldFByb2ZpbGVQcm94eShtQ29udGV4dCwgbVByb2ZpbGVTZXJ2aWNlTGlzdGVuZXIsIEJsdWV0b290aFByb2ZpbGUuQTJEUCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciBtUHJvZmlsZVNlcnZpY2VMaXN0ZW5lciA9CisgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgICAgICBtQTJkcCA9IChCbHVldG9vdGhBMmRwKSBwcm94eTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoaW50IHByb2ZpbGUpIHsKKyAgICAgICAgICAgIG1BMmRwID0gbnVsbDsKKyAgICAgICAgfQorICAgIH07CisKKwogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjbGVhbnVwTmF0aXZlRGF0YU5hdGl2ZSgpOwpAQCAtMzAwLDcgKzMxNyw4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgbG9nKCJEZXZpY2UgcHJvcGVydHkgY2hhbmdlZDoiICsgYWRkcmVzcyArICJwcm9wZXJ0eToiICsgbmFtZSk7CisgICAgICAgICAgICBsb2coIkRldmljZSBwcm9wZXJ0eSBjaGFuZ2VkOiAiICsgYWRkcmVzcyArICIgcHJvcGVydHk6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiB2YWx1ZTogIiArIHByb3BWYWx1ZXNbMV0pOwogICAgICAgICB9CiAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CiAgICAgICAgIGlmIChuYW1lLmVxdWFscygiTmFtZSIpKSB7CkBAIC0zNjcsNiArMzg1LDQ0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcGF0aCwgU3RyaW5nW10gcHJvcFZhbHVlcykgeworICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChwYXRoKTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAib25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZDogQWRkcmVzcyBvZiB0aGUgcmVtb3RlIGRldmljZSBpbiBudWxsIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbG9nKCIgSW5wdXQgRGV2aWNlIDogTmFtZSBvZiBQcm9wZXJ0eSBpczoiICsgcHJvcFZhbHVlc1swXSk7CisgICAgICAgIGJvb2xlYW4gc3RhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKHByb3BWYWx1ZXNbMV0uZXF1YWxzKCJ0cnVlIikpIHsKKyAgICAgICAgICAgIHN0YXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVJbnB1dERldmljZVByb3BlcnR5Q2hhbmdlKGFkZHJlc3MsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25QYW5EZXZpY2VQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIGRldmljZU9iamVjdFBhdGgsIFN0cmluZ1tdIHByb3BWYWx1ZXMpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wVmFsdWVzWzBdOworICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChkZXZpY2VPYmplY3RQYXRoKTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAib25QYW5EZXZpY2VQcm9wZXJ0eUNoYW5nZWQ6IEFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBkZXZpY2UgaW4gbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIGxvZygiUGFuIERldmljZSBwcm9wZXJ0eSBjaGFuZ2VkOiAiICsgYWRkcmVzcyArICIgIHByb3BlcnR5OiAiCisgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICIgdmFsdWU6ICIrIHByb3BWYWx1ZXNbMV0pOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgIGlmIChuYW1lLmVxdWFscygiQ29ubmVjdGVkIikpIHsKKyAgICAgICAgICAgIGlmIChwcm9wVmFsdWVzWzFdLmVxdWFscygiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoIkludGVyZmFjZSIpKSB7CisgICAgICAgICAgICBTdHJpbmcgaWZhY2UgPSBwcm9wVmFsdWVzWzFdOworICAgICAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrUGFpcmluZ1JlcXVlc3RBbmRHZXRBZGRyZXNzKFN0cmluZyBvYmplY3RQYXRoLCBpbnQgbmF0aXZlRGF0YSkgewogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewpAQCAtNTE5LDYgKzU3NSw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIG9uQWdlbnRBdXRob3JpemUoU3RyaW5nIG9iamVjdFBhdGgsIFN0cmluZyBkZXZpY2VVdWlkKSB7CisgICAgICAgIGlmICghbUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGdldCBkZXZpY2UgYWRkcmVzcyBpbiBvbkF1dGhBZ2VudEF1dGhvcml6ZSIpOwpAQCAtNTI3LDIyICs1ODUsMzMgQEAKIAogICAgICAgICBib29sZWFuIGF1dGhvcml6ZWQgPSBmYWxzZTsKICAgICAgICAgUGFyY2VsVXVpZCB1dWlkID0gUGFyY2VsVXVpZC5mcm9tU3RyaW5nKGRldmljZVV1aWQpOwotICAgICAgICBCbHVldG9vdGhBMmRwIGEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CiAKICAgICAgICAgLy8gQmx1ZXogc2VuZHMgdGhlIFVVSUQgb2YgdGhlIGxvY2FsIHNlcnZpY2UgYmVpbmcgYWNjZXNzZWQsIF9ub3RfIHRoZQogICAgICAgICAvLyByZW1vdGUgc2VydmljZQotICAgICAgICBpZiAobUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkgJiYKLSAgICAgICAgICAgICAgICAoQmx1ZXRvb3RoVXVpZC5pc0F1ZGlvU291cmNlKHV1aWQpIHx8IEJsdWV0b290aFV1aWQuaXNBdnJjcFRhcmdldCh1dWlkKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgQmx1ZXRvb3RoVXVpZC5pc0FkdkF1ZGlvRGlzdCh1dWlkKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwotICAgICAgICAgICAgYXV0aG9yaXplZCA9IGEyZHAuZ2V0U2lua1ByaW9yaXR5KGRldmljZSkgPiBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX09GRjsKKyAgICAgICAgaWYgKG1BMmRwICE9IG51bGwgJiYKKyAgICAgICAgICAgIChCbHVldG9vdGhVdWlkLmlzQXVkaW9Tb3VyY2UodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc0F2cmNwVGFyZ2V0KHV1aWQpCisgICAgICAgICAgICAgIHx8IEJsdWV0b290aFV1aWQuaXNBZHZBdWRpb0Rpc3QodXVpZCkpICYmCisgICAgICAgICAgICAgICFpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGVkU3RhdGUoYWRkcmVzcykpIHsKKyAgICAgICAgICAgIGF1dGhvcml6ZWQgPSBtQTJkcC5nZXRQcmlvcml0eShkZXZpY2UpID4gQmx1ZXRvb3RoUHJvZmlsZS5QUklPUklUWV9PRkY7CiAgICAgICAgICAgICBpZiAoYXV0aG9yaXplZCkgewogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFsbG93aW5nIGluY29taW5nIEEyRFAgLyBBVlJDUCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOwogICAgICAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLm5vdGlmeUluY29taW5nQTJkcENvbm5lY3Rpb24oYWRkcmVzcyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBBMkRQIC8gQVZSQ1AgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhVdWlkLmlzSW5wdXREZXZpY2UodXVpZCkgJiYgIWlzT3RoZXJJbnB1dERldmljZUNvbm5lY3RlZChhZGRyZXNzKSkgeworICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UgaW5wdXREZXZpY2UgPSBuZXcgQmx1ZXRvb3RoSW5wdXREZXZpY2UobUNvbnRleHQpOworICAgICAgICAgICAgYXV0aG9yaXplZCA9IGlucHV0RGV2aWNlLmdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT0ZGOworICAgICAgICAgICAgIGlmIChhdXRob3JpemVkKSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFsbG93aW5nIGluY29taW5nIEhJRCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOworICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBISUQgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoVXVpZC5pc0JuZXAodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc05hcCh1dWlkKSAmJgorICAgICAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmFsbG93SW5jb21pbmdUZXRoZXJpbmcoKSl7CisgICAgICAgICAgICBhdXRob3JpemVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyAiICsgZGV2aWNlVXVpZCArICIgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgfQpAQCAtNTUwLDYgKzYxOSwxOCBAQAogICAgICAgICByZXR1cm4gYXV0aG9yaXplZDsKICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPdGhlcklucHV0RGV2aWNlQ29ubmVjdGVkKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPQorICAgICAgICAgICAgbUJsdWV0b290aFNlcnZpY2UubG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMobmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUR9KTsKKworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoIWRldmljZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIG9uQWdlbnRPdXRPZkJhbmREYXRhQXZhaWxhYmxlKFN0cmluZyBvYmplY3RQYXRoKSB7CiAgICAgICAgIGlmICghbUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkpIHJldHVybiBmYWxzZTsKIApAQCAtNTYxLDEyICs2NDIsMTQgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKLQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKLSAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IGEyZHAuZ2V0Tm9uRGlzY29ubmVjdGVkU2lua3MoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPdGhlclNpbmtJbk5vbkRpc2Nvbm5lY3RlZFN0YXRlKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPQorICAgICAgICAgICAgbUEyZHAuZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhuZXcgaW50W10ge0JsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVElOR30pOworCiAgICAgICAgIGlmIChkZXZpY2VzLnNpemUoKSA9PSAwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGZvcihCbHVldG9vdGhEZXZpY2UgZGV2OiBkZXZpY2VzKSB7CiAgICAgICAgICAgICBpZiAoIWRldi5nZXRBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKSByZXR1cm4gdHJ1ZTsKQEAgLTYxNSw2ICs2OTgsNjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdChTdHJpbmcgcGF0aCwgYm9vbGVhbiByZXN1bHQpIHsKKyAgICAgICAgLy8gU3VjY2VzcyBjYXNlIGdldHMgaGFuZGxlZCBieSBQcm9wZXJ0eSBDaGFuZ2Ugc2lnbmFsCisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChwYXRoKTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQuIFN0YXRlIGlzOiIgKyBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVJbnB1dERldmljZVByb3BlcnR5Q2hhbmdlKGFkZHJlc3MsIGNvbm5lY3RlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlc3VsdCkgeworICAgICAgICBsb2cgKCJvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQgIiArIHBhdGggKyAiICIgKyByZXN1bHQpOworICAgICAgICAvLyBTdWNjZXNzIGNhc2UgZ2V0cyBoYW5kbGVkIGJ5IFByb3BlcnR5IENoYW5nZSBzaWduYWwKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKHBhdGgpOworICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldFBhbkRldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQuIFN0YXRlIGlzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXRlICsgIiByZXN1bHQ6ICIrIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBjb25uZWN0ZWQ/IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQgOgorICAgICAgICAgICAgICAgIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIG5ld1N0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbk5ldHdvcmtEZXZpY2VEaXNjb25uZWN0ZWQoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkKFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgaWZhY2UsIGludCBkZXN0VXVpZCkgeworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIGlmYWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgb25SZXN0YXJ0UmVxdWlyZWQoKSB7CiAgICAgICAgIGlmIChtQmx1ZXRvb3RoU2VydmljZS5pc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiKioqIEEgc2VyaW91cyBlcnJvciBvY2N1cnJlZCAoZGlkIGJsdWV0b290aGQgY3Jhc2g/KSAtICIgKwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKaW5kZXggNzFiNGVlMi4uZjhjYWEyYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCkBAIC0yOSw3ICsyOSwxMCBAQAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSW5wdXREZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoU29ja2V0OwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aDsKQEAgLTQwLDkgKzQzLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LkludGVyZmFjZUNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKQEAgLTcxLDggKzc4LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBCbHVldG9vdGhTZXJ2aWNlIGV4dGVuZHMgSUJsdWV0b290aC5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFNlcnZpY2UiOwpAQCAtODAsMTEgKzg5LDEzIEBACiAKICAgICBwcml2YXRlIGludCBtTmF0aXZlRGF0YTsKICAgICBwcml2YXRlIEJsdWV0b290aEV2ZW50TG9vcCBtRXZlbnRMb29wOworICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtQmx1ZXRvb3RoSGVhZHNldDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWlycGxhbmVTZW5zaXRpdmU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FpcnBsYW5lVG9nZ2xlYWJsZTsKICAgICBwcml2YXRlIGludCBtQmx1ZXRvb3RoU3RhdGU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXN0YXJ0ID0gZmFsc2U7ICAvLyBuZWVkIHRvIGNhbGwgZW5hYmxlKCkgYWZ0ZXIgZGlzYWJsZSgpCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Rpc2NvdmVyaW5nOworICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nT247CiAKICAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7ICAvLyBjb25zdGFudCBhZnRlciBpbml0KCkKICAgICBwcml2YXRlIGZpbmFsIEJvbmRTdGF0ZSBtQm9uZFN0YXRlID0gbmV3IEJvbmRTdGF0ZSgpOyAgLy8gbG9jYWwgY2FjaGUgb2YgYm9uZGluZ3MKQEAgLTExMyw2ICsxMjQsMTMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIElOSVRfQVVUT19QQUlSSU5HX0ZBSUxVUkVfQVRURU1QVF9ERUxBWSA9IDMwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfQVVUT19QQUlSSU5HX0ZBSUxVUkVfQVRURU1QVF9ERUxBWSA9IDEyMDAwOwogCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXM7CisgICAgcHJpdmF0ZSBpbnQgbU1heFBhbkRldmljZXM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRVRPT1RIX0lGQUNFX0FERFJfU1RBUlQ9ICIxOTIuMTY4LjQ0LjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTFVFVE9PVEhfTUFYX1BBTl9DT05ORUNUSU9OUyA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUVUT09USF9ORVRNQVNLICAgICAgICA9ICIyNTUuMjU1LjI1NS4wIjsKKwogICAgIC8vIFRoZSB0aW1lb3V0IHVzZWQgdG8gc2VudCB0aGUgVVVJRHMgSW50ZW50CiAgICAgLy8gVGhpcyB0aW1lb3V0IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIHBhZ2UgdGltZW91dAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVVUlEX0lOVEVOVF9ERUxBWSA9IDYwMDA7CkBAIC0xMzYsMTAgKzE1NCwxNCBAQAogICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZT4gbURldmljZVByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtQTJkcFByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtSGZwUHJvZmlsZVN0YXRlOworICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIG1IaWRQcm9maWxlU3RhdGU7CiAKICAgICBwcml2YXRlIEJsdWV0b290aEEyZHBTZXJ2aWNlIG1BMmRwU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPiBtSW5wdXREZXZpY2VzOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIFBhaXI8SW50ZWdlciwgU3RyaW5nPj4gbVBhbkRldmljZXM7CiAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgUGFpcjxieXRlW10sIGJ5dGVbXT4+IG1EZXZpY2VPb2JEYXRhOwogCisKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbURvY2tBZGRyZXNzOwogICAgIHByaXZhdGUgU3RyaW5nIG1Eb2NrUGluOwogCkBAIC0xOTAsNiArMjEyLDcgQEAKIAogICAgICAgICBtQmx1ZXRvb3RoU3RhdGUgPSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRjsKICAgICAgICAgbUlzRGlzY292ZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgbVRldGhlcmluZ09uID0gZmFsc2U7CiAgICAgICAgIG1BZGFwdGVyUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgICAgICBtRGV2aWNlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZyxTdHJpbmc+PigpOwogCkBAIC0yMDEsMTUgKzIyNCwyNyBAQAogICAgICAgICBtRGV2aWNlUHJvZmlsZVN0YXRlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGU+KCk7CiAgICAgICAgIG1BMmRwUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkEyRFApOwogICAgICAgICBtSGZwUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkhGUCk7CisgICAgICAgIG1IaWRQcm9maWxlU3RhdGUgPSBuZXcgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlKG1Db250ZXh0LCBCbHVldG9vdGhQcm9maWxlU3RhdGUuSElEKTsKKworICAgICAgICBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1NYXhQYW5EZXZpY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfbWF4X3Bhbl9kZXZpY2VzKTsKKyAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbU1heFBhbkRldmljZXMgPSBCTFVFVE9PVEhfTUFYX1BBTl9DT05ORUNUSU9OUzsKKyAgICAgICAgfQogCiAgICAgICAgIG1IZnBQcm9maWxlU3RhdGUuc3RhcnQoKTsKICAgICAgICAgbUEyZHBQcm9maWxlU3RhdGUuc3RhcnQoKTsKKyAgICAgICAgbUhpZFByb2ZpbGVTdGF0ZS5zdGFydCgpOwogCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgIHJlZ2lzdGVyRm9yQWlycGxhbmVNb2RlKGZpbHRlcik7CiAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0RPQ0tfRVZFTlQpOwogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgbUlucHV0RGV2aWNlcyA9IG5ldyBIYXNoTWFwPEJsdWV0b290aERldmljZSwgSW50ZWdlcj4oKTsKKyAgICAgICAgbVBhbkRldmljZXMgPSBuZXcgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIFBhaXI8SW50ZWdlciwgU3RyaW5nPj4oKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTdHJpbmcgcmVhZERvY2tCbHVldG9vdGhBZGRyZXNzKCkgewpAQCAtMzM3LDYgKzM3Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgc2V0Qmx1ZXRvb3RoU3RhdGUoQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09GRik7CiAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1FU1NBR0VfUkVHSVNURVJfU0RQX1JFQ09SRFMpOworICAgICAgICBzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUoZmFsc2UsIEJsdWV0b290aFBhbi5OQVBfUk9MRSwgQmx1ZXRvb3RoUGFuLk5BUF9CUklER0UpOwogCiAgICAgICAgIC8vIEFsbG93IDMgc2Vjb25kcyBmb3IgcHJvZmlsZXMgdG8gZ3JhY2VmdWxseSBkaXNjb25uZWN0CiAgICAgICAgIC8vIFRPRE86IEludHJvZHVjZSBhIGNhbGxiYWNrIG1lY2hhbmlzbSBzbyB0aGF0IGVhY2ggcHJvZmlsZSBjYW4gbm90aWZ5CkBAIC01NjcsOCArNjAzLDEyIEBACiAgICAgICAgICAgICAgICAgbUJvbmRTdGF0ZS5yZWFkQXV0b1BhaXJpbmdEYXRhKCk7CiAgICAgICAgICAgICAgICAgbUJvbmRTdGF0ZS5sb2FkQm9uZFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgaW5pdFByb2ZpbGVTdGF0ZSgpOworCisgICAgICAgICAgICAgICAgLy9SZWdpc3RlciBTRFAgcmVjb3Jkcy4KICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUkVHSVNURVJfU0RQX1JFQ09SRFMsIDEsIC0xKSwgMzAwMCk7CisgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlKHRydWUsIEJsdWV0b290aFBhbi5OQVBfUk9MRSwgQmx1ZXRvb3RoUGFuLk5BUF9CUklER0UpOworCiAKICAgICAgICAgICAgICAgICAvLyBMb2cgYmx1ZXRvb3RoIG9uIHRvIGJhdHRlcnkgc3RhdHMuCiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwpAQCAtNzQ3LDYgKzc4NywxMCBAQAogICAgICAgICAgICAgICAgIHJlbW92ZVByb2ZpbGVTdGF0ZShhZGRyZXNzKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gSElEIGlzIGhhbmRsZWQgYnkgQmx1ZXRvb3RoU2VydmljZSwgb3RoZXIgcHJvZmlsZXMKKyAgICAgICAgICAgIC8vIHdpbGwgYmUgaGFuZGxlZCBieSB0aGVpciByZXNwZWN0aXZlIHNlcnZpY2VzLgorICAgICAgICAgICAgc2V0SW5pdGlhbElucHV0RGV2aWNlUHJpb3JpdHkobUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpLCBzdGF0ZSk7CisKICAgICAgICAgICAgIGlmIChEQkcpIGxvZyhhZGRyZXNzICsgIiBib25kIHN0YXRlICIgKyBvbGRTdGF0ZSArICIgLT4gIiArIHN0YXRlICsgIiAoIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uICsgIikiKTsKICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aERldmljZS5BQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VEKTsKQEAgLTEzNjIsNiArMTQwNiw0MDkgQEAKICAgICAgICAgcmV0dXJuIHNwLmNvbnRhaW5zKFNIQVJFRF9QUkVGRVJFTkNFX0RPQ0tfQUREUkVTUyArIGFkZHJlc3MpOwogICAgIH0KIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1RldGhlcmluZ09uKCkgeworICAgICAgICByZXR1cm4gbVRldGhlcmluZ09uOworICAgIH0KKworICAgIC8qcGFja2FnZSovIHN5bmNocm9uaXplZCBib29sZWFuIGFsbG93SW5jb21pbmdUZXRoZXJpbmcoKSB7CisgICAgICAgIGlmIChpc1RldGhlcmluZ09uKCkgJiYgZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpLmxlbmd0aCA8IG1NYXhQYW5EZXZpY2VzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1UZXRoZXJpbmdSZWNlaXZlciA9IG51bGw7CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgZGlzY29ubmVjdFBhbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldEJsdWV0b290aFN0YXRlKCkgIT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTiAmJiB2YWx1ZSkgeworICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgICAgICBtVGV0aGVyaW5nUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX1NUQVRFLCBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGV0aGVyaW5nT24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1UZXRoZXJpbmdSZWNlaXZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtVGV0aGVyaW5nUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGV0aGVyaW5nT24gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFBhbkRldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworCisgICAgICAgIFBhaXI8SW50ZWdlciwgU3RyaW5nPiBwYW5EZXZpY2UgPSBtUGFuRGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICAgICAgaWYgKHBhbkRldmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFuRGV2aWNlLmZpcnN0OworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0IFBBTigiICsgb2JqZWN0UGF0aCArICIpIik7CisgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpICE9IEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIGxvZyAoZGV2aWNlICsgIiBhbHJlYWR5IGNvbm5lY3RlZCB0byBQQU4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb25uZWN0ZWRDb3VudCA9IDA7CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIHBhbkRldmljZTogbVBhbkRldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShwYW5EZXZpY2UpID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDb3VudCArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29ubmVjdGVkQ291bnQgPiA4KSB7CisgICAgICAgICAgICBsb2cgKGRldmljZSArICIgY291bGQgbm90IGNvbm5lY3QgdG8gUEFOIGJlY2F1c2UgOCBvdGhlciBkZXZpY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVElORyk7CisgICAgICAgIGlmIChjb25uZWN0UGFuRGV2aWNlTmF0aXZlKG9iamVjdFBhdGgsICJuYXAiLCAicGFudSIpKSB7CisgICAgICAgICAgICBsb2cgKCJjb25uZWN0aW5nIHRvIFBBTiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgbG9nICgiY291bGQgbm90IGNvbm5lY3QgdG8gUEFOIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RQYW4oKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0IGFsbCBQQU4gZGV2aWNlcyIpOworCisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbVBhbkRldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRpc2Nvbm5lY3RQYW5EZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cgKCJjb3VsZCBub3QgZGlzY29ubmVjdCBQYW4gRGV2aWNlICIrZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oKTsKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlOiBtUGFuRGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGdldFBhbkRldmljZVN0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRldmljZXMudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW2RldmljZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RQYW5EZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0IFBBTigiICsgb2JqZWN0UGF0aCArICIpIik7CisgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpICE9IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIGxvZyAoZGV2aWNlICsgIiBhbHJlYWR5IGRpc2Nvbm5lY3RlZCBmcm9tIFBBTiIpOworICAgICAgICB9CisgICAgICAgIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RJTkcpOworICAgICAgICByZXR1cm4gZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZShvYmplY3RQYXRoKTsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IHByZXZTdGF0ZTsKKyAgICAgICAgU3RyaW5nIGlmYWNlQWRkciA9IG51bGw7CisKKyAgICAgICAgaWYgKG1QYW5EZXZpY2VzLmdldChkZXZpY2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2U3RhdGUgPSBtUGFuRGV2aWNlcy5nZXQoZGV2aWNlKS5maXJzdDsKKyAgICAgICAgICAgIGlmYWNlQWRkciA9IG1QYW5EZXZpY2VzLmdldChkZXZpY2UpLnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldlN0YXRlID09IHN0YXRlKSByZXR1cm47CisKKyAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIGlmYWNlQWRkciA9IGVuYWJsZVRldGhlcmluZyhpZmFjZSk7CisgICAgICAgICAgICBpZiAoaWZhY2VBZGRyID09IG51bGwpIExvZy5lKFRBRywgIkVycm9yIHNldGluZyB1cCB0ZXRoZXIgaW50ZXJmYWNlIik7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgaWYgKGlmYWNlQWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJsdWV0b290aElmYWNlQWRkcmVzc2VzLnJlbW92ZShpZmFjZUFkZHIpOworICAgICAgICAgICAgICAgIGlmYWNlQWRkciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBQYWlyPEludGVnZXIsIFN0cmluZz4gdmFsdWUgPSBuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KHN0YXRlLCBpZmFjZUFkZHIpOworICAgICAgICBtUGFuRGV2aWNlcy5wdXQoZGV2aWNlLCB2YWx1ZSk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoUGFuLkFDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUGFuLkVYVFJBX1BSRVZJT1VTX1BBTl9TVEFURSwgcHJldlN0YXRlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFBhbi5FWFRSQV9QQU5fU1RBVEUsIHN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9QRVJNKTsKKworICAgICAgICBpZiAoREJHKSBsb2coIlBhbiBEZXZpY2Ugc3RhdGUgOiBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiIFN0YXRlOiIgKyBwcmV2U3RhdGUgKyAiLT4iICsgc3RhdGUpOworICAgIH0KKworICAgIC8qcGFja2FnZSovIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlKSB7CisgICAgICAgIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgbnVsbCwgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZU5ld1RldGhlcmluZ0FkZHJlc3NMb2NrZWQoKSB7CisgICAgICAgIGlmIChnZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCkubGVuZ3RoID09IG1NYXhQYW5EZXZpY2VzKSB7CisgICAgICAgICAgICBsb2coIk1heCBQQU4gZGV2aWNlIGNvbm5lY3Rpb25zIHJlYWNoZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBhZGRyZXNzID0gQkxVRVRPT1RIX0lGQUNFX0FERFJfU1RBUlQ7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAobUJsdWV0b290aElmYWNlQWRkcmVzc2VzLmNvbnRhaW5zKGFkZHJlc3MpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gYWRkciA9IGFkZHJlc3Muc3BsaXQoIlxcLiIpOworICAgICAgICAgICAgICAgIEludGVnZXIgbmV3SXAgPSBJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMl0pICsgMTsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5yZXBsYWNlKGFkZHJbMl0sIG5ld0lwLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXMuYWRkKGFkZHJlc3MpOworICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9CisKKyAgICAvLyBjb25maWd1cmVkIHdoZW4gd2Ugc3RhcnQgdGV0aGVyaW5nCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU3RyaW5nIGVuYWJsZVRldGhlcmluZyhTdHJpbmcgaWZhY2UpIHsKKyAgICAgICAgbG9nKCJ1cGRhdGVUZXRoZXJTdGF0ZToiICsgaWZhY2UpOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKKyAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIGNtID0KKyAgICAgICAgICAgIChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIFN0cmluZ1tdIGJsdWV0b290aFJlZ2V4cyA9IGNtLmdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKTsKKworICAgICAgICAvLyBicmluZyB0b2dnbGUgdGhlIGludGVyZmFjZXMKKyAgICAgICAgU3RyaW5nW10gY3VycmVudElmYWNlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdXJyZW50SWZhY2VzID0gc2VydmljZS5saXN0SW50ZXJmYWNlcygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgbGlzdGluZyBJbnRlcmZhY2VzIDoiICsgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChTdHJpbmcgY3VycklmYWNlOiBjdXJyZW50SWZhY2VzKSB7CisgICAgICAgICAgICBpZiAoY3VycklmYWNlLmVxdWFscyhpZmFjZSkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGNyZWF0ZU5ld1RldGhlcmluZ0FkZHJlc3NMb2NrZWQoKTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgSW50ZXJmYWNlQ29uZmlndXJhdGlvbiBpZmNnID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmY2cgPSBzZXJ2aWNlLmdldEludGVyZmFjZUNvbmZpZyhpZmFjZSk7CisgICAgICAgICAgICBpZiAoaWZjZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gYWRkciA9IEJMVUVUT09USF9ORVRNQVNLLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgICAgICAgICBpZmNnLm5ldG1hc2sgPSAoSW50ZWdlci5wYXJzZUludChhZGRyWzBdKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgKEludGVnZXIucGFyc2VJbnQoYWRkclsxXSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMl0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbM10pKTsKKyAgICAgICAgICAgICAgICBpZiAoaWZjZy5pcEFkZHIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRyID0gYWRkcmVzcy5zcGxpdCgiXFwuIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWZjZy5pcEFkZHIgPSAoSW50ZWdlci5wYXJzZUludChhZGRyWzBdKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMV0pIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEludGVnZXIucGFyc2VJbnQoYWRkclsyXSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbM10pKTsKKyAgICAgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLmludGVyZmFjZUZsYWdzLnJlcGxhY2UoImRvd24iLCAidXAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncyA9IGlmY2cuaW50ZXJmYWNlRmxhZ3MucmVwbGFjZSgicnVubmluZyIsICIiKTsKKyAgICAgICAgICAgICAgICBpZmNnLmludGVyZmFjZUZsYWdzID0gaWZjZy5pbnRlcmZhY2VGbGFncy5yZXBsYWNlKCIgICIsIiAiKTsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldEludGVyZmFjZUNvbmZpZyhpZmFjZSwgaWZjZyk7CisgICAgICAgICAgICAgICAgaWYgKGNtLnRldGhlcihpZmFjZSkgIT0gQ29ubmVjdGl2aXR5TWFuYWdlci5URVRIRVJfRVJST1JfTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nICIraWZhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGNvbmZpZ3VyaW5nIGludGVyZmFjZSAiICsgaWZhY2UgKyAiLCA6IiArIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChvYmplY3RQYXRoID09IG51bGwgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKSAhPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PRkYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLkNPTk5FQ1RfSElEX09VVEdPSU5HOworICAgICAgICAgICAgbXNnLm9iaiA9IHN0YXRlOworICAgICAgICAgICAgbUhpZFByb2ZpbGVTdGF0ZS5zZW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyk7CisgICAgICAgIGlmICghY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKG9iamVjdFBhdGgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKG9iamVjdFBhdGggPT0gbnVsbCB8fCBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZSBzdGF0ZSA9IG1EZXZpY2VQcm9maWxlU3RhdGUuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbXNnLmFyZzEgPSBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuRElTQ09OTkVDVF9ISURfT1VUR09JTkc7CisgICAgICAgICAgICBtc2cub2JqID0gc3RhdGU7CisgICAgICAgICAgICBtSGlkUHJvZmlsZVN0YXRlLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZUludGVybmFsKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgaWYgKCFkaXNjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUob2JqZWN0UGF0aCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldElucHV0RGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gbG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMoCisgICAgICAgICAgICBuZXcgaW50W10ge0JsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRH0pOworICAgICAgICByZXR1cm4gZGV2aWNlcy50b0FycmF5KG5ldyBCbHVldG9vdGhEZXZpY2VbZGV2aWNlcy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShkZXZpY2UuZ2V0QWRkcmVzcygpKSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9VTkRFRklORUQpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBpZiAoIUJsdWV0b290aEFkYXB0ZXIuY2hlY2tCbHVldG9vdGhBZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aElucHV0RGV2aWNlUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksCisgICAgICAgICAgICAgICAgcHJpb3JpdHkpOworICAgIH0KKworICAgIC8qcGFja2FnZSovc3luY2hyb25pemVkIFNldDxCbHVldG9vdGhEZXZpY2U+IGxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKGludFtdIHN0YXRlcykgeworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBpbnB1dERldmljZXMgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7CisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGV2aWNlczsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2U6IG1JbnB1dERldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGludCBpbnB1dERldmljZVN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gaW5wdXREZXZpY2VTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXREZXZpY2VzOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IHByZXZTdGF0ZTsKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJldlN0YXRlID0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJldlN0YXRlID0gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldlN0YXRlID09IHN0YXRlKSByZXR1cm47CisKKyAgICAgICAgbUlucHV0RGV2aWNlcy5wdXQoZGV2aWNlLCBzdGF0ZSk7CisKKyAgICAgICAgaWYgKGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09GRiAmJgorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyB8fAorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbm5lY3RlZCBvciBhdHRlbXB0aW5nIHRvIGNvbm5lY3QuCisgICAgICAgICAgICAvLyBCdW1wIHByaW9yaXR5CisgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfQVVUT19DT05ORUNUKTsKKyAgICAgICAgfQorCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFLCBwcmV2U3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCBzdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CisKKyAgICAgICAgaWYgKERCRykgbG9nKCJJbnB1dERldmljZSBzdGF0ZSA6IGRldmljZTogIiArIGRldmljZSArICIgU3RhdGU6IiArIHByZXZTdGF0ZSArICItPiIgKyBzdGF0ZSk7CisKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyB2b2lkIGhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIGFkZHJlc3MsIGJvb2xlYW4gY29ubmVjdGVkKSB7CisgICAgICAgIGludCBzdGF0ZSA9IGNvbm5lY3RlZCA/IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCA6CisgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID09IEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX1VOREVGSU5FRCkgeworICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKKyAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNSZW1vdGVEZXZpY2VJbkNhY2hlKFN0cmluZyBhZGRyZXNzKSB7CiAgICAgICAgIHJldHVybiAobURldmljZVByb3BlcnRpZXMuZ2V0KGFkZHJlc3MpICE9IG51bGwpOwogICAgIH0KQEAgLTEzODQsNyArMTgzMSw3IEBACiAgICAgICAgICAgICBpZiAodXBkYXRlUmVtb3RlRGV2aWNlUHJvcGVydGllc0NhY2hlKGFkZHJlc3MpKQogICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZW1vdGVEZXZpY2VQcm9wZXJ0eShhZGRyZXNzLCBwcm9wZXJ0eSk7CiAgICAgICAgIH0KLSAgICAgICAgTG9nLmUoVEFHLCAiZ2V0UmVtb3RlRGV2aWNlUHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICJub3QgcHJlc2VudDoiICsgYWRkcmVzcyk7CisgICAgICAgIExvZy5lKFRBRywgImdldFJlbW90ZURldmljZVByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIG5vdCBwcmVzZW50OiAiICsgYWRkcmVzcyk7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtMTk4OSw3ICsyNDM2LDggQEAKICAgICAgICAgcHcucHJpbnRsbigiTG9jYWwgbmFtZSA9ICIgKyBnZXROYW1lKCkpOwogICAgICAgICBwdy5wcmludGxuKCJpc0Rpc2NvdmVyaW5nKCkgPSAiICsgaXNEaXNjb3ZlcmluZygpKTsKIAotICAgICAgICBCbHVldG9vdGhIZWFkc2V0IGhlYWRzZXQgPSBuZXcgQmx1ZXRvb3RoSGVhZHNldChtQ29udGV4dCwgbnVsbCk7CisgICAgICAgIG1BZGFwdGVyLmdldFByb2ZpbGVQcm94eShtQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhQcm9maWxlU2VydmljZUxpc3RlbmVyLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQpOwogCiAgICAgICAgIHB3LnByaW50bG4oIlxuLS1Lbm93biBkZXZpY2VzLS0iKTsKICAgICAgICAgZm9yIChTdHJpbmcgYWRkcmVzcyA6IG1EZXZpY2VQcm9wZXJ0aWVzLmtleVNldCgpKSB7CkBAIC0yMDM0LDI0ICsyNDgyLDQ4IEBACiAgICAgICAgIC8vIFJhdGhlciBub3QgZG8gdGhpcyBmcm9tIGhlcmUsIGJ1dCBuby13aGVyZSBlbHNlIGFuZCBJIG5lZWQgdGhpcwogICAgICAgICAvLyBkdW1wCiAgICAgICAgIHB3LnByaW50bG4oIlxuLS1IZWFkc2V0IFNlcnZpY2UtLSIpOwotICAgICAgICBzd2l0Y2ggKGhlYWRzZXQuZ2V0U3RhdGUoaGVhZHNldC5nZXRDdXJyZW50SGVhZHNldCgpKSkgewotICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0U3RhdGUoKSA9IFNUQVRFX0RJU0NPTk5FQ1RFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0U3RhdGUoKSA9IFNUQVRFX0NPTk5FQ1RJTkciKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0U3RhdGUoKSA9IFNUQVRFX0NPTk5FQ1RFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9FUlJPUjoKLSAgICAgICAgICAgIHB3LnByaW50bG4oImdldFN0YXRlKCkgPSBTVEFURV9FUlJPUiIpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChtQmx1ZXRvb3RoSGVhZHNldCAhPSBudWxsKSB7CisgICAgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZVNldCA9IG1CbHVldG9vdGhIZWFkc2V0LmdldENvbm5lY3RlZERldmljZXMoKTsKKyAgICAgICAgICAgaWYgKGRldmljZVNldC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICBwdy5wcmludGxuKCJcbi0tTm8gaGVhZHNldHMgY29ubmVjdGVkLS0iKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gKEJsdWV0b290aERldmljZSkgZGV2aWNlU2V0LnRvQXJyYXkoKVswXTsKKworICAgICAgICAgICAgc3dpdGNoIChtQmx1ZXRvb3RoSGVhZHNldC5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oImdldENvbm5lY3Rpb25TdGF0ZSgpID0gU1RBVEVfRElTQ09OTkVDVEVEIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNUSU5HOgorICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJnZXRDb25uZWN0aW9uU3RhdGUoKSA9IFNUQVRFX0NPTk5FQ1RJTkciKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0Q29ubmVjdGlvblN0YXRlKCkgPSBTVEFURV9DT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oImdldENvbm5lY3Rpb25TdGF0ZSgpID0gU1RBVEVfRElTQ09OTkVDVElORyIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJnZXRDb25uZWN0aW9uU3RhdGUoKSA9IFNUQVRFX0FVRElPX0NPTk5FQ1RFRCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV2aWNlU2V0LmNsZWFyKCk7CisgICAgICAgICAgICBkZXZpY2VTZXQgPSBtQmx1ZXRvb3RoSGVhZHNldC5nZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCwgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUR9KTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIlxuLS1Db25uZWN0ZWQgYW5kIERpc2Nvbm5lY3RlZCBIZWFkc2V0cyIpOworICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2OiBkZXZpY2VTZXQpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKGRldmljZSk7CisgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhIZWFkc2V0LmlzQXVkaW9Db25uZWN0ZWQoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJTQ08gYXVkaW8gY29ubmVjdGVkIHRvIGRldmljZToiICsgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB3LnByaW50bG4oIlxuZ2V0Q3VycmVudEhlYWRzZXQoKSA9ICIgKyBkZXZpY2UpOworICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0QmF0dGVyeVVzYWdlSGludCgpID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0LmdldEJhdHRlcnlVc2FnZUhpbnQoZGV2aWNlKSk7CisgICAgICAgICAgICBtQWRhcHRlci5jbG9zZVByb2ZpbGVQcm94eShCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsIG1CbHVldG9vdGhIZWFkc2V0KTsKICAgICAgICAgfQogCi0gICAgICAgIHB3LnByaW50bG4oIlxuZ2V0Q3VycmVudEhlYWRzZXQoKSA9ICIgKyBoZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCkpOwotICAgICAgICBwdy5wcmludGxuKCJnZXRCYXR0ZXJ5VXNhZ2VIaW50KCkgPSAiICsgaGVhZHNldC5nZXRCYXR0ZXJ5VXNhZ2VIaW50KCkpOwotICAgICAgICBoZWFkc2V0LmNsb3NlKCk7CiAgICAgICAgIHB3LnByaW50bG4oIlxuLS1BcHBsaWNhdGlvbiBTZXJ2aWNlIFJlY29yZHMtLSIpOwogICAgICAgICBmb3IgKEludGVnZXIgaGFuZGxlIDogbVNlcnZpY2VSZWNvcmRUb1BpZC5rZXlTZXQoKSkgewogICAgICAgICAgICAgSW50ZWdlciBwaWQgPSBtU2VydmljZVJlY29yZFRvUGlkLmdldChoYW5kbGUpOwpAQCAtMjA1OSw2ICsyNTMxLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyIG1CbHVldG9vdGhQcm9maWxlU2VydmljZUxpc3RlbmVyID0KKyAgICAgICAgbmV3IEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoaW50IHByb2ZpbGUsIEJsdWV0b290aFByb2ZpbGUgcHJveHkpIHsKKyAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gKEJsdWV0b290aEhlYWRzZXQpIHByb3h5OworICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKGludCBwcm9maWxlKSB7CisgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGJsdWV6U3RyaW5nVG9TY2FuTW9kZShib29sZWFuIHBhaXJhYmxlLCBib29sZWFuIGRpc2NvdmVyYWJsZSkgewogICAgICAgICBpZiAocGFpcmFibGUgJiYgZGlzY292ZXJhYmxlKQogICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRTsKQEAgLTIxMTgsNiArMjYwMCw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKGdldEJvbmRTdGF0ZShhZGRyZXNzKSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChhZGRyZXNzKTsKICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKQEAgLTIxMzAsNiArMjYxNCw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKGdldEJvbmRTdGF0ZShhZGRyZXNzKSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChhZGRyZXNzKTsKICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKQEAgLTIxNDIsNiArMjYyOCw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdFNpbmsoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKGdldEJvbmRTdGF0ZShhZGRyZXNzKSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChhZGRyZXNzKTsKICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKQEAgLTIxNTQsNiArMjY0Miw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdFNpbmsoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKGdldEJvbmRTdGF0ZShhZGRyZXNzKSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChhZGRyZXNzKTsKICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKQEAgLTIyNzcsNCArMjc2NywxMCBAQAogICAgICAgICAgICAgc2hvcnQgY2hhbm5lbCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiByZW1vdmVTZXJ2aWNlUmVjb3JkTmF0aXZlKGludCBoYW5kbGUpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0TGlua1RpbWVvdXROYXRpdmUoU3RyaW5nIHBhdGgsIGludCBudW1fc2xvdHMpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZShTdHJpbmcgcGF0aCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZShib29sZWFuIHZhbHVlLCBTdHJpbmcgbmFwLCBTdHJpbmcgYnJpZGdlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGNvbm5lY3RQYW5EZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgsIFN0cmluZyBzcmNSb2xlLCBTdHJpbmcgZHN0Um9sZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBkaXNjb25uZWN0UGFuRGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvU3BlZWNoUmVjb2duaXplci5qYXZhCmluZGV4IDhmYTBkNTkuLmNkNzNiYTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1NwZWVjaFJlY29nbml6ZXIuamF2YQpAQCAtNTAsNyArNTAsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3BlZWNoUmVjb2duaXplciI7CiAKICAgICAvKioKLSAgICAgKiBVc2VkIHRvIHJldHJpZXZlIGFuIHtAY29kZSBBcnJheUxpc3QmbHQ7U3RyaW5nJmd0O30gZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0gcGFzc2VkIHRvIHRoZQorICAgICAqIFVzZWQgdG8gcmV0cmlldmUgYW4ge0Bjb2RlIEFycmF5TGlzdDxTdHJpbmc+fSBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSBwYXNzZWQgdG8gdGhlCiAgICAgICoge0BsaW5rIFJlY29nbml0aW9uTGlzdGVuZXIjb25SZXN1bHRzKEJ1bmRsZSl9IGFuZAogICAgICAqIHtAbGluayBSZWNvZ25pdGlvbkxpc3RlbmVyI29uUGFydGlhbFJlc3VsdHMoQnVuZGxlKX0gbWV0aG9kcy4gVGhlc2Ugc3RyaW5ncyBhcmUgdGhlIHBvc3NpYmxlCiAgICAgICogcmVjb2duaXRpb24gcmVzdWx0cywgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIG1vc3QgbGlrZWx5IGNhbmRpZGF0ZS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YQppbmRleCBlNGY5MzRlLi5lYWNkNDBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworCiAvKioKICAqIEFjY2VzcyB0aGUgSUNVIGJpZGkgaW1wbGVtZW50YXRpb24uCiAgKiBAaGlkZQpAQCAtNDQsNSArNDYsMTMyIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBydW4gZGlyZWN0aW9uIGluZm9ybWF0aW9uIGZvciBhIGxpbmUgd2l0aGluIGEgcGFyYWdyYXBoLgorICAgICAqCisgICAgICogQHBhcmFtIGRpciBiYXNlIGxpbmUgZGlyZWN0aW9uLCBlaXRoZXIgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUIG9yCisgICAgICogICAgIExheW91dC5ESVJfUklHSFRfVE9fTEVGVAorICAgICAqIEBwYXJhbSBsZXZlbHMgbGV2ZWxzIGFzIHJldHVybmVkIGZyb20ge0BsaW5rICNiaWRpfQorICAgICAqIEBwYXJhbSBsc3RhcnQgc3RhcnQgb2YgdGhlIGxpbmUgaW4gdGhlIGxldmVscyBhcnJheQorICAgICAqIEBwYXJhbSBjaGFycyB0aGUgY2hhcmFjdGVyIGFycmF5ICh1c2VkIHRvIGRldGVybWluZSB3aGl0ZXNwYWNlKQorICAgICAqIEBwYXJhbSBjc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGluIHRoZSBjaGFycyBhcnJheQorICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgbGluZQorICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpcmVjdGlvbnMgZGlyZWN0aW9ucyhpbnQgZGlyLCBieXRlW10gbGV2ZWxzLCBpbnQgbHN0YXJ0LAorICAgICAgICAgICAgY2hhcltdIGNoYXJzLCBpbnQgY3N0YXJ0LCBpbnQgbGVuKSB7CisKKyAgICAgICAgaW50IGJhc2VMZXZlbCA9IGRpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQgPyAwIDogMTsKKyAgICAgICAgaW50IGN1ckxldmVsID0gbGV2ZWxzW2xzdGFydF07CisgICAgICAgIGludCBtaW5MZXZlbCA9IGN1ckxldmVsOworICAgICAgICBpbnQgcnVuQ291bnQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gbHN0YXJ0ICsgMSwgZSA9IGxzdGFydCArIGxlbjsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaW50IGxldmVsID0gbGV2ZWxzW2ldOworICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgY3VyTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICArK3J1bkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGZpbmFsIHJ1biBmb3IgdHJhaWxpbmcgY291bnRlci1kaXJlY3Rpb25hbCB3aGl0ZXNwYWNlCisgICAgICAgIGludCB2aXNMZW4gPSBsZW47CisgICAgICAgIGlmICgoY3VyTGV2ZWwgJiAxKSAhPSAoYmFzZUxldmVsICYgMSkpIHsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIHZpc2libGUgZW5kCisgICAgICAgICAgICB3aGlsZSAoLS12aXNMZW4gPj0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBjaGFyc1tjc3RhcnQgKyB2aXNMZW5dOworCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgLS12aXNMZW47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3Zpc0xlbjsKKyAgICAgICAgICAgIGlmICh2aXNMZW4gIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgKytydW5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChydW5Db3VudCA9PSAxICYmIG1pbkxldmVsID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgLy8gd2UncmUgZG9uZSwgb25seSBvbmUgcnVuIG9uIHRoaXMgbGluZQorICAgICAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBsZCA9IG5ldyBpbnRbcnVuQ291bnQgKiAyXTsKKyAgICAgICAgaW50IG1heExldmVsID0gbWluTGV2ZWw7CisgICAgICAgIGludCBsZXZlbEJpdHMgPSBtaW5MZXZlbCA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUOworICAgICAgICB7CisgICAgICAgICAgICAvLyBTdGFydCBvZiBmaXJzdCBwYWlyIGlzIGFsd2F5cyAwLCB3ZSB3cml0ZQorICAgICAgICAgICAgLy8gbGVuZ3RoIHRoZW4gc3RhcnQgYXQgZWFjaCBuZXcgcnVuLCBhbmQgdGhlCisgICAgICAgICAgICAvLyBsYXN0IHJ1biBsZW5ndGggYWZ0ZXIgd2UncmUgZG9uZS4KKyAgICAgICAgICAgIGludCBuID0gMTsKKyAgICAgICAgICAgIGludCBwcmV2ID0gbHN0YXJ0OworICAgICAgICAgICAgY3VyTGV2ZWwgPSBtaW5MZXZlbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsc3RhcnQsIGUgPSBsc3RhcnQgKyB2aXNMZW47IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBsZXZlbHNbaV07CisgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ckxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDwgbWluTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGlnbm9yZSBydW4gbGVuZ3RoIGxpbWl0IG9mIDJeUlVOX0xFVkVMX1NISUZUCisgICAgICAgICAgICAgICAgICAgIGxkW24rK10gPSAoaSAtIHByZXYpIHwgbGV2ZWxCaXRzOworICAgICAgICAgICAgICAgICAgICBsZFtuKytdID0gaSAtIGxzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxCaXRzID0gY3VyTGV2ZWwgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVDsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGRbbl0gPSAobHN0YXJ0ICsgdmlzTGVuIC0gcHJldikgfCBsZXZlbEJpdHM7CisgICAgICAgICAgICBpZiAodmlzTGVuIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgbGRbKytuXSA9IHZpc0xlbjsKKyAgICAgICAgICAgICAgICBsZFsrK25dID0gKGxlbiAtIHZpc0xlbikgfCAoYmFzZUxldmVsIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gc3dhcCBhbnkgcnVucy4KKyAgICAgICAgLy8gSWYgdGhlIG1pbiBsZXZlbCBydW4gZGlyZWN0aW9uIGRvZXNuJ3QgbWF0Y2ggdGhlIGJhc2UKKyAgICAgICAgLy8gZGlyZWN0aW9uLCB3ZSBhbHdheXMgbmVlZCB0byBzd2FwIChhdCB0aGlzIHBvaW50CisgICAgICAgIC8vIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBydW4pLgorICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvbid0IG5lZWQgdG8gc3dhcCB0aGUgbG93ZXN0IGxldmVsLgorICAgICAgICAvLyBTaW5jZSB0aGVyZSBhcmUgbm8gbG9naWNhbGx5IGFkamFjZW50IHJ1bnMgYXQgdGhlIHNhbWUKKyAgICAgICAgLy8gbGV2ZWwsIGlmIHRoZSBtYXggbGV2ZWwgaXMgdGhlIHNhbWUgYXMgdGhlIChuZXcpIG1pbgorICAgICAgICAvLyBsZXZlbCwgd2UgaGF2ZSBhIHNlcmllcyBvZiBhbHRlcm5hdGluZyBsZXZlbHMgdGhhdAorICAgICAgICAvLyBpcyBhbHJlYWR5IGluIG9yZGVyLCBzbyB0aGVyZSdzIG5vIG1vcmUgdG8gZG8uCisgICAgICAgIC8vCisgICAgICAgIGJvb2xlYW4gc3dhcDsKKyAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgbWluTGV2ZWwgKz0gMTsKKyAgICAgICAgICAgIHN3YXAgPSBtYXhMZXZlbCA+IG1pbkxldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dhcCA9IHJ1bkNvdW50ID4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3dhcCkgeworICAgICAgICAgICAgZm9yIChpbnQgbGV2ZWwgPSBtYXhMZXZlbCAtIDE7IGxldmVsID49IG1pbkxldmVsOyAtLWxldmVsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZC5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxzW2xkW2ldXSA+PSBsZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGUgPSBpICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlIDwgbGQubGVuZ3RoICYmIGxldmVsc1tsZFtlXV0gPj0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsb3cgPSBpLCBoaSA9IGUgLSAyOyBsb3cgPCBoaTsgbG93ICs9IDIsIGhpIC09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGxkW2xvd107IGxkW2xvd10gPSBsZFtoaV07IGxkW2hpXSA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxkW2xvdysxXTsgbGRbbG93KzFdID0gbGRbaGkrMV07IGxkW2hpKzFdID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlICsgMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERpcmVjdGlvbnMobGQpOworICAgIH0KKwogICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyBpbnQgcnVuQmlkaShpbnQgZGlyLCBjaGFyW10gY2hzLCBieXRlW10gY2hJbmZvLCBpbnQgbiwgYm9vbGVhbiBoYXZlSW5mbyk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEKaW5kZXggOTQ0ZjczNS4uOTMwOWIwNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhCkBAIC0yMDgsMTEgKzIwOCwxMSBAQAogICAgICAgICAgICAgICogd2lkdGggYmVjYXVzZSB0aGUgd2lkdGggdGhhdCB3YXMgcGFzc2VkIGluIHdhcyBmb3IgdGhlCiAgICAgICAgICAgICAgKiBmdWxsIHRleHQsIG5vdCB0aGUgZWxsaXBzaXplZCBmb3JtLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZW1wKSB7Ci0gICAgICAgICAgICAgICAgbU1heCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgVGV4dExpbmUgbGluZSA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAgICAgbGluZS5zZXQocGFpbnQsIHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBtTWF4ID0gKGludCkgRmxvYXRNYXRoLmNlaWwobGluZS5tZXRyaWNzKG51bGwpKTsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUobGluZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5jbHVkZXBhZCkgewpAQCAtMjc2LDE0ICsyNzYsMTMgQEAKICAgICAgICAgICAgIGlmIChmbSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZm0gPSBuZXcgTWV0cmljcygpOwogICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaW50IHdpZDsKIAotICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVtcCkgewotICAgICAgICAgICAgICAgIHdpZCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgZm0pKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbS53aWR0aCA9IHdpZDsKKyAgICAgICAgICAgIFRleHRMaW5lIGxpbmUgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIGxpbmUuc2V0KHBhaW50LCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBmbS53aWR0aCA9IChpbnQpIEZsb2F0TWF0aC5jZWlsKGxpbmUubWV0cmljcyhmbSkpOworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZShsaW5lKTsKKwogICAgICAgICAgICAgcmV0dXJuIGZtOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zODksNyArMzg4LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0cmljcyBleHRlbmRzIFBhaW50LkZvbnRNZXRyaWNzSW50IHsKICAgICAgICAgcHVibGljIGludCB3aWR0aDsKLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgd2lkdGg9IiArIHdpZHRoOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0NsaXBib2FyZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCmluZGV4IDUyMDM5YWYuLjBiMjM5Y2YgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCkBAIC0xNiw3MyArMTYsMjYgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQogLyoqCi0gKiBJbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCBzZXJ2aWNlLCBmb3IgcGxhY2luZyBhbmQgcmV0cmlldmluZyB0ZXh0IGluCi0gKiB0aGUgZ2xvYmFsIGNsaXBib2FyZC4KLSAqCi0gKiA8cD4KLSAqIFlvdSBkbyBub3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyBkaXJlY3RseTsgaW5zdGVhZCwgcmV0cmlldmUgaXQgdGhyb3VnaAotICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2V9LgotICoKLSAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZQorICogQGRlcHJlY2F0ZWQgT2xkIHRleHQtb25seSBpbnRlcmFjZSB0byB0aGUgY2xpcGJvYXJkLiAgU2VlCisgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXJ9IGZvciB0aGUgbW9kZXJuIEFQSS4KICAqLwotcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIElDbGlwYm9hcmQgc1NlcnZpY2U7Ci0KLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBJQ2xpcGJvYXJkIGdldFNlcnZpY2UoKSB7Ci0gICAgICAgIGlmIChzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2U7Ci0gICAgICAgIH0KLSAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIik7Ci0gICAgICAgIHNTZXJ2aWNlID0gSUNsaXBib2FyZC5TdHViLmFzSW50ZXJmYWNlKGIpOwotICAgICAgICByZXR1cm4gc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqIHtAaGlkZX0gKi8KLSAgICBwdWJsaWMgQ2xpcGJvYXJkTWFuYWdlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCitARGVwcmVjYXRlZAorcHVibGljIGFic3RyYWN0IGNsYXNzIENsaXBib2FyZE1hbmFnZXIgewogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHRleHQgb24gdGhlIGNsaXBib2FyZC4gIEl0IHdpbGwgZXZlbnR1YWxseSBiZSBwb3NzaWJsZQogICAgICAqIHRvIHN0b3JlIHR5cGVzIG90aGVyIHRoYW4gdGV4dCB0b28sIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIHJldHVybgogICAgICAqIG51bGwgaWYgdGhlIHR5cGUgY2Fubm90IGJlIGNvZXJjZWQgdG8gdGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmdldENsaXBib2FyZFRleHQoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB0byB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U2VydmljZSgpLnNldENsaXBib2FyZFRleHQodGV4dCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzQ2xpcGJvYXJkVGV4dCgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1RleHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKaW5kZXggMTRlNTY1NS4uYjZhYTAzYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKQEAgLTMxMCw3ICszMTAsNiBAQAogCiAgICAgICAgIERpcmVjdGlvbnNbXSBvYmplY3RzID0gbmV3IERpcmVjdGlvbnNbMV07CiAKLQogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAgaW50c1tTVEFSVF0gPSByZWZsb3dlZC5nZXRMaW5lU3RhcnQoaSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAocmVmbG93ZWQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpIDw8IERJUl9TSElGVCkgfApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKaW5kZXggYzNiZDBhZS4uZDQyNmQxMjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQpAQCAtMzQsMTMgKzM0LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcCk7CiAKICAgICAvKioKKyAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIENhbnZhcyNkcmF3VGV4dFJ1bn0uCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApOworCisgICAvKioKICAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I21lYXN1cmVUZXh0fS4KICAgICAgKi8KICAgICBmbG9hdCBtZWFzdXJlVGV4dChpbnQgc3RhcnQsIGludCBlbmQsIFBhaW50IHApOwogCi0KICAgICAvKioKICAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I2dldFRleHRXaWR0aHN9LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocyhpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzLCBQYWludCBwKTsKKworICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjZ2V0VGV4dFJ1bkFkdmFuY2VzfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCwgUGFpbnQgcGFpbnQpOworCisgICAgLyoqCisgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNnZXRUZXh0UnVuQ3Vyc29yfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIGludCBnZXRUZXh0UnVuQ3Vyc29yKGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsCisgICAgICAgICAgICBpbnQgY3Vyc29yT3B0LCBQYWludCBwKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvSUNsaXBib2FyZC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZWI1YzguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi0vKioKLSAqIFByb2dyYW1taW5nIGludGVyZmFjZSB0byB0aGUgY2xpcGJvYXJkLCB3aGljaCBhbGxvd3MgY29weWluZyBhbmQgcGFzdGluZwotICogYmV0d2VlbiBhcHBsaWNhdGlvbnMuCi0gKiB7QGhpZGV9Ci0gKi8KLWludGVyZmFjZSBJQ2xpcGJvYXJkIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG9uIHRoZSBjbGlwYm9hcmQuICBJdCB3aWxsIGV2ZW50dWFsbHkgYmUgcG9zc2libGUKLSAgICAgKiB0byBzdG9yZSB0eXBlcyBvdGhlciB0aGFuIHRleHQgdG9vLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCByZXR1cm4KLSAgICAgKiBudWxsIGlmIHRoZSB0eXBlIGNhbm5vdCBiZSBjb2VyY2VkIHRvIHRleHQuCi0gICAgICovCi0gICAgQ2hhclNlcXVlbmNlIGdldENsaXBib2FyZFRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgdG8gdGhlIHNwZWNpZmllZCB0ZXh0LgotICAgICAqLwotICAgIHZvaWQgc2V0Q2xpcGJvYXJkVGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNGUxOTdjZC4uNTRhYzkwNgotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKQEAgLTE2LDI5ICsxNiwzMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAotaW1wb3J0IGFuZHJvaWQuZW1vamkuRW1vamlGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLio7CitpbXBvcnQgYW5kcm9pZC5lbW9qaS5FbW9qaUZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGluZUJhY2tncm91bmRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UYWJTdG9wU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIC8qKgotICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24gCi0gKiB0aGUgc2NyZWVuLiAKLSAqIDxwPkZvciB0ZXh0IHRoYXQgd2lsbCBiZSBlZGl0ZWQsIHVzZSBhIHtAbGluayBEeW5hbWljTGF5b3V0fSwgCi0gKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4gIAorICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24KKyAqIHRoZSBzY3JlZW4uCisgKiA8cD5Gb3IgdGV4dCB0aGF0IHdpbGwgYmUgZWRpdGVkLCB1c2UgYSB7QGxpbmsgRHluYW1pY0xheW91dH0sCisgKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4KICAqIEZvciB0ZXh0IHRoYXQgd2lsbCBub3QgY2hhbmdlLCB1c2UgYSB7QGxpbmsgU3RhdGljTGF5b3V0fS4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExheW91dCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhcmFncmFwaFN0eWxlW10gTk9fUEFSQV9TUEFOUyA9CiAgICAgICAgIEFycmF5VXRpbHMuZW1wdHlBcnJheShQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7CiAKQEAgLTU0LDkgKzU4LDcgQEAKICAgICAgICAgICAgIE1JTl9FTU9KSSA9IC0xOwogICAgICAgICAgICAgTUFYX0VNT0pJID0gLTE7CiAgICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBSZWN0RiBtRW1vamlSZWN0OworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiBob3cgd2lkZSBhIGxheW91dCBtdXN0IGJlIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlCkBAIC02Niw3ICs2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50KSB7CiAgICAgICAgIHJldHVybiBnZXREZXNpcmVkV2lkdGgoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksIHBhaW50KTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gaG93IHdpZGUgYSBsYXlvdXQgbXVzdCBiZSBpbiBvcmRlciB0byBkaXNwbGF5IHRoZQogICAgICAqIHNwZWNpZmllZCB0ZXh0IHNsaWNlIHdpdGggb25lIGxpbmUgcGVyIHBhcmFncmFwaC4KQEAgLTg1LDggKzg3LDcgQEAKICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwogCiAgICAgICAgICAgICAvLyBub3RlLCBvbWl0cyB0cmFpbGluZyBwYXJhZ3JhcGggY2hhcgotICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBpLCBuZXh0LCBudWxsLCB0cnVlLCBudWxsKTsKKyAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUGFyYShwYWludCwgd29ya1BhaW50LCBzb3VyY2UsIGksIG5leHQpOwogCiAgICAgICAgICAgICBpZiAodyA+IG5lZWQpCiAgICAgICAgICAgICAgICAgbmVlZCA9IHc7CkBAIC0xMTYsNiArMTE3LDE1IEBACiAgICAgICAgIGlmICh3aWR0aCA8IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMYXlvdXQ6ICIgKyB3aWR0aCArICIgPCAwIik7CiAKKyAgICAgICAgLy8gRW5zdXJlIHBhaW50IGRvZXNuJ3QgaGF2ZSBiYXNlbGluZVNoaWZ0IHNldC4KKyAgICAgICAgLy8gV2hpbGUgbm9ybWFsbHkgd2UgZG9uJ3QgbW9kaWZ5IHRoZSBwYWludCB0aGUgdXNlciBwYXNzZWQgaW4sCisgICAgICAgIC8vIHdlIHdlcmUgYWxyZWFkeSBkb2luZyB0aGlzIGluIFN0eWxlZC5kcmF3VW5pZm9ybVJ1biB3aXRoIGJvdGgKKyAgICAgICAgLy8gYmFzZWxpbmVTaGlmdCBhbmQgYmdDb2xvci4gIFdlIHByb2JhYmx5IHNob3VsZCByZWV2YWx1YXRlIGJnQ29sb3IuCisgICAgICAgIGlmIChwYWludCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludC5iZ0NvbG9yID0gMDsKKyAgICAgICAgICAgIHBhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgICAgICB9CisKICAgICAgICAgbVRleHQgPSB0ZXh0OwogICAgICAgICBtUGFpbnQgPSBwYWludDsKICAgICAgICAgbVdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKQEAgLTE3NSw3ICsxODUsNiBAQAogICAgICAgICAgICAgZGJvdHRvbSA9IHNUZW1wUmVjdC5ib3R0b207CiAgICAgICAgIH0KIAotCiAgICAgICAgIGludCB0b3AgPSAwOwogICAgICAgICBpbnQgYm90dG9tID0gZ2V0TGluZVRvcChnZXRMaW5lQ291bnQoKSk7CiAKQEAgLTE4NSwyNiArMTk0LDI4IEBACiAgICAgICAgIGlmIChkYm90dG9tIDwgYm90dG9tKSB7CiAgICAgICAgICAgICBib3R0b20gPSBkYm90dG9tOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZmlyc3QgPSBnZXRMaW5lRm9yVmVydGljYWwodG9wKTsgCisKKyAgICAgICAgaW50IGZpcnN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKHRvcCk7CiAgICAgICAgIGludCBsYXN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKGJvdHRvbSk7Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7Ci0gICAgICAgIAorCiAgICAgICAgIFRleHRQYWludCBwYWludCA9IG1QYWludDsKICAgICAgICAgQ2hhclNlcXVlbmNlIGJ1ZiA9IG1UZXh0OwogICAgICAgICBpbnQgd2lkdGggPSBtV2lkdGg7CiAgICAgICAgIGJvb2xlYW4gc3Bhbm5lZFRleHQgPSBtU3Bhbm5lZFRleHQ7CiAKICAgICAgICAgUGFyYWdyYXBoU3R5bGVbXSBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIGludCBzcGFuZW5kID0gMDsKKyAgICAgICAgaW50IHNwYW5FbmQgPSAwOwogICAgICAgICBpbnQgdGV4dExlbmd0aCA9IDA7CiAKICAgICAgICAgLy8gRmlyc3QsIGRyYXcgTGluZUJhY2tncm91bmRTcGFucy4KLSAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCBvciBkaXJlY3Rpb24gb2YKLSAgICAgICAgLy8gdGhlIGxheW91dCBvciBsaW5lLiAgWFhYOiBTaG91bGQgdGhleT8KKyAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCwgbWFyZ2lucywgb3IKKyAgICAgICAgLy8gZGlyZWN0aW9uIG9mIHRoZSBsYXlvdXQgb3IgbGluZS4gIFhYWDogU2hvdWxkIHRoZXk/CisgICAgICAgIC8vIFRoZXkgYXJlIGV2YWx1YXRlZCBhdCBlYWNoIGxpbmUuCiAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7CiAgICAgICAgICAgICB0ZXh0TGVuZ3RoID0gYnVmLmxlbmd0aCgpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgewogICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHByZXZpb3VzTGluZUVuZDsKQEAgLTIxNiwxMiArMjI3LDE0IEBACiAgICAgICAgICAgICAgICAgcHJldmlvdXNMaW5lQm90dG9tID0gbGJvdHRvbTsKICAgICAgICAgICAgICAgICBpbnQgbGJhc2VsaW5lID0gbGJvdHRvbSAtIGdldExpbmVEZXNjZW50KGkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgICAgICAgICBzcGFuZW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzaG91bGQgYmUgaW5mcmVxdWVudCwgc28gd2UnbGwgdXNlIHRoaXMgc28gdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFzIG9mdGVuLgorICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBMaW5lQmFja2dyb3VuZFNwYW5zIG9uIGEgbGluZSBjb250cmlidXRlIHRvIGl0cworICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgICAgICAgIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3AsIHN0YXJ0LCBlbmQsIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBzcGFucy5sZW5ndGg7IG4rKykgewpAQCAtMjM0LDExICsyNDcsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyByZXNldCB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgICAgIHNwYW5lbmQgPSAwOworICAgICAgICAgICAgc3BhbkVuZCA9IDA7CiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgICAgIHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7CiAgICAgICAgICAgICBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIH0gCisgICAgICAgIH0KIAogICAgICAgICAvLyBUaGVyZSBjYW4gYmUgYSBoaWdobGlnaHQgZXZlbiB3aXRob3V0IHNwYW5zIGlmIHdlIGFyZSBkcmF3aW5nCiAgICAgICAgIC8vIGEgbm9uLXNwYW5uZWQgdHJhbnNmb3JtYXRpb24gb2YgYSBzcGFubmVkIGVkaXRpbmcgYnVmZmVyLgpAQCAtMjU1LDcgKzI2OCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQWxpZ25tZW50IGFsaWduID0gbUFsaWdubWVudDsKLSAgICAgICAgCisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworCiAgICAgICAgIC8vIE5leHQgZHJhdyB0aGUgbGluZXMsIG9uZSBhdCBhIHRpbWUuCiAgICAgICAgIC8vIHRoZSBiYXNlbGluZSBpcyB0aGUgdG9wIG9mIHRoZSBmb2xsb3dpbmcgbGluZSBtaW51cyB0aGUgY3VycmVudAogICAgICAgICAvLyBsaW5lJ3MgZGVzY2VudC4KQEAgLTI3MCwxOSArMjg3LDMwIEBACiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwogICAgICAgICAgICAgaW50IGxiYXNlbGluZSA9IGxib3R0b20gLSBnZXRMaW5lRGVzY2VudChpKTsKIAotICAgICAgICAgICAgYm9vbGVhbiBpc0ZpcnN0UGFyYUxpbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeyAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCB8fCBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0UGFyYUxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29tcHV0ZSB0aGUgYWxpZ25tZW50LgotICAgICAgICAgICAgICAgIC8vIExhc3QgYWxpZ25tZW50IHN0eWxlIHdpbnMuCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7Ci0gICAgICAgICAgICAgICAgICAgIHNwYW5lbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCisgICAgICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpOworICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbVdpZHRoOworCisgICAgICAgICAgICBpZiAoc3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IChzdGFydCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJyk7CisKKyAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29sbGVjdCBpbnRvIHNwYW5zIGFycmF5LgorICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGFsaWdubWVudCwgbGFzdCBhbGlnbm1lbnQgc3R5bGUgd2lucy4KKyAgICAgICAgICAgICAgICAvLyBSZXNldCB0YWJTdG9wcywgd2UnbGwgcmVidWlsZCBpZiB3ZSBlbmNvdW50ZXIgYSBsaW5lIHdpdGgKKyAgICAgICAgICAgICAgICAvLyB0YWJzLgorICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBwYXJhZ3JhcGggc3BhbnMgdG8gYmUgcmVsYXRpdmVseSBpbmZyZXF1ZW50LCB1c2UKKyAgICAgICAgICAgICAgICAvLyBzcGFuRW5kIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGxlc3MgZnJlcXVlbnRseS4gIFNpbmNlCisgICAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoIHN0eWxlcyBvdWdodCB0byBhcHBseSB0byBlbnRpcmUgcGFyYWdyYXBocywgd2UgY2FuCisgICAgICAgICAgICAgICAgLy8ganVzdCBjb2xsZWN0IHRoZSBvbmVzIHByZXNlbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgLy8gSWYgc3BhbkVuZCBpcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoLCB0aGF0J3Mgbm90CisgICAgICAgICAgICAgICAgLy8gb3VyIHByb2JsZW0uCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5FbmQgJiYgKGkgPT0gZmlyc3QgfHwgaXNGaXJzdFBhcmFMaW5lKSkgeworICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgc3BhbmVuZCwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgc3RhcnQsIHNwYW5FbmQsIFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKKwogICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IG1BbGlnbm1lbnQ7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSBzcGFucy5sZW5ndGgtMTsgbiA+PSAwOyBuLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuc1tuXSBpbnN0YW5jZW9mIEFsaWdubWVudFNwYW4pIHsKQEAgLTI5MCw0NSArMzE4LDQ5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSk7Ci0gICAgICAgICAgICBpbnQgbGVmdCA9IDA7Ci0gICAgICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7CiAKLSAgICAgICAgICAgIC8vIERyYXcgYWxsIGxlYWRpbmcgbWFyZ2luIHNwYW5zLiAgQWRqdXN0IGxlZnQgb3IgcmlnaHQgYWNjb3JkaW5nCi0gICAgICAgICAgICAvLyB0byB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbiBvZiB0aGUgbGluZS4KLSAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEcmF3IGFsbCBsZWFkaW5nIG1hcmdpbiBzcGFucy4gIEFkanVzdCBsZWZ0IG9yIHJpZ2h0IGFjY29yZGluZworICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoZSBsaW5lLgogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzcGFucy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBsZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbnNbbl0gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbikgewogICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gbWFyZ2luID0gKExlYWRpbmdNYXJnaW5TcGFuKSBzcGFuc1tuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRmlyc3RMaW5lTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmdpbiBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4yKSBtYXJnaW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRMaW5lID0gZ2V0TGluZUZvck9mZnNldChzcC5nZXRTcGFuU3RhcnQobWFyZ2luKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmlyc3RMaW5lTWFyZ2luID0gaSA8IHN0YXJ0TGluZSArIGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLmRyYXdMZWFkaW5nTWFyZ2luKGMsIHBhaW50LCByaWdodCwgZGlyLCBsdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYmFzZWxpbmUsIGxib3R0b20sIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgaXNGaXJzdFBhcmFMaW5lLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgLT0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4oaXNGaXJzdFBhcmFMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbih1c2VGaXJzdExpbmVNYXJnaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4uZHJhd0xlYWRpbmdNYXJnaW4oYywgcGFpbnQsIGxlZnQsIGRpciwgbHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGJhc2VsaW5lLCBsYm90dG9tLCBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIGlzRmlyc3RQYXJhTGluZSwgdGhpcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZU1hcmdpbiA9IGlzRmlyc3RQYXJhTGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFyZ2luIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKW1hcmdpbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VNYXJnaW4gPSBjb3VudCA+IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4odXNlTWFyZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKHVzZUZpcnN0TGluZU1hcmdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgcG9pbnQgYXQgd2hpY2ggdG8gc3RhcnQgcmVuZGVyaW5nIGRlcGVuZGluZyBvbiB0aGUKLSAgICAgICAgICAgIC8vIGFsaWdubWVudCBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGkpOworICAgICAgICAgICAgLy8gQ2FuJ3QgdGVsbCBpZiB3ZSBoYXZlIHRhYnMgZm9yIHN1cmUsIGN1cnJlbnRseQorICAgICAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkgJiYgIXRhYlN0b3BzSXNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcy5yZXNldChUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CkBAIC0zMzcsNDEgKzM2OSw4MCBAQAogICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lTWF4KGksIHNwYW5zLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaW50IG1heCA9IChpbnQpZ2V0TGluZUV4dGVudChpLCB0YWJTdG9wcywgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBtYXg7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHggPSByaWdodCAtIG1heDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsaWdubWVudC5BTElHTl9DRU5URVIKLSAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4ICYgfjE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBoYWxmID0gKHJpZ2h0IC0gbGVmdCAtIG1heCkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0IC0gaGFsZjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0ICsgaGFsZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0IC0gbWF4OwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgorICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXggJiB+MTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IChyaWdodCArIGxlZnQgLSBtYXgpID4+IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGkpOwogICAgICAgICAgICAgaWYgKGRpcmVjdGlvbnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCAmJgotICAgICAgICAgICAgICAgICAgICAhc3Bhbm5lZFRleHQgJiYgIWhhc1RhYikgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICFzcGFubmVkVGV4dCAmJiAhaGFzVGFiT3JFbW9qaSkgewogICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyB0aGVyZSdzIG5vdGhpbmcgYWRkaXRpb25hbCB0byBiZSBkb25lCiAgICAgICAgICAgICAgICAgYy5kcmF3VGV4dChidWYsIHN0YXJ0LCBlbmQsIHgsIGxiYXNlbGluZSwgcGFpbnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkcmF3VGV4dChjLCBidWYsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgeCwgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tLCBwYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgaGFzVGFiLCBzcGFucyk7CisgICAgICAgICAgICAgICAgdGwuc2V0KHBhaW50LCBidWYsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFiT3JFbW9qaSwgdGFiU3RvcHMpOworICAgICAgICAgICAgICAgIHRsLmRyYXcoYywgeCwgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUsIGdpdmVuIHRoZSBsZWZ0IGFuZCByaWdodCBib3VuZHMKKyAgICAgKiBvZiB0aGUgbWFyZ2lucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGluZGV4CisgICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgYm91bmRzICgwLCBvciBsZWFkaW5nIG1hcmdpbiBpZiBsdHIgcGFyYSkKKyAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IGJvdW5kcyAod2lkdGgsIG1pbnVzIGxlYWRpbmcgbWFyZ2luIGlmIHJ0bCBwYXJhKQorICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBsaW5lICh0byByaWdodCBvZiBsaW5lIGlmIHJ0bCBwYXJhKQorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldExpbmVTdGFydFBvcyhpbnQgbGluZSwgaW50IGxlZnQsIGludCByaWdodCkgeworICAgICAgICAvLyBBZGp1c3QgdGhlIHBvaW50IGF0IHdoaWNoIHRvIHN0YXJ0IHJlbmRlcmluZyBkZXBlbmRpbmcgb24gdGhlCisgICAgICAgIC8vIGFsaWdubWVudCBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBnZXRQYXJhZ3JhcGhBbGlnbm1lbnQobGluZSk7CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisKKyAgICAgICAgaW50IHg7CisgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fTk9STUFMKSB7CisgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgeCA9IGxlZnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHggPSByaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQgJiYgZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpKSB7CisgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIG1UZXh0OworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCBzcGFubmVkLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gdGFiU3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBzdGFydCwgc3BhbkVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmICh0YWJTcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHRhYlNwYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lRXh0ZW50KGxpbmUsIHRhYlN0b3BzLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBtYXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgLSBtYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgorICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOworICAgICAgICAgICAgICAgIHggPSAobGVmdCArIHJpZ2h0IC0gbWF4KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB4OwogICAgIH0KIAogICAgIC8qKgpAQCAtNDE3LDcgKzQ4OCw3IEBACiAKICAgICAgICAgbVdpZHRoID0gd2lkOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoaXMgbGF5b3V0LgogICAgICAqLwpAQCAtNDUwLDcgKzUyMSw3IEBACiAgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgb2YgdGV4dCBpbiB0aGlzIGxheW91dC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldExpbmVDb3VudCgpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBiYXNlbGluZSBmb3IgdGhlIHNwZWNpZmllZCBsaW5lICgwJmhlbGxpcDtnZXRMaW5lQ291bnQoKSAtIDEpCiAgICAgICogSWYgYm91bmRzIGlzIG5vdCBudWxsLCByZXR1cm4gdGhlIHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSBleHRlbnRzCkBAIC01MjQsMTMgKzU5NSw5NSBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Qm90dG9tUGFkZGluZygpOwogCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgYW5kIHRoZSBwcmVjZWRpbmcgY2hhcmFjdGVyCisgICAgICogYXJlIGF0IGRpZmZlcmVudCBydW4gbGV2ZWxzIChhbmQgdGh1cyB0aGVyZSdzIGEgc3BsaXQgY2FyZXQpLgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhdCBhIGxldmVsIGJvdW5kYXJ5CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTGV2ZWxCb3VuZGFyeShpbnQgb2Zmc2V0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChvZmZzZXQpOworICAgICAgICBEaXJlY3Rpb25zIGRpcnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaWYgKGRpcnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCB8fCBkaXJzID09IERJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIHJ1bnMgPSBkaXJzLm1EaXJlY3Rpb25zOworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gbGluZVN0YXJ0IHx8IG9mZnNldCA9PSBsaW5lRW5kKSB7CisgICAgICAgICAgICBpbnQgcGFyYUxldmVsID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgICAgIGludCBydW5JbmRleCA9IG9mZnNldCA9PSBsaW5lU3RhcnQgPyAwIDogcnVucy5sZW5ndGggLSAyOworICAgICAgICAgICAgcmV0dXJuICgocnVuc1tydW5JbmRleCArIDFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0spICE9IHBhcmFMZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCAtPSBsaW5lU3RhcnQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBydW5zW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBwcmltYXJ5SXNUcmFpbGluZ1ByZXZpb3VzKGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50W10gcnVucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpLm1EaXJlY3Rpb25zOworCisgICAgICAgIGludCBsZXZlbEF0ID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IHN0YXJ0ICsgKHJ1bnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAobGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBzdGFydCAmJiBvZmZzZXQgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjaGFyYWN0ZXIgaXMgYXQgc2FtZSBsZXZlbCwgc28gZG9uJ3QgdXNlIHRyYWlsaW5nLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldmVsQXQgPSAocnVuc1tpKzFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsQXQgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIE9mZnNldCB3YXMgbGltaXQgb2YgbGluZS4KKyAgICAgICAgICAgIGxldmVsQXQgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXQgbGV2ZWwgYm91bmRhcnksIGNoZWNrIHByZXZpb3VzIGxldmVsLgorICAgICAgICBpbnQgbGV2ZWxCZWZvcmUgPSAtMTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgIGxldmVsQmVmb3JlID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQgbGltaXQgPSBzdGFydCArIChydW5zW2krMV0gJiBSVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgICAgIGlmIChsaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsQmVmb3JlID0gKHJ1bnNbaSsxXSA+Pj4gUlVOX0xFVkVMX1NISUZUKSAmIFJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGV2ZWxCZWZvcmUgPCBsZXZlbEF0OworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgcHJpbWFyeSBob3Jpem9udGFsIHBvc2l0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHRleHQgb2Zmc2V0LgogICAgICAqIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIGEgbmV3IGNoYXJhY3RlciB3b3VsZCBiZSBpbnNlcnRlZCBpbgogICAgICAqIHRoZSBwYXJhZ3JhcGgncyBwcmltYXJ5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0UHJpbWFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgYm9vbGVhbiB0cmFpbGluZyA9IHByaW1hcnlJc1RyYWlsaW5nUHJldmlvdXMob2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MzksNjYgKzY5Miw0MiBAQAogICAgICAqIHRoZSBkaXJlY3Rpb24gb3RoZXIgdGhhbiB0aGUgcGFyYWdyYXBoJ3MgcHJpbWFyeSBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNlY29uZGFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRydWUsIHRydWUpOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gcHJpbWFyeUlzVHJhaWxpbmdQcmV2aW91cyhvZmZzZXQpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsICF0cmFpbGluZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0KSB7CisgICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcpIHsKICAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CiAKLSAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgYWx0LCBsaW5lKTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgbGluZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICAgIHByaXZhdGUgZmxvYXQgZ2V0SG9yaXpvbnRhbChpbnQgb2Zmc2V0LCBib29sZWFuIHRyYWlsaW5nLCBpbnQgbGluZSkgewogICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQgPSBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7CiAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0gICAgICAgIGJvb2xlYW4gdGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CiAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCi0gICAgICAgIFRhYlN0b3BTcGFuW10gdGFicyA9IG51bGw7Ci0gICAgICAgIGlmICh0YWIgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICB0YWJzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgIGlmIChoYXNUYWJPckVtb2ppICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgLy8gSnVzdCBjaGVja2luZyB0aGlzIGxpbmUgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLCB0YWJzIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYWxsIGxpbmVzIGluIGEgcGFyYWdyYXBoLgorICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIG1UZXh0LCBzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFicyk7IC8vIFhYWCBzaG91bGQgcmV1c2UKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IHdpZCA9IG1lYXN1cmVUZXh0KG1QYWludCwgbVdvcmtQYWludCwgbVRleHQsIHN0YXJ0LCBvZmZzZXQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCBkaXJlY3Rpb25zLCB0cmFpbGluZywgYWx0LCB0YWIsIHRhYnMpOworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgIGZsb2F0IHdpZCA9IHRsLm1lYXN1cmUob2Zmc2V0IC0gc3RhcnQsIHRyYWlsaW5nLCBudWxsKTsKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CiAKLSAgICAgICAgaWYgKG9mZnNldCA+IGVuZCkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICB3aWQgLT0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgZW5kLCBvZmZzZXQsIG51bGwsIHRhYiwgdGFicyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgd2lkICs9IG1lYXN1cmVUZXh0KG1QYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIGVuZCwgb2Zmc2V0LCBudWxsLCB0YWIsIHRhYnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQWxpZ25tZW50IGFsaWduID0gZ2V0UGFyYWdyYXBoQWxpZ25tZW50KGxpbmUpOwogICAgICAgICBpbnQgbGVmdCA9IGdldFBhcmFncmFwaExlZnQobGluZSk7CiAgICAgICAgIGludCByaWdodCA9IGdldFBhcmFncmFwaFJpZ2h0KGxpbmUpOwogCi0gICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fTk9STUFMKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHdpZDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IG1heCA9IGdldExpbmVNYXgobGluZSk7Ci0KLSAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIG1heCArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQgLSBtYXggKyB3aWQ7Ci0gICAgICAgIH0gZWxzZSB7IC8qIGFsaWduID09IEFsaWdubWVudC5BTElHTl9DRU5URVIgKi8KLSAgICAgICAgICAgIGludCBpbWF4ID0gKChpbnQpIG1heCkgJiB+MTsKLQotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQgLSAoKChyaWdodCAtIGxlZnQpIC0gaW1heCkgLyAyKSArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArICgocmlnaHQgLSBsZWZ0KSAtIGltYXgpIC8gMiArIHdpZDsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0TGluZVN0YXJ0UG9zKGxpbmUsIGxlZnQsIHJpZ2h0KSArIHdpZDsKICAgICB9CiAKICAgICAvKioKQEAgLTY1NiwzOCArNzg1LDc2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBleGNsdWRpbmcKLSAgICAgKiB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAqIEdldHMgdGhlIHVuc2lnbmVkIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgaW5jbHVkaW5nCisgICAgICogbGVhZGluZyBtYXJnaW4gaW5kZW50LCBidXQgZXhjbHVkaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldExpbmVNYXgoaW50IGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIGdldExpbmVNYXgobGluZSwgbnVsbCwgZmFsc2UpOworICAgICAgICBmbG9hdCBtYXJnaW4gPSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOworICAgICAgICBmbG9hdCBzaWduZWRFeHRlbnQgPSBnZXRMaW5lRXh0ZW50KGxpbmUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbiArIHNpZ25lZEV4dGVudCA+PSAwID8gc2lnbmVkRXh0ZW50IDogLXNpZ25lZEV4dGVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGluY2x1ZGluZwotICAgICAqIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogR2V0cyB0aGUgdW5zaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBpbmNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbiBpbmRlbnQgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldExpbmVXaWR0aChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gZ2V0TGluZU1heChsaW5lLCBudWxsLCB0cnVlKTsKKyAgICAgICAgZmxvYXQgbWFyZ2luID0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKKyAgICAgICAgZmxvYXQgc2lnbmVkRXh0ZW50ID0gZ2V0TGluZUV4dGVudChsaW5lLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbiArIHNpZ25lZEV4dGVudCA+PSAwID8gc2lnbmVkRXh0ZW50IDogLXNpZ25lZEV4dGVudDsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldExpbmVNYXgoaW50IGxpbmUsIE9iamVjdFtdIHRhYnMsIGJvb2xlYW4gZnVsbCkgeworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNnZXRMaW5lRXh0ZW50KGludCxUYWJTdG9wcyxib29sZWFuKX0gYnV0IGRldGVybWluZXMgdGhlCisgICAgICogdGFiIHN0b3BzIGluc3RlYWQgb2YgdXNpbmcgdGhlIG9uZXMgcGFzc2VkIGluLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBpbmRleCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmdWxsIHdoZXRoZXIgdG8gaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICogQHJldHVybiB0aGUgZXh0ZW50IG9mIHRoZSBsaW5lCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBnZXRMaW5lRXh0ZW50KGludCBsaW5lLCBib29sZWFuIGZ1bGwpIHsKICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kOworICAgICAgICBpbnQgZW5kID0gZnVsbCA/IGdldExpbmVFbmQobGluZSkgOiBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKIAotICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVuZCA9IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOwotICAgICAgICB9IAotICAgICAgICBib29sZWFuIHRhYiA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKLQotICAgICAgICBpZiAodGFicyA9PSBudWxsICYmIHRhYiAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgIGJvb2xlYW4gaGFzVGFic09yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgaWYgKGhhc1RhYnNPckVtb2ppICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgLy8gSnVzdCBjaGVja2luZyB0aGlzIGxpbmUgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLCB0YWJzIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYWxsIGxpbmVzIGluIGEgcGFyYWdyYXBoLgorICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIG1UZXh0LCBzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFicyk7IC8vIFhYWCBzaG91bGQgcmV1c2UKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKIAotICAgICAgICByZXR1cm4gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIHN0YXJ0LCBlbmQsIG51bGwsIHRhYiwgdGFicyk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYnNPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgIGZsb2F0IHdpZHRoID0gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBleGNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbi4gIElmIGZ1bGwgaXMgZmFsc2UsIGV4Y2x1ZGVzIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWIgc3RvcHMsIGNhbiBiZSBudWxsIGlmIHdlIGtub3cgdGhleSdyZSBub3QgdXNlZC4KKyAgICAgKiBAcGFyYW0gZnVsbCB3aGV0aGVyIHRvIGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAqIEByZXR1cm4gdGhlIGV4dGVudCBvZiB0aGUgdGV4dCBvbiB0aGlzIGxpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGdldExpbmVFeHRlbnQoaW50IGxpbmUsIFRhYlN0b3BzIHRhYlN0b3BzLCBib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgZW5kID0gZnVsbCA/IGdldExpbmVFbmQobGluZSkgOiBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJzT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFic09yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzM4LDcgKzkwNSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjZmllZCBsaW5lIHdob3NlIHBvc2l0aW9uIGlzCisgICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjaWZpZWQgbGluZSB3aG9zZSBwb3NpdGlvbiBpcwogICAgICAqIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZCBob3Jpem9udGFsIHBvc2l0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChpbnQgbGluZSwgZmxvYXQgaG9yaXopIHsKQEAgLTc0OSwyMCArOTE2LDE2IEBACiAgICAgICAgIGlmIChsaW5lID09IGdldExpbmVDb3VudCgpIC0gMSkKICAgICAgICAgICAgIG1heCsrOwogCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIG1heCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGdldExpbmVFbmQobGluZSkpOwotCiAgICAgICAgIGludCBiZXN0ID0gbWluOwogICAgICAgICBmbG9hdCBiZXN0ZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKGJlc3QpIC0gaG9yaXopOwogCi0gICAgICAgIGludCBoZXJlID0gbWluOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaW50IHN3YXAgPSAoKGkgJiAxKSA9PSAwKSA/IDEgOiAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgaGVyZSA9IG1pbiArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpbnQgc3dhcCA9IChkaXJzLm1EaXJlY3Rpb25zW2krMV0gJiBSVU5fUlRMX0ZMQUcpICE9IDAgPyAtMSA6IDE7CiAKICAgICAgICAgICAgIGlmICh0aGVyZSA+IG1heCkKICAgICAgICAgICAgICAgICB0aGVyZSA9IG1heDsKLQogICAgICAgICAgICAgaW50IGhpZ2ggPSB0aGVyZSAtIDEgKyAxLCBsb3cgPSBoZXJlICsgMSAtIDEsIGd1ZXNzOwogCiAgICAgICAgICAgICB3aGlsZSAoaGlnaCAtIGxvdyA+IDEpIHsKQEAgLTc5NSw3ICs5NTgsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBiZXN0ZGlzdCkgewogICAgICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7ICAgCisgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04MDUsOCArOTY4LDYgQEAKICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7CiAgICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogCiAgICAgICAgIGZsb2F0IGRpc3QgPSBNYXRoLmFicyhnZXRQcmltYXJ5SG9yaXpvbnRhbChtYXgpIC0gaG9yaXopOwpAQCAtODI2LDE5ICs5ODcsMTUgQEAKICAgICAgICAgcmV0dXJuIGdldExpbmVTdGFydChsaW5lICsgMSk7CiAgICAgfQogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgYWZ0ZXIgdGhlIGxhc3QgdmlzaWJsZSBjaGFyYWN0ZXIgKHNvIHdoaXRlc3BhY2UKICAgICAgKiBpcyBub3QgY291bnRlZCkgb24gdGhlIHNwZWNpZmllZCBsaW5lLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVZpc2libGVFbmQoaW50IGxpbmUpIHsKICAgICAgICAgcmV0dXJuIGdldExpbmVWaXNpYmxlRW5kKGxpbmUsIGdldExpbmVTdGFydChsaW5lKSwgZ2V0TGluZVN0YXJ0KGxpbmUrMSkpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRMaW5lVmlzaWJsZUVuZChpbnQgbGluZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZ2V0TGluZVN0YXJ0KGxpbmUpID09IHN0YXJ0ICYmIGdldExpbmVTdGFydChsaW5lKzEpID09IGVuZCk7Ci0gICAgICAgIH0KIAorICAgIHByaXZhdGUgaW50IGdldExpbmVWaXNpYmxlRW5kKGludCBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBtVGV4dDsKICAgICAgICAgY2hhciBjaDsKICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKSB7CkBAIC04ODUsMjA3ICsxMDQyLDYyIEBACiAgICAgICAgIHJldHVybiBnZXRMaW5lVG9wKGxpbmUpIC0gKGdldExpbmVUb3AobGluZSsxKSAtIGdldExpbmVEZXNjZW50KGxpbmUpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgbGVmdAotICAgICAqIChwb3NzaWJseSBvbnRvIGFub3RoZXIgbGluZSkgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldFRvTGVmdE9mKGludCBvZmZzZXQpIHsKLSAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7Ci0gICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7Ci0gICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwotCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIGVuZCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGVuZCk7Ci0KLSAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwotCi0gICAgICAgIGludCBiZXN0ID0gb2Zmc2V0OwotICAgICAgICBmbG9hdCBiZXN0aCA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgICAgICBpbnQgY2FuZGlkYXRlOwotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kKQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kOwotCi0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoaGVyZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCB0aGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotCi0gICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICBiZXN0ID0gZW5kOwotICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlc3QgIT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0KLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQotICAgICAgICBpZiAoZGlyID4gMCkgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgMTAwMDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCAxMDAwMCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldE9mZnNldFRvTGVmdFJpZ2h0T2Yob2Zmc2V0LCB0cnVlKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgcmlnaHQKLSAgICAgKiAocG9zc2libHkgb250byBhbm90aGVyIGxpbmUpIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXRUb1JpZ2h0T2YoaW50IG9mZnNldCkgewotICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKLSAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIHJldHVybiBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKG9mZnNldCwgZmFsc2UpOworICAgIH0KIAotICAgICAgICBpZiAobGluZSAhPSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICBlbmQgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBlbmQpOworICAgIHByaXZhdGUgaW50IGdldE9mZnNldFRvTGVmdFJpZ2h0T2YoaW50IGNhcmV0LCBib29sZWFuIHRvTGVmdCkgeworICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQoY2FyZXQpOworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGludCBsaW5lRGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwogCi0gICAgICAgIGZsb2F0IGhvcml6ID0gZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KTsKLQotICAgICAgICBpbnQgYmVzdCA9IG9mZnNldDsKLSAgICAgICAgZmxvYXQgYmVzdGggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgaW50IGNhbmRpZGF0ZTsKLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZDsKLQotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGhlcmUpOwotCi0gICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBoZXJlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOworICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gKGxpbmVEaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpOworICAgICAgICBpZiAoY2FyZXQgPT0gKGFkdmFuY2UgPyBsaW5lRW5kIDogbGluZVN0YXJ0KSkgeworICAgICAgICAgICAgLy8gd2Fsa2luZyBvZmYgbGluZSwgc28gbG9vayBhdCB0aGUgbGluZSB3ZSdyZSBoZWFkZWQgdG8KKyAgICAgICAgICAgIGlmIChjYXJldCA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLS1saW5lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXJldDsgLy8gYXQgdmVyeSBzdGFydCwgZG9uJ3QgbW92ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPCBnZXRMaW5lQ291bnQoKSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsaW5lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXJldDsgLy8gYXQgdmVyeSBlbmQsIGRvbid0IG1vdmUKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIHRoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVTdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgICAgIGxpbmVFbmQgPSBnZXRMaW5lRW5kKGxpbmUpOworICAgICAgICAgICAgaW50IG5ld0RpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKyAgICAgICAgICAgIGlmIChuZXdEaXIgIT0gbGluZURpcikgeworICAgICAgICAgICAgICAgIC8vIHVudXN1YWwgY2FzZS4gIHdlIHdhbnQgdG8gd2FsayBvbnRvIHRoZSBsaW5lLCBidXQgaXQgcnVucworICAgICAgICAgICAgICAgIC8vIGluIGEgZGlmZmVyZW50IGRpcmVjdGlvbiB0aGFuIHRoaXMgb25lLCBzbyB3ZSBmYWtlIG1vdmVtZW50CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICB0b0xlZnQgPSAhdG9MZWZ0OworICAgICAgICAgICAgICAgIGxpbmVEaXIgPSBuZXdEaXI7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKIAotICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgYmVzdCA9IGVuZDsKLSAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiZXN0ICE9IG9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBiZXN0OwotCi0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KLSAgICAgICAgaWYgKGRpciA+IDApIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lICsgMSwgLTEwMDAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE9mZnNldEZvckhvcml6b250YWwobGluZSAtIDEsIC0xMDAwMCk7Ci0gICAgICAgIH0KKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgLy8gWFhYOiB3ZSBkb24ndCBjYXJlIGFib3V0IHRhYnMKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIGxpbmVTdGFydCwgbGluZUVuZCwgbGluZURpciwgZGlyZWN0aW9ucywgZmFsc2UsIG51bGwpOworICAgICAgICBjYXJldCA9IGxpbmVTdGFydCArIHRsLmdldE9mZnNldFRvTGVmdFJpZ2h0T2YoY2FyZXQgLSBsaW5lU3RhcnQsIHRvTGVmdCk7CisgICAgICAgIHRsID0gVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgIHJldHVybiBjYXJldDsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXRPZmZzZXRBdFN0YXJ0T2YoaW50IG9mZnNldCkgeworICAgICAgICAvLyBYWFggdGhpcyBwcm9iYWJseSBzaG91bGQgc2tpcCBsb2NhbCByZW9yZGVyaW5ncyBhbmQKKyAgICAgICAgLy8gemVyby13aWR0aCBjaGFyYWN0ZXJzLCBsb29rIGF0IGNhbGxlcnMKICAgICAgICAgaWYgKG9mZnNldCA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTExMTgsNyArMTEzMCw3IEBACiAgICAgLyoqCiAgICAgICogRmlsbHMgaW4gdGhlIHNwZWNpZmllZCBQYXRoIHdpdGggYSByZXByZXNlbnRhdGlvbiBvZiBhIGN1cnNvcgogICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiAgVGhpcyB3aWxsIG9mdGVuIGJlIGEgdmVydGljYWwgbGluZQotICAgICAqIGJ1dCBjYW4gYmUgbXVsdGlwbGUgZGlzY29udGlub3VzIGxpbmVzIGluIHRleHQgd2l0aCBtdWx0aXBsZQorICAgICAqIGJ1dCBjYW4gYmUgbXVsdGlwbGUgZGlzY29udGludW91cyBsaW5lcyBpbiB0ZXh0IHdpdGggbXVsdGlwbGUKICAgICAgKiBkaXJlY3Rpb25hbGl0aWVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldEN1cnNvclBhdGgoaW50IHBvaW50LCBQYXRoIGRlc3QsCkBAIC0xMTMwLDcgKzExNDIsOCBAQAogICAgICAgICBpbnQgYm90dG9tID0gZ2V0TGluZVRvcChsaW5lKzEpOwogCiAgICAgICAgIGZsb2F0IGgxID0gZ2V0UHJpbWFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZjsKLSAgICAgICAgZmxvYXQgaDIgPSBnZXRTZWNvbmRhcnlIb3Jpem9udGFsKHBvaW50KSAtIDAuNWY7CisgICAgICAgIGZsb2F0IGgyID0gaXNMZXZlbEJvdW5kYXJ5KHBvaW50KSA/CisgICAgICAgICAgICAgICAgICAgIGdldFNlY29uZGFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZiA6IGgxOwogCiAgICAgICAgIGludCBjYXBzID0gVGV4dEtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShlZGl0aW5nQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuTUVUQV9TSElGVF9PTikgfApAQCAtMTIwNyw5ICsxMjIwLDEwIEBACiAgICAgICAgIGlmIChsaW5lZW5kID4gbGluZXN0YXJ0ICYmIG1UZXh0LmNoYXJBdChsaW5lZW5kIC0gMSkgPT0gJ1xuJykKICAgICAgICAgICAgIGxpbmVlbmQtLTsKIAotICAgICAgICBpbnQgaGVyZSA9IGxpbmVzdGFydDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgaGVyZSA9IGxpbmVzdGFydCArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisKICAgICAgICAgICAgIGlmICh0aGVyZSA+IGxpbmVlbmQpCiAgICAgICAgICAgICAgICAgdGhlcmUgPSBsaW5lZW5kOwogCkBAIC0xMjE4LDE0ICsxMjMyLDEyIEBACiAgICAgICAgICAgICAgICAgaW50IGVuID0gTWF0aC5taW4oZW5kLCB0aGVyZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoc3QgIT0gZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDEgPSBnZXRIb3Jpem9udGFsKHN0LCBmYWxzZSwgZmFsc2UsIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMiA9IGdldEhvcml6b250YWwoZW4sIHRydWUsIGZhbHNlLCBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDEgPSBnZXRIb3Jpem9udGFsKHN0LCBmYWxzZSwgbGluZSk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGgyID0gZ2V0SG9yaXpvbnRhbChlbiwgdHJ1ZSwgbGluZSk7CiAKICAgICAgICAgICAgICAgICAgICAgZGVzdC5hZGRSZWN0KGgxLCB0b3AsIGgyLCBib3R0b20sIFBhdGguRGlyZWN0aW9uLkNXKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI2MCw3ICsxMjcyLDcgQEAKIAogICAgICAgICAgICAgYWRkU2VsZWN0aW9uKHN0YXJ0bGluZSwgc3RhcnQsIGdldExpbmVFbmQoc3RhcnRsaW5lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIGdldExpbmVCb3R0b20oc3RhcnRsaW5lKSwgZGVzdCk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKGdldFBhcmFncmFwaERpcmVjdGlvbihzdGFydGxpbmUpID09IERJUl9SSUdIVF9UT19MRUZUKQogICAgICAgICAgICAgICAgIGRlc3QuYWRkUmVjdChnZXRMaW5lTGVmdChzdGFydGxpbmUpLCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBnZXRMaW5lQm90dG9tKHN0YXJ0bGluZSksIFBhdGguRGlyZWN0aW9uLkNXKTsKQEAgLTEyOTYsNyArMTMwOCw3IEBACiAKICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewogICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBtVGV4dDsKLSAgICAgICAgICAgIEFsaWdubWVudFNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKKyAgICAgICAgICAgIEFsaWdubWVudFNwYW5bXSBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwLCBnZXRMaW5lU3RhcnQobGluZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lRW5kKGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50U3Bhbi5jbGFzcyk7CiAKQEAgLTEzMTMsNDIzICsxMzI1LDE3MyBAQAogICAgICAqIEdldCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYWdyYXBoLCBpbnNldCBieSBsZWZ0IG1hcmdpbnMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQYXJhZ3JhcGhMZWZ0KGludCBsaW5lKSB7Ci0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KICAgICAgICAgaW50IGxlZnQgPSAwOwotCi0gICAgICAgIGJvb2xlYW4gcGFyID0gZmFsc2U7Ci0gICAgICAgIGludCBvZmYgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGlmIChvZmYgPT0gMCB8fCBtVGV4dC5jaGFyQXQob2ZmIC0gMSkgPT0gJ1xuJykKLSAgICAgICAgICAgIHBhciA9IHRydWU7Ci0KLSAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgbVRleHQ7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZUVuZChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1hcmdpbiA9IHBhcjsKLSAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gc3BhbiA9IHNwYW5zW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpc3BhbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gY291bnQgPj0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IHNwYW4uZ2V0TGVhZGluZ01hcmdpbihtYXJnaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKyAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCB8fCAhbVNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gbGVmdDsgLy8gbGVhZGluZyBtYXJnaW4gaGFzIG5vIGltcGFjdCwgb3Igbm8gc3R5bGVzCiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgcmV0dXJuIGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4obGluZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYWdyYXBoLCBpbnNldCBieSByaWdodCBtYXJnaW5zLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFyYWdyYXBoUmlnaHQoaW50IGxpbmUpIHsKLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQogICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXIgPSBmYWxzZTsKLSAgICAgICAgaW50IG9mZiA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaWYgKG9mZiA9PSAwIHx8IG1UZXh0LmNoYXJBdChvZmYgLSAxKSA9PSAnXG4nKQotICAgICAgICAgICAgcGFyID0gdHJ1ZTsKLQotCi0gICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQpIHsKLSAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIG1UZXh0OwotICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucyhnZXRMaW5lU3RhcnQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVFbmQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQgLT0gc3BhbnNbaV0uZ2V0TGVhZGluZ01hcmdpbihwYXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKyAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCB8fCAhbVNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gcmlnaHQ7IC8vIGxlYWRpbmcgbWFyZ2luIGhhcyBubyBpbXBhY3QsIG9yIG5vIHN0eWxlcwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJpZ2h0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIERpcmVjdGlvbnMgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gcGFyc3BhbnMpIHsKLSAgICAgICAgY2hhcltdIGJ1ZjsKLSAgICAgICAgaWYgKCFoYXNUYWJzKSB7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9ucyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKERJUl9MRUZUX1RPX1JJR0hUID09IGRpcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0eWxlZC5kcmF3VGV4dChjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZmFsc2UsIHgsIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBoID0gMDsKLQotICAgICAgICBpbnQgaGVyZSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aW9ucy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcmVjdGlvbnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpZiAodGhlcmUgPiBlbmQgLSBzdGFydCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBoZXJlOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGhhc1RhYnMgPyBoZXJlIDogdGhlcmU7IGogPD0gdGhlcmU7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChqID09IHRoZXJlIHx8IGJ1ZltqXSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGggKz0gU3R5bGVkLmRyYXdUZXh0KGNhbnZhcywgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIChpICYgMSkgIT0gMCwgeCArIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGogIT0gZW5kKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSB0aGVyZSAmJiBidWZbal0gPT0gJ1x0JykKLSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBkaXIgKiBuZXh0VGFiKHRleHQsIHN0YXJ0LCBlbmQsIGggKiBkaXIsIHBhcnNwYW5zKTsKLQotICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzVGFicyAmJiBidWZbal0gPj0gMHhEODAwICYmIGJ1ZltqXSA8PSAweERGRkYgJiYgaiArIDEgPCB0aGVyZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoYnVmLCBqKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamkgPj0gTUlOX0VNT0pJICYmIGVtb2ppIDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gRU1PSklfRkFDVE9SWS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShlbW9qaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQuZHJhd1RleHQoY2FudmFzLCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIHN0YXJ0ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIChpICYgMSkgIT0gMCwgeCArIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBqICE9IGVuZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtb2ppUmVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbW9qaVJlY3QgPSBuZXcgUmVjdEYoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBqLCBzdGFydCArIGogKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiaXRtYXBIZWlnaHQgPSBibS5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0SGVpZ2h0ID0gLXdvcmtQYWludC5hc2NlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IHRleHRIZWlnaHQgLyBiaXRtYXBIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBibS5nZXRXaWR0aCgpICogc2NhbGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW1vamlSZWN0LnNldCh4ICsgaCwgeSAtIHRleHRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIGggKyB3aWR0aCwgeSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChibSwgbnVsbCwgbUVtb2ppUmVjdCwgcGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IG1lYXN1cmVUZXh0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IG9mZnNldCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0cmFpbGluZywgYm9vbGVhbiBhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSB0YWJzKSB7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBudWxsOwotCi0gICAgICAgIGlmIChoYXNUYWJzKSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgaCA9IDA7Ci0KLSAgICAgICAgaWYgKGFsdCkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICB0cmFpbGluZyA9ICF0cmFpbGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBoZXJlID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYWx0KQotICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOwotCi0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlyZWN0aW9ucy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCAtIHN0YXJ0KQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGludCBzZWdzdGFydCA9IGhlcmU7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaGFzVGFicyA/IGhlcmUgOiB0aGVyZTsgaiA8PSB0aGVyZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGVwdCA9IDA7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmIChoYXNUYWJzICYmIGogPCB0aGVyZSkgewotICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBidWZbal07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSAweEQ4MDAgJiYgY29kZXB0IDw9IDB4REZGRiAmJiBqICsgMSA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTUlOX0VNT0pJICYmIGNvZGVwdCA8PSBNQVhfRU1PSkkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gRU1PSklfRkFDVE9SWS5nZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShjb2RlcHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGogPT0gdGhlcmUgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBzZWd3OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBzdGFydCArIGogfHwKLSAgICAgICAgICAgICAgICAgICAgICAgKHRyYWlsaW5nICYmIG9mZnNldCA8PSBzdGFydCArIGopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUICYmIChpICYgMSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUICYmIChpICYgMSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2VndyA9IFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIHN0YXJ0ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgc3RhcnQgKyBqIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAodHJhaWxpbmcgJiYgb2Zmc2V0IDw9IHN0YXJ0ICsgaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHNlZ3cgLSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gc2VndyAtIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gc2VndzsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBzZWd3OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJ1ZltqXSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHN0YXJ0ICsgaikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGRpciAqIG5leHRUYWIodGV4dCwgc3RhcnQsIGVuZCwgaCAqIGRpciwgdGFicyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSB0aGVyZSAmJiBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHN0YXJ0ICsgaikgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGogKyAyLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13b3JrUGFpbnQuYXNjZW50KCkgLyBibS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHdpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgcmV0dXJuIHJpZ2h0IC0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNZWFzdXJlIHdpZHRoIG9mIGEgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSB0aGF0IGlzIGtub3duIHRvIGFsbCBiZQotICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGUgcGFyYWdyYXBoIGJhc2UgZGlyZWN0aW9uLiBSZXR1cm5zIHRoZSB3aWR0aCwKLSAgICAgKiBhbmQgdGhlIGxpbmUgbWV0cmljcyBpbiBmbSBpZiBmbSBpcyBub3QgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQgZm9yIHRoZSB0ZXh0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgcGFpbnQgYXZhaWxhYmxlIGZvciBtb2RpZmljYXRpb24KLSAgICAgKiBAcGFyYW0gdGV4dCB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIHRoZSBsaW5lCi0gICAgICogQHBhcmFtIGVuZCBsaW1pdCBvZiB0aGUgbGluZQotICAgICAqIEBwYXJhbSBmbSBvYmplY3QgdG8gcmV0dXJuIGludGVnZXIgbWV0cmljcyBpbiwgY2FuIGJlIG51bGwKLSAgICAgKiBAcGFyYW0gaGFzVGFicyB0cnVlIGlmIGl0IGlzIGtub3duIHRoYXQgdGhlIGxpbmUgaGFzIHRhYnMKLSAgICAgKiBAcGFyYW0gdGFicyB0YWIgcG9zaXRpb24gaW5mb3JtYXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgdGV4dCBmcm9tIHN0YXJ0IHRvIGVuZAorICAgICAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBsZWFkaW5nIG1hcmdpbiAodW5zaWduZWQpIGZvciB0aGlzIGxpbmUsCisgICAgICogdGFraW5nIGludG8gYWNjb3VudCBMZWFkaW5nTWFyZ2luU3BhbiBhbmQgTGVhZGluZ01hcmdpblNwYW4yLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGluZGV4CisgICAgICogQHJldHVybiB0aGUgbGVhZGluZyBtYXJnaW4gb2YgdGhpcyBsaW5lCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gdGFicykgewotICAgICAgICBjaGFyW10gYnVmID0gbnVsbDsKLSAgCi0gICAgICAgIGlmIChoYXNUYWJzKSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgIHByaXZhdGUgaW50IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4oaW50IGxpbmUpIHsKKyAgICAgICAgaWYgKCFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSBtVGV4dDsKKworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obGluZVN0YXJ0LCBsaW5lRW5kLAorICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIGxpbmVTdGFydCwgc3BhbkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsgLy8gbm8gbGVhZGluZyBtYXJnaW4gc3BhbjsKICAgICAgICAgfQogCi0gICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IG1hcmdpbiA9IDA7CiAKLSAgICAgICAgaW50IGxhc3RQb3MgPSAwOwotICAgICAgICBmbG9hdCB3aWR0aCA9IDA7Ci0gICAgICAgIGludCBhc2NlbnQgPSAwLCBkZXNjZW50ID0gMCwgdG9wID0gMCwgYm90dG9tID0gMDsKKyAgICAgICAgYm9vbGVhbiBpc0ZpcnN0UGFyYUxpbmUgPSBsaW5lU3RhcnQgPT0gMCB8fAorICAgICAgICAgICAgc3Bhbm5lZC5jaGFyQXQobGluZVN0YXJ0IC0gMSkgPT0gJ1xuJzsKIAotICAgICAgICBpZiAoZm0gIT0gbnVsbCkgewotICAgICAgICAgICAgZm0uYXNjZW50ID0gMDsKLSAgICAgICAgICAgIGZtLmRlc2NlbnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgcG9zID0gaGFzVGFicyA/IDAgOiBsZW47IHBvcyA8PSBsZW47IHBvcysrKSB7Ci0gICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKLSAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChoYXNUYWJzICYmIHBvcyA8IGxlbikgewotICAgICAgICAgICAgICAgIGNvZGVwdCA9IGJ1Zltwb3NdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBzcGFuID0gc3BhbnNbaV07CisgICAgICAgICAgICBib29sZWFuIHVzZUZpcnN0TGluZU1hcmdpbiA9IGlzRmlyc3RQYXJhTGluZTsKKyAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgaW50IHNwU3RhcnQgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BhbkxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwU3RhcnQpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4yKXNwYW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICB1c2VGaXJzdExpbmVNYXJnaW4gPSBsaW5lIDwgc3BhbkxpbmUgKyBjb3VudDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcmdpbiArPSBzcGFuLmdldExlYWRpbmdNYXJnaW4odXNlRmlyc3RMaW5lTWFyZ2luKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4RDgwMCAmJiBjb2RlcHQgPD0gMHhERkZGICYmIHBvcyA8IGxlbikgewotICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIHBvcyk7CisgICAgICAgIHJldHVybiBtYXJnaW47CisgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBNSU5fRU1PSkkgJiYgY29kZXB0IDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICBibSA9IEVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGZsb2F0IG1lYXN1cmVQYXJhKFRleHRQYWludCBwYWludCwgVGV4dFBhaW50IHdvcmtQYWludCwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKworICAgICAgICBNZWFzdXJlZFRleHQgbXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtdC5zZXRQYXJhKHRleHQsIHN0YXJ0LCBlbmQsIERJUl9SRVFVRVNUX0xUUik7CisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnM7CisgICAgICAgICAgICBpbnQgZGlyOworICAgICAgICAgICAgaWYgKG10Lm1FYXN5KSB7CisgICAgICAgICAgICAgICAgZGlyZWN0aW9ucyA9IERJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICAgICAgZGlyID0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhtdC5tRGlyLCBtdC5tTGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAwLCBtdC5tQ2hhcnMsIDAsIG10Lm1MZW4pOworICAgICAgICAgICAgICAgIGRpciA9IG10Lm1EaXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtdC5tQ2hhcnM7CisgICAgICAgICAgICBpbnQgbGVuID0gbXQubUxlbjsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicyA9IGZhbHNlOworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpXSA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1RhYnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgc3RhcnQsIHNwYW5FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRsLnNldChwYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJzLCB0YWJTdG9wcyk7CisgICAgICAgICAgICByZXR1cm4gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUobXQpOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICBpZiAocG9zID09IGxlbiB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgVGFiU3RvcHMgeworICAgICAgICBwcml2YXRlIGludFtdIG1TdG9wczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bVN0b3BzOworICAgICAgICBwcml2YXRlIGludCBtSW5jcmVtZW50OwogCi0gICAgICAgICAgICAgICAgd2lkdGggKz0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBsYXN0UG9zLCBzdGFydCArIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSk7CisgICAgICAgIFRhYlN0b3BzKGludCBpbmNyZW1lbnQsIE9iamVjdFtdIHNwYW5zKSB7CisgICAgICAgICAgICByZXNldChpbmNyZW1lbnQsIHNwYW5zKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0udG9wICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgdm9pZCByZXNldChpbnQgaW5jcmVtZW50LCBPYmplY3RbXSBzcGFucykgeworICAgICAgICAgICAgdGhpcy5tSW5jcmVtZW50ID0gaW5jcmVtZW50OworCisgICAgICAgICAgICBpbnQgbnMgPSAwOworICAgICAgICAgICAgaWYgKHNwYW5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBzcGFucykgeworICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhYlN0b3BTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbmV3IGludFsxMF07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zID09IHN0b3BzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIG5zdG9wcyA9IG5ldyBpbnRbbnMgKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0b3BzW2ldID0gc3RvcHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbnN0b3BzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHNbbnMrK10gPSAoKFRhYlN0b3BTcGFuKSBvKS5nZXRUYWJTdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9zICE9IGxlbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoYm0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZW1vamksIG11c3QgaGF2ZSBoaXQgYSB0YWIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCB3aWR0aCwgdGFicyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNldHMgdXAgd29ya1BhaW50IHdpdGggdGhlIGZvbnQgb24gdGhlIGVtb2ppCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0LCBzbyB0aGF0IHdlIGNhbiBleHRyYWN0IHRoZSBhc2NlbnQgYW5kIHNjYWxlLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2FsbCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQgYmVjYXVzZSB0aGUgZW1vamkgbWlnaHQgaGF2ZSBpdHMgb3duIHN0eWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBpbml0aWFsaXplIHdvcmtQYWludCBoZXJlIGJlY2F1c2UgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGlzIHVuc3R5bGVkIG1lYXN1cmVUZXh0IG1pZ2h0IG5vdCB1c2Ugd29ya1BhaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBhbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgcG9zLCBzdGFydCArIHBvcyArIDEsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdvcmtQYWludC5hc2NlbnQoKSAvIGJtLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBoYWQgYW4gZW1vamksIHdlIGJ1bXAgcGFzdCB0aGUgc2Vjb25kIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdXJyb2dhdGUgcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5zID4gMSkgeworICAgICAgICAgICAgICAgICAgICBBcnJheXMuc29ydChzdG9wcywgMCwgbnMpOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5hc2NlbnQgPCBhc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzY2VudCA9IGZtLmFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm0uZGVzY2VudCA+IGRlc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbnQgPSBmbS5kZXNjZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLnRvcCA8IHRvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gZm0udG9wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5ib3R0b20gPiBib3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IGZtLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdGFrZSBiaXRtYXAgaGVpZ2h0IGludG8gYWNjb3VudCBoZXJlLAotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBzY2FsZWQgdG8gbWF0Y2ggdGhlIHRleHQgaGVpZ2h0LgorICAgICAgICAgICAgICAgIGlmIChzdG9wcyAhPSB0aGlzLm1TdG9wcykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm1TdG9wcyA9IHN0b3BzOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBwb3MgKyAxOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5tTnVtU3RvcHMgPSBuczsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmbS5hc2NlbnQgPSBhc2NlbnQ7Ci0gICAgICAgICAgICBmbS5kZXNjZW50ID0gZGVzY2VudDsKLSAgICAgICAgICAgIGZtLnRvcCA9IHRvcDsKLSAgICAgICAgICAgIGZtLmJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgZmxvYXQgbmV4dFRhYihmbG9hdCBoKSB7CisgICAgICAgICAgICBpbnQgbnMgPSB0aGlzLm1OdW1TdG9wczsKKyAgICAgICAgICAgIGlmIChucyA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcCA9IHN0b3BzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCA+IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5leHREZWZhdWx0U3RvcChoLCBtSW5jcmVtZW50KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbmV4dERlZmF1bHRTdG9wKGZsb2F0IGgsIGludCBpbmMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGludCkgKChoICsgaW5jKSAvIGluYykpICogaW5jOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzUxLDcgKzE1MTMsNyBAQAogCiAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewogICAgICAgICAgICAgaWYgKHRhYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIHRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIHRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICBhbGx0YWJzID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIApAQCAtMTc3OCw2ICsxNTQwLDM4IEBACiAgICAgICAgIHJldHVybiBtU3Bhbm5lZFRleHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2FtZSBhcyA8Y29kZT50ZXh0LmdldFNwYW5zKCk8L2NvZGU+LCBleGNlcHQgd2hlcmUKKyAgICAgKiA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4gYXJlIHRoZSBzYW1lIGFuZCBhcmUgbm90CisgICAgICogYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LCBpbiB3aGljaCBjYXNlIGFuIGVtcHR5IGFycmF5CisgICAgICogaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBzcGVjaWFsIGNhc2UgdGhhdCA8Y29kZT5nZXRTcGFucygpPC9jb2RlPgorICAgICAqIG9uIGFuIGVtcHR5IHJhbmdlIHJldHVybnMgdGhlIHNwYW5zIGFkamFjZW50IHRvIHRoYXQgcmFuZ2UsIHdoaWNoIGlzCisgICAgICogcHJpbWFyaWx5IGZvciB0aGUgc2FrZSBvZiA8Y29kZT5UZXh0V2F0Y2hlcnM8L2NvZGU+IHNvIHRoZXkgd2lsbCBnZXQKKyAgICAgKiBub3RpZmljYXRpb25zIHdoZW4gdGV4dCBnb2VzIGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5LiAgQnV0IGl0IGFsc28KKyAgICAgKiBoYXMgdGhlIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IHRoYXQgaWYgdGhlIHRleHQgZW5kcyB3aXRoIGFuIGVtcHR5CisgICAgICogcGFyYWdyYXBoLCB0aGF0IHBhcmFncmFwaCBhY2NpZGVudGFsbHkgcGlja3MgdXAgdGhlIHN0eWxlcyBvZiB0aGUKKyAgICAgKiBwcmVjZWRpbmcgcGFyYWdyYXBoIChldmVuIHRob3VnaCB0aG9zZSBzdHlsZXMgd2lsbCBub3QgYmUgcGlja2VkIHVwCisgICAgICogYnkgbmV3IHRleHQgdGhhdCBpcyBpbnNlcnRlZCBpbnRvIHRoZSBlbXB0eSBwYXJhZ3JhcGgpLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZWFzb24gaXQganVzdCBjaGVja3Mgd2hldGhlciA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4KKyAgICAgKiBpcyB0aGUgc2FtZSBpcyB0aGF0IHRoZSBvbmx5IHRpbWUgYSBsaW5lIGNhbiBjb250YWluIDAgY2hhcmFjdGVycworICAgICAqIGlzIGlmIGl0IGlzIHRoZSBmaW5hbCBwYXJhZ3JhcGggb2YgdGhlIExheW91dDsgb3RoZXJ3aXNlIGFueSBsaW5lIHdpbGwKKyAgICAgKiBjb250YWluIGF0IGxlYXN0IG9uZSBwcmludGluZyBvciBuZXdsaW5lIGNoYXJhY3Rlci4gIFRoZSByZWFzb24gZm9yIHRoZQorICAgICAqIGFkZGl0aW9uYWwgY2hlY2sgaWYgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiAwIGlzIHRoYXQKKyAgICAgKiBpZiB0aGUgZW1wdHkgcGFyYWdyYXBoIGlzIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgYnVmZmVyLCBwYXJhZ3JhcGgKKyAgICAgKiBzdHlsZXMgdGhhdCBhcmUgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBidWZmZXIgd2lsbCBhcHBseSB0byB0ZXh0IHRoYXQKKyAgICAgKiBpcyBpbnNlcnRlZCBpbnRvIGl0LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIDxUPiBUW10gZ2V0UGFyYWdyYXBoU3BhbnMoU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCAmJiBzdGFydCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiAoVFtdKSBBcnJheVV0aWxzLmVtcHR5QXJyYXkodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCB0eXBlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZWxsaXBzaXplKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gZGVzdCwgaW50IGRlc3RvZmYpIHsKICAgICAgICAgaW50IGVsbGlwc2lzQ291bnQgPSBnZXRFbGxpcHNpc0NvdW50KGxpbmUpOwpAQCAtMTgwOCwyMyArMTYwMiwyMiBAQAogCiAgICAgLyoqCiAgICAgICogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGJpZGlyZWN0aW9uYWwgKGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkKLSAgICAgKiB0ZXh0IHdpdGhpbiB0aGUgbGF5b3V0IG9mIGEgbGluZS4gIFRPRE86IFRoaXMgd29yayBpcyBub3QgY29tcGxldGUKLSAgICAgKiBvciBjb3JyZWN0IGFuZCB3aWxsIGJlIGZsZXNoZWQgb3V0IGluIGEgbGF0ZXIgcmV2aXNpb24uCisgICAgICogdGV4dCB3aXRoaW4gdGhlIGxheW91dCBvZiBhIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEaXJlY3Rpb25zIHsKLSAgICAgICAgcHJpdmF0ZSBzaG9ydFtdIG1EaXJlY3Rpb25zOworICAgICAgICAvLyBEaXJlY3Rpb25zIHJlcHJlc2VudHMgZGlyZWN0aW9uYWwgcnVucyB3aXRoaW4gYSBsaW5lIG9mIHRleHQuCisgICAgICAgIC8vIFJ1bnMgYXJlIHBhaXJzIG9mIGludHMgbGlzdGVkIGluIHZpc3VhbCBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKKyAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4uICBUaGUgZmlyc3QgaW50IG9mIGVhY2ggcGFpciBpcyB0aGUgb2Zmc2V0IGZyb20KKyAgICAgICAgLy8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSB0byB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4gIFRoZQorICAgICAgICAvLyBzZWNvbmQgaW50IHJlcHJlc2VudHMgYm90aCB0aGUgbGVuZ3RoIGFuZCBsZXZlbCBvZiB0aGUgcnVuLgorICAgICAgICAvLyBUaGUgbGVuZ3RoIGlzIGluIHRoZSBsb3dlciBiaXRzLCBhY2Nlc3NlZCBieSBtYXNraW5nIHdpdGgKKyAgICAgICAgLy8gRElSX0xFTkdUSF9NQVNLLiAgVGhlIGxldmVsIGlzIGluIHRoZSBoaWdoZXIgYml0cywgYWNjZXNzZWQKKyAgICAgICAgLy8gYnkgc2hpZnRpbmcgYnkgRElSX0xFVkVMX1NISUZUIGFuZCBtYXNraW5nIGJ5IERJUl9MRVZFTF9NQVNLLgorICAgICAgICAvLyBUbyBzaW1wbHkgdGVzdCBmb3IgYW4gUlRMIGRpcmVjdGlvbiwgdGVzdCB0aGUgYml0IHVzaW5nCisgICAgICAgIC8vIERJUl9SVExfRkxBRywgaWYgc2V0IHRoZW4gdGhlIGRpcmVjdGlvbiBpcyBydGwuCiAKLSAgICAgICAgLy8gVGhlIHZhbHVlcyBpbiBtRGlyZWN0aW9ucyBhcmUgdGhlIG9mZnNldHMgZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAgICAgIC8vIGluIHRoZSBsaW5lIHRvIHRoZSBuZXh0IGZsaXAgaW4gZGlyZWN0aW9uLiAgUnVucyBhdCBldmVuIGluZGljZXMKLSAgICAgICAgLy8gYXJlIGxlZnQtdG8tcmlnaHQsIHRoZSBvdGhlcnMgYXJlIHJpZ2h0LXRvLWxlZnQuICBTbywgZm9yIGV4YW1wbGUsCi0gICAgICAgIC8vIGEgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGEgcmlnaHQtdG8tbGVmdCBydW4gaGFzIDAgYXQgbURpcmVjdGlvbnNbMF0sCi0gICAgICAgIC8vIHNpbmNlIHRoZSAnZmlyc3QnIChsdHIpIHJ1biBpcyB6ZXJvIGxlbmd0aC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIGNvZGUgY3VycmVudGx5IGFzc3VtZXMgdGhhdCBlYWNoIHJ1biBpcyBhZGphY2VudCB0byB0aGUgcHJldmlvdXMKLSAgICAgICAgLy8gb25lLCBwcm9ncmVzc2luZyBpbiB0aGUgYmFzZSBsaW5lIGRpcmVjdGlvbi4gIFRoaXMgaXNuJ3Qgc3VmZmljaWVudAotICAgICAgICAvLyB0byBoYW5kbGUgbmVzdGVkIHJ1bnMsIGZvciBleGFtcGxlIG51bWVyaWMgdGV4dCBpbiBhbiBydGwgY29udGV4dAotICAgICAgICAvLyBpbiBhbiBsdHIgcGFyYWdyYXBoLgotICAgICAgICAvKiBwYWNrYWdlICovIERpcmVjdGlvbnMoc2hvcnRbXSBkaXJzKSB7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gaW50W10gbURpcmVjdGlvbnM7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gRGlyZWN0aW9ucyhpbnRbXSBkaXJzKSB7CiAgICAgICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcnM7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODM1LDYgKzE2MjgsNyBAQAogICAgICAqIGxpbmUgaXMgZWxsaXBzaXplZCwgbm90IGdldExpbmVTdGFydCgpLikKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEVsbGlwc2lzU3RhcnQoaW50IGxpbmUpOworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgZWxsaXBzaXplZCBhd2F5LCBvciAwIGlmCiAgICAgICogbm8gZWxsaXBzaXMgaXMgdG8gdGFrZSBwbGFjZS4KQEAgLTE4NzQsNyArMTY2OCw3IEBACiAgICAgICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewogICAgICAgICAgICAgcmV0dXJuIG1UZXh0Lmxlbmd0aCgpOwogICAgICAgICB9Ci0gICAgCisKICAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgICAgIGNoYXJbXSBzID0gbmV3IGNoYXJbZW5kIC0gc3RhcnRdOwogICAgICAgICAgICAgZ2V0Q2hhcnMoc3RhcnQsIGVuZCwgcywgMCk7CkBAIC0xOTM1LDE3ICsxNzI5LDIyIEBACiAgICAgcHJpdmF0ZSBBbGlnbm1lbnQgbUFsaWdubWVudCA9IEFsaWdubWVudC5BTElHTl9OT1JNQUw7CiAgICAgcHJpdmF0ZSBmbG9hdCBtU3BhY2luZ011bHQ7CiAgICAgcHJpdmF0ZSBmbG9hdCBtU3BhY2luZ0FkZDsKLSAgICBwcml2YXRlIHN0YXRpYyBSZWN0IHNUZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdCBzVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3Bhbm5lZFRleHQ7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfTEVGVF9UT19SSUdIVCA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JJR0hUX1RPX0xFRlQgPSAtMTsKLSAgICAKKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9MVFIgPSAxOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9SVEwgPSAtMTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIgPSAyOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9ERUZBVUxUX1JUTCA9IC0yOwogCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRU5HVEhfTUFTSyA9IDB4MDNmZmZmZmY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9TSElGVCA9IDI2OworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfTUFTSyA9IDB4M2Y7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9SVExfRkxBRyA9IDEgPDwgUlVOX0xFVkVMX1NISUZUOworCiAgICAgcHVibGljIGVudW0gQWxpZ25tZW50IHsKICAgICAgICAgQUxJR05fTk9STUFMLAogICAgICAgICBBTElHTl9PUFBPU0lURSwKQEAgLTE5NTcsOCArMTc1Niw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9JTkNSRU1FTlQgPSAyMDsKIAogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfTEVGVF9UT19SSUdIVCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgc2hvcnRbXSB7IDMyNzY3IH0pOworICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfSk7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9SSUdIVF9UT19MRUZUID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMCwgMzI3NjcgfSk7Ci0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIHwgUlVOX1JUTF9GTEFHIH0pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2OTlmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEBoaWRlCisgKi8KK2NsYXNzIE1lYXN1cmVkVGV4dCB7CisgICAgLyogcGFja2FnZSAqLyBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgLyogcGFja2FnZSAqLyBpbnQgbVRleHRTdGFydDsKKyAgICAvKiBwYWNrYWdlICovIGZsb2F0W10gbVdpZHRoczsKKyAgICAvKiBwYWNrYWdlICovIGNoYXJbXSBtQ2hhcnM7CisgICAgLyogcGFja2FnZSAqLyBieXRlW10gbUxldmVsczsKKyAgICAvKiBwYWNrYWdlICovIGludCBtRGlyOworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBtRWFzeTsKKyAgICAvKiBwYWNrYWdlICovIGludCBtTGVuOworICAgIHByaXZhdGUgaW50IG1Qb3M7CisgICAgcHJpdmF0ZSBUZXh0UGFpbnQgbVdvcmtQYWludDsKKworICAgIHByaXZhdGUgTWVhc3VyZWRUZXh0KCkgeworICAgICAgICBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1lYXN1cmVkVGV4dFtdIGNhY2hlZCA9IG5ldyBNZWFzdXJlZFRleHRbM107CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIE1lYXN1cmVkVGV4dCBvYnRhaW4oKSB7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtdDsKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZWQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjYWNoZWQubGVuZ3RoOyAtLWkgPj0gMDspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbXQgPSBjYWNoZWRbaV07CisgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXQgPSBuZXcgTWVhc3VyZWRUZXh0KCk7CisgICAgICAgIExvZy5lKCJNRUFTIiwgIm5ldzogIiArIG10KTsKKyAgICAgICAgcmV0dXJuIG10OworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgTWVhc3VyZWRUZXh0IHJlY3ljbGUoTWVhc3VyZWRUZXh0IG10KSB7CisgICAgICAgIG10Lm1UZXh0ID0gbnVsbDsKKyAgICAgICAgaWYgKG10Lm1MZW4gPCAxMDAwKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQoY2FjaGVkKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZWQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBtdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuYWx5emVzIHRleHQgZm9yIGJpZGlyZWN0aW9uYWwgcnVucy4gIEFsbG9jYXRlcyB3b3JraW5nIGJ1ZmZlcnMuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLworICAgIHZvaWQgc2V0UGFyYShDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYmlkaVJlcXVlc3QpIHsKKyAgICAgICAgbVRleHQgPSB0ZXh0OworICAgICAgICBtVGV4dFN0YXJ0ID0gc3RhcnQ7CisKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBtTGVuID0gbGVuOworICAgICAgICBtUG9zID0gMDsKKworICAgICAgICBpZiAobVdpZHRocyA9PSBudWxsIHx8IG1XaWR0aHMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICBtV2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxGbG9hdEFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNoYXJzID09IG51bGwgfHwgbUNoYXJzLmxlbmd0aCA8IGxlbikgeworICAgICAgICAgICAgbUNoYXJzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUobGVuKV07CisgICAgICAgIH0KKyAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIG1DaGFycywgMCk7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSAoU3Bhbm5lZCkgdGV4dDsKKyAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbltdIHNwYW5zID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4uY2xhc3MpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0SW5QYXJhID0gc3Bhbm5lZC5nZXRTcGFuU3RhcnQoc3BhbnNbaV0pIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgaW50IGVuZEluUGFyYSA9IHNwYW5uZWQuZ2V0U3BhbkVuZChzcGFuc1tpXSkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gc3RhcnRJblBhcmE7IGogPCBlbmRJblBhcmE7IGorKykgeworICAgICAgICAgICAgICAgICAgICBtQ2hhcnNbal0gPSAnXHVGRkZDJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoVGV4dFV0aWxzLmRvZXNOb3ROZWVkQmlkaShtQ2hhcnMsIDAsIGxlbikpIHsKKyAgICAgICAgICAgIG1EaXIgPSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICBtRWFzeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobUxldmVscyA9PSBudWxsIHx8IG1MZXZlbHMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgbUxldmVscyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGxlbildOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURpciA9IEFuZHJvaWRCaWRpLmJpZGkoYmlkaVJlcXVlc3QsIG1DaGFycywgbUxldmVscywgbGVuLCBmYWxzZSk7CisgICAgICAgICAgICBtRWFzeSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgYWRkU3R5bGVSdW4oVGV4dFBhaW50IHBhaW50LCBpbnQgbGVuLCBQYWludC5Gb250TWV0cmljc0ludCBmbSkgeworICAgICAgICBpZiAoZm0gIT0gbnVsbCkgeworICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm0pOworICAgICAgICB9CisKKyAgICAgICAgaW50IHAgPSBtUG9zOworICAgICAgICBtUG9zID0gcCArIGxlbjsKKworICAgICAgICBpZiAobUVhc3kpIHsKKyAgICAgICAgICAgIGludCBmbGFncyA9IG1EaXIgPT0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUCisgICAgICAgICAgICAgICAgPyBDYW52YXMuRElSRUNUSU9OX0xUUiA6IENhbnZhcy5ESVJFQ1RJT05fUlRMOworICAgICAgICAgICAgcmV0dXJuIHBhaW50LmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHAsIGxlbiwgcCwgbGVuLCBmbGFncywgbVdpZHRocywgcCk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB0b3RhbEFkdmFuY2UgPSAwOworICAgICAgICBpbnQgbGV2ZWwgPSBtTGV2ZWxzW3BdOworICAgICAgICBmb3IgKGludCBxID0gcCwgaSA9IHAgKyAxLCBlID0gcCArIGxlbjs7ICsraSkgeworICAgICAgICAgICAgaWYgKGkgPT0gZSB8fCBtTGV2ZWxzW2ldICE9IGxldmVsKSB7CisgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gKGxldmVsICYgMHgxKSA9PSAwID8gQ2FudmFzLkRJUkVDVElPTl9MVFIgOiBDYW52YXMuRElSRUNUSU9OX1JUTDsKKyAgICAgICAgICAgICAgICB0b3RhbEFkdmFuY2UgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50LmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHEsIGkgLSBxLCBxLCBpIC0gcSwgZmxhZ3MsIG1XaWR0aHMsIHEpOworICAgICAgICAgICAgICAgIGlmIChpID09IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHEgPSBpOworICAgICAgICAgICAgICAgIGxldmVsID0gbUxldmVsc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxBZHZhbmNlOworICAgIH0KKworICAgIGZsb2F0IGFkZFN0eWxlUnVuKFRleHRQYWludCBwYWludCwgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zLCBpbnQgbGVuLAorICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0pIHsKKworICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50ID0gbVdvcmtQYWludDsKKyAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7CisgICAgICAgIC8vIFhYWCBwYWludCBzaG91bGQgbm90IGhhdmUgYSBiYXNlbGluZSBzaGlmdCwgYnV0Li4uCisgICAgICAgIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKKworICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tpXTsKKyAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdvcmtQYWludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB3aWQ7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB3aWQgPSBhZGRTdHlsZVJ1bih3b3JrUGFpbnQsIGxlbiwgZm0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXNlIG9yaWdpbmFsIHRleHQuICBTaG91bGRuJ3QgbWF0dGVyLgorICAgICAgICAgICAgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIG1UZXh0LCBtVGV4dFN0YXJ0ICsgbVBvcywKKyAgICAgICAgICAgICAgICAgICAgbVRleHRTdGFydCArIG1Qb3MgKyBsZW4sIGZtKTsKKyAgICAgICAgICAgIGZsb2F0W10gdyA9IG1XaWR0aHM7CisgICAgICAgICAgICB3W21Qb3NdID0gd2lkOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb3MgKyAxLCBlID0gbVBvcyArIGxlbjsgaSA8IGU7IGkrKykKKyAgICAgICAgICAgICAgICB3W2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAod29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPCAwKSB7CisgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgIGZtLnRvcCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICBmbS5ib3R0b20gKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd2lkOworICAgIH0KKworICAgIGludCBicmVha1RleHQoaW50IHN0YXJ0LCBpbnQgbGltaXQsIGJvb2xlYW4gZm9yd2FyZHMsIGZsb2F0IHdpZHRoKSB7CisgICAgICAgIGZsb2F0W10gdyA9IG1XaWR0aHM7CisgICAgICAgIGlmIChmb3J3YXJkcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGltaXQ7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICgod2lkdGggLT0gd1tpXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxpbWl0OyAtLWkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICAgICAgaWYgKCh3aWR0aCAtPSB3W2ldKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0IC0gaSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGltaXQgLSBzdGFydDsKKyAgICB9CisKKyAgICBmbG9hdCBtZWFzdXJlKGludCBzdGFydCwgaW50IGxpbWl0KSB7CisgICAgICAgIGZsb2F0IHdpZHRoID0gMDsKKyAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGltaXQ7ICsraSkgeworICAgICAgICAgICAgd2lkdGggKz0gd1tpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKaW5kZXggY2FhYWZhMS4uZmMwMWVmMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKQEAgLTE3LDggKzE3LDkgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CisKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CiAKQEAgLTMxMiwxMiArMzEzLDE1IEBACiAKICAgICAgICAgbW92ZUdhcFRvKGVuZCk7CiAKLSAgICAgICAgaWYgKHRiZW5kIC0gdGJzdGFydCA+PSBtR2FwTGVuZ3RoICsgKGVuZCAtIHN0YXJ0KSkKLSAgICAgICAgICAgIHJlc2l6ZUZvcihtVGV4dC5sZW5ndGggLSBtR2FwTGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICB0YmVuZCAtIHRic3RhcnQgLSAoZW5kIC0gc3RhcnQpKTsKKyAgICAgICAgLy8gQ2FuIGJlIG5lZ2F0aXZlCisgICAgICAgIGZpbmFsIGludCBuYk5ld0NoYXJzID0gKHRiZW5kIC0gdGJzdGFydCkgLSAoZW5kIC0gc3RhcnQpOwogCi0gICAgICAgIG1HYXBTdGFydCArPSB0YmVuZCAtIHRic3RhcnQgLSAoZW5kIC0gc3RhcnQpOwotICAgICAgICBtR2FwTGVuZ3RoIC09IHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCk7CisgICAgICAgIGlmIChuYk5ld0NoYXJzID49IG1HYXBMZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc2l6ZUZvcihtVGV4dC5sZW5ndGggKyBuYk5ld0NoYXJzIC0gbUdhcExlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBtR2FwU3RhcnQgKz0gbmJOZXdDaGFyczsKKyAgICAgICAgbUdhcExlbmd0aCAtPSBuYk5ld0NoYXJzOwogCiAgICAgICAgIGlmIChtR2FwTGVuZ3RoIDwgMSkKICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oIm1HYXBMZW5ndGggPCAxIikucHJpbnRTdGFja1RyYWNlKCk7CkBAIC03MDcsNiArNzExLDcgQEAKICAgICAgKiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIHRoZSBidWZmZXIuICBUaGUga2luZCBtYXkgYmUgT2JqZWN0LmNsYXNzIHRvIGdldAogICAgICAqIGEgbGlzdCBvZiBhbGwgdGhlIHNwYW5zIHJlZ2FyZGxlc3Mgb2YgdHlwZS4KICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgPFQ+IFRbXSBnZXRTcGFucyhpbnQgcXVlcnlTdGFydCwgaW50IHF1ZXJ5RW5kLCBDbGFzczxUPiBraW5kKSB7CiAgICAgICAgIGludCBzcGFuQ291bnQgPSBtU3BhbkNvdW50OwogICAgICAgICBPYmplY3RbXSBzcGFucyA9IG1TcGFuczsKQEAgLTcxNyw4ICs3MjIsOCBAQAogICAgICAgICBpbnQgZ2FwbGVuID0gbUdhcExlbmd0aDsKIAogICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBPYmplY3RbXSByZXQgPSBudWxsOwotICAgICAgICBPYmplY3QgcmV0MSA9IG51bGw7CisgICAgICAgIFRbXSByZXQgPSBudWxsOworICAgICAgICBUIHJldDEgPSBudWxsOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbkNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGludCBzcGFuU3RhcnQgPSBzdGFydHNbaV07CkBAIC03NTAsMTEgKzc1NSwxMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldDEgPSBzcGFuc1tpXTsKKyAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICByZXQxID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgc3BhbkNvdW50IC0gaSArIDEpOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24sIGJ1dCByZXF1aXJlcyBhIHN1cHByZXNzV2FybmluZworICAgICAgICAgICAgICAgICAgICByZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBzcGFuQ291bnQgLSBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgIHJldFswXSA9IHJldDE7CiAgICAgICAgICAgICAgICAgfQogCkBAIC03NzEsMjkgKzc3OCwzMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXQsIGosIHJldCwgaiArIDEsIGNvdW50IC0gaik7Ci0gICAgICAgICAgICAgICAgICAgIHJldFtqXSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgcmV0W2pdID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFtjb3VudCsrXSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgcmV0W2NvdW50KytdID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgQXJyYXlVdGlscy5lbXB0eUFycmF5KGtpbmQpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuZW1wdHlBcnJheShraW5kKTsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gMSkgewotICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKKyAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgICAgICByZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKICAgICAgICAgICAgIHJldFswXSA9IHJldDE7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgcmV0OworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gcmV0Lmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIHJldDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBPYmplY3RbXSBucmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBjb3VudCk7CisgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgIFRbXSBucmV0ID0gKFRbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgY291bnQpOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldCwgMCwgbnJldCwgMCwgY291bnQpOwotICAgICAgICByZXR1cm4gKFRbXSkgbnJldDsKKyAgICAgICAgcmV0dXJuIG5yZXQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NjIsNiArODczLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGNoYXJzIGluIHRoaXMgYnVmZmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGludCBsZW4gPSBsZW5ndGgoKTsKICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2xlbl07CkBAIC05NTIsNiArOTY0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorLyoKICAgICBwcml2YXRlIGJvb2xlYW4gaXNwcmludChjaGFyIGMpIHsgLy8gWFhYCiAgICAgICAgIGlmIChjID49ICcgJyAmJiBjIDw9ICd+JykKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTU5LDcgKzk3Miw2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0vKgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzdGFydEZsYWcoaW50IGZsYWcpIHsKICAgICAgICAgcmV0dXJuIChmbGFnID4+IDQpICYgMHgwRjsKICAgICB9CkBAIC0xMDU0LDcgKzEwNjYsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgQ2FudmFzIHRvIHVzZSBpbnRlcm5hbGx5LgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApIHsKKyAgICAgICAgY2hlY2tSYW5nZSgiZHJhd1RleHRSdW4iLCBzdGFydCwgZW5kKTsKKworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCwgbGVuLCBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sIHgsIHksIGZsYWdzLCBwKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBnZXRDaGFycyhjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwgMCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCiAgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCiAgICAgICoge0BoaWRlfQogICAgICAqLwpAQCAtMTEwMyw2ICsxMTQwLDU4IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzUG9zLCBQYWludCBwKSB7CisKKyAgICAgICAgZmxvYXQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworCisgICAgICAgIGlmIChlbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5BZHZhbmNlcyhtVGV4dCwgc3RhcnQsIGxlbiwgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBjdXJzb3JPcHQsIFBhaW50IHApIHsKKworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCArIG1HYXBMZW5ndGgsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZzZXQgKyBtR2FwTGVuZ3RoLCBjdXJzb3JPcHQpIC0gbUdhcExlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZXh0VXRpbHMub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgZ2V0Q2hhcnMoY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQ3Vyc29yKGJ1ZiwgMCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCAtIGNvbnRleHRTdGFydCwgY3Vyc29yT3B0KSArIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKwogICAgIC8vIERvY3VtZW50YXRpb24gZnJvbSBpbnRlcmZhY2UKICAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJzKElucHV0RmlsdGVyW10gZmlsdGVycykgewogICAgICAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCmluZGV4IDE1NDQ5N2QuLmQxNGZjYmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFID0gU1BBTl9QT0lOVF9NQVJLOwogCiAgICAgLyoqCi0gICAgICogTm9uLTAtbGVuZ3RoIHNwYW5zIG9mIHR5cGUgU1BBTl9JTkNMVVNJVkVfRVhDTFVTSVZFIGV4cGFuZAorICAgICAqIE5vbi0wLWxlbmd0aCBzcGFucyBvZiB0eXBlIFNQQU5fRVhDTFVTSVZFX0lOQ0xVU0lWRSBleHBhbmQKICAgICAgKiB0byBpbmNsdWRlIHRleHQgaW5zZXJ0ZWQgYXQgdGhlaXIgZW5kaW5nIHBvaW50IGJ1dCBub3QgYXQgdGhlaXIKICAgICAgKiBzdGFydGluZyBwb2ludC4gIFdoZW4gMC1sZW5ndGgsIHRoZXkgYmVoYXZlIGxpa2UgcG9pbnRzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkMGQyNDgyLi5jYzk2OWNiCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQpAQCAtMTYsMTQgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOworCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxpbmVIZWlnaHRTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlRhYlN0b3BTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjI7CiAKIC8qKgogICogU3RhdGljTGF5b3V0IGlzIGEgTGF5b3V0IGZvciB0ZXh0IHRoYXQgd2lsbCBub3QgYmUgZWRpdGVkIGFmdGVyIGl0CkBAIC0zMSw4ICszMiw5IEBACiAgKiA8cD5UaGlzIGlzIHVzZWQgYnkgd2lkZ2V0cyB0byBjb250cm9sIHRleHQgbGF5b3V0LiBZb3Ugc2hvdWxkIG5vdCBuZWVkCiAgKiB0byB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseSB1bmxlc3MgeW91IGFyZSBpbXBsZW1lbnRpbmcgeW91ciBvd24gd2lkZ2V0CiAgKiBvciBjdXN0b20gZGlzcGxheSBvYmplY3QsIG9yIHdvdWxkIGJlIHRlbXB0ZWQgdG8gY2FsbAotICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdUZXh0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwgZmxvYXQsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0gKiAgQ2FudmFzLmRyYXdUZXh0KCl9IGRpcmVjdGx5LjwvcD4KKyAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBpbnQsIGludCwKKyAqIGZsb2F0LCBmbG9hdCwgYW5kcm9pZC5ncmFwaGljcy5QYWludCkKKyAqIENhbnZhcy5kcmF3VGV4dCgpfSBkaXJlY3RseS48L3A+CiAgKi8KIHB1YmxpYyBjbGFzcwogU3RhdGljTGF5b3V0CkBAIC02Miw3ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVwYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuVHJ1bmNhdGVBdCBlbGxpcHNpemUsIGludCBlbGxpcHNpemVkV2lkdGgpIHsKICAgICAgICAgc3VwZXIoKGVsbGlwc2l6ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gc291cmNlIAorICAgICAgICAgICAgICAgID8gc291cmNlCiAgICAgICAgICAgICAgICAgOiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkKICAgICAgICAgICAgICAgICAgICAgPyBuZXcgU3Bhbm5lZEVsbGlwc2l6ZXIoc291cmNlKQogICAgICAgICAgICAgICAgICAgICA6IG5ldyBFbGxpcHNpemVyKHNvdXJjZSksCkBAIC03Miw3ICs3NCw3IEBACiAgICAgICAgICAqIFRoaXMgaXMgYW5ub3lpbmcsIGJ1dCB3ZSBjYW4ndCByZWZlciB0byB0aGUgbGF5b3V0IHVudGlsCiAgICAgICAgICAqIHN1cGVyY2xhc3MgY29uc3RydWN0aW9uIGlzIGZpbmlzaGVkLCBhbmQgdGhlIHN1cGVyY2xhc3MKICAgICAgICAgICogY29uc3RydWN0b3Igd2FudHMgdGhlIHJlZmVyZW5jZSB0byB0aGUgZGlzcGxheSB0ZXh0LgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogVGhpcyB3aWxsIGJyZWFrIGlmIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIGV2ZXIgYWN0dWFsbHkKICAgICAgICAgICogY2FyZXMgYWJvdXQgdGhlIGNvbnRlbnQgaW5zdGVhZCBvZiBqdXN0IGhvbGRpbmcgdGhlIHJlZmVyZW5jZS4KICAgICAgICAgICovCkBAIC05NCwxMyArOTYsMTMgQEAKICAgICAgICAgbUxpbmVEaXJlY3Rpb25zID0gbmV3IERpcmVjdGlvbnNbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CiAKKyAgICAgICAgbU1lYXN1cmVkID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworCiAgICAgICAgIGdlbmVyYXRlKHNvdXJjZSwgYnVmc3RhcnQsIGJ1ZmVuZCwgcGFpbnQsIG91dGVyd2lkdGgsIGFsaWduLAogICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgaW5jbHVkZXBhZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgZWxsaXBzaXplICE9IG51bGwsIGVsbGlwc2l6ZWRXaWR0aCwgZWxsaXBzaXplKTsKIAotICAgICAgICBtQ2hkaXJzID0gbnVsbDsKLSAgICAgICAgbUNocyA9IG51bGw7Ci0gICAgICAgIG1XaWR0aHMgPSBudWxsOworICAgICAgICBtTWVhc3VyZWQgPSBNZWFzdXJlZFRleHQucmVjeWNsZShtTWVhc3VyZWQpOwogICAgICAgICBtRm9udE1ldHJpY3NJbnQgPSBudWxsOwogICAgIH0KIApAQCAtMTExLDYgKzExMyw3IEBACiAgICAgICAgIG1MaW5lcyA9IG5ldyBpbnRbQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKICAgICAgICAgbUxpbmVEaXJlY3Rpb25zID0gbmV3IERpcmVjdGlvbnNbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CisgICAgICAgIG1NZWFzdXJlZCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgZ2VuZXJhdGUoQ2hhclNlcXVlbmNlIHNvdXJjZSwgaW50IGJ1ZnN0YXJ0LCBpbnQgYnVmZW5kLApAQCAtMTI4LDU5ICsxMzEsNTAgQEAKICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0gPSBtRm9udE1ldHJpY3NJbnQ7CiAgICAgICAgIGludFtdIGNob29zZWh0diA9IG51bGw7CiAKLSAgICAgICAgaW50IGVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgYnVmc3RhcnQsIGJ1ZmVuZCk7Ci0gICAgICAgIGludCBidWZzaXogPSBlbmQgPj0gMCA/IGVuZCAtIGJ1ZnN0YXJ0IDogYnVmZW5kIC0gYnVmc3RhcnQ7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBNZWFzdXJlZFRleHQgbWVhc3VyZWQgPSBtTWVhc3VyZWQ7CiAKLSAgICAgICAgaWYgKG1DaGRpcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNoZGlycyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGJ1ZnNpeiArIDEpXTsKLSAgICAgICAgICAgIG1DaHMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShidWZzaXogKyAxKV07Ci0gICAgICAgICAgICBtV2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoKGJ1ZnNpeiArIDEpICogMildOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIGNoZGlycyA9IG1DaGRpcnM7Ci0gICAgICAgIGNoYXJbXSBjaHMgPSBtQ2hzOwotICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG1XaWR0aHM7Ci0KLSAgICAgICAgQWx0ZXJlZENoYXJTZXF1ZW5jZSBhbHRlciA9IG51bGw7CiAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IG51bGw7Ci0KICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFNwYW5uZWQpCiAgICAgICAgICAgICBzcGFubmVkID0gKFNwYW5uZWQpIHNvdXJjZTsKIAogICAgICAgICBpbnQgREVGQVVMVF9ESVIgPSBESVJfTEVGVF9UT19SSUdIVDsgLy8gWFhYCiAKLSAgICAgICAgZm9yIChpbnQgc3RhcnQgPSBidWZzdGFydDsgc3RhcnQgPD0gYnVmZW5kOyBzdGFydCA9IGVuZCkgewotICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIGludCBwYXJhRW5kOworICAgICAgICBmb3IgKGludCBwYXJhU3RhcnQgPSBidWZzdGFydDsgcGFyYVN0YXJ0IDw9IGJ1ZmVuZDsgcGFyYVN0YXJ0ID0gcGFyYUVuZCkgeworICAgICAgICAgICAgcGFyYUVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgcGFyYVN0YXJ0LCBidWZlbmQpOworICAgICAgICAgICAgaWYgKHBhcmFFbmQgPCAwKQorICAgICAgICAgICAgICAgIHBhcmFFbmQgPSBidWZlbmQ7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBzdGFydCwgYnVmZW5kKTsKKyAgICAgICAgICAgICAgICBwYXJhRW5kKys7CisgICAgICAgICAgICBpbnQgcGFyYUxlbiA9IHBhcmFFbmQgLSBwYXJhU3RhcnQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPCAwKQotICAgICAgICAgICAgICAgIGVuZCA9IGJ1ZmVuZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbmQrKzsKLQotICAgICAgICAgICAgaW50IGZpcnN0V2lkdGhMaW5lQ291bnQgPSAxOworICAgICAgICAgICAgaW50IGZpcnN0V2lkdGhMaW5lTGltaXQgPSBtTGluZUNvdW50ICsgMTsKICAgICAgICAgICAgIGludCBmaXJzdHdpZHRoID0gb3V0ZXJ3aWR0aDsKICAgICAgICAgICAgIGludCByZXN0d2lkdGggPSBvdXRlcndpZHRoOwogCiAgICAgICAgICAgICBMaW5lSGVpZ2h0U3BhbltdIGNob29zZWh0ID0gbnVsbDsKIAogICAgICAgICAgICAgaWYgKHNwYW5uZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3A7Ci0KLSAgICAgICAgICAgICAgICBzcCA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3AgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBwYXJhU3RhcnQsIHBhcmFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBsbXMgPSBzcFtpXTsKICAgICAgICAgICAgICAgICAgICAgZmlyc3R3aWR0aCAtPSBzcFtpXS5nZXRMZWFkaW5nTWFyZ2luKHRydWUpOwogICAgICAgICAgICAgICAgICAgICByZXN0d2lkdGggLT0gc3BbaV0uZ2V0TGVhZGluZ01hcmdpbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0V2lkdGhMaW5lQ291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMilsbXMpLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIExlYWRpbmdNYXJnaW5TcGFuMiBpcyBvZGQuICBUaGUgY291bnQgYWZmZWN0cyBhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4gc3BhbnMsIG5vdCBqdXN0IHRoaXMgcGFydGljdWxhciBvbmUsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdGFydCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNwYW4sIG5vdCB0aGUgdG9wIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuMiBsbXMyID0gKExlYWRpbmdNYXJnaW5TcGFuMikgbG1zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxtc0ZpcnN0TGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3Bhbm5lZC5nZXRTcGFuU3RhcnQobG1zMikpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RXaWR0aExpbmVMaW1pdCA9IGxtc0ZpcnN0TGluZSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtczIuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2hvb3NlaHQgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsIExpbmVIZWlnaHRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjaG9vc2VodCA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHBhcmFTdGFydCwgcGFyYUVuZCwgTGluZUhlaWdodFNwYW4uY2xhc3MpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNob29zZWh0Lmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaG9vc2VodHYgPT0gbnVsbCB8fApAQCAtMTkyLDExICsxODYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9vc2VodC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8gPSBzcGFubmVkLmdldFNwYW5TdGFydChjaG9vc2VodFtpXSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgcGFyYVN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGluIHRoaXMgbGF5b3V0LCBiZWZvcmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBwYXJhZ3JhcGgKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBpbiB0aGlzIHBhcmFncmFwaAogCkBAIC0yMDYsMTY2ICsyMDAsODcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IGNoZGlycy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGRpcnMgPSBuZXcgYnl0ZVtBcnJheVV0aWxzLmlkZWFsQnl0ZUFycmF5U2l6ZShlbmQgLSBzdGFydCldOwotICAgICAgICAgICAgICAgIG1DaGRpcnMgPSBjaGRpcnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiBjaHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUoZW5kIC0gc3RhcnQpXTsKLSAgICAgICAgICAgICAgICBtQ2hzID0gY2hzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChlbmQgLSBzdGFydCkgKiAyID4gd2lkdGhzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHdpZHRocyA9IG5ldyBmbG9hdFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKChlbmQgLSBzdGFydCkgKiAyKV07Ci0gICAgICAgICAgICAgICAgbVdpZHRocyA9IHdpZHRoczsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lYXN1cmVkLnNldFBhcmEoc291cmNlLCBwYXJhU3RhcnQsIHBhcmFFbmQsIERJUl9SRVFVRVNUX0RFRkFVTFRfTFRSKTsKKyAgICAgICAgICAgIGNoYXJbXSBjaHMgPSBtZWFzdXJlZC5tQ2hhcnM7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG1lYXN1cmVkLm1XaWR0aHM7CisgICAgICAgICAgICBieXRlW10gY2hkaXJzID0gbWVhc3VyZWQubUxldmVsczsKKyAgICAgICAgICAgIGludCBkaXIgPSBtZWFzdXJlZC5tRGlyOworICAgICAgICAgICAgYm9vbGVhbiBlYXN5ID0gbWVhc3VyZWQubUVhc3k7CiAKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyhzb3VyY2UsIHN0YXJ0LCBlbmQsIGNocywgMCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbiA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBib29sZWFuIGVhc3kgPSB0cnVlOwotICAgICAgICAgICAgYm9vbGVhbiBhbHRlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgZGlyID0gREVGQVVMVF9ESVI7IC8vIFhYWAotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChjaHNbaV0gPj0gRklSU1RfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBlYXN5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgdW5kZXJseWluZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkCi0gICAgICAgICAgICAvLyBhcyB2aWFibGUgYnJlYWtwb2ludHMsIGFuZCB0aGF0IHRoZSBlbnRpcmUgcnVuIGdldHMgdGhlCi0gICAgICAgICAgICAvLyBzYW1lIGJpZGkgZGlyZWN0aW9uLgotCi0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgc291cmNlOwotICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgc3BhbnMubGVuZ3RoOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBzcC5nZXRTcGFuU3RhcnQoc3BhbnNbeV0pOwotICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IHNwLmdldFNwYW5FbmQoc3BhbnNbeV0pOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSBhOyB4IDwgYjsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaHNbeCAtIHN0YXJ0XSA9ICdcdUZGRkMnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVhc3kpIHsKLSAgICAgICAgICAgICAgICAvLyBYWFggcHV0IG92ZXJyaWRlIGZsYWdzLCBldGMuIGludG8gY2hkaXJzCi0gICAgICAgICAgICAgICAgZGlyID0gYmlkaShkaXIsIGNocywgY2hkaXJzLCBuLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBEbyBtaXJyb3JpbmcgZm9yIHJpZ2h0LXRvLWxlZnQgc2VnbWVudHMKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbaV0gPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBpOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1tqXSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ2hhcmFjdGVyLm1pcnJvcihjaHMsIGksIGogLSBpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcmVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGogLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViOwotCi0gICAgICAgICAgICBpZiAoYWx0ZXJlZCkgewotICAgICAgICAgICAgICAgIGlmIChhbHRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhbHRlciA9IEFsdGVyZWRDaGFyU2VxdWVuY2UubWFrZShzb3VyY2UsIGNocywgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBhbHRlci51cGRhdGUoY2hzLCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIHN1YiA9IGFsdGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdWIgPSBzb3VyY2U7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViID0gc291cmNlOwogCiAgICAgICAgICAgICBpbnQgd2lkdGggPSBmaXJzdHdpZHRoOwogCiAgICAgICAgICAgICBmbG9hdCB3ID0gMDsKLSAgICAgICAgICAgIGludCBoZXJlID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgaGVyZSA9IHBhcmFTdGFydDsKIAotICAgICAgICAgICAgaW50IG9rID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgb2sgPSBwYXJhU3RhcnQ7CiAgICAgICAgICAgICBmbG9hdCBva3dpZHRoID0gdzsKICAgICAgICAgICAgIGludCBva2FzY2VudCA9IDAsIG9rZGVzY2VudCA9IDAsIG9rdG9wID0gMCwgb2tib3R0b20gPSAwOwogCi0gICAgICAgICAgICBpbnQgZml0ID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgZml0ID0gcGFyYVN0YXJ0OwogICAgICAgICAgICAgZmxvYXQgZml0d2lkdGggPSB3OwogICAgICAgICAgICAgaW50IGZpdGFzY2VudCA9IDAsIGZpdGRlc2NlbnQgPSAwLCBmaXR0b3AgPSAwLCBmaXRib3R0b20gPSAwOwogCi0gICAgICAgICAgICBib29sZWFuIHRhYiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGhhc1RhYiA9IGZhbHNlOworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOwogCi0gICAgICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyk7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSBwYXJhU3RhcnQsIHNwYW5FbmQgPSBzcGFuU3RhcnQsIG5leHRTcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydCA8IHBhcmFFbmQ7IHNwYW5TdGFydCA9IG5leHRTcGFuU3RhcnQpIHsKIAotICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbE51bSA9IHBhaW50LmdldFRleHRXaWR0aHMoc3ViLCBpLCBuZXh0LCB3aWR0aHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAtIGkgPiBhY3R1YWxOdW0pCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RUZXh0V2lkdGhzKHdpZHRocywgc3ViLCBpLCBuZXh0LCBhY3R1YWxOdW0pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA9PSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gcGFyYUVuZDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgcGFyYUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbE51bSA9IFN0eWxlZC5nZXRUZXh0V2lkdGhzKHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5uZWQsIGksIG5leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBmbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IC0gaSA+IGFjdHVhbE51bSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdFRleHRXaWR0aHMod2lkdGhzLCBzcGFubmVkLCBpLCBuZXh0LCBhY3R1YWxOdW0pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobVdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGludCBzcGFuTGVuID0gc3BhbkVuZCAtIHNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5MZW4sIGZtKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmRlc2NlbnQgKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5lZC5nZXRTcGFucyhzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5zLCBzcGFuTGVuLCBmbSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBuZXh0U3BhblN0YXJ0ID0gc3BhbkVuZDsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJblBhcmEgPSBzcGFuU3RhcnQgLSBwYXJhU3RhcnQ7CisgICAgICAgICAgICAgICAgaW50IGVuZEluUGFyYSA9IHNwYW5FbmQgLSBwYXJhU3RhcnQ7CisKICAgICAgICAgICAgICAgICBpbnQgZm10b3AgPSBmbS50b3A7CiAgICAgICAgICAgICAgICAgaW50IGZtYm90dG9tID0gZm0uYm90dG9tOwogICAgICAgICAgICAgICAgIGludCBmbWFzY2VudCA9IGZtLmFzY2VudDsKICAgICAgICAgICAgICAgICBpbnQgZm1kZXNjZW50ID0gZm0uZGVzY2VudDsKIAotICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBuZXh0OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBMb2cuZSgidGV4dCIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgbmV4dDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IGNoc1tqIC0gc3RhcnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzcGFuU3RhcnQ7IGogPCBzcGFuRW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gY2hzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICBmbG9hdCBiZWZvcmUgPSB3OwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBMYXlvdXQubmV4dFRhYihzdWIsIHN0YXJ0LCBlbmQsIHcsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGFiID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRiAmJiBqICsgMSA8IG5leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaHMsIGogLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVGFiID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFiID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWJPckVtb2ppID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRhYiB0aGlzIHBhcmEsIGNoZWNrIGZvciB0YWJzdG9wcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgcGFyYVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHRhYlN0b3BzLm5leHRUYWIodyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBUYWJTdG9wcy5uZXh0RGVmYXVsdFN0b3AodywgVEFCX0lOQ1JFTUVOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYgJiYgaiArIDEgPCBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hzLCBqIC0gcGFyYVN0YXJ0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppID49IE1JTl9FTU9KSSAmJiBlbW9qaSA8PSBNQVhfRU1PSkkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgpAQCAtMzgwLDIxICsyOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFpbnQgPSBtV29ya1BhaW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gYm0uZ2V0V2lkdGgoKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13aGljaFBhaW50LmFzY2VudCgpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0uZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYk9yRW1vamkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAid2FzICIgKyBiZWZvcmUgKyAiIG5vdyAiICsgdyArICIgYWZ0ZXIgIiArIGMgKyAiIHdpdGhpbiAiICsgd2lkdGgpOwpAQCAtNDE1LDcgKzMzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICogRnJvbSB0aGUgVW5pY29kZSBMaW5lIEJyZWFraW5nIEFsZ29yaXRobToKICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhdCBsZWFzdCBhcHByb3hpbWF0ZWx5KQotICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC4sOjsgYXJlIGNsYXNzIElTOiBicmVha3BvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBleGNlcHQgd2hlbiBhZGphY2VudCB0byBkaWdpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC8gICAgaXMgY2xhc3MgU1k6IGEgYnJlYWtwb2ludApAQCAtNDMwLDEyICszNDUsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLicgIHx8IGMgPT0gJywnIHx8IGMgPT0gJzonIHx8IGMgPT0gJzsnKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiAtIDEgPCBoZXJlIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiAtIDEgLSBzdGFydF0pKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gbmV4dCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gc3RhcnRdKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqIC0gMSA8IGhlcmUgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqIC0gMSAtIHBhcmFTdGFydF0pKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gc3BhbkVuZCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSkpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLycgfHwgYyA9PSAnLScpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBuZXh0IHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBzdGFydF0pKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IHNwYW5FbmQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHBhcmFTdGFydF0pKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA+PSBGSVJTVF9DSksgJiYgaXNJZGVvZ3JhcGhpYyhjLCB0cnVlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICsgMSA8IG5leHQgJiYgaXNJZGVvZ3JhcGhpYyhjaHNbaiArIDEgLSBzdGFydF0sIGZhbHNlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArIDEgPCBzcGFuRW5kICYmIGlzSWRlb2dyYXBoaWMoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSwgZmFsc2UpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rd2lkdGggPSB3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gaiArIDE7CiAKQEAgLTQ1Miw3ICszNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rICE9IGhlcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgb2sgIiArIGhlcmUgKyAiIHRvICIgK29rKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IG5leHQgJiYgY2hzW29rIC0gc3RhcnRdID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IHNwYW5FbmQgJiYgY2hzW29rIC0gcGFyYVN0YXJ0XSA9PSAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2srKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ2MSwxMCArMzc2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2FzY2VudCwgb2tkZXNjZW50LCBva3RvcCwgb2tib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCBva3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCkBAIC00ODgsNyArNDAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvayAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9rICIgKyBoZXJlICsgIiB0byAiICtvayk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBuZXh0ICYmIGNoc1tvayAtIHN0YXJ0XSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBzcGFuRW5kICYmIGNoc1tvayAtIHBhcmFTdGFydF0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00OTcsMTAgKzQxMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQsIG9rZGVzY2VudCwgb2t0b3AsIG9rYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgb2t3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIApAQCAtNTEzLDE5ICs0MjgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdHRvcCwgZml0Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdCA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIGZpdHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGZpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9uZSAiICsgaGVyZSArICIgdG8gIiArKGhlcmUgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggbm90IHN1cmUgd2h5IHRoZSBleGlzdGluZyBmbSB3YXNuJ3Qgb2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBudWxsKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBvdXQoc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgaGVyZSsxLApAQCAtNTMzLDE5ICs0NDksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCwgZm0uYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgKyAxID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHNbaGVyZSAtIHN0YXJ0XSwgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2hlcmUgLSBwYXJhU3RhcnRdLCBwYWludCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gaGVyZSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBuZXh0ID0gaGVyZTsgLy8gbXVzdCByZW1lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgc3BhblN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlkbid0IG91dHB1dCBhbGwgdGhlIHRleHQgZm9yIHRoaXMgc3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIG1lYXN1cmVkIHRoZSByYXcgd2lkdGhzLCB0aG91Z2gsIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCByZXNldCB0aGUgc3RhcnQgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmV4dFNwYW5TdGFydCA9IGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBoZXJlIC0gMTsgICAgLy8gY29udGludWUgbG9vcGluZwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU1LDE0ICs0NzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpdGFzY2VudCA9IGZpdGRlc2NlbnQgPSBmaXR0b3AgPSBmaXRib3R0b20gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQgPSBva2Rlc2NlbnQgPSBva3RvcCA9IG9rYm90dG9tID0gMDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZmlyc3RXaWR0aExpbmVDb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1maXJzdFdpZHRoTGluZUxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJlc3R3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVuZCAhPSBoZXJlKSB7CisgICAgICAgICAgICBpZiAocGFyYUVuZCAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgaWYgKChmaXR0b3AgfCBmaXRib3R0b20gfCBmaXRkZXNjZW50IHwgZml0YXNjZW50KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKIApAQCAtNTc1LDIwICs0OTQsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgcmVzdCAiICsgaGVyZSArICIgdG8gIiArIGVuZCk7CiAKICAgICAgICAgICAgICAgICB2ID0gb3V0KHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgcGFyYUVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgZml0dG9wLCBmaXRib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgdywgcGFpbnQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzdGFydCA9IGVuZDsKKyAgICAgICAgICAgIHBhcmFTdGFydCA9IHBhcmFFbmQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPT0gYnVmZW5kKQorICAgICAgICAgICAgaWYgKHBhcmFFbmQgPT0gYnVmZW5kKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTYwMywyNDYgKzUyMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZm0sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIGJ1ZmVuZCwgY2hkaXJzLCBERUZBVUxUX0RJUiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBidWZlbmQsIG51bGwsIERFRkFVTFRfRElSLCB0cnVlLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBidWZzdGFydCwgMCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgYnVmc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIDAsIHBhaW50KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHVuaWNvZGUgYmlkaSBhbGdvcml0aG0gb24gdGhlIGZpcnN0IG4gY2hhcnMgaW4gY2hzLCByZXR1cm5pbmcKLSAgICAgKiB0aGUgY2hhciBkaXJzIGluIGNoSW5mbyBhbmQgdGhlIGJhc2UgbGluZSBkaXJlY3Rpb24gb2YgdGhlIGZpcnN0Ci0gICAgICogcGFyYWdyYXBoLgotICAgICAqIAotICAgICAqIFhYWCBjaGFuZ2UgcmVzdWx0IGZyb20gZGlycyB0byBsZXZlbHMKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0aW9uIGZsYWcsIGVpdGhlciBESVJfUkVRVUVTVF9MVFIsCi0gICAgICogRElSX1JFUVVFU1RfUlRMLCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiwgb3IgRElSX1JFUVVFU1RfREVGQVVMVF9SVEwuCi0gICAgICogQHBhcmFtIGNocyB0aGUgdGV4dCB0byBleGFtaW5lCi0gICAgICogQHBhcmFtIGNoSW5mbyBvbiBpbnB1dCwgaWYgaGFzSW5mbyBpcyB0cnVlLCBvdmVycmlkZSBhbmQgb3RoZXIgZmxhZ3MgCi0gICAgICogcmVwcmVzZW50aW5nIG91dC1vZi1iYW5kIGVtYmVkZGluZyBpbmZvcm1hdGlvbi4gT24gb3V0cHV0LCB0aGUgZ2VuZXJhdGVkIAotICAgICAqIGRpcnMgb2YgdGhlIHRleHQuCi0gICAgICogQHBhcmFtIG4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dC9pbmZvcm1hdGlvbiBpbiBjaHMgYW5kIGNoSW5mbwotICAgICAqIEBwYXJhbSBoYXNJbmZvIHRydWUgaWYgY2hJbmZvIGhhcyBpbnB1dCBpbmZvcm1hdGlvbiwgb3RoZXJ3aXNlIHRoZQotICAgICAqIGlucHV0IGRhdGEgaW4gY2hJbmZvIGlzIGlnbm9yZWQuCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZGlyZWN0aW9uIGxldmVsIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIGVpdGhlcgotICAgICAqIERJUl9MRUZUX1RPX1JJR0hUIG9yIERJUl9SSUdIVF9UT19MRUZULgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBiaWRpKGludCBkaXIsIGNoYXJbXSBjaHMsIGJ5dGVbXSBjaEluZm8sIGludCBuLCAKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzSW5mbykgewotICAgICAgICAKLSAgICAgICAgQW5kcm9pZENoYXJhY3Rlci5nZXREaXJlY3Rpb25hbGl0aWVzKGNocywgY2hJbmZvLCBuKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEZXRlcm1pbmUgcHJpbWFyeSBwYXJhZ3JhcGggZGlyZWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChkaXIgIT0gRElSX1JFUVVFU1RfTFRSICYmIGRpciAhPSBESVJfUkVRVUVTVF9SVEwpIHsKLSAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0Ci0gICAgICAgICAgICBkaXIgPSBkaXIgPj0gMCA/IERJUl9MRUZUX1RPX1JJR0hUIDogRElSX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgICAgIGludCBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlyID0gRElSX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBkaXIgPSBESVJfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYnl0ZSBTT1IgPSBkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgPwotICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBYWFggRXhwbGljaXQgb3ZlcnJpZGVzIHNob3VsZCBnbyBoZXJlCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlYWsgdHlwZSByZXNvbHV0aW9uCi0gICAgICAgICAqLwotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiaW5pdGlhbCIpOwotCi0gICAgICAgIC8vIFcxIG5vbiBzcGFjaW5nIG1hcmtzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoY2hJbmZvW2pdID09IENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gU09SOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gY2hJbmZvW2ogLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzEiKTsKLQotICAgICAgICAvLyBXMiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGJ5dGUgY3VyID0gU09SOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQykKLSAgICAgICAgICAgICAgICBjdXIgPSBkOwotICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgIGlmIChjdXIgPT0KLSAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzIiKTsKLQotICAgICAgICAvLyBXMyBhcmFiaWMgbGV0dGVycwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgaWYgKGNoSW5mb1tqXSA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMpCi0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlczIik7Ci0KLSAgICAgICAgLy8gVzQgc2luZ2xlIHNlcGFyYXRvciBiZXR3ZWVuIG51bWJlcnMKLSAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBuIC0gMTsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0gICAgICAgICAgICBieXRlIHByZXYgPSBjaEluZm9baiAtIDFdOwotICAgICAgICAgICAgYnl0ZSBuZXh0ID0gY2hJbmZvW2ogKyAxXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQ09NTU9OX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzQiKTsKLQotICAgICAgICAvLyBXNSBldXJvcGVhbiBudW1iZXIgdGVybWluYXRvcnMKLSAgICAgICAgYm9vbGVhbiBhZGphY2VudCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9URVJNSU5BVE9SICYmIGFkamFjZW50KQotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vZHVtcChjaGRpcnMsIG4sICJXNSIpOwotCi0gICAgICAgIC8vIFc1IGV1cm9wZWFuIG51bWJlciB0ZXJtaW5hdG9ycyBwYXJ0IDIsCi0gICAgICAgIC8vIFc2IHNlcGFyYXRvcnMgYW5kIHRlcm1pbmF0b3JzCi0gICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGogPSBuIC0gMTsgaiA+PSAwOyBqLS0pIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUikgewotICAgICAgICAgICAgICAgIGlmIChhZGphY2VudCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9PVEhFUl9ORVVUUkFMUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9QQVJBR1JBUEhfU0VQQVJBVE9SIHx8Ci0gICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1NFR01FTlRfU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfT1RIRVJfTkVVVFJBTFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc2Iik7Ci0KLSAgICAgICAgLy8gVzcgc3Ryb25nIGRpcmVjdGlvbiBvZiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gU09SIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgY3VyID0gZDsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBjdXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc3Iik7Ci0KLSAgICAgICAgLy8gTjEsIE4yIG5ldXRyYWxzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgY3VyID0gZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnl0ZSBkZCA9IFNPUjsKLSAgICAgICAgICAgICAgICBpbnQgazsKLQotICAgICAgICAgICAgICAgIGZvciAoayA9IGogKyAxOyBrIDwgbjsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRkID0gY2hJbmZvW2tdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IGo7IHkgPCBrOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRkID09IGN1cikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoSW5mb1t5XSA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2hJbmZvW3ldID0gU09SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGogPSBrIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiZmluYWwiKTsKLQotICAgICAgICAvLyBleHRyYTogZW5mb3JjZSB0aGF0IGFsbCB0YWJzIGFuZCBzdXJyb2dhdGUgY2hhcmFjdGVycyBnbyB0aGUKLSAgICAgICAgLy8gcHJpbWFyeSBkaXJlY3Rpb24KLSAgICAgICAgLy8gVE9ETzogYWN0dWFsbHkgZG8gZGlyZWN0aW9ucyByaWdodCBmb3Igc3Vycm9nYXRlcwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBjaHNbal07Ci0KLSAgICAgICAgICAgIGlmIChjID09ICdcdCcgfHwgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSkgewotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IFNPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX0NKSyA9ICdcdTJFODAnOwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBvbmUgb2YgdGhvc2Ugc3BlY2lmaWVkCkBAIC05NDgsNTMgKzYzNCwxNSBAQAogICAgIH0KICovCiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Rml0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCkgewotICAgICAgICBpbnQgaGlnaCA9IGVuZCArIDEsIGxvdyA9IHN0YXJ0IC0gMSwgZ3Vlc3M7Ci0KLSAgICAgICAgd2hpbGUgKGhpZ2ggLSBsb3cgPiAxKSB7Ci0gICAgICAgICAgICBndWVzcyA9IChoaWdoICsgbG93KSAvIDI7Ci0KLSAgICAgICAgICAgIGlmIChtZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIHN0YXJ0LCBndWVzcywgbnVsbCwgdHJ1ZSwgbnVsbCkgPiB3aWQpCi0gICAgICAgICAgICAgICAgaGlnaCA9IGd1ZXNzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvdyA9IGd1ZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvdyA8IHN0YXJ0KQotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbG93OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRqdXN0VGV4dFdpZHRocyhmbG9hdFtdIHdpZHRocywgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VyUG9zLCBpbnQgbmV4dFBvcywgaW50IGFjdHVhbE51bSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGRzdEluZGV4ID0gbmV4dFBvcyAtIGN1clBvcyAtIDE7Ci0gICAgICAgICAgICBmb3IgKGludCBzcmNJbmRleCA9IGFjdHVhbE51bSAtIDE7IHNyY0luZGV4ID49IDA7IHNyY0luZGV4LS0pIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSB0ZXh0LmNoYXJBdChkc3RJbmRleCArIGN1clBvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IDAuMGY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IHdpZHRoc1tzcmNJbmRleF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoInRleHQiLCAiYWRqdXN0IHRleHQgd2lkdGhzIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgb3V0KENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFib3ZlLCBpbnQgYmVsb3csIGludCB0b3AsIGludCBib3R0b20sIGludCB2LAogICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwYWNpbmdtdWx0LCBmbG9hdCBzcGFjaW5nYWRkLAogICAgICAgICAgICAgICAgICAgICAgIExpbmVIZWlnaHRTcGFuW10gY2hvb3NlaHQsIGludFtdIGNob29zZWh0diwKLSAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSwgYm9vbGVhbiB0YWIsCisgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sIGJvb2xlYW4gaGFzVGFiT3JFbW9qaSwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRNdWx0aXBseSwgaW50IHBzdGFydCwgYnl0ZVtdIGNoZGlycywKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIGVhc3ksIGJvb2xlYW4gbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVwYWQsIGJvb2xlYW4gdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwgaW50IHdpZG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gY2hzLCBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5UcnVuY2F0ZUF0IGVsbGlwc2l6ZSwgZmxvYXQgZWxsaXBzaXN3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgaiA9IG1MaW5lQ291bnQ7CkBAIC0xMDAyLDggKzY1MCw2IEBACiAgICAgICAgIGludCB3YW50ID0gb2ZmICsgbUNvbHVtbnMgKyBUT1A7CiAgICAgICAgIGludFtdIGxpbmVzID0gbUxpbmVzOwogCi0gICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgImxpbmUgIiArIHN0YXJ0ICsgIiB0byAiICsgZW5kICsgKGxhc3QgPyAiPT09IiA6ICIiKSk7Ci0KICAgICAgICAgaWYgKHdhbnQgPj0gbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICBpbnQgbmxlbiA9IEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUod2FudCArIDEpOwogICAgICAgICAgICAgaW50W10gZ3JvdyA9IG5ldyBpbnRbbmxlbl07CkBAIC0xMDc5LDU5ICs3MjUsMjMgQEAKICAgICAgICAgbGluZXNbb2ZmICsgbUNvbHVtbnMgKyBTVEFSVF0gPSBlbmQ7CiAgICAgICAgIGxpbmVzW29mZiArIG1Db2x1bW5zICsgVE9QXSA9IHY7CiAKLSAgICAgICAgaWYgKHRhYikKKyAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkpCiAgICAgICAgICAgICBsaW5lc1tvZmYgKyBUQUJdIHw9IFRBQl9NQVNLOwogCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpbmVzW29mZiArIERJUl0gfD0gZGlyIDw8IERJUl9TSElGVDsKLQotICAgICAgICAgICAgaW50IGN1ciA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICAgICAgaWYgKCFlYXN5KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1trIC0gcHN0YXJ0XSAhPSBjdXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjaGRpcnNbayAtIHBzdGFydF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnM7Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG9ydFtdIGxkID0gbmV3IHNob3J0W2NvdW50ICsgMV07Ci0KLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbayAtIHBzdGFydF0gIT0gY3VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3ZlcmZsb3cgc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxkW2NvdW50KytdID0gKHNob3J0KSAoayAtIGhlcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY2hkaXJzW2sgLSBwc3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZFtjb3VudF0gPSAoc2hvcnQpIChlbmQgLSBoZXJlKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxICYmIGxkWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gbmV3IERpcmVjdGlvbnMobGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQorICAgICAgICBsaW5lc1tvZmYgKyBESVJdIHw9IGRpciA8PCBESVJfU0hJRlQ7CisgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworICAgICAgICAvLyBlYXN5IG1lYW5zIGFsbCBjaGFycyA8IHRoZSBmaXJzdCBSVEwsIHNvIG5vIGVtb2ppLCBubyBub3RoaW5nCisgICAgICAgIC8vIFhYWCBhIHJ1biB3aXRoIG5vIHRleHQgb3IgYWxsIHNwYWNlcyBpcyBlYXN5IGJ1dCBtaWdodCBiZSBhbiBlbXB0eQorICAgICAgICAvLyBSVEwgcGFyYWdyYXBoLiAgTWFrZSBzdXJlIGVhc3kgaXMgZmFsc2UgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKyAgICAgICAgaWYgKGVhc3kpIHsKICAgICAgICAgICAgIG1MaW5lRGlyZWN0aW9uc1tqXSA9IGxpbmVkaXJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxpbmVEaXJlY3Rpb25zW2pdID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhkaXIsIGNoZGlycywgd2lkc3RhcnQsIGNocywKKyAgICAgICAgICAgICAgICAgICAgd2lkc3RhcnQsIGVuZCAtIHN0YXJ0KTsKIAogICAgICAgICAgICAgLy8gSWYgZWxsaXBzaXplIGlzIGluIG1hcnF1ZWUgbW9kZSwgZG8gbm90IGFwcGx5IGVsbGlwc2lzIG9uIHRoZSBmaXJzdCBsaW5lCiAgICAgICAgICAgICBpZiAoZWxsaXBzaXplICE9IG51bGwgJiYgKGVsbGlwc2l6ZSAhPSBUZXh0VXRpbHMuVHJ1bmNhdGVBdC5NQVJRVUVFIHx8IGogIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjYWxjdWxhdGVFbGxpcHNpcyhzdGFydCwgZW5kLCB3aWR0aHMsIHdpZHN0YXJ0LCB3aWRvZmYsCisgICAgICAgICAgICAgICAgY2FsY3VsYXRlRWxsaXBzaXMoc3RhcnQsIGVuZCwgd2lkdGhzLCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpc3dpZHRoLCBlbGxpcHNpemUsIGosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHdpZHRoLCBwYWludCk7CiAgICAgICAgICAgICB9CkBAIC0xMTQyLDcgKzc1Miw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUVsbGlwc2lzKGludCBsaW5lc3RhcnQsIGludCBsaW5lZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LCBpbnQgd2lkb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdmFpbCwgVGV4dFV0aWxzLlRydW5jYXRlQXQgd2hlcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgbGVuID0gbGluZWVuZCAtIGxpbmVzdGFydDsKQEAgLTExNjIsNyArNzcyLDcgQEAKICAgICAgICAgICAgIGludCBpOwogCiAgICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpIC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE3OCw3ICs3ODgsNyBAQAogICAgICAgICAgICAgaW50IGk7CiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTk1LDcgKzgwNSw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7CiAgICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHJzdW0gPiByYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjA2LDcgKzgxNiw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IGxhdmFpbCA9IGF2YWlsIC0gZWxsaXBzaXN3aWQgLSByc3VtOwogICAgICAgICAgICAgZm9yIChsZWZ0ID0gMDsgbGVmdCA8IHJpZ2h0OyBsZWZ0KyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2xlZnQgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tsZWZ0ICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBsc3VtID4gbGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIyMyw3ICs4MzMsNyBAQAogICAgICAgICBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgRUxMSVBTSVNfQ09VTlRdID0gZWxsaXBzaXNDb3VudDsKICAgICB9CiAKLSAgICAvLyBPdmVycmlkZSB0aGUgYmFzZWNsYXNzIHNvIHdlIGNhbiBkaXJlY3RseSBhY2Nlc3Mgb3VyIG1lbWJlcnMsCisgICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3Mgc28gd2UgY2FuIGRpcmVjdGx5IGFjY2VzcyBvdXIgbWVtYmVycywKICAgICAvLyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgLy8gVGhlIGxvZ2ljIG1pcnJvcnMgdGhhdCBvZiBMYXlvdXQuZ2V0TGluZUZvclZlcnRpY2FsCiAgICAgLy8gRklYTUU6IEl0IG1heSBiZSBmYXN0ZXIgdG8gZG8gYSBsaW5lYXIgc2VhcmNoIGZvciBsYXlvdXRzIHdpdGhvdXQgbWFueSBsaW5lcy4KQEAgLTEyNTIsMTEgKzg2MiwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVRvcChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07ICAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRMaW5lRGVzY2VudChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOyAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVN0YXJ0KGludCBsaW5lKSB7CkBAIC0xMzI5LDEzICs5MzksMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElSX1NISUZUICA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfTUFTSyAgID0gMHgyMDAwMDAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVCA9ICdcdTA1OTAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfSU5DUkVNRU5UID0gMjA7IC8vIHNhbWUgYXMgTGF5b3V0LCBidXQgdGhhdCdzIHByaXZhdGUKIAogICAgIC8qCi0gICAgICogVGhlc2UgYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gZ2VuZXJhdGUoKQorICAgICAqIFRoaXMgaXMgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBnZW5lcmF0ZSgpCiAgICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gbUNoZGlyczsKLSAgICBwcml2YXRlIGNoYXJbXSBtQ2hzOwotICAgIHByaXZhdGUgZmxvYXRbXSBtV2lkdGhzOworICAgIHByaXZhdGUgTWVhc3VyZWRUZXh0IG1NZWFzdXJlZDsKICAgICBwcml2YXRlIFBhaW50LkZvbnRNZXRyaWNzSW50IG1Gb250TWV0cmljc0ludCA9IG5ldyBQYWludC5Gb250TWV0cmljc0ludCgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzY2M0MmMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBkcmF3aW5nIGFuZCBtZWFzdXJpbmcgc3R5bGVkIHRleHQsCi0gKiBsaWtlIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0gb2JqZWN0IHdpdGgKLSAqIHtAbGluayBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFufS4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVkCi17Ci0gICAgLyoqCi0gICAgICogRHJhd3MgYW5kL29yIG1lYXN1cmVzIGEgdW5pZm9ybSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLiBObyBzcGFuIG9mCi0gICAgICogaW50ZXJlc3Qgc2hvdWxkIHN0YXJ0IG9yIGVuZCBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgcnVuIChpZiBub3QKLSAgICAgKiBkcmF3aW5nLCBjaGFyYWN0ZXIgc3BhbnMgdGhhdCBkb24ndCBhZmZlY3QgbWV0cmljcyBjYW4gYmUgaWdub3JlZCkuCi0gICAgICogTmVpdGhlciBzaG91bGQgdGhlIHJ1biBkaXJlY3Rpb24gY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSB4IHBvc2l0aW9uIGlzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRleHQuIEluIGEgcmlnaHQtdG8tbGVmdAotICAgICAqIHBhcmFncmFwaCwgdGhpcyB3aWxsIGJlIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4gUGFpbnQKLSAgICAgKiBzaG91bGQgbm90IGhhdmUgYW4gQWxpZ24gdmFsdWUgb3RoZXIgdGhhbiBMRUZUIG9yIHBvc2l0aW9uaW5nIHdpbGwgZ2V0Ci0gICAgICogY29uZnVzZWQuCi0gICAgICoKLSAgICAgKiA8cD5PbiByZXR1cm4sIHdvcmtQYWludCB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsIHBhaW50IHBsdXMgYW55Ci0gICAgICogbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IGNoYXJhY3RlciBzdHlsZXMgb24gdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSByZXR1cm5lZCB3aWR0aCBpcyBzaWduZWQgYW5kIHdpbGwgYmUgPCAwIGlmIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gaXMgcmlnaHQtdG8tbGVmdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBkcmF3VW5pZm9ybVJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLQotICAgICAgICBib29sZWFuIGhhdmVXaWR0aCA9IGZhbHNlOwotICAgICAgICBmbG9hdCByZXQgPSAwOwotICAgICAgICBDaGFyYWN0ZXJTdHlsZVtdIHNwYW5zID0gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCBDaGFyYWN0ZXJTdHlsZS5jbGFzcyk7Ci0KLSAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBYWFg6IFRoaXMgc2hvdWxkbid0IGJlIG1vZGlmeWluZyBwYWludCwgb25seSB3b3JrUGFpbnQuCi0gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBtZW1iZXJzIGJlbG9uZ2luZyB0byBUZXh0UGFpbnQgc2hvdWxkIGhhdmUgZGVmYXVsdAotICAgICAgICAvLyB2YWx1ZXMgYW55d2F5LiAgQmV0dGVyIHRvIGVuc3VyZSB0aGlzIGluIHRoZSBMYXlvdXQgY29uc3RydWN0b3IuCi0gICAgICAgIHBhaW50LmJnQ29sb3IgPSAwOwotICAgICAgICBwYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0KLQkJaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlDaGFyYWN0ZXJTdHlsZSBzcGFuID0gc3BhbnNbaV07Ci0KLQkJCQlpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgewotCQkJCQlyZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNwYW4udXBkYXRlRHJhd1N0YXRlKHdvcmtQYWludCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLSAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0bXA7Ci0gICAgICAgICAgICBpbnQgdG1wc3RhcnQsIHRtcGVuZDsKLQotICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgdG1wc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyBnZXRSZXZlcnNlIGRvZXNuJ3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIHRleHQKLSAgICAgICAgICAgICAgICB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gdGV4dDsKLSAgICAgICAgICAgICAgICB0bXBzdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIHRtcGVuZCA9IGVuZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmdDb2xvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gd29ya1BhaW50LmdldENvbG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIFBhaW50LlN0eWxlIHMgPSB3b3JrUGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKHdvcmtQYWludC5iZ0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh4IC0gcmV0LCB0b3AsIHgsIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3b3JrUGFpbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRTdHlsZShzKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKGMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSArIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0LCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQsIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoICYmICFoYXZlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gcmV0LCB0b3AsIHksIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LmRyYXcoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICByZXR1cm4gLXJldDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhZHZhbmNlIHdpZHRocyBmb3IgYSB1bmlmb3JtIGxlZnQtdG8tcmlnaHQgcnVuIG9mIHRleHQgd2l0aAotICAgICAqIG5vIHN0eWxlIGNoYW5nZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcnVuLiBJZiBhbnkgc3R5bGUgaXMgcmVwbGFjZW1lbnQKLSAgICAgKiB0ZXh0LCB0aGUgZmlyc3QgY2hhcmFjdGVyIHdpbGwgZ2V0IHRoZSB3aWR0aCBvZiB0aGUgcmVwbGFjZW1lbnQgYW5kIHRoZQotICAgICAqIHJlbWFpbmluZyBjaGFyYWN0ZXJzIHdpbGwgZ2V0IGEgd2lkdGggb2YgMC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50LCB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgYSBwYWludCB0byBtb2RpZnk7IG9uIHJldHVybiB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsCi0gICAgICogICAgICAgIHBhaW50IHBsdXMgdGhlIGVmZmVjdCBvZiBhbGwgc3BhbnMgb24gdGhlIHJ1bgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgbGltaXQgb2YgdGhlIHJ1bgotICAgICAqIEBwYXJhbSB3aWR0aHMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZSB3aWR0aHMgb2YgdGhlIGNoYXJhY3RlcnMuIE11c3QKLSAgICAgKiAgICAgICAgYmUgYXQgbGVhc3QgYSBsYXJnZSBhcyAoZW5kIC0gc3RhcnQpLgotICAgICAqIEBwYXJhbSBmbWkgRm9udE1ldHJpY3MgaW5mb3JtYXRpb247IGNhbiBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiB3aWR0aHMgcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0V2lkdGhzKFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBQYWludC5Gb250TWV0cmljc0ludCBmbWkpIHsKLSAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0KLSAgICAgICAgICAgIHRleHQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLQkJUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tpXTsKLQkJCWlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7Ci0JCQkJcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3b3JrUGFpbnQpOwotCQkJfQotCQl9Ci0JCi0gICAgICAgIGludCByZXN1bHQ7Ci0gICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3b3JrUGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHdvcmtQYWludC5nZXRUZXh0V2lkdGhzKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbmQgPiBzdGFydCkgewotICAgICAgICAgICAgICAgIHdpZHRoc1swXSA9IHdpZDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tpIC0gc3RhcnRdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVycyBhbmQvb3IgbWVhc3VyZXMgYSBkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLgotICAgICAqIFVubGlrZSB7QGxpbmsgI2RyYXdVbmlmb3JtUnVufSwgdGhpcyBjYW4gcmVuZGVyIHJ1bnMgdGhhdCBjcm9zcyBzdHlsZQotICAgICAqIGJvdW5kYXJpZXMuICBSZXR1cm5zIHRoZSBzaWduZWQgYWR2YW5jZSB3aWR0aCwgaWYgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogPHA+VGhlIHggcG9zaXRpb24gaXMgdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGV4dC4gSW4gYSByaWdodC10by1sZWZ0Ci0gICAgICogcGFyYWdyYXBoLCB0aGlzIHdpbGwgYmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0IHRvIGJlIGRyYXduLiBQYWludAotICAgICAqIHNob3VsZCBub3QgaGF2ZSBhbiBBbGlnbiB2YWx1ZSBvdGhlciB0aGFuIExFRlQgb3IgcG9zaXRpb25pbmcgd2lsbCBnZXQKLSAgICAgKiBjb25mdXNlZC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgb3B0aW1pemVzIGZvciB1bnN0eWxlZCB0ZXh0IGFuZCBzbyB3b3JrUGFpbnQgbWlnaHQgbm90IGJlCi0gICAgICogbW9kaWZpZWQgYnkgdGhpcyBjYWxsLgotICAgICAqCi0gICAgICogPHA+VGhlIHJldHVybmVkIGFkdmFuY2Ugd2lkdGggd2lsbCBiZSA8IDAgaWYgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBpcyByaWdodC10by1sZWZ0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGRyYXdEaXJlY3Rpb25hbFJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotCi0gICAgICAgIC8vIFhYWDogSXQgbG9va3MgbGlrZSBhbGwgY2FsbHMgdG8gdGhpcyBBUEkgbWF0Y2ggZGlyIGFuZCBydW5Jc1J0bCwgc28KLSAgICAgICAgLy8gaGF2aW5nIGJvdGggcGFyYW1ldGVycyBpcyByZWR1bmRhbnQgYW5kIGNvbmZ1c2luZy4KLQotICAgICAgICAvLyBmYXN0IHBhdGggZm9yIHVuc3R5bGVkIHRleHQKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCByZXQgPSAwOwotCi0gICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgLy8gWFhYOiB0aGlzIGFzc3VtZXMgZ2V0UmV2ZXJzZSBkb2Vzbid0IHR3ZWFrIHRoZSBsZW5ndGggb2YKLSAgICAgICAgICAgICAgICAvLyB0aGUgdGV4dAotICAgICAgICAgICAgICAgIGludCB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCB8fCBuZWVkV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHBhaW50Lm1lYXN1cmVUZXh0KHRtcCwgMCwgdG1wZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRtcCwgMCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSwgcGFpbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBwYWludC5tZWFzdXJlVGV4dCh0ZXh0LCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJldCAqIGRpcjsgICAvLyBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmxvYXQgb3ggPSB4OwotICAgICAgICBpbnQgbWluQXNjZW50ID0gMCwgbWF4RGVzY2VudCA9IDAsIG1pblRvcCA9IDAsIG1heEJvdHRvbSA9IDA7Ci0KLSAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotICAgICAgICBDbGFzczw/PiBkaXZpc2lvbjsKLQotICAgICAgICBpZiAoY2FudmFzID09IG51bGwpCi0gICAgICAgICAgICBkaXZpc2lvbiA9IE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3M7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRpdmlzaW9uID0gQ2hhcmFjdGVyU3R5bGUuY2xhc3M7Ci0KLSAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgZW5kLCBkaXZpc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIFhYWDogaWYgZGlyIGFuZCBydW5Jc1J0bCB3ZXJlIG5vdCB0aGUgc2FtZSwgdGhpcyB3b3VsZCBkcmF3Ci0gICAgICAgICAgICAvLyBzcGFucyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGJ1dCBubyBvbmUgYXBwZWFycyB0byBjYWxsIGl0IHRoaXMKLSAgICAgICAgICAgIC8vIHdheS4KLSAgICAgICAgICAgIHggKz0gZHJhd1VuaWZvcm1SdW4oY2FudmFzLCBzcCwgaSwgbmV4dCwgZGlyLCBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBmbWksIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbmV4dCAhPSBlbmQpOwotCi0gICAgICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmFzY2VudCA8IG1pbkFzY2VudCkKLSAgICAgICAgICAgICAgICAgICAgbWluQXNjZW50ID0gZm1pLmFzY2VudDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmRlc2NlbnQgPiBtYXhEZXNjZW50KQotICAgICAgICAgICAgICAgICAgICBtYXhEZXNjZW50ID0gZm1pLmRlc2NlbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm1pLnRvcCA8IG1pblRvcCkKLSAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gZm1pLnRvcDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmJvdHRvbSA+IG1heEJvdHRvbSkKLSAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gZm1pLmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZtaS5hc2NlbnQgPSBtaW5Bc2NlbnQ7Ci0gICAgICAgICAgICAgICAgZm1pLmRlc2NlbnQgPSBtYXhEZXNjZW50OwotICAgICAgICAgICAgICAgIGZtaS50b3AgPSBtaW5Ub3A7Ci0gICAgICAgICAgICAgICAgZm1pLmJvdHRvbSA9IG1heEJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4IC0gb3g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBhbmQgb3B0aW9uYWxseQotICAgICAqIHJldHVybnMgdGhlIHNpZ25lZCBhZHZhbmNlLiAgVW5saWtlIGRyYXdEaXJlY3Rpb25hbFJ1biwgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBhbmQgcnVuIGRpcmVjdGlvbiBjYW4gYmUgZGlmZmVyZW50LgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZsb2F0IGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0gICAgICAgIC8vIFhYWCB0aGlzIGxvZ2ljIGlzIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsCi0gICAgICAgIGlmICgoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCAmJiAhcnVuSXNSdGwpIHx8Ci0gICAgICAgICAgICAocnVuSXNSdGwgJiYgZGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgbmVlZHMgdGhlIHJlYWwgZGlyZWN0aW9uCi0gICAgICAgICAgICBmbG9hdCBjaCA9IGRyYXdEaXJlY3Rpb25hbFJ1bihudWxsLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsIGZhbHNlLCAwLCAwLCAwLCAwLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgY2ggKj0gZGlyOyAgLy8gRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgICAgIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIC1kaXIsCi0gICAgICAgICAgICAgICAgICAgIHJ1bklzUnRsLCB4ICsgY2gsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEcmF3cyBhIHJ1biBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHdpdGggaXRzCi0gICAgICogb3JpZ2luIGF0ICh4LHkpLCBpbiB0aGUgc3BlY2lmaWVkIFBhaW50LiBUaGUgb3JpZ2luIGlzIGludGVycHJldGVkIGJhc2VkCi0gICAgICogb24gdGhlIEFsaWduIHNldHRpbmcgaW4gdGhlIFBhaW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY29uc2lkZXJzIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0Ci0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5Ci0gICAgICogZHJhd3MgdGhlIHRleHQpLiBTZWUgYWxzbwotICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChDaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwKLSAgICAgKiBmbG9hdCwgUGFpbnQpfSBhbmQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1JlY3QoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsCi0gICAgICogUGFpbnQpfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSB0YXJnZXQgY2FudmFzCi0gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGV4dCB0byBkcmF3Ci0gICAgICogQHBhcmFtIGVuZCAoZW5kIC0gMSkgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0ZXh0IHRvIGRyYXcKLSAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRleHQuIFRoaXMgbXVzdCBiZQotICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXh0LkxheW91dCNESVJfTEVGVF9UT19SSUdIVH0gb3IKLSAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudGV4dC5MYXlvdXQjRElSX1JJR0hUX1RPX0xFRlR9LgotICAgICAqIEBwYXJhbSB4IFRoZSB4LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSB5IFRoZSB5LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSBwYWludCBUaGUgbWFpbiB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3QuCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBUaGUge0BsaW5rIFRleHRQYWludH0gb2JqZWN0IHVzZWQgZm9yIHRlbXBvcmFsCi0gICAgICogICAgICAgIHdvcmtzcGFjZS4KLSAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIElmIHRydWUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHdpZHRoIG9mIGRyYXduIHRleHQKLSAgICAgKiBAcmV0dXJuIFdpZHRoIG9mIHRoZSBkcmF3biB0ZXh0IGlmIG5lZWRXaWR0aCBpcyB0cnVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotICAgICAgICAvLyBGb3Igc2FmZXR5LgotICAgICAgICBkaXJlY3Rpb24gPSBkaXJlY3Rpb24gPj0gMCA/IExheW91dC5ESVJfTEVGVF9UT19SSUdIVAotICAgICAgICAgICAgICAgIDogTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUOwotCi0gICAgICAgIC8vIEhpZGUgcnVuSXNSdGwgcGFyYW1ldGVyIHNpbmNlIGl0IGlzIG1lYW5pbmdsZXNzIGZvciBleHRlcm5hbAotICAgICAgICAvLyBkZXZlbG9wZXJzLgotICAgICAgICAvLyBYWFg6IHRoZSBydW5Jc1J0bCBwcm9iYWJseSBvdWdodCB0byBiZSB0aGUgc2FtZSBhcyBkaXJlY3Rpb24sIHRoZW4KLSAgICAgICAgLy8gdGhpcyBjb3VsZCBkcmF3IHJ0bCB0ZXh0LgotICAgICAgICByZXR1cm4gZHJhd1RleHQoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXJlY3Rpb24sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIG5lZWRXaWR0aCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIGEgcnVuIG9mIGxlZnQtdG8tcmlnaHQgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLAotICAgICAqIGNvbnNpZGVyaW5nIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0IGlzIGFuCi0gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5IG1lYXN1cmVzCi0gICAgICogdGhlIHdpZHRoIG9mIHRoZSB0ZXh0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIG1haW4ge0BsaW5rIFRleHRQYWludH0gb2JqZWN0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgdGhlIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbjsKLSAgICAgKiAgICAgICAgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgdXNlZAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gc3RhcnQgbWVhc3VyaW5nCi0gICAgICogQHBhcmFtIGVuZCAxIGJleW9uZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gZm1pIEZvbnRNZXRyaWNzIGluZm9ybWF0aW9uOyBjYW4gYmUgbnVsbAotICAgICAqIEByZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSkgewotICAgICAgICByZXR1cm4gZHJhd0RpcmVjdGlvbmFsUnVuKG51bGwsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIGZtaSwgcGFpbnQsIHdvcmtQYWludCwgdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzQ4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LlRhYlN0b3BzOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpbmUgb2Ygc3R5bGVkIHRleHQsIGZvciBtZWFzdXJpbmcgaW4gdmlzdWFsIG9yZGVyIGFuZAorICogZm9yIHJlbmRlcmluZy4KKyAqCisgKiA8cD5HZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgb2J0YWluKCksIGFuZCB3aGVuIGZpbmlzaGVkIHdpdGggaXQsIHJldHVybiBpdAorICogdG8gdGhlIHBvb2wgdXNpbmcgcmVjeWNsZSgpLgorICoKKyAqIDxwPkNhbGwgc2V0IHRvIHByZXBhcmUgdGhlIGluc3RhbmNlIGZvciB1c2UsIHRoZW4gZWl0aGVyIGRyYXcsIG1lYXN1cmUsCisgKiBtZXRyaWNzLCBvciBjYXJldFRvTGVmdFJpZ2h0T2YuCisgKgorICogQGhpZGUKKyAqLworY2xhc3MgVGV4dExpbmUgeworICAgIHByaXZhdGUgVGV4dFBhaW50IG1QYWludDsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICBwcml2YXRlIGludCBtU3RhcnQ7CisgICAgcHJpdmF0ZSBpbnQgbUxlbjsKKyAgICBwcml2YXRlIGludCBtRGlyOworICAgIHByaXZhdGUgRGlyZWN0aW9ucyBtRGlyZWN0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1RhYnM7CisgICAgcHJpdmF0ZSBUYWJTdG9wcyBtVGFiczsKKyAgICBwcml2YXRlIGNoYXJbXSBtQ2hhcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGFyc1ZhbGlkOworICAgIHByaXZhdGUgU3Bhbm5lZCBtU3Bhbm5lZDsKKyAgICBwcml2YXRlIGZpbmFsIFRleHRQYWludCBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgVGV4dExpbmVbXSBjYWNoZWQgPSBuZXcgVGV4dExpbmVbM107CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IFRleHRMaW5lIGZyb20gdGhlIHNoYXJlZCBwb29sLgorICAgICAqCisgICAgICogQHJldHVybiBhbiB1bmluaXRpYWxpemVkIFRleHRMaW5lCisgICAgICovCisgICAgc3RhdGljIFRleHRMaW5lIG9idGFpbigpIHsKKyAgICAgICAgVGV4dExpbmUgdGw7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gY2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRsID0gY2FjaGVkW2ldOworICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRsID0gbmV3IFRleHRMaW5lKCk7CisgICAgICAgIExvZy52KCJUTElORSIsICJuZXc6ICIgKyB0bCk7CisgICAgICAgIHJldHVybiB0bDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgVGV4dExpbmUgYmFjayBpbnRvIHRoZSBzaGFyZWQgcG9vbC4gRG8gbm90IHVzZSB0aGlzIFRleHRMaW5lIG9uY2UKKyAgICAgKiBpdCBoYXMgYmVlbiByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gdGwgdGhlIHRleHRMaW5lCisgICAgICogQHJldHVybiBudWxsLCBhcyBhIGNvbnZlbmllbmNlIGZyb20gY2xlYXJpbmcgcmVmZXJlbmNlcyB0byB0aGUgcHJvdmlkZWQKKyAgICAgKiBUZXh0TGluZQorICAgICAqLworICAgIHN0YXRpYyBUZXh0TGluZSByZWN5Y2xlKFRleHRMaW5lIHRsKSB7CisgICAgICAgIHRsLm1UZXh0ID0gbnVsbDsKKyAgICAgICAgdGwubVBhaW50ID0gbnVsbDsKKyAgICAgICAgdGwubURpcmVjdGlvbnMgPSBudWxsOworICAgICAgICBpZiAodGwubUxlbiA8IDI1MCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKGNhY2hlZCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gdGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRleHRMaW5lIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBiYXNlIHBhaW50IGZvciB0aGUgbGluZQorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0LCBjYW4gYmUgU3R5bGVkCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgbGluZSByZWxhdGl2ZSB0byB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIGxpbmUgcmVsYXRpdmUgdG8gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBkaXJlY3Rpb25zIHRoZSBkaXJlY3Rpb25zIGluZm9ybWF0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgdGhlIGxpbmUgbWlnaHQgY29udGFpbiB0YWJzIG9yIGVtb2ppCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWJTdG9wcy4gQ2FuIGJlIG51bGwuCisgICAgICovCisgICAgdm9pZCBzZXQoVGV4dFBhaW50IHBhaW50LCBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBkaXIsCisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsIGJvb2xlYW4gaGFzVGFicywgVGFiU3RvcHMgdGFiU3RvcHMpIHsKKyAgICAgICAgbVBhaW50ID0gcGFpbnQ7CisgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsaW1pdCAtIHN0YXJ0OworICAgICAgICBtRGlyID0gZGlyOworICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcmVjdGlvbnM7CisgICAgICAgIG1IYXNUYWJzID0gaGFzVGFiczsKKyAgICAgICAgbVNwYW5uZWQgPSBudWxsOworCisgICAgICAgIGJvb2xlYW4gaGFzUmVwbGFjZW1lbnQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBtU3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgaGFzUmVwbGFjZW1lbnQgPSBtU3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcykubGVuZ3RoID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1DaGFyc1ZhbGlkID0gaGFzUmVwbGFjZW1lbnQgfHwgaGFzVGFicyB8fAorICAgICAgICAgICAgZGlyZWN0aW9ucyAhPSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVDsKKworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbUxlbikgeworICAgICAgICAgICAgICAgIG1DaGFycyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKG1MZW4pXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgbGltaXQsIG1DaGFycywgMCk7CisgICAgICAgICAgICBpZiAoaGFzUmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlc2UgYWxsIGF0IG9uY2Ugc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBhcyB3ZSBnby4KKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCByZXBsYWNlbWVudCBydW4gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBvYmplY3QtcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluZGVyIHdpdGggemVybyB3aWR0aAorICAgICAgICAgICAgICAgIC8vIG5vbi1icmVhayBzcGFjZSBha2EgQk9NLiAgQ3Vyc29yIG1vdmVtZW50IGNvZGUgc2tpcHMgdGhlc2UKKyAgICAgICAgICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBsaW1pdDsgaSA9IGluZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGluZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3Bhbm5lZC5nZXRTcGFucyhpLCBpbmV4dCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPiAwKSB7IC8vIHRyYW5zaXRpb24gaW50byBhIHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2kgLSBzdGFydF0gPSAnXHVmZmZjJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpIC0gc3RhcnQgKyAxLCBlID0gaW5leHQgLSBzdGFydDsgaiA8IGU7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gJ1x1ZmVmZic7IC8vIHVzZWQgYXMgWldOQlMsIG1hcmtzIHBvc2l0aW9ucyB0byBza2lwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRhYnMgPSB0YWJTdG9wczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBUZXh0TGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMgdG8gcmVuZGVyIG9uCisgICAgICogQHBhcmFtIHggdGhlIGxlYWRpbmcgbWFyZ2luIHBvc2l0aW9uCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICovCisgICAgdm9pZCBkcmF3KENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSkgeworICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICBkcmF3UnVuKGMsIDAsIDAsIG1MZW4sIGZhbHNlLCB4LCB0b3AsIHksIGJvdHRvbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIGRyYXdSdW4oYywgMCwgMCwgbUxlbiwgdHJ1ZSwgeCwgdG9wLCB5LCBib3R0b20sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBoID0gMDsKKyAgICAgICAgaW50W10gcnVucyA9IG1EaXJlY3Rpb25zLm1EaXJlY3Rpb25zOworICAgICAgICBSZWN0RiBlbW9qaVJlY3QgPSBudWxsOworCisgICAgICAgIGludCBsYXN0UnVuSW5kZXggPSBydW5zLmxlbmd0aCAtIDI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHJ1blN0YXJ0ID0gcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbUxlbikgeworICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9SVExfRkxBRykgIT0gMDsKKworICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgICAgICBmb3IgKGludCBqID0gbUhhc1RhYnMgPyBydW5TdGFydCA6IHJ1bkxpbWl0OyBqIDw9IHJ1bkxpbWl0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKG1IYXNUYWJzICYmIGogPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBtQ2hhcnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhkODAwICYmIGNvZGVwdCA8IDB4ZGMwMCAmJiBqICsgMSA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQobUNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBoICs9IGRyYXdSdW4oYywgaSwgc2Vnc3RhcnQsIGosIHJ1bklzUnRsLCB4K2gsIHRvcCwgeSwgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gbGFzdFJ1bkluZGV4IHx8IGogIT0gbUxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoID0gbURpciAqIG5leHRUYWIoaCAqIG1EaXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJtQXNjZW50ID0gYXNjZW50KGopOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYml0bWFwSGVpZ2h0ID0gYm0uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IC1ibUFzY2VudCAvIGJpdG1hcEhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gYm0uZ2V0V2lkdGgoKSAqIHNjYWxlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamlSZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppUmVjdC5zZXQoeCArIGgsIHkgKyBibUFzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIGggKyB3aWR0aCwgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmRyYXdCaXRtYXAoYm0sIG51bGwsIGVtb2ppUmVjdCwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG1ldHJpY3MgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpcmUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgZm9udCBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgbGluZQorICAgICAqLworICAgIGZsb2F0IG1ldHJpY3MoRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIHJldHVybiBtZWFzdXJlKG1MZW4sIGZhbHNlLCBmbWkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NpdGlvbiBvbiB0aGUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGxpbmUtcmVsYXRpdmUgY2hhcmFjdGVyIG9mZnNldCwgYmV0d2VlbiAwIGFuZCB0aGUKKyAgICAgKiBsaW5lIGxlbmd0aCwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRyYWlsaW5nIHRydWUgdG8gbWVhc3VyZSB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgICogYmVmb3JlIG9mZnNldCwgZmFsc2UgdG8gbWVhc3VyZSB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBhdCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBjaGFyYWN0ZXIsIGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4gdG8gdGhlIHJlcXVlc3RlZAorICAgICAqIGNoYXJhY3RlciBlZGdlLgorICAgICAqLworICAgIGZsb2F0IG1lYXN1cmUoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIGludCB0YXJnZXQgPSB0cmFpbGluZyA/IG9mZnNldCAtIDEgOiBvZmZzZXQ7CisgICAgICAgIGlmICh0YXJnZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGggPSAwOworCisgICAgICAgIGlmICghbUhhc1RhYnMpIHsKKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlUnVuKDAsIDAsIG9mZnNldCwgbUxlbiwgZmFsc2UsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIHRydWUsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgIGludFtdIHJ1bnMgPSBtRGlyZWN0aW9ucy5tRGlyZWN0aW9uczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgcnVuU3RhcnQgPSBydW5zW2ldOworICAgICAgICAgICAgaW50IHJ1bkxpbWl0ID0gcnVuU3RhcnQgKyAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAocnVuTGltaXQgPiBtTGVuKSB7CisgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBtTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5zW2krMV0gJiBMYXlvdXQuUlVOX1JUTF9GTEFHKSAhPSAwOworCisgICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBtSGFzVGFicyA/IHJ1blN0YXJ0IDogcnVuTGltaXQ7IGogPD0gcnVuTGltaXQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOworICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAobUhhc1RhYnMgJiYgaiA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGNoYXJzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4ZDgwMCAmJiBjb2RlcHQgPCAweGRjMDAgJiYgaiArIDEgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluU2VnbWVudCA9IHRhcmdldCA+PSBzZWdzdGFydCAmJiB0YXJnZXQgPCBqOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IChtRGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkgPT0gcnVuSXNSdGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQgJiYgYWR2YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggKz0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgb2Zmc2V0LCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBqLCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgaCArPSBhZHZhbmNlID8gdyA6IC13OworCisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoICs9IG1lYXN1cmVSdW4oaSwgc2Vnc3RhcnQsIG9mZnNldCwgaiwgcnVuSXNSdGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBtRGlyICogbmV4dFRhYihoICogbURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBibUFzY2VudCA9IGFzY2VudChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IGJtLmdldFdpZHRoKCkgKiAtYm1Bc2NlbnQgLyBibS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gbURpciAqIHdpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCAoYnV0IHBvc3NpYmx5IG11bHRpLXN0eWxlZCkgcnVuIG9mIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzIHRvIGRyYXcgb24KKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIGluZGV4IG9mIHRoaXMgZGlyZWN0aW9uYWwgcnVuCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0CisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0CisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIHggdGhlIHBvc2l0aW9uIG9mIHRoZSBydW4gdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggdmFsdWUgaXMgcmVxdWlyZWQuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4sIGJhc2VkIG9uIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBkcmF3UnVuKENhbnZhcyBjLCBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCisgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGlmICgobURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsKSB7CisgICAgICAgICAgICBmbG9hdCB3ID0gLW1lYXN1cmVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBudWxsKTsKKyAgICAgICAgICAgIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHggKyB3LCB0b3AsCisgICAgICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgYywgeCwgdG9wLAorICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgbmVlZFdpZHRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZWFzdXJlcyBhIHVuaWRpcmVjdGlvbmFsIChidXQgcG9zc2libHkgbXVsdGktc3R5bGVkKSBydW4gb2YgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gbWVhc3VyZSB0bywgYmV0d2VlbiBzdGFydCBhbmQgbGltaXQgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3RlZAorICAgICAqIHJ1biwgY2FuIGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBydW4gdG8gdGhlIGxlYWRpbmcgZWRnZQorICAgICAqIG9mIHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0LCBiYXNlZCBvbiB0aGUgcnVuIChub3QgcGFyYWdyYXBoKSBkaXJlY3Rpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1lYXN1cmVSdW4oaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgb2Zmc2V0LCBsaW1pdCwgcnVuSXNSdGwsIG51bGwsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgZm1pLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrIHRoZSBjdXJzb3IgdGhyb3VnaCB0aGlzIGxpbmUsIHNraXBwaW5nIGNvbmp1bmN0cyBhbmQKKyAgICAgKiB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSB3YWxrIHRoZSBjdXJzb3Igb2ZmIHRoZSBlbmRzIG9mIHRoZSBsaW5lCisgICAgICogc2luY2UgaXQgZG9lcyBub3Qga25vdyBhYm91dCBhbnkgc2hhcGluZyBvbiB0aGUgcHJldmlvdXMvZm9sbG93aW5nIGxpbmUKKyAgICAgKiB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBDYWxsZXJzIG11c3QgZWl0aGVyIGF2b2lkIHRoZXNlCisgICAgICogc2l0dWF0aW9ucyBvciBoYW5kbGUgdGhlIHJlc3VsdCBzcGVjaWFsbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLCBiZXR3ZWVuIDAgYW5kIHRoZQorICAgICAqIGxlbmd0aCBvZiB0aGUgbGluZSwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRvTGVmdCB0cnVlIGlmIHRoZSBjYXJldCBpcyBtb3ZpbmcgdG8gdGhlIGxlZnQuCisgICAgICogQHJldHVybiB0aGUgbmV3IG9mZnNldC4gIElmIGl0IGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIGxpbmUsIHRoZSBwcmV2aW91cy9mb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgZXhhbWluZWQgdG8gZ2V0IHRoZQorICAgICAqIGFjdHVhbCBvZmZzZXQuCisgICAgICovCisgICAgaW50IGdldE9mZnNldFRvTGVmdFJpZ2h0T2YoaW50IGN1cnNvciwgYm9vbGVhbiB0b0xlZnQpIHsKKyAgICAgICAgLy8gMSkgVGhlIGNhcmV0IG1hcmtzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgYSBjaGFyYWN0ZXIuIFRoZSBjaGFyYWN0ZXIKKyAgICAgICAgLy8gbG9naWNhbGx5IGJlZm9yZSBpdCBtaWdodCBiZSBvbiBhIGRpZmZlcmVudCBsZXZlbCwgYW5kIHRoZSBhY3RpdmUgY2FyZXQKKyAgICAgICAgLy8gcG9zaXRpb24gaXMgb24gdGhlIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuIElmIHRoYXQgY2hhcmFjdGVyCisgICAgICAgIC8vIHdhcyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLCB0aGUgY2FyZXQgaXMgb24gaXRzIHRyYWlsaW5nIGVkZ2UuCisgICAgICAgIC8vIDIpIFRha2UgdGhpcyBjaGFyYWN0ZXIvZWRnZSBhbmQgbW92ZSBpdCBpbiB0aGUgaW5kaWNhdGVkIGRpcmVjdGlvbi4KKyAgICAgICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBuZXcgY2hhcmFjdGVyIGFuZCBhIG5ldyBlZGdlLgorICAgICAgICAvLyAzKSBUaGlzIHBvc2l0aW9uIGlzIGJldHdlZW4gdHdvIHZpc3VhbGx5IGFkamFjZW50IGNoYXJhY3RlcnMuICBPbmUgb2YKKyAgICAgICAgLy8gdGhlc2UgbWlnaHQgYmUgYXQgYSBsb3dlciBsZXZlbC4gIFRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlCisgICAgICAgIC8vIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuCisgICAgICAgIC8vIDQpIElmIHRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciwKKyAgICAgICAgLy8gdGhlIG5ldyBjYXJldCBwb3NpdGlvbiBpcyB0aGUgZm9sbG93aW5nIGxvZ2ljYWwgY2hhcmFjdGVyLCBlbHNlIGl0CisgICAgICAgIC8vIGlzIHRoZSBjaGFyYWN0ZXIuCisKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IDA7CisgICAgICAgIGludCBsaW5lRW5kID0gbUxlbjsKKyAgICAgICAgYm9vbGVhbiBwYXJhSXNSdGwgPSBtRGlyID09IC0xOworICAgICAgICBpbnRbXSBydW5zID0gbURpcmVjdGlvbnMubURpcmVjdGlvbnM7CisKKyAgICAgICAgaW50IHJ1bkluZGV4LCBydW5MZXZlbCA9IDAsIHJ1blN0YXJ0ID0gbGluZVN0YXJ0LCBydW5MaW1pdCA9IGxpbmVFbmQsIG5ld0NhcmV0ID0gLTE7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAoY3Vyc29yID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSAtMjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IgPT0gbGluZUVuZCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSBydW5zLmxlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGaXJzdCwgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIHdpdGgKKyAgICAgICAgICAvLyB0aGUgYWN0aXZlIGNhcmV0LgorICAgICAgICAgIGZvciAocnVuSW5kZXggPSAwOyBydW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBydW5JbmRleCArPSAyKSB7CisgICAgICAgICAgICBydW5TdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbcnVuSW5kZXhdOworICAgICAgICAgICAgaWYgKGN1cnNvciA+PSBydW5TdGFydCkgeworICAgICAgICAgICAgICBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbcnVuSW5kZXgrMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjdXJzb3IgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gKHJ1bnNbcnVuSW5kZXgrMV0gPj4+IExheW91dC5SVU5fTEVWRUxfU0hJRlQpICYKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gcnVuU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYXJldCBpcyBvbiBhIHJ1biBib3VuZGFyeSwgc2VlIGlmIHdlIHNob3VsZAorICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWwgY2hhcmFjdGVyIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICBpbnQgcHJldlJ1bkluZGV4LCBwcmV2UnVuTGV2ZWwsIHByZXZSdW5TdGFydCwgcHJldlJ1bkxpbWl0OworICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGN1cnNvciAtIDE7CisgICAgICAgICAgICAgICAgICBmb3IgKHByZXZSdW5JbmRleCA9IDA7IHByZXZSdW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBwcmV2UnVuSW5kZXggKz0gMikgeworICAgICAgICAgICAgICAgICAgICBwcmV2UnVuU3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW3ByZXZSdW5JbmRleF07CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gcHJldlJ1blN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gcHJldlJ1blN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1bnNbcHJldlJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IHByZXZSdW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxldmVsID0gKHJ1bnNbcHJldlJ1bkluZGV4KzFdID4+PiBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MZXZlbCA8IHJ1bkxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZyb20gbG9naWNhbGx5IHByZXZpb3VzIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5kZXggPSBwcmV2UnVuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gcHJldlJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydCA9IHByZXZSdW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBwcmV2UnVuTGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gY2FyZXQgbWlnaHQgYmUgPT0gbGluZUVuZC4gIFRoaXMgaXMgZ2VuZXJhbGx5IGEgc3BhY2Ugb3IgcGFyYWdyYXBoCisgICAgICAgICAgLy8gc2VwYXJhdG9yIGFuZCBoYXMgYW4gYXNzb2NpYXRlZCBydW4sIGJ1dCBtaWdodCBiZSB0aGUgZW5kIG9mCisgICAgICAgICAgLy8gdGV4dCwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0LiAgSWYgdGhhdCBoYXBwZW5zLCB3ZSByYW4gb2ZmIHRoZQorICAgICAgICAgIC8vIGVuZCBvZiB0aGUgcnVuIGxpc3QsIGFuZCBydW5JbmRleCA9PSBydW5zLmxlbmd0aC4gIEluIHRoaXMgY2FzZSwKKyAgICAgICAgICAvLyB3ZSBhcmUgYXQgYSBydW4gYm91bmRhcnkgc28gd2Ugc2tpcCB0aGUgYmVsb3cgdGVzdC4KKyAgICAgICAgICBpZiAocnVuSW5kZXggIT0gcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5MZXZlbCAmIDB4MSkgIT0gMDsKKyAgICAgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IHJ1bklzUnRsOworICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IChhZHZhbmNlID8gcnVuTGltaXQgOiBydW5TdGFydCkgfHwgYWR2YW5jZSAhPSB0cmFpbGluZykgeworICAgICAgICAgICAgICAgICAgLy8gTW92aW5nIHdpdGhpbiBvciBpbnRvIHRoZSBydW4sIHNvIHdlIGNhbiBtb3ZlIGxvZ2ljYWxseS4KKyAgICAgICAgICAgICAgICAgIG5ld0NhcmV0ID0gZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIocnVuSW5kZXgsIHJ1blN0YXJ0LCBydW5MaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSXNSdGwsIGN1cnNvciwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3IHBvc2l0aW9uIGlzIGludGVybmFsIHRvIHRoZSBydW4sIHdlJ3JlIGF0IHRoZSBzdHJvbmcKKyAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFscmVhZHkgc28gd2UncmUgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FyZXQgIT0gKGFkdmFuY2UgPyBydW5MaW1pdCA6IHJ1blN0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDYXJldDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIG5ld0NhcmV0IGlzIC0xLCB3ZSdyZSBzdGFydGluZyBhdCBhIHJ1biBib3VuZGFyeSBhbmQgY3Jvc3NpbmcKKyAgICAgICAgLy8gaW50byBhbm90aGVyIHJ1bi4gT3RoZXJ3aXNlIHdlJ3ZlIGFycml2ZWQgYXQgYSBydW4gYm91bmRhcnksIGFuZAorICAgICAgICAvLyBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggY2hhcmFjdGVyIHRvIGF0dGFjaCB0by4gIE5vdGUgd2UgbWlnaHQKKyAgICAgICAgLy8gbmVlZCB0byBydW4gdGhpcyB0d2ljZSwgaWYgd2UgY3Jvc3MgYSBydW4gYm91bmRhcnkgYW5kIGVuZCB1cCBhdAorICAgICAgICAvLyBhbm90aGVyIHJ1biBib3VuZGFyeS4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gcGFyYUlzUnRsOworICAgICAgICAgIGludCBvdGhlclJ1bkluZGV4ID0gcnVuSW5kZXggKyAoYWR2YW5jZSA/IDIgOiAtMik7CisgICAgICAgICAgaWYgKG90aGVyUnVuSW5kZXggPj0gMCAmJiBvdGhlclJ1bkluZGV4IDwgcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBvdGhlclJ1blN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tvdGhlclJ1bkluZGV4XTsKKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxpbWl0ID0gb3RoZXJSdW5TdGFydCArCisgICAgICAgICAgICAocnVuc1tvdGhlclJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAob3RoZXJSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICBvdGhlclJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxldmVsID0gKHJ1bnNbb3RoZXJSdW5JbmRleCsxXSA+Pj4gTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkgJgorICAgICAgICAgICAgICAgIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgIGJvb2xlYW4gb3RoZXJSdW5Jc1J0bCA9IChvdGhlclJ1bkxldmVsICYgMSkgIT0gMDsKKworICAgICAgICAgICAgYWR2YW5jZSA9IHRvTGVmdCA9PSBvdGhlclJ1bklzUnRsOworICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBnZXRPZmZzZXRCZWZvcmVBZnRlcihvdGhlclJ1bkluZGV4LCBvdGhlclJ1blN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSdW5MaW1pdCwgb3RoZXJSdW5Jc1J0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPyBvdGhlclJ1blN0YXJ0IDogb3RoZXJSdW5MaW1pdCwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IChhZHZhbmNlID8gb3RoZXJSdW5MaW1pdCA6IG90aGVyUnVuU3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENyb3NzZWQgYW5kIGVuZGVkIHVwIGF0IGEgbmV3IGJvdW5kYXJ5LAorICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXQgYSBzZWNvbmQgYW5kIGZpbmFsIHRpbWUuCisgICAgICAgICAgICAgICAgICAgIHJ1bkluZGV4ID0gb3RoZXJSdW5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcnVuTGV2ZWwgPSBvdGhlclJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBuZXcgY2FyZXQgaXMgYXQgYSBib3VuZGFyeS4KKyAgICAgICAgICAgIGlmIChvdGhlclJ1bkxldmVsIDwgcnVuTGV2ZWwpIHsKKyAgICAgICAgICAgICAgLy8gVGhlIHN0cm9uZyBjaGFyYWN0ZXIgaXMgaW4gdGhlIG90aGVyIHJ1bi4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gb3RoZXJSdW5TdGFydCA6IG90aGVyUnVuTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobmV3Q2FyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgLy8gV2UncmUgd2Fsa2luZyBvZmYgdGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoZSBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgLy8gbGV2ZWwgaXMgYWx3YXlzIGVxdWFsIHRvIG9yIGxvd2VyIHRoYW4gYW55IGludGVybmFsIGxldmVsLCBzbworICAgICAgICAgICAgICAvLyB0aGUgYm91bmRhcmllcyBnZXQgdGhlIHN0cm9uZyBjYXJldC4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gbUxlbiArIDEgOiAtMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gRWxzZSB3ZSd2ZSBhcnJpdmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGF0J3MgYSBzdHJvbmcgcG9zaXRpb24uCisgICAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBhcnJpdmVkIGhlcmUgYnkgY3Jvc3Npbmcgb3ZlciBhIHJ1biB3aXRoIG5vIGludGVybmFsCisgICAgICAgICAgLy8gYnJlYWtzIGFuZCBkcm9wcGluZyBvdXQgb2YgdGhlIGFib3ZlIGxvb3AgYmVmb3JlIGFkdmFuY2luZyBvbmUgZmluYWwKKyAgICAgICAgICAvLyB0aW1lLCBzbyByZXNldCB0aGUgY2FyZXQuCisgICAgICAgICAgLy8gTm90ZSwgd2UgdXNlICc8PScgYmVsb3cgdG8gaGFuZGxlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBvbmx5IHJ1bgorICAgICAgICAgIC8vIG9uIHRoZSBsaW5lIGlzIGEgY291bnRlci1kaXJlY3Rpb25hbCBydW4uICBJZiB3ZSdyZSBub3QgYWR2YW5jaW5nLAorICAgICAgICAgIC8vIHdlIGNhbiBlbmQgdXAgYXQgdGhlICdsaW5lRW5kJyBwb3NpdGlvbiBidXQgdGhlIGNhcmV0IHdlIHdhbnQgaXMgYXQKKyAgICAgICAgICAvLyB0aGUgbGluZVN0YXJ0LgorICAgICAgICAgIGlmIChuZXdDYXJldCA8PSBsaW5lRW5kKSB7CisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0NhcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdmFsaWQgb2Zmc2V0IHdpdGhpbiB0aGlzIGRpcmVjdGlvbmFsIHJ1biwgc2tpcHBpbmcKKyAgICAgKiBjb25qdW5jdHMgYW5kIHplcm8td2lkdGggY2hhcmFjdGVycy4gIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdG8gd2FsaworICAgICAqIG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5lLCBzaW5jZSB0aGUgcmV0dXJuZWQgdmFsdWVzIG1pZ2h0IG5vdCBiZSB2YWxpZAorICAgICAqIG9uIG5laWdoYm9yaW5nIGxpbmVzLiAgSWYgdGhlIHJldHVybmVkIG9mZnNldCBpcyBsZXNzIHRoYW4gemVybyBvcgorICAgICAqIGdyZWF0ZXIgdGhhbiB0aGUgbGluZSBsZW5ndGgsIHRoZSBvZmZzZXQgc2hvdWxkIGJlIHJlY29tcHV0ZWQgb24gdGhlCisgICAgICogcHJlY2VkaW5nIG9yIGZvbGxvd2luZyBsaW5lLCByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBydW5TdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5MaW1pdCB0aGUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEBwYXJhbSBhZnRlciB0cnVlIGlmIHRoZSBuZXcgb2Zmc2V0IHNob3VsZCBsb2dpY2FsbHkgZm9sbG93IHRoZSBwcm92aWRlZAorICAgICAqIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIG5ldyBvZmZzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRPZmZzZXRCZWZvcmVBZnRlcihpbnQgcnVuSW5kZXgsIGludCBydW5TdGFydCwgaW50IHJ1bkxpbWl0LAorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCwgaW50IG9mZnNldCwgYm9vbGVhbiBhZnRlcikgeworCisgICAgICAgIGlmIChydW5JbmRleCA8IDAgfHwgb2Zmc2V0ID09IChhZnRlciA/IG1MZW4gOiAwKSkgeworICAgICAgICAgICAgLy8gV2Fsa2luZyBvZmYgZW5kIG9mIGxpbmUuICBTaW5jZSB3ZSBkb24ndCBrbm93CisgICAgICAgICAgICAvLyB3aGF0IGN1cnNvciBwb3NpdGlvbnMgYXJlIGF2YWlsYWJsZSBvbiBvdGhlciBsaW5lcywgd2UgY2FuJ3QKKyAgICAgICAgICAgIC8vIHJldHVybiBhY2N1cmF0ZSB2YWx1ZXMuICBUaGVzZSBhcmUgYSBndWVzcy4KKyAgICAgICAgICAgIGlmIChhZnRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCArIG1TdGFydCkgLSBtU3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgb2Zmc2V0ICsgbVN0YXJ0KSAtIG1TdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIFRleHRQYWludCB3cCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgIGludCBzcGFuU3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgaW50IHNwYW5MaW1pdDsKKyAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHNwYW5MaW1pdCA9IHJ1bkxpbWl0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHRhcmdldCA9IGFmdGVyID8gb2Zmc2V0ICsgMSA6IG9mZnNldDsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IG1TdGFydCArIHJ1bkxpbWl0OworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzcGFuTGltaXQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgc3BhblN0YXJ0LCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpIC0gbVN0YXJ0OworICAgICAgICAgICAgICAgIGlmIChzcGFuTGltaXQgPj0gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGFuU3RhcnQgPSBzcGFuTGltaXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKworICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3BhbnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZXBsYWNlbWVudCBzcGFuLCB3ZSdyZSBtb3ZpbmcgZWl0aGVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvciBlbmQgb2YgdGhpcyBzcGFuLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXIgPyBzcGFuTGltaXQgOiBzcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IGZsYWdzID0gcnVuSXNSdGwgPyBQYWludC5ESVJFQ1RJT05fUlRMIDogUGFpbnQuRElSRUNUSU9OX0xUUjsKKyAgICAgICAgaW50IGN1cnNvck9wdCA9IGFmdGVyID8gUGFpbnQuQ1VSU09SX0FGVEVSIDogUGFpbnQuQ1VSU09SX0JFRk9SRTsKKyAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICByZXR1cm4gd3AuZ2V0VGV4dFJ1bkN1cnNvcihtQ2hhcnMsIHNwYW5TdGFydCwgc3BhbkxpbWl0IC0gc3BhblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHdwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBmbGFncywgbVN0YXJ0ICsgb2Zmc2V0LCBjdXJzb3JPcHQpIC0gbVN0YXJ0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgbWVhc3VyaW5nIGFuZCByZW5kZXJpbmcgdGV4dC4gIFRoZSB0ZXh0IG11c3QKKyAgICAgKiBub3QgaW5jbHVkZSBhIHRhYiBvciBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cCB0aGUgd29ya2luZyBwYWludAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiByZW5kZXJpbmcgaXMgbm90IG5lZWRlZAorICAgICAqIEBwYXJhbSB4IHRoZSBlZGdlIG9mIHRoZSBydW4gY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCBvZiB0aGUgcnVuIGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVRleHQoVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwKKyAgICAgICAgICAgIENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgIEZvbnRNZXRyaWNzSW50IGZtaSwgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCBydW5MZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpZiAobmVlZFdpZHRoIHx8IChjICE9IG51bGwgJiYgKHdwLmJnQ29sb3IgIT0gMCB8fCBydW5Jc1J0bCkpKSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IFBhaW50LkRJUkVDVElPTl9SVEwgOiBQYWludC5ESVJFQ1RJT05fTFRSOworICAgICAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgc3RhcnQsIHJ1bkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwgZmxhZ3MsIG51bGwsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBtU3RhcnQ7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBkZWx0YSArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKyBlbmQsIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbnVsbCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdwLmdldEZvbnRNZXRyaWNzSW50KGZtaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKKyAgICAgICAgICAgICAgICB4IC09IHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdwLmJnQ29sb3IgIT0gMCkgeworICAgICAgICAgICAgICAgIGludCBjb2xvciA9IHdwLmdldENvbG9yKCk7CisgICAgICAgICAgICAgICAgUGFpbnQuU3R5bGUgcyA9IHdwLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgICAgd3Auc2V0Q29sb3Iod3AuYmdDb2xvcik7CisgICAgICAgICAgICAgICAgd3Auc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7CisKKyAgICAgICAgICAgICAgICBjLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3cCk7CisKKyAgICAgICAgICAgICAgICB3cC5zZXRTdHlsZShzKTsKKyAgICAgICAgICAgICAgICB3cC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyYXdUZXh0UnVuKGMsIHdwLCBzdGFydCwgZW5kLCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHJ1bklzUnRsLAorICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd3AuYmFzZWxpbmVTaGlmdCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIG1lYXN1cmluZyBhbmQgcmVuZGVyaW5nIGEgcmVwbGFjZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQgdGhlIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIHdwIHRoZSB3b3JrIHBhaW50CisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiBub3QgcmVuZGVyaW5nCisgICAgICogQHBhcmFtIHggdGhlIGVkZ2Ugb2YgdGhlIHJlcGxhY2VtZW50IGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggb2YgdGhlIHJlcGxhY2VtZW50IGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVJlcGxhY2VtZW50KFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCwgVGV4dFBhaW50IHdwLAorICAgICAgICAgICAgaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgQ2FudmFzIGMsCisgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwgRm9udE1ldHJpY3NJbnQgZm1pLAorICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCB0ZXh0U3RhcnQgPSBtU3RhcnQgKyBzdGFydDsKKyAgICAgICAgaW50IHRleHRMaW1pdCA9IG1TdGFydCArIGxpbWl0OworCisgICAgICAgIGlmIChuZWVkV2lkdGggfHwgKGMgIT0gbnVsbCAmJiBydW5Jc1J0bCkpIHsKKyAgICAgICAgICAgIHJldCA9IHJlcGxhY2VtZW50LmdldFNpemUod3AsIG1UZXh0LCB0ZXh0U3RhcnQsIHRleHRMaW1pdCwgZm1pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgeworICAgICAgICAgICAgICAgIHggLT0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbGFjZW1lbnQuZHJhdyhjLCBtVGV4dCwgdGV4dFN0YXJ0LCB0ZXh0TGltaXQsCisgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3cCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGEgdW5pZGlyZWN0aW9uYWwgcnVuLiAgVGhlIHJ1biBtdXN0IG5vdAorICAgICAqIGNvbnRhaW4gdGFicyBvciBlbW9qaSBidXQgY2FuIGNvbnRhaW4gc3R5bGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBtZWFzdXJlTGltaXQgdGhlIG9mZnNldCB0byBtZWFzdXJlIHRvLCBiZXR3ZWVuIHN0YXJ0IGFuZCBsaW1pdCBpbmNsdXNpdmUKKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSB4IHRoZSBlbmQgb2YgdGhlIHJ1biBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIGlzIHJlcXVpcmVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4gYmFzZWQgb24gdGhlIHJ1biBkaXJlY3Rpb247IG9ubHkKKyAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlUnVuKGludCBydW5JbmRleCwgaW50IHN0YXJ0LCBpbnQgbWVhc3VyZUxpbWl0LAorICAgICAgICAgICAgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBDYW52YXMgYywgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksCisgICAgICAgICAgICBpbnQgYm90dG9tLCBGb250TWV0cmljc0ludCBmbWksIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgLy8gU2hhcGluZyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCBjb250ZXh0IHVwIHRvIG1ldHJpYyBib3VuZGFyaWVzLAorICAgICAgICAvLyBidXQgcmVuZGVyaW5nIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IGNoYXJhY3RlciBzdHlsZSBib3VuZGFyaWVzLgorICAgICAgICAvLyBTbyB3ZSBpdGVyYXRlIHRocm91Z2ggbWV0cmljIHJ1bnMgdG8gZ2V0IG1ldHJpYyBib3VuZHMsCisgICAgICAgIC8vIHRoZW4gd2l0aGluIGVhY2ggbWV0cmljIHJ1biBpdGVyYXRlIHRocm91Z2ggY2hhcmFjdGVyIHN0eWxlIHJ1bnMKKyAgICAgICAgLy8gZm9yIHRoZSBydW4gYm91bmRzLgorICAgICAgICBmbG9hdCBveCA9IHg7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBtZWFzdXJlTGltaXQ7IGkgPSBpbmV4dCkgeworICAgICAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgICAgICBpbnQgbWxpbWl0OworICAgICAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbmV4dCA9IGxpbWl0OworICAgICAgICAgICAgICAgIG1saW1pdCA9IG1lYXN1cmVMaW1pdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5leHQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgaSwgbVN0YXJ0ICsgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKSAtIG1TdGFydDsKKworICAgICAgICAgICAgICAgIG1saW1pdCA9IGluZXh0IDwgbWVhc3VyZUxpbWl0ID8gaW5leHQgOiBtZWFzdXJlTGltaXQ7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMobVN0YXJ0ICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIG1saW1pdCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYSByZXBsYWNlbWVudCB0aGF0IHVzZXMgdGhlIGRyYXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSwgb3RoZXJ3aXNlIG1lYXN1cmUgc3RhdGUgd291bGQgc3VmZmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZURyYXdTdGF0ZSh3cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVSZXBsYWNlbWVudChyZXBsYWNlbWVudCwgd3AsIHJ1bkluZGV4LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbGltaXQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsIHksIGJvdHRvbSwgZm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbWxpbWl0IDwgbWVhc3VyZUxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCB8fCBjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IGhhbmRsZVRleHQod3AsIGksIG1saW1pdCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICB5LCBib3R0b20sIGZtaSwgbmVlZFdpZHRoIHx8IG1saW1pdCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpLCBqbmV4dDsgaiA8IG1saW1pdDsgaiA9IGpuZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGpuZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgbWxpbWl0LCBDaGFyYWN0ZXJTdHlsZS5jbGFzcykgLSBtU3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGVbXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgam5leHQsIENoYXJhY3RlclN0eWxlLmNsYXNzKTsKKworICAgICAgICAgICAgICAgICAgICB3cC5zZXQobVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzcGFucy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGUgc3BhbiA9IHNwYW5zW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVEcmF3U3RhdGUod3ApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVUZXh0KHdwLCBqLCBqbmV4dCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBmbWksIG5lZWRXaWR0aCB8fCBqbmV4dCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHggLSBveDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSB0ZXh0IHJ1biB3aXRoIHRoZSBzZXQtdXAgcGFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzCisgICAgICogQHBhcmFtIHdwIHRoZSBwYWludCB1c2VkIHRvIHJlbmRlciB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgY29udGV4dCBmb3IgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBjb250ZXh0RW5kIHRoZSBlbmQgb2YgdGhlIGNvbnRleHQgZm9yIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUgb2YgdGhlIHJ1bgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHkpIHsKKworICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IENhbnZhcy5ESVJFQ1RJT05fUlRMIDogQ2FudmFzLkRJUkVDVElPTl9MVFI7CisgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obUNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRTdGFydCwgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgd3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRlbHRhID0gbVN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtVGV4dCwgZGVsdGEgKyBzdGFydCwgZGVsdGEgKyBlbmQsCisgICAgICAgICAgICAgICAgICAgIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCB3cCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQuICBUaGlzIGlzIHVzZWQgZm9yIHNjYWxpbmcKKyAgICAgKiBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3MgdGhlIGxpbmUtcmVsYXRpdmUgcG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQKKyAgICAgKi8KKyAgICBmbG9hdCBhc2NlbnQoaW50IHBvcykgeworICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWludC5hc2NlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHBvcyArPSBtU3RhcnQ7CisgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKHBvcywgcG9zICsgMSwKKyAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhaW50LmFzY2VudCgpOworICAgICAgICB9CisKKyAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgd3Auc2V0KG1QYWludCk7CisgICAgICAgIGZvciAoTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuIDogc3BhbnMpIHsKKyAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd3AuYXNjZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0YWIgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCB0aGUgKHVuc2lnbmVkKSBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcmV0dXJuIHRoZSAodW5zaWduZWQpIHRhYiBwb3NpdGlvbiBhZnRlciB0aGlzIG9mZnNldAorICAgICAqLworICAgIGZsb2F0IG5leHRUYWIoZmxvYXQgaCkgeworICAgICAgICBpZiAobVRhYnMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWJzLm5leHRUYWIoaCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRhYlN0b3BzLm5leHREZWZhdWx0U3RvcChoLCBUQUJfSU5DUkVNRU5UKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEKaW5kZXggODY3NWQwNS4uNzc0ODI2NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhCkBAIC0xNywxMiArMTcsMTEgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BYnNvbHV0ZVNpemVTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5CYWNrZ3JvdW5kQ29sb3JTcGFuOwpAQCAtNDUsMTAgKzQ0LDggQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJpbnRlcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogcHVibGljIGNsYXNzIFRleHRVdGlscyB7CiAgICAgcHJpdmF0ZSBUZXh0VXRpbHMoKSB7IC8qIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKi8gfQpAQCAtOTgzLDcgKzk4MCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgdGV4dCBpZiBpdCBmaXRzIGluIHRoZSBzcGVjaWZpZWQgd2lkdGgKICAgICAgKiBnaXZlbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIFBhaW50LAotICAgICAqIG9yLCBpZiBpdCBkb2VzIG5vdCBmaXQsIGEgY29weSB3aXRoIGVsbGlwc2lzIGNoYXJhY3RlciBhZGRlZCAKKyAgICAgKiBvciwgaWYgaXQgZG9lcyBub3QgZml0LCBhIGNvcHkgd2l0aCBlbGxpcHNpcyBjaGFyYWN0ZXIgYWRkZWQKICAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGVkZ2Ugb3IgY2VudGVyLgogICAgICAqIElmIDxjb2RlPnByZXNlcnZlTGVuZ3RoPC9jb2RlPiBpcyBzcGVjaWZpZWQsIHRoZSByZXR1cm5lZCBjb3B5CiAgICAgICogd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvLXdpZHRoIHNwYWNlcyB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKQEAgLTk5Miw3ICs5ODksNyBAQAogICAgICAqIHJlcG9ydCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZWxsaXBzaXplZCByYW5nZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBlbGxpcHNpemUoQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGF2YWlsLCBUcnVuY2F0ZUF0IHdoZXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGxpcHNpemVDYWxsYmFjayBjYWxsYmFjaykgewpAQCAtMTAwMywxMyArMTAwMCwxMiBAQAogCiAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwogCi0gICAgICAgIC8vIFVzZSBQYWludC5icmVha1RleHQoKSBmb3IgdGhlIG5vbi1TcGFubmVkIGNhc2UgdG8gYXZvaWQgaGF2aW5nCi0gICAgICAgIC8vIHRvIGFsbG9jYXRlIG1lbW9yeSBhbmQgYWNjdW11bGF0ZSB0aGUgY2hhcmFjdGVyIHdpZHRocyBvdXJzZWx2ZXMuCisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gc2V0UGFyYShtdCwgcGFpbnQsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CiAKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCB3aWQgPSBwLm1lYXN1cmVUZXh0KHRleHQsIDAsIGxlbik7Ci0KLSAgICAgICAgICAgIGlmICh3aWQgPD0gYXZhaWwpIHsKKyAgICAgICAgICAgIGlmICh3aWR0aCA8PSBhdmFpbCkgewogICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgMCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAxNywyNTAgKzEwMTMsNjkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwLm1lYXN1cmVUZXh0KHNFbGxpcHNpcyk7CisgICAgICAgICAgICAvLyBYWFggYXNzdW1lcyBlbGxpcHNpcyBzdHJpbmcgZG9lcyBub3QgcmVxdWlyZSBzaGFwaW5nIGFuZAorICAgICAgICAgICAgLy8gaXMgdW5hZmZlY3RlZCBieSBzdHlsZQorICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwYWludC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOworICAgICAgICAgICAgYXZhaWwgLT0gZWxsaXBzaXN3aWQ7CiAKLSAgICAgICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gb2J0YWluKGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjeWNsZShidWYpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LlNUQVJUKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4gLSBmaXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgMCwgbGVuIC0gZml0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc0VsbGlwc2lzICsgdGV4dC50b1N0cmluZygpLnN1YnN0cmluZyhsZW4gLSBmaXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbGVuOworICAgICAgICAgICAgaWYgKGF2YWlsIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIGl0IGFsbCBnb2VzCisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuU1RBUlQpIHsKKyAgICAgICAgICAgICAgICByaWdodCA9IGxlbiAtIG10LmJyZWFrVGV4dCgwLCBsZW4sIGZhbHNlLCBhdmFpbCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwgLSBlbGxpcHNpc3dpZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsYW5rKHRleHQsIGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpLnN1YnN0cmluZygwLCBmaXQpICsgc0VsbGlwc2lzOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9IGVsc2UgLyogd2hlcmUgPT0gVHJ1bmNhdGVBdC5NSURETEUgKi8gewotICAgICAgICAgICAgICAgIGludCByaWdodCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsIC0gZWxsaXBzaXN3aWQpIC8gMiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdXNlZCA9IHAubWVhc3VyZVRleHQodGV4dCwgbGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgaW50IGxlZnQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4gLSByaWdodCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQgLSB1c2VkLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQobGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgbGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdGV4dC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgbGVmdCkgKyBzRWxsaXBzaXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdWJzdHJpbmcobGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnV0IGRvIHRoZSBTcGFubmVkIGNhc2VzIGJ5IGhhbmQsIGJlY2F1c2UgaXQncyBzdWNoIGEgcGFpbgotICAgICAgICAvLyB0byBpdGVyYXRlIHRoZSBzcGFuIHRyYW5zaXRpb25zIGJhY2t3YXJkcyBhbmQgZ2V0VGV4dFdpZHRocygpCi0gICAgICAgIC8vIHdpbGwgZ2l2ZSB1cyB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZC4KLQotICAgICAgICAvLyBnZXRUZXh0V2lkdGhzKCkgYWx3YXlzIHdyaXRlcyBpbnRvIHRoZSBzdGFydCBvZiB0aGUgYXJyYXksCi0gICAgICAgIC8vIHNvIG1lYXN1cmUgZWFjaCBzcGFuIGludG8gdGhlIGZpcnN0IGhhbGYgYW5kIHRoZW4gY29weSB0aGUKLSAgICAgICAgLy8gcmVzdWx0cyBpbnRvIHRoZSBzZWNvbmQgaGFsZiB0byB1c2UgbGF0ZXIuCi0KLSAgICAgICAgZmxvYXRbXSB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0gICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLQotICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICBuZXh0ID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIFN0eWxlZC5nZXRUZXh0V2lkdGhzKHAsIHRlbXBwYWludCwgc3AsIGksIG5leHQsIHdpZCwgbnVsbCk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBzdW0gPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBzdW0gKz0gd2lkW2xlbiArIGldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1bSA8PSBhdmFpbCkgewotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGVsbGlwc2lzd2lkID0gcC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOwotCi0gICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgbGVuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcobmV3IFN0cmluZyhidWYsIDAsIGxlbikpOwotICAgICAgICAgICAgICAgIHJlY3ljbGUoYnVmKTsKLSAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiBzczsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgdHJ1ZSwgYXZhaWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5TVEFSVCkgewotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyBpIC0gMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhibGFuayh0ZXh0LCAwLCBpKSk7Ci0gICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc0VsbGlwc2lzKTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KDEsIHRleHQsIGksIGxlbik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICBzdW0gPSAwOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChpLCBsZW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKGJsYW5rKHRleHQsIGksIGxlbikpOwotICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNFbGxpcHNpcyk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydCgwLCB0ZXh0LCAwLCBpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAvKiB3aGVyZSA9IFRydW5jYXRlQXQuTUlERExFICovIHsKLSAgICAgICAgICAgIGZsb2F0IGxzdW0gPSAwLCByc3VtID0gMDsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gMCwgcmlnaHQgPSBsZW47Ci0KLSAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7Ci0gICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyByaWdodCAtIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyByc3VtID4gcmF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJzdW0gKz0gdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmxvYXQgbGF2YWlsID0gYXZhaWwgLSBlbGxpcHNpc3dpZCAtIHJzdW07Ci0gICAgICAgICAgICBmb3IgKGxlZnQgPSAwOyBsZWZ0IDwgcmlnaHQ7IGxlZnQrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgbGVmdF07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIGxzdW0gPiBsYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbHN1bSArPSB3OworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbGVuIC0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgZmFsc2UsIGF2YWlsIC8gMik7CisgICAgICAgICAgICAgICAgYXZhaWwgLT0gbXQubWVhc3VyZShyaWdodCwgbGVuKTsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIHJpZ2h0LCB0cnVlLCBhdmFpbCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChsZWZ0LCByaWdodCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBtdC5tQ2hhcnM7CisgICAgICAgICAgICBTcGFubmVkIHNwID0gdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQgPyAoU3Bhbm5lZCkgdGV4dCA6IG51bGw7CisKKyAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBsZW4gLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcoYmxhbmsodGV4dCwgbGVmdCwgcmlnaHQpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID4gMCkgeyAvLyBlbHNlIGVsaW1pbmF0ZSB0aGUgZWxsaXBzaXMgdG9vCisgICAgICAgICAgICAgICAgICAgIGJ1ZltsZWZ0KytdID0gJ1x1MjAyNic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsZWZ0OyBpIDwgcmlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhzKTsKICAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwogICAgICAgICAgICAgICAgIHJldHVybiBzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzRWxsaXBzaXMpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydChvdXQubGVuZ3RoKCksIHRleHQsIHJpZ2h0LCBsZW4pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBibGFuayhDaGFyU2VxdWVuY2Ugc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaW50IGxlbiA9IHNvdXJjZS5sZW5ndGgoKTsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotCi0gICAgICAgIGlmIChzdGFydCAhPSAwKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIDAsIHN0YXJ0LCBidWYsIDApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmQgIT0gbGVuKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIGVuZCwgbGVuLCBidWYsIGVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhcnQgIT0gZW5kKSB7Ci0gICAgICAgICAgICBidWZbc3RhcnRdID0gJ1x1MjAyNic7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOworICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgcmVjeWNsZShidWYpOwogCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihyZW1haW5pbmcgKyBzRWxsaXBzaXMubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIDAsIGxlZnQpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzRWxsaXBzaXMpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIHJpZ2h0LCBsZW4gLSByaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3NiID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNzYi5hcHBlbmQodGV4dCwgMCwgbGVmdCk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHNFbGxpcHNpcyk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHRleHQsIHJpZ2h0LCBsZW4pOworICAgICAgICAgICAgcmV0dXJuIHNzYjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTI3OCw4MCArMTA5MywxMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcCwgZmxvYXQgYXZhaWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9uZU1vcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vcmUpIHsKLSAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltsZW5dOwotICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgMCwgbGVuLCBidWYsIDApOwogCi0gICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKLSAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdFtdIHdpZDsKLQotICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgICAgICB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0KLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihpLCBsZW4sIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgU3R5bGVkLmdldFRleHRXaWR0aHMocCwgdGVtcHBhaW50LCBzcCwgaSwgbmV4dCwgd2lkLCBudWxsKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBzZXRQYXJhKG10LCBwLCB0ZXh0LCAwLCBsZW4sIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CisgICAgICAgICAgICBpZiAod2lkdGggPD0gYXZhaWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWQsIGxlbiwgd2lkLCAwLCBsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2lkID0gbmV3IGZsb2F0W2xlbl07Ci0gICAgICAgICAgICBwLmdldFRleHRXaWR0aHModGV4dCwgMCwgbGVuLCB3aWQpOwotICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbXQubUNoYXJzOwogCi0gICAgICAgIGludCBvayA9IDA7Ci0gICAgICAgIGludCBva1JlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOwotICAgICAgICBTdHJpbmcgb2tGb3JtYXQgPSAiIjsKLQotICAgICAgICBpbnQgdyA9IDA7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgdyArPSB3aWRbaV07Ci0KLSAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBjb21tYUNvdW50IC0gY291bnQgKyAxOwotICAgICAgICAgICAgICAgIGZsb2F0IG1vcmVXaWQ7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKLQotICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBvbmVNb3JlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIFN0cmluZy5mb3JtYXQobW9yZSwgcmVtYWluaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtb3JlV2lkID0gcC5tZWFzdXJlVGV4dChmb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBtb3JlV2lkIDw9IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9rID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOwotICAgICAgICAgICAgICAgICAgICBva0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgaWYgKHcgPD0gYXZhaWwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOworCisgICAgICAgICAgICBpbnQgb2sgPSAwOworICAgICAgICAgICAgaW50IG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgU3RyaW5nIG9rRm9ybWF0ID0gIiI7CisKKyAgICAgICAgICAgIGludCB3ID0gMDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG10Lm1XaWR0aHM7CisKKyAgICAgICAgICAgIGludCByZXF1ZXN0ID0gbXQubURpciA9PSAxID8gTGF5b3V0LkRJUl9SRVFVRVNUX0xUUiA6CisgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9SRVFVRVNUX1JUTDsKKworICAgICAgICAgICAgTWVhc3VyZWRUZXh0IHRlbXBNdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tpXTsKKworICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHNob3VsZCBub3QgaW5zZXJ0IHNwYWNlcywgc2hvdWxkIGJlIHBhcnQgb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBzaG91bGQgdXNlIHBsdXJhbCBydWxlcyBhbmQgbm90IGFzc3VtZSBFbmdsaXNoIHBsdXJhbHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIG9uZU1vcmU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBTdHJpbmcuZm9ybWF0KG1vcmUsIHJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBYWFggdGhpcyBpcyBwcm9iYWJseSBvaywgYnV0IG5lZWQgdG8gbG9vayBhdCBpdCBtb3JlCisgICAgICAgICAgICAgICAgICAgIHRlbXBNdC5zZXRQYXJhKGZvcm1hdCwgMCwgZm9ybWF0Lmxlbmd0aCgpLCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbW9yZVdpZCA9IG10LmFkZFN0eWxlUnVuKHAsIG10Lm1MZW4sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3ICsgbW9yZVdpZCA8PSBhdmFpbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgb2tGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZSh0ZW1wTXQpOworCiAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG9rRm9ybWF0KTsKICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgb2spOwogICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHNldFBhcmEoTWVhc3VyZWRUZXh0IG10LCBUZXh0UGFpbnQgcGFpbnQsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYmlkaVJlcXVlc3QpIHsKKworICAgICAgICBtdC5zZXRQYXJhKHRleHQsIHN0YXJ0LCBlbmQsIGJpZGlSZXF1ZXN0KTsKKworICAgICAgICBmbG9hdCB3aWR0aDsKKyAgICAgICAgU3Bhbm5lZCBzcCA9IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkID8gKFNwYW5uZWQpIHRleHQgOiBudWxsOworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGlmIChzcCA9PSBudWxsKSB7CisgICAgICAgICAgICB3aWR0aCA9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBsZW4sIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGggPSAwOworICAgICAgICAgICAgaW50IHNwYW5FbmQ7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSAwOyBzcGFuU3RhcnQgPCBsZW47IHNwYW5TdGFydCA9IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIHdpZHRoICs9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBzcGFucywgc3BhbkVuZCAtIHNwYW5TdGFydCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9SSUdIVF9UT19MRUZUID0gJ1x1MDU5MCc7CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGJvb2xlYW4gZG9lc05vdE5lZWRCaWRpKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLmNoYXJBdChpKSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkb2VzTm90TmVlZEJpZGkoY2hhcltdIHRleHQsIGludCBzdGFydCwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuOyBpIDwgZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGV4dFtpXSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNoYXJbXSBvYnRhaW4oaW50IGxlbikgewogICAgICAgICBjaGFyW10gYnVmOwogCkBAIC0xNTI5LDcgKzEzODUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX0NIQVJBQ1RFUlMKICAgICAgICAgICAgID0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9DSEFSQUNURVJTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FwaXRhbGl6YXRpb24gbW9kZSBmb3Ige0BsaW5rICNnZXRDYXBzTW9kZX06IGNhcGl0YWxpemUgdGhlIGZpcnN0CiAgICAgICogY2hhcmFjdGVyIG9mIGFsbCB3b3Jkcy4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTM3LDcgKzEzOTMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX1dPUkRTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfV09SRFM7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYXBpdGFsaXphdGlvbiBtb2RlIGZvciB7QGxpbmsgI2dldENhcHNNb2RlfTogY2FwaXRhbGl6ZSB0aGUgZmlyc3QKICAgICAgKiBjaGFyYWN0ZXIgb2YgZWFjaCBzZW50ZW5jZS4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTQ1LDEzICsxNDAxLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX01PREVfU0VOVEVOQ0VTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfU0VOVEVOQ0VTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoYXQgY2FwcyBtb2RlIHNob3VsZCBiZSBpbiBlZmZlY3QgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGluCiAgICAgICogdGhlIHRleHQuICBPbmx5IHRoZSBtb2RlIGJpdHMgc2V0IGluIDx2YXI+cmVxTW9kZXM8L3Zhcj4gd2lsbCBiZQogICAgICAqIGNoZWNrZWQuICBOb3RlIHRoYXQgdGhlIGNhcHMgbW9kZSBmbGFncyBoZXJlIGFyZSBleHBsaWNpdGx5IGRlZmluZWQKICAgICAgKiB0byBtYXRjaCB0aG9zZSBpbiB7QGxpbmsgSW5wdXRUeXBlfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBjcyBUaGUgdGV4dCB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGZvciBjYXBzIG1vZGVzLgogICAgICAqIEBwYXJhbSBvZmYgTG9jYXRpb24gaW4gdGhlIHRleHQgYXQgd2hpY2ggdG8gY2hlY2suCiAgICAgICogQHBhcmFtIHJlcU1vZGVzIFRoZSBtb2RlcyB0byBiZSBjaGVja2VkOiBtYXkgYmUgYW55IGNvbWJpbmF0aW9uIG9mCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQppbmRleCBhMTlhNzhlLi4zYjk4ZmMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgICAgaW50IGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgaW50IHJpZ2h0ID0gMDsKICAgICAgICAgQWxpZ25tZW50IGEgPSBudWxsOworICAgICAgICBib29sZWFuIGx0ciA9IHRydWU7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IHRvcDsgaSA8PSBib3R0b207IGkrKykgewogICAgICAgICAgICAgbGVmdCA9IChpbnQpIE1hdGgubWluKGxlZnQsIGxheW91dC5nZXRMaW5lTGVmdChpKSk7CkBAIC01MSw2ICs1Miw3IEBACiAKICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBhID0gbGF5b3V0LmdldFBhcmFncmFwaEFsaWdubWVudChpKTsKKyAgICAgICAgICAgICAgICBsdHIgPSBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpID4gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01OCwxMCArNjAsMTIgQEAKICAgICAgICAgaW50IHdpZHRoID0gd2lkZ2V0LmdldFdpZHRoKCk7CiAgICAgICAgIGludCBkaWZmID0gMDsKIAorICAgICAgICAvLyBhbGlnbl9vcHBvc2l0ZSBkb2VzIE5PVCBtZWFuIGFsaWduX3JpZ2h0LCB3ZSBuZWVkIHRoZSBwYXJhZ3JhcGgKKyAgICAgICAgLy8gZGlyZWN0aW9uIHRvIHJlc29sdmUgaXQgdG8gbGVmdCBvciByaWdodAogICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDwgd2lkdGggLSBwYWRkaW5nKSB7CiAgICAgICAgICAgICBpZiAoYSA9PSBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSKSB7CiAgICAgICAgICAgICAgICAgZGlmZiA9ICh3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KSkgLyAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChsdHIgPT0gKGEgPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSkgewogICAgICAgICAgICAgICAgIGRpZmYgPSB3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRFeGNlcHRpb24uamF2YQppbmRleCBhNzY3ZWExLi5kZmUwMGM5YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKQEAgLTI3LDYgKzI3LDEwIEBACiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAorICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKFN0cmluZyBuYW1lLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgY2F1c2UpOworICAgIH0KKwogICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKEV4Y2VwdGlvbiBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDRlZDE3YmMuLjJiODI0YmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRSdW50aW1lRXhjZXB0aW9uLmphdmEKQEAgLTI3LDYgKzI3LDEwIEBACiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAorICAgIHB1YmxpYyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbmFtZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIGNhdXNlKTsKKyAgICB9CisKICAgICBwdWJsaWMgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oRXhjZXB0aW9uIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YQppbmRleCA5ZDkxYWNhLi5hNzYzYTY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQ2hhcnNldFV0aWxzLmphdmEKQEAgLTE3LDM2ICsxNyw1OCBAQAogcGFja2FnZSBhbmRyb2lkLnV0aWw7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCisgKiA8cD4KICAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IG1ldGhvZHMgcmVsYXRlZCB0byBjaGFyYWN0ZXIgc2V0cy4gVGhpcwogICogY2xhc3MgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY29kZSB0aGF0IHdpc2hlcyB0byBiZSB2ZW5kb3ItYXdhcmUKLSAqIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBKYXBhbmVzZSBlbmNvZGluZyBuYW1lcy4KLSAqIAotICogPHA+QXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgb25seSB2ZW5kb3IgdGhhdCBpcyByZWNvZ25pemVkIGJ5IHRoaXMKLSAqIGNsYXNzIGlzIERvY29tbyAoaWRlbnRpZmllZCBjYXNlLWluc2Vuc2l0aXZlbHkgYXMge0Bjb2RlICJkb2NvbW8ifSkuPC9wPgotICogCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcyBpcyBoaWRkZW4gaW4gQ3VwY2FrZSwgd2l0aCBhIHBsYW4gdG8KLSAqIHVuLWhpZGUgaW4gRG9udXQuIFRoaXMgd2FzIGRvbmUgYmVjYXVzZSB0aGUgZmlyc3QgZGVwbG95bWVudCB0byB1c2UKLSAqIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBDdXBjYWtlLCBidXQgdGhlIEFQSSBoYWQgdG8gYmUgaW50cm9kdWNlZAotICogYWZ0ZXIgdGhlIHB1YmxpYyBBUEkgZnJlZXplIGZvciB0aGF0IHJlbGVhc2UuIFRoZSB1cHNob3QgaXMgdGhhdAotICogb25seSBzeXN0ZW0gYXBwbGljYXRpb25zIGNhbiBzYWZlbHkgdXNlIHRoaXMgY2xhc3MgdW50aWwgRG9udXQgaXMKLSAqIGF2YWlsYWJsZS4KLSAqIAorICogaW4gaXRzIGludGVycHJldGF0aW9uIG9mIEphcGFuZXNlIGNoYXJzZXQgbmFtZXMgKHVzZWQgaW4gRG9Db01vLAorICogS0RESSwgYW5kIFNvZnRCYW5rKS4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIDxiPk5vdGU6PC9iPiBEZXZlbG9wZXJzIHdpbGwgbmVlZCB0byBhZGQgYW4gYXBwcm9wcmlhdGUgbWFwcGluZyBmb3IKKyAqIGVhY2ggdmVuZG9yLXNwZWNpZmljIGNoYXJzZXQuIFlvdSBtYXkgbmVlZCB0byBtb2RpZnkgdGhlIEMgbGlicmFyaWVzCisgKiBsaWtlIGljdTRjIGluIG9yZGVyIHRvIGxldCBBbmRyb2lkIHN1cHBvcnQgYW4gYWRkaXRpb25hbCBjaGFyc2V0LgorICogPC9wPgorICoKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDaGFyc2V0VXRpbHMgewogICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhlIHZlbmRvciAiRG9jb21vIi4gPGI+Tm90ZTo8L2I+IFRoaXMgaXNuJ3QgYSBwdWJsaWMKKyAgICAgKiBuYW1lIG9mIHRoZSB2ZW5kb3IgIkRvQ29NbyIuIDxiPk5vdGU6PC9iPiBUaGlzIGlzbid0IGEgcHVibGljCiAgICAgICogY29uc3RhbnQsIGluIG9yZGVyIHRvIGtlZXAgdGhpcyBjbGFzcyBmcm9tIGJlY29taW5nIGEgZGUgZmFjdG8KICAgICAgKiByZWZlcmVuY2UgbGlzdCBvZiB2ZW5kb3IgbmFtZXMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9ET0NPTU8gPSAiZG9jb21vIjsKLSAgICAKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB2ZW5kb3IgIktEREkiLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfS0RESSA9ICJrZGRpIjsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB2ZW5kb3IgIlNvZnRCYW5rIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX1NPRlRCQU5LID0gInNvZnRiYW5rIjsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgb25lLXRvLW9uZSBtYXBwaW5nIGZyb20gYSB2ZW5kb3IgbmFtZSB0byBhIGNoYXJzZXQgc3BlY2lmaWMgdG8gdGhlIHZlbmRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHNWZW5kb3JTaGlmdEppc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgLy8gVGhlc2UgdmFyaWFudHMgb2YgU2hpZnRfSklTIGNvbWUgZnJvbSBpY3UncyBtYXBwaW5nIGRhdGEgKGNvbnZydHJzLnR4dCkKKyAgICAgICAgc1ZlbmRvclNoaWZ0SmlzTWFwLnB1dChWRU5ET1JfRE9DT01PLCAiZG9jb21vLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX0tEREksICJrZGRpLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX1NPRlRCQU5LLCAic29mdGJhbmstc2hpZnRfamlzLTIwMDciKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVuaW5zdGFudGlhYmxlLgogICAgICAqLwpAQCAtNTgsMjAgKzgwLDIyIEBACiAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIGNoYXJhY3RlciBzZXQKICAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBvcmlnaW5hbCBjaGFyYWN0ZXIgc2V0IG5hbWUgYW5kCiAgICAgICogdmVuZG9yLiBJZiB0aGVyZSBpcyBubyB2ZW5kb3Itc3BlY2lmaWMgY2hhcmFjdGVyIHNldCBmb3IgdGhlCi0gICAgICogZ2l2ZW4gbmFtZS92ZW5kb3IgcGFpciwgdGhpcyByZXR1cm5zIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIgc2V0Ci0gICAgICogbmFtZS4gVGhlIHZlbmRvciBuYW1lIGlzIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgotICAgICAqIAorICAgICAqIGdpdmVuIG5hbWUvdmVuZG9yIHBhaXIsIHRoaXMgcmV0dXJucyB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyIHNldCBuYW1lLgorICAgICAqCiAgICAgICogQHBhcmFtIGNoYXJzZXROYW1lIHRoZSBiYXNlIGNoYXJhY3RlciBzZXQgbmFtZQotICAgICAqIEBwYXJhbSB2ZW5kb3IgdGhlIHZlbmRvciB0byBzcGVjaWFsaXplIGZvcgorICAgICAqIEBwYXJhbSB2ZW5kb3IgdGhlIHZlbmRvciB0byBzcGVjaWFsaXplIGZvci4gQWxsIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGxvd2VyLWNhc2VkLgogICAgICAqIEByZXR1cm4gdGhlIHNwZWNpYWxpemVkIGNoYXJhY3RlciBzZXQgbmFtZSwgb3Ige0Bjb2RlIGNoYXJzZXROYW1lfSBpZgogICAgICAqIHRoZXJlIGlzIG5vIHNwZWNpYWxpemVkIG5hbWUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lRm9yVmVuZG9yKFN0cmluZyBjaGFyc2V0TmFtZSwgU3RyaW5nIHZlbmRvcikgewotICAgICAgICAvLyBUT0RPOiBFdmVudHVhbGx5LCB0aGlzIG1heSB3YW50IHRvIGJlIHRhYmxlLWRyaXZlbi4KLQotICAgICAgICBpZiAodmVuZG9yLmVxdWFsc0lnbm9yZUNhc2UoVkVORE9SX0RPQ09NTykKLSAgICAgICAgICAgICAgICAmJiBpc1NoaWZ0SmlzKGNoYXJzZXROYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuICJkb2NvbW8tc2hpZnRfamlzLTIwMDciOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXROYW1lKSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkodmVuZG9yKSkgeworICAgICAgICAgICAgLy8gWW91IGNhbiBhZGQgeW91ciBvd24gbWFwcGluZyBoZXJlLgorICAgICAgICAgICAgaWYgKGlzU2hpZnRKaXMoY2hhcnNldE5hbWUpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlbmRvclNoaWZ0SmlzID0gc1ZlbmRvclNoaWZ0SmlzTWFwLmdldCh2ZW5kb3IpOworICAgICAgICAgICAgICAgIGlmICh2ZW5kb3JTaGlmdEppcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZW5kb3JTaGlmdEppczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gY2hhcnNldE5hbWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZpbmFsaXplcnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmluYWxpemVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWYyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZpbmFsaXplcnMuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5QaGFudG9tUmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CisKKy8qKgorICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgcmVsaWFibGUgZmluYWxpemVycy4KKyAqIAorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpbmFsaXplcnMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkZpbmFsaXplcnMiOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIHNMb2NrID0gbmV3IE9iamVjdFswXTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNJbml0OworICAgIHByaXZhdGUgc3RhdGljIFJlY2xhaW1lciBzUmVjbGFpbWVyOworCisgICAgLyoqCisgICAgICogU3ViY2xhc3Mgb2YgUGhhbnRvbVJlZmVyZW5jZSB1c2VkIHRvIHJlY2xhaW0gcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVjbGFpbWFibGVSZWZlcmVuY2U8VD4gZXh0ZW5kcyBQaGFudG9tUmVmZXJlbmNlPFQ+IHsKKyAgICAgICAgcHVibGljIFJlY2xhaW1hYmxlUmVmZXJlbmNlKFQgciwgUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBxKSB7CisgICAgICAgICAgICBzdXBlcihyLCBxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVjbGFpbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHF1ZXVlIHVzZWQgdG8gcmVjbGFpbSBSZWNsYWltYWJsZVJlZmVyZW5jZXMuCisgICAgICogCisgICAgICogQHJldHVybiBBIHJlZmVyZW5jZSBxdWV1ZSBvciBudWxsIGJlZm9yZSBpbml0aWFsaXphdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBnZXRRdWV1ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgaWYgKCFzSW5pdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzUmVjbGFpbWVyLmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgc1JlY2xhaW1lciA9IG5ldyBSZWNsYWltZXIoc1JlY2xhaW1lci5tUXVldWUpOworICAgICAgICAgICAgICAgIHNSZWNsYWltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzUmVjbGFpbWVyLm1RdWV1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZWQgYnkgWnlnb3RlLiBEb24ndCB0b3VjaCEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgaWYgKCFzSW5pdCAmJiBzUmVjbGFpbWVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzUmVjbGFpbWVyID0gbmV3IFJlY2xhaW1lcigpOworICAgICAgICAgICAgICAgIHNSZWNsYWltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzSW5pdCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVjbGFpbWVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBtUXVldWU7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1SdW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgUmVjbGFpbWVyKCkgeworICAgICAgICAgICAgdGhpcyhuZXcgUmVmZXJlbmNlUXVldWU8T2JqZWN0PigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlY2xhaW1lcihSZWZlcmVuY2VRdWV1ZTxPYmplY3Q+IHF1ZXVlKSB7CisgICAgICAgICAgICBzdXBlcigiUmVjbGFpbWVyIik7CisgICAgICAgICAgICBzZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICBtUXVldWUgPSBxdWV1ZTsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUnVubmluZzsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiSW5maW5pdGVMb29wU3RhdGVtZW50In0pCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblVwKG1RdWV1ZS5yZW1vdmUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiUmVjbGFpbWVyIHRocmVhZCBleGl0aW5nOiAiLCBlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhblVwKFJlZmVyZW5jZTw/PiByZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZWZlcmVuY2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAoKFJlY2xhaW1hYmxlUmVmZXJlbmNlPD8+KSByZWZlcmVuY2UpLnJlY2xhaW0oKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKChyZWZlcmVuY2UgPSBtUXVldWUucG9sbCgpKSAhPSBudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblJlYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0NWJmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTA1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlYWRzIGEgSlNPTiAoPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDYyNy50eHQiPlJGQyA0NjI3PC9hPikKKyAqIGVuY29kZWQgdmFsdWUgYXMgYSBzdHJlYW0gb2YgdG9rZW5zLiBUaGlzIHN0cmVhbSBpbmNsdWRlcyBib3RoIGxpdGVyYWwKKyAqIHZhbHVlcyAoc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIGFuZCBudWxscykgYXMgd2VsbCBhcyB0aGUgYmVnaW4gYW5kCisgKiBlbmQgZGVsaW1pdGVycyBvZiBvYmplY3RzIGFuZCBhcnJheXMuIFRoZSB0b2tlbnMgYXJlIHRyYXZlcnNlZCBpbgorICogZGVwdGgtZmlyc3Qgb3JkZXIsIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIEpTT04gZG9jdW1lbnQuCisgKiBXaXRoaW4gSlNPTiBvYmplY3RzLCBuYW1lL3ZhbHVlIHBhaXJzIGFyZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSB0b2tlbi4KKyAqCisgKiA8aDM+UGFyc2luZyBKU09OPC9oMz4KKyAqIFRvIGNyZWF0ZSBhIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciB5b3VyIG93biBKU09OIHN0cmVhbXMsIGZpcnN0IGNyZWF0ZSBhbgorICogZW50cnkgcG9pbnQgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHtAY29kZSBKc29uUmVhZGVyfS4KKyAqCisgKiA8cD5OZXh0LCBjcmVhdGUgaGFuZGxlciBtZXRob2RzIGZvciBlYWNoIHN0cnVjdHVyZSBpbiB5b3VyIEpTT04gdGV4dC4gWW91J2xsCisgKiBuZWVkIGEgbWV0aG9kIGZvciBlYWNoIG9iamVjdCB0eXBlIGFuZCBmb3IgZWFjaCBhcnJheSB0eXBlLgorICogPHVsPgorICogICA8bGk+V2l0aGluIDxzdHJvbmc+YXJyYXkgaGFuZGxpbmc8L3N0cm9uZz4gbWV0aG9kcywgZmlyc3QgY2FsbCB7QGxpbmsKKyAqICAgICAgICNiZWdpbkFycmF5fSB0byBjb25zdW1lIHRoZSBhcnJheSdzIG9wZW5pbmcgYnJhY2tldC4gVGhlbiBjcmVhdGUgYQorICogICAgICAgd2hpbGUgbG9vcCB0aGF0IGFjY3VtdWxhdGVzIHZhbHVlcywgdGVybWluYXRpbmcgd2hlbiB7QGxpbmsgI2hhc05leHR9CisgKiAgICAgICBpcyBmYWxzZS4gRmluYWxseSwgcmVhZCB0aGUgYXJyYXkncyBjbG9zaW5nIGJyYWNrZXQgYnkgY2FsbGluZyB7QGxpbmsKKyAqICAgICAgICNlbmRBcnJheX0uCisgKiAgIDxsaT5XaXRoaW4gPHN0cm9uZz5vYmplY3QgaGFuZGxpbmc8L3N0cm9uZz4gbWV0aG9kcywgZmlyc3QgY2FsbCB7QGxpbmsKKyAqICAgICAgICNiZWdpbk9iamVjdH0gdG8gY29uc3VtZSB0aGUgb2JqZWN0J3Mgb3BlbmluZyBicmFjZS4gVGhlbiBjcmVhdGUgYQorICogICAgICAgd2hpbGUgbG9vcCB0aGF0IGFzc2lnbnMgdmFsdWVzIHRvIGxvY2FsIHZhcmlhYmxlcyBiYXNlZCBvbiB0aGVpciBuYW1lLgorICogICAgICAgVGhpcyBsb29wIHNob3VsZCB0ZXJtaW5hdGUgd2hlbiB7QGxpbmsgI2hhc05leHR9IGlzIGZhbHNlLiBGaW5hbGx5LAorICogICAgICAgcmVhZCB0aGUgb2JqZWN0J3MgY2xvc2luZyBicmFjZSBieSBjYWxsaW5nIHtAbGluayAjZW5kT2JqZWN0fS4KKyAqIDwvdWw+CisgKiA8cD5XaGVuIGEgbmVzdGVkIG9iamVjdCBvciBhcnJheSBpcyBlbmNvdW50ZXJlZCwgZGVsZWdhdGUgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIGhhbmRsZXIgbWV0aG9kLgorICoKKyAqIDxwPldoZW4gYW4gdW5rbm93biBuYW1lIGlzIGVuY291bnRlcmVkLCBzdHJpY3QgcGFyc2VycyBzaG91bGQgZmFpbCB3aXRoIGFuCisgKiBleGNlcHRpb24uIExlbmllbnQgcGFyc2VycyBzaG91bGQgY2FsbCB7QGxpbmsgI3NraXBWYWx1ZSgpfSB0byByZWN1cnNpdmVseQorICogc2tpcCB0aGUgdmFsdWUncyBuZXN0ZWQgdG9rZW5zLCB3aGljaCBtYXkgb3RoZXJ3aXNlIGNvbmZsaWN0LgorICoKKyAqIDxwPklmIGEgdmFsdWUgbWF5IGJlIG51bGwsIHlvdSBzaG91bGQgZmlyc3QgY2hlY2sgdXNpbmcge0BsaW5rICNwZWVrKCl9LgorICogTnVsbCBsaXRlcmFscyBjYW4gYmUgY29uc3VtZWQgdXNpbmcgZWl0aGVyIHtAbGluayAjbmV4dE51bGwoKX0gb3Ige0BsaW5rCisgKiAjc2tpcFZhbHVlKCl9LgorICoKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIFN1cHBvc2Ugd2UnZCBsaWtlIHRvIHBhcnNlIGEgc3RyZWFtIG9mIG1lc3NhZ2VzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZzogPHByZT4ge0Bjb2RlCisgKiBbCisgKiAgIHsKKyAqICAgICAiaWQiOiA5MTIzNDU2Nzg5MDEsCisgKiAgICAgInRleHQiOiAiSG93IGRvIEkgcmVhZCBKU09OIG9uIEFuZHJvaWQ/IiwKKyAqICAgICAiZ2VvIjogbnVsbCwKKyAqICAgICAidXNlciI6IHsKKyAqICAgICAgICJuYW1lIjogImFuZHJvaWRfbmV3YiIsCisgKiAgICAgICAiZm9sbG93ZXJzX2NvdW50IjogNDEKKyAqICAgICAgfQorICogICB9LAorICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAyLAorICogICAgICJ0ZXh0IjogIkBhbmRyb2lkX25ld2IganVzdCB1c2UgYW5kcm9pZC51dGlsLkpzb25SZWFkZXIhIiwKKyAqICAgICAiZ2VvIjogWzUwLjQ1NDcyMiwgLTEwNC42MDY2NjddLAorICogICAgICJ1c2VyIjogeworICogICAgICAgIm5hbWUiOiAiamVzc2UiLAorICogICAgICAgImZvbGxvd2Vyc19jb3VudCI6IDIKKyAqICAgICB9CisgKiAgIH0KKyAqIF19PC9wcmU+CisgKiBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgcGFyc2VyIGZvciB0aGUgYWJvdmUgc3RydWN0dXJlOiA8cHJlPiAgIHtAY29kZQorICoKKyAqICAgcHVibGljIExpc3Q8TWVzc2FnZT4gcmVhZEpzb25TdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJVVEYtOCIpKTsKKyAqICAgICByZXR1cm4gcmVhZE1lc3NhZ2VzQXJyYXkocmVhZGVyKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIExpc3Q8TWVzc2FnZT4gcmVhZE1lc3NhZ2VzQXJyYXkoSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZT4oKTsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAqICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICogICAgICAgbWVzc2FnZXMuYWRkKHJlYWRNZXNzYWdlKHJlYWRlcikpOworICogICAgIH0KKyAqICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAqICAgICByZXR1cm4gbWVzc2FnZXM7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyBNZXNzYWdlIHJlYWRNZXNzYWdlKEpzb25SZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIGxvbmcgaWQgPSAtMTsKKyAqICAgICBTdHJpbmcgdGV4dCA9IG51bGw7CisgKiAgICAgVXNlciB1c2VyID0gbnVsbDsKKyAqICAgICBMaXN0PERvdWJsZT4gZ2VvID0gbnVsbDsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgKiAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAqICAgICAgIFN0cmluZyBuYW1lID0gcmVhZGVyLm5leHROYW1lKCk7CisgKiAgICAgICBpZiAobmFtZS5lcXVhbHMoImlkIikpIHsKKyAqICAgICAgICAgaWQgPSByZWFkZXIubmV4dExvbmcoKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInRleHQiKSkgeworICogICAgICAgICB0ZXh0ID0gcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImdlbyIpICYmIHJlYWRlci5wZWVrKCkgIT0gSnNvblRva2VuLk5VTEwpIHsKKyAqICAgICAgICAgZ2VvID0gcmVhZERvdWJsZXNBcnJheShyZWFkZXIpOworICogICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygidXNlciIpKSB7CisgKiAgICAgICAgIHVzZXIgPSByZWFkVXNlcihyZWFkZXIpOworICogICAgICAgfSBlbHNlIHsKKyAqICAgICAgICAgcmVhZGVyLnNraXBWYWx1ZSgpOworICogICAgICAgfQorICogICAgIH0KKyAqICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgKiAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKGlkLCB0ZXh0LCB1c2VyLCBnZW8pOworICogICB9CisgKgorICogICBwdWJsaWMgTGlzdDxEb3VibGU+IHJlYWREb3VibGVzQXJyYXkoSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgTGlzdDxEb3VibGU+IGRvdWJsZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAqICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICogICAgICAgZG91Ymxlcy5hZGQocmVhZGVyLm5leHREb3VibGUoKSk7CisgKiAgICAgfQorICogICAgIHJlYWRlci5lbmRBcnJheSgpOworICogICAgIHJldHVybiBkb3VibGVzOworICogICB9CisgKgorICogICBwdWJsaWMgVXNlciByZWFkVXNlcihKc29uUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworICogICAgIGludCBmb2xsb3dlcnNDb3VudCA9IC0xOworICoKKyAqICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAqICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICogICAgICAgU3RyaW5nIG5hbWUgPSByZWFkZXIubmV4dE5hbWUoKTsKKyAqICAgICAgIGlmIChuYW1lLmVxdWFscygibmFtZSIpKSB7CisgKiAgICAgICAgIHVzZXJuYW1lID0gcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImZvbGxvd2Vyc19jb3VudCIpKSB7CisgKiAgICAgICAgIGZvbGxvd2Vyc0NvdW50ID0gcmVhZGVyLm5leHRJbnQoKTsKKyAqICAgICAgIH0gZWxzZSB7CisgKiAgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAqICAgICAgIH0KKyAqICAgICB9CisgKiAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICogICAgIHJldHVybiBuZXcgVXNlcih1c2VybmFtZSwgZm9sbG93ZXJzQ291bnQpOworICogICB9fTwvcHJlPgorICoKKyAqIDxoMz5OdW1iZXIgSGFuZGxpbmc8L2gzPgorICogVGhpcyByZWFkZXIgcGVybWl0cyBudW1lcmljIHZhbHVlcyB0byBiZSByZWFkIGFzIHN0cmluZ3MgYW5kIHN0cmluZyB2YWx1ZXMgdG8KKyAqIGJlIHJlYWQgYXMgbnVtYmVycy4gRm9yIGV4YW1wbGUsIGJvdGggZWxlbWVudHMgb2YgdGhlIEpTT04gYXJyYXkge0Bjb2RlCisgKiBbMSwgIjEiXX0gbWF5IGJlIHJlYWQgdXNpbmcgZWl0aGVyIHtAbGluayAjbmV4dEludH0gb3Ige0BsaW5rICNuZXh0U3RyaW5nfS4KKyAqIFRoaXMgYmVoYXZpb3IgaXMgaW50ZW5kZWQgdG8gcHJldmVudCBsb3NzeSBudW1lcmljIGNvbnZlcnNpb25zOiBkb3VibGUgaXMKKyAqIEphdmFTY3JpcHQncyBvbmx5IG51bWVyaWMgdHlwZSBhbmQgdmVyeSBsYXJnZSB2YWx1ZXMgbGlrZSB7QGNvZGUKKyAqIDkwMDcxOTkyNTQ3NDA5OTN9IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IG9uIHRoYXQgcGxhdGZvcm0uIFRvIG1pbmltaXplCisgKiBwcmVjaXNpb24gbG9zcywgZXh0cmVtZWx5IGxhcmdlIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbiBhbmQgcmVhZCBhcyBzdHJpbmdzCisgKiBpbiBKU09OLgorICoKKyAqIDxwPkVhY2gge0Bjb2RlIEpzb25SZWFkZXJ9IG1heSBiZSB1c2VkIHRvIHJlYWQgYSBzaW5nbGUgSlNPTiBzdHJlYW0uIEluc3RhbmNlcworICogb2YgdGhpcyBjbGFzcyBhcmUgbm90IHRocmVhZCBzYWZlLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvblJlYWRlciBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CisKKyAgICAvKiogVGhlIGlucHV0IEpTT04uICovCisgICAgcHJpdmF0ZSBmaW5hbCBSZWFkZXIgaW47CisKKyAgICAvKiogVHJ1ZSB0byBhY2NlcHQgbm9uLXNwZWMgY29tcGxpYW50IEpTT04gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbGVuaWVudCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVXNlIGEgbWFudWFsIGJ1ZmZlciB0byBlYXNpbHkgcmVhZCBhbmQgdW5yZWFkIHVwY29taW5nIGNoYXJhY3RlcnMsIGFuZAorICAgICAqIGFsc28gc28gd2UgY2FuIGNyZWF0ZSBzdHJpbmdzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXRlIFN0cmluZ0J1aWxkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07CisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKyAgICBwcml2YXRlIGludCBsaW1pdCA9IDA7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SnNvblNjb3BlPiBzdGFjayA9IG5ldyBBcnJheUxpc3Q8SnNvblNjb3BlPigpOworICAgIHsKKyAgICAgICAgcHVzaChKc29uU2NvcGUuRU1QVFlfRE9DVU1FTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIHRoZSBuZXh0IHRva2VuLiBJZiB3ZSBoYXZlLCB0aGUgc3RyaW5nIHZhbHVlCisgICAgICogZm9yIHRoYXQgdG9rZW4gd2lsbCBiZSBhc3NpZ25lZCB0byB7QGNvZGUgdmFsdWV9IGlmIHN1Y2ggYSBzdHJpbmcgdmFsdWUKKyAgICAgKiBleGlzdHMuIEFuZCB0aGUgdG9rZW4gdHlwZSB3aWxsIGJlIGFzc2lnbmVkIHRvIHtAY29kZSB0b2tlbn0gaWYgdGhlIHRva2VuCisgICAgICogdHlwZSBpcyBrbm93bi4gVGhlIHRva2VuIHR5cGUgbWF5IGJlIG51bGwgZm9yIGxpdGVyYWxzLCBzaW5jZSB3ZSBkZXJpdmUKKyAgICAgKiB0aGF0IGxhemlseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzVG9rZW47CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgbmV4dCB0b2tlbiB0byBiZSByZXR1cm5lZCBieSB7QGxpbmsgI3BlZWt9IGFuZCB7QGxpbmsKKyAgICAgKiAjYWR2YW5jZX0sIG9yIHtAY29kZSBudWxsfSBpZiBpdCBpcyB1bmtub3duIGFuZCBtdXN0IGZpcnN0IGJlIGRlcml2ZWQKKyAgICAgKiBmcm9tIHtAY29kZSB2YWx1ZX0uIFRoaXMgdmFsdWUgaXMgdW5kZWZpbmVkIGlmIHtAY29kZSBoYXNUb2tlbn0gaXMgZmFsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gdG9rZW47CisKKyAgICAvKiogVGhlIHRleHQgb2YgdGhlIG5leHQgbmFtZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgLyoqIFRoZSB0ZXh0IG9mIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAvKiogVHJ1ZSBpZiB3ZSdyZSBjdXJyZW50bHkgaGFuZGxpbmcgYSBza2lwVmFsdWUoKSBjYWxsLiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBza2lwcGluZyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB0aGF0IHJlYWRzIGEgSlNPTi1lbmNvZGVkIHN0cmVhbSBmcm9tIHtAY29kZSBpbn0uCisgICAgICovCisgICAgcHVibGljIEpzb25SZWFkZXIoUmVhZGVyIGluKSB7CisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImluID09IG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmluID0gaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoaXMgcGFyc2VyIHRvIGJlICBiZSBsaWJlcmFsIGluIHdoYXQgaXQgYWNjZXB0cy4gQnkgZGVmYXVsdCwKKyAgICAgKiB0aGlzIHBhcnNlciBpcyBzdHJpY3QgYW5kIG9ubHkgYWNjZXB0cyBKU09OIGFzIHNwZWNpZmllZCBieSA8YQorICAgICAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ2MjcudHh0Ij5SRkMgNDYyNzwvYT4uIFNldHRpbmcgdGhlCisgICAgICogcGFyc2VyIHRvIGxlbmllbnQgY2F1c2VzIGl0IHRvIGlnbm9yZSB0aGUgZm9sbG93aW5nIHN5bnRheCBlcnJvcnM6CisgICAgICoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+RW5kIG9mIGxpbmUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCB7QGNvZGUgLy99IG9yIHtAY29kZSAjfSBhbmQKKyAgICAgKiAgICAgICBlbmRpbmcgd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyLgorICAgICAqICAgPGxpPkMtc3R5bGUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCB7QGNvZGUgLyp9IGFuZCBlbmRpbmcgd2l0aAorICAgICAqICAgICAgIHtAY29kZSAqfXtAY29kZSAvfS4gU3VjaCBjb21tZW50cyBtYXkgbm90IGJlIG5lc3RlZC4KKyAgICAgKiAgIDxsaT5OYW1lcyB0aGF0IGFyZSB1bnF1b3RlZCBvciB7QGNvZGUgJ3NpbmdsZSBxdW90ZWQnfS4KKyAgICAgKiAgIDxsaT5TdHJpbmdzIHRoYXQgYXJlIHVucXVvdGVkIG9yIHtAY29kZSAnc2luZ2xlIHF1b3RlZCd9LgorICAgICAqICAgPGxpPkFycmF5IGVsZW1lbnRzIHNlcGFyYXRlZCBieSB7QGNvZGUgO30gaW5zdGVhZCBvZiB7QGNvZGUgLH0uCisgICAgICogICA8bGk+VW5uZWNlc3NhcnkgYXJyYXkgc2VwYXJhdG9ycy4gVGhlc2UgYXJlIGludGVycHJldGVkIGFzIGlmIG51bGwKKyAgICAgKiAgICAgICB3YXMgdGhlIG9taXR0ZWQgdmFsdWUuCisgICAgICogICA8bGk+TmFtZXMgYW5kIHZhbHVlcyBzZXBhcmF0ZWQgYnkge0Bjb2RlID19IG9yIHtAY29kZSA9Pn0gaW5zdGVhZCBvZgorICAgICAqICAgICAgIHtAY29kZSA6fS4KKyAgICAgKiAgIDxsaT5OYW1lL3ZhbHVlIHBhaXJzIHNlcGFyYXRlZCBieSB7QGNvZGUgO30gaW5zdGVhZCBvZiB7QGNvZGUgLH0uCisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZW5pZW50KGJvb2xlYW4gbGVuaWVudCkgeworICAgICAgICB0aGlzLmxlbmllbnQgPSBsZW5pZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIEpTT04gc3RyZWFtIGFuZCBhc3NlcnRzIHRoYXQgaXQgaXMgdGhlCisgICAgICogYmVnaW5uaW5nIG9mIGEgbmV3IGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3QoSnNvblRva2VuLkJFR0lOX0FSUkFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBKU09OIHN0cmVhbSBhbmQgYXNzZXJ0cyB0aGF0IGl0IGlzIHRoZQorICAgICAqIGVuZCBvZiB0aGUgY3VycmVudCBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdChKc29uVG9rZW4uRU5EX0FSUkFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBKU09OIHN0cmVhbSBhbmQgYXNzZXJ0cyB0aGF0IGl0IGlzIHRoZQorICAgICAqIGJlZ2lubmluZyBvZiBhIG5ldyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW5PYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3QoSnNvblRva2VuLkJFR0lOX09CSkVDVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyB0aGUKKyAgICAgKiBlbmQgb2YgdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEpzb25Ub2tlbi5FTkRfT0JKRUNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB7QGNvZGUgZXhwZWN0ZWR9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBleHBlY3QoSnNvblRva2VuIGV4cGVjdGVkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuICE9IGV4cGVjdGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCAiICsgZXhwZWN0ZWQgKyAiIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKyAgICAgICAgYWR2YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBhcnJheSBvciBvYmplY3QgaGFzIGFub3RoZXIgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIHJldHVybiB0b2tlbiAhPSBKc29uVG9rZW4uRU5EX09CSkVDVCAmJiB0b2tlbiAhPSBKc29uVG9rZW4uRU5EX0FSUkFZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5leHQgdG9rZW4gd2l0aG91dCBjb25zdW1pbmcgaXQuCisgICAgICovCisgICAgcHVibGljIEpzb25Ub2tlbiBwZWVrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisKKyAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlY29kZUxpdGVyYWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoYXQgYSB0b2tlbiBpcyByZWFkeS4gQWZ0ZXIgdGhpcyBjYWxsIGVpdGhlciB7QGNvZGUgdG9rZW59IG9yCisgICAgICoge0Bjb2RlIHZhbHVlfSB3aWxsIGJlIG5vbi1udWxsLiBUbyBlbnN1cmUge0Bjb2RlIHRva2VufSBoYXMgYSBkZWZpbml0aXZlCisgICAgICogdmFsdWUsIHVzZSB7QGxpbmsgI3BlZWsoKX0KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Ub2tlbiBxdWlja1BlZWsoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaGFzVG9rZW4pIHsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAocGVla1N0YWNrKCkpIHsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfRE9DVU1FTlQpOworICAgICAgICAgICAgICAgIEpzb25Ub2tlbiBmaXJzdFRva2VuID0gbmV4dFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuICE9IEpzb25Ub2tlbi5CRUdJTl9BUlJBWSAmJiB0b2tlbiAhPSBKc29uVG9rZW4uQkVHSU5fT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgSlNPTiBkb2N1bWVudCB0byBzdGFydCB3aXRoICdbJyBvciAneycgYnV0IHdhcyAiICsgdG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RUb2tlbjsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfQVJSQVk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbkFycmF5KHRydWUpOworICAgICAgICAgICAgY2FzZSBOT05FTVBUWV9BUlJBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEluQXJyYXkoZmFsc2UpOworICAgICAgICAgICAgY2FzZSBFTVBUWV9PQkpFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbk9iamVjdCh0cnVlKTsKKyAgICAgICAgICAgIGNhc2UgREFOR0xJTkdfTkFNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0VmFsdWUoKTsKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfT0JKRUNUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW5PYmplY3QoZmFsc2UpOworICAgICAgICAgICAgY2FzZSBOT05FTVBUWV9ET0NVTUVOVDoKKyAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9ET0NVTUVOVDsKKyAgICAgICAgICAgIGNhc2UgQ0xPU0VEOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkpzb25SZWFkZXIgaXMgY2xvc2VkIik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWR2YW5jZXMgdGhlIGN1cnNvciBpbiB0aGUgSlNPTiBzdHJlYW0gdG8gdGhlIG5leHQgdG9rZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gYWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworCisgICAgICAgIEpzb25Ub2tlbiByZXN1bHQgPSB0b2tlbjsKKyAgICAgICAgaGFzVG9rZW4gPSBmYWxzZTsKKyAgICAgICAgdG9rZW4gPSBudWxsOworICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBudWxsOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4sIGEge0BsaW5rIEpzb25Ub2tlbiNOQU1FIHByb3BlcnR5IG5hbWV9LCBhbmQKKyAgICAgKiBjb25zdW1lcyBpdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbSBpcyBub3QgYSBwcm9wZXJ0eQorICAgICAqICAgICBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmV4dE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuICE9IEpzb25Ub2tlbi5OQU1FKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIG5hbWUgYnV0IHdhcyAiICsgcGVlaygpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmFtZTsKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKc29uVG9rZW4jU1RSSU5HIHN0cmluZ30gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIG51bWJlciwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gaXRzCisgICAgICogc3RyaW5nIGZvcm0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBzdHJpbmcgb3IgaWYKKyAgICAgKiAgICAgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmV4dFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHBlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgKHRva2VuICE9IEpzb25Ub2tlbi5TVFJJTkcgJiYgdG9rZW4gIT0gSnNvblRva2VuLk5VTUJFUikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgc3RyaW5nIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI0JPT0xFQU4gYm9vbGVhbn0gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IGEgYm9vbGVhbiBvciBpZgorICAgICAqICAgICB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbmV4dEJvb2xlYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdG9rZW4gPT0gSnNvblRva2VuLlNUUklORykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBib29sZWFuIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJlc3VsdDsKKyAgICAgICAgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBhIGJvb2xlYW46ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyBhCisgICAgICogbGl0ZXJhbCBudWxsLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IG51bGwgb3IgaWYgdGhpcworICAgICAqICAgICByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5leHROdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHRva2VuID09IEpzb25Ub2tlbi5TVFJJTkcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIG51bGwgYnV0IHdhcyAiICsgcGVlaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgibnVsbCIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgYSBudWxsOiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYWR2YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKc29uVG9rZW4jTlVNQkVSIGRvdWJsZX0gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgICogcGFyc2UgaXQgYXMgYSBkb3VibGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBsaXRlcmFsIHZhbHVlLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUgY2Fubm90IGJlIHBhcnNlZAorICAgICAqICAgICBhcyBhIGRvdWJsZSwgb3IgaXMgbm9uLWZpbml0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIG5leHREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgZG91YmxlIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgcmVzdWx0ID0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKKworICAgICAgICBpZiAoKHJlc3VsdCA+PSAxLjBkICYmIHZhbHVlLnN0YXJ0c1dpdGgoIjAiKSkKKyAgICAgICAgICAgICAgICB8fCBEb3VibGUuaXNOYU4ocmVzdWx0KQorICAgICAgICAgICAgICAgIHx8IERvdWJsZS5pc0luZmluaXRlKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJKU09OIGZvcmJpZHMgb2N0YWwgcHJlZml4ZXMsIE5hTiBhbmQgaW5maW5pdGllczogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI05VTUJFUiBsb25nfSB2YWx1ZSBvZiB0aGUgbmV4dCB0b2tlbiwKKyAgICAgKiBjb25zdW1pbmcgaXQuIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nLCB0aGlzIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8KKyAgICAgKiBwYXJzZSBpdCBhcyBhIGxvbmcuIElmIHRoZSBuZXh0IHRva2VuJ3MgbnVtZXJpYyB2YWx1ZSBjYW5ub3QgYmUgZXhhY3RseQorICAgICAqIHJlcHJlc2VudGVkIGJ5IGEgSmF2YSB7QGNvZGUgbG9uZ30sIHRoaXMgbWV0aG9kIHRocm93cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBhIGxpdGVyYWwgdmFsdWUuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIG5leHQgbGl0ZXJhbCB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgIGFzIGEgbnVtYmVyLCBvciBleGFjdGx5IHJlcHJlc2VudGVkIGFzIGEgbG9uZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBuZXh0TG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBsb25nIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHJlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IExvbmcucGFyc2VMb25nKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIGRvdWJsZSBhc0RvdWJsZSA9IERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7IC8vIGRvbid0IGNhdGNoIHRoaXMgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICAgICAgICByZXN1bHQgPSAobG9uZykgYXNEb3VibGU7CisgICAgICAgICAgICBpZiAoKGRvdWJsZSkgcmVzdWx0ICE9IGFzRG91YmxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbih2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0ID49IDFMICYmIHZhbHVlLnN0YXJ0c1dpdGgoIjAiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiSlNPTiBmb3JiaWRzIG9jdGFsIHByZWZpeGVzOiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKc29uVG9rZW4jTlVNQkVSIGludH0gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgICogcGFyc2UgaXQgYXMgYW4gaW50LiBJZiB0aGUgbmV4dCB0b2tlbidzIG51bWVyaWMgdmFsdWUgY2Fubm90IGJlIGV4YWN0bHkKKyAgICAgKiByZXByZXNlbnRlZCBieSBhIEphdmEge0Bjb2RlIGludH0sIHRoaXMgbWV0aG9kIHRocm93cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBhIGxpdGVyYWwgdmFsdWUuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIG5leHQgbGl0ZXJhbCB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgIGFzIGEgbnVtYmVyLCBvciBleGFjdGx5IHJlcHJlc2VudGVkIGFzIGFuIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5leHRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGFuIGludCBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgZG91YmxlIGFzRG91YmxlID0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsgLy8gZG9uJ3QgY2F0Y2ggdGhpcyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgICAgICAgIHJlc3VsdCA9IChpbnQpIGFzRG91YmxlOworICAgICAgICAgICAgaWYgKChkb3VibGUpIHJlc3VsdCAhPSBhc0RvdWJsZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24odmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA+PSAxTCAmJiB2YWx1ZS5zdGFydHNXaXRoKCIwIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIkpTT04gZm9yYmlkcyBvY3RhbCBwcmVmaXhlczogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBKU09OIHJlYWRlciBhbmQgdGhlIHVuZGVybHlpbmcge0BsaW5rIFJlYWRlcn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBoYXNUb2tlbiA9IGZhbHNlOworICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRva2VuID0gbnVsbDsKKyAgICAgICAgc3RhY2suY2xlYXIoKTsKKyAgICAgICAgc3RhY2suYWRkKEpzb25TY29wZS5DTE9TRUQpOworICAgICAgICBpbi5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNraXBzIHRoZSBuZXh0IHZhbHVlIHJlY3Vyc2l2ZWx5LiBJZiBpdCBpcyBhbiBvYmplY3Qgb3IgYXJyYXksIGFsbCBuZXN0ZWQKKyAgICAgKiBlbGVtZW50cyBhcmUgc2tpcHBlZC4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIHRoZSBKU09OIHRva2VuCisgICAgICogc3RyZWFtIGNvbnRhaW5zIHVucmVjb2duaXplZCBvciB1bmhhbmRsZWQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNraXBWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNraXBwaW5nID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgSnNvblRva2VuIHRva2VuID0gYWR2YW5jZSgpOworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBKc29uVG9rZW4uQkVHSU5fQVJSQVkgfHwgdG9rZW4gPT0gSnNvblRva2VuLkJFR0lOX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gSnNvblRva2VuLkVORF9BUlJBWSB8fCB0b2tlbiA9PSBKc29uVG9rZW4uRU5EX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IDApOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2tpcHBpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSnNvblNjb3BlIHBlZWtTdGFjaygpIHsKKyAgICAgICAgcmV0dXJuIHN0YWNrLmdldChzdGFjay5zaXplKCkgLSAxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25TY29wZSBwb3AoKSB7CisgICAgICAgIHJldHVybiBzdGFjay5yZW1vdmUoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1c2goSnNvblNjb3BlIG5ld1RvcCkgeworICAgICAgICBzdGFjay5hZGQobmV3VG9wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZVRvcChKc29uU2NvcGUgbmV3VG9wKSB7CisgICAgICAgIHN0YWNrLnNldChzdGFjay5zaXplKCkgLSAxLCBuZXdUb3ApOworICAgIH0KKworICAgIHByaXZhdGUgSnNvblRva2VuIG5leHRJbkFycmF5KGJvb2xlYW4gZmlyc3RFbGVtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZmlyc3RFbGVtZW50KSB7CisgICAgICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5OT05FTVBUWV9BUlJBWSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBMb29rIGZvciBhIGNvbW1hIGJlZm9yZSBlYWNoIGVsZW1lbnQgYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQuICovCisgICAgICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICddJzoKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9BUlJBWTsKKyAgICAgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7IC8vIGZhbGwtdGhyb3VnaAorICAgICAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGFycmF5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgJ10nOgorICAgICAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9BUlJBWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoIHRvIGhhbmRsZSAiLF0iCisgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgIC8qIEluIGxlbmllbnQgbW9kZSwgYSAwLWxlbmd0aCBsaXRlcmFsIG1lYW5zICdudWxsJyAqLworICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJudWxsIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uTlVMTDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gbmV4dEluT2JqZWN0KGJvb2xlYW4gZmlyc3RFbGVtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvKgorICAgICAgICAgKiBSZWFkIGRlbGltaXRlcnMuIEVpdGhlciBhIGNvbW1hL3NlbWljb2xvbiBzZXBhcmF0aW5nIHRoaXMgYW5kIHRoZQorICAgICAgICAgKiBwcmV2aW91cyBuYW1lLXZhbHVlIHBhaXIsIG9yIGEgY2xvc2UgYnJhY2UgdG8gZGVub3RlIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAqIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChmaXJzdEVsZW1lbnQpIHsKKyAgICAgICAgICAgIC8qIFBlZWsgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGVtcHR5IG9iamVjdC4gKi8KKyAgICAgICAgICAgIHN3aXRjaCAobmV4dE5vbldoaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uRU5EX09CSkVDVDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAobmV4dE5vbldoaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uRU5EX09CSkVDVDsKKyAgICAgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBvYmplY3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlYWQgdGhlIG5hbWUuICovCisgICAgICAgIGludCBxdW90ZSA9IG5leHROb25XaGl0ZXNwYWNlKCk7CisgICAgICAgIHN3aXRjaCAocXVvdGUpIHsKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsgLy8gZmFsbC10aHJvdWdoCisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICBuYW1lID0gbmV4dFN0cmluZygoY2hhcikgcXVvdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgICAgICBuYW1lID0gbmV4dExpdGVyYWwoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkV4cGVjdGVkIG5hbWUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5EQU5HTElOR19OQU1FKTsKKyAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uTkFNRTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25Ub2tlbiBvYmplY3RWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJlYWQgdGhlIG5hbWUvdmFsdWUgc2VwYXJhdG9yLiBVc3VhbGx5IGEgY29sb24gJzonLiBJbiBsZW5pZW50IG1vZGUKKyAgICAgICAgICogd2UgYWxzbyBhY2NlcHQgYW4gZXF1YWxzIHNpZ24gJz0nLCBvciBhbiBhcnJvdyAiPT4iLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoIChuZXh0Tm9uV2hpdGVzcGFjZSgpKSB7CisgICAgICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgIGlmICgocG9zIDwgbGltaXQgfHwgZmlsbEJ1ZmZlcigxKSkgJiYgYnVmZmVyW3Bvc10gPT0gJz4nKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkV4cGVjdGVkICc6JyIpOworICAgICAgICB9CisKKyAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfT0JKRUNUKTsKKyAgICAgICAgcmV0dXJuIG5leHRWYWx1ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgSnNvblRva2VuIG5leHRWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjID0gbmV4dE5vbldoaXRlc3BhY2UoKTsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgICAgICBwdXNoKEpzb25TY29wZS5FTVBUWV9PQkpFQ1QpOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uQkVHSU5fT0JKRUNUOworCisgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICBwdXNoKEpzb25TY29wZS5FTVBUWV9BUlJBWSk7CisgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5CRUdJTl9BUlJBWTsKKworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOyAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIHZhbHVlID0gbmV4dFN0cmluZygoY2hhcikgYyk7CisgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5TVFJJTkc7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRMaXRlcmFsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgb25jZSB7QGNvZGUgbGltaXQgLSBwb3MgPj0gbWluaW11bX0uIElmIHRoZSBkYXRhIGlzCisgICAgICogZXhoYXVzdGVkIGJlZm9yZSB0aGF0IG1hbnkgY2hhcmFjdGVycyBhcmUgYXZhaWxhYmxlLCB0aGlzIHJldHVybnMKKyAgICAgKiBmYWxzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmlsbEJ1ZmZlcihpbnQgbWluaW11bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxpbWl0ICE9IHBvcykgeworICAgICAgICAgICAgbGltaXQgLT0gcG9zOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHBvcywgYnVmZmVyLCAwLCBsaW1pdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW1pdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwb3MgPSAwOworICAgICAgICBpbnQgdG90YWw7CisgICAgICAgIHdoaWxlICgodG90YWwgPSBpbi5yZWFkKGJ1ZmZlciwgbGltaXQsIGJ1ZmZlci5sZW5ndGggLSBsaW1pdCkpICE9IC0xKSB7CisgICAgICAgICAgICBsaW1pdCArPSB0b3RhbDsKKyAgICAgICAgICAgIGlmIChsaW1pdCA+PSBtaW5pbXVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG5leHROb25XaGl0ZXNwYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGxpbWl0IHx8IGZpbGxCdWZmZXIoMSkpIHsKKyAgICAgICAgICAgIGludCBjID0gYnVmZmVyW3BvcysrXTsKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IGxpbWl0ICYmICFmaWxsQnVmZmVyKDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgICAgICBjaGFyIHBlZWsgPSBidWZmZXJbcG9zXTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwZWVrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGEgLyogYy1zdHlsZSBjb21tZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwVG8oIiovIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBjb21tZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGEgLy8gZW5kLW9mLWxpbmUgY29tbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBUb0VuZE9mTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2tpcCBhICMgaGFzaCBlbmQtb2YtbGluZSBjb21tZW50LiBUaGUgSlNPTiBSRkMgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgKiBzcGVjaWZ5IHRoaXMgYmVoYXZpb3VyLCBidXQgaXQncyByZXF1aXJlZCB0byBwYXJzZQorICAgICAgICAgICAgICAgICAgICAgKiBleGlzdGluZyBkb2N1bWVudHMuIFNlZSBodHRwOi8vYi8yNTcxNDIzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHNraXBUb0VuZE9mTGluZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkVuZCBvZiBpbnB1dCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0xlbmllbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWxlbmllbnQpIHsKKyAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJVc2UgSnNvblJlYWRlci5zZXRMZW5pZW50KHRydWUpIHRvIGFjY2VwdCBtYWxmb3JtZWQgSlNPTiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWR2YW5jZXMgdGhlIHBvc2l0aW9uIHVudGlsIGFmdGVyIHRoZSBuZXh0IG5ld2xpbmUgY2hhcmFjdGVyLiBJZiB0aGUgbGluZQorICAgICAqIGlzIHRlcm1pbmF0ZWQgYnkgIlxyXG4iLCB0aGUgJ1xuJyBtdXN0IGJlIGNvbnN1bWVkIGFzIHdoaXRlc3BhY2UgYnkgdGhlCisgICAgICogY2FsbGVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBza2lwVG9FbmRPZkxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aGlsZSAocG9zIDwgbGltaXQgfHwgZmlsbEJ1ZmZlcigxKSkgeworICAgICAgICAgICAgY2hhciBjID0gYnVmZmVyW3BvcysrXTsKKyAgICAgICAgICAgIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcFRvKFN0cmluZyB0b0ZpbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dGVyOgorICAgICAgICBmb3IgKDsgcG9zICsgdG9GaW5kLmxlbmd0aCgpIDwgbGltaXQgfHwgZmlsbEJ1ZmZlcih0b0ZpbmQubGVuZ3RoKCkpOyBwb3MrKykgeworICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCB0b0ZpbmQubGVuZ3RoKCk7IGMrKykgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXJbcG9zICsgY10gIT0gdG9GaW5kLmNoYXJBdChjKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHtAY29kZSBxdW90ZX0sIHVuZXNjYXBpbmcgYW55CisgICAgICogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgZW5jb3VudGVyZWQgYWxvbmcgdGhlIHdheS4gVGhlIG9wZW5pbmcgcXVvdGUKKyAgICAgKiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZC4gVGhpcyBjb25zdW1lcyB0aGUgY2xvc2luZyBxdW90ZSwgYnV0IGRvZXMKKyAgICAgKiBub3QgaW5jbHVkZSBpdCBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHF1b3RlIGVpdGhlciAnIG9yICIuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgYW55IHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUKKyAgICAgKiAgICAgbWFsZm9ybWVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5leHRTdHJpbmcoY2hhciBxdW90ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLyogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbm90IHlldCBhcHBlbmRlZCB0byB0aGUgYnVpbGRlci4gKi8KKyAgICAgICAgICAgIGludCBzdGFydCA9IHBvczsKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGludCBjID0gYnVmZmVyW3BvcysrXTsKKworICAgICAgICAgICAgICAgIGlmIChjID09IHF1b3RlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChza2lwcGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJza2lwcGVkISI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCAtIDEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHJlYWRFc2NhcGVDaGFyYWN0ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQpOworICAgICAgICB9IHdoaWxlIChmaWxsQnVmZmVyKDEpKTsKKworICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1cCB0byBidXQgbm90IGluY2x1ZGluZyBhbnkgZGVsaW1pdGVyIGNoYXJhY3RlcnMuIFRoaXMKKyAgICAgKiBkb2VzIG5vdCBjb25zdW1lIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5leHRMaXRlcmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLyogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbm90IHlldCBhcHBlbmRlZCB0byB0aGUgYnVpbGRlci4gKi8KKyAgICAgICAgICAgIGludCBzdGFydCA9IHBvczsKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGludCBjID0gYnVmZmVyW3BvcysrXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOyAvLyBmYWxsLXRocm91Z2gKKworICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgICAgICBjYXNlICddJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcHBpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInNraXBwZWQhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0KTsKKyAgICAgICAgfSB3aGlsZSAoZmlsbEJ1ZmZlcigxKSk7CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBuZWFyICIgKyBnZXRTbmlwcGV0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5lc2NhcGVzIHRoZSBjaGFyYWN0ZXIgaWRlbnRpZmllZCBieSB0aGUgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMgdGhhdAorICAgICAqIGltbWVkaWF0ZWx5IGZvbGxvdyBhIGJhY2tzbGFzaC4gVGhlIGJhY2tzbGFzaCAnXCcgc2hvdWxkIGhhdmUgYWxyZWFkeQorICAgICAqIGJlZW4gcmVhZC4gVGhpcyBzdXBwb3J0cyBib3RoIHVuaWNvZGUgZXNjYXBlcyAidTAwMEEiIGFuZCB0d28tY2hhcmFjdGVyCisgICAgICogZXNjYXBlcyAiXG4iLgorICAgICAqCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgYW55IHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUKKyAgICAgKiAgICAgbWFsZm9ybWVkLgorICAgICAqLworICAgIHByaXZhdGUgY2hhciByZWFkRXNjYXBlQ2hhcmFjdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBvcyA9PSBsaW1pdCAmJiAhZmlsbEJ1ZmZlcigxKSkgeworICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBlc2NhcGUgc2VxdWVuY2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgZXNjYXBlZCA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgIHN3aXRjaCAoZXNjYXBlZCkgeworICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgaWYgKHBvcyArIDQgPiBsaW1pdCAmJiAhZmlsbEJ1ZmZlcig0KSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGVzY2FwZSBzZXF1ZW5jZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgaGV4ID0gbmV3IFN0cmluZyhidWZmZXIsIHBvcywgNCk7CisgICAgICAgICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KGhleCwgMTYpOworCisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1x0JzsKKworICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcYic7CisKKyAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgIHJldHVybiAnXG4nOworCisgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1xyJzsKKworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcZic7CisKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXNjYXBlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgbnVsbCwgYm9vbGVhbiwgbnVtZXJpYyBvciB1bnF1b3RlZCBzdHJpbmcgbGl0ZXJhbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Ub2tlbiByZWFkTGl0ZXJhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBsaXRlcmFsID0gbmV4dExpdGVyYWwoKTsKKyAgICAgICAgaWYgKGxpdGVyYWwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiRXhwZWN0ZWQgbGl0ZXJhbCB2YWx1ZSIpOworICAgICAgICB9CisgICAgICAgIHZhbHVlID0gbGl0ZXJhbDsKKyAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICByZXR1cm4gdG9rZW4gPSBudWxsOyAvLyB1c2UgZGVjb2RlTGl0ZXJhbCgpIHRvIGdldCB0aGUgdG9rZW4gdHlwZQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbnMge0Bjb2RlIG5leHRUb2tlbn0gYmFzZWQgb24gdGhlIHZhbHVlIG9mIHtAY29kZSBuZXh0VmFsdWV9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZWNvZGVMaXRlcmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIm51bGwiKSkgeworICAgICAgICAgICAgdG9rZW4gPSBKc29uVG9rZW4uTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgdG9rZW4gPSBKc29uVG9rZW4uQk9PTEVBTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsgLy8gdGhpcyB3b3JrIGNvdWxkIHBvdGVudGlhbGx5IGJlIGNhY2hlZAorICAgICAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLk5VTUJFUjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGJlIGFuIHVucXVvdGVkIHN0cmluZworICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLlNUUklORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93cyBhIG5ldyBJTyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYSBjb250ZXh0IHNuaXBwZXQKKyAgICAgKiB3aXRoIHRoaXMgcmVhZGVyJ3MgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSU9FeGNlcHRpb24gc3ludGF4RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBKc29uU3ludGF4RXhjZXB0aW9uKG1lc3NhZ2UgKyAiIG5lYXIgIiArIGdldFNuaXBwZXQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZ2V0U25pcHBldCgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzbmlwcGV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IGJlZm9yZVBvcyA9IE1hdGgubWluKHBvcywgMjApOworICAgICAgICBzbmlwcGV0LmFwcGVuZChidWZmZXIsIHBvcyAtIGJlZm9yZVBvcywgYmVmb3JlUG9zKTsKKyAgICAgICAgaW50IGFmdGVyUG9zID0gTWF0aC5taW4obGltaXQgLSBwb3MsIDIwKTsKKyAgICAgICAgc25pcHBldC5hcHBlbmQoYnVmZmVyLCBwb3MsIGFmdGVyUG9zKTsKKyAgICAgICAgcmV0dXJuIHNuaXBwZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSnNvblN5bnRheEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBKc29uU3ludGF4RXhjZXB0aW9uKFN0cmluZyBzKSB7CisgICAgICAgICAgICBzdXBlcihzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblNjb3BlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25TY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNTM0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25TY29wZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworLyoqCisgKiBMZXhpY2FsIHNjb3BpbmcgZWxlbWVudHMgd2l0aGluIGEgSlNPTiByZWFkZXIgb3Igd3JpdGVyLgorICovCitlbnVtIEpzb25TY29wZSB7CisKKyAgICAvKioKKyAgICAgKiBBbiBhcnJheSB3aXRoIG5vIGVsZW1lbnRzIHJlcXVpcmVzIG5vIHNlcGFyYXRvcnMgb3IgbmV3bGluZXMgYmVmb3JlCisgICAgICogaXQgaXMgY2xvc2VkLgorICAgICAqLworICAgIEVNUFRZX0FSUkFZLAorCisgICAgLyoqCisgICAgICogQSBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSByZXF1aXJlcyBhIGNvbW1hIGFuZCBuZXdsaW5lIGJlZm9yZQorICAgICAqIHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICovCisgICAgTk9ORU1QVFlfQVJSQVksCisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3Qgd2l0aCBubyBuYW1lL3ZhbHVlIHBhaXJzIHJlcXVpcmVzIG5vIHNlcGFyYXRvcnMgb3IgbmV3bGluZXMKKyAgICAgKiBiZWZvcmUgaXQgaXMgY2xvc2VkLgorICAgICAqLworICAgIEVNUFRZX09CSkVDVCwKKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCB3aG9zZSBtb3N0IHJlY2VudCBlbGVtZW50IGlzIGEga2V5LiBUaGUgbmV4dCBlbGVtZW50IG11c3QKKyAgICAgKiBiZSBhIHZhbHVlLgorICAgICAqLworICAgIERBTkdMSU5HX05BTUUsCisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBvbmUgbmFtZS92YWx1ZSBwYWlyIHJlcXVpcmVzIGEgY29tbWEgYW5kCisgICAgICogbmV3bGluZSBiZWZvcmUgdGhlIG5leHQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBOT05FTVBUWV9PQkpFQ1QsCisKKyAgICAvKioKKyAgICAgKiBObyBvYmplY3Qgb3IgYXJyYXkgaGFzIGJlZW4gc3RhcnRlZC4KKyAgICAgKi8KKyAgICBFTVBUWV9ET0NVTUVOVCwKKworICAgIC8qKgorICAgICAqIEEgZG9jdW1lbnQgd2l0aCBhdCBhbiBhcnJheSBvciBvYmplY3QuCisgICAgICovCisgICAgTk9ORU1QVFlfRE9DVU1FTlQsCisKKyAgICAvKioKKyAgICAgKiBBIGRvY3VtZW50IHRoYXQncyBiZWVuIGNsb3NlZCBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkLgorICAgICAqLworICAgIENMT1NFRCwKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblRva2VuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Ub2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmM2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworLyoqCisgKiBBIHN0cnVjdHVyZSwgbmFtZSBvciB2YWx1ZSB0eXBlIGluIGEgSlNPTi1lbmNvZGVkIHN0cmluZy4KKyAqLworcHVibGljIGVudW0gSnNvblRva2VuIHsKKworICAgIC8qKgorICAgICAqIFRoZSBvcGVuaW5nIG9mIGEgSlNPTiBhcnJheS4gV3JpdHRlbiB1c2luZyB7QGxpbmsgSnNvbldyaXRlciNiZWdpbk9iamVjdH0KKyAgICAgKiBhbmQgcmVhZCB1c2luZyB7QGxpbmsgSnNvblJlYWRlciNiZWdpbk9iamVjdH0uCisgICAgICovCisgICAgQkVHSU5fQVJSQVksCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xvc2luZyBvZiBhIEpTT04gYXJyYXkuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjZW5kQXJyYXl9CisgICAgICogYW5kIHJlYWQgdXNpbmcge0BsaW5rIEpzb25SZWFkZXIjZW5kQXJyYXl9LgorICAgICAqLworICAgIEVORF9BUlJBWSwKKworICAgIC8qKgorICAgICAqIFRoZSBvcGVuaW5nIG9mIGEgSlNPTiBvYmplY3QuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjYmVnaW5PYmplY3R9CisgICAgICogYW5kIHJlYWQgdXNpbmcge0BsaW5rIEpzb25SZWFkZXIjYmVnaW5PYmplY3R9LgorICAgICAqLworICAgIEJFR0lOX09CSkVDVCwKKworICAgIC8qKgorICAgICAqIFRoZSBjbG9zaW5nIG9mIGEgSlNPTiBvYmplY3QuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjZW5kT2JqZWN0fQorICAgICAqIGFuZCByZWFkIHVzaW5nIHtAbGluayBKc29uUmVhZGVyI2VuZE9iamVjdH0uCisgICAgICovCisgICAgRU5EX09CSkVDVCwKKworICAgIC8qKgorICAgICAqIEEgSlNPTiBwcm9wZXJ0eSBuYW1lLiBXaXRoaW4gb2JqZWN0cywgdG9rZW5zIGFsdGVybmF0ZSBiZXR3ZWVuIG5hbWVzIGFuZAorICAgICAqIHRoZWlyIHZhbHVlcy4gV3JpdHRlbiB1c2luZyB7QGxpbmsgSnNvbldyaXRlciNuYW1lfSBhbmQgcmVhZCB1c2luZyB7QGxpbmsKKyAgICAgKiBKc29uUmVhZGVyI25leHROYW1lfQorICAgICAqLworICAgIE5BTUUsCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04gc3RyaW5nLgorICAgICAqLworICAgIFNUUklORywKKworICAgIC8qKgorICAgICAqIEEgSlNPTiBudW1iZXIgcmVwcmVzZW50ZWQgaW4gdGhpcyBBUEkgYnkgYSBKYXZhIHtAY29kZSBkb3VibGV9LCB7QGNvZGUKKyAgICAgKiBsb25nfSwgb3Ige0Bjb2RlIGludH0uCisgICAgICovCisgICAgTlVNQkVSLAorCisgICAgLyoqCisgICAgICogQSBKU09OIHtAY29kZSB0cnVlfSBvciB7QGNvZGUgZmFsc2V9LgorICAgICAqLworICAgIEJPT0xFQU4sCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04ge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIE5VTEwsCisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5kIG9mIHRoZSBKU09OIHN0cmVhbS4gVGhpcyBzZW50aW5lbCB2YWx1ZSBpcyByZXR1cm5lZCBieSB7QGxpbmsKKyAgICAgKiBKc29uUmVhZGVyI3BlZWsoKX0gdG8gc2lnbmFsIHRoYXQgdGhlIEpTT04tZW5jb2RlZCB2YWx1ZSBoYXMgbm8gbW9yZQorICAgICAqIHRva2Vucy4KKyAgICAgKi8KKyAgICBFTkRfRE9DVU1FTlQKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvbldyaXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjYzFjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvbldyaXRlci5qYXZhCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogV3JpdGVzIGEgSlNPTiAoPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDYyNy50eHQiPlJGQyA0NjI3PC9hPikKKyAqIGVuY29kZWQgdmFsdWUgdG8gYSBzdHJlYW0sIG9uZSB0b2tlbiBhdCBhIHRpbWUuIFRoZSBzdHJlYW0gaW5jbHVkZXMgYm90aAorICogbGl0ZXJhbCB2YWx1ZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zIGFuZCBudWxscykgYXMgd2VsbCBhcyB0aGUgYmVnaW4KKyAqIGFuZCBlbmQgZGVsaW1pdGVycyBvZiBvYmplY3RzIGFuZCBhcnJheXMuCisgKgorICogPGgzPkVuY29kaW5nIEpTT048L2gzPgorICogVG8gZW5jb2RlIHlvdXIgZGF0YSBhcyBKU09OLCBjcmVhdGUgYSBuZXcge0Bjb2RlIEpzb25Xcml0ZXJ9LiBFYWNoIEpTT04KKyAqIGRvY3VtZW50IG11c3QgY29udGFpbiBvbmUgdG9wLWxldmVsIGFycmF5IG9yIG9iamVjdC4gQ2FsbCBtZXRob2RzIG9uIHRoZQorICogd3JpdGVyIGFzIHlvdSB3YWxrIHRoZSBzdHJ1Y3R1cmUncyBjb250ZW50cywgbmVzdGluZyBhcnJheXMgYW5kIG9iamVjdHMgYXMKKyAqIG5lY2Vzc2FyeToKKyAqIDx1bD4KKyAqICAgPGxpPlRvIHdyaXRlIDxzdHJvbmc+YXJyYXlzPC9zdHJvbmc+LCBmaXJzdCBjYWxsIHtAbGluayAjYmVnaW5BcnJheSgpfS4KKyAqICAgICAgIFdyaXRlIGVhY2ggb2YgdGhlIGFycmF5J3MgZWxlbWVudHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUge0BsaW5rICN2YWx1ZX0KKyAqICAgICAgIG1ldGhvZHMgb3IgYnkgbmVzdGluZyBvdGhlciBhcnJheXMgYW5kIG9iamVjdHMuIEZpbmFsbHkgY2xvc2UgdGhlIGFycmF5CisgKiAgICAgICB1c2luZyB7QGxpbmsgI2VuZEFycmF5KCl9LgorICogICA8bGk+VG8gd3JpdGUgPHN0cm9uZz5vYmplY3RzPC9zdHJvbmc+LCBmaXJzdCBjYWxsIHtAbGluayAjYmVnaW5PYmplY3QoKX0uCisgKiAgICAgICBXcml0ZSBlYWNoIG9mIHRoZSBvYmplY3QncyBwcm9wZXJ0aWVzIGJ5IGFsdGVybmF0aW5nIGNhbGxzIHRvCisgKiAgICAgICB7QGxpbmsgI25hbWV9IHdpdGggdGhlIHByb3BlcnR5J3MgdmFsdWUuIFdyaXRlIHByb3BlcnR5IHZhbHVlcyB3aXRoIHRoZQorICogICAgICAgYXBwcm9wcmlhdGUge0BsaW5rICN2YWx1ZX0gbWV0aG9kIG9yIGJ5IG5lc3Rpbmcgb3RoZXIgb2JqZWN0cyBvciBhcnJheXMuCisgKiAgICAgICBGaW5hbGx5IGNsb3NlIHRoZSBvYmplY3QgdXNpbmcge0BsaW5rICNlbmRPYmplY3QoKX0uCisgKiA8L3VsPgorICoKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIFN1cHBvc2Ugd2UnZCBsaWtlIHRvIGVuY29kZSBhIHN0cmVhbSBvZiBtZXNzYWdlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6IDxwcmU+IHtAY29kZQorICogWworICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAxLAorICogICAgICJ0ZXh0IjogIkhvdyBkbyBJIHdyaXRlIEpTT04gb24gQW5kcm9pZD8iLAorICogICAgICJnZW8iOiBudWxsLAorICogICAgICJ1c2VyIjogeworICogICAgICAgIm5hbWUiOiAiYW5kcm9pZF9uZXdiIiwKKyAqICAgICAgICJmb2xsb3dlcnNfY291bnQiOiA0MQorICogICAgICB9CisgKiAgIH0sCisgKiAgIHsKKyAqICAgICAiaWQiOiA5MTIzNDU2Nzg5MDIsCisgKiAgICAgInRleHQiOiAiQGFuZHJvaWRfbmV3YiBqdXN0IHVzZSBhbmRyb2lkLnV0aWwuSnNvbldyaXRlciEiLAorICogICAgICJnZW8iOiBbNTAuNDU0NzIyLCAtMTA0LjYwNjY2N10sCisgKiAgICAgInVzZXIiOiB7CisgKiAgICAgICAibmFtZSI6ICJqZXNzZSIsCisgKiAgICAgICAiZm9sbG93ZXJzX2NvdW50IjogMgorICogICAgIH0KKyAqICAgfQorICogXX08L3ByZT4KKyAqIFRoaXMgY29kZSBlbmNvZGVzIHRoZSBhYm92ZSBzdHJ1Y3R1cmU6IDxwcmU+ICAge0Bjb2RlCisgKiAgIHB1YmxpYyB2b2lkIHdyaXRlSnNvblN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIEpzb25Xcml0ZXIgd3JpdGVyID0gbmV3IEpzb25Xcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJVVEYtOCIpKTsKKyAqICAgICB3cml0ZXIuc2V0SW5kZW50U3BhY2VzKDQpOworICogICAgIHdyaXRlTWVzc2FnZXNBcnJheSh3cml0ZXIsIG1lc3NhZ2VzKTsKKyAqICAgICB3cml0ZXIuY2xvc2UoKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlc0FycmF5KEpzb25Xcml0ZXIgd3JpdGVyLCBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIHdyaXRlci5iZWdpbkFycmF5KCk7CisgKiAgICAgZm9yIChNZXNzYWdlIG1lc3NhZ2UgOiBtZXNzYWdlcykgeworICogICAgICAgd3JpdGVNZXNzYWdlKHdyaXRlciwgbWVzc2FnZSk7CisgKiAgICAgfQorICogICAgIHdyaXRlci5lbmRBcnJheSgpOworICogICB9CisgKgorICogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2UoSnNvbldyaXRlciB3cml0ZXIsIE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5PYmplY3QoKTsKKyAqICAgICB3cml0ZXIubmFtZSgiaWQiKS52YWx1ZShtZXNzYWdlLmdldElkKCkpOworICogICAgIHdyaXRlci5uYW1lKCJ0ZXh0IikudmFsdWUobWVzc2FnZS5nZXRUZXh0KCkpOworICogICAgIGlmIChtZXNzYWdlLmdldEdlbygpICE9IG51bGwpIHsKKyAqICAgICAgIHdyaXRlci5uYW1lKCJnZW8iKTsKKyAqICAgICAgIHdyaXRlRG91Ymxlc0FycmF5KHdyaXRlciwgbWVzc2FnZS5nZXRHZW8oKSk7CisgKiAgICAgfSBlbHNlIHsKKyAqICAgICAgIHdyaXRlci5uYW1lKCJnZW8iKS5udWxsVmFsdWUoKTsKKyAqICAgICB9CisgKiAgICAgd3JpdGVyLm5hbWUoInVzZXIiKTsKKyAqICAgICB3cml0ZVVzZXIod3JpdGVyLCBtZXNzYWdlLmdldFVzZXIoKSk7CisgKiAgICAgd3JpdGVyLmVuZE9iamVjdCgpOworICogICB9CisgKgorICogICBwdWJsaWMgdm9pZCB3cml0ZVVzZXIoSnNvbldyaXRlciB3cml0ZXIsIFVzZXIgdXNlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5PYmplY3QoKTsKKyAqICAgICB3cml0ZXIubmFtZSgibmFtZSIpLnZhbHVlKHVzZXIuZ2V0TmFtZSgpKTsKKyAqICAgICB3cml0ZXIubmFtZSgiZm9sbG93ZXJzX2NvdW50IikudmFsdWUodXNlci5nZXRGb2xsb3dlcnNDb3VudCgpKTsKKyAqICAgICB3cml0ZXIuZW5kT2JqZWN0KCk7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyB2b2lkIHdyaXRlRG91Ymxlc0FycmF5KEpzb25Xcml0ZXIgd3JpdGVyLCBMaXN0PERvdWJsZT4gZG91YmxlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5BcnJheSgpOworICogICAgIGZvciAoRG91YmxlIHZhbHVlIDogZG91YmxlcykgeworICogICAgICAgd3JpdGVyLnZhbHVlKHZhbHVlKTsKKyAqICAgICB9CisgKiAgICAgd3JpdGVyLmVuZEFycmF5KCk7CisgKiAgIH19PC9wcmU+CisgKgorICogPHA+RWFjaCB7QGNvZGUgSnNvbldyaXRlcn0gbWF5IGJlIHVzZWQgdG8gd3JpdGUgYSBzaW5nbGUgSlNPTiBzdHJlYW0uCisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgbm90IHRocmVhZCBzYWZlLiBDYWxscyB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhCisgKiBtYWxmb3JtZWQgSlNPTiBzdHJpbmcgd2lsbCBmYWlsIHdpdGggYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKc29uV3JpdGVyIGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKworICAgIC8qKiBUaGUgb3V0cHV0IGRhdGEsIGNvbnRhaW5pbmcgYXQgbW9zdCBvbmUgdG9wLWxldmVsIGFycmF5IG9yIG9iamVjdC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIFdyaXRlciBvdXQ7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SnNvblNjb3BlPiBzdGFjayA9IG5ldyBBcnJheUxpc3Q8SnNvblNjb3BlPigpOworICAgIHsKKyAgICAgICAgc3RhY2suYWRkKEpzb25TY29wZS5FTVBUWV9ET0NVTUVOVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgY29udGFpbmluZyBhIGZ1bGwgc2V0IG9mIHNwYWNlcyBmb3IgYSBzaW5nbGUgbGV2ZWwgb2YKKyAgICAgKiBpbmRlbnRhdGlvbiwgb3IgbnVsbCBmb3Igbm8gcHJldHR5IHByaW50aW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGluZGVudDsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lL3ZhbHVlIHNlcGFyYXRvcjsgZWl0aGVyICI6IiBvciAiOiAiLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcGFyYXRvciA9ICI6IjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgdGhhdCB3cml0ZXMgYSBKU09OLWVuY29kZWQgc3RyZWFtIHRvIHtAY29kZSBvdXR9LgorICAgICAqIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBlbnN1cmUge0BsaW5rIFdyaXRlcn0gaXMgYnVmZmVyZWQ7IHdyYXBwaW5nIGluCisgICAgICoge0BsaW5rIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIgQnVmZmVyZWRXcml0ZXJ9IGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlcihXcml0ZXIgb3V0KSB7CisgICAgICAgIGlmIChvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJvdXQgPT0gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGluZGVudGF0aW9uIHN0cmluZyB0byBiZSByZXBlYXRlZCBmb3IgZWFjaCBsZXZlbCBvZiBpbmRlbnRhdGlvbgorICAgICAqIGluIHRoZSBlbmNvZGVkIGRvY3VtZW50LiBJZiB7QGNvZGUgaW5kZW50LmlzRW1wdHkoKX0gdGhlIGVuY29kZWQgZG9jdW1lbnQKKyAgICAgKiB3aWxsIGJlIGNvbXBhY3QuIE90aGVyd2lzZSB0aGUgZW5jb2RlZCBkb2N1bWVudCB3aWxsIGJlIG1vcmUKKyAgICAgKiBodW1hbi1yZWFkYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRlbnQgYSBzdHJpbmcgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5kZW50KFN0cmluZyBpbmRlbnQpIHsKKyAgICAgICAgaWYgKGluZGVudC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuc2VwYXJhdG9yID0gIjoiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7CisgICAgICAgICAgICB0aGlzLnNlcGFyYXRvciA9ICI6ICI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgZW5jb2RpbmcgYSBuZXcgYXJyYXkuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBtdXN0IGJlIHBhaXJlZCB3aXRoCisgICAgICogYSBjYWxsIHRvIHtAbGluayAjZW5kQXJyYXl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBiZWdpbkFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG9wZW4oSnNvblNjb3BlLkVNUFRZX0FSUkFZLCAiWyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgZW5jb2RpbmcgdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIGVuZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlKEpzb25TY29wZS5FTVBUWV9BUlJBWSwgSnNvblNjb3BlLk5PTkVNUFRZX0FSUkFZLCAiXSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZ2lucyBlbmNvZGluZyBhIG5ldyBvYmplY3QuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBtdXN0IGJlIHBhaXJlZAorICAgICAqIHdpdGggYSBjYWxsIHRvIHtAbGluayAjZW5kT2JqZWN0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgYmVnaW5PYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gb3BlbihKc29uU2NvcGUuRU1QVFlfT0JKRUNULCAieyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgZW5jb2RpbmcgdGhlIGN1cnJlbnQgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBlbmRPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2xvc2UoSnNvblNjb3BlLkVNUFRZX09CSkVDVCwgSnNvblNjb3BlLk5PTkVNUFRZX09CSkVDVCwgIn0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnRlcnMgYSBuZXcgc2NvcGUgYnkgYXBwZW5kaW5nIGFueSBuZWNlc3Nhcnkgd2hpdGVzcGFjZSBhbmQgdGhlIGdpdmVuCisgICAgICogYnJhY2tldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Xcml0ZXIgb3BlbihKc29uU2NvcGUgZW1wdHksIFN0cmluZyBvcGVuQnJhY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlVmFsdWUodHJ1ZSk7CisgICAgICAgIHN0YWNrLmFkZChlbXB0eSk7CisgICAgICAgIG91dC53cml0ZShvcGVuQnJhY2tldCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgY3VycmVudCBzY29wZSBieSBhcHBlbmRpbmcgYW55IG5lY2Vzc2FyeSB3aGl0ZXNwYWNlIGFuZCB0aGUKKyAgICAgKiBnaXZlbiBicmFja2V0LgorICAgICAqLworICAgIHByaXZhdGUgSnNvbldyaXRlciBjbG9zZShKc29uU2NvcGUgZW1wdHksIEpzb25TY29wZSBub25lbXB0eSwgU3RyaW5nIGNsb3NlQnJhY2tldCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25TY29wZSBjb250ZXh0ID0gcGVlaygpOworICAgICAgICBpZiAoY29udGV4dCAhPSBub25lbXB0eSAmJiBjb250ZXh0ICE9IGVtcHR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOZXN0aW5nIHByb2JsZW06ICIgKyBzdGFjayk7CisgICAgICAgIH0KKworICAgICAgICBzdGFjay5yZW1vdmUoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG5vbmVtcHR5KSB7CisgICAgICAgICAgICBuZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKGNsb3NlQnJhY2tldCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorICAgICAqLworICAgIHByaXZhdGUgSnNvblNjb3BlIHBlZWsoKSB7CisgICAgICAgIHJldHVybiBzdGFjay5nZXQoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VUb3AoSnNvblNjb3BlIHRvcE9mU3RhY2spIHsKKyAgICAgICAgc3RhY2suc2V0KHN0YWNrLnNpemUoKSAtIDEsIHRvcE9mU3RhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZm9ydGhjb21pbmcgdmFsdWUuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIG5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmFtZSA9PSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgYmVmb3JlTmFtZSgpOworICAgICAgICBzdHJpbmcobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbGl0ZXJhbCBzdHJpbmcgdmFsdWUsIG9yIG51bGwgdG8gZW5jb2RlIGEgbnVsbCBsaXRlcmFsLgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgdmFsdWUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgc3RyaW5nKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIG51bGxWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgb3V0LndyaXRlKCJudWxsIik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgdmFsdWUoYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlVmFsdWUoZmFsc2UpOworICAgICAgICBvdXQud3JpdGUodmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB7QGNvZGUgdmFsdWV9LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGEgZmluaXRlIHZhbHVlLiBNYXkgbm90IGJlIHtAbGluayBEb3VibGUjaXNOYU4oKSBOYU5zfSBvcgorICAgICAqICAgICB7QGxpbmsgRG91YmxlI2lzSW5maW5pdGUoKSBpbmZpbml0aWVzfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIHZhbHVlKGRvdWJsZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERvdWJsZS5pc05hTih2YWx1ZSkgfHwgRG91YmxlLmlzSW5maW5pdGUodmFsdWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdW1lcmljIHZhbHVlcyBtdXN0IGJlIGZpbml0ZSwgYnV0IHdhcyAiICsgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgb3V0LmFwcGVuZChEb3VibGUudG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB7QGNvZGUgdmFsdWV9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciB2YWx1ZShsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBiZWZvcmVWYWx1ZShmYWxzZSk7CisgICAgICAgIG91dC53cml0ZShMb25nLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgYWxsIGJ1ZmZlcmVkIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB7QGxpbmsgV3JpdGVyfQorICAgICAqIGFuZCBmbHVzaGVzIHRoYXQgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2hlcyBhbmQgY2xvc2VzIHRoaXMgd3JpdGVyIGFuZCB0aGUgdW5kZXJseWluZyB7QGxpbmsgV3JpdGVyfS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIEpTT04gZG9jdW1lbnQgaXMgaW5jb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgIGlmIChwZWVrKCkgIT0gSnNvblNjb3BlLk5PTkVNUFRZX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkluY29tcGxldGUgZG9jdW1lbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdHJpbmcoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGUoIlwiIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGcm9tIFJGQyA0NjI3LCAiQWxsIFVuaWNvZGUgY2hhcmFjdGVycyBtYXkgYmUgcGxhY2VkIHdpdGhpbiB0aGUKKyAgICAgICAgICAgICAqIHF1b3RhdGlvbiBtYXJrcyBleGNlcHQgZm9yIHRoZSBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBiZSBlc2NhcGVkOgorICAgICAgICAgICAgICogcXVvdGF0aW9uIG1hcmssIHJldmVyc2Ugc29saWR1cywgYW5kIHRoZSBjb250cm9sIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAqIChVKzAwMDAgdGhyb3VnaCBVKzAwMUYpLiIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJ1xcJyk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXFx0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcYiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXFxyIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcZiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChjIDw9IDB4MUYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShTdHJpbmcuZm9ybWF0KCJcXHUlMDR4IiwgKGludCkgYykpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKCJcIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBuZXdsaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluZGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvdXQud3JpdGUoIlxuIik7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3RhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG91dC53cml0ZShpbmRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyBhbnkgbmVjZXNzYXJ5IHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2UgYmVmb3JlIGEgbmFtZS4gQWxzbworICAgICAqIGFkanVzdHMgdGhlIHN0YWNrIHRvIGV4cGVjdCB0aGUgbmFtZSdzIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiZWZvcmVOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblNjb3BlIGNvbnRleHQgPSBwZWVrKCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IEpzb25TY29wZS5OT05FTVBUWV9PQkpFQ1QpIHsgLy8gZmlyc3QgaW4gb2JqZWN0CisgICAgICAgICAgICBvdXQud3JpdGUoJywnKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0ICE9IEpzb25TY29wZS5FTVBUWV9PQkpFQ1QpIHsgLy8gbm90IGluIGFuIG9iamVjdCEKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5lc3RpbmcgcHJvYmxlbTogIiArIHN0YWNrKTsKKyAgICAgICAgfQorICAgICAgICBuZXdsaW5lKCk7CisgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLkRBTkdMSU5HX05BTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgYW55IG5lY2Vzc2FyeSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIGJlZm9yZSBhIGxpdGVyYWwgdmFsdWUsCisgICAgICogaW5saW5lIGFycmF5LCBvciBpbmxpbmUgb2JqZWN0LiBBbHNvIGFkanVzdHMgdGhlIHN0YWNrIHRvIGV4cGVjdCBlaXRoZXIgYQorICAgICAqIGNsb3NpbmcgYnJhY2tldCBvciBhbm90aGVyIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5ldyBhcnJheSBvciBvYmplY3QsIHRoZSB0d28gdmFsdWVzCisgICAgICogICAgIHBlcm1pdHRlZCBhcyB0b3AtbGV2ZWwgZWxlbWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJlZm9yZVZhbHVlKGJvb2xlYW4gcm9vdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3dpdGNoIChwZWVrKCkpIHsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfRE9DVU1FTlQ6IC8vIGZpcnN0IGluIGRvY3VtZW50CisgICAgICAgICAgICAgICAgaWYgKCFyb290KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTT04gbXVzdCBzdGFydCB3aXRoIGFuIGFycmF5IG9yIGFuIG9iamVjdC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfRE9DVU1FTlQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEVNUFRZX0FSUkFZOiAvLyBmaXJzdCBpbiBhcnJheQorICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX0FSUkFZKTsKKyAgICAgICAgICAgICAgICBuZXdsaW5lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfQVJSQVk6IC8vIGFub3RoZXIgaW4gYXJyYXkKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgbmV3bGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERBTkdMSU5HX05BTUU6IC8vIHZhbHVlIGZvciBuYW1lCisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX09CSkVDVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJKU09OIG11c3QgaGF2ZSBvbmx5IG9uZSB0b3AtbGV2ZWwgdmFsdWUuIik7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTmVzdGluZyBwcm9ibGVtOiAiICsgc3RhY2spOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhCmluZGV4IDVjYmZkMjkuLjNiY2QyNjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUGF0dGVybnMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1BhdHRlcm5zLmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKIHB1YmxpYyBjbGFzcyBQYXR0ZXJucyB7CiAgICAgLyoqCiAgICAgICogIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhbGwgSUFOQSB0b3AtbGV2ZWwgZG9tYWlucy4KLSAgICAgKiAgTGlzdCBhY2N1cmF0ZSBhcyBvZiAyMDEwLzAyLzA1LiAgTGlzdCB0YWtlbiBmcm9tOgorICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDUvMDYuICBMaXN0IHRha2VuIGZyb206CiAgICAgICogIGh0dHA6Ly9kYXRhLmlhbmEub3JnL1RMRC90bGRzLWFscGhhLWJ5LWRvbWFpbi50eHQKICAgICAgKiAgVGhpcyBwYXR0ZXJuIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGZyYW1ld29ya3MvYmFzZS9jb21tb24vdG9vbHMvbWFrZS1pYW5hLXRsZC1wYXR0ZXJuLnB5CiAgICAgICovCkBAIC01Myw4ICs1Myw4IEBACiAgICAgICAgICsgInx1W2Fna3N5el0iCiAgICAgICAgICsgInx2W2FjZWdpbnVdIgogICAgICAgICArICJ8d1tmc10iCi0gICAgICAgICsgInwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKSIKLSAgICAgICAgKyAifHlbZXR1XSIKKyAgICAgICAgKyAifCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCkiCisgICAgICAgICsgInx5W2V0XSIKICAgICAgICAgKyAifHpbYW13XSkiOwogCiAgICAgLyoqCkBAIC02NSw3ICs2NSw3IEBACiAKICAgICAvKioKICAgICAgKiAgUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGFsbCBJQU5BIHRvcC1sZXZlbCBkb21haW5zIGZvciBXRUJfVVJMLgotICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDIvMDUuICBMaXN0IHRha2VuIGZyb206CisgICAgICogIExpc3QgYWNjdXJhdGUgYXMgb2YgMjAxMC8wNS8wNi4gIExpc3QgdGFrZW4gZnJvbToKICAgICAgKiAgaHR0cDovL2RhdGEuaWFuYS5vcmcvVExEL3RsZHMtYWxwaGEtYnktZG9tYWluLnR4dAogICAgICAqICBUaGlzIHBhdHRlcm4gaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9iYXNlL2NvbW1vbi90b29scy9tYWtlLWlhbmEtdGxkLXBhdHRlcm4ucHkKICAgICAgKi8KQEAgLTk0LDggKzk0LDggQEAKICAgICAgICAgKyAifHVbYWdrc3l6XSIKICAgICAgICAgKyAifHZbYWNlZ2ludV0iCiAgICAgICAgICsgInx3W2ZzXSIKLSAgICAgICAgKyAifCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCkiCi0gICAgICAgICsgInx5W2V0dV0iCisgICAgICAgICsgInwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCkiCisgICAgICAgICsgInx5W2V0XSIKICAgICAgICAgKyAifHpbYW13XSkpIjsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhCmluZGV4IDFjOGIzMzAuLjdmYzQzYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5LmphdmEKQEAgLTkwLDYgKzkwLDE2IEBACiAgICAgICAgIGRlbGV0ZShrZXkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXNbaW5kZXhdICE9IERFTEVURUQpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaW5kZXhdID0gREVMRVRFRDsKKyAgICAgICAgICAgIG1HYXJiYWdlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICBwcml2YXRlIHZvaWQgZ2MoKSB7CiAgICAgICAgIC8vIExvZy5lKCJTcGFyc2VBcnJheSIsICJnYyBzdGFydCB3aXRoICIgKyBtU2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltaW5nTG9nZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWluZ0xvZ2dlci5qYXZhCmluZGV4IDBmMzljOTcuLmJlNDQyZGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltaW5nTG9nZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9UaW1pbmdMb2dnZXIuamF2YQpAQCAtMjQsMjIgKzI0LDI2IEBACiAgKiBBIHV0aWxpdHkgY2xhc3MgdG8gaGVscCBsb2cgdGltaW5ncyBzcGxpdHMgdGhyb3VnaG91dCBhIG1ldGhvZCBjYWxsLgogICogVHlwaWNhbCB1c2FnZSBpczoKICAqCi0gKiBUaW1pbmdMb2dnZXIgdGltaW5ncyA9IG5ldyBUaW1pbmdMb2dnZXIoVEFHLCAibWV0aG9kQSIpOwotICogLi4uIGRvIHNvbWUgd29yayBBIC4uLgotICogdGltaW5ncy5hZGRTcGxpdCgid29yayBBIik7Ci0gKiAuLi4gZG8gc29tZSB3b3JrIEIgLi4uCi0gKiB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEIiKTsKLSAqIC4uLiBkbyBzb21lIHdvcmsgQyAuLi4KLSAqIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQyIpOwotICogdGltaW5ncy5kdW1wVG9Mb2coKTsKKyAqIDxwcmU+CisgKiAgICAgVGltaW5nTG9nZ2VyIHRpbWluZ3MgPSBuZXcgVGltaW5nTG9nZ2VyKFRBRywgIm1ldGhvZEEiKTsKKyAqICAgICAvLyAuLi4gZG8gc29tZSB3b3JrIEEgLi4uCisgKiAgICAgdGltaW5ncy5hZGRTcGxpdCgid29yayBBIik7CisgKiAgICAgLy8gLi4uIGRvIHNvbWUgd29yayBCIC4uLgorICogICAgIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQiIpOworICogICAgIC8vIC4uLiBkbyBzb21lIHdvcmsgQyAuLi4KKyAqICAgICB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEMiKTsKKyAqICAgICB0aW1pbmdzLmR1bXBUb0xvZygpOworICogPC9wcmU+CiAgKgotICogVGhlIGR1bXBUb0xvZyBjYWxsIHdvdWxkIGFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBsb2c6CisgKiA8cD5UaGUgZHVtcFRvTG9nIGNhbGwgd291bGQgYWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGxvZzo8L3A+CiAgKgotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6IGJlZ2luCi0gKiBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICA5IG1zLCB3b3JrIEEKLSAqIEQvVEFHICAgICAoIDM0NTkpOiBtZXRob2RBOiAgICAgIDEgbXMsIHdvcmsgQgotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgNiBtcywgd29yayBDCi0gKiBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogZW5kLCAxNiBtcworICogPHByZT4KKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogYmVnaW4KKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICA5IG1zLCB3b3JrIEEKKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICAxIG1zLCB3b3JrIEIKKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICA2IG1zLCB3b3JrIEMKKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogZW5kLCAxNiBtcworICogPC9wcmU+CiAgKi8KIHB1YmxpYyBjbGFzcyBUaW1pbmdMb2dnZXIgewogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbk1vZGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQWN0aW9uTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWZhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbk1vZGUuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCisKKy8qKgorICogUmVwcmVzZW50cyBhIGNvbnRleHR1YWwgbW9kZSBvZiB0aGUgdXNlciBpbnRlcmZhY2UuIEFjdGlvbiBtb2RlcyBjYW4gYmUgdXNlZCBmb3IKKyAqIG1vZGFsIGludGVyYWN0aW9ucyB3aXRoIGNvbnRlbnQgYW5kIHJlcGxhY2UgcGFydHMgb2YgdGhlIG5vcm1hbCBVSSB1bnRpbCBmaW5pc2hlZC4KKyAqIEV4YW1wbGVzIG9mIGdvb2QgYWN0aW9uIG1vZGVzIGluY2x1ZGUgc2VsZWN0aW9uIG1vZGVzLCBzZWFyY2gsIGNvbnRlbnQgZWRpdGluZywgZXRjLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uTW9kZSB7CisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aXRsZSBvZiB0aGUgYWN0aW9uIG1vZGUuIFRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBpZgorICAgICAqIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKGludCkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21WaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGl0bGUgb2YgdGhlIGFjdGlvbiBtb2RlLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QgaWYKKyAgICAgKiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiBhIHN0cmluZyB0byBzZXQgYXMgdGhlIHRpdGxlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1YnRpdGxlIG9mIHRoZSBhY3Rpb24gbW9kZS4gVGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIHZpc2libGUgZWZmZWN0IGlmCisgICAgICogYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VidGl0bGUgU3VidGl0bGUgc3RyaW5nIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoaW50KQorICAgICAqIEBzZWUgI3NldEN1c3RvbVZpZXcoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWJ0aXRsZSBvZiB0aGUgYWN0aW9uIG1vZGUuIFRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBpZgorICAgICAqIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc0lkIFJlc291cmNlIElEIG9mIGEgc3RyaW5nIHRvIHNldCBhcyB0aGUgc3VidGl0bGUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21WaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKTsKKworICAgIC8qKgorICAgICAqIFNldCBhIGN1c3RvbSB2aWV3IGZvciB0aGlzIGFjdGlvbiBtb2RlLiBUaGUgY3VzdG9tIHZpZXcgd2lsbCB0YWtlIHRoZSBwbGFjZSBvZgorICAgICAqIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUuIFVzZWZ1bCBmb3IgdGhpbmdzIGxpa2Ugc2VhcmNoIGJveGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXcgQ3VzdG9tIHZpZXcgdG8gdXNlIGluIHBsYWNlIG9mIHRoZSB0aXRsZS9zdWJ0aXRsZS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpOworCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZSB0aGUgYWN0aW9uIG1vZGUgYW5kIHJlZnJlc2ggbWVudSBjb250ZW50LiBUaGUgbW9kZSdzCisgICAgICoge0BsaW5rIEFjdGlvbk1vZGUuQ2FsbGJhY2t9IHdpbGwgaGF2ZSBpdHMKKyAgICAgKiB7QGxpbmsgQ2FsbGJhY2sjb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlLCBNZW51KX0gbWV0aG9kIGNhbGxlZC4KKyAgICAgKiBJZiBpdCByZXR1cm5zIHRydWUgdGhlIG1lbnUgd2lsbCBiZSBzY2FubmVkIGZvciB1cGRhdGVkIGNvbnRlbnQgYW5kIGFueSByZWxldmFudCBjaGFuZ2VzCisgICAgICogd2lsbCBiZSByZWZsZWN0ZWQgdG8gdGhlIHVzZXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52YWxpZGF0ZSgpOworCisgICAgLyoqCisgICAgICogRmluaXNoIGFuZCBjbG9zZSB0aGlzIGFjdGlvbiBtb2RlLiBUaGUgYWN0aW9uIG1vZGUncyB7QGxpbmsgQWN0aW9uTW9kZS5DYWxsYmFja30gd2lsbAorICAgICAqIGhhdmUgaXRzIHtAbGluayBDYWxsYmFjayNvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUpfSBtZXRob2QgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbmlzaCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVudSBvZiBhY3Rpb25zIHRoYXQgdGhpcyBhY3Rpb24gbW9kZSBwcmVzZW50cy4KKyAgICAgKiBAcmV0dXJuIFRoZSBhY3Rpb24gbW9kZSdzIG1lbnUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE1lbnUgZ2V0TWVudSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0aXRsZSBvZiB0aGlzIGFjdGlvbiBtb2RlLgorICAgICAqIEByZXR1cm4gVGl0bGUgdGV4dAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VidGl0bGUgb2YgdGhpcyBhY3Rpb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIFN1YnRpdGxlIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGN1c3RvbSB2aWV3IGZvciB0aGlzIGFjdGlvbiBtb2RlLgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgY3VzdG9tIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVmlldyBnZXRDdXN0b21WaWV3KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIE1lbnVJbmZsYXRlcn0gd2l0aCB0aGUgQWN0aW9uTW9kZSdzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgYWN0aW9uIG1vZGVzLiBTdXBwbGllZCB0bworICAgICAqIHtAbGluayBWaWV3I3N0YXJ0QWN0aW9uTW9kZShDYWxsYmFjayl9LCBhIENhbGxiYWNrCisgICAgICogY29uZmlndXJlcyBhbmQgaGFuZGxlcyBldmVudHMgcmFpc2VkIGJ5IGEgdXNlcidzIGludGVyYWN0aW9uIHdpdGggYW4gYWN0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiA8cD5BbiBhY3Rpb24gbW9kZSdzIGxpZmVjeWNsZSBpcyBhcyBmb2xsb3dzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIENhbGxiYWNrI29uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlLCBNZW51KX0gb25jZSBvbiBpbml0aWFsCisgICAgICogY3JlYXRpb248L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FsbGJhY2sjb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlLCBNZW51KX0gYWZ0ZXIgY3JlYXRpb24KKyAgICAgKiBhbmQgYW55IHRpbWUgdGhlIHtAbGluayBBY3Rpb25Nb2RlfSBpcyBpbnZhbGlkYXRlZDwvbGk+CisgICAgICogPGxpPntAbGluayBDYWxsYmFjayNvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUsIE1lbnVJdGVtKX0gYW55IHRpbWUgYQorICAgICAqIGNvbnRleHR1YWwgYWN0aW9uIGJ1dHRvbiBpcyBjbGlja2VkPC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENhbGxiYWNrI29uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSl9IHdoZW4gdGhlIGFjdGlvbiBtb2RlCisgICAgICogaXMgY2xvc2VkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYWN0aW9uIG1vZGUgaXMgZmlyc3QgY3JlYXRlZC4gVGhlIG1lbnUgc3VwcGxpZWQgd2lsbCBiZSB1c2VkIHRvCisgICAgICAgICAqIGdlbmVyYXRlIGFjdGlvbiBidXR0b25zIGZvciB0aGUgYWN0aW9uIG1vZGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIEFjdGlvbk1vZGUgYmVpbmcgY3JlYXRlZAorICAgICAgICAgKiBAcGFyYW0gbWVudSBNZW51IHVzZWQgdG8gcG9wdWxhdGUgYWN0aW9uIGJ1dHRvbnMKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gbW9kZSBzaG91bGQgYmUgY3JlYXRlZCwgZmFsc2UgaWYgZW50ZXJpbmcgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgbW9kZSBzaG91bGQgYmUgYWJvcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0byByZWZyZXNoIGFuIGFjdGlvbiBtb2RlJ3MgYWN0aW9uIG1lbnUgd2hlbmV2ZXIgaXQgaXMgaW52YWxpZGF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIEFjdGlvbk1vZGUgYmVpbmcgcHJlcGFyZWQKKyAgICAgICAgICogQHBhcmFtIG1lbnUgTWVudSB1c2VkIHRvIHBvcHVsYXRlIGFjdGlvbiBidXR0b25zCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVudSBvciBhY3Rpb24gbW9kZSB3YXMgdXBkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0byByZXBvcnQgYSB1c2VyIGNsaWNrIG9uIGFuIGFjdGlvbiBidXR0b24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBjdXJyZW50IEFjdGlvbk1vZGUKKyAgICAgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCB3YXMgY2xpY2tlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjYWxsYmFjayBoYW5kbGVkIHRoZSBldmVudCwgZmFsc2UgaWYgdGhlIHN0YW5kYXJkIE1lbnVJdGVtCisgICAgICAgICAqICAgICAgICAgIGludm9jYXRpb24gc2hvdWxkIGNvbnRpbnVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24gbW9kZSBpcyBhYm91dCB0byBiZSBleGl0ZWQgYW5kIGRlc3Ryb3llZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1vZGUgVGhlIGN1cnJlbnQgQWN0aW9uTW9kZSBiZWluZyBkZXN0cm95ZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EaXNwbGF5TGlzdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EaXNwbGF5TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTYwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Rpc3BsYXlMaXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCisvKioKKyAqIEEgZGlzcGxheSBsaXN0cyByZWNvcmRzIGEgc2VyaWVzIG9mIGdyYXBoaWNzIHJlbGF0ZWQgb3BlcmF0aW9uIGFuZCBjYW4gcmVwbGF5CisgKiB0aGVtIGxhdGVyLiBEaXNwbGF5IGxpc3RzIGFyZSB1c3VhbGx5IGJ1aWx0IGJ5IHJlY29yZGluZyBvcGVyYXRpb25zIG9uIGEKKyAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhc30uIFJlcGxheWluZyB0aGUgb3BlcmF0aW9ucyBmcm9tIGEgZGlzcGxheSBsaXN0CisgKiBhdm9pZHMgZXhlY3V0aW5nIHZpZXdzIGRyYXdpbmcgY29kZSBvbiBldmVyeSBmcmFtZSwgYW5kIGlzIHRodXMgbXVjaCBtb3JlCisgKiBlZmZpY2llbnQuIAorICovCithYnN0cmFjdCBjbGFzcyBEaXNwbGF5TGlzdCB7CisgICAgLyoqCisgICAgICogU3RhcnRzIHJlY29yZGluZyB0aGUgZGlzcGxheSBsaXN0LiBBbGwgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlCisgICAgICogcmV0dXJuZWQgY2FudmFzIGFyZSByZWNvcmRlZCBhbmQgc3RvcmVkIGluIHRoaXMgZGlzcGxheSBsaXN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSBjYW52YXMgdG8gcmVjb3JkIGRyYXdpbmcgb3BlcmF0aW9ucy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBIYXJkd2FyZUNhbnZhcyBzdGFydCgpOworCisgICAgLyoqCisgICAgICogRW5kcyB0aGUgcmVjb3JkaW5nIGZvciB0aGlzIGRpc3BsYXkgbGlzdC4gQSBkaXNwbGF5IGxpc3QgY2Fubm90IGJlCisgICAgICogcmVwbGF5ZWQgaWYgcmVjb3JkaW5nIGlzIG5vdCBmaW5pc2hlZC4gCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBlbmQoKTsKKworICAgIC8qKgorICAgICAqIEZyZWVzIHJlc291cmNlcyB0YWtlbiBieSB0aGlzIGRpc3BsYXkgbGlzdC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQKKyAgICAgKiBiZWZvcmUgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBkaXNwbGF5IGxpc3QgY2FuIGJlIHJlcGxheWVkIG9yIG5vdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGRpc3BsYXkgbGlzdCBjYW4gYmUgcmVwbGF5ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5IYXJkd2FyZUNhbnZhcyNkcmF3RGlzcGxheUxpc3QoRGlzcGxheUxpc3QpIAorICAgICAqLworICAgIGFic3RyYWN0IGJvb2xlYW4gaXNSZWFkeSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EcmFnRXZlbnQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRHJhZ0V2ZW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4OTQzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRHJhZ0V2ZW50LmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitwYXJjZWxhYmxlIERyYWdFdmVudDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRHJhZ0V2ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0RyYWdFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTk4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0RyYWdFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKKy8qKiAhISEgVE9ETzogcmVhbCBkb2NzICovCitwdWJsaWMgY2xhc3MgRHJhZ0V2ZW50IGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBUUkFDS19SRUNZQ0xFRF9MT0NBVElPTiA9IGZhbHNlOworCisgICAgaW50IG1BY3Rpb247CisgICAgZmxvYXQgbVgsIG1ZOworICAgIENsaXBEZXNjcmlwdGlvbiBtQ2xpcERlc2NyaXB0aW9uOworICAgIENsaXBEYXRhIG1DbGlwRGF0YTsKKworICAgIHByaXZhdGUgRHJhZ0V2ZW50IG1OZXh0OworICAgIHByaXZhdGUgUnVudGltZUV4Y2VwdGlvbiBtUmVjeWNsZWRMb2NhdGlvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlY3ljbGVkOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRUNZQ0xFRCA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBnUmVjeWNsZXJMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGludCBnUmVjeWNsZXJVc2VkID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBEcmFnRXZlbnQgZ1JlY3ljbGVyVG9wID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIGFjdGlvbiBjb25zdGFudHMgZm9yIERyYWdFdmVudCBkaXNwYXRjaAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9EUkFHX1NUQVJURUQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9EUkFHX0xPQ0FUSU9OID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fRFJPUCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0RSQUdfRU5ERUQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9EUkFHX0VOVEVSRUQgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9EUkFHX0VYSVRFRCA9IDY7CisKKyAgICAvKiBoaWRlIHRoZSBjb25zdHJ1Y3RvciBiZWhpbmQgcGFja2FnZSBzY29wZSAqLworICAgIHByaXZhdGUgRHJhZ0V2ZW50KCkgeworICAgIH0KKworICAgIHN0YXRpYyBEcmFnRXZlbnQgb2J0YWluKCkgeworICAgICAgICByZXR1cm4gRHJhZ0V2ZW50Lm9idGFpbigwLCAwZiwgMGYsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRHJhZ0V2ZW50IG9idGFpbihpbnQgYWN0aW9uLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgQ2xpcERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBDbGlwRGF0YSBkYXRhKSB7CisgICAgICAgIGZpbmFsIERyYWdFdmVudCBldjsKKyAgICAgICAgc3luY2hyb25pemVkIChnUmVjeWNsZXJMb2NrKSB7CisgICAgICAgICAgICBpZiAoZ1JlY3ljbGVyVG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERyYWdFdmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXYgPSBnUmVjeWNsZXJUb3A7CisgICAgICAgICAgICBnUmVjeWNsZXJUb3AgPSBldi5tTmV4dDsKKyAgICAgICAgICAgIGdSZWN5Y2xlclVzZWQgLT0gMTsKKyAgICAgICAgfQorICAgICAgICBldi5tUmVjeWNsZWRMb2NhdGlvbiA9IG51bGw7CisgICAgICAgIGV2Lm1SZWN5Y2xlZCA9IGZhbHNlOworICAgICAgICBldi5tTmV4dCA9IG51bGw7CisKKyAgICAgICAgZXYubUFjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgZXYubVggPSB4OworICAgICAgICBldi5tWSA9IHk7CisgICAgICAgIGV2Lm1DbGlwRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgZXYubUNsaXBEYXRhID0gZGF0YTsKKworICAgICAgICByZXR1cm4gZXY7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEcmFnRXZlbnQgb2J0YWluKERyYWdFdmVudCBzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIG9idGFpbihzb3VyY2UubUFjdGlvbiwgc291cmNlLm1YLCBzb3VyY2UubVksCisgICAgICAgICAgICAgICAgc291cmNlLm1DbGlwRGVzY3JpcHRpb24sIHNvdXJjZS5tQ2xpcERhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0WCgpIHsKKyAgICAgICAgcmV0dXJuIG1YOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRZKCkgeworICAgICAgICByZXR1cm4gbVk7CisgICAgfQorCisgICAgcHVibGljIENsaXBEYXRhIGdldENsaXBEYXRhKCkgeworICAgICAgICByZXR1cm4gbUNsaXBEYXRhOworICAgIH0KKworICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gZ2V0Q2xpcERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbUNsaXBEZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN5Y2xlIHRoZSBEcmFnRXZlbnQsIHRvIGJlIHJlLXVzZWQgYnkgYSBsYXRlciBjYWxsZXIuICBBZnRlciBjYWxsaW5nCisgICAgICogdGhpcyBmdW5jdGlvbiB5b3UgbXVzdCBuZXZlciB0b3VjaCB0aGUgZXZlbnQgYWdhaW4uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgLy8gRW5zdXJlIHJlY3ljbGUgaXMgb25seSBjYWxsZWQgb25jZSEKKyAgICAgICAgaWYgKFRSQUNLX1JFQ1lDTEVEX0xPQ0FUSU9OKSB7CisgICAgICAgICAgICBpZiAobVJlY3ljbGVkTG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRvU3RyaW5nKCkgKyAiIHJlY3ljbGVkIHR3aWNlISIsIG1SZWN5Y2xlZExvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZWN5Y2xlZExvY2F0aW9uID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkxhc3QgcmVjeWNsZWQgaGVyZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1SZWN5Y2xlZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRvU3RyaW5nKCkgKyAiIHJlY3ljbGVkIHR3aWNlISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlY3ljbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1DbGlwRGF0YSA9IG51bGw7CisgICAgICAgIG1DbGlwRGVzY3JpcHRpb24gPSBudWxsOworCisgICAgICAgIHN5bmNocm9uaXplZCAoZ1JlY3ljbGVyTG9jaykgeworICAgICAgICAgICAgaWYgKGdSZWN5Y2xlclVzZWQgPCBNQVhfUkVDWUNMRUQpIHsKKyAgICAgICAgICAgICAgICBnUmVjeWNsZXJVc2VkKys7CisgICAgICAgICAgICAgICAgbU5leHQgPSBnUmVjeWNsZXJUb3A7CisgICAgICAgICAgICAgICAgZ1JlY3ljbGVyVG9wID0gdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiRHJhZ0V2ZW50eyIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKQorICAgICAgICArICIgYWN0aW9uPSIgKyBtQWN0aW9uICsgIiBAICgiICsgbVggKyAiLCAiICsgbVkgKyAiKSBkZXNjPSIgKyBtQ2xpcERlc2NyaXB0aW9uCisgICAgICAgICsgIiBkYXRhPSIgKyBtQ2xpcERhdGEKKyAgICAgICAgKyAifSI7CisgICAgfQorCisgICAgLyogUGFyY2VsYWJsZSBpbnRlcmZhY2UgKi8KKworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUFjdGlvbik7CisgICAgICAgIGRlc3Qud3JpdGVGbG9hdChtWCk7CisgICAgICAgIGRlc3Qud3JpdGVGbG9hdChtWSk7CisgICAgICAgIGlmIChtQ2xpcERhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBtQ2xpcERhdGEud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DbGlwRGVzY3JpcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBtQ2xpcERlc2NyaXB0aW9uLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8RHJhZ0V2ZW50PiBDUkVBVE9SID0KKyAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxEcmFnRXZlbnQ+KCkgeworICAgICAgICBwdWJsaWMgRHJhZ0V2ZW50IGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICBEcmFnRXZlbnQgZXZlbnQgPSBEcmFnRXZlbnQub2J0YWluKCk7CisgICAgICAgICAgICBldmVudC5tQWN0aW9uID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgZXZlbnQubVggPSBpbi5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgIGV2ZW50Lm1ZID0gaW4ucmVhZEZsb2F0KCk7CisgICAgICAgICAgICBpZiAoaW4ucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBldmVudC5tQ2xpcERhdGEgPSBDbGlwRGF0YS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluLnJlYWRJbnQoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZXZlbnQubUNsaXBEZXNjcmlwdGlvbiA9IENsaXBEZXNjcmlwdGlvbi5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGV2ZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERyYWdFdmVudFtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERyYWdFdmVudFtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmFkYjgyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YQpAQCAtMCwwICsxLDg1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlRlbXBvcmFyeUJ1ZmZlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBDYW52YXMgb24gdG9wIG9mIE9wZW5HTCBFUyAyLjAuCisgKi8KK2NsYXNzIEdMRVMyMENhbnZhcyBleHRlbmRzIEhhcmR3YXJlQ2FudmFzIHsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbU9wYXF1ZTsKKyAgICBwcml2YXRlIGludCBtUmVuZGVyZXI7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOworICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1Qb2ludCA9IG5ldyBmbG9hdFsyXTsKKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbUxpbmUgPSBuZXcgZmxvYXRbNF07CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1DbGlwQm91bmRzID0gbmV3IFJlY3QoKTsKKworICAgIHByaXZhdGUgRHJhd0ZpbHRlciBtRmlsdGVyOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1Db250ZXh0TG9ja2VkOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSk5JCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuSXNBdmFpbGFibGUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNJc0F2YWlsYWJsZSA9IG5Jc0F2YWlsYWJsZSgpOworCisgICAgc3RhdGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBzSXNBdmFpbGFibGU7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBHTEVTMjBDYW52YXMoYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICB0aGlzKGZhbHNlLCB0cmFuc2x1Y2VudCk7CisgICAgfQorICAgIAorICAgIEdMRVMyMENhbnZhcyhib29sZWFuIHJlY29yZCwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICBtT3BhcXVlID0gIXRyYW5zbHVjZW50OworCisgICAgICAgIGlmIChyZWNvcmQpIHsKKyAgICAgICAgICAgIG1SZW5kZXJlciA9IG5DcmVhdGVEaXNwbGF5TGlzdFJlbmRlcmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVuZGVyZXIgPSBuQ3JlYXRlUmVuZGVyZXIoKTsKKyAgICAgICAgfQorICAgICAgIAorICAgICAgICBpZiAobVJlbmRlcmVyID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgR0xFUzIwQ2FudmFzIHJlbmRlcmVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbkNyZWF0ZVJlbmRlcmVyKCk7ICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGludCBuQ3JlYXRlRGlzcGxheUxpc3RSZW5kZXJlcigpOyAgICAKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpZiAobVJlbmRlcmVyICE9IDApIHsKKyAgICAgICAgICAgIG5EZXN0cm95UmVuZGVyZXIobVJlbmRlcmVyKTsKKyAgICAgICAgICAgIG1SZW5kZXJlciA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EZXN0cm95UmVuZGVyZXIoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENhbnZhcyBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1PcGFxdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1XaWR0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1IZWlnaHQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2V0dXAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICBuU2V0Vmlld3BvcnQobVJlbmRlcmVyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0Vmlld3BvcnQoaW50IHJlbmRlcmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgIG5QcmVwYXJlKG1SZW5kZXJlciwgbU9wYXF1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUHJlcGFyZShpbnQgcmVuZGVyZXIsIGJvb2xlYW4gb3BhcXVlKTsKKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgb25Qb3N0RHJhdygpIHsKKyAgICAgICAgbkZpbmlzaChtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5GaW5pc2goaW50IHJlbmRlcmVyKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFjcXVpcmVDb250ZXh0KCkgeworICAgICAgICBpZiAoIW1Db250ZXh0TG9ja2VkKSB7CisgICAgICAgICAgICBuQWNxdWlyZUNvbnRleHQobVJlbmRlcmVyKTsKKyAgICAgICAgICAgIG1Db250ZXh0TG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvbnRleHRMb2NrZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuQWNxdWlyZUNvbnRleHQoaW50IHJlbmRlcmVyKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VDb250ZXh0KCkgeworICAgICAgICBpZiAobUNvbnRleHRMb2NrZWQpIHsKKyAgICAgICAgICAgIG5SZWxlYXNlQ29udGV4dChtUmVuZGVyZXIpOworICAgICAgICAgICAgbUNvbnRleHRMb2NrZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJlbGVhc2VDb250ZXh0KGludCByZW5kZXJlcik7CisgICAgCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRGlzcGxheSBsaXN0CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBpbnQgZ2V0RGlzcGxheUxpc3QoKSB7CisgICAgICAgIHJldHVybiBuQ3JlYXRlRGlzcGxheUxpc3QobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbkNyZWF0ZURpc3BsYXlMaXN0KGludCByZW5kZXJlcik7CisgICAgCisgICAgdm9pZCBkZXN0cm95RGlzcGxheUxpc3QoaW50IGRpc3BsYXlMaXN0KSB7CisgICAgICAgIG5EZXN0cm95RGlzcGxheUxpc3QoZGlzcGxheUxpc3QpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRlc3Ryb3lEaXNwbGF5TGlzdChpbnQgZGlzcGxheUxpc3QpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0Rpc3BsYXlMaXN0KERpc3BsYXlMaXN0IGRpc3BsYXlMaXN0KSB7CisgICAgICAgIG5EcmF3RGlzcGxheUxpc3QobVJlbmRlcmVyLCAoKEdMRVMyMERpc3BsYXlMaXN0KSBkaXNwbGF5TGlzdCkubU5hdGl2ZURpc3BsYXlMaXN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3RGlzcGxheUxpc3QoaW50IHJlbmRlcmVyLCBpbnQgZGlzcGxheUxpc3QpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ2xpcHBpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBQYXRoKFBhdGggcGF0aCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUGF0aChQYXRoIHBhdGgsIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5DbGlwUmVjdChpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBvcCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbkNsaXBSZWN0KGludCByZW5kZXJlciwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwgaW50IG9wKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3QgcmVjdCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOyAgICAgICAgCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdCByZWN0LCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3RGIHJlY3QpIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgIFJlZ2lvbi5PcC5JTlRFUlNFQ1QubmF0aXZlSW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0RiByZWN0LCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWdpb24oUmVnaW9uIHJlZ2lvbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVnaW9uKFJlZ2lvbiByZWdpb24sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbGlwQm91bmRzKFJlY3QgYm91bmRzKSB7CisgICAgICAgIHJldHVybiBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIGJvdW5kcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuR2V0Q2xpcEJvdW5kcyhpbnQgcmVuZGVyZXIsIFJlY3QgYm91bmRzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgRWRnZVR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gblF1aWNrUmVqZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0eXBlLm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gblF1aWNrUmVqZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGVkZ2UpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoUGF0aCBwYXRoLCBFZGdlVHlwZSB0eXBlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KFJlY3RGIHJlY3QsIEVkZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHF1aWNrUmVqZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCB0eXBlKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUcmFuc2Zvcm1hdGlvbnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgblRyYW5zbGF0ZShtUmVuZGVyZXIsIGR4LCBkeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblRyYW5zbGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGR4LCBmbG9hdCBkeSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2V3KGZsb2F0IHN4LCBmbG9hdCBzeSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgICAgICBuUm90YXRlKG1SZW5kZXJlciwgZGVncmVlcyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJvdGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGRlZ3JlZXMpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgICAgIG5TY2FsZShtUmVuZGVyZXIsIHN4LCBzeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNjYWxlKGludCByZW5kZXJlciwgZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeChNYXRyaXggbWF0cml4KSB7CisgICAgICAgIG5TZXRNYXRyaXgobVJlbmRlcmVyLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0TWF0cml4KGludCByZW5kZXJlciwgaW50IG1hdHJpeCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRNYXRyaXgoTWF0cml4IG1hdHJpeCkgeworICAgICAgICBuR2V0TWF0cml4KG1SZW5kZXJlciwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkdldE1hdHJpeChpbnQgcmVuZGVyZXIsIGludCBtYXRyaXgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uY2F0KE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgbkNvbmNhdE1hdHJpeChtUmVuZGVyZXIsIG1hdHJpeC5uYXRpdmVfaW5zdGFuY2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5Db25jYXRNYXRyaXgoaW50IHJlbmRlcmVyLCBpbnQgbWF0cml4KTsKKyAgICAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTdGF0ZSBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoKSB7CisgICAgICAgIHJldHVybiBuU2F2ZShtUmVuZGVyZXIsIENhbnZhcy5DTElQX1NBVkVfRkxBRyB8IENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlKGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5TYXZlKG1SZW5kZXJlciwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgblNhdmUoaW50IHJlbmRlcmVyLCBpbnQgZmxhZ3MpOworICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyKFJlY3RGIGJvdW5kcywgUGFpbnQgcGFpbnQsIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHNhdmVMYXllcihib3VuZHMubGVmdCwgYm91bmRzLnRvcCwgYm91bmRzLnJpZ2h0LCBib3VuZHMuYm90dG9tLCBwYWludCwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFBhaW50IHBhaW50LAorICAgICAgICAgICAgaW50IHNhdmVGbGFncykgeworICAgICAgICBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgcmV0dXJuIG5TYXZlTGF5ZXIobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG5hdGl2ZVBhaW50LCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuU2F2ZUxheWVyKGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IHBhaW50LCBpbnQgc2F2ZUZsYWdzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyQWxwaGEoUmVjdEYgYm91bmRzLCBpbnQgYWxwaGEsIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHNhdmVMYXllckFscGhhKGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sCisgICAgICAgICAgICAgICAgYWxwaGEsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXJBbHBoYShmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBhbHBoYSwKKyAgICAgICAgICAgIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5TYXZlTGF5ZXJBbHBoYShtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5TYXZlTGF5ZXJBbHBoYShpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICBmbG9hdCBib3R0b20sIGludCBhbHBoYSwgaW50IHNhdmVGbGFncyk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzdG9yZSgpIHsKKyAgICAgICAgblJlc3RvcmUobVJlbmRlcmVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzdG9yZShpbnQgcmVuZGVyZXIpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCkgeworICAgICAgICBuUmVzdG9yZVRvQ291bnQobVJlbmRlcmVyLCBzYXZlQ291bnQpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJlc3RvcmVUb0NvdW50KGludCByZW5kZXJlciwgaW50IHNhdmVDb3VudCk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRTYXZlQ291bnQoKSB7CisgICAgICAgIHJldHVybiBuR2V0U2F2ZUNvdW50KG1SZW5kZXJlcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGludCBuR2V0U2F2ZUNvdW50KGludCByZW5kZXJlcik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBGaWx0ZXJpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldERyYXdGaWx0ZXIoRHJhd0ZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgbUZpbHRlciA9IGZpbHRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRHJhd0ZpbHRlciBnZXREcmF3RmlsdGVyKCkgeworICAgICAgICByZXR1cm4gbUZpbHRlcjsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBEcmF3aW5nCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3QXJjKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUsIGJvb2xlYW4gdXNlQ2VudGVyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0FSR0IoaW50IGEsIGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgICAgICAgZHJhd0NvbG9yKChhICYgMHhGRikgPDwgMjQgfCAociAmIDB4RkYpIDw8IDE2IHwgKGcgJiAweEZGKSA8PCA4IHwgKGIgJiAweEZGKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BhdGNoKEJpdG1hcCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIFJlY3RGIGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgcGF0Y2hlcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3UGF0Y2gobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgY2h1bmtzLCBkc3QubGVmdCwgZHN0LnRvcCwKKyAgICAgICAgICAgICAgICBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UGF0Y2goaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBieXRlW10gY2h1bmtzLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBsZWZ0LCB0b3AsIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3Qml0bWFwKGludCByZW5kZXJlciwgaW50IGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBNYXRyaXggbWF0cml4LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBpbnQgbWF0cml4LCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBSZWN0IHNyYywgUmVjdCBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworCisgICAgICAgIGludCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgbGVmdCA9IHRvcCA9IDA7CisgICAgICAgICAgICByaWdodCA9IGJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgYm90dG9tID0gYml0bWFwLmdldEhlaWdodCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVmdCA9IHNyYy5sZWZ0OworICAgICAgICAgICAgcmlnaHQgPSBzcmMucmlnaHQ7CisgICAgICAgICAgICB0b3AgPSBzcmMudG9wOworICAgICAgICAgICAgYm90dG9tID0gc3JjLmJvdHRvbTsKKyAgICAgICAgfQorCisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYml0bWFwLm1OYXRpdmVCaXRtYXAsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKKyAgICAgICAgICAgICAgICBkc3QubGVmdCwgZHN0LnRvcCwgZHN0LnJpZ2h0LCBkc3QuYm90dG9tLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBSZWN0IHNyYywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgc3JjLmxlZnQsIHNyYy50b3AsIHNyYy5yaWdodCwgc3JjLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBkc3QubGVmdCwgZHN0LnRvcCwgZHN0LnJpZ2h0LCBkc3QuYm90dG9tLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0JpdG1hcChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsCisgICAgICAgICAgICBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sCisgICAgICAgICAgICBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKGludFtdIGNvbG9ycywgaW50IG9mZnNldCwgaW50IHN0cmlkZSwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBoYXNBbHBoYSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgQml0bWFwLkNvbmZpZyBjb25maWcgPSBoYXNBbHBoYSA/IEJpdG1hcC5Db25maWcuQVJHQl84ODg4IDogQml0bWFwLkNvbmZpZy5SR0JfNTY1OworICAgICAgICBmaW5hbCBCaXRtYXAgYiA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoY29sb3JzLCBvZmZzZXQsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCwgY29uZmlnKTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYi5tTmF0aXZlQml0bWFwLCB4LCB5LCBuYXRpdmVQYWludCk7CisgICAgICAgIGIucmVjeWNsZSgpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoaW50W10gY29sb3JzLCBpbnQgb2Zmc2V0LCBpbnQgc3RyaWRlLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gaGFzQWxwaGEsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgZHJhd0JpdG1hcChjb2xvcnMsIG9mZnNldCwgc3RyaWRlLCAoZmxvYXQpIHgsIChmbG9hdCkgeSwgd2lkdGgsIGhlaWdodCwgaGFzQWxwaGEsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwTWVzaChCaXRtYXAgYml0bWFwLCBpbnQgbWVzaFdpZHRoLCBpbnQgbWVzaEhlaWdodCwgZmxvYXRbXSB2ZXJ0cywKKyAgICAgICAgICAgIGludCB2ZXJ0T2Zmc2V0LCBpbnRbXSBjb2xvcnMsIGludCBjb2xvck9mZnNldCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0NpcmNsZShmbG9hdCBjeCwgZmxvYXQgY3ksIGZsb2F0IHJhZGl1cywgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvcikgeworICAgICAgICBkcmF3Q29sb3IoY29sb3IsIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvciwgUG9ydGVyRHVmZi5Nb2RlIG1vZGUpIHsKKyAgICAgICAgbkRyYXdDb2xvcihtUmVuZGVyZXIsIGNvbG9yLCBtb2RlLm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdDb2xvcihpbnQgcmVuZGVyZXIsIGludCBjb2xvciwgaW50IG1vZGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0xpbmUoZmxvYXQgc3RhcnRYLCBmbG9hdCBzdGFydFksIGZsb2F0IHN0b3BYLCBmbG9hdCBzdG9wWSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbUxpbmVbMF0gPSBzdGFydFg7CisgICAgICAgIG1MaW5lWzFdID0gc3RhcnRZOworICAgICAgICBtTGluZVsyXSA9IHN0b3BYOworICAgICAgICBtTGluZVszXSA9IHN0b3BZOworICAgICAgICBkcmF3TGluZXMobUxpbmUsIDAsIDQsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZXMoZmxvYXRbXSBwdHMsIGludCBvZmZzZXQsIGludCBjb3VudCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgaWYgKChvZmZzZXQgfCBjb3VudCkgPCAwIHx8IG9mZnNldCArIGNvdW50ID4gcHRzLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGxpbmVzIGFycmF5IG11c3QgY29udGFpbiA0IGVsZW1lbnRzIHBlciBsaW5lLiIpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIG5EcmF3TGluZXMobVJlbmRlcmVyLCBwdHMsIG9mZnNldCwgY291bnQsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0xpbmVzKGludCByZW5kZXJlciwgZmxvYXRbXSBwb2ludHMsIGludCBvZmZzZXQsIGludCBjb3VudCwgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdMaW5lcyhmbG9hdFtdIHB0cywgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZHJhd0xpbmVzKHB0cywgMCwgcHRzLmxlbmd0aCwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdPdmFsKFJlY3RGIG92YWwsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQYWludChQYWludCBwYWludCkgeworICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQ2xpcEJvdW5kczsKKyAgICAgICAgbkdldENsaXBCb3VuZHMobVJlbmRlcmVyLCByKTsKKyAgICAgICAgZHJhd1JlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0aChQYXRoIHBhdGgsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIGlmIChwYXRoLmlzU2ltcGxlUGF0aCkgeworICAgICAgICAgICAgaWYgKHBhdGgucmVjdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5EcmF3UmVjdHMobVJlbmRlcmVyLCBwYXRoLnJlY3RzLm1OYXRpdmVSZWdpb24sIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuRHJhd1BhdGgobVJlbmRlcmVyLCBwYXRoLm1OYXRpdmVQYXRoLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1BhdGgoaW50IHJlbmRlcmVyLCBpbnQgcGF0aCwgaW50IHBhaW50KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UmVjdHMoaW50IHJlbmRlcmVyLCBpbnQgcmVnaW9uLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQaWN0dXJlKFBpY3R1cmUgcGljdHVyZSwgUmVjdCBkc3QpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlLCBSZWN0RiBkc3QpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BvaW50KGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIG1Qb2ludFswXSA9IHg7CisgICAgICAgIG1Qb2ludFsxXSA9IHk7CisgICAgICAgIGRyYXdQb2ludHMobVBvaW50LCAwLCAxLCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BvaW50cyhmbG9hdFtdIHB0cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnRzKGZsb2F0W10gcHRzLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UG9pbnRzKHB0cywgMCwgcHRzLmxlbmd0aCAvIDIsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9zVGV4dChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0W10gcG9zLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9zVGV4dChTdHJpbmcgdGV4dCwgZmxvYXRbXSBwb3MsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgbkRyYXdSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdSZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KFJlY3QgciwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZHJhd1JlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UmVjdChSZWN0RiByLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSR0IoaW50IHIsIGludCBnLCBpbnQgYikgeworICAgICAgICBkcmF3Q29sb3IoMHhGRjAwMDAwMCB8IChyICYgMHhGRikgPDwgMTYgfCAoZyAmIDB4RkYpIDw8IDggfCAoYiAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Um91bmRSZWN0KFJlY3RGIHJlY3QsIGZsb2F0IHJ4LCBmbG9hdCByeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCAoaW5kZXggKyBjb3VudCkgfCAodGV4dC5sZW5ndGggLSBpbmRleCAtIGNvdW50KSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHQoaW50IHJlbmRlcmVyLCBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHQobVJlbmRlcmVyLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0KHRoaXMsIHN0YXJ0LCBlbmQsIHgsIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHQobVJlbmRlcmVyLCBidWYsIDAsIGVuZCAtIHN0YXJ0LCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IChlbmQgLSBzdGFydCkgfCAodGV4dC5sZW5ndGgoKSAtIGVuZCkpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuRHJhd1RleHQobVJlbmRlcmVyLCB0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdUZXh0KGludCByZW5kZXJlciwgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRPblBhdGgoY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBQYXRoIHBhdGgsIGZsb2F0IGhPZmZzZXQsCisgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aChTdHJpbmcgdGV4dCwgUGF0aCBwYXRoLCBmbG9hdCBoT2Zmc2V0LCBmbG9hdCB2T2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCB0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlyICE9IERJUkVDVElPTl9MVFIgJiYgZGlyICE9IERJUkVDVElPTl9SVEwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gZGlyZWN0aW9uOiAiICsgZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuRHJhd1RleHRSdW4obVJlbmRlcmVyLCB0ZXh0LCBpbmRleCwgY291bnQsIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCB4LCB5LCBkaXIsCisgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHRSdW4oaW50IHJlbmRlcmVyLCBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLCBpbnQgbmF0aXZlUGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgZW5kIC0gc3RhcnQgfCB0ZXh0Lmxlbmd0aCgpIC0gZW5kKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGZsYWdzID0gZGlyID09IDAgPyAwIDogMTsKKyAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHRSdW4obVJlbmRlcmVyLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0UnVuKHRoaXMsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHRSdW4obVJlbmRlcmVyLCBidWYsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBsZW4sIDAsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdUZXh0UnVuKGludCByZW5kZXJlciwgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBuYXRpdmVQYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VmVydGljZXMoVmVydGV4TW9kZSBtb2RlLCBpbnQgdmVydGV4Q291bnQsIGZsb2F0W10gdmVydHMsIGludCB2ZXJ0T2Zmc2V0LAorICAgICAgICAgICAgZmxvYXRbXSB0ZXhzLCBpbnQgdGV4T2Zmc2V0LCBpbnRbXSBjb2xvcnMsIGludCBjb2xvck9mZnNldCwgc2hvcnRbXSBpbmRpY2VzLAorICAgICAgICAgICAgaW50IGluZGV4T2Zmc2V0LCBpbnQgaW5kZXhDb3VudCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNldHVwTW9kaWZpZXJzKFBhaW50IHBhaW50KSB7CisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBmYWxzZTsKKworICAgICAgICBpZiAocGFpbnQuaGFzU2hhZG93KSB7CisgICAgICAgICAgICBuU2V0dXBTaGFkb3cobVJlbmRlcmVyLCBwYWludC5zaGFkb3dSYWRpdXMsIHBhaW50LnNoYWRvd0R4LCBwYWludC5zaGFkb3dEeSwKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2hhZG93Q29sb3IpOworICAgICAgICAgICAgaGFzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU2hhZGVyIHNoYWRlciA9IHBhaW50LmdldFNoYWRlcigpOworICAgICAgICBpZiAoc2hhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5TZXR1cFNoYWRlcihtUmVuZGVyZXIsIHNoYWRlci5uYXRpdmVfc2hhZGVyKTsKKyAgICAgICAgICAgIGhhc01vZGlmaWVyID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbG9yRmlsdGVyIGZpbHRlciA9IHBhaW50LmdldENvbG9yRmlsdGVyKCk7CisgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwQ29sb3JGaWx0ZXIobVJlbmRlcmVyLCBmaWx0ZXIubmF0aXZlQ29sb3JGaWx0ZXIpOworICAgICAgICAgICAgaGFzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhc01vZGlmaWVyOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzZXR1cENvbG9yRmlsdGVyKFBhaW50IHBhaW50KSB7CisgICAgICAgIGZpbmFsIENvbG9yRmlsdGVyIGZpbHRlciA9IHBhaW50LmdldENvbG9yRmlsdGVyKCk7CisgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwQ29sb3JGaWx0ZXIobVJlbmRlcmVyLCBmaWx0ZXIubmF0aXZlQ29sb3JGaWx0ZXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNldHVwU2hhZGVyKGludCByZW5kZXJlciwgaW50IHNoYWRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0dXBDb2xvckZpbHRlcihpbnQgcmVuZGVyZXIsIGludCBjb2xvckZpbHRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0dXBTaGFkb3coaW50IHJlbmRlcmVyLCBmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKTsKKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJlc2V0TW9kaWZpZXJzKGludCByZW5kZXJlcik7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMERpc3BsYXlMaXN0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMERpc3BsYXlMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4NmJmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwRGlzcGxheUxpc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXc7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgZGlzcGxheSBsaXN0IGZvciBPcGVuR0wgRVMgMi4wLgorICovCitjbGFzcyBHTEVTMjBEaXNwbGF5TGlzdCBleHRlbmRzIERpc3BsYXlMaXN0IHsKKyAgICBwcml2YXRlIEdMRVMyMENhbnZhcyBtQ2FudmFzOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZWNvcmRlZCA9IGZhbHNlOworCisgICAgaW50IG1OYXRpdmVEaXNwbGF5TGlzdDsKKworICAgIEBPdmVycmlkZQorICAgIEhhcmR3YXJlQ2FudmFzIHN0YXJ0KCkgeworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlY29yZGluZyBoYXMgYWxyZWFkeSBzdGFydGVkIik7CisgICAgICAgIH0KKworICAgICAgICBkZXN0cm95Q2FudmFzKCk7CisKKyAgICAgICAgbUNhbnZhcyA9IG5ldyBHTEVTMjBDYW52YXModHJ1ZSwgdHJ1ZSk7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgbVJlY29yZGVkID0gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIG1DYW52YXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlc3Ryb3lDYW52YXMoKSB7CisgICAgICAgIGlmIChtQ2FudmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DYW52YXMuZGVzdHJveURpc3BsYXlMaXN0KG1OYXRpdmVEaXNwbGF5TGlzdCk7CisgICAgICAgICAgICBtQ2FudmFzLmRlc3Ryb3koKTsKKworICAgICAgICAgICAgbUNhbnZhcyA9IG51bGw7CisgICAgICAgICAgICBtTmF0aXZlRGlzcGxheUxpc3QgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBlbmQoKSB7CisgICAgICAgIGlmIChtQ2FudmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBtUmVjb3JkZWQgPSB0cnVlOworCisgICAgICAgICAgICBtTmF0aXZlRGlzcGxheUxpc3QgPSBtQ2FudmFzLmdldERpc3BsYXlMaXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIGRlc3Ryb3lDYW52YXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBib29sZWFuIGlzUmVhZHkoKSB7CisgICAgICAgIHJldHVybiAhbVN0YXJ0ZWQgJiYgbVJlY29yZGVkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVDYW52YXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVDYW52YXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQyZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZUNhbnZhcy5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworCisvKioKKyAqIEhhcmR3YXJlIGFjY2VsZXJhdGVkIGNhbnZhcy4gCisgKi8KK2Fic3RyYWN0IGNsYXNzIEhhcmR3YXJlQ2FudmFzIGV4dGVuZHMgQ2FudmFzIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEJpdG1hcChCaXRtYXAgYml0bWFwKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gYmUgY2FsbGVkIGJlZm9yZSByZWxlYXNpbmcgYQorICAgICAqIHJlZmVyZW5jZSB0byBhIGhhcmR3YXJlIGNhbnZhcy4gVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogZnJlZWluZyBuYXRpdmUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFyZHdhcmUuIE5vdAorICAgICAqIGludm9raW5nIHRoaXMgbWV0aG9kIHByb3Blcmx5IGNhbiByZXN1bHQgaW4gbWVtb3J5IGxlYWtzLgorICAgICAqLyAgICAKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZXN0cm95KCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJlZm9yZSBhbnkgZHJhd2luZyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGluIHRoaXMgY2FudmFzLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgb25QcmVEcmF3KCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGFmdGVyIGFsbCBkcmF3aW5nIG9wZXJhdGlvbiBoYXZlIGJlZW4gcGVyZm9ybWVkLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgb25Qb3N0RHJhdygpOworICAgIAorICAgIC8qKgorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgZGlzcGxheSBsaXN0IG9udG8gdGhpcyBjYW52YXMuCisgICAgICogCisgICAgICogQHBhcmFtIGRpc3BsYXlMaXN0IFRoZSBkaXNwbGF5IGxpc3QgdG8gcmVwbGF5LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdEaXNwbGF5TGlzdChEaXNwbGF5TGlzdCBkaXNwbGF5TGlzdCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhcmR3YXJlUmVuZGVyZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTc5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhcmR3YXJlUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDY2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBhbmRyb2lkLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgcmVuZGVyaW5nIGEgVmlld1Jvb3QgdXNpbmcgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICogCisgKiBAaGlkZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSGFyZHdhcmVSZW5kZXJlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiSGFyZHdhcmVSZW5kZXJlciI7CisKKyAgICAvKioKKyAgICAgKiBBIHByb2Nlc3MgY2FuIHNldCB0aGlzIGZsYWcgdG8gZmFsc2UgdG8gcHJldmVudCB0aGUgdXNlIG9mIGhhcmR3YXJlCisgICAgICogcmVuZGVyaW5nLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNSZW5kZXJlckRpc2FibGVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXF1ZXN0ZWQgPSB0cnVlOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBjYW5ub3QgdXNlIGhhcmR3YXJlIHJlbmRlcmluZy4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlKCkgeworICAgICAgICBzUmVuZGVyZXJEaXNhYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciBhbnkgZm9ybSBmb3IKKyAgICAgKiB0aGUgdmlldyBoaWVyYXJjaHkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB2aWV3IGhpZXJhcmNoeSBjYW4gcG90ZW50aWFsbHkgYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBHTEVTMjBDYW52YXMuaXNBdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgaGFyZHdhcmUgcmVuZGVyaW5nIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIGZ1bGwgSWYgdHJ1ZSwgZGVzdHJveXMgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgZGVzdHJveShib29sZWFuIGZ1bGwpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciB0aGUgc3BlY2lmaWVkIHN1cmZhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGhvbGRlciBUaGUgaG9sZGVyIGZvciB0aGUgc3VyZmFjZSB0byBoYXJkd2FyZSBhY2NlbGVyYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBib29sZWFuIGluaXRpYWxpemUoU3VyZmFjZUhvbGRlciBob2xkZXIpOworCisgICAgLyoqCisgICAgICogU2V0dXAgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciBkcmF3aW5nLiBUaGlzIGlzIGNhbGxlZCBmb3IgZXZlcnkKKyAgICAgKiBmcmFtZSB0byBkcmF3LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBzZXR1cChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgLyoqCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCB2aWV3LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRvIGRyYXcuCisgICAgICogQHBhcmFtIGF0dGFjaEluZm8gQXR0YWNoSW5mbyB0aWVkIHRvIHRoZSBzcGVjaWZpZWQgdmlldy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgaW50IHlPZmZzZXQpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBjYW52YXMgdGhhdCBjYW4gYmUgdXNlZCB0byByZWNvcmQgZHJhd2luZyBvcGVyYXRpb25zCisgICAgICogaW4gdGhlIHNwZWNpZmllZCBkaXNwbGF5IGxpc3QuCisgICAgICogCisgICAgICogQHJldHVybiBBIG5ldyByZWNvcmRpbmcgY2FudmFzLgorICAgICAqLworICAgIGFic3RyYWN0IERpc3BsYXlMaXN0IGNyZWF0ZURpc3BsYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgaGFyZHdhcmUgcmVuZGVyZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3VyZmFjZSBhbmQgc2V0dXAgdGhlCisgICAgICogcmVuZGVyZXIgZm9yIGRyYXdpbmcsIGlmIG5lZWRlZC4gVGhpcyBpcyBpbnZva2VkIHdoZW4gdGhlIFZpZXdSb290IGhhcworICAgICAqIHBvdGVudGlhbGx5IGxvc3QgdGhlIGhhcmR3YXJlIHJlbmRlcmVyLiBUaGUgaGFyZHdhcmUgcmVuZGVyZXIgc2hvdWxkIGJlCisgICAgICogcmVpbml0aWFsaXplZCBhbmQgc2V0dXAgd2hlbiB0aGUgcmVuZGVyIHtAbGluayAjaXNSZXF1ZXN0ZWQoKX0gYW5kCisgICAgICoge0BsaW5rICNpc0VuYWJsZWQoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBhdHRhY2hJbmZvIFRoZSAKKyAgICAgKiBAcGFyYW0gaG9sZGVyCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplSWZOZWVkZWQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywKKyAgICAgICAgICAgIFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgIGlmIChpc1JlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAvLyBXZSBsb3N0IHRoZSBnbCBjb250ZXh0LCBzbyByZWNyZWF0ZSBpdC4KKyAgICAgICAgICAgIGlmICghaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZShob2xkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldHVwKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGhhcmR3YXJlIHJlbmRlcmVyIHVzaW5nIE9wZW5HTC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2xWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIE9wZW5HTCB0byB1c2UgKDEgZm9yIE9wZW5HTCAxLCAxMSBmb3IgT3BlbkdMIDEuMSwgZXRjLikKKyAgICAgKiBAcGFyYW0gdHJhbnNsdWNlbnQgVHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyB0cmFuc2x1Y2VudCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogCisgICAgICogQHJldHVybiBBIGhhcmR3YXJlIHJlbmRlcmVyIGJhY2tlZCBieSBPcGVuR0wuCisgICAgICovCisgICAgc3RhdGljIEhhcmR3YXJlUmVuZGVyZXIgY3JlYXRlR2xSZW5kZXJlcihpbnQgZ2xWZXJzaW9uLCBib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgIHN3aXRjaCAoZ2xWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEdsMjBSZW5kZXJlci5jcmVhdGUodHJhbnNsdWNlbnQpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gR0wgdmVyc2lvbjogIiArIGdsVmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgaW4gdXNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSBpZiB0aGUgaGFyZHdhcmUgcmVuZGVyZXIgaXMgaW4gdXNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSByZXF1ZXN0IGJ1dCBub3QKKyAgICAgKiBuZWNlc3NhcmlseSBlbmFibGVkIHlldC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgcmVxdWVzdGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc1JlcXVlc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSByZXF1ZXN0IGJ1dCBub3QKKyAgICAgKiBuZWNlc3NhcmlseSBlbmFibGVkIHlldC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgdG8gcmVxdWVzdCBoYXJkd2FyZSBhY2NlbGVyYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFJlcXVlc3RlZChib29sZWFuIHJlcXVlc3RlZCkgeworICAgICAgICBtUmVxdWVzdGVkID0gcmVxdWVzdGVkOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiZGVwcmVjYXRpb24ifSkKKyAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgR2xSZW5kZXJlciBleHRlbmRzIEhhcmR3YXJlUmVuZGVyZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gPSAweDMwOTg7CisKKyAgICAgICAgc3RhdGljIEVHTENvbnRleHQgc0VnbENvbnRleHQ7CisgICAgICAgIHN0YXRpYyBFR0wxMCBzRWdsOworICAgICAgICBzdGF0aWMgRUdMRGlzcGxheSBzRWdsRGlzcGxheTsKKyAgICAgICAgc3RhdGljIEVHTENvbmZpZyBzRWdsQ29uZmlnOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRocmVhZCBzRWdsVGhyZWFkOyAgICAgICAgCisKKyAgICAgICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKKyAgICAgICAgCisgICAgICAgIEdMIG1HbDsKKyAgICAgICAgR0xFUzIwQ2FudmFzIG1DYW52YXM7CisKKyAgICAgICAgZmluYWwgaW50IG1HbFZlcnNpb247CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbVRyYW5zbHVjZW50OworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGVzdHJveWVkOworCisgICAgICAgIEdsUmVuZGVyZXIoaW50IGdsVmVyc2lvbiwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICAgICAgbUdsVmVyc2lvbiA9IGdsVmVyc2lvbjsKKyAgICAgICAgICAgIG1UcmFuc2x1Y2VudCA9IHRyYW5zbHVjZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiBhIHN0cmluZyBmb3IgdGhlIEVHTCBlcnJvciBjb2RlLCBvciB0aGUgaGV4IHJlcHJlc2VudGF0aW9uCisgICAgICAgICAqIGlmIGFuIHVua25vd24gZXJyb3IuCisgICAgICAgICAqIEBwYXJhbSBlcnJvciBFR0wgZXJyb3IuCisgICAgICAgICAqIEByZXR1cm4gRXJyb3Igc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIFN0cmluZyBnZXRFR0xFcnJvclN0cmluZyhpbnQgZXJyb3IpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVHTDEwLkVHTF9TVUNDRVNTOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkVHTF9TVUNDRVNTIjsKKyAgICAgICAgICAgICAgICBjYXNlIEVHTDEwLkVHTF9OT1RfSU5JVElBTElaRUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRUdMX05PVF9JTklUSUFMSVpFRCI7CisgICAgICAgICAgICAgICAgY2FzZSBFR0wxMC5FR0xfQkFEX0FDQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0FDQ0VTUyI7CisgICAgICAgICAgICAgICAgY2FzZSBFR0wxMC5FR0xfQkFEX0FMTE9DOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfQUxMT0MiOworICAgICAgICAgICAgICAgIGNhc2UgRUdMMTAuRUdMX0JBRF9BVFRSSUJVVEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9BVFRSSUJVVEUiOworICAgICAgICAgICAgICAgIGNhc2UgRUdMMTAuRUdMX0JBRF9DT05GSUc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05GSUciOworICAgICAgICAgICAgICAgIGNhc2UgRUdMMTAuRUdMX0JBRF9DT05URVhUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfQ09OVEVYVCI7CisgICAgICAgICAgICAgICAgY2FzZSBFR0wxMC5FR0xfQkFEX0NVUlJFTlRfU1VSRkFDRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSI7CisgICAgICAgICAgICAgICAgY2FzZSBFR0wxMC5FR0xfQkFEX0RJU1BMQVk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9ESVNQTEFZIjsKKyAgICAgICAgICAgICAgICBjYXNlIEVHTDEwLkVHTF9CQURfTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9NQVRDSCI7CisgICAgICAgICAgICAgICAgY2FzZSBFR0wxMC5FR0xfQkFEX05BVElWRV9QSVhNQVA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9OQVRJVkVfUElYTUFQIjsKKyAgICAgICAgICAgICAgICBjYXNlIEVHTDEwLkVHTF9CQURfTkFUSVZFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX05BVElWRV9XSU5ET1ciOworICAgICAgICAgICAgICAgIGNhc2UgRUdMMTAuRUdMX0JBRF9QQVJBTUVURVI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9QQVJBTUVURVIiOworICAgICAgICAgICAgICAgIGNhc2UgRUdMMTAuRUdMX0JBRF9TVVJGQUNFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfU1VSRkFDRSI7CisgICAgICAgICAgICAgICAgY2FzZSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkVHTF9DT05URVhUX0xPU1QiOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGZvciBPcGVuR0wgZXJyb3JzLiBJZiBhbiBlcnJvciBoYXMgb2NjdXJlZCwge0BsaW5rICNkZXN0cm95KGJvb2xlYW4pfQorICAgICAgICAgKiBpcyBpbnZva2VkIGFuZCB0aGUgcmVxdWVzdGVkIGZsYWcgaXMgdHVybmVkIG9mZi4gVGhlIGVycm9yIGNvZGUgaXMKKyAgICAgICAgICogYWxzbyBsb2dnZWQgYXMgYSB3YXJuaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjaGVja0VnbEVycm9ycygpIHsKKyAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQgcmV2ZXJ0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdsbCB0cnkgYWdhaW4gaWYgaXQgd2FzIGNvbnRleHQgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVxdWVzdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRUdMIGVycm9yOiAiICsgZ2V0RUdMRXJyb3JTdHJpbmcoZXJyb3IpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGluaXRpYWxpemUoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIGlmIChpc1JlcXVlc3RlZCgpICYmICFpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGluaXRpYWxpemVFZ2woKTsKKyAgICAgICAgICAgICAgICBtR2wgPSBjcmVhdGVFZ2xTdXJmYWNlKGhvbGRlcik7CisgICAgICAgICAgICAgICAgbURlc3Ryb3llZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKG1HbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnIgPSBzRWdsLmVnbEdldEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYW52YXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW52YXMgPSBjcmVhdGVDYW52YXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FudmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSGFyZHdhcmUgYWNjZWxlcmF0ZWQgQ2FudmFzIGNvdWxkIG5vdCBiZSBjcmVhdGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUNhbnZhcyAhPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IEdMRVMyMENhbnZhcyBjcmVhdGVDYW52YXMoKTsKKworICAgICAgICB2b2lkIGluaXRpYWxpemVFZ2woKSB7CisgICAgICAgICAgICBpZiAoc0VnbENvbnRleHQgIT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBzRWdsVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgICAgIHNFZ2wgPSAoRUdMMTApIEVHTENvbnRleHQuZ2V0RUdMKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEdldCB0byB0aGUgZGVmYXVsdCBkaXNwbGF5LgorICAgICAgICAgICAgc0VnbERpc3BsYXkgPSBzRWdsLmVnbEdldERpc3BsYXkoRUdMMTAuRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChzRWdsRGlzcGxheSA9PSBFR0wxMC5FR0xfTk9fRElTUExBWSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xHZXREaXNwbGF5IGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldEVHTEVycm9yU3RyaW5nKHNFZ2wuZWdsR2V0RXJyb3IoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXZSBjYW4gbm93IGluaXRpYWxpemUgRUdMIGZvciB0aGF0IGRpc3BsYXkKKyAgICAgICAgICAgIGludFtdIHZlcnNpb24gPSBuZXcgaW50WzJdOworICAgICAgICAgICAgaWYgKCFzRWdsLmVnbEluaXRpYWxpemUoc0VnbERpc3BsYXksIHZlcnNpb24pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbEluaXRpYWxpemUgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RUdMRXJyb3JTdHJpbmcoc0VnbC5lZ2xHZXRFcnJvcigpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzRWdsQ29uZmlnID0gZ2V0Q29uZmlnQ2hvb3NlcihtR2xWZXJzaW9uKS5jaG9vc2VDb25maWcoc0VnbCwgc0VnbERpc3BsYXkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgKiBDcmVhdGUgYW4gRUdMIGNvbnRleHQuIFdlIHdhbnQgdG8gZG8gdGhpcyBhcyByYXJlbHkgYXMgd2UgY2FuLCBiZWNhdXNlIGFuCisgICAgICAgICAgICAqIEVHTCBjb250ZXh0IGlzIGEgc29tZXdoYXQgaGVhdnkgb2JqZWN0LgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNFZ2xDb250ZXh0ID0gY3JlYXRlQ29udGV4dChzRWdsLCBzRWdsRGlzcGxheSwgc0VnbENvbmZpZyk7CisgICAgICAgIH0KKworICAgICAgICBHTCBjcmVhdGVFZ2xTdXJmYWNlKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgICAgICAvLyBDaGVjayBwcmVjb25kaXRpb25zLgorICAgICAgICAgICAgaWYgKHNFZ2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2wgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc0VnbERpc3BsYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xEaXNwbGF5IG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNFZ2xDb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJtRWdsQ29uZmlnIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgIT0gc0VnbFRocmVhZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkhhcmR3YXJlUmVuZGVyZXIgY2Fubm90IGJlIHVzZWQgIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImZyb20gbXVsdGlwbGUgdGhyZWFkcyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIFRoZSB3aW5kb3cgc2l6ZSBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcKKyAgICAgICAgICAgICAqICBzdXJmYWNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobUVnbFN1cmZhY2UgIT0gbnVsbCAmJiBtRWdsU3VyZmFjZSAhPSBFR0wxMC5FR0xfTk9fU1VSRkFDRSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVW5iaW5kIGFuZCBkZXN0cm95IHRoZSBvbGQgRUdMIHN1cmZhY2UsIGlmCisgICAgICAgICAgICAgICAgICogdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHNFZ2wuZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX1NVUkZBQ0UsIEVHTDEwLkVHTF9OT19DT05URVhUKTsKKyAgICAgICAgICAgICAgICBzRWdsLmVnbERlc3Ryb3lTdXJmYWNlKHNFZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBFR0wgc3VyZmFjZSB3ZSBjYW4gcmVuZGVyIGludG8uCisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IHNFZ2wuZWdsQ3JlYXRlV2luZG93U3VyZmFjZShzRWdsRGlzcGxheSwgc0VnbENvbmZpZywgaG9sZGVyLCBudWxsKTsKKworICAgICAgICAgICAgaWYgKG1FZ2xTdXJmYWNlID09IG51bGwgfHwgbUVnbFN1cmZhY2UgPT0gRUdMMTAuRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBzRWdsLmVnbEdldEVycm9yKCk7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yID09IEVHTDEwLkVHTF9CQURfTkFUSVZFX1dJTkRPVykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZSgiRWdsSGVscGVyIiwgImNyZWF0ZVdpbmRvd1N1cmZhY2UgcmV0dXJuZWQgRUdMX0JBRF9OQVRJVkVfV0lORE9XLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RUdMRXJyb3JTdHJpbmcoZXJyb3IpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEJlZm9yZSB3ZSBjYW4gaXNzdWUgR0wgY29tbWFuZHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAgKiB0aGUgY29udGV4dCBpcyBjdXJyZW50IGFuZCBib3VuZCB0byBhIHN1cmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBzRWdsQ29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RUdMRXJyb3JTdHJpbmcoc0VnbC5lZ2xHZXRFcnJvcigpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzRWdsQ29udGV4dC5nZXRHTCgpOworICAgICAgICB9CisKKyAgICAgICAgRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBlZ2xEaXNwbGF5LCBFR0xDb25maWcgZWdsQ29uZmlnKSB7CisgICAgICAgICAgICBpbnRbXSBhdHRyaWJfbGlzdCA9IHsgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIG1HbFZlcnNpb24sIEVHTDEwLkVHTF9OT05FIH07CisKKyAgICAgICAgICAgIHJldHVybiBlZ2wuZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBlZ2xDb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULAorICAgICAgICAgICAgICAgICAgICBtR2xWZXJzaW9uICE9IDAgPyBhdHRyaWJfbGlzdCA6IG51bGwpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKGludCB3aWR0aCwgaW50IGhlaWdodCwgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sCisgICAgICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIGlmIChpc1JlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKKyAgICAgICAgICAgICAgICBzdXBlci5pbml0aWFsaXplSWZOZWVkZWQod2lkdGgsIGhlaWdodCwgYXR0YWNoSW5mbywgaG9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgZGVzdHJveShib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgICAgIGlmIChmdWxsICYmIG1DYW52YXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYW52YXMuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1DYW52YXMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCgpIHx8IG1EZXN0cm95ZWQpIHJldHVybjsKKworICAgICAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisKKyAgICAgICAgICAgIHNFZ2wuZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgc0VnbC5lZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworCisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICBtR2wgPSBudWxsOworCisgICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHNldHVwKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgbUNhbnZhcy5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBjYW5EcmF3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1HbCAhPSBudWxsICYmIG1DYW52YXMgIT0gbnVsbDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIAorICAgICAgICB2b2lkIG9uUHJlRHJhdygpIHsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25Qb3N0RHJhdygpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmluZXMgdGhlIEVHTCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHJlbmRlcmVyLiBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgICAgICAqIGlzIFJHQlgsIG5vIGRlcHRoLCBubyBzdGVuY2lsLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBBbiB7QGxpbmsgYW5kcm9pZC52aWV3LkhhcmR3YXJlUmVuZGVyZXIuR2xSZW5kZXJlci5FZ2xDb25maWdDaG9vc2VyfS4KKyAgICAgICAgICogQHBhcmFtIGdsVmVyc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgRWdsQ29uZmlnQ2hvb3NlciBnZXRDb25maWdDaG9vc2VyKGludCBnbFZlcnNpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2l6ZUNob29zZXIoZ2xWZXJzaW9uLCA4LCA4LCA4LCA4LCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgaW50IHlPZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChjYW5EcmF3KCkpIHsKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1EcmF3aW5nVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lOworICAgICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfUFJPRklMRV9EUkFXSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNoZWNrQ3VycmVudCgpOworCisgICAgICAgICAgICAgICAgb25QcmVEcmF3KCk7CisKKyAgICAgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbUNhbnZhczsKKyAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15T2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9uUG9zdERyYXcoKTsKKworICAgICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfUFJPRklMRV9EUkFXSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNjAwMDAsIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gc3RhcnRUaW1lKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBzRWdsLmVnbFN3YXBCdWZmZXJzKHNFZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0N1cnJlbnQoKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBEb24ndCBjaGVjayB0aGUgY3VycmVudCBjb250ZXh0IHdoZW4gd2UgaGF2ZSBvbmUgcGVyIFVJIHRocmVhZAorICAgICAgICAgICAgLy8gVE9ETzogVXNlIGEgdGhyZWFkbG9jYWwgZmxhZyB0byBrbm93IHdoZXRoZXIgdGhlIHN1cmZhY2UgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIGlmIChzRWdsLmVnbEdldEN1cnJlbnRDb250ZXh0KCkgIT0gc0VnbENvbnRleHQgfHwKKyAgICAgICAgICAgICAgICAgICAgc0VnbC5lZ2xHZXRDdXJyZW50U3VyZmFjZShFR0wxMC5FR0xfRFJBVykgIT0gbUVnbFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNFZ2wuZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwgc0VnbENvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RUdMRXJyb3JTdHJpbmcoc0VnbC5lZ2xHZXRFcnJvcigpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVnbENvbmZpZ0Nob29zZXIgeworICAgICAgICAgICAgZmluYWwgaW50W10gbUNvbmZpZ1NwZWM7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtR2xWZXJzaW9uOworCisgICAgICAgICAgICBFZ2xDb25maWdDaG9vc2VyKGludCBnbFZlcnNpb24sIGludFtdIGNvbmZpZ1NwZWMpIHsKKyAgICAgICAgICAgICAgICBtR2xWZXJzaW9uID0gZ2xWZXJzaW9uOworICAgICAgICAgICAgICAgIG1Db25maWdTcGVjID0gZmlsdGVyQ29uZmlnU3BlYyhjb25maWdTcGVjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSkgeworICAgICAgICAgICAgICAgIGludFtdIGluZGV4ID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIG51bGwsIDAsIGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldEVHTEVycm9yU3RyaW5nKGVnbC5lZ2xHZXRFcnJvcigpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBpbmRleFswXTsKKyAgICAgICAgICAgICAgICBpZiAobnVtQ29uZmlncyA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNvbmZpZ3MgbWF0Y2ggY29uZmlnU3BlYyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUNvbmZpZ3NdOworICAgICAgICAgICAgICAgIGlmICghZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBtQ29uZmlnU3BlYywgY29uZmlncywgbnVtQ29uZmlncywgaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVnbENob29zZUNvbmZpZyBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RUdMRXJyb3JTdHJpbmcoZWdsLmVnbEdldEVycm9yKCkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnID0gY2hvb3NlQ29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlncyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNvbmZpZyBjaG9zZW4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhYnN0cmFjdCBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWdbXSBjb25maWdzKTsKKworICAgICAgICAgICAgcHJpdmF0ZSBpbnRbXSBmaWx0ZXJDb25maWdTcGVjKGludFtdIGNvbmZpZ1NwZWMpIHsKKyAgICAgICAgICAgICAgICBpZiAobUdsVmVyc2lvbiAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdTcGVjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBXZSBrbm93IG5vbmUgb2YgdGhlIHN1YmNsYXNzZXMgZGVmaW5lIEVHTF9SRU5ERVJBQkxFX1RZUEUuCisgICAgICAgICAgICAgICAgICogQW5kIHdlIGtub3cgdGhlIGNvbmZpZ1NwZWMgaXMgd2VsbCBmb3JtZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IGxlbiA9IGNvbmZpZ1NwZWMubGVuZ3RoOworICAgICAgICAgICAgICAgIGludFtdIG5ld0NvbmZpZ1NwZWMgPSBuZXcgaW50W2xlbiArIDJdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29uZmlnU3BlYywgMCwgbmV3Q29uZmlnU3BlYywgMCwgbGVuIC0gMSk7CisgICAgICAgICAgICAgICAgbmV3Q29uZmlnU3BlY1tsZW4gLSAxXSA9IEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEU7CisgICAgICAgICAgICAgICAgbmV3Q29uZmlnU3BlY1tsZW5dID0gNDsgLyogRUdMX09QRU5HTF9FUzJfQklUICovCisgICAgICAgICAgICAgICAgbmV3Q29uZmlnU3BlY1tsZW4gKyAxXSA9IEVHTDEwLkVHTF9OT05FOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdDb25maWdTcGVjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENob29zZSBhIGNvbmZpZ3VyYXRpb24gd2l0aCBleGFjdGx5IHRoZSBzcGVjaWZpZWQgcixnLGIsYSBzaXplcywKKyAgICAgICAgICogYW5kIGF0IGxlYXN0IHRoZSBzcGVjaWZpZWQgZGVwdGggYW5kIHN0ZW5jaWwgc2l6ZXMuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgY2xhc3MgQ29tcG9uZW50U2l6ZUNob29zZXIgZXh0ZW5kcyBFZ2xDb25maWdDaG9vc2VyIHsKKyAgICAgICAgICAgIHByaXZhdGUgaW50W10gbVZhbHVlOworCisgICAgICAgICAgICBwcml2YXRlIGludCBtUmVkU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1HcmVlblNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtQmx1ZVNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtQWxwaGFTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbURlcHRoU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1TdGVuY2lsU2l6ZTsKKworICAgICAgICAgICAgQ29tcG9uZW50U2l6ZUNob29zZXIoaW50IGdsVmVyc2lvbiwgaW50IHJlZFNpemUsIGludCBncmVlblNpemUsIGludCBibHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhU2l6ZSwgaW50IGRlcHRoU2l6ZSwgaW50IHN0ZW5jaWxTaXplKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoZ2xWZXJzaW9uLCBuZXcgaW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCByZWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIGdyZWVuU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIGJsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIGFscGhhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCBkZXB0aFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCBzdGVuY2lsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FIH0pOworICAgICAgICAgICAgICAgIG1WYWx1ZSA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgbVJlZFNpemUgPSByZWRTaXplOworICAgICAgICAgICAgICAgIG1HcmVlblNpemUgPSBncmVlblNpemU7CisgICAgICAgICAgICAgICAgbUJsdWVTaXplID0gYmx1ZVNpemU7CisgICAgICAgICAgICAgICAgbUFscGhhU2l6ZSA9IGFscGhhU2l6ZTsKKyAgICAgICAgICAgICAgICBtRGVwdGhTaXplID0gZGVwdGhTaXplOworICAgICAgICAgICAgICAgIG1TdGVuY2lsU2l6ZSA9IHN0ZW5jaWxTaXplOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnW10gY29uZmlncykgeworICAgICAgICAgICAgICAgIGZvciAoRUdMQ29uZmlnIGNvbmZpZyA6IGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGQgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfREVQVEhfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBzID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkID49IG1EZXB0aFNpemUgJiYgcyA+PSBtU3RlbmNpbFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX1JFRF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBnID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfQkxVRV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPj0gbVJlZFNpemUgJiYgZyA+PSBtR3JlZW5TaXplICYmIGIgPj0gbUJsdWVTaXplICYmIGEgPj0gbUFscGhhU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGZpbmRDb25maWdBdHRyaWIoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgIGludCBhdHRyaWJ1dGUsIGludCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgbVZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlWzBdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYXJkd2FyZSByZW5kZXJlciB1c2luZyBPcGVuR0wgRVMgMi4wLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBHbDIwUmVuZGVyZXIgZXh0ZW5kcyBHbFJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBHTEVTMjBDYW52YXMgbUdsQ2FudmFzOworCisgICAgICAgIEdsMjBSZW5kZXJlcihib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBzdXBlcigyLCB0cmFuc2x1Y2VudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgR0xFUzIwQ2FudmFzIGNyZWF0ZUNhbnZhcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2xDYW52YXMgPSBuZXcgR0xFUzIwQ2FudmFzKG1UcmFuc2x1Y2VudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgICAgICBtR2xDYW52YXMub25QcmVEcmF3KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvblBvc3REcmF3KCkgeworICAgICAgICAgICAgbUdsQ2FudmFzLm9uUG9zdERyYXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBEaXNwbGF5TGlzdCBjcmVhdGVEaXNwbGF5TGlzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR0xFUzIwRGlzcGxheUxpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBIYXJkd2FyZVJlbmRlcmVyIGNyZWF0ZShib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBpZiAoR0xFUzIwQ2FudmFzLmlzQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdsMjBSZW5kZXJlcih0cmFuc2x1Y2VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvdy5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwKaW5kZXggOTIxMDE4YS4uODVhOGMxYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiAKQEAgLTY0LDQgKzY1LDkgQEAKICAgICAKICAgICB2b2lkIGRpc3BhdGNoV2FsbHBhcGVyQ29tbWFuZChTdHJpbmcgYWN0aW9uLCBpbnQgeCwgaW50IHksCiAgICAgICAgICAgICBpbnQgeiwgaW4gQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBzeW5jKTsKKworICAgIC8qKgorICAgICAqIERyYWcvZHJvcCBldmVudHMKKyAgICAgKi8KKyAgICAgdm9pZCBkaXNwYXRjaERyYWdFdmVudChpbiBEcmFnRXZlbnQgZXZlbnQpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbi5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbi5haWRsCmluZGV4IDdmMTBiNzYuLjc5ZWE1YjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvd1Nlc3Npb24uYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lXaW5kb3dTZXNzaW9uLmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKQEAgLTExNiw2ICsxMTcsMzAgQEAKICAgICBib29sZWFuIHBlcmZvcm1IYXB0aWNGZWVkYmFjayhJV2luZG93IHdpbmRvdywgaW50IGVmZmVjdElkLCBib29sZWFuIGFsd2F5cyk7CiAgICAgCiAgICAgLyoqCisgICAgICogQWxsb2NhdGUgdGhlIGRyYWcncyB0aHVtYm5haWwgc3VyZmFjZS4gIEFsc28gYXNzaWducyBhIHRva2VuIHRoYXQgaWRlbnRpZmllcworICAgICAqIHRoZSBkcmFnIHRvIHRoZSBPUyBhbmQgcGFzc2VzIHRoYXQgYXMgdGhlIHJldHVybiB2YWx1ZS4gIEEgcmV0dXJuIHZhbHVlIG9mCisgICAgICogbnVsbCBpbmRpY2F0ZXMgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBJQmluZGVyIHByZXBhcmVEcmFnKElXaW5kb3cgd2luZG93LCBib29sZWFuIGxvY2FsT25seSwKKyAgICAgICAgICAgIGludCB0aHVtYm5haWxXaWR0aCwgaW50IHRodW1ibmFpbEhlaWdodCwgb3V0IFN1cmZhY2Ugb3V0U3VyZmFjZSk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSB0aGUgZHJhZyBvcGVyYXRpb24gaXRzZWxmCisgICAgICovCisgICAgYm9vbGVhbiBwZXJmb3JtRHJhZyhJV2luZG93IHdpbmRvdywgSUJpbmRlciBkcmFnVG9rZW4sIGZsb2F0IHRvdWNoWCwgZmxvYXQgdG91Y2hZLAorICAgICAgICAgICAgZmxvYXQgdGh1bWJDZW50ZXJYLCBmbG9hdCB0aHVtYkNlbnRlclksIGluIENsaXBEYXRhIGRhdGEpOworCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgT1MgdGhhdCB3ZSd2ZSBqdXN0IGRyYWdnZWQgaW50byBhIFZpZXcgdGhhdCBpcyB3aWxsaW5nIHRvIGFjY2VwdCB0aGUgZHJvcAorICAgICAqLworICAgIHZvaWQgZHJhZ1JlY2lwaWVudEVudGVyZWQoSVdpbmRvdyB3aW5kb3cpOworCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgT1MgdGhhdCB3ZSd2ZSBqdXN0IGRyYWdnZWQgKm9mZiogb2YgYSBWaWV3IHRoYXQgd2FzIHdpbGxpbmcgdG8gYWNjZXB0IHRoZSBkcm9wCisgICAgICovCisgICAgdm9pZCBkcmFnUmVjaXBpZW50RXhpdGVkKElXaW5kb3cgd2luZG93KTsKKworICAgIC8qKgogICAgICAqIEZvciB3aW5kb3dzIHdpdGggdGhlIHdhbGxwYXBlciBiZWhpbmQgdGhlbSwgYW5kIHRoZSB3YWxscGFwZXIgaXMKICAgICAgKiBsYXJnZXIgdGhhbiB0aGUgc2NyZWVuLCBzZXQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHNjcmVlbi4KICAgICAgKiBGb3IgbXVsdGkgc2NyZWVuIGxhdW5jaGVyIHR5cGUgYXBwbGljYXRpb25zLCB4c3RlcCBhbmQgeXN0ZXAgaW5kaWNhdGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQppbmRleCAxOTRjMDEzLi5kMjRhZjUyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCkBAIC0xNiwxNSArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtNjcsMTUgKzY3LDE2IEBACiAgICAgLy8gdGhlc2UgYXJlIG9wdGlvbmFsLCBzZXQgYnkgdGhlIGNhbGxlcgogICAgIHByaXZhdGUgYm9vbGVhbiBtRmFjdG9yeVNldDsKICAgICBwcml2YXRlIEZhY3RvcnkgbUZhY3Rvcnk7CisgICAgcHJpdmF0ZSBGYWN0b3J5MiBtRmFjdG9yeTI7CiAgICAgcHJpdmF0ZSBGaWx0ZXIgbUZpbHRlcjsKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gbUNvbnN0cnVjdG9yQXJncyA9IG5ldyBPYmplY3RbMl07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIEF0dHJpYnV0ZVNldC5jbGFzc307CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I+IHNDb25zdHJ1Y3Rvck1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgVmlldz4+IHNDb25zdHJ1Y3Rvck1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3Pj4oKTsKICAgICAKICAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBtRmlsdGVyTWFwOwogCkBAIC05Nyw2ICs5OCw3IEBACiAgICAgICAgICAqIAogICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBjbGFzcyBpcyBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLCBvciBmYWxzZSBvdGhlcndpc2UKICAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICBib29sZWFuIG9uTG9hZENsYXNzKENsYXNzIGNsYXp6KTsKICAgICB9CiAgICAgCkBAIC0xMjEsMTIgKzEyMywzMyBAQAogICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWN0b3J5TWVyZ2VyIGltcGxlbWVudHMgRmFjdG9yeSB7CisgICAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5MiBleHRlbmRzIEZhY3RvcnkgeworICAgICAgICAvKioKKyAgICAgICAgICogVmVyc2lvbiBvZiB7QGxpbmsgI29uQ3JlYXRlVmlldyhTdHJpbmcsIENvbnRleHQsIEF0dHJpYnV0ZVNldCl9CisgICAgICAgICAqIHRoYXQgYWxzbyBzdXBwbGllcyB0aGUgcGFyZW50IHRoYXQgdGhlIHZpZXcgY3JlYXRlZCB2aWV3IHdpbGwgYmUKKyAgICAgICAgICogcGxhY2VkIGluLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgdGhhdCB0aGUgY3JlYXRlZCB2aWV3IHdpbGwgYmUgcGxhY2VkCisgICAgICAgICAqIGluOyA8ZW0+bm90ZSB0aGF0IHRoaXMgbWF5IGJlIG51bGw8L2VtPi4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGFnIG5hbWUgdG8gYmUgaW5mbGF0ZWQuCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRoZSB2aWV3IGlzIGJlaW5nIGNyZWF0ZWQgaW4uCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBJbmZsYXRpb24gYXR0cmlidXRlcyBhcyBzcGVjaWZpZWQgaW4gWE1MIGZpbGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVmlldyBOZXdseSBjcmVhdGVkIHZpZXcuIFJldHVybiBudWxsIGZvciB0aGUgZGVmYXVsdAorICAgICAgICAgKiAgICAgICAgIGJlaGF2aW9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFZpZXcgcGFyZW50LCBTdHJpbmcgbmFtZSwgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZhY3RvcnlNZXJnZXIgaW1wbGVtZW50cyBGYWN0b3J5MiB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgRmFjdG9yeSBtRjEsIG1GMjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGYWN0b3J5MiBtRjEyLCBtRjIyOwogICAgICAgICAKLSAgICAgICAgRmFjdG9yeU1lcmdlcihGYWN0b3J5IGYxLCBGYWN0b3J5IGYyKSB7CisgICAgICAgIEZhY3RvcnlNZXJnZXIoRmFjdG9yeSBmMSwgRmFjdG9yeTIgZjEyLCBGYWN0b3J5IGYyLCBGYWN0b3J5MiBmMjIpIHsKICAgICAgICAgICAgIG1GMSA9IGYxOwogICAgICAgICAgICAgbUYyID0gZjI7CisgICAgICAgICAgICBtRjEyID0gZjEyOworICAgICAgICAgICAgbUYyMiA9IGYyMjsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewpAQCAtMTM0LDYgKzE1NywxNCBAQAogICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIHY7CiAgICAgICAgICAgICByZXR1cm4gbUYyLm9uQ3JlYXRlVmlldyhuYW1lLCBjb250ZXh0LCBhdHRycyk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgVmlldyB2ID0gbUYxMiAhPSBudWxsID8gbUYxMi5vbkNyZWF0ZVZpZXcocGFyZW50LCBuYW1lLCBjb250ZXh0LCBhdHRycykKKyAgICAgICAgICAgICAgICAgICAgOiBtRjEub25DcmVhdGVWaWV3KG5hbWUsIGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHJldHVybiB2OworICAgICAgICAgICAgcmV0dXJuIG1GMjIgIT0gbnVsbCA/IG1GMjIub25DcmVhdGVWaWV3KHBhcmVudCwgbmFtZSwgY29udGV4dCwgYXR0cnMpCisgICAgICAgICAgICAgICAgICAgIDogbUYyLm9uQ3JlYXRlVmlldyhuYW1lLCBjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNjEsNiArMTkyLDcgQEAKICAgICBwcm90ZWN0ZWQgTGF5b3V0SW5mbGF0ZXIoTGF5b3V0SW5mbGF0ZXIgb3JpZ2luYWwsIENvbnRleHQgbmV3Q29udGV4dCkgewogICAgICAgICBtQ29udGV4dCA9IG5ld0NvbnRleHQ7CiAgICAgICAgIG1GYWN0b3J5ID0gb3JpZ2luYWwubUZhY3Rvcnk7CisgICAgICAgIG1GYWN0b3J5MiA9IG9yaWdpbmFsLm1GYWN0b3J5MjsKICAgICAgICAgbUZpbHRlciA9IG9yaWdpbmFsLm1GaWx0ZXI7CiAgICAgfQogICAgIApAQCAtMTk5LDcgKzIzMSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjdXJyZW50IGZhY3RvcnkgKG9yIG51bGwpLiBUaGlzIGlzIGNhbGxlZCBvbiBlYWNoIGVsZW1lbnQKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQge0BsaW5rIEZhY3Rvcnl9IChvciBudWxsKS4gVGhpcyBpcyBjYWxsZWQgb24gZWFjaCBlbGVtZW50CiAgICAgICogbmFtZS4gSWYgdGhlIGZhY3RvcnkgcmV0dXJucyBhIFZpZXcsIGFkZCB0aGF0IHRvIHRoZSBoaWVyYXJjaHkuIElmIGl0CiAgICAgICogcmV0dXJucyBudWxsLCBwcm9jZWVkIHRvIGNhbGwgb25DcmVhdGVWaWV3KG5hbWUpLgogICAgICAqLwpAQCAtMjA4LDYgKzI0MCwxNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB7QGxpbmsgRmFjdG9yeTJ9LiAgUmV0dXJucyBudWxsIGlmIG5vIGZhY3RvcnkgaXMgc2V0CisgICAgICogb3IgdGhlIHNldCBmYWN0b3J5IGRvZXMgbm90IGltcGxlbWVudCB0aGUge0BsaW5rIEZhY3RvcnkyfSBpbnRlcmZhY2UuCisgICAgICogVGhpcyBpcyBjYWxsZWQgb24gZWFjaCBlbGVtZW50CisgICAgICogbmFtZS4gSWYgdGhlIGZhY3RvcnkgcmV0dXJucyBhIFZpZXcsIGFkZCB0aGF0IHRvIHRoZSBoaWVyYXJjaHkuIElmIGl0CisgICAgICogcmV0dXJucyBudWxsLCBwcm9jZWVkIHRvIGNhbGwgb25DcmVhdGVWaWV3KG5hbWUpLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBGYWN0b3J5MiBnZXRGYWN0b3J5MigpIHsKKyAgICAgICAgcmV0dXJuIG1GYWN0b3J5MjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBdHRhY2ggYSBjdXN0b20gRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIHZpZXdzIHdoaWxlIHVzaW5nCiAgICAgICogdGhpcyBMYXlvdXRJbmZsYXRlci4gIFRoaXMgbXVzdCBub3QgYmUgbnVsbCwgYW5kIGNhbiBvbmx5IGJlIHNldCBvbmNlOwogICAgICAqIGFmdGVyIHNldHRpbmcsIHlvdSBjYW4gbm90IGNoYW5nZSB0aGUgZmFjdG9yeS4gIFRoaXMgaXMKQEAgLTIzMyw3ICsyNzYsMjYgQEAKICAgICAgICAgaWYgKG1GYWN0b3J5ID09IG51bGwpIHsKICAgICAgICAgICAgIG1GYWN0b3J5ID0gZmFjdG9yeTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GYWN0b3J5ID0gbmV3IEZhY3RvcnlNZXJnZXIoZmFjdG9yeSwgbUZhY3RvcnkpOworICAgICAgICAgICAgbUZhY3RvcnkgPSBuZXcgRmFjdG9yeU1lcmdlcihmYWN0b3J5LCBudWxsLCBtRmFjdG9yeSwgbUZhY3RvcnkyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNzZXRGYWN0b3J5fSwgYnV0IGFsbG93cyB5b3UgdG8gc2V0IGEge0BsaW5rIEZhY3RvcnkyfQorICAgICAqIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5MihGYWN0b3J5MiBmYWN0b3J5KSB7CisgICAgICAgIGlmIChtRmFjdG9yeVNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQSBmYWN0b3J5IGhhcyBhbHJlYWR5IGJlZW4gc2V0IG9uIHRoaXMgTGF5b3V0SW5mbGF0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkdpdmVuIGZhY3RvcnkgY2FuIG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUZhY3RvcnlTZXQgPSB0cnVlOworICAgICAgICBpZiAobUZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgbUZhY3RvcnkgPSBtRmFjdG9yeTIgPSBmYWN0b3J5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZhY3RvcnkgPSBuZXcgRmFjdG9yeU1lcmdlcihmYWN0b3J5LCBmYWN0b3J5LCBtRmFjdG9yeSwgbUZhY3RvcnkyKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzgwLDEwICs0NDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVmlld0dyb3VwIHJvb3QgYW5kIGF0dGFjaFRvUm9vdD10cnVlIik7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCByb290LCBhdHRycywgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRlbXAgaXMgdGhlIHJvb3QgdmlldyB0aGF0IHdhcyBmb3VuZCBpbiB0aGUgeG1sCi0gICAgICAgICAgICAgICAgICAgIFZpZXcgdGVtcCA9IGNyZWF0ZVZpZXdGcm9tVGFnKG5hbWUsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgVmlldyB0ZW1wID0gY3JlYXRlVmlld0Zyb21UYWcocm9vdCwgbmFtZSwgYXR0cnMpOwogCiAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbnVsbDsKIApAQCAtNDA1LDcgKzQ2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBzdGFydCBpbmZsYXRpbmcgY2hpbGRyZW4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbiB1bmRlciB0ZW1wCi0gICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdGVtcCwgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHRlbXAsIGF0dHJzLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBkb25lIGluZmxhdGluZyBjaGlsZHJlbiIpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00NTgsMTggKzUyMCwxOCBAQAogICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGluc3RhbnRpYXRlZC4KICAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIFhNTCBhdHRyaWJ1dGVzIHN1cHBsaWVkIGZvciB0aGlzIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGllZCB2aWV3LCBvciBudWxsLgorICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGlhdGVkIHZpZXcsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFZpZXcgY3JlYXRlVmlldyhTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKQogICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluZmxhdGVFeGNlcHRpb24gewotICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHNDb25zdHJ1Y3Rvck1hcC5nZXQobmFtZSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgQ29uc3RydWN0b3I8PyBleHRlbmRzIFZpZXc+IGNvbnN0cnVjdG9yID0gc0NvbnN0cnVjdG9yTWFwLmdldChuYW1lKTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IGNsYXp6ID0gbnVsbDsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBDbGFzcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBzZWUgaWYgaXQncyByZWFsLCBhbmQgdHJ5IHRvIGFkZCBpdAogICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKS5hc1N1YmNsYXNzKFZpZXcuY2xhc3MpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwgJiYgY2xhenogIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKQEAgLTQ4Nyw3ICs1NDksNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFN0YXRlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBjbGFzcyAtLSByZW1lbWJlciB3aGV0aGVyIGl0IGlzIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkuYXNTdWJjbGFzcyhWaWV3LmNsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gY2xhenogIT0gbnVsbCAmJiBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWx0ZXJNYXAucHV0KG5hbWUsIGFsbG93ZWQpOwpAQCAtNTAyLDcgKzU2NCw3IEBACiAKICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBtQ29uc3RydWN0b3JBcmdzOwogICAgICAgICAgICAgYXJnc1sxXSA9IGF0dHJzOwotICAgICAgICAgICAgcmV0dXJuIChWaWV3KSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKIAogICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQpAQCAtNTExLDYgKzU3MywxMyBAQAogICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOwogICAgICAgICAgICAgdGhyb3cgaWU7CiAKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElmIGxvYWRlZCBjbGFzcyBpcyBub3QgYSBWaWV3IHN1YmNsYXNzCisgICAgICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGllID0gbmV3IEluZmxhdGVFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIjogQ2xhc3MgaXMgbm90IGEgVmlldyAiCisgICAgICAgICAgICAgICAgICAgICsgKHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkpOworICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgaWU7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gSWYgbG9hZENsYXNzIGZhaWxzLCB3ZSBzaG91bGQgcHJvcGFnYXRlIHRoZSBleGNlcHRpb24uCiAgICAgICAgICAgICB0aHJvdyBlOwpAQCAtNTI0LDcgKzU5Myw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhyb3cgYW4gZXhjcGV0aW9uIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBpbmZsYXRlZC4KKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBmYWlsTm90QWxsb3dlZChTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKQEAgLTU0OSwxMCArNjE4LDI3IEBACiAgICAgICAgIHJldHVybiBjcmVhdGVWaWV3KG5hbWUsICJhbmRyb2lkLnZpZXcuIiwgYXR0cnMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFZlcnNpb24gb2Yge0BsaW5rICNvbkNyZWF0ZVZpZXcoU3RyaW5nLCBBdHRyaWJ1dGVTZXQpfSB0aGF0IGFsc28KKyAgICAgKiB0YWtlcyB0aGUgZnV0dXJlIHBhcmVudCBvZiB0aGUgdmlldyBiZWluZyBjb25zdHJ1Y3R1cmUuICBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscyB7QGxpbmsgI29uQ3JlYXRlVmlldyhTdHJpbmcsIEF0dHJpYnV0ZVNldCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgZnV0dXJlIHBhcmVudCBvZiB0aGUgcmV0dXJuZWQgdmlldy4gIDxlbT5Ob3RlIHRoYXQKKyAgICAgKiB0aGlzIG1heSBiZSBudWxsLjwvZW0+CisgICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBWaWV3IHRvIGJlIGNyZWF0ZS4KKyAgICAgKiBAcGFyYW0gYXR0cnMgQW4gQXR0cmlidXRlU2V0IG9mIGF0dHJpYnV0ZXMgdG8gYXBwbHkgdG8gdGhlIFZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFZpZXcgVGhlIFZpZXcgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmlldyBvbkNyZWF0ZVZpZXcoVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVTZXQgYXR0cnMpCisgICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBvbkNyZWF0ZVZpZXcobmFtZSwgYXR0cnMpOworICAgIH0KKwogICAgIC8qCiAgICAgICogZGVmYXVsdCB2aXNpYmlsaXR5IHNvIHRoZSBCcmlkZ2VJbmZsYXRlciBjYW4gb3ZlcnJpZGUgaXQuCiAgICAgICovCi0gICAgVmlldyBjcmVhdGVWaWV3RnJvbVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgVmlldyBjcmVhdGVWaWV3RnJvbVRhZyhWaWV3IHBhcmVudCwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBpZiAobmFtZS5lcXVhbHMoInZpZXciKSkgewogICAgICAgICAgICAgbmFtZSA9IGF0dHJzLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJjbGFzcyIpOwogICAgICAgICB9CkBAIC01NjAsMTIgKzY0NiwxNCBAQAogICAgICAgICBpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKiogQ3JlYXRpbmcgdmlldzogIiArIG5hbWUpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSAobUZhY3RvcnkgPT0gbnVsbCkgPyBudWxsIDogbUZhY3Rvcnkub25DcmVhdGVWaWV3KG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhdHRycyk7CisgICAgICAgICAgICBWaWV3IHZpZXc7CisgICAgICAgICAgICBpZiAobUZhY3RvcnkyICE9IG51bGwpIHZpZXcgPSBtRmFjdG9yeTIub25DcmVhdGVWaWV3KHBhcmVudCwgbmFtZSwgbUNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG1GYWN0b3J5ICE9IG51bGwpIHZpZXcgPSBtRmFjdG9yeS5vbkNyZWF0ZVZpZXcobmFtZSwgbUNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgIGVsc2UgdmlldyA9IG51bGw7CiAKICAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAoLTEgPT0gbmFtZS5pbmRleE9mKCcuJykpIHsKLSAgICAgICAgICAgICAgICAgICAgdmlldyA9IG9uQ3JlYXRlVmlldyhuYW1lLCBhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIHZpZXcgPSBvbkNyZWF0ZVZpZXcocGFyZW50LCBuYW1lLCBhdHRycyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdmlldyA9IGNyZWF0ZVZpZXcobmFtZSwgbnVsbCwgYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU5NSw4ICs2ODMsOCBAQAogICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdXNlZCB0byBkZXNjZW5kIGRvd24gdGhlIHhtbCBoaWVyYXJjaHkgYW5kIGluc3RhbnRpYXRlCiAgICAgICogdmlld3MsIGluc3RhbnRpYXRlIHRoZWlyIGNoaWxkcmVuLCBhbmQgdGhlbiBjYWxsIG9uRmluaXNoSW5mbGF0ZSgpLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBySW5mbGF0ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycykKLSAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHJJbmZsYXRlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBWaWV3IHBhcmVudCwgZmluYWwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgYm9vbGVhbiBmaW5pc2hJbmZsYXRlKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCiAgICAgICAgIGZpbmFsIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwogICAgICAgICBpbnQgdHlwZTsKQEAgLTYyMCwxNSArNzA4LDE1IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19NRVJHRS5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5mbGF0ZUV4Y2VwdGlvbigiPG1lcmdlIC8+IG11c3QgYmUgdGhlIHJvb3QgZWxlbWVudCIpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjcmVhdGVWaWV3RnJvbVRhZyhuYW1lLCBhdHRycyk7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY3JlYXRlVmlld0Zyb21UYWcocGFyZW50LCBuYW1lLCBhdHRycyk7CiAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwIHZpZXdHcm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IHZpZXdHcm91cC5nZW5lcmF0ZUxheW91dFBhcmFtcyhhdHRycyk7Ci0gICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB2aWV3LCBhdHRycyk7CisgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB2aWV3LCBhdHRycywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgdmlld0dyb3VwLmFkZFZpZXcodmlldywgcGFyYW1zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHBhcmVudC5vbkZpbmlzaEluZmxhdGUoKTsKKyAgICAgICAgaWYgKGZpbmlzaEluZmxhdGUpIHBhcmVudC5vbkZpbmlzaEluZmxhdGUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcGFyc2VSZXF1ZXN0Rm9jdXMoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFZpZXcgcGFyZW50KQpAQCAtNjc5LDkgKzc2Nyw5IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19NRVJHRS5lcXVhbHMoY2hpbGROYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mbGF0ZSBhbGwgY2hpbGRyZW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShjaGlsZFBhcnNlciwgcGFyZW50LCBjaGlsZEF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCBwYXJlbnQsIGNoaWxkQXR0cnMsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGNyZWF0ZVZpZXdGcm9tVGFnKGNoaWxkTmFtZSwgY2hpbGRBdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjcmVhdGVWaWV3RnJvbVRhZyhwYXJlbnQsIGNoaWxkTmFtZSwgY2hpbGRBdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgZ3JvdXAgPSAoVmlld0dyb3VwKSBwYXJlbnQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHRyeSB0byBsb2FkIHRoZSBsYXlvdXQgcGFyYW1zIHNldCBpbiB0aGUgPGluY2x1ZGUgLz4gdGFnLiBJZgpAQCAtNzA0LDcgKzc5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuLgotICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMsIHRydWUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIG92ZXJyaWRlIHRoZSBpbmNsdWRlZCBsYXlvdXQncyBhbmRyb2lkOmlkIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgc2V0IG9uIHRoZSA8aW5jbHVkZSAvPiB0YWcgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEKaW5kZXggNDZjODA1Yy4uN2Q1ZGNkOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIApAQCAtMzAsNiArMjgsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKwogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgbWVudSBYTUwgZmlsZXMgaW50byBNZW51IG9iamVjdHMuCiAgKiA8cD4KQEAgLTUxLDYgKzUzLDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19JRCA9IDA7CiAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBQ1RJT05fVklFV19DT05TVFJVQ1RPUl9TSUdOQVRVUkUgPSBuZXcgQ2xhc3NbXXtDb250ZXh0LmNsYXNzfTsKKwogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICAKICAgICAvKioKQEAgLTE2Niw2ICsxNzAsNDEgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyCisgICAgICAgICAgICBpbXBsZW1lbnRzIE1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBQQVJBTV9UWVBFUyA9IG5ldyBDbGFzc1tdIHsgTWVudUl0ZW0uY2xhc3MgfTsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbU1ldGhvZDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIENsYXNzIGMgPSBjb250ZXh0LmdldENsYXNzKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1NZXRob2QgPSBjLmdldE1ldGhvZChtZXRob2ROYW1lLCBQQVJBTV9UWVBFUyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gZXggPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZXNvbHZlIG1lbnUgaXRlbSBvbkNsaWNrIGhhbmRsZXIgIiArIG1ldGhvZE5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBjbGFzcyAiICsgYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG1NZXRob2QuZ2V0UmV0dXJuVHlwZSgpID09IEJvb2xlYW4uVFlQRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIG1NZXRob2QuaW52b2tlKG1Db250ZXh0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTWV0aG9kLmludm9rZShtQ29udGV4dCwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU3RhdGUgZm9yIHRoZSBjdXJyZW50IG1lbnUuCiAgICAgICogPHA+CkBAIC0yMDUsNiArMjQ0LDIwIEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpdGVtVmlzaWJsZTsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl0ZW1FbmFibGVkOwogICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN5bmMgdG8gYXR0cnMueG1sIGVudW0sIHZhbHVlcyBpbiBNZW51SXRlbToKKyAgICAgICAgICogLSAwOiBuZXZlcgorICAgICAgICAgKiAtIDE6IGlmUm9vbQorICAgICAgICAgKiAtIDI6IGFsd2F5cworICAgICAgICAgKiAtIC0xOiBTYWZlIHNlbnRpbmVsIGZvciAibm8gdmFsdWUiLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgaXRlbVNob3dBc0FjdGlvbjsKKworICAgICAgICBwcml2YXRlIGludCBpdGVtQWN0aW9uVmlld0xheW91dDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaXRlbUFjdGlvblZpZXdDbGFzc05hbWU7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIFN0cmluZyBpdGVtTGlzdGVuZXJNZXRob2ROYW1lOworICAgICAgICAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRHcm91cElkID0gTk9fSUQ7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUlkID0gTk9fSUQ7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUNhdGVnb3J5ID0gMDsKQEAgLTI3Niw2ICszMjksMTAgQEAKICAgICAgICAgICAgIGl0ZW1DaGVja2VkID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2NoZWNrZWQsIGRlZmF1bHRJdGVtQ2hlY2tlZCk7CiAgICAgICAgICAgICBpdGVtVmlzaWJsZSA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV92aXNpYmxlLCBncm91cFZpc2libGUpOwogICAgICAgICAgICAgaXRlbUVuYWJsZWQgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fZW5hYmxlZCwgZ3JvdXBFbmFibGVkKTsKKyAgICAgICAgICAgIGl0ZW1TaG93QXNBY3Rpb24gPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9zaG93QXNBY3Rpb24sIC0xKTsKKyAgICAgICAgICAgIGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9vbkNsaWNrKTsKKyAgICAgICAgICAgIGl0ZW1BY3Rpb25WaWV3TGF5b3V0ID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2FjdGlvbkxheW91dCwgMCk7CisgICAgICAgICAgICBpdGVtQWN0aW9uVmlld0NsYXNzTmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2FjdGlvblZpZXdDbGFzcyk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGEucmVjeWNsZSgpOwogICAgICAgICAgICAgCkBAIC0yOTksOSArMzU2LDM4IEBACiAgICAgICAgICAgICAgICAgLnNldEljb24oaXRlbUljb25SZXNJZCkKICAgICAgICAgICAgICAgICAuc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KGl0ZW1BbHBoYWJldGljU2hvcnRjdXQpCiAgICAgICAgICAgICAgICAgLnNldE51bWVyaWNTaG9ydGN1dChpdGVtTnVtZXJpY1Nob3J0Y3V0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGl0ZW1TaG93QXNBY3Rpb24gPj0gMCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0U2hvd0FzQWN0aW9uKGl0ZW1TaG93QXNBY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXRlbUxpc3RlbmVyTWV0aG9kTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0LmlzUmVzdHJpY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBhbmRyb2lkOm9uQ2xpY2sgYXR0cmlidXRlIGNhbm5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmUgdXNlZCB3aXRoaW4gYSByZXN0cmljdGVkIGNvbnRleHQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXRlbS5zZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKG1Db250ZXh0LCBpdGVtTGlzdGVuZXJNZXRob2ROYW1lKSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpdGVtQ2hlY2thYmxlID49IDIpIHsKLSAgICAgICAgICAgICAgICAoKE1lbnVJdGVtSW1wbCkgaXRlbSkuc2V0RXhjbHVzaXZlQ2hlY2thYmxlKHRydWUpOworICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51SXRlbUltcGwpIHsKKyAgICAgICAgICAgICAgICBNZW51SXRlbUltcGwgaW1wbCA9IChNZW51SXRlbUltcGwpIGl0ZW07CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1DaGVja2FibGUgPj0gMikgeworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEV4Y2x1c2l2ZUNoZWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpdGVtQWN0aW9uVmlld0NsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xhenogPSBDbGFzcy5mb3JOYW1lKGl0ZW1BY3Rpb25WaWV3Q2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3I8Pz4gYyA9IGNsYXp6LmdldENvbnN0cnVjdG9yKEFDVElPTl9WSUVXX0NPTlNUUlVDVE9SX1NJR05BVFVSRSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0QWN0aW9uVmlldygoVmlldykgYy5uZXdJbnN0YW5jZShtQ29udGV4dCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbUFjdGlvblZpZXdMYXlvdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEFjdGlvblZpZXcoaW5mbGF0ZXIuaW5mbGF0ZShpdGVtQWN0aW9uVmlld0xheW91dCwgbnVsbCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCmluZGV4IGZjZWJlYzUuLjhiOWQ2NTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJdGVtLmphdmEKQEAgLTMxLDYgKzMxLDIxIEBACiAgKiBGb3IgYSBmZWF0dXJlIHNldCBvZiBzcGVjaWZpYyBtZW51IHR5cGVzLCBzZWUge0BsaW5rIE1lbnV9LgogICovCiBwdWJsaWMgaW50ZXJmYWNlIE1lbnVJdGVtIHsKKyAgICAvKgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBhdHRycy54bWwgZW51bSBjb25zdGFudHMgZm9yIHNob3dBc0FjdGlvbgorICAgICAqLworICAgIC8qKiBOZXZlciBzaG93IHRoaXMgaXRlbSBhcyBhIGJ1dHRvbiBpbiBhbiBBY3Rpb24gQmFyLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX05FVkVSID0gMDsKKyAgICAvKiogU2hvdyB0aGlzIGl0ZW0gYXMgYSBidXR0b24gaW4gYW4gQWN0aW9uIEJhciBpZiB0aGUgc3lzdGVtIGRlY2lkZXMgdGhlcmUgaXMgcm9vbSBmb3IgaXQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fSUZfUk9PTSA9IDE7CisgICAgLyoqCisgICAgICogQWx3YXlzIHNob3cgdGhpcyBpdGVtIGFzIGEgYnV0dG9uIGluIGFuIEFjdGlvbiBCYXIuCisgICAgICogVXNlIHNwYXJpbmdseSEgSWYgdG9vIG1hbnkgaXRlbXMgYXJlIHNldCB0byBhbHdheXMgc2hvdyBpbiB0aGUgQWN0aW9uIEJhciBpdCBjYW4KKyAgICAgKiBjcm93ZCB0aGUgQWN0aW9uIEJhciBhbmQgZGVncmFkZSB0aGUgdXNlciBleHBlcmllbmNlIG9uIGRldmljZXMgd2l0aCBzbWFsbGVyIHNjcmVlbnMuCisgICAgICogQSBnb29kIHJ1bGUgb2YgdGh1bWIgaXMgdG8gaGF2ZSBubyBtb3JlIHRoYW4gMiBpdGVtcyBzZXQgdG8gYWx3YXlzIHNob3cgYXQgYSB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX0FMV0FZUyA9IDI7CisgICAgCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEgbWVudSBpdGVtIGlzCiAgICAgICogY2xpY2tlZC4KQEAgLTM4MSw0ICszOTYsMzggQEAKICAgICAgKiAgICAgICAgIG1lbnUgaXRlbSB0byB0aGUgbWVudS4gVGhpcyBjYW4gYmUgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29udGV4dE1lbnVJbmZvIGdldE1lbnVJbmZvKCk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyBob3cgdGhpcyBpdGVtIHNob3VsZCBkaXNwbGF5IGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBY3Rpb24gQmFyLgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGlvbkVudW0gSG93IHRoZSBpdGVtIHNob3VsZCBkaXNwbGF5LiBPbmUgb2YKKyAgICAgKiB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0FMV0FZU30sIHtAbGluayAjU0hPV19BU19BQ1RJT05fSUZfUk9PTX0sIG9yCisgICAgICoge0BsaW5rICNTSE9XX0FTX0FDVElPTl9ORVZFUn0uIFNIT1dfQVNfQUNUSU9OX05FVkVSIGlzIHRoZSBkZWZhdWx0LgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuQWN0aW9uQmFyCisgICAgICogQHNlZSAjc2V0QWN0aW9uVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3dBc0FjdGlvbihpbnQgYWN0aW9uRW51bSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gYWN0aW9uIHZpZXcgZm9yIHRoaXMgbWVudSBpdGVtLiBBbiBhY3Rpb24gdmlldyB3aWxsIGJlIGRpc3BsYXllZCBpbiBwbGFjZQorICAgICAqIG9mIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1lbnUgaXRlbSBlbGVtZW50IGluIHRoZSBVSSB3aGVuIHRoaXMgaXRlbSBpcyBzaG93bgorICAgICAqIGFzIGFuIGFjdGlvbiB3aXRoaW4gYSBwYXJlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlldyBWaWV3IHRvIHVzZSBmb3IgcHJlc2VudGluZyB0aGlzIGl0ZW0gdG8gdGhlIHVzZXIuCisgICAgICogQHJldHVybiBUaGlzIEl0ZW0gc28gYWRkaXRpb25hbCBzZXR0ZXJzIGNhbiBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTaG93QXNBY3Rpb24oaW50KQorICAgICAqLworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KFZpZXcgdmlldyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2V0IGFjdGlvbiB2aWV3IGZvciB0aGlzIG1lbnUgaXRlbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhpcyBpdGVtJ3MgYWN0aW9uIHZpZXcKKyAgICAgKgorICAgICAqIEBzZWUgI3NldEFjdGlvblZpZXcoVmlldykKKyAgICAgKiBAc2VlICNzZXRTaG93QXNBY3Rpb24oaW50KQorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldEFjdGlvblZpZXcoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50LmphdmEKaW5kZXggNjcwNTU5Ni4uZGZiZTY1YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Nb3Rpb25FdmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwpAQCAtMzQ3LDYgKzM0OCw4IEBACiAgICAgcHJpdmF0ZSBSdW50aW1lRXhjZXB0aW9uIG1SZWN5Y2xlZExvY2F0aW9uOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVjeWNsZWQ7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVRyYW5zZm9ybShNYXRyaXggbWF0cml4KTsKKwogICAgIHByaXZhdGUgTW90aW9uRXZlbnQoaW50IHBvaW50ZXJDb3VudCwgaW50IHNhbXBsZUNvdW50KSB7CiAgICAgICAgIG1Qb2ludGVySWRlbnRpZmllcnMgPSBuZXcgaW50W3BvaW50ZXJDb3VudF07CiAgICAgICAgIG1EYXRhU2FtcGxlcyA9IG5ldyBmbG9hdFtwb2ludGVyQ291bnQgKiBzYW1wbGVDb3VudCAqIE5VTV9TQU1QTEVfREFUQV07CkBAIC0xNDEzLDYgKzE0MTYsMTkgQEAKICAgICAgICAgbVlPZmZzZXQgPSB5IC0gZGF0YVNhbXBsZXNbbGFzdERhdGFTYW1wbGVJbmRleCArIFNBTVBMRV9ZXTsKICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogQXBwbGllcyBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byBhbGwgb2YgdGhlIHBvaW50cyBpbiB0aGUgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF0cml4IFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gYXBwbHkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgdHJhbnNmb3JtKE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgaWYgKG1hdHJpeCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXRyaXggbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgbmF0aXZlVHJhbnNmb3JtKG1hdHJpeCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGdldFBvaW50ZXJDb29yZHNBdFNhbXBsZUluZGV4KGludCBzYW1wbGVJbmRleCwKICAgICAgICAgICAgIFBvaW50ZXJDb29yZHMgb3V0UG9pbnRlckNvb3JkcykgewogICAgICAgICBmaW5hbCBmbG9hdFtdIGRhdGFTYW1wbGVzID0gbURhdGFTYW1wbGVzOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TY2FsZUdlc3R1cmVEZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TY2FsZUdlc3R1cmVEZXRlY3Rvci5qYXZhCmluZGV4IDA5OTk1OTguLjE3YjVkZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU2NhbGVHZXN0dXJlRGV0ZWN0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1NjYWxlR2VzdHVyZURldGVjdG9yLmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKICAqIHVzaW5nIHRoZSBzdXBwbGllZCB7QGxpbmsgTW90aW9uRXZlbnR9cy4gVGhlIHtAbGluayBPblNjYWxlR2VzdHVyZUxpc3RlbmVyfQogICogY2FsbGJhY2sgd2lsbCBub3RpZnkgdXNlcnMgd2hlbiBhIHBhcnRpY3VsYXIgZ2VzdHVyZSBldmVudCBoYXMgb2NjdXJyZWQuCiAgKiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgTW90aW9uRXZlbnR9cyByZXBvcnRlZCB2aWEgdG91Y2guCi0gKiAKKyAqCiAgKiBUbyB1c2UgdGhpcyBjbGFzczoKICAqIDx1bD4KICAqICA8bGk+Q3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSB7QGNvZGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3J9IGZvciB5b3VyCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICogSWYgeW91IHdhbnQgdG8gbGlzdGVuIGZvciBhbGwgdGhlIGRpZmZlcmVudCBnZXN0dXJlcyB0aGVuIGltcGxlbWVudAogICAgICAqIHRoaXMgaW50ZXJmYWNlLiBJZiB5b3Ugb25seSB3YW50IHRvIGxpc3RlbiBmb3IgYSBzdWJzZXQgaXQgbWlnaHQKICAgICAgKiBiZSBlYXNpZXIgdG8gZXh0ZW5kIHtAbGluayBTaW1wbGVPblNjYWxlR2VzdHVyZUxpc3RlbmVyfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEFuIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSBldmVudHMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKICAgICAgKiA8dWw+CiAgICAgICogIDxsaT5PbmUge0BsaW5rIE9uU2NhbGVHZXN0dXJlTGlzdGVuZXIjb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yKX0KQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlc3BvbmRzIHRvIHNjYWxpbmcgZXZlbnRzIGZvciBhIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCiAgICAgICAgICAqIFJlcG9ydGVkIGJ5IHBvaW50ZXIgbW90aW9uLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldGVjdG9yIFRoZSBkZXRlY3RvciByZXBvcnRpbmcgdGhlIGV2ZW50IC0gdXNlIHRoaXMgdG8KICAgICAgICAgICogICAgICAgICAgcmV0cmlldmUgZXh0ZW5kZWQgaW5mbyBhYm91dCBldmVudCBzdGF0ZS4KICAgICAgICAgICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZGV0ZWN0b3Igc2hvdWxkIGNvbnNpZGVyIHRoaXMgZXZlbnQKQEAgLTY4LDcgKzY4LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlc3BvbmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBzY2FsaW5nIGdlc3R1cmUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAqIG5ldyBwb2ludGVycyBnb2luZyBkb3duLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldGVjdG9yIFRoZSBkZXRlY3RvciByZXBvcnRpbmcgdGhlIGV2ZW50IC0gdXNlIHRoaXMgdG8KICAgICAgICAgICogICAgICAgICAgcmV0cmlldmUgZXh0ZW5kZWQgaW5mbyBhYm91dCBldmVudCBzdGF0ZS4KICAgICAgICAgICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZGV0ZWN0b3Igc2hvdWxkIGNvbnRpbnVlIHJlY29nbml6aW5nCkBAIC04MiwxNyArODIsMTcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlc3BvbmRzIHRvIHRoZSBlbmQgb2YgYSBzY2FsZSBnZXN0dXJlLiBSZXBvcnRlZCBieSBleGlzdGluZwogICAgICAgICAgKiBwb2ludGVycyBnb2luZyB1cC4KLSAgICAgICAgICogCisgICAgICAgICAqCiAgICAgICAgICAqIE9uY2UgYSBzY2FsZSBoYXMgZW5kZWQsIHtAbGluayBTY2FsZUdlc3R1cmVEZXRlY3RvciNnZXRGb2N1c1goKX0KICAgICAgICAgICogYW5kIHtAbGluayBTY2FsZUdlc3R1cmVEZXRlY3RvciNnZXRGb2N1c1koKX0gd2lsbCByZXR1cm4gdGhlIGxvY2F0aW9uCiAgICAgICAgICAqIG9mIHRoZSBwb2ludGVyIHJlbWFpbmluZyBvbiB0aGUgc2NyZWVuLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldGVjdG9yIFRoZSBkZXRlY3RvciByZXBvcnRpbmcgdGhlIGV2ZW50IC0gdXNlIHRoaXMgdG8KICAgICAgICAgICogICAgICAgICAgcmV0cmlldmUgZXh0ZW5kZWQgaW5mbyBhYm91dCBldmVudCBzdGF0ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhbGVFbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEEgY29udmVuaWVuY2UgY2xhc3MgdG8gZXh0ZW5kIHdoZW4geW91IG9ubHkgd2FudCB0byBsaXN0ZW4gZm9yIGEgc3Vic2V0CiAgICAgICogb2Ygc2NhbGluZy1yZWxhdGVkIGV2ZW50cy4gVGhpcyBpbXBsZW1lbnRzIGFsbCBtZXRob2RzIGluCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICAgKiB7QGNvZGUgZmFsc2V9IHNvIHRoYXQgYSBzdWJjbGFzcyBjYW4gcmV0cmlldmUgdGhlIGFjY3VtdWxhdGVkIHNjYWxlCiAgICAgICogZmFjdG9yIGluIGFuIG92ZXJyaWRkZW4gb25TY2FsZUVuZC4KICAgICAgKiB7QGxpbmsgT25TY2FsZUdlc3R1cmVMaXN0ZW5lciNvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IpfSByZXR1cm5zCi0gICAgICoge0Bjb2RlIHRydWV9LiAKKyAgICAgKiB7QGNvZGUgdHJ1ZX0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVPblNjYWxlR2VzdHVyZUxpc3RlbmVyIGltcGxlbWVudHMgT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7CiAKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgIHByaXZhdGUgZmxvYXQgbUN1cnJQcmVzc3VyZTsKICAgICBwcml2YXRlIGZsb2F0IG1QcmV2UHJlc3N1cmU7CiAgICAgcHJpdmF0ZSBsb25nIG1UaW1lRGVsdGE7Ci0gICAgCisKICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1FZGdlU2xvcDsKICAgICBwcml2YXRlIGZsb2F0IG1SaWdodFNsb3BFZGdlOwogICAgIHByaXZhdGUgZmxvYXQgbUJvdHRvbVNsb3BFZGdlOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKICAgICAgICAgICAgICAgICBpZiAobVNsb3BweUdlc3R1cmUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhdGUgc2xvcHB5IGdlc3R1cmVzIGlmIHdlJ3ZlIG1vdmVkIG91dHNpZGUgb2YgdGhlIHNsb3AgYXJlYS4KQEAgLTI0OSw3ICsyNDksNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOgogICAgICAgICAgICAgICAgIGlmIChtU2xvcHB5R2VzdHVyZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZm9jdXMgcG9pbnQgdG8gdGhlIHJlbWFpbmluZyBmaW5nZXIKQEAgLTMwNywxNyArMzA3LDE3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogTW90aW9uRXZlbnQgaGFzIG5vIGdldFJhd1goaW50KSBtZXRob2Q7IHNpbXVsYXRlIGl0IHBlbmRpbmcgZnV0dXJlIEFQSSBhcHByb3ZhbC4gCisgICAgICogTW90aW9uRXZlbnQgaGFzIG5vIGdldFJhd1goaW50KSBtZXRob2Q7IHNpbXVsYXRlIGl0IHBlbmRpbmcgZnV0dXJlIEFQSSBhcHByb3ZhbC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBnZXRSYXdYKE1vdGlvbkV2ZW50IGV2ZW50LCBpbnQgcG9pbnRlckluZGV4KSB7CiAgICAgICAgIGZsb2F0IG9mZnNldCA9IGV2ZW50LmdldFJhd1goKSAtIGV2ZW50LmdldFgoKTsKICAgICAgICAgcmV0dXJuIGV2ZW50LmdldFgocG9pbnRlckluZGV4KSArIG9mZnNldDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBNb3Rpb25FdmVudCBoYXMgbm8gZ2V0UmF3WShpbnQpIG1ldGhvZDsgc2ltdWxhdGUgaXQgcGVuZGluZyBmdXR1cmUgQVBJIGFwcHJvdmFsLiAKKyAgICAgKiBNb3Rpb25FdmVudCBoYXMgbm8gZ2V0UmF3WShpbnQpIG1ldGhvZDsgc2ltdWxhdGUgaXQgcGVuZGluZyBmdXR1cmUgQVBJIGFwcHJvdmFsLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGdldFJhd1koTW90aW9uRXZlbnQgZXZlbnQsIGludCBwb2ludGVySW5kZXgpIHsKICAgICAgICAgZmxvYXQgb2Zmc2V0ID0gZXZlbnQuZ2V0UmF3WSgpIC0gZXZlbnQuZ2V0WSgpOwpAQCAtMzkwLDcgKzM5MCw3IEBACiAgICAgICogcmVtYWluaW5nIHBvaW50ZXIgb24gdGhlIHNjcmVlbi4KICAgICAgKiBJZiB7QGxpbmsgI2lzSW5Qcm9ncmVzcygpfSB3b3VsZCByZXR1cm4gZmFsc2UsIHRoZSByZXN1bHQgb2YgdGhpcwogICAgICAqIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gWCBjb29yZGluYXRlIG9mIHRoZSBmb2NhbCBwb2ludCBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEZvY3VzWCgpIHsKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgICAqIHJlbWFpbmluZyBwb2ludGVyIG9uIHRoZSBzY3JlZW4uCiAgICAgICogSWYge0BsaW5rICNpc0luUHJvZ3Jlc3MoKX0gd291bGQgcmV0dXJuIGZhbHNlLCB0aGUgcmVzdWx0IG9mIHRoaXMKICAgICAgKiBmdW5jdGlvbiBpcyB1bmRlZmluZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFkgY29vcmRpbmF0ZSBvZiB0aGUgZm9jYWwgcG9pbnQgaW4gcGl4ZWxzLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRGb2N1c1koKSB7CkBAIC00MTUsNyArNDE1LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCiAgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gRGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEN1cnJlbnRTcGFuKCkgewpAQCAtNDI4LDkgKzQyOCwyOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB4IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludGVycyBmb3JtaW5nIHRoZQorICAgICAqIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3RhbmNlIGJldHdlZW4gcG9pbnRlcnMgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyZW50U3BhblgoKSB7CisgICAgICAgIHJldHVybiBtQ3VyckZpbmdlckRpZmZYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB5IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludGVycyBmb3JtaW5nIHRoZQorICAgICAqIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3RhbmNlIGJldHdlZW4gcG9pbnRlcnMgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyZW50U3BhblkoKSB7CisgICAgICAgIHJldHVybiBtQ3VyckZpbmdlckRpZmZZOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCiAgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gUHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFByZXZpb3VzU3BhbigpIHsKQEAgLTQ0MywxMCArNDYzLDMwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcmV2aW91cyB4IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludGVycyBmb3JtaW5nIHRoZQorICAgICAqIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFByZXZpb3VzIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRlcnMgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQcmV2aW91c1NwYW5YKCkgeworICAgICAgICByZXR1cm4gbVByZXZGaW5nZXJEaWZmWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHkgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCisgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFByZXZpb3VzU3BhblkoKSB7CisgICAgICAgIHJldHVybiBtUHJldkZpbmdlckRpZmZZOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc2NhbGluZyBmYWN0b3IgZnJvbSB0aGUgcHJldmlvdXMgc2NhbGUgZXZlbnQgdG8gdGhlIGN1cnJlbnQKICAgICAgKiBldmVudC4gVGhpcyB2YWx1ZSBpcyBkZWZpbmVkIGFzCiAgICAgICogKHtAbGluayAjZ2V0Q3VycmVudFNwYW4oKX0gLyB7QGxpbmsgI2dldFByZXZpb3VzU3BhbigpfSkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNjYWxpbmcgZmFjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZUZhY3RvcigpIHsKQEAgLTQ1NSwyMCArNDk1LDIwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1TY2FsZUZhY3RvcjsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHRpbWUgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgcHJldmlvdXMKICAgICAgKiBhY2NlcHRlZCBzY2FsaW5nIGV2ZW50IGFuZCB0aGUgY3VycmVudCBzY2FsaW5nIGV2ZW50LgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBUaW1lIGRpZmZlcmVuY2Ugc2luY2UgdGhlIGxhc3Qgc2NhbGluZyBldmVudCBpbiBtaWxsaXNlY29uZHMuCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0VGltZURlbHRhKCkgewogICAgICAgICByZXR1cm4gbVRpbWVEZWx0YTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgZXZlbnQgYmVpbmcgcHJvY2Vzc2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBDdXJyZW50IGV2ZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldEV2ZW50VGltZSgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmVsb2NpdHlUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZlbG9jaXR5VHJhY2tlci5qYXZhCmluZGV4IGZiODhjNzEuLmIxZmRlYzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmVsb2NpdHlUcmFja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WZWxvY2l0eVRyYWNrZXIuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQUdFX01JTExJU0VDT05EUyA9IDIwMDsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9JTlRFUl9QT09MX0NBUEFDSVRZID0gMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUG9vbDxWZWxvY2l0eVRyYWNrZXI+IHNQb29sID0gUG9vbHMuc3luY2hyb25pemVkUG9vbCgKICAgICAgICAgICAgIFBvb2xzLmZpbml0ZVBvb2wobmV3IFBvb2xhYmxlTWFuYWdlcjxWZWxvY2l0eVRyYWNrZXI+KCkgewpAQCAtNzYsNiArNzcsNyBAQAogICAgIHByaXZhdGUgUG9pbnRlciBtUG9pbnRlckxpc3RIZWFkOyAvLyBzb3J0ZWQgYnkgaWQgaW4gaW5jcmVhc2luZyBvcmRlcgogICAgIHByaXZhdGUgaW50IG1MYXN0VG91Y2hJbmRleDsKICAgICBwcml2YXRlIGludCBtR2VuZXJhdGlvbjsKKyAgICBwcml2YXRlIGludCBtQWN0aXZlUG9pbnRlcklkOwogCiAgICAgcHJpdmF0ZSBWZWxvY2l0eVRyYWNrZXIgbU5leHQ7CiAKQEAgLTEyNSw2ICsxMjcsNyBAQAogICAgICAgICAKICAgICAgICAgbVBvaW50ZXJMaXN0SGVhZCA9IG51bGw7CiAgICAgICAgIG1MYXN0VG91Y2hJbmRleCA9IDA7CisgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTgwLDYgKzE4MywxMCBAQAogICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgd2VudCBkb3duLiAgQWRkIGl0IHRvIHRoZSBsaXN0LgogICAgICAgICAgICAgICAgIC8vIFdyaXRlIGEgc2VudGluZWwgYXQgdGhlIGVuZCBvZiB0aGUgcGFzdFRpbWUgdHJhY2Ugc28gd2Ugd2lsbCBiZSBhYmxlIHRvCiAgICAgICAgICAgICAgICAgLy8gdGVsbCB3aGVuIHRoZSB0cmFjZSBzdGFydGVkLgorICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlUG9pbnRlcklkID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25ncmF0dWxhdGlvbnMhIFlvdSdyZSB0aGUgbmV3IGFjdGl2ZSBwb2ludGVyIQorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gcG9pbnRlcklkOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwb2ludGVyID0gb2J0YWluUG9pbnRlcigpOwogICAgICAgICAgICAgICAgIHBvaW50ZXIuaWQgPSBwb2ludGVySWQ7CiAgICAgICAgICAgICAgICAgcG9pbnRlci5wYXN0VGltZVtsYXN0VG91Y2hJbmRleF0gPSBMb25nLk1JTl9WQUxVRTsKQEAgLTIxNCw2ICsyMjEsNyBAQAogICAgICAgICBwcmV2aW91c1BvaW50ZXIgPSBudWxsOwogICAgICAgICBmb3IgKFBvaW50ZXIgcG9pbnRlciA9IG1Qb2ludGVyTGlzdEhlYWQ7IHBvaW50ZXIgIT0gbnVsbDsgKSB7CiAgICAgICAgICAgICBmaW5hbCBQb2ludGVyIG5leHRQb2ludGVyID0gcG9pbnRlci5uZXh0OworICAgICAgICAgICAgZmluYWwgaW50IHBvaW50ZXJJZCA9IHBvaW50ZXIuaWQ7CiAgICAgICAgICAgICBpZiAocG9pbnRlci5nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHdlbnQgdXAuICBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdC4KICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNQb2ludGVyID09IG51bGwpIHsKQEAgLTIyMiw2ICsyMzAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQb2ludGVyLm5leHQgPSBuZXh0UG9pbnRlcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmVsZWFzZVBvaW50ZXIocG9pbnRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAocG9pbnRlcklkID09IG1BY3RpdmVQb2ludGVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUGljayBhIG5ldyBhY3RpdmUgcG9pbnRlci4gSG93IGlzIGFyYml0cmFyeS4KKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IG1Qb2ludGVyTGlzdEhlYWQgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJMaXN0SGVhZC5pZCA6IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHByZXZpb3VzUG9pbnRlciA9IHBvaW50ZXI7CiAgICAgICAgICAgICB9CkBAIC0zMzQsNyArMzQ4LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIFggdmVsb2NpdHkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFhWZWxvY2l0eSgpIHsKLSAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcigwKTsKKyAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcihtQWN0aXZlUG9pbnRlcklkKTsKICAgICAgICAgcmV0dXJuIHBvaW50ZXIgIT0gbnVsbCA/IHBvaW50ZXIueFZlbG9jaXR5IDogMDsKICAgICB9CiAgICAgCkBAIC0zNDUsNyArMzU5LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIFkgdmVsb2NpdHkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFlWZWxvY2l0eSgpIHsKLSAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcigwKTsKKyAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcihtQWN0aXZlUG9pbnRlcklkKTsKICAgICAgICAgcmV0dXJuIHBvaW50ZXIgIT0gbnVsbCA/IHBvaW50ZXIueVZlbG9jaXR5IDogMDsKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IDU0Y2VkZmIuLjQ3MmY3YjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC0xNiwxNCArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKLQoraW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FtZXJhOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CkBAIC0zNCw2ICszMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKQEAgLTQ3LDggKzQ3LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2w7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2xhYmxlOwpAQCAtNjUsMTIgKzYzLDE1IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbEJhckRyYXdhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwogCiAvKioKQEAgLTI2MCw3ICsyNjEsOCBAQAogICogPHVsPgogICogPGxpPkRlZmluZSBhIEJ1dHRvbiBpbiB0aGUgbGF5b3V0IGZpbGUgYW5kIGFzc2lnbiBpdCBhIHVuaXF1ZSBJRC4KICAqIDxwcmU+Ci0gKiAmbHQ7QnV0dG9uIGlkPSJAK2lkL215X2J1dHRvbiIKKyAqICZsdDtCdXR0b24KKyAqICAgICBhbmRyb2lkOmlkPSJAK2lkL215X2J1dHRvbiIKICAqICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICogICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9teV9idXR0b25fdGV4dCIvJmd0OwpAQCAtOTE3LDYgKzkxOSwyMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBUFRJQ19GRUVEQkFDS19FTkFCTEVEID0gMHgxMDAwMDAwMDsKIAogICAgIC8qKgorICAgICAqIDxwPkluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGhpZXJhcmNoeSBzaG91bGQgc3RvcCBzYXZpbmcgc3RhdGUgd2hlbgorICAgICAqIGl0IHJlYWNoZXMgdGhpcyB2aWV3LiAgSWYgc3RhdGUgc2F2aW5nIGlzIGluaXRpYXRlZCBpbW1lZGlhdGVseSBhdAorICAgICAqIHRoZSB2aWV3LCBpdCB3aWxsIGJlIGFsbG93ZWQuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFSRU5UX1NBVkVfRElTQUJMRUQgPSAweDIwMDAwMDAwOworCisgICAgLyoqCisgICAgICogPHA+TWFzayBmb3IgdXNlIHdpdGggc2V0RmxhZ3MgaW5kaWNhdGluZyBiaXRzIHVzZWQgZm9yIFBBUkVOVF9TQVZFX0RJU0FCTEVELjwvcD4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLID0gMHgyMDAwMDAwMDsKKworICAgIC8qKgogICAgICAqIFZpZXcgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIge0BsaW5rICNhZGRGb2N1c2FibGVzKEFycmF5TGlzdCwgaW50LCBpbnQpfQogICAgICAqIHNob3VsZCBhZGQgYWxsIGZvY3VzYWJsZSBWaWV3cyByZWdhcmRsZXNzIGlmIHRoZXkgYXJlIGZvY3VzYWJsZSBpbiB0b3VjaCBtb2RlLgogICAgICAqLwpAQCAtOTcyLDcgKzk4OCw3IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCiAgICAgICogQHNlZSAjZ2V0RHJhd2FibGVTdGF0ZSgpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTVBUWV9TVEFURV9TRVQgPSB7fTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVNUFRZX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgZW5hYmxlZC4gU3RhdGVzIGFyZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZX0gdG8gY2hhbmdlIHRoZSBkcmF3aW5nIG9mIHRoZQpAQCAtOTgxLDcgKzk5Nyw3IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCiAgICAgICogQHNlZSAjZ2V0RHJhd2FibGVTdGF0ZSgpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1NUQVRFX1NFVCA9IHtSLmF0dHIuc3RhdGVfZW5hYmxlZH07CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgZm9jdXNlZC4gU3RhdGVzIGFyZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZX0gdG8gY2hhbmdlIHRoZSBkcmF3aW5nIG9mIHRoZQpAQCAtOTkwLDcgKzEwMDYsNyBAQAogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQogICAgICAqIEBzZWUgI2dldERyYXdhYmxlU3RhdGUoKQogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQgPSB7Ui5hdHRyLnN0YXRlX2ZvY3VzZWR9OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHNlbGVjdGVkLiBTdGF0ZXMgYXJlIHVzZWQgd2l0aAogICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlfSB0byBjaGFuZ2UgdGhlIGRyYXdpbmcgb2YgdGhlCkBAIC05OTksNyArMTAxNSw3IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCiAgICAgICogQHNlZSAjZ2V0RHJhd2FibGVTdGF0ZSgpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTRUxFQ1RFRF9TVEFURV9TRVQgPSB7Ui5hdHRyLnN0YXRlX3NlbGVjdGVkfTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFNFTEVDVEVEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZC4gU3RhdGVzIGFyZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZX0gdG8gY2hhbmdlIHRoZSBkcmF3aW5nIG9mIHRoZQpAQCAtMTAwOSw3ICsxMDI1LDcgQEAKICAgICAgKiBAc2VlICNnZXREcmF3YWJsZVN0YXRlKCkKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9TVEFURV9TRVQgPSB7Ui5hdHRyLnN0YXRlX3ByZXNzZWR9OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3J3Mgd2luZG93IGhhcyBmb2N1cy4gU3RhdGVzIGFyZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZX0gdG8gY2hhbmdlIHRoZSBkcmF3aW5nIG9mIHRoZQpAQCAtMTAxOCw4ICsxMDM0LDcgQEAKICAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKICAgICAgKiBAc2VlICNnZXREcmF3YWJsZVN0YXRlKCkKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICB7Ui5hdHRyLnN0YXRlX3dpbmRvd19mb2N1c2VkfTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvLyBEb3VibGVzCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQgYW5kIGhhcyB0aGUgZm9jdXMuCkBAIC0xMDI3LDQ4ICsxMDQyLDQyIEBACiAgICAgICogQHNlZSAjRU5BQkxFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNGT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEVOQUJMRURfU1RBVEVfU0VULCBGT0NVU0VEX1NUQVRFX1NFVCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBlbmFibGVkIGFuZCBzZWxlY3RlZC4KICAgICAgKgogICAgICAqIEBzZWUgI0VOQUJMRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEVOQUJMRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQgYW5kIHRoYXQgaXRzIHdpbmRvdyBoYXMgZm9jdXMuCiAgICAgICoKICAgICAgKiBAc2VlICNFTkFCTEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihFTkFCTEVEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBmb2N1c2VkIGFuZCBzZWxlY3RlZC4KICAgICAgKgogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEZPQ1VTRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGhhcyB0aGUgZm9jdXMgYW5kIHRoYXQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oRk9DVVNFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgc2VsZWN0ZWQgYW5kIHRoYXQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihTRUxFQ1RFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLy8gVHJpcGxlcwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBlbmFibGVkLCBmb2N1c2VkIGFuZCBzZWxlY3RlZC4KQEAgLTEwNzcsOCArMTA4Niw3IEBACiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihFTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgZW5hYmxlZCwgZm9jdXNlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCkBAIC0xMDg2LDggKzEwOTQsNyBAQAogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKQEAgLTEwOTUsOCArMTEwMiw3IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEVOQUJMRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGZvY3VzZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKQEAgLTExMDQsOCArMTExMCw3IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQsIGZvY3VzZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93CiAgICAgICogaGFzIHRoZSBmb2N1cy4KQEAgLTExMTUsMjggKzExMjAsMjEgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKICAgICAgKiBAc2VlICNQUkVTU0VEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQgYW5kIHNlbGVjdGVkLgogICAgICAqCiAgICAgICogQHNlZSAjUFJFU1NFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfU0VMRUNURURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9TVEFURV9TRVQsIFNFTEVDVEVEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfU0VMRUNURURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBzZWxlY3RlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCkBAIC0xMTQ0LDE4ICsxMTQyLDE0IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCBhbmQgZm9jdXNlZC4KICAgICAgKgogICAgICAqIEBzZWUgI1BSRVNTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX1NUQVRFX1NFVCwgRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBmb2N1c2VkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKQEAgLTExNjMsOSArMTE1Nyw3IEBACiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBmb2N1c2VkIGFuZCBzZWxlY3RlZC4KICAgICAgKgpAQCAtMTE3Myw5ICsxMTY1LDcgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNGT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRk9DVVNFRF9TVEFURV9TRVQsIFNFTEVDVEVEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQsIGZvY3VzZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKQEAgLTExODQsMTggKzExNzQsMTQgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkIGFuZCBlbmFibGVkLgogICAgICAqCiAgICAgICogQHNlZSAjUFJFU1NFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNFTkFCTEVEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfU1RBVEVfU0VULCBFTkFCTEVEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQsIGVuYWJsZWQgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KICAgICAgKgpAQCAtMTIwMyw5ICsxMTg5LDcgQEAKICAgICAgKiBAc2VlICNFTkFCTEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQsIGVuYWJsZWQgYW5kIHNlbGVjdGVkLgogICAgICAqCkBAIC0xMjEzLDkgKzExOTcsNyBAQAogICAgICAqIEBzZWUgI0VOQUJMRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9FTkFCTEVEX1NUQVRFX1NFVCwgU0VMRUNURURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCwgZW5hYmxlZCwgc2VsZWN0ZWQgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZQogICAgICAqIGZvY3VzLgpAQCAtMTIyNSw5ICsxMjA3LDcgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBlbmFibGVkIGFuZCBmb2N1c2VkLgogICAgICAqCkBAIC0xMjM1LDkgKzEyMTUsNyBAQAogICAgICAqIEBzZWUgI0VOQUJMRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQsIEZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBlbmFibGVkLCBmb2N1c2VkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUKICAgICAgKiBmb2N1cy4KQEAgLTEyNDcsOSArMTIyNSw3IEBACiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBlbmFibGVkLCBmb2N1c2VkIGFuZCBzZWxlY3RlZC4KICAgICAgKgpAQCAtMTI1OCw5ICsxMjM0LDcgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNGT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQsIGVuYWJsZWQsIGZvY3VzZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93CiAgICAgICogaGFzIHRoZSBmb2N1cy4KQEAgLTEyNzEsNDcgKzEyNDUsMTMyIEBACiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKIAogICAgIC8qKgogICAgICAqIFRoZSBvcmRlciBoZXJlIGlzIHZlcnkgaW1wb3J0YW50IHRvIHtAbGluayAjZ2V0RHJhd2FibGVTdGF0ZSgpfQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdW10gVklFV19TVEFURV9TRVRTID0gewotICAgICAgICBFTVBUWV9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAwIDAgMAotICAgICAgICBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAwIDAgMQotICAgICAgICBTRUxFQ1RFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAwIDEgMAotICAgICAgICBTRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAwIDEgMQotICAgICAgICBGT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAxIDAgMAotICAgICAgICBGT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAxIDAgMQotICAgICAgICBGT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAxIDEgMAotICAgICAgICBGT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgIC8vIDAgMCAxIDEgMQotICAgICAgICBFTkFCTEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAwIDAgMAotICAgICAgICBFTkFCTEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAwIDAgMQotICAgICAgICBFTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAwIDEgMAotICAgICAgICBFTkFCTEVEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgIC8vIDAgMSAwIDEgMQotICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAxIDAgMAotICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgIC8vIDAgMSAxIDAgMQotICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAxIDEgMAotICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgIC8vIDAgMSAxIDEgMQotICAgICAgICBQUkVTU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAwIDAgMAotICAgICAgICBQUkVTU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAwIDAgMQotICAgICAgICBQUkVTU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAwIDEgMAotICAgICAgICBQUkVTU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgIC8vIDEgMCAwIDEgMQotICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAxIDAgMAotICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgIC8vIDEgMCAxIDAgMQotICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAxIDEgMAotICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgIC8vIDEgMCAxIDEgMQotICAgICAgICBQUkVTU0VEX0VOQUJMRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMSAwIDAgMAotICAgICAgICBQUkVTU0VEX0VOQUJMRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgIC8vIDEgMSAwIDAgMQotICAgICAgICBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMSAwIDEgMAotICAgICAgICBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgIC8vIDEgMSAwIDEgMQotICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMSAxIDAgMAotICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgIC8vIDEgMSAxIDAgMQotICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgIC8vIDEgMSAxIDEgMAotICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsIC8vIDEgMSAxIDEgMQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdW10gVklFV19TVEFURV9TRVRTOworCisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFZJRVdfU1RBVEVfU0VMRUNURUQgPSAxIDw8IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX0ZPQ1VTRUQgPSAxIDw8IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX0VOQUJMRUQgPSAxIDw8IDM7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX1BSRVNTRUQgPSAxIDw8IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX0FDVElWQVRFRCA9IDEgPDwgNTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBWSUVXX1NUQVRFX0lEUyA9IG5ldyBpbnRbXSB7CisgICAgICAgIFIuYXR0ci5zdGF0ZV93aW5kb3dfZm9jdXNlZCwgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCwKKyAgICAgICAgUi5hdHRyLnN0YXRlX3NlbGVjdGVkLCAgICAgICAgICBWSUVXX1NUQVRFX1NFTEVDVEVELAorICAgICAgICBSLmF0dHIuc3RhdGVfZm9jdXNlZCwgICAgICAgICAgIFZJRVdfU1RBVEVfRk9DVVNFRCwKKyAgICAgICAgUi5hdHRyLnN0YXRlX2VuYWJsZWQsICAgICAgICAgICBWSUVXX1NUQVRFX0VOQUJMRUQsCisgICAgICAgIFIuYXR0ci5zdGF0ZV9wcmVzc2VkLCAgICAgICAgICAgVklFV19TVEFURV9QUkVTU0VELAorICAgICAgICBSLmF0dHIuc3RhdGVfYWN0aXZhdGVkLCAgICAgICAgIFZJRVdfU1RBVEVfQUNUSVZBVEVELAogICAgIH07CiAKKyAgICBzdGF0aWMgeworICAgICAgICBpbnRbXSBvcmRlcmVkSWRzID0gbmV3IGludFtWSUVXX1NUQVRFX0lEUy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFIuc3R5bGVhYmxlLlZpZXdEcmF3YWJsZVN0YXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50IHZpZXdTdGF0ZSA9IFIuc3R5bGVhYmxlLlZpZXdEcmF3YWJsZVN0YXRlc1tpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqPFZJRVdfU1RBVEVfSURTLmxlbmd0aDsgaiArPSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKFZJRVdfU1RBVEVfSURTW2pdID09IHZpZXdTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBvcmRlcmVkSWRzW2kgKiAyXSA9IHZpZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgb3JkZXJlZElkc1tpICogMiArIDFdID0gVklFV19TVEFURV9JRFNbaiArIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTlVNX0JJVFMgPSBWSUVXX1NUQVRFX0lEUy5sZW5ndGggLyAyOworICAgICAgICBWSUVXX1NUQVRFX1NFVFMgPSBuZXcgaW50WzEgPDwgTlVNX0JJVFNdW107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVklFV19TVEFURV9TRVRTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbnVtQml0cyA9IEludGVnZXIuYml0Q291bnQoaSk7CisgICAgICAgICAgICBpbnRbXSBzZXQgPSBuZXcgaW50W251bUJpdHNdOworICAgICAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9yZGVyZWRJZHMubGVuZ3RoOyBqICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGkgJiBvcmRlcmVkSWRzW2orMV0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0W3BvcysrXSA9IG9yZGVyZWRJZHNbal07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVklFV19TVEFURV9TRVRTW2ldID0gc2V0OworICAgICAgICB9CisKKyAgICAgICAgRU1QVFlfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWzBdOworICAgICAgICBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRF07CisgICAgICAgIFNFTEVDVEVEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1tWSUVXX1NUQVRFX1NFTEVDVEVEXTsKKyAgICAgICAgU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1NFTEVDVEVEXTsKKyAgICAgICAgRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbVklFV19TVEFURV9GT0NVU0VEXTsKKyAgICAgICAgRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfRk9DVVNFRF07CisgICAgICAgIEZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0ZPQ1VTRURdOworICAgICAgICBGT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9TRUxFQ1RFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9GT0NVU0VEXTsKKyAgICAgICAgRU5BQkxFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbVklFV19TVEFURV9FTkFCTEVEXTsKKyAgICAgICAgRU5BQkxFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfRU5BQkxFRF07CisgICAgICAgIEVOQUJMRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0VOQUJMRURdOworICAgICAgICBFTkFCTEVEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9TRUxFQ1RFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9FTkFCTEVEXTsKKyAgICAgICAgRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX0VOQUJMRURdOworICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX0ZPQ1VTRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRU5BQkxFRF07CisgICAgICAgIEVOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9TRUxFQ1RFRCB8IFZJRVdfU1RBVEVfRk9DVVNFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9FTkFCTEVEXTsKKyAgICAgICAgRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9TRUxFQ1RFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9GT0NVU0VEfCBWSUVXX1NUQVRFX0VOQUJMRURdOworCisgICAgICAgIFBSRVNTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTW1ZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1NFTEVDVEVEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfU0VMRUNURUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9GT0NVU0VEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9GT0NVU0VECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0ZPQ1VTRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfU0VMRUNURUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRk9DVVNFRCB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9FTkFCTEVEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9FTkFCTEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9FTkFCTEVECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0VOQUJMRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfU0VMRUNURUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRU5BQkxFRCB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX0VOQUJMRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9GT0NVU0VECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX0VOQUJMRUQgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9TRUxFQ1RFRCB8IFZJRVdfU1RBVEVfRk9DVVNFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9FTkFCTEVEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1NFTEVDVEVECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX0ZPQ1VTRUR8IFZJRVdfU1RBVEVfRU5BQkxFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBVc2VkIGJ5IHZpZXdzIHRoYXQgY29udGFpbiBsaXN0cyBvZiBpdGVtcy4gVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdAogICAgICAqIHRoZSB2aWV3IGlzIHNob3dpbmcgdGhlIGxhc3QgaXRlbS4KQEAgLTE1NTEsMzggKzE2MTAsMTUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVdBS0VOX1NDUk9MTF9CQVJTX09OX0FUVEFDSCA9IDB4MDgwMDAwMDA7CiAKICAgICAvKioKLSAgICAgKiBBbHdheXMgYWxsb3cgYSB1c2VyIHRvIG92ZXItc2Nyb2xsIHRoaXMgdmlldywgcHJvdmlkZWQgaXQgaXMgYQotICAgICAqIHZpZXcgdGhhdCBjYW4gc2Nyb2xsLgorICAgICAqIEluZGljYXRlcyB0aGF0IHBpdm90WCBvciBwaXZvdFkgd2VyZSBleHBsaWNpdGx5IHNldCBhbmQgd2Ugc2hvdWxkIG5vdCBhc3N1bWUgdGhlIGNlbnRlcgorICAgICAqIGZvciB0cmFuc2Zvcm0gb3BlcmF0aW9ucwogICAgICAqCi0gICAgICogQHNlZSAjZ2V0T3ZlclNjcm9sbE1vZGUoKQotICAgICAqIEBzZWUgI3NldE92ZXJTY3JvbGxNb2RlKGludCkKKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9WRVJfU0NST0xMX0FMV0FZUyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJVk9UX0VYUExJQ0lUTFlfU0VUID0gMHgyMDAwMDAwMDsKIAotICAgIC8qKgotICAgICAqIEFsbG93IGEgdXNlciB0byBvdmVyLXNjcm9sbCB0aGlzIHZpZXcgb25seSBpZiB0aGUgY29udGVudCBpcyBsYXJnZQotICAgICAqIGVub3VnaCB0byBtZWFuaW5nZnVsbHkgc2Nyb2xsLCBwcm92aWRlZCBpdCBpcyBhIHZpZXcgdGhhdCBjYW4gc2Nyb2xsLgotICAgICAqCi0gICAgICogQHNlZSAjZ2V0T3ZlclNjcm9sbE1vZGUoKQotICAgICAqIEBzZWUgI3NldE92ZXJTY3JvbGxNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVkVSX1NDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgPSAxOwotCi0gICAgLyoqCi0gICAgICogTmV2ZXIgYWxsb3cgYSB1c2VyIHRvIG92ZXItc2Nyb2xsIHRoaXMgdmlldy4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldE92ZXJTY3JvbGxNb2RlKCkKLSAgICAgKiBAc2VlICNzZXRPdmVyU2Nyb2xsTW9kZShpbnQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUl9TQ1JPTExfTkVWRVIgPSAyOwotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgdGhlIG92ZXItc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4KLSAgICAgKiBTZWUge0BsaW5rICNvdmVyU2Nyb2xsQnkoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pfSwKLSAgICAgKiB7QGxpbmsgI09WRVJfU0NST0xMX0FMV0FZU30sIHtAbGluayAjT1ZFUl9TQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTfSwKLSAgICAgKiBhbmQge0BsaW5rICNPVkVSX1NDUk9MTF9ORVZFUn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU92ZXJTY3JvbGxNb2RlOworICAgIC8qKiB7QGhpZGV9ICovCisgICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVkFURUQgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwMDAwMDsKIAogICAgIC8qKgogICAgICAqIFRoZSBwYXJlbnQgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvLgpAQCAtMTYzNSw2ICsxNjcxLDEzNiBAQAogICAgIGludCBtVmlld0ZsYWdzOwogCiAgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSBWaWV3LiBUaGlzIHRyYW5zZm9ybSBpcyBjYWxjdWxhdGVkIGludGVybmFsbHkKKyAgICAgKiBiYXNlZCBvbiB0aGUgcm90YXRpb24sIHNjYWxlWCwgYW5kIHNjYWxlWSBwcm9wZXJ0aWVzLiBUaGUgaWRlbnRpdHkgbWF0cml4CisgICAgICogaXMgdXNlZCBieSBkZWZhdWx0LiBEbyAqbm90KiB1c2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RseTsgaW5zdGVhZCBjYWxsCisgICAgICogZ2V0TWF0cml4KCksIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSByZWNhbGN1bGF0ZSB0aGUgbWF0cml4IGlmIG5lY2Vzc2FyeQorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCBtYXRyaXggYmFzZWQgb24gdGhlIGxhdGVzdCByb3RhdGlvbiBhbmQgc2NhbGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hdHJpeCBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSBWaWV3LiBUaGlzIHRyYW5zZm9ybSBpcyBjYWxjdWxhdGVkIGludGVybmFsbHkKKyAgICAgKiBiYXNlZCBvbiB0aGUgcm90YXRpb24sIHNjYWxlWCwgYW5kIHNjYWxlWSBwcm9wZXJ0aWVzLiBUaGUgaWRlbnRpdHkgbWF0cml4CisgICAgICogaXMgdXNlZCBieSBkZWZhdWx0LiBEbyAqbm90KiB1c2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RseTsgaW5zdGVhZCBjYWxsCisgICAgICogZ2V0SW52ZXJzZU1hdHJpeCgpLCB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVjYWxjdWxhdGUgdGhlIG1hdHJpeCBpZiBuZWNlc3NhcnkKKyAgICAgKiB0byBnZXQgdGhlIGNvcnJlY3QgbWF0cml4IGJhc2VkIG9uIHRoZSBsYXRlc3Qgcm90YXRpb24gYW5kIHNjYWxlIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXRyaXggbUludmVyc2VNYXRyaXg7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcm5hbCB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1NYXRyaXhEaXJ0eSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJuYWwgdmFyaWFibGUgdGhhdCB0cmFja3Mgd2hldGhlciB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZQorICAgICAqIHRyYW5zZm9ybSBtYXRyaXgsIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHJvdGF0aW9uIG9yIHNjYWxlWC9ZIHByb3BlcnRpZXMKKyAgICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG1hdHJpeCB3YXMgbGFzdCBjYWxjdWxhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSW52ZXJzZU1hdHJpeERpcnR5ID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEEgdmFyaWFibGUgdGhhdCB0cmFja3Mgd2hldGhlciB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZQorICAgICAqIHRyYW5zZm9ybSBtYXRyaXgsIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHJvdGF0aW9uIG9yIHNjYWxlWC9ZIHByb3BlcnRpZXMKKyAgICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG1hdHJpeCB3YXMgbGFzdCBjYWxjdWxhdGVkLiBUaGlzIHZhcmlhYmxlCisgICAgICogaXMgb25seSB2YWxpZCBhZnRlciBhIGNhbGwgdG8gdXBkYXRlTWF0cml4KCkgb3IgdG8gYSBmdW5jdGlvbiB0aGF0CisgICAgICogY2FsbHMgaXQgc3VjaCBhcyBnZXRNYXRyaXgoKSwgaGFzSWRlbnRpdHlNYXRyaXgoKSBhbmQgZ2V0SW52ZXJzZU1hdHJpeCgpLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtTWF0cml4SXNJZGVudGl0eSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ2FtZXJhIG9iamVjdCBpcyB1c2VkIHRvIGNvbXB1dGUgYSAzRCBtYXRyaXggd2hlbiByb3RhdGlvblggb3Igcm90YXRpb25ZIGFyZSBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBDYW1lcmEgbUNhbWVyYSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1hdHJpeCBpcyB1c2VkIHdoZW4gY29tcHV0aW5nIHRoZSBtYXRyaXggZm9yIDNEIHJvdGF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hdHJpeCBtYXRyaXgzRCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBwcmV2IHZhbHVlcyBhcmUgdXNlZCB0byByZWNhbGN1bGF0ZSBhIGNlbnRlcmVkIHBpdm90IHBvaW50IHdoZW4gbmVjZXNzYXJ5LiBUaGUKKyAgICAgKiBwaXZvdCBwb2ludCBpcyBvbmx5IHVzZWQgaW4gbWF0cml4IG9wZXJhdGlvbnMgKHdoZW4gcm90YXRpb24sIHNjYWxlLCBvciB0cmFuc2xhdGlvbiBhcmUKKyAgICAgKiBzZXQpLCBzbyB0aGVzIHZhbHVlcyBhcmUgb25seSB1c2VkIHRoZW4gYXMgd2VsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtUHJldldpZHRoID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQgPSAtMTsKKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIHZhbHVlIHRvIGNoZWNrIGZvciBmbG9hdCB2YWx1ZXMgdGhhdCBhcmUgY2xvc2UgZW5vdWdoIHRvIHplcm8gdG8gYmUgY29uc2lkZXJlZAorICAgICAqIHplcm8uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTk9OWkVST19FUFNJTE9OID0gLjAwMWY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyByb3RhdGlvbiBhcm91bmQgdGhlIHZlcnRpY2FsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUm90YXRpb25ZID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyByb3RhdGlvbiBhcm91bmQgdGhlIGhvcml6b250YWwgYXhpcyB0aHJvdWdoIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1Sb3RhdGlvblggPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHJvdGF0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUm90YXRpb24gPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdHJhbnNsYXRpb24gb2YgdGhlIG9iamVjdCBhd2F5IGZyb20gaXRzIGxlZnQgcHJvcGVydHkgKHBvc3QtbGF5b3V0KS4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1UcmFuc2xhdGlvblggPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdHJhbnNsYXRpb24gb2YgdGhlIG9iamVjdCBhd2F5IGZyb20gaXRzIHRvcCBwcm9wZXJ0eSAocG9zdC1sYXlvdXQpLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVRyYW5zbGF0aW9uWSA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiBzY2FsZSBpbiB0aGUgeCBkaXJlY3Rpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4gQQorICAgICAqIHZhbHVlIG9mIDEgbWVhbnMgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlWCA9IDFmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiBzY2FsZSBpbiB0aGUgeSBkaXJlY3Rpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4gQQorICAgICAqIHZhbHVlIG9mIDEgbWVhbnMgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlWSA9IDFmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiBzY2FsZSBpbiB0aGUgeCBkaXJlY3Rpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4gQQorICAgICAqIHZhbHVlIG9mIDEgbWVhbnMgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVBpdm90WCA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiBzY2FsZSBpbiB0aGUgeSBkaXJlY3Rpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4gQQorICAgICAqIHZhbHVlIG9mIDEgbWVhbnMgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVBpdm90WSA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIG9wYWNpdHkgb2YgdGhlIFZpZXcuIFRoaXMgaXMgYSB2YWx1ZSBmcm9tIDAgdG8gMSwgd2hlcmUgMCBtZWFucworICAgICAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgYW5kIDEgbWVhbnMgY29tcGxldGVseSBvcGFxdWUuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtQWxwaGEgPSAxZjsKKworICAgIC8qKgogICAgICAqIFRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoaXMgdmlldydzIHBhcmVudAogICAgICAqIHRvIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhpcyB2aWV3LgogICAgICAqIHtAaGlkZX0KQEAgLTE3NDgsNiArMTkxNCwxMSBAQAogICAgIHByb3RlY3RlZCBPbkZvY3VzQ2hhbmdlTGlzdGVuZXIgbU9uRm9jdXNDaGFuZ2VMaXN0ZW5lcjsKIAogICAgIC8qKgorICAgICAqIExpc3RlbmVycyBmb3IgbGF5b3V0IGNoYW5nZSBldmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8T25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4gbU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzOworCisgICAgLyoqCiAgICAgICogTGlzdGVuZXIgdXNlZCB0byBkaXNwYXRjaCBjbGljayBldmVudHMuCiAgICAgICogVGhpcyBmaWVsZCBzaG91bGQgYmUgbWFkZSBwcml2YXRlLCBzbyBpdCBpcyBoaWRkZW4gZnJvbSB0aGUgU0RLLgogICAgICAqIHtAaGlkZX0KQEAgLTE3ODMsOCArMTk1NCw5IEBACiAKICAgICBwcml2YXRlIGludFtdIG1EcmF3YWJsZVN0YXRlID0gbnVsbDsKIAotICAgIHByaXZhdGUgU29mdFJlZmVyZW5jZTxCaXRtYXA+IG1EcmF3aW5nQ2FjaGU7Ci0gICAgcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlPEJpdG1hcD4gbVVuc2NhbGVkRHJhd2luZ0NhY2hlOworICAgIHByaXZhdGUgQml0bWFwIG1EcmF3aW5nQ2FjaGU7CisgICAgcHJpdmF0ZSBCaXRtYXAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlOworICAgIHByaXZhdGUgRGlzcGxheUxpc3QgbURpc3BsYXlMaXN0OwogCiAgICAgLyoqCiAgICAgICogV2hlbiB0aGlzIHZpZXcgaGFzIGZvY3VzIGFuZCB0aGUgbmV4dCBmb2N1cyBpcyB7QGxpbmsgI0ZPQ1VTX0xFRlR9LApAQCAtMTg2MCw4ICsyMDMyLDEzIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbVRvdWNoU2xvcDsKIAotICAgIC8vIFVzZWQgZm9yIGRlYnVnIG9ubHkKLSAgICBzdGF0aWMgbG9uZyBzSW5zdGFuY2VDb3VudCA9IDA7CisgICAgLyoqCisgICAgICogQ2FjaGUgZHJhZy9kcm9wIHN0YXRlCisgICAgICoKKyAgICAgKi8KKyAgICBib29sZWFuIG1DYW5BY2NlcHREcm9wOworICAgIHByaXZhdGUgaW50IG1UaHVtYm5haWxXaWR0aDsKKyAgICBwcml2YXRlIGludCBtVGh1bWJuYWlsSGVpZ2h0OwogCiAgICAgLyoqCiAgICAgICogU2ltcGxlIGNvbnN0cnVjdG9yIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgdmlldyBmcm9tIGNvZGUuCkBAIC0xODczLDEwICsyMDUwLDcgQEAKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtUmVzb3VyY2VzID0gY29udGV4dCAhPSBudWxsID8gY29udGV4dC5nZXRSZXNvdXJjZXMoKSA6IG51bGw7CiAgICAgICAgIG1WaWV3RmxhZ3MgPSBTT1VORF9FRkZFQ1RTX0VOQUJMRUQgfCBIQVBUSUNfRkVFREJBQ0tfRU5BQkxFRDsKLSAgICAgICAgLy8gVXNlZCBmb3IgZGVidWcgb25seQotICAgICAgICAvLysrc0luc3RhbmNlQ291bnQ7CiAgICAgICAgIG1Ub3VjaFNsb3AgPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQoY29udGV4dCkuZ2V0U2NhbGVkVG91Y2hTbG9wKCk7Ci0gICAgICAgIHNldE92ZXJTY3JvbGxNb2RlKE9WRVJfU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTQyLDcgKzIxMTYsNiBAQAogCiAgICAgICAgIGludCBzY3JvbGxiYXJTdHlsZSA9IFNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVk7CiAKLSAgICAgICAgaW50IG92ZXJTY3JvbGxNb2RlID0gbU92ZXJTY3JvbGxNb2RlOwogICAgICAgICBmaW5hbCBpbnQgTiA9IGEuZ2V0SW5kZXhDb3VudCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgaW50IGF0dHIgPSBhLmdldEluZGV4KGkpOwpAQCAtMjE0OCwxNCArMjMyMSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdfb3ZlclNjcm9sbE1vZGU6Ci0gICAgICAgICAgICAgICAgICAgIG92ZXJTY3JvbGxNb2RlID0gYS5nZXRJbnQoYXR0ciwgT1ZFUl9TQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzZXRPdmVyU2Nyb2xsTW9kZShvdmVyU2Nyb2xsTW9kZSk7Ci0KICAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgewogICAgICAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGJhY2tncm91bmQpOwogICAgICAgICB9CkBAIC0yMjA0LDE1ICsyMzcyLDYgQEAKICAgICBWaWV3KCkgewogICAgIH0KIAotICAgIC8vIFVzZWQgZm9yIGRlYnVnIG9ubHkKLSAgICAvKgotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIC0tc0luc3RhbmNlQ291bnQ7Ci0gICAgfQotICAgICovCi0KICAgICAvKioKICAgICAgKiA8cD4KICAgICAgKiBJbml0aWFsaXplcyB0aGUgZmFkaW5nIGVkZ2VzIGZyb20gYSBnaXZlbiBzZXQgb2Ygc3R5bGVkIGF0dHJpYnV0ZXMuIFRoaXMKQEAgLTI0MTksNiArMjU3OCwzOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYm91bmRzIG9mIHRoZSB2aWV3IGNoYW5nZSBkdWUgdG8KKyAgICAgKiBsYXlvdXQgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGxheW91dCBib3VuZHMgY2hhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIoT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PbkxheW91dENoYW5nZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8T25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgbGF5b3V0IGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZvciBsYXlvdXQgYm91bmRzIGNoYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVPbkxheW91dENoYW5nZUxpc3RlbmVyKE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1PbkxheW91dENoYW5nZUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBsaXN0IG9mIGxpc3RlbmVycyBmb3IgbGF5b3V0IGNoYW5nZXMuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+IGdldE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGZvY3VzLWNoYW5nZSBjYWxsYmFjayByZWdpc3RlcmVkIGZvciB0aGlzIHZpZXcuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBjYWxsYmFjaywgb3IgbnVsbCBpZiBvbmUgaXMgbm90IHJlZ2lzdGVyZWQuCkBAIC0yNTIxLDYgKzI3MTMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTdGFydCBhbiBhY3Rpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayB0aGF0IHdpbGwgY29udHJvbCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIEByZXR1cm4gVGhlIG5ldyBhY3Rpb24gbW9kZSBpZiBpdCBpcyBzdGFydGVkLCBudWxsIG90aGVyd2lzZQorICAgICAqCisgICAgICogQHNlZSBBY3Rpb25Nb2RlCisgICAgICovCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKHRoaXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIGtleSBpcyBwcmVzc2VkIGluIHRoaXMgdmlldy4KICAgICAgKiBAcGFyYW0gbCB0aGUga2V5IGxpc3RlbmVyIHRvIGF0dGFjaCB0byB0aGlzIHZpZXcKICAgICAgKi8KQEAgLTMzNTAsNyArMzU1NCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJlc3NlZCB0aGF0IGZvciB0aGlzIHZpZXcuCisgICAgICogU2V0cyB0aGUgcHJlc3NlZCBzdGF0ZSBmb3IgdGhpcyB2aWV3LgogICAgICAqCiAgICAgICogQHNlZSAjaXNDbGlja2FibGUoKQogICAgICAqIEBzZWUgI3NldENsaWNrYWJsZShib29sZWFuKQpAQCAtMzQ1Nyw2ICszNjYxLDM4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudGlyZSBoaWVyYXJjaHkgdW5kZXIgdGhpcyB2aWV3IHdpbGwgc2F2ZSBpdHMKKyAgICAgKiBzdGF0ZSB3aGVuIGEgc3RhdGUgc2F2aW5nIHRyYXZlcnNhbCBvY2N1cnMgZnJvbSBpdHMgcGFyZW50LiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpcyB0cnVlOyBpZiBmYWxzZSwgdGhlc2Ugdmlld3Mgd2lsbCBub3QgYmUgc2F2ZWQgdW5sZXNzCisgICAgICoge0BsaW5rICNzYXZlSGllcmFyY2h5U3RhdGUoU3BhcnNlQXJyYXkpfSBpcyBjYWxsZWQgZGlyZWN0bHkgb24gdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHZpZXcgc3RhdGUgc2F2aW5nIGZyb20gcGFyZW50IGlzIGVuYWJsZWQsIGVsc2UgZmFsc2UuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgZW50aXJlIGhpZXJhcmNoeSB1bmRlciB0aGlzIHZpZXcgd2lsbCBzYXZlIGl0cworICAgICAqIHN0YXRlIHdoZW4gYSBzdGF0ZSBzYXZpbmcgdHJhdmVyc2FsIG9jY3VycyBmcm9tIGl0cyBwYXJlbnQuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWU7IGlmIGZhbHNlLCB0aGVzZSB2aWV3cyB3aWxsIG5vdCBiZSBzYXZlZCB1bmxlc3MKKyAgICAgKiB7QGxpbmsgI3NhdmVIaWVyYXJjaHlTdGF0ZShTcGFyc2VBcnJheSl9IGlzIGNhbGxlZCBkaXJlY3RseSBvbiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBTZXQgdG8gZmFsc2UgdG8gPGVtPmRpc2FibGU8L2VtPiBzdGF0ZSBzYXZpbmcsIG9yIHRydWUKKyAgICAgKiAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGl0LgorICAgICAqCisgICAgICogQHNlZSAjaXNTYXZlRnJvbVBhcmVudEVuYWJsZWQoKQorICAgICAqIEBzZWUgI3NldElkKGludCkKKyAgICAgKiBAc2VlICNvblNhdmVJbnN0YW5jZVN0YXRlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIHNldEZsYWdzKGVuYWJsZWQgPyAwIDogUEFSRU5UX1NBVkVfRElTQUJMRUQsIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spOworICAgIH0KKworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgVmlldyBpcyBhYmxlIHRvIHRha2UgZm9jdXMuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyB2aWV3IGNhbiB0YWtlIGZvY3VzLCBvciBmYWxzZSBvdGhlcndpc2UuCkBAIC0zNzIxLDYgKzM5NTcsMTIgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgLyoqIEdldHMgdGhlIFZpZXdSb290LCBvciBudWxsIGlmIG5vdCBhdHRhY2hlZC4gKi8KKyAgICAvKnBhY2thZ2UqLyBWaWV3Um9vdCBnZXRWaWV3Um9vdCgpIHsKKyAgICAgICAgVmlldyByb290ID0gZ2V0Um9vdFZpZXcoKTsKKyAgICAgICAgcmV0dXJuIHJvb3QgIT0gbnVsbCA/IChWaWV3Um9vdClyb290LmdldFBhcmVudCgpIDogbnVsbDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgdG8gdHJ5IHRvIGdpdmUgZm9jdXMgdG8gYSBzcGVjaWZpYyB2aWV3IG9yIHRvIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMuIFRoaXMgaXMgYQogICAgICAqIHNwZWNpYWwgdmFyaWFudCBvZiB7QGxpbmsgI3JlcXVlc3RGb2N1cygpIH0gdGhhdCB3aWxsIGFsbG93IHZpZXdzIHRoYXQgYXJlIG5vdCBmb2N1YWJsZSBpbgpAQCAtMzczNCwxMiArMzk3Niw5IEBACiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVxdWVzdEZvY3VzRnJvbVRvdWNoKCkgewogICAgICAgICAvLyBMZWF2ZSB0b3VjaCBtb2RlIGlmIHdlIG5lZWQgdG8KICAgICAgICAgaWYgKGlzSW5Ub3VjaE1vZGUoKSkgewotICAgICAgICAgICAgVmlldyByb290ID0gZ2V0Um9vdFZpZXcoKTsKLSAgICAgICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgIFZpZXdSb290IHZpZXdSb290ID0gKFZpZXdSb290KXJvb3QuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgIHZpZXdSb290LmVuc3VyZVRvdWNoTW9kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICB9CisgICAgICAgICAgICBWaWV3Um9vdCB2aWV3Um9vdCA9IGdldFZpZXdSb290KCk7CisgICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdSb290LmVuc3VyZVRvdWNoTW9kZShmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcXVlc3RGb2N1cyhWaWV3LkZPQ1VTX0RPV04pOwpAQCAtMzg0MSwxMiArNDA4MCwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgLy8gSWYgYW55IGF0dGFjaGVkIGtleSBsaXN0ZW5lciBhIGZpcnN0IGNyYWNrIGF0IHRoZSBldmVudC4KLSAgICAgICAgLy9ub2luc3BlY3Rpb24gU2ltcGxpZmlhYmxlSWZTdGF0ZW1lbnQKIAorICAgICAgICAvL25vaW5zcGVjdGlvbiBTaW1wbGlmaWFibGVJZlN0YXRlbWVudCxkZXByZWNhdGlvbgogICAgICAgICBpZiAoYW5kcm9pZC51dGlsLkNvbmZpZy5MT0dWKSB7CiAgICAgICAgICAgICBjYXB0dXJlVmlld0luZm8oImNhcHR1cmVWaWV3S2V5RXZlbnQiLCB0aGlzKTsKICAgICAgICAgfQogCisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFNpbXBsaWZpYWJsZUlmU3RhdGVtZW50CiAgICAgICAgIGlmIChtT25LZXlMaXN0ZW5lciAhPSBudWxsICYmIChtVmlld0ZsYWdzICYgRU5BQkxFRF9NQVNLKSA9PSBFTkFCTEVECiAgICAgICAgICAgICAgICAgJiYgbU9uS2V5TGlzdGVuZXIub25LZXkodGhpcywgZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzg3OCw2ICs0MTE4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFNpbXBsaWZpYWJsZUlmU3RhdGVtZW50CiAgICAgICAgIGlmIChtT25Ub3VjaExpc3RlbmVyICE9IG51bGwgJiYgKG1WaWV3RmxhZ3MgJiBFTkFCTEVEX01BU0spID09IEVOQUJMRUQgJiYKICAgICAgICAgICAgICAgICBtT25Ub3VjaExpc3RlbmVyLm9uVG91Y2godGhpcywgZXZlbnQpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM4OTQsNiArNDEzNSw3IEBACiAgICAgICogQHNlZSAjZ2V0RmlsdGVyVG91Y2hlc1doZW5PYnNjdXJlZAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG9uRmlsdGVyVG91Y2hFdmVudEZvclNlY3VyaXR5KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFJlZHVuZGFudElmU3RhdGVtZW50CiAgICAgICAgIGlmICgobVZpZXdGbGFncyAmIEZJTFRFUl9UT1VDSEVTX1dIRU5fT0JTQ1VSRUQpICE9IDAKICAgICAgICAgICAgICAgICAmJiAoZXZlbnQuZ2V0RmxhZ3MoKSAmIE1vdGlvbkV2ZW50LkZMQUdfV0lORE9XX0lTX09CU0NVUkVEKSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBXaW5kb3cgaXMgb2JzY3VyZWQsIGRyb3AgdGhpcyB0b3VjaC4KQEAgLTQ1MDEsOSArNDc0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIEJlIGxlbmllbnQgYWJvdXQgbW92aW5nIG91dHNpZGUgb2YgYnV0dG9ucwotICAgICAgICAgICAgICAgICAgICBpbnQgc2xvcCA9IG1Ub3VjaFNsb3A7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoeCA8IDAgLSBzbG9wKSB8fCAoeCA+PSBnZXRXaWR0aCgpICsgc2xvcCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSA8IDAgLSBzbG9wKSB8fCAoeSA+PSBnZXRIZWlnaHQoKSArIHNsb3ApKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcG9pbnRJblZpZXcoeCwgeSwgbVRvdWNoU2xvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91dHNpZGUgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUYXBDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgUFJFU1NFRCkgIT0gMCkgewpAQCAtNDY2OCw2ICs0OTA4LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoY2hhbmdlZCAmIFZJU0lCSUxJVFlfTUFTSykgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1QYXJlbnQgaW5zdGFuY2VvZiBWaWV3R3JvdXApIHsKKyAgICAgICAgICAgICAgICAoKFZpZXdHcm91cCltUGFyZW50KS5vbkNoaWxkVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgKGZsYWdzICYgVklTSUJJTElUWV9NQVNLKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBkaXNwYXRjaFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIChmbGFncyAmIFZJU0lCSUxJVFlfTUFTSykpOwogICAgICAgICB9CiAKQEAgLTQ3MzgsNiArNDk4MSwyOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgbGF5b3V0IGJvdW5kcyBvZiBhIHZpZXcKKyAgICAgKiBjaGFuZ2VzIGR1ZSB0byBsYXlvdXQgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZvY3VzIHN0YXRlIG9mIGEgdmlldyBoYXMgY2hhbmdlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHYgVGhlIHZpZXcgd2hvc2Ugc3RhdGUgaGFzIGNoYW5nZWQuCisgICAgICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBuZXcgdmFsdWUgb2YgdGhlIHZpZXcncyBsZWZ0IHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gdG9wIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHZpZXcncyB0b3AgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSByaWdodCBUaGUgbmV3IHZhbHVlIG9mIHRoZSB2aWV3J3MgcmlnaHQgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSBib3R0b20gVGhlIG5ldyB2YWx1ZSBvZiB0aGUgdmlldydzIGJvdHRvbSBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZExlZnQgVGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSB2aWV3J3MgbGVmdCBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZFRvcCBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyB0b3AgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSBvbGRSaWdodCBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyByaWdodCBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZEJvdHRvbSBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyBib3R0b20gcHJvcGVydHkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uTGF5b3V0Q2hhbmdlKFZpZXcgdiwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgIGludCBvbGRMZWZ0LCBpbnQgb2xkVG9wLCBpbnQgb2xkUmlnaHQsIGludCBvbGRCb3R0b20pOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBsYXlvdXQgd2hlbiB0aGUgc2l6ZSBvZiB0aGlzIHZpZXcgaGFzIGNoYW5nZWQuIElmCiAgICAgICogeW91IHdlcmUganVzdCBhZGRlZCB0byB0aGUgdmlldyBoaWVyYXJjaHksIHlvdSdyZSBjYWxsZWQgd2l0aCB0aGUgb2xkCiAgICAgICogdmFsdWVzIG9mIDAuCkBAIC00ODQ5LDYgKzUxMTQsMzY4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggb2YgdGhpcyB2aWV3LCB3aGljaCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50CisgICAgICogcm9hdGlvbiwgc2NhbGUsIGFuZCBwaXZvdCBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCB0cmFuc2Zvcm0gbWF0cml4IGZvciB0aGUgdmlldworICAgICAqLworICAgIHB1YmxpYyBNYXRyaXggZ2V0TWF0cml4KCkgeworICAgICAgICB1cGRhdGVNYXRyaXgoKTsKKyAgICAgICAgcmV0dXJuIG1NYXRyaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIGZhciBlbm91Z2ggYXdheSBmcm9tIHplcm8gdG8gYmUKKyAgICAgKiBjb25zaWRlcmVkIG5vbi16ZXJvLgorICAgICAqIEBwYXJhbSB2YWx1ZSBBIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIGNoZWNrIGZvciB6ZXJvLW5lc3MKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHBhc3NlZC1pbiB2YWx1ZSBpcyBmYXIgZW5vdWdoIGF3YXkgZnJvbSB6ZXJvIHRvIGJlIGNvbnNpZGVyZWQgbm9uLXplcm8KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vbnplcm8oZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSA8IC1OT05aRVJPX0VQU0lMT04gfHwgdmFsdWUgPiBOT05aRVJPX0VQU0lMT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNmb3JtIG1hdHJpeCBpcyB0aGUgaWRlbnRpdHkgbWF0cml4LgorICAgICAqIFJlY29tcHV0ZXMgdGhlIG1hdHJpeCBpZiBuZWNlc3NhcnkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGlzIHRoZSBpZGVudGl0eSBtYXRyaXgsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBmaW5hbCBib29sZWFuIGhhc0lkZW50aXR5TWF0cml4KCkgeworICAgICAgICB1cGRhdGVNYXRyaXgoKTsKKyAgICAgICAgcmV0dXJuIG1NYXRyaXhJc0lkZW50aXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29tcHV0ZXMgdGhlIHRyYW5zZm9ybSBtYXRyaXggaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNYXRyaXgoKSB7CisgICAgICAgIGlmIChtTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIC8vIHRyYW5zZm9ybS1yZWxhdGVkIHByb3BlcnRpZXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgc29tZW9uZQorICAgICAgICAgICAgLy8gYXNrZWQgZm9yIHRoZSBtYXRyaXg7IHJlY2FsY3VsYXRlIGl0IHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzCisKKyAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBpdm90IHBvaW50CisgICAgICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBQSVZPVF9FWFBMSUNJVExZX1NFVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgobVJpZ2h0IC0gbUxlZnQpICE9IG1QcmV2V2lkdGggJiYgKG1Cb3R0b20gLSBtVG9wKSAhPSBtUHJldkhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gbVJpZ2h0IC0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gbUJvdHRvbSAtIG1Ub3A7CisgICAgICAgICAgICAgICAgICAgIG1QaXZvdFggPSAoZmxvYXQpIG1QcmV2V2lkdGggLyAyZjsKKyAgICAgICAgICAgICAgICAgICAgbVBpdm90WSA9IChmbG9hdCkgbVByZXZIZWlnaHQgLyAyZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LnJlc2V0KCk7CisgICAgICAgICAgICBpZiAoIW5vbnplcm8obVJvdGF0aW9uWCkgJiYgIW5vbnplcm8obVJvdGF0aW9uWSkpIHsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnNldFRyYW5zbGF0ZShtVHJhbnNsYXRpb25YLCBtVHJhbnNsYXRpb25ZKTsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnByZVJvdGF0ZShtUm90YXRpb24sIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1NYXRyaXgucHJlU2NhbGUobVNjYWxlWCwgbVNjYWxlWSwgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtQ2FtZXJhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4M0QgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYW1lcmEuc2F2ZSgpOworICAgICAgICAgICAgICAgIG1NYXRyaXgucHJlU2NhbGUobVNjYWxlWCwgbVNjYWxlWSwgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5yb3RhdGVYKG1Sb3RhdGlvblgpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucm90YXRlWShtUm90YXRpb25ZKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJvdGF0ZVooLW1Sb3RhdGlvbik7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5nZXRNYXRyaXgobWF0cml4M0QpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnByZVRyYW5zbGF0ZSgtbVBpdm90WCwgLW1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnBvc3RUcmFuc2xhdGUobVBpdm90WCArIG1UcmFuc2xhdGlvblgsIG1QaXZvdFkgKyBtVHJhbnNsYXRpb25ZKTsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnBvc3RDb25jYXQobWF0cml4M0QpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucmVzdG9yZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gZmFsc2U7CisgICAgICAgICAgICBtTWF0cml4SXNJZGVudGl0eSA9IG1NYXRyaXguaXNJZGVudGl0eSgpOworICAgICAgICAgICAgbUludmVyc2VNYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgaW52ZXJzZSBvZiB0aGUgY3VycmVudCBtTWF0cml4IHByb3BlcnR5LgorICAgICAqIFdlIGNhY2hlIHRoZSBtYXRyaXggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCB3aGVuIHRyYW5zZm9ybSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBub3QgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGludmVyc2Ugb2YgdGhlIGN1cnJlbnQgbWF0cml4IG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBmaW5hbCBNYXRyaXggZ2V0SW52ZXJzZU1hdHJpeCgpIHsKKyAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgIGlmIChtSW52ZXJzZU1hdHJpeERpcnR5KSB7CisgICAgICAgICAgICBpZiAobUludmVyc2VNYXRyaXggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hdHJpeC5pbnZlcnQobUludmVyc2VNYXRyaXgpOworICAgICAgICAgICAgbUludmVyc2VNYXRyaXhEaXJ0eSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW52ZXJzZU1hdHJpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRSb3RhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Sb3RhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBJbmNyZWFzaW5nIHZhbHVlcworICAgICAqIHJlc3VsdCBpbiBjbG9ja3dpc2Ugcm90YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm90YXRpb24gVGhlIGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uKGZsb2F0IHJvdGF0aW9uKSB7CisgICAgICAgIGlmIChtUm90YXRpb24gIT0gcm90YXRpb24pIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSB2ZXJ0aWNhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2YgWSByb3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0Um90YXRpb25ZKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHZlcnRpY2FsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICogSW5jcmVhc2luZyB2YWx1ZXMgcmVzdWx0IGluIGNvdW50ZXItY2xvY2t3aXNlIHJvdGF0aW9uIGZyb20gdGhlIHZpZXdwb2ludCBvZiBsb29raW5nCisgICAgICogZG93biB0aGUgeSBheGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uWSBUaGUgZGVncmVlcyBvZiBZIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvblkoZmxvYXQgcm90YXRpb25ZKSB7CisgICAgICAgIGlmIChtUm90YXRpb25ZICE9IHJvdGF0aW9uWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgbVJvdGF0aW9uWSA9IHJvdGF0aW9uWTsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2YgWCByb3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0Um90YXRpb25YKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIGhvcml6b250YWwgYXhpcyB0aHJvdWdoIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBJbmNyZWFzaW5nIHZhbHVlcyByZXN1bHQgaW4gY2xvY2t3aXNlIHJvdGF0aW9uIGZyb20gdGhlIHZpZXdwb2ludCBvZiBsb29raW5nIGRvd24gdGhlCisgICAgICogeCBheGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uWCBUaGUgZGVncmVlcyBvZiBYIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvblgoZmxvYXQgcm90YXRpb25YKSB7CisgICAgICAgIGlmIChtUm90YXRpb25YICE9IHJvdGF0aW9uWCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgbVJvdGF0aW9uWCA9IHJvdGF0aW9uWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiB4IGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgd2lkdGguIEEgdmFsdWUgb2YgMSwgdGhlIGRlZmF1bHQsIG1lYW5zIHRoYXQgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqCisgICAgICogPHA+QnkgZGVmYXVsdCwgdGhpcyBpcyAxLjBmLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZVgoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiB4IGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgd2lkdGguIEEgdmFsdWUgb2YgMSBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FsZVggVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FsZVgoZmxvYXQgc2NhbGVYKSB7CisgICAgICAgIGlmIChtU2NhbGVYICE9IHNjYWxlWCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgbVNjYWxlWCA9IHNjYWxlWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiB5IGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgaGVpZ2h0LiBBIHZhbHVlIG9mIDEsIHRoZSBkZWZhdWx0LCBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIDxwPkJ5IGRlZmF1bHQsIHRoaXMgaXMgMS4wZi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBzY2FsaW5nIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0U2NhbGVZKCkgeworICAgICAgICByZXR1cm4gbVNjYWxlWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4gWSBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIHdpZHRoLiBBIHZhbHVlIG9mIDEgbWVhbnMgdGhhdCBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NhbGVZIFRoZSBzY2FsaW5nIGZhY3Rvci4KKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NhbGVZKGZsb2F0IHNjYWxlWSkgeworICAgICAgICBpZiAobVNjYWxlWSAhPSBzY2FsZVkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIG1TY2FsZVkgPSBzY2FsZVk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB4IGxvY2F0aW9uIG9mIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHZpZXcgaXMge0BsaW5rICNzZXRSb3RhdGlvbihmbG9hdCkgcm90YXRlZH0KKyAgICAgKiBhbmQge0BsaW5rICNzZXRTY2FsZVgoZmxvYXQpIHNjYWxlZH0uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgeCBsb2NhdGlvbiBvZiB0aGUgcGl2b3QgcG9pbnQuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFBpdm90WCgpIHsKKyAgICAgICAgcmV0dXJuIG1QaXZvdFg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgeCBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzCisgICAgICoge0BsaW5rICNzZXRSb3RhdGlvbihmbG9hdCkgcm90YXRlZH0gYW5kIHtAbGluayAjc2V0U2NhbGVYKGZsb2F0KSBzY2FsZWR9LgorICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBwaXZvdCBwb2ludCBpcyBjZW50ZXJlZCBvbiB0aGUgb2JqZWN0LgorICAgICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBkaXNhYmxlcyB0aGlzIGJlaGF2aW9yIGFuZCBjYXVzZXMgdGhlIHZpZXcgdG8gdXNlIG9ubHkgdGhlCisgICAgICogZXhwbGljaXRseSBzZXQgcGl2b3RYIGFuZCBwaXZvdFkgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHBpdm90WCBUaGUgeCBsb2NhdGlvbiBvZiB0aGUgcGl2b3QgcG9pbnQuCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBpdm90WChmbG9hdCBwaXZvdFgpIHsKKyAgICAgICAgbVByaXZhdGVGbGFncyB8PSBQSVZPVF9FWFBMSUNJVExZX1NFVDsKKyAgICAgICAgaWYgKG1QaXZvdFggIT0gcGl2b3RYKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgICAgICBtUGl2b3RYID0gcGl2b3RYOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeSBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVZKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHkgbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFkoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHkgbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcyB7QGxpbmsgI3NldFJvdGF0aW9uKGZsb2F0KSByb3RhdGVkfQorICAgICAqIGFuZCB7QGxpbmsgI3NldFNjYWxlWShmbG9hdCkgc2NhbGVkfS4gQnkgZGVmYXVsdCwgdGhlIHBpdm90IHBvaW50IGlzIGNlbnRlcmVkIG9uIHRoZSBvYmplY3QuCisgICAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IGRpc2FibGVzIHRoaXMgYmVoYXZpb3IgYW5kIGNhdXNlcyB0aGUgdmlldyB0byB1c2Ugb25seSB0aGUKKyAgICAgKiBleHBsaWNpdGx5IHNldCBwaXZvdFggYW5kIHBpdm90WSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGl2b3RZIFRoZSB5IGxvY2F0aW9uIG9mIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGl2b3RZKGZsb2F0IHBpdm90WSkgeworICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IFBJVk9UX0VYUExJQ0lUTFlfU0VUOworICAgICAgICBpZiAobVBpdm90WSAhPSBwaXZvdFkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIG1QaXZvdFkgPSBwaXZvdFk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvcGFjaXR5IG9mIHRoZSB2aWV3LiBUaGlzIGlzIGEgdmFsdWUgZnJvbSAwIHRvIDEsIHdoZXJlIDAgbWVhbnMgdGhlIHZpZXcgaXMKKyAgICAgKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IGFuZCAxIG1lYW5zIHRoZSB2aWV3IGlzIGNvbXBsZXRlbHkgb3BhcXVlLgorICAgICAqCisgICAgICogPHA+QnkgZGVmYXVsdCB0aGlzIGlzIDEuMGYuCisgICAgICogQHJldHVybiBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0QWxwaGEoKSB7CisgICAgICAgIHJldHVybiBtQWxwaGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgdmlldy4gVGhpcyBpcyBhIHZhbHVlIGZyb20gMCB0byAxLCB3aGVyZSAwIG1lYW5zIHRoZSB2aWV3IGlzCisgICAgICogY29tcGxldGVseSB0cmFuc3BhcmVudCBhbmQgMSBtZWFucyB0aGUgdmlldyBpcyBjb21wbGV0ZWx5IG9wYXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbHBoYShmbG9hdCBhbHBoYSkgeworICAgICAgICBtQWxwaGEgPSBhbHBoYTsKKyAgICAgICAgaWYgKG9uU2V0QWxwaGEoKGludCkgKGFscGhhICogMjU1KSkpIHsKKyAgICAgICAgICAgIC8vIHN1YmNsYXNzIGlzIGhhbmRsaW5nIGFscGhhIC0gZG9uJ3Qgb3B0aW1pemUgcmVuZGVyaW5nIGNhY2hlIGludmFsaWRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUb3AgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSB0b3Agb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCkBAIC00ODU5LDYgKzU0ODYsNTEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0b3AgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGJlIGNhbGxlZAorICAgICAqIGJ5IHRoZSBsYXlvdXQgc3lzdGVtIGFuZCBzaG91bGQgbm90IGdlbmVyYWxseSBiZSBjYWxsZWQgb3RoZXJ3aXNlLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eQorICAgICAqIG1heSBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lIGJ5IHRoZSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3Agb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0VG9wKGludCB0b3ApIHsKKyAgICAgICAgaWYgKHRvcCAhPSBtVG9wKSB7CisgICAgICAgICAgICB1cGRhdGVNYXRyaXgoKTsKKyAgICAgICAgICAgIGlmIChtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtaW5Ub3A7CisgICAgICAgICAgICAgICAgICAgIGludCB5TG9jOworICAgICAgICAgICAgICAgICAgICBpZiAodG9wIDwgbVRvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gdG9wOworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IHRvcCAtIG1Ub3A7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5Ub3AgPSBtVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgeUxvYywgbVJpZ2h0IC0gbUxlZnQsIG1Cb3R0b20gLSBtaW5Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgd2lkdGggPSBtUmlnaHQgLSBtTGVmdDsKKyAgICAgICAgICAgIGludCBvbGRIZWlnaHQgPSBtQm90dG9tIC0gbVRvcDsKKworICAgICAgICAgICAgbVRvcCA9IHRvcDsKKworICAgICAgICAgICAgb25TaXplQ2hhbmdlZCh3aWR0aCwgbUJvdHRvbSAtIG1Ub3AsIHdpZHRoLCBvbGRIZWlnaHQpOworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQm90dG9tIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgYm90dG9tIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgpAQCAtNDg2OSw2ICs1NTQxLDQ4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZQorICAgICAqIGNhbGxlZCBieSB0aGUgbGF5b3V0IHN5c3RlbSBhbmQgc2hvdWxkIG5vdCBnZW5lcmFsbHkgYmUgY2FsbGVkIG90aGVyd2lzZSwgYmVjYXVzZSB0aGUKKyAgICAgKiBwcm9wZXJ0eSBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgdGltZSBieSB0aGUgbGF5b3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEJvdHRvbShpbnQgYm90dG9tKSB7CisgICAgICAgIGlmIChib3R0b20gIT0gbUJvdHRvbSkgeworICAgICAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgICAgICBpZiAobU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4Qm90dG9tOworICAgICAgICAgICAgICAgICAgICBpZiAoYm90dG9tIDwgbUJvdHRvbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gbUJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCAwLCBtUmlnaHQgLSBtTGVmdCwgbWF4Qm90dG9tIC0gbVRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB3aWR0aCA9IG1SaWdodCAtIG1MZWZ0OworICAgICAgICAgICAgaW50IG9sZEhlaWdodCA9IG1Cb3R0b20gLSBtVG9wOworCisgICAgICAgICAgICBtQm90dG9tID0gYm90dG9tOworCisgICAgICAgICAgICBvblNpemVDaGFuZ2VkKHdpZHRoLCBtQm90dG9tIC0gbVRvcCwgd2lkdGgsIG9sZEhlaWdodCk7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMZWZ0IHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgbGVmdCBlZGdlIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgpAQCAtNDg3OSw2ICs1NTkzLDUyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4gVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgY2FsbGVkCisgICAgICogYnkgdGhlIGxheW91dCBzeXN0ZW0gYW5kIHNob3VsZCBub3QgZ2VuZXJhbGx5IGJlIGNhbGxlZCBvdGhlcndpc2UsIGJlY2F1c2UgdGhlIHByb3BlcnR5CisgICAgICogbWF5IGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgYnkgdGhlIGxheW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBib3R0b20gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TGVmdChpbnQgbGVmdCkgeworICAgICAgICBpZiAobGVmdCAhPSBtTGVmdCkgeworICAgICAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgICAgICBpZiAobU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHhMb2M7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0IDwgbUxlZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBsZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgeExvYyA9IGxlZnQgLSBtTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBtTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhMb2MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIuc2V0KHhMb2MsIDAsIG1SaWdodCAtIG1pbkxlZnQsIG1Cb3R0b20gLSBtVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG9sZFdpZHRoID0gbVJpZ2h0IC0gbUxlZnQ7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbUJvdHRvbSAtIG1Ub3A7CisKKyAgICAgICAgICAgIG1MZWZ0ID0gbGVmdDsKKworICAgICAgICAgICAgb25TaXplQ2hhbmdlZChtUmlnaHQgLSBtTGVmdCwgaGVpZ2h0LCBvbGRXaWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgaWYgKCFtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmlnaHQgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSByaWdodCBlZGdlIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgpAQCAtNDg4OSwxMiArNTY0OSwxODggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4gVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgY2FsbGVkCisgICAgICogYnkgdGhlIGxheW91dCBzeXN0ZW0gYW5kIHNob3VsZCBub3QgZ2VuZXJhbGx5IGJlIGNhbGxlZCBvdGhlcndpc2UsIGJlY2F1c2UgdGhlIHByb3BlcnR5CisgICAgICogbWF5IGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgYnkgdGhlIGxheW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByaWdodCBUaGUgYm90dG9tIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFJpZ2h0KGludCByaWdodCkgeworICAgICAgICBpZiAocmlnaHQgIT0gbVJpZ2h0KSB7CisgICAgICAgICAgICB1cGRhdGVNYXRyaXgoKTsKKyAgICAgICAgICAgIGlmIChtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0IDwgbVJpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSaWdodCA9IG1SaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJpZ2h0ID0gcmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgMCwgbWF4UmlnaHQgLSBtTGVmdCwgbUJvdHRvbSAtIG1Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgb2xkV2lkdGggPSBtUmlnaHQgLSBtTGVmdDsKKyAgICAgICAgICAgIGludCBoZWlnaHQgPSBtQm90dG9tIC0gbVRvcDsKKworICAgICAgICAgICAgbVJpZ2h0ID0gcmlnaHQ7CisKKyAgICAgICAgICAgIG9uU2l6ZUNoYW5nZWQobVJpZ2h0IC0gbUxlZnQsIGhlaWdodCwgb2xkV2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmlzdWFsIHggcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgKiB7QGxpbmsgI3NldFRyYW5zbGF0aW9uWChmbG9hdCkgdHJhbnNsYXRpb25YfSBwcm9wZXJ0eSBwbHVzIHRoZSBjdXJyZW50CisgICAgICoge0BsaW5rICNnZXRMZWZ0KCkgbGVmdH0gcHJvcGVydHkuIAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmlzdWFsIHggcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFgoKSB7CisgICAgICAgIHJldHVybiBtTGVmdCArIG1UcmFuc2xhdGlvblg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmlzdWFsIHggcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZQorICAgICAqIHtAbGluayAjc2V0VHJhbnNsYXRpb25YKGZsb2F0KSB0cmFuc2xhdGlvblh9IHByb3BlcnR5IHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgKiB0aGUgeCB2YWx1ZSBwYXNzZWQgaW4gYW5kIHRoZSBjdXJyZW50IHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHggVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFgoZmxvYXQgeCkgeworICAgICAgICBzZXRUcmFuc2xhdGlvblgoeCAtIG1MZWZ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmlzdWFsIHkgcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgKiB7QGxpbmsgI3NldFRyYW5zbGF0aW9uWShmbG9hdCkgdHJhbnNsYXRpb25ZfSBwcm9wZXJ0eSBwbHVzIHRoZSBjdXJyZW50CisgICAgICoge0BsaW5rICNnZXRUb3AoKSB0b3B9IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmlzdWFsIHkgcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFkoKSB7CisgICAgICAgIHJldHVybiBtVG9wICsgbVRyYW5zbGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2aXN1YWwgeSBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblkoZmxvYXQpIHRyYW5zbGF0aW9uWX0gcHJvcGVydHkgdG8gYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICAqIHRoZSB5IHZhbHVlIHBhc3NlZCBpbiBhbmQgdGhlIGN1cnJlbnQge0BsaW5rICNnZXRUb3AoKSB0b3B9IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHkgVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFkoZmxvYXQgeSkgeworICAgICAgICBzZXRUcmFuc2xhdGlvblkoeSAtIG1Ub3ApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGhvcml6b250YWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldExlZnQoKSBsZWZ0fSBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIHBvc2l0aW9uIGlzIHBvc3QtbGF5b3V0LCBpbiBhZGRpdGlvbiB0byB3aGVyZXZlciB0aGUgb2JqZWN0J3MKKyAgICAgKiBsYXlvdXQgcGxhY2VkIGl0LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIGxlZnQgcG9zaXRpb24sIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VHJhbnNsYXRpb25YKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIGxvY2F0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMge0BsaW5rICNnZXRMZWZ0KCkgbGVmdH0gcG9zaXRpb24uCisgICAgICogVGhpcyBlZmZlY3RpdmVseSBwb3NpdGlvbnMgdGhlIG9iamVjdCBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2xhdGlvblggVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBsZWZ0IHBvc2l0aW9uLAorICAgICAqIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2xhdGlvblgoZmxvYXQgdHJhbnNsYXRpb25YKSB7CisgICAgICAgIGlmIChtVHJhbnNsYXRpb25YICE9IHRyYW5zbGF0aW9uWCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgbVRyYW5zbGF0aW9uWCA9IHRyYW5zbGF0aW9uWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhvcml6b250YWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldFRvcCgpIHRvcH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgdG9wIHBvc2l0aW9uLAorICAgICAqIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VHJhbnNsYXRpb25ZKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyB0aGUgb2JqZWN0IHBvc3QtbGF5b3V0LCBpbiBhZGRpdGlvbiB0byB3aGVyZXZlciB0aGUgb2JqZWN0J3MKKyAgICAgKiBsYXlvdXQgcGxhY2VkIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zbGF0aW9uWSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB0b3AgcG9zaXRpb24sCisgICAgICogaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zbGF0aW9uWShmbG9hdCB0cmFuc2xhdGlvblkpIHsKKyAgICAgICAgaWYgKG1UcmFuc2xhdGlvblkgIT0gdHJhbnNsYXRpb25ZKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgICAgICBtVHJhbnNsYXRpb25ZID0gdHJhbnNsYXRpb25ZOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBIaXQgcmVjdGFuZ2xlIGluIHBhcmVudCdzIGNvb3JkaW5hdGVzCiAgICAgICoKICAgICAgKiBAcGFyYW0gb3V0UmVjdCBUaGUgaGl0IHJlY3RhbmdsZSBvZiB0aGUgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRIaXRSZWN0KFJlY3Qgb3V0UmVjdCkgewotICAgICAgICBvdXRSZWN0LnNldChtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tKTsKKyAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgIGlmIChtTWF0cml4SXNJZGVudGl0eSB8fCBtQXR0YWNoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRSZWN0LnNldChtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFJlY3RGIHRtcFJlY3QgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtUmVjdDsKKyAgICAgICAgICAgIHRtcFJlY3Quc2V0KC1tUGl2b3RYLCAtbVBpdm90WSwgZ2V0V2lkdGgoKSAtIG1QaXZvdFgsIGdldEhlaWdodCgpIC0gbVBpdm90WSk7CisgICAgICAgICAgICBtTWF0cml4Lm1hcFJlY3QodG1wUmVjdCk7CisgICAgICAgICAgICBvdXRSZWN0LnNldCgoaW50KSB0bXBSZWN0LmxlZnQgKyBtTGVmdCwgKGludCkgdG1wUmVjdC50b3AgKyBtVG9wLAorICAgICAgICAgICAgICAgICAgICAoaW50KSB0bXBSZWN0LnJpZ2h0ICsgbUxlZnQsIChpbnQpIHRtcFJlY3QuYm90dG9tICsgbVRvcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIHBvaW50LCBpbiBsb2NhbCBjb29yZGluYXRlcyBpcyBpbnNpZGUgdGhlIHZpZXcuCisgICAgICovCisgICAgLypwYWNrYWdlKi8gZmluYWwgYm9vbGVhbiBwb2ludEluVmlldyhmbG9hdCBsb2NhbFgsIGZsb2F0IGxvY2FsWSkgeworICAgICAgICByZXR1cm4gbG9jYWxYID49IDAgJiYgbG9jYWxYIDwgKG1SaWdodCAtIG1MZWZ0KQorICAgICAgICAgICAgICAgICYmIGxvY2FsWSA+PSAwICYmIGxvY2FsWSA8IChtQm90dG9tIC0gbVRvcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHBvaW50LCBpbiBsb2NhbCBjb29yZGluYXRlcywKKyAgICAgKiBpcyBpbnNpZGUgdGhlIHZpZXcsIHdoZXJlIHRoZSBhcmVhIG9mIHRoZSB2aWV3IGlzIGV4cGFuZGVkIGJ5IHRoZSBzbG9wIGZhY3Rvci4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgcHJvY2Vzc2luZyB0b3VjaC1tb3ZlIGV2ZW50cyB0byBkZXRlcm1pbmUgaWYgdGhlIGV2ZW50CisgICAgICogaXMgc3RpbGwgd2l0aGluIHRoZSB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwb2ludEluVmlldyhmbG9hdCBsb2NhbFgsIGZsb2F0IGxvY2FsWSwgZmxvYXQgc2xvcCkgeworICAgICAgICByZXR1cm4gbG9jYWxYID49IC1zbG9wICYmIGxvY2FsWSA+PSAtc2xvcCAmJiBsb2NhbFggPCAoKG1SaWdodCAtIG1MZWZ0KSArIHNsb3ApICYmCisgICAgICAgICAgICAgICAgbG9jYWxZIDwgKChtQm90dG9tIC0gbVRvcCkgKyBzbG9wKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ5NTcsOCArNTg5MywzOSBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG51bWJlciBvZiBwaXhlbHMgdG8gb2Zmc2V0IHRoZSB2aWV3IGJ5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb2Zmc2V0VG9wQW5kQm90dG9tKGludCBvZmZzZXQpIHsKLSAgICAgICAgbVRvcCArPSBvZmZzZXQ7Ci0gICAgICAgIG1Cb3R0b20gKz0gb2Zmc2V0OworICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIHVwZGF0ZU1hdHJpeCgpOworICAgICAgICAgICAgaWYgKG1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwID0gbVBhcmVudDsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByID0gbUF0dGFjaEluZm8ubVRtcEludmFsUmVjdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pblRvcDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heEJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHlMb2M7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5Ub3AgPSBtVG9wICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gbUJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHlMb2MgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5Ub3AgPSBtVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gbUJvdHRvbSArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHlMb2MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIuc2V0KDAsIHlMb2MsIG1SaWdodCAtIG1MZWZ0LCBtYXhCb3R0b20gLSBtaW5Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVG9wICs9IG9mZnNldDsKKyAgICAgICAgICAgIG1Cb3R0b20gKz0gb2Zmc2V0OworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTQ5NjcsOCArNTkzNCwzNiBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG51bWVyIG9mIHBpeGVscyB0byBvZmZzZXQgdGhlIHZpZXcgYnkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvZmZzZXRMZWZ0QW5kUmlnaHQoaW50IG9mZnNldCkgewotICAgICAgICBtTGVmdCArPSBvZmZzZXQ7Ci0gICAgICAgIG1SaWdodCArPSBvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgICAgICBpZiAobU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heFJpZ2h0OworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluTGVmdCA9IG1MZWZ0ICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmlnaHQgPSBtUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5MZWZ0ID0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSaWdodCA9IG1SaWdodCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCAwLCBtYXhSaWdodCAtIG1pbkxlZnQsIG1Cb3R0b20gLSBtVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxlZnQgKz0gb2Zmc2V0OworICAgICAgICAgICAgbVJpZ2h0ICs9IG9mZnNldDsKKworICAgICAgICAgICAgaWYgKCFtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC01MjEzLDcgKzYyMDgsOCBAQAogICAgICAgICAgICAgVmlld0RlYnVnLnRyYWNlKHRoaXMsIFZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUuSU5WQUxJREFURSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiAoRFJBV04gfCBIQVNfQk9VTkRTKSkgPT0gKERSQVdOIHwgSEFTX0JPVU5EUykpIHsKKyAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgKERSQVdOIHwgSEFTX0JPVU5EUykpID09IChEUkFXTiB8IEhBU19CT1VORFMpIHx8CisgICAgICAgICAgICAgICAgKG1Qcml2YXRlRmxhZ3MgJiBEUkFXSU5HX0NBQ0hFX1ZBTElEKSA9PSBEUkFXSU5HX0NBQ0hFX1ZBTElEKSB7CiAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5EUkFXSU5HX0NBQ0hFX1ZBTElEOwogICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwID0gbVBhcmVudDsKICAgICAgICAgICAgIGZpbmFsIEF0dGFjaEluZm8gYWkgPSBtQXR0YWNoSW5mbzsKQEAgLTUyNDQsNyArNjI0MCw4IEBACiAgICAgICAgICAgICBWaWV3RGVidWcudHJhY2UodGhpcywgVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZS5JTlZBTElEQVRFKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIChEUkFXTiB8IEhBU19CT1VORFMpKSA9PSAoRFJBV04gfCBIQVNfQk9VTkRTKSkgeworICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiAoRFJBV04gfCBIQVNfQk9VTkRTKSkgPT0gKERSQVdOIHwgSEFTX0JPVU5EUykgfHwKKyAgICAgICAgICAgICAgICAobVByaXZhdGVGbGFncyAmIERSQVdJTkdfQ0FDSEVfVkFMSUQpID09IERSQVdJTkdfQ0FDSEVfVkFMSUQpIHsKICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkRSQVdJTkdfQ0FDSEVfVkFMSUQ7CiAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OwogICAgICAgICAgICAgZmluYWwgQXR0YWNoSW5mbyBhaSA9IG1BdHRhY2hJbmZvOwpAQCAtNTI2NCwxMiArNjI2MSwzMSBAQAogICAgICAqIFVJIHRocmVhZC4gVG8gY2FsbCBmcm9tIGEgbm9uLVVJIHRocmVhZCwgY2FsbCB7QGxpbmsgI3Bvc3RJbnZhbGlkYXRlKCl9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIGludmFsaWRhdGUodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB3aGVyZSB0aGUgaW52YWxpZGF0ZSgpIHdvcmsgYWN0dWFsbHkgaGFwcGVucy4gQSBmdWxsIGludmFsaWRhdGUoKQorICAgICAqIGNhdXNlcyB0aGUgZHJhd2luZyBjYWNoZSB0byBiZSBpbnZhbGlkYXRlZCwgYnV0IHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoCisgICAgICogaW52YWxpZGF0ZUNhY2hlIHNldCB0byBmYWxzZSB0byBza2lwIHRoYXQgaW52YWxpZGF0aW9uIHN0ZXAgZm9yIGNhc2VzIHRoYXQgZG8gbm90CisgICAgICogbmVlZCBpdCAoZm9yIGV4YW1wbGUsIGEgY29tcG9uZW50IHRoYXQgcmVtYWlucyBhdCB0aGUgc2FtZSBkaW1lbnNpb25zIHdpdGggdGhlIHNhbWUKKyAgICAgKiBjb250ZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnZhbGlkYXRlQ2FjaGUgV2hldGhlciB0aGUgZHJhd2luZyBjYWNoZSBmb3IgdGhpcyB2aWV3IHNob3VsZCBiZSBpbnZhbGlkYXRlZCBhcworICAgICAqIHdlbGwuIFRoaXMgaXMgdXN1YWxseSB0cnVlIGZvciBhIGZ1bGwgaW52YWxpZGF0ZSwgYnV0IG1heSBiZSBzZXQgdG8gZmFsc2UgaWYgdGhlCisgICAgICogVmlldydzIGNvbnRlbnRzIG9yIGRpbWVuc2lvbnMgaGF2ZSBub3QgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW52YWxpZGF0ZShib29sZWFuIGludmFsaWRhdGVDYWNoZSkgewogICAgICAgICBpZiAoVmlld0RlYnVnLlRSQUNFX0hJRVJBUkNIWSkgewogICAgICAgICAgICAgVmlld0RlYnVnLnRyYWNlKHRoaXMsIFZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUuSU5WQUxJREFURSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiAoRFJBV04gfCBIQVNfQk9VTkRTKSkgPT0gKERSQVdOIHwgSEFTX0JPVU5EUykpIHsKLSAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkRSQVdOICYgfkRSQVdJTkdfQ0FDSEVfVkFMSUQ7CisgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIChEUkFXTiB8IEhBU19CT1VORFMpKSA9PSAoRFJBV04gfCBIQVNfQk9VTkRTKSB8fAorICAgICAgICAgICAgICAgIChpbnZhbGlkYXRlQ2FjaGUgJiYgKG1Qcml2YXRlRmxhZ3MgJiBEUkFXSU5HX0NBQ0hFX1ZBTElEKSA9PSBEUkFXSU5HX0NBQ0hFX1ZBTElEKSkgeworICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+RFJBV047CisgICAgICAgICAgICBpZiAoaW52YWxpZGF0ZUNhY2hlKSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+RFJBV0lOR19DQUNIRV9WQUxJRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CiAgICAgICAgICAgICBmaW5hbCBBdHRhY2hJbmZvIGFpID0gbUF0dGFjaEluZm87CiAgICAgICAgICAgICBpZiAocCAhPSBudWxsICYmIGFpICE9IG51bGwpIHsKQEAgLTYwMDcsOSArNzAyMyw4IEBACiAgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZQogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3SG9yaXpvbnRhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgc2Nyb2xsQmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdIb3Jpem9udGFsU2Nyb2xsQmFyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIHNjcm9sbEJhciwKKyAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CiAgICAgICAgIHNjcm9sbEJhci5zZXRCb3VuZHMobCwgdCwgciwgYik7CiAgICAgICAgIHNjcm9sbEJhci5kcmF3KGNhbnZhcyk7CiAgICAgfQpAQCAtNjAyOCw5ICs3MDQzLDggQEAKICAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LlNjcm9sbEJhckRyYXdhYmxlCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdWZXJ0aWNhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIHNjcm9sbEJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhd1ZlcnRpY2FsU2Nyb2xsQmFyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIHNjcm9sbEJhciwKKyAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CiAgICAgICAgIHNjcm9sbEJhci5zZXRCb3VuZHMobCwgdCwgciwgYik7CiAgICAgICAgIHNjcm9sbEJhci5kcmF3KGNhbnZhcyk7CiAgICAgfQpAQCAtNjM4NCw2ICs3Mzk4LDYzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogPHA+UmV0dXJucyBhIGRpc3BsYXkgbGlzdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRyYXcgdGhpcyB2aWV3IGFnYWluCisgICAgICogd2l0aG91dCBleGVjdXRpbmcgaXRzIGRyYXcgbWV0aG9kLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgRGlzcGxheUxpc3QgcmVhZHkgdG8gcmVwbGF5LCBvciBudWxsIGlmIGNhY2hpbmcgaXMgbm90IGVuYWJsZWQuCisgICAgICovCisgICAgRGlzcGxheUxpc3QgZ2V0RGlzcGxheUxpc3QoKSB7CisgICAgICAgIGlmICgobVZpZXdGbGFncyAmIFdJTExfTk9UX0NBQ0hFX0RSQVdJTkcpID09IFdJTExfTk9UX0NBQ0hFX0RSQVdJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUF0dGFjaEluZm8gPT0gbnVsbCB8fCBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVZpZXdGbGFncyAmIERSQVdJTkdfQ0FDSEVfRU5BQkxFRCkgPT0gRFJBV0lOR19DQUNIRV9FTkFCTEVEICYmCisgICAgICAgICAgICAgICAgKChtUHJpdmF0ZUZsYWdzICYgRFJBV0lOR19DQUNIRV9WQUxJRCkgPT0gMCB8fCBtRGlzcGxheUxpc3QgPT0gbnVsbCkpIHsKKworICAgICAgICAgICAgaWYgKG1EaXNwbGF5TGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURpc3BsYXlMaXN0LmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURpc3BsYXlMaXN0ID0gbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuY3JlYXRlRGlzcGxheUxpc3QoKTsKKworICAgICAgICAgICAgZmluYWwgSGFyZHdhcmVDYW52YXMgY2FudmFzID0gbURpc3BsYXlMaXN0LnN0YXJ0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IG1SaWdodCAtIG1MZWZ0OworICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBtQm90dG9tIC0gbVRvcDsKKworICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBjYW52YXMub25QcmVEcmF3KCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKKworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV04gfCBEUkFXSU5HX0NBQ0hFX1ZBTElEOworICAgIAorICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbGF5b3V0cyB3aXRoIG5vIGJhY2tncm91bmRzCisgICAgICAgICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgU0tJUF9EUkFXKSA9PSBTS0lQX0RSQVcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+RElSVFlfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2FudmFzLm9uUG9zdERyYXcoKTsKKworICAgICAgICAgICAgICAgIG1EaXNwbGF5TGlzdC5lbmQoKTsKKworICAgICAgICAgICAgICAgIGNhbnZhcy5kZXN0cm95KCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5TGlzdDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiA8cD5DYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA8Y29kZT5nZXREcmF3aW5nQ2FjaGUoZmFsc2UpPC9jb2RlPi48L3A+CiAgICAgICogCiAgICAgICogQHJldHVybiBBIG5vbi1zY2FsZWQgYml0bWFwIHJlcHJlc2VudGluZyB0aGlzIHZpZXcgb3IgbnVsbCBpZiBjYWNoZSBpcyBkaXNhYmxlZC4KQEAgLTY0MjgsOCArNzQ5OSw3IEBACiAgICAgICAgIGlmICgobVZpZXdGbGFncyAmIERSQVdJTkdfQ0FDSEVfRU5BQkxFRCkgPT0gRFJBV0lOR19DQUNIRV9FTkFCTEVEKSB7CiAgICAgICAgICAgICBidWlsZERyYXdpbmdDYWNoZShhdXRvU2NhbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdXRvU2NhbGUgPyAobURyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1EcmF3aW5nQ2FjaGUuZ2V0KCkpIDoKLSAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGF1dG9TY2FsZSA/IG1EcmF3aW5nQ2FjaGUgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NDQ0LDE1ICs3NTE0LDE3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveURyYXdpbmdDYWNoZSgpIHsKICAgICAgICAgaWYgKG1EcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1EcmF3aW5nQ2FjaGUuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIGJpdG1hcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICBtRHJhd2luZ0NhY2hlLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVW5zY2FsZWREcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgYml0bWFwLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CisgICAgICAgIGlmIChtRGlzcGxheUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbURpc3BsYXlMaXN0LmRlc3Ryb3koKTsKKyAgICAgICAgICAgIG1EaXNwbGF5TGlzdCA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTY1MTEsMTUgKzc1ODMsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBidWlsZERyYXdpbmdDYWNoZShib29sZWFuIGF1dG9TY2FsZSkgewogICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBEUkFXSU5HX0NBQ0hFX1ZBTElEKSA9PSAwIHx8IChhdXRvU2NhbGUgPwotICAgICAgICAgICAgICAgIChtRHJhd2luZ0NhY2hlID09IG51bGwgfHwgbURyYXdpbmdDYWNoZS5nZXQoKSA9PSBudWxsKSA6Ci0gICAgICAgICAgICAgICAgKG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9PSBudWxsIHx8IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKSA9PSBudWxsKSkpIHsKKyAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID09IG51bGwgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPT0gbnVsbCkpIHsKIAogICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5UUkFDRV9ISUVSQVJDSFkpIHsKICAgICAgICAgICAgICAgICBWaWV3RGVidWcudHJhY2UodGhpcywgVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZS5CVUlMRF9DQUNIRSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlRHJhd2luZykgewotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNjAwMDIsIGhhc2hDb2RlKCkpOwotICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgd2lkdGggPSBtUmlnaHQgLSBtTGVmdDsKICAgICAgICAgICAgIGludCBoZWlnaHQgPSBtQm90dG9tIC0gbVRvcDsKQEAgLTY1NDUsOCArNzYxMyw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2xlYW4gY2xlYXIgPSB0cnVlOwotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IGF1dG9TY2FsZSA/IChtRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbURyYXdpbmdDYWNoZS5nZXQoKSkgOgotICAgICAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpKTsKKyAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBhdXRvU2NhbGUgPyBtRHJhd2luZ0NhY2hlIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlOwogCiAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwgfHwgYml0bWFwLmdldFdpZHRoKCkgIT0gd2lkdGggfHwgYml0bWFwLmdldEhlaWdodCgpICE9IGhlaWdodCkgewogICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcgcXVhbGl0eTsKQEAgLTY1NzgsOSArNzY0NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAod2lkdGgsIGhlaWdodCwgcXVhbGl0eSk7CiAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC5zZXREZW5zaXR5KGdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPSBuZXcgU29mdFJlZmVyZW5jZTxCaXRtYXA+KGJpdG1hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID0gYml0bWFwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlID0gbmV3IFNvZnRSZWZlcmVuY2U8Qml0bWFwPihiaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlID0gYml0bWFwOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChvcGFxdWUgJiYgdHJhbnNsdWNlbnRXaW5kb3cpIGJpdG1hcC5zZXRIYXNBbHBoYShmYWxzZSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7CkBAIC02ODE5LDYgKzc4ODYsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiA8cD5JbmRpY2F0ZXMgd2hldGhlciB0aGlzIHZpZXcgaXMgYXR0YWNoZWQgdG8gYW4gaGFyZHdhcmUgYWNjZWxlcmF0ZWQKKyAgICAgKiB3aW5kb3cgb3Igbm90LjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5FdmVuIGlmIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaXQgZG9lcyBub3QgbWVhbiB0aGF0IGV2ZXJ5IGNhbGwKKyAgICAgKiB0byB7QGxpbmsgI2RyYXcoYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpfSB3aWxsIGJlIG1hZGUgd2l0aCBhbiBoYXJkd2FyZQorICAgICAqIGFjY2VsZXJhdGVkIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhc30uIEZvciBpbnN0YW5jZSwgaWYgdGhpcyB2aWV3CisgICAgICogaXMgZHJhd24gb250byBhbiBvZmZzY3JlbiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXB9IGFuZCBpdHMKKyAgICAgKiB3aW5kb3cgaXMgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsCisgICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2lzSGFyZHdhcmVBY2NlbGVyYXRlZCgpfSB3aWxsIGxpa2VseQorICAgICAqIHJldHVybiBmYWxzZSwgYW5kIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBpcyBhdHRhY2hlZCB0byBhIHdpbmRvdyBhbmQgdGhlIHdpbmRvdyBpcworICAgICAqICAgICAgICAgaGFyZHdhcmUgYWNjZWxlcmF0ZWQ7IGZhbHNlIGluIGFueSBvdGhlciBjYXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvICE9IG51bGwgJiYgbUF0dGFjaEluZm8ubUhhcmR3YXJlQWNjZWxlcmF0ZWQ7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIE1hbnVhbGx5IHJlbmRlciB0aGlzIHZpZXcgKGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuKSB0byB0aGUgZ2l2ZW4gQ2FudmFzLgogICAgICAqIFRoZSB2aWV3IG11c3QgaGF2ZSBhbHJlYWR5IGRvbmUgYSBmdWxsIGxheW91dCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcwogICAgICAqIGNhbGxlZC4gIFdoZW4gaW1wbGVtZW50aW5nIGEgdmlldywgZG8gbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kOyBpbnN0ZWFkLApAQCAtNjk0MywxNiArODAyOSwxNiBAQAogCiAgICAgICAgIGlmICh2ZXJ0aWNhbEVkZ2VzKSB7CiAgICAgICAgICAgICB0b3BGYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRUb3BGYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd1RvcCA9IHRvcEZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd1RvcCA9IHRvcEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgICAgICBib3R0b21GYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRCb3R0b21GYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd0JvdHRvbSA9IGJvdHRvbUZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd0JvdHRvbSA9IGJvdHRvbUZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaG9yaXpvbnRhbEVkZ2VzKSB7CiAgICAgICAgICAgICBsZWZ0RmFkZVN0cmVuZ3RoID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgZ2V0TGVmdEZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3TGVmdCA9IGxlZnRGYWRlU3RyZW5ndGggPj0gMC4wZjsKKyAgICAgICAgICAgIGRyYXdMZWZ0ID0gbGVmdEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgICAgICByaWdodEZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldFJpZ2h0RmFkaW5nRWRnZVN0cmVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGRyYXdSaWdodCA9IHJpZ2h0RmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3UmlnaHQgPSByaWdodEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgIH0KIAogICAgICAgICBzYXZlQ291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CkBAIC03MTU5LDE0ICs4MjQ1LDE5IEBACiAgICAgICoKICAgICAgKiBEZXJpdmVkIGNsYXNzZXMgd2l0aCBjaGlsZHJlbiBzaG91bGQgb3ZlcnJpZGUKICAgICAgKiBvbkxheW91dC4gSW4gdGhhdCBtZXRob2QsIHRoZXkgc2hvdWxkCi0gICAgICogY2FsbCBsYXlvdXQgb24gZWFjaCBvZiB0aGVpciB0aGVpciBjaGlsZHJlbi4KKyAgICAgKiBjYWxsIGxheW91dCBvbiBlYWNoIG9mIHRoZWlyIGNoaWxkcmVuLgogICAgICAqCiAgICAgICogQHBhcmFtIGwgTGVmdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gcGFyZW50CiAgICAgICogQHBhcmFtIHQgVG9wIHBvc2l0aW9uLCByZWxhdGl2ZSB0byBwYXJlbnQKICAgICAgKiBAcGFyYW0gciBSaWdodCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gcGFyZW50CiAgICAgICogQHBhcmFtIGIgQm90dG9tIHBvc2l0aW9uLCByZWxhdGl2ZSB0byBwYXJlbnQKICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGxheW91dChpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgb2xkTCA9IG1MZWZ0OworICAgICAgICBpbnQgb2xkVCA9IG1Ub3A7CisgICAgICAgIGludCBvbGRCID0gbUJvdHRvbTsKKyAgICAgICAgaW50IG9sZFIgPSBtUmlnaHQ7CiAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IHNldEZyYW1lKGwsIHQsIHIsIGIpOwogICAgICAgICBpZiAoY2hhbmdlZCB8fCAobVByaXZhdGVGbGFncyAmIExBWU9VVF9SRVFVSVJFRCkgPT0gTEFZT1VUX1JFUVVJUkVEKSB7CiAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLlRSQUNFX0hJRVJBUkNIWSkgewpAQCAtNzE3NSw2ICs4MjY2LDE1IEBACiAKICAgICAgICAgICAgIG9uTGF5b3V0KGNoYW5nZWQsIGwsIHQsIHIsIGIpOwogICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+TEFZT1VUX1JFUVVJUkVEOworCisgICAgICAgICAgICBpZiAobU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8T25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzQ29weSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+KSBtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtTGlzdGVuZXJzID0gbGlzdGVuZXJzQ29weS5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNDb3B5LmdldChpKS5vbkxheW91dENoYW5nZSh0aGlzLCBsLCByLCB0LCBiLCBvbGRMLCBvbGRULCBvbGRSLCBvbGRCKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+Rk9SQ0VfTEFZT1VUOwogICAgIH0KQEAgLTcxODUsNyArODI4NSw3IEBACiAgICAgICoKICAgICAgKiBEZXJpdmVkIGNsYXNzZXMgd2l0aCBjaGlsZHJlbiBzaG91bGQgb3ZlcnJpZGUKICAgICAgKiB0aGlzIG1ldGhvZCBhbmQgY2FsbCBsYXlvdXQgb24gZWFjaCBvZgotICAgICAqIHRoZWlyIHRoZWlyIGNoaWxkcmVuLgorICAgICAqIHRoZWlyIGNoaWxkcmVuLgogICAgICAqIEBwYXJhbSBjaGFuZ2VkIFRoaXMgaXMgYSBuZXcgc2l6ZSBvciBwb3NpdGlvbiBmb3IgdGhpcyB2aWV3CiAgICAgICogQHBhcmFtIGxlZnQgTGVmdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gcGFyZW50CiAgICAgICogQHBhcmFtIHRvcCBUb3AgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHBhcmVudApAQCAtNzQzOSwxOCArODUzOSwxMyBAQAogCiAgICAgICAgIGludCBwcml2YXRlRmxhZ3MgPSBtUHJpdmF0ZUZsYWdzOwogCi0gICAgICAgIGludCB2aWV3U3RhdGVJbmRleCA9ICgoKHByaXZhdGVGbGFncyAmIFBSRVNTRUQpICE9IDApID8gMSA6IDApOwotCi0gICAgICAgIHZpZXdTdGF0ZUluZGV4ID0gKHZpZXdTdGF0ZUluZGV4IDw8IDEpCi0gICAgICAgICAgICAgICAgKyAoKChtVmlld0ZsYWdzICYgRU5BQkxFRF9NQVNLKSA9PSBFTkFCTEVEKSA/IDEgOiAwKTsKLQotICAgICAgICB2aWV3U3RhdGVJbmRleCA9ICh2aWV3U3RhdGVJbmRleCA8PCAxKSArIChpc0ZvY3VzZWQoKSA/IDEgOiAwKTsKLQotICAgICAgICB2aWV3U3RhdGVJbmRleCA9ICh2aWV3U3RhdGVJbmRleCA8PCAxKQotICAgICAgICAgICAgICAgICsgKCgocHJpdmF0ZUZsYWdzICYgU0VMRUNURUQpICE9IDApID8gMSA6IDApOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzV2luZG93Rm9jdXMgPSBoYXNXaW5kb3dGb2N1cygpOwotICAgICAgICB2aWV3U3RhdGVJbmRleCA9ICh2aWV3U3RhdGVJbmRleCA8PCAxKSArIChoYXNXaW5kb3dGb2N1cyA/IDEgOiAwKTsKKyAgICAgICAgaW50IHZpZXdTdGF0ZUluZGV4ID0gMDsKKyAgICAgICAgaWYgKChwcml2YXRlRmxhZ3MgJiBQUkVTU0VEKSAhPSAwKSB2aWV3U3RhdGVJbmRleCB8PSBWSUVXX1NUQVRFX1BSRVNTRUQ7CisgICAgICAgIGlmICgobVZpZXdGbGFncyAmIEVOQUJMRURfTUFTSykgPT0gRU5BQkxFRCkgdmlld1N0YXRlSW5kZXggfD0gVklFV19TVEFURV9FTkFCTEVEOworICAgICAgICBpZiAoaXNGb2N1c2VkKCkpIHZpZXdTdGF0ZUluZGV4IHw9IFZJRVdfU1RBVEVfRk9DVVNFRDsKKyAgICAgICAgaWYgKChwcml2YXRlRmxhZ3MgJiBTRUxFQ1RFRCkgIT0gMCkgdmlld1N0YXRlSW5kZXggfD0gVklFV19TVEFURV9TRUxFQ1RFRDsKKyAgICAgICAgaWYgKGhhc1dpbmRvd0ZvY3VzKCkpIHZpZXdTdGF0ZUluZGV4IHw9IFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQ7CisgICAgICAgIGlmICgocHJpdmF0ZUZsYWdzICYgQUNUSVZBVEVEKSAhPSAwKSB2aWV3U3RhdGVJbmRleCB8PSBWSUVXX1NUQVRFX0FDVElWQVRFRDsKIAogICAgICAgICBkcmF3YWJsZVN0YXRlID0gVklFV19TVEFURV9TRVRTW3ZpZXdTdGF0ZUluZGV4XTsKIApAQCAtNzQ2Miw3ICs4NTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIGVuPSIgKyAoKG1WaWV3RmxhZ3MgJiBFTkFCTEVEX01BU0spID09IEVOQUJMRUQpCiAgICAgICAgICAgICAgICAgICAgICsgIiBmbz0iICsgaGFzRm9jdXMoKQogICAgICAgICAgICAgICAgICAgICArICIgc2w9IiArICgocHJpdmF0ZUZsYWdzICYgU0VMRUNURUQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICsgIiB3Zj0iICsgaGFzV2luZG93Rm9jdXMKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdmPSIgKyBoYXNXaW5kb3dGb2N1cygpCiAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIEFycmF5cy50b1N0cmluZyhkcmF3YWJsZVN0YXRlKSk7CiAgICAgICAgIH0KIApAQCAtNzc3Niw2ICs4ODcxLDQ4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgYWN0aXZhdGVkIHN0YXRlIG9mIHRoaXMgdmlldy4gQSB2aWV3IGNhbiBiZSBhY3RpdmF0ZWQgb3Igbm90LgorICAgICAqIE5vdGUgdGhhdCBhY3RpdmF0aW9uIGlzIG5vdCB0aGUgc2FtZSBhcyBzZWxlY3Rpb24uICBTZWxlY3Rpb24gaXMKKyAgICAgKiBhIHRyYW5zaWVudCBwcm9wZXJ0eSwgcmVwcmVzZW50aW5nIHRoZSB2aWV3IChoaWVyYXJjaHkpIHRoZSB1c2VyIGlzCisgICAgICogY3VycmVudGx5IGludGVyYWN0aW5nIHdpdGguICBBY3RpdmF0aW9uIGlzIGEgbG9uZ2VyLXRlcm0gc3RhdGUgdGhhdCB0aGUKKyAgICAgKiB1c2VyIGNhbiBtb3ZlIHZpZXdzIGluIGFuZCBvdXQgb2YuICBGb3IgZXhhbXBsZSwgaW4gYSBsaXN0IHZpZXcgd2l0aAorICAgICAqIHNpbmdsZSBvciBtdWx0aXBsZSBzZWxlY3Rpb24gZW5hYmxlZCwgdGhlIHZpZXdzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbgorICAgICAqIHNldCBhcmUgYWN0aXZhdGVkLiAgKFVtLCB5ZWFoLCB3ZSBhcmUgZGVlcGx5IHNvcnJ5IGFib3V0IHRoZSB0ZXJtaW5vbG9neQorICAgICAqIGhlcmUuKSAgVGhlIGFjdGl2YXRlZCBzdGF0ZSBpcyBwcm9wYWdhdGVkIGRvd24gdG8gY2hpbGRyZW4gb2YgdGhlIHZpZXcgaXQKKyAgICAgKiBpcyBzZXQgb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZhdGVkIHRydWUgaWYgdGhlIHZpZXcgbXVzdCBiZSBhY3RpdmF0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2YXRlZChib29sZWFuIGFjdGl2YXRlZCkgeworICAgICAgICBpZiAoKChtUHJpdmF0ZUZsYWdzICYgQUNUSVZBVEVEKSAhPSAwKSAhPSBhY3RpdmF0ZWQpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgPSAobVByaXZhdGVGbGFncyAmIH5BQ1RJVkFURUQpIHwgKGFjdGl2YXRlZCA/IEFDVElWQVRFRCA6IDApOworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKKyAgICAgICAgICAgIGRpc3BhdGNoU2V0QWN0aXZhdGVkKGFjdGl2YXRlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaCBzZXRBY3RpdmF0ZWQgdG8gYWxsIG9mIHRoaXMgVmlldydzIGNoaWxkcmVuLgorICAgICAqCisgICAgICogQHNlZSAjc2V0QWN0aXZhdGVkKGJvb2xlYW4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZhdGVkIFRoZSBuZXcgYWN0aXZhdGVkIHN0YXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hTZXRBY3RpdmF0ZWQoYm9vbGVhbiBhY3RpdmF0ZWQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGFjdGl2YXRpb24gc3RhdGUgb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2aWV3IGlzIGFjdGl2YXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7CisgICAgICAgIHJldHVybiAobVByaXZhdGVGbGFncyAmIEFDVElWQVRFRCkgIT0gMDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBWaWV3VHJlZU9ic2VydmVyIGZvciB0aGlzIHZpZXcncyBoaWVyYXJjaHkuIFRoZSB2aWV3IHRyZWUKICAgICAgKiBvYnNlcnZlciBjYW4gYmUgdXNlZCB0byBnZXQgbm90aWZpY2F0aW9ucyB3aGVuIGdsb2JhbCBldmVudHMsIGxpa2UKICAgICAgKiBsYXlvdXQsIGhhcHBlbi4KQEAgLTg2OTEsMTMgKzk4MjgsMjE1IEBACiAgICAgICAgIGlmIChtQXR0YWNoSW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9WSUVXX1NFVFRJTkcpID09IDAKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gU2ltcGxpZmlhYmxlSWZTdGF0ZW1lbnQKKyAgICAgICAgaWYgKChmbGFncyAmIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX1ZJRVdfU0VUVElORykgPT0gMAogICAgICAgICAgICAgICAgICYmICFpc0hhcHRpY0ZlZWRiYWNrRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvLm1Sb290Q2FsbGJhY2tzLnBlcmZvcm1IYXB0aWNGZWVkYmFjaygKLSAgICAgICAgICAgICAgICBmZWVkYmFja0NvbnN0YW50LAotICAgICAgICAgICAgICAgIChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CisgICAgICAgIHJldHVybiBtQXR0YWNoSW5mby5tUm9vdENhbGxiYWNrcy5wZXJmb3JtSGFwdGljRmVlZGJhY2soZmVlZGJhY2tDb25zdGFudCwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogISEhIFRPRE86IHJlYWwgZG9jcworICAgICAqCisgICAgICogVGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gbWFrZXMgdGhlIHRodW1ibmFpbCB0aGUgc2FtZSBzaXplIGFuZCBhcHBlYXJhbmNlCisgICAgICogYXMgdGhlIHZpZXcgaXRzZWxmLCBhbmQgcG9zaXRpb25zIGl0IHdpdGggaXRzIGNlbnRlciBhdCB0aGUgdG91Y2ggcG9pbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEcmFnVGh1bWJuYWlsQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxWaWV3PiBtVmlldzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgdGh1bWJuYWlsIGJ1aWxkZXIgb2JqZWN0IGZvciB1c2Ugd2l0aCB0aGUgZ2l2ZW4gdmlldy4KKyAgICAgICAgICogQHBhcmFtIHZpZXcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEcmFnVGh1bWJuYWlsQnVpbGRlcihWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIG1WaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4odmlldyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvdmlkZSB0aGUgZHJhZ2dhYmxlLXRodW1ibmFpbCBtZXRyaWNzIGZvciB0aGUgb3BlcmF0aW9uOiB0aGUgZGltZW5zaW9ucyBvZgorICAgICAgICAgKiB0aGUgdGh1bWJuYWlsIGltYWdlIGl0c2VsZiwgYW5kIHRoZSBwb2ludCB3aXRoaW4gdGhhdCB0aHVtYm5haWwgdGhhdCBzaG91bGQKKyAgICAgICAgICogYmUgY2VudGVyZWQgdW5kZXIgdGhlIHRvdWNoIGxvY2F0aW9uIHdoaWxlIGRyYWdnaW5nLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgdGh1bWJuYWlsIHRvIGJlIHRoZQorICAgICAgICAgKiBzYW1lIGFzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBWaWV3IGl0c2VsZiBhbmQgY2VudGVycyB0aGUgdGh1bWJuYWlsIHVuZGVyCisgICAgICAgICAqIHRoZSB0b3VjaCBwb2ludC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRodW1ibmFpbFNpemUgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzZXQgdGhlIHtAY29kZSB4fSBtZW1iZXIgb2YgdGhpcworICAgICAgICAgKiAgICAgICAgcGFyYW1ldGVyIHRvIHRoZSBkZXNpcmVkIHRodW1ibmFpbCB3aWR0aCwgYW5kIHRoZSB7QGNvZGUgeX0gbWVtYmVyIHRvCisgICAgICAgICAqICAgICAgICB0aGUgZGVzaXJlZCBoZWlnaHQuCisgICAgICAgICAqIEBwYXJhbSB0aHVtYm5haWxUb3VjaFBvaW50IFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc2V0IHRoaXMgcG9pbnQgdG8gYmUgdGhlCisgICAgICAgICAqICAgICAgICBsb2NhdGlvbiB3aXRoaW4gdGhlIHRodW1ibmFpbCB0aGF0IHNob3VsZCB0cmFjayBkaXJlY3RseSB1bmRlcm5lYXRoCisgICAgICAgICAqICAgICAgICB0aGUgdG91Y2ggcG9pbnQgb24gdGhlIHNjcmVlbiBkdXJpbmcgYSBkcmFnLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlVGh1bWJuYWlsTWV0cmljcyhQb2ludCB0aHVtYm5haWxTaXplLCBQb2ludCB0aHVtYm5haWxUb3VjaFBvaW50KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBtVmlldy5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHVtYm5haWxTaXplLnNldCh2aWV3LmdldFdpZHRoKCksIHZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIHRodW1ibmFpbFRvdWNoUG9pbnQuc2V0KHRodW1ibmFpbFNpemUueCAvIDIsIHRodW1ibmFpbFNpemUueSAvIDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShWaWV3LlZJRVdfTE9HX1RBRywgIkFza2VkIGZvciBkcmFnIHRodW1iIG1ldHJpY3MgYnV0IG5vIHZpZXciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEcmF3IHRoZSB0aHVtYm5haWwgaW1hZ2UgZm9yIHRoZSB1cGNvbWluZyBkcmFnLiAgVGhlIHRodW1ibmFpbCBjYW52YXMgd2FzCisgICAgICAgICAqIGNyZWF0ZWQgd2l0aCB0aGUgZGltZW5zaW9ucyBzdXBwbGllZCBieSB0aGUgb25Qcm92aWRlVGh1bWJuYWlsTWV0cmljcygpCisgICAgICAgICAqIGNhbGxiYWNrLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2FudmFzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdUaHVtYm5haWwoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gbVZpZXcuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlldy5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5lKFZpZXcuVklFV19MT0dfVEFHLCAiQXNrZWQgdG8gZHJhdyBkcmFnIHRodW1iIGJ1dCBubyB2aWV3Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcmFnIGFuZCBkcm9wLiAgQXBwIGNhbGxzIHN0YXJ0RHJhZygpLCB0aGVuIGNhbGxiYWNrcyB0byB0aGUgdGh1bWJuYWlsIGJ1aWxkZXIncworICAgICAqIG9uUHJvdmlkZVRodW1ibmFpbE1ldHJpY3MoKSBhbmQgb25EcmF3VGh1bWJuYWlsKCkgbWV0aG9kcyBoYXBwZW4sIHRoZW4gdGhlIGRyYWcKKyAgICAgKiBvcGVyYXRpb24gaXMgaGFuZGVkIG92ZXIgdG8gdGhlIE9TLgorICAgICAqICEhISBUT0RPOiByZWFsIGRvY3MKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzdGFydERyYWcoQ2xpcERhdGEgZGF0YSwgRHJhZ1RodW1ibmFpbEJ1aWxkZXIgdGh1bWJCdWlsZGVyLAorICAgICAgICAgICAgYm9vbGVhbiBteVdpbmRvd09ubHkpIHsKKyAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19EUkFHKSB7CisgICAgICAgICAgICBMb2cuZChWSUVXX0xPR19UQUcsICJzdGFydERyYWc6IGRhdGE9IiArIGRhdGEgKyAiIGxvY2FsPSIgKyBteVdpbmRvd09ubHkpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gb2theSA9IGZhbHNlOworCisgICAgICAgIFBvaW50IHRodW1iU2l6ZSA9IG5ldyBQb2ludCgpOworICAgICAgICBQb2ludCB0aHVtYlRvdWNoUG9pbnQgPSBuZXcgUG9pbnQoKTsKKyAgICAgICAgdGh1bWJCdWlsZGVyLm9uUHJvdmlkZVRodW1ibmFpbE1ldHJpY3ModGh1bWJTaXplLCB0aHVtYlRvdWNoUG9pbnQpOworCisgICAgICAgIGlmICgodGh1bWJTaXplLnggPCAwKSB8fCAodGh1bWJTaXplLnkgPCAwKSB8fAorICAgICAgICAgICAgICAgICh0aHVtYlRvdWNoUG9pbnQueCA8IDApIHx8ICh0aHVtYlRvdWNoUG9pbnQueSA8IDApKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEcmFnIHRodW1iIGRpbWVuc2lvbnMgbXVzdCBub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIFN1cmZhY2Ugc3VyZmFjZSA9IG5ldyBTdXJmYWNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJQmluZGVyIHRva2VuID0gbUF0dGFjaEluZm8ubVNlc3Npb24ucHJlcGFyZURyYWcobUF0dGFjaEluZm8ubVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgbXlXaW5kb3dPbmx5LCBtVGh1bWJuYWlsV2lkdGgsIG1UaHVtYm5haWxIZWlnaHQsIHN1cmZhY2UpOworICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19EUkFHKSBMb2cuZChWSUVXX0xPR19UQUcsICJwcmVwYXJlRHJhZyByZXR1cm5lZCB0b2tlbj0iICsgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIHN1cmZhY2U9IiArIHN1cmZhY2UpOworICAgICAgICAgICAgaWYgKHRva2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gc3VyZmFjZS5sb2NrQ2FudmFzKG51bGwpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRodW1iQnVpbGRlci5vbkRyYXdUaHVtYm5haWwoY2FudmFzKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLnVubG9ja0NhbnZhc0FuZFBvc3QoY2FudmFzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZXB1cnBvc2UgJ3RodW1iU2l6ZScgZm9yIHRoZSBsYXN0IHRvdWNoIHBvaW50CisgICAgICAgICAgICAgICAgZ2V0Vmlld1Jvb3QoKS5nZXRMYXN0VG91Y2hQb2ludCh0aHVtYlNpemUpOworCisgICAgICAgICAgICAgICAgb2theSA9IG1BdHRhY2hJbmZvLm1TZXNzaW9uLnBlcmZvcm1EcmFnKG1BdHRhY2hJbmZvLm1XaW5kb3csIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSB0aHVtYlNpemUueCwgKGZsb2F0KSB0aHVtYlNpemUueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgdGh1bWJUb3VjaFBvaW50LngsIChmbG9hdCkgdGh1bWJUb3VjaFBvaW50LnksIGRhdGEpOworICAgICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfRFJBRykgTG9nLmQoVklFV19MT0dfVEFHLCAicGVyZm9ybURyYWcgcmV0dXJuZWQgIiArIG9rYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVklFV19MT0dfVEFHLCAiVW5hYmxlIHRvIGluaXRpYXRlIGRyYWciLCBlKTsKKyAgICAgICAgICAgIHN1cmZhY2UuZGVzdHJveSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9rYXk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1lYXN1cmVUaHVtYm5haWwoKSB7CisgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfk1FQVNVUkVEX0RJTUVOU0lPTl9TRVQ7CisKKyAgICAgICAgb25NZWFzdXJlRHJhZ1RodW1ibmFpbCgpOworCisgICAgICAgIC8vIGZsYWcgbm90IHNldCwgc2V0RHJhZ1RodW1ibmFpbERpbWVuc2lvbigpIHdhcyBub3QgaW52b2tlZCwgd2UgcmFpc2UKKyAgICAgICAgLy8gYW4gZXhjZXB0aW9uIHRvIHdhcm4gdGhlIGRldmVsb3BlcgorICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBNRUFTVVJFRF9ESU1FTlNJT05fU0VUKSAhPSBNRUFTVVJFRF9ESU1FTlNJT05fU0VUKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbk1lYXN1cmVEcmFnVGh1bWJuYWlsKCkgZGlkIG5vdCBzZXQgdGhlIgorICAgICAgICAgICAgICAgICAgICArICIgbWVhc3VyZWQgZGltZW5zaW9uIGJ5IGNhbGxpbmcgc2V0RHJhZ1RodW1ibmFpbERpbWVuc2lvbigpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgIExvZy5kKFZJRVdfTE9HX1RBRywgIkRyYWcgdGh1bWIgbWVhc3VyZWQ6IHc9IiArIG1UaHVtYm5haWxXaWR0aAorICAgICAgICAgICAgICAgICAgICArICIgaD0iICsgbVRodW1ibmFpbEhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgVmlldyBtdXN0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSBvbk1lYXN1cmVEcmFnVGh1bWJuYWlsKCkgaW4gb3JkZXIgdG8KKyAgICAgKiBzcGVjaWZ5IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBkcmFnIHRodW1ibmFpbCBpbWFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgZGVzaXJlZCB0aHVtYm5haWwgd2lkdGguCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgZGVzaXJlZCB0aHVtYm5haWwgaGVpZ2h0LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldERyYWdUaHVtYm5haWxEaW1lbnNpb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gTUVBU1VSRURfRElNRU5TSU9OX1NFVDsKKyAgICAgICAgbVRodW1ibmFpbFdpZHRoID0gd2lkdGg7CisgICAgICAgIG1UaHVtYm5haWxIZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc3BlY2lmaWVzIGEgZHJhZyB0aHVtYm5haWwgdGhhdCBtYXRjaGVzIHRoZQorICAgICAqIFZpZXcncyBjdXJyZW50IHNpemUgYW5kIGFwcGVhcmFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlRHJhZ1RodW1ibmFpbCgpIHsKKyAgICAgICAgc2V0RHJhZ1RodW1ibmFpbERpbWVuc2lvbihnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCBkcmF3cyB0aGUgY3VycmVudCBWaWV3IGFwcGVhcmFuY2UgYXMgdGhlIHRodW1ibmFpbAorICAgICAqIEBwYXJhbSBjYW52YXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdEcmFnVGh1bWJuYWlsKENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgZHJhdyhjYW52YXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyYWctYW5kLWRyb3AgZXZlbnQgZGlzcGF0Y2guICBUaGUgZXZlbnQuZ2V0QWN0aW9uKCkgdmVyYiBpcyBvbmUgb2YgdGhlIERyYWdFdmVudAorICAgICAqIGNvbnN0YW50cyBEUkFHX1NUQVJURURfRVZFTlQsIERSQUdfRVZFTlQsIERST1BfRVZFTlQsIGFuZCBEUkFHX0VOREVEX0VWRU5ULgorICAgICAqCisgICAgICogRm9yIERSQUdfU1RBUlRFRF9FVkVOVCwgZXZlbnQuZ2V0Q2xpcERlc2NyaXB0aW9uKCkgZGVzY3JpYmVzIHRoZSBjb250ZW50CisgICAgICogYmVpbmcgZHJhZ2dlZC4gIG9uRHJhZ0V2ZW50KCkgc2hvdWxkIHJldHVybiAndHJ1ZScgaWYgdGhlIHZpZXcgY2FuIGhhbmRsZQorICAgICAqIGEgZHJvcCBvZiB0aGF0IGNvbnRlbnQuICBBIHZpZXcgdGhhdCByZXR1cm5zICdmYWxzZScgaGVyZSB3aWxsIHJlY2VpdmUgbm8KKyAgICAgKiBmdXJ0aGVyIGNhbGxzIHRvIG9uRHJhZ0V2ZW50KCkgYWJvdXQgdGhlIGRyYWcvZHJvcCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBGb3IgRFJBR19FTlRFUkVELCBldmVudC5nZXRDbGlwRGVzY3JpcHRpb24oKSBkZXNjcmliZXMgdGhlIGNvbnRlbnQgYmVpbmcKKyAgICAgKiBkcmFnZ2VkLiAgVGhpcyB3aWxsIGJlIHRoZSBzYW1lIGNvbnRlbnQgZGVzY3JpcHRpb24gcGFzc2VkIGluIHRoZQorICAgICAqIERSQUdfU1RBUlRFRF9FVkVOVCBpbnZvY2F0aW9uLgorICAgICAqCisgICAgICogRm9yIERSQUdfRVhJVEVELCBldmVudC5nZXRDbGlwRGVzY3JpcHRpb24oKSBkZXNjcmliZXMgdGhlIGNvbnRlbnQgYmVpbmcKKyAgICAgKiBkcmFnZ2VkLiAgVGhpcyB3aWxsIGJlIHRoZSBzYW1lIGNvbnRlbnQgZGVzY3JpcHRpb24gcGFzc2VkIGluIHRoZQorICAgICAqIERSQUdfU1RBUlRFRF9FVkVOVCBpbnZvY2F0aW9uLiAgVGhlIHZpZXcgc2hvdWxkIHJldHVybiB0byBpdHMgYXBwcm9yaWF0ZQorICAgICAqIGRyYWctYWNjZXB0YW5jZSB2aXN1YWwgc3RhdGUuCisgICAgICoKKyAgICAgKiBGb3IgRFJBR19MT0NBVElPTl9FVkVOVCwgZXZlbnQuZ2V0WCgpIGFuZCBldmVudC5nZXRZKCkgZ2l2ZSB0aGUgbG9jYXRpb24gaW4gVmlldworICAgICAqIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGRyYWcgcG9pbnQuICBUaGUgdmlldyBtdXN0IHJldHVybiAndHJ1ZScgaWYgaXQKKyAgICAgKiBjYW4gYWNjZXB0IGEgZHJvcCBvZiB0aGUgY3VycmVudCBkcmFnIGNvbnRlbnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEZvciBEUk9QX0VWRU5ULCBldmVudC5nZXRYKCkgYW5kIGV2ZW50LmdldFkoKSBnaXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZHJvcAorICAgICAqIHdpdGhpbiB0aGUgdmlldzsgYWxzbywgZXZlbnQuZ2V0Q2xpcERhdGEoKSByZXR1cm5zIHRoZSBmdWxsIGRhdGEgcGF5bG9hZAorICAgICAqIGJlaW5nIGRyb3BwZWQuICBUaGUgdmlldyBzaG91bGQgcmV0dXJuICd0cnVlJyBpZiBpdCBjb25zdW1lZCB0aGUgZHJvcHBlZAorICAgICAqIGNvbnRlbnQsICdmYWxzZScgaWYgaXQgZGlkIG5vdC4KKyAgICAgKgorICAgICAqIEZvciBEUkFHX0VOREVEX0VWRU5ULCB0aGUgJ2V2ZW50JyBhcmd1bWVudCBtYXkgYmUgbnVsbC4gIFRoZSB2aWV3IHNob3VsZCByZXR1cm4KKyAgICAgKiB0byBpdHMgbm9ybWFsIHZpc3VhbCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkRyYWdFdmVudChEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpZXdzIHR5cGljYWxseSBkb24ndCBuZWVkIHRvIG92ZXJyaWRlIGRpc3BhdGNoRHJhZ0V2ZW50KCk7IGl0IGp1c3QgY2FsbHMKKyAgICAgKiBvbkRyYWdFdmVudCh3aGF0LCBldmVudCkgYW5kIHBhc3NlcyB0aGUgcmVzdWx0IHVwIGFwcHJvcHJpYXRlbHkuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaERyYWdFdmVudChEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgcmV0dXJuIG9uRHJhZ0V2ZW50KGV2ZW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3NjgsMzEgKzEwMTA3LDYgQEAKICAgICAgICAgICAgICAgICBWaWV3Q29uZmlndXJhdGlvbi5nZXRMb25nUHJlc3NUaW1lb3V0KCkgLSBkZWxheU9mZnNldCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc3RhdGVTZXRVbmlvbihmaW5hbCBpbnRbXSBzdGF0ZVNldDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnRbXSBzdGF0ZVNldDIpIHsKLSAgICAgICAgZmluYWwgaW50IHN0YXRlU2V0MUxlbmd0aCA9IHN0YXRlU2V0MS5sZW5ndGg7Ci0gICAgICAgIGZpbmFsIGludCBzdGF0ZVNldDJMZW5ndGggPSBzdGF0ZVNldDIubGVuZ3RoOwotICAgICAgICBmaW5hbCBpbnRbXSBuZXdTZXQgPSBuZXcgaW50W3N0YXRlU2V0MUxlbmd0aCArIHN0YXRlU2V0Mkxlbmd0aF07Ci0gICAgICAgIGludCBrID0gMDsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIC8vIFRoaXMgaXMgYSBtZXJnZSBvZiB0aGUgdHdvIGlucHV0IHN0YXRlIHNldHMgYW5kIGFzc3VtZXMgdGhhdCB0aGUKLSAgICAgICAgLy8gaW5wdXQgc2V0cyBhcmUgc29ydGVkIGJ5IHRoZSBvcmRlciBpbXBvc2VkIGJ5IFZpZXdEcmF3YWJsZVN0YXRlcy4KLSAgICAgICAgZm9yIChpbnQgdmlld1N0YXRlIDogUi5zdHlsZWFibGUuVmlld0RyYXdhYmxlU3RhdGVzKSB7Ci0gICAgICAgICAgICBpZiAoaSA8IHN0YXRlU2V0MUxlbmd0aCAmJiBzdGF0ZVNldDFbaV0gPT0gdmlld1N0YXRlKSB7Ci0gICAgICAgICAgICAgICAgbmV3U2V0W2srK10gPSB2aWV3U3RhdGU7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChqIDwgc3RhdGVTZXQyTGVuZ3RoICYmIHN0YXRlU2V0MltqXSA9PSB2aWV3U3RhdGUpIHsKLSAgICAgICAgICAgICAgICBuZXdTZXRbaysrXSA9IHZpZXdTdGF0ZTsKLSAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoayA+IDEpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQobmV3U2V0W2sgLSAxXSA+IG5ld1NldFtrIC0gMl0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdTZXQ7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogSW5mbGF0ZSBhIHZpZXcgZnJvbSBhbiBYTUwgcmVzb3VyY2UuICBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCB3cmFwcyB0aGUge0BsaW5rCiAgICAgICogTGF5b3V0SW5mbGF0ZXJ9IGNsYXNzLCB3aGljaCBwcm92aWRlcyBhIGZ1bGwgcmFuZ2Ugb2Ygb3B0aW9ucyBmb3IgdmlldyBpbmZsYXRpb24uCkBAIC04ODA5LDEyOCArMTAxMjMsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNjcm9sbCB0aGUgdmlldyB3aXRoIHN0YW5kYXJkIGJlaGF2aW9yIGZvciBzY3JvbGxpbmcgYmV5b25kIHRoZSBub3JtYWwKLSAgICAgKiBjb250ZW50IGJvdW5kYXJpZXMuIFZpZXdzIHRoYXQgY2FsbCB0aGlzIG1ldGhvZCBzaG91bGQgb3ZlcnJpZGUKLSAgICAgKiB7QGxpbmsgI29uT3ZlclNjcm9sbGVkKGludCwgaW50LCBib29sZWFuLCBib29sZWFuKX0gdG8gcmVzcG9uZCB0byB0aGUKLSAgICAgKiByZXN1bHRzIG9mIGFuIG92ZXItc2Nyb2xsIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIFZpZXdzIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGFueSB0b3VjaCBvciBmbGluZy1iYXNlZCBzY3JvbGxpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVsdGFYIENoYW5nZSBpbiBYIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBkZWx0YVkgQ2hhbmdlIGluIFkgaW4gcGl4ZWxzCi0gICAgICogQHBhcmFtIHNjcm9sbFggQ3VycmVudCBYIHNjcm9sbCB2YWx1ZSBpbiBwaXhlbHMgYmVmb3JlIGFwcGx5aW5nIGRlbHRhWAotICAgICAqIEBwYXJhbSBzY3JvbGxZIEN1cnJlbnQgWSBzY3JvbGwgdmFsdWUgaW4gcGl4ZWxzIGJlZm9yZSBhcHBseWluZyBkZWx0YVkKLSAgICAgKiBAcGFyYW0gc2Nyb2xsUmFuZ2VYIE1heGltdW0gY29udGVudCBzY3JvbGwgcmFuZ2UgYWxvbmcgdGhlIFggYXhpcwotICAgICAqIEBwYXJhbSBzY3JvbGxSYW5nZVkgTWF4aW11bSBjb250ZW50IHNjcm9sbCByYW5nZSBhbG9uZyB0aGUgWSBheGlzCi0gICAgICogQHBhcmFtIG1heE92ZXJTY3JvbGxYIE51bWJlciBvZiBwaXhlbHMgdG8gb3ZlcnNjcm9sbCBieSBpbiBlaXRoZXIgZGlyZWN0aW9uCi0gICAgICogICAgICAgICAgYWxvbmcgdGhlIFggYXhpcy4KLSAgICAgKiBAcGFyYW0gbWF4T3ZlclNjcm9sbFkgTnVtYmVyIG9mIHBpeGVscyB0byBvdmVyc2Nyb2xsIGJ5IGluIGVpdGhlciBkaXJlY3Rpb24KLSAgICAgKiAgICAgICAgICBhbG9uZyB0aGUgWSBheGlzLgotICAgICAqIEBwYXJhbSBpc1RvdWNoRXZlbnQgdHJ1ZSBpZiB0aGlzIHNjcm9sbCBvcGVyYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBhIHRvdWNoIGV2ZW50LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzY3JvbGxpbmcgd2FzIGNsYW1wZWQgdG8gYW4gb3Zlci1zY3JvbGwgYm91bmRhcnkgYWxvbmcgZWl0aGVyCi0gICAgICogICAgICAgICAgYXhpcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIG92ZXJTY3JvbGxCeShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZLAotICAgICAgICAgICAgaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgaW50IHNjcm9sbFJhbmdlWCwgaW50IHNjcm9sbFJhbmdlWSwKLSAgICAgICAgICAgIGludCBtYXhPdmVyU2Nyb2xsWCwgaW50IG1heE92ZXJTY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBpc1RvdWNoRXZlbnQpIHsKLSAgICAgICAgZmluYWwgaW50IG92ZXJTY3JvbGxNb2RlID0gbU92ZXJTY3JvbGxNb2RlOwotICAgICAgICBmaW5hbCBib29sZWFuIGNhblNjcm9sbEhvcml6b250YWwgPQotICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSA+IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsRXh0ZW50KCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuU2Nyb2xsVmVydGljYWwgPQotICAgICAgICAgICAgICAgIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgPiBjb21wdXRlVmVydGljYWxTY3JvbGxFeHRlbnQoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBvdmVyU2Nyb2xsSG9yaXpvbnRhbCA9IG92ZXJTY3JvbGxNb2RlID09IE9WRVJfU0NST0xMX0FMV0FZUyB8fAotICAgICAgICAgICAgICAgIChvdmVyU2Nyb2xsTW9kZSA9PSBPVkVSX1NDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgY2FuU2Nyb2xsSG9yaXpvbnRhbCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gb3ZlclNjcm9sbFZlcnRpY2FsID0gb3ZlclNjcm9sbE1vZGUgPT0gT1ZFUl9TQ1JPTExfQUxXQVlTIHx8Ci0gICAgICAgICAgICAgICAgKG92ZXJTY3JvbGxNb2RlID09IE9WRVJfU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyAmJiBjYW5TY3JvbGxWZXJ0aWNhbCk7Ci0KLSAgICAgICAgaW50IG5ld1Njcm9sbFggPSBzY3JvbGxYICsgZGVsdGFYOwotICAgICAgICBpZiAoIW92ZXJTY3JvbGxIb3Jpem9udGFsKSB7Ci0gICAgICAgICAgICBtYXhPdmVyU2Nyb2xsWCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbmV3U2Nyb2xsWSA9IHNjcm9sbFkgKyBkZWx0YVk7Ci0gICAgICAgIGlmICghb3ZlclNjcm9sbFZlcnRpY2FsKSB7Ci0gICAgICAgICAgICBtYXhPdmVyU2Nyb2xsWSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDbGFtcCB2YWx1ZXMgaWYgYXQgdGhlIGxpbWl0cyBhbmQgcmVjb3JkCi0gICAgICAgIGZpbmFsIGludCBsZWZ0ID0gLW1heE92ZXJTY3JvbGxYOwotICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBtYXhPdmVyU2Nyb2xsWCArIHNjcm9sbFJhbmdlWDsKLSAgICAgICAgZmluYWwgaW50IHRvcCA9IC1tYXhPdmVyU2Nyb2xsWTsKLSAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IG1heE92ZXJTY3JvbGxZICsgc2Nyb2xsUmFuZ2VZOwotCi0gICAgICAgIGJvb2xlYW4gY2xhbXBlZFggPSBmYWxzZTsKLSAgICAgICAgaWYgKG5ld1Njcm9sbFggPiByaWdodCkgewotICAgICAgICAgICAgbmV3U2Nyb2xsWCA9IHJpZ2h0OwotICAgICAgICAgICAgY2xhbXBlZFggPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1Njcm9sbFggPCBsZWZ0KSB7Ci0gICAgICAgICAgICBuZXdTY3JvbGxYID0gbGVmdDsKLSAgICAgICAgICAgIGNsYW1wZWRYID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY2xhbXBlZFkgPSBmYWxzZTsKLSAgICAgICAgaWYgKG5ld1Njcm9sbFkgPiBib3R0b20pIHsKLSAgICAgICAgICAgIG5ld1Njcm9sbFkgPSBib3R0b207Ci0gICAgICAgICAgICBjbGFtcGVkWSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAobmV3U2Nyb2xsWSA8IHRvcCkgewotICAgICAgICAgICAgbmV3U2Nyb2xsWSA9IHRvcDsKLSAgICAgICAgICAgIGNsYW1wZWRZID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG9uT3ZlclNjcm9sbGVkKG5ld1Njcm9sbFgsIG5ld1Njcm9sbFksIGNsYW1wZWRYLCBjbGFtcGVkWSk7Ci0KLSAgICAgICAgcmV0dXJuIGNsYW1wZWRYIHx8IGNsYW1wZWRZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB7QGxpbmsgI292ZXJTY3JvbGxCeShpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgYm9vbGVhbil9IHRvCi0gICAgICogcmVzcG9uZCB0byB0aGUgcmVzdWx0cyBvZiBhbiBvdmVyLXNjcm9sbCBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Nyb2xsWCBOZXcgWCBzY3JvbGwgdmFsdWUgaW4gcGl4ZWxzCi0gICAgICogQHBhcmFtIHNjcm9sbFkgTmV3IFkgc2Nyb2xsIHZhbHVlIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBjbGFtcGVkWCBUcnVlIGlmIHNjcm9sbFggd2FzIGNsYW1wZWQgdG8gYW4gb3Zlci1zY3JvbGwgYm91bmRhcnkKLSAgICAgKiBAcGFyYW0gY2xhbXBlZFkgVHJ1ZSBpZiBzY3JvbGxZIHdhcyBjbGFtcGVkIHRvIGFuIG92ZXItc2Nyb2xsIGJvdW5kYXJ5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PdmVyU2Nyb2xsZWQoaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCwgYm9vbGVhbiBjbGFtcGVkWSkgewotICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGVtcHR5LgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG92ZXItc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4gVGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogb25lIG9mIHtAbGluayAjT1ZFUl9TQ1JPTExfQUxXQVlTfSAoZGVmYXVsdCksIHtAbGluayAjT1ZFUl9TQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTfQotICAgICAqIChhbGxvdyBvdmVyLXNjcm9sbGluZyBvbmx5IGlmIHRoZSB2aWV3IGNvbnRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGNvbnRhaW5lciksCi0gICAgICogb3Ige0BsaW5rICNPVkVSX1NDUk9MTF9ORVZFUn0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoaXMgdmlldydzIG92ZXItc2Nyb2xsIG1vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRPdmVyU2Nyb2xsTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1PdmVyU2Nyb2xsTW9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG92ZXItc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4gVmFsaWQgb3Zlci1zY3JvbGwgbW9kZXMgYXJlCi0gICAgICoge0BsaW5rICNPVkVSX1NDUk9MTF9BTFdBWVN9IChkZWZhdWx0KSwge0BsaW5rICNPVkVSX1NDUk9MTF9JRl9DT05URU5UX1NDUk9MTFN9Ci0gICAgICogKGFsbG93IG92ZXItc2Nyb2xsaW5nIG9ubHkgaWYgdGhlIHZpZXcgY29udGVudCBpcyBsYXJnZXIgdGhhbiB0aGUgY29udGFpbmVyKSwKLSAgICAgKiBvciB7QGxpbmsgI09WRVJfU0NST0xMX05FVkVSfS4KLSAgICAgKgotICAgICAqIFNldHRpbmcgdGhlIG92ZXItc2Nyb2xsIG1vZGUgb2YgYSB2aWV3IHdpbGwgaGF2ZSBhbiBlZmZlY3Qgb25seSBpZiB0aGUKLSAgICAgKiB2aWV3IGlzIGNhcGFibGUgb2Ygc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG92ZXJTY3JvbGxNb2RlIFRoZSBuZXcgb3Zlci1zY3JvbGwgbW9kZSBmb3IgdGhpcyB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJTY3JvbGxNb2RlKGludCBvdmVyU2Nyb2xsTW9kZSkgewotICAgICAgICBpZiAob3ZlclNjcm9sbE1vZGUgIT0gT1ZFUl9TQ1JPTExfQUxXQVlTICYmCi0gICAgICAgICAgICAgICAgb3ZlclNjcm9sbE1vZGUgIT0gT1ZFUl9TQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmCi0gICAgICAgICAgICAgICAgb3ZlclNjcm9sbE1vZGUgIT0gT1ZFUl9TQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb3ZlcnNjcm9sbCBtb2RlICIgKyBvdmVyU2Nyb2xsTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU92ZXJTY3JvbGxNb2RlID0gb3ZlclNjcm9sbE1vZGU7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQSBNZWFzdXJlU3BlYyBlbmNhcHN1bGF0ZXMgdGhlIGxheW91dCByZXF1aXJlbWVudHMgcGFzc2VkIGZyb20gcGFyZW50IHRvIGNoaWxkLgogICAgICAqIEVhY2ggTWVhc3VyZVNwZWMgcmVwcmVzZW50cyBhIHJlcXVpcmVtZW50IGZvciBlaXRoZXIgdGhlIHdpZHRoIG9yIHRoZSBoZWlnaHQuCiAgICAgICogQSBNZWFzdXJlU3BlYyBpcyBjb21wcmlzZWQgb2YgYSBzaXplIGFuZCBhIG1vZGUuIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZQpAQCAtOTI5NSw2ICsxMDQ4Nyw5IEBACiAgICAgICAgIElCaW5kZXIgbVBhbmVsUGFyZW50V2luZG93VG9rZW47CiAgICAgICAgIFN1cmZhY2UgbVN1cmZhY2U7CiAKKyAgICAgICAgYm9vbGVhbiBtSGFyZHdhcmVBY2NlbGVyYXRlZDsKKyAgICAgICAgSGFyZHdhcmVSZW5kZXJlciBtSGFyZHdhcmVSZW5kZXJlcjsKKyAgICAgICAgCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTY2FsZSBmYWN0b3IgdXNlZCBieSB0aGUgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAqLwpAQCAtOTQxMiw2ICsxMDYwNywxMyBAQAogICAgICAgICAgKi8KICAgICAgICAgZmluYWwgaW50W10gbUludmFsaWRhdGVDaGlsZExvY2F0aW9uID0gbmV3IGludFsyXTsKIAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHbG9iYWwgdG8gdGhlIHZpZXcgaGllcmFyY2h5IHVzZWQgYXMgYSB0ZW1wb3JhcnkgZm9yIGRlYWxpbmcgd2l0aAorICAgICAgICAgKiB4L3kgbG9jYXRpb24gd2hlbiB2aWV3IGlzIHRyYW5zZm9ybWVkLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgZmxvYXRbXSBtVG1wVHJhbnNmb3JtTG9jYXRpb24gPSBuZXcgZmxvYXRbMl07CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSB2aWV3IHRyZWUgb2JzZXJ2ZXIgdXNlZCB0byBkaXNwYXRjaCBnbG9iYWwgZXZlbnRzIGxpa2UKICAgICAgICAgICogbGF5b3V0LCBwcmUtZHJhdywgdG91Y2ggbW9kZSBjaGFuZ2UsIGV0Yy4KQEAgLTk0NDgsNiArMTA2NTAsMTEgQEAKICAgICAgICAgZmluYWwgUmVjdCBtVG1wSW52YWxSZWN0ID0gbmV3IFJlY3QoKTsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGVtcG9yYXJ5IGZvciB1c2UgaW4gY29tcHV0aW5nIGhpdCBhcmVhcyB3aXRoIHRyYW5zZm9ybWVkIHZpZXdzCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBSZWN0RiBtVG1wVHJhbnNmb3JtUmVjdCA9IG5ldyBSZWN0RigpOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUZW1wb3JhcnkgbGlzdCBmb3IgdXNlIGluIGNvbGxlY3RpbmcgZm9jdXNhYmxlIGRlc2NlbmRlbnRzIG9mIGEgdmlldy4KICAgICAgICAgICovCiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxWaWV3PiBtRm9jdXNhYmxlc1RlbXBMaXN0ID0gbmV3IEFycmF5TGlzdDxWaWV3PigyNCk7CkBAIC05NTA3LDggKzEwNzE0LDggQEAKIAogICAgICAgICBwdWJsaWMgZmluYWwgSW50ZXJwb2xhdG9yIHNjcm9sbEJhckludGVycG9sYXRvciA9IG5ldyBJbnRlcnBvbGF0b3IoMSwgMik7CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1PcGFxdWUgPSB7MjU1LjBmfTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1UcmFuc3BhcmVudCA9IHswLjBmfTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1PcGFxdWUgPSB7IDI1NS4wZiB9OworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbVRyYW5zcGFyZW50ID0geyAwLjBmIH07CiAgICAgICAgIAogICAgICAgICAvKioKICAgICAgICAgICogV2hlbiBmYWRpbmcgc2hvdWxkIHN0YXJ0LiBUaGlzIHRpbWUgbW92ZXMgaW50byB0aGUgZnV0dXJlIGV2ZXJ5IHRpbWUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YQppbmRleCA5MjRjOWQ0Li5hY2RmYzI4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhCkBAIC0xNDAsMTYgKzE0MCw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgU0NST0xMX0ZSSUNUSU9OID0gMC4wMTVmOwogCi0gICAgLyoqCi0gICAgICogTWF4IGRpc3RhbmNlIHRvIG92ZXJzY3JvbGwgZm9yIGVkZ2UgZWZmZWN0cwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVkVSU0NST0xMX0RJU1RBTkNFID0gMDsKLQotICAgIC8qKgotICAgICAqIE1heCBkaXN0YW5jZSB0byBvdmVyZmxpbmcgZm9yIGVkZ2UgZWZmZWN0cwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVkVSRkxJTkdfRElTVEFOQ0UgPSA0OwotCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUVkZ2VTbG9wOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1GYWRpbmdFZGdlTGVuZ3RoOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1NaW5pbXVtRmxpbmdWZWxvY2l0eTsKQEAgLTE2MCw4ICsxNTAsNiBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IG1Eb3VibGVUYXBTbG9wOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1XaW5kb3dUb3VjaFNsb3A7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heGltdW1EcmF3aW5nQ2FjaGVTaXplOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1PdmVyc2Nyb2xsRGlzdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU92ZXJmbGluZ0Rpc3RhbmNlOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8Vmlld0NvbmZpZ3VyYXRpb24+IHNDb25maWd1cmF0aW9ucyA9CiAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8Vmlld0NvbmZpZ3VyYXRpb24+KDIpOwpAQCAtMTgyLDggKzE3MCw2IEBACiAgICAgICAgIG1XaW5kb3dUb3VjaFNsb3AgPSBXSU5ET1dfVE9VQ0hfU0xPUDsKICAgICAgICAgLy9ub2luc3BlY3Rpb24gZGVwcmVjYXRpb24KICAgICAgICAgbU1heGltdW1EcmF3aW5nQ2FjaGVTaXplID0gTUFYSU1VTV9EUkFXSU5HX0NBQ0hFX1NJWkU7Ci0gICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UgPSBPVkVSU0NST0xMX0RJU1RBTkNFOwotICAgICAgICBtT3ZlcmZsaW5nRGlzdGFuY2UgPSBPVkVSRkxJTkdfRElTVEFOQ0U7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTIsOSArMTk4LDYgQEAKIAogICAgICAgICAvLyBTaXplIG9mIHRoZSBzY3JlZW4gaW4gYnl0ZXMsIGluIEFSR0JfODg4OCBmb3JtYXQKICAgICAgICAgbU1heGltdW1EcmF3aW5nQ2FjaGVTaXplID0gNCAqIG1ldHJpY3Mud2lkdGhQaXhlbHMgKiBtZXRyaWNzLmhlaWdodFBpeGVsczsKLQotICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlID0gKGludCkgKGRlbnNpdHkgKiBPVkVSU0NST0xMX0RJU1RBTkNFICsgMC41Zik7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IChpbnQpIChkZW5zaXR5ICogT1ZFUkZMSU5HX0RJU1RBTkNFICsgMC41Zik7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzIsMjAgKzQ1NSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbWF4aW11bSBkaXN0YW5jZSBhIFZpZXcgc2hvdWxkIG92ZXJzY3JvbGwgYnkgd2hlbiBzaG93aW5nIGVkZ2UgZWZmZWN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNjYWxlZE92ZXJzY3JvbGxEaXN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1PdmVyc2Nyb2xsRGlzdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbWF4aW11bSBkaXN0YW5jZSBhIFZpZXcgc2hvdWxkIG92ZXJmbGluZyBieSB3aGVuIHNob3dpbmcgZWRnZSBlZmZlY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtT3ZlcmZsaW5nRGlzdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogVGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIHpvb20gY29udHJvbHMgc2hvdWxkIGJlCiAgICAgICogZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4gZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0RlYnVnLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdEZWJ1Zy5qYXZhCmluZGV4IDdiNjk5MWYuLjExZTY4YzUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0RlYnVnLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3RGVidWcuamF2YQpAQCAtMTE4LDI0ICsxMTgsMjcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgQERlYnVnLkRlYnVnUHJvcGVydHkKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvZmlsZURyYXdpbmcgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUFJPRklMRV9EUkFXSU5HID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBQcm9maWxlcyBsYXlvdXQgdGltZXMgaW4gdGhlIGV2ZW50cyBsb2cuCiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIEBEZWJ1Zy5EZWJ1Z1Byb3BlcnR5Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb2ZpbGVMYXlvdXQgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUFJPRklMRV9MQVlPVVQgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIFByb2ZpbGVzIHJlYWwgZnBzICh0aW1lcyBiZXR3ZWVuIGRyYXdzKSBhbmQgZGlzcGxheXMgdGhlIHJlc3VsdC4KICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgQERlYnVnLkRlYnVnUHJvcGVydHkKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd0ZwcyA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TSE9XX0ZQUyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRW5hYmxlcyBkZXRhaWxlZCBsb2dnaW5nIG9mIGRyYWcvZHJvcCBvcGVyYXRpb25zLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0RSQUcgPSB0cnVlOwogCiAgICAgLyoqCiAgICAgICogPHA+RW5hYmxlcyBvciBkaXNhYmxlcyB2aWV3cyBjb25zaXN0ZW5jeSBjaGVjay4gRXZlbiB3aGVuIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCwKQEAgLTQyNyw3ICs0MzAsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldFZpZXdJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gVmlldy5zSW5zdGFuY2VDb3VudDsKKyAgICAgICAgcmV0dXJuIERlYnVnLmNvdW50SW5zdGFuY2VzT2ZDbGFzcyhWaWV3LmNsYXNzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzOCw3ICs0NDEsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldFZpZXdSb290SW5zdGFuY2VDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIFZpZXdSb290LmdldEluc3RhbmNlQ291bnQoKTsKKyAgICAgICAgcmV0dXJuIERlYnVnLmNvdW50SW5zdGFuY2VzT2ZDbGFzcyhWaWV3Um9vdC5jbGFzcyk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQppbmRleCBiOTg2NGJhLi41YjNhMDkxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTIzLDE1ICsyNCwxNSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwpAQCAtNjMsOCArNjQsMTAgQEAKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdHcm91cF9hbHdheXNEcmF3bldpdGhDYWNoZQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0dyb3VwX2FkZFN0YXRlc0Zyb21DaGlsZHJlbgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0dyb3VwX2Rlc2NlbmRhbnRGb2N1c2FiaWxpdHkKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdHcm91cF9hbmltYXRlTGF5b3V0Q2hhbmdlcwogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld0dyb3VwIGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIFZpZXdQYXJlbnQsIFZpZXdNYW5hZ2VyIHsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CiAKICAgICAvKioKQEAgLTg2LDE4ICs4OSw0NCBAQAogICAgIC8vIFRoZSB2aWV3IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBWaWV3R3JvdXAgdGhhdCBoYXMgb3IgY29udGFpbnMgZm9jdXMuCiAgICAgcHJpdmF0ZSBWaWV3IG1Gb2N1c2VkOwogCi0gICAgLy8gVGhlIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24gdG8gYXBwbHkgb24gdGhlIGNoaWxkIGJlaW5nIGRyYXduCi0gICAgcHJpdmF0ZSBUcmFuc2Zvcm1hdGlvbiBtQ2hpbGRUcmFuc2Zvcm1hdGlvbjsKKyAgICAvKioKKyAgICAgKiBBIFRyYW5zZm9ybWF0aW9uIHVzZWQgd2hlbiBkcmF3aW5nIGNoaWxkcmVuLCB0bworICAgICAqIGFwcGx5IG9uIHRoZSBjaGlsZCBiZWluZyBkcmF3bi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWF0aW9uIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHRyYWNrIHRoZSBjdXJyZW50IGludmFsaWRhdGlvbiByZWdpb24uCisgICAgICovCiAgICAgcHJpdmF0ZSBSZWN0RiBtSW52YWxpZGF0ZVJlZ2lvbjsKIAotICAgIC8vIFRhcmdldCBvZiBNb3Rpb24gZXZlbnRzCi0gICAgcHJpdmF0ZSBWaWV3IG1Nb3Rpb25UYXJnZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgLyoqCisgICAgICogQSBUcmFuc2Zvcm1hdGlvbiB1c2VkIHRvIGNhbGN1bGF0ZSBhIGNvcnJlY3QKKyAgICAgKiBpbnZhbGlkYXRpb24gYXJlYSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBhdXRvc2NhbGVkLgorICAgICAqLworICAgIHByaXZhdGUgVHJhbnNmb3JtYXRpb24gbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uOworCisgICAgLy8gVmlldyBjdXJyZW50bHkgdW5kZXIgYW4gb25nb2luZyBkcmFnCisgICAgcHJpdmF0ZSBWaWV3IG1DdXJyZW50RHJhZ1ZpZXc7CisKKyAgICAvLyBEb2VzIHRoaXMgZ3JvdXAgaGF2ZSBhIGNoaWxkIHRoYXQgY2FuIGFjY2VwdCB0aGUgY3VycmVudCBkcmFnIHBheWxvYWQ/CisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGlsZEFjY2VwdHNEcmFnOworCisgICAgLy8gVXNlZCBkdXJpbmcgZHJhZyBkaXNwYXRjaAorICAgIHByaXZhdGUgZmluYWwgUG9pbnRGIG1Mb2NhbFBvaW50ID0gbmV3IFBvaW50RigpOwogCiAgICAgLy8gTGF5b3V0IGFuaW1hdGlvbgogICAgIHByaXZhdGUgTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciBtTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsKICAgICBwcml2YXRlIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBtQW5pbWF0aW9uTGlzdGVuZXI7CiAKKyAgICAvLyBGaXJzdCB0b3VjaCB0YXJnZXQgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIHRvdWNoIHRhcmdldHMuCisgICAgcHJpdmF0ZSBUb3VjaFRhcmdldCBtRmlyc3RUb3VjaFRhcmdldDsKKworICAgIC8vIFRlbXBvcmFyeSBhcnJheXMgZm9yIHNwbGl0dGluZyBwb2ludGVycy4KKyAgICBwcml2YXRlIGludFtdIG1UbXBQb2ludGVySW5kZXhNYXA7CisgICAgcHJpdmF0ZSBpbnRbXSBtVG1wUG9pbnRlcklkczsKKyAgICBwcml2YXRlIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbXSBtVG1wUG9pbnRlckNvb3JkczsKKwogICAgIC8qKgogICAgICAqIEludGVybmFsIGZsYWdzLgogICAgICAqCkBAIC0yMjgsNiArMjU3LDExIEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ESVNBTExPV19JTlRFUkNFUFQgPSAweDgwMDAwOwogCiAgICAgLyoqCisgICAgICogV2hlbiBzZXQsIHRoaXMgVmlld0dyb3VwIHdpbGwgc3BsaXQgTW90aW9uRXZlbnRzIHRvIG11bHRpcGxlIGNoaWxkIFZpZXdzIHdoZW4gYXBwcm9wcmlhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUyA9IDB4MjAwMDAwOworCisgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoaWNoIHR5cGVzIG9mIGRyYXdpbmcgY2FjaGVzIGFyZSB0byBiZSBrZXB0IGluIG1lbW9yeS4KICAgICAgKiBUaGlzIGZpZWxkIHNob3VsZCBiZSBtYWRlIHByaXZhdGUsIHNvIGl0IGlzIGhpZGRlbiBmcm9tIHRoZSBTREsuCiAgICAgICoge0BoaWRlfQpAQCAtMjc3LDYgKzMxMSwxOCBAQAogICAgIC8vIFVzZWQgdG8gZHJhdyBjYWNoZWQgdmlld3MKICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1DYWNoZVBhaW50ID0gbmV3IFBhaW50KCk7CiAKKyAgICAvLyBVc2VkIHRvIGFuaW1hdGUgYWRkL3JlbW92ZSBjaGFuZ2VzIGluIGxheW91dAorICAgIHByaXZhdGUgTGF5b3V0VHJhbnNpdGlvbiBtVHJhbnNpdGlvbjsKKworICAgIC8vIFRoZSBzZXQgb2Ygdmlld3MgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHRyYW5zaXRpb25lZC4gVGhpcyBsaXN0IGlzIHVzZWQgdG8gdHJhY2sgdmlld3MKKyAgICAvLyBiZWluZyByZW1vdmVkIHRoYXQgc2hvdWxkIG5vdCBhY3R1YWxseSBiZSByZW1vdmVkIGZyb20gdGhlIHBhcmVudCB5ZXQgYmVjYXVzZSB0aGV5IGFyZQorICAgIC8vIGJlaW5nIGFuaW1hdGVkLgorICAgIHByaXZhdGUgQXJyYXlMaXN0PFZpZXc+IG1UcmFuc2l0aW9uaW5nVmlld3M7CisKKyAgICAvLyBMaXN0IG9mIGNoaWxkcmVuIGNoYW5naW5nIHZpc2liaWxpdHkuIFRoaXMgaXMgdXNlZCB0byBwb3RlbnRpYWxseSBrZWVwIHJlbmRlcmluZworICAgIC8vIHZpZXdzIGR1cmluZyBhIHRyYW5zaXRpb24gd2hlbiB0aGV5IG90aGVyd2lzZSB3b3VsZCBoYXZlIGJlY29tZSBnb25lL2ludmlzaWJsZQorICAgIHByaXZhdGUgQXJyYXlMaXN0PFZpZXc+IG1WaXNpYmlsaXR5Q2hhbmdpbmdDaGlsZHJlbjsKKwogICAgIHB1YmxpYyBWaWV3R3JvdXAoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQpOwogICAgICAgICBpbml0Vmlld0dyb3VwKCk7CkBAIC0zNDgsNiArMzk0LDE1IEBACiAgICAgICAgICAgICAgICAgY2FzZSBSLnN0eWxlYWJsZS5WaWV3R3JvdXBfZGVzY2VuZGFudEZvY3VzYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShERVNDRU5EQU5UX0ZPQ1VTQUJJTElUWV9GTEFHU1thLmdldEludChhdHRyLCAwKV0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdHcm91cF9zcGxpdE1vdGlvbkV2ZW50czoKKyAgICAgICAgICAgICAgICAgICAgc2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkKGEuZ2V0Qm9vbGVhbihhdHRyLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdHcm91cF9hbmltYXRlTGF5b3V0Q2hhbmdlczoKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbmltYXRlTGF5b3V0Q2hhbmdlcyA9IGEuZ2V0Qm9vbGVhbihhdHRyLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmltYXRlTGF5b3V0Q2hhbmdlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0TGF5b3V0VHJhbnNpdGlvbihuZXcgTGF5b3V0VHJhbnNpdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00NjEsNiArNTE2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50ICE9IG51bGwgPyBtUGFyZW50LnN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKG9yaWdpbmFsVmlldywgY2FsbGJhY2spIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBGaW5kIHRoZSBuZWFyZXN0IHZpZXcgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24gdGhhdCB3YW50cyB0byB0YWtlCiAgICAgICogZm9jdXMuCiAgICAgICoKQEAgLTY5Niw2ICs3NTgsMzIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqIEBwYXJhbSBjaGlsZAorICAgICAqIEBwYXJhbSB2aXNpYmlsaXR5CisgICAgICovCisgICAgdm9pZCBvbkNoaWxkVmlzaWJpbGl0eUNoYW5nZWQoVmlldyBjaGlsZCwgaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgaWYgKG1UcmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmlsaXR5ID09IFZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbi5zaG93Q2hpbGQodGhpcywgY2hpbGQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbi5oaWRlQ2hpbGQodGhpcywgY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpc2liaWxpdHkgIT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgdHJhY2sgdGhpcyBvbiBkaXNhcHBlYXJpbmcgdmlld3MgLSBhcHBlYXJpbmcgdmlld3MgYXJlIGFscmVhZHkgdmlzaWJsZQorICAgICAgICAgICAgICAgIC8vIGFuZCBkb24ndCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgZHVyaW5nIGRyYXdDaGlsZCgpCisgICAgICAgICAgICAgICAgaWYgKG1WaXNpYmlsaXR5Q2hhbmdpbmdDaGlsZHJlbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5Q2hhbmdpbmdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVZpc2liaWxpdHlDaGFuZ2luZ0NoaWxkcmVuLmFkZChjaGlsZCk7CisgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzLmNvbnRhaW5zKGNoaWxkKSkgeworICAgICAgICAgICAgICAgICAgICBhZGREaXNhcHBlYXJpbmdWaWV3KGNoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC03NjcsNiArODU1LDEzMCBAQAogCiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogISEhIFRPRE86IHdyaXRlIHJlYWwgZG9jcworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoRHJhZ0V2ZW50KERyYWdFdmVudCBldmVudCkgeworICAgICAgICBib29sZWFuIHJldHZhbCA9IGZhbHNlOworICAgICAgICBmaW5hbCBmbG9hdCB0eCA9IGV2ZW50Lm1YOworICAgICAgICBmaW5hbCBmbG9hdCB0eSA9IGV2ZW50Lm1ZOworCisgICAgICAgIFZpZXdSb290IHJvb3QgPSBnZXRWaWV3Um9vdCgpOworCisgICAgICAgIC8vIERpc3BhdGNoIGRvd24gdGhlIHZpZXcgaGllcmFyY2h5CisgICAgICAgIHN3aXRjaCAoZXZlbnQubUFjdGlvbikgeworICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19TVEFSVEVEOiB7CisgICAgICAgICAgICAvLyBjbGVhciBzdGF0ZSB0byByZWNhbGN1bGF0ZSB3aGljaCB2aWV3cyB3ZSBkcmFnIG92ZXIKKyAgICAgICAgICAgIHJvb3Quc2V0RHJhZ0ZvY3VzKGV2ZW50LCBudWxsKTsKKworICAgICAgICAgICAgLy8gTm93IGRpc3BhdGNoIGRvd24gdG8gb3VyIGNoaWxkcmVuLCBjYWNoaW5nIHRoZSByZXNwb25zZXMKKyAgICAgICAgICAgIG1DaGlsZEFjY2VwdHNEcmFnID0gZmFsc2U7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBoYW5kbGVkID0gY2hpbGRyZW5baV0uZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpXS5tQ2FuQWNjZXB0RHJvcCA9IGhhbmRsZWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hpbGRBY2NlcHRzRHJhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJldHVybiBIQU5ETEVEIGlmIG9uZSBvZiBvdXIgY2hpbGRyZW4gY2FuIGFjY2VwdCB0aGUgZHJhZworICAgICAgICAgICAgaWYgKG1DaGlsZEFjY2VwdHNEcmFnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19FTkRFRDogeworICAgICAgICAgICAgLy8gTm90aWZ5IGFsbCBvZiBvdXIgY2hpbGRyZW4gdGhhdCB0aGUgZHJhZyBpcyBvdmVyCisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdlIGNvbnNpZGVyIGRyYWctZW5kZWQgdG8gaGF2ZSBiZWVuIGhhbmRsZWQgaWYgb25lIG9mIG91ciBjaGlsZHJlbgorICAgICAgICAgICAgLy8gaGFkIG9mZmVyZWQgdG8gaGFuZGxlIHRoZSBkcmFnLgorICAgICAgICAgICAgaWYgKG1DaGlsZEFjY2VwdHNEcmFnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19MT0NBVElPTjogeworICAgICAgICAgICAgLy8gRmluZCB0aGUgW3Bvc3NpYmx5IG5ld10gZHJhZyB0YXJnZXQKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdGFyZ2V0ID0gZmluZEZyb250bW9zdERyb3BwYWJsZUNoaWxkQXQoZXZlbnQubVgsIGV2ZW50Lm1ZLCBtTG9jYWxQb2ludCk7CisKKyAgICAgICAgICAgIC8vIElmIHdlJ3ZlIGNoYW5nZWQgYXBwYXJlbnQgZHJhZyB0YXJnZXQsIHRlbGwgdGhlIHZpZXcgcm9vdCB3aGljaCB2aWV3CisgICAgICAgICAgICAvLyB3ZSdyZSBvdmVyIG5vdy4gIFRoaXMgd2lsbCBpbiB0dXJuIHNlbmQgb3V0IERSQUdfRU5URVJFRCAvIERSQUdfRVhJVEVECisgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zIGFzIGFwcHJvcHJpYXRlLgorICAgICAgICAgICAgaWYgKG1DdXJyZW50RHJhZ1ZpZXcgIT0gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgcm9vdC5zZXREcmFnRm9jdXMoZXZlbnQsIHRhcmdldCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnREcmFnVmlldyA9IHRhcmdldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGFjdHVhbCBkcmFnIGxvY2F0aW9uIG5vdGljZSwgbG9jYWxpemVkIGludG8gaXRzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBldmVudC5tWCA9IG1Mb2NhbFBvaW50Lng7CisgICAgICAgICAgICAgICAgZXZlbnQubVkgPSBtTG9jYWxQb2ludC55OworCisgICAgICAgICAgICAgICAgcmV0dmFsID0gdGFyZ2V0LmRpc3BhdGNoRHJhZ0V2ZW50KGV2ZW50KTsKKworICAgICAgICAgICAgICAgIGV2ZW50Lm1YID0gdHg7CisgICAgICAgICAgICAgICAgZXZlbnQubVkgPSB0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJPUDogeworICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19EUkFHKSBMb2cuZChWaWV3LlZJRVdfTE9HX1RBRywgIkRyb3AgZXZlbnQ6ICIgKyBldmVudCk7CisgICAgICAgICAgICBWaWV3IHRhcmdldCA9IGZpbmRGcm9udG1vc3REcm9wcGFibGVDaGlsZEF0KGV2ZW50Lm1YLCBldmVudC5tWSwgbUxvY2FsUG9pbnQpOworICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19EUkFHKSBMb2cuZChWaWV3LlZJRVdfTE9HX1RBRywgIiAgIGRpc3BhdGNoIGRyb3AgdG8gIiArIHRhcmdldCk7CisgICAgICAgICAgICAgICAgZXZlbnQubVggPSBtTG9jYWxQb2ludC54OworICAgICAgICAgICAgICAgIGV2ZW50Lm1ZID0gbUxvY2FsUG9pbnQueTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSB0YXJnZXQuZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIGV2ZW50Lm1YID0gdHg7CisgICAgICAgICAgICAgICAgZXZlbnQubVkgPSB0eTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19EUkFHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFZpZXcuVklFV19MT0dfVEFHLCAiICAgbm90IGRyb3BwZWQgb24gYW4gYWNjZXB0aW5nIHZpZXciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBub25lIG9mIG91ciBjaGlsZHJlbiBjb3VsZCBoYW5kbGUgdGhlIGV2ZW50LCB0cnkgaGVyZQorICAgICAgICBpZiAoIXJldHZhbCkgeworICAgICAgICAgICAgcmV0dmFsID0gb25EcmFnRXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLy8gRmluZCB0aGUgZnJvbnRtb3N0IGNoaWxkIHZpZXcgdGhhdCBsaWVzIHVuZGVyIHRoZSBnaXZlbiBwb2ludCwgYW5kIGNhbGN1bGF0ZQorICAgIC8vIHRoZSBwb3NpdGlvbiB3aXRoaW4gaXRzIG93biBsb2NhbCBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBWaWV3IGZpbmRGcm9udG1vc3REcm9wcGFibGVDaGlsZEF0KGZsb2F0IHgsIGZsb2F0IHksIFBvaW50RiBvdXRMb2NhbFBvaW50KSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OworICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CisgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICBpZiAoIWNoaWxkLm1DYW5BY2NlcHREcm9wKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc1RyYW5zZm9ybWVkVG91Y2hQb2ludEluVmlldyh4LCB5LCBjaGlsZCwgb3V0TG9jYWxQb2ludCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnRQcmVJbWUoS2V5RXZlbnQgZXZlbnQpIHsKQEAgLTgyNywxMTkgKzEwMzksNTIzIEBACiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHhmID0gZXYuZ2V0WCgpOwotICAgICAgICBmaW5hbCBmbG9hdCB5ZiA9IGV2LmdldFkoKTsKLSAgICAgICAgZmluYWwgZmxvYXQgc2Nyb2xsZWRYRmxvYXQgPSB4ZiArIG1TY3JvbGxYOwotICAgICAgICBmaW5hbCBmbG9hdCBzY3JvbGxlZFlGbG9hdCA9IHlmICsgbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIFJlY3QgZnJhbWUgPSBtVGVtcFJlY3Q7CisgICAgICAgIGZpbmFsIGludCBhY3Rpb25NYXNrZWQgPSBhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSzsKIAotICAgICAgICBib29sZWFuIGRpc2FsbG93SW50ZXJjZXB0ID0gKG1Hcm91cEZsYWdzICYgRkxBR19ESVNBTExPV19JTlRFUkNFUFQpICE9IDA7CisgICAgICAgIC8vIEhhbmRsZSBhbiBpbml0aWFsIGRvd24uCisgICAgICAgIGlmIChhY3Rpb25NYXNrZWQgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIC8vIFRocm93IGF3YXkgYWxsIHByZXZpb3VzIHN0YXRlIHdoZW4gc3RhcnRpbmcgYSBuZXcgdG91Y2ggZ2VzdHVyZS4KKyAgICAgICAgICAgIC8vIFRoZSBmcmFtZXdvcmsgbWF5IGhhdmUgZHJvcHBlZCB0aGUgdXAgb3IgY2FuY2VsIGV2ZW50IGZvciB0aGUgcHJldmlvdXMgZ2VzdHVyZQorICAgICAgICAgICAgLy8gZHVlIHRvIGFuIGFwcCBzd2l0Y2gsIEFOUiwgb3Igc29tZSBvdGhlciBzdGF0ZSBjaGFuZ2UuCisgICAgICAgICAgICBjYW5jZWxBbmRDbGVhclRvdWNoVGFyZ2V0cyhldik7CisgICAgICAgICAgICByZXNldFRvdWNoU3RhdGUoKTsKKyAgICAgICAgfQogCi0gICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKLSAgICAgICAgICAgIGlmIChtTW90aW9uVGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHdlaXJkLCB3ZSBnb3QgYSBwZW4gZG93biwgYnV0IHdlIHRob3VnaHQgaXQgd2FzCi0gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBkb3duIQotICAgICAgICAgICAgICAgIC8vIFhYWDogV2Ugc2hvdWxkIHByb2JhYmx5IHNlbmQgYW4gQUNUSU9OX1VQIHRvIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgLy8gdGFyZ2V0LgotICAgICAgICAgICAgICAgIG1Nb3Rpb25UYXJnZXQgPSBudWxsOworICAgICAgICAvLyBDaGVjayBmb3IgaW50ZXJjZXB0aW9uLgorICAgICAgICBmaW5hbCBib29sZWFuIGludGVyY2VwdGVkOworICAgICAgICBpZiAoYWN0aW9uTWFza2VkID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOIHx8IG1GaXJzdFRvdWNoVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZGlzYWxsb3dJbnRlcmNlcHQgPSAobUdyb3VwRmxhZ3MgJiBGTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVCkgIT0gMDsKKyAgICAgICAgICAgIGlmICghZGlzYWxsb3dJbnRlcmNlcHQpIHsKKyAgICAgICAgICAgICAgICBpbnRlcmNlcHRlZCA9IG9uSW50ZXJjZXB0VG91Y2hFdmVudChldik7CisgICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKGFjdGlvbik7IC8vIHJlc3RvcmUgYWN0aW9uIGluIGNhc2Ugb25JbnRlcmNlcHRUb3VjaEV2ZW50KCkgY2hhbmdlZCBpdAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnRlcmNlcHRlZCA9IGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgd2UncmUgZGlzYWxsb3dpbmcgaW50ZXJjZXB0IG9yIGlmIHdlJ3JlIGFsbG93aW5nIGFuZCB3ZSBkaWRuJ3QKLSAgICAgICAgICAgIC8vIGludGVyY2VwdAotICAgICAgICAgICAgaWYgKGRpc2FsbG93SW50ZXJjZXB0IHx8ICFvbkludGVyY2VwdFRvdWNoRXZlbnQoZXYpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhpcyBldmVudCdzIGFjdGlvbiAoanVzdCB0byBwcm90ZWN0IG91cnNlbHZlcykKLSAgICAgICAgICAgICAgICBldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pOwotICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgd2Ugd2FudCB0byBkaXNwYXRjaCB0aGUgZXZlbnQgZG93biwgZmluZCBhIGNoaWxkCi0gICAgICAgICAgICAgICAgLy8gd2hvIGNhbiBoYW5kbGUgaXQsIHN0YXJ0IHdpdGggdGhlIGZyb250LW1vc3QgY2hpbGQuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbGVkWEludCA9IChpbnQpIHNjcm9sbGVkWEZsb2F0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxlZFlJbnQgPSAoaW50KSBzY3JvbGxlZFlGbG9hdDsKLSAgICAgICAgICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRlcmNlcHRlZCA9IHRydWU7CisgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZC5tVmlld0ZsYWdzICYgVklTSUJJTElUWV9NQVNLKSA9PSBWSVNJQkxFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0SGl0UmVjdChmcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWUuY29udGFpbnMoc2Nyb2xsZWRYSW50LCBzY3JvbGxlZFlJbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRoZSBldmVudCB0byB0aGUgdmlldydzIGNvb3JkaW5hdGUgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIGNoaWxkLm1MZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSBjaGlsZC5tVG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQubVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmRpc3BhdGNoVG91Y2hFdmVudChldikpICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IGhhbmRsZWQsIHdlIGhhdmUgYSB0YXJnZXQgbm93LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gY2hpbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZXZlbnQgZGlkbid0IGdldCBoYW5kbGVkLCB0cnkgdGhlIG5leHQgdmlldy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgZXZlbnQncyBsb2NhdGlvbiwgaXQncyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWNlc3NhcnkgaGVyZS4KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGNhbmNlbGF0aW9uLgorICAgICAgICBmaW5hbCBib29sZWFuIGNhbmNlbGVkID0gcmVzZXRDYW5jZWxOZXh0VXBGbGFnKHRoaXMpCisgICAgICAgICAgICAgICAgfHwgYWN0aW9uTWFza2VkID09IE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw7CisKKyAgICAgICAgLy8gVXBkYXRlIGxpc3Qgb2YgdG91Y2ggdGFyZ2V0cyBmb3IgcG9pbnRlciBkb3duLCBpZiBuZWVkZWQuCisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3BsaXQgPSAobUdyb3VwRmxhZ3MgJiBGTEFHX1NQTElUX01PVElPTl9FVkVOVFMpICE9IDA7CisgICAgICAgIFRvdWNoVGFyZ2V0IG5ld1RvdWNoVGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBhbHJlYWR5RGlzcGF0Y2hlZFRvTmV3VG91Y2hUYXJnZXQgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFjYW5jZWxlZCAmJiAhaW50ZXJjZXB0ZWQpIHsKKyAgICAgICAgICAgIGlmIChhY3Rpb25NYXNrZWQgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04KKyAgICAgICAgICAgICAgICAgICAgfHwgKHNwbGl0ICYmIGFjdGlvbk1hc2tlZCA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb25JbmRleCA9IGV2LmdldEFjdGlvbkluZGV4KCk7IC8vIGFsd2F5cyAwIGZvciBkb3duCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGlkQml0c1RvQXNzaWduID0gc3BsaXQgPyAxIDw8IGV2LmdldFBvaW50ZXJJZChhY3Rpb25JbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogVG91Y2hUYXJnZXQuQUxMX1BPSU5URVJfSURTOworCisgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZWFybGllciB0b3VjaCB0YXJnZXRzIGZvciB0aGlzIHBvaW50ZXIgaWQgaW4gY2FzZSB0aGV5CisgICAgICAgICAgICAgICAgLy8gaGF2ZSBiZWNvbWUgb3V0IG9mIHN5bmMuCisgICAgICAgICAgICAgICAgcmVtb3ZlUG9pbnRlcnNGcm9tVG91Y2hUYXJnZXRzKGlkQml0c1RvQXNzaWduKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuQ291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGEgY2hpbGQgdGhhdCBjYW4gcmVjZWl2ZSB0aGUgZXZlbnQuICBTY2FuIGNoaWxkcmVuIGZyb20gZnJvbnQgdG8gYmFjay4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB4ID0gZXYuZ2V0WChhY3Rpb25JbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBldi5nZXRZKGFjdGlvbkluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gY2hpbGRyZW5Db3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkLm1WaWV3RmxhZ3MgJiBWSVNJQklMSVRZX01BU0spICE9IFZJU0lCTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaW52aXNpYmxlIGNoaWxkIHVubGVzcyBpdCBpcyBhbmltYXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUcmFuc2Zvcm1lZFRvdWNoUG9pbnRJblZpZXcoeCwgeSwgY2hpbGQsIG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IHBvaW50ZXIgaXMgb3V0IG9mIGNoaWxkJ3MgYm91bmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdUb3VjaFRhcmdldCA9IGdldFRvdWNoVGFyZ2V0KGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdUb3VjaFRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hpbGQgaXMgYWxyZWFkeSByZWNlaXZpbmcgdG91Y2ggd2l0aGluIGl0cyBib3VuZHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2l2ZSBpdCB0aGUgbmV3IHBvaW50ZXIgaW4gYWRkaXRpb24gdG8gdGhlIG9uZXMgaXQgaXMgaGFuZGxpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG91Y2hUYXJnZXQucG9pbnRlcklkQml0cyB8PSBpZEJpdHNUb0Fzc2lnbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRDYW5jZWxOZXh0VXBGbGFnKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaFRyYW5zZm9ybWVkVG91Y2hFdmVudChldiwgZmFsc2UsIGNoaWxkLCBpZEJpdHNUb0Fzc2lnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGlsZCB3YW50cyB0byByZWNlaXZlIHRvdWNoIHdpdGhpbiBpdHMgYm91bmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RvdWNoVGFyZ2V0ID0gYWRkVG91Y2hUYXJnZXQoY2hpbGQsIGlkQml0c1RvQXNzaWduKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5RGlzcGF0Y2hlZFRvTmV3VG91Y2hUYXJnZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5ld1RvdWNoVGFyZ2V0ID09IG51bGwgJiYgbUZpcnN0VG91Y2hUYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBEaWQgbm90IGZpbmQgYSBjaGlsZCB0byByZWNlaXZlIHRoZSBldmVudC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIHRoZSBwb2ludGVyIHRvIHRoZSBsZWFzdCByZWNlbnRseSBhZGRlZCB0YXJnZXQuCisgICAgICAgICAgICAgICAgICAgIG5ld1RvdWNoVGFyZ2V0ID0gbUZpcnN0VG91Y2hUYXJnZXQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdUb3VjaFRhcmdldC5uZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RvdWNoVGFyZ2V0ID0gbmV3VG91Y2hUYXJnZXQubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXdUb3VjaFRhcmdldC5wb2ludGVySWRCaXRzIHw9IGlkQml0c1RvQXNzaWduOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW4gaXNVcE9yQ2FuY2VsID0gKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHx8Ci0gICAgICAgICAgICAgICAgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKLQotICAgICAgICBpZiAoaXNVcE9yQ2FuY2VsKSB7Ci0gICAgICAgICAgICAvLyBOb3RlLCB3ZSd2ZSBhbHJlYWR5IGNvcGllZCB0aGUgcHJldmlvdXMgc3RhdGUgdG8gb3VyIGxvY2FsCi0gICAgICAgICAgICAvLyB2YXJpYWJsZSwgc28gdGhpcyB0YWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgZXZlbnQKLSAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVDsKKyAgICAgICAgLy8gRGlzcGF0Y2ggdG8gdG91Y2ggdGFyZ2V0cy4KKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CisgICAgICAgIGlmIChtRmlyc3RUb3VjaFRhcmdldCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBObyB0b3VjaCB0YXJnZXRzIHNvIHRyZWF0IHRoaXMgYXMgYW4gb3JkaW5hcnkgdmlldy4KKyAgICAgICAgICAgIGhhbmRsZWQgPSBkaXNwYXRjaFRyYW5zZm9ybWVkVG91Y2hFdmVudChldiwgY2FuY2VsZWQsIG51bGwsCisgICAgICAgICAgICAgICAgICAgIFRvdWNoVGFyZ2V0LkFMTF9QT0lOVEVSX0lEUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEaXNwYXRjaCB0byB0b3VjaCB0YXJnZXRzLCBleGNsdWRpbmcgdGhlIG5ldyB0b3VjaCB0YXJnZXQgaWYgd2UgYWxyZWFkeQorICAgICAgICAgICAgLy8gZGlzcGF0Y2hlZCB0byBpdC4gIENhbmNlbCB0b3VjaCB0YXJnZXRzIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIFRvdWNoVGFyZ2V0IHByZWRlY2Vzc29yID0gbnVsbDsKKyAgICAgICAgICAgIFRvdWNoVGFyZ2V0IHRhcmdldCA9IG1GaXJzdFRvdWNoVGFyZ2V0OworICAgICAgICAgICAgd2hpbGUgKHRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVG91Y2hUYXJnZXQgbmV4dCA9IHRhcmdldC5uZXh0OworICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5RGlzcGF0Y2hlZFRvTmV3VG91Y2hUYXJnZXQgJiYgdGFyZ2V0ID09IG5ld1RvdWNoVGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuY2VsQ2hpbGQgPSByZXNldENhbmNlbE5leHRVcEZsYWcodGFyZ2V0LmNoaWxkKSB8fCBpbnRlcmNlcHRlZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoVHJhbnNmb3JtZWRUb3VjaEV2ZW50KGV2LCBjYW5jZWxDaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuY2hpbGQsIHRhcmdldC5wb2ludGVySWRCaXRzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmNlbENoaWxkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZGVjZXNzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFRvdWNoVGFyZ2V0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3IubmV4dCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yID0gdGFyZ2V0OworICAgICAgICAgICAgICAgIHRhcmdldCA9IG5leHQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUaGUgZXZlbnQgd2Fzbid0IGFuIEFDVElPTl9ET1dOLCBkaXNwYXRjaCBpdCB0byBvdXIgdGFyZ2V0IGlmCi0gICAgICAgIC8vIHdlIGhhdmUgb25lLgotICAgICAgICBmaW5hbCBWaWV3IHRhcmdldCA9IG1Nb3Rpb25UYXJnZXQ7Ci0gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIHRhcmdldCwgdGhpcyBtZWFucyB3ZSdyZSBoYW5kbGluZyB0aGUKLSAgICAgICAgICAgIC8vIGV2ZW50IGFzIGEgcmVndWxhciB2aWV3LgotICAgICAgICAgICAgZXYuc2V0TG9jYXRpb24oeGYsIHlmKTsKLSAgICAgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIENBTkNFTF9ORVhUX1VQX0VWRU5UKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOwotICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudChldik7CisgICAgICAgIC8vIFVwZGF0ZSBsaXN0IG9mIHRvdWNoIHRhcmdldHMgZm9yIHBvaW50ZXIgdXAgb3IgY2FuY2VsLCBpZiBuZWVkZWQuCisgICAgICAgIGlmIChjYW5jZWxlZCB8fCBhY3Rpb25NYXNrZWQgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICByZXNldFRvdWNoU3RhdGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcGxpdCAmJiBhY3Rpb25NYXNrZWQgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb25JbmRleCA9IGV2LmdldEFjdGlvbkluZGV4KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgaWRCaXRzVG9SZW1vdmUgPSAxIDw8IGV2LmdldFBvaW50ZXJJZChhY3Rpb25JbmRleCk7CisgICAgICAgICAgICByZW1vdmVQb2ludGVyc0Zyb21Ub3VjaFRhcmdldHMoaWRCaXRzVG9SZW1vdmUpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gaWYgaGF2ZSBhIHRhcmdldCwgc2VlIGlmIHdlJ3JlIGFsbG93ZWQgdG8gYW5kIHdhbnQgdG8gaW50ZXJjZXB0IGl0cwotICAgICAgICAvLyBldmVudHMKLSAgICAgICAgaWYgKCFkaXNhbGxvd0ludGVyY2VwdCAmJiBvbkludGVyY2VwdFRvdWNoRXZlbnQoZXYpKSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB5YyA9IHNjcm9sbGVkWUZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubVRvcDsKLSAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOwotICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOwotICAgICAgICAgICAgZXYuc2V0TG9jYXRpb24oeGMsIHljKTsKLSAgICAgICAgICAgIGlmICghdGFyZ2V0LmRpc3BhdGNoVG91Y2hFdmVudChldikpIHsKLSAgICAgICAgICAgICAgICAvLyB0YXJnZXQgZGlkbid0IGhhbmRsZSBBQ1RJT05fQ0FOQ0VMLiBub3QgbXVjaCB3ZSBjYW4gZG8KLSAgICAgICAgICAgICAgICAvLyBidXQgdGhleSBzaG91bGQgaGF2ZS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNsZWFyIHRoZSB0YXJnZXQKLSAgICAgICAgICAgIG1Nb3Rpb25UYXJnZXQgPSBudWxsOwotICAgICAgICAgICAgLy8gRG9uJ3QgZGlzcGF0Y2ggdGhpcyBldmVudCB0byBvdXIgb3duIHZpZXcsIGJlY2F1c2Ugd2UgYWxyZWFkeQotICAgICAgICAgICAgLy8gc2F3IGl0IHdoZW4gaW50ZXJjZXB0aW5nOyB3ZSBqdXN0IHdhbnQgdG8gZ2l2ZSB0aGUgZm9sbG93aW5nCi0gICAgICAgICAgICAvLyBldmVudCB0byB0aGUgbm9ybWFsIG9uVG91Y2hFdmVudCgpLgorICAgICAgICByZXR1cm4gaGFuZGxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgYWxsIHRvdWNoIHN0YXRlIGluIHByZXBhcmF0aW9uIGZvciBhIG5ldyBjeWNsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzZXRUb3VjaFN0YXRlKCkgeworICAgICAgICBjbGVhclRvdWNoVGFyZ2V0cygpOworICAgICAgICByZXNldENhbmNlbE5leHRVcEZsYWcodGhpcyk7CisgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGNhbmNlbCBuZXh0IHVwIGZsYWcuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmbGFnIHdhcyBwcmV2aW91c2x5IHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzZXRDYW5jZWxOZXh0VXBGbGFnKFZpZXcgdmlldykgeworICAgICAgICBpZiAoKHZpZXcubVByaXZhdGVGbGFncyAmIENBTkNFTF9ORVhUX1VQX0VWRU5UKSAhPSAwKSB7CisgICAgICAgICAgICB2aWV3Lm1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgICAgICBpZiAoaXNVcE9yQ2FuY2VsKSB7Ci0gICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgYWxsIHRvdWNoIHRhcmdldHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyVG91Y2hUYXJnZXRzKCkgeworICAgICAgICBUb3VjaFRhcmdldCB0YXJnZXQgPSBtRmlyc3RUb3VjaFRhcmdldDsKKyAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgVG91Y2hUYXJnZXQgbmV4dCA9IHRhcmdldC5uZXh0OworICAgICAgICAgICAgICAgIHRhcmdldC5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV4dDsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRhcmdldCAhPSBudWxsKTsKKyAgICAgICAgICAgIG1GaXJzdFRvdWNoVGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbHMgYW5kIGNsZWFycyBhbGwgdG91Y2ggdGFyZ2V0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2FuY2VsQW5kQ2xlYXJUb3VjaFRhcmdldHMoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKG1GaXJzdFRvdWNoVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc3ludGhldGljRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBldmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbihub3csIG5vdywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwsIDAuMGYsIDAuMGYsIDApOworICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V2ZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChUb3VjaFRhcmdldCB0YXJnZXQgPSBtRmlyc3RUb3VjaFRhcmdldDsgdGFyZ2V0ICE9IG51bGw7IHRhcmdldCA9IHRhcmdldC5uZXh0KSB7CisgICAgICAgICAgICAgICAgcmVzZXRDYW5jZWxOZXh0VXBGbGFnKHRhcmdldC5jaGlsZCk7CisgICAgICAgICAgICAgICAgZGlzcGF0Y2hUcmFuc2Zvcm1lZFRvdWNoRXZlbnQoZXZlbnQsIHRydWUsIHRhcmdldC5jaGlsZCwgdGFyZ2V0LnBvaW50ZXJJZEJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xlYXJUb3VjaFRhcmdldHMoKTsKKworICAgICAgICAgICAgaWYgKHN5bnRoZXRpY0V2ZW50KSB7CisgICAgICAgICAgICAgICAgZXZlbnQucmVjeWNsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdG91Y2ggdGFyZ2V0IGZvciBzcGVjaWZpZWQgY2hpbGQgdmlldy4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgVG91Y2hUYXJnZXQgZ2V0VG91Y2hUYXJnZXQoVmlldyBjaGlsZCkgeworICAgICAgICBmb3IgKFRvdWNoVGFyZ2V0IHRhcmdldCA9IG1GaXJzdFRvdWNoVGFyZ2V0OyB0YXJnZXQgIT0gbnVsbDsgdGFyZ2V0ID0gdGFyZ2V0Lm5leHQpIHsKKyAgICAgICAgICAgIGlmICh0YXJnZXQuY2hpbGQgPT0gY2hpbGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSB0b3VjaCB0YXJnZXQgZm9yIHNwZWNpZmllZCBjaGlsZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LgorICAgICAqIEFzc3VtZXMgdGhlIHRhcmdldCBjaGlsZCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LgorICAgICAqLworICAgIHByaXZhdGUgVG91Y2hUYXJnZXQgYWRkVG91Y2hUYXJnZXQoVmlldyBjaGlsZCwgaW50IHBvaW50ZXJJZEJpdHMpIHsKKyAgICAgICAgVG91Y2hUYXJnZXQgdGFyZ2V0ID0gVG91Y2hUYXJnZXQub2J0YWluKGNoaWxkLCBwb2ludGVySWRCaXRzKTsKKyAgICAgICAgdGFyZ2V0Lm5leHQgPSBtRmlyc3RUb3VjaFRhcmdldDsKKyAgICAgICAgbUZpcnN0VG91Y2hUYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgcG9pbnRlciBpZHMgZnJvbSBjb25zaWRlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZW1vdmVQb2ludGVyc0Zyb21Ub3VjaFRhcmdldHMoaW50IHBvaW50ZXJJZEJpdHMpIHsKKyAgICAgICAgVG91Y2hUYXJnZXQgcHJlZGVjZXNzb3IgPSBudWxsOworICAgICAgICBUb3VjaFRhcmdldCB0YXJnZXQgPSBtRmlyc3RUb3VjaFRhcmdldDsKKyAgICAgICAgd2hpbGUgKHRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBUb3VjaFRhcmdldCBuZXh0ID0gdGFyZ2V0Lm5leHQ7CisgICAgICAgICAgICBpZiAoKHRhcmdldC5wb2ludGVySWRCaXRzICYgcG9pbnRlcklkQml0cykgIT0gMCkgeworICAgICAgICAgICAgICAgIHRhcmdldC5wb2ludGVySWRCaXRzICY9IH5wb2ludGVySWRCaXRzOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucG9pbnRlcklkQml0cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVkZWNlc3NvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RUb3VjaFRhcmdldCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3Nvci5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmVkZWNlc3NvciA9IHRhcmdldDsKKyAgICAgICAgICAgIHRhcmdldCA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBjaGlsZCB2aWV3IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcG9pbnQgd2hlbiB0cmFuc2Zvcm1lZAorICAgICAqIGludG8gaXRzIGNvb3JkaW5hdGUgc3BhY2UuCisgICAgICogQ2hpbGQgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNUcmFuc2Zvcm1lZFRvdWNoUG9pbnRJblZpZXcoZmxvYXQgeCwgZmxvYXQgeSwgVmlldyBjaGlsZCwKKyAgICAgICAgICAgIFBvaW50RiBvdXRMb2NhbFBvaW50KSB7CisgICAgICAgIGZsb2F0IGxvY2FsWCA9IHggKyBtU2Nyb2xsWCAtIGNoaWxkLm1MZWZ0OworICAgICAgICBmbG9hdCBsb2NhbFkgPSB5ICsgbVNjcm9sbFkgLSBjaGlsZC5tVG9wOworICAgICAgICBpZiAoISBjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgIGxvY2FsWFlbMF0gPSBsb2NhbFg7CisgICAgICAgICAgICBsb2NhbFhZWzFdID0gbG9jYWxZOworICAgICAgICAgICAgY2hpbGQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgIGxvY2FsWCA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICBsb2NhbFkgPSBsb2NhbFhZWzFdOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNJblZpZXcgPSBjaGlsZC5wb2ludEluVmlldyhsb2NhbFgsIGxvY2FsWSk7CisgICAgICAgIGlmIChpc0luVmlldyAmJiBvdXRMb2NhbFBvaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dExvY2FsUG9pbnQuc2V0KGxvY2FsWCwgbG9jYWxZKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNJblZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhIG1vdGlvbiBldmVudCBpbnRvIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIGEgcGFydGljdWxhciBjaGlsZCB2aWV3LAorICAgICAqIGZpbHRlcnMgb3V0IGlycmVsZXZhbnQgcG9pbnRlciBpZHMsIGFuZCBvdmVycmlkZXMgaXRzIGFjdGlvbiBpZiBuZWNlc3NhcnkuCisgICAgICogSWYgY2hpbGQgaXMgbnVsbCwgYXNzdW1lcyB0aGUgTW90aW9uRXZlbnQgd2lsbCBiZSBzZW50IHRvIHRoaXMgVmlld0dyb3VwIGluc3RlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3BhdGNoVHJhbnNmb3JtZWRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50LCBib29sZWFuIGNhbmNlbCwKKyAgICAgICAgICAgIFZpZXcgY2hpbGQsIGludCBkZXNpcmVkUG9pbnRlcklkQml0cykgeworICAgICAgICBmaW5hbCBib29sZWFuIGhhbmRsZWQ7CisKKyAgICAgICAgLy8gQ2FuY2VsaW5nIG1vdGlvbnMgaXMgYSBzcGVjaWFsIGNhc2UuICBXZSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gYW55IHRyYW5zZm9ybWF0aW9ucworICAgICAgICAvLyBvciBmaWx0ZXJpbmcuICBUaGUgaW1wb3J0YW50IHBhcnQgaXMgdGhlIGFjdGlvbiwgbm90IHRoZSBjb250ZW50cy4KKyAgICAgICAgZmluYWwgaW50IG9sZEFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworICAgICAgICBpZiAoY2FuY2VsIHx8IG9sZEFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKSB7CisgICAgICAgICAgICBldmVudC5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7CisgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBzdXBlci5kaXNwYXRjaFRvdWNoRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVkID0gY2hpbGQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV2ZW50LnNldEFjdGlvbihvbGRBY3Rpb24pOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBmaW5hbGx5IG9mZnNldCB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCdzIGNvb3JkaW5hdGUgc3lzdGVtIGFuZAotICAgICAgICAvLyBkaXNwYXRjaCB0aGUgZXZlbnQuCi0gICAgICAgIGZpbmFsIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tTGVmdDsKLSAgICAgICAgZmluYWwgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7Ci0gICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7Ci0KLSAgICAgICAgaWYgKCh0YXJnZXQubVByaXZhdGVGbGFncyAmIENBTkNFTF9ORVhUX1VQX0VWRU5UKSAhPSAwKSB7Ci0gICAgICAgICAgICBldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7Ci0gICAgICAgICAgICB0YXJnZXQubVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7Ci0gICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcG9pbnRlcnMgdG8gZGVsaXZlci4KKyAgICAgICAgZmluYWwgaW50IG9sZFBvaW50ZXJDb3VudCA9IGV2ZW50LmdldFBvaW50ZXJDb3VudCgpOworICAgICAgICBpbnQgbmV3UG9pbnRlckNvdW50ID0gMDsKKyAgICAgICAgaWYgKGRlc2lyZWRQb2ludGVySWRCaXRzID09IFRvdWNoVGFyZ2V0LkFMTF9QT0lOVEVSX0lEUykgeworICAgICAgICAgICAgbmV3UG9pbnRlckNvdW50ID0gb2xkUG9pbnRlckNvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRQb2ludGVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb2ludGVySWQgPSBldmVudC5nZXRQb2ludGVySWQoaSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvaW50ZXJJZEJpdCA9IDEgPDwgcG9pbnRlcklkOworICAgICAgICAgICAgICAgIGlmICgocG9pbnRlcklkQml0ICYgZGVzaXJlZFBvaW50ZXJJZEJpdHMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3UG9pbnRlckNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHRhcmdldC5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpOworICAgICAgICAvLyBJZiBmb3Igc29tZSByZWFzb24gd2UgZW5kZWQgdXAgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlIHdoZXJlIGl0IGxvb2tzIGxpa2Ugd2UKKyAgICAgICAgLy8gbWlnaHQgcHJvZHVjZSBhIG1vdGlvbiBldmVudCB3aXRoIG5vIHBvaW50ZXJzIGluIGl0LCB0aGVuIGRyb3AgdGhlIGV2ZW50LgorICAgICAgICBpZiAobmV3UG9pbnRlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBudW1iZXIgb2YgcG9pbnRlcnMgaXMgdGhlIHNhbWUgYW5kIHdlIGRvbid0IG5lZWQgdG8gcGVyZm9ybSBhbnkgZmFuY3kKKyAgICAgICAgLy8gaXJyZXZlcnNpYmxlIHRyYW5zZm9ybWF0aW9ucywgdGhlbiB3ZSBjYW4gcmV1c2UgdGhlIG1vdGlvbiBldmVudCBmb3IgdGhpcworICAgICAgICAvLyBkaXNwYXRjaCBhcyBsb25nIGFzIHdlIGFyZSBjYXJlZnVsIHRvIHJldmVydCBhbnkgY2hhbmdlcyB3ZSBtYWtlLgorICAgICAgICBmaW5hbCBib29sZWFuIHJldXNlID0gbmV3UG9pbnRlckNvdW50ID09IG9sZFBvaW50ZXJDb3VudAorICAgICAgICAgICAgICAgICYmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmhhc0lkZW50aXR5TWF0cml4KCkpOworICAgICAgICBpZiAocmV1c2UpIHsKKyAgICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudChldmVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IG9mZnNldFggPSBtU2Nyb2xsWCAtIGNoaWxkLm1MZWZ0OworICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IG9mZnNldFkgPSBtU2Nyb2xsWSAtIGNoaWxkLm1Ub3A7CisgICAgICAgICAgICAgICAgZXZlbnQub2Zmc2V0TG9jYXRpb24ob2Zmc2V0WCwgb2Zmc2V0WSk7CisKKyAgICAgICAgICAgICAgICBoYW5kbGVkID0gY2hpbGQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2ZW50KTsKKworICAgICAgICAgICAgICAgIGV2ZW50Lm9mZnNldExvY2F0aW9uKC1vZmZzZXRYLCAtb2Zmc2V0WSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBldmVudC4KKyAgICAgICAgLy8gSWYgdGhlIG51bWJlciBvZiBwb2ludGVycyBpcyBkaWZmZXJlbnQsIHRoZW4gd2UgbmVlZCB0byBmaWx0ZXIgb3V0IGlycmVsZXZhbnQgcG9pbnRlcnMKKyAgICAgICAgLy8gYXMgd2UgbWFrZSBhIGNvcHkgb2YgdGhlIG1vdGlvbiBldmVudC4KKyAgICAgICAgTW90aW9uRXZlbnQgdHJhbnNmb3JtZWRFdmVudDsKKyAgICAgICAgaWYgKG5ld1BvaW50ZXJDb3VudCA9PSBvbGRQb2ludGVyQ291bnQpIHsKKyAgICAgICAgICAgIHRyYW5zZm9ybWVkRXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4oZXZlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3Jvd1RtcFBvaW50ZXJBcnJheXMobmV3UG9pbnRlckNvdW50KTsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIG5ld1BvaW50ZXJJbmRleE1hcCA9IG1UbXBQb2ludGVySW5kZXhNYXA7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBuZXdQb2ludGVySWRzID0gbVRtcFBvaW50ZXJJZHM7CisgICAgICAgICAgICBmaW5hbCBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW10gbmV3UG9pbnRlckNvb3JkcyA9IG1UbXBQb2ludGVyQ29vcmRzOworCisgICAgICAgICAgICBpbnQgbmV3UG9pbnRlckluZGV4ID0gMDsKKyAgICAgICAgICAgIGludCBvbGRQb2ludGVySW5kZXggPSAwOworICAgICAgICAgICAgd2hpbGUgKG5ld1BvaW50ZXJJbmRleCA8IG5ld1BvaW50ZXJDb3VudCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb2ludGVySWQgPSBldmVudC5nZXRQb2ludGVySWQob2xkUG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9pbnRlcklkQml0cyA9IDEgPDwgcG9pbnRlcklkOworICAgICAgICAgICAgICAgIGlmICgocG9pbnRlcklkQml0cyAmIGRlc2lyZWRQb2ludGVySWRCaXRzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1BvaW50ZXJJbmRleE1hcFtuZXdQb2ludGVySW5kZXhdID0gb2xkUG9pbnRlckluZGV4OworICAgICAgICAgICAgICAgICAgICBuZXdQb2ludGVySWRzW25ld1BvaW50ZXJJbmRleF0gPSBwb2ludGVySWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdQb2ludGVyQ29vcmRzW25ld1BvaW50ZXJJbmRleF0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9pbnRlckNvb3Jkc1tuZXdQb2ludGVySW5kZXhdID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5ld1BvaW50ZXJJbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbGRQb2ludGVySW5kZXggKz0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IG5ld0FjdGlvbjsKKyAgICAgICAgICAgIGlmIChjYW5jZWwpIHsKKyAgICAgICAgICAgICAgICBuZXdBY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkTWFza2VkQWN0aW9uID0gb2xkQWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7CisgICAgICAgICAgICAgICAgaWYgKG9sZE1hc2tlZEFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBvbGRNYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNoYW5nZWRQb2ludGVySWQgPSBldmVudC5nZXRQb2ludGVySWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZEFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0lOREVYX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9JTkRFWF9TSElGVCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGFuZ2VkUG9pbnRlcklkQml0cyA9IDEgPDwgY2hhbmdlZFBvaW50ZXJJZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VkUG9pbnRlcklkQml0cyAmIGRlc2lyZWRQb2ludGVySWRCaXRzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UG9pbnRlckNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QvbGFzdCBwb2ludGVyIHdlbnQgZG93bi91cC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBY3Rpb24gPSBvbGRNYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiA6IE1vdGlvbkV2ZW50LkFDVElPTl9VUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzZWNvbmRhcnkgcG9pbnRlciB3ZW50IGRvd24vdXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0NoYW5nZWRQb2ludGVySW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdQb2ludGVySWRzW25ld0NoYW5nZWRQb2ludGVySW5kZXhdICE9IGNoYW5nZWRQb2ludGVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hhbmdlZFBvaW50ZXJJbmRleCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBY3Rpb24gPSBvbGRNYXNrZWRBY3Rpb24gfCAobmV3Q2hhbmdlZFBvaW50ZXJJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSU5ERVhfU0hJRlQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW4gdW5yZWxhdGVkIHBvaW50ZXIgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlIHVwL2Rvd24vY2FuY2VsL21vdmUgbW90aW9uIGFjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgbmV3QWN0aW9uID0gb2xkTWFza2VkQWN0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhbnNmb3JtZWRFdmVudCA9IG51bGw7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGlzdG9yeVNpemUgPSBldmVudC5nZXRIaXN0b3J5U2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaGlzdG9yeUluZGV4ID0gMDsgaGlzdG9yeUluZGV4IDw9IGhpc3RvcnlTaXplOyBoaXN0b3J5SW5kZXgrKykgeworICAgICAgICAgICAgICAgIGZvciAobmV3UG9pbnRlckluZGV4ID0gMDsgbmV3UG9pbnRlckluZGV4IDwgbmV3UG9pbnRlckNvdW50OyBuZXdQb2ludGVySW5kZXgrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzIGMgPSBuZXdQb2ludGVyQ29vcmRzW25ld1BvaW50ZXJJbmRleF07CisgICAgICAgICAgICAgICAgICAgIG9sZFBvaW50ZXJJbmRleCA9IG5ld1BvaW50ZXJJbmRleE1hcFtuZXdQb2ludGVySW5kZXhdOworICAgICAgICAgICAgICAgICAgICBpZiAoaGlzdG9yeUluZGV4ICE9IGhpc3RvcnlTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRIaXN0b3JpY2FsUG9pbnRlckNvb3JkcyhvbGRQb2ludGVySW5kZXgsIGhpc3RvcnlJbmRleCwgYyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRQb2ludGVyQ29vcmRzKG9sZFBvaW50ZXJJbmRleCwgYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGV2ZW50VGltZTsKKyAgICAgICAgICAgICAgICBpZiAoaGlzdG9yeUluZGV4ICE9IGhpc3RvcnlTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50VGltZSA9IGV2ZW50LmdldEhpc3RvcmljYWxFdmVudFRpbWUoaGlzdG9yeUluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBldmVudFRpbWUgPSBldmVudC5nZXRFdmVudFRpbWUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtZWRFdmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkRXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RG93blRpbWUoKSwgZXZlbnRUaW1lLCBuZXdBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9pbnRlckNvdW50LCBuZXdQb2ludGVySWRzLCBuZXdQb2ludGVyQ29vcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE1ldGFTdGF0ZSgpLCBldmVudC5nZXRYUHJlY2lzaW9uKCksIGV2ZW50LmdldFlQcmVjaXNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXREZXZpY2VJZCgpLCBldmVudC5nZXRFZGdlRmxhZ3MoKSwgZXZlbnQuZ2V0U291cmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmxhZ3MoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRFdmVudC5hZGRCYXRjaChldmVudFRpbWUsIG5ld1BvaW50ZXJDb29yZHMsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSB0cmFuc2Zvcm1hdGlvbnMgYW5kIGRpc3BhdGNoLgorICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgaGFuZGxlZCA9IHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudCh0cmFuc2Zvcm1lZEV2ZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IG9mZnNldFggPSBtU2Nyb2xsWCAtIGNoaWxkLm1MZWZ0OworICAgICAgICAgICAgZmluYWwgZmxvYXQgb2Zmc2V0WSA9IG1TY3JvbGxZIC0gY2hpbGQubVRvcDsKKyAgICAgICAgICAgIHRyYW5zZm9ybWVkRXZlbnQub2Zmc2V0TG9jYXRpb24ob2Zmc2V0WCwgb2Zmc2V0WSk7CisgICAgICAgICAgICBpZiAoISBjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRFdmVudC50cmFuc2Zvcm0oY2hpbGQuZ2V0SW52ZXJzZU1hdHJpeCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlZCA9IGNoaWxkLmRpc3BhdGNoVG91Y2hFdmVudCh0cmFuc2Zvcm1lZEV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERvbmUuCisgICAgICAgIHRyYW5zZm9ybWVkRXZlbnQucmVjeWNsZSgpOworICAgICAgICByZXR1cm4gaGFuZGxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmxhcmdlIHRoZSB0ZW1wb3JhcnkgcG9pbnRlciBhcnJheXMgZm9yIHNwbGl0dGluZyBwb2ludGVycy4KKyAgICAgKiBNYXkgZGlzY2FyZCBjb250ZW50cyAoYnV0IGtlZXBzIFBvaW50ZXJDb29yZHMgb2JqZWN0cyB0byBhdm9pZCByZWFsbG9jYXRpbmcgdGhlbSkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdyb3dUbXBQb2ludGVyQXJyYXlzKGludCBkZXNpcmVkQ2FwYWNpdHkpIHsKKyAgICAgICAgZmluYWwgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIG9sZFRtcFBvaW50ZXJDb29yZHMgPSBtVG1wUG9pbnRlckNvb3JkczsKKyAgICAgICAgaW50IGNhcGFjaXR5OworICAgICAgICBpZiAob2xkVG1wUG9pbnRlckNvb3JkcyAhPSBudWxsKSB7CisgICAgICAgICAgICBjYXBhY2l0eSA9IG9sZFRtcFBvaW50ZXJDb29yZHMubGVuZ3RoOworICAgICAgICAgICAgaWYgKGRlc2lyZWRDYXBhY2l0eSA8PSBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhcGFjaXR5ID0gNDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChjYXBhY2l0eSA8IGRlc2lyZWRDYXBhY2l0eSkgeworICAgICAgICAgICAgY2FwYWNpdHkgKj0gMjsKKyAgICAgICAgfQorCisgICAgICAgIG1UbXBQb2ludGVySW5kZXhNYXAgPSBuZXcgaW50W2NhcGFjaXR5XTsKKyAgICAgICAgbVRtcFBvaW50ZXJJZHMgPSBuZXcgaW50W2NhcGFjaXR5XTsKKyAgICAgICAgbVRtcFBvaW50ZXJDb29yZHMgPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tjYXBhY2l0eV07CisKKyAgICAgICAgaWYgKG9sZFRtcFBvaW50ZXJDb29yZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvbGRUbXBQb2ludGVyQ29vcmRzLCAwLCBtVG1wUG9pbnRlckNvb3JkcywgMCwKKyAgICAgICAgICAgICAgICAgICAgb2xkVG1wUG9pbnRlckNvb3Jkcy5sZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwbGl0dGluZyBvZiBNb3Rpb25FdmVudHMgdG8gbXVsdGlwbGUgY2hpbGRyZW4gZHVyaW5nIHRvdWNoIGV2ZW50CisgICAgICogZGlzcGF0Y2guIFRoaXMgYmVoYXZpb3IgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIDxwPldoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBNb3Rpb25FdmVudHMgbWF5IGJlIHNwbGl0IGFuZCBkaXNwYXRjaGVkIHRvIGRpZmZlcmVudCBjaGlsZAorICAgICAqIHZpZXdzIGRlcGVuZGluZyBvbiB3aGVyZSBlYWNoIHBvaW50ZXIgaW5pdGlhbGx5IHdlbnQgZG93bi4gVGhpcyBhbGxvd3MgZm9yIHVzZXIgaW50ZXJhY3Rpb25zCisgICAgICogc3VjaCBhcyBzY3JvbGxpbmcgdHdvIHBhbmVzIG9mIGNvbnRlbnQgaW5kZXBlbmRlbnRseSwgY2hvcmRpbmcgb2YgYnV0dG9ucywgYW5kIHBlcmZvcm1pbmcKKyAgICAgKiBpbmRlcGVuZGVudCBnZXN0dXJlcyBvbiBkaWZmZXJlbnQgcGllY2VzIG9mIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BsaXQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb3cgTW90aW9uRXZlbnRzIHRvIGJlIHNwbGl0IGFuZCBkaXNwYXRjaGVkIHRvIG11bHRpcGxlCisgICAgICogICAgICAgICAgICAgIGNoaWxkIHZpZXdzLiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb25seSBhbGxvdyBvbmUgY2hpbGQgdmlldyB0byBiZSB0aGUgdGFyZ2V0IG9mCisgICAgICogICAgICAgICAgICAgIGFueSBNb3Rpb25FdmVudCByZWNlaXZlZCBieSB0aGlzIFZpZXdHcm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoYm9vbGVhbiBzcGxpdCkgeworICAgICAgICAvLyBUT0RPIEFwcGxpY2F0aW9ucyByZWFsbHkgc2hvdWxkbid0IGNoYW5nZSB0aGlzIHNldHRpbmcgbWlkLXRvdWNoIGV2ZW50LAorICAgICAgICAvLyBidXQgcGVyaGFwcyB0aGlzIHNob3VsZCBoYW5kbGUgdGhhdCBjYXNlIGFuZCBzZW5kIEFDVElPTl9DQU5DRUxzIHRvIGFueSBjaGlsZCB2aWV3cworICAgICAgICAvLyB3aXRoIGdlc3R1cmVzIGluIHByb2dyZXNzIHdoZW4gdGhpcyBpcyBjaGFuZ2VkLgorICAgICAgICBpZiAoc3BsaXQpIHsKKyAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX1NQTElUX01PVElPTl9FVkVOVFM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgTW90aW9uRXZlbnRzIGRpc3BhdGNoZWQgdG8gdGhpcyBWaWV3R3JvdXAgY2FuIGJlIHNwbGl0IHRvIG11bHRpcGxlIGNoaWxkcmVuLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gKG1Hcm91cEZsYWdzICYgRkxBR19TUExJVF9NT1RJT05fRVZFTlRTKSA9PSBGTEFHX1NQTElUX01PVElPTl9FVkVOVFM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTQyLDE5ICsxNzU4LDEyIEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgdm9pZCBkaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBhIG1vdGlvbiB0YXJnZXQsIHdlIGFyZSBzdGlsbCBpbiB0aGUgcHJvY2VzcyBvZgorICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIGEgdG91Y2ggdGFyZ2V0LCB3ZSBhcmUgc3RpbGwgaW4gdGhlIHByb2Nlc3Mgb2YKICAgICAgICAgLy8gZGlzcGF0Y2hpbmcgbW90aW9uIGV2ZW50cyB0byBhIGNoaWxkOyB3ZSBuZWVkIHRvIGdldCByaWQgb2YgdGhhdAogICAgICAgICAvLyBjaGlsZCB0byBhdm9pZCBkaXNwYXRjaGluZyBldmVudHMgdG8gaXQgYWZ0ZXIgdGhlIHdpbmRvdyBpcyB0b3JuCiAgICAgICAgIC8vIGRvd24uIFRvIG1ha2Ugc3VyZSB3ZSBrZWVwIHRoZSBjaGlsZCBpbiBhIGNvbnNpc3RlbnQgc3RhdGUsIHdlCiAgICAgICAgIC8vIGZpcnN0IHNlbmQgaXQgYW4gQUNUSU9OX0NBTkNFTCBtb3Rpb24gZXZlbnQuCi0gICAgICAgIGlmIChtTW90aW9uVGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBmaW5hbCBNb3Rpb25FdmVudCBldmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbihub3csIG5vdywKLSAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCwgMC4wZiwgMC4wZiwgMCk7Ci0gICAgICAgICAgICBtTW90aW9uVGFyZ2V0LmRpc3BhdGNoVG91Y2hFdmVudChldmVudCk7Ci0gICAgICAgICAgICBldmVudC5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgfQorICAgICAgICBjYW5jZWxBbmRDbGVhclRvdWNoVGFyZ2V0cyhudWxsKTsKIAogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwpAQCAtMTE4Nyw3ICsxNzk2LDEwIEBACiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgY2hpbGRyZW5baV0uZGlzcGF0Y2hTYXZlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgVmlldyBjID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICBpZiAoKGMubVZpZXdGbGFncyAmIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spICE9IFBBUkVOVF9TQVZFX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgYy5kaXNwYXRjaFNhdmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyMTIsNyArMTgyNCwxMCBAQAogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGNoaWxkcmVuW2ldLmRpc3BhdGNoUmVzdG9yZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIFZpZXcgYyA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgaWYgKChjLm1WaWV3RmxhZ3MgJiBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLKSAhPSBQQVJFTlRfU0FWRV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIGMuZGlzcGF0Y2hSZXN0b3JlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDgyLDIyICsyMDk3LDI0IEBACiAgICAgICAgIGZpbmFsIGludCBmbGFncyA9IG1Hcm91cEZsYWdzOwogCiAgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OKSA9PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OKSB7Ci0gICAgICAgICAgICBpZiAobUNoaWxkVHJhbnNmb3JtYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uLmNsZWFyKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbi5jbGVhcigpOwogICAgICAgICAgICAgbUdyb3VwRmxhZ3MgJj0gfkZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047CiAgICAgICAgIH0KIAogICAgICAgICBUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1Ub0FwcGx5ID0gbnVsbDsKKyAgICAgICAgVHJhbnNmb3JtYXRpb24gaW52YWxpZGF0aW9uVHJhbnNmb3JtOwogICAgICAgICBmaW5hbCBBbmltYXRpb24gYSA9IGNoaWxkLmdldEFuaW1hdGlvbigpOwogICAgICAgICBib29sZWFuIGNvbmNhdE1hdHJpeCA9IGZhbHNlOwogCi0gICAgICAgIGlmIChhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtSW52YWxpZGF0ZVJlZ2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUludmFsaWRhdGVSZWdpb24gPSBuZXcgUmVjdEYoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFJlY3RGIHJlZ2lvbiA9IG1JbnZhbGlkYXRlUmVnaW9uOworICAgICAgICBib29sZWFuIHNjYWxpbmdSZXF1aXJlZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGNhY2hpbmcgPSBmYWxzZTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFIHx8CisgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgeworICAgICAgICAgICAgY2FjaGluZyA9IHRydWU7CisgICAgICAgICAgICBpZiAobUF0dGFjaEluZm8gIT0gbnVsbCkgc2NhbGluZ1JlcXVpcmVkID0gbUF0dGFjaEluZm8ubVNjYWxpbmdSZXF1aXJlZDsKKyAgICAgICAgfQogCisgICAgICAgIGlmIChhICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBhLmlzSW5pdGlhbGl6ZWQoKTsKICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgICAgICBhLmluaXRpYWxpemUoY3IgLSBjbCwgY2IgLSBjdCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOwpAQCAtMTUwNSwxMCArMjEyMiwxNyBAQAogICAgICAgICAgICAgICAgIGNoaWxkLm9uQW5pbWF0aW9uU3RhcnQoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oZHJhd2luZ1RpbWUsIG1DaGlsZFRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICBzY2FsaW5nUmVxdWlyZWQgPyBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZSA6IDFmKTsKKyAgICAgICAgICAgIGlmIChzY2FsaW5nUmVxdWlyZWQgJiYgbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGUgIT0gMWYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludmFsaWRhdGlvblRyYW5zZm9ybSA9IG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgICAgICAgICBhLmdldFRyYW5zZm9ybWF0aW9uKGRyYXdpbmdUaW1lLCBpbnZhbGlkYXRpb25UcmFuc2Zvcm0sIDFmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0aW9uVHJhbnNmb3JtID0gbUNoaWxkVHJhbnNmb3JtYXRpb247CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihkcmF3aW5nVGltZSwgbUNoaWxkVHJhbnNmb3JtYXRpb24pOwogICAgICAgICAgICAgdHJhbnNmb3JtVG9BcHBseSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uOwogCiAgICAgICAgICAgICBjb25jYXRNYXRyaXggPSBhLndpbGxDaGFuZ2VUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpOwpAQCAtMTUyNSw3ICsyMTQ5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKGNsLCBjdCwgY3IsIGNiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGEuZ2V0SW52YWxpZGF0ZVJlZ2lvbigwLCAwLCBjciAtIGNsLCBjYiAtIGN0LCByZWdpb24sIHRyYW5zZm9ybVRvQXBwbHkpOworICAgICAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGVSZWdpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGVSZWdpb24gPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0RiByZWdpb24gPSBtSW52YWxpZGF0ZVJlZ2lvbjsKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnZhbGlkYXRlUmVnaW9uKDAsIDAsIGNyIC0gY2wsIGNiIC0gY3QsIHJlZ2lvbiwgaW52YWxpZGF0aW9uVHJhbnNmb3JtKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hpbGQgbmVlZCB0byBkcmF3IGFuIGFuaW1hdGlvbiwgcG90ZW50aWFsbHkgb2Zmc2NyZWVuLCBzbwogICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG8gbm90IGNhbmNlbCBpbnZhbGlkYXRlIHJlcXVlc3RzCkBAIC0xNTM4LDkgKzIxNjYsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSA9PQogICAgICAgICAgICAgICAgIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSB7Ci0gICAgICAgICAgICBpZiAobUNoaWxkVHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1RyYW5zZm9ybSA9IGdldENoaWxkU3RhdGljVHJhbnNmb3JtYXRpb24oY2hpbGQsIG1DaGlsZFRyYW5zZm9ybWF0aW9uKTsKICAgICAgICAgICAgIGlmIChoYXNUcmFuc2Zvcm0pIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHJhbnNmb3JtVHlwZSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uLmdldFRyYW5zZm9ybWF0aW9uVHlwZSgpOwpAQCAtMTU1MCw2ICsyMTc1LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGNvbmNhdE1hdHJpeCB8PSAhY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKTsKKwogICAgICAgICAvLyBTZXRzIHRoZSBmbGFnIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHRvIGFsbG93IGRyYXcoKSBpbXBsZW1lbnRhdGlvbnMKICAgICAgICAgLy8gdG8gY2FsbCBpbnZhbGlkYXRlKCkgc3VjY2Vzc2Z1bGx5IHdoZW4gZG9pbmcgYW5pbWF0aW9ucwogICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzIHw9IERSQVdOOwpAQCAtMTU2NCwxNSArMjE5MSwxOSBAQAogICAgICAgICBmaW5hbCBpbnQgc3ggPSBjaGlsZC5tU2Nyb2xsWDsKICAgICAgICAgZmluYWwgaW50IHN5ID0gY2hpbGQubVNjcm9sbFk7CiAKLSAgICAgICAgYm9vbGVhbiBzY2FsaW5nUmVxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgRGlzcGxheUxpc3QgZGlzcGxheUxpc3QgPSBudWxsOwogICAgICAgICBCaXRtYXAgY2FjaGUgPSBudWxsOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUgfHwKLSAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSB7Ci0gICAgICAgICAgICBjYWNoZSA9IGNoaWxkLmdldERyYXdpbmdDYWNoZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSBzY2FsaW5nUmVxdWlyZWQgPSBtQXR0YWNoSW5mby5tU2NhbGluZ1JlcXVpcmVkOworICAgICAgICBpZiAoY2FjaGluZykgeworICAgICAgICAgICAgaWYgKCFjYW52YXMuaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjYWNoZSA9IGNoaWxkLmdldERyYXdpbmdDYWNoZSh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYnJpbmcgYmFjaworICAgICAgICAgICAgICAgIC8vIGRpc3BsYXlMaXN0ID0gY2hpbGQuZ2V0RGlzcGxheUxpc3QoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzTm9DYWNoZSA9IGNhY2hlID09IG51bGw7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzRGlzcGxheUxpc3QgPSBkaXNwbGF5TGlzdCAhPSBudWxsICYmIGRpc3BsYXlMaXN0LmlzUmVhZHkoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNOb0NhY2hlID0gY2FjaGUgPT0gbnVsbCB8fCBoYXNEaXNwbGF5TGlzdDsKIAogICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZVRvID0gY2FudmFzLnNhdmUoKTsKICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKQEAgLTE1ODYsNDAgKzIyMTcsNjAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IGFscGhhID0gMS4wZjsKKyAgICAgICAgZmxvYXQgYWxwaGEgPSBjaGlsZC5nZXRBbHBoYSgpOwogCi0gICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb25jYXRNYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBpbnQgdHJhbnNYID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgdHJhbnNZID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoaGFzTm9DYWNoZSkgewotICAgICAgICAgICAgICAgICAgICB0cmFuc1ggPSAtc3g7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zWSA9IC1zeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVW5kbyB0aGUgc2Nyb2xsIHRyYW5zbGF0aW9uLCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LAotICAgICAgICAgICAgICAgIC8vIHRoZW4gcmVkbyB0aGUgc2Nyb2xsIHRyYW5zbGF0ZSB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LgotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXRyYW5zWCwgLXRyYW5zWSk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmNvbmNhdCh0cmFuc2Zvcm1Ub0FwcGx5LmdldE1hdHJpeCgpKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHRyYW5zWCwgdHJhbnNZKTsKLSAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICBpZiAodHJhbnNmb3JtVG9BcHBseSAhPSBudWxsIHx8IGFscGhhIDwgMS4wZiB8fCAhY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgaW50IHRyYW5zWCA9IDA7CisgICAgICAgICAgICBpbnQgdHJhbnNZID0gMDsKKworICAgICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICB0cmFuc1ggPSAtc3g7CisgICAgICAgICAgICAgICAgdHJhbnNZID0gLXN5OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhbHBoYSA9IHRyYW5zZm9ybVRvQXBwbHkuZ2V0QWxwaGEoKTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uY2F0TWF0cml4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVuZG8gdGhlIHNjcm9sbCB0cmFuc2xhdGlvbiwgYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZWRvIHRoZSBzY3JvbGwgdHJhbnNsYXRlIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHQuCisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXRyYW5zWCwgLXRyYW5zWSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5jb25jYXQodHJhbnNmb3JtVG9BcHBseS5nZXRNYXRyaXgoKSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHJhbnNYLCB0cmFuc1kpOworICAgICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZsb2F0IHRyYW5zZm9ybUFscGhhID0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1BbHBoYSA8IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgKj0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtdHJhbnNYLCAtdHJhbnNZKTsKKyAgICAgICAgICAgICAgICBjYW52YXMuY29uY2F0KGNoaWxkLmdldE1hdHJpeCgpKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHRyYW5zWCwgdHJhbnNZKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGFscGhhIDwgMS4wZikgewogICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbHBoYSA8IDEuMGYgJiYgaGFzTm9DYWNoZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBtdWx0aXBsaWVkQWxwaGEgPSAoaW50KSAoMjU1ICogYWxwaGEpOwotICAgICAgICAgICAgICAgIGlmICghY2hpbGQub25TZXRBbHBoYShtdWx0aXBsaWVkQWxwaGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYShzeCwgc3ksIHN4ICsgY3IgLSBjbCwgc3kgKyBjYiAtIGN0LCBtdWx0aXBsaWVkQWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcgfCBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgfD0gQUxQSEFfU0VUOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG11bHRpcGxpZWRBbHBoYSA9IChpbnQpICgyNTUgKiBhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQub25TZXRBbHBoYShtdWx0aXBsaWVkQWxwaGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGF5ZXJGbGFncyA9IENhbnZhcy5IQVNfQUxQSEFfTEFZRVJfU0FWRV9GTEFHOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ0xJUF9DSElMRFJFTikgPT0gRkxBR19DTElQX0NISUxEUkVOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJGbGFncyB8PSBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoc3gsIHN5LCBzeCArIGNyIC0gY2wsIHN5ICsgY2IgLSBjdCwgbXVsdGlwbGllZEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllckZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgfD0gQUxQSEFfU0VUOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChjaGlsZC5tUHJpdmF0ZUZsYWdzICYgQUxQSEFfU0VUKSA9PSBBTFBIQV9TRVQpIHsKICAgICAgICAgICAgIGNoaWxkLm9uU2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgJj0gfkFMUEhBX1NFVDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0NMSVBfQ0hJTERSRU4pID09IEZMQUdfQ0xJUF9DSElMRFJFTikgewpAQCAtMTYzNSwxNyArMjI4NiwyMSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKLSAgICAgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbGF5b3V0cyB3aXRoIG5vIGJhY2tncm91bmRzCi0gICAgICAgICAgICBpZiAoKGNoaWxkLm1Qcml2YXRlRmxhZ3MgJiBTS0lQX0RSQVcpID09IFNLSVBfRFJBVykgewotICAgICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuVFJBQ0VfSElFUkFSQ0hZKSB7Ci0gICAgICAgICAgICAgICAgICAgIFZpZXdEZWJ1Zy50cmFjZSh0aGlzLCBWaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlLkRSQVcpOworICAgICAgICAgICAgaWYgKCFoYXNEaXNwbGF5TGlzdCkgeworICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbGF5b3V0cyB3aXRoIG5vIGJhY2tncm91bmRzCisgICAgICAgICAgICAgICAgaWYgKChjaGlsZC5tUHJpdmF0ZUZsYWdzICYgU0tJUF9EUkFXKSA9PSBTS0lQX0RSQVcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5UUkFDRV9ISUVSQVJDSFkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdEZWJ1Zy50cmFjZSh0aGlzLCBWaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlLkRSQVcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgJj0gfkRJUlRZX01BU0s7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRpc3BhdGNoRHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRyYXcoY2FudmFzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQubVByaXZhdGVGbGFncyAmPSB+RElSVFlfTUFTSzsKLSAgICAgICAgICAgICAgICBjaGlsZC5kaXNwYXRjaERyYXcoY2FudmFzKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgICgoSGFyZHdhcmVDYW52YXMpIGNhbnZhcykuZHJhd0Rpc3BsYXlMaXN0KGRpc3BsYXlMaXN0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmIChjYWNoZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBmaW5hbCBQYWludCBjYWNoZVBhaW50ID0gbUNhY2hlUGFpbnQ7CiAgICAgICAgICAgICBpZiAoYWxwaGEgPCAxLjBmKSB7CiAgICAgICAgICAgICAgICAgY2FjaGVQYWludC5zZXRBbHBoYSgoaW50KSAoYWxwaGEgKiAyNTUpKTsKQEAgLTE2NTQsOSArMjMwOSw2IEBACiAgICAgICAgICAgICAgICAgY2FjaGVQYWludC5zZXRBbHBoYSgyNTUpOwogICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX0FMUEhBX0xPV0VSX1RIQU5fT05FOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcucHJvZmlsZURyYXdpbmcpIHsKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDYwMDAzLCBoYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGNhY2hlLCAwLjBmLCAwLjBmLCBjYWNoZVBhaW50KTsKICAgICAgICAgfQogCkBAIC0xNzAyLDEwICsyMzU0LDI0IEBACiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgCiAgICAgICAgICAgICBjaGlsZHJlbltpXS5zZXRTZWxlY3RlZChzZWxlY3RlZCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hTZXRBY3RpdmF0ZWQoYm9vbGVhbiBhY3RpdmF0ZWQpIHsKKyAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisKKyAgICAgICAgICAgIGNoaWxkcmVuW2ldLnNldEFjdGl2YXRlZChhY3RpdmF0ZWQpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hTZXRQcmVzc2VkKGJvb2xlYW4gcHJlc3NlZCkgewogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CkBAIC0xOTc3LDYgKzI2NDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IGNhbGwgcmVtb3ZlVmlldygpIG9uIHRoZSBjaGlsZCdzIHBhcmVudCBmaXJzdC4iKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5hZGRDaGlsZCh0aGlzLCBjaGlsZCk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIWNoZWNrTGF5b3V0UGFyYW1zKHBhcmFtcykpIHsKICAgICAgICAgICAgIHBhcmFtcyA9IGdlbmVyYXRlTGF5b3V0UGFyYW1zKHBhcmFtcyk7CiAgICAgICAgIH0KQEAgLTIwNTQsNyArMjcyNCw5IEBACiAgICAgLy8gVGhpcyBtZXRob2QgYWxzbyBzZXRzIHRoZSBjaGlsZCdzIG1QYXJlbnQgdG8gbnVsbAogICAgIHByaXZhdGUgdm9pZCByZW1vdmVGcm9tQXJyYXkoaW50IGluZGV4KSB7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKLSAgICAgICAgY2hpbGRyZW5baW5kZXhdLm1QYXJlbnQgPSBudWxsOworICAgICAgICBpZiAoIShtVHJhbnNpdGlvbmluZ1ZpZXdzICE9IG51bGwgJiYgbVRyYW5zaXRpb25pbmdWaWV3cy5jb250YWlucyhjaGlsZHJlbltpbmRleF0pKSkgeworICAgICAgICAgICAgY2hpbGRyZW5baW5kZXhdLm1QYXJlbnQgPSBudWxsOworICAgICAgICB9CiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBpZiAoaW5kZXggPT0gY291bnQgLSAxKSB7CiAgICAgICAgICAgICBjaGlsZHJlblstLW1DaGlsZHJlbkNvdW50XSA9IG51bGw7CkBAIC0yMTg5LDEzICsyODYxLDE5IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXdJbnRlcm5hbChpbnQgaW5kZXgsIFZpZXcgdmlldykgeworCisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5yZW1vdmVDaGlsZCh0aGlzLCB2aWV3KTsKKyAgICAgICAgfQorCiAgICAgICAgIGJvb2xlYW4gY2xlYXJDaGlsZEZvY3VzID0gZmFsc2U7CiAgICAgICAgIGlmICh2aWV3ID09IG1Gb2N1c2VkKSB7CiAgICAgICAgICAgICB2aWV3LmNsZWFyRm9jdXNGb3JSZW1vdmFsKCk7CiAgICAgICAgICAgICBjbGVhckNoaWxkRm9jdXMgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICBpZiAodmlldy5nZXRBbmltYXRpb24oKSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzLmNvbnRhaW5zKHZpZXcpKSkgewogICAgICAgICAgICAgYWRkRGlzYXBwZWFyaW5nVmlldyh2aWV3KTsKICAgICAgICAgfSBlbHNlIGlmICh2aWV3Lm1BdHRhY2hJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwpAQCAtMjIxNCw2ICsyODkyLDM5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCBmb3IgdGhpcyBWaWV3R3JvdXAuIElmIHRoZSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCBpcworICAgICAqIG5vdCBudWxsLCBjaGFuZ2VzIGluIGxheW91dCB3aGljaCBvY2N1ciBiZWNhdXNlIG9mIGNoaWxkcmVuIGJlaW5nIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbQorICAgICAqIHRoZSBWaWV3R3JvdXAgd2lsbCBiZSBhbmltYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFuaW1hdGlvbnMgZGVmaW5lZCBpbiB0aGF0IExheW91dFRyYW5zaXRpb24KKyAgICAgKiBvYmplY3QuIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc2l0aW9uIG9iamVjdCBpcyBudWxsIChzbyBsYXlvdXQgY2hhbmdlcyBhcmUgbm90IGFuaW1hdGVkKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCB0aGF0IHdpbGwgYW5pbWF0ZWQgY2hhbmdlcyBpbiBsYXlvdXQuIEEgdmFsdWUKKyAgICAgKiBvZiA8Y29kZT5udWxsPC9jb2RlPiBtZWFucyBubyB0cmFuc2l0aW9uIHdpbGwgcnVuIG9uIGxheW91dCBjaGFuZ2VzLgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdHcm91cF9hbmltYXRlTGF5b3V0Q2hhbmdlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExheW91dFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uKSB7CisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5yZW1vdmVUcmFuc2l0aW9uTGlzdGVuZXIobUxheW91dFRyYW5zaXRpb25MaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOworICAgICAgICBpZiAobVRyYW5zaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVRyYW5zaXRpb24uYWRkVHJhbnNpdGlvbkxpc3RlbmVyKG1MYXlvdXRUcmFuc2l0aW9uTGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgZm9yIHRoaXMgVmlld0dyb3VwLiBJZiB0aGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgaXMKKyAgICAgKiBub3QgbnVsbCwgY2hhbmdlcyBpbiBsYXlvdXQgd2hpY2ggb2NjdXIgYmVjYXVzZSBvZiBjaGlsZHJlbiBiZWluZyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20KKyAgICAgKiB0aGUgVmlld0dyb3VwIHdpbGwgYmUgYW5pbWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhbmltYXRpb25zIGRlZmluZWQgaW4gdGhhdCBMYXlvdXRUcmFuc2l0aW9uCisgICAgICogb2JqZWN0LiBCeSBkZWZhdWx0LCB0aGUgdHJhbnNpdGlvbiBvYmplY3QgaXMgbnVsbCAoc28gbGF5b3V0IGNoYW5nZXMgYXJlIG5vdCBhbmltYXRlZCkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExheW91dFRyYW5zdGlvbiBUaGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgdGhhdCB3aWxsIGFuaW1hdGVkIGNoYW5nZXMgaW4gbGF5b3V0LgorICAgICAqIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgbm8gdHJhbnNpdGlvbiB3aWxsIHJ1biBvbiBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGF5b3V0VHJhbnNpdGlvbiBnZXRMYXlvdXRUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb247CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXdzSW50ZXJuYWwoaW50IHN0YXJ0LCBpbnQgY291bnQpIHsKICAgICAgICAgZmluYWwgT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciBvbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyID0gbU9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXI7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5TGlzdGVuZXIgPSBvbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyICE9IG51bGw7CkBAIC0yMjI3LDEyICsyOTM4LDE3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjaGlsZHJlbltpXTsKIAorICAgICAgICAgICAgaWYgKG1UcmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbi5yZW1vdmVDaGlsZCh0aGlzLCB2aWV3KTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHZpZXcgPT0gZm9jdXNlZCkgewogICAgICAgICAgICAgICAgIHZpZXcuY2xlYXJGb2N1c0ZvclJlbW92YWwoKTsKICAgICAgICAgICAgICAgICBjbGVhckNoaWxkRm9jdXMgPSB2aWV3OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAodmlldy5nZXRBbmltYXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmlldy5nZXRBbmltYXRpb24oKSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzLmNvbnRhaW5zKHZpZXcpKSkgewogICAgICAgICAgICAgICAgIGFkZERpc2FwcGVhcmluZ1ZpZXcodmlldyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRldGFjaCkgewogICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwpAQCAtMjI5MSwxMiArMzAwNywxNyBAQAogICAgICAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY2hpbGRyZW5baV07CiAKKyAgICAgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb24ucmVtb3ZlQ2hpbGQodGhpcywgdmlldyk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICh2aWV3ID09IGZvY3VzZWQpIHsKICAgICAgICAgICAgICAgICB2aWV3LmNsZWFyRm9jdXNGb3JSZW1vdmFsKCk7CiAgICAgICAgICAgICAgICAgY2xlYXJDaGlsZEZvY3VzID0gdmlldzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsICYmIG1UcmFuc2l0aW9uaW5nVmlld3MuY29udGFpbnModmlldykpKSB7CiAgICAgICAgICAgICAgICAgYWRkRGlzYXBwZWFyaW5nVmlldyh2aWV3KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV0YWNoKSB7CiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCk7CkBAIC0yMzI5LDExICszMDUwLDE2IEBACiAgICAgICogQHNlZSAjZGV0YWNoVmlld0Zyb21QYXJlbnQoaW50KQogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZURldGFjaGVkVmlldyhWaWV3IGNoaWxkLCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgaWYgKG1UcmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UcmFuc2l0aW9uLnJlbW92ZUNoaWxkKHRoaXMsIGNoaWxkKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChjaGlsZCA9PSBtRm9jdXNlZCkgewogICAgICAgICAgICAgY2hpbGQuY2xlYXJGb2N1cygpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGFuaW1hdGUgJiYgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICBpZiAoKGFuaW1hdGUgJiYgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgfHwKKyAgICAgICAgICAgICAgICAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsICYmIG1UcmFuc2l0aW9uaW5nVmlld3MuY29udGFpbnMoY2hpbGQpKSkgewogICAgICAgICAgICAgYWRkRGlzYXBwZWFyaW5nVmlldyhjaGlsZCk7CiAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQubUF0dGFjaEluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgY2hpbGQuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKQEAgLTI0NzUsNiArMzIwMSwxNSBAQAogICAgICAgICAgICAgZmluYWwgaW50W10gbG9jYXRpb24gPSBhdHRhY2hJbmZvLm1JbnZhbGlkYXRlQ2hpbGRMb2NhdGlvbjsKICAgICAgICAgICAgIGxvY2F0aW9uW0NISUxEX0xFRlRfSU5ERVhdID0gY2hpbGQubUxlZnQ7CiAgICAgICAgICAgICBsb2NhdGlvbltDSElMRF9UT1BfSU5ERVhdID0gY2hpbGQubVRvcDsKKyAgICAgICAgICAgIE1hdHJpeCBjaGlsZE1hdHJpeCA9IGNoaWxkLmdldE1hdHJpeCgpOworICAgICAgICAgICAgaWYgKCFjaGlsZE1hdHJpeC5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICBSZWN0RiBib3VuZGluZ1JlY3QgPSBhdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1SZWN0OworICAgICAgICAgICAgICAgIGJvdW5kaW5nUmVjdC5zZXQoZGlydHkpOworICAgICAgICAgICAgICAgIGNoaWxkTWF0cml4Lm1hcFJlY3QoYm91bmRpbmdSZWN0KTsKKyAgICAgICAgICAgICAgICBkaXJ0eS5zZXQoKGludCkgYm91bmRpbmdSZWN0LmxlZnQsIChpbnQpIGJvdW5kaW5nUmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LnJpZ2h0ICsgMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LmJvdHRvbSArIDAuNWYpKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGlzIGRyYXdpbmcgYW4gYW5pbWF0aW9uLCB3ZSB3YW50IHRvIGNvcHkgdGhpcyBmbGFnIG9udG8KICAgICAgICAgICAgIC8vIG91cnNlbHZlcyBhbmQgdGhlIHBhcmVudCB0byBtYWtlIHN1cmUgdGhlIGludmFsaWRhdGUgcmVxdWVzdCBnb2VzCkBAIC0yNTA5LDYgKzMyNDQsMTggQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuaW52YWxpZGF0ZUNoaWxkSW5QYXJlbnQobG9jYXRpb24sIGRpcnR5KTsKKyAgICAgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIHRyYW5zZm9ybSBvbiBjdXJyZW50IHBhcmVudAorICAgICAgICAgICAgICAgICAgICBNYXRyaXggbSA9IHZpZXcuZ2V0TWF0cml4KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbS5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RGIGJvdW5kaW5nUmVjdCA9IGF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybVJlY3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3Quc2V0KGRpcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0ubWFwUmVjdChib3VuZGluZ1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkuc2V0KChpbnQpIGJvdW5kaW5nUmVjdC5sZWZ0LCAoaW50KSBib3VuZGluZ1JlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LnJpZ2h0ICsgMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChib3VuZGluZ1JlY3QuYm90dG9tICsgMC41ZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAocGFyZW50ICE9IG51bGwpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjg3NSw3ICszNjIyLDcgQEAKICAgICAgKi8KICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoY2F0ZWdvcnkgPSAiZHJhd2luZyIsIG1hcHBpbmcgPSB7CiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfTk9fQ0FDSEUsICAgICAgICB0byA9ICJOT05FIiksCi0gICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQUxMX0NBQ0hFUywgICAgICB0byA9ICJBTklNQVRJT04iKSwKKyAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9BTklNQVRJT05fQ0FDSEUsIHRvID0gIkFOSU1BVElPTiIpLAogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX1NDUk9MTElOR19DQUNIRSwgdG8gPSAiU0NST0xMSU5HIiksCiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQUxMX0NBQ0hFUywgICAgICB0byA9ICJBTEwiKQogICAgIH0pCkBAIC0zMjg4LDYgKzQwMzUsODAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB0ZWxscyB0aGUgVmlld0dyb3VwIHRoYXQgdGhlIGdpdmVuIFZpZXcgb2JqZWN0LCB3aGljaCBzaG91bGQgaGF2ZSB0aGlzCisgICAgICogVmlld0dyb3VwIGFzIGl0cyBwYXJlbnQsCisgICAgICogc2hvdWxkIGJlIGtlcHQgYXJvdW5kICAocmUtZGlzcGxheWVkIHdoZW4gdGhlIFZpZXdHcm91cCBkcmF3cyBpdHMgY2hpbGRyZW4pIGV2ZW4gaWYgaXQKKyAgICAgKiBpcyByZW1vdmVkIGZyb20gaXRzIHBhcmVudC4gVGhpcyBhbGxvd3MgYW5pbWF0aW9ucywgc3VjaCBhcyB0aG9zZSB1c2VkIGJ5CisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50fSBhbmQge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb259IHRvIGFuaW1hdGUKKyAgICAgKiB0aGUgcmVtb3ZhbCBvZiB2aWV3cy4gQSBjYWxsIHRvIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgYWNjb21wYW5pZWQgYnkgYSBsYXRlciBjYWxsCisgICAgICogdG8ge0BsaW5rICNlbmRWaWV3VHJhbnNpdGlvbihWaWV3KX0sIHN1Y2ggYXMgYWZ0ZXIgYW4gYW5pbWF0aW9uIG9uIHRoZSBWaWV3IGhhcyBmaW5pc2hlZCwKKyAgICAgKiBzbyB0aGF0IHRoZSBWaWV3IGZpbmFsbHkgZ2V0cyByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXcgVGhlIFZpZXcgb2JqZWN0IHRvIGJlIGtlcHQgdmlzaWJsZSBldmVuIGlmIGl0IGdldHMgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRWaWV3VHJhbnNpdGlvbihWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKHZpZXcubVBhcmVudCA9PSB0aGlzKSB7CisgICAgICAgICAgICBpZiAobVRyYW5zaXRpb25pbmdWaWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25pbmdWaWV3cyA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFuc2l0aW9uaW5nVmlld3MuYWRkKHZpZXcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgZm9sbG93aW5nIGFuIGVhcmxpZXIgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRWaWV3VHJhbnNpdGlvbihWaWV3KX0uIFRoZSBnaXZlbiBWaWV3IGlzIGZpbmFsbHkgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQKKyAgICAgKiBhbmQgd2lsbCBubyBsb25nZXIgYmUgZGlzcGxheWVkLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSB0aGUgZnVuY3Rpb25hbGl0eQorICAgICAqIG9mIHJlbW92aW5nIGEgdmlldyBmcm9tIGl0cyBwYXJlbnQ7IGl0IGp1c3QgZGlzY29udGludWVzIHRoZSBkaXNwbGF5IG9mIGEgVmlldyB0aGF0CisgICAgICogaGFzIHByZXZpb3VzbHkgYmVlbiByZW1vdmVkLgorICAgICAqCisgICAgICogQHJldHVybiB2aWV3IFRoZSBWaWV3IG9iamVjdCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgYnV0IGlzIGJlaW5nIGtlcHQgYXJvdW5kIGluIHRoZSB2aXNpYmxlCisgICAgICogaGllcmFyY2h5IGJ5IGFuIGVhcmxpZXIgY2FsbCB0byB7QGxpbmsgI3N0YXJ0Vmlld1RyYW5zaXRpb24oVmlldyl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFZpZXdUcmFuc2l0aW9uKFZpZXcgdmlldykgeworICAgICAgICBpZiAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbmluZ1ZpZXdzLnJlbW92ZSh2aWV3KTsKKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxWaWV3PiBkaXNhcHBlYXJpbmdDaGlsZHJlbiA9IG1EaXNhcHBlYXJpbmdDaGlsZHJlbjsKKyAgICAgICAgICAgIGlmIChkaXNhcHBlYXJpbmdDaGlsZHJlbiAhPSBudWxsICYmIGRpc2FwcGVhcmluZ0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcpKSB7CisgICAgICAgICAgICAgICAgZGlzYXBwZWFyaW5nQ2hpbGRyZW4ucmVtb3ZlKHZpZXcpOworICAgICAgICAgICAgICAgIGlmIChtVmlzaWJpbGl0eUNoYW5naW5nQ2hpbGRyZW4gIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVZpc2liaWxpdHlDaGFuZ2luZ0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5Q2hhbmdpbmdDaGlsZHJlbi5yZW1vdmUodmlldyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcubUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3Lm1QYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5tUGFyZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0lOVkFMSURBVEVfUkVRVUlSRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExheW91dFRyYW5zaXRpb24uVHJhbnNpdGlvbkxpc3RlbmVyIG1MYXlvdXRUcmFuc2l0aW9uTGlzdGVuZXIgPQorICAgICAgICAgICAgbmV3IExheW91dFRyYW5zaXRpb24uVHJhbnNpdGlvbkxpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24gdHJhbnNpdGlvbiwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBWaWV3IHZpZXcsIGludCB0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IGRpc2FwcGVhcmluZyBpdGVtcywgc2luY2Ugd2UgbmVlZCBzcGVjaWFsIGxvZ2ljIHRvIGtlZXAKKyAgICAgICAgICAgIC8vIHRob3NlIGl0ZW1zIHZpc2libGUgYWZ0ZXIgdGhleSd2ZSBiZWVuICdyZW1vdmVkJworICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25UeXBlID09IExheW91dFRyYW5zaXRpb24uRElTQVBQRUFSSU5HKSB7CisgICAgICAgICAgICAgICAgc3RhcnRWaWV3VHJhbnNpdGlvbih2aWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbmRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24gdHJhbnNpdGlvbiwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBWaWV3IHZpZXcsIGludCB0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25UeXBlID09IExheW91dFRyYW5zaXRpb24uRElTQVBQRUFSSU5HICYmIG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVuZFZpZXdUcmFuc2l0aW9uKHZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTM3NDksNCArNDU3MCw1OSBAQAogICAgICAgICAgICAgYm90dG9tTWFyZ2luID0gYm90dG9tOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyogRGVzY3JpYmVzIGEgdG91Y2hlZCB2aWV3IGFuZCB0aGUgaWRzIG9mIHRoZSBwb2ludGVycyB0aGF0IGl0IGhhcyBjYXB0dXJlZC4KKyAgICAgKgorICAgICAqIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgcG9pbnRlciBpZHMgYXJlIGFsd2F5cyBpbiB0aGUgcmFuZ2UgMC4uMzEgc3VjaCB0aGF0CisgICAgICogaXQgY2FuIHVzZSBhIGJpdGZpZWxkIHRvIHRyYWNrIHdoaWNoIHBvaW50ZXIgaWRzIGFyZSBwcmVzZW50LgorICAgICAqIEFzIGl0IGhhcHBlbnMsIHRoZSBsb3dlciBsYXllcnMgb2YgdGhlIGlucHV0IGRpc3BhdGNoIHBpcGVsaW5lIGFsc28gdXNlIHRoZQorICAgICAqIHNhbWUgdHJpY2sgc28gdGhlIGFzc3VtcHRpb24gc2hvdWxkIGJlIHNhZmUgaGVyZS4uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRvdWNoVGFyZ2V0IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRUNZQ0xFRCA9IDMyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc1JlY3ljbGVMb2NrID0gbmV3IE9iamVjdCgpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBUb3VjaFRhcmdldCBzUmVjeWNsZUJpbjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNSZWN5Y2xlZENvdW50OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9QT0lOVEVSX0lEUyA9IC0xOyAvLyBhbGwgb25lcworCisgICAgICAgIC8vIFRoZSB0b3VjaGVkIGNoaWxkIHZpZXcuCisgICAgICAgIHB1YmxpYyBWaWV3IGNoaWxkOworCisgICAgICAgIC8vIFRoZSBjb21iaW5lZCBiaXQgbWFzayBvZiBwb2ludGVyIGlkcyBmb3IgYWxsIHBvaW50ZXJzIGNhcHR1cmVkIGJ5IHRoZSB0YXJnZXQuCisgICAgICAgIHB1YmxpYyBpbnQgcG9pbnRlcklkQml0czsKKworICAgICAgICAvLyBUaGUgbmV4dCB0YXJnZXQgaW4gdGhlIHRhcmdldCBsaXN0LgorICAgICAgICBwdWJsaWMgVG91Y2hUYXJnZXQgbmV4dDsKKworICAgICAgICBwcml2YXRlIFRvdWNoVGFyZ2V0KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUb3VjaFRhcmdldCBvYnRhaW4oVmlldyBjaGlsZCwgaW50IHBvaW50ZXJJZEJpdHMpIHsKKyAgICAgICAgICAgIGZpbmFsIFRvdWNoVGFyZ2V0IHRhcmdldDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1JlY3ljbGVMb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNSZWN5Y2xlQmluID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IFRvdWNoVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gc1JlY3ljbGVCaW47CisgICAgICAgICAgICAgICAgICAgIHNSZWN5Y2xlQmluID0gdGFyZ2V0Lm5leHQ7CisgICAgICAgICAgICAgICAgICAgICBzUmVjeWNsZWRDb3VudC0tOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQubmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0LmNoaWxkID0gY2hpbGQ7CisgICAgICAgICAgICB0YXJnZXQucG9pbnRlcklkQml0cyA9IHBvaW50ZXJJZEJpdHM7CisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1JlY3ljbGVMb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNSZWN5Y2xlZENvdW50IDwgTUFYX1JFQ1lDTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBzUmVjeWNsZUJpbjsKKyAgICAgICAgICAgICAgICAgICAgc1JlY3ljbGVCaW4gPSB0aGlzOworICAgICAgICAgICAgICAgICAgICBzUmVjeWNsZWRDb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UGFyZW50LmphdmEKaW5kZXggYjQ1NmM1ZC4uZDdkNGMzZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UGFyZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UGFyZW50LmphdmEKQEAgLTE2Miw2ICsxNjIsMjAgQEAKICAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51KTsKIAogICAgIC8qKgorICAgICAqIFN0YXJ0IGFuIGFjdGlvbiBtb2RlIGZvciB0aGUgc3BlY2lmaWVkIHZpZXcuCisgICAgICogPHA+CisgICAgICogSW4gbW9zdCBjYXNlcywgYSBzdWJjbGFzcyBkb2VzIG5vdCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMuIEhvd2V2ZXIsIGlmIHRoZQorICAgICAqIHN1YmNsYXNzIGlzIGFkZGVkIGRpcmVjdGx5IHRvIHRoZSB3aW5kb3cgbWFuYWdlciAoZm9yIGV4YW1wbGUsCisgICAgICoge0BsaW5rIFZpZXdNYW5hZ2VyI2FkZFZpZXcoVmlldywgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMpfSkKKyAgICAgKiB0aGVuIGl0IHNob3VsZCBvdmVycmlkZSB0aGlzIGFuZCBzdGFydCB0aGUgYWN0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JpZ2luYWxWaWV3IFRoZSBzb3VyY2UgdmlldyB3aGVyZSB0aGUgYWN0aW9uIG1vZGUgd2FzIGZpcnN0IGludm9rZWQKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhlIGFjdGlvbiBtb2RlCisgICAgICogQHJldHVybiBUaGUgbmV3IGFjdGlvbiBtb2RlIGlmIGl0IHdhcyBzdGFydGVkLCBudWxsIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgcGFyZW50IHdoZW4gYSBjaGlsZCdzIGRyYXdhYmxlIHN0YXRlCiAgICAgICogaGFzIGNoYW5nZWQuCiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQppbmRleCA5YzI0OWNlLi43OWYxZjViIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCkBAIC0xNiwyMyArMTYsNDEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LkJhc2VTdXJmYWNlSG9sZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RTZXNzaW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuUm9vdFZpZXdTdXJmYWNlVGFrZXI7Ci0KK2ltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29tcGF0aWJpbGl0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwotaW1wb3J0IGFuZHJvaWQub3MuKjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkRlYnVnOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxhdGVuY3lUaW1lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CkBAIC00MSwyNSArNTksMTYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29tcGF0aWJpbGl0eUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3M7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwotaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5CYXNlU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZENhbGxiYWNrOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kU2Vzc2lvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LlJvb3RWaWV3U3VyZmFjZVRha2VyOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuKjsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy4qOwotaW1wb3J0IHN0YXRpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwLio7Ci0KIC8qKgogICogVGhlIHRvcCBvZiBhIHZpZXcgaGllcmFyY2h5LCBpbXBsZW1lbnRpbmcgdGhlIG5lZWRlZCBwcm90b2NvbCBiZXR3ZWVuIFZpZXcKICAqIGFuZCB0aGUgV2luZG93TWFuYWdlci4gIFRoaXMgaXMgZm9yIHRoZSBtb3N0IHBhcnQgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24KQEAgLTY3LDE0ICs3NiwxMiBAQAogICoKICAqIHtAaGlkZX0KICAqLwotQFN1cHByZXNzV2FybmluZ3MoeyJFbXB0eUNhdGNoQmxvY2sifSkKLXB1YmxpYyBmaW5hbCBjbGFzcyBWaWV3Um9vdCBleHRlbmRzIEhhbmRsZXIgaW1wbGVtZW50cyBWaWV3UGFyZW50LAotICAgICAgICBWaWV3LkF0dGFjaEluZm8uQ2FsbGJhY2tzIHsKK0BTdXBwcmVzc1dhcm5pbmdzKHsiRW1wdHlDYXRjaEJsb2NrIiwgIlBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uIn0pCitwdWJsaWMgZmluYWwgY2xhc3MgVmlld1Jvb3QgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgVmlld1BhcmVudCwgVmlldy5BdHRhY2hJbmZvLkNhbGxiYWNrcyB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWV3Um9vdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1dfRlBTID0gZmFsc2U7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJDb25zdGFudENvbmRpdGlvbmFsRXhwcmVzc2lvbiJ9KQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IGZhbHNlID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZTsKICAgICAvKiogQG5vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbiovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19EUkFXID0gZmFsc2UgfHwgTE9DQUxfTE9HVjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0xBWU9VVCA9IGZhbHNlIHx8IExPQ0FMX0xPR1Y7CkBAIC05NSw4ICsxMDIsNiBAQAogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RSQUNLQkFMTF9ERUxBWSA9IDI1MDsKIAotICAgIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKLQogICAgIHN0YXRpYyBJV2luZG93U2Vzc2lvbiBzV2luZG93U2Vzc2lvbjsKIAogICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgbVN0YXRpY0luaXQgPSBuZXcgT2JqZWN0KCk7CkBAIC0yMDQsMTcgKzIwOSwxNCBAQAogICAgIGludCBtQ3VyU2Nyb2xsWTsKICAgICBTY3JvbGxlciBtU2Nyb2xsZXI7CiAKLSAgICBFR0wxMCBtRWdsOwotICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLSAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOwotICAgIEdMMTEgbUdMOwotICAgIENhbnZhcyBtR2xDYW52YXM7Ci0gICAgYm9vbGVhbiBtVXNlR0w7Ci0gICAgYm9vbGVhbiBtR2xXYW50ZWQ7Ci0KICAgICBmaW5hbCBWaWV3Q29uZmlndXJhdGlvbiBtVmlld0NvbmZpZ3VyYXRpb247CiAKKyAgICAvKiBEcmFnL2Ryb3AgKi8KKyAgICBDbGlwRGVzY3JpcHRpb24gbURyYWdEZXNjcmlwdGlvbjsKKyAgICBWaWV3IG1DdXJyZW50RHJhZ1ZpZXc7CisgICAgZmluYWwgUG9pbnRGIG1EcmFnUG9pbnQgPSBuZXcgUG9pbnRGKCk7CisgICAgZmluYWwgUG9pbnRGIG1MYXN0VG91Y2hQb2ludCA9IG5ldyBQb2ludEYoKTsKKwogICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgI3BsYXlTb3VuZEVmZmVjdChpbnQpfQogICAgICAqLwpAQCAtMjQxLDEzICsyNDMsMTIgQEAKICAgICBwdWJsaWMgVmlld1Jvb3QoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKCk7CiAKLSAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSAmJiBsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsdCA9IG5ldyBMYXRlbmN5VGltZXIoMTAwLCAxMDAwKTsKKyAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgeworICAgICAgICAgICAgaWYgKGx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsdCA9IG5ldyBMYXRlbmN5VGltZXIoMTAwLCAxMDAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIEZvciBkZWJ1ZyBvbmx5Ci0gICAgICAgIC8vKytzSW5zdGFuY2VDb3VudDsKLQogICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBzdGF0aWNzIHdoZW4gdGhpcyBjbGFzcyBpcyBmaXJzdCBpbnN0YW50aWF0ZWQuIFRoaXMgaXMKICAgICAgICAgLy8gZG9uZSBoZXJlIGluc3RlYWQgb2YgaW4gdGhlIHN0YXRpYyBibG9jayBiZWNhdXNlIFp5Z290ZSBkb2VzIG5vdAogICAgICAgICAvLyBhbGxvdyB0aGUgc3Bhd25pbmcgb2YgdGhyZWFkcy4KQEAgLTI2Miw3ICsyNjMsNyBAQAogICAgICAgICBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwogICAgICAgICBtVmlzUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgIG1XaW5GcmFtZSA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIG1XaW5kb3cgPSBuZXcgVyh0aGlzLCBjb250ZXh0KTsKKyAgICAgICAgbVdpbmRvdyA9IG5ldyBXKHRoaXMpOwogICAgICAgICBtSW5wdXRNZXRob2RDYWxsYmFjayA9IG5ldyBJbnB1dE1ldGhvZENhbGxiYWNrKHRoaXMpOwogICAgICAgICBtVmlld1Zpc2liaWxpdHkgPSBWaWV3LkdPTkU7CiAgICAgICAgIG1UcmFuc3BhcmVudFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKQEAgLTI3NCwxOSArMjc1LDYgQEAKICAgICAgICAgbURlbnNpdHkgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaTsKICAgICB9CiAKLSAgICAvLyBGb3IgZGVidWcgb25seQotICAgIC8qCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgLS1zSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0gICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gc0luc3RhbmNlQ291bnQ7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZpcnN0RHJhd0hhbmRsZXIoUnVubmFibGUgY2FsbGJhY2spIHsKICAgICAgICAgc3luY2hyb25pemVkIChzRmlyc3REcmF3SGFuZGxlcnMpIHsKICAgICAgICAgICAgIGlmICghc0ZpcnN0RHJhd0NvbXBsZXRlKSB7CkBAIC0zMzAsMTIyICszMTgsMTggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR0woKSB7Ci0gICAgICAgIGluaXRpYWxpemVHTElubmVyKCk7Ci0gICAgICAgIGludCBlcnIgPSBtRWdsLmVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIC8vIGdpdmUtdXAgb24gdXNpbmcgR0wKLSAgICAgICAgICAgIGRlc3Ryb3lHTCgpOwotICAgICAgICAgICAgbUdsV2FudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdMSW5uZXIoKSB7Ci0gICAgICAgIGZpbmFsIEVHTDEwIGVnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKLSAgICAgICAgbUVnbCA9IGVnbDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdG8gdGhlIGRlZmF1bHQgZGlzcGxheS4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTERpc3BsYXkgZWdsRGlzcGxheSA9IGVnbC5lZ2xHZXREaXNwbGF5KEVHTDEwLkVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICAgICBtRWdsRGlzcGxheSA9IGVnbERpc3BsYXk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgY2FuIG5vdyBpbml0aWFsaXplIEVHTCBmb3IgdGhhdCBkaXNwbGF5Ci0gICAgICAgICAqLwotICAgICAgICBpbnRbXSB2ZXJzaW9uID0gbmV3IGludFsyXTsKLSAgICAgICAgZWdsLmVnbEluaXRpYWxpemUoZWdsRGlzcGxheSwgdmVyc2lvbik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBvcGVuZ2wgc2Vzc2lvbgotICAgICAgICAgKiBhbmQgZ3JhYiB0aGUgZmlyc3QgY29uZmlndXJhdGlvbiB0aGF0IG1hdGNoZXMgaXMKLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIGludFtdIGNvbmZpZ1NwZWMgPSB7Ci0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCAgICAgIDUsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsICAgIDYsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgICAgIDUsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsICAgIDAsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUKLSAgICAgICAgfTsKLSAgICAgICAgZmluYWwgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbMV07Ci0gICAgICAgIGZpbmFsIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOwotICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGVnbERpc3BsYXksIGNvbmZpZ1NwZWMsIGNvbmZpZ3MsIDEsIG51bV9jb25maWcpOwotICAgICAgICBmaW5hbCBFR0xDb25maWcgY29uZmlnID0gY29uZmlnc1swXTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgYW4gT3BlbkdMIEVTIGNvbnRleHQuIFRoaXMgbXVzdCBiZSBkb25lIG9ubHkgb25jZSwgYW4KLSAgICAgICAgICogT3BlbkdMIGNvbnRleHQgaXMgYSBzb21ld2hhdCBoZWF2eSBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBFR0xDb250ZXh0IGNvbnRleHQgPSBlZ2wuZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX0NPTlRFWFQsIG51bGwpOwotICAgICAgICBtRWdsQ29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIGFuIEVHTCBzdXJmYWNlIHdlIGNhbiByZW5kZXIgaW50by4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGVnbC5lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGVnbERpc3BsYXksIGNvbmZpZywgbUhvbGRlciwgbnVsbCk7Ci0gICAgICAgIG1FZ2xTdXJmYWNlID0gc3VyZmFjZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBCZWZvcmUgd2UgY2FuIGlzc3VlIEdMIGNvbW1hbmRzLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQotICAgICAgICAgKiB0aGUgY29udGV4dCBpcyBjdXJyZW50IGFuZCBib3VuZCB0byBhIHN1cmZhY2UuCi0gICAgICAgICAqLwotICAgICAgICBlZ2wuZWdsTWFrZUN1cnJlbnQoZWdsRGlzcGxheSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBHTCBpbnRlcmZhY2UuCi0gICAgICAgICAqIFRoaXMgaXMgc2ltcGx5IGRvbmUgYnkgY2FzdGluZyB0aGUgR0wgY29udGV4dCB0byBlaXRoZXIKLSAgICAgICAgICogR0wxMCBvciBHTDExLgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgR0wxMSBnbCA9IChHTDExKSBjb250ZXh0LmdldEdMKCk7Ci0gICAgICAgIG1HTCA9IGdsOwotICAgICAgICBtR2xDYW52YXMgPSBuZXcgQ2FudmFzKGdsKTsKLSAgICAgICAgbVVzZUdMID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVzdHJveUdMKCkgewotICAgICAgICAvLyBpbmZvcm0gc2tpYSB0aGF0IHRoZSBjb250ZXh0IGlzIGdvbmUKLSAgICAgICAgbmF0aXZlQWJhbmRvbkdsQ2FjaGVzKCk7Ci0KLSAgICAgICAgbUVnbC5lZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX1NVUkZBQ0UsIEVHTDEwLkVHTF9OT19DT05URVhUKTsKLSAgICAgICAgbUVnbC5lZ2xEZXN0cm95Q29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbnRleHQpOwotICAgICAgICBtRWdsLmVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgICAgIG1FZ2wuZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLSAgICAgICAgbUVnbENvbnRleHQgPSBudWxsOwotICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIG1FZ2xEaXNwbGF5ID0gbnVsbDsKLSAgICAgICAgbUVnbCA9IG51bGw7Ci0gICAgICAgIG1HbENhbnZhcyA9IG51bGw7Ci0gICAgICAgIG1HTCA9IG51bGw7Ci0gICAgICAgIG1Vc2VHTCA9IGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0VnbEVycm9ycygpIHsKLSAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgaW50IGVyciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgYmFkIGhhcyBoYXBwZW5lZCByZXZlcnQgdG8KLSAgICAgICAgICAgICAgICAvLyBub3JtYWwgcmVuZGVyaW5nLgotICAgICAgICAgICAgICAgIGRlc3Ryb3lHTCgpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gRUdMMTEuRUdMX0NPTlRFWFRfTE9TVCkgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSdsbCB0cnkgYWdhaW4gaWYgaXQgd2FzIGNvbnRleHQgbG9zdAotICAgICAgICAgICAgICAgICAgICBtR2xXYW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBXZSBoYXZlIG9uZSBjaGlsZAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpZXcoVmlldyB2aWV3LCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBhdHRycywKLSAgICAgICAgICAgIFZpZXcgcGFuZWxQYXJlbnRWaWV3KSB7CisgICAgcHVibGljIHZvaWQgc2V0VmlldyhWaWV3IHZpZXcsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzLCBWaWV3IHBhbmVsUGFyZW50VmlldykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVZpZXcgPSB2aWV3OwogICAgICAgICAgICAgICAgIG1XaW5kb3dBdHRyaWJ1dGVzLmNvcHlGcm9tKGF0dHJzKTsKICAgICAgICAgICAgICAgICBhdHRycyA9IG1XaW5kb3dBdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVuYWJsZUhhcmR3YXJlQWNjZWxlcmF0aW9uKGF0dHJzKTsKKwogICAgICAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgUm9vdFZpZXdTdXJmYWNlVGFrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXJDYWxsYmFjayA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSb290Vmlld1N1cmZhY2VUYWtlcil2aWV3KS53aWxsWW91VGFrZVRoZVN1cmZhY2UoKTsKQEAgLTU3NSw2ICs0NTksMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBlbmFibGVIYXJkd2FyZUFjY2VsZXJhdGlvbihXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBhdHRycykgeworICAgICAgICAvLyBPbmx5IGVuYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaWYgd2UgYXJlIG5vdCBpbiB0aGUgc3lzdGVtIHByb2Nlc3MKKyAgICAgICAgLy8gVGhlIHdpbmRvdyBtYW5hZ2VyIGNyZWF0ZXMgVmlld1Jvb3RzIHRvIGRpc3BsYXkgYW5pbWF0ZWQgcHJldmlldyB3aW5kb3dzCisgICAgICAgIC8vIG9mIGxhdW5jaGluZyBhcHBzIGFuZCB3ZSBkb24ndCB3YW50IHRob3NlIHRvIGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkCisgICAgICAgIGlmICghSGFyZHdhcmVSZW5kZXJlci5zUmVuZGVyZXJEaXNhYmxlZCkgeworICAgICAgICAgICAgLy8gVHJ5IHRvIGVuYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaWYgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAoYXR0cnMuZmxhZ3MgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0cmFuc2x1Y2VudCA9IGF0dHJzLmZvcm1hdCAhPSBQaXhlbEZvcm1hdC5PUEFRVUU7CisgICAgICAgICAgICAgICAgaWYgKG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuZGVzdHJveSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyID0gSGFyZHdhcmVSZW5kZXJlci5jcmVhdGVHbFJlbmRlcmVyKDIsIHRyYW5zbHVjZW50KTsKKyAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVBY2NlbGVyYXRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KCkgewogICAgICAgICByZXR1cm4gbVZpZXc7CiAgICAgfQpAQCAtNzMxLDggKzYzMyw2IEBACiAgICAgICAgIGJvb2xlYW4gdmlld1Zpc2liaWxpdHlDaGFuZ2VkID0gbVZpZXdWaXNpYmlsaXR5ICE9IHZpZXdWaXNpYmlsaXR5CiAgICAgICAgICAgICAgICAgfHwgbU5ld1N1cmZhY2VOZWVkZWQ7CiAKLSAgICAgICAgZmxvYXQgYXBwU2NhbGUgPSBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZTsKLQogICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMgPSBudWxsOwogICAgICAgICBpZiAobVdpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkKSB7CiAgICAgICAgICAgICBtV2luZG93QXR0cmlidXRlc0NoYW5nZWQgPSBmYWxzZTsKQEAgLTc4MCw5ICs2ODAsOSBAQAogICAgICAgICAgICAgYXR0YWNoSW5mby5tV2luZG93VmlzaWJpbGl0eSA9IHZpZXdWaXNpYmlsaXR5OwogICAgICAgICAgICAgaG9zdC5kaXNwYXRjaFdpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKHZpZXdWaXNpYmlsaXR5KTsKICAgICAgICAgICAgIGlmICh2aWV3VmlzaWJpbGl0eSAhPSBWaWV3LlZJU0lCTEUgfHwgbU5ld1N1cmZhY2VOZWVkZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lHTCgpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5kZXN0cm95KGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHZpZXdWaXNpYmlsaXR5ID09IFZpZXcuR09ORSkgewogICAgICAgICAgICAgICAgIC8vIEFmdGVyIG1ha2luZyBhIHdpbmRvdyBnb25lLCB3ZSB3aWxsIGNvdW50IGl0IGFzIGJlaW5nCkBAIC04OTcsMTAgKzc5NywxMiBAQAogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gY29tcHV0ZXNJbnRlcm5hbEluc2V0cyA9CiAgICAgICAgICAgICAgICAgYXR0YWNoSW5mby5tVHJlZU9ic2VydmVyLmhhc0NvbXB1dGVJbnRlcm5hbEluc2V0c0xpc3RlbmVycygpOworCiAgICAgICAgIGJvb2xlYW4gaW5zZXRzUGVuZGluZyA9IGZhbHNlOwogICAgICAgICBpbnQgcmVsYXlvdXRSZXN1bHQgPSAwOwotICAgICAgICBpZiAobUZpcnN0IHx8IHdpbmRvd1Nob3VsZFJlc2l6ZSB8fCBpbnNldHNDaGFuZ2VkCi0gICAgICAgICAgICAgICAgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkIHx8IHBhcmFtcyAhPSBudWxsKSB7CisKKyAgICAgICAgaWYgKG1GaXJzdCB8fCB3aW5kb3dTaG91bGRSZXNpemUgfHwgaW5zZXRzQ2hhbmdlZCB8fAorICAgICAgICAgICAgICAgIHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCB8fCBwYXJhbXMgIT0gbnVsbCkgewogCiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgPT0gVmlldy5WSVNJQkxFKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3aW5kb3cgaXMgZ2l2aW5nIGludGVybmFsIGluc2V0cyB0byB0aGUgd2luZG93CkBAIC05MTIsMjYgKzgxNCwxOSBAQAogICAgICAgICAgICAgICAgIC8vIHdpbmRvdywgd2FpdGluZyB1bnRpbCB3ZSBjYW4gZmluaXNoIGxheWluZyBvdXQgdGhpcyB3aW5kb3cKICAgICAgICAgICAgICAgICAvLyBhbmQgZ2V0IGJhY2sgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyIHdpdGggdGhlIHVsdGltYXRlbHkKICAgICAgICAgICAgICAgICAvLyBjb21wdXRlZCBpbnNldHMuCi0gICAgICAgICAgICAgICAgaW5zZXRzUGVuZGluZyA9IGNvbXB1dGVzSW50ZXJuYWxJbnNldHMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtRmlyc3QgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkKTsKLQotICAgICAgICAgICAgICAgIGlmIChtV2luZG93QXR0cmlidXRlcy5tZW1vcnlUeXBlID09IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1FTU9SWV9UWVBFX0dQVSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG1XaW5kb3dBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1HbFdhbnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluc2V0c1BlbmRpbmcgPSBjb21wdXRlc0ludGVybmFsSW5zZXRzICYmIChtRmlyc3QgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1TdXJmYWNlSG9sZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlci5tU3VyZmFjZUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgIG1EcmF3aW5nQWxsb3dlZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgYm9vbGVhbiBod0ludGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGJvb2xlYW4gY29udGVudEluc2V0c0NoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZUluc2V0c0NoYW5nZWQ7CiAgICAgICAgICAgICBib29sZWFuIGhhZFN1cmZhY2UgPSBtU3VyZmFjZS5pc1ZhbGlkKCk7CisKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaW50IGZsID0gMDsKICAgICAgICAgICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKQEAgLTk5MSw5ICs4ODYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFJlZHJhd05lZWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUcmFuc3BhcmVudFJlZ2lvbi5zZXRFbXB0eSgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUdsV2FudGVkICYmICFtVXNlR0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplR0woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCA9IG1HbENhbnZhcyAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBod0ludGlhbGl6ZWQgPSBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5pbml0aWFsaXplKG1Ib2xkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbVN1cmZhY2UuaXNWYWxpZCgpKSB7CkBAIC0xMDcwLDEwICs5NjQsOSBAQAogICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlci5tU3VyZmFjZUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgICAgICBtR2xDYW52YXMuc2V0Vmlld3BvcnQoKGludCkgKG1XaWR0aCAqIGFwcFNjYWxlICsgMC41ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobUhlaWdodCAqIGFwcFNjYWxlICsgMC41ZikpOworCisgICAgICAgICAgICBpZiAoaHdJbnRpYWxpemVkIHx8ICh3aW5kb3dTaG91bGRSZXNpemUgJiYgbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5zZXR1cChtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sZWFuIGZvY3VzQ2hhbmdlZER1ZVRvVG91Y2hNb2RlID0gZW5zdXJlVG91Y2hNb2RlTG9jYWxseSgKQEAgLTExMzMsNyArMTAyNiw3IEBACiAgICAgICAgICAgICAgICAgVEFHLCAiTGF5aW5nIG91dCAiICsgaG9zdCArICIgdG8gKCIgKwogICAgICAgICAgICAgICAgIGhvc3QubU1lYXN1cmVkV2lkdGggKyAiLCAiICsgaG9zdC5tTWVhc3VyZWRIZWlnaHQgKyAiKSIpOwogICAgICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSAwTDsKLSAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnByb2ZpbGVMYXlvdXQpIHsKKyAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfUFJPRklMRV9MQVlPVVQpIHsKICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGhvc3QubGF5b3V0KDAsIDAsIGhvc3QubU1lYXN1cmVkV2lkdGgsIGhvc3QubU1lYXN1cmVkSGVpZ2h0KTsKQEAgLTExNDYsNyArMTAzOSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlTGF5b3V0KSB7CisgICAgICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX1BST0ZJTEVfTEFZT1VUKSB7CiAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg2MDAwMSwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBzdGFydFRpbWUpOwogICAgICAgICAgICAgfQogCkBAIC0xMzQ2LDcgKzEyMzksOCBAQAogICAgICAgICBpZiAoIXNGaXJzdERyYXdDb21wbGV0ZSkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChzRmlyc3REcmF3SGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICBzRmlyc3REcmF3Q29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzRmlyc3REcmF3SGFuZGxlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBzRmlyc3REcmF3SGFuZGxlcnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHBvc3Qoc0ZpcnN0RHJhd0hhbmRsZXJzLmdldChpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTM3OSw2MSArMTI3MywyNCBAQAogICAgICAgICAgICAgZGlydHkuc2V0RW1wdHkoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgaWYgKCFkaXJ0eS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbUdsQ2FudmFzOwotICAgICAgICAgICAgICAgIGlmIChtR0wgIT0gbnVsbCAmJiBjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1HTC5nbENsZWFyQ29sb3IoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1HTC5nbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLQotICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tRHJhd2luZ1RpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtVmlldy5tUHJpdmF0ZUZsYWdzIHw9IFZpZXcuRFJBV047Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgLXlvZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2xhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNsYXRvci50cmFuc2xhdGVDYW52YXMoY2FudmFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRTY3JlZW5EZW5zaXR5KHNjYWxpbmdSZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5jb25zaXN0ZW5jeUNoZWNrRW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoQ29uc2lzdGVuY3lDaGVjayhWaWV3RGVidWcuQ09OU0lTVEVOQ1lfRFJBV0lORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVnbC5lZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgICAgICAgICAgICAgICAgICBjaGVja0VnbEVycm9ycygpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX0ZQUyB8fCBDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnNob3dGcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3cgPSAoaW50KVN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNEcmF3VGltZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2hvd0ZQUyhjYW52YXMsIG5vdyAtIHNEcmF3VGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzRHJhd1RpbWUgPSBub3c7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2Nyb2xsaW5nKSB7Ci0gICAgICAgICAgICAgICAgbUZ1bGxSZWRyYXdOZWVkZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHNjaGVkdWxlVHJhdmVyc2FscygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CiAKICAgICAgICAgaWYgKGZ1bGxSZWRyYXdOZWVkZWQpIHsKICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgIGRpcnR5LnVuaW9uKDAsIDAsIChpbnQpIChtV2lkdGggKiBhcHBTY2FsZSArIDAuNWYpLCAoaW50KSAobUhlaWdodCAqIGFwcFNjYWxlICsgMC41ZikpOwogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIgIT0gbnVsbCAmJiBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKCFkaXJ0eS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5kcmF3KG1WaWV3LCBtQXR0YWNoSW5mbywgeW9mZik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzY3JvbGxpbmcpIHsKKyAgICAgICAgICAgICAgICBtRnVsbFJlZHJhd05lZWRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2NoZWR1bGVUcmF2ZXJzYWxzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChERUJVR19PUklFTlRBVElPTiB8fCBERUJVR19EUkFXKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJEcmF3ICIgKyBtVmlldyArICIvIgpAQCAtMTQ4Miw3ICsxMzM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnByb2ZpbGVEcmF3aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfUFJPRklMRV9EUkFXSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0xNTA5LDcgKzEzNjYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtZXRyaWNzPSIgKyBjeHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGNvbXBhdGliaWxpdHlJbmZvPSIgKyBjeHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29tcGF0aWJpbGl0eUluZm8oKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHKTsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgLXlvZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2xhdG9yICE9IG51bGwpIHsKQEAgLTE1MjAsMTQgKzEzNzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmRyYXcoY2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLmNvbnNpc3RlbmN5Q2hlY2tFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaENvbnNpc3RlbmN5Q2hlY2soVmlld0RlYnVnLkNPTlNJU1RFTkNZX0RSQVdJTkcpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfRlBTIHx8IENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuc2hvd0ZwcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19GUFMgfHwgVmlld0RlYnVnLkRFQlVHX1NIT1dfRlBTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm93ID0gKGludClTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzRHJhd1RpbWUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNob3dGUFMoY2FudmFzLCBub3cgLSBzRHJhd1RpbWUpOwpAQCAtMTUzNSw3ICsxMzkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNEcmF3VGltZSA9IG5vdzsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnByb2ZpbGVEcmF3aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfUFJPRklMRV9EUkFXSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDYwMDAwLCBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIHN0YXJ0VGltZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xNzM4LDggKzE1OTMsNiBAQAogICAgIH0KIAogICAgIHZvaWQgZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoVEFHLCAiRGV0YWNoaW5nIGluICIgKyB0aGlzICsgIiBvZiAiICsgbVN1cmZhY2UpOwotCiAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwogICAgICAgICB9CkBAIC0xNzQ4LDkgKzE2MDEsOCBAQAogICAgICAgICBtQXR0YWNoSW5mby5tUm9vdFZpZXcgPSBudWxsOwogICAgICAgICBtQXR0YWNoSW5mby5tU3VyZmFjZSA9IG51bGw7CiAKLSAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgIH0KKyAgICAgICAgZGVzdHJveUhhcmR3YXJlUmVuZGVyZXIoKTsKKwogICAgICAgICBtU3VyZmFjZS5yZWxlYXNlKCk7CiAKICAgICAgICAgaWYgKG1JbnB1dENoYW5uZWwgIT0gbnVsbCkgewpAQCAtMTgzNyw2ICsxNjg5LDcgQEAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBGSU5JU0hfSU5QVVRfQ09OTkVDVElPTiA9IDEwMTI7CiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hFQ0tfRk9DVVMgPSAxMDEzOwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENMT1NFX1NZU1RFTV9ESUFMT0dTID0gMTAxNDsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVNQQVRDSF9EUkFHX0VWRU5UID0gMTAxNTsKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKQEAgLTE5MzksMTggKzE3OTIsOSBAQAogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluVG91Y2hNb2RlID0gbXNnLmFyZzIgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgZW5zdXJlVG91Y2hNb2RlTG9jYWxseShpblRvdWNoTW9kZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvc3QgdGhlIGdsIGNvbnRleHQsIHNvIHJlY3JlYXRlIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCAmJiAhbVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUdMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbENhbnZhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFwcFNjYWxlID0gbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1HbENhbnZhcy5zZXRWaWV3cG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobVdpZHRoICogYXBwU2NhbGUgKyAwLjVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobUhlaWdodCAqIGFwcFNjYWxlICsgMC41ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyLmluaXRpYWxpemVJZk5lZWRlZChtV2lkdGgsIG1IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLCBtSG9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMjAwMCw4ICsxODQ0LDcgQEAKICAgICAgICAgICAgIGlmICgoZXZlbnQuZ2V0RmxhZ3MoKSZLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIElNRSBpcyB0cnlpbmcgdG8gc2F5IHRoaXMgZXZlbnQgaXMgZnJvbSB0aGUKICAgICAgICAgICAgICAgICAvLyBzeXN0ZW0hICBCYWQgYmFkIGJhZCEKLSAgICAgICAgICAgICAgICBldmVudCA9IEtleUV2ZW50LmNoYW5nZUZsYWdzKGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmxhZ3MoKSZ+S2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSk7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBLZXlFdmVudC5jaGFuZ2VGbGFncyhldmVudCwgZXZlbnQuZ2V0RmxhZ3MoKSAmIH5LZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudFRvVmlld0hpZXJhcmNoeSgoS2V5RXZlbnQpbXNnLm9iaiwgZmFsc2UpOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjAyMiw2ICsxODY1LDkgQEAKICAgICAgICAgICAgICAgICBtVmlldy5vbkNsb3NlU3lzdGVtRGlhbG9ncygoU3RyaW5nKW1zZy5vYmopOwogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIERJU1BBVENIX0RSQUdfRVZFTlQ6IHsKKyAgICAgICAgICAgIGhhbmRsZURyYWdFdmVudCgoRHJhZ0V2ZW50KW1zZy5vYmopOworICAgICAgICB9IGJyZWFrOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAtMjE4OSw2ICsyMDM1LDkgQEAKICAgICAgICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kpIHsKICAgICAgICAgICAgICAgICBsdC5zYW1wbGUoIkEgRGlzcGF0Y2hpbmcgVG91Y2hFdmVudHMiLCBTeXN0ZW0ubmFub1RpbWUoKSAtIGV2ZW50LmdldEV2ZW50VGltZU5hbm8oKSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjYWNoZSBmb3IgcG9zc2libGUgZHJhZy1pbml0aWF0aW9uCisgICAgICAgICAgICBtTGFzdFRvdWNoUG9pbnQueCA9IGV2ZW50LmdldFJhd1goKTsKKyAgICAgICAgICAgIG1MYXN0VG91Y2hQb2ludC55ID0gZXZlbnQuZ2V0UmF3WSgpOwogICAgICAgICAgICAgaGFuZGxlZCA9IG1WaWV3LmRpc3BhdGNoVG91Y2hFdmVudChldmVudCk7CiAgICAgICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7CiAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCJCIERpc3BhdGNoZWQgVG91Y2hFdmVudHMgIiwgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOwpAQCAtMjQ5OCw4ICsyMzQ3LDcgQEAKICAgICBwcml2YXRlIHZvaWQgZGVsaXZlcktleUV2ZW50KEtleUV2ZW50IGV2ZW50LCBib29sZWFuIHNlbmREb25lKSB7CiAgICAgICAgIC8vIElmIG1WaWV3IGlzIG51bGwsIHdlIGp1c3QgY29uc3VtZSB0aGUga2V5IGV2ZW50IGJlY2F1c2UgaXQgZG9lc24ndAogICAgICAgICAvLyBtYWtlIHNlbnNlIHRvIGRvIGFueXRoaW5nIGVsc2Ugd2l0aCBpdC4KLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gbVZpZXcgIT0gbnVsbAotICAgICAgICAgICAgICAgID8gbVZpZXcuZGlzcGF0Y2hLZXlFdmVudFByZUltZShldmVudCkgOiB0cnVlOworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBtVmlldyA9PSBudWxsIHx8IG1WaWV3LmRpc3BhdGNoS2V5RXZlbnRQcmVJbWUoZXZlbnQpOwogICAgICAgICBpZiAoaGFuZGxlZCkgewogICAgICAgICAgICAgaWYgKHNlbmREb25lKSB7CiAgICAgICAgICAgICAgICAgZmluaXNoSW5wdXRFdmVudCgpOwpAQCAtMjUzMSw3ICsyMzc5LDYgQEAKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VuZERvbmUgPSBzZXEgPj0gMDsKICAgICAgICAgICAgIGlmICghaGFuZGxlZCkgewogICAgICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudFRvVmlld0hpZXJhcmNoeShldmVudCwgc2VuZERvbmUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VuZERvbmUpIHsKICAgICAgICAgICAgICAgICBmaW5pc2hJbnB1dEV2ZW50KCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjYxMyw2ICsyNDYwLDkyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiBkcmFnL2Ryb3AgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRHJhZ0V2ZW50KERyYWdFdmVudCBldmVudCkgeworICAgICAgICAvLyBGcm9tIHRoZSByb290LCBvbmx5IGRyYWcgc3RhcnQvZW5kL2xvY2F0aW9uIGFyZSBkaXNwYXRjaGVkLiAgZW50ZXJlZC9leGl0ZWQKKyAgICAgICAgLy8gYXJlIGRldGVybWluZWQgYW5kIGRpc3BhdGNoZWQgYnkgdGhlIHZpZXdncm91cCBoaWVyYXJjaHksIHdobyB0aGVuIHJlcG9ydAorICAgICAgICAvLyB0aGF0IGJhY2sgaGVyZSBmb3IgdWx0aW1hdGUgcmVwb3J0aW5nIGJhY2sgdG8gdGhlIGZyYW1ld29yay4KKyAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwgJiYgbUFkZGVkKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IGV2ZW50Lm1BY3Rpb247CisKKyAgICAgICAgICAgIGlmICh3aGF0ID09IERyYWdFdmVudC5BQ1RJT05fRFJBR19FWElURUQpIHsKKyAgICAgICAgICAgICAgICAvLyBBIGRpcmVjdCBFWElURUQgZXZlbnQgbWVhbnMgdGhhdCB0aGUgd2luZG93IG1hbmFnZXIga25vd3Mgd2UndmUganVzdCBjcm9zc2VkCisgICAgICAgICAgICAgICAgLy8gYSB3aW5kb3cgYm91bmRhcnksIHNvIHRoZSBjdXJyZW50IGRyYWcgdGFyZ2V0IHdpdGhpbiB0aGlzIG9uZSBtdXN0IGhhdmUKKyAgICAgICAgICAgICAgICAvLyBqdXN0IGJlZW4gZXhpdGVkLiAgU2VuZCBpdCB0aGUgdXN1YWwgbm90aWZpY2F0aW9ucyBhbmQgdGhlbiB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgLy8gZm9yIG5vdy4KKyAgICAgICAgICAgICAgICBzZXREcmFnRm9jdXMoZXZlbnQsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgZHJhZyBkZXNjcmlwdGlvbiB3aGVuIHRoZSBvcGVyYXRpb24gc3RhcnRzLCB0aGVuIGZpbGwgaXQgaW4KKyAgICAgICAgICAgICAgICAvLyBvbiBzdWJzZXF1ZW50IGNhbGxzIGFzIGEgY29udmVuaWVuY2UKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfU1RBUlRFRCkgeworICAgICAgICAgICAgICAgICAgICBtRHJhZ0Rlc2NyaXB0aW9uID0gZXZlbnQubUNsaXBEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBldmVudC5tQ2xpcERlc2NyaXB0aW9uID0gbURyYWdEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBGb3IgZXZlbnRzIHdpdGggYSBbc2NyZWVuXSBsb2NhdGlvbiwgdHJhbnNsYXRlIGludG8gd2luZG93IGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgaWYgKCh3aGF0ID09IERyYWdFdmVudC5BQ1RJT05fRFJBR19MT0NBVElPTikgfHwgKHdoYXQgPT0gRHJhZ0V2ZW50LkFDVElPTl9EUk9QKSkgeworICAgICAgICAgICAgICAgICAgICBtRHJhZ1BvaW50LnNldChldmVudC5tWCwgZXZlbnQubVkpOworICAgICAgICAgICAgICAgICAgICBpZiAobVRyYW5zbGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zbGF0b3IudHJhbnNsYXRlUG9pbnRJblNjcmVlblRvQXBwV2luZG93KG1EcmFnUG9pbnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJTY3JvbGxZICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnUG9pbnQub2Zmc2V0KDAsIG1DdXJTY3JvbGxZKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm1YID0gbURyYWdQb2ludC54OworICAgICAgICAgICAgICAgICAgICBldmVudC5tWSA9IG1EcmFnUG9pbnQueTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB3aG8gdGhlIGN1cnJlbnQgZHJhZyB0YXJnZXQgaXMgcHJlLWRpc3BhdGNoCisgICAgICAgICAgICAgICAgZmluYWwgVmlldyBwcmV2RHJhZ1ZpZXcgPSBtQ3VycmVudERyYWdWaWV3OworCisgICAgICAgICAgICAgICAgLy8gTm93IGRpc3BhdGNoIHRoZSBkcmFnL2Ryb3AgZXZlbnQKKyAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaERyYWdFdmVudChldmVudCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjaGFuZ2VkIGFwcGFyZW50IGRyYWcgdGFyZ2V0LCB0ZWxsIHRoZSBPUyBhYm91dCBpdAorICAgICAgICAgICAgICAgIGlmIChwcmV2RHJhZ1ZpZXcgIT0gbUN1cnJlbnREcmFnVmlldykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZEcmFnVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1dpbmRvd1Nlc3Npb24uZHJhZ1JlY2lwaWVudEV4aXRlZChtV2luZG93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudERyYWdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzV2luZG93U2Vzc2lvbi5kcmFnUmVjaXBpZW50RW50ZXJlZChtV2luZG93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJVbmFibGUgdG8gbm90ZSBkcmFnIHRhcmdldCBjaGFuZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudERyYWdWaWV3ID0gcHJldkRyYWdWaWV3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBldmVudC5yZWN5Y2xlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0TGFzdFRvdWNoUG9pbnQoUG9pbnQgb3V0TG9jYXRpb24pIHsKKyAgICAgICAgb3V0TG9jYXRpb24ueCA9IChpbnQpIG1MYXN0VG91Y2hQb2ludC54OworICAgICAgICBvdXRMb2NhdGlvbi55ID0gKGludCkgbUxhc3RUb3VjaFBvaW50Lnk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJhZ0ZvY3VzKERyYWdFdmVudCBldmVudCwgVmlldyBuZXdEcmFnVGFyZ2V0KSB7CisgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5tQWN0aW9uOworICAgICAgICAvLyBJZiB3ZSd2ZSBkcmFnZ2VkIG9mZiBvZiBhIHZpZXcsIHNlbmQgaXQgdGhlIEVYSVRFRCBtZXNzYWdlCisgICAgICAgIGlmIChtQ3VycmVudERyYWdWaWV3ICE9IG5ld0RyYWdUYXJnZXQpIHsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudERyYWdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBldmVudC5tQWN0aW9uID0gRHJhZ0V2ZW50LkFDVElPTl9EUkFHX0VYSVRFRDsKKyAgICAgICAgICAgICAgICBtQ3VycmVudERyYWdWaWV3LmRpc3BhdGNoRHJhZ0V2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSd2ZSBkcmFnZ2VkIG92ZXIgYSBuZXcgdmlldywgc2VuZCBpdCB0aGUgRU5URVJFRCBtZXNzYWdlCisgICAgICAgIGlmIChuZXdEcmFnVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV2ZW50Lm1BY3Rpb24gPSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5URVJFRDsKKyAgICAgICAgICAgIG5ld0RyYWdUYXJnZXQuZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50RHJhZ1ZpZXcgPSBuZXdEcmFnVGFyZ2V0OworICAgICAgICBldmVudC5tQWN0aW9uID0gYWN0aW9uOyAgLy8gcmVzdG9yZSB0aGUgZXZlbnQncyBvcmlnaW5hbCBzdGF0ZQorICAgIH0KKwogICAgIHByaXZhdGUgQXVkaW9NYW5hZ2VyIGdldEF1ZGlvTWFuYWdlcigpIHsKICAgICAgICAgaWYgKG1WaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldEF1ZGlvTWFuYWdlciBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBtVmlldyIpOwpAQCAtMjczMCw5ICsyNjYzLDExIEBACiAKICAgICB2b2lkIGRvRGllKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwotICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KFRBRywgIkRJRSBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKKyAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KFRBRywgIkRJRSBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobUFkZGVkICYmICFtRmlyc3QpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95SGFyZHdhcmVSZW5kZXJlcigpOworCiAgICAgICAgICAgICAgICAgaW50IHZpZXdWaXNpYmlsaXR5ID0gbVZpZXcuZ2V0VmlzaWJpbGl0eSgpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gdmlld1Zpc2liaWxpdHlDaGFuZ2VkID0gbVZpZXdWaXNpYmlsaXR5ICE9IHZpZXdWaXNpYmlsaXR5OwogICAgICAgICAgICAgICAgIGlmIChtV2luZG93QXR0cmlidXRlc0NoYW5nZWQgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkKSB7CkBAIC0yNzU3LDYgKzI2OTIsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBkZXN0cm95SGFyZHdhcmVSZW5kZXJlcigpIHsKKyAgICAgICAgaWYgKG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyLmRlc3Ryb3kodHJ1ZSk7CisgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlciA9IG51bGw7CisgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVBY2NlbGVyYXRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hGaW5pc2hlZEV2ZW50KGludCBzZXEsIGJvb2xlYW4gaGFuZGxlZCkgewogICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRklOSVNIRURfRVZFTlQpOwogICAgICAgICBtc2cuYXJnMSA9IHNlcTsKQEAgLTI4MDksMTMgKzI3NTIsMTIgQEAKICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCiAgICAgICAgIGlmIChmYWxzZSAmJiBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgaWYgKGV2ZW50LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5LRVlDT0RFX0NBTUVSQSkgewotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLCAiRm9jdXNlZCB2aWV3IEhpZXJhcmNoeSBpczoiKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICJGb2N1c2VkIHZpZXcgSGllcmFyY2h5IGlzOiIpOworCiAgICAgICAgICAgICAgICAgZGVidWcoKTsKIAotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKCJrZXlkaXNwIiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI4OTUsNyArMjgzNywxMiBAQAogICAgICAgICBtc2cub2JqID0gcmVhc29uOwogICAgICAgICBzZW5kTWVzc2FnZShtc2cpOwogICAgIH0KLSAgICAKKworICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRHJhZ0V2ZW50KERyYWdFdmVudCBldmVudCkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRElTUEFUQ0hfRFJBR19FVkVOVCwgZXZlbnQpOworICAgICAgICBzZW5kTWVzc2FnZShtc2cpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRoZSB3aW5kb3cgaXMgZ2V0dGluZyBmb2N1cyBzbyBpZiB0aGVyZSBpcyBhbnl0aGluZyBmb2N1c2VkL3NlbGVjdGVkCiAgICAgICogc2VuZCBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSB0byBhbm5vdW5jZSB0aGF0LgpAQCAtMjkxNSwxNiArMjg2MiwxNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBvcmlnaW5hbFZpZXcsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSkgewogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNoaWxkRHJhd2FibGVTdGF0ZUNoYW5nZWQoVmlldyBjaGlsZCkgewogICAgIH0KIAotICAgIHByb3RlY3RlZCBSZWN0IGdldFdpbmRvd0ZyYW1lKCkgewotICAgICAgICByZXR1cm4gbVdpbkZyYW1lOwotICAgIH0KLQogICAgIHZvaWQgY2hlY2tUaHJlYWQoKSB7CiAgICAgICAgIGlmIChtVGhyZWFkICE9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb24oCkBAIC0zMDAzLDE2ICsyOTUwLDE1IEBACiAgICAgc3RhdGljIGNsYXNzIFcgZXh0ZW5kcyBJV2luZG93LlN0dWIgewogICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Vmlld1Jvb3Q+IG1WaWV3Um9vdDsKIAotICAgICAgICBwdWJsaWMgVyhWaWV3Um9vdCB2aWV3Um9vdCwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIFcoVmlld1Jvb3Qgdmlld1Jvb3QpIHsKICAgICAgICAgICAgIG1WaWV3Um9vdCA9IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXdSb290Pih2aWV3Um9vdCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCByZXNpemVkKGludCB3LCBpbnQgaCwgUmVjdCBjb3ZlcmVkSW5zZXRzLAotICAgICAgICAgICAgICAgIFJlY3QgdmlzaWJsZUluc2V0cywgYm9vbGVhbiByZXBvcnREcmF3LCBDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBwdWJsaWMgdm9pZCByZXNpemVkKGludCB3LCBpbnQgaCwgUmVjdCBjb3ZlcmVkSW5zZXRzLCBSZWN0IHZpc2libGVJbnNldHMsCisgICAgICAgICAgICAgICAgYm9vbGVhbiByZXBvcnREcmF3LCBDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewogICAgICAgICAgICAgZmluYWwgVmlld1Jvb3Qgdmlld1Jvb3QgPSBtVmlld1Jvb3QuZ2V0KCk7CiAgICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZpZXdSb290LmRpc3BhdGNoUmVzaXplZCh3LCBoLCBjb3ZlcmVkSW5zZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZUluc2V0cywgcmVwb3J0RHJhdywgbmV3Q29uZmlnKTsKKyAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaFJlc2l6ZWQodywgaCwgY292ZXJlZEluc2V0cywgdmlzaWJsZUluc2V0cywgcmVwb3J0RHJhdywgbmV3Q29uZmlnKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zMTA3LDYgKzMwNTMsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvKiBEcmFnL2Ryb3AgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEcmFnRXZlbnQoRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3Um9vdCB2aWV3Um9vdCA9IG1WaWV3Um9vdC5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNDE1LDggKzMzNjksNCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNob3dGUFMoQ2FudmFzIGNhbnZhcywgaW50IGR1cmF0aW9uTWlsbGlzKTsKLQotICAgIC8vIGluZm9ybSBza2lhIHRvIGp1c3QgYWJhbmRvbiBpdHMgdGV4dHVyZSBjYWNoZSBJRHMKLSAgICAvLyBkb2Vzbid0IGNhbGwgZ2xEZWxldGVUZXh0dXJlcwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUFiYW5kb25HbENhY2hlcygpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKaW5kZXggMTFjMDljMS4uOWZhZGM1OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCkBAIC01NiwxMSArNTYsMjggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0NPTlRFWFRfTUVOVSA9IDY7CiAgICAgLyoqIEZsYWcgZm9yIGN1c3RvbSB0aXRsZS4gWW91IGNhbm5vdCBjb21iaW5lIHRoaXMgZmVhdHVyZSB3aXRoIG90aGVyIHRpdGxlIGZlYXR1cmVzLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQ1VTVE9NX1RJVExFID0gNzsKLSAgICAvKiogRmxhZyBmb3IgYXNraW5nIGZvciBhbiBPcGVuR0wgZW5hYmxlZCB3aW5kb3cuCi0gICAgICAgIEFsbCAyRCBncmFwaGljcyB3aWxsIGJlIGhhbmRsZWQgYnkgT3BlbkdMIEVTLgotICAgICAgICBAaGlkZQotICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9PUEVOR0wgPSA4OworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGVuYWJsaW5nIHRoZSBBY3Rpb24gQmFyLgorICAgICAqIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBzb21lIGRldmljZXMuIFRoZSBBY3Rpb24gQmFyCisgICAgICogcmVwbGFjZXMgdGhlIHRpdGxlIGJhciBhbmQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRlIGxvY2F0aW9uCisgICAgICogZm9yIGFuIG9uLXNjcmVlbiBtZW51IGJ1dHRvbiBvbiBzb21lIGRldmljZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9BQ1RJT05fQkFSID0gODsKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciByZXF1ZXN0aW5nIGFuIEFjdGlvbiBCYXIgdGhhdCBvdmVybGF5cyB3aW5kb3cgY29udGVudC4KKyAgICAgKiBOb3JtYWxseSBhbiBBY3Rpb24gQmFyIHdpbGwgc2l0IGluIHRoZSBzcGFjZSBhYm92ZSB3aW5kb3cgY29udGVudCwgYnV0IGlmIHRoaXMKKyAgICAgKiBmZWF0dXJlIGlzIHJlcXVlc3RlZCBhbG9uZyB3aXRoIHtAbGluayAjRkVBVFVSRV9BQ1RJT05fQkFSfSBpdCB3aWxsIGJlIGxheWVyZWQgb3ZlcgorICAgICAqIHRoZSB3aW5kb3cgY29udGVudCBpdHNlbGYuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3b3VsZCBsaWtlIHlvdXIgYXBwIHRvIGhhdmUgbW9yZSBjb250cm9sCisgICAgICogb3ZlciBob3cgdGhlIEFjdGlvbiBCYXIgaXMgZGlzcGxheWVkLCBzdWNoIGFzIGxldHRpbmcgYXBwbGljYXRpb24gY29udGVudCBzY3JvbGwgYmVuZWF0aAorICAgICAqIGFuIEFjdGlvbiBCYXIgd2l0aCBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgb3Igb3RoZXJ3aXNlIGRpc3BsYXlpbmcgYSB0cmFuc3BhcmVudC90cmFuc2x1Y2VudAorICAgICAqIEFjdGlvbiBCYXIgb3ZlciBhcHBsaWNhdGlvbiBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZID0gOTsKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBzcGVjaWZ5aW5nIHRoZSBiZWhhdmlvciBvZiBhY3Rpb24gbW9kZXMgd2hlbiBhbiBBY3Rpb24gQmFyIGlzIG5vdCBwcmVzZW50LgorICAgICAqIElmIG92ZXJsYXkgaXMgZW5hYmxlZCwgdGhlIGFjdGlvbiBtb2RlIFVJIHdpbGwgYmUgYWxsb3dlZCB0byBjb3ZlciBleGlzdGluZyB3aW5kb3cgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0FDVElPTl9NT0RFX09WRVJMQVkgPSAxMDsKICAgICAvKiogRmxhZyBmb3Igc2V0dGluZyB0aGUgcHJvZ3Jlc3MgYmFyJ3MgdmlzaWJpbGl0eSB0byBWSVNJQkxFICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfVklTSUJJTElUWV9PTiA9IC0xOwogICAgIC8qKiBGbGFnIGZvciBzZXR0aW5nIHRoZSBwcm9ncmVzcyBiYXIncyB2aXNpYmlsaXR5IHRvIEdPTkUgKi8KQEAgLTEwOSw2ICsxMjYsOCBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNTb2Z0SW5wdXRNb2RlID0gZmFsc2U7CiAgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIG1EZXN0cm95ZWQ7CisKICAgICAvLyBUaGUgY3VycmVudCB3aW5kb3cgYXR0cmlidXRlcy4KICAgICBwcml2YXRlIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1XaW5kb3dBdHRyaWJ1dGVzID0KICAgICAgICAgbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKCk7CkBAIC0yOTIsNiArMzExLDE0IEBACiAgICAgICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TZWFyY2hSZXF1ZXN0ZWQoKSAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2VhcmNoUmVxdWVzdGVkKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFuIGFjdGlvbiBtb2RlIGlzIGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayB0byBjb250cm9sIHRoZSBsaWZlY3ljbGUgb2YgdGhpcyBhY3Rpb24gbW9kZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBBY3Rpb25Nb2RlIHRoYXQgd2FzIHN0YXJ0ZWQsIG9yIG51bGwgaWYgaXQgd2FzIGNhbmNlbGVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZSBvblN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKTsKICAgICB9CiAKICAgICBwdWJsaWMgV2luZG93KENvbnRleHQgY29udGV4dCkgewpAQCAtMzUzLDYgKzM4MCwxNiBAQAogICAgICAgICByZXR1cm4gbUhhc0NoaWxkcmVuOwogICAgIH0KICAgICAKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBtRGVzdHJveWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Rlc3Ryb3llZCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZXN0cm95ZWQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB3aW5kb3cgbWFuYWdlciBmb3IgdXNlIGJ5IHRoaXMgV2luZG93IHRvLCBmb3IgZXhhbXBsZSwKICAgICAgKiBkaXNwbGF5IHBhbmVscy4gIFRoaXMgaXMgPGVtPm5vdDwvZW0+IHVzZWQgZm9yIGRpc3BsYXlpbmcgdGhlCkBAIC0zNjAsMjEgKzM5NywzNSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHdtIFRoZSBWaWV3TWFuYWdlciBmb3IgYWRkaW5nIG5ldyB3aW5kb3dzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwKLSAgICAgICAgICAgIElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBhcHBOYW1lKSB7CisgICAgcHVibGljIHZvaWQgc2V0V2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtLCBJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgYXBwTmFtZSkgeworICAgICAgICBzZXRXaW5kb3dNYW5hZ2VyKHdtLCBhcHBUb2tlbiwgYXBwTmFtZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd2luZG93IG1hbmFnZXIgZm9yIHVzZSBieSB0aGlzIFdpbmRvdyB0bywgZm9yIGV4YW1wbGUsCisgICAgICogZGlzcGxheSBwYW5lbHMuICBUaGlzIGlzIDxlbT5ub3Q8L2VtPiB1c2VkIGZvciBkaXNwbGF5aW5nIHRoZQorICAgICAqIFdpbmRvdyBpdHNlbGYgLS0gdGhhdCBtdXN0IGJlIGRvbmUgYnkgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3bSBUaGUgVmlld01hbmFnZXIgZm9yIGFkZGluZyBuZXcgd2luZG93cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sIElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBhcHBOYW1lLAorICAgICAgICAgICAgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKSB7CiAgICAgICAgIG1BcHBUb2tlbiA9IGFwcFRva2VuOwogICAgICAgICBtQXBwTmFtZSA9IGFwcE5hbWU7CiAgICAgICAgIGlmICh3bSA9PSBudWxsKSB7CiAgICAgICAgICAgICB3bSA9IFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKTsKICAgICAgICAgfQotICAgICAgICBtV2luZG93TWFuYWdlciA9IG5ldyBMb2NhbFdpbmRvd01hbmFnZXIod20pOworICAgICAgICBtV2luZG93TWFuYWdlciA9IG5ldyBMb2NhbFdpbmRvd01hbmFnZXIod20sIGhhcmR3YXJlQWNjZWxlcmF0ZWQpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTG9jYWxXaW5kb3dNYW5hZ2VyIGltcGxlbWVudHMgV2luZG93TWFuYWdlciB7Ci0gICAgICAgIExvY2FsV2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtKSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGFyZHdhcmVBY2NlbGVyYXRlZDsKKworICAgICAgICBMb2NhbFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKSB7CiAgICAgICAgICAgICBtV2luZG93TWFuYWdlciA9IHdtOwogICAgICAgICAgICAgbURlZmF1bHREaXNwbGF5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGVmYXVsdERpc3BsYXkoCiAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkpOworICAgICAgICAgICAgbUhhcmR3YXJlQWNjZWxlcmF0ZWQgPSBoYXJkd2FyZUFjY2VsZXJhdGVkOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkVmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKSB7CkBAIC00MjEsNiArNDcyLDkgQEAKICAgICAgICAgICAgIGlmICh3cC5wYWNrYWdlTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgd3AucGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1IYXJkd2FyZUFjY2VsZXJhdGVkKSB7CisgICAgICAgICAgICAgICAgd3AuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmFkZFZpZXcodmlldywgcGFyYW1zKTsKICAgICAgICAgfQogCkBAIC03MTMsNiArNzY3LDE1IEBACiAgICAgICAgIHJldHVybiAobUZlYXR1cmVzJmZsYWcpICE9IDA7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGhpZGUgVXNlZCBpbnRlcm5hbGx5IHRvIGhlbHAgcmVzb2x2ZSBjb25mbGljdGluZyBmZWF0dXJlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVGZWF0dXJlKGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgZmluYWwgaW50IGZsYWcgPSAxPDxmZWF0dXJlSWQ7CisgICAgICAgIG1GZWF0dXJlcyAmPSB+ZmxhZzsKKyAgICAgICAgbUxvY2FsRmVhdHVyZXMgJj0gfihtQ29udGFpbmVyICE9IG51bGwgPyAoZmxhZyZ+bUNvbnRhaW5lci5tRmVhdHVyZXMpIDogZmxhZyk7CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIHZvaWQgbWFrZUFjdGl2ZSgpIHsKICAgICAgICAgaWYgKG1Db250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1Db250YWluZXIubUFjdGl2ZUNoaWxkICE9IG51bGwpIHsKQEAgLTgxNyw2ICs4ODAsOCBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdG9nZ2xlUGFuZWwoaW50IGZlYXR1cmVJZCwgS2V5RXZlbnQgZXZlbnQpOwogCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52YWxpZGF0ZVBhbmVsTWVudShpbnQgZmVhdHVyZUlkKTsKKyAgICAKICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwZXJmb3JtUGFuZWxTaG9ydGN1dChpbnQgZmVhdHVyZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50IGV2ZW50LApAQCAtOTk2LDYgKzEwNjEsMTYgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtRmVhdHVyZXM7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgY2VydGFpbiBmZWF0dXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmZWF0dXJlIFRoZSBmZWF0dXJlIElEIHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKGludCBmZWF0dXJlKSB7CisgICAgICAgIHJldHVybiAoZ2V0RmVhdHVyZXMoKSAmICgxIDw8IGZlYXR1cmUpKSAhPSAwOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgZmVhdHVyZSBiaXRzIHRoYXQgYXJlIGJlaW5nIGltcGxlbWVudGVkIGJ5IHRoaXMgV2luZG93LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQppbmRleCA5YzRhZWZlLi5lZGRkMDRlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQpAQCAtNzIsNiArNzIsNyBAQAogICAgICAgICAgKiBXaGVuIHVzaW5nIHtAbGluayBHcmF2aXR5I0xFRlR9IG9yIHtAbGluayBHcmF2aXR5I1JJR0hUfSBpdCBwcm92aWRlcwogICAgICAgICAgKiBhbiBvZmZzZXQgZnJvbSB0aGUgZ2l2ZW4gZWRnZS4KICAgICAgICAgICovCisgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQogICAgICAgICBwdWJsaWMgaW50IHg7CiAgICAgICAgIAogICAgICAgICAvKioKQEAgLTc5LDYgKzgwLDcgQEAKICAgICAgICAgICogV2hlbiB1c2luZyB7QGxpbmsgR3Jhdml0eSNUT1B9IG9yIHtAbGluayBHcmF2aXR5I0JPVFRPTX0gaXQgcHJvdmlkZXMKICAgICAgICAgICogYW4gb2Zmc2V0IGZyb20gdGhlIGdpdmVuIGVkZ2UuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGludCB5OwogCiAgICAgICAgIC8qKgpAQCAtODcsNiArODksNyBAQAogICAgICAgICAgKiBzaG91bGQgbm90IGJlIHN0cmV0Y2hlZC4gT3RoZXJ3aXNlIHRoZSBleHRyYSBwaXhlbHMgd2lsbCBiZSBwcm8tcmF0ZWQKICAgICAgICAgICogYW1vbmcgYWxsIHZpZXdzIHdob3NlIHdlaWdodCBpcyBncmVhdGVyIHRoYW4gMC4KICAgICAgICAgICovCisgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQogICAgICAgICBwdWJsaWMgZmxvYXQgaG9yaXpvbnRhbFdlaWdodDsKIAogICAgICAgICAvKioKQEAgLTk1LDggKzk4LDkgQEAKICAgICAgICAgICogc2hvdWxkIG5vdCBiZSBzdHJldGNoZWQuIE90aGVyd2lzZSB0aGUgZXh0cmEgcGl4ZWxzIHdpbGwgYmUgcHJvLXJhdGVkCiAgICAgICAgICAqIGFtb25nIGFsbCB2aWV3cyB3aG9zZSB3ZWlnaHQgaXMgZ3JlYXRlciB0aGFuIDAuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGZsb2F0IHZlcnRpY2FsV2VpZ2h0OwotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGdlbmVyYWwgdHlwZSBvZiB3aW5kb3cuICBUaGVyZSBhcmUgdGhyZWUgbWFpbiBjbGFzc2VzIG9mCiAgICAgICAgICAqIHdpbmRvdyB0eXBlczoKQEAgLTM0Myw2ICszNDcsMTMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TVEFUVVNfQkFSX1BBTkVMICAgPSBGSVJTVF9TWVNURU1fV0lORE9XKzE0OwogICAgICAgICAKICAgICAgICAgLyoqCisgICAgICAgICAqIFdpbmRvdyB0eXBlOiB0aGUgZHJhZy1hbmQtZHJvcCBwc2V1ZG93aW5kb3cuICBUaGVyZSBpcyBvbmx5IG9uZQorICAgICAgICAgKiBkcmFnIGxheWVyIChhdCBtb3N0KSwgYW5kIGl0IGlzIHBsYWNlZCBvbiB0b3Agb2YgYWxsIG90aGVyIHdpbmRvd3MuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RSQUcgICAgICAgICAgICAgICA9IEZJUlNUX1NZU1RFTV9XSU5ET1crMTU7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIEVuZCBvZiB0eXBlcyBvZiBzeXN0ZW0gd2luZG93cy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBU1RfU1lTVEVNX1dJTkRPVyAgICAgID0gMjk5OTsKQEAgLTM4OSw2ICs0MDAsNyBAQAogICAgICAgICAgKiBAc2VlICNGTEFHX0ZVTExTQ1JFRU4KICAgICAgICAgICogQHNlZSAjRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTgogICAgICAgICAgKiBAc2VlICNGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTCisgICAgICAgICAqIEBzZWUgI0ZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQKICAgICAgICAgICovCiAgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShmbGFnTWFwcGluZyA9IHsKICAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBGTEFHX0JMVVJfQkVISU5ELCBlcXVhbHMgPSBGTEFHX0JMVVJfQkVISU5ELApAQCAtNDIwLDcgKzQzMiw5IEBACiAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTiwKICAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTiwgbmFtZSA9ICJGTEFHX0ZPUkNFX05PVF9GVUxMU0NSRUVOIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUywKLSAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUywgbmFtZSA9ICJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIikKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUywgbmFtZSA9ICJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIiksCisgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCwgbmFtZSA9ICJGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIikKICAgICAgICAgfSkKICAgICAgICAgcHVibGljIGludCBmbGFnczsKICAgICAgICAgCkBAIC02MTYsNiArNjMwLDEyIEBACiAgICAgICAgICAqIGl0IGlzIGNyZWF0ZWQuCiAgICAgICAgICAqIHtAaGlkZX0gKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TWVNURU1fRVJST1IgPSAweDQwMDAwMDAwOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgd2luZG93IHNob3VsZCBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZC4KKyAgICAgICAgICogUmVxdWVzdGluZyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZG9lcyBub3QgZ3VhcmFudGVlIGl0IHdpbGwgaGFwcGVuLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDB4ODAwMDAwMDA7ICAgICAgICAKIAogICAgICAgICAvKioKICAgICAgICAgICogR2l2ZW4gYSBwYXJ0aWN1bGFyIHNldCBvZiB3aW5kb3cgbWFuYWdlciBmbGFncywgZGV0ZXJtaW5lIHdoZXRoZXIKQEAgLTEwODgsNiArMTEwOCw3IEBACiAgICAgICAgICAgICAgICAgc2NyZWVuT3JpZW50YXRpb24gPSBvLnNjcmVlbk9yaWVudGF0aW9uOwogICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gU0NSRUVOX09SSUVOVEFUSU9OX0NIQU5HRUQ7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwogICAgICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCmluZGV4IDAxODYyNzAuLmY0MDZkYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCkBAIC05NCw3ICs5NCw5IEBACiAgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlciBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChzSW5zdGFuY2VTeW5jKSB7CiAgICAgICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIoY29udGV4dCk7CisgICAgICAgICAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHNlcnZpY2UgPSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShpQmluZGVyKTsKKyAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIoY29udGV4dCwgc2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKQEAgLTEwNCwxMyArMTA2LDE2IEBACiAgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbnRleHQgQSB7QGxpbmsgQ29udGV4dH0uCisgICAgICogQHBhcmFtIHNlcnZpY2UgQW4gaW50ZXJmYWNlIHRvIHRoZSBiYWNraW5nIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHNlcnZpY2UpIHsKICAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKGNvbnRleHQuZ2V0TWFpbkxvb3BlcigpKTsKLSAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1TZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKKwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVNlcnZpY2UuYWRkQ2xpZW50KG1DbGllbnQpOworICAgICAgICAgICAgbUlzRW5hYmxlZCA9IG1TZXJ2aWNlLmFkZENsaWVudChtQ2xpZW50KTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlIGlzIGRlYWQiLCByZSk7CiAgICAgICAgIH0KQEAgLTEyOCw2ICsxMzMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgaW50ZXJmYWNlIHRoaXMgaW5zdGFuY2UgcmVnaXN0ZXJzIGluCisgICAgICogdGhlIGNlbnRyYWxpemVkIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY2xpZW50LgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICByZXR1cm4gKElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCkgbUNsaWVudC5hc0JpbmRlcigpOyAKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZW5kcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fS4gSWYgdGhpcyB7QGxpbmsgQWNjZXNzaWJpbGl0eU1hbmFnZXJ9IGlzIG5vdAogICAgICAqIGVuYWJsZWQgdGhlIGNhbGwgaXMgYSBOT09QLgogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKaW5kZXggMzI3ODhiZS4uNzYzMzU2OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbApAQCAtMjksNyArMjksNyBAQAogICovCiBpbnRlcmZhY2UgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHsKIAotICAgIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpOworICAgIGJvb2xlYW4gYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpOwogCiAgICAgYm9vbGVhbiBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGluIEFjY2Vzc2liaWxpdHlFdmVudCB1aUV2ZW50KTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQppbmRleCAzNDliN2U1Li45YTFlNDFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQpAQCAtMTc0LDcgKzE3NCwxMyBAQAogICAgICAqIERlc2lyZWQgWiBvcmRlciBtb2RlIGR1cmluZyBhbmltYXRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbVpBZGp1c3RtZW50OwotICAgIAorCisgICAgLyoqCisgICAgICogc2NhbGVmYWN0b3IgdG8gYXBwbHkgdG8gcGl2b3QgcG9pbnRzLCBldGMuIGR1cmluZyBhbmltYXRpb24uIFN1YmNsYXNzZXMgcmV0cmlldmUgdGhlCisgICAgICogdmFsdWUgdmlhIGdldFNjYWxlRmFjdG9yKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVGYWN0b3IgPSAxZjsKKwogICAgIC8qKgogICAgICAqIERvbid0IGFuaW1hdGUgdGhlIHdhbGxwYXBlci4KICAgICAgKi8KQEAgLTMwMSw3ICszMDcsNyBAQAogICAgICAqIGFuaW1hdGVkIGFzIHdlbGwgYXMgdGhlIG9iamVjdHMgcGFyZW50cy4gKFRoaXMgaXMgdG8gc3VwcG9ydCBhbmltYXRpb24KICAgICAgKiBzaXplcyBiZWluZyBzcGVjaWZlZCByZWxhdGl2ZSB0byB0aGVzZSBkaW1lbnNpb25zLikKICAgICAgKgotICAgICAqIDxwPk9iamVjdHMgdGhhdCBpbnRlcnByZXQgYSBBbmltYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4KKyAgICAgKiA8cD5PYmplY3RzIHRoYXQgaW50ZXJwcmV0IEFuaW1hdGlvbnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgd2hlbgogICAgICAqIHRoZSBzaXplcyBvZiB0aGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkIGFuZCBpdHMgcGFyZW50IGFyZSBrbm93biwgYW5kCiAgICAgICogYmVmb3JlIGNhbGxpbmcge0BsaW5rICNnZXRUcmFuc2Zvcm1hdGlvbn0uCiAgICAgICoKQEAgLTU1Myw2ICs1NTksMTkgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogVGhlIHNjYWxlIGZhY3RvciBpcyBzZXQgYnkgdGhlIGNhbGwgdG8gPGNvZGU+Z2V0VHJhbnNmb3JtYXRpb248L2NvZGU+LiBPdmVycmlkZXMgb2YgCisgICAgICoge0BsaW5rICNnZXRUcmFuc2Zvcm1hdGlvbihsb25nLCBUcmFuc2Zvcm1hdGlvbiwgZmxvYXQpfSB3aWxsIGdldCB0aGlzIHZhbHVlCisgICAgICogZGlyZWN0bHkuIE92ZXJyaWRlcyBvZiB7QGxpbmsgI2FwcGx5VHJhbnNmb3JtYXRpb24oZmxvYXQsIFRyYW5zZm9ybWF0aW9uKX0gY2FuCisgICAgICogY2FsbCB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIHZhbHVlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gZmxvYXQgVGhlIHNjYWxlIGZhY3RvciB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHByZS1zY2FsZWQgdmFsdWVzIGluCisgICAgICogYW4gQW5pbWF0aW9uIHN1Y2ggYXMgdGhlIHBpdm90IHBvaW50cyBpbiB7QGxpbmsgU2NhbGVBbmltYXRpb259IGFuZCB7QGxpbmsgUm90YXRlQW5pbWF0aW9ufS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmxvYXQgZ2V0U2NhbGVGYWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVGYWN0b3I7CisgICAgfQorCisgICAgLyoqCiAgICAgICogSWYgZGV0YWNoV2FsbHBhcGVyIGlzIHRydWUsIGFuZCB0aGlzIGlzIGEgd2luZG93IGFuaW1hdGlvbiBvZiBhIHdpbmRvdwogICAgICAqIHRoYXQgaGFzIGEgd2FsbHBhcGVyIGJhY2tncm91bmQsIHRoZW4gdGhlIHdpbmRvdyB3aWxsIGJlIGRldGFjaGVkIGZyb20KICAgICAgKiB0aGUgd2FsbHBhcGVyIHdoaWxlIGl0IHJ1bnMuICBUaGF0IGlzLCB0aGUgYW5pbWF0aW9uIHdpbGwgb25seSBiZSBhcHBsaWVkCkBAIC03MzUsNiArNzU0LDcgQEAKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBpcyBzdGlsbCBydW5uaW5nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNmb3JtYXRpb24obG9uZyBjdXJyZW50VGltZSwgVHJhbnNmb3JtYXRpb24gb3V0VHJhbnNmb3JtYXRpb24pIHsKKwogICAgICAgICBpZiAobVN0YXJ0VGltZSA9PSAtMSkgewogICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOwogICAgICAgICB9CkBAIC04MDYsNiArODI2LDI0IEBACiAKICAgICAgICAgcmV0dXJuIG1Nb3JlOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBhdCBhIHNwZWNpZmllZCBwb2ludCBpbiB0aW1lLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcworICAgICAqIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBUcmFuc2Zvcm1hdGlvbiBvciBkb2N1bWVudCB0aGV5IGFyZSBkb2luZworICAgICAqIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBXaGVyZSB3ZSBhcmUgaW4gdGhlIGFuaW1hdGlvbi4gVGhpcyBpcyB3YWxsIGNsb2NrIHRpbWUuCisgICAgICogQHBhcmFtIG91dFRyYW5zZm9ybWF0aW9uIEEgdHJhbmZvcm1hdGlvbiBvYmplY3QgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUKKyAgICAgKiAgICAgICAgY2FsbGVyIGFuZCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUgYW5pbWF0aW9uLgorICAgICAqIEBwYXJhbSBzY2FsZSBTY2FsaW5nIGZhY3RvciB0byBhcHBseSB0byBhbnkgaW5wdXRzIHRvIHRoZSB0cmFuc2Zvcm0gb3BlcmF0aW9uLCBzdWNoCisgICAgICogICAgICAgIHBpdm90IHBvaW50cyBiZWluZyByb3RhdGVkIG9yIHNjYWxlZCBhcm91bmQuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaXMgc3RpbGwgcnVubmluZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFRyYW5zZm9ybWF0aW9uKGxvbmcgY3VycmVudFRpbWUsIFRyYW5zZm9ybWF0aW9uIG91dFRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgbVNjYWxlRmFjdG9yID0gc2NhbGU7CisgICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1hdGlvbihjdXJyZW50VGltZSwgb3V0VHJhbnNmb3JtYXRpb24pOworICAgIH0KIAogICAgIC8qKgogICAgICAqIDxwPkluZGljYXRlcyB3aGV0aGVyIHRoaXMgYW5pbWF0aW9uIGhhcyBzdGFydGVkIG9yIG5vdC48L3A+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCmluZGV4IDE1NDZkY2QuLjg3M2NlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCkBAIC0zMTIsNyArMzEyLDcgQEAKICAgICAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiBhID0gYW5pbWF0aW9ucy5nZXQoaSk7CiAKICAgICAgICAgICAgIHRlbXAuY2xlYXIoKTsKLSAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGN1cnJlbnRUaW1lLCB0ZW1wKSB8fCBtb3JlOworICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oY3VycmVudFRpbWUsIHRlbXAsIGdldFNjYWxlRmFjdG9yKCkpIHx8IG1vcmU7CiAgICAgICAgICAgICB0LmNvbXBvc2UodGVtcCk7CiAKICAgICAgICAgICAgIHN0YXJ0ZWQgPSBzdGFydGVkIHx8IGEuaGFzU3RhcnRlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEKaW5kZXggMzA4ODM4Mi4uMzJmZjY0NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qYXZhCkBAIC0zMyw2ICszMywxNCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIEFuaW1hdGlvblV0aWxzIHsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHdoZW4gcGFyc2luZyBBbmltYXRvclNldCBvYmplY3RzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPR0VUSEVSID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOVElBTExZID0gMTsKKworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBhbmltYXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMuIFRoaXMgdGltZSBzaG91bGQgYmUgdXNlZCB3aGVuIGludm9raW5nCiAgICAgICoge0BsaW5rIEFuaW1hdGlvbiNzZXRTdGFydFRpbWUobG9uZyl9LiBSZWZlciB0byB7QGxpbmsgYW5kcm9pZC5vcy5TeXN0ZW1DbG9ja30gZm9yIG1vcmUKQEAgLTQ5LDcgKzU3LDcgQEAKIAogICAgIC8qKgogICAgICAqIExvYWRzIGFuIHtAbGluayBBbmltYXRpb259IG9iamVjdCBmcm9tIGEgcmVzb3VyY2UKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZXh0IEFwcGxpY2F0aW9uIGNvbnRleHQgdXNlZCB0byBhY2Nlc3MgcmVzb3VyY2VzCiAgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uIHRvIGxvYWQKICAgICAgKiBAcmV0dXJuIFRoZSBhbmltYXRpb24gb2JqZWN0IHJlZmVyZW5jZSBieSB0aGUgc3BlY2lmaWVkIGlkCkBAIC04MiwxMiArOTAsMTIgQEAKIAogICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0aW9uRnJvbVhtbChjLCBwYXJzZXIsIG51bGwsIFhtbC5hc0F0dHJpYnV0ZVNldChwYXJzZXIpKTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRpb24gY3JlYXRlQW5pbWF0aW9uRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAogICAgICAgICAgICAgQW5pbWF0aW9uU2V0IHBhcmVudCwgQXR0cmlidXRlU2V0IGF0dHJzKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAKKwogICAgICAgICBBbmltYXRpb24gYW5pbSA9IG51bGw7Ci0gCisKICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBvbiBhIHN0YXJ0IHRhZy4KICAgICAgICAgaW50IHR5cGU7CiAgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwpAQCAtMTAwLDcgKzEwOCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZyAgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7Ci0gICAgCisKICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygic2V0IikpIHsKICAgICAgICAgICAgICAgICBhbmltID0gbmV3IEFuaW1hdGlvblNldChjLCBhdHRycyk7CiAgICAgICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uRnJvbVhtbChjLCBwYXJzZXIsIChBbmltYXRpb25TZXQpYW5pbSwgYXR0cnMpOwpAQCAtMTIwLDcgKzEyOCw3IEBACiAgICAgICAgICAgICAgICAgcGFyZW50LmFkZEFuaW1hdGlvbihhbmltKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIAorCiAgICAgICAgIHJldHVybiBhbmltOwogCiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vSW50ZXJwb2xhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9JbnRlcnBvbGF0b3IuamF2YQppbmRleCBkMTRjM2UzMy4uNWQwZmU3ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vSW50ZXJwb2xhdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vSW50ZXJwb2xhdG9yLmphdmEKQEAgLTE2LDI0ICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldy5hbmltYXRpb247CiAKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5UaW1lSW50ZXJwb2xhdG9yOworCiAvKioKICAqIEFuIGludGVycG9sYXRvciBkZWZpbmVzIHRoZSByYXRlIG9mIGNoYW5nZSBvZiBhbiBhbmltYXRpb24uIFRoaXMgYWxsb3dzCiAgKiB0aGUgYmFzaWMgYW5pbWF0aW9uIGVmZmVjdHMgKGFscGhhLCBzY2FsZSwgdHJhbnNsYXRlLCByb3RhdGUpIHRvIGJlIAogICogYWNjZWxlcmF0ZWQsIGRlY2VsZXJhdGVkLCByZXBlYXRlZCwgZXRjLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEludGVycG9sYXRvciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFwcyBhIHBvaW50IG9uIHRoZSB0aW1lbGluZSB0byBhIG11bHRpcGxpZXIgdG8gYmUgYXBwbGllZCB0byB0aGUKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbnMgb2YgYW4gYW5pbWF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4wIGluZGljYXRpbmcgb3VyIGN1cnJlbnQgcG9pbnQKLSAgICAgKiAgICAgICAgaW4gdGhlIGFuaW1hdGlvbiB3aGVyZSAwIHJlcHJlc2VudHMgdGhlIHN0YXJ0IGFuZCAxLjAgcmVwcmVzZW50cwotICAgICAqICAgICAgICB0aGUgZW5kCi0gICAgICogQHJldHVybiBUaGUgaW50ZXJwb2xhdGlvbiB2YWx1ZS4gVGhpcyB2YWx1ZSBjYW4gYmUgbW9yZSB0aGFuIDEuMCBmb3IKLSAgICAgKiAgICAgICAgIEludGVycG9sYXRvcnMgd2hpY2ggb3ZlcnNob290IHRoZWlyIHRhcmdldHMsIG9yIGxlc3MgdGhhbiAwIGZvcgotICAgICAqICAgICAgICAgSW50ZXJwb2xhdG9ycyB0aGF0IHVuZGVyc2hvb3QgdGhlaXIgdGFyZ2V0cy4KLSAgICAgKi8KLSAgICBmbG9hdCBnZXRJbnRlcnBvbGF0aW9uKGZsb2F0IGlucHV0KTsKLSAgICAKK3B1YmxpYyBpbnRlcmZhY2UgSW50ZXJwb2xhdG9yIGV4dGVuZHMgVGltZUludGVycG9sYXRvciB7CisgICAgLy8gQSBuZXcgaW50ZXJmYWNlLCBUaW1lSW50ZXJwb2xhdG9yLCB3YXMgaW50cm9kdWNlZCBmb3IgdGhlIG5ldyBhbmRyb2lkLmFuaW1hdGlvbgorICAgIC8vIHBhY2thZ2UuIFRoaXMgb2xkZXIgSW50ZXJwb2xhdG9yIGludGVyZmFjZSBleHRlbmRzIFRpbWVJbnRlcnBvbGF0b3Igc28gdGhhdCB1c2VycyBvZgorICAgIC8vIHRoZSBuZXcgQW5pbWF0b3ItYmFzZWQgYW5pbWF0aW9ucyBjYW4gdXNlIGVpdGhlciB0aGUgb2xkIEludGVycG9sYXRvciBpbXBsZW1lbnRhdGlvbnMgb3IKKyAgICAvLyBuZXcgY2xhc3NlcyB0aGF0IGltcGxlbWVudCBUaW1lSW50ZXJwb2xhdG9yIGRpcmVjdGx5LgogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9Sb3RhdGVBbmltYXRpb24uamF2YQppbmRleCAyODRjY2NlLi41OGJmMDg0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9Sb3RhdGVBbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9Sb3RhdGVBbmltYXRpb24uamF2YQpAQCAtMTQ4LDExICsxNDgsMTIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0IGludGVycG9sYXRlZFRpbWUsIFRyYW5zZm9ybWF0aW9uIHQpIHsKICAgICAgICAgZmxvYXQgZGVncmVlcyA9IG1Gcm9tRGVncmVlcyArICgobVRvRGVncmVlcyAtIG1Gcm9tRGVncmVlcykgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKLQorICAgICAgICBmbG9hdCBzY2FsZSA9IGdldFNjYWxlRmFjdG9yKCk7CisgICAgICAgIAogICAgICAgICBpZiAobVBpdm90WCA9PSAwLjBmICYmIG1QaXZvdFkgPT0gMC4wZikgewogICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRSb3RhdGUoZGVncmVlcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0LmdldE1hdHJpeCgpLnNldFJvdGF0ZShkZWdyZWVzLCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0Um90YXRlKGRlZ3JlZXMsIG1QaXZvdFggKiBzY2FsZSwgbVBpdm90WSAqIHNjYWxlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEKaW5kZXggMWE1NmM4Yi4uODUzN2Q0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9TY2FsZUFuaW1hdGlvbi5qYXZhCkBAIC0xNjEsNiArMTYxLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0IGludGVycG9sYXRlZFRpbWUsIFRyYW5zZm9ybWF0aW9uIHQpIHsKICAgICAgICAgZmxvYXQgc3ggPSAxLjBmOwogICAgICAgICBmbG9hdCBzeSA9IDEuMGY7CisgICAgICAgIGZsb2F0IHNjYWxlID0gZ2V0U2NhbGVGYWN0b3IoKTsKIAogICAgICAgICBpZiAobUZyb21YICE9IDEuMGYgfHwgbVRvWCAhPSAxLjBmKSB7CiAgICAgICAgICAgICBzeCA9IG1Gcm9tWCArICgobVRvWCAtIG1Gcm9tWCkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKQEAgLTE3Miw3ICsxNzMsNyBAQAogICAgICAgICBpZiAobVBpdm90WCA9PSAwICYmIG1QaXZvdFkgPT0gMCkgewogICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRTY2FsZShzeCwgc3kpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRTY2FsZShzeCwgc3ksIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRTY2FsZShzeCwgc3ksIHNjYWxlICogbVBpdm90WCwgc2NhbGUgKiBtUGl2b3RZKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZC5qYXZhCmluZGV4IDJkZGY1ZjguLjVhYjNkMzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2QuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kLmphdmEKQEAgLTIxOSw0ICsyMTksMTAgQEAKICAgICAgKiB7QGxpbmsgSW5wdXRNZXRob2RNYW5hZ2VyI1JFU1VMVF9ISURERU4gSW5wdXRNZXRob2RNYW5hZ2VyLlJFU1VMVF9ISURERU59LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGhpZGVTb2Z0SW5wdXQoaW50IGZsYWdzLCBSZXN1bHRSZWNlaXZlciByZXN1bHRSZWNlaXZlcik7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhhdCB0aGUgaW5wdXQgbWV0aG9kIHN1YnR5cGUgaXMgYmVpbmcgY2hhbmdlZCBpbiB0aGUgc2FtZSBpbnB1dCBtZXRob2QuCisgICAgICogQHBhcmFtIHN1YnR5cGUgTmV3IHN1YnR5cGUgb2YgdGhlIG5vdGlmaWVkIGlucHV0IG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoYW5nZUlucHV0TWV0aG9kU3VidHlwZShJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZEluZm8uamF2YQppbmRleCAzNTdjYjVmZS4uNTQxMDJmNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZEluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCkBAIC0zNywxMyArMzcsMTQgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzcGVjaWZ5IG1ldGEgaW5mb3JtYXRpb24gb2YgYW4gaW5wdXQgbWV0aG9kLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgSW5wdXRNZXRob2RJbmZvIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiSW5wdXRNZXRob2RJbmZvIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFRoZSBTZXJ2aWNlIHRoYXQgaW1wbGVtZW50cyB0aGlzIGlucHV0IG1ldGhvZCBjb21wb25lbnQuCiAgICAgICovCkBAIC02OCw3ICs2OSwxMiBAQAogICAgICAqIGNhbiBjaGFuZ2UgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gKGluIHBhcnRpY3VsYXIgbG9jYWxlKS4KICAgICAgKi8KICAgICBmaW5hbCBpbnQgbUlzRGVmYXVsdFJlc0lkOwotICAgIAorCisgICAgLyoqCisgICAgICogVGhlIGFycmF5IG9mIHRoZSBzdWJ0eXBlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnB1dE1ldGhvZFN1YnR5cGU+IG1TdWJ0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPigpOworCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuCiAgICAgICogCkBAIC04MSwxMSArODcsMTEgQEAKICAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwogICAgICAgICBTZXJ2aWNlSW5mbyBzaSA9IHNlcnZpY2Uuc2VydmljZUluZm87CiAgICAgICAgIG1JZCA9IG5ldyBDb21wb25lbnROYW1lKHNpLnBhY2thZ2VOYW1lLCBzaS5uYW1lKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOwotICAgICAgICAKKwogICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgU3RyaW5nIHNldHRpbmdzQWN0aXZpdHlDb21wb25lbnQgPSBudWxsOwogICAgICAgICBpbnQgaXNEZWZhdWx0UmVzSWQgPSAwOwotICAgICAgICAKKwogICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcGFyc2VyID0gc2kubG9hZFhtbE1ldGFEYXRhKHBtLCBJbnB1dE1ldGhvZC5TRVJWSUNFX01FVEFfREFUQSk7CkBAIC0xMTYsMTMgKzEyMiwzOSBAQAogICAgICAgICAgICAgaXNEZWZhdWx0UmVzSWQgPSBzYS5nZXRSZXNvdXJjZUlkKAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5JbnB1dE1ldGhvZF9pc0RlZmF1bHQsIDApOwogICAgICAgICAgICAgc2EucmVjeWNsZSgpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKyAgICAgICAgICAgIC8vIFBhcnNlIGFsbCBzdWJ0eXBlcworICAgICAgICAgICAgd2hpbGUgKCgodHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKQorICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoISJzdWJ0eXBlIi5lcXVhbHMobm9kZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGEtZGF0YSBpbiBpbnB1dC1tZXRob2QgZG9lcyBub3Qgc3RhcnQgd2l0aCBzdWJ0eXBlIHRhZyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGVkQXJyYXkgYSA9IHJlcy5vYnRhaW5BdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5JbnB1dE1ldGhvZF9TdWJ0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUgPSBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLklucHV0TWV0aG9kX1N1YnR5cGVfbGFiZWwsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLklucHV0TWV0aG9kX1N1YnR5cGVfaWNvbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVMb2NhbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLklucHV0TWV0aG9kX1N1YnR5cGVfaW1lU3VidHlwZU1vZGUsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlRXh0cmFWYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICBtU3VidHlwZXMuYWRkKHN1YnR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBjb250ZXh0IGZvcjogIiArIHNpLnBhY2thZ2VOYW1lKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSA9IHNldHRpbmdzQWN0aXZpdHlDb21wb25lbnQ7CiAgICAgICAgIG1Jc0RlZmF1bHRSZXNJZCA9IGlzRGVmYXVsdFJlc0lkOwogICAgIH0KQEAgLTEzMiw4ICsxNjQsOSBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgICBtU2VydmljZSA9IFJlc29sdmVJbmZvLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChzb3VyY2UpOworICAgICAgICBzb3VyY2UucmVhZFR5cGVkTGlzdChtU3VidHlwZXMsIElucHV0TWV0aG9kU3VidHlwZS5DUkVBVE9SKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUZW1wb3JhcnkgQVBJIGZvciBjcmVhdGluZyBhIGJ1aWx0LWluIGlucHV0IG1ldGhvZC4KICAgICAgKi8KQEAgLTE1Niw3ICsxODksNyBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzZXR0aW5nc0FjdGl2aXR5OwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSAwOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBpbnB1dCBtZXRob2QuICBUaGUgSUQgaXMgZ2VuZXJhdGVkIGZyb20KICAgICAgKiB0aGUgcGFja2FnZSBhbmQgY2xhc3MgbmFtZSBpbXBsZW1lbnRpbmcgdGhlIG1ldGhvZC4KQEAgLTE2NCwxNCArMTk3LDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKICAgICAgICAgcmV0dXJuIG1JZDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIC5hcGsgcGFja2FnZSB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnB1dCBtZXRob2QuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmljZSBjb21wb25lbnQgdGhhdCBpbXBsZW1lbnRzCiAgICAgICogdGhpcyBpbnB1dCBtZXRob2QuCkBAIC0xOTYsNyArMjI5LDcgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLm5hbWUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGxhYmVsIGZvciB0aGlzIGlucHV0IG1ldGhvZC4KICAgICAgKiAKQEAgLTIwNiw3ICsyMzksNyBAQAogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgbG9hZExhYmVsKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkTGFiZWwocG0pOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGljb24gZm9yIHRoaXMgaW5wdXQgbWV0aG9kLgogICAgICAqIApAQCAtMjE2LDcgKzI0OSw3IEBACiAgICAgcHVibGljIERyYXdhYmxlIGxvYWRJY29uKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkSWNvbihwbSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIGFuIGFjdGl2aXR5IHRoYXQgcHJvdmlkZXMgYSBzZXR0aW5ncyBVSSBmb3IKICAgICAgKiB0aGUgaW5wdXQgbWV0aG9kLiAgWW91IGNhbiBsYXVuY2ggdGhpcyBhY3Rpdml0eSBiZSBzdGFydGluZyBpdCB3aXRoCkBAIC0yMzAsNyArMjYzLDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRTZXR0aW5nc0FjdGl2aXR5KCkgewogICAgICAgICByZXR1cm4gbVNldHRpbmdzQWN0aXZpdHlOYW1lOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3VidHlwZXMgb2YgSW5wdXQgTWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBnZXRTdWJ0eXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0eXBlczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSByZXNvdXJjZSBpbnNpZGUgb2YgdGhpcyBpbnB1dAogICAgICAqIG1ldGhvZCdzIC5hcGsgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYQpAQCAtMjM5LDcgKzI3OSw3IEBACiAgICAgcHVibGljIGludCBnZXRJc0RlZmF1bHRSZXNvdXJjZUlkKCkgewogICAgICAgICByZXR1cm4gbUlzRGVmYXVsdFJlc0lkOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGR1bXAoUHJpbnRlciBwdywgU3RyaW5nIHByZWZpeCkgewogICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJtSWQ9IiArIG1JZAogICAgICAgICAgICAgICAgICsgIiBtU2V0dGluZ3NBY3Rpdml0eU5hbWU9IiArIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CkBAIC0yODUsMTIgKzMyNSwxNCBAQAogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRGVmYXVsdFJlc0lkKTsKICAgICAgICAgbVNlcnZpY2Uud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZExpc3QobVN1YnR5cGVzKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBVc2VkIHRvIG1ha2UgdGhpcyBjbGFzcyBwYXJjZWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kSW5mbz4gQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RJbmZvPigpIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+KCkgewogICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dE1ldGhvZEluZm8oc291cmNlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyLmphdmEKaW5kZXggZTMwNjg3Zi4uOGUzNTVkNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kTWFuYWdlci5qYXZhCkBAIC0xMzgwLDcgKzEzODAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2hvd0lucHV0TWV0aG9kUGlja2VyKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1IKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTM5MSw2ICsxMzkxLDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzaG93SW5wdXRNZXRob2RTdWJ0eXBlUGlja2VyKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1IKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNob3dJbnB1dE1ldGhvZFN1YnR5cGVQaWNrZXJGcm9tQ2xpZW50KG1DbGllbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJTUUgZGllZDogIiArIG1DdXJJZCwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaG93SW5wdXRNZXRob2RBbmRTdWJ0eXBlRW5hYmxlcihTdHJpbmcgdG9wSWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtSCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zaG93SW5wdXRNZXRob2RBbmRTdWJ0eXBlRW5hYmxlckZyb21DbGllbnQobUNsaWVudCwgdG9wSWQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJTUUgZGllZDogIiArIG1DdXJJZCwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICB2b2lkIGRvRHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgZm91dCwgU3RyaW5nW10gYXJncykgewogICAgICAgICBmaW5hbCBQcmludGVyIHAgPSBuZXcgUHJpbnRXcml0ZXJQcmludGVyKGZvdXQpOwogICAgICAgICBwLnByaW50bG4oIklucHV0IG1ldGhvZCBjbGllbnQgc3RhdGUgZm9yICIgKyB0aGlzICsgIjoiKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RTdWJ0eXBlLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kU3VidHlwZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODJiODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kU3VidHlwZS5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZDsKKworcGFyY2VsYWJsZSBJbnB1dE1ldGhvZFN1YnR5cGU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kU3VidHlwZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZFN1YnR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVkMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZFN1YnR5cGUuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBnaXZlbiB0byBhbiB7QGxpbmsgSW5wdXRNZXRob2R9IGFib3V0IGEgY2xpZW50IGNvbm5lY3RpbmcKKyAqIHRvIGl0LgorICovCisvKioKKyAqIElucHV0TWV0aG9kU3VidHlwZSBpcyBhIHN1YnR5cGUgY29udGFpbmVkIGluIHRoZSBpbnB1dCBtZXRob2QuIFN1YnR5cGUgY2FuIGRlc2NyaWJlCisgKiBsb2NhbGVzIChlLmcuIGVuX1VTLCBmcl9GUi4uLikgYW5kIG1vZGVzIChlLmcuIHZvaWNlLCBrZXlib2FyZC4uLiksIGFuZCBpcyB1c2VkIGZvcgorICogSU1FIHN3aXRjaC4gVGhlIHN1YnR5cGUgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY2FsbCB0aGUgc3BlY2lmaWVkIHN1YnR5cGUgb2YgSU1FIGRpcmVjdGx5LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSW5wdXRNZXRob2RTdWJ0eXBlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN1YnR5cGVOYW1lUmVzSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN1YnR5cGVJY29uUmVzSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVN1YnR5cGVMb2NhbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN1YnR5cGVNb2RlUmVzSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVN1YnR5cGVFeHRyYVZhbHVlOworICAgIHByaXZhdGUgZmluYWwgaW50IG1TdWJ0eXBlSGFzaENvZGU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBuYW1lSWQgVGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgKiBAcGFyYW0gaWNvbklkIFRoZSBpY29uIG9mIHRoZSBzdWJ0eXBlCisgICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIHN1cHBvcnRlZCBieSB0aGUgc3VidHlwZQorICAgICAqIEBwYXJhbSBtb2RlSWQgVGhlIG1vZGUgc3VwcG9ydGVkIGJ5IHRoZSBzdWJ0eXBlCisgICAgICogQHBhcmFtIGV4dHJhVmFsdWUgVGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlCisgICAgICovCisgICAgSW5wdXRNZXRob2RTdWJ0eXBlKGludCBuYW1lSWQsIGludCBpY29uSWQsIFN0cmluZyBsb2NhbGUsIGludCBtb2RlSWQsIFN0cmluZyBleHRyYVZhbHVlKSB7CisgICAgICAgIG1TdWJ0eXBlTmFtZVJlc0lkID0gbmFtZUlkOworICAgICAgICBtU3VidHlwZUljb25SZXNJZCA9IGljb25JZDsKKyAgICAgICAgbVN1YnR5cGVMb2NhbGUgPSBsb2NhbGU7CisgICAgICAgIG1TdWJ0eXBlTW9kZVJlc0lkID0gbW9kZUlkOworICAgICAgICBtU3VidHlwZUV4dHJhVmFsdWUgPSBleHRyYVZhbHVlOworICAgICAgICBtU3VidHlwZUhhc2hDb2RlID0gaGFzaENvZGVJbnRlcm5hbChtU3VidHlwZU5hbWVSZXNJZCwgbVN1YnR5cGVJY29uUmVzSWQsIG1TdWJ0eXBlTG9jYWxlLAorICAgICAgICAgICAgICAgIG1TdWJ0eXBlTW9kZVJlc0lkLCBtU3VidHlwZUV4dHJhVmFsdWUpOworICAgIH0KKworICAgIElucHV0TWV0aG9kU3VidHlwZShQYXJjZWwgc291cmNlKSB7CisgICAgICAgIG1TdWJ0eXBlTmFtZVJlc0lkID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgbVN1YnR5cGVJY29uUmVzSWQgPSBzb3VyY2UucmVhZEludCgpOworICAgICAgICBtU3VidHlwZUxvY2FsZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1TdWJ0eXBlTW9kZVJlc0lkID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgbVN1YnR5cGVFeHRyYVZhbHVlID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbVN1YnR5cGVIYXNoQ29kZSA9IGhhc2hDb2RlSW50ZXJuYWwobVN1YnR5cGVOYW1lUmVzSWQsIG1TdWJ0eXBlSWNvblJlc0lkLCBtU3VidHlwZUxvY2FsZSwKKyAgICAgICAgICAgICAgICBtU3VidHlwZU1vZGVSZXNJZCwgbVN1YnR5cGVFeHRyYVZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdWJ0eXBlCisgICAgICovCisgICAgcHVibGljIGludCBnZXROYW1lUmVzSWQoKSB7CisgICAgICAgIHJldHVybiBtU3VidHlwZU5hbWVSZXNJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBpY29uIG9mIHRoZSBzdWJ0eXBlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJY29uUmVzSWQoKSB7CisgICAgICAgIHJldHVybiBtU3VidHlwZUljb25SZXNJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbGUgb2YgdGhlIHN1YnR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0eXBlTG9jYWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG1vZGUgb2YgdGhlIHN1YnR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1vZGVSZXNJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0eXBlTW9kZVJlc0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeHRyYVZhbHVlKCkgeworICAgICAgICByZXR1cm4gbVN1YnR5cGVFeHRyYVZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBtU3VidHlwZUhhc2hDb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElucHV0TWV0aG9kU3VidHlwZSkgeworICAgICAgICAgICAgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUgPSAoSW5wdXRNZXRob2RTdWJ0eXBlKSBvOworICAgICAgICAgICAgcmV0dXJuIChzdWJ0eXBlLmdldE5hbWVSZXNJZCgpID09IGdldE5hbWVSZXNJZCgpKQorICAgICAgICAgICAgICAgICYmIChzdWJ0eXBlLmdldE1vZGVSZXNJZCgpID09IGdldE1vZGVSZXNJZCgpKQorICAgICAgICAgICAgICAgICYmIChzdWJ0eXBlLmdldEljb25SZXNJZCgpID09IGdldEljb25SZXNJZCgpKQorICAgICAgICAgICAgICAgICYmIChzdWJ0eXBlLmdldExvY2FsZSgpLmVxdWFscyhnZXRMb2NhbGUoKSkpCisgICAgICAgICAgICAgICAgJiYgKHN1YnR5cGUuZ2V0RXh0cmFWYWx1ZSgpLmVxdWFscyhnZXRFeHRyYVZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgcGFyY2VsYWJsZUZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVN1YnR5cGVOYW1lUmVzSWQpOworICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlSWNvblJlc0lkKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZUxvY2FsZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVN1YnR5cGVNb2RlUmVzSWQpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlRXh0cmFWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RTdWJ0eXBlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RTdWJ0eXBlPigpIHsKKyAgICAgICAgcHVibGljIElucHV0TWV0aG9kU3VidHlwZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKHNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RTdWJ0eXBlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlW3NpemVdOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBoYXNoQ29kZUludGVybmFsKGludCBuYW1lUmVzSWQsIGludCBpY29uUmVzSWQsIFN0cmluZyBsb2NhbGUsCisgICAgICAgICAgICBpbnQgbW9kZVJlc0lkLCBTdHJpbmcgZXh0cmFWYWx1ZSkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmhhc2hDb2RlKG5ldyBPYmplY3RbXSB7bmFtZVJlc0lkLCBpY29uUmVzSWQsIGxvY2FsZSwgbW9kZVJlc0lkLCBleHRyYVZhbHVlfSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTE2YzhhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlNpbXBsZVN0cmluZ1NwbGl0dGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuRXZlbnRIdWI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworLyoqCisgKiBUaGlzIGNsYXNzIGluamVjdHMgYWNjZXNzaWJpbGl0eSBpbnRvIFdlYlZpZXdzIHdpdGggZGlzYWJsZWQgSmF2YVNjcmlwdCBvcgorICogV2ViVmlld3Mgd2l0aCBlbmFibGVkIEphdmFTY3JpcHQgYnV0IGZvciB3aGljaCB3ZSBoYXZlIG5vIGFjY2Vzc2liaWxpdHkKKyAqIHNjcmlwdCB0byBpbmplY3QuCisgKiA8L3A+CisgKiBOb3RlOiBUbyBhdm9pZCBjaGFuZ2VzIGluIHRoZSBmcmFtZXdvcmsgdXBvbiBjaGFuZ2luZyB0aGUgYXZhaWxhYmxlCisgKiAgICAgICBuYXZpZ2F0aW9uIGF4aXMsIG9yIHJlb3JkZXJpbmcgdGhlIG5hdmlnYXRpb24gYXhpcywgb3IgY2hhbmdpbmcKKyAqICAgICAgIHRoZSBrZXkgYmluZGluZ3MsIG9yIGRlZmluaW5nIHNlcXVlbmNlIG9mIGFjdGlvbnMgdG8gYmUgYm91bmQgdG8KKyAqICAgICAgIGEgZ2l2ZW4ga2V5IHRoaXMgY2xhc3MgaXMgbmF2aWdhdGlvbiBheGlzIGFnbm9zdGljLiBJdCBpcyBvbmx5CisgKiAgICAgICBhd2FyZSBvZiBvbmUgbmF2aWdhdGlvbiBheGlzIHdoaWNoIGlzIGluIGZhY3QgdGhlIGRlZmF1bHQgYmVoYXZpb3IKKyAqICAgICAgIG9mIHdlYlZpZXdzIHdoaWxlIHVzaW5nIHRoZSBEUEFEL1RyYWNrQmFsbC4KKyAqIDwvcD4KKyAqIEluIGdlbmVyYWwgYSBrZXkgYmluZGluZyBpcyBhIG1hcHBpbmcgZnJvbSBtZXRhIHN0YXRlICsga2V5IGNvZGUgdG8KKyAqIGEgc2VxdWVuY2Ugb2YgYWN0aW9ucy4gRm9yIG1vcmUgZGV0YWlsIGhvdyB0byBzcGVjaWZ5IGtleSBiaW5kaW5ncyByZWZlciB0bworICoge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI0FDQ0VTU0lCSUxJVFlfV0VCX0NPTlRFTlRfS0VZX0JJTkRJTkdTfS4KKyAqIDwvcD4KKyAqIFRoZSBwb3NzaWJsZSBhY3Rpb25zIGFyZSBpbnZvY2F0aW9ucyB0bworICoge0BsaW5rICNzZXRDdXJyZW50QXhpcyhpbnQsIGJvb2xlYW4sIFN0cmluZyl9LCBvcgorICoge0BsaW5rICN0cmF2ZXJzZUN1cnJlbnRBeGlzKGludCwgYm9vbGVhbiwgU3RyaW5nKX0KKyAqIHtAbGluayAjdHJhdmVyc2VHaXZlbkF4aXMoaW50LCBpbnQsIGJvb2xlYW4sIFN0cmluZyl9CisgKiB7QGxpbmsgI3ByZWZyb21BeGlzVHJhbnNpdGlvbihpbnQsIGludCwgYm9vbGVhbiwgU3RyaW5nKX0KKyAqIHJlZmVycmVkIHZpYSB0aGUgdmFsdWVzIG9mOgorICoge0BsaW5rICNBQ1RJT05fU0VUX0NVUlJFTlRfQVhJU30sCisgKiB7QGxpbmsgI0FDVElPTl9UUkFWRVJTRV9DVVJSRU5UX0FYSVN9LAorICoge0BsaW5rICNBQ1RJT05fVFJBVkVSU0VfR0lWRU5fQVhJU30sCisgKiB7QGxpbmsgI0FDVElPTl9QRVJGT1JNX0FYSVNfVFJBTlNJVElPTn0sCisgKiByZXNwZWN0aXZlbHkuCisgKiBUaGUgYXJndW1lbnRzIGZvciB0aGUgYWN0aW9uIGludm9jYXRpb24gYXJlIHNwZWNpZmllZCBhcyBvZmZzZXQKKyAqIGhleGFkZW1pY2FsIHBhaXJzLiBOb3RlIHRoZSBsYXN0IGFyZ3VtZW50IG9mIHRoZSBpbnZvY2F0aW9uCisgKiBzaG91bGQgTk9UIGJlIHNwZWNpZmllZCBpbiB0aGUgYmluZGluZyBhcyBpdCBpcyBwcm92aWRlZCBieQorICogdGhpcyBjbGFzcy4gRm9yIGRldGFpbHMgYWJvdXQgdGhlIGtleSBiaW5kaW5nIGltcGxlbWVudGF0aW9uCisgKiByZWZlciB0byB7QGxpbmsgQWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nfS4KKyAqLworY2xhc3MgQWNjZXNzaWJpbGl0eUluamVjdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBY2Nlc3NpYmlsaXR5SW5qZWN0b3IiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NFVF9DVVJSRU5UX0FYSVMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fVFJBVkVSU0VfQ1VSUkVOVF9BWElTID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1RSQVZFUlNFX0dJVkVOX0FYSVMgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fUEVSRk9STV9BWElTX1RSQU5TSVRJT04gPSAzOworCisgICAgLy8gdGhlIGRlZmF1bHQgV2ViVmlldyBiZWhhdmlvciBhYnN0cmFjdGVkIGFzIGEgbmF2aWdhdGlvbiBheGlzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fQVhJU19ERUZBVUxUX1dFQl9WSUVXX0JFSEFWSU9SID0gNzsKKworICAgIC8vIHRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgYWxsIGluc3RhbmNlcyBzbyBtYWtlIHRoZW0gcHJvY2VzcyB3aWRlCisgICAgcHJpdmF0ZSBzdGF0aWMgU3BhcnNlQXJyYXk8QWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nPiBzQmluZGluZ3MgPQorICAgICAgICBuZXcgU3BhcnNlQXJyYXk8QWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nPigpOworCisgICAgLy8gaGFuZGxlIHRvIHRoZSBXZWJWaWV3IHRoaXMgaW5qZWN0b3IgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIC8vIGV2ZW50cyBzY2hlZHVsZWQgZm9yIHNlbmRpbmcgYXMgc29vbiBhcyB3ZSByZWNlaXZlIHRoZSBzZWxlY3RlZCB0ZXh0CisgICAgcHJpdmF0ZSBmaW5hbCBTdGFjazxBY2Nlc3NpYmlsaXR5RXZlbnQ+IG1TY2hlZHVsZWRFdmVudFN0YWNrID0gbmV3IFN0YWNrPEFjY2Vzc2liaWxpdHlFdmVudD4oKTsKKworICAgIC8vIHRoZSBjdXJyZW50IHRyYXZlcnNhbCBheGlzCisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRBeGlzID0gMjsgLy8gc2VudGVuY2UKKworICAgIC8vIHdlIG5lZWQgdG8gY29uc3VtZSB0aGUgdXAgaWYgd2UgaGF2ZSBoYW5kbGVkIHRoZSBsYXN0IGRvd24KKyAgICBwcml2YXRlIGJvb2xlYW4gbUxhc3REb3duRXZlbnRIYW5kbGVkOworCisgICAgLy8gZ2V0dGluZyB0d28gZW1wdHkgc2VsZWN0aW9uIHN0cmluZ3MgaW4gYSByb3cgd2UgbGV0IHRoZSBXZWJWaWV3IGhhbmRsZSB0aGUgZXZlbnQKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzTGFzdFNlbGVjdGlvblN0cmluZ051bGw7CisKKyAgICAvLyBrZWVwIHRyYWNrIG9mIGxhc3QgZGlyZWN0aW9uCisgICAgcHJpdmF0ZSBpbnQgbUxhc3REaXJlY3Rpb247CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluamVjdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHtAbGluayBXZWJWaWV3fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJWaWV3IFRoZSBhc3NvY2lhdGVkIFdlYlZpZXcuCisgICAgICovCisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlJbmplY3RvcihXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBlbnN1cmVXZWJDb250ZW50S2V5QmluZGluZ3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgYSBrZXkgZG93biA8Y29kZT5ldmVudDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGV2ZW50IHdhcyBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlFdmVudChLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICByZXR1cm4gbUxhc3REb3duRXZlbnRIYW5kbGVkOworICAgICAgICB9CisKKyAgICAgICAgbUxhc3REb3duRXZlbnRIYW5kbGVkID0gZmFsc2U7CisKKyAgICAgICAgaW50IGtleSA9IGV2ZW50LmdldE1ldGFTdGF0ZSgpIDw8IEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZy5PRkZTRVRfTUVUQV9TVEFURSB8CisgICAgICAgICAgICBldmVudC5nZXRLZXlDb2RlKCkgPDwgQWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nLk9GRlNFVF9LRVlfQ09ERTsKKworICAgICAgICBBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmcgYmluZGluZyA9IHNCaW5kaW5ncy5nZXQoa2V5KTsKKyAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gYmluZGluZy5nZXRBY3Rpb25Db3VudCgpOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaW50IGFjdGlvbkNvZGUgPSBiaW5kaW5nLmdldEFjdGlvbkNvZGUoaSk7CisgICAgICAgICAgICBTdHJpbmcgY29udGVudERlc2NyaXB0aW9uID0gSW50ZWdlci50b0hleFN0cmluZyhiaW5kaW5nLmdldEFjdGlvbihpKSk7CisgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9TRVRfQ1VSUkVOVF9BWElTOgorICAgICAgICAgICAgICAgICAgICBpbnQgYXhpcyA9IGJpbmRpbmcuZ2V0Rmlyc3RBcmd1bWVudChpKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZW5kRXZlbnQgPSAoYmluZGluZy5nZXRTZWNvbmRBcmd1bWVudChpKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0Q3VycmVudEF4aXMoYXhpcywgc2VuZEV2ZW50LCBjb250ZW50RGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgICAgICBtTGFzdERvd25FdmVudEhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9UUkFWRVJTRV9DVVJSRU5UX0FYSVM6CisgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24gPSBiaW5kaW5nLmdldEZpcnN0QXJndW1lbnQoaSk7CisgICAgICAgICAgICAgICAgICAgIC8vIG9uIHNlY29uZCBudWxsIHNlbGVjdGlvbiBzdHJpbmcgaW4gc2FtZSBkaXJlY3Rpb24gPT4gV2ViVmlldyBoYW5kbGUgdGhlIGV2ZW50CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gbUxhc3REaXJlY3Rpb24gJiYgbUlzTGFzdFNlbGVjdGlvblN0cmluZ051bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzTGFzdFNlbGVjdGlvblN0cmluZ051bGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTGFzdERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50ID0gKGJpbmRpbmcuZ2V0U2Vjb25kQXJndW1lbnQoaSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0RG93bkV2ZW50SGFuZGxlZCA9IHRyYXZlcnNlQ3VycmVudEF4aXMoZGlyZWN0aW9uLCBzZW5kRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fVFJBVkVSU0VfR0lWRU5fQVhJUzoKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gYmluZGluZy5nZXRGaXJzdEFyZ3VtZW50KGkpOworICAgICAgICAgICAgICAgICAgICAvLyBvbiBzZWNvbmQgbnVsbCBzZWxlY3Rpb24gc3RyaW5nIGluIHNhbWUgZGlyZWN0aW9uID0+IFdlYlZpZXcgaGFuZGxlIHRoZSBldmVudAorICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IG1MYXN0RGlyZWN0aW9uICYmIG1Jc0xhc3RTZWxlY3Rpb25TdHJpbmdOdWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0xhc3RTZWxlY3Rpb25TdHJpbmdOdWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxhc3REaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgICAgICAgICAgICAgIGF4aXMgPSAgYmluZGluZy5nZXRTZWNvbmRBcmd1bWVudChpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50ID0gKGJpbmRpbmcuZ2V0VGhpcmRBcmd1bWVudChpKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VHaXZlbkF4aXMoZGlyZWN0aW9uLCBheGlzLCBzZW5kRXZlbnQsIGNvbnRlbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0RG93bkV2ZW50SGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX1BFUkZPUk1fQVhJU19UUkFOU0lUSU9OOgorICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbUF4aXMgPSBiaW5kaW5nLmdldEZpcnN0QXJndW1lbnQoaSk7CisgICAgICAgICAgICAgICAgICAgIGludCB0b0F4aXMgPSBiaW5kaW5nLmdldFNlY29uZEFyZ3VtZW50KGkpOworICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQgPSAoYmluZGluZy5nZXRUaGlyZEFyZ3VtZW50KGkpID09IDEpOworICAgICAgICAgICAgICAgICAgICBwcmVmcm9tQXhpc1RyYW5zaXRpb24oZnJvbUF4aXMsIHRvQXhpcywgc2VuZEV2ZW50LCBjb250ZW50RGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgICAgICBtTGFzdERvd25FdmVudEhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVW5rbm93biBhY3Rpb24gY29kZTogIiArIGFjdGlvbkNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1MYXN0RG93bkV2ZW50SGFuZGxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBheGlzIHdoaWNoIHdpbGwgYmUgdXNlZCB3aGlsZQorICAgICAqIGNhbGxpbmcge0BsaW5rICN0cmF2ZXJzZUN1cnJlbnRBeGlzKGludCwgYm9vbGVhbiwgU3RyaW5nKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBzZXQuCisgICAgICogQHBhcmFtIHNlbmRFdmVudCBXaGV0aGVyIHRvIHNlbmQgYW4gYWNjZXNzaWJpbGl0eSBldmVudCB0bworICAgICAqICAgICAgICBhbm5vdW5jZSB0aGUgY2hhbmdlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRDdXJyZW50QXhpcyhpbnQgYXhpcywgYm9vbGVhbiBzZW5kRXZlbnQsIFN0cmluZyBjb250ZW50RGVzY3JpcHRpb24pIHsKKyAgICAgICAgbUN1cnJlbnRBeGlzID0gYXhpczsKKyAgICAgICAgaWYgKHNlbmRFdmVudCkgeworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gZ2V0UGFydGlhbHlQb3B1bGF0ZWRBY2Nlc3NpYmlsaXR5RXZlbnQoKTsKKyAgICAgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoU3RyaW5nLnZhbHVlT2YoYXhpcykpOworICAgICAgICAgICAgZXZlbnQuc2V0Q29udGVudERlc2NyaXB0aW9uKGNvbnRlbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGNvbmRpdGlvbmFsIHRyYW5zaXRpb24gb25lIGF4aXMgdG8gYW5vdGhlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9tQXhpcyBUaGUgYXhpcyB3aGljaCBtdXN0IGJlIHRoZSBjdXJyZW50IGZvciB0aGUgdHJhbnNpdGlvbiB0byBvY2N1ci4KKyAgICAgKiBAcGFyYW0gdG9BeGlzIFRoZSBheGlzIHRvIHdoaWNoIHRvIHRyYW5zaXRpb24uCisgICAgICogQHBhcmFtIHNlbmRFdmVudCBGbGFnIGlmIHRvIHNlbmQgYW4gZXZlbnQgdG8gYW5ub3VuY2Ugc3VjY2Vzc2Z1bCB0cmFuc2l0aW9uLgorICAgICAqIEBwYXJhbSBjb250ZW50RGVzY3JpcHRpb24gQSBkZXNjcmlwdGlvbiBvZiB0aGUgcGVyZm9ybWVkIGFjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJlZnJvbUF4aXNUcmFuc2l0aW9uKGludCBmcm9tQXhpcywgaW50IHRvQXhpcywgYm9vbGVhbiBzZW5kRXZlbnQsCisgICAgICAgICAgICBTdHJpbmcgY29udGVudERlc2NyaXB0aW9uKSB7CisgICAgICAgIGlmIChtQ3VycmVudEF4aXMgPT0gZnJvbUF4aXMpIHsKKyAgICAgICAgICAgIHNldEN1cnJlbnRBeGlzKHRvQXhpcywgc2VuZEV2ZW50LCBjb250ZW50RGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhdmVyc2UgdGhlIGRvY3VtZW50IGFsb25nIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gYXhpcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiBvZiB0cmF2ZXJzYWwuCisgICAgICogQHBhcmFtIHNlbmRFdmVudCBXaGV0aGVyIHRvIHNlbmQgYW4gYWNjZXNzaWJpbGl0eSBldmVudCB0bworICAgICAqICAgICAgICBhbm5vdW5jZSB0aGUgY2hhbmdlLgorICAgICAqIEBwYXJhbSBjb250ZW50RGVzY3JpcHRpb24gQSBkZXNjcmlwdGlvbiBvZiB0aGUgcGVyZm9ybWVkIGFjdGlvbi4KKyAgICAgKiBAc2VlICNzZXRDdXJyZW50QXhpcyhpbnQsIGJvb2xlYW4sIFN0cmluZykKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VDdXJyZW50QXhpcyhpbnQgZGlyZWN0aW9uLCBib29sZWFuIHNlbmRFdmVudCwKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50RGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIHRyYXZlcnNlR2l2ZW5BeGlzKGRpcmVjdGlvbiwgbUN1cnJlbnRBeGlzLCBzZW5kRXZlbnQsIGNvbnRlbnREZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhdmVyc2UgdGhlIGRvY3VtZW50IGFsb25nIHRoZSBnaXZlbiBuYXZpZ2F0aW9uIGF4aXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gb2YgdHJhdmVyc2FsLgorICAgICAqIEBwYXJhbSBheGlzIFRoZSBheGlzIGFsb25nIHdoaWNoIHRvIHRyYXZlcnNlLgorICAgICAqIEBwYXJhbSBzZW5kRXZlbnQgV2hldGhlciB0byBzZW5kIGFuIGFjY2Vzc2liaWxpdHkgZXZlbnQgdG8KKyAgICAgKiAgICAgICAgYW5ub3VuY2UgdGhlIGNoYW5nZS4KKyAgICAgKiBAcGFyYW0gY29udGVudERlc2NyaXB0aW9uIEEgZGVzY3JpcHRpb24gb2YgdGhlIHBlcmZvcm1lZCBhY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlR2l2ZW5BeGlzKGludCBkaXJlY3Rpb24sIGludCBheGlzLCBib29sZWFuIHNlbmRFdmVudCwKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50RGVzY3JpcHRpb24pIHsKKyAgICAgICAgLy8gaWYgdGhlIGF4aXMgaXMgdGhlIGRlZmF1bHQgbGV0IFdlYlZpZXcgaGFuZGxlIHRoZSBldmVudAorICAgICAgICBpZiAoYXhpcyA9PSBOQVZJR0FUSU9OX0FYSVNfREVGQVVMVF9XRUJfVklFV19CRUhBVklPUikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlID0gbVdlYlZpZXcuZ2V0V2ViVmlld0NvcmUoKTsKKyAgICAgICAgaWYgKHdlYlZpZXdDb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IG51bGw7CisgICAgICAgICAgICBpZiAoc2VuZEV2ZW50KSB7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBnZXRQYXJ0aWFseVBvcHVsYXRlZEFjY2Vzc2liaWxpdHlFdmVudCgpOworICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXh0IHdpbGwgYmUgc2V0IHVwb24gcmVjZWl2aW5nIHRoZSBzZWxlY3Rpb24gc3RyaW5nCisgICAgICAgICAgICAgICAgZXZlbnQuc2V0Q29udGVudERlc2NyaXB0aW9uKGNvbnRlbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2NoZWR1bGVkRXZlbnRTdGFjay5wdXNoKGV2ZW50KTsKKyAgICAgICAgICAgIHdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLk1PRElGWV9TRUxFQ1RJT04sIGRpcmVjdGlvbiwgYXhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIDxjb2RlPnNlbGVjdGlvblN0cmluZzwvY29kZT4gaGFzIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZWxlY3Rpb25TdHJpbmdDaGFuZ2UoU3RyaW5nIHNlbGVjdGlvblN0cmluZykgeworICAgICAgICBtSXNMYXN0U2VsZWN0aW9uU3RyaW5nTnVsbCA9IChzZWxlY3Rpb25TdHJpbmcgPT0gbnVsbCk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IG1TY2hlZHVsZWRFdmVudFN0YWNrLnBvcCgpOworICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgZXZlbnQuZ2V0VGV4dCgpLmFkZChzZWxlY3Rpb25TdHJpbmcpOworICAgICAgICAgICAgc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VuZEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiRGlzcGF0Y2hpbmc6ICIgKyBldmVudCk7CisgICAgICAgIH0KKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UobVdlYlZpZXcuZ2V0Q29udGV4dCgpKS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEFuIGFjY2Vzc2liaWxpdHkgZXZlbnQgd2hvc2UgbWVtYmVycyBhcmUgcG9wdWxhdGVkIGV4Y2VwdCBpdHMKKyAgICAgKiAgICAgICAgIHRleHQgYW5kIGNvbnRlbnQgZGVzY3JpcHRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5RXZlbnQgZ2V0UGFydGlhbHlQb3B1bGF0ZWRBY2Nlc3NpYmlsaXR5RXZlbnQoKSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19TRUxFQ1RFRCk7CisgICAgICAgIGV2ZW50LnNldENsYXNzTmFtZShtV2ViVmlldy5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKG1XZWJWaWV3LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgZXZlbnQuc2V0RW5hYmxlZChtV2ViVmlldy5pc0VuYWJsZWQoKSk7CisgICAgICAgIHJldHVybiBldmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIFdlYiBjb250ZW50IGtleSBiaW5kaW5ncyBhcmUgbG9hZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVXZWJDb250ZW50S2V5QmluZGluZ3MoKSB7CisgICAgICAgIGlmIChzQmluZGluZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHdlYkNvbnRlbnRLZXlCaW5kaW5nc1N0cmluZyAgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIG1XZWJWaWV3LmdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9XRUJfQ09OVEVOVF9LRVlfQklORElOR1MpOworCisgICAgICAgIFNpbXBsZVN0cmluZ1NwbGl0dGVyIHNlbWlDb2xvblNwbGl0dGVyID0gbmV3IFNpbXBsZVN0cmluZ1NwbGl0dGVyKCc7Jyk7CisgICAgICAgIHNlbWlDb2xvblNwbGl0dGVyLnNldFN0cmluZyh3ZWJDb250ZW50S2V5QmluZGluZ3NTdHJpbmcpOworCisgICAgICAgIEFycmF5TGlzdDxBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmc+IGJpbmRpbmdzID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8QWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nPigpOworCisgICAgICAgIHdoaWxlIChzZW1pQ29sb25TcGxpdHRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nU3RyaW5nID0gc2VtaUNvbG9uU3BsaXR0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGJpbmRpbmdTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk1hbGZvcm1lZCBXZWIgY29udGVudCBrZXkgYmluZGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB3ZWJDb250ZW50S2V5QmluZGluZ3NTdHJpbmcpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10ga2V5VmFsdWVBcnJheSA9IGJpbmRpbmdTdHJpbmcuc3BsaXQoIj0iKTsKKyAgICAgICAgICAgIGlmIChrZXlWYWx1ZUFycmF5Lmxlbmd0aCAhPSAyKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkRpc3JlZ2FyZGluZyBtYWxmb3JtZWQgV2ViIGNvbnRlbnQga2V5IGJpbmRpbmc6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ1N0cmluZyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNpbXBsZVN0cmluZ1NwbGl0dGVyIGNvbG9uU3BsaXR0ZXIgPSBuZXcgU2ltcGxlU3RyaW5nU3BsaXR0ZXIoJzonKTsvL3JlbW92ZQorICAgICAgICAgICAgICAgIGludCBrZXkgPSBJbnRlZ2VyLmRlY29kZShrZXlWYWx1ZUFycmF5WzBdLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gYWN0aW9uU3RyaW5ncyA9IGtleVZhbHVlQXJyYXlbMV0uc3BsaXQoIjoiKTsKKyAgICAgICAgICAgICAgICBpbnRbXSBhY3Rpb25zID0gbmV3IGludFthY3Rpb25TdHJpbmdzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gYWN0aW9ucy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0gPSBJbnRlZ2VyLmRlY29kZShhY3Rpb25TdHJpbmdzW2ldLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmluZGluZ3MuYWRkKG5ldyBBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmcoa2V5LCBhY3Rpb25zKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkRpc3JlZ2FyZGluZyBtYWxmb3JtZWQga2V5IGJpbmRpbmc6ICIgKyBiaW5kaW5nU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nIGJpbmRpbmcgOiBiaW5kaW5ncykgeworICAgICAgICAgICAgc0JpbmRpbmdzLnB1dChiaW5kaW5nLmdldEtleSgpLCBiaW5kaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSB3ZWIgY29udGVudCBrZXktYmluZGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZyB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9NRVRBX1NUQVRFID0gMHgwMDAwMDAxMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19NRVRBX1NUQVRFID0gMHhGRkZGMDAwMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX0tFWV9DT0RFID0gMHgwMDAwMDAwMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19LRVlfQ09ERSA9IDB4MDAwMEZGRkY7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9BQ1RJT04gPSAweDAwMDAwMDE4OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLX0FDVElPTiA9IDB4RkYwMDAwMDA7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9GSVJTVF9BUkdVTUVOVCA9IDB4MDAwMDAwMTA7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BU0tfRklSU1RfQVJHVU1FTlQgPSAweDAwRkYwMDAwOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPRkZTRVRfU0VDT05EX0FSR1VNRU5UID0gMHgwMDAwMDAwODsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19TRUNPTkRfQVJHVU1FTlQgPSAweDAwMDBGRjAwOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPRkZTRVRfVEhJUkRfQVJHVU1FTlQgPSAweDAwMDAwMDAwOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLX1RISVJEX0FSR1VNRU5UID0gMHgwMDAwMDBGRjsKKworICAgICAgICBwcml2YXRlIGludCBtS2V5OworCisgICAgICAgIHByaXZhdGUgaW50IFtdIG1BY3Rpb25TZXF1ZW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBUaGUgYmluZGluZyBrZXkgd2l0aCBrZXkgY29kZSBhbmQgbWV0YSBzdGF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjTUFTS19LRVlfQ09ERQorICAgICAgICAgKiBAc2VlICNNQVNLX01FVEFfU1RBVEUKKyAgICAgICAgICogQHNlZSAjT0ZGU0VUX0tFWV9DT0RFCisgICAgICAgICAqIEBzZWUgI09GRlNFVF9NRVRBX1NUQVRFCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtS2V5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gVGhlIGtleSBjb2RlIG9mIHRoZSBiaW5kaW5nIGtleS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0S2V5Q29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAobUtleSAmIE1BU0tfS0VZX0NPREUpID4+IE9GRlNFVF9LRVlfQ09ERTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBtZXRhIHN0YXRlIG9mIHRoZSBiaW5kaW5nIGtleS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWV0YVN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIChtS2V5ICYgTUFTS19NRVRBX1NUQVRFKSA+PiBPRkZTRVRfTUVUQV9TVEFURTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYWN0aW9ucyBpbiB0aGUga2V5IGJpbmRpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEFjdGlvbkNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25TZXF1ZW5jZS5sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSBhY3Rpb24gZm9yIGEgZ2l2ZW4gYWN0aW9uIDxjb2RlPmluZGV4PC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25TZXF1ZW5jZVtpbmRleF07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSBhY3Rpb24gY29kZSBmb3IgYSBnaXZlbiBhY3Rpb24gPGNvZGU+aW5kZXg8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRBY3Rpb25Db2RlKGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIChtQWN0aW9uU2VxdWVuY2VbaW5kZXhdICYgTUFTS19BQ1RJT04pID4+IE9GRlNFVF9BQ1RJT047CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSBmaXJzdCBhcmd1bWVudCBmb3IgYSBnaXZlbiBhY3Rpb24gPGNvZGU+aW5kZXg8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRGaXJzdEFyZ3VtZW50KGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIChtQWN0aW9uU2VxdWVuY2VbaW5kZXhdICYgTUFTS19GSVJTVF9BUkdVTUVOVCkgPj4gT0ZGU0VUX0ZJUlNUX0FSR1VNRU5UOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgc2Vjb25kIGFyZ3VtZW50IGZvciBhIGdpdmVuIGFjdGlvbiA8Y29kZT5pbmRleDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldFNlY29uZEFyZ3VtZW50KGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIChtQWN0aW9uU2VxdWVuY2VbaW5kZXhdICYgTUFTS19TRUNPTkRfQVJHVU1FTlQpID4+IE9GRlNFVF9TRUNPTkRfQVJHVU1FTlQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSB0aGlyZCBhcmd1bWVudCBmb3IgYSBnaXZlbiBhY3Rpb24gPGNvZGU+aW5kZXg8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRUaGlyZEFyZ3VtZW50KGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIChtQWN0aW9uU2VxdWVuY2VbaW5kZXhdICYgTUFTS19USElSRF9BUkdVTUVOVCkgPj4gT0ZGU0VUX1RISVJEX0FSR1VNRU5UOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIGJpbmRpbmcgKGtleSBhbmQgbWV0YSBzdGF0ZSkKKyAgICAgICAgICogQHBhcmFtIGFjdGlvblNlcXVlbmNlIFRoZSBzZXF1ZW5jZSBvZiBhY3Rpb24gZm9yIHRoZSBiaW5kaW5nLgorICAgICAgICAgKiBAc2VlICNnZXRLZXkoKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZyhpbnQga2V5LCBpbnRbXSBhY3Rpb25TZXF1ZW5jZSkgeworICAgICAgICAgICAgbUtleSA9IGtleTsKKyAgICAgICAgICAgIG1BY3Rpb25TZXF1ZW5jZSA9IGFjdGlvblNlcXVlbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImtleTogIik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRLZXkoKSk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBtZXRhU3RhdGU6ICIpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0TWV0YVN0YXRlKCkpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwga2V5Q29kZTogIik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRLZXlDb2RlKCkpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgYWN0aW9uc1siKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBjb3VudCA9IGdldEFjdGlvbkNvdW50KCk7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoInthY3Rpb25Db2RlIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoaSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjogIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QWN0aW9uQ29kZShpKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgZmlyc3RBcmd1bWVudDogIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0Rmlyc3RBcmd1bWVudChpKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgc2Vjb25kQXJndW1lbnQ6ICIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldFNlY29uZEFyZ3VtZW50KGkpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCB0aGlyZEFyZ3VtZW50OiAiKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRUaGlyZEFyZ3VtZW50KGkpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgifSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKaW5kZXggYTJjODBmMi4uZWZlNGI5ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQpAQCAtMzgsNiArMzgsOCBAQAogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKQEAgLTcyLDYgKzc0LDkgQEAKICAgICAvLyBxdWV1ZSBoYXMgYmVlbiBjbGVhcmVkLHRoZXkgYXJlIGlnbm9yZWQuCiAgICAgcHJpdmF0ZSBib29sZWFuIG1CbG9ja01lc3NhZ2VzID0gZmFsc2U7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0RhdGFiYXNlRGlyZWN0b3J5OworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzQ2FjaGVEaXJlY3Rvcnk7CisKICAgICAvLyBJcyB0aGlzIGZyYW1lIHRoZSBtYWluIGZyYW1lPwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNYWluRnJhbWU7CiAKQEAgLTIyNCw2ICsyMjksMTMgQEAKICAgICAgICAgQXNzZXRNYW5hZ2VyIGFtID0gY29udGV4dC5nZXRBc3NldHMoKTsKICAgICAgICAgbmF0aXZlQ3JlYXRlRnJhbWUodywgYW0sIHByb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpKTsKIAorICAgICAgICBpZiAoc0RhdGFiYXNlRGlyZWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHNEYXRhYmFzZURpcmVjdG9yeSA9IGFwcENvbnRleHQuZ2V0RGF0YWJhc2VQYXRoKCJkdW1teSIpLmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIGlmIChzQ2FjaGVEaXJlY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgc0NhY2hlRGlyZWN0b3J5ID0gYXBwQ29udGV4dC5nZXRDYWNoZURpcigpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB9CisKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuQlJPV1NFUl9GUkFNRSkgewogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiQnJvd3NlckZyYW1lIGNvbnN0cnVjdG9yOiB0aGlzPSIgKyB0aGlzKTsKICAgICAgICAgfQpAQCAtMjk0LDYgKzMwNiwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGUgZnJhbWUgYXMgYSB3ZWIgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlbmFtZSBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gYXV0b25hbWUgSWYgZmFsc2UsIHRha2VzIGZpbGVuYW1lIHRvIGJlIGEgZmlsZS4gSWYgdHJ1ZSwgZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgaXMgYXNzdW1lZCB0byBiZSBhIGRpcmVjdG9yeSBpbiB3aGljaCBhIGZpbGVuYW1lIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgY2hvc2VuIGFjY29yZGluZyB0byB0aGUgdXJsIG9mIHRoZSBjdXJyZW50IHBhZ2UuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVTYXZlV2ViQXJjaGl2ZShiYXNlbmFtZSwgYXV0b25hbWUpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdvIGJhY2sgb3IgZm9yd2FyZCB0aGUgbnVtYmVyIG9mIHN0ZXBzIGdpdmVuLgogICAgICAqIEBwYXJhbSBzdGVwcyBBIG5lZ2F0aXZlIG9yIHBvc2l0aXZlIG51bWJlciBpbmRpY2F0aW5nIHRoZSBkaXJlY3Rpb24KICAgICAgKiAgICAgICAgICAgICAgYW5kIG51bWJlciBvZiBzdGVwcyB0byBtb3ZlLgpAQCAtNTEwLDEyICs1MzQsMjEgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZXh0ZXJuYWxSZXByZXNlbnRhdGlvbigpOwogCiAgICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB2aXN1YWwgdGV4dCBvZiB0aGUgY3VycmVudCBmcmFtZSwgcHV0cyBpdCBhcyB0aGUgb2JqZWN0IGZvcgorICAgICAqIFJldHJpZXZlcyB0aGUgdmlzdWFsIHRleHQgb2YgdGhlIGZyYW1lcywgcHV0cyBpdCBhcyB0aGUgb2JqZWN0IGZvcgogICAgICAqIHRoZSBtZXNzYWdlIGFuZCBzZW5kcyB0aGUgbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIG1lc3NhZ2UgdG8gdXNlIHRvIHNlbmQgdGhlIHZpc3VhbCB0ZXh0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZG9jdW1lbnRBc1RleHQoTWVzc2FnZSBjYWxsYmFjaykgewotICAgICAgICBjYWxsYmFjay5vYmogPSBkb2N1bWVudEFzVGV4dCgpOzsKKyAgICAgICAgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrLmFyZzEgIT0gMCkgeworICAgICAgICAgICAgLy8gRHVtcCB0b3AgZnJhbWUgYXMgdGV4dC4KKyAgICAgICAgICAgIHRleHQuYXBwZW5kKGRvY3VtZW50QXNUZXh0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjYWxsYmFjay5hcmcyICE9IDApIHsKKyAgICAgICAgICAgIC8vIER1bXAgY2hpbGQgZnJhbWVzIGFzIHRleHQuCisgICAgICAgICAgICB0ZXh0LmFwcGVuZChjaGlsZEZyYW1lc0FzVGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjay5vYmogPSB0ZXh0LnRvU3RyaW5nKCk7CiAgICAgICAgIGNhbGxiYWNrLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIApAQCAtNTI0LDYgKzU1NywxMSBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyBkb2N1bWVudEFzVGV4dCgpOwogCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0ZXh0IGRyYXduIG9uIHRoZSBjaGlsZCBmcmFtZXMgYXMgYSBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgY2hpbGRGcmFtZXNBc1RleHQoKTsKKwogICAgIC8qCiAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFdlYkNvcmUgdG8gaW5mb3JtIHRoZSBmcmFtZSB0aGF0CiAgICAgICogdGhlIEphdmFzY3JpcHQgd2luZG93IG9iamVjdCBoYXMgYmVlbiBjbGVhcmVkLgpAQCAtNjE3LDYgKzY1NSwxMTIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgSk5JLiBHZXRzIHRoZSBhcHBsaWNhdGlvbidzIGRhdGFiYXNlIGRpcmVjdG9yeSwgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBzbGFzaC4KKyAgICAgKiBAcmV0dXJuIFN0cmluZyBUaGUgYXBwbGljYXRpb24ncyBkYXRhYmFzZSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGF0YWJhc2VEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBzRGF0YWJhc2VEaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4gR2V0cyB0aGUgYXBwbGljYXRpb24ncyBjYWNoZSBkaXJlY3RvcnksIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgc2xhc2guCisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIGFwcGxpY2F0aW9uJ3MgY2FjaGUgZGlyZWN0b3J5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhY2hlRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc0NhY2hlRGlyZWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBKTkkuCisgICAgICogUmVhZCBmcm9tIGFuIElucHV0U3RyZWFtIGludG8gYSBzdXBwbGllZCBieXRlW10KKyAgICAgKiBUaGlzIG1ldGhvZCBjYXRjaGVzIGFueSBleGNlcHRpb25zIHNvIHRoZXkgZG9uJ3QgY3Jhc2ggdGhlIEpWTS4KKyAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gSW5wdXRTdHJlYW0gdG8gcmVhZCBmcm9tLgorICAgICAqIEBwYXJhbSBvdXRwdXQgQnl0ZWFycmF5IHRoYXQgZ2V0cyB0aGUgb3V0cHV0LgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtaSBpZiB0aGVuIGVuZCBvZiBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCByZWFkRnJvbVN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgYnl0ZVtdIG91dHB1dCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0U3RyZWFtLnJlYWQob3V0cHV0KTsKKyAgICAgICAgfSBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGdldCBhbiBleGNlcHRpb24sIHJldHVybiBlbmQgb2Ygc3RyZWFtCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIElucHV0U3RyZWFtIGZvciBhbiBBbmRyb2lkIHJlc291cmNlCisgICAgICogVGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCBraW5kcyBvZiBhbmRyb2lkIHJlc291cmNlczoKKyAgICAgKiAtIGZpbGU6Ly8vYW5kcm9pZF9yZXMKKyAgICAgKiAtIGZpbGU6Ly8vYW5kcm9pZF9hc3NldAorICAgICAqIC0gY29udGVudDovLworICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byBsb2FkLgorICAgICAqIEByZXR1cm4gQW4gSW5wdXRTdHJlYW0gdG8gdGhlIGFuZHJvaWQgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtRm9yQW5kcm9pZFJlc291cmNlKFN0cmluZyB1cmwsIGludCB0eXBlKSB7CisgICAgICAgIGZpbmFsIGludCBSRVNPVVJDRSA9IDE7CisgICAgICAgIGZpbmFsIGludCBBU1NFVCA9IDI7CisgICAgICAgIGZpbmFsIGludCBDT05URU5UID0gMzsKKworICAgICAgICBpZiAodHlwZSA9PSBSRVNPVVJDRSkgeworICAgICAgICAgICAgLy8gZmlsZTovLy9hbmRyb2lkX3JlcworICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IHVybC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAidXJsIGhhcyBsZW5ndGggMCAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzbGFzaCA9IHVybC5pbmRleE9mKCcvJyk7CisgICAgICAgICAgICBpbnQgZG90ID0gdXJsLmluZGV4T2YoJy4nLCBzbGFzaCk7CisgICAgICAgICAgICBpZiAoc2xhc2ggPT0gLTEgfHwgZG90ID09IC0xKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiSW5jb3JyZWN0IHJlcyBwYXRoOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBzdWJDbGFzc05hbWUgPSB1cmwuc3Vic3RyaW5nKDAsIHNsYXNoKTsKKyAgICAgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSB1cmwuc3Vic3RyaW5nKHNsYXNoICsgMSwgZG90KTsKKyAgICAgICAgICAgIFN0cmluZyBlcnJvck1zZyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGQgPSBtQ29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIi5SJCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN1YkNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgZmluYWwgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgPSBkLmdldEZpZWxkKGZpZWxkTmFtZSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGlkID0gZmllbGQuZ2V0SW50KG51bGwpOworICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFZhbHVlKGlkLCB2YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT0gVHlwZWRWYWx1ZS5UWVBFX1NUUklORykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0QXNzZXRzKCkub3Blbk5vbkFzc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmFzc2V0Q29va2llLCB2YWx1ZS5zdHJpbmcudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NldE1hbmFnZXIuQUNDRVNTX1NUUkVBTUlORyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT2xkIHN0YWNrIG9ubHkgc3VwcG9ydHMgVFlQRV9TVFJJTkcgZm9yIHJlcyBmaWxlcworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJub3Qgb2YgdHlwZSBzdHJpbmc6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkV4Y2VwdGlvbjogIiArIHVybCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEFTU0VUKSB7CisgICAgICAgICAgICAvLyBmaWxlOi8vL2FuZHJvaWRfYXNzZXQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQXNzZXRNYW5hZ2VyIGFzc2V0cyA9IG1Db250ZXh0LmdldEFzc2V0cygpOworICAgICAgICAgICAgICAgIHJldHVybiBhc3NldHMub3Blbih1cmwsIEFzc2V0TWFuYWdlci5BQ0NFU1NfU1RSRUFNSU5HKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENPTlRFTlQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSh1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0odXJpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXhjZXB0aW9uOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogU3RhcnQgbG9hZGluZyBhIHJlc291cmNlLgogICAgICAqIEBwYXJhbSBsb2FkZXJIYW5kbGUgVGhlIG5hdGl2ZSBSZXNvdXJjZUxvYWRlciB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBkYXRhLgpAQCAtODQyLDYgKzk4Niw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfVVBMT0FEX0xBQkVMID0gNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTRVRfTEFCRUwgPSA1OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVUJNSVRfTEFCRUwgPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFX1VQTE9BRF9OT19GSUxFX0NIT1NFTiA9IDc7CiAKICAgICBTdHJpbmcgZ2V0UmF3UmVzRmlsZW5hbWUoaW50IGlkKSB7CiAgICAgICAgIGludCByZXNpZDsKQEAgLTg3MSw2ICsxMDE2LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnN1Ym1pdCk7CiAKKyAgICAgICAgICAgIGNhc2UgRklMRV9VUExPQURfTk9fRklMRV9DSE9TRU46CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLm5vX2ZpbGVfY2hvc2VuKTsKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJnZXRSYXdSZXNGaWxlbmFtZSBnb3QgaW5jb21wYXRpYmxlIHJlc291cmNlIElEIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwpAQCAtODkzLDYgKzEwNDIsNDAgQEAKICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgSk5JIHdoZW4gdGhlIG5hdGl2ZSBIVFRQIHN0YWNrIGdldHMgYW4gYXV0aGVudGljYXRpb24gcmVxdWVzdC4KKyAgICAgKgorICAgICAqIFdlIGRlbGVnYXRlIHRoZSByZXF1ZXN0IHRvIENhbGxiYWNrUHJveHksIGFuZCByb3V0ZSBpdHMgcmVzcG9uc2UgdG8KKyAgICAgKiB7QGxpbmsgI25hdGl2ZUF1dGhlbnRpY2F0aW9uUHJvY2VlZChpbnQsIFN0cmluZywgU3RyaW5nKX0gb3IKKyAgICAgKiB7QGxpbmsgI25hdGl2ZUF1dGhlbnRpY2F0aW9uQ2FuY2VsKGludCl9LgorICAgICAqCisgICAgICogV2UgZG9uJ3QgY2FyZSB3aGF0IHRocmVhZCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCBvbi4gQWxsIHRocmVhZGluZyBpcworICAgICAqIGhhbmRsZWQgb24gdGhlIEMrKyBzaWRlLCBiZWNhdXNlIHRoZSBXZWJLaXQgdGhyZWFkIG1heSBiZSBibG9ja2VkIG9uIGEKKyAgICAgKiBzeW5jaHJvbm91cyBjYWxsIGFuZCB1bmFibGUgdG8gcHVtcCBvdXIgTWVzc2FnZVF1ZXVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoCisgICAgICAgICAgICBmaW5hbCBpbnQgaGFuZGxlLCBTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtLCBmaW5hbCBib29sZWFuIHVzZUNhY2hlZENyZWRlbnRpYWxzKSB7CisKKyAgICAgICAgSHR0cEF1dGhIYW5kbGVyIGhhbmRsZXIgPSBuZXcgSHR0cEF1dGhIYW5kbGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZUh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdXNlQ2FjaGVkQ3JlZGVudGlhbHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VlZChTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICAgICAgICAgIG5hdGl2ZUF1dGhlbnRpY2F0aW9uUHJvY2VlZChoYW5kbGUsIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgICAgICAgICAgIG5hdGl2ZUF1dGhlbnRpY2F0aW9uQ2FuY2VsKGhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uUmVjZWl2ZWRIdHRwQXV0aFJlcXVlc3QoaGFuZGxlciwgaG9zdCwgcmVhbG0pOworICAgIH0KKwogICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAvLyBuYXRpdmUgZnVuY3Rpb25zCiAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTAwNiw1ICsxMTg5LDEwIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgSGFzaE1hcCBnZXRGb3JtVGV4dERhdGEoKTsKIAorICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyBuYXRpdmVTYXZlV2ViQXJjaGl2ZShTdHJpbmcgYmFzZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUpOworCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPcmllbnRhdGlvbkNoYW5nZWQoaW50IG9yaWVudGF0aW9uKTsKKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQXV0aGVudGljYXRpb25Qcm9jZWVkKGludCBoYW5kbGUsIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUF1dGhlbnRpY2F0aW9uQ2FuY2VsKGludCBoYW5kbGUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKaW5kZXggZDY1YzEwNi4uOGM5ZjI2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTQxLDYgKzQyLDcgQEAKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyBhIHByb3h5IGNsYXNzIGZvciBoYW5kbGluZyBXZWJDb3JlIC0+IFVJIHRocmVhZCBtZXNzYWdpbmcuIEFsbApAQCAtMTEyLDYgKzExNCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9ISVNUT1JZX0lURU0gICAgICAgICAgICAgICAgICAgID0gMTM1OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISVNUT1JZX0lOREVYX0NIQU5HRUQgICAgICAgICAgICAgICA9IDEzNjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUSF9DUkVERU5USUFMUyAgICAgICAgICAgICAgICAgICAgPSAxMzc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVF9JTlNUQUxMQUJMRV9XRUJBUFAgICAgICAgICAgICAgID0gMTM4OwogCiAgICAgLy8gTWVzc2FnZSB0cmlnZ2VyZWQgYnkgdGhlIGNsaWVudCB0byByZXN1bWUgZXhlY3V0aW9uCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAwOwpAQCAtMjUzLDE3ICsyNTYsMTAgQEAKICAgICAgICAgLy8gMzItYml0IHJlYWRzIGFuZCB3cml0ZXMuCiAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKICAgICAgICAgICAgIGNhc2UgUEFHRV9TVEFSVEVEOgotICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHRpbWUgd2Ugc3RhcnQgYSBuZXcgcGFnZSwgd2Ugd2FudCB0byByZXNldCB0aGUKLSAgICAgICAgICAgICAgICAvLyBXZWJWaWV3IGNlcnRpZmljYXRlOgotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBuZXcgc2l0ZSBpcyBzZWN1cmUsIHdlIHdpbGwgcmVsb2FkIGl0IGFuZCBnZXQgYQotICAgICAgICAgICAgICAgIC8vIG5ldyBjZXJ0aWZpY2F0ZSBzZXQ7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5ldyBzaXRlIGlzIG5vdCBzZWN1cmUsIHRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlCi0gICAgICAgICAgICAgICAgLy8gbnVsbCwgYW5kIHRoYXQgd2lsbCBiZSB0aGUgY2FzZQotICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldENlcnRpZmljYXRlKG51bGwpOworICAgICAgICAgICAgICAgIFN0cmluZyBzdGFydGVkVXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm9uUGFnZVN0YXJ0ZWQoc3RhcnRlZFVybCk7CiAgICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3Q2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDbGllbnQub25QYWdlU3RhcnRlZChtV2ViVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJpdG1hcCkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q2xpZW50Lm9uUGFnZVN0YXJ0ZWQobVdlYlZpZXcsIHN0YXJ0ZWRVcmwsIChCaXRtYXApIG1zZy5vYmopOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTAwLDE4ICs0OTYsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNBbGVydChtV2ViVmlldywgdXJsLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoZ2V0SnNEaWFsb2dUaXRsZSh1cmwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShtZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcub2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGljaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNvbmZpcm0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDYW5jZWxhYmxlKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T25DYW5jZWxMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CkBAIC01MjUsNiArNTM1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzQ29uZmlybShtV2ViVmlldywgdXJsLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoZ2V0SnNEaWFsb2dUaXRsZSh1cmwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShtZXNzYWdlKQpAQCAtNTY1LDYgKzU4MywxNCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc1Byb21wdChtV2ViVmlldywgdXJsLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsLCByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMYXlvdXRJbmZsYXRlciBmYWN0b3J5ID0gTGF5b3V0SW5mbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20obUNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gZmFjdG9yeS5pbmZsYXRlKFIubGF5b3V0LmpzX3Byb21wdCwKQEAgLTYxNiw2ICs2NDIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNCZWZvcmVVbmxvYWQobVdlYlZpZXcsIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbSA9IG1Db250ZXh0LmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuanNfZGlhbG9nX2JlZm9yZV91bmxvYWQsIG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCkBAIC02NzYsNiArNzEwLDkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBBRERfTUVTU0FHRV9UT19DT05TT0xFOgorICAgICAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoIm1lc3NhZ2UiKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlSUQgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygic291cmNlSUQiKTsKICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciA9IG1zZy5nZXREYXRhKCkuZ2V0SW50KCJsaW5lTnVtYmVyIik7CkBAIC03MjUsNyArNzYyLDggQEAKIAogICAgICAgICAgICAgY2FzZSBPUEVOX0ZJTEVfQ0hPT1NFUjoKICAgICAgICAgICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQub3BlbkZpbGVDaG9vc2VyKChVcGxvYWRGaWxlKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIGRhdGEgPSAoVXBsb2FkRmlsZU1lc3NhZ2VEYXRhKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQub3BlbkZpbGVDaG9vc2VyKGRhdGEuZ2V0VXBsb2FkRmlsZSgpLCBkYXRhLmdldEFjY2VwdFR5cGUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC03NTAsNiArNzg4LDExIEBACiAgICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKAogICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCwgcmVhbG0sIHVzZXJuYW1lLCBwYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNFVF9JTlNUQUxMQUJMRV9XRUJBUFA6CisgICAgICAgICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtV2ViQ2hyb21lQ2xpZW50LnNldEluc3RhbGxhYmxlV2ViQXBwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDg3LDEwICsxMTMwLDE1IEBACiAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoaW50IG5ld1Byb2dyZXNzKSB7CiAgICAgICAgIC8vIFN5bmNocm9uaXplIHNvIHRoYXQgbUxhdGVzdFByb2dyZXNzIGlzIHVwLXRvLWRhdGUuCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCB8fCBtTGF0ZXN0UHJvZ3Jlc3MgPT0gbmV3UHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBtTGF0ZXN0UHJvZ3Jlc3MgZXZlbiBtV2ViQ2hyb21lQ2xpZW50IGlzIG51bGwgYXMKKyAgICAgICAgICAgIC8vIFdlYlZpZXcuZ2V0UHJvZ3Jlc3MoKSBuZWVkcyBpdAorICAgICAgICAgICAgaWYgKG1MYXRlc3RQcm9ncmVzcyA9PSBuZXdQcm9ncmVzcykgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXRlc3RQcm9ncmVzcyA9IG5ld1Byb2dyZXNzOworICAgICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbVByb2dyZXNzVXBkYXRlUGVuZGluZykgewogICAgICAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoUFJPR1JFU1MpOwogICAgICAgICAgICAgICAgIG1Qcm9ncmVzc1VwZGF0ZVBlbmRpbmcgPSB0cnVlOwpAQCAtMTE3Miw5ICsxMjIwLDcgQEAKICAgICAgICAgLy8gZm9yIG51bGwuCiAgICAgICAgIFdlYkhpc3RvcnlJdGVtIGkgPSBtQmFja0ZvcndhcmRMaXN0LmdldEN1cnJlbnRJdGVtKCk7CiAgICAgICAgIGlmIChpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwcmVjb21wb3NlZCB8fCBpLmdldFRvdWNoSWNvblVybCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpLnNldFRvdWNoSWNvblVybCh1cmwpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaS5zZXRUb3VjaEljb25VcmwodXJsLCBwcmVjb21wb3NlZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gRG8gYW4gdW5zeW5jaHJvbml6ZWQgcXVpY2sgY2hlY2sgdG8gYXZvaWQgcG9zdGluZyBpZiBubyBjYWxsYmFjayBoYXMKICAgICAgICAgLy8gYmVlbiBzZXQuCkBAIC0xNDMyLDYgKzE0NzgsMjQgQEAKICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVcGxvYWRGaWxlTWVzc2FnZURhdGEgeworICAgICAgICBwcml2YXRlIFVwbG9hZEZpbGUgbUNhbGxiYWNrOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQWNjZXB0VHlwZTsKKworICAgICAgICBwdWJsaWMgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhKFVwbG9hZEZpbGUgdXBsb2FkRmlsZSwgU3RyaW5nIGFjY2VwdFR5cGUpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IHVwbG9hZEZpbGU7CisgICAgICAgICAgICBtQWNjZXB0VHlwZSA9IGFjY2VwdFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVXBsb2FkRmlsZSBnZXRVcGxvYWRGaWxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXB0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWNjZXB0VHlwZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgVXBsb2FkRmlsZSBpbXBsZW1lbnRzIFZhbHVlQ2FsbGJhY2s8VXJpPiB7CiAgICAgICAgIHByaXZhdGUgVXJpIG1WYWx1ZTsKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlVmFsdWUoVXJpIHZhbHVlKSB7CkBAIC0xNDQ4LDEzICsxNTEyLDE0IEBACiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IFdlYlZpZXdDb3JlIHRvIG9wZW4gYSBmaWxlIGNob29zZXIuCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBVcmkgb3BlbkZpbGVDaG9vc2VyKCkgeworICAgIC8qIHBhY2thZ2UgKi8gVXJpIG9wZW5GaWxlQ2hvb3NlcihTdHJpbmcgYWNjZXB0VHlwZSkgewogICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBNZXNzYWdlIG15TWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UoT1BFTl9GSUxFX0NIT09TRVIpOwogICAgICAgICBVcGxvYWRGaWxlIHVwbG9hZEZpbGUgPSBuZXcgVXBsb2FkRmlsZSgpOwotICAgICAgICBteU1lc3NhZ2Uub2JqID0gdXBsb2FkRmlsZTsKKyAgICAgICAgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIGRhdGEgPSBuZXcgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhKHVwbG9hZEZpbGUsIGFjY2VwdFR5cGUpOworICAgICAgICBteU1lc3NhZ2Uub2JqID0gZGF0YTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBzZW5kTWVzc2FnZShteU1lc3NhZ2UpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTE0ODMsNCArMTU0OCwxMSBAQAogICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoSElTVE9SWV9JTkRFWF9DSEFOR0VELCBpbmRleCwgMCwgaXRlbSk7CiAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQorCisgICAgdm9pZCBzZXRJbnN0YWxsYWJsZVdlYkFwcCgpIHsKKyAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoU0VUX0lOU1RBTExBQkxFX1dFQkFQUCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWMyZjQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgc2ltcGx5IGEgY29udGFpbmVyIGZvciB0aGUgbWV0aG9kcyB1c2VkIHRvIGltcGxlbWVudCBEZXZpY2VPcmllbnRhdGlvbiwKKyAqIGluY2x1ZGluZyB0aGUgbW9jayBEZXZpY2VPcmllbnRhdGlvbkNsaWVudCBmb3IgdXNlIGluIExheW91dFRlc3RzLgorICoKKyAqIFRoaXMgY291bGQgYmUgcGFydCBvZiBXZWJWaWV3Q29yZSwgYnV0IGhhdmUgbW92ZWQgaXQgdG8gaXRzIG93biBjbGFzcyB0bworICogYXZvaWQgYmxvYXQgdGhlcmUuCisgKiBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIHsKKyAgICBwcml2YXRlIFdlYlZpZXdDb3JlIG1XZWJWaWV3Q29yZTsKKyAgICBwcml2YXRlIERldmljZU9yaWVudGF0aW9uU2VydmljZSBtU2VydmljZTsKKworICAgIHB1YmxpYyBEZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIoV2ViVmlld0NvcmUgd2ViVmlld0NvcmUpIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlID0gd2ViVmlld0NvcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBQYWdlIGZvciB0aGlzIFdlYlZpZXdDb3JlIHNob3VsZCB1c2UgYSBtb2NrIERldmljZU9yaWVudGF0aW9uCisgICAgICogY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVzZU1vY2soKSB7CisgICAgICAgIGFzc2VydCBXZWJWaWV3Q29yZS5USFJFQURfTkFNRS5lcXVhbHMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICBuYXRpdmVVc2VNb2NrKG1XZWJWaWV3Q29yZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwb3NpdGlvbiBmb3IgdGhlIG1vY2sgRGV2aWNlT3JpZW50YXRpb24gc2VydmljZSBmb3IgdGhpcyBXZWJWaWV3Q29yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwKKyAgICAgICAgICAgIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIGFzc2VydCBXZWJWaWV3Q29yZS5USFJFQURfTkFNRS5lcXVhbHMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICBuYXRpdmVTZXRNb2NrT3JpZW50YXRpb24obVdlYlZpZXdDb3JlLCBjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbk9yaWVudGF0aW9uQ2hhbmdlKERvdWJsZSBhbHBoYSwgRG91YmxlIGJldGEsIERvdWJsZSBnYW1tYSkgeworICAgICAgICBuYXRpdmVPbk9yaWVudGF0aW9uQ2hhbmdlKG1XZWJWaWV3Q29yZSwKKyAgICAgICAgICAgICAgICBhbHBoYSAhPSBudWxsLCBhbHBoYSAhPSBudWxsID8gYWxwaGEuZG91YmxlVmFsdWUoKSA6IDAuMCwKKyAgICAgICAgICAgICAgICBiZXRhICE9IG51bGwsIGJldGEgIT0gbnVsbCA/IGJldGEuZG91YmxlVmFsdWUoKSA6IDAuMCwKKyAgICAgICAgICAgICAgICBnYW1tYSAhPSBudWxsLCBnYW1tYSAhPSBudWxsID8gZ2FtbWEuZG91YmxlVmFsdWUoKSA6IDAuMCk7CisgICAgfQorCisgICAgLy8gTmF0aXZlIGZ1bmN0aW9ucworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVVzZU1vY2soV2ViVmlld0NvcmUgd2ViVmlld0NvcmUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldE1vY2tPcmllbnRhdGlvbihXZWJWaWV3Q29yZSB3ZWJWaWV3Q29yZSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlT25PcmllbnRhdGlvbkNoYW5nZShXZWJWaWV3Q29yZSB3ZWJWaWV3Q29yZSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWI4NjZkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LkRldmljZU9yaWVudGF0aW9uTWFuYWdlcjsKK2ltcG9ydCBqYXZhLmxhbmcuUnVubmFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworZmluYWwgY2xhc3MgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlIGltcGxlbWVudHMgU2Vuc29yRXZlbnRMaXN0ZW5lciB7CisgICAgLy8gVGhlIGdyYXZpdHkgdmVjdG9yIGV4cHJlc3NlZCBpbiB0aGUgYm9keSBmcmFtZS4KKyAgICBwcml2YXRlIGZsb2F0W10gbUdyYXZpdHlWZWN0b3I7CisgICAgLy8gVGhlIGdlb21hZ25ldGljIHZlY3RvciBleHByZXNzZWQgaW4gdGhlIGJvZHkgZnJhbWUuCisgICAgcHJpdmF0ZSBmbG9hdFtdIG1NYWduZXRpY0ZpZWxkVmVjdG9yOworCisgICAgcHJpdmF0ZSBEZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgbU1hbmFnZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1J1bm5pbmc7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOworICAgIHByaXZhdGUgU2Vuc29yTWFuYWdlciBtU2Vuc29yTWFuYWdlcjsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBEb3VibGUgbUFscGhhOworICAgIHByaXZhdGUgRG91YmxlIG1CZXRhOworICAgIHByaXZhdGUgRG91YmxlIG1HYW1tYTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVTZW50RXJyb3JFdmVudDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBERUxUQV9ERUdSRVNTID0gMS4wOworCisgICAgcHVibGljIERldmljZU9yaWVudGF0aW9uU2VydmljZShEZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgbWFuYWdlciwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKKyAgICAgICAgYXNzZXJ0KG1NYW5hZ2VyICE9IG51bGwpOworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIGFzc2VydChtQ29udGV4dCAhPSBudWxsKTsKKyAgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG1Jc1J1bm5pbmcgPSB0cnVlOworICAgICAgICByZWdpc3RlckZvclNlbnNvcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBtSXNSdW5uaW5nID0gZmFsc2U7CisgICAgICAgIHVucmVnaXN0ZXJGcm9tU2Vuc29ycygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoKSB7CisgICAgICAgIGlmIChtSXNSdW5uaW5nKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc3VtZSgpIHsKKyAgICAgICAgaWYgKG1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyRm9yU2Vuc29ycygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRFcnJvckV2ZW50KCkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gVGhlIHNwZWMgcmVxdWlyZXMgdGhhdCBlYWNoIGxpc3RlbmVyIHJlY2VpdmVzIHRoZSBlcnJvciBldmVudCBvbmx5IG9uY2UuCisgICAgICAgIGlmIChtSGF2ZVNlbnRFcnJvckV2ZW50KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtSGF2ZVNlbnRFcnJvckV2ZW50ID0gdHJ1ZTsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAobUlzUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3BlY2lhbCBjYXNlIG9mIGFsbCBudWxscyBpcyB1c2VkIHRvIHNpZ25pZnkgYSBmYWlsdXJlIHRvIGdldCBkYXRhLgorICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5vbk9yaWVudGF0aW9uQ2hhbmdlKG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRm9yU2Vuc29ycygpIHsKKyAgICAgICAgaWYgKG1IYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlZ2lzdGVyRm9yQWNjZWxlcm9tZXRlclNlbnNvcigpIHx8ICFyZWdpc3RlckZvck1hZ25ldGljRmllbGRTZW5zb3IoKSkgeworICAgICAgICAgICAgdW5yZWdpc3RlckZyb21TZW5zb3JzKCk7CisgICAgICAgICAgICBzZW5kRXJyb3JFdmVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldE9yaWVudGF0aW9uVXNpbmdHZXRSb3RhdGlvbk1hdHJpeCgpIHsKKyAgICAgICAgaWYgKG1HcmF2aXR5VmVjdG9yID09IG51bGwgfHwgbU1hZ25ldGljRmllbGRWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSByb3RhdGlvbiBtYXRyaXguCisgICAgICAgIC8vIFRoZSByb3RhdGlvbiBtYXRyaXggdGhhdCB0cmFuc2Zvcm1zIGZyb20gdGhlIGJvZHkgZnJhbWUgdG8gdGhlIGVhcnRoIGZyYW1lLgorICAgICAgICBmbG9hdFtdIGRldmljZVJvdGF0aW9uTWF0cml4ID0gbmV3IGZsb2F0WzldOworICAgICAgICBpZiAoIVNlbnNvck1hbmFnZXIuZ2V0Um90YXRpb25NYXRyaXgoCisgICAgICAgICAgICAgICAgZGV2aWNlUm90YXRpb25NYXRyaXgsIG51bGwsIG1HcmF2aXR5VmVjdG9yLCBtTWFnbmV0aWNGaWVsZFZlY3RvcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgcm90YXRpb24gbWF0cml4IHRvIHJvdGF0aW9uIGFuZ2xlcy4KKyAgICAgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGUgcm90YXRpb25zIGFyZSBhcHBpZWQgaW4gdGhlIG9yZGVyIGxpc3RlZCBhdAorICAgICAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvckV2ZW50Lmh0bWwjdmFsdWVzCisgICAgICAgIC8vIHRoZSByb3RhdGlvbnMgYXJlIGFwcGxpZWQgYWJvdXQgdGhlIHNhbWUgYXhlcyBhbmQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgcmVxdWlyZWQgYnkgdGhlCisgICAgICAgIC8vIEFQSS4gVGhlIG9ubHkgY29udmVyc2lvbnMgYXJlIHNpZ24gY2hhbmdlcyBhcyBmb2xsb3dzLgorICAgICAgICAvLyBUaGUgYW5nbGVzIGFyZSBpbiByYWRpYW5zCisgICAgICAgIGZsb2F0W10gcm90YXRpb25BbmdsZXMgPSBuZXcgZmxvYXRbM107CisgICAgICAgIFNlbnNvck1hbmFnZXIuZ2V0T3JpZW50YXRpb24oZGV2aWNlUm90YXRpb25NYXRyaXgsIHJvdGF0aW9uQW5nbGVzKTsKKyAgICAgICAgZG91YmxlIGFscGhhID0gTWF0aC50b0RlZ3JlZXMoLXJvdGF0aW9uQW5nbGVzWzBdKSAtIDkwLjA7CisgICAgICAgIHdoaWxlIChhbHBoYSA8IDAuMCkgeyBhbHBoYSArPSAzNjAuMDsgfSAvLyBbMCwgMzYwKQorICAgICAgICBkb3VibGUgYmV0YSA9IE1hdGgudG9EZWdyZWVzKC1yb3RhdGlvbkFuZ2xlc1sxXSk7CisgICAgICAgIHdoaWxlIChiZXRhIDwgLTE4MC4wKSB7IGJldGEgKz0gMzYwLjA7IH0gLy8gWy0xODAsIDE4MCkKKyAgICAgICAgZG91YmxlIGdhbW1hID0gTWF0aC50b0RlZ3JlZXMocm90YXRpb25BbmdsZXNbMl0pOworICAgICAgICB3aGlsZSAoZ2FtbWEgPCAtOTAuMCkgeyBnYW1tYSArPSAzNjAuMDsgfSAvLyBbLTkwLCA5MCkKKworICAgICAgICBtYXliZVNlbmRDaGFuZ2UoYWxwaGEsIGJldGEsIGdhbW1hKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlbnNvck1hbmFnZXIgZ2V0U2Vuc29yTWFuYWdlcigpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChtU2Vuc29yTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtU2Vuc29yTWFuYWdlciA9IChTZW5zb3JNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuU0VOU09SX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU2Vuc29yTWFuYWdlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVnaXN0ZXJGb3JBY2NlbGVyb21ldGVyU2Vuc29yKCkgeworICAgICAgICBMaXN0PFNlbnNvcj4gc2Vuc29ycyA9IGdldFNlbnNvck1hbmFnZXIoKS5nZXRTZW5zb3JMaXN0KFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIpOworICAgICAgICBpZiAoc2Vuc29ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBoYW5kbGluZyBtdWx0aXBsZSBzZW5zb3JzLgorICAgICAgICByZXR1cm4gZ2V0U2Vuc29yTWFuYWdlcigpLnJlZ2lzdGVyTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgdGhpcywgc2Vuc29ycy5nZXQoMCksIFNlbnNvck1hbmFnZXIuU0VOU09SX0RFTEFZX0ZBU1RFU1QsIG1IYW5kbGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVnaXN0ZXJGb3JNYWduZXRpY0ZpZWxkU2Vuc29yKCkgeworICAgICAgICBMaXN0PFNlbnNvcj4gc2Vuc29ycyA9IGdldFNlbnNvck1hbmFnZXIoKS5nZXRTZW5zb3JMaXN0KFNlbnNvci5UWVBFX01BR05FVElDX0ZJRUxEKTsKKyAgICAgICAgaWYgKHNlbnNvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaGFuZGxpbmcgbXVsdGlwbGUgc2Vuc29ycy4KKyAgICAgICAgcmV0dXJuIGdldFNlbnNvck1hbmFnZXIoKS5yZWdpc3Rlckxpc3RlbmVyKAorICAgICAgICAgICAgICAgIHRoaXMsIHNlbnNvcnMuZ2V0KDApLCBTZW5zb3JNYW5hZ2VyLlNFTlNPUl9ERUxBWV9GQVNURVNULCBtSGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJGcm9tU2Vuc29ycygpIHsKKyAgICAgICAgZ2V0U2Vuc29yTWFuYWdlcigpLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVTZW5kQ2hhbmdlKGRvdWJsZSBhbHBoYSwgZG91YmxlIGJldGEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKG1BbHBoYSA9PSBudWxsIHx8IG1CZXRhID09IG51bGwgfHwgbUdhbW1hID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBNYXRoLmFicyhhbHBoYSAtIG1BbHBoYSkgPiBERUxUQV9ERUdSRVNTCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoYmV0YSAtIG1CZXRhKSA+IERFTFRBX0RFR1JFU1MKKyAgICAgICAgICAgICAgICB8fCBNYXRoLmFicyhnYW1tYSAtIG1HYW1tYSkgPiBERUxUQV9ERUdSRVNTKSB7CisgICAgICAgICAgICBtQWxwaGEgPSBhbHBoYTsKKyAgICAgICAgICAgIG1CZXRhID0gYmV0YTsKKyAgICAgICAgICAgIG1HYW1tYSA9IGdhbW1hOworICAgICAgICAgICAgbU1hbmFnZXIub25PcmllbnRhdGlvbkNoYW5nZShtQWxwaGEsIG1CZXRhLCBtR2FtbWEpOworICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgc2VudCBzb21lIGRhdGEsIHJlc2V0IHdoZXRoZXIgd2UndmUgc2VudCBhbiBlcnJvci4KKyAgICAgICAgICAgIG1IYXZlU2VudEVycm9yRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbnNvckV2ZW50TGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCisgICAgICogQ2FsbGJhY2tzIGhhcHBlbiBvbiB0aGUgdGhyZWFkIG9uIHdoaWNoIHdlIHJlZ2lzdGVyZWQgLSB0aGUgV2ViQ29yZSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZW5zb3JDaGFuZ2VkKFNlbnNvckV2ZW50IGV2ZW50KSB7CisgICAgICAgIGFzc2VydChldmVudC52YWx1ZXMubGVuZ3RoID09IDMpOworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBpZiAoIW1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZXZlbnQuc2Vuc29yLmdldFR5cGUoKSkgeworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUjoKKyAgICAgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3IgPSBuZXcgZmxvYXRbM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtR3Jhdml0eVZlY3RvclswXSA9IGV2ZW50LnZhbHVlc1swXTsKKyAgICAgICAgICAgIG1HcmF2aXR5VmVjdG9yWzFdID0gZXZlbnQudmFsdWVzWzFdOworICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3JbMl0gPSBldmVudC52YWx1ZXNbMl07CisgICAgICAgICAgICBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQ6CisgICAgICAgICAgICBpZiAobU1hZ25ldGljRmllbGRWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yID0gbmV3IGZsb2F0WzNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hZ25ldGljRmllbGRWZWN0b3JbMF0gPSBldmVudC52YWx1ZXNbMF07CisgICAgICAgICAgICBtTWFnbmV0aWNGaWVsZFZlY3RvclsxXSA9IGV2ZW50LnZhbHVlc1sxXTsKKyAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yWzJdID0gZXZlbnQudmFsdWVzWzJdOworICAgICAgICAgICAgZ2V0T3JpZW50YXRpb25Vc2luZ0dldFJvdGF0aW9uTWF0cml4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRmluZEFjdGlvbk1vZGVDYWxsYmFjay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0ZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzA0M2UwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0ZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworCitjbGFzcyBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjaywgVGV4dFdhdGNoZXIsCisgICAgICAgIFZpZXcuT25Mb25nQ2xpY2tMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgRWRpdFRleHQgbUVkaXRUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbU1hdGNoZXM7CisgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OworICAgIHByaXZhdGUgSW5wdXRNZXRob2RNYW5hZ2VyIG1JbnB1dDsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOworICAgIHByaXZhdGUgYm9vbGVhbiBtTWF0Y2hlc0ZvdW5kOworICAgIHByaXZhdGUgaW50IG1OdW1iZXJPZk1hdGNoZXM7CisgICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKKyAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisKKyAgICBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ3VzdG9tVmlldyA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC53ZWJ2aWV3X2ZpbmQsIG51bGwpOworICAgICAgICBtRWRpdFRleHQgPSAoRWRpdFRleHQpIG1DdXN0b21WaWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmVkaXQpOworICAgICAgICAvLyBPdmVycmlkZSBsb25nIGNsaWNrIHNvIHRoYXQgc2VsZWN0IEFjdGlvbk1vZGUgaXMgbm90IG9wZW5lZCwgd2hpY2gKKyAgICAgICAgLy8gd291bGQgZXhpdCBmaW5kIEFjdGlvbk1vZGUuCisgICAgICAgIG1FZGl0VGV4dC5zZXRPbkxvbmdDbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBzZXRUZXh0KCIiKTsKKyAgICAgICAgbU1hdGNoZXMgPSAoVGV4dFZpZXcpIG1DdXN0b21WaWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLm1hdGNoZXMpOworICAgICAgICBtSW5wdXQgPSAoSW5wdXRNZXRob2RNYW5hZ2VyKQorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKKyAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRUaXRsZUJhcihWaWV3IHYpIHsgbVRpdGxlQmFyID0gdjsgfQorCisgICAgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgIH0KKworICAgIC8qCisgICAgICogUGxhY2UgdGV4dCBpbiB0aGUgdGV4dCBmaWVsZCBzbyBpdCBjYW4gYmUgc2VhcmNoZWQgZm9yLiAgTmVlZCB0byBwcmVzcworICAgICAqIHRoZSBmaW5kIG5leHQgb3IgZmluZCBwcmV2aW91cyBidXR0b24gdG8gZmluZCBhbGwgb2YgdGhlIG1hdGNoZXMuCisgICAgICovCisgICAgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIG1FZGl0VGV4dC5zZXRUZXh0KHRleHQpOworICAgICAgICBTcGFubmFibGUgc3BhbiA9IChTcGFubmFibGUpIG1FZGl0VGV4dC5nZXRUZXh0KCk7CisgICAgICAgIGludCBsZW5ndGggPSBzcGFuLmxlbmd0aCgpOworICAgICAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBsaWtlIHRvIHNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aG9sZSBmaWVsZCwKKyAgICAgICAgLy8gYnV0IHRoaXMgYnJpbmdzIHVwIHRoZSBUZXh0IHNlbGVjdGlvbiBDQUIsIHdoaWNoIGRpc21pc3NlcyB0aGlzCisgICAgICAgIC8vIG9uZS4KKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihzcGFuLCBsZW5ndGgsIGxlbmd0aCk7CisgICAgICAgIC8vIE5lY2Vzc2FyeSBlYWNoIHRpbWUgd2Ugc2V0IHRoZSB0ZXh0LCBzbyB0aGF0IHRoaXMgd2lsbCB3YXRjaAorICAgICAgICAvLyBjaGFuZ2VzIHRvIGl0LgorICAgICAgICBzcGFuLnNldFNwYW4odGhpcywgMCwgbGVuZ3RoLCBTcGFubmFibGUuU1BBTl9JTkNMVVNJVkVfSU5DTFVTSVZFKTsKKyAgICAgICAgbU1hdGNoZXNGb3VuZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBXZWJWaWV3IHRvIHNlYXJjaC4gIE11c3QgYmUgbm9uIG51bGwsIGFuZCBzZXQgYmVmb3JlIGNhbGxpbmcKKyAgICAgKiBzdGFydEFjdGlvbk1vZGUuCisgICAgICovCisgICAgdm9pZCBzZXRXZWJWaWV3KFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBpZiAobnVsbCA9PSB3ZWJWaWV3KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIldlYlZpZXcgc3VwcGxpZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICArICJGaW5kQWN0aW9uTW9kZUNhbGxiYWNrIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIC8qCisgICAgICogTW92ZSB0aGUgaGlnaGxpZ2h0IHRvIHRoZSBuZXh0IG1hdGNoLgorICAgICAqIEBwYXJhbSBuZXh0IElmIHRydWUsIGZpbmQgdGhlIG5leHQgbWF0Y2ggZnVydGhlciBkb3duIGluIHRoZSBkb2N1bWVudC4KKyAgICAgKiAgICAgICAgICAgICBJZiBmYWxzZSwgZmluZCB0aGUgcHJldmlvdXMgbWF0Y2gsIHVwIGluIHRoZSBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmluZE5leHQoYm9vbGVhbiBuZXh0KSB7CisgICAgICAgIGlmIChtV2ViVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJObyBXZWJWaWV3IGZvciBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrOjpmaW5kTmV4dCIpOworICAgICAgICB9CisgICAgICAgIG1XZWJWaWV3LmZpbmROZXh0KG5leHQpOworICAgIH0KKworICAgIC8qCisgICAgICogSGlnaGxpZ2h0IGFsbCB0aGUgaW5zdGFuY2VzIG9mIHRoZSBzdHJpbmcgZnJvbSBtRWRpdFRleHQgaW4gbVdlYlZpZXcuCisgICAgICovCisgICAgdm9pZCBmaW5kQWxsKCkgeworICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAiTm8gV2ViVmlldyBmb3IgRmluZEFjdGlvbk1vZGVDYWxsYmFjazo6ZmluZEFsbCIpOworICAgICAgICB9CisgICAgICAgIENoYXJTZXF1ZW5jZSBmaW5kID0gbUVkaXRUZXh0LmdldFRleHQoKTsKKyAgICAgICAgaWYgKDAgPT0gZmluZC5sZW5ndGgoKSkgeworICAgICAgICAgICAgbVdlYlZpZXcuY2xlYXJNYXRjaGVzKCk7CisgICAgICAgICAgICBtTWF0Y2hlcy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtTWF0Y2hlc0ZvdW5kID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF0Y2hlc0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIG1NYXRjaGVzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1OdW1iZXJPZk1hdGNoZXMgPSBtV2ViVmlldy5maW5kQWxsKGZpbmQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoMCA9PSBtTnVtYmVyT2ZNYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgbU1hdGNoZXMuc2V0VGV4dChtUmVzb3VyY2VzLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLm5vX21hdGNoZXMpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlTWF0Y2hlc1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHN0cmluZyB3aGljaCB0ZWxscyB0aGUgdXNlciBob3cgbWFueSBtYXRjaGVzIHdlcmUgZm91bmQsIGFuZAorICAgICAqIHdoaWNoIG1hdGNoIGlzIGN1cnJlbnRseSBoaWdobGlnaHRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlTWF0Y2hlc1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHRlbXBsYXRlID0gbVJlc291cmNlcy5nZXRRdWFudGl0eVN0cmluZygKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMubWF0Y2hlc19mb3VuZCwgbU51bWJlck9mTWF0Y2hlcywKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5maW5kSW5kZXgoKSArIDEsIG1OdW1iZXJPZk1hdGNoZXMpOworCisgICAgICAgIG1NYXRjaGVzLnNldFRleHQodGVtcGxhdGUpOworICAgIH0KKworICAgIC8vIE9uTG9uZ0NsaWNrTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uTG9uZ0NsaWNrKFZpZXcgdikgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgLy8gQWN0aW9uTW9kZS5DYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgIG1vZGUuc2V0Q3VzdG9tVmlldyhtQ3VzdG9tVmlldyk7CisgICAgICAgIG1vZGUuZ2V0TWVudUluZmxhdGVyKCkuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLm1lbnUud2Vidmlld19maW5kLAorICAgICAgICAgICAgICAgIG1lbnUpOworICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIEVkaXRhYmxlIGVkaXQgPSBtRWRpdFRleHQuZ2V0VGV4dCgpOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGVkaXQsIGVkaXQubGVuZ3RoKCkpOworICAgICAgICBtTWF0Y2hlcy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1NYXRjaGVzRm91bmQgPSBmYWxzZTsKKyAgICAgICAgbU1hdGNoZXMuc2V0VGV4dCgiMCIpOworICAgICAgICBtRWRpdFRleHQucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIG1JbnB1dC5zaG93U29mdElucHV0KG1FZGl0VGV4dCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgbVdlYlZpZXcuc2V0RW1iZWRkZWRUaXRsZUJhcihtVGl0bGVCYXIpOworICAgICAgICBtV2ViVmlldy5ub3RpZnlGaW5kRGlhbG9nRGlzbWlzc2VkKCk7CisgICAgICAgIG1JbnB1dC5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhtV2ViVmlldy5nZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoIW1NYXRjaGVzRm91bmQpIHsKKyAgICAgICAgICAgIGZpbmRBbGwoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuZmluZF9wcmV2OgorICAgICAgICAgICAgICAgIGZpbmROZXh0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5maW5kX25leHQ6CisgICAgICAgICAgICAgICAgZmluZE5leHQodHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVNYXRjaGVzU3RyaW5nKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFRleHRXYXRjaGVyIGltcGxlbWVudGF0aW9uCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlcikgeworICAgICAgICAvLyBEb2VzIG5vdGhpbmcuICBOZWVkZWQgdG8gaW1wbGVtZW50IFRleHRXYXRjaGVyLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgICAgIGZpbmRBbGwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgLy8gRG9lcyBub3RoaW5nLiAgTmVlZGVkIHRvIGltcGxlbWVudCBUZXh0V2F0Y2hlci4KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQppbmRleCAyNDMwNmY0Li45MWRlMWQ4IDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCkBAIC00NSwxNCArNDUsMTMgQEAKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZnJvbSB3aGljaCB3ZSBvYnRhaW4gdGhlIHN5c3RlbSBzZXJ2aWNlLgogICAgICAqIEBwYXJhbSBuYXRpdmVPYmplY3QgVGhlIG5hdGl2ZSBvYmplY3QgdG8gd2hpY2ggdGhpcyBvYmplY3Qgd2lsbCByZXBvcnQgcG9zaXRpb24gdXBkYXRlcyBhbmQKICAgICAgKiAgICAgZXJyb3JzLgogICAgICAqLwotICAgIHB1YmxpYyBHZW9sb2NhdGlvblNlcnZpY2UobG9uZyBuYXRpdmVPYmplY3QpIHsKKyAgICBwdWJsaWMgR2VvbG9jYXRpb25TZXJ2aWNlKENvbnRleHQgY29udGV4dCwgbG9uZyBuYXRpdmVPYmplY3QpIHsKICAgICAgICAgbU5hdGl2ZU9iamVjdCA9IG5hdGl2ZU9iamVjdDsKICAgICAgICAgLy8gUmVnaXN0ZXIgbmV3TG9jYXRpb25BdmFpbGFibGUgd2l0aCBwbGF0Zm9ybSBzZXJ2aWNlLgotICAgICAgICBBY3Rpdml0eVRocmVhZCB0aHJlYWQgPSBBY3Rpdml0eVRocmVhZC5zeXN0ZW1NYWluKCk7Ci0gICAgICAgIENvbnRleHQgY29udGV4dCA9IHRocmVhZC5nZXRBcHBsaWNhdGlvbigpOwogICAgICAgICBtTG9jYXRpb25NYW5hZ2VyID0gKExvY2F0aW9uTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTE9DQVRJT05fU0VSVklDRSk7CiAgICAgICAgIGlmIChtTG9jYXRpb25NYW5hZ2VyID09IG51bGwpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBnZXQgbG9jYXRpb24gbWFuYWdlci4iKTsKQEAgLTYyLDkgKzYxLDEwIEBACiAgICAgLyoqCiAgICAgICogU3RhcnQgbGlzdGVuaW5nIGZvciBsb2NhdGlvbiB1cGRhdGVzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0KCkgewogICAgICAgICByZWdpc3RlckZvckxvY2F0aW9uVXBkYXRlcygpOwogICAgICAgICBtSXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSB8fCBtSXNHcHNQcm92aWRlckF2YWlsYWJsZTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3LDYgKzg3LDggQEAKICAgICAgICAgICAgICAgICAvLyBvbmx5IHVucmVnaXN0ZXIgZnJvbSBhbGwsIHRoZW4gcmVyZWdpc3RlciB3aXRoIGFsbCBidXQgdGhlIEdQUy4KICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJvbUxvY2F0aW9uVXBkYXRlcygpOwogICAgICAgICAgICAgICAgIHJlZ2lzdGVyRm9yTG9jYXRpb25VcGRhdGVzKCk7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcHJvdmlkZXJzIGFyZSBzdGlsbCBhdmFpbGFibGUgYWZ0ZXIgd2UgcmUtcmVnaXN0ZXIuCisgICAgICAgICAgICAgICAgbWF5YmVSZXBvcnRFcnJvcigiVGhlIGxhc3QgbG9jYXRpb24gcHJvdmlkZXIgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTU2LDExICsxNTgsMTYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJGb3JMb2NhdGlvblVwZGF0ZXMoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsIDAsIDAsIHRoaXMpOwotICAgICAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBtYXkgZmFpbCBpZiBwcm92aWRlcnMgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBkZXZpY2UuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUiwgMCwgMCwgdGhpcyk7CisgICAgICAgICAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgfQogICAgICAgICAgICAgaWYgKG1Jc0dwc0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUiwgMCwgMCwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhdWdodCBzZWN1cml0eSBleGNlcHRpb24gcmVnaXN0ZXJpbmcgZm9yIGxvY2F0aW9uIHVwZGF0ZXMgZnJvbSBzeXN0ZW0uICIgKwpAQCAtMTczLDYgKzE4MCw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJGcm9tTG9jYXRpb25VcGRhdGVzKCkgewogICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlbW92ZVVwZGF0ZXModGhpcyk7CisgICAgICAgIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IGZhbHNlOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5Mjg4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkNvbXBsZXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKKworLyoqCisgKiA8cD5IVE1MNSBzdXBwb3J0IGNsYXNzIGZvciBBdWRpby4KKyAqLworY2xhc3MgSFRNTDVBdWRpbyBleHRlbmRzIEhhbmRsZXIKKyAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVBsYXllci5PbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PblByZXBhcmVkTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25TZWVrQ29tcGxldGVMaXN0ZW5lciB7CisgICAgLy8gTG9nZ2luZyB0YWcuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJIVE1MNUF1ZGlvIjsKKworICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIgbU1lZGlhUGxheWVyOworCisgICAgLy8gVGhlIEMrKyBNZWRpYVBsYXllclByaXZhdGVBbmRyb2lkIG9iamVjdC4KKyAgICBwcml2YXRlIGludCBtTmF0aXZlUG9pbnRlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBJRExFICAgICAgICA9ICAwOworICAgIHByaXZhdGUgc3RhdGljIGludCBJTklUSUFMSVpFRCA9ICAxOworICAgIHByaXZhdGUgc3RhdGljIGludCBQUkVQQVJFRCAgICA9ICAyOworICAgIHByaXZhdGUgc3RhdGljIGludCBTVEFSVEVEICAgICA9ICA0OworICAgIHByaXZhdGUgc3RhdGljIGludCBDT01QTEVURSAgICA9ICA1OworICAgIHByaXZhdGUgc3RhdGljIGludCBQQVVTRUQgICAgICA9ICA2OworICAgIHByaXZhdGUgc3RhdGljIGludCBTVE9QUEVEICAgICA9IC0yOworICAgIHByaXZhdGUgc3RhdGljIGludCBFUlJPUiAgICAgICA9IC0xOworCisgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gSURMRTsKKworICAgIHByaXZhdGUgU3RyaW5nIG1Vcmw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Bc2tUb1BsYXkgPSBmYWxzZTsKKworICAgIC8vIFRpbWVyIHRocmVhZCAtPiBVSSB0aHJlYWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRVVQREFURSA9IDEwMDsKKworICAgIC8vIFRoZSBzcGVjIHNheXMgdGhlIHRpbWVyIHNob3VsZCBmaXJlIGV2ZXJ5IDI1MCBtcyBvciBsZXNzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FVVBEQVRFX1BFUklPRCA9IDI1MDsgIC8vIG1zCisgICAgLy8gVGhlIHRpbWVyIGZvciB0aW1ldXBhdGUgZXZlbnRzLgorICAgIC8vIFNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNldmVudC1tZWRpYS10aW1ldXBkYXRlCisgICAgcHJpdmF0ZSBUaW1lciBtVGltZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBUaW1ldXBkYXRlVGFzayBleHRlbmRzIFRpbWVyVGFzayB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIEhUTUw1QXVkaW8udGhpcy5vYnRhaW5NZXNzYWdlKFRJTUVVUERBVEUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICBjYXNlIFRJTUVVUERBVEU6IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IEVSUk9SICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gbU1lZGlhUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlT25UaW1ldXBkYXRlKHBvc2l0aW9uLCBtTmF0aXZlUG9pbnRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBldmVudCBsaXN0ZW5lcnMgZm9yIE1lZGlhUGxheWVyCisgICAgLy8gVGhvc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCB3ZSBjcmVhdGVkIHRoZSBNZWRpYVBsYXllcgorICAgIC8vIChpLmUuIHRoZSB3ZWJ2aWV3Y29yZSB0aHJlYWQgaGVyZSkKKworICAgIC8vIE1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIKKyAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1VwZGF0ZShNZWRpYVBsYXllciBtcCwgaW50IHBlcmNlbnQpIHsKKyAgICAgICAgbmF0aXZlT25CdWZmZXJpbmcocGVyY2VudCwgbU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyOworICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGlvbihNZWRpYVBsYXllciBtcCkgeworICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgICAgIG5hdGl2ZU9uRW5kZWQobU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lcgorICAgIHB1YmxpYyBib29sZWFuIG9uRXJyb3IoTWVkaWFQbGF5ZXIgbXAsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lcgorICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZWQoTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgbVN0YXRlID0gUFJFUEFSRUQ7CisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1ldXBkYXRlVGFzaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVVUERBVEVfUEVSSU9ELCBUSU1FVVBEQVRFX1BFUklPRCk7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlT25QcmVwYXJlZChtcC5nZXREdXJhdGlvbigpLCAwLCAwLCBtTmF0aXZlUG9pbnRlcik7CisgICAgICAgIGlmIChtQXNrVG9QbGF5KSB7CisgICAgICAgICAgICBtQXNrVG9QbGF5ID0gZmFsc2U7CisgICAgICAgICAgICBwbGF5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyCisgICAgcHVibGljIHZvaWQgb25TZWVrQ29tcGxldGUoTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgbmF0aXZlT25UaW1ldXBkYXRlKG1wLmdldEN1cnJlbnRQb3NpdGlvbigpLCBtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmF0aXZlUHRyIGlzIHRoZSBDKysgcG9pbnRlciB0byB0aGUgTWVkaWFQbGF5ZXJQcml2YXRlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSFRNTDVBdWRpbyhpbnQgbmF0aXZlUHRyKSB7CisgICAgICAgIC8vIFNhdmUgdGhlIG5hdGl2ZSBwdHIKKyAgICAgICAgbU5hdGl2ZVBvaW50ZXIgPSBuYXRpdmVQdHI7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRNZWRpYVBsYXllcigpIHsKKyAgICAgICAgaWYgKG1NZWRpYVBsYXllciA9PSBudWxsKSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25Db21wbGV0aW9uTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkVycm9yTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPblByZXBhcmVkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPblNlZWtDb21wbGV0ZUxpc3RlbmVyKHRoaXMpOworCisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICB9CisgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBtU3RhdGUgPSBJRExFOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREYXRhU291cmNlKFN0cmluZyB1cmwpIHsKKyAgICAgICAgbVVybCA9IHVybDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gSURMRSkgeworICAgICAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXREYXRhU291cmNlKHVybCk7CisgICAgICAgICAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiY291bGRuJ3QgbG9hZCB0aGUgcmVzb3VyY2U6ICIgKyB1cmwgKyAiIGV4YzogIiArIGUpOworICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsYXkoKSB7CisgICAgICAgIGlmICgobVN0YXRlID09IEVSUk9SIHx8IG1TdGF0ZSA9PSBJRExFKSAmJiBtVXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgICAgIHNldERhdGFTb3VyY2UobVVybCk7CisgICAgICAgICAgICBtQXNrVG9QbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3RhdGUgPj0gUFJFUEFSRUQpIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zdGFydCgpOworICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXVzZSgpIHsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFSVEVEKSB7CisgICAgICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGltZXIucHVyZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5wYXVzZSgpOworICAgICAgICAgICAgbVN0YXRlID0gUEFVU0VEOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlZWsoaW50IG1zZWMpIHsKKyAgICAgICAgaWYgKG1TdGF0ZSA+PSBQUkVQQVJFRCkgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlZWtUbyhtc2VjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgbU1lZGlhUGxheWVyLnJlbGVhc2UoKTsKKyAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgIG1OYXRpdmVQb2ludGVyID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGdldE1heFRpbWVTZWVrYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpIC8gMTAwMC4wZjsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uQnVmZmVyaW5nKGludCBwZXJjZW50LCBpbnQgbmF0aXZlUG9pbnRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbkVuZGVkKGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uUHJlcGFyZWQoaW50IGR1cmF0aW9uLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uVGltZXVwZGF0ZShpbnQgcG9zaXRpb24sIGludCBuYXRpdmVQb2ludGVyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IdHRwQXV0aEhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IdHRwQXV0aEhhbmRsZXIuamF2YQppbmRleCBlZDg1ZGE2Li4xNzk3ZWI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSHR0cEF1dGhIYW5kbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0h0dHBBdXRoSGFuZGxlci5qYXZhCkBAIC0xNiwxNTEgKzE2LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogCiAvKioKLSAqIEhUVFAgYXV0aGVudGljYXRpb24gaGFuZGxlcjogbG9jYWwgaGFuZGxlciB0aGF0IHRha2VzIGNhcmUKLSAqIG9mIEhUVFAgYXV0aGVudGljYXRpb24gcmVxdWVzdHMuIFRoaXMgY2xhc3MgaXMgcGFzc2VkIGFzIGEKLSAqIHBhcmFtZXRlciB0byBCcm93c2VyQ2FsbGJhY2suZGlzcGxheUh0dHBBdXRoRGlhbG9nIGFuZCBpcwotICogbWVhbnQgdG8gcmVjZWl2ZSB0aGUgdXNlcidzIHJlc3BvbnNlLgorICogSFRUUCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IHRoYXQgbXVzdCBiZSBoYW5kbGVkIGJ5IHRoZSB1c2VyIGludGVyZmFjZS4KKyAqIFdlYlZpZXcgY3JlYXRlcyB0aGUgb2JqZWN0IGFuZCBoYW5kcyBpdCB0byB0aGUgY3VycmVudCB7QGxpbmsgV2ViVmlld0NsaWVudH0sCisgKiB3aGljaCBtdXN0IGNhbGwgZWl0aGVyIHtAbGluayAjcHJvY2VlZChTdHJpbmcsIFN0cmluZyl9IG9yIHtAbGluayAjY2FuY2VsKCl9LgogICovCiBwdWJsaWMgY2xhc3MgSHR0cEF1dGhIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgLyogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIGhhbmRsZXIgaXMgaW4gTmV0d29yaywgYmVjYXVzZQotICAgICAqIHdlIHdhbnQgdG8gc2hhcmUgaXQgYWNjcm9zcyBtdWx0aXBsZSBsb2FkZXJzIGFuZCB3aW5kb3dzCi0gICAgICogKGxpa2Ugb3VyIHN1YndpbmRvdyBhbmQgdGhlIG1haW4gd2luZG93KS4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAibmV0d29yayI7CiAKICAgICAvKioKLSAgICAgKiBOZXR3b3JrLgorICAgICAqIFBhY2thZ2UtcHJpdmF0ZSBjb25zdHJ1Y3RvciBuZWVkZWQgZm9yIEFQSSBjb21wYXRpYmlsaXR5LgogICAgICAqLwotICAgIHByaXZhdGUgTmV0d29yayBtTmV0d29yazsKLQotICAgIC8qKgotICAgICAqIExvYWRlciBxdWV1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpbmtlZExpc3Q8TG9hZExpc3RlbmVyPiBtTG9hZGVyUXVldWU7Ci0KLQotICAgIC8vIE1lc3NhZ2UgaWQgZm9yIGhhbmRsaW5nIHRoZSB1c2VyIHJlc3BvbnNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFVVEhfUFJPQ0VFRCA9IDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUSF9DQU5DRUwgPSAyMDA7Ci0KLSAgICAvLyBVc2UgdG8gc3luY2hyb25pemUgd2hlbiBtYWtpbmcgc3luY2hyb25vdXMgY2FsbHMgdG8KLSAgICAvLyBvblJlY2VpdmVkSHR0cEF1dGhSZXF1ZXN0KCkuIFdlIGNhbid0IHVzZSBhIHNpbmdsZSBCb29sZWFuIG9iamVjdCBmb3IKLSAgICAvLyBib3RoIHRoZSBsb2NrIGFuZCB0aGUgc3RhdGUsIGJlY2F1c2UgQm9vbGVhbiBpcyBpbW11dGFibGUuCi0gICAgT2JqZWN0IG1SZXF1ZXN0SW5GbGlnaHRMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIGJvb2xlYW4gbVJlcXVlc3RJbkZsaWdodDsKLSAgICBTdHJpbmcgbVVzZXJuYW1lOwotICAgIFN0cmluZyBtUGFzc3dvcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEhUVFAgYXV0aGVudGljYXRpb24gaGFuZGxlciB3aXRoIGFuIGVtcHR5Ci0gICAgICogbG9hZGVyIHF1ZXVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0d29yayBUaGUgcGFyZW50IG5ldHdvcmsgb2JqZWN0Ci0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBIdHRwQXV0aEhhbmRsZXIoTmV0d29yayBuZXR3b3JrKSB7Ci0gICAgICAgIG1OZXR3b3JrID0gbmV0d29yazsKLSAgICAgICAgbUxvYWRlclF1ZXVlID0gbmV3IExpbmtlZExpc3Q8TG9hZExpc3RlbmVyPigpOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICBMb2FkTGlzdGVuZXIgbG9hZGVyID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKLSAgICAgICAgICAgIGxvYWRlciA9IG1Mb2FkZXJRdWV1ZS5wb2xsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KGxvYWRlci5pc1N5bmNocm9ub3VzKCkgPT0gZmFsc2UpOwotCi0gICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgQVVUSF9QUk9DRUVEOgotICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1c2VybmFtZSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJwYXNzd29yZCIpOwotCi0gICAgICAgICAgICAgICAgbG9hZGVyLmhhbmRsZUF1dGhSZXNwb25zZSh1c2VybmFtZSwgcGFzc3dvcmQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEFVVEhfQ0FOQ0VMOgotICAgICAgICAgICAgICAgIGxvYWRlci5oYW5kbGVBdXRoUmVzcG9uc2UobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9jZXNzTmV4dExvYWRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byB1bmJsb2NrIGhhbmRsZUF1dGhSZXF1ZXN0KCksIHdoaWNoIGluIHRoZSBjYXNlIG9mIGEKLSAgICAgKiBzeW5jaHJvbm91cyByZXF1ZXN0IHdpbGwgd2FpdCBmb3IgcHJveHkub25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdCgpIHRvCi0gICAgICogY2FsbCBiYWNrIHRvIGVpdGhlciBwcm9jZWVkKCkgb3IgY2FuY2VsKCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24KLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlcXVlc3QgaXMgc3luY2hyb25vdXMgYW5kIGhhbmRsZUF1dGhSZXF1ZXN0KCkgaGFzCi0gICAgICogYmVlbiB1bmJsb2NrZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUmVzcG9uc2VGb3JTeW5jaHJvbm91c1JlcXVlc3QoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7Ci0gICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2FkZXIuaXNTeW5jaHJvbm91cygpKSB7Ci0gICAgICAgICAgICBtVXNlcm5hbWUgPSB1c2VybmFtZTsKLSAgICAgICAgICAgIG1QYXNzd29yZCA9IHBhc3N3b3JkOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaWduYWxSZXF1ZXN0Q29tcGxldGUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVJlcXVlc3RJbkZsaWdodExvY2spIHsKLSAgICAgICAgICAgIGFzc2VydChtUmVxdWVzdEluRmxpZ2h0KTsKLSAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHRMb2NrLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VlZCB3aXRoIHRoZSBhdXRob3JpemF0aW9uIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzCi0gICAgICoKLSAgICAgKiBNYXkgYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQsIHJhdGhlciB0aGFuIHRoZSBXZWJDb3JlIHRocmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbgotICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2NlZWQoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKGhhbmRsZVJlc3BvbnNlRm9yU3luY2hyb25vdXNSZXF1ZXN0KHVzZXJuYW1lLCBwYXNzd29yZCkpIHsKLSAgICAgICAgICAgIHNpZ25hbFJlcXVlc3RDb21wbGV0ZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShBVVRIX1BST0NFRUQpOwotICAgICAgICBtc2cuZ2V0RGF0YSgpLnB1dFN0cmluZygidXNlcm5hbWUiLCB1c2VybmFtZSk7Ci0gICAgICAgIG1zZy5nZXREYXRhKCkucHV0U3RyaW5nKCJwYXNzd29yZCIsIHBhc3N3b3JkKTsKLSAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgc2lnbmFsUmVxdWVzdENvbXBsZXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FuY2VsIHRoZSBhdXRob3JpemF0aW9uIHJlcXVlc3QKLSAgICAgKgotICAgICAqIE1heSBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCwgcmF0aGVyIHRoYW4gdGhlIFdlYkNvcmUgdGhyZWFkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBpZiAoaGFuZGxlUmVzcG9uc2VGb3JTeW5jaHJvbm91c1JlcXVlc3QobnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgIHNpZ25hbFJlcXVlc3RDb21wbGV0ZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQVVUSF9DQU5DRUwpKTsKLSAgICAgICAgc2lnbmFsUmVxdWVzdENvbXBsZXRlKCk7CisgICAgSHR0cEF1dGhIYW5kbGVyKCkgewogICAgIH0KIAogICAgIC8qKgpAQCAtMTY4LDExMyArMzYsMTggQEAKICAgICAgKiAoaWUsIGlmIHdlIGRpZCBub3QgZmFpbCB0cnlpbmcgdG8gdXNlIHRoZW0gbGFzdCB0aW1lKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHVzZUh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7Ci0gICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICFsb2FkZXIuYXV0aENyZWRlbnRpYWxzSW52YWxpZCgpOwotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVucXVldWVzIHRoZSBsb2FkZXIsIGlmIHRoZSBsb2FkZXIgaXMgdGhlIG9ubHkgZWxlbWVudAotICAgICAqIGluIHRoZSBxdWV1ZSwgc3RhcnRzIHByb2Nlc3NpbmcgdGhlIGxvYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGxvYWRlciBUaGUgbG9hZGVyIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcyBodHRwCi0gICAgICogYXV0aGVudGljYXRpb24gcmVxdWVzdAorICAgICAqIENhbmNlbCB0aGUgYXV0aG9yaXphdGlvbiByZXF1ZXN0LgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBoYW5kbGVBdXRoUmVxdWVzdChMb2FkTGlzdGVuZXIgbG9hZGVyKSB7Ci0gICAgICAgIC8vIFRoZSBjYWxsIHRvIHByb3h5Lm9uUmVjZWl2ZWRIdHRwQXV0aFJlcXVlc3QoKSBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZgotICAgICAgICAvLyB0aGUgcmVxdWVzdCBpcyBzeW5jaHJvbm91cywgd2UgbXVzdCBibG9jayBoZXJlIHVudGlsIHdlIGhhdmUgYQotICAgICAgICAvLyByZXNwb25zZS4KLSAgICAgICAgaWYgKGxvYWRlci5pc1N5bmNocm9ub3VzKCkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSByZXF1ZXN0IGluIGZsaWdodCwgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuIFRoZQotICAgICAgICAgICAgLy8gcmVzcG9uc2Ugd2lsbCBxdWV1ZSBhIG1lc3NhZ2Ugb24gdGhpcyB0aHJlYWQuCi0gICAgICAgICAgICB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKTsKLSAgICAgICAgICAgIC8vIE1ha2UgYSByZXF1ZXN0IHRvIHRoZSBwcm94eSBmb3IgdGhpcyByZXF1ZXN0LCBqdW1waW5nIHRoZSBxdWV1ZS4KLSAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgcXVldWUgc28gdGhhdCB0aGUgbG9hZGVyIGlzIHByZXNlbnQgaW4KLSAgICAgICAgICAgIC8vIHVzZUh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpLgotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKLSAgICAgICAgICAgICAgICBtTG9hZGVyUXVldWUuYWRkRmlyc3QobG9hZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2Nlc3NOZXh0TG9hZGVyKCk7Ci0gICAgICAgICAgICAvLyBXYWl0IGZvciB0aGlzIHJlcXVlc3QgdG8gY29tcGxldGUuCi0gICAgICAgICAgICB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKTsKLSAgICAgICAgICAgIC8vIFBvcCB0aGUgbG9hZGVyIGZyb20gdGhlIHF1ZXVlLgotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQobUxvYWRlclF1ZXVlLnBlZWsoKSA9PSBsb2FkZXIpOwotICAgICAgICAgICAgICAgIG1Mb2FkZXJRdWV1ZS5wb2xsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDYWxsIGJhY2suCi0gICAgICAgICAgICBsb2FkZXIuaGFuZGxlQXV0aFJlc3BvbnNlKG1Vc2VybmFtZSwgbVBhc3N3b3JkKTsKLSAgICAgICAgICAgIC8vIFRoZSBtZXNzYWdlIHF1ZXVlZCBieSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgbGFzdCBhc3luY2hyb25vdXMKLSAgICAgICAgICAgIC8vIHJlcXVlc3QsIGlmIHByZXNlbnQsIHdpbGwgc3RhcnQgdGhlIG5leHQgcmVxdWVzdC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gcHJvY2Vzc05leHQgPSBmYWxzZTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2FkZXJRdWV1ZSkgewotICAgICAgICAgICAgbUxvYWRlclF1ZXVlLm9mZmVyKGxvYWRlcik7Ci0gICAgICAgICAgICBwcm9jZXNzTmV4dCA9Ci0gICAgICAgICAgICAgICAgKG1Mb2FkZXJRdWV1ZS5zaXplKCkgPT0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvY2Vzc05leHQpIHsKLSAgICAgICAgICAgIHByb2Nlc3NOZXh0TG9hZGVyKCk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV2FpdCBmb3IgdGhlIHJlcXVlc3QgaW4gZmxpZ2h0LCBpZiBhbnksIHRvIGNvbXBsZXRlCisgICAgICogUHJvY2VlZCB3aXRoIHRoZSBhdXRob3JpemF0aW9uIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVJlcXVlc3RJbkZsaWdodExvY2spIHsKLSAgICAgICAgICAgIHdoaWxlIChtUmVxdWVzdEluRmxpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3RJbkZsaWdodExvY2sud2FpdCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciByZXF1ZXN0IHRvIGNvbXBsZXRlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyB0aGUgbmV4dCBsb2FkZXIgaW4gdGhlIHF1ZXVlIChoZWxwZXIgbWV0aG9kKQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTmV4dExvYWRlcigpIHsKLSAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7Ci0gICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtUmVxdWVzdEluRmxpZ2h0TG9jaykgewotICAgICAgICAgICAgICAgIGFzc2VydChtUmVxdWVzdEluRmxpZ2h0ID09IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtUmVxdWVzdEluRmxpZ2h0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2FsbGJhY2tQcm94eSBwcm94eSA9IGxvYWRlci5nZXRGcmFtZSgpLmdldENhbGxiYWNrUHJveHkoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGhvc3RuYW1lID0gbG9hZGVyLnByb3h5QXV0aGVudGljYXRlKCkgPwotICAgICAgICAgICAgICAgIG1OZXR3b3JrLmdldFByb3h5SG9zdG5hbWUoKSA6IGxvYWRlci5ob3N0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZWFsbSA9IGxvYWRlci5yZWFsbSgpOwotCi0gICAgICAgICAgICBwcm94eS5vblJlY2VpdmVkSHR0cEF1dGhSZXF1ZXN0KHRoaXMsIGhvc3RuYW1lLCByZWFsbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1zIHRoZSBXZWJWaWV3IG9mIGEgbmV3IHNldCBvZiBjcmVkZW50aWFscy4KLSAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBjb3VuY2lsIHJldmlldwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvblJlY2VpdmVkQ3JlZGVudGlhbHMoTG9hZExpc3RlbmVyIGxvYWRlciwKLSAgICAgICAgICAgIFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0sIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIENhbGxiYWNrUHJveHkgcHJveHkgPSBsb2FkZXIuZ2V0RnJhbWUoKS5nZXRDYWxsYmFja1Byb3h5KCk7Ci0gICAgICAgIHByb3h5Lm9uUmVjZWl2ZWRIdHRwQXV0aENyZWRlbnRpYWxzKGhvc3QsIHJlYWxtLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgIHB1YmxpYyB2b2lkIHByb2NlZWQoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSHR0cEF1dGhIYW5kbGVySW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0h0dHBBdXRoSGFuZGxlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzA1MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0h0dHBBdXRoSGFuZGxlckltcGwuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIEh0dHBBdXRoSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIG9ubHkgYnkgdGhlIEFuZHJvaWQgSmF2YSBIVFRQIHN0YWNrLgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIG5vdCBuZWVkZWQgd2hlbiB3ZSdyZSB1c2luZyB0aGUgQ2hyb21pdW0gSFRUUCBzdGFjay4KKyAqLworY2xhc3MgSHR0cEF1dGhIYW5kbGVySW1wbCBleHRlbmRzIEh0dHBBdXRoSGFuZGxlciB7CisgICAgLyoKKyAgICAgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgaGFuZGxlciBpcyBpbiBOZXR3b3JrLCBiZWNhdXNlIHdlIHdhbnQgdG8gc2hhcmUKKyAgICAgKiBpdCBhY2Nyb3NzIG11bHRpcGxlIGxvYWRlcnMgYW5kIHdpbmRvd3MgKGxpa2Ugb3VyIHN1YndpbmRvdyBhbmQgdGhlIG1haW4KKyAgICAgKiB3aW5kb3cpLgorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJuZXR3b3JrIjsKKworICAgIC8qKgorICAgICAqIE5ldHdvcmsuCisgICAgICovCisgICAgcHJpdmF0ZSBOZXR3b3JrIG1OZXR3b3JrOworCisgICAgLyoqCisgICAgICogTG9hZGVyIHF1ZXVlLgorICAgICAqLworICAgIHByaXZhdGUgTGlua2VkTGlzdDxMb2FkTGlzdGVuZXI+IG1Mb2FkZXJRdWV1ZTsKKworCisgICAgLy8gTWVzc2FnZSBpZCBmb3IgaGFuZGxpbmcgdGhlIHVzZXIgcmVzcG9uc2UKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUSF9QUk9DRUVEID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRIX0NBTkNFTCA9IDIwMDsKKworICAgIC8vIFVzZSB0byBzeW5jaHJvbml6ZSB3aGVuIG1ha2luZyBzeW5jaHJvbm91cyBjYWxscyB0bworICAgIC8vIG9uUmVjZWl2ZWRIdHRwQXV0aFJlcXVlc3QoKS4gV2UgY2FuJ3QgdXNlIGEgc2luZ2xlIEJvb2xlYW4gb2JqZWN0IGZvcgorICAgIC8vIGJvdGggdGhlIGxvY2sgYW5kIHRoZSBzdGF0ZSwgYmVjYXVzZSBCb29sZWFuIGlzIGltbXV0YWJsZS4KKyAgICBPYmplY3QgbVJlcXVlc3RJbkZsaWdodExvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgYm9vbGVhbiBtUmVxdWVzdEluRmxpZ2h0OworICAgIFN0cmluZyBtVXNlcm5hbWU7CisgICAgU3RyaW5nIG1QYXNzd29yZDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSFRUUCBhdXRoZW50aWNhdGlvbiBoYW5kbGVyIHdpdGggYW4gZW1wdHkKKyAgICAgKiBsb2FkZXIgcXVldWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXR3b3JrIFRoZSBwYXJlbnQgbmV0d29yayBvYmplY3QKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEh0dHBBdXRoSGFuZGxlckltcGwoTmV0d29yayBuZXR3b3JrKSB7CisgICAgICAgIG1OZXR3b3JrID0gbmV0d29yazsKKyAgICAgICAgbUxvYWRlclF1ZXVlID0gbmV3IExpbmtlZExpc3Q8TG9hZExpc3RlbmVyPigpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICBMb2FkTGlzdGVuZXIgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKKyAgICAgICAgICAgIGxvYWRlciA9IG1Mb2FkZXJRdWV1ZS5wb2xsKCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGxvYWRlci5pc1N5bmNocm9ub3VzKCkgPT0gZmFsc2UpOworCisgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgQVVUSF9QUk9DRUVEOgorICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1c2VybmFtZSIpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJwYXNzd29yZCIpOworCisgICAgICAgICAgICAgICAgbG9hZGVyLmhhbmRsZUF1dGhSZXNwb25zZSh1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFVVEhfQ0FOQ0VMOgorICAgICAgICAgICAgICAgIGxvYWRlci5oYW5kbGVBdXRoUmVzcG9uc2UobnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwcm9jZXNzTmV4dExvYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byB1bmJsb2NrIGhhbmRsZUF1dGhSZXF1ZXN0KCksIHdoaWNoIGluIHRoZSBjYXNlIG9mIGEKKyAgICAgKiBzeW5jaHJvbm91cyByZXF1ZXN0IHdpbGwgd2FpdCBmb3IgcHJveHkub25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdCgpIHRvCisgICAgICogY2FsbCBiYWNrIHRvIGVpdGhlciBwcm9jZWVkKCkgb3IgY2FuY2VsKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlcXVlc3QgaXMgc3luY2hyb25vdXMgYW5kIGhhbmRsZUF1dGhSZXF1ZXN0KCkgaGFzCisgICAgICogYmVlbiB1bmJsb2NrZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUmVzcG9uc2VGb3JTeW5jaHJvbm91c1JlcXVlc3QoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7CisgICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOworICAgICAgICB9CisgICAgICAgIGlmIChsb2FkZXIuaXNTeW5jaHJvbm91cygpKSB7CisgICAgICAgICAgICBtVXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICAgICAgICAgIG1QYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaWduYWxSZXF1ZXN0Q29tcGxldGUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVJlcXVlc3RJbkZsaWdodExvY2spIHsKKyAgICAgICAgICAgIGFzc2VydChtUmVxdWVzdEluRmxpZ2h0KTsKKyAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHRMb2NrLm5vdGlmeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VlZCB3aXRoIHRoZSBhdXRob3JpemF0aW9uIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzCisgICAgICoKKyAgICAgKiBNYXkgYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQsIHJhdGhlciB0aGFuIHRoZSBXZWJDb3JlIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb2NlZWQoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgaWYgKGhhbmRsZVJlc3BvbnNlRm9yU3luY2hyb25vdXNSZXF1ZXN0KHVzZXJuYW1lLCBwYXNzd29yZCkpIHsKKyAgICAgICAgICAgIHNpZ25hbFJlcXVlc3RDb21wbGV0ZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShBVVRIX1BST0NFRUQpOworICAgICAgICBtc2cuZ2V0RGF0YSgpLnB1dFN0cmluZygidXNlcm5hbWUiLCB1c2VybmFtZSk7CisgICAgICAgIG1zZy5nZXREYXRhKCkucHV0U3RyaW5nKCJwYXNzd29yZCIsIHBhc3N3b3JkKTsKKyAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgc2lnbmFsUmVxdWVzdENvbXBsZXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIHRoZSBhdXRob3JpemF0aW9uIHJlcXVlc3QKKyAgICAgKgorICAgICAqIE1heSBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCwgcmF0aGVyIHRoYW4gdGhlIFdlYkNvcmUgdGhyZWFkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgICBpZiAoaGFuZGxlUmVzcG9uc2VGb3JTeW5jaHJvbm91c1JlcXVlc3QobnVsbCwgbnVsbCkpIHsKKyAgICAgICAgICAgIHNpZ25hbFJlcXVlc3RDb21wbGV0ZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQVVUSF9DQU5DRUwpKTsKKyAgICAgICAgc2lnbmFsUmVxdWVzdENvbXBsZXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUcnVlIGlmIHdlIGNhbiB1c2UgdXNlciBjcmVkZW50aWFscyBvbiByZWNvcmQKKyAgICAgKiAoaWUsIGlmIHdlIGRpZCBub3QgZmFpbCB0cnlpbmcgdG8gdXNlIHRoZW0gbGFzdCB0aW1lKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHVzZUh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKKyAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7CisgICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOworICAgICAgICB9CisgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICFsb2FkZXIuYXV0aENyZWRlbnRpYWxzSW52YWxpZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVucXVldWVzIHRoZSBsb2FkZXIsIGlmIHRoZSBsb2FkZXIgaXMgdGhlIG9ubHkgZWxlbWVudAorICAgICAqIGluIHRoZSBxdWV1ZSwgc3RhcnRzIHByb2Nlc3NpbmcgdGhlIGxvYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgbG9hZGVyIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcyBodHRwCisgICAgICogYXV0aGVudGljYXRpb24gcmVxdWVzdAorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBoYW5kbGVBdXRoUmVxdWVzdChMb2FkTGlzdGVuZXIgbG9hZGVyKSB7CisgICAgICAgIC8vIFRoZSBjYWxsIHRvIHByb3h5Lm9uUmVjZWl2ZWRIdHRwQXV0aFJlcXVlc3QoKSBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZgorICAgICAgICAvLyB0aGUgcmVxdWVzdCBpcyBzeW5jaHJvbm91cywgd2UgbXVzdCBibG9jayBoZXJlIHVudGlsIHdlIGhhdmUgYQorICAgICAgICAvLyByZXNwb25zZS4KKyAgICAgICAgaWYgKGxvYWRlci5pc1N5bmNocm9ub3VzKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSByZXF1ZXN0IGluIGZsaWdodCwgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuIFRoZQorICAgICAgICAgICAgLy8gcmVzcG9uc2Ugd2lsbCBxdWV1ZSBhIG1lc3NhZ2Ugb24gdGhpcyB0aHJlYWQuCisgICAgICAgICAgICB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKTsKKyAgICAgICAgICAgIC8vIE1ha2UgYSByZXF1ZXN0IHRvIHRoZSBwcm94eSBmb3IgdGhpcyByZXF1ZXN0LCBqdW1waW5nIHRoZSBxdWV1ZS4KKyAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgcXVldWUgc28gdGhhdCB0aGUgbG9hZGVyIGlzIHByZXNlbnQgaW4KKyAgICAgICAgICAgIC8vIHVzZUh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKKyAgICAgICAgICAgICAgICBtTG9hZGVyUXVldWUuYWRkRmlyc3QobG9hZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2Nlc3NOZXh0TG9hZGVyKCk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGlzIHJlcXVlc3QgdG8gY29tcGxldGUuCisgICAgICAgICAgICB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKTsKKyAgICAgICAgICAgIC8vIFBvcCB0aGUgbG9hZGVyIGZyb20gdGhlIHF1ZXVlLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQobUxvYWRlclF1ZXVlLnBlZWsoKSA9PSBsb2FkZXIpOworICAgICAgICAgICAgICAgIG1Mb2FkZXJRdWV1ZS5wb2xsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDYWxsIGJhY2suCisgICAgICAgICAgICBsb2FkZXIuaGFuZGxlQXV0aFJlc3BvbnNlKG1Vc2VybmFtZSwgbVBhc3N3b3JkKTsKKyAgICAgICAgICAgIC8vIFRoZSBtZXNzYWdlIHF1ZXVlZCBieSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgbGFzdCBhc3luY2hyb25vdXMKKyAgICAgICAgICAgIC8vIHJlcXVlc3QsIGlmIHByZXNlbnQsIHdpbGwgc3RhcnQgdGhlIG5leHQgcmVxdWVzdC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gcHJvY2Vzc05leHQgPSBmYWxzZTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2FkZXJRdWV1ZSkgeworICAgICAgICAgICAgbUxvYWRlclF1ZXVlLm9mZmVyKGxvYWRlcik7CisgICAgICAgICAgICBwcm9jZXNzTmV4dCA9CisgICAgICAgICAgICAgICAgKG1Mb2FkZXJRdWV1ZS5zaXplKCkgPT0gMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvY2Vzc05leHQpIHsKKyAgICAgICAgICAgIHByb2Nlc3NOZXh0TG9hZGVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciB0aGUgcmVxdWVzdCBpbiBmbGlnaHQsIGlmIGFueSwgdG8gY29tcGxldGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclJlcXVlc3RUb0NvbXBsZXRlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZXF1ZXN0SW5GbGlnaHRMb2NrKSB7CisgICAgICAgICAgICB3aGlsZSAobVJlcXVlc3RJbkZsaWdodCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHRMb2NrLndhaXQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgcmVxdWVzdCB0byBjb21wbGV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIG5leHQgbG9hZGVyIGluIHRoZSBxdWV1ZSAoaGVscGVyIG1ldGhvZCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc05leHRMb2FkZXIoKSB7CisgICAgICAgIExvYWRMaXN0ZW5lciBsb2FkZXIgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2FkZXJRdWV1ZSkgeworICAgICAgICAgICAgbG9hZGVyID0gbUxvYWRlclF1ZXVlLnBlZWsoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVJlcXVlc3RJbkZsaWdodExvY2spIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQobVJlcXVlc3RJbkZsaWdodCA9PSBmYWxzZSk7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RJbkZsaWdodCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENhbGxiYWNrUHJveHkgcHJveHkgPSBsb2FkZXIuZ2V0RnJhbWUoKS5nZXRDYWxsYmFja1Byb3h5KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBob3N0bmFtZSA9IGxvYWRlci5wcm94eUF1dGhlbnRpY2F0ZSgpID8KKyAgICAgICAgICAgICAgICBtTmV0d29yay5nZXRQcm94eUhvc3RuYW1lKCkgOiBsb2FkZXIuaG9zdCgpOworCisgICAgICAgICAgICBTdHJpbmcgcmVhbG0gPSBsb2FkZXIucmVhbG0oKTsKKworICAgICAgICAgICAgcHJveHkub25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdCh0aGlzLCBob3N0bmFtZSwgcmVhbG0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtcyB0aGUgV2ViVmlldyBvZiBhIG5ldyBzZXQgb2YgY3JlZGVudGlhbHMuCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCByZXZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgb25SZWNlaXZlZENyZWRlbnRpYWxzKExvYWRMaXN0ZW5lciBsb2FkZXIsCisgICAgICAgICAgICBTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBDYWxsYmFja1Byb3h5IHByb3h5ID0gbG9hZGVyLmdldEZyYW1lKCkuZ2V0Q2FsbGJhY2tQcm94eSgpOworICAgICAgICBwcm94eS5vblJlY2VpdmVkSHR0cEF1dGhDcmVkZW50aWFscyhob3N0LCByZWFsbSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKaW5kZXggMWY4ZDUzZi4uOTA4NTI2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTUyLDEyICs1MywxNSBAQAogICAgIC8qIHBhY2thZ2UgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IFJFRlJFU0hfUExVR0lOUyA9IDEwMDsKIAorICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwOworCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3IEpXZWJDb3JlSmF2YUJyaWRnZSB0byBpbnRlcmZhY2Ugd2l0aAogICAgICAqIFdlYkNvcmUgdGltZXJzIGFuZCBjb29raWVzLgogICAgICAqLwogICAgIHB1YmxpYyBKV2ViQ29yZUphdmFCcmlkZ2UoKSB7CiAgICAgICAgIG5hdGl2ZUNvbnN0cnVjdG9yKCk7CisKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI3MSw2ICsyNzUsMjggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIENhbGxlZCBvbiB0aGUgV2ViQ29yZSB0aHJlYWQgdGhyb3VnaCBKTkkuCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZUZpbGVQYXRoRm9yQ29udGVudFVyaShTdHJpbmcgdXJpKSB7CisgICAgICAgIGlmIChtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwLmdldCh1cmkpOworICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWlsc2FmZSBmYWxsYmFjayB0byBqdXN0IHVzZSB0aGUgbGFzdCBwYXRoIHNlZ21lbnQuCisgICAgICAgIC8vIChTZWUgT3BlbmFibGVDb2x1bW5zIGRvY3VtZW50YXRpb24gaW4gdGhlIFNESykKKyAgICAgICAgVXJpIGpVcmkgPSBVcmkucGFyc2UodXJpKTsKKyAgICAgICAgcmV0dXJuIGpVcmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVGaWxlUGF0aEZvckNvbnRlbnRVcmkoU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50VXJpKSB7CisgICAgICAgIGlmIChtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwLnB1dChjb250ZW50VXJpLCBwYXRoKTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvbnN0cnVjdG9yKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGaW5hbGl6ZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2hhcmVkVGltZXJGaXJlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lci5qYXZhCmluZGV4IGU2ZmE0MDUuLjhhNTVjNDggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEKQEAgLTExMCw2ICsxMTAsNyBAQAogICAgIHByaXZhdGUgUmVxdWVzdEhhbmRsZSBtUmVxdWVzdEhhbmRsZTsKICAgICBwcml2YXRlIFJlcXVlc3RIYW5kbGUgbVNzbEVycm9yUmVxdWVzdEhhbmRsZTsKICAgICBwcml2YXRlIGxvbmcgICAgIG1Qb3N0SWRlbnRpZmllcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gIG1TZXROYXRpdmVSZXNwb25zZTsKIAogICAgIC8vIFJlcXVlc3QgZGF0YS4gSXQgaXMgb25seSB2YWxpZCB3aGVuIHdlIGFyZSBkb2luZyBhIGxvYWQgZnJvbSB0aGUKICAgICAvLyBjYWNoZS4gSXQgaXMgbmVlZGVkIGlmIHRoZSBjYWNoZSByZXR1cm5zIGEgcmVkaXJlY3QKQEAgLTE4MSw2ICsxODIsNyBAQAogICAgIHByaXZhdGUgdm9pZCBjbGVhck5hdGl2ZUxvYWRlcigpIHsKICAgICAgICAgc05hdGl2ZUxvYWRlckNvdW50IC09IDE7CiAgICAgICAgIG1OYXRpdmVMb2FkZXIgPSAwOworICAgICAgICBtU2V0TmF0aXZlUmVzcG9uc2UgPSBmYWxzZTsKICAgICB9CiAKICAgICAvKgpAQCAtNjgxLDcgKzY4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IG1BdXRoSGVhZGVyLmlzUHJveHkoKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmsuZ2V0SW5zdGFuY2UobUNvbnRleHQpLmdldFByb3h5SG9zdG5hbWUoKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcmkubUhvc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBIdHRwQXV0aEhhbmRsZXIub25SZWNlaXZlZENyZWRlbnRpYWxzKHRoaXMsIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBIdHRwQXV0aEhhbmRsZXJJbXBsLm9uUmVjZWl2ZWRDcmVkZW50aWFscyh0aGlzLCBob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXV0aEhlYWRlci5nZXRSZWFsbSgpLCBtVXNlcm5hbWUsIG1QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlQXV0aFJlc3BvbnNlKG1Vc2VybmFtZSwgbVBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEwODYsMTMgKzEwODgsMTggQEAKICAgICAgICAgLy8gcmVxdWVzdCB3aXRoIHNvbWUgY3JlZGVudGlhbHMgdGhlbiBkb24ndCBjb21taXQgdGhlIGhlYWRlcnMKICAgICAgICAgLy8gb2YgdGhpcyByZXNwb25zZTsgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0IHdpdGggdGhlCiAgICAgICAgIC8vIGNyZWRlbnRpYWxzLgotICAgICAgICBpZiAobUF1dGhIZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgaWYgKG1BdXRoSGVhZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgICAgIC8vIENvbW1pdCB0aGUgaGVhZGVycyB0byBXZWJDb3JlCisgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldE5hdGl2ZVJlc3BvbnNlKCkgewogICAgICAgICBpbnQgbmF0aXZlUmVzcG9uc2UgPSBjcmVhdGVOYXRpdmVSZXNwb25zZSgpOwogICAgICAgICAvLyBUaGUgbmF0aXZlIGNvZGUgZGVsZXRlcyB0aGUgbmF0aXZlIHJlc3BvbnNlIG9iamVjdC4KICAgICAgICAgbmF0aXZlUmVjZWl2ZWRSZXNwb25zZShuYXRpdmVSZXNwb25zZSk7CisgICAgICAgIG1TZXROYXRpdmVSZXNwb25zZSA9IHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTI3LDYgKzExMzQsOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjb21taXRMb2FkKCkgewogICAgICAgICBpZiAobUNhbmNlbGxlZCkgcmV0dXJuOworICAgICAgICBpZiAoIW1TZXROYXRpdmVSZXNwb25zZSkgeworICAgICAgICAgICAgc2V0TmF0aXZlUmVzcG9uc2UoKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChtSXNNYWluUGFnZUxvYWRlcikgewogICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBzQ2VydGlmaWNhdGVUeXBlTWFwLmdldChtTWltZVR5cGUpOwpAQCAtMTE5Nyw2ICsxMjA3LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1OYXRpdmVMb2FkZXIgIT0gMCkgewogICAgICAgICAgICAgUGVyZkNoZWNrZXIgY2hlY2tlciA9IG5ldyBQZXJmQ2hlY2tlcigpOworICAgICAgICAgICAgaWYgKCFtU2V0TmF0aXZlUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBuYXRpdmVGaW5pc2hlZCgpOwogICAgICAgICAgICAgY2hlY2tlci5yZXNwb25zZUFsZXJ0KCJyZXMgbmF0aXZlRmluaXNoZWQiKTsKICAgICAgICAgICAgIGNsZWFyTmF0aXZlTG9hZGVyKCk7CkBAIC0xMzEyLDYgKzEzMjYsOSBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbUNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcub3Blbl9wZXJtaXNzaW9uX2RlbnkpCiAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiIgKyByZWRpcmVjdFRvOworICAgICAgICAgICAgICAgIGlmICghbVNldE5hdGl2ZVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5hdGl2ZUFkZERhdGEodGV4dC5nZXRCeXRlcygpLCB0ZXh0Lmxlbmd0aCgpKTsKICAgICAgICAgICAgICAgICBuYXRpdmVGaW5pc2hlZCgpOwogICAgICAgICAgICAgICAgIGNsZWFyTmF0aXZlTG9hZGVyKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCmluZGV4IGMxYWMxODAuLmYwMDAwNWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCkBAIC0xNiwzNSArMTYsMjIgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAoraW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgbGliY29yZS5uZXQuTWltZVV0aWxzOwogCiAvKioKICAqIFR3by13YXkgbWFwIHRoYXQgbWFwcyBNSU1FLXR5cGVzIHRvIGZpbGUgZXh0ZW5zaW9ucyBhbmQgdmljZSB2ZXJzYS4KKyAqCisgKiA8cD5TZWUgYWxzbyB7QGxpbmsgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiNndWVzc0NvbnRlbnRUeXBlRnJvbU5hbWV9CisgKiBhbmQge0BsaW5rIGphdmEubmV0LlVSTENvbm5lY3Rpb24jZ3Vlc3NDb250ZW50VHlwZUZyb21TdHJlYW19LiBUaGlzCisgKiBjbGFzcyBhbmQge0Bjb2RlIFVSTENvbm5lY3Rpb259IHNoYXJlIHRoZSBzYW1lIE1JTUUtdHlwZSBkYXRhYmFzZS4KICAqLwogcHVibGljIGNsYXNzIE1pbWVUeXBlTWFwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNaW1lVHlwZU1hcCBzTWltZVR5cGVNYXAgPSBuZXcgTWltZVR5cGVNYXAoKTsKIAotICAgIC8qKgotICAgICAqIFNpbmdsZXRvbiBNSU1FLXR5cGUgbWFwIGluc3RhbmNlOgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1pbWVUeXBlTWFwIHNNaW1lVHlwZU1hcDsKLQotICAgIC8qKgotICAgICAqIE1JTUUtdHlwZSB0byBmaWxlIGV4dGVuc2lvbiBtYXBwaW5nOgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbU1pbWVUeXBlVG9FeHRlbnNpb25NYXA7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxlIGV4dGVuc2lvbiB0byBNSU1FIHR5cGUgbWFwcGluZzoKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBNSU1FLXR5cGUgbWFwLgotICAgICAqLwogICAgIHByaXZhdGUgTWltZVR5cGVNYXAoKSB7Ci0gICAgICAgIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NSw3ICs0Miw3IEBACiAgICAgICogQHJldHVybiBUaGUgZmlsZSBleHRlbnNpb24gb2YgdGhlIGdpdmVuIHVybC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uRnJvbVVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodXJsKSkgewogICAgICAgICAgICAgaW50IHF1ZXJ5ID0gdXJsLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgICAgICAgICBpZiAocXVlcnkgPiAwKSB7CiAgICAgICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCBxdWVyeSk7CkBAIC02Niw3ICs1Myw3IEBACiAKICAgICAgICAgICAgIC8vIGlmIHRoZSBmaWxlbmFtZSBjb250YWlucyBzcGVjaWFsIGNoYXJhY3RlcnMsIHdlIGRvbid0CiAgICAgICAgICAgICAvLyBjb25zaWRlciBpdCB2YWxpZCBmb3Igb3VyIG1hdGNoaW5nIHB1cnBvc2VzOgotICAgICAgICAgICAgaWYgKGZpbGVuYW1lLmxlbmd0aCgpID4gMCAmJgorICAgICAgICAgICAgaWYgKCFmaWxlbmFtZS5pc0VtcHR5KCkgJiYKICAgICAgICAgICAgICAgICBQYXR0ZXJuLm1hdGNoZXMoIlthLXpBLVpfMC05XFwuXFwtXFwoXFwpXFwlXSsiLCBmaWxlbmFtZSkpIHsKICAgICAgICAgICAgICAgICBpbnQgZG90UG9zID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKTsKICAgICAgICAgICAgICAgICBpZiAoMCA8PSBkb3RQb3MpIHsKQEAgLTc5LDM2ICs2NiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgYW4gZW50cnkgaW50byB0aGUgbWFwLiBUaGlzIGRvZXMgbm90IGNoZWNrIGlmIHRoZSBpdGVtIGFscmVhZHkKLSAgICAgKiBleGlzdHMsIGl0IHRydXN0cyB0aGUgY2FsbGVyIQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkRW50cnkoU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXhpc3RpbmcgeCAtLT4geSBtYXBwaW5nLCB3ZSBkbyBub3Qgd2FudCB0bwotICAgICAgICAvLyBvdmVycmlkZSBpdCB3aXRoIGFub3RoZXIgbWFwcGluZyB4IC0tPiA/Ci0gICAgICAgIC8vIHRoaXMgaXMgbW9zdGx5IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgbWltZS10eXBlIG1hcCBiZWxvdwotICAgICAgICAvLyBpcyBjb25zdHJ1Y3RlZCAoaWYgYSBtaW1lIHR5cGUgbWFwcyB0byBzZXZlcmFsIGV4dGVuc2lvbnMKLSAgICAgICAgLy8gdGhlIGZpcnN0IGV4dGVuc2lvbiBpcyBjb25zaWRlcmVkIHRoZSBtb3N0IHBvcHVsYXIgYW5kIGlzCi0gICAgICAgIC8vIGFkZGVkIGZpcnN0OyB3ZSBkbyBub3Qgd2FudCB0byBvdmVyd3JpdGUgaXQgbGF0ZXIpLgotICAgICAgICAvLwotICAgICAgICBpZiAoIW1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLmNvbnRhaW5zS2V5KG1pbWVUeXBlKSkgewotICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHRlbnNpb25NYXAucHV0KG1pbWVUeXBlLCBleHRlbnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV4dGVuc2lvblRvTWltZVR5cGVNYXAucHV0KGV4dGVuc2lvbiwgbWltZVR5cGUpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBNSU1FIHR5cGUgaGFzIGFuIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICogQHBhcmFtIG1pbWVUeXBlIEEgTUlNRSB0eXBlIChpLmUuIHRleHQvcGxhaW4pCiAgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGVyZSBpcyBhIG1pbWVUeXBlIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmIG1pbWVUeXBlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLmNvbnRhaW5zS2V5KG1pbWVUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5oYXNNaW1lVHlwZShtaW1lVHlwZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTcsMTYgKzgwLDEyIEBACiAgICAgICogQHJldHVybiBUaGUgTUlNRSB0eXBlIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIG9yIG51bGwgaWZmIHRoZXJlIGlzIG5vbmUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLmdldChleHRlbnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvLyBTdGF0aWMgbWV0aG9kIGNhbGxlZCBieSBqbmkuCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1pbWVUeXBlRnJvbUV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRTaW5nbGV0b24oKS5nZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5ndWVzc01pbWVUeXBlRnJvbUV4dGVuc2lvbihleHRlbnNpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM1LDEwICs5NCw3IEBACiAgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGVyZSBpcyBhbiBleHRlbnNpb24gZW50cnkgaW4gdGhlIG1hcC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLmNvbnRhaW5zS2V5KGV4dGVuc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmhhc0V4dGVuc2lvbihleHRlbnNpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ5LDExICsxMDUsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBmb3IgdGhlIGdpdmVuIE1JTUUgdHlwZSBvciBudWxsIGlmZiB0aGVyZSBpcyBub25lLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uRnJvbU1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiBtaW1lVHlwZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5nZXQobWltZVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NFeHRlbnNpb25Gcm9tTWltZVR5cGUobWltZVR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYxLDM2MyArMTEzLDYgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIE1JTUUtdHlwZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBNaW1lVHlwZU1hcCBnZXRTaW5nbGV0b24oKSB7Ci0gICAgICAgIGlmIChzTWltZVR5cGVNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgc01pbWVUeXBlTWFwID0gbmV3IE1pbWVUeXBlTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGFibGUgaXMgYmFzZWQgb24gL2V0Yy9taW1lLnR5cGVzIGRhdGEgbWludXMKLSAgICAgICAgICAgIC8vIGNoZW1pY2FsLyogTUlNRSB0eXBlcyBhbmQgTUlNRSB0eXBlcyB0aGF0IGRvbid0IG1hcCB0byBhbnkKLSAgICAgICAgICAgIC8vIGZpbGUgZXh0ZW5zaW9ucy4gV2UgYWxzbyBleGNsdWRlIHRvcC1sZXZlbCBkb21haW4gbmFtZXMgdG8KLSAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBjYXNlcyBsaWtlOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIG1haWwuZ29vZ2xlLmNvbS9hL2dvb2dsZS5jb20KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBhbmQgImFjdGl2ZSIgTUlNRSB0eXBlcyAoZHVlIHRvIHBvdGVudGlhbCBzZWN1cml0eSBpc3N1ZXMpLgotCi0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXQiLCAiZXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL2RzcHR5cGUiLCAidHNwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2giLCAic3BsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9odGEiLCAiaHRhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAiLCAiaHF4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHBybyIsICJjcHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhIiwgIm5iIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc2FjY2VzcyIsICJtZGIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL29kYSIsICJvZGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL29nZyIsICJvZ2ciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BkZiIsICJwZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BncC1rZXlzIiwgImtleSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZSIsICJwZ3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BpY3MtcnVsZXMiLCAicHJmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9yYXIiLCAicmFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9yZGYreG1sIiwgInJkZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcnNzK3htbCIsICJyc3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ppcCIsICJ6aXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSIsIAotICAgICAgICAgICAgICAgICAgICAiYXBrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuY2luZGVyZWxsYSIsICJjZHkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc3RsIiwgInN0bCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZGF0YWJhc2UiLCAib2RiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIiwgIm9kZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MiLCAib2RnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcy10ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJvdGciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIiwgIm9kaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQiLCAib2RzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJvdHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLCAib2R0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciIsICJvZG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGUiLCAib3R0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiIsICJvdGgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21zd29yZCIsICJkb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21zd29yZCIsICJkb3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCIsCi0gICAgICAgICAgICAgICAgICAgICJkb2N4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwudGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAiZG90eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiwgInhscyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiwgInhsdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IiwKLSAgICAgICAgICAgICAgICAgICAgInhsc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJ4bHR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCIsICJwcHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IiwgInBvdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCAicHBzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICJwcHR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgInBvdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93IiwKLSAgICAgICAgICAgICAgICAgICAgInBwc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5yaW0uY29kIiwgImNvZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnNtYWYiLCAibW1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGMiLCAic2RjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmRyYXciLCAic2RhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5pbXByZXNzIiwgInNkZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyIsICJzZHAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ubWF0aCIsICJzbWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInNkdyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXIiLAotICAgICAgICAgICAgICAgICAgICAidm9yIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsIiwgInNnbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYyIsICJzeGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjLnRlbXBsYXRlIiwgInN0YyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdyIsICJzeGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3LnRlbXBsYXRlIiwgInN0ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcyIsICJzeGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzLnRlbXBsYXRlIiwgInN0aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwubWF0aCIsICJzeG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciIsICJzeHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIuZ2xvYmFsIiwgInN4ZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci50ZW1wbGF0ZSIsICJzdHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC52aXNpbyIsICJ2c2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYWJpd29yZCIsICJhYnciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYXBwbGUtZGlza2ltYWdlIiwgImRtZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1iY3BpbyIsICJiY3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1iaXR0b3JyZW50IiwgInRvcnJlbnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY2RmIiwgImNkZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1jZGxpbmsiLCAidmNkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNoZXNzLXBnbiIsICJwZ24iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY3BpbyIsICJjcGlvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRlYmlhbi1wYWNrYWdlIiwgImRlYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kZWJpYW4tcGFja2FnZSIsICJ1ZGViIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIiwgImRjciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kaXJlY3RvciIsICJkaXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGlyZWN0b3IiLCAiZHhyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRtcyIsICJkbXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZG9vbSIsICJ3YWQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZHZpIiwgImR2aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mbGFjIiwgImZsYWMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwZmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwZmIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJnc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwY2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwY2YuWiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mcmVlbWluZCIsICJtbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2giLCAic3BsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdudW1lcmljIiwgImdudW1lcmljIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdvLXNnZiIsICJzZ2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZ3JhcGhpbmctY2FsY3VsYXRvciIsICJnY2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZ3RhciIsICJndGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAidGd6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAidGF6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWhkZiIsICJoZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaWNhIiwgImljYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pbnRlcm5ldC1zaWdudXAiLCAiaW5zIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWludGVybmV0LXNpZ251cCIsICJpc3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaXBob25lIiwgImlpaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pc285NjYwLWltYWdlIiwgImlzbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1qbW9sIiwgImpteiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rY2hhcnQiLCAiY2hydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1raWxsdXN0cmF0b3IiLCAia2lsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2twIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2tkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2t0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2ttIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtwcmVzZW50ZXIiLCAia3ByIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtwcmVzZW50ZXIiLCAia3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtzcHJlYWQiLCAia3NwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWt3b3JkIiwgImt3ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rd29yZCIsICJrd3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbGF0ZXgiLCAibGF0ZXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbGhhIiwgImxoYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1semgiLCAibHpoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWx6eCIsICJsengiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWFrZXIiLCAiZnJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgIm1ha2VyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZyYW1lIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImJvb2siKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWFrZXIiLCAiZmJkb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWlmIiwgIm1pZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tcy13bWQiLCAid21kIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1zLXdteiIsICJ3bXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbXNpIiwgIm1zaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ucy1wcm94eS1hdXRvY29uZmlnIiwgInBhYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ud2MiLCAibndjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW9iamVjdCIsICJvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW96LWFwcGxpY2F0aW9uIiwgIm96YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzMTIiLCAicDEyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRyZXFyZXNwIiwgInA3ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzNy1jcmwiLCAiY3JsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXF1aWNrdGltZXBsYXllciIsICJxdGwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc2hhciIsICJzaGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIsICJzd2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc3R1ZmZpdCIsICJzaXQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc3Y0Y3BpbyIsICJzdjRjcGlvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN2NGNyYyIsICJzdjRjcmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGFyIiwgInRhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10ZXhpbmZvIiwgInRleGluZm8iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGV4aW5mbyIsICJ0ZXhpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRyb2ZmIiwgInQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdHJvZmYiLCAicm9mZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10cm9mZi1tYW4iLCAibWFuIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXVzdGFyIiwgInVzdGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlIiwgInNyYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13aW5neiIsICJ3eiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13ZWJhcmNoaXZlIiwgIndlYmFyY2hpdmUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0IiwgImNydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCIsICJjcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteGNmIiwgInhjZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14ZmlnIiwgImZpZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veGh0bWwreG1sIiwgInhodG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby8zZ3BwIiwgIjNncHAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL2FtciIsICJhbXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL2Jhc2ljIiwgInNuZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbWlkaSIsICJtaWQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAibWlkaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbWlkaSIsICJrYXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAieG1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tb2JpbGUteG1mIiwgIm14bWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXBnYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtcGVnYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtcDIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXAzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm00YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZ3VybCIsICJtM3UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3Bycy5zaWQiLCAic2lkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWFpZmYiLCAiYWlmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWFpZmYiLCAiYWlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtZ3NtIiwgImdzbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcGVndXJsIiwgIm0zdSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcy13bWEiLCAid21hIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LW1zLXdheCIsICJ3YXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIiwgInJhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXBuLXJlYWxhdWRpbyIsICJybSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1wbi1yZWFsYXVkaW8iLCAicmFtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXJlYWxhdWRpbyIsICJyYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1zY3BscyIsICJwbHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtc2QyIiwgInNkMiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC13YXYiLCAid2F2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9ibXAiLCAiYm1wIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9naWYiLCAiZ2lmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pY28iLCAiY3VyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pY28iLCAiaWNvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pZWYiLCAiaWVmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL2pwZWciLCAianBnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvcGN4IiwgInBjeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvcG5nIiwgInBuZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvc3ZnK3htbCIsICJzdmciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3N2Zyt4bWwiLCAic3ZneiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvdGlmZiIsICJ0aWZmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS90aWZmIiwgInRpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLmRqdnUiLCAiZGp2dSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLmRqdnUiLCAiZGp2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS92bmQud2FwLndibXAiLCAid2JtcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jbXUtcmFzdGVyIiwgInJhcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXciLCAiY2RyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWNvcmVsZHJhd3BhdHRlcm4iLCAicGF0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWNvcmVsZHJhd3RlbXBsYXRlIiwgImNkdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbHBob3RvcGFpbnQiLCAiY3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWljb24iLCAiaWNvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWpnIiwgImFydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1qbmciLCAiam5nIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LW1zLWJtcCIsICJibXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcGhvdG9zaG9wIiwgInBzZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLCAicG5tIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcCIsICJwYm0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCIsICJwZ20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtcGl4bWFwIiwgInBwbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1yZ2IiLCAicmdiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXhiaXRtYXAiLCAieGJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXhwaXhtYXAiLCAieHBtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXh3aW5kb3dkdW1wIiwgInh3ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvaWdlcyIsICJpZ3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL2lnZXMiLCAiaWdlcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvbWVzaCIsICJtc2giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAibWVzaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvbWVzaCIsICJzaWxvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NhbGVuZGFyIiwgImljcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9jYWxlbmRhciIsICJpY3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY29tbWEtc2VwYXJhdGVkLXZhbHVlcyIsICJjc3YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY3NzIiwgImNzcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9odG1sIiwgImh0bSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9odG1sIiwgImh0bWwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaDMyMyIsICIzMjMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaXVscyIsICJ1bHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvbWF0aG1sIiwgIm1tbCIpOwotICAgICAgICAgICAgLy8gYWRkIGl0IGZpcnN0IHNvIGl0IHdpbGwgYmUgdGhlIGRlZmF1bHQgZm9yIEV4dGVuc2lvbkZyb21NaW1lVHlwZQotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJ0eHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAiYXNjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgInRleHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAiZGlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJwbyIpOyAgICAgLy8gcmVzZXJ2ZSAicG90IiBmb3Igdm5kLm1zLXBvd2VycG9pbnQKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcmljaHRleHQiLCAicnR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3J0ZiIsICJydGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGV4bWFjcyIsICJ0cyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC90ZXh0IiwgInBocHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLCAidHN2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3htbCIsICJ4bWwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1iaWJ0ZXgiLCAiYmliIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYm9vIiwgImJvbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoKysiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaHBwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysraGRyIiwgImh4eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK3NyYyIsICJjKysiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytzcmMiLCAiY3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysrc3JjIiwgImN4eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNoZHIiLCAiaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNvbXBvbmVudCIsICJodGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jc2giLCAiY3NoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtY3NyYyIsICJjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtZHNyYyIsICJkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtaGFza2VsbCIsICJocyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWphdmEiLCAiamF2YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWxpdGVyYXRlLWhhc2tlbGwiLCAibGhzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtbW9jIiwgIm1vYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBhc2NhbCIsICJwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtcGFzY2FsIiwgInBhcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBjcy1nY2QiLCAiZ2NkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtc2V0ZXh0IiwgImV0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRjbCIsICJ0Y2wiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAidGV4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgImx0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRleCIsICJzdHkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAiY2xzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdmNhbGVuZGFyIiwgInZjcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXZjYXJkIiwgInZjZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZ3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby8zZ3BwIiwgIjNncCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZzIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL2RsIiwgImRsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kdiIsICJkaWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL2R2IiwgImR2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9mbGkiLCAiZmxpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tNHYiLCAibTR2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wZWciLCAibXBnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXA0IiwgIm1wNCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJWT0IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3F1aWNrdGltZSIsICJxdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vcXVpY2t0aW1lIiwgIm1vdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vdm5kLm1wZWd1cmwiLCAibXh1Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LWxhLWFzZiIsICJsc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbGEtYXNmIiwgImxzeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tbmciLCAibW5nIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLWFzZiIsICJhc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtYXNmIiwgImFzeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bSIsICJ3bSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bXYiLCAid212Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLXdteCIsICJ3bXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd3Z4IiwgInd2eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tc3ZpZGVvIiwgImF2aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1zZ2ktbW92aWUiLCAibW92aWUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIngtY29uZmVyZW5jZS94LWNvb2x0YWxrIiwgImljZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgieC1lcG9jL3gtc2lzeC1hcHAiLCAic2lzeCIpOwotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHNNaW1lVHlwZU1hcDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YQppbmRleCA1OThmMjBkLi41OWJlYzI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9OZXR3b3JrLmphdmEKQEAgLTE2LDcgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC4qOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNzQsNyArNzksMjAgQEAKICAgICAgKiBIVFRQIGF1dGhlbnRpY2F0aW9uIGhhbmRsZXI6IHRha2VzIGNhcmUgb2Ygc3luY2hyb25pemF0aW9uIG9mIEhUVFAKICAgICAgKiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cy4KICAgICAgKi8KLSAgICBwcml2YXRlIEh0dHBBdXRoSGFuZGxlciBtSHR0cEF1dGhIYW5kbGVyOworICAgIHByaXZhdGUgSHR0cEF1dGhIYW5kbGVySW1wbCBtSHR0cEF1dGhIYW5kbGVyOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgY3VycmVudGx5IHVzZWQgbmV0d29yayBjb25uZWN0aW9uIGlzIGEgcm9hbWluZyBwaG9uZQorICAgICAqIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Sb2FtaW5nOworCisgICAgLyoqCisgICAgICogVHJhY2tzIGlmIHdlIGFyZSByb2FtaW5nLgorICAgICAqLworICAgIHByaXZhdGUgUm9hbWluZ01vbml0b3IgbVJvYW1pbmdNb25pdG9yOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBuZXR3b3JrLgpAQCAtMTA3LDYgKzEyNSw3IEBACiAgICAgICAgIGlmICgrK3NQbGF0Zm9ybU5vdGlmaWNhdGlvbkVuYWJsZVJlZkNvdW50ID09IDEpIHsKICAgICAgICAgICAgIGlmIChzTmV0d29yayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc05ldHdvcmsubVJlcXVlc3RRdWV1ZS5lbmFibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBzTmV0d29yay5tb25pdG9yUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTEyMSw2ICsxNDAsNyBAQAogICAgICAgICBpZiAoLS1zUGxhdGZvcm1Ob3RpZmljYXRpb25FbmFibGVSZWZDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoc05ldHdvcmsgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNOZXR3b3JrLm1SZXF1ZXN0UXVldWUuZGlzYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgICAgIHNOZXR3b3JrLnN0b3BNb25pdG9yaW5nUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xMzYsMTIgKzE1NiwzOSBAQAogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS4KICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLmVxdWFscyhXZWJWaWV3Q29yZS5USFJFQURfTkFNRSkpOwogICAgICAgICB9CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVNzbEVycm9ySGFuZGxlciA9IG5ldyBTc2xFcnJvckhhbmRsZXIoKTsKLSAgICAgICAgbUh0dHBBdXRoSGFuZGxlciA9IG5ldyBIdHRwQXV0aEhhbmRsZXIodGhpcyk7CisgICAgICAgIG1IdHRwQXV0aEhhbmRsZXIgPSBuZXcgSHR0cEF1dGhIYW5kbGVySW1wbCh0aGlzKTsKIAogICAgICAgICBtUmVxdWVzdFF1ZXVlID0gbmV3IFJlcXVlc3RRdWV1ZShjb250ZXh0KTsKICAgICB9CiAKKyAgICBwcml2YXRlIGNsYXNzIFJvYW1pbmdNb25pdG9yIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgaWYgKCFDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04uZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gKE5ldHdvcmtJbmZvKWludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8pOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtUm9hbWluZyA9IGluZm8uaXNSb2FtaW5nKCk7CisgICAgICAgIH07CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBtb25pdG9yUm9hbWluZygpIHsKKyAgICAgICAgbVJvYW1pbmdNb25pdG9yID0gbmV3IFJvYW1pbmdNb25pdG9yKCk7CisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQ29ubmVjdGl2aXR5TWFuYWdlci5DT05ORUNUSVZJVFlfQUNUSU9OKTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihzTmV0d29yay5tUm9hbWluZ01vbml0b3IsIGZpbHRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BNb25pdG9yaW5nUm9hbWluZygpIHsKKyAgICAgICAgaWYgKG1Sb2FtaW5nTW9uaXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJvYW1pbmdNb25pdG9yKTsKKyAgICAgICAgICAgIG1Sb2FtaW5nTW9uaXRvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IGEgdXJsIGZyb20gZWl0aGVyIHRoZSBuZXR3b3JrIG9yIHRoZSBmaWxlIHN5c3RlbS4KICAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdG8gbG9hZC4KQEAgLTE3MCw2ICsyMTcsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmVmZXRjaCwgYWJvcnQgaXQgaWYgd2UncmUgcm9hbWluZy4KKyAgICAgICAgaWYgKG1Sb2FtaW5nICYmIGhlYWRlcnMuY29udGFpbnNLZXkoIlgtTW96IikgJiYgInByZWZldGNoIi5lcXVhbHMoaGVhZGVycy5nZXQoIlgtTW96IikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICAvKiBGSVhNRTogdGhpcyBpcyBsYW1lLiAgUGFzcyBhbiBJbnB1dFN0cmVhbSBpbiwgcmF0aGVyIHRoYW4KICAgICAgICAgICAgbWFraW5nIHRoaXMgbGFtZSBvbmUgaGVyZSAqLwogICAgICAgICBJbnB1dFN0cmVhbSBib2R5UHJvdmlkZXIgPSBudWxsOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbk1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5NYW5hZ2VyLmphdmEKaW5kZXggZTVlZWI4Yy4uYWIzYjZkNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbk1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luTWFuYWdlci5qYXZhCkBAIC0xNTksNDEgKzE1OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgPSBQTFVHSU5fU1lTVEVNX0xJQiArIHBrZ0luZm8ucGFja2FnZU5hbWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBlcm1pc3Npb25zW10gPSBwa2dJbmZvLnJlcXVlc3RlZFBlcm1pc3Npb25zOwotICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIGFuZAorICAgICAgICAgICAgICAgIC8vIHNpZ25hdHVyZXMKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMocGtnSW5mbykpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gcGVybWlzc2lvbk9rID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGVybWl0IDogcGVybWlzc2lvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBMVUdJTl9QRVJNSVNTSU9OLmVxdWFscyhwZXJtaXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uT2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9uT2spIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gZW5zdXJlIHRoZSBwbHVnaW4gaXMgcHJvcGVybHkgc2lnbmVkCi0gICAgICAgICAgICAgICAgU2lnbmF0dXJlIHNpZ25hdHVyZXNbXSA9IHBrZ0luZm8uc2lnbmF0dXJlczsKLSAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJyby5zZWN1cmUiLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaWduYXR1cmVNYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFNpZ25hdHVyZSBzaWduYXR1cmUgOiBzaWduYXR1cmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJR05BVFVSRVMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU0lHTkFUVVJFU1tpXS5lcXVhbHMoc2lnbmF0dXJlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZU1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSB0aGUgdHlwZSBvZiBwbHVnaW4gZnJvbSB0aGUgbWFuaWZlc3QKICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUluZm8ubWV0YURhdGEgPT0gbnVsbCkgewpAQCAtMjM2LDYgKzIwNiw2NCBAQAogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8KKyAgICBib29sZWFuIGNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMoU3RyaW5nIHBsdWdpbkFQS05hbWUpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworCisgICAgICAgIC8vIHJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBsdWdpbidzIG1hbmlmZXN0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYWNrYWdlSW5mbyBwa2dJbmZvID0gcG0uZ2V0UGFja2FnZUluZm8ocGx1Z2luQVBLTmFtZSwgUGFja2FnZU1hbmFnZXIuR0VUX1BFUk1JU1NJT05TCisgICAgICAgICAgICAgICAgICAgIHwgUGFja2FnZU1hbmFnZXIuR0VUX1NJR05BVFVSRVMpOworICAgICAgICAgICAgaWYgKHBrZ0luZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKHBrZ0luZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiQ2FuJ3QgZmluZCBwbHVnaW46ICIgKyBwbHVnaW5BUEtOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKFBhY2thZ2VJbmZvIHBrZ0luZm8pIHsKKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGx1Z2luIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMKKyAgICAgICAgU3RyaW5nIHBlcm1pc3Npb25zW10gPSBwa2dJbmZvLnJlcXVlc3RlZFBlcm1pc3Npb25zOworICAgICAgICBpZiAocGVybWlzc2lvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gcGVybWlzc2lvbk9rID0gZmFsc2U7CisgICAgICAgIGZvciAoU3RyaW5nIHBlcm1pdCA6IHBlcm1pc3Npb25zKSB7CisgICAgICAgICAgICBpZiAoUExVR0lOX1BFUk1JU1NJT04uZXF1YWxzKHBlcm1pdCkpIHsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uT2sgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghcGVybWlzc2lvbk9rKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0byBlbnN1cmUgdGhlIHBsdWdpbiBpcyBwcm9wZXJseSBzaWduZWQKKyAgICAgICAgU2lnbmF0dXJlIHNpZ25hdHVyZXNbXSA9IHBrZ0luZm8uc2lnbmF0dXJlczsKKyAgICAgICAgaWYgKHNpZ25hdHVyZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInJvLnNlY3VyZSIsIGZhbHNlKSkgeworICAgICAgICAgICAgYm9vbGVhbiBzaWduYXR1cmVNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChTaWduYXR1cmUgc2lnbmF0dXJlIDogc2lnbmF0dXJlcykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0lHTkFUVVJFUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoU0lHTkFUVVJFU1tpXS5lcXVhbHMoc2lnbmF0dXJlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZU1hdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLwogICAgIFN0cmluZyBnZXRQbHVnaW5zQVBLTmFtZShTdHJpbmcgcGx1Z2luTGliKSB7CiAKICAgICAgICAgLy8gYmFzaWMgZXJyb3IgY2hlY2tpbmcgb24gaW5wdXQgcGFyYW1zCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvU2VsZWN0QWN0aW9uTW9kZUNhbGxiYWNrLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvU2VsZWN0QWN0aW9uTW9kZUNhbGxiYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5MTkwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9TZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworY2xhc3MgU2VsZWN0QWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OworICAgIHByaXZhdGUgVmlldyBtVGl0bGVCYXI7CisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlIG1BY3Rpb25Nb2RlOworCisgICAgdm9pZCBzZXRXZWJWaWV3KFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgdm9pZCBzZXRUaXRsZUJhcihWaWV3IHYpIHsgbVRpdGxlQmFyID0gdjsgfQorCisgICAgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgIH0KKworICAgIC8vIEFjdGlvbk1vZGUuQ2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICBtb2RlLmdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5tZW51LndlYnZpZXdfY29weSwKKyAgICAgICAgICAgICAgICBtZW51KTsKKyAgICAgICAgbW9kZS5zZXRUaXRsZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy50ZXh0U2VsZWN0aW9uQ0FCVGl0bGUpOworICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3dpdGNoKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgYW5kcm9pZC5SLmlkLmNvcHk6CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuY29weVNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5zaGFyZToKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gbVdlYlZpZXcuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgQnJvd3Nlci5zZW5kU3RyaW5nKG1XZWJWaWV3LmdldENvbnRleHQoKSwgc2VsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuc2VsZWN0X2FsbDoKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zZWxlY3RBbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmZpbmQ6CisgICAgICAgICAgICAgICAgU3RyaW5nIHNlbD0gbVdlYlZpZXcuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zaG93RmluZERpYWxvZyhzZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSkgeworICAgICAgICBpZiAobVRpdGxlQmFyICE9IG51bGwpIG1XZWJWaWV3LnNldEVtYmVkZGVkVGl0bGVCYXIobVRpdGxlQmFyKTsKKyAgICAgICAgbVdlYlZpZXcuc2VsZWN0aW9uRG9uZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9VUkxVdGlsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvVVJMVXRpbC5qYXZhCmluZGV4IDdjNWYyYjAuLmMxMzE5ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9VUkxVdGlsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1VSTFV0aWwuamF2YQpAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICBTdHJpbmcgcmV0VmFsID0gaW5Vcmw7CiAgICAgICAgIFdlYkFkZHJlc3Mgd2ViQWRkcmVzczsKIAotICAgICAgICBMb2cudihMT0dUQUcsICJndWVzc1VSTCBiZWZvcmUgcXVldWVSZXF1ZXN0OiAiICsgaW5VcmwpOworICAgICAgICBpZiAoRGVidWdGbGFncy5VUkxfVVRJTCkgTG9nLnYoTE9HVEFHLCAiZ3Vlc3NVUkwgYmVmb3JlIHF1ZXVlUmVxdWVzdDogIiArIGluVXJsKTsKIAogICAgICAgICBpZiAoaW5VcmwubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIGluVXJsOwogICAgICAgICBpZiAoaW5Vcmwuc3RhcnRzV2l0aCgiYWJvdXQ6IikpIHJldHVybiBpblVybDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQppbmRleCA5ZjY0MmMwLi5iMmJhN2UyMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQpAQCAtMzE0LDI4ICszMTQsMjAgQEAKICAgICAvKioKICAgICAgKiBUZWxsIHRoZSBjbGllbnQgdG8gb3BlbiBhIGZpbGUgY2hvb3Nlci4KICAgICAgKiBAcGFyYW0gdXBsb2FkRmlsZSBBIFZhbHVlQ2FsbGJhY2sgdG8gc2V0IHRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdXBsb2FkLgotICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLgorICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLmEKKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgdGFnCisgICAgICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSkgeworICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSwgU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgdXBsb2FkRmlsZS5vblJlY2VpdmVWYWx1ZShudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIGluaXRpYXRlZC4KKyAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgcGFnZSBiZWluZyB2aWV3ZWQgaXMgd2ViIGFwcCBjYXBhYmxlLAorICAgICAqIGkuZS4gaGFzIHNwZWNpZmllZCB0aGUgZnVsbHNjcmVlbi13ZWItYXBwLWNhcGFibGUgbWV0YSB0YWcuCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblNlbGVjdGlvblN0YXJ0KFdlYlZpZXcgdmlldykgewotICAgICAgICAvLyBCeSBkZWZhdWx0IHdlIGNhbmNlbCB0aGUgc2VsZWN0aW9uIGFnYWluLCB0aHVzIGRpc2FibGluZwotICAgICAgICAvLyB0ZXh0IHNlbGVjdGlvbiB1bmxlc3MgdGhlIGNocm9tZSBjbGllbnQgc3VwcG9ydHMgaXQuCi0gICAgICAgIHZpZXcubm90aWZ5U2VsZWN0RGlhbG9nRGlzbWlzc2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbCB0aGUgY2xpZW50IHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgYmVlbiBjb3BpZWQgb3IgY2FuY2VsZWQuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblNlbGVjdGlvbkRvbmUoV2ViVmlldyB2aWV3KSB7Ci0gICAgfQorICAgIHB1YmxpYyB2b2lkIHNldEluc3RhbGxhYmxlV2ViQXBwKCkgeyB9CiAKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJIaXN0b3J5SXRlbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEKaW5kZXggNDI4YTU5Yy4uN2MwZTQ3OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEKQEAgLTE4LDYgKzE4LDkgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKwogLyoqCiAgKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciBhY2Nlc3NpbmcgZmllbGRzIGluIGFuIGVudHJ5IGluIHRoZSBiYWNrL2ZvcndhcmQgbGlzdAogICogb2YgYSBXZWJWaWV3LiBFYWNoIFdlYkhpc3RvcnlJdGVtIGlzIGEgc25hcHNob3Qgb2YgdGhlIHJlcXVlc3RlZCBoaXN0b3J5CkBAIC0zOSw4ICs0MiwxMiBAQAogICAgIHByaXZhdGUgQml0bWFwIG1GYXZpY29uOwogICAgIC8vIFRoZSBwcmUtZmxhdHRlbmVkIGRhdGEgdXNlZCBmb3Igc2F2aW5nIHRoZSBzdGF0ZS4KICAgICBwcml2YXRlIGJ5dGVbXSBtRmxhdHRlbmVkRGF0YTsKLSAgICAvLyBUaGUgYXBwbGUtdG91Y2gtaWNvbiB1cmwgZm9yIHVzZSB3aGVuIGFkZGluZyB0aGUgc2l0ZSB0byB0aGUgaG9tZSBzY3JlZW4KLSAgICBwcml2YXRlIFN0cmluZyBtVG91Y2hJY29uVXJsOworICAgIC8vIFRoZSBhcHBsZS10b3VjaC1pY29uIHVybCBmb3IgdXNlIHdoZW4gYWRkaW5nIHRoZSBzaXRlIHRvIHRoZSBob21lIHNjcmVlbiwKKyAgICAvLyBhcyBvYnRhaW5lZCBmcm9tIGEgPGxpbms+IGVsZW1lbnQgaW4gdGhlIHBhZ2UuCisgICAgcHJpdmF0ZSBTdHJpbmcgbVRvdWNoSWNvblVybEZyb21MaW5rOworICAgIC8vIElmIG5vIDxsaW5rPiBpcyBzcGVjaWZpZWQsIHRoaXMgaG9sZHMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlCisgICAgLy8gYXBwbGUtdG91Y2gtaWNvbi4KKyAgICBwcml2YXRlIFN0cmluZyBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdDsKICAgICAvLyBDdXN0b20gY2xpZW50IGRhdGEgdGhhdCBpcyBub3QgZmxhdHRlbmVkIG9yIHJlYWQgYnkgbmF0aXZlIGNvZGUuCiAgICAgcHJpdmF0ZSBPYmplY3QgbUN1c3RvbURhdGE7CiAKQEAgLTEzMiwxMCArMTM5LDI4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHRvdWNoIGljb24gdXJsLgorICAgICAqIElmIG5vIHRvdWNoIGljb24gPGxpbms+IHRhZyB3YXMgc3BlY2lmaWVkLCByZXR1cm5zCisgICAgICogPGhvc3Q+L2FwcGxlLXRvdWNoLWljb24ucG5nLiBUaGUgRG93bmxvYWRUb3VjaEljb24gY2xhc3MgdGhhdAorICAgICAqIGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSB0b3VjaCBpY29uIHdpbGwgaGFuZGxlIHRoZSBjYXNlIHdoZXJlCisgICAgICogdGhhdCBmaWxlIGRvZXMgbm90IGV4aXN0LiBBbiBpY29uIHNldCBieSBhIDxsaW5rPiB0YWcgaXMgYWx3YXlzCisgICAgICogdXNlZCBpbiBwcmVmZXJlbmNlIHRvIGFuIGljb24gc2F2ZWQgb24gdGhlIHNlcnZlci4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG91Y2hJY29uVXJsKCkgewotICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybDsKKyAgICAgICAgaWYgKG1Ub3VjaEljb25VcmxGcm9tTGluayAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybEZyb21MaW5rOworICAgICAgICB9IGVsc2UgaWYgKG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChtT3JpZ2luYWxVcmwpOworICAgICAgICAgICAgbVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLAorICAgICAgICAgICAgICAgICAgICAiL2FwcGxlLXRvdWNoLWljb24ucG5nIikudG9TdHJpbmcoKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MSwxMSArMTk2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSB0b3VjaCBpY29uIHVybC4KKyAgICAgKiBTZXQgdGhlIHRvdWNoIGljb24gdXJsLiBXaWxsIG5vdCBvdmVyd3JpdGUgYW4gaWNvbiB0aGF0IGhhcyBiZWVuCisgICAgICogc2V0IGFscmVhZHkgZnJvbSBhIDxsaW5rPiB0YWcsIHVubGVzcyB0aGUgbmV3IGljb24gaXMgcHJlY29tcG9zZWQuCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICAvKnBhY2thZ2UqLyB2b2lkIHNldFRvdWNoSWNvblVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIG1Ub3VjaEljb25VcmwgPSB1cmw7CisgICAgLypwYWNrYWdlKi8gdm9pZCBzZXRUb3VjaEljb25VcmwoU3RyaW5nIHVybCwgYm9vbGVhbiBwcmVjb21wb3NlZCkgeworICAgICAgICBpZiAocHJlY29tcG9zZWQgfHwgbVRvdWNoSWNvblVybEZyb21MaW5rID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Ub3VjaEljb25VcmxGcm9tTGluayA9IHVybDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YQppbmRleCBkYTBjNjFiLi43YjlhZjViIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YQpAQCAtMTksMTEgKzE5LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKLWltcG9ydCBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb247CisKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKQEAgLTEwNyw3ICsxMDksNyBAQAogICAgICAqIFVzZSB3aXRoIHtAbGluayAjc2V0Q2FjaGVNb2RlfS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX05PX0NBQ0hFID0gMjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIERvbid0IHVzZSB0aGUgbmV0d29yaywgbG9hZCBmcm9tIGNhY2hlIG9ubHkuCiAgICAgICogVXNlIHdpdGgge0BsaW5rICNzZXRDYWNoZU1vZGV9LgpAQCAtMTc2LDE0ICsxNzgsMjAgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtSmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Vc2VEb3VibGVUcmVlID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVVzZVdpZGVWaWV3cG9ydCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Vc2VGaXhlZFZpZXdwb3J0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgbU1heEZpeGVkVmlld3BvcnRXaWR0aCA9IFdlYlZpZXcuREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtU3VwcG9ydE11bHRpcGxlV2luZG93cyA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TaHJpbmtzU3RhbmRhbG9uZUltYWdlc1RvRml0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBsb25nICAgICAgICAgICAgbU1heGltdW1EZWNvZGVkSW1hZ2VTaXplID0gMDsgLy8gMCBtZWFucyBkZWZhdWx0CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVByaXZhdGVCcm93c2luZ0VuYWJsZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtU3ludGhldGljTGlua3NFbmFibGVkID0gdHJ1ZTsKICAgICAvLyBIVE1MNSBBUEkgZmxhZ3MKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtQXBwQ2FjaGVFbmFibGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbURhdGFiYXNlRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Eb21TdG9yYWdlRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Xb3JrZXJzRW5hYmxlZCA9IGZhbHNlOyAgLy8gb25seSBhZmZlY3RzIFY4LgogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1HZW9sb2NhdGlvbkVuYWJsZWQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1YU1NBdWRpdG9yRW5hYmxlZCA9IGZhbHNlOwogICAgIC8vIEhUTUw1IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgIHByaXZhdGUgbG9uZyAgICAgICAgICAgIG1BcHBDYWNoZU1heFNpemUgPSBMb25nLk1BWF9WQUxVRTsKICAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICBtQXBwQ2FjaGVQYXRoID0gIiI7CkBAIC0xOTksMTUgKzIwNywxNyBAQAogICAgIHByaXZhdGUgUmVuZGVyUHJpb3JpdHkgIG1SZW5kZXJQcmlvcml0eSA9IFJlbmRlclByaW9yaXR5Lk5PUk1BTDsKICAgICBwcml2YXRlIGludCAgICAgICAgICAgICBtT3ZlcnJpZGVDYWNoZU1vZGUgPSBMT0FEX0RFRkFVTFQ7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVNhdmVGb3JtRGF0YSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUF1dG9GaWxsRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TYXZlUGFzc3dvcmQgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1MaWdodFRvdWNoRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1OZWVkSW5pdGlhbEZvY3VzID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtTmF2RHVtcCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TdXBwb3J0Wm9vbSA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUJ1aWx0SW5ab29tQ29udHJvbHMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRGlzcGxheVpvb21Db250cm9scyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUFsbG93RmlsZUFjY2VzcyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUxvYWRXaXRoT3ZlcnZpZXdNb2RlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVVzZVdlYlZpZXdCYWNrZ3JvdW5kT3ZlcnNjcm9sbEJhY2tncm91bmQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uID0gZmFsc2U7CiAKICAgICAvLyBwcml2YXRlIFdlYlNldHRpbmdzLCBub3QgYWNjZXNzaWJsZSBieSB0aGUgaG9zdCBhY3Rpdml0eQogICAgIHN0YXRpYyBwcml2YXRlIGludCAgICAgIG1Eb3VibGVUYXBUb2FzdENvdW50ID0gMzsKQEAgLTI5NywxMyArMzA3LDEzIEBACiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgVTsgSW50ZWwgTWFjIE9TIFggMTBfNV83OyBlbi11cykiCiAgICAgICAgICAgICArICIgQXBwbGVXZWJLaXQvNTMwLjE3IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAiCiAgICAgICAgICAgICArICIgU2FmYXJpLzUzMC4xNyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQSE9ORV9VU0VSQUdFTlQgPSAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVBIT05FX1VTRVJBR0VOVCA9CiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKGlQaG9uZTsgVTsgQ1BVIGlQaG9uZSBPUyAzXzAgbGlrZSBNYWMgT1MgWDsgZW4tdXMpIgogICAgICAgICAgICAgKyAiIEFwcGxlV2ViS2l0LzUyOC4xOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIgogICAgICAgICAgICAgKyAiIE1vYmlsZS83QTM0MSBTYWZhcmkvNTI4LjE2IjsKICAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGUgc0xvY2FsZTsKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc0xvY2tGb3JMb2NhbGVTZXR0aW5nczsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFBhY2thZ2UgY29uc3RydWN0b3IgdG8gcHJldmVudCBjbGllbnRzIGZyb20gY3JlYXRpbmcgYSBuZXcgc2V0dGluZ3MKICAgICAgKiBpbnN0YW5jZS4KQEAgLTMxNSw2ICszMjUsMTQgQEAKICAgICAgICAgbURlZmF1bHRUZXh0RW5jb2RpbmcgPSBjb250ZXh0LmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZWZhdWx0X3RleHRfZW5jb2RpbmcpOwogCisgICAgICAgIC8vIERldGVjdCB0YWJsZXQgZGV2aWNlIGZvciBmaXhlZCB2aWV3cG9ydCBtb2RlLgorICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBmaW5hbCBpbnQgbGFuZHNjYXBlV2lkdGggPSBNYXRoLm1heChtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLmhlaWdodFBpeGVscyk7CisgICAgICAgIGZpbmFsIGludCBtaW5UYWJsZXRXaWR0aCA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5taW5feGxhcmdlX3NjcmVlbl93aWR0aCk7CisgICAgICAgIG1Vc2VGaXhlZFZpZXdwb3J0ID0gKG1ldHJpY3MuZGVuc2l0eSA9PSAxLjBmICYmIGxhbmRzY2FwZVdpZHRoID49IG1pblRhYmxldFdpZHRoKTsKKyAgICAgICAgbU1heEZpeGVkVmlld3BvcnRXaWR0aCA9IChpbnQpIChsYW5kc2NhcGVXaWR0aCAqIDEuMjUpOworCiAgICAgICAgIGlmIChzTG9ja0ZvckxvY2FsZVNldHRpbmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MgPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgICAgICBzTG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKQEAgLTMyOCw2ICszNDYsOCBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUgPSAiZW4tVVMiOworCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgcmV0dXJucyBjdXJyZW50IEFjY2VwdExhbmd1YWdlIFN0cmluZy4KICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgQWNjZXB0TGFuZ3VhZ2UgU3RyaW5nLgpAQCAtMzM3LDMyICszNTcsNTMgQEAKICAgICAgICAgc3luY2hyb25pemVkKHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MpIHsKICAgICAgICAgICAgIGxvY2FsZSA9IHNMb2NhbGU7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxhbmd1YWdlKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShidWZmZXIsIGxvY2FsZSk7CisKKyAgICAgICAgaWYgKCFMb2NhbGUuVVMuZXF1YWxzKGxvY2FsZSkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWxvY2FsZS5lcXVhbHMoTG9jYWxlLlVTKSkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5Mb2NhbGUgdXMgPSBMb2NhbGUuVVM7Ci0gICAgICAgICAgICBpZiAodXMuZ2V0TGFuZ3VhZ2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh1cy5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IHVzLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgb2Jzb2xldGUgbGFuZ3VhZ2UgY29kZXMsIGluY2x1ZGluZyBIZWJyZXcvSW5kb25lc2lhbi9ZaWRkaXNoLAorICAgICAqIHRvIG5ldyBzdGFuZGFyZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydE9ic29sZXRlTGFuZ3VhZ2VDb2RlVG9OZXcoU3RyaW5nIGxhbmdDb2RlKSB7CisgICAgICAgIGlmIChsYW5nQ29kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIml3Ii5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBIZWJyZXcKKyAgICAgICAgICAgIHJldHVybiAiaGUiOworICAgICAgICB9IGVsc2UgaWYgKCJpbiIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gSW5kb25lc2lhbgorICAgICAgICAgICAgcmV0dXJuICJpZCI7CisgICAgICAgIH0gZWxzZSBpZiAoImppIi5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBZaWRkaXNoCisgICAgICAgICAgICByZXR1cm4gInlpIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFuZ0NvZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxvY2FsZS5nZXRMYW5ndWFnZSgpKTsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxhbmd1YWdlKTsKKyAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKKyAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvdW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgbUNvbnRleHQgYW5kIHJldHVybnMgY3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgogICAgICAqIEByZXR1cm4gQ3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgpAQCAtMzgwLDExICs0MjEsMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gIjEuMCIKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjEuMCIpOwotICAgICAgICB9ICAKKyAgICAgICAgfQogICAgICAgICBidWZmZXIuYXBwZW5kKCI7ICIpOwogICAgICAgICBmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKICAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxhbmd1YWdlKSk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7CiAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLSIpOwpAQCAtNDA3LDExICs0NDgsMTMgQEAKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiBCdWlsZC8iKTsKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaWQpOwogICAgICAgICB9CisgICAgICAgIFN0cmluZyBtb2JpbGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0KAorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcud2ViX3VzZXJfYWdlbnRfdGFyZ2V0X2NvbnRlbnQpLnRvU3RyaW5nKCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dCgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy53ZWJfdXNlcl9hZ2VudCkudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoYmFzZSwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoYmFzZSwgYnVmZmVyLCBtb2JpbGUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEVuYWJsZXMgZHVtcGluZyB0aGUgcGFnZXMgbmF2aWdhdGlvbiBjYWNoZSB0byBhIHRleHQgZmlsZS4KICAgICAgKi8KQEAgLTQyNyw2ICs0NzAsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJZiBXZWJWaWV3IG9ubHkgc3VwcG9ydHMgdG91Y2gsIGEgZGlmZmVyZW50IG5hdmlnYXRpb24gbW9kZWwgd2lsbCBiZQorICAgICAqIGFwcGxpZWQuIE90aGVyd2lzZSwgdGhlIG5hdmlnYXRpb24gdG8gc3VwcG9ydCBib3RoIHRvdWNoIGFuZCBrZXlib2FyZAorICAgICAqIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAaGlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRUb3VjaE9ubHkoYm9vbGVhbiB0b3VjaE9ubHkpIHsKKyAgICAgICAgbVN1cHBvcnRUb3VuY2hPbmx5ID0gdG91Y2hPbmx5OworICAgIH0KKyAgICAgKi8KKworICAgIGJvb2xlYW4gc3VwcG9ydFRvdWNoT25seSgpIHsKKyAgICAgICAgLy8gZm9yIGRlYnVnIG9ubHksIHVzZSBtTGlnaHRUb3VjaEVuYWJsZWQgZm9yIG1TdXBwb3J0VG91bmNoT25seQorICAgICAgICByZXR1cm4gbUxpZ2h0VG91Y2hFbmFibGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB3aGV0aGVyIHRoZSBXZWJWaWV3IHN1cHBvcnRzIHpvb20KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0Wm9vbShib29sZWFuIHN1cHBvcnQpIHsKQEAgLTQ0OCwxNCArNTA2LDM0IEBACiAgICAgICAgIG1CdWlsdEluWm9vbUNvbnRyb2xzID0gZW5hYmxlZDsKICAgICAgICAgbVdlYlZpZXcudXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQobUNvbnRleHQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgem9vbSBtZWNoYW5pc20gYnVpbHQgaW50byBXZWJWaWV3IGlzIGJlaW5nIHVzZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0QnVpbHRJblpvb21Db250cm9scygpIHsKICAgICAgICAgcmV0dXJuIG1CdWlsdEluWm9vbUNvbnRyb2xzOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgb24gc2NyZWVuIHpvb20gYnV0dG9ucyBhcmUgdXNlZC4KKyAgICAgKiBBIGNvbWJpbmF0aW9uIG9mIGJ1aWx0IGluIHpvb20gY29udHJvbHMgZW5hYmxlZAorICAgICAqIGFuZCBvbiBzY3JlZW4gem9vbSBjb250cm9scyBkaXNhYmxlZCBhbGxvd3MgZm9yIHBpbmNoIHRvIHpvb20KKyAgICAgKiB0byB3b3JrIHdpdGhvdXQgdGhlIG9uIHNjcmVlbiBjb250cm9scworICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheVpvb21Db250cm9scyhib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURpc3BsYXlab29tQ29udHJvbHMgPSBlbmFibGVkOworICAgICAgICBtV2ViVmlldy51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChtQ29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvbiBzY3JlZW4gem9vbSBidXR0b25zIGFyZSBiZWluZyB1c2VkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzcGxheVpvb21Db250cm9scygpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5Wm9vbUNvbnRyb2xzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGZpbGUgYWNjZXNzIHdpdGhpbiBXZWJWaWV3LiBGaWxlIGFjY2VzcyBpcyBlbmFibGVkIGJ5CiAgICAgICogZGVmYXVsdC4KQEAgLTQ4NiwyMCArNTY0LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdGhlIFdlYlZpZXcgdXNlcyBpdHMgYmFja2dyb3VuZCBmb3Igb3ZlciBzY3JvbGwgYmFja2dyb3VuZC4KLSAgICAgKiBJZiB0cnVlLCBpdCB3aWxsIHVzZSB0aGUgV2ViVmlldydzIGJhY2tncm91bmQuIElmIGZhbHNlLCBpdCB3aWxsIHVzZSBhbgotICAgICAqIGludGVybmFsIHBhdHRlcm4uIERlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgKiBTZXQgd2hldGhlciB0aGUgV2ViVmlldyB3aWxsIGVuYWJsZSBzbW9vdGggdHJhbnNpdGlvbiB3aGlsZSBwYW5uaW5nIG9yCisgICAgICogem9vbWluZy4gSWYgaXQgaXMgdHJ1ZSwgV2ViVmlldyB3aWxsIGNob29zZSBhIHNvbHV0aW9uIHRvIG1heGltaXplIHRoZQorICAgICAqIHBlcmZvcm1hbmNlLiBlLmcuIHRoZSBXZWJWaWV3J3MgY29udGVudCBtYXkgbm90IGJlIHVwZGF0ZWQgZHVyaW5nIHRoZQorICAgICAqIHRyYW5zaXRpb24uIElmIGl0IGlzIGZhbHNlLCBXZWJWaWV3IHdpbGwga2VlcCBpdHMgZmlkZWxpdHkuIFRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaXMgZmFsc2UuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlV2ViVmlld0JhY2tncm91bmRGb3JPdmVyc2Nyb2xsQmFja2dyb3VuZChib29sZWFuIHZpZXcpIHsKLSAgICAgICAgbVVzZVdlYlZpZXdCYWNrZ3JvdW5kT3ZlcnNjcm9sbEJhY2tncm91bmQgPSB2aWV3OworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZVNtb290aFRyYW5zaXRpb24oYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbUVuYWJsZVNtb290aFRyYW5zaXRpb24gPSBlbmFibGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgV2ViVmlldyB1c2VzIFdlYlZpZXcncyBiYWNrZ3JvdW5kIGluc3RlYWQgb2YKLSAgICAgKiBpbnRlcm5hbCBwYXR0ZXJuIGZvciBvdmVyIHNjcm9sbCBiYWNrZ3JvdW5kLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgV2ViVmlldyBlbmFibGVzIHNtb290aCB0cmFuc2l0aW9uIHdoaWxlIHBhbm5pbmcgb3IKKyAgICAgKiB6b29taW5nLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtVXNlV2ViVmlld0JhY2tncm91bmRPdmVyc2Nyb2xsQmFja2dyb3VuZDsKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbUVuYWJsZVNtb290aFRyYW5zaXRpb247CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTcsNiArNTk3LDIwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRmlsbEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1BdXRvRmlsbEVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0ZpbGxFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbUF1dG9GaWxsRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiAgU3RvcmUgd2hldGhlciB0aGUgV2ViVmlldyBpcyBzYXZpbmcgcGFzc3dvcmQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2F2ZVBhc3N3b3JkKGJvb2xlYW4gc2F2ZSkgewpAQCAtOTg3LDYgKzEwODEsNyBAQAogICAgICAgICBpZiAobUJsb2NrTmV0d29ya0xvYWRzICE9IGZsYWcpIHsKICAgICAgICAgICAgIG1CbG9ja05ldHdvcmtMb2FkcyA9IGZsYWc7CiAgICAgICAgICAgICB2ZXJpZnlOZXR3b3JrQWNjZXNzKCk7CisgICAgICAgICAgICBwb3N0U3luYygpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDAyLDggKzEwOTcsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5ldHdvcmtBY2Nlc3MoKSB7CiAgICAgICAgIGlmICghbUJsb2NrTmV0d29ya0xvYWRzKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiLCAKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLm15UGlkKCksIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSAKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVBpZCgpLCBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgKCJQZXJtaXNzaW9uIGRlbmllZCAtICIgKwpAQCAtMTAyOSw2ICsxMTI0LDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mCiAgICAgICogICAgICAgICAgICAge0BsaW5rICNzZXRQbHVnaW5TdGF0ZX0KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQbHVnaW5zRW5hYmxlZChib29sZWFuIGZsYWcpIHsKICAgICAgICAgc2V0UGx1Z2luU3RhdGUoUGx1Z2luU3RhdGUuT04pOwogICAgIH0KQEAgLTExOTksNiArMTI5NSwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBYU1MgQXVkaXRvciBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgWFNTIEF1ZGl0b3Igc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IExheW91dFRlc3RDb250cm9sbGVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaWYgKG1YU1NBdWRpdG9yRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtWFNTQXVkaXRvckVuYWJsZWQgPSBmbGFnOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIGphdmFzY3JpcHQgaXMgZW5hYmxlZC4gPGI+Tm90ZTogVGhlIGRlZmF1bHQgaXMgZmFsc2UuPC9iPgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBqYXZhc2NyaXB0IGlzIGVuYWJsZWQuCiAgICAgICovCkBAIC0xMjExLDYgKzEzMTksNyBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBwbHVnaW5zIGFyZSBlbmFibGVkLgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0UGx1Z2luU3RhdGV9CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZ2V0UGx1Z2luc0VuYWJsZWQoKSB7CiAgICAgICAgIHJldHVybiBtUGx1Z2luU3RhdGUgPT0gUGx1Z2luU3RhdGUuT047CiAgICAgfQpAQCAtMTI4NCw3ICsxMzkzLDcgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXNlckFnZW50U3RyaW5nKFN0cmluZyB1YSkgewogICAgICAgICBpZiAodWEgPT0gbnVsbCB8fCB1YS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoc0xvY2tGb3JMb2NhbGVTZXR0aW5ncykgewotICAgICAgICAgICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsgCisgICAgICAgICAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgIGlmICghc0xvY2FsZS5lcXVhbHMoY3VycmVudExvY2FsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc0xvY2FsZSA9IGN1cnJlbnRMb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgIG1BY2NlcHRMYW5ndWFnZSA9IGdldEN1cnJlbnRBY2NlcHRMYW5ndWFnZSgpOwpAQCAtMTMzOSwxMSArMTQ0OCwxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtQWNjZXB0TGFuZ3VhZ2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgV2ViVmlldyB3aGV0aGVyIGl0IG5lZWRzIHRvIHNldCBhIG5vZGUgdG8gaGF2ZSBmb2N1cyB3aGVuCiAgICAgICoge0BsaW5rIFdlYlZpZXcjcmVxdWVzdEZvY3VzKGludCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0KX0gaXMgY2FsbGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROZWVkSW5pdGlhbEZvY3VzKGJvb2xlYW4gZmxhZykgewpAQCAtMTM3MCw3ICsxNDc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyLlBSSU9SSVRZKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBPdmVycmlkZSB0aGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkLiBUaGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkIGlzIGJhc2VkCiAgICAgICogb24gdGhlIG5hdmlnYXRpb24gb3B0aW9uLiBGb3IgYSBub3JtYWwgcGFnZSBsb2FkLCB0aGUgY2FjaGUgaXMgY2hlY2tlZApAQCAtMTM4NCw3ICsxNDkzLDcgQEAKICAgICAgICAgICAgIG1PdmVycmlkZUNhY2hlTW9kZSA9IG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZyBmb3Igb3ZlcnJpZGluZyB0aGUgY2FjaGUgbW9kZS4gRm9yIGEgZnVsbAogICAgICAqIGRlc2NyaXB0aW9uLCBzZWUgdGhlIHtAbGluayAjc2V0Q2FjaGVNb2RlKGludCl9IGZ1bmN0aW9uLgpAQCAtMTM5Miw3ICsxNTAxLDcgQEAKICAgICBwdWJsaWMgaW50IGdldENhY2hlTW9kZSgpIHsKICAgICAgICAgcmV0dXJuIG1PdmVycmlkZUNhY2hlTW9kZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJZiBzZXQsIHdlYmtpdCBhbHRlcm5hdGVseSBzaHJpbmtzIGFuZCBleHBhbmRzIGltYWdlcyB2aWV3ZWQgb3V0c2lkZQogICAgICAqIG9mIGFuIEhUTUwgcGFnZSB0byBmaXQgdGhlIHNjcmVlbi4gVGhpcyBjb25mbGljdHMgd2l0aCBhdHRlbXB0cyBieQpAQCAtMTQwNyw2ICsxNTE2LDU4IEBACiAgICAgICAgIH0KICAgICAgfQogCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgbWF4aW11bSBkZWNvZGVkIGltYWdlIHNpemUuIFRoZSBkZWZhdWx0IGlzCisgICAgICogMiBtZWdzIGZvciBzbWFsbCBtZW1vcnkgZGV2aWNlcyBhbmQgOCBtZWdzIGZvciBsYXJnZSBtZW1vcnkgZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgbWF4aW11bSBkZWNvZGVkIHNpemUsIG9yIHplcm8gdG8gc2V0IHRvIHRoZSBkZWZhdWx0LgorICAgICAqIEBoaWRlIHBlbmRpbmcgYXBpIGNvdW5jaWwgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRGVjb2RlZEltYWdlU2l6ZShsb25nIHNpemUpIHsKKyAgICAgICAgaWYgKG1NYXhpbXVtRGVjb2RlZEltYWdlU2l6ZSAhPSBzaXplKSB7CisgICAgICAgICAgICBtTWF4aW11bURlY29kZWRJbWFnZVNpemUgPSBzaXplOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0byB1c2UgZml4ZWQgdmlld3BvcnQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGdldFVzZUZpeGVkVmlld3BvcnQoKSB7CisgICAgICAgIHJldHVybiBtVXNlRml4ZWRWaWV3cG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG1heGltdW0gZml4ZWQgdmlld3BvcnQgd2lkdGguCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0TWF4Rml4ZWRWaWV3cG9ydFdpZHRoKCkgeworICAgICAgICByZXR1cm4gbU1heEZpeGVkVmlld3BvcnRXaWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGlmIChtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCA9IGZsYWc7CisgICAgICAgICAgICBwb3N0U3luYygpOworICAgICAgICB9CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgc2V0U3ludGhldGljTGlua3NFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpZiAobVN5bnRoZXRpY0xpbmtzRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtU3ludGhldGljTGlua3NFbmFibGVkID0gZmxhZzsKKyAgICAgICAgICAgIHBvc3RTeW5jKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpbnQgZ2V0RG91YmxlVGFwVG9hc3RDb3VudCgpIHsKICAgICAgICAgcmV0dXJuIG1Eb3VibGVUYXBUb2FzdENvdW50OwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKaW5kZXggMTlhYmVjMS4uMWFmZjE3MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKQEAgLTQ2LDYgKzQ3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzb2x1dGVMYXlvdXQuTGF5b3V0UGFyYW1zOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKQEAgLTEwOSwxNiArMTExLDM1IEBACiAgICAgLy8gRklYTUU6IFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggVGV4dFZpZXcuTk9fRklMVEVSUyBpZiB0aGF0CiAgICAgLy8gaXMgbWFkZSBwdWJsaWMvcHJvdGVjdGVkLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElucHV0RmlsdGVyW10gTk9fRklMVEVSUyA9IG5ldyBJbnB1dEZpbHRlclswXTsKKyAgICAvLyBGb3Iga2VlcGluZyB0cmFjayBvZiB0aGUgZmFjdCB0aGF0IHRoZSBkZWxldGUga2V5IHdhcyBwcmVzc2VkLCBzbworICAgIC8vIHdlIGNhbiBzaW1wbHkgcGFzcyBhIGRlbGV0ZSBrZXkgaW5zdGVhZCBvZiBjYWxsaW5nIGRlbGV0ZVNlbGVjdGlvbi4KKyAgICBwcml2YXRlIGJvb2xlYW4gbUdvdERlbGV0ZTsKKyAgICBwcml2YXRlIGludCBtRGVsU2VsU3RhcnQ7CisgICAgcHJpdmF0ZSBpbnQgbURlbFNlbEVuZDsKKworICAgIC8vIEtlZXAgaW4gc3luYyB3aXRoIG5hdGl2ZSBjb25zdGFudCBpbgorICAgIC8vIGV4dGVybmFsL3dlYmtpdC9XZWJLaXQvYW5kcm9pZC9XZWJDb3JlU3VwcG9ydC9hdXRvZmlsbC9XZWJBdXRvRmlsbC5jcHAKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgRk9STV9OT1RfQVVUT0ZJTExBQkxFID0gLTE7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUF1dG9GaWxsYWJsZTsgLy8gSXMgdGhpcyB0ZXh0dmlldyBwYXJ0IG9mIGFuIGF1dG9maWxsYWJsZSBmb3JtPworICAgIHByaXZhdGUgaW50IG1RdWVyeUlkOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbmV3IFdlYlRleHRWaWV3LgogICAgICAqIEBwYXJhbSAgIGNvbnRleHQgVGhlIENvbnRleHQgZm9yIHRoaXMgV2ViVGV4dFZpZXcuCiAgICAgICogQHBhcmFtICAgd2ViVmlldyBUaGUgV2ViVmlldyB0aGF0IGNyZWF0ZWQgdGhpcy4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIFdlYlRleHRWaWV3KENvbnRleHQgY29udGV4dCwgV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgLyogcGFja2FnZSAqLyBXZWJUZXh0VmlldyhDb250ZXh0IGNvbnRleHQsIFdlYlZpZXcgd2ViVmlldywgaW50IGF1dG9GaWxsUXVlcnlJZCkgewogICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIud2ViVGV4dFZpZXdTdHlsZSk7CiAgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKICAgICAgICAgbU1heExlbmd0aCA9IC0xOworICAgICAgICBzZXRBdXRvRmlsbGFibGUoYXV0b0ZpbGxRdWVyeUlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRmlsbGFibGUoaW50IHF1ZXJ5SWQpIHsKKyAgICAgICAgbUF1dG9GaWxsYWJsZSA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QXV0b0ZpbGxFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAmJiAocXVlcnlJZCAhPSBGT1JNX05PVF9BVVRPRklMTEFCTEUpOworICAgICAgICBtUXVlcnlJZCA9IHF1ZXJ5SWQ7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNTIsMTMgKzE3MywyMiBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgU3Bhbm5hYmxlIHRleHQgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7Ci0gICAgICAgIGludCBvbGRMZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICBpbnQgb2xkU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQodGV4dCk7CisgICAgICAgIGludCBvbGRFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHRleHQpOwogICAgICAgICAvLyBOb3JtYWxseSB0aGUgZGVsZXRlIGtleSdzIGRvbSBldmVudHMgYXJlIHNlbnQgdmlhIG9uVGV4dENoYW5nZWQuCi0gICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBsZW5ndGggaXMgemVybywgdGhlIHRleHQgZGlkIG5vdCBjaGFuZ2UsIHNvIHdlCi0gICAgICAgIC8vIGdvIGFoZWFkIGFuZCBwYXNzIHRoZSBrZXkgZG93biBpbW1lZGlhdGVseS4KLSAgICAgICAgaWYgKEtleUV2ZW50LktFWUNPREVfREVMID09IGtleUNvZGUgJiYgMCA9PSBvbGRMZW5ndGgpIHsKLSAgICAgICAgICAgIHNlbmREb21FdmVudChldmVudCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgLy8gSG93ZXZlciwgaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWVsZCwgd2hpY2gKKyAgICAgICAgLy8gaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgaXQgaGFzIHplcm8gbGVuZ3RoLCB0aGVuIHRoZSB0ZXh0IGlzIG5vdAorICAgICAgICAvLyBjaGFuZ2VkLCBzbyBzZW5kIHRoZSBldmVudHMgaW1tZWRpYXRlbHkuCisgICAgICAgIGlmIChLZXlFdmVudC5LRVlDT0RFX0RFTCA9PSBrZXlDb2RlKSB7CisgICAgICAgICAgICBpZiAob2xkU3RhcnQgPT0gMCAmJiBvbGRFbmQgPT0gMCkgeworICAgICAgICAgICAgICAgIHNlbmREb21FdmVudChldmVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIG1Hb3REZWxldGUgPSB0cnVlOworICAgICAgICAgICAgICAgIG1EZWxTZWxTdGFydCA9IG9sZFN0YXJ0OworICAgICAgICAgICAgICAgIG1EZWxTZWxFbmQgPSBvbGRFbmQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKG1TaW5nbGUgJiYgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUiA9PSBrZXlDb2RlKSkgewpAQCAtMTk2LDkgKzIyNiw4IEBACiAgICAgICAgIGlmIChnZXRMYXlvdXQoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICBtZWFzdXJlKG1XaWR0aFNwZWMsIG1IZWlnaHRTcGVjKTsKICAgICAgICAgfQotICAgICAgICBpbnQgb2xkU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQodGV4dCk7Ci0gICAgICAgIGludCBvbGRFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHRleHQpOwogCisgICAgICAgIGludCBvbGRMZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwogICAgICAgICBib29sZWFuIG1heGVkT3V0ID0gbU1heExlbmd0aCAhPSAtMSAmJiBvbGRMZW5ndGggPT0gbU1heExlbmd0aDsKICAgICAgICAgLy8gSWYgd2UgYXJlIGF0IG1heCBsZW5ndGgsIGFuZCB0aGVyZSBpcyBhIHNlbGVjdGlvbiByYXRoZXIgdGhhbiBhCiAgICAgICAgIC8vIGN1cnNvciwgd2UgbmVlZCB0byBzdG9yZSB0aGUgdGV4dCB0byBjb21wYXJlIGxhdGVyLCBzaW5jZSB0aGUga2V5CkBAIC0zMDAsNiArMzI5LDMzIEBACiAgICAgICAgIHJldHVybiBjb25uZWN0aW9uOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluIGdlbmVyYWwsIFRleHRWaWV3IG1ha2VzIGEgY2FsbCB0byBJbnB1dE1ldGhvZE1hbmFnZXIudXBkYXRlU2VsZWN0aW9uCisgICAgICogaW4gb25EcmF3LiAgSG93ZXZlciwgaW4gdGhlIGdlbmVyYWwgY2FzZSBvZiBXZWJUZXh0Vmlldywgd2UgZG8gbm90IGRyYXcuCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFdlYlZpZXcub25EcmF3IHRvIHRha2UgY2FyZSBvZiB0aGUgcGFydCB0aGF0CisgICAgICogbmVlZHMgdG8gYmUgY2FsbGVkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBvbkRyYXdTdWJzdGl0dXRlKCkgeworICAgICAgICBpZiAoIXdpbGxOb3REcmF3KCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBXZWJUZXh0VmlldyBpcyBzZXQgdG8gZHJhdywgc3VjaCBhcyBpbiB0aGUgY2FzZSBvZiBhCisgICAgICAgICAgICAvLyBwYXNzd29yZCwgb25EcmF3IGNhbGxzIHVwZGF0ZVNlbGVjdGlvbigpLCBzbyB0aGlzIGNvZGUgcGF0aCBpcworICAgICAgICAgICAgLy8gdW5uZWNlc3NhcnkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIFRleHRWaWV3Lm9uRHJhdygpLiAgVGhhdCBjb2RlIGRvZXMgbm90IGdldAorICAgICAgICAvLyBleGVjdXRlZCwgaG93ZXZlciwgYmVjYXVzZSB0aGUgV2ViVGV4dFZpZXcgZG9lcyBub3QgZHJhdywgYWxsb3dpbmcKKyAgICAgICAgLy8gd2Via2l0J3MgZHJhd2luZyB0byBzaG93IHRocm91Z2guCisgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CisgICAgICAgIGlmIChpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcykpIHsKKyAgICAgICAgICAgIFNwYW5uYWJsZSBzcCA9IChTcGFubmFibGUpIGdldFRleHQoKTsKKyAgICAgICAgICAgIGludCBzZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChzcCk7CisgICAgICAgICAgICBpbnQgc2VsRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzcCk7CisgICAgICAgICAgICBpbnQgY2FuZFN0YXJ0ID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHNwKTsKKyAgICAgICAgICAgIGludCBjYW5kRW5kID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZChzcCk7CisgICAgICAgICAgICBpbW0udXBkYXRlU2VsZWN0aW9uKHRoaXMsIHNlbFN0YXJ0LCBzZWxFbmQsIGNhbmRTdGFydCwgY2FuZEVuZCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICAvLyBvbkRyYXcgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBwYXNzd29yZCBmaWVsZHMuICBJZiBXZWJUZXh0VmlldyBpcwpAQCAtMzIyLDkgKzM3OCw2IEBACiAgICAgICAgIHN3aXRjaCAoYWN0aW9uQ29kZSkgewogICAgICAgICBjYXNlIEVkaXRvckluZm8uSU1FX0FDVElPTl9ORVhUOgogICAgICAgICAgICAgaWYgKG1XZWJWaWV3Lm5hdGl2ZU1vdmVDdXJzb3JUb05leHRUZXh0SW5wdXQoKSkgewotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBjdXJzb3Igd2lsbCBubyBsb25nZXIgYmUgaW4gdGhlIHNhbWUgcGxhY2UgYXMgdGhlCi0gICAgICAgICAgICAgICAgLy8gZm9jdXMsIHNldCB0aGUgZm9jdXMgY29udHJvbGxlciBiYWNrIHRvIGluYWN0aXZlCi0gICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKTsKICAgICAgICAgICAgICAgICAvLyBQcmVlbXB0aXZlbHkgcmVidWlsZCB0aGUgV2ViVGV4dFZpZXcsIHNvIHRoYXQgdGhlIGFjdGlvbiB3aWxsCiAgICAgICAgICAgICAgICAgLy8gYmUgc2V0IHByb3Blcmx5LgogICAgICAgICAgICAgICAgIG1XZWJWaWV3LnJlYnVpbGRXZWJUZXh0VmlldygpOwpAQCAtMzYwLDE5ICs0MTMsOCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TZWxlY3Rpb25DaGFuZ2VkKGludCBzZWxTdGFydCwgaW50IHNlbEVuZCkgewotICAgICAgICBpZiAobUluU2V0VGV4dEFuZEtlZXBTZWxlY3Rpb24pIHJldHVybjsKLSAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIFRleHRWaWV3Lm9uRHJhdygpLiAgVGhhdCBjb2RlIGRvZXMgbm90IGdldAotICAgICAgICAvLyBleGVjdXRlZCwgaG93ZXZlciwgYmVjYXVzZSB0aGUgV2ViVGV4dFZpZXcgZG9lcyBub3QgZHJhdywgYWxsb3dpbmcKLSAgICAgICAgLy8gd2Via2l0J3MgZHJhd2luZyB0byBzaG93IHRocm91Z2guCi0gICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7Ci0gICAgICAgIGlmIChpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcykpIHsKLSAgICAgICAgICAgIFNwYW5uYWJsZSBzcCA9IChTcGFubmFibGUpIGdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBjYW5kU3RhcnQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuU3RhcnQoc3ApOwotICAgICAgICAgICAgaW50IGNhbmRFbmQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuRW5kKHNwKTsKLSAgICAgICAgICAgIGltbS51cGRhdGVTZWxlY3Rpb24odGhpcywgc2VsU3RhcnQsIHNlbEVuZCwgY2FuZFN0YXJ0LCBjYW5kRW5kKTsKLSAgICAgICAgfQogICAgICAgICBpZiAoIW1Gcm9tV2ViS2l0ICYmICFtRnJvbUZvY3VzQ2hhbmdlICYmICFtRnJvbVNldElucHV0VHlwZQotICAgICAgICAgICAgICAgICYmIG1XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAmJiBtV2ViVmlldyAhPSBudWxsICYmICFtSW5TZXRUZXh0QW5kS2VlcFNlbGVjdGlvbikgewogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1RFWFRfVklFVykgewogICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIm9uU2VsZWN0aW9uQ2hhbmdlZCBzZWxTdGFydD0iICsgc2VsU3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZWxFbmQ9IiArIHNlbEVuZCk7CkBAIC0zOTcsMTcgKzQzOSwzOCBAQAogICAgICAgICBtUHJlQ2hhbmdlID0gcG9zdENoYW5nZTsKICAgICAgICAgaWYgKDAgPT0gY291bnQpIHsKICAgICAgICAgICAgIGlmIChiZWZvcmUgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIHRoaXMgYW5kIGFsbCBjaGFuZ2VzIHRvIHRoZSB0ZXh0LCB1cGRhdGUgb3VyIGNhY2hlCisgICAgICAgICAgICAgICAgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKCk7CisgICAgICAgICAgICAgICAgaWYgKG1Hb3REZWxldGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUdvdERlbGV0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpbnQgb2xkRW5kID0gc3RhcnQgKyBiZWZvcmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGVsU2VsRW5kID09IG9sZEVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtRGVsU2VsU3RhcnQgPT0gc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobURlbFNlbFN0YXJ0ID09IG9sZEVuZCAmJiBiZWZvcmUgPT0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIHNldCB1cCBwcm9wZXJseSBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUsIHNlbmQgdGhlIERPTSBldmVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRG9tRXZlbnQobmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RFTCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZERvbUV2ZW50KG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fVVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LktFWUNPREVfREVMKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gVGhpcyB3YXMgc2ltcGx5IGEgZGVsZXRlIG9yIGEgY3V0LCBzbyBqdXN0IGRlbGV0ZSB0aGUKICAgICAgICAgICAgICAgICAvLyBzZWxlY3Rpb24uCiAgICAgICAgICAgICAgICAgbVdlYlZpZXcuZGVsZXRlU2VsZWN0aW9uKHN0YXJ0LCBzdGFydCArIGJlZm9yZSk7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIHRoaXMgYW5kIGFsbCBjaGFuZ2VzIHRvIHRoZSB0ZXh0LCB1cGRhdGUgb3VyIGNhY2hlCi0gICAgICAgICAgICAgICAgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtR290RGVsZXRlID0gZmFsc2U7CiAgICAgICAgICAgICAvLyBiZWZvcmUgc2hvdWxkIG5ldmVyIGJlIG5lZ2F0aXZlLCBzbyB3aGV0aGVyIGl0IHdhcyBhIGN1dAogICAgICAgICAgICAgLy8gKGhhbmRsZWQgYWJvdmUpLCBvciBiZWZvcmUgaXMgMCwgaW4gd2hpY2ggY2FzZSBub3RoaW5nIGhhcwogICAgICAgICAgICAgLy8gY2hhbmdlZCwgd2Ugc2hvdWxkIHJldHVybi4KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGZsYWcgZ2V0cyBjbGVhcmVkLCBzaW5jZSB3aXRoIGF1dG9jb3JyZWN0IG9uLCBhCisgICAgICAgIC8vIGRlbGV0ZSBrZXkgcHJlc3MgbWF5IGhhdmUgYSBtb3JlIGNvbXBsZXggcmVzdWx0IHRoYW4gZGVsZXRpbmcgb25lCisgICAgICAgIC8vIGNoYXJhY3RlciBvciB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uLCBzbyBpdCB3aWxsIG5vdCBnZXQgY2xlYXJlZAorICAgICAgICAvLyBhYm92ZS4KKyAgICAgICAgbUdvdERlbGV0ZSA9IGZhbHNlOwogICAgICAgICAvLyBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBiZWluZyByZXBsYWNlZC4gIElmIGl0IGNhbiBiZSByZXByZXNlbnRlZCBieQogICAgICAgICAvLyBldmVudHMsIHdlIHdpbGwgcGFzcyB0aGVtIHRvIG5hdGl2ZSAoYWZ0ZXIgcmVwbGFjaW5nIHRoZSBiZWdpbm5pbmcKICAgICAgICAgLy8gb2YgdGhlIGNoYW5nZWQgdGV4dCksIHNvIHdlIGNhbiBzZWUgamF2YXNjcmlwdCBldmVudHMuCkBAIC00ODEsOSArNTQ0LDEwIEBACiAgICAgICAgICAgICAvLyB0byBiaWcgZm9yIHRoZSBjYXNlIG9mIGEgc21hbGwgdGV4dGZpZWxkLgogICAgICAgICAgICAgaW50IHNtYWxsZXJTbG9wID0gc2xvcC8yOwogICAgICAgICAgICAgaWYgKGR4ID4gc21hbGxlclNsb3AgfHwgZHkgPiBzbWFsbGVyU2xvcCkgewotICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFNjcm9sbFggPSAoZmxvYXQpIFRvdWNoLmdldE1heFNjcm9sbFgodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGF5b3V0KCksIG1TY3JvbGxZKTsKKyAgICAgICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgbGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4U2Nyb2xsWCA9IChmbG9hdCkgVG91Y2guZ2V0TWF4U2Nyb2xsWCh0aGlzLCBsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVEVYVF9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJvblRvdWNoRXZlbnQgeD0iICsgbVNjcm9sbFggKyAiIHk9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TY3JvbGxZICsgIiBtYXhYPSIgKyBtYXhTY3JvbGxYKTsKQEAgLTU3OCwxNiArNjQyLDMxIEBACiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIHJlbW92ZSgpIHsKICAgICAgICAgLy8gaGlkZSB0aGUgc29mdCBrZXlib2FyZCB3aGVuIHRoZSBlZGl0IHRleHQgaXMgb3V0IG9mIGZvY3VzCi0gICAgICAgIElucHV0TWV0aG9kTWFuYWdlci5nZXRJbnN0YW5jZShtQ29udGV4dCkuaGlkZVNvZnRJbnB1dEZyb21XaW5kb3coCi0gICAgICAgICAgICAgICAgZ2V0V2luZG93VG9rZW4oKSwgMCk7CisgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpOworICAgICAgICBpZiAoaW1tLmlzQWN0aXZlKHRoaXMpKSB7CisgICAgICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3coZ2V0V2luZG93VG9rZW4oKSwgMCk7CisgICAgICAgIH0KICAgICAgICAgbVdlYlZpZXcucmVtb3ZlVmlldyh0aGlzKTsKICAgICAgICAgbVdlYlZpZXcucmVxdWVzdEZvY3VzKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTW92ZSB0aGUgY2FyZXQvc2VsZWN0aW9uIGludG8gdmlldy4KKyAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgYnJpbmdJbnRvVmlldygpIHsKLSAgICAgICAgaWYgKGdldExheW91dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJyaW5nUG9pbnRJbnRvVmlldyhTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGdldFRleHQoKSkpOworICAgICAgICBicmluZ1BvaW50SW50b1ZpZXcoU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChnZXRUZXh0KCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBicmluZ1BvaW50SW50b1ZpZXcoaW50IG9mZnNldCkgeworICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobVdlYlZpZXcubmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRMYXlvdXQoKSAhPSBudWxsICYmIHN1cGVyLmJyaW5nUG9pbnRJbnRvVmlldyhvZmZzZXQpOwogICAgICAgICB9CisgICAgICAgIC8vIEZvciBub24gcGFzc3dvcmQgdGV4dCBpbnB1dCwgdGVsbCB3ZWJraXQgdG8gbW92ZSB0aGUgY2FyZXQvc2VsZWN0aW9uCisgICAgICAgIC8vIG9uIHNjcmVlbiwgc2luY2Ugd2Via2l0IGRyYXdzIHRoZW0uCisgICAgICAgIG1XZWJWaWV3LnJldmVhbFNlbGVjdGlvbigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTYwOSw2ICs2ODgsMjIgQEAKICAgICAgICAgICAgIGFkYXB0ZXIuc2V0VGV4dFZpZXcodGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgaWYgKG1BdXRvRmlsbGFibGUpIHsKKyAgICAgICAgICAgIHNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPT0gMCAmJiBwb3NpdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBCbGFuayBvdXQgdGhlIHRleHQgYm94IHdoaWxlIHdlIHdhaXQgZm9yIFdlYkNvcmUgdG8gZmlsbCB0aGUgZm9ybS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VUZXh0KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgYSB3ZWJ2aWV3IG1ldGhvZCB0byB0ZWxsIFdlYkNvcmUgdG8gYXV0b2ZpbGwgdGhlIGZvcm0uCisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5hdXRvRmlsbEZvcm0obVF1ZXJ5SWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG51bGwpOworICAgICAgICB9CisgICAgICAgIHNob3dEcm9wRG93bigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjY3LDYgKzc2Miw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKHRleHQsIHNlbGVjdGlvbiwgc2VsZWN0aW9uKTsKICAgICAgICAgfQorICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgbVdlYlZpZXcuaW5jcmVtZW50VGV4dEdlbmVyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg5OSw3ICs5OTUsNyBAQAogICAgICAgICAgICAgaWYgKHR5cGUgIT0gMiAvKiBQQVNTV09SRCAqLykgewogICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbVdlYlZpZXcubmF0aXZlRm9jdXNDYW5kaWRhdGVOYW1lKCk7CiAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5yZXF1ZXN0Rm9ybURhdGEobmFtZSwgbU5vZGVQb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcucmVxdWVzdEZvcm1EYXRhKG5hbWUsIG1Ob2RlUG9pbnRlciwgbUF1dG9GaWxsYWJsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05MTksMTQgKzEwMTUsNCBAQAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB1cGRhdGVDYWNoZWRUZXh0ZmllbGQoKSB7CiAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZUNhY2hlZFRleHRmaWVsZChnZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKFJlY3QgcmVjdGFuZ2xlKSB7Ci0gICAgICAgIC8vIGRvbid0IHNjcm9sbCB3aGlsZSBpbiB6b29tIGFuaW1hdGlvbi4gV2hlbiBpdCBpcyBkb25lLCB3ZSB3aWxsIGFkanVzdAotICAgICAgICAvLyB0aGUgV2ViVGV4dFZpZXcgaWYgaXQgaXMgaW4gZWRpdGluZyBtb2RlLgotICAgICAgICBpZiAoIW1XZWJWaWV3LmluQW5pbWF0ZVpvb20oKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RSZWN0YW5nbGVPblNjcmVlbihyZWN0YW5nbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCBmYmMxYjY1Li5mZWRiODczIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTE2LDM5ICsxNiw0MSBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKLQogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5XaWRnZXQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db3JuZXJQYXRoRWZmZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnRGbGFnc0RyYXdGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnRleHQuSUNsaXBib2FyZDsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuc3BlZWNoLnR0cy5UZXh0VG9TcGVlY2g7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CkBAIC02Niw0MCArNjgsNDIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJUZXh0Vmlldy5BdXRvQ29tcGxldGVBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoRXZlbnREYXRhOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoSGlnaGxpZ2h0RGF0YTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNvbHV0ZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrZWRUZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FZGdlR2xvdzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuT3ZlclNjcm9sbGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b25zQ29udHJvbGxlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIC8qKgogICogPHA+QSBWaWV3IHRoYXQgZGlzcGxheXMgd2ViIHBhZ2VzLiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNpcyB1cG9uIHdoaWNoIHlvdQpAQCAtMTE2LDcgKzEyMCw3IEBACiAgKiA8cHJlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+PC9wcmU+CiAgKgogICogPHA+VGhpcyBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIDxhCi0gKiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDttYW5pZmVzdCZndDt9PC9hPgorICogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50Lmh0bWwiPntAY29kZSA8bWFuaWZlc3Q+fTwvYT4KICAqIGVsZW1lbnQuPC9wPgogICoKICAqIDxwPlNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdmlld3MvaGVsbG8td2Vidmlldy5odG1sIj5XZWIgVmlldwpAQCAtMTM5LDcgKzE0Myw3IEBACiAgKiA8L3ByZT4KICAqIDxwPlNlZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgogICoKLSAqIDxwPlRvIHByb3ZpZGUgYSBXZWJWaWV3IGluIHlvdXIgb3duIEFjdGl2aXR5LCBpbmNsdWRlIGEge0Bjb2RlICZsdDtXZWJWaWV3Jmd0O30gaW4geW91ciBsYXlvdXQsCisgKiA8cD5UbyBwcm92aWRlIGEgV2ViVmlldyBpbiB5b3VyIG93biBBY3Rpdml0eSwgaW5jbHVkZSBhIHtAY29kZSA8V2ViVmlldz59IGluIHlvdXIgbGF5b3V0LAogICogb3Igc2V0IHRoZSBlbnRpcmUgQWN0aXZpdHkgd2luZG93IGFzIGEgV2ViVmlldyBkdXJpbmcge0BsaW5rCiAgKiBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZShCdW5kbGUpIG9uQ3JlYXRlKCl9OjwvcD4KICAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KQEAgLTI4Niw3ICsyOTAsNyBAQAogICogbG93IGRlbnNpdHkgc2NyZWVucyBzY2FsZSBkb3duLiBUaGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IuPC9saT4KICAqIDxsaT57QGNvZGUgbG93LWRwaX0gLSBVc2UgbGRwaSBhcyB0aGUgdGFyZ2V0IGRwaS4gTWVkaXVtIGFuZCBoaWdoIGRlbnNpdHkgc2NyZWVucyBzY2FsZSB1cAogICogYXMgYXBwcm9wcmlhdGUuPC9saT4KLSAqIDxsaT48ZW0+e0Bjb2RlICZsdDt2YWx1ZSZndDt9PC9lbT4gLSBTcGVjaWZ5IGEgZHBpIHZhbHVlIHRvIHVzZSBhcyB0aGUgdGFyZ2V0IGRwaSAoYWNjZXB0ZWQKKyAqIDxsaT48ZW0+e0Bjb2RlIDx2YWx1ZT59PC9lbT4gLSBTcGVjaWZ5IGEgZHBpIHZhbHVlIHRvIHVzZSBhcyB0aGUgdGFyZ2V0IGRwaSAoYWNjZXB0ZWQKICAqIHZhbHVlcyBhcmUgNzAtNDAwKS48L2xpPgogICogPC91bD4KICAqIDxwPkhlcmUncyBhbiBleGFtcGxlIG1ldGEgdGFnIHRvIHNwZWNpZnkgdGhlIHRhcmdldCBkZW5zaXR5OjwvcD4KQEAgLTI5OCw3ICszMDIsNyBAQAogICogcHJvcGVydHkgdG8ge0Bjb2RlIGRldmljZS1kcGl9LiBUaGlzIHN0b3BzIEFuZHJvaWQgZnJvbSBwZXJmb3JtaW5nIHNjYWxpbmcgaW4geW91ciB3ZWIgcGFnZSBhbmQKICAqIGFsbG93cyB5b3UgdG8gbWFrZSB0aGUgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIGZvciBlYWNoIGRlbnNpdHkgdmlhIENTUyBhbmQgSmF2YVNjcmlwdC48L3A+CiAgKgotICogCisgKgogICovCiBAV2lkZ2V0CiBwdWJsaWMgY2xhc3MgV2ViVmlldyBleHRlbmRzIEFic29sdXRlTGF5b3V0CkBAIC0zMTUsNDkgKzMxOSw3IEBACiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3IjsKIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgewotICAgICAgICBwdWJsaWMgRXh0ZW5kZWRab29tQ29udHJvbHMoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lnpvb21fbWFnbmlmeSwgdGhpcywgdHJ1ZSk7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzID0gKFpvb21Db250cm9scykgZmluZFZpZXdCeUlkKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21Db250cm9scyk7Ci0gICAgICAgICAgICBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tTWFnbmlmeSkuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3coYm9vbGVhbiBzaG93Wm9vbSwgYm9vbGVhbiBjYW5ab29tT3V0KSB7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgIHNob3dab29tID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgICAgIGZhZGUoVmlldy5WSVNJQkxFLCAwLjBmLCAxLjBmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgICAgICBmYWRlKFZpZXcuR09ORSwgMS4wZiwgMC4wZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZmFkZShpbnQgdmlzaWJpbGl0eSwgZmxvYXQgc3RhcnRBbHBoYSwgZmxvYXQgZW5kQWxwaGEpIHsKLSAgICAgICAgICAgIEFscGhhQW5pbWF0aW9uIGFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oc3RhcnRBbHBoYSwgZW5kQWxwaGEpOwotICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbig1MDApOwotICAgICAgICAgICAgc3RhcnRBbmltYXRpb24oYW5pbSk7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsdXNNaW51c1pvb21Db250cm9scy5oYXNGb2N1cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICBab29tQ29udHJvbHMgICAgbVBsdXNNaW51c1pvb21Db250cm9sczsKLSAgICB9CisgICAgcHJpdmF0ZSBab29tTWFuYWdlciBtWm9vbU1hbmFnZXI7CiAKICAgICAvKioKICAgICAgKiAgVHJhbnNwb3J0YXRpb24gb2JqZWN0IGZvciByZXR1cm5pbmcgV2ViVmlldyBhY3Jvc3MgdGhyZWFkIGJvdW5kYXJpZXMuCkBAIC00MDMsNiArMzY1LDggQEAKICAgICAvLyBtb3JlIGtleSBldmVudHMuCiAgICAgcHJpdmF0ZSBpbnQgbVRleHRHZW5lcmF0aW9uOwogCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGluY3JlbWVudFRleHRHZW5lcmF0aW9uKCkgeyBtVGV4dEdlbmVyYXRpb24rKzsgfQorCiAgICAgLy8gVXNlZCBieSBXZWJWaWV3Q29yZSB0byBjcmVhdGUgY2hpbGQgdmlld3MuCiAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBWaWV3TWFuYWdlciBtVmlld01hbmFnZXI7CiAKQEAgLTQ1MCw2ICs0MTQsMTQgQEAKICAgICBwcml2YXRlIGZsb2F0IG1MYXN0VmVsWDsKICAgICBwcml2YXRlIGZsb2F0IG1MYXN0VmVsWTsKIAorICAgIC8vIEEgcG9pbnRlciB0byB0aGUgbmF0aXZlIHNjcm9sbGFibGUgbGF5ZXIgd2hlbiBkcmFnZ2luZyBsYXllcnMuICBPbmx5CisgICAgLy8gdmFsaWQgd2hlbiBtVG91Y2hNb2RlIGlzIFRPVUNIX0RSQUdfTEFZRVJfTU9ERS4KKyAgICBwcml2YXRlIGludCBtU2Nyb2xsaW5nTGF5ZXI7CisKKyAgICAvLyBvbmx5IHRyaWdnZXIgYWNjZWxlcmF0ZWQgZmxpbmcgaWYgdGhlIG5ldyB2ZWxvY2l0eSBpcyBhdCBsZWFzdAorICAgIC8vIE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTiB0aW1lcyBvZiB0aGUgcHJldmlvdXMgdmVsb2NpdHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04gPSAwLjJmOworCiAgICAgLyoqCiAgICAgICogVG91Y2ggbW9kZQogICAgICAqLwpAQCAtNDYyLDExICs0MzQsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET1VCTEVfVEFQX01PREUgPSA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET05FX01PREUgPSA3OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9QSU5DSF9EUkFHID0gODsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgd2UgaGF2ZSBhIHRvdWNoIHBhbmVsIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNtb290aCBwYW4vc2NhbGUgYXQgdGhlIHNhbWUgdGltZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dQYW5BbmRTY2FsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfRFJBR19MQVlFUl9NT0RFID0gOTsKIAogICAgIC8vIFdoZXRoZXIgdG8gZm9yd2FyZCB0aGUgdG91Y2ggZXZlbnRzIHRvIFdlYkNvcmUKICAgICBwcml2YXRlIGJvb2xlYW4gbUZvcndhcmRUb3VjaEV2ZW50cyA9IGZhbHNlOwpAQCAtNDg5LDYgKzQ1Nyw5IEBACiAgICAgLy8gZGVmYXVsdCBpcyBub3Qgc2V0LCB0aGUgVUkgd2lsbCBjb250aW51ZSBoYW5kbGUgdGhlbS4KICAgICBwcml2YXRlIGJvb2xlYW4gbURlZmVyVG91Y2hQcm9jZXNzOwogCisgICAgLy8gaWYgdHJ1ZSwgbXVsdGktdG91Y2ggZXZlbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHdlYmtpdCBkaXJlY3RseSBiZWZvcmUgVUkKKyAgICBwcml2YXRlIGJvb2xlYW4gbURlZmVyTXVsdGl0b3VjaCA9IGZhbHNlOworCiAgICAgLy8gdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCB0aGUgY3VycmVudCB0b3VjaCBldmVudHMsIHRyYWNrIHRoZW0KICAgICAvLyBzZXBhcmF0ZWx5LiBDdXJyZW50bHkgbm8gc25hcHBpbmcgb3IgZmxpbmcgaW4gdGhlIGRlZmVycmVkIHByb2Nlc3MgbW9kZQogICAgIHByaXZhdGUgaW50IG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKQEAgLTUwNSwxMCArNDc2LDYgQEAKICAgICAvLyB0cnVlIGlmIG9uUGF1c2UgaGFzIGJlZW4gY2FsbGVkIChhbmQgbm90IG9uUmVzdW1lKQogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQYXVzZWQ7CiAKLSAgICAvLyB0cnVlIGlmLCBkdXJpbmcgYSB0cmFuc2l0aW9uIHRvIGEgbmV3IHBhZ2UsIHdlJ3JlIGRlbGF5aW5nCi0gICAgLy8gZGVsZXRpbmcgYSByb290IGxheWVyIHVudGlsIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIGRyYXcgb2YgdGhlIG5ldyBwYWdlLgotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsYXllZERlbGV0ZVJvb3RMYXllcjsKLQogICAgIC8qKgogICAgICAqIEN1c3RvbWl6YWJsZSBjb25zdGFudAogICAgICAqLwpAQCAtNTMwLDkgKzQ5Nyw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9GTElOR19USU1FID0gMjUwOwogICAgIC8vIGRyYXcgdW5maWx0ZXJlZCBhZnRlciBkcmFnIGlzIGhlbGQgd2l0aG91dCBtb3ZlbWVudAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1RJT05MRVNTX1RJTUUgPSAxMDA7Ci0gICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgWm9vbSBDb250cm9scyBhcmUgdmlzaWJsZSBiZWZvcmUgZmFkaW5nIGF3YXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFpPT01fQ09OVFJPTFNfVElNRU9VVCA9Ci0gICAgICAgICAgICBWaWV3Q29uZmlndXJhdGlvbi5nZXRab29tQ29udHJvbHNUaW1lb3V0KCk7CiAgICAgLy8gVGhlIGFtb3VudCBvZiBjb250ZW50IHRvIG92ZXJsYXAgYmV0d2VlbiB0d28gc2NyZWVucyB3aGVuIGdvaW5nIHRocm91Z2gKICAgICAvLyBwYWdlcyB3aXRoIHRoZSBzcGFjZSBiYXIsIGluIHBpeGVscy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TQ1JPTExfT1ZFUkxBUCA9IDI0OwpAQCAtNTY0LDEwICs1MjgsNyBAQAogICAgIC8vIHRpbWUgZm9yIHRoZSBsb25nZXN0IHNjcm9sbCBhbmltYXRpb24KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RVUkFUSU9OID0gNzUwOyAgIC8vIG1pbGxpc2Vjb25kcwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTElERV9USVRMRV9EVVJBVElPTiA9IDUwMDsgICAvLyBtaWxsaXNlY29uZHMKLSAgICBwcml2YXRlIE92ZXJTY3JvbGxlciBtU2Nyb2xsZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jbk92ZXJTY3JvbGxNb2RlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGFpbnQgbU92ZXJTY3JvbGxCYWNrZ3JvdW5kOwotICAgIHByaXZhdGUgc3RhdGljIFBhaW50IG1PdmVyU2Nyb2xsQm9yZGVyOworICAgIHByaXZhdGUgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1XcmFwQ29udGVudDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9USU9OTEVTU19GQUxTRSAgICAgICAgICAgPSAwOwpAQCAtNTc2LDE1ICs1MzcsMjggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9USU9OTEVTU19JR05PUkUgICAgICAgICAgPSAzOwogICAgIHByaXZhdGUgaW50IG1IZWxkTW90aW9ubGVzczsKIAotICAgIC8vIHdoZXRoZXIgc3VwcG9ydCBtdWx0aS10b3VjaAotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydE11bHRpVG91Y2g7Ci0gICAgLy8gdXNlIHRoZSBmcmFtZXdvcmsncyBTY2FsZUdlc3R1cmVEZXRlY3RvciB0byBoYW5kbGUgbXVsdGktdG91Y2gKLSAgICBwcml2YXRlIFNjYWxlR2VzdHVyZURldGVjdG9yIG1TY2FsZURldGVjdG9yOworICAgIC8vIEFuIGluc3RhbmNlIGZvciBpbmplY3RpbmcgYWNjZXNzaWJpbGl0eSBpbiBXZWJWaWV3cyB3aXRoIGRpc2FibGVkCisgICAgLy8gSmF2YVNjcmlwdCBvciBvbmVzIGZvciB3aGljaCBubyBhY2Nlc3NpYmlsaXR5IHNjcmlwdCBleGlzdHMKKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlJbmplY3RvciBtQWNjZXNzaWJpbGl0eUluamVjdG9yOwogCi0gICAgLy8gdGhlIGFuY2hvciBwb2ludCBpbiB0aGUgZG9jdW1lbnQgc3BhY2Ugd2hlcmUgVklFV19TSVpFX0NIQU5HRUQgc2hvdWxkCi0gICAgLy8gYXBwbHkgdG8KLSAgICBwcml2YXRlIGludCBtQW5jaG9yWDsKLSAgICBwcml2YXRlIGludCBtQW5jaG9yWTsKKyAgICAvLyBmbGFnIGluZGljYXRpbmcgaWYgYWNjZXNzaWJpbGl0eSBzY3JpcHQgaXMgaW5qZWN0ZWQgc28gd2UKKyAgICAvLyBrbm93IHRvIGhhbmRsZSBTaGlmdCBhbmQgYXJyb3dzIG5hdGl2ZWx5IGZpcnN0CisgICAgcHJpdmF0ZSBib29sZWFuIG1BY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0ZWQ7CisKKyAgICAvLyB0aGUgY29sb3IgdXNlZCB0byBoaWdobGlnaHQgdGhlIHRvdWNoIHJlY3RhbmdsZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbUhpZ2h0bGlnaHRDb2xvciA9IDB4MzMwMDAwMDA7CisgICAgLy8gdGhlIHJvdW5kIGNvcm5lciBmb3IgdGhlIGhpZ2hsaWdodCBwYXRoCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVE9VQ0hfSElHSExJR0hUX0FSQyA9IDUuMGY7CisgICAgLy8gdGhlIHJlZ2lvbiBpbmRpY2F0aW5nIHdoZXJlIHRoZSB1c2VyIHRvdWNoZWQgb24gdGhlIHNjcmVlbgorICAgIHByaXZhdGUgUmVnaW9uIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKKyAgICAvLyB0aGUgcGFpbnQgZm9yIHRoZSB0b3VjaCBoaWdobGlnaHQKKyAgICBwcml2YXRlIFBhaW50IG1Ub3VjaEhpZ2h0bGlnaHRQYWludDsKKyAgICAvLyBkZWJ1ZyBvbmx5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UT1VDSF9ISUdITElHSFQgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ISUdITElHSFRfRUxBUFNFX1RJTUUgPSAyMDAwOworICAgIHByaXZhdGUgUGFpbnQgbVRvdWNoQ3Jvc3NIYWlyQ29sb3I7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoSGlnaGxpZ2h0WDsKKyAgICBwcml2YXRlIGludCBtVG91Y2hIaWdobGlnaHRZOwogCiAgICAgLyoKICAgICAgKiBQcml2YXRlIG1lc3NhZ2UgaWRzCkBAIC02MTgsNyArNTkyLDcgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IFdFQkNPUkVfSU5JVElBTElaRURfTVNHX0lEICAgICAgICAgPSAxMDc7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEICAgICAgID0gMTA4OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1pPT01fUkFOR0UgICAgICAgICAgICAgICAgICA9IDEwOTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PVkVfT1VUX09GX1BMVUdJTiAgICAgICAgICAgICAgICAgPSAxMTA7CisgICAgc3RhdGljIGZpbmFsIGludCBVTkhBTkRMRURfTkFWX0tFWSAgICAgICAgICAgICAgICAgID0gMTEwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfVEVYVF9FTlRSWSAgICAgICAgICAgICAgICAgICA9IDExMTsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQgICAgICAgPSAxMTI7CiAgICAgc3RhdGljIGZpbmFsIGludCBTSE9XX1JFQ1RfTVNHX0lEICAgICAgICAgICAgICAgICAgID0gMTEzOwpAQCAtNjMyLDE2ICs2MDYsMjEgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IFNIT1dfRlVMTFNDUkVFTiAgICAgICAgICAgICAgICAgICAgPSAxMjA7CiAgICAgc3RhdGljIGZpbmFsIGludCBISURFX0ZVTExTQ1JFRU4gICAgICAgICAgICAgICAgICAgID0gMTIxOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9NX0ZPQ1VTX0NIQU5HRUQgICAgICAgICAgICAgICAgICA9IDEyMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IElNTUVESUFURV9SRVBBSU5UX01TR19JRCAgICAgICAgICAgPSAxMjM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTRVRfUk9PVF9MQVlFUl9NU0dfSUQgICAgICAgICAgICAgID0gMTI0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRV9CQVNFX0NPTlRFTlQgICAgICAgICAgICAgICA9IDEyMzsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZPUk1fRElEX0JMVVIgICAgICAgICAgICAgICAgICAgICAgPSAxMjQ7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRVRVUk5fTEFCRUwgICAgICAgICAgICAgICAgICAgICAgID0gMTI1OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRklORF9BR0FJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNjsKICAgICBzdGF0aWMgZmluYWwgaW50IENFTlRFUl9GSVRfUkVDVCAgICAgICAgICAgICAgICAgICAgPSAxMjc7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0tFWUJPQVJEX1dJVEhfU0VMRUNUSU9OX01TR19JRCA9IDEyODsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9TQ1JPTExCQVJfTU9ERVMgICAgICAgICAgICAgICAgPSAxMjk7CisgICAgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQgICAgICAgICAgID0gMTMwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyAgICAgICAgICA9IDEzMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRCAgICAgICAgICAgPSAxMzI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9BVVRPRklMTEFCTEUgICAgICAgICAgICAgICAgICAgPSAxMzM7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUEFDS0FHRV9NU0dfSUQgPSBTQ1JPTExfVE9fTVNHX0lEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX1BBQ0tBR0VfTVNHX0lEID0gU0VUX1NDUk9MTEJBUl9NT0RFUzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUNLQUdFX01TR19JRCA9IFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gSGFuZGxlclByaXZhdGVEZWJ1Z1N0cmluZyA9IHsKICAgICAgICAgIlJFTUVNQkVSX1BBU1NXT1JEIiwgLy8gICAgICAgICAgICAgID0gMTsKQEAgLTY2Niw3ICs2NDUsNyBAQAogICAgICAgICAiV0VCQ09SRV9JTklUSUFMSVpFRF9NU0dfSUQiLCAvLyAgICAgPSAxMDc7CiAgICAgICAgICJVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEIiwgLy8gICA9IDEwODsKICAgICAgICAgIlVQREFURV9aT09NX1JBTkdFIiwgLy8gICAgICAgICAgICAgID0gMTA5OwotICAgICAgICAiTU9WRV9PVVRfT0ZfUExVR0lOIiwgLy8gICAgICAgICAgICAgPSAxMTA7CisgICAgICAgICJVTkhBTkRMRURfTkFWX0tFWSIsIC8vICAgICAgICAgICAgICA9IDExMDsKICAgICAgICAgIkNMRUFSX1RFWFRfRU5UUlkiLCAvLyAgICAgICAgICAgICAgID0gMTExOwogICAgICAgICAiVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRCIsIC8vICAgPSAxMTI7CiAgICAgICAgICJTSE9XX1JFQ1RfTVNHX0lEIiwgLy8gICAgICAgICAgICAgICA9IDExMzsKQEAgLTY3OSwxOCArNjU4LDIyIEBACiAgICAgICAgICJTSE9XX0ZVTExTQ1JFRU4iLCAvLyAgICAgICAgICAgICAgICA9IDEyMDsKICAgICAgICAgIkhJREVfRlVMTFNDUkVFTiIsIC8vICAgICAgICAgICAgICAgID0gMTIxOwogICAgICAgICAiRE9NX0ZPQ1VTX0NIQU5HRUQiLCAvLyAgICAgICAgICAgICAgPSAxMjI7Ci0gICAgICAgICJJTU1FRElBVEVfUkVQQUlOVF9NU0dfSUQiLCAvLyAgICAgICA9IDEyMzsKLSAgICAgICAgIlNFVF9ST09UX0xBWUVSX01TR19JRCIsIC8vICAgICAgICAgID0gMTI0OworICAgICAgICAiUkVQTEFDRV9CQVNFX0NPTlRFTlQiLCAvLyAgICAgICAgICAgPSAxMjM7CisgICAgICAgICJGT1JNX0RJRF9CTFVSIiwgLy8gICAgICAgICAgICAgICAgICA9IDEyNDsKICAgICAgICAgIlJFVFVSTl9MQUJFTCIsIC8vICAgICAgICAgICAgICAgICAgID0gMTI1OwogICAgICAgICAiRklORF9BR0FJTiIsIC8vICAgICAgICAgICAgICAgICAgICAgPSAxMjY7CiAgICAgICAgICJDRU5URVJfRklUX1JFQ1QiLCAvLyAgICAgICAgICAgICAgICA9IDEyNzsKICAgICAgICAgIlJFUVVFU1RfS0VZQk9BUkRfV0lUSF9TRUxFQ1RJT05fTVNHX0lEIiwgLy8gPSAxMjg7Ci0gICAgICAgICJTRVRfU0NST0xMQkFSX01PREVTIiAvLyAgICAgICAgICAgICA9IDEyOTsKKyAgICAgICAgIlNFVF9TQ1JPTExCQVJfTU9ERVMiLCAvLyAgICAgICAgICAgID0gMTI5OworICAgICAgICAiU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEIiwgLy8gICAgICAgPSAxMzA7CisgICAgICAgICJTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTIiwgLy8gICAgICA9IDEzMTsKKyAgICAgICAgIlNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRCIsIC8vICAgICAgID0gMTMyOworICAgICAgICAiU0VUX0FVVE9GSUxMQUJMRSIgLy8gICAgICAgICAgICAgICAgPSAxMzM7CiAgICAgfTsKIAogICAgIC8vIElmIHRoZSBzaXRlIGRvZXNuJ3QgdXNlIHRoZSB2aWV3cG9ydCBtZXRhIHRhZyB0byBzcGVjaWZ5IHRoZSB2aWV3cG9ydCwKICAgICAvLyB1c2UgREVGQVVMVF9WSUVXUE9SVF9XSURUSCBhcyB0aGUgZGVmYXVsdCB2aWV3cG9ydCB3aWR0aAotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WSUVXUE9SVF9XSURUSCA9IDgwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVklFV1BPUlRfV0lEVEggPSA5ODA7CiAKICAgICAvLyBub3JtYWxseSB3ZSB0cnkgdG8gZml0IHRoZSBjb250ZW50IHRvIHRoZSBtaW5pbXVtIHByZWZlcnJlZCB3aWR0aAogICAgIC8vIGNhbGN1bGF0ZWQgYnkgdGhlIFdlYmtpdC4gVG8gYXZvaWQgdGhlIGJhZCBiZWhhdmlvciB3aGVuIHNvbWUgc2l0ZSdzCkBAIC02OTgsNDkgKzY4MSw5IEBACiAgICAgLy8gdGhlIG1pbmltdW0gcHJlZmVycmVkIHdpZHRoIGlzIGh1Z2UsIGFuIHVwcGVyIGxpbWl0IGlzIG5lZWRlZC4KICAgICBzdGF0aWMgaW50IHNNYXhWaWV3cG9ydFdpZHRoID0gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKIAotICAgIC8vIGRlZmF1bHQgc2NhbGUgbGltaXQuIERlcGVuZGluZyBvbiB0aGUgZGlzcGxheSBkZW5zaXR5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBERUZBVUxUX01JTl9aT09NX1NDQUxFOwotICAgIC8vIHNjYWxlIGxpbWl0LCB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggdmlld3BvcnQgbWV0YSB0YWcgaW4gdGhlIHdlYiBwYWdlCi0gICAgcHJpdmF0ZSBmbG9hdCBtTWF4Wm9vbVNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbU1pblpvb21TY2FsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLQogICAgIC8vIGluaXRpYWwgc2NhbGUgaW4gcGVyY2VudC4gMCBtZWFucyB1c2luZyBkZWZhdWx0LgogICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPSAwOwogCi0gICAgLy8gd2hpbGUgaW4gdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSwgdGhlIHBhZ2UncyB3aWR0aCBpcyBmdWxseSBmaXQgdG8gdGhlCi0gICAgLy8gY3VycmVudCB3aW5kb3cuIFRoZSBwYWdlIGlzIGFsaXZlLCBpbiBhbm90aGVyIHdvcmRzLCB5b3UgY2FuIGNsaWNrIHRvCi0gICAgLy8gZm9sbG93IHRoZSBsaW5rcy4gRG91YmxlIHRhcCB3aWxsIHRvZ2dsZSBiZXR3ZWVuIHpvb20gb3ZlcnZpZXcgbW9kZSBhbmQKLSAgICAvLyB0aGUgbGFzdCB6b29tIHNjYWxlLgotICAgIGJvb2xlYW4gbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0KLSAgICAvLyBpZGVhbGx5IG1ab29tT3ZlcnZpZXdXaWR0aCBzaG91bGQgYmUgbUNvbnRlbnRXaWR0aC4gQnV0IHNpdGVzIGxpa2UgZXNwbiwKLSAgICAvLyBlbmdhZGdldCBhbHdheXMgaGF2ZSB3aWRlciBtQ29udGVudFdpZHRoIG5vIG1hdHRlciB3aGF0IHZpZXdwb3J0IHNpemUgaXMuCi0gICAgaW50IG1ab29tT3ZlcnZpZXdXaWR0aCA9IERFRkFVTFRfVklFV1BPUlRfV0lEVEg7Ci0gICAgZmxvYXQgbVRleHRXcmFwU2NhbGU7Ci0KLSAgICAvLyBkZWZhdWx0IHNjYWxlLiBEZXBlbmRpbmcgb24gdGhlIGRpc3BsYXkgZGVuc2l0eS4KLSAgICBzdGF0aWMgaW50IERFRkFVTFRfU0NBTEVfUEVSQ0VOVDsKLSAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0U2NhbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCA9IDAuMDFmOwotCi0gICAgLy8gc2V0IHRvIHRydWUgdGVtcG9yYXJpbHkgZHVyaW5nIFNjYWxlR2VzdHVyZSB0cmlnZ2VyZWQgem9vbQotICAgIHByaXZhdGUgYm9vbGVhbiBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7Ci0KLSAgICAvLyBjb21wdXRlZCBzY2FsZSBhbmQgaW52ZXJzZSwgZnJvbSBtWm9vbVdpZHRoLgotICAgIHByaXZhdGUgZmxvYXQgbUFjdHVhbFNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbUludkFjdHVhbFNjYWxlOwotICAgIC8vIGlmIHRoaXMgaXMgbm9uLXplcm8sIGl0IGlzIHVzZWQgb24gZHJhd2luZyByYXRoZXIgdGhhbiBtQWN0dWFsU2NhbGUKLSAgICBwcml2YXRlIGZsb2F0IG1ab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtSW52SW5pdGlhbFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1JbnZGaW5hbFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFg7Ci0gICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxZOwotICAgIHByaXZhdGUgbG9uZyBtWm9vbVN0YXJ0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0FOSU1BVElPTl9MRU5HVEggPSA1MDA7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJTY3JvbGwgPSBmYWxzZTsKIAogICAgIHByaXZhdGUgaW50IG1TbmFwU2Nyb2xsTW9kZSA9IFNOQVBfTk9ORTsKQEAgLTc2NCwyNiArNzA3LDMxIEBACiAgICAgcHJpdmF0ZSBpbnQgbUhvcml6b250YWxTY3JvbGxCYXJNb2RlID0gU0NST0xMQkFSX0FVVE87CiAgICAgcHJpdmF0ZSBpbnQgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9IFNDUk9MTEJBUl9BVVRPOwogCi0gICAgLyoqCi0gICAgICogTWF4IGRpc3RhbmNlIHRvIG92ZXJzY3JvbGwgYnkgaW4gcGl4ZWxzLgotICAgICAqIFRoaXMgaG93IGZhciBjb250ZW50IGNhbiBiZSBwdWxsZWQgYmV5b25kIGl0cyBub3JtYWwgYm91bmRzIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1PdmVyc2Nyb2xsRGlzdGFuY2U7CisgICAgLy8gY29uc3RhbnRzIGZvciBkZXRlcm1pbmluZyBzY3JpcHQgaW5qZWN0aW9uIHN0cmF0ZWd5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTl9VTkRFRklORUQgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTSUJJTElUWV9TQ1JJUFRfSU5KRUNUSU9OX09QVEVEX09VVCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTl9QUk9WSURFRCA9IDE7CiAKLSAgICAvKioKLSAgICAgKiBNYXggZGlzdGFuY2UgdG8gb3ZlcmZsaW5nIGJ5IGluIHBpeGVscy4KLSAgICAgKiBUaGlzIGlzIGhvdyBmYXIgZmxpbmdlZCBjb250ZW50IGNhbiBtb3ZlIGJleW9uZCB0aGUgZW5kIG9mIGl0cyBub3JtYWwgYm91bmRzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1PdmVyZmxpbmdEaXN0YW5jZTsKKyAgICAvLyB0aGUgYWxpYXMgdmlhIHdoaWNoIGFjY2Vzc2liaWxpdHkgSmF2YVNjcmlwdCBpbnRlcmZhY2UgaXMgZXhwb3NlZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRSA9ICJhY2Nlc3NpYmlsaXR5IjsKIAotICAgIC8qCi0gICAgICogVGhlc2UgbWFuYWdlIHRoZSBlZGdlIGdsb3cgZWZmZWN0IHdoZW4gZmx1bmcgb3IgcHVsbGVkIGJleW9uZCB0aGUgZWRnZXMuCi0gICAgICogSWYgb25lIGlzIG5vdCBudWxsLCBhbGwgYXJlIG5vdCBudWxsLiBDaGVja2luZyBvbmUgZm9yIG51bGwgaXMgYXMgZ29vZCBhcyBjaGVja2luZyBlYWNoLgotICAgICAqLwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93VG9wOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93Qm90dG9tOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93TGVmdDsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1JpZ2h0OworICAgIC8vIEphdmFTY3JpcHQgdG8gaW5qZWN0IHRoZSBzY3JpcHQgY2hvb3NlciB3aGljaCB3aWxsCisgICAgLy8gcGljayB0aGUgcmlnaHQgc2NyaXB0IGZvciB0aGUgY3VycmVudCBVUkwKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTSUJJTElUWV9TQ1JJUFRfQ0hPT1NFUl9KQVZBU0NSSVBUID0KKyAgICAgICAgImphdmFzY3JpcHQ6KGZ1bmN0aW9uKCkgeyIgKworICAgICAgICAiICAgIHZhciBjaG9vc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IiArCisgICAgICAgICIgICAgY2hvb3Nlci50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7IiArCisgICAgICAgICIgICAgY2hvb3Nlci5zcmMgPSAnaHR0cHM6Ly9zc2wuZ3N0YXRpYy5jb20vYWNjZXNzaWJpbGl0eS9qYXZhc2NyaXB0L2FuZHJvaWQvQW5kcm9pZFNjcmlwdENob29zZXIudXNlci5qcyc7IiArCisgICAgICAgICIgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChjaG9vc2VyKTsiICsKKyAgICAgICAgIiAgfSkoKTsiOworCisgICAgLy8gUmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgImF4cyIgVVJMIHBhcmFtZXRlci4KKyAgICAvLyBUaGUgdmFsdWUgb2YgMCBtZWFucyB0aGUgYWNjZXNzaWJpbGl0eSBzY3JpcHQgaXMgb3B0ZWQgb3V0CisgICAgLy8gVGhlIHZhbHVlIG9mIDEgbWVhbnMgdGhlIGFjY2Vzc2liaWxpdHkgc2NyaXB0IGlzIGFscmVhZHkgaW5qZWN0ZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9NQVRDSF9BWFNfVVJMX1BBUkFNRVRFUiA9ICIoXFw/YXhzPSgwfDEpKXwoJmF4cz0oMHwxKSkiOworCisgICAgLy8gdmFyaWFibGUgdG8gY2FjaGUgdGhlIGFib3ZlIHBhdHRlcm4gaW4gY2FzZSBhY2Nlc3NpYmlsaXR5IGlzIGVuYWJsZWQuCisgICAgcHJpdmF0ZSBQYXR0ZXJuIG1NYXRjaEF4c1VybFBhcmFtZXRlclBhdHRlcm47CiAKICAgICAvLyBVc2VkIHRvIG1hdGNoIGtleSBkb3ducyBhbmQga2V5IHVwcwogICAgIHByaXZhdGUgYm9vbGVhbiBtR290S2V5RG93bjsKQEAgLTc5Myw2ICs3NDEsOCBAQAogICAgIC8vIGZvciBldmVudCBsb2cKICAgICBwcml2YXRlIGxvbmcgbUxhc3RUb3VjaFVwVGltZSA9IDA7CiAKKyAgICBwcml2YXRlIGludCBtQXV0b0ZpbGxRdWVyeUlkID0gV2ViVGV4dFZpZXcuRk9STV9OT1RfQVVUT0ZJTExBQkxFOworCiAgICAgLyoqCiAgICAgICogVVJJIHNjaGVtZSBmb3IgdGVsZXBob25lIG51bWJlcgogICAgICAqLwpAQCAtODg5LDQzICs4MzksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhlIFZpZXcgY29udGFpbmluZyB0aGUgem9vbSBjb250cm9scwotICAgIHByaXZhdGUgRXh0ZW5kZWRab29tQ29udHJvbHMgbVpvb21Db250cm9sczsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1ab29tQ29udHJvbFJ1bm5hYmxlOwotCi0gICAgLy8gbVpvb21CdXR0b25zQ29udHJvbGxlciB3aWxsIGJlIGxhenkgaW5pdGlhbGl6ZWQgaW4KLSAgICAvLyBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgotICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7Ci0KLSAgICAvLyBUaGVzZSBrZWVwIHRyYWNrIG9mIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHpvb20uICBUaGV5IGFyZSB1c2VkIHRvCi0gICAgLy8gZGV0ZXJtaW5lIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggd2Ugc2hvdWxkIHpvb20uCi0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclg7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclk7Ci0KLSAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciBtWm9vbUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBab29tQnV0dG9uc0NvbnRyb2xsZXIuT25ab29tTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25ab29tKGJvb2xlYW4gem9vbUluKSB7Ci0gICAgICAgICAgICBpZiAoem9vbUluKSB7Ci0gICAgICAgICAgICAgICAgem9vbUluKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHpvb21PdXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3IFdlYlZpZXcgd2l0aCBhIENvbnRleHQgb2JqZWN0LgogICAgICAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBvYmplY3QgdXNlZCB0byBhY2Nlc3MgYXBwbGljYXRpb24gYXNzZXRzLgpAQCAtOTUwLDcgKzg2MywxOCBAQAogICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KICAgICAgKi8KICAgICBwdWJsaWMgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBudWxsKTsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgV2ViVmlldyB3aXRoIGxheW91dCBwYXJhbWV0ZXJzIGFuZCBhIGRlZmF1bHQgc3R5bGUuCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCisgICAgICogQHBhcmFtIGF0dHJzIEFuIEF0dHJpYnV0ZVNldCBwYXNzZWQgdG8gb3VyIHBhcmVudC4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgcmVzb3VyY2UgSUQuCisgICAgICovCisgICAgcHVibGljIFdlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSwKKyAgICAgICAgICAgIGJvb2xlYW4gcHJpdmF0ZUJyb3dzaW5nKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBudWxsLCBwcml2YXRlQnJvd3NpbmcpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTYxLDUzICs4ODUsMTM0IEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCiAgICAgICogQHBhcmFtIGF0dHJzIEFuIEF0dHJpYnV0ZVNldCBwYXNzZWQgdG8gb3VyIHBhcmVudC4KICAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgcmVzb3VyY2UgSUQuCi0gICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIGlzIGEgTWFwIG9mIGludGFyZWZhY2UgbmFtZXMsIGFzIGtleXMsIGFuZAorICAgICAqIEBwYXJhbSBqYXZhc2NyaXB0SW50ZXJmYWNlcyBpcyBhIE1hcCBvZiBpbnRlcmZhY2UgbmFtZXMsIGFzIGtleXMsIGFuZAogICAgICAqIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhvc2UgaW50ZXJmYWNlcywgYXMgdmFsdWVzLgogICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFdlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YXNjcmlwdEludGVyZmFjZXMpIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YXNjcmlwdEludGVyZmFjZXMsIGJvb2xlYW4gcHJpdmF0ZUJyb3dzaW5nKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7Ci0gICAgICAgIGluaXQoKTsKKworICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCkuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChqYXZhc2NyaXB0SW50ZXJmYWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4cG9zZUFjY2Vzc2liaWxpdHlKYXZhU2NyaXB0QXBpKGphdmFzY3JpcHRJbnRlcmZhY2VzKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1DYWxsYmFja1Byb3h5ID0gbmV3IENhbGxiYWNrUHJveHkoY29udGV4dCwgdGhpcyk7CiAgICAgICAgIG1WaWV3TWFuYWdlciA9IG5ldyBWaWV3TWFuYWdlcih0aGlzKTsKICAgICAgICAgbVdlYlZpZXdDb3JlID0gbmV3IFdlYlZpZXdDb3JlKGNvbnRleHQsIHRoaXMsIG1DYWxsYmFja1Byb3h5LCBqYXZhc2NyaXB0SW50ZXJmYWNlcyk7CiAgICAgICAgIG1EYXRhYmFzZSA9IFdlYlZpZXdEYXRhYmFzZS5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbVNjcm9sbGVyID0gbmV3IE92ZXJTY3JvbGxlcihjb250ZXh0KTsKKyAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGNvbnRleHQpOworICAgICAgICBtWm9vbU1hbmFnZXIgPSBuZXcgWm9vbU1hbmFnZXIodGhpcywgbUNhbGxiYWNrUHJveHkpOwogCisgICAgICAgIC8qIFRoZSBpbml0IG1ldGhvZCBtdXN0IGZvbGxvdyB0aGUgY3JlYXRpb24gb2YgY2VydGFpbiBtZW1iZXIgdmFyaWFibGVzLAorICAgICAgICAgKiBzdWNoIGFzIHRoZSBtWm9vbU1hbmFnZXIuCisgICAgICAgICAqLworICAgICAgICBpbml0KCk7CisgICAgICAgIHNldHVwUGFja2FnZUxpc3RlbmVyKGNvbnRleHQpOwogICAgICAgICB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChjb250ZXh0KTsKKworICAgICAgICBpZiAocHJpdmF0ZUJyb3dzaW5nKSB7CisgICAgICAgICAgICBzdGFydFByaXZhdGVCcm93c2luZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgaW50ZW50IHJlY2VpdmVyIHRoYXQgbW9uaXRvcnMgZm9yIGNoYW5nZXMgdG8gcmVsZXZhbnQgcGFja2FnZXMgKGUuZy4sCisgICAgICogc0dvb2dsZUFwcHMpIGFuZCBub3RpZmllcyBXZWJWaWV3Q29yZSBvZiB0aGVpciBleGlzdGVuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQnJvYWRjYXN0UmVjZWl2ZXIgc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciA9IG51bGw7CisKKyAgICAvKgorICAgICAqIEEgc2V0IG9mIEdvb2dsZSBwYWNrYWdlcyB3ZSBtb25pdG9yIGZvciB0aGUKKyAgICAgKiBuYXZpZ2F0b3IuaXNBcHBsaWNhdGlvbkluc3RhbGxlZCgpIEFQSS4gQWRkIGFkZGl0aW9uYWwgcGFja2FnZXMgYXMKKyAgICAgKiBuZWVkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gc0dvb2dsZUFwcHM7CisgICAgc3RhdGljIHsKKyAgICAgICAgc0dvb2dsZUFwcHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIHNHb29nbGVBcHBzLmFkZCgiY29tLmdvb2dsZS5hbmRyb2lkLnlvdXR1YmUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBQYWNrYWdlTGlzdGVuZXIoQ29udGV4dCBjb250ZXh0KSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogd2UgbXVzdCBzeW5jaHJvbml6ZSB0aGUgaW5zdGFuY2UgY2hlY2sgYW5kIHRoZSBjcmVhdGlvbiBvZiB0aGUKKyAgICAgICAgICogcmVjZWl2ZXIgdG8gZW5zdXJlIHRoYXQgb25seSBPTkUgcmVjZWl2ZXIgZXhpc3RzIGZvciBhbGwgV2ViVmlldworICAgICAgICAgKiBpbnN0YW5jZXMuCisgICAgICAgICAqLworICAgICAgICBzeW5jaHJvbml6ZWQgKFdlYlZpZXcuY2xhc3MpIHsKKworICAgICAgICAgICAgLy8gaWYgdGhlIHJlY2VpdmVyIGFscmVhZHkgZXhpc3RzIHRoZW4gd2UgZG8gbm90IG5lZWQgdG8gcmVnaXN0ZXIgaXQKKyAgICAgICAgICAgIC8vIGFnYWluCisgICAgICAgICAgICBpZiAoc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQURERUQpOworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVNT1ZFRCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkRGF0YVNjaGVtZSgicGFja2FnZSIpOworICAgICAgICAgICAgc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gaW50ZW50LmdldERhdGEoKS5nZXRTY2hlbWVTcGVjaWZpY1BhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZXBsYWNpbmcgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEludGVudC5FWFRSQV9SRVBMQUNJTkcsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVELmVxdWFscyhhY3Rpb24pICYmIHJlcGxhY2luZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVwbGFjaW5nLCByZWZyZXNoUGx1Z2lucygpIHdoZW4gYWRkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc0dvb2dsZUFwcHMuY29udGFpbnMocGFja2FnZU5hbWUpICYmIG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVELmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlJFTU9WRV9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFBsdWdpbk1hbmFnZXIgcG0gPSBQbHVnaW5NYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocG0uY29udGFpbnNQbHVnaW5QZXJtaXNzaW9uQW5kU2lnbmF0dXJlcyhwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtLnJlZnJlc2hQbHVnaW5zKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRC5lcXVhbHMoYWN0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIoc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvZiB0aGUgbW9uaXRvcmVkIGFwcHMgYXJlIGFscmVhZHkgaW5zdGFsbGVkCisgICAgICAgIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBTZXQ8U3RyaW5nPj4gdGFzayA9IG5ldyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgU2V0PFN0cmluZz4+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBkb0luQmFja2dyb3VuZChWb2lkLi4uIHVudXNlZCkgeworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGluc3RhbGxlZFBhY2thZ2VzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFBhY2thZ2VJbmZvPiBwYWNrYWdlcyA9IHBtLmdldEluc3RhbGxlZFBhY2thZ2VzKDApOworICAgICAgICAgICAgICAgIGZvciAoUGFja2FnZUluZm8gcCA6IHBhY2thZ2VzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzR29vZ2xlQXBwcy5jb250YWlucyhwLnBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkUGFja2FnZXMuYWRkKHAucGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZWRQYWNrYWdlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXhlY3V0ZXMgb24gdGhlIFVJIHRocmVhZAorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKFNldDxTdHJpbmc+IGluc3RhbGxlZFBhY2thZ2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5BRERfUEFDS0FHRV9OQU1FUywgaW5zdGFsbGVkUGFja2FnZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdGFzay5leGVjdXRlKCk7CiAgICAgfQogCiAgICAgdm9pZCB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgbVN1cHBvcnRNdWx0aVRvdWNoID0gcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOX01VTFRJVE9VQ0gpCi0gICAgICAgICAgICAgICAgJiYgc2V0dGluZ3Muc3VwcG9ydFpvb20oKSAmJiBzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCk7Ci0gICAgICAgIG1BbGxvd1BhbkFuZFNjYWxlID0gcG0uaGFzU3lzdGVtRmVhdHVyZSgKLSAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOX01VTFRJVE9VQ0hfRElTVElOQ1QpOwotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciA9PSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBuZXcgU2NhbGVHZXN0dXJlRGV0ZWN0b3IoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNjYWxlRGV0ZWN0b3JMaXN0ZW5lcigpKTsKLSAgICAgICAgfSBlbHNlIGlmICghbVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciAhPSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1BY3R1YWxTY2FsZSA8IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIGJvb2xlYW4gY2FuWm9vbU91dCA9IG1BY3R1YWxTY2FsZSA+IG1NaW5ab29tU2NhbGUgJiYgIW1Jblpvb21PdmVydmlldzsKLSAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKLSAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zLCBhcyB3ZWxsIGFzIHRoZSBmaXQgdG8gcGFnZQotICAgICAgICAgICAgLy8gYnV0dG9uLCBpZiB0aGUgcGFnZSBjYW5ub3Qgem9vbQotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXQgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LCBhcyBhIHBhZ2UgbWF5IGJlIGFibGUgdG8gem9vbSBpbgotICAgICAgICAgICAgLy8gb3Igb3V0LgotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOwotICAgICAgICB9CisgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChjb250ZXh0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKQEAgLTEwMjcsNTcgKzEwMzIsMzggQEAKICAgICAgICAgLy8gdXNlIG9uZSBsaW5lIGhlaWdodCwgMTYgYmFzZWQgb24gb3VyIGN1cnJlbnQgZGVmYXVsdCBmb250LCBmb3IgaG93CiAgICAgICAgIC8vIGZhciB3ZSBhbGxvdyBhIHRvdWNoIGJlIGF3YXkgZnJvbSB0aGUgZWRnZSBvZiBhIGxpbmsKICAgICAgICAgbU5hdlNsb3AgPSAoaW50KSAoMTYgKiBkZW5zaXR5KTsKLSAgICAgICAgLy8gZGVuc2l0eSBhZGp1c3RlZCBzY2FsZSBmYWN0b3JzCi0gICAgICAgIERFRkFVTFRfU0NBTEVfUEVSQ0VOVCA9IChpbnQpICgxMDAgKiBkZW5zaXR5KTsKLSAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgIG1BY3R1YWxTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBkZW5zaXR5OwotICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgIERFRkFVTFRfTUFYX1pPT01fU0NBTEUgPSA0LjBmICogZGVuc2l0eTsKLSAgICAgICAgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSA9IDAuMjVmICogZGVuc2l0eTsKLSAgICAgICAgbU1heFpvb21TY2FsZSA9IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7Ci0gICAgICAgIG1NaW5ab29tU2NhbGUgPSBERUZBVUxUX01JTl9aT09NX1NDQUxFOworICAgICAgICBtWm9vbU1hbmFnZXIuaW5pdChkZW5zaXR5KTsKICAgICAgICAgbU1heGltdW1GbGluZyA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKKworICAgICAgICAvLyBDb21wdXRlIHRoZSBpbnZlcnNlIG9mIHRoZSBkZW5zaXR5IHNxdWFyZWQuCisgICAgICAgIERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQgPSAxIC8gKGRlbnNpdHkgKiBkZW5zaXR5KTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVyU2Nyb2xsTW9kZShpbnQgbW9kZSkgewotICAgICAgICBzdXBlci5zZXRPdmVyU2Nyb2xsTW9kZShtb2RlKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUl9TQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZWRnZSA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm92ZXJzY3JvbGxfZWRnZSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZ2xvdyA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm92ZXJzY3JvbGxfZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0ID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0ID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0ID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0ID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBFeHBvc2VzIGFjY2Vzc2liaWxpdHkgQVBJcyB0byBKYXZhU2NyaXB0IGJ5IGFwcGVuZGluZyB0aGVtIHRvIHRoZSBKYXZhU2NyaXB0CisgICAgICogaW50ZXJmYWNlcyBtYXAgcHJvdmlkZWQgYnkgdGhlIFdlYlZpZXcgY2xpZW50LiBJbiBjYXNlIG9mIGNvbmZsaWN0aW5nCisgICAgICogYWxpYXMgd2l0aCB0aGUgb25lIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSSB0aGUgdXNlciBzcGVjaWZpZWQgb25lIHdpbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YXNjcmlwdEludGVyZmFjZXMgQSBtYXAgd2l0aCBpbnRlcmZhY2VzIHRvIGJlIGV4cG9zZWQgdG8gSmF2YVNjcmlwdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhwb3NlQWNjZXNzaWJpbGl0eUphdmFTY3JpcHRBcGkoTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcykgeworICAgICAgICBpZiAoamF2YXNjcmlwdEludGVyZmFjZXMuY29udGFpbnNLZXkoQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UpKSB7CisgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJKYXZhU2NyaXB0IGludGVyZmFjZSBtYXBwZWQgdG8gXCIiICsgQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgb3ZlcnJpZGVzIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSSBKYXZhU2NyaXB0IGludGVyZmFjZS4gTm8gYWNjZXNzaWJpbGl0eSIKKyAgICAgICAgICAgICAgICAgICAgKyAiQVBJIHdpbGwgYmUgZXhwb3NlZCB0byBKYXZhU2NyaXB0ISIpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKKyAgICAgICAgLy8gZXhwb3NlIHRoZSBUVFMgZm9yIG5vdyAuLi4KKyAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMucHV0KEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgIG5ldyBUZXh0VG9TcGVlY2goZ2V0Q29udGV4dCgpLCBudWxsKSk7CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqL3ZvaWQgdXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGludCB6b29tRGVuc2l0eSkgewotICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eQorICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5CiAgICAgICAgICAgICAgICAgKiAxMDAgLyB6b29tRGVuc2l0eTsKLSAgICAgICAgaWYgKE1hdGguYWJzKGRlbnNpdHkgLSBtRGVmYXVsdFNjYWxlKSA+IDAuMDEpIHsKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gZGVuc2l0eSAvIG1EZWZhdWx0U2NhbGU7Ci0gICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGxpbWl0cwotICAgICAgICAgICAgbU5hdlNsb3AgPSAoaW50KSAoMTYgKiBkZW5zaXR5KTsKLSAgICAgICAgICAgIERFRkFVTFRfU0NBTEVfUEVSQ0VOVCA9IChpbnQpICgxMDAgKiBkZW5zaXR5KTsKLSAgICAgICAgICAgIERFRkFVTFRfTUFYX1pPT01fU0NBTEUgPSA0LjBmICogZGVuc2l0eTsKLSAgICAgICAgICAgIERFRkFVTFRfTUlOX1pPT01fU0NBTEUgPSAwLjI1ZiAqIGRlbnNpdHk7Ci0gICAgICAgICAgICBtRGVmYXVsdFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgICAgIG1NYXhab29tU2NhbGUgKj0gc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBtTWluWm9vbVNjYWxlICo9IHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSAqIHNjYWxlRmFjdG9yLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0KKyAgICAgICAgbU5hdlNsb3AgPSAoaW50KSAoMTYgKiBkZW5zaXR5KTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShkZW5zaXR5KTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gb25TYXZlUGFzc3dvcmQoU3RyaW5nIHNjaGVtZVBsdXNIb3N0LCBTdHJpbmcgdXNlcm5hbWUsCkBAIC0xMTk0LDE2ICsxMTgwLDE3IEBACiAgICAgICogcmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSB0aXRsZWJhcnZpZXcgKGlmIGFueSkuIERvZXMgbm90IGNhcmUgYWJvdXQKICAgICAgKiBzY3JvbGxpbmcKICAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRUaXRsZUhlaWdodCgpIHsKKyAgICBpbnQgZ2V0VGl0bGVIZWlnaHQoKSB7CiAgICAgICAgIHJldHVybiBtVGl0bGVCYXIgIT0gbnVsbCA/IG1UaXRsZUJhci5nZXRIZWlnaHQoKSA6IDA7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiB0aGUgdGl0bGViYXJ2aWV3IChpZiBhbnkpIHRoYXQgaXMgdmlzaWJsZQorICAgICAqCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKSB7Ci0gICAgICAgIC8vIG5lZWQgdG8gcmVzdHJpY3QgbVNjcm9sbFkgZHVlIHRvIG92ZXIgc2Nyb2xsCi0gICAgICAgIHJldHVybiBNYXRoLm1heChnZXRUaXRsZUhlaWdodCgpIC0gTWF0aC5tYXgoMCwgbVNjcm9sbFkpLCAwKTsKKyAgICBwdWJsaWMgaW50IGdldFZpc2libGVUaXRsZUhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KGdldFRpdGxlSGVpZ2h0KCkgLSBtU2Nyb2xsWSwgMCk7CiAgICAgfQogCiAgICAgLyoKQEAgLTEyODQsOSArMTI3MSwyNyBAQAogICAgICAgICByZXR1cm4gbURhdGFiYXNlLmdldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChob3N0LCByZWFsbSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmVtb3ZlIEZpbmQgb3IgU2VsZWN0IEFjdGlvbk1vZGVzLCBpZiBhY3RpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyQWN0aW9uTW9kZXMoKSB7CisgICAgICAgIGlmIChtU2VsZWN0Q2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdENhbGxiYWNrLmZpbmlzaCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtRmluZENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1GaW5kQ2FsbGJhY2suZmluaXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gY2xlYXIgc3RhdGUgd2hlbiBtb3ZpbmcgZnJvbSBvbmUgcGFnZSB0byBhbm90aGVyLCBvciBjaGFuZ2luZworICAgICAqIGluIHNvbWUgb3RoZXIgd2F5IHRoYXQgbWFrZXMgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHBhZ2UKKyAgICAgKiAoc3VjaCBhcyBXZWJUZXh0VmlldyBvciBBY3Rpb25Nb2Rlcykgbm8gbG9uZ2VyIHJlbGV2YW50LgorICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjbGVhckhlbHBlcnMoKSB7Ci0gICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgc2VsZWN0aW9uRG9uZSgpOworICAgICAgICBjbGVhclRleHRFbnRyeSgpOworICAgICAgICBjbGVhckFjdGlvbk1vZGVzKCk7CisgICAgICAgIGRpc21pc3NGdWxsU2NyZWVuTW9kZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI5Niw2ICsxMzAxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewogICAgICAgICBjbGVhckhlbHBlcnMoKTsKKwogICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIFNldCB0aGUgaGFuZGxlcnMgdG8gbnVsbCBiZWZvcmUgZGVzdHJveWluZyBXZWJWaWV3Q29yZSBzbyBubwogICAgICAgICAgICAgLy8gbW9yZSBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZC4KQEAgLTE0MjMsNiArMTQyOSw4IEBACiAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoImNlcnRpZmljYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2xDZXJ0aWZpY2F0ZS5zYXZlU3RhdGUobUNlcnRpZmljYXRlKSk7CiAgICAgICAgIH0KKyAgICAgICAgb3V0U3RhdGUucHV0Qm9vbGVhbigicHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIsIGlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnNhdmVab29tU3RhdGUob3V0U3RhdGUpOwogICAgICAgICByZXR1cm4gbGlzdDsKICAgICB9CiAKQEAgLTE0NjgsMjkgKzE0NzYsMjMgQEAKICAgICAgICAgLy8gbm93IHVwZGF0ZSB0aGUgYnVuZGxlCiAgICAgICAgIGIucHV0SW50KCJzY3JvbGxYIiwgbVNjcm9sbFgpOwogICAgICAgICBiLnB1dEludCgic2Nyb2xsWSIsIG1TY3JvbGxZKTsKLSAgICAgICAgYi5wdXRGbG9hdCgic2NhbGUiLCBtQWN0dWFsU2NhbGUpOwotICAgICAgICBiLnB1dEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgbVRleHRXcmFwU2NhbGUpOwotICAgICAgICBiLnB1dEJvb2xlYW4oIm92ZXJ2aWV3IiwgbUluWm9vbU92ZXJ2aWV3KTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnNhdmVab29tU3RhdGUoYik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXN0b3JlSGlzdG9yeVBpY3R1cmVGaWVsZHMoUGljdHVyZSBwLCBCdW5kbGUgYikgewogICAgICAgICBpbnQgc3ggPSBiLmdldEludCgic2Nyb2xsWCIsIDApOwogICAgICAgICBpbnQgc3kgPSBiLmdldEludCgic2Nyb2xsWSIsIDApOwotICAgICAgICBmbG9hdCBzY2FsZSA9IGIuZ2V0RmxvYXQoInNjYWxlIiwgMS4wZik7CisKICAgICAgICAgbURyYXdIaXN0b3J5ID0gdHJ1ZTsKICAgICAgICAgbUhpc3RvcnlQaWN0dXJlID0gcDsKICAgICAgICAgbVNjcm9sbFggPSBzeDsKICAgICAgICAgbVNjcm9sbFkgPSBzeTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnJlc3RvcmVab29tU3RhdGUoYik7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgICAgIG1IaXN0b3J5V2lkdGggPSBNYXRoLnJvdW5kKHAuZ2V0V2lkdGgoKSAqIHNjYWxlKTsKICAgICAgICAgbUhpc3RvcnlIZWlnaHQgPSBNYXRoLnJvdW5kKHAuZ2V0SGVpZ2h0KCkgKiBzY2FsZSk7Ci0gICAgICAgIC8vIGFzIGdldFdpZHRoKCkgLyBnZXRIZWlnaHQoKSBvZiB0aGUgdmlldyBhcmUgbm90IGF2YWlsYWJsZSB5ZXQsIHNldCB1cAotICAgICAgICAvLyBtQWN0dWFsU2NhbGUsIHNvIHRoYXQgd2hlbiBvblNpemVDaGFuZ2VkKCkgaXMgY2FsbGVkLCB0aGUgcmVzdCB3aWxsCi0gICAgICAgIC8vIGJlIHNldCBjb3JyZWN0bHkKLSAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7Ci0gICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLSAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBiLmdldEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgc2NhbGUpOwotICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBiLmdldEJvb2xlYW4oIm92ZXJ2aWV3Iik7CisKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIApAQCAtMTU5MSw2ICsxNTkzLDExIEBACiAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb3B5IHRvIGhhdmUgdGhlIGNvcnJlY3QgaW5kZXguCiAgICAgICAgICAgICAgICAgcmV0dXJuTGlzdC5zZXRDdXJyZW50SW5kZXgoaW5kZXgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVzdG9yZSBwcml2YXRlIGJyb3dzaW5nIHNldHRpbmcuCisgICAgICAgICAgICBpZiAoaW5TdGF0ZS5nZXRCb29sZWFuKCJwcml2YXRlQnJvd3NpbmdFbmFibGVkIikpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXR0aW5ncygpLnNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIucmVzdG9yZVpvb21TdGF0ZShpblN0YXRlKTsKICAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgcGVuZGluZyBtZXNzYWdlcyBiZWNhdXNlIHdlIGFyZSByZXN0b3JpbmcgcHJldmlvdXMKICAgICAgICAgICAgIC8vIHN0YXRlLgogICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnJlbW92ZU1lc3NhZ2VzKCk7CkBAIC0xNzAyLDYgKzE3MDksNDUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY3VycmVudCB2aWV3IGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIHNhdmVXZWJBcmNoaXZlKGZpbGVuYW1lLCBmYWxzZSwgbnVsbCk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgU2F2ZVdlYkFyY2hpdmVNZXNzYWdlIHsKKyAgICAgICAgU2F2ZVdlYkFyY2hpdmVNZXNzYWdlIChTdHJpbmcgYmFzZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUsIFZhbHVlQ2FsbGJhY2s8U3RyaW5nPiBjYWxsYmFjaykgeworICAgICAgICAgICAgbUJhc2VuYW1lID0gYmFzZW5hbWU7CisgICAgICAgICAgICBtQXV0b25hbWUgPSBhdXRvbmFtZTsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBTdHJpbmcgbUJhc2VuYW1lOworICAgICAgICAvKiBwYWNrYWdlICovIGZpbmFsIGJvb2xlYW4gbUF1dG9uYW1lOworICAgICAgICAvKiBwYWNrYWdlICovIGZpbmFsIFZhbHVlQ2FsbGJhY2s8U3RyaW5nPiBtQ2FsbGJhY2s7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIG1SZXN1bHRGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHZpZXcgYXMgYSB3ZWIgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlbmFtZSBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gYXV0b25hbWUgSWYgZmFsc2UsIHRha2VzIGJhc2VuYW1lIHRvIGJlIGEgZmlsZS4gSWYgdHJ1ZSwgYmFzZW5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgaXMgYXNzdW1lZCB0byBiZSBhIGRpcmVjdG9yeSBpbiB3aGljaCBhIGZpbGVuYW1lIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgY2hvc2VuIGFjY29yZGluZyB0byB0aGUgdXJsIG9mIHRoZSBjdXJyZW50IHBhZ2UuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxlZCBhZnRlciB0aGUgd2ViIGFyY2hpdmUgaGFzIGJlZW4gc2F2ZWQuIFRoZQorICAgICAqICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgZm9yIG9uUmVjZWl2ZVZhbHVlIHdpbGwgZWl0aGVyIGJlIHRoZSBmaWxlbmFtZQorICAgICAqICAgICAgICAgICAgICAgICB1bmRlciB3aGljaCB0aGUgZmlsZSB3YXMgc2F2ZWQsIG9yIG51bGwgaWYgc2F2aW5nIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBmaWxlIGZhaWxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgYmFzZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUsIFZhbHVlQ2FsbGJhY2s8U3RyaW5nPiBjYWxsYmFjaykgeworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0FWRV9XRUJBUkNISVZFLAorICAgICAgICAgICAgbmV3IFNhdmVXZWJBcmNoaXZlTWVzc2FnZShiYXNlbmFtZSwgYXV0b25hbWUsIGNhbGxiYWNrKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU3RvcCB0aGUgY3VycmVudCBsb2FkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0b3BMb2FkaW5nKCkgewpAQCAtMTgwMSw2ICsxODQ3LDQ4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkIGluIHRoaXMgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRTZXR0aW5ncygpLmlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFByaXZhdGVCcm93c2luZygpIHsKKyAgICAgICAgYm9vbGVhbiB3YXNQcml2YXRlQnJvd3NpbmdFbmFibGVkID0gaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCk7CisKKyAgICAgICAgZ2V0U2V0dGluZ3MoKS5zZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKHRydWUpOworCisgICAgICAgIGlmICghd2FzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCkgeworICAgICAgICAgICAgbG9hZFVybCgiYnJvd3NlcjppbmNvZ25pdG8iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZXMgYW55IGZpbGVzIHRoYXQgd2VyZSBjcmVhdGVkIGFzIGEgcGFydCBvZiB0aGUgbGFzdCBwcml2YXRlCisgICAgICogYnJvd3Npbmcgc2Vzc2lvbiBhbmQgY2xlYXJzIGFueSBpbnRlcm5hbCBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhhdAorICAgICAqIHNlc3Npb24uIFRoZSBjb25zZXF1ZW5jZXMgb2YgY2FsbGluZyB0aGlzIG1ldGhvZCB3aGlsZSBhIHByaXZhdGUKKyAgICAgKiBicm93c2luZyBzZXNzaW9uIGlzIGFjdGl2ZSBhcmUgdW5zcGVjaWZpZWQuCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIHNhbWUgY29udGV4dCB3aGljaCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHByaXZhdGUKKyAgICAgKiAgICAgICAgICAgICAgICBicm93c2luZyBXZWJWaWV3LgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcHJpdmF0ZSBicm93c2luZyBmaWxlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBkZWxldGVkLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNsZWFudXBQcml2YXRlQnJvd3NpbmdGaWxlcyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gSXQgc2VlbXMgd3JvbmcgdGhhdCB3ZSBoYXZlIHRvIHBhc3MgdGhlIHN0b3JhZ2UgbG9jYXRpb25zIGhlcmUsIGdpdmVuCisgICAgICAgIC8vIHRoYXQgdGhlIHN0b3JhZ2UgZmlsZXMgYXJlIGNyZWF0ZWQgbmF0aXZlLXNpZGUgaW4gV2ViUmVxdWVzdENvbnRleHQKKyAgICAgICAgLy8gKGFsYmVpdCB1c2luZyBhIGR1bWIgZ2V0dGVyIG9uIEJyb3dzZXJGcmFtZSB0byBnZXQgdGhlIHBhdGhzIGZyb20KKyAgICAgICAgLy8gSmF2YSkuIEl0IGxvb2tzIGxpa2UgdGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHdlIG1heSBuZWVkIHRvIGNhbGwKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBCcm93c2VyRnJhbWUgaGFzIGJlZW4gc2V0IHVwLgorICAgICAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSB3aGV0aGVyIHRoaXMgY2FuIGJlIGF2b2lkZWQuCisgICAgICAgIHJldHVybiBuYXRpdmVDbGVhbnVwUHJpdmF0ZUJyb3dzaW5nRmlsZXMoY29udGV4dC5nZXREYXRhYmFzZVBhdGgoImR1bW15IikuZ2V0UGFyZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRDYWNoZURpcigpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVDbGVhbnVwUHJpdmF0ZUJyb3dzaW5nRmlsZXMoU3RyaW5nIGRhdGFiYXNlRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2FjaGVEaXJlY3RvcnkpOworCiAgICAgcHJpdmF0ZSBib29sZWFuIGV4dGVuZFNjcm9sbChpbnQgeSkgewogICAgICAgICBpbnQgZmluYWxZID0gbVNjcm9sbGVyLmdldEZpbmFsWSgpOwogICAgICAgICBpbnQgbmV3WSA9IHBpbkxvY1koZmluYWxZICsgeSk7CkBAIC0xODQ4LDcgKzE5MzYsNyBAQAogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZUNsZWFyQ3Vyc29yKCk7IC8vIHN0YXJ0IG5leHQgdHJhY2tiYWxsIG1vdmVtZW50IGZyb20gcGFnZSBlZGdlCiAgICAgICAgIGlmIChib3R0b20pIHsKLSAgICAgICAgICAgIHJldHVybiBwaW5TY3JvbGxUbyhtU2Nyb2xsWCwgY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCksIHRydWUsIDApOworICAgICAgICAgICAgcmV0dXJuIHBpblNjcm9sbFRvKG1TY3JvbGxYLCBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpLCB0cnVlLCAwKTsKICAgICAgICAgfQogICAgICAgICAvLyBQYWdlIGRvd24uCiAgICAgICAgIGludCBoID0gZ2V0SGVpZ2h0KCk7CkBAIC0xODcwLDYgKzE5NTgsNyBAQAogICAgIHB1YmxpYyB2b2lkIGNsZWFyVmlldygpIHsKICAgICAgICAgbUNvbnRlbnRXaWR0aCA9IDA7CiAgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gMDsKKyAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwKSBuYXRpdmVTZXRCYXNlTGF5ZXIoMCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5DTEVBUl9DT05URU5UKTsKICAgICB9CiAKQEAgLTE4ODMsOCArMTk3Miw5IEBACiAgICAgICogICAgICAgICBib3VuZHMgb2YgdGhlIHZpZXcuCiAgICAgICovCiAgICAgcHVibGljIFBpY3R1cmUgY2FwdHVyZVBpY3R1cmUoKSB7Ci0gICAgICAgIGlmIChudWxsID09IG1XZWJWaWV3Q29yZSkgcmV0dXJuIG51bGw7IC8vIGNoZWNrIGZvciBvdXQgb2YgbWVtb3J5IHRhYgotICAgICAgICByZXR1cm4gbVdlYlZpZXdDb3JlLmNvcHlDb250ZW50UGljdHVyZSgpOworICAgICAgICBQaWN0dXJlIHJlc3VsdCA9IG5ldyBQaWN0dXJlKCk7CisgICAgICAgIG5hdGl2ZUNvcHlCYXNlQ29udGVudFRvUGljdHVyZShyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg5NiwxNSArMTk4NiwxMyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4KLSAgICAgKiBAcGFyYW0gZGlzYWJsZUZvY3VzQ29udHJvbGxlciBJZiB0cnVlLCBzZW5kIGEgbWVzc2FnZSB0byB3ZWJraXQKLSAgICAgKiAgICAgZGlzYWJsaW5nIHRoZSBmb2N1cyBjb250cm9sbGVyLCBzbyB0aGUgY2FyZXQgc3RvcHMgYmxpbmtpbmcuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyVGV4dEVudHJ5KGJvb2xlYW4gZGlzYWJsZUZvY3VzQ29udHJvbGxlcikgeworICAgIHByaXZhdGUgdm9pZCBjbGVhclRleHRFbnRyeSgpIHsKICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgbVdlYlRleHRWaWV3LnJlbW92ZSgpOwotICAgICAgICAgICAgaWYgKGRpc2FibGVGb2N1c0NvbnRyb2xsZXIpIHsKLSAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJJbmFjdGl2ZSgpOwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIGtleWJvYXJkIG1heSBiZSBvcGVuIHdpdGggdGhlIFdlYlZpZXcgYXMgdGhlIHNlcnZlZCB2aWV3CisgICAgICAgICAgICBoaWRlU29mdEtleWJvYXJkKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5MTMsNyArMjAwMSw3IEBACiAgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0U2NhbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGU7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5MjUsNyArMjAxMyw3IEBACiAgICAgICogQHBhcmFtIHNjYWxlSW5QZXJjZW50IFRoZSBpbml0aWFsIHNjYWxlIGluIHBlcmNlbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNjYWxlKGludCBzY2FsZUluUGVyY2VudCkgewotICAgICAgICBtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID0gc2NhbGVJblBlcmNlbnQ7CisgICAgICAgIG1ab29tTWFuYWdlci5zZXRJbml0aWFsU2NhbGVJblBlcmNlbnQoc2NhbGVJblBlcmNlbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkzOCwxNCArMjAyNiw4IEBACiAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJUaGlzIFdlYlZpZXcgZG9lc24ndCBzdXBwb3J0IHpvb20uIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOwotICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgIGdldFpvb21CdXR0b25zQ29udHJvbGxlcigpLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgfQorICAgICAgICBjbGVhckhlbHBlcnMoKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmludm9rZVpvb21QaWNrZXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwNjAsNyArMjE0Miw3IEBACiAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgeworICAgIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgewogLy8gICAgICAgIExvZy5kKExPR1RBRywgIi0tIHBpbkxvYyAiICsgeCArICIgIiArIHZpZXdNYXggKyAiICIgKyBkb2NNYXgpOwogICAgICAgICBpZiAoZG9jTWF4IDwgdmlld01heCkgeyAgIC8vIHRoZSBkb2MgaGFzIHJvb20gb24gdGhlIHNpZGVzIGZvciAiYmxhbmsiCiAgICAgICAgICAgICAvLyBwaW4gdGhlIHNob3J0IGRvY3VtZW50IHRvIHRoZSB0b3AvbGVmdCBvZiB0aGUgc2NyZWVuCkBAIC0yMDc3LDE2ICsyMTU5LDE0IEBACiAgICAgfQogCiAgICAgLy8gRXhwZWN0cyB4IGluIHZpZXcgY29vcmRpbmF0ZXMKLSAgICBwcml2YXRlIGludCBwaW5Mb2NYKGludCB4KSB7Ci0gICAgICAgIGlmIChtSW5PdmVyU2Nyb2xsTW9kZSkgcmV0dXJuIHg7Ci0gICAgICAgIHJldHVybiBwaW5Mb2MoeCwgZ2V0Vmlld1dpZHRoKCksIGNvbXB1dGVSZWFsSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkpOworICAgIGludCBwaW5Mb2NYKGludCB4KSB7CisgICAgICAgIHJldHVybiBwaW5Mb2MoeCwgZ2V0Vmlld1dpZHRoKCksIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSk7CiAgICAgfQogCiAgICAgLy8gRXhwZWN0cyB5IGluIHZpZXcgY29vcmRpbmF0ZXMKLSAgICBwcml2YXRlIGludCBwaW5Mb2NZKGludCB5KSB7Ci0gICAgICAgIGlmIChtSW5PdmVyU2Nyb2xsTW9kZSkgcmV0dXJuIHk7CisgICAgaW50IHBpbkxvY1koaW50IHkpIHsKICAgICAgICAgcmV0dXJuIHBpbkxvYyh5LCBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTExLDYgKzIxOTEsMTYgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVtYmVkZGVkVGl0bGVCYXIoVmlldyB2KSB7CisgICAgICAgIGlmIChudWxsID09IHYpIHsKKyAgICAgICAgICAgIC8vIElmIG9uZSBvZiBvdXIgY2FsbGJhY2tzIGlzIGhvbGRpbmcgb250byB0aGUgdGl0bGViYXIgdG8gcmVwbGFjZQorICAgICAgICAgICAgLy8gaXQgd2hlbiBpdHMgQWN0aW9uTW9kZSBlbmRzLCByZW1vdmUgaXQuCisgICAgICAgICAgICBpZiAobVNlbGVjdENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0Q2FsbGJhY2suc2V0VGl0bGVCYXIobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUZpbmRDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUZpbmRDYWxsYmFjay5zZXRUaXRsZUJhcihudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAobVRpdGxlQmFyID09IHYpIHJldHVybjsKICAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSB7CiAgICAgICAgICAgICByZW1vdmVWaWV3KG1UaXRsZUJhcik7CkBAIC0yMTM0LDcgKzIyMjQsNyBAQAogICAgICAqIGhlaWdodC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCB2aWV3VG9Db250ZW50RGltZW5zaW9uKGludCBkKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE2MCw3ICsyMjUwLDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBmbG9hdC4KICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IHZpZXdUb0NvbnRlbnRYZihpbnQgeCkgewotICAgICAgICByZXR1cm4geCAqIG1JbnZBY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuIHggKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNjksNyArMjI1OSw3IEBACiAgICAgICogZW1iZWRkZWQgaW50byB0aGUgV2ViVmlldy4gUmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgZmxvYXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3VG9Db250ZW50WWYoaW50IHkpIHsKLSAgICAgICAgcmV0dXJuICh5IC0gZ2V0VGl0bGVIZWlnaHQoKSkgKiBtSW52QWN0dWFsU2NhbGU7CisgICAgICAgIHJldHVybiAoeSAtIGdldFRpdGxlSGVpZ2h0KCkpICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTc5LDcgKzIyNjksNyBAQAogICAgICAqIGhlaWdodC4KICAgICAgKi8KICAgICAvKnBhY2thZ2UqLyBpbnQgY29udGVudFRvVmlld0RpbWVuc2lvbihpbnQgZCkgewotICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMjAsNyArMjMxMCw3IEBACiAgICAgLy8gQ2FsbGVkIGJ5IEpOSSB0byBpbnZhbGlkYXRlIHRoZSBWaWV3LCBnaXZlbiByZWN0YW5nbGUgY29vcmRpbmF0ZXMgaW4KICAgICAvLyBjb250ZW50IHNwYWNlCiAgICAgcHJpdmF0ZSB2b2lkIHZpZXdJbnZhbGlkYXRlKGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgICAgICBmaW5hbCBpbnQgZHkgPSBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICBpbnZhbGlkYXRlKChpbnQpTWF0aC5mbG9vcihsICogc2NhbGUpLAogICAgICAgICAgICAgICAgICAgIChpbnQpTWF0aC5mbG9vcih0ICogc2NhbGUpICsgZHksCkBAIC0yMjMxLDcgKzIzMjEsNyBAQAogICAgIC8vIENhbGxlZCBieSBKTkkgdG8gaW52YWxpZGF0ZSB0aGUgVmlldyBhZnRlciBhIGRlbGF5LCBnaXZlbiByZWN0YW5nbGUKICAgICAvLyBjb29yZGluYXRlcyBpbiBjb250ZW50IHNwYWNlCiAgICAgcHJpdmF0ZSB2b2lkIHZpZXdJbnZhbGlkYXRlRGVsYXllZChsb25nIGRlbGF5LCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICAgICAgZmluYWwgaW50IGR5ID0gZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgcG9zdEludmFsaWRhdGVEZWxheWVkKGRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClNYXRoLmZsb29yKGwgKiBzY2FsZSksCkBAIC0yMjY5LDEzICsyMzU5LDcgQEAKICAgICAgICAgICAgIC8vIHVwZGF0ZWQgd2hlbiB3ZSBnZXQgb3V0IG9mIHRoYXQgbW9kZS4KICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICAgICAgLy8gcmVwaW4gb3VyIHNjcm9sbCwgdGFraW5nIGludG8gYWNjb3VudCB0aGUgbmV3IGNvbnRlbnQgc2l6ZQotICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWCA9IHBpbkxvY1gobVNjcm9sbFgpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gcGluTG9jWShtU2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgewotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMocGluTG9jWChtU2Nyb2xsWCksIHBpbkxvY1kobVNjcm9sbFkpKTsKICAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlci5pc0ZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzY3JvbGwuICBSZXBpbiB0aGUgZmluYWwgc2Nyb2xsCiAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLgpAQCAtMjI4Nyw3NyArMjM3MSwxMiBAQAogICAgICAgICBjb250ZW50U2l6ZUNoYW5nZWQodXBkYXRlTGF5b3V0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0TmV3Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHVwZGF0ZVRleHRXcmFwU2NhbGUsCi0gICAgICAgICAgICBib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgICAgIC8vIHNldCBtSW5ab29tT3ZlcnZpZXcgZm9yIG5vbiBtb2JpbGUgc2l0ZXMKLSAgICAgICAgICAgIGlmIChzY2FsZSA8IG1EZWZhdWx0U2NhbGUpIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVwZGF0ZVRleHRXcmFwU2NhbGUpIHsKLSAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gc2NhbGU7Ci0gICAgICAgICAgICAvLyByZXNldCBtTGFzdEhlaWdodFNlbnQgdG8gZm9yY2UgVklFV19TSVpFX0NIQU5HRUQgc2VudCB0byBXZWJLaXQKLSAgICAgICAgICAgIG1MYXN0SGVpZ2h0U2VudCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSB8fCBmb3JjZSkgewotICAgICAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgIC8vIElmIGhpc3RvcnkgUGljdHVyZSBpcyBkcmF3biwgZG9uJ3QgdXBkYXRlIHNjcm9sbC4gVGhleSB3aWxsCi0gICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgotICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOwotICAgICAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLSAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc2Nyb2xsIHNvIHdlIGRvbid0IGFwcGVhciB0byBqdW1wCi0gICAgICAgICAgICAgICAgLy8gaS5lLiBrZWVwIHRoZSBjZW50ZXIgb2YgdGhlIGRvYyBpbiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3Ci0KLSAgICAgICAgICAgICAgICBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSBzY2FsZSAqIG1JbnZBY3R1YWxTY2FsZTsgICAvLyBvbGQgaW52ZXJzZQotICAgICAgICAgICAgICAgIGZsb2F0IHN4ID0gcmF0aW8gKiBvbGRYICsgKHJhdGlvIC0gMSkgKiBtWm9vbUNlbnRlclg7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc3kgPSByYXRpbyAqIG9sZFkgKyAocmF0aW8gLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgKiAobVpvb21DZW50ZXJZIC0gZ2V0VGl0bGVIZWlnaHQoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIG91ciBuZXcgc2NhbGUgYW5kIGludmVyc2UKLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlICYmICFtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uU2NhbGVDaGFuZ2VkKG1BY3R1YWxTY2FsZSwgc2NhbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gc2NhbGU7Ci0KLSAgICAgICAgICAgICAgICAvLyBTY2FsZSBhbGwgdGhlIGNoaWxkIHZpZXdzCi0gICAgICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnNjYWxlQWxsKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBoYXZlIGFuaW1hdGlvbiBmb3Igc2NhbGluZywgZG9uJ3QgZG8gYW5pbWF0aW9uCi0gICAgICAgICAgICAgICAgLy8gZm9yIHNjcm9sbGluZywgYXMgaXQgY2F1c2VzIHdlaXJkIGludGVybWVkaWF0ZSBzdGF0ZQotICAgICAgICAgICAgICAgIC8vICAgICAgICBwaW5TY3JvbGxUbyhNYXRoLnJvdW5kKHN4KSwgTWF0aC5yb3VuZChzeSkpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxYID0gcGluTG9jWChNYXRoLnJvdW5kKHN4KSk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFkgPSBwaW5Mb2NZKE1hdGgucm91bmQoc3kpKTsKLQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB3ZWJraXQKLSAgICAgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYWRqdXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gem9vbSBhbmltYXRpb24uIEJ1dCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgV2ViS2l0IGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHpvb20gYW5pbWF0aW9uLiBTZWUgY29tbWVudHMgaW4gb25TY2FsZUVuZCgpLgotICAgICAgICAgICAgICAgICAgICBzZW5kT3VyVmlzaWJsZVJlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gVXNlZCB0byBhdm9pZCBzZW5kaW5nIG1hbnkgdmlzaWJsZSByZWN0IG1lc3NhZ2VzLgogICAgIHByaXZhdGUgUmVjdCBtTGFzdFZpc2libGVSZWN0U2VudDsKICAgICBwcml2YXRlIFJlY3QgbUxhc3RHbG9iYWxSZWN0OwogCi0gICAgcHJpdmF0ZSBSZWN0IHNlbmRPdXJWaXNpYmxlUmVjdCgpIHsKLSAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHJldHVybiBtTGFzdFZpc2libGVSZWN0U2VudDsKKyAgICBSZWN0IHNlbmRPdXJWaXNpYmxlUmVjdCgpIHsKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1ByZXZlbnRpbmdXZWJraXRVcGRhdGVzKCkpIHJldHVybiBtTGFzdFZpc2libGVSZWN0U2VudDsKIAogICAgICAgICBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOwogICAgICAgICBjYWxjT3VyQ29udGVudFZpc2libGVSZWN0KHJlY3QpOwpAQCAtMjM5MCwxNSArMjQwOSwxMiBAQAogICAgICAgICBQb2ludCBwID0gbmV3IFBvaW50KCk7CiAgICAgICAgIGdldEdsb2JhbFZpc2libGVSZWN0KHIsIHApOwogICAgICAgICByLm9mZnNldCgtcC54LCAtcC55KTsKLSAgICAgICAgaWYgKG1GaW5kSXNVcCkgewotICAgICAgICAgICAgci5ib3R0b20gLT0gbUZpbmRIZWlnaHQ7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvLyBTZXRzIHIgdG8gYmUgb3VyIHZpc2libGUgcmVjdGFuZ2xlIGluIGNvbnRlbnQgY29vcmRpbmF0ZXMKICAgICBwcml2YXRlIHZvaWQgY2FsY091ckNvbnRlbnRWaXNpYmxlUmVjdChSZWN0IHIpIHsKICAgICAgICAgY2FsY091clZpc2libGVSZWN0KHIpOwotICAgICAgICAvLyBzaW5jZSB3ZSBtaWdodCBvdmVyc2Nyb2xsLCBwaW4gdGhlIHJlY3QgdG8gdGhlIGJvdW5kcyBvZiB0aGUgY29udGVudAorICAgICAgICAvLyBwaW4gdGhlIHJlY3QgdG8gdGhlIGJvdW5kcyBvZiB0aGUgY29udGVudAogICAgICAgICByLmxlZnQgPSBNYXRoLm1heCh2aWV3VG9Db250ZW50WChyLmxlZnQpLCAwKTsKICAgICAgICAgLy8gdmlld1RvQ29udGVudFkgd2lsbCByZW1vdmUgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgdGl0bGUgYmFyLiAgQWRkCiAgICAgICAgIC8vIHRoZSB2aXNpYmxlIGhlaWdodCBiYWNrIGluIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgaWYgdGhlIHRpdGxlCkBAIC0yNDM5LDE2ICsyNDU1LDE5IEBACiAKICAgICAvKioKICAgICAgKiBDb21wdXRlIHVuem9vbWVkIHdpZHRoIGFuZCBoZWlnaHQsIGFuZCBpZiB0aGV5IGRpZmZlciBmcm9tIHRoZSBsYXN0Ci0gICAgICogdmFsdWVzIHdlIHNlbnQsIHNlbmQgdGhlbSB0byB3ZWJraXQgKHRvIGJlIHVzZWQgaGFzIG5ldyB2aWV3cG9ydCkKKyAgICAgKiB2YWx1ZXMgd2Ugc2VudCwgc2VuZCB0aGVtIHRvIHdlYmtpdCAodG8gYmUgdXNlZCBhcyBuZXcgdmlld3BvcnQpCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9yY2UgZW5zdXJlcyB0aGF0IHRoZSBtZXNzYWdlIGlzIHNlbnQgdG8gd2Via2l0IGV2ZW4gaWYgdGhlIHdpZHRoCisgICAgICogb3IgaGVpZ2h0IGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBtZXNzYWdlCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmV3IHZhbHVlcyB3ZXJlIHNlbnQKICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFZpZXdTaXplWm9vbSgpIHsKLSAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHJldHVybiBmYWxzZTsKKyAgICBib29sZWFuIHNlbmRWaWV3U2l6ZVpvb20oYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgaW50IG5ld1dpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpOwotICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChnZXRWaWV3SGVpZ2h0KCkgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICBpbnQgbmV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKKyAgICAgICAgaW50IG5ld0hlaWdodCA9IE1hdGgucm91bmQoZ2V0Vmlld0hlaWdodCgpICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgICAgICAvKgogICAgICAgICAgKiBCZWNhdXNlIHRoZSBuYXRpdmUgc2lkZSBtYXkgaGF2ZSBhbHJlYWR5IGRvbmUgYSBsYXlvdXQgYmVmb3JlIHRoZQogICAgICAgICAgKiBWaWV3IHN5c3RlbSB3YXMgYWJsZSB0byBtZWFzdXJlIHVzLCB3ZSBoYXZlIHRvIHNlbmQgYSBoZWlnaHQgb2YgMCB0bwpAQCAtMjQ2MSw4NSArMjQ4MCw1MSBAQAogICAgICAgICAgICAgbmV3SGVpZ2h0ID0gMDsKICAgICAgICAgfQogICAgICAgICAvLyBBdm9pZCBzZW5kaW5nIGFub3RoZXIgbWVzc2FnZSBpZiB0aGUgZGltZW5zaW9ucyBoYXZlIG5vdCBjaGFuZ2VkLgotICAgICAgICBpZiAobmV3V2lkdGggIT0gbUxhc3RXaWR0aFNlbnQgfHwgbmV3SGVpZ2h0ICE9IG1MYXN0SGVpZ2h0U2VudCkgeworICAgICAgICBpZiAobmV3V2lkdGggIT0gbUxhc3RXaWR0aFNlbnQgfHwgbmV3SGVpZ2h0ICE9IG1MYXN0SGVpZ2h0U2VudCB8fCBmb3JjZSkgewogICAgICAgICAgICAgVmlld1NpemVEYXRhIGRhdGEgPSBuZXcgVmlld1NpemVEYXRhKCk7CiAgICAgICAgICAgICBkYXRhLm1XaWR0aCA9IG5ld1dpZHRoOwogICAgICAgICAgICAgZGF0YS5tSGVpZ2h0ID0gbmV3SGVpZ2h0OwotICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoIC8gbVRleHRXcmFwU2NhbGUpOzsKLSAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gbVpvb21TY2FsZSAhPSAwICYmICFtSGVpZ2h0Q2FuTWVhc3VyZTsKLSAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBtQW5jaG9yWDsKLSAgICAgICAgICAgIGRhdGEubUFuY2hvclkgPSBtQW5jaG9yWTsKKyAgICAgICAgICAgIGRhdGEubVRleHRXcmFwV2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAvIG1ab29tTWFuYWdlci5nZXRUZXh0V3JhcFNjYWxlKCkpOworICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKKyAgICAgICAgICAgIGRhdGEubUlnbm9yZUhlaWdodCA9IG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpCisgICAgICAgICAgICAgICAgICAgICYmICFtSGVpZ2h0Q2FuTWVhc3VyZTsKKyAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBtWm9vbU1hbmFnZXIuZ2V0RG9jdW1lbnRBbmNob3JYKCk7CisgICAgICAgICAgICBkYXRhLm1BbmNob3JZID0gbVpvb21NYW5hZ2VyLmdldERvY3VtZW50QW5jaG9yWSgpOwogICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlZJRVdfU0laRV9DSEFOR0VELCBkYXRhKTsKICAgICAgICAgICAgIG1MYXN0V2lkdGhTZW50ID0gbmV3V2lkdGg7CiAgICAgICAgICAgICBtTGFzdEhlaWdodFNlbnQgPSBuZXdIZWlnaHQ7Ci0gICAgICAgICAgICBtQW5jaG9yWCA9IG1BbmNob3JZID0gMDsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5jbGVhckRvY3VtZW50QW5jaG9yKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkgewogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlXaWR0aDsKICAgICAgICAgfSBlbHNlIGlmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICYmIChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgeworICAgICAgICAgICAgICAgICYmICFtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpKSB7CiAgICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAogICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsRXh0ZW50KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyB0byBhdm9pZCByb3VuZGluZyBlcnJvciBjYXVzZWQgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFyLCB1c2UgZmxvb3IKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50V2lkdGggKiBtQWN0dWFsU2NhbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkgewotICAgICAgICBpbnQgcmFuZ2UgPSBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpOwotCi0gICAgICAgIC8vIEFkanVzdCByZXBvcnRlZCByYW5nZSBpZiBvdmVyc2Nyb2xsZWQgdG8gY29tcHJlc3MgdGhlIHNjcm9sbCBiYXJzCi0gICAgICAgIGZpbmFsIGludCBzY3JvbGxYID0gbVNjcm9sbFg7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsUmlnaHQgPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICBpZiAoc2Nyb2xsWCA8IDApIHsKLSAgICAgICAgICAgIHJhbmdlIC09IHNjcm9sbFg7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsWCA+IG92ZXJzY3JvbGxSaWdodCkgewotICAgICAgICAgICAgcmFuZ2UgKz0gc2Nyb2xsWCAtIG92ZXJzY3JvbGxSaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByYW5nZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gTWF0aC5tYXgobVNjcm9sbFgsIDApOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgcmV0dXJuIG1IaXN0b3J5SGVpZ2h0OwotICAgICAgICB9IGVsc2UgaWYgKG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICYmIChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgewotICAgICAgICAgICAgLy8gb25seSBob25vciB0aGUgc2Nyb2xsYmFyIG1vZGUgd2hlbiBpdCBpcyBhdCBtaW5pbXVtIHpvb20gbGV2ZWwKLSAgICAgICAgICAgIHJldHVybiBjb21wdXRlVmVydGljYWxTY3JvbGxFeHRlbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9yIGNhdXNlZCB1bm5lY2Vzc2FyeSBzY3JvbGxiYXIsIHVzZSBmbG9vcgotICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRIZWlnaHQgKiBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRXaWR0aCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIGludCByYW5nZSA9IGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpOwotCi0gICAgICAgIC8vIEFkanVzdCByZXBvcnRlZCByYW5nZSBpZiBvdmVyc2Nyb2xsZWQgdG8gY29tcHJlc3MgdGhlIHNjcm9sbCBiYXJzCi0gICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsQm90dG9tID0gY29tcHV0ZU1heFNjcm9sbFkoKTsKLSAgICAgICAgaWYgKHNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICByYW5nZSAtPSBzY3JvbGxZOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFkgPiBvdmVyc2Nyb2xsQm90dG9tKSB7Ci0gICAgICAgICAgICByYW5nZSArPSBzY3JvbGxZIC0gb3ZlcnNjcm9sbEJvdHRvbTsKKyAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgeworICAgICAgICAgICAgcmV0dXJuIG1IaXN0b3J5SGVpZ2h0OworICAgICAgICB9IGVsc2UgaWYgKG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgorICAgICAgICAgICAgICAgICYmICFtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpKSB7CisgICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAorICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3IgY2F1c2VkIHVubmVjZXNzYXJ5IHNjcm9sbGJhciwgdXNlIGZsb29yCisgICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudEhlaWdodCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByYW5nZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI1NTcsMzEgKzI1NDIsMTAgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdWZXJ0aWNhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIHNjcm9sbEJhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICBpZiAobVNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICB0IC09IG1TY3JvbGxZOwotICAgICAgICB9CiAgICAgICAgIHNjcm9sbEJhci5zZXRCb3VuZHMobCwgdCArIGdldFZpc2libGVUaXRsZUhlaWdodCgpLCByLCBiKTsKICAgICAgICAgc2Nyb2xsQmFyLmRyYXcoY2FudmFzKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk92ZXJTY3JvbGxlZChpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksIGJvb2xlYW4gY2xhbXBlZFgsCi0gICAgICAgICAgICBib29sZWFuIGNsYW1wZWRZKSB7Ci0gICAgICAgIG1Jbk92ZXJTY3JvbGxNb2RlID0gZmFsc2U7Ci0gICAgICAgIGludCBtYXhYID0gY29tcHV0ZU1heFNjcm9sbFgoKTsKLSAgICAgICAgaWYgKG1heFggPT0gMCkgewotICAgICAgICAgICAgLy8gZG8gbm90IG92ZXIgc2Nyb2xsIHggaWYgdGhlIHBhZ2UganVzdCBmaXRzIHRoZSBzY3JlZW4KLSAgICAgICAgICAgIHNjcm9sbFggPSBwaW5Mb2NYKHNjcm9sbFgpOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFggPCAwIHx8IHNjcm9sbFggPiBtYXhYKSB7Ci0gICAgICAgICAgICBtSW5PdmVyU2Nyb2xsTW9kZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjcm9sbFkgPCAwIHx8IHNjcm9sbFkgPiBjb21wdXRlTWF4U2Nyb2xsWSgpKSB7Ci0gICAgICAgICAgICBtSW5PdmVyU2Nyb2xsTW9kZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5zY3JvbGxUbyhzY3JvbGxYLCBzY3JvbGxZKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIHVybCBmb3IgdGhlIGN1cnJlbnQgcGFnZS4gVGhpcyBpcyBub3QgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSB1cmwKICAgICAgKiBwYXNzZWQgdG8gV2ViVmlld0NsaWVudC5vblBhZ2VTdGFydGVkIGJlY2F1c2UgYWx0aG91Z2ggdGhlIGxvYWQgZm9yCkBAIC0yNjI3LDcgKzI1OTEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgdG91Y2ggaWNvbiB1cmwgZm9yIHRoZSBhcHBsZS10b3VjaC1pY29uIDxsaW5rPiBlbGVtZW50LgorICAgICAqIEdldCB0aGUgdG91Y2ggaWNvbiB1cmwgZm9yIHRoZSBhcHBsZS10b3VjaC1pY29uIDxsaW5rPiBlbGVtZW50LCBvcgorICAgICAqIGEgVVJMIG9uIHRoaXMgc2l0ZSdzIHNlcnZlciBwb2ludGluZyB0byB0aGUgc3RhbmRhcmQgbG9jYXRpb24gb2YgYQorICAgICAqIHRvdWNoIGljb24uCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFRvdWNoSWNvblVybCgpIHsKQEAgLTI4MDAsMjIgKzI3NjYsNDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIFN0YXJ0IGFuIEFjdGlvbk1vZGUgZm9yIGZpbmRpbmcgdGV4dCBpbiB0aGlzIFdlYlZpZXcuCisgICAgICogQHBhcmFtIHRleHQgSWYgbm9uLW51bGwsIHdpbGwgYmUgdGhlIGluaXRpYWwgdGV4dCB0byBzZWFyY2ggZm9yLgorICAgICAqICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGxhc3QgU3RyaW5nIHNlYXJjaGVkIGZvciBpbiB0aGlzIFdlYlZpZXcgd2lsbAorICAgICAqICAgICAgICAgICAgIGJlIHVzZWQgdG8gc3RhcnQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluZElzVXAoYm9vbGVhbiBpc1VwKSB7Ci0gICAgICAgIG1GaW5kSXNVcCA9IGlzVXA7Ci0gICAgICAgIGlmIChpc1VwKSB7Ci0gICAgICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShtQ29udGVudFdpZHRoLCBtQ29udGVudEhlaWdodCArIG1GaW5kSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgcHVibGljIHZvaWQgc2hvd0ZpbmREaWFsb2coU3RyaW5nIHRleHQpIHsKKyAgICAgICAgbUZpbmRDYWxsYmFjayA9IG5ldyBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrKG1Db250ZXh0KTsKKyAgICAgICAgc2V0RmluZElzVXAodHJ1ZSk7CisgICAgICAgIG1GaW5kQ2FsbGJhY2suc2V0V2ViVmlldyh0aGlzKTsKKyAgICAgICAgVmlldyB0aXRsZUJhciA9IG1UaXRsZUJhcjsKKyAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgZW1iZWRkZWQgdGl0bGUgYmFyIGR1cmluZyBmaW5kIG9yCisgICAgICAgIC8vIHNlbGVjdCwgYnV0IGtlZXAgdHJhY2sgb2YgaXQgc28gdGhhdCBpdCBjYW4gYmUgcmVwbGFjZWQgd2hlbiB0aGUKKyAgICAgICAgLy8gbW9kZSBpcyBleGl0ZWQuCisgICAgICAgIHNldEVtYmVkZGVkVGl0bGVCYXIobnVsbCk7CisgICAgICAgIG1GaW5kQ2FsbGJhY2suc2V0VGl0bGVCYXIodGl0bGVCYXIpOworICAgICAgICBzdGFydEFjdGlvbk1vZGUobUZpbmRDYWxsYmFjayk7CisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRleHQgPSBtTGFzdEZpbmQ7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUZpbmRDYWxsYmFjay5zZXRUZXh0KHRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogS2VlcCB0cmFjayBvZiB0aGUgZmluZCBjYWxsYmFjayBzbyB0aGF0IHdlIGNhbiByZW1vdmUgaXRzIHRpdGxlYmFyIGlmCisgICAgICogbmVjZXNzYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgRmluZEFjdGlvbk1vZGVDYWxsYmFjayBtRmluZENhbGxiYWNrOworCisgICAgLyoqCisgICAgICogVG9nZ2xlIHdoZXRoZXIgdGhlIGZpbmQgZGlhbG9nIGlzIHNob3dpbmcsIGZvciBib3RoIG5hdGl2ZSBhbmQgSmF2YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RmluZElzVXAoYm9vbGVhbiBpc1VwKSB7CisgICAgICAgIG1GaW5kSXNVcCA9IGlzVXA7CiAgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKICAgICAgICAgbmF0aXZlU2V0RmluZElzVXAoaXNVcCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUKKyAgICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgbWF0Y2guCiAgICAgICovCi0gICAgcHVibGljIGludCBmaW5kSW5kZXgoKSB7CisgICAgaW50IGZpbmRJbmRleCgpIHsKICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm4gLTE7CiAgICAgICAgIHJldHVybiBuYXRpdmVGaW5kSW5kZXgoKTsKICAgICB9CkBAIC0yODI0LDkgKzI4MTcsOCBAQAogICAgIC8vIG9yIG5vdCB3ZSBkcmF3IHRoZSBoaWdobGlnaHRzIGZvciBtYXRjaGVzLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluZElzVXA7CiAKLSAgICBwcml2YXRlIGludCBtRmluZEhlaWdodDsKLSAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN0cmluZyBzZW50LCBzbyB3ZSBjYW4gc2VhcmNoIGFnYWluIGFmdGVyIGFuCi0gICAgLy8gb3JpZW50YXRpb24gY2hhbmdlIG9yIHRoZSBkaXNtaXNzYWwgb2YgdGhlIHNvZnQga2V5Ym9hcmQuCisgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzdHJpbmcgc2VudCwgc28gd2UgY2FuIHNlYXJjaCBhZ2FpbiB3aGVuIGZpbmQgaXMKKyAgICAvLyByZW9wZW5lZC4KICAgICBwcml2YXRlIFN0cmluZyBtTGFzdEZpbmQ7CiAKICAgICAvKioKQEAgLTI4ODMsNyArMjg3NSw2IEBACiAgICAgICogQ2xlYXIgdGhlIGhpZ2hsaWdodGluZyBzdXJyb3VuZGluZyB0ZXh0IG1hdGNoZXMgY3JlYXRlZCBieSBmaW5kQWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTWF0Y2hlcygpIHsKLSAgICAgICAgbUxhc3RGaW5kID0gIiI7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgbmF0aXZlU2V0RmluZElzRW1wdHkoKTsKQEAgLTI4OTEsMTYgKzI4ODIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmaW5kIEFjdGlvbk1vZGUgZW5kcy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlGaW5kRGlhbG9nRGlzbWlzc2VkKCkgeworICAgIHZvaWQgbm90aWZ5RmluZERpYWxvZ0Rpc21pc3NlZCgpIHsKKyAgICAgICAgbUZpbmRDYWxsYmFjayA9IG51bGw7CiAgICAgICAgIGlmIChtV2ViVmlld0NvcmUgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGNsZWFyTWF0Y2hlcygpOwogICAgICAgICBzZXRGaW5kSXNVcChmYWxzZSk7Ci0gICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKG1Db250ZW50V2lkdGgsIG1Db250ZW50SGVpZ2h0IC0gbUZpbmRIZWlnaHQsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAvLyBOb3cgdGhhdCB0aGUgZGlhbG9nIGhhcyBiZWVuIHJlbW92ZWQsIGVuc3VyZSB0aGF0IHdlIHNjcm9sbCB0byBhCiAgICAgICAgIC8vIGxvY2F0aW9uIHRoYXQgaXMgbm90IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBwYWdlLgogICAgICAgICBwaW5TY3JvbGxUbyhtU2Nyb2xsWCwgbVNjcm9sbFksIGZhbHNlLCAwKTsKQEAgLTI5MDgsMTYgKzI4OTgsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluZERpYWxvZ0hlaWdodChpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7Ci0gICAgICAgICAgICBMb2cudihMT0dUQUcsICJzZXRGaW5kRGlhbG9nSGVpZ2h0IGhlaWdodD0iICsgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICBtRmluZEhlaWdodCA9IGhlaWdodDsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBRdWVyeSB0aGUgZG9jdW1lbnQgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIGFueSBpbWFnZSByZWZlcmVuY2VzLiBUaGUKICAgICAgKiBtZXNzYWdlIG9iamVjdCB3aWxsIGJlIGRpc3BhdGNoZWQgd2l0aCBhcmcxIGJlaW5nIHNldCB0byAxIGlmIGltYWdlcwogICAgICAqIHdlcmUgZm91bmQgYW5kIDAgaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgaW1hZ2VzLgpAQCAtMjkzMCw1NCArMjkxMCwzMSBAQAogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuRE9DX0hBU19JTUFHRVMsIHJlc3BvbnNlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHRoZSBzY3JvbGxlciB0byBhYm9ydCBhbnkgb25nb2luZyBhbmltYXRpb24KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFNjcm9sbCgpIHsKKyAgICAgICAgbVNjcm9sbGVyLmZvcmNlRmluaXNoZWQodHJ1ZSk7CisgICAgICAgIG1MYXN0VmVsb2NpdHkgPSAwOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVTY3JvbGwoKSB7CiAgICAgICAgIGlmIChtU2Nyb2xsZXIuY29tcHV0ZVNjcm9sbE9mZnNldCgpKSB7CiAgICAgICAgICAgICBpbnQgb2xkWCA9IG1TY3JvbGxYOwogICAgICAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGludCB4ID0gbVNjcm9sbGVyLmdldEN1cnJYKCk7Ci0gICAgICAgICAgICBpbnQgeSA9IG1TY3JvbGxlci5nZXRDdXJyWSgpOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOyAgLy8gU28gd2UgZHJhdyBhZ2FpbgotCi0gICAgICAgICAgICBpZiAob2xkWCAhPSB4IHx8IG9sZFkgIT0geSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByYW5nZVggPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByYW5nZVkgPSBjb21wdXRlTWF4U2Nyb2xsWSgpOwotICAgICAgICAgICAgICAgIG92ZXJTY3JvbGxCeSh4IC0gb2xkWCwgeSAtIG9sZFksIG9sZFgsIG9sZFksCi0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZVgsIHJhbmdlWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlWSA+IDAgfHwgZ2V0T3ZlclNjcm9sbE1vZGUoKSA9PSBPVkVSX1NDUk9MTF9BTFdBWVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5IDwgMCAmJiBvbGRZID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1FZGdlR2xvd0JvdHRvbS5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA+IHJhbmdlWSAmJiBvbGRZIDw9IHJhbmdlWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlWCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4IDwgMCAmJiBvbGRYID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dSaWdodC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4ID4gcmFuZ2VYICYmIG9sZFggPD0gcmFuZ2VYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1FZGdlR2xvd0xlZnQuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7CisgICAgICAgICAgICBtU2Nyb2xsWCA9IG1TY3JvbGxlci5nZXRDdXJyWCgpOworICAgICAgICAgICAgbVNjcm9sbFkgPSBtU2Nyb2xsZXIuZ2V0Q3VyclkoKTsKKyAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7ICAvLyBTbyB3ZSBkcmF3IGFnYWluCisgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7CisgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFib3J0QW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZKTsKKyAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVQcmlvcml0eSgpOworICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN1cGVyLmNvbXB1dGVTY3JvbGwoKTsKQEAgLTMwNTEsNiArMzAwOCwyMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENhbGxlZCBieSBDYWxsYmFja1Byb3h5IHdoZW4gdGhlIHBhZ2Ugc3RhcnRzIGxvYWRpbmcuCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBwYWdlIHdoaWNoIGhhcyBzdGFydGVkIGxvYWRpbmcuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIG9uUGFnZVN0YXJ0ZWQoU3RyaW5nIHVybCkgeworICAgICAgICAvLyBldmVyeSB0aW1lIHdlIHN0YXJ0IGEgbmV3IHBhZ2UsIHdlIHdhbnQgdG8gcmVzZXQgdGhlCisgICAgICAgIC8vIFdlYlZpZXcgY2VydGlmaWNhdGU6ICBpZiB0aGUgbmV3IHNpdGUgaXMgc2VjdXJlLCB3ZQorICAgICAgICAvLyB3aWxsIHJlbG9hZCBpdCBhbmQgZ2V0IGEgbmV3IGNlcnRpZmljYXRlIHNldDsKKyAgICAgICAgLy8gaWYgdGhlIG5ldyBzaXRlIGlzIG5vdCBzZWN1cmUsIHRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlCisgICAgICAgIC8vIG51bGwsIGFuZCB0aGF0IHdpbGwgYmUgdGhlIGNhc2UKKyAgICAgICAgc2V0Q2VydGlmaWNhdGUobnVsbCk7CisKKyAgICAgICAgLy8gcmVzZXQgdGhlIGZsYWcgc2luY2Ugd2Ugc2V0IHRvIHRydWUgaW4gaWYgbmVlZCBhZnRlcgorICAgICAgICAvLyBsb2FkaW5nIGlzIHNlZSBvblBhZ2VGaW5pc2hlZChVcmwpCisgICAgICAgIG1BY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgQ2FsbGJhY2tQcm94eSB3aGVuIHRoZSBwYWdlIGZpbmlzaGVzIGxvYWRpbmcuCiAgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBwYWdlIHdoaWNoIGhhcyBmaW5pc2hlZCBsb2FkaW5nLgogICAgICAqLwpAQCAtMzA2Niw2ICszMDQwLDk5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGFnZVRoYXROZWVkc1RvU2xpZGVUaXRsZUJhck9mZlNjcmVlbiA9IG51bGw7CiAgICAgICAgIH0KKworICAgICAgICBpbmplY3RBY2Nlc3NpYmlsaXR5Rm9yVXJsKHVybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaW5qZWN0cyBhY2Nlc3NpYmlsaXR5IGluIHRoZSBsb2FkZWQgZG9jdW1lbnQgaWYgYWNjZXNzaWJpbGl0eQorICAgICAqIGlzIGVuYWJsZWQuIElmIEphdmFTY3JpcHQgaXMgZW5hYmxlZCB3ZSB0cnkgdG8gaW5qZWN0IGEgVVJMIHNwZWNpZmljIHNjcmlwdC4KKyAgICAgKiBJZiBubyBVUkwgc3BlY2lmaWMgc2NyaXB0IGlzIGZvdW5kIG9yIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQgd2UgZmFsbGJhY2sgdG8KKyAgICAgKiB0aGUgZGVmYXVsdCB7QGxpbmsgQWNjZXNzaWJpbGl0eUluamVjdG9yfSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICogSWYgdGhlIFVSTCBoYXMgdGhlICJheHMiIHBhcmFtdGVyIHNldCB0byAxIGl0IGhhcyBhbHJlYWR5IGRvbmUgdGhlCisgICAgICogc2NyaXB0IGluamVjdGlvbiBzbyB3ZSBkbyBub3RoaW5nLiBJZiB0aGUgcGFyYW1ldGVyIGlzIHNldCB0byAwCisgICAgICogdGhlIFVSTCBvcHRzIG91dCBhY2Nlc3NpYmlsaXR5IHNjcmlwdCBpbmplY3Rpb24gc28gd2UgZmFsbCBiYWNrIHRvCisgICAgICogdGhlIGRlZmF1bHQge0BsaW5rIEFjY2Vzc2liaWxpdHlJbmplY3Rvcn0uCisgICAgICogPC9wPgorICAgICAqIE5vdGU6IElmIHRoZSB1c2VyIGhhcyBub3Qgb3B0ZWQtaW4gdGhlIGFjY2Vzc2liaWxpdHkgc2NyaXB0IGluamVjdGlvbiBubyBzY3JpcHRzCisgICAgICogYXJlIGluamVjdGVkIHJhdGhlciB0aGUgZGVmYXVsdCB7QGxpbmsgQWNjZXNzaWJpbGl0eUluamVjdG9yfSBpbXBsZW1lbnRhdGlvbgorICAgICAqIGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgbG9hZGVkIGJ5IHRoaXMge0BsaW5rIFdlYlZpZXd9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbmplY3RBY2Nlc3NpYmlsaXR5Rm9yVXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgYWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtQ29udGV4dCk7CisKKyAgICAgICAgaWYgKCFhY2Nlc3NpYmlsaXR5TWFuYWdlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBhY2Nlc3NpYmlsaXR5IHdhcyB0dXJuZWQgb2ZmIGJldHdlZW4gcmVsb2FkcworICAgICAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdG9ySW5zdGFuY2UoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnZXRTZXR0aW5ncygpLmdldEphdmFTY3JpcHRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIG5vIEpTIHNvIHdlIGZhbGxiYWNrIHRvIHRoZSBiYXNpYyBidWlsLWluIHN1cHBvcnQKKyAgICAgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3Rvckluc3RhbmNlKHRydWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIFVSTCAiYXhzIiBwYXJhbWV0ZXIgdG8gY2hvb3NlIGFwcHJvcHJpYXRlIGFjdGlvbgorICAgICAgICBpbnQgYXhzUGFyYW1ldGVyVmFsdWUgPSBnZXRBeHNVcmxQYXJhbWV0ZXJWYWx1ZSh1cmwpOworICAgICAgICBpZiAoYXhzUGFyYW1ldGVyVmFsdWUgPT0gQUNDRVNTSUJJTElUWV9TQ1JJUFRfSU5KRUNUSU9OX1VOREVGSU5FRCkgeworICAgICAgICAgICAgYm9vbGVhbiBvbkRldmljZVNjcmlwdEluamVjdGlvbkVuYWJsZWQgPSAoU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dAorICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGVudFJlc29sdmVyKCksIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04sIDApID09IDEpOworICAgICAgICAgICAgaWYgKG9uRGV2aWNlU2NyaXB0SW5qZWN0aW9uRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3Rvckluc3RhbmNlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAvLyBuZWl0aGVyIHNjcmlwdCBpbmplY3RlZCBub3Igc2NyaXB0IGluamVjdGlvbiBvcHRlZCBvdXQgPT4gd2UgaW5qZWN0CisgICAgICAgICAgICAgICAgbG9hZFVybChBQ0NFU1NJQklMSVRZX1NDUklQVF9DSE9PU0VSX0pBVkFTQ1JJUFQpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IFNldCB0aGlzIGZsYWcgYWZ0ZXIgc3VjY2Vzc2Z1bGwgc2NyaXB0IGluamVjdGlvbi4gTWF5YmUgdXBvbiBpbmplY3Rpb24KKyAgICAgICAgICAgICAgICAvLyB0aGUgY2hvb3NlciBzaG91bGQgdXBkYXRlIHRoZSBtZXRhIHRhZyBhbmQgd2UgY2hlY2sgaXQgdG8gZGVjbGFyZSBzdWNjZXNzCisgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3RlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGluamVjdGlvbiBkaXNhYmxlZCBzbyB3ZSBmYWxsYmFjayB0byB0aGUgYmFzaWMgYnVpbHQtaW4gc3VwcG9ydAorICAgICAgICAgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3Rvckluc3RhbmNlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGF4c1BhcmFtZXRlclZhbHVlID09IEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTl9PUFRFRF9PVVQpIHsKKyAgICAgICAgICAgIC8vIGluamVjdGlvbiBvcHRlZCBvdXQgc28gd2UgZmFsbGJhY2sgdG8gdGhlIGJhc2ljIGJ1aWwtaW4gc3VwcG9ydAorICAgICAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdG9ySW5zdGFuY2UodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXhzUGFyYW1ldGVyVmFsdWUgPT0gQUNDRVNTSUJJTElUWV9TQ1JJUFRfSU5KRUNUSU9OX1BST1ZJREVEKSB7CisgICAgICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0b3JJbnN0YW5jZShmYWxzZSk7CisgICAgICAgICAgICAvLyB0aGUgVVJMIHByb3ZpZGVzIGFjY2Vzc2liaWxpdHkgYnV0IHdlIHN0aWxsIG5lZWQgdG8gYWRkIG91ciBnZW5lcmljIHNjcmlwdAorICAgICAgICAgICAgbG9hZFVybChBQ0NFU1NJQklMSVRZX1NDUklQVF9DSE9PU0VSX0pBVkFTQ1JJUFQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiVW5rbm93biBVUkwgdmFsdWUgZm9yIHRoZSBcImF4c1wiIFVSTCBwYXJhbWV0ZXI6ICIgKyBheHNQYXJhbWV0ZXJWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoZSBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIEFjY2Vzc2liaWxpdHlJbmplY3Rvcn0gdG8gYmUgcHJlc2VudCBvdCBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlc2VudCBUcnVlIHRvIGVuc3VyZSBhbiBpbnNhbmNlLCBmYWxzZSB0byBlbnN1cmUgbm8gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3Rvckluc3RhbmNlKGJvb2xlYW4gcHJlc2VudCkgeworICAgICAgICBpZiAocHJlc2VudCAmJiBtQWNjZXNzaWJpbGl0eUluamVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPSBuZXcgQWNjZXNzaWJpbGl0eUluamVjdG9yKHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbmplY3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSAiYXhzIiBVUkwgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBBIHVybCB0byBmZXRjaCB0aGUgcGFyYW10ZXIgZnJvbS4KKyAgICAgKiBAcmV0dXJuIFRoZSBwYXJhbWV0ZXIgdmFsdWUgaWYgc3VjaCwgLTEgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldEF4c1VybFBhcmFtZXRlclZhbHVlKFN0cmluZyB1cmwpIHsKKyAgICAgICAgaWYgKG1NYXRjaEF4c1VybFBhcmFtZXRlclBhdHRlcm4gPT0gbnVsbCkgeworICAgICAgICAgICAgbU1hdGNoQXhzVXJsUGFyYW1ldGVyUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShQQVRURVJOX01BVENIX0FYU19VUkxfUEFSQU1FVEVSKTsKKyAgICAgICAgfQorICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBtTWF0Y2hBeHNVcmxQYXJhbWV0ZXJQYXR0ZXJuLm1hdGNoZXIodXJsKTsKKyAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5VmFsdWVQYWlyID0gdXJsLnN1YnN0cmluZyhtYXRjaGVyLnN0YXJ0KCksIG1hdGNoZXIuZW5kKCkpOworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoa2V5VmFsdWVQYWlyLnNwbGl0KCI9IilbMV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKioKQEAgLTMxODIsNyArMzI0OSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCByZXF1ZXN0IGEgbGF5b3V0LCB0cnkgdG8gc2VuZCBvdXIgdmlldyBzaXplIHRvIHRoZQogICAgICAgICAgICAgLy8gbmF0aXZlIHNpZGUgdG8gZW5zdXJlIHRoYXQgV2ViQ29yZSBoYXMgdGhlIGNvcnJlY3QgZGltZW5zaW9ucy4KLSAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKKyAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzEyLDQ2ICszMzc5LDcgQEAKICAgICAgKiAgICAgICAgIHNldHRpbmdzLgogICAgICAqLwogICAgIHB1YmxpYyBXZWJTZXR0aW5ncyBnZXRTZXR0aW5ncygpIHsKLSAgICAgICAgcmV0dXJuIG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBpbmZvcm0gdGhlIHdlYnZpZXcgYWJvdXQgcGFja2FnZXMgdGhhdCBhcmUgaW5zdGFsbGVkCi0gICAgICogaW4gdGhlIHN5c3RlbS4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlCi0gICAgICogbmF2aWdhdG9yLmlzQXBwbGljYXRpb25JbnN0YWxsZWQoKSBBUEkuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lcyBpcyBhIHNldCBvZiBwYWNrYWdlIG5hbWVzIHRoYXQgYXJlIGtub3duIHRvIGJlCi0gICAgICogaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAaGlkZSBub3QgYSBwdWJsaWMgQVBJCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFja2FnZU5hbWVzKFNldDxTdHJpbmc+IHBhY2thZ2VOYW1lcykgewotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQUREX1BBQ0tBR0VfTkFNRVMsIHBhY2thZ2VOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGluZm9ybSB0aGUgd2VidmlldyBhYm91dCBzaW5nbGUgcGFja2FnZXMgdGhhdCBhcmUKLSAgICAgKiBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlCi0gICAgICogbmF2aWdhdG9yLmlzQXBwbGljYXRpb25JbnN0YWxsZWQoKSBBUEkuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIGlzIHRoZSBuYW1lIG9mIGEgcGFja2FnZSB0aGF0IGlzIGtub3duIHRvIGJlCi0gICAgICogaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAaGlkZSBub3QgYSBwdWJsaWMgQVBJCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5BRERfUEFDS0FHRV9OQU1FLCBwYWNrYWdlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGluZm9ybSB0aGUgd2VidmlldyBhYm91dCBwYWNrYWdlcyB0aGF0IGFyZSB1bmluc3RhbGxlZAotICAgICAqIGluIHRoZSBzeXN0ZW0uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZQotICAgICAqIG5hdmlnYXRvci5pc0FwcGxpY2F0aW9uSW5zdGFsbGVkKCkgQVBJLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBpcyB0aGUgbmFtZSBvZiBhIHBhY2thZ2UgdGhhdCBoYXMgYmVlbiB1bmluc3RhbGxlZCBpbgotICAgICAqIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAaGlkZSBub3QgYSBwdWJsaWMgQVBJCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRU1PVkVfUEFDS0FHRV9OQU1FLCBwYWNrYWdlTmFtZSk7CisgICAgICAgIHJldHVybiAobVdlYlZpZXdDb3JlICE9IG51bGwpID8gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCkgOiBudWxsOwogICAgIH0KIAogICAgLyoqCkBAIC0zNDI1LDM2ICszNDUzLDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICBpZiAobUluT3ZlclNjcm9sbE1vZGUgJiYgIWdldFNldHRpbmdzKCkKLSAgICAgICAgICAgICAgICAuZ2V0VXNlV2ViVmlld0JhY2tncm91bmRGb3JPdmVyc2Nyb2xsQmFja2dyb3VuZCgpKSB7Ci0gICAgICAgICAgICBpZiAobU92ZXJTY3JvbGxCYWNrZ3JvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJhY2tncm91bmQgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXR1c19iYXJfYmFja2dyb3VuZCk7Ci0gICAgICAgICAgICAgICAgbU92ZXJTY3JvbGxCYWNrZ3JvdW5kLnNldFNoYWRlcihuZXcgQml0bWFwU2hhZGVyKGJtLAotICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCwgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCkpOwotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQm9yZGVyID0gbmV3IFBhaW50KCk7Ci0gICAgICAgICAgICAgICAgbU92ZXJTY3JvbGxCb3JkZXIuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJvcmRlci5zZXRTdHJva2VXaWR0aCgwKTsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJvcmRlci5zZXRDb2xvcigweGZmYmJiYmJiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHRvcCA9IDA7Ci0gICAgICAgICAgICBpbnQgcmlnaHQgPSBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgaW50IGJvdHRvbSA9IHRvcCArIGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgLy8gZmlyc3QgZHJhdyB0aGUgYmFja2dyb3VuZCBhbmQgYW5jaG9yIHRvIHRoZSB0b3Agb2YgdGhlIHZpZXcKLSAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKG1TY3JvbGxYLCBtU2Nyb2xsWSk7Ci0gICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoLW1TY3JvbGxYLCB0b3AgLSBtU2Nyb2xsWSwgcmlnaHQgLSBtU2Nyb2xsWCwgYm90dG9tCi0gICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFksIFJlZ2lvbi5PcC5ESUZGRVJFTkNFKTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3UGFpbnQobU92ZXJTY3JvbGxCYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgICAgICAvLyB0aGVuIGRyYXcgdGhlIGJvcmRlcgotICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KC0xLCB0b3AgLSAxLCByaWdodCwgYm90dG9tLCBtT3ZlclNjcm9sbEJvcmRlcik7Ci0gICAgICAgICAgICAvLyBuZXh0IGNsaXAgdGhlIHJlZ2lvbiBmb3IgdGhlIGNvbnRlbnQKLSAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgwLCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgICAgICB9CiAgICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLCAoaW50KSBtVGl0bGVCYXIuZ2V0SGVpZ2h0KCkpOwogICAgICAgICB9CkBAIC0zNDgwLDcxICszNDc4LDUwIEBACiAgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZICsgaGVpZ2h0KTsKICAgICAgICAgICAgIG1UaXRsZVNoYWRvdy5kcmF3KGNhbnZhcyk7CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoQVVUT19SRURSQVdfSEFDSyAmJiBtQXV0b1JlZHJhdykgewogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIG1XZWJUZXh0Vmlldy5vbkRyYXdTdWJzdGl0dXRlKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zaWduYWxSZXBhaW50RG9uZSgpOwotICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCAmJiBkcmF3RWRnZUdsb3dzKGNhbnZhcykpIHsKLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgLy8gcGFpbnQgdGhlIGhpZ2hsaWdodCBpbiB0aGUgZW5kCisgICAgICAgIGlmICghbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaEhpZ2h0bGlnaHRQYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50LnNldENvbG9yKG1IaWdodGxpZ2h0Q29sb3IpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50LnNldFBhdGhFZmZlY3QobmV3IENvcm5lclBhdGhFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9ISUdITElHSFRfQVJDKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmdldEJvdW5kYXJ5UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVR19UT1VDSF9ISUdITElHSFQpIHsKKyAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldE5hdkR1bXAoKSkgeworICAgICAgICAgICAgICAgIGlmICgobVRvdWNoSGlnaGxpZ2h0WCB8IG1Ub3VjaEhpZ2hsaWdodFkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaENyb3NzSGFpckNvbG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENyb3NzSGFpckNvbG9yID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hDcm9zc0hhaXJDb2xvci5zZXRDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShtVG91Y2hIaWdobGlnaHRYIC0gbU5hdlNsb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSAtIG1OYXZTbG9wLCBtVG91Y2hIaWdobGlnaHRYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1OYXZTbG9wICsgMSwgbVRvdWNoSGlnaGxpZ2h0WSArIG1OYXZTbG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEsIG1Ub3VjaENyb3NzSGFpckNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKG1Ub3VjaEhpZ2hsaWdodFggKyBtTmF2U2xvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSAtIG1OYXZTbG9wLCBtVG91Y2hIaWdobGlnaHRYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1OYXZTbG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgKyBtTmF2U2xvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ3Jvc3NIYWlyQ29sb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIERyYXcgdGhlIGdsb3cgZWZmZWN0IGFsb25nIHRoZSBzaWRlcyBvZiB0aGUgd2lkZ2V0LiBtRWRnZUdsb3cqIG11c3QgYmUgbm9uLW51bGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FudmFzIENhbnZhcyB0byBkcmF3IGludG8sIHRyYW5zZm9ybWVkIGludG8gdmlldyBjb29yZGluYXRlcy4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZ2xvdyBlZmZlY3RzIGFyZSBzdGlsbCBhbmltYXRpbmcgYW5kIHRoZSB2aWV3IHNob3VsZCBpbnZhbGlkYXRlIGFnYWluLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkcmF3RWRnZUdsb3dzKENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOwotCi0gICAgICAgIGJvb2xlYW4gaW52YWxpZGF0ZUZvckdsb3cgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFtRWRnZUdsb3dUb3AuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLQotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtd2lkdGggLyAyICsgc2Nyb2xsWCwgTWF0aC5taW4oMCwgc2Nyb2xsWSkpOwotICAgICAgICAgICAgbUVkZ2VHbG93VG9wLnNldFNpemUod2lkdGggKiAyLCBoZWlnaHQpOwotICAgICAgICAgICAgaW52YWxpZGF0ZUZvckdsb3cgfD0gbUVkZ2VHbG93VG9wLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOworICAgIHByaXZhdGUgdm9pZCByZW1vdmVUb3VjaEhpZ2hsaWdodChib29sZWFuIHJlbW92ZVBlbmRpbmdNZXNzYWdlKSB7CisgICAgICAgIGlmIChyZW1vdmVQZW5kaW5nTWVzc2FnZSkgeworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnJlbW92ZU1lc3NhZ2VzKEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbUVkZ2VHbG93Qm90dG9tLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0KLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiArIHNjcm9sbFgsIE1hdGgubWF4KGNvbXB1dGVNYXhTY3JvbGxZKCksIHNjcm9sbFkpICsgaGVpZ2h0KTsKLSAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMTgwLCB3aWR0aCwgMCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20uc2V0U2l6ZSh3aWR0aCAqIDIsIGhlaWdodCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlRm9yR2xvdyB8PSBtRWRnZUdsb3dCb3R0b20uZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtRWRnZUdsb3dMZWZ0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0KLSAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMjcwKTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLWhlaWdodCAqIDEuNWYgLSBzY3JvbGxZLCBNYXRoLm1pbigwLCBzY3JvbGxYKSk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0LnNldFNpemUoaGVpZ2h0ICogMiwgd2lkdGgpOwotICAgICAgICAgICAgaW52YWxpZGF0ZUZvckdsb3cgfD0gbUVkZ2VHbG93TGVmdC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1FZGdlR2xvd1JpZ2h0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0KLSAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoOTApOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtaGVpZ2h0IC8gMiArIHNjcm9sbFksCi0gICAgICAgICAgICAgICAgICAgIC0oTWF0aC5tYXgoY29tcHV0ZU1heFNjcm9sbFgoKSwgc2Nyb2xsWCkgKyB3aWR0aCkpOwotICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQuc2V0U2l6ZShoZWlnaHQgKiAyLCB3aWR0aCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlRm9yR2xvdyB8PSBtRWRnZUdsb3dSaWdodC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW52YWxpZGF0ZUZvckdsb3c7CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM1NjEsMTIgKzM1MzgsMjAgQEAKICAgICAgICAgLy8gdG8gd2luZG93cyBvdmVydmlldywgdGhlIFdlYlZpZXcgd2lsbCBiZSB0ZW1wb3JhcmlseSByZW1vdmVkIGZyb20gdGhlCiAgICAgICAgIC8vIHZpZXcgc3lzdGVtLiBJbiB0aGF0IGNhc2UsIGRvIG5vdGhpbmcuCiAgICAgICAgIGlmIChnZXRQYXJlbnQoKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gQSBtdWx0aS1maW5nZXIgZ2VzdHVyZSBjYW4gbG9vayBsaWtlIGEgbG9uZyBwcmVzczsgbWFrZSBzdXJlIHdlIGRvbid0IHRha2UKKyAgICAgICAgLy8gbG9uZyBwcmVzcyBhY3Rpb25zIGlmIHdlJ3JlIHNjYWxpbmcuCisgICAgICAgIGZpbmFsIFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yID0gbVpvb21NYW5hZ2VyLmdldE11bHRpVG91Y2hHZXN0dXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgaWYgKGRldGVjdG9yICE9IG51bGwgJiYgZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwICYmIG5hdGl2ZUN1cnNvcklzVGV4dElucHV0KCkpIHsKICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNsaWNrIHNvIHRoYXQgdGhlIHRleHRmaWVsZCBpcyBpbiBmb2N1cwogICAgICAgICAgICAgY2VudGVyS2V5UHJlc3NPblRleHRGaWVsZCgpOwogICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgcmV0dXJuIG1XZWJUZXh0Vmlldy5wZXJmb3JtTG9uZ0NsaWNrKCk7CkBAIC0zNTg3LDI2ICszNTcyLDE3IEBACiAgICAgICAgIHNldFVwU2VsZWN0KCk7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVXb3JkU2VsZWN0aW9uKHgsIHkpKSB7CiAgICAgICAgICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIFdlYkNocm9tZUNsaWVudCBjbGllbnQgPSBnZXRXZWJDaHJvbWVDbGllbnQoKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgY2xpZW50Lm9uU2VsZWN0aW9uU3RhcnQodGhpcyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKTsKKyAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgYm9vbGVhbiBpbkFuaW1hdGVab29tKCkgewotICAgICAgICByZXR1cm4gbVpvb21TY2FsZSAhPSAwOwotICAgIH0KLQogICAgIC8qKgotICAgICAqIE5lZWQgdG8gYWRqdXN0IHRoZSBXZWJUZXh0VmlldyBhZnRlciBhIGNoYW5nZSBpbiB6b29tLCBzaW5jZSBtQWN0dWFsU2NhbGUKLSAgICAgKiBoYXMgY2hhbmdlZC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHBhc3N3b3JkIGZpZWxkcywgd2hpY2ggYXJlCi0gICAgICogZHJhd24gYnkgdGhlIFdlYlRleHRWaWV3LCBzaW5jZSBpdCBjb252ZXlzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiB3aGF0Ci0gICAgICogd2Via2l0IGRyYXdzLiAgVGh1cyB3ZSBuZWVkIHRvIHJlcG9zaXRpb24gaXQgdG8gc2hvdyBpbiB0aGUgY29ycmVjdAotICAgICAqIHBsYWNlLgorICAgICAqIEtlZXAgdHJhY2sgb2YgdGhlIENhbGxiYWNrIHNvIHdlIGNhbiBlbmQgaXRzIEFjdGlvbk1vZGUgb3IgcmVtb3ZlIGl0cworICAgICAqIHRpdGxlYmFyLgogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXc7CisgICAgcHJpdmF0ZSBTZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2sgbVNlbGVjdENhbGxiYWNrOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGJvb2xlYW4gYWxsb3dJbnRlcnNlY3QpIHsKICAgICAgICAgUmVjdCBjb250ZW50Qm91bmRzID0gbmF0aXZlRm9jdXNDYW5kaWRhdGVOb2RlQm91bmRzKCk7CkBAIC0zNjM1LDI1ICszNjExLDU0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZHJhd0V4dHJhcyhDYW52YXMgY2FudmFzLCBpbnQgZXh0cmFzLCBib29sZWFuIGFuaW1hdGlvbnNSdW5uaW5nKSB7Ci0gICAgICAgIC8vIElmIG1OYXRpdmVDbGFzcyBpcyAwLCB3ZSBzaG91bGQgbm90IHJlYWNoIGhlcmUsIHNvIHdlIGRvIG5vdAotICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGl0IGFnYWluLgotICAgICAgICBpZiAoYW5pbWF0aW9uc1J1bm5pbmcpIHsKLSAgICAgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG1XZWJWaWV3Q29yZS5tWm9vbUZpbHRlcik7CisgICAgcHJpdmF0ZSB2b2lkIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCkgeworICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3IG1pc3BsYWNlZC4KKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgeworICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQoZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZURyYXdFeHRyYXMoY2FudmFzLCBleHRyYXMpOwotICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihudWxsKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgb25ab29tQW5pbWF0aW9uRW5kKCkgeworICAgICAgICAvLyBhZGp1c3QgdGhlIGVkaXQgdGV4dCB2aWV3IGlmIG5lZWRlZAorICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgeworICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXNzd29yZCBmaWVsZCwgc3RhcnQgZHJhd2luZyB0aGUgV2ViVGV4dFZpZXcgb25jZQorICAgICAgICAgICAgLy8gYWdhaW4uCisgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25GaXhlZExlbmd0aFpvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgV2ViVmlld0NvcmUucGF1c2VVcGRhdGVQaWN0dXJlKGdldFdlYlZpZXdDb3JlKCkpOworICAgICAgICBvblpvb21BbmltYXRpb25TdGFydCgpOworICAgIH0KKworICAgIHZvaWQgb25GaXhlZExlbmd0aFpvb21BbmltYXRpb25FbmQoKSB7CisgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuU1VCUElYRUxfVEVYVF9GTEFHOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRElUSEVSX0ZMQUc7CisKKyAgICBwcml2YXRlIGZpbmFsIERyYXdGaWx0ZXIgbVpvb21GaWx0ZXIgPQorICAgICAgICAgICAgbmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFpPT01fQklUUywgUGFpbnQuTElORUFSX1RFWFRfRkxBRyk7CisgICAgLy8gSWYgd2UgbmVlZCB0byB0cmFkZSBiZXR0ZXIgcXVhbGl0eSBmb3Igc3BlZWQsIHNldCBtU2Nyb2xsRmlsdGVyIHRvIG51bGwKKyAgICBwcml2YXRlIGZpbmFsIERyYXdGaWx0ZXIgbVNjcm9sbEZpbHRlciA9CisgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoU0NST0xMX0JJVFMsIDApOworCiAgICAgcHJpdmF0ZSB2b2lkIGRyYXdDb3JlQW5kQ3Vyc29yUmluZyhDYW52YXMgY2FudmFzLCBpbnQgY29sb3IsCiAgICAgICAgIGJvb2xlYW4gZHJhd0N1cnNvclJpbmcpIHsKICAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1BY3R1YWxTY2FsZSwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSwgbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICAgICAgY2FudmFzLmRyYXdQaWN0dXJlKG1IaXN0b3J5UGljdHVyZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47CiAKLSAgICAgICAgYm9vbGVhbiBhbmltYXRlWm9vbSA9IG1ab29tU2NhbGUgIT0gMDsKKyAgICAgICAgYm9vbGVhbiBhbmltYXRlWm9vbSA9IG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpOwogICAgICAgICBib29sZWFuIGFuaW1hdGVTY3JvbGwgPSAoKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpCiAgICAgICAgICAgICAgICAgfHwgbVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKQogICAgICAgICAgICAgICAgICYmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSB8fApAQCAtMzY3Miw1OSArMzY3Nyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFuaW1hdGVab29tKSB7Ci0gICAgICAgICAgICBmbG9hdCB6b29tU2NhbGU7Ci0gICAgICAgICAgICBpbnQgaW50ZXJ2YWwgPSAoaW50KSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtWm9vbVN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChpbnRlcnZhbCA8IFpPT01fQU5JTUFUSU9OX0xFTkdUSCkgewotICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSBpbnRlcnZhbCAvIFpPT01fQU5JTUFUSU9OX0xFTkdUSDsKLSAgICAgICAgICAgICAgICB6b29tU2NhbGUgPSAxLjBmIC8gKG1JbnZJbml0aWFsWm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICArIChtSW52RmluYWxab29tU2NhbGUgLSBtSW52SW5pdGlhbFpvb21TY2FsZSkgKiByYXRpbyk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB6b29tU2NhbGUgPSBtWm9vbVNjYWxlOwotICAgICAgICAgICAgICAgIC8vIHNldCBtWm9vbVNjYWxlIHRvIGJlIDAgYXMgd2UgaGF2ZSBkb25lIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIG1ab29tU2NhbGUgPSAwOwotICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSBhZ2FpbiB0byBkcmF3IHdpdGggdGhlIGZpbmFsIGZpbHRlcnMKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZWVkVG9BZGp1c3RXZWJUZXh0VmlldykgewotICAgICAgICAgICAgICAgICAgICBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2ViVGV4dFZpZXcgb25jZSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBpbnRlcm1lZGlhdGUgc2Nyb2xsIHBvc2l0aW9uLiBBcyB3ZSBuZWVkIHRvIHVzZQotICAgICAgICAgICAgLy8gem9vbVNjYWxlLCB3ZSBjYW4ndCB1c2UgcGluTG9jWC9ZIGRpcmVjdGx5LiBDb3B5IHRoZSBsb2dpYyBoZXJlLgotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSB6b29tU2NhbGUgKiBtSW52SW5pdGlhbFpvb21TY2FsZTsKLSAgICAgICAgICAgIGludCB0eCA9IE1hdGgucm91bmQoc2NhbGUgKiAobUluaXRpYWxTY3JvbGxYICsgbVpvb21DZW50ZXJYKQotICAgICAgICAgICAgICAgICAgICAtIG1ab29tQ2VudGVyWCk7Ci0gICAgICAgICAgICB0eCA9IC1waW5Mb2ModHgsIGdldFZpZXdXaWR0aCgpLCBNYXRoLnJvdW5kKG1Db250ZW50V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIG1TY3JvbGxYOwotICAgICAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKLSAgICAgICAgICAgIGludCB0eSA9IE1hdGgucm91bmQoc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgKiAobUluaXRpYWxTY3JvbGxZICsgbVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIC0gKG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KSk7Ci0gICAgICAgICAgICB0eSA9IC0odHkgPD0gdGl0bGVIZWlnaHQgPyBNYXRoLm1heCh0eSwgMCkgOiBwaW5Mb2ModHkKLSAgICAgICAgICAgICAgICAgICAgLSB0aXRsZUhlaWdodCwgZ2V0Vmlld0hlaWdodCgpLCBNYXRoLnJvdW5kKG1Db250ZW50SGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyB0aXRsZUhlaWdodCkgKyBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHgsIHR5KTsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZSh6b29tU2NhbGUsIHpvb21TY2FsZSk7Ci0gICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmICFtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgJiYgbVpvb21TY2FsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIFdlYlRleHRWaWV3IGlzIHVwLiAgS2VlcCB0cmFjayBvZiB0aGlzIHNvIHdlIGNhbiBhZGp1c3QKLSAgICAgICAgICAgICAgICAvLyBpdHMgc2l6ZSBhbmQgcGxhY2VtZW50IHdoZW4gd2UgZmluaXNoIHpvb21pbmcKLSAgICAgICAgICAgICAgICBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcKLSAgICAgICAgICAgICAgICAvLyBtaXNwbGFjZWQuCi0gICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuYW5pbWF0ZVpvb20oY2FudmFzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtQWN0dWFsU2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUobVpvb21NYW5hZ2VyLmdldFNjYWxlKCksIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gVUlBbmltYXRpb25zUnVubmluZyA9IGZhbHNlOwpAQCAtMzczNiwyMyArMzY5MSwzOCBAQAogICAgICAgICAgICAgLy8gd2UgYXNrIGZvciBhIHJlcGFpbnQuCiAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KLSAgICAgICAgbVdlYlZpZXdDb3JlLmRyYXdDb250ZW50UGljdHVyZShjYW52YXMsIGNvbG9yLAotICAgICAgICAgICAgICAgIChhbmltYXRlWm9vbSB8fCBtUHJldmlld1pvb21Pbmx5IHx8IFVJQW5pbWF0aW9uc1J1bm5pbmcpLAotICAgICAgICAgICAgICAgIGFuaW1hdGVTY3JvbGwpOwotICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybjsKKwogICAgICAgICAvLyBkZWNpZGUgd2hpY2ggYWRvcm5tZW50cyB0byBkcmF3CiAgICAgICAgIGludCBleHRyYXMgPSBEUkFXX0VYVFJBU19OT05FOworICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgeworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAibUZpbmRJc1VwPSIgKyBtRmluZElzVXAKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1TZWxlY3RpbmdUZXh0PSIgKyBtU2VsZWN0aW5nVGV4dAorICAgICAgICAgICAgICAgICAgICArICIgbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCk9IgorICAgICAgICAgICAgICAgICAgICArIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpCisgICAgICAgICAgICAgICAgICAgICsgIiBhbmltYXRlWm9vbT0iICsgYW5pbWF0ZVpvb20pOworICAgICAgICB9CiAgICAgICAgIGlmIChtRmluZElzVXApIHsKLSAgICAgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19GSU5EOworICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfRklORDsKICAgICAgICAgfSBlbHNlIGlmIChtU2VsZWN0aW5nVGV4dCkgewogICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfU0VMRUNUSU9OOwogICAgICAgICAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUG9pbnRlcihtRHJhd1NlbGVjdGlvblBvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCksCiAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RYLCBtU2VsZWN0WSAtIGdldFRpdGxlSGVpZ2h0KCkpOwogICAgICAgICB9IGVsc2UgaWYgKGRyYXdDdXJzb3JSaW5nKSB7CiAgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19DVVJTT1JfUklORzsKICAgICAgICAgfQotICAgICAgICBkcmF3RXh0cmFzKGNhbnZhcywgZXh0cmFzLCBVSUFuaW1hdGlvbnNSdW5uaW5nKTsKKyAgICAgICAgRHJhd0ZpbHRlciBkZiA9IG51bGw7CisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNab29tQW5pbWF0aW5nKCkgfHwgVUlBbmltYXRpb25zUnVubmluZykgeworICAgICAgICAgICAgZGYgPSBtWm9vbUZpbHRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChhbmltYXRlU2Nyb2xsKSB7CisgICAgICAgICAgICBkZiA9IG1TY3JvbGxGaWx0ZXI7CisgICAgICAgIH0KKyAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIoZGYpOworICAgICAgICBpbnQgY29udGVudCA9IG5hdGl2ZURyYXcoY2FudmFzLCBjb2xvciwgZXh0cmFzLCB0cnVlKTsKKyAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobnVsbCk7CisgICAgICAgIGlmIChjb250ZW50ICE9IDApIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TUExJVF9QSUNUVVJFX1NFVCwgY29udGVudCwgMCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZXh0cmFzID09IERSQVdfRVhUUkFTX0NVUlNPUl9SSU5HKSB7CiAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9TSE9SVFBSRVNTX1NUQVJUX01PREUpIHsKQEAgLTM3ODEsMTAgKzM3NTEsMTQgQEAKICAgICAgICAgcmV0dXJuIG1EcmF3SGlzdG9yeTsKICAgICB9CiAKKyAgICBpbnQgZ2V0SGlzdG9yeVBpY3R1cmVXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIChtSGlzdG9yeVBpY3R1cmUgIT0gbnVsbCkgPyBtSGlzdG9yeVBpY3R1cmUuZ2V0V2lkdGgoKSA6IDA7CisgICAgfQorCiAgICAgLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIFVJIHRocmVhZAogICAgIHZvaWQgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKSB7CiAgICAgICAgIGlmIChudWxsID09IG1XZWJWaWV3Q29yZSkgcmV0dXJuOyAvLyBDYWxsYmFja1Byb3h5IG1heSB0cmlnZ2VyIHRoaXMKLSAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSAmJiBtV2ViVmlld0NvcmUucGljdHVyZVJlYWR5KCkpIHsKKyAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSAmJiAoZ2V0UHJvZ3Jlc3MoKSA9PSAxMDAgfHwgbmF0aXZlSGFzQ29udGVudCgpKSkgewogICAgICAgICAgICAgbURyYXdIaXN0b3J5ID0gZmFsc2U7CiAgICAgICAgICAgICBtSGlzdG9yeVBpY3R1cmUgPSBudWxsOwogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtMzgzNSw3ICszODA5LDkgQEAKICAgICAgKiAgQHBhcmFtICBlbmQgICAgIEVuZCBvZiBzZWxlY3Rpb24uCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIHNldFNlbGVjdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9TRUxFQ1RJT04sIHN0YXJ0LCBlbmQpOworICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfU0VMRUNUSU9OLCBzdGFydCwgZW5kKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzg1MywxNCArMzgyOSwxMSBAQAogICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikKICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKIAotICAgICAgICAvLyBicmluZyBpdCBiYWNrIHRvIHRoZSBkZWZhdWx0IHNjYWxlIHNvIHRoYXQgdXNlciBjYW4gZW50ZXIgdGV4dAotICAgICAgICBib29sZWFuIHpvb20gPSBtQWN0dWFsU2NhbGUgPCBtRGVmYXVsdFNjYWxlOworICAgICAgICAvLyBicmluZyBpdCBiYWNrIHRvIHRoZSBkZWZhdWx0IGxldmVsIHNjYWxlIHNvIHRoYXQgdXNlciBjYW4gZW50ZXIgdGV4dAorICAgICAgICBib29sZWFuIHpvb20gPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSA8IG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKTsKICAgICAgICAgaWYgKHpvb20pIHsKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBtTGFzdFRvdWNoWTsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBjaGFuZ2UgdGV4dCB3cmFwIHNjYWxlIHNvIHRoYXQgdGhlcmUgaXMgbm8gcmVmbG93Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobURlZmF1bHRTY2FsZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbVNjYWxlKG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc1RleHRWaWV3KSB7CiAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKQEAgLTM4NzIsNyArMzg0NSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIFVzZWQgYnkgcGx1Z2lucy4KKyAgICAgICAgLy8gVXNlZCBieSBwbHVnaW5zIGFuZCBjb250ZW50RWRpdGFibGUuCiAgICAgICAgIC8vIEFsc28gdXNlZCBpZiB0aGUgbmF2aWdhdGlvbiBjYWNoZSBpcyBvdXQgb2YgZGF0ZSwgYW5kCiAgICAgICAgIC8vIGRvZXMgbm90IHJlY29nbml6ZSB0aGF0IGEgdGV4dGZpZWxkIGlzIGluIGZvY3VzLiAgSW4gdGhhdAogICAgICAgICAvLyBjYXNlLCB1c2UgV2ViVmlldyBhcyB0aGUgdGFyZ2V0ZWQgdmlldy4KQEAgLTM4ODIsMTAgKzM4NTUsMTEgQEAKIAogICAgIC8vIENhbGxlZCBieSBXZWJLaXQgdG8gaW5zdHJ1Y3QgdGhlIFVJIHRvIGhpZGUgdGhlIGtleWJvYXJkCiAgICAgcHJpdmF0ZSB2b2lkIGhpZGVTb2Z0S2V5Ym9hcmQoKSB7Ci0gICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKQotICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOwotCi0gICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyh0aGlzLmdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOworICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgKGltbS5pc0FjdGl2ZSh0aGlzKQorICAgICAgICAgICAgICAgIHx8IChpbkVkaXRpbmdNb2RlKCkgJiYgaW1tLmlzQWN0aXZlKG1XZWJUZXh0VmlldykpKSkgeworICAgICAgICAgICAgaW1tLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KHRoaXMuZ2V0V2luZG93VG9rZW4oKSwgMCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKgpAQCAtMzkxMCw3ICszODg0LDcgQEAKICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSBoYXZlIGZvdW5kIGFuIGlucHV0IGZpZWxkLCBzbyBnbyBhaGVhZAogICAgICAgICAvLyBhbmQgY3JlYXRlIHRoZSBXZWJUZXh0VmlldyBpZiBuZWNlc3NhcnkuCiAgICAgICAgIGlmIChtV2ViVGV4dFZpZXcgPT0gbnVsbCkgewotICAgICAgICAgICAgbVdlYlRleHRWaWV3ID0gbmV3IFdlYlRleHRWaWV3KG1Db250ZXh0LCBXZWJWaWV3LnRoaXMpOworICAgICAgICAgICAgbVdlYlRleHRWaWV3ID0gbmV3IFdlYlRleHRWaWV3KG1Db250ZXh0LCBXZWJWaWV3LnRoaXMsIG1BdXRvRmlsbFF1ZXJ5SWQpOwogICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBvdXIgZ2VuZXJhdGlvbiBudW1iZXIuCiAgICAgICAgICAgICBtVGV4dEdlbmVyYXRpb24gPSAwOwogICAgICAgICB9CkBAIC0zOTYzLDE5ICszOTM3LDMwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGVsbCB3ZWJraXQgdG8gcHV0IHRoZSBjdXJzb3Igb24gc2NyZWVuLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZXZlYWxTZWxlY3Rpb24oKSB7CisgICAgICAgIGlmIChtV2ViVmlld0NvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlJFVkVBTF9TRUxFQ1RJT04pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IFdlYlRleHRWaWV3IHRvIGZpbmQgc2F2ZWQgZm9ybSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgICAgKiB0ZXh0ZmllbGQKICAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXh0ZmllbGQuCiAgICAgICogQHBhcmFtIG5vZGVQb2ludGVyIFBvaW50ZXIgdG8gdGhlIG5vZGUgb2YgdGhlIHRleHRmaWVsZCwgc28gaXQgY2FuIGJlCiAgICAgICogICAgICAgICAgY29tcGFyZWQgdG8gdGhlIGN1cnJlbnRseSBmb2N1c2VkIHRleHRmaWVsZCB3aGVuIHRoZSBkYXRhIGlzCiAgICAgICogICAgICAgICAgcmV0cmlldmVkLgorICAgICAqIEBwYXJhbSBhdXRvRmlsbGFibGUgdHJ1ZSBpZiBXZWJLaXQgaGFzIGRldGVybWluZWQgdGhpcyBmaWVsZCBpcyBwYXJ0IG9mCisgICAgICogICAgICAgICAgYSBmb3JtIHRoYXQgY2FuIGJlIGF1dG8gZmlsbGVkLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZXF1ZXN0Rm9ybURhdGEoU3RyaW5nIG5hbWUsIGludCBub2RlUG9pbnRlcikgeworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZXF1ZXN0Rm9ybURhdGEoU3RyaW5nIG5hbWUsIGludCBub2RlUG9pbnRlciwgYm9vbGVhbiBhdXRvRmlsbGFibGUpIHsKICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpLmdldFNhdmVGb3JtRGF0YSgpKSB7CiAgICAgICAgICAgICBNZXNzYWdlIHVwZGF0ZSA9IG1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFJFUVVFU1RfRk9STV9EQVRBKTsKICAgICAgICAgICAgIHVwZGF0ZS5hcmcxID0gbm9kZVBvaW50ZXI7CiAgICAgICAgICAgICBSZXF1ZXN0Rm9ybURhdGEgdXBkYXRlciA9IG5ldyBSZXF1ZXN0Rm9ybURhdGEobmFtZSwgZ2V0VXJsKCksCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSwgYXV0b0ZpbGxhYmxlKTsKICAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCh1cGRhdGVyKTsKICAgICAgICAgICAgIHQuc3RhcnQoKTsKICAgICAgICAgfQpAQCAtNDAwMSwxNSArMzk4NiwyOCBAQAogICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVVybDsKICAgICAgICAgcHJpdmF0ZSBNZXNzYWdlIG1VcGRhdGVNZXNzYWdlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUF1dG9GaWxsYWJsZTsKIAotICAgICAgICBwdWJsaWMgUmVxdWVzdEZvcm1EYXRhKFN0cmluZyBuYW1lLCBTdHJpbmcgdXJsLCBNZXNzYWdlIG1zZykgeworICAgICAgICBwdWJsaWMgUmVxdWVzdEZvcm1EYXRhKFN0cmluZyBuYW1lLCBTdHJpbmcgdXJsLCBNZXNzYWdlIG1zZywgYm9vbGVhbiBhdXRvRmlsbGFibGUpIHsKICAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKICAgICAgICAgICAgIG1VcmwgPSB1cmw7CiAgICAgICAgICAgICBtVXBkYXRlTWVzc2FnZSA9IG1zZzsKKyAgICAgICAgICAgIG1BdXRvRmlsbGFibGUgPSBhdXRvRmlsbGFibGU7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXN0RW50cmllcyA9IG1EYXRhYmFzZS5nZXRGb3JtRGF0YShtVXJsLCBtTmFtZSk7CisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXN0RW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICAgICAgaWYgKG1BdXRvRmlsbGFibGUpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgY29kZSBpbnNpZGUgdGhlIGFkYXB0ZXIgY2xpY2sgaGFuZGxlciBpbiBXZWJUZXh0VmlldyBkZXBlbmRzCisgICAgICAgICAgICAgICAgLy8gb24gdGhlIEF1dG9GaWxsIGl0ZW0gYmVpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZHJvcCBkb3duIGxpc3QuIElmIHlvdSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIsIG1ha2Ugc3VyZSB0byBkbyBpdCB0aGVyZSB0b28hCisgICAgICAgICAgICAgICAgcGFzdEVudHJpZXMuYWRkKGdldFJlc291cmNlcygpLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5hdXRvZmlsbF90aGlzX2Zvcm0pLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXN0RW50cmllcy5hZGRBbGwobURhdGFiYXNlLmdldEZvcm1EYXRhKG1VcmwsIG1OYW1lKSk7CisKICAgICAgICAgICAgIGlmIChwYXN0RW50cmllcy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgQXV0b0NvbXBsZXRlQWRhcHRlciBhZGFwdGVyID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvQ29tcGxldGVBZGFwdGVyKG1Db250ZXh0LCBwYXN0RW50cmllcyk7CkBAIC00MDQ5LDYgKzQwNDcsMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgRFJUIG9uIFVJIHRocmVhZCwgbmVlZCB0byBwcm94eSB0byBXZWJDb3JlIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBoaWRlIGRlYnVnIG9ubHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1c2VNb2NrRGV2aWNlT3JpZW50YXRpb24oKSB7CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5VU0VfTU9DS19ERVZJQ0VfT1JJRU5UQVRJT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBEUlQgb24gV2ViQ29yZSB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAaGlkZSBkZWJ1ZyBvbmx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBtV2ViVmlld0NvcmUuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKworICAgIC8qKgogICAgICAqIER1bXAgdGhlIFY4IGNvdW50ZXJzIHRvIHN0YW5kYXJkIG91dHB1dC4KICAgICAgKiBOb3RlIHRoYXQgeW91IG5lZWQgYSBidWlsZCB3aXRoIFY4IGFuZCBXRUJDT1JFX0lOU1RSVU1FTlRBVElPTiBzZXQgdG8KICAgICAgKiB0cnVlLiBPdGhlcndpc2UsIHRoaXMgd2lsbCBkbyBub3RoaW5nLgpAQCAtNDA5OSwxNCArNDExNywxNiBAQAogICAgICAgICAvLyBCdWJibGUgdXAgdGhlIGtleSBldmVudCBpZgogICAgICAgICAvLyAxLiBpdCBpcyBhIHN5c3RlbSBrZXk7IG9yCiAgICAgICAgIC8vIDIuIHRoZSBob3N0IGFwcGxpY2F0aW9uIHdhbnRzIHRvIGhhbmRsZSBpdDsKKyAgICAgICAgLy8gMy4gdGhlIGFjY2Vzc2liaWxpdHkgaW5qZWN0b3IgaXMgcHJlc2VudCBhbmQgd2FudHMgdG8gaGFuZGxlIGl0OwogICAgICAgICBpZiAoZXZlbnQuaXNTeXN0ZW0oKQotICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkpIHsKKyAgICAgICAgICAgICAgICB8fCBtQ2FsbGJhY2tQcm94eS51aU92ZXJyaWRlS2V5RXZlbnQoZXZlbnQpCisgICAgICAgICAgICAgICAgfHwgKG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgIT0gbnVsbCAmJiBtQWNjZXNzaWJpbGl0eUluamVjdG9yLm9uS2V5RXZlbnQoZXZlbnQpKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9MRUZUCiAgICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX1JJR0hUKSB7Ci0gICAgICAgICAgICBpZiAobmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7CisgICAgICAgICAgICBpZiAocGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpIHsKICAgICAgICAgICAgICAgICBtU2hpZnRJc1ByZXNzZWQgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmICghbmF0aXZlQ3Vyc29yV2FudHNLZXlFdmVudHMoKSAmJiAhbVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgICAgICBzZXRVcFNlbGVjdCgpOwpAQCAtNDEyNiw4ICs0MTQ2LDggQEAKICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKICAgICAgICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7Ci0gICAgICAgICAgICBpZiAobmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7Ci0gICAgICAgICAgICAgICAgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChwYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgeworICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIHRydWUpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CkBAIC00MjUxLDEzICs0MjcxLDE2IEBACiAgICAgICAgIC8vIEJ1YmJsZSB1cCB0aGUga2V5IGV2ZW50IGlmCiAgICAgICAgIC8vIDEuIGl0IGlzIGEgc3lzdGVtIGtleTsgb3IKICAgICAgICAgLy8gMi4gdGhlIGhvc3QgYXBwbGljYXRpb24gd2FudHMgdG8gaGFuZGxlIGl0OwotICAgICAgICBpZiAoZXZlbnQuaXNTeXN0ZW0oKSB8fCBtQ2FsbGJhY2tQcm94eS51aU92ZXJyaWRlS2V5RXZlbnQoZXZlbnQpKSB7CisgICAgICAgIC8vIDMuIHRoZSBhY2Nlc3NpYmlsaXR5IGluamVjdG9yIGlzIHByZXNlbnQgYW5kIHdhbnRzIHRvIGhhbmRsZSBpdDsKKyAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkKKyAgICAgICAgICAgICAgICB8fCBtQ2FsbGJhY2tQcm94eS51aU92ZXJyaWRlS2V5RXZlbnQoZXZlbnQpCisgICAgICAgICAgICAgICAgfHwgKG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgIT0gbnVsbCAmJiBtQWNjZXNzaWJpbGl0eUluamVjdG9yLm9uS2V5RXZlbnQoZXZlbnQpKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9MRUZUCiAgICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX1JJR0hUKSB7Ci0gICAgICAgICAgICBpZiAobmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7CisgICAgICAgICAgICBpZiAocGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpIHsKICAgICAgICAgICAgICAgICBtU2hpZnRJc1ByZXNzZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29weVNlbGVjdGlvbigpKSB7CiAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwpAQCAtNDI2Nyw4ICs0MjkwLDggQEAKIAogICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlIDw9IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCkgewotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgewotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gYWx3YXlzIGhhbmRsZSB0aGUgbmF2aWdhdGlvbiBrZXlzIGluIHRoZSBVSSB0aHJlYWQKQEAgLTQzMTEsOCArNDMzNCw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkodHJ1ZSk7Ci0gICAgICAgICAgICBuYXRpdmVTZXRGb2xsb3dlZExpbmsodHJ1ZSk7CisgICAgICAgICAgICBjbGVhclRleHRFbnRyeSgpOworICAgICAgICAgICAgbmF0aXZlU2hvd0N1cnNvclRpbWVkKCk7CiAgICAgICAgICAgICBpZiAoIW1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVVcmxMb2FkaW5nKG5hdGl2ZUN1cnNvclRleHQoKSkpIHsKICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQ0xJQ0ssIGRhdGEubUZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ3Vyc29yTm9kZVBvaW50ZXIoKSk7CkBAIC00MzMyLDEwICs0MzU1LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXBTZWxlY3QoKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNldFVwU2VsZWN0KCkgewogICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybjsgLy8gY2xpZW50IGlzbid0IGluaXRpYWxpemVkCiAgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkpIHJldHVybjsKICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSByZXR1cm47CkBAIC00MzU2LDYgKzQzNzYsMTUgQEAKICAgICAgICAgICAgIG1TZWxlY3RZID0gbVNjcm9sbFkgKyBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCkgLyAyOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZUhpZGVDdXJzb3IoKTsKKyAgICAgICAgbVNlbGVjdENhbGxiYWNrID0gbmV3IFNlbGVjdEFjdGlvbk1vZGVDYWxsYmFjaygpOworICAgICAgICBtU2VsZWN0Q2FsbGJhY2suc2V0V2ViVmlldyh0aGlzKTsKKyAgICAgICAgVmlldyB0aXRsZUJhciA9IG1UaXRsZUJhcjsKKyAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgZW1iZWRkZWQgdGl0bGUgYmFyIGR1cmluZyBmaW5kIG9yCisgICAgICAgIC8vIHNlbGVjdCwgYnV0IGtlZXAgdHJhY2sgb2YgaXQgc28gdGhhdCBpdCBjYW4gYmUgcmVwbGFjZWQgd2hlbiB0aGUKKyAgICAgICAgLy8gbW9kZSBpcyBleGl0ZWQuCisgICAgICAgIHNldEVtYmVkZGVkVGl0bGVCYXIobnVsbCk7CisgICAgICAgIG1TZWxlY3RDYWxsYmFjay5zZXRUaXRsZUJhcih0aXRsZUJhcik7CisgICAgICAgIHN0YXJ0QWN0aW9uTW9kZShtU2VsZWN0Q2FsbGJhY2spOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDM2Nyw5ICs0Mzk2LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqIFNlbGVjdCBhbGwgb2YgdGhlIHRleHQgaW4gdGhpcyBXZWJWaWV3LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdEFsbCgpIHsKKyAgICB2b2lkIHNlbGVjdEFsbCgpIHsKICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAogICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpKSByZXR1cm47CiAgICAgICAgIGlmICghbVNlbGVjdGluZ1RleHQpIHNldFVwU2VsZWN0KCk7CkBAIC00MzgwLDM2ICs0NDA5LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0RGlhbG9nSXNVcCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RpbmdUZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2VsZWN0RGlhbG9nRGlzbWlzc2VkKCkgewotICAgICAgICBtU2VsZWN0aW5nVGV4dCA9IGZhbHNlOwotICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25Eb25lKCkgeworICAgIHZvaWQgc2VsZWN0aW9uRG9uZSgpIHsKICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7Ci0gICAgICAgICAgICBXZWJDaHJvbWVDbGllbnQgY2xpZW50ID0gZ2V0V2ViQ2hyb21lQ2xpZW50KCk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIGNsaWVudC5vblNlbGVjdGlvbkRvbmUodGhpcyk7CisgICAgICAgICAgICBtU2VsZWN0aW5nVGV4dCA9IGZhbHNlOworICAgICAgICAgICAgLy8gZmluaXNoIGlzIGlkZW1wb3RlbnQsIHNvIHRoaXMgaXMgZmluZSBldmVuIGlmIHNlbGVjdGlvbkRvbmUgd2FzCisgICAgICAgICAgICAvLyBjYWxsZWQgYnkgbVNlbGVjdENhbGxiYWNrLm9uRGVzdHJveUFjdGlvbk1vZGUKKyAgICAgICAgICAgIG1TZWxlY3RDYWxsYmFjay5maW5pc2goKTsKKyAgICAgICAgICAgIG1TZWxlY3RDYWxsYmFjayA9IG51bGw7CisgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7IC8vIHJlZHJhdyB3aXRob3V0IHNlbGVjdGlvbgotICAgICAgICAgICAgbm90aWZ5U2VsZWN0RGlhbG9nRGlzbWlzc2VkKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqIENvcHkgdGhlIHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29weVNlbGVjdGlvbigpIHsKKyAgICBib29sZWFuIGNvcHlTZWxlY3Rpb24oKSB7CiAgICAgICAgIGJvb2xlYW4gY29waWVkU29tZXRoaW5nID0gZmFsc2U7CiAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKICAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSAiIikgewpAQCAtNDQyMCwyMiArNDQzNywxOCBAQAogICAgICAgICAgICAgICAgICAgICAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRfY29waWVkCiAgICAgICAgICAgICAgICAgICAgICwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CiAgICAgICAgICAgICBjb3BpZWRTb21ldGhpbmcgPSB0cnVlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJQ2xpcGJvYXJkIGNsaXAgPSBJQ2xpcGJvYXJkLlN0dWIuYXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJjbGlwYm9hcmQiKSk7Ci0gICAgICAgICAgICAgICAgY2xpcC5zZXRDbGlwYm9hcmRUZXh0KHNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiQ2xpcGJvYXJkIGZhaWxlZCIsIGUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbSA9IChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKKyAgICAgICAgICAgIGNtLnNldFRleHQoc2VsZWN0aW9uKTsKICAgICAgICAgfQogICAgICAgICBpbnZhbGlkYXRlKCk7IC8vIHJlbW92ZSBzZWxlY3Rpb24gcmVnaW9uIGFuZCBwb2ludGVyCiAgICAgICAgIHJldHVybiBjb3BpZWRTb21ldGhpbmc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgdGV4dCBhcyBhIHN0cmluZy4KICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGlvbigpIHsKKyAgICBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgewogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybiAiIjsKICAgICAgICAgcmV0dXJuIG5hdGl2ZUdldFNlbGVjdGlvbigpOwogICAgIH0KQEAgLTQ0NDksMTEgKzQ0NjIsMjEgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKICAgICAgICAgY2xlYXJIZWxwZXJzKCk7Ci0gICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOworICAgICAgICBtWm9vbU1hbmFnZXIuZGlzbWlzc1pvb21QaWNrZXIoKTsKICAgICAgICAgaWYgKGhhc1dpbmRvd0ZvY3VzKCkpIHNldEFjdGl2ZShmYWxzZSk7CiAgICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChWaWV3IGNoYW5nZWRWaWV3LCBpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICBzdXBlci5vblZpc2liaWxpdHlDaGFuZ2VkKGNoYW5nZWRWaWV3LCB2aXNpYmlsaXR5KTsKKyAgICAgICAgLy8gVGhlIHpvb21NYW5hZ2VyIG1heSBiZSBudWxsIGlmIHRoZSB3ZWJ2aWV3IGlzIGNyZWF0ZWQgZnJvbSBYTUwgdGhhdAorICAgICAgICAvLyBzcGVjaWZpZXMgdGhlIHZpZXcncyB2aXNpYmlsaXR5IHBhcmFtIGFzIG5vdCB2aXNpYmxlIChzZWUgaHR0cDovL2IvMjc5NDg0MSkKKyAgICAgICAgaWYgKHZpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFICYmIG1ab29tTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuZGlzbWlzc1pvb21QaWNrZXIoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEBkZXByZWNhdGVkIFdlYlZpZXcgbm8gbG9uZ2VyIG5lZWRzIHRvIGltcGxlbWVudAogICAgICAqIFZpZXdHcm91cC5PbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyLiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIG5vdy4KQEAgLTQ0ODMsMzIgKzQ1MDYsMzAgQEAKICAgICAgICAgICAgICAgICAvLyBJZiBvdXIgd2luZG93IHJlZ2FpbmVkIGZvY3VzLCBhbmQgd2UgaGF2ZSBmb2N1cywgdGhlbiBiZWdpbgogICAgICAgICAgICAgICAgIC8vIGRyYXdpbmcgdGhlIGN1cnNvciByaW5nCiAgICAgICAgICAgICAgICAgbURyYXdDdXJzb3JSaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlY29yZEJ1dHRvbnModHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX0FDVElWRSwgMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgZ2FpbmVkIGZvY3VzLCBidXQgd2UgZG8gbm90IGhhdmUgaXQsIGRvIG5vdAotICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIGN1cnNvciByaW5nLgotICAgICAgICAgICAgICAgIG1EcmF3Q3Vyc29yUmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICghaW5FZGl0aW5nTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgZ2FpbmVkIGZvY3VzLCBidXQgd2UgZG8gbm90IGhhdmUgaXQsIGRvIG5vdAorICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBjdXJzb3IgcmluZy4KKyAgICAgICAgICAgICAgICAgICAgbURyYXdDdXJzb3JSaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBjYWxsIG5hdGl2ZVJlY29yZEJ1dHRvbnMgaGVyZSBiZWNhdXNlIHdlIGFzc3VtZQogICAgICAgICAgICAgICAgIC8vIHRoYXQgd2hlbiB3ZSBsb3N0IGZvY3VzLCBvciB3aW5kb3cgZm9jdXMsIGl0IGdvdCBjYWxsZWQgd2l0aAogICAgICAgICAgICAgICAgIC8vIGZhbHNlIGZvciB0aGUgZmlyc3QgcGFyYW1ldGVyCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwgJiYgZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmlzVmlzaWJsZSgpKSkgeworICAgICAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIuaXNab29tUGlja2VyVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBUaGUgem9vbSBjb250cm9scyBjb21lIGluIHRoZWlyIG93biB3aW5kb3csIHNvIG91ciB3aW5kb3cKLSAgICAgICAgICAgICAgICAgKiBsb3NlcyBmb2N1cy4gT3VyIHBvbGljeSBpcyB0byBub3QgZHJhdyB0aGUgY3Vyc29yIHJpbmcgaWYKLSAgICAgICAgICAgICAgICAgKiBvdXIgd2luZG93IGlzIG5vdCBmb2N1c2VkLCBidXQgdGhpcyBpcyBhbiBleGNlcHRpb24gc2luY2UKKyAgICAgICAgICAgICAgICAgKiBUaGUgZXh0ZXJuYWwgem9vbSBjb250cm9scyBjb21lIGluIHRoZWlyIG93biB3aW5kb3csIHNvIG91cgorICAgICAgICAgICAgICAgICAqIHdpbmRvdyBsb3NlcyBmb2N1cy4gT3VyIHBvbGljeSBpcyB0byBub3QgZHJhdyB0aGUgY3Vyc29yIHJpbmcKKyAgICAgICAgICAgICAgICAgKiBpZiBvdXIgd2luZG93IGlzIG5vdCBmb2N1c2VkLCBidXQgdGhpcyBpcyBhbiBleGNlcHRpb24gc2luY2UKICAgICAgICAgICAgICAgICAgKiB0aGUgdXNlciBjYW4gc3RpbGwgbmF2aWdhdGUgdGhlIHdlYiBwYWdlIHdpdGggdGhlIHpvb20KICAgICAgICAgICAgICAgICAgKiBjb250cm9scyBzaG93aW5nLgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgaGFzIGxvc3QgZm9jdXMsIHN0b3AgZHJhd2luZyB0aGUgY3Vyc29yIHJpbmcKICAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Hb3RLZXlEb3duID0gZmFsc2U7CkBAIC00NTE4LDcgKzQ1MzksNyBAQAogICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbmF0aXZlUmVjb3JkQnV0dG9ucyhmYWxzZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKTsKKyAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZShmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KQEAgLTQ1NDIsMTEgKzQ1NjMsOSBAQAogICAgICAqIG5vdCBkcmF3IHRoZSBibGlua2luZyBjdXJzb3IuICBJdCBnZXRzIHNldCB0byAiYWN0aXZlIiB0byBkcmF3IHRoZSBjdXJzb3IKICAgICAgKiBpbiBXZWJWaWV3Q29yZS5jcHAsIHdoZW4gdGhlIFdlYkNvcmUgdGhyZWFkIHJlY2VpdmVzIGtleSBldmVudHMvY2xpY2tzLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRGb2N1c0NvbnRyb2xsZXJJbmFjdGl2ZSgpIHsKLSAgICAgICAgLy8gRG8gbm90IG5lZWQgdG8gYWxzbyBjaGVjayB3aGV0aGVyIG1XZWJWaWV3Q29yZSBpcyBudWxsLCBiZWNhdXNlCi0gICAgICAgIC8vIG1OYXRpdmVDbGFzcyBpcyBvbmx5IHNldCBpZiBtV2ViVmlld0NvcmUgaXMgbm9uIG51bGwKLSAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfQUNUSVZFLCAwLCAwKTsKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7CisgICAgICAgIGlmIChtV2ViVmlld0NvcmUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX0FDVElWRSwgYWN0aXZlID8gMSA6IDAsIDApOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNDU2Myw2ICs0NTgyLDcgQEAKICAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlUmVjb3JkQnV0dG9ucyh0cnVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZSh0cnVlKTsKICAgICAgICAgICAgIC8vfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgV2ViVmlldyBoYXMgZ2FpbmVkIGZvY3VzIHdoaWxlIHdlIGRvIG5vdCBoYXZlCiAgICAgICAgICAgICAgICAgLy8gd2luZG93Zm9jdXMuICBXaGVuIG91ciB3aW5kb3cgbG9zdCBmb2N1cywgd2Ugc2hvdWxkIGhhdmUKQEAgLTQ1NzYsNyArNDU5Niw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlY29yZEJ1dHRvbnMoZmFsc2UsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKTsKKyAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUoZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUdvdEtleURvd24gPSBmYWxzZTsKICAgICAgICAgfQpAQCAtNDU5Nyw5NCArNDYxNywzNSBAQAogICAgICAgICAgICAgLy8gc3lzdGVtIHdvbid0IGNhbGwgb25TaXplQ2hhbmdlZCBpZiB0aGUgZGltZW5zaW9uIGlzIG5vdCBjaGFuZ2VkLgogICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNhbGwgc2VuZFZpZXdTaXplWm9vbSgpIGV4cGxpY2l0bHkgdG8KICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgV2ViS2l0IGFib3V0IHRoZSBuZXcgZGltZW5zaW9ucy4KLSAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKKyAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvc3RTY2FsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBtVXBkYXRlVGV4dFdyYXA7Ci0KLSAgICAgICAgcHVibGljIFBvc3RTY2FsZShXZWJWaWV3IHdlYlZpZXcsIGJvb2xlYW4gdXBkYXRlVGV4dFdyYXApIHsKLSAgICAgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKLSAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCA9IHVwZGF0ZVRleHRXcmFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKG1XZWJWaWV3Lm1XZWJWaWV3Q29yZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgYWx3YXlzIGZvcmNlLCBpbiBjYXNlIG91ciBoZWlnaHQgY2hhbmdlZCwgaW4gd2hpY2ggY2FzZSB3ZQotICAgICAgICAgICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9uIG92ZXIgdG8gd2Via2l0LgotICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldE5ld1pvb21TY2FsZShtV2ViVmlldy5tQWN0dWFsU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAsIHRydWUpOwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZAotICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy51cGRhdGVab29tQnV0dG9uc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCB3LCBpbnQgaCwgaW50IG93LCBpbnQgb2gpIHsKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvdywgb2gpOwotICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChtWm9vbVNjYWxlID09IDApIHsgLy8gdW5sZXNzIHdlJ3JlIGFscmVhZHkgem9vbWluZwotICAgICAgICAgICAgLy8gVG8gYW5jaG9yIGF0IHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKTsKLSAgICAgICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIH0KIAogICAgICAgICAvLyBhZGp1c3QgdGhlIG1heCB2aWV3cG9ydCB3aWR0aCBkZXBlbmRpbmcgb24gdGhlIHZpZXcgZGltZW5zaW9ucy4gVGhpcwogICAgICAgICAvLyBpcyB0byBlbnN1cmUgdGhlIHNjYWxpbmcgaXMgbm90IGdvaW5nIGluc2FuZS4gU28gZG8gbm90IHNocmluayBpdCBpZgogICAgICAgICAvLyB0aGUgdmlldyBzaXplIGlzIHRlbXBvcmFyaWx5IHNtYWxsZXIsIGUuZy4gd2hlbiBzb2Z0IGtleWJvYXJkIGlzIHVwLgotICAgICAgICBpbnQgbmV3TWF4Vmlld3BvcnRXaWR0aCA9IChpbnQpIChNYXRoLm1heCh3LCBoKSAvIERFRkFVTFRfTUlOX1pPT01fU0NBTEUpOworICAgICAgICBpbnQgbmV3TWF4Vmlld3BvcnRXaWR0aCA9IChpbnQpIChNYXRoLm1heCh3LCBoKSAvIG1ab29tTWFuYWdlci5nZXREZWZhdWx0TWluWm9vbVNjYWxlKCkpOwogICAgICAgICBpZiAobmV3TWF4Vmlld3BvcnRXaWR0aCA+IHNNYXhWaWV3cG9ydFdpZHRoKSB7CiAgICAgICAgICAgICBzTWF4Vmlld3BvcnRXaWR0aCA9IG5ld01heFZpZXdwb3J0V2lkdGg7CiAgICAgICAgIH0KIAotICAgICAgICAvLyB1cGRhdGUgbU1pblpvb21TY2FsZSBpZiB0aGUgbWluaW11bSB6b29tIHNjYWxlIGlzIG5vdCBmaXhlZAotICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgewotICAgICAgICAgICAgLy8gd2hlbiBjaGFuZ2UgZnJvbSBuYXJyb3cgc2NyZWVuIHRvIHdpZGUgc2NyZWVuLCB0aGUgbmV3IHZpZXdXaWR0aAotICAgICAgICAgICAgLy8gY2FuIGJlIHdpZGVyIHRoYW4gdGhlIG9sZCBjb250ZW50IHdpZHRoLiBXZSBsaW1pdCB0aGUgbWluaW11bQotICAgICAgICAgICAgLy8gc2NhbGUgdG8gMS4wZi4gVGhlIHByb3BlciBtaW5pbXVtIHNjYWxlIHdpbGwgYmUgY2FsY3VsYXRlZCB3aGVuCi0gICAgICAgICAgICAvLyB0aGUgbmV3IHBpY3R1cmUgc2hvd3MgdXAuCi0gICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gTWF0aC5taW4oMS4wZiwgKGZsb2F0KSBnZXRWaWV3V2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAvIChtRHJhd0hpc3RvcnkgPyBtSGlzdG9yeVBpY3R1cmUuZ2V0V2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVpvb21PdmVydmlld1dpZHRoKSk7Ci0gICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZUluUGVyY2VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBsaW1pdCB0aGUgbWluWm9vbVNjYWxlIHRvIHRoZSBpbml0aWFsU2NhbGUgaWYgaXQgaXMgc2V0Ci0gICAgICAgICAgICAgICAgZmxvYXQgaW5pdGlhbFNjYWxlID0gbUluaXRpYWxTY2FsZUluUGVyY2VudCAvIDEwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAobU1pblpvb21TY2FsZSA+IGluaXRpYWxTY2FsZSkgewotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gaW5pdGlhbFNjYWxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOwotCi0gICAgICAgIC8vIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQgZHVyaW5nIFdlYlZpZXcgbGF5b3V0LiBBbmQgYW55Ci0gICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKSBpcyBibG9ja2VkIGR1cmluZyBsYXlvdXQuIEFzIHNldE5ld1pvb21TY2FsZSgpIHdpbGwKLSAgICAgICAgLy8gY2FsbCBpdHMgY2hpbGQgVmlldyB0byByZXBvc2l0aW9uIGl0c2VsZiB0aHJvdWdoIFZpZXdNYW5hZ2VyJ3MKLSAgICAgICAgLy8gc2NhbGVBbGwoKSwgd2UgbmVlZCB0byBwb3N0IGEgUnVubmFibGUgdG8gZW5zdXJlIHJlcXVlc3RMYXlvdXQoKS4KLSAgICAgICAgLy8gPGIvPgotICAgICAgICAvLyBvbmx5IHVwZGF0ZSB0aGUgdGV4dCB3cmFwIHNjYWxlIGlmIHdpZHRoIGNoYW5nZWQuCi0gICAgICAgIHBvc3QobmV3IFBvc3RTY2FsZSh0aGlzLCB3ICE9IG93KSk7CisgICAgICAgIG1ab29tTWFuYWdlci5vblNpemVDaGFuZ2VkKHcsIGgsIG93LCBvaCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TY3JvbGxDaGFuZ2VkKGludCBsLCBpbnQgdCwgaW50IG9sZGwsIGludCBvbGR0KSB7CiAgICAgICAgIHN1cGVyLm9uU2Nyb2xsQ2hhbmdlZChsLCB0LCBvbGRsLCBvbGR0KTsKLSAgICAgICAgaWYgKCFtSW5PdmVyU2Nyb2xsTW9kZSkgewotICAgICAgICAgICAgc2VuZE91clZpc2libGVSZWN0KCk7Ci0gICAgICAgICAgICAvLyB1cGRhdGUgV2ViS2l0IGlmIHZpc2libGUgdGl0bGUgYmFyIGhlaWdodCBjaGFuZ2VkLiBUaGUgbG9naWMgaXMgc2FtZQotICAgICAgICAgICAgLy8gYXMgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0LgotICAgICAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKLSAgICAgICAgICAgIGlmIChNYXRoLm1heCh0aXRsZUhlaWdodCAtIHQsIDApICE9IE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gb2xkdCwgMCkpIHsKLSAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHNlbmRPdXJWaXNpYmxlUmVjdCgpOworICAgICAgICAvLyB1cGRhdGUgV2ViS2l0IGlmIHZpc2libGUgdGl0bGUgYmFyIGhlaWdodCBjaGFuZ2VkLiBUaGUgbG9naWMgaXMgc2FtZQorICAgICAgICAvLyBhcyBnZXRWaXNpYmxlVGl0bGVIZWlnaHQuCisgICAgICAgIGludCB0aXRsZUhlaWdodCA9IGdldFRpdGxlSGVpZ2h0KCk7CisgICAgICAgIGlmIChNYXRoLm1heCh0aXRsZUhlaWdodCAtIHQsIDApICE9IE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gb2xkdCwgMCkpIHsKKyAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NjkyLDkgKzQ2NTMsMTEgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGJvb2xlYW4gZGlzcGF0Y2ggPSB0cnVlOwogCi0gICAgICAgIC8vIFRleHRmaWVsZHMgYW5kIHBsdWdpbnMgbmVlZCB0byByZWNlaXZlIHRoZSBzaGlmdCB1cCBrZXkgZXZlbiBpZgotICAgICAgICAvLyBhbm90aGVyIGtleSB3YXMgcmVsZWFzZWQgd2hpbGUgdGhlIHNoaWZ0IGtleSB3YXMgaGVsZCBkb3duLgotICAgICAgICBpZiAoIWluRWRpdGluZ01vZGUoKSAmJiAobU5hdGl2ZUNsYXNzID09IDAgfHwgIW5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkpIHsKKyAgICAgICAgLy8gVGV4dGZpZWxkcywgcGx1Z2lucywgYW5kIGNvbnRlbnRFZGl0YWJsZSBub2RlcyBuZWVkIHRvIHJlY2VpdmUgdGhlCisgICAgICAgIC8vIHNoaWZ0IHVwIGtleSBldmVuIGlmIGFub3RoZXIga2V5IHdhcyByZWxlYXNlZCB3aGlsZSB0aGUgc2hpZnQga2V5CisgICAgICAgIC8vIHdhcyBoZWxkIGRvd24uCisgICAgICAgIGlmICghaW5FZGl0aW5nTW9kZSgpICYmIChtTmF0aXZlQ2xhc3MgPT0gMAorICAgICAgICAgICAgICAgIHx8ICFuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkpIHsKICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgICAgIG1Hb3RLZXlEb3duID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NzU0LDcgKzQ3MTcsNyBAQAogICAgICAgICBwdWJsaWMgRHJhZ1RyYWNrZXJIYW5kbGVyKGZsb2F0IHgsIGZsb2F0IHksIERyYWdUcmFja2VyIHByb3h5KSB7CiAgICAgICAgICAgICBtUHJveHkgPSBwcm94eTsKIAotICAgICAgICAgICAgaW50IGRvY0JvdHRvbSA9IGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKTsKKyAgICAgICAgICAgIGludCBkb2NCb3R0b20gPSBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgICAgIGludCB2aWV3VG9wID0gZ2V0U2Nyb2xsWSgpOwogICAgICAgICAgICAgaW50IHZpZXdCb3R0b20gPSB2aWV3VG9wICsgZ2V0SGVpZ2h0KCk7CiAKQEAgLTQ3NjcsNyArNDczMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIiB1cC9kb3duPSAiICsgbU1pbkRZICsgIiAiICsgbU1heERZKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50IGRvY1JpZ2h0ID0gY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKTsKKyAgICAgICAgICAgIGludCBkb2NSaWdodCA9IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKTsKICAgICAgICAgICAgIGludCB2aWV3TGVmdCA9IGdldFNjcm9sbFgoKTsKICAgICAgICAgICAgIGludCB2aWV3UmlnaHQgPSB2aWV3TGVmdCArIGdldFdpZHRoKCk7CiAgICAgICAgICAgICBtU3RhcnRYID0geDsKQEAgLTQ5MjgsODEgKzQ4OTEsNiBAQAogICAgIHByaXZhdGUgRHJhZ1RyYWNrZXIgbURyYWdUcmFja2VyOwogICAgIHByaXZhdGUgRHJhZ1RyYWNrZXJIYW5kbGVyIG1EcmFnVHJhY2tlckhhbmRsZXI7CiAKLSAgICBwcml2YXRlIGNsYXNzIFNjYWxlRGV0ZWN0b3JMaXN0ZW5lciBpbXBsZW1lbnRzCi0gICAgICAgICAgICBTY2FsZUdlc3R1cmVEZXRlY3Rvci5PblNjYWxlR2VzdHVyZUxpc3RlbmVyIHsKLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgc2luZ2xlIHRvdWNoIGhhbmRsaW5nCi0gICAgICAgICAgICBjYW5jZWxUb3VjaCgpOwotICAgICAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0gICAgICAgICAgICAvLyByZXNldCB0aGUgem9vbSBvdmVydmlldyBtb2RlIHNvIHRoYXQgdGhlIHBhZ2Ugd29uJ3QgYXV0byBncm93Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcKLSAgICAgICAgICAgIC8vIG1pc3BsYWNlZC4KLSAgICAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1WaWV3TWFuYWdlci5zdGFydFpvb20oKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjYWxlRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCByZWZsb3cgd2hlbiB6b29tIGluOyB3aGVuIHpvb20gb3V0LCBkbyByZWZsb3cgaWYgdGhlCi0gICAgICAgICAgICAgICAgLy8gbmV3IHNjYWxlIGlzIGFsbW9zdCBtaW5pbXVtIHNjYWxlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVmbG93Tm93ID0gKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChtQWN0dWFsU2NhbGUgPD0gMC44ICogbVRleHRXcmFwU2NhbGUpKTsKLSAgICAgICAgICAgICAgICAvLyBmb3JjZSB6b29tIGFmdGVyIG1QcmV2aWV3Wm9vbU9ubHkgaXMgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgLy8gbmV3IHZpZXcgc2l6ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV2ViS2l0Ci0gICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgcmVmbG93Tm93LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSB0byBkcmF3IHdpdGhvdXQgem9vbSBmaWx0ZXIKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGVkaXQgdGV4dCB2aWV3IGlmIG5lZWRlZAotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZQotICAgICAgICAgICAgICAgIC8vIFdlYlRleHRWaWV3IG9uY2UgYWdhaW4uCi0gICAgICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzdGFydCBhIGRyYWcsIFRPVUNIX1BJTkNIX0RSQUcsIGNhbid0IHVzZSBUT1VDSF9JTklUX01PREUgYXMgaXQKLSAgICAgICAgICAgIC8vIG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBjbGljaywgY2FuJ3QgdXNlIFRPVUNIX0RSQUdfTU9ERSBhcyBpdAotICAgICAgICAgICAgLy8gbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGZsaW5nLgotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1BJTkNIX0RSQUc7Ci0gICAgICAgICAgICBtQ29uZmlybU1vdmUgPSB0cnVlOwotICAgICAgICAgICAgc3RhcnRUb3VjaChkZXRlY3Rvci5nZXRGb2N1c1goKSwgZGV0ZWN0b3IuZ2V0Rm9jdXNZKCksCi0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lKTsKLQotICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLmVuZFpvb20oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGUoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gKGZsb2F0KSAoTWF0aC5yb3VuZChkZXRlY3Rvci5nZXRTY2FsZUZhY3RvcigpCi0gICAgICAgICAgICAgICAgICAgICogbUFjdHVhbFNjYWxlICogMTAwKSAvIDEwMC4wKTsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBsaW1pdCB0aGUgc2NhbGUgY2hhbmdlIHBlciBzdGVwCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlID4gbUFjdHVhbFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4oc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDEuMjVmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWF4KHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAwLjhmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gZGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7Ci0gICAgICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gZGV0ZWN0b3IuZ2V0Rm9jdXNZKCk7Ci0gICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiBoaXRGb2N1c2VkUGx1Z2luKGludCBjb250ZW50WCwgaW50IGNvbnRlbnRZKSB7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJuYXRpdmVGb2N1c0lzUGx1Z2luKCk9IiArIG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSk7CkBAIC01MDI0LDYgKzQ5MTIsNDggQEAKICAgICAgICAgcmV0dXJuIG1GdWxsU2NyZWVuSG9sZGVyICE9IG51bGw7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGRpc21pc3NGdWxsU2NyZWVuTW9kZSgpIHsKKyAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgeworICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuZGlzbWlzcygpOworICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvblBpbmNoVG9ab29tQW5pbWF0aW9uU3RhcnQoKSB7CisgICAgICAgIC8vIGNhbmNlbCB0aGUgc2luZ2xlIHRvdWNoIGhhbmRsaW5nCisgICAgICAgIGNhbmNlbFRvdWNoKCk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgfQorCisgICAgdm9pZCBvblBpbmNoVG9ab29tQW5pbWF0aW9uRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvbkVuZCgpOworICAgICAgICAvLyBzdGFydCBhIGRyYWcsIFRPVUNIX1BJTkNIX0RSQUcsIGNhbid0IHVzZSBUT1VDSF9JTklUX01PREUgYXMKKyAgICAgICAgLy8gaXQgbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGNsaWNrLCBjYW4ndCB1c2UgVE9VQ0hfRFJBR19NT0RFCisgICAgICAgIC8vIGFzIGl0IG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBmbGluZy4KKyAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1BJTkNIX0RSQUc7CisgICAgICAgIG1Db25maXJtTW92ZSA9IHRydWU7CisgICAgICAgIHN0YXJ0VG91Y2goZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpLCBtTGFzdFRvdWNoVGltZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U2Nyb2xsaW5nTGF5ZXIoZmxvYXQgZ2VzdHVyZVgsIGZsb2F0IGdlc3R1cmVZKSB7CisgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgeworICAgICAgICAgICAgaW50IGNvbnRlbnRYID0gdmlld1RvQ29udGVudFgoKGludCkgZ2VzdHVyZVggKyBtU2Nyb2xsWCk7CisgICAgICAgICAgICBpbnQgY29udGVudFkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBnZXN0dXJlWSArIG1TY3JvbGxZKTsKKyAgICAgICAgICAgIG1TY3JvbGxpbmdMYXllciA9IG5hdGl2ZVNjcm9sbGFibGVMYXllcihjb250ZW50WCwgY29udGVudFkpOworICAgICAgICAgICAgaWYgKG1TY3JvbGxpbmdMYXllciAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDEvKGRlbnNpdHkgKiBkZW5zaXR5KSB1c2VkIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRzLgorICAgIC8vIENvbXB1dGVkIGluIGluaXQoKS4KKyAgICBwcml2YXRlIGZsb2F0IERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQ7CisKKyAgICAvLyBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzIHJlcG9ydGVkIGluIG9uVG91Y2hFdmVudCBzY2FsZWQgYnkgdGhlCisgICAgLy8gZGVuc2l0eSBvZiB0aGUgc2NyZWVuLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUkFHX0xBWUVSX0ZJTkdFUl9ESVNUQU5DRSA9IDIwMDAwOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCB8fCAoIWlzQ2xpY2thYmxlKCkgJiYgIWlzTG9uZ0NsaWNrYWJsZSgpKSkgewpAQCAtNTAzMSw2MSArNDk2MSwxMjMgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7Ci0gICAgICAgICAgICBMb2cudihMT0dUQUcsIGV2ICsgIiBhdCAiICsgZXYuZ2V0RXZlbnRUaW1lKCkgKyAiIG1Ub3VjaE1vZGU9IgotICAgICAgICAgICAgICAgICAgICArIG1Ub3VjaE1vZGUpOworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCBldiArICIgYXQgIiArIGV2LmdldEV2ZW50VGltZSgpCisgICAgICAgICAgICAgICAgKyAiIG1Ub3VjaE1vZGU9IiArIG1Ub3VjaE1vZGUKKyAgICAgICAgICAgICAgICArICIgbnVtUG9pbnRlcnM9IiArIGV2LmdldFBvaW50ZXJDb3VudCgpKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBhY3Rpb247Ci0gICAgICAgIGZsb2F0IHgsIHk7CisgICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgZmxvYXQgeCA9IGV2LmdldFgoKTsKKyAgICAgICAgZmxvYXQgeSA9IGV2LmdldFkoKTsKICAgICAgICAgbG9uZyBldmVudFRpbWUgPSBldi5nZXRFdmVudFRpbWUoKTsKIAotICAgICAgICAvLyBGSVhNRTogd2UgbWF5IGNvbnNpZGVyIHRvIGdpdmUgV2ViS2l0IGFuIG9wdGlvbiB0byBoYW5kbGUgbXVsdGktdG91Y2gKLSAgICAgICAgLy8gZXZlbnRzIGxhdGVyLgotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSkgewotICAgICAgICAgICAgaWYgKG1BbGxvd1BhbkFuZFNjYWxlIHx8IG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3Iub25Ub3VjaEV2ZW50KGV2KTsKLSAgICAgICAgICAgICAgICBpZiAobVNjYWxlRGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUgPSBldmVudFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbUFsbG93UGFuQW5kU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIGZpbmFsIFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yID0KKyAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIuZ2V0TXVsdGlUb3VjaEdlc3R1cmVEZXRlY3RvcigpOworICAgICAgICBib29sZWFuIHNraXBTY2FsZUdlc3R1cmUgPSBmYWxzZTsKKyAgICAgICAgLy8gU2V0IHRvIHRoZSBtaWQtcG9pbnQgb2YgYSB0d28tZmluZ2VyIGdlc3R1cmUgdXNlZCB0byBkZXRlY3QgaWYgdGhlCisgICAgICAgIC8vIHVzZXIgaGFzIHRvdWNoZWQgYSBsYXllci4KKyAgICAgICAgZmxvYXQgZ2VzdHVyZVggPSB4OworICAgICAgICBmbG9hdCBnZXN0dXJlWSA9IHk7CisgICAgICAgIGlmIChkZXRlY3RvciA9PSBudWxsIHx8ICFkZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgLy8gVGhlIGdlc3R1cmUgZm9yIHNjcm9sbGluZyBhIGxheWVyIGlzIHR3byBmaW5nZXJzIGNsb3NlIHRvZ2V0aGVyLgorICAgICAgICAgICAgLy8gRklYTUU6IHdlIG1heSBjb25zaWRlciBnaXZpbmcgV2ViS2l0IGFuIG9wdGlvbiB0byBoYW5kbGUKKyAgICAgICAgICAgIC8vIG11bHRpLXRvdWNoIGV2ZW50cyBsYXRlci4KKyAgICAgICAgICAgIGlmIChldi5nZXRQb2ludGVyQ291bnQoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBkeCA9IGV2LmdldFgoMSkgLSBldi5nZXRYKDApOworICAgICAgICAgICAgICAgIGZsb2F0IGR5ID0gZXYuZ2V0WSgxKSAtIGV2LmdldFkoMCk7CisgICAgICAgICAgICAgICAgZmxvYXQgZGlzdCA9IChkeCAqIGR4ICsgZHkgKiBkeSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgRFJBR19MQVlFUl9JTlZFUlNFX0RFTlNJVFlfU1FVQVJFRDsKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFwcHJveGltYXRlIGNlbnRlciB0byBkZXRlcm1pbmUgaWYgdGhlIGdlc3R1cmUgaXMgaW4KKyAgICAgICAgICAgICAgICAvLyBhIGxheWVyLgorICAgICAgICAgICAgICAgIGdlc3R1cmVYID0gZXYuZ2V0WCgwKSArIChkeCAqIC41Zik7CisgICAgICAgICAgICAgICAgZ2VzdHVyZVkgPSBldi5nZXRZKDApICsgKGR5ICogLjVmKTsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdXNlIGEgY29uc2lzdGVudCBwb2ludCBmb3IgdHJhY2tpbmcgbW92ZW1lbnQuCisgICAgICAgICAgICAgICAgaWYgKGV2LmdldFgoMCkgPCBldi5nZXRYKDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBldi5nZXRYKDApOworICAgICAgICAgICAgICAgICAgICB5ID0gZXYuZ2V0WSgwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4ID0gZXYuZ2V0WCgxKTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IGV2LmdldFkoMSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHggPSBtU2NhbGVEZXRlY3Rvci5nZXRGb2N1c1goKTsKLSAgICAgICAgICAgICAgICB5ID0gbVNjYWxlRGV0ZWN0b3IuZ2V0Rm9jdXNZKCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCkgJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSzsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKLSAgICAgICAgICAgICAgICAgICAgY2FuY2VsVG91Y2goKTsKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV047Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG1MYXN0VG91Y2hYL1kgdG8gdGhlIHJlbWFpbmluZyBwb2ludAotICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0geTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZSB4IG9yIHkgaW5kaWNhdGUgaXQgaXMgb24gdGhlIGVkZ2UsIHNraXAgaXQuCi0gICAgICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb25NYXNrZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IERSQUdfTEFZRVJfRklOR0VSX0RJU1RBTkNFKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsZUdlc3R1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmluZ2VycyBtb3ZlZCB0b28gZmFyIGFwYXJ0IHdoaWxlIGRyYWdnaW5nLCB0aGUgdXNlcgorICAgICAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSB0cnlpbmcgdG8gem9vbS4KKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYWdlIGRpc2FsbG93IHpvb20sIHNraXAgbXVsdGktcG9pbnRlciBhY3Rpb24KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOwotICAgICAgICAgICAgeCA9IGV2LmdldFgoKTsKLSAgICAgICAgICAgIHkgPSBldi5nZXRZKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgcGFnZSBkaXNhbGxvd3Mgem9vbSwgcGFzcyBtdWx0aS1wb2ludGVyIGV2ZW50cyB0byB3ZWJraXQuCisgICAgICAgIGlmIChldi5nZXRQb2ludGVyQ291bnQoKSA+IDEKKyAgICAgICAgICAgICYmIChtWm9vbU1hbmFnZXIuaXNab29tU2NhbGVGaXhlZCgpIHx8IG1EZWZlck11bHRpdG91Y2gpKSB7CisgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgeworICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInBhc3NpbmcgIiArIGV2LmdldFBvaW50ZXJDb3VudCgpICsgIiBwb2ludHMgdG8gd2Via2l0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXNzTXVsdGlUb3VjaFRvV2ViS2l0KGV2KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5zdXBwb3J0c011bHRpVG91Y2hab29tKCkgJiYgZXYuZ2V0UG9pbnRlckNvdW50KCkgPiAxICYmCisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUgJiYgIXNraXBTY2FsZUdlc3R1cmUpIHsKKyAgICAgICAgICAgIGlmICghZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgZXYuZ2V0QWN0aW9uTWFza2VkKCkgIT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGZha2UgcG9pbnRlciBkb3duIGV2ZW50IGluIG9yZGVyIHRvIHN0YXJ0CisgICAgICAgICAgICAgICAgLy8gdGhlIHpvb20gc2NhbGUgZGV0ZWN0b3IuCisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQgdGVtcCA9IE1vdGlvbkV2ZW50Lm9idGFpbihldik7CisgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIG9yaWdpbmFsIGV2ZW50IGFuZCBzZXQgaXQgdG8KKyAgICAgICAgICAgICAgICAvLyBBQ1RJT05fUE9JTlRFUl9ET1dOLgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0QWN0aW9uKHRlbXAuZ2V0QWN0aW9uKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5Nb3Rpb25FdmVudC5BQ1RJT05fTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTik7CisgICAgICAgICAgICAgICAgICAgIGRldGVjdG9yLm9uVG91Y2hFdmVudCh0ZW1wKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0ZW1wLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRldGVjdG9yLm9uVG91Y2hFdmVudChldik7CisKKyAgICAgICAgICAgIGlmIChkZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lID0gZXZlbnRUaW1lOworICAgICAgICAgICAgICAgIGNhbmNlbExvbmdQcmVzcygpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTV0lUQ0hfVE9fTE9OR1BSRVNTKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1ab29tTWFuYWdlci5zdXBwb3J0c1BhbkR1cmluZ1pvb20oKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RSQUdfTU9ERTsKKyAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB4ID0gZGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7CisgICAgICAgICAgICB5ID0gZGV0ZWN0b3IuZ2V0Rm9jdXNZKCk7CisgICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKSAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLOworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7CisgICAgICAgICAgICAgICAgY2FuY2VsVG91Y2goKTsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAgICAgLy8gc2V0IG1MYXN0VG91Y2hYL1kgdG8gdGhlIHJlbWFpbmluZyBwb2ludAorICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIHggb3IgeSBpbmRpY2F0ZSBpdCBpcyBvbiB0aGUgZWRnZSwgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gRHVlIHRvIHRoZSB0b3VjaCBzY3JlZW4gZWRnZSBlZmZlY3QsIGEgdG91Y2ggY2xvc2VyIHRvIHRoZSBlZGdlCiAgICAgICAgIC8vIGFsd2F5cyBzbmFwcGVkIHRvIHRoZSBlZGdlLiBBcyBnZXRWaWV3V2lkdGgoKSBjYW4gYmUgZGlmZmVyZW50IGZyb20KICAgICAgICAgLy8gZ2V0V2lkdGgoKSBkdWUgdG8gdGhlIHNjcm9sbGJhciwgYWRqdXN0aW5nIHRoZSBwb2ludCB0byBtYXRjaAogICAgICAgICAvLyBnZXRWaWV3V2lkdGgoKS4gU2FtZSBhcHBsaWVkIHRvIHRoZSBoZWlnaHQuCi0gICAgICAgIGlmICh4ID4gZ2V0Vmlld1dpZHRoKCkgLSAxKSB7Ci0gICAgICAgICAgICB4ID0gZ2V0Vmlld1dpZHRoKCkgLSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh5ID4gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC0gMSkgewotICAgICAgICAgICAgeSA9IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIDE7Ci0gICAgICAgIH0KKyAgICAgICAgeCA9IE1hdGgubWluKHgsIGdldFZpZXdXaWR0aCgpIC0gMSk7CisgICAgICAgIHkgPSBNYXRoLm1pbih5LCBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCkgLSAxKTsKIAogICAgICAgICBmbG9hdCBmRGVsdGFYID0gbUxhc3RUb3VjaFggLSB4OwogICAgICAgICBmbG9hdCBmRGVsdGFZID0gbUxhc3RUb3VjaFkgLSB5OwpAQCAtNTEwOCw2ICs1MTAwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Qcml2YXRlSGFuZGxlci5oYXNNZXNzYWdlcyhSRUxFQVNFX1NJTkdMRV9UQVApKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRUxFQVNFX1NJTkdMRV9UQVApOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkgPCBtRG91YmxlVGFwU2xvcFNxdWFyZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RPVUJMRV9UQVBfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTUxMTksMTMgKzUxMTQsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFgsIGNvbnRlbnRZKSA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGhlIG5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hQcm9jZXNzID0gKCFpbkZ1bGxTY3JlZW5Nb2RlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtRm9yd2FyZFRvdWNoRXZlbnRzKSA/IGhpdEZvY3VzZWRQbHVnaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFgsIGNvbnRlbnRZKSA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuVVBEQVRFX0ZSQU1FX0NBQ0hFX0lGX0xPQURJTkcpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoSGlnaGxpZ2h0RGF0YSBkYXRhID0gbmV3IFRvdWNoSGlnaGxpZ2h0RGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tWCA9IGNvbnRlbnRYOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tWSA9IGNvbnRlbnRZOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tU2xvcCA9IHZpZXdUb0NvbnRlbnREaW1lbnNpb24obU5hdlNsb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlRGVsYXllZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19UT1VDSF9ISUdITElHSFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IChpbnQpIHggKyBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSA9IChpbnQpIHkgKyBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRYID0gbVRvdWNoSGlnaGxpZ2h0WSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBUT1VDSF9ISUdITElHSFRfRUxBUFNFX1RJTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAobUxvZ0V2ZW50ICYmIGV2ZW50VGltZSAtIG1MYXN0VG91Y2hVcFRpbWUgPCAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEV2ZW50TG9nVGFncy5CUk9XU0VSX0RPVUJMRV9UQVBfRFVSQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudFRpbWUgLSBtTGFzdFRvdWNoVXBUaW1lKSwgZXZlbnRUaW1lKTsKQEAgLTUxNTcsMjEgKzUxNzIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZEZvcndhcmRUb3VjaEV2ZW50KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1BY3Rpb24gPSBhY3Rpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVggPSBjb250ZW50WDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOworICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1Qb2ludHMgPSBuZXcgUG9pbnRbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVBvaW50c1swXSA9IG5ldyBQb2ludChjb250ZW50WCwgY29udGVudFkpOwogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIG5lZWRzIHRvIHNldCB0aGVtIGZvciBjb21wdXRlIGRlbHRhWC9ZCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluRnVsbFNjcmVlbk1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtUHJpdmF0ZUhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vYnRhaW5NZXNzYWdlKFBSRVZFTlRfREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIDApLCBUQVBfVElNRU9VVCk7CkBAIC01MTkyLDI0ICs1MjA1LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RPVUJMRV9UQVBfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIHRvdWNoIGV2ZW50cyBmcm9tIFVJIHRocmVhZCB0byBXZWJDb3JlIHRocmVhZAogICAgICAgICAgICAgICAgIGlmIChzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpICYmIG1Db25maXJtTW92ZSAmJiAoZmlyc3RNb3ZlCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudFRpbWUgLSBtTGFzdFNlbnRUb3VjaFRpbWUgPiBtQ3VycmVudFRvdWNoSW50ZXJ2YWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0U2VudFRvdWNoVGltZSA9IGV2ZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tQWN0aW9uID0gYWN0aW9uOwotICAgICAgICAgICAgICAgICAgICB0ZWQubVggPSBjb250ZW50WDsKLSAgICAgICAgICAgICAgICAgICAgdGVkLm1ZID0gY29udGVudFk7CisgICAgICAgICAgICAgICAgICAgIHRlZC5tUG9pbnRzID0gbmV3IFBvaW50WzFdOworICAgICAgICAgICAgICAgICAgICB0ZWQubVBvaW50c1swXSA9IG5ldyBQb2ludChjb250ZW50WCwgY29udGVudFkpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE1vdmUgJiYgIWluRnVsbFNjcmVlbk1vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtUHJpdmF0ZUhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9idGFpbk1lc3NhZ2UoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQsCkBAIC01MjM4LDExICs1MjUxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgeworICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1Db25maXJtTW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9NQVlCRV9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtUHJldmVudERlZmF1bHQgPT0gUFJFVkVOVF9ERUZBVUxUX05PX0ZST01fVE9VQ0hfRE9XTikgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgbUxhc3RUb3VjaFRpbWUgYXMgd2UgbWF5IG5lZWQgdG8gZG8gZmxpbmcgYXQKQEAgLTUyNTIsOSArNTI2Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGxvY2sgZHJhZ2dpbmcgdG8gb25lIGF4aXMgaWYgd2UgZG9uJ3QgaGF2ZSBhIHNjYWxlIGluIHByb2dyZXNzLgotICAgICAgICAgICAgICAgICAgICAvLyBTY2FsaW5nIGltcGxpZXMgZnJlZS1yb2FtaW5nIG1vdmVtZW50LiBOb3RlIHdlJ2xsIG9ubHkgZXZlciBnZXQgaGVyZQotICAgICAgICAgICAgICAgICAgICAvLyBpZiBtQWxsb3dQYW5BbmRTY2FsZSBpcyB0cnVlLgotICAgICAgICAgICAgICAgICAgICBpZiAobVNjYWxlRGV0ZWN0b3IgIT0gbnVsbCAmJiAhbVNjYWxlRGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZyBpbXBsaWVzIGZyZWUtcm9hbWluZyBtb3ZlbWVudC4gTm90ZSB0aGlzIGlzIG9ubHkgZXZlciBhIHF1ZXN0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG1ab29tTWFuYWdlci5zdXBwb3J0c1BhbkR1cmluZ1pvb20oKSBpcyB0cnVlLgorICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZWN0b3IgIT0gbnVsbCAmJiAhZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IHN0YXJ0cyBuZWFybHkgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCwgZW5mb3JjZSBpdAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF4ID0gTWF0aC5hYnMoZGVsdGFYKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBheSA9IE1hdGguYWJzKGRlbHRhWSk7CkBAIC01Mjc1LDYgKzUyOTAsOSBAQAogICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSAwOwogICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSAwOwogCisgICAgICAgICAgICAgICAgICAgIGlmIChza2lwU2NhbGVHZXN0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNjcm9sbGluZ0xheWVyKGdlc3R1cmVYLCBnZXN0dXJlWSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3RhcnREcmFnKCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC01MjgzLDYgKzUzMDEsMjAgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBkbyBwYW4KKyAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld1Njcm9sbFggPSBwaW5Mb2NYKG1TY3JvbGxYICsgZGVsdGFYKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld0RlbHRhWCA9IG5ld1Njcm9sbFggLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSBuZXdEZWx0YVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhWCA9IG5ld0RlbHRhWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZEZWx0YVggPSAoZmxvYXQpIG5ld0RlbHRhWDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U2Nyb2xsWSA9IHBpbkxvY1kobVNjcm9sbFkgKyBkZWx0YVkpOworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3RGVsdGFZID0gbmV3U2Nyb2xsWSAtIG1TY3JvbGxZOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IG5ld0RlbHRhWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gbmV3RGVsdGFZOworICAgICAgICAgICAgICAgICAgICAgICAgZkRlbHRhWSA9IChmbG9hdCkgbmV3RGVsdGFZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJvb2xlYW4ga2VlcFNjcm9sbEJhcnNWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGZEZWx0YVgpIDwgMS4wZiAmJiBNYXRoLmFicyhmRGVsdGFZKSA8IDEuMGYpIHsKQEAgLTUzNDksNyArNTM4MSw5IEBACiAKICAgICAgICAgICAgICAgICBkb0RyYWcoZGVsdGFYLCBkZWx0YVkpOwogCi0gICAgICAgICAgICAgICAgaWYgKGtlZXBTY3JvbGxCYXJzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIC8vIFR1cm4gb2ZmIHNjcm9sbGJhcnMgd2hlbiBkcmFnZ2luZyBhIGxheWVyLgorICAgICAgICAgICAgICAgIGlmIChrZWVwU2Nyb2xsQmFyc1Zpc2libGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtSGVsZE1vdGlvbmxlc3MgIT0gTU9USU9OTEVTU19UUlVFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CkBAIC01MzY0LDE4ICs1Mzk4LDE1IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgIGlmICghaXNGb2N1c2VkKCkpIHJlcXVlc3RGb2N1cygpOwogICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIHRvdWNoIGV2ZW50cyBmcm9tIFVJIHRocmVhZCB0byBXZWJDb3JlIHRocmVhZAogICAgICAgICAgICAgICAgIGlmIChzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gY29udGVudFg7Ci0gICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOworICAgICAgICAgICAgICAgICAgICB0ZWQubVBvaW50cyA9IG5ldyBQb2ludFsxXTsKKyAgICAgICAgICAgICAgICAgICAgdGVkLm1Qb2ludHNbMF0gPSBuZXcgUG9pbnQoY29udGVudFgsIGNvbnRlbnRZKTsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1SZXByb2Nlc3MgPSBtRGVmZXJUb3VjaFByb2Nlc3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVXBUaW1lID0gZXZlbnRUaW1lOwpAQCAtNTM4NiwxNyArNTQxNywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSB8fCBtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSBuZXcgVG91Y2hFdmVudERhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IFdlYlZpZXdDb3JlLkFDVElPTl9ET1VCTEVUQVA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gY29udGVudFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZID0gY29udGVudFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1Qb2ludHMgPSBuZXcgUG9pbnRbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1Qb2ludHNbMF0gPSBuZXcgUG9pbnQoY29udGVudFgsIGNvbnRlbnRZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RvdWJsZVRhcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5oYW5kbGVEb3VibGVUYXAobUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC01NDExLDkgKzU0MzgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjb21wdXRlTWF4U2Nyb2xsWCgpID4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wdXRlTWF4U2Nyb2xsWSgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUkgdGFrZXMgY29udHJvbCBiYWNrLCBjYW5jZWwgV2ViQ29yZSB0b3VjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxXZWJDb3JlVG91Y2hFdmVudChjb250ZW50WCwgY29udGVudFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBwZXJmb3JtZWQgYSB2ZXJ5IHF1aWNrIHRvdWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbWF5IGdldCBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBXZWJDb3JlIGhhcyBoYWQgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGFueSBjYWxsIHRvIHByZXZlbnREZWZhdWx0IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKUyB0b3VjaCBoYW5kbGVyIHdpbGwgbm90IGhhdmUgYmVlbiBleGVjdXRlZCB5ZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbmNlIHdlIHdpbGwgc2VlIGJvdGggdGhlIFVJIChub3cpIGFuZCBXZWJDb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aGVuIGNvbnRleHQgc3dpdGNoZXMpIGhhbmRsaW5nIHRoZSBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB3ZWIgZGV2ZWxvcGVyIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXNlcyBwcmV2ZW50RGVmYXVsdCBpbiB0aGVpciB0b3VjaCBoYW5kbGVyLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBuYXR1cmUgb2Ygb3VyIGFzeW5jaHJvbm91cyB0b3VjaCBtb2RlbC4KKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIG5vdCByZXdyaXRlIGRyYWcgY29kZSBoZXJlLCBidXQgd2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB0cnkgZmxpbmcgaWYgaXQgYXBwbGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVkdWNlUHJpb3JpdHkoKTsKQEAgLTU0MzEsMTMgKzU0NjYsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlSGl0U2VsZWN0aW9uKGNvbnRlbnRYLCBjb250ZW50WSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFwcGluZyBvbiBzZWxlY3Rpb24gb3IgY29udHJvbHMgZG9lcyBub3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmF0aXZlSGl0U2VsZWN0aW9uKGNvbnRlbnRYLCBjb250ZW50WSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHRyaWdnZXIgZG91YmxlIHRhcCBpZiB0aGUgV2ViVmlldyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FuWm9vbUluKCkgfHwgY2FuWm9vbU91dCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9TSU5HTEVfVEFQLCBWaWV3Q29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvdWJsZVRhcFRpbWVvdXQoKSk7CkBAIC01NDY2LDE4ICs1NTA0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19JR05PUkU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9GbGluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ0JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFgoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRyYXcgaW4gaGlnaC1xdWFsaXR5LCBhcyB3ZSdyZSBkb25lIGRyYWdnaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgICAgICAgICAgY2FzZSBUT1VDSF9EUkFHX1NUQVJUX01PREU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfRFJBR19MQVlFUl9NT0RFOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9VQ0hfRFJBR19TVEFSVF9NT0RFIHNob3VsZCBub3QgaGFwcGVuIGZvciB0aGUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGFzIHdlIGFsbW9zdCBjZXJ0YWluIHdpbGwgZ2V0IGEgTU9WRS4gQnV0IHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHBvc3NpYmxlIG9uIGVtdWxhdG9yLgpAQCAtNTQ5MSw4ICs1NTI0LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDogewogICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nQmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFgoKSwgMCwgY29tcHV0ZU1heFNjcm9sbFkoKSk7CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FuY2VsV2ViQ29yZVRvdWNoRXZlbnQoY29udGVudFgsIGNvbnRlbnRZLCBmYWxzZSk7CkBAIC01NTAzLDE0ICs1NTM0LDMyIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBwYXNzTXVsdGlUb3VjaFRvV2ViS2l0KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOworICAgICAgICB0ZWQubUFjdGlvbiA9IGV2LmdldEFjdGlvbigpICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGV2LmdldFBvaW50ZXJDb3VudCgpOworICAgICAgICB0ZWQubVBvaW50cyA9IG5ldyBQb2ludFtjb3VudF07CisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgY291bnQ7IGMrKykgeworICAgICAgICAgICAgaW50IHggPSB2aWV3VG9Db250ZW50WCgoaW50KSBldi5nZXRYKGMpICsgbVNjcm9sbFgpOworICAgICAgICAgICAgaW50IHkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBldi5nZXRZKGMpICsgbVNjcm9sbFkpOworICAgICAgICAgICAgdGVkLm1Qb2ludHNbY10gPSBuZXcgUG9pbnQoeCwgeSk7CisgICAgICAgIH0KKyAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKKyAgICAgICAgdGVkLm1SZXByb2Nlc3MgPSBtRGVmZXJUb3VjaFByb2Nlc3M7CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKKyAgICAgICAgY2FuY2VsTG9uZ1ByZXNzKCk7CisgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTV0lUQ0hfVE9fTE9OR1BSRVNTKTsKKyAgICAgICAgbVByZXZlbnREZWZhdWx0ID0gUFJFVkVOVF9ERUZBVUxUX0lHTk9SRTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY2FuY2VsV2ViQ29yZVRvdWNoRXZlbnQoaW50IHgsIGludCB5LCBib29sZWFuIHJlbW92ZUV2ZW50cykgewogICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSkgewogICAgICAgICAgICAgaWYgKHJlbW92ZUV2ZW50cykgewogICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5yZW1vdmVNZXNzYWdlcyhFdmVudEh1Yi5UT1VDSF9FVkVOVCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSBuZXcgVG91Y2hFdmVudERhdGEoKTsKLSAgICAgICAgICAgIHRlZC5tWCA9IHg7Ci0gICAgICAgICAgICB0ZWQubVkgPSB5OworICAgICAgICAgICAgdGVkLm1Qb2ludHMgPSBuZXcgUG9pbnRbMV07CisgICAgICAgICAgICB0ZWQubVBvaW50c1swXSA9IG5ldyBQb2ludCh4LCB5KTsKICAgICAgICAgICAgIHRlZC5tQWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDsKICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgIG1QcmV2ZW50RGVmYXVsdCA9IFBSRVZFTlRfREVGQVVMVF9JR05PUkU7CkBAIC01NTM2LDc5ICs1NTg1LDI2IEBACiAgICAgICAgIGlmICghbURyYWdGcm9tVGV4dElucHV0KSB7CiAgICAgICAgICAgICBuYXRpdmVIaWRlQ3Vyc29yKCk7CiAgICAgICAgIH0KLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3Muc3VwcG9ydFpvb20oKQotICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKQotICAgICAgICAgICAgICAgICYmICFnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKS5pc1Zpc2libGUoKQotICAgICAgICAgICAgICAgICYmIG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgJiYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtVmVydGljYWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYpKSB7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBzZXR0aW5ncy5nZXREb3VibGVUYXBUb2FzdENvdW50KCk7Ci0gICAgICAgICAgICBpZiAobUluWm9vbU92ZXJ2aWV3ICYmIGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7Ci0gICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5kb3VibGVfdGFwX3RvYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICBpZiAobUhvcml6b250YWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYKKyAgICAgICAgICAgICAgICB8fCBtVmVydGljYWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYpIHsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5pbnZva2Vab29tUGlja2VyKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZG9EcmFnKGludCBkZWx0YVgsIGludCBkZWx0YVkpIHsKICAgICAgICAgaWYgKChkZWx0YVggfCBkZWx0YVkpICE9IDApIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlWCA9IGNvbXB1dGVNYXhTY3JvbGxYKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmFuZ2VZID0gY29tcHV0ZU1heFNjcm9sbFkoKTsKLSAgICAgICAgICAgIG92ZXJTY3JvbGxCeShkZWx0YVgsIGRlbHRhWSwgb2xkWCwgb2xkWSwKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2VYLCByYW5nZVksCi0gICAgICAgICAgICAgICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIHRydWUpOwotCi0gICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBzaG93IGxlZnQvcmlnaHQgZ2xvd3MgaWYgd2UgZml0IHRoZSB3aG9sZSBjb250ZW50LgotICAgICAgICAgICAgICAgIGlmIChyYW5nZVggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwdWxsZWRUb1ggPSBvbGRYICsgZGVsdGFYOwotICAgICAgICAgICAgICAgICAgICBpZiAocHVsbGVkVG9YIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vblB1bGwoKGZsb2F0KSBkZWx0YVggLyBnZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93UmlnaHQuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHVsbGVkVG9YID4gcmFuZ2VYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vblB1bGwoKGZsb2F0KSBkZWx0YVggLyBnZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93TGVmdC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICBkZWx0YVggPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKGRlbHRhWCk7CisgICAgICAgICAgICAgICAgZGVsdGFZID0gdmlld1RvQ29udGVudERpbWVuc2lvbihkZWx0YVkpOworICAgICAgICAgICAgICAgIGlmIChuYXRpdmVTY3JvbGxMYXllcihtU2Nyb2xsaW5nTGF5ZXIsIGRlbHRhWCwgZGVsdGFZKSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJhbmdlWSA+IDAgfHwgZ2V0T3ZlclNjcm9sbE1vZGUoKSA9PSBPVkVSX1NDUk9MTF9BTFdBWVMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHB1bGxlZFRvWSA9IG9sZFkgKyBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwdWxsZWRUb1kgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgZGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB1bGxlZFRvWSA+IHJhbmdlWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIGRlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzY3JvbGxCeShkZWx0YVgsIGRlbHRhWSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgYm9vbGVhbiBzaG93UGx1c01pbnVzID0gbU1pblpvb21TY2FsZSA8IG1NYXhab29tU2NhbGU7Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsICYmIHNob3dQbHVzTWludXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobVpvb21Db250cm9scy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuc2hvdyhzaG93UGx1c01pbnVzLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVpvb21NYW5hZ2VyLmtlZXBab29tUGlja2VyVmlzaWJsZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzdG9wVG91Y2goKSB7CkBAIC01NjIyLDE0ICs1NjE4LDYgQEAKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBSZWxlYXNlIGFueSBwdWxsZWQgZ2xvd3MKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2FuY2VsVG91Y2goKSB7CkBAIC01NjQzLDE2ICs1NjMxLDggQEAKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBSZWxlYXNlIGFueSBwdWxsZWQgZ2xvd3MKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUpIHsKKyAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19NT0RFIHx8CisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgIH0KQEAgLTU2NjAsNiArNTY0MCw5IEBACiAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTV0lUQ0hfVE9fTE9OR1BSRVNTKTsKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKERSQUdfSEVMRF9NT1RJT05MRVNTKTsKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEFXQUtFTl9TQ1JPTExfQkFSUyk7CisgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgeworICAgICAgICAgICAgcmVtb3ZlVG91Y2hIaWdobGlnaHQodHJ1ZSk7CisgICAgICAgIH0KICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19UUlVFOwogICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICBuYXRpdmVIaWRlQ3Vyc29yKCk7CkBAIC01NzU3LDcgKzU3NDAsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBsZXQgY29tbW9uIGNvZGUgaW4gb25LZXlVcCBhdCBpdAogICAgICAgICB9Ci0gICAgICAgIGlmIChtTWFwVHJhY2tiYWxsVG9BcnJvd0tleXMgJiYgbVNoaWZ0SXNQcmVzc2VkID09IGZhbHNlKSB7CisgICAgICAgIGlmICgobU1hcFRyYWNrYmFsbFRvQXJyb3dLZXlzICYmIG1TaGlmdElzUHJlc3NlZCA9PSBmYWxzZSkgfHwKKyAgICAgICAgICAgICAgICAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsIHx8IG1BY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0ZWQpKSB7CiAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgTG9nLnYoTE9HVEFHLCAib25UcmFja2JhbGxFdmVudCBnbWFpbCBxdWl0Iik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTU5MjUsMTEgKzU5MDksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tiYWxsUmVtYWluc1g9IiArIG1UcmFja2JhbGxSZW1haW5zWAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2JhbGxSZW1haW5zWT0iICsgbVRyYWNrYmFsbFJlbWFpbnNZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hdkhhbmRsZWRLZXkoc2VsZWN0S2V5Q29kZSwgY291bnQsIGZhbHNlLCB0aW1lKSkgewogICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChrZXlDb2RlVG9Tb3VuZHNFZmZlY3Qoc2VsZWN0S2V5Q29kZSkpOwogICAgICAgICAgICAgfQpAQCAtNTk2MCwxNyArNTk0NCwzMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGNvbXB1dGVNYXhTY3JvbGxYKCkgewotICAgICAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSAtIGdldFZpZXdXaWR0aCgpLCAwKTsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSAtIGdldFZpZXdXaWR0aCgpLCAwKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBjb21wdXRlTWF4U2Nyb2xsWSgpIHsKLSAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKQorICAgICAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSArIGdldFRpdGxlSGVpZ2h0KCkKICAgICAgICAgICAgICAgICAtIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSwgMCk7CiAgICAgfQogCisgICAgYm9vbGVhbiB1cGRhdGVTY3JvbGxDb29yZGluYXRlcyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IG9sZFggPSBtU2Nyb2xsWDsKKyAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKKyAgICAgICAgbVNjcm9sbFggPSB4OworICAgICAgICBtU2Nyb2xsWSA9IHk7CisgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKKyAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBmbGluZ1Njcm9sbChpbnQgdngsIGludCB2eSkgewogICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCB2eCwgdnksIDAsIGNvbXB1dGVNYXhTY3JvbGxYKCksIDAsCi0gICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFkoKSwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBtT3ZlcmZsaW5nRGlzdGFuY2UpOworICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCkpOwogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCkBAIC02MDAwLDIwICs1OTk3LDE5IEBACiAgICAgICAgIGlmICgobWF4WCA9PSAwICYmIHZ5ID09IDApIHx8IChtYXhZID09IDAgJiYgdnggPT0gMCkpIHsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ0JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCBjb21wdXRlTWF4U2Nyb2xsWCgpLAotICAgICAgICAgICAgICAgICAgICAwLCBjb21wdXRlTWF4U2Nyb2xsWSgpKSkgewotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmbG9hdCBjdXJyZW50VmVsb2NpdHkgPSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCk7Ci0gICAgICAgIGlmIChtTGFzdFZlbG9jaXR5ID4gMCAmJiBjdXJyZW50VmVsb2NpdHkgPiAwKSB7CisgICAgICAgIGZsb2F0IHZlbG9jaXR5ID0gKGZsb2F0KSBNYXRoLmh5cG90KHZ4LCB2eSk7CisgICAgICAgIGlmIChtTGFzdFZlbG9jaXR5ID4gMCAmJiBjdXJyZW50VmVsb2NpdHkgPiAwICYmIHZlbG9jaXR5CisgICAgICAgICAgICAgICAgPiBtTGFzdFZlbG9jaXR5ICogTUlOSU1VTV9WRUxPQ0lUWV9SQVRJT19GT1JfQUNDRUxFUkFUSU9OKSB7CiAgICAgICAgICAgICBmbG9hdCBkZWx0YVIgPSAoZmxvYXQpIChNYXRoLmFicyhNYXRoLmF0YW4yKG1MYXN0VmVsWSwgbUxhc3RWZWxYKQogICAgICAgICAgICAgICAgICAgICAtIE1hdGguYXRhbjIodnksIHZ4KSkpOwogICAgICAgICAgICAgZmluYWwgZmxvYXQgY2lyY2xlID0gKGZsb2F0KSAoTWF0aC5QSSkgKiAyLjBmOwogICAgICAgICAgICAgaWYgKGRlbHRhUiA+IGNpcmNsZSAqIDAuOWYgfHwgZGVsdGFSIDwgY2lyY2xlICogMC4xZikgewogICAgICAgICAgICAgICAgIHZ4ICs9IGN1cnJlbnRWZWxvY2l0eSAqIG1MYXN0VmVsWCAvIG1MYXN0VmVsb2NpdHk7CiAgICAgICAgICAgICAgICAgdnkgKz0gY3VycmVudFZlbG9jaXR5ICogbUxhc3RWZWxZIC8gbUxhc3RWZWxvY2l0eTsKKyAgICAgICAgICAgICAgICB2ZWxvY2l0eSA9IChmbG9hdCkgTWF0aC5oeXBvdCh2eCwgdnkpOwogICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImRvRmxpbmcgdng9ICIgKyB2eCArICIgdnk9IiArIHZ5KTsKICAgICAgICAgICAgICAgICB9CkBAIC02MDI3LDY3ICs2MDIzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBtYXhYPSIgKyBtYXhYICsgIiBtYXhZPSIgKyBtYXhZCiAgICAgICAgICAgICAgICAgICAgICsgIiBtU2Nyb2xsWD0iICsgbVNjcm9sbFggKyAiIG1TY3JvbGxZPSIgKyBtU2Nyb2xsWSk7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBBbGxvdyBzbG9wcHkgZmxpbmdzIHdpdGhvdXQgb3ZlcnNjcm9sbGluZyBhdCB0aGUgZWRnZXMuCi0gICAgICAgIGlmICgobVNjcm9sbFggPT0gMCB8fCBtU2Nyb2xsWCA9PSBtYXhYKSAmJiBNYXRoLmFicyh2eCkgPCBNYXRoLmFicyh2eSkpIHsKLSAgICAgICAgICAgIHZ4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG1TY3JvbGxZID09IDAgfHwgbVNjcm9sbFkgPT0gbWF4WSkgJiYgTWF0aC5hYnModnkpIDwgTWF0aC5hYnModngpKSB7Ci0gICAgICAgICAgICB2eSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU92ZXJzY3JvbGxEaXN0YW5jZSA8IG1PdmVyZmxpbmdEaXN0YW5jZSkgewotICAgICAgICAgICAgaWYgKG1TY3JvbGxYID09IC1tT3ZlcnNjcm9sbERpc3RhbmNlIHx8IG1TY3JvbGxYID09IG1heFggKyBtT3ZlcnNjcm9sbERpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgdnggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TY3JvbGxZID09IC1tT3ZlcnNjcm9sbERpc3RhbmNlIHx8IG1TY3JvbGxZID09IG1heFkgKyBtT3ZlcnNjcm9sbERpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgdnkgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgbUxhc3RWZWxYID0gdng7CiAgICAgICAgIG1MYXN0VmVsWSA9IHZ5OwotICAgICAgICBtTGFzdFZlbG9jaXR5ID0gKGZsb2F0KSBNYXRoLmh5cG90KHZ4LCB2eSk7CisgICAgICAgIG1MYXN0VmVsb2NpdHkgPSB2ZWxvY2l0eTsKIAotICAgICAgICAvLyBubyBob3Jpem9udGFsIG92ZXJzY3JvbGwgaWYgdGhlIGNvbnRlbnQganVzdCBmaXRzCi0gICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIC12eCwgLXZ5LCAwLCBtYXhYLCAwLCBtYXhZLAotICAgICAgICAgICAgICAgIG1heFggPT0gMCA/IDAgOiBtT3ZlcmZsaW5nRGlzdGFuY2UsIG1PdmVyZmxpbmdEaXN0YW5jZSk7Ci0gICAgICAgIC8vIER1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdmVsb2NpdHkuIFdpdGggcmFuZ2UgYm91bmRhcmllcyBhbmQgb3ZlcnNjcm9sbAotICAgICAgICAvLyB3ZSBtYXkgbm90IGtub3cgaG93IGxvbmcgdGhlIGZpbmFsIGFuaW1hdGlvbiB3aWxsIHRha2UuIChIZW5jZSB0aGUgZGVwcmVjYXRpb24KLSAgICAgICAgLy8gd2FybmluZyBvbiB0aGUgY2FsbCBiZWxvdy4pIEl0J3Mgbm90IGEgYmlnIGRlYWwgZm9yIHNjcm9sbCBiYXJzIGJ1dCBpZiB3ZWJjb3JlCi0gICAgICAgIC8vIHJlc3VtZXMgZHVyaW5nIHRoaXMgZWZmZWN0IHdlIHdpbGwgdGFrZSBhIHBlcmZvcm1hbmNlIGhpdC4gU2VlIGNvbXB1dGVTY3JvbGw7Ci0gICAgICAgIC8vIHdlIHJlc3VtZSB3ZWJjb3JlIHRoZXJlIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4KKyAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgLXZ4LCAtdnksIDAsIG1heFgsIDAsIG1heFkpOwogICAgICAgICBmaW5hbCBpbnQgdGltZSA9IG1TY3JvbGxlci5nZXREdXJhdGlvbigpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoUkVTVU1FX1dFQkNPUkVfUFJJT1JJVFksIHRpbWUpOwogICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKHRpbWUpOwogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHpvb21XaXRoUHJldmlldyhmbG9hdCBzY2FsZSwgYm9vbGVhbiB1cGRhdGVUZXh0V3JhcFNjYWxlKSB7Ci0gICAgICAgIGZsb2F0IG9sZFNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICBtSW5pdGlhbFNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgbUluaXRpYWxTY3JvbGxZID0gbVNjcm9sbFk7Ci0KLSAgICAgICAgLy8gc25hcCB0byBERUZBVUxUX1NDQUxFIGlmIGl0IGlzIGNsb3NlCi0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1EZWZhdWx0U2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbURlZmF1bHRTY2FsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE5ld1pvb21TY2FsZShzY2FsZSwgdXBkYXRlVGV4dFdyYXBTY2FsZSwgZmFsc2UpOwotCi0gICAgICAgIGlmIChvbGRTY2FsZSAhPSBtQWN0dWFsU2NhbGUpIHsKLSAgICAgICAgICAgIC8vIHVzZSBtWm9vbVBpY2tlclNjYWxlIHRvIHNlZSB6b29tIHByZXZpZXcgZmlyc3QKLSAgICAgICAgICAgIG1ab29tU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1JbnZJbml0aWFsWm9vbVNjYWxlID0gMS4wZiAvIG9sZFNjYWxlOwotICAgICAgICAgICAgbUludkZpbmFsWm9vbVNjYWxlID0gMS4wZiAvIG1BY3R1YWxTY2FsZTsKLSAgICAgICAgICAgIG1ab29tU2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBXZWJWaWV3Q29yZS5wYXVzZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHZpZXcgY29udGFpbmluZyB6b29tIGNvbnRyb2xzIGkuZS4gKy8tIGJ1dHRvbnMuIFRoZSBjYWxsZXIgaXMKICAgICAgKiBpbiBjaGFyZ2Ugb2YgaW5zdGFsbGluZyB0aGlzIHZpZXcgdG8gdGhlIHZpZXcgaGllcmFyY2h5LiBUaGlzIHZpZXcgd2lsbApAQCAtNjEwNyw4MSArNjA1MywyOSBAQAogICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiVGhpcyBXZWJWaWV3IGRvZXNuJ3Qgc3VwcG9ydCB6b29tLiIpOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgbVpvb21Db250cm9scyA9IGNyZWF0ZVpvb21Db250cm9scygpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogbmVlZCB0byBiZSBzZXQgdG8gVklTSUJMRSBmaXJzdCBzbyB0aGF0IGdldE1lYXN1cmVkSGVpZ2h0KCkgaW4KLSAgICAgICAgICAgICAqIHtAbGluayAjb25TaXplQ2hhbmdlZCgpfSBjYW4gcmV0dXJuIHRoZSBtZWFzdXJlZCB2YWx1ZSBmb3IgcHJvcGVyCi0gICAgICAgICAgICAgKiBsYXlvdXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1ab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVpvb21Db250cm9sUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotCi0gICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc21pc3MgdGhlIGNvbnRyb2xzIGlmIHRoZSB1c2VyIGhhcwotICAgICAgICAgICAgICAgICAgICAgKiBmb2N1cyBvbiB0aGVtLiBXYWl0IGFuZCBjaGVjayBhZ2FpbiBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICghbVpvb21Db250cm9scy5oYXNGb2N1cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVpvb21Db250cm9sczsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXRFeHRlcm5hbFpvb21QaWNrZXIoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGNyZWF0ZVpvb21Db250cm9scygpIHsKLSAgICAgICAgRXh0ZW5kZWRab29tQ29udHJvbHMgem9vbUNvbnRyb2xzID0gbmV3IEV4dGVuZGVkWm9vbUNvbnRyb2xzKG1Db250ZXh0Ci0gICAgICAgICAgICAsIG51bGwpOwotICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRpbWUgb3V0Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICB6b29tSW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRpbWUgb3V0Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICB6b29tT3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gem9vbUNvbnRyb2xzOworICAgIHZvaWQgZGlzbWlzc1pvb21Db250cm9sKCkgeworICAgICAgICBtWm9vbU1hbmFnZXIuZGlzbWlzc1pvb21QaWNrZXIoKTsKKyAgICB9CisKKyAgICBmbG9hdCBnZXREZWZhdWx0Wm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmdldERlZmF1bHRTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBab29tQnV0dG9uc0NvbnRyb2xsZXJ9IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFkZAotICAgICAqIGFkZGl0aW9uYWwgYnV0dG9ucyB0byB0aGUgem9vbSBjb250cm9scyB3aW5kb3cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgWm9vbUJ1dHRvbnNDb250cm9sbGVyfSB1c2VkIGJ5IHRoaXMgY2xhc3MsCi0gICAgICogICAgICAgICBvciBudWxsIGlmIGl0IGlzIHVuYXZhaWxhYmxlLgotICAgICAqIEBoaWRlCisgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBXZWJWaWV3IGNhbiBiZSB6b29tZWQgaW4uCiAgICAgICovCi0gICAgcHVibGljIFpvb21CdXR0b25zQ29udHJvbGxlciBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKSB7Ci0gICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPSBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyKHRoaXMpOwotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRPblpvb21MaXN0ZW5lcihtWm9vbUxpc3RlbmVyKTsKLSAgICAgICAgICAgIC8vIFpvb21CdXR0b25zQ29udHJvbGxlciBwb3NpdGlvbnMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSwgYnV0IGluCi0gICAgICAgICAgICAvLyB0aGUgbWlkZGxlLiBDaGFuZ2UgdGhlaXIgbGF5b3V0IHBhcmFtZXRlcnMgc28gdGhleSBhcHBlYXIgb24gdGhlCi0gICAgICAgICAgICAvLyByaWdodC4KLSAgICAgICAgICAgIFZpZXcgY29udHJvbHMgPSBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpOwotICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSBjb250cm9scy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHsKLSAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgZnJhbWVQYXJhbXMgPSAoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSBwYXJhbXM7Ci0gICAgICAgICAgICAgICAgZnJhbWVQYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuUklHSFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7CisgICAgcHVibGljIGJvb2xlYW4gY2FuWm9vbUluKCkgeworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmNhblpvb21JbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgV2ViVmlldyBjYW4gYmUgem9vbWVkIG91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tT3V0KCkgeworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYxODksMTUgKzYwODMsNyBAQAogICAgICAqIEByZXR1cm4gVFJVRSBpZiB6b29tIGluIHN1Y2NlZWRzLiBGQUxTRSBpZiBubyB6b29tIGNoYW5nZXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gem9vbUluKCkgewotICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQotICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgotICAgICAgICBtWm9vbUNlbnRlclggPSBnZXRWaWV3V2lkdGgoKSAqIC41ZjsKLSAgICAgICAgbVpvb21DZW50ZXJZID0gZ2V0Vmlld0hlaWdodCgpICogLjVmOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIHJldHVybiB6b29tV2l0aFByZXZpZXcobUFjdHVhbFNjYWxlICogMS4yNWYsIHRydWUpOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLnpvb21JbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjIwNSwxNCArNjA5MSw3IEBACiAgICAgICogQHJldHVybiBUUlVFIGlmIHpvb20gb3V0IHN1Y2NlZWRzLiBGQUxTRSBpZiBubyB6b29tIGNoYW5nZXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gem9vbU91dCgpIHsKLSAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKLSAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgotICAgICAgICBtWm9vbUNlbnRlclggPSBnZXRWaWV3V2lkdGgoKSAqIC41ZjsKLSAgICAgICAgbVpvb21DZW50ZXJZID0gZ2V0Vmlld0hlaWdodCgpICogLjVmOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIHJldHVybiB6b29tV2l0aFByZXZpZXcobUFjdHVhbFNjYWxlICogMC44ZiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuem9vbU91dCgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKSB7CkBAIC02MzEzLDcgKzYxOTIsMTQgQEAKICAgICAgICAgLy8gbUxhc3RUb3VjaFggYW5kIG1MYXN0VG91Y2hZIGFyZSB0aGUgcG9pbnQgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQKICAgICAgICAgaW50IGNvbnRlbnRYID0gdmlld1RvQ29udGVudFgoKGludCkgbUxhc3RUb3VjaFggKyBtU2Nyb2xsWCk7CiAgICAgICAgIGludCBjb250ZW50WSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1MYXN0VG91Y2hZICsgbVNjcm9sbFkpOwotICAgICAgICBpZiAobmF0aXZlUG9pbnRJbk5hdkNhY2hlKGNvbnRlbnRYLCBjb250ZW50WSwgbU5hdlNsb3ApKSB7CisgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgeworICAgICAgICAgICAgcmVtb3ZlVG91Y2hIaWdobGlnaHQoZmFsc2UpOworICAgICAgICAgICAgV2ViVmlld0NvcmUuVG91Y2hVcERhdGEgdG91Y2hVcERhdGEgPSBuZXcgV2ViVmlld0NvcmUuVG91Y2hVcERhdGEoKTsKKyAgICAgICAgICAgIC8vIHVzZSAiMCIgYXMgZ2VuZXJhdGlvbiBpZCB0byBpbmZvcm0gV2ViS2l0IHRvIHVzZSB0aGUgc2FtZSB4L3kgYXMKKyAgICAgICAgICAgIC8vIGl0IHVzZWQgd2hlbiBwcm9jZXNzaW5nIEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMKKyAgICAgICAgICAgIHRvdWNoVXBEYXRhLm1Nb3ZlR2VuZXJhdGlvbiA9IDA7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfVVAsIHRvdWNoVXBEYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVQb2ludEluTmF2Q2FjaGUoY29udGVudFgsIGNvbnRlbnRZLCBtTmF2U2xvcCkpIHsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLk1vdGlvblVwRGF0YSBtb3Rpb25VcERhdGEgPSBuZXcgV2ViVmlld0NvcmUKICAgICAgICAgICAgICAgICAgICAgLk1vdGlvblVwRGF0YSgpOwogICAgICAgICAgICAgbW90aW9uVXBEYXRhLm1GcmFtZSA9IG5hdGl2ZUNhY2hlSGl0RnJhbWVQb2ludGVyKCk7CkBAIC02MzQxLDI3ICs2MjI3LDE2IEBACiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHZpZXcgKFBsdWdpbikgaXMgZnVsbHkgdmlzaWJsZSBhbmQgbWF4aW1pemVkIGluc2lkZQogICAgICAqIHRoZSBXZWJWaWV3LgogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsdWdpbkZpdE9uU2NyZWVuKFZpZXdNYW5hZ2VyLkNoaWxkVmlldyB2aWV3KSB7Ci0gICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7Ci0gICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyB2aWV3LndpZHRoLAotICAgICAgICAgICAgICAgIChmbG9hdCkgdmlld0hlaWdodCAvIHZpZXcuaGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRUb1ZpZXdYKHZpZXcueCkgPj0gbVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1godmlldy54ICsgdmlldy53aWR0aCkgPD0gbVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkpID49IG1TY3JvbGxZCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSArIHZpZXcuaGVpZ2h0KSA8PSBtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmlld0hlaWdodCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBib29sZWFuIGlzUGx1Z2luRml0T25TY3JlZW4oVmlld01hbmFnZXIuQ2hpbGRWaWV3IHZpZXcpIHsKKyAgICAgICAgZmluYWwgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOworICAgICAgICBmaW5hbCBpbnQgdmlld0hlaWdodCA9IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKTsKKyAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbigoZmxvYXQpIHZpZXdXaWR0aCAvIHZpZXcud2lkdGgsIChmbG9hdCkgdmlld0hlaWdodCAvIHZpZXcuaGVpZ2h0KTsKKyAgICAgICAgc2NhbGUgPSBtWm9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhzY2FsZSk7CisgICAgICAgIHJldHVybiAhbVpvb21NYW5hZ2VyLndpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKQorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdYKHZpZXcueCkgPj0gbVNjcm9sbFgKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WCh2aWV3LnggKyB2aWV3LndpZHRoKSA8PSBtU2Nyb2xsWCArIHZpZXdXaWR0aAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSkgPj0gbVNjcm9sbFkKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkgKyB2aWV3LmhlaWdodCkgPD0gbVNjcm9sbFkgKyB2aWV3SGVpZ2h0OwogICAgIH0KIAogICAgIC8qCkBAIC02MzcwLDIyICs2MjQ1LDE5IEBACiAgICAgICogYW5pbWF0ZWQgc2Nyb2xsIHRvIGNlbnRlciBpdC4gSWYgdGhlIHpvb20gbmVlZHMgdG8gYmUgY2hhbmdlZCwgZmluZCB0aGUKICAgICAgKiB6b29tIGNlbnRlciBhbmQgZG8gYSBzbW9vdGggem9vbSB0cmFuc2l0aW9uLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjZW50ZXJGaXRSZWN0KGludCBkb2NYLCBpbnQgZG9jWSwgaW50IGRvY1dpZHRoLCBpbnQgZG9jSGVpZ2h0KSB7CisgICAgdm9pZCBjZW50ZXJGaXRSZWN0KGludCBkb2NYLCBpbnQgZG9jWSwgaW50IGRvY1dpZHRoLCBpbnQgZG9jSGVpZ2h0KSB7CiAgICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKICAgICAgICAgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7CiAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyBkb2NXaWR0aCwgKGZsb2F0KSB2aWV3SGVpZ2h0CiAgICAgICAgICAgICAgICAgLyBkb2NIZWlnaHQpOwotICAgICAgICBpZiAoc2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NaW5ab29tU2NhbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbUFjdHVhbFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7CisgICAgICAgIHNjYWxlID0gbVpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoc2NhbGUpOworICAgICAgICBpZiAoIW1ab29tTWFuYWdlci53aWxsU2NhbGVUcmlnZ2VyWm9vbShzY2FsZSkpIHsKICAgICAgICAgICAgIHBpblNjcm9sbFRvKGNvbnRlbnRUb1ZpZXdYKGRvY1ggKyBkb2NXaWR0aCAvIDIpIC0gdmlld1dpZHRoIC8gMiwKICAgICAgICAgICAgICAgICAgICAgY29udGVudFRvVmlld1koZG9jWSArIGRvY0hlaWdodCAvIDIpIC0gdmlld0hlaWdodCAvIDIsCiAgICAgICAgICAgICAgICAgICAgIHRydWUsIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWCA9IGRvY1ggKiBtQWN0dWFsU2NhbGUgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgIGZsb2F0IGFjdHVhbFNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CisgICAgICAgICAgICBmbG9hdCBvbGRTY3JlZW5YID0gZG9jWCAqIGFjdHVhbFNjYWxlIC0gbVNjcm9sbFg7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1ggPSBkb2NYICogc2NhbGU7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1dpZHRoID0gZG9jV2lkdGggKiBzY2FsZTsKICAgICAgICAgICAgIGZsb2F0IG5ld01heFdpZHRoID0gbUNvbnRlbnRXaWR0aCAqIHNjYWxlOwpAQCAtNjM5Niw5ICs2MjY4LDkgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U2NyZWVuWCA+IChuZXdNYXhXaWR0aCAtIHJlY3RWaWV3WCAtIHJlY3RWaWV3V2lkdGgpKSB7CiAgICAgICAgICAgICAgICAgbmV3U2NyZWVuWCA9IHZpZXdXaWR0aCAtIChuZXdNYXhXaWR0aCAtIHJlY3RWaWV3WCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclggPSAob2xkU2NyZWVuWCAqIHNjYWxlIC0gbmV3U2NyZWVuWCAqIG1BY3R1YWxTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgLyAoc2NhbGUgLSBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWSA9IGRvY1kgKiBtQWN0dWFsU2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpCisgICAgICAgICAgICBmbG9hdCB6b29tQ2VudGVyWCA9IChvbGRTY3JlZW5YICogc2NhbGUgLSBuZXdTY3JlZW5YICogYWN0dWFsU2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gYWN0dWFsU2NhbGUpOworICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWSA9IGRvY1kgKiBhY3R1YWxTY2FsZSArIGdldFRpdGxlSGVpZ2h0KCkKICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWTsKICAgICAgICAgICAgIGZsb2F0IHJlY3RWaWV3WSA9IGRvY1kgKiBzY2FsZSArIGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld0hlaWdodCA9IGRvY0hlaWdodCAqIHNjYWxlOwpAQCAtNjQxMCwxMDkgKzYyODIsMTAgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U2NyZWVuWSA+IChuZXdNYXhIZWlnaHQgLSByZWN0Vmlld1kgLSByZWN0Vmlld0hlaWdodCkpIHsKICAgICAgICAgICAgICAgICBuZXdTY3JlZW5ZID0gdmlld0hlaWdodCAtIChuZXdNYXhIZWlnaHQgLSByZWN0Vmlld1kpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gKG9sZFNjcmVlblkgKiBzY2FsZSAtIG5ld1NjcmVlblkgKiBtQWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIHpvb21XaXRoUHJldmlldyhzY2FsZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkaXNtaXNzWm9vbUNvbnRyb2woKSB7Ci0gICAgICAgIGlmIChtV2ViVmlld0NvcmUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbWF5YmUgY2FsbGVkIGFmdGVyIFdlYlZpZXcncyBkZXN0cm95KCkuIEFzIHdlIGNhbid0IGdldCBzZXR0aW5ncywKLSAgICAgICAgICAgIC8vIGp1c3QgaGlkZSB6b29tIGNvbnRyb2wgZm9yIGJvdGggc3R5bGVzLgotICAgICAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xSdW5uYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSdWxlIGZvciBkb3VibGUgdGFwOgotICAgIC8vIDEuIGlmIHRoZSBjdXJyZW50IHNjYWxlIGlzIG5vdCBzYW1lIGFzIHRoZSB0ZXh0IHdyYXAgc2NhbGUgYW5kIGxheW91dAotICAgIC8vICAgIGFsZ29yaXRobSBpcyBOQVJST1dfQ09MVU1OUywgZml0IHRvIGNvbHVtbjsKLSAgICAvLyAyLiBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBub3Qgb3ZlcnZpZXcgbW9kZSwgY2hhbmdlIHRvIG92ZXJ2aWV3IG1vZGU7Ci0gICAgLy8gMy4gaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgb3ZlcnZpZXcgbW9kZSwgY2hhbmdlIHRvIGRlZmF1bHQgc2NhbGUuCi0gICAgcHJpdmF0ZSB2b2lkIGRvRG91YmxlVGFwKCkgewotICAgICAgICBpZiAobVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtWm9vbUNlbnRlclggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgbVpvb21DZW50ZXJZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KDApOwotICAgICAgICAvLyByZW1vdmUgdGhlIHpvb20gY29udHJvbCBhZnRlciBkb3VibGUgdGFwCi0gICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOwotICAgICAgICBWaWV3TWFuYWdlci5DaGlsZFZpZXcgcGx1Z2luID0gbVZpZXdNYW5hZ2VyLmhpdFRlc3QobUFuY2hvclgsIG1BbmNob3JZKTsKLSAgICAgICAgaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXNQbHVnaW5GaXRPblNjcmVlbihwbHVnaW4pKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbFkgPCBnZXRUaXRsZUhlaWdodCgpKSBtU2Nyb2xsWSA9IDA7Ci0gICAgICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgY2VudGVyRml0UmVjdChwbHVnaW4ueCwgcGx1Z2luLnksIHBsdWdpbi53aWR0aCwgcGx1Z2luLmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiB6b29tVG9EZWZhdWx0ID0gZmFsc2U7Ci0gICAgICAgIGlmICgoc2V0dGluZ3MuZ2V0TGF5b3V0QWxnb3JpdGhtKCkgPT0gV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5BUlJPV19DT0xVTU5TKQotICAgICAgICAgICAgICAgICYmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBtVGV4dFdyYXBTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUFjdHVhbFNjYWxlLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgIGZsb2F0IG92ZXJ2aWV3U2NhbGUgPSAoZmxvYXQpIGdldFZpZXdXaWR0aCgpIC8gbVpvb21PdmVydmlld1dpZHRoOwotICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1BY3R1YWxTY2FsZSAtIG92ZXJ2aWV3U2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtSW5ab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgIGZsb2F0IG5ld1NjYWxlID0gKGZsb2F0KSBnZXRWaWV3V2lkdGgoKSAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBuZXdTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSB0aXRsZWJhciBmdWxseSByZXZlYWwgaW4gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSA8IGdldFRpdGxlSGVpZ2h0KCkpIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICB6b29tV2l0aFByZXZpZXcobmV3U2NhbGUsIHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBtRGVmYXVsdFNjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIHpvb21Ub0RlZmF1bHQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgem9vbVRvRGVmYXVsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHpvb21Ub0RlZmF1bHQpIHsKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGxlZnQgPSBuYXRpdmVHZXRCbG9ja0xlZnRFZGdlKG1BbmNob3JYLCBtQW5jaG9yWSwgbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIGlmIChsZWZ0ICE9IE5PX0xFRlRFREdFKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIGEgNXB0IHBhZGRpbmcgdG8gdGhlIGxlZnQgZWRnZS4KLSAgICAgICAgICAgICAgICBpbnQgdmlld0xlZnQgPSBjb250ZW50VG9WaWV3WChsZWZ0IDwgNSA/IDAgOiAobGVmdCAtIDUpKQotICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdGhlIHpvb20gY2VudGVyIHNvIHRoYXQgdGhlIG5ldyBzY3JvbGwgeCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgLy8gb24gdGhlIGxlZnQgZWRnZS4KLSAgICAgICAgICAgICAgICBpZiAodmlld0xlZnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IHZpZXdMZWZ0ICogbURlZmF1bHRTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKG1EZWZhdWx0U2NhbGUgLSBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjcm9sbEJ5KHZpZXdMZWZ0LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB6b29tV2l0aFByZXZpZXcobURlZmF1bHRTY2FsZSwgdHJ1ZSk7CisgICAgICAgICAgICBmbG9hdCB6b29tQ2VudGVyWSA9IChvbGRTY3JlZW5ZICogc2NhbGUgLSBuZXdTY3JlZW5ZICogYWN0dWFsU2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gYWN0dWFsU2NhbGUpOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnNldFpvb21DZW50ZXIoem9vbUNlbnRlclgsIHpvb21DZW50ZXJZKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zdGFydFpvb21BbmltYXRpb24oc2NhbGUsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjUyNCw2ICs2Mjk3LDkgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RGb2N1cyhpbnQgZGlyZWN0aW9uLCBSZWN0IHByZXZpb3VzbHlGb2N1c2VkUmVjdCkgeworICAgICAgICAvLyBGSVhNRTogSWYgYSBzdWJ3aW5kb3cgaXMgc2hvd2luZyBmaW5kLCBhbmQgdGhlIHVzZXIgdG91Y2hlcyB0aGUKKyAgICAgICAgLy8gYmFja2dyb3VuZCB3aW5kb3csIGl0IGNhbiBzdGVhbCBmb2N1cy4KKyAgICAgICAgaWYgKG1GaW5kSXNVcCkgcmV0dXJuIGZhbHNlOwogICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtV2ViVGV4dFZpZXcucmVxdWVzdEZvY3VzKGRpcmVjdGlvbiwKQEAgLTY2MTEsNiArNjM4NywxMiBAQAogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RDaGlsZFJlY3RhbmdsZU9uU2NyZWVuKFZpZXcgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCByZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW1tZWRpYXRlKSB7CisgICAgICAgIC8vIGRvbid0IHNjcm9sbCB3aGlsZSBpbiB6b29tIGFuaW1hdGlvbi4gV2hlbiBpdCBpcyBkb25lLCB3ZSB3aWxsIGFkanVzdAorICAgICAgICAvLyB0aGUgbmVjZXNzYXJ5IGNvbXBvbmVudHMgKGUuZy4sIFdlYlRleHRWaWV3IGlmIGl0IGlzIGluIGVkaXRpbmcgbW9kZSkKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICByZWN0Lm9mZnNldChjaGlsZC5nZXRMZWZ0KCkgLSBjaGlsZC5nZXRTY3JvbGxYKCksCiAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0VG9wKCkgLSBjaGlsZC5nZXRTY3JvbGxZKCkpOwogCkBAIC02NzUzLDcgKzY1MzUsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFNXSVRDSF9UT19TSE9SVFBSRVNTOiB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0lOSVRfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1NIT1JUUFJFU1NfU1RBUlRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02NzY3LDI2ICs2NTUwLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFNXSVRDSF9UT19MT05HUFJFU1M6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSB8fCBtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1BY3Rpb24gPSBXZWJWaWV3Q29yZS5BQ1RJT05fTE9OR1BSRVNTOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gdmlld1RvQ29udGVudFgoKGludCkgbUxhc3RUb3VjaFggKyBtU2Nyb2xsWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUG9pbnRzID0gbmV3IFBvaW50WzFdOworICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1Qb2ludHNbMF0gPSBuZXcgUG9pbnQodmlld1RvQ29udGVudFgoKGludCkgbUxhc3RUb3VjaFggKyBtU2Nyb2xsWCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRhU3RhdGUgZm9yIGxvbmcgcHJlc3MgaXMgdHJpY2t5LiBTaG91bGQgaXQgYmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSB3aGVuIHRoZSBwcmVzcyBzdGFydGVkIG9yIHdoZW4gdGhlIHByZXNzIHdhcwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZWQ/IE9yIHNvbWUgaW50ZXJtZWRpYXJ5IGtleSBzdGF0ZT8gRm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGljaXR5IGZvciBub3csIHdlIGRvbid0IHNldCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC02ODE5LDcwICs2NjAxLDM2IEBACiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ29udGVudFNjcm9sbFRvKG1zZy5hcmcxLCBtc2cuYXJnMik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1pPT01fUkFOR0U6IHsKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IChXZWJWaWV3Q29yZS5WaWV3U3RhdGUpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1TY3JvbGxYIGNvbnRhaW5zIHRoZSBuZXcgbWluUHJlZldpZHRoCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIGdldFZpZXdXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKHZpZXdTdGF0ZSwgZ2V0Vmlld1dpZHRoKCksIHZpZXdTdGF0ZS5tU2Nyb2xsWCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFJFUExBQ0VfQkFTRV9DT05URU5UOiB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlcGxhY2VCYXNlQ29udGVudChtc2cuYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIE5FV19QSUNUVVJFX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSd2ZSBwcmV2aW91c2x5IGRlbGF5ZWQgZGVsZXRpbmcgYSByb290Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxheWVyLCBkbyBpdCBub3cuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVsYXllZERlbGV0ZVJvb3RMYXllcikgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcigwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpOwogICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZm9yIG5ldyBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3ID0gKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoZHJhdy5tQmFzZUxheWVyKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgUG9pbnQgdmlld1NpemUgPSBkcmF3Lm1WaWV3UG9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlV2lkZVZpZXdwb3J0ID0gc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBkcmF3Lm1SZXN0b3JlU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUmVzdG9yZVN0YXRlID0gcmVzdG9yZVN0YXRlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIHZpZXdTaXplLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubU1pblByZWZXaWR0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3Lm1WaWV3U3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCA9IHZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGxhc3Qgc2VudCBkYXRhIGhlcmUgc2luY2UgZGVhbGluZyB3aXRoIG5ldyBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uRmlyc3RMYXlvdXQoZHJhdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtSW5pdGlhbFNjYWxlSW5QZXJjZW50IC8gMTAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxTY2FsZUluUGVyY2VudCAhPSBtVGV4dFdyYXBTY2FsZSAqIDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB1c2VXaWRlVmlld3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSByZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCBNYXRoLmFicyhzY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtVGV4dFdyYXBTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyhyZXN0b3JlU3RhdGUubVNjcm9sbFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFNjcm9sbFRvKHZpZXdTdGF0ZS5tU2Nyb2xsWCwgdmlld1N0YXRlLm1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZSBhcmUgb24gYSBuZXcgcGFnZSwgcmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lY2Vzc2FyeSBmb3IgcGFnZSBsb2FkcyBkcml2ZW4gYnkgd2Via2l0LCBhbmQgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIHdoZW4gdGhlIHVzZXIgd2FzIG9uIGEgcGFzc3dvcmQgZmllbGQsIHNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IHdhcyB2aXNpYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIGxheW91dCAoaS5lLiByZXF1ZXN0IGEgbGF5b3V0IGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIHZpZXcgc3lzdGVtKSBpZiB0aGUgbGFzdCB2aWV3IHNpemUgdGhhdCB3ZSBzZW50IHRvCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlYkNvcmUgbWF0Y2hlcyB0aGUgdmlldyBzaXplIG9mIHRoZSBwaWN0dXJlIHdlIGp1c3QKQEAgLTY4OTAsNDUgKzY2MzgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVMYXlvdXQgPSB2aWV3U2l6ZS54ID09IG1MYXN0V2lkdGhTZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmlld1NpemUueSA9PSBtTGFzdEhlaWdodFNlbnQ7CiAgICAgICAgICAgICAgICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKGRyYXcubVdpZHRoSGVpZ2h0LngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tV2lkdGhIZWlnaHQueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKG1GaW5kSXNVcCA/IG1GaW5kSGVpZ2h0IDogMCksIHVwZGF0ZUxheW91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tV2lkdGhIZWlnaHQueSwgdXBkYXRlTGF5b3V0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgYiA9IGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTkVXX1BJQ1RVUkVfTVNHX0lEIHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5sZWZ0KyIsIitiLnRvcCsiLCIrYi5yaWdodCsiLCIrYi5ib3R0b20rIn0iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQ29udGVudFJlY3QoZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCkpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChtUGljdHVyZUxpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWN0dXJlTGlzdGVuZXIub25OZXdQaWN0dXJlKFdlYlZpZXcudGhpcywgY2FwdHVyZVBpY3R1cmUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVdpZGVWaWV3cG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgbVpvb21PdmVydmlld1dpZHRoIHVwcGVyIGJvdW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzTWF4Vmlld3BvcnRXaWR0aCBzbyB0aGF0IGlmIHRoZSBwYWdlIGRvZXNuJ3QgYmVoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWxsLCB0aGUgV2ViVmlldyB3b24ndCBnbyBpbnNhbmUuIGxpbWl0IHRoZSBsb3dlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmQgdG8gbWF0Y2ggdGhlIGRlZmF1bHQgc2NhbGUgZm9yIG1vYmlsZSBzaXRlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tT3ZlcnZpZXdXaWR0aCA9IE1hdGgubWluKHNNYXhWaWV3cG9ydFdpZHRoLCBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoKGludCkgKHZpZXdXaWR0aCAvIG1EZWZhdWx0U2NhbGUpLCBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heChkcmF3Lm1NaW5QcmVmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1WaWV3UG9pbnQueCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoIC8gbVpvb21PdmVydmlld1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5ICYmIG1Jblpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml0IHRoZSBjb250ZW50IHdpZHRoIHRvIHRoZSBjdXJyZW50IHZpZXcuIElnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJvdW5kaW5nIGVycm9yIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoKHZpZXdXaWR0aCAqIG1JbnZBY3R1YWxTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtWm9vbU92ZXJ2aWV3V2lkdGgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZSgoZmxvYXQpIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBtWm9vbU92ZXJ2aWV3V2lkdGgsIE1hdGguYWJzKG1BY3R1YWxTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtVGV4dFdyYXBTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHBpY3R1cmUKKyAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uTmV3UGljdHVyZShkcmF3KTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoZHJhdy5tRm9jdXNTaXplQ2hhbmdlZCAmJiBpbkVkaXRpbmdNb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb2N1c1NpemVDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVzdG9yZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld01hbmFnZXIucG9zdFJlYWR5VG9EcmF3QWxsKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02OTYyLDE2ICs2NjkwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQ6CiAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTb2Z0S2V5Ym9hcmQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lECisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lEOgogICAgICAgICAgICAgICAgICAgICB1cGRhdGVUZXh0U2VsZWN0aW9uRnJvbU1lc3NhZ2UobXNnLmFyZzEsIG1zZy5hcmcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3Q29yZS5UZXh0U2VsZWN0aW9uRGF0YSkgbXNnLm9iaik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gdGV4dGZpZWxkIHdhcyBpbiBmb2N1cywgYW5kIHRoZSB1c2VyIHRvdWNoZWQgb25lLAotICAgICAgICAgICAgICAgICAgICAvLyBjYXVzaW5nIGl0IHRvIHNlbmQgdGhpcyBtZXNzYWdlLCB0aGVuIFdlYlRleHRWaWV3IGhhcyBub3QKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBzZXQgdXAgeWV0LiAgUmVidWlsZCBpdCBzbyBpdCBjYW4gc2V0IGl0cyBzZWxlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVUZXh0U2VsZWN0aW9uRnJvbU1lc3NhZ2UobXNnLmFyZzEsIG1zZy5hcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3Q29yZS5UZXh0U2VsZWN0aW9uRGF0YSkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBGT1JNX0RJRF9CTFVSOgorICAgICAgICAgICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVdlYlRleHRWaWV3LmlzU2FtZVRleHRGaWVsZChtc2cuYXJnMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVTb2Z0S2V5Ym9hcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFJFVFVSTl9MQUJFTDoKICAgICAgICAgICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKQpAQCAtNjk4NywyMCArNjcxNSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTU9WRV9PVVRfT0ZfUExVR0lOOgorICAgICAgICAgICAgICAgIGNhc2UgVU5IQU5ETEVEX05BVl9LRVk6CiAgICAgICAgICAgICAgICAgICAgIG5hdkhhbmRsZWRLZXkobXNnLmFyZzEsIDEsIGZhbHNlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9FTlRSWV9NU0dfSUQ6CiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgc2VudCBhZnRlciBmaW5pc2hpbmcgcmVzaXplIGluIFdlYlZpZXdDb3JlLiBNYWtlCiAgICAgICAgICAgICAgICAgICAgIC8vIHN1cmUgdGhlIHRleHQgZWRpdCBib3ggaXMgc3RpbGwgb24gdGhlICBzY3JlZW4uCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVDdXJzb3JJc1RleHRJbnB1dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuYnJpbmdJbnRvVmlldygpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDTEVBUl9URVhUX0VOVFJZOgotICAgICAgICAgICAgICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxfUkVDVF9NU0dfSUQ6IHsKICAgICAgICAgICAgICAgICAgICAgUmVjdCByID0gKFJlY3QpbXNnLm9iajsKQEAgLTcwMTMsMjMgKzY3NDAsNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIElNTUVESUFURV9SRVBBSU5UX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9ST09UX0xBWUVSX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBtc2cuYXJnMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVsbCBpbmRpY2F0ZXMgZGVsZXRpbmcgdGhlIG9sZCBsYXllciwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhY3R1YWxseSBkbyBzbyB1bnRpbCB3ZSd2ZSBnb3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgcGFnZSB0byBkaXNwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcihtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9GT1JNX0RBVEE6CiAgICAgICAgICAgICAgICAgICAgIEF1dG9Db21wbGV0ZUFkYXB0ZXIgYWRhcHRlciA9IChBdXRvQ29tcGxldGVBZGFwdGVyKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBpZiAobVdlYlRleHRWaWV3LmlzU2FtZVRleHRGaWVsZChtc2cuYXJnMSkpIHsKQEAgLTcwNzMsNDMgKzY3ODMsNDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmVudERlZmF1bHQgPSBtc2cuYXJnMiA9PSAxID8gUFJFVkVOVF9ERUZBVUxUX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQUkVWRU5UX0RFRkFVTFRfTk87CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24uc2V0RW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cuYXJnMiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGRlZmF1bHQgaXMgbm90IGNhbGxlZCBpbiBXZWJDb3JlLCBzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgbmVlZHMgdG8gYmUgcmVwcm9jZXNzZWQgaW4gVUkKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IChUb3VjaEV2ZW50RGF0YSkgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGVkLm1BY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHRlZC5tVmlld1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVBvaW50c1swXS54KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVBvaW50c1swXS55KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzbmFwcGluZyBpbiBkZWZlciBwcm9jZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gY29udGVudFRvVmlld1godGVkLm1Qb2ludHNbMF0ueCkgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVBvaW50c1swXS55KSAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRFJBR19NT0RFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0gdGVkLm1WaWV3WTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFYID0gcGluTG9jWCgoaW50KSAobVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB0ZWQubVZpZXdYKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFZID0gcGluTG9jWSgoaW50KSAobVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB0ZWQubVZpZXdZKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RyYWcoZGVsdGFYLCBkZWx0YVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZmxpbmcgaW4gZGVmZXIgcHJvY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyLnNwcmluZ0JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWCgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTcxMTcsOSArNjgzMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2ViVmlld0NvcmUuQUNUSU9OX0RPVUJMRVRBUDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9Eb3VibGVUYXAoKSBuZWVkcyBtTGFzdFRvdWNoWC9ZIGFzIGFuY2hvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0gdGVkLm1WaWV3WTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Eb3VibGVUYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVBvaW50c1swXS54KSAtIG1TY3JvbGxYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IGNvbnRlbnRUb1ZpZXdZKHRlZC5tUG9pbnRzWzBdLnkpIC0gbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5oYW5kbGVEb3VibGVUYXAobUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdlYlZpZXdDb3JlLkFDVElPTl9MT05HUFJFU1M6CkBAIC03MTI3LDcgKzY4NDAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGl0VGVzdCAhPSBudWxsICYmIGhpdFRlc3QubVR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBIaXRUZXN0UmVzdWx0LlVOS05PV05fVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUxvbmdDbGljaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTcxNDUsOCArNjg1Nyw4IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIEZJTkRfQUdBSU46CiAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBmaW5kIGhhcyBiZWVuIGRpc21pc3NlZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GaW5kSXNVcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbChtTGFzdEZpbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAobUZpbmRJc1VwICYmIG1GaW5kQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZpbmRDYWxsYmFjay5maW5kQWxsKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTcxNzQsOSArNjg4Niw5IEBACiAgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBpbnQgbnBwID0gbXNnLmFyZzE7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuSG9sZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiU2hvdWxkIG5vdCBoYXZlIGFub3RoZXIgZnVsbCBzY3JlZW4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlci5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzRnVsbFNjcmVlbk1vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlciA9IG5ldyBQbHVnaW5GdWxsU2NyZWVuSG9sZGVyKFdlYlZpZXcudGhpcywgbnBwKTsKICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuc2V0Q29udGVudFZpZXcodmlldyk7CkBAIC03MTg3LDEwICs2ODk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgSElERV9GVUxMU0NSRUVOOgotICAgICAgICAgICAgICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlci5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGlzbWlzc0Z1bGxTY3JlZW5Nb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBET01fRk9DVVNfQ0hBTkdFRDoKQEAgLTcyNTEsNyArNjk2MCw2IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIENFTlRFUl9GSVRfUkVDVDoKICAgICAgICAgICAgICAgICAgICAgUmVjdCByID0gKFJlY3QpbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGNlbnRlckZpdFJlY3Qoci5sZWZ0LCByLnRvcCwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTcyNjAsNiArNjk2OCw1MSBAQAogICAgICAgICAgICAgICAgICAgICBtVmVydGljYWxTY3JvbGxCYXJNb2RlID0gbXNnLmFyZzI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgY2FzZSBTRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb25TdHJpbmcgPSAoU3RyaW5nKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbmplY3Rvci5vblNlbGVjdGlvblN0cmluZ0NoYW5nZShzZWxlY3Rpb25TdHJpbmcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOgorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5nZXRCb3VuZHMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5zZXRFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8UmVjdD4gcmVjdHMgPSAoQXJyYXlMaXN0PFJlY3Q+KSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZWN0IHJlY3QgOiByZWN0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3Qgdmlld1JlY3QgPSBjb250ZW50VG9WaWV3UmVjdChyZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIHNpdGVzLCBsaWtlIHN0b3JpZXMgaW4gbnl0aW1lcy5jb20sIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdXNlIGV2ZW50IGhhbmRsZXIgaW4gdGhlIHRvcCBkaXYuIEl0IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIgZnJpZW5kbHkgdG8gaGlnaGxpZ2h0IHRoZSBkaXYgaWYgaXQgY292ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSB0aGFuIGhhbGYgb2YgdGhlIHNjcmVlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlld1JlY3Qud2lkdGgoKSA8IGdldFdpZHRoKCkgPj4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdmlld1JlY3QuaGVpZ2h0KCkgPCBnZXRIZWlnaHQoKSA+PiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi51bmlvbih2aWV3UmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUodmlld1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlNraXAgdGhlIGh1Z2Ugc2VsZWN0aW9uIHJlY3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmlld1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2Ugc2F2ZU1lc3NhZ2UgPSAoU2F2ZVdlYkFyY2hpdmVNZXNzYWdlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlTWVzc2FnZS5tQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZU1lc3NhZ2UubUNhbGxiYWNrLm9uUmVjZWl2ZVZhbHVlKHNhdmVNZXNzYWdlLm1SZXN1bHRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0VUX0FVVE9GSUxMQUJMRToKKyAgICAgICAgICAgICAgICAgICAgbUF1dG9GaWxsUXVlcnlJZCA9IG1zZy5hcmcxOworICAgICAgICAgICAgICAgICAgICBpZiAobVdlYlRleHRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRBdXRvRmlsbGFibGUobUF1dG9GaWxsUXVlcnlJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03NTY3LDM3ICs3MzIwLDYgQEAKICAgICAgICAgICAgICAgICBuZXcgSW52b2tlTGlzdEJveChhcnJheSwgZW5hYmxlZEFycmF5LCBzZWxlY3RlZEFycmF5KSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVpvb21SYW5nZShXZWJWaWV3Q29yZS5SZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlLAotICAgICAgICAgICAgaW50IHZpZXdXaWR0aCwgaW50IG1pblByZWZXaWR0aCwgYm9vbGVhbiB1cGRhdGVab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPT0gMCkgewotICAgICAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtaW5QcmVmV2lkdGggPiBNYXRoLm1heCgwLCB2aWV3V2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aCAvIG1pblByZWZXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1EZWZhdWx0U2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gREVGQVVMVF9NSU5fWk9PTV9TQ0FMRTsKLSAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSByZXN0b3JlU3RhdGUubU1pblNjYWxlOwotICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9PSAwKSB7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSByZXN0b3JlU3RhdGUubU1heFNjYWxlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoKICAgICAgKiBSZXF1ZXN0IGEgZHJvcGRvd24gbWVudSBmb3IgYSBsaXN0Ym94IHdpdGggc2luZ2xlIHNlbGVjdGlvbiBvciBhIHNpbmdsZQogICAgICAqIDxzZWxlY3Q+IGVsZW1lbnQuCkBAIC03NjM2LDcgKzczNTgsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZW5kTW92ZU1vdXNlSWZMYXRlc3QoYm9vbGVhbiByZW1vdmVGb2N1cykgewogICAgICAgICBpZiAocmVtb3ZlRm9jdXMpIHsKLSAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KHRydWUpOworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgfQogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX01PVkVfTU9VU0VfSUZfTEFURVNULAogICAgICAgICAgICAgICAgIGN1cnNvckRhdGEoKSk7CkBAIC03NjgwLDcgKzc0MDIsNyBAQAogICAgICAgICAvLyBGSVhNRSB0aGUgZGl2aXNvciBzaG91bGQgYmUgcmV0cmlldmVkIGZyb20gc29tZXdoZXJlCiAgICAgICAgIC8vIHRoZSBjbG9zZXN0IHRoaW5nIHRvZGF5IGlzIGhhcmQtY29kZWQgaW50byBTY3JvbGxWaWV3LmphdmEKICAgICAgICAgLy8gKGZyb20gU2Nyb2xsVmlldy5qYXZhLCBsaW5lIDM2MykgICBpbnQgbWF4SnVtcCA9IGhlaWdodC8yOwotICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NjkxLDEwICs3NDEzLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFzcyB0aGUga2V5IHRvIHRoZSBwbHVnaW4uICBUaGlzIGFzc3VtZXMgdGhhdCBuYXRpdmVGb2N1c0lzUGx1Z2luKCkKLSAgICAgKiByZXR1cm5lZCB0cnVlLgorICAgICAqIFBhc3MgdGhlIGtleSBkaXJlY3RseSB0byB0aGUgcGFnZS4gIFRoaXMgYXNzdW1lcyB0aGF0CisgICAgICogbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkgcmV0dXJuZWQgdHJ1ZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KGludCBrZXlDb2RlLCBsb25nIHRpbWUsIGJvb2xlYW4gZG93bikgeworICAgIHByaXZhdGUgdm9pZCBsZXRQYWdlSGFuZGxlTmF2S2V5KGludCBrZXlDb2RlLCBsb25nIHRpbWUsIGJvb2xlYW4gZG93bikgewogICAgICAgICBpbnQga2V5RXZlbnRBY3Rpb247CiAgICAgICAgIGludCBldmVudEh1YkFjdGlvbjsKICAgICAgICAgaWYgKGRvd24pIHsKQEAgLTc3NjksNiArNzQ5MSwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gSWYgdGhlIHBhZ2Ugc2hvdWxkIHJlY2VpdmUgU2hpZnQgYW5kIGFycm93cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkgeworICAgICAgICAvLyBUT0RPOiBNYXliZSB0aGUgaW5qZWN0ZWQgc2NyaXB0IHNob3VsZCBhbm5vdW5jZSBpdHMgcHJlc2VuY2UgaW4KKyAgICAgICAgLy8gdGhlIHBhZ2UgbWV0YS10YWcgc28gdGhlIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cworICAgICAgICAvLyB3aWxsIGNoZWNrIHRoYXQgYXMgb25lIG9mIHRoZSBjb25kaXRpb25zIGl0IGxvb2tzIGZvcgorICAgICAgICByZXR1cm4gKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpIHx8IG1BY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0ZWQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB0aGUgYmFja2dyb3VuZCBjb2xvci4gSXQncyB3aGl0ZSBieSBkZWZhdWx0LiBQYXNzCiAgICAgICogemVybyB0byBtYWtlIHRoZSB2aWV3IHRyYW5zcGFyZW50LgogICAgICAqIEBwYXJhbSBjb2xvciAgIHRoZSBBUkdCIGNvbG9yIGRlc2NyaWJlZCBieSBDb2xvci5qYXZhCkBAIC03NzkxLDcgKzc1MjMsNyBAQAogICAgICAqIEBoaWRlIG9ubHkgbmVlZHMgdG8gYmUgYWNjZXNzaWJsZSB0byBCcm93c2VyIGFuZCB0ZXN0aW5nCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhd1BhZ2UoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBtV2ViVmlld0NvcmUuZHJhd0NvbnRlbnRQaWN0dXJlKGNhbnZhcywgMCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMsIDAsIDAsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc4MDUsNiArNzUzNywxNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRvZ2dsZSB3aGV0aGVyIG11bHRpIHRvdWNoIGV2ZW50cyBzaG91bGQgYmUgc2VudCB0byB3ZWJraXQKKyAgICAgKiBubyBtYXR0ZXIgaWYgVUkgd2FudHMgdG8gaGFuZGxlIGl0IGZpcnN0LgorICAgICAqCisgICAgICogQGhpZGUgVGhpcyBpcyBvbmx5IHVzZWQgYnkgdGhlIHdlYmtpdCBsYXlvdXQgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZlck11bHRpVG91Y2goYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBtRGVmZXJNdWx0aXRvdWNoID0gdmFsdWU7CisgICAgICAgIExvZy52KExPR1RBRywgInNldCBtRGVmZXJNdWx0aXRvdWNoIHRvICIgKyB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogIFVwZGF0ZSBvdXIgY2FjaGUgd2l0aCB1cGRhdGVkVGV4dC4KICAgICAgKiAgQHBhcmFtIHVwZGF0ZWRUZXh0ICBUaGUgbmV3IHRleHQgdG8gcHV0IGluIG91ciBjYWNoZS4KICAgICAgKi8KQEAgLTc4MTQsNiArNzU1NywxMCBAQAogICAgICAgICBuYXRpdmVVcGRhdGVDYWNoZWRUZXh0ZmllbGQodXBkYXRlZFRleHQsIG1UZXh0R2VuZXJhdGlvbik7CiAgICAgfQogCisgICAgLypwYWNrYWdlKi8gdm9pZCBhdXRvRmlsbEZvcm0oaW50IGF1dG9GaWxsUXVlcnlJZCkgeworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQVVUT0ZJTExfRk9STSwgYXV0b0ZpbGxRdWVyeUlkLCAvKiB1bnVzZWQgKi8wKTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlQ2FjaGVIaXRGcmFtZVBvaW50ZXIoKTsKICAgICBwcml2YXRlIG5hdGl2ZSBSZWN0IG5hdGl2ZUNhY2hlSGl0Tm9kZUJvdW5kcygpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVDYWNoZUhpdE5vZGVQb2ludGVyKCk7CkBAIC03ODM1LDEwICs3NTgyLDE4IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlQ3Vyc29yV2FudHNLZXlFdmVudHMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZWJ1Z0R1bXAoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZXN0cm95KCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvciBhbmQgZXh0cmEuIElmCisgICAgICogInNwbGl0SWZOZWVkZWQiIGlzIHRydWUgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IDAsIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiBNVVNUIGJlIHBhc3NlZCB0byBXZWJWaWV3Q29yZSB3aXRoIFNQTElUX1BJQ1RVUkVfU0VUIG1lc3NhZ2Ugc28gdGhhdCB0aGUKKyAgICAgKiBuYXRpdmUgYWxsb2NhdGlvbiBjYW4gYmUgZnJlZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZURyYXcoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLCBpbnQgZXh0cmEsCisgICAgICAgICAgICBib29sZWFuIHNwbGl0SWZOZWVkZWQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUR1bXBEaXNwbGF5VHJlZShTdHJpbmcgdXJsT3JOdWxsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVFdmFsdWF0ZUxheWVyc0FuaW1hdGlvbnMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVFeHRlbmRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEcmF3RXh0cmFzKENhbnZhcyBjYW52YXMsIGludCBleHRyYSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRHVtcERpc3BsYXlUcmVlKFN0cmluZyB1cmxPck51bGwpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUZpbmRBbGwoU3RyaW5nIGZpbmRMb3dlciwgU3RyaW5nIGZpbmRVcHBlcik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRmluZE5leHQoYm9vbGVhbiBmb3J3YXJkKTsKICAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVGb2N1c0NhbmRpZGF0ZUZyYW1lUG9pbnRlcigpOwpAQCAtNzg3Niw2ICs3NjMxLDE0IEBACiAgICAgICAgICAgICBib29sZWFuIG5vU2Nyb2xsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVNb3ZlR2VuZXJhdGlvbigpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhZ2Ugc2hvdWxkIGdldCB0aGUgc2hpZnQgYW5kIGFycm93IGtleXMsIHJhdGhlcgorICAgICAqIHRoYW4gc2VsZWN0IHRleHQvbmF2aWdhdGlvbi4KKyAgICAgKgorICAgICAqIElmIHRoZSBmb2N1cyBpcyBhIHBsdWdpbiwgb3IgaWYgdGhlIGZvY3VzIGFuZCBjdXJzb3IgbWF0Y2ggYW5kIGFyZQorICAgICAqIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQsIHRoZW4gdGhlIHBhZ2Ugc2hvdWxkIGhhbmRsZSB0aGVzZSBrZXlzLgorICAgICAqLworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBvaW50SW5OYXZDYWNoZShpbnQgeCwgaW50IHksIGludCBzbG9wKTsKICAgICAvLyBMaWtlIG1hbnkgb3RoZXIgb2Ygb3VyIG5hdGl2ZSBtZXRob2RzLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdAogICAgIC8vIG1OYXRpdmVDbGFzcyBpcyBub3QgbnVsbCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KQEAgLTc4OTAsMTMgKzc2NTMsMTUgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRGaW5kSXNFbXB0eSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZpbmRJc1VwKGJvb2xlYW4gaXNVcCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Rm9sbG93ZWRMaW5rKGJvb2xlYW4gZm9sbG93ZWQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEhlaWdodENhbk1lYXN1cmUoYm9vbGVhbiBtZWFzdXJlKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRSb290TGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTaG93Q3Vyc29yVGltZWQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZXBsYWNlQmFzZUNvbnRlbnQoaW50IGNvbnRlbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUNvcHlCYXNlQ29udGVudFRvUGljdHVyZShQaWN0dXJlIHBpY3QpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUhhc0NvbnRlbnQoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25Qb2ludGVyKGJvb2xlYW4gc2V0LAogICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCB4LCBpbnQgeSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU3RhcnRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25SZWdpb24oYm9vbGVhbiBzZXQpOwogICAgIHByaXZhdGUgbmF0aXZlIFJlY3QgICAgIG5hdGl2ZVN1YnRyYWN0TGF5ZXJzKFJlY3QgY29udGVudCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlVGV4dEdlbmVyYXRpb24oKTsKICAgICAvLyBOZXZlciBjYWxsIHRoaXMgdmVyc2lvbiBleGNlcHQgYnkgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKFN0cmluZykgLQpAQCAtNzkwNSw2ICs3NjcwLDEwIEBACiAgICAgICAgICAgICBpbnQgZ2VuZXJhdGlvbik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlV29yZFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogICAgIC8vIHJldHVybiBOT19MRUZURURHRSBtZWFucyBmYWlsdXJlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOwotICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UoaW50IHgsIGludCB5LCBmbG9hdCBzY2FsZSk7CisgICAgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOworICAgIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShpbnQgeCwgaW50IHksIGZsb2F0IHNjYWxlKTsKKworICAgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzY3JvbGxhYmxlIExheWVyQW5kcm9pZCBhdCB0aGUgZ2l2ZW4gcG9pbnQuCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlU2Nyb2xsYWJsZUxheWVyKGludCB4LCBpbnQgeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU2Nyb2xsTGF5ZXIoaW50IGxheWVyLCBpbnQgZHgsIGludCBkeSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGllbnQuamF2YQppbmRleCAwMmM3MjEwLi4xZjhlZWJhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q2xpZW50LmphdmEKQEAgLTg5LDYgKzg5LDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBubyBsb25nZXIgY2FsbGVkLiBXaGVuIHRoZSBXZWJWaWV3IGVuY291bnRlcnMKICAgICAgKiAgICAgICAgICAgICBhIHJlZGlyZWN0IGxvb3AsIGl0IHdpbGwgY2FuY2VsIHRoZSBsb2FkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgb25Ub29NYW55UmVkaXJlY3RzKFdlYlZpZXcgdmlldywgTWVzc2FnZSBjYW5jZWxNc2csCiAgICAgICAgICAgICBNZXNzYWdlIGNvbnRpbnVlTXNnKSB7CiAgICAgICAgIGNhbmNlbE1zZy5zZW5kVG9UYXJnZXQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKaW5kZXggYmY0ZDk1Yi4uN2MwODlkOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKQEAgLTE3LDMwICsxNywyNSBAQAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50RmxhZ3NEcmF3RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRmlsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuT3BlbmFibGVDb2x1bW5zOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTExNywxMyArMTEyLDE2IEBACiAgICAgcHJpdmF0ZSBpbnQgbVZpZXdwb3J0RGVuc2l0eURwaSA9IC0xOwogCiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkU2NhbGUgPSAwOwotICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFggPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFkgPSAwOwogCiAgICAgcHJpdmF0ZSBpbnQgbVdlYmtpdFNjcm9sbFggPSAwOwogICAgIHByaXZhdGUgaW50IG1XZWJraXRTY3JvbGxZID0gMDsKIAorICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgPSBuZXcgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyKHRoaXMpOworICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2U7CisKICAgICAvLyBUaGUgdGhyZWFkIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgV2ViQ29yZSB0aHJlYWQgYW5kIGZvciB1c2UgaW4KICAgICAvLyBkZWJ1Z2dpbmcgb3RoZXIgY2xhc3NlcyB0aGF0IHJlcXVpcmUgb3BlcmF0aW9uIHdpdGhpbiB0aGUgV2ViQ29yZSB0aHJlYWQuCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9OQU1FID0gIldlYlZpZXdDb3JlVGhyZWFkIjsKQEAgLTI1NSw2ICsyNTMsMTMgQEAKICAgICAgICAgcmV0dXJuIG1TZXR0aW5nczsKICAgICB9CiAKKyAgICAvKgorICAgICAqIEdpdmVuIG1pbWVUeXBlLCBjaGVjayB3aGV0aGVyIGl0J3Mgc3VwcG9ydGVkIGluIEFuZHJvaWQgbWVkaWEgZnJhbWV3b3JrLgorICAgICAqIG1pbWVUeXBlIGNvdWxkIGJlIHN1Y2ggYXMgImF1ZGlvL29nZyIgYW5kICJ2aWRlby9tcDQiLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gc3VwcG9ydHNNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhRmlsZS5nZXRGaWxlVHlwZUZvck1pbWVUeXBlKG1pbWVUeXBlKSA+IDA7CisgICAgfQogICAgIC8qKgogICAgICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSBjbGllbnQncyBjb25zb2xlLgogICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZApAQCAtMjc2LDM3ICsyODEsNDkgQEAKICAgICAgICAgbUNhbGxiYWNrUHJveHkub25Kc0FsZXJ0KHVybCwgbWVzc2FnZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4gIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBVSSB0aHJlYWQgdG8gaGlkZSB0aGUgc29mdCBrZXlib2FyZAorICAgICAqIGlmIHRoZSBub2RlIHBvaW50ZWQgdG8gYnkgbm9kZVBvaW50ZXIgaXMgc3RpbGwgaW4gZm9jdXMuCisgICAgICogQHBhcmFtIG5vZGVQb2ludGVyIFRoZSBub2RlIHdoaWNoIGp1c3QgYmx1cnJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZm9ybURpZEJsdXIoaW50IG5vZGVQb2ludGVyKSB7CisgICAgICAgIGlmIChtV2ViVmlldyA9PSBudWxsKSByZXR1cm47CisgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwgV2ViVmlldy5GT1JNX0RJRF9CTFVSLAorICAgICAgICAgICAgICAgIG5vZGVQb2ludGVyLCAwKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgSk5JLiAgT3BlbiBhIGZpbGUgY2hvb3NlciB0byB1cGxvYWQgYSBmaWxlLgotICAgICAqIEByZXR1cm4gU3RyaW5nIHZlcnNpb24gb2YgdGhlIFVSSSBwbHVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqIEZJWE1FOiBKdXN0IHJldHVybiB0aGUgVVJJIGhlcmUsIGFuZCBpbiBGaWxlU3lzdGVtOjpwYXRoR2V0RmlsZU5hbWUsIGNhbGwKLSAgICAgKiBpbnRvIEphdmEgdG8gZ2V0IHRoZSBmaWxlbmFtZS4KKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIGlucHV0IHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KKyAgICAgKiBAcmV0dXJuIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSBVUkkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlbkZpbGVDaG9vc2VyKCkgewotICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuICIiOwotICAgICAgICAvLyBGaW5kIG91dCB0aGUgbmFtZSwgYW5kIGFwcGVuZCBpdCB0byB0aGUgVVJJLgotICAgICAgICAvLyBXZWJraXQgd2lsbCB0cmVhdCB0aGUgbmFtZSBhcyB0aGUgZmlsZW5hbWUsIGFuZAotICAgICAgICAvLyB0aGUgVVJJIGFzIHRoZSBwYXRoLiAgVGhlIFVSSSB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gaW4gQnJvd3NlckZyYW1lIHRvIGdldCB0aGUgYWN0dWFsIGRhdGEuCi0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKLSAgICAgICAgICAgICAgICB1cmksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgT3BlbmFibGVDb2x1bW5zLkRJU1BMQVlfTkFNRSB9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJzb3IuZ2V0U3RyaW5nKDApOworICAgIHByaXZhdGUgU3RyaW5nIG9wZW5GaWxlQ2hvb3NlcihTdHJpbmcgYWNjZXB0VHlwZSkgeworICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKGFjY2VwdFR5cGUpOworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9ICIiOworICAgICAgICAgICAgLy8gTm90ZSAtIHF1ZXJ5aW5nIGZvciBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBCisgICAgICAgICAgICAvLyBzZWVtcyB0byB3b3JrIGZvciBhbGwgY29udGVudCBVUklzLCBub3QganVzdCBpbWFnZXMKKyAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gdXJpLmdldExhc3RQYXRoU2VnbWVudCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHVyaVN0cmluZyA9IHVyaS50b1N0cmluZygpOworICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnN0b3JlRmlsZVBhdGhGb3JDb250ZW50VXJpKGZpbGVQYXRoLCB1cmlTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuIHVyaVN0cmluZzsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCkgKyAiLyIgKyBuYW1lOworICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MjQsNiArNDQxLDEzIEBACiAgICAgICAgIHJldHVybiBtQ2FsbGJhY2tQcm94eS5vbkpzVGltZW91dCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgd2VidmlldyB0aGF0IHRoaXMgaXMgYW4gaW5zdGFsbGFibGUgd2ViIGFwcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnN0YWxsYWJsZVdlYkFwcCgpIHsKKyAgICAgICAgbUNhbGxiYWNrUHJveHkuc2V0SW5zdGFsbGFibGVXZWJBcHAoKTsKKyAgICB9CisKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBKTkkgbWV0aG9kcwogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDM1LDM2ICs0NTksMjEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsZWFyQ29udGVudCgpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZmxhdCBwaWN0dXJlIGZyb20gdGhlIHNldCBvZiBwaWN0dXJlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlDb250ZW50VG9QaWN0dXJlKFBpY3R1cmUgcGljdHVyZSk7Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvci4gUmV0dXJucyB0cnVlCi0gICAgICogaWYgc29tZSBpbmRpdmlkdWFsIHBpY3R1cmUgdG9vayB0b28gbG9uZyB0byBkcmF3IGFuZCBjYW4gYmUKLSAgICAgKiBzcGxpdCBpbnRvIHBhcnRzLiBDYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRHJhd0NvbnRlbnQoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yKTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIHRvIHNlZSBpZiBwaWN0dXJlIGlzIGJsYW5rIGFuZCBpbiBwcm9ncmVzcwotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlUGljdHVyZVJlYWR5KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDb250ZW50SW52YWxpZGF0ZUFsbCgpOwogCiAgICAgLyoqCiAgICAgICogUmVkcmF3IGEgcG9ydGlvbiBvZiB0aGUgcGljdHVyZSBzZXQuIFRoZSBQb2ludCB3aCByZXR1cm5zIHRoZQogICAgICAqIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIG92ZXJhbGwgcGljdHVyZS4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUZvY3VzQm91bmRzQ2hhbmdlZCgpOwogCiAgICAgLyoqCi0gICAgICogU3BsaXRzIHNsb3cgcGFydHMgb2YgdGhlIHBpY3R1cmUgc2V0LiBDYWxsZWQgZnJvbSB0aGUgd2Via2l0Ci0gICAgICogdGhyZWFkIGFmdGVyIG5hdGl2ZURyYXdDb250ZW50IHJldHVybnMgdHJ1ZS4KKyAgICAgKiBTcGxpdHMgc2xvdyBwYXJ0cyBvZiB0aGUgcGljdHVyZSBzZXQuIENhbGxlZCBmcm9tIHRoZSB3ZWJraXQgdGhyZWFkIGFmdGVyCisgICAgICogV2ViVmlldy5uYXRpdmVEcmF3KCkgcmV0dXJucyBjb250ZW50IHRvIGJlIHNwbGl0LgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU3BsaXRDb250ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTcGxpdENvbnRlbnQoaW50IGNvbnRlbnQpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVLZXkoaW50IGtleUNvZGUsIGludCB1bmljaGFyLAogICAgICAgICAgICAgaW50IHJlcGVhdENvdW50LCBib29sZWFuIGlzU2hpZnQsIGJvb2xlYW4gaXNBbHQsIGJvb2xlYW4gaXNTeW0sCkBAIC00ODAsMTIgKzQ4OSwxMiBAQAogICAgICAgICBvZiBsYXlvdXQvbGluZS1icmVha2luZy4gVGhlc2UgY29vcmRpbmF0ZXMgYXJlIGluIGRvY3VtZW50IHNwYWNlLAogICAgICAgICB3aGljaCBpcyB0aGUgc2FtZSBhcyBWaWV3IGNvb3JkcyB1bmxlc3Mgd2UgaGF2ZSB6b29tZWQgdGhlIGRvY3VtZW50CiAgICAgICAgIChzZWUgbmF0aXZlU2V0Wm9vbSkuCi0gICAgICAgIHNjcmVlbldpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcwotICAgICAgICBmaXhlZCBzaXplLCBzY3JlZW5XaWR0aCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2lkdGggd2l0aCB6b29taW5nLgorICAgICAgICB0ZXh0V3JhcFdpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcworICAgICAgICBmaXhlZCBzaXplLCB0ZXh0V3JhcFdpZHRoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB3aWR0aCB3aXRoIHpvb21pbmcuCiAgICAgICAgIHNob3VsZCB0aGlzIGJlIGNhbGxlZCBuYXRpdmVTZXRWaWV3UG9ydFNpemU/CiAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsCi0gICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHJlYWxTY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwgaW50IGFuY2hvclgsCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHRleHRXcmFwV2lkdGgsCisgICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0LCBpbnQgYW5jaG9yWCwKICAgICAgICAgICAgIGludCBhbmNob3JZLCBib29sZWFuIGlnbm9yZUhlaWdodCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpOwpAQCAtNTE1LDggKzUyNCw4IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVUb3VjaFVwKGludCB0b3VjaEdlbmVyYXRpb24sCiAgICAgICAgICAgICBpbnQgZnJhbWVQdHIsIGludCBub2RlUHRyLCBpbnQgeCwgaW50IHkpOwogCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVIYW5kbGVUb3VjaEV2ZW50KGludCBhY3Rpb24sIGludCB4LCBpbnQgeSwKLSAgICAgICAgICAgIGludCBtZXRhU3RhdGUpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlSGFuZGxlVG91Y2hFdmVudChpbnQgYWN0aW9uLCBpbnRbXSB4LCBpbnRbXSB5LAorICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgbWV0YVN0YXRlKTsKIAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlVXBkYXRlRnJhbWVDYWNoZSgpOwogCkBAIC01NzYsNyArNTg1LDE3IEBACiAgICAgLyoqCiAgICAgICogUHJvdmlkZSBXZWJDb3JlIHdpdGggdGhlIHByZXZpb3VzbHkgdmlzdGVkIGxpbmtzIGZyb20gdGhlIGhpc3RvcnkgZGF0YWJhc2UKICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICBuYXRpdmVQcm92aWRlVmlzaXRlZEhpc3RvcnkoU3RyaW5nW10gaGlzdG9yeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVQcm92aWRlVmlzaXRlZEhpc3RvcnkoU3RyaW5nW10gaGlzdG9yeSk7CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0aW9uIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKGludCBkaXJlY3Rpb24sIGludCBncmFudWxhcml0eSk7CiAKICAgICAvLyBFdmVudEh1YiBmb3IgcHJvY2Vzc2luZyBtZXNzYWdlcwogICAgIHByaXZhdGUgZmluYWwgRXZlbnRIdWIgbUV2ZW50SHViOwpAQCAtNjk3LDYgKzcxNiwxMiBAQAogICAgICAgICBpbnQgbVk7CiAgICAgfQogCisgICAgc3RhdGljIGNsYXNzIFRvdWNoSGlnaGxpZ2h0RGF0YSB7CisgICAgICAgIGludCBtWDsKKyAgICAgICAgaW50IG1ZOworICAgICAgICBpbnQgbVNsb3A7CisgICAgfQorCiAgICAgLy8gbUFjdGlvbiBvZiBUb3VjaEV2ZW50RGF0YSBjYW4gYmUgTW90aW9uRXZlbnQuZ2V0QWN0aW9uKCkgd2hpY2ggdXNlcyB0aGUKICAgICAvLyBsYXN0IHR3byBieXRlcyBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKICAgICBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9MT05HUFJFU1MgPSAweDEwMDsKQEAgLTcwNCwxMiArNzI5LDkgQEAKIAogICAgIHN0YXRpYyBjbGFzcyBUb3VjaEV2ZW50RGF0YSB7CiAgICAgICAgIGludCBtQWN0aW9uOwotICAgICAgICBpbnQgbVg7Ci0gICAgICAgIGludCBtWTsKKyAgICAgICAgUG9pbnRbXSBtUG9pbnRzOwogICAgICAgICBpbnQgbU1ldGFTdGF0ZTsKICAgICAgICAgYm9vbGVhbiBtUmVwcm9jZXNzOwotICAgICAgICBmbG9hdCBtVmlld1g7Ci0gICAgICAgIGZsb2F0IG1WaWV3WTsKICAgICB9CiAKICAgICBzdGF0aWMgY2xhc3MgR2VvbG9jYXRpb25QZXJtaXNzaW9uc0RhdGEgewpAQCAtNzE4LDkgKzc0MCw4IEBACiAgICAgICAgIGJvb2xlYW4gbVJlbWVtYmVyOwogICAgIH0KIAotCi0KICAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhhbmRsZXJEZWJ1Z1N0cmluZyA9IHsKKyAgICAgICAgICAgICJSRVZFQUxfU0VMRUNUSU9OIiwgLy8gOTYKICAgICAgICAgICAgICJSRVFVRVNUX0xBQkVMIiwgLy8gOTcKICAgICAgICAgICAgICJVUERBVEVfRlJBTUVfQ0FDSEVfSUZfTE9BRElORyIsIC8vID0gOTgKICAgICAgICAgICAgICJTQ1JPTExfVEVYVF9JTlBVVCIsIC8vID0gOTkKQEAgLTc3MSwxMCArNzkyLDEyIEBACiAgICAgICAgICAgICAiT05fUkVTVU1FIiwgICAgLy8gPSAxNDQKICAgICAgICAgICAgICJGUkVFX01FTU9SWSIsICAvLyA9IDE0NQogICAgICAgICAgICAgIlZBTElEX05PREVfQk9VTkRTIiwgLy8gPSAxNDYKKyAgICAgICAgICAgICJTQVZFX1dFQkFSQ0hJVkUiLCAvLyA9IDE0NwogICAgICAgICB9OwogCiAgICAgY2xhc3MgRXZlbnRIdWIgewogICAgICAgICAvLyBNZXNzYWdlIElkcworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFVkVBTF9TRUxFQ1RJT04gPSA5NjsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0xBQkVMID0gOTc7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0ZSQU1FX0NBQ0hFX0lGX0xPQURJTkcgPSA5ODsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfVEVYVF9JTlBVVCA9IDk5OwpAQCAtODM3LDYgKzg2MCw5IEBACiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgRlJFRV9NRU1PUlkgPSAxNDU7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURfTk9ERV9CT1VORFMgPSAxNDY7CiAKKyAgICAgICAgLy8gTG9hZCBhbmQgc2F2ZSB3ZWIgYXJjaGl2ZXMKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBTQVZFX1dFQkFSQ0hJVkUgPSAxNDc7CisKICAgICAgICAgLy8gTmV0d29yay1iYXNlZCBtZXNzYWdpbmcKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBDTEVBUl9TU0xfUFJFRl9UQUJMRSA9IDE1MDsKIApAQCAtODY1LDYgKzg5MSwxNiBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFERF9QQUNLQUdFX05BTUUgPSAxODU7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1BBQ0tBR0VfTkFNRSA9IDE4NjsKIAorICAgICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMgPSAxODc7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyA9IDE4ODsKKworICAgICAgICAvLyBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBNT0RJRllfU0VMRUNUSU9OID0gMTkwOworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OID0gMTkxOworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQVVUT0ZJTExfRk9STSA9IDE5MjsKKwogICAgICAgICAvLyBwcml2YXRlIG1lc3NhZ2UgaWRzCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVNUUk9ZID0gICAgIDIwMDsKIApAQCAtODg1LDYgKzkyMSw5IEBACiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEV2ZW50SHViKCkge30KIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUEFDS0FHRV9NU0dfSUQgPSBSRVZFQUxfU0VMRUNUSU9OOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUNLQUdFX01TR19JRCA9IFZBTElEX05PREVfQk9VTkRTOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUcmFuc2ZlciBhbGwgbWVzc2FnZXMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgd2ViY29yZSB0aHJlYWQgaGFuZGxlci4KICAgICAgICAgICovCkBAIC04OTYsMTEgKzkzNSwxMSBAQAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAobXNnLndoYXQgPCBSRVFVRVNUX0xBQkVMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1zZy53aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gVkFMSURfTk9ERV9CT1VORFMgPyBJbnRlZ2VyLnRvU3RyaW5nKG1zZy53aGF0KQorICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAobXNnLndoYXQgPCBGSVJTVF9QQUNLQUdFX01TR19JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtc2cud2hhdCA+IExBU1RfUEFDS0FHRV9NU0dfSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBJbnRlZ2VyLnRvU3RyaW5nKG1zZy53aGF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEhhbmRsZXJEZWJ1Z1N0cmluZ1ttc2cud2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUkVRVUVTVF9MQUJFTF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBGSVJTVF9QQUNLQUdFX01TR19JRF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcmcxPSIgKyBtc2cuYXJnMSArICIgYXJnMj0iICsgbXNnLmFyZzIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9iaj0iICsgbXNnLm9iaik7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTkyMSw2ICs5NjAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVWRUFMX1NFTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZXZlYWxTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0xBQkVMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub2RlUG9pbnRlciA9IG1zZy5hcmcyOwpAQCAtMTE1NCwxMiArMTE5NywxOSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX0VWRU5UOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gKFRvdWNoRXZlbnREYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHRlZC5tUG9pbnRzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSB4QXJyYXkgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSB5QXJyYXkgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGNvdW50OyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeEFycmF5W2NdID0gdGVkLm1Qb2ludHNbY10ueDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeUFycmF5W2NdID0gdGVkLm1Qb2ludHNbY10ueTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlBSRVZFTlRfVE9VQ0hfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUhhbmRsZVRvdWNoRXZlbnQodGVkLm1BY3Rpb24sIHRlZC5tWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZLCB0ZWQubU1ldGFTdGF0ZSkgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUhhbmRsZVRvdWNoRXZlbnQodGVkLm1BY3Rpb24sIHhBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeUFycmF5LCBjb3VudCwgdGVkLm1NZXRhU3RhdGUpID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA/IHRlZCA6IG51bGwpLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTIzOCw2ICsxMjg4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0U2VsZWN0aW9uKG1zZy5hcmcxLCBtc2cuYXJnMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ESUZZX1NFTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uU3RyaW5nID0gbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKG1zZy5hcmcxLCBtc2cuYXJnMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoV2ViVmlldy5TRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdHJpbmcpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1RCT1hfQ0hPSUNFUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hvaWNlcyA9IChTcGFyc2VCb29sZWFuQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cub2JqOwpAQCAtMTI3OCw2ICsxMzM0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0SnNGbGFncygoU3RyaW5nKW1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNBVkVfV0VCQVJDSElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNhdmVXZWJBcmNoaXZlTWVzc2FnZSBzYXZlTWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3LlNhdmVXZWJBcmNoaXZlTWVzc2FnZSltc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVNZXNzYWdlLm1SZXN1bHRGaWxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVdlYkFyY2hpdmUoc2F2ZU1lc3NhZ2UubUJhc2VuYW1lLCBzYXZlTWVzc2FnZS5tQXV0b25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRCwgc2F2ZU1lc3NhZ2UpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdFT0xPQ0FUSU9OX1BFUk1JU1NJT05TX1BST1ZJREU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VvbG9jYXRpb25QZXJtaXNzaW9uc0RhdGEgZGF0YSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR2VvbG9jYXRpb25QZXJtaXNzaW9uc0RhdGEpIG1zZy5vYmo7CkBAIC0xMjkxLDcgKzEzNTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNQTElUX1BJQ1RVUkVfU0VUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNwbGl0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNwbGl0Q29udGVudChtc2cuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlJFUExBQ0VfQkFTRV9DT05URU5ULCBtc2cuYXJnMSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTEzNTcsNiArMTQyNCwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb3dzZXJGcmFtZS5zSmF2YUJyaWRnZS5yZW1vdmVQYWNrYWdlTmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hIaWdobGlnaHREYXRhIGQgPSAoVG91Y2hIaWdobGlnaHREYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxSZWN0PiByZWN0cyA9IG5hdGl2ZUdldFRvdWNoSGlnaGxpZ2h0UmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkLm1YLCBkLm1ZLCBkLm1TbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgcmVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVU0VfTU9DS19ERVZJQ0VfT1JJRU5UQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUT0ZJTExfRk9STToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVBdXRvRmlsbEZvcm0obXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKQEAgLTE1NjIsNiArMTY1MiwxMyBAQAogICAgICAgICBtQnJvd3NlckZyYW1lLmxvYWRVcmwodXJsLCBleHRyYUhlYWRlcnMpOwogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSkgeworICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSB7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICIgQ09SRSBzYXZlV2ViQXJjaGl2ZSAiICsgZmlsZW5hbWUgKyAiICIgKyBhdXRvbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ccm93c2VyRnJhbWUuc2F2ZVdlYkFyY2hpdmUoZmlsZW5hbWUsIGF1dG9uYW1lKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQga2V5KEtleUV2ZW50IGV2dCwgYm9vbGVhbiBpc0Rvd24pIHsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiQ09SRSBrZXkgYXQgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIiwgIgpAQCAtMTU4MiwxMSArMTY3OSwxMiBAQAogICAgICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJrZXk6IGFycm93IHVudXNlZCBieSBwbHVnaW46ICIgKyBrZXlDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAia2V5OiBhcnJvdyB1bnVzZWQgYnkgcGFnZTogIiArIGtleUNvZGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiBldnQuaXNEb3duKCkpIHsKICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuTU9WRV9PVVRfT0ZfUExVR0lOLCBrZXlDb2RlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlVOSEFORExFRF9OQVZfS0VZLCBrZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0xNjE3LDcgKzE3MTUsNyBAQAogICAgICAgICBpZiAobVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CiAgICAgICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggPT0gLTEpIHsKICAgICAgICAgICAgICAgICBpZiAobVNldHRpbmdzLmdldExheW91dEFsZ29yaXRobSgpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTk9STUFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTk9STUFMIHx8IG1TZXR0aW5ncy5nZXRVc2VGaXhlZFZpZXdwb3J0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEg7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyoKQEAgLTE2MzcsNyArMTczNSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0V2lkdGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3LCBtVmlld3BvcnRXaWR0aCk7CisgICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5ncy5nZXRVc2VGaXhlZFZpZXdwb3J0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHdlYnNpdGUgc3BlY2lmaWVkIG9yIGRlc2lyZWQgZml4ZWQgdmlld3BvcnQgd2lkdGguCisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbVZpZXdwb3J0V2lkdGg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3LCBtVmlld3BvcnRXaWR0aCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB3aWR0aCA9IHRleHR3cmFwV2lkdGg7CiAgICAgICAgICAgICB9CkBAIC0xNjgyLDYgKzE3ODUsMTQgQEAKICAgICAgICAgcmV0dXJuIHVzZWRRdW90YTsKICAgICB9CiAKKyAgICAvLyBjYWxsZWQgZnJvbSBVSSB0aHJlYWQKKyAgICB2b2lkIHNwbGl0Q29udGVudChpbnQgY29udGVudCkgeworICAgICAgICBpZiAoIW1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCkgeworICAgICAgICAgICAgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKEV2ZW50SHViLlNQTElUX1BJQ1RVUkVfU0VULCBjb250ZW50LCAwKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFVzZWQgdG8gYXZvaWQgcG9zdGluZyBtb3JlIHRoYW4gb25lIGRyYXcgbWVzc2FnZS4KICAgICBwcml2YXRlIGJvb2xlYW4gbURyYXdJc1NjaGVkdWxlZDsKIApAQCAtMTY5MSwxMSArMTgwMiwxMSBAQAogICAgIC8vIFVzZWQgdG8gc3VzcGVuZCBkcmF3aW5nLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhd0lzUGF1c2VkOwogCi0gICAgLy8gbVJlc3RvcmVTdGF0ZSBpcyBzZXQgaW4gZGlkRmlyc3RMYXlvdXQoKSwgYW5kIHJlc2V0IGluIHRoZSBuZXh0Ci0gICAgLy8gd2Via2l0RHJhdyBhZnRlciBwYXNzaW5nIGl0IHRvIHRoZSBVSSB0aHJlYWQuCi0gICAgcHJpdmF0ZSBSZXN0b3JlU3RhdGUgbVJlc3RvcmVTdGF0ZSA9IG51bGw7CisgICAgLy8gbUluaXRpYWxWaWV3U3RhdGUgaXMgc2V0IGJ5IGRpZEZpcnN0TGF5b3V0KCkgYW5kIHRoZW4gcmVzZXQgaW4gdGhlCisgICAgLy8gbmV4dCB3ZWJraXREcmF3IGFmdGVyIHBhc3NpbmcgdGhlIHN0YXRlIHRvIHRoZSBVSSB0aHJlYWQuCisgICAgcHJpdmF0ZSBWaWV3U3RhdGUgbUluaXRpYWxWaWV3U3RhdGUgPSBudWxsOwogCi0gICAgc3RhdGljIGNsYXNzIFJlc3RvcmVTdGF0ZSB7CisgICAgc3RhdGljIGNsYXNzIFZpZXdTdGF0ZSB7CiAgICAgICAgIGZsb2F0IG1NaW5TY2FsZTsKICAgICAgICAgZmxvYXQgbU1heFNjYWxlOwogICAgICAgICBmbG9hdCBtVmlld1NjYWxlOwpAQCAtMTcwNCwxOSArMTgxNSwyMiBAQAogICAgICAgICBpbnQgbVNjcm9sbFg7CiAgICAgICAgIGludCBtU2Nyb2xsWTsKICAgICAgICAgYm9vbGVhbiBtTW9iaWxlU2l0ZTsKKyAgICAgICAgaW50IG1WaWV3cG9ydFdpZHRoOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBEcmF3RGF0YSB7CiAgICAgICAgIERyYXdEYXRhKCkgeworICAgICAgICAgICAgbUJhc2VMYXllciA9IDA7CiAgICAgICAgICAgICBtSW52YWxSZWdpb24gPSBuZXcgUmVnaW9uKCk7CiAgICAgICAgICAgICBtV2lkdGhIZWlnaHQgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgfQorICAgICAgICBpbnQgbUJhc2VMYXllcjsKICAgICAgICAgUmVnaW9uIG1JbnZhbFJlZ2lvbjsKICAgICAgICAgUG9pbnQgbVZpZXdQb2ludDsKICAgICAgICAgUG9pbnQgbVdpZHRoSGVpZ2h0OwogICAgICAgICBpbnQgbU1pblByZWZXaWR0aDsKLSAgICAgICAgUmVzdG9yZVN0YXRlIG1SZXN0b3JlU3RhdGU7IC8vIG9ubHkgbm9uLW51bGwgaWYgaXQgaXMgZm9yIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljdHVyZSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IGxheW91dAorICAgICAgICAvLyBvbmx5IG5vbi1udWxsIGlmIGl0IGlzIGZvciB0aGUgZmlyc3QgcGljdHVyZSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IGxheW91dAorICAgICAgICBWaWV3U3RhdGUgbVZpZXdTdGF0ZTsKICAgICAgICAgYm9vbGVhbiBtRm9jdXNTaXplQ2hhbmdlZDsKICAgICB9CiAKQEAgLTE3MjQsOCArMTgzOCw4IEBACiAgICAgICAgIG1EcmF3SXNTY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICAgRHJhd0RhdGEgZHJhdyA9IG5ldyBEcmF3RGF0YSgpOwogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSBMb2cudihMT0dUQUcsICJ3ZWJraXREcmF3IHN0YXJ0Iik7Ci0gICAgICAgIGlmIChuYXRpdmVSZWNvcmRDb250ZW50KGRyYXcubUludmFsUmVnaW9uLCBkcmF3Lm1XaWR0aEhlaWdodCkKLSAgICAgICAgICAgICAgICA9PSBmYWxzZSkgeworICAgICAgICBkcmF3Lm1CYXNlTGF5ZXIgPSBuYXRpdmVSZWNvcmRDb250ZW50KGRyYXcubUludmFsUmVnaW9uLCBkcmF3Lm1XaWR0aEhlaWdodCk7CisgICAgICAgIGlmIChkcmF3Lm1CYXNlTGF5ZXIgPT0gMCkgewogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgTG9nLnYoTE9HVEFHLCAid2Via2l0RHJhdyBhYm9ydCIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xNzQxLDkgKzE4NTUsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1WaWV3cG9ydFdpZHRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUdldENvbnRlbnRNaW5QcmVmV2lkdGgoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJlc3RvcmVTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJhdy5tUmVzdG9yZVN0YXRlID0gbVJlc3RvcmVTdGF0ZTsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZHJhdy5tVmlld1N0YXRlID0gbUluaXRpYWxWaWV3U3RhdGU7CisgICAgICAgICAgICAgICAgaWYgKG1WaWV3cG9ydFdpZHRoID09IC0xICYmIG1TZXR0aW5ncy5nZXRVc2VGaXhlZFZpZXdwb3J0KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaXhlZFZpZXdwb3J0TWFyZ2luID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uZml4ZWRfdmlld3BvcnRfbWFyZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHdlYnNpdGUncyBpbml0aWFsIHByZWZlcnJlZCB3aWR0aCBhcyB0aGUgZml4ZWQgdmlld3BvcnQgd2lkdGguCisgICAgICAgICAgICAgICAgICAgIG1WaWV3cG9ydFdpZHRoID0gTWF0aC5taW4obVNldHRpbmdzLmdldE1heEZpeGVkVmlld3BvcnRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tTWluUHJlZldpZHRoICsgMiAqIGZpeGVkVmlld3BvcnRNYXJnaW4pOworICAgICAgICAgICAgICAgICAgICBkcmF3Lm1WaWV3U3RhdGUubVZpZXdwb3J0V2lkdGggPSBtVmlld3BvcnRXaWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgTG9nLnYoTE9HVEFHLCAid2Via2l0RHJhdyBORVdfUElDVFVSRV9NU0dfSUQiKTsKICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKQEAgLTE3NTgsNTEgKzE4ODEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gVGhlc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQsIG5vdCBvdXIgdGhyZWFkCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IFpPT01fQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuU1VCUElYRUxfVEVYVF9GTEFHOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHOwotCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtWm9vbUZpbHRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihaT09NX0JJVFMsIFBhaW50LkxJTkVBUl9URVhUX0ZMQUcpOwotICAgIC8vIElmIHdlIG5lZWQgdG8gdHJhZGUgYmV0dGVyIHF1YWxpdHkgZm9yIHNwZWVkLCBzZXQgbVNjcm9sbEZpbHRlciB0byBudWxsCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtU2Nyb2xsRmlsdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoU0NST0xMX0JJVFMsIDApOwotCi0gICAgLyogcGFja2FnZSAqLyB2b2lkIGRyYXdDb250ZW50UGljdHVyZShDYW52YXMgY2FudmFzLCBpbnQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1pvb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1Njcm9sbCkgewotICAgICAgICBEcmF3RmlsdGVyIGRmID0gbnVsbDsKLSAgICAgICAgaWYgKGFuaW1hdGluZ1pvb20pIHsKLSAgICAgICAgICAgIGRmID0gbVpvb21GaWx0ZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nU2Nyb2xsKSB7Ci0gICAgICAgICAgICBkZiA9IG1TY3JvbGxGaWx0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIoZGYpOwotICAgICAgICBib29sZWFuIHRvb2tUb29Mb25nID0gbmF0aXZlRHJhd0NvbnRlbnQoY2FudmFzLCBjb2xvcik7Ci0gICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOwotICAgICAgICBpZiAodG9va1Rvb0xvbmcgJiYgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPSB0cnVlOwotICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwaWN0dXJlUmVhZHkoKSB7Ci0gICAgICAgIHJldHVybiAwICE9IG1OYXRpdmVDbGFzcyA/IG5hdGl2ZVBpY3R1cmVSZWFkeSgpIDogZmFsc2U7Ci0gICAgfQotCi0gICAgLypwYWNrYWdlKi8gc3luY2hyb25pemVkIFBpY3R1cmUgY29weUNvbnRlbnRQaWN0dXJlKCkgewotICAgICAgICBQaWN0dXJlIHJlc3VsdCA9IG5ldyBQaWN0dXJlKCk7Ci0gICAgICAgIGlmICgwICE9IG1OYXRpdmVDbGFzcykgewotICAgICAgICAgICAgbmF0aXZlQ29weUNvbnRlbnRUb1BpY3R1cmUocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHN0YXRpYyB2b2lkIHJlZHVjZVByaW9yaXR5KCkgewogICAgICAgICAvLyByZW1vdmUgdGhlIHBlbmRpbmcgUkVEVUNFX1BSSU9SSVRZIGFuZCBSRVNVTUVfUFJJT1JJVFkgbWVzc2FnZXMKICAgICAgICAgc1dlYkNvcmVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFdlYkNvcmVUaHJlYWQuUkVEVUNFX1BSSU9SSVRZKTsKQEAgLTE4MjQsNiArMTkwMiw4IEBACiAgICAgICAgIC8vIGNhbGxlZCBmcm9tIFVJIHRocmVhZCB3aGlsZSBXRUJLSVRfRFJBVyBpcyBqdXN0IHB1bGxlZCBvdXQgb2YgdGhlCiAgICAgICAgIC8vIHF1ZXVlIGluIFdlYkNvcmUgdGhyZWFkIHRvIGJlIGV4ZWN1dGVkLiBUaGVuIHVwZGF0ZSB3b24ndCBiZSBibG9ja2VkLgogICAgICAgICBpZiAoY29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWNvcmUuZ2V0U2V0dGluZ3MoKS5lbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkpIHJldHVybjsKKwogICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3JlKSB7CiAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzUGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZiAoY29yZS5tRHJhd0lzU2NoZWR1bGVkKSB7CkBAIC0xODM2LDEyICsxOTE2LDE2IEBACiAKICAgICBzdGF0aWMgdm9pZCByZXN1bWVVcGRhdGVQaWN0dXJlKFdlYlZpZXdDb3JlIGNvcmUpIHsKICAgICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaWYgbURyYXdJc1BhdXNlZCBpcyB0cnVlLCBpZ25vcmUgdGhlIHNldHRpbmcsIGNvbnRpbnVlIHRvIHJlc3VtZQorICAgICAgICAgICAgaWYgKCFjb3JlLm1EcmF3SXNQYXVzZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvcmUuZ2V0U2V0dGluZ3MoKS5lbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkpIHJldHVybjsKKwogICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3JlKSB7CiAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzUGF1c2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcmUubURyYXdJc1NjaGVkdWxlZCkgewotICAgICAgICAgICAgICAgICAgICBjb3JlLm1EcmF3SXNTY2hlZHVsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgY29yZS5jb250ZW50RHJhdygpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhbHdheXMgcmVkcmF3IG9uIHJlc3VtZSB0byByZWVuYWJsZSBnaWYgYW5pbWF0aW9ucworICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1NjaGVkdWxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvcmUubmF0aXZlQ29udGVudEludmFsaWRhdGVBbGwoKTsKKyAgICAgICAgICAgICAgICBjb3JlLmNvbnRlbnREcmF3KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTc4LDI0ICsyMDYyLDYgQEAKICAgICAgICAgbVJlcGFpbnRTY2hlZHVsZWQgPSBmYWxzZTsKICAgICB9CiAKLSAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRJbW1lZGlhdGVSZXBhaW50KCkgewotICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiAhbVJlcGFpbnRTY2hlZHVsZWQpIHsKLSAgICAgICAgICAgIG1SZXBhaW50U2NoZWR1bGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgc2V0Um9vdExheWVyKGludCBsYXllcikgewotICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TRVRfUk9PVF9MQVlFUl9NU0dfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKiBwYWNrYWdlICovIFdlYlZpZXcgZ2V0V2ViVmlldygpIHsKICAgICAgICAgcmV0dXJuIG1XZWJWaWV3OwogICAgIH0KQEAgLTIwMTIsMTggKzIwNzgsMjQgQEAKIAogICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgcmV0dXJuOwogCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlUmVzdG9yZVN0YXRlID0gc3RhbmRhcmRMb2FkIHx8IG1SZXN0b3JlZFNjYWxlID4gMDsKLSAgICAgICAgc2V0dXBWaWV3cG9ydCh1cGRhdGVSZXN0b3JlU3RhdGUpOworICAgICAgICBib29sZWFuIHVwZGF0ZVZpZXdTdGF0ZSA9IHN0YW5kYXJkTG9hZCB8fCBtUmVzdG9yZWRTY2FsZSA+IDA7CisgICAgICAgIHNldHVwVmlld3BvcnQodXBkYXRlVmlld1N0YXRlKTsKICAgICAgICAgLy8gaWYgdXBkYXRlUmVzdG9yZVN0YXRlIGlzIHRydWUsIFZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpIHdpbGwKLSAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHJlc3RvcmUgdGhlIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKKyAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHVwZGF0ZXMgaXRzIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKICAgICAgICAgLy8gaXMgZmFsc2UsIHN0YXJ0IHRvIGRyYXcgbm93IGFzIGl0IGlzIHJlYWR5LgotICAgICAgICBpZiAoIXVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgICAgICBpZiAoIXVwZGF0ZVZpZXdTdGF0ZSkgewogICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSB0b3VjaCBoaWdobGlnaHQgd2hlbiBtb3ZpbmcgdG8gYSBuZXcgcGFnZQorICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIG1FdmVudEh1Yi5zZW5kTWVzc2FnZShNZXNzYWdlLm9idGFpbihudWxsLAorICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5SRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKSk7CisgICAgICAgIH0KKwogICAgICAgICAvLyByZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB0aGUgcmVzdG9yZWQgb2Zmc2V0IGFuZCBzY2FsZXMKICAgICAgICAgbVdlYmtpdFNjcm9sbFggPSBtV2Via2l0U2Nyb2xsWSA9IG1SZXN0b3JlZFggPSBtUmVzdG9yZWRZCi0gICAgICAgICAgICAgICAgPSBtUmVzdG9yZWRTY2FsZSA9IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgICAgICAgICAgICAgID0gbVJlc3RvcmVkU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID0gMDsKICAgICB9CiAKICAgICAvLyBjYWxsZWQgYnkgSk5JCkBAIC0yMDM3LDE1ICsyMTA5LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0dXBWaWV3cG9ydChib29sZWFuIHVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZXR1cFZpZXdwb3J0KGJvb2xlYW4gdXBkYXRlVmlld1N0YXRlKSB7CiAgICAgICAgIC8vIHNldCB0aGUgdmlld3BvcnQgc2V0dGluZ3MgZnJvbSBXZWJLaXQKICAgICAgICAgc2V0Vmlld3BvcnRTZXR0aW5nc0Zyb21OYXRpdmUoKTsKIAogICAgICAgICAvLyBhZGp1c3QgdGhlIGRlZmF1bHQgc2NhbGUgdG8gbWF0Y2ggdGhlIGRlbnNpdHlEcGkKICAgICAgICAgZmxvYXQgYWRqdXN0ID0gMS4wZjsKICAgICAgICAgaWYgKG1WaWV3cG9ydERlbnNpdHlEcGkgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAhPSAxMDApIHsKLSAgICAgICAgICAgICAgICBhZGp1c3QgPSBXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAvIDEwMC4wZjsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZGVmYXVsdCB6b29tIHNjYWxlIHRvIGEgaW50ZWdlciAocGVyY2VudGFnZSkgdG8gYXZvaWQgYW55CisgICAgICAgICAgICAvLyBpc3N1ZXMgd2l0aCBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucworICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgKGludCkobVdlYlZpZXcuZ2V0RGVmYXVsdFpvb21TY2FsZSgpICogMTAwKSAhPSAxMDApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3QgPSBtV2ViVmlldy5nZXREZWZhdWx0Wm9vbVNjYWxlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0RGVuc2l0eURwaSA+IDApIHsKICAgICAgICAgICAgIGFkanVzdCA9IChmbG9hdCkgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpCkBAIC0yMDg3LDE3ICsyMTYxLDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBpZiBtVmlld3BvcnRXaWR0aCBpcyAwLCBpdCBtZWFucyBkZXZpY2Utd2lkdGgsIGFsd2F5cyB1cGRhdGUuCi0gICAgICAgIGlmIChtVmlld3BvcnRXaWR0aCAhPSAwICYmICF1cGRhdGVSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgIFJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBuZXcgUmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1pblNjYWxlID0gbVZpZXdwb3J0TWluaW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggIT0gMCAmJiAhdXBkYXRlVmlld1N0YXRlKSB7CisgICAgICAgICAgICBWaWV3U3RhdGUgdmlld1N0YXRlID0gbmV3IFZpZXdTdGF0ZSgpOworICAgICAgICAgICAgdmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtVmlld3BvcnRNYXhpbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgICB2aWV3U3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKICAgICAgICAgICAgIC8vIGFzIG1WaWV3cG9ydFdpZHRoIGlzIG5vdCAwLCBpdCBpcyBub3QgbW9iaWxlIHNpdGUuCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTW9iaWxlU2l0ZSA9IGZhbHNlOwogICAgICAgICAgICAgLy8gZm9yIG5vbi1tb2JpbGUgc2l0ZSwgd2UgZG9uJ3QgbmVlZCBtaW5QcmVmV2lkdGgsIHNldCBpdCBhcyAwCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFggPSAwOworICAgICAgICAgICAgdmlld1N0YXRlLm1TY3JvbGxYID0gMDsKICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgcmVzdG9yZVN0YXRlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgdmlld1N0YXRlKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yMTE4LDMyICsyMTkyLDMyIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB3ZWJWaWV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdwb3J0V2lkdGggKiBtQ3VycmVudFZpZXdTY2FsZSk7CiAgICAgICAgIH0KLSAgICAgICAgbVJlc3RvcmVTdGF0ZSA9IG5ldyBSZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1EZWZhdWx0U2NhbGUgPSBhZGp1c3Q7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubVNjcm9sbFggPSBtUmVzdG9yZWRYOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSA9ICgwID09IG1WaWV3cG9ydFdpZHRoKTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKCk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tU2Nyb2xsWCA9IG1SZXN0b3JlZFg7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1vYmlsZVNpdGUgPSAoMCA9PSBtVmlld3BvcnRXaWR0aCk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3cG9ydFdpZHRoID0gbVZpZXdwb3J0V2lkdGg7CiAgICAgICAgIGlmIChtUmVzdG9yZWRTY2FsZSA+IDApIHsKLSAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlIC8gMTAwLjBmOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlOworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0gbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtVmlld3BvcnRJbml0aWFsU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3cG9ydEluaXRpYWxTY2FsZSAvIDEwMC4wZjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0V2lkdGggPiAwICYmIG1WaWV3cG9ydFdpZHRoIDwgd2ViVmlld1dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgd2ViVmlld1dpZHRoIC8gbVZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CiAgICAgICAgICAgICAgICAgLy8gMCB3aWxsIHRyaWdnZXIgV2ViVmlldyB0byB0dXJuIG9uIHpvb20gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IDA7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjE4NCwxNSArMjI1OCwxNSBAQAogICAgICAgICAgICAgICAgIC8vIG1WaWV3U2NhbGUgYXMgMCBtZWFucyBpdCBpcyBpbiB6b29tIG92ZXJ2aWV3IG1vZGUuIFNvIHdlIGRvbid0CiAgICAgICAgICAgICAgICAgLy8ga25vdyB0aGUgZXhhY3Qgc2NhbGUuIElmIG1SZXN0b3JlZFNjYWxlIGlzIG5vbi16ZXJvLCB1c2UgaXQ7CiAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIG1UZXh0V3JhcFNjYWxlIGFzIHRoZSBpbml0aWFsIHNjYWxlLgotICAgICAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID09IDAKKyAgICAgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPT0gMAogICAgICAgICAgICAgICAgICAgICAgICAgPyAobVJlc3RvcmVkU2NhbGUgPiAwID8gbVJlc3RvcmVkU2NhbGUgLyAxMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGU7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJzZXR1cFZpZXdwb3J0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVJlc3RvcmVkU2NhbGU9IiArIG1SZXN0b3JlZFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UZXh0V3JhcFNjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVGV4dFdyYXBTY2FsZT0iICsgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGF0YS5tV2lkdGggPSBNYXRoLnJvdW5kKHdlYlZpZXdXaWR0aCAvIGRhdGEubVNjYWxlKTsKQEAgLTIyMDUsNyArMjI3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldFZpZXdIZWlnaHQoKSAvIGRhdGEubVNjYWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ3VycmVudFZpZXdIZWlnaHQgKiBkYXRhLm1XaWR0aCAvIHZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQod2ViVmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAvIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLyBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSk7CiAgICAgICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IGRhdGEubUFuY2hvclkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmQgVklFV19TSVpFX0NIQU5HRUQgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBzbyB0aGF0IHdlCkBAIC0yMjE4LDIwICsyMjkyLDEyIEBACiAgICAgfQogCiAgICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NhbGUoaW50IHNjYWxlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY2FsZShpbnQgc2NhbGUsIGludCB0ZXh0V3JhcFNjYWxlKSB7CiAgICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtUmVzdG9yZWRTY2FsZSA9IHNjYWxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NyZWVuV2lkdGhTY2FsZShpbnQgc2NhbGUpIHsKLSAgICAgICAgaWYgKCFtU2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID0gc2NhbGU7CisgICAgICAgICAgICBpZiAobVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CisgICAgICAgICAgICAgICAgbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA9IHRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIyODEsNiArMjM0Nyw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVVcGRhdGVGcmFtZUNhY2hlSWZMb2FkaW5nKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVSZXZlYWxTZWxlY3Rpb24oKTsKICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlUmVxdWVzdExhYmVsKGludCBmcmFtZVB0ciwgaW50IG5vZGVQdHIpOwogICAgIC8qKgogICAgICAqIFNjcm9sbCB0aGUgZm9jdXNlZCB0ZXh0ZmllbGQgdG8gKHhQZXJjZW50LCB5KSBpbiBkb2N1bWVudCBzcGFjZQpAQCAtMjMyOSw2ICsyMzk2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgc2V0V2ViVGV4dFZpZXdBdXRvRmlsbGFibGUoaW50IHF1ZXJ5SWQpIHsKKyAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwgV2ViVmlldy5TRVRfQVVUT0ZJTExBQkxFLCBxdWVyeUlkLAorICAgICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8wKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIGNhbGxlZCBieSBKTkkKICAgICBwcml2YXRlIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKICAgICAgICAgcmV0dXJuIG1Db250ZXh0OwpAQCAtMjQ2OSw2ICsyNTQzLDI0IEBACiAgICAgICAgICAgICAgICAgaE1vZGUsIHZNb2RlKS5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCkgeworICAgICAgICBtRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLnVzZU1vY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuc2V0TW9ja09yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKworICAgIHByb3RlY3RlZCBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgZ2V0RGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlKCkgeworICAgICAgICBpZiAobURldmljZU9yaWVudGF0aW9uU2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZU9yaWVudGF0aW9uU2VydmljZShtRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLCBtQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2U7CisgICAgfQorCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVQYXVzZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUmVzdW1lKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGcmVlTWVtb3J5KCk7CkBAIC0yNDc2LDQgKzI1NjgsOCBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlVmFsaWROb2RlQW5kQm91bmRzKGludCBmcmFtZSwgaW50IG5vZGUsCiAgICAgICAgICAgICBSZWN0IGJvdW5kcyk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBBcnJheUxpc3Q8UmVjdD4gbmF0aXZlR2V0VG91Y2hIaWdobGlnaHRSZWN0cyhpbnQgeCwgaW50IHksCisgICAgICAgICAgICBpbnQgc2xvcCk7CisKKyAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQXV0b0ZpbGxGb3JtKGludCBxdWVyeUlkKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YQppbmRleCA3YWNkOWJhLi44Zjg5Njc4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhCkBAIC02Nyw2ICs2Nyw5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUZvcm1Mb2NrID0gbmV3IE9iamVjdCgpOwogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1IdHRwQXV0aExvY2sgPSBuZXcgT2JqZWN0KCk7CiAKKyAgICAvLyBUT0RPOiBUaGUgQ2hyb21pdW0gSFRUUCBzdGFjayBoYW5kbGVzIGNvb2tpZXMgaW5kZXBlbmRlbnRseS4KKyAgICAvLyBXZSBzaG91bGQgY29uc2lkZXIgcmVtb3ZpbmcgdGhlIGNvb2tpZXMgdGFibGUgaWYgYW5kIHdoZW4gd2Ugc3dpdGNoIHRvCisgICAgLy8gdGhlIENocm9taXVtIEhUVFAgc3RhY2sgZm9yIGdvb2QuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1UYWJsZU5hbWVzW10gPSB7CiAgICAgICAgICJjb29raWVzIiwgInBhc3N3b3JkIiwgImZvcm11cmwiLCAiZm9ybWRhdGEiLCAiaHR0cGF1dGgiCiAgICAgfTsKQEAgLTE3MywxMTIgKzE3NiwxNDAgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGludCBtQ2FjaGVUcmFuc2FjdGlvblJlZmNvdW50OwogCi0gICAgcHJpdmF0ZSBXZWJWaWV3RGF0YWJhc2UoKSB7CisgICAgLy8gSW5pdGlhbGx5IHRydWUgdW50aWwgdGhlIGJhY2tncm91bmQgdGhyZWFkIGNvbXBsZXRlcy4KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFdlYlZpZXdEYXRhYmFzZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGluaXQoY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0uc3RhcnQoKTsKKwogICAgICAgICAvLyBTaW5nbGV0b24gb25seSwgdXNlIGdldEluc3RhbmNlKCkKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBXZWJWaWV3RGF0YWJhc2UgZ2V0SW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIGlmIChtSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFdlYlZpZXdEYXRhYmFzZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBXZWJWaWV3RGF0YWJhc2UoY29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICB9CiAKLSAgICAgICAgICAgIC8vIG1EYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwsIAotICAgICAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiIAotICAgICAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsICYmIG1EYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gREFUQUJBU0VfVkVSU0lPTikgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdXBncmFkZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHBlciB0YWJsZSBNdXRleCBsb2NrLCB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrLCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gaW1wcm92ZXMgcGVyZm9ybWFuY2UgYXMgZGF0YWJhc2UncyBSZWVudHJhbnRMb2NrIGlzIGV4cGFuc2l2ZQotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoQ0FDSEVfREFUQUJBU0VfRklMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbUNhY2hlRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLCAKLSAgICAgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYiAKLSAgICAgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIG1DYWNoZURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBDQUNIRV9EQVRBQkFTRV9WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZ3JhZGVDYWNoZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcENhY2hlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRXJhc2UgdGhlIGZpbGVzIGZyb20gdGhlIGZpbGUgc3lzdGVtIGluIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBjYXNlIHRoYXQgdGhlIGRhdGFiYXNlIHdhcyB1cGRhdGVkIGFuZCB0aGUgCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUgd2VyZSBleGlzdGluZyBjYWNoZSBjb250ZW50Ci0gICAgICAgICAgICAgICAgQ2FjaGVNYW5hZ2VyLnJlbW92ZUFsbENhY2hlRmlsZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgcmVhZF91bmNvbW1pdHRlZCB0byBzcGVlZCB1cCBSRUFECi0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuZXhlY1NRTCgiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlOyIpOwotICAgICAgICAgICAgICAgIC8vIGFzIG9ubHkgUkVBRCBjYW4gYmUgY2FsbGVkIGluIHRoZSBub24tV2ViVmlld1dvcmtlclRocmVhZCwKLSAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZF91bmNvbW1pdHRlZCBpcyB1c2VkLCB3ZSBjYW4gdHVybiBvZmYgZGF0YWJhc2UgbG9jawotICAgICAgICAgICAgICAgIC8vIHRvIHVzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB1c2UgSW5zZXJ0SGVscGVyIGZvciBmYXN0ZXIgaW5zZXJ0aW9uCi0gICAgICAgICAgICAgICAgbUNhY2hlSW5zZXJ0ZXIgPSBuZXcgRGF0YWJhc2VVdGlscy5JbnNlcnRIZWxwZXIobUNhY2hlRGF0YWJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGUiKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVVcmxDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfVVJMX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRmlsZVBhdGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRklMRV9QQVRIX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlTGFzdE1vZGlmeUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MQVNUX01PRElGWV9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUVUYWdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVRBR19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUV4cGlyZXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUV4cGlyZXNTdHJpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19TVFJJTkdfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVNaW1lVHlwZUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9NSU1FVFlQRV9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUVuY29kaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VOQ09ESU5HX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlSHR0cFN0YXR1c0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9IVFRQX1NUQVRVU19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUxvY2F0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xPQ0FUSU9OX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlQ29udGVudExlbmd0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5UTEVOR1RIX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlQ29udGVudERpc3Bvc2l0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRESVNQT1NJVElPTl9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNyb3NzRG9tYWluQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NST1NTRE9NQUlOX0NPTCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGRlbGV0aW5nIHRoZSBvbGQgZGIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICAvLyBtRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLAorICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIKKyAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBEQVRBQkFTRV9WRVJTSU9OKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cGdyYWRlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHBlciB0YWJsZSBNdXRleCBsb2NrLCB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrLCB0aGlzCisgICAgICAgIC8vIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFzIGRhdGFiYXNlJ3MgUmVlbnRyYW50TG9jayBpcworICAgICAgICAvLyBleHBhbnNpdmUKKyAgICAgICAgbURhdGFiYXNlLnNldExvY2tpbmdFbmFibGVkKGZhbHNlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAorICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShDQUNIRV9EQVRBQkFTRV9GSUxFKSkgeworICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbUNhY2hlRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLAorICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIKKyAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gQ0FDSEVfREFUQUJBU0VfVkVSU0lPTikgeworICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cGdyYWRlQ2FjaGVEYXRhYmFzZSgpOworICAgICAgICAgICAgICAgIGJvb3RzdHJhcENhY2hlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVyYXNlIHRoZSBmaWxlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbSBpbiB0aGUKKyAgICAgICAgICAgIC8vIGNhc2UgdGhhdCB0aGUgZGF0YWJhc2Ugd2FzIHVwZGF0ZWQgYW5kIHRoZQorICAgICAgICAgICAgLy8gdGhlcmUgd2VyZSBleGlzdGluZyBjYWNoZSBjb250ZW50CisgICAgICAgICAgICBDYWNoZU1hbmFnZXIucmVtb3ZlQWxsQ2FjaGVGaWxlcygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHJlYWRfdW5jb21taXR0ZWQgdG8gc3BlZWQgdXAgUkVBRAorICAgICAgICBtQ2FjaGVEYXRhYmFzZS5leGVjU1FMKCJQUkFHTUEgcmVhZF91bmNvbW1pdHRlZCA9IHRydWU7Iik7CisgICAgICAgIC8vIGFzIG9ubHkgUkVBRCBjYW4gYmUgY2FsbGVkIGluIHRoZQorICAgICAgICAvLyBub24tV2ViVmlld1dvcmtlclRocmVhZCwgYW5kIHJlYWRfdW5jb21taXR0ZWQgaXMgdXNlZCwKKyAgICAgICAgLy8gd2UgY2FuIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2sgdG8gdXNlIHRyYW5zYWN0aW9uLgorICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgLy8gdXNlIEluc2VydEhlbHBlciBmb3IgZmFzdGVyIGluc2VydGlvbgorICAgICAgICBtQ2FjaGVJbnNlcnRlciA9CisgICAgICAgICAgICAgICAgbmV3IERhdGFiYXNlVXRpbHMuSW5zZXJ0SGVscGVyKG1DYWNoZURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIik7CisgICAgICAgIG1DYWNoZVVybENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfVVJMX0NPTCk7CisgICAgICAgIG1DYWNoZUZpbGVQYXRoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9GSUxFX1BBVEhfQ09MKTsKKyAgICAgICAgbUNhY2hlTGFzdE1vZGlmeUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTEFTVF9NT0RJRllfQ09MKTsKKyAgICAgICAgbUNhY2hlRVRhZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVRBR19DT0wpOworICAgICAgICBtQ2FjaGVFeHBpcmVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX0NPTCk7CisgICAgICAgIG1DYWNoZUV4cGlyZXNTdHJpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfU1RSSU5HX0NPTCk7CisgICAgICAgIG1DYWNoZU1pbWVUeXBlQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9NSU1FVFlQRV9DT0wpOworICAgICAgICBtQ2FjaGVFbmNvZGluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRU5DT0RJTkdfQ09MKTsKKyAgICAgICAgbUNhY2hlSHR0cFN0YXR1c0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfSFRUUF9TVEFUVVNfQ09MKTsKKyAgICAgICAgbUNhY2hlTG9jYXRpb25Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xPQ0FUSU9OX0NPTCk7CisgICAgICAgIG1DYWNoZUNvbnRlbnRMZW5ndGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRMRU5HVEhfQ09MKTsKKyAgICAgICAgbUNhY2hlQ29udGVudERpc3Bvc2l0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5URElTUE9TSVRJT05fQ09MKTsKKyAgICAgICAgbUNhY2hlQ3Jvc3NEb21haW5Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NST1NTRE9NQUlOX0NPTCk7CisKKyAgICAgICAgLy8gVGhyZWFkIGRvbmUsIG5vdGlmeS4KKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGdyYWRlRGF0YWJhc2UoKSB7CkBAIC0zOTEsOCArNDIyLDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBXYWl0IGZvciB0aGUgYmFja2dyb3VuZCBpbml0aWFsaXphdGlvbiB0aHJlYWQgdG8gY29tcGxldGUgYW5kIGNoZWNrIHRoZQorICAgIC8vIGRhdGFiYXNlIGNyZWF0aW9uIHN0YXR1cy4KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tJbml0aWFsaXplZCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICB3aGlsZSAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkNhdWdodCBleGNlcHRpb24gd2hpbGUgY2hlY2tpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRpYWxpemF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcoZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURhdGFiYXNlICE9IG51bGw7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIGhhc0VudHJpZXMoaW50IHRhYmxlSWQpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtNDIyLDcgKzQ3MCw3IEBACiAgICAgICovCiAgICAgQXJyYXlMaXN0PENvb2tpZT4gZ2V0Q29va2llc0ZvckRvbWFpbihTdHJpbmcgZG9tYWluKSB7CiAgICAgICAgIEFycmF5TGlzdDxDb29raWU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENvb2tpZT4oKTsKLSAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbGlzdDsKICAgICAgICAgfQogCkBAIC00ODEsNyArNTI5LDcgQEAKICAgICAgKiAgICAgICAgICAgIGRlbGV0ZWQuCiAgICAgICovCiAgICAgdm9pZCBkZWxldGVDb29raWVzKFN0cmluZyBkb21haW4sIFN0cmluZyBwYXRoLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01MDEsNyArNTQ5LDcgQEAKICAgICAgKi8KICAgICB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CiAgICAgICAgIGlmIChjb29raWUuZG9tYWluID09IG51bGwgfHwgY29va2llLnBhdGggPT0gbnVsbCB8fCBjb29raWUubmFtZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTM0LDcgKzU4Miw3IEBACiAgICAgICogQ2xlYXIgY29va2llIGRhdGFiYXNlCiAgICAgICovCiAgICAgdm9pZCBjbGVhckNvb2tpZXMoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTU0Nyw3ICs1OTUsNyBAQAogICAgICAqIENsZWFyIHNlc3Npb24gY29va2llcywgd2hpY2ggbWVhbnMgY29va2llIGRvZXNuJ3QgaGF2ZSBFWFBJUkVTLgogICAgICAqLwogICAgIHZvaWQgY2xlYXJTZXNzaW9uQ29va2llcygpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTY0LDcgKzYxMiw3IEBACiAgICAgICogQHBhcmFtIG5vdyBUaW1lIGZvciBub3cKICAgICAgKi8KICAgICB2b2lkIGNsZWFyRXhwaXJlZENvb2tpZXMobG9uZyBub3cpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjIwLDcgKzY2OCw3IEBACiAgICAgICogQHJldHVybiBDYWNoZVJlc3VsdCBUaGUgQ2FjaGVNYW5hZ2VyLkNhY2hlUmVzdWx0CiAgICAgICovCiAgICAgQ2FjaGVSZXN1bHQgZ2V0Q2FjaGUoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtNjYwLDcgKzcwOCw3IEBACiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsCiAgICAgICovCiAgICAgdm9pZCByZW1vdmVDYWNoZShTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjc0LDcgKzcyMiw3IEBACiAgICAgICogQHBhcmFtIGMgVGhlIENhY2hlTWFuYWdlci5DYWNoZVJlc3VsdAogICAgICAqLwogICAgIHZvaWQgYWRkQ2FjaGUoU3RyaW5nIHVybCwgQ2FjaGVSZXN1bHQgYykgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTcwMCw3ICs3NDgsNyBAQAogICAgICAqIENsZWFyIGNhY2hlIGRhdGFiYXNlCiAgICAgICovCiAgICAgdm9pZCBjbGVhckNhY2hlKCkgewotICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTcwOCw3ICs3NTYsNyBAQAogICAgIH0KIAogICAgIGJvb2xlYW4gaGFzQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtODM0LDcgKzg4Miw3IEBACiAgICAgICovCiAgICAgdm9pZCBzZXRVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBzY2hlbWVQbHVzSG9zdCwgU3RyaW5nIHVzZXJuYW1lLAogICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtODU2LDcgKzkwNCw3IEBACiAgICAgICogICAgICAgICBTdHJpbmdbMV0gaXMgcGFzc3dvcmQuIFJldHVybiBudWxsIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0VXNlcm5hbWVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QpIHsKLSAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtOTAyLDcgKzk1MCw3IEBACiAgICAgICogQ2xlYXIgcGFzc3dvcmQgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhclVzZXJuYW1lUGFzc3dvcmQoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTkyNyw3ICs5NzUsNyBAQAogICAgICAqLwogICAgIHZvaWQgc2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0sIFN0cmluZyB1c2VybmFtZSwKICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICBpZiAoaG9zdCA9PSBudWxsIHx8IHJlYWxtID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC05NTIsNyArMTAwMCw3IEBACiAgICAgICogICAgICAgICBTdHJpbmdbMV0gaXMgcGFzc3dvcmQuIFJldHVybiBudWxsIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0pIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKXsKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtOTk5LDcgKzEwNDcsNyBAQAogICAgICAqIENsZWFyIEhUVFAgYXV0aGVudGljYXRpb24gcGFzc3dvcmQgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTAyMCw3ICsxMDY4LDcgQEAKICAgICAgKiBAcGFyYW0gZm9ybWRhdGEgVGhlIGZvcm0gZGF0YSBpbiBIYXNoTWFwCiAgICAgICovCiAgICAgdm9pZCBzZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtZGF0YSkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTA2OSw3ICsxMTE3LDcgQEAKICAgICAgKi8KICAgICBBcnJheUxpc3Q8U3RyaW5nPiBnZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBTdHJpbmcgbmFtZSkgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbmFtZSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgICAgIH0KIApAQCAtMTEyOSw3ICsxMTc3LDcgQEAKICAgICAgKiBDbGVhciBmb3JtIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJGb3JtRGF0YSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWU4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xCYXNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbnRlcmZhY2UgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIC8qKgorICAgICAqIENhdXNlcyB0aGUgb24tc2NyZWVuIHpvb20gY29udHJvbCB0byBiZSBtYWRlIHZpc2libGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIG9uLXNjcmVlbiB6b29tIGNvbnRyb2wgdG8gZGlzYXBwZWFyCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGlkZSgpOworCisgICAgLyoqCisgICAgICogRW5hYmxlcyB0aGUgY29udHJvbCB0byB1cGRhdGUgaXRzIHN0YXRlIGlmIG5lY2Vzc2FyeSBpbiByZXNwb25zZSB0byBhCisgICAgICogY2hhbmdlIGluIHRoZSBwYWdlcyB6b29tIGxldmVsLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1heCB6b29tIGxldmVsIGlzCisgICAgICogcmVhY2hlZCB0aGVuIHRoZSBjb250cm9sIGNhbiBkaXNhYmxlIHRoZSBidXR0b24gZm9yIHpvb21pbmcgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRW1iZWRkZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5ZTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCitjbGFzcyBab29tQ29udHJvbEVtYmVkZGVkIGltcGxlbWVudHMgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIHByaXZhdGUgZmluYWwgWm9vbU1hbmFnZXIgbVpvb21NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIC8vIFRoZSBjb250cm9sbGVyIGlzIGxhemlseSBpbml0aWFsaXplZCBpbiBnZXRDb250cm9scygpIGZvciBwZXJmb3JtYW5jZS4KKyAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlciBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCisgICAgcHVibGljIFpvb21Db250cm9sRW1iZWRkZWQoWm9vbU1hbmFnZXIgem9vbU1hbmFnZXIsIFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtWm9vbU1hbmFnZXIgPSB6b29tTWFuYWdlcjsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGlmICghZ2V0Q29udHJvbHMoKS5pc1Zpc2libGUoKSAmJiAhbVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSkgeworCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7CisKKyAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHNldHRpbmdzLmdldERvdWJsZVRhcFRvYXN0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNJblpvb21PdmVydmlldygpICYmIGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobVdlYlZpZXcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsICYmIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuaXNWaXNpYmxlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICAgICAgYm9vbGVhbiBjYW5ab29tT3V0ID0gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKSAmJiAhbVpvb21NYW5hZ2VyLmlzSW5ab29tT3ZlcnZpZXcoKTsKKyAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zIGlmIHRoZSBwYWdlIGNhbm5vdCB6b29tCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNldCBlYWNoIG9uZSBpbmRpdmlkdWFsbHksIGFzIGEgcGFnZSBtYXkgYmUgYWJsZSB0byB6b29tIGluIG9yIG91dAorICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Q29udHJvbHMoKSB7CisgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPSBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyKG1XZWJWaWV3KTsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobmV3IFpvb21MaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIC8vIFpvb21CdXR0b25zQ29udHJvbGxlciBwb3NpdGlvbnMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSwgYnV0IGluCisgICAgICAgICAgICAvLyB0aGUgbWlkZGxlLiBDaGFuZ2UgdGhlaXIgbGF5b3V0IHBhcmFtZXRlcnMgc28gdGhleSBhcHBlYXIgb24gdGhlCisgICAgICAgICAgICAvLyByaWdodC4KKyAgICAgICAgICAgIFZpZXcgY29udHJvbHMgPSBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpOworICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSBjb250cm9scy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAoKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zKS5ncmF2aXR5ID0gR3Jhdml0eS5SSUdIVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFpvb21MaXN0ZW5lciBpbXBsZW1lbnRzIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKKyAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KKyAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uWm9vbShib29sZWFuIHpvb21JbikgeworICAgICAgICAgICAgaWYgKHpvb21JbikgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21JbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEV4dGVybmFsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTMxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQERlcHJlY2F0ZWQKK2NsYXNzIFpvb21Db250cm9sRXh0ZXJuYWwgaW1wbGVtZW50cyBab29tQ29udHJvbEJhc2UgeworCisgICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgZXh0ZXJuYWwgY29udHJvbHMgYXJlIHZpc2libGUgYmVmb3JlIGZhZGluZyBhd2F5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBaT09NX0NPTlRST0xTX1RJTUVPVVQgPQorICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0Wm9vbUNvbnRyb2xzVGltZW91dCgpOworICAgIC8vIFRoZSB2aWV3IGNvbnRhaW5pbmcgdGhlIGV4dGVybmFsIHpvb20gY29udHJvbHMKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIG1ab29tQ29udHJvbHM7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtWm9vbUNvbnRyb2xSdW5uYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbVByaXZhdGVIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIHB1YmxpYyBab29tQ29udHJvbEV4dGVybmFsKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgaWYobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0Q29udHJvbHMoKS5zaG93KHRydWUpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21Db250cm9scyAhPSBudWxsICYmIG1ab29tQ29udHJvbHMuaXNTaG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsgfQorCisgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGdldENvbnRyb2xzKCkgeworICAgICAgICBpZiAobVpvb21Db250cm9scyA9PSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xzID0gY3JlYXRlWm9vbUNvbnRyb2xzKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBuZWVkIHRvIGJlIHNldCB0byBWSVNJQkxFIGZpcnN0IHNvIHRoYXQgZ2V0TWVhc3VyZWRIZWlnaHQoKSBpbgorICAgICAgICAgICAgICoge0BsaW5rICNvblNpemVDaGFuZ2VkKCl9IGNhbiByZXR1cm4gdGhlIG1lYXN1cmVkIHZhbHVlIGZvciBwcm9wZXIKKyAgICAgICAgICAgICAqIGxheW91dC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVpvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc21pc3MgdGhlIGNvbnRyb2xzIGlmIHRoZSB1c2VyIGhhcworICAgICAgICAgICAgICAgICAgICAgKiBmb2N1cyBvbiB0aGVtLiBXYWl0IGFuZCBjaGVjayBhZ2FpbiBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICghbVpvb21Db250cm9scy5oYXNGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21Db250cm9sczsKKyAgICB9CisKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGNyZWF0ZVpvb21Db250cm9scygpIHsKKyAgICAgICAgRXh0ZW5kZWRab29tQ29udHJvbHMgem9vbUNvbnRyb2xzID0gbmV3IEV4dGVuZGVkWm9vbUNvbnRyb2xzKG1XZWJWaWV3LmdldENvbnRleHQoKSk7CisgICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbUluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAorICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gem9vbUNvbnRyb2xzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworCisgICAgICAgIHByaXZhdGUgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzIG1QbHVzTWludXNab29tQ29udHJvbHM7CisKKyAgICAgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC56b29tX21hZ25pZnksIHRoaXMsIHRydWUpOworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scyA9IChhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHMpIGZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tQ29udHJvbHMpOworICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbU1hZ25pZnkpLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIFZpZXcuR09ORSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KGJvb2xlYW4gc2hvd1pvb20pIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShzaG93Wm9vbSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgICAgICBmYWRlKFZpZXcuVklTSUJMRSwgMC4wZiwgMS4wZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAgICAgZmFkZShWaWV3LkdPTkUsIDEuMGYsIDAuMGYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZhZGUoaW50IHZpc2liaWxpdHksIGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7CisgICAgICAgICAgICBBbHBoYUFuaW1hdGlvbiBhbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKHN0YXJ0QWxwaGEsIGVuZEFscGhhKTsKKyAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oNTAwKTsKKyAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbHVzTWludXNab29tQ29udHJvbHMuaGFzRm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk2ZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TY2FsZUdlc3R1cmVEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBUaGUgWm9vbU1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBXZWJWaWV3J3MgY3VycmVudCB6b29tCisgKiBsZXZlbCBzdGF0ZS4gIEl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBvbi1zY3JlZW4gem9vbSBjb250cm9scworICogYXMgd2VsbCBhcyBhbnkgYW5pbWF0aW9uIG9mIHRoZSBXZWJWaWV3IGR1ZSB0byB6b29taW5nLgorICoKKyAqIEN1cnJlbnRseSwgdGhlcmUgYXJlIHR3byBtZXRob2RzIGZvciBhbmltYXRpbmcgdGhlIHpvb20gb2YgYSBXZWJWaWV3LgorICoKKyAqICgxKSBUaGUgZmlyc3QgbWV0aG9kIGlzIHRyaWdnZXJlZCBieSBzdGFydFpvb21BbmltYXRpb24oLi4uKSBhbmQgaXMgYSBmaXhlZAorICogbGVuZ3RoIGFuaW1hdGlvbiB3aGVyZSB0aGUgZmluYWwgem9vbSBzY2FsZSBpcyBrbm93biBhdCBzdGFydHVwLiAgVGhpcyB0eXBlIG9mCisgKiBhbmltYXRpb24gbm90aWZpZXMgd2Via2l0IG9mIHRoZSBmaW5hbCBzY2FsZSBCRUZPUkUgaXQgYW5pbWF0ZXMuIFRoZSBhbmltYXRpb24KKyAqIGlzIHRoZW4gZG9uZSBieSBzY2FsaW5nIHRoZSBDQU5WQVMgaW5jcmVtZW50YWxseSBiYXNlZCBvbiBhIHN0ZXBwaW5nIGZ1bmN0aW9uLgorICoKKyAqICgyKSBUaGUgc2Vjb25kIG1ldGhvZCBpcyB0cmlnZ2VyZWQgYnkgYSBtdWx0aS10b3VjaCBwaW5jaCBhbmQgdGhlIG5ldyBzY2FsZQorICogaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgdXNlcidzIGdlc3R1cmUuIFRoaXMgdHlwZSBvZiBhbmltYXRpb24KKyAqIG9ubHkgbm90aWZpZXMgd2Via2l0IG9mIG5ldyBzY2FsZSBBRlRFUiB0aGUgZ2VzdHVyZSBpcyBjb21wbGV0ZS4gVGhlIGFuaW1hdGlvbgorICogZWZmZWN0IGlzIGFjaGlldmVkIGJ5IHNjYWxpbmcgdGhlIFZJRVdTIChib3RoIFdlYlZpZXcgYW5kIFZpZXdNYW5hZ2VyLkNoaWxkVmlldykKKyAqIHRvIHRoZSBuZXcgc2NhbGUgaW4gcmVzcG9uc2UgdG8gZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIHVzZXIncyBnZXN0dXJlLgorICovCitjbGFzcyBab29tTWFuYWdlciB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3Wm9vbSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1Byb3h5IG1DYWxsYmFja1Byb3h5OworCisgICAgLy8gV2lkZ2V0cyByZXNwb25zaWJsZSBmb3IgdGhlIG9uLXNjcmVlbiB6b29tIGZ1bmN0aW9ucyBvZiB0aGUgV2ViVmlldy4KKyAgICBwcml2YXRlIFpvb21Db250cm9sRW1iZWRkZWQgbUVtYmVkZGVkWm9vbUNvbnRyb2w7CisgICAgcHJpdmF0ZSBab29tQ29udHJvbEV4dGVybmFsIG1FeHRlcm5hbFpvb21Db250cm9sOworCisgICAgLyoKKyAgICAgKiBGb3IgbGFyZ2Ugc2NyZWVuIGRldmljZXMsIHRoZSBkZWZhdWx0U2NhbGUgdXN1YWxseSBzZXQgdG8gMS4wIGFuZAorICAgICAqIGVxdWFsIHRvIHRoZSBvdmVydmlldyBzY2FsZSwgdG8gZGlmZmVyZW50aWF0ZSB0aGUgem9vbSBsZXZlbCBmb3IgZG91YmxlIHRhcHBpbmcsCisgICAgICogYSBkZWZhdWx0IHJlYWRpbmcgbGV2ZWwgc2NhbGUgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX1JFQURJTkdfTEVWRUxfU0NBTEUgPSAxLjVmOworCisgICAgLyoKKyAgICAgKiBUaGUgc2NhbGUgZmFjdG9ycyB0aGF0IGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBmb3IgdGhlCisgICAgICogZGVmYXVsdCB6b29tIHNjYWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgPSA0LjAwZjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SID0gMC4yNWY7CisKKyAgICAvLyBUaGUgZGVmYXVsdCBzY2FsZSBsaW1pdHMsIHdoaWNoIGFyZSBkZXBlbmRlbnQgb24gdGhlIGRpc3BsYXkgZGVuc2l0eS4KKyAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRNaW5ab29tU2NhbGU7CisKKyAgICAvLyBUaGUgYWN0dWFsIHNjYWxlIGxpbWl0cywgd2hpY2ggY2FuIGJlIHNldCB0aHJvdWdoIGEgd2VicGFnZSdzIHZpZXdwb3J0CisgICAgLy8gbWV0YS10YWcuCisgICAgcHJpdmF0ZSBmbG9hdCBtTWF4Wm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbU1pblpvb21TY2FsZTsKKworICAgIC8vIExvY2tzIHRoZSBtaW5pbXVtIFpvb21TY2FsZSB0byB0aGUgdmFsdWUgY3VycmVudGx5IHNldCBpbiBtTWluWm9vbVNjYWxlLgorICAgIHByaXZhdGUgYm9vbGVhbiBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOworCisgICAgLyoKKyAgICAgKiBXaGVuIGxvYWRpbmcgYSBuZXcgcGFnZSB0aGUgV2ViVmlldyBkb2VzIG5vdCBpbml0aWFsbHkga25vdyB0aGUgZmluYWwKKyAgICAgKiB3aWR0aCBvZiB0aGUgcGFnZS4gVGhlcmVmb3JlLCB3aGVuIGEgbmV3IHBhZ2UgaXMgbG9hZGVkIGluIG92ZXJ2aWV3IG1vZGUKKyAgICAgKiB0aGUgb3ZlcnZpZXcgc2NhbGUgaXMgaW5pdGlhbGl6ZWQgdG8gYSBkZWZhdWx0IHZhbHVlLiBUaGlzIGZsYWcgaXMgdGhlbgorICAgICAqIHNldCBhbmQgdXNlZCB0byBub3RpZnkgdGhlIFpvb21NYW5hZ2VyIHRvIHRha2UgdGhlIHdpZHRoIG9mIHRoZSBuZXh0CisgICAgICogcGljdHVyZSBmcm9tIHdlYmtpdCBhbmQgdXNlIHRoYXQgd2lkdGggdG8gZW50ZXIgaW50byB6b29tIG92ZXJ2aWV3IG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIFdoZW4gaW4gdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSwgdGhlIHBhZ2UncyB3aWR0aCBpcyBmdWxseSBmaXQgdG8gdGhlCisgICAgICogY3VycmVudCB3aW5kb3cuIEFkZGl0aW9uYWxseSB3aGlsZSB0aGUgcGFnZSBpcyBpbiB0aGlzIHN0YXRlIGl0IGlzCisgICAgICogYWN0aXZlLCBpbiBvdGhlciB3b3JkcywgeW91IGNhbiBjbGljayB0byBmb2xsb3cgdGhlIGxpbmtzLiBXZSBjYWNoZSBhCisgICAgICogYm9vbGVhbiB0byBlbmFibGUgdXMgdG8gcXVpY2tseSBjaGVjayB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gb3ZlcnZpZXcKKyAgICAgKiBtb2RlLCBidXQgdGhpcyB2YWx1ZSBzaG91bGQgb25seSBiZSBtb2RpZmllZCBieSBjaGFuZ2VzIHRvIHRoZSB6b29tCisgICAgICogc2NhbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1ab29tT3ZlcnZpZXdXaWR0aDsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZab29tT3ZlcnZpZXdXaWR0aDsKKworICAgIC8qCisgICAgICogVGhlc2UgdmFyaWFibGVzIHRyYWNrIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHpvb20gYW5kIHRoZXkgYXJlIHVzZWQgdG8KKyAgICAgKiBkZXRlcm1pbmUgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB3ZSBzaG91bGQgem9vbS4gVGhleSBhcmUgc3RvcmVkIGluIHZpZXcKKyAgICAgKiBjb29yZGluYXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWDsKKyAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWTsKKworICAgIC8qCisgICAgICogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSBzY3JlZW4gc2hvdWxkIGJlCisgICAgICogY2VudGVyZWQgYWZ0ZXIgem9vbWluZy4gSW4gb3RoZXIgd29yZHMgaXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNlbnRlcgorICAgICAqIHBvaW50IG9mIHRoZSB2aXNpYmxlIGRvY3VtZW50IGFmdGVyIHRoZSBwYWdlIGhhcyBmaW5pc2hlZCB6b29taW5nLiBUaGlzCisgICAgICogaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIHpvb20gbWF5IGhhdmUgcG90ZW50aWFsbHkgcmVmbG93ZWQgdGhlIHRleHQgYW5kCisgICAgICogd2UgbmVlZCB0byBlbnN1cmUgdGhlIHByb3BlciBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCByZW1haW5zIG9uIHRoZQorICAgICAqIHNjcmVlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtQW5jaG9yWDsKKyAgICBwcml2YXRlIGludCBtQW5jaG9yWTsKKworICAgIC8vIFRoZSBzY2FsZSBmYWN0b3IgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY29sdW1uIHdpZHRoIGZvciB0ZXh0CisgICAgcHJpdmF0ZSBmbG9hdCBtVGV4dFdyYXBTY2FsZTsKKworICAgIC8qCisgICAgICogVGhlIGRlZmF1bHQgem9vbSBzY2FsZSBpcyB0aGUgc2NhbGUgZmFjdG9yIHVzZWQgd2hlbiB0aGUgdXNlciB0cmlnZ2VycyBhCisgICAgICogem9vbSBpbiBieSBkb3VibGUgdGFwcGluZyBvbiB0aGUgV2ViVmlldy4gVGhlIHZhbHVlIGlzIGluaXRpYWxseSBzZXQKKyAgICAgKiBiYXNlZCBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LCBidXQgY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgdmlhIHRoZQorICAgICAqIFdlYlNldHRpbmdzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRTY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZEZWZhdWx0U2NhbGU7CisKKyAgICAvLyB0aGUgY3VycmVudCBjb21wdXRlZCB6b29tIHNjYWxlIGFuZCBpdHMgaW52ZXJzZS4KKyAgICBwcml2YXRlIGZsb2F0IG1BY3R1YWxTY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZBY3R1YWxTY2FsZTsKKyAgICAKKyAgICAvKgorICAgICAqIFRoZSBpbml0aWFsIHNjYWxlIGZvciB0aGUgV2ViVmlldy4gMCBtZWFucyBkZWZhdWx0LiBJZiBpbml0aWFsIHNjYWxlIGlzCisgICAgICogZ3JlYXRlciB0aGFuIDAgdGhlIFdlYlZpZXcgc3RhcnRzIHdpdGggdGhpcyB2YWx1ZSBhcyBpdHMgaW5pdGlhbCBzY2FsZS4gVGhlCisgICAgICogdmFsdWUgaXMgY29udmVydGVkIGZyb20gYW4gaW50ZWdlciBwZXJjZW50YWdlIHNvIGl0IGlzIGd1YXJlbnRlZWQgdG8gaGF2ZQorICAgICAqIG5vIG1vcmUgdGhhbiAyIHNpZ25pZmljYW50IGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC4gIFRoaXMgcmVzdHJpY3Rpb24KKyAgICAgKiBhbGxvd3MgdXMgdG8gY29udmVydCB0aGUgc2NhbGUgYmFjayB0byB0aGUgb3JpZ2luYWwgcGVyY2VudGFnZSBieSBzaW1wbHkKKyAgICAgKiBtdWx0aXBseWluZyB0aGUgdmFsdWUgYnkgMTAwLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbUluaXRpYWxTY2FsZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UID0gMC4wMWY7CisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcyBhcmUgb25seSB0byBiZSB1c2VkIGZvciBhbmltYXRpbmcgem9vbS4gSWYKKyAgICAgKiBtWm9vbVNjYWxlIGlzIG5vbi16ZXJvIHRoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSB6b29tIGFuaW1hdGlvbi4gVGhlCisgICAgICogb3RoZXIgdmFyaWFibGVzIGFyZSB1c2VkIGFzIGEgY2FjaGUgKGUuZy4gaW52ZXJzZSkgb3IgYXMgYSB3YXkgdG8gc3RvcmUKKyAgICAgKiB0aGUgc3RhdGUgb2YgdGhlIHZpZXcgcHJpb3IgdG8gYW5pbWF0aW5nIChlLmcuIGluaXRpYWwgc2Nyb2xsIGNvb3JkcykuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtWm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkluaXRpYWxab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52RmluYWxab29tU2NhbGU7CisgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxYOworICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWTsKKyAgICBwcml2YXRlIGxvbmcgbVpvb21TdGFydDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0FOSU1BVElPTl9MRU5HVEggPSA1MDA7CisKKyAgICAvLyB3aGV0aGVyIHN1cHBvcnQgbXVsdGktdG91Y2gKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN1cHBvcnRNdWx0aVRvdWNoOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgd2UgaGF2ZSBhIHRvdWNoIHBhbmVsIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNtb290aCBwYW4vc2NhbGUgYXQgdGhlIHNhbWUgdGltZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dQYW5BbmRTY2FsZTsKKworICAgIC8vIHVzZSB0aGUgZnJhbWV3b3JrJ3MgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgdG8gaGFuZGxlIG11bHRpLXRvdWNoCisgICAgcHJpdmF0ZSBTY2FsZUdlc3R1cmVEZXRlY3RvciBtU2NhbGVEZXRlY3RvcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gZmFsc2U7CisKKyAgICBwdWJsaWMgWm9vbU1hbmFnZXIoV2ViVmlldyB3ZWJWaWV3LCBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBtQ2FsbGJhY2tQcm94eSA9IGNhbGxiYWNrUHJveHk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWRlYWxseSBtWm9vbU92ZXJ2aWV3V2lkdGggc2hvdWxkIGJlIG1Db250ZW50V2lkdGguIEJ1dCBzaXRlcyBsaWtlCisgICAgICAgICAqIEVTUE4gYW5kIEVuZ2FkZ2V0IGFsd2F5cyBoYXZlIHdpZGVyIG1Db250ZW50V2lkdGggbm8gbWF0dGVyIHdoYXQgdGhlCisgICAgICAgICAqIHZpZXdwb3J0IHNpemUgaXMuCisgICAgICAgICAqLworICAgICAgICBzZXRab29tT3ZlcnZpZXdXaWR0aChXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYm90aCB0aGUgZGVmYXVsdCBhbmQgYWN0dWFsIHpvb20gc2NhbGUgdG8gdGhlIGdpdmVuIGRlbnNpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVuc2l0eSBUaGUgbG9naWNhbCBkZW5zaXR5IG9mIHRoZSBkaXNwbGF5LiBUaGlzIGlzIGEgc2NhbGluZyBmYWN0b3IKKyAgICAgKiBmb3IgdGhlIERlbnNpdHkgSW5kZXBlbmRlbnQgUGl4ZWwgdW5pdCwgd2hlcmUgb25lIERJUCBpcyBvbmUgcGl4ZWwgb24gYW4KKyAgICAgKiBhcHByb3hpbWF0ZWx5IDE2MCBkcGkgc2NyZWVuIChzZWUgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzLmRlbnNpdHkpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoZmxvYXQgZGVuc2l0eSkgeworICAgICAgICBhc3NlcnQgZGVuc2l0eSA+IDA7CisKKyAgICAgICAgc2V0RGVmYXVsdFpvb21TY2FsZShkZW5zaXR5KTsKKyAgICAgICAgbUFjdHVhbFNjYWxlID0gZGVuc2l0eTsKKyAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIGRlbnNpdHk7CisgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gZGVuc2l0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGRlZmF1bHQgem9vbSBzY2FsZSB1c2luZyB0aGUgZ2l2ZW4gZGVuc2l0eS4gSXQgd2lsbCBhbHNvIHJlc2V0CisgICAgICogdGhlIGN1cnJlbnQgbWluIGFuZCBtYXggem9vbSBzY2FsZXMgdG8gdGhlIGRlZmF1bHQgYm91bmRhcmllcyBhcyB3ZWxsIGFzCisgICAgICogZW5zdXJlIHRoYXQgdGhlIGFjdHVhbCBzY2FsZSBmYWxscyB3aXRoaW4gdGhvc2UgYm91bmRhcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZW5zaXR5IFRoZSBsb2dpY2FsIGRlbnNpdHkgb2YgdGhlIGRpc3BsYXkuIFRoaXMgaXMgYSBzY2FsaW5nIGZhY3RvcgorICAgICAqIGZvciB0aGUgRGVuc2l0eSBJbmRlcGVuZGVudCBQaXhlbCB1bml0LCB3aGVyZSBvbmUgRElQIGlzIG9uZSBwaXhlbCBvbiBhbgorICAgICAqIGFwcHJveGltYXRlbHkgMTYwIGRwaSBzY3JlZW4gKHNlZSBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MuZGVuc2l0eSkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgYXNzZXJ0IGRlbnNpdHkgPiAwOworCisgICAgICAgIGlmIChNYXRoLmFicyhkZW5zaXR5IC0gbURlZmF1bHRTY2FsZSkgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgeworICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgZGVmYXVsdCBkZW5zaXR5CisgICAgICAgICAgICBzZXREZWZhdWx0Wm9vbVNjYWxlKGRlbnNpdHkpOworICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBzY2FsZSBpZiBpdCBmYWxscyBvdXRzaWRlIHRoZSBuZXcgem9vbSBib3VuZHMKKyAgICAgICAgICAgIHNldFpvb21TY2FsZShtQWN0dWFsU2NhbGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRab29tU2NhbGUoZmxvYXQgZGVmYXVsdFNjYWxlKSB7CisgICAgICAgIG1EZWZhdWx0U2NhbGUgPSBkZWZhdWx0U2NhbGU7CisgICAgICAgIG1JbnZEZWZhdWx0U2NhbGUgPSAxIC8gZGVmYXVsdFNjYWxlOworICAgICAgICBtRGVmYXVsdE1heFpvb21TY2FsZSA9IGRlZmF1bHRTY2FsZSAqIERFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SOworICAgICAgICBtRGVmYXVsdE1pblpvb21TY2FsZSA9IGRlZmF1bHRTY2FsZSAqIERFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SOworICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldEludlNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUludkFjdHVhbFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRUZXh0V3JhcFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbVRleHRXcmFwU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldE1heFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldE1pblpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldERlZmF1bHRTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0U2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldFJlYWRpbmdMZXZlbFNjYWxlKCkgeworICAgICAgICAvLyBUaGUgcmVhZGluZyBzY2FsZSBpcyBhdCBsZWFzdCAwLjVmIGFwYXJ0IGZyb20gdGhlIG92ZXJ2aWV3IHNjYWxlLgorICAgICAgICBmaW5hbCBmbG9hdCBNSU5fU0NBTEVfRElGRiA9IDAuNWY7CisgICAgICAgIGZpbmFsIGZsb2F0IHpvb21PdmVydmlld1NjYWxlID0gZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKTsKKyAgICAgICAgaWYgKHpvb21PdmVydmlld1NjYWxlID4gREVGQVVMVF9SRUFESU5HX0xFVkVMX1NDQUxFKSB7CisgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oREVGQVVMVF9SRUFESU5HX0xFVkVMX1NDQUxFLAorICAgICAgICAgICAgICAgIHpvb21PdmVydmlld1NjYWxlIC0gTUlOX1NDQUxFX0RJRkYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNYXRoLm1heCh6b29tT3ZlcnZpZXdTY2FsZSArIE1JTl9TQ0FMRV9ESUZGLAorICAgICAgICAgICAgREVGQVVMVF9SRUFESU5HX0xFVkVMX1NDQUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0SW52RGVmYXVsdFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUludkRlZmF1bHRTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXREZWZhdWx0TWluWm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRNaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXREb2N1bWVudEFuY2hvclgoKSB7CisgICAgICAgIHJldHVybiBtQW5jaG9yWDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldERvY3VtZW50QW5jaG9yWSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbmNob3JZOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyRG9jdW1lbnRBbmNob3IoKSB7CisgICAgICAgIG1BbmNob3JYID0gbUFuY2hvclkgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFpvb21DZW50ZXIoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtWm9vbUNlbnRlclggPSB4OworICAgICAgICBtWm9vbUNlbnRlclkgPSB5OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEluaXRpYWxTY2FsZUluUGVyY2VudChpbnQgc2NhbGVJblBlcmNlbnQpIHsKKyAgICAgICAgbUluaXRpYWxTY2FsZSA9IHNjYWxlSW5QZXJjZW50ICogMC4wMWY7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOworICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1pvb21TY2FsZUZpeGVkKCkgeworICAgICAgICByZXR1cm4gbU1pblpvb21TY2FsZSA+PSBtTWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoZmxvYXQgc2NhbGVBLCBmbG9hdCBzY2FsZUIpIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKHNjYWxlQSAtIHNjYWxlQikgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd2lsbFNjYWxlVHJpZ2dlclpvb20oZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgbUFjdHVhbFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5ab29tSW4oKSB7CisgICAgICAgIHJldHVybiBtTWF4Wm9vbVNjYWxlIC0gbUFjdHVhbFNjYWxlID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tSW4oKSB7CisgICAgICAgIHJldHVybiB6b29tKDEuMjVmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tT3V0KCkgeworICAgICAgICByZXR1cm4gem9vbSgwLjhmKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIFRSVUUgaWYgem9vbSBvdXQgc3VjY2VlZHMgYW5kIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KKyAgICBwcml2YXRlIGJvb2xlYW4gem9vbShmbG9hdCB6b29tTXVsdGlwbGllcikgeworICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQorICAgICAgICBtV2ViVmlldy5zd2l0Y2hPdXREcmF3SGlzdG9yeSgpOworICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCisgICAgICAgIG1ab29tQ2VudGVyWCA9IG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpICogLjVmOworICAgICAgICBtWm9vbUNlbnRlclkgPSBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCkgKiAuNWY7CisgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICByZXR1cm4gc3RhcnRab29tQW5pbWF0aW9uKG1BY3R1YWxTY2FsZSAqIHpvb21NdWx0aXBsaWVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZXMgYW4gYW5pbWF0ZWQgem9vbSBvZiB0aGUgV2ViVmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IHNjYWxlIHRyaWdnZXJlZCBhbiBhbmltYXRpb24gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFpvb21BbmltYXRpb24oZmxvYXQgc2NhbGUsIGJvb2xlYW4gcmVmbG93VGV4dCkgeworICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgbUluaXRpYWxTY3JvbGxYID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBtSW5pdGlhbFNjcm9sbFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisKKyAgICAgICAgLy8gc25hcCB0byByZWFkaW5nIGxldmVsIHNjYWxlIGlmIGl0IGlzIGNsb3NlCisgICAgICAgIGlmICghZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBnZXRSZWFkaW5nTGV2ZWxTY2FsZSgpKSkgeworICAgICAgICAgICAgc2NhbGUgPSBnZXRSZWFkaW5nTGV2ZWxTY2FsZSgpOworICAgICAgICB9CisKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0KTsKKworICAgICAgICBpZiAob2xkU2NhbGUgIT0gbUFjdHVhbFNjYWxlKSB7CisgICAgICAgICAgICAvLyB1c2UgbVpvb21QaWNrZXJTY2FsZSB0byBzZWUgem9vbSBwcmV2aWV3IGZpcnN0CisgICAgICAgICAgICBtWm9vbVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICBtSW52SW5pdGlhbFpvb21TY2FsZSA9IDEuMGYgLyBvbGRTY2FsZTsKKyAgICAgICAgICAgIG1JbnZGaW5hbFpvb21TY2FsZSA9IDEuMGYgLyBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBtWm9vbVNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgbVdlYlZpZXcub25GaXhlZExlbmd0aFpvb21BbmltYXRpb25TdGFydCgpOworICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFdlYlZpZXcncyBkcmF3aW5nIGNvZGUgd2hlbiBhIGZpeGVkIGxlbmd0aCB6b29tCisgICAgICogYW5pbWF0aW9uIGlzIG9jY3VycmluZy4gSXRzIHB1cnBvc2UgaXMgdG8gYW5pbWF0ZSB0aGUgem9vbWluZyBvZiB0aGUgY2FudmFzCisgICAgICogdG8gdGhlIGRlc2lyZWQgc2NhbGUgd2hpY2ggd2FzIHNwZWNpZmllZCBpbiBzdGFydFpvb21BbmltYXRpb24oLi4uKS4KKyAgICAgKgorICAgICAqIEEgZml4ZWQgbGVuZ3RoIGFuaW1hdGlvbiBiZWdpbnMgd2hlbiBzdGFydFpvb21BbmltYXRpb24oLi4uKSBpcyBjYWxsZWQgYW5kCisgICAgICogY29udGludWVzIHVudGlsIHRoZSBaT09NX0FOSU1BVElPTl9MRU5HVEggdGltZSBoYXMgZWxhcHNlZC4gRHVyaW5nIHRoYXQKKyAgICAgKiBpbnRlcnZhbCBlYWNoIHRpbWUgdGhlIFdlYlZpZXcgZHJhd3MgaXQgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGljaCBpcyAKKyAgICAgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQWRkaXRpb25hbGx5LCB0aGUgV2ViVmlldyBjYW4gY2hlY2sgdG8gc2VlIGlmIHN1Y2ggYW4gYW5pbWF0aW9uIGlzIGN1cnJlbnRseQorICAgICAqIGluIHByb2dyZXNzIGJ5IGNhbGxpbmcgaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlWm9vbShDYW52YXMgY2FudmFzKSB7CisgICAgICAgIGlmIChtWm9vbVNjYWxlID09IDApIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkEgV2ViVmlldyBpcyBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaXhlZCBsZW5ndGggIgorICAgICAgICAgICAgICAgICAgICArICJ6b29tIGFuaW1hdGlvbiB3aGVuIG5vIHpvb20gaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHpvb21TY2FsZTsKKyAgICAgICAgaW50IGludGVydmFsID0gKGludCkgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVpvb21TdGFydCk7CisgICAgICAgIGlmIChpbnRlcnZhbCA8IFpPT01fQU5JTUFUSU9OX0xFTkdUSCkgeworICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpIGludGVydmFsIC8gWk9PTV9BTklNQVRJT05fTEVOR1RIOworICAgICAgICAgICAgem9vbVNjYWxlID0gMS4wZiAvIChtSW52SW5pdGlhbFpvb21TY2FsZQorICAgICAgICAgICAgICAgICAgICArIChtSW52RmluYWxab29tU2NhbGUgLSBtSW52SW5pdGlhbFpvb21TY2FsZSkgKiByYXRpbyk7CisgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6b29tU2NhbGUgPSBtWm9vbVNjYWxlOworICAgICAgICAgICAgLy8gc2V0IG1ab29tU2NhbGUgdG8gYmUgMCBhcyB3ZSBoYXZlIGZpbmlzaGVkIGFuaW1hdGluZworICAgICAgICAgICAgbVpvb21TY2FsZSA9IDA7CisgICAgICAgICAgICBtV2ViVmlldy5vbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvbkVuZCgpOworICAgICAgICB9CisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbi4gU2luY2Ugd2UgbmVlZCB0byB1c2UKKyAgICAgICAgLy8gem9vbVNjYWxlLCB3ZSBjYW4ndCB1c2UgdGhlIFdlYlZpZXcncyBwaW5Mb2NYL1kgZnVuY3Rpb25zIGRpcmVjdGx5LgorICAgICAgICBmbG9hdCBzY2FsZSA9IHpvb21TY2FsZSAqIG1JbnZJbml0aWFsWm9vbVNjYWxlOworICAgICAgICBpbnQgdHggPSBNYXRoLnJvdW5kKHNjYWxlICogKG1Jbml0aWFsU2Nyb2xsWCArIG1ab29tQ2VudGVyWCkgLSBtWm9vbUNlbnRlclgpOworICAgICAgICB0eCA9IC1XZWJWaWV3LnBpbkxvYyh0eCwgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudFdpZHRoKCkKKyAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBtV2ViVmlldy5nZXRUaXRsZUhlaWdodCgpOworICAgICAgICBpbnQgdHkgPSBNYXRoLnJvdW5kKHNjYWxlCisgICAgICAgICAgICAgICAgKiAobUluaXRpYWxTY3JvbGxZICsgbVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpCisgICAgICAgICAgICAgICAgLSAobVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpKTsKKyAgICAgICAgdHkgPSAtKHR5IDw9IHRpdGxlSGVpZ2h0ID8gTWF0aC5tYXgodHksIDApIDogV2ViVmlldy5waW5Mb2ModHkKKyAgICAgICAgICAgICAgICAtIHRpdGxlSGVpZ2h0LCBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudEhlaWdodCgpCisgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIHRpdGxlSGVpZ2h0KSArIG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKworICAgICAgICBjYW52YXMudHJhbnNsYXRlKHR4LCB0eSk7CisgICAgICAgIGNhbnZhcy5zY2FsZSh6b29tU2NhbGUsIHpvb21TY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNab29tQW5pbWF0aW5nKCkgeworICAgICAgICByZXR1cm4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB8fCBtUGluY2hUb1pvb21BbmltYXRpbmc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB7CisgICAgICAgIHJldHVybiBtWm9vbVNjYWxlICE9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFpvb21TY2FsZShib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgcmVmbG93VGV4dCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0LCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFpvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiByZWZsb3dUZXh0LCBib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTY2FsZUxlc3NUaGFuTWluWm9vbSA9IHNjYWxlIDwgbU1pblpvb21TY2FsZTsKKyAgICAgICAgc2NhbGUgPSBjb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKworICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UgYXJlIGluIHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUKKyAgICAgICAgaWYgKGlzU2NhbGVMZXNzVGhhbk1pblpvb20gJiYgbU1pblpvb21TY2FsZSA8IG1EZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSAhZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBnZXRab29tT3ZlcnZpZXdTY2FsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWZsb3dUZXh0KSB7CisgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSB8fCBmb3JjZSkgeworICAgICAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBmbG9hdCBvbGRJbnZTY2FsZSA9IG1JbnZBY3R1YWxTY2FsZTsKKworICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOworICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOworCisgICAgICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkpIHsKKworICAgICAgICAgICAgICAgIC8vIElmIGhpc3RvcnkgUGljdHVyZSBpcyBkcmF3biwgZG9uJ3QgdXBkYXRlIHNjcm9sbC4gVGhleSB3aWxsCisgICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc2Nyb2xsIHNvIHdlIGRvbid0IGFwcGVhciB0byBqdW1wCisgICAgICAgICAgICAgICAgLy8gaS5lLiBrZWVwIHRoZSBjZW50ZXIgb2YgdGhlIGRvYyBpbiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3CisgICAgICAgICAgICAgICAgaW50IG9sZFggPSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSBzY2FsZSAqIG9sZEludlNjYWxlOworICAgICAgICAgICAgICAgIGZsb2F0IHN4ID0gcmF0aW8gKiBvbGRYICsgKHJhdGlvIC0gMSkgKiBtWm9vbUNlbnRlclg7CisgICAgICAgICAgICAgICAgZmxvYXQgc3kgPSByYXRpbyAqIG9sZFkgKyAocmF0aW8gLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAobVpvb21DZW50ZXJZIC0gbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBTY2FsZSBhbGwgdGhlIGNoaWxkIHZpZXdzCisgICAgICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnNjYWxlQWxsKCk7CisKKyAgICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBoYXZlIGFuaW1hdGlvbiBmb3Igc2NhbGluZywgZG9uJ3QgZG8gYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgLy8gZm9yIHNjcm9sbGluZywgYXMgaXQgY2F1c2VzIHdlaXJkIGludGVybWVkaWF0ZSBzdGF0ZQorICAgICAgICAgICAgICAgIGludCBzY3JvbGxYID0gbVdlYlZpZXcucGluTG9jWChNYXRoLnJvdW5kKHN4KSk7CisgICAgICAgICAgICAgICAgaW50IHNjcm9sbFkgPSBtV2ViVmlldy5waW5Mb2NZKE1hdGgucm91bmQoc3kpKTsKKyAgICAgICAgICAgICAgICBpZighbVdlYlZpZXcudXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMoc2Nyb2xsWCwgc2Nyb2xsWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBhZGp1c3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyB6b29tIGFuaW1hdGlvbi4gQnV0IHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBXZWJLaXQgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgem9vbSBhbmltYXRpb24uIFNlZSBjb21tZW50cyBpbiBvblNjYWxlRW5kKCkuCisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNlbmRPdXJWaXNpYmxlUmVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhlIHdlIG5lZWQgdG8gcmVmbG93IHRoZSB0ZXh0IHRoZW4gZm9yY2UgdGhlIFZJRVdfU0laRV9DSEFOR0VECisgICAgICAgICAgICAvLyBldmVudCB0byBiZSBzZW50IHRvIFdlYktpdAorICAgICAgICAgICAgbVdlYlZpZXcuc2VuZFZpZXdTaXplWm9vbShyZWZsb3dUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkb3VibGUgdGFwIGdlc3R1cmUgY2FuIHJlc3VsdCBpbiBkaWZmZXJlbnQgYmVoYXZpb3JzIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBjb250ZW50IHRoYXQgaXMgdGFwcGVkLgorICAgICAqCisgICAgICogKDEpIFBMVUdJTlM6IElmIHRoZSB0YXBzIG9jY3VyIG9uIGEgcGx1Z2luIHRoZW4gd2UgbWF4aW1pemUgdGhlIHBsdWdpbiBvbgorICAgICAqIHRoZSBzY3JlZW4uIElmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBtYXhpbWl6ZWQgdGhlbiB6b29tIHRoZSB1c2VyIGludG8KKyAgICAgKiBvdmVydmlldyBtb2RlLgorICAgICAqCisgICAgICogKDIpIEhUTUwvT1RIRVI6IElmIHRoZSB0YXBzIG9jY3VyIG91dHNpZGUgYSBwbHVnaW4gdGhlbiB0aGUgZm9sbG93aW5nCisgICAgICogaGV1cmlzdGljIGlzIHVzZWQuCisgICAgICogICBBLiBJZiB0aGUgY3VycmVudCBzY2FsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHRleHQgd3JhcCBzY2FsZSBhbmQgdGhlCisgICAgICogICAgICBsYXlvdXQgYWxnb3JpdGhtIHNwZWNpZmllcyB0aGUgdXNlIG9mIE5BUlJPV19DT0xVTU5TLCB0aGVuIGZpdCB0bworICAgICAqICAgICAgY29sdW1uIGJ5IHJlZmxvd2luZyB0aGUgdGV4dC4KKyAgICAgKiAgIEIuIElmIHRoZSBwYWdlIGlzIG5vdCBpbiBvdmVydmlldyBtb2RlIHRoZW4gY2hhbmdlIHRvIG92ZXJ2aWV3IG1vZGUuCisgICAgICogICBDLiBJZiB0aGUgcGFnZSBpcyBpbiBvdmVybW9kZSB0aGVuIGNoYW5nZSB0byB0aGUgZGVmYXVsdCBzY2FsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVEb3VibGVUYXAoZmxvYXQgbGFzdFRvdWNoWCwgZmxvYXQgbGFzdFRvdWNoWSkgeworICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsIHx8IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzZXRab29tQ2VudGVyKGxhc3RUb3VjaFgsIGxhc3RUb3VjaFkpOworICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIGxhc3RUb3VjaFggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKChpbnQpIGxhc3RUb3VjaFkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KDApOworCisgICAgICAgIC8vIHJlbW92ZSB0aGUgem9vbSBjb250cm9sIGFmdGVyIGRvdWJsZSB0YXAKKyAgICAgICAgZGlzbWlzc1pvb21QaWNrZXIoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgZG91YmxlIHRhcCB3YXMgb24gYSBwbHVnaW4gdGhlbiBlaXRoZXIgem9vbSB0byBtYXhpbWl6ZSB0aGUKKyAgICAgICAgICogcGx1Z2luIG9uIHRoZSBzY3JlZW4gb3Igc2NhbGUgdG8gb3ZlcnZpZXcgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIFZpZXdNYW5hZ2VyLkNoaWxkVmlldyBwbHVnaW4gPSBtV2ViVmlldy5tVmlld01hbmFnZXIuaGl0VGVzdChtQW5jaG9yWCwgbUFuY2hvclkpOworICAgICAgICBpZiAocGx1Z2luICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5pc1BsdWdpbkZpdE9uU2NyZWVuKHBsdWdpbikpIHsKKyAgICAgICAgICAgICAgICB6b29tVG9PdmVydmlldygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5jZW50ZXJGaXRSZWN0KHBsdWdpbi54LCBwbHVnaW4ueSwgcGx1Z2luLndpZHRoLCBwbHVnaW4uaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXR0aW5ncy5nZXRMYXlvdXRBbGdvcml0aG0oKSA9PSBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTkFSUk9XX0NPTFVNTlMKKyAgICAgICAgICAgICAgICAmJiB3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkKKyAgICAgICAgICAgICAgICAvLyBGb3IgdGFibGV0LCBub3QgbXVjaCBuZWVkIHRvIHJlZmxvdyB0ZXh0IHcvbyBkb3VibGUgdGFwcGluZy4KKyAgICAgICAgICAgICAgICAmJiAhc2V0dGluZ3MuZ2V0VXNlRml4ZWRWaWV3cG9ydCgpKSB7CisgICAgICAgICAgICByZWZyZXNoWm9vbVNjYWxlKHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKCFtSW5ab29tT3ZlcnZpZXcpIHsKKyAgICAgICAgICAgIHpvb21Ub092ZXJ2aWV3KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6b29tVG9SZWFkaW5nTGV2ZWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRab29tT3ZlcnZpZXdXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgbVpvb21PdmVydmlld1dpZHRoID0gd2lkdGg7CisgICAgICAgIG1JbnZab29tT3ZlcnZpZXdXaWR0aCA9IDEuMGYgLyB3aWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGdldFpvb21PdmVydmlld1NjYWxlKCkgeworICAgICAgICByZXR1cm4gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgKiBtSW52Wm9vbU92ZXJ2aWV3V2lkdGg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJblpvb21PdmVydmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Jblpvb21PdmVydmlldzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgem9vbVRvT3ZlcnZpZXcoKSB7CisgICAgICAgIGlmICghd2lsbFNjYWxlVHJpZ2dlclpvb20oZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSkpIHJldHVybjsKKworICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKKyAgICAgICAgaW50IHNjcm9sbFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgIGlmIChzY3JvbGxZIDwgbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKSkgeworICAgICAgICAgICAgbVdlYlZpZXcudXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMobVdlYlZpZXcuZ2V0U2Nyb2xsWCgpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydFpvb21BbmltYXRpb24oZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHpvb21Ub1JlYWRpbmdMZXZlbCgpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgcmVhZGluZ1NjYWxlID0gZ2V0UmVhZGluZ0xldmVsU2NhbGUoKTsKKyAgICAgICAgaW50IGxlZnQgPSBtV2ViVmlldy5uYXRpdmVHZXRCbG9ja0xlZnRFZGdlKG1BbmNob3JYLCBtQW5jaG9yWSwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgaWYgKGxlZnQgIT0gV2ViVmlldy5OT19MRUZURURHRSkgeworICAgICAgICAgICAgLy8gYWRkIGEgNXB0IHBhZGRpbmcgdG8gdGhlIGxlZnQgZWRnZS4KKyAgICAgICAgICAgIGludCB2aWV3TGVmdCA9IG1XZWJWaWV3LmNvbnRlbnRUb1ZpZXdYKGxlZnQgPCA1ID8gMCA6IChsZWZ0IC0gNSkpCisgICAgICAgICAgICAgICAgICAgIC0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRoZSB6b29tIGNlbnRlciBzbyB0aGF0IHRoZSBuZXcgc2Nyb2xsIHggd2lsbCBiZQorICAgICAgICAgICAgLy8gb24gdGhlIGxlZnQgZWRnZS4KKyAgICAgICAgICAgIGlmICh2aWV3TGVmdCA+IDApIHsKKyAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSB2aWV3TGVmdCAqIHJlYWRpbmdTY2FsZSAvIChyZWFkaW5nU2NhbGUgLSBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zY3JvbGxCeSh2aWV3TGVmdCwgMCk7CisgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGFydFpvb21BbmltYXRpb24ocmVhZGluZ1NjYWxlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gY2hlY2sgdGhlIHByZWNvbmRpdGlvbnMKKyAgICAgICAgYXNzZXJ0IG1XZWJWaWV3LmdldFNldHRpbmdzKCkgIT0gbnVsbDsKKworICAgICAgICBmaW5hbCBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtU3VwcG9ydE11bHRpVG91Y2ggPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSCkKKyAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5zdXBwb3J0Wm9vbSgpICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKTsKKyAgICAgICAgbUFsbG93UGFuQW5kU2NhbGUgPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKAorICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSF9ESVNUSU5DVCk7CisgICAgICAgIGlmIChtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yID09IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG5ldyBTY2FsZUdlc3R1cmVEZXRlY3Rvcihjb250ZXh0LCBuZXcgU2NhbGVEZXRlY3Rvckxpc3RlbmVyKCkpOworICAgICAgICB9IGVsc2UgaWYgKCFtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yICE9IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpVG91Y2hab29tKCkgeworICAgICAgICByZXR1cm4gbVN1cHBvcnRNdWx0aVRvdWNoOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUGFuRHVyaW5nWm9vbSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvd1BhbkFuZFNjYWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBjYWxsZXIgdGhhdCB0aGUgWm9vbU1hbmFnZXIgaXMgcmVxdWVzdGluZyB0aGF0IHNjYWxlIHJlbGF0ZWQKKyAgICAgKiB1cGRhdGVzIHNob3VsZCBub3QgYmUgc2VudCB0byB3ZWJraXQuIFRoaXMgY2FuIG9jY3VyIGluIGNhc2VzIHdoZXJlIHRoZQorICAgICAqIFpvb21NYW5hZ2VyIGlzIHBlcmZvcm1pbmcgYW4gYW5pbWF0aW9uIGFuZCBkb2VzIG5vdCB3YW50IHdlYmtpdCB0byB1cGRhdGUKKyAgICAgKiB1bnRpbCB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNjYWxlIHJlbGF0ZWQgdXBkYXRlcyBzaG91bGQgbm90IGJlIHNlbnQgdG8gd2Via2l0IGFuZAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSB7CisgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IGFuaW1hdGluZyBhIG11bHRpLXRvdWNoIHpvb20gcHJldmVudHMgdXBkYXRlcywgYnV0CisgICAgICAgIC8vIG90aGVycyBjYW4gYWRkIHRoZWlyIG93biBjb25kaXRpb25zIHRvIHRoaXMgbWV0aG9kIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgcmV0dXJuIG1QaW5jaFRvWm9vbUFuaW1hdGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZ2V0TXVsdGlUb3VjaEdlc3R1cmVEZXRlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZURldGVjdG9yOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2NhbGVEZXRlY3Rvckxpc3RlbmVyIGltcGxlbWVudHMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IuT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBkaXNtaXNzWm9vbVBpY2tlcigpOworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnN0YXJ0Wm9vbSgpOworICAgICAgICAgICAgbVdlYlZpZXcub25QaW5jaFRvWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGUoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5yb3VuZChkZXRlY3Rvci5nZXRTY2FsZUZhY3RvcigpICogbUFjdHVhbFNjYWxlICogMTAwKSAqIDAuMDFmOworICAgICAgICAgICAgaWYgKHdpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKSkgeworICAgICAgICAgICAgICAgIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gbGltaXQgdGhlIHNjYWxlIGNoYW5nZSBwZXIgc3RlcAorICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+IG1BY3R1YWxTY2FsZSkgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAxLjI1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1heChzY2FsZSwgbUFjdHVhbFNjYWxlICogMC44Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFpvb21DZW50ZXIoZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpKTsKKyAgICAgICAgICAgICAgICBzZXRab29tU2NhbGUoc2NhbGUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNjYWxlRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBpZiAobVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCByZWZsb3cgd2hlbiB6b29tIGluOyB3aGVuIHpvb20gb3V0LCBkbyByZWZsb3cgaWYgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHNjYWxlIGlzIGFsbW9zdCBtaW5pbXVtIHNjYWxlOworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVmbG93Tm93ID0gIWNhblpvb21PdXQoKSB8fCAobUFjdHVhbFNjYWxlIDw9IDAuOCAqIG1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSB6b29tIGFmdGVyIG1QcmV2aWV3Wm9vbU9ubHkgaXMgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHZpZXcgc2l6ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV2ViS2l0CisgICAgICAgICAgICAgICAgcmVmcmVzaFpvb21TY2FsZShyZWZsb3dOb3cpOworICAgICAgICAgICAgICAgIC8vIGNhbGwgaW52YWxpZGF0ZSgpIHRvIGRyYXcgd2l0aG91dCB6b29tIGZpbHRlcgorICAgICAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLmVuZFpvb20oKTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uUGluY2hUb1pvb21BbmltYXRpb25FbmQoZGV0ZWN0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvdywgaW50IG9oKSB7CisgICAgICAgIC8vIHJlc2V0IHpvb20gYW5kIGFuY2hvciB0byB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBzY3JlZW4KKyAgICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IHpvb21pbmcKKyAgICAgICAgaWYgKCFpc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICBpbnQgdmlzaWJsZVRpdGxlSGVpZ2h0ID0gbVdlYlZpZXcuZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCk7CisgICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOworICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gdmlzaWJsZVRpdGxlSGVpZ2h0OworICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WChtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSh2aXNpYmxlVGl0bGVIZWlnaHQgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIG1NaW5ab29tU2NhbGUgaWYgdGhlIG1pbmltdW0gem9vbSBzY2FsZSBpcyBub3QgZml4ZWQKKyAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgICAgIC8vIHdoZW4gY2hhbmdlIGZyb20gbmFycm93IHNjcmVlbiB0byB3aWRlIHNjcmVlbiwgdGhlIG5ldyB2aWV3V2lkdGgKKyAgICAgICAgICAgIC8vIGNhbiBiZSB3aWRlciB0aGFuIHRoZSBvbGQgY29udGVudCB3aWR0aC4gV2UgbGltaXQgdGhlIG1pbmltdW0KKyAgICAgICAgICAgIC8vIHNjYWxlIHRvIDEuMGYuIFRoZSBwcm9wZXIgbWluaW11bSBzY2FsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIG5ldyBwaWN0dXJlIHNob3dzIHVwLgorICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IE1hdGgubWluKDEuMGYsIChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVdlYlZpZXcuZHJhd0hpc3RvcnkoKSA/IG1XZWJWaWV3LmdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVpvb21PdmVydmlld1dpZHRoKSk7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgbWluWm9vbVNjYWxlIHRvIHRoZSBpbml0aWFsU2NhbGUgaWYgaXQgaXMgc2V0CisgICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZSA+IDAgJiYgbUluaXRpYWxTY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisKKyAgICAgICAgLy8gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCBkdXJpbmcgV2ViVmlldyBsYXlvdXQuIEFuZCBhbnkKKyAgICAgICAgLy8gcmVxdWVzdExheW91dCgpIGlzIGJsb2NrZWQgZHVyaW5nIGxheW91dC4gQXMgcmVmcmVzaFpvb21TY2FsZSgpIHdpbGwKKyAgICAgICAgLy8gY2F1c2UgaXRzIGNoaWxkIFZpZXcgdG8gcmVwb3NpdGlvbiBpdHNlbGYgdGhyb3VnaCBWaWV3TWFuYWdlcidzCisgICAgICAgIC8vIHNjYWxlQWxsKCksIHdlIG5lZWQgdG8gcG9zdCBhIFJ1bm5hYmxlIHRvIGVuc3VyZSByZXF1ZXN0TGF5b3V0KCkuCisgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgb25seSB1cGRhdGUgdGhlIHRleHQgd3JhcCBzY2FsZSBpZiB0aGUgd2lkdGggY2hhbmdlZC4KKyAgICAgICAgbVdlYlZpZXcucG9zdChuZXcgUG9zdFNjYWxlKHcgIT0gb3cpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvc3RTY2FsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtVXBkYXRlVGV4dFdyYXA7CisKKyAgICAgICAgcHVibGljIFBvc3RTY2FsZShib29sZWFuIHVwZGF0ZVRleHRXcmFwKSB7CisgICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhbHdheXMgZm9yY2UsIGluIGNhc2Ugb3VyIGhlaWdodCBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHdlCisgICAgICAgICAgICAgICAgLy8gc3RpbGwgd2FudCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb3ZlciB0byB3ZWJraXQuCisgICAgICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKE1hdGgubWF4KG1BY3R1YWxTY2FsZSwgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSksCisgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlWm9vbVJhbmdlKFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUsCisgICAgICAgICAgICBpbnQgdmlld1dpZHRoLCBpbnQgbWluUHJlZldpZHRoKSB7CisgICAgICAgIGlmICh2aWV3U3RhdGUubU1pblNjYWxlID09IDApIHsKKyAgICAgICAgICAgIGlmICh2aWV3U3RhdGUubU1vYmlsZVNpdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobWluUHJlZldpZHRoID4gTWF0aC5tYXgoMCwgdmlld1dpZHRoKSkgeworICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtaW5QcmVmV2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubURlZmF1bHRTY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubU1pblNjYWxlOworICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld1N0YXRlLm1NYXhTY2FsZSA9PSAwKSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gdmlld1N0YXRlLm1NYXhTY2FsZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld1N0YXRlLm1WaWV3cG9ydFdpZHRoID4gMCAmJgorICAgICAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VGaXhlZFZpZXdwb3J0KCkgJiYKKyAgICAgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKKyAgICAgICAgICAgIC8vIFVzZSB3ZWJzaXRlIHNwZWNpZmllZCB2aWV3cG9ydCB3aWR0aC4KKyAgICAgICAgICAgIHNldFpvb21PdmVydmlld1dpZHRoKHZpZXdTdGF0ZS5tVmlld3BvcnRXaWR0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHpvb20gdmFsdWVzIHdoZW4gV2Via2l0IHByb2R1Y2VzIGEgbmV3IHBpY3R1cmUuIFRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCdzIG1lc3NhZ2UgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbk5ld1BpY3R1cmUoV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhd0RhdGEpIHsKKyAgICAgICAgZmluYWwgaW50IHZpZXdXaWR0aCA9IG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpOworCisgICAgICAgIGlmICghbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VGaXhlZFZpZXdwb3J0KCkKKyAgICAgICAgICAgICYmIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKKyAgICAgICAgICAgIC8vIGxpbWl0IG1ab29tT3ZlcnZpZXdXaWR0aCB1cHBlciBib3VuZCB0bworICAgICAgICAgICAgLy8gc01heFZpZXdwb3J0V2lkdGggc28gdGhhdCBpZiB0aGUgcGFnZSBkb2Vzbid0IGJlaGF2ZQorICAgICAgICAgICAgLy8gd2VsbCwgdGhlIFdlYlZpZXcgd29uJ3QgZ28gaW5zYW5lLiBsaW1pdCB0aGUgbG93ZXIKKyAgICAgICAgICAgIC8vIGJvdW5kIHRvIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxlIGZvciBtb2JpbGUgc2l0ZXMuCisgICAgICAgICAgICBzZXRab29tT3ZlcnZpZXdXaWR0aChNYXRoLm1pbihXZWJWaWV3LnNNYXhWaWV3cG9ydFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgoaW50KSAodmlld1dpZHRoICogbUludkRlZmF1bHRTY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZHJhd0RhdGEubU1pblByZWZXaWR0aCwgZHJhd0RhdGEubVZpZXdQb2ludC54KSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGZsb2F0IHpvb21PdmVydmlld1NjYWxlID0gZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKTsKKyAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB6b29tT3ZlcnZpZXdTY2FsZTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaXQgdGhlIGNvbnRlbnQgd2lkdGggdG8gdGhlIGN1cnJlbnQgdmlldy4gSWdub3JlIHRoZSByb3VuZGluZyBlcnJvciBjYXNlLgorICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkgJiYgKG1Jbml0aWFsWm9vbU92ZXJ2aWV3IHx8IChtSW5ab29tT3ZlcnZpZXcKKyAgICAgICAgICAgICAgICAmJiBNYXRoLmFicygodmlld1dpZHRoICogbUludkFjdHVhbFNjYWxlKSAtIG1ab29tT3ZlcnZpZXdXaWR0aCkgPiAxKSkpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisgICAgICAgICAgICBzZXRab29tU2NhbGUoem9vbU92ZXJ2aWV3U2NhbGUsICF3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB6b29tIHZhbHVlcyBhZnRlciBXZWJraXQgY29tcGxldGVzIHRoZSBpbml0aWFsIHBhZ2UgbGF5b3V0LiBJdAorICAgICAqIGlzIGNhbGxlZCB3aGVuIHZpc2l0aW5nIGEgcGFnZSBmb3IgdGhlIGZpcnN0IHRpbWUgYXMgd2VsbCBhcyB3aGVuIHRoZQorICAgICAqIHVzZXIgbmF2aWdhdGVzIGJhY2sgdG8gYSBwYWdlIChpbiB3aGljaCBjYXNlIHdlIG1heSBuZWVkIHRvIHJlc3RvcmUgdGhlCisgICAgICogem9vbSBsZXZlbHMgdG8gdGhlIHN0YXRlIHRoZXkgd2VyZSB3aGVuIHlvdSBsZWZ0IHRoZSBwYWdlKS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRmlyc3RMYXlvdXQoV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhd0RhdGEpIHsKKyAgICAgICAgLy8gcHJlY29uZGl0aW9uIGNoZWNrCisgICAgICAgIGFzc2VydCBkcmF3RGF0YSAhPSBudWxsOworICAgICAgICBhc3NlcnQgZHJhd0RhdGEubVZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICBhc3NlcnQgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsOworCisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3RGF0YS5tVmlld1N0YXRlOworICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXdEYXRhLm1WaWV3UG9pbnQ7CisgICAgICAgIHVwZGF0ZVpvb21SYW5nZSh2aWV3U3RhdGUsIHZpZXdTaXplLngsIGRyYXdEYXRhLm1NaW5QcmVmV2lkdGgpOworCisgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSkgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGU7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlZmxvd1RleHQ7CisKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIHNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgICAgICByZWZsb3dUZXh0ID0gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KG1UZXh0V3JhcFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZXdTdGF0ZS5tVmlld1NjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gdmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlOworICAgICAgICAgICAgICAgIHNjYWxlID0gdmlld1N0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgcmVmbG93VGV4dCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpCisgICAgICAgICAgICAgICAgICAgICYmIChzZXR0aW5ncy5nZXRMb2FkV2l0aE92ZXJ2aWV3TW9kZSgpIHx8IHNldHRpbmdzLmdldFVzZUZpeGVkVmlld3BvcnQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxab29tT3ZlcnZpZXcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSB2aWV3U3RhdGUubVRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZmxvd1RleHQgPSBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIHNjYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCk7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZAorICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZVpvb21TdGF0ZShCdW5kbGUgYikgeworICAgICAgICBiLnB1dEZsb2F0KCJzY2FsZSIsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIGIucHV0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtVGV4dFdyYXBTY2FsZSk7CisgICAgICAgIGIucHV0Qm9vbGVhbigib3ZlcnZpZXciLCBtSW5ab29tT3ZlcnZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVab29tU3RhdGUoQnVuZGxlIGIpIHsKKyAgICAgICAgLy8gYXMgZ2V0V2lkdGgoKSAvIGdldEhlaWdodCgpIG9mIHRoZSB2aWV3IGFyZSBub3QgYXZhaWxhYmxlIHlldCwgc2V0IHVwCisgICAgICAgIC8vIG1BY3R1YWxTY2FsZSwgc28gdGhhdCB3aGVuIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQsIHRoZSByZXN0IHdpbGwKKyAgICAgICAgLy8gYmUgc2V0IGNvcnJlY3RseQorICAgICAgICBtQWN0dWFsU2NhbGUgPSBiLmdldEZsb2F0KCJzY2FsZSIsIDEuMGYpOworICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gbUFjdHVhbFNjYWxlOworICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGIuZ2V0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtQWN0dWFsU2NhbGUpOworICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBiLmdldEJvb2xlYW4oIm92ZXJ2aWV3Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQ29udHJvbEJhc2UgZ2V0Q3VycmVudFpvb21Db250cm9sKCkgeworICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsICYmIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc3VwcG9ydFpvb20oKSkgeworICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7CisgICAgICAgICAgICAgICAgaWYgKChtRW1iZWRkZWRab29tQ29udHJvbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXREaXNwbGF5Wm9vbUNvbnRyb2xzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVtYmVkZGVkWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFbWJlZGRlZCh0aGlzLCBtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRW1iZWRkZWRab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1FeHRlcm5hbFpvb21Db250cm9sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUV4dGVybmFsWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFeHRlcm5hbChtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2Vab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc21pc3Nab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLmhpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzWm9vbVBpY2tlclZpc2libGUoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIHJldHVybiAoY29udHJvbCAhPSBudWxsKSA/IGNvbnRyb2wuaXNWaXNpYmxlKCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnVwZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVtYmVkZGVkIHpvb20gY29udHJvbCBpbnRlcmNlcHRzIHRvdWNoIGV2ZW50cyBhbmQgYXV0b21hdGljYWxseSBzdGF5cworICAgICAqIHZpc2libGUuIFRoZSBleHRlcm5hbCBjb250cm9sIG5lZWRzIHRvIGNvbnN0YW50bHkgcmVmcmVzaCBpdHMgaW50ZXJuYWwKKyAgICAgKiB0aW1lciB0byBzdGF5IHZpc2libGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQga2VlcFpvb21QaWNrZXJWaXNpYmxlKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0RXh0ZXJuYWxab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbC5nZXRDb250cm9scygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCmluZGV4IDYyNjBjZGIuLmM2OTRmZjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKQEAgLTM0LDExICszNCwxNiBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvbmdTcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNDYsNyArNTEsNiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5CYXNlSW5wdXRDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CkBAIC03MCwxMCArNzQsMTIgQEAKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0Fic0xpc3RWaWV3X2NhY2hlQ29sb3JIaW50CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBYnNMaXN0Vmlld19mYXN0U2Nyb2xsRW5hYmxlZAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWJzTGlzdFZpZXdfc21vb3RoU2Nyb2xsYmFyCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBYnNMaXN0Vmlld19jaG9pY2VNb2RlCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnNMaXN0VmlldyBleHRlbmRzIEFkYXB0ZXJWaWV3PExpc3RBZGFwdGVyPiBpbXBsZW1lbnRzIFRleHRXYXRjaGVyLAogICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIsIEZpbHRlci5GaWx0ZXJMaXN0ZW5lciwKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlci5PblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgVmlld1RyZWVPYnNlcnZlci5PblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyLAorICAgICAgICBSZW1vdGVWaWV3c0FkYXB0ZXIuUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayB7CiAKICAgICAvKioKICAgICAgKiBEaXNhYmxlcyB0aGUgdHJhbnNjcmlwdCBtb2RlLgpAQCAtMTMwLDE3ICsxMzYsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9GTElORyA9IDQ7CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhlIHRvdWNoIGdlc3R1cmUgaXMgYW4gb3ZlcnNjcm9sbCAtIGEgc2Nyb2xsIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9yIGVuZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFRPVUNIX01PREVfT1ZFUlNDUk9MTCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgYmVpbmcgZmx1bmcgb3V0c2lkZSBvZiBub3JtYWwgY29udGVudCBib3VuZHMKLSAgICAgKiBhbmQgd2lsbCBzcHJpbmcgYmFjay4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFRPVUNIX01PREVfT1ZFUkZMSU5HID0gNjsKLQotICAgIC8qKgogICAgICAqIFJlZ3VsYXIgbGF5b3V0IC0gdXN1YWxseSBhbiB1bnNvbGljaXRlZCBsYXlvdXQgZnJvbSB0aGUgdmlldyBzeXN0ZW0KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IExBWU9VVF9OT1JNQUwgPSAwOwpAQCAtMTc4LDYgKzE3Myw1NyBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX01PVkVfU0VMRUNUSU9OID0gNjsKIAogICAgIC8qKgorICAgICAqIE5vcm1hbCBsaXN0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2hvaWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGxpc3QgYWxsb3dzIHVwIHRvIG9uZSBjaG9pY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9TSU5HTEUgPSAxOworCisgICAgLyoqCisgICAgICogVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcyBpbiBhIG1vZGFsIHNlbGVjdGlvbiBtb2RlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgPSAzOworCisgICAgLyoqCisgICAgICogQ29udHJvbHMgaWYvaG93IHRoZSB1c2VyIG1heSBjaG9vc2UvY2hlY2sgaXRlbXMgaW4gdGhlIGxpc3QKKyAgICAgKi8KKyAgICBpbnQgbUNob2ljZU1vZGUgPSBDSE9JQ0VfTU9ERV9OT05FOworCisgICAgLyoqCisgICAgICogQ29udHJvbHMgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwuIG51bGwgd2hlbiBpbmFjdGl2ZS4KKyAgICAgKi8KKyAgICBBY3Rpb25Nb2RlIG1DaG9pY2VBY3Rpb25Nb2RlOworCisgICAgLyoqCisgICAgICogV3JhcHBlciBmb3IgdGhlIG11bHRpcGxlIGNob2ljZSBtb2RlIGNhbGxiYWNrOyBBYnNMaXN0VmlldyBuZWVkcyB0byBwZXJmb3JtCisgICAgICogYSBmZXcgZXh0cmEgYWN0aW9ucyBhcm91bmQgd2hhdCBhcHBsaWNhdGlvbiBjb2RlIGRvZXMuCisgICAgICovCisgICAgTXVsdGlDaG9pY2VNb2RlV3JhcHBlciBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBSdW5uaW5nIGNvdW50IG9mIGhvdyBtYW55IGl0ZW1zIGFyZSBjdXJyZW50bHkgY2hlY2tlZAorICAgICAqLworICAgIGludCBtQ2hlY2tlZEl0ZW1Db3VudDsKKworICAgIC8qKgorICAgICAqIFJ1bm5pbmcgc3RhdGUgb2Ygd2hpY2ggcG9zaXRpb25zIGFyZSBjdXJyZW50bHkgY2hlY2tlZAorICAgICAqLworICAgIFNwYXJzZUJvb2xlYW5BcnJheSBtQ2hlY2tTdGF0ZXM7CisKKyAgICAvKioKKyAgICAgKiBSdW5uaW5nIHN0YXRlIG9mIHdoaWNoIElEcyBhcmUgY3VycmVudGx5IGNoZWNrZWQKKyAgICAgKi8KKyAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gbUNoZWNrZWRJZFN0YXRlczsKKworICAgIC8qKgogICAgICAqIENvbnRyb2xzIGhvdyB0aGUgbmV4dCBsYXlvdXQgd2lsbCBoYXBwZW4KICAgICAgKi8KICAgICBpbnQgbUxheW91dE1vZGUgPSBMQVlPVVRfTk9STUFMOwpAQCAtMTkzLDYgKzIzOSwxMSBAQAogICAgIExpc3RBZGFwdGVyIG1BZGFwdGVyOwogCiAgICAgLyoqCisgICAgICogVGhlIHJlbW90ZSBhZGFwdGVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgZGlzcGxheWVkIGJ5IHRoaXMgdmlldyB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzQWRhcHRlciBtUmVtb3RlQWRhcHRlcjsKKworICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBsaXN0IHNlbGVjdG9yIHNob3VsZCBiZSBkcmF3biBvbiB0b3Agb2YgdGhlIGNoaWxkcmVuIG9yIGJlaGluZAogICAgICAqLwogICAgIGJvb2xlYW4gbURyYXdTZWxlY3Rvck9uVG9wID0gZmFsc2U7CkBAIC0zODIsMTYgKzQzMyw2IEBACiAgICAgcHJpdmF0ZSBDb250ZXh0TWVudUluZm8gbUNvbnRleHRNZW51SW5mbyA9IG51bGw7CiAgICAgCiAgICAgLyoqCi0gICAgICogTWF4aW11bSBkaXN0YW5jZSB0byByZWNvcmQgb3ZlcnNjcm9sbAotICAgICAqLwotICAgIGludCBtT3ZlcnNjcm9sbE1heDsKLQotICAgIC8qKgotICAgICAqIENvbnRlbnQgaGVpZ2h0IGRpdmlkZWQgYnkgdGhpcyBpcyB0aGUgb3ZlcnNjcm9sbCBsaW1pdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfTElNSVRfRElWSVNPUiA9IDM7Ci0KLSAgICAvKioKICAgICAgKiBVc2VkIHRvIHJlcXVlc3QgYSBsYXlvdXQgd2hlbiB3ZSBjaGFuZ2VkIHRvdWNoIG1vZGUKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9VTktOT1dOID0gLTE7CkBAIC00ODQsNDggKzUyNSw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOwogCiAgICAgLyoqCi0gICAgICogTWF4aW11bSBkaXN0YW5jZSB0byBvdmVyc2Nyb2xsIGJ5IGR1cmluZyBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBpbnQgbU92ZXJzY3JvbGxEaXN0YW5jZTsKLQotICAgIC8qKgotICAgICAqIE1heGltdW0gZGlzdGFuY2UgdG8gb3ZlcmZsaW5nIGR1cmluZyBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBpbnQgbU92ZXJmbGluZ0Rpc3RhbmNlOwotCi0gICAgLy8gVGhlc2UgdHdvIEVkZ2VHbG93cyBhcmUgYWx3YXlzIHNldCBhbmQgdXNlZCB0b2dldGhlci4KLSAgICAvLyBDaGVja2luZyBvbmUgZm9yIG51bGwgaXMgYXMgZ29vZCBhcyBjaGVja2luZyBib3RoLgotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBzdGF0ZSBvZiB0aGUgdG9wIGVkZ2UgZ2xvdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1RvcDsKLQotICAgIC8qKgotICAgICAqIFRyYWNrcyB0aGUgc3RhdGUgb2YgdGhlIGJvdHRvbSBlZGdlIGdsb3cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFZGdlR2xvdyBtRWRnZUdsb3dCb3R0b207Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlc3RpbWF0ZSBvZiBob3cgbWFueSBwaXhlbHMgYXJlIGJldHdlZW4gdGhlIHRvcCBvZiB0aGUgbGlzdCBhbmQKLSAgICAgKiB0aGUgdG9wIG9mIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgYWRhcHRlciwgYmFzZWQgb24gdGhlIGxhc3QgdGltZQotICAgICAqIHdlIHNhdyBpdC4gVXNlZCB0byBoaW50IHdoZXJlIHRvIGRyYXcgZWRnZSBnbG93cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtRmlyc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3M7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlc3RpbWF0ZSBvZiBob3cgbWFueSBwaXhlbHMgYXJlIGJldHdlZW4gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdCBhbmQKLSAgICAgKiB0aGUgYm90dG9tIG9mIHRoZSBsYXN0IHBvc2l0aW9uIGluIHRoZSBhZGFwdGVyLCBiYXNlZCBvbiB0aGUgbGFzdCB0aW1lCi0gICAgICogd2Ugc2F3IGl0LiBVc2VkIHRvIGhpbnQgd2hlcmUgdG8gZHJhdyBlZGdlIGdsb3dzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1MYXN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzOwotCi0gICAgLyoqCi0gICAgICogVXNlZCBmb3IgZGV0ZXJtaW5pbmcgd2hlbiB0byBjYW5jZWwgb3V0IG9mIG92ZXJzY3JvbGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbURpcmVjdGlvbiA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGxpc3Qgb3IgZ3JpZAogICAgICAqIGhhcyBiZWVuIHNjcm9sbGVkLgogICAgICAqLwpAQCAtNjI0LDYgKzYyMywxOCBAQAogCiAgICAgICAgIGJvb2xlYW4gc21vb3RoU2Nyb2xsYmFyID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkFic0xpc3RWaWV3X3Ntb290aFNjcm9sbGJhciwgdHJ1ZSk7CiAgICAgICAgIHNldFNtb290aFNjcm9sbGJhckVuYWJsZWQoc21vb3RoU2Nyb2xsYmFyKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIGludCBhZGFwdGVySWQgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfYWRhcHRlciwgMCk7CisgICAgICAgIGlmIChhZGFwdGVySWQgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjID0gY29udGV4dDsKKyAgICAgICAgICAgIHBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QWRhcHRlcihBZGFwdGVycy5sb2FkQWRhcHRlcihjLCBhZGFwdGVySWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHNldENob2ljZU1vZGUoYS5nZXRJbnQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfY2hvaWNlTW9kZSwgQ0hPSUNFX01PREVfTk9ORSkpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KQEAgLTY0MCwzOSArNjUxLDMxMiBAQAogICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgbU1pbmltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWluaW11bUZsaW5nVmVsb2NpdHkoKTsKICAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKLQogICAgICAgICBtRGVuc2l0eVNjYWxlID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlclNjcm9sbE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUl9TQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZWRnZSA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm92ZXJzY3JvbGxfZWRnZSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZ2xvdyA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm92ZXJzY3JvbGxfZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FZGdlR2xvd1RvcCA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20gPSBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldE92ZXJTY3JvbGxNb2RlKG1vZGUpOworCisgICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGxpc3QgY29udGVudCBjdXJyZW50bHkgZml0cyB3aXRoaW4gdGhlIHZpZXcgYm91bmRhcmllcworICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBjdXJyZW50bHkgc2VsZWN0ZWQuIFRoaXMgd2lsbCBvbmx5IGJlIHZhbGlkCisgICAgICogaWYgdGhlIGNob2ljZSBtb2RlIGlzIG5vdCB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9IChkZWZhdWx0KS4KKyAgICAgKgorICAgICAqIDxwPlRvIGRldGVybWluZSB0aGUgc3BlY2lmaWMgaXRlbXMgdGhhdCBhcmUgY3VycmVudGx5IHNlbGVjdGVkLCB1c2Ugb25lIG9mCisgICAgICogdGhlIDxjb2RlPmdldENoZWNrZWQqPC9jb2RlPiBtZXRob2RzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSBzZWxlY3RlZAorICAgICAqCisgICAgICogQHNlZSAjZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbigpCisgICAgICogQHNlZSAjZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMoKQorICAgICAqIEBzZWUgI2dldENoZWNrZWRJdGVtSWRzKCkKICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGVudEZpdHMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOwotICAgICAgICBpZiAoY2hpbGRDb3VudCAhPSBtSXRlbUNvdW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcHVibGljIGludCBnZXRDaGVja2VkSXRlbUNvdW50KCkgeworICAgICAgICByZXR1cm4gbUNoZWNrZWRJdGVtQ291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgcmVzdWx0IGlzIG9ubHkKKyAgICAgKiB2YWxpZCBpZiB0aGUgY2hvaWNlIG1vZGUgaGFzIGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfQorICAgICAqIG9yIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9LgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgdG8gcmV0dXJuCisgICAgICogQHJldHVybiBUaGUgaXRlbSdzIGNoZWNrZWQgc3RhdGUgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGNob2ljZSBtb2RlCisgICAgICogICAgICAgICBpcyBpbnZhbGlkCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0l0ZW1DaGVja2VkKGludCBwb3NpdGlvbikgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGdldENoaWxkQXQoMCkuZ2V0VG9wKCkgPj0gMCAmJiBnZXRDaGlsZEF0KGNoaWxkQ291bnQgLSAxKS5nZXRCb3R0b20oKSA8PSBtQm90dG9tOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbS4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBjaG9pY2UKKyAgICAgKiBtb2RlIGhhcyBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbSBvcgorICAgICAqICAgICAgICAge0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiBub3RoaW5nIGlzIHNlbGVjdGVkCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtUG9zaXRpb24oKSB7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9TSU5HTEUgJiYgbUNoZWNrU3RhdGVzICE9IG51bGwgJiYgbUNoZWNrU3RhdGVzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmtleUF0KDApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIElOVkFMSURfUE9TSVRJT047CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaW4gdGhlIGxpc3QuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZgorICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgbm90IGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICBBIFNwYXJzZUJvb2xlYW5BcnJheSB3aGljaCB3aWxsIHJldHVybiB0cnVlIGZvciBlYWNoIGNhbGwgdG8KKyAgICAgKiAgICAgICAgICBnZXQoaW50IHBvc2l0aW9uKSB3aGVyZSBwb3NpdGlvbiBpcyBhIHBvc2l0aW9uIGluIHRoZSBsaXN0LAorICAgICAqICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KKyAgICAgKiAgICAgICAgICB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LgorICAgICAqLworICAgIHB1YmxpYyBTcGFyc2VCb29sZWFuQXJyYXkgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMoKSB7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQorICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSBhbmQgdGhlIGFkYXB0ZXIKKyAgICAgKiBoYXMgc3RhYmxlIElEcy4gKHtAbGluayBMaXN0QWRhcHRlciNoYXNTdGFibGVJZHMoKX0gPT0ge0Bjb2RlIHRydWV9KQorICAgICAqCisgICAgICogQHJldHVybiBBIG5ldyBhcnJheSB3aGljaCBjb250YWlucyB0aGUgaWQgb2YgZWFjaCBjaGVja2VkIGl0ZW0gaW4gdGhlCisgICAgICogICAgICAgICBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBsb25nW10gZ2V0Q2hlY2tlZEl0ZW1JZHMoKSB7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FIHx8IG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCB8fCBtQWRhcHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IGxvbmdbMF07CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gaWRTdGF0ZXMgPSBtQ2hlY2tlZElkU3RhdGVzOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpZFN0YXRlcy5zaXplKCk7CisgICAgICAgIGZpbmFsIGxvbmdbXSBpZHMgPSBuZXcgbG9uZ1tjb3VudF07CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZHNbaV0gPSBpZFN0YXRlcy5rZXlBdChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGNob2ljZXMgcHJldmlvdXNseSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckNob2ljZXMoKSB7CisgICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIG1DaGVja2VkSXRlbUNvdW50ID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSBpcyBvbmx5IHZhbGlkIGlmCisgICAgICogdGhlIGNob2ljZSBtb2RlIGhhcyBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0gb3IKKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgaXRlbSB3aG9zZSBjaGVja2VkIHN0YXRlIGlzIHRvIGJlIGNoZWNrZWQKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBjaGVja2VkIHN0YXRlIGZvciB0aGUgaXRlbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1DaGVja2VkKGludCBwb3NpdGlvbiwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgc2VsZWN0aW9uIG1vZGUgaWYgbmVlZGVkLiBXZSBkb24ndCBuZWVkIHRvIGlmIHdlJ3JlIHVuY2hlY2tpbmcgc29tZXRoaW5nLgorICAgICAgICBpZiAodmFsdWUgJiYgbUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgJiYgbUNob2ljZUFjdGlvbk1vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUobU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRSB8fCBtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCkgeworICAgICAgICAgICAgYm9vbGVhbiBvbGRWYWx1ZSA9IG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pOworICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdmFsdWUpOworICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuZGVsZXRlKG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1DaG9pY2VBY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkID0gbUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2sub25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChtQ2hvaWNlQWN0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLCBpZCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVJZHMgPSBtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCk7CisgICAgICAgICAgICAvLyBDbGVhciBhbGwgdmFsdWVzIGlmIHdlJ3JlIGNoZWNraW5nIHNvbWV0aGluZywgb3IgdW5jaGVja2luZyB0aGUgY3VycmVudGx5CisgICAgICAgICAgICAvLyBzZWxlY3RlZCBpdGVtCisgICAgICAgICAgICBpZiAodmFsdWUgfHwgaXNJdGVtQ2hlY2tlZChwb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpZiAodXBkYXRlSWRzKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0aGlzIG1heSBlbmQgdXAgc2VsZWN0aW5nIHRoZSB2YWx1ZSB3ZSBqdXN0IGNsZWFyZWQgYnV0IHRoaXMgd2F5CisgICAgICAgICAgICAvLyB3ZSBlbnN1cmUgbGVuZ3RoIG9mIG1DaGVja1N0YXRlcyBpcyAxLCBhIGZhY3QgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbiByZWxpZXMgb24KKyAgICAgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2hlY2tTdGF0ZXMuc2l6ZSgpID09IDAgfHwgIW1DaGVja1N0YXRlcy52YWx1ZUF0KDApKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gbm90IGdlbmVyYXRlIGEgZGF0YSBjaGFuZ2Ugd2hpbGUgd2UgYXJlIGluIHRoZSBsYXlvdXQgcGhhc2UKKyAgICAgICAgaWYgKCFtSW5MYXlvdXQgJiYgIW1CbG9ja0xheW91dFJlcXVlc3RzKSB7CisgICAgICAgICAgICBtRGF0YUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgcmVtZW1iZXJTeW5jU3RhdGUoKTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMICYmIG1DaG9pY2VBY3Rpb25Nb2RlICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5kZWxldGUobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DaG9pY2VBY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrLm9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQobUNob2ljZUFjdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sIGlkLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9TSU5HTEUpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaGVja1N0YXRlcy5zaXplKCkgPT0gMCB8fCAhbUNoZWNrU3RhdGVzLnZhbHVlQXQoMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKworICAgICAgICBoYW5kbGVkIHw9IHN1cGVyLnBlcmZvcm1JdGVtQ2xpY2sodmlldywgcG9zaXRpb24sIGlkKTsKKworICAgICAgICByZXR1cm4gaGFuZGxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgY2hvaWNlIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENob2ljZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBtQ2hvaWNlTW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBjaG9pY2UgYmVoYXZpb3IgZm9yIHRoZSBMaXN0LiBCeSBkZWZhdWx0LCBMaXN0cyBkbyBub3QgaGF2ZSBhbnkgY2hvaWNlIGJlaGF2aW9yCisgICAgICogKHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0pLiBCeSBzZXR0aW5nIHRoZSBjaG9pY2VNb2RlIHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgdGhlCisgICAgICogTGlzdCBhbGxvd3MgdXAgdG8gb25lIGl0ZW0gdG8gIGJlIGluIGEgY2hvc2VuIHN0YXRlLiBCeSBzZXR0aW5nIHRoZSBjaG9pY2VNb2RlIHRvCisgICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0sIHRoZSBsaXN0IGFsbG93cyBhbnkgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIGNob3Nlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaG9pY2VNb2RlIE9uZSBvZiB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LCB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0sIG9yCisgICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaG9pY2VNb2RlKGludCBjaG9pY2VNb2RlKSB7CisgICAgICAgIG1DaG9pY2VNb2RlID0gY2hvaWNlTW9kZTsKKyAgICAgICAgaWYgKG1DaG9pY2VBY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaG9pY2VBY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7CisgICAgICAgICAgICBpZiAobUNoZWNrU3RhdGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMgPSBuZXcgU3BhcnNlQm9vbGVhbkFycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsICYmIG1BZGFwdGVyICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID0gbmV3IExvbmdTcGFyc2VBcnJheTxCb29sZWFuPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTW9kYWwgbXVsdGktY2hvaWNlIG1vZGUgb25seSBoYXMgY2hvaWNlcyB3aGVuIHRoZSBtb2RlIGlzIGFjdGl2ZS4gQ2xlYXIgdGhlbS4KKyAgICAgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCkgeworICAgICAgICAgICAgICAgIGNsZWFyQ2hvaWNlcygpOworICAgICAgICAgICAgICAgIHNldExvbmdDbGlja2FibGUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSB7QGxpbmsgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXJ9IHRoYXQgd2lsbCBtYW5hZ2UgdGhlIGxpZmVjeWNsZSBvZiB0aGUKKyAgICAgKiBzZWxlY3Rpb24ge0BsaW5rIEFjdGlvbk1vZGV9LiBPbmx5IHVzZWQgd2hlbiB0aGUgY2hvaWNlIG1vZGUgaXMgc2V0IHRvCisgICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdGhhdCB3aWxsIG1hbmFnZSB0aGUgc2VsZWN0aW9uIG1vZGUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyKE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgbU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrID0gbmV3IE11bHRpQ2hvaWNlTW9kZVdyYXBwZXIoKTsKKyAgICAgICAgfQorICAgICAgICBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2suc2V0V3JhcHBlZChsaXN0ZW5lcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC04OTMsNiArMTE3Nyw4IEBACiAgICAgICAgIGludCBwb3NpdGlvbjsKICAgICAgICAgaW50IGhlaWdodDsKICAgICAgICAgU3RyaW5nIGZpbHRlcjsKKyAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IGNoZWNrU3RhdGU7CisgICAgICAgIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBjaGVja0lkU3RhdGU7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIHtAbGluayBBYnNMaXN0VmlldyNvblNhdmVJbnN0YW5jZVN0YXRlKCl9CkBAIC05MTIsNiArMTE5OCwxMyBAQAogICAgICAgICAgICAgcG9zaXRpb24gPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICBoZWlnaHQgPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICBmaWx0ZXIgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBjaGVja1N0YXRlID0gaW4ucmVhZFNwYXJzZUJvb2xlYW5BcnJheSgpOworICAgICAgICAgICAgbG9uZ1tdIGlkU3RhdGUgPSBpbi5jcmVhdGVMb25nQXJyYXkoKTsKKworICAgICAgICAgICAgaWYgKGlkU3RhdGUubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKKyAgICAgICAgICAgICAgICBjaGVja0lkU3RhdGUuc2V0VmFsdWVzKGlkU3RhdGUsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTkyMyw2ICsxMjE2LDggQEAKICAgICAgICAgICAgIG91dC53cml0ZUludChwb3NpdGlvbik7CiAgICAgICAgICAgICBvdXQud3JpdGVJbnQoaGVpZ2h0KTsKICAgICAgICAgICAgIG91dC53cml0ZVN0cmluZyhmaWx0ZXIpOworICAgICAgICAgICAgb3V0LndyaXRlU3BhcnNlQm9vbGVhbkFycmF5KGNoZWNrU3RhdGUpOworICAgICAgICAgICAgb3V0LndyaXRlTG9uZ0FycmF5KGNoZWNrSWRTdGF0ZSAhPSBudWxsID8gY2hlY2tJZFN0YXRlLmdldEtleXMoKSA6IG5ldyBsb25nWzBdKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtOTM0LDcgKzEyMjksOCBAQAogICAgICAgICAgICAgICAgICAgICArICIgdmlld1RvcD0iICsgdmlld1RvcAogICAgICAgICAgICAgICAgICAgICArICIgcG9zaXRpb249IiArIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICsgIiBoZWlnaHQ9IiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIgZmlsdGVyPSIgKyBmaWx0ZXIgKyAifSI7CisgICAgICAgICAgICAgICAgICAgICsgIiBmaWx0ZXI9IiArIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICArICIgY2hlY2tTdGF0ZT0iICsgY2hlY2tTdGF0ZSArICJ9IjsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IKQEAgLTk5OCw2ICsxMjk0LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHNzLmNoZWNrU3RhdGUgPSBtQ2hlY2tTdGF0ZXM7CisgICAgICAgIHNzLmNoZWNrSWRTdGF0ZSA9IG1DaGVja2VkSWRTdGF0ZXM7CisKICAgICAgICAgcmV0dXJuIHNzOwogICAgIH0KIApAQCAtMTAyOSw2ICsxMzI4LDE0IEBACiAKICAgICAgICAgc2V0RmlsdGVyVGV4dChzcy5maWx0ZXIpOwogCisgICAgICAgIGlmIChzcy5jaGVja1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja1N0YXRlcyA9IHNzLmNoZWNrU3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3MuY2hlY2tJZFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBzcy5jaGVja0lkU3RhdGU7CisgICAgICAgIH0KKwogICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CiAgICAgfQogCkBAIC0xMTcxLDEwICsxNDc4LDYgQEAKICAgICAgICAgaW50IHJlc3VsdDsKICAgICAgICAgaWYgKG1TbW9vdGhTY3JvbGxiYXJFbmFibGVkKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBNYXRoLm1heChtSXRlbUNvdW50ICogMTAwLCAwKTsKLSAgICAgICAgICAgIGlmIChtU2Nyb2xsWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3Igb3ZlcnNjcm9sbAotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBNYXRoLmFicygoaW50KSAoKGZsb2F0KSBtU2Nyb2xsWSAvIGdldEhlaWdodCgpICogbUl0ZW1Db3VudCAqIDEwMCkpOwotICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVzdWx0ID0gbUl0ZW1Db3VudDsKICAgICAgICAgfQpAQCAtMTI0Nyw4ICsxNTUwLDYgQEAKIAogICAgICAgICBsYXlvdXRDaGlsZHJlbigpOwogICAgICAgICBtSW5MYXlvdXQgPSBmYWxzZTsKLQotICAgICAgICBtT3ZlcnNjcm9sbE1heCA9IChiIC0gdCkgLyBPVkVSU0NST0xMX0xJTUlUX0RJVklTT1I7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjc4LDYgKzE5NzksMTEgQEAKICAgICAgICAgICAgICAgICB0cmVlT2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtRGF0YVNldE9ic2VydmVyID0gbmV3IEFkYXB0ZXJEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgICAgIG1BZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNjk4LDYgKzIwMDQsMTEgQEAKICAgICAgICAgICAgICAgICBtR2xvYmFsTGF5b3V0TGlzdGVuZXJBZGRlZEZpbHRlciA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgICAgICBtRGF0YVNldE9ic2VydmVyID0gbnVsbDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTcxNSw3ICsyMDI2LDYgQEAKICAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZS5lbmRGbGluZygpOwogICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoR2xvd3MoKTsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE4NDksMTAgKzIxNTksMjEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBwZXJmb3JtTG9uZ1ByZXNzKGZpbmFsIFZpZXcgY2hpbGQsCisgICAgYm9vbGVhbiBwZXJmb3JtTG9uZ1ByZXNzKGZpbmFsIFZpZXcgY2hpbGQsCiAgICAgICAgICAgICBmaW5hbCBpbnQgbG9uZ1ByZXNzUG9zaXRpb24sIGZpbmFsIGxvbmcgbG9uZ1ByZXNzSWQpIHsKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CisgICAgICAgIC8vIENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMIHRha2VzIG92ZXIgbG9uZyBwcmVzcy4KKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKSB7CisgICAgICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DaG9pY2VBY3Rpb25Nb2RlID0gc3RhcnRBY3Rpb25Nb2RlKG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgc2V0SXRlbUNoZWNrZWQobG9uZ1ByZXNzUG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgd2Ugc2VsZWN0IHRoZSBsb25nIHByZXNzZWQgaXRlbSBpZiB3ZSB3ZXJlIGFscmVhZHkgaW4KKyAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBtb2RlPyAoaS5lLiB0cmVhdCBpdCBsaWtlIGFuIGl0ZW0gY2xpY2s/KQorICAgICAgICAgICAgcGVyZm9ybUhhcHRpY0ZlZWRiYWNrKEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkxPTkdfUFJFU1MpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAorICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKG1Pbkl0ZW1Mb25nQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICBoYW5kbGVkID0gbU9uSXRlbUxvbmdDbGlja0xpc3RlbmVyLm9uSXRlbUxvbmdDbGljayhBYnNMaXN0Vmlldy50aGlzLCBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAgbG9uZ1ByZXNzUG9zaXRpb24sIGxvbmdQcmVzc0lkKTsKQEAgLTIwMjUsMTAgKzIzNDYsOSBAQAogICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG1vdmVkIGZhciBlbm91Z2ggdGhhdCBpdCBsb29rcyBtb3JlIGxpa2UgYQogICAgICAgICAvLyBzY3JvbGwgdGhhbiBhIHRhcAogICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2UgPSBNYXRoLmFicyhkZWx0YVkpOwotICAgICAgICBmaW5hbCBib29sZWFuIG92ZXJzY3JvbGwgPSBtU2Nyb2xsWSAhPSAwOwotICAgICAgICBpZiAob3ZlcnNjcm9sbCB8fCBkaXN0YW5jZSA+IG1Ub3VjaFNsb3ApIHsKKyAgICAgICAgaWYgKGRpc3RhbmNlID4gbVRvdWNoU2xvcCkgewogICAgICAgICAgICAgY3JlYXRlU2Nyb2xsaW5nQ2FjaGUoKTsKLSAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBvdmVyc2Nyb2xsID8gVE9VQ0hfTU9ERV9PVkVSU0NST0xMIDogVE9VQ0hfTU9ERV9TQ1JPTEw7CisgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9TQ1JPTEw7CiAgICAgICAgICAgICBtTW90aW9uQ29ycmVjdGlvbiA9IGRlbHRhWTsKICAgICAgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciA9IGdldEhhbmRsZXIoKTsKICAgICAgICAgICAgIC8vIEhhbmRsZXIgc2hvdWxkIG5vdCBiZSBudWxsIHVubGVzcyB0aGUgQWJzTGlzdFZpZXcgaXMgbm90IGF0dGFjaGVkIHRvIGEKQEAgLTIwNjQsMTkgKzIzODQsNiBAQAogICAgICAgICAgICAgICAgIC8vIHRvdWNoIG1vZGUpLiBGb3JjZSBhbiBpbml0aWFsIGxheW91dCB0byBnZXQgcmlkIG9mIHRoZSBzZWxlY3Rpb24uCiAgICAgICAgICAgICAgICAgbGF5b3V0Q2hpbGRyZW4oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCB0b3VjaE1vZGUgPSBtVG91Y2hNb2RlOwotICAgICAgICAgICAgaWYgKHRvdWNoTW9kZSA9PSBUT1VDSF9NT0RFX09WRVJTQ1JPTEwgfHwgdG91Y2hNb2RlID09IFRPVUNIX01PREVfT1ZFUkZMSU5HKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1GbGluZ1J1bm5hYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuZW5kRmxpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbFkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmlzaEdsb3dzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxMDcsNjMgKzI0MTQsNDkgQEAKIAogICAgICAgICBzd2l0Y2ggKGFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSB7CiAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKLSAgICAgICAgICAgIHN3aXRjaCAobVRvdWNoTW9kZSkgewotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJGTElORzogewotICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLmVuZEZsaW5nKCk7Ci0gICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfT1ZFUlNDUk9MTDsKLSAgICAgICAgICAgICAgICBtTW90aW9uWSA9IG1MYXN0WSA9IChpbnQpIGV2LmdldFkoKTsKLSAgICAgICAgICAgICAgICBtTW90aW9uQ29ycmVjdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2LmdldFgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXYuZ2V0WSgpOworICAgICAgICAgICAgaW50IG1vdGlvblBvc2l0aW9uID0gcG9pbnRUb1Bvc2l0aW9uKHgsIHkpOworICAgICAgICAgICAgaWYgKCFtRGF0YUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfTU9ERV9GTElORykgJiYgKG1vdGlvblBvc2l0aW9uID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZ2V0QWRhcHRlcigpLmlzRW5hYmxlZChtb3Rpb25Qb3NpdGlvbikpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgY2xpY2tlZCBvbiBhbiBhY3R1YWwgdmlldyAoYW5kIHdhcyBub3Qgc3RvcHBpbmcgYSBmbGluZykuIEl0IG1pZ2h0IGJlIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgb3IgYSBzY3JvbGwuIEFzc3VtZSBpdCBpcyBhIGNsaWNrIHVudGlsIHByb3ZlbiBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfRE9XTjsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgRGVib3VuY2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nQ2hlY2tGb3JUYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdDaGVja0ZvclRhcCA9IG5ldyBDaGVja0ZvclRhcCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBvc3REZWxheWVkKG1QZW5kaW5nQ2hlY2tGb3JUYXAsIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV2LmdldEVkZ2VGbGFncygpICE9IDAgJiYgbW90aW9uUG9zaXRpb24gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIGEgdmlldyB0byBjbGljayBvbiwgYnV0IHRoZSBkb3duIGV2ZW50IHdhcyB0b3VjaGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVkZ2UsIHdlIHdpbGwgYmFpbCBvdXQgYW5kIHRyeSBhZ2Fpbi4gVGhpcyBhbGxvd3MgdGhlIGVkZ2UgY29ycmVjdGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZSBpbiBWaWV3Um9vdCB0byB0cnkgdG8gZmluZCBhIG5lYXJieSB2aWV3IHRvIHNlbGVjdAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKDApOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCkgZXYuZ2V0WCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXYuZ2V0WSgpOwotICAgICAgICAgICAgICAgIGludCBtb3Rpb25Qb3NpdGlvbiA9IHBvaW50VG9Qb3NpdGlvbih4LCB5KTsKLSAgICAgICAgICAgICAgICBpZiAoIW1EYXRhQ2hhbmdlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfTU9ERV9GTElORykgJiYgKG1vdGlvblBvc2l0aW9uID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGdldEFkYXB0ZXIoKS5pc0VuYWJsZWQobW90aW9uUG9zaXRpb24pKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjbGlja2VkIG9uIGFuIGFjdHVhbCB2aWV3IChhbmQgd2FzIG5vdCBzdG9wcGluZyBhIGZsaW5nKS4gSXQgbWlnaHQgYmUgYQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgb3IgYSBzY3JvbGwuIEFzc3VtZSBpdCBpcyBhIGNsaWNrIHVudGlsIHByb3ZlbiBvdGhlcndpc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX0RPV047Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBEZWJvdW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nQ2hlY2tGb3JUYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2hlY2tGb3JUYXAgPSBuZXcgQ2hlY2tGb3JUYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvc3REZWxheWVkKG1QZW5kaW5nQ2hlY2tGb3JUYXAsIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYuZ2V0RWRnZUZsYWdzKCkgIT0gMCAmJiBtb3Rpb25Qb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIGEgdmlldyB0byBjbGljayBvbiwgYnV0IHRoZSBkb3duIGV2ZW50IHdhcyB0b3VjaGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlZGdlLCB3ZSB3aWxsIGJhaWwgb3V0IGFuZCB0cnkgYWdhaW4uIFRoaXMgYWxsb3dzIHRoZSBlZGdlIGNvcnJlY3RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIGluIFZpZXdSb290IHRvIHRyeSB0byBmaW5kIGEgbmVhcmJ5IHZpZXcgdG8gc2VsZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9NT0RFX0ZMSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcHBlZCBhIGZsaW5nLiBJdCBpcyBhIHNjcm9sbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTY3JvbGxpbmdDYWNoZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uQ29ycmVjdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uUG9zaXRpb24gPSBmaW5kTW90aW9uUm93KHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFNjcm9sbFN0YXRlQ2hhbmdlKE9uU2Nyb2xsTGlzdGVuZXIuU0NST0xMX1NUQVRFX1RPVUNIX1NDUk9MTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX01PREVfRkxJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3BwZWQgYSBmbGluZy4gSXQgaXMgYSBzY3JvbGwuCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTY3JvbGxpbmdDYWNoZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfU0NST0xMOworICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvbkNvcnJlY3Rpb24gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uUG9zaXRpb24gPSBmaW5kTW90aW9uUm93KHkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0U2Nyb2xsU3RhdGVDaGFuZ2UoT25TY3JvbGxMaXN0ZW5lci5TQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtb3Rpb25Qb3NpdGlvbiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHdoZXJlIHRoZSBtb3Rpb24gZXZlbnQgc3RhcnRlZAotICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0Q2hpbGRBdChtb3Rpb25Qb3NpdGlvbiAtIG1GaXJzdFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgbU1vdGlvblZpZXdPcmlnaW5hbFRvcCA9IHYuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Nb3Rpb25YID0geDsKLSAgICAgICAgICAgICAgICBtTW90aW9uWSA9IHk7Ci0gICAgICAgICAgICAgICAgbU1vdGlvblBvc2l0aW9uID0gbW90aW9uUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgbUxhc3RZID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAobW90aW9uUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHdoZXJlIHRoZSBtb3Rpb24gZXZlbnQgc3RhcnRlZAorICAgICAgICAgICAgICAgIHYgPSBnZXRDaGlsZEF0KG1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOworICAgICAgICAgICAgICAgIG1Nb3Rpb25WaWV3T3JpZ2luYWxUb3AgPSB2LmdldFRvcCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1vdGlvblggPSB4OworICAgICAgICAgICAgbU1vdGlvblkgPSB5OworICAgICAgICAgICAgbU1vdGlvblBvc2l0aW9uID0gbW90aW9uUG9zaXRpb247CisgICAgICAgICAgICBtTGFzdFkgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIxOTYsMjUgKzI0ODksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdERpc2FsbG93SW50ZXJjZXB0VG91Y2hFdmVudCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByYXdEZWx0YVkgPSBkZWx0YVk7CiAgICAgICAgICAgICAgICAgICAgIGRlbHRhWSAtPSBtTW90aW9uQ29ycmVjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgaW50IGluY3JlbWVudGFsRGVsdGFZID0gbUxhc3RZICE9IEludGVnZXIuTUlOX1ZBTFVFID8geSAtIG1MYXN0WSA6IGRlbHRhWTsKICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3Rpb25JbmRleDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb3Rpb25Qb3NpdGlvbiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25JbmRleCA9IG1Nb3Rpb25Qb3NpdGlvbiAtIG1GaXJzdFBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIG1vdGlvbiBwb3NpdGlvbiB0aGF0IHdlIGNhbiByZWxpYWJseSB0cmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgc29tZXRoaW5nIGluIHRoZSBtaWRkbGUgdG8gbWFrZSBhIGJlc3QgZ3Vlc3MgYXQgdGhpbmdzIGJlbG93LgotICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uSW5kZXggPSBnZXRDaGlsZENvdW50KCkgLyAyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvblZpZXdQcmV2VG9wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgVmlldyBtb3Rpb25WaWV3ID0gdGhpcy5nZXRDaGlsZEF0KG1vdGlvbkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uVmlld1ByZXZUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBkbyBhbGwgdGhpcyB3b3JrIGlmIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIGFueXdheQogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF0RWRnZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5jcmVtZW50YWxEZWx0YVkgIT0gMCkgewpAQCAtMjIyMiwxMTcgKzI0OTksMjMgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGJ1bXBlZCBpbnRvIHRoZSBzY3JvbGwgbGltaXQKLSAgICAgICAgICAgICAgICAgICAgbW90aW9uVmlldyA9IHRoaXMuZ2V0Q2hpbGRBdChtb3Rpb25JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb3Rpb25WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0b3Agb2YgdGhlIG1vdGlvbiB2aWV3IGlzIHdoZXJlIGl0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3NlZCB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1vdGlvblZpZXdSZWFsVG9wID0gbW90aW9uVmlldy5nZXRUb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdEVkZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSBvdmVyc2Nyb2xsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcnNjcm9sbCA9IC1pbmNyZW1lbnRhbERlbHRhWSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW90aW9uVmlld1JlYWxUb3AgLSBtb3Rpb25WaWV3UHJldlRvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlclNjcm9sbEJ5KDAsIG92ZXJzY3JvbGwsIDAsIG1TY3JvbGxZLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJzY3JvbGxEaXN0YW5jZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1PdmVyc2Nyb2xsRGlzdGFuY2UpID09IE1hdGguYWJzKG1TY3JvbGxZKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyBvdmVyZmxpbmcgaWYgd2UncmUgYXQgdGhlIGVkZ2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBnZXRPdmVyU2Nyb2xsTW9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSX1NDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSX1NDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbnRlbnRGaXRzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaXJlY3Rpb24gPSAwOyAvLyBSZXNldCB3aGVuIGVudGVyaW5nIG92ZXJzY3JvbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdEZWx0YVkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgb3ZlcnNjcm9sbCAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93Qm90dG9tLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyYXdEZWx0YVkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25QdWxsKChmbG9hdCkgb3ZlcnNjcm9sbCAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0RWRnZSAmJiBnZXRDaGlsZENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmVhdCB0aGlzIGxpa2Ugd2UncmUgc3RhcnRpbmcgYSBuZXcgc2Nyb2xsIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLiBUaGlzIHdpbGwgbGV0IHRoZSB1c2VyIHN0YXJ0IHNjcm9sbGluZyBiYWNrIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gbmVlZGluZyB0byBzY3JvbGwgYmFjayB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHdoZXJlIHRoZXkgaGl0IHRoZSBsaW1pdCBmaXJzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgbW90aW9uVmlldyA9IGdldENoaWxkQXQobW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblZpZXdPcmlnaW5hbFRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uWSA9IHk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTGFzdFkgPSB5OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw6Ci0gICAgICAgICAgICAgICAgaWYgKHkgIT0gbUxhc3RZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByYXdEZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhWSAtPSBtTW90aW9uQ29ycmVjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluY3JlbWVudGFsRGVsdGFZID0gbUxhc3RZICE9IEludGVnZXIuTUlOX1ZBTFVFID8geSAtIG1MYXN0WSA6IGRlbHRhWTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkU2Nyb2xsID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZXdTY3JvbGwgPSBvbGRTY3JvbGwgLSBpbmNyZW1lbnRhbERlbHRhWTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld0RpcmVjdGlvbiA9IHkgPiBtTGFzdFkgPyAxIDogLTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb24gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURpcmVjdGlvbiA9IG5ld0RpcmVjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRGlyZWN0aW9uICE9IG5ld0RpcmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29taW5nIGJhY2sgdG8gJ3JlYWwnIGxpc3Qgc2Nyb2xsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbERlbHRhWSA9IC1uZXdTY3JvbGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZG8gYWxsIHRoaXMgd29yayBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSBhbnl3YXkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnRhbERlbHRhWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tNb3Rpb25TY3JvbGwoaW5jcmVtZW50YWxEZWx0YVksIGluY3JlbWVudGFsRGVsdGFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBiYWNrIGluCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpZCBub3Qgc2Nyb2xsIHRoZSBmdWxsIGFtb3VudC4gVHJlYXQgdGhpcyBlc3NlbnRpYWxseSBsaWtlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9mIGEgbmV3IHRvdWNoIHNjcm9sbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRDbG9zZXN0TW90aW9uUm93KHkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvbkNvcnJlY3Rpb24gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvblZpZXcgPSBnZXRDaGlsZEF0KG1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25WaWV3T3JpZ2luYWxUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJTY3JvbGxCeSgwLCAtaW5jcmVtZW50YWxEZWx0YVksIDAsIG1TY3JvbGxZLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJTY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUl9TQ1JPTExfQUxXQVlTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSX1NDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29udGVudEZpdHMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3RGVsdGFZID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgLWluY3JlbWVudGFsRGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1FZGdlR2xvd0JvdHRvbS5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3RGVsdGFZIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25QdWxsKChmbG9hdCkgLWluY3JlbWVudGFsRGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1RvcC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobU92ZXJzY3JvbGxEaXN0YW5jZSkgPT0gTWF0aC5hYnMobVNjcm9sbFkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgb3ZlcmZsaW5nIGlmIHdlJ3JlIGF0IHRoZSBlZGdlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTGFzdFkgPSB5OwotICAgICAgICAgICAgICAgICAgICBtRGlyZWN0aW9uID0gbmV3RGlyZWN0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNDA0LDI5ICsyNTg3LDE4IEBACiAgICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfU0NST0xMOgogICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOwogICAgICAgICAgICAgICAgIGlmIChjaGlsZENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlyc3RDaGlsZFRvcCA9IGdldENoaWxkQXQoMCkuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsYXN0Q2hpbGRCb3R0b20gPSBnZXRDaGlsZEF0KGNoaWxkQ291bnQgLSAxKS5nZXRCb3R0b20oKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRUb3AgPSBtTGlzdFBhZGRpbmcudG9wOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29udGVudEJvdHRvbSA9IGdldEhlaWdodCgpIC0gbUxpc3RQYWRkaW5nLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFBvc2l0aW9uID09IDAgJiYgZmlyc3RDaGlsZFRvcCA+PSBjb250ZW50VG9wICYmCisgICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQb3NpdGlvbiA9PSAwICYmIGdldENoaWxkQXQoMCkuZ2V0VG9wKCkgPj0gbUxpc3RQYWRkaW5nLnRvcCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA8IG1JdGVtQ291bnQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2hpbGRCb3R0b20gPD0gZ2V0SGVpZ2h0KCkgLSBjb250ZW50Qm90dG9tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hpbGRBdChjaGlsZENvdW50IC0gMSkuZ2V0Qm90dG9tKCkgPD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEhlaWdodCgpIC0gbUxpc3RQYWRkaW5nLmJvdHRvbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfUkVTVDsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFNjcm9sbFN0YXRlQ2hhbmdlKE9uU2Nyb2xsTGlzdGVuZXIuU0NST0xMX1NUQVRFX0lETEUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmVsb2NpdHlUcmFja2VyIHZlbG9jaXR5VHJhY2tlciA9IG1WZWxvY2l0eVRyYWNrZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbml0aWFsVmVsb2NpdHkgPSAoaW50KSB2ZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KG1BY3RpdmVQb2ludGVySWQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGbGluZyBpZiB3ZSBoYXZlIGVub3VnaCB2ZWxvY2l0eSBhbmQgd2UgYXJlbid0IGF0IGEgYm91bmRhcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBjYW4gcG90ZW50aWFsbHkgb3ZlcmZsaW5nIG1vcmUgdGhhbiB3ZSBjYW4gb3ZlcnNjcm9sbCwgZG9uJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IHRoZSB3ZWlyZCBiZWhhdmlvciB3aGVyZSB5b3UgY2FuIHNjcm9sbCB0byBhIGJvdW5kYXJ5IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaW5nIGZ1cnRoZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISgobUZpcnN0UG9zaXRpb24gPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2hpbGRUb3AgPT0gY29udGVudFRvcCAtIG1PdmVyc2Nyb2xsRGlzdGFuY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1GaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA9PSBtSXRlbUNvdW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoaWxkQm90dG9tID09IGNvbnRlbnRCb3R0b20gKyBtT3ZlcnNjcm9sbERpc3RhbmNlKSkpIHsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhpbml0aWFsVmVsb2NpdHkpID4gbU1pbmltdW1WZWxvY2l0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxpbmdSdW5uYWJsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlID0gbmV3IEZsaW5nUnVubmFibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNDQzLDMyICsyNjE1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFNjcm9sbFN0YXRlQ2hhbmdlKE9uU2Nyb2xsTGlzdGVuZXIuU0NST0xMX1NUQVRFX0lETEUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw6Ci0gICAgICAgICAgICAgICAgaWYgKG1GbGluZ1J1bm5hYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUgPSBuZXcgRmxpbmdSdW5uYWJsZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBWZWxvY2l0eVRyYWNrZXIgdmVsb2NpdHlUcmFja2VyID0gbVZlbG9jaXR5VHJhY2tlcjsKLSAgICAgICAgICAgICAgICB2ZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbFZlbG9jaXR5ID0gKGludCkgdmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKLQotICAgICAgICAgICAgICAgIHJlcG9ydFNjcm9sbFN0YXRlQ2hhbmdlKE9uU2Nyb2xsTGlzdGVuZXIuU0NST0xMX1NUQVRFX0ZMSU5HKTsKLSAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRPdmVyZmxpbmcoLWluaXRpYWxWZWxvY2l0eSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRTcHJpbmdiYWNrKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNldFByZXNzZWQoZmFsc2UpOwogCi0gICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAvLyBOZWVkIHRvIHJlZHJhdyBzaW5jZSB3ZSBwcm9iYWJseSBhcmVuJ3QgZHJhd2luZyB0aGUgc2VsZWN0b3IgYW55bW9yZQogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogCkBAIC0yNDk0LDQyICsyNjQ0LDI0IEBACiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKLSAgICAgICAgICAgIHN3aXRjaCAobVRvdWNoTW9kZSkgewotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw6Ci0gICAgICAgICAgICAgICAgaWYgKG1GbGluZ1J1bm5hYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUgPSBuZXcgRmxpbmdSdW5uYWJsZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZS5zdGFydFNwcmluZ2JhY2soKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7CisgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXcgbW90aW9uVmlldyA9IHRoaXMuZ2V0Q2hpbGRBdChtTW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbW90aW9uVmlldy5zZXRQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyU2Nyb2xsaW5nQ2FjaGUoKTsKIAotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJGTElORzoKLSAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIC0gbGV0IGl0IHBsYXkgb3V0LgotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gZ2V0SGFuZGxlcigpOworICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1QZW5kaW5nQ2hlY2tGb3JMb25nUHJlc3MpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7Ci0gICAgICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgVmlldyBtb3Rpb25WaWV3ID0gdGhpcy5nZXRDaGlsZEF0KG1Nb3Rpb25Qb3NpdGlvbiAtIG1GaXJzdFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vdGlvblZpZXcuc2V0UHJlc3NlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNsZWFyU2Nyb2xsaW5nQ2FjaGUoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciA9IGdldEhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1QZW5kaW5nQ2hlY2tGb3JMb25nUHJlc3MpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjU1NCw2MSArMjY4NiwxMCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uT3ZlclNjcm9sbGVkKGludCBzY3JvbGxYLCBpbnQgc2Nyb2xsWSwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xhbXBlZFgsIGJvb2xlYW4gY2xhbXBlZFkpIHsKLSAgICAgICAgbVNjcm9sbFkgPSBzY3JvbGxZOwotCi0gICAgICAgIGlmIChjbGFtcGVkWSkgewotICAgICAgICAgICAgLy8gVmVsb2NpdHkgaXMgYnJva2VuIGJ5IGhpdHRpbmcgdGhlIGxpbWl0OyBkb24ndCBzdGFydCBhIGZsaW5nIG9mZiBvZiB0aGlzLgotICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7CiAgICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dUb3AuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwgTWF0aC5taW4oMCwgc2Nyb2xsWSArIG1GaXJzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcykpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5zZXRTaXplKHdpZHRoICogMiwgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd0JvdHRvbS5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGhlaWdodCwgc2Nyb2xsWSArIG1MYXN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzKSk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSgxODAsIHdpZHRoLCAwKTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20uc2V0U2l6ZSh3aWR0aCAqIDIsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0JvdHRvbS5kcmF3KGNhbnZhcykpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgICAgICBpZiAobUZhc3RTY3JvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgaWYgKHNjcm9sbFkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFBpbiB0byB0aGUgdG9wL2JvdHRvbSBkdXJpbmcgb3ZlcnNjcm9sbAotICAgICAgICAgICAgICAgIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgKGZsb2F0KSBzY3JvbGxZKTsKLSAgICAgICAgICAgICAgICBtRmFzdFNjcm9sbGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUZhc3RTY3JvbGxlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtRmFzdFNjcm9sbGVyLmRyYXcoY2FudmFzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjYyNywxMCArMjcwOCw2IEBACiAgICAgICAgIHN3aXRjaCAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewogICAgICAgICAgICAgaW50IHRvdWNoTW9kZSA9IG1Ub3VjaE1vZGU7Ci0gICAgICAgICAgICBpZiAodG91Y2hNb2RlID09IFRPVUNIX01PREVfT1ZFUkZMSU5HIHx8IHRvdWNoTW9kZSA9PSBUT1VDSF9NT0RFX09WRVJTQ1JPTEwpIHsKLSAgICAgICAgICAgICAgICBtTW90aW9uQ29ycmVjdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCkgZXYuZ2V0WCgpOwogICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldi5nZXRZKCk7CkBAIC0yNjk1LDcgKzI3NzIsNiBAQAogICAgICAgICAgICAgZmluYWwgaW50IG5ld1BvaW50ZXJJbmRleCA9IHBvaW50ZXJJbmRleCA9PSAwID8gMSA6IDA7CiAgICAgICAgICAgICBtTW90aW9uWCA9IChpbnQpIGV2LmdldFgobmV3UG9pbnRlckluZGV4KTsKICAgICAgICAgICAgIG1Nb3Rpb25ZID0gKGludCkgZXYuZ2V0WShuZXdQb2ludGVySW5kZXgpOwotICAgICAgICAgICAgbU1vdGlvbkNvcnJlY3Rpb24gPSAwOwogICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChuZXdQb2ludGVySW5kZXgpOwogICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKQEAgLTI3NTEsNyArMjgyNyw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBUcmFja3MgdGhlIGRlY2F5IG9mIGEgZmxpbmcgc2Nyb2xsCiAgICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIE92ZXJTY3JvbGxlciBtU2Nyb2xsZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBZIHZhbHVlIHJlcG9ydGVkIGJ5IG1TY3JvbGxlciBvbiB0aGUgcHJldmlvdXMgZmxpbmcKQEAgLTI3NTksNyArMjgzNSw3IEBACiAgICAgICAgIHByaXZhdGUgaW50IG1MYXN0RmxpbmdZOwogCiAgICAgICAgIEZsaW5nUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgT3ZlclNjcm9sbGVyKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIHZvaWQgc3RhcnQoaW50IGluaXRpYWxWZWxvY2l0eSkgewpAQCAtMjc3OCw0MiArMjg1NCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkIHN0YXJ0U3ByaW5nYmFjaygpIHsKLSAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nQmFjaygwLCBtU2Nyb2xsWSwgMCwgMCwgMCwgMCkpIHsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9PVkVSRkxJTkc7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHN0YXJ0T3ZlcmZsaW5nKGludCBpbml0aWFsVmVsb2NpdHkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBtaW4gPSBtU2Nyb2xsWSA+IDAgPyBJbnRlZ2VyLk1JTl9WQUxVRSA6IDA7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWF4ID0gbVNjcm9sbFkgPiAwID8gMCA6IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgbVNjcm9sbGVyLmZsaW5nKDAsIG1TY3JvbGxZLCAwLCBpbml0aWFsVmVsb2NpdHksIDAsIDAsIG1pbiwgbWF4LCAwLCBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9PVkVSRkxJTkc7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBwb3N0KHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlZGdlUmVhY2hlZChpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIG1TY3JvbGxlci5ub3RpZnlWZXJ0aWNhbEVkZ2VSZWFjaGVkKG1TY3JvbGxZLCAwLCBtT3ZlcmZsaW5nRGlzdGFuY2UpOwotICAgICAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxNb2RlID0gZ2V0T3ZlclNjcm9sbE1vZGUoKTsKLSAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSX1NDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJfU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyAmJiAhY29udGVudEZpdHMoKSkpIHsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9PVkVSRkxJTkc7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHZlbCA9IChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vbkFic29yYih2ZWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vbkFic29yYih2ZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIHBvc3QodGhpcyk7Ci0gICAgICAgIH0KLQogICAgICAgICB2b2lkIHN0YXJ0U2Nyb2xsKGludCBkaXN0YW5jZSwgaW50IGR1cmF0aW9uKSB7CiAgICAgICAgICAgICBpbnQgaW5pdGlhbFkgPSBkaXN0YW5jZSA8IDAgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IDA7CiAgICAgICAgICAgICBtTGFzdEZsaW5nWSA9IGluaXRpYWxZOwpAQCAtMjg0Niw3ICsyODg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZpbmFsIE92ZXJTY3JvbGxlciBzY3JvbGxlciA9IG1TY3JvbGxlcjsKKyAgICAgICAgICAgICAgICBmaW5hbCBTY3JvbGxlciBzY3JvbGxlciA9IG1TY3JvbGxlcjsKICAgICAgICAgICAgICAgICBib29sZWFuIG1vcmUgPSBzY3JvbGxlci5jb21wdXRlU2Nyb2xsT2Zmc2V0KCk7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHkgPSBzY3JvbGxlci5nZXRDdXJyWSgpOwogCkBAIC0yODc1LDI0ICsyOTE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBNYXRoLm1heCgtKGdldEhlaWdodCgpIC0gbVBhZGRpbmdCb3R0b20gLSBtUGFkZGluZ1RvcCAtIDEpLCBkZWx0YSk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYnVtcGVkIGludG8gdGhlIHNjcm9sbCBsaW1pdAotICAgICAgICAgICAgICAgIFZpZXcgbW90aW9uVmlldyA9IGdldENoaWxkQXQobU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGludCBvbGRUb3AgPSAwOwotICAgICAgICAgICAgICAgIGlmIChtb3Rpb25WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkVG9wID0gbW90aW9uVmlldy5nZXRUb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGF0RW5kID0gdHJhY2tNb3Rpb25TY3JvbGwoZGVsdGEsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICBpZiAoYXRFbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdlYWsgdGhlIHNjcm9sbCBmb3IgaG93IGZhciB3ZSBvdmVyc2hvdAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJzaG9vdCA9IC0oZGVsdGEgLSAobW90aW9uVmlldy5nZXRUb3AoKSAtIG9sZFRvcCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlclNjcm9sbEJ5KDAsIG92ZXJzaG9vdCwgMCwgbVNjcm9sbFksIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1PdmVyZmxpbmdEaXN0YW5jZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVkZ2VSZWFjaGVkKGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKG1vcmUgJiYgIWF0RW5kKSB7CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKQEAgLTI5MTAsMjQgKzI5MzMsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJGTElORzogewotICAgICAgICAgICAgICAgIGZpbmFsIE92ZXJTY3JvbGxlciBzY3JvbGxlciA9IG1TY3JvbGxlcjsKLSAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsZXIuY29tcHV0ZVNjcm9sbE9mZnNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZWx0YVkgPSBzY3JvbGxlci5nZXRDdXJyWSgpIC0gc2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJTY3JvbGxCeSgwLCBkZWx0YVksIDAsIHNjcm9sbFksIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U3ByaW5nYmFjaygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9zdCh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZEZsaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgIH0KQEAgLTI5NDEsNiArMjk0Niw3IEBACiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX1VQX1BPUyA9IDI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX0RPV05fQk9VTkQgPSAzOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9VUF9CT1VORCA9IDQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX09GRlNFVCA9IDU7CiAgICAgICAgIAogICAgICAgICBwcml2YXRlIGludCBtTW9kZTsKICAgICAgICAgcHJpdmF0ZSBpbnQgbVRhcmdldFBvczsKQEAgLTI5NDgsNiArMjk1NCw4IEBACiAgICAgICAgIHByaXZhdGUgaW50IG1MYXN0U2VlblBvczsKICAgICAgICAgcHJpdmF0ZSBpbnQgbVNjcm9sbER1cmF0aW9uOwogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtRXh0cmFTY3JvbGw7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU9mZnNldEZyb21Ub3A7CiAgICAgICAgIAogICAgICAgICBQb3NpdGlvblNjcm9sbGVyKCkgewogICAgICAgICAgICAgbUV4dHJhU2Nyb2xsID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0KG1Db250ZXh0KS5nZXRTY2FsZWRGYWRpbmdFZGdlTGVuZ3RoKCk7CkBAIC0zMDM5LDEyICszMDQ3LDQ4IEBACiAgICAgICAgICAgICAKICAgICAgICAgICAgIHBvc3QodGhpcyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKKyAgICAgICAgdm9pZCBzdGFydFdpdGhPZmZzZXQoaW50IHBvc2l0aW9uLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgICAgICBtVGFyZ2V0UG9zID0gcG9zaXRpb247CisgICAgICAgICAgICBtT2Zmc2V0RnJvbVRvcCA9IG9mZnNldDsKKyAgICAgICAgICAgIG1Cb3VuZFBvcyA9IElOVkFMSURfUE9TSVRJT047CisgICAgICAgICAgICBtTGFzdFNlZW5Qb3MgPSBJTlZBTElEX1BPU0lUSU9OOworICAgICAgICAgICAgbU1vZGUgPSBNT1ZFX09GRlNFVDsKKworICAgICAgICAgICAgZmluYWwgaW50IGZpcnN0UG9zID0gbUZpcnN0UG9zaXRpb247CisgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBsYXN0UG9zID0gZmlyc3RQb3MgKyBjaGlsZENvdW50IC0gMTsKKworICAgICAgICAgICAgaW50IHZpZXdUcmF2ZWxDb3VudCA9IDA7CisgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBmaXJzdFBvcykgeworICAgICAgICAgICAgICAgIHZpZXdUcmF2ZWxDb3VudCA9IGZpcnN0UG9zIC0gcG9zaXRpb247CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gbGFzdFBvcykgeworICAgICAgICAgICAgICAgIHZpZXdUcmF2ZWxDb3VudCA9IHBvc2l0aW9uIC0gbGFzdFBvczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT24tc2NyZWVuLCBqdXN0IHNjcm9sbC4KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFyZ2V0VG9wID0gZ2V0Q2hpbGRBdChwb3NpdGlvbiAtIGZpcnN0UG9zKS5nZXRUb3AoKTsKKyAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxCeSh0YXJnZXRUb3AgLSBvZmZzZXQsIFNDUk9MTF9EVVJBVElPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFc3RpbWF0ZSBob3cgbWFueSBzY3JlZW5zIHdlIHNob3VsZCB0cmF2ZWwKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHNjcmVlblRyYXZlbENvdW50ID0gKGZsb2F0KSB2aWV3VHJhdmVsQ291bnQgLyBjaGlsZENvdW50OworICAgICAgICAgICAgbVNjcm9sbER1cmF0aW9uID0gc2NyZWVuVHJhdmVsQ291bnQgPCAxID8gKGludCkgKHNjcmVlblRyYXZlbENvdW50ICogU0NST0xMX0RVUkFUSU9OKSA6CisgICAgICAgICAgICAgICAgICAgIChpbnQpIChTQ1JPTExfRFVSQVRJT04gLyBzY3JlZW5UcmF2ZWxDb3VudCk7CisgICAgICAgICAgICBtTGFzdFNlZW5Qb3MgPSBJTlZBTElEX1BPU0lUSU9OOworCisgICAgICAgICAgICBwb3N0KHRoaXMpOworICAgICAgICB9CisKICAgICAgICAgdm9pZCBzdG9wKCkgewogICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKHRoaXMpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX01PREVfRkxJTkcgJiYgbUxhc3RTZWVuUG9zICE9IElOVkFMSURfUE9TSVRJT04pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGZpbmFsIGludCBsaXN0SGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgZmlyc3RQb3MgPSBtRmlyc3RQb3NpdGlvbjsKICAgICAgICAgICAgIApAQCAtMzE2OSw2ICszMjEzLDM1IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgTU9WRV9PRkZTRVQ6IHsKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RTZWVuUG9zID09IGZpcnN0UG9zKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIG5ldyB2aWV3cywgbGV0IHRoaW5ncyBrZWVwIGdvaW5nLgorICAgICAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gZmlyc3RQb3M7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zaXRpb24gPSBtVGFyZ2V0UG9zOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBsYXN0UG9zID0gZmlyc3RQb3MgKyBjaGlsZENvdW50IC0gMTsKKworICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IGZpcnN0UG9zKSB7CisgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KC1nZXRIZWlnaHQoKSwgbVNjcm9sbER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gbGFzdFBvcykgeworICAgICAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxCeShnZXRIZWlnaHQoKSwgbVNjcm9sbER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBPbi1zY3JlZW4sIGp1c3Qgc2Nyb2xsLgorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFyZ2V0VG9wID0gZ2V0Q2hpbGRBdChwb3NpdGlvbiAtIGZpcnN0UG9zKS5nZXRUb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRpc3RhbmNlID0gdGFyZ2V0VG9wIC0gbU9mZnNldEZyb21Ub3A7CisgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChtU2Nyb2xsRHVyYXRpb24gKiAoKGZsb2F0KSBkaXN0YW5jZSAvIGdldEhlaWdodCgpKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTMxODgsNiArMzI2MSwyNCBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsIHNjcm9sbAorICAgICAqIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBpeGVscyBmcm9tCisgICAgICogdGhlIHRvcCBlZGdlIG9mIHRoZSB2aWV3LiBJZiB0aGlzIGlzIGltcG9zc2libGUsIChlLmcuIHRoZSBvZmZzZXQgd291bGQgc2Nyb2xsCisgICAgICogdGhlIGZpcnN0IG9yIGxhc3QgaXRlbSBiZXlvbmQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGxpc3QpIGl0IHdpbGwgZ2V0IGFzIGNsb3NlCisgICAgICogYXMgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gdG8gc2Nyb2xsIHRvCisgICAgICogQHBhcmFtIG9mZnNldCBEZXNpcmVkIGRpc3RhbmNlIGluIHBpeGVscyBvZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gZnJvbSB0aGUgdG9wCisgICAgICogICAgICAgICAgICAgICBvZiB0aGUgdmlldyB3aGVuIHNjcm9sbGluZyBpcyBmaW5pc2hlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb25Gcm9tVG9wKGludCBwb3NpdGlvbiwgaW50IG9mZnNldCkgeworICAgICAgICBpZiAobVBvc2l0aW9uU2Nyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVBvc2l0aW9uU2Nyb2xsZXIgPSBuZXcgUG9zaXRpb25TY3JvbGxlcigpOworICAgICAgICB9CisgICAgICAgIG1Qb3NpdGlvblNjcm9sbGVyLnN0YXJ0V2l0aE9mZnNldChwb3NpdGlvbiwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCiAgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCwgYnV0IGl0IHdpbGwKICAgICAgKiBzdG9wIGVhcmx5IGlmIHNjcm9sbGluZyBmdXJ0aGVyIHdvdWxkIHNjcm9sbCBib3VuZFBvc2l0aW9uIG91dCBvZgpAQCAtMzIxNyw2ICszMzA4LDQyIEBACiAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0U2Nyb2xsKGRpc3RhbmNlLCBkdXJhdGlvbik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQWxsb3dzIFJlbW90ZVZpZXdzIHRvIHNjcm9sbCByZWxhdGl2ZWx5IHRvIGEgcG9zaXRpb24uCisgICAgICovCisgICAgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKKyAgICAgICAgICAgIGluZGV4ID0gZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IDApIHsKKyAgICAgICAgICAgIGluZGV4ID0gZ2V0TGFzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGluZGV4IC0gZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFJlY3QgdmlzaWJsZVJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRHbG9iYWxWaXNpYmxlUmVjdCh2aXNpYmxlUmVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNoaWxkIGlzIHBhcnRpYWxseSB2aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGludCBjaGlsZFJlY3RBcmVhID0gY2hpbGQuZ2V0V2lkdGgoKSAqIGNoaWxkLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgdmlzaWJsZVJlY3RBcmVhID0gdmlzaWJsZVJlY3Qud2lkdGgoKSAqIHZpc2libGVSZWN0LmhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB2aXNpYmxlQXJlYSA9ICh2aXNpYmxlUmVjdEFyZWEgLyAoZmxvYXQpIGNoaWxkUmVjdEFyZWEpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB2aXNpYmxlVGhyZXNob2xkID0gMC43NWY7CisgICAgICAgICAgICAgICAgICAgIGlmICgocG9zaXRpb24gPCAwKSAmJiAodmlzaWJsZUFyZWEgPCB2aXNpYmxlVGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRvcCBpbmRleCBpcyBub3QgcGVyY2VpdmFibHkgdmlzaWJsZSBzbyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFjY291bnQgZm9yIHNob3dpbmcgdGhhdCB0b3AgaW5kZXggYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocG9zaXRpb24gPiAwKSAmJiAodmlzaWJsZUFyZWEgPCB2aXNpYmxlVGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvdHRvbSBpbmRleCBpcyBub3QgcGVyY2VpdmFibHkgdmlzaWJsZSBzbyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFjY291bnQgZm9yIHNob3dpbmcgdGhhdCBib3R0b20gaW5kZXggYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgLS1pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKE1hdGgubWF4KDAsIE1hdGgubWluKGdldENvdW50KCksIGluZGV4ICsgcG9zaXRpb24pKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2Nyb2xsaW5nQ2FjaGUoKSB7CiAgICAgICAgIGlmIChtU2Nyb2xsaW5nQ2FjaGVFbmFibGVkICYmICFtQ2FjaGluZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgIHNldENoaWxkcmVuRHJhd25XaXRoQ2FjaGVFbmFibGVkKHRydWUpOwpAQCAtMzI4NCwyOSArMzQxMSwxNiBAQAogCiAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvc2l0aW9uID0gbUZpcnN0UG9zaXRpb247CiAKLSAgICAgICAgLy8gVXBkYXRlIG91ciBndWVzc2VzIGZvciB3aGVyZSB0aGUgZmlyc3QgYW5kIGxhc3Qgdmlld3MgYXJlCi0gICAgICAgIGlmIChmaXJzdFBvc2l0aW9uID09IDApIHsKLSAgICAgICAgICAgIG1GaXJzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcyA9IGZpcnN0VG9wIC0gbUxpc3RQYWRkaW5nLnRvcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GaXJzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcyArPSBpbmNyZW1lbnRhbERlbHRhWTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPT0gbUl0ZW1Db3VudCkgewotICAgICAgICAgICAgbUxhc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3MgPSBsYXN0Qm90dG9tICsgbUxpc3RQYWRkaW5nLmJvdHRvbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1MYXN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzICs9IGluY3JlbWVudGFsRGVsdGFZOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpcnN0UG9zaXRpb24gPT0gMCAmJiBmaXJzdFRvcCA+PSBsaXN0UGFkZGluZy50b3AgJiYgaW5jcmVtZW50YWxEZWx0YVkgPj0gMCkgeworICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiA9PSAwICYmIGZpcnN0VG9wID49IGxpc3RQYWRkaW5nLnRvcCAmJiBkZWx0YVkgPj0gMCkgewogICAgICAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byBtb3ZlIHZpZXdzIGRvd24gaWYgdGhlIHRvcCBvZiB0aGUgZmlyc3QgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgdmlzaWJsZQotICAgICAgICAgICAgcmV0dXJuIGluY3JlbWVudGFsRGVsdGFZICE9IDA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA9PSBtSXRlbUNvdW50ICYmIGxhc3RCb3R0b20gPD0gZW5kICYmCi0gICAgICAgICAgICAgICAgaW5jcmVtZW50YWxEZWx0YVkgPD0gMCkgeworICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPT0gbUl0ZW1Db3VudCAmJiBsYXN0Qm90dG9tIDw9IGVuZCAmJiBkZWx0YVkgPD0gMCkgewogICAgICAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byBtb3ZlIHZpZXdzIHVwIGlmIHRoZSBib3R0b20gb2YgdGhlIGxhc3QgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgdmlzaWJsZQotICAgICAgICAgICAgcmV0dXJuIGluY3JlbWVudGFsRGVsdGFZICE9IDA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gZG93biA9IGluY3JlbWVudGFsRGVsdGFZIDwgMDsKQEAgLTM1ODgsNiArMzcwMiw3IEBACiAKICAgICAgICAgbVJlc3VycmVjdFRvUG9zaXRpb24gPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICByZW1vdmVDYWxsYmFja3MobUZsaW5nUnVubmFibGUpOworICAgICAgICByZW1vdmVDYWxsYmFja3MobVBvc2l0aW9uU2Nyb2xsZXIpOwogICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOwogICAgICAgICBjbGVhclNjcm9sbGluZ0NhY2hlKCk7CiAgICAgICAgIG1TcGVjaWZpY1RvcCA9IHNlbGVjdGVkVG9wOwpAQCAtNDEzMCw3ICs0MjQ1LDExIEBACiAKICAgICAvKioKICAgICAgKiBXaGVuIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgY2FjaGUgY29sb3IgaGludCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGxpc3QgaXMgYWx3YXlzIGRyYXduCi0gICAgICogb24gdG9wIG9mIGEgc29saWQsIHNpbmdsZS1jb2xvciwgb3BhcXVlIGJhY2tncm91bmQKKyAgICAgKiBvbiB0b3Agb2YgYSBzb2xpZCwgc2luZ2xlLWNvbG9yLCBvcGFxdWUgYmFja2dyb3VuZC4KKyAgICAgKgorICAgICAqIFplcm8gbWVhbnMgdGhhdCB3aGF0J3MgYmVoaW5kIHRoaXMgb2JqZWN0IGlzIHRyYW5zbHVjZW50IChub24gc29saWQpIG9yIGlzIG5vdCBtYWRlIG9mIGEKKyAgICAgKiBzaW5nbGUgY29sb3IuIFRoaXMgaGludCB3aWxsIG5vdCBhZmZlY3QgYW55IGV4aXN0aW5nIGJhY2tncm91bmQgZHJhd2FibGUgc2V0IG9uIHRoaXMgdmlldyAoCisgICAgICogdHlwaWNhbGx5IHNldCB2aWEge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfSkuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29sb3IgVGhlIGJhY2tncm91bmQgY29sb3IKICAgICAgKi8KQEAgLTQyNDAsMTAgKzQzNTksNDMgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZmluaXNoR2xvd3MoKSB7Ci0gICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVkZ2VHbG93VG9wLmZpbmlzaCgpOwotICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLmZpbmlzaCgpOworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBYnNMaXN0VmlldyB0byB1c2UgYSByZW1vdGUgdmlld3MgYWRhcHRlciB3aGljaCBjb25uZWN0cyB0byBhIFJlbW90ZVZpZXdzU2VydmljZQorICAgICAqIHRocm91Z2ggdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdGhlIGFkYXB0ZXIgdG8gY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVWaWV3c0FkYXB0ZXIoSW50ZW50IGludGVudCkgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYSBSZW1vdGVWaWV3c0FkYXB0ZXIgdGhhdCBpcyBib3VuZCB0byBhbiBleGlzdGluZworICAgICAgICAvLyBzZXJ2aWNlIGhhbmRsaW5nIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAgICBpZiAobVJlbW90ZUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgSW50ZW50LkZpbHRlckNvbXBhcmlzb24gZmNOZXcgPSBuZXcgSW50ZW50LkZpbHRlckNvbXBhcmlzb24oaW50ZW50KTsKKyAgICAgICAgICAgIEludGVudC5GaWx0ZXJDb21wYXJpc29uIGZjT2xkID0gbmV3IEludGVudC5GaWx0ZXJDb21wYXJpc29uKAorICAgICAgICAgICAgICAgICAgICBtUmVtb3RlQWRhcHRlci5nZXRSZW1vdGVWaWV3c1NlcnZpY2VJbnRlbnQoKSk7CisgICAgICAgICAgICBpZiAoZmNOZXcuZXF1YWxzKGZjT2xkKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IFJlbW90ZVZpZXdzQWRhcHRlciBmb3IgYmluZGluZworICAgICAgICBtUmVtb3RlQWRhcHRlciA9IG5ldyBSZW1vdGVWaWV3c0FkYXB0ZXIoZ2V0Q29udGV4dCgpLCBpbnRlbnQsIHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgY29ubmVjdHMgdG8gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlQWRhcHRlciAhPSBtQWRhcHRlcikgeworICAgICAgICAgICAgc2V0QWRhcHRlcihtUmVtb3RlQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmFjayB3aGVuIHRoZSBhZGFwdGVyIGRpc2Nvbm5lY3RzIGZyb20gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlQWRhcHRlciA9PSBtQWRhcHRlcikgeworICAgICAgICAgICAgbVJlbW90ZUFkYXB0ZXIgPSBudWxsOworICAgICAgICAgICAgc2V0QWRhcHRlcihudWxsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDI2Myw2ICs0NDE1LDc1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQSBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciByZWNlaXZlcyBldmVudHMgZm9yIHtAbGluayBBYnNMaXN0VmlldyNDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTH0uCisgICAgICogSXQgYWN0cyBhcyB0aGUge0BsaW5rIEFjdGlvbk1vZGUuQ2FsbGJhY2t9IGZvciB0aGUgc2VsZWN0aW9uIG1vZGUgYW5kIGFsc28gcmVjZWl2ZXMKKyAgICAgKiB7QGxpbmsgI29uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSwgaW50LCBsb25nLCBib29sZWFuKX0gZXZlbnRzIHdoZW4gdGhlIHVzZXIKKyAgICAgKiBzZWxlY3RzIGFuZCBkZXNlbGVjdHMgbGlzdCBpdGVtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIGV4dGVuZHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhbiBpdGVtIGlzIGNoZWNrZWQgb3IgdW5jaGVja2VkIGR1cmluZyBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1vZGUgVGhlIHtAbGluayBBY3Rpb25Nb2RlfSBwcm92aWRpbmcgdGhlIHNlbGVjdGlvbiBtb2RlCisgICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBZGFwdGVyIHBvc2l0aW9uIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNoZWNrZWQgb3IgdW5jaGVja2VkCisgICAgICAgICAqIEBwYXJhbSBpZCBBZGFwdGVyIElEIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNoZWNrZWQgb3IgdW5jaGVja2VkCisgICAgICAgICAqIEBwYXJhbSBjaGVja2VkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpdGVtIGlzIG5vdyBjaGVja2VkLCA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGl0ZW0gaXMgbm93IHVuY2hlY2tlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCwgYm9vbGVhbiBjaGVja2VkKTsKKyAgICB9CisKKyAgICBjbGFzcyBNdWx0aUNob2ljZU1vZGVXcmFwcGVyIGltcGxlbWVudHMgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIG1XcmFwcGVkOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZWQoTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgd3JhcHBlZCkgeworICAgICAgICAgICAgbVdyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICBpZiAobVdyYXBwZWQub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpKSB7CisgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBjaGVja2VkIGdyYXBoaWMgc3RhdGU/CisgICAgICAgICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25QcmVwYXJlQWN0aW9uTW9kZShtb2RlLCBtZW51KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25BY3Rpb25JdGVtQ2xpY2tlZChtb2RlLCBpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBtV3JhcHBlZC5vbkRlc3Ryb3lBY3Rpb25Nb2RlKG1vZGUpOworICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUgPSBudWxsOworCisgICAgICAgICAgICAvLyBFbmRpbmcgc2VsZWN0aW9uIG1vZGUgbWVhbnMgZGVzZWxlY3RpbmcgZXZlcnl0aGluZy4KKyAgICAgICAgICAgIGNsZWFyQ2hvaWNlcygpOworCisgICAgICAgICAgICBtRGF0YUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgcmVtZW1iZXJTeW5jU3RhdGUoKTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKworICAgICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCwgYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgICAgICBtV3JhcHBlZC5vbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKG1vZGUsIHBvc2l0aW9uLCBpZCwgY2hlY2tlZCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcyBzZWxlY3RlZCB3ZSBubyBsb25nZXIgbmVlZCB0aGUgc2VsZWN0aW9uIG1vZGUuCisgICAgICAgICAgICBpZiAoZ2V0Q2hlY2tlZEl0ZW1Db3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQWJzTGlzdFZpZXcgZXh0ZW5kcyBMYXlvdXRQYXJhbXMgdG8gcHJvdmlkZSBhIHBsYWNlIHRvIGhvbGQgdGhlIHZpZXcgdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgewpAQCAtNDYzMCw3ICs0ODUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFZpZXc+IHNjcmFwID0gbVNjcmFwVmlld3NbaV07CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JhcENvdW50ID0gc2NyYXAuc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNjcmFwQ291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXAuZ2V0KGkpLnNldERyYXdpbmdDYWNoZUJhY2tncm91bmRDb2xvcihjb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3JhcC5nZXQoaikuc2V0RHJhd2luZ0NhY2hlQmFja2dyb3VuZENvbG9yKGNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlci5qYXZhCmluZGV4IGYyYjNlMmEuLjliNmM1YTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXIuamF2YQpAQCAtNzIsNyArNzIsNyBAQAogICAgIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbik7CiAgICAgCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVkIHdoZXRoZXIgdGhlIGl0ZW0gaWRzIGFyZSBzdGFibGUgYWNyb3NzIGNoYW5nZXMgdG8gdGhlCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGl0ZW0gaWRzIGFyZSBzdGFibGUgYWNyb3NzIGNoYW5nZXMgdG8gdGhlCiAgICAgICogdW5kZXJseWluZyBkYXRhLgogICAgICAqIAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2FtZSBpZCBhbHdheXMgcmVmZXJzIHRvIHRoZSBzYW1lIG9iamVjdC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEKaW5kZXggOGZjYzJlOC4uZjVhZmI5NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgIGludCBtSXRlbUNvdW50OwogCiAgICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYWRhcHRlciBiZWZvcmUgYSBkYXRhIGNoYW5nZWQgZXZlbnQgb2NjdXJlZC4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhZGFwdGVyIGJlZm9yZSBhIGRhdGEgY2hhbmdlZCBldmVudCBvY2N1cnJlZC4KICAgICAgKi8KICAgICBpbnQgbU9sZEl0ZW1Db3VudDsKIApAQCAtMjI4LDcgKzIyOCw2IEBACiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYW4gaXRlbSBpbiB0aGlzCiAgICAgICogQWRhcHRlclZpZXcgaGFzIGJlZW4gY2xpY2tlZC4KQEAgLTU1OCw3ICs1NTcsNyBAQAogICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBpdGVtcyBvd25lZCBieSB0aGUgQWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcwogICAgICAqICAgICAgICAgQWRhcHRlclZpZXcuIChUaGlzIGlzIHRoZSBudW1iZXIgb2YgZGF0YSBpdGVtcywgd2hpY2ggbWF5IGJlCi0gICAgICogICAgICAgICBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHZpc2libGUgdmlldy4pCisgICAgICogICAgICAgICBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHZpc2libGUgdmlld3MuKQogICAgICAqLwogICAgIEBWaWV3RGVidWcuQ2FwdHVyZWRWaWV3UHJvcGVydHkKICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewpAQCAtNjI5LDYgKzYyOCw3IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmlldyB0byBzaG93IGlmIHRoZSBhZGFwdGVyIGlzIGVtcHR5CiAgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCiAgICAgcHVibGljIHZvaWQgc2V0RW1wdHlWaWV3KFZpZXcgZW1wdHlWaWV3KSB7CiAgICAgICAgIG1FbXB0eVZpZXcgPSBlbXB0eVZpZXc7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0FuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdBbmltYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YjFhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdBbmltYXRvci5qYXZhCkBAIC0wLDAgKzEsODUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYSB7QGxpbmsgQWRhcHRlclZpZXd9IHRoYXQgd2lsbCBwZXJmb3JtIGFuaW1hdGlvbnMKKyAqIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gaXRzIHZpZXdzLgorICoKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3JfaW5BbmltYXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3Jfb3V0QW5pbWF0aW9uCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3JfbG9vcFZpZXdzCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGFwdGVyVmlld0FuaW1hdG9yIGV4dGVuZHMgQWRhcHRlclZpZXc8QWRhcHRlcj4KKyAgICAgICAgaW1wbGVtZW50cyBSZW1vdGVWaWV3c0FkYXB0ZXIuUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW1vdGVWaWV3QW5pbWF0b3IiOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoaWxkLCB3aGljaCBhcHBlYXJzIGFueXdoZXJlIGZyb20gdGhlIGJlZ2lubmluZworICAgICAqIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLCBhcyBzcGVjaWZpZWQgYnkge0BsaW5rICNtQWN0aXZlT2Zmc2V0fQorICAgICAqLworICAgIGludCBtV2hpY2hDaGlsZCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZmlyc3QgdmlldyhzKSBzaG91bGQgYmUgYW5pbWF0ZWQgaW4KKyAgICAgKi8KKyAgICBib29sZWFuIG1BbmltYXRlRmlyc3RUaW1lID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqICBSZXByZXNlbnRzIHdoZXJlIHRoZSBpbiB0aGUgY3VycmVudCB3aW5kb3cgb2YKKyAgICAgKiAgdmlld3MgdGhlIGN1cnJlbnQgPGNvZGU+bURpc3BsYXllZENoaWxkPC9jb2RlPiBzaXRzCisgICAgICovCisgICAgaW50IG1BY3RpdmVPZmZzZXQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB2aWV3cyB0aGF0IHRoZSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0ga2VlcHMgYXMgY2hpbGRyZW4gYXQgYW55CisgICAgICogZ2l2ZW4gdGltZSAobm90IGNvdW50aW5nIHZpZXdzIHRoYXQgYXJlIHBlbmRpbmcgcmVtb3ZhbCwgc2VlIHtAbGluayAjbVByZXZpb3VzVmlld3N9KS4KKyAgICAgKi8KKyAgICBpbnQgbU51bUFjdGl2ZVZpZXdzID0gMTsKKworICAgIC8qKgorICAgICAqIE1hcCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgVmlld0FuZEluZGV4PiBtVmlld3NNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBWaWV3QW5kSW5kZXg+KCk7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHZpZXdzIHBlbmRpbmcgcmVtb3ZhbCBmcm9tIHRoZSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbVByZXZpb3VzVmlld3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXgsIHJlbGF0aXZlIHRvIHRoZSBhZGFwdGVyLCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3aW5kb3cgb2Ygdmlld3MKKyAgICAgKi8KKyAgICBpbnQgbUN1cnJlbnRXaW5kb3dTdGFydCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXgsIHJlbGF0aXZlIHRvIHRoZSBhZGFwdGVyLCBvZiB0aGUgZW5kIG9mIHRoZSB3aW5kb3cgb2Ygdmlld3MKKyAgICAgKi8KKyAgICBpbnQgbUN1cnJlbnRXaW5kb3dFbmQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayAjbUN1cnJlbnRXaW5kb3dTdGFydH0sIGV4Y2VwdCB3aGVuIHRoZSB3ZSBoYXZlIGJvdW5kZWQKKyAgICAgKiB7QGxpbmsgI21DdXJyZW50V2luZG93U3RhcnR9IHRvIGJlIG5vbi1uZWdhdGl2ZQorICAgICAqLworICAgIGludCBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkID0gMDsKKworICAgIC8qKgorICAgICAqIEhhbmRsZXIgdG8gcG9zdCBldmVudHMgdG8gdGhlIG1haW4gdGhyZWFkCisgICAgICovCisgICAgSGFuZGxlciBtTWFpblF1ZXVlOworCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgZGF0YSBjaGFuZ2VzIGZyb20gdGhlIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBBZGFwdGVyRGF0YVNldE9ic2VydmVyIG1EYXRhU2V0T2JzZXJ2ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIEFkYXB0ZXJ9IGZvciB0aGlzIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIEFkYXB0ZXIgbUFkYXB0ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIFJlbW90ZVZpZXdzQWRhcHRlcn0gZm9yIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgUmVtb3RlVmlld3NBZGFwdGVyIG1SZW1vdGVWaWV3c0FkYXB0ZXI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBhbmltYXRvciBpcyBzaG93aW5nIHZpZXdzCisgICAgICovCisgICAgYm9vbGVhbiBtRmlyc3RUaW1lID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyBpZiB0aGUgYW5pbWF0b3Igc2hvdWxkIHdyYXAgZnJvbSAwIHRvIHRoZSBlbmQgYW5kIHZpY2UgdmVyc2EKKyAgICAgKiBvciBoYXZlIGhhcmQgYm91bmRhcmllcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQKKyAgICAgKi8KKyAgICBib29sZWFuIG1Mb29wVmlld3MgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2Ygc29tZSBjaGlsZCwgdXNlZCBhcyBhIHNpemUgcmVmZXJlbmNlIGluLWNhc2Ugb3VyCisgICAgICogZGltZW5zaW9ucyBhcmUgdW5zcGVjaWZpZWQgYnkgdGhlIHBhcmVudC4KKyAgICAgKi8KKyAgICBpbnQgbVJlZmVyZW5jZUNoaWxkV2lkdGggPSAtMTsKKyAgICBpbnQgbVJlZmVyZW5jZUNoaWxkSGVpZ2h0ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBJbiBhbmQgb3V0IGFuaW1hdGlvbnMuCisgICAgICovCisgICAgT2JqZWN0QW5pbWF0b3I8Pz4gbUluQW5pbWF0aW9uOworICAgIE9iamVjdEFuaW1hdG9yPD8+IG1PdXRBbmltYXRpb247CisKKyAgICBwcml2YXRlICBBcnJheUxpc3Q8Vmlldz4gbVZpZXdzVG9CcmluZ1RvRnJvbnQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04gPSAyMDA7CisKKyAgICBwdWJsaWMgQWRhcHRlclZpZXdBbmltYXRvcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXRWaWV3QW5pbWF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWRhcHRlclZpZXdBbmltYXRvcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFkYXB0ZXJWaWV3QW5pbWF0b3IpOworICAgICAgICBpbnQgcmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWRhcHRlclZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbiwgMCk7CisgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKKyAgICAgICAgICAgIHNldEluQW5pbWF0aW9uKGNvbnRleHQsIHJlc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEluQW5pbWF0aW9uKGdldERlZmF1bHRJbkFuaW1hdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFkYXB0ZXJWaWV3QW5pbWF0b3Jfb3V0QW5pbWF0aW9uLCAwKTsKKyAgICAgICAgaWYgKHJlc291cmNlID4gMCkgeworICAgICAgICAgICAgc2V0T3V0QW5pbWF0aW9uKGNvbnRleHQsIHJlc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldE91dEFuaW1hdGlvbihnZXREZWZhdWx0T3V0QW5pbWF0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBmbGFnID0gYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFkYXB0ZXJWaWV3QW5pbWF0b3JfYW5pbWF0ZUZpcnN0VmlldywgdHJ1ZSk7CisgICAgICAgIHNldEFuaW1hdGVGaXJzdFZpZXcoZmxhZyk7CisKKyAgICAgICAgbUxvb3BWaWV3cyA9IGEuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BZGFwdGVyVmlld0FuaW1hdG9yX2xvb3BWaWV3cywgZmFsc2UpOworCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIGluaXRWaWV3QW5pbWF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRWaWV3QW5pbWF0b3IoKSB7CisgICAgICAgIG1NYWluUXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisgICAgICAgIG1QcmV2aW91c1ZpZXdzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICBtVmlld3NUb0JyaW5nVG9Gcm9udCA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFZpZXdBbmRJbmRleCB7CisgICAgICAgIFZpZXdBbmRJbmRleChWaWV3IHYsIGludCBpKSB7CisgICAgICAgICAgICB2aWV3ID0gdjsKKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHZpZXc7CisgICAgICAgIGludCBpbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gY29uZmlndXJlIHRoZSBhbmltYXRvciB0byBkaXNwbGF5IHRoZQorICAgICAqIGRlc2lyZWQgbnVtYmVyIG9mIHZpZXdzLCBhbmQgc3BlY2lmeSB0aGUgb2Zmc2V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbnVtVmlzaWJsZVZpZXdzIFRoZSBudW1iZXIgb2Ygdmlld3MgdGhlIGFuaW1hdG9yIGtlZXBzIGluIHRoZSB7QGxpbmsgVmlld0dyb3VwfQorICAgICAqIEBwYXJhbSBhY3RpdmVPZmZzZXQgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRoZSBjdXJyZW50IGluZGV4ICh7QGxpbmsgI21XaGljaENoaWxkfSkKKyAgICAgKiAgICAgICAgc2l0cyB3aXRoaW4gdGhlIHdpbmRvdy4gRm9yIGV4YW1wbGUgaWYgYWN0aXZlT2Zmc2V0IGlzIDEsIGFuZCBudW1WaXNpYmxlVmlld3MgaXMgMywKKyAgICAgKiAgICAgICAgYW5kIHtAbGluayAjc2V0RGlzcGxheWVkQ2hpbGQoaW50KX0gaXMgY2FsbGVkIHdpdGggMTAsIHRoZW4gdGhlIGVmZmVjdGl2ZSB3aW5kb3cgd2lsbAorICAgICAqICAgICAgICBiZSB0aGUgaW5kZXhlcyA5LCAxMCwgYW5kIDExLiBJbiB0aGUgc2FtZSBleGFtcGxlLCBpZiBhY3RpdmVPZmZzZXQgd2VyZSAwLCB0aGVuIHRoZQorICAgICAqICAgICAgICB3aW5kb3cgd291bGQgaW5zdGVhZCBjb250YWluIGluZGV4ZXMgMTAsIDExIGFuZCAxMi4KKyAgICAgKiBAcGFyYW0gc2hvdWxkTG9vcCBJZiB0aGUgYW5pbWF0b3IgaXMgc2hvdyB2aWV3IDAsIGFuZCBzZXRQcmV2aW91cygpIGlzIGNhbGxlZCwgZG8gd2UKKyAgICAgKiAgICAgICAgd2UgbG9vcCBiYWNrIHRvIHRoZSBlbmQsIG9yIGRvIHdlIGRvIG5vdGhpbmcKKyAgICAgKi8KKyAgICAgdm9pZCBjb25maWd1cmVWaWV3QW5pbWF0b3IoaW50IG51bVZpc2libGVWaWV3cywgaW50IGFjdGl2ZU9mZnNldCkgeworICAgICAgICBpZiAoYWN0aXZlT2Zmc2V0ID4gbnVtVmlzaWJsZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUuCisgICAgICAgIH0KKyAgICAgICAgbU51bUFjdGl2ZVZpZXdzID0gbnVtVmlzaWJsZVZpZXdzOworICAgICAgICBtQWN0aXZlT2Zmc2V0ID0gYWN0aXZlT2Zmc2V0OworICAgICAgICBtUHJldmlvdXNWaWV3cy5jbGVhcigpOworICAgICAgICBtVmlld3NNYXAuY2xlYXIoKTsKKyAgICAgICAgcmVtb3ZlQWxsVmlld3NJbkxheW91dCgpOworICAgICAgICBtQ3VycmVudFdpbmRvd1N0YXJ0ID0gMDsKKyAgICAgICAgbUN1cnJlbnRXaW5kb3dFbmQgPSAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gY3VzdG9taXplIHZpZXcgdHJhbnNpdGlvbnMgd2l0aGluCisgICAgICogdGhlIHNldCBvZiB2aXNpYmxlIHZpZXdzCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSByZWxhdGl2ZSBpbmRleCB3aXRoaW4gdGhlIHdpbmRvdyB0aGF0IHRoZSB2aWV3IHdhcyBpbiwgLTEgaWYgaXQgd2Fzbid0CisgICAgICogICAgICAgIGluIHRoZSB3aW5kb3cKKyAgICAgKiBAcGFyYW0gdG9JbmRleCBUaGUgcmVsYXRpdmUgaW5kZXggd2l0aGluIHRoZSB3aW5kb3cgdGhhdCB0aGUgdmlldyBpcyBnb2luZyB0bywgLTEgaWYgaXQgaXMKKyAgICAgKiAgICAgICAgYmVpbmcgcmVtb3ZlZAorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgaXMgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICB2b2lkIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgVmlldyB2aWV3KSB7CisgICAgICAgIGlmIChmcm9tSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIG1JbkFuaW1hdGlvbi5zZXRUYXJnZXQodmlldyk7CisgICAgICAgICAgICBtSW5BbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmICh0b0luZGV4ID09IC0xKSB7CisgICAgICAgICAgICBtT3V0QW5pbWF0aW9uLnNldFRhcmdldCh2aWV3KTsKKyAgICAgICAgICAgIG1PdXRBbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9iamVjdEFuaW1hdG9yPD8+IGdldERlZmF1bHRJbkFuaW1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RBbmltYXRvcjxGbG9hdD4oREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04sIG51bGwsICJhbHBoYSIsIDAuMGYsIDEuMGYpOworICAgIH0KKworICAgIE9iamVjdEFuaW1hdG9yPD8+IGdldERlZmF1bHRPdXRBbmltYXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+KERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OLCBudWxsLCAiYWxwaGEiLCAxLjBmLCAwLjBmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoaWNoIGNoaWxkIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hpY2hDaGlsZCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHZpZXcgdG8gZGlzcGxheQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXllZENoaWxkKGludCB3aGljaENoaWxkKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IHdoaWNoQ2hpbGQ7CisgICAgICAgICAgICBpZiAod2hpY2hDaGlsZCA+PSBtQWRhcHRlci5nZXRDb3VudCgpKSB7CisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtTG9vcFZpZXdzID8gMCA6IG1BZGFwdGVyLmdldENvdW50KCkgLSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGljaENoaWxkIDwgMCkgeworICAgICAgICAgICAgICAgIG1XaGljaENoaWxkID0gbUxvb3BWaWV3cyA/IG1BZGFwdGVyLmdldENvdW50KCkgLSAxIDogMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBoYXNGb2N1cyA9IGdldEZvY3VzZWRDaGlsZCgpICE9IG51bGw7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgY2xlYXIgb2xkIGZvY3VzIGlmIHdlIGhhZCBpdAorICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQpOworICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKSB7CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHJldGFrZSBmb2N1cyBpZiB3ZSBoYWQgaXQKKyAgICAgICAgICAgICAgICByZXF1ZXN0Rm9jdXMoRk9DVVNfRk9SV0FSRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUbyBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIFRoaXMgbWV0aG9kIGFwcGxpZXMgYSB2aWV3IC8gaW5kZXggc3BlY2lmaWMKKyAgICAgKiB0cmFuc2Zvcm0gdG8gdGhlIGNoaWxkIHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVJbmRleAorICAgICAqLworICAgIHZvaWQgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgoVmlldyBjaGlsZCwgaW50IHJlbGF0aXZlSW5kZXgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBjaGlsZCB2aWV3LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGxheWVkQ2hpbGQoKSB7CisgICAgICAgIHJldHVybiBtV2hpY2hDaGlsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYW51YWxseSBzaG93cyB0aGUgbmV4dCBjaGlsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93TmV4dCgpIHsKKyAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQobVdoaWNoQ2hpbGQgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYW51YWxseSBzaG93cyB0aGUgcHJldmlvdXMgY2hpbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd1ByZXZpb3VzKCkgeworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCAtIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3dzIG9ubHkgdGhlIHNwZWNpZmllZCBjaGlsZC4gVGhlIG90aGVyIGRpc3BsYXlzIFZpZXdzIGV4aXQgdGhlIHNjcmVlbiwKKyAgICAgKiBvcHRpb25hbGx5IHdpdGggdGhlIHdpdGggdGhlIHtAbGluayAjZ2V0T3V0QW5pbWF0aW9uKCkgb3V0IGFuaW1hdGlvbn0gYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBjaGlsZCBlbnRlcnMgdGhlIHNjcmVlbiwgb3B0aW9uYWxseSB3aXRoIHRoZQorICAgICAqIHtAbGluayAjZ2V0SW5BbmltYXRpb24oKSBpbiBhbmltYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBzaG93bi4KKyAgICAgKiBAcGFyYW0gYW5pbWF0ZSBXaGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIGluIGFuZCBvdXQgYW5pbWF0aW9ucywgZGVmYXVsdHMKKyAgICAgKiAgICAgICAgICAgIHRvIHRydWUuCisgICAgICovCisgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCwgYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIHNob3dPbmx5KGNoaWxkSW5kZXgsIGFuaW1hdGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtb2R1bG8oaW50IHBvcywgaW50IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gKHNpemUgKyAocG9zICUgc2l6ZSkpICUgc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2aWV3IGF0IHRoaXMgaW5kZXggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd2luZG93J3Mgc3RhcnQKKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxhdGl2ZUluZGV4IFBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdpbmRvdydzIHN0YXJ0CisgICAgICogQHJldHVybiBWaWV3IGF0IHRoaXMgaW5kZXgsIG51bGwgaWYgdGhlIGluZGV4IGlzIG91dHNpZGUgdGhlIGJvdW5kcworICAgICAqLworICAgIFZpZXcgZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChpbnQgcmVsYXRpdmVJbmRleCkgeworICAgICAgICBpZiAocmVsYXRpdmVJbmRleCA+PSAwICYmIHJlbGF0aXZlSW5kZXggPD0gbU51bUFjdGl2ZVZpZXdzIC0gMSAmJiBtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgYWRhcHRlckNvdW50ID0gIG1BZGFwdGVyLmdldENvdW50KCk7CisgICAgICAgICAgICBpbnQgaSA9IG1vZHVsbyhtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkICsgcmVsYXRpdmVJbmRleCwgYWRhcHRlckNvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBtVmlld3NNYXAuZ2V0KGkpLnZpZXc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgTGF5b3V0UGFyYW1zIGNyZWF0ZU9yUmV1c2VMYXlvdXRQYXJhbXMoVmlldyB2KSB7CisgICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgY3VycmVudExwID0gdi5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRMcCBpbnN0YW5jZW9mIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIGN1cnJlbnRMcDsKKyAgICAgICAgICAgIHJldHVybiBscDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoMCwgMCk7CisgICAgfQorCisgICAgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBtQ3VycmVudFdpbmRvd1N0YXJ0OyBpIDw9IG1DdXJyZW50V2luZG93RW5kOyBpKyspIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG1vZHVsbyhpLCBtTnVtQWN0aXZlVmlld3MpOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIGZyZXNoIGNoaWxkIGZyb20gdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIFZpZXcgdXBkYXRlZENoaWxkID0gbUFkYXB0ZXIuZ2V0VmlldyhpLCBudWxsLCB0aGlzKTsKKworICAgICAgICAgICAgaWYgKG1WaWV3c01hcC5jb250YWluc0tleShpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dCBmbCA9IChGcmFtZUxheW91dCkgbVZpZXdzTWFwLmdldChpbmRleCkudmlldzsKKyAgICAgICAgICAgICAgICAvLyBmbHVzaCBvdXQgdGhlIG9sZCBjaGlsZAorICAgICAgICAgICAgICAgIGZsLnJlbW92ZUFsbFZpZXdzSW5MYXlvdXQoKTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG5ldyBjaGlsZCB0byB0aGUgZnJhbWUsIGlmIGl0IGV4aXN0cworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkQ2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmbC5hZGRWaWV3KHVwZGF0ZWRDaGlsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gc28gdGhhdCBzdWJjbGFzc2VzIGNhbiBwcm92aWRlIGEgY3VzdG9tIGZyYW1lIGluIHdoaWNoIHRoZWlyCisgICAgICogY2hpbGRyZW4gY2FuIGxpdmUuIEZvciBleGFtcGxlLCBTdGFja1ZpZXcgYWRkcyBwYWRkaW5nIHRvIGl0cyBjaGlsZHJlbnMnIGZyYW1lcyBzbyBhcyB0bworICAgICAqIGFjY29tb2RhdGUgZm9yIHRoZSBoaWdobGlnaHQgZWZmZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgRnJhbWVMYXlvdXQgaW50byB3aGljaCBjaGlsZHJlbiBjYW4gYmUgcGxhY2VkLgorICAgICAqLworICAgIEZyYW1lTGF5b3V0IGdldEZyYW1lRm9yQ2hpbGQoKSB7CisgICAgICAgIHJldHVybiBuZXcgRnJhbWVMYXlvdXQobUNvbnRleHQpOworICAgIH0KKworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgsIGJvb2xlYW4gYW5pbWF0ZSwgYm9vbGVhbiBvbkxheW91dCkgeworICAgICAgICBpZiAobUFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBmaW5hbCBpbnQgYWRhcHRlckNvdW50ID0gbUFkYXB0ZXIuZ2V0Q291bnQoKTsKKyAgICAgICAgaWYgKGFkYXB0ZXJDb3VudCA9PSAwKSByZXR1cm47CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUHJldmlvdXNWaWV3cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgVmlldyB2aWV3VG9SZW1vdmUgPSBtVmlld3NNYXAuZ2V0KG1QcmV2aW91c1ZpZXdzLmdldChpKSkudmlldzsKKyAgICAgICAgICAgIG1WaWV3c01hcC5yZW1vdmUobVByZXZpb3VzVmlld3MuZ2V0KGkpKTsKKyAgICAgICAgICAgIHZpZXdUb1JlbW92ZS5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgaWYgKHZpZXdUb1JlbW92ZSBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIFZpZXdHcm91cCB2ZyA9IChWaWV3R3JvdXApIHZpZXdUb1JlbW92ZTsKKyAgICAgICAgICAgICAgICB2Zy5yZW1vdmVBbGxWaWV3c0luTGF5b3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleCBoZXJlIGp1c3QgYWxsb3dzIGZvciBhbnkgY2xlYW51cAorICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlldyB0aGF0IG1heSBuZWVkIHRvIGJlIGRvbmUgYnkgYSBzdWJjbGFzcworICAgICAgICAgICAgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgodmlld1RvUmVtb3ZlLCAtMSk7CisKKyAgICAgICAgICAgIHJlbW92ZVZpZXdJbkxheW91dCh2aWV3VG9SZW1vdmUpOworICAgICAgICB9CisgICAgICAgIG1QcmV2aW91c1ZpZXdzLmNsZWFyKCk7CisgICAgICAgIGludCBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCA9IGNoaWxkSW5kZXggLSBtQWN0aXZlT2Zmc2V0OworICAgICAgICBpbnQgbmV3V2luZG93RW5kVW5ib3VuZGVkID0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQgKyBtTnVtQWN0aXZlVmlld3MgLSAxOworICAgICAgICBpbnQgbmV3V2luZG93U3RhcnQgPSBNYXRoLm1heCgwLCBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCk7CisgICAgICAgIGludCBuZXdXaW5kb3dFbmQgPSBNYXRoLm1pbihhZGFwdGVyQ291bnQgLSAxLCBuZXdXaW5kb3dFbmRVbmJvdW5kZWQpOworCisgICAgICAgIGlmIChtTG9vcFZpZXdzKSB7CisgICAgICAgICAgICBuZXdXaW5kb3dTdGFydCA9IG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkOworICAgICAgICAgICAgbmV3V2luZG93RW5kID0gbmV3V2luZG93RW5kVW5ib3VuZGVkOworICAgICAgICB9CisgICAgICAgIGludCByYW5nZVN0YXJ0ID0gbW9kdWxvKG5ld1dpbmRvd1N0YXJ0LCBhZGFwdGVyQ291bnQpOworICAgICAgICBpbnQgcmFuZ2VFbmQgPSBtb2R1bG8obmV3V2luZG93RW5kLCBhZGFwdGVyQ291bnQpOworCisgICAgICAgIGJvb2xlYW4gd3JhcCA9IGZhbHNlOworICAgICAgICBpZiAocmFuZ2VTdGFydCA+IHJhbmdlRW5kKSB7CisgICAgICAgICAgICB3cmFwID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgc2VjdGlvbiBjbGVhcnMgb3V0IGFueSBpdGVtcyB0aGF0IGFyZSBpbiBvdXIgYWN0aXZlIHZpZXdzIGxpc3QKKyAgICAgICAgLy8gYnV0IGFyZSBvdXRzaWRlIHRoZSBlZmZlY3RpdmUgYm91bmRzIG9mIG91ciB3aW5kb3cgKHRoaXMgaXMgYmVjb21lcyBhbiBpc3N1ZQorICAgICAgICAvLyBhdCB0aGUgZXh0cmVtaXRpZXMgb2YgdGhlIGxpc3QsIGVnLiB3aGVyZSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCA8IDAgb3IKKyAgICAgICAgLy8gbmV3V2luZG93RW5kVW5ib3VuZGVkID4gbUFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEKKyAgICAgICAgZm9yIChJbnRlZ2VyIGluZGV4IDogbVZpZXdzTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBib29sZWFuIHJlbW92ZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCF3cmFwICYmIChpbmRleCA8IHJhbmdlU3RhcnQgfHwgaW5kZXggPiByYW5nZUVuZCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh3cmFwICYmIChpbmRleCA+IHJhbmdlRW5kICYmIGluZGV4IDwgcmFuZ2VTdGFydCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVtb3ZlKSB7CisgICAgICAgICAgICAgICAgVmlldyBwcmV2aW91c1ZpZXcgPSBtVmlld3NNYXAuZ2V0KGluZGV4KS52aWV3OworICAgICAgICAgICAgICAgIGludCBvbGRSZWxhdGl2ZUluZGV4ID0gbVZpZXdzTWFwLmdldChpbmRleCkuaW5kZXg7CisKKyAgICAgICAgICAgICAgICBtUHJldmlvdXNWaWV3cy5hZGQoaW5kZXgpOworICAgICAgICAgICAgICAgIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihvbGRSZWxhdGl2ZUluZGV4LCAtMSwgcHJldmlvdXNWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgaGFzIGNoYW5nZWQKKyAgICAgICAgaWYgKCEobmV3V2luZG93U3RhcnQgPT0gbUN1cnJlbnRXaW5kb3dTdGFydCAmJiBuZXdXaW5kb3dFbmQgPT0gbUN1cnJlbnRXaW5kb3dFbmQpKSB7CisgICAgICAgICAgICAvLyBSdW4gdGhyb3VnaCB0aGUgaW5kaWNlcyBpbiB0aGUgbmV3IHJhbmdlCisgICAgICAgICAgICBmb3IgKGludCBpID0gbmV3V2luZG93U3RhcnQ7IGkgPD0gbmV3V2luZG93RW5kOyBpKyspIHsKKworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1vZHVsbyhpLCBhZGFwdGVyQ291bnQpOworICAgICAgICAgICAgICAgIGludCBvbGRSZWxhdGl2ZUluZGV4OworICAgICAgICAgICAgICAgIGlmIChtVmlld3NNYXAuY29udGFpbnNLZXkoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIG9sZFJlbGF0aXZlSW5kZXggPSBtVmlld3NNYXAuZ2V0KGluZGV4KS5pbmRleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvbGRSZWxhdGl2ZUluZGV4ID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZXdSZWxhdGl2ZUluZGV4ID0gaSAtIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpdGVtIGlzIGluIHRoZSBjdXJyZW50IHdpbmRvdywgZ3JlYXQsIHdlIGp1c3QgbmVlZCB0byBhcHBseQorICAgICAgICAgICAgICAgIC8vIHRoZSB0cmFuc2Zvcm0gZm9yIGl0J3MgbmV3IHJlbGF0aXZlIHBvc2l0aW9uIGluIHRoZSB3aW5kb3csIGFuZCBhbmltYXRlCisgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBpdCdzIGN1cnJlbnQgYW5kIG5ldyByZWxhdGl2ZSBwb3NpdGlvbnMKKyAgICAgICAgICAgICAgICBib29sZWFuIGluT2xkUmFuZ2UgPSBtVmlld3NNYXAuY29udGFpbnNLZXkoaW5kZXgpICYmICFtUHJldmlvdXNWaWV3cy5jb250YWlucyhpbmRleCk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5PbGRSYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBtVmlld3NNYXAuZ2V0KGluZGV4KS52aWV3OworICAgICAgICAgICAgICAgICAgICBtVmlld3NNYXAuZ2V0KGluZGV4KS5pbmRleCA9IG5ld1JlbGF0aXZlSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KHZpZXcsIG5ld1JlbGF0aXZlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24ob2xkUmVsYXRpdmVJbmRleCwgbmV3UmVsYXRpdmVJbmRleCwgdmlldyk7CisKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhpcyB2aWV3IGlzIG5ldyB0byB0aGUgd2luZG93CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXcgdmlldyBmcm9tIHRoZSBhZGFwdGVyLCBhZGQgaXQgYW5kIGFwcGx5IGFueSB0cmFuc2Zvcm0gLyBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgVmlldyBuZXdWaWV3ID0gbUFkYXB0ZXIuZ2V0Vmlldyhtb2R1bG8oaSwgYWRhcHRlckNvdW50KSwgbnVsbCwgdGhpcyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd3JhcCB0aGUgbmV3IHZpZXcgaW4gYSBGcmFtZUxheW91dCBzbyBhcyB0byByZXNwZWN0IHRoZSBjb250cmFjdAorICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBhZGFwdGVyLCB0aGF0IGlzLCB0aGF0IHdlIGRvbid0IG1vZGlmeSB0aGlzIHZpZXcgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmwgPSBnZXRGcmFtZUZvckNoaWxkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZpZXcgZnJvbSB0aGUgYWRhcHRlciBpcyBudWxsLCB3ZSBzdGlsbCBrZWVwIGFuIGVtcHR5IGZyYW1lIGluIHBsYWNlCisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmwuYWRkVmlldyhuZXdWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtVmlld3NNYXAucHV0KGluZGV4LCBuZXcgVmlld0FuZEluZGV4KGZsLCBuZXdSZWxhdGl2ZUluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIGFkZENoaWxkKGZsKTsKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgoZmwsIG5ld1JlbGF0aXZlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24oLTEsIG5ld1JlbGF0aXZlSW5kZXgsIGZsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVZpZXdzTWFwLmdldChpbmRleCkudmlldy5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmlld3NUb0JyaW5nVG9Gcm9udC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFZpZXcgdiA9IG1WaWV3c1RvQnJpbmdUb0Zyb250LmdldChpKTsKKyAgICAgICAgICAgICAgICB2LmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVZpZXdzVG9CcmluZ1RvRnJvbnQuY2xlYXIoKTsKKworICAgICAgICAgICAgbUN1cnJlbnRXaW5kb3dTdGFydCA9IG5ld1dpbmRvd1N0YXJ0OworICAgICAgICAgICAgbUN1cnJlbnRXaW5kb3dFbmQgPSBuZXdXaW5kb3dFbmQ7CisgICAgICAgICAgICBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkID0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQ7CisgICAgICAgIH0KKworICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgIGlmICghb25MYXlvdXQpIHsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBBZGFwdGVyIHRyaWVzIHRvIGxheW91dCB0aGUgY3VycmVudCB2aWV3IHdoZW4gd2UgZ2V0IGl0IHVzaW5nIGdldFZpZXcKKyAgICAgICAgICAgIC8vIGFib3ZlIHRoZSBsYXlvdXQgd2lsbCBlbmQgdXAgYmVpbmcgaWdub3JlZCBzaW5jZSB3ZSBhcmUgY3VycmVudGx5IGxheWluZyBvdXQsIHNvCisgICAgICAgICAgICAvLyB3ZSBwb3N0IGEgZGVsYXllZCByZXF1ZXN0TGF5b3V0IGFuZCBpbnZhbGlkYXRlCisgICAgICAgICAgICBtTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkQ2hpbGQoVmlldyBjaGlsZCkgeworICAgICAgICBhZGRWaWV3SW5MYXlvdXQoY2hpbGQsIC0xLCBjcmVhdGVPclJldXNlTGF5b3V0UGFyYW1zKGNoaWxkKSk7CisKKyAgICAgICAgLy8gVGhpcyBjb2RlIGlzIHVzZWQgdG8gb2J0YWluIGEgcmVmZXJlbmNlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYSBjaGlsZCBpbiBjYXNlIHdlIG5lZWQKKyAgICAgICAgLy8gdG8gZGVjaWRlIG91ciBvd24gc2l6ZS4gVE9ETzogRG8gd2Ugd2FudCB0byB1cGRhdGUgdGhlIHNpemUgb2YgdGhlIGNoaWxkIHRoYXQgd2UncmUKKyAgICAgICAgLy8gdXNpbmcgZm9yIHJlZmVyZW5jZSBzaXplPyBJZiBzbywgd2hlbj8KKyAgICAgICAgaWYgKG1SZWZlcmVuY2VDaGlsZFdpZHRoID09IC0xIHx8IG1SZWZlcmVuY2VDaGlsZEhlaWdodCA9PSAtMSkgeworICAgICAgICAgICAgaW50IG1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUobWVhc3VyZVNwZWMsIG1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIG1SZWZlcmVuY2VDaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgbVJlZmVyZW5jZUNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtZWFzdXJlQ2hpbGRyZW4oKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGggPSBtTWVhc3VyZWRXaWR0aCAtIG1QYWRkaW5nTGVmdCAtIG1QYWRkaW5nUmlnaHQ7CisgICAgICAgIGZpbmFsIGludCBjaGlsZEhlaWdodCA9IG1NZWFzdXJlZEhlaWdodCAtIG1QYWRkaW5nVG9wIC0gbVBhZGRpbmdCb3R0b207CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGNoaWxkV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY2hpbGRIZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCB3aWR0aFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgYm9vbGVhbiBoYXZlQ2hpbGRSZWZTaXplID0gKG1SZWZlcmVuY2VDaGlsZFdpZHRoICE9IC0xICYmIG1SZWZlcmVuY2VDaGlsZEhlaWdodCAhPSAtMSk7CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgb3VyIHBhcmVudCBoYXNuJ3QgdG9sZCB1cyBob3cKKyAgICAgICAgLy8gYmlnIHdlIHNob3VsZCBiZS4gSW4gdGhpcyBjYXNlIHdlIHRyeSB0byB1c2UgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgZmlyc3QKKyAgICAgICAgLy8gY2hpbGQgYWRkZWQuCisgICAgICAgIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgaGVpZ2h0U3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8gbVJlZmVyZW5jZUNoaWxkSGVpZ2h0ICsgbVBhZGRpbmdUb3AgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ0JvdHRvbSA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgaGVpZ2h0U3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8gTWF0aC5taW4obVJlZmVyZW5jZUNoaWxkSGVpZ2h0ICsgbVBhZGRpbmdUb3AgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ0JvdHRvbSwgaGVpZ2h0U3BlY1NpemUpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aWR0aFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICB3aWR0aFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/IG1SZWZlcmVuY2VDaGlsZFdpZHRoICsgbVBhZGRpbmdMZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdSaWdodCA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgd2lkdGhTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBNYXRoLm1pbihtUmVmZXJlbmNlQ2hpbGRXaWR0aCArIG1QYWRkaW5nTGVmdCArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nUmlnaHQsIHdpZHRoU3BlY1NpemUpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoU3BlY1NpemUsIGhlaWdodFNwZWNTaXplKTsKKyAgICAgICAgbWVhc3VyZUNoaWxkcmVuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIGJvb2xlYW4gZGF0YUNoYW5nZWQgPSBtRGF0YUNoYW5nZWQ7CisgICAgICAgIGlmIChkYXRhQ2hhbmdlZCkgeworICAgICAgICAgICAgaGFuZGxlRGF0YUNoYW5nZWQoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlIGRhdGEgY2hhbmdlcywgbVdoaWNoQ2hpbGQgbWlnaHQgYmUgb3V0IG9mIHRoZSBib3VuZHMgb2YgdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgd2UgcmVzZXQgbVdoaWNoQ2hpbGQgdG8gdGhlIGJlZ2lubmluZworICAgICAgICAgICAgaWYgKG1XaGljaENoaWxkID49IG1BZGFwdGVyLmdldENvdW50KCkpIHsKKyAgICAgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IDA7CisKKyAgICAgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisKKyAgICAgICAgICAgIGludCBjaGlsZFJpZ2h0ID0gbVBhZGRpbmdMZWZ0ICsgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgaW50IGNoaWxkQm90dG9tID0gbVBhZGRpbmdUb3AgKyBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworCisgICAgICAgICAgICBjaGlsZC5sYXlvdXQobVBhZGRpbmdMZWZ0LCBtUGFkZGluZ1RvcCwgY2hpbGRSaWdodCwgY2hpbGRCb3R0b20pOworICAgICAgICB9CisgICAgICAgIG1EYXRhQ2hhbmdlZCA9IGZhbHNlOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgeworICAgICAgICBpbnQgd2hpY2hDaGlsZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3Ijb25TYXZlSW5zdGFuY2VTdGF0ZSgpfQorICAgICAgICAgKi8KKyAgICAgICAgU2F2ZWRTdGF0ZShQYXJjZWxhYmxlIHN1cGVyU3RhdGUsIGludCB3aGljaENoaWxkKSB7CisgICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKKyAgICAgICAgICAgIHRoaXMud2hpY2hDaGlsZCA9IHdoaWNoQ2hpbGQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rICNDUkVBVE9SfQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTYXZlZFN0YXRlKFBhcmNlbCBpbikgeworICAgICAgICAgICAgc3VwZXIoaW4pOworICAgICAgICAgICAgdGhpcy53aGljaENoaWxkID0gaW4ucmVhZEludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBzdXBlci53cml0ZVRvUGFyY2VsKG91dCwgZmxhZ3MpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHRoaXMud2hpY2hDaGlsZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQWRhcHRlclZpZXdBbmltYXRvci5TYXZlZFN0YXRleyB3aGljaENoaWxkID0gIiArIHRoaXMud2hpY2hDaGlsZCArICIgfSI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+KCkgeworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGUoaW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CisgICAgICAgIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKHN1cGVyU3RhdGUsIG1XaGljaENoaWxkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKFBhcmNlbGFibGUgc3RhdGUpIHsKKyAgICAgICAgU2F2ZWRTdGF0ZSBzcyA9IChTYXZlZFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzcy5nZXRTdXBlclN0YXRlKCkpOworCisgICAgICAgIC8vIEhlcmUgd2Ugc2V0IG1XaGljaENoaWxkIGluIGFkZGl0aW9uIHRvIHNldERpc3BsYXllZENoaWxkCisgICAgICAgIC8vIFdlIGRvIHRoZSBmb3JtZXIgaW4gY2FzZSBtQWRhcHRlciBpcyBudWxsLCBhbmQgaGVuY2Ugc2V0RGlzcGxheWVkQ2hpbGQgd29uJ3QKKyAgICAgICAgLy8gc2V0IG1XaGljaENoaWxkCisgICAgICAgIG1XaGljaENoaWxkID0gc3Mud2hpY2hDaGlsZDsKKyAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQobVdoaWNoQ2hpbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3dzIG9ubHkgdGhlIHNwZWNpZmllZCBjaGlsZC4gVGhlIG90aGVyIGRpc3BsYXlzIFZpZXdzIGV4aXQgdGhlIHNjcmVlbgorICAgICAqIHdpdGggdGhlIHtAbGluayAjZ2V0T3V0QW5pbWF0aW9uKCkgb3V0IGFuaW1hdGlvbn0gYW5kIHRoZSBzcGVjaWZpZWQgY2hpbGQKKyAgICAgKiBlbnRlcnMgdGhlIHNjcmVlbiB3aXRoIHRoZSB7QGxpbmsgI2dldEluQW5pbWF0aW9uKCkgaW4gYW5pbWF0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgc2hvd24uCisgICAgICovCisgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCkgeworICAgICAgICBmaW5hbCBib29sZWFuIGFuaW1hdGUgPSAoIW1GaXJzdFRpbWUgfHwgbUFuaW1hdGVGaXJzdFRpbWUpOworICAgICAgICBzaG93T25seShjaGlsZEluZGV4LCBhbmltYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBWaWV3IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBWaWV3IGN1cnJlbnRseSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXREaXNwbGF5ZWRDaGlsZCgpCisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0Q3VycmVudFZpZXcoKSB7CisgICAgICAgIHJldHVybiBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KG1BY3RpdmVPZmZzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gQW5pbWF0aW9uIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRJbkFuaW1hdGlvbihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKKyAgICAgKiBAc2VlICNzZXRJbkFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RBbmltYXRvcjw/PiBnZXRJbkFuaW1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1JbkFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZW50ZXJzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5BbmltYXRpb24gVGhlIGFuaW1hdGlvbiBzdGFydGVkIHdoZW4gYSBWaWV3IGVudGVycyB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0SW5BbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldEluQW5pbWF0aW9uKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5BbmltYXRpb24oT2JqZWN0QW5pbWF0b3I8Pz4gaW5BbmltYXRpb24pIHsKKyAgICAgICAgbUluQW5pbWF0aW9uID0gaW5BbmltYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGV4aXRzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIEFuaW1hdGlvbiBvciBudWxsIGlmIG5vbmUgaXMgc2V0LgorICAgICAqCisgICAgICogQHNlZSAjc2V0T3V0QW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqIEBzZWUgI3NldE91dEFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RBbmltYXRvcjw/PiBnZXRPdXRBbmltYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtT3V0QW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBleGl0IHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0QW5pbWF0aW9uIFRoZSBhbmltYXRpb24gc3RhcnRlZCB3aGVuIGEgVmlldyBleGl0IHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRPdXRBbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldE91dEFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dEFuaW1hdGlvbihPYmplY3RBbmltYXRvcjw/PiBvdXRBbmltYXRpb24pIHsKKyAgICAgICAgbU91dEFuaW1hdGlvbiA9IG91dEFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZW50ZXJzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJRCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEluQW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRJbkFuaW1hdGlvbihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbkFuaW1hdGlvbihDb250ZXh0IGNvbnRleHQsIGludCByZXNvdXJjZUlEKSB7CisgICAgICAgIHNldEluQW5pbWF0aW9uKChPYmplY3RBbmltYXRvcjw/PikgQW5pbWF0b3JJbmZsYXRlci5sb2FkQW5pbWF0b3IoY29udGV4dCwgcmVzb3VyY2VJRCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBleGl0IHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJRCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldE91dEFuaW1hdGlvbigpCisgICAgICogQHNlZSAjc2V0T3V0QW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dEFuaW1hdGlvbihDb250ZXh0IGNvbnRleHQsIGludCByZXNvdXJjZUlEKSB7CisgICAgICAgIHNldE91dEFuaW1hdGlvbigoT2JqZWN0QW5pbWF0b3I8Pz4pIEFuaW1hdG9ySW5mbGF0ZXIubG9hZEFuaW1hdG9yKGNvbnRleHQsIHJlc291cmNlSUQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBWaWV3IHNob3VsZCBiZSBhbmltYXRlZCB0aGUgZmlyc3QgdGltZQorICAgICAqIHRoZSBWaWV3QW5pbWF0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbmltYXRlIFRydWUgdG8gYW5pbWF0ZSB0aGUgY3VycmVudCBWaWV3IHRoZSBmaXJzdCB0aW1lIGl0IGlzIGRpc3BsYXllZCwKKyAgICAgKiAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5pbWF0ZUZpcnN0Vmlldyhib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgbUFuaW1hdGVGaXJzdFRpbWUgPSBhbmltYXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKSB7CisgICAgICAgIHJldHVybiAoZ2V0Q3VycmVudFZpZXcoKSAhPSBudWxsKSA/IGdldEN1cnJlbnRWaWV3KCkuZ2V0QmFzZWxpbmUoKSA6IHN1cGVyLmdldEJhc2VsaW5lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFkYXB0ZXIgZ2V0QWRhcHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1BZGFwdGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgY2hlY2tGb2N1cygpOworCisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtRGF0YVNldE9ic2VydmVyID0gbmV3IEFkYXB0ZXJEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgICAgIG1BZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQWRhcHRlclZpZXdBbmltYXRvciB0byB1c2UgYSByZW1vdGUgdmlld3MgYWRhcHRlciB3aGljaCBjb25uZWN0cyB0byBhCisgICAgICogUmVtb3RlVmlld3NTZXJ2aWNlIHRocm91Z2ggdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0bworICAgICAqICAgICAgICBjb25uZWN0IHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhIFJlbW90ZVZpZXdzQWRhcHRlciB0aGF0IGlzIGJvdW5kIHRvIGFuIGV4aXN0aW5nCisgICAgICAgIC8vIHNlcnZpY2UgaGFuZGxpbmcgdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICAgIGlmIChtUmVtb3RlVmlld3NBZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEludGVudC5GaWx0ZXJDb21wYXJpc29uIGZjTmV3ID0gbmV3IEludGVudC5GaWx0ZXJDb21wYXJpc29uKGludGVudCk7CisgICAgICAgICAgICBJbnRlbnQuRmlsdGVyQ29tcGFyaXNvbiBmY09sZCA9IG5ldyBJbnRlbnQuRmlsdGVyQ29tcGFyaXNvbigKKyAgICAgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdzQWRhcHRlci5nZXRSZW1vdGVWaWV3c1NlcnZpY2VJbnRlbnQoKSk7CisgICAgICAgICAgICBpZiAoZmNOZXcuZXF1YWxzKGZjT2xkKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IFJlbW90ZVZpZXdzQWRhcHRlciBmb3IgYmluZGluZworICAgICAgICBtUmVtb3RlVmlld3NBZGFwdGVyID0gbmV3IFJlbW90ZVZpZXdzQWRhcHRlcihnZXRDb250ZXh0KCksIGludGVudCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgZ2V0U2VsZWN0ZWRWaWV3KCkgeworICAgICAgICByZXR1cm4gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChtQWN0aXZlT2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmFjayB3aGVuIHRoZSBhZGFwdGVyIGNvbm5lY3RzIHRvIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCkgeworICAgICAgICBpZiAobVJlbW90ZVZpZXdzQWRhcHRlciAhPSBtQWRhcHRlcikgeworICAgICAgICAgICAgc2V0QWRhcHRlcihtUmVtb3RlVmlld3NBZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgZGlzY29ubmVjdHMgZnJvbSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVWaWV3c0FkYXB0ZXIgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIG1SZW1vdGVWaWV3c0FkYXB0ZXIgPSBudWxsOworICAgICAgICAgICAgc2V0QWRhcHRlcihtUmVtb3RlVmlld3NBZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0ZsaXBwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0ZsaXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDlhZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3RmxpcHBlci5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKKworLyoqCisgKiBTaW1wbGUge0BsaW5rIFZpZXdBbmltYXRvcn0gdGhhdCB3aWxsIGFuaW1hdGUgYmV0d2VlbiB0d28gb3IgbW9yZSB2aWV3cworICogdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gaXQuICBPbmx5IG9uZSBjaGlsZCBpcyBzaG93biBhdCBhIHRpbWUuICBJZgorICogcmVxdWVzdGVkLCBjYW4gYXV0b21hdGljYWxseSBmbGlwIGJldHdlZW4gZWFjaCBjaGlsZCBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwuCisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdGbGlwcGVyX2ZsaXBJbnRlcnZhbAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdGbGlwcGVyX2F1dG9TdGFydAorICovCitAUmVtb3RlVmlldworcHVibGljIGNsYXNzIEFkYXB0ZXJWaWV3RmxpcHBlciBleHRlbmRzIEFkYXB0ZXJWaWV3QW5pbWF0b3IgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlld0ZsaXBwZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HRCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5URVJWQUwgPSAxMDAwMDsKKworICAgIHByaXZhdGUgaW50IG1GbGlwSW50ZXJ2YWwgPSBERUZBVUxUX0lOVEVSVkFMOworICAgIHByaXZhdGUgYm9vbGVhbiBtQXV0b1N0YXJ0ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVZpc2libGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJQcmVzZW50ID0gdHJ1ZTsKKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0ZsaXBwZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0ZsaXBwZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3RmxpcHBlcik7CisgICAgICAgIG1GbGlwSW50ZXJ2YWwgPSBhLmdldEludCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3RmxpcHBlcl9mbGlwSW50ZXJ2YWwsIERFRkFVTFRfSU5URVJWQUwpOworICAgICAgICBtQXV0b1N0YXJ0ID0gYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdGbGlwcGVyX2F1dG9TdGFydCwgZmFsc2UpOworCisgICAgICAgIC8vIEJ5IGRlZmF1bHQgd2Ugd2FudCB0aGUgZmxpcHBlciB0byBsb29wCisgICAgICAgIG1Mb29wVmlld3MgPSBhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWRhcHRlclZpZXdBbmltYXRvcl9sb29wVmlld3MsIHRydWUpOworCisgICAgICAgIGEucmVjeWNsZSgpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEludGVudC5BQ1RJT05fVVNFUl9QUkVTRU5ULmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbVVzZXJQcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOworCisgICAgICAgIC8vIExpc3RlbiBmb3IgYnJvYWRjYXN0cyByZWxhdGVkIHRvIHVzZXItcHJlc2VuY2UKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fVVNFUl9QUkVTRU5UKTsKKyAgICAgICAgZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBmaWx0ZXIpOworCisgICAgICAgIGlmIChtQXV0b1N0YXJ0KSB7CisgICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IHN0YXJ0IHdoZW4gcmVxdWVzdGVkCisgICAgICAgICAgICBzdGFydEZsaXBwaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICAgICAgbVZpc2libGUgPSBmYWxzZTsKKworICAgICAgICBnZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJpbGl0eSk7CisgICAgICAgIG1WaXNpYmxlID0gKHZpc2liaWxpdHkgPT0gVklTSUJMRSk7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIHN1cGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBmbGlwcGluZyB0byB0aGUgbmV4dCB2aWV3CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aW1lIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZsaXBJbnRlcnZhbChpbnQgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgIG1GbGlwSW50ZXJ2YWwgPSBtaWxsaXNlY29uZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSB0aW1lciB0byBjeWNsZSB0aHJvdWdoIGNoaWxkIHZpZXdzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRGbGlwcGluZygpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gbW9yZSBmbGlwcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BGbGlwcGluZygpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICoge0Bpbmhlcml0RG9jfQorICAgICovCisgICBAT3ZlcnJpZGUKKyAgIEBSZW1vdGFibGVWaWV3TWV0aG9kCisgICBwdWJsaWMgdm9pZCBzaG93TmV4dCgpIHsKKyAgICAgICAvLyBpZiB0aGUgZmxpcHBlciBpcyBjdXJyZW50bHkgZmxpcHBpbmcgYXV0b21hdGljYWxseSwgYW5kIHNob3dOZXh0KCkgaXMgY2FsbGVkCisgICAgICAgLy8gd2Ugc2hvdWxkIHdlIHNob3VsZCBtYWtlIHN1cmUgdG8gcmVzZXQgdGhlIHRpbWVyCisgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEZMSVBfTVNHKTsKKyAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEZMSVBfTVNHKTsKKyAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgbUZsaXBJbnRlcnZhbCk7CisgICAgICAgfQorICAgICAgIHN1cGVyLnNob3dOZXh0KCk7CisgICB9CisKKyAgIC8qKgorICAgICoge0Bpbmhlcml0RG9jfQorICAgICovCisgICBAT3ZlcnJpZGUKKyAgIEBSZW1vdGFibGVWaWV3TWV0aG9kCisgICBwdWJsaWMgdm9pZCBzaG93UHJldmlvdXMoKSB7CisgICAgICAgLy8gaWYgdGhlIGZsaXBwZXIgaXMgY3VycmVudGx5IGZsaXBwaW5nIGF1dG9tYXRpY2FsbHksIGFuZCBzaG93UHJldmlvdXMoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB3ZSBzaG91bGQgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byByZXNldCB0aGUgdGltZXIKKyAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRkxJUF9NU0cpOworICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOworICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKKyAgICAgICB9CisgICAgICAgc3VwZXIuc2hvd1ByZXZpb3VzKCk7CisgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gc3RhcnQgb3Igc3RvcCBkaXNwYXRjaGluZyBmbGlwIHtAbGluayBNZXNzYWdlfSBiYXNlZAorICAgICAqIG9uIHtAbGluayAjbVJ1bm5pbmd9IGFuZCB7QGxpbmsgI21WaXNpYmxlfSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUnVubmluZygpIHsKKyAgICAgICAgLy8gYnkgZGVmYXVsdCB3aGVuIHdlIHVwZGF0ZSBydW5uaW5nLCB3ZSB3YW50IHRoZQorICAgICAgICAvLyBjdXJyZW50IHZpZXcgdG8gYW5pbWF0ZSBpbgorICAgICAgICB1cGRhdGVSdW5uaW5nKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0byBzdGFydCBvciBzdG9wIGRpc3BhdGNoaW5nIGZsaXAge0BsaW5rIE1lc3NhZ2V9IGJhc2VkCisgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGZsaXBOb3cgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0byBleGVjdXRlIHRoZSBhbmltYXRpb24gbm93LCBpbgorICAgICAqICAgICAgICAgICAgYWRkaXRpb24gdG8gcXVldWluZyBmdXR1cmUgZmxpcHMuIElmIG9taXR0ZWQsIGRlZmF1bHRzIHRvCisgICAgICogICAgICAgICAgICB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKGJvb2xlYW4gZmxpcE5vdykgeworICAgICAgICBib29sZWFuIHJ1bm5pbmcgPSBtVmlzaWJsZSAmJiBtU3RhcnRlZCAmJiBtVXNlclByZXNlbnQgJiYgbUFkYXB0ZXIgIT0gbnVsbDsKKyAgICAgICAgaWYgKHJ1bm5pbmcgIT0gbVJ1bm5pbmcpIHsKKyAgICAgICAgICAgIGlmIChydW5uaW5nKSB7CisgICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIGZsaXBOb3cpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShGTElQX01TRyk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgbUZsaXBJbnRlcnZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEZMSVBfTVNHKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SdW5uaW5nID0gcnVubmluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoTE9HRCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlUnVubmluZygpIG1WaXNpYmxlPSIgKyBtVmlzaWJsZSArICIsIG1TdGFydGVkPSIgKyBtU3RhcnRlZAorICAgICAgICAgICAgICAgICAgICArICIsIG1Vc2VyUHJlc2VudD0iICsgbVVzZXJQcmVzZW50ICsgIiwgbVJ1bm5pbmc9IiArIG1SdW5uaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2hpbGQgdmlld3MgYXJlIGZsaXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmxpcHBpbmcoKSB7CisgICAgICAgIHJldHVybiBtU3RhcnRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgaWYgdGhpcyB2aWV3IGF1dG9tYXRpY2FsbHkgY2FsbHMge0BsaW5rICNzdGFydEZsaXBwaW5nKCl9IHdoZW4gaXQKKyAgICAgKiBiZWNvbWVzIGF0dGFjaGVkIHRvIGEgd2luZG93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9TdGFydChib29sZWFuIGF1dG9TdGFydCkgeworICAgICAgICBtQXV0b1N0YXJ0ID0gYXV0b1N0YXJ0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZpZXcgYXV0b21hdGljYWxseSBjYWxscyB7QGxpbmsgI3N0YXJ0RmxpcHBpbmcoKX0KKyAgICAgKiB3aGVuIGl0IGJlY29tZXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdXRvU3RhcnQoKSB7CisgICAgICAgIHJldHVybiBtQXV0b1N0YXJ0OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgaW50IEZMSVBfTVNHID0gMTsKKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IEZMSVBfTVNHKSB7CisgICAgICAgICAgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkOGVjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhCkBAIC0wLDAgKzEsMTIzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIDxwPlRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gbG9hZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlciBhZGFwdGVyc30gZGVmaW5lZCBpbgorICogWE1MIHJlc291cmNlcy4gWE1MLWRlZmluZWQgYWRhcHRlcnMgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGNyZWF0ZSBhZGFwdGVycyBpbiB5b3VyCisgKiBvd24gYXBwbGljYXRpb24gb3IgdG8gcGFzcyBhZGFwdGVycyB0byBvdGhlciBwcm9jZXNzZXMuPC9wPgorICogCisgKiA8aDI+VHlwZXMgb2YgYWRhcHRlcnM8L2gyPgorICogPHA+QWRhcHRlcnMgZGVmaW5lZCB1c2luZyBYTUwgcmVzb3VyY2VzIGNhbiBvbmx5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN1cHBvcnRlZAorICogdHlwZXMuIEFyYml0cmFyeSBhZGFwdGVycyBhcmUgbm90IHN1cHBvcnRlZCB0byBndWFyYW50ZWUgdGhlIHNhZmV0eSBvZiB0aGUgbG9hZGVkCisgKiBjb2RlIHdoZW4gYWRhcHRlcnMgYXJlIGxvYWRlZCBhY3Jvc3MgcGFja2FnZXMuPC9wPgorICogPHVsPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyIj5DdXJzb3IgYWRhcHRlcjwvYT46IGEgY3Vyc29yIGFkYXB0ZXIgY2FuIGJlIHVzZWQKKyAqICB0byBkaXNwbGF5IHRoZSBjb250ZW50IG9mIGEgY3Vyc29yLCBtb3N0IG9mdGVuIGNvbWluZyBmcm9tIGEgY29udGVudCBwcm92aWRlcjwvbGk+CisgKiA8L3VsPgorICogPHA+VGhlIGNvbXBsZXRlIFhNTCBmb3JtYXQgZGVmaW5pdGlvbiBvZiBlYWNoIGFkYXB0ZXIgdHlwZSBpcyBhdmFpbGFibGUgYmVsb3cuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXIiIC8+CisgKiA8aDI+Q3Vyc29yIGFkYXB0ZXI8L2gyPgorICogPHA+QSBjdXJzb3IgYWRhcHRlciBYTUwgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItdGFnIj48Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+PC9hPgorICogdGFnIGFuZCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YgdGhlIGZvbGxvd2luZyB0YWdzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPjwvYT48L2xpPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIj48Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT48L2E+PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci10YWciIC8+CisgKiA8aDM+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+IGVsZW1lbnQgZGVmaW5lcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogZG9jdW1lbnQgYW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6bGF5b3V0PC9jb2RlPjogUmVmZXJlbmNlIHRvIHRoZSBYTUwgbGF5b3V0IHRvIGJlIGluZmxhdGVkIGZvcgorICogIGVhY2ggaXRlbSBvZiB0aGUgYWRhcHRlci4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6c2VsZWN0aW9uPC9jb2RlPjogU2VsZWN0aW9uIGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpzb3J0T3JkZXI8L2NvZGU+OiBTb3J0IGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+OiBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkgdG8gcmV0cmlldmUgYSBjdXJzb3IuCisgKiAgU3BlY2lmeWluZyB0aGlzIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kLCB0aGUgdmFsdWUgb2YgdGhlIFhNTCBhdHRyaWJ1dGUgaXMgaWdub3JlZC4gVGhpcyBhdHRyaWJ1dGUgaXMKKyAqICBvcHRpb25hbC48L2xpPgorICogPC91bD4KKyAqIDxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+PC9hPiBhbmQKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciPjxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPjwvYT4gdGFncyBhcyBjaGlsZHJlbgorICogb2YgPGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPi48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIiAvPgorICogPGgzPiZsdDtzZWxlY3QgLyZndDs8L2gzPgorICogPHA+VGhlIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyBpcyB1c2VkIHRvIHNlbGVjdCBjb2x1bW5zIGZyb20gdGhlIGN1cnNvcgorICogd2hlbiBkb2luZyB0aGUgcXVlcnkuIFRoaXMgY2FuIGJlIHZlcnkgdXNlZnVsIHdoZW4gdXNpbmcgdHJhbnNmb3JtYXRpb25zIGluIHRoZQorICogPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGVsZW1lbnRzLiBJdCBjYW4gYWxzbyBiZSB2ZXJ5IHVzZWZ1bCBpZiB5b3UgYXJlIHByb3ZpZGluZworICogeW91ciBvd24gPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmJpbmRlcjwvYT4gb3IKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj50cmFuc2Zvcm1hdGlvbjwvYT4gY2xhc3Nlcy4KKyAqIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBpZ25vcmVkIGlmIHlvdSBzdXBwbHkgdGhlIGN1cnNvciB5b3Vyc2VsZi48L3A+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpjb2x1bW48L2NvZGU+OiBOYW1lIG9mIHRoZSBjb2x1bW4gdG8gc2VsZWN0IGluIHRoZSBjdXJzb3IgZHVyaW5nIHRoZQorICogIHF1ZXJ5IG9wZXJhdGlvbjwvbGk+CisgKiA8L3VsPgorICogPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY29sdW1uIG5hbWVkIDxjb2RlPl9pZDwvY29kZT4gaXMgYWx3YXlzIGltcGxpY2l0bHkKKyAqIHNlbGVjdGVkLjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIiAvPgorICogPGgzPiZsdDtiaW5kIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIGlzIHVzZWQgdG8gYmluZCBhIGNvbHVtbiBmcm9tIHRoZSBjdXJzb3IgdG8KKyAqIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS4gQSBjb2x1bW4gYm91bmQgdXNpbmcgdGhpcyB0YWcgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZAorICogZHVyaW5nIHRoZSBxdWVyeSBhbmQgYSBtYXRjaGluZworICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiB0YWcgaXMgdGhlcmVmb3JlCisgKiBub3QgcmVxdWlyZWQuPC9wPgorICogCisgKiA8cD5FYWNoIGJpbmRpbmcgaXMgZGVjbGFyZWQgYXMgYSBvbmUgdG8gb25lIG1hdGNoaW5nIGJ1dAorICogY3VzdG9tIGJpbmRlciBjbGFzc2VzIG9yIHNwZWNpYWwKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXRyYW5zZm9ybWF0aW9uIj5kYXRhIHRyYW5zZm9ybWF0aW9uczwvYT4gY2FuCisgKiBhbGxvdyB5b3UgdG8gYmluZCBzZXZlcmFsIGNvbHVtbnMgdG8gYSBzaW5nbGUgdmlldy4gSW4gdGhpcyBjYXNlIHlvdSBtdXN0IHVzZSB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIHRvIG1ha2UKKyAqIHN1cmUgYW55IHJlcXVpcmVkIGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBxdWVyeS48L3A+CisgKiAKKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6ZnJvbTwvY29kZT46IFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gYmluZCBmcm9tLgorICogIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4gTm90ZSB0aGF0IDxjb2RlPkA8L2NvZGU+IHdoaWNoIGFyZSBub3QgdXNlZCB0byByZWZlcmVuY2UgcmVzb3VyY2VzCisgKiAgc2hvdWxkIGJlIGJhY2tzbGFzaCBwcm90ZWN0ZWQgYXMgaW4gPGNvZGU+XEA8L2NvZGU+LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6dG88L2NvZGU+OiBUaGUgaWQgb2YgdGhlIHZpZXcgdG8gYmluZCB0by4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6YXM8L2NvZGU+OiBUaGUgPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmRhdGEgdHlwZTwvYT4KKyAqICBvZiB0aGUgYmluZGluZy4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiA8L3VsPgorICogCisgKiA8cD5JbiBhZGRpdGlvbiwgYSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gY2FuIGNvbnRhaW4gemVybyBvciBtb3JlIGluc3RhbmNlcyBvZgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHJhbnNmb3JtYXRpb24iPmRhdGEgdHJhbnNmb3JtYXRpb25zPC9hPiBjaGlsZHJlbgorICogdGFncy48L3A+CisgKgorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyIgLz4KKyAqIDxoND5CaW5kaW5nIGRhdGEgdHlwZXM8L2g0PgorICogPHA+Rm9yIGEgYmluZGluZyB0byBvY2N1ciB0aGUgZGF0YSB0eXBlIG9mIHRoZSBib3VuZCBjb2x1bW4vdmlldyBwYWlyIG11c3QgYmUgc3BlY2lmaWVkLgorICogVGhlIGZvbGxvd2luZyBkYXRhIHR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+c3RyaW5nPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgbXVzdCBiZQorICogIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmltYWdlPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIGJsb2IgZGVzY3JpYmluZyBhbgorICogIGltYWdlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+aW1hZ2UtdXJpPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZQorICogIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+ZHJhd2FibGU8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWQgdG8gYQorICogIGRyYXdhYmxlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+dGFnPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgd2lsbCBiZSBzZXQgYXMKKyAqICB0aGUgdGFnICh1c2luZyB7QGxpbmsgVmlldyNzZXRUYWcoT2JqZWN0KX0gb2YgdGhlIGFzc29jaWF0ZWQgVmlldy4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogIGFzc29jaWF0ZSBtZXRhLWRhdGEgdG8geW91ciB2aWV3LCB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbnN0YW5jZSBieSBhIGxpc3RlbmVyLjwvbGk+CisgKiAgPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWU6IFRoZSBuYW1lIG9mIGEgY2xhc3MgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXJ9LiBDdXJzb3IgYmluZGVycyBjYW4gYmUgdXNlZCB0byBwcm92aWRlCisgKiAgYmluZGluZ3Mgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0LiBDdXN0b20gYmluZGVycyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2lzUmVzdHJpY3RlZCgpIHJlc3RyaWN0ZWQgY29udGV4dHN9LCBmb3IgaW5zdGFuY2UgaW4gYW4KKyAqICBhcHBsaWNhdGlvbiB3aWRnZXQ8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24iIC8+CisgKiA8aDQ+QmluZGluZyB0cmFuc2Zvcm1hdGlvbnM8L2g0PgorICogPHA+V2hlbiBkZWZpbmluZyBhIGRhdGEgYmluZGluZyB5b3UgY2FuIHNwZWNpZnkgYW4gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gYnkgdXNpbmcgb25lCisgKiBvZiB0aGUgZm9sbG93aW5nIHRhZ3MgYXMgYSBjaGlsZCBvZiBhIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+OiBNYXBzIGEgY29uc3RhbnQgc3RyaW5nIHRvIGEgc3RyaW5nIG9yIGEgcmVzb3VyY2UuIFVzZQorICogIG9uZSBpbnN0YW5jZSBvZiB0aGlzIHRhZyBwZXIgdmFsdWUgeW91IHdhbnQgdG8gbWFwPC9saT4KKyAqICA8bGk+PGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT46IFRyYW5zZm9ybXMgYSBjb2x1bW4ncyB2YWx1ZSB1c2luZyBhbiBleHByZXNzaW9uCisgKiAgb3IgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufTwvbGk+CisgKiA8L3VsPgorICogPHA+V2hpbGUgc2V2ZXJhbCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiB0YWdzIGNhbiBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUsIHlvdSBjYW5ub3QKKyAqIG1peCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncy4gSWYgc2V2ZXJhbAorICogPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncyBhcmUgc3BlY2lmaWVkLCBvbmx5IHRoZSBsYXN0IG9uZSBpcyByZXRhaW5lZC48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRyYW5zZm9ybWF0aW9uLW1hcCIgLz4KKyAqIDxwPjxzdHJvbmc+Jmx0O21hcCAvJmd0Ozwvc3Ryb25nPjwvcD4KKyAqIDxwPkEgbWFwIGVsZW1lbnQgc2ltcGx5IHNwZWNpZmllcyBhIHZhbHVlIHRvIG1hdGNoIGZyb20gYW5kIGEgdmFsdWUgdG8gbWF0Y2ggdG8uIFdoZW4KKyAqIGEgY29sdW1uJ3MgdmFsdWUgZXF1YWxzIHRoZSB2YWx1ZSB0byBtYXRjaCBmcm9tLCBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSB0byBtYXRjaAorICogdG8uIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpmcm9tVmFsdWU8L2NvZGU+OiBUaGUgdmFsdWUgdG8gbWF0Y2ggZnJvbS4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5PC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp0b1ZhbHVlPC9jb2RlPjogVGhlIHZhbHVlIHRvIG1hdGNoIHRvLiBUaGlzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcKKyAqICBvciBhIHJlc291cmNlIGlkZW50aWZpZXIuIFRoaXMgdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgYSByZXNvdXJjZSBpZGVudGlmaWVyIHdoZW4gdGhlCisgKiAgZGF0YSBiaW5kaW5nIGlzIG9mIHR5cGUgPGNvZGU+ZHJhd2FibGU8L2NvZGU+LiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnk8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24tdHJhbnNmb3JtIiAvPgorICogPHA+PHN0cm9uZz4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9zdHJvbmc+PC9wPgorICogPHA+QSBzaW1wbGUgdHJhbnNmb3JtIHRoYXQgb2NjdXJzIGVpdGhlciBieSBjYWxsaW5nIGEgc3BlY2lmaWVkIGNsYXNzIG9yIGJ5IHBlcmZvcm1pbmcKKyAqIHNpbXBsZSB0ZXh0IHN1YnN0aXR1dGlvbi4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOndpdGhFeHByZXNzaW9uPC9jb2RlPjogVGhlIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIGlzCisgKiAgYSBzdHJpbmcgY29udGFpbmluZyBjb2x1bW4gbmFtZXMgc3Vycm91bmRlZCB3aXRoIGN1cmx5IGJyYWNlcyB7IGFuZCB9LiBEdXJpbmcgdGhlCisgKiAgdHJhbnNmb3JtYXRpb24gZWFjaCBjb2x1bW4gbmFtZSBpcyByZXBsYWNlZCBieSBpdHMgdmFsdWUuIEFsbCBjb2x1bW5zIG11c3QgaGF2ZSBiZWVuCisgKiAgc2VsZWN0ZWQgaW4gdGhlIHF1ZXJ5LiBBbiBleGFtcGxlIG9mIGV4cHJlc3Npb24gaXMgPGNvZGU+IkZpcnN0IG5hbWU6IHtmaXJzdF9uYW1lfSwKKyAqICBsYXN0IG5hbWU6IHtsYXN0X25hbWV9IjwvY29kZT4uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeQorICogIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPiBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpZ25vcmVkIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPgorICogIGlzIHNwZWNpZmllZDwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPjogQSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBjb3JyZXNwb25kaW5nIHRvIGFuCisgKiAgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufS4gQ3VzdG9tCisgKiAgdHJhbnNmb3JtYXRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjaXNSZXN0cmljdGVkKCkgcmVzdHJpY3RlZCBjb250ZXh0c30sIGZvciBpbnN0YW5jZSBpbgorICogIGFuIGFwcCB3aWRnZXQgVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5IGlmIDxjb2RlPmFuZHJvaWQ6d2l0aEV4cHJlc3Npb248L2NvZGU+IGlzCisgKiAgbm90IHNwZWNpZmllZDwvbGk+CisgKiA8L3VsPgorICogCisgKiA8aDM+RXhhbXBsZTwvaDM+CisgKiA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGN1cnNvciBhZGFwdGVyIHRoYXQgcXVlcmllcyBhbGwgdGhlIGNvbnRhY3RzIHdpdGgKKyAqIGEgcGhvbmUgbnVtYmVyIHVzaW5nIHRoZSBjb250YWN0cyBjb250ZW50IHByb3ZpZGVyLiBFYWNoIGNvbnRhY3QgaXMgZGlzcGxheWVkIHdpdGgKKyAqIGl0cyBkaXNwbGF5IG5hbWUsIGl0cyBmYXZvcml0ZSBzdGF0dXMgYW5kIGl0cyBwaG90by4gVG8gZGlzcGxheSBwaG90b3MsIGEgY3VzdG9tIGRhdGEKKyAqIGJpbmRlciBpcyBkZWNsYXJlZDo8L3A+CisgKiAKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtjdXJzb3ItYWRhcHRlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgYW5kcm9pZDp1cmk9ImNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9jb250YWN0cyIKKyAqICAgICBhbmRyb2lkOnNlbGVjdGlvbj0iaGFzX3Bob25lX251bWJlcj0xIgorICogICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2NvbnRhY3RfaXRlbSImZ3Q7CisgKgorICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iZGlzcGxheV9uYW1lIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIgYW5kcm9pZDphcz0ic3RyaW5nIiAvJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0ic3RhcnJlZCIgYW5kcm9pZDp0bz0iQGlkL3N0YXIiIGFuZHJvaWQ6YXM9ImRyYXdhYmxlIiZndDsKKyAqICAgICAgICAgJmx0O21hcCBhbmRyb2lkOmZyb21WYWx1ZT0iMCIgYW5kcm9pZDp0b1ZhbHVlPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGFyX2JpZ19vZmYiIC8mZ3Q7CisgKiAgICAgICAgICZsdDttYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjEiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb24iIC8mZ3Q7CisgKiAgICAgJmx0Oy9iaW5kJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iX2lkIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIKKyAqICAgICAgICAgICAgICBhbmRyb2lkOmFzPSJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5hZGFwdGVycy5Db250YWN0UGhvdG9CaW5kZXIiIC8mZ3Q7CisgKgorICogJmx0Oy9jdXJzb3ItYWRhcHRlciZndDsKKyAqIDwvcHJlPgorICogCisgKiA8aDM+UmVsYXRlZCBBUElzPC9oMz4KKyAqIDx1bD4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcn08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQWRhcHRlcgorICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfbGF5b3V0IAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9zZWxlY3Rpb24gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX3NvcnRPcmRlciAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfdXJpIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9hcyAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fdG8KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhFeHByZXNzaW9uIAorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFkb2NSZWZlcmVuY2UifSkKK3B1YmxpYyBjbGFzcyBBZGFwdGVycyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SID0gImN1cnNvci1hZGFwdGVyIjsKKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIGJpbmQgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9IGNvbHVtbiB0byBhIFZpZXcuIFRoaXMKKyAgICAgKiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBiaW5kaW5ncyBmb3IgZGF0YSB0eXBlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAqIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVyc30uPC9wPgorICAgICAqIAorICAgICAqIDxwPkEgYmluZGVyIGlzIHByb3ZpZGVkIHdpdGggYSBjdXJzb3IgdHJhbnNmb3JtYXRpb24gd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgdXNlZAorICAgICAqIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgcmV0cmlldmVkIGZyb20gdGhlIGN1cnNvci4gVGhlIHRyYW5zZm9ybWF0aW9uIGlzIGd1YXJhbnRlZWQKKyAgICAgKiB0byBuZXZlciBiZSBudWxsIHNvIGl0J3MgYWx3YXlzIHNhZmUgdG8gYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgYmluZGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIENvbnRleHQgYnV0IGNhbiBiZSByZS11c2VkIHdpdGggbXVsdGlwbGUgY3Vyc29ycy4KKyAgICAgKiBBcyBzdWNoLCB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG1ha2Ugbm8gYXNzdW1wdGlvbiBhYm91dCB0aGUgQ3Vyc29yIGluIHVzZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5WaWV3IAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDdXJzb3JCaW5kZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIG5ldmVyCisgICAgICAgICAqIG51bGwgYW5kIG1heSBvciBtYXkgbm90IGJlIGFwcGxpZWQgdG8gdGhlIEN1cnNvciBkYXRhIGR1cmluZyB0aGUKKyAgICAgICAgICoge0BsaW5rICNiaW5kKGFuZHJvaWQudmlldy5WaWV3LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgaW50KX0gb3BlcmF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgI2JpbmQoYW5kcm9pZC52aWV3LlZpZXcsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBpbnQpIAorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1UcmFuc2Zvcm1hdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBDdXJzb3IgYmluZGVyLjwvcD4gCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbiBUaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzCisgICAgICAgICAqICAgICAgICB0cmFuc2Zvcm1hdGlvbiBtYXkgb3IgbWF5IG5vdCBiZSBhcHBsaWVkIGJ5IHRoZSBiaW5kZXIgYW5kIGlzIGd1YXJhbnRlZWQKKyAgICAgICAgICogICAgICAgIHRvIG5vdCBiZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvckJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5CaW5kcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gdG8gdGhlIHN1cHBsaWVkIFZpZXcuIFRoZSBiaW5kaW5nIG9wZXJhdGlvbgorICAgICAgICAgKiBjYW4gcXVlcnkgb3RoZXIgQ3Vyc29yIGNvbHVtbnMgYXMgbmVlZGVkLiBEdXJpbmcgdGhlIGJpbmRpbmcgb3BlcmF0aW9uLCB2YWx1ZXMKKyAgICAgICAgICogcmV0cmlldmVkIGZyb20gdGhlIEN1cnNvciBtYXkgb3IgbWF5IG5vdCBiZSB0cmFuc2Zvcm1lZCB1c2luZyB0aGlzIGJpbmRlcidzCisgICAgICAgICAqIGN1cnNvciB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBiaW5kIGRhdGEgdG8uCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBiaW5kIGRhdGEgZnJvbS4KKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBjb2x1bW4gaW5kZXggaW4gdGhlIGN1cnNvciB3aGVyZSB0aGUgZGF0YSB0byBiaW5kIHJlc2lkZXMuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlICNtVHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29sdW1uIHdhcyBzdWNjZXNzZnVsbHkgYm91bmQgdG8gdGhlIFZpZXcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIHRyYW5zZm9ybSBkYXRhIGNvbWluZyBvdXQgb2YgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9CisgICAgICogYmVmb3JlIGl0IGlzIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS48L3A+CisgICAgICogCisgICAgICogPHA+VHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkIHRvIHRyYW5zZm9ybSB0ZXh0LWJhc2VkIGRhdGEgKGluIHRoZSBmb3JtIG9mIGEgU3RyaW5nKSwKKyAgICAgKiBvciB0byB0cmFuc2Zvcm0gZGF0YSBpbnRvIGEgcmVzb3VyY2UgaWRlbnRpZmllci4gQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkCisgICAgICogdG8gZ2VuZXJhdGUgcmVzb3VyY2UgaWRlbnRpZmllcnMuPC9wPgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgQ3Vyc29yIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvclRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSBTdHJpbmcuIFRoZSB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBjYW4gc2ltcGx5IHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uIGFzIGEgU3RyaW5nICh0aGlzIGlzIGtub3duCisgICAgICAgICAqIGFzIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbikgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudC4gRm9yIGluc3RhbmNlLAorICAgICAgICAgKiBhIHRyYW5zZm9ybWF0aW9uIGNhbiBwZXJmb3JtIHRleHQgc3Vic3RpdHV0aW9ucyBvciBjb25jYXRlbmF0ZSBvdGhlcgorICAgICAgICAgKiBjb2x1bW5zIHdpdGggdGhlIHNwZWNpZmllZCBjb2x1bW4uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSBTdHJpbmcgY29udGFpbmluZyB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgb2YgdGhlIGNvbHVtbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgaW50ZXJwcmV0cyB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uCisgICAgICAgICAqIGFzIGFuIGludGVnZXIuPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRJbnQoY29sdW1uSW5kZXgpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBzdXBwbGllZCBVUkkuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIHN1cHBsaWVkIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gaXMKKyAgICAgKiBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuIE90aGVyd2lzZSwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisgICAgICogY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9ybWF0IG9mIHRoZSBYTUwgZGVmaW5pdGlvbiBvZiB0aGUgY3Vyc29yIGFkYXB0ZXIgaXMgZG9jdW1lbnRlZCBhdAorICAgICAqIHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgQ3Vyc29yQWRhcHRlciwgdXNlZAorICAgICAqICAgICAgICB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbiB0aGUgc2VsZWN0aW9uIGV4cHJlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBYTUwgcmVzb3VyY2UgZG9lcyBub3QgY29udGFpbgorICAgICAqICAgICAgICAgYSB2YWxpZCAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsgZGVmaW5pdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKKyAgICAgKiBAc2VlICNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSkgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3JBZGFwdGVyIGxvYWRDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgdXJpLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSAoWG1sQ3Vyc29yQWRhcHRlcikgbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIEFEQVBURVJfQ1VSU09SLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworCisgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5zZXRVcmkodXJpKTsKKyAgICAgICAgfQorICAgICAgICBhZGFwdGVyLmxvYWQoKTsKKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBjdXJzb3IuCisgICAgICogWW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHN1cHBsaWVkIGN1cnNvci48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGZvcm1hdCBvZiB0aGUgWE1MIGRlZmluaXRpb24gb2YgdGhlIGN1cnNvciBhZGFwdGVyIGlzIGRvY3VtZW50ZWQgYXQKKyAgICAgKiB0aGUgdG9wIG9mIHRoaXMgcGFnZS48L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gbG9hZCB0aGUgWE1MIHJlc291cmNlIGZyb20uCisgICAgICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgcmVzb3VyY2UgZGVjbGFyaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIEN1cnNvckFkYXB0ZXIsIHVzZWQKKyAgICAgKiAgICAgICAgdG8gc3Vic3RpdHV0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdGlvbiBleHByZXNzaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgWE1MIHJlc291cmNlIGRvZXMgbm90IGNvbnRhaW4KKyAgICAgKiAgICAgICAgIGEgdmFsaWQgJmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7IGRlZmluaXRpb24uCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvckFkYXB0ZXIgbG9hZEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IChYbWxDdXJzb3JBZGFwdGVyKSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgQURBUFRFUl9DVVJTT1IsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7CisKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9hZHMgdGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkIFhNTCByZXNvdXJjZS4gVGhlIFhNTCBkZWZpbml0aW9uIG9mCisgICAgICogdGhlIGFkYXB0ZXIgbXVzdCBmb2xsb3cgdGhlIGZvcm1hdCBkZWZpbml0aW9uIG9mIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGFkYXB0ZXIKKyAgICAgKiB0eXBlcyBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIGxvYWRlZCBhZGFwdGVyIGlzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9CisgICAgICogYW5kIHRoZSBzdXBwbGllZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IGlzIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sCisgICAgICogdGhlIGN1cnNvciByZXR1cm5lZCBieSB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFuYWdlZC4gT3RoZXJ3aXNlLAorICAgICAqIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBjdXJzb3IgeW91cnNlbGYuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGxvYWQgdGhlIFhNTCByZXNvdXJjZSBmcm9tLgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIHJlc291cmNlIGRlY2xhcmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogIAorICAgICAqIEByZXR1cm4gQW4gYWRhcHRlciBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgT2JqZWN0W10pIAorICAgICAqIEBzZWUgI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmFzZUFkYXB0ZXIgbG9hZEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGZpbmFsIEJhc2VBZGFwdGVyIGFkYXB0ZXIgPSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgbnVsbCwgcGFyYW1ldGVycyk7CisgICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgTWFuYWdlZEFkYXB0ZXIpIHsKKyAgICAgICAgICAgICgoTWFuYWdlZEFkYXB0ZXIpIGFkYXB0ZXIpLmxvYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbiBhZGFwdGVyIGZyb20gdGhlIHNwZWNpZmllZCBYTUwgcmVzb3VyY2UuIFRoZSBvcHRpb25hbCBhc3NlcnROYW1lIGNhbgorICAgICAqIGJlIHVzZWQgdG8gZXhpdCBlYXJseSBpZiB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHRoZSBYTUwgcmVzb3VyY2UgaXMgbm90IG9mIHRoZQorICAgICAqIGV4cGVjdGVkIHR5cGUuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50IGRlZmluaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBhc3NlcnROYW1lIFRoZSBtYW5kYXRvcnkgbmFtZSBvZiB0aGUgYWRhcHRlciBpbiB0aGUgWE1MIGRvY3VtZW50LgorICAgICAqICAgICAgICBJZ25vcmVkIGlmIG51bGwuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJhc2VBZGFwdGVyIGxvYWRBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgYXNzZXJ0TmFtZSwKKyAgICAgICAgICAgIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0WG1sKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRnJvbVhtbChjb250ZXh0LCBwYXJzZXIsIFhtbC5hc0F0dHJpYnV0ZVNldChwYXJzZXIpLAorICAgICAgICAgICAgICAgICAgICBpZCwgcGFyYW1ldGVycywgYXNzZXJ0TmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gYWRhcHRlciB1c2luZyB0aGUgc3BlY2lmaWVkIFhNTCBwYXJzZXIuIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlCisgICAgICogZm9yIGNob29zaW5nIHRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyIHRvIGNyZWF0ZSBiYXNlZCBvbiB0aGUgY29udGVudCBvZiB0aGUKKyAgICAgKiBYTUwgcGFyc2VyLgorICAgICAqIAorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhdGUgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYKKyAgICAgKiA8Y29kZT5hc3NlcnROYW1lPC9jb2RlPiBpcyBub3QgbnVsbCBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwKKyAgICAgKiBkb2N1bWVudC4gCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQmFzZUFkYXB0ZXIgY3JlYXRlQWRhcHRlckZyb21YbWwoQ29udGV4dCBjLAorICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkLCBPYmplY3RbXSBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgU3RyaW5nIGFzc2VydE5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQmFzZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBvbiBhIHN0YXJ0IHRhZy4KKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChhc3NlcnROYW1lICE9IG51bGwgJiYgIWFzc2VydE5hbWUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpICsgIiBtdXN0IGJlIGEgPCIgKworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TmFtZSArICIgLz4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIGFkYXB0ZXIgPSBjcmVhdGVDdXJzb3JBZGFwdGVyKGMsIHBhcnNlciwgYXR0cnMsIGlkLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBhZGFwdGVyIG5hbWUgIiArIHBhcnNlci5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiAiICsgYy5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShpZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIFhtbEN1cnNvckFkYXB0ZXIgdXNpbmcgYW4gWG1sQ3Vyc29yQWRhcHRlclBhcnNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBYbWxDdXJzb3JBZGFwdGVyIGNyZWF0ZUN1cnNvckFkYXB0ZXIoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gbmV3IFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIoYywgcGFyc2VyLCBhdHRycywgaWQpLnBhcnNlKHBhcmFtZXRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlciB0aGF0IGNhbiBnZW5lcmF0ZSBYbWxDdXJzb3JBZGFwdGVyIGluc3RhbmNlcy4gVGhpcyBwYXJzZXIgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogaGFuZGxpbmcgYWxsIHRoZSBhdHRyaWJ1dGVzIGFuZCBjaGlsZCBub2RlcyBmb3IgYSAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sQ3Vyc29yQWRhcHRlclBhcnNlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9CSU5EID0gImJpbmQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfU0VMRUNUID0gInNlbGVjdCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19TVFJJTkcgPSAic3RyaW5nIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFID0gImltYWdlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX1RBRyA9ICJ0YWciOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfSU1BR0VfVVJJID0gImltYWdlLXVyaSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19EUkFXQUJMRSA9ICJkcmF3YWJsZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9NQVAgPSAibWFwIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX1RSQU5TRk9STSA9ICJ0cmFuc2Zvcm0iOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBYbWxQdWxsUGFyc2VyIG1QYXJzZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXR0cmlidXRlU2V0IG1BdHRyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUlkOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEN1cnNvckJpbmRlcj4gbUJpbmRlcnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbUZyb207CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1UbzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBtSWRlbnRpdHk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CisKKyAgICAgICAgcHVibGljIFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gYzsKKyAgICAgICAgICAgIG1QYXJzZXIgPSBwYXJzZXI7CisgICAgICAgICAgICBtQXR0cnMgPSBhdHRyczsKKyAgICAgICAgICAgIG1JZCA9IGlkOworCisgICAgICAgICAgICBtUmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBtQmluZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPigpOworICAgICAgICAgICAgbUZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1UbyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgIG1JZGVudGl0eSA9IG5ldyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uKG1Db250ZXh0KTsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYbWxDdXJzb3JBZGFwdGVyIHBhcnNlKE9iamVjdFtdIHBhcmFtZXRlcnMpCisgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyKTsKKworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl91cmkpOworICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9zZWxlY3Rpb24pOworICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlciA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9zb3J0T3JkZXIpOworICAgICAgICAgICAgaW50IGxheW91dCA9IGEuZ2V0UmVzb3VyY2VJZChhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfbGF5b3V0LCAwKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBsYXlvdXQgc3BlY2lmaWVkIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG1QYXJzZXI7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpICYmCisgICAgICAgICAgICAgICAgICAgIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9CSU5ELmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZUJpbmRUYWcoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX1NFTEVDVC5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VTZWxlY3RUYWcoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biB0YWcgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArICIgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nW10gZnJvbUFycmF5ID0gbUZyb20udG9BcnJheShuZXcgU3RyaW5nW21Gcm9tLnNpemUoKV0pOworICAgICAgICAgICAgaW50W10gdG9BcnJheSA9IG5ldyBpbnRbbVRvLnNpemUoKV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvQXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0b0FycmF5W2ldID0gbVRvLmdldChpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG51bGw7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVycy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uQXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzW2ldID0gKFN0cmluZykgcGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQ3Vyc29yQWRhcHRlcihtQ29udGV4dCwgbGF5b3V0LCB1cmksIGZyb21BcnJheSwgdG9BcnJheSwgc2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIsIG1CaW5kZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZVNlbGVjdFRhZygpIHsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IG1SZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb21OYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW1fY29sdW1uKTsKKyAgICAgICAgICAgIGlmIChmcm9tTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBzZWxlY3QgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAnY29sdW1uJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIG1Gcm9tLmFkZChmcm9tTmFtZSk7CisgICAgICAgICAgICBtVG8uYWRkKFZpZXcuTk9fSUQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQmluZFRhZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb21OYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2Zyb20pOworICAgICAgICAgICAgaWYgKGZyb21OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGEgJ2Zyb20nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgdG9OYW1lID0gYS5nZXRSZXNvdXJjZUlkKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV90bywgMCk7CisgICAgICAgICAgICBpZiAodG9OYW1lID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGEgJ3RvJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFzVHlwZSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9hcyk7CisgICAgICAgICAgICBpZiAoYXNUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGFuICdhcycgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Gcm9tLmFkZChmcm9tTmFtZSk7CisgICAgICAgICAgICBtVG8uYWRkKHRvTmFtZSk7CisgICAgICAgICAgICBtQmluZGVycy5wdXQoZnJvbU5hbWUsIGZpbmRCaW5kZXIoYXNUeXBlKSk7CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JCaW5kZXIgZmluZEJpbmRlcihTdHJpbmcgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVBhcnNlcjsKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1Db250ZXh0OworICAgICAgICAgICAgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24gPSBtSWRlbnRpdHk7CisKKyAgICAgICAgICAgIGludCB0YWdUeXBlOworICAgICAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNEcmF3YWJsZSA9IEFEQVBURVJfQ1VSU09SX0FTX0RSQVdBQkxFLmVxdWFscyh0eXBlKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgd2hpbGUgKCgodGFnVHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKQorICAgICAgICAgICAgICAgICAgICAmJiB0YWdUeXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgICAgICBpZiAodGFnVHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfVFJBTlNGT1JNLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IGZpbmRUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfTUFQLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoISh0cmFuc2Zvcm1hdGlvbiBpbnN0YW5jZW9mIE1hcFRyYW5zZm9ybWF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBuZXcgTWFwVHJhbnNmb3JtYXRpb24oY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluZE1hcCgoKE1hcFRyYW5zZm9ybWF0aW9uKSB0cmFuc2Zvcm1hdGlvbiksIGlzRHJhd2FibGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhZyBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsgIiBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX0FTX1NUUklORy5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0JpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX1RBRy5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhZ0JpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2VCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOyAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9BU19JTUFHRV9VUkkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZVVyaUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERyYXdhYmxlQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRlcih0eXBlLCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvckJpbmRlciBjcmVhdGVCaW5kZXIoU3RyaW5nIHR5cGUsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBpZiAobUNvbnRleHQuaXNSZXN0cmljdGVkKCkpIHJldHVybiBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXNzID0gQ2xhc3MuZm9yTmFtZSh0eXBlLCB0cnVlLCBtQ29udGV4dC5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoQ3Vyc29yQmluZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+IGMgPSBrbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIEN1cnNvclRyYW5zZm9ybWF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDdXJzb3JCaW5kZXIpIGMubmV3SW5zdGFuY2UobUNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmaW5kTWFwKE1hcFRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uLCBib29sZWFuIGRyYXdhYmxlKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbSk7CisKKyAgICAgICAgICAgIFN0cmluZyBmcm9tID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX01hcEl0ZW1fZnJvbVZhbHVlKTsKKyAgICAgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBoYXZlIGEgJ2Zyb21WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG8gPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAndG9WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFkZFN0cmluZ01hcHBpbmcoZnJvbSwgdG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgdG8gPSBhLmdldFJlc291cmNlSWQoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHRvID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBtYXAgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBoYXZlIGEgJ3RvVmFsdWUnIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi5hZGRSZXNvdXJjZU1hcHBpbmcoZnJvbSwgdG8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yVHJhbnNmb3JtYXRpb24gZmluZFRyYW5zZm9ybWF0aW9uKCkgeworICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1SZXNvdXJjZXM7CisgICAgICAgICAgICBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IG51bGw7CisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhDbGFzcyk7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IGEuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aEV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gY3JlYXRlRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKGV4cHJlc3Npb24pOworICAgICAgICAgICAgfSBlbHNlIGlmICghbUNvbnRleHQuaXNSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBrbGFzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoQ3Vyc29yVHJhbnNmb3JtYXRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrbGFzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gYyA9IGtsYXMuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gKEN1cnNvclRyYW5zZm9ybWF0aW9uKSBjLm5ld0luc3RhbmNlKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSB0cmFuc2Zvcm0gaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIG11c3QgaGF2ZSBhICd3aXRoQ2xhc3MnIG9yICIgKworICAgICAgICAgICAgICAgICAgICAiJ3dpdGhFeHByZXNzaW9uJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBjcmVhdGVFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKG1Db250ZXh0LCBleHByZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IGFkYXB0ZXJzIHRoYXQgcmVxdWlyZSB0byBiZSBsb2FkZWQgYWZ0ZXIgY3JlYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIE1hbmFnZWRBZGFwdGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvYWRzIHRoZSBjb250ZW50IG9mIHRoZSBhZGFwdGVyLCBhc3luY2hyb25vdXNseS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgbG9hZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGEgQ3Vyc29yIGFkYXB0ZXIgZGVmaW5lZCBpbiBYTUwuIFRoaXMgY2xhc3MgaXMgYSB0aGluIHdyYXBwZXIKKyAgICAgKiBvZiBhIFNpbXBsZUN1cnNvckFkYXB0ZXIuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhlIGFiaWxpdHkgdG8gaGFuZGxlIEN1cnNvckJpbmRlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sQ3Vyc29yQWRhcHRlciBleHRlbmRzIFNpbXBsZUN1cnNvckFkYXB0ZXIgaW1wbGVtZW50cyBNYW5hZ2VkQWRhcHRlciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Vcmk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TZWxlY3Rpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbVNlbGVjdGlvbkFyZ3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Tb3J0T3JkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbUNvbHVtbnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yQmluZGVyW10gbUJpbmRlcnM7CisgICAgICAgIHByaXZhdGUgQXN5bmNUYXNrPFZvaWQsVm9pZCxDdXJzb3I+IG1Mb2FkVGFzazsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGxheW91dCwgU3RyaW5nIHVyaSwgU3RyaW5nW10gZnJvbSwgaW50W10gdG8sCisgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlciwKKyAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPiBiaW5kZXJzKSB7CisKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGxheW91dCwgbnVsbCwgZnJvbSwgdG8pOworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgICAgIG1TZWxlY3Rpb24gPSBzZWxlY3Rpb247CisgICAgICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgICAgICAgICBtU29ydE9yZGVyID0gc29ydE9yZGVyOworICAgICAgICAgICAgbUNvbHVtbnMgPSBuZXcgU3RyaW5nW2Zyb20ubGVuZ3RoICsgMV07CisgICAgICAgICAgICAvLyBUaGlzIGlzIG1hbmRhdG9yeSBpbiBDdXJzb3JBZGFwdGVyCisgICAgICAgICAgICBtQ29sdW1uc1swXSA9ICJfaWQiOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmcm9tLCAwLCBtQ29sdW1ucywgMSwgZnJvbS5sZW5ndGgpOworCisgICAgICAgICAgICBDdXJzb3JCaW5kZXIgYmFzaWMgPSBuZXcgU3RyaW5nQmluZGVyKGNvbnRleHQsIG5ldyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uKGNvbnRleHQpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGZyb20ubGVuZ3RoOworICAgICAgICAgICAgbUJpbmRlcnMgPSBuZXcgQ3Vyc29yQmluZGVyW2NvdW50XTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ3Vyc29yQmluZGVyIGJpbmRlciA9IGJpbmRlcnMuZ2V0KGZyb21baV0pOworICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgYmluZGVyID0gYmFzaWM7CisgICAgICAgICAgICAgICAgbUJpbmRlcnNbaV0gPSBiaW5kZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYmluZFZpZXcoVmlldyB2aWV3LCBDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Uby5sZW5ndGg7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBmcm9tID0gbUZyb207CisgICAgICAgICAgICBmaW5hbCBpbnRbXSB0byA9IG1UbzsKKyAgICAgICAgICAgIGZpbmFsIEN1cnNvckJpbmRlcltdIGJpbmRlcnMgPSBtQmluZGVyczsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2ID0gdmlldy5maW5kVmlld0J5SWQodG9baV0pOworICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyc1tpXS5iaW5kKHYsIGN1cnNvciwgZnJvbVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbG9hZCgpIHsKKyAgICAgICAgICAgIGlmIChtVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2sgPSBuZXcgUXVlcnlUYXNrKCkuZXhlY3V0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VDdXJzb3IoQ3Vyc29yIGMpIHsKKyAgICAgICAgICAgIGlmIChtTG9hZFRhc2sgIT0gbnVsbCAmJiBtTG9hZFRhc2suZ2V0U3RhdHVzKCkgIT0gUXVlcnlUYXNrLlN0YXR1cy5GSU5JU0hFRCkgeworICAgICAgICAgICAgICAgIG1Mb2FkVGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLmNoYW5nZUN1cnNvcihjKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFF1ZXJ5VGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBDdXJzb3I+IHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIEN1cnNvciBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgeworICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEFjdGl2aXR5KSBtQ29udGV4dCkubWFuYWdlZFF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVyaS5wYXJzZShtVXJpKSwgbUNvbHVtbnMsIG1TZWxlY3Rpb24sIG1TZWxlY3Rpb25BcmdzLCBtU29ydE9yZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKG1VcmkpLCBtQ29sdW1ucywgbVNlbGVjdGlvbiwgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQ3Vyc29yQWRhcHRlci5zdXBlci5jaGFuZ2VDdXJzb3IoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiwgcmV0dXJucyB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhcyBhIFN0cmluZywKKyAgICAgKiB3aXRob3V0IHBlcmZvcm1pbmcgYW55IG1hbmlwdWxhdGlvbi4gVGhpcyBpcyB1c2VkIHdoZW4gbm8gdHJhbnNmb3JtYXRpb24gaXMgc3BlY2lmaWVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElkZW50aXR5VHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHB1YmxpYyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBleHByZXNzaW9uIHRyYW5zZm9ybWF0aW9uIGlzIGEgc2ltcGxlIHRlbXBsYXRlIGJhc2VkIHJlcGxhY2VtZW50IHV0aWxpdHkuCisgICAgICogSW4gYW4gZXhwcmVzc2lvbiwgZWFjaCBzZWdtZW50IG9mIHRoZSBmb3JtIDxjb2RlPnsoW159XSspfTwvY29kZT4gaXMgcmVwbGFjZWQKKyAgICAgKiB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIG9mIG5hbWUgJDEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIEV4cHJlc3Npb25Ob2RlIG1GaXJzdE5vZGUgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uTm9kZSgiIik7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgcHVibGljIEV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKworICAgICAgICAgICAgcGFyc2UoZXhwcmVzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2UoU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb25Ob2RlIG5vZGUgPSBtRmlyc3ROb2RlOworICAgICAgICAgICAgaW50IHNlZ21lbnRTdGFydDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGV4cHJlc3Npb24ubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpOworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGEgY29sdW1uIG5hbWUgc2VnbWVudAorICAgICAgICAgICAgICAgIHNlZ21lbnRTdGFydCA9IGk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgY291bnQgJiYgKGMgPSBleHByZXNzaW9uLmNoYXJBdChpKSkgIT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kLCBidXQgdGhlIGV4cHJlc3Npb24gZGlkbid0IGNsb3NlCisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9ICd9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIHRyYW5zZm9ybSBleHByZXNzaW9uIGNvbnRhaW5zIGEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tY2xvc2VkIGNvbHVtbiBuYW1lOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0ICsgMSwgaSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vZGUubmV4dCA9IG5ldyBDb2x1bW5FeHByZXNzaW9uTm9kZShleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQgKyAxLCBpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjb3VudCAmJiAoYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpKSAhPSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub2RlLm5leHQgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uTm9kZShleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQsIGkpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV3aW5kIGlmIHdlJ3ZlIHJlYWNoZWQgYSBjb2x1bW4gZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAneycpIGktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG1CdWlsZGVyOworICAgICAgICAgICAgYnVpbGRlci5kZWxldGUoMCwgYnVpbGRlci5sZW5ndGgoKSk7CisKKyAgICAgICAgICAgIEV4cHJlc3Npb25Ob2RlIG5vZGUgPSBtRmlyc3ROb2RlOworICAgICAgICAgICAgLy8gU2tpcCB0aGUgZmlyc3Qgbm9kZQorICAgICAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZS5uZXh0KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobm9kZS5hc1N0cmluZyhjdXJzb3IpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbk5vZGUgbmV4dDsKKworICAgICAgICAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb25zdGFudEV4cHJlc3Npb25Ob2RlIGV4dGVuZHMgRXhwcmVzc2lvbk5vZGUgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNvbnN0YW50OworCisgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb25Ob2RlKFN0cmluZyBjb25zdGFudCkgeworICAgICAgICAgICAgICAgIG1Db25zdGFudCA9IGNvbnN0YW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2xhc3MgQ29sdW1uRXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ29sdW1uTmFtZTsKKyAgICAgICAgICAgIHByaXZhdGUgQ3Vyc29yIG1TaWduYXR1cmU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtQ29sdW1uSW5kZXggPSAtMTsKKworICAgICAgICAgICAgQ29sdW1uRXhwcmVzc2lvbk5vZGUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKKyAgICAgICAgICAgICAgICBtQ29sdW1uTmFtZSA9IGNvbHVtbk5hbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBtU2lnbmF0dXJlIHx8IG1Db2x1bW5JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBtQ29sdW1uSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgobUNvbHVtbk5hbWUpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmF0dXJlID0gY3Vyc29yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKG1Db2x1bW5JbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG1hcCB0cmFuc2Zvcm1hdGlvbiBvZmZlcnMgYSBzaW1wbGUgbWFwcGluZyBiZXR3ZWVuIHNwZWNpZmllZCBTdHJpbmcgdmFsdWVzCisgICAgICogdG8gU3RyaW5ncyBvciBpbnRlZ2Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXBUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtU3RyaW5nTWFwcGluZ3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1SZXNvdXJjZU1hcHBpbmdzOworCisgICAgICAgIHB1YmxpYyBNYXBUcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgbVN0cmluZ01hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgICAgICBtUmVzb3VyY2VNYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkU3RyaW5nTWFwcGluZyhTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB7CisgICAgICAgICAgICBtU3RyaW5nTWFwcGluZ3MucHV0KGZyb20sIHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkUmVzb3VyY2VNYXBwaW5nKFN0cmluZyBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgICAgIG1SZXNvdXJjZU1hcHBpbmdzLnB1dChmcm9tLCB0byk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cmFuc2Zvcm1lZCA9IG1TdHJpbmdNYXBwaW5ncy5nZXQodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkID09IG51bGwgPyB2YWx1ZSA6IHRyYW5zZm9ybWVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNmb3JtVG9SZXNvdXJjZShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0cmFuc2Zvcm1lZCA9IG1SZXNvdXJjZU1hcHBpbmdzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZCA9PSBudWxsID8gSW50ZWdlci5wYXJzZUludCh2YWx1ZSkgOiB0cmFuc2Zvcm1lZDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIFN0cmluZyB0byBhIFRleHRWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ0JpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBTdHJpbmdCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgVGV4dFZpZXcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGFuIGltYWdlIGJsb2IgdG8gYW4gSW1hZ2VWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEltYWdlQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIEltYWdlQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEltYWdlVmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gY3Vyc29yLmdldEJsb2IoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZUJpdG1hcChCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShkYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhZ0JpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBUYWdCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGFnKHRleHQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhbiBpbWFnZSBVUkkgdG8gYW4gSW1hZ2VWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEltYWdlVXJpQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIEltYWdlVXJpQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEltYWdlVmlldykgeworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZVVSSShVcmkucGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIGRyYXdhYmxlIHJlc291cmNlIGlkZW50aWZpZXIgdG8gYW4gSW1hZ2VWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyYXdhYmxlQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIERyYXdhYmxlQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEltYWdlVmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXNvdXJjZSA9IG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm1Ub1Jlc291cmNlKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSAwKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgdmlldykuc2V0SW1hZ2VSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEKaW5kZXggMDNhZGE5NC4uYjRlY2UyNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YQpAQCAtMzAsMTcgKzMwLDE3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiAvKioKLSAqIEEgTGlzdEFkYXB0ZXIgdGhhdCBtYW5hZ2VzIGEgTGlzdFZpZXcgYmFja2VkIGJ5IGFuIGFycmF5IG9mIGFyYml0cmFyeQorICogQSBjb25jcmV0ZSBCYXNlQWRhcHRlciB0aGF0IGlzIGJhY2tlZCBieSBhbiBhcnJheSBvZiBhcmJpdHJhcnkKICAqIG9iamVjdHMuICBCeSBkZWZhdWx0IHRoaXMgY2xhc3MgZXhwZWN0cyB0aGF0IHRoZSBwcm92aWRlZCByZXNvdXJjZSBpZCByZWZlcmVuY2VzCiAgKiBhIHNpbmdsZSBUZXh0Vmlldy4gIElmIHlvdSB3YW50IHRvIHVzZSBhIG1vcmUgY29tcGxleCBsYXlvdXQsIHVzZSB0aGUgY29uc3RydWN0b3JzIHRoYXQKICAqIGFsc28gdGFrZXMgYSBmaWVsZCBpZC4gIFRoYXQgZmllbGQgaWQgc2hvdWxkIHJlZmVyZW5jZSBhIFRleHRWaWV3IGluIHRoZSBsYXJnZXIgbGF5b3V0CiAgKiByZXNvdXJjZS4KICAqCi0gKiBIb3dldmVyIHRoZSBUZXh0VmlldyBpcyByZWZlcmVuY2VkLCBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0b1N0cmluZygpIG9mIGVhY2ggb2JqZWN0IGluCisgKiA8cD5Ib3dldmVyIHRoZSBUZXh0VmlldyBpcyByZWZlcmVuY2VkLCBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0b1N0cmluZygpIG9mIGVhY2ggb2JqZWN0IGluCiAgKiB0aGUgYXJyYXkuIFlvdSBjYW4gYWRkIGxpc3RzIG9yIGFycmF5cyBvZiBjdXN0b20gb2JqZWN0cy4gT3ZlcnJpZGUgdGhlIHRvU3RyaW5nKCkgbWV0aG9kCiAgKiBvZiB5b3VyIG9iamVjdHMgdG8gZGV0ZXJtaW5lIHdoYXQgdGV4dCB3aWxsIGJlIGRpc3BsYXllZCBmb3IgdGhlIGl0ZW0gaW4gdGhlIGxpc3QuCiAgKgotICogVG8gdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIFRleHRWaWV3cyBmb3IgdGhlIGFycmF5IGRpc3BsYXksIGZvciBpbnN0YW5jZSwgSW1hZ2VWaWV3cywKKyAqIDxwPlRvIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBUZXh0Vmlld3MgZm9yIHRoZSBhcnJheSBkaXNwbGF5LCBmb3IgaW5zdGFuY2UsIEltYWdlVmlld3MsCiAgKiBvciB0byBoYXZlIHNvbWUgb2YgZGF0YSBiZXNpZGVzIHRvU3RyaW5nKCkgcmVzdWx0cyBmaWxsIHRoZSB2aWV3cywKICAqIG92ZXJyaWRlIHtAbGluayAjZ2V0VmlldyhpbnQsIFZpZXcsIFZpZXdHcm91cCl9IHRvIHJldHVybiB0aGUgdHlwZSBvZiB2aWV3IHlvdSB3YW50LgogICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhCmluZGV4IDM5NzE0ODcuLmUwN2JlZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhCkBAIC0yOSwxMyArMjksMTIgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkNvbXBsZXRpb25JbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKQEAgLTkzLDQ1ICs5MiwyMSBAQAogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQXV0b0NvbXBsZXRlVGV4dFZpZXciOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJTlRfVklFV19JRCA9IDB4MTc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHZhbHVlIGNvbnRyb2xzIHRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSB1c2VyCi0gICAgICogbXVzdCBsZWF2ZSBhIHBvaW50ZXIgZG93biB3aXRob3V0IHNjcm9sbGluZyB0byBleHBhbmQKLSAgICAgKiB0aGUgYXV0b2NvbXBsZXRlIGRyb3Bkb3duIGxpc3QgdG8gY292ZXIgdGhlIElNRS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0xJU1RfVElNRU9VVCA9IDI1MDsKLQogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1IaW50VGV4dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1IaW50VmlldzsKICAgICBwcml2YXRlIGludCBtSGludFJlc291cmNlOwogCiAgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKICAgICBwcml2YXRlIEZpbHRlciBtRmlsdGVyOwogICAgIHByaXZhdGUgaW50IG1UaHJlc2hvbGQ7CiAKLSAgICBwcml2YXRlIFBvcHVwV2luZG93IG1Qb3B1cDsKLSAgICBwcml2YXRlIERyb3BEb3duTGlzdFZpZXcgbURyb3BEb3duTGlzdDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0OworICAgIHByaXZhdGUgTGlzdFBvcHVwV2luZG93IG1Qb3B1cDsKICAgICBwcml2YXRlIGludCBtRHJvcERvd25BbmNob3JJZDsKLSAgICBwcml2YXRlIFZpZXcgbURyb3BEb3duQW5jaG9yVmlldzsgIC8vIHZpZXcgaXMgcmV0cmlldmVkIGxhemlseSBmcm9tIGlkIG9uY2UgbmVlZGVkCi0gICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duSGVpZ2h0OwotICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwotCi0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtRHJvcERvd25MaXN0SGlnaGxpZ2h0OwogCiAgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1JdGVtQ2xpY2tMaXN0ZW5lcjsKICAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbUl0ZW1TZWxlY3RlZExpc3RlbmVyOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyIG1Ecm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGZhbHNlOwotCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiA9IHRydWU7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBpbnQgbUxhc3RLZXlDb2RlID0gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT3BlbkJlZm9yZTsKQEAgLTE0MCwxMCArMTE1LDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQmxvY2tDb21wbGV0aW9uOwogCi0gICAgcHJpdmF0ZSBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yOwotICAgIHByaXZhdGUgUnVubmFibGUgbVNob3dEcm9wRG93blJ1bm5hYmxlOwotICAgIHByaXZhdGUgUnVubmFibGUgbVJlc2l6ZVBvcHVwUnVubmFibGUgPSBuZXcgUmVzaXplUG9wdXBSdW5uYWJsZSgpOwotCiAgICAgcHJpdmF0ZSBQYXNzVGhyb3VnaENsaWNrTGlzdGVuZXIgbVBhc3NUaHJvdWdoQ2xpY2tMaXN0ZW5lcjsKICAgICBwcml2YXRlIFBvcHVwRGF0YVNldE9ic2VydmVyIG1PYnNlcnZlcjsKIApAQCAtMTU4LDkgKzEyOSwxMCBAQAogICAgIHB1YmxpYyBBdXRvQ29tcGxldGVUZXh0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CiAKLSAgICAgICAgbVBvcHVwID0gbmV3IFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLAorICAgICAgICBtUG9wdXAgPSBuZXcgTGlzdFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hdXRvQ29tcGxldGVUZXh0Vmlld1N0eWxlKTsKICAgICAgICAgbVBvcHVwLnNldFNvZnRJbnB1dE1vZGUoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfUkVTSVpFKTsKKyAgICAgICAgbVBvcHVwLnNldFByb21wdFBvc2l0aW9uKExpc3RQb3B1cFdpbmRvdy5QT1NJVElPTl9QUk9NUFRfQkVMT1cpOwogCiAgICAgICAgIFR5cGVkQXJyYXkgYSA9CiAgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCkBAIC0xNjksMTQgKzE0MSwxMSBAQAogICAgICAgICBtVGhyZXNob2xkID0gYS5nZXRJbnQoCiAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvblRocmVzaG9sZCwgMik7CiAKLSAgICAgICAgbUhpbnRUZXh0ID0gYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50KTsKLQotICAgICAgICBtRHJvcERvd25MaXN0SGlnaGxpZ2h0ID0gYS5nZXREcmF3YWJsZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blNlbGVjdG9yKTsKLSAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSAoaW50KQotICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDAuMGYpOwotICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0ID0gKGludCkKLSAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDAuMGYpOworICAgICAgICBtUG9wdXAuc2V0TGlzdFNlbGVjdG9yKGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25TZWxlY3RvcikpOworICAgICAgICBtUG9wdXAuc2V0VmVydGljYWxPZmZzZXQoKGludCkKKyAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blZlcnRpY2FsT2Zmc2V0LCAwLjBmKSk7CisgICAgICAgIG1Qb3B1cC5zZXRIb3Jpem9udGFsT2Zmc2V0KChpbnQpCisgICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCAwLjBmKSk7CiAgICAgICAgIAogICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcidzIGlkIG5vdywgYnV0IHRoZSB2aWV3IHdvbid0IGJlIHJlYWR5LCBzbyB3YWl0IHRvIGFjdHVhbGx5IGdldCB0aGUKICAgICAgICAgLy8gdmlldyBhbmQgc3RvcmUgaXQgaW4gbURyb3BEb3duQW5jaG9yVmlldyBsYXppbHkgaW4gZ2V0RHJvcERvd25BbmNob3JWaWV3IGxhdGVyLgpAQCAtMTg3LDEzICsxNTYsMTggQEAKICAgICAgICAgCiAgICAgICAgIC8vIEZvciBkcm9wZG93biB3aWR0aCwgdGhlIGRldmVsb3BlciBjYW4gc3BlY2lmeSBhIHNwZWNpZmljIHdpZHRoLCBvciBNQVRDSF9QQVJFTlQKICAgICAgICAgLy8gKGZvciBmdWxsIHNjcmVlbiB3aWR0aCkgb3IgV1JBUF9DT05URU5UICh0byBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvcmVkIHZpZXcpLgotICAgICAgICBtRHJvcERvd25XaWR0aCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotICAgICAgICBtRHJvcERvd25IZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoLAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7CisgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoYS5nZXRMYXlvdXREaW1lbnNpb24oCisgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKIAogICAgICAgICBtSGludFJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50VmlldywKICAgICAgICAgICAgICAgICBSLmxheW91dC5zaW1wbGVfZHJvcGRvd25faGludCk7CisgICAgICAgIAorICAgICAgICBtUG9wdXAuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lcigpKTsKKyAgICAgICAgc2V0Q29tcGxldGlvbkhpbnQoYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50KSk7CiAKICAgICAgICAgLy8gQWx3YXlzIHR1cm4gb24gdGhlIGF1dG8gY29tcGxldGUgaW5wdXQgdHlwZSBmbGFnLCBzaW5jZSBpdAogICAgICAgICAvLyBtYWtlcyBubyBzZW5zZSB0byB1c2UgdGhpcyB3aWRnZXQgd2l0aG91dCBpdC4KQEAgLTI0MSw2ICsyMTUsMjAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21wbGV0aW9uSGludChDaGFyU2VxdWVuY2UgaGludCkgewogICAgICAgICBtSGludFRleHQgPSBoaW50OworICAgICAgICBpZiAoaGludCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyBoaW50VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICAgICAgaGludFZpZXcuc2V0VGV4dChtSGludFRleHQpOworICAgICAgICAgICAgICAgIG1IaW50VmlldyA9IGhpbnRWaWV3OworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRWaWV3KGhpbnRWaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3LnNldFRleHQoaGludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VmlldyhudWxsKTsKKyAgICAgICAgICAgIG1IaW50VmlldyA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yNTMsNyArMjQxLDcgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93bldpZHRoKCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duV2lkdGg7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0V2lkdGgoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yNjYsNyArMjU0LDcgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25XaWR0aChpbnQgd2lkdGgpIHsKLSAgICAgICAgbURyb3BEb3duV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbVBvcHVwLnNldFdpZHRoKHdpZHRoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI4MCw3ICsyNjgsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0CiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93bkhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhlaWdodDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIZWlnaHQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI5NCw3ICsyODIsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25IZWlnaHQoaW50IGhlaWdodCkgewotICAgICAgICBtRHJvcERvd25IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zMTksNyArMzA3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkFuY2hvcihpbnQgaWQpIHsKICAgICAgICAgbURyb3BEb3duQW5jaG9ySWQgPSBpZDsKLSAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IG51bGw7CisgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KG51bGwpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM2MSw3ICszNDksNyBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIHZlcnRpY2FsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duVmVydGljYWxPZmZzZXQoaW50IG9mZnNldCkgewotICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbVBvcHVwLnNldFZlcnRpY2FsT2Zmc2V0KG9mZnNldCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzcwLDcgKzM1OCw3IEBACiAgICAgICogQHJldHVybiB0aGUgdmVydGljYWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93blZlcnRpY2FsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0VmVydGljYWxPZmZzZXQoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNzksNyArMzY3LDcgQEAKICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBob3Jpem9udGFsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duSG9yaXpvbnRhbE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG1Qb3B1cC5zZXRIb3Jpem9udGFsT2Zmc2V0KG9mZnNldCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzg4LDcgKzM3Niw3IEBACiAgICAgICogQHJldHVybiB0aGUgaG9yaXpvbnRhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duSG9yaXpvbnRhbE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SG9yaXpvbnRhbE9mZnNldCgpOwogICAgIH0KIAogICAgICAvKioKQEAgLTQyNSw3ICs0MTMsNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgICAgIHJldHVybiBtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ0Miw3ICs0MzAsNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkFsd2F5c1Zpc2libGUoYm9vbGVhbiBkcm9wRG93bkFsd2F5c1Zpc2libGUpIHsKLSAgICAgICAgbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGRyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICAgICAgbVBvcHVwLnNldERyb3BEb3duQWx3YXlzVmlzaWJsZShkcm9wRG93bkFsd2F5c1Zpc2libGUpOwogICAgIH0KICAgIAogICAgIC8qKgpAQCAtNjA5LDE1ICs1OTcsMTMgQEAKICAgICAgICAgICAgIG1GaWx0ZXIgPSBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKLSAgICAgICAgfQorICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihtQWRhcHRlcik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlQcmVJbWUoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSyAmJiBpc1BvcHVwU2hvd2luZygpCi0gICAgICAgICAgICAgICAgJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlIGJhY2sga2V5LCB3ZSBkbyBub3QgZXZlbiB0cnkgdG8gc2VuZCBpdAogICAgICAgICAgICAgLy8gdG8gdGhlIGRyb3AgZG93biBsaXN0IGJ1dCBpbnN0ZWFkLCBjb25zdW1lIGl0IGltbWVkaWF0ZWx5CiAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04gJiYgZXZlbnQuZ2V0UmVwZWF0Q291bnQoKSA9PSAwKSB7CkBAIC02MzYsMTggKzYyMiwxNiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwotICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQotICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtQ29tcGxldGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBib29sZWFuIGNvbnN1bWVkID0gbVBvcHVwLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICBpZiAoY29uc3VtZWQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3QgYWNjZXB0cyB0aGUga2V5IGV2ZW50cyBhbmQgdGhlIGtleSBldmVudAorICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgLy8gZnJvbSB0aGUgZHJvcCBkb3duIGFzIGl0cyBjb250ZW50CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgcGVyZm9ybUNvbXBsZXRpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VwZXIub25LZXlVcChrZXlDb2RlLCBldmVudCk7CkBAIC02NTUsODcgKzYzOSwxMSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICAvLyB3aGVuIHRoZSBkcm9wIGRvd24gaXMgc2hvd24sIHdlIGRyaXZlIGl0IGRpcmVjdGx5Ci0gICAgICAgIGlmIChpc1BvcHVwU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAvLyB0aGUga2V5IGV2ZW50cyBhcmUgZm9yd2FyZGVkIHRvIHRoZSBsaXN0IGluIHRoZSBkcm9wIGRvd24gdmlldwotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IExpc3RWaWV3IGhhbmRsZXMgc3BhY2UgYnV0IHdlIGRvbid0IHdhbnQgdGhhdCB0byBoYXBwZW4KLSAgICAgICAgICAgIC8vIGFsc28gaWYgc2VsZWN0aW9uIGlzIG5vdCBjdXJyZW50bHkgaW4gdGhlIGRyb3AgZG93biwgdGhlbiBkb24ndAotICAgICAgICAgICAgLy8gbGV0IGNlbnRlciBvciBlbnRlciBwcmVzc2VzIGdvIHRoZXJlIHNpbmNlIHRoYXQgd291bGQgY2F1c2UgaXQKLSAgICAgICAgICAgIC8vIHRvIHNlbGVjdCBvbmUgb2YgaXRzIGl0ZW1zCi0gICAgICAgICAgICBpZiAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX1NQQUNFCi0gICAgICAgICAgICAgICAgICAgICYmIChtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRU5URVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUikpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGN1ckluZGV4ID0gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQ7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJlbG93ID0gIW1Qb3B1cC5pc0Fib3ZlQW5jaG9yKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxFbmFibGVkOwotICAgICAgICAgICAgICAgIGludCBmaXJzdEl0ZW0gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgICAgICBpbnQgbGFzdEl0ZW0gPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQotICAgICAgICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsRW5hYmxlZCA9IGFkYXB0ZXIuYXJlQWxsSXRlbXNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0SXRlbSA9IGFsbEVuYWJsZWQgPyAwIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RJdGVtID0gYWxsRW5hYmxlZCA/IGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbihhZGFwdGVyLmdldENvdW50KCkgLSAxLCBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKChiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJiBjdXJJbmRleCA8PSBmaXJzdEl0ZW0pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIWJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04gJiYgY3VySW5kZXggPj0gbGFzdEl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgdG9wLCB3ZSBibG9jayB0aGUga2V5Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIHByZXZlbnQgZm9jdXMgZnJvbSBtb3ZpbmcuCi0gICAgICAgICAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQpOwotICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgaXMgZGVjbGFyZWQKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiS2V5IGRvd246IGNvZGU9IiArIGtleUNvZGUgKyAiIGxpc3QgY29uc3VtZWQ9IiArIGNvbnN1bWVkKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBoYW5kbGVkIHRoZSBrZXkgZXZlbnQsIHRoZW4gdGhlIHVzZXIgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbmF2aWdhdGluZyBpbiB0aGUgbGlzdCwgc28gd2Ugc2hvdWxkIHB1dCBpdCBpbiBmcm9udC4KLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhlcmUncyBhIGxpdHRsZSB0cmljayB3ZSBuZWVkIHRvIGRvIHRvIG1ha2Ugc3VyZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0IHZpZXcgaXMgYWN0dWFsbHkgc2hvd2luZyBpdHMgZm9jdXMgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAvLyBieSBlbnN1cmluZyBpdCBoYXMgZm9jdXMgYW5kIGdldHRpbmcgaXRzIHdpbmRvdyBvdXQKLSAgICAgICAgICAgICAgICAgICAgLy8gb2YgdG91Y2ggbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5yZXF1ZXN0Rm9jdXNGcm9tVG91Y2goKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBwYXNzaW5nIHRoZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IHZpZXcgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbXBvbmVudAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgYm90dG9tLCB3ZSBibG9jayB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIGF2b2lkIGdvaW5nIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSB3aWRnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJJbmRleCA9PSBsYXN0SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckluZGV4ID09IGZpcnN0SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtUG9wdXAub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgc3dpdGNoKGtleUNvZGUpIHsKICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046CiAgICAgICAgICAgICAgICAgcGVyZm9ybVZhbGlkYXRpb24oKTsKQEAgLTc0Niw3ICs2NTQsNyBAQAogICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwogICAgICAgICBtTGFzdEtleUNvZGUgPSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CiAKLSAgICAgICAgaWYgKGhhbmRsZWQgJiYgaXNQb3B1cFNob3dpbmcoKSAmJiBtRHJvcERvd25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGhhbmRsZWQgJiYgaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7CiAgICAgICAgIH0KIApAQCAtODA3LDExICs3MTUsMTIgQEAKICAgICAgICAgaWYgKGVub3VnaFRvRmlsdGVyKCkpIHsKICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBwZXJmb3JtRmlsdGVyaW5nKGdldFRleHQoKSwgbUxhc3RLZXlDb2RlKTsKKyAgICAgICAgICAgICAgICBidWlsZEltZUNvbXBsZXRpb25zKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBkcm9wIGRvd24gaXMgYXV0b21hdGljYWxseSBkaXNtaXNzZWQgd2hlbiBlbm91Z2ggY2hhcmFjdGVycwogICAgICAgICAgICAgLy8gYXJlIGRlbGV0ZWQgZnJvbSB0aGUgdGV4dCB2aWV3Ci0gICAgICAgICAgICBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIGRpc21pc3NEcm9wRG93bigpOworICAgICAgICAgICAgaWYgKCFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgICAgICBpZiAobUZpbHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUZpbHRlci5maWx0ZXIobnVsbCk7CiAgICAgICAgICAgICB9CkBAIC04NDQsMTMgKzc1Myw3IEBACiAgICAgICogaXQgYmFjay4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RTZWxlY3Rpb24oKSB7Ci0gICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCi0gICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gdHJ1ZTsKLSAgICAgICAgICAgIGxpc3QuaGlkZVNlbGVjdG9yKCk7Ci0gICAgICAgICAgICBsaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgfQorICAgICAgICBtUG9wdXAuY2xlYXJMaXN0U2VsZWN0aW9uKCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtODU5LDExICs3NjIsNyBAQAogICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gbW92ZSB0aGUgc2VsZWN0b3IgdG8uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGlzdFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSAmJiAobURyb3BEb3duTGlzdCAhPSBudWxsKSkgewotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgLy8gTGlzdFZpZXcuc2V0U2VsZWN0aW9uKCkgd2lsbCBjYWxsIHJlcXVlc3RMYXlvdXQoKQotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtODc3LDEwICs3NzYsNyBAQAogICAgICAqIEBzZWUgTGlzdFZpZXcjZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGlzdFNlbGVjdGlvbigpIHsKLSAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSAmJiAobURyb3BEb3duTGlzdCAhPSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTE0LDEzICs4MTAsNyBAQAogICAgICAgICAgICAgcmVwbGFjZVRleHQoY29tcGxldGlvbi5nZXRUZXh0KCkpOwogICAgICAgICAgICAgbUJsb2NrQ29tcGxldGlvbiA9IGZhbHNlOwogCi0gICAgICAgICAgICBpZiAobUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OwotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIGEgVmlldyBoZXJlLCBzbyB3ZSB3aWxsIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAvLyBzdXBwbHkgbnVsbC4gIEhvcGVmdWxseSBubyBleGlzdGluZyBhcHBzIGNyYXNoLi4uCi0gICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QsIG51bGwsIGNvbXBsZXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9wdXAucGVyZm9ybUl0ZW1DbGljayhjb21wbGV0aW9uLmdldFBvc2l0aW9uKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MjgsNyArODE4LDcgQEAKICAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZEl0ZW07CiAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW0oKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBtUG9wdXAuZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IG1BZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwogICAgICAgICAgICAgfQpAQCAtOTQyLDE4ICs4MzIsMTggQEAKICAgICAgICAgICAgIG1CbG9ja0NvbXBsZXRpb24gPSBmYWxzZTsgICAgICAgICAgICAKIAogICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0UG9wdXBXaW5kb3cgbGlzdCA9IG1Qb3B1cDsKIAogICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFZpZXcgPT0gbnVsbCB8fCBwb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID0gbGlzdC5nZXRTZWxlY3RlZFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBsaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgIGlkID0gbGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgc2VsZWN0ZWRWaWV3LCBwb3NpdGlvbiwgaWQpOworICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LmdldExpc3RWaWV3KCksIHNlbGVjdGVkVmlldywgcG9zaXRpb24sIGlkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChtRHJvcERvd25EaXNtaXNzZWRPbkNvbXBsZXRpb24gJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgaWYgKG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAwMyw3ICs4OTMsNiBAQAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25GaWx0ZXJDb21wbGV0ZShpbnQgY291bnQpIHsKICAgICAgICAgdXBkYXRlRHJvcERvd25Gb3JGaWx0ZXIoY291bnQpOwotCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURyb3BEb3duRm9yRmlsdGVyKGludCBjb3VudCkgewpAQCAtMTAxNywxMSArOTA2LDEyIEBACiAgICAgICAgICAqIHRvIGZpbHRlci4KICAgICAgICAgICovCiAKLSAgICAgICAgaWYgKChjb3VudCA+IDAgfHwgbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgJiYgZW5vdWdoVG9GaWx0ZXIoKSkgeworICAgICAgICBmaW5hbCBib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSA9IG1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpOworICAgICAgICBpZiAoKGNvdW50ID4gMCB8fCBkcm9wRG93bkFsd2F5c1Zpc2libGUpICYmIGVub3VnaFRvRmlsdGVyKCkpIHsKICAgICAgICAgICAgIGlmIChoYXNGb2N1cygpICYmIGhhc1dpbmRvd0ZvY3VzKCkpIHsKICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICB9IGVsc2UgaWYgKCFkcm9wRG93bkFsd2F5c1Zpc2libGUpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAyOSw3ICs5MTksNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKGJvb2xlYW4gaGFzV2luZG93Rm9jdXMpIHsKICAgICAgICAgc3VwZXIub25XaW5kb3dGb2N1c0NoYW5nZWQoaGFzV2luZG93Rm9jdXMpOwotICAgICAgICBpZiAoIWhhc1dpbmRvd0ZvY3VzICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIGlmICghaGFzV2luZG93Rm9jdXMgJiYgIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMzksNyArOTI5LDcgQEAKICAgICAgICAgc3VwZXIub25EaXNwbGF5SGludChoaW50KTsKICAgICAgICAgc3dpdGNoIChoaW50KSB7CiAgICAgICAgICAgICBjYXNlIElOVklTSUJMRToKLSAgICAgICAgICAgICAgICBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwNTMsNyArOTQzLDcgQEAKICAgICAgICAgaWYgKCFmb2N1c2VkKSB7CiAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghZm9jdXNlZCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBpZiAoIWZvY3VzZWQgJiYgIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNzgsOCArOTY4LDYgQEAKICAgICAgICAgICAgIGltbS5kaXNwbGF5Q29tcGxldGlvbnModGhpcywgbnVsbCk7CiAgICAgICAgIH0KICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKLSAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KG51bGwpOwotICAgICAgICBtRHJvcERvd25MaXN0ID0gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwOTIsMTggKzk4MCw2IEBACiAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+VXNlZCBmb3IgbGF6eSBpbnN0YW50aWF0aW9uIG9mIHRoZSBhbmNob3IgdmlldyBmcm9tIHRoZSBpZCB3ZSBoYXZlLiBJZiB0aGUgdmFsdWUgb2YKLSAgICAgKiB0aGUgaWQgaXMgTk9fSUQgb3Igd2UgY2FuJ3QgZmluZCBhIHZpZXcgZm9yIHRoZSBnaXZlbiBpZCwgd2UgcmV0dXJuIHRoaXMgVGV4dFZpZXcgYXMKLSAgICAgKiB0aGUgZGVmYXVsdCBhbmNob3JpbmcgcG9pbnQuPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgVmlldyBnZXREcm9wRG93bkFuY2hvclZpZXcoKSB7Ci0gICAgICAgIGlmIChtRHJvcERvd25BbmNob3JWaWV3ID09IG51bGwgJiYgbURyb3BEb3duQW5jaG9ySWQgIT0gVmlldy5OT19JRCkgewotICAgICAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IGdldFJvb3RWaWV3KCkuZmluZFZpZXdCeUlkKG1Ecm9wRG93bkFuY2hvcklkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURyb3BEb3duQW5jaG9yVmlldyA9PSBudWxsID8gdGhpcyA6IG1Ecm9wRG93bkFuY2hvclZpZXc7Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogSXNzdWVzIGEgcnVubmFibGUgdG8gc2hvdyB0aGUgZHJvcGRvd24gYXMgc29vbiBhcyBwb3NzaWJsZS4KQEAgLTExMTEsNyArOTg3LDcgQEAKICAgICAgKiBAaGlkZSBpbnRlcm5hbCB1c2VkIG9ubHkgYnkgU2VhcmNoRGlhbG9nCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2hvd0Ryb3BEb3duQWZ0ZXJMYXlvdXQoKSB7Ci0gICAgICAgIHBvc3QobVNob3dEcm9wRG93blJ1bm5hYmxlKTsKKyAgICAgICAgbVBvcHVwLnBvc3RTaG93KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTEyMiw3ICs5OTgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuc3VyZUltZVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CiAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUodmlzaWJsZQotICAgICAgICAgICAgICAgID8gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCA6IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICA/IExpc3RQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEIDogTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKICAgICAgICAgc2hvd0Ryb3BEb3duKCk7CiAgICAgfQogCkBAIC0xMTMwLDg5ICsxMDA2LDIxIEBACiAgICAgICogQGhpZGUgaW50ZXJuYWwgdXNlZCBvbmx5IGhlcmUgYW5kIFNlYXJjaERpYWxvZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIDxwPkRpc3BsYXlzIHRoZSBkcm9wIGRvd24gb24gc2NyZWVuLjwvcD4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaG93RHJvcERvd24oKSB7Ci0gICAgICAgIGludCBoZWlnaHQgPSBidWlsZERyb3BEb3duKCk7Ci0KLSAgICAgICAgaW50IHdpZHRoU3BlYyA9IDA7Ci0gICAgICAgIGludCBoZWlnaHRTcGVjID0gMDsKLQotICAgICAgICBib29sZWFuIG5vSW5wdXRNZXRob2QgPSBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCk7Ci0KLSAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQotICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCi0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gZ2V0RHJvcERvd25BbmNob3JWaWV3KCkuZ2V0V2lkdGgoKTsKKyAgICAgICAgaWYgKG1Qb3B1cC5nZXRBbmNob3JWaWV3KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkFuY2hvcklkICE9IFZpZXcuTk9fSUQpIHsKKyAgICAgICAgICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyhnZXRSb290VmlldygpLmZpbmRWaWV3QnlJZChtRHJvcERvd25BbmNob3JJZCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyh0aGlzKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBub0lucHV0TWV0aG9kID8gaGVpZ2h0IDogVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICAgICAgaWYgKG5vSW5wdXRNZXRob2QpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgOiAwLCAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IGhlaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG1Ecm9wRG93bkhlaWdodDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7Ci0KLSAgICAgICAgICAgIG1Qb3B1cC51cGRhdGUoZ2V0RHJvcERvd25BbmNob3JWaWV3KCksIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCB3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgoZ2V0RHJvcERvd25BbmNob3JWaWV3KCkuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpZHRoKG1Ecm9wRG93bldpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChoZWlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQobURyb3BEb3duSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0gICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyB1c2Ugb3V0c2lkZSB0b3VjaGFibGUgdG8gZGlzbWlzcyBkcm9wIGRvd24gd2hlbiB0b3VjaGluZyBvdXRzaWRlIG9mIGl0LCBzbwotICAgICAgICAgICAgLy8gb25seSBzZXQgdGhpcyBpZiB0aGUgZHJvcGRvd24gaXMgbm90IGFsd2F5cyB2aXNpYmxlCi0gICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRUb3VjaEludGVyY2VwdG9yKG5ldyBQb3B1cFRvdWNoSW50ZXJjZXB0b3IoKSk7Ci0gICAgICAgICAgICBtUG9wdXAuc2hvd0FzRHJvcERvd24oZ2V0RHJvcERvd25BbmNob3JWaWV3KCksCi0gICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0aW9uKExpc3RWaWV3LklOVkFMSURfUE9TSVRJT04pOwotICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBwb3N0KG1IaWRlU2VsZWN0b3IpOwogICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTIyMywxOSArMTAzMSwxMCBAQAogICAgICAqIEBoaWRlIHVzZWQgb25seSBieSBTZWFyY2hEaWFsb2cKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChib29sZWFuIGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKSB7Ci0gICAgICAgIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoOworICAgICAgICBtUG9wdXAuc2V0Rm9yY2VJZ25vcmVPdXRzaWRlVG91Y2goZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpOwogICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkJ1aWxkcyB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhbmQgcmV0dXJucyB0aGUgaGVpZ2h0IHRoZSBwb3B1cAotICAgICAqIHNob3VsZCBoYXZlLiBSZXR1cm5zIC0xIHdoZW4gdGhlIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCdzIGhlaWdodCBvciAtMSBpZiBjb250ZW50IGFscmVhZHkgZXhpc3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgYnVpbGREcm9wRG93bigpIHsKLSAgICAgICAgVmlld0dyb3VwIGRyb3BEb3duVmlldzsKLSAgICAgICAgaW50IG90aGVySGVpZ2h0cyA9IDA7Ci0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgYnVpbGRJbWVDb21wbGV0aW9ucygpIHsKICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOwogICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwpAQCAtMTI2MywxMzUgKzEwNjIsNiBAQAogICAgICAgICAgICAgICAgIGltbS5kaXNwbGF5Q29tcGxldGlvbnModGhpcywgY29tcGxldGlvbnMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgICAgICBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhpcyBSdW5uYWJsZSBleGlzdHMgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgY2hlY2tpbmcgaWYgdGhlIHZpZXcgbGF5b3V0IGhhcyBnb3QKLSAgICAgICAgICAgICAqIGNvbXBsZXRlZCBhbmQgaWYgc28gY2FsbCBzaG93RHJvcERvd24gdG8gZGlzcGxheSB0aGUgZHJvcCBkb3duLiBUaGlzIGlzIHVzZWQgdG8gc2hvdwotICAgICAgICAgICAgICogdGhlIGRyb3AgZG93biBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHVzZXIgb3BlbnMgdXAgdGhlIHNlYXJjaCBkaWFsb2csIHdpdGhvdXQKLSAgICAgICAgICAgICAqIHdhaXRpbmcgZm9yIHRoZSBub3JtYWwgVUkgcGlwZWxpbmUgdG8gZG8gaXQncyBqb2Igd2hpY2ggaXMgc2xvd2VyIHRoYW4gdGhpcyBtZXRob2QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1TaG93RHJvcERvd25SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFZpZXcgbGF5b3V0IHNob3VsZCBiZSBhbGwgZG9uZSBiZWZvcmUgZGlzcGxheWluZyB0aGUgZHJvcCBkb3duLgotICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBnZXREcm9wRG93bkFuY2hvclZpZXcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBtRHJvcERvd25MaXN0ID0gbmV3IERyb3BEb3duTGlzdFZpZXcoY29udGV4dCk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdG9yKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1Ecm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRHJvcERvd25MaXN0VmlldyBkcm9wRG93bkxpc3QgPSBtRHJvcERvd25MaXN0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcERvd25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wRG93bkxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPblNjcm9sbExpc3RlbmVyKG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCkpOwotCi0gICAgICAgICAgICBpZiAobUl0ZW1TZWxlY3RlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobUl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gbURyb3BEb3duTGlzdDsKLQotICAgICAgICAgICAgVmlldyBoaW50VmlldyA9IGdldEhpbnRWaWV3KGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKGhpbnRWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBhbiBoaW50IGhhcyBiZWVuIHNwZWNpZmllZCwgd2UgYWNjb21vZGF0ZSBtb3JlIHNwYWNlIGZvciBpdCBhbmQKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSB0ZXh0IHZpZXcgaW4gdGhlIGRyb3AgZG93biBtZW51LCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGhpbnRDb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KGNvbnRleHQpOwotICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKLQotICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDAsIDEuMGYKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOwotICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhoaW50Vmlldyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSBoaW50J3MgaGVpZ2h0IHRvIGZpbmQgaG93IG11Y2ggbW9yZSB2ZXJ0aWNhbCBzcGFjZQotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRvIHRoZSBkcm9wIGRvd24ncyBoZWlnaHQKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGdldFdpZHRoKCksIE1lYXN1cmVTcGVjLkFUX01PU1QpOwotICAgICAgICAgICAgICAgIGludCBoZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICAgICAgaGludFZpZXcubWVhc3VyZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotCi0gICAgICAgICAgICAgICAgaGludFBhcmFtcyA9IChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSBoaW50Vmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSBoaW50Vmlldy5nZXRNZWFzdXJlZEhlaWdodCgpICsgaGludFBhcmFtcy50b3BNYXJnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICsgaGludFBhcmFtcy5ib3R0b21NYXJnaW47Ci0KLSAgICAgICAgICAgICAgICBkcm9wRG93blZpZXcgPSBoaW50Q29udGFpbmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcoZHJvcERvd25WaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IChWaWV3R3JvdXApIG1Qb3B1cC5nZXRDb250ZW50VmlldygpOwotICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gZHJvcERvd25WaWV3LmZpbmRWaWV3QnlJZChISU5UX1ZJRVdfSUQpOwotICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCi0gICAgICAgIGJvb2xlYW4gaWdub3JlQm90dG9tRGVjb3JhdGlvbnMgPQotICAgICAgICAgICAgICAgIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKLSAgICAgICAgZmluYWwgaW50IG1heEhlaWdodCA9IG1Qb3B1cC5nZXRNYXhBdmFpbGFibGVIZWlnaHQoCi0gICAgICAgICAgICAgICAgZ2V0RHJvcERvd25BbmNob3JWaWV3KCksIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCBpZ25vcmVCb3R0b21EZWNvcmF0aW9ucyk7Ci0KLSAgICAgICAgLy8gZ2V0TWF4QXZhaWxhYmxlSGVpZ2h0KCkgc3VidHJhY3RzIHRoZSBwYWRkaW5nLCBzbyB3ZSBwdXQgaXQgYmFjaywKLSAgICAgICAgLy8gdG8gZ2V0IHRoZSBhdmFpbGFibGUgaGVpZ2h0IGZvciB0aGUgd2hvbGUgd2luZG93Ci0gICAgICAgIGludCBwYWRkaW5nID0gMDsKLSAgICAgICAgRHJhd2FibGUgYmFja2dyb3VuZCA9IG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJhY2tncm91bmQuZ2V0UGFkZGluZyhtVGVtcFJlY3QpOwotICAgICAgICAgICAgcGFkZGluZyA9IG1UZW1wUmVjdC50b3AgKyBtVGVtcFJlY3QuYm90dG9tOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ecm9wRG93bkFsd2F5c1Zpc2libGUgfHwgbURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWF4SGVpZ2h0ICsgcGFkZGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBsaXN0Q29udGVudCA9IG1Ecm9wRG93bkxpc3QubWVhc3VyZUhlaWdodE9mQ2hpbGRyZW4oTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQsCi0gICAgICAgICAgICAgICAgMCwgTGlzdFZpZXcuTk9fUE9TSVRJT04sIG1heEhlaWdodCAtIG90aGVySGVpZ2h0cywgMik7Ci0gICAgICAgIC8vIGFkZCBwYWRkaW5nIG9ubHkgaWYgdGhlIGxpc3QgaGFzIGl0ZW1zIGluIGl0LCB0aGF0IHdheSB3ZSBkb24ndCBzaG93Ci0gICAgICAgIC8vIHRoZSBwb3B1cCBpZiBpdCBpcyBub3QgbmVlZGVkCi0gICAgICAgIGlmIChsaXN0Q29udGVudCA+IDApIG90aGVySGVpZ2h0cyArPSBwYWRkaW5nOwotCi0gICAgICAgIHJldHVybiBsaXN0Q29udGVudCArIG90aGVySGVpZ2h0czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZpZXcgZ2V0SGludFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChtSGludFRleHQgIT0gbnVsbCAmJiBtSGludFRleHQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBUZXh0VmlldyBoaW50VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KS5pbmZsYXRlKAotICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7Ci0gICAgICAgICAgICBoaW50Vmlldy5zZXRUZXh0KG1IaW50VGV4dCk7Ci0gICAgICAgICAgICBoaW50Vmlldy5zZXRJZChISU5UX1ZJRVdfSUQpOwotICAgICAgICAgICAgcmV0dXJuIGhpbnRWaWV3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE0NDMsNDcgKzExMTMsNiBAQAogICAgICAgICByZXR1cm4gbUZpbHRlcjsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIExpc3RTZWxlY3RvckhpZGVyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUmVzaXplUG9wdXBSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7Ci0gICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUG9wdXBUb3VjaEludGVyY2VwdG9yIGltcGxlbWVudHMgT25Ub3VjaExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCi0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgICAgIHBvc3REZWxheWVkKG1SZXNpemVQb3B1cFJ1bm5hYmxlLCBFWFBBTkRfTElTVF9USU1FT1VUKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFNjcm9sbExpc3RlbmVyIGltcGxlbWVudHMgTGlzdFZpZXcuT25TY3JvbGxMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsKEFic0xpc3RWaWV3IHZpZXcsIGludCBmaXJzdFZpc2libGVJdGVtLCBpbnQgdmlzaWJsZUl0ZW1Db3VudCwKLSAgICAgICAgICAgICAgICBpbnQgdG90YWxJdGVtQ291bnQpIHsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGxTdGF0ZUNoYW5nZWQoQWJzTGlzdFZpZXcgdmlldywgaW50IHNjcm9sbFN0YXRlKSB7Ci0gICAgICAgICAgICBpZiAoc2Nyb2xsU3RhdGUgPT0gU0NST0xMX1NUQVRFX1RPVUNIX1NDUk9MTCAmJgotICAgICAgICAgICAgICAgICAgICAhaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpICYmIG1Qb3B1cC5nZXRDb250ZW50VmlldygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobVJlc2l6ZVBvcHVwUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1SZXNpemVQb3B1cFJ1bm5hYmxlLnJ1bigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyIGltcGxlbWVudHMgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKICAgICAgICAgICAgIHBlcmZvcm1Db21wbGV0aW9uKHYsIHBvc2l0aW9uLCBpZCk7CkBAIC0xNDkxLDEyMyArMTEyMCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+V3JhcHBlciBjbGFzcyBmb3IgYSBMaXN0Vmlldy4gVGhpcyB3cmFwcGVyIGhpamFja3MgdGhlIGZvY3VzIHRvCi0gICAgICogbWFrZSBzdXJlIHRoZSBsaXN0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRyYXdhYmxlcyBhbmQgc3RhdGVzIHdoZW4KLSAgICAgKiBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhpbiBhIGRyb3AgZG93bi4gVGhlIGZvY3VzIGlzIG5ldmVyIGFjdHVhbGx5Ci0gICAgICogcGFzc2VkIHRvIHRoZSBkcm9wIGRvd247IHRoZSBsaXN0IG9ubHkgbG9va3MgZm9jdXNlZC48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJvcERvd25MaXN0VmlldyBleHRlbmRzIExpc3RWaWV3IHsKLSAgICAgICAgLyoKLSAgICAgICAgICogV0FSTklORzogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgdG91Y2ggbW9kZSBpc3N1ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogVG91Y2ggbW9kZSBpcyBwcm9wYWdhdGVkIGxhemlseSB0byB3aW5kb3dzLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBpbgotICAgICAgICAgKiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgotICAgICAgICAgKiAtIFR5cGUgc29tZXRoaW5nIGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyBhbmQgZ2V0IHNvbWUgcmVzdWx0cwotICAgICAgICAgKiAtIE1vdmUgZG93biB3aXRoIHRoZSBkLXBhZCB0byBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgbGlzdAotICAgICAgICAgKiAtIE1vdmUgdXAgd2l0aCB0aGUgZC1wYWQgdW50aWwgdGhlIHNlbGVjdGlvbiBkaXNhcHBlYXJzCi0gICAgICAgICAqIC0gVHlwZSBtb3JlIHRleHQgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3ICp1c2luZyB0aGUgc29mdCBrZXlib2FyZCoKLSAgICAgICAgICogICBhbmQgZ2V0IG5ldyByZXN1bHRzOyB5b3UgYXJlIG5vdyBpbiB0b3VjaCBtb2RlCi0gICAgICAgICAqIC0gVGhlIHNlbGVjdGlvbiBjb21lcyBiYWNrIG9uIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LCBldmVuIHRob3VnaAotICAgICAgICAgKiAgIHRoZSBsaXN0IGlzIHN1cHBvc2VkIHRvIGJlIGluIHRvdWNoIG1vZGUKLSAgICAgICAgICoKLSAgICAgICAgICogVXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQgdHJpZ2dlcnMgdGhlIHRvdWNoIG1vZGUgY2hhbmdlIGJ1dCB0aGF0IGNoYW5nZQotICAgICAgICAgKiBpcyBwcm9wYWdhdGVkIHRvIG91ciB3aW5kb3cgb25seSBhZnRlciB0aGUgZmlyc3QgbGlzdCBsYXlvdXQsIHRoZXJlZm9yZQotICAgICAgICAgKiBhZnRlciB0aGUgbGlzdCBhdHRlbXB0cyB0byByZXN1cnJlY3QgdGhlIHNlbGVjdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIHRyaWNrIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgaXMgdG8gcHJldGVuZCB0aGUgbGlzdCBpcyBpbiB0b3VjaAotICAgICAgICAgKiBtb2RlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIsIHRoYXQgaXMgd2hlbgotICAgICAgICAgKiB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZSBzZWxlY3Rpb24gYXdheSBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgd2hlbmV2ZXIgd2UgZXhwbGljaXRlbHkgaGlkZSB0aGUgbGlzdCdzCi0gICAgICAgICAqIHNlbGVjdGlvbiBhbmQgcmVzZXQgdG8gZmFsc2Ugd2hlbnZlciB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZQotICAgICAgICAgKiBzZWxlY3Rpb24gYmFjayB0byB0aGUgbGlzdC4KLSAgICAgICAgICoKLSAgICAgICAgICogV2hlbiB0aGlzIGJvb2xlYW4gaXMgdHJ1ZSwgaXNJblRvdWNoTW9kZSgpIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0Ci0gICAgICAgICAqIHJldHVybnMgc3VwZXIuaXNJblRvdWNoTW9kZSgpLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1MaXN0U2VsZWN0aW9uSGlkZGVuOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3IGxpc3QgdmlldyB3cmFwcGVyLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbnRleHQgdGhpcyB2aWV3J3MgY29udGV4dAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIERyb3BEb3duTGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuZHJvcERvd25MaXN0Vmlld1N0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5Bdm9pZHMgamFycmluZyBzY3JvbGxpbmcgZWZmZWN0IGJ5IGVuc3VyaW5nIHRoYXQgbGlzdCBlbGVtZW50cwotICAgICAgICAgKiBtYWRlIG9mIGEgdGV4dCB2aWV3IGZpdCBvbiBhIHNpbmdsZSBsaW5lLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpdGVtIGluZGV4IGluIHRoZSBsaXN0IHRvIGdldCBhIHZpZXcgZm9yCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIFZpZXcgb2J0YWluVmlldyhpbnQgcG9zaXRpb24sIGJvb2xlYW5bXSBpc1NjcmFwKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBzdXBlci5vYnRhaW5WaWV3KHBvc2l0aW9uLCBpc1NjcmFwKTsKLQotICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgewotICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldEhvcml6b250YWxseVNjcm9sbGluZyh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblRvdWNoTW9kZSgpIHsKLSAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCi0gICAgICAgICAgICByZXR1cm4gbUxpc3RTZWxlY3Rpb25IaWRkZW4gfHwgc3VwZXIuaXNJblRvdWNoTW9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzV2luZG93Rm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cwotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIGludFtdIG9uQ3JlYXRlRHJhd2FibGVTdGF0ZShpbnQgZXh0cmFTcGFjZSkgewotICAgICAgICAgICAgaW50W10gcmVzID0gc3VwZXIub25DcmVhdGVEcmF3YWJsZVN0YXRlKGV4dHJhU3BhY2UpOwotICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRJZlN0YXRlbWVudAotICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJDcmVhdGVkIGRyYXdhYmxlIHN0YXRlOiBbIik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIweCIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZXNbaV0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJdIik7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhpcyBUZXh0VmlldyBjb21wbGllcyB0bwogICAgICAqIGEgY2VydGFpbiBmb3JtYXQuICBTaW5jZSB0aGVyZSBpcyBubyBmb29scHJvb2Ygd2F5IHRvIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBsZWF2aW5nCiAgICAgICogdGhpcyBWaWV3IHdpdGggYW4gaW5jb3JyZWN0IHZhbHVlIGluIGl0LCBhbGwgd2UgY2FuIGRvIGlzIHRyeSB0byBmaXggaXQgb3Vyc2VsdmVzCkBAIC0xNjU1LDEwICsxMTY3LDcgQEAKICAgICBwcml2YXRlIGNsYXNzIFBvcHVwRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgRGF0YVNldE9ic2VydmVyIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgIGlmIChpc1BvcHVwU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJlc2l6ZSB0aGUgcG9wdXAgdG8gZml0IHRoZSBuZXcgYWRhcHRlcidzIGNvbnRlbnQKLSAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcG9wdXAgaXMgbm90IHNob3dpbmcgYWxyZWFkeSwgc2hvd2luZyBpdCB3aWxsIGNhdXNlCiAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3Qgb2YgZGF0YSBzZXQgb2JzZXJ2ZXJzIGF0dGFjaGVkIHRvIHRoZSBhZGFwdGVyIHRvCiAgICAgICAgICAgICAgICAgLy8gY2hhbmdlLiBXZSBjYW4ndCBkbyBpdCBmcm9tIGhlcmUsIGJlY2F1c2Ugd2UgYXJlIGluIHRoZSBtaWRkbGUKQEAgLTE2NzMsMTQgKzExODIsNSBAQAogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZWQoKSB7Ci0gICAgICAgICAgICBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGRhdGEgdG8gZGlzcGxheSBzbyBtYWtlIHN1cmUgd2UncmUgbm90IHNob3dpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGUgZHJvcCBkb3duIGFuZCBpdHMgbGlzdAotICAgICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEKaW5kZXggYmFhNjgzMy4uNGNmODc4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhCkBAIC04MCw2ICs4MCwxOCBAQAogICAgIHByb3RlY3RlZCBGaWx0ZXJRdWVyeVByb3ZpZGVyIG1GaWx0ZXJRdWVyeVByb3ZpZGVyOwogCiAgICAgLyoqCisgICAgICogSWYgc2V0IHRoZSBhZGFwdGVyIHdpbGwgY2FsbCByZXF1ZXJ5KCkgb24gdGhlIGN1cnNvciB3aGVuZXZlciBhIGNvbnRlbnQgY2hhbmdlCisgICAgICogbm90aWZpY2F0aW9uIGlzIGRlbGl2ZXJlZC4gSW1wbGllcyB7QGxpbmsgI0ZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FVVE9fUkVRVUVSWSA9IDB4MDE7CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlIGFkYXB0ZXIgd2lsbCByZWdpc3RlciBhIGNvbnRlbnQgb2JzZXJ2ZXIgb24gdGhlIGN1cnNvciBhbmQgd2lsbCBjYWxsCisgICAgICoge0BsaW5rICNvbkNvbnRlbnRDaGFuZ2VkKCl9IHdoZW4gYSBub3RpZmljYXRpb24gY29tZXMgaW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSID0gMHgwMjsKKworICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLiBUaGUgYWRhcHRlciB3aWxsIGNhbGwgcmVxdWVyeSgpIG9uIHRoZSBjdXJzb3Igd2hlbmV2ZXIKICAgICAgKiBpdCBjaGFuZ2VzIHNvIHRoYXQgdGhlIG1vc3QgcmVjZW50IGRhdGEgaXMgYWx3YXlzIGRpc3BsYXllZC4KICAgICAgKgpAQCAtODcsNyArOTksNyBAQAogICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0CiAgICAgICovCiAgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYykgewotICAgICAgICBpbml0KGNvbnRleHQsIGMsIHRydWUpOworICAgICAgICBpbml0KGNvbnRleHQsIGMsIEZMQUdfQVVUT19SRVFVRVJZKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk5LDE5ICsxMTEsNDMgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBhbHdheXMgZGlzcGxheWVkLgogICAgICAqLwogICAgIHB1YmxpYyBDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGJvb2xlYW4gYXV0b1JlcXVlcnkpIHsKLSAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSk7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgYXV0b1JlcXVlcnkgPyBGTEFHX0FVVE9fUkVRVUVSWSA6IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gYyBUaGUgY3Vyc29yIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGZsYWdzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgYWRhcHRlcgorICAgICAqLworICAgIHB1YmxpYyBDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBpbml0KGNvbnRleHQsIGMsIGZsYWdzKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGJvb2xlYW4gYXV0b1JlcXVlcnkpIHsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSA/IEZMQUdfQVVUT19SRVFVRVJZIDogRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19BVVRPX1JFUVVFUlkpID09IEZMQUdfQVVUT19SRVFVRVJZKSB7CisgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVI7CisgICAgICAgICAgICBtQXV0b1JlcXVlcnkgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1dG9SZXF1ZXJ5ID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBjdXJzb3JQcmVzZW50ID0gYyAhPSBudWxsOwotICAgICAgICBtQXV0b1JlcXVlcnkgPSBhdXRvUmVxdWVyeTsKICAgICAgICAgbUN1cnNvciA9IGM7CiAgICAgICAgIG1EYXRhVmFsaWQgPSBjdXJzb3JQcmVzZW50OwogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Sb3dJRENvbHVtbiA9IGN1cnNvclByZXNlbnQgPyBjLmdldENvbHVtbkluZGV4T3JUaHJvdygiX2lkIikgOiAtMTsKLSAgICAgICAgbUNoYW5nZU9ic2VydmVyID0gbmV3IENoYW5nZU9ic2VydmVyKCk7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpID09IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUikgeworICAgICAgICAgICAgbUNoYW5nZU9ic2VydmVyID0gbmV3IENoYW5nZU9ic2VydmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBudWxsOworICAgICAgICB9CisKICAgICAgICAgaWYgKGN1cnNvclByZXNlbnQpIHsKLSAgICAgICAgICAgIGMucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOwogICAgICAgICAgICAgYy5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI0NiwxMyArMjgyLDEzIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CisgICAgICAgICAgICBpZiAobUNoYW5nZU9ic2VydmVyICE9IG51bGwpIG1DdXJzb3IudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOwogICAgICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CiAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CisgICAgICAgICAgICBpZiAobUNoYW5nZU9ic2VydmVyICE9IG51bGwpIGN1cnNvci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOwogICAgICAgICAgICAgY3Vyc29yLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICAgICAgbVJvd0lEQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdygiX2lkIik7CiAgICAgICAgICAgICBtRGF0YVZhbGlkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGdlR2xvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VHbG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmN2RhYWIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VHbG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5EZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGVyZm9ybXMgdGhlIGdsb3cgZWZmZWN0IHVzZWQgYXQgdGhlIGVkZ2VzIG9mIHNjcm9sbGFibGUgd2lkZ2V0cy4KLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGdlR2xvdyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJFZGdlR2xvdyI7Ci0KLSAgICAvLyBUaW1lIGl0IHdpbGwgdGFrZSB0aGUgZWZmZWN0IHRvIGZ1bGx5IHJlY2VkZSBpbiBtcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUNFREVfVElNRSA9IDEwMDA7Ci0KLSAgICAvLyBUaW1lIGl0IHdpbGwgdGFrZSBiZWZvcmUgYSBwdWxsZWQgZ2xvdyBiZWdpbnMgcmVjZWRpbmcKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFVMTF9USU1FID0gMjUwOwotCi0gICAgLy8gVGltZSBpdCB3aWxsIHRha2UgZm9yIGEgcHVsbGVkIGdsb3cgdG8gZGVjYXkgdG8gcGFydGlhbCBzdHJlbmd0aCBiZWZvcmUgcmVsZWFzZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQVUxMX0RFQ0FZX1RJTUUgPSAxMDAwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9BTFBIQSA9IDEuZjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBIRUxEX0VER0VfQUxQSEEgPSAwLjdmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfRURHRV9TQ0FMRV9ZID0gMC41ZjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBIRUxEX0dMT1dfQUxQSEEgPSAwLjVmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfR0xPV19TQ0FMRV9ZID0gMC41ZjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9HTE9XX0hFSUdIVCA9IDMuZjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFBVTExfR0xPV19CRUdJTiA9IDEuZjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBQVUxMX0VER0VfQkVHSU4gPSAwLjZmOwotCi0gICAgLy8gTWluaW11bSB2ZWxvY2l0eSB0aGF0IHdpbGwgYmUgYWJzb3JiZWQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1ZFTE9DSVRZID0gMTAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRVBTSUxPTiA9IDAuMDAxZjsKLQotICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbUVkZ2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtR2xvdzsKLSAgICBwcml2YXRlIGludCBtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUhlaWdodDsKLQotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VBbHBoYTsKLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlU2NhbGVZOwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dBbHBoYTsKLSAgICBwcml2YXRlIGZsb2F0IG1HbG93U2NhbGVZOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZUFscGhhU3RhcnQ7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZUFscGhhRmluaXNoOwotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VTY2FsZVlTdGFydDsKLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlU2NhbGVZRmluaXNoOwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dBbHBoYVN0YXJ0OwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dBbHBoYUZpbmlzaDsKLSAgICBwcml2YXRlIGZsb2F0IG1HbG93U2NhbGVZU3RhcnQ7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd1NjYWxlWUZpbmlzaDsKLQotICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOwotICAgIHByaXZhdGUgZmxvYXQgbUR1cmF0aW9uOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JRExFID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFVMTCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FCU09SQiA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1JFQ0VERSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BVTExfREVDQVkgPSA0OwotCi0gICAgLy8gSG93IG11Y2ggZHJhZ2dpbmcgc2hvdWxkIGVmZmVjdCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGdlIGltYWdlLgotICAgIC8vIE51bWJlciBkZXRlcm1pbmVkIGJ5IHVzZXIgdGVzdGluZy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFVMTF9ESVNUQU5DRV9FREdFX0ZBQ1RPUiA9IDU7Ci0KLSAgICAvLyBIb3cgbXVjaCBkcmFnZ2luZyBzaG91bGQgZWZmZWN0IHRoZSBoZWlnaHQgb2YgdGhlIGdsb3cgaW1hZ2UuCi0gICAgLy8gTnVtYmVyIGRldGVybWluZWQgYnkgdXNlciB0ZXN0aW5nLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQVUxMX0RJU1RBTkNFX0dMT1dfRkFDVE9SID0gNTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRUxPQ0lUWV9FREdFX0ZBQ1RPUiA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFTE9DSVRZX0dMT1dfRkFDVE9SID0gMTY7Ci0KLSAgICBwcml2YXRlIGludCBtU3RhdGUgPSBTVEFURV9JRExFOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtUHVsbERpc3RhbmNlOwotCi0gICAgcHVibGljIEVkZ2VHbG93KERyYXdhYmxlIGVkZ2UsIERyYXdhYmxlIGdsb3cpIHsKLSAgICAgICAgbUVkZ2UgPSBlZGdlOwotICAgICAgICBtR2xvdyA9IGdsb3c7Ci0KLSAgICAgICAgbUludGVycG9sYXRvciA9IG5ldyBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgbVdpZHRoID0gd2lkdGg7Ci0gICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9JRExFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfSURMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBwdWxsZWQgYnkgdGhlIHVzZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVsdGFEaXN0YW5jZSBDaGFuZ2UgaW4gZGlzdGFuY2Ugc2luY2UgdGhlIGxhc3QgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uUHVsbChmbG9hdCBkZWx0YURpc3RhbmNlKSB7Ci0gICAgICAgIGZpbmFsIGxvbmcgbm93ID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9QVUxMX0RFQ0FZICYmIG5vdyAtIG1TdGFydFRpbWUgPCBtRHVyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1BVTEwpIHsKLSAgICAgICAgICAgIG1HbG93U2NhbGVZID0gUFVMTF9HTE9XX0JFR0lOOwotICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BVTEw7Ci0KLSAgICAgICAgbVN0YXJ0VGltZSA9IG5vdzsKLSAgICAgICAgbUR1cmF0aW9uID0gUFVMTF9USU1FOwotCi0gICAgICAgIG1QdWxsRGlzdGFuY2UgKz0gZGVsdGFEaXN0YW5jZTsKLSAgICAgICAgZmxvYXQgZGlzdGFuY2UgPSBNYXRoLmFicyhtUHVsbERpc3RhbmNlKTsKLQotICAgICAgICBtRWRnZUFscGhhID0gbUVkZ2VBbHBoYVN0YXJ0ID0gTWF0aC5tYXgoUFVMTF9FREdFX0JFR0lOLCBNYXRoLm1pbihkaXN0YW5jZSwgTUFYX0FMUEhBKSk7Ci0gICAgICAgIG1FZGdlU2NhbGVZID0gbUVkZ2VTY2FsZVlTdGFydCA9IE1hdGgubWF4KAotICAgICAgICAgICAgICAgIEhFTERfRURHRV9TQ0FMRV9ZLCBNYXRoLm1pbihkaXN0YW5jZSAqIFBVTExfRElTVEFOQ0VfRURHRV9GQUNUT1IsIDEuZikpOwotCi0gICAgICAgIG1HbG93QWxwaGEgPSBtR2xvd0FscGhhU3RhcnQgPSBNYXRoLm1heCgKLSAgICAgICAgICAgICAgICAwLjVmLCBNYXRoLm1pbihtR2xvd0FscGhhICsgTWF0aC5hYnMoZGVsdGFEaXN0YW5jZSksIE1BWF9BTFBIQSkpOwotCi0gICAgICAgIGZsb2F0IGdsb3dDaGFuZ2UgPSBNYXRoLmFicyhkZWx0YURpc3RhbmNlKTsKLSAgICAgICAgaWYgKGRlbHRhRGlzdGFuY2UgPiAwICYmIG1QdWxsRGlzdGFuY2UgPCAwKSB7Ci0gICAgICAgICAgICBnbG93Q2hhbmdlID0gLWdsb3dDaGFuZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QdWxsRGlzdGFuY2UgPT0gMCkgewotICAgICAgICAgICAgbUdsb3dTY2FsZVkgPSAwOwotICAgICAgICB9Ci0gICAgICAgIG1HbG93U2NhbGVZID0gbUdsb3dTY2FsZVlTdGFydCA9IE1hdGgubWF4KAotICAgICAgICAgICAgICAgIDAsIG1HbG93U2NhbGVZICsgZ2xvd0NoYW5nZSAqIFBVTExfRElTVEFOQ0VfR0xPV19GQUNUT1IpOwotCi0gICAgICAgIG1FZGdlQWxwaGFGaW5pc2ggPSBtRWRnZUFscGhhOwotICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IG1FZGdlU2NhbGVZOwotICAgICAgICBtR2xvd0FscGhhRmluaXNoID0gbUdsb3dBbHBoYTsKLSAgICAgICAgbUdsb3dTY2FsZVlGaW5pc2ggPSBtR2xvd1NjYWxlWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHdoZW4gdGhlIG9iamVjdCBpcyByZWxlYXNlZCBhZnRlciBiZWluZyBwdWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICBtUHVsbERpc3RhbmNlID0gMDsKLQotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1BVTEwgJiYgbVN0YXRlICE9IFNUQVRFX1BVTExfREVDQVkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFQ0VERTsKLSAgICAgICAgbUVkZ2VBbHBoYVN0YXJ0ID0gbUVkZ2VBbHBoYTsKLSAgICAgICAgbUVkZ2VTY2FsZVlTdGFydCA9IG1FZGdlU2NhbGVZOwotICAgICAgICBtR2xvd0FscGhhU3RhcnQgPSBtR2xvd0FscGhhOwotICAgICAgICBtR2xvd1NjYWxlWVN0YXJ0ID0gbUdsb3dTY2FsZVk7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IDAuZjsKLSAgICAgICAgbUVkZ2VTY2FsZVlGaW5pc2ggPSAwLmY7Ci0gICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSAwLmY7Ci0gICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gMC5mOwotCi0gICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICBtRHVyYXRpb24gPSBSRUNFREVfVElNRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHdoZW4gdGhlIGVmZmVjdCBhYnNvcmJzIGFuIGltcGFjdCBhdCB0aGUgZ2l2ZW4gdmVsb2NpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmVsb2NpdHkgVmVsb2NpdHkgYXQgaW1wYWN0IGluIHBpeGVscyBwZXIgc2Vjb25kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uQWJzb3JiKGludCB2ZWxvY2l0eSkgewotICAgICAgICBtU3RhdGUgPSBTVEFURV9BQlNPUkI7Ci0gICAgICAgIHZlbG9jaXR5ID0gTWF0aC5tYXgoTUlOX1ZFTE9DSVRZLCBNYXRoLmFicyh2ZWxvY2l0eSkpOwotCi0gICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICBtRHVyYXRpb24gPSAwLjFmICsgKHZlbG9jaXR5ICogMC4wM2YpOwotCi0gICAgICAgIC8vIFRoZSBlZGdlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgcGFydGlhbGx5IHZpc2libGUsIHJlZ2FyZGxlc3MKLSAgICAgICAgLy8gb2YgdmVsb2NpdHkuCi0gICAgICAgIG1FZGdlQWxwaGFTdGFydCA9IDAuNWY7Ci0gICAgICAgIG1FZGdlU2NhbGVZU3RhcnQgPSAwLjJmOwotICAgICAgICAvLyBUaGUgZ2xvdyBkZXBlbmRzIG1vcmUgb24gdGhlIHZlbG9jaXR5LCBhbmQgdGhlcmVmb3JlIHN0YXJ0cyBvdXQKLSAgICAgICAgLy8gbmVhcmx5IGludmlzaWJsZS4KLSAgICAgICAgbUdsb3dBbHBoYVN0YXJ0ID0gMC41ZjsKLSAgICAgICAgbUdsb3dTY2FsZVlTdGFydCA9IDAuZjsKLQotICAgICAgICAvLyBGYWN0b3IgdGhlIHZlbG9jaXR5IGJ5IDguIFRlc3Rpbmcgb24gZGV2aWNlIHNob3dzIHRoaXMgd29ya3MgYmVzdCB0bwotICAgICAgICAvLyByZWZsZWN0IHRoZSBzdHJlbmd0aCBvZiB0aGUgdXNlcidzIHNjcm9sbGluZy4KLSAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHZlbG9jaXR5ICogVkVMT0NJVFlfRURHRV9GQUNUT1IsIDEpKTsKLSAgICAgICAgLy8gRWRnZSBzaG91bGQgbmV2ZXIgZ2V0IGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIGl0cyBhc3NldC4KLSAgICAgICAgbUVkZ2VTY2FsZVlGaW5pc2ggPSAxLmY7Ci0KLSAgICAgICAgLy8gR3Jvd3RoIGZvciB0aGUgc2l6ZSBvZiB0aGUgZ2xvdyBzaG91bGQgYmUgcXVhZHJhdGljIHRvIHByb3Blcmx5Ci0gICAgICAgIC8vIHJlc3BvbmQKLSAgICAgICAgLy8gdG8gYSB1c2VyJ3Mgc2Nyb2xsaW5nIHNwZWVkLiBUaGUgZmFzdGVyIHRoZSBzY3JvbGxpbmcgc3BlZWQsIHRoZSBtb3JlCi0gICAgICAgIC8vIGludGVuc2UgdGhlIGVmZmVjdCBzaG91bGQgYmUgZm9yIGJvdGggdGhlIHNpemUgYW5kIHRoZSBzYXR1cmF0aW9uLgotICAgICAgICBtR2xvd1NjYWxlWUZpbmlzaCA9IE1hdGgubWluKDAuMDI1ZiArICh2ZWxvY2l0eSAqICh2ZWxvY2l0eSAvIDEwMCkgKiAwLjAwMDE1ZiksIDEuNzVmKTsKLSAgICAgICAgLy8gQWxwaGEgc2hvdWxkIGNoYW5nZSBmb3IgdGhlIGdsb3cgYXMgd2VsbCBhcyBzaXplLgotICAgICAgICBtR2xvd0FscGhhRmluaXNoID0gTWF0aC5tYXgoCi0gICAgICAgICAgICAgICAgbUdsb3dBbHBoYVN0YXJ0LCBNYXRoLm1pbih2ZWxvY2l0eSAqIFZFTE9DSVRZX0dMT1dfRkFDVE9SICogLjAwMDAxZiwgTUFYX0FMUEhBKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBEcmF3IGludG8gdGhlIHByb3ZpZGVkIGNhbnZhcy4gQXNzdW1lcyB0aGF0IHRoZSBjYW52YXMgaGFzIGJlZW4gcm90YXRlZAotICAgICAqIGFjY29yZGluZ2x5IGFuZCB0aGUgc2l6ZSBoYXMgYmVlbiBzZXQuIFRoZSBlZmZlY3Qgd2lsbCBiZSBkcmF3biB0aGUgZnVsbAotICAgICAqIHdpZHRoIG9mIFg9MCB0byBYPXdpZHRoLCBlbWl0dGluZyBmcm9tIFk9MCBhbmQgZXh0ZW5kaW5nIHRvIHNvbWUgZmFjdG9yIDwKLSAgICAgKiAxLmYgb2YgaGVpZ2h0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbnZhcyBDYW52YXMgdG8gZHJhdyBpbnRvCi0gICAgICogQHJldHVybiB0cnVlIGlmIGRyYXdpbmcgc2hvdWxkIGNvbnRpbnVlIGJleW9uZCB0aGlzIGZyYW1lIHRvIGNvbnRpbnVlIHRoZQotICAgICAqICAgICAgICAgYW5pbWF0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHVwZGF0ZSgpOwotCi0gICAgICAgIGZpbmFsIGludCBlZGdlSGVpZ2h0ID0gbUVkZ2UuZ2V0SW50cmluc2ljSGVpZ2h0KCk7Ci0gICAgICAgIGZpbmFsIGludCBnbG93SGVpZ2h0ID0gbUdsb3cuZ2V0SW50cmluc2ljSGVpZ2h0KCk7Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgZGlzdFNjYWxlID0gKGZsb2F0KSBtSGVpZ2h0IC8gbVdpZHRoOwotCi0gICAgICAgIG1HbG93LnNldEFscGhhKChpbnQpIChNYXRoLm1heCgwLCBNYXRoLm1pbihtR2xvd0FscGhhLCAxKSkgKiAyNTUpKTsKLSAgICAgICAgLy8gV2lkdGggb2YgdGhlIGltYWdlIHNob3VsZCBiZSAzICogdGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4uCi0gICAgICAgIC8vIFNob3VsZCBzdGFydCBvZmYgc2NyZWVuIHRvIHRoZSBsZWZ0LgotICAgICAgICBtR2xvdy5zZXRCb3VuZHMoLW1XaWR0aCwgMCwgbVdpZHRoICogMiwgKGludCkgTWF0aC5taW4oCi0gICAgICAgICAgICAgICAgZ2xvd0hlaWdodCAqIG1HbG93U2NhbGVZICogZGlzdFNjYWxlICogMC42ZiwgbUhlaWdodCAqIE1BWF9HTE9XX0hFSUdIVCkpOwotICAgICAgICBtR2xvdy5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgbUVkZ2Uuc2V0QWxwaGEoKGludCkgKE1hdGgubWF4KDAsIE1hdGgubWluKG1FZGdlQWxwaGEsIDEpKSAqIDI1NSkpOwotICAgICAgICBtRWRnZS5zZXRCb3VuZHMoMCwgMCwgbVdpZHRoLCAoaW50KSAoZWRnZUhlaWdodCAqIG1FZGdlU2NhbGVZKSk7Ci0gICAgICAgIG1FZGdlLmRyYXcoY2FudmFzKTsKLQotICAgICAgICByZXR1cm4gbVN0YXRlICE9IFNUQVRFX0lETEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgZmxvYXQgdCA9IE1hdGgubWluKCh0aW1lIC0gbVN0YXJ0VGltZSkgLyBtRHVyYXRpb24sIDEuZik7Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgaW50ZXJwID0gbUludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKHQpOwotCi0gICAgICAgIG1FZGdlQWxwaGEgPSBtRWRnZUFscGhhU3RhcnQgKyAobUVkZ2VBbHBoYUZpbmlzaCAtIG1FZGdlQWxwaGFTdGFydCkgKiBpbnRlcnA7Ci0gICAgICAgIG1FZGdlU2NhbGVZID0gbUVkZ2VTY2FsZVlTdGFydCArIChtRWRnZVNjYWxlWUZpbmlzaCAtIG1FZGdlU2NhbGVZU3RhcnQpICogaW50ZXJwOwotICAgICAgICBtR2xvd0FscGhhID0gbUdsb3dBbHBoYVN0YXJ0ICsgKG1HbG93QWxwaGFGaW5pc2ggLSBtR2xvd0FscGhhU3RhcnQpICogaW50ZXJwOwotICAgICAgICBtR2xvd1NjYWxlWSA9IG1HbG93U2NhbGVZU3RhcnQgKyAobUdsb3dTY2FsZVlGaW5pc2ggLSBtR2xvd1NjYWxlWVN0YXJ0KSAqIGludGVycDsKLQotICAgICAgICBpZiAodCA+PSAxLmYgLSBFUFNJTE9OKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQUJTT1JCOgotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9SRUNFREU7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBSRUNFREVfVElNRTsKLQotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhU3RhcnQgPSBtRWRnZUFscGhhOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWVN0YXJ0ID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFTdGFydCA9IG1HbG93QWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZU3RhcnQgPSBtR2xvd1NjYWxlWTsKLQotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gMC5mOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IG1FZGdlU2NhbGVZOwotICAgICAgICAgICAgICAgICAgICBtR2xvd0FscGhhRmluaXNoID0gMC5mOwotICAgICAgICAgICAgICAgICAgICBtR2xvd1NjYWxlWUZpbmlzaCA9IG1HbG93U2NhbGVZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BVTEw6Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BVTExfREVDQVk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBQVUxMX0RFQ0FZX1RJTUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VBbHBoYVN0YXJ0ID0gbUVkZ2VBbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VTY2FsZVlTdGFydCA9IG1FZGdlU2NhbGVZOwotICAgICAgICAgICAgICAgICAgICBtR2xvd0FscGhhU3RhcnQgPSBtR2xvd0FscGhhOwotICAgICAgICAgICAgICAgICAgICBtR2xvd1NjYWxlWVN0YXJ0ID0gbUdsb3dTY2FsZVk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYSBwdWxsLCB0aGUgZ2xvdyBzaG91bGQgZmFkZSB0byBub3RoaW5nLgotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gMC5mOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IDAuZjsKLSAgICAgICAgICAgICAgICAgICAgbUdsb3dBbHBoYUZpbmlzaCA9IDAuZjsKLSAgICAgICAgICAgICAgICAgICAgbUdsb3dTY2FsZVlGaW5pc2ggPSAwLmY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUFVMTF9ERUNBWToKLSAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZzsgd2FpdCBmb3IgcmVsZWFzZQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1JFQ0VERToKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RWaWV3LmphdmEKaW5kZXggOGJkNzk3Yi4uM2QyMTA0OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdFZpZXcuamF2YQpAQCAtMTg1LDcgKzE4NSw2IEBACiAgICAgCiAgICAgLyoqIERyYXdhYmxlIHRvIGJlIHVzZWQgYXMgYSBkaXZpZGVyIHdoZW4gaXQgaXMgYWRqYWNlbnQgdG8gYW55IGNoaWxkcmVuICovCiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQ2hpbGREaXZpZGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xpcENoaWxkRGl2aWRlcjsKIAogICAgIC8vIEJvdW5kcyBvZiB0aGUgaW5kaWNhdG9yIHRvIGJlIGRyYXduCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1JbmRpY2F0b3JSZWN0ID0gbmV3IFJlY3QoKTsKQEAgLTM3OSw3ICszNzgsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENoaWxkRGl2aWRlcihEcmF3YWJsZSBjaGlsZERpdmlkZXIpIHsKICAgICAgICAgbUNoaWxkRGl2aWRlciA9IGNoaWxkRGl2aWRlcjsKLSAgICAgICAgbUNsaXBDaGlsZERpdmlkZXIgPSBjaGlsZERpdmlkZXIgIT0gbnVsbCAmJiBjaGlsZERpdmlkZXIgaW5zdGFuY2VvZiBDb2xvckRyYXdhYmxlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzk2LDE3ICszOTQsOCBAQAogICAgICAgICAgICAgICAgICAgICBwb3MuZ3JvdXBNZXRhZGF0YS5sYXN0Q2hpbGRGbFBvcyAhPSBwb3MuZ3JvdXBNZXRhZGF0YS5mbFBvcykpIHsKICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIGNhc2VzIHdoZXJlIHdlIGRyYXcgdGhlIGNoaWxkIGRpdmlkZXIKICAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBkaXZpZGVyID0gbUNoaWxkRGl2aWRlcjsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNsaXAgPSBtQ2xpcENoaWxkRGl2aWRlcjsKLSAgICAgICAgICAgICAgICBpZiAoIWNsaXApIHsKLSAgICAgICAgICAgICAgICAgICAgZGl2aWRlci5zZXRCb3VuZHMoYm91bmRzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoYm91bmRzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGl2aWRlci5zZXRCb3VuZHMoYm91bmRzKTsKICAgICAgICAgICAgICAgICBkaXZpZGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcCkgewotICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwb3MucmVjeWNsZSgpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GcmFtZUxheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEKaW5kZXggZTQ0NTE4MC4uNTU5YTVmZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEKQEAgLTMyLDggKzMyLDggQEAKIAogLyoqCiAgKiBGcmFtZUxheW91dCBpcyBkZXNpZ25lZCB0byBibG9jayBvdXQgYW4gYXJlYSBvbiB0aGUgc2NyZWVuIHRvIGRpc3BsYXkKLSAqIGEgc2luZ2xlIGl0ZW0uIFlvdSBjYW4gYWRkIG11bHRpcGxlIGNoaWxkcmVuIHRvIGEgRnJhbWVMYXlvdXQsIGJ1dCBhbGwKLSAqIGNoaWxkcmVuIGFyZSBwZWdnZWQgdG8gdGhlIHRvcCBsZWZ0IG9mIHRoZSBzY3JlZW4uCisgKiBhIHNpbmdsZSBpdGVtLiBZb3UgY2FuIGFkZCBtdWx0aXBsZSBjaGlsZHJlbiB0byBhIEZyYW1lTGF5b3V0IGFuZCBjb250cm9sIHRoZWlyCisgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIEZyYW1lTGF5b3V0IHVzaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dC5MYXlvdXRQYXJhbXMjZ3Jhdml0eX0uCiAgKiBDaGlsZHJlbiBhcmUgZHJhd24gaW4gYSBzdGFjaywgd2l0aCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjaGlsZCBvbiB0b3AuCiAgKiBUaGUgc2l6ZSBvZiB0aGUgZnJhbWUgbGF5b3V0IGlzIHRoZSBzaXplIG9mIGl0cyBsYXJnZXN0IGNoaWxkIChwbHVzIHBhZGRpbmcpLCB2aXNpYmxlCiAgKiBvciBub3QgKGlmIHRoZSBGcmFtZUxheW91dCdzIHBhcmVudCBwZXJtaXRzKS4gVmlld3MgdGhhdCBhcmUgR09ORSBhcmUgdXNlZCBmb3Igc2l6aW5nCkBAIC00NDAsNiArNDQwLDggQEAKICAgICAgKiBQZXItY2hpbGQgbGF5b3V0IGluZm9ybWF0aW9uIGZvciBsYXlvdXRzIHRoYXQgc3VwcG9ydCBtYXJnaW5zLgogICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNGcmFtZUxheW91dF9MYXlvdXQgRnJhbWVMYXlvdXQgTGF5b3V0IEF0dHJpYnV0ZXN9CiAgICAgICogZm9yIGEgbGlzdCBvZiBhbGwgY2hpbGQgdmlldyBhdHRyaWJ1dGVzIHRoYXQgdGhpcyBjbGFzcyBzdXBwb3J0cy4KKyAgICAgKiAKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNGcmFtZUxheW91dF9MYXlvdXRfbGF5b3V0X2dyYXZpdHkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIE1hcmdpbkxheW91dFBhcmFtcyB7CiAgICAgICAgIC8qKgpAQCAtNDQ3LDYgKzQ0OSw4IEBACiAgICAgICAgICAqIGFyZSBhc3NvY2lhdGVkLgogICAgICAgICAgKgogICAgICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5HcmF2aXR5CisgICAgICAgICAqIAorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNGcmFtZUxheW91dF9MYXlvdXRfbGF5b3V0X2dyYXZpdHkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgZ3Jhdml0eSA9IC0xOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YQppbmRleCBjY2QzN2QzLi45Nzg5NjU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEKQEAgLTEyMTAsNyArMTIxMCw3IEBACiAKICAgICAgICAgLy8gV2UgdW5mb2N1cyB0aGUgb2xkIGNoaWxkIGRvd24gaGVyZSBzbyB0aGUgYWJvdmUgaGFzRm9jdXMgY2hlY2sKICAgICAgICAgLy8gcmV0dXJucyB0cnVlCi0gICAgICAgIGlmIChvbGRTZWxlY3RlZENoaWxkICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG9sZFNlbGVjdGVkQ2hpbGQgIT0gbnVsbCAmJiBvbGRTZWxlY3RlZENoaWxkICE9IGNoaWxkKSB7CiAKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdHMgZHJhd2FibGUgc3RhdGUgZG9lc24ndCBjb250YWluICdzZWxlY3RlZCcKICAgICAgICAgICAgIG9sZFNlbGVjdGVkQ2hpbGQuc2V0U2VsZWN0ZWQoZmFsc2UpOwpAQCAtMTI2Niw2ICsxMjY2LDcgQEAKICAgICAgICAgICovCiAgICAgICAgIGlmIChnYWluRm9jdXMgJiYgbVNlbGVjdGVkQ2hpbGQgIT0gbnVsbCkgewogICAgICAgICAgICAgbVNlbGVjdGVkQ2hpbGQucmVxdWVzdEZvY3VzKGRpcmVjdGlvbik7CisgICAgICAgICAgICBtU2VsZWN0ZWRDaGlsZC5zZXRTZWxlY3RlZCh0cnVlKTsKICAgICAgICAgfQogCiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQppbmRleCBhNzMwMGMyLi40NmM3ZDMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQpAQCAtMTcsMTUgKzE3LDE4IEBACiBwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlNvdW5kRWZmZWN0Q29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkdyaWRMYXlvdXRBbmltYXRpb25Db250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzLlJlbW90ZVZpZXc7CiAKIAogLyoqCkBAIC0zNSw2ICszOCw3IEBACiAgKiA8cD5TZWUgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3ZpZXdzL2hlbGxvLWdyaWR2aWV3Lmh0bWwiPkdyaWQKICAqIFZpZXcgdHV0b3JpYWw8L2E+LjwvcD4KICAqLworQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBHcmlkVmlldyBleHRlbmRzIEFic0xpc3RWaWV3IHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19TVFJFVENIID0gMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFVENIX1NQQUNJTkcgPSAxOwpAQCAtMTAzLDE5ICsxMDcsNDkgQEAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2V0IGhvdyB0aGUgdXNlciBtYXkgc2VsZWN0IGl0ZW1zIGZyb20gdGhlIGdyaWQuCisgICAgICoKKyAgICAgKiA8cD5HcmlkVmlldyBvbmx5IHN1cHBvcnRzIHtAbGluayBBYnNMaXN0VmlldyNDSE9JQ0VfTU9ERV9OT05FfSBhbmQKKyAgICAgKiB7QGxpbmsgQWJzTGlzdFZpZXcjQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUx9LiBBdHRlbXB0aW5nIHRvIHNldCBhbiB1bnN1cHBvcnRlZCBjaG9pY2UKKyAgICAgKiBtb2RlIHdpbGwgdGhyb3cgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q2hvaWNlTW9kZShpbnQgY2hvaWNlTW9kZSkgeworICAgICAgICBzd2l0Y2ggKGNob2ljZU1vZGUpIHsKKyAgICAgICAgY2FzZSBDSE9JQ0VfTU9ERV9OT05FOgorICAgICAgICBjYXNlIENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMOgorICAgICAgICAgICAgc3VwZXIuc2V0Q2hvaWNlTW9kZShjaG9pY2VNb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIGNob2ljZSBtb2RlICIgKyBjaG9pY2VNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0QWRhcHRlciBnZXRBZGFwdGVyKCkgewogICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFic0xpc3RWaWV3IHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlCisgICAgICogdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHN1cGVyLnNldFJlbW90ZVZpZXdzQWRhcHRlcihpbnRlbnQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgYmVoaW5kIHRoaXMgR3JpZFZpZXcuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYWRhcHRlciB0aGUgYWRhcHRlciBwcm92aWRpbmcgdGhlIGdyaWQncyBkYXRhCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChudWxsICE9IG1BZGFwdGVyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogCkBAIC0xMjUsNyArMTU5LDEwIEBACiAKICAgICAgICAgbU9sZFNlbGVjdGVkUG9zaXRpb24gPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICBtT2xkU2VsZWN0ZWRSb3dJZCA9IElOVkFMSURfUk9XX0lEOwotICAgICAgICAKKworICAgICAgICAvLyBBYnNMaXN0VmlldyNzZXRBZGFwdGVyIHdpbGwgdXBkYXRlIGNob2ljZSBtb2RlIHN0YXRlcy4KKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKwogICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbU9sZEl0ZW1Db3VudCA9IG1JdGVtQ291bnQ7CiAgICAgICAgICAgICBtSXRlbUNvdW50ID0gbUFkYXB0ZXIuZ2V0Q291bnQoKTsKQEAgLTc0Miw2ICs3NzksMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gU2Nyb2xsIHRvIHRoaXMgYWRhcHRlciBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBzdXBlci5zbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uIG9mZnNldC4gVGhlIHZpZXcgd2lsbAorICAgICAqIHNjcm9sbCBzdWNoIHRoYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgYW1vdW50IHRvIG9mZnNldCBmcm9tIHRoZSBhZGFwdGVyIHBvc2l0aW9uIHRvIHNjcm9sbCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgb2Zmc2V0KSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbEJ5T2Zmc2V0KG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIGdyaWQgYmFzZWQgb24gcG9zaXRpb25pbmcgdGhlIG5ldyBzZWxlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIG9sZAogICAgICAqIHNlbGVjdGlvbi4gVGhlIG5ldyBzZWxlY3Rpb24gd2lsbCBiZSBwbGFjZWQgYXQsIGFib3ZlLCBvciBiZWxvdyB0aGUKICAgICAgKiBsb2NhdGlvbiBvZiB0aGUgbmV3IHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gaG93IHRoZSBzZWxlY3Rpb24gaXMgbW92aW5nLgpAQCAtMTI4MSw2ICsxMzM4LDE1IEBACiAgICAgICAgICAgICBjaGlsZC5zZXRQcmVzc2VkKGlzUHJlc3NlZCk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2hlY2thYmxlKSB7CisgICAgICAgICAgICAgICAgKChDaGVja2FibGUpIGNoaWxkKS5zZXRDaGVja2VkKG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29udGV4dCgpLmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgPj0gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkhPTkVZQ09NQikgeworICAgICAgICAgICAgICAgIGNoaWxkLnNldEFjdGl2YXRlZChtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpZiAobmVlZFRvTWVhc3VyZSkgewogICAgICAgICAgICAgaW50IGNoaWxkSGVpZ2h0U3BlYyA9IFZpZXdHcm91cC5nZXRDaGlsZE1lYXN1cmVTcGVjKAogICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoMCwgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpLCAwLCBwLmhlaWdodCk7CkBAIC0xNDkxLDkgKzE1NTcsOSBAQAogICAgICAgICBpbnQgbmV4dFBhZ2UgPSAtMTsKIAogICAgICAgICBpZiAoZGlyZWN0aW9uID09IEZPQ1VTX1VQKSB7Ci0gICAgICAgICAgICBuZXh0UGFnZSA9IE1hdGgubWF4KDAsIG1TZWxlY3RlZFBvc2l0aW9uIC0gZ2V0Q2hpbGRDb3VudCgpIC0gMSk7CisgICAgICAgICAgICBuZXh0UGFnZSA9IE1hdGgubWF4KDAsIG1TZWxlY3RlZFBvc2l0aW9uIC0gZ2V0Q2hpbGRDb3VudCgpKTsKICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRk9DVVNfRE9XTikgewotICAgICAgICAgICAgbmV4dFBhZ2UgPSBNYXRoLm1pbihtSXRlbUNvdW50IC0gMSwgbVNlbGVjdGVkUG9zaXRpb24gKyBnZXRDaGlsZENvdW50KCkgLSAxKTsKKyAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5taW4obUl0ZW1Db3VudCAtIDEsIG1TZWxlY3RlZFBvc2l0aW9uICsgZ2V0Q2hpbGRDb3VudCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuZXh0UGFnZSA+PSAwKSB7CkBAIC0xNzc3LDYgKzE4NDMsMTkgQEAKICAgICAgICAgICAgIHJlcXVlc3RMYXlvdXRJZk5lY2Vzc2FyeSgpOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuIAorICAgICAqIFJldHVybnMge0BsaW5rICNBVVRPX0ZJVH0gaWYgdGhlIEdyaWQgaGFzIG5ldmVyIGJlZW4gbGFpZCBvdXQuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNHcmlkVmlld19udW1Db2x1bW5zCisgICAgICogCisgICAgICogQHNlZSAjc2V0TnVtQ29sdW1ucyhpbnQpCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHVibGljIGludCBnZXROdW1Db2x1bW5zKCkgeyAgCisgICAgICAgIHJldHVybiBtTnVtQ29sdW1uczsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBNYWtlIHN1cmUgdmlld3MgYXJlIHRvdWNoaW5nIHRoZSB0b3Agb3IgYm90dG9tIGVkZ2UsIGFzIGFwcHJvcHJpYXRlIGZvcgpAQCAtMTg3NiwxMiArMTk1NSw3IEBACiAgICAgICAgIC8vIFRPRE86IEFjY291bnQgZm9yIHZlcnRpY2FsIHNwYWNpbmcgdG9vCiAgICAgICAgIGZpbmFsIGludCBudW1Db2x1bW5zID0gbU51bUNvbHVtbnM7CiAgICAgICAgIGZpbmFsIGludCByb3dDb3VudCA9IChtSXRlbUNvdW50ICsgbnVtQ29sdW1ucyAtIDEpIC8gbnVtQ29sdW1uczsKLSAgICAgICAgaW50IHJlc3VsdCA9IE1hdGgubWF4KHJvd0NvdW50ICogMTAwLCAwKTsKLSAgICAgICAgaWYgKG1TY3JvbGxZICE9IDApIHsKLSAgICAgICAgICAgIC8vIENvbXBlbnNhdGUgZm9yIG92ZXJzY3JvbGwKLSAgICAgICAgICAgIHJlc3VsdCArPSBNYXRoLmFicygoaW50KSAoKGZsb2F0KSBtU2Nyb2xsWSAvIGdldEhlaWdodCgpICogcm93Q291bnQgKiAxMDApKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gTWF0aC5tYXgocm93Q291bnQgKiAxMDAsIDApOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0hvcml6b250YWxTY3JvbGxWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSG9yaXpvbnRhbFNjcm9sbFZpZXcuamF2YQppbmRleCBkMzhlZWYzLi5lMzBkNGM4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSG9yaXpvbnRhbFNjcm9sbFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSG9yaXpvbnRhbFNjcm9sbFZpZXcuamF2YQpAQCAtMTYsMjQgKzE2LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKQEAgLTU4LDYgKzUzLDggQEAKICAqIHdpdGhpbiBhIGxhcmdlciBjb250YWluZXIuCiAgKgogICogPHA+SG9yaXpvbnRhbFNjcm9sbFZpZXcgb25seSBzdXBwb3J0cyBob3Jpem9udGFsIHNjcm9sbGluZy4KKyAqIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjSG9yaXpvbnRhbFNjcm9sbFZpZXdfZmlsbFZpZXdwb3J0IAogICovCiBwdWJsaWMgY2xhc3MgSG9yaXpvbnRhbFNjcm9sbFZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFOSU1BVEVEX1NDUk9MTF9HQVAgPSBTY3JvbGxWaWV3LkFOSU1BVEVEX1NDUk9MTF9HQVA7CkBAIC02OCw5ICs2NSw3IEBACiAgICAgcHJpdmF0ZSBsb25nIG1MYXN0U2Nyb2xsOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgcHJpdmF0ZSBPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93TGVmdDsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1JpZ2h0OworICAgIHByaXZhdGUgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCiAgICAgLyoqCiAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBtb3ZpbmcgZm9jdXMgb3Vyc2VsdmVzLiBUaGlzIGlzIHNvIHRoZQpAQCAtMTI0LDkgKzExOSw2IEBACiAgICAgcHJpdmF0ZSBpbnQgbU1pbmltdW1WZWxvY2l0eTsKICAgICBwcml2YXRlIGludCBtTWF4aW11bVZlbG9jaXR5OwogICAgIAotICAgIHByaXZhdGUgaW50IG1PdmVyc2Nyb2xsRGlzdGFuY2U7Ci0gICAgcHJpdmF0ZSBpbnQgbU92ZXJmbGluZ0Rpc3RhbmNlOwotCiAgICAgLyoqCiAgICAgICogSUQgb2YgdGhlIGFjdGl2ZSBwb2ludGVyLiBUaGlzIGlzIHVzZWQgdG8gcmV0YWluIGNvbnNpc3RlbmN5IGR1cmluZwogICAgICAqIGRyYWdzL2ZsaW5ncyBpZiBtdWx0aXBsZSBwb2ludGVycyBhcmUgdXNlZC4KQEAgLTE5OSw3ICsxOTEsNyBAQAogCiAKICAgICBwcml2YXRlIHZvaWQgaW5pdFNjcm9sbFZpZXcoKSB7Ci0gICAgICAgIG1TY3JvbGxlciA9IG5ldyBPdmVyU2Nyb2xsZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGdldENvbnRleHQoKSk7CiAgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShGT0NVU19BRlRFUl9ERVNDRU5EQU5UUyk7CiAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKQEAgLTIwNyw4ICsxOTksNiBAQAogICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgbU1pbmltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWluaW11bUZsaW5nVmVsb2NpdHkoKTsKICAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI2MCwyMCArMjUwLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBTY3JvbGxWaWV3J3MgY29udGVudCBpcyBzdHJldGNoZWQgdG8gZmlsbCB0aGUgdmlld3BvcnQuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBIb3Jpem9udGFsU2Nyb2xsVmlldydzIGNvbnRlbnQgaXMgc3RyZXRjaGVkIHRvCisgICAgICogZmlsbCB0aGUgdmlld3BvcnQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRlbnQgZmlsbHMgdGhlIHZpZXdwb3J0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNIb3Jpem9udGFsU2Nyb2xsVmlld19maWxsVmlld3BvcnQKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGxWaWV3cG9ydCgpIHsKICAgICAgICAgcmV0dXJuIG1GaWxsVmlld3BvcnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoaXMgU2Nyb2xsVmlldyB3aGV0aGVyIGl0IHNob3VsZCBzdHJldGNoIGl0cyBjb250ZW50IHdpZHRoIHRvIGZpbGwKLSAgICAgKiB0aGUgdmlld3BvcnQgb3Igbm90LgorICAgICAqIEluZGljYXRlcyB0aGlzIEhvcml6b250YWxTY3JvbGxWaWV3IHdoZXRoZXIgaXQgc2hvdWxkIHN0cmV0Y2ggaXRzIGNvbnRlbnQgd2lkdGgKKyAgICAgKiB0byBmaWxsIHRoZSB2aWV3cG9ydCBvciBub3QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsbFZpZXdwb3J0IFRydWUgdG8gc3RyZXRjaCB0aGUgY29udGVudCdzIHdpZHRoIHRvIHRoZSB2aWV3cG9ydCdzCiAgICAgICogICAgICAgIGJvdW5kYXJpZXMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNIb3Jpem9udGFsU2Nyb2xsVmlld19maWxsVmlld3BvcnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGaWxsVmlld3BvcnQoYm9vbGVhbiBmaWxsVmlld3BvcnQpIHsKICAgICAgICAgaWYgKGZpbGxWaWV3cG9ydCAhPSBtRmlsbFZpZXdwb3J0KSB7CkBAIC00NjgsOSArNDYzLDYgQEAKICAgICAgICAgICAgICAgICAvKiBSZWxlYXNlIHRoZSBkcmFnICovCiAgICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ0JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCBnZXRTY3JvbGxSYW5nZSgpLCAwLCAwKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKICAgICAgICAgICAgICAgICBvblNlY29uZGFyeVBvaW50ZXJVcChldik7CkBAIC01MDMsNyArNDk1LDkgQEAKICAgICAgICAgc3dpdGNoIChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgewogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewogICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHggPSBldi5nZXRYKCk7Ci0gICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShtSXNCZWluZ0RyYWdnZWQgPSBpbkNoaWxkKChpbnQpIHgsIChpbnQpIGV2LmdldFkoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIElmIGJlaW5nIGZsaW5nZWQgYW5kIHVzZXIgdG91Y2hlcywgc3RvcCB0aGUgZmxpbmcuIGlzRmluaXNoZWQKQEAgLTUyNiwzMiArNTIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlbHRhWCA9IChpbnQpIChtTGFzdE1vdGlvblggLSB4KTsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RNb3Rpb25YID0geDsKIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmFuZ2UgPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlclNjcm9sbEJ5KGRlbHRhWCwgMCwgbVNjcm9sbFgsIDAsIHJhbmdlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIDAsIHRydWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBCcmVhayBvdXIgdmVsb2NpdHkgaWYgd2UgaGl0IGEgc2Nyb2xsIGJhcnJpZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxNb2RlID0gZ2V0T3ZlclNjcm9sbE1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJfU0NST0xMX0FMV0FZUyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSX1NDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgcmFuZ2UgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHB1bGxlZFRvWCA9IG9sZFggKyBkZWx0YVg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHVsbGVkVG9YIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25QdWxsKChmbG9hdCkgZGVsdGFYIC8gZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dSaWdodC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdWxsZWRUb1ggPiByYW5nZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUHVsbCgoZmxvYXQpIGRlbHRhWCAvIGdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93TGVmdC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQnkoZGVsdGFYLCAwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKQEAgLTU2MCwxNSArNTI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsVmVsb2NpdHkgPSAoaW50KSB2ZWxvY2l0eVRyYWNrZXIuZ2V0WFZlbG9jaXR5KG1BY3RpdmVQb2ludGVySWQpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nQmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIHJpZ2h0LCAwLCAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCAmJiBNYXRoLmFicyhpbml0aWFsVmVsb2NpdHkpID4gbU1pbmltdW1WZWxvY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxpbmcoLWluaXRpYWxWZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CkBAIC01NzgsMjcgKzU0MCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93TGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6CiAgICAgICAgICAgICAgICAgaWYgKG1Jc0JlaW5nRHJhZ2dlZCAmJiBnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nQmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKICAgICAgICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKQEAgLTYyNSwyOCArNTc2LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PdmVyU2Nyb2xsZWQoaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCwgYm9vbGVhbiBjbGFtcGVkWSkgewotICAgICAgICAvLyBUcmVhdCBhbmltYXRpbmcgc2Nyb2xscyBkaWZmZXJlbnRseTsgc2VlICNjb21wdXRlU2Nyb2xsKCkgZm9yIHdoeS4KLSAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsWCA9IHNjcm9sbFg7Ci0gICAgICAgICAgICBtU2Nyb2xsWSA9IHNjcm9sbFk7Ci0gICAgICAgICAgICBpZiAoY2xhbXBlZFgpIHsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nQmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2Nyb2xsVG8oc2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQogICAgIHByaXZhdGUgaW50IGdldFNjcm9sbFJhbmdlKCkgewogICAgICAgICBpbnQgc2Nyb2xsUmFuZ2UgPSAwOwogICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewogICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7CiAgICAgICAgICAgICBzY3JvbGxSYW5nZSA9IE1hdGgubWF4KDAsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldFdpZHRoKCkgLSAoZ2V0V2lkdGgoKSAtIG1QYWRkaW5nTGVmdCAtIG1QYWRkaW5nUmlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0V2lkdGgoKSAtIGdldFdpZHRoKCkgLSBtUGFkZGluZ0xlZnQgLSBtUGFkZGluZ1JpZ2h0KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7CiAgICAgfQpAQCAtMTAyMywxNiArOTU4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBjb250ZW50V2lkdGg7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IGdldENoaWxkQXQoMCkuZ2V0UmlnaHQoKTsKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxSaWdodCA9IE1hdGgubWF4KDAsIHNjcm9sbFJhbmdlIC0gY29udGVudFdpZHRoKTsKLSAgICAgICAgaWYgKHNjcm9sbFggPCAwKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSAtPSBzY3JvbGxYOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFggPiBvdmVyc2Nyb2xsUmlnaHQpIHsKLSAgICAgICAgICAgIHNjcm9sbFJhbmdlICs9IHNjcm9sbFggLSBvdmVyc2Nyb2xsUmlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7CisgICAgICAgIHJldHVybiBnZXRDaGlsZEF0KDApLmdldFJpZ2h0KCk7CiAgICAgfQogICAgIAogICAgIEBPdmVycmlkZQpAQCAtMTA5MywyMCArMTAxOSwxNCBAQAogICAgICAgICAgICAgaW50IHggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKICAgICAgICAgICAgIGludCB5ID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7CiAKLSAgICAgICAgICAgIGlmIChvbGRYICE9IHggfHwgb2xkWSAhPSB5KSB7Ci0gICAgICAgICAgICAgICAgb3ZlclNjcm9sbEJ5KHggLSBvbGRYLCB5IC0gb2xkWSwgb2xkWCwgb2xkWSwgZ2V0U2Nyb2xsUmFuZ2UoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSwgMCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBnZXRPdmVyU2Nyb2xsTW9kZSgpOwotICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSX1NDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSX1NDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgcmFuZ2UgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgJiYgb2xkWCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA+IHJhbmdlICYmIG9sZFggPD0gcmFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7CisgICAgICAgICAgICAgICAgeCA9IGNsYW1wKHgsIGdldFdpZHRoKCkgLSBtUGFkZGluZ1JpZ2h0IC0gbVBhZGRpbmdMZWZ0LCBjaGlsZC5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICB5ID0gY2xhbXAoeSwgZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wLCBjaGlsZC5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKHggIT0gb2xkWCB8fCB5ICE9IG9sZFkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFggPSB4OworICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IHk7CisgICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZCh4LCB5LCBvbGRYLCBvbGRZKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKCk7CkBAIC0xMzQzLDcgKzEyNjMsNyBAQAogICAgICAgICAgICAgaW50IHJpZ2h0ID0gZ2V0Q2hpbGRBdCgwKS5nZXRXaWR0aCgpOwogICAgIAogICAgICAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgdmVsb2NpdHlYLCAwLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgcmlnaHQgLSB3aWR0aCksIDAsIDAsIHdpZHRoLzIsIDApOworICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLCByaWdodCAtIHdpZHRoKSwgMCwgMCk7CiAgICAgCiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG1vdmluZ1JpZ2h0ID0gdmVsb2NpdHlYID4gMDsKICAgICAKQEAgLTEzODEsNTYgKzEzMDEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlclNjcm9sbE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUl9TQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dMZWZ0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGVkZ2UgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2VkZ2UpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGdsb3cgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2dsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0ID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZXRPdmVyU2Nyb2xsTW9kZShtb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIuZHJhdyhjYW52YXMpOwotICAgICAgICBpZiAobUVkZ2VHbG93TGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dMZWZ0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMjcwKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1oZWlnaHQgKiAxLjVmLCBNYXRoLm1pbigwLCBzY3JvbGxYKSk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5zZXRTaXplKGdldEhlaWdodCgpICogMiwgZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1JpZ2h0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSg5MCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtaGVpZ2h0IC8gMiwgLShNYXRoLm1heChnZXRTY3JvbGxSYW5nZSgpLCBzY3JvbGxYKSArIHdpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQuc2V0U2l6ZShoZWlnaHQgKiAyLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1JpZ2h0LmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgY2xhbXAoaW50IG4sIGludCBteSwgaW50IGNoaWxkKSB7CiAgICAgICAgIGlmIChteSA+PSBjaGlsZCB8fCBuIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSW1hZ2VCdXR0b24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCmluZGV4IDEyYTY4ZGIuLmQ2ODBmYWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQnV0dG9ufSwgd2l0aCB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQKICAqIHRoYXQgY2hhbmdlcyBjb2xvciBkdXJpbmcgZGlmZmVyZW50IGJ1dHRvbiBzdGF0ZXMuIFRoZSBpbWFnZSBvbiB0aGUgc3VyZmFjZQogICogb2YgdGhlIGJ1dHRvbiBpcyBkZWZpbmVkIGVpdGhlciBieSB0aGUge0Bjb2RlIGFuZHJvaWQ6c3JjfSBhdHRyaWJ1dGUgaW4gdGhlCi0gKiB7QGNvZGUgJmx0O0ltYWdlQnV0dG9uJmd0O30gWE1MIGVsZW1lbnQgb3IgYnkgdGhlIAorICoge0Bjb2RlIDxJbWFnZUJ1dHRvbj59IFhNTCBlbGVtZW50IG9yIGJ5IHRoZQogICoge0BsaW5rICNzZXRJbWFnZVJlc291cmNlKGludCl9IG1ldGhvZC48L3A+CiAgKiAKICAqIDxwPlRvIHJlbW92ZSB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQgaW1hZ2UsIGRlZmluZSB5b3VyIG93biAKQEAgLTU3LDcgKzU3LDcgQEAKICAqIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbWFnZXMKICAqIGRlZmluZWQgaW4gdGhlIFhNTC48L3A+CiAgKgotICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgJmx0O2l0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQorICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgPGl0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQogICogZXZhbHVhdGVkIGluIG9yZGVyLiBUaGlzIGlzIHdoeSB0aGUgIm5vcm1hbCIgYnV0dG9uIGltYWdlIGNvbWVzIGxhc3QsIGJlY2F1c2UKICAqIGl0IHdpbGwgb25seSBiZSBhcHBsaWVkIGFmdGVyIHtAY29kZSBhbmRyb2lkOnN0YXRlX3ByZXNzZWR9IGFuZCB7QGNvZGUKICAqIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZH0gaGF2ZSBib3RoIGV2YWx1YXRlZCBmYWxzZS48L3A+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKaW5kZXggZmFmMDgyZC4uMWU1NDg5YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQpAQCAtNDMsNiArNDMsMTMgQEAKICAqIDxwPgogICogQWxzbyBzZWUge0BsaW5rIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LkxheW91dFBhcmFtc30KICAqIGZvciBsYXlvdXQgYXR0cmlidXRlcyA8L3A+CisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9ncmF2aXR5CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfbWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9vcmllbnRhdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X3dlaWdodFN1bQogICovCiBAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIExpbmVhckxheW91dCBleHRlbmRzIFZpZXdHcm91cCB7CkBAIC0xMTcsNyArMTI0LDExIEBACiAgICAgfQogCiAgICAgcHVibGljIExpbmVhckxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGluZWFyTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPSAKICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0KTsKQEAgLTE0Miw4ICsxNTMsNyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA9CiAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgsIC0xKTsKIAotICAgICAgICAvLyBUT0RPOiBCZXR0ZXIgbmFtZSwgYWRkIEphdmEgQVBJcywgbWFrZSBpdCBwdWJsaWMKLSAgICAgICAgbVVzZUxhcmdlc3RDaGlsZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXRfdXNlTGFyZ2VzdENoaWxkLCBmYWxzZSk7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X21lYXN1cmVXaXRoTGFyZ2VzdENoaWxkLCBmYWxzZSk7CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQpAQCAtMTcyLDYgKzE4MiwzMyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkID0gYmFzZWxpbmVBbGlnbmVkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFdoZW4gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZworICAgICAqIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCisgICAgICogbWVhc3VyZWQgbm9ybWFsbHkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIHRvIG1lYXN1cmUgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB1c2luZyB0aGUgbWluaW11bQorICAgICAqICAgICAgICAgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVVzZUxhcmdlc3RDaGlsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHNldCB0byB0cnVlLCBhbGwgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB3aWxsIGJlIGNvbnNpZGVyZWQgaGF2aW5nCisgICAgICogdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZC4gSWYgZmFsc2UsIGFsbCBjaGlsZHJlbiBhcmUKKyAgICAgKiBtZWFzdXJlZCBub3JtYWxseS4KKyAgICAgKiAKKyAgICAgKiBEaXNhYmxlZCBieSBkZWZhdWx0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgdG8gbWVhc3VyZSBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHVzaW5nIHRoZQorICAgICAqICAgICAgICBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBlbmFibGVkOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKSB7CiAgICAgICAgIGlmIChtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA8IDApIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIxNjEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCkBAIC0wLDAgKzEsMTIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXI7CisKKy8qKgorICogQSBMaXN0UG9wdXBXaW5kb3cgYW5jaG9ycyBpdHNlbGYgdG8gYSBob3N0IHZpZXcgYW5kIGRpc3BsYXlzIGEKKyAqIGxpc3Qgb2YgY2hvaWNlcy4KKyAqIAorICogPHA+TGlzdFBvcHVwV2luZG93IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHRyaWNreSBiZWhhdmlvcnMgc3Vycm91bmRpbmcKKyAqIHBvc2l0aW9uaW5nLCBzY3JvbGxpbmcgcGFyZW50cyB0byBmaXQgdGhlIGRyb3Bkb3duLCBpbnRlcmFjdGluZworICogc2FuZWx5IHdpdGggdGhlIElNRSBpZiBwcmVzZW50LCBhbmQgb3RoZXJzLgorICogCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3CisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXIKKyAqLworcHVibGljIGNsYXNzIExpc3RQb3B1cFdpbmRvdyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMaXN0UG9wdXBXaW5kb3ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKKyAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAorICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBEcm9wRG93bkxpc3RWaWV3IG1Ecm9wRG93bkxpc3Q7CisKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggPSBmYWxzZTsKKworICAgIHByaXZhdGUgVmlldyBtUHJvbXB0VmlldzsKKyAgICBwcml2YXRlIGludCBtUHJvbXB0UG9zaXRpb24gPSBQT1NJVElPTl9QUk9NUFRfQUJPVkU7CisKKyAgICBwcml2YXRlIERhdGFTZXRPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICBwcml2YXRlIFZpZXcgbURyb3BEb3duQW5jaG9yVmlldzsKKworICAgIHByaXZhdGUgRHJhd2FibGUgbURyb3BEb3duTGlzdEhpZ2hsaWdodDsKKworICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtSXRlbUNsaWNrTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgZmluYWwgUmVzaXplUG9wdXBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgbVRvdWNoSW50ZXJjZXB0b3IgPSBuZXcgUG9wdXBUb3VjaEludGVyY2VwdG9yKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFNjcm9sbExpc3RlbmVyIG1TY3JvbGxMaXN0ZW5lciA9IG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbU1vZGFsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3ZpZGVkIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIgYWJvdmUgbGlzdCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFByb21wdFBvc2l0aW9uKGludCkKKyAgICAgKiBAc2VlICNnZXRQcm9tcHRQb3NpdGlvbigpCisgICAgICogQHNlZSAjc2V0UHJvbXB0VmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX1BST01QVF9BQk9WRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdmlkZWQgcHJvbXB0IHZpZXcgc2hvdWxkIGFwcGVhciBiZWxvdyBsaXN0IGNvbnRlbnQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0UHJvbXB0UG9zaXRpb24oaW50KQorICAgICAqIEBzZWUgI2dldFByb21wdFBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRWaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05fUFJPTVBUX0JFTE9XID0gMTsKKworICAgIC8qKgorICAgICAqIEFsaWFzIGZvciB7QGxpbmsgVmlld0dyb3VwLkxheW91dFBhcmFtcyNNQVRDSF9QQVJFTlR9LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIHdpZHRoLCB0aGUgcG9wdXAgd2lsbCBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvciB2aWV3LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIGhlaWdodCwgdGhlIHBvcHVwIHdpbGwgZmlsbCBhdmFpbGFibGUgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfUEFSRU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIHtAbGluayBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zI1dSQVBfQ09OVEVOVH0uCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgd2lkdGgsIHRoZSBwb3B1cCB3aWxsIHVzZSB0aGUgd2lkdGggb2YgaXRzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9DT05URU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZQorICAgICAqIGlucHV0IG1ldGhvZCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGZvY3VzYWJpbGl0eSBvZiB0aGUgcG9wdXAuICBUaGF0IGlzCisgICAgICogaWYgaXQgaXMgZm9jdXNhYmxlIHRoYW4gaXQgbmVlZHMgdG8gd29yayB3aXRoIHRoZSBpbnB1dCBtZXRob2QsIGVsc2UKKyAgICAgKiBpdCBkb2Vzbid0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhpcyBwb3B1cCBhbHdheXMgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGFsc28gb3BlcmF0ZQorICAgICAqIHRoZSBpbnB1dCBtZXRob2Qgd2hpbGUgaXQgaXMgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX05FRURFRCA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoaXMgcG9wdXAgbmV2ZXIgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHRvIHVzZSBhcyBtdWNoIHNwYWNlIG9uIHRoZQorICAgICAqIHNjcmVlbiBhcyBuZWVkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGNvdmVycyB0aGUgaW5wdXQgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9OT1RfTkVFREVEID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5saXN0UG9wdXBXaW5kb3dTdHlsZSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqIEBwYXJhbSBkZWZTdHlsZUF0dHIgRGVmYXVsdCBzdHlsZSBhdHRyaWJ1dGUgdG8gdXNlIGZvciBwb3B1cCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBmcm9tIGluZmxhdGluZyBwYXJlbnQgdmlld3MgdXNlZCB0byBzdHlsZSB0aGUgcG9wdXAuCisgICAgICogQHBhcmFtIGRlZlN0eWxlQXR0ciBTdHlsZSBhdHRyaWJ1dGUgdG8gcmVhZCBmb3IgZGVmYXVsdCBzdHlsaW5nIG9mIHBvcHVwIGNvbnRlbnQuCisgICAgICogQHBhcmFtIGRlZlN0eWxlUmVzIFN0eWxlIHJlc291cmNlIElEIHRvIHVzZSBmb3IgZGVmYXVsdCBzdHlsaW5nIG9mIHBvcHVwIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIExpc3RQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVBvcHVwID0gbmV3IFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhZGFwdGVyIHRoYXQgcHJvdmlkZXMgdGhlIGRhdGEgYW5kIHRoZSB2aWV3cyB0byByZXByZXNlbnQgdGhlIGRhdGEKKyAgICAgKiBpbiB0aGlzIHBvcHVwIHdpbmRvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBhZGFwdGVyIHRvIHVzZSB0byBjcmVhdGUgdGhpcyB3aW5kb3cncyBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAobU9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PYnNlcnZlciA9IG5ldyBQb3B1cERhdGFTZXRPYnNlcnZlcigpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobU9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtRHJvcERvd25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hlcmUgdGhlIG9wdGlvbmFsIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIuIFRoZSBkZWZhdWx0IGlzCisgICAgICoge0BsaW5rICNQT1NJVElPTl9QUk9NUFRfQUJPVkV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBIHBvc2l0aW9uIGNvbnN0YW50IGRlY2xhcmluZyB3aGVyZSB0aGUgcHJvbXB0IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisgICAgICogCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0JFTE9XCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0UG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1Qcm9tcHRQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hlcmUgdGhlIG9wdGlvbmFsIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIuCisgICAgICogCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0JFTE9XCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcm9tcHRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9tcHRQb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgYmUgbW9kYWwgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiBhIHBvcHVwIHdpbmRvdyBpcyBtb2RhbCwgaXQgd2lsbCByZWNlaXZlIGFsbCB0b3VjaCBhbmQga2V5IGlucHV0LgorICAgICAqIElmIHRoZSB1c2VyIHRvdWNoZXMgb3V0c2lkZSB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhcmVhIHRoZSBwb3B1cCB3aW5kb3cKKyAgICAgKiB3aWxsIGJlIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbW9kYWwge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCB3aW5kb3cgc2hvdWxkIGJlIG1vZGFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RhbChib29sZWFuIG1vZGFsKSB7CisgICAgICAgIG1Nb2RhbCA9IHRydWU7CisgICAgICAgIG1Qb3B1cC5zZXRGb2N1c2FibGUobW9kYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcG9wdXAgd2luZG93IHdpbGwgYmUgbW9kYWwgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgd2luZG93IHdpbGwgYmUgbW9kYWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTW9kYWwoKSB7CisgICAgICAgIHJldHVybiBtTW9kYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2VzIG91dHNpZGUgdG91Y2hlcyB0byBiZSBpZ25vcmVkLiBOb3JtYWxseSBpZiB7QGxpbmsgI2lzRHJvcERvd25BbHdheXNWaXNpYmxlKCl9IGlzCisgICAgICogZmFsc2UsIHdlIGFsbG93IG91dHNpZGUgdG91Y2ggdG8gZGlzbWlzcyB0aGUgZHJvcGRvd24uIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZW4gd2UKKyAgICAgKiBpZ25vcmUgb3V0c2lkZSB0b3VjaCBldmVuIHdoZW4gdGhlIGRyb3AgZG93biBpcyBub3Qgc2V0IHRvIGFsd2F5cyB2aXNpYmxlLgorICAgICAqIAorICAgICAqIEBoaWRlIFVzZWQgb25seSBieSBBdXRvQ29tcGxldGVUZXh0VmlldyB0byBoYW5kbGUgc29tZSBpbnRlcm5hbCBzcGVjaWFsIGNhc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGJvb2xlYW4gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpIHsKKyAgICAgICAgbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBkcm9wLWRvd24gc2hvdWxkIHJlbWFpbiB2aXNpYmxlIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4KKyAgICAgKgorICAgICAqIFRoZSBkcm9wLWRvd24gd2lsbCBvY2N1cHkgdGhlIGVudGlyZSBzY3JlZW4gYmVsb3cge0BsaW5rICNnZXRBbmNob3JWaWV3fSByZWdhcmRsZXNzCisgICAgICogb2YgdGhlIHNpemUgb3IgY29udGVudCBvZiB0aGUgbGlzdC4gIHtAbGluayAjZ2V0QmFja2dyb3VuZCgpfSB3aWxsIGZpbGwgYW55IHNwYWNlCisgICAgICogdGhhdCBpcyBub3QgdXNlZCBieSB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcm9wRG93bkFsd2F5c1Zpc2libGUgV2hldGhlciB0byBrZWVwIHRoZSBkcm9wLWRvd24gdmlzaWJsZS4KKyAgICAgKgorICAgICAqIEBoaWRlIE9ubHkgdXNlZCBieSBBdXRvQ29tcGxldGVUZXh0VmlldyB1bmRlciBzcGVjaWFsIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIG1Ecm9wRG93bkFsd2F5c1Zpc2libGUgPSBkcm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBkcm9wLWRvd24gaXMgdmlzaWJsZSB1bmRlciBzcGVjaWFsIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNvZnQgaW5wdXQgYXJlYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBkZXNpcmVkIG1vZGUsIHNlZQorICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI3NvZnRJbnB1dE1vZGV9CisgICAgICogICAgICAgIGZvciB0aGUgZnVsbCBsaXN0CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlCisgICAgICogQHNlZSAjZ2V0U29mdElucHV0TW9kZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U29mdElucHV0TW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0U29mdElucHV0TW9kZShtb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGluIHtAbGluayAjc2V0U29mdElucHV0TW9kZShpbnQpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFNvZnRJbnB1dE1vZGUoaW50KQorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI3NvZnRJbnB1dE1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNvZnRJbnB1dE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0U29mdElucHV0TW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byB1c2UgYXMgdGhlIGxpc3QgaXRlbSBzZWxlY3Rvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgTGlzdCBzZWxlY3RvciBkcmF3YWJsZSB0byB1c2UgaW4gdGhlIHBvcHVwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RTZWxlY3RvcihEcmF3YWJsZSBzZWxlY3RvcikgeworICAgICAgICBtRHJvcERvd25MaXN0SGlnaGxpZ2h0ID0gc2VsZWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBkcmF3YWJsZSBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRHJhd2FibGUgZ2V0QmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGRyYXdhYmxlIHRvIGJlIHRoZSBiYWNrZ3JvdW5kIGZvciB0aGUgcG9wdXAgd2luZG93LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkIEEgZHJhd2FibGUgdG8gc2V0IGFzIHRoZSBiYWNrZ3JvdW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKSB7CisgICAgICAgIG1Qb3B1cC5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFuIGFuaW1hdGlvbiBzdHlsZSB0byB1c2Ugd2hlbiB0aGUgcG9wdXAgd2luZG93IGlzIHNob3duIG9yIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5pbWF0aW9uU3R5bGUgQW5pbWF0aW9uIHN0eWxlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRpb25TdHlsZShpbnQgYW5pbWF0aW9uU3R5bGUpIHsKKyAgICAgICAgbVBvcHVwLnNldEFuaW1hdGlvblN0eWxlKGFuaW1hdGlvblN0eWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbmltYXRpb24gc3R5bGUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgcG9wdXAgd2luZG93IGlzCisgICAgICogc2hvd24gb3IgZGlzbWlzc2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQW5pbWF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QW5pbWF0aW9uU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0QW5pbWF0aW9uU3R5bGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2aWV3IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFuY2hvciB0aGlzIHBvcHVwLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHBvcHVwJ3MgYW5jaG9yIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgVmlldyBnZXRBbmNob3JWaWV3KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGFuY2hvciB2aWV3LiBUaGlzIHBvcHVwIHdpbGwgYWx3YXlzIGJlIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8KKyAgICAgKiB0aGUgYW5jaG9yIHZpZXcgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5jaG9yIFRoZSB2aWV3IHRvIHVzZSBhcyBhbiBhbmNob3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5jaG9yVmlldyhWaWV3IGFuY2hvcikgeworICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gYW5jaG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBwb3B1cCBmcm9tIGl0cyBhbmNob3IgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SG9yaXpvbnRhbE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGlzIHBvcHVwIGZyb20gaXRzIGFuY2hvciB2aWV3IGluIHBpeGVscy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFZlcnRpY2FsT2Zmc2V0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhpcyBwb3B1cCBmcm9tIGl0cyBhbmNob3IgdmlldyBpbiBwaXhlbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBwb3B1cCBmcm9tIGl0cyBhbmNob3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVydGljYWxPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duV2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuIENhbiBhbHNvIGJlIHtAbGluayAjTUFUQ0hfUEFSRU5UfQorICAgICAqIG9yIHtAbGluayAjV1JBUF9DT05URU5UfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgbURyb3BEb3duV2lkdGggPSB3aWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgcG9wdXAgd2luZG93IGJ5IHRoZSBzaXplIG9mIGl0cyBjb250ZW50LiBUaGUgZmluYWwgd2lkdGggbWF5IGJlCisgICAgICogbGFyZ2VyIHRvIGFjY29tbW9kYXRlIHN0eWxlZCB3aW5kb3cgZHJlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2lkdGggRGVzaXJlZCB3aWR0aCBvZiBjb250ZW50IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIERyYXdhYmxlIHBvcHVwQmFja2dyb3VuZCA9IG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGlmIChwb3B1cEJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPSBwb3B1cEJhY2tncm91bmQuZ2V0SW50cmluc2ljV2lkdGgoKSArIHdpZHRoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgaGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4gQ2FuIGFsc28gYmUge0BsaW5rICNNQVRDSF9QQVJFTlR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKKyAgICAgICAgbURyb3BEb3duSGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGNsaWNrTGlzdGVuZXIgTGlzdGVuZXIgdG8gcmVnaXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I3NldE9uSXRlbUNsaWNrTGlzdGVuZXIoYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgY2xpY2tMaXN0ZW5lcikgeworICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIgPSBjbGlja0xpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIHNlbGVjdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RlZExpc3RlbmVyIExpc3RlbmVyIHRvIHJlZ2lzdGVyLgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBzZWxlY3RlZExpc3RlbmVyKSB7CisgICAgICAgIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IHNlbGVjdGVkTGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgdmlldyB0byBhY3QgYXMgYSB1c2VyIHByb21wdCBmb3IgdGhpcyBwb3B1cCB3aW5kb3cuIFdoZXJlIHRoZSBwcm9tcHQgdmlldyB3aWxsIGFwcGVhcgorICAgICAqIGlzIGNvbnRyb2xsZWQgYnkge0BsaW5rICNzZXRQcm9tcHRQb3NpdGlvbihpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvbXB0IFZpZXcgdG8gdXNlIGFzIGFuIGluZm9ybWF0aW9uYWwgcHJvbXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFZpZXcoVmlldyBwcm9tcHQpIHsKKyAgICAgICAgYm9vbGVhbiBzaG93aW5nID0gaXNTaG93aW5nKCk7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIH0KKyAgICAgICAgbVByb21wdFZpZXcgPSBwcm9tcHQ7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICBzaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3N0IGEge0BsaW5rICNzaG93KCl9IGNhbGwgdG8gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3N0U2hvdygpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIHBvcHVwIGxpc3QuIElmIHRoZSBsaXN0IGlzIGFscmVhZHkgc2hvd2luZywgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHJlY2FsY3VsYXRlIHRoZSBwb3B1cCdzIHNpemUgYW5kIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGludCBoZWlnaHQgPSBidWlsZERyb3BEb3duKCk7CisKKyAgICAgICAgaW50IHdpZHRoU3BlYyA9IDA7CisgICAgICAgIGludCBoZWlnaHRTcGVjID0gMDsKKworICAgICAgICBib29sZWFuIG5vSW5wdXRNZXRob2QgPSBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCk7CisKKyAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKKworICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXRBbmNob3JWaWV3KCksIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCB3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgoZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChtRHJvcERvd25XaWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KG1Ecm9wRG93bkhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gdXNlIG91dHNpZGUgdG91Y2hhYmxlIHRvIGRpc21pc3MgZHJvcCBkb3duIHdoZW4gdG91Y2hpbmcgb3V0c2lkZSBvZiBpdCwgc28KKyAgICAgICAgICAgIC8vIG9ubHkgc2V0IHRoaXMgaWYgdGhlIGRyb3Bkb3duIGlzIG5vdCBhbHdheXMgdmlzaWJsZQorICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7CisgICAgICAgICAgICBtUG9wdXAuc2V0VG91Y2hJbnRlcmNlcHRvcihtVG91Y2hJbnRlcmNlcHRvcik7CisgICAgICAgICAgICBtUG9wdXAuc2hvd0FzRHJvcERvd24oZ2V0QW5jaG9yVmlldygpLAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFtTW9kYWwgfHwgbURyb3BEb3duTGlzdC5pc0luVG91Y2hNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU1vZGFsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtSGlkZVNlbGVjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50VmlldyhudWxsKTsKKyAgICAgICAgbURyb3BEb3duTGlzdCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBhIGNhbGxiYWNrIHdoZW4gdGhlIHBvcHVwIGlzIGRpc21pc3NlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgcG9wdXAgaXMgZGlzbWlzc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uRGlzbWlzc0xpc3RlbmVyKFBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1Qb3B1cC5zZXRPbkRpc21pc3NMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByb21wdFZpZXcoKSB7CisgICAgICAgIGlmIChtUHJvbXB0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHBhcmVudCA9IG1Qcm9tcHRWaWV3LmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKKyAgICAgICAgICAgICAgICBncm91cC5yZW1vdmVWaWV3KG1Qcm9tcHRWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgaG93IHRoZSBwb3B1cCBvcGVyYXRlcyB3aXRoIGFuIGlucHV0IG1ldGhvZDogb25lIG9mCisgICAgICoge0BsaW5rICNJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEV9LCB7QGxpbmsgI0lOUFVUX01FVEhPRF9ORUVERUR9LAorICAgICAqIG9yIHtAbGluayAjSU5QVVRfTUVUSE9EX05PVF9ORUVERUR9LgorICAgICAqIAorICAgICAqIDxwPklmIHRoZSBwb3B1cCBpcyBzaG93aW5nLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdGFrZSBlZmZlY3Qgb25seQorICAgICAqIHRoZSBuZXh0IHRpbWUgdGhlIHBvcHVwIGlzIHNob3duIG9yIHRocm91Z2ggYSBtYW51YWwgY2FsbCB0byB0aGUge0BsaW5rICNzaG93KCl9CisgICAgICogbWV0aG9kLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNnZXRJbnB1dE1ldGhvZE1vZGUoKQorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0TWV0aG9kTW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXRNZXRob2RNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGxpc3QuCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gTGlzdCBwb3NpdGlvbiB0byBzZXQgYXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICBsaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobGlzdC5nZXRDaG9pY2VNb2RlKCkgIT0gTGlzdFZpZXcuQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgICAgIGxpc3Quc2V0SXRlbUNoZWNrZWQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGN1cnJlbnQgbGlzdCBzZWxlY3Rpb24uCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGxpc3QuaGlkZVNlbGVjdG9yKCk7CisgICAgICAgICAgICBsaXN0LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCBpcyBjdXJyZW50bHkgc2hvd2luZywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmlzU2hvd2luZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcG9wdXAgaXMgY29uZmlndXJlZCB0byBhc3N1bWUgdGhlIHVzZXIgZG9lcyBub3QgbmVlZAorICAgICAqIHRvIGludGVyYWN0IHdpdGggdGhlIElNRSB3aGlsZSBpdCBpcyBzaG93aW5nLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IElOUFVUX01FVEhPRF9OT1RfTkVFREVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaXRlbSBjbGljayBvcGVyYXRpb24gb24gdGhlIHNwZWNpZmllZCBsaXN0IGFkYXB0ZXIgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gZm9yIHBlcmZvcm1pbmcgdGhlIGNsaWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGljayBhY3Rpb24gY291bGQgYmUgcGVyZm9ybWVkLCBmYWxzZSBpZiBub3QuCisgICAgICogICAgICAgICAoZS5nLiBpZiB0aGUgcG9wdXAgd2FzIG5vdCBzaG93aW5nLCB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4gZmFsc2UuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbGlzdC5nZXRDaGlsZEF0KHBvc2l0aW9uIC0gbGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbGlzdC5nZXRBZGFwdGVyKCk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QsIGNoaWxkLCBwb3NpdGlvbiwgYWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIHtAbGluayBMaXN0VmlldyNJTlZBTElEX1BPU0lUSU9OfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIExpc3RWaWV3LklOVkFMSURfUE9TSVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3Ige0BsaW5rIExpc3RWaWV3I0lOVkFMSURfUk9XX0lEfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1JZCgpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJdGVtSWQoKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1JPV19JRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIFZpZXcgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmCisgICAgICoge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I2dldFNlbGVjdGVkVmlldygpCisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0U2VsZWN0ZWRWaWV3KCkgeworICAgICAgICBpZiAoIWlzU2hvd2luZygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZFZpZXcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgTGlzdFZpZXd9IGRpc3BsYXllZCB3aXRoaW4gdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiBPbmx5IHZhbGlkIHdoZW4ge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyB3aGVuIHRoZSBkcm9wIGRvd24gaXMgc2hvd24sIHdlIGRyaXZlIGl0IGRpcmVjdGx5CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgLy8gdGhlIGtleSBldmVudHMgYXJlIGZvcndhcmRlZCB0byB0aGUgbGlzdCBpbiB0aGUgZHJvcCBkb3duIHZpZXcKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBMaXN0VmlldyBoYW5kbGVzIHNwYWNlIGJ1dCB3ZSBkb24ndCB3YW50IHRoYXQgdG8gaGFwcGVuCisgICAgICAgICAgICAvLyBhbHNvIGlmIHNlbGVjdGlvbiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBkcm9wIGRvd24sIHRoZW4gZG9uJ3QKKyAgICAgICAgICAgIC8vIGxldCBjZW50ZXIgb3IgZW50ZXIgcHJlc3NlcyBnbyB0aGVyZSBzaW5jZSB0aGF0IHdvdWxkIGNhdXNlIGl0CisgICAgICAgICAgICAvLyB0byBzZWxlY3Qgb25lIG9mIGl0cyBpdGVtcworICAgICAgICAgICAgaWYgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRQorICAgICAgICAgICAgICAgICAgICAmJiAobURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpKSkgeworICAgICAgICAgICAgICAgIGludCBjdXJJbmRleCA9IG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkOworCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiZWxvdyA9ICFtUG9wdXAuaXNBYm92ZUFuY2hvcigpOworCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RJdGVtID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgaW50IGxhc3RJdGVtID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKyAgICAgICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEVuYWJsZWQgPSBhZGFwdGVyLmFyZUFsbEl0ZW1zRW5hYmxlZCgpOworICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0gPSBhbGxFbmFibGVkID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKDAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGFsbEVuYWJsZWQgPyBhZGFwdGVyLmdldENvdW50KCkgLSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oYWRhcHRlci5nZXRDb3VudCgpIC0gMSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYgY3VySW5kZXggPD0gZmlyc3RJdGVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOICYmIGN1ckluZGV4ID49IGxhc3RJdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIHRvcCwgd2UgYmxvY2sgdGhlIGtleQorICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBwcmV2ZW50IGZvY3VzIGZyb20gbW92aW5nLgorICAgICAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcworICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgorICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOworICAgICAgICAgICAgICAgICAgICBzaG93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBwYXNzaW5nIHRoZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IHZpZXcgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgYm90dG9tLCB3ZSBibG9jayB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIGF2b2lkIGdvaW5nIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSB3aWRnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJJbmRleCA9PSBsYXN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckluZGV4ID09IGZpcnN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5VXAKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVVwCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDApIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBwcmUtSU1FIGtleSBldmVudHMuIEJ5IGZvcndhcmRpbmcge0BsaW5rIFZpZXcjb25LZXlQcmVJbWUoaW50LCBLZXlFdmVudCl9CisgICAgICogZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sIHZpZXdzIHVzaW5nIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBkaXNtaXNzIHRoZSBwb3B1cAorICAgICAqIHdoZW4gdGhlIGJhY2sga2V5IGlzIHByZXNzZWQuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVByZUltZQorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5UHJlSW1lCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzU2hvd2luZygpKSB7CisgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBiYWNrIGtleSwgd2UgZG8gbm90IGV2ZW4gdHJ5IHRvIHNlbmQgaXQKKyAgICAgICAgICAgIC8vIHRvIHRoZSBkcm9wIGRvd24gbGlzdCBidXQgaW5zdGVhZCwgY29uc3VtZSBpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgZmluYWwgVmlldyBhbmNob3JWaWV3ID0gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLnN0YXJ0VHJhY2tpbmcoZXZlbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLmhhbmRsZVVwRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChldmVudC5pc1RyYWNraW5nKCkgJiYgIWV2ZW50LmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCisgICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgeworICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OworICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKKworICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dDsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAorICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93CisgICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAorICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCisgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldEFuY2hvclZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbURyb3BEb3duTGlzdCA9IG5ldyBEcm9wRG93bkxpc3RWaWV3KGNvbnRleHQsICFtTW9kYWwpOworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKHRydWUpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1JdGVtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERyb3BEb3duTGlzdFZpZXcgZHJvcERvd25MaXN0ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25TY3JvbGxMaXN0ZW5lcihtU2Nyb2xsTGlzdGVuZXIpOworCisgICAgICAgICAgICBpZiAobUl0ZW1TZWxlY3RlZExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobUl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgVmlldyBoaW50VmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKGhpbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBhbiBoaW50IGhhcyBiZWVuIHNwZWNpZmllZCwgd2UgYWNjb21vZGF0ZSBtb3JlIHNwYWNlIGZvciBpdCBhbmQKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSB0ZXh0IHZpZXcgaW4gdGhlIGRyb3AgZG93biBtZW51LCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGhpbnRDb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KGNvbnRleHQpOworICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDAsIDEuMGYKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAobVByb21wdFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQkVMT1c6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQUJPVkU6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhoaW50Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBoaW50IHBvc2l0aW9uICIgKyBtUHJvbXB0UG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSBoaW50J3MgaGVpZ2h0IHRvIGZpbmQgaG93IG11Y2ggbW9yZSB2ZXJ0aWNhbCBzcGFjZQorICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRvIHRoZSBkcm9wIGRvd24ncyBoZWlnaHQKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKG1Ecm9wRG93bldpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIGhpbnRWaWV3Lm1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKworICAgICAgICAgICAgICAgIGhpbnRQYXJhbXMgPSAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgaGludFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gaGludFZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCisgICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOworCisgICAgICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gaGludENvbnRhaW5lcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KGRyb3BEb3duVmlldyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcm9wRG93blZpZXcgPSAoVmlld0dyb3VwKSBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgorICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCisgICAgICAgIGJvb2xlYW4gaWdub3JlQm90dG9tRGVjb3JhdGlvbnMgPQorICAgICAgICAgICAgICAgIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgZmluYWwgaW50IG1heEhlaWdodCA9IG1Qb3B1cC5nZXRNYXhBdmFpbGFibGVIZWlnaHQoCisgICAgICAgICAgICAgICAgZ2V0QW5jaG9yVmlldygpLCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpOworCisgICAgICAgIC8vIGdldE1heEF2YWlsYWJsZUhlaWdodCgpIHN1YnRyYWN0cyB0aGUgcGFkZGluZywgc28gd2UgcHV0IGl0IGJhY2ssCisgICAgICAgIC8vIHRvIGdldCB0aGUgYXZhaWxhYmxlIGhlaWdodCBmb3IgdGhlIHdob2xlIHdpbmRvdworICAgICAgICBpbnQgcGFkZGluZyA9IDA7CisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLmdldFBhZGRpbmcobVRlbXBSZWN0KTsKKyAgICAgICAgICAgIHBhZGRpbmcgPSBtVGVtcFJlY3QudG9wICsgbVRlbXBSZWN0LmJvdHRvbTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRHJvcERvd25BbHdheXNWaXNpYmxlIHx8IG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCArIHBhZGRpbmc7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgbGlzdENvbnRlbnQgPSBtRHJvcERvd25MaXN0Lm1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIDAsIExpc3RWaWV3Lk5PX1BPU0lUSU9OLCBtYXhIZWlnaHQgLSBvdGhlckhlaWdodHMsIDIpOworICAgICAgICAvLyBhZGQgcGFkZGluZyBvbmx5IGlmIHRoZSBsaXN0IGhhcyBpdGVtcyBpbiBpdCwgdGhhdCB3YXkgd2UgZG9uJ3Qgc2hvdworICAgICAgICAvLyB0aGUgcG9wdXAgaWYgaXQgaXMgbm90IG5lZWRlZAorICAgICAgICBpZiAobGlzdENvbnRlbnQgPiAwKSBvdGhlckhlaWdodHMgKz0gcGFkZGluZzsKKworICAgICAgICByZXR1cm4gbGlzdENvbnRlbnQgKyBvdGhlckhlaWdodHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+V3JhcHBlciBjbGFzcyBmb3IgYSBMaXN0Vmlldy4gVGhpcyB3cmFwcGVyIGNhbiBoaWphY2sgdGhlIGZvY3VzIHRvCisgICAgICogbWFrZSBzdXJlIHRoZSBsaXN0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRyYXdhYmxlcyBhbmQgc3RhdGVzIHdoZW4KKyAgICAgKiBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhpbiBhIGRyb3AgZG93bi4gVGhlIGZvY3VzIGlzIG5ldmVyIGFjdHVhbGx5CisgICAgICogcGFzc2VkIHRvIHRoZSBkcm9wIGRvd24gaW4gdGhpcyBtb2RlOyB0aGUgbGlzdCBvbmx5IGxvb2tzIGZvY3VzZWQuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyb3BEb3duTGlzdFZpZXcgZXh0ZW5kcyBMaXN0VmlldyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMaXN0UG9wdXBXaW5kb3cuVEFHICsgIi5Ecm9wRG93bkxpc3RWaWV3IjsKKyAgICAgICAgLyoKKyAgICAgICAgICogV0FSTklORzogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgdG91Y2ggbW9kZSBpc3N1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVG91Y2ggbW9kZSBpcyBwcm9wYWdhdGVkIGxhemlseSB0byB3aW5kb3dzLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBpbgorICAgICAgICAgKiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgorICAgICAgICAgKiAtIFR5cGUgc29tZXRoaW5nIGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyBhbmQgZ2V0IHNvbWUgcmVzdWx0cworICAgICAgICAgKiAtIE1vdmUgZG93biB3aXRoIHRoZSBkLXBhZCB0byBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgbGlzdAorICAgICAgICAgKiAtIE1vdmUgdXAgd2l0aCB0aGUgZC1wYWQgdW50aWwgdGhlIHNlbGVjdGlvbiBkaXNhcHBlYXJzCisgICAgICAgICAqIC0gVHlwZSBtb3JlIHRleHQgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3ICp1c2luZyB0aGUgc29mdCBrZXlib2FyZCoKKyAgICAgICAgICogICBhbmQgZ2V0IG5ldyByZXN1bHRzOyB5b3UgYXJlIG5vdyBpbiB0b3VjaCBtb2RlCisgICAgICAgICAqIC0gVGhlIHNlbGVjdGlvbiBjb21lcyBiYWNrIG9uIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LCBldmVuIHRob3VnaAorICAgICAgICAgKiAgIHRoZSBsaXN0IGlzIHN1cHBvc2VkIHRvIGJlIGluIHRvdWNoIG1vZGUKKyAgICAgICAgICoKKyAgICAgICAgICogVXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQgdHJpZ2dlcnMgdGhlIHRvdWNoIG1vZGUgY2hhbmdlIGJ1dCB0aGF0IGNoYW5nZQorICAgICAgICAgKiBpcyBwcm9wYWdhdGVkIHRvIG91ciB3aW5kb3cgb25seSBhZnRlciB0aGUgZmlyc3QgbGlzdCBsYXlvdXQsIHRoZXJlZm9yZQorICAgICAgICAgKiBhZnRlciB0aGUgbGlzdCBhdHRlbXB0cyB0byByZXN1cnJlY3QgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHRyaWNrIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgaXMgdG8gcHJldGVuZCB0aGUgbGlzdCBpcyBpbiB0b3VjaAorICAgICAgICAgKiBtb2RlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIsIHRoYXQgaXMgd2hlbgorICAgICAgICAgKiB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZSBzZWxlY3Rpb24gYXdheSBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgd2hlbmV2ZXIgd2UgZXhwbGljaXRseSBoaWRlIHRoZSBsaXN0J3MKKyAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVuZXZlciB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZQorICAgICAgICAgKiBzZWxlY3Rpb24gYmFjayB0byB0aGUgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogV2hlbiB0aGlzIGJvb2xlYW4gaXMgdHJ1ZSwgaXNJblRvdWNoTW9kZSgpIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0CisgICAgICAgICAqIHJldHVybnMgc3VwZXIuaXNJblRvdWNoTW9kZSgpLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1MaXN0U2VsZWN0aW9uSGlkZGVuOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRydWUgaWYgdGhpcyB3cmFwcGVyIHNob3VsZCBmYWtlIGZvY3VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IaWphY2tGb2N1czsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBsaXN0IHZpZXcgd3JhcHBlci48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IHRoaXMgdmlldydzIGNvbnRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEcm9wRG93bkxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBoaWphY2tGb2N1cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duTGlzdFZpZXdTdHlsZSk7CisgICAgICAgICAgICBtSGlqYWNrRm9jdXMgPSBoaWphY2tGb2N1czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Bdm9pZHMgamFycmluZyBzY3JvbGxpbmcgZWZmZWN0IGJ5IGVuc3VyaW5nIHRoYXQgbGlzdCBlbGVtZW50cworICAgICAgICAgKiBtYWRlIG9mIGEgdGV4dCB2aWV3IGZpdCBvbiBhIHNpbmdsZSBsaW5lLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpdGVtIGluZGV4IGluIHRoZSBsaXN0IHRvIGdldCBhIHZpZXcgZm9yCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFZpZXcgb2J0YWluVmlldyhpbnQgcG9zaXRpb24sIGJvb2xlYW5bXSBpc1NjcmFwKSB7CisgICAgICAgICAgICBWaWV3IHZpZXcgPSBzdXBlci5vYnRhaW5WaWV3KHBvc2l0aW9uLCBpc1NjcmFwKTsKKworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldEhvcml6b250YWxseVNjcm9sbGluZyh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblRvdWNoTW9kZSgpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICByZXR1cm4gKG1IaWphY2tGb2N1cyAmJiBtTGlzdFNlbGVjdGlvbkhpZGRlbikgfHwgc3VwZXIuaXNJblRvdWNoTW9kZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1dpbmRvd0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaWphY2tGb2N1cyB8fCBzdXBlci5oYXNXaW5kb3dGb2N1cygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGlqYWNrRm9jdXMgfHwgc3VwZXIuaXNGb2N1c2VkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMgaWYgaGlqYWNraW5nIGZvY3VzCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpamFja0ZvY3VzIHx8IHN1cGVyLmhhc0ZvY3VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgRGF0YVNldE9ic2VydmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIFJlc2l6ZSB0aGUgcG9wdXAgdG8gZml0IG5ldyBjb250ZW50CisgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBUb3VjaEludGVyY2VwdG9yIGltcGxlbWVudHMgT25Ub3VjaExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSAmJgorICAgICAgICAgICAgICAgICAgICAoeCA+PSAwICYmIHggPCBnZXRXaWR0aCgpICYmIHkgPj0gMCAmJiB5IDwgZ2V0SGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBTY3JvbGxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RWaWV3Lk9uU2Nyb2xsTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbChBYnNMaXN0VmlldyB2aWV3LCBpbnQgZmlyc3RWaXNpYmxlSXRlbSwgaW50IHZpc2libGVJdGVtQ291bnQsCisgICAgICAgICAgICAgICAgaW50IHRvdGFsSXRlbUNvdW50KSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsU3RhdGVDaGFuZ2VkKEFic0xpc3RWaWV3IHZpZXcsIGludCBzY3JvbGxTdGF0ZSkgeworICAgICAgICAgICAgaWYgKHNjcm9sbFN0YXRlID09IFNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIWlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSAmJiBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUmVzaXplUG9wdXBSdW5uYWJsZS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKaW5kZXggODJiN2M0Zi4uN2M0ODk3YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5MaXN0czsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CkBAIC0yNywxMCArMjgsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKQEAgLTQxLDYgKzM5LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIApAQCAtNjQsMTAgKzYzLDEwIEBACiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19lbnRyaWVzCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19kaXZpZGVyCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19kaXZpZGVySGVpZ2h0Ci0gKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19jaG9pY2VNb2RlCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19oZWFkZXJEaXZpZGVyc0VuYWJsZWQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpc3RWaWV3X2Zvb3RlckRpdmlkZXJzRW5hYmxlZAogICovCitAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIExpc3RWaWV3IGV4dGVuZHMgQWJzTGlzdFZpZXcgewogICAgIC8qKgogICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgYSBubyBwcmVmZXJlbmNlIGZvciBhIHBvc2l0aW9uIHR5cGUuCkBAIC03NSwyMSArNzQsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fUE9TSVRJT04gPSAtMTsKIAogICAgIC8qKgotICAgICAqIE5vcm1hbCBsaXN0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2hvaWNlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX05PTkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3QgYWxsb3dzIHVwIHRvIG9uZSBjaG9pY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9TSU5HTEUgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRSA9IDI7Ci0KLSAgICAvKioKICAgICAgKiBXaGVuIGFycm93IHNjcm9sbGluZywgTGlzdFZpZXcgd2lsbCBuZXZlciBzY3JvbGwgbW9yZSB0aGFuIHRoaXMgZmFjdG9yCiAgICAgICogdGltZXMgdGhlIGhlaWdodCBvZiB0aGUgbGlzdC4KICAgICAgKi8KQEAgLTEyMSwxMiArMTA1LDggQEAKICAgICBEcmF3YWJsZSBtRGl2aWRlcjsKICAgICBpbnQgbURpdmlkZXJIZWlnaHQ7CiAgICAgCi0gICAgRHJhd2FibGUgbU92ZXJTY3JvbGxIZWFkZXI7Ci0gICAgRHJhd2FibGUgbU92ZXJTY3JvbGxGb290ZXI7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQ2FjaGVDb2xvck9wYXF1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbURpdmlkZXJJc09wYXF1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNsaXBEaXZpZGVyOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1IZWFkZXJEaXZpZGVyc0VuYWJsZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Gb290ZXJEaXZpZGVyc0VuYWJsZWQ7CkBAIC0xMzUsMTEgKzExNSw2IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUl0ZW1zQ2FuRm9jdXMgPSBmYWxzZTsKIAotICAgIHByaXZhdGUgaW50IG1DaG9pY2VNb2RlID0gQ0hPSUNFX01PREVfTk9ORTsKLQotICAgIHByaXZhdGUgU3BhcnNlQm9vbGVhbkFycmF5IG1DaGVja1N0YXRlczsKLSAgICBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBtQ2hlY2tlZElkU3RhdGVzOwotCiAgICAgLy8gdXNlZCBmb3IgdGVtcG9yYXJ5IGNhbGN1bGF0aW9ucy4KICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKICAgICBwcml2YXRlIFBhaW50IG1EaXZpZGVyUGFpbnQ7CkBAIC0xNTAsNyArMTI1LDcgQEAKIAogICAgIC8vIEtlZXBzIGZvY3VzZWQgY2hpbGRyZW4gdmlzaWJsZSB0aHJvdWdoIHJlc2l6ZXMKICAgICBwcml2YXRlIEZvY3VzU2VsZWN0b3IgbUZvY3VzU2VsZWN0b3I7Ci0gICAgCisKICAgICBwdWJsaWMgTGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CiAgICAgfQpAQCAtMTc4LDE4ICsxNTMsNiBAQAogICAgICAgICAgICAgc2V0RGl2aWRlcihkKTsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgZmluYWwgRHJhd2FibGUgb3NIZWFkZXIgPSBhLmdldERyYXdhYmxlKAotICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpc3RWaWV3X292ZXJTY3JvbGxIZWFkZXIpOwotICAgICAgICBpZiAob3NIZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0T3ZlcnNjcm9sbEhlYWRlcihvc0hlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBEcmF3YWJsZSBvc0Zvb3RlciA9IGEuZ2V0RHJhd2FibGUoCi0gICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGlzdFZpZXdfb3ZlclNjcm9sbEZvb3Rlcik7Ci0gICAgICAgIGlmIChvc0Zvb3RlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRPdmVyc2Nyb2xsRm9vdGVyKG9zRm9vdGVyKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIFVzZSB0aGUgaGVpZ2h0IHNwZWNpZmllZCwgemVybyBiZWluZyB0aGUgZGVmYXVsdAogICAgICAgICBmaW5hbCBpbnQgZGl2aWRlckhlaWdodCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpc3RWaWV3X2RpdmlkZXJIZWlnaHQsIDApOwpAQCAtMTk3LDggKzE2MCw2IEBACiAgICAgICAgICAgICBzZXREaXZpZGVySGVpZ2h0KGRpdmlkZXJIZWlnaHQpOwogICAgICAgICB9CiAKLSAgICAgICAgc2V0Q2hvaWNlTW9kZShhLmdldEludChSLnN0eWxlYWJsZS5MaXN0Vmlld19jaG9pY2VNb2RlLCBDSE9JQ0VfTU9ERV9OT05FKSk7Ci0gICAgICAgIAogICAgICAgICBtSGVhZGVyRGl2aWRlcnNFbmFibGVkID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkxpc3RWaWV3X2hlYWRlckRpdmlkZXJzRW5hYmxlZCwgdHJ1ZSk7CiAgICAgICAgIG1Gb290ZXJEaXZpZGVyc0VuYWJsZWQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGlzdFZpZXdfZm9vdGVyRGl2aWRlcnNFbmFibGVkLCB0cnVlKTsKIApAQCAtNDE5LDYgKzM4MCwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBYnNMaXN0VmlldyB0byB1c2UgYSByZW1vdGUgdmlld3MgYWRhcHRlciB3aGljaCBjb25uZWN0cyB0byBhIFJlbW90ZVZpZXdzU2VydmljZQorICAgICAqIHRocm91Z2ggdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdGhlIGFkYXB0ZXIgdG8gY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVWaWV3c0FkYXB0ZXIoSW50ZW50IGludGVudCkgeworICAgICAgICBzdXBlci5zZXRSZW1vdGVWaWV3c0FkYXB0ZXIoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIGJlaGluZCB0aGlzIExpc3RWaWV3LgogICAgICAqCiAgICAgICogVGhlIGFkYXB0ZXIgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIG1heSBiZSB3cmFwcGVkIGJ5IGEge0BsaW5rIFdyYXBwZXJMaXN0QWRhcHRlcn0sCkBAIC00MzMsNyArNDA0LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAKQEAgLTQ0OCw2ICs0MTksMTAgQEAKIAogICAgICAgICBtT2xkU2VsZWN0ZWRQb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIG1PbGRTZWxlY3RlZFJvd0lkID0gSU5WQUxJRF9ST1dfSUQ7CisKKyAgICAgICAgLy8gQWJzTGlzdFZpZXcjc2V0QWRhcHRlciB3aWxsIHVwZGF0ZSBjaG9pY2UgbW9kZSBzdGF0ZXMuCisgICAgICAgIHN1cGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisKICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1BcmVBbGxJdGVtc1NlbGVjdGFibGUgPSBtQWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKICAgICAgICAgICAgIG1PbGRJdGVtQ291bnQgPSBtSXRlbUNvdW50OwpAQCAtNDcyLDEzICs0NDcsNiBAQAogICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgc2VsZWN0ZWQKICAgICAgICAgICAgICAgICBjaGVja1NlbGVjdGlvbkNoYW5nZWQoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUgJiYKLSAgICAgICAgICAgICAgICAgICAgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUFyZUFsbEl0ZW1zU2VsZWN0YWJsZSA9IHRydWU7CiAgICAgICAgICAgICBjaGVja0ZvY3VzKCk7CkBAIC00ODYsMTQgKzQ1NCw2IEBACiAgICAgICAgICAgICBjaGVja1NlbGVjdGlvbkNoYW5nZWQoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotCiAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKICAgICB9CiAKQEAgLTg4MSw2ICs4NDEsMjUgQEAKICAgICAgICAgcmV0dXJuIHRvcFNlbGVjdGlvblBpeGVsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwKKyAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBTY3JvbGwgdG8gdGhpcyBhZGFwdGVyIHBvc2l0aW9uLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0LiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbW91bnQgdG8gb2Zmc2V0IGZyb20gdGhlIGFkYXB0ZXIgcG9zaXRpb24gdG8gc2Nyb2xsIHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbEJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgc3VwZXIuc21vb3RoU2Nyb2xsQnlPZmZzZXQob2Zmc2V0KTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBGaWxscyB0aGUgbGlzdCBiYXNlZCBvbiBwb3NpdGlvbmluZyB0aGUgbmV3IHNlbGVjdGlvbiByZWxhdGl2ZSB0byB0aGUgb2xkCkBAIC0xODA1LDYgKzE3ODQsOSBAQAogICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2hlY2thYmxlKSB7CiAgICAgICAgICAgICAgICAgKChDaGVja2FibGUpIGNoaWxkKS5zZXRDaGVja2VkKG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29udGV4dCgpLmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgPj0gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkhPTkVZQ09NQikgeworICAgICAgICAgICAgICAgIGNoaWxkLnNldEFjdGl2YXRlZChtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjk2MCw1MiArMjk0MiwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHN1cGVyLnNldENhY2hlQ29sb3JIaW50KGNvbG9yKTsKICAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMudG9wID0gYm91bmRzLmJvdHRvbSAtIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsRm9vdGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm91bmRzLnRvcCArIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KKyAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICAvLyBEcmF3IHRoZSBkaXZpZGVycwogICAgICAgICBmaW5hbCBpbnQgZGl2aWRlckhlaWdodCA9IG1EaXZpZGVySGVpZ2h0OwotICAgICAgICBmaW5hbCBEcmF3YWJsZSBvdmVyc2Nyb2xsSGVhZGVyID0gbU92ZXJTY3JvbGxIZWFkZXI7Ci0gICAgICAgIGZpbmFsIERyYXdhYmxlIG92ZXJzY3JvbGxGb290ZXIgPSBtT3ZlclNjcm9sbEZvb3RlcjsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEhlYWRlciA9IG92ZXJzY3JvbGxIZWFkZXIgIT0gbnVsbDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEZvb3RlciA9IG92ZXJzY3JvbGxGb290ZXIgIT0gbnVsbDsKICAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3RGl2aWRlcnMgPSBkaXZpZGVySGVpZ2h0ID4gMCAmJiBtRGl2aWRlciAhPSBudWxsOwogCi0gICAgICAgIGlmIChkcmF3RGl2aWRlcnMgfHwgZHJhd092ZXJzY3JvbGxIZWFkZXIgfHwgZHJhd092ZXJzY3JvbGxGb290ZXIpIHsKKyAgICAgICAgaWYgKGRyYXdEaXZpZGVycykgewogICAgICAgICAgICAgLy8gT25seSBtb2RpZnkgdGhlIHRvcCBhbmQgYm90dG9tIGluIHRoZSBsb29wLCB3ZSBzZXQgdGhlIGxlZnQgYW5kIHJpZ2h0IGhlcmUKICAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gbVRlbXBSZWN0OwogICAgICAgICAgICAgYm91bmRzLmxlZnQgPSBtUGFkZGluZ0xlZnQ7CkBAIC0zMDI0LDcgKzI5NjgsNyBAQAogICAgICAgICAgICAgLy8gZmlsbCBhIHJlY3Qgd2hlcmUgdGhlIGRpdmlkZXJzIHdvdWxkIGJlIGZvciBub24tc2VsZWN0YWJsZSBpdGVtcwogICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgb3BhcXVlIGFuZCB0aGUgYmFja2dyb3VuZCBpcyBhbHNvIG9wYXF1ZSwgd2UgZG9uJ3QKICAgICAgICAgICAgIC8vIG5lZWQgdG8gZHJhdyBhbnl0aGluZyBzaW5jZSB0aGUgYmFja2dyb3VuZCB3aWxsIGRvIGl0IGZvciB1cwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmaWxsRm9yTWlzc2luZ0RpdmlkZXJzID0gZHJhd0RpdmlkZXJzICYmIGlzT3BhcXVlKCkgJiYgIXN1cGVyLmlzT3BhcXVlKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMgPSBpc09wYXF1ZSgpICYmICFzdXBlci5pc09wYXF1ZSgpOwogCiAgICAgICAgICAgICBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycyAmJiBtRGl2aWRlclBhaW50ID09IG51bGwgJiYgbUlzQ2FjaGVDb2xvck9wYXF1ZSkgewogICAgICAgICAgICAgICAgIG1EaXZpZGVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKQEAgLTMwMzQsNzIgKzI5NzgsNDEgQEAKIAogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RCb3R0b20gPSBtQm90dG9tIC0gbVRvcCAtIG1MaXN0UGFkZGluZy5ib3R0b20gKyBtU2Nyb2xsWTsKICAgICAgICAgICAgIGlmICghbVN0YWNrRnJvbUJvdHRvbSkgewotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSAwOworICAgICAgICAgICAgICAgIGludCBib3R0b207CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRHJhdyB0b3AgZGl2aWRlciBvciBoZWFkZXIgZm9yIG92ZXJzY3JvbGwKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgc2Nyb2xsWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdPdmVyc2Nyb2xsSGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBzY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxIZWFkZXIoY2FudmFzLCBvdmVyc2Nyb2xsSGVhZGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRyYXdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gLWRpdmlkZXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoaGVhZGVyRGl2aWRlcnMgfHwgZmlyc3QgKyBpID49IGhlYWRlckNvdW50KSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb290ZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPCBmb290ZXJMaW1pdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gY2hpbGQuZ2V0Qm90dG9tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkcmF3IGRpdmlkZXJzIG5leHQgdG8gaXRlbXMgdGhhdCBhcmUgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3RGl2aWRlcnMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvdHRvbSA8IGxpc3RCb3R0b20gJiYgIShkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBpID09IGNvdW50IC0gMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcmVBbGxJdGVtc1NlbGVjdGFibGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkgKyAxKSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGJvdW5kcywgcGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChib3VuZHMsIHBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyRm9vdGVyQm90dG9tID0gbUJvdHRvbSArIG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBmaXJzdCArIGNvdW50ID09IGl0ZW1Db3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlckZvb3RlckJvdHRvbSA+IGJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gb3ZlckZvb3RlckJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxGb290ZXIoY2FudmFzLCBvdmVyc2Nyb2xsRm9vdGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW50IHRvcDsKICAgICAgICAgICAgICAgICBpbnQgbGlzdFRvcCA9IG1MaXN0UGFkZGluZy50b3A7CiAKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwogCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBkcmF3T3ZlcnNjcm9sbEhlYWRlcikgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gc2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IGdldENoaWxkQXQoMCkuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKGNhbnZhcywgb3ZlcnNjcm9sbEhlYWRlciwgYm91bmRzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBkcmF3T3ZlcnNjcm9sbEhlYWRlciA/IDEgOiAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChoZWFkZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPj0gaGVhZGVyQ291bnQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvb3RlckRpdmlkZXJzIHx8IGZpcnN0ICsgaSA8IGZvb3RlckxpbWl0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBjaGlsZC5nZXRUb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGRyYXcgZGl2aWRlcnMgbmV4dCB0byBpdGVtcyB0aGF0IGFyZSBub3QgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdEaXZpZGVycyAmJiB0b3AgPiBsaXN0VG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wID4gbGlzdFRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpKSAmJiAoaSA9PSBjb3VudCAtIDEgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpICsgMSkpKSkpIHsKQEAgLTMxMjAsMTYgKzMwMzMsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwICYmIHNjcm9sbFkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic0xpc3RCb3R0b20gPSBtQm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGFic0xpc3RCb3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYWJzTGlzdEJvdHRvbSArIHNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3T3ZlcnNjcm9sbEZvb3RlcihjYW52YXMsIG92ZXJzY3JvbGxGb290ZXIsIGJvdW5kcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJhd0RpdmlkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gbGlzdEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdEaXZpZGVyKGNhbnZhcywgYm91bmRzLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGxpc3RCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIC0xKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMxNTAsMjAgKzMwNTYsOSBAQAogICAgIHZvaWQgZHJhd0RpdmlkZXIoQ2FudmFzIGNhbnZhcywgUmVjdCBib3VuZHMsIGludCBjaGlsZEluZGV4KSB7CiAgICAgICAgIC8vIFRoaXMgd2lkZ2V0IGRyYXdzIHRoZSBzYW1lIGRpdmlkZXIgZm9yIGFsbCBjaGlsZHJlbgogICAgICAgICBmaW5hbCBEcmF3YWJsZSBkaXZpZGVyID0gbURpdmlkZXI7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2xpcERpdmlkZXIgPSBtQ2xpcERpdmlkZXI7CiAKLSAgICAgICAgaWYgKCFjbGlwRGl2aWRlcikgewotICAgICAgICAgICAgZGl2aWRlci5zZXRCb3VuZHMoYm91bmRzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoYm91bmRzKTsKLSAgICAgICAgfQotCisgICAgICAgIGRpdmlkZXIuc2V0Qm91bmRzKGJvdW5kcyk7CiAgICAgICAgIGRpdmlkZXIuZHJhdyhjYW52YXMpOwotCi0gICAgICAgIGlmIChjbGlwRGl2aWRlcikgewotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzE4NCwxMCArMzA3OSw4IEBACiAgICAgcHVibGljIHZvaWQgc2V0RGl2aWRlcihEcmF3YWJsZSBkaXZpZGVyKSB7CiAgICAgICAgIGlmIChkaXZpZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1EaXZpZGVySGVpZ2h0ID0gZGl2aWRlci5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLSAgICAgICAgICAgIG1DbGlwRGl2aWRlciA9IGRpdmlkZXIgaW5zdGFuY2VvZiBDb2xvckRyYXdhYmxlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbURpdmlkZXJIZWlnaHQgPSAwOwotICAgICAgICAgICAgbUNsaXBEaXZpZGVyID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbURpdmlkZXIgPSBkaXZpZGVyOwogICAgICAgICBtRGl2aWRlcklzT3BhcXVlID0gZGl2aWRlciA9PSBudWxsIHx8IGRpdmlkZXIuZ2V0T3BhY2l0eSgpID09IFBpeGVsRm9ybWF0Lk9QQVFVRTsKQEAgLTMyMzgsNDUgKzMxMzEsNiBAQAogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRyYXdhYmxlIHRoYXQgd2lsbCBiZSBkcmF3biBhYm92ZSBhbGwgb3RoZXIgbGlzdCBjb250ZW50LgotICAgICAqIFRoaXMgYXJlYSBjYW4gYmVjb21lIHZpc2libGUgd2hlbiB0aGUgdXNlciBvdmVyc2Nyb2xscyB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIGRyYXdhYmxlIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxIZWFkZXIoRHJhd2FibGUgaGVhZGVyKSB7Ci0gICAgICAgIG1PdmVyU2Nyb2xsSGVhZGVyID0gaGVhZGVyOwotICAgICAgICBpZiAobVNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYWJvdmUgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsSGVhZGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJTY3JvbGxIZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZHJhd2FibGUgdGhhdCB3aWxsIGJlIGRyYXduIGJlbG93IGFsbCBvdGhlciBsaXN0IGNvbnRlbnQuCi0gICAgICogVGhpcyBhcmVhIGNhbiBiZWNvbWUgdmlzaWJsZSB3aGVuIHRoZSB1c2VyIG92ZXJzY3JvbGxzIHRoZSBsaXN0LAotICAgICAqIG9yIHdoZW4gdGhlIGxpc3QncyBjb250ZW50IGRvZXMgbm90IGZ1bGx5IGZpbGwgdGhlIGNvbnRhaW5lciBhcmVhLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvb3RlciBUaGUgZHJhd2FibGUgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbEZvb3RlcihEcmF3YWJsZSBmb290ZXIpIHsKLSAgICAgICAgbU92ZXJTY3JvbGxGb290ZXIgPSBmb290ZXI7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYmVsb3cgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsRm9vdGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJTY3JvbGxGb290ZXI7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25Gb2N1c0NoYW5nZWQoYm9vbGVhbiBnYWluRm9jdXMsIGludCBkaXJlY3Rpb24sIFJlY3QgcHJldmlvdXNseUZvY3VzZWRSZWN0KSB7CiAgICAgICAgIHN1cGVyLm9uRm9jdXNDaGFuZ2VkKGdhaW5Gb2N1cywgZGlyZWN0aW9uLCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpOwpAQCAtMzQ0NywxNzcgKzMzMDEsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBjaG9pY2UgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DaG9pY2VNb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3QuIEJ5IGRlZmF1bHQsIExpc3RzIGRvIG5vdCBoYXZlIGFueSBjaG9pY2UgYmVoYXZpb3IKLSAgICAgKiAoe0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSkuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCB0aGUKLSAgICAgKiBMaXN0IGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byAgYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgotICAgICAqCi0gICAgICogQHBhcmFtIGNob2ljZU1vZGUgT25lIG9mIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0sIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgb3IKLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZU1vZGUoaW50IGNob2ljZU1vZGUpIHsKLSAgICAgICAgbUNob2ljZU1vZGUgPSBjaG9pY2VNb2RlOwotICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgewotICAgICAgICAgICAgaWYgKG1DaGVja1N0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCAmJiBtQWRhcHRlciAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOwotICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlZCB8PSBzdXBlci5wZXJmb3JtSXRlbUNsaWNrKHZpZXcsIHBvc2l0aW9uLCBpZCk7Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9IG9yCi0gICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgaXMgdG8gYmUgY2hlY2tlZAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBpdGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKLSAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKLSAgICAgICAgICAgIC8vIHNlbGVjdGVkIGl0ZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBpc0l0ZW1DaGVja2VkKHBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRoaXMgbWF5IGVuZCB1cCBzZWxlY3RpbmcgdGhlIHZhbHVlIHdlIGp1c3QgY2xlYXJlZCBidXQgdGhpcyB3YXkKLSAgICAgICAgICAgIC8vIHdlIGVuc3VyZSBsZW5ndGggb2YgbUNoZWNrU3RhdGVzIGlzIDEsIGEgZmFjdCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uIHJlbGllcyBvbgotICAgICAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBhIGRhdGEgY2hhbmdlIHdoaWxlIHdlIGFyZSBpbiB0aGUgbGF5b3V0IHBoYXNlCi0gICAgICAgIGlmICghbUluTGF5b3V0ICYmICFtQmxvY2tMYXlvdXRSZXF1ZXN0cykgewotICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7Ci0gICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQotICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9Ci0gICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIFRoZSBpdGVtJ3MgY2hlY2tlZCBzdGF0ZSBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY2hvaWNlIG1vZGUKLSAgICAgKiAgICAgICAgIGlzIGludmFsaWQKLSAgICAgKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbS4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBjaG9pY2UKLSAgICAgKiBtb2RlIGhhcyBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbSBvcgotICAgICAqICAgICAgICAge0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiBub3RoaW5nIGlzIHNlbGVjdGVkCi0gICAgICoKLSAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtUG9zaXRpb24oKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9TSU5HTEUgJiYgbUNoZWNrU3RhdGVzICE9IG51bGwgJiYgbUNoZWNrU3RhdGVzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmtleUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElOVkFMSURfUE9TSVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaW4gdGhlIGxpc3QuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgbm90IGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBBIFNwYXJzZUJvb2xlYW5BcnJheSB3aGljaCB3aWxsIHJldHVybiB0cnVlIGZvciBlYWNoIGNhbGwgdG8KLSAgICAgKiAgICAgICAgICBnZXQoaW50IHBvc2l0aW9uKSB3aGVyZSBwb3NpdGlvbiBpcyBhIHBvc2l0aW9uIGluIHRoZSBsaXN0LAotICAgICAqICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KLSAgICAgKiAgICAgICAgICB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LgotICAgICAqLwotICAgIHB1YmxpYyBTcGFyc2VCb29sZWFuQXJyYXkgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMoKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQogICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KICAgICAgKiAKQEAgLTM2MjYsNiArMzMwOSw3IEBACiAgICAgICogICAgICAgICAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDaGVja2VkSXRlbUlkcygpfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGxvbmdbXSBnZXRDaGVja0l0ZW1JZHMoKSB7CiAgICAgICAgIC8vIFVzZSBuZXcgYmVoYXZpb3IgdGhhdCBjb3JyZWN0bHkgaGFuZGxlcyBzdGFibGUgSUQgbWFwcGluZy4KICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKQEAgLTM2NjAsMTE1ICszMzQ0LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IGxvbmdbMF07CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQotICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSBhbmQgdGhlIGFkYXB0ZXIKLSAgICAgKiBoYXMgc3RhYmxlIElEcy4gKHtAbGluayBMaXN0QWRhcHRlciNoYXNTdGFibGVJZHMoKX0gPT0ge0Bjb2RlIHRydWV9KQotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBuZXcgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGlkIG9mIGVhY2ggY2hlY2tlZCBpdGVtIGluIHRoZQotICAgICAqICAgICAgICAgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZ1tdIGdldENoZWNrZWRJdGVtSWRzKCkgewotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTk9ORSB8fCBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgfHwgbUFkYXB0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBsb25nWzBdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gaWRTdGF0ZXMgPSBtQ2hlY2tlZElkU3RhdGVzOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpZFN0YXRlcy5zaXplKCk7Ci0gICAgICAgIGZpbmFsIGxvbmdbXSBpZHMgPSBuZXcgbG9uZ1tjb3VudF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlkc1tpXSA9IGlkU3RhdGVzLmtleUF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIGFueSBjaG9pY2VzIHByZXZpb3VzbHkgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJDaG9pY2VzKCkgewotICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgewotICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZTsKLSAgICAgICAgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGNoZWNrSWRTdGF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIExpc3RWaWV3I29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KLSAgICAgICAgICovCi0gICAgICAgIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlLCBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZSwKLSAgICAgICAgICAgICAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gY2hlY2tJZFN0YXRlKSB7Ci0gICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tTdGF0ZSA9IGNoZWNrU3RhdGU7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrSWRTdGF0ZSA9IGNoZWNrSWRTdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgI0NSRUFUT1J9Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFNhdmVkU3RhdGUoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICBzdXBlcihpbik7Ci0gICAgICAgICAgICBjaGVja1N0YXRlID0gaW4ucmVhZFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgbG9uZ1tdIGlkU3RhdGUgPSBpbi5jcmVhdGVMb25nQXJyYXkoKTsKLQotICAgICAgICAgICAgaWYgKGlkU3RhdGUubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgICAgICBjaGVja0lkU3RhdGUuc2V0VmFsdWVzKGlkU3RhdGUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7Ci0gICAgICAgICAgICBvdXQud3JpdGVTcGFyc2VCb29sZWFuQXJyYXkoY2hlY2tTdGF0ZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVMb25nQXJyYXkoY2hlY2tJZFN0YXRlICE9IG51bGwgPyBjaGVja0lkU3RhdGUuZ2V0S2V5cygpIDogbmV3IGxvbmdbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkxpc3RWaWV3LlNhdmVkU3RhdGV7IgotICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpCi0gICAgICAgICAgICAgICAgICAgICsgIiBjaGVja1N0YXRlPSIgKyBjaGVja1N0YXRlICsgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgotICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgewotICAgICAgICBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlLCBtQ2hlY2tTdGF0ZXMsIG1DaGVja2VkSWRTdGF0ZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgewotICAgICAgICBTYXZlZFN0YXRlIHNzID0gKFNhdmVkU3RhdGUpIHN0YXRlOwotCi0gICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3MuZ2V0U3VwZXJTdGF0ZSgpKTsKLQotICAgICAgICBpZiAoc3MuY2hlY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1DaGVja1N0YXRlcyA9IHNzLmNoZWNrU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3MuY2hlY2tJZFN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBzcy5jaGVja0lkU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGViODkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L092ZXJTY3JvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5GbG9hdE1hdGg7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgc2Nyb2xsaW5nIHdpdGggdGhlIGFiaWxpdHkgdG8gb3ZlcnNob290IHRoZSBib3VuZHMKLSAqIG9mIGEgc2Nyb2xsaW5nIG9wZXJhdGlvbi4gVGhpcyBjbGFzcyBpcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yCi0gKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXJ9IGluIG1vc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVyU2Nyb2xsZXIgewotICAgIHByaXZhdGUgaW50IG1Nb2RlOwotCi0gICAgcHJpdmF0ZSBNYWduZXRpY092ZXJTY3JvbGxlciBtU2Nyb2xsZXJYOwotICAgIHByaXZhdGUgTWFnbmV0aWNPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyWTsKLQotICAgIHByaXZhdGUgZmluYWwgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9EVVJBVElPTiA9IDI1MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX01PREUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTElOR19NT0RFID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggYSB2aXNjb3VzIGZsdWlkIHNjcm9sbCBpbnRlcnBvbGF0b3IuCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggZGVmYXVsdCBlZGdlIGJvdW5jZSBjb2VmZmljaWVudHMuCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhpcyBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIFRoZSBzY3JvbGwgaW50ZXJwb2xhdG9yLiBJZiBudWxsLCBhIGRlZmF1bHQgKHZpc2NvdXMpIGludGVycG9sYXRvciB3aWxsCi0gICAgICogYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCwgSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGludGVycG9sYXRvciwgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQsCi0gICAgICAgICAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyLgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoaXMgYXBwbGljYXRpb24uCi0gICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgc2Nyb2xsIGludGVycG9sYXRvci4gSWYgbnVsbCwgYSBkZWZhdWx0ICh2aXNjb3VzKSBpbnRlcnBvbGF0b3Igd2lsbAotICAgICAqIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WCBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSB0aGF0IHdpbGwgZGV0ZXJtaW5lIHRoZSBwcm9wb3J0aW9uIG9mIHRoZQotICAgICAqIHZlbG9jaXR5IHdoaWNoIGlzIHByZXNlcnZlZCBpbiB0aGUgYm91bmNlIHdoZW4gdGhlIGhvcml6b250YWwgZWRnZSBpcyByZWFjaGVkLiBBIG51bGwgdmFsdWUKLSAgICAgKiBtZWFucyBubyBib3VuY2UuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WSBTYW1lIGFzIGJvdW5jZUNvZWZmaWNpZW50WCBidXQgZm9yIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIE92ZXJTY3JvbGxlcihDb250ZXh0IGNvbnRleHQsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IsCi0gICAgICAgICAgICBmbG9hdCBib3VuY2VDb2VmZmljaWVudFgsIGZsb2F0IGJvdW5jZUNvZWZmaWNpZW50WSkgewotICAgICAgICBtSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOwotICAgICAgICBtU2Nyb2xsZXJYID0gbmV3IE1hZ25ldGljT3ZlclNjcm9sbGVyKCk7Ci0gICAgICAgIG1TY3JvbGxlclkgPSBuZXcgTWFnbmV0aWNPdmVyU2Nyb2xsZXIoKTsKLSAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuaW5pdGlhbGl6ZUZyb21Db250ZXh0KGNvbnRleHQpOwotCi0gICAgICAgIG1TY3JvbGxlclguc2V0Qm91bmNlQ29lZmZpY2llbnQoYm91bmNlQ29lZmZpY2llbnRYKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zZXRCb3VuY2VDb2VmZmljaWVudChib3VuY2VDb2VmZmljaWVudFkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmlzaGVkICYmIG1TY3JvbGxlclkubUZpbmlzaGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIHRoZSBmaW5pc2hlZCBmaWVsZCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuIENvbnRyYXJ5IHRvCi0gICAgICoge0BsaW5rICNhYm9ydEFuaW1hdGlvbigpfSwgZm9yY2luZyB0aGUgYW5pbWF0aW9uIHRvIGZpbmlzaGVkCi0gICAgICogZG9lcyBOT1QgY2F1c2UgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaW5pc2hlZCBUaGUgbmV3IGZpbmlzaGVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZvcmNlRmluaXNoZWQoYm9vbGVhbiBmaW5pc2hlZCkgewotICAgICAgICBtU2Nyb2xsZXJYLm1GaW5pc2hlZCA9IG1TY3JvbGxlclkubUZpbmlzaGVkID0gZmluaXNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBYIG9mZnNldCBpbiB0aGUgc2Nyb2xsLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV3IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJYKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWC5tQ3VycmVudFBvc2l0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgWSBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRDdXJyWSgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclkubUN1cnJlbnRQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmVsb2NpdHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBvcmlnaW5hbCB2ZWxvY2l0eSBsZXNzIHRoZSBkZWNlbGVyYXRpb24sIG5vcm0gb2YgdGhlIFggYW5kIFkgdmVsb2NpdHkgdmVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyVmVsb2NpdHkoKSB7Ci0gICAgICAgIGZsb2F0IHNxdWFyZWROb3JtID0gbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5ICogbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5OwotICAgICAgICBzcXVhcmVkTm9ybSArPSBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHkgKiBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHk7Ci0gICAgICAgIHJldHVybiBGbG9hdE1hdGguc3FydChzcXVhcmVkTm9ybSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhcnQgWCBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXJ0IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFN0YXJ0WCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubVN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IFkgb2Zmc2V0IGluIHRoZSBzY3JvbGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGFydCBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTdGFydFkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Nyb2xsZXJZLm1TdGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXJlIHRoZSBzY3JvbGwgd2lsbCBlbmQuIFZhbGlkIG9ubHkgZm9yICJmbGluZyIgc2Nyb2xscy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGZpbmFsIFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEZpbmFsWCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hlcmUgdGhlIHNjcm9sbCB3aWxsIGVuZC4gVmFsaWQgb25seSBmb3IgImZsaW5nIiBzY3JvbGxzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZmluYWwgWSBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RmluYWxZKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWS5tRmluYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBob3cgbG9uZyB0aGUgc2Nyb2xsIGV2ZW50IHdpbGwgdGFrZSwgaW4gbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgbGllIHRvIHRoZSBiZXN0IG9mIGl0cyBhYmlsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChtU2Nyb2xsZXJYLm1EdXJhdGlvbiwgbVNjcm9sbGVyWS5tRHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dGVuZCB0aGUgc2Nyb2xsIGFuaW1hdGlvbi4gVGhpcyBhbGxvd3MgYSBydW5uaW5nIGFuaW1hdGlvbiB0byBzY3JvbGwKLSAgICAgKiBmdXJ0aGVyIGFuZCBsb25nZXIsIHdoZW4gdXNlZCB3aXRoIHtAbGluayAjc2V0RmluYWxYKGludCl9IG9yIHtAbGluayAjc2V0RmluYWxZKGludCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuZCBBZGRpdGlvbmFsIHRpbWUgdG8gc2Nyb2xsIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAc2VlICNzZXRGaW5hbFgoaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWShpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBJbnN0ZWFkIG9mIHNldHRpbmcgYSBuZXcgZmluYWwgcG9zaXRpb24gYW5kIGV4dGVuZGluZwotICAgICAqICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiBhbiBleGlzdGluZyBzY3JvbGwsIHVzZSBzdGFydFNjcm9sbAotICAgICAqICAgICAgICAgICAgIHRvIGJlZ2luIGEgbmV3IGFuaW1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleHRlbmREdXJhdGlvbihpbnQgZXh0ZW5kKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZXh0ZW5kRHVyYXRpb24oZXh0ZW5kKTsKLSAgICAgICAgbVNjcm9sbGVyWS5leHRlbmREdXJhdGlvbihleHRlbmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbmFsIHBvc2l0aW9uIChYKSBmb3IgdGhpcyBzY3JvbGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdYIFRoZSBuZXcgWCBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqIEBzZWUgI2V4dGVuZER1cmF0aW9uKGludCkKLSAgICAgKiBAc2VlICNzZXRGaW5hbFkoaW50KQotICAgICAqCi0gICAgICogQGhpZGUgUGVuZGluZyByZW1vdmFsIG9uY2Ugbm90aGluZyBkZXBlbmRzIG9uIGl0Ci0gICAgICogQGRlcHJlY2F0ZWQgT3ZlclNjcm9sbGVyJ3MgZmluYWwgcG9zaXRpb24gbWF5IGNoYW5nZSBkdXJpbmcgYW4gYW5pbWF0aW9uLgotICAgICAqICAgICAgICAgICAgIEluc3RlYWQgb2Ygc2V0dGluZyBhIG5ldyBmaW5hbCBwb3NpdGlvbiBhbmQgZXh0ZW5kaW5nCi0gICAgICogICAgICAgICAgICAgdGhlIGR1cmF0aW9uIG9mIGFuIGV4aXN0aW5nIHNjcm9sbCwgdXNlIHN0YXJ0U2Nyb2xsCi0gICAgICogICAgICAgICAgICAgdG8gYmVnaW4gYSBuZXcgYW5pbWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsWChpbnQgbmV3WCkgewotICAgICAgICBtU2Nyb2xsZXJYLnNldEZpbmFsUG9zaXRpb24obmV3WCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmluYWwgcG9zaXRpb24gKFkpIGZvciB0aGlzIHNjcm9sbGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld1kgVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICogQHNlZSAjZXh0ZW5kRHVyYXRpb24oaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWChpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXIncyBmaW5hbCBwb3NpdGlvbiBtYXkgY2hhbmdlIGR1cmluZyBhbiBhbmltYXRpb24uCi0gICAgICogICAgICAgICAgICAgSW5zdGVhZCBvZiBzZXR0aW5nIGEgbmV3IGZpbmFsIHBvc2l0aW9uIGFuZCBleHRlbmRpbmcKLSAgICAgKiAgICAgICAgICAgICB0aGUgZHVyYXRpb24gb2YgYW4gZXhpc3Rpbmcgc2Nyb2xsLCB1c2Ugc3RhcnRTY3JvbGwKLSAgICAgKiAgICAgICAgICAgICB0byBiZWdpbiBhIG5ldyBhbmltYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxZKGludCBuZXdZKSB7Ci0gICAgICAgIG1TY3JvbGxlclkuc2V0RmluYWxQb3NpdGlvbihuZXdZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBrbm93IHRoZSBuZXcgbG9jYXRpb24uIElmIGl0IHJldHVybnMgdHJ1ZSwgdGhlCi0gICAgICogYW5pbWF0aW9uIGlzIG5vdCB5ZXQgZmluaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tcHV0ZVNjcm9sbE9mZnNldCgpIHsKLSAgICAgICAgaWYgKGlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICAgICAgY2FzZSBTQ1JPTExfTU9ERToKLSAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIC8vIEFueSBzY3JvbGxlciBjYW4gYmUgdXNlZCBmb3IgdGltZSwgc2luY2UgdGhleSB3ZXJlIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICAvLyB0b2dldGhlciBpbiBzY3JvbGwgbW9kZS4gV2UgdXNlIFggaGVyZS4KLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRUaW1lID0gdGltZSAtIG1TY3JvbGxlclgubVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBkdXJhdGlvbiA9IG1TY3JvbGxlclgubUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmIChlbGFwc2VkVGltZSA8IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHEgPSAoZmxvYXQpIChlbGFwc2VkVGltZSkgLyBkdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUludGVycG9sYXRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IFNjcm9sbGVyLnZpc2NvdXNGbHVpZChxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IG1JbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihxKTsKLQotICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLnVwZGF0ZVNjcm9sbChxKTsKLSAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS51cGRhdGVTY3JvbGwocSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWJvcnRBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRkxJTkdfTU9ERToKLSAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclgubUZpbmlzaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWC51cGRhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJYLmNvbnRpbnVlV2hlbkZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLmZpbmlzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclkudXBkYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWS5jb250aW51ZVdoZW5GaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5maW5pc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJ5IHByb3ZpZGluZyBhIHN0YXJ0aW5nIHBvaW50IGFuZCB0aGUgZGlzdGFuY2UgdG8gdHJhdmVsLgotICAgICAqIFRoZSBzY3JvbGwgd2lsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMjUwIG1pbGxpc2Vjb25kcyBmb3IgdGhlCi0gICAgICogZHVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgZHgsIGludCBkeSkgewotICAgICAgICBzdGFydFNjcm9sbChzdGFydFgsIHN0YXJ0WSwgZHgsIGR5LCBERUZBVUxUX0RVUkFUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBzY3JvbGxpbmcgYnkgcHJvdmlkaW5nIGEgc3RhcnRpbmcgcG9pbnQgYW5kIHRoZSBkaXN0YW5jZSB0byB0cmF2ZWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTY3JvbGwoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IGR4LCBpbnQgZHksIGludCBkdXJhdGlvbikgewotICAgICAgICBtTW9kZSA9IFNDUk9MTF9NT0RFOwotICAgICAgICBtU2Nyb2xsZXJYLnN0YXJ0U2Nyb2xsKHN0YXJ0WCwgZHgsIGR1cmF0aW9uKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zdGFydFNjcm9sbChzdGFydFksIGR5LCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIHdoZW4geW91IHdhbnQgdG8gJ3NwcmluZyBiYWNrJyBpbnRvIGEgdmFsaWQgY29vcmRpbmF0ZSByYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydFggU3RhcnRpbmcgWCBjb29yZGluYXRlCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyBZIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gbWluWCBNaW5pbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWluWSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzcHJpbmdiYWNrIHdhcyBpbml0aWF0ZWQsIGZhbHNlIGlmIHN0YXJ0WCBhbmQgc3RhcnRZIHdlcmUKLSAgICAgKiAgICAgICAgICBhbHJlYWR5IHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3ByaW5nQmFjayhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgbWluWCwgaW50IG1heFgsIGludCBtaW5ZLCBpbnQgbWF4WSkgewotICAgICAgICBtTW9kZSA9IEZMSU5HX01PREU7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGJvdGggbWV0aG9kcyBhcmUgY2FsbGVkLgotICAgICAgICBmaW5hbCBib29sZWFuIHNwaW5nYmFja1ggPSBtU2Nyb2xsZXJYLnNwcmluZ2JhY2soc3RhcnRYLCBtaW5YLCBtYXhYKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzcGluZ2JhY2tZID0gbVNjcm9sbGVyWS5zcHJpbmdiYWNrKHN0YXJ0WSwgbWluWSwgbWF4WSk7Ci0gICAgICAgIHJldHVybiBzcGluZ2JhY2tYIHx8IHNwaW5nYmFja1k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmxpbmcoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IHZlbG9jaXR5WCwgaW50IHZlbG9jaXR5WSwKLSAgICAgICAgICAgIGludCBtaW5YLCBpbnQgbWF4WCwgaW50IG1pblksIGludCBtYXhZKSB7Ci0gICAgICAgIGZsaW5nKHN0YXJ0WCwgc3RhcnRZLCB2ZWxvY2l0eVgsIHZlbG9jaXR5WSwgbWluWCwgbWF4WCwgbWluWSwgbWF4WSwgMCwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJhc2VkIG9uIGEgZmxpbmcgZ2VzdHVyZS4gVGhlIGRpc3RhbmNlIHRyYXZlbGVkIHdpbGwKLSAgICAgKiBkZXBlbmQgb24gdGhlIGluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0WCBTdGFydGluZyBwb2ludCBvZiB0aGUgc2Nyb2xsIChYKQotICAgICAqIEBwYXJhbSBzdGFydFkgU3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNjcm9sbCAoWSkKLSAgICAgKiBAcGFyYW0gdmVsb2NpdHlYIEluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nIChYKSBtZWFzdXJlZCBpbiBwaXhlbHMgcGVyCi0gICAgICogICAgICAgICAgICBzZWNvbmQuCi0gICAgICogQHBhcmFtIHZlbG9jaXR5WSBJbml0aWFsIHZlbG9jaXR5IG9mIHRoZSBmbGluZyAoWSkgbWVhc3VyZWQgaW4gcGl4ZWxzIHBlcgotICAgICAqICAgICAgICAgICAgc2Vjb25kCi0gICAgICogQHBhcmFtIG1pblggTWluaW11bSBYIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJYID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1pblggYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIFggdmFsdWUuIFRoZSBzY3JvbGxlciB3aWxsIG5vdCBzY3JvbGwgcGFzdCB0aGlzIHBvaW50Ci0gICAgICogICAgICAgICAgICB1bmxlc3Mgb3ZlclggPiAwLiBJZiBvdmVyZmxpbmcgaXMgYWxsb3dlZCwgaXQgd2lsbCB1c2UgbWF4WCBhcwotICAgICAqICAgICAgICAgICAgYSBzcHJpbmdiYWNrIGJvdW5kYXJ5LgotICAgICAqIEBwYXJhbSBtaW5ZIE1pbmltdW0gWSB2YWx1ZS4gVGhlIHNjcm9sbGVyIHdpbGwgbm90IHNjcm9sbCBwYXN0IHRoaXMgcG9pbnQKLSAgICAgKiAgICAgICAgICAgIHVubGVzcyBvdmVyWSA+IDAuIElmIG92ZXJmbGluZyBpcyBhbGxvd2VkLCBpdCB3aWxsIHVzZSBtaW5ZIGFzCi0gICAgICogICAgICAgICAgICBhIHNwcmluZ2JhY2sgYm91bmRhcnkuCi0gICAgICogQHBhcmFtIG1heFkgTWF4aW11bSBZIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJZID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1heFkgYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gb3ZlclggT3ZlcmZsaW5nIHJhbmdlLiBJZiA+IDAsIGhvcml6b250YWwgb3ZlcmZsaW5nIGluIGVpdGhlcgotICAgICAqICAgICAgICAgICAgZGlyZWN0aW9uIHdpbGwgYmUgcG9zc2libGUuCi0gICAgICogQHBhcmFtIG92ZXJZIE92ZXJmbGluZyByYW5nZS4gSWYgPiAwLCB2ZXJ0aWNhbCBvdmVyZmxpbmcgaW4gZWl0aGVyCi0gICAgICogICAgICAgICAgICBkaXJlY3Rpb24gd2lsbCBiZSBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbGluZyhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgdmVsb2NpdHlYLCBpbnQgdmVsb2NpdHlZLAotICAgICAgICAgICAgaW50IG1pblgsIGludCBtYXhYLCBpbnQgbWluWSwgaW50IG1heFksIGludCBvdmVyWCwgaW50IG92ZXJZKSB7Ci0gICAgICAgIG1Nb2RlID0gRkxJTkdfTU9ERTsKLSAgICAgICAgbVNjcm9sbGVyWC5mbGluZyhzdGFydFgsIHZlbG9jaXR5WCwgbWluWCwgbWF4WCwgb3ZlclgpOwotICAgICAgICBtU2Nyb2xsZXJZLmZsaW5nKHN0YXJ0WSwgdmVsb2NpdHlZLCBtaW5ZLCBtYXhZLCBvdmVyWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBzY3JvbGxlciB0aGF0IHdlJ3ZlIHJlYWNoZWQgYSBob3Jpem9udGFsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNpdGlvbiB0aGUgY3VycmVudCBtb3Rpb24gYW5kCi0gICAgICogYW5pbWF0ZSBmcm9tIHN0YXJ0WCB0byBmaW5hbFggYXMgYXBwcm9wcmlhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nL2N1cnJlbnQgWCBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFggRGVzaXJlZCBmaW5hbCBYIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJYIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFguIEFic29sdXRlIHZhbHVlIC0gbXVzdCBiZSBwb3NpdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlIb3Jpem9udGFsRWRnZVJlYWNoZWQoaW50IHN0YXJ0WCwgaW50IGZpbmFsWCwgaW50IG92ZXJYKSB7Ci0gICAgICAgIG1TY3JvbGxlclgubm90aWZ5RWRnZVJlYWNoZWQoc3RhcnRYLCBmaW5hbFgsIG92ZXJYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIHNjcm9sbGVyIHRoYXQgd2UndmUgcmVhY2hlZCBhIHZlcnRpY2FsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYW5pbWF0ZSBhIHBhcmFib2xpYyBtb3Rpb24gZnJvbQotICAgICAqIHN0YXJ0WSB0byBmaW5hbFkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRZIFN0YXJ0aW5nL2N1cnJlbnQgWSBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFkgRGVzaXJlZCBmaW5hbCBZIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJZIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZChpbnQgc3RhcnRZLCBpbnQgZmluYWxZLCBpbnQgb3ZlclkpIHsKLSAgICAgICAgbVNjcm9sbGVyWS5ub3RpZnlFZGdlUmVhY2hlZChzdGFydFksIGZpbmFsWSwgb3ZlclkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBTY3JvbGxlciBpcyBjdXJyZW50bHkgcmV0dXJuaW5nIHRvIGEgdmFsaWQgcG9zaXRpb24uCi0gICAgICogVmFsaWQgYm91bmRzIHdlcmUgcHJvdmlkZWQgYnkgdGhlCi0gICAgICoge0BsaW5rICNmbGluZyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBPbmUgc2hvdWxkIGNoZWNrIHRoaXMgdmFsdWUgYmVmb3JlIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI3N0YXJ0U2Nyb2xsKGludCwgaW50LCBpbnQsIGludCl9IGFzIHRoZSBpbnRlcnBvbGF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAqIHRvIHJlc3RvcmUgYSB2YWxpZCBwb3NpdGlvbiB3aWxsIHRoZW4gYmUgc3RvcHBlZC4gVGhlIGNhbGxlciBoYXMgdG8gdGFrZSBpbnRvIGFjY291bnQKLSAgICAgKiB0aGUgZmFjdCB0aGF0IHRoZSBzdGFydGVkIHNjcm9sbCB3aWxsIHN0YXJ0IGZyb20gYW4gb3ZlcnNjcm9sbGVkIHBvc2l0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgb3ZlcnNjcm9sbGVkIGFuZCBpbiB0aGUgcHJvY2VzcyBvZgotICAgICAqICAgICAgICAgaW50ZXJwb2xhdGluZyBiYWNrIHRvIGEgdmFsaWQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPdmVyU2Nyb2xsZWQoKSB7Ci0gICAgICAgIHJldHVybiAoKCFtU2Nyb2xsZXJYLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgIG1TY3JvbGxlclgubVN0YXRlICE9IE1hZ25ldGljT3ZlclNjcm9sbGVyLlRPX0VER0UpIHx8Ci0gICAgICAgICAgICAgICAgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5tU3RhdGUgIT0gTWFnbmV0aWNPdmVyU2Nyb2xsZXIuVE9fRURHRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3BzIHRoZSBhbmltYXRpb24uIENvbnRyYXJ5IHRvIHtAbGluayAjZm9yY2VGaW5pc2hlZChib29sZWFuKX0sCi0gICAgICogYWJvcnRpbmcgdGhlIGFuaW1hdGluZyBjYXVzZXMgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbnMuCi0gICAgICoKLSAgICAgKiBAc2VlICNmb3JjZUZpbmlzaGVkKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRBbmltYXRpb24oKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZmluaXNoKCk7Ci0gICAgICAgIG1TY3JvbGxlclkuZmluaXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjcm9sbGluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgdGltZVBhc3NlZCgpIHsKLSAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBNYXRoLm1pbihtU2Nyb2xsZXJYLm1TdGFydFRpbWUsIG1TY3JvbGxlclkubVN0YXJ0VGltZSk7Ci0gICAgICAgIHJldHVybiAoaW50KSAodGltZSAtIHN0YXJ0VGltZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIE1hZ25ldGljT3ZlclNjcm9sbGVyIHsKLSAgICAgICAgLy8gSW5pdGlhbCBwb3NpdGlvbgotICAgICAgICBpbnQgbVN0YXJ0OwotCi0gICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgaW50IG1DdXJyZW50UG9zaXRpb247Ci0KLSAgICAgICAgLy8gRmluYWwgcG9zaXRpb24KLSAgICAgICAgaW50IG1GaW5hbDsKLQotICAgICAgICAvLyBJbml0aWFsIHZlbG9jaXR5Ci0gICAgICAgIGludCBtVmVsb2NpdHk7Ci0KLSAgICAgICAgLy8gQ3VycmVudCB2ZWxvY2l0eQotICAgICAgICBmbG9hdCBtQ3VyclZlbG9jaXR5OwotCi0gICAgICAgIC8vIENvbnN0YW50IGN1cnJlbnQgZGVjZWxlcmF0aW9uCi0gICAgICAgIGZsb2F0IG1EZWNlbGVyYXRpb247Ci0KLSAgICAgICAgLy8gQW5pbWF0aW9uIHN0YXJ0aW5nIHRpbWUsIGluIHN5c3RlbSBtaWxsaXNlY29uZHMKLSAgICAgICAgbG9uZyBtU3RhcnRUaW1lOwotCi0gICAgICAgIC8vIEFuaW1hdGlvbiBkdXJhdGlvbiwgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgIGludCBtRHVyYXRpb247Ci0KLSAgICAgICAgLy8gV2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAgICBib29sZWFuIG1GaW5pc2hlZDsKLQotICAgICAgICAvLyBDb25zdGFudCBncmF2aXR5IHZhbHVlLCB1c2VkIHRvIHNjYWxlIGRlY2VsZXJhdGlvbgotICAgICAgICBzdGF0aWMgZmxvYXQgR1JBVklUWTsKLQotICAgICAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplRnJvbUNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBwcGkgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSAqIDE2MC4wZjsKLSAgICAgICAgICAgIEdSQVZJVFkgPSBTZW5zb3JNYW5hZ2VyLkdSQVZJVFlfRUFSVEggLy8gZyAobS9zXjIpCi0gICAgICAgICAgICAgICAgICAgICogMzkuMzdmIC8vIGluY2gvbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgKiBwcGkgLy8gcGl4ZWxzIHBlciBpbmNoCi0gICAgICAgICAgICAgICAgICAgICogVmlld0NvbmZpZ3VyYXRpb24uZ2V0U2Nyb2xsRnJpY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT19FREdFID0gMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5EQVJZID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5DRSA9IDI7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gVE9fRURHRTsKLQotICAgICAgICAvLyBUaGUgYWxsb3dlZCBvdmVyc2hvdCBkaXN0YW5jZSBiZWZvcmUgYm91bmRhcnkgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBpbnQgbU92ZXI7Ci0KLSAgICAgICAgLy8gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRvIGdvIGJhY2sgZnJvbSBlZGdlIHRvIGVkZ2UuIFNwcmluZ2JhY2sgaXMgaGFsZiBvZiBpdC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfU1BSSU5HQkFDS19EVVJBVElPTiA9IDIwMDsKLQotICAgICAgICAvLyBPc2NpbGxhdGlvbiBwZXJpb2QKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVElNRV9DT0VGID0KLSAgICAgICAgICAgIDEwMDAuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT047Ci0KLSAgICAgICAgLy8gSWYgdGhlIHZlbG9jaXR5IGlzIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLCBubyBib3VuY2UgaXMgdHJpZ2dlcmVkCi0gICAgICAgIC8vIHdoZW4gdGhlIGVkZ2UgbGltaXRzIGFyZSByZWFjaGVkICh3b3VsZCByZXN1bHQgaW4gYSB6ZXJvIHBpeGVscwotICAgICAgICAvLyBkaXNwbGFjZW1lbnQgYW55d2F5KS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOSU1VTV9WRUxPQ0lUWV9GT1JfQk9VTkNFID0gRmxvYXQuTUFYX1ZBTFVFOy8vMTQwLjBmOwotCi0gICAgICAgIC8vIFByb3BvcnRpb24gb2YgdGhlIHZlbG9jaXR5IHRoYXQgaXMgcHJlc2VydmVkIHdoZW4gdGhlIGVkZ2UgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQgPSAwLjE2ZjsKLQotICAgICAgICBwcml2YXRlIGZsb2F0IG1Cb3VuY2VDb2VmZmljaWVudCA9IERFRkFVTFRfQk9VTkNFX0NPRUZGSUNJRU5UOwotCi0gICAgICAgIE1hZ25ldGljT3ZlclNjcm9sbGVyKCkgewotICAgICAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlU2Nyb2xsKGZsb2F0IHEpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24gPSBtU3RhcnQgKyBNYXRoLnJvdW5kKHEgKiAobUZpbmFsIC0gbVN0YXJ0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgYSBzaWduZWQgZGVjZWxlcmF0aW9uIHRoYXQgd2lsbCByZWR1Y2UgdGhlIHZlbG9jaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGZsb2F0IGdldERlY2VsZXJhdGlvbihpbnQgdmVsb2NpdHkpIHsKLSAgICAgICAgICAgIHJldHVybiB2ZWxvY2l0eSA+IDAgPyAtR1JBVklUWSA6IEdSQVZJVFk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGl0IHdpbGwgdGFrZSB0byBnbyBmcm9tIHN0YXJ0IHRvIGVuZC4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBpbnQgY29tcHV0ZUR1cmF0aW9uKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgaW5pdGlhbFZlbG9jaXR5LCBmbG9hdCBkZWNlbGVyYXRpb24pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IHN0YXJ0IC0gZW5kOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZGlzY3JpbWluYW50ID0gaW5pdGlhbFZlbG9jaXR5ICogaW5pdGlhbFZlbG9jaXR5IC0gMi4wZiAqIGRlY2VsZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAqIGRpc3RhbmNlOwotICAgICAgICAgICAgaWYgKGRpc2NyaW1pbmFudCA+PSAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZGVsdGEgPSAoZmxvYXQpIE1hdGguc3FydChkaXNjcmltaW5hbnQpOwotICAgICAgICAgICAgICAgIGlmIChkZWNlbGVyYXRpb24gPCAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgKDEwMDAuMGYgKiAoLWluaXRpYWxWZWxvY2l0eSAtIGRlbHRhKSAvIGRlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVuZCBwb3NpdGlvbiBjYW4gbm90IGJlIHJlYWNoZWQKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnQsIGludCBkaXN0YW5jZSwgaW50IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCArIGRpc3RhbmNlOwotCi0gICAgICAgICAgICBtU3RhcnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotCi0gICAgICAgICAgICAvLyBVbnVzZWQKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSAwLjBmOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmxpbmcoaW50IHN0YXJ0LCBpbnQgdmVsb2NpdHksIGludCBtaW4sIGludCBtYXgpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICBtVmVsb2NpdHkgPSB2ZWxvY2l0eTsKLQotICAgICAgICAgICAgbURlY2VsZXJhdGlvbiA9IGdldERlY2VsZXJhdGlvbih2ZWxvY2l0eSk7Ci0KLSAgICAgICAgICAgIC8vIEEgc3RhcnQgZnJvbSBhbiBpbnZhbGlkIHBvc2l0aW9uIGltbWVkaWF0ZWx5IGJyaW5ncyBiYWNrIHRvIGEgdmFsaWQgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1heDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIER1cmF0aW9uIGFyZSBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoLTEwMDAuMGYgKiB2ZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotCi0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCAtIE1hdGgucm91bmQoKHZlbG9jaXR5ICogdmVsb2NpdHkpIC8gKDIuMGYgKiBtRGVjZWxlcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIENsYW1wIHRvIGEgdmFsaWQgZmluYWwgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtRmluYWwgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtaW47Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWluLCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUZpbmFsID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbWF4OwotICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IGNvbXB1dGVEdXJhdGlvbihtU3RhcnQsIG1heCwgbVZlbG9jaXR5LCBtRGVjZWxlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmluaXNoKCkgewotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1GaW5hbDsKLSAgICAgICAgICAgIC8vIE5vdCByZXNldCBzaW5jZSBXZWJWaWV3IHJlbGllcyBvbiB0aGlzIHZhbHVlIGZvciBmYXN0IGZsaW5nLgotICAgICAgICAgICAgLy8gbUN1cnJWZWxvY2l0eSA9IDAuMGY7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRGaW5hbFBvc2l0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgbUZpbmFsID0gcG9zaXRpb247Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXh0ZW5kRHVyYXRpb24oaW50IGV4dGVuZCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBlbGFwc2VkVGltZSA9IChpbnQpICh0aW1lIC0gbVN0YXJ0VGltZSk7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBlbGFwc2VkVGltZSArIGV4dGVuZDsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRCb3VuY2VDb2VmZmljaWVudChmbG9hdCBjb2VmZmljaWVudCkgewotICAgICAgICAgICAgbUJvdW5jZUNvZWZmaWNpZW50ID0gY29lZmZpY2llbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHNwcmluZ2JhY2soaW50IHN0YXJ0LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IDA7Ci0KLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gMDsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKHN0YXJ0LCBtaW4sIGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBzdGFydFNwcmluZ2JhY2soc3RhcnQsIG1heCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAhbUZpbmlzaGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U3ByaW5nYmFjayhpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gcG9zaXRpdmUpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkNFOwotICAgICAgICAgICAgbVN0YXJ0ID0gbUZpbmFsID0gZW5kOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgbVN0YXJ0VGltZSAtPSBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT04gLyAyOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKE1hdGguYWJzKGVuZCAtIHN0YXJ0KSAqIFRJTUVfQ09FRiAqIChwb3NpdGl2ZSA/IDEuMCA6IC0xLjBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGZsaW5nKGludCBzdGFydCwgaW50IHZlbG9jaXR5LCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgb3ZlcikgewotICAgICAgICAgICAgbVN0YXRlID0gVE9fRURHRTsKLSAgICAgICAgICAgIG1PdmVyID0gb3ZlcjsKLQotICAgICAgICAgICAgbUZpbmlzaGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1TdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IHZlbG9jaXR5OwotCi0gICAgICAgICAgICBtRGVjZWxlcmF0aW9uID0gZ2V0RGVjZWxlcmF0aW9uKHZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gRHVyYXRpb24gYXJlIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIHZlbG9jaXR5IC8gbURlY2VsZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIG1GaW5hbCA9IHN0YXJ0IC0gTWF0aC5yb3VuZCgodmVsb2NpdHkgKiB2ZWxvY2l0eSkgLyAoMi4wZiAqIG1EZWNlbGVyYXRpb24pKTsKLQotICAgICAgICAgICAgLy8gQ2xhbXAgdG8gYSB2YWxpZCBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgaWYgKG1GaW5hbCA8IG1pbikgewotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBjb21wdXRlRHVyYXRpb24obVN0YXJ0LCBtaW4sIG1WZWxvY2l0eSwgbURlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRmluYWwgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtYXg7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWF4LCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gbWF4ICsgb3ZlcikgewotICAgICAgICAgICAgICAgICAgICBzcHJpbmdiYWNrKG1heCArIG92ZXIsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhzdGFydCwgbWluLCBtYXgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBkdXJhdGlvblNpbmNlRWRnZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hdGFuKChzdGFydC1tYXgpICogVElNRV9DT0VGIC8gdmVsb2NpdHkpIC8gVElNRV9DT0VGOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgYSBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ID0gbWF4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvbkVkZ2VSZWFjaGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IG1pbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPD0gbWluIC0gb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhtaW4gLSBvdmVyLCBtaW4sIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ2JhY2soc3RhcnQsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgZHVyYXRpb25TaW5jZUVkZ2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmF0YW4oKHN0YXJ0LW1pbikgKiBUSU1FX0NPRUYgLyB2ZWxvY2l0eSkgLyBUSU1FX0NPRUY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIGEgYm91bmNlIHRoYXQgc3RhcnRlZCBmcm9tIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgPSBtaW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG5vdGlmeUVkZ2VSZWFjaGVkKGludCBzdGFydCwgaW50IGVuZCwgaW50IG92ZXIpIHsKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSBnZXREZWNlbGVyYXRpb24obVZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gTG9jYWwgdGltZSwgdXNlZCB0byBjb21wdXRlIGVkZ2UgY3Jvc3NpbmcgdGltZS4KLSAgICAgICAgICAgIGZsb2F0IHRpbWVDdXJyZW50ID0gbUN1cnJWZWxvY2l0eSAvIG1EZWNlbGVyYXRpb247Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2UgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIGZsb2F0IHRpbWVFZGdlID0gLShmbG9hdCkgTWF0aC5zcXJ0KCgyLjBmICogZGlzdGFuY2UgLyBtRGVjZWxlcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICArICh0aW1lQ3VycmVudCAqIHRpbWVDdXJyZW50KSk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtRGVjZWxlcmF0aW9uICogdGltZUVkZ2UpOwotCi0gICAgICAgICAgICAvLyBTaW11bGF0ZSBhIHN5bW1ldHJpYyBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgbVN0YXJ0ID0gZW5kOwotCi0gICAgICAgICAgICBtT3ZlciA9IG92ZXI7Ci0KLSAgICAgICAgICAgIGxvbmcgdGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gKGludCkgKHRpbWUgLSAxMDAwLjBmICogKHRpbWVDdXJyZW50IC0gdGltZUVkZ2UpKTsKLQotICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uRWRnZVJlYWNoZWQoKSB7Ci0gICAgICAgICAgICAvLyBtU3RhcnQsIG1WZWxvY2l0eSBhbmQgbVN0YXJ0VGltZSB3ZXJlIGFkanVzdGVkIHRvIHRoZWlyIHZhbHVlcyB3aGVuIGVkZ2Ugd2FzIHJlYWNoZWQuCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBkaXN0YW5jZSA9IG1WZWxvY2l0eSAvIFRJTUVfQ09FRjsKLQotICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlKSA8IG1PdmVyKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3ByaW5nIGZvcmNlIHdpbGwgYnJpbmcgdXMgYmFjayB0byBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRPX0JPVU5DRTsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtU3RhcnQ7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBWZWxvY2l0eSBpcyB0b28gaGlnaCwgd2Ugd2lsbCBoaXQgdGhlIGJvdW5kYXJ5IGxpbWl0Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkRBUlk7Ci0gICAgICAgICAgICAgICAgaW50IG92ZXIgPSBtVmVsb2NpdHkgPiAwID8gbU92ZXIgOiAtbU92ZXI7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbVN0YXJ0ICsgb3ZlcjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoMTAwMC4wZiAqIE1hdGguYXNpbihvdmVyIC8gZGlzdGFuY2UpIC8gVElNRV9DT0VGKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY29udGludWVXaGVuRmluaXNoZWQoKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgVE9fRURHRToKLSAgICAgICAgICAgICAgICAgICAgLy8gRHVyYXRpb24gZnJvbSBzdGFydCB0byBudWxsIHZlbG9jaXR5Ci0gICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIG1WZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobUR1cmF0aW9uIDwgZHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhbmltYXRpb24gd2FzIGNsYW1wZWQsIHdlIHJlYWNoZWQgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCA9IG1GaW5hbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwZWVkIHdoZW4gZWRnZSB3YXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiBtRHVyYXRpb24gLyAxMDAwLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsIHN0b3AsIG5vIG5lZWQgdG8gY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRPX0JPVU5EQVJZOgotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lICs9IG1EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKG1GaW5hbCwgbUZpbmFsIC0gKG1WZWxvY2l0eSA+IDAgPyBtT3ZlcjotbU92ZXIpLCBtVmVsb2NpdHkgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUT19CT1VOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIC8vbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSAqIEJPVU5DRV9DT0VGRklDSUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtVmVsb2NpdHkgKiBtQm91bmNlQ29lZmZpY2llbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobVZlbG9jaXR5KSA8IE1JTklNVU1fVkVMT0NJVFlfRk9SX0JPVU5DRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdmVsb2NpdHkgZm9yIGN1cnJlbnQgdGltZS4gUmV0dXJucwotICAgICAgICAgKiB0cnVlIGlmIHVwZGF0ZSBoYXMgYmVlbiBkb25lIGFuZCBmYWxzZSBpZiBhbmltYXRpb24gZHVyYXRpb24gaGFzIGJlZW4KLSAgICAgICAgICogcmVhY2hlZC4KLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlKCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24gPSB0aW1lIC0gbVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gbUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkb3VibGUgZGlzdGFuY2U7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB0ID0gZHVyYXRpb24gLyAxMDAwLjBmOwotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBUT19FREdFKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJWZWxvY2l0eSA9IG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiB0OwotICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gbVZlbG9jaXR5ICogdCArIG1EZWNlbGVyYXRpb24gKiB0ICogdCAvIDIuMGY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGQgPSB0ICogVElNRV9DT0VGOwotICAgICAgICAgICAgICAgIG1DdXJyVmVsb2NpdHkgPSBtVmVsb2NpdHkgKiAoZmxvYXQpTWF0aC5jb3MoZCk7Ci0gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBtVmVsb2NpdHkgLyBUSU1FX0NPRUYgKiBNYXRoLnNpbihkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1TdGFydCArIChpbnQpIGRpc3RhbmNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NzBhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cE1lbnUuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBBIFBvcHVwTWVudSBkaXNwbGF5cyBhIHtAbGluayBNZW51fSBpbiBhIG1vZGFsIHBvcHVwIHdpbmRvdyBhbmNob3JlZCB0byBhIHtAbGluayBWaWV3fS4KKyAqIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIHZpZXcgaWYgdGhlcmUgaXMgcm9vbSwgb3IgYWJvdmUgaXQgaWYgdGhlcmUgaXMgbm90LgorICogSWYgdGhlIElNRSBpcyB2aXNpYmxlIHRoZSBwb3B1cCB3aWxsIG5vdCBvdmVybGFwIGl0IHVudGlsIGl0IGlzIHRvdWNoZWQuIFRvdWNoaW5nIG91dHNpZGUKKyAqIG9mIHRoZSBwb3B1cCB3aWxsIGRpc21pc3MgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1cE1lbnUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgcHJpdmF0ZSBWaWV3IG1BbmNob3I7CisgICAgcHJpdmF0ZSBNZW51UG9wdXBIZWxwZXIgbVBvcHVwOworICAgIHByaXZhdGUgT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbU1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQb3B1cE1lbnUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgUG9wdXBNZW51LgorICAgICAqIEBwYXJhbSBhbmNob3IgQW5jaG9yIHZpZXcgZm9yIHRoaXMgcG9wdXAuIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIGlmIHRoZXJlCisgICAgICogICAgICAgICAgICAgICBpcyByb29tLCBvciBhYm92ZSBpdCBpZiB0aGVyZSBpcyBub3QuCisgICAgICovCisgICAgcHVibGljIFBvcHVwTWVudShDb250ZXh0IGNvbnRleHQsIFZpZXcgYW5jaG9yKSB7CisgICAgICAgIC8vIFRPRE8gVGhlbWU/CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBuZXcgTWVudUJ1aWxkZXIoY29udGV4dCk7CisgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBtQW5jaG9yID0gYW5jaG9yOworICAgICAgICBtUG9wdXAgPSBuZXcgTWVudVBvcHVwSGVscGVyKGNvbnRleHQsIG1NZW51LCBhbmNob3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBNZW51fSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwb3B1cC4gUG9wdWxhdGUgdGhlIHJldHVybmVkIE1lbnUgd2l0aAorICAgICAqIGl0ZW1zIGJlZm9yZSBjYWxsaW5nIHtAbGluayAjc2hvdygpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqIEBzZWUgI2dldE1lbnVJbmZsYXRlcigpCisgICAgICovCisgICAgcHVibGljIE1lbnUgZ2V0TWVudSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZW51OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTWVudUluZmxhdGVyfSB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZmxhdGUgbWVudSBpdGVtcyBmcm9tIFhNTCBpbnRvIHRoZQorICAgICAqIG1lbnUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRNZW51KCl9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0TWVudSgpCisgICAgICovCisgICAgcHVibGljIE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBtZW51IHBvcHVwIGFuY2hvcmVkIHRvIHRoZSB2aWV3IHNwZWNpZmllZCBkdXJpbmcgY29uc3RydWN0aW9uLgorICAgICAqIEBzZWUgI2Rpc21pc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzbWlzcyB0aGUgbWVudSBwb3B1cC4KKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1NZW51SXRlbUNsaWNrTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtTWVudUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudUl0ZW1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayhpdGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3VycmVudCBtZW51IHdpbGwgYmUgZGlzbWlzc2VkIGJ5IHRoZSBub3JtYWwgaGVscGVyLCBzdWJtZW51IHdpbGwgYmUgc2hvd24gaW4gaXRzIHBsYWNlLgorICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKG1Db250ZXh0LCBzdWJNZW51LCBtQW5jaG9yKS5zaG93KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgbWVudSBpdGVtIGNsaWNrIGV2ZW50cyBpZiB0aGUgaXRlbXMgdGhlbXNlbHZlcworICAgICAqIGRvIG5vdCBoYXZlIGluZGl2aWR1YWwgaXRlbSBjbGljayBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcyBjbGlja2VkIGlmIHRoZSBpdGVtIGl0c2VsZiBkaWQKKyAgICAgICAgICogbm90IGFscmVhZHkgaGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGl0ZW0ge0BsaW5rIE1lbnVJdGVtfSB0aGF0IHdhcyBjbGlja2VkCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKaW5kZXggNzY3NTVkZS4uZTJhNmY3YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKQEAgLTE5LDIyICsxOSwyNCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCkBAIC0xMjQsNyArMTI2LDcgQEAKICAgICBwcml2YXRlIE9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyIG1PblNjcm9sbENoYW5nZWRMaXN0ZW5lciA9CiAgICAgICAgIG5ldyBPblNjcm9sbENoYW5nZWRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBWaWV3IGFuY2hvciA9IG1BbmNob3IuZ2V0KCk7CisgICAgICAgICAgICAgICAgVmlldyBhbmNob3IgPSBtQW5jaG9yICE9IG51bGwgPyBtQW5jaG9yLmdldCgpIDogbnVsbDsKICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IG51bGwgJiYgbVBvcHVwVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHAgPSAoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvcHVwVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKQEAgLTE2MCwxMiArMTYyLDIxIEBACiAgICAgICogPHA+VGhlIHBvcHVwIGRvZXMgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgogICAgICAqLwogICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+Q3JlYXRlIGEgbmV3LCBlbXB0eSwgbm9uIGZvY3VzYWJsZSBwb3B1cCB3aW5kb3cgb2YgZGltZW5zaW9uICgwLDApLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgcG9wdXAgZG9lcyBub3QgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSAoV2luZG93TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwogCiAgICAgICAgIG1CYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5Qb3B1cFdpbmRvd19wb3B1cEJhY2tncm91bmQpOwogCkBAIC0xMTA4LDcgKzExMTksOSBAQAogICAgICAgICAKICAgICAgICAgaW50IGJvdHRvbUVkZ2UgPSBkaXNwbGF5RnJhbWUuYm90dG9tOwogICAgICAgICBpZiAoaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpIHsKLSAgICAgICAgICAgIGJvdHRvbUVkZ2UgPSBhbmNob3IuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGFuY2hvci5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBib3R0b21FZGdlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzIC0KKyAgICAgICAgICAgICAgICAgICAgKGludCkgcmVzLmdldERpbWVuc2lvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnNjcmVlbl9tYXJnaW5fYm90dG9tKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2VUb0JvdHRvbSA9IGJvdHRvbUVkZ2UgLSAoYW5jaG9yUG9zWzFdICsgYW5jaG9yLmdldEhlaWdodCgpKSAtIHlPZmZzZXQ7CiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZVRvVG9wID0gYW5jaG9yUG9zWzFdIC0gZGlzcGxheUZyYW1lLnRvcCArIHlPZmZzZXQ7CkBAIC0xNDAxLDYgKzE0MTQsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBWaWV3Q29udGFpbmVyIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBvcHVwV2luZG93LlBvcHVwVmlld0NvbnRhaW5lciI7CiAKICAgICAgICAgcHVibGljIFBvcHVwVmlld0NvbnRhaW5lcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQppbmRleCBlYzdkOTI3Li4zYTQ0ODdjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQpAQCAtNzE2LDggKzcxNiw4IEBACiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldER1cmF0aW9uKG1EdXJhdGlvbik7CiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0U3RhcnRUaW1lKEFuaW1hdGlvbi5TVEFSVF9PTl9GSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzAsNiArNzMwLDcgQEAKICAgICAgICAgICAgICgoQW5pbWF0YWJsZSkgbUluZGV0ZXJtaW5hdGVEcmF3YWJsZSkuc3RvcCgpOwogICAgICAgICAgICAgbVNob3VsZFN0YXJ0QW5pbWF0aW9uRHJhd2FibGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1F1aWNrQ29udGFjdEJhZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQppbmRleCA0YmJiNTQwLi41NTk4YzY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7CiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQmFkZ2VCYWNrZ3JvdW5kOwogICAgIHByaXZhdGUgRHJhd2FibGUgbU5vQmFkZ2VCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgRHJhd2FibGUgbURlZmF1bHRBdmF0YXI7CiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUV4Y2x1ZGVNaW1lcyA9IG51bGw7CiAKQEAgLTExNyw2ICsxMTgsMTYgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBzaXplKSB7CiAgICAgICAgIG1Nb2RlID0gc2l6ZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjb250YWN0IHBob3RvIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlVG9EZWZhdWx0KCkgeworICAgICAgICBpZiAobURlZmF1bHRBdmF0YXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbURlZmF1bHRBdmF0YXIgPSBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRGVmYXVsdEF2YXRhcik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQXNzaWduIHRoZSBjb250YWN0IHVyaSB0aGF0IHRoaXMgUXVpY2tDb250YWN0QmFkZ2Ugc2hvdWxkIGJlIGFzc29jaWF0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKaW5kZXggN2E3MGM4MC4uOWQyMTRmYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKQEAgLTE2LDcgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuQXBwV2lkZ2V0SG9zdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwpAQCAtMzgsMTMgKzQ2LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmlsdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKIAotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCiAKIC8qKgogICogQSBjbGFzcyB0aGF0IGRlc2NyaWJlcyBhIHZpZXcgaGllcmFyY2h5IHRoYXQgY2FuIGJlIGRpc3BsYXllZCBpbgpAQCAtNjAsMTIgKzYxLDEyIEBACiAgICAgICogVGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBsYXlvdXQgCiAgICAgICogcmVzb3VyY2UuIChBZGRlZCB0byB0aGUgcGFyY2VsKQogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlOwogICAgIAogICAgIC8qKgogICAgICAqIFRoZSByZXNvdXJjZSBJRCBvZiB0aGUgbGF5b3V0IGZpbGUuIChBZGRlZCB0byB0aGUgcGFyY2VsKQogICAgICAqLwotICAgIHByaXZhdGUgaW50IG1MYXlvdXRJZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtTGF5b3V0SWQ7CiAKICAgICAvKioKICAgICAgKiBBbiBhcnJheSBvZiBhY3Rpb25zIHRvIHBlcmZvcm0gb24gdGhlIHZpZXcgdHJlZSBvbmNlIGl0IGhhcyBiZWVuCkBAIC03Myw4ICs3NCwyMiBAQAogICAgICAqLwogICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGlvbj4gbUFjdGlvbnM7CiAgICAgCisgICAgLyoqCisgICAgICogQSBjbGFzcyB0byBrZWVwIHRyYWNrIG9mIG1lbW9yeSB1c2FnZSBieSB0aGlzIFJlbW90ZVZpZXdzCisgICAgICovCisgICAgcHJpdmF0ZSBNZW1vcnlVc2FnZUNvdW50ZXIgbU1lbW9yeVVzYWdlQ291bnRlcjsKKwogICAgIAogICAgIC8qKgorICAgICAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIFJlbW90ZVZpZXdzIG9iamVjdCBpcyBiZWluZyBjcmVhdGVkIGZyb20gYQorICAgICAqIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdXNlIGFzIGEgY2hpbGQgb2YgYSB3aWRnZXQgY29sbGVjdGlvbi4gVGhpcyBmbGFnIGlzIHVzZWQKKyAgICAgKiB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgY2VydGFpbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLCBpbiBwYXJ0aWN1bGFyLAorICAgICAqIHNldHRpbmcgb24gY2xpY2sgZXh0cmFzIGFuZCBzZXR0aW5nIG9uIGNsaWNrIHBlbmRpbmcgaW50ZW50cy4gVGhlIGZvcm1lciBpcyBlbmFibGVkLAorICAgICAqIGFuZCB0aGUgbGF0dGVyIGRpc2FibGVkIHdoZW4gdGhpcyBmbGFnIGlzIHRydWUuCisgICAgICovCisgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNXaWRnZXRDb2xsZWN0aW9uQ2hpbGQgPSBmYWxzZTsKKworICAgIC8qKgogICAgICAqIFRoaXMgYW5ub3RhdGlvbiBpbmRpY2F0ZXMgdGhhdCBhIHN1YmNsYXNzIG9mIFZpZXcgaXMgYWxsbG93ZWQgdG8gYmUgdXNlZAogICAgICAqIHdpdGggdGhlIHtAbGluayBSZW1vdGVWaWV3c30gbWVjaGFuaXNtLgogICAgICAqLwpAQCAtMTA4LDYgKzEyMywyNjYgQEAKICAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGRlbiBieSBlYWNoIGNsYXNzIHRvIHJlcG9ydCBvbiBpdCdzIG93biBtZW1vcnkgdXNhZ2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU1lbW9yeVVzYWdlRXN0aW1hdGUoTWVtb3J5VXNhZ2VDb3VudGVyIGNvdW50ZXIpIHsKKyAgICAgICAgICAgIC8vIFdlIGN1cnJlbnRseSBvbmx5IGNhbGN1bGF0ZSBCaXRtYXAgbWVtb3J5IHVzYWdlLCBzbyBieSBkZWZhdWx0LCBkb24ndCBkbyBhbnl0aGluZworICAgICAgICAgICAgLy8gaGVyZQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTZXRFbXB0eVZpZXcgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBpbnQgZW1wdHlWaWV3SWQ7CisKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEFHID0gNjsKKworICAgICAgICBTZXRFbXB0eVZpZXcoaW50IHZpZXdJZCwgaW50IGVtcHR5Vmlld0lkKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMuZW1wdHlWaWV3SWQgPSBlbXB0eVZpZXdJZDsKKyAgICAgICAgfQorCisgICAgICAgIFNldEVtcHR5VmlldyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5lbXB0eVZpZXdJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh0aGlzLnZpZXdJZCk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5lbXB0eVZpZXdJZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoVmlldyByb290KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3PD8+KSkgcmV0dXJuOworCisgICAgICAgICAgICBBZGFwdGVyVmlldzw/PiBhZGFwdGVyVmlldyA9IChBZGFwdGVyVmlldzw/PikgdmlldzsKKworICAgICAgICAgICAgZmluYWwgVmlldyBlbXB0eVZpZXcgPSByb290LmZpbmRWaWV3QnlJZChlbXB0eVZpZXdJZCk7CisgICAgICAgICAgICBpZiAoZW1wdHlWaWV3ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgYWRhcHRlclZpZXcuc2V0RW1wdHlWaWV3KGVtcHR5Vmlldyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNldE9uQ2xpY2tGaWxsSW5JbnRlbnQgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBwdWJsaWMgU2V0T25DbGlja0ZpbGxJbkludGVudChpbnQgaWQsIEludGVudCBmaWxsSW5JbnRlbnQpIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaWQ7CisgICAgICAgICAgICB0aGlzLmZpbGxJbkludGVudCA9IGZpbGxJbkludGVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXRPbkNsaWNrRmlsbEluSW50ZW50KFBhcmNlbCBwYXJjZWwpIHsKKyAgICAgICAgICAgIHZpZXdJZCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgICAgICBmaWxsSW5JbnRlbnQgPSBJbnRlbnQuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQodmlld0lkKTsKKyAgICAgICAgICAgIGZpbGxJbkludGVudC53cml0ZVRvUGFyY2VsKGRlc3QsIDAgLyogbm8gZmxhZ3MgKi8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgeworICAgICAgICAgICAgZmluYWwgVmlldyB0YXJnZXQgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworCisgICAgICAgICAgICBpZiAoIW1Jc1dpZGdldENvbGxlY3Rpb25DaGlsZCkgeworICAgICAgICAgICAgICAgIExvZy5lKCJSZW1vdGVWaWV3cyIsICJUaGUgbWV0aG9kIHNldE9uQ2xpY2tGaWxsSW5JbnRlbnQgaXMgYXZhaWxhYmxlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgZnJvbSBSZW1vdGVWaWV3c0ZhY3RvcnkgKGllLiBvbiBjb2xsZWN0aW9uIGl0ZW1zKS4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiBmaWxsSW5JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnN1cmUgdGhhdCB0aGlzIHZpZXcgaXMgYSBjaGlsZCBvZiBhbiBBZGFwdGVyVmlldworICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBwYXJlbnQgPSAoVmlldykgdi5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3PD8+KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIEFwcFdpZGdldEhvc3RWaWV3KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IChWaWV3KSBwYXJlbnQuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBcHBXaWRnZXRIb3N0VmlldykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWVob3cgdGhleSd2ZSBtYW5hZ2VkIHRvIGdldCB0aGlzIGZhciB3aXRob3V0IGhhdmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBBZGFwdGVyVmlldyBhcyBhIHBhcmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZSgiUmVtb3RlVmlld3MiLCAiQ29sbGVjdGlvbiBpdGVtIGRvZXNuJ3QgaGF2ZSBBZGFwdGVyVmlldyBwYXJlbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc3VyZSB0aGF0IGEgdGVtcGxhdGUgcGVuZGluZyBpbnRlbnQgaGFzIGJlZW4gc2V0IG9uIGFuIGFuY2VzdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwYXJlbnQuZ2V0VGFnKCkgaW5zdGFuY2VvZiBQZW5kaW5nSW50ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKCJSZW1vdGVWaWV3cyIsICJBdHRlbXB0aW5nIHNldE9uQ2xpY2tGaWxsSW5JbnRlbnQgd2l0aG91dCIgKworCQkJCQkiIGNhbGxpbmcgc2V0UGVuZGluZ0ludGVudFRlbXBsYXRlIG9uIHBhcmVudC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGVuZGluZ0ludGVudCA9IChQZW5kaW5nSW50ZW50KSBwYXJlbnQuZ2V0VGFnKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGFwcFNjYWxlID0gdi5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21wYXRpYmlsaXR5SW5mbygpLmFwcGxpY2F0aW9uU2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgdi5nZXRMb2NhdGlvbk9uU2NyZWVuKHBvcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQgPSAoaW50KSAocG9zWzBdICogYXBwU2NhbGUgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wID0gKGludCkgKHBvc1sxXSAqIGFwcFNjYWxlICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ID0gKGludCkgKChwb3NbMF0gKyB2LmdldFdpZHRoKCkpICogYXBwU2NhbGUgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tID0gKGludCkgKChwb3NbMV0gKyB2LmdldEhlaWdodCgpKSAqIGFwcFNjYWxlICsgMC41Zik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxJbkludGVudC5zZXRTb3VyY2VCb3VuZHMocmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFVucmVnaXN0ZXIgdGhpcyBoYW5kbGVyIGlmIFBlbmRpbmdJbnRlbnQuRkxBR19PTkVfU0hPVD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmdldENvbnRleHQoKS5zdGFydEludGVudFNlbmRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbnRlbnQuZ2V0SW50ZW50U2VuZGVyKCksIGZpbGxJbkludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0ssIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZShMT0dfVEFHLCAiQ2Fubm90IHNlbmQgcGVuZGluZyBpbnRlbnQ6ICIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRhcmdldC5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHZpZXdJZDsKKyAgICAgICAgSW50ZW50IGZpbGxJbkludGVudDsKKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSA5OworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2V0T25DbGlja0V4dHJhcyBleHRlbmRzIEFjdGlvbiB7CisgICAgICAgIHB1YmxpYyBTZXRPbkNsaWNrRXh0cmFzKGludCBpZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgdGhpcy52aWV3SWQgPSBpZDsKKyAgICAgICAgICAgIHRoaXMuZXh0cmFzID0gZXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldE9uQ2xpY2tFeHRyYXMoUGFyY2VsIHBhcmNlbCkgeworICAgICAgICAgICAgdmlld0lkID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGV4dHJhcyA9IEJ1bmRsZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgZGVzdC53cml0ZUludChUQUcpOworICAgICAgICAgICAgZGVzdC53cml0ZUludCh2aWV3SWQpOworICAgICAgICAgICAgZXh0cmFzLndyaXRlVG9QYXJjZWwoZGVzdCwgMCAvKiBubyBmbGFncyAqLyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoVmlldyByb290KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHRhcmdldCA9IHJvb3QuZmluZFZpZXdCeUlkKHZpZXdJZCk7CisKKyAgICAgICAgICAgIGlmICghbUlzV2lkZ2V0Q29sbGVjdGlvbkNoaWxkKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlJlbW90ZVZpZXdzIiwgIlRoZSBtZXRob2Qgc2V0T25DbGlja0V4dHJhcyBpcyBhdmFpbGFibGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAib25seSBmcm9tIFJlbW90ZVZpZXdzRmFjdG9yeSAoaWUuIG9uIGNvbGxlY3Rpb24gaXRlbXMpLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsICYmIGV4dHJhcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc3VyZSB0aGF0IHRoaXMgdmlldyBpcyBhIGNoaWxkIG9mIGFuIEFkYXB0ZXJWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IHBhcmVudCA9IChWaWV3KSB2LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWRhcHRlclZpZXc8Pz4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICEocGFyZW50IGluc3RhbmNlb2YgQXBwV2lkZ2V0SG9zdFZpZXcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gKFZpZXcpIHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFwcFdpZGdldEhvc3RWaWV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZWhvdyB0aGV5J3ZlIG1hbmFnZWQgdG8gZ2V0IHRoaXMgZmFyIHdpdGhvdXQgaGF2aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIEFkYXB0ZXJWaWV3IGFzIGEgcGFyZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKCJSZW1vdGVWaWV3cyIsICJDb2xsZWN0aW9uIGl0ZW0gZG9lc24ndCBoYXZlIEFkYXB0ZXJWaWV3IHBhcmVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zdXJlIHRoYXQgYSB0ZW1wbGF0ZSBwZW5kaW5nIGludGVudCBoYXMgYmVlbiBzZXQgb24gYW4gYW5jZXN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHBhcmVudC5nZXRUYWcoKSBpbnN0YW5jZW9mIFBlbmRpbmdJbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlJlbW90ZVZpZXdzIiwgIkF0dGVtcHRpbmcgc2V0T25DbGlja0V4dHJhcyB3aXRob3V0IGNhbGxpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRQZW5kaW5nSW50ZW50VGVtcGxhdGUgb24gcGFyZW50LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gKFBlbmRpbmdJbnRlbnQpIHBhcmVudC5nZXRUYWcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgYXBwU2NhbGUgPSB2LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbXBhdGliaWxpdHlJbmZvKCkuYXBwbGljYXRpb25TY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludFtdIHBvcyA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB2LmdldExvY2F0aW9uT25TY3JlZW4ocG9zKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCA9IChpbnQpIChwb3NbMF0gKiBhcHBTY2FsZSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgPSAoaW50KSAocG9zWzFdICogYXBwU2NhbGUgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgPSAoaW50KSAoKHBvc1swXSArIHYuZ2V0V2lkdGgoKSkgKiBhcHBTY2FsZSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSAoaW50KSAoKHBvc1sxXSArIHYuZ2V0SGVpZ2h0KCkpICogYXBwU2NhbGUgKyAwLjVmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5zZXRTb3VyY2VCb3VuZHMocmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVW5yZWdpc3RlciB0aGlzIGhhbmRsZXIgaWYgUGVuZGluZ0ludGVudC5GTEFHX09ORV9TSE9UPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZ2V0Q29udGV4dCgpLnN0YXJ0SW50ZW50U2VuZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ludGVudC5nZXRJbnRlbnRTZW5kZXIoKSwgaW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKExPR19UQUcsICJDYW5ub3Qgc2VuZCBwZW5kaW5nIGludGVudDogIiwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBCdW5kbGUgZXh0cmFzOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRBRyA9IDc7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTZXRQZW5kaW5nSW50ZW50VGVtcGxhdGUgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBwdWJsaWMgU2V0UGVuZGluZ0ludGVudFRlbXBsYXRlKGludCBpZCwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50VGVtcGxhdGUpIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaWQ7CisgICAgICAgICAgICB0aGlzLnBlbmRpbmdJbnRlbnRUZW1wbGF0ZSA9IHBlbmRpbmdJbnRlbnRUZW1wbGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXRQZW5kaW5nSW50ZW50VGVtcGxhdGUoUGFyY2VsIHBhcmNlbCkgeworICAgICAgICAgICAgdmlld0lkID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIHBlbmRpbmdJbnRlbnRUZW1wbGF0ZSA9IFBlbmRpbmdJbnRlbnQucmVhZFBlbmRpbmdJbnRlbnRPck51bGxGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQodmlld0lkKTsKKyAgICAgICAgICAgIHBlbmRpbmdJbnRlbnRUZW1wbGF0ZS53cml0ZVRvUGFyY2VsKGRlc3QsIDAgLyogbm8gZmxhZ3MgKi8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgeworICAgICAgICAgICAgZmluYWwgVmlldyB0YXJnZXQgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgdmlldyBpc24ndCBhbiBBZGFwdGVyVmlldywgc2V0dGluZyBhIFBlbmRpbmdJbnRlbnQgdGVtcGxhdGUgZG9lc24ndCBtYWtlIHNlbnNlCisgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQWRhcHRlclZpZXc8Pz4pIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgUGVuZGluZ0ludGVudCB0ZW1wbGF0ZSBpcyBzdG9yZWQgaW4gdGhlIHZpZXcncyB0YWcuCisgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFRhZyhwZW5kaW5nSW50ZW50VGVtcGxhdGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUmVtb3RlVmlld3MiLCAiQ2Fubm90IHNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZSBvbiBhIHZpZXcgd2hpY2ggaXMgbm90IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiYW4gQWRhcHRlclZpZXcgKGlkOiAiICsgdmlld0lkICsgIikiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnRUZW1wbGF0ZTsKKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSA4OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTIwLDIxICszOTUsMzAgQEAKICAgICAgICAgICAgIHRoaXMudmlld0lkID0gaWQ7CiAgICAgICAgICAgICB0aGlzLnBlbmRpbmdJbnRlbnQgPSBwZW5kaW5nSW50ZW50OwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBTZXRPbkNsaWNrUGVuZGluZ0ludGVudChQYXJjZWwgcGFyY2VsKSB7CiAgICAgICAgICAgICB2aWV3SWQgPSBwYXJjZWwucmVhZEludCgpOwogICAgICAgICAgICAgcGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQucmVhZFBlbmRpbmdJbnRlbnRPck51bGxGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CiAgICAgICAgICAgICBkZXN0LndyaXRlSW50KFRBRyk7CiAgICAgICAgICAgICBkZXN0LndyaXRlSW50KHZpZXdJZCk7CiAgICAgICAgICAgICBwZW5kaW5nSW50ZW50LndyaXRlVG9QYXJjZWwoZGVzdCwgMCAvKiBubyBmbGFncyAqLyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgewogICAgICAgICAgICAgZmluYWwgVmlldyB0YXJnZXQgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgdmlldyBpcyBhbiBBZGFwdGVyVmlldywgc2V0dGluZyBhIFBlbmRpbmdJbnRlbnQgb24gY2xpY2sgZG9lc24ndCBtYWtlIG11Y2gKKyAgICAgICAgICAgIC8vIHNlbnNlLCBkbyB0aGV5IG1lYW4gdG8gc2V0IGEgUGVuZGluZ0ludGVudCB0ZW1wbGF0ZSBmb3IgdGhlIEFkYXB0ZXJWaWV3J3MgY2hpbGRyZW4/CisgICAgICAgICAgICBpZiAobUlzV2lkZ2V0Q29sbGVjdGlvbkNoaWxkKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlJlbW90ZVZpZXdzIiwgIkNhbm5vdCBzZXRPbkNsaWNrUGVuZGluZ0ludGVudCBmb3IgY29sbGVjdGlvbiBpdGVtICIgKworCQkJCSIoaWQ6ICIgKyB2aWV3SWQgKyAiKSIpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldHVybjsgV2UnbGwgbGV0IHRoaXMgc2xpZGUgdW50aWwgYXBwcyBhcmUgdXAgdG8gZGF0ZS4KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsICYmIHBlbmRpbmdJbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CkBAIC0yNTUsNyArNTM5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaW50IHZpZXdJZDsKICAgICAgICAgYm9vbGVhbiB0YXJnZXRCYWNrZ3JvdW5kOwogICAgICAgICBpbnQgYWxwaGE7CkBAIC0yNjYsNiArNTUwLDYzIEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRBRyA9IDM7CiAgICAgfQogICAgIAorICAgIHByaXZhdGUgY2xhc3MgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSA1OworCisgICAgICAgIFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zKGludCB2aWV3SWQsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludChUQUcpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHRoaXMudmlld0lkKTsKKyAgICAgICAgICAgIG91dC53cml0ZVN0cmluZyh0aGlzLm1ldGhvZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgeworICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gcm9vdC5maW5kVmlld0J5SWQodmlld0lkKTsKKyAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJjYW4ndCBmaW5kIHZpZXc6IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcodmlld0lkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsYXNzIGtsYXNzID0gdmlldy5nZXRDbGFzcygpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWV0aG9kID0ga2xhc3MuZ2V0TWV0aG9kKHRoaXMubWV0aG9kTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBkb2Vzbid0IGhhdmUgbWV0aG9kOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMubWV0aG9kTmFtZSArICIoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFJlbW90YWJsZVZpZXdNZXRob2QuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbkV4Y2VwdGlvbigidmlldzogIiArIGtsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbid0IHVzZSBtZXRob2Qgd2l0aCBSZW1vdGVWaWV3czogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50CisgICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKCJSZW1vdGVWaWV3cyIsICJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBjYWxsaW5nIG1ldGhvZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSh2aWV3KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQmFzZSBjbGFzcyBmb3IgdGhlIHJlZmxlY3Rpb24gYWN0aW9ucy4KICAgICAgKi8KQEAgLTI4NSw2ICs2MjYsNyBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFVSSSA9IDExOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJJVE1BUCA9IDEyOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJVTkRMRSA9IDEzOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IElOVEVOVCA9IDE0OwogCiAgICAgICAgIGludCB2aWV3SWQ7CiAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lOwpAQCAtMzQ3LDYgKzY4OSw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBpbi5yZWFkQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5URU5UOgorICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDAyLDYgKzc0Nyw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ1bmRsZSgoQnVuZGxlKSB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgICgoSW50ZW50KXRoaXMudmFsdWUpLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDM1LDYgKzc4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY2xhc3M7CiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCdW5kbGUuY2xhc3M7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlbnQuY2xhc3M7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC00ODEsNiArODMxLDM1IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbkV4Y2VwdGlvbihleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlTWVtb3J5VXNhZ2VFc3RpbWF0ZShNZW1vcnlVc2FnZUNvdW50ZXIgY291bnRlcikgeworICAgICAgICAgICAgLy8gV2UgY3VycmVudGx5IG9ubHkgY2FsY3VsYXRlIEJpdG1hcCBtZW1vcnkgdXNhZ2UKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBCSVRNQVA6CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJpdG1hcCBiID0gKEJpdG1hcCkgdGhpcy52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJpdG1hcC5Db25maWcgYyA9IGIuZ2V0Q29uZmlnKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBwID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBTFBIQV84OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJHQl81NjU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFSR0JfNDQ0NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHAgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBUkdCXzg4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBwID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIuYml0bWFwSW5jcmVtZW50KGIuZ2V0V2lkdGgoKSAqIGIuZ2V0SGVpZ2h0KCkgKiBicHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTgsNiArODk3LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlTWVtb3J5VXNhZ2VFc3RpbWF0ZShNZW1vcnlVc2FnZUNvdW50ZXIgY291bnRlcikgeworICAgICAgICAgICAgaWYgKG5lc3RlZFZpZXdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb3VudGVyLmJpdG1hcEluY3JlbWVudChuZXN0ZWRWaWV3cy5lc3RpbWF0ZUJpdG1hcE1lbW9yeVVzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaW50IHZpZXdJZDsKICAgICAgICAgUmVtb3RlVmlld3MgbmVzdGVkVmlld3M7CiAKQEAgLTUyNSw2ICs5MTEsMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTaW1wbGUgY2xhc3MgdXNlZCB0byBrZWVwIHRyYWNrIG9mIG1lbW9yeSB1c2FnZSBpbiBhIFJlbW90ZVZpZXdzLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBNZW1vcnlVc2FnZUNvdW50ZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG1CaXRtYXBIZWFwTWVtb3J5VXNhZ2UgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYml0bWFwSW5jcmVtZW50KGludCBudW1CeXRlcykgeworICAgICAgICAgICAgbUJpdG1hcEhlYXBNZW1vcnlVc2FnZSArPSBudW1CeXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Qml0bWFwSGVhcE1lbW9yeVVzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1CaXRtYXBIZWFwTWVtb3J5VXNhZ2U7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbUJpdG1hcEhlYXBNZW1vcnlVc2FnZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYSBuZXcgUmVtb3RlVmlld3Mgb2JqZWN0IHRoYXQgd2lsbCBkaXNwbGF5IHRoZSB2aWV3cyBjb250YWluZWQKICAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGxheW91dCBmaWxlLgogICAgICAqIApAQCAtNTM0LDYgKzk0MCwxMCBAQAogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBsYXlvdXRJZCkgewogICAgICAgICBtUGFja2FnZSA9IHBhY2thZ2VOYW1lOwogICAgICAgICBtTGF5b3V0SWQgPSBsYXlvdXRJZDsKKworICAgICAgICAvLyBzZXR1cCB0aGUgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MKKyAgICAgICAgbU1lbW9yeVVzYWdlQ291bnRlciA9IG5ldyBNZW1vcnlVc2FnZUNvdW50ZXIoKTsKKyAgICAgICAgcmVjYWxjdWxhdGVNZW1vcnlVc2FnZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTQ0LDYgKzk1NCw4IEBACiAgICAgcHVibGljIFJlbW90ZVZpZXdzKFBhcmNlbCBwYXJjZWwpIHsKICAgICAgICAgbVBhY2thZ2UgPSBwYXJjZWwucmVhZFN0cmluZygpOwogICAgICAgICBtTGF5b3V0SWQgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBtSXNXaWRnZXRDb2xsZWN0aW9uQ2hpbGQgPSBwYXJjZWwucmVhZEludCgpID09IDEgPyB0cnVlIDogZmFsc2U7CisKICAgICAgICAgaW50IGNvdW50ID0gcGFyY2VsLnJlYWRJbnQoKTsKICAgICAgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICAgICAgbUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oY291bnQpOwpAQCAtNTYyLDE4ICs5NzQsNDEgQEAKICAgICAgICAgICAgICAgICBjYXNlIFZpZXdHcm91cEFjdGlvbi5UQUc6CiAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25zLmFkZChuZXcgVmlld0dyb3VwQWN0aW9uKHBhcmNlbCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zLlRBRzoKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbnMuYWRkKG5ldyBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyhwYXJjZWwpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTZXRFbXB0eVZpZXcuVEFHOgorICAgICAgICAgICAgICAgICAgICBtQWN0aW9ucy5hZGQobmV3IFNldEVtcHR5VmlldyhwYXJjZWwpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTZXRPbkNsaWNrRXh0cmFzLlRBRzoKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbnMuYWRkKG5ldyBTZXRPbkNsaWNrRXh0cmFzKHBhcmNlbCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZS5UQUc6CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25zLmFkZChuZXcgU2V0UGVuZGluZ0ludGVudFRlbXBsYXRlKHBhcmNlbCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNldE9uQ2xpY2tGaWxsSW5JbnRlbnQuVEFHOgorICAgICAgICAgICAgICAgICAgICBtQWN0aW9ucy5hZGQobmV3IFNldE9uQ2xpY2tGaWxsSW5JbnRlbnQocGFyY2VsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oIlRhZyAiICsgdGFnICsgIiBub3QgZm91bmQiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyBzZXR1cCB0aGUgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MKKyAgICAgICAgbU1lbW9yeVVzYWdlQ291bnRlciA9IG5ldyBNZW1vcnlVc2FnZUNvdW50ZXIoKTsKKyAgICAgICAgcmVjYWxjdWxhdGVNZW1vcnlVc2FnZSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBjbG9uZSgpIHsKICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgdGhhdCA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZSwgbUxheW91dElkKTsKICAgICAgICAgaWYgKG1BY3Rpb25zICE9IG51bGwpIHsKICAgICAgICAgICAgIHRoYXQubUFjdGlvbnMgPSAoQXJyYXlMaXN0PEFjdGlvbj4pbUFjdGlvbnMuY2xvbmUoKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWVtb3J5IHVzYWdlIHN0YXRzIG9mIHRoZSBjbG9uZWQgUmVtb3RlVmlld3MKKyAgICAgICAgdGhhdC5yZWNhbGN1bGF0ZU1lbW9yeVVzYWdlKCk7CiAgICAgICAgIHJldHVybiB0aGF0OwogICAgIH0KIApAQCAtNTg1LDYgKzEwMjAsMzkgQEAKICAgICAgICAgcmV0dXJuIG1MYXlvdXRJZDsKICAgICB9CiAKKyAgICAvKgorICAgICAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIFJlbW90ZVZpZXdzIG9iamVjdCBpcyBiZWluZyBjcmVhdGVkIGZyb20gYQorICAgICAqIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdXNlIGFzIGEgY2hpbGQgb2YgYSB3aWRnZXQgY29sbGVjdGlvbi4gVGhpcyBmbGFnIGlzIHVzZWQKKyAgICAgKiB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgY2VydGFpbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLCBpbiBwYXJ0aWN1bGFyLAorICAgICAqIHNldHRpbmcgb24gY2xpY2sgZXh0cmFzIGFuZCBzZXR0aW5nIG9uIGNsaWNrIHBlbmRpbmcgaW50ZW50cy4gVGhlIGZvcm1lciBpcyBlbmFibGVkLAorICAgICAqIGFuZCB0aGUgbGF0dGVyIGRpc2FibGVkIHdoZW4gdGhpcyBmbGFnIGlzIHRydWUuCisgICAgICovCisgICAgdm9pZCBzZXRJc1dpZGdldENvbGxlY3Rpb25DaGlsZChib29sZWFuIGlzV2lkZ2V0Q29sbGVjdGlvbkNoaWxkKSB7CisgICAgICAgIG1Jc1dpZGdldENvbGxlY3Rpb25DaGlsZCA9IGlzV2lkZ2V0Q29sbGVjdGlvbkNoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIG1lbW9yeSB1c2FnZSBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWNhbGN1bGF0ZU1lbW9yeVVzYWdlKCkgeworICAgICAgICBtTWVtb3J5VXNhZ2VDb3VudGVyLmNsZWFyKCk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSB0aGUgbWVtb3J5IHVzYWdlIGZvciBlYWNoIGFjdGlvbgorICAgICAgICBpZiAobUFjdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUFjdGlvbnMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9ucy5nZXQoaSkudXBkYXRlTWVtb3J5VXNhZ2VFc3RpbWF0ZShtTWVtb3J5VXNhZ2VDb3VudGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIGJpdG1hcCBoZWFwIG1lbW9yeSB1c2FnZSBmb3IgdGhpcyBSZW1vdGVWaWV3cy4KKyAgICAgKi8KKyAgICBpbnQgZXN0aW1hdGVCaXRtYXBNZW1vcnlVc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZW1vcnlVc2FnZUNvdW50ZXIuZ2V0Qml0bWFwSGVhcE1lbW9yeVVzYWdlKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQWRkIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZCBvbiB0aGUgcmVtb3RlIHNpZGUgd2hlbiBhcHBseSBpcyBjYWxsZWQuCiAgICAgICogCkBAIC01OTUsNiArMTA2Myw5IEBACiAgICAgICAgICAgICBtQWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwogICAgICAgICB9CiAgICAgICAgIG1BY3Rpb25zLmFkZChhKTsKKworICAgICAgICAvLyB1cGRhdGUgdGhlIG1lbW9yeSB1c2FnZSBzdGF0cworICAgICAgICBhLnVwZGF0ZU1lbW9yeVVzYWdlRXN0aW1hdGUobU1lbW9yeVVzYWdlQ291bnRlcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MjIsNiArMTA5MywyNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dOZXh0KCl9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyBvbiB3aGljaCB0byBjYWxsIHtAbGluayBBZGFwdGVyVmlld0ZsaXBwZXIjc2hvd05leHQoKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93TmV4dChpbnQgdmlld0lkKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXModmlld0lkLCAic2hvd05leHQiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBBZGFwdGVyVmlld0ZsaXBwZXIjc2hvd1ByZXZpb3VzKCl9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyBvbiB3aGljaCB0byBjYWxsIHtAbGluayBBZGFwdGVyVmlld0ZsaXBwZXIjc2hvd1ByZXZpb3VzKCl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd1ByZXZpb3VzKGludCB2aWV3SWQpIHsKKyAgICAgICAgYWRkQWN0aW9uKG5ldyBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyh2aWV3SWQsICJzaG93UHJldmlvdXMiKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIFZpZXcuc2V0VmlzaWJpbGl0eQogICAgICAqIAogICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIGlkIG9mIHRoZSB2aWV3IHdob3NlIHZpc2liaWxpdHkgc2hvdWxkIGNoYW5nZQpAQCAtNjMwLDcgKzExMTksNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldFZpZXdWaXNpYmlsaXR5KGludCB2aWV3SWQsIGludCB2aXNpYmlsaXR5KSB7CiAgICAgICAgIHNldEludCh2aWV3SWQsICJzZXRWaXNpYmlsaXR5IiwgdmlzaWJpbGl0eSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIFRleHRWaWV3LnNldFRleHQKICAgICAgKiAKQEAgLTY3Miw2ICsxMTYxLDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIEFkYXB0ZXJWaWV3LnNldEVtcHR5VmlldworICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gc2V0IHRoZSBlbXB0eSB2aWV3CisgICAgICogQHBhcmFtIGVtcHR5Vmlld0lkIFRoZSB2aWV3IGlkIG9mIHRoZSBlbXB0eSB2aWV3CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW1wdHlWaWV3KGludCB2aWV3SWQsIGludCBlbXB0eVZpZXdJZCkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFNldEVtcHR5Vmlldyh2aWV3SWQsIGVtcHR5Vmlld0lkKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBDaHJvbm9tZXRlciNzZXRCYXNlIENocm9ub21ldGVyLnNldEJhc2V9LAogICAgICAqIHtAbGluayBDaHJvbm9tZXRlciNzZXRGb3JtYXQgQ2hyb25vbWV0ZXIuc2V0Rm9ybWF0fSwKICAgICAgKiBhbmQge0BsaW5rIENocm9ub21ldGVyI3N0YXJ0IENocm9ub21ldGVyLnN0YXJ0KCl9IG9yCkBAIC03MTgsNiArMTIxNywxMSBAQAogICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNzZXRPbkNsaWNrTGlzdGVuZXIoYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyKX0KICAgICAgKiB0byBsYXVuY2ggdGhlIHByb3ZpZGVkIHtAbGluayBQZW5kaW5nSW50ZW50fS4KICAgICAgKiAKKyAgICAgKiBXaGVuIHNldHRpbmcgdGhlIG9uLWNsaWNrIGFjdGlvbiBvZiBpdGVtcyB3aXRoaW4gY29sbGVjdGlvbnMgKGVnLiB7QGxpbmsgTGlzdFZpZXd9LAorICAgICAqIHtAbGluayBTdGFja1ZpZXd9IGV0Yy4pLCB0aGlzIG1ldGhvZCB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkLCB1c2Uge0BsaW5rCisgICAgICogUmVtb3RlVmlld3Mjc2V0UGVuZGluZ0ludGVudFRlbXBsYXRlKGludCwgUGVuZGluZ0ludGVudCkgaW4gY29uanVuY3Rpb24gd2l0aAorICAgICAqIFJlbW90ZVZpZXdzI3NldE9uQ2xpY2tGaWxsSW5JbnRlbnQoaW50LCBJbnRlbnQpLgorICAgICAqCiAgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIHtAbGluayBQZW5kaW5nSW50ZW50fSB3aGVuIGNsaWNrZWQKICAgICAgKiBAcGFyYW0gcGVuZGluZ0ludGVudCBUaGUge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHNlbmQgd2hlbiB1c2VyIGNsaWNrcwogICAgICAqLwpAQCAtNzI2LDYgKzEyMzAsNTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBXaGVuIHVzaW5nIGNvbGxlY3Rpb25zIChlZy4ge0BsaW5rIExpc3RWaWV3fSwge0BsaW5rIFN0YWNrVmlld30gZXRjLikgaW4gd2lkZ2V0cywgaXQgaXMgdmVyeQorICAgICAqIGNvc3RseSB0byBzZXQgUGVuZGluZ0ludGVudHMgb24gdGhlIGluZGl2aWR1YWwgaXRlbXMsIGFuZCBpcyBoZW5jZSBub3QgcGVybWl0dGVkLiBJbnN0ZWFkCisgICAgICogdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgdG8gc2V0IGEgc2luZ2xlIFBlbmRpbmdJbnRlbnQgdGVtcGxhdGUgb24gdGhlIGNvbGxlY3Rpb24sIGFuZAorICAgICAqIGluZGl2aWR1YWwgaXRlbXMgY2FuIGRpZmZlcmVudGlhdGUgdGhlaXIgb24tY2xpY2sgYmVoYXZpb3IgdXNpbmcKKyAgICAgKiB7QGxpbmsgUmVtb3RlVmlld3Mjc2V0T25DbGlja0ZpbGxJbkludGVudChpbnQsIEludGVudCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIGNvbGxlY3Rpb24gd2hvJ3MgY2hpbGRyZW4gd2lsbCB1c2UgdGhpcyBQZW5kaW5nSW50ZW50IHRlbXBsYXRlCisgICAgICogICAgICAgICAgd2hlbiBjbGlja2VkCisgICAgICogQHBhcmFtIHBlbmRpbmdJbnRlbnRUZW1wbGF0ZSBUaGUge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIGJlIGNvbWJpbmVkIHdpdGggZXh0cmFzIHNwZWNpZmllZAorICAgICAqICAgICAgICAgIGJ5IGEgY2hpbGQgb2Ygdmlld0lkIGFuZCBleGVjdXRlZCB3aGVuIHRoYXQgY2hpbGQgaXMgY2xpY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZShpbnQgdmlld0lkLCBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnRUZW1wbGF0ZSkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZSh2aWV3SWQsIHBlbmRpbmdJbnRlbnRUZW1wbGF0ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlaW5nIGRlcHJlY2F0ZWQuIFNlZSB7QGxpbmsgUmVtb3RlVmlld3Mjc2V0T25DbGlja0ZpbGxJbkludGVudChpbnQsIEludGVudCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZAorICAgICAqIEBwYXJhbSBleHRyYXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkNsaWNrRXh0cmFzKGludCB2aWV3SWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgYWRkQWN0aW9uKG5ldyBTZXRPbkNsaWNrRXh0cmFzKHZpZXdJZCwgZXh0cmFzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiB1c2luZyBjb2xsZWN0aW9ucyAoZWcuIHtAbGluayBMaXN0Vmlld30sIHtAbGluayBTdGFja1ZpZXd9IGV0Yy4pIGluIHdpZGdldHMsIGl0IGlzIHZlcnkKKyAgICAgKiBjb3N0bHkgdG8gc2V0IFBlbmRpbmdJbnRlbnRzIG9uIHRoZSBpbmRpdmlkdWFsIGl0ZW1zLCBhbmQgaXMgaGVuY2Ugbm90IHBlcm1pdHRlZC4gSW5zdGVhZAorICAgICAqIGEgc2luZ2xlIFBlbmRpbmdJbnRlbnQgdGVtcGxhdGUgY2FuIGJlIHNldCBvbiB0aGUgY29sbGVjdGlvbiwgc2VlIHtAbGluaworICAgICAqIFJlbW90ZVZpZXdzI3NldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZShpbnQsIFBlbmRpbmdJbnRlbnQpfSwgYW5kIHRoZSBpbmRpdmlkdWFsIG9uLWNsaWNrCisgICAgICogYWN0aW9uIG9mIGEgZ2l2ZW4gaXRlbSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBieSBzZXR0aW5nIGEgZmlsbEluSW50ZW50IG9uIHRoYXQgaXRlbS4gVGhlCisgICAgICogZmlsbEluSW50ZW50IGlzIHRoZW4gY29tYmluZWQgd2l0aCB0aGUgUGVuZGluZ0ludGVudCB0ZW1wbGF0ZSBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIGZpbmFsCisgICAgICogaW50ZW50IHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgaXRlbSBpcyBjbGlja2VkLiBUaGlzIHdvcmtzIGFzIGZvbGxvd3M6IGFueSBmaWVsZHMKKyAgICAgKiB3aGljaCBhcmUgbGVmdCBibGFuayBpbiB0aGUgUGVuZGluZ0ludGVudCB0ZW1wbGF0ZSwgYnV0IGFyZSBwcm92aWRlZCBieSB0aGUgZmlsbEluSW50ZW50CisgICAgICogd2lsbCBiZSBvdmVyd3JpdHRlbiwgYW5kIHRoZSByZXN1bHRpbmcgUGVuZGluZ0ludGVudCB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKgorICAgICAqIG9mIHRoZSBQZW5kaW5nSW50ZW50IHRlbXBsYXRlIHdpbGwgdGhlbiBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgYXNzb2NpYXRlZCBmaWVsZHMgdGhhdCBhcmUKKyAgICAgKiBzZXQgaW4gZmlsbEluSW50ZW50LiBTZWUge0BsaW5rIEludGVudCNmaWxsSW4oSW50ZW50LCBpbnQpfSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gc2V0IHRoZSBmaWxsSW5JbnRlbnQKKyAgICAgKiBAcGFyYW0gZmlsbEluSW50ZW50IFRoZSBpbnRlbnQgd2hpY2ggd2lsbCBiZSBjb21iaW5lZCB3aXRoIHRoZSBwYXJlbnQncyBQZW5kaW5nSW50ZW50CisgICAgICogICAgICAgIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgb24tY2xpY2sgYmVoYXZpb3Igb2YgdGhlIHZpZXcgc3BlY2lmaWVkIGJ5IHZpZXdJZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uQ2xpY2tGaWxsSW5JbnRlbnQoaW50IHZpZXdJZCwgSW50ZW50IGZpbGxJbkludGVudCkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFNldE9uQ2xpY2tGaWxsSW5JbnRlbnQodmlld0lkLCBmaWxsSW5JbnRlbnQpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBhIGNvbWJpbmF0aW9uIG9mIHtAbGluayBEcmF3YWJsZSNzZXRBbHBoYShpbnQpfSwKICAgICAgKiB7QGxpbmsgRHJhd2FibGUjc2V0Q29sb3JGaWx0ZXIoaW50LCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSl9LApAQCAtNzY5LDYgKzEzMjIsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3I3NldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIGlkIG9mIHRoZSB2aWV3IHdob3NlIHRleHQgc2hvdWxkIGNoYW5nZQorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCBvZiB0aGUgc2VydmljZSB3aGljaCB3aWxsIGJlCisgICAgICogICAgICAgICAgICBwcm92aWRpbmcgZGF0YSB0byB0aGUgUmVtb3RlVmlld3NBZGFwdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQWRhcHRlcihpbnQgdmlld0lkLCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNldEludGVudCh2aWV3SWQsICJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiLCBpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihpbnQsIGludCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgd2hvc2UgdGV4dCBzaG91bGQgY2hhbmdlCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFNjcm9sbCB0byB0aGlzIGFkYXB0ZXIgcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0SW50KHZpZXdJZCwgInNtb290aFNjcm9sbFRvUG9zaXRpb24iLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyNzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCwgaW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFNjcm9sbCBieSB0aGlzIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHNldEludCh2aWV3SWQsICJzbW9vdGhTY3JvbGxCeU9mZnNldCIsIG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCBhIG1ldGhvZCB0YWtpbmcgb25lIGJvb2xlYW4gb24gYSB2aWV3IGluIHRoZSBsYXlvdXQgZm9yIHRoaXMgUmVtb3RlVmlld3MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKQEAgLTkxNSw2ICsxNDk5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlbnQoaW50IHZpZXdJZCwgU3RyaW5nIG1ldGhvZE5hbWUsIEludGVudCB2YWx1ZSkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb24odmlld0lkLCBtZXRob2ROYW1lLCBSZWZsZWN0aW9uQWN0aW9uLklOVEVOVCwgdmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbmZsYXRlcyB0aGUgdmlldyBoaWVyYXJjaHkgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFwcGxpZXMKICAgICAgKiBhbGwgb2YgdGhlIGFjdGlvbnMuCiAgICAgICogCkBAIC0xMDAwLDYgKzE1OTQsNyBAQAogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgewogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1QYWNrYWdlKTsKICAgICAgICAgZGVzdC53cml0ZUludChtTGF5b3V0SWQpOworICAgICAgICBkZXN0LndyaXRlSW50KG1Jc1dpZGdldENvbGxlY3Rpb25DaGlsZCA/IDEgOiAwKTsKICAgICAgICAgaW50IGNvdW50OwogICAgICAgICBpZiAobUFjdGlvbnMgIT0gbnVsbCkgewogICAgICAgICAgICAgY291bnQgPSBtQWN0aW9ucy5zaXplKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkNjc1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDg4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LklSZW1vdGVWaWV3c0ZhY3Rvcnk7CisKKy8qKgorICogQW4gYWRhcHRlciB0byBhIFJlbW90ZVZpZXdzU2VydmljZSB3aGljaCBmZXRjaGVzIGFuZCBjYWNoZXMgUmVtb3RlVmlld3MKKyAqIHRvIGJlIGxhdGVyIGluZmxhdGVkIGFzIGNoaWxkIHZpZXdzLgorICovCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdGVWaWV3c0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW1vdGVWaWV3c0FkYXB0ZXIiOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgSW50ZW50IG1JbnRlbnQ7CisgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247CisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBwcml2YXRlIEZpeGVkU2l6ZVJlbW90ZVZpZXdzQ2FjaGUgbUNhY2hlOworCisgICAgLy8gVGhlIHNldCBvZiByZXF1ZXN0ZWQgdmlld3MgdGhhdCBhcmUgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBSZW1vdGVWaWV3cyBhcmUKKyAgICAvLyBsb2FkZWQuCisgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0UmVmU2V0IG1SZXF1ZXN0ZWRWaWV3czsKKworICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtV29ya2VyVGhyZWFkOworICAgIC8vIGl0ZW1zIG1heSBiZSBpbnRlcnJ1cHRlZCB3aXRoaW4gdGhlIG5vcm1hbGx5IHByb2Nlc3NlZCBxdWV1ZXMKKyAgICBwcml2YXRlIEhhbmRsZXIgbVdvcmtlclF1ZXVlOworICAgIHByaXZhdGUgSGFuZGxlciBtTWFpblF1ZXVlOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJmYWNlIGZvciB0aGUgUmVtb3RlQWRhcHRlciB0byBub3RpZnkgb3RoZXIgY2xhc3NlcyB3aGVuIGFkYXB0ZXJzCisgICAgICogYXJlIGFjdHVhbGx5IGNvbm5lY3RlZCB0by9kaXNjb25uZWN0ZWQgZnJvbSB0aGVpciBhY3R1YWwgc2VydmljZXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCk7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcnZpY2UgY29ubmVjdGlvbiB0aGF0IGdldHMgcG9wdWxhdGVkIHdoZW4gdGhlIFJlbW90ZVZpZXdzU2VydmljZSBpcworICAgICAqIGJvdW5kLiAgVGhpcyBtdXN0IGJlIGEgc3RhdGljIGlubmVyIGNsYXNzIHRvIGVuc3VyZSB0aGF0IG5vIHJlZmVyZW5jZXMgdG8gdGhlIG91dGVyCisgICAgICogUmVtb3RlVmlld3NBZGFwdGVyIGluc3RhbmNlIGlzIHJldGFpbmVkICh0aGlzIHdvdWxkIHByZXZlbnQgdGhlIFJlbW90ZVZpZXdzQWRhcHRlciBmcm9tIGJlaW5nCisgICAgICogZ2FyYmFnZSBjb2xsZWN0ZWQsIGFuZCB3b3VsZCBjYXVzZSB1cyB0byBsZWFrIGFjdGl2aXRpZXMgZHVlIHRvIHRoZSBjYWNoaW5nIG1lY2hhbmlzbSBmb3IKKyAgICAgKiBGcmFtZUxheW91dHMgaW4gdGhlIGFkYXB0ZXIpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3RlZDsKKyAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFJlbW90ZVZpZXdzQWRhcHRlcj4gbUFkYXB0ZXI7CisgICAgICAgIHByaXZhdGUgSVJlbW90ZVZpZXdzRmFjdG9yeSBtUmVtb3RlVmlld3NGYWN0b3J5OworCisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbihSZW1vdGVWaWV3c0FkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTxSZW1vdGVWaWV3c0FkYXB0ZXI+KGFkYXB0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwKKyAgICAgICAgICAgICAgICBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgICAgIG1SZW1vdGVWaWV3c0ZhY3RvcnkgPSBJUmVtb3RlVmlld3NGYWN0b3J5LlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisgICAgICAgICAgICBtQ29ubmVjdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gUXVldWUgdXAgd29yayB0aGF0IHdlIG5lZWQgdG8gZG8gZm9yIHRoZSBjYWxsYmFjayB0byBydW4KKyAgICAgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzQWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoYWRhcHRlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgICAgICBhZGFwdGVyLm1Xb3JrZXJRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgYmFjayB0byB0aGUgc2VydmljZSB0byBub3RpZnkgdGhhdCB0aGUgZGF0YSBzZXQgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICBpZiAoYWRhcHRlci5tU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgSVJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLm1TZXJ2aWNlQ29ubmVjdGlvbi5nZXRSZW1vdGVWaWV3c0ZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBiYWNrIHRvIHRoZSBmYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5vbkRhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIG5vdGlmeWluZyBmYWN0b3J5IG9mIGRhdGEgc2V0IGNoYW5nZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uU2VydmljZUNvbm5lY3RlZCgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgdG8gcHJldmVudCBhbnl0aGluZyBmdXJ0aGVyIGZyb20gYmVpbmcgbm90aWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZWZmZWN0aXZlbHkgbm90aGluZyBoYXMgY2hhbmdlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVlc3QgbWV0YSBkYXRhIHNvIHRoYXQgd2UgaGF2ZSB1cCB0byBkYXRlIGRhdGEgd2hlbiBjYWxsaW5nIGJhY2sgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZW1vdGUgYWRhcHRlciBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci51cGRhdGVNZXRhRGF0YSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3N0IGEgcnVubmFibGUgdG8gY2FsbCBiYWNrIHRvIHRoZSB2aWV3IHRvIG5vdGlmeSBpdCB0aGF0IHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5tTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLm1DYWxsYmFjay5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1SZW1vdGVWaWV3c0ZhY3RvcnkgPSBudWxsOworCisgICAgICAgICAgICBmaW5hbCBSZW1vdGVWaWV3c0FkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBDbGVhciB0aGUgbWFpbi93b3JrZXIgcXVldWVzCisgICAgICAgICAgICBhZGFwdGVyLm1NYWluUXVldWUucmVtb3ZlTWVzc2FnZXMoMCk7CisgICAgICAgICAgICBhZGFwdGVyLm1Xb3JrZXJRdWV1ZS5yZW1vdmVNZXNzYWdlcygwKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGNhY2hlICh0aGUgbWV0YSBkYXRhIHdpbGwgYmUgcmUtcmVxdWVzdGVkIG9uIHNlcnZpY2UgcmUtY29ubmVjdGlvbikKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoYWRhcHRlci5tQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICBhZGFwdGVyLm1DYWNoZS5yZXNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBSZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrID0gYWRhcHRlci5tQ2FsbGJhY2suZ2V0KCk7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElSZW1vdGVWaWV3c0ZhY3RvcnkgZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZW1vdGVWaWV3c0ZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBGcmFtZUxheW91dCB3aGljaCBjb250YWlucyBhIGxvYWRpbmcgdmlldywgYW5kIG1hbmFnZXMgdGhlIHJlL2FwcGx5aW5nIG9mIFJlbW90ZVZpZXdzIHdoZW4KKyAgICAgKiB0aGV5IGFyZSBsb2FkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NGcmFtZUxheW91dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVwZGF0ZXMgdGhpcyBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGRlcGVuZGluZyBvbiB0aGUgdmlldyB0aGF0IHdhcyBsb2FkZWQuCisgICAgICAgICAqIEBwYXJhbSB2aWV3IHRoZSBSZW1vdGVWaWV3cyB0aGF0IHdhcyBsb2FkZWQuIElmIG51bGwsIHRoZSBSZW1vdGVWaWV3cyB3YXMgbm90IGxvYWRlZAorICAgICAgICAgKiAgICAgICAgICAgICBzdWNjZXNzZnVsbHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJlbW90ZVZpZXdzTG9hZGVkKFJlbW90ZVZpZXdzIHZpZXcpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBsYXlvdXQgZmlyc3QKKyAgICAgICAgICAgICAgICByZW1vdmVBbGxWaWV3cygpOworICAgICAgICAgICAgICAgIGFkZFZpZXcodmlldy5hcHBseShnZXRDb250ZXh0KCksIHRoaXMpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGFwcGx5IFJlbW90ZVZpZXdzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmVzIHRoZSByZWZlcmVuY2VzIG9mIGFsbCB0aGUgUmVtb3RlVmlld3NGcmFtZUxheW91dHMgdGhhdCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgdGhlCisgICAgICogYWRhcHRlciB0aGF0IGhhdmUgbm90IHlldCBoYWQgdGhlaXIgUmVtb3RlVmlld3MgbG9hZGVkLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NGcmFtZUxheW91dFJlZlNldCB7CisgICAgICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBMaW5rZWRMaXN0PFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQ+PiBtUmVmZXJlbmNlczsKKworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NGcmFtZUxheW91dFJlZlNldCgpIHsKKyAgICAgICAgICAgIG1SZWZlcmVuY2VzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTGlua2VkTGlzdDxSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0Pj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmV3IHJlZmVyZW5jZSB0byBhIFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoaW50IHBvc2l0aW9uLCBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGxheW91dCkgeworICAgICAgICAgICAgZmluYWwgSW50ZWdlciBwb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIExpbmtlZExpc3Q8UmVtb3RlVmlld3NGcmFtZUxheW91dD4gcmVmczsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VzLmNvbnRhaW5zS2V5KHBvcykpIHsKKyAgICAgICAgICAgICAgICByZWZzID0gbVJlZmVyZW5jZXMuZ2V0KHBvcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlZnMgPSBuZXcgTGlua2VkTGlzdDxSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0PigpOworICAgICAgICAgICAgICAgIG1SZWZlcmVuY2VzLnB1dChwb3MsIHJlZnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGxpc3QKKyAgICAgICAgICAgIHJlZnMuYWRkKGxheW91dCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTm90aWZpZXMgZWFjaCBvZiB0aGUgUmVtb3RlVmlld3NGcmFtZUxheW91dHMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBwb3NpdGlvbiB0aGF0CisgICAgICAgICAqIHRoZSBhc3NvY2lhdGVkIFJlbW90ZVZpZXdzIGhhcyBsb2FkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlPblJlbW90ZVZpZXdzTG9hZGVkKGludCBwb3NpdGlvbiwgUmVtb3RlVmlld3MgdmlldywgaW50IHR5cGVJZCkgeworICAgICAgICAgICAgaWYgKHZpZXcgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHBvcyA9IHBvc2l0aW9uOworICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VzLmNvbnRhaW5zS2V5KHBvcykpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3RpZnkgYWxsIHRoZSByZWZlcmVuY2VzIGZvciB0aGF0IHBvc2l0aW9uIG9mIHRoZSBuZXdseSBsb2FkZWQgUmVtb3RlVmlld3MKKyAgICAgICAgICAgICAgICBmaW5hbCBMaW5rZWRMaXN0PFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQ+IHJlZnMgPSBtUmVmZXJlbmNlcy5nZXQocG9zKTsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQgcmVmIDogcmVmcykgeworICAgICAgICAgICAgICAgICAgICByZWYub25SZW1vdGVWaWV3c0xvYWRlZCh2aWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVmcy5jbGVhcigpOworCisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgc2V0IGZyb20gdGhlIG9yaWdpbmFsIG1hcHBpbmcKKyAgICAgICAgICAgICAgICBtUmVmZXJlbmNlcy5yZW1vdmUocG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIGFsbCByZWZlcmVuY2VzIHRvIGFsbCBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0cyByZXR1cm5lZCBieSB0aGUgYWRhcHRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgLy8gV2UgY3VycmVudGx5IGp1c3QgY2xlYXIgdGhlIHJlZmVyZW5jZXMsIGFuZCBsZWF2ZSBhbGwgdGhlIHByZXZpb3VzIGxheW91dHMgcmV0dXJuZWQKKyAgICAgICAgICAgIC8vIGluIHRoZWlyIGRlZmF1bHQgc3RhdGUgb2YgdGhlIGxvYWRpbmcgdmlldy4KKyAgICAgICAgICAgIG1SZWZlcmVuY2VzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YS1kYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FjaGUgaW4gaXQncyBjdXJyZW50IHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NNZXRhRGF0YSB7CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgaW50IHZpZXdUeXBlQ291bnQ7CisgICAgICAgIGJvb2xlYW4gaGFzU3RhYmxlSWRzOworICAgICAgICBib29sZWFuIGlzRGF0YURpcnR5OworCisgICAgICAgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byBjb25zdHJ1Y3QgbG9hZGluZyB2aWV3cy4gIElmIGEgbG9hZGluZyB2aWV3IGlzIG5vdCBzcGVjaWZpZWQKKyAgICAgICAgLy8gYnkgdGhlIHVzZXIsIHRoZW4gd2UgdHJ5IGFuZCBsb2FkIHRoZSBmaXJzdCB2aWV3LCBhbmQgdXNlIGl0cyBoZWlnaHQgYXMgdGhlIGhlaWdodCBmb3IKKyAgICAgICAgLy8gdGhlIGRlZmF1bHQgbG9hZGluZyB2aWV3LgorICAgICAgICBSZW1vdGVWaWV3cyBtVXNlckxvYWRpbmdWaWV3OworICAgICAgICBSZW1vdGVWaWV3cyBtRmlyc3RWaWV3OworICAgICAgICBpbnQgbUZpcnN0Vmlld0hlaWdodDsKKworICAgICAgICAvLyBBIG1hcHBpbmcgZnJvbSB0eXBlIGlkIHRvIGEgc2V0IG9mIHVuaXF1ZSB0eXBlIGlkcworICAgICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtVHlwZUlkSW5kZXhNYXA7CisKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzTWV0YURhdGEoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAvLyBieSBkZWZhdWx0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBkdW1teSB2aWV3IHR5cGUKKyAgICAgICAgICAgIHZpZXdUeXBlQ291bnQgPSAxOworICAgICAgICAgICAgaGFzU3RhYmxlSWRzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlzRGF0YURpcnR5ID0gZmFsc2U7CisgICAgICAgICAgICBtVXNlckxvYWRpbmdWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgIG1GaXJzdFZpZXcgPSBudWxsOworICAgICAgICAgICAgbUZpcnN0Vmlld0hlaWdodCA9IDA7CisgICAgICAgICAgICBtVHlwZUlkSW5kZXhNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TG9hZGluZ1ZpZXdUZW1wbGF0ZXMoUmVtb3RlVmlld3MgbG9hZGluZ1ZpZXcsIFJlbW90ZVZpZXdzIGZpcnN0VmlldykgeworICAgICAgICAgICAgbVVzZXJMb2FkaW5nVmlldyA9IGxvYWRpbmdWaWV3OworICAgICAgICAgICAgaWYgKGZpcnN0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUZpcnN0VmlldyA9IGZpcnN0VmlldzsKKyAgICAgICAgICAgICAgICBtRmlyc3RWaWV3SGVpZ2h0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE1hcHBlZFZpZXdUeXBlKGludCB0eXBlSWQpIHsKKyAgICAgICAgICAgIGlmIChtVHlwZUlkSW5kZXhNYXAuY29udGFpbnNLZXkodHlwZUlkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtVHlwZUlkSW5kZXhNYXAuZ2V0KHR5cGVJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlICsxIGJlY2F1c2UgdGhlIGxvYWRpbmcgdmlldyBhbHdheXMgaGFzIHZpZXcgdHlwZSBpZCBvZiAwCisgICAgICAgICAgICAgICAgaW50IGluY3JlbWVudGFsVHlwZUlkID0gbVR5cGVJZEluZGV4TWFwLnNpemUoKSArIDE7CisgICAgICAgICAgICAgICAgbVR5cGVJZEluZGV4TWFwLnB1dCh0eXBlSWQsIGluY3JlbWVudGFsVHlwZUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5jcmVtZW50YWxUeXBlSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQgY3JlYXRlTG9hZGluZ1ZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LAorICAgICAgICAgICAgICAgIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IEZyYW1lTGF5b3V0LCBhbmQgc2V0dXAgdGhlIHJlZmVyZW5jZXMgZm9yIHRoaXMgcG9zaXRpb24KKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHBhcmVudC5nZXRDb250ZXh0KCk7CisgICAgICAgICAgICBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGxheW91dCA9IG5ldyBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0KGNvbnRleHQpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgbG9hZGluZyB2aWV3CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChtVXNlckxvYWRpbmdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQSB1c2VyLXNwZWNpZmllZCBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgVmlldyBsb2FkaW5nVmlldyA9IG1Vc2VyTG9hZGluZ1ZpZXcuYXBwbHkocGFyZW50LmdldENvbnRleHQoKSwgcGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGluZ1ZpZXcuc2V0VGFnKG5ldyBJbnRlZ2VyKDApKTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcobG9hZGluZ1ZpZXcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEEgZGVmYXVsdCBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzaXplIG9mIHRoZSBmaXJzdCByb3cgYXMgYSBndWlkZSBmb3IgdGhlIHNpemUgb2YgdGhlIGxvYWRpbmcgdmlldworICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0Vmlld0hlaWdodCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgZmlyc3RWaWV3ID0gbUZpcnN0Vmlldy5hcHBseShwYXJlbnQuZ2V0Q29udGV4dCgpLCBwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0Vmlld0hlaWdodCA9IGZpcnN0Vmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBDb21wb3NlIHRoZSBsb2FkaW5nIHZpZXcgdGV4dAorICAgICAgICAgICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IG5ldyBUZXh0VmlldyhwYXJlbnQuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5sb2FkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0SGVpZ2h0KG1GaXJzdFZpZXdIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUwgfCBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7CisgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHRTaXplKDE4LjBmKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dENvbG9yKENvbG9yLmFyZ2IoOTYsIDI1NSwgMjU1LCAyNTUpKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0U2hhZG93TGF5ZXIoMi4wZiwgMC4wZiwgMS4wZiwgQ29sb3IuQkxBQ0spOworICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUYWcobmV3IEludGVnZXIoMCkpOworCisgICAgICAgICAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YS1kYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBpdGVtIGluIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzSW5kZXhNZXRhRGF0YSB7CisgICAgICAgIGludCB0eXBlSWQ7CisgICAgICAgIGxvbmcgaXRlbUlkOworCisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0luZGV4TWV0YURhdGEoUmVtb3RlVmlld3MgdiwgbG9uZyBpdGVtSWQpIHsKKyAgICAgICAgICAgIHNldCh2LCBpdGVtSWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0KFJlbW90ZVZpZXdzIHYsIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGl0ZW1JZCA9IGlkOworICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0eXBlSWQgPSB2LmdldExheW91dElkKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHlwZUlkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBGaXhlZFNpemVSZW1vdGVWaWV3c0NhY2hlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGaXhlZFNpemVSZW1vdGVWaWV3c0NhY2hlIjsKKworICAgICAgICAvLyBUaGUgbWV0YSBkYXRhIHJlbGF0ZWQgdG8gYWxsIHRoZSBSZW1vdGVWaWV3cywgaWUuIGNvdW50LCBpcyBzdGFibGUsIGV0Yy4KKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c01ldGFEYXRhIG1NZXRhRGF0YTsKKworICAgICAgICAvLyBUaGUgY2FjaGUvbWFwcGluZyBvZiBwb3NpdGlvbiB0byBSZW1vdGVWaWV3c01ldGFEYXRhLiAgVGhpcyBzZXQgaXMgZ3VhcmFudGVlZCB0byBiZQorICAgICAgICAvLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNldCBvZiBSZW1vdGVWaWV3cy4KKyAgICAgICAgLy8gTm90ZTogVGhlIHJlYXNvbiB0aGF0IHdlIGtlZXAgdGhpcyBzZXBhcmF0ZSBmcm9tIHRoZSBSZW1vdGVWaWV3cyBjYWNoZSBiZWxvdyBpcyB0aGF0IHRoaXMKKyAgICAgICAgLy8gd2Ugc3RpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgbWFwcGluZyBvZiBwb3NpdGlvbiB0byBtZXRhIGRhdGEsIHdpdGhvdXQga2VlcGluZworICAgICAgICAvLyB0aGUgaGVhdnkgUmVtb3RlVmlld3MgYXJvdW5kLiAgVGhlIFJlbW90ZVZpZXdzIGNhY2hlIGlzIHRyaW1tZWQgdG8gZml4ZWQgY29uc3RyYWludHMgd3J0LgorICAgICAgICAvLyBtZW1vcnkgYW5kIHNpemUsIGJ1dCB0aGlzIG1ldGFkYXRhIGNhY2hlIHdpbGwgcmV0YWluIGluZm9ybWF0aW9uIHVudGlsIHRoZSBkYXRhIGF0IHRoZQorICAgICAgICAvLyBwb3NpdGlvbiBpcyBndWFyYW50ZWVkIGFzIG5vdCBiZWluZyBuZWNlc3NhcnkgYW55IG1vcmUgKHVzdWFsbHkgb24gbm90aWZ5RGF0YVNldENoYW5nZWQpLgorICAgICAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgUmVtb3RlVmlld3NJbmRleE1ldGFEYXRhPiBtSW5kZXhNZXRhRGF0YTsKKworICAgICAgICAvLyBUaGUgY2FjaGUgb2YgYWN0dWFsIFJlbW90ZVZpZXdzLCB3aGljaCBtYXkgYmUgcHJ1bmVkIGlmIHRoZSBjYWNoZSBnZXRzIHRvbyBsYXJnZSwgb3IgdXNlcworICAgICAgICAvLyB0b28gbXVjaCBtZW1vcnkuCisgICAgICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBSZW1vdGVWaWV3cz4gbUluZGV4UmVtb3RlVmlld3M7CisKKyAgICAgICAgLy8gVGhlIHNldCBvZiBpbmRpY2VzIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSBjb2xsZWN0aW9uIHZpZXcKKyAgICAgICAgcHJpdmF0ZSBIYXNoU2V0PEludGVnZXI+IG1SZXF1ZXN0ZWRJbmRpY2VzOworCisgICAgICAgIC8vIFRoZSBzZXQgb2YgaW5kaWNlcyB0byBsb2FkLCBpbmNsdWRpbmcgdGhvc2UgZXhwbGljaXRseSByZXF1ZXN0ZWQsIGFzIHdlbGwgYXMgdGhvc2UKKyAgICAgICAgLy8gZGV0ZXJtaW5lZCBieSB0aGUgcHJlbG9hZGluZyBhbGdvcml0aG0gdG8gYmUgcHJlZmV0Y2hlZAorICAgICAgICBwcml2YXRlIEhhc2hTZXQ8SW50ZWdlcj4gbUxvYWRJbmRpY2VzOworCisgICAgICAgIC8vIFRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9mIHRoZSBwcmVsb2FkZWQgcmFuZ2UKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVByZWxvYWRMb3dlckJvdW5kOworICAgICAgICBwcml2YXRlIGludCBtUHJlbG9hZFVwcGVyQm91bmQ7CisKKyAgICAgICAgLy8gVGhlIGJvdW5kcyBvZiB0aGlzIGZpeGVkIGNhY2hlLCB3ZSB3aWxsIHRyeSBhbmQgZmlsbCBhcyBtYW55IGl0ZW1zIGludG8gdGhlIGNhY2hlIHVwIHRvCisgICAgICAgIC8vIHRoZSBtYXhDb3VudCBudW1iZXIgb2YgaXRlbXMsIG9yIHRoZSBtYXhTaXplIG1lbW9yeSB1c2FnZS4KKyAgICAgICAgLy8gVGhlIG1heENvdW50U2xhY2sgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBuZXcgcG9zaXRpb24gaW4gdGhlIGNhY2hlIHRvIGJlIGxvYWRlZCBpcworICAgICAgICAvLyBzdWZmaWNpZW50bHkgb3VzaWRlIHRoZSBvbGQgc2V0LCBwcm9tcHRpbmcgYSBzaGlmdGluZyBvZiB0aGUgIndpbmRvdyIgb2YgaXRlbXMgdG8gYmUKKyAgICAgICAgLy8gcHJlbG9hZGVkLgorICAgICAgICBwcml2YXRlIGludCBtTWF4Q291bnQ7CisgICAgICAgIHByaXZhdGUgaW50IG1NYXhDb3VudFNsYWNrOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBzTWF4Q291bnRTbGFja1BlcmNlbnQgPSAwLjc1ZjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNNYXhNZW1vcnlVc2FnZSA9IDEwMjQgKiAxMDI0OworCisgICAgICAgIHB1YmxpYyBGaXhlZFNpemVSZW1vdGVWaWV3c0NhY2hlKGludCBtYXhDYWNoZVNpemUpIHsKKyAgICAgICAgICAgIG1NYXhDb3VudCA9IG1heENhY2hlU2l6ZTsKKyAgICAgICAgICAgIG1NYXhDb3VudFNsYWNrID0gTWF0aC5yb3VuZChzTWF4Q291bnRTbGFja1BlcmNlbnQgKiAobU1heENvdW50IC8gMikpOworICAgICAgICAgICAgbVByZWxvYWRMb3dlckJvdW5kID0gMDsKKyAgICAgICAgICAgIG1QcmVsb2FkVXBwZXJCb3VuZCA9IC0xOworICAgICAgICAgICAgbU1ldGFEYXRhID0gbmV3IFJlbW90ZVZpZXdzTWV0YURhdGEoKTsKKyAgICAgICAgICAgIG1JbmRleE1ldGFEYXRhID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgUmVtb3RlVmlld3NJbmRleE1ldGFEYXRhPigpOworICAgICAgICAgICAgbUluZGV4UmVtb3RlVmlld3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBSZW1vdGVWaWV3cz4oKTsKKyAgICAgICAgICAgIG1SZXF1ZXN0ZWRJbmRpY2VzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgIG1Mb2FkSW5kaWNlcyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBpbnNlcnQoaW50IHBvc2l0aW9uLCBSZW1vdGVWaWV3cyB2LCBsb25nIGl0ZW1JZCkgeworICAgICAgICAgICAgLy8gVHJpbSB0aGUgY2FjaGUgaWYgd2UgZ28gYmV5b25kIHRoZSBjb3VudAorICAgICAgICAgICAgaWYgKG1JbmRleFJlbW90ZVZpZXdzLnNpemUoKSA+PSBtTWF4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBtSW5kZXhSZW1vdGVWaWV3cy5yZW1vdmUoZ2V0RmFydGhlc3RQb3NpdGlvbkZyb20ocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVHJpbSB0aGUgY2FjaGUgaWYgd2UgZ28gYmV5b25kIHRoZSBhdmFpbGFibGUgbWVtb3J5IHNpemUgY29uc3RyYWludHMKKyAgICAgICAgICAgIHdoaWxlIChnZXRSZW1vdGVWaWV3c0JpdG1hcE1lbW9yeVVzYWdlKCkgPj0gc01heE1lbW9yeVVzYWdlKSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhpcyBpcyBjdXJyZW50bHkgdGhlIG1vc3QgbmFpdmUgbWVjaGFuaXNtIGZvciBkZWNpZGluZyB3aGF0IHRvIHBydW5lIHdoZW4KKyAgICAgICAgICAgICAgICAvLyB3ZSBoaXQgdGhlIG1lbW9yeSBsaW1pdC4gIEluIHRoZSBmdXR1cmUsIHdlIG1heSB3YW50IHRvIGNhbGN1bGF0ZSB3aGljaCBpbmRleCB0bworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBiYXNlZCBvbiBib3RoIGl0cyBwb3NpdGlvbiBhcyB3ZWxsIGFzIGl0J3MgY3VycmVudCBtZW1vcnkgdXNhZ2UsIGFzIHdlbGwKKyAgICAgICAgICAgICAgICAvLyBhcyB3aGV0aGVyIGl0IHdhcyBkaXJlY3RseSByZXF1ZXN0ZWQgdnMuIHdoZXRoZXIgaXQgd2FzIHByZWxvYWRlZCBieSBvdXIgY2FjaGluZworICAgICAgICAgICAgICAgIC8vIG1lY2hhbmlzbS4KKyAgICAgICAgICAgICAgICBtSW5kZXhSZW1vdGVWaWV3cy5yZW1vdmUoZ2V0RmFydGhlc3RQb3NpdGlvbkZyb20ocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBtZXRhZGF0YSBjYWNoZQorICAgICAgICAgICAgaWYgKG1JbmRleE1ldGFEYXRhLmNvbnRhaW5zS2V5KHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzSW5kZXhNZXRhRGF0YSBtZXRhRGF0YSA9IG1JbmRleE1ldGFEYXRhLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbWV0YURhdGEuc2V0KHYsIGl0ZW1JZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JbmRleE1ldGFEYXRhLnB1dChwb3NpdGlvbiwgbmV3IFJlbW90ZVZpZXdzSW5kZXhNZXRhRGF0YSh2LCBpdGVtSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmRleFJlbW90ZVZpZXdzLnB1dChwb3NpdGlvbiwgdik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWV0YURhdGE7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzIGdldFJlbW90ZVZpZXdzQXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobUluZGV4UmVtb3RlVmlld3MuY29udGFpbnNLZXkocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbmRleFJlbW90ZVZpZXdzLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NJbmRleE1ldGFEYXRhIGdldE1ldGFEYXRhQXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobUluZGV4TWV0YURhdGEuY29udGFpbnNLZXkocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbmRleE1ldGFEYXRhLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGdldFJlbW90ZVZpZXdzQml0bWFwTWVtb3J5VXNhZ2UoKSB7CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG1lbW9yeSB1c2FnZSBvZiBhbGwgdGhlIFJlbW90ZVZpZXdzIGJpdG1hcHMgYmVpbmcgY2FjaGVkCisgICAgICAgICAgICBpbnQgbWVtID0gMDsKKyAgICAgICAgICAgIGZvciAoSW50ZWdlciBpIDogbUluZGV4UmVtb3RlVmlld3Mua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyB2ID0gbUluZGV4UmVtb3RlVmlld3MuZ2V0KGkpOworICAgICAgICAgICAgICAgIG1lbSArPSB2LmVzdGltYXRlQml0bWFwTWVtb3J5VXNhZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtZW07CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0RmFydGhlc3RQb3NpdGlvbkZyb20oaW50IHBvcykgeworICAgICAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggZmFydGhlc3QgYXdheSBhbmQgcmVtb3ZlIHRoYXQKKyAgICAgICAgICAgIGludCBtYXhEaXN0ID0gMDsKKyAgICAgICAgICAgIGludCBtYXhEaXN0SW5kZXggPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgOiBtSW5kZXhSZW1vdGVWaWV3cy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIGludCBkaXN0ID0gTWF0aC5hYnMoaS1wb3MpOworICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gbWF4RGlzdCkgeworICAgICAgICAgICAgICAgICAgICBtYXhEaXN0SW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICBtYXhEaXN0ID0gZGlzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWF4RGlzdEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcXVldWVSZXF1ZXN0ZWRQb3NpdGlvblRvTG9hZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEluZGljZXMuYWRkKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMuYWRkKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBxdWV1ZVBvc2l0aW9uc1RvQmVQcmVsb2FkZWRGcm9tUmVxdWVzdGVkUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHByZWxvYWQgYW55IGl0ZW1zCisgICAgICAgICAgICBpZiAobVByZWxvYWRMb3dlckJvdW5kIDw9IHBvc2l0aW9uICYmIHBvc2l0aW9uIDw9IG1QcmVsb2FkVXBwZXJCb3VuZCkgeworICAgICAgICAgICAgICAgIGludCBjZW50ZXIgPSAobVByZWxvYWRVcHBlckJvdW5kICsgbVByZWxvYWRMb3dlckJvdW5kKSAvIDI7CisgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHBvc2l0aW9uIC0gY2VudGVyKSA8IG1NYXhDb3VudFNsYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRhRGF0YSkgeworICAgICAgICAgICAgICAgIGNvdW50ID0gbU1ldGFEYXRhLmNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZEluZGljZXMpIHsKKyAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgIC8vIEFkZCBhbGwgdGhlIHJlcXVlc3RlZCBpbmRpY2VzCisgICAgICAgICAgICAgICAgbUxvYWRJbmRpY2VzLmFkZEFsbChtUmVxdWVzdGVkSW5kaWNlcyk7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgYWxsIHRoZSBwcmVsb2FkIGluZGljZXMKKyAgICAgICAgICAgICAgICBpbnQgaGFsZk1heENvdW50ID0gbU1heENvdW50IC8gMjsKKyAgICAgICAgICAgICAgICBtUHJlbG9hZExvd2VyQm91bmQgPSBwb3NpdGlvbiAtIGhhbGZNYXhDb3VudDsKKyAgICAgICAgICAgICAgICBtUHJlbG9hZFVwcGVyQm91bmQgPSBwb3NpdGlvbiArIGhhbGZNYXhDb3VudDsKKyAgICAgICAgICAgICAgICBpbnQgZWZmZWN0aXZlTG93ZXJCb3VuZCA9IE1hdGgubWF4KDAsIG1QcmVsb2FkTG93ZXJCb3VuZCk7CisgICAgICAgICAgICAgICAgaW50IGVmZmVjdGl2ZVVwcGVyQm91bmQgPSBNYXRoLm1pbihtUHJlbG9hZFVwcGVyQm91bmQsIGNvdW50IC0gMSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGVmZmVjdGl2ZUxvd2VyQm91bmQ7IGkgPD0gZWZmZWN0aXZlVXBwZXJCb3VuZDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkSW5kaWNlcy5hZGQoaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQnV0IHJlbW92ZSBhbGwgdGhlIGluZGljZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgYW5kIGFyZSBjYWNoZWQKKyAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMucmVtb3ZlQWxsKG1JbmRleFJlbW90ZVZpZXdzLmtleVNldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGdldE5leHRJbmRleFRvTG9hZCgpIHsKKyAgICAgICAgICAgIC8vIFdlIHRyeSBhbmQgcHJpb3JpdGl6ZSBpdGVtcyB0aGF0IGhhdmUgYmVlbiByZXF1ZXN0ZWQgZGlyZWN0bHksIGluc3RlYWQKKyAgICAgICAgICAgIC8vIG9mIGl0ZW1zIHRoYXQgYXJlIGxvYWRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY2FjaGluZyBtZWNoYW5pc20KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgLy8gUHJpb3JpdGl6ZSByZXF1ZXN0ZWQgaW5kaWNlcyB0byBiZSBsb2FkZWQgZmlyc3QKKyAgICAgICAgICAgICAgICBpZiAoIW1SZXF1ZXN0ZWRJbmRpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGkgPSBtUmVxdWVzdGVkSW5kaWNlcy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEluZGljZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgcHJlbG9hZCBvdGhlciBpbmRpY2VzIGFzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmICghbUxvYWRJbmRpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGkgPSBtTG9hZEluZGljZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkSW5kaWNlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNSZW1vdGVWaWV3QXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbUluZGV4UmVtb3RlVmlld3MuY29udGFpbnNLZXkocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zTWV0YURhdGFBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5kZXhNZXRhRGF0YS5jb250YWluc0tleShwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IFdlIGRvIG5vdCB0cnkgYW5kIHJlc2V0IHRoZSBtZXRhIGRhdGEsIHNpbmNlIHRoYXQgaW5mb3JtYXRpb24gaXMgc3RpbGwgdXNlZCBieQorICAgICAgICAgICAgLy8gY29sbGVjdGlvbiB2aWV3cyB0byB2YWxpZGF0ZSBpdCdzIG93biBjb250ZW50cyAoYW5kIHdpbGwgYmUgcmUtcmVxdWVzdGVkIGlmIHRoZSBkYXRhCisgICAgICAgICAgICAvLyBpcyBpbnZhbGlkYXRlZCB0aHJvdWdoIHRoZSBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpIGZsb3cpLgorCisgICAgICAgICAgICBtUHJlbG9hZExvd2VyQm91bmQgPSAwOworICAgICAgICAgICAgbVByZWxvYWRVcHBlckJvdW5kID0gLTE7CisgICAgICAgICAgICBtSW5kZXhSZW1vdGVWaWV3cy5jbGVhcigpOworICAgICAgICAgICAgbUluZGV4TWV0YURhdGEuY2xlYXIoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBSZW1vdGVWaWV3c0FkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50LCBSZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgaWYgKG1JbnRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm9uLW51bGwgSW50ZW50IG11c3QgYmUgc3BlY2lmaWVkLiIpOworICAgICAgICB9CisgICAgICAgIG1SZXF1ZXN0ZWRWaWV3cyA9IG5ldyBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0UmVmU2V0KCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgd29ya2VyIHRocmVhZAorICAgICAgICBtV29ya2VyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlJlbW90ZVZpZXdzQ2FjaGUtbG9hZGVyIik7CisgICAgICAgIG1Xb3JrZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbVdvcmtlclF1ZXVlID0gbmV3IEhhbmRsZXIobVdvcmtlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1NYWluUXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY2FjaGUgYW5kIHRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24gb24gc3RhcnR1cAorICAgICAgICBtQ2FjaGUgPSBuZXcgRml4ZWRTaXplUmVtb3RlVmlld3NDYWNoZSg1MCk7CisgICAgICAgIG1DYWxsYmFjayA9IG5ldyBXZWFrUmVmZXJlbmNlPFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2s+KGNhbGxiYWNrKTsKKyAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uKHRoaXMpOworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZE5leHRJbmRleEluQmFja2dyb3VuZCgpIHsKKyAgICAgICAgbVdvcmtlclF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IGluZGV4IHRvIGxvYWQKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG1DYWNoZS5nZXROZXh0SW5kZXhUb0xvYWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgaXRlbSwgYW5kIG5vdGlmeSBhbnkgZXhpc3RpbmcgUmVtb3RlVmlld3NGcmFtZUxheW91dHMKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVtb3RlVmlld3MocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgICAgIC8vIFF1ZXVlIHVwIGZvciB0aGUgbmV4dCBvbmUgdG8gbG9hZAorICAgICAgICAgICAgICAgICAgICBsb2FkTmV4dEluZGV4SW5CYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlTWV0YURhdGEoKSB7CisgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb3BlcnRpZXMvZmlyc3QgdmlldyAoc28gdGhhdCB3ZSBjYW4gdXNlIGl0IHRvCisgICAgICAgICAgICAgICAgLy8gbWVhc3VyZSBvdXIgZHVtbXkgdmlld3MpCisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNTdGFibGVJZHMgPSBmYWN0b3J5Lmhhc1N0YWJsZUlkcygpOworICAgICAgICAgICAgICAgIGludCB2aWV3VHlwZUNvdW50ID0gZmFjdG9yeS5nZXRWaWV3VHlwZUNvdW50KCk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gZmFjdG9yeS5nZXRDb3VudCgpOworICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzIGxvYWRpbmdWaWV3ID0gZmFjdG9yeS5nZXRMb2FkaW5nVmlldygpOworICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzIGZpcnN0VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKChjb3VudCA+IDApICYmIChsb2FkaW5nVmlldyA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXcgPSBmYWN0b3J5LmdldFZpZXdBdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWV0YURhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEuaGFzU3RhYmxlSWRzID0gaGFzU3RhYmxlSWRzOworICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS52aWV3VHlwZUNvdW50ID0gdmlld1R5cGVDb3VudCArIDE7CisgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLmNvdW50ID0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLnNldExvYWRpbmdWaWV3VGVtcGxhdGVzKGxvYWRpbmdWaWV3LCBmaXJzdFZpZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gcHJpbnQgdGhlIGVycm9yCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gcmVxdWVzdE1ldGFEYXRhKCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisKKyAgICAgICAgICAgICAgICAvLyByZXNldCBhbnkgbWVtYmVycyBhZnRlciB0aGUgZmFpbGVkIGNhbGwKKyAgICAgICAgICAgICAgICBmaW5hbCBSZW1vdGVWaWV3c01ldGFEYXRhIG1ldGFEYXRhID0gbUNhY2hlLmdldE1ldGFEYXRhKCk7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtZXRhRGF0YSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5yZXNldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSZW1vdGVWaWV3cyhmaW5hbCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgIC8vIExvYWQgdGhlIGl0ZW0gaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVtb3RlIHNlcnZpY2UKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gbnVsbDsKKyAgICAgICAgICAgIGxvbmcgaXRlbUlkID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVtb3RlVmlld3MgPSBmYWN0b3J5LmdldFZpZXdBdChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbUlkID0gZmFjdG9yeS5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBQcmludCB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiB1cGRhdGVSZW1vdGVWaWV3c0luZm8oIiArIHBvc2l0aW9uICsgIik6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgdG8gcHJldmVudCBhZGRpdGlvbmFsIHdvcmsgaW4gcmUtY2VudGVyaW5nIHRoZSB2aWV3IGNhY2hlLCBhbmQKKyAgICAgICAgICAgICAgICAvLyBzd2FwcGluZyBmcm9tIHRoZSBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIFJlbW90ZVZpZXdzIHdlIGxvYWRlZAorICAgICAgICAgICAgICAgIG1DYWNoZS5pbnNlcnQocG9zaXRpb24sIHJlbW90ZVZpZXdzLCBpdGVtSWQpOworCisgICAgICAgICAgICAgICAgLy8gTm90aWZ5IGFsbCB0aGUgdmlld3MgdGhhdCB3ZSBoYXZlIHByZXZpb3VzbHkgcmV0dXJuZWQgZm9yIHRoaXMgaW5kZXggdGhhdAorICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5ldyBkYXRhIGZvciBpdC4KKyAgICAgICAgICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBydiA9IHJlbW90ZVZpZXdzOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlSWQgPSBtQ2FjaGUuZ2V0TWV0YURhdGFBdChwb3NpdGlvbikudHlwZUlkOworICAgICAgICAgICAgICAgIG1NYWluUXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkVmlld3Mubm90aWZ5T25SZW1vdGVWaWV3c0xvYWRlZChwb3NpdGlvbiwgcnYsIHR5cGVJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBJbnRlbnQgZ2V0UmVtb3RlVmlld3NTZXJ2aWNlSW50ZW50KCkgeworICAgICAgICByZXR1cm4gbUludGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1ldGFEYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0YURhdGEuY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIC8vIERpc2FsbG93IGFyYml0cmFyeSBvYmplY3QgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0gZm9yIHRoZSB0aW1lIGJlaW5nCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlKSB7CisgICAgICAgICAgICBpZiAobUNhY2hlLmNvbnRhaW5zTWV0YURhdGFBdChwb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNhY2hlLmdldE1ldGFEYXRhQXQocG9zaXRpb24pLml0ZW1JZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJdGVtVmlld1R5cGUoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgICAgICBpbnQgdHlwZUlkID0gMDsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGUpIHsKKyAgICAgICAgICAgIGlmIChtQ2FjaGUuY29udGFpbnNNZXRhRGF0YUF0KHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgIHR5cGVJZCA9IG1DYWNoZS5nZXRNZXRhRGF0YUF0KHBvc2l0aW9uKS50eXBlSWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1ldGFEYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0YURhdGEuZ2V0TWFwcGVkVmlld1R5cGUodHlwZUlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGl0ZW0gdHlwZSBpZCBmb3IgdGhlIHNwZWNpZmllZCBjb252ZXJ0IHZpZXcuICBSZXR1cm5zIC0xIGlmIHRoZSBjb252ZXJ0IHZpZXcKKyAgICAgKiBpcyBpbnZhbGlkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldENvbnZlcnRWaWV3VHlwZUlkKFZpZXcgY29udmVydFZpZXcpIHsKKyAgICAgICAgaW50IHR5cGVJZCA9IC0xOworICAgICAgICBpZiAoY29udmVydFZpZXcgIT0gbnVsbCAmJiBjb252ZXJ0Vmlldy5nZXRUYWcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0eXBlSWQgPSAoSW50ZWdlcikgY29udmVydFZpZXcuZ2V0VGFnKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGVJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAvLyAiUmVxdWVzdCIgYW4gaW5kZXggc28gdGhhdCB3ZSBjYW4gcXVldWUgaXQgZm9yIGxvYWRpbmcsIGluaXRpYXRlIHN1YnNlcXVlbnQKKyAgICAgICAgICAgIC8vIHByZWxvYWRpbmcsIGV0Yy4KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlKSB7CisgICAgICAgICAgICAgICAgLy8gUXVldWUgdXAgb3RoZXIgaW5kaWNlcyB0byBiZSBwcmVsb2FkZWQgYmFzZWQgb24gdGhpcyBwb3NpdGlvbgorICAgICAgICAgICAgICAgIG1DYWNoZS5xdWV1ZVBvc2l0aW9uc1RvQmVQcmVsb2FkZWRGcm9tUmVxdWVzdGVkUG9zaXRpb24ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgUmVtb3RlVmlld3NGcmFtZUxheW91dCBsYXlvdXQgPSAoUmVtb3RlVmlld3NGcmFtZUxheW91dCkgY29udmVydFZpZXc7CisgICAgICAgICAgICAgICAgVmlldyBjb252ZXJ0Vmlld0NoaWxkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgY29udmVydFZpZXdUeXBlSWQgPSAwOworICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRWaWV3Q2hpbGQgPSBsYXlvdXQuZ2V0Q2hpbGRBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFZpZXdUeXBlSWQgPSBnZXRDb252ZXJ0Vmlld1R5cGVJZChjb252ZXJ0Vmlld0NoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIHdlIHRyeSBhbmQgcmV0cmlldmUgdGhlIFJlbW90ZVZpZXdzIGZyb20gdGhlIGNhY2hlLCByZXR1cm5pbmcgYSBsb2FkaW5nCisgICAgICAgICAgICAgICAgLy8gdmlldyBhbmQgcXVldWVpbmcgaXQgdG8gYmUgbG9hZGVkIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZC4KKyAgICAgICAgICAgICAgICBpZiAobUNhY2hlLmNvbnRhaW5zUmVtb3RlVmlld0F0KHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBwYXJlbnQuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3cyBydiA9IG1DYWNoZS5nZXRSZW1vdGVWaWV3c0F0KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVJZCA9IG1DYWNoZS5nZXRNZXRhRGF0YUF0KHBvc2l0aW9uKS50eXBlSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgdGhlIGNvbnZlcnQgdmlldyB3aGVyZSBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3VHlwZUlkID09IHR5cGVJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2LnJlYXBwbHkoY29udGV4dCwgY29udmVydFZpZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgdmlldyB0byBiZSByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgICBWaWV3IG5ld1ZpZXcgPSBydi5hcHBseShjb250ZXh0LCBwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICBuZXdWaWV3LnNldFRhZyhuZXcgSW50ZWdlcih0eXBlSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dC5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0ID0gbmV3IFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQoY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcobmV3Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhY2hlIGRvZXMgbm90IGhhdmUgdGhlIFJlbW90ZVZpZXdzIGF0IHRoaXMgcG9zaXRpb24sIHRoZW4gY3JlYXRlIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9hZGluZyB2aWV3IGFuZCBxdWV1ZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRvIGJlIGxvYWRlZCBpbiB0aGUgYmFja2dyb3VuZAorICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGxvYWRpbmdWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1ldGFEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nVmlldyA9IG1ldGFEYXRhLmNyZWF0ZUxvYWRpbmdWaWV3KHBvc2l0aW9uLCBjb252ZXJ0VmlldywgcGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRWaWV3cy5hZGQocG9zaXRpb24sIGxvYWRpbmdWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLnF1ZXVlUmVxdWVzdGVkUG9zaXRpb25Ub0xvYWQocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBsb2FkTmV4dEluZGV4SW5CYWNrZ3JvdW5kKCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRpbmdWaWV3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFZpZXcocGFyZW50LmdldENvbnRleHQoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRWaWV3VHlwZUNvdW50KCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1ldGFEYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0YURhdGEudmlld1R5cGVDb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzTWV0YURhdGEgbWV0YURhdGEgPSBtQ2FjaGUuZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtZXRhRGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhLmhhc1N0YWJsZUlkczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBnZXRDb3VudCgpIDw9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIG1Xb3JrZXJRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIHRoZSBhY3R1YWwgbm90aWZ5RGF0YVNldENoYW5nZWQoKSBjYWxsIGluaXRpYXRlZCBlYXJsaWVyCisgICAgICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIElSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSA9IG1TZXJ2aWNlQ29ubmVjdGlvbi5nZXRSZW1vdGVWaWV3c0ZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcnkub25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gdXBkYXRlTm90aWZ5RGF0YVNldENoYW5nZWQoKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGVhcmx5IHRvIHByZXZlbnQgZnJvbSBmdXJ0aGVyIGJlaW5nIG5vdGlmaWVkIChzaW5jZSBub3RoaW5nIGhhcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZsdXNoIHRoZSBjYWNoZSBzbyB0aGF0IHdlIGNhbiByZWxvYWQgbmV3IGl0ZW1zIGZyb20gdGhlIHNlcnZpY2UKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUucmVzZXQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBSZS1yZXF1ZXN0IHRoZSBuZXcgbWV0YWRhdGEgKG9ubHkgYWZ0ZXIgdGhlIG5vdGlmaWNhdGlvbiB0byB0aGUgZmFjdG9yeSkKKyAgICAgICAgICAgICAgICB1cGRhdGVNZXRhRGF0YSgpOworCisgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBub3RpZmljYXRpb24gYmFjayB0byB0aGUgYmFzZSBhZGFwdGVyCisgICAgICAgICAgICAgICAgbU1haW5RdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyTm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBOb3RlOiB3ZSBkbyBub3QgY2FsbCBzdXBlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpIHVudGlsIHRoZSBSZW1vdGVWaWV3c0ZhY3RvcnkgaGFzIGhhZAorICAgICAgICAvLyBhIGNoYW5jZSB0byB1cGRhdGUgaXRzZWxmIGFuZCByZXR1cm4gbmV3IG1ldGEgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBkYXRhLgorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdXBlck5vdGlmeURhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICBzdXBlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiByZXF1ZXN0QmluZFNlcnZpY2UoKSB7CisgICAgICAgIC8vIHRyeSBiaW5kaW5nIHRoZSBzZXJ2aWNlICh3aGljaCB3aWxsIHN0YXJ0IGl0IGlmIGl0J3Mgbm90IGFscmVhZHkgcnVubmluZykKKyAgICAgICAgaWYgKCFtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgbUNvbnRleHQuYmluZFNlcnZpY2UobUludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c1NlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEyNmFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LklSZW1vdGVWaWV3c0ZhY3Rvcnk7CisKKy8qKgorICogVGhlIHNlcnZpY2UgdG8gYmUgY29ubmVjdGVkIHRvIGZvciBhIHJlbW90ZSBhZGFwdGVyIHRvIHJlcXVlc3QgUmVtb3RlVmlld3MuICBVc2VycyBzaG91bGQKKyAqIGV4dGVuZCB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIHRvIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIFJlbW90ZVZpZXdzRmFjdG9yeSdzIHVzZWQgdG8KKyAqIHBvcHVsYXRlIHRoZSByZW1vdGUgY29sbGVjdGlvbiB2aWV3IChMaXN0VmlldywgR3JpZFZpZXcsIGV0YykuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW1vdGVWaWV3c1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlJlbW90ZVZpZXdzU2VydmljZSI7CisKKyAgICAvLyBtdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiBmb3IgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgcHJpdmF0ZSBIYXNoTWFwPEludGVudC5GaWx0ZXJDb21wYXJpc29uLCBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4+IG1SZW1vdGVWaWV3RmFjdG9yaWVzOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJmYWNlIGZvciBhbiBhZGFwdGVyIGJldHdlZW4gYSByZW1vdGUgY29sbGVjdGlvbiB2aWV3IChMaXN0VmlldywgR3JpZFZpZXcsIGV0YykgYW5kCisgICAgICogdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgdGhhdCB2aWV3LiAgVGhlIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgYSBSZW1vdGVWaWV3CisgICAgICogZm9yIGVhY2ggaXRlbSBpbiB0aGUgZGF0YSBzZXQuCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVyCisgICAgICogQHNlZSBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW1vdGVWaWV3c0ZhY3RvcnkgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4geW91ciBmYWN0b3J5IGlzIGZpcnN0IGNvbnN0cnVjdGVkLiBUaGUgc2FtZSBmYWN0b3J5IG1heSBiZSBzaGFyZWQgYWNyb3NzCisgICAgICAgICAqIG11bHRpcGxlIFJlbW90ZVZpZXdBZGFwdGVycyBkZXBlbmRpbmcgb24gdGhlIGludGVudCBwYXNzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gbm90aWZ5RGF0YVNldENoYW5nZWQoKSBpcyB0cmlnZ2VyZWQgb24gdGhlIHJlbW90ZSBhZGFwdGVyLiBUaGlzIGFsbG93cyBhCisgICAgICAgICAqIFJlbW90ZVZpZXdzRmFjdG9yeSB0byByZXNwb25kIHRvIGRhdGEgY2hhbmdlcyBieSB1cGRhdGluZyBhbnkgaW50ZXJuYWwgcmVmZXJlbmNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyI25vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSwgaW50KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGxhc3QgUmVtb3RlVmlld3NBZGFwdGVyIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmFjdG9yeSBpcworICAgICAgICAgKiB1bmJvdW5kLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCk7CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpOworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3MgZ2V0Vmlld0F0KGludCBwb3NpdGlvbik7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpOworICAgICAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKTsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbik7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcHJpdmF0ZSBwcm94eSBjbGFzcyBmb3IgdGhlIHByaXZhdGUgSVJlbW90ZVZpZXdzRmFjdG9yeSBpbnRlcmZhY2UgdGhyb3VnaCB0aGUKKyAgICAgKiBwdWJsaWMgUmVtb3RlVmlld3NGYWN0b3J5IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzRmFjdG9yeUFkYXB0ZXIgZXh0ZW5kcyBJUmVtb3RlVmlld3NGYWN0b3J5LlN0dWIgeworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NGYWN0b3J5QWRhcHRlcihSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgICAgICAgbUZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvbkRhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAgICAgbUZhY3Rvcnkub25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldENvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBSZW1vdGVWaWV3cyBydiA9IG1GYWN0b3J5LmdldFZpZXdBdChwb3NpdGlvbik7CisgICAgICAgICAgICBydi5zZXRJc1dpZGdldENvbGxlY3Rpb25DaGlsZCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBydjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIFJlbW90ZVZpZXdzIGdldExvYWRpbmdWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldExvYWRpbmdWaWV3KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRWaWV3VHlwZUNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZhY3RvcnkuaGFzU3RhYmxlSWRzKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzRmFjdG9yeSBtRmFjdG9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlVmlld3NTZXJ2aWNlKCkgeworICAgICAgICBtUmVtb3RlVmlld0ZhY3RvcmllcyA9CisgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZW50LkZpbHRlckNvbXBhcmlzb24sIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPj4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB0byB0aGUgcGFydGljdWxhciBmYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVudAorICAgICAgICAgICAgSW50ZW50LkZpbHRlckNvbXBhcmlzb24gZmMgPSBuZXcgSW50ZW50LkZpbHRlckNvbXBhcmlzb24oaW50ZW50KTsKKyAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBmYWN0b3J5UmVmID0gbnVsbDsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIGlmICghbVJlbW90ZVZpZXdGYWN0b3JpZXMuY29udGFpbnNLZXkoZmMpKSB7CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG9uR2V0Vmlld0ZhY3RvcnkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5UmVmID0gbmV3IFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPihmYWN0b3J5LCAxKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoZmMsIGZhY3RvcnlSZWYpOworICAgICAgICAgICAgICAgIGZhY3Rvcnkub25DcmVhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IG9sZEZhY3RvcnlSZWYgPSBtUmVtb3RlVmlld0ZhY3Rvcmllcy5nZXQoZmMpOworICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBvbGRGYWN0b3J5UmVmLmZpcnN0OworICAgICAgICAgICAgICAgIGludCBuZXdSZWZDb3VudCA9IG9sZEZhY3RvcnlSZWYuc2Vjb25kLmludFZhbHVlKCkgKyAxOworICAgICAgICAgICAgICAgIGZhY3RvcnlSZWYgPSBuZXcgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+KG9sZEZhY3RvcnlSZWYuZmlyc3QsIG5ld1JlZkNvdW50KTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoZmMsIGZhY3RvcnlSZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdGVWaWV3c0ZhY3RvcnlBZGFwdGVyKGZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBJbnRlbnQuRmlsdGVyQ29tcGFyaXNvbiBmYyA9IG5ldyBJbnRlbnQuRmlsdGVyQ29tcGFyaXNvbihpbnRlbnQpOworICAgICAgICAgICAgaWYgKG1SZW1vdGVWaWV3RmFjdG9yaWVzLmNvbnRhaW5zS2V5KGZjKSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsZXZpYXRlcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IG9mIGhhdmluZyB0byBjbGVhciBhbGwgZmFjdG9yaWVzCisgICAgICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IG9sZEZhY3RvcnlSZWYgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMuZ2V0KGZjKTsKKyAgICAgICAgICAgICAgICBpbnQgbmV3UmVmQ291bnQgPSBvbGRGYWN0b3J5UmVmLnNlY29uZC5pbnRWYWx1ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UmVmQ291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBvbGRGYWN0b3J5UmVmLmZpcnN0Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5yZW1vdmUoZmMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBmYWN0b3J5UmVmID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+KG9sZEZhY3RvcnlSZWYuZmlyc3QsIG5ld1JlZkNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMucHV0KGZjLCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uVW5iaW5kKGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgc2VydmljZSB0byBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBmYWN0b3JpZXMgZm9yCisgICAgICogdGhlIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJlbW90ZVZpZXdzRmFjdG9yeSBvbkdldFZpZXdGYWN0b3J5KEludGVudCBpbnRlbnQpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IGM5YzIxN2EuLmFlZTQxMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZXNvdXJjZUN1cnNvckFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVzb3VyY2VDdXJzb3JBZGFwdGVyLmphdmEKQEAgLTM2LDkgKzM2LDggQEAKICAgICAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgKiAgICAgICAgICAgIFNpbXBsZUxpc3RJdGVtRmFjdG9yeSBpcyBydW5uaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWRhcHRlciBpcyBydW5uaW5nCiAgICAgICogQHBhcmFtIGxheW91dCByZXNvdXJjZSBpZGVudGlmaWVyIG9mIGEgbGF5b3V0IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSB2aWV3cwogICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgbGlzdCBpdGVtLiAgVW5sZXNzIHlvdSBvdmVycmlkZSB0aGVtIGxhdGVyLCB0aGlzIHdpbGwKICAgICAgKiAgICAgICAgICAgIGRlZmluZSBib3RoIHRoZSBpdGVtIHZpZXdzIGFuZCB0aGUgZHJvcCBkb3duIHZpZXdzLgpAQCAtNTEsOSArNTAsOCBAQAogICAgIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAqICAgICAgICAgICAgU2ltcGxlTGlzdEl0ZW1GYWN0b3J5IGlzIHJ1bm5pbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGFwdGVyIGlzIHJ1bm5pbmcKICAgICAgKiBAcGFyYW0gbGF5b3V0IHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSBsYXlvdXQgZmlsZSB0aGF0IGRlZmluZXMgdGhlIHZpZXdzCiAgICAgICogICAgICAgICAgICBmb3IgdGhpcyBsaXN0IGl0ZW0uICBVbmxlc3MgeW91IG92ZXJyaWRlIHRoZW0gbGF0ZXIsIHRoaXMgd2lsbAogICAgICAqICAgICAgICAgICAgZGVmaW5lIGJvdGggdGhlIGl0ZW0gdmlld3MgYW5kIHRoZSBkcm9wIGRvd24gdmlld3MuCkBAIC02OSw2ICs2NywyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhlIExpc3RWaWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFkYXB0ZXIgaXMgcnVubmluZworICAgICAqIEBwYXJhbSBsYXlvdXQgcmVzb3VyY2UgaWRlbnRpZmllciBvZiBhIGxheW91dCBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgdmlld3MKKyAgICAgKiAgICAgICAgICAgIGZvciB0aGlzIGxpc3QgaXRlbS4gIFVubGVzcyB5b3Ugb3ZlcnJpZGUgdGhlbSBsYXRlciwgdGhpcyB3aWxsCisgICAgICogICAgICAgICAgICBkZWZpbmUgYm90aCB0aGUgaXRlbSB2aWV3cyBhbmQgdGhlIGRyb3AgZG93biB2aWV3cy4KKyAgICAgKiBAcGFyYW0gYyBUaGUgY3Vyc29yIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBmbGFncyBmbGFncyB1c2VkIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGxheW91dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBjLCBmbGFncyk7CisgICAgICAgIG1MYXlvdXQgPSBtRHJvcERvd25MYXlvdXQgPSBsYXlvdXQ7CisgICAgICAgIG1JbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEluZmxhdGVzIHZpZXcocykgZnJvbSB0aGUgc3BlY2lmaWVkIFhNTCBmaWxlLgogICAgICAqIAogICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciNuZXdWaWV3KGFuZHJvaWQuY29udGVudC5Db250ZXh0LApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQppbmRleCAzYjExM2FlLi45M2ExMTc5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQpAQCAtMTExLDggKzExMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBSZWN0IHIgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgaWYgKGNhbnZhcy5xdWlja1JlamVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgCi0gICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkFBKSkgeworICAgICAgICBpZiAoY2FudmFzLnF1aWNrUmVqZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCBDYW52YXMuRWRnZVR5cGUuQUEpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRyYXdUcmFjaykgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxWaWV3LmphdmEKaW5kZXggMWRhZjJhYi4uZWI1MjdlYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsVmlldy5qYXZhCkBAIC0xOSwxMSArMTksOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwpAQCAtNTIsNiArNDksOCBAQAogICogd2l0aGluIGEgbGFyZ2VyIGNvbnRhaW5lci4KICAqIAogICogPHA+U2Nyb2xsVmlldyBvbmx5IHN1cHBvcnRzIHZlcnRpY2FsIHNjcm9sbGluZy4KKyAqCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICovCiBwdWJsaWMgY2xhc3MgU2Nyb2xsVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKICAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1BVEVEX1NDUk9MTF9HQVAgPSAyNTA7CkBAIC02Miw5ICs2MSw3IEBACiAgICAgcHJpdmF0ZSBsb25nIG1MYXN0U2Nyb2xsOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgcHJpdmF0ZSBPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93VG9wOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93Qm90dG9tOworICAgIHByaXZhdGUgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCiAgICAgLyoqCiAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBtb3ZpbmcgZm9jdXMgb3Vyc2VsdmVzLiBUaGlzIGlzIHNvIHRoZQpAQCAtMTE4LDkgKzExNSw2IEBACiAgICAgcHJpdmF0ZSBpbnQgbU1pbmltdW1WZWxvY2l0eTsKICAgICBwcml2YXRlIGludCBtTWF4aW11bVZlbG9jaXR5OwogICAgIAotICAgIHByaXZhdGUgaW50IG1PdmVyc2Nyb2xsRGlzdGFuY2U7Ci0gICAgcHJpdmF0ZSBpbnQgbU92ZXJmbGluZ0Rpc3RhbmNlOwotCiAgICAgLyoqCiAgICAgICogSUQgb2YgdGhlIGFjdGl2ZSBwb2ludGVyLiBUaGlzIGlzIHVzZWQgdG8gcmV0YWluIGNvbnNpc3RlbmN5IGR1cmluZwogICAgICAqIGRyYWdzL2ZsaW5ncyBpZiBtdWx0aXBsZSBwb2ludGVycyBhcmUgdXNlZC4KQEAgLTE5Myw3ICsxODcsNyBAQAogCiAKICAgICBwcml2YXRlIHZvaWQgaW5pdFNjcm9sbFZpZXcoKSB7Ci0gICAgICAgIG1TY3JvbGxlciA9IG5ldyBPdmVyU2Nyb2xsZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGdldENvbnRleHQoKSk7CiAgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShGT0NVU19BRlRFUl9ERVNDRU5EQU5UUyk7CiAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKQEAgLTIwMSw4ICsxOTUsNiBAQAogICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgbU1pbmltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWluaW11bUZsaW5nVmVsb2NpdHkoKTsKICAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI1Nyw2ICsyNDksOCBAQAogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgU2Nyb2xsVmlldydzIGNvbnRlbnQgaXMgc3RyZXRjaGVkIHRvIGZpbGwgdGhlIHZpZXdwb3J0LgogICAgICAqCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250ZW50IGZpbGxzIHRoZSB2aWV3cG9ydCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1Njcm9sbFZpZXdfZmlsbFZpZXdwb3J0CiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxsVmlld3BvcnQoKSB7CiAgICAgICAgIHJldHVybiBtRmlsbFZpZXdwb3J0OwpAQCAtMjY4LDYgKzI2Miw4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsbFZpZXdwb3J0IFRydWUgdG8gc3RyZXRjaCB0aGUgY29udGVudCdzIGhlaWdodCB0byB0aGUgdmlld3BvcnQncwogICAgICAqICAgICAgICBib3VuZGFyaWVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU2Nyb2xsVmlld19maWxsVmlld3BvcnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGaWxsVmlld3BvcnQoYm9vbGVhbiBmaWxsVmlld3BvcnQpIHsKICAgICAgICAgaWYgKGZpbGxWaWV3cG9ydCAhPSBtRmlsbFZpZXdwb3J0KSB7CkBAIC00NjMsOSArNDU5LDYgQEAKICAgICAgICAgICAgICAgICAvKiBSZWxlYXNlIHRoZSBkcmFnICovCiAgICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ0JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCAwLCAwLCBnZXRTY3JvbGxSYW5nZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKICAgICAgICAgICAgICAgICBvblNlY29uZGFyeVBvaW50ZXJVcChldik7CkBAIC00OTgsNyArNDkxLDkgQEAKICAgICAgICAgc3dpdGNoIChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgewogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewogICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBldi5nZXRZKCk7Ci0gICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShtSXNCZWluZ0RyYWdnZWQgPSBpbkNoaWxkKChpbnQpIGV2LmdldFgoKSwgKGludCkgeSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBJZiBiZWluZyBmbGluZ2VkIGFuZCB1c2VyIHRvdWNoZXMsIHN0b3AgdGhlIGZsaW5nLiBpc0ZpbmlzaGVkCkBAIC01MjEsMzIgKzUxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZWx0YVkgPSAoaW50KSAobUxhc3RNb3Rpb25ZIC0geSk7CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0TW90aW9uWSA9IHk7CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9sZFggPSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJTY3JvbGxCeSgwLCBkZWx0YVksIDAsIG1TY3JvbGxZLCAwLCByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgb3VyIHZlbG9jaXR5IGlmIHdlIGhpdCBhIHNjcm9sbCBiYXJyaWVyLgotICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJTY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSX1NDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUl9TQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmIHJhbmdlID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwdWxsZWRUb1kgPSBvbGRZICsgZGVsdGFZOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB1bGxlZFRvWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgZGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93Qm90dG9tLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdWxsZWRUb1kgPiByYW5nZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblB1bGwoKGZsb2F0KSBkZWx0YVkgLyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dUb3AuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQnkoMCwgZGVsdGFZKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogCkBAIC01NTUsMTUgKzUyNSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5VHJhY2tlci5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEwMDAsIG1NYXhpbXVtVmVsb2NpdHkpOwogICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbFZlbG9jaXR5ID0gKGludCkgdmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChNYXRoLmFicyhpbml0aWFsVmVsb2NpdHkpID4gbU1pbmltdW1WZWxvY2l0eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGluZygtaW5pdGlhbFZlbG9jaXR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IGdldFNjcm9sbFJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdCYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgMCwgMCwgYm90dG9tKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCAmJiBNYXRoLmFicyhpbml0aWFsVmVsb2NpdHkpID4gbU1pbmltdW1WZWxvY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxpbmcoLWluaXRpYWxWZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwpAQCAtNTczLDI3ICs1MzYsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6CiAgICAgICAgICAgICAgICAgaWYgKG1Jc0JlaW5nRHJhZ2dlZCAmJiBnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nQmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIDAsIDAsIGdldFNjcm9sbFJhbmdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKICAgICAgICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOgpAQCAtNjIwLDMyICs1NzIsNiBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uT3ZlclNjcm9sbGVkKGludCBzY3JvbGxYLCBpbnQgc2Nyb2xsWSwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xhbXBlZFgsIGJvb2xlYW4gY2xhbXBlZFkpIHsKLSAgICAgICAgLy8gVHJlYXQgYW5pbWF0aW5nIHNjcm9sbHMgZGlmZmVyZW50bHk7IHNlZSAjY29tcHV0ZVNjcm9sbCgpIGZvciB3aHkuCi0gICAgICAgIGlmICghbVNjcm9sbGVyLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgbVNjcm9sbFggPSBzY3JvbGxYOwotICAgICAgICAgICAgbVNjcm9sbFkgPSBzY3JvbGxZOwotICAgICAgICAgICAgaWYgKGNsYW1wZWRZKSB7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbGVyLnNwcmluZ0JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCAwLCAwLCBnZXRTY3JvbGxSYW5nZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLnNjcm9sbFRvKHNjcm9sbFgsIHNjcm9sbFkpOwotICAgICAgICB9Ci0gICAgICAgIGF3YWtlblNjcm9sbEJhcnMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaW50IHNjcm9sbFJhbmdlID0gMDsKLSAgICAgICAgaWYgKGdldENoaWxkQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KDApOwotICAgICAgICAgICAgc2Nyb2xsUmFuZ2UgPSBNYXRoLm1heCgwLAotICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRIZWlnaHQoKSAtIChnZXRIZWlnaHQoKSAtIG1QYWRkaW5nQm90dG9tIC0gbVBhZGRpbmdUb3ApKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogPHA+CiAgICAgICogRmluZHMgdGhlIG5leHQgZm9jdXNhYmxlIGNvbXBvbmVudCB0aGF0IGZpdHMgaW4gdGhpcyBWaWV3J3MgYm91bmRzCkBAIC0xMDIyLDE2ICs5NDgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRIZWlnaHQ7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IGdldENoaWxkQXQoMCkuZ2V0Qm90dG9tKCk7Ci0gICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsQm90dG9tID0gTWF0aC5tYXgoMCwgc2Nyb2xsUmFuZ2UgLSBjb250ZW50SGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSAtPSBzY3JvbGxZOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFkgPiBvdmVyc2Nyb2xsQm90dG9tKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSArPSBzY3JvbGxZIC0gb3ZlcnNjcm9sbEJvdHRvbTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzY3JvbGxSYW5nZTsKKyAgICAgICAgcmV0dXJuIGdldENoaWxkQXQoMCkuZ2V0Qm90dG9tKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMDkyLDIwICsxMDA5LDE0IEBACiAgICAgICAgICAgICBpbnQgeCA9IG1TY3JvbGxlci5nZXRDdXJyWCgpOwogICAgICAgICAgICAgaW50IHkgPSBtU2Nyb2xsZXIuZ2V0Q3VyclkoKTsKIAotICAgICAgICAgICAgaWYgKG9sZFggIT0geCB8fCBvbGRZICE9IHkpIHsKLSAgICAgICAgICAgICAgICBvdmVyU2Nyb2xsQnkoeCAtIG9sZFgsIHkgLSBvbGRZLCBvbGRYLCBvbGRZLCAwLCBnZXRTY3JvbGxSYW5nZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmFuZ2UgPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJTY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJfU0NST0xMX0FMV0FZUyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJfU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyAmJiByYW5nZSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh5IDwgMCAmJiBvbGRZID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPiByYW5nZSAmJiBvbGRZIDw9IHJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldENoaWxkQ291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdCgwKTsKKyAgICAgICAgICAgICAgICB4ID0gY2xhbXAoeCwgZ2V0V2lkdGgoKSAtIG1QYWRkaW5nUmlnaHQgLSBtUGFkZGluZ0xlZnQsIGNoaWxkLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgIHkgPSBjbGFtcCh5LCBnZXRIZWlnaHQoKSAtIG1QYWRkaW5nQm90dG9tIC0gbVBhZGRpbmdUb3AsIGNoaWxkLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoeCAhPSBvbGRYIHx8IHkgIT0gb2xkWSkgeworICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWCA9IHg7CisgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZID0geTsKKyAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKHgsIHksIG9sZFgsIG9sZFkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF3YWtlblNjcm9sbEJhcnMoKTsKQEAgLTEzNDMsNyArMTI1NCw3IEBACiAgICAgICAgICAgICBpbnQgYm90dG9tID0gZ2V0Q2hpbGRBdCgwKS5nZXRIZWlnaHQoKTsKICAgICAKICAgICAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIHZlbG9jaXR5WSwgMCwgMCwgMCwgCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIGJvdHRvbSAtIGhlaWdodCksIDAsIGhlaWdodC8yKTsKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgYm90dG9tIC0gaGVpZ2h0KSk7CiAgICAgCiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG1vdmluZ0Rvd24gPSB2ZWxvY2l0eVkgPiAwOwogICAgIApAQCAtMTM4MSw1NSArMTI5Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVyU2Nyb2xsTW9kZShpbnQgbW9kZSkgewotICAgICAgICBpZiAobW9kZSAhPSBPVkVSX1NDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBlZGdlID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9lZGdlKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBnbG93ID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9nbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3AgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0T3ZlclNjcm9sbE1vZGUobW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dUb3AuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwgTWF0aC5taW4oMCwgc2Nyb2xsWSkpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5zZXRTaXplKHdpZHRoICogMiwgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd0JvdHRvbS5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwgTWF0aC5tYXgoZ2V0U2Nyb2xsUmFuZ2UoKSwgc2Nyb2xsWSkgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMTgwLCB3aWR0aCwgMCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLnNldFNpemUod2lkdGggKiAyLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dCb3R0b20uZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGludCBjbGFtcChpbnQgbiwgaW50IG15LCBpbnQgY2hpbGQpIHsKICAgICAgICAgaWYgKG15ID49IGNoaWxkIHx8IG4gPCAwKSB7CiAgICAgICAgICAgICAvKiBteSA+PSBjaGlsZCBpcyB0aGlzIGNhc2U6CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhCmluZGV4IDIzZjcyYjYuLjRjYjA4MzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhCkBAIC01MCw2ICs1MCw4IEBACiAgICAgcHJpdmF0ZSBmbG9hdCBtRHVyYXRpb25SZWNpcHJvY2FsOwogICAgIHByaXZhdGUgZmxvYXQgbURlbHRhWDsKICAgICBwcml2YXRlIGZsb2F0IG1EZWx0YVk7CisgICAgcHJpdmF0ZSBmbG9hdCBtVmlzY291c0ZsdWlkU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtVmlzY291c0ZsdWlkTm9ybWFsaXplOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CiAgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKIApAQCAtNjMsMTcgKzY1LDYgQEAKIAogICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURlY2VsZXJhdGlvbjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHNWaXNjb3VzRmx1aWRTY2FsZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBzVmlzY291c0ZsdWlkTm9ybWFsaXplOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gVGhpcyBjb250cm9scyB0aGUgdmlzY291cyBmbHVpZCBlZmZlY3QgKGhvdyBtdWNoIG9mIGl0KQotICAgICAgICBzVmlzY291c0ZsdWlkU2NhbGUgPSA4LjBmOwotICAgICAgICAvLyBtdXN0IGJlIHNldCB0byAxLjAgKHVzZWQgaW4gdmlzY291c0ZsdWlkKCkpCi0gICAgICAgIHNWaXNjb3VzRmx1aWROb3JtYWxpemUgPSAxLjBmOwotICAgICAgICBzVmlzY291c0ZsdWlkTm9ybWFsaXplID0gMS4wZiAvIHZpc2NvdXNGbHVpZCgxLjBmKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBTY3JvbGxlciB3aXRoIHRoZSBkZWZhdWx0IGR1cmF0aW9uIGFuZCBpbnRlcnBvbGF0b3IuCiAgICAgICovCkBAIC0yODYsNiArMjc3LDExIEBACiAgICAgICAgIG1EZWx0YVggPSBkeDsKICAgICAgICAgbURlbHRhWSA9IGR5OwogICAgICAgICBtRHVyYXRpb25SZWNpcHJvY2FsID0gMS4wZiAvIChmbG9hdCkgbUR1cmF0aW9uOworICAgICAgICAvLyBUaGlzIGNvbnRyb2xzIHRoZSB2aXNjb3VzIGZsdWlkIGVmZmVjdCAoaG93IG11Y2ggb2YgaXQpCisgICAgICAgIG1WaXNjb3VzRmx1aWRTY2FsZSA9IDguMGY7CisgICAgICAgIC8vIG11c3QgYmUgc2V0IHRvIDEuMCAodXNlZCBpbiB2aXNjb3VzRmx1aWQoKSkKKyAgICAgICAgbVZpc2NvdXNGbHVpZE5vcm1hbGl6ZSA9IDEuMGY7CisgICAgICAgIG1WaXNjb3VzRmx1aWROb3JtYWxpemUgPSAxLjBmIC8gdmlzY291c0ZsdWlkKDEuMGYpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzQzLDkgKzMzOSwxMSBAQAogICAgICAgICBtRmluYWxZID0gTWF0aC5tYXgobUZpbmFsWSwgbU1pblkpOwogICAgIH0KICAgICAKLSAgICBzdGF0aWMgZmxvYXQgdmlzY291c0ZsdWlkKGZsb2F0IHgpCisgICAgCisgICAgCisgICAgcHJpdmF0ZSBmbG9hdCB2aXNjb3VzRmx1aWQoZmxvYXQgeCkKICAgICB7Ci0gICAgICAgIHggKj0gc1Zpc2NvdXNGbHVpZFNjYWxlOworICAgICAgICB4ICo9IG1WaXNjb3VzRmx1aWRTY2FsZTsKICAgICAgICAgaWYgKHggPCAxLjBmKSB7CiAgICAgICAgICAgICB4IC09ICgxLjBmIC0gKGZsb2F0KU1hdGguZXhwKC14KSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zNTMsNyArMzUxLDcgQEAKICAgICAgICAgICAgIHggPSAxLjBmIC0gKGZsb2F0KU1hdGguZXhwKDEuMGYgLSB4KTsKICAgICAgICAgICAgIHggPSBzdGFydCArIHggKiAoMS4wZiAtIHN0YXJ0KTsKICAgICAgICAgfQotICAgICAgICB4ICo9IHNWaXNjb3VzRmx1aWROb3JtYWxpemU7CisgICAgICAgIHggKj0gbVZpc2NvdXNGbHVpZE5vcm1hbGl6ZTsKICAgICAgICAgcmV0dXJuIHg7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NlYXJjaFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TZWFyY2hWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkNjc1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TZWFyY2hWaWV3LmphdmEKQEAgLTAsMCArMSw4MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlN1Z2dlc3Rpb25zQWRhcHRlci5nZXRDb2x1bW5TdHJpbmc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hhYmxlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Lk9uRWRpdG9yQWN0aW9uTGlzdGVuZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CisKKy8qKgorICogUHJvdmlkZXMgdGhlIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIGZvciB0aGUgdXNlciB0byBlbnRlciBhIHNlYXJjaCBxdWVyeSBhbmQgc3VibWl0IGEKKyAqIHJlcXVlc3QgdG8gYSBzZWFyY2ggcHJvdmlkZXIuIFNob3dzIGEgbGlzdCBvZiBxdWVyeSBzdWdnZXN0aW9ucyBvciByZXN1bHRzLCBpZgorICogYXZhaWxhYmxlIGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gcGljayBhIHN1Z2dlc3Rpb24gb3IgcmVzdWx0IHRvIGxhdW5jaCBpbnRvLgorICovCitwdWJsaWMgY2xhc3MgU2VhcmNoVmlldyBleHRlbmRzIExpbmVhckxheW91dCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlNlYXJjaFZpZXciOworCisgICAgcHJpdmF0ZSBPblF1ZXJ5Q2hhbmdlTGlzdGVuZXIgbU9uUXVlcnlDaGFuZ2VMaXN0ZW5lcjsKKyAgICBwcml2YXRlIE9uQ2xvc2VMaXN0ZW5lciBtT25DbG9zZUxpc3RlbmVyOworICAgIHByaXZhdGUgT25Gb2N1c0NoYW5nZUxpc3RlbmVyIG1PblF1ZXJ5VGV4dEZvY3VzQ2hhbmdlTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBPblN1Z2dlc3Rpb25TZWxlY3Rpb25MaXN0ZW5lciBtT25TdWdnZXN0aW9uTGlzdGVuZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUljb25pZmllZEJ5RGVmYXVsdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUljb25pZmllZDsKKyAgICBwcml2YXRlIEN1cnNvckFkYXB0ZXIgbVN1Z2dlc3Rpb25zQWRhcHRlcjsKKyAgICBwcml2YXRlIFZpZXcgbVNlYXJjaEJ1dHRvbjsKKyAgICBwcml2YXRlIFZpZXcgbVN1Ym1pdEJ1dHRvbjsKKyAgICBwcml2YXRlIFZpZXcgbUNsb3NlQnV0dG9uOworICAgIHByaXZhdGUgVmlldyBtU2VhcmNoRWRpdEZyYW1lOworICAgIHByaXZhdGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgbVF1ZXJ5VGV4dFZpZXc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdWJtaXRCdXR0b25FbmFibGVkOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1RdWVyeUhpbnQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1RdWVyeVJlZmluZW1lbnQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DbGVhcmluZ0ZvY3VzOworCisgICAgcHJpdmF0ZSBTZWFyY2hhYmxlSW5mbyBtU2VhcmNoYWJsZTsKKworICAgIC8vIEEgd2VhayBtYXAgb2YgZHJhd2FibGVzIHdlJ3ZlIGdvdHRlbiBmcm9tIG90aGVyIHBhY2thZ2VzLCBzbyB3ZSBkb24ndCBsb2FkIHRoZW0KKyAgICAvLyBtb3JlIHRoYW4gb25jZS4KKyAgICBwcml2YXRlIGZpbmFsIFdlYWtIYXNoTWFwPFN0cmluZywgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gbU91dHNpZGVEcmF3YWJsZXNDYWNoZSA9CisgICAgICAgICAgICBuZXcgV2Vha0hhc2hNYXA8U3RyaW5nLCBEcmF3YWJsZS5Db25zdGFudFN0YXRlPigpOworCisgICAgLyoqCisgICAgICogQ2FsbGJhY2tzIGZvciBjaGFuZ2VzIHRvIHRoZSBxdWVyeSB0ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25RdWVyeUNoYW5nZUxpc3RlbmVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc3VibWl0cyB0aGUgcXVlcnkuIFRoaXMgY291bGQgYmUgZHVlIHRvIGEga2V5IHByZXNzIG9uIHRoZQorICAgICAgICAgKiBrZXlib2FyZCBvciBkdWUgdG8gcHJlc3NpbmcgYSBzdWJtaXQgYnV0dG9uLgorICAgICAgICAgKiBUaGUgbGlzdGVuZXIgY2FuIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBiZWhhdmlvciBieSByZXR1cm5pbmcgdHJ1ZQorICAgICAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IGl0IGhhcyBoYW5kbGVkIHRoZSBzdWJtaXQgcmVxdWVzdC4gT3RoZXJ3aXNlIHJldHVybiBmYWxzZSB0bworICAgICAgICAgKiBsZXQgdGhlIFNlYXJjaFZpZXcgaGFuZGxlIHRoZSBzdWJtaXNzaW9uIGJ5IGxhdW5jaGluZyBhbnkgYXNzb2NpYXRlZCBpbnRlbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBxdWVyeSB0aGUgcXVlcnkgdGV4dCB0aGF0IGlzIHRvIGJlIHN1Ym1pdHRlZAorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHF1ZXJ5IGhhcyBiZWVuIGhhbmRsZWQgYnkgdGhlIGxpc3RlbmVyLCBmYWxzZSB0byBsZXQgdGhlCisgICAgICAgICAqIFNlYXJjaFZpZXcgcGVyZm9ybSB0aGUgZGVmYXVsdCBhY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG9uU3VibWl0UXVlcnkoU3RyaW5nIHF1ZXJ5KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHF1ZXJ5IHRleHQgaXMgY2hhbmdlZCBieSB0aGUgdXNlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5ld1RleHQgdGhlIG5ldyBjb250ZW50IG9mIHRoZSBxdWVyeSB0ZXh0IGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSBTZWFyY2hWaWV3IHNob3VsZCBwZXJmb3JtIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiBzaG93aW5nIGFueQorICAgICAgICAgKiBzdWdnZXN0aW9ucyBpZiBhdmFpbGFibGUsIHRydWUgaWYgdGhlIGFjdGlvbiB3YXMgaGFuZGxlZCBieSB0aGUgbGlzdGVuZXIuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG9uUXVlcnlUZXh0Q2hhbmdlZChTdHJpbmcgbmV3VGV4dCk7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPbkNsb3NlTGlzdGVuZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdXNlciBpcyBhdHRlbXB0aW5nIHRvIGNsb3NlIHRoZSBTZWFyY2hWaWV3LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxpc3RlbmVyIHdhbnRzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGNsZWFyaW5nIHRoZQorICAgICAgICAgKiB0ZXh0IGZpZWxkIGFuZCBkaXNtaXNzaW5nIGl0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG9uQ2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIHNlbGVjdGlvbiBldmVudHMgb24gc3VnZ2VzdGlvbnMuIFRoZXNlIGNhbGxiYWNrcworICAgICAqIGFyZSBvbmx5IHJlbGV2YW50IHdoZW4gYSBTZWFyY2hhYmxlSW5mbyBoYXMgYmVlbiBzcGVjaWZpZWQgYnkge0BsaW5rICNzZXRTZWFyY2hhYmxlSW5mb30uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblN1Z2dlc3Rpb25TZWxlY3Rpb25MaXN0ZW5lciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgc3VnZ2VzdGlvbiB3YXMgc2VsZWN0ZWQgYnkgbmF2aWdhdGluZyB0byBpdC4KKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBpbiB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsaXN0ZW5lciBoYW5kbGVzIHRoZSBldmVudCBhbmQgd2FudHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKKyAgICAgICAgICogYmVoYXZpb3Igb2YgcG9zc2libHkgcmV3cml0aW5nIHRoZSBxdWVyeSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgaXRlbSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBvblN1Z2dlc3Rpb25TZWxlY3RlZChpbnQgcG9zaXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHN1Z2dlc3Rpb24gd2FzIGNsaWNrZWQuCisgICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGNsaWNrZWQgaXRlbSBpbiB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsaXN0ZW5lciBoYW5kbGVzIHRoZSBldmVudCBhbmQgd2FudHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKKyAgICAgICAgICogYmVoYXZpb3Igb2YgbGF1bmNoaW5nIGFueSBpbnRlbnQgb3Igc3VibWl0dGluZyBhIHNlYXJjaCBxdWVyeSBzcGVjaWZpZWQgb24gdGhhdCBpdGVtLgorICAgICAgICAgKiBSZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBvblN1Z2dlc3Rpb25DbGlja2VkKGludCBwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIFNlYXJjaFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFNlYXJjaFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKSBjb250ZXh0CisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuc2VhcmNoX3ZpZXcsIHRoaXMsIHRydWUpOworCisgICAgICAgIG1TZWFyY2hCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5zZWFyY2hfYnV0dG9uKTsKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcgPSAoQXV0b0NvbXBsZXRlVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNlYXJjaF9zcmNfdGV4dCk7CisgICAgICAgIG1TZWFyY2hFZGl0RnJhbWUgPSBmaW5kVmlld0J5SWQoUi5pZC5zZWFyY2hfZWRpdF9mcmFtZSk7CisgICAgICAgIG1TdWJtaXRCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5zZWFyY2hfZ29fYnRuKTsKKyAgICAgICAgbUNsb3NlQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc2VhcmNoX2Nsb3NlX2J0bik7CisKKyAgICAgICAgbVNlYXJjaEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1TdWJtaXRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBtUXVlcnlUZXh0Vmlldy5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG1UZXh0V2F0Y2hlcik7CisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldE9uRWRpdG9yQWN0aW9uTGlzdGVuZXIobU9uRWRpdG9yQWN0aW9uTGlzdGVuZXIpOworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1Pbkl0ZW1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcik7CisgICAgICAgIC8vIEluZm9ybSBhbnkgbGlzdGVuZXIgb2YgZm9jdXMgY2hhbmdlcyAKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0T25Gb2N1c0NoYW5nZUxpc3RlbmVyKG5ldyBPbkZvY3VzQ2hhbmdlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRm9jdXNDaGFuZ2UoVmlldyB2LCBib29sZWFuIGhhc0ZvY3VzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1PblF1ZXJ5VGV4dEZvY3VzQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtT25RdWVyeVRleHRGb2N1c0NoYW5nZUxpc3RlbmVyLm9uRm9jdXNDaGFuZ2UoU2VhcmNoVmlldy50aGlzLCBoYXNGb2N1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLlNlYXJjaFZpZXcsIDAsIDApOworICAgICAgICBzZXRJY29uaWZpZWRCeURlZmF1bHQoYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLlNlYXJjaFZpZXdfaWNvbmlmaWVkQnlEZWZhdWx0LCB0cnVlKSk7CisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIHVwZGF0ZVZpZXdzVmlzaWJpbGl0eShtSWNvbmlmaWVkQnlEZWZhdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBTZWFyY2hhYmxlSW5mbyBmb3IgdGhpcyBTZWFyY2hWaWV3LiBQcm9wZXJ0aWVzIGluIHRoZSBTZWFyY2hhYmxlSW5mbyBhcmUgdXNlZAorICAgICAqIHRvIGRpc3BsYXkgbGFiZWxzLCBoaW50cywgc3VnZ2VzdGlvbnMsIGNyZWF0ZSBpbnRlbnRzIGZvciBsYXVuY2hpbmcgc2VhcmNoIHJlc3VsdHMgc2NyZWVucworICAgICAqIGFuZCBjb250cm9sbGluZyBvdGhlciBhZmZvcmRhbmNlcyBzdWNoIGFzIGEgdm9pY2UgYnV0dG9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlYXJjaGFibGUgYSBTZWFyY2hhYmxlSW5mbyBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIFNlYXJjaE1hbmFnZXIsIGZvciBhIHNwZWNpZmljCisgICAgICogYWN0aXZpdHkgb3IgYSBnbG9iYWwgc2VhcmNoIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlYXJjaGFibGVJbmZvKFNlYXJjaGFibGVJbmZvIHNlYXJjaGFibGUpIHsKKyAgICAgICAgbVNlYXJjaGFibGUgPSBzZWFyY2hhYmxlOworICAgICAgICBpZiAobVNlYXJjaGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdXBkYXRlU2VhcmNoQXV0b0NvbXBsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlVmlld3NWaXNpYmlsaXR5KG1JY29uaWZpZWRCeURlZmF1bHQpOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RGb2N1cyhpbnQgZGlyZWN0aW9uLCBSZWN0IHByZXZpb3VzbHlGb2N1c2VkUmVjdCkgeworICAgICAgICBpZiAobUNsZWFyaW5nRm9jdXMpIHJldHVybiBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtUXVlcnlUZXh0Vmlldy5yZXF1ZXN0Rm9jdXMoZGlyZWN0aW9uLCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpOworICAgICAgICBpZiAocmVzdWx0ICYmICFpc0ljb25pZmllZCgpKSB7CisgICAgICAgICAgICBzZXRJbWVWaXNpYmlsaXR5KHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXJGb2N1cygpIHsKKyAgICAgICAgbUNsZWFyaW5nRm9jdXMgPSB0cnVlOworICAgICAgICBzdXBlci5jbGVhckZvY3VzKCk7CisgICAgICAgIG1RdWVyeVRleHRWaWV3LmNsZWFyRm9jdXMoKTsKKyAgICAgICAgc2V0SW1lVmlzaWJpbGl0eShmYWxzZSk7CisgICAgICAgIG1DbGVhcmluZ0ZvY3VzID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGxpc3RlbmVyIGZvciB1c2VyIGFjdGlvbnMgd2l0aGluIHRoZSBTZWFyY2hWaWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciBvYmplY3QgdGhhdCByZWNlaXZlcyBjYWxsYmFja3Mgd2hlbiB0aGUgdXNlciBwZXJmb3JtcworICAgICAqIGFjdGlvbnMgaW4gdGhlIFNlYXJjaFZpZXcgc3VjaCBhcyBjbGlja2luZyBvbiBidXR0b25zIG9yIHR5cGluZyBhIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uUXVlcnlDaGFuZ2VMaXN0ZW5lcihPblF1ZXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbU9uUXVlcnlDaGFuZ2VMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byBpbmZvcm0gd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIFNlYXJjaFZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGNhbGwgd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIFNlYXJjaFZpZXcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25DbG9zZUxpc3RlbmVyKE9uQ2xvc2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25DbG9zZUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGxpc3RlbmVyIHRvIGluZm9ybSB3aGVuIHRoZSBmb2N1cyBvZiB0aGUgcXVlcnkgdGV4dCBmaWVsZCBjaGFuZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBpbmZvcm0gb2YgZm9jdXMgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPblF1ZXJ5VGV4dEZvY3VzQ2hhbmdlTGlzdGVuZXIoT25Gb2N1c0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1PblF1ZXJ5VGV4dEZvY3VzQ2hhbmdlTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbGlzdGVuZXIgdG8gaW5mb3JtIHdoZW4gYSBzdWdnZXN0aW9uIGlzIGZvY3VzZWQgb3IgY2xpY2tlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gaW5mb3JtIG9mIHN1Z2dlc3Rpb24gc2VsZWN0aW9uIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPblN1Z2dlc3Rpb25TZWxlY3Rpb25MaXN0ZW5lcihPblN1Z2dlc3Rpb25TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25TdWdnZXN0aW9uTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcXVlcnkgc3RyaW5nIGluIHRoZSB0ZXh0IGZpZWxkIGFuZCBvcHRpb25hbGx5IHN1Ym1pdHMgdGhlIHF1ZXJ5IGFzIHdlbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIHF1ZXJ5IHN0cmluZy4gVGhpcyByZXBsYWNlcyBhbnkgcXVlcnkgdGV4dCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlCisgICAgICogdGV4dCBmaWVsZC4KKyAgICAgKiBAcGFyYW0gc3VibWl0IHdoZXRoZXIgdG8gc3VibWl0IHRoZSBxdWVyeSByaWdodCBub3cgb3Igb25seSB1cGRhdGUgdGhlIGNvbnRlbnRzIG9mCisgICAgICogdGV4dCBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeShDaGFyU2VxdWVuY2UgcXVlcnksIGJvb2xlYW4gc3VibWl0KSB7CisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldFRleHQocXVlcnkpOworICAgICAgICAvLyBJZiB0aGUgcXVlcnkgaXMgbm90IGVtcHR5IGFuZCBzdWJtaXQgaXMgcmVxdWVzdGVkLCBzdWJtaXQgdGhlIHF1ZXJ5CisgICAgICAgIGlmIChzdWJtaXQgJiYgIVRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgeworICAgICAgICAgICAgb25TdWJtaXRRdWVyeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaGludCB0ZXh0IHRvIGRpc3BsYXkgaW4gdGhlIHF1ZXJ5IHRleHQgZmllbGQuIFRoaXMgb3ZlcnJpZGVzIGFueSBoaW50IHNwZWNpZmllZAorICAgICAqIGluIHRoZSBTZWFyY2hhYmxlSW5mby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoaW50IHRoZSBoaW50IHRleHQgdG8gZGlzcGxheQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5SGludChDaGFyU2VxdWVuY2UgaGludCkgeworICAgICAgICBtUXVlcnlIaW50ID0gaGludDsKKyAgICAgICAgdXBkYXRlUXVlcnlIaW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVmYXVsdCBvciByZXN0aW5nIHN0YXRlIG9mIHRoZSBzZWFyY2ggZmllbGQuIElmIHRydWUsIGEgc2luZ2xlIHNlYXJjaCBpY29uIGlzCisgICAgICogc2hvd24gYnkgZGVmYXVsdCBhbmQgZXhwYW5kcyB0byBzaG93IHRoZSB0ZXh0IGZpZWxkIGFuZCBvdGhlciBidXR0b25zIHdoZW4gcHJlc3NlZC4gQWxzbywKKyAgICAgKiBpZiB0aGUgZGVmYXVsdCBzdGF0ZSBpcyBpY29uaWZpZWQsIHRoZW4gaXQgY29sbGFwc2VzIHRvIHRoYXQgc3RhdGUgd2hlbiB0aGUgY2xvc2UgYnV0dG9uCisgICAgICogaXMgcHJlc3NlZC4gQ2hhbmdlcyB0byB0aGlzIHByb3BlcnR5IHdpbGwgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaWNvbmlmaWVkIHdoZXRoZXIgdGhlIHNlYXJjaCBmaWVsZCBzaG91bGQgYmUgaWNvbmlmaWVkIGJ5IGRlZmF1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uaWZpZWRCeURlZmF1bHQoYm9vbGVhbiBpY29uaWZpZWQpIHsKKyAgICAgICAgbUljb25pZmllZEJ5RGVmYXVsdCA9IGljb25pZmllZDsKKyAgICAgICAgdXBkYXRlVmlld3NWaXNpYmlsaXR5KGljb25pZmllZCk7CisgICAgICAgIHNldEltZVZpc2liaWxpdHkoIWljb25pZmllZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBpY29uaWZpZWQgc3RhdGUgb2YgdGhlIHNlYXJjaCBmaWVsZC4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJY29uZmllZEJ5RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uaWZpZWRCeURlZmF1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWNvbmlmaWVzIG9yIGV4cGFuZHMgdGhlIFNlYXJjaFZpZXcuIEFueSBxdWVyeSB0ZXh0IGlzIGNsZWFyZWQgd2hlbiBpY29uaWZpZWQuIFRoaXMgaXMKKyAgICAgKiBhIHRlbXBvcmFyeSBzdGF0ZSBhbmQgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaWNvbmlmaWVkIHN0YXRlIHNldCBieQorICAgICAqIHtAbGluayAjc2V0SWNvbmlmaWVkQnlEZWZhdWx0KGJvb2xlYW4pfS4gSWYgdGhlIGRlZmF1bHQgc3RhdGUgaXMgaWNvbmlmaWVkLCB0aGVuCisgICAgICogYSBmYWxzZSBoZXJlIHdpbGwgb25seSBiZSB2YWxpZCB1bnRpbCB0aGUgdXNlciBjbG9zZXMgdGhlIGZpZWxkLiBBbmQgaWYgdGhlIGRlZmF1bHQKKyAgICAgKiBzdGF0ZSBpcyBleHBhbmRlZCwgdGhlbiBhIHRydWUgaGVyZSB3aWxsIG9ubHkgY2xlYXIgdGhlIHRleHQgZmllbGQgYW5kIG5vdCBjbG9zZSBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpY29uaWZ5IGEgdHJ1ZSB2YWx1ZSB3aWxsIGNvbGxhcHNlIHRoZSBTZWFyY2hWaWV3IHRvIGFuIGljb24sIHdoaWxlIGEgZmFsc2Ugd2lsbAorICAgICAqIGV4cGFuZCBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uaWZpZWQoYm9vbGVhbiBpY29uaWZ5KSB7CisgICAgICAgIGlmIChpY29uaWZ5KSB7CisgICAgICAgICAgICBvbkNsb3NlQ2xpY2tlZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb25TZWFyY2hDbGlja2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGljb25pZmllZCBzdGF0ZSBvZiB0aGUgU2VhcmNoVmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU2VhcmNoVmlldyBpcyBjdXJyZW50bHkgaWNvbmlmaWVkLCBmYWxzZSBpZiB0aGUgc2VhcmNoIGZpZWxkIGlzCisgICAgICogZnVsbHkgdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ljb25pZmllZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uaWZpZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlcyBzaG93aW5nIGEgc3VibWl0IGJ1dHRvbiB3aGVuIHRoZSBxdWVyeSBpcyBub24tZW1wdHkuIEluIGNhc2VzIHdoZXJlIHRoZSBTZWFyY2hWaWV3CisgICAgICogaXMgYmVpbmcgdXNlZCB0byBmaWx0ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGFjdGl2aXR5IGFuZCBkb2Vzbid0IGxhdW5jaCBhIHNlcGFyYXRlCisgICAgICogcmVzdWx0cyBhY3Rpdml0eSwgdGhlbiB0aGUgc3VibWl0IGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIHRvIHNob3cgYSBzdWJtaXQgYnV0dG9uIGZvciBzdWJtaXR0aW5nIHF1ZXJpZXMsIGZhbHNlIGlmIGEgc3VibWl0CisgICAgICogYnV0dG9uIGlzIG5vdCByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJtaXRCdXR0b25FbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtU3VibWl0QnV0dG9uLnNldFZpc2liaWxpdHkoZW5hYmxlZCA/IFZJU0lCTEUgOiBHT05FKTsKKyAgICAgICAgbVN1Ym1pdEJ1dHRvbkVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3VibWl0IGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gbmVjZXNzYXJ5IG9yIG5ldmVyIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgc3VibWl0IGJ1dHRvbiBpcyBlbmFibGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1Ym1pdEJ1dHRvbkVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtU3VibWl0QnV0dG9uRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgaWYgYSBxdWVyeSByZWZpbmVtZW50IGJ1dHRvbiBzaG91bGQgYmUgZGlzcGxheWVkIGFsb25nc2lkZSBlYWNoIHN1Z2dlc3Rpb24KKyAgICAgKiBvciBpZiBpdCBzaG91bGQgZGVwZW5kIG9uIHRoZSBmbGFncyBzZXQgaW4gdGhlIGluZGl2aWR1YWwgaXRlbXMgcmV0cmlldmVkIGZyb20gdGhlCisgICAgICogc3VnZ2VzdGlvbnMgcHJvdmlkZXIuIENsaWNraW5nIG9uIHRoZSBxdWVyeSByZWZpbmVtZW50IGJ1dHRvbiB3aWxsIHJlcGxhY2UgdGhlIHRleHQKKyAgICAgKiBpbiB0aGUgcXVlcnkgdGV4dCBmaWVsZCB3aXRoIHRoZSB0ZXh0IGZyb20gdGhlIHN1Z2dlc3Rpb24uIFRoaXMgZmxhZyBvbmx5IHRha2VzIGVmZmVjdAorICAgICAqIGlmIGEgU2VhcmNoYWJsZUluZm8gaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGgge0BsaW5rICNzZXRTZWFyY2hhYmxlSW5mbyhTZWFyY2hhYmxlSW5mbyl9CisgICAgICogYW5kIG5vdCB3aGVuIHVzaW5nIGEgY3VzdG9tIGFkYXB0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlIHRydWUgaWYgYWxsIGl0ZW1zIHNob3VsZCBoYXZlIGEgcXVlcnkgcmVmaW5lbWVudCBidXR0b24sIGZhbHNlIGlmIG9ubHkKKyAgICAgKiB0aG9zZSBpdGVtcyB0aGF0IGhhdmUgYSBxdWVyeSByZWZpbmVtZW50IGZsYWcgc2V0IHNob3VsZCBoYXZlIHRoZSBidXR0b24uCisgICAgICoKKyAgICAgKiBAc2VlIFNlYXJjaE1hbmFnZXIjU1VHR0VTVF9DT0xVTU5fRkxBR1MKKyAgICAgKiBAc2VlIFNlYXJjaE1hbmFnZXIjRkxBR19RVUVSWV9SRUZJTkVNRU5UCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlSZWZpbmVtZW50RW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBtUXVlcnlSZWZpbmVtZW50ID0gZW5hYmxlOworICAgICAgICBpZiAobVN1Z2dlc3Rpb25zQWRhcHRlciBpbnN0YW5jZW9mIFN1Z2dlc3Rpb25zQWRhcHRlcikgeworICAgICAgICAgICAgKChTdWdnZXN0aW9uc0FkYXB0ZXIpIG1TdWdnZXN0aW9uc0FkYXB0ZXIpLnNldFF1ZXJ5UmVmaW5lbWVudCgKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlID8gU3VnZ2VzdGlvbnNBZGFwdGVyLlJFRklORV9BTEwgOiBTdWdnZXN0aW9uc0FkYXB0ZXIuUkVGSU5FX0JZX0VOVFJZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBxdWVyeSByZWZpbmVtZW50IGlzIGVuYWJsZWQgZm9yIGFsbCBpdGVtcyBvciBvbmx5IHNwZWNpZmljIG9uZXMuCisgICAgICogQHJldHVybiB0cnVlIGlmIGVuYWJsZWQgZm9yIGFsbCBpdGVtcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUXVlcnlSZWZpbmVtZW50RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1RdWVyeVJlZmluZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogWW91IGNhbiBzZXQgYSBjdXN0b20gYWRhcHRlciBpZiB5b3Ugd2lzaC4gT3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGFkYXB0ZXIgaXMgdXNlZCB0bworICAgICAqIGRpc3BsYXkgdGhlIHN1Z2dlc3Rpb25zIGZyb20gdGhlIHN1Z2dlc3Rpb25zIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VhcmNoYWJsZUluZm8uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTZWFyY2hhYmxlSW5mbyhTZWFyY2hhYmxlSW5mbykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWdnZXN0aW9uc0FkYXB0ZXIoQ3Vyc29yQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIG1TdWdnZXN0aW9uc0FkYXB0ZXIgPSBhZGFwdGVyOworCisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldEFkYXB0ZXIobVN1Z2dlc3Rpb25zQWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWRhcHRlciB1c2VkIGZvciBzdWdnZXN0aW9ucywgaWYgYW55LgorICAgICAqIEByZXR1cm4gdGhlIHN1Z2dlc3Rpb25zIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlciBnZXRTdWdnZXN0aW9uc0FkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBtU3VnZ2VzdGlvbnNBZGFwdGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWaWV3c1Zpc2liaWxpdHkoZmluYWwgYm9vbGVhbiBjb2xsYXBzZWQpIHsKKyAgICAgICAgbUljb25pZmllZCA9IGNvbGxhcHNlZDsKKyAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiB2aWV3cyB0aGF0IGFyZSB2aXNpYmxlIHdoZW4gY29sbGFwc2VkCisgICAgICAgIGZpbmFsIGludCB2aXNDb2xsYXBzZWQgPSBjb2xsYXBzZWQgPyBWSVNJQkxFIDogR09ORTsKKyAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiB2aWV3cyB0aGF0IGFyZSB2aXNpYmxlIHdoZW4gZXhwYW5kZWQKKyAgICAgICAgZmluYWwgaW50IHZpc0V4cGFuZGVkID0gY29sbGFwc2VkID8gR09ORSA6IFZJU0lCTEU7CisgICAgICAgIC8vIElzIHRoZXJlIHRleHQgaW4gdGhlIHF1ZXJ5CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzVGV4dCA9ICFUZXh0VXRpbHMuaXNFbXB0eShtUXVlcnlUZXh0Vmlldy5nZXRUZXh0KCkpOworCisgICAgICAgIG1TZWFyY2hCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNDb2xsYXBzZWQpOworICAgICAgICBtU3VibWl0QnV0dG9uLnNldFZpc2liaWxpdHkobVN1Ym1pdEJ1dHRvbkVuYWJsZWQgJiYgaGFzVGV4dCA/IHZpc0V4cGFuZGVkIDogR09ORSk7CisgICAgICAgIG1TZWFyY2hFZGl0RnJhbWUuc2V0VmlzaWJpbGl0eSh2aXNFeHBhbmRlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEltZVZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKQorICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKKworICAgICAgICAvLyBXZSBtYWRlIHN1cmUgdGhlIElNRSB3YXMgZGlzcGxheWVkLCBzbyBhbHNvIG1ha2Ugc3VyZSBpdCBpcyBjbG9zZWQKKyAgICAgICAgLy8gd2hlbiB3ZSBnbyBhd2F5LgorICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgaW1tLnNob3dTb2Z0SW5wdXRVbmNoZWNrZWQoMCwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhnZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgU3VnZ2VzdGlvbnNBZGFwdGVyCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovdm9pZCBvblF1ZXJ5UmVmaW5lKENoYXJTZXF1ZW5jZSBxdWVyeVRleHQpIHsKKyAgICAgICAgc2V0UXVlcnkocXVlcnlUZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE9uQ2xpY2tMaXN0ZW5lciBtT25DbGlja0xpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgaWYgKHYgPT0gbVNlYXJjaEJ1dHRvbikgeworICAgICAgICAgICAgICAgIG9uU2VhcmNoQ2xpY2tlZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09IG1DbG9zZUJ1dHRvbikgeworICAgICAgICAgICAgICAgIG9uQ2xvc2VDbGlja2VkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPT0gbVN1Ym1pdEJ1dHRvbikgeworICAgICAgICAgICAgICAgIG9uU3VibWl0UXVlcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIHRoZSBrZXkgZG93biBldmVudCBmb3IgZGVhbGluZyB3aXRoIGFjdGlvbiBrZXlzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleUNvZGUgVGhpcyBpcyB0aGUga2V5Y29kZSBvZiB0aGUgdHlwZWQga2V5LCBhbmQgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiAgICAgICAgZm91bmQgaW4gdGhlIEtleUV2ZW50IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGNvbXBsZXRlIGV2ZW50IHJlY29yZCBmb3IgdGhlIHR5cGVkIGtleQorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCBoZXJlLCBvciBmYWxzZSBpZiBub3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAobVNlYXJjaGFibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgaXQncyBhbiBhY3Rpb24gc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2hhYmxlIGFjdGl2aXR5LCBsYXVuY2ggdGhlCisgICAgICAgIC8vIGVudGVyZWQgcXVlcnkgd2l0aCB0aGUgYWN0aW9uIGtleQorICAgICAgICBTZWFyY2hhYmxlSW5mby5BY3Rpb25LZXlJbmZvIGFjdGlvbktleSA9IG1TZWFyY2hhYmxlLmZpbmRBY3Rpb25LZXkoa2V5Q29kZSk7CisgICAgICAgIGlmICgoYWN0aW9uS2V5ICE9IG51bGwpICYmIChhY3Rpb25LZXkuZ2V0UXVlcnlBY3Rpb25Nc2coKSAhPSBudWxsKSkgeworICAgICAgICAgICAgbGF1bmNoUXVlcnlTZWFyY2goa2V5Q29kZSwgYWN0aW9uS2V5LmdldFF1ZXJ5QWN0aW9uTXNnKCksIG1RdWVyeVRleHRWaWV3LmdldFRleHQoKQorICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVRdWVyeUhpbnQoKSB7CisgICAgICAgIGlmIChtUXVlcnlIaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldEhpbnQobVF1ZXJ5SGludCk7CisgICAgICAgIH0gZWxzZSBpZiAobVNlYXJjaGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGhpbnQgPSBudWxsOworICAgICAgICAgICAgaW50IGhpbnRJZCA9IG1TZWFyY2hhYmxlLmdldEhpbnRJZCgpOworICAgICAgICAgICAgaWYgKGhpbnRJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgaGludCA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoaGludElkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRIaW50KGhpbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgYXV0by1jb21wbGV0ZSB0ZXh0IHZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlYXJjaEF1dG9Db21wbGV0ZSgpIHsKKyAgICAgICAgLy8gY2xvc2UgYW55IGV4aXN0aW5nIHN1Z2dlc3Rpb25zIGFkYXB0ZXIKKyAgICAgICAgLy9jbG9zZVN1Z2dlc3Rpb25zQWRhcHRlcigpOworCisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldERyb3BEb3duQW5pbWF0aW9uU3R5bGUoMCk7IC8vIG5vIGFuaW1hdGlvbgorCisgICAgICAgIC8vIGF0dGFjaCB0aGUgc3VnZ2VzdGlvbnMgYWRhcHRlciwgaWYgc3VnZ2VzdGlvbnMgYXJlIGF2YWlsYWJsZQorICAgICAgICAvLyBUaGUgZXhpc3RlbmNlIG9mIGEgc3VnZ2VzdGlvbnMgYXV0aG9yaXR5IGlzIHRoZSBwcm94eSBmb3IgInN1Z2dlc3Rpb25zIGF2YWlsYWJsZSBoZXJlIgorICAgICAgICBpZiAobVNlYXJjaGFibGUuZ2V0U3VnZ2VzdEF1dGhvcml0eSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWdnZXN0aW9uc0FkYXB0ZXIgPSBuZXcgU3VnZ2VzdGlvbnNBZGFwdGVyKGdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcywgbVNlYXJjaGFibGUsIG1PdXRzaWRlRHJhd2FibGVzQ2FjaGUpOworICAgICAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0QWRhcHRlcihtU3VnZ2VzdGlvbnNBZGFwdGVyKTsKKyAgICAgICAgICAgICgoU3VnZ2VzdGlvbnNBZGFwdGVyKSBtU3VnZ2VzdGlvbnNBZGFwdGVyKS5zZXRRdWVyeVJlZmluZW1lbnQoCisgICAgICAgICAgICAgICAgICAgIG1RdWVyeVJlZmluZW1lbnQgPyBTdWdnZXN0aW9uc0FkYXB0ZXIuUkVGSU5FX0FMTAorICAgICAgICAgICAgICAgICAgICA6IFN1Z2dlc3Rpb25zQWRhcHRlci5SRUZJTkVfQllfRU5UUlkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBPbkVkaXRvckFjdGlvbkxpc3RlbmVyIG1PbkVkaXRvckFjdGlvbkxpc3RlbmVyID0gbmV3IE9uRWRpdG9yQWN0aW9uTGlzdGVuZXIoKSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBpbnB1dCBtZXRob2QgZGVmYXVsdCBhY3Rpb24ga2V5IGlzIHByZXNzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVkaXRvckFjdGlvbihUZXh0VmlldyB2LCBpbnQgYWN0aW9uSWQsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBvblN1Ym1pdFF1ZXJ5KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgbmV3VGV4dCkgeworICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1RdWVyeVRleHRWaWV3LmdldFRleHQoKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUZXh0ID0gIVRleHRVdGlscy5pc0VtcHR5KHRleHQpOworICAgICAgICBpZiAoaXNTdWJtaXRCdXR0b25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1TdWJtaXRCdXR0b24uc2V0VmlzaWJpbGl0eShoYXNUZXh0ID8gVklTSUJMRSA6IEdPTkUpOworICAgICAgICB9CisgICAgICAgIGlmIChtT25RdWVyeUNoYW5nZUxpc3RlbmVyICE9IG51bGwpCisgICAgICAgICAgICBtT25RdWVyeUNoYW5nZUxpc3RlbmVyLm9uUXVlcnlUZXh0Q2hhbmdlZChuZXdUZXh0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblN1Ym1pdFF1ZXJ5KCkgeworICAgICAgICBDaGFyU2VxdWVuY2UgcXVlcnkgPSBtUXVlcnlUZXh0Vmlldy5nZXRUZXh0KCk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7CisgICAgICAgICAgICBpZiAobU9uUXVlcnlDaGFuZ2VMaXN0ZW5lciA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8ICFtT25RdWVyeUNoYW5nZUxpc3RlbmVyLm9uU3VibWl0UXVlcnkocXVlcnkudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNlYXJjaGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsYXVuY2hRdWVyeVNlYXJjaChLZXlFdmVudC5LRVlDT0RFX1VOS05PV04sIG51bGwsIHF1ZXJ5LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRJbWVWaXNpYmlsaXR5KGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25DbG9zZUNsaWNrZWQoKSB7CisgICAgICAgIGlmIChtT25DbG9zZUxpc3RlbmVyID09IG51bGwgfHwgIW1PbkNsb3NlTGlzdGVuZXIub25DbG9zZSgpKSB7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1RdWVyeVRleHRWaWV3LmdldFRleHQoKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh0ZXh0KSkgeworICAgICAgICAgICAgICAgIC8vIHF1ZXJ5IGZpZWxkIGFscmVhZHkgZW1wdHksIGhpZGUgdGhlIGtleWJvYXJkIGFuZCByZW1vdmUgZm9jdXMKKyAgICAgICAgICAgICAgICBtUXVlcnlUZXh0Vmlldy5jbGVhckZvY3VzKCk7CisgICAgICAgICAgICAgICAgc2V0SW1lVmlzaWJpbGl0eShmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldFRleHQoIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlVmlld3NWaXNpYmlsaXR5KG1JY29uaWZpZWRCeURlZmF1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uU2VhcmNoQ2xpY2tlZCgpIHsKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIHVwZGF0ZVZpZXdzVmlzaWJpbGl0eShmYWxzZSk7CisgICAgICAgIHNldEltZVZpc2liaWxpdHkodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBPbkl0ZW1DbGlja0xpc3RlbmVyIG1Pbkl0ZW1DbGlja0xpc3RlbmVyID0gbmV3IE9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEltcGxlbWVudHMgT25JdGVtQ2xpY2tMaXN0ZW5lcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgaWYgKERCRykKKyAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAib25JdGVtQ2xpY2soKSBwb3NpdGlvbiAiICsgcG9zaXRpb24pOworICAgICAgICAgICAgaWYgKG1PblN1Z2dlc3Rpb25MaXN0ZW5lciA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8ICFtT25TdWdnZXN0aW9uTGlzdGVuZXIub25TdWdnZXN0aW9uQ2xpY2tlZChwb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICBsYXVuY2hTdWdnZXN0aW9uKHBvc2l0aW9uLCBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04sIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IG5ldyBPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbXBsZW1lbnRzIE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGlmIChEQkcpCisgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm9uSXRlbVNlbGVjdGVkKCkgcG9zaXRpb24gIiArIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIC8vIEEgc3VnZ2VzdGlvbiBoYXMgYmVlbiBzZWxlY3RlZCwgcmV3cml0ZSB0aGUgcXVlcnkgaWYgcG9zc2libGUsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHF1ZXJ5LgorICAgICAgICAgICAgaWYgKG1PblN1Z2dlc3Rpb25MaXN0ZW5lciA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8ICFtT25TdWdnZXN0aW9uTGlzdGVuZXIub25TdWdnZXN0aW9uU2VsZWN0ZWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgcmV3cml0ZVF1ZXJ5RnJvbVN1Z2dlc3Rpb24ocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEltcGxlbWVudHMgT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7CisgICAgICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJvbk5vdGhpbmdTZWxlY3RlZCgpIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUXVlcnkgcmV3cml0aW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXdyaXRlUXVlcnlGcm9tU3VnZ2VzdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIG9sZFF1ZXJ5ID0gbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpOworICAgICAgICBDdXJzb3IgYyA9IG1TdWdnZXN0aW9uc0FkYXB0ZXIuZ2V0Q3Vyc29yKCk7CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYy5tb3ZlVG9Qb3NpdGlvbihwb3NpdGlvbikpIHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgbmV3IHF1ZXJ5IGZyb20gdGhlIHN1Z2dlc3Rpb24uCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbmV3UXVlcnkgPSBtU3VnZ2VzdGlvbnNBZGFwdGVyLmNvbnZlcnRUb1N0cmluZyhjKTsKKyAgICAgICAgICAgIGlmIChuZXdRdWVyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHN1Z2dlc3Rpb24gcmV3cml0ZXMgdGhlIHF1ZXJ5LgorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGV4dCBmaWVsZCwgd2l0aG91dCBnZXR0aW5nIG5ldyBzdWdnZXN0aW9ucy4KKyAgICAgICAgICAgICAgICBzZXRRdWVyeShuZXdRdWVyeSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBzdWdnZXN0aW9uIGRvZXMgbm90IHJld3JpdGUgdGhlIHF1ZXJ5LCByZXN0b3JlIHRoZSB1c2VyJ3MgcXVlcnkuCisgICAgICAgICAgICAgICAgc2V0UXVlcnkob2xkUXVlcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgZ290IGEgYmFkIHBvc2l0aW9uLCByZXN0b3JlIHRoZSB1c2VyJ3MgcXVlcnkuCisgICAgICAgICAgICBzZXRRdWVyeShvbGRRdWVyeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyBhbiBpbnRlbnQgYmFzZWQgb24gYSBzdWdnZXN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpbmRleCBvZiB0aGUgc3VnZ2VzdGlvbiB0byBjcmVhdGUgdGhlIGludGVudCBmcm9tLgorICAgICAqIEBwYXJhbSBhY3Rpb25LZXkgVGhlIGtleSBjb2RlIG9mIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIHtAbGluayBLZXlFdmVudCNLRVlDT0RFX1VOS05PV059IGlmIG5vbmUuCisgICAgICogQHBhcmFtIGFjdGlvbk1zZyBUaGUgbWVzc2FnZSBmb3IgdGhlIGFjdGlvbiBrZXkgdGhhdCB3YXMgcHJlc3NlZCwKKyAgICAgKiAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzdWNjZXNzZnVsIGxhdW5jaCwgZmFsc2UgaWYgY291bGQgbm90IChlLmcuIGJhZCBwb3NpdGlvbikuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGxhdW5jaFN1Z2dlc3Rpb24oaW50IHBvc2l0aW9uLCBpbnQgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uTXNnKSB7CisgICAgICAgIEN1cnNvciBjID0gbVN1Z2dlc3Rpb25zQWRhcHRlci5nZXRDdXJzb3IoKTsKKyAgICAgICAgaWYgKChjICE9IG51bGwpICYmIGMubW92ZVRvUG9zaXRpb24ocG9zaXRpb24pKSB7CisKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBjcmVhdGVJbnRlbnRGcm9tU3VnZ2VzdGlvbihjLCBhY3Rpb25LZXksIGFjdGlvbk1zZyk7CisKKyAgICAgICAgICAgIC8vIGxhdW5jaCB0aGUgaW50ZW50CisgICAgICAgICAgICBsYXVuY2hJbnRlbnQoaW50ZW50KTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIExhdW5jaGVzIGFuIGludGVudCwgaW5jbHVkaW5nIGFueSBzcGVjaWFsIGludGVudCBoYW5kbGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbnRlbnQgd2FzIGNyZWF0ZWQgZnJvbSBhIHN1Z2dlc3Rpb24sIGl0IHdpbGwgYWx3YXlzIGhhdmUgYW4gZXhwbGljaXQKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBoZXJlLgorICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCBsYXVuY2ggYWN0aXZpdHk6ICIgKyBpbnRlbnQsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRleHQgaW4gdGhlIHF1ZXJ5IGJveCwgd2l0aG91dCB1cGRhdGluZyB0aGUgc3VnZ2VzdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFF1ZXJ5KENoYXJTZXF1ZW5jZSBxdWVyeSkgeworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRUZXh0KHF1ZXJ5LCB0cnVlKTsKKyAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0U2VsZWN0aW9uKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSA/IDAgOiBxdWVyeS5sZW5ndGgoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFF1ZXJ5U2VhcmNoKGludCBhY3Rpb25LZXksIFN0cmluZyBhY3Rpb25Nc2csIFN0cmluZyBxdWVyeSkgeworICAgICAgICBTdHJpbmcgYWN0aW9uID0gSW50ZW50LkFDVElPTl9TRUFSQ0g7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBjcmVhdGVJbnRlbnQoYWN0aW9uLCBudWxsLCBudWxsLCBxdWVyeSwgYWN0aW9uS2V5LCBhY3Rpb25Nc2cpOworICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW50ZW50IGZyb20gdGhlIGdpdmVuIGluZm9ybWF0aW9uIGFuZCB0aGUgc2VhcmNoIGRpYWxvZyBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb24gSW50ZW50IGFjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGF0YSBJbnRlbnQgZGF0YSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGV4dHJhRGF0YSBEYXRhIGZvciB7QGxpbmsgU2VhcmNoTWFuYWdlciNFWFRSQV9EQVRBX0tFWX0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHF1ZXJ5IEludGVudCBxdWVyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGFjdGlvbktleSBUaGUga2V5IGNvZGUgb2YgdGhlIGFjdGlvbiBrZXkgdGhhdCB3YXMgcHJlc3NlZCwKKyAgICAgKiAgICAgICAgb3Ige0BsaW5rIEtleUV2ZW50I0tFWUNPREVfVU5LTk9XTn0gaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gYWN0aW9uTXNnIFRoZSBtZXNzYWdlIGZvciB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLAorICAgICAqICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBzZWFyY2ggbW9kZSwgb25lIG9mIHRoZSBhY2NlcHRhYmxlIHZhbHVlcyBmb3IKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgU2VhcmNoTWFuYWdlciNTRUFSQ0hfTU9ERX0sIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcmV0dXJuIFRoZSBpbnRlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlbnQgY3JlYXRlSW50ZW50KFN0cmluZyBhY3Rpb24sIFVyaSBkYXRhLCBTdHJpbmcgZXh0cmFEYXRhLCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBpbnQgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uTXNnKSB7CisgICAgICAgIC8vIE5vdyBidWlsZCB0aGUgSW50ZW50CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIC8vIFdlIG5lZWQgQ0xFQVJfVE9QIHRvIGF2b2lkIHJldXNpbmcgYW4gb2xkIHRhc2sgdGhhdCBoYXMgb3RoZXIgYWN0aXZpdGllcworICAgICAgICAvLyBvbiB0b3Agb2YgdGhlIG9uZSB3ZSB3YW50LiBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgaW4gaW4tYXBwIHNlYXJjaCB0aG91Z2gsCisgICAgICAgIC8vIGFzIGl0IGNhbiBiZSBkZXN0cnVjdGl2ZSB0byB0aGUgYWN0aXZpdHkgc3RhY2suCisgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5zZXREYXRhKGRhdGEpOworICAgICAgICB9CisgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlVTRVJfUVVFUlksIHF1ZXJ5KTsKKyAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlFVRVJZLCBxdWVyeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dHJhRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoU2VhcmNoTWFuYWdlci5FWFRSQV9EQVRBX0tFWSwgZXh0cmFEYXRhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aW9uS2V5ICE9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTikgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFNlYXJjaE1hbmFnZXIuQUNUSU9OX0tFWSwgYWN0aW9uS2V5KTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLkFDVElPTl9NU0csIGFjdGlvbk1zZyk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChtU2VhcmNoYWJsZS5nZXRTZWFyY2hBY3Rpdml0eSgpKTsKKyAgICAgICAgcmV0dXJuIGludGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgcGFydGljdWxhciBzdWdnZXN0aW9uIGhhcyBiZWVuIHNlbGVjdGVkLCBwZXJmb3JtIHRoZSB2YXJpb3VzIGxvb2t1cHMgcmVxdWlyZWQKKyAgICAgKiB0byB1c2UgdGhlIHN1Z2dlc3Rpb24uICBUaGlzIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBjdXJzb3IgZm9yIHN1Z2dlc3Rpb24tc3BlY2lmaWMgZGF0YSwKKyAgICAgKiBhbmQvb3IgZmFsbGluZyBiYWNrIHRvIHRoZSBYTUwgZm9yIGRlZmF1bHRzOyAgSXQgYWxzbyBjcmVhdGVzIFJFU1Qgc3R5bGUgVXJpIGRhdGEgd2hlbgorICAgICAqIHRoZSBzdWdnZXN0aW9uIGluY2x1ZGVzIGEgZGF0YSBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBzdWdnZXN0aW9ucyBjdXJzb3IsIG1vdmVkIHRvIHRoZSByb3cgb2YgdGhlIHVzZXIncyBzZWxlY3Rpb24KKyAgICAgKiBAcGFyYW0gYWN0aW9uS2V5IFRoZSBrZXkgY29kZSBvZiB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLAorICAgICAqICAgICAgICBvciB7QGxpbmsgS2V5RXZlbnQjS0VZQ09ERV9VTktOT1dOfSBpZiBub25lLgorICAgICAqIEBwYXJhbSBhY3Rpb25Nc2cgVGhlIG1lc3NhZ2UgZm9yIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisgICAgICogQHJldHVybiBBbiBpbnRlbnQgZm9yIHRoZSBzdWdnZXN0aW9uIGF0IHRoZSBjdXJzb3IncyBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVudCBjcmVhdGVJbnRlbnRGcm9tU3VnZ2VzdGlvbihDdXJzb3IgYywgaW50IGFjdGlvbktleSwgU3RyaW5nIGFjdGlvbk1zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdXNlIHNwZWNpZmljIGFjdGlvbiBpZiBzdXBwbGllZCwgb3IgZGVmYXVsdCBhY3Rpb24gaWYgc3VwcGxpZWQsIG9yIGZpeGVkIGRlZmF1bHQKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfQUNUSU9OKTsKKworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gbVNlYXJjaGFibGUuZ2V0U3VnZ2VzdEludGVudEFjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gSW50ZW50LkFDVElPTl9TRUFSQ0g7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVzZSBzcGVjaWZpYyBkYXRhIGlmIHN1cHBsaWVkLCBvciBkZWZhdWx0IGRhdGEgaWYgc3VwcGxpZWQKKyAgICAgICAgICAgIFN0cmluZyBkYXRhID0gZ2V0Q29sdW1uU3RyaW5nKGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0RBVEEpOworICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRhdGEgPSBtU2VhcmNoYWJsZS5nZXRTdWdnZXN0SW50ZW50RGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdGhlbiwgaWYgYW4gSUQgd2FzIHByb3ZpZGVkLCBhcHBlbmQgaXQuCisgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2V0Q29sdW1uU3RyaW5nKGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0RBVEFfSUQpOworICAgICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhICsgIi8iICsgVXJpLmVuY29kZShpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVXJpIGRhdGFVcmkgPSAoZGF0YSA9PSBudWxsKSA/IG51bGwgOiBVcmkucGFyc2UoZGF0YSk7CisKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldENvbHVtblN0cmluZyhjLCBTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1FVRVJZKTsKKyAgICAgICAgICAgIFN0cmluZyBleHRyYURhdGEgPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfRVhUUkFfREFUQSk7CisKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnQoYWN0aW9uLCBkYXRhVXJpLCBleHRyYURhdGEsIHF1ZXJ5LCBhY3Rpb25LZXksIGFjdGlvbk1zZyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgIGludCByb3dOdW07CisgICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgcmVhbGx5IHBhcmFub2lkIG5vdworICAgICAgICAgICAgICAgIHJvd051bSA9IGMuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTIgKSB7CisgICAgICAgICAgICAgICAgcm93TnVtID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiU2VhcmNoIFN1Z2dlc3Rpb25zIGN1cnNvciBhdCByb3cgIiArIHJvd051bSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5lZCBleGNlcHRpb24iICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgdG8gd2F0Y2ggdGhlIHRleHQgZmllbGQgZm9yIGVtcHR5L25vbi1lbXB0eQorICAgICAqLworICAgIHByaXZhdGUgVGV4dFdhdGNoZXIgbVRleHRXYXRjaGVyID0gbmV3IFRleHRXYXRjaGVyKCkgeworCisgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBhZnRlcikgeyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgIGludCBiZWZvcmUsIGludCBhZnRlcikgeworICAgICAgICAgICAgU2VhcmNoVmlldy50aGlzLm9uVGV4dENoYW5nZWQocyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YQppbmRleCA3ZDM0NTllLi5kMWMyMjcwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEKQEAgLTYyLDcgKzYyLDggQEAKICAgICBwcml2YXRlIGludCBtU3RyaW5nQ29udmVyc2lvbkNvbHVtbiA9IC0xOwogICAgIHByaXZhdGUgQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXIgbUN1cnNvclRvU3RyaW5nQ29udmVydGVyOwogICAgIHByaXZhdGUgVmlld0JpbmRlciBtVmlld0JpbmRlcjsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1PcmlnaW5hbEZyb207CisKKyAgICBTdHJpbmdbXSBtT3JpZ2luYWxGcm9tOwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQppbmRleCA4ZGRiMDZjLi5jMGNiYjE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIApAQCAtNDAsMjcgKzQxLDE1MSBAQAogICovCiBAV2lkZ2V0CiBwdWJsaWMgY2xhc3MgU3Bpbm5lciBleHRlbmRzIEFic1NwaW5uZXIgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3Bpbm5lciI7CiAgICAgCi0gICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVByb21wdDsKLSAgICBwcml2YXRlIEFsZXJ0RGlhbG9nIG1Qb3B1cDsKKyAgICAvKioKKyAgICAgKiBVc2UgYSBkaWFsb2cgd2luZG93IGZvciBzZWxlY3Rpbmcgc3Bpbm5lciBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRElBTE9HID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2UgYSBkcm9wZG93biBhbmNob3JlZCB0byB0aGUgU3Bpbm5lciBmb3Igc2VsZWN0aW5nIHNwaW5uZXIgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RST1BET1dOID0gMTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIHRoZW1lLXN1cHBsaWVkIHZhbHVlIHRvIHNlbGVjdCB0aGUgZHJvcGRvd24gbW9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9USEVNRSA9IC0xOworICAgIAorICAgIHByaXZhdGUgU3Bpbm5lclBvcHVwIG1Qb3B1cDsKKyAgICBwcml2YXRlIERyb3BEb3duQWRhcHRlciBtVGVtcEFkYXB0ZXI7CiAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgc3Bpbm5lciB3aXRoIHRoZSBnaXZlbiBjb250ZXh0J3MgdGhlbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqLwogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZSBhbmQgdGhlIHN1cHBsaWVkCisgICAgICogbW9kZSBvZiBkaXNwbGF5aW5nIGNob2ljZXMuIDxjb2RlPm1vZGU8L2NvZGU+IG1heSBiZSBvbmUgb2YKKyAgICAgKiB7QGxpbmsgI01PREVfRElBTE9HfSBvciB7QGxpbmsgI01PREVfRFJPUERPV059LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIENvbnRleHQgdGhlIHZpZXcgaXMgcnVubmluZyBpbiwgdGhyb3VnaCB3aGljaCBpdCBjYW4KKyAgICAgKiAgICAgICAgYWNjZXNzIHRoZSBjdXJyZW50IHRoZW1lLCByZXNvdXJjZXMsIGV0Yy4KKyAgICAgKiBAcGFyYW0gbW9kZSBDb25zdGFudCBkZXNjcmliaW5nIGhvdyB0aGUgdXNlciB3aWxsIHNlbGVjdCBjaG9pY2VzIGZyb20gdGhlIHNwaW5uZXIuCisgICAgICogCisgICAgICogQHNlZSAjTU9ERV9ESUFMT0cKKyAgICAgKiBAc2VlICNNT0RFX0RST1BET1dOCisgICAgICovCisgICAgcHVibGljIFNwaW5uZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgbW9kZSkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5zcGlubmVyU3R5bGUsIG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZSBhbmQgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZSBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgWE1MIHRhZyB0aGF0IGlzIGluZmxhdGluZyB0aGUgdmlldy4KKyAgICAgKi8KICAgICBwdWJsaWMgU3Bpbm5lcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuc3Bpbm5lclN0eWxlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgc3Bpbm5lciB3aXRoIHRoZSBnaXZlbiBjb250ZXh0J3MgdGhlbWUsIHRoZSBzdXBwbGllZCBhdHRyaWJ1dGUgc2V0LAorICAgICAqIGFuZCBkZWZhdWx0IHN0eWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIENvbnRleHQgdGhlIHZpZXcgaXMgcnVubmluZyBpbiwgdGhyb3VnaCB3aGljaCBpdCBjYW4KKyAgICAgKiAgICAgICAgYWNjZXNzIHRoZSBjdXJyZW50IHRoZW1lLCByZXNvdXJjZXMsIGV0Yy4KKyAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIFhNTCB0YWcgdGhhdCBpcyBpbmZsYXRpbmcgdGhlIHZpZXcuCisgICAgICogQHBhcmFtIGRlZlN0eWxlIFRoZSBkZWZhdWx0IHN0eWxlIHRvIGFwcGx5IHRvIHRoaXMgdmlldy4gSWYgMCwgbm8gc3R5bGUKKyAgICAgKiAgICAgICAgd2lsbCBiZSBhcHBsaWVkIChiZXlvbmQgd2hhdCBpcyBpbmNsdWRlZCBpbiB0aGUgdGhlbWUpLiBUaGlzIG1heQorICAgICAqICAgICAgICBlaXRoZXIgYmUgYW4gYXR0cmlidXRlIHJlc291cmNlLCB3aG9zZSB2YWx1ZSB3aWxsIGJlIHJldHJpZXZlZAorICAgICAqICAgICAgICBmcm9tIHRoZSBjdXJyZW50IHRoZW1lLCBvciBhbiBleHBsaWNpdCBzdHlsZSByZXNvdXJjZS4KKyAgICAgKi8KICAgICBwdWJsaWMgU3Bpbm5lcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBNT0RFX1RIRU1FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgc3Bpbm5lciB3aXRoIHRoZSBnaXZlbiBjb250ZXh0J3MgdGhlbWUsIHRoZSBzdXBwbGllZCBhdHRyaWJ1dGUgc2V0LAorICAgICAqIGFuZCBkZWZhdWx0IHN0eWxlLiA8Y29kZT5tb2RlPC9jb2RlPiBtYXkgYmUgb25lIG9mIHtAbGluayAjTU9ERV9ESUFMT0d9IG9yCisgICAgICoge0BsaW5rICNNT0RFX0RST1BET1dOfSBhbmQgZGV0ZXJtaW5lcyBob3cgdGhlIHVzZXIgd2lsbCBzZWxlY3QgY2hvaWNlcyBmcm9tIHRoZSBzcGlubmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIENvbnRleHQgdGhlIHZpZXcgaXMgcnVubmluZyBpbiwgdGhyb3VnaCB3aGljaCBpdCBjYW4KKyAgICAgKiAgICAgICAgYWNjZXNzIHRoZSBjdXJyZW50IHRoZW1lLCByZXNvdXJjZXMsIGV0Yy4KKyAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIFhNTCB0YWcgdGhhdCBpcyBpbmZsYXRpbmcgdGhlIHZpZXcuCisgICAgICogQHBhcmFtIGRlZlN0eWxlIFRoZSBkZWZhdWx0IHN0eWxlIHRvIGFwcGx5IHRvIHRoaXMgdmlldy4gSWYgMCwgbm8gc3R5bGUKKyAgICAgKiAgICAgICAgd2lsbCBiZSBhcHBsaWVkIChiZXlvbmQgd2hhdCBpcyBpbmNsdWRlZCBpbiB0aGUgdGhlbWUpLiBUaGlzIG1heQorICAgICAqICAgICAgICBlaXRoZXIgYmUgYW4gYXR0cmlidXRlIHJlc291cmNlLCB3aG9zZSB2YWx1ZSB3aWxsIGJlIHJldHJpZXZlZAorICAgICAqICAgICAgICBmcm9tIHRoZSBjdXJyZW50IHRoZW1lLCBvciBhbiBleHBsaWNpdCBzdHlsZSByZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gbW9kZSBDb25zdGFudCBkZXNjcmliaW5nIGhvdyB0aGUgdXNlciB3aWxsIHNlbGVjdCBjaG9pY2VzIGZyb20gdGhlIHNwaW5uZXIuCisgICAgICogCisgICAgICogQHNlZSAjTU9ERV9ESUFMT0cKKyAgICAgKiBAc2VlICNNT0RFX0RST1BET1dOCisgICAgICovCisgICAgcHVibGljIFNwaW5uZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSwgaW50IG1vZGUpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lciwgZGVmU3R5bGUsIDApOworCisgICAgICAgIGlmIChtb2RlID09IE1PREVfVEhFTUUpIHsKKyAgICAgICAgICAgIG1vZGUgPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3NwaW5uZXJNb2RlLCBNT0RFX0RJQUxPRyk7CisgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIG1Qcm9tcHQgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3Byb21wdCk7CisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIE1PREVfRElBTE9HOiB7CisgICAgICAgICAgICBtUG9wdXAgPSBuZXcgRGlhbG9nUG9wdXAoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNT0RFX0RST1BET1dOOiB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGludFJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3BvcHVwUHJvbXB0VmlldywgMCk7CisKKyAgICAgICAgICAgIERyb3Bkb3duUG9wdXAgcG9wdXAgPSBuZXcgRHJvcGRvd25Qb3B1cChjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIGhpbnRSZXNvdXJjZSk7CisKKyAgICAgICAgICAgIHBvcHVwLnNldEJhY2tncm91bmREcmF3YWJsZShhLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3BvcHVwQmFja2dyb3VuZCkpOworICAgICAgICAgICAgcG9wdXAuc2V0VmVydGljYWxPZmZzZXQoYS5nZXREaW1lbnNpb25QaXhlbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9kcm9wRG93blZlcnRpY2FsT2Zmc2V0LCAwKSk7CisgICAgICAgICAgICBwb3B1cC5zZXRIb3Jpem9udGFsT2Zmc2V0KGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCAwKSk7CisKKyAgICAgICAgICAgIG1Qb3B1cCA9IHBvcHVwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbVBvcHVwLnNldFByb21wdFRleHQoYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wcm9tcHQpKTsKIAogICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvLyBCYXNlIGNvbnN0cnVjdG9yIGNhbiBjYWxsIHNldEFkYXB0ZXIgYmVmb3JlIHdlIGluaXRpYWxpemUgbVBvcHVwLgorICAgICAgICAvLyBGaW5pc2ggc2V0dGluZyB0aGluZ3MgdXAgaWYgdGhpcyBoYXBwZW5lZC4KKyAgICAgICAgaWYgKG1UZW1wQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihtVGVtcEFkYXB0ZXIpOworICAgICAgICAgICAgbVRlbXBBZGFwdGVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKworICAgICAgICBpZiAobVBvcHVwICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG5ldyBEcm9wRG93bkFkYXB0ZXIoYWRhcHRlcikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRlbXBBZGFwdGVyID0gbmV3IERyb3BEb3duQWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtODcsNyArMjEyLDYgQEAKICAgICAgICAgCiAgICAgICAgIGlmIChtUG9wdXAgIT0gbnVsbCAmJiBtUG9wdXAuaXNTaG93aW5nKCkpIHsKICAgICAgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7Ci0gICAgICAgICAgICBtUG9wdXAgPSBudWxsOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTcsOCArMzIxLDYgQEAKICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgIH0KIAotCi0KICAgICAvKioKICAgICAgKiBIZWxwZXIgZm9yIG1ha2VBbmRBZGRWaWV3IHRvIHNldCB0aGUgcG9zaXRpb24gb2YgYSB2aWV3CiAgICAgICogYW5kIGZpbGwgb3V0IGl0cyBsYXlvdXQgcGFyYW10ZXJzLgpAQCAtMjQ5LDE1ICszNzEsMTAgQEAKICAgICAgICAgCiAgICAgICAgIGlmICghaGFuZGxlZCkgewogICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIERyb3BEb3duQWRhcHRlciBhZGFwdGVyID0gbmV3IERyb3BEb3duQWRhcHRlcihnZXRBZGFwdGVyKCkpOwogCi0gICAgICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChtUHJvbXB0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldFRpdGxlKG1Qcm9tcHQpOworICAgICAgICAgICAgaWYgKCFtUG9wdXAuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBtUG9wdXAuc2hvdygpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBvcHVwID0gYnVpbGRlci5zZXRTaW5nbGVDaG9pY2VJdGVtcyhhZGFwdGVyLCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpLCB0aGlzKS5zaG93KCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gaGFuZGxlZDsKQEAgLTI2Niw3ICszODMsNiBAQAogICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CiAgICAgICAgIHNldFNlbGVjdGlvbih3aGljaCk7CiAgICAgICAgIGRpYWxvZy5kaXNtaXNzKCk7Ci0gICAgICAgIG1Qb3B1cCA9IG51bGw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzQsNyArMzkwLDcgQEAKICAgICAgKiBAcGFyYW0gcHJvbXB0IHRoZSBwcm9tcHQgdG8gc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0KENoYXJTZXF1ZW5jZSBwcm9tcHQpIHsKLSAgICAgICAgbVByb21wdCA9IHByb21wdDsKKyAgICAgICAgbVBvcHVwLnNldFByb21wdFRleHQocHJvbXB0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTI4MiwxNCArMzk4LDE0IEBACiAgICAgICogQHBhcmFtIHByb21wdElkIHRoZSByZXNvdXJjZSBJRCBvZiB0aGUgcHJvbXB0IHRvIGRpc3BsYXkgd2hlbiB0aGUgZGlhbG9nIGlzIHNob3duCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0SWQoaW50IHByb21wdElkKSB7Ci0gICAgICAgIG1Qcm9tcHQgPSBnZXRDb250ZXh0KCkuZ2V0VGV4dChwcm9tcHRJZCk7CisgICAgICAgIHNldFByb21wdChnZXRDb250ZXh0KCkuZ2V0VGV4dChwcm9tcHRJZCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIGRpYWxvZyBpcyBzaG93bgogICAgICAqLwogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0UHJvbXB0KCkgewotICAgICAgICByZXR1cm4gbVByb21wdDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIaW50VGV4dCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM4Nyw0ICs1MDMsMTI0IEBACiAgICAgICAgICAgICByZXR1cm4gZ2V0Q291bnQoKSA9PSAwOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgc29tZSBzb3J0IG9mIHBvcHVwIHNlbGVjdGlvbiBpbnRlcmZhY2UgZm9yIHNlbGVjdGluZyBhIHNwaW5uZXIgb3B0aW9uLgorICAgICAqIEFsbG93cyBmb3IgZGlmZmVyZW50IHNwaW5uZXIgbW9kZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgU3Bpbm5lclBvcHVwIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG93IHRoZSBwb3B1cAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2hvdygpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc21pc3MgdGhlIHBvcHVwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwb3B1cCBpcyBzaG93aW5nLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgaGludCB0ZXh0IHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4gVGhpcyBzaG91bGQgcHJvdmlkZQorICAgICAgICAgKiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaG9pY2UgYmVpbmcgbWFkZS4KKyAgICAgICAgICogQHBhcmFtIGhpbnRUZXh0IEhpbnQgdGV4dCB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRUZXh0KENoYXJTZXF1ZW5jZSBoaW50VGV4dCk7CisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0SGludFRleHQoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBEaWFsb2dQb3B1cCBpbXBsZW1lbnRzIFNwaW5uZXJQb3B1cCwgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbVBvcHVwOworICAgICAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1MaXN0QWRhcHRlcjsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVByb21wdDsKKworICAgICAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvcHVwICE9IG51bGwgPyBtUG9wdXAuaXNTaG93aW5nKCkgOiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAgICAgbUxpc3RBZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFRleHQoQ2hhclNlcXVlbmNlIGhpbnRUZXh0KSB7CisgICAgICAgICAgICBtUHJvbXB0ID0gaGludFRleHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0SGludFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVByb21wdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgaWYgKG1Qcm9tcHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUobVByb21wdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9wdXAgPSBidWlsZGVyLnNldFNpbmdsZUNob2ljZUl0ZW1zKG1MaXN0QWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSwgdGhpcykuc2hvdygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgc2V0U2VsZWN0aW9uKHdoaWNoKTsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIERyb3Bkb3duUG9wdXAgZXh0ZW5kcyBMaXN0UG9wdXBXaW5kb3cgaW1wbGVtZW50cyBTcGlubmVyUG9wdXAgeworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtSGludFRleHQ7CisgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbUhpbnRWaWV3OworICAgICAgICBwcml2YXRlIGludCBtSGludFJlc291cmNlOworICAgICAgICAKKyAgICAgICAgcHVibGljIERyb3Bkb3duUG9wdXAoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsCisgICAgICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzLCBpbnQgaGludFJlc291cmNlKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgMCwgZGVmU3R5bGVSZXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtSGludFJlc291cmNlID0gaGludFJlc291cmNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBzZXRBbmNob3JWaWV3KFNwaW5uZXIudGhpcyk7CisgICAgICAgICAgICBzZXRNb2RhbCh0cnVlKTsKKyAgICAgICAgICAgIHNldFByb21wdFBvc2l0aW9uKFBPU0lUSU9OX1BST01QVF9CRUxPVyk7CisgICAgICAgICAgICBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBPbkl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgU3Bpbm5lci50aGlzLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRIaW50VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGludFRleHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFRleHQoQ2hhclNlcXVlbmNlIGhpbnRUZXh0KSB7CisgICAgICAgICAgICBtSGludFRleHQgPSBoaW50VGV4dDsKKyAgICAgICAgICAgIGlmIChtSGludFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IaW50Vmlldy5zZXRUZXh0KGhpbnRUZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAgICAgaWYgKG1IaW50VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgbUhpbnRSZXNvdXJjZSwgbnVsbCkuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dDEpOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQobUhpbnRUZXh0KTsKKyAgICAgICAgICAgICAgICBzZXRQcm9tcHRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcgPSB0ZXh0VmlldzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLnNob3coKTsKKyAgICAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9TSU5HTEUpOworICAgICAgICAgICAgc2V0U2VsZWN0aW9uKFNwaW5uZXIudGhpcy5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdGFja1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdGFja1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDk1NGUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhCkBAIC0wLDAgKzEsMTAxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJsdXJNYXNrRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVGFibGVNYXNrRmlsdGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MaW5lYXJJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKKworQFJlbW90ZVZpZXcKKy8qKgorICogQSB2aWV3IHRoYXQgZGlzcGxheXMgaXRzIGNoaWxkcmVuIGluIGEgc3RhY2sgYW5kIGFsbG93cyB1c2VycyB0byBkaXNjcmV0ZWx5IHN3aXBlCisgKiB0aHJvdWdoIHRoZSBjaGlsZHJlbi4KKyAqLworcHVibGljIGNsYXNzIFN0YWNrVmlldyBleHRlbmRzIEFkYXB0ZXJWaWV3QW5pbWF0b3IgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGFja1ZpZXciOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBhbmltYXRpb24gcGFyYW1ldGVycworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OID0gNDAwOworICAgIHByaXZhdGUgZmluYWwgaW50IE1JTklNVU1fQU5JTUFUSU9OX0RVUkFUSU9OID0gNTA7CisKKyAgICAvKioKKyAgICAgKiBQYXJhbWV0ZXJzIGVmZmVjdGluZyB0aGUgcGVyc3BlY3RpdmUgdmlzdWFscworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IFBFUlNQRUNUSVZFX1NISUZUX0ZBQ1RPUiA9IDAuMTJmOworICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IFBFUlNQRUNUSVZFX1NDQUxFX0ZBQ1RPUiA9IDAuMzVmOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50IHRoZSB0d28gcG9zc2libGUgc3RhY2sgbW9kZXMsIG9uZSB3aGVyZSBpdGVtcyBzbGlkZSB1cCwgYW5kIHRoZSBvdGhlcgorICAgICAqIHdoZXJlIGl0ZW1zIHNsaWRlIGRvd24uIFRoZSBwZXJzcGVjdGl2ZSBpcyBhbHNvIGludmVydGVkIGJldHdlZW4gdGhlc2UgdHdvIG1vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVNU19TTElERV9VUCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElURU1TX1NMSURFX0RPV04gPSAxOworCisgICAgLyoqCisgICAgICogVGhlc2Ugc3BlY2lmeSB0aGUgZGlmZmVyZW50IGdlc3R1cmUgc3RhdGVzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFU1RVUkVfTk9ORSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFU1RVUkVfU0xJREVfVVAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVNUVVJFX1NMSURFX0RPV04gPSAyOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGhvdyBmYXIgeW91IG5lZWQgdG8gc3dpcGUgKHVwIG9yIGRvd24pIGJlZm9yZSBpdAorICAgICAqIHdpbGwgYmUgY29uc2lkZXIgYSBjb21wbGV0ZWQgZ2VzdHVyZSB3aGVuIHlvdSBsaWZ0IHlvdXIgZmluZ2VyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU1dJUEVfVEhSRVNIT0xEX1JBVElPID0gMC4zNWY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0xJREVfVVBfUkFUSU8gPSAwLjdmOworCisgICAgLyoqCisgICAgICogU2VudGluZWwgdmFsdWUgZm9yIG5vIGN1cnJlbnQgYWN0aXZlIHBvaW50ZXIuCisgICAgICogVXNlZCBieSB7QGxpbmsgI21BY3RpdmVQb2ludGVySWR9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BPSU5URVIgPSAtMTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBhY3RpdmUgdmlld3MgaW4gdGhlIHN0YWNrLiBPbmUgZmV3ZXIgdmlldyBpcyBhY3R1YWxseSB2aXNpYmxlLCBhcyBvbmUgaXMgaGlkZGVuLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fQUNUSVZFX1ZJRVdTID0gNTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGUkFNRV9QQURESU5HID0gNDsKKworICAgIC8qKgorICAgICAqIFRoZXNlIHZhcmlhYmxlcyBhcmUgYWxsIHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdG91Y2ggaW50ZXJhY3Rpb24KKyAgICAgKiB3aXRoIHRoZSBzdGFjaworICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbUluaXRpYWxZOworICAgIHByaXZhdGUgZmxvYXQgbUluaXRpYWxYOworICAgIHByaXZhdGUgaW50IG1BY3RpdmVQb2ludGVySWQ7CisgICAgcHJpdmF0ZSBpbnQgbVlWZWxvY2l0eSA9IDA7CisgICAgcHJpdmF0ZSBpbnQgbVN3aXBlR2VzdHVyZVR5cGUgPSBHRVNUVVJFX05PTkU7CisgICAgcHJpdmF0ZSBpbnQgbVNsaWRlQW1vdW50OworICAgIHByaXZhdGUgaW50IG1Td2lwZVRocmVzaG9sZDsKKyAgICBwcml2YXRlIGludCBtVG91Y2hTbG9wOworICAgIHByaXZhdGUgaW50IG1NYXhpbXVtVmVsb2NpdHk7CisgICAgcHJpdmF0ZSBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcjsKKworICAgIHByaXZhdGUgc3RhdGljIEhvbG9ncmFwaGljSGVscGVyIHNIb2xvZ3JhcGhpY0hlbHBlcjsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtSGlnaGxpZ2h0OworICAgIHByaXZhdGUgU3RhY2tTbGlkZXIgbVN0YWNrU2xpZGVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtRmlyc3RMYXlvdXRIYXBwZW5lZCA9IGZhbHNlOworICAgIHByaXZhdGUgVmlld0dyb3VwIG1BbmNlc3RvckNvbnRhaW5pbmdBbGxDaGlsZHJlbiA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgbUFuY2VzdG9ySGVpZ2h0ID0gMDsKKyAgICBwcml2YXRlIGludCBtU3RhY2tNb2RlOworICAgIHByaXZhdGUgaW50IG1GcmFtZVBhZGRpbmc7CisKKyAgICBwdWJsaWMgU3RhY2tWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdFN0YWNrVmlldygpOworICAgIH0KKworICAgIHB1YmxpYyBTdGFja1ZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICBpbml0U3RhY2tWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRTdGFja1ZpZXcoKSB7CisgICAgICAgIGNvbmZpZ3VyZVZpZXdBbmltYXRvcihOVU1fQUNUSVZFX1ZJRVdTLCBOVU1fQUNUSVZFX1ZJRVdTIC0gMik7CisgICAgICAgIHNldFN0YXRpY1RyYW5zZm9ybWF0aW9uc0VuYWJsZWQodHJ1ZSk7CisgICAgICAgIGZpbmFsIFZpZXdDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVRvdWNoU2xvcCA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkVG91Y2hTbG9wKCk7CisgICAgICAgIG1NYXhpbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCk7CisgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CisKKyAgICAgICAgbUhpZ2hsaWdodCA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbUhpZ2hsaWdodC5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhtSGlnaGxpZ2h0KSk7CisgICAgICAgIGFkZFZpZXdJbkxheW91dChtSGlnaGxpZ2h0LCAtMSwgbmV3IExheW91dFBhcmFtcyhtSGlnaGxpZ2h0KSk7CisgICAgICAgIG1TdGFja1NsaWRlciA9IG5ldyBTdGFja1NsaWRlcigpOworCisgICAgICAgIGlmIChzSG9sb2dyYXBoaWNIZWxwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc0hvbG9ncmFwaGljSGVscGVyID0gbmV3IEhvbG9ncmFwaGljSGVscGVyKG1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBzZXRDbGlwQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICBzZXRDbGlwVG9QYWRkaW5nKGZhbHNlKTsKKworICAgICAgICAvLyBUaGlzIHNldHMgdGhlIGZvcm0gb2YgdGhlIFN0YWNrVmlldywgd2hpY2ggaXMgY3VycmVudGx5IHRvIGhhdmUgdGhlIHBlcnNwZWN0aXZlLXNoaWZ0ZWQKKyAgICAgICAgLy8gdmlld3MgYWJvdmUgdGhlIGFjdGl2ZSB2aWV3LCBhbmQgaGF2ZSBpdGVtcyBzbGlkZSBkb3duIHdoZW4gc2xpZGluZyBvdXQuIFRoZSBvcHBvc2l0ZSBpcworICAgICAgICAvLyBhdmFpbGFibGUgYnkgdXNpbmcgSVRFTVNfU0xJREVfVVAuCisgICAgICAgIG1TdGFja01vZGUgPSBJVEVNU19TTElERV9ET1dOOworCisgICAgICAgIC8vIFRoaXMgaXMgYSBmbGFnIHRvIGluZGljYXRlIHRoZSB0aGUgc3RhY2sgaXMgbG9hZGluZyBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICAgICAgbVdoaWNoQ2hpbGQgPSAtMTsKKworICAgICAgICAvLyBBZGp1c3QgdGhlIGZyYW1lIHBhZGRpbmcgYmFzZWQgb24gdGhlIGRlbnNpdHksIHNpbmNlIHRoZSBoaWdobGlnaHQgY2hhbmdlcyBiYXNlZAorICAgICAgICAvLyBvbiB0aGUgZGVuc2l0eQorICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5OworICAgICAgICBtRnJhbWVQYWRkaW5nID0gKGludCkgTWF0aC5jZWlsKGRlbnNpdHkgKiBGUkFNRV9QQURESU5HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbmltYXRlIHRoZSB2aWV3cyBiZXR3ZWVuIGRpZmZlcmVudCByZWxhdGl2ZSBpbmRleGVzIHdpdGhpbiB0aGUge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgdm9pZCBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24oaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIFZpZXcgdmlldykgeworICAgICAgICBpZiAoZnJvbUluZGV4ID09IC0xICYmIHRvSW5kZXggPT0gMCkgeworICAgICAgICAgICAgLy8gRmFkZSBpdGVtIGluCisgICAgICAgICAgICBpZiAodmlldy5nZXRBbHBoYSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICB2aWV3LnNldEFscGhhKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworCisgICAgICAgICAgICBPYmplY3RBbmltYXRvcjxGbG9hdD4gZmFkZUluID0gbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PihERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgdmlldywgImFscGhhIiwgdmlldy5nZXRBbHBoYSgpLCAxLjBmKTsKKyAgICAgICAgICAgIGZhZGVJbi5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAxICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMikgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBpbgorICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworCisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgaW50IGR1cmF0aW9uID0gTWF0aC5yb3VuZChtU3RhY2tTbGlkZXIuZ2V0RHVyYXRpb25Gb3JOZXV0cmFsUG9zaXRpb24obVlWZWxvY2l0eSkpOworCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbGlkZUluWSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oIllQcm9ncmVzcyIsIDAuMGYpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNsaWRlSW5YID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWFByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBwYSA9IG5ldyBPYmplY3RBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICBzbGlkZUluWCwgc2xpZGVJblkpOworICAgICAgICAgICAgcGEuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAyICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IE1hdGgucm91bmQobVN0YWNrU2xpZGVyLmdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24obVlWZWxvY2l0eSkpOworCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbGlkZU91dFkgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJZUHJvZ3Jlc3MiLCAxLjBmKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbGlkZU91dFggPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJYUHJvZ3Jlc3MiLCAwLjBmKTsKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgc2xpZGVPdXRYLCBzbGlkZU91dFkpOworICAgICAgICAgICAgcGEuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSAtMSAmJiB0b0luZGV4ID09IG1OdW1BY3RpdmVWaWV3cyAtIDEpIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHZpZXcgdGhhdCBpcyAid2FpdGluZyBpbiB0aGUgd2luZ3MiIGlzIGludmlzaWJsZQorICAgICAgICAgICAgdmlldy5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VmlzaWJpbGl0eShJTlZJU0lCTEUpOworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGxwLnNldFZlcnRpY2FsT2Zmc2V0KC1tU2xpZGVBbW91bnQpOworICAgICAgICB9IGVsc2UgaWYgKHRvSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIEZhZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yPEZsb2F0PiBmYWRlT3V0ID0gbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PgorICAgICAgICAgICAgICAgICAgICAoREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04sIHZpZXcsICJhbHBoYSIsIHZpZXcuZ2V0QWxwaGEoKSwgMC4wZik7CisgICAgICAgICAgICBmYWRlT3V0LnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbXBsZW1lbnQgdGhlIGZha2VkIHBlcnNwZWN0aXZlCisgICAgICAgIGlmICh0b0luZGV4ICE9IC0xKSB7CisgICAgICAgICAgICB0cmFuc2Zvcm1WaWV3QXRJbmRleCh0b0luZGV4LCB2aWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0cmFuc2Zvcm1WaWV3QXRJbmRleChpbnQgaW5kZXgsIFZpZXcgdmlldykgeworICAgICAgICBmbG9hdCBtYXhQZXJwZWN0aXZlU2hpZnQgPSBtTWVhc3VyZWRIZWlnaHQgKiBQRVJTUEVDVElWRV9TSElGVF9GQUNUT1I7CisKKyAgICAgICAgaWYgKGluZGV4ID09IG1OdW1BY3RpdmVWaWV3cyAtMSkgaW5kZXgtLTsKKworICAgICAgICBmbG9hdCByID0gKGluZGV4ICogMS4wZikgLyAobU51bUFjdGl2ZVZpZXdzIC0gMik7CisKKyAgICAgICAgZmxvYXQgc2NhbGUgPSAxIC0gUEVSU1BFQ1RJVkVfU0NBTEVfRkFDVE9SICogKDEgLSByKTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNjYWxlWCA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oInNjYWxlWCIsIHNjYWxlKTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNjYWxlWSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oInNjYWxlWSIsIHNjYWxlKTsKKworICAgICAgICByID0gKGZsb2F0KSBNYXRoLnBvdyhyLCAyKTsKKworICAgICAgICBpbnQgc3RhY2tEaXJlY3Rpb24gPSAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9VUCkgPyAxIDogLTE7CisgICAgICAgIGZsb2F0IHBlcnNwZWN0aXZlVHJhbnNsYXRpb24gPSAtc3RhY2tEaXJlY3Rpb24gKiByICogbWF4UGVycGVjdGl2ZVNoaWZ0OworICAgICAgICBmbG9hdCBzY2FsZVNoaWZ0Q29ycmVjdGlvbiA9IHN0YWNrRGlyZWN0aW9uICogKDEgLSBzY2FsZSkgKgorICAgICAgICAgICAgICAgIChtTWVhc3VyZWRIZWlnaHQgKiAoMSAtIFBFUlNQRUNUSVZFX1NISUZUX0ZBQ1RPUikgLyAyLjBmKTsKKyAgICAgICAgZmxvYXQgdHJhbnNZID0gcGVyc3BlY3RpdmVUcmFuc2xhdGlvbiArIHNjYWxlU2hpZnRDb3JyZWN0aW9uOworCisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiB0cmFuc2xhdGlvblkgPQorICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oInRyYW5zbGF0aW9uWSIsIHRyYW5zWSk7CisgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKDEwMCwgdmlldywgc2NhbGVYLCBzY2FsZVksIHRyYW5zbGF0aW9uWSk7CisgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoaWxkVHJhbnNmb3JtcygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtQWN0aXZlVmlld3MgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoaSk7CisgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtVmlld0F0SW5kZXgoaSwgdik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBGcmFtZUxheW91dCBnZXRGcmFtZUZvckNoaWxkKCkgeworICAgICAgICBGcmFtZUxheW91dCBmbCA9IG5ldyBGcmFtZUxheW91dChtQ29udGV4dCk7CisgICAgICAgIGZsLnNldFBhZGRpbmcobUZyYW1lUGFkZGluZywgbUZyYW1lUGFkZGluZywgbUZyYW1lUGFkZGluZywgbUZyYW1lUGFkZGluZyk7CisgICAgICAgIHJldHVybiBmbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBseSBhbnkgbmVjZXNzYXJ5IHRyYW5mb3JtcyBmb3IgdGhlIGNoaWxkIHRoYXQgaXMgYmVpbmcgYWRkZWQuCisgICAgICovCisgICAgdm9pZCBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChWaWV3IGNoaWxkLCBpbnQgcmVsYXRpdmVJbmRleCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgIHN1cGVyLmRpc3BhdGNoRHJhdyhjYW52YXMpOworICAgIH0KKworICAgIC8vIFRPRE86IHJpZ2h0IG5vdywgdGhpcyBjb2RlIHdhbGtzIHVwIHRoZSBoaWVyYXJjaHkgYXMgZmFyIGFzIG5lZWRlZCBhbmQgZGlzYWJsZXMgY2xpcHBpbmcKKyAgICAvLyBzbyB0aGF0IHRoZSBzdGFjaydzIGNoaWxkcmVuIGNhbiBkcmF3IG91dHNpZGUgb2YgdGhlIHN0YWNrJ3MgYm91bmRzLiBUaGlzIGlzIGZpbmUgd2l0aGluCisgICAgLy8gdGhlIGNvbnRleHQgb2Ygd2lkZ2V0cyBpbiB0aGUgbGF1bmNoZXIsIGJ1dCBpcyBkZXN0cnVjdGl2ZSBpbiBnZW5lcmFsLCBhcyB0aGUgY2xpcHBpbmcKKyAgICAvLyB2YWx1ZXMgYXJlIG5vdCBiZWluZyByZXNldC4gRm9yIHRoaXMgdG8gYmUgYSBmdWxsIGZyYW1ld29yayBsZXZlbCB3aWRnZXQsIHdlIHdpbGwgbmVlZAorICAgIC8vIGZyYW1ld29yayBsZXZlbCBzdXBwb3J0IGZvciBkcmF3aW5nIG91dHNpZGUgb2YgYSBwYXJlbnQncyBib3VuZHMuCisgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVQYXJlbnRhbENsaXBwaW5nKCkgeworICAgICAgICBpZiAobUFuY2VzdG9yQ29udGFpbmluZ0FsbENoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIFZpZXdHcm91cCB2ZyA9IHRoaXM7CisgICAgICAgICAgICB3aGlsZSAodmcuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiB2Zy5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGlmICh2ZyA9PSBtQW5jZXN0b3JDb250YWluaW5nQWxsQ2hpbGRyZW4pIGJyZWFrOworICAgICAgICAgICAgICAgIHZnID0gKFZpZXdHcm91cCkgdmcuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgdmcuc2V0Q2xpcENoaWxkcmVuKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB2Zy5zZXRDbGlwVG9QYWRkaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkxheW91dCgpIHsKKyAgICAgICAgaWYgKCFtRmlyc3RMYXlvdXRIYXBwZW5lZCkgeworICAgICAgICAgICAgbVNsaWRlQW1vdW50ID0gTWF0aC5yb3VuZChTTElERV9VUF9SQVRJTyAqIGdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICAgICAgdXBkYXRlQ2hpbGRUcmFuc2Zvcm1zKCk7CisgICAgICAgICAgICBtU3dpcGVUaHJlc2hvbGQgPSBNYXRoLnJvdW5kKFNXSVBFX1RIUkVTSE9MRF9SQVRJTyAqIG1TbGlkZUFtb3VudCk7CisgICAgICAgICAgICBtRmlyc3RMYXlvdXRIYXBwZW5lZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBzd2l0Y2goYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVBvaW50ZXJJZCA9PSBJTlZBTElEX1BPSU5URVIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxYID0gZXYuZ2V0WCgpOworICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFkgPSBldi5nZXRZKCk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTogeworICAgICAgICAgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICAgICAgICAgIGlmIChwb2ludGVySW5kZXggPT0gSU5WQUxJRF9QT0lOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGRhdGEgZm9yIG91ciBwcmltYXJ5IHBvaW50ZXIsIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgbG9nIGl0CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiBObyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsb2F0IG5ld1kgPSBldi5nZXRZKHBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICAgICAgZmxvYXQgZGVsdGFZID0gbmV3WSAtIG1Jbml0aWFsWTsKKworICAgICAgICAgICAgICAgIGJlZ2luR2VzdHVyZUlmTmVlZGVkKGRlbHRhWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOiB7CisgICAgICAgICAgICAgICAgb25TZWNvbmRhcnlQb2ludGVyVXAoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworICAgICAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gR0VTVFVSRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1Td2lwZUdlc3R1cmVUeXBlICE9IEdFU1RVUkVfTk9ORTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYmVnaW5HZXN0dXJlSWZOZWVkZWQoZmxvYXQgZGVsdGFZKSB7CisgICAgICAgIGlmICgoaW50KSBNYXRoLmFicyhkZWx0YVkpID4gbVRvdWNoU2xvcCAmJiBtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX05PTkUpIHsKKyAgICAgICAgICAgIGludCBzd2lwZUdlc3R1cmVUeXBlID0gZGVsdGFZIDwgMCA/IEdFU1RVUkVfU0xJREVfVVAgOiBHRVNUVVJFX1NMSURFX0RPV047CisgICAgICAgICAgICBjYW5jZWxMb25nUHJlc3MoKTsKKyAgICAgICAgICAgIHJlcXVlc3REaXNhbGxvd0ludGVyY2VwdFRvdWNoRXZlbnQodHJ1ZSk7CisKKyAgICAgICAgICAgIGludCBhY3RpdmVJbmRleDsKKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlSW5kZXggPSAoc3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pID8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1BY3RpdmVWaWV3cyAtIDEgOiBtTnVtQWN0aXZlVmlld3MgLSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVJbmRleCA9IChzd2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgPworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUFjdGl2ZVZpZXdzIC0gMiA6IG1OdW1BY3RpdmVWaWV3cyAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChtTG9vcFZpZXdzKSB7CisgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldE1vZGUoU3RhY2tTbGlkZXIuTk9STUFMX01PREUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkICsgYWN0aXZlSW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRNb2RlKFN0YWNrU2xpZGVyLkJFR0lOTklOR19PRl9TVEFDS19NT0RFKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRXaW5kb3dTdGFydFVuYm91bmRlZCArIGFjdGl2ZUluZGV4ID09IG1BZGFwdGVyLmdldENvdW50KCkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVJbmRleC0tOworICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRNb2RlKFN0YWNrU2xpZGVyLkVORF9PRl9TVEFDS19NT0RFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldE1vZGUoU3RhY2tTbGlkZXIuTk9STUFMX01PREUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWaWV3IHYgPSBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KGFjdGl2ZUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRJbWFnZUJpdG1hcChzSG9sb2dyYXBoaWNIZWxwZXIuY3JlYXRlT3V0bGluZSh2KSk7CisgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFJvdGF0aW9uKHYuZ2V0Um90YXRpb24oKSk7CisgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFRyYW5zbGF0aW9uWSh2LmdldFRyYW5zbGF0aW9uWSgpKTsKKyAgICAgICAgICAgIG1IaWdobGlnaHQuYnJpbmdUb0Zyb250KCk7CisgICAgICAgICAgICB2LmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFZpZXcodik7CisKKyAgICAgICAgICAgIGlmIChzd2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikKKyAgICAgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgcmVnaXN0ZXIgdGhpcyBnZXN0dXJlIGlmIHdlJ3ZlIG1hZGUgaXQgdGhpcyBmYXIgd2l0aG91dCBhIHByb2JsZW0KKyAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gc3dpcGVHZXN0dXJlVHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICBpZiAocG9pbnRlckluZGV4ID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgLy8gbm8gZGF0YSBmb3Igb3VyIHByaW1hcnkgcG9pbnRlciwgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBsb2cgaXQKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiBObyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgbmV3WSA9IGV2LmdldFkocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmxvYXQgbmV3WCA9IGV2LmdldFgocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmxvYXQgZGVsdGFZID0gbmV3WSAtIG1Jbml0aWFsWTsKKyAgICAgICAgZmxvYXQgZGVsdGFYID0gbmV3WCAtIG1Jbml0aWFsWDsKKyAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKKyAgICAgICAgfQorICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmFkZE1vdmVtZW50KGV2KTsKKworICAgICAgICBzd2l0Y2ggKGFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSB7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOiB7CisgICAgICAgICAgICAgICAgYmVnaW5HZXN0dXJlSWZOZWVkZWQoZGVsdGFZKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHJ4ID0gZGVsdGFYIC8gKG1TbGlkZUFtb3VudCAqIDEuMGYpOworICAgICAgICAgICAgICAgIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgciA9IChkZWx0YVkgLSBtVG91Y2hTbG9wICogMS4wZikgLyBtU2xpZGVBbW91bnQgKiAxLjBmOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9ET1dOKSByID0gMSAtIHI7CisgICAgICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRZUHJvZ3Jlc3MoMSAtIHIpOworICAgICAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0WFByb2dyZXNzKHJ4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHIgPSAtKGRlbHRhWSArIG1Ub3VjaFNsb3AgKiAxLjBmKSAvIG1TbGlkZUFtb3VudCAqIDEuMGY7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX0RPV04pIHIgPSAxIC0gcjsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFlQcm9ncmVzcyhyKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFhQcm9ncmVzcyhyeCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiB7CisgICAgICAgICAgICAgICAgaGFuZGxlUG9pbnRlclVwKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6IHsKKyAgICAgICAgICAgICAgICBvblNlY29uZGFyeVBvaW50ZXJVcChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworICAgICAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gR0VTVFVSRV9OT05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUmVjdCB0b3VjaFJlY3QgPSBuZXcgUmVjdCgpOworICAgIHByaXZhdGUgdm9pZCBvblNlY29uZGFyeVBvaW50ZXJVcChNb3Rpb25FdmVudCBldikgeworICAgICAgICBmaW5hbCBpbnQgYWN0aXZlUG9pbnRlckluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgZmluYWwgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChhY3RpdmVQb2ludGVySW5kZXgpOworICAgICAgICBpZiAocG9pbnRlcklkID09IG1BY3RpdmVQb2ludGVySWQpIHsKKworICAgICAgICAgICAgaW50IGFjdGl2ZVZpZXdJbmRleCA9IChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pID8gbU51bUFjdGl2ZVZpZXdzIC0gMQorICAgICAgICAgICAgICAgICAgICA6IG1OdW1BY3RpdmVWaWV3cyAtIDI7CisKKyAgICAgICAgICAgIFZpZXcgdiA9IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoYWN0aXZlVmlld0luZGV4KTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgLy8gT3VyIHByaW1hcnkgcG9pbnRlciBoYXMgZ29uZSB1cCAtLSBsZXQncyBzZWUgaWYgd2UgY2FuIGZpbmQKKyAgICAgICAgICAgIC8vIGFub3RoZXIgcG9pbnRlciBvbiB0aGUgdmlldy4gSWYgc28sIHRoZW4gd2Ugc2hvdWxkIHJlcGxhY2UKKyAgICAgICAgICAgIC8vIG91ciBwcmltYXJ5IHBvaW50ZXIgd2l0aCB0aGlzIG5ldyBwb2ludGVyIGFuZCBhZGp1c3QgdGhpbmdzCisgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSB2aWV3IGRvZXNuJ3QganVtcAorICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGV2LmdldFBvaW50ZXJDb3VudCgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IGFjdGl2ZVBvaW50ZXJJbmRleCkgeworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHggPSBldi5nZXRYKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSA9IGV2LmdldFkoaW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgIHRvdWNoUmVjdC5zZXQodi5nZXRMZWZ0KCksIHYuZ2V0VG9wKCksIHYuZ2V0UmlnaHQoKSwgdi5nZXRCb3R0b20oKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b3VjaFJlY3QuY29udGFpbnMoTWF0aC5yb3VuZCh4KSwgTWF0aC5yb3VuZCh5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9sZFggPSBldi5nZXRYKGFjdGl2ZVBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvbGRZID0gZXYuZ2V0WShhY3RpdmVQb2ludGVySW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3Qgb3VyIGZyYW1lIG9mIHJlZmVyZW5jZSB0byBhdm9pZCBhIGp1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWSArPSAoeSAtIG9sZFkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxYICs9ICh4IC0gb2xkWCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rLCB3ZSdyZSBnb29kLCB3ZSBmb3VuZCBhIG5ldyBwb2ludGVyIHdoaWNoIGlzIHRvdWNoaW5nIHRoZSBhY3RpdmUgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgd2UgbWFkZSBpdCB0aGlzIGZhciwgaXQgbWVhbnMgd2UgZGlkbid0IGZpbmQgYSBzYXRpc2ZhY3RvcnkgbmV3IHBvaW50ZXIgOigsCisgICAgICAgICAgICAvLyBzbyBlbmQgdGhlIGdlc3R1cmUKKyAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJVcChldik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlUG9pbnRlclVwKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICBpbnQgZGVsdGFZID0gKGludCkgKG5ld1kgLSBtSW5pdGlhbFkpOworCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKKyAgICAgICAgICAgIG1ZVmVsb2NpdHkgPSAoaW50KSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVsdGFZID4gbVN3aXBlVGhyZXNob2xkICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTgorICAgICAgICAgICAgICAgICYmIG1TdGFja1NsaWRlci5tTW9kZSA9PSBTdGFja1NsaWRlci5OT1JNQUxfTU9ERSkgeworICAgICAgICAgICAgLy8gU3dpcGUgdGhyZXNob2xkIGV4Y2VlZGVkLCBzd2lwZSBkb3duCisgICAgICAgICAgICBpZiAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9VUCkgeworICAgICAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3dQcmV2aW91cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUhpZ2hsaWdodC5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZWx0YVkgPCAtbVN3aXBlVGhyZXNob2xkICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfVVAKKyAgICAgICAgICAgICAgICAmJiBtU3RhY2tTbGlkZXIubU1vZGUgPT0gU3RhY2tTbGlkZXIuTk9STUFMX01PREUpIHsKKyAgICAgICAgICAgIC8vIFN3aXBlIHRocmVzaG9sZCBleGNlZWRlZCwgc3dpcGUgdXAKKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgc2hvd1ByZXZpb3VzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1IaWdobGlnaHQuYnJpbmdUb0Zyb250KCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9VUCApIHsKKyAgICAgICAgICAgIC8vIERpZG4ndCBzd2lwZSB1cCBmYXIgZW5vdWdoLCBzbmFwIGJhY2sgZG93bgorICAgICAgICAgICAgaW50IGR1cmF0aW9uOworICAgICAgICAgICAgZmxvYXQgZmluYWxZUHJvZ3Jlc3MgPSAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9ET1dOKSA/IDEgOiAwOworICAgICAgICAgICAgaWYgKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfVVAgfHwgbVN0YWNrU2xpZGVyLm1Nb2RlICE9IFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbmFwQmFja1kgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJZUHJvZ3Jlc3MiLCBmaW5hbFlQcm9ncmVzcyk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4gc25hcEJhY2tYID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWFByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBwYSA9IG5ldyBPYmplY3RBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICBzbmFwQmFja1gsIHNuYXBCYWNrWSk7CisgICAgICAgICAgICBwYS5zZXRJbnRlcnBvbGF0b3IobmV3IExpbmVhckludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9ET1dOKSB7CisgICAgICAgICAgICAvLyBEaWRuJ3Qgc3dpcGUgZG93biBmYXIgZW5vdWdoLCBzbmFwIGJhY2sgdXAKKyAgICAgICAgICAgIGZsb2F0IGZpbmFsWVByb2dyZXNzID0gKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfRE9XTikgPyAwIDogMTsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX0RPV04gfHwgbVN0YWNrU2xpZGVyLm1Nb2RlICE9IFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbmFwQmFja1kgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJZUHJvZ3Jlc3MiLCBmaW5hbFlQcm9ncmVzcyk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4gc25hcEJhY2tYID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWFByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBwYSA9IG5ldyBPYmplY3RBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICBzbmFwQmFja1gsIHNuYXBCYWNrWSk7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgbVN3aXBlR2VzdHVyZVR5cGUgPSBHRVNUVVJFX05PTkU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTdGFja1NsaWRlciB7CisgICAgICAgIFZpZXcgbVZpZXc7CisgICAgICAgIGZsb2F0IG1ZUHJvZ3Jlc3M7CisgICAgICAgIGZsb2F0IG1YUHJvZ3Jlc3M7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfTU9ERSA9IDA7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQkVHSU5OSU5HX09GX1NUQUNLX01PREUgPSAxOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9TVEFDS19NT0RFID0gMjsKKworICAgICAgICBpbnQgbU1vZGUgPSBOT1JNQUxfTU9ERTsKKworICAgICAgICBwdWJsaWMgU3RhY2tTbGlkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RhY2tTbGlkZXIoU3RhY2tTbGlkZXIgY29weSkgeworICAgICAgICAgICAgbVZpZXcgPSBjb3B5Lm1WaWV3OworICAgICAgICAgICAgbVlQcm9ncmVzcyA9IGNvcHkubVlQcm9ncmVzczsKKyAgICAgICAgICAgIG1YUHJvZ3Jlc3MgPSBjb3B5Lm1YUHJvZ3Jlc3M7CisgICAgICAgICAgICBtTW9kZSA9IGNvcHkubU1vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IGN1YmljKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmxvYXQpIChNYXRoLnBvdygyICogciAtIDEsIDMpICsgMSkgLyAyLjBmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihmbG9hdCByKSB7CisgICAgICAgICAgICBmbG9hdCBwaXZvdCA9IDAuNGY7CisgICAgICAgICAgICBpZiAociA8IHBpdm90KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAuODVmICogY3ViaWMociAvIHBpdm90KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAuODVmICogY3ViaWMoMSAtIChyIC0gcGl2b3QpIC8gKDEgLSBwaXZvdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3QWxwaGFJbnRlcnBvbGF0b3IoZmxvYXQgcikgeworICAgICAgICAgICAgZmxvYXQgcGl2b3QgPSAwLjNmOworICAgICAgICAgICAgaWYgKHIgPiBwaXZvdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAociAtIHBpdm90KSAvICgxIC0gcGl2b3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmxvYXQgcm90YXRpb25JbnRlcnBvbGF0b3IoZmxvYXQgcikgeworICAgICAgICAgICAgZmxvYXQgcGl2b3QgPSAwLjJmOworICAgICAgICAgICAgaWYgKHIgPCBwaXZvdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHIgLSBwaXZvdCkgLyAoMSAtIHBpdm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0VmlldyhWaWV3IHYpIHsKKyAgICAgICAgICAgIG1WaWV3ID0gdjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFlQcm9ncmVzcyhmbG9hdCByKSB7CisgICAgICAgICAgICAvLyBlbmZvcmNlIHIgYmV0d2VlbiAwIGFuZCAxCisgICAgICAgICAgICByID0gTWF0aC5taW4oMS4wZiwgcik7CisgICAgICAgICAgICByID0gTWF0aC5tYXgoMCwgcik7CisKKyAgICAgICAgICAgIG1ZUHJvZ3Jlc3MgPSByOworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIHZpZXdMcCA9IChMYXlvdXRQYXJhbXMpIG1WaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGhpZ2hsaWdodExwID0gKExheW91dFBhcmFtcykgbUhpZ2hsaWdodC5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgaW50IHN0YWNrRGlyZWN0aW9uID0gKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfVVApID8gMSA6IC0xOworCisgICAgICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT1JNQUxfTU9ERToKKyAgICAgICAgICAgICAgICAgICAgdmlld0xwLnNldFZlcnRpY2FsT2Zmc2V0KE1hdGgucm91bmQoLXIgKiBzdGFja0RpcmVjdGlvbiAqIG1TbGlkZUFtb3VudCkpOworICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1yICogc3RhY2tEaXJlY3Rpb24gKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSB2aWV3QWxwaGFJbnRlcnBvbGF0b3IoMSAtIHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1ha2Ugc3VyZSB0aGF0IHZpZXdzIHdoaWNoIGNhbid0IGJlIHNlZW4gKGhhdmUgMCBhbHBoYSkgYXJlIGFsc28gaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhleSBkb24ndCBpbnRlcmZlcmUgd2l0aCBjbGljayBldmVudHMuCisgICAgICAgICAgICAgICAgICAgIGlmIChtVmlldy5nZXRBbHBoYSgpID09IDAgJiYgYWxwaGEgIT0gMCAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSA9PSAwICYmIG1WaWV3LmdldEFscGhhKCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1WaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5zZXRWaXNpYmlsaXR5KElOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtVmlldy5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIG1WaWV3LnNldFJvdGF0aW9uWChzdGFja0RpcmVjdGlvbiAqIDkwLjBmICogcm90YXRpb25JbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFJvdGF0aW9uWChzdGFja0RpcmVjdGlvbiAqIDkwLjBmICogcm90YXRpb25JbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJFR0lOTklOR19PRl9TVEFDS19NT0RFOgorICAgICAgICAgICAgICAgICAgICByID0gciAqIDAuMmY7CisgICAgICAgICAgICAgICAgICAgIHZpZXdMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1zdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZCgtc3RhY2tEaXJlY3Rpb24gKiByICogbVNsaWRlQW1vdW50KSk7CisgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0QWxwaGEoaGlnaGxpZ2h0QWxwaGFJbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVORF9PRl9TVEFDS19NT0RFOgorICAgICAgICAgICAgICAgICAgICByID0gKDEtcikgKiAwLjJmOworICAgICAgICAgICAgICAgICAgICB2aWV3THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZChzdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZChzdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WFByb2dyZXNzKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIC8vIGVuZm9yY2UgciBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgICAgIHIgPSBNYXRoLm1pbigyLjBmLCByKTsKKyAgICAgICAgICAgIHIgPSBNYXRoLm1heCgtMi4wZiwgcik7CisKKyAgICAgICAgICAgIG1YUHJvZ3Jlc3MgPSByOworCisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgdmlld0xwID0gKExheW91dFBhcmFtcykgbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgaGlnaGxpZ2h0THAgPSAoTGF5b3V0UGFyYW1zKSBtSGlnaGxpZ2h0LmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICByICo9IDAuMmY7CisgICAgICAgICAgICB2aWV3THAuc2V0SG9yaXpvbnRhbE9mZnNldChNYXRoLnJvdW5kKHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgIGhpZ2hsaWdodExwLnNldEhvcml6b250YWxPZmZzZXQoTWF0aC5yb3VuZChyICogbVNsaWRlQW1vdW50KSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yTmV1dHJhbFBvc2l0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldER1cmF0aW9uKGZhbHNlLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24odHJ1ZSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBnZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbihmbG9hdCB2ZWxvY2l0eSkgeworICAgICAgICAgICAgcmV0dXJuIGdldER1cmF0aW9uKGZhbHNlLCB2ZWxvY2l0eSk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBnZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKGZsb2F0IHZlbG9jaXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24odHJ1ZSwgdmVsb2NpdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBnZXREdXJhdGlvbihib29sZWFuIGludmVydCwgZmxvYXQgdmVsb2NpdHkpIHsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIHZpZXdMcCA9IChMYXlvdXRQYXJhbXMpIG1WaWV3LmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICAgICAgZmxvYXQgZCA9IChmbG9hdCkgTWF0aC5zcXJ0KE1hdGgucG93KHZpZXdMcC5ob3Jpem9udGFsT2Zmc2V0LCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyh2aWV3THAudmVydGljYWxPZmZzZXQsIDIpKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXhkID0gKGZsb2F0KSBNYXRoLnNxcnQoTWF0aC5wb3cobVNsaWRlQW1vdW50LCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdygwLjRmICogbVNsaWRlQW1vdW50LCAyKSk7CisKKyAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGludmVydCA/ICgxIC0gZCAvIG1heGQpIDogZCAvIG1heGQpICogREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT047CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHVyYXRpb24gPSBpbnZlcnQgPyBkIC8gTWF0aC5hYnModmVsb2NpdHkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4ZCAtIGQpIC8gTWF0aC5hYnModmVsb2NpdHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPCBNSU5JTVVNX0FOSU1BVElPTl9EVVJBVElPTiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID4gREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXREdXJhdGlvbihpbnZlcnQsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGR1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0WVByb2dyZXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ZUHJvZ3Jlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0WFByb2dyZXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1YUHJvZ3Jlc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKSB7CisgICAgICAgIHN1cGVyLm9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpOworICAgICAgICAvLyBPbiBmaXJzdCBydW4sIHdlIHdhbnQgdG8gc2V0IHRoZSBzdGFjayB0byB0aGUgZW5kLgorICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtV2hpY2hDaGlsZCA9PSAtMSkgeworICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtQWRhcHRlci5nZXRDb3VudCgpIC0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVdoaWNoQ2hpbGQgPj0gMCkgeworICAgICAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQobVdoaWNoQ2hpbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgTGF5b3V0UGFyYW1zIGNyZWF0ZU9yUmV1c2VMYXlvdXRQYXJhbXMoVmlldyB2KSB7CisgICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgY3VycmVudExwID0gdi5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRMcCBpbnN0YW5jZW9mIExheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY3VycmVudExwOworICAgICAgICAgICAgbHAuc2V0SG9yaXpvbnRhbE9mZnNldCgwKTsKKyAgICAgICAgICAgIGxwLnNldFZlcnRpY2FsT2Zmc2V0KDApOworICAgICAgICAgICAgbHAud2lkdGggPSAwOworICAgICAgICAgICAgbHAud2lkdGggPSAwOworICAgICAgICAgICAgcmV0dXJuIGxwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTGF5b3V0UGFyYW1zKHYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBib29sZWFuIGRhdGFDaGFuZ2VkID0gbURhdGFDaGFuZ2VkOworICAgICAgICBpZiAoZGF0YUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGhhbmRsZURhdGFDaGFuZ2VkKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBkYXRhIGNoYW5nZXMsIG1XaGljaENoaWxkIG1pZ2h0IGJlIG91dCBvZiB0aGUgYm91bmRzIG9mIHRoZSBhZGFwdGVyCisgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHdlIHJlc2V0IG1XaGljaENoaWxkIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGlmIChtV2hpY2hDaGlsZCA+PSBtQWRhcHRlci5nZXRDb3VudCgpKQorICAgICAgICAgICAgICAgIG1XaGljaENoaWxkID0gMDsKKworICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIHRydWUsIHRydWUpOworICAgICAgICAgICAgcmVmcmVzaENoaWxkcmVuKCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworCisgICAgICAgICAgICBpbnQgY2hpbGRSaWdodCA9IG1QYWRkaW5nTGVmdCArIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgICAgIGludCBjaGlsZEJvdHRvbSA9IG1QYWRkaW5nVG9wICsgY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICBjaGlsZC5sYXlvdXQobVBhZGRpbmdMZWZ0ICsgbHAuaG9yaXpvbnRhbE9mZnNldCwgbVBhZGRpbmdUb3AgKyBscC52ZXJ0aWNhbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRSaWdodCArIGxwLmhvcml6b250YWxPZmZzZXQsIGNoaWxkQm90dG9tICsgbHAudmVydGljYWxPZmZzZXQpOworCisgICAgICAgIH0KKworICAgICAgICBtRGF0YUNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgb25MYXlvdXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWVhc3VyZUNoaWxkcmVuKCkgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZpbmFsIGludCBjaGlsZFdpZHRoID0gbU1lYXN1cmVkV2lkdGggLSBtUGFkZGluZ0xlZnQgLSBtUGFkZGluZ1JpZ2h0OworICAgICAgICBmaW5hbCBpbnQgY2hpbGRIZWlnaHQgPSBNYXRoLnJvdW5kKG1NZWFzdXJlZEhlaWdodCooMS1QRVJTUEVDVElWRV9TSElGVF9GQUNUT1IpKQorICAgICAgICAgICAgICAgIC0gbVBhZGRpbmdUb3AgLSBtUGFkZGluZ0JvdHRvbTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgY2hpbGQubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY2hpbGRXaWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSksCisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjaGlsZEhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoU3BlY01vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0U3BlY01vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKworICAgICAgICBib29sZWFuIGhhdmVDaGlsZFJlZlNpemUgPSAobVJlZmVyZW5jZUNoaWxkV2lkdGggIT0gLTEgJiYgbVJlZmVyZW5jZUNoaWxkSGVpZ2h0ICE9IC0xKTsKKworICAgICAgICAvLyBXZSBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBvdXIgcGFyZW50IGhhc24ndCB0b2xkIHVzIGhvdworICAgICAgICAvLyBiaWcgd2Ugc2hvdWxkIGJlLiBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkCisgICAgICAgIGZsb2F0IGZhY3RvciA9IDEvKDEgLSBQRVJTUEVDVElWRV9TSElGVF9GQUNUT1IpOworICAgICAgICBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgIGhlaWdodFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/CisgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQobVJlZmVyZW5jZUNoaWxkSGVpZ2h0ICogKDEgKyBmYWN0b3IpKSArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nVG9wICsgbVBhZGRpbmdCb3R0b20gOiAwOworICAgICAgICB9IGVsc2UgaWYgKGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIGhlaWdodFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/IE1hdGgubWluKAorICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG1SZWZlcmVuY2VDaGlsZEhlaWdodCAqICgxICsgZmFjdG9yKSkgKyBtUGFkZGluZ1RvcCArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nQm90dG9tLCBoZWlnaHRTcGVjU2l6ZSkgOiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdpZHRoU3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgIHdpZHRoU3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8gbVJlZmVyZW5jZUNoaWxkV2lkdGggKyBtUGFkZGluZ0xlZnQgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ1JpZ2h0IDogMDsKKyAgICAgICAgfSBlbHNlIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5BVF9NT1NUKSB7CisgICAgICAgICAgICB3aWR0aFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/IE1hdGgubWluKG1SZWZlcmVuY2VDaGlsZFdpZHRoICsgbVBhZGRpbmdMZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdSaWdodCwgd2lkdGhTcGVjU2l6ZSkgOiAwOworICAgICAgICB9CisKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24od2lkdGhTcGVjU2l6ZSwgaGVpZ2h0U3BlY1NpemUpOworICAgICAgICBtZWFzdXJlQ2hpbGRyZW4oKTsKKyAgICB9CisKKyAgICBjbGFzcyBMYXlvdXRQYXJhbXMgZXh0ZW5kcyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHsKKyAgICAgICAgaW50IGhvcml6b250YWxPZmZzZXQ7CisgICAgICAgIGludCB2ZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgVmlldyBtVmlldzsKKworICAgICAgICBMYXlvdXRQYXJhbXMoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBzdXBlcigwLCAwKTsKKyAgICAgICAgICAgIHdpZHRoID0gMDsKKyAgICAgICAgICAgIGhlaWdodCA9IDA7CisgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIG1WaWV3ID0gdmlldzsKKyAgICAgICAgfQorCisgICAgICAgIExheW91dFBhcmFtcyhDb250ZXh0IGMsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgc3VwZXIoYywgYXR0cnMpOworICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCA9IDA7CisgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9IDA7CisgICAgICAgICAgICB3aWR0aCA9IDA7CisgICAgICAgICAgICBoZWlnaHQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZWN0IHBhcmVudFJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICB2b2lkIGludmFsaWRhdGVHbG9iYWxSZWdpb24oVmlldyB2LCBSZWN0IHIpIHsKKyAgICAgICAgICAgIFZpZXcgcCA9IHY7CisgICAgICAgICAgICBpZiAoISh2LmdldFBhcmVudCgpICE9IG51bGwgJiYgdi5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXcpKSByZXR1cm47CisKKyAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RQYXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIHBhcmVudFJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICAgICAgaW50IGRlcHRoID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChwLmdldFBhcmVudCgpICE9IG51bGwgJiYgcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXcKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmVudFJlY3QuY29udGFpbnMocikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UGFzcykgeworICAgICAgICAgICAgICAgICAgICByLm9mZnNldChwLmdldExlZnQoKSAtIHAuZ2V0U2Nyb2xsWCgpLCBwLmdldFRvcCgpIC0gcC5nZXRTY3JvbGxZKCkpOworICAgICAgICAgICAgICAgICAgICBkZXB0aCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaXJzdFBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwID0gKFZpZXcpIHAuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgcGFyZW50UmVjdC5zZXQocC5nZXRTY3JvbGxYKCksIHAuZ2V0U2Nyb2xsWSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0V2lkdGgoKSArIHAuZ2V0U2Nyb2xsWCgpLCBwLmdldEhlaWdodCgpICsgcC5nZXRTY3JvbGxZKCkpOworCisgICAgICAgICAgICAgICAgLy8gVE9ETzogd2UgbmVlZCB0byBzdG9wIGVhcmx5IGhlcmUgaWYgd2UndmUgaGl0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4KKyAgICAgICAgICAgICAgICAvLyBzbyBhcyB0byBwcmV2ZW50IHVzIGZyb20gd2Fsa2luZyB0b28gaGlnaCBpbiB0aGUgaGllcmFyY2h5LiBBIGxvdCBvZiB0aGlzCisgICAgICAgICAgICAgICAgLy8gY29kZSBtaWdodCBiZWNvbWUgYSBsb3QgbW9yZSBzdHJhaWdodGZvcndhcmQuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZXB0aCA+IG1BbmNlc3RvckhlaWdodCkgeworICAgICAgICAgICAgICAgIG1BbmNlc3RvckNvbnRhaW5pbmdBbGxDaGlsZHJlbiA9IChWaWV3R3JvdXApIHA7CisgICAgICAgICAgICAgICAgbUFuY2VzdG9ySGVpZ2h0ID0gZGVwdGg7CisgICAgICAgICAgICAgICAgZGlzYWJsZVBhcmVudGFsQ2xpcHBpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcC5pbnZhbGlkYXRlKHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVjdCBpbnZhbGlkYXRlUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgIHByaXZhdGUgUmVjdEYgaW52YWxpZGF0ZVJlY3RmID0gbmV3IFJlY3RGKCk7CisgICAgICAgIC8vIFRoaXMgaXMgcHVibGljIHNvIHRoYXQgT2JqZWN0QW5pbWF0b3IgY2FuIGFjY2VzcyBpdAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbE9mZnNldChpbnQgbmV3VmVydGljYWxPZmZzZXQpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXREZWx0YSA9IG5ld1ZlcnRpY2FsT2Zmc2V0IC0gdmVydGljYWxPZmZzZXQ7CisgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9IG5ld1ZlcnRpY2FsT2Zmc2V0OworCisgICAgICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1WaWV3LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICBpbnQgdG9wID0gTWF0aC5taW4obVZpZXcuZ2V0VG9wKCkgKyBvZmZzZXREZWx0YSwgbVZpZXcuZ2V0VG9wKCkpOworICAgICAgICAgICAgICAgIGludCBib3R0b20gPSBNYXRoLm1heChtVmlldy5nZXRCb3R0b20oKSArIG9mZnNldERlbHRhLCBtVmlldy5nZXRCb3R0b20oKSk7CisKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYuc2V0KG1WaWV3LmdldExlZnQoKSwgIHRvcCwgbVZpZXcuZ2V0UmlnaHQoKSwgYm90dG9tKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHhvZmZzZXQgPSAtaW52YWxpZGF0ZVJlY3RmLmxlZnQ7CisgICAgICAgICAgICAgICAgZmxvYXQgeW9mZnNldCA9IC1pbnZhbGlkYXRlUmVjdGYudG9wOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5vZmZzZXQoeG9mZnNldCwgeW9mZnNldCk7CisgICAgICAgICAgICAgICAgbVZpZXcuZ2V0TWF0cml4KCkubWFwUmVjdChpbnZhbGlkYXRlUmVjdGYpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5vZmZzZXQoLXhvZmZzZXQsIC15b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdC5zZXQoKGludCkgTWF0aC5mbG9vcihpbnZhbGlkYXRlUmVjdGYubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmZsb29yKGludmFsaWRhdGVSZWN0Zi50b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKGludmFsaWRhdGVSZWN0Zi5yaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNlaWwoaW52YWxpZGF0ZVJlY3RmLmJvdHRvbSkpOworCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUdsb2JhbFJlZ2lvbihtVmlldywgaW52YWxpZGF0ZVJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbE9mZnNldChpbnQgbmV3SG9yaXpvbnRhbE9mZnNldCkgeworICAgICAgICAgICAgaW50IG9mZnNldERlbHRhID0gbmV3SG9yaXpvbnRhbE9mZnNldCAtIGhvcml6b250YWxPZmZzZXQ7CisgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0ID0gbmV3SG9yaXpvbnRhbE9mZnNldDsKKworICAgICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVmlldy5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaW50IGxlZnQgPSBNYXRoLm1pbihtVmlldy5nZXRMZWZ0KCkgKyBvZmZzZXREZWx0YSwgbVZpZXcuZ2V0TGVmdCgpKTsKKyAgICAgICAgICAgICAgICBpbnQgcmlnaHQgPSBNYXRoLm1heChtVmlldy5nZXRSaWdodCgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldFJpZ2h0KCkpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5zZXQobGVmdCwgIG1WaWV3LmdldFRvcCgpLCByaWdodCwgbVZpZXcuZ2V0Qm90dG9tKCkpOworCisgICAgICAgICAgICAgICAgZmxvYXQgeG9mZnNldCA9IC1pbnZhbGlkYXRlUmVjdGYubGVmdDsKKyAgICAgICAgICAgICAgICBmbG9hdCB5b2Zmc2V0ID0gLWludmFsaWRhdGVSZWN0Zi50b3A7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3RmLm9mZnNldCh4b2Zmc2V0LCB5b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBtVmlldy5nZXRNYXRyaXgoKS5tYXBSZWN0KGludmFsaWRhdGVSZWN0Zik7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3RmLm9mZnNldCgteG9mZnNldCwgLXlvZmZzZXQpOworCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3Quc2V0KChpbnQpIE1hdGguZmxvb3IoaW52YWxpZGF0ZVJlY3RmLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5mbG9vcihpbnZhbGlkYXRlUmVjdGYudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChpbnZhbGlkYXRlUmVjdGYucmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKGludmFsaWRhdGVSZWN0Zi5ib3R0b20pKTsKKworICAgICAgICAgICAgICAgIGludmFsaWRhdGVHbG9iYWxSZWdpb24obVZpZXcsIGludmFsaWRhdGVSZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhvbG9ncmFwaGljSGVscGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtSG9sb2dyYXBoaWNQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1FcmFzZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUJsdXJQYWludCA9IG5ldyBQYWludCgpOworCisgICAgICAgIEhvbG9ncmFwaGljSGVscGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZVBhaW50cyhjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZVBhaW50cyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGRlbnNpdHkgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKKworICAgICAgICAgICAgbUhvbG9ncmFwaGljUGFpbnQuc2V0Q29sb3IoMHhmZjY2OTlmZik7CisgICAgICAgICAgICBtSG9sb2dyYXBoaWNQYWludC5zZXRGaWx0ZXJCaXRtYXAodHJ1ZSk7CisgICAgICAgICAgICBtSG9sb2dyYXBoaWNQYWludC5zZXRNYXNrRmlsdGVyKFRhYmxlTWFza0ZpbHRlci5DcmVhdGVDbGlwVGFibGUoMCwgMzApKTsKKyAgICAgICAgICAgIG1FcmFzZVBhaW50LnNldFhmZXJtb2RlKG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLkRTVF9PVVQpKTsKKyAgICAgICAgICAgIG1FcmFzZVBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKyAgICAgICAgICAgIG1CbHVyUGFpbnQuc2V0TWFza0ZpbHRlcihuZXcgQmx1ck1hc2tGaWx0ZXIoMipkZW5zaXR5LCBCbHVyTWFza0ZpbHRlci5CbHVyLk5PUk1BTCkpOworICAgICAgICB9CisKKyAgICAgICAgQml0bWFwIGNyZWF0ZU91dGxpbmUoVmlldyB2KSB7CisgICAgICAgICAgICBpZiAodi5nZXRNZWFzdXJlZFdpZHRoKCkgPT0gMCB8fCB2LmdldE1lYXN1cmVkSGVpZ2h0KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh2LmdldE1lYXN1cmVkV2lkdGgoKSwgdi5nZXRNZWFzdXJlZEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhiaXRtYXApOworCisgICAgICAgICAgICBmbG9hdCByb3RhdGlvblggPSB2LmdldFJvdGF0aW9uWCgpOworICAgICAgICAgICAgZmxvYXQgcm90YXRpb24gPSB2LmdldFJvdGF0aW9uKCk7CisgICAgICAgICAgICBmbG9hdCB0cmFuc2xhdGlvblkgPSB2LmdldFRyYW5zbGF0aW9uWSgpOworICAgICAgICAgICAgdi5zZXRSb3RhdGlvblgoMCk7CisgICAgICAgICAgICB2LnNldFJvdGF0aW9uKDApOworICAgICAgICAgICAgdi5zZXRUcmFuc2xhdGlvblkoMCk7CisgICAgICAgICAgICB2LmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIHYuc2V0Um90YXRpb25YKHJvdGF0aW9uWCk7CisgICAgICAgICAgICB2LnNldFJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICAgICAgICAgIHYuc2V0VHJhbnNsYXRpb25ZKHRyYW5zbGF0aW9uWSk7CisKKyAgICAgICAgICAgIGRyYXdPdXRsaW5lKGNhbnZhcywgYml0bWFwKTsKKyAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNYXRyaXggaWQgPSBuZXcgTWF0cml4KCk7CisgICAgICAgIHZvaWQgZHJhd091dGxpbmUoQ2FudmFzIGRlc3QsIEJpdG1hcCBzcmMpIHsKKyAgICAgICAgICAgIGludFtdIHh5ID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgIEJpdG1hcCBtYXNrID0gc3JjLmV4dHJhY3RBbHBoYShtQmx1clBhaW50LCB4eSk7CisgICAgICAgICAgICBDYW52YXMgbWFza0NhbnZhcyA9IG5ldyBDYW52YXMobWFzayk7CisgICAgICAgICAgICBtYXNrQ2FudmFzLmRyYXdCaXRtYXAoc3JjLCAteHlbMF0sIC14eVsxXSwgbUVyYXNlUGFpbnQpOworICAgICAgICAgICAgZGVzdC5kcmF3Q29sb3IoMCwgUG9ydGVyRHVmZi5Nb2RlLkNMRUFSKTsKKyAgICAgICAgICAgIGRlc3Quc2V0TWF0cml4KGlkKTsKKyAgICAgICAgICAgIGRlc3QuZHJhd0JpdG1hcChtYXNrLCB4eVswXSwgeHlbMV0sIG1Ib2xvZ3JhcGhpY1BhaW50KTsKKyAgICAgICAgICAgIG1hc2sucmVjeWNsZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N1Z2dlc3Rpb25zQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N1Z2dlc3Rpb25zQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYmU2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3VnZ2VzdGlvbnNBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw3MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaGFibGVJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlci5PcGVuUmVzb3VyY2VJZFJlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlRleHRBcHBlYXJhbmNlU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CisKKy8qKgorICogUHJvdmlkZXMgdGhlIGNvbnRlbnRzIGZvciB0aGUgc3VnZ2VzdGlvbiBkcm9wLWRvd24gbGlzdC5pbiB7QGxpbmsgU2VhcmNoRGlhbG9nfS4KKyAqCisgKiBAaGlkZQorICovCitjbGFzcyBTdWdnZXN0aW9uc0FkYXB0ZXIgZXh0ZW5kcyBSZXNvdXJjZUN1cnNvckFkYXB0ZXIgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTdWdnZXN0aW9uc0FkYXB0ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRVUVSWV9MSU1JVCA9IDUwOworCisgICAgc3RhdGljIGZpbmFsIGludCBSRUZJTkVfTk9ORSA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBSRUZJTkVfQllfRU5UUlkgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVGSU5FX0FMTCA9IDI7CisKKyAgICBwcml2YXRlIFNlYXJjaE1hbmFnZXIgbVNlYXJjaE1hbmFnZXI7CisgICAgcHJpdmF0ZSBTZWFyY2hWaWV3IG1TZWFyY2hWaWV3OworICAgIHByaXZhdGUgU2VhcmNoYWJsZUluZm8gbVNlYXJjaGFibGU7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Qcm92aWRlckNvbnRleHQ7CisgICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxTdHJpbmcsIERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IG1PdXRzaWRlRHJhd2FibGVzQ2FjaGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DbG9zZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBtUXVlcnlSZWZpbmVtZW50ID0gUkVGSU5FX0JZX0VOVFJZOworCisgICAgLy8gVVJMIGNvbG9yCisgICAgcHJpdmF0ZSBDb2xvclN0YXRlTGlzdCBtVXJsQ29sb3I7CisKKyAgICAvLyBDYWNoZWQgY29sdW1uIGluZGV4ZXMsIHVwZGF0ZWQgd2hlbiB0aGUgY3Vyc29yIGNoYW5nZXMuCisgICAgcHJpdmF0ZSBpbnQgbVRleHQxQ29sOworICAgIHByaXZhdGUgaW50IG1UZXh0MkNvbDsKKyAgICBwcml2YXRlIGludCBtVGV4dDJVcmxDb2w7CisgICAgcHJpdmF0ZSBpbnQgbUljb25OYW1lMUNvbDsKKyAgICBwcml2YXRlIGludCBtSWNvbk5hbWUyQ29sOworICAgIHByaXZhdGUgaW50IG1GbGFnc0NvbDsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IC0xOworCisgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU3RhcnRTcGlubmVyUnVubmFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU3RvcFNwaW5uZXJSdW5uYWJsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSB3ZSBkZWxheSBpbiB0aGUgZmlsdGVyIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgZGVsZXRlIGtleS4KKyAgICAgKiBAc2VlIEZpbHRlciNzZXREZWxheWVyKGFuZHJvaWQud2lkZ2V0LkZpbHRlci5EZWxheWVyKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEVURV9LRVlfUE9TVF9ERUxBWSA9IDUwMEw7CisKKyAgICBwdWJsaWMgU3VnZ2VzdGlvbnNBZGFwdGVyKENvbnRleHQgY29udGV4dCwgU2VhcmNoVmlldyBzZWFyY2hWaWV3LAorICAgICAgICAgICAgU2VhcmNoYWJsZUluZm8gc2VhcmNoYWJsZSwKKyAgICAgICAgICAgIFdlYWtIYXNoTWFwPFN0cmluZywgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gb3V0c2lkZURyYXdhYmxlc0NhY2hlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2VhcmNoX2Ryb3Bkb3duX2l0ZW1faWNvbnNfMmxpbmUsCisgICAgICAgICAgICAgICAgbnVsbCwgICAvLyBubyBpbml0aWFsIGN1cnNvcgorICAgICAgICAgICAgICAgIHRydWUpOyAgLy8gYXV0by1yZXF1ZXJ5CisgICAgICAgIG1TZWFyY2hNYW5hZ2VyID0gKFNlYXJjaE1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5TRUFSQ0hfU0VSVklDRSk7CisgICAgICAgIG1TZWFyY2hWaWV3ID0gc2VhcmNoVmlldzsKKyAgICAgICAgbVNlYXJjaGFibGUgPSBzZWFyY2hhYmxlOworICAgICAgICAvLyBzZXQgdXAgcHJvdmlkZXIgcmVzb3VyY2VzIChnaXZlcyB1cyBpY29ucywgZXRjLikKKyAgICAgICAgQ29udGV4dCBhY3Rpdml0eUNvbnRleHQgPSBtU2VhcmNoYWJsZS5nZXRBY3Rpdml0eUNvbnRleHQobUNvbnRleHQpOworICAgICAgICBtUHJvdmlkZXJDb250ZXh0ID0gbVNlYXJjaGFibGUuZ2V0UHJvdmlkZXJDb250ZXh0KG1Db250ZXh0LCBhY3Rpdml0eUNvbnRleHQpOworCisgICAgICAgIG1PdXRzaWRlRHJhd2FibGVzQ2FjaGUgPSBvdXRzaWRlRHJhd2FibGVzQ2FjaGU7CisgICAgICAgIAorICAgICAgICBtU3RhcnRTcGlubmVyUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIG1TZWFyY2hWaWV3LnNldFdvcmtpbmcodHJ1ZSk7IC8vIFRPRE86CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICBtU3RvcFNwaW5uZXJSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAvLyBtU2VhcmNoVmlldy5zZXRXb3JraW5nKGZhbHNlKTsgLy8gVE9ETzoKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBkZWxheSA1MDBtcyB3aGVuIGRlbGV0aW5nCisgICAgICAgIGdldEZpbHRlcigpLnNldERlbGF5ZXIobmV3IEZpbHRlci5EZWxheWVyKCkgeworCisgICAgICAgICAgICBwcml2YXRlIGludCBtUHJldmlvdXNMZW5ndGggPSAwOworCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRQb3N0aW5nRGVsYXkoQ2hhclNlcXVlbmNlIGNvbnN0cmFpbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uc3RyYWludCA9PSBudWxsKSByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgIGxvbmcgZGVsYXkgPSBjb25zdHJhaW50Lmxlbmd0aCgpIDwgbVByZXZpb3VzTGVuZ3RoID8gREVMRVRFX0tFWV9QT1NUX0RFTEFZIDogMDsKKyAgICAgICAgICAgICAgICBtUHJldmlvdXNMZW5ndGggPSBjb25zdHJhaW50Lmxlbmd0aCgpOworICAgICAgICAgICAgICAgIHJldHVybiBkZWxheTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlcyBxdWVyeSByZWZpbmVtZW50IGZvciBhbGwgc3VnZ2VzdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCBhbiBhZGRpdGlvbmFsIGljb24KKyAgICAgKiB3aWxsIGJlIHNob3duIGZvciBlYWNoIGVudHJ5LiBXaGVuIGNsaWNrZWQsIHRoZSBzdWdnZXN0ZWQgdGV4dCBvbiB0aGF0IGxpbmUgd2lsbCBiZQorICAgICAqIGNvcGllZCB0byB0aGUgcXVlcnkgdGV4dCBmaWVsZC4KKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWZpbmUgd2hpY2ggcXVlcmllcyB0byByZWZpbmUuIFBvc3NpYmxlIHZhbHVlcyBhcmUge0BsaW5rICNSRUZJTkVfTk9ORX0sCisgICAgICoge0BsaW5rICNSRUZJTkVfQllfRU5UUll9LCBhbmQge0BsaW5rICNSRUZJTkVfQUxMfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeVJlZmluZW1lbnQoaW50IHJlZmluZVdoYXQpIHsKKyAgICAgICAgbVF1ZXJ5UmVmaW5lbWVudCA9IHJlZmluZVdoYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBxdWVyeSByZWZpbmVtZW50IHByZWZlcmVuY2UuCisgICAgICogQHJldHVybiB2YWx1ZSBvZiBxdWVyeSByZWZpbmVtZW50IHByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFF1ZXJ5UmVmaW5lbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1RdWVyeVJlZmluZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGRlbiB0byBhbHdheXMgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiwgc2luY2Ugd2UgY2Fubm90IGJlIHN1cmUgdGhhdAorICAgICAqIHN1Z2dlc3Rpb24gc291cmNlcyByZXR1cm4gc3RhYmxlIElEcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIHNlYXJjaCBzdWdnZXN0aW9ucyBwcm92aWRlciB0byBvYnRhaW4gYSBsaXZlIGN1cnNvci4gIFRoaXMgd2lsbCBiZSBjYWxsZWQKKyAgICAgKiBpbiBhIHdvcmtlciB0aHJlYWQsIHNvIGl0J3MgT0sgaWYgdGhlIHF1ZXJ5IGlzIHNsb3cgKGUuZy4gcm91bmQgdHJpcCBmb3Igc3VnZ2VzdGlvbnMpLgorICAgICAqIFRoZSByZXN1bHRzIHdpbGwgYmUgcHJvY2Vzc2VkIGluIHRoZSBVSSB0aHJlYWQgYW5kIGNoYW5nZUN1cnNvcigpIHdpbGwgYmUgY2FsbGVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgcnVuUXVlcnlPbkJhY2tncm91bmRUaHJlYWQoQ2hhclNlcXVlbmNlIGNvbnN0cmFpbnQpIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInJ1blF1ZXJ5T25CYWNrZ3JvdW5kVGhyZWFkKCIgKyBjb25zdHJhaW50ICsgIikiKTsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gKGNvbnN0cmFpbnQgPT0gbnVsbCkgPyAiIiA6IGNvbnN0cmFpbnQudG9TdHJpbmcoKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIGZvciBpbiBhcHAgc2VhcmNoIHdlIHNob3cgdGhlIHByb2dyZXNzIHNwaW5uZXIgdW50aWwgdGhlIGN1cnNvciBpcyByZXR1cm5lZCB3aXRoCisgICAgICAgICAqIHRoZSByZXN1bHRzLgorICAgICAgICAgKi8KKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CisgICAgICAgIC8vbVNlYXJjaFZpZXcuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkucG9zdChtU3RhcnRTcGlubmVyUnVubmFibGUpOyAvLyBUT0RPOgorICAgICAgICB0cnkgeworICAgICAgICAgICAgY3Vyc29yID0gbVNlYXJjaE1hbmFnZXIuZ2V0U3VnZ2VzdGlvbnMobVNlYXJjaGFibGUsIHF1ZXJ5LCBRVUVSWV9MSU1JVCk7CisgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpbGwgd2luZG93IHNvIHRoZSBzcGlubmVyIHN0YXlzIHVwIHVudGlsIHRoZSByZXN1bHRzIGFyZSBjb3BpZWQgb3ZlciBhbmQKKyAgICAgICAgICAgIC8vIGNsb3NlciB0byBiZWluZyByZWFkeQorICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3Vyc29yLmdldENvdW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiU2VhcmNoIHN1Z2dlc3Rpb25zIHF1ZXJ5IHRocmV3IGFuIGV4Y2VwdGlvbi4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBjdXJzb3IgaXMgbnVsbCBvciBhbiBleGNlcHRpb24gd2FzIHRocm93biwgc3RvcCB0aGUgc3Bpbm5lciBhbmQgcmV0dXJuIG51bGwuCisgICAgICAgIC8vIGNoYW5nZUN1cnNvciBkb2Vzbid0IGdldCBjYWxsZWQgaWYgY3Vyc29yIGlzIG51bGwKKyAgICAgICAgLy8gbVNlYXJjaFZpZXcuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkucG9zdChtU3RvcFNwaW5uZXJSdW5uYWJsZSk7IC8vIFRPRE86CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiY2xvc2UoKSIpOworICAgICAgICBjaGFuZ2VDdXJzb3IobnVsbCk7CisgICAgICAgIG1DbG9zZWQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibm90aWZ5RGF0YVNldENoYW5nZWQiKTsKKyAgICAgICAgc3VwZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKworICAgICAgICAvLyBtU2VhcmNoVmlldy5vbkRhdGFTZXRDaGFuZ2VkKCk7IC8vIFRPRE86CisKKyAgICAgICAgdXBkYXRlU3Bpbm5lclN0YXRlKGdldEN1cnNvcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhU2V0SW52YWxpZGF0ZWQoKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJub3RpZnlEYXRhU2V0SW52YWxpZGF0ZWQiKTsKKyAgICAgICAgc3VwZXIubm90aWZ5RGF0YVNldEludmFsaWRhdGVkKCk7CisKKyAgICAgICAgdXBkYXRlU3Bpbm5lclN0YXRlKGdldEN1cnNvcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3Bpbm5lclN0YXRlKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgQnVuZGxlIGV4dHJhcyA9IGN1cnNvciAhPSBudWxsID8gY3Vyc29yLmdldEV4dHJhcygpIDogbnVsbDsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInVwZGF0ZVNwaW5uZXJTdGF0ZSAtIGV4dHJhID0gIgorICAgICAgICAgICAgICAgICsgKGV4dHJhcyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA/IGV4dHJhcy5nZXRCb29sZWFuKFNlYXJjaE1hbmFnZXIuQ1VSU09SX0VYVFJBX0tFWV9JTl9QUk9HUkVTUykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCkpOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBDdXJzb3IgaW5kaWNhdGVzIHRoYXQgdGhlIHF1ZXJ5IGlzIG5vdCBjb21wbGV0ZSBhbmQgc2hvdyB0aGUgc3Bpbm5lcgorICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBleHRyYXMuZ2V0Qm9vbGVhbihTZWFyY2hNYW5hZ2VyLkNVUlNPUl9FWFRSQV9LRVlfSU5fUFJPR1JFU1MpKSB7CisgICAgICAgICAgICAvLyBtU2VhcmNoVmlldy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5wb3N0KG1TdGFydFNwaW5uZXJSdW5uYWJsZSk7IC8vIFRPRE86CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgY3Vyc29yIGlzIG51bGwgb3IgaXMgZG9uZSwgc3RvcCB0aGUgc3Bpbm5lcgorICAgICAgICAvLyBtU2VhcmNoVmlldy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5wb3N0KG1TdG9wU3Bpbm5lclJ1bm5hYmxlKTsgLy8gVE9ETzoKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBjb2x1bW5zLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNoYW5nZUN1cnNvcihDdXJzb3IgYykgeworICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiY2hhbmdlQ3Vyc29yKCIgKyBjICsgIikiKTsKKworICAgICAgICBpZiAobUNsb3NlZCkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlRyaWVkIHRvIGNoYW5nZSBjdXJzb3IgYWZ0ZXIgYWRhcHRlciB3YXMgY2xvc2VkLiIpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmNoYW5nZUN1cnNvcihjKTsKKworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UZXh0MUNvbCA9IGMuZ2V0Q29sdW1uSW5kZXgoU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9URVhUXzEpOworICAgICAgICAgICAgICAgIG1UZXh0MkNvbCA9IGMuZ2V0Q29sdW1uSW5kZXgoU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9URVhUXzIpOworICAgICAgICAgICAgICAgIG1UZXh0MlVybENvbCA9IGMuZ2V0Q29sdW1uSW5kZXgoU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9URVhUXzJfVVJMKTsKKyAgICAgICAgICAgICAgICBtSWNvbk5hbWUxQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lDT05fMSk7CisgICAgICAgICAgICAgICAgbUljb25OYW1lMkNvbCA9IGMuZ2V0Q29sdW1uSW5kZXgoU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JQ09OXzIpOworICAgICAgICAgICAgICAgIG1GbGFnc0NvbCA9IGMuZ2V0Q29sdW1uSW5kZXgoU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9GTEFHUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiZXJyb3IgY2hhbmdpbmcgY3Vyc29yIGFuZCBjYWNoaW5nIGNvbHVtbnMiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRhZ3MgdGhlIHZpZXcgd2l0aCBjYWNoZWQgY2hpbGQgdmlldyBsb29rLXVwcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBuZXdWaWV3KENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvciwgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICBWaWV3IHYgPSBzdXBlci5uZXdWaWV3KGNvbnRleHQsIGN1cnNvciwgcGFyZW50KTsKKyAgICAgICAgdi5zZXRUYWcobmV3IENoaWxkVmlld0NhY2hlKHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FjaGUgb2YgdGhlIGNoaWxkIHZpZXdzIG9mIGRyb3AtZHJvd24gbGlzdCBpdGVtcywgdG8gYXZvaWQgbG9va2luZyB1cCB0aGUgY2hpbGRyZW4KKyAgICAgKiBlYWNoIHRpbWUgdGhlIGNvbnRlbnRzIG9mIGEgbGlzdCBpdGVtIGFyZSBjaGFuZ2VkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIENoaWxkVmlld0NhY2hlIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFRleHRWaWV3IG1UZXh0MTsKKyAgICAgICAgcHVibGljIGZpbmFsIFRleHRWaWV3IG1UZXh0MjsKKyAgICAgICAgcHVibGljIGZpbmFsIEltYWdlVmlldyBtSWNvbjE7CisgICAgICAgIHB1YmxpYyBmaW5hbCBJbWFnZVZpZXcgbUljb24yOworICAgICAgICBwdWJsaWMgZmluYWwgSW1hZ2VWaWV3IG1JY29uUmVmaW5lOworCisgICAgICAgIHB1YmxpYyBDaGlsZFZpZXdDYWNoZShWaWV3IHYpIHsKKyAgICAgICAgICAgIG1UZXh0MSA9IChUZXh0Vmlldykgdi5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICBtVGV4dDIgPSAoVGV4dFZpZXcpIHYuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dDIpOworICAgICAgICAgICAgbUljb24xID0gKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pY29uMSk7CisgICAgICAgICAgICBtSWNvbjIgPSAoSW1hZ2VWaWV3KSB2LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmljb24yKTsKKyAgICAgICAgICAgIG1JY29uUmVmaW5lID0gKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5lZGl0X3F1ZXJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGJpbmRWaWV3KFZpZXcgdmlldywgQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIENoaWxkVmlld0NhY2hlIHZpZXdzID0gKENoaWxkVmlld0NhY2hlKSB2aWV3LmdldFRhZygpOworCisgICAgICAgIGludCBmbGFncyA9IDA7CisgICAgICAgIGlmIChtRmxhZ3NDb2wgIT0gLTEpIHsKKyAgICAgICAgICAgIGZsYWdzID0gY3Vyc29yLmdldEludChtRmxhZ3NDb2wpOworICAgICAgICB9CisgICAgICAgIGlmICh2aWV3cy5tVGV4dDEgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHRleHQxID0gZ2V0U3RyaW5nT3JOdWxsKGN1cnNvciwgbVRleHQxQ29sKTsKKyAgICAgICAgICAgIHNldFZpZXdUZXh0KHZpZXdzLm1UZXh0MSwgdGV4dDEpOworICAgICAgICB9CisgICAgICAgIGlmICh2aWV3cy5tVGV4dDIgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgVEVYVF8yX1VSTAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQyID0gZ2V0U3RyaW5nT3JOdWxsKGN1cnNvciwgbVRleHQyVXJsQ29sKTsKKyAgICAgICAgICAgIGlmICh0ZXh0MiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGV4dDIgPSBmb3JtYXRVcmwodGV4dDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZXh0MiA9IGdldFN0cmluZ09yTnVsbChjdXJzb3IsIG1UZXh0MkNvbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIG5vIHNlY29uZCBsaW5lIG9mIHRleHQgaXMgaW5kaWNhdGVkLCBhbGxvdyB0aGUgZmlyc3QgbGluZSBvZiB0ZXh0CisgICAgICAgICAgICAvLyB0byBiZSB1cCB0byB0d28gbGluZXMgaWYgaXQgd2FudHMgdG8gYmUuCisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodGV4dDIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZpZXdzLm1UZXh0MSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZpZXdzLm1UZXh0MS5zZXRTaW5nbGVMaW5lKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgdmlld3MubVRleHQxLnNldE1heExpbmVzKDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHZpZXdzLm1UZXh0MSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZpZXdzLm1UZXh0MS5zZXRTaW5nbGVMaW5lKHRydWUpOworICAgICAgICAgICAgICAgICAgICB2aWV3cy5tVGV4dDEuc2V0TWF4TGluZXMoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Vmlld1RleHQodmlld3MubVRleHQyLCB0ZXh0Mik7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlld3MubUljb24xICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFZpZXdEcmF3YWJsZSh2aWV3cy5tSWNvbjEsIGdldEljb24xKGN1cnNvcikpOworICAgICAgICB9CisgICAgICAgIGlmICh2aWV3cy5tSWNvbjIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Vmlld0RyYXdhYmxlKHZpZXdzLm1JY29uMiwgZ2V0SWNvbjIoY3Vyc29yKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1RdWVyeVJlZmluZW1lbnQgPT0gUkVGSU5FX0FMTAorICAgICAgICAgICAgICAgIHx8IChtUXVlcnlSZWZpbmVtZW50ID09IFJFRklORV9CWV9FTlRSWQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgU2VhcmNoTWFuYWdlci5GTEFHX1FVRVJZX1JFRklORU1FTlQpICE9IDApKSB7CisgICAgICAgICAgICB2aWV3cy5tSWNvblJlZmluZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB2aWV3cy5tSWNvblJlZmluZS5zZXRUYWcodmlld3MubVRleHQxLmdldFRleHQoKSk7CisgICAgICAgICAgICB2aWV3cy5tSWNvblJlZmluZS5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2aWV3cy5tSWNvblJlZmluZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICBPYmplY3QgdGFnID0gdi5nZXRUYWcoKTsKKyAgICAgICAgaWYgKHRhZyBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgeworICAgICAgICAgICAgbVNlYXJjaFZpZXcub25RdWVyeVJlZmluZSgoQ2hhclNlcXVlbmNlKSB0YWcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZm9ybWF0VXJsKENoYXJTZXF1ZW5jZSB1cmwpIHsKKyAgICAgICAgaWYgKG1VcmxDb2xvciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBMYXppbHkgZ2V0IHRoZSBVUkwgY29sb3IgZnJvbSB0aGUgY3VycmVudCB0aGVtZS4KKyAgICAgICAgICAgIFR5cGVkVmFsdWUgY29sb3JWYWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICBtQ29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoUi5hdHRyLnRleHRDb2xvclNlYXJjaFVybCwgY29sb3JWYWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBtVXJsQ29sb3IgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb2xvclN0YXRlTGlzdChjb2xvclZhbHVlLnJlc291cmNlSWQpOworICAgICAgICB9CisKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHRleHQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKHVybCk7CisgICAgICAgIHRleHQuc2V0U3BhbihuZXcgVGV4dEFwcGVhcmFuY2VTcGFuKG51bGwsIDAsIDAsIG1VcmxDb2xvciwgbnVsbCksCisgICAgICAgICAgICAgICAgMCwgdXJsLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Vmlld1RleHQoVGV4dFZpZXcgdiwgQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgLy8gU2V0IHRoZSB0ZXh0IGV2ZW4gaWYgaXQncyBudWxsLCBzaW5jZSB3ZSBuZWVkIHRvIGNsZWFyIGFueSBwcmV2aW91cyB0ZXh0LgorICAgICAgICB2LnNldFRleHQodGV4dCk7CisKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHRleHQpKSB7CisgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXRJY29uMShDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChtSWNvbk5hbWUxQ29sIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZyhtSWNvbk5hbWUxQ29sKTsKKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBnZXREcmF3YWJsZUZyb21SZXNvdXJjZVZhbHVlKHZhbHVlKTsKKyAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEljb24xKGN1cnNvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXRJY29uMihDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChtSWNvbk5hbWUyQ29sIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZyhtSWNvbk5hbWUyQ29sKTsKKyAgICAgICAgcmV0dXJuIGdldERyYXdhYmxlRnJvbVJlc291cmNlVmFsdWUodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRyYXdhYmxlIGluIGFuIGltYWdlIHZpZXcsIG1ha2VzIHN1cmUgdGhlIHZpZXcgaXMgb25seSB2aXNpYmxlIGlmIHRoZXJlCisgICAgICogaXMgYSBkcmF3YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Vmlld0RyYXdhYmxlKEltYWdlVmlldyB2LCBEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICAvLyBTZXQgdGhlIGljb24gZXZlbiBpZiB0aGUgZHJhd2FibGUgaXMgbnVsbCwgc2luY2Ugd2UgbmVlZCB0byBjbGVhciBhbnkKKyAgICAgICAgLy8gcHJldmlvdXMgaWNvbi4KKyAgICAgICAgdi5zZXRJbWFnZURyYXdhYmxlKGRyYXdhYmxlKTsKKworICAgICAgICBpZiAoZHJhd2FibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGFueSBhbmltYXRlZCBkcmF3YWJsZXMgKGxpa2UgYSAnd29ya2luZycgc3Bpbm5lcikKKyAgICAgICAgICAgIC8vIHRvIGFuaW1hdGUuIFlvdSBoYXZlIHRvIHNldFZpc2libGUgdHJ1ZSBvbiBhbiBBbmltYXRpb25EcmF3YWJsZSB0byBnZXQKKyAgICAgICAgICAgIC8vIGl0IHRvIHN0YXJ0IGFuaW1hdGluZywgYnV0IGl0IG11c3QgZmlyc3QgaGF2ZSBiZWVuIGZhbHNlIG9yIGVsc2UgdGhlCisgICAgICAgICAgICAvLyBjYWxsIHRvIHNldFZpc2libGUgd2lsbCBiZSBpbmVmZmVjdGl2ZS4gV2UgbmVlZCB0byBjbGVhciB1cCB0aGUgc3RvcnkKKyAgICAgICAgICAgIC8vIGFib3V0IGFuaW1hdGVkIGRyYXdhYmxlcyBpbiB0aGUgZnV0dXJlLCBzZWUgaHR0cDovL2IvMTg3ODQzMC4KKyAgICAgICAgICAgIGRyYXdhYmxlLnNldFZpc2libGUoZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGRyYXdhYmxlLnNldFZpc2libGUodHJ1ZSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGV4dCB0byBzaG93IGluIHRoZSBxdWVyeSBmaWVsZCB3aGVuIGEgc3VnZ2VzdGlvbiBpcyBzZWxlY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIEN1cnNvciB0byByZWFkIHRoZSBzdWdnZXN0aW9uIGRhdGEgZnJvbS4gVGhlIEN1cnNvciBzaG91bGQgYWxyZWFkeQorICAgICAqICAgICAgICBiZSBtb3ZlZCB0byB0aGUgc3VnZ2VzdGlvbiB0aGF0IGlzIHRvIGJlIHJlYWQgZnJvbS4KKyAgICAgKiBAcmV0dXJuIFRoZSB0ZXh0IHRvIHNob3csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBxdWVyeSBzaG91bGQgbm90IGJlCisgICAgICogICAgICAgICBjaGFuZ2VkIHdoZW4gc2VsZWN0aW5nIHRoaXMgc3VnZ2VzdGlvbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGNvbnZlcnRUb1N0cmluZyhDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcXVlcnkgPSBnZXRDb2x1bW5TdHJpbmcoY3Vyc29yLCBTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1FVRVJZKTsKKyAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU2VhcmNoYWJsZS5zaG91bGRSZXdyaXRlUXVlcnlGcm9tRGF0YSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IGdldENvbHVtblN0cmluZyhjdXJzb3IsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0RBVEEpOworICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TZWFyY2hhYmxlLnNob3VsZFJld3JpdGVRdWVyeUZyb21UZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0MSA9IGdldENvbHVtblN0cmluZyhjdXJzb3IsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fVEVYVF8xKTsKKyAgICAgICAgICAgIGlmICh0ZXh0MSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBwdXJlbHkgdG8gcHJvdmlkZSBhIGJpdCBvZiBwcm90ZWN0aW9uIGFnYWluc3QKKyAgICAgKiBmbGFreSBjb250ZW50IHByb3ZpZGVycy4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIjZ2V0VmlldyhpbnQsIFZpZXcsIFZpZXdHcm91cCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFZpZXcocG9zaXRpb24sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTZWFyY2ggc3VnZ2VzdGlvbnMgY3Vyc29yIHRocmV3IGV4Y2VwdGlvbi4iLCBlKTsKKyAgICAgICAgICAgIC8vIFB1dCBleGNlcHRpb24gc3RyaW5nIGluIGl0ZW0gdGl0bGUKKyAgICAgICAgICAgIFZpZXcgdiA9IG5ld1ZpZXcobUNvbnRleHQsIG1DdXJzb3IsIHBhcmVudCk7CisgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2hpbGRWaWV3Q2FjaGUgdmlld3MgPSAoQ2hpbGRWaWV3Q2FjaGUpIHYuZ2V0VGFnKCk7CisgICAgICAgICAgICAgICAgVGV4dFZpZXcgdHYgPSB2aWV3cy5tVGV4dDE7CisgICAgICAgICAgICAgICAgdHYuc2V0VGV4dChlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgZHJhd2FibGUgZ2l2ZW4gYSB2YWx1ZSBwcm92aWRlZCBieSBhIHN1Z2dlc3Rpb24gcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBUaGlzIHZhbHVlIGNvdWxkIGJlIGp1c3QgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHJlc291cmNlIGlkCisgICAgICogKGUuZy4sICIyMTMwODM3NTI0IiksIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCB0cnkgdG8gcmV0cmlldmUgYSBkcmF3YWJsZSBmcm9tCisgICAgICogdGhlIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiBJZiB0aGUgdmFsdWUgaXMgbm90IGFuIGludGVnZXIsIGl0IGlzCisgICAgICogdHJlYXRlZCBhcyBhIFVyaSBhbmQgb3BlbmVkIHdpdGgKKyAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5PdXRwdXRTdHJlYW0oYW5kcm9pZC5uZXQuVXJpLCBTdHJpbmcpfS4KKyAgICAgKgorICAgICAqIEFsbCByZXNvdXJjZXMgYW5kIFVSSXMgYXJlIHJlYWQgdXNpbmcgdGhlIHN1Z2dlc3Rpb24gcHJvdmlkZXIncyBjb250ZXh0LgorICAgICAqCisgICAgICogSWYgdGhlIHN0cmluZyBpcyBub3QgZm9ybWF0dGVkIGFzIGV4cGVjdGVkLCBvciBubyBkcmF3YWJsZSBjYW4gYmUgZm91bmQgZm9yCisgICAgICogdGhlIHByb3ZpZGVkIHZhbHVlLCB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJhd2FibGVJZCBhIHN0cmluZyBsaWtlICIyMTMwODM3NTI0IiwKKyAgICAgKiAgICAgICAgImFuZHJvaWQucmVzb3VyY2U6Ly9jb20uYW5kcm9pZC5hbGFybWNsb2NrLzIxMzA4Mzc1MjQiLAorICAgICAqICAgICAgICBvciAiY29udGVudDovL2NvbnRhY3RzL3Bob3Rvcy8yNTMiLgorICAgICAqIEByZXR1cm4gYSBEcmF3YWJsZSwgb3IgbnVsbCBpZiBub25lIGZvdW5kCisgICAgICovCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXREcmF3YWJsZUZyb21SZXNvdXJjZVZhbHVlKFN0cmluZyBkcmF3YWJsZUlkKSB7CisgICAgICAgIGlmIChkcmF3YWJsZUlkID09IG51bGwgfHwgZHJhd2FibGVJZC5sZW5ndGgoKSA9PSAwIHx8ICIwIi5lcXVhbHMoZHJhd2FibGVJZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBGaXJzdCwgc2VlIGlmIGl0J3MganVzdCBhbiBpbnRlZ2VyCisgICAgICAgICAgICBpbnQgcmVzb3VyY2VJZCA9IEludGVnZXIucGFyc2VJbnQoZHJhd2FibGVJZCk7CisgICAgICAgICAgICAvLyBJdCdzIGFuIGludCwgbG9vayBmb3IgaXQgaW4gdGhlIGNhY2hlCisgICAgICAgICAgICBTdHJpbmcgZHJhd2FibGVVcmkgPSBDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UKKyAgICAgICAgICAgICAgICAgICAgKyAiOi8vIiArIG1Qcm92aWRlckNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIvIiArIHJlc291cmNlSWQ7CisgICAgICAgICAgICAvLyBNdXN0IHVzZSBVUkkgYXMgY2FjaGUga2V5LCBzaW5jZSBpbnRzIGFyZSBhcHAtc3BlY2lmaWMKKyAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gY2hlY2tJY29uQ2FjaGUoZHJhd2FibGVVcmkpOworICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3QgY2FjaGVkLCBmaW5kIGl0IGJ5IHJlc291cmNlIElECisgICAgICAgICAgICBkcmF3YWJsZSA9IG1Qcm92aWRlckNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUocmVzb3VyY2VJZCk7CisgICAgICAgICAgICAvLyBTdGljayBpdCBpbiB0aGUgY2FjaGUsIHVzaW5nIHRoZSBVUkkgYXMga2V5CisgICAgICAgICAgICBzdG9yZUluSWNvbkNhY2hlKGRyYXdhYmxlVXJpLCBkcmF3YWJsZSk7CisgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIC8vIEl0J3Mgbm90IGFuIGludGVnZXIsIHVzZSBpdCBhcyBhIFVSSQorICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBjaGVja0ljb25DYWNoZShkcmF3YWJsZUlkKTsKKyAgICAgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZShkcmF3YWJsZUlkKTsKKyAgICAgICAgICAgIGRyYXdhYmxlID0gZ2V0RHJhd2FibGUodXJpKTsKKyAgICAgICAgICAgIHN0b3JlSW5JY29uQ2FjaGUoZHJhd2FibGVJZCwgZHJhd2FibGUpOworICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOworICAgICAgICB9IGNhdGNoIChSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAvLyBJdCB3YXMgYW4gaW50ZWdlciwgYnV0IGl0IGNvdWxkbid0IGJlIGZvdW5kLCBiYWlsIG91dAorICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkljb24gcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgZHJhd2FibGVJZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBkcmF3YWJsZSBieSBVUkksIHdpdGhvdXQgdXNpbmcgdGhlIGNhY2hlLgorICAgICAqCisgICAgICogQHJldHVybiBBIGRyYXdhYmxlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGRyYXdhYmxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXREcmF3YWJsZShVcmkgdXJpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOworICAgICAgICAgICAgaWYgKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRS5lcXVhbHMoc2NoZW1lKSkgeworICAgICAgICAgICAgICAgIC8vIExvYWQgZHJhd2FibGVzIHRocm91Z2ggUmVzb3VyY2VzLCB0byBnZXQgdGhlIHNvdXJjZSBkZW5zaXR5IGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgT3BlblJlc291cmNlSWRSZXN1bHQgciA9CisgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlckNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkuZ2V0UmVzb3VyY2VJZCh1cmkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnIuZ2V0RHJhd2FibGUoci5pZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIlJlc291cmNlIGRvZXMgbm90IGV4aXN0OiAiICsgdXJpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIExldCB0aGUgQ29udGVudFJlc29sdmVyIGhhbmRsZSBjb250ZW50IGFuZCBmaWxlIFVSSXMuCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbVByb3ZpZGVyQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0odXJpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRmFpbGVkIHRvIG9wZW4gIiArIHVyaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEcmF3YWJsZS5jcmVhdGVGcm9tU3RyZWFtKHN0cmVhbSwgbnVsbCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yIGNsb3NpbmcgaWNvbiBzdHJlYW0gZm9yICIgKyB1cmksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJY29uIG5vdCBmb3VuZDogIiArIHVyaSArICIsICIgKyBmbmZlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRHJhd2FibGUgY2hlY2tJY29uQ2FjaGUoU3RyaW5nIHJlc291cmNlVXJpKSB7CisgICAgICAgIERyYXdhYmxlLkNvbnN0YW50U3RhdGUgY2FjaGVkID0gbU91dHNpZGVEcmF3YWJsZXNDYWNoZS5nZXQocmVzb3VyY2VVcmkpOworICAgICAgICBpZiAoY2FjaGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJGb3VuZCBpY29uIGluIGNhY2hlOiAiICsgcmVzb3VyY2VVcmkpOworICAgICAgICByZXR1cm4gY2FjaGVkLm5ld0RyYXdhYmxlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlSW5JY29uQ2FjaGUoU3RyaW5nIHJlc291cmNlVXJpLCBEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbU91dHNpZGVEcmF3YWJsZXNDYWNoZS5wdXQocmVzb3VyY2VVcmksIGRyYXdhYmxlLmdldENvbnN0YW50U3RhdGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsZWZ0LWhhbmQgc2lkZSBpY29uIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY3VycmVudCBzdWdnZXN0aW9uCisgICAgICogaWYgdGhlIHN1Z2dlc3Rpb24gY29udGFpbnMgYW4gaWNvbiBjb2x1bW4gYnV0IG5vIGljb24gb3IgYSBicm9rZW4gaWNvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJzb3IgQSBjdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgY3VycmVudCBzdWdnZXN0aW9uLgorICAgICAqIEByZXR1cm4gQSBub24tbnVsbCBkcmF3YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldERlZmF1bHRJY29uMShDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIC8vIENoZWNrIHRoZSBjb21wb25lbnQgdGhhdCBnYXZlIHVzIHRoZSBzdWdnZXN0aW9uCisgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gZ2V0QWN0aXZpdHlJY29uV2l0aENhY2hlKG1TZWFyY2hhYmxlLmdldFNlYXJjaEFjdGl2aXR5KCkpOworICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGEgZGVmYXVsdCBpY29uCisgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldERlZmF1bHRBY3Rpdml0eUljb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhY3Rpdml0eSBvciBhcHBsaWNhdGlvbiBpY29uIGZvciBhbiBhY3Rpdml0eS4KKyAgICAgKiBVc2VzIHRoZSBsb2NhbCBpY29uIGNhY2hlIGZvciBmYXN0IHJlcGVhdGVkIGxvb2t1cHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50IE5hbWUgb2YgYW4gYWN0aXZpdHkuCisgICAgICogQHJldHVybiBBIGRyYXdhYmxlLCBvciB7QGNvZGUgbnVsbH0gaWYgbmVpdGhlciB0aGUgYWN0aXZpdHkgbm9yIHRoZSBhcHBsaWNhdGlvbgorICAgICAqICAgICAgICAgaGFzIGFuIGljb24gc2V0LgorICAgICAqLworICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0QWN0aXZpdHlJY29uV2l0aENhY2hlKENvbXBvbmVudE5hbWUgY29tcG9uZW50KSB7CisgICAgICAgIC8vIEZpcnN0IGNoZWNrIHRoZSBpY29uIGNhY2hlCisgICAgICAgIFN0cmluZyBjb21wb25lbnRJY29uS2V5ID0gY29tcG9uZW50LmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisgICAgICAgIC8vIFVzaW5nIGNvbnRhaW5zS2V5KCkgc2luY2Ugd2UgYWxzbyBzdG9yZSBudWxsIHZhbHVlcy4KKyAgICAgICAgaWYgKG1PdXRzaWRlRHJhd2FibGVzQ2FjaGUuY29udGFpbnNLZXkoY29tcG9uZW50SWNvbktleSkpIHsKKyAgICAgICAgICAgIERyYXdhYmxlLkNvbnN0YW50U3RhdGUgY2FjaGVkID0gbU91dHNpZGVEcmF3YWJsZXNDYWNoZS5nZXQoY29tcG9uZW50SWNvbktleSk7CisgICAgICAgICAgICByZXR1cm4gY2FjaGVkID09IG51bGwgPyBudWxsIDogY2FjaGVkLm5ld0RyYXdhYmxlKG1Qcm92aWRlckNvbnRleHQuZ2V0UmVzb3VyY2VzKCkpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZW4gdHJ5IHRoZSBhY3Rpdml0eSBvciBhcHBsaWNhdGlvbiBpY29uCisgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gZ2V0QWN0aXZpdHlJY29uKGNvbXBvbmVudCk7CisgICAgICAgIC8vIFN0aWNrIGl0IGluIHRoZSBjYWNoZSBzbyB3ZSBkb24ndCBkbyB0aGlzIGxvb2t1cCBhZ2Fpbi4KKyAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSB0b0NhY2hlID0gZHJhd2FibGUgPT0gbnVsbCA/IG51bGwgOiBkcmF3YWJsZS5nZXRDb25zdGFudFN0YXRlKCk7CisgICAgICAgIG1PdXRzaWRlRHJhd2FibGVzQ2FjaGUucHV0KGNvbXBvbmVudEljb25LZXksIHRvQ2FjaGUpOworICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYWN0aXZpdHkgb3IgYXBwbGljYXRpb24gaWNvbiBmb3IgYW4gYWN0aXZpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50IE5hbWUgb2YgYW4gYWN0aXZpdHkuCisgICAgICogQHJldHVybiBBIGRyYXdhYmxlLCBvciB7QGNvZGUgbnVsbH0gaWYgbmVpdGhlciB0aGUgYWNpdGl2eSBvciB0aGUgYXBwbGljYXRpb24KKyAgICAgKiAgICAgICAgIGhhdmUgYW4gaWNvbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXRBY3Rpdml0eUljb24oQ29tcG9uZW50TmFtZSBjb21wb25lbnQpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBBY3Rpdml0eUluZm8gYWN0aXZpdHlJbmZvOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWN0aXZpdHlJbmZvID0gcG0uZ2V0QWN0aXZpdHlJbmZvKGNvbXBvbmVudCwgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgZXgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpbnQgaWNvbklkID0gYWN0aXZpdHlJbmZvLmdldEljb25SZXNvdXJjZSgpOworICAgICAgICBpZiAoaWNvbklkID09IDApIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmcgcGtnID0gY29tcG9uZW50LmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gcG0uZ2V0RHJhd2FibGUocGtnLCBpY29uSWQsIGFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8pOworICAgICAgICBpZiAoZHJhd2FibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkludmFsaWQgaWNvbiByZXNvdXJjZSAiICsgaWNvbklkICsgIiBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIGNvbXBvbmVudC5mbGF0dGVuVG9TaG9ydFN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHN0cmluZyBjb2x1bW4gYnkgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJzb3IgQ3Vyc29yIHRvIHJlYWQgdGhlIHZhbHVlIGZyb20uCisgICAgICogQHBhcmFtIGNvbHVtbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byByZWFkLgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4sIG9yIDxjb2RlPm51bGw8L251bGw+CisgICAgICogICAgICAgICBpZiB0aGUgY3Vyc29yIGRvZXMgbm90IGNvbnRhaW4gdGhlIGdpdmVuIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2x1bW5TdHJpbmcoQ3Vyc29yIGN1cnNvciwgU3RyaW5nIGNvbHVtbk5hbWUpIHsKKyAgICAgICAgaW50IGNvbCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW5OYW1lKTsKKyAgICAgICAgcmV0dXJuIGdldFN0cmluZ09yTnVsbChjdXJzb3IsIGNvbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ09yTnVsbChDdXJzb3IgY3Vyc29yLCBpbnQgY29sKSB7CisgICAgICAgIGlmIChjb2wgPT0gTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKGNvbCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBlcnJvciByZXRyaWV2aW5nIHZhbGlkIGNvbHVtbiBmcm9tIGN1cnNvciwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRpZCB0aGUgcmVtb3RlIHByb2Nlc3MgZGllPyIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCmluZGV4IGFiMGFhNDUuLjNmZjIzNWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCkBAIC0yMSw4ICsyMSw5IEBACiAKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CkBAIC0zNiw2ICszNyw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLkV4dHJhY3RFZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKQEAgLTQ0LDcgKzQ2LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuRHluYW1pY0xheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkdldENoYXJzOwpAQCAtODQsMTAgKzg1LDEzIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkZsb2F0TWF0aDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSGFwdGljRmVlZGJhY2tDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMTkyLDcgKzE5Niw5IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlRleHRWaWV3IjsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19FWFRSQUNUID0gZmFsc2U7CiAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBSSU9SSVRZID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUklPUklUWSA9IDEwMDsKKworICAgIHByaXZhdGUgaW50IG1DdXJyZW50QWxwaGEgPSAyNTU7ICAgIAogCiAgICAgZmluYWwgaW50W10gbVRlbXBDb29yZHMgPSBuZXcgaW50WzJdOwogICAgIFJlY3QgbVRlbXBSZWN0OwpAQCAtMjgyMCw2ICsyODI2LDE0IEBACiAgICAgICAgICAgICBjLmRyYXdUZXh0KG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0LCB4LCB5LCBwKTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obUNoYXJzLCBzdGFydCArIG1TdGFydCwgY291bnQsIGNvbnRleHRTdGFydCArIG1TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dENvdW50LCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgZmxvYXQgbWVhc3VyZVRleHQoaW50IHN0YXJ0LCBpbnQgZW5kLCBQYWludCBwKSB7CiAgICAgICAgICAgICByZXR1cm4gcC5tZWFzdXJlVGV4dChtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBlbmQgLSBzdGFydCk7CiAgICAgICAgIH0KQEAgLTI4MjcsNiArMjg0MSwyMyBAQAogICAgICAgICBwdWJsaWMgaW50IGdldFRleHRXaWR0aHMoaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdFtdIHdpZHRocywgUGFpbnQgcCkgewogICAgICAgICAgICAgcmV0dXJuIHAuZ2V0VGV4dFdpZHRocyhtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBlbmQgLSBzdGFydCwgd2lkdGhzKTsKICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4LAorICAgICAgICAgICAgICAgIFBhaW50IHApIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0UnVuQWR2YW5jZXMobUNoYXJzLCBzdGFydCArIG1TdGFydCwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCArIG1TdGFydCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsCisgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCwgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0UnVuQ3Vyc29yKG1DaGFycywgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q291bnQsIGZsYWdzLCBvZmZzZXQgKyBtU3RhcnQsIGN1cnNvck9wdCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTM3MzksNyArMzc3MCw3IEBACiAgICAgICAgIC8vICAgYWxsb3cgdG8gdGVzdCBmb3IgaGFzU2VsZWN0aW9uIGluIG9uRm9jdXNDaGFuZ2VkLCB3aGljaCB3b3VsZCB0cmlnZ2VyIGEKICAgICAgICAgLy8gICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlIGhlcmUuIFRPRE8KICAgICAgICAgaWYgKHNlbGVjdGlvbkNvbnRyb2xsZXIgIT0gbnVsbCAmJiBoYXNTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgc3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgIH0KIAogICAgICAgICBtUHJlRHJhd1N0YXRlID0gUFJFRFJBV19ET05FOwpAQCAtMzg3OSw2ICszOTEwLDIyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb25TZXRBbHBoYShpbnQgYWxwaGEpIHsKKyAgICAgICAgaWYgKG1Nb3ZlbWVudCA9PSBudWxsICYmIGdldEJhY2tncm91bmQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ3VycmVudEFscGhhID0gYWxwaGE7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZXMgZHIgPSBtRHJhd2FibGVzOworICAgICAgICAgICAgaWYgKGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlTGVmdCAhPSBudWxsKSBkci5tRHJhd2FibGVMZWZ0Lm11dGF0ZSgpLnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlVG9wICE9IG51bGwpIGRyLm1EcmF3YWJsZVRvcC5tdXRhdGUoKS5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZVJpZ2h0ICE9IG51bGwpIGRyLm1EcmF3YWJsZVJpZ2h0Lm11dGF0ZSgpLnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlQm90dG9tICE9IG51bGwpIGRyLm1EcmF3YWJsZUJvdHRvbS5tdXRhdGUoKS5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgcmVzdGFydE1hcnF1ZWVJZk5lZWRlZCgpOwogCkBAIC0zOTc1LDYgKzQwMjIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbVRleHRQYWludC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgIG1UZXh0UGFpbnQuc2V0QWxwaGEobUN1cnJlbnRBbHBoYSk7CiAgICAgICAgIG1UZXh0UGFpbnQuZHJhd2FibGVTdGF0ZSA9IGdldERyYXdhYmxlU3RhdGUoKTsKIAogICAgICAgICBjYW52YXMuc2F2ZSgpOwpAQCAtNDMyMSw2ICs0MzY5LDcgQEAKIAogICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgICAgICBtRW50ZXJLZXlJc0Rvd24gPSB0cnVlOwogICAgICAgICAgICAgICAgIC8vIElmIEFMVCBtb2RpZmllciBpcyBoZWxkLCB0aGVuIHdlIGFsd2F5cyBpbnNlcnQgYQogICAgICAgICAgICAgICAgIC8vIG5ld2xpbmUgY2hhcmFjdGVyLgogICAgICAgICAgICAgICAgIGlmICgoZXZlbnQuZ2V0TWV0YVN0YXRlKCkmS2V5RXZlbnQuTUVUQV9BTFRfT04pID09IDApIHsKQEAgLTQzNTMsNiArNDQwMiw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgbURQYWRDZW50ZXJJc0Rvd24gPSB0cnVlOwogICAgICAgICAgICAgICAgIGlmIChzaG91bGRBZHZhbmNlRm9jdXNPbkVudGVyKCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDM2MCw4ICs0NDEwLDggQEAKIAogICAgICAgICAgICAgICAgIC8vIEhhcyB0byBiZSBkb25lIG9uIGtleSBkb3duIChhbmQgbm90IG9uIGtleSB1cCkgdG8gY29ycmVjdGx5IGJlIGludGVyY2VwdGVkLgogICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0JBQ0s6Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTQ0NDcsNiArNDQ5Nyw3IEBACiAKICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CiAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgbURQYWRDZW50ZXJJc0Rvd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIGEgY2xpY2sgbGlzdGVuZXIsIGp1c3QgY2FsbCB0aHJvdWdoIHRvCiAgICAgICAgICAgICAgICAgICogc3VwZXIsIHdoaWNoIHdpbGwgaW52b2tlIGl0LgpAQCAtNDQ2Nyw2ICs0NTE4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25LZXlVcChrZXlDb2RlLCBldmVudCk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6CisgICAgICAgICAgICAgICAgbUVudGVyS2V5SXNEb3duID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dENvbnRlbnRUeXBlICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1JbnB1dENvbnRlbnRUeXBlLm9uRWRpdG9yQWN0aW9uTGlzdGVuZXIgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUlucHV0Q29udGVudFR5cGUuZW50ZXJEb3duKSB7CkBAIC00ODU4LDcgKzQ5MTAsNyBAQAogICAgICAgICAgICAgICAgIG1ha2VCbGluaygpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGNoZWNrRm9yUmVzaXplKCk7CiAgICAgfQogICAgIApAQCAtNDk0OSw2ICs1MDAxLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBHcmF2aXR5LlJJR0hUOgorICAgICAgICAgICAgICAgIC8vIE5vdGUsIExheW91dCByZXNvbHZlcyBBTElHTl9PUFBPU0lURSB0byBsZWZ0IG9yCisgICAgICAgICAgICAgICAgLy8gcmlnaHQgYmFzZWQgb24gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24uCiAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9PUFBPU0lURTsKICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTExMyw2ICs1MTY3LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY29tcHJlc3NUZXh0KGZsb2F0IHdpZHRoKSB7CisgICAgICAgIGlmIChpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAKICAgICAgICAgLy8gT25seSBjb21wcmVzcyB0aGUgdGV4dCBpZiBpdCBoYXNuJ3QgYmVlbiBjb21wcmVzc2VkIGJ5IHRoZSBwcmV2aW91cyBwYXNzCiAgICAgICAgIGlmICh3aWR0aCA+IDAuMGYgJiYgbUxheW91dCAhPSBudWxsICYmIGdldExpbmVDb3VudCgpID09IDEgJiYgIW1Vc2VyU2V0VGV4dFNjYWxlWCAmJgogICAgICAgICAgICAgICAgIG1UZXh0UGFpbnQuZ2V0VGV4dFNjYWxlWCgpID09IDEuMGYpIHsKQEAgLTU3NzMsMTEgKzU4MjksMTUgQEAKICAgICAgICAgZmluYWwgaW50IGxlZnRDaGFyID0gbUxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIGhzKTsKICAgICAgICAgZmluYWwgaW50IHJpZ2h0Q2hhciA9IG1MYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lLCBoc3BhY2UraHMpOwogICAgICAgICAKKyAgICAgICAgLy8gbGluZSBtaWdodCBjb250YWluIGJpZGlyZWN0aW9uYWwgdGV4dAorICAgICAgICBmaW5hbCBpbnQgbG93Q2hhciA9IGxlZnRDaGFyIDwgcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisgICAgICAgIGZpbmFsIGludCBoaWdoQ2hhciA9IGxlZnRDaGFyID4gcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisKICAgICAgICAgaW50IG5ld1N0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgIGlmIChuZXdTdGFydCA8IGxlZnRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IGxlZnRDaGFyOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gcmlnaHRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IHJpZ2h0Q2hhcjsKKyAgICAgICAgaWYgKG5ld1N0YXJ0IDwgbG93Q2hhcikgeworICAgICAgICAgICAgbmV3U3RhcnQgPSBsb3dDaGFyOworICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gaGlnaENoYXIpIHsKKyAgICAgICAgICAgIG5ld1N0YXJ0ID0gaGlnaENoYXI7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChuZXdTdGFydCAhPSBzdGFydCkgewpAQCAtNjYwOCwxMSArNjY2OCwxNCBAQAogCiAgICAgICAgICAgICBoaWRlSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyKCk7CiAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEV4dHJhY3RFZGl0VGV4dCkgewotICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0ZVRleHRTZWxlY3Rpb25Nb2RlIHdvdWxkIHJlbW92ZSBzZWxlY3Rpb24sIHdoaWNoIHdlIHdhbnQgdG8ga2VlcCB3aGVuCisgICAgICAgICAgICAgICAgLy8gdGVybWluYXRlVGV4dFNlbGVjdGlvbk1vZGUgcmVtb3ZlcyBzZWxlY3Rpb24sIHdoaWNoIHdlIHdhbnQgdG8ga2VlcCB3aGVuCiAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdEVkaXRUZXh0IGdvZXMgb3V0IG9mIGZvY3VzLgotICAgICAgICAgICAgICAgIG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGVTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgc2VsU3RhcnQsIHNlbEVuZCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRlcm1pbmF0ZVRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgdGVybWluYXRlU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtTGFzdFRvdWNoT2Zmc2V0ID0gLTE7CkBAIC02NzE2LDcgKzY3NzksNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gVGFwcGluZyBvdXRzaWRlIHN0b3BzIHNlbGVjdGlvbiBtb2RlLCBpZiBhbnkKLSAgICAgICAgICAgICAgICBzdG9wVGV4dFNlbGVjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogCiAgICAgICAgICAgICAgICAgaWYgKG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyLnNob3coKTsKQEAgLTY3MjksMTMgKzY3OTIsMTMgQEAKIAogICAgIGNsYXNzIENvbW1pdFNlbGVjdGlvblJlY2VpdmVyIGV4dGVuZHMgUmVzdWx0UmVjZWl2ZXIgewogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUHJldlN0YXJ0LCBtUHJldkVuZDsKLSAgICAgICAgCisKICAgICAgICAgcHVibGljIENvbW1pdFNlbGVjdGlvblJlY2VpdmVyKGludCBwcmV2U3RhcnQsIGludCBwcmV2RW5kKSB7CiAgICAgICAgICAgICBzdXBlcihnZXRIYW5kbGVyKCkpOwogICAgICAgICAgICAgbVByZXZTdGFydCA9IHByZXZTdGFydDsKICAgICAgICAgICAgIG1QcmV2RW5kID0gcHJldkVuZDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25SZWNlaXZlUmVzdWx0KGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0RGF0YSkgewogICAgICAgICAgICAgLy8gSWYgdGhpcyB0YXAgd2FzIGFjdHVhbGx5IHVzZWQgdG8gc2hvdyB0aGUgSU1NLCBsZWF2ZSBjdXJzb3Igb3Igc2VsZWN0aW9uIHVuY2hhbmdlZApAQCAtNjc0NywxMiArNjgxMCwxMiBAQAogICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSltVGV4dCwgc3RhcnQsIGVuZCk7CiAKICAgICAgICAgICAgICAgICBpZiAoaGFzU2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICBzdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbk1hc2tlZCgpOwpAQCAtNjg1NCw3ICs2OTE3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFN0b3Agc2VsZWN0aW9uIG1vZGUgaWYgdGhlIGNvbnRyb2xsZXIgYmVjb21lcyB1bmF2YWlsYWJsZS4KLSAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPSBudWxsOwogICAgICAgICB9CiAgICAgfQpAQCAtNjk5NCw4ICs3MDU3LDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIGlmIChtTGF5b3V0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbUxheW91dC5nZXRXaWR0aCgpOworICAgICAgICBpZiAobUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVNpbmdsZUxpbmUgJiYgKG1HcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgPT0gR3Jhdml0eS5MRUZUID8KKyAgICAgICAgICAgICAgICAgICAgKGludCkgbUxheW91dC5nZXRMaW5lV2lkdGgoMCkgOiBtTGF5b3V0LmdldFdpZHRoKCk7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc3VwZXIuY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpOwogICAgIH0KQEAgLTcxNDIsNyArNzIwNyw3IEBACiAgICAgICAgICAgICAgICAgZ2V0U2VsZWN0aW9uU3RhcnQoKSA+PSAwICYmCiAgICAgICAgICAgICAgICAgZ2V0U2VsZWN0aW9uRW5kKCkgPj0gMCAmJgogICAgICAgICAgICAgICAgICgoQ2xpcGJvYXJkTWFuYWdlcilnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKSkuCi0gICAgICAgICAgICAgICAgaGFzVGV4dCgpKTsKKyAgICAgICAgICAgICAgICBoYXNQcmltYXJ5Q2xpcCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTcyMzQsNyArNzI5OSw3IEBACiAgICAgICAgIC8vIFR3byBpbnRzIHBhY2tlZCBpbiBhIGxvbmcKICAgICAgICAgcmV0dXJuIHBhY2tSYW5nZUluTG9uZyhzdGFydCwgZW5kKTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHBhY2tSYW5nZUluTG9uZyhpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgcmV0dXJuICgoKGxvbmcpIHN0YXJ0KSA8PCAzMikgfCBlbmQ7CiAgICAgfQpAQCAtNzI1NCwxNCArNzMxOSwyMSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgaW50IG1pbk9mZnNldCwgbWF4T2Zmc2V0OworCisgICAgICAgIGlmIChtRFBhZENlbnRlcklzRG93biB8fCBtRW50ZXJLZXlJc0Rvd24pIHsKKyAgICAgICAgICAgIG1pbk9mZnNldCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICBtYXhPZmZzZXQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBpcyBub3QgbnVsbCBhdCB0aGF0IHBvaW50CisgICAgICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0KKyAgICAgICAgICAgICAgICAoKFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcikgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcik7CisgICAgICAgICAgICBtaW5PZmZzZXQgPSBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZ2V0TWluVG91Y2hPZmZzZXQoKTsKKyAgICAgICAgICAgIG1heE9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNYXhUb3VjaE9mZnNldCgpOworICAgICAgICB9CisKICAgICAgICAgaW50IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQ7CiAKLSAgICAgICAgLy8gc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyIGlzIG5vdCBudWxsIGF0IHRoYXQgcG9pbnQKLSAgICAgICAgU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyIHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciA9Ci0gICAgICAgICAgICAoKFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcikgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcik7Ci0gICAgICAgIGludCBtaW5PZmZzZXQgPSBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZ2V0TWluVG91Y2hPZmZzZXQoKTsKLSAgICAgICAgaW50IG1heE9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNYXhUb3VjaE9mZnNldCgpOwotICAgICAgICAKICAgICAgICAgbG9uZyB3b3JkTGltaXRzID0gZ2V0V29yZExpbWl0c0F0KG1pbk9mZnNldCk7CiAgICAgICAgIGlmICh3b3JkTGltaXRzID49IDApIHsKICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gZXh0cmFjdFJhbmdlU3RhcnRGcm9tTG9uZyh3b3JkTGltaXRzKTsKQEAgLTcyNzgsMjIgKzczNTAsNyBAQAogCiAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRXb3JkRm9yRGljdGlvbmFyeSgpIHsKLSAgICAgICAgaWYgKG1MYXN0VG91Y2hPZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogCi0gICAgICAgIGxvbmcgd29yZExpbWl0cyA9IGdldFdvcmRMaW1pdHNBdChtTGFzdFRvdWNoT2Zmc2V0KTsKLSAgICAgICAgaWYgKHdvcmRMaW1pdHMgPj0gMCkgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gZXh0cmFjdFJhbmdlU3RhcnRGcm9tTG9uZyh3b3JkTGltaXRzKTsKLSAgICAgICAgICAgIGludCBlbmQgPSBleHRyYWN0UmFuZ2VFbmRGcm9tTG9uZyh3b3JkTGltaXRzKTsKLSAgICAgICAgICAgIHJldHVybiBtVHJhbnNmb3JtZWQuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoUG9wdWxhdGVBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmICghaXNTaG93bigpKSB7CkBAIC03MzM1LDkzICs3MzkyLDM0IEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSk7CiAgICAgICAgIGJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKIAotICAgICAgICBpZiAobUlzSW5UZXh0U2VsZWN0aW9uTW9kZSkgewotICAgICAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2FuQ3V0KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DVVQsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmN1dCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgneCcpOworICAgICAgICBNZW51SGFuZGxlciBoYW5kbGVyID0gbmV3IE1lbnVIYW5kbGVyKCk7CisKKyAgICAgICAgaWYgKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgaW50IHNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOworICAgICAgICAgICAgaW50IG1heCA9IE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpOworCisgICAgICAgICAgICBVUkxTcGFuW10gdXJscyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKG1pbiwgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWV9VUkwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7CisKICAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW5Db3B5KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb3B5KS4KLSAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdjJyk7Ci0gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FuUGFzdGUoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1BBU1RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wYXN0ZSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgndicpOwotICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoIWlzRm9jdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNhYmxlKCkgJiYgbUlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkNvcHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUuc2V0SGVhZGVyVGl0bGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZWRpdFRleHRNZW51VGl0bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9yZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKLQotICAgICAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NUQVJUX1NFTEVDVElOR19URVhULCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0KS4KLSAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYScpOwotICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwotCi0gICAgICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOwotICAgICAgICAgICAgICAgIGludCBtYXggPSBNYXRoLm1heChzZWxTdGFydCwgc2VsRW5kKTsKLQotICAgICAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZX1VSTCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYW5QYXN0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfUEFTVEUsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBhc3RlKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCd2Jyk7Ci0gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNJbnB1dE1ldGhvZFRhcmdldCgpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMSwgSURfU1dJVENIX0lOUFVUX01FVEhPRCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuaW5wdXRNZXRob2QpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgd29yZCA9IGdldFdvcmRGb3JEaWN0aW9uYXJ5KCk7Ci0gICAgICAgICAgICBpZiAod29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMSwgSURfQUREX1RPX0RJQ1RJT05BUlksIDAsCi0gICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmFkZFRvRGljdGlvbmFyeSwgd29yZCkpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotCi0gICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBjb250ZXh0IG1lbnUgaXMgbm90IGVtcHR5LCB3aGljaCB3aWxsIHByZXZlbnQgdGhlIHNlbGVjdGlvbiBtb2RlIGZyb20gc3RhcnRpbmcuCisgICAgICAgIC8vIEFkZCBhIGVudHJ5IHRvIHN0YXJ0IGl0IGluIHRoZSBjb250ZXh0IG1lbnUuCisgICAgICAgIC8vIFRPRE8gRG9lcyBub3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgc3ViY2xhc3MgZG9lcyBub3QgY2FsbCBzdXBlci50aGlzTWV0aG9kIG9yCisgICAgICAgIC8vIHBvcHVsYXRlcyB0aGUgbWVudSBBRlRFUiB0aGlzIGNhbGwuCisgICAgICAgIGlmIChtZW51LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVElPTl9NT0RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0TW9kZSkuCisgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKKyAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhZGRlZCkgewpAQCAtNzQzOCwxNSArNzQzNiwxNCBAQAogICAgICAgICByZXR1cm4gaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpOwogICAgIH0KICAgICAKLSAgICAvLyBDb250ZXh0IG1lbnUgZW50cmllcworICAgIC8vIFNlbGVjdGlvbiBjb250ZXh0IG1vZGUKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUX0FMTCA9IGFuZHJvaWQuUi5pZC5zZWxlY3RBbGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NUQVJUX1NFTEVDVElOR19URVhUID0gYW5kcm9pZC5SLmlkLnN0YXJ0U2VsZWN0aW5nVGV4dDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VUID0gYW5kcm9pZC5SLmlkLmN1dDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09QWSA9IGFuZHJvaWQuUi5pZC5jb3B5OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9QQVNURSA9IGFuZHJvaWQuUi5pZC5wYXN0ZTsKKyAgICAvLyBDb250ZXh0IG1lbnUgZW50cmllcwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZX1VSTCA9IGFuZHJvaWQuUi5pZC5jb3B5VXJsOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9TV0lUQ0hfSU5QVVRfTUVUSE9EID0gYW5kcm9pZC5SLmlkLnN3aXRjaElucHV0TWV0aG9kOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9BRERfVE9fRElDVElPTkFSWSA9IGFuZHJvaWQuUi5pZC5hZGRUb0RpY3Rpb25hcnk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NFTEVDVElPTl9NT0RFID0gYW5kcm9pZC5SLmlkLnNlbGVjdFRleHRNb2RlOwogCiAgICAgcHJpdmF0ZSBjbGFzcyBNZW51SGFuZGxlciBpbXBsZW1lbnRzIE1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIHsKICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKQEAgLTc0NTYsMTEgKzc0NTMsNyBAQAogCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gYSBjb250ZXh0IG1lbnUgb3B0aW9uIGZvciB0aGUgdGV4dCB2aWV3IGlzIHNlbGVjdGVkLiAgQ3VycmVudGx5Ci0gICAgICogdGhpcyB3aWxsIGJlIG9uZSBvZjoge0BsaW5rIGFuZHJvaWQuUi5pZCNzZWxlY3RBbGx9LAotICAgICAqIHtAbGluayBhbmRyb2lkLlIuaWQjc3RhcnRTZWxlY3RpbmdUZXh0fSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmlkI2N1dH0sIHtAbGluayBhbmRyb2lkLlIuaWQjY29weX0sCi0gICAgICoge0BsaW5rIGFuZHJvaWQuUi5pZCNwYXN0ZX0sIHtAbGluayBhbmRyb2lkLlIuaWQjY29weVVybH0sCi0gICAgICogb3Ige0BsaW5rIGFuZHJvaWQuUi5pZCNzd2l0Y2hJbnB1dE1ldGhvZH0uCisgICAgICogdGhpcyB3aWxsIGJlIHtAbGluayBhbmRyb2lkLlIuaWQjY29weVVybH0gb3Ige0BsaW5rIGFuZHJvaWQuUi5pZCNzZWxlY3RUZXh0TW9kZX0uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gb25UZXh0Q29udGV4dE1lbnVJdGVtKGludCBpZCkgewogICAgICAgICBpbnQgbWluID0gMDsKQEAgLTc0NzQsNjYgKzc0NjcsMzAgQEAKICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KDAsIE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpKTsKICAgICAgICAgfQogCi0gICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcCA9IChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKQorICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXBib2FyZCA9IChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKQogICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpOwogCiAgICAgICAgIHN3aXRjaCAoaWQpIHsKLSAgICAgICAgICAgIGNhc2UgSURfU0VMRUNUX0FMTDoKLSAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCAwLCBtVGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX1NUQVJUX1NFTEVDVElOR19URVhUOgotICAgICAgICAgICAgICAgIHN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9DVVQ6ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNsaXAuc2V0VGV4dChtVHJhbnNmb3JtZWQuc3ViU2VxdWVuY2UobWluLCBtYXgpKTsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkuZGVsZXRlKG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICBzdG9wVGV4dFNlbGVjdGlvbk1vZGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9DT1BZOgotICAgICAgICAgICAgICAgIGNsaXAuc2V0VGV4dChtVHJhbnNmb3JtZWQuc3ViU2VxdWVuY2UobWluLCBtYXgpKTsKLSAgICAgICAgICAgICAgICBzdG9wVGV4dFNlbGVjdGlvbk1vZGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9QQVNURToKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgcGFzdGUgPSBjbGlwLmdldFRleHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXN0ZSAhPSBudWxsICYmIHBhc3RlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBsb25nIG1pbk1heCA9IHByZXBhcmVTcGFjZXNBcm91bmRQYXN0ZShtaW4sIG1heCwgcGFzdGUpOwotICAgICAgICAgICAgICAgICAgICBtaW4gPSBleHRyYWN0UmFuZ2VTdGFydEZyb21Mb25nKG1pbk1heCk7Ci0gICAgICAgICAgICAgICAgICAgIG1heCA9IGV4dHJhY3RSYW5nZUVuZEZyb21Mb25nKG1pbk1heCk7Ci0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5yZXBsYWNlKG1pbiwgbWF4LCBwYXN0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQogICAgICAgICAgICAgY2FzZSBJRF9DT1BZX1VSTDoKICAgICAgICAgICAgICAgICBVUkxTcGFuW10gdXJscyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKG1pbiwgbWF4LCBVUkxTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBjbGlwLnNldFRleHQodXJsc1swXS5nZXRVUkwoKSk7CisgICAgICAgICAgICAgICAgaWYgKHVybHMubGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xpcERhdGEgY2xpcCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx1cmxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHVybHNbMF0uZ2V0VVJMKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgPSBDbGlwRGF0YS5uZXdSYXdVcmkobnVsbCwgbnVsbCwgdXJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5hZGRJdGVtKG5ldyBDbGlwRGF0YS5JdGVtKHVyaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBib2FyZC5zZXRQcmltYXJ5Q2xpcChjbGlwKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgICAgICAgICAgY2FzZSBJRF9TV0lUQ0hfSU5QVVRfTUVUSE9EOgotICAgICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltbS5zaG93SW5wdXRNZXRob2RQaWNrZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGNhc2UgSURfQUREX1RPX0RJQ1RJT05BUlk6Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdvcmQgPSBnZXRXb3JkRm9yRGljdGlvbmFyeSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHdvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaSA9IG5ldyBJbnRlbnQoImNvbS5hbmRyb2lkLnNldHRpbmdzLlVTRVJfRElDVElPTkFSWV9JTlNFUlQiKTsKLSAgICAgICAgICAgICAgICAgICAgaS5wdXRFeHRyYSgid29yZCIsIHdvcmQpOwotICAgICAgICAgICAgICAgICAgICBpLnNldEZsYWdzKGkuZ2V0RmxhZ3MoKSB8IEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBJRF9TRUxFQ1RJT05fTU9ERToKKyAgICAgICAgICAgICAgICBzdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KIApAQCAtNzU4OSwzNSArNzU0Niw4MSBAQAogICAgICAgICAgICAgbUVhdFRvdWNoUmVsZWFzZSA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpKSB7CisgICAgICAgICAgICBwZXJmb3JtSGFwdGljRmVlZGJhY2soSGFwdGljRmVlZGJhY2tDb25zdGFudHMuTE9OR19QUkVTUyk7CisgICAgICAgICAgICBtRWF0VG91Y2hSZWxlYXNlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCkgewotICAgICAgICBpZiAoIW1Jc0luVGV4dFNlbGVjdGlvbk1vZGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVGV4dFZpZXcgaGFzIG5vIHNlbGVjdGlvbiBjb250cm9sbGVyLiBBY3Rpb24gbW9kZSBjYW5jZWxsZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiB0b3VjaFBvc2l0aW9uSXNJblNlbGVjdGlvbigpIHsKKyAgICAgICAgaW50IHNlbGVjdGlvblN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgaW50IHNlbGVjdGlvbkVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwogCi0gICAgICAgICAgICBpZiAoIXJlcXVlc3RGb2N1cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZWxlY3RDdXJyZW50V29yZCgpOwotICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5zaG93KCk7Ci0gICAgICAgICAgICBtSXNJblRleHRTZWxlY3Rpb25Nb2RlID0gdHJ1ZTsKKyAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID09IHNlbGVjdGlvbkVuZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gc2VsZWN0aW9uRW5kKSB7CisgICAgICAgICAgICBpbnQgdG1wID0gc2VsZWN0aW9uU3RhcnQ7CisgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvbkVuZDsKKyAgICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IHRtcDsKKyAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOworICAgICAgICB9CisKKyAgICAgICAgU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyIHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciA9CisgICAgICAgICAgICAoKFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcikgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcik7CisgICAgICAgIGludCBtaW5PZmZzZXQgPSBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZ2V0TWluVG91Y2hPZmZzZXQoKTsKKyAgICAgICAgaW50IG1heE9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNYXhUb3VjaE9mZnNldCgpOworCisgICAgICAgIHJldHVybiAoKG1pbk9mZnNldCA+PSBzZWxlY3Rpb25TdGFydCkgJiYgKG1heE9mZnNldCA8IHNlbGVjdGlvbkVuZCkpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFNhbWUgYXMge0BsaW5rICNzdG9wVGV4dFNlbGVjdGlvbk1vZGUoKX0sIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGN1cnNvciBjb250cm9sbGVyCisgICAgICogUHJvdmlkZXMgdGhlIGNhbGxiYWNrIHVzZWQgdG8gc3RhcnQgYSBzZWxlY3Rpb24gYWN0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgY2FsbGJhY2sgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc3RhcnQgc2VsZWN0aW9uIG1vZGUsIG9yIG51bGwgaWYgc2VsZWN0aW9uCisgICAgICogbW9kZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBnZXRBY3Rpb25Nb2RlQ2FsbGJhY2soKSB7CisgICAgICAgIC8vIExvbmcgcHJlc3MgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAgICAvLyBTaG91bGQgaW5pdGlhdGUgYSBkcmFnLiBSZXR1cm4gZmFsc2UsIHRvIHJlbHkgb24gY29udGV4dCBtZW51IGZvciBub3cuCisgICAgICAgIGlmIChjYW5TZWxlY3RUZXh0KCkgJiYgIXRvdWNoUG9zaXRpb25Jc0luU2VsZWN0aW9uKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uQWN0aW9uTW9kZUNhbGxiYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNlbGVjdGlvbiBtb2RlIHdhcyBhY3R1YWxseSBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBTZWxlY3Rpb24gYWN0aW9uIG1vZGUgaXMgYWxyZWFkeSBzdGFydGVkCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBBY3Rpb25Nb2RlLkNhbGxiYWNrIGFjdGlvbk1vZGVDYWxsYmFjayA9IGdldEFjdGlvbk1vZGVDYWxsYmFjaygpOworICAgICAgICBpZiAoYWN0aW9uTW9kZUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25BY3Rpb25Nb2RlID0gc3RhcnRBY3Rpb25Nb2RlKGFjdGlvbk1vZGVDYWxsYmFjayk7CisgICAgICAgICAgICByZXR1cm4gbVNlbGVjdGlvbkFjdGlvbk1vZGUgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKX0sIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGN1cnNvciBjb250cm9sbGVyCiAgICAgICogZmFkZSBvdXQgYW5pbWF0aW9uLiBOZWVkZWQgc2luY2UgdGhlIGRyYXdhYmxlIGFuZCB0aGVpciBhbHBoYSB2YWx1ZXMgYXJlIHNoYXJlZCBieSBhbGwKICAgICAgKiBUZXh0Vmlld3MuIFN3aXRjaGluZyBmcm9tIG9uZSBUZXh0VmlldyB0byBhbm90aGVyIHdvdWxkIGZhZGUgdGhlIGN1cnNvciBjb250cm9sbGVycyBpbiB0aGUKICAgICAgKiBuZXcgb25lIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVybWluYXRlVGV4dFNlbGVjdGlvbk1vZGUoKSB7Ci0gICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgIHByaXZhdGUgdm9pZCB0ZXJtaW5hdGVTZWxlY3Rpb25BY3Rpb25Nb2RlKCkgeworICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICBpZiAobVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0KICAgICAgICAgICAgICAgICAoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyOwpAQCAtNzYyNSwxNCArNzYyOCwxNDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzdG9wVGV4dFNlbGVjdGlvbk1vZGUoKSB7Ci0gICAgICAgIGlmIChtSXNJblRleHRTZWxlY3Rpb25Nb2RlKSB7Ci0gICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBnZXRTZWxlY3Rpb25FbmQoKSk7CisgICAgcHJpdmF0ZSB2b2lkIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCkgeworICAgICAgICBpZiAobVNlbGVjdGlvbkFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNlbGVjdGlvbkFjdGlvbk1vZGVDYWxsYmFjayBpbXBsZW1lbnRzIEFjdGlvbk1vZGUuQ2FsbGJhY2sgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVGV4dFZpZXcgaGFzIG5vIHNlbGVjdGlvbiBjb250cm9sbGVyLiBBY3Rpb24gbW9kZSBjYW5jZWxsZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXJlcXVlc3RGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtb2RlLnNldFRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy50ZXh0U2VsZWN0aW9uQ0FCVGl0bGUpKTsKKyAgICAgICAgICAgIG1vZGUuc2V0U3VidGl0bGUobnVsbCk7CisKKyAgICAgICAgICAgIHNlbGVjdEN1cnJlbnRXb3JkKCk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gYXRMZWFzdE9uZSA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAoY2FuU2VsZWN0VGV4dCgpKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfU0VMRUNUX0FMTCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc2VsZWN0QWxsKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfc2VsZWN0X2FsbCkuCisgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYScpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FuQ3V0KCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DVVQsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmN1dCkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2N1dCkuCisgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgneCcpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FuQ29weSgpKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2NvcHkpLgorICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKKyAgICAgICAgICAgICAgICBhdExlYXN0T25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhblBhc3RlKCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfcGFzdGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCd2Jyk7CisgICAgICAgICAgICAgICAgYXRMZWFzdE9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdExlYXN0T25lKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5zaG93KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgZmluYWwgaW50IGl0ZW1JZCA9IGl0ZW0uZ2V0SXRlbUlkKCk7CisKKyAgICAgICAgICAgIGlmIChpdGVtSWQgPT0gSURfU0VMRUNUX0FMTCkgeworICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIDAsIG1UZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY29udHJvbGxlciBwb3NpdGlvbnMgYWZ0ZXIgc2VsZWN0aW9uIGNoYW5nZS4KKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuc2hvdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkTWFuYWdlcikgZ2V0Q29udGV4dCgpLgorICAgICAgICAgICAgICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpOworCisgICAgICAgICAgICBpbnQgbWluID0gMDsKKyAgICAgICAgICAgIGludCBtYXggPSBtVGV4dC5sZW5ndGgoKTsKKworICAgICAgICAgICAgaWYgKGlzRm9jdXNlZCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CisKKyAgICAgICAgICAgICAgICBtaW4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWxTdGFydCwgc2VsRW5kKSk7CisgICAgICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgoMCwgTWF0aC5tYXgoc2VsU3RhcnQsIHNlbEVuZCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIElEX1BBU1RFOgorICAgICAgICAgICAgICAgICAgICBDbGlwRGF0YSBjbGlwID0gY2xpcGJvYXJkLmdldFByaW1hcnlDbGlwKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlkZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjbGlwLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgcGFzdGUgPSBjbGlwLmdldEl0ZW0oaSkuY29lcmNlVG9UZXh0KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtaW5NYXggPSBwcmVwYXJlU3BhY2VzQXJvdW5kUGFzdGUobWluLCBtYXgsIHBhc3RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IGV4dHJhY3RSYW5nZVN0YXJ0RnJvbUxvbmcobWluTWF4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IGV4dHJhY3RSYW5nZUVuZEZyb21Mb25nKG1pbk1heCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBtYXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLnJlcGxhY2UobWluLCBtYXgsIHBhc3RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5pbnNlcnQoZ2V0U2VsZWN0aW9uRW5kKCksICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmluc2VydChnZXRTZWxlY3Rpb25FbmQoKSwgcGFzdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgSURfQ1VUOgorICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3UGxhaW5UZXh0KG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zZm9ybWVkLnN1YlNlcXVlbmNlKG1pbiwgbWF4KSkpOworICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkuZGVsZXRlKG1pbiwgbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIElEX0NPUFk6CisgICAgICAgICAgICAgICAgICAgIGNsaXBib2FyZC5zZXRQcmltYXJ5Q2xpcChDbGlwRGF0YS5uZXdQbGFpblRleHQobnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNmb3JtZWQuc3ViU2VxdWVuY2UobWluLCBtYXgpKSk7CisgICAgICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIGdldFNlbGVjdGlvblN0YXJ0KCkpOwogICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuaGlkZSgpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtSXNJblRleHRTZWxlY3Rpb25Nb2RlID0gZmFsc2U7CisgICAgICAgICAgICBtU2VsZWN0aW9uQWN0aW9uTW9kZSA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgxNjMsNyArODMwMCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgaGlkZUNvbnRyb2xsZXJzKCkgewogICAgICAgICBoaWRlSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyKCk7Ci0gICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE9mZnNldEZvckhvcml6b250YWwoaW50IGxpbmUsIGludCB4KSB7CkBAIC04MjI2LDcgKzgzNjMsOCBAQAogICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lLCB4KTsKICAgICB9CiAKLSAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJ0ZXh0IikKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSAgICAgICAgICAgIG1UZXh0OwogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlICAgICAgICAgICAgbVRyYW5zZm9ybWVkOwogICAgIHByaXZhdGUgQnVmZmVyVHlwZSAgICAgICAgICAgICAgbUJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk5PUk1BTDsKQEAgLTgyNTcsOCArODM5NSwxMiBAQAogICAgIC8vIEN1cnNvciBDb250cm9sbGVycy4gTnVsbCB3aGVuIGRpc2FibGVkLgogICAgIHByaXZhdGUgQ3Vyc29yQ29udHJvbGxlciAgICAgICAgbUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlcjsKICAgICBwcml2YXRlIEN1cnNvckNvbnRyb2xsZXIgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBtSXNJblRleHRTZWxlY3Rpb25Nb2RlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlICAgICAgICAgICAgICBtU2VsZWN0aW9uQWN0aW9uTW9kZTsKICAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hPZmZzZXQgPSAtMTsKKyAgICAvLyBUaGVzZSBhcmUgbmVlZGVkIHRvIGRlc2FtYmlndWF0ZSBhIGxvbmcgY2xpY2suIElmIHRoZSBsb25nIGNsaWNrIGNvbWVzIGZyb20gb25lcyBvZiB0aGVzZSwgd2UKKyAgICAvLyBzZWxlY3QgZnJvbSB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uIE90aGVyd2lzZSwgc2VsZWN0IGZyb20gbG9uZyBwcmVzc2VkIHBvc2l0aW9uLgorICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgbURQYWRDZW50ZXJJc0Rvd24gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIG1FbnRlcktleUlzRG93biA9IGZhbHNlOwogICAgIC8vIENyZWF0ZWQgb25jZSBhbmQgc2hhcmVkIGJ5IGRpZmZlcmVudCBDdXJzb3JDb250cm9sbGVyIGhlbHBlciBtZXRob2RzLgogICAgIC8vIE9ubHkgb25lIGN1cnNvciBjb250cm9sbGVyIGlzIGFjdGl2ZSBhdCBhbnkgdGltZSB3aGljaCBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucy4KICAgICBwcml2YXRlIHN0YXRpYyBSZWN0ICAgICAgICAgICAgIHNDdXJzb3JDb250cm9sbGVyVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhCmluZGV4IDkwN2NmYjMuLjdiNjY4OTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEKQEAgLTMxLDExICszMSwxMyBAQAogICoKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX291dEFuaW1hdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcKICAqLwogcHVibGljIGNsYXNzIFZpZXdBbmltYXRvciBleHRlbmRzIEZyYW1lTGF5b3V0IHsKIAogICAgIGludCBtV2hpY2hDaGlsZCA9IDA7CiAgICAgYm9vbGVhbiBtRmlyc3RUaW1lID0gdHJ1ZTsKKwogICAgIGJvb2xlYW4gbUFuaW1hdGVGaXJzdFRpbWUgPSB0cnVlOwogCiAgICAgQW5pbWF0aW9uIG1JbkFuaW1hdGlvbjsKQEAgLTU5LDYgKzYxLDEwIEBACiAgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKICAgICAgICAgICAgIHNldE91dEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZSk7CiAgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZsYWcgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcsIHRydWUpOworICAgICAgICBzZXRBbmltYXRlRmlyc3RWaWV3KGZsYWcpOworCiAgICAgICAgIGEucmVjeWNsZSgpOwogCiAgICAgICAgIGluaXRWaWV3QW5pbWF0b3IoY29udGV4dCwgYXR0cnMpOwpAQCAtODQsMTAgKzkwLDEwIEBACiAgICAgICAgIHNldE1lYXN1cmVBbGxDaGlsZHJlbihtZWFzdXJlQWxsQ2hpbGRyZW4pOwogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTZXRzIHdoaWNoIGNoaWxkIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gd2hpY2hDaGlsZCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHZpZXcgdG8gZGlzcGxheQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXllZENoaWxkKGludCB3aGljaENoaWxkKSB7CkBAIC0xMDUsMTQgKzExMSwxNCBAQAogICAgICAgICAgICAgcmVxdWVzdEZvY3VzKEZPQ1VTX0ZPUldBUkQpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERpc3BsYXllZENoaWxkKCkgewogICAgICAgICByZXR1cm4gbVdoaWNoQ2hpbGQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTWFudWFsbHkgc2hvd3MgdGhlIG5leHQgY2hpbGQuCiAgICAgICovCkBAIC0xMjgsNiArMTM0LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuLAorICAgICAqIG9wdGlvbmFsbHkgd2l0aCB0aGUgd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoaWxkIGVudGVycyB0aGUgc2NyZWVuLCBvcHRpb25hbGx5IHdpdGggdGhlCisgICAgICoge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBhbmltYXRlIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgaW4gYW5kIG91dCBhbmltYXRpb25zLCBkZWZhdWx0cworICAgICAqICAgICAgICAgICAgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaWYgKGkgPT0gY2hpbGRJbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1JbkFuaW1hdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1JbkFuaW1hdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1PdXRBbmltYXRpb24gIT0gbnVsbCAmJiBjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1PdXRBbmltYXRpb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0QW5pbWF0aW9uKCkgPT0gbUluQW5pbWF0aW9uKQorICAgICAgICAgICAgICAgICAgICBjaGlsZC5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKICAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4KICAgICAgKiB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZCB0aGUgc3BlY2lmaWVkIGNoaWxkCiAgICAgICogZW50ZXJzIHRoZSBzY3JlZW4gd2l0aCB0aGUge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCkBAIC0xMzUsMjQgKzE3MCw4IEBACiAgICAgICogQHBhcmFtIGNoaWxkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBzaG93bi4KICAgICAgKi8KICAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4KSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2hlY2tGb3JGaXJzdCA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7Ci0gICAgICAgICAgICBpZiAoaSA9PSBjaGlsZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbUluQW5pbWF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obUluQW5pbWF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbU91dEFuaW1hdGlvbiAhPSBudWxsICYmIGNoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obU91dEFuaW1hdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRBbmltYXRpb24oKSA9PSBtSW5BbmltYXRpb24pCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7CisgICAgICAgIHNob3dPbmx5KGNoaWxkSW5kZXgsIGFuaW1hdGUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQppbmRleCA4MDM0OTYxLi5jNmY2ZTgxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQuZXF1YWxzKGFjdGlvbikpIHsKICAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKGludCB2aXNpYmlsaXR5KSB7CiAgICAgICAgIHN1cGVyLm9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJpbGl0eSk7CiAgICAgICAgIG1WaXNpYmxlID0gdmlzaWJpbGl0eSA9PSBWSVNJQkxFOwotICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0LDEwICsxNDQsMjIgQEAKICAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoKSB7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHN0YXJ0IG9yIHN0b3AgZGlzcGF0Y2hpbmcgZmxpcCB7QGxpbmsgTWVzc2FnZX0gYmFzZWQKKyAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxpcE5vdyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGV4ZWN1dGUgdGhlIGFuaW1hdGlvbiBub3csIGluCisgICAgICogICAgICAgICAgICBhZGRpdGlvbiB0byBxdWV1aW5nIGZ1dHVyZSBmbGlwcy4gSWYgb21pdHRlZCwgZGVmYXVsdHMgdG8KKyAgICAgKiAgICAgICAgICAgIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoYm9vbGVhbiBmbGlwTm93KSB7CiAgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IG1WaXNpYmxlICYmIG1TdGFydGVkICYmIG1Vc2VyUHJlc2VudDsKICAgICAgICAgaWYgKHJ1bm5pbmcgIT0gbVJ1bm5pbmcpIHsKICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7Ci0gICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQpOworICAgICAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkLCBmbGlwTm93KTsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOwogICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YQppbmRleCAzZGY0MTlhLi40NTBjOTY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhCkBAIC02Niw4ICs2Niw5IEBACiAgKiB7QGxpbmsgI3NldFpvb21JbkVuYWJsZWQoYm9vbGVhbil9IGFuZCB7QGxpbmsgI3NldFpvb21PdXRFbmFibGVkKGJvb2xlYW4pfS4KICAqIDxwPgogICogSWYgeW91IGFyZSB1c2luZyB0aGlzIHdpdGggYSBjdXN0b20gVmlldywgcGxlYXNlIGNhbGwKLSAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbSB0aGUKLSAqIHtAbGluayBWaWV3I29uRGV0YWNoZWRGcm9tV2luZG93fS4KKyAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbQorICoge0BsaW5rIFZpZXcjb25EZXRhY2hlZEZyb21XaW5kb3d9IGFuZCBmcm9tIHtAbGluayBWaWV3I29uVmlzaWJpbGl0eUNoYW5nZWR9CisgKiB3aGVuIDxjb2RlPnZpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFPC9jb2RlPi4KICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBab29tQnV0dG9uc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBWaWV3Lk9uVG91Y2hMaXN0ZW5lciB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWN0aW9uQmFySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDI5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQpAQCAtMCwwICsxLDU2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UG9wdXBIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlld0FuaW1hdG9yOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQWN0aW9uQmFySW1wbCBpcyB0aGUgQWN0aW9uQmFyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAqIGJ5IGRldmljZXMgb2YgYWxsIHNjcmVlbiBzaXplcy4gSWYgaXQgZGV0ZWN0cyBhIGNvbXBhdGlibGUgZGVjb3IsCisgKiBpdCB3aWxsIHNwbGl0IGNvbnRleHR1YWwgbW9kZXMgYWNyb3NzIGJvdGggdGhlIEFjdGlvbkJhclZpZXcgYXQKKyAqIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiBhbmQgYSBob3Jpem9udGFsIExpbmVhckxheW91dCBhdCB0aGUgYm90dG9tCisgKiB3aGljaCBpcyBub3JtYWxseSBoaWRkZW4uCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMX1ZJRVcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1ZJRVcgPSAxOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfU1dJVENIX1NIT1dfSElERSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9TV0lUQ0hfQUREX1JFTU9WRSA9IDE7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBEaWFsb2cgbURpYWxvZzsKKworICAgIHByaXZhdGUgVmlld0FuaW1hdG9yIG1BbmltYXRvclZpZXc7CisgICAgcHJpdmF0ZSBBY3Rpb25CYXJWaWV3IG1BY3Rpb25WaWV3OworICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbVVwcGVyQ29udGV4dFZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbUxvd2VyQ29udGV4dFZpZXc7CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxUYWJJbXBsPiBtVGFicyA9IG5ldyBBcnJheUxpc3Q8VGFiSW1wbD4oKTsKKworICAgIHByaXZhdGUgaW50IG1UYWJDb250YWluZXJWaWV3SWQgPSBhbmRyb2lkLlIuaWQuY29udGVudDsKKyAgICBwcml2YXRlIFRhYkltcGwgbVNlbGVjdGVkVGFiOworICAgIHByaXZhdGUgaW50IG1UYWJTd2l0Y2hNb2RlID0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFOworICAgIAorICAgIHByaXZhdGUgQWN0aW9uTW9kZSBtQWN0aW9uTW9kZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfRElTUExBWV9TUExJVCA9IDE7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUNvbnRleHREaXNwbGF5TW9kZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2luZ0NvbnRleHQ7CisKKyAgICBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBmaW5hbCBSdW5uYWJsZSBtQ2xvc2VDb250ZXh0ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5jbG9zZU1vZGUoKTsKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbG9zaW5nQ29udGV4dCA9IGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBBY3Rpb25CYXJJbXBsKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OworICAgICAgICBpbml0KGFjdGl2aXR5LmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uQmFySW1wbChEaWFsb2cgZGlhbG9nKSB7CisgICAgICAgIG1EaWFsb2cgPSBkaWFsb2c7CisgICAgICAgIGluaXQoZGlhbG9nLmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChWaWV3IGRlY29yKSB7CisgICAgICAgIG1Db250ZXh0ID0gZGVjb3IuZ2V0Q29udGV4dCgpOworICAgICAgICBtQWN0aW9uVmlldyA9IChBY3Rpb25CYXJWaWV3KSBkZWNvci5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fYmFyKTsKKyAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcgPSAoQWN0aW9uQmFyQ29udGV4dFZpZXcpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9jb250ZXh0X2Jhcik7CisgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3ID0gKExpbmVhckxheW91dCkgZGVjb3IuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyKTsKKyAgICAgICAgbUFuaW1hdG9yVmlldyA9IChWaWV3QW5pbWF0b3IpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXJfYW5pbWF0b3IpOworCisgICAgICAgIGlmIChtQWN0aW9uVmlldyA9PSBudWxsIHx8IG1VcHBlckNvbnRleHRWaWV3ID09IG51bGwgfHwgbUFuaW1hdG9yVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhIGNvbXBhdGlibGUgd2luZG93IGRlY29yIGxheW91dCIpOworICAgICAgICB9CisKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q29udGV4dFZpZXcobVVwcGVyQ29udGV4dFZpZXcpOworICAgICAgICBtQ29udGV4dERpc3BsYXlNb2RlID0gbUxvd2VyQ29udGV4dFZpZXcgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA6IENPTlRFWFRfRElTUExBWV9TUExJVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcgdmlldykgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRDdXN0b21OYXZpZ2F0aW9uVmlldyh2aWV3KTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLCBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShhZGFwdGVyLCBjYWxsYmFjaywgLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgaW50IGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKSB7CisgICAgICAgIGNsZWFudXBUYWJzKCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25BZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBzZWxlY3RUYWIobVRhYnMuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIG1BY3Rpb25WaWV3LnNldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIG5vdCB2YWxpZCBmb3IgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSgpIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkVGFiLmdldFBvc2l0aW9uKCk7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYW51cFRhYnMoKSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKG51bGwpOworICAgICAgICB9CisgICAgICAgIG1UYWJzLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldERpc3BsYXlPcHRpb25zKG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zLCBpbnQgbWFzaykgeworICAgICAgICBmaW5hbCBpbnQgY3VycmVudCA9IG1BY3Rpb25WaWV3LmdldERpc3BsYXlPcHRpb25zKCk7IAorICAgICAgICBtQWN0aW9uVmlldy5zZXREaXNwbGF5T3B0aW9ucygob3B0aW9ucyAmIG1hc2spIHwgKGN1cnJlbnQgJiB+bWFzaykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldEJhY2tncm91bmREcmF3YWJsZShkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldFRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldFN1YnRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldE5hdmlnYXRpb25Nb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREaXNwbGF5T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldERpc3BsYXlPcHRpb25zKCk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG9uJ3Qgd2FpdCBmb3IgdGhlIGNsb3NlIGNvbnRleHQgbW9kZSBhbmltYXRpb24gdG8gZmluaXNoLgorICAgICAgICBpZiAobUNsb3NpbmdDb250ZXh0KSB7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUNsb3NlQ29udGV4dCk7CisgICAgICAgICAgICBtQ2xvc2VDb250ZXh0LnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gbmV3IEFjdGlvbk1vZGVJbXBsKGNhbGxiYWNrKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgICAgIG1vZGUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuaW5pdEZvck1vZGUobW9kZSk7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LnNldERpc3BsYXllZENoaWxkKENPTlRFWFRfVklFVyk7CisgICAgICAgICAgICBpZiAobUxvd2VyQ29udGV4dFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gYW5pbWF0ZSB0aGlzCisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBtb2RlOworICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgVGFiSW1wbCB0YWJpID0gKFRhYkltcGwpIHRhYjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0ZpcnN0VGFiID0gbVRhYnMuaXNFbXB0eSgpOworICAgICAgICBmaW5hbCBBY3Rpb25CYXIuVGFiTGlzdGVuZXIgY2FsbGJhY2sgPSB0YWJpLmdldENhbGxiYWNrKCk7CisKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFjdGlvbiBCYXIgVGFiIG11c3QgaGF2ZSBhIENhbGxiYWNrIik7CisgICAgICAgIH0KKworICAgICAgICB0YWJpLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgbVRhYnMuYWRkKHBvc2l0aW9uLCB0YWJpKTsKKworICAgICAgICBpZiAoaXNGaXJzdFRhYikgeworICAgICAgICAgICAgZmluYWwgRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFucyA9IG1BY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRhYiA9IHRhYmk7CisgICAgICAgICAgICBjYWxsYmFjay5vblRhYlNlbGVjdGVkKHRhYiwgdHJhbnMpOworICAgICAgICAgICAgaWYgKCF0cmFucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFRhYihUYWIgdGFiKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LmFkZFRhYih0YWIpOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBtVGFicy5zaXplKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcuYWRkVGFiKHRhYiwgcG9zaXRpb24pOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhYiBuZXdUYWIoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGFiSW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhYihUYWIgdGFiKSB7CisgICAgICAgIHJlbW92ZVRhYkF0KHRhYi5nZXRQb3NpdGlvbigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcucmVtb3ZlVGFiQXQocG9zaXRpb24pOworICAgICAgICBtVGFicy5yZW1vdmUocG9zaXRpb24pOworCisgICAgICAgIGZpbmFsIGludCBuZXdUYWJDb3VudCA9IG1UYWJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHBvc2l0aW9uOyBpIDwgbmV3VGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbVRhYnMuZ2V0KGkpLnNldFBvc2l0aW9uKGkpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZWN0VGFiKG1UYWJzLmlzRW1wdHkoKSA/IG51bGwgOiBtVGFicy5nZXQoTWF0aC5tYXgoMCwgcG9zaXRpb24gLSAxKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRhYk5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUYWIgbmF2aWdhdGlvbiBtb2RlIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYW4gQWN0aXZpdHkiKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXROYXZpZ2F0aW9uTW9kZShOQVZJR0FUSU9OX01PREVfVEFCUyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VsZWN0VGFiKFRhYiB0YWIpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRhYiA9PSB0YWIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRhYlNlbGVjdGVkKHRhYiAhPSBudWxsID8gdGFiLmdldFBvc2l0aW9uKCkgOiBUYWIuSU5WQUxJRF9QT1NJVElPTik7CisgICAgICAgIGZpbmFsIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnMgPSBtQWN0aXZpdHkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVGFiLmdldENhbGxiYWNrKCkub25UYWJVbnNlbGVjdGVkKG1TZWxlY3RlZFRhYiwgdHJhbnMpOworICAgICAgICB9CisgICAgICAgIG1TZWxlY3RlZFRhYiA9IChUYWJJbXBsKSB0YWI7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVGFiLmdldENhbGxiYWNrKCkub25UYWJTZWxlY3RlZChtU2VsZWN0ZWRUYWIsIHRyYW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdHJhbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUYWIgZ2V0U2VsZWN0ZWRUYWIoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0ZWRUYWI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAvLyBUT0RPIGFuaW1hdGUhCisgICAgICAgIG1BbmltYXRvclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7CisgICAgICAgIC8vIFRPRE8gYW5pbWF0ZSEKKyAgICAgICAgbUFuaW1hdG9yVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbUFuaW1hdG9yVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlIAorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBBY3Rpb25Nb2RlSW1wbCBleHRlbmRzIEFjdGlvbk1vZGUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxWaWV3PiBtQ3VzdG9tVmlldzsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlSW1wbChBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIG1NZW51ID0gbmV3IE1lbnVCdWlsZGVyKG1BY3Rpb25WaWV3LmdldENvbnRleHQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisgICAgICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudUluZmxhdGVyIGdldE1lbnVJbmZsYXRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IHRoZSBhY3RpdmUgYWN0aW9uIG1vZGUgLSBuby1vcAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzdHJveUFjdGlvbk1vZGUodGhpcyk7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LnNldERpc3BsYXllZENoaWxkKE5PUk1BTF9WSUVXKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBjb250ZXh0IG1vZGUgdmlld3MgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBmaW5pc2hlcworICAgICAgICAgICAgbUNsb3NpbmdDb250ZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1DbG9zZUNvbnRleHQsIG1BbmltYXRvclZpZXcuZ2V0T3V0QW5pbWF0aW9uKCkuZ2V0RHVyYXRpb24oKSk7CisKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsICYmIG1Mb3dlckNvbnRleHRWaWV3LmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIEFuaW1hdGUgdGhpcworICAgICAgICAgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjay5vblByZXBhcmVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KSkgeworICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggY29udGVudCBpbiBib3RoIGNvbnRleHQgdmlld3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21WaWV3KFZpZXcgdmlldykgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2V0Q3VzdG9tVmlldyh2aWV3KTsKKyAgICAgICAgICAgIG1DdXN0b21WaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4odmlldyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zZXRTdWJ0aXRsZShzdWJ0aXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgICAgICBzZXRUaXRsZShtQWN0aXZpdHkuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgICAgICBzZXRTdWJ0aXRsZShtQWN0aXZpdHkuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVXBwZXJDb250ZXh0Vmlldy5nZXRUaXRsZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVwcGVyQ29udGV4dFZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUN1c3RvbVZpZXcgIT0gbnVsbCA/IG1DdXN0b21WaWV3LmdldCgpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrLm9uQWN0aW9uSXRlbUNsaWNrZWQodGhpcywgaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICAgICAgaWYgKCFzdWJNZW51Lmhhc1Zpc2libGVJdGVtcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIobUNvbnRleHQsIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBUYWJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyLlRhYiB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyLlRhYkxpc3RlbmVyIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgbVRhZzsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbjsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Qb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRhZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFnOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRhZyhPYmplY3QgdGFnKSB7CisgICAgICAgICAgICBtVGFnID0gdGFnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvbkJhci5UYWJMaXN0ZW5lciBnZXRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGFiTGlzdGVuZXIoQWN0aW9uQmFyLlRhYkxpc3RlbmVyIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21WaWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1Qb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKHRoaXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVQaWNrZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMzkzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0RnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworcHVibGljIGNsYXNzIExvY2FsZVBpY2tlciBleHRlbmRzIExpc3RGcmFnbWVudCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2NhbGVQaWNrZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIExvY2FsZVNlbGVjdGlvbkxpc3RlbmVyIHsKKyAgICAgICAgLy8gWW91IGNhbiBhZGQgYW55IGFyZ3VtZW50IGlmIHlvdSByZWFsbHkgbmVlZCBpdC4uLgorICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZVNlbGVjdGVkKExvY2FsZSBsb2NhbGUpOworICAgIH0KKworICAgIExvY1tdIG1Mb2NhbGVzOworICAgIFN0cmluZ1tdIG1TcGVjaWFsTG9jYWxlQ29kZXM7CisgICAgU3RyaW5nW10gbVNwZWNpYWxMb2NhbGVOYW1lczsKKworICAgIHByaXZhdGUgTG9jYWxlIG1OZXdMb2NhbGU7CisKKyAgICBMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBtTGlzdGVuZXI7ICAvLyBkZWZhdWx0IHRvIG51bGwKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvYyBpbXBsZW1lbnRzIENvbXBhcmFibGU8TG9jPiB7CisgICAgICAgIHN0YXRpYyBDb2xsYXRvciBzQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIFN0cmluZyBsYWJlbDsKKyAgICAgICAgTG9jYWxlIGxvY2FsZTsKKworICAgICAgICBwdWJsaWMgTG9jKFN0cmluZyBsYWJlbCwgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmxhYmVsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKExvYyBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gc0NvbGxhdG9yLmNvbXBhcmUodGhpcy5sYWJlbCwgYW5vdGhlci5sYWJlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBMb2NhbGVMaXN0KCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSBhY3Rpdml0eS5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVDb2RlcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX2NvZGVzKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVOYW1lcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX25hbWVzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBsb2NhbGVzID0gYWN0aXZpdHkuZ2V0QXNzZXRzKCkuZ2V0TG9jYWxlcygpOworICAgICAgICBBcnJheXMuc29ydChsb2NhbGVzKTsKKyAgICAgICAgZmluYWwgaW50IG9yaWdTaXplID0gbG9jYWxlcy5sZW5ndGg7CisgICAgICAgIExvY1tdIHByZXByb2Nlc3MgPSBuZXcgTG9jW29yaWdTaXplXTsKKyAgICAgICAgaW50IGZpbmFsU2l6ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG9yaWdTaXplOyBpKysgKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGxvY2FsZXNbaV07CisgICAgICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gNSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IHMuc3Vic3RyaW5nKDAsIDIpOworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gcy5zdWJzdHJpbmcoMywgNSk7CisgICAgICAgICAgICAgICAgTG9jYWxlIGwgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKKworICAgICAgICAgICAgICAgIGlmIChmaW5hbFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyBpbml0aWFsICIrIHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2ModG9UaXRsZUNhc2UobC5nZXREaXNwbGF5TGFuZ3VhZ2UobCkpLCBsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBwcmV2aW91cyBlbnRyeToKKyAgICAgICAgICAgICAgICAgICAgLy8gIHNhbWUgbGFuZyBhbmQgYSBjb3VudHJ5IC0+IHVwZ3JhZGUgdG8gZnVsbCBuYW1lIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyAgICBpbnNlcnQgb3VycyB3aXRoIGZ1bGwgbmFtZQorICAgICAgICAgICAgICAgICAgICAvLyAgZGlmZiBsYW5nIC0+IGluc2VydCBvdXJzIHdpdGggbGFuZy1vbmx5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXByb2Nlc3NbZmluYWxTaXplLTFdLmxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImJhY2tpbmcgdXAgYW5kIGZpeGluZyAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubGFiZWwrIiB0byAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGlzcGxheU5hbWUocHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubG9jYWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sYWJlbCA9IHRvVGl0bGVDYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREaXNwbGF5TmFtZShwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sb2NhbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIiAgYW5kIGFkZGluZyAiKyB0b1RpdGxlQ2FzZShnZXREaXNwbGF5TmFtZShsKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jKHRvVGl0bGVDYXNlKGdldERpc3BsYXlOYW1lKGwpKSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5lcXVhbHMoInp6X1paIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9ICJQc2V1ZG8uLi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9IHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyAiK2Rpc3BsYXlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2Nlc3NbZmluYWxTaXplKytdID0gbmV3IExvYyhkaXNwbGF5TmFtZSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxvY2FsZXMgPSBuZXcgTG9jW2ZpbmFsU2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxTaXplIDsgaSsrKSB7CisgICAgICAgICAgICBtTG9jYWxlc1tpXSA9IHByZXByb2Nlc3NbaV07CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnNvcnQobUxvY2FsZXMpOworICAgICAgICBmaW5hbCBpbnQgbGF5b3V0SWQgPSBSLmxheW91dC5sb2NhbGVfcGlja2VyX2l0ZW07CisgICAgICAgIGZpbmFsIGludCBmaWVsZElkID0gUi5pZC5sb2NhbGU7CisgICAgICAgIGZpbmFsIEFycmF5QWRhcHRlcjxMb2M+IGFkYXB0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBBcnJheUFkYXB0ZXI8TG9jPihhY3Rpdml0eSwgbGF5b3V0SWQsIGZpZWxkSWQsIG1Mb2NhbGVzKTsKKyAgICAgICAgc2V0TGlzdEFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoZmluYWwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRVcExvY2FsZUxpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lcihMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9UaXRsZUNhc2UoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHMuY2hhckF0KDApKSArIHMuc3Vic3RyaW5nKDEpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERpc3BsYXlOYW1lKExvY2FsZSBsKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gbC50b1N0cmluZygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVNwZWNpYWxMb2NhbGVDb2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1TcGVjaWFsTG9jYWxlQ29kZXNbaV0uZXF1YWxzKGNvZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWFsTG9jYWxlTmFtZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbC5nZXREaXNwbGF5TmFtZShsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgZ2V0TGlzdFZpZXcoKS5yZXF1ZXN0Rm9jdXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFYWNoIGxpc3RlbmVyIG5lZWRzIHRvIGNhbGwge0BsaW5rICN1cGRhdGVMb2NhbGUoTG9jYWxlKX0gdG8gYWN0dWFsbHkgY2hhbmdlIHRoZSBsb2NhbGUuCisgICAgICoKKyAgICAgKiBXZSBkb24ndCBjYWxsIHtAbGluayAjdXBkYXRlTG9jYWxlKExvY2FsZSl9IGF1dG9tYXRpY2FsbHksIGFzIGl0IGhhbHQgdGhlIHN5c3RlbSBmb3IKKyAgICAgKiBhIG1vbWVudCBhbmQgc29tZSBjYWxsZXJzIHdvbid0IHdhbnQgaXQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLm9uTG9jYWxlU2VsZWN0ZWQobUxvY2FsZXNbcG9zaXRpb25dLmxvY2FsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0cyB0aGUgc3lzdGVtIHRvIHVwZGF0ZSB0aGUgc3lzdGVtIGxvY2FsZS4gTm90ZSB0aGF0IHRoZSBzeXN0ZW0gbG9va3MgaGFsdGVkCisgICAgICogZm9yIGEgd2hpbGUgZHVyaW5nIHRoZSBMb2NhbGUgbWlncmF0aW9uLCBzbyB0aGUgY2FsbGVyIG5lZWQgdG8gdGFrZSBjYXJlIG9mIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSUFjdGl2aXR5TWFuYWdlciBhbSA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCk7CisgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGFtLmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICAgICAgY29uZmlnLmxvY2FsZSA9IGxvY2FsZTsKKworICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhpcyBpc24ndCBzb21lIHBhc3NpbmcgZGVmYXVsdCAtIHRoZSB1c2VyIHdhbnRzIHRoaXMgcmVtZW1iZXJlZAorICAgICAgICAgICAgY29uZmlnLnVzZXJTZXRMb2NhbGUgPSB0cnVlOworCisgICAgICAgICAgICBhbS51cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBkaXJ0eSBiaXQgZm9yIHRoZSBTZXR0aW5ncyBQcm92aWRlci4KKyAgICAgICAgICAgIEJhY2t1cE1hbmFnZXIuZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TaHV0ZG93blRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TaHV0ZG93blRocmVhZC5qYXZhCmluZGV4IGUwN2M1NGYuLjgxMDRlY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvU2h1dGRvd25UaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL1NodXRkb3duVGhyZWFkLmphdmEKQEAgLTE4LDE1ICsxOCwxNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHA7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKQEAgLTkxLDEzICs5MywyMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgTG9nLmQoVEFHLCAiTm90aWZ5aW5nIHRocmVhZCB0byBzdGFydCByYWRpbyBzaHV0ZG93biIpOworICAgICAgICBmaW5hbCBpbnQgbG9uZ1ByZXNzQmVoYXZpb3IgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX2xvbmdQcmVzc09uUG93ZXJCZWhhdmlvcik7CisgICAgICAgIGZpbmFsIGludCByZXNvdXJjZUlkID0gbG9uZ1ByZXNzQmVoYXZpb3IgPT0gMgorICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc2h1dGRvd25fY29uZmlybV9xdWVzdGlvbgorICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc2h1dGRvd25fY29uZmlybTsKKworICAgICAgICBMb2cuZChUQUcsICJOb3RpZnlpbmcgdGhyZWFkIHRvIHN0YXJ0IHNodXRkb3duIGxvbmdQcmVzc0JlaGF2aW9yPSIgKyBsb25nUHJlc3NCZWhhdmlvcik7CiAKICAgICAgICAgaWYgKGNvbmZpcm0pIHsKKyAgICAgICAgICAgIGZpbmFsIENsb3NlRGlhbG9nUmVjZWl2ZXIgY2xvc2VyID0gbmV3IENsb3NlRGlhbG9nUmVjZWl2ZXIoY29udGV4dCk7CiAgICAgICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2cgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihjb250ZXh0KQogICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfZGlhbG9nX2FsZXJ0KQogICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG93ZXJfb2ZmKQotICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zaHV0ZG93bl9jb25maXJtKQorICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShyZXNvdXJjZUlkKQogICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcueWVzLCBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5TaHV0ZG93blNlcXVlbmNlKGNvbnRleHQpOwpAQCAtMTA1LDYgKzExNCw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgIC5zZXROZWdhdGl2ZUJ1dHRvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5ubywgbnVsbCkKICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSgpOworICAgICAgICAgICAgY2xvc2VyLmRpYWxvZyA9IGRpYWxvZzsKKyAgICAgICAgICAgIGRpYWxvZy5zZXRPbkRpc21pc3NMaXN0ZW5lcihjbG9zZXIpOwogICAgICAgICAgICAgZGlhbG9nLmdldFdpbmRvdygpLnNldFR5cGUoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9LRVlHVUFSRF9ESUFMT0cpOwogICAgICAgICAgICAgaWYgKCFjb250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfc2Zfc2xvd0JsdXIpKSB7CkBAIC0xMTYsNiArMTI3LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbG9zZURpYWxvZ1JlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIKKyAgICAgICAgICAgIGltcGxlbWVudHMgRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwdWJsaWMgRGlhbG9nIGRpYWxvZzsKKworICAgICAgICBDbG9zZURpYWxvZ1JlY2VpdmVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyk7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIodGhpcywgZmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBkaWFsb2cuY2FuY2VsKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoRGlhbG9nSW50ZXJmYWNlIHVudXNlZCkgeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHRoaXMpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCBhIGNsZWFuIHNodXRkb3duLCB3YWl0aW5nIGZvciBzdWJzeXN0ZW1zIHRvIGNsZWFuIHVwIHRoZWlyCiAgICAgICogc3RhdGUgZXRjLiAgTXVzdCBiZSBjYWxsZWQgZnJvbSBhIExvb3BlciB0aHJlYWQgaW4gd2hpY2ggaXRzIFVJCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRIb3N0LmFpZGwgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRIb3N0LmFpZGwKaW5kZXggMmVkNDc3My4uMjE2ZDk4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldEhvc3QuYWlkbApAQCAtMjQsNSArMjQsNiBAQAogb25ld2F5IGludGVyZmFjZSBJQXBwV2lkZ2V0SG9zdCB7CiAgICAgdm9pZCB1cGRhdGVBcHBXaWRnZXQoaW50IGFwcFdpZGdldElkLCBpbiBSZW1vdGVWaWV3cyB2aWV3cyk7CiAgICAgdm9pZCBwcm92aWRlckNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbiBBcHBXaWRnZXRQcm92aWRlckluZm8gaW5mbyk7CisgICAgdm9pZCB2aWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbnQgdmlld0lkKTsKIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsCmluZGV4IDQ5NmFhMWEuLjRkNTY3NDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRTZXJ2aWNlLmFpZGwKQEAgLTQwLDcgKzQwLDkgQEAKICAgICAvLyBmb3IgQXBwV2lkZ2V0TWFuYWdlcgogICAgIC8vCiAgICAgdm9pZCB1cGRhdGVBcHBXaWRnZXRJZHMoaW4gaW50W10gYXBwV2lkZ2V0SWRzLCBpbiBSZW1vdGVWaWV3cyB2aWV3cyk7CisgICAgdm9pZCBwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXRJZHMoaW4gaW50W10gYXBwV2lkZ2V0SWRzLCBpbiBSZW1vdGVWaWV3cyB2aWV3cyk7CiAgICAgdm9pZCB1cGRhdGVBcHBXaWRnZXRQcm92aWRlcihpbiBDb21wb25lbnROYW1lIHByb3ZpZGVyLCBpbiBSZW1vdGVWaWV3cyB2aWV3cyk7CisgICAgdm9pZCBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoaW4gaW50W10gYXBwV2lkZ2V0SWRzLCBpbnQgdmlld0lkKTsKICAgICBMaXN0PEFwcFdpZGdldFByb3ZpZGVySW5mbz4gZ2V0SW5zdGFsbGVkUHJvdmlkZXJzKCk7CiAgICAgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGdldEFwcFdpZGdldEluZm8oaW50IGFwcFdpZGdldElkKTsKICAgICB2b2lkIGJpbmRBcHBXaWRnZXRJZChpbnQgYXBwV2lkZ2V0SWQsIGluIENvbXBvbmVudE5hbWUgcHJvdmlkZXIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEKaW5kZXggOTk0MTBiYy4uMDAyNTUxMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCkBAIC0xODIsMjQgKzE4Miw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIGludCBsZW5ndGggPSBtQ3Vyc29ycy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1DdXJzb3JzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yc1tpXS5jb21taXRVcGRhdGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW4pCiAgICAgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRTdHJpbmcoY29sdW1uKTsKQEAgLTIzNiw2ICsyMTgsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRUeXBlKGNvbHVtbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pCiAgICAgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvQmF0dGVyeVN0YXRzSW1wbC5qYXZhCmluZGV4IDY2MTQ5YWMuLjhlYTAyYWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL0JhdHRlcnlTdGF0c0ltcGwuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5Kb3VybmFsZWRGaWxlOwogCitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOwogaW1wb3J0IGFuZHJvaWQub3MuQmF0dGVyeU1hbmFnZXI7CkBAIC01MCw2ICs1MSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwogCkBAIC0xMTUwLDcgKzExNTIsMTEgQEAKIAogICAgIHByaXZhdGUgaW50IGdldEN1cnJlbnRCbHVldG9vdGhQaW5nQ291bnQoKSB7CiAgICAgICAgIGlmIChtQnRIZWFkc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQnRIZWFkc2V0LmdldEJhdHRlcnlVc2FnZUhpbnQoKTsKKyAgICAgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZVNldCA9IG1CdEhlYWRzZXQuZ2V0Q29ubmVjdGVkRGV2aWNlcygpOworICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlW10gZGV2aWNlcyA9IGRldmljZVNldC50b0FycmF5KG5ldyBCbHVldG9vdGhEZXZpY2VbZGV2aWNlU2V0LnNpemUoKV0pOworICAgICAgICAgICAgaWYgKGRldmljZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtQnRIZWFkc2V0LmdldEJhdHRlcnlVc2FnZUhpbnQoZGV2aWNlc1swXSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1J1bnRpbWVJbml0LmphdmEKaW5kZXggNTk2MDBkYy4uNTc2NzgzMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1J1bnRpbWVJbml0LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1J1bnRpbWVJbml0LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkZpbmFsaXplcnM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIApAQCAtMTQxLDYgKzE0MiwxMiBAQAogICAgICAgICAgICAgRGVidWcuZW5hYmxlRW11bGF0b3JUcmFjZU91dHB1dCgpOwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpemUgdGhlIHRocmVhZCB1c2VkIHRvIHJlY2xhaW0gcmVzb3VyY2VzIHdpdGhvdXQKKyAgICAgICAgICogZ29pbmcgdGhyb3VnaCBmaW5hbGl6ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgRmluYWxpemVycy5pbml0KCk7CisKICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgIH0KIApAQCAtMzMxLDkgKzMzOCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiogQ291bnRlciB1c2VkIHRvIHByZXZlbnQgcmVlbnRyYW5jeSBpbiB7QGxpbmsgI3JlcG9ydEV4Y2VwdGlvbn0uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBzSW5SZXBvcnRFeGNlcHRpb24gPSBuZXcgQXRvbWljSW50ZWdlcigpOwotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBvYmplY3QgaWRlbnRpZnlpbmcgdGhpcyBhcHBsaWNhdGlvbi9wcm9jZXNzLCBmb3IgcmVwb3J0aW5nIFZNCiAgICAgICogZXJyb3JzLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCmluZGV4IGVhMjc4YTYuLmI4N2FjOTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKQEAgLTI2LDcgKzI2LDkgQEAKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKIApAQCAtMzcsMTUgKzM5LDI3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbiI7CiAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTkFQU0hPVF9ESVIgPSAiL2RhdGEvc25hcHNob3RzIjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZW5hYmxlZDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGVjdXRvciBzbmFwc2hvdFdyaXRlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc2FtcGxpbmdQcm9maWxlckh6OworCisgICAgLyoqIFdoZXRoZXIgb3Igbm90IHdlJ3ZlIGNyZWF0ZWQgdGhlIHNuYXBzaG90cyBkaXIuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXJNYWRlID0gZmFsc2U7CisKKyAgICAvKiogV2hldGhlciBvciBub3QgYSBzbmFwc2hvdCBpcyBiZWluZyBwZXJzaXN0ZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljQm9vbGVhbiBwZW5kaW5nID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCiAgICAgc3RhdGljIHsKLSAgICAgICAgZW5hYmxlZCA9ICIxIi5lcXVhbHMoU3lzdGVtUHJvcGVydGllcy5nZXQoInBlcnNpc3Quc2FtcGxpbmdfcHJvZmlsZXIiKSk7Ci0gICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIHNhbXBsaW5nUHJvZmlsZXJIeiA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KCJwZXJzaXN0LnN5cy5wcm9maWxlcl9oeiIsIDApOworICAgICAgICBpZiAoc2FtcGxpbmdQcm9maWxlckh6ID4gMCkgewogICAgICAgICAgICAgc25hcHNob3RXcml0ZXIgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIlByb2ZpbGVyIGlzIGVuYWJsZWQuIik7CisgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlByb2ZpbGVyIGlzIGVuYWJsZWQuIFNhbXBsaW5nIFByb2ZpbGVyIEh6OiAiICsgc2FtcGxpbmdQcm9maWxlckh6KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNuYXBzaG90V3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlByb2ZpbGVyIGlzIGRpc2FibGVkLiIpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjksNDggKzgzLDQ3IEBACiAgICAgICAgIFRocmVhZEdyb3VwIGdyb3VwID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRUaHJlYWRHcm91cCgpOwogICAgICAgICBTYW1wbGluZ1Byb2ZpbGVyLlRocmVhZFNldCB0aHJlYWRTZXQgPSBTYW1wbGluZ1Byb2ZpbGVyLm5ld1RocmVhZEdyb3VwVGhlYWRTZXQoZ3JvdXApOwogICAgICAgICBJTlNUQU5DRSA9IG5ldyBTYW1wbGluZ1Byb2ZpbGVyKDQsIHRocmVhZFNldCk7Ci0gICAgICAgIElOU1RBTkNFLnN0YXJ0KDEwKTsKKyAgICAgICAgSU5TVEFOQ0Uuc3RhcnQoc2FtcGxpbmdQcm9maWxlckh6KTsKICAgICB9CiAKLSAgICAvKiogV2hldGhlciBvciBub3Qgd2UndmUgY3JlYXRlZCB0aGUgc25hcHNob3RzIGRpci4gKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBkaXJNYWRlID0gZmFsc2U7Ci0KLSAgICAvKiogV2hldGhlciBvciBub3QgYSBzbmFwc2hvdCBpcyBiZWluZyBwZXJzaXN0ZWQuICovCi0gICAgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gcGVuZGluZzsKLQogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHNuYXBzaG90IHRvIHRoZSBTRCBjYXJkIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLgorICAgICAqIFdyaXRlcyBhIHNuYXBzaG90IGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlU25hcHNob3QoZmluYWwgU3RyaW5nIHByb2Nlc3NOYW1lLCBmaW5hbCBQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbykgewogICAgICAgICBpZiAoIWVuYWJsZWQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIC8qCi0gICAgICAgICAqIElmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBhIHNuYXBzaG90LCBkb24ndCBib3RoZXIgZW5xdWVpbmcgYW5vdGhlcgorICAgICAgICAgKiBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgYSBzbmFwc2hvdCwgZG9uJ3QgYm90aGVyIGVucXVldWVpbmcgYW5vdGhlcgogICAgICAgICAgKiByZXF1ZXN0IHJpZ2h0IG5vdy4gVGhpcyB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGluZGl2aWR1YWwKICAgICAgICAgICogc25hcHNob3RzIGFuZCBpbiB0dXJuIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IGNvbnN1bWVkIChvbmUgYmlnCiAgICAgICAgICAqIHNuYXBzaG90IGlzIHNtYWxsZXIgdGhhbiBOIHN1YnNldCBzbmFwc2hvdHMpLgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFwZW5kaW5nKSB7Ci0gICAgICAgICAgICBwZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgaWYgKHBlbmRpbmcuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgICAgIHNuYXBzaG90V3JpdGVyLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCkgKyAiL3NuYXBzaG90cyI7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZGlyTWFkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZGlyKS5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShkaXIpLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoU05BUFNIT1RfRElSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkaXJlY3RvcnkgbmVlZHMgdG8gYmUgd3JpdGFibGUgdG8gYW55Ym9keQorICAgICAgICAgICAgICAgICAgICAgICAgZGlyLnNldFdyaXRhYmxlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkaXJlY3RvcnkgbmVlZHMgdG8gYmUgZXhlY3V0YWJsZSB0byBhbnlib2R5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBrbm93IHdoeSB5ZXQsIGJ1dCBtb2RlIDcyMyB3b3VsZCB3b3JrLCB3aGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kZSA3MjIgdGhyb3dzIEZpbGVOb3RGb3VuZEV4ZWNwdGlvbiBhdCBsaW5lIDE1MQorICAgICAgICAgICAgICAgICAgICAgICAgZGlyLnNldEV4ZWN1dGFibGUodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyBGaWxlKFNOQVBTSE9UX0RJUikuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpck1hZGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDcmVhdGlvbiBvZiAiICsgZGlyICsgIiBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3JlYXRpb24gb2YgIiArIFNOQVBTSE9UX0RJUiArICIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuc2V0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU25hcHNob3QoZGlyLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU25hcHNob3QoU05BUFNIT1RfRElSLCBwcm9jZXNzTmFtZSwgcGFja2FnZUluZm8pOwogICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5zZXQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CkBAIC0xMjQsMTUgKzEzNywxNSBAQAogICAgICAgICBpZiAoIWVuYWJsZWQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBkaXIgPSAiL2RhdGEvenlnb3RlL3NuYXBzaG90cyI7Ci0gICAgICAgIG5ldyBGaWxlKGRpcikubWtkaXJzKCk7Ci0gICAgICAgIHdyaXRlU25hcHNob3QoZGlyLCAienlnb3RlIik7CisgICAgICAgIHdyaXRlU25hcHNob3QoInp5Z290ZSIsIG51bGwpOwogICAgICAgICBJTlNUQU5DRS5zaHV0ZG93bigpOwogICAgICAgICBJTlNUQU5DRSA9IG51bGw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KFN0cmluZyBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgLyoqCisgICAgICogcGFzcyBpbiBQYWNrYWdlSW5mbyB0byByZXRyaWV2ZSB2YXJpb3VzIHZhbHVlcyBmb3Igc25hcHNob3QgaGVhZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KFN0cmluZyBkaXIsIFN0cmluZyBwcm9jZXNzTmFtZSwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKICAgICAgICAgaWYgKCFlbmFibGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTE0NCw0MCArMTU3LDU1IEBACiAgICAgICAgICAqIHdlIGNhcHR1cmUgdHdvIHNuYXBzaG90cyBpbiByYXBpZCBzdWNjZXNzaW9uLgogICAgICAgICAgKi8KICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IGRpciArICIvIiArIG5hbWUucmVwbGFjZSgnOicsICcuJykgKyAiLSIKLSAgICAgICAgICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5zbmFwc2hvdCI7Ci0KLSAgICAgICAgLy8gVHJ5IHRvIG9wZW4gdGhlIGZpbGUgYSBmZXcgdGltZXMuIFRoZSBTRCBjYXJkIG1heSBub3QgYmUgbW91bnRlZC4KLSAgICAgICAgUHJpbnRTdHJlYW0gb3V0OwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGgpKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ID4gMykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgb3BlbiAiICsgcGF0aCArICIuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTbGVlcCBmb3IgYSBiaXQgYW5kIHRoZW4gdHJ5IGFnYWluLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyNTAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgeyAvKiBpZ25vcmUgKi8gfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9jZXNzTmFtZS5yZXBsYWNlQWxsKCI6IiwgIi4iKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBkaXIgKyAiLyIgKyBuYW1lICsgIi0iICtTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuc25hcHNob3QiOworICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBudWxsOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgb3BlbiAiICsgcGF0aCArICI6IiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZW5lcmF0ZVNuYXBzaG90SGVhZGVyKG5hbWUsIHBhY2thZ2VJbmZvLCBvdXQpOwogICAgICAgICAgICAgSU5TVEFOQ0Uud3JpdGVIcHJvZkRhdGEob3V0KTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIG91dC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChvdXQuY2hlY2tFcnJvcigpKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciB3cml0aW5nIHNuYXBzaG90LiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIldyb3RlIHNuYXBzaG90IGZvciAiICsgbmFtZQotICAgICAgICAgICAgICAgICAgKyAiIGluICIgKyBlbGFwc2VkICsgIm1zLiIpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIC8vIHNldCBmaWxlIHJlYWRhYmxlIHRvIHRoZSB3b3JsZCBzbyB0aGF0IFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlCisgICAgICAgIC8vIGNhbiBwdXQgaXQgdG8gZHJvcGJveAorICAgICAgICBuZXcgRmlsZShwYXRoKS5zZXRSZWFkYWJsZSh0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKKyAgICAgICAgTG9nLmkoVEFHLCAiV3JvdGUgc25hcHNob3QgZm9yICIgKyBuYW1lICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZW5lcmF0ZSBoZWFkZXIgZm9yIHNuYXBzaG90cywgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdCAobGlrZSBodHRwIGhlYWRlcik6CisgICAgICoKKyAgICAgKiBWZXJzaW9uOiA8dmVyc2lvbiBudW1iZXIgb2YgcHJvZmlsZXI+XG4KKyAgICAgKiBQcm9jZXNzOiA8cHJvY2VzcyBuYW1lPlxuCisgICAgICogUGFja2FnZTogPHBhY2thZ2UgbmFtZSwgaWYgZXhpc3RzPlxuCisgICAgICogUGFja2FnZS1WZXJzaW9uOiA8dmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2UsIGlmIGV4aXN0cz5cbgorICAgICAqIEJ1aWxkOiA8ZmluZ2VycHJpbnQ+XG4KKyAgICAgKiBcbgorICAgICAqIDx0aGUgYWN0dWFsIHNuYXBzaG90IGNvbnRlbnQgYmVnaW5zIGhlcmUuLi4+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZVNuYXBzaG90SGVhZGVyKFN0cmluZyBwcm9jZXNzTmFtZSwgUGFja2FnZUluZm8gcGFja2FnZUluZm8sCisgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgLy8gcHJvZmlsZXIgdmVyc2lvbgorICAgICAgICBvdXQucHJpbnRsbigiVmVyc2lvbjogMiIpOworICAgICAgICBvdXQucHJpbnRsbigiUHJvY2VzczogIiArIHByb2Nlc3NOYW1lKTsKKyAgICAgICAgaWYgKHBhY2thZ2VJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJQYWNrYWdlOiAiICsgcGFja2FnZUluZm8ucGFja2FnZU5hbWUpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIlBhY2thZ2UtVmVyc2lvbjogIiArIHBhY2thZ2VJbmZvLnZlcnNpb25Db2RlKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigiQnVpbGQ6ICIgKyBCdWlsZC5GSU5HRVJQUklOVCk7CisgICAgICAgIC8vIHNpbmdsZSBibGFuayBsaW5lIG1lYW5zIHRoZSBlbmQgb2Ygc25hcHNob3QgaGVhZGVyLgorICAgICAgICBvdXQucHJpbnRsbigpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCmluZGV4IGE0MDllYzguLmYwZjMzODcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTG9jYWxTZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwpAQCAtNTA2LDYgKzUwNyw5IEBACiAKICAgICAgICAgY2xvc2VTZXJ2ZXJTb2NrZXQoKTsKIAorICAgICAgICAvLyBzZXQgdW1hc2sgdG8gMDA3NyBzbyBuZXcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHdpbGwgZGVmYXVsdCB0byBvd25lci1vbmx5IHBlcm1pc3Npb25zLgorICAgICAgICBGaWxlVXRpbHMuc2V0VU1hc2soRmlsZVV0aWxzLlNfSVJXWEcgfCBGaWxlVXRpbHMuU19JUldYTyk7CisKICAgICAgICAgLyoKICAgICAgICAgICogUGFzcyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBTeXN0ZW1TZXJ2ZXIuCiAgICAgICAgICAqICItLW5pY2UtbmFtZT1zeXN0ZW1fc2VydmVyIGNvbS5hbmRyb2lkLnNlcnZlci5TeXN0ZW1TZXJ2ZXIiCkBAIC01MjMsNyArNTI3LDcgQEAKICAgICAgICAgU3RyaW5nIGFyZ3NbXSA9IHsKICAgICAgICAgICAgICItLXNldHVpZD0xMDAwIiwKICAgICAgICAgICAgICItLXNldGdpZD0xMDAwIiwKLSAgICAgICAgICAgICItLXNldGdyb3Vwcz0xMDAxLDEwMDIsMTAwMywxMDA0LDEwMDUsMTAwNiwxMDA3LDEwMDgsMTAwOSwxMDEwLDMwMDEsMzAwMiwzMDAzIiwKKyAgICAgICAgICAgICItLXNldGdyb3Vwcz0xMDAxLDEwMDIsMTAwMywxMDA0LDEwMDUsMTAwNiwxMDA3LDEwMDgsMTAwOSwxMDEwLDEwMTgsMzAwMSwzMDAyLDMwMDMiLAogICAgICAgICAgICAgIi0tY2FwYWJpbGl0aWVzPTEzMDEwNDM1MiwxMzAxMDQzNTIiLAogICAgICAgICAgICAgIi0tcnVudGltZS1pbml0IiwKICAgICAgICAgICAgICItLW5pY2UtbmFtZT1zeXN0ZW1fc2VydmVyIiwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyLmFpZGwKaW5kZXggNDUwMWJkNy4uZTg4NGFmOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyLmFpZGwKQEAgLTMwLDUgKzMwLDYgQEAKICAgICB2b2lkIGRpc2FibGUoaW50IHN0YXRlKTsKICAgICB2b2lkIGFuaW1hdGVFeHBhbmQoKTsKICAgICB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpOworICAgIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbik7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbAppbmRleCA4NTI2MzBkLi4wNzYzZjVlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyU2VydmljZS5haWRsCkBAIC0zMCwxNCArMzAsMTggQEAKICAgICB2b2lkIHNldEljb24oU3RyaW5nIHNsb3QsIFN0cmluZyBpY29uUGFja2FnZSwgaW50IGljb25JZCwgaW50IGljb25MZXZlbCk7CiAgICAgdm9pZCBzZXRJY29uVmlzaWJpbGl0eShTdHJpbmcgc2xvdCwgYm9vbGVhbiB2aXNpYmxlKTsKICAgICB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QpOworICAgIHZvaWQgc2V0QWN0aXZlV2luZG93SXNGdWxsc2NyZWVuKGJvb2xlYW4gZnVsbHNjcmVlbik7CiAKICAgICAvLyAtLS0tIE1ldGhvZHMgYmVsb3cgYXJlIGZvciB1c2UgYnkgdGhlIHN0YXR1cyBiYXIgcG9saWN5IHNlcnZpY2VzIC0tLS0KICAgICAvLyBZb3UgbmVlZCB0aGUgU1RBVFVTX0JBUl9TRVJWSUNFIHBlcm1pc3Npb24KICAgICB2b2lkIHJlZ2lzdGVyU3RhdHVzQmFyKElTdGF0dXNCYXIgY2FsbGJhY2tzLCBvdXQgU3RhdHVzQmFySWNvbkxpc3QgaWNvbkxpc3QsCi0gICAgICAgICAgICBvdXQgTGlzdDxJQmluZGVyPiBub3RpZmljYXRpb25LZXlzLCBvdXQgTGlzdDxTdGF0dXNCYXJOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbnMpOworICAgICAgICAgICAgb3V0IExpc3Q8SUJpbmRlcj4gbm90aWZpY2F0aW9uS2V5cywgb3V0IExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zLAorICAgICAgICAgICAgb3V0IGJvb2xlYW5bXSBsaWdodHNPbik7CiAgICAgdm9pZCBvblBhbmVsUmV2ZWFsZWQoKTsKICAgICB2b2lkIG9uTm90aWZpY2F0aW9uQ2xpY2soU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKTsKICAgICB2b2lkIG9uTm90aWZpY2F0aW9uRXJyb3IoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkLAogICAgICAgICAgICAgaW50IHVpZCwgaW50IGluaXRpYWxQaWQsIFN0cmluZyBtZXNzYWdlKTsKICAgICB2b2lkIG9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCk7CisgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsZWFyKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CisgICAgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIG9uKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvU3RhdHVzQmFyTm90aWZpY2F0aW9uLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL1N0YXR1c0Jhck5vdGlmaWNhdGlvbi5qYXZhCmluZGV4IGFhMzQwZmIuLjJiOTZiZjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvU3RhdHVzQmFyTm90aWZpY2F0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9TdGF0dXNCYXJOb3RpZmljYXRpb24uamF2YQpAQCAtMTIxLDYgKzEyMSwxMCBAQAogICAgICAgICByZXR1cm4gKG5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQpICE9IDA7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGVhcmFibGUoKSB7CisgICAgICAgIHJldHVybiAoKG5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQpID09IDApCisgICAgICAgICAgICAgICAgJiYgKChub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19OT19DTEVBUikgPT0gMCk7CisgICAgfQogfQogCiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmphdmEKaW5kZXggZjc4OTMwMS4uMzAzMDMxNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmphdmEKQEAgLTExOTcsNiArMTE5NywzNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEdldCBhIG1lc3NhZ2UgYW5kIHNldCBNZXNzYWdlLnRhcmdldCA9IHRoaXMsCisgICAgICogd2hhdCwgYXJnMSBhbmQgYXJnMgorICAgICAqCisgICAgICogQHBhcmFtIHdoYXQgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2Uud2hhdAorICAgICAqIEBwYXJhbSBhcmcxICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzEKKyAgICAgKiBAcGFyYW0gYXJnMiAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcyCisgICAgICogQHJldHVybiAgQSBNZXNzYWdlIG9iamVjdCBmcm9tIHRoZSBnbG9iYWwgcG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTWVzc2FnZSBvYnRhaW5NZXNzYWdlKGludCB3aGF0LCBpbnQgYXJnMSwgaW50IGFyZzIpCisgICAgeworICAgICAgICByZXR1cm4gTWVzc2FnZS5vYnRhaW4obUhzbUhhbmRsZXIsIHdoYXQsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG1lc3NhZ2UgYW5kIHNldCBNZXNzYWdlLnRhcmdldCA9IHRoaXMsCisgICAgICogd2hhdCwgYXJnMSwgYXJnMiBhbmQgb2JqCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hhdCAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS53aGF0CisgICAgICogQHBhcmFtIGFyZzEgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMQorICAgICAqIEBwYXJhbSBhcmcyICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzIKKyAgICAgKiBAcGFyYW0gb2JqIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2Uub2JqCisgICAgICogQHJldHVybiAgQSBNZXNzYWdlIG9iamVjdCBmcm9tIHRoZSBnbG9iYWwgcG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTWVzc2FnZSBvYnRhaW5NZXNzYWdlKGludCB3aGF0LCBpbnQgYXJnMSwgaW50IGFyZzIsIE9iamVjdCBvYmopCisgICAgeworICAgICAgICByZXR1cm4gTWVzc2FnZS5vYnRhaW4obUhzbUhhbmRsZXIsIHdoYXQsIGFyZzEsIGFyZzIsIG9iaik7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRW5xdWV1ZSBhIG1lc3NhZ2UgdG8gdGhpcyBzdGF0ZSBtYWNoaW5lLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNlbmRNZXNzYWdlKGludCB3aGF0KSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1R5cGVkUHJvcGVydGllcy5qYXZhCmluZGV4IGMyY2UyMTAuLjU2MTM5OTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1R5cGVkUHJvcGVydGllcy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1R5cGVkUHJvcGVydGllcy5qYXZhCkBAIC00MTIsNyArNDEyLDcgQEAKICAgICAgKi8KIAogICAgIC8qKgotICAgICAqIEFuIHVuY2hlY2tlZCBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gaWYgYSB7QGNvZGUgZ2V0Jmx0O1RZUEUmZ3Q7KCl9IG1ldGhvZAorICAgICAqIEFuIHVuY2hlY2tlZCBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gaWYgYSB7QGNvZGUgZ2V0PFRZUEU+KCl9IG1ldGhvZAogICAgICAqIGlzIHVzZWQgdG8gcmV0cmlldmUgYSBwYXJhbWV0ZXIgd2hvc2UgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgbWV0aG9kIG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhCmluZGV4IDhkOGRmMTYuLmUwMGE4NTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0yODQsNiArMjg1LDI2IEBACiAKICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibGlzdCIpOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgd3JpdGVTZXRYbWwoU2V0IHZhbCwgU3RyaW5nIG5hbWUsIFhtbFNlcmlhbGl6ZXIgb3V0KQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInNldCIpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJuYW1lIiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoT2JqZWN0IHYgOiB2YWwpIHsKKyAgICAgICAgICAgIHdyaXRlVmFsdWVYbWwodiwgbnVsbCwgb3V0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic2V0Iik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRmxhdHRlbiBhIGJ5dGVbXSBpbnRvIGFuIFhtbFNlcmlhbGl6ZXIuICBUaGUgbGlzdCBjYW4gbGF0ZXIgYmUgcmVhZCBiYWNrCkBAIC00MjYsNiArNDQ3LDkgQEAKICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgTGlzdCkgewogICAgICAgICAgICAgd3JpdGVMaXN0WG1sKChMaXN0KXYsIG5hbWUsIG91dCk7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIFNldCkgeworICAgICAgICAgICAgd3JpdGVTZXRYbWwoKFNldCl2LCBuYW1lLCBvdXQpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKICAgICAgICAgICAgIC8vIFhYWCBUaGlzIGlzIHRvIGFsbG93IHVzIHRvIGF0IGxlYXN0IHdyaXRlIHNvbWV0aGluZyBpZgogICAgICAgICAgICAgLy8gd2UgZW5jb3VudGVyIHN0eWxlZCB0ZXh0Li4uICBidXQgaXQgbWVhbnMgd2Ugd2lsbCBkcm9wIGFsbApAQCAtNDc2LDcgKzUwMCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaW4gVGhlIElucHV0U3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZC4KICAgICAgKgotICAgICAqIEByZXR1cm4gSGFzaE1hcCBUaGUgcmVzdWx0aW5nIGxpc3QuCisgICAgICogQHJldHVybiBBcnJheUxpc3QgVGhlIHJlc3VsdGluZyBsaXN0LgogICAgICAqCiAgICAgICogQHNlZSAjcmVhZE1hcFhtbAogICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbApAQCAtNDkwLDYgKzUxNCwyOSBAQAogICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOwogICAgICAgICByZXR1cm4gKEFycmF5TGlzdClyZWFkVmFsdWVYbWwocGFyc2VyLCBuZXcgU3RyaW5nWzFdKTsKICAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgZnJvbSBhbiBJbnB1dFN0cmVhbSBjb250YWluaW5nIFhNTC4gVGhlIHN0cmVhbSBjYW4KKyAgICAgKiBwcmV2aW91c2x5IGhhdmUgYmVlbiB3cml0dGVuIGJ5IHdyaXRlU2V0WG1sKCkuCisgICAgICogCisgICAgICogQHBhcmFtIGluIFRoZSBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQuCisgICAgICogCisgICAgICogQHJldHVybiBIYXNoU2V0IFRoZSByZXN1bHRpbmcgc2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbAorICAgICAqIEBzZWUgI3JlYWRUaGlzU2V0WG1sCisgICAgICogQHNlZSAjd3JpdGVTZXRYbWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hTZXQgcmVhZFNldFhtbChJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWwubmV3UHVsbFBhcnNlcigpOworICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOworICAgICAgICByZXR1cm4gKEhhc2hTZXQpIHJlYWRWYWx1ZVhtbChwYXJzZXIsIG5ldyBTdHJpbmdbMV0pOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWQgYSBIYXNoTWFwIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTU3Myw2ICs2MjAsNDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgb2JqZWN0IGZyb20gYW4gWG1sUHVsbFBhcnNlci4gVGhlIFhNTCBkYXRhIGNvdWxkIHByZXZpb3VzbHkKKyAgICAgKiBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHdyaXRlU2V0WG1sKCkuIFRoZSBYbWxQdWxsUGFyc2VyIG11c3QgYmUgcG9zaXRpb25lZAorICAgICAqIDxlbT5hZnRlcjwvZW0+IHRoZSB0YWcgdGhhdCBiZWdpbnMgdGhlIHNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBYbWxQdWxsUGFyc2VyIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgc2V0IGRhdGEuCisgICAgICogQHBhcmFtIGVuZFRhZyBOYW1lIG9mIHRoZSB0YWcgdGhhdCB3aWxsIGVuZCB0aGUgc2V0LCB1c3VhbGx5ICJzZXQiLgorICAgICAqIEBwYXJhbSBuYW1lIEFuIGFycmF5IG9mIG9uZSBzdHJpbmcsIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIGF0dHJpYnV0ZQorICAgICAqICAgICAgICAgICAgIG9mIHRoZSBzZXQncyB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhhc2hTZXQgVGhlIG5ld2x5IGdlbmVyYXRlZCBzZXQuCisgICAgICogCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSAjcmVhZFNldFhtbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSGFzaFNldCByZWFkVGhpc1NldFhtbChYbWxQdWxsUGFyc2VyIHBhcnNlciwgU3RyaW5nIGVuZFRhZywgU3RyaW5nW10gbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAKKyAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBwYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHJlYWRUaGlzVmFsdWVYbWwocGFyc2VyLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBzZXQuYWRkKHZhbCk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyB0byBzZXQ6ICIgKyB2YWwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gcGFyc2VyLkVORF9UQUcpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoZW5kVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAiICsgZW5kVGFnICsgIiBlbmQgdGFnIGF0OiAiICsgcGFyc2VyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICB9IHdoaWxlIChldmVudFR5cGUgIT0gcGFyc2VyLkVORF9ET0NVTUVOVCk7CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZWFkIGFuIGludFtdIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTc0MCw2ICs4MjgsMTIgQEAKICAgICAgICAgICAgIG5hbWVbMF0gPSB2YWx1ZU5hbWU7CiAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuaW5nIHZhbHVlIGZvciAiICsgdmFsdWVOYW1lICsgIjogIiArIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKCJzZXQiKSkgeworICAgICAgICAgICAgcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgIHJlcyA9IHJlYWRUaGlzU2V0WG1sKHBhcnNlciwgInNldCIsIG5hbWUpOworICAgICAgICAgICAgbmFtZVswXSA9IHZhbHVlTmFtZTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5pbmcgdmFsdWUgZm9yICIgKyB2YWx1ZU5hbWUgKyAiOiAiICsgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiVW5rbm93biB0YWc6ICIgKyB0YWdOYW1lKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0Jhc2VJV2luZG93LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhCmluZGV4IDRkYTc0ZTYuLmQ1MjEzZGIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0Jhc2VJV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvQmFzZUlXaW5kb3cuamF2YQpAQCAtMTYsMTEgKzE2LDE0IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldzsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93U2Vzc2lvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC02Niw3ICs2OSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEcmFnRXZlbnQoRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hXYWxscGFwZXJDb21tYW5kKFN0cmluZyBhY3Rpb24sIGludCB4LCBpbnQgeSwKICAgICAgICAgICAgIGludCB6LCBCdW5kbGUgZXh0cmFzLCBib29sZWFuIHN5bmMpIHsKICAgICAgICAgaWYgKHN5bmMpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZC5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kLmFpZGwKaW5kZXggOGZmMThlZC4uYzdmY2FiOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kLmFpZGwKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0QmluZGluZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0Q29udGV4dDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZENhbGxiYWNrOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kU2Vzc2lvbjsKQEAgLTUyLDQgKzUzLDYgQEAKICAgICB2b2lkIHNob3dTb2Z0SW5wdXQoaW50IGZsYWdzLCBpbiBSZXN1bHRSZWNlaXZlciByZXN1bHRSZWNlaXZlcik7CiAgICAgCiAgICAgdm9pZCBoaWRlU29mdElucHV0KGludCBmbGFncywgaW4gUmVzdWx0UmVjZWl2ZXIgcmVzdWx0UmVjZWl2ZXIpOworCisgICAgdm9pZCBjaGFuZ2VJbnB1dE1ldGhvZFN1YnR5cGUoaW4gSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kTWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kTWFuYWdlci5haWRsCmluZGV4IGFkZWMwYTcuLmJmZmVjMWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZE1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RNYW5hZ2VyLmFpZGwKQEAgLTQ4LDYgKzQ4LDggQEAKICAgICAgICAgICAgIGludCBzb2Z0SW5wdXRNb2RlLCBib29sZWFuIGZpcnN0LCBpbnQgd2luZG93RmxhZ3MpOwogICAgICAgICAgICAgCiAgICAgdm9pZCBzaG93SW5wdXRNZXRob2RQaWNrZXJGcm9tQ2xpZW50KGluIElJbnB1dE1ldGhvZENsaWVudCBjbGllbnQpOworICAgIHZvaWQgc2hvd0lucHV0TWV0aG9kU3VidHlwZVBpY2tlckZyb21DbGllbnQoaW4gSUlucHV0TWV0aG9kQ2xpZW50IGNsaWVudCk7CisgICAgdm9pZCBzaG93SW5wdXRNZXRob2RBbmRTdWJ0eXBlRW5hYmxlckZyb21DbGllbnQoaW4gSUlucHV0TWV0aG9kQ2xpZW50IGNsaWVudCwgU3RyaW5nIHRvcElkKTsKICAgICB2b2lkIHNldElucHV0TWV0aG9kKGluIElCaW5kZXIgdG9rZW4sIFN0cmluZyBpZCk7CiAgICAgdm9pZCBoaWRlTXlTb2Z0SW5wdXQoaW4gSUJpbmRlciB0b2tlbiwgaW50IGZsYWdzKTsKICAgICB2b2lkIHNob3dNeVNvZnRJbnB1dChpbiBJQmluZGVyIHRva2VuLCBpbnQgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSW5wdXRNZXRob2RBbmRTdWJ0eXBlRW5hYmxlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSW5wdXRNZXRob2RBbmRTdWJ0eXBlRW5hYmxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGQ0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JbnB1dE1ldGhvZEFuZFN1YnR5cGVFbmFibGVyLmphdmEKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuQ2hlY2tCb3hQcmVmZXJlbmNlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgSW5wdXRNZXRob2RBbmRTdWJ0eXBlRW5hYmxlciBleHRlbmRzIFByZWZlcmVuY2VBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVIYXJkS2V5Ym9hcmQ7CisKKyAgICBwcml2YXRlIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBtSW5wdXRNZXRob2RQcm9wZXJ0aWVzOworCisgICAgcHJpdmF0ZSBmaW5hbCBUZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXIgbVN0cmluZ0NvbG9uU3BsaXR0ZXIKKyAgICAgICAgICAgID0gbmV3IFRleHRVdGlscy5TaW1wbGVTdHJpbmdTcGxpdHRlcignOicpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RJbnB1dE1ldGhvZElkOworICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0VGlja2VkSW5wdXRNZXRob2RJZDsKKworICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbURpYWxvZyA9IG51bGw7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBtSGF2ZUhhcmRLZXlib2FyZCA9IChjb25maWcua2V5Ym9hcmQgPT0gQ29uZmlndXJhdGlvbi5LRVlCT0FSRF9RV0VSVFkpOworICAgICAgICBvbkNyZWF0ZUlNTSgpOworICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKGNyZWF0ZVByZWZlcmVuY2VIaWVyYXJjaHkoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIGxvYWRJbnB1dE1ldGhvZFN1YnR5cGVMaXN0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBzYXZlSW5wdXRNZXRob2RTdWJ0eXBlTGlzdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uUHJlZmVyZW5jZVRyZWVDbGljaygKKyAgICAgICAgICAgIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSBwcmVmZXJlbmNlKSB7CisKKyAgICAgICAgaWYgKHByZWZlcmVuY2UgaW5zdGFuY2VvZiBDaGVja0JveFByZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGZpbmFsIENoZWNrQm94UHJlZmVyZW5jZSBjaGtQcmVmID0gKENoZWNrQm94UHJlZmVyZW5jZSkgcHJlZmVyZW5jZTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGNoa1ByZWYuZ2V0S2V5KCk7CisgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayBzdWJ0eXBlIG9yIG5vdCBoZXJlCisgICAgICAgICAgICBpZiAoY2hrUHJlZi5pc0NoZWNrZWQoKSkgeworICAgICAgICAgICAgICAgIElucHV0TWV0aG9kSW5mbyBzZWxJbWkgPSBudWxsOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUlucHV0TWV0aG9kUHJvcGVydGllcy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGltaSA9IG1JbnB1dE1ldGhvZFByb3BlcnRpZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWQuZXF1YWxzKGltaS5nZXRJZCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VsSW1pID0gaW1pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3lzdGVtSW1lKGltaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdWJ0eXBlc1ByZWZlcmVuY2VFbmFibGVkKGlkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgYnVpbHQtaW4gSU1FLCBzbyBubyBuZWVkIHRvIHdhcm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUaWNrZWRJbnB1dE1ldGhvZElkID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uUHJlZmVyZW5jZVRyZWVDbGljayhwcmVmZXJlbmNlU2NyZWVuLCBwcmVmZXJlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzZWxJbWkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25QcmVmZXJlbmNlVHJlZUNsaWNrKHByZWZlcmVuY2VTY3JlZW4sIHByZWZlcmVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGtQcmVmLnNldENoZWNrZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChtRGlhbG9nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURpYWxvZyA9IChuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoYW5kcm9pZC5SLnN0cmluZy5kaWFsb2dfYWxlcnRfdGl0bGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX2RpYWxvZ19hbGVydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2FuY2VsYWJsZSh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihhbmRyb2lkLlIuc3RyaW5nLm9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hrUHJlZi5zZXRDaGVja2VkKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdWJ0eXBlc1ByZWZlcmVuY2VFbmFibGVkKGlkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUaWNrZWRJbnB1dE1ldGhvZElkID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmVnYXRpdmVCdXR0b24oYW5kcm9pZC5SLnN0cmluZy5jYW5jZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGlhbG9nLmlzU2hvd2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGlhbG9nLnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuaW1lX2VuYWJsZXJfc2VjdXJpdHlfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbEltaS5nZXRTZXJ2aWNlSW5mbygpLmFwcGxpY2F0aW9uSW5mby5sb2FkTGFiZWwoZ2V0UGFja2FnZU1hbmFnZXIoKSkpKTsKKyAgICAgICAgICAgICAgICBtRGlhbG9nLnNob3coKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhtTGFzdFRpY2tlZElucHV0TWV0aG9kSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VGlja2VkSW5wdXRNZXRob2RJZCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFN1YnR5cGVzUHJlZmVyZW5jZUVuYWJsZWQoaWQsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25QcmVmZXJlbmNlVHJlZUNsaWNrKHByZWZlcmVuY2VTY3JlZW4sIHByZWZlcmVuY2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgbURpYWxvZyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25DcmVhdGVJTU0oKSB7CisgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOworCisgICAgICAgIC8vIFRPRE86IENoYW5nZSBtSW5wdXRNZXRob2RQcm9wZXJ0aWVzIHRvIE1hcAorICAgICAgICBtSW5wdXRNZXRob2RQcm9wZXJ0aWVzID0gaW1tLmdldElucHV0TWV0aG9kTGlzdCgpOworCisgICAgICAgIG1MYXN0SW5wdXRNZXRob2RJZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFByZWZlcmVuY2VTY3JlZW4gY3JlYXRlUHJlZmVyZW5jZUhpZXJhcmNoeSgpIHsKKyAgICAgICAgLy8gUm9vdAorICAgICAgICBQcmVmZXJlbmNlU2NyZWVuIHJvb3QgPSBnZXRQcmVmZXJlbmNlTWFuYWdlcigpLmNyZWF0ZVByZWZlcmVuY2VTY3JlZW4odGhpcyk7CisKKyAgICAgICAgaW50IE4gPSAobUlucHV0TWV0aG9kUHJvcGVydGllcyA9PSBudWxsID8gMCA6IG1JbnB1dE1ldGhvZFByb3BlcnRpZXMuc2l6ZSgpKTsKKyAgICAgICAgLy8gVE9ETzogVXNlIGl0ZXJhdG9yLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47ICsraSkgeworICAgICAgICAgICAgUHJlZmVyZW5jZUNhdGVnb3J5IGtleWJvYXJkU2V0dGluZ3NDYXRlZ29yeSA9IG5ldyBQcmVmZXJlbmNlQ2F0ZWdvcnkodGhpcyk7CisgICAgICAgICAgICByb290LmFkZFByZWZlcmVuY2Uoa2V5Ym9hcmRTZXR0aW5nc0NhdGVnb3J5KTsKKyAgICAgICAgICAgIElucHV0TWV0aG9kSW5mbyBwcm9wZXJ0eSA9IG1JbnB1dE1ldGhvZFByb3BlcnRpZXMuZ2V0KGkpOworICAgICAgICAgICAgU3RyaW5nIHByZWZLZXkgPSBwcm9wZXJ0eS5nZXRJZCgpOworCisgICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbGFiZWwgPSBwcm9wZXJ0eS5sb2FkTGFiZWwocG0pOworICAgICAgICAgICAgYm9vbGVhbiBzeXN0ZW1JTUUgPSBpc1N5c3RlbUltZShwcm9wZXJ0eSk7CisKKyAgICAgICAgICAgIGtleWJvYXJkU2V0dGluZ3NDYXRlZ29yeS5zZXRUaXRsZShsYWJlbCk7CisKKyAgICAgICAgICAgIC8vIEFkZCBhIGNoZWNrIGJveC4KKyAgICAgICAgICAgIC8vIERvbid0IHNob3cgdGhlIHRvZ2dsZSBpZiBpdCdzIHRoZSBvbmx5IGtleWJvYXJkIGluIHRoZSBzeXN0ZW0sIG9yIGl0J3MgYSBzeXN0ZW0gSU1FLgorICAgICAgICAgICAgaWYgKG1IYXZlSGFyZEtleWJvYXJkIHx8IChOID4gMSAmJiAhc3lzdGVtSU1FKSkgeworICAgICAgICAgICAgICAgIENoZWNrQm94UHJlZmVyZW5jZSBjaGtieFByZWYgPSBuZXcgQ2hlY2tCb3hQcmVmZXJlbmNlKHRoaXMpOworICAgICAgICAgICAgICAgIGNoa2J4UHJlZi5zZXRLZXkocHJlZktleSk7CisgICAgICAgICAgICAgICAgY2hrYnhQcmVmLnNldFRpdGxlKGxhYmVsKTsKKyAgICAgICAgICAgICAgICBrZXlib2FyZFNldHRpbmdzQ2F0ZWdvcnkuYWRkUHJlZmVyZW5jZShjaGtieFByZWYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBzdWJ0eXBlcyA9IHByb3BlcnR5LmdldFN1YnR5cGVzKCk7CisgICAgICAgICAgICBpZiAoc3VidHlwZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIFByZWZlcmVuY2VDYXRlZ29yeSBzdWJ0eXBlc0NhdGVnb3J5ID0gbmV3IFByZWZlcmVuY2VDYXRlZ29yeSh0aGlzKTsKKyAgICAgICAgICAgICAgICBzdWJ0eXBlc0NhdGVnb3J5LnNldFRpdGxlKGdldFJlc291cmNlcygpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmltZV9lbmFibGVyX3N1YnR5cGVfdGl0bGUsIGxhYmVsKSk7CisgICAgICAgICAgICAgICAgcm9vdC5hZGRQcmVmZXJlbmNlKHN1YnR5cGVzQ2F0ZWdvcnkpOworICAgICAgICAgICAgICAgIGZvciAoSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGU6IHN1YnR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBzdWJ0eXBlTGFiZWw7CisgICAgICAgICAgICAgICAgICAgIGludCBuYW1lUmVzSWQgPSBzdWJ0eXBlLmdldE5hbWVSZXNJZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVJlc0lkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGVMYWJlbCA9IHBtLmdldFRleHQocHJvcGVydHkuZ2V0UGFja2FnZU5hbWUoKSwgbmFtZVJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRTZXJ2aWNlSW5mbygpLmFwcGxpY2F0aW9uSW5mbyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZVJlc0lkID0gc3VidHlwZS5nZXRNb2RlUmVzSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBsYW5ndWFnZSA9IHN1YnR5cGUuZ2V0TG9jYWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbW9kZSA9IG1vZGVSZXNJZCA9PSAwID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBtLmdldFRleHQocHJvcGVydHkuZ2V0UGFja2FnZU5hbWUoKSwgbW9kZVJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldFNlcnZpY2VJbmZvKCkuYXBwbGljYXRpb25JbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzZSBtb3JlIGZyaWVuZGx5IFRpdGxlIGFuZCBVSQorICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZUxhYmVsID0gKG1vZGUgPT0gbnVsbCA/ICIiIDogbW9kZSkgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAobGFuZ3VhZ2UgPT0gbnVsbCA/ICIiIDogbGFuZ3VhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENoZWNrQm94UHJlZmVyZW5jZSBjaGtieFByZWYgPSBuZXcgQ2hlY2tCb3hQcmVmZXJlbmNlKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBjaGtieFByZWYuc2V0S2V5KHByZWZLZXkgKyBzdWJ0eXBlLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgICAgICAgICBjaGtieFByZWYuc2V0VGl0bGUoc3VidHlwZUxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgY2hrYnhQcmVmLnNldFN1bW1hcnkobGFiZWwpOworICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlc0NhdGVnb3J5LmFkZFByZWZlcmVuY2UoY2hrYnhQcmVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRJbnB1dE1ldGhvZFN1YnR5cGVMaXN0KCkgeworICAgICAgICBmaW5hbCBIYXNoU2V0PFN0cmluZz4gZW5hYmxlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgU3RyaW5nIGVuYWJsZWRTdHIgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKGdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0lOUFVUX01FVEhPRFMpOworICAgICAgICBpZiAoZW5hYmxlZFN0ciAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBUZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXIgc3BsaXR0ZXIgPSBtU3RyaW5nQ29sb25TcGxpdHRlcjsKKyAgICAgICAgICAgIHNwbGl0dGVyLnNldFN0cmluZyhlbmFibGVkU3RyKTsKKyAgICAgICAgICAgIHdoaWxlIChzcGxpdHRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBlbmFibGVkLmFkZChzcGxpdHRlci5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBzdGF0dXNlcyBvZiB0aGUgQ2hlY2sgQm94ZXMuCisgICAgICAgIGludCBOID0gbUlucHV0TWV0aG9kUHJvcGVydGllcy5zaXplKCk7CisgICAgICAgIC8vIFRPRE86IFVzZSBpdGVyYXRvci4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IG1JbnB1dE1ldGhvZFByb3BlcnRpZXMuZ2V0KGkpLmdldElkKCk7CisgICAgICAgICAgICBDaGVja0JveFByZWZlcmVuY2UgcHJlZiA9IChDaGVja0JveFByZWZlcmVuY2UpIGZpbmRQcmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICBtSW5wdXRNZXRob2RQcm9wZXJ0aWVzLmdldChpKS5nZXRJZCgpKTsKKyAgICAgICAgICAgIGlmIChwcmVmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IGVuYWJsZWQuY29udGFpbnMoaWQpOworICAgICAgICAgICAgICAgIHByZWYuc2V0Q2hlY2tlZChpc0VuYWJsZWQpOworICAgICAgICAgICAgICAgIHNldFN1YnR5cGVzUHJlZmVyZW5jZUVuYWJsZWQoaWQsIGlzRW5hYmxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RUaWNrZWRJbnB1dE1ldGhvZElkID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2F2ZUlucHV0TWV0aG9kU3VidHlwZUxpc3QoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgZGlzYWJsZWRTeXNJbWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBpbnQgZmlyc3RFbmFibGVkID0gLTE7CisgICAgICAgIGludCBOID0gbUlucHV0TWV0aG9kUHJvcGVydGllcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZEluZm8gcHJvcGVydHkgPSBtSW5wdXRNZXRob2RQcm9wZXJ0aWVzLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IHByb3BlcnR5LmdldElkKCk7CisgICAgICAgICAgICBDaGVja0JveFByZWZlcmVuY2UgcHJlZiA9IChDaGVja0JveFByZWZlcmVuY2UpIGZpbmRQcmVmZXJlbmNlKGlkKTsKKyAgICAgICAgICAgIGJvb2xlYW4gY3VycmVudElucHV0TWV0aG9kID0gaWQuZXF1YWxzKG1MYXN0SW5wdXRNZXRob2RJZCk7CisgICAgICAgICAgICBib29sZWFuIHN5c3RlbUltZSA9IGlzU3lzdGVtSW1lKHByb3BlcnR5KTsKKyAgICAgICAgICAgIC8vIFRPRE86IEFwcGVuZCBzdWJ0eXBlcyBieSB1c2luZyB0aGUgc2VwYXJhdG9yICI7IgorICAgICAgICAgICAgaWYgKCgoTiA9PSAxIHx8IHN5c3RlbUltZSkgJiYgIW1IYXZlSGFyZEtleWJvYXJkKQorICAgICAgICAgICAgICAgICAgICB8fCAocHJlZiAhPSBudWxsICYmIHByZWYuaXNDaGVja2VkKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSBidWlsZGVyLmFwcGVuZCgnOicpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGlkKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RFbmFibGVkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdEVuYWJsZWQgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudElucHV0TWV0aG9kKSB7CisgICAgICAgICAgICAgICAgbUxhc3RJbnB1dE1ldGhvZElkID0gbUxhc3RUaWNrZWRJbnB1dE1ldGhvZElkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgaXQncyBhIGRpc2FibGVkIHN5c3RlbSBpbWUsIGFkZCBpdCB0byB0aGUgZGlzYWJsZWQgbGlzdCBzbyB0aGF0IGl0CisgICAgICAgICAgICAvLyBkb2Vzbid0IGdldCBlbmFibGVkIGF1dG9tYXRpY2FsbHkgb24gYW55IGNoYW5nZXMgdG8gdGhlIHBhY2thZ2UgbGlzdAorICAgICAgICAgICAgaWYgKHByZWYgIT0gbnVsbCAmJiAhcHJlZi5pc0NoZWNrZWQoKSAmJiBzeXN0ZW1JbWUgJiYgbUhhdmVIYXJkS2V5Ym9hcmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWRTeXNJbWVzLmxlbmd0aCgpID4gMCkgZGlzYWJsZWRTeXNJbWVzLmFwcGVuZCgiOiIpOworICAgICAgICAgICAgICAgIGRpc2FibGVkU3lzSW1lcy5hcHBlbmQoaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIGxhc3QgaW5wdXQgbWV0aG9kIGlzIHVuc2V0LCBzZXQgaXQgYXMgdGhlIGZpcnN0IGVuYWJsZWQgb25lLgorICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobUxhc3RJbnB1dE1ldGhvZElkKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0RW5hYmxlZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbUxhc3RJbnB1dE1ldGhvZElkID0gbUlucHV0TWV0aG9kUHJvcGVydGllcy5nZXQoZmlyc3RFbmFibGVkKS5nZXRJZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtTGFzdElucHV0TWV0aG9kSWQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhnZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9JTlBVVF9NRVRIT0RTLCBidWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKGdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ESVNBQkxFRF9TWVNURU1fSU5QVVRfTUVUSE9EUywgZGlzYWJsZWRTeXNJbWVzLnRvU3RyaW5nKCkpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKGdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCwKKyAgICAgICAgICAgICAgICBtTGFzdElucHV0TWV0aG9kSWQgIT0gbnVsbCA/IG1MYXN0SW5wdXRNZXRob2RJZCA6ICIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U3VidHlwZXNQcmVmZXJlbmNlRW5hYmxlZChTdHJpbmcgaWQsIGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGZpbmFsIGludCBOID0gbUlucHV0TWV0aG9kUHJvcGVydGllcy5zaXplKCk7CisgICAgICAgIC8vIFRPRE86IFVzZSBpdGVyYXRvci4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIElucHV0TWV0aG9kSW5mbyBpbWkgPSBtSW5wdXRNZXRob2RQcm9wZXJ0aWVzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoaW1pLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgZm9yIChJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZTogaW1pLmdldFN1YnR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5maW5kUHJlZmVyZW5jZShpZCArIHN1YnR5cGUuaGFzaENvZGUoKSkuc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1JbWUoSW5wdXRNZXRob2RJbmZvIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiAocHJvcGVydHkuZ2V0U2VydmljZUluZm8oKS5hcHBsaWNhdGlvbkluZm8uZmxhZ3MKKyAgICAgICAgICAgICAgICAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NZU1RFTSkgIT0gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9TdGFuZGFsb25lQWN0aW9uTW9kZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvU3RhbmRhbG9uZUFjdGlvbk1vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzgxOTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvU3RhbmRhbG9uZUFjdGlvbk1vZGUuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKK3B1YmxpYyBjbGFzcyBTdGFuZGFsb25lQWN0aW9uTW9kZSBleHRlbmRzIEFjdGlvbk1vZGUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUNvbnRleHRWaWV3OworICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFZpZXc+IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CisKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworCisgICAgcHVibGljIFN0YW5kYWxvbmVBY3Rpb25Nb2RlKENvbnRleHQgY29udGV4dCwgQWN0aW9uQmFyQ29udGV4dFZpZXcgdmlldywKKyAgICAgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQ29udGV4dFZpZXcgPSB2aWV3OworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgICAgICBtTWVudSA9IG5ldyBNZW51QnVpbGRlcihjb250ZXh0KS5zZXREZWZhdWx0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1Db250ZXh0Vmlldy5zZXRDdXN0b21WaWV3KHZpZXcpOworICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXcgIT0gbnVsbCA/IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXc+KHZpZXcpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBtQ2FsbGJhY2sub25QcmVwYXJlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBpZiAobUZpbmlzaGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKworICAgICAgICBtQ2FsbGJhY2sub25EZXN0cm95QWN0aW9uTW9kZSh0aGlzKTsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgeworICAgICAgICByZXR1cm4gbU1lbnU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0Vmlldy5nZXRUaXRsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dFZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbVZpZXcgIT0gbnVsbCA/IG1DdXN0b21WaWV3LmdldCgpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUluZmxhdGVyIGdldE1lbnVJbmZsYXRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZW51SW5mbGF0ZXIobUNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHJldHVybiBtQ2FsbGJhY2sub25BY3Rpb25JdGVtQ2xpY2tlZCh0aGlzLCBpdGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uU3ViTWVudVNlbGVjdGVkKFN1Yk1lbnVCdWlsZGVyIHN1Yk1lbnUpIHsKKyAgICAgICAgaWYgKCFzdWJNZW51Lmhhc1Zpc2libGVJdGVtcygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIobUNvbnRleHQsIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uTWVudU1vZGVDaGFuZ2UoTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIG1Db250ZXh0Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ0ZWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudSBpbXBsZW1lbnRzIE1lbnUgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUXdlcnR5OworICAgIAorICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBtSXRlbXM7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGVSZXMpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoZ3JvdXBJZCwgaXRlbUlkLCBvcmRlciwgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKHRpdGxlUmVzKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBuZXcgQWN0aW9uTWVudUl0ZW0oZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIGdyb3VwSWQsIGl0ZW1JZCwgMCwgb3JkZXIsIHRpdGxlKTsKKyAgICAgICAgbUl0ZW1zLmFkZChvcmRlciwgaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYWRkSW50ZW50T3B0aW9ucyhpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLAorICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjYWxsZXIsIEludGVudFtdIHNwZWNpZmljcywgSW50ZW50IGludGVudCwgaW50IGZsYWdzLAorICAgICAgICAgICAgTWVudUl0ZW1bXSBvdXRTcGVjaWZpY0l0ZW1zKSB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvbHZlSW5mbz4gbHJpID0KKyAgICAgICAgICAgICAgICBwbS5xdWVyeUludGVudEFjdGl2aXR5T3B0aW9ucyhjYWxsZXIsIHNwZWNpZmljcywgaW50ZW50LCAwKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBscmkgIT0gbnVsbCA/IGxyaS5zaXplKCkgOiAwOworCisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FQUEVORF9UT19HUk9VUCkgPT0gMCkgeworICAgICAgICAgICAgcmVtb3ZlR3JvdXAoZ3JvdXBJZCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvbHZlSW5mbyByaSA9IGxyaS5nZXQoaSk7CisgICAgICAgICAgICBJbnRlbnQgcmludGVudCA9IG5ldyBJbnRlbnQoCisgICAgICAgICAgICAgICAgcmkuc3BlY2lmaWNJbmRleCA8IDAgPyBpbnRlbnQgOiBzcGVjaWZpY3Nbcmkuc3BlY2lmaWNJbmRleF0pOworICAgICAgICAgICAgcmludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5uYW1lKSk7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbSBpdGVtID0gYWRkKGdyb3VwSWQsIGl0ZW1JZCwgb3JkZXIsIHJpLmxvYWRMYWJlbChwbSkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKHJpLmxvYWRJY29uKHBtKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVudChyaW50ZW50KTsKKyAgICAgICAgICAgIGlmIChvdXRTcGVjaWZpY0l0ZW1zICE9IG51bGwgJiYgcmkuc3BlY2lmaWNJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0U3BlY2lmaWNJdGVtc1tyaS5zcGVjaWZpY0luZGV4XSA9IGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCB0aXRsZVJlcykgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLCBpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1JdGVtcy5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBmaW5kSXRlbUluZGV4KGludCBpZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZ2V0KGkpLmdldEl0ZW1JZCgpID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZmluZEl0ZW0oaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGZpbmRJdGVtSW5kZXgoaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1Zpc2libGVJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVJdGVtIGZpbmRJdGVtV2l0aFNob3J0Y3V0KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyBUT0RPIE1ha2UgdGhpcyBzbWFydGVyLgorICAgICAgICBmaW5hbCBib29sZWFuIHF3ZXJ0eSA9IG1Jc1F3ZXJ0eTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBjaGFyIHNob3J0Y3V0ID0gcXdlcnR5ID8gaXRlbS5nZXRBbHBoYWJldGljU2hvcnRjdXQoKSA6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TnVtZXJpY1Nob3J0Y3V0KCk7CisgICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSBzaG9ydGN1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dChrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSWRlbnRpZmllckFjdGlvbihpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBmaW5kSXRlbUluZGV4KGlkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1TaG9ydGN1dChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQsIGludCBmbGFncykgeworICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gZmluZEl0ZW1XaXRoU2hvcnRjdXQoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBpdGVtLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKGludCBncm91cElkKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBpdGVtQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuZ2V0R3JvdXBJZCgpID09IGdyb3VwSWQpIHsKKyAgICAgICAgICAgICAgICBpdGVtcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgaXRlbUNvdW50LS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUl0ZW0oaW50IGlkKSB7CisgICAgICAgIG1JdGVtcy5yZW1vdmUoZmluZEl0ZW1JbmRleChpZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwQ2hlY2thYmxlKGludCBncm91cCwgYm9vbGVhbiBjaGVja2FibGUsCisgICAgICAgICAgICBib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2thYmxlKGNoZWNrYWJsZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRFeGNsdXNpdmVDaGVja2FibGUoZXhjbHVzaXZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwRW5hYmxlZChpbnQgZ3JvdXAsIGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwVmlzaWJsZShpbnQgZ3JvdXAsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF3ZXJ0eU1vZGUoYm9vbGVhbiBpc1F3ZXJ0eSkgeworICAgICAgICBtSXNRd2VydHkgPSBpc1F3ZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg1MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVJdGVtIGltcGxlbWVudHMgTWVudUl0ZW0geworICAgIHByaXZhdGUgZmluYWwgaW50IG1JZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtR3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNhdGVnb3J5T3JkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9yZGVyaW5nOworICAgIAorICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGVDb25kZW5zZWQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIGNoYXIgbVNob3J0Y3V0TnVtZXJpY0NoYXI7CisgICAgcHJpdmF0ZSBjaGFyIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyOworICAgIAorICAgIHByaXZhdGUgRHJhd2FibGUgbUljb25EcmF3YWJsZTsKKyAgICBwcml2YXRlIGludCBtSWNvblJlc0lkID0gTk9fSUNPTjsKKyAgICAKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgCisgICAgcHJpdmF0ZSBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtQ2xpY2tMaXN0ZW5lcjsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUNPTiA9IDA7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUZsYWdzID0gRU5BQkxFRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tBQkxFICAgICAgPSAweDAwMDAwMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEVDS0VEICAgICAgICA9IDB4MDAwMDAwMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtKENvbnRleHQgY29udGV4dCwgaW50IGdyb3VwLCBpbnQgaWQsIGludCBjYXRlZ29yeU9yZGVyLCBpbnQgb3JkZXJpbmcsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgICAgIG1DYXRlZ29yeU9yZGVyID0gY2F0ZWdvcnlPcmRlcjsKKyAgICAgICAgbU9yZGVyaW5nID0gb3JkZXJpbmc7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY2hhciBnZXRBbHBoYWJldGljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXRBbHBoYWJldGljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEdyb3VwSWQoKSB7CisgICAgICAgIHJldHVybiBtR3JvdXA7CisgICAgfQorCisgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBtSWNvbkRyYXdhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICByZXR1cm4gbUludGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGV4dE1lbnVJbmZvIGdldE1lbnVJbmZvKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBnZXROdW1lcmljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXROdW1lcmljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE9yZGVyKCkgeworICAgICAgICByZXR1cm4gbU9yZGVyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGdldFN1Yk1lbnUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZUNvbmRlbnNlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZUNvbmRlbnNlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJNZW51KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2FibGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tBQkxFKSAhPSAwOyAKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgRU5BQkxFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgSElEREVOKSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBbHBoYWJldGljU2hvcnRjdXQoY2hhciBhbHBoYUNoYXIpIHsKKyAgICAgICAgbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXIgPSBhbHBoYUNoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2FibGUoYm9vbGVhbiBjaGVja2FibGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5DSEVDS0FCTEUpIHwgKGNoZWNrYWJsZSA/IENIRUNLQUJMRSA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtIHNldEV4Y2x1c2l2ZUNoZWNrYWJsZShib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVYQ0xVU0lWRSkgfCAoZXhjbHVzaXZlID8gRVhDTFVTSVZFIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkNIRUNLRUQpIHwgKGNoZWNrZWQgPyBDSEVDS0VEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVOQUJMRUQpIHwgKGVuYWJsZWQgPyBFTkFCTEVEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IGljb247CisgICAgICAgIG1JY29uUmVzSWQgPSBOT19JQ09OOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SWNvbihpbnQgaWNvblJlcykgeworICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlczsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKGljb25SZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldE51bWVyaWNTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyKSB7CisgICAgICAgIG1TaG9ydGN1dE51bWVyaWNDaGFyID0gbnVtZXJpY0NoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtZW51SXRlbUNsaWNrTGlzdGVuZXIpIHsKKyAgICAgICAgbUNsaWNrTGlzdGVuZXIgPSBtZW51SXRlbUNsaWNrTGlzdGVuZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyLCBjaGFyIGFscGhhQ2hhcikgeworICAgICAgICBtU2hvcnRjdXROdW1lcmljQ2hhciA9IG51bWVyaWNDaGFyOworICAgICAgICBtU2hvcnRjdXRBbHBoYWJldGljQ2hhciA9IGFscGhhQ2hhcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKGludCB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcodGl0bGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VGl0bGVDb25kZW5zZWQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZUNvbmRlbnNlZCA9IHRpdGxlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIEhJRERFTikgfCAodmlzaWJsZSA/IDAgOiBISURERU4pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2UoKSB7CisgICAgICAgIGlmIChtQ2xpY2tMaXN0ZW5lciAhPSBudWxsICYmIG1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayh0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobUludGVudCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IHNob3cpIHsKKyAgICAgICAgLy8gRG8gbm90aGluZy4gQWN0aW9uTWVudUl0ZW1zIGFsd2F5cyBzaG93IGFzIGFjdGlvbiBidXR0b25zLgorICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KFZpZXcgYWN0aW9uVmlldykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MzhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudUl0ZW1WaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQKKyAgICAgICAgaW1wbGVtZW50cyBNZW51Vmlldy5JdGVtVmlldywgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWN0aW9uTWVudUl0ZW1WaWV3IjsKKworICAgIHByaXZhdGUgTWVudUl0ZW1JbXBsIG1JdGVtRGF0YTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBNZW51QnVpbGRlci5JdGVtSW52b2tlciBtSXRlbUludm9rZXI7CisKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1JbWFnZUJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBtVGV4dEJ1dHRvbjsKKworICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uQnV0dG9uU3R5bGUpOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoSW5mbGF0ZSgpIHsKKyAgICAgICAgbUltYWdlQnV0dG9uID0gKEltYWdlQnV0dG9uKSBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pbWFnZUJ1dHRvbik7CisgICAgICAgIG1UZXh0QnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dEJ1dHRvbik7CisgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1UZXh0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW1JbXBsIGdldEl0ZW1EYXRhKCkgeworICAgICAgICByZXR1cm4gbUl0ZW1EYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWVudUl0ZW1JbXBsIGl0ZW1EYXRhLCBpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgbUl0ZW1EYXRhID0gaXRlbURhdGE7CisKKyAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgIHNldEljb24oaXRlbURhdGEuZ2V0SWNvbigpKTsKKyAgICAgICAgc2V0VGl0bGUoaXRlbURhdGEuZ2V0VGl0bGUoKSk7IC8vIFRpdGxlIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHRoZXJlIGlzIG5vIGljb24KKyAgICAgICAgc2V0SWQoaXRlbURhdGEuZ2V0SXRlbUlkKCkpOworCisgICAgICAgIHNldFZpc2liaWxpdHkoaXRlbURhdGEuaXNWaXNpYmxlKCkgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICBzZXRFbmFibGVkKGl0ZW1EYXRhLmlzRW5hYmxlZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICBtSW1hZ2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgbVRleHRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICBpZiAobUl0ZW1JbnZva2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JdGVtSW52b2tlci5pbnZva2VJdGVtKG1JdGVtRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJdGVtSW52b2tlcihNZW51QnVpbGRlci5JdGVtSW52b2tlciBpbnZva2VyKSB7CisgICAgICAgIG1JdGVtSW52b2tlciA9IGludm9rZXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcHJlZmVyc0NvbmRlbnNlZFRpdGxlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2thYmxlKGJvb2xlYW4gY2hlY2thYmxlKSB7CisgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgLy8gVE9ETyBTdXBwb3J0IGNoZWNrYWJsZSBhY3Rpb24gaXRlbXMKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgbUltYWdlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoaWNvbik7CisgICAgICAgIGlmIChpY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgbVRleHRCdXR0b24uc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KEdPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnRjdXQoYm9vbGVhbiBzaG93U2hvcnRjdXQsIGNoYXIgc2hvcnRjdXRLZXkpIHsKKyAgICAgICAgLy8gQWN0aW9uIGJ1dHRvbnMgZG9uJ3Qgc2hvdyB0ZXh0IGZvciBzaG9ydGN1dCBrZXlzLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKworICAgICAgICAvLyBwb3B1bGF0ZSBhY2Nlc3NpYmlsaXR5IGRlc2NyaXB0aW9uIHdpdGggdGl0bGUKKyAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKHRpdGxlKTsKKworICAgICAgICBpZiAobUltYWdlQnV0dG9uLmdldERyYXdhYmxlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRleHRCdXR0b24uc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgbVRleHRCdXR0b24uc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3dzSWNvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTM5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVWaWV3LmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25NZW51VmlldyBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkl0ZW1JbnZva2VyLCBNZW51VmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25NZW51VmlldyI7CisgICAgCisgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtTWVudTsKKworICAgIHByaXZhdGUgaW50IG1JdGVtUGFkZGluZzsKKyAgICBwcml2YXRlIGludCBtSXRlbU1hcmdpbjsKKyAgICBwcml2YXRlIGludCBtTWF4SXRlbXM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXNlcnZlT3ZlcmZsb3c7CisgICAgcHJpdmF0ZSBPdmVyZmxvd01lbnVCdXR0b24gbU92ZXJmbG93QnV0dG9uOworICAgIHByaXZhdGUgTWVudVBvcHVwSGVscGVyIG1PdmVyZmxvd1BvcHVwOworCisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd092ZXJmbG93ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICB9OworICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5UaGVtZSk7CisgICAgICAgIG1JdGVtUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWVfYWN0aW9uQnV0dG9uUGFkZGluZywgMCk7CisgICAgICAgIG1JdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nIC8gMjsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgLy8gTWVhc3VyZSBmb3IgaW5pdGlhbCBjb25maWd1cmF0aW9uCisgICAgICAgIG1NYXhJdGVtcyA9IG1lYXN1cmVNYXhBY3Rpb25CdXR0b25zKCk7CisKKyAgICAgICAgLy8gVE9ETyBUaGVyZSBoYXMgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGhhcmQgbWVudSBrZXkuCisgICAgICAgIGZpbmFsIGludCBzY3JlZW4gPSBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkuc2NyZWVuTGF5b3V0OworICAgICAgICBtUmVzZXJ2ZU92ZXJmbG93ID0gKHNjcmVlbiAmIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIGZpbmFsIGludCBzY3JlZW4gPSBuZXdDb25maWcuc2NyZWVuTGF5b3V0OworICAgICAgICBtUmVzZXJ2ZU92ZXJmbG93ID0gKHNjcmVlbiAmIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRTsKKyAgICAgICAgbU1heEl0ZW1zID0gbWVhc3VyZU1heEFjdGlvbkJ1dHRvbnMoKTsKKyAgICAgICAgaWYgKG1NZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NZW51LnNldE1heEFjdGlvbkl0ZW1zKG1NYXhJdGVtcyk7CisgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU92ZXJmbG93UG9wdXAgIT0gbnVsbCAmJiBtT3ZlcmZsb3dQb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgbU92ZXJmbG93UG9wdXAuZGlzbWlzcygpOworICAgICAgICAgICAgcG9zdChtU2hvd092ZXJmbG93KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IG1lYXN1cmVNYXhBY3Rpb25CdXR0b25zKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLmFjdGlvbl9pY29uX3NpemUpOworICAgICAgICBmaW5hbCBpbnQgc3BhY2VBdmFpbGFibGUgPSByZXMuZ2V0RGlzcGxheU1ldHJpY3MoKS53aWR0aFBpeGVscyAvIDI7CisgICAgICAgIGZpbmFsIGludCBpdGVtU3BhY2UgPSBzaXplICsgbUl0ZW1QYWRkaW5nOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHNwYWNlQXZhaWxhYmxlIC8gKGl0ZW1TcGFjZSA+IDAgPyBpdGVtU3BhY2UgOiAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93UmVzZXJ2ZWQoKSB7CisgICAgICAgIHJldHVybiBtUmVzZXJ2ZU92ZXJmbG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVyZmxvd1Jlc2VydmVkKGJvb2xlYW4gcmVzZXJ2ZU92ZXJmbG93KSB7CisgICAgICAgIG1SZXNlcnZlT3ZlcmZsb3cgPSByZXNlcnZlT3ZlcmZsb3c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7CisgICAgICAgIGlmIChwIGluc3RhbmNlb2YgTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBwOworICAgICAgICAgICAgcmV0dXJuIGxwLmxlZnRNYXJnaW4gPT0gbUl0ZW1NYXJnaW4gJiYgbHAucmlnaHRNYXJnaW4gPT0gbUl0ZW1NYXJnaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9PSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCAmJgorICAgICAgICAgICAgICAgICAgICBscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UICYmIGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgIHBhcmFtcy5sZWZ0TWFyZ2luID0gbUl0ZW1NYXJnaW47CisgICAgICAgIHBhcmFtcy5yaWdodE1hcmdpbiA9IG1JdGVtTWFyZ2luOworICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMOworICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0SXRlbU1hcmdpbigpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtTWFyZ2luOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludm9rZUl0ZW0oTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG1NZW51LnBlcmZvcm1JdGVtQWN0aW9uKGl0ZW0sIDApOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V2luZG93QW5pbWF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShNZW51QnVpbGRlciBtZW51LCBpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgbWVudS5zZXRNYXhBY3Rpb25JdGVtcyhtTWF4SXRlbXMpOworICAgICAgICBtTWVudSA9IG1lbnU7CisgICAgICAgIHVwZGF0ZUNoaWxkcmVuKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNoaWxkcmVuKGJvb2xlYW4gY2xlYXJlZCkgeworICAgICAgICBmaW5hbCBib29sZWFuIHJlc2VydmVPdmVyZmxvdyA9IG1SZXNlcnZlT3ZlcmZsb3c7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldEFjdGlvbkl0ZW1zKHJlc2VydmVPdmVyZmxvdyk7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtc1RvU2hvdy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbURhdGEgPSBpdGVtc1RvU2hvdy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGFjdGlvblZpZXcgPSBpdGVtRGF0YS5nZXRBY3Rpb25WaWV3KCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhhY3Rpb25WaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkSXRlbVZpZXcoKEFjdGlvbk1lbnVJdGVtVmlldykgaXRlbURhdGEuZ2V0SXRlbVZpZXcoCisgICAgICAgICAgICAgICAgICAgICAgICBNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sIHRoaXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNlcnZlT3ZlcmZsb3cpIHsKKyAgICAgICAgICAgIGlmIChtTWVudS5nZXROb25BY3Rpb25JdGVtcyh0cnVlKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgT3ZlcmZsb3dNZW51QnV0dG9uIGJ1dHRvbiA9IG5ldyBPdmVyZmxvd01lbnVCdXR0b24obUNvbnRleHQpOworICAgICAgICAgICAgICAgIGFkZFZpZXcoYnV0dG9uKTsKKyAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b24gPSBidXR0b247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVQb3B1cEhlbHBlciBwb3B1cCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIoZ2V0Q29udGV4dCgpLCBtTWVudSwgbU92ZXJmbG93QnV0dG9uLCB0cnVlKTsKKyAgICAgICAgICAgIC8vIFBvc3QgdGhpcyBmb3IgbGF0ZXI7IHdlIG1pZ2h0IHN0aWxsIG5lZWQgYSBsYXlvdXQgZm9yIHRoZSBhbmNob3IgdG8gYmUgcmlnaHQuCisgICAgICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcHVwLnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1PdmVyZmxvd1BvcHVwID0gcG9wdXA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd01lbnVTaG93aW5nKCkgeworICAgICAgICBNZW51UG9wdXBIZWxwZXIgcG9wdXAgPSBtT3ZlcmZsb3dQb3B1cDsKKyAgICAgICAgaWYgKHBvcHVwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3B1cC5pc1Nob3dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGlkZU92ZXJmbG93TWVudSgpIHsKKyAgICAgICAgTWVudVBvcHVwSGVscGVyIHBvcHVwID0gbU92ZXJmbG93UG9wdXA7CisgICAgICAgIGlmIChwb3B1cCAhPSBudWxsKSB7CisgICAgICAgICAgICBwb3B1cC5kaXNtaXNzKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEl0ZW1WaWV3KEFjdGlvbk1lbnVJdGVtVmlldyB2aWV3KSB7CisgICAgICAgIHZpZXcuc2V0SXRlbUludm9rZXIodGhpcyk7CisgICAgICAgIGFkZFZpZXcodmlldyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBPdmVyZmxvd01lbnVCdXR0b24gZXh0ZW5kcyBJbWFnZUJ1dHRvbiB7CisgICAgICAgIHB1YmxpYyBPdmVyZmxvd01lbnVCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uT3ZlcmZsb3dCdXR0b25TdHlsZSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNsaWNrKCkgeworICAgICAgICAgICAgaWYgKHN1cGVyLnBlcmZvcm1DbGljaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoYW5nZSB0byBvdmVyZmxvdyBtb2RlCisgICAgICAgICAgICBtTWVudS5nZXRDYWxsYmFjaygpLm9uTWVudU1vZGVDaGFuZ2UobU1lbnUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YQppbmRleCBiZWI1N2JhLi4xNzhkY2RlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEKQEAgLTMzNyw3ICszMzcsOSBAQAogICAgICAgICAvLyBUaGlzIG1ldGhvZCBkb2VzIGEgY2xlYXIgcmVmcmVzaCBvZiBjaGlsZHJlbgogICAgICAgICByZW1vdmVBbGxWaWV3cygpOwogICAgICAgICAKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gaXRlbXNUb1Nob3cgPSBtTWVudS5nZXRWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgLy8gSWNvbk1lbnVWaWV3IG5ldmVyIHdhbnRzIGNvbnRlbnQgc29ydGVkIGZvciBhbiBvdmVyZmxvdyBhY3Rpb24gYnV0dG9uLCBzaW5jZQorICAgICAgICAvLyBpdCBpcyBuZXZlciB1c2VkIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBvdmVyZmxvdyBidXR0b24uCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGl0ZW1zVG9TaG93ID0gbU1lbnUuZ2V0Tm9uQWN0aW9uSXRlbXMoZmFsc2UpOwogICAgICAgICBmaW5hbCBpbnQgbnVtSXRlbXMgPSBpdGVtc1RvU2hvdy5zaXplKCk7CiAgICAgICAgIGZpbmFsIGludCBudW1JdGVtc1RoYXRDYW5GaXQgPSBtTWF4SXRlbXM7CiAgICAgICAgIC8vIE1pbmltdW0gb2YgdGhlIG51bSB0aGF0IGNhbiBmaXQgYW5kIHRoZSBudW0gdGhhdCB3ZSBoYXZlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKaW5kZXggMjI4ZDVkMC4uZWFlYjY3ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQpAQCAtMjcsMTYgKzI3LDE4IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUNoYXJhY3Rlck1hcDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOwpAQCAtNTQsNyArNTYsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiTWVudUJ1aWxkZXIiOwogICAgIAogICAgIC8qKiBUaGUgbnVtYmVyIG9mIGRpZmZlcmVudCBtZW51IHR5cGVzICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1RZUEVTID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fVFlQRVMgPSA1OwogICAgIC8qKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgaWNvbiBtZW51IHZpZXcgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lDT04gPSAwOwogICAgIC8qKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgZXhwYW5kZWQgbWVudSB2aWV3ICovCkBAIC02NSwxNCArNjcsMjggQEAKICAgICAgKiBoYXZlIGFuIEl0ZW1WaWV3LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRElBTE9HID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIGJ1dHRvbiBpbiB0aGUgYXBwbGljYXRpb24ncyBhY3Rpb24gYmFyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQUNUSU9OX0JVVFRPTiA9IDM7CisgICAgLyoqCisgICAgICogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBtZW51IHBvcHVwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUE9QVVAgPSA0OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdTX1RBRyA9ICJhbmRyb2lkOnZpZXdzIjsKLSAgICAKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSEVNRV9TWVNURU1fREVGQVVMVCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIRU1FX0FQUExJQ0FUSU9OID0gLTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIRU1FX0FMRVJUX0RJQUxPRyA9IC0yOworCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCiAgICAgc3RhdGljIGZpbmFsIGludCBUSEVNRV9SRVNfRk9SX1RZUEVbXSA9IG5ldyBpbnRbXSB7CiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfSWNvbk1lbnUsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRXhwYW5kZWRNZW51LAotICAgICAgICAwLAorICAgICAgICBUSEVNRV9BTEVSVF9ESUFMT0csCisgICAgICAgIFRIRU1FX0FQUExJQ0FUSU9OLAorICAgICAgICBUSEVNRV9BUFBMSUNBVElPTiwKICAgICB9OwogICAgIAogICAgIC8vIE9yZGVyIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFRZUEVfKgpAQCAtODAsNiArOTYsOCBAQAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5pY29uX21lbnVfbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5leHBhbmRlZF9tZW51X2xheW91dCwKICAgICAgICAgMCwKKyAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuYWN0aW9uX21lbnVfbGF5b3V0LAorICAgICAgICAwLAogICAgIH07CiAKICAgICAvLyBPcmRlciBtdXN0IGJlIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBUWVBFXyoKQEAgLTg3LDYgKzEwNSw4IEBACiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmljb25fbWVudV9pdGVtX2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9tZW51X2l0ZW1fbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X21lbnVfaXRlbV9sYXlvdXQsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmFjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LAorICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wb3B1cF9tZW51X2l0ZW1fbGF5b3V0LAogICAgIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSAgc0NhdGVnb3J5VG9PcmRlciA9IG5ldyBpbnRbXSB7CkBAIC0xMzAsNiArMTUwLDM1IEBACiAgICAgICogZmV0Y2hlZCBmcm9tIHtAbGluayAjZ2V0VmlzaWJsZUl0ZW1zKCl9CiAgICAgICovIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWaXNpYmxlSXRlbXNTdGFsZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBvbmx5IHRoZSBpdGVtcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtQWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogQ29udGFpbnMgaXRlbXMgdGhhdCBzaG91bGQgTk9UIGFwcGVhciBpbiB0aGUgQWN0aW9uIEJhciwgaWYgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IG1Ob25BY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHZpc2libGUgYWN0aW9uIGJ1dHRvbnMgcGVybWl0dGVkIGluIHRoaXMgbWVudQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1NYXhBY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaXRlbXMgKG9yIGFueSBvbmUgaXRlbSdzIGFjdGlvbiBzdGF0ZSkgaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzCisgICAgICogbGFzdCBmZXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBY3Rpb25JdGVtc1N0YWxlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgcHJvY2VzcyBvZiBncmFudGluZyBzcGFjZSBhcyBhY3Rpb24gaXRlbXMgc2hvdWxkIHJlc2VydmUgYSBzcGFjZSBmb3IKKyAgICAgKiBhbiBvdmVyZmxvdyBvcHRpb24gaW4gdGhlIGFjdGlvbiBsaXN0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZUFjdGlvbk92ZXJmbG93OworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgaG93IGFkZGVkIGl0ZW1zIHNob3VsZCBzaG93IGluIHRoZSBhY3Rpb24gbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtRGVmYXVsdFNob3dBc0FjdGlvbiA9IE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX05FVkVSOwogCiAgICAgLyoqCiAgICAgICogQ3VycmVudCB1c2UgY2FzZSBpcyBDb250ZXh0IE1lbnVzOiBBcyBWaWV3cyBwb3B1bGF0ZSB0aGUgY29udGV4dCBtZW51LCBlYWNoIG9uZSBoYXMKQEAgLTE1OCw3ICsyMDcsMTQgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbVByZXZlbnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCA9IGZhbHNlOwogICAgIAogICAgIHByaXZhdGUgYm9vbGVhbiBtT3B0aW9uYWxJY29uc1Zpc2libGUgPSBmYWxzZTsKLSAgICAKKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRBbGVydERpYWxvZ1RoZW1lKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBUeXBlZFZhbHVlIG91dFZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFsZXJ0RGlhbG9nVGhlbWUsCisgICAgICAgICAgICAgICAgb3V0VmFsdWUsIHRydWUpOworICAgICAgICByZXR1cm4gb3V0VmFsdWUucmVzb3VyY2VJZDsKKyAgICB9CisKICAgICBwcml2YXRlIE1lbnVUeXBlW10gbU1lbnVUeXBlczsKICAgICBjbGFzcyBNZW51VHlwZSB7CiAgICAgICAgIHByaXZhdGUgaW50IG1NZW51VHlwZTsKQEAgLTE3Niw4ICsyMzIsMjAgQEAKICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgZ2V0SW5mbGF0ZXIoKSB7CiAgICAgICAgICAgICAvLyBDcmVhdGUgYW4gaW5mbGF0ZXIgdGhhdCB1c2VzIHRoZSBnaXZlbiB0aGVtZSBmb3IgdGhlIFZpZXdzIGl0IGluZmxhdGVzCiAgICAgICAgICAgICBpZiAobUluZmxhdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDb250ZXh0IHdyYXBwZWRDb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBUSEVNRV9SRVNfRk9SX1RZUEVbbU1lbnVUeXBlXSk7IAorICAgICAgICAgICAgICAgIENvbnRleHQgd3JhcHBlZENvbnRleHQ7CisgICAgICAgICAgICAgICAgaW50IHRoZW1lUmVzRm9yVHlwZSA9IFRIRU1FX1JFU19GT1JfVFlQRVttTWVudVR5cGVdOworICAgICAgICAgICAgICAgIHN3aXRjaCAodGhlbWVSZXNGb3JUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVEhFTUVfQVBQTElDQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQ29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKG1Db250ZXh0LCB0aGVtZVJlc0ZvclR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVEhFTUVfQUxFUlRfRElBTE9HOgorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWxlcnREaWFsb2dUaGVtZShtQ29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQ29udGV4dCA9IG1Db250ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1JbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgd3JhcHBlZENvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwogICAgICAgICAgICAgfQpAQCAtMjgxLDEwICszNDksMTkgQEAKICAgICAgICAgbVZpc2libGVJdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPigpOwogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IHRydWU7CiAgICAgICAgIAorICAgICAgICBtQWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4oKTsKKyAgICAgICAgbU5vbkFjdGlvbkl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZW51SXRlbUltcGw+KCk7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICAKICAgICAgICAgbVNob3J0Y3V0c1Zpc2libGUgPQogICAgICAgICAgICAgICAgIChtUmVzb3VyY2VzLmdldENvbmZpZ3VyYXRpb24oKS5rZXlib2FyZCAhPSBDb25maWd1cmF0aW9uLktFWUJPQVJEX05PS0VZUyk7CiAgICAgfQogICAgIAorICAgIHB1YmxpYyBNZW51QnVpbGRlciBzZXREZWZhdWx0U2hvd0FzQWN0aW9uKGludCBkZWZhdWx0U2hvd0FzQWN0aW9uKSB7CisgICAgICAgIG1EZWZhdWx0U2hvd0FzQWN0aW9uID0gZGVmYXVsdFNob3dBc0FjdGlvbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAogICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7CiAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwogICAgIH0KQEAgLTM2OCw3ICs0NDUsOCBAQAogICAgIHByaXZhdGUgTWVudUl0ZW0gYWRkSW50ZXJuYWwoaW50IGdyb3VwLCBpbnQgaWQsIGludCBjYXRlZ29yeU9yZGVyLCBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKICAgICAgICAgZmluYWwgaW50IG9yZGVyaW5nID0gZ2V0T3JkZXJpbmcoY2F0ZWdvcnlPcmRlcik7CiAgICAgICAgIAotICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbSA9IG5ldyBNZW51SXRlbUltcGwodGhpcywgZ3JvdXAsIGlkLCBjYXRlZ29yeU9yZGVyLCBvcmRlcmluZywgdGl0bGUpOworICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbSA9IG5ldyBNZW51SXRlbUltcGwodGhpcywgZ3JvdXAsIGlkLCBjYXRlZ29yeU9yZGVyLAorICAgICAgICAgICAgICAgIG9yZGVyaW5nLCB0aXRsZSwgbURlZmF1bHRTaG93QXNBY3Rpb24pOwogCiAgICAgICAgIGlmIChtQ3VycmVudE1lbnVJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIFBhc3MgYWxvbmcgdGhlIGN1cnJlbnQgbWVudSBpbmZvCkBAIC02MzMsNiArNzExLDExIEBACiAgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGluZGV4KTsKICAgICB9CiAKKyAgICBwdWJsaWMgTWVudUl0ZW0gZ2V0T3ZlcmZsb3dJdGVtKGludCBpbmRleCkgeworICAgICAgICBmbGFnQWN0aW9uSXRlbXModHJ1ZSk7CisgICAgICAgIHJldHVybiBtTm9uQWN0aW9uSXRlbXMuZ2V0KGluZGV4KTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3J0Y3V0S2V5KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewogICAgICAgICByZXR1cm4gZmluZEl0ZW1XaXRoU2hvcnRjdXRGb3JLZXkoa2V5Q29kZSwgZXZlbnQpICE9IG51bGw7CiAgICAgfQpAQCAtOTAwLDYgKzk4Myw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIG9uSXRlbXNDaGFuZ2VkKGJvb2xlYW4gY2xlYXJlZCkgewogICAgICAgICBpZiAoIW1QcmV2ZW50RGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQpIHsKICAgICAgICAgICAgIGlmIChtSXNWaXNpYmxlSXRlbXNTdGFsZSA9PSBmYWxzZSkgbUlzVmlzaWJsZUl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPT0gZmFsc2UpIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBNZW51VHlwZVtdIG1lbnVUeXBlcyA9IG1NZW51VHlwZXM7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9UWVBFUzsgaSsrKSB7CkBAIC05MjAsNiArMTAwNCwxNSBAQAogICAgICAgICBvbkl0ZW1zQ2hhbmdlZChmYWxzZSk7CiAgICAgfQogICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCBieSB7QGxpbmsgTWVudUl0ZW1JbXBsfSB3aGVuIGl0cyBhY3Rpb24gcmVxdWVzdCBzdGF0dXMgaXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0aGF0IGhhcyBnb25lIHRocm91Z2ggYSBjaGFuZ2UgaW4gYWN0aW9uIHJlcXVlc3Qgc3RhdHVzLgorICAgICAqLworICAgIHZvaWQgb25JdGVtQWN0aW9uUmVxdWVzdENoYW5nZWQoTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgLy8gTm90aWZ5IG9mIGl0ZW1zIGJlaW5nIGNoYW5nZWQKKyAgICAgICAgb25JdGVtc0NoYW5nZWQoZmFsc2UpOworICAgIH0KKyAgICAKICAgICBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBnZXRWaXNpYmxlSXRlbXMoKSB7CiAgICAgICAgIGlmICghbUlzVmlzaWJsZUl0ZW1zU3RhbGUpIHJldHVybiBtVmlzaWJsZUl0ZW1zOwogICAgICAgICAKQEAgLTkzNCw5ICsxMDI3LDgzIEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIG1Jc1Zpc2libGVJdGVtc1N0YWxlID0gZmFsc2U7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOwogICAgICAgICAKICAgICAgICAgcmV0dXJuIG1WaXNpYmxlSXRlbXM7CiAgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBmbGFnQWN0aW9uSXRlbXMoYm9vbGVhbiByZXNlcnZlQWN0aW9uT3ZlcmZsb3cpIHsKKyAgICAgICAgaWYgKHJlc2VydmVBY3Rpb25PdmVyZmxvdyAhPSBtUmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgICAgICBtUmVzZXJ2ZUFjdGlvbk92ZXJmbG93ID0gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93OworICAgICAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1Jc0FjdGlvbkl0ZW1zU3RhbGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IHZpc2libGVJdGVtcyA9IGdldFZpc2libGVJdGVtcygpOworICAgICAgICBmaW5hbCBpbnQgaXRlbXNTaXplID0gdmlzaWJsZUl0ZW1zLnNpemUoKTsKKyAgICAgICAgaW50IG1heEFjdGlvbnMgPSBtTWF4QWN0aW9uSXRlbXM7CisKKyAgICAgICAgaW50IHJlcXVpcmVkSXRlbXMgPSAwOworICAgICAgICBpbnQgcmVxdWVzdGVkSXRlbXMgPSAwOworICAgICAgICBib29sZWFuIGhhc092ZXJmbG93ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXNTaXplOyBpKyspIHsKKyAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gdmlzaWJsZUl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLnJlcXVpcmVzQWN0aW9uQnV0dG9uKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1aXJlZEl0ZW1zKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ucmVxdWVzdHNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RlZEl0ZW1zKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhc092ZXJmbG93ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2VydmUgYSBzcG90IGZvciB0aGUgb3ZlcmZsb3cgaXRlbSBpZiBuZWVkZWQuCisgICAgICAgIGlmIChyZXNlcnZlQWN0aW9uT3ZlcmZsb3cgJiYKKyAgICAgICAgICAgICAgICAoaGFzT3ZlcmZsb3cgfHwgcmVxdWlyZWRJdGVtcyArIHJlcXVlc3RlZEl0ZW1zID4gbWF4QWN0aW9ucykpIHsKKyAgICAgICAgICAgIG1heEFjdGlvbnMtLTsKKyAgICAgICAgfQorICAgICAgICBtYXhBY3Rpb25zIC09IHJlcXVpcmVkSXRlbXM7CisKKyAgICAgICAgLy8gRmxhZyBhcyBtYW55IG1vcmUgcmVxdWVzdGVkIGl0ZW1zIGFzIHdpbGwgZml0LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5yZXF1ZXN0c0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJc0FjdGlvbkJ1dHRvbihtYXhBY3Rpb25zID4gMCk7CisgICAgICAgICAgICAgICAgbWF4QWN0aW9ucy0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUFjdGlvbkl0ZW1zLmNsZWFyKCk7CisgICAgICAgIG1Ob25BY3Rpb25JdGVtcy5jbGVhcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5pc0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU5vbkFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gZ2V0QWN0aW9uSXRlbXMoYm9vbGVhbiByZXNlcnZlQWN0aW9uT3ZlcmZsb3cpIHsKKyAgICAgICAgZmxhZ0FjdGlvbkl0ZW1zKHJlc2VydmVBY3Rpb25PdmVyZmxvdyk7CisgICAgICAgIHJldHVybiBtQWN0aW9uSXRlbXM7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldE5vbkFjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyhyZXNlcnZlQWN0aW9uT3ZlcmZsb3cpOworICAgICAgICByZXR1cm4gbU5vbkFjdGlvbkl0ZW1zOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldE1heEFjdGlvbkl0ZW1zKGludCBtYXhBY3Rpb25JdGVtcykgeworICAgICAgICBtTWF4QWN0aW9uSXRlbXMgPSBtYXhBY3Rpb25JdGVtczsKKyAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CisgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xlYXJIZWFkZXIoKSB7CiAgICAgICAgIG1IZWFkZXJJY29uID0gbnVsbDsKQEAgLTEwNzgsNiArMTI0NSwxNiBAQAogICAgICAgICByZXR1cm4gbmV3IE1lbnVBZGFwdGVyKG1lbnVUeXBlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIGFkYXB0ZXIgZm9yIHByb3ZpZGluZyBvdmVyZmxvdyAobm9uLWFjdGlvbikgaXRlbXMgYW5kIHRoZWlyIHZpZXdzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lbnVUeXBlIFRoZSB0eXBlIG9mIG1lbnUgdG8gZ2V0IGFuIGFkYXB0ZXIgZm9yLgorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgTWVudUFkYXB0ZXJ9IGZvciB0aGlzIG1lbnUgd2l0aCB0aGUgZ2l2ZW4gbWVudSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBNZW51QWRhcHRlciBnZXRPdmVyZmxvd01lbnVBZGFwdGVyKGludCBtZW51VHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IE92ZXJmbG93TWVudUFkYXB0ZXIobWVudVR5cGUpOworICAgIH0KKwogICAgIHZvaWQgc2V0T3B0aW9uYWxJY29uc1Zpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CiAgICAgICAgIG1PcHRpb25hbEljb25zVmlzaWJsZSA9IHZpc2libGU7CiAgICAgfQpAQCAtMTE1NSw4ICsxMzMyLDQyIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuICgoTWVudUl0ZW1JbXBsKSBnZXRJdGVtKHBvc2l0aW9uKSkuZ2V0SXRlbVZpZXcobU1lbnVUeXBlLCBwYXJlbnQpOworICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBNZW51Vmlldy5JdGVtVmlldyBpdGVtVmlldyA9IChNZW51Vmlldy5JdGVtVmlldykgY29udmVydFZpZXc7CisgICAgICAgICAgICAgICAgaXRlbVZpZXcuZ2V0SXRlbURhdGEoKS5zZXRJdGVtVmlldyhtTWVudVR5cGUsIG51bGwpOworCisgICAgICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSAoTWVudUl0ZW1JbXBsKSBnZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBpdGVtVmlldy5pbml0aWFsaXplKGl0ZW0sIG1NZW51VHlwZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJdGVtVmlldyhtTWVudVR5cGUsIGl0ZW1WaWV3KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydFZpZXc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJdGVtVmlldyhtTWVudVR5cGUsIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmdldEl0ZW1WaWV3KG1NZW51VHlwZSwgcGFyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgYW4ge0BsaW5rIEFkYXB0ZXJWaWV3fSB0byB1c2UgdGhpcyB7QGxpbmsgTWVudUJ1aWxkZXJ9IGFzIGEgZGF0YQorICAgICAqIHNvdXJjZSBmb3Igb3ZlcmZsb3cgbWVudSBpdGVtcyB0aGF0IGRvIG5vdCBmaXQgaW4gdGhlIGxpc3Qgb2YgYWN0aW9uIGl0ZW1zLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgT3ZlcmZsb3dNZW51QWRhcHRlciBleHRlbmRzIE1lbnVBZGFwdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtT3ZlcmZsb3dJdGVtczsKKworICAgICAgICBwdWJsaWMgT3ZlcmZsb3dNZW51QWRhcHRlcihpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lbnVUeXBlKTsKKyAgICAgICAgICAgIG1PdmVyZmxvd0l0ZW1zID0gZ2V0Tm9uQWN0aW9uSXRlbXModHJ1ZSk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lbnVJdGVtSW1wbCBnZXRJdGVtKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG1PdmVyZmxvd0l0ZW1zLmdldChwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtT3ZlcmZsb3dJdGVtcy5zaXplKCk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQppbmRleCA5YjU4MjA1Li40MmY5NzcxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKQEAgLTc0LDYgKzc0LDExIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTX0FDVElPTiAgICAgID0gMHgwMDAwMDAyMDsKKworICAgIHByaXZhdGUgaW50IG1TaG93QXNBY3Rpb24gPSBTSE9XX0FTX0FDVElPTl9ORVZFUjsKKworICAgIHByaXZhdGUgVmlldyBtQWN0aW9uVmlldzsKIAogICAgIC8qKiBVc2VkIGZvciB0aGUgaWNvbiByZXNvdXJjZSBJRCBpZiB0aGlzIGl0ZW0gZG9lcyBub3QgaGF2ZSBhbiBpY29uICovCiAgICAgc3RhdGljIGZpbmFsIGludCBOT19JQ09OID0gMDsKQEAgLTEwNSw3ICsxMTAsNyBAQAogICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgaXRlbS4KICAgICAgKi8KICAgICBNZW51SXRlbUltcGwoTWVudUJ1aWxkZXIgbWVudSwgaW50IGdyb3VwLCBpbnQgaWQsIGludCBjYXRlZ29yeU9yZGVyLCBpbnQgb3JkZXJpbmcsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSwgaW50IHNob3dBc0FjdGlvbikgewogCiAgICAgICAgIGlmIChzUHJlcGVuZFNob3J0Y3V0TGFiZWwgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gVGhpcyBpcyBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgVUkgdGhyZWFkLCBzbyBubyBjaGFuY2Ugb2Ygc3luYyBpc3N1ZXMgCkBAIC0xMjYsNiArMTMxLDcgQEAKICAgICAgICAgbUNhdGVnb3J5T3JkZXIgPSBjYXRlZ29yeU9yZGVyOwogICAgICAgICBtT3JkZXJpbmcgPSBvcmRlcmluZzsKICAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIG1TaG93QXNBY3Rpb24gPSBzaG93QXNBY3Rpb247CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtNTgwLDYgKzU4NiwxMCBAQAogICAgICAgICByZXR1cm4gKFZpZXcpIG1JdGVtVmlld3NbbWVudVR5cGVdLmdldCgpOwogICAgIH0KIAorICAgIHZvaWQgc2V0SXRlbVZpZXcoaW50IG1lbnVUeXBlLCBJdGVtVmlldyB2aWV3KSB7CisgICAgICAgIG1JdGVtVmlld3NbbWVudVR5cGVdID0gbmV3IFdlYWtSZWZlcmVuY2U8SXRlbVZpZXc+KHZpZXcpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZXMgYSBtZW51IGl0ZW0gdmlldyB0aGF0IGltcGxlbWVudHMge0BsaW5rIE1lbnVWaWV3Lkl0ZW1WaWV3fS4KICAgICAgKiBAcGFyYW0gbWVudVR5cGUgVGhlIHR5cGUgb2YgbWVudSB0byBnZXQgYSBWaWV3IGZvciAobXVzdCBiZSBvbmUgb2YKQEAgLTYyOCw2ICs2MzgsNDMgQEAKICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGdpdmVuIG1lbnUgdHlwZSBzaG91bGQgc2hvdyBpY29ucyBmb3IgbWVudSBpdGVtcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTaG93SWNvbihpbnQgbWVudVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfSUNPTiB8fCBtTWVudS5nZXRPcHRpb25hbEljb25zVmlzaWJsZSgpOworICAgICAgICByZXR1cm4gbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9JQ09OIHx8CisgICAgICAgICAgICAgICAgbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OIHx8CisgICAgICAgICAgICAgICAgbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCB8fAorICAgICAgICAgICAgICAgIG1NZW51LmdldE9wdGlvbmFsSWNvbnNWaXNpYmxlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIElTX0FDVElPTikgPT0gSVNfQUNUSU9OIHx8IHJlcXVpcmVzQWN0aW9uQnV0dG9uKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RzQWN0aW9uQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbVNob3dBc0FjdGlvbiA9PSBTSE9XX0FTX0FDVElPTl9JRl9ST09NOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93QXNBY3Rpb24gPT0gU0hPV19BU19BQ1RJT05fQUxXQVlTOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElzQWN0aW9uQnV0dG9uKGJvb2xlYW4gaXNBY3Rpb25CdXR0b24pIHsKKyAgICAgICAgaWYgKGlzQWN0aW9uQnV0dG9uKSB7CisgICAgICAgICAgICBtRmxhZ3MgfD0gSVNfQUNUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZsYWdzICY9IH5JU19BQ1RJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IGFjdGlvbkVudW0pIHsKKyAgICAgICAgbVNob3dBc0FjdGlvbiA9IGFjdGlvbkVudW07CisgICAgICAgIG1NZW51Lm9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KFZpZXcgdmlldykgeworICAgICAgICBtQWN0aW9uVmlldyA9IHZpZXc7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEFjdGlvblZpZXcoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldzsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ3ODI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyLk1lbnVBZGFwdGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93OworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBNZW51UG9wdXBIZWxwZXIgaW1wbGVtZW50cyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyLCBWaWV3Lk9uS2V5TGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVudVBvcHVwSGVscGVyIjsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIExpc3RQb3B1cFdpbmRvdyBtUG9wdXA7CisgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtTWVudTsKKyAgICBwcml2YXRlIGludCBtUG9wdXBNYXhXaWR0aDsKKyAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8Vmlldz4gbUFuY2hvclZpZXc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1PdmVyZmxvd09ubHk7CisKKyAgICBwcml2YXRlIFBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyIG1EaXNtaXNzTGlzdGVuZXIgPSBuZXcgUG9wdXBXaW5kb3cuT25EaXNtaXNzTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzcygpIHsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIE1lbnVQb3B1cEhlbHBlcihDb250ZXh0IGNvbnRleHQsIE1lbnVCdWlsZGVyIG1lbnUpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBtZW51LCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVQb3B1cEhlbHBlcihDb250ZXh0IGNvbnRleHQsIE1lbnVCdWlsZGVyIG1lbnUsIFZpZXcgYW5jaG9yVmlldykgeworICAgICAgICB0aGlzKGNvbnRleHQsIG1lbnUsIGFuY2hvclZpZXcsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudVBvcHVwSGVscGVyKENvbnRleHQgY29udGV4dCwgTWVudUJ1aWxkZXIgbWVudSwKKyAgICAgICAgICAgIFZpZXcgYW5jaG9yVmlldywgYm9vbGVhbiBvdmVyZmxvd09ubHkpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtTWVudSA9IG1lbnU7CisgICAgICAgIG1PdmVyZmxvd09ubHkgPSBvdmVyZmxvd09ubHk7CisKKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgbVBvcHVwTWF4V2lkdGggPSBtZXRyaWNzLndpZHRoUGl4ZWxzIC8gMjsKKworICAgICAgICBpZiAoYW5jaG9yVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQW5jaG9yVmlldyA9IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXc+KGFuY2hvclZpZXcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgbVBvcHVwID0gbmV3IExpc3RQb3B1cFdpbmRvdyhtQ29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnBvcHVwTWVudVN0eWxlKTsKKyAgICAgICAgbVBvcHVwLnNldE9uSXRlbUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1Qb3B1cC5zZXRPbkRpc21pc3NMaXN0ZW5lcihtRGlzbWlzc0xpc3RlbmVyKTsKKworICAgICAgICBmaW5hbCBNZW51QWRhcHRlciBhZGFwdGVyID0gbU92ZXJmbG93T25seSA/CisgICAgICAgICAgICAgICAgbU1lbnUuZ2V0T3ZlcmZsb3dNZW51QWRhcHRlcihNZW51QnVpbGRlci5UWVBFX1BPUFVQKSA6CisgICAgICAgICAgICAgICAgbU1lbnUuZ2V0TWVudUFkYXB0ZXIoTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCk7CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtUG9wdXAuc2V0TW9kYWwodHJ1ZSk7CisKKyAgICAgICAgaWYgKG1BbmNob3JWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KG1BbmNob3JWaWV3LmdldCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTWVudSBpbnN0YW5jZW9mIFN1Yk1lbnVCdWlsZGVyKSB7CisgICAgICAgICAgICBTdWJNZW51QnVpbGRlciBzdWJNZW51ID0gKFN1Yk1lbnVCdWlsZGVyKSBtTWVudTsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtSW1wbCA9IChNZW51SXRlbUltcGwpIHN1Yk1lbnUuZ2V0SXRlbSgpOworICAgICAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcoaXRlbUltcGwuZ2V0SXRlbVZpZXcoTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCBudWxsKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZW51UG9wdXBIZWxwZXIgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhbiBhbmNob3IiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50V2lkdGgoTWF0aC5taW4obWVhc3VyZUNvbnRlbnRXaWR0aChhZGFwdGVyKSwgbVBvcHVwTWF4V2lkdGgpKTsKKyAgICAgICAgbVBvcHVwLnNob3coKTsKKyAgICAgICAgbVBvcHVwLmdldExpc3RWaWV3KCkuc2V0T25LZXlMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAgIT0gbnVsbCAmJiBtUG9wdXAuaXNTaG93aW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBNZW51SXRlbSBpdGVtID0gbnVsbDsKKyAgICAgICAgaWYgKG1PdmVyZmxvd09ubHkpIHsKKyAgICAgICAgICAgIGl0ZW0gPSBtTWVudS5nZXRPdmVyZmxvd0l0ZW0ocG9zaXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXRlbSA9IG1NZW51LmdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIG1NZW51LnBlcmZvcm1JdGVtQWN0aW9uKGl0ZW0sIDApOworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5KFZpZXcgdiwgaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVAgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX01FTlUpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlQ29udGVudFdpZHRoKE1lbnVBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgLy8gTWVudXMgZG9uJ3QgdGVuZCB0byBiZSBsb25nLCBzbyB0aGlzIGlzIG1vcmUgc2FuZSB0aGFuIGl0IGxvb2tzLgorICAgICAgICBpbnQgd2lkdGggPSAwOworICAgICAgICBWaWV3IGl0ZW1WaWV3ID0gbnVsbDsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoTWVhc3VyZVNwZWMgPQorICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodE1lYXN1cmVTcGVjID0KKyAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGFkYXB0ZXIuZ2V0Q291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpdGVtVmlldyA9IGFkYXB0ZXIuZ2V0VmlldyhpLCBpdGVtVmlldywgbnVsbCk7CisgICAgICAgICAgICBpdGVtVmlldy5tZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGl0ZW1WaWV3LmdldE1lYXN1cmVkV2lkdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU1N2MyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudVZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbkJhckNvbnRleHRWaWV3IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBwcml2YXRlIGludCBtSXRlbVBhZGRpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUFjdGlvblNwYWNpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUNvbnRlbnRIZWlnaHQ7CisgICAgCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdWJ0aXRsZTsKKyAgICAKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1DbG9zZUJ1dHRvbjsKKyAgICBwcml2YXRlIFZpZXcgbUN1c3RvbVZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbVRpdGxlTGF5b3V0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdWJ0aXRsZVZpZXc7CisgICAgcHJpdmF0ZSBpbnQgbVRpdGxlU3R5bGVSZXM7CisgICAgcHJpdmF0ZSBpbnQgbVN1YnRpdGxlU3R5bGVSZXM7CisgICAgcHJpdmF0ZSBBY3Rpb25NZW51VmlldyBtTWVudVZpZXc7CisgICAgCisgICAgcHVibGljIEFjdGlvbkJhckNvbnRleHRWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uQmFyQ29udGV4dFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbk1vZGVTdHlsZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25CYXJDb250ZXh0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLkFjdGlvbk1vZGUsIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgbUl0ZW1QYWRkaW5nID0gYS5nZXREaW1lbnNpb25QaXhlbE9mZnNldCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY3Rpb25Nb2RlX2l0ZW1QYWRkaW5nLCAwKTsKKyAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGEuZ2V0RHJhd2FibGUoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWN0aW9uTW9kZV9iYWNrZ3JvdW5kKSk7CisgICAgICAgIG1UaXRsZVN0eWxlUmVzID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjdGlvbk1vZGVfdGl0bGVUZXh0U3R5bGUsIDApOworICAgICAgICBtU3VidGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY3Rpb25Nb2RlX3N1YnRpdGxlVGV4dFN0eWxlLCAwKTsKKworICAgICAgICBtQ29udGVudEhlaWdodCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjdGlvbk1vZGVfaGVpZ2h0LCAwKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgY2hpbGQsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgLy8gTm8gc3RhcnRpbmcgYW4gYWN0aW9uIG1vZGUgZm9yIGFuIGV4aXN0aW5nIGFjdGlvbiBtb2RlIFVJIGNoaWxkISAoV2hlcmUgd291bGQgaXQgZ28/KQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGhlaWdodCkgeworICAgICAgICBtQ29udGVudEhlaWdodCA9IGhlaWdodDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21WaWV3KFZpZXcgdmlldykgeworICAgICAgICBpZiAobUN1c3RvbVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtQ3VzdG9tVmlldyk7CisgICAgICAgIH0KKyAgICAgICAgbUN1c3RvbVZpZXcgPSB2aWV3OworICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZVZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICAgICAgICAgIG1UaXRsZUxheW91dCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkVmlldyh2aWV3KTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICBpbml0VGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbVN1YnRpdGxlID0gc3VidGl0bGU7CisgICAgICAgIGluaXRUaXRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRpdGxlKCkgeworICAgICAgICBpZiAobVRpdGxlTGF5b3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgbVRpdGxlTGF5b3V0ID0gKExpbmVhckxheW91dCkgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX3RpdGxlX2l0ZW0sIG51bGwpOworICAgICAgICAgICAgbVRpdGxlVmlldyA9IChUZXh0VmlldykgbVRpdGxlTGF5b3V0LmZpbmRWaWV3QnlJZChSLmlkLmFjdGlvbl9iYXJfdGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldyA9IChUZXh0VmlldykgbVRpdGxlTGF5b3V0LmZpbmRWaWV3QnlJZChSLmlkLmFjdGlvbl9iYXJfc3VidGl0bGUpOworICAgICAgICAgICAgaWYgKG1UaXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CisgICAgICAgICAgICAgICAgaWYgKG1UaXRsZVN0eWxlUmVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVRpdGxlU3R5bGVSZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU3VidGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworICAgICAgICAgICAgICAgIGlmIChtU3VidGl0bGVTdHlsZVJlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1TdWJ0aXRsZVN0eWxlUmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQobVN1YnRpdGxlKTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShtU3VidGl0bGUgIT0gbnVsbCA/IFZJU0lCTEUgOiBHT05FKTsKKyAgICAgICAgICAgIGlmIChtVGl0bGVMYXlvdXQuZ2V0UGFyZW50KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRGb3JNb2RlKGZpbmFsIEFjdGlvbk1vZGUgbW9kZSkgeworICAgICAgICBpZiAobUNsb3NlQnV0dG9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DbG9zZUJ1dHRvbiA9IG5ldyBJbWFnZUJ1dHRvbihnZXRDb250ZXh0KCksIG51bGwsCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSk7CisgICAgICAgIH0KKyAgICAgICAgbUNsb3NlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgYWRkVmlldyhtQ2xvc2VCdXR0b24pOworCisgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnUgPSAoTWVudUJ1aWxkZXIpIG1vZGUuZ2V0TWVudSgpOworICAgICAgICBtTWVudVZpZXcgPSAoQWN0aW9uTWVudVZpZXcpIG1lbnUuZ2V0TWVudVZpZXcoTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCB0aGlzKTsKKyAgICAgICAgbU1lbnVWaWV3LnNldE92ZXJmbG93UmVzZXJ2ZWQodHJ1ZSk7CisgICAgICAgIG1NZW51Vmlldy51cGRhdGVDaGlsZHJlbihmYWxzZSk7CisgICAgICAgIGFkZFZpZXcobU1lbnVWaWV3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZU1vZGUoKSB7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIG1DdXN0b21WaWV3ID0gbnVsbDsKKyAgICAgICAgbU1lbnVWaWV3ID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoaWRlT3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93TWVudVNob3dpbmcoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5pc092ZXJmbG93TWVudVNob3dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIC8vIFVzZWQgYnkgY3VzdG9tIHZpZXdzIGlmIHRoZXkgZG9uJ3Qgc3VwcGx5IGxheW91dCBwYXJhbXMuIEV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAvLyBhZGRlZCB0byBhbiBBY3Rpb25CYXJDb250ZXh0VmlldyBzaG91bGQgaGF2ZSB0aGVtIGFscmVhZHkuCisgICAgICAgIHJldHVybiBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGZpbmFsIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpZiAod2lkdGhNb2RlICE9IE1lYXN1cmVTcGVjLkVYQUNUTFkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPVwibWF0Y2hfcGFyZW50XCIgKG9yIGZpbGxfcGFyZW50KSIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKGhlaWdodE1vZGUgIT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PVwid3JhcF9jb250ZW50XCIiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IGNvbnRlbnRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCBpdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nOworCisgICAgICAgIGludCBtYXhIZWlnaHQgPSBtQ29udGVudEhlaWdodCA+IDAgPworICAgICAgICAgICAgICAgIG1Db250ZW50SGVpZ2h0IDogTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgZmluYWwgaW50IHZlcnRpY2FsUGFkZGluZyA9IGdldFBhZGRpbmdUb3AoKSArIGdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgaW50IGF2YWlsYWJsZVdpZHRoID0gY29udGVudFdpZHRoIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gbWF4SGVpZ2h0IC0gdmVydGljYWxQYWRkaW5nOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRTcGVjSGVpZ2h0ID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisgICAgICAgIAorICAgICAgICBpZiAobUNsb3NlQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtQ2xvc2VCdXR0b24sIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsICYmIG1DdXN0b21WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtVGl0bGVMYXlvdXQsIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZCA9PSBtQ2xvc2VCdXR0b24gfHwgY2hpbGQgPT0gbVRpdGxlTGF5b3V0IHx8IGNoaWxkID09IG1DdXN0b21WaWV3KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhjaGlsZCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgaXRlbU1hcmdpbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUN1c3RvbVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbUN1c3RvbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tV2lkdGhNb2RlID0gbHAud2lkdGggIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbVdpZHRoID0gbHAud2lkdGggPj0gMCA/CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLndpZHRoLCBhdmFpbGFibGVXaWR0aCkgOiBhdmFpbGFibGVXaWR0aDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21IZWlnaHRNb2RlID0gbHAuaGVpZ2h0ICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21IZWlnaHQgPSBscC5oZWlnaHQgPj0gMCA/CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLmhlaWdodCwgaGVpZ2h0KSA6IGhlaWdodDsKKyAgICAgICAgICAgIG1DdXN0b21WaWV3Lm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbVdpZHRoLCBjdXN0b21XaWR0aE1vZGUpLAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tSGVpZ2h0LCBjdXN0b21IZWlnaHRNb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNvbnRlbnRIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgaW50IG1lYXN1cmVkSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFZpZXcgdiA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICAgICAgaW50IHBhZGRlZFZpZXdIZWlnaHQgPSB2LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyB2ZXJ0aWNhbFBhZGRpbmc7CisgICAgICAgICAgICAgICAgaWYgKHBhZGRlZFZpZXdIZWlnaHQgPiBtZWFzdXJlZEhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IHBhZGRlZFZpZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihjb250ZW50V2lkdGgsIG1heEhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgIGludCB4ID0gZ2V0UGFkZGluZ0xlZnQoKTsKKyAgICAgICAgZmluYWwgaW50IHkgPSBnZXRQYWRkaW5nVG9wKCk7CisgICAgICAgIGZpbmFsIGludCBjb250ZW50SGVpZ2h0ID0gYiAtIHQgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGZpbmFsIGludCBpdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nOworICAgICAgICAKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiAhPSBudWxsICYmIG1DbG9zZUJ1dHRvbi5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DbG9zZUJ1dHRvbiwgeCwgeSwgY29udGVudEhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCAmJiBtQ3VzdG9tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRpdGxlTGF5b3V0LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIGl0ZW1NYXJnaW47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQ3VzdG9tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUN1c3RvbVZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgaXRlbU1hcmdpbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgeCA9IHIgLSBsIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4IC09IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKG1NZW51VmlldywgeCArIG1BY3Rpb25TcGFjaW5nLCB5LCBjb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAtIG1BY3Rpb25TcGFjaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGQoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCwgY2hpbGRUb3AsIHggKyBjaGlsZFdpZHRoLCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZEludmVyc2UoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCAtIGNoaWxkV2lkdGgsIGNoaWxkVG9wLCB4LCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOGE3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YQpAQCAtMCwwICsxLDc3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudUl0ZW07CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSG9yaXpvbnRhbFNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJWaWV3IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGlvbkJhclZpZXciOworICAgIAorICAgIC8vIFRPRE86IFRoaXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBkZWZhdWx0IHRoZW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfUEFERElOR19ESVAgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1NQQUNJTkdfRElQID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9BQ1RJT05fU1BBQ0lOR19ESVAgPSAxMjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9wdGlvbnMgYXBwbGllZCBieSBkZWZhdWx0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ERUZBVUxUID0gMDsKKworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3B0aW9ucyB0aGF0IHJlcXVpcmUgcmUtbGF5b3V0IGFzIG9wcG9zZWQgdG8gYSBzaW1wbGUgaW52YWxpZGF0ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX1JFTEFZT1VUX01BU0sgPQorICAgICAgICAgICAgQWN0aW9uQmFyLkRJU1BMQVlfSElERV9IT01FIHwKKyAgICAgICAgICAgIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPOworICAgIAorICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250ZW50SGVpZ2h0OworCisgICAgcHJpdmF0ZSBpbnQgbU5hdmlnYXRpb25Nb2RlOworICAgIHByaXZhdGUgaW50IG1EaXNwbGF5T3B0aW9uczsKKyAgICBwcml2YXRlIGludCBtU3BhY2luZzsKKyAgICBwcml2YXRlIGludCBtQWN0aW9uU3BhY2luZzsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVN1YnRpdGxlOworICAgIHByaXZhdGUgRHJhd2FibGUgbUljb247CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtTG9nbzsKKworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1JY29uVmlldzsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtTG9nb1ZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbVRpdGxlTGF5b3V0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdWJ0aXRsZVZpZXc7CisgICAgcHJpdmF0ZSBTcGlubmVyIG1TcGlubmVyOworICAgIHByaXZhdGUgSG9yaXpvbnRhbFNjcm9sbFZpZXcgbVRhYlNjcm9sbFZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbVRhYkxheW91dDsKKyAgICBwcml2YXRlIFZpZXcgbUN1c3RvbU5hdlZpZXc7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbVRpdGxlU3R5bGVSZXM7CisgICAgcHJpdmF0ZSBpbnQgbVN1YnRpdGxlU3R5bGVSZXM7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dNZW51OworICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlclRpdGxlOworCisgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtT3B0aW9uc01lbnU7CisgICAgcHJpdmF0ZSBBY3Rpb25NZW51VmlldyBtTWVudVZpZXc7CisgICAgCisgICAgcHJpdmF0ZSBBY3Rpb25CYXJDb250ZXh0VmlldyBtQ29udGV4dFZpZXc7CisKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVJdGVtIG1Mb2dvTmF2SXRlbTsKKyAgICAKKyAgICBwcml2YXRlIE5hdmlnYXRpb25DYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICBwcml2YXRlIGZpbmFsIEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbU5hdkl0ZW1TZWxlY3RlZExpc3RlbmVyID0KKyAgICAgICAgICAgIG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZChBZGFwdGVyVmlldyBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25OYXZpZ2F0aW9uSXRlbVNlbGVjdGVkKHBvc2l0aW9uLCBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXcgcGFyZW50KSB7CisgICAgICAgICAgICAvLyBEbyBub3RoaW5nCisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbUhvbWVDbGlja0xpc3RlbmVyID0gbnVsbDsKKworICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1UYWJDbGlja0xpc3RlbmVyID0gbnVsbDsKKworICAgIHB1YmxpYyBBY3Rpb25CYXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgUi5zdHlsZWFibGUuQWN0aW9uQmFyKTsKKworICAgICAgICBmaW5hbCBpbnQgY29sb3JGaWx0ZXIgPSBhLmdldENvbG9yKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9jb2xvckZpbHRlciwgMCk7CisKKyAgICAgICAgaWYgKGNvbG9yRmlsdGVyICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGQgPSBnZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICBkLnNldERpdGhlcih0cnVlKTsKKyAgICAgICAgICAgIGQuc2V0Q29sb3JGaWx0ZXIobmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcihjb2xvckZpbHRlciwgUG9ydGVyRHVmZi5Nb2RlLk9WRVJMQVkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBpbmZvID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkluZm8oKTsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IGEuZ2V0SW50KFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9uYXZpZ2F0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEKTsKKyAgICAgICAgbVRpdGxlID0gYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkFjdGlvbkJhcl90aXRsZSk7CisgICAgICAgIG1TdWJ0aXRsZSA9IGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfc3VidGl0bGUpOworICAgICAgICBtRGlzcGxheU9wdGlvbnMgPSBhLmdldEludChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfZGlzcGxheU9wdGlvbnMsIERJU1BMQVlfREVGQVVMVCk7CisgICAgICAgIAorICAgICAgICBtTG9nbyA9IGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2xvZ28pOworICAgICAgICBpZiAobUxvZ28gPT0gbnVsbCkgeworICAgICAgICAgICAgbUxvZ28gPSBpbmZvLmxvYWRMb2dvKHBtKTsKKyAgICAgICAgfQorICAgICAgICBtSWNvbiA9IGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2ljb24pOworICAgICAgICBpZiAobUljb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbUljb24gPSBpbmZvLmxvYWRJY29uKHBtKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgRHJhd2FibGUgYmFja2dyb3VuZCA9IGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2JhY2tncm91bmQpOworICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoYmFja2dyb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1UaXRsZVN0eWxlUmVzID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl90aXRsZVRleHRTdHlsZSwgMCk7CisgICAgICAgIG1TdWJ0aXRsZVN0eWxlUmVzID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9zdWJ0aXRsZVRleHRTdHlsZSwgMCk7CisKKyAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdklkID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9jdXN0b21OYXZpZ2F0aW9uTGF5b3V0LCAwKTsKKyAgICAgICAgaWYgKGN1c3RvbU5hdklkICE9IDApIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KTsKKyAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gKFZpZXcpIGluZmxhdGVyLmluZmxhdGUoY3VzdG9tTmF2SWQsIG51bGwpOworICAgICAgICAgICAgbU5hdmlnYXRpb25Nb2RlID0gQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT007CisgICAgICAgIH0KKworICAgICAgICBtQ29udGVudEhlaWdodCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9oZWlnaHQsIDApOworCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIC8vIFRPRE86IFNldCB0aGlzIGluIHRoZSB0aGVtZQorICAgICAgICBtU3BhY2luZyA9IChpbnQpIChDT05URU5UX1NQQUNJTkdfRElQICogbWV0cmljcy5kZW5zaXR5ICsgMC41Zik7CisgICAgICAgIG1BY3Rpb25TcGFjaW5nID0gKGludCkgKENPTlRFTlRfQUNUSU9OX1NQQUNJTkdfRElQICogbWV0cmljcy5kZW5zaXR5ICsgMC41Zik7CisgICAgICAgIAorICAgICAgICBpZiAobUxvZ28gIT0gbnVsbCB8fCBtSWNvbiAhPSBudWxsIHx8IG1UaXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9nb05hdkl0ZW0gPSBuZXcgQWN0aW9uTWVudUl0ZW0oY29udGV4dCwgMCwgYW5kcm9pZC5SLmlkLmhvbWUsIDAsIDAsIG1UaXRsZSk7CisgICAgICAgICAgICBtSG9tZUNsaWNrTGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIGNvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQobUxvZ29OYXZJdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IGNoaWxkLCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIC8vIE5vIHN0YXJ0aW5nIGFuIGFjdGlvbiBtb2RlIGZvciBhbiBhY3Rpb24gYmFyIGNoaWxkISAoV2hlcmUgd291bGQgaXQgZ28/KQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUJ1aWxkZXIgYnVpbGRlciA9IChNZW51QnVpbGRlcikgbWVudTsKKyAgICAgICAgbU9wdGlvbnNNZW51ID0gYnVpbGRlcjsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVWaWV3KG1NZW51Vmlldyk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQWN0aW9uTWVudVZpZXcgbWVudVZpZXcgPSAoQWN0aW9uTWVudVZpZXcpIGJ1aWxkZXIuZ2V0TWVudVZpZXcoCisgICAgICAgICAgICAgICAgTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCBudWxsKTsKKyAgICAgICAgbUFjdGlvblNwYWNpbmcgPSBtZW51Vmlldy5nZXRJdGVtTWFyZ2luKCk7CisgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBsYXlvdXRQYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgIG1lbnVWaWV3LnNldExheW91dFBhcmFtcyhsYXlvdXRQYXJhbXMpOworICAgICAgICBhZGRWaWV3KG1lbnVWaWV3KTsKKyAgICAgICAgbU1lbnVWaWV3ID0gbWVudVZpZXc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2hvd092ZXJmbG93TWVudSgpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdFNob3dPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIHBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGlkZU92ZXJmbG93TWVudSgpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LmhpZGVPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd01lbnVTaG93aW5nKCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuaXNPdmVyZmxvd01lbnVTaG93aW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dSZXNlcnZlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1NZW51VmlldyAhPSBudWxsICYmIG1NZW51Vmlldy5pc092ZXJmbG93UmVzZXJ2ZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21OYXZpZ2F0aW9uVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgbUN1c3RvbU5hdlZpZXcgPSB2aWV3OworICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXROYXZpZ2F0aW9uTW9kZShBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVRpdGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciB0aXRsZS4gVGhpcyB3aWxsIGFsd2F5cyByZXBsYWNlIG9yIG92ZXJyaWRlIHdpbmRvdyB0aXRsZXMuCisgICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0V2luZG93VGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVXNlclRpdGxlID0gdHJ1ZTsKKyAgICAgICAgc2V0VGl0bGVJbXBsKHRpdGxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHdpbmRvdyB0aXRsZS4gQSB3aW5kb3cgdGl0bGUgd2lsbCBhbHdheXMgYmUgcmVwbGFjZWQgb3Igb3ZlcnJpZGRlbiBieSBhIHVzZXIgdGl0bGUuCisgICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0VGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd1RpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBpZiAoIW1Vc2VyVGl0bGUpIHsKKyAgICAgICAgICAgIHNldFRpdGxlSW1wbCh0aXRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VGl0bGVJbXBsKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvZ29OYXZJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvTmF2SXRlbS5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVN1YnRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtU3VidGl0bGUgPSBzdWJ0aXRsZTsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KHN1YnRpdGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKSB7CisgICAgICAgIGZpbmFsIGludCBmbGFnc0NoYW5nZWQgPSBvcHRpb25zIF4gbURpc3BsYXlPcHRpb25zOworICAgICAgICBtRGlzcGxheU9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICBpZiAoKGZsYWdzQ2hhbmdlZCAmIERJU1BMQVlfUkVMQVlPVVRfTUFTSykgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IHZpcyA9IChvcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfSElERV9IT01FKSAhPSAwID8gR09ORSA6IFZJU0lCTEU7CisgICAgICAgICAgICBpZiAobUxvZ29WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0VmlzaWJpbGl0eSh2aXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldFZpc2liaWxpdHkodmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmF2aWdhdGlvbk1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgZmluYWwgaW50IG9sZE1vZGUgPSBtTmF2aWdhdGlvbk1vZGU7CisgICAgICAgIGlmIChtb2RlICE9IG9sZE1vZGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob2xkTW9kZSkgeworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1UaXRsZUxheW91dCk7CisgICAgICAgICAgICAgICAgICAgIG1UaXRsZUxheW91dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgICAgICBpZiAobVNwaW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1TcGlubmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbVNwaW5uZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtQ3VzdG9tTmF2Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgICAgICBpZiAobVRhYkxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobVRhYlNjcm9sbFZpZXcpOworICAgICAgICAgICAgICAgICAgICBtVGFiTGF5b3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbVRhYlNjcm9sbFZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgICAgICBtU3Bpbm5lciA9IG5ldyBTcGlubmVyKG1Db250ZXh0LCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duU3Bpbm5lclN0eWxlKTsKKyAgICAgICAgICAgICAgICBtU3Bpbm5lci5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG1OYXZJdGVtU2VsZWN0ZWRMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtU3Bpbm5lcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgICAgIGFkZFZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICAgICAgbVRhYlNjcm9sbFZpZXcgPSBuZXcgSG9yaXpvbnRhbFNjcm9sbFZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtVGFiTGF5b3V0ID0gbmV3IExpbmVhckxheW91dChnZXRDb250ZXh0KCksIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uQmFyVGFiQmFyU3R5bGUpOworICAgICAgICAgICAgICAgIG1UYWJTY3JvbGxWaWV3LmFkZFZpZXcobVRhYkxheW91dCk7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtVGFiU2Nyb2xsVmlldyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBtb2RlOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duQWRhcHRlcihTcGlubmVyQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIG1TcGlubmVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBtU3Bpbm5lci5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbVNwaW5uZXIuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1DdXN0b21OYXZWaWV3OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gbU5hdmlnYXRpb25Nb2RlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldERpc3BsYXlPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gbURpc3BsYXlPcHRpb25zOworICAgIH0KKworICAgIHByaXZhdGUgVGFiVmlldyBjcmVhdGVUYWJWaWV3KEFjdGlvbkJhci5UYWIgdGFiKSB7CisgICAgICAgIGZpbmFsIFRhYlZpZXcgdGFiVmlldyA9IG5ldyBUYWJWaWV3KGdldENvbnRleHQoKSwgdGFiKTsKKyAgICAgICAgdGFiVmlldy5zZXRGb2N1c2FibGUodHJ1ZSk7CisKKyAgICAgICAgaWYgKG1UYWJDbGlja0xpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1UYWJDbGlja0xpc3RlbmVyID0gbmV3IFRhYkNsaWNrTGlzdGVuZXIoKTsKKyAgICAgICAgfQorICAgICAgICB0YWJWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihtVGFiQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIHJldHVybiB0YWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRhYihBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3QgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKSA9PSAwOworICAgICAgICBWaWV3IHRhYlZpZXcgPSBjcmVhdGVUYWJWaWV3KHRhYik7CisgICAgICAgIG1UYWJMYXlvdXQuYWRkVmlldyh0YWJWaWV3KTsKKyAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgIHRhYlZpZXcuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUYWIoQWN0aW9uQmFyLlRhYiB0YWIsIGludCBwb3NpdGlvbikgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3QgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKSA9PSAwOworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBjcmVhdGVUYWJWaWV3KHRhYik7CisgICAgICAgIG1UYWJMYXlvdXQuYWRkVmlldyh0YWJWaWV3LCBwb3NpdGlvbik7CisgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICB0YWJWaWV3LnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVGFiQXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1UYWJMYXlvdXQucmVtb3ZlVmlld0F0KHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpIHsKKyAgICAgICAgLy8gVXNlZCBieSBjdXN0b20gbmF2IHZpZXdzIGlmIHRoZXkgZG9uJ3Qgc3VwcGx5IGxheW91dCBwYXJhbXMuIEV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAvLyBhZGRlZCB0byBhbiBBY3Rpb25CYXJWaWV3IHNob3VsZCBoYXZlIHRoZW0gYWxyZWFkeS4KKyAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgeworICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKKworICAgICAgICBpZiAoKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgJiYgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3ID0gbmV3IEltYWdlVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRBZGp1c3RWaWV3Qm91bmRzKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRJbWFnZURyYXdhYmxlKG1Mb2dvKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihtSG9tZUNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobUxvZ29WaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldyA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0QWRqdXN0Vmlld0JvdW5kcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtSWNvbik7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobUhvbWVDbGlja0xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1JY29uVmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobUxvZ29WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbml0VGl0bGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIGRyb3Bkb3duIGxpc3QgbmF2aWdhdGlvbiBpc24ndCBzdXBwb3J0ZWQgeWV0ISIpOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIHRhYiBuYXZpZ2F0aW9uIGlzbid0IHN1cHBvcnRlZCB5ZXQhIik7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtQ3VzdG9tTmF2Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRpdGxlKCkgeworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVRpdGxlTGF5b3V0ID0gKExpbmVhckxheW91dCkgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX3RpdGxlX2l0ZW0sIG51bGwpOworICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl90aXRsZSk7CisgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3N1YnRpdGxlKTsKKworICAgICAgICBpZiAobVRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVRpdGxlU3R5bGVSZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVN1YnRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVN1YnRpdGxlU3R5bGVSZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtU3VidGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KG1TdWJ0aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFiU2VsZWN0ZWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGZpbmFsIGludCB0YWJDb3VudCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtVGFiTGF5b3V0LmdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBjaGlsZC5zZXRTZWxlY3RlZChpID09IHBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRWaWV3KEFjdGlvbkJhckNvbnRleHRWaWV3IHZpZXcpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3ID0gdmlldzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKHdpZHRoTW9kZSAhPSBNZWFzdXJlU3BlYy5FWEFDVExZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhbmRyb2lkOmxheW91dF93aWR0aD1cIm1hdGNoX3BhcmVudFwiIChvciBmaWxsX3BhcmVudCkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKGhlaWdodE1vZGUgIT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PVwid3JhcF9jb250ZW50XCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZW50V2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworCisgICAgICAgIGludCBtYXhIZWlnaHQgPSBtQ29udGVudEhlaWdodCA+IDAgPworICAgICAgICAgICAgICAgIG1Db250ZW50SGVpZ2h0IDogTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBpbnQgdmVydGljYWxQYWRkaW5nID0gZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBpbnQgYXZhaWxhYmxlV2lkdGggPSBjb250ZW50V2lkdGggLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBtYXhIZWlnaHQgLSB2ZXJ0aWNhbFBhZGRpbmc7CisgICAgICAgIGZpbmFsIGludCBjaGlsZFNwZWNIZWlnaHQgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKworICAgICAgICBpZiAobUxvZ29WaWV3ICE9IG51bGwgJiYgbUxvZ29WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobUxvZ29WaWV3LCBhdmFpbGFibGVXaWR0aCwgY2hpbGRTcGVjSGVpZ2h0LCBtU3BhY2luZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1JY29uVmlldywgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtTWVudVZpZXcsIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIDApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZWFzdXJlQ2hpbGRWaWV3KG1UaXRsZUxheW91dCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3Bpbm5lci5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkFUX01PU1QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBtQ3VzdG9tTmF2Vmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2V2lkdGhNb2RlID0gbHAud2lkdGggIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2V2lkdGggPSBscC53aWR0aCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLndpZHRoLCBhdmFpbGFibGVXaWR0aCkgOiBhdmFpbGFibGVXaWR0aDsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhY3Rpb24gYmFyIGlzIHdyYXBwaW5nIHRvIGl0cyBjb250ZW50IGhlaWdodCwgZG9uJ3QgYWxsb3cgYSBjdXN0b20KKyAgICAgICAgICAgICAgICAvLyB2aWV3IHRvIE1BVENIX1BBUkVOVC4KKyAgICAgICAgICAgICAgICBpbnQgY3VzdG9tTmF2SGVpZ2h0TW9kZTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRlbnRIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBjdXN0b21OYXZIZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjdXN0b21OYXZIZWlnaHRNb2RlID0gbHAuaGVpZ2h0ICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2SGVpZ2h0ID0gbHAuaGVpZ2h0ID49IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAuaGVpZ2h0LCBoZWlnaHQpIDogaGVpZ2h0OworICAgICAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2V2lkdGgsIGN1c3RvbU5hdldpZHRoTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2SGVpZ2h0LCBjdXN0b21OYXZIZWlnaHRNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBpZiAobVRhYlNjcm9sbFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UYWJTY3JvbGxWaWV3Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkFUX01PU1QpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNvbnRlbnRIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgaW50IG1lYXN1cmVkSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFZpZXcgdiA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICAgICAgaW50IHBhZGRlZFZpZXdIZWlnaHQgPSB2LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyB2ZXJ0aWNhbFBhZGRpbmc7CisgICAgICAgICAgICAgICAgaWYgKHBhZGRlZFZpZXdIZWlnaHQgPiBtZWFzdXJlZEhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IHBhZGRlZFZpZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihjb250ZW50V2lkdGgsIG1heEhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNvbnRleHRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0Vmlldy5zZXRIZWlnaHQoZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlQ2hpbGRWaWV3KFZpZXcgY2hpbGQsIGludCBhdmFpbGFibGVXaWR0aCwgaW50IGNoaWxkU3BlY0hlaWdodCwgaW50IHNwYWNpbmcpIHsKKyAgICAgICAgY2hpbGQubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkFUX01PU1QpLAorICAgICAgICAgICAgICAgIGNoaWxkU3BlY0hlaWdodCk7CisKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBzcGFjaW5nOworCisgICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgIGludCB4ID0gZ2V0UGFkZGluZ0xlZnQoKTsKKyAgICAgICAgZmluYWwgaW50IHkgPSBnZXRQYWRkaW5nVG9wKCk7CisgICAgICAgIGZpbmFsIGludCBjb250ZW50SGVpZ2h0ID0gYiAtIHQgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisKKyAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsICYmIG1Mb2dvVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1Mb2dvVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgfQorICAgICAgICBpZiAobUljb25WaWV3ICE9IG51bGwgJiYgbUljb25WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUljb25WaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRpdGxlTGF5b3V0LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVNwaW5uZXIsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DdXN0b21OYXZWaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgaWYgKG1UYWJTY3JvbGxWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRhYlNjcm9sbFZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB4ID0gciAtIGwgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHggLT0gcG9zaXRpb25DaGlsZEludmVyc2UobU1lbnVWaWV3LCB4ICsgbUFjdGlvblNwYWNpbmcsIHksIGNvbnRlbnRIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIC0gbUFjdGlvblNwYWNpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBwb3NpdGlvbkNoaWxkKFZpZXcgY2hpbGQsIGludCB4LCBpbnQgeSwgaW50IGNvbnRlbnRIZWlnaHQpIHsKKyAgICAgICAgaW50IGNoaWxkV2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGludCBjaGlsZEhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIGludCBjaGlsZFRvcCA9IHkgKyAoY29udGVudEhlaWdodCAtIGNoaWxkSGVpZ2h0KSAvIDI7CisKKyAgICAgICAgY2hpbGQubGF5b3V0KHgsIGNoaWxkVG9wLCB4ICsgY2hpbGRXaWR0aCwgY2hpbGRUb3AgKyBjaGlsZEhlaWdodCk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkV2lkdGg7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKFZpZXcgY2hpbGQsIGludCB4LCBpbnQgeSwgaW50IGNvbnRlbnRIZWlnaHQpIHsKKyAgICAgICAgaW50IGNoaWxkV2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGludCBjaGlsZEhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIGludCBjaGlsZFRvcCA9IHkgKyAoY29udGVudEhlaWdodCAtIGNoaWxkSGVpZ2h0KSAvIDI7CisKKyAgICAgICAgY2hpbGQubGF5b3V0KHggLSBjaGlsZFdpZHRoLCBjaGlsZFRvcCwgeCwgY2hpbGRUb3AgKyBjaGlsZEhlaWdodCk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkV2lkdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFiVmlldyBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyLlRhYiBtVGFiOworCisgICAgICAgIHB1YmxpYyBUYWJWaWV3KENvbnRleHQgY29udGV4dCwgQWN0aW9uQmFyLlRhYiB0YWIpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hY3Rpb25CYXJUYWJTdHlsZSk7CisgICAgICAgICAgICBtVGFiID0gdGFiOworCisgICAgICAgICAgICBmaW5hbCBWaWV3IGN1c3RvbSA9IHRhYi5nZXRDdXN0b21WaWV3KCk7CisgICAgICAgICAgICBpZiAoY3VzdG9tICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KGN1c3RvbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gU3R5bGUgdGFicyBiYXNlZCBvbiB0aGUgdGhlbWUKKworICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGljb24gPSB0YWIuZ2V0SWNvbigpOworICAgICAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSB0ZXh0ID0gdGFiLmdldFRleHQoKTsKKworICAgICAgICAgICAgICAgIGlmIChpY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gbmV3IEltYWdlVmlldyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShpY29uKTsKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUw7CisgICAgICAgICAgICAgICAgICAgIGljb25WaWV3LnNldExheW91dFBhcmFtcyhscCk7CisgICAgICAgICAgICAgICAgICAgIGFkZFZpZXcoaWNvblZpZXcpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoY29udGV4dCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uQmFyVGFiVGV4dFN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0U2luZ2xlTGluZSgpOworICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRFbGxpcHNpemUoVHJ1bmNhdGVBdC5FTkQpOworICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTDsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkVmlldyh0ZXh0Vmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCAxKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWN0aW9uQmFyLlRhYiBnZXRUYWIoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRhYjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVGFiQ2xpY2tMaXN0ZW5lciBpbXBsZW1lbnRzIE9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2aWV3KSB7CisgICAgICAgICAgICBUYWJWaWV3IHRhYlZpZXcgPSAoVGFiVmlldykgdmlldzsKKyAgICAgICAgICAgIHRhYlZpZXcuZ2V0VGFiKCkuc2VsZWN0KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgdGFiQ291bnQgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtVGFiTGF5b3V0LmdldENoaWxkQXQoaSk7CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0U2VsZWN0ZWQoY2hpbGQgPT0gdmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQ29udGFjdEhlYWRlcldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIxNDY2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQ29udGFjdEhlYWRlcldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci0KLWltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5QaG9uZUxvb2t1cDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c1VwZGF0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5RdWlja0NvbnRhY3RCYWRnZTsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLS8qKgotICogSGVhZGVyIHVzZWQgYWNyb3NzIHN5c3RlbSBmb3IgZGlzcGxheWluZyBhIHRpdGxlIGJhciB3aXRoIGNvbnRhY3QgaW5mby4gWW91Ci0gKiBjYW4gYmluZCBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlIGhlYWRlciwgb3IgdXNlIGhlbHBlciBtZXRob2RzIGxpa2UKLSAqIHtAbGluayAjYmluZEZyb21Db250YWN0SWQobG9uZyl9IHRvIHBvcHVsYXRlIGFzeW5jaHJvbm91c2x5LgotICogPHA+Ci0gKiBUaGUgcGFyZW50IG11c3QgcmVxdWVzdCB0aGUge0BsaW5rIE1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9DT05UQUNUU30KLSAqIHBlcm1pc3Npb24gdG8gYWNjZXNzIGNvbnRhY3QgZGF0YS4KLSAqLwotcHVibGljIGNsYXNzIENvbnRhY3RIZWFkZXJXaWRnZXQgZXh0ZW5kcyBGcmFtZUxheW91dCBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ29udGFjdEhlYWRlcldpZGdldCI7Ci0KLSAgICBwcml2YXRlIFRleHRWaWV3IG1EaXNwbGF5TmFtZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1BZ2dyZWdhdGVCYWRnZTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1QaG9uZXRpY05hbWVWaWV3OwotICAgIHByaXZhdGUgQ2hlY2tCb3ggbVN0YXJyZWRWaWV3OwotICAgIHByaXZhdGUgUXVpY2tDb250YWN0QmFkZ2UgbVBob3RvVmlldzsKLSAgICBwcml2YXRlIEltYWdlVmlldyBtUHJlc2VuY2VWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c1ZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzQXR0cmlidXRpb25WaWV3OwotICAgIHByaXZhdGUgaW50IG1Ob1Bob3RvUmVzb3VyY2U7Ci0gICAgcHJpdmF0ZSBRdWVyeUhhbmRsZXIgbVF1ZXJ5SGFuZGxlcjsKLQotICAgIHByb3RlY3RlZCBVcmkgbUNvbnRhY3RVcmk7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUV4Y2x1ZGVNaW1lcyA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIGNhbGxiYWNrcyBpbnZva2VkIHdoZW4gdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGggYSBoZWFkZXIuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBDb250YWN0SGVhZGVyTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBvblBob3RvQ2xpY2soVmlldyB2aWV3KTsKLSAgICAgICAgcHVibGljIHZvaWQgb25EaXNwbGF5TmFtZUNsaWNrKFZpZXcgdmlldyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb250YWN0SGVhZGVyTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0KLSAgICBwcml2YXRlIGludGVyZmFjZSBDb250YWN0UXVlcnkgewotICAgICAgICAvL1Byb2plY3Rpb24gdXNlZCBmb3IgdGhlIHN1bW1hcnkgaW5mbyBpbiB0aGUgaGVhZGVyLgotICAgICAgICBTdHJpbmdbXSBDT0xVTU5TID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIENvbnRhY3RzLl9JRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkxPT0tVUF9LRVksCi0gICAgICAgICAgICBDb250YWN0cy5QSE9UT19JRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgIENvbnRhY3RzLlBIT05FVElDX05BTUUsCi0gICAgICAgICAgICBDb250YWN0cy5TVEFSUkVELAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9QUkVTRU5DRSwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfUkVTX1BBQ0tBR0UsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVU19MQUJFTCwKLSAgICAgICAgfTsKLSAgICAgICAgaW50IF9JRCA9IDA7Ci0gICAgICAgIGludCBMT09LVVBfS0VZID0gMTsKLSAgICAgICAgaW50IFBIT1RPX0lEID0gMjsKLSAgICAgICAgaW50IERJU1BMQVlfTkFNRSA9IDM7Ci0gICAgICAgIGludCBQSE9ORVRJQ19OQU1FID0gNDsKLSAgICAgICAgLy9UT0RPOiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHdlJ3JlIGdvaW5nIHRvIGdldCB0aGUgcGhvbmV0aWMgbmFtZS4KLSAgICAgICAgLy9zdGF0aWMgZmluYWwgaW50IEhFQURFUl9QSE9ORVRJQ19OQU1FX0NPTFVNTl9JTkRFWAotICAgICAgICBpbnQgU1RBUlJFRCA9IDU7Ci0gICAgICAgIGludCBDT05UQUNUX1BSRVNFTkNFX1NUQVRVUyA9IDY7Ci0gICAgICAgIGludCBDT05UQUNUX1NUQVRVUyA9IDc7Ci0gICAgICAgIGludCBDT05UQUNUX1NUQVRVU19USU1FU1RBTVAgPSA4OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfUkVTX1BBQ0tBR0UgPSA5OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfTEFCRUwgPSAxMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludGVyZmFjZSBQaG90b1F1ZXJ5IHsKLSAgICAgICAgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBQaG90by5QSE9UTwotICAgICAgICB9OwotCi0gICAgICAgIGludCBQSE9UTyA9IDA7Ci0gICAgfQotCi0gICAgLy9Qcm9qZWN0aW9uIHVzZWQgZm9yIGxvb2tpbmcgdXAgY29udGFjdCBpZCBmcm9tIHBob25lIG51bWJlcgotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBQaG9uZUxvb2t1cC5fSUQsCi0gICAgICAgIFBob25lTG9va3VwLkxPT0tVUF9LRVksCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQSE9ORV9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVggPSAwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBIT05FX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYID0gMTsKLQotICAgIC8vUHJvamVjdGlvbiB1c2VkIGZvciBsb29raW5nIHVwIGNvbnRhY3QgaWQgZnJvbSBlbWFpbCBhZGRyZXNzCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTUFJTF9MT09LVVBfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIFJhd0NvbnRhY3RzLkNPTlRBQ1RfSUQsCi0gICAgICAgIENvbnRhY3RzLkxPT0tVUF9LRVksCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTUFJTF9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVggPSAwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVNQUlMX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYID0gMTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OVEFDVF9MT09LVVBfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIENvbnRhY3RzLl9JRCwKLSAgICB9OwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTlRBQ1RfTE9PS1VQX0lEX0NPTFVNTl9JTkRFWCA9IDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fQ09OVEFDVF9JTkZPID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fUEhPTkVfTE9PS1VQID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fRU1BSUxfTE9PS1VQID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fUEhPVE9fUVVFUlkgPSAzOwotCi0gICAgcHVibGljIENvbnRhY3RIZWFkZXJXaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RIZWFkZXJXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RIZWFkZXJXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLQotICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9Ci0gICAgICAgICAgICAoTGF5b3V0SW5mbGF0ZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuY29udGFjdF9oZWFkZXIsIHRoaXMpOwotCi0gICAgICAgIG1EaXNwbGF5TmFtZVZpZXcgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLm5hbWUpOwotICAgICAgICBtQWdncmVnYXRlQmFkZ2UgPSBmaW5kVmlld0J5SWQoUi5pZC5hZ2dyZWdhdGVfYmFkZ2UpOwotCi0gICAgICAgIG1QaG9uZXRpY05hbWVWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5waG9uZXRpY19uYW1lKTsKLQotICAgICAgICBtU3RhcnJlZFZpZXcgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQuc3Rhcik7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgbVBob3RvVmlldyA9IChRdWlja0NvbnRhY3RCYWRnZSkgZmluZFZpZXdCeUlkKFIuaWQucGhvdG8pOwotCi0gICAgICAgIG1QcmVzZW5jZVZpZXcgPSAoSW1hZ2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5wcmVzZW5jZSk7Ci0KLSAgICAgICAgbVN0YXR1c1ZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzKTsKLSAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXNfZGF0ZSk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBwaG90byB3aXRoIGEgcmFuZG9tICJubyBjb250YWN0IiBpbWFnZQotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwotICAgICAgICBpbnQgbnVtID0gKGludCkgbm93ICYgMHhmOwotICAgICAgICBpZiAobnVtIDwgOSkgewotICAgICAgICAgICAgLy8gTGVhbmluZyBpbiBmcm9tIHJpZ2h0LCBjb21tb24KLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZTsKLSAgICAgICAgfSBlbHNlIGlmIChudW0gPCAxNCkgewotICAgICAgICAgICAgLy8gTGVhbmluZyBpbiBmcm9tIGxlZnQgdW5jb21tb24KLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZV8yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQ29taW5nIGluIGZyb20gdGhlIHRvcCwgcmFyZQotICAgICAgICAgICAgbU5vUGhvdG9SZXNvdXJjZSA9IFIuZHJhd2FibGUuaWNfY29udGFjdF9waWN0dXJlXzM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5hYmxlQ2xpY2tMaXN0ZW5lcnMoKSB7Ci0gICAgICAgIG1EaXNwbGF5TmFtZVZpZXcuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotICAgICAgICBtUGhvdG9WaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGdpdmVuIHtAbGluayBDb250YWN0SGVhZGVyTGlzdGVuZXJ9IHRvIGhhbmRsZSBoZWFkZXIgZXZlbnRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhY3RIZWFkZXJMaXN0ZW5lcihDb250YWN0SGVhZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1QaG90b0NsaWNrKCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vblBob3RvQ2xpY2sobVBob3RvVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybURpc3BsYXlOYW1lQ2xpY2soKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uRGlzcGxheU5hbWVDbGljayhtRGlzcGxheU5hbWVWaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUXVlcnlIYW5kbGVyIGV4dGVuZHMgQXN5bmNRdWVyeUhhbmRsZXIgewotCi0gICAgICAgIHB1YmxpYyBRdWVyeUhhbmRsZXIoQ29udGVudFJlc29sdmVyIGNyKSB7Ci0gICAgICAgICAgICBzdXBlcihjcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25RdWVyeUNvbXBsZXRlKGludCB0b2tlbiwgT2JqZWN0IGNvb2tpZSwgQ3Vyc29yIGN1cnNvcikgewotICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgIGlmICh0aGlzICE9IG1RdWVyeUhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25RdWVyeUNvbXBsZXRlOiBkaXNjYXJkIHJlc3VsdCwgdGhlIHF1ZXJ5IGhhbmRsZXIgaXMgcmVzZXQhIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9LRU5fUEhPVE9fUVVFUlk6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU2V0IHRoZSBwaG90bwotICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIHBob3RvQml0bWFwID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhY3Vyc29yLmlzTnVsbChQaG90b1F1ZXJ5LlBIT1RPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBwaG90b0RhdGEgPSBjdXJzb3IuZ2V0QmxvYihQaG90b1F1ZXJ5LlBIT1RPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0JpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHBob3RvRGF0YSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob3RvRGF0YS5sZW5ndGgsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvdG9CaXRtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob3RvQml0bWFwID0gbG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LnNldEltYWdlQml0bWFwKHBob3RvQml0bWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb29raWUgIT0gbnVsbCAmJiBjb29raWUgaW5zdGFuY2VvZiBVcmkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RVcmkoKFVyaSkgY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9LRU5fQ09OVEFDVF9JTkZPOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kQ29udGFjdEluZm8oY3Vyc29yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkgbG9va3VwVXJpID0gQ29udGFjdHMuZ2V0TG9va3VwVXJpKGN1cnNvci5nZXRMb25nKENvbnRhY3RRdWVyeS5fSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmdldFN0cmluZyhDb250YWN0UXVlcnkuTE9PS1VQX0tFWSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwaG90b0lkID0gY3Vyc29yLmdldExvbmcoQ29udGFjdFF1ZXJ5LlBIT1RPX0lEKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaG90b0lkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb29raWUgIT0gbnVsbCAmJiBjb29raWUgaW5zdGFuY2VvZiBVcmkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdFVyaSgoVXJpKSBjb29raWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBob3RvUXVlcnkocGhvdG9JZCwgbG9va3VwVXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGRvbid0IHJlc2V0IHF1ZXJ5IGhhbmRsZXIgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IHJlYWxseSBoYXBwZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5TmFtZShudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9LRU5fUEhPTkVfTE9PS1VQOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGNvbnRhY3RJZCA9IGN1cnNvci5nZXRMb25nKFBIT05FX0xPT0tVUF9DT05UQUNUX0lEX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvb2t1cEtleSA9IGN1cnNvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSE9ORV9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoQ29udGFjdHMuZ2V0TG9va3VwVXJpKGNvbnRhY3RJZCwgbG9va3VwS2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGRvbid0IHJlc2V0IHF1ZXJ5IGhhbmRsZXIgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGhvbmVOdW1iZXIgPSAoU3RyaW5nKSBjb29raWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUocGhvbmVOdW1iZXIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNvY2lhbFNuaXBwZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGhvdG8obG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdEZyb21QaG9uZShwaG9uZU51bWJlciwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0VNQUlMX0xPT0tVUDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb250YWN0SWQgPSBjdXJzb3IuZ2V0TG9uZyhFTUFJTF9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXBLZXkgPSBjdXJzb3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1BSUxfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKENvbnRhY3RzLmdldExvb2t1cFVyaShjb250YWN0SWQsIGxvb2t1cEtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IChTdHJpbmcpIGNvb2tpZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5TmFtZShlbWFpbEFkZHJlc3MsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNvY2lhbFNuaXBwZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGhvdG8obG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdEZyb21FbWFpbChlbWFpbEFkZHJlc3MsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJuIG9uL29mZiBzaG93aW5nIG9mIHRoZSBhZ2dyZWdhdGUgYmFkZ2UgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93QWdncmVnYXRlQmFkZ2UoYm9vbGVhbiBzaG93QmFnZGUpIHsKLSAgICAgICAgbUFnZ3JlZ2F0ZUJhZGdlLnNldFZpc2liaWxpdHkoc2hvd0JhZ2RlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJuIG9uL29mZiBzaG93aW5nIG9mIHRoZSBzdGFyIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1N0YXIoYm9vbGVhbiBzaG93U3RhcikgewotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0VmlzaWJpbGl0eShzaG93U3RhciA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBzdGFycmVkIHN0YXRlIG9mIHRoaXMgaGVhZGVyIHdpZGdldC4gVGhpcyBkb2Vzbid0IGNoYW5nZQotICAgICAqIHRoZSB1bmRlcmx5aW5nIHtAbGluayBDb250YWN0c30gdmFsdWUsIG9ubHkgdGhlIFVJIHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXJlZChib29sZWFuIHN0YXJyZWQpIHsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldENoZWNrZWQoc3RhcnJlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBwcmVzZW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVzZW5jZShpbnQgcHJlc2VuY2UpIHsKLSAgICAgICAgbVByZXNlbmNlVmlldy5zZXRJbWFnZVJlc291cmNlKFN0YXR1c1VwZGF0ZXMuZ2V0UHJlc2VuY2VJY29uUmVzb3VyY2VJZChwcmVzZW5jZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgY29udGFjdCB1cmkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0VXJpKFVyaSB1cmkpIHsKLSAgICAgICAgc2V0Q29udGFjdFVyaSh1cmksIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgY29udGFjdCB1cmkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0VXJpKFVyaSB1cmksIGJvb2xlYW4gc2VuZFRvRmFzdHJhY2spIHsKLSAgICAgICAgbUNvbnRhY3RVcmkgPSB1cmk7Ci0gICAgICAgIGlmIChzZW5kVG9GYXN0cmFjaykgewotICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0VXJpKHVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHBob3RvIHRvIGRpc3BsYXkgaW4gdGhlIGhlYWRlci4gVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUKLSAgICAgKiB1bmRlcmx5aW5nIHtAbGluayBDb250YWN0c30sIG9ubHkgdGhlIFVJIHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBob3RvKEJpdG1hcCBiaXRtYXApIHsKLSAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgZGlzcGxheSBuYW1lIGFuZCBwaG9uZXRpYyBuYW1lIHRvIHNob3cgaW4gdGhlIGhlYWRlci4KLSAgICAgKiBUaGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIHtAbGluayBDb250YWN0c30sIG9ubHkgdGhlIFVJIHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKENoYXJTZXF1ZW5jZSBkaXNwbGF5TmFtZSwgQ2hhclNlcXVlbmNlIHBob25ldGljTmFtZSkgewotICAgICAgICBtRGlzcGxheU5hbWVWaWV3LnNldFRleHQoZGlzcGxheU5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTmFtZSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY05hbWVWaWV3LnNldFRleHQocGhvbmV0aWNOYW1lKTsKLSAgICAgICAgICAgIG1QaG9uZXRpY05hbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY05hbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgc29jaWFsIHNuaXBwZXQgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U29jaWFsU25pcHBldChDaGFyU2VxdWVuY2Ugc25pcHBldCkgewotICAgICAgICBpZiAoc25pcHBldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFRleHQoc25pcHBldCk7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBsaXN0IG9mIHNwZWNpZmljIE1JTUUtdHlwZXMgdG8gZXhjbHVkZSBhbmQgbm90IGRpc3BsYXkuIEZvcgotICAgICAqIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gaGlkZSB0aGUge0BsaW5rIENvbnRhY3RzI0NPTlRFTlRfSVRFTV9UWVBFfQotICAgICAqIHByb2ZpbGUgaWNvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlTWltZXMoU3RyaW5nW10gZXhjbHVkZU1pbWVzKSB7Ci0gICAgICAgIG1FeGNsdWRlTWltZXMgPSBleGNsdWRlTWltZXM7Ci0gICAgICAgIG1QaG90b1ZpZXcuc2V0RXhjbHVkZU1pbWVzKGV4Y2x1ZGVNaW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBiaW5kaW5nIGFsbCBhdmFpbGFibGUgZGF0YSBmcm9tIGFuIGV4aXN0aW5nCi0gICAgICogY29udGFjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250YWN0TG9va3VwVXJpIGEge0NvbnRhY3RzLkNPTlRFTlRfTE9PS1VQX1VSSX0gc3R5bGUgVVJJLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJpbmRGcm9tQ29udGFjdExvb2t1cFVyaShVcmkgY29udGFjdExvb2t1cFVyaSkgewotICAgICAgICBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChjb250YWN0TG9va3VwVXJpLCB0cnVlIC8qIHJlc2V0IHF1ZXJ5IGhhbmRsZXIgKi8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdFVyaSBhIHtDb250YWN0cy5DT05URU5UX1VSSX0gc3R5bGUgVVJJLgotICAgICAqIEBwYXJhbSByZXNldFF1ZXJ5SGFuZGxlciB3aGV0aGVyIHRvIHVzZSBhIG5ldyBBc3luY1F1ZXJ5SGFuZGxlciBvciBub3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKFVyaSBjb250YWN0VXJpLCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIG1Db250YWN0VXJpID0gY29udGFjdFVyaTsKLSAgICAgICAgc3RhcnRDb250YWN0UXVlcnkoY29udGFjdFVyaSwgcmVzZXRRdWVyeUhhbmRsZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW1haWxBZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHVzZWQgdG8gZG8gYSByZXZlcnNlIGxvb2t1cCBpbgotICAgICAqIHRoZSBjb250YWN0cyBkYXRhYmFzZS4gSWYgbW9yZSB0aGFuIG9uZSBjb250YWN0IGNvbnRhaW5zIHRoaXMgZW1haWwKLSAgICAgKiBhZGRyZXNzLCBvbmUgb2YgdGhlbSB3aWxsIGJlIGNob3NlbiB0byBiaW5kIHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJpbmRGcm9tRW1haWwoU3RyaW5nIGVtYWlsQWRkcmVzcykgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0VNQUlMX0xPT0tVUCwgZW1haWxBZGRyZXNzLAotICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKEVtYWlsLkNPTlRFTlRfTE9PS1VQX1VSSSwgVXJpLmVuY29kZShlbWFpbEFkZHJlc3MpKSwKLSAgICAgICAgICAgICAgICBFTUFJTF9MT09LVVBfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBiaW5kaW5nIGFsbCBhdmFpbGFibGUgZGF0YSBmcm9tIGFuIGV4aXN0aW5nCi0gICAgICogY29udGFjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBudW1iZXIgVGhlIHBob25lIG51bWJlciB1c2VkIHRvIGRvIGEgcmV2ZXJzZSBsb29rdXAgaW4KLSAgICAgKiB0aGUgY29udGFjdHMgZGF0YWJhc2UuIElmIG1vcmUgdGhhbiBvbmUgY29udGFjdCBjb250YWlucyB0aGlzIHBob25lCi0gICAgICogbnVtYmVyLCBvbmUgb2YgdGhlbSB3aWxsIGJlIGNob3NlbiB0byBiaW5kIHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJpbmRGcm9tUGhvbmVOdW1iZXIoU3RyaW5nIG51bWJlcikgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX1BIT05FX0xPT0tVUCwgbnVtYmVyLAotICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKFBob25lTG9va3VwLkNPTlRFTlRfRklMVEVSX1VSSSwgVXJpLmVuY29kZShudW1iZXIpKSwKLSAgICAgICAgICAgICAgICBQSE9ORV9MT09LVVBfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3RhcnRDb250YWN0UXVlcnkKLSAgICAgKgotICAgICAqIGludGVybmFsIG1ldGhvZCB0byBxdWVyeSBjb250YWN0IGJ5IFVyaS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250YWN0VXJpIHRoZSBjb250YWN0IHVyaQotICAgICAqIEBwYXJhbSByZXNldFF1ZXJ5SGFuZGxlciB3aGV0aGVyIHRvIHVzZSBhIG5ldyBBc3luY1F1ZXJ5SGFuZGxlciBvciBub3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRDb250YWN0UXVlcnkoVXJpIGNvbnRhY3RVcmksIGJvb2xlYW4gcmVzZXRRdWVyeUhhbmRsZXIpIHsKLSAgICAgICAgaWYgKHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtUXVlcnlIYW5kbGVyLnN0YXJ0UXVlcnkoVE9LRU5fQ09OVEFDVF9JTkZPLCBjb250YWN0VXJpLCBjb250YWN0VXJpLCBDb250YWN0UXVlcnkuQ09MVU1OUywKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzdGFydFBob3RvUXVlcnkKLSAgICAgKgotICAgICAqIGludGVybmFsIG1ldGhvZCB0byBxdWVyeSBjb250YWN0IHBob3RvIGJ5IHBob3RvIGlkIGFuZCB1cmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGhvdG9JZCB0aGUgcGhvdG8gaWQuCi0gICAgICogQHBhcmFtIGxvb2t1cEtleSB0aGUgbG9va3VwIHVyaS4KLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0UGhvdG9RdWVyeShsb25nIHBob3RvSWQsIFVyaSBsb29rdXBLZXksIGJvb2xlYW4gcmVzZXRRdWVyeUhhbmRsZXIpIHsKLSAgICAgICAgaWYgKHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtUXVlcnlIYW5kbGVyLnN0YXJ0UXVlcnkoVE9LRU5fUEhPVE9fUVVFUlksIGxvb2t1cEtleSwKLSAgICAgICAgICAgICAgICBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChEYXRhLkNPTlRFTlRfVVJJLCBwaG90b0lkKSwgUGhvdG9RdWVyeS5DT0xVTU5TLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0byBmb3JjZSB0aGlzIHdpZGdldCB0byBmb3JnZXQgZXZlcnl0aGluZyBpdCBrbm93cyBhYm91dCB0aGUgY29udGFjdC4KLSAgICAgKiBXZSBuZWVkIHRvIHN0b3AgYW55IGV4aXN0aW5nIGFzeW5jIHF1ZXJpZXMgZm9yIHBob25lLCBlbWFpbCwgY29udGFjdCwgYW5kIHBob3Rvcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3aXBlQ2xlYW4oKSB7Ci0gICAgICAgIHJlc2V0QXN5bmNRdWVyeUhhbmRsZXIoKTsKLQotICAgICAgICBzZXREaXNwbGF5TmFtZShudWxsLCBudWxsKTsKLSAgICAgICAgc2V0UGhvdG8obG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICBzZXRQcmVzZW5jZSgwKTsKLSAgICAgICAgbUNvbnRhY3RVcmkgPSBudWxsOwotICAgICAgICBtRXhjbHVkZU1pbWVzID0gbnVsbDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCkgewotICAgICAgICAvLyB0aGUgYXBpIEFzeW5jUXVlcnlIYW5kbGVyLmNhbmNlbE9wZXJhdGlvbigpIGRvZXNuJ3QgcmVhbGx5IHdvcmsuIFNpbmNlIHdlIHJlYWxseQotICAgICAgICAvLyBuZWVkIHRoZSBvbGQgYXN5bmMgcXVlcmllcyB0byBiZSBjYW5jZWxsZWQsIGxldCdzIGRvIGl0IHRoZSBoYXJkIHdheS4KLSAgICAgICAgbVF1ZXJ5SGFuZGxlciA9IG5ldyBRdWVyeUhhbmRsZXIobUNvbnRlbnRSZXNvbHZlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmluZCB0aGUgY29udGFjdCBkZXRhaWxzIHByb3ZpZGVkIGJ5IHRoZSBnaXZlbiB7QGxpbmsgQ3Vyc29yfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kQ29udGFjdEluZm8oQ3Vyc29yIGMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkRJU1BMQVlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY05hbWUgPSBjLmdldFN0cmluZyhDb250YWN0UXVlcnkuUEhPTkVUSUNfTkFNRSk7Ci0gICAgICAgIHRoaXMuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUsIHBob25ldGljTmFtZSk7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBzdGFycmVkID0gYy5nZXRJbnQoQ29udGFjdFF1ZXJ5LlNUQVJSRUQpICE9IDA7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRDaGVja2VkKHN0YXJyZWQpOwotCi0gICAgICAgIC8vU2V0IHRoZSBwcmVzZW5jZSBzdGF0dXMKLSAgICAgICAgaWYgKCFjLmlzTnVsbChDb250YWN0UXVlcnkuQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMpKSB7Ci0gICAgICAgICAgICBpbnQgcHJlc2VuY2UgPSBjLmdldEludChDb250YWN0UXVlcnkuQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMpOwotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRJbWFnZVJlc291cmNlKFN0YXR1c1VwZGF0ZXMuZ2V0UHJlc2VuY2VJY29uUmVzb3VyY2VJZChwcmVzZW5jZSkpOwotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUHJlc2VuY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vU2V0IHRoZSBzdGF0dXMgdXBkYXRlCi0gICAgICAgIFN0cmluZyBzdGF0dXMgPSBjLmdldFN0cmluZyhDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVMpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHN0YXR1cykpIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFRleHQoc3RhdHVzKTsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpbWVzdGFtcCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCkpIHsKLSAgICAgICAgICAgICAgICBsb25nIGRhdGUgPSBjLmdldExvbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGRhdGUvdGltZSBmaWVsZCBieSBtaXhpbmcgcmVsYXRpdmUgYW5kIGFic29sdXRlCi0gICAgICAgICAgICAgICAgLy8gdGltZXMuCi0gICAgICAgICAgICAgICAgaW50IGZsYWdzID0gRGF0ZVV0aWxzLkZPUk1BVF9BQkJSRVZfUkVMQVRJVkU7Ci0KLSAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBEYXRlVXRpbHMuZ2V0UmVsYXRpdmVUaW1lU3BhblN0cmluZyhkYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIERhdGVVdGlscy5NSU5VVEVfSU5fTUlMTElTLCBmbGFncyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTX0xBQkVMKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZXNQYWNrYWdlID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFKTsKLSAgICAgICAgICAgICAgICBpbnQgbGFiZWxSZXNvdXJjZSA9IGMuZ2V0SW50KENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19MQUJFTCk7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlczsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmVzUGFja2FnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHBtLmdldFJlc291cmNlc0ZvckFwcGxpY2F0aW9uKHJlc1BhY2thZ2UpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udGFjdCBzdGF0dXMgdXBkYXRlIHJlc291cmNlIHBhY2thZ2Ugbm90IGZvdW5kOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzUGFja2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHJlc291cmNlcy5nZXRTdHJpbmcobGFiZWxSZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSByZXNvdXJjZSBub3QgZm91bmQ6ICIgKyByZXNQYWNrYWdlICsgIkAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGFiZWxSZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBhdHRyaWJ1dGlvbjsKLSAgICAgICAgICAgIGlmICh0aW1lc3RhbXAgIT0gbnVsbCAmJiBsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgbGFiZWwpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lc3RhbXAgPT0gbnVsbCAmJiBsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lc3RhbXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gdGltZXN0YW1wOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VGV4dChhdHRyaWJ1dGlvbik7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgewotICAgICAgICBzd2l0Y2ggKHZpZXcuZ2V0SWQoKSkgewotICAgICAgICAgICAgY2FzZSBSLmlkLnN0YXI6IHsKLSAgICAgICAgICAgICAgICAvLyBUb2dnbGUgInN0YXJyZWQiIHN0YXRlCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGEgY29udGFjdAotICAgICAgICAgICAgICAgIGlmIChtQ29udGFjdFVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoQ29udGFjdHMuU1RBUlJFRCwgbVN0YXJyZWRWaWV3LmlzQ2hlY2tlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlci51cGRhdGUobUNvbnRhY3RVcmksIHZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBSLmlkLnBob3RvOiB7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybVBob3RvQ2xpY2soKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUi5pZC5uYW1lOiB7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybURpc3BsYXlOYW1lQ2xpY2soKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQml0bWFwIGxvYWRQbGFjZWhvbGRlclBob3RvKEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgIGlmIChtTm9QaG90b1Jlc291cmNlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1Db250ZXh0LmdldFJlc291cmNlcygpLAotICAgICAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UsIG9wdGlvbnMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCmluZGV4IGZhNDdmZjYuLjIzZTIyNzcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQpAQCAtMzAsNyArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZUZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAogaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9sczsKQEAgLTM5LDcgKzM5LDcgQEAKIC8qKgogICogRGlzcGxheXMgdGhlIHRpbWUKICAqLwotcHVibGljIGNsYXNzIERpZ2l0YWxDbG9jayBleHRlbmRzIExpbmVhckxheW91dCB7CitwdWJsaWMgY2xhc3MgRGlnaXRhbENsb2NrIGV4dGVuZHMgUmVsYXRpdmVMYXlvdXQgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE0xMiA9ICJoOm1tIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTTI0ID0gImtrOm1tIjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRHJhd2FibGVIb2xkZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRHJhd2FibGVIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTM4NjBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EcmF3YWJsZUhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkRlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGNvbnRhaW5lciBmb3IgYSBEcmF3YWJsZSB3aXRoIG11bHRpcGxlIGFuaW1hdGVkIHByb3BlcnRpZXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgRHJhd2FibGVIb2xkZXIgaW1wbGVtZW50cyBBbmltYXRvckxpc3RlbmVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERlY2VsZXJhdGVJbnRlcnBvbGF0b3IgRUFTRV9PVVRfSU5URVJQT0xBVE9SID0gbmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRyYXdhYmxlSG9sZGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworICAgIHByaXZhdGUgZmxvYXQgbVggPSAwLjBmOworICAgIHByaXZhdGUgZmxvYXQgbVkgPSAwLjBmOworICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlWCA9IDEuMGY7CisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVZID0gMS4wZjsKKyAgICBwcml2YXRlIEJpdG1hcERyYXdhYmxlIG1EcmF3YWJsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1BbHBoYSA9IDFmOworICAgIHByaXZhdGUgQXJyYXlMaXN0PE9iamVjdEFuaW1hdG9yPEZsb2F0Pj4gbUFuaW1hdG9ycyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0QW5pbWF0b3I8RmxvYXQ+PigpOworICAgIHByaXZhdGUgQXJyYXlMaXN0PE9iamVjdEFuaW1hdG9yPEZsb2F0Pj4gbU5lZWRUb1N0YXJ0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RBbmltYXRvcjxGbG9hdD4+KCk7CisKKyAgICBwdWJsaWMgRHJhd2FibGVIb2xkZXIoQml0bWFwRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgdGhpcyhkcmF3YWJsZSwgMC4wZiwgMC4wZik7CisgICAgfQorCisgICAgcHVibGljIERyYXdhYmxlSG9sZGVyKEJpdG1hcERyYXdhYmxlIGRyYXdhYmxlLCBmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIG1EcmF3YWJsZSA9IGRyYXdhYmxlOworICAgICAgICBtWCA9IHg7CisgICAgICAgIG1ZID0geTsKKyAgICAgICAgbURyYXdhYmxlLmdldFBhaW50KCkuc2V0QW50aUFsaWFzKHRydWUpOyAvLyBGb3JjZSBBQQorICAgICAgICBtRHJhd2FibGUuc2V0Qm91bmRzKDAsIDAsIG1EcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpLCBtRHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQWRkcyBhbiBhbmltYXRpb24gdGhhdCBpbnRlcnBvbGF0ZXMgZ2l2ZW4gcHJvcGVydHkgZnJvbSBpdHMgY3VycmVudCB2YWx1ZQorICAgICAqIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiB0aGUgZHVyYXRpb24sIGluIG1zLgorICAgICAqIEBwYXJhbSBkZWxheSB0aGUgZGVsYXkgdG8gc3RhcnQgdGhlIGFuaW1hdGlvbiwgaW4gbXMuCisgICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBhbmltYXRlCisgICAgICogQHBhcmFtIHRvVmFsdWUgdGhlIHRhcmdldCB2YWx1ZQorICAgICAqIEBwYXJhbSByZXBsYWNlIGlmIHRydWUsIHJlcGxhY2UgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHdpdGggdGhpcyBvbmUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yPEZsb2F0PiBhZGRBbmltVG8obG9uZyBkdXJhdGlvbiwgbG9uZyBkZWxheSwKKyAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSwgZmxvYXQgdG9WYWx1ZSwgYm9vbGVhbiByZXBsYWNlKSB7CisKKyAgICAgICAgaWYgKHJlcGxhY2UpIHJlbW92ZUFuaW1hdGlvbkZvcihwcm9wZXJ0eSk7CisKKyAgICAgICAgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+IGFuaW0gPSBuZXcgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+KGR1cmF0aW9uLCB0aGlzLCBwcm9wZXJ0eSwgdG9WYWx1ZSk7CisgICAgICAgIGFuaW0uc2V0U3RhcnREZWxheShkZWxheSk7CisgICAgICAgIGFuaW0uc2V0SW50ZXJwb2xhdG9yKEVBU0VfT1VUX0lOVEVSUE9MQVRPUik7CisgICAgICAgIHRoaXMuYWRkQW5pbWF0aW9uKGFuaW0sIHJlcGxhY2UpOworICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJhbmltYXRpb25Db3VudCA9ICIgKyBtQW5pbWF0b3JzLnNpemUoKSk7CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIGFsbCBhbmltYXRpb25zIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFuaW1hdGlvbkZvcihTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgQXJyYXlMaXN0PE9iamVjdEFuaW1hdG9yPEZsb2F0Pj4gcmVtb3ZhbExpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdEFuaW1hdG9yPEZsb2F0Pj4oKTsKKyAgICAgICAgZm9yIChPYmplY3RBbmltYXRvcjxGbG9hdD4gY3VycmVudEFuaW0gOiBtQW5pbWF0b3JzKSB7CisgICAgICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKGN1cnJlbnRBbmltLmdldFByb3BlcnR5TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRBbmltLmNhbmNlbCgpOworICAgICAgICAgICAgICAgIHJlbW92YWxMaXN0LmFkZChjdXJyZW50QW5pbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiUmVtb3ZlIGxpc3Qgc2l6ZTogIiArIHJlbW92YWxMaXN0LnNpemUoKSk7CisgICAgICAgIG1BbmltYXRvcnMucmVtb3ZlQWxsKHJlbW92YWxMaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBhbGwgYW5pbWF0aW9ucyBhbmQgcmVtb3ZlcyB0aGVtIGZyb20gdGhlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJBbmltYXRpb25zKCkgeworICAgICAgICBmb3IgKE9iamVjdEFuaW1hdG9yPEZsb2F0PiBjdXJyZW50QW5pbSA6IG1BbmltYXRvcnMpIHsKKyAgICAgICAgICAgIGN1cnJlbnRBbmltLmNhbmNlbCgpOworICAgICAgICB9CisgICAgICAgIG1BbmltYXRvcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gdGhlIGxpc3Qgb2YgYW5pbWF0aW9ucyBmb3IgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5pbQorICAgICAqIEBwYXJhbSBvdmVyd3JpdGUKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBEcmF3YWJsZUhvbGRlciBhZGRBbmltYXRpb24oT2JqZWN0QW5pbWF0b3I8RmxvYXQ+IGFuaW0sIGJvb2xlYW4gb3ZlcndyaXRlKSB7CisgICAgICAgIGlmIChhbmltICE9IG51bGwpCisgICAgICAgICAgICBtQW5pbWF0b3JzLmFkZChhbmltKTsKKyAgICAgICAgbU5lZWRUb1N0YXJ0LmFkZChhbmltKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJhdyB0aGlzIG9iamVjdCB0byB0aGUgY2FudmFzIHVzaW5nIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYW52YXMgY2FudmFzIHRvIGRyYXcgaW50bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICBmaW5hbCBmbG9hdCB0aHJlc2hvbGQgPSAxLjBmIC8gMjU2LjBmOyAvLyBjb250cmlidXRpb24gbGVzcyB0aGFuIDEgTFNCIG9mIFJHQiBieXRlCisgICAgICAgIGlmIChtQWxwaGEgPD0gdGhyZXNob2xkKSAvLyBkb24ndCBib3RoZXIgaWYgaXQgd29uJ3Qgc2hvdyB1cAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7CisgICAgICAgIGNhbnZhcy50cmFuc2xhdGUobVgsIG1ZKTsKKyAgICAgICAgY2FudmFzLnNjYWxlKG1TY2FsZVgsIG1TY2FsZVkpOworICAgICAgICBjYW52YXMudHJhbnNsYXRlKC0wLjVmKmdldFdpZHRoKCksIC0wLjVmKmdldEhlaWdodCgpKTsKKyAgICAgICAgbURyYXdhYmxlLnNldEFscGhhKChpbnQpIE1hdGgucm91bmQobUFscGhhICogMjU1ZikpOworICAgICAgICBtRHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBhbGwgYW5pbWF0aW9ucyBhZGRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uICBVc2VkIHRvIHN5bmNocm9uaXplCisgICAgICogYW5pbWF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhbiBvcHRpb25hbCBsaXN0ZW5lciB0byBhZGQgdG8gdGhlIGFuaW1hdGlvbnMuIFR5cGljYWxseSB1c2VkIHRvIGtub3cgd2hlbgorICAgICAqIHRvIGludmFsaWRhdGUgdGhlIHN1cmZhY2UgdGhlc2UgYXJlIGJlaW5nIGRyYXduIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9ucyhWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmVlZFRvU3RhcnQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yPEZsb2F0PiBhbmltID0gbU5lZWRUb1N0YXJ0LmdldChpKTsKKyAgICAgICAgICAgIGFuaW0uYWRkVXBkYXRlTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgYW5pbS5hZGRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIGFuaW0uc3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBtTmVlZFRvU3RhcnQuY2xlYXIoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBEcmF3YWJsZUhvbGRlciBzZXRYKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIG1YID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBEcmF3YWJsZUhvbGRlciBzZXRZKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIG1ZID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBEcmF3YWJsZUhvbGRlciBzZXRTY2FsZVgoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgbVNjYWxlWCA9IHZhbHVlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRHJhd2FibGVIb2xkZXIgc2V0U2NhbGVZKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIG1TY2FsZVkgPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIERyYXdhYmxlSG9sZGVyIHNldEFscGhhKGZsb2F0IGFscGhhKSB7CisgICAgICAgIG1BbHBoYSA9IGFscGhhOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0WCgpIHsKKyAgICAgICAgcmV0dXJuIG1YOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRZKCkgeworICAgICAgICByZXR1cm4gbVk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFNjYWxlWCgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZVg7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFNjYWxlWSgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZVk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEFscGhhKCkgeworICAgICAgICByZXR1cm4gbUFscGhhOworICAgIH0KKworICAgIHB1YmxpYyBCaXRtYXBEcmF3YWJsZSBnZXREcmF3YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EcmF3YWJsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgeworICAgICAgICByZXR1cm4gbURyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtRHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgbUFuaW1hdG9ycy5yZW1vdmUoYW5pbWF0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRvciBhbmltYXRpb24pIHsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTk3YzAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9FZGl0U3R5bGVkVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZy5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuUmVjdFNoYXBlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0Lkh0bWw7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwotaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuQXJyb3dLZXlNb3ZlbWVudE1ldGhvZDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWJzb2x1dGVTaXplU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWxpZ25tZW50U3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkZvcmVncm91bmRDb2xvclNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkltYWdlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUGFyYWdyYXBoU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlF1b3RlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEVkaXRTdHlsZWRUZXh0IGV4dGVuZHMgRWRpdFRleHQgZm9yIG1hbmFnaW5nIHRoZSBmbG93IGFuZCBzdGF0dXMgdG8gZWRpdAotICogdGhlIHN0eWxlZCB0ZXh0LiBUaGlzIG1hbmFnZXMgdGhlIHN0YXRlcyBhbmQgZmxvd3Mgb2YgZWRpdGluZywgc3VwcG9ydHMKLSAqIGluc2VydGluZyBpbWFnZSwgaW1wb3J0L2V4cG9ydCBIVE1MLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJFZGl0U3R5bGVkVGV4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtb2RlcyBvZiBlZGl0aW5nIGFjdGlvbnMuCi0gICAgICovCi0gICAgLyoqIFRoZSBtb2RlIHRoYXQgbm8gZWRpdGluZyBhY3Rpb24gaXMgZG9uZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX05PVEhJTkcgPSAwOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjb3B5LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09QWSA9IDE7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIHBhc3RlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfUEFTVEUgPSAyOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBzaXplLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfU0laRSA9IDM7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGNvbG9yLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09MT1IgPSA0OwotICAgIC8qKiBUaGUgbW9kZSBvZiBzZWxlY3Rpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TRUxFQ1QgPSA1OwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBhbGlnbm1lbnQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9BTElHTiA9IDY7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGN1dC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NVVCA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGUgb2Ygc2VsZWN0aW9uLgotICAgICAqLwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXNuJ3Qgc3RhcnRlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RfT0ZGID0gMDsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIHN0YXJ0ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNUX09OID0gMTsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIGRvbmUsIGJ1dCBub3QgZml4ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNURUQgPSAyOwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXMgZG9uZSBhbmQgbm90IGZpeGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVF9GSVggPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGhlbHAgbWVzc2FnZSBzdHJpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX05VTEwgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX0NPUFlfQlVGX0JMQU5LID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19TRUxFQ1RfU1RBUlQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1NFTEVDVF9FTkQgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1BVU0hfQ09NUEVURSA9IDQ7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaGVscCBtZXNzYWdlIHN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SID0gMHgwMEZGRkZGRjsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0SW50ZXJmYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3Igbm90aWZ5aW5nIG1lc3NhZ2VzIHRvCi0gICAgICogY2FsbGluZyBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlIaW50TXNnKGludCBtc2dJZCk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlZChpbnQgbW9kZSwgaW50IHN0YXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgbUVTVEludGVyZmFjZTsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0RWRpdG9yTWFuYWdlciBtYW5hZ2VzIHRoZSBmbG93IGFuZCBzdGF0dXMgb2YgZWFjaAotICAgICAqIGZ1bmN0aW9uIGZvciBlZGl0aW5nIHN0eWxlZCB0ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgRWRpdG9yTWFuYWdlciBtTWFuYWdlcjsKLSAgICBwcml2YXRlIFN0eWxlZFRleHRDb252ZXJ0ZXIgbUNvbnZlcnRlcjsKLSAgICBwcml2YXRlIFN0eWxlZFRleHREaWFsb2cgbURpYWxvZzsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1EZWZhdWx0QmFja2dyb3VuZDsKLSAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yOwotCi0gICAgLyoqCi0gICAgICogRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCBmb3IgbWFuYWdpbmcgZmxvdyBvZiBlYWNoIGVkaXRpbmcKLSAgICAgKiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIEVkaXRTdHlsZWRUZXh0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFZGl0U3R5bGVkVGV4dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWRpdFN0eWxlZFRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IE5vdGlmaWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWVyKEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgZXN0SW50ZXJmYWNlKSB7Ci0gICAgICAgIG1FU1RJbnRlcmZhY2UgPSBlc3RJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEJ1aWxkZXIgZm9yIEFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBidWlsZGVyCi0gICAgICogICAgICAgICAgICBCdWlsZGVyIGZvciBvcGVuaW5nIEFsZXJ0IERpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICBtRGlhbG9nLnNldEJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFBhcmFtZXRlcnMgZm9yIENvbG9yQWxlcnREaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ydGl0bGUKLSAgICAgKiAgICAgICAgICAgIFRpdGxlIGZvciBBbGVydCBEaWFsb2cuCi0gICAgICogQHBhcmFtIGNvbG9ybmFtZXMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgbmFtZSBvZiBzZWxlY3RpbmcgY29sb3IuCi0gICAgICogQHBhcmFtIGNvbG9yaW50cwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBpbnQgb2YgY29sb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3JBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgY29sb3J0aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGNvbG9ybmFtZXMsIENoYXJTZXF1ZW5jZVtdIGNvbG9yaW50cykgewotICAgICAgICBtRGlhbG9nLnNldENvbG9yQWxlcnRQYXJhbXMoY29sb3J0aXRsZSwgY29sb3JuYW1lcywgY29sb3JpbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgUGFyYW1ldGVycyBmb3IgU2l6ZUFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaXpldGl0bGUKLSAgICAgKiAgICAgICAgICAgIFRpdGxlIGZvciBBbGVydCBEaWFsb2cuCi0gICAgICogQHBhcmFtIHNpemVuYW1lcwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBuYW1lIG9mIHNlbGVjdGluZyBzaXplLgotICAgICAqIEBwYXJhbSBzaXplZGlzcGxheWludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIHNpemUgZGlzcGxheWVkIGluIFRleHRWaWV3LgotICAgICAqIEBwYXJhbSBzaXplc2VuZGludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIHNpemUgZXhwb3J0ZWQgdG8gSFRNTC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXplQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIHNpemV0aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVuYW1lcywgQ2hhclNlcXVlbmNlW10gc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZXNlbmRpbnRzKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0U2l6ZUFsZXJ0UGFyYW1zKHNpemV0aXRsZSwgc2l6ZW5hbWVzLCBzaXplZGlzcGxheWludHMsCi0gICAgICAgICAgICAgICAgc2l6ZXNlbmRpbnRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbkFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBhbGlnbnRpdGxlLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gYWxpZ25uYW1lcykgewotICAgICAgICBtRGlhbG9nLnNldEFsaWduQWxlcnRQYXJhbXMoYWxpZ250aXRsZSwgYWxpZ25uYW1lcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChtTWFuYWdlci5pc1NvZnRLZXlCbG9ja2VkKCkgJiYKLSAgICAgICAgICAgICAgICBldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgIGNhbmNlbExvbmdQcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwZXJSZXN1bHQgPSBzdXBlci5vblRvdWNoRXZlbnQoZXZlbnQpOwotICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblRvdWNoRXZlbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXJSZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgZWRpdGluZy4gVGhpcyBmdW5jdGlvbiBoYXZlIHRvIGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgZWRpdGluZwotICAgICAqIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEVkaXQoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRFZGl0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5kIGVkaXRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25FbmRFZGl0KCkgewotICAgICAgICBtTWFuYWdlci5vbkVuZEVkaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiQ29weSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb3B5KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q29weSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJDdXQiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q3V0KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIlBhc3RlIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFBhc3RlKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0UGFzdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiU2l6ZSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTaXplKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJDb2xvciIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb2xvcigpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydENvbG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIkJhY2tncm91bmRDb2xvciIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiQWxpZ25tZW50IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEFsaWduKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0QWxpZ24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiU2VsZWN0IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFNlbGVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJTZWxlY3RBbGwiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0QWxsKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2VsZWN0QWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRml4IFNlbGVjdGVkIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25GaXhTZWxlY3RlZEl0ZW0oKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0SW1hZ2UgdG8gVGV4dFZpZXcgYnkgdXNpbmcgVVJJCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgVVJJIG9mIHRoZSBpYW1nZSBpbnNlcnRlZCB0byBUZXh0Vmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKFVyaSB1cmkpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRJbWFnZSh1cmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydEltYWdlIHRvIFRleHRWaWV3IGJ5IHVzaW5nIHJlc291cmNlIElECi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc0lkCi0gICAgICogICAgICAgICAgICBSZXNvdXJjZSBJRCBvZiB0aGUgaWFtZ2UgaW5zZXJ0ZWQgdG8gVGV4dFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShpbnQgcmVzSWQpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRJbWFnZShyZXNJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRIb3Jpem9udGFsTGluZSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRIb3Jpem9udGFsTGluZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJTdHlsZXMoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uQ2xlYXJTdHlsZXMoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0IFNpemUgb2YgdGhlIEl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1TaXplKGludCBzaXplKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEl0ZW1TaXplKHNpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBDb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEl0ZW1Db2xvcihjb2xvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEFsaWdubWVudCBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbm1lbnQoTGF5b3V0LkFsaWdubWVudCBhbGlnbikgewotICAgICAgICBtTWFuYWdlci5zZXRBbGlnbm1lbnQoYWxpZ24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBCYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yCi0gICAgICogICAgICAgICAgICBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB2aWV3LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgc3VwZXIuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IGNvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBodG1sIHRvIEVkaXRTdHlsZWRUZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBodG1sCi0gICAgICogICAgICAgICAgICBUaGUgaHRtbCB0byBiZSBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SHRtbChTdHJpbmcgaHRtbCkgewotICAgICAgICBtQ29udmVydGVyLlNldEh0bWwoaHRtbCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgZWRpdGluZyBpcyBzdGFydGVkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgZWRpdGluZyBpcyBzdGFydGVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXR0aW5nKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNFZGl0dGluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgc3R5bGVkIHRleHQgb3Igbm90LgotICAgICAqIAotICAgICAqIEByZXR1cm4gV2hldGhlciBzdHlsZWQgdGV4dCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdHlsZWRUZXh0KCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNTdHlsZWRUZXh0KCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgU29mdEtleSBpcyBCbG9ja2VkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgU29mdEtleSBpcyBCbG9ja2VkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NvZnRLZXlCbG9ja2VkKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNTb2Z0S2V5QmxvY2tlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbW9kZSBvZiB0aGUgYWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG1vZGUgb2YgdGhlIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVkaXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuZ2V0RWRpdE1vZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuZ2V0U2VsZWN0U3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldElucHV0RXh0cmFzKGJvb2xlYW4gY3JlYXRlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS1nZXRJbnB1dEV4dHJhcyIpOwotICAgICAgICB9Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBzdXBlci5nZXRJbnB1dEV4dHJhcyhjcmVhdGUpOwotICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgfQotICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiYWxsb3dFbW9qaSIsIHRydWUpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db252ZXJ0ZXIuZ2V0SHRtbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpcwotICAgICAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIHVzZWQgdXJpcy4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbChBcnJheUxpc3Q8VXJpPiB1cmlzKSB7Ci0gICAgICAgIG1Db252ZXJ0ZXIuZ2V0VXJpQXJyYXkodXJpcywgZ2V0VGV4dCgpKTsKLSAgICAgICAgcmV0dXJuIG1Db252ZXJ0ZXIuZ2V0SHRtbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBCYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICByZXR1cm4gbUJhY2tncm91bmRDb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgRm9yZWdyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEZvcmVHcm91bmRDb2xvcihpbnQgcG9zKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS1nZXRGb3JlR3JvdW5kQ29sb3I6ICIgKyBwb3MpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MgPCAwIHx8IHBvcyA+IGdldFRleHQoKS5sZW5ndGgoKSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLWdldEZvcmVHcm91bmRDb2xvcjogSWxsaWdhbCBwb3NpdGlvbi4iKTsKLSAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGb3JlZ3JvdW5kQ29sb3JTcGFuW10gc3BhbnMgPQotICAgICAgICAgICAgICAgIGdldFRleHQoKS5nZXRTcGFucyhwb3MsIHBvcywgRm9yZWdyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzcGFuc1swXS5nZXRGb3JlZ3JvdW5kQ29sb3IoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgbWVtYmVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbml0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgIG1EZWZhdWx0QmFja2dyb3VuZCA9IGdldEJhY2tncm91bmQoKTsKLSAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgbU1hbmFnZXIgPSBuZXcgRWRpdG9yTWFuYWdlcih0aGlzKTsKLSAgICAgICAgbUNvbnZlcnRlciA9IG5ldyBTdHlsZWRUZXh0Q29udmVydGVyKHRoaXMpOwotICAgICAgICBtRGlhbG9nID0gbmV3IFN0eWxlZFRleHREaWFsb2codGhpcyk7Ci0gICAgICAgIHNldE1vdmVtZW50TWV0aG9kKG5ldyBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QobU1hbmFnZXIpKTsKLSAgICAgICAgbU1hbmFnZXIuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgIG1NYW5hZ2VyLnVuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBGb3JlZ3JvdW5kIENvbG9yIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBCYWNrZ3JvdW5kIENvbG9yIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBTaXplIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd1NpemVBbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dTaXplQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IEFsaWdubWVudCBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dBbGlnbkFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0FsaWduQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgaGludCBtZXNzYWdlcyB3aGF0IGFjdGlvbiBpcyBleHBlY3RlZCB0byBjYWxsaW5nIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtc2dJZAotICAgICAqICAgICAgICAgICAgSWQgb2YgdGhlIGhpbnQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SGludE1lc3NhZ2UoaW50IG1zZ0lkKSB7Ci0gICAgICAgIGlmIChtRVNUSW50ZXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FU1RJbnRlcmZhY2Uubm90aWZ5SGludE1zZyhtc2dJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIGV2ZW50IHRoYXQgdGhlIG1vZGUgYW5kIHN0YXRlIGFyZSBjaGFuZ2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgICAgICAgICBNb2RlIG9mIHRoZSBlZGl0aW5nIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gc3RhdGUKLSAgICAgKiAgICAgICAgICAgIE1vZGUgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2VkKGludCBtb2RlLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgaWYgKG1FU1RJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVTVEludGVyZmFjZS5ub3RpZnlTdGF0ZUNoYW5nZWQobW9kZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRWRpdG9yTWFuYWdlciBtYW5hZ2VzIHRoZSBmbG93IGFuZCBzdGF0dXMgb2YgZWRpdGluZyBhY3Rpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRWRpdG9yTWFuYWdlciB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRWRpdEZsYWcgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Tb2Z0S2V5QmxvY2tGbGFnID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Nb2RlID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1clN0YXJ0ID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1ckVuZCA9IDA7Ci0gICAgICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBFZGl0b3JNYW5hZ2VyKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEVkaXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25zdGFydGVkaXQ6Iik7Ci0gICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25FbmRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25FbmRFZGl0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydENvcHkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0Q29weSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ29weSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q3V0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEN1dCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ3V0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRQYXN0ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRQYXN0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlUGFzdGUoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFNpemUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0U2l6ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlU2l6ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QWxpZ24oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0QWxpZ25SaWdodCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQWxpZ24oKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydENvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb2xvcigpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2VsZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTW9kZSA9IE1PREVfU0VMRUNUOwotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVuc2V0U2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ3Vyc29yTW92ZWQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrVmlldyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT04gfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0QWxsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1NlbGVjdEFsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlU2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRml4U2VsZWN0ZWRJdGVtKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbXBsZXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb21wbGV0ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKFVyaSB1cmkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SW1hZ2UgYnkgVVJJOiAiICsgdXJpLmdldFBhdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyB1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEltYWdlU3BhbihtRVNULmdldENvbnRleHQoKSwgdXJpKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoaW50IHJlc0lEKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkluc2VydEltYWdlIGJ5IHJlc0lEIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEltYWdlU3BhbihtRVNULmdldENvbnRleHQoKSwgcmVzSUQpKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25JbnNlcnRIb3Jpem9udGFsTGluZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SG9yaXpvbnRhbExpbmU6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEhvcml6b250YWxMaW5lU3BhbigweEZGMDAwMDAwLCBtRVNUKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJTdHlsZXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsZWFyU3R5bGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFZGl0YWJsZSB0eHQgPSBtRVNULmdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSB0eHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBPYmplY3RbXSBzdHlsZXMgPSB0eHQuZ2V0U3BhbnMoMCwgbGVuLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgc3R5bGUgOiBzdHlsZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUgaW5zdGFuY2VvZiBQYXJhZ3JhcGhTdHlsZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgaW5zdGFuY2VvZiBRdW90ZVNwYW4gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlIGluc3RhbmNlb2YgQ2hhcmFjdGVyU3R5bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlIGluc3RhbmNlb2YgSW1hZ2VTcGFuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSB0eHQuZ2V0U3BhblN0YXJ0KHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSB0eHQuZ2V0U3BhbkVuZChzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eHQucmVwbGFjZShzdGFydCwgZW5kLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHh0LnJlbW92ZVNwYW4oc3R5bGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2V0QmFja2dyb3VuZERyYXdhYmxlKG1FU1QubURlZmF1bHRCYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIG1FU1QubUJhY2tncm91bmRDb2xvciA9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1TaXplKGludCBzaXplKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2l6ZUl0ZW0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VTaXplU2VsZWN0ZWRUZXh0KHNpemUpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SXRlbUNvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9ySXRlbSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIGNoYW5nZUNvbG9yU2VsZWN0ZWRUZXh0KGNvbG9yKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFsaWdubWVudChMYXlvdXQuQWxpZ25tZW50IGFsaWduKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3JJdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlQWxpZ24oYWxpZ24pOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFZGl0dGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRWRpdEZsYWc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB0aGUgc3R5bGUgb2YgdGhlIHNwYW4gaXMgYWRkZWQsIGFkZCBjaGVjayBjYXNlIGZvciB0aGF0IHN0eWxlICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3R5bGVkVGV4dCgpIHsKLSAgICAgICAgICAgIEVkaXRhYmxlIHR4dCA9IG1FU1QuZ2V0VGV4dCgpOwotICAgICAgICAgICAgaW50IGxlbiA9IHR4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmICh0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBQYXJhZ3JhcGhTdHlsZS5jbGFzcykubGVuZ3RoID4gMCB8fAotICAgICAgICAgICAgICAgICAgICB0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBRdW90ZVNwYW4uY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgdHh0LmdldFNwYW5zKDAsIGxlbiAtMSwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5tQmFja2dyb3VuZENvbG9yICE9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUikgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTb2Z0S2V5QmxvY2tlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU29mdEtleUJsb2NrRmxhZzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uU3RhcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1clN0YXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25FbmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1ckVuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkb05leHRIYW5kbGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBkb05leHRIYW5kbGU6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ09QWToKLSAgICAgICAgICAgICAgICBoYW5kbGVDb3B5KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ1VUOgotICAgICAgICAgICAgICAgIGhhbmRsZUN1dCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX1BBU1RFOgotICAgICAgICAgICAgICAgIGhhbmRsZVBhc3RlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfU0laRToKLSAgICAgICAgICAgICAgICBoYW5kbGVTaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ09MT1I6Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ29sb3IoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9BTElHTjoKLSAgICAgICAgICAgICAgICBoYW5kbGVBbGlnbigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDYW5jZWwoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDYW5jZWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9OT1RISU5HOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX09GRjsKLSAgICAgICAgICAgIG1FZGl0RmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDYW5jZWw6IiArIG1FU1QuZ2V0SW5wdXRUeXBlKCkpOwotICAgICAgICAgICAgdW5ibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgICAgIHVuc2V0U2VsZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29tcGxldGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX0ZJWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRleHRWaWV3RnVuYyhpbnQgbW9kZSwgaW50IGlkKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVUZXh0VmlldzogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIiArIGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTk9USElORyB8fCBtTW9kZSA9PSBNT0RFX1NFTEVDVCkgewotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhtb2RlLCBpZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSAhPSBtb2RlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhtb2RlLCBpZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5vblRleHRDb250ZXh0TWVudUl0ZW0oaWQpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvcHkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb3B5OiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKE1PREVfQ09QWSwgYW5kcm9pZC5SLmlkLmNvcHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUN1dCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNvcHk6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMoTU9ERV9DVVQsIGFuZHJvaWQuUi5pZC5jdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBhc3RlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlUGFzdGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5vblRleHRDb250ZXh0TWVudUl0ZW0oYW5kcm9pZC5SLmlkLnBhc3RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZXRTcGFuKGludCBtb2RlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiIgKyBtRWRpdEZsYWcgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXRlICsgJywnICsgbU1vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IEVkaXRpbmcgaXMgbm90IHN0YXJ0ZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTk9USElORyB8fCBtTW9kZSA9PSBNT0RFX1NFTEVDVCkgewotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNldFNwYW4obW9kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSAhPSBtb2RlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGhhbmRsZVNldFNwYW4obW9kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX05VTEwpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RFX0NPTE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9TSVpFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dTaXplQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1PREVfQUxJR046Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRVNULm9uU2hvd0FsaWduQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiBpbnZhbGlkIG1vZGUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjogZG8gbm90aGluZy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2l6ZSgpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9TSVpFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb2xvcigpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9DT0xPUik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWxpZ24oKSB7Ci0gICAgICAgICAgICBoYW5kbGVTZXRTcGFuKE1PREVfQUxJR04pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNlbGVjdDoiICsgbUVkaXRGbGFnICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBpcyBvZmYsIGJ1dCBzZWxlY3RlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RTdGFydFBvcygpOwotICAgICAgICAgICAgICAgIGJsb2NrU29mdEtleSgpOwotICAgICAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfU0VMRUNUX0VORCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT04pIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUZXh0U2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VsZWN0aW9uIG5vdyBzdGFydCwgYnV0IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19QVVNIX0NPTVBFVEUpOwotICAgICAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBpcyBkb25lLCBidXQgbm90IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgZG9OZXh0SGFuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2VsZWN0QWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RFRDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXNldEVkaXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlJlc2V0IEVkaXRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgIG1FZGl0RmxhZyA9IHRydWU7Ci0gICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX1NFTEVDVF9TVEFSVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TZWxlY3Q6IiArIG1DdXJTdGFydCArICIsIiArIG1DdXJFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DdXJTdGFydCA+PSAwICYmIG1DdXJTdGFydCA8PSBtRVNULmdldFRleHQoKS5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAmJiBtQ3VyRW5kID49IDAgJiYgbUN1ckVuZCA8PSBtRVNULmdldFRleHQoKS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIGlmIChtQ3VyU3RhcnQgPCBtQ3VyRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0U2VsZWN0aW9uKG1DdXJTdGFydCwgbUN1ckVuZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24obUN1ckVuZCwgbUN1clN0YXJ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNURUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2VsZWN0IGlzIG9uLCBidXQgY3Vyc29yIHBvc2l0aW9ucyBhcmUgaWxsaWdhbC46IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1FU1QuZ2V0VGV4dCgpLmxlbmd0aCgpICsgIiwiICsgbUN1clN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwiICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdW5zZXRTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvZmZTZWxlY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjdXJycG9zID0gbUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24oY3VycnBvcywgY3VycnBvcyk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfT0ZGOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdFN0YXJ0UG9zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U2VsZWN0U3RhcnRQb3MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJTdGFydCA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9PTjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZEVuZFBvcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFNlbGVjdEVuZFBvczoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRVNULmdldFNlbGVjdGlvblN0YXJ0KCkgPT0gbUN1clN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MobUVTVC5nZXRTZWxlY3Rpb25FbmQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEVuZFBvcyhpbnQgcG9zKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTZWxlY3RlZEVuZFBvczoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJFbmQgPSBwb3M7Ci0gICAgICAgICAgICBzZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1RleHRTZWxlY3RlZCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGlzVGV4dFNlbGVjdGVkOiIgKyBtQ3VyU3RhcnQgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKG1DdXJTdGFydCAhPSBtQ3VyRW5kKQotICAgICAgICAgICAgICAgICAgICAmJiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFN0eWxlZFRleHRTcGFuKE9iamVjdCBzcGFuLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFN0eWxlZFRleHRTcGFuOiIgKyBtTW9kZSArICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGFydCArICIsIiArIGVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5zZXRTcGFuKHNwYW4sIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBlbmQsIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hhbmdlU2l6ZVNlbGVjdGVkVGV4dChpbnQgc2l6ZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlU2l6ZToiICsgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgQWJzb2x1dGVTaXplU3BhbihzaXplKSwKLSAgICAgICAgICAgICAgICBtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZUNvbG9yU2VsZWN0ZWRUZXh0KGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlQ29sb3I6IiArIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0eWxlZFRleHRTcGFuKG5ldyBGb3JlZ3JvdW5kQ29sb3JTcGFuKGNvbG9yKSwKLSAgICAgICAgICAgICAgICBtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZUFsaWduKExheW91dC5BbGlnbm1lbnQgYWxpZ24pIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoYW5nZUFsaWduOiIgKyBhbGlnbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgQWxpZ25tZW50U3Bhbi5TdGFuZGFyZChhbGlnbiksCi0gICAgICAgICAgICAgICAgICAgIGZpbmRMaW5lU3RhcnQobUVTVC5nZXRUZXh0KCksIG1DdXJTdGFydCksCi0gICAgICAgICAgICAgICAgICAgIGZpbmRMaW5lRW5kKG1FU1QuZ2V0VGV4dCgpLCBtQ3VyRW5kKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kTGluZVN0YXJ0KEVkaXRhYmxlIHRleHQsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBmaW5kTGluZVN0YXJ0OiBjdXJyOiIgKyBjdXJyZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIGxlbmd0aDoiICsgdGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcG9zID0gY3VycmVudDsKLSAgICAgICAgICAgIGZvciAoOyBwb3MgPiAwOyBwb3MtLSkgewotICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChwb3MgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0SW1hZ2VTcGFuKEltYWdlU3BhbiBzcGFuKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbnNlcnRJbWFnZVNwYW4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluc2VydGltYWdlc3BhbjoiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY0hlaWdodCgpICsgIiwiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY1dpZHRoKCkpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5zZXJ0aW1hZ2VzcGFuOiIgKyBzcGFuLmdldERyYXdhYmxlKCkuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgaW50IGN1cnBvcyA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5pbnNlcnQoY3VycG9zLCAiXHVGRkZDIik7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBjdXJwb3MsIGN1cnBvcyArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBpbnNlcnRJbWFnZVNwYW46IG51bGwgc3BhbiB3YXMgaW5zZXJ0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRMaW5lRW5kKEVkaXRhYmxlIHRleHQsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBmaW5kTGluZUVuZDogY3VycjoiICsgY3VycmVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBsZW5ndGg6IiArIHRleHQubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHBvcyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBmb3IgKDsgcG9zIDwgdGV4dC5sZW5ndGgoKTsgcG9zKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zID4gMCAmJiB0ZXh0LmNoYXJBdChwb3MgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYmxvY2tTb2Z0S2V5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gYmxvY2tTb2Z0S2V5OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpIG1FU1QuZ2V0Q29udGV4dCgpLgotICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLSAgICAgICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhtRVNULmdldFdpbmRvd1Rva2VuKCksIDApOwotICAgICAgICAgICAgbUVTVC5zZXRPbkNsaWNrTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb250cmFja2JhbGxjbGljazoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpeFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtU29mdEtleUJsb2NrRmxhZyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdW5ibG9ja1NvZnRLZXkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSB1bmJsb2NrU29mdEtleToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2V0T25DbGlja0xpc3RlbmVyKG51bGwpOwotICAgICAgICAgICAgbVNvZnRLZXlCbG9ja0ZsYWcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dENvbnZlcnRlciB7Ci0gICAgICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBwdWJsaWMgU3R5bGVkVGV4dENvbnZlcnRlcihFZGl0U3R5bGVkVGV4dCBlc3QpIHsKLSAgICAgICAgICAgIG1FU1QgPSBlc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0bWwoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaHRtbEJvZHkgPSBIdG1sLnRvSHRtbChtRVNULmdldFRleHQoKSk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRDb252ZXJ0ZWRCb2R5OiIgKyBodG1sQm9keSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaHRtbEJvZHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBnZXRVcmlBcnJheShBcnJheUxpc3Q8VXJpPiB1cmlzLCBFZGl0YWJsZSB0ZXh0KSB7Ci0gICAgICAgICAgICB1cmlzLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRVcmlBcnJheToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IHRleHQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW5bXSBpbWFnZXMgPSB0ZXh0LmdldFNwYW5zKGksIG5leHQsIEltYWdlU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbWFnZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRVcmlBcnJheTogZm91bmRBcnJheSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEltYWdlU3BhbikgaW1hZ2VzW2pdKS5nZXRTb3VyY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXJpcy5hZGQoVXJpLnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW1hZ2VTcGFuKSBpbWFnZXNbal0pLmdldFNvdXJjZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0SHRtbCAoU3RyaW5nIGh0bWwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNwYW5uZWQgc3Bhbm5lZCA9IEh0bWwuZnJvbUh0bWwoaHRtbCwgbmV3IEh0bWwuSW1hZ2VHZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIERyYXdhYmxlIGdldERyYXdhYmxlKFN0cmluZyBzcmMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRodG1sOiBzcmM9IitzcmMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLnN0YXJ0c1dpdGgoImNvbnRlbnQ6Ly8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZShzcmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG1FU1QuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuc2V0Qm91bmRzKDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHNldCBodG1sOiBGYWlsZWQgdG8gbG9hZGVkIGNvbnRlbnQgIiArIHVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIiAgdW5rbm93biBzcmM9IitzcmMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBudWxsKTsKLSAgICAgICAgICAgIG1FU1Quc2V0VGV4dChzcGFubmVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dERpYWxvZyB7Ci0gICAgICAgIEJ1aWxkZXIgbUJ1aWxkZXI7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtQ29sb3JUaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlIG1TaXplVGl0bGU7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtQWxpZ25UaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbUNvbG9yTmFtZXM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1Db2xvckludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplTmFtZXM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplRGlzcGxheUludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplU2VuZEludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1BbGlnbk5hbWVzOwotICAgICAgICBFZGl0U3R5bGVkVGV4dCBtRVNUOwotCi0gICAgICAgIHB1YmxpYyBTdHlsZWRUZXh0RGlhbG9nKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkZXIoQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBtQnVpbGRlciA9IGJ1aWxkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvckFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBjb2xvcnRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGNvbG9ybmFtZXMsIENoYXJTZXF1ZW5jZVtdIGNvbG9yaW50cykgewotICAgICAgICAgICAgbUNvbG9yVGl0bGUgPSBjb2xvcnRpdGxlOwotICAgICAgICAgICAgbUNvbG9yTmFtZXMgPSBjb2xvcm5hbWVzOwotICAgICAgICAgICAgbUNvbG9ySW50cyA9IGNvbG9yaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemVBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2Ugc2l6ZXRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVuYW1lcywgQ2hhclNlcXVlbmNlW10gc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVzZW5kaW50cykgewotICAgICAgICAgICAgbVNpemVUaXRsZSA9IHNpemV0aXRsZTsKLSAgICAgICAgICAgIG1TaXplTmFtZXMgPSBzaXplbmFtZXM7Ci0gICAgICAgICAgICBtU2l6ZURpc3BsYXlJbnRzID0gc2l6ZWRpc3BsYXlpbnRzOwotICAgICAgICAgICAgbVNpemVTZW5kSW50cyA9IHNpemVzZW5kaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFsaWduQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGFsaWdudGl0bGUsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gYWxpZ25uYW1lcykgewotICAgICAgICAgICAgbUFsaWduVGl0bGUgPSBhbGlnbnRpdGxlOwotICAgICAgICAgICAgbUFsaWduTmFtZXMgPSBhbGlnbm5hbWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQ29sb3JBbGVydFBhcmFtcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoZWNrUGFyYW1zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYnVpbGRlciBpcyBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbG9yVGl0bGUgPT0gbnVsbCB8fCBtQ29sb3JOYW1lcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1Db2xvckludHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gY29sb3IgYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbG9yTmFtZXMubGVuZ3RoICE9IG1Db2xvckludHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSB0aGUgbGVuZ3RoIG9mIGNvbG9yIGFsZXJ0IHBhcmFtcyBhcmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlmZmVyZW50LiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU2l6ZUFsZXJ0UGFyYW1zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hlY2tQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU2l6ZVRpdGxlID09IG51bGwgfHwgbVNpemVOYW1lcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1TaXplRGlzcGxheUludHMgPT0gbnVsbCB8fCBtU2l6ZVNlbmRJbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHNpemUgYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVNpemVOYW1lcy5sZW5ndGggIT0gbVNpemVEaXNwbGF5SW50cy5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgJiYgbVNpemVTZW5kSW50cy5sZW5ndGggIT0gbVNpemVEaXNwbGF5SW50cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHRoZSBsZW5ndGggb2Ygc2l6ZSBhbGVydCBwYXJhbXMgYXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImRpZmZlcmVudC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0FsaWduQWxlcnRQYXJhbXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGVja0FsaWduQWxlcnRQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWxpZ25UaXRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBhbGlnbiBhbGVydCBwYXJhbXMgYXJlIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1Db2xvclRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1Db2xvck5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRUVUVk0iLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1Db2xvckludHNbd2hpY2hdLCAxNikgLSAweDAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEl0ZW1Db2xvcihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93QmFja2dyb3VuZENvbG9yQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1Db2xvclRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1Db2xvck5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRUVUVk0iLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1Db2xvckludHNbd2hpY2hdLCAxNikgLSAweDAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93U2l6ZUFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93U2l6ZUFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrU2l6ZUFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtU2l6ZVRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1TaXplTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAucGFyc2VJbnQoKFN0cmluZykgbVNpemVEaXNwbGF5SW50c1t3aGljaF0pOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEl0ZW1TaXplKHNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0FsaWduQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dBbGlnbkFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrQWxpZ25BbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobUFsaWduVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobUFsaWduTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIExheW91dC5BbGlnbm1lbnQgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fTk9STUFMOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9DRU5URVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEFsaWdubWVudChhbGlnbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0eWxlZFRleHRBcnJvd0tleU1ldGhvZCBleHRlbmRzIEFycm93S2V5TW92ZW1lbnRNZXRob2QgewotICAgICAgICBFZGl0b3JNYW5hZ2VyIG1NYW5hZ2VyOwotICAgICAgICBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QoRWRpdG9yTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgbU1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIsCi0gICAgICAgICAgICAgICAgaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIW1NYW5hZ2VyLmlzU29mdEtleUJsb2NrZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24od2lkZ2V0LCBidWZmZXIsIGtleUNvZGUsIGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleGVjdXRlRG93bih3aWRnZXQsIGJ1ZmZlciwga2V5Q29kZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldEVuZFBvcyhUZXh0VmlldyB3aWRnZXQpIHsKLSAgICAgICAgICAgIGludCBlbmQ7Ci0gICAgICAgICAgICBpZiAod2lkZ2V0LmdldFNlbGVjdGlvblN0YXJ0KCkgPT0gbU1hbmFnZXIuZ2V0U2VsZWN0aW9uU3RhcnQoKSkgewotICAgICAgICAgICAgICAgIGVuZCA9IHdpZGdldC5nZXRTZWxlY3Rpb25FbmQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5kID0gd2lkZ2V0LmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHVwKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gdXA6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IGVuZCA9IGdldEVuZFBvcyh3aWRnZXQpOwotICAgICAgICAgICAgaW50IGxpbmUgPSBsYXlvdXQuZ2V0TGluZUZvck9mZnNldChlbmQpOwotICAgICAgICAgICAgaWYgKGxpbmUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRvOwotICAgICAgICAgICAgICAgIGlmIChsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGggPSBsYXlvdXQuZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0TGluZVN0YXJ0KGxpbmUgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBkb3duKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZG93bjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gZ2V0RW5kUG9zKHdpZGdldCk7Ci0gICAgICAgICAgICBpbnQgbGluZSA9IGxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KGVuZCk7Ci0gICAgICAgICAgICBpZiAobGluZSA8IGxheW91dC5nZXRMaW5lQ291bnQoKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBpbnQgdG87Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0KLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lICsgMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaCA9IGxheW91dC5nZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCBoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRMaW5lU3RhcnQobGluZSArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGxlZnQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBsZWZ0OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCB0byA9IGxheW91dC5nZXRPZmZzZXRUb0xlZnRPZihnZXRFbmRQb3Mod2lkZ2V0KSk7Ci0gICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiByaWdodChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJpZ2h0OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCB0byA9IGxheW91dC5nZXRPZmZzZXRUb1JpZ2h0T2YoZ2V0RW5kUG9zKHdpZGdldCkpOwotICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZURvd24oVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLAotICAgICAgICAgICAgICAgIGludCBrZXlDb2RlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBleGVjdXRlRG93bjogIiArIGtleUNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSB1cCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gZG93bih3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZUOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gbGVmdCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVDoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IHJpZ2h0KHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEhvcml6b250YWxMaW5lU3BhbiBleHRlbmRzIEltYWdlU3BhbiB7Ci0gICAgICAgIHB1YmxpYyBIb3Jpem9udGFsTGluZVNwYW4oaW50IGNvbG9yLCBWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIHN1cGVyKG5ldyBIb3Jpem9udGFsTGluZURyYXdhYmxlKGNvbG9yLCB2aWV3KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIGNsYXNzIEhvcml6b250YWxMaW5lRHJhd2FibGUgZXh0ZW5kcyBTaGFwZURyYXdhYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBWaWV3IG1WaWV3OwotICAgICAgICBwdWJsaWMgSG9yaXpvbnRhbExpbmVEcmF3YWJsZShpbnQgY29sb3IsIFZpZXcgdmlldykgewotICAgICAgICAgICAgc3VwZXIobmV3IFJlY3RTaGFwZSgpKTsKLSAgICAgICAgICAgIG1WaWV3ID0gdmlldzsKLSAgICAgICAgICAgIHJlbmV3Q29sb3IoY29sb3IpOwotICAgICAgICAgICAgcmVuZXdCb3VuZHModmlldyk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZHJhdzoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbmV3Q29sb3IoKTsKLSAgICAgICAgICAgIHJlbmV3Qm91bmRzKG1WaWV3KTsKLSAgICAgICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0JvdW5kcyhWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBtVmlldy5nZXRCYWNrZ3JvdW5kKCkuZ2V0Qm91bmRzKCkud2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbVZpZXcuZ2V0QmFja2dyb3VuZCgpLmdldEJvdW5kcygpLmhlaWdodCgpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdCb3VuZHM6IiArIHdpZHRoICsgIiwiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Qm91bmRzOiIgKyBtVmlldy5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCB3aWR0aCA9IG1WaWV3LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpZiAod2lkdGggPiAyMCkgewotICAgICAgICAgICAgICAgIHdpZHRoIC09IDIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Qm91bmRzKDAsIDAsIHdpZHRoLCAyKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcmVuZXdDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Q29sb3I6IiArIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFBhaW50KCkuc2V0Q29sb3IoY29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0NvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdDb2xvcjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVmlldyBpbnN0YW5jZW9mIFZpZXcpIHsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW4gcGFyZW50ID0gZ2V0UGFyZW50U3BhbigpOwotICAgICAgICAgICAgICAgIEVkaXRhYmxlIHRleHQgPSAoKEVkaXRTdHlsZWRUZXh0KW1WaWV3KS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gdGV4dC5nZXRTcGFuU3RhcnQocGFyZW50KTsKLSAgICAgICAgICAgICAgICBGb3JlZ3JvdW5kQ29sb3JTcGFuW10gc3BhbnMgPSB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBzdGFydCwgRm9yZWdyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZXdDb2xvcihzcGFuc1tzcGFucy5sZW5ndGggLSAxXS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgSW1hZ2VTcGFuIGdldFBhcmVudFNwYW4oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRQYXJlbnRTcGFuOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1WaWV3IGluc3RhbmNlb2YgRWRpdFN0eWxlZFRleHQpIHsKLSAgICAgICAgICAgICAgICBFZGl0YWJsZSB0ZXh0ID0gKChFZGl0U3R5bGVkVGV4dCltVmlldykuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIEltYWdlU3BhbltdIGltYWdlcyA9IHRleHQuZ2V0U3BhbnMoMCwgdGV4dC5sZW5ndGgoKSwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJbWFnZVNwYW4gaW1hZ2U6IGltYWdlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLmdldERyYXdhYmxlKCkgPT0gdGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS1yZW5ld0JvdW5kczogQ291bGRuJ3QgZmluZCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTkwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKKworLyoqIHtAaGlkZX0gKi8KK2ludGVyZmFjZSBJUmVtb3RlVmlld3NGYWN0b3J5IHsKKyAgICB2b2lkIG9uRGF0YVNldENoYW5nZWQoKTsKKyAgICBpbnQgZ2V0Q291bnQoKTsKKyAgICBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKTsKKyAgICBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpOworICAgIGludCBnZXRWaWV3VHlwZUNvdW50KCk7CisgICAgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKTsKKyAgICBib29sZWFuIGhhc1N0YWJsZUlkcygpOworfQorCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCmluZGV4IGM3ODg2MDUuLjkwNDIzYmUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCkBAIC05Niw2ICs5Niw4IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFTU1dPUkRfVFlQRV9LRVkgPSAibG9ja3NjcmVlbi5wYXNzd29yZF90eXBlIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DS19QQVNTV09SRF9TQUxUX0tFWSA9ICJsb2Nrc2NyZWVuLnBhc3N3b3JkX3NhbHQiOwogCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBU1NXT1JEX0hJU1RPUllfS0VZID0gImxvY2tzY3JlZW4ucGFzc3dvcmRoaXN0b3J5IjsKKwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlcjsKQEAgLTE2Myw2ICsxNjUsMzMgQEAKICAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZFF1YWxpdHkobnVsbCk7CiAgICAgfQogCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTGV0dGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1OdW1lcmljKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1TeW1ib2xzKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOworICAgIH0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgcGFzc3dvcmQgbW9kZSwgYXMgc2V0IGJ5IGtleWd1YXJkIGFmdGVyIHVwZGF0aW5nIHRoZSBwYXNzd29yZC4KICAgICAgKgpAQCAtMjI3LDYgKzI1NiwzMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHBhc3N3b3JkIG1hdGNoZXMgYW55IG9mIHRoZSBwYXNzd29yZHMgc3RvcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGhpc3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgcGFzc3dvcmQgbWF0Y2hlcyBhbnkgaW4gdGhlIGhpc3RvcnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tQYXNzd29yZEhpc3RvcnkoU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhhc2hTdHJpbmcgPSBuZXcgU3RyaW5nKHBhc3N3b3JkVG9IYXNoKHBhc3N3b3JkKSk7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBQYXNzd29yZCBIaXN0b3J5IG1heSBiZSB0b28gbG9uZy4uLgorICAgICAgICBpbnQgcGFzc3dvcmRIYXNoTGVuZ3RoID0gcGFzc3dvcmRIYXNoU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCk7CisgICAgICAgIGlmKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IHBhc3N3b3JkSGFzaExlbmd0aCAqIHBhc3N3b3JkSGlzdG9yeUxlbmd0aAorICAgICAgICAgICAgICAgICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMTsKKyAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeS5sZW5ndGgoKSA+IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXNzd29yZEhpc3RvcnkuY29udGFpbnMocGFzc3dvcmRIYXNoU3RyaW5nKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHVzZXIgaGFzIHN0b3JlZCBhIGxvY2sgcGF0dGVybi4KICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgYSBzYXZlZCBwYXR0ZXJuIGV4aXN0cy4KICAgICAgKi8KQEAgLTI3OSw2ICszMzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgorICAgICAgICAgICAgICAgIGlmIChpc0xvY2tQYXNzd29yZEVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGFjdGl2ZVBhc3N3b3JkUXVhbGl0eTsKICAgICB9CkBAIC0yODcsOCArMzQ4LDYgQEAKICAgICAgKiBDbGVhciBhbnkgbG9jayBwYXR0ZXJuIG9yIHBhc3N3b3JkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTG9jaygpIHsKLSAgICAgICAgZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKICAgICAgICAgc2F2ZUxvY2tQYXNzd29yZChudWxsLCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HKTsKICAgICAgICAgc2V0TG9ja1BhdHRlcm5FbmFibGVkKGZhbHNlKTsKICAgICAgICAgc2F2ZUxvY2tQYXR0ZXJuKG51bGwpOwpAQCAtMzAxLDcgKzM2MCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2F2ZUxvY2tQYXR0ZXJuKExpc3Q8TG9ja1BhdHRlcm5WaWV3LkNlbGw+IHBhdHRlcm4pIHsKICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaGFzaAotICAgICAgICBmaW5hbCBieXRlW10gaGFzaCAgPSBMb2NrUGF0dGVyblV0aWxzLnBhdHRlcm5Ub0hhc2gocGF0dGVybik7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBoYXNoID0gTG9ja1BhdHRlcm5VdGlscy5wYXR0ZXJuVG9IYXNoKHBhdHRlcm4pOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGhhc2ggdG8gZmlsZQogICAgICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShzTG9ja1BhdHRlcm5GaWxlbmFtZSwgInJ3Iik7CkBAIC0zMTYsMTQgKzM3NSwxNSBAQAogICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNldEJvb2xlYW4oUEFUVEVSTl9FVkVSX0NIT1NFTl9LRVksIHRydWUpOwogICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcpOwotICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORywgcGF0dGVybi5zaXplKCkpOworICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcsIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplKCksIDAsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CisgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gsIHVubGVzcyB3ZSB3YW50IHRvIGZhaWwgb3ZlciB0byB1c2luZyB0aGUgc2V0dGluZ3MgcHJvdmlkZXIKKyAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncworICAgICAgICAgICAgLy8gcHJvdmlkZXIKICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBzYXZlIGxvY2sgcGF0dGVybiB0byAiICsgc0xvY2tQYXR0ZXJuRmlsZW5hbWUpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaApAQCAtMzgxLDE3ICs0NDEsNTkgQEAKICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbnQgY29tcHV0ZWRRdWFsaXR5ID0gY29tcHV0ZVBhc3N3b3JkUXVhbGl0eShwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgY29tcHV0ZWRRdWFsaXR5KTsKKyAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBNYXRoLm1heChxdWFsaXR5LCBjb21wdXRlZFF1YWxpdHkpKTsKICAgICAgICAgICAgICAgICBpZiAoY29tcHV0ZWRRdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewotICAgICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShjb21wdXRlZFF1YWxpdHksIHBhc3N3b3JkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxldHRlcnMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgdXBwZXJjYXNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvd2VyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN5bWJvbHMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbm9ubGV0dGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBwYXNzd29yZC5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9scysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKE1hdGgubWF4KHF1YWxpdHksIGNvbXB1dGVkUXVhbGl0eSksIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpLCBsZXR0ZXJzLCB1cHBlcmNhc2UsIGxvd2VyY2FzZSwgbnVtYmVycywgc3ltYm9scywgbm9ubGV0dGVyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcGFzc3dvcmQgaXMgbm90IGFueXRoaW5nLgogICAgICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcGFzc3dvcmQgdG8gdGhlIHBhc3N3b3JkIGhpc3RvcnkuIFdlIGFzc3VtZSBhbGwKKyAgICAgICAgICAgICAgICAvLyBwYXNzd29yZAorICAgICAgICAgICAgICAgIC8vIGhhc2hlcyBoYXZlIHRoZSBzYW1lIGxlbmd0aCBmb3Igc2ltcGxpY2l0eSBvZiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmRIaXN0b3J5ID0gZ2V0U3RyaW5nKFBBU1NXT1JEX0hJU1RPUllfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gbmV3IFN0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9ICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IG5ldyBTdHJpbmcoaGFzaCkgKyAiLCIgKyBwYXNzd29yZEhpc3Rvcnk7CisgICAgICAgICAgICAgICAgICAgIC8vIEN1dCBpdCB0byBjb250YWluIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCBoYXNoZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCAtMSBjb21tYXMuCisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IHBhc3N3b3JkSGlzdG9yeS5zdWJzdHJpbmcoMCwgTWF0aC5taW4oaGFzaC5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCArIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCAtIDEsIHBhc3N3b3JkSGlzdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVksIHBhc3N3b3JkSGlzdG9yeSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7CiAgICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gsIHVubGVzcyB3ZSB3YW50IHRvIGZhaWwgb3ZlciB0byB1c2luZyB0aGUgc2V0dGluZ3MgcHJvdmlkZXIKQEAgLTUzMSw3ICs2MzMsOCBAQAogICAgICAgICByZXR1cm4gc2F2ZWRQYXNzd29yZEV4aXN0cygpICYmCiAgICAgICAgICAgICAgICAgKG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQyk7CisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU1LDEyICs3NTgsMjEgQEAKICAgICAgICAgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUucHV0TG9uZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5LCB2YWx1ZSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBzZWN1cmVTZXR0aW5nS2V5KSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcobUNvbnRlbnRSZXNvbHZlciwgc2VjdXJlU2V0dGluZ0tleSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFN0cmluZyhTdHJpbmcgc2VjdXJlU2V0dGluZ0tleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5LCB2YWx1ZSk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CiAgICAgICAgIGxvbmcgbW9kZSA9IGdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYXR0ZXJuID0gbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HOwogICAgICAgICBmaW5hbCBib29sZWFuIGlzUGFzc3dvcmQgPSBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDCiAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQwotICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzsKKyAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMKKyAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOwogICAgICAgICBmaW5hbCBib29sZWFuIHNlY3VyZSA9IGlzUGF0dGVybiAmJiBpc0xvY2tQYXR0ZXJuRW5hYmxlZCgpICYmIHNhdmVkUGF0dGVybkV4aXN0cygpCiAgICAgICAgICAgICAgICAgfHwgaXNQYXNzd29yZCAmJiBzYXZlZFBhc3N3b3JkRXhpc3RzKCk7CiAgICAgICAgIHJldHVybiBzZWN1cmU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmQuamF2YQppbmRleCBlMWE2NzM3Li5mYWNkYTM2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkLmphdmEKQEAgLTY3LDggKzY3LDIyIEBACiAgICAgICAgIHRoaXMoY29udGV4dCwgeG1sTGF5b3V0UmVzSWQsIDApOwogICAgIH0KIAorICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisKICAgICBwdWJsaWMgUGFzc3dvcmRFbnRyeUtleWJvYXJkKENvbnRleHQgY29udGV4dCwgaW50IHhtbExheW91dFJlc0lkLCBpbnQgbW9kZSkgewogICAgICAgICBzdXBlcihjb250ZXh0LCB4bWxMYXlvdXRSZXNJZCwgbW9kZSk7CisgICAgICAgIGluaXQoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IG1vZGUsCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgeG1sTGF5b3V0UmVzSWQsIG1vZGUsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpbml0KGNvbnRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCkgewogICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKICAgICAgICAgbVJlcyA9IHJlczsKICAgICAgICAgbVNoaWZ0SWNvbiA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLnN5bV9rZXlib2FyZF9zaGlmdCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuamF2YQppbmRleCA1MzcyMGU0Li4zODRmN2JjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLmphdmEKQEAgLTU0LDEwICs1NCwyMCBAQAogICAgIHByaXZhdGUgVmlicmF0b3IgbVZpYnJhdG9yOwogCiAgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihDb250ZXh0IGNvbnRleHQsIEtleWJvYXJkVmlldyBrZXlib2FyZFZpZXcsIFZpZXcgdGFyZ2V0VmlldykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGtleWJvYXJkVmlldywgdGFyZ2V0VmlldywgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihDb250ZXh0IGNvbnRleHQsIEtleWJvYXJkVmlldyBrZXlib2FyZFZpZXcsIFZpZXcgdGFyZ2V0VmlldywKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlRnVsbFNjcmVlbldpZHRoKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVRhcmdldFZpZXcgPSB0YXJnZXRWaWV3OwogICAgICAgICBtS2V5Ym9hcmRWaWV3ID0ga2V5Ym9hcmRWaWV3OwotICAgICAgICBjcmVhdGVLZXlib2FyZHMoKTsKKyAgICAgICAgaWYgKHVzZUZ1bGxTY3JlZW5XaWR0aCB8fCBtS2V5Ym9hcmRWaWV3LmdldExheW91dFBhcmFtcygpLndpZHRoID09IC0xKSB7CisgICAgICAgICAgICBjcmVhdGVLZXlib2FyZHMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNyZWF0ZUtleWJvYXJkc1dpdGhTcGVjaWZpY1NpemUobUtleWJvYXJkVmlldy5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgbUtleWJvYXJkVmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQpOworICAgICAgICB9CiAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0T25LZXlib2FyZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtVmlicmF0b3IgPSBuZXcgVmlicmF0b3IoKTsKICAgICB9CkBAIC02Niw2ICs3NiwyOSBAQAogICAgICAgICByZXR1cm4gbUtleWJvYXJkTW9kZSA9PSBLRVlCT0FSRF9NT0RFX0FMUEhBOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVLZXlib2FyZHNXaXRoU3BlY2lmaWNTaXplKGludCB2aWV3V2lkdGgsIGludCB2aWV3SGVpZ2h0KSB7CisgICAgICAgIG1OdW1lcmljS2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LCBSLnhtbC5wYXNzd29yZF9rYmRfbnVtZXJpYywKKyAgICAgICAgICAgICAgICB2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBtUXdlcnR5S2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LAorICAgICAgICAgICAgICAgIFIueG1sLnBhc3N3b3JkX2tiZF9xd2VydHksIFIuaWQubW9kZV9ub3JtYWwsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1Rd2VydHlLZXlib2FyZC5lbmFibGVTaGlmdExvY2soKTsKKworICAgICAgICBtUXdlcnR5S2V5Ym9hcmRTaGlmdGVkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBSLnhtbC5wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQsCisgICAgICAgICAgICAgICAgUi5pZC5tb2RlX25vcm1hbCwgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkU2hpZnRlZC5lbmFibGVTaGlmdExvY2soKTsKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkU2hpZnRlZC5zZXRTaGlmdGVkKHRydWUpOyAvLyBhbHdheXMgc2hpZnRlZC4KKworICAgICAgICBtU3ltYm9sc0tleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwgUi54bWwucGFzc3dvcmRfa2JkX3N5bWJvbHMsCisgICAgICAgICAgICAgICAgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZC5lbmFibGVTaGlmdExvY2soKTsKKworICAgICAgICBtU3ltYm9sc0tleWJvYXJkU2hpZnRlZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsCisgICAgICAgICAgICAgICAgUi54bWwucGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1TeW1ib2xzS2V5Ym9hcmRTaGlmdGVkLmVuYWJsZVNoaWZ0TG9jaygpOworICAgICAgICBtU3ltYm9sc0tleWJvYXJkU2hpZnRlZC5zZXRTaGlmdGVkKHRydWUpOyAvLyBhbHdheXMgc2hpZnRlZAorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVLZXlib2FyZHMoKSB7CiAgICAgICAgIG1OdW1lcmljS2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LCBSLnhtbC5wYXNzd29yZF9rYmRfbnVtZXJpYyk7CiAgICAgICAgIG1Rd2VydHlLZXlib2FyZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdUYWIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhCmluZGV4IDkxNTI3MjkuLjM4NjU1MTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhCkBAIC0xNywxMCArMTcsOCBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7CkBAIC0zOCw2ICszNiw3IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGU7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiAvKioKQEAgLTY5LDIxICs2OCwyMSBAQAogICAgIHByaXZhdGUgaW50IG1HcmFiYmVkU3RhdGUgPSBPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UcmlnZ2VyZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIFZpYnJhdG9yIG1WaWJyYXRvcjsKLSAgICBwcml2YXRlIGZsb2F0IG1EZW5zaXR5OyAvLyB1c2VkIHRvIHNjYWxlIGRpbWVuc2lvbnMgZm9yIGJpdG1hcHMuCisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtRGVuc2l0eTsgLy8gdXNlZCB0byBzY2FsZSBkaW1lbnNpb25zIGZvciBiaXRtYXBzLgogCiAgICAgLyoqCiAgICAgICogRWl0aGVyIHtAbGluayAjSE9SSVpPTlRBTH0gb3Ige0BsaW5rICNWRVJUSUNBTH0uCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU9yaWVudGF0aW9uOworICAgIHByaXZhdGUgZmluYWwgaW50IG1PcmllbnRhdGlvbjsKIAotICAgIHByaXZhdGUgU2xpZGVyIG1MZWZ0U2xpZGVyOwotICAgIHByaXZhdGUgU2xpZGVyIG1SaWdodFNsaWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNsaWRlciBtTGVmdFNsaWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNsaWRlciBtUmlnaHRTbGlkZXI7CiAgICAgcHJpdmF0ZSBTbGlkZXIgbUN1cnJlbnRTbGlkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UcmFja2luZzsKICAgICBwcml2YXRlIGZsb2F0IG1UaHJlc2hvbGQ7CiAgICAgcHJpdmF0ZSBTbGlkZXIgbU90aGVyU2xpZGVyOwogICAgIHByaXZhdGUgYm9vbGVhbiBtQW5pbWF0aW5nOwotICAgIHByaXZhdGUgUmVjdCBtVG1wUmVjdDsKKyAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRtcFJlY3Q7CiAKICAgICAvKioKICAgICAgKiBMaXN0ZW5lciB1c2VkIHRvIHJlc2V0IHRoZSB2aWV3IHdoZW4gdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGNvbXBsZXRlcy4KQEAgLTQxNyw3ICs0MTYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0IGFuaW1hdGluZyB0aGUgc2xpZGVyLiBOb3RlIHdlIG5lZWQgdHdvIGFuaW1hdGlvbnMgc2luY2UgYW4gQW5pbWF0b3IKKyAgICAgICAgICogU3RhcnQgYW5pbWF0aW5nIHRoZSBzbGlkZXIuIE5vdGUgd2UgbmVlZCB0d28gYW5pbWF0aW9ucyBzaW5jZSBhbiBWYWx1ZUFuaW1hdG9yCiAgICAgICAgICAqIGtlZXBzIGludGVybmFsIHN0YXRlIG9mIHRoZSBpbnZhbGlkYXRpb24gcmVnaW9uIHdoaWNoIGlzIGp1c3QgdGhlIHZpZXcgYmVpbmcgYW5pbWF0ZWQuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBhbmltMQpAQCAtNDc1LDEwICs0NzQsMTMgQEAKICAgICAgICAgaW50IGhlaWdodFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CiAgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9ICBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKIAotICAgICAgICBpZiAod2lkdGhTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCB8fCBoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkgewotICAgICAgICAgICAgTG9nLmUoIlNsaWRpbmdUYWIiLCAiU2xpZGluZ1RhYiBjYW5ub3QgaGF2ZSBVTlNQRUNJRklFRCBNZWFzdXJlU3BlYyIKLSAgICAgICAgICAgICAgICAgICAgKyIod3NwZWM9IiArIHdpZHRoU3BlY01vZGUgKyAiLCBoc3BlYz0iICsgaGVpZ2h0U3BlY01vZGUgKyAiKSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSdW50aW1lRXhjZXB0aW9uKExPR19UQUcgKyAic3RhY2s6IikpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBpZiAod2lkdGhTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCAKKyAgICAgICAgICAgICAgICAgICAgfHwgaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiU2xpZGluZ1RhYiIsICJTbGlkaW5nVGFiIGNhbm5vdCBoYXZlIFVOU1BFQ0lGSUVEIE1lYXN1cmVTcGVjIgorICAgICAgICAgICAgICAgICAgICAgICAgKyIod3NwZWM9IiArIHdpZHRoU3BlY01vZGUgKyAiLCBoc3BlYz0iICsgaGVpZ2h0U3BlY01vZGUgKyAiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUnVudGltZUV4Y2VwdGlvbihMT0dfVEFHICsgInN0YWNrOiIpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIG1MZWZ0U2xpZGVyLm1lYXN1cmUoKTsKQEAgLTYwOCwxNCArNjEwLDcgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKLSAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmlnZ2VyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbU90aGVyU2xpZGVyLnNob3codHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2xpZGVyLnJlc2V0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTbGlkZXIuaGlkZVRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNsaWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIG1PdGhlclNsaWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNldEdyYWJiZWRTdGF0ZShPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpOworICAgICAgICAgICAgICAgICAgICBjYW5jZWxHcmFiKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02MjMsNiArNjE4LDE3IEBACiAgICAgICAgIHJldHVybiBtVHJhY2tpbmcgfHwgc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY2FuY2VsR3JhYigpIHsKKyAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7CisgICAgICAgIG1UcmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAgbU90aGVyU2xpZGVyLnNob3codHJ1ZSk7CisgICAgICAgIG1DdXJyZW50U2xpZGVyLnJlc2V0KGZhbHNlKTsKKyAgICAgICAgbUN1cnJlbnRTbGlkZXIuaGlkZVRhcmdldCgpOworICAgICAgICBtQ3VycmVudFNsaWRlciA9IG51bGw7CisgICAgICAgIG1PdGhlclNsaWRlciA9IG51bGw7CisgICAgICAgIHNldEdyYWJiZWRTdGF0ZShPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpOworICAgIH0KKwogICAgIHZvaWQgc3RhcnRBbmltYXRpbmcoZmluYWwgYm9vbGVhbiBob2xkQWZ0ZXIpIHsKICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7CiAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiB0cmFuczE7CkBAIC04MzIsNiArODM4LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKFZpZXcgY2hhbmdlZFZpZXcsIGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUNoYW5nZWQoY2hhbmdlZFZpZXcsIHZpc2liaWxpdHkpOworICAgICAgICAvLyBXaGVuIHZpc2liaWxpdHkgY2hhbmdlcyBhbmQgdGhlIHVzZXIgaGFzIGEgdGFiIHNlbGVjdGVkLCB1bnNlbGVjdCBpdCBhbmQKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZWlyIGNhbGxiYWNrIGdldHMgY2FsbGVkLgorICAgICAgICBpZiAoY2hhbmdlZFZpZXcgPT0gdGhpcyAmJiB2aXNpYmlsaXR5ICE9IFZJU0lCTEUKKyAgICAgICAgICAgICAgICAmJiBtR3JhYmJlZFN0YXRlICE9IE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSkgeworICAgICAgICAgICAgY2FuY2VsR3JhYigpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY3VycmVudCBncmFiYmVkIHN0YXRlLCBhbmQgZGlzcGF0Y2hlcyBhIGdyYWJiZWQgc3RhdGUgY2hhbmdlCiAgICAgICogZXZlbnQgdG8gb3VyIGxpc3RlbmVyLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9XYXZlVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9XYXZlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZWU3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1dhdmVWaWV3LmphdmEKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CisKKy8qKgorICogQSBzcGVjaWFsIHdpZGdldCBjb250YWluaW5nIGEgY2VudGVyIGFuZCBvdXRlciByaW5nLiBNb3ZpbmcgdGhlIGNlbnRlciByaW5nIHRvIHRoZSBvdXRlciByaW5nCisgKiBjYXVzZXMgYW4gZXZlbnQgdGhhdCBjYW4gYmUgY2F1Z2h0IGJ5IGltcGxlbWVudGluZyBPblRyaWdnZXJMaXN0ZW5lci4KKyAqLworcHVibGljIGNsYXNzIFdhdmVWaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIFZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXYXZlVmlldyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FWRV9DT1VOVCA9IDU7IC8vIGRlZmF1bHQgd2F2ZSBjb3VudAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVklCUkFURV9TSE9SVCA9IDIwOyAgLy8gbXNlYworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVklCUkFURV9MT05HID0gMjA7ICAvLyBtc2VjCisKKyAgICAvLyBMb2NrIHN0YXRlIG1hY2hpbmUgc3RhdGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1JFU0VUX0xPQ0sgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9SRUFEWSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUQVJUX0FUVEVNUFQgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9BVFRFTVBUSU5HID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVU5MT0NLX0FUVEVNUFQgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9VTkxPQ0tfU1VDQ0VTUyA9IDU7CisKKyAgICAvLyBBbmltYXRpb24gcHJvcGVydGllcy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERVUkFUSU9OID0gNTAwOyAvLyBkdXJhdGlvbiBvZiB0cmFuc2l0aW9uYWwgYW5pbWF0aW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRklOQUxfREVMQVkgPSAxMzAwOyAvLyBkZWxheSBmb3IgZmluYWwgYW5pbWF0aW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0hPUlRfREVMQVkgPSAxMDA7IC8vIGZvciBzdGFydGluZyBvbmUgYW5pbWF0aW9uIGFmdGVyIGFub3RoZXIuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBXQVZFX0RVUkFUSU9OID0gMjAwMDsgLy8gYW1vdW50IG9mIHRpbWUgZm9yIHdheSB0byBleHBhbmQvZGVjYXkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFJFU0VUX1RJTUVPVVQgPSAzMDAwOyAvLyBlbGFwc2VkIHRpbWUgb2YgaW5hY3Rpdml0eSBiZWZvcmUgd2UgcmVzZXQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZX0lOQ1JFTUVOVCA9IDE1OyAvLyBpbmNyZW1lbnQgcGVyIHdhdmUgd2hpbGUgdHJhY2tpbmcgbW90aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUxBWV9JTkNSRU1FTlQyID0gMTI7IC8vIGluY3JlbWVudCBwZXIgd2F2ZSB3aGlsZSBub3QgdHJhY2tpbmcKKworICAgIHByaXZhdGUgVmlicmF0b3IgbVZpYnJhdG9yOworICAgIHByaXZhdGUgT25UcmlnZ2VyTGlzdGVuZXIgbU9uVHJpZ2dlckxpc3RlbmVyOworICAgIHByaXZhdGUgQXJyYXlMaXN0PERyYXdhYmxlSG9sZGVyPiBtRHJhd2FibGVzID0gbmV3IEFycmF5TGlzdDxEcmF3YWJsZUhvbGRlcj4oMyk7CisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8RHJhd2FibGVIb2xkZXI+IG1MaWdodFdhdmVzID0gbmV3IEFycmF5TGlzdDxEcmF3YWJsZUhvbGRlcj4oV0FWRV9DT1VOVCk7CisgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5nZXJEb3duID0gZmFsc2U7CisgICAgcHJpdmF0ZSBmbG9hdCBtUmluZ1JhZGl1cyA9IDE4Mi4wZjsgLy8gUmFkaXVzIG9mIGJpdG1hcCByaW5nLiBVc2VkIHRvIHNuYXAgaGFsbyB0byBpdAorICAgIHByaXZhdGUgaW50IG1TbmFwUmFkaXVzID0gMTM2OyAvLyBtaW5pbXVtIHRocmVzaG9sZCBmb3IgZHJhZyB1bmxvY2sKKyAgICBwcml2YXRlIGludCBtV2F2ZURlbGF5ID0gMjQwOyAvLyB0aW1lIHRvIGRlbGF5CisgICAgcHJpdmF0ZSBpbnQgbVdhdmVDb3VudCA9IFdBVkVfQ09VTlQ7ICAvLyBudW1iZXIgb2Ygd2F2ZXMKKyAgICBwcml2YXRlIGxvbmcgbVdhdmVUaW1lckRlbGF5ID0gbVdhdmVEZWxheTsKKyAgICBwcml2YXRlIGludCBtQ3VycmVudFdhdmUgPSAwOworICAgIHByaXZhdGUgZmxvYXQgbUxvY2tDZW50ZXJYOyAvLyBjZW50ZXIgb2Ygd2lkZ2V0IGFzIGRpY3RhdGVkIGJ5IHdpZGdldCBzaXplCisgICAgcHJpdmF0ZSBmbG9hdCBtTG9ja0NlbnRlclk7CisgICAgcHJpdmF0ZSBmbG9hdCBtTW91c2VYOyAvLyBjdXJyZW50IG1vdXNlIHBvc2l0aW9uIGFzIG9mIGxhc3QgdG91Y2ggZXZlbnQKKyAgICBwcml2YXRlIGZsb2F0IG1Nb3VzZVk7CisgICAgcHJpdmF0ZSBEcmF3YWJsZUhvbGRlciBtVW5sb2NrUmluZzsKKyAgICBwcml2YXRlIERyYXdhYmxlSG9sZGVyIG1VbmxvY2tEZWZhdWx0OworICAgIHByaXZhdGUgRHJhd2FibGVIb2xkZXIgbVVubG9ja0hhbG87CisgICAgcHJpdmF0ZSBpbnQgbUxvY2tTdGF0ZSA9IFNUQVRFX1JFU0VUX0xPQ0s7CisgICAgcHJpdmF0ZSBpbnQgbUdyYWJiZWRTdGF0ZSA9IE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRTsKKworICAgIHB1YmxpYyBXYXZlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgV2F2ZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIC8vIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgUi5zdHlsZWFibGUuV2F2ZVZpZXcpOworICAgICAgICAvLyBtT3JpZW50YXRpb24gPSBhLmdldEludChSLnN0eWxlYWJsZS5XYXZlVmlld19vcmllbnRhdGlvbiwgSE9SSVpPTlRBTCk7CisgICAgICAgIC8vIGEucmVjeWNsZSgpOworCisgICAgICAgIGluaXREcmF3YWJsZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCB3LCBpbnQgaCwgaW50IG9sZHcsIGludCBvbGRoKSB7CisgICAgICAgIG1Mb2NrQ2VudGVyWCA9IDAuNWYgKiB3OworICAgICAgICBtTG9ja0NlbnRlclkgPSAwLjVmICogaDsKKyAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aCgpIHsKKyAgICAgICAgLy8gVmlldyBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHVubG9jayByaW5nICsgaGFsbworICAgICAgICByZXR1cm4gbVVubG9ja1JpbmcuZ2V0V2lkdGgoKSArIG1VbmxvY2tIYWxvLmdldFdpZHRoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0KCkgeworICAgICAgICAvLyBWaWV3IHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUgdW5sb2NrIHJpbmcgKyBoYWxvCisgICAgICAgIHJldHVybiBtVW5sb2NrUmluZy5nZXRIZWlnaHQoKSArIG1VbmxvY2tIYWxvLmdldEhlaWdodCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGludCB3aWR0aFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaW50IGhlaWdodFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gIE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9ICBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAgICBpbnQgaGVpZ2h0OworCisgICAgICAgIGlmICh3aWR0aFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGhTcGVjU2l6ZSwgZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoKCkpOworICAgICAgICB9IGVsc2UgaWYgKHdpZHRoU3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuRVhBQ1RMWSkgeworICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGggPSBnZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5BVF9NT1NUKSB7CisgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHRTcGVjU2l6ZSwgZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoKCkpOworICAgICAgICB9IGVsc2UgaWYgKGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLkVYQUNUTFkpIHsKKyAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVpZ2h0ID0gZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodCgpOworICAgICAgICB9CisKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24od2lkdGgsIGhlaWdodCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXREcmF3YWJsZXMoKSB7CisgICAgICAgIG1VbmxvY2tSaW5nID0gbmV3IERyYXdhYmxlSG9sZGVyKGNyZWF0ZURyYXdhYmxlKFIuZHJhd2FibGUudW5sb2NrX3JpbmcpKQorICAgICAgICAgICAgLnNldFgobUxvY2tDZW50ZXJYKS5zZXRZKG1Mb2NrQ2VudGVyWSkuc2V0U2NhbGVYKDAuMWYpLnNldFNjYWxlWSgwLjFmKS5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgbURyYXdhYmxlcy5hZGQobVVubG9ja1JpbmcpOworCisgICAgICAgIG1VbmxvY2tEZWZhdWx0ID0gbmV3IERyYXdhYmxlSG9sZGVyKGNyZWF0ZURyYXdhYmxlKFIuZHJhd2FibGUudW5sb2NrX2RlZmF1bHQpKQorICAgICAgICAgICAgLnNldFgobUxvY2tDZW50ZXJYKS5zZXRZKG1Mb2NrQ2VudGVyWSkuc2V0U2NhbGVYKDAuMWYpLnNldFNjYWxlWSgwLjFmKS5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgbURyYXdhYmxlcy5hZGQobVVubG9ja0RlZmF1bHQpOworCisgICAgICAgIG1VbmxvY2tIYWxvID0gbmV3IERyYXdhYmxlSG9sZGVyKGNyZWF0ZURyYXdhYmxlKFIuZHJhd2FibGUudW5sb2NrX2hhbG8pKQorICAgICAgICAgICAgLnNldFgobUxvY2tDZW50ZXJYKS5zZXRZKG1Mb2NrQ2VudGVyWSkuc2V0U2NhbGVYKDAuMWYpLnNldFNjYWxlWSgwLjFmKS5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgbURyYXdhYmxlcy5hZGQobVVubG9ja0hhbG8pOworCisgICAgICAgIEJpdG1hcERyYXdhYmxlIHdhdmUgPSBjcmVhdGVEcmF3YWJsZShSLmRyYXdhYmxlLnVubG9ja193YXZlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtV2F2ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIERyYXdhYmxlSG9sZGVyIGhvbGRlciA9IG5ldyBEcmF3YWJsZUhvbGRlcih3YXZlKTsKKyAgICAgICAgICAgIG1MaWdodFdhdmVzLmFkZChob2xkZXIpOworICAgICAgICAgICAgaG9sZGVyLnNldEFscGhhKDAuMGYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhdmVVcGRhdGVGcmFtZShmbG9hdCBtb3VzZVgsIGZsb2F0IG1vdXNlWSwgYm9vbGVhbiBmaW5nZXJEb3duKSB7CisgICAgICAgIGRvdWJsZSBkaXN0WCA9IG1vdXNlWCAtIG1Mb2NrQ2VudGVyWDsKKyAgICAgICAgZG91YmxlIGRpc3RZID0gbW91c2VZIC0gbUxvY2tDZW50ZXJZOworICAgICAgICBpbnQgZHJhZ0Rpc3RhbmNlID0gKGludCkgTWF0aC5jZWlsKE1hdGguaHlwb3QoZGlzdFgsIGRpc3RZKSk7CisgICAgICAgIGRvdWJsZSB0b3VjaEEgPSBNYXRoLmF0YW4yKGRpc3RYLCBkaXN0WSk7CisgICAgICAgIGZsb2F0IHJpbmdYID0gKGZsb2F0KSAobUxvY2tDZW50ZXJYICsgbVJpbmdSYWRpdXMgKiBNYXRoLnNpbih0b3VjaEEpKTsKKyAgICAgICAgZmxvYXQgcmluZ1kgPSAoZmxvYXQpIChtTG9ja0NlbnRlclkgKyBtUmluZ1JhZGl1cyAqIE1hdGguY29zKHRvdWNoQSkpOworCisgICAgICAgIHN3aXRjaCAobUxvY2tTdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBTVEFURV9SRVNFVF9MT0NLOgorICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlN0YXRlIFJFU0VUX0xPQ0siKTsKKyAgICAgICAgICAgICAgICBtV2F2ZVRpbWVyRGVsYXkgPSBtV2F2ZURlbGF5OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUxpZ2h0V2F2ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byhtTGlnaHRXYXZlLmdldChpKSwgLjMsIHthbHBoYTowLCBlYXNlOlF1aW50LmVhc2VPdXR9KTsKKyAgICAgICAgICAgICAgICAgICAgRHJhd2FibGVIb2xkZXIgaG9sZGVyID0gbUxpZ2h0V2F2ZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBob2xkZXIuYWRkQW5pbVRvKDMwMCwgMCwgImFscGhhIiwgMC4wZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1MaWdodFdhdmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaWdodFdhdmVzLmdldChpKS5zdGFydEFuaW1hdGlvbnModGhpcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tSaW5nLCAuNSwgeyB4OiBsb2NrWCwgeTogbG9ja1ksIHNjYWxlWDogLjEsIHNjYWxlWTogLjEsCisgICAgICAgICAgICAgICAgLy8gYWxwaGE6IDAsIG92ZXJ3cml0ZTogdHJ1ZSwgZWFzZTpRdWludC5lYXNlT3V0ICAgfSk7CisgICAgICAgICAgICAgICAgbVVubG9ja1JpbmcuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAieCIsIG1Mb2NrQ2VudGVyWCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja1JpbmcuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAieSIsIG1Mb2NrQ2VudGVyWSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja1JpbmcuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAic2NhbGVYIiwgMC4xZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja1JpbmcuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAic2NhbGVZIiwgMC4xZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja1JpbmcuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAiYWxwaGEiLCAwLjBmLCB0cnVlKTsKKworICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odW5sb2NrRGVmYXVsdCwgMCwgeyB4OiBsb2NrWCwgeTogbG9ja1ksIHNjYWxlWDogLjEsIHNjYWxlWTogLjEsCisgICAgICAgICAgICAgICAgLy8gYWxwaGE6IDAgICwgb3ZlcndyaXRlOiB0cnVlICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoIngiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoInkiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoInNjYWxlWCIpOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigic2NhbGVZIik7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJhbHBoYSIpOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnNldFgobUxvY2tDZW50ZXJYKS5zZXRZKG1Mb2NrQ2VudGVyWSkuc2V0U2NhbGVYKDAuMWYpLnNldFNjYWxlWSgwLjFmKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFscGhhKDAuMGYpOworCisgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tEZWZhdWx0LCAuNSwgeyBkZWxheTogLjEsIHNjYWxlWDogMSwgc2NhbGVZOiAxLAorICAgICAgICAgICAgICAgIC8vIGFscGhhOiAxLCBvdmVyd3JpdGU6IHRydWUsIGVhc2U6UXVpbnQuZWFzZU91dCAgIH0pOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgU0hPUlRfREVMQVksICJzY2FsZVgiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5hZGRBbmltVG8oRFVSQVRJT04sIFNIT1JUX0RFTEFZLCAic2NhbGVZIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuYWRkQW5pbVRvKERVUkFUSU9OLCBTSE9SVF9ERUxBWSwgImFscGhhIiwgMS4wZiwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0hhbG8sIDAsIHsgeDogbG9ja1gsIHk6IGxvY2tZLCBzY2FsZVg6LjEsIHNjYWxlWTogLjEsCisgICAgICAgICAgICAgICAgLy8gYWxwaGE6IDAgICwgb3ZlcndyaXRlOiB0cnVlICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5yZW1vdmVBbmltYXRpb25Gb3IoIngiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5yZW1vdmVBbmltYXRpb25Gb3IoInkiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5yZW1vdmVBbmltYXRpb25Gb3IoInNjYWxlWCIpOworICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLnJlbW92ZUFuaW1hdGlvbkZvcigic2NhbGVZIik7CisgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8ucmVtb3ZlQW5pbWF0aW9uRm9yKCJhbHBoYSIpOworICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLnNldFgobUxvY2tDZW50ZXJYKS5zZXRZKG1Mb2NrQ2VudGVyWSkuc2V0U2NhbGVYKDAuMWYpLnNldFNjYWxlWSgwLjFmKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFscGhhKDAuMGYpOworCisgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tIYWxvLCAuNSwgeyB4OiBsb2NrWCwgeTogbG9ja1ksIHNjYWxlWDogMSwgc2NhbGVZOiAxLAorICAgICAgICAgICAgICAgIC8vIGFscGhhOiAxICAsIG92ZXJ3cml0ZTogdHJ1ZSwgZWFzZTpRdWludC5lYXNlT3V0ICAgfSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKERVUkFUSU9OLCBTSE9SVF9ERUxBWSwgIngiLCBtTG9ja0NlbnRlclgsIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbyhEVVJBVElPTiwgU0hPUlRfREVMQVksICJ5IiwgbUxvY2tDZW50ZXJZLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oRFVSQVRJT04sIFNIT1JUX0RFTEFZLCAic2NhbGVYIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKERVUkFUSU9OLCBTSE9SVF9ERUxBWSwgInNjYWxlWSIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbyhEVVJBVElPTiwgU0hPUlRfREVMQVksICJhbHBoYSIsIDEuMGYsIHRydWUpOworCisgICAgICAgICAgICAgICAgLy9sb2NrVGltZXIuc3RvcCgpOworICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtTG9ja1RpbWVyQWN0aW9ucyk7CisKKyAgICAgICAgICAgICAgICBtTG9ja1N0YXRlID0gU1RBVEVfUkVBRFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfUkVBRFk6CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiU3RhdGUgUkVBRFkiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9BVFRFTVBUOgorICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlN0YXRlIFNUQVJUX0FUVEVNUFQiKTsKKyAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0RlZmF1bHQsIDAsIHtzY2FsZVg6IC4xLCBzY2FsZVk6LjEsIGFscGhhOiAwLAorICAgICAgICAgICAgICAgIC8vIHg6bG9ja1ggKzE4MiwgeTogbG9ja1kgICwgb3ZlcndyaXRlOiB0cnVlICAgfSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJ4Iik7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJ5Iik7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJzY2FsZVgiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoInNjYWxlWSIpOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigiYWxwaGEiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5zZXRYKG1Mb2NrQ2VudGVyWCArIDE4Mikuc2V0WShtTG9ja0NlbnRlclkpLnNldFNjYWxlWCgwLjFmKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNjYWxlWSgwLjFmKS5zZXRBbHBoYSgwLjBmKTsKKworICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odW5sb2NrRGVmYXVsdCwgMC41LCB7IGRlbGF5OiAuMSAgICwgc2NhbGVYOiAxLCBzY2FsZVk6IDEsCisgICAgICAgICAgICAgICAgLy8gYWxwaGE6IDEsIGVhc2U6UXVpbnQuZWFzZU91dCAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgU0hPUlRfREVMQVksICJzY2FsZVgiLCAxLjBmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuYWRkQW5pbVRvKERVUkFUSU9OLCBTSE9SVF9ERUxBWSwgInNjYWxlWSIsIDEuMGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5hZGRBbmltVG8oRFVSQVRJT04sIFNIT1JUX0RFTEFZLCAiYWxwaGEiLCAxLjBmLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja1JpbmcsIDAuNSwge3NjYWxlWDogMSwgc2NhbGVZOiAxLAorICAgICAgICAgICAgICAgIC8vIGFscGhhOiAxLCBlYXNlOlF1aW50LmVhc2VPdXQsIG92ZXJ3cml0ZTogdHJ1ZSAgIH0pOworICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgInNjYWxlWCIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgInNjYWxlWSIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgImFscGhhIiwgMS4wZiwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBwb3N0RGVsYXllZChtQWRkV2F2ZUFjdGlvbiwgbVdhdmVUaW1lckRlbGF5KTsKKworICAgICAgICAgICAgICAgIG1Mb2NrU3RhdGUgPSBTVEFURV9BVFRFTVBUSU5HOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVRFX0FUVEVNUFRJTkc6CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiU3RhdGUgQVRURU1QVElORyIpOworICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odW5sb2NrSGFsbywgMC40LCB7IHg6bW91c2VYLCB5Om1vdXNlWSwgc2NhbGVYOjEsIHNjYWxlWToxLAorICAgICAgICAgICAgICAgIC8vIGFscGhhOiAxLCBlYXNlOlF1aW50LmVhc2VPdXQgfSk7CisgICAgICAgICAgICAgICAgaWYgKGRyYWdEaXN0YW5jZSA+IG1TbmFwUmFkaXVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaW5nZXJEb3duKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0hhbG8sIDAuNCwge3g6cmluZ1gsIHk6cmluZ1ksIHNjYWxlWDoxLCBzY2FsZVk6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscGhhOiAxICwgZWFzZTpRdWludC5lYXNlT3V0ICAgICwgb3ZlcndyaXRlOiB0cnVlIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKDAsIDAsICJ4IiwgcmluZ1gsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKDAsIDAsICJ5IiwgcmluZ1ksIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKDAsIDAsICJzY2FsZVgiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbygwLCAwLCAic2NhbGVZIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oMCwgMCwgImFscGhhIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2tTdGF0ZSA9IFNUQVRFX1VOTE9DS19BVFRFTVBUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKDAsIDAsICJ4IiwgbW91c2VYLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKDAsIDAsICJ5IiwgbW91c2VZLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKDAsIDAsICJzY2FsZVgiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKDAsIDAsICJzY2FsZVkiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKDAsIDAsICJhbHBoYSIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVEFURV9VTkxPQ0tfQVRURU1QVDoKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJTdGF0ZSBVTkxPQ0tfQVRURU1QVCIpOworICAgICAgICAgICAgICAgIGlmIChkcmFnRGlzdGFuY2UgPiBtU25hcFJhZGl1cykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG1MaWdodFdhdmVzLnNpemUoKTsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHRoaXNbImxpZ2h0V2F2ZSIrbl0sIC41LHthbHBoYTowLCBkZWxheTogKDYrbi1jdXJyZW50V2F2ZSkqLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB4OnJpbmdYLCB5OnJpbmdZLCBzY2FsZVg6IC4xLCBzY2FsZVk6IC4xLCBlYXNlOlF1aW50LmVhc2VPdXR9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlSG9sZGVyIHdhdmUgPSBtTGlnaHRXYXZlcy5nZXQobik7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRlbGF5ID0gMTAwMEwqKDYgKyBuIC0gbUN1cnJlbnRXYXZlKS8xMEw7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXZlLmFkZEFuaW1UbyhEVVJBVElPTiwgZGVsYXksICJ4IiwgcmluZ1gsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgd2F2ZS5hZGRBbmltVG8oRFVSQVRJT04sIGRlbGF5LCAieSIsIHJpbmdZLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhdmUuYWRkQW5pbVRvKERVUkFUSU9OLCBkZWxheSwgInNjYWxlWCIsIDAuMWYsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgd2F2ZS5hZGRBbmltVG8oRFVSQVRJT04sIGRlbGF5LCAic2NhbGVZIiwgMC4xZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXZlLmFkZEFuaW1UbyhEVVJBVElPTiwgZGVsYXksICJhbHBoYSIsIDAuMGYsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUxpZ2h0V2F2ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MaWdodFdhdmVzLmdldChpKS5zdGFydEFuaW1hdGlvbnModGhpcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja1JpbmcsIC41LCB7eDpyaW5nWCwgeTogcmluZ1ksIHNjYWxlWDogLjEsIHNjYWxlWTogLjEsCisgICAgICAgICAgICAgICAgICAgIC8vIGFscGhhOiAwLCBlYXNlOiBRdWludC5lYXNlT3V0ICAgfSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgIngiLCByaW5nWCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrUmluZy5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJ5IiwgcmluZ1ksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja1JpbmcuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAic2NhbGVYIiwgMC4xZiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrUmluZy5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJzY2FsZVkiLCAwLjFmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgImFscGhhIiwgMC4wZiwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odW5sb2NrUmluZywgLjUsIHsgZGVsYXk6IDEuMywgYWxwaGE6IDAgICwgZWFzZTogUXVpbnQuZWFzZU91dCB9KTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja1JpbmcuYWRkQW5pbVRvKERVUkFUSU9OLCBGSU5BTF9ERUxBWSwgImFscGhhIiwgMC4wZiwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odW5sb2NrRGVmYXVsdCwgMCwgeyB4OnJpbmdYLCB5OiByaW5nWSwgc2NhbGVYOiAuMSwgc2NhbGVZOiAuMSwKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxwaGE6IDAgICwgb3ZlcndyaXRlOiB0cnVlIH0pOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoIngiKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJ5Iik7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigic2NhbGVYIik7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigic2NhbGVZIik7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigiYWxwaGEiKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuc2V0WChyaW5nWCkuc2V0WShyaW5nWSkuc2V0U2NhbGVYKDAuMWYpLnNldFNjYWxlWSgwLjFmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbHBoYSgwLjBmKTsKKworICAgICAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0RlZmF1bHQsIC41LCB7IHg6cmluZ1gsIHk6IHJpbmdZLCBzY2FsZVg6IDEsIHNjYWxlWTogMSwKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxwaGE6IDEgICwgZWFzZTogUXVpbnQuZWFzZU91dCAgLCBvdmVyd3JpdGU6IHRydWUgfSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgIngiLCByaW5nWCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgInkiLCByaW5nWSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgInNjYWxlWCIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJzY2FsZVkiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAiYWxwaGEiLCAxLjBmLCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0RlZmF1bHQsIC41LCB7IGRlbGF5OiAxLjMsIHNjYWxlWDogMywgc2NhbGVZOiAzLAorICAgICAgICAgICAgICAgICAgICAvLyBhbHBoYTogMSwgZWFzZTogUXVpbnQuZWFzZU91dCB9KTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuYWRkQW5pbVRvKERVUkFUSU9OLCBGSU5BTF9ERUxBWSwgInNjYWxlWCIsIDMuMGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuYWRkQW5pbVRvKERVUkFUSU9OLCBGSU5BTF9ERUxBWSwgInNjYWxlWSIsIDMuMGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuYWRkQW5pbVRvKERVUkFUSU9OLCBGSU5BTF9ERUxBWSwgImFscGhhIiwgMS4wZiwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odW5sb2NrSGFsbywgLjUsIHsgeDpyaW5nWCwgeTogcmluZ1kgLCBlYXNlOiBCYWNrLmVhc2VPdXQgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgIngiLCByaW5nWCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJ5IiwgcmluZ1ksIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0hhbG8sIC41LCB7IGRlbGF5OiAxLjMsIHNjYWxlWDogMywgc2NhbGVZOiAzLAorICAgICAgICAgICAgICAgICAgICAvLyBhbHBoYTogMSwgZWFzZTogUXVpbnQuZWFzZU91dCAgIH0pOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oRFVSQVRJT04sIEZJTkFMX0RFTEFZLCAic2NhbGVYIiwgMy4wZiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oRFVSQVRJT04sIEZJTkFMX0RFTEFZLCAic2NhbGVZIiwgMy4wZiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oRFVSQVRJT04sIEZJTkFMX0RFTEFZLCAiYWxwaGEiLCAxLjBmLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1Mb2NrVGltZXJBY3Rpb25zKTsKKworICAgICAgICAgICAgICAgICAgICBwb3N0RGVsYXllZChtTG9ja1RpbWVyQWN0aW9ucywgUkVTRVRfVElNRU9VVCk7CisKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hUcmlnZ2VyRXZlbnQoT25UcmlnZ2VyTGlzdGVuZXIuQ0VOVEVSX0hBTkRMRSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrU3RhdGUgPSBTVEFURV9VTkxPQ0tfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTG9ja1N0YXRlID0gU1RBVEVfUkVTRVRfTE9DSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfVU5MT0NLX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiU3RhdGUgVU5MT0NLX1NVQ0NFU1MiKTsKKyAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobUFkZFdhdmVBY3Rpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlVua25vd24gc3RhdGUgIiArIG1Mb2NrU3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1VbmxvY2tEZWZhdWx0LnN0YXJ0QW5pbWF0aW9ucyh0aGlzKTsKKyAgICAgICAgbVVubG9ja0hhbG8uc3RhcnRBbmltYXRpb25zKHRoaXMpOworICAgICAgICBtVW5sb2NrUmluZy5zdGFydEFuaW1hdGlvbnModGhpcyk7CisgICAgfQorCisgICAgQml0bWFwRHJhd2FibGUgY3JlYXRlRHJhd2FibGUoaW50IHJlc0lkKSB7CisgICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UocmVzLCByZXNJZCk7CisgICAgICAgIHJldHVybiBuZXcgQml0bWFwRHJhd2FibGUocmVzLCBiaXRtYXApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgIHdhdmVVcGRhdGVGcmFtZShtTW91c2VYLCBtTW91c2VZLCBtRmluZ2VyRG93bik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURyYXdhYmxlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgbURyYXdhYmxlcy5nZXQoaSkuZHJhdyhjYW52YXMpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUxpZ2h0V2F2ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIG1MaWdodFdhdmVzLmdldChpKS5kcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1Mb2NrVGltZXJBY3Rpb25zID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJMb2NrVGltZXJBY3Rpb25zIik7CisgICAgICAgICAgICAvLyByZXNldCBsb2NrIGFmdGVyIGluYWN0aXZpdHkKKyAgICAgICAgICAgIGlmIChtTG9ja1N0YXRlID09IFNUQVRFX0FUVEVNUFRJTkcpIHsKKyAgICAgICAgICAgICAgICBtTG9ja1N0YXRlID0gU1RBVEVfUkVTRVRfTE9DSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZvciBwcm90b3R5cGUsIHJlc2V0IGFmdGVyIHN1Y2Nlc3NmdWwgdW5sb2NrCisgICAgICAgICAgICBpZiAobUxvY2tTdGF0ZSA9PSBTVEFURV9VTkxPQ0tfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIG1Mb2NrU3RhdGUgPSBTVEFURV9SRVNFVF9MT0NLOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUFkZFdhdmVBY3Rpb24gPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGRvdWJsZSBkaXN0WCA9IG1Nb3VzZVggLSBtTG9ja0NlbnRlclg7CisgICAgICAgICAgICBkb3VibGUgZGlzdFkgPSBtTW91c2VZIC0gbUxvY2tDZW50ZXJZOworICAgICAgICAgICAgaW50IGRyYWdEaXN0YW5jZSA9IChpbnQpIE1hdGguY2VpbChNYXRoLmh5cG90KGRpc3RYLCBkaXN0WSkpOworICAgICAgICAgICAgaWYgKG1Mb2NrU3RhdGUgPT0gU1RBVEVfQVRURU1QVElORyAmJiBkcmFnRGlzdGFuY2UgPCBtU25hcFJhZGl1cworICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZVRpbWVyRGVsYXkgPj0gbVdhdmVEZWxheSkgeworICAgICAgICAgICAgICAgIG1XYXZlVGltZXJEZWxheSA9IE1hdGgubWluKFdBVkVfRFVSQVRJT04sIG1XYXZlVGltZXJEZWxheSArIERFTEFZX0lOQ1JFTUVOVCk7CisKKyAgICAgICAgICAgICAgICBEcmF3YWJsZUhvbGRlciB3YXZlID0gbUxpZ2h0V2F2ZXMuZ2V0KG1DdXJyZW50V2F2ZSk7CisgICAgICAgICAgICAgICAgd2F2ZS5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgICAgICAgICB3YXZlLnNldFNjYWxlWCgwLjJmKTsKKyAgICAgICAgICAgICAgICB3YXZlLnNldFNjYWxlWSgwLjJmKTsKKyAgICAgICAgICAgICAgICB3YXZlLnNldFgobU1vdXNlWCk7CisgICAgICAgICAgICAgICAgd2F2ZS5zZXRZKG1Nb3VzZVkpOworCisgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh0aGlzWyJsaWdodFdhdmUiK2N1cnJlbnRXYXZlXSwgMiwgeyB4OmxvY2tYICwgeTpsb2NrWSwgYWxwaGE6IDEuNSwKKyAgICAgICAgICAgICAgICAvLyBzY2FsZVg6IDEsIHNjYWxlWToxLCBlYXNlOkN1YmljLmVhc2VPdXR9KTsKKyAgICAgICAgICAgICAgICB3YXZlLmFkZEFuaW1UbyhXQVZFX0RVUkFUSU9OLCAwLCAieCIsIG1Mb2NrQ2VudGVyWCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgd2F2ZS5hZGRBbmltVG8oV0FWRV9EVVJBVElPTiwgMCwgInkiLCBtTG9ja0NlbnRlclksIHRydWUpOworICAgICAgICAgICAgICAgIHdhdmUuYWRkQW5pbVRvKFdBVkVfRFVSQVRJT04qMi8zLCAwLCAiYWxwaGEiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB3YXZlLmFkZEFuaW1UbyhXQVZFX0RVUkFUSU9OLCAwLCAic2NhbGVYIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgd2F2ZS5hZGRBbmltVG8oV0FWRV9EVVJBVElPTiwgMCwgInNjYWxlWSIsIDEuMGYsIHRydWUpOworCisgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh0aGlzWyJsaWdodFdhdmUiK2N1cnJlbnRXYXZlXSwgMSwgeyBkZWxheTogMS4zCisgICAgICAgICAgICAgICAgLy8gLCBhbHBoYTogMCAgLCBlYXNlOlF1aW50LmVhc2VPdXR9KTsKKyAgICAgICAgICAgICAgICB3YXZlLmFkZEFuaW1UbygxMDAwLCBGSU5BTF9ERUxBWSwgImFscGhhIiwgMC4wZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIHdhdmUuc3RhcnRBbmltYXRpb25zKFdhdmVWaWV3LnRoaXMpOworCisgICAgICAgICAgICAgICAgbUN1cnJlbnRXYXZlID0gKG1DdXJyZW50V2F2ZSsxKSAlIG1XYXZlQ291bnQ7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiV2F2ZVRpbWVyRGVsYXk6IHN0YXJ0IG5ldyB3YXZlIGluICIgKyBtV2F2ZVRpbWVyRGVsYXkpOworICAgICAgICAgICAgICAgIHBvc3REZWxheWVkKG1BZGRXYXZlQWN0aW9uLCBtV2F2ZVRpbWVyRGVsYXkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2F2ZVRpbWVyRGVsYXkgKz0gREVMQVlfSU5DUkVNRU5UMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworICAgICAgICBtTW91c2VYID0gZXZlbnQuZ2V0WCgpOworICAgICAgICBtTW91c2VZID0gZXZlbnQuZ2V0WSgpOworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1Mb2NrVGltZXJBY3Rpb25zKTsKKyAgICAgICAgICAgICAgICBtRmluZ2VyRG93biA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLkNFTlRFUl9IQU5ETEUpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCA9IG1Nb3VzZVggLSBtVW5sb2NrSGFsby5nZXRYKCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkgPSBtTW91c2VZIC0gbVVubG9ja0hhbG8uZ2V0WSgpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaXN0ID0gKGZsb2F0KSBNYXRoLmh5cG90KHgsIHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IG1VbmxvY2tIYWxvLmdldFdpZHRoKCkqMC41ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb2NrU3RhdGUgPT0gU1RBVEVfUkVBRFkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9ja1N0YXRlID0gU1RBVEVfU1RBUlRfQVRURU1QVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKKyAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICAgICAgbUZpbmdlckRvd24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwb3N0RGVsYXllZChtTG9ja1RpbWVyQWN0aW9ucywgUkVTRVRfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSk7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKKyAgICAgICAgICAgICAgICBtRmluZ2VyRG93biA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZWQgPyB0cnVlIDogc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VycyBoYXB0aWMgZmVlZGJhY2suCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB2aWJyYXRlKGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgaWYgKG1WaWJyYXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICBtVmlicmF0b3IgPSAoYW5kcm9pZC5vcy5WaWJyYXRvcikKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5WSUJSQVRPUl9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICBtVmlicmF0b3IudmlicmF0ZShkdXJhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSB1c2VyIHRyaWdnZXJzIGFuIGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBPbkRpYWxUcmlnZ2VyTGlzdGVuZXIgdG8gYXR0YWNoIHRvIHRoaXMgdmlldworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uVHJpZ2dlckxpc3RlbmVyKE9uVHJpZ2dlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1PblRyaWdnZXJMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BhdGNoZXMgYSB0cmlnZ2VyIGV2ZW50IHRvIGxpc3RlbmVyLiBJZ25vcmVkIGlmIGEgbGlzdGVuZXIgaXMgbm90IHNldC4KKyAgICAgKiBAcGFyYW0gd2hpY2hIYW5kbGUgdGhlIGhhbmRsZSB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoVHJpZ2dlckV2ZW50KGludCB3aGljaEhhbmRsZSkgeworICAgICAgICB2aWJyYXRlKFZJQlJBVEVfTE9ORyk7CisgICAgICAgIGlmIChtT25UcmlnZ2VyTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9uVHJpZ2dlckxpc3RlbmVyLm9uVHJpZ2dlcih0aGlzLCB3aGljaEhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGdyYWJiZWQgc3RhdGUsIGFuZCBkaXNwYXRjaGVzIGEgZ3JhYmJlZCBzdGF0ZSBjaGFuZ2UKKyAgICAgKiBldmVudCB0byBvdXIgbGlzdGVuZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEdyYWJiZWRTdGF0ZShpbnQgbmV3U3RhdGUpIHsKKyAgICAgICAgaWYgKG5ld1N0YXRlICE9IG1HcmFiYmVkU3RhdGUpIHsKKyAgICAgICAgICAgIG1HcmFiYmVkU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgICAgIGlmIChtT25UcmlnZ2VyTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1PblRyaWdnZXJMaXN0ZW5lci5vbkdyYWJiZWRTdGF0ZUNoYW5nZSh0aGlzLCBtR3JhYmJlZFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25UcmlnZ2VyTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogU2VudCB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzIHRoZSBoYW5kbGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19IQU5ETEUgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZW50IHdoZW4gdGhlIHVzZXIgZ3JhYnMgdGhlIGNlbnRlciBoYW5kbGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlRFUl9IQU5ETEUgPSAxMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgZHJhZ3MgdGhlIGNlbnRlciByaW5nIGJleW9uZCBhIHRocmVzaG9sZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25UcmlnZ2VyKFZpZXcgdiwgaW50IHdoaWNoSGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlICJncmFiYmVkIHN0YXRlIiBjaGFuZ2VzIChpLmUuIHdoZW4gdGhlIHVzZXIgZWl0aGVyIGdyYWJzIG9yIHJlbGVhc2VzCisgICAgICAgICAqIG9uZSBvZiB0aGUgaGFuZGxlcy4pCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2IHRoZSB2aWV3IHRoYXQgd2FzIHRyaWdnZXJlZAorICAgICAgICAgKiBAcGFyYW0gZ3JhYmJlZFN0YXRlIHRoZSBuZXcgc3RhdGU6IHtAbGluayAjTk9fSEFORExFfSwge0BsaW5rICNDRU5URVJfSEFORExFfSwKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25HcmFiYmVkU3RhdGVDaGFuZ2UoVmlldyB2LCBpbnQgZ3JhYmJlZFN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1Mb2NrU3RhdGUgPSBTVEFURV9SRVNFVF9MT0NLOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvV2VpZ2h0ZWRMaW5lYXJMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvV2VpZ2h0ZWRMaW5lYXJMYXlvdXQuamF2YQppbmRleCAzZDA5ZjA4Li4zODVhN2MzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1dlaWdodGVkTGluZWFyTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9XZWlnaHRlZExpbmVhckxheW91dC5qYXZhCkBAIC0zMCw4ICszMCwxMCBAQAogICogdGhlIGF2YWlsYWJsZSBzcGFjZS4KICAqLwogcHVibGljIGNsYXNzIFdlaWdodGVkTGluZWFyTGF5b3V0IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKLSAgICBwcml2YXRlIGZsb2F0IG1NYWpvcldlaWdodDsKLSAgICBwcml2YXRlIGZsb2F0IG1NaW5vcldlaWdodDsKKyAgICBwcml2YXRlIGZsb2F0IG1NYWpvcldlaWdodE1pbjsKKyAgICBwcml2YXRlIGZsb2F0IG1NaW5vcldlaWdodE1pbjsKKyAgICBwcml2YXRlIGZsb2F0IG1NYWpvcldlaWdodE1heDsKKyAgICBwcml2YXRlIGZsb2F0IG1NaW5vcldlaWdodE1heDsKIAogICAgIHB1YmxpYyBXZWlnaHRlZExpbmVhckxheW91dChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCk7CkBAIC00Myw4ICs0NSwxMCBAQAogICAgICAgICBUeXBlZEFycmF5IGEgPSAKICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgc3R5bGVhYmxlLldlaWdodGVkTGluZWFyTGF5b3V0KTsKIAotICAgICAgICBtTWFqb3JXZWlnaHQgPSBhLmdldEZsb2F0KHN0eWxlYWJsZS5XZWlnaHRlZExpbmVhckxheW91dF9tYWpvcldlaWdodCwgMC4wZik7Ci0gICAgICAgIG1NaW5vcldlaWdodCA9IGEuZ2V0RmxvYXQoc3R5bGVhYmxlLldlaWdodGVkTGluZWFyTGF5b3V0X21pbm9yV2VpZ2h0LCAwLjBmKTsKKyAgICAgICAgbU1ham9yV2VpZ2h0TWluID0gYS5nZXRGbG9hdChzdHlsZWFibGUuV2VpZ2h0ZWRMaW5lYXJMYXlvdXRfbWFqb3JXZWlnaHRNaW4sIDAuMGYpOworICAgICAgICBtTWlub3JXZWlnaHRNaW4gPSBhLmdldEZsb2F0KHN0eWxlYWJsZS5XZWlnaHRlZExpbmVhckxheW91dF9taW5vcldlaWdodE1pbiwgMC4wZik7CisgICAgICAgIG1NYWpvcldlaWdodE1heCA9IGEuZ2V0RmxvYXQoc3R5bGVhYmxlLldlaWdodGVkTGluZWFyTGF5b3V0X21ham9yV2VpZ2h0TWF4LCAwLjBmKTsKKyAgICAgICAgbU1pbm9yV2VpZ2h0TWF4ID0gYS5nZXRGbG9hdChzdHlsZWFibGUuV2VpZ2h0ZWRMaW5lYXJMYXlvdXRfbWlub3JXZWlnaHRNYXgsIDAuMGYpOwogICAgICAgICAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQpAQCAtNjAsMTcgKzY0LDIwIEBACiAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CiAKICAgICAgICAgaW50IHdpZHRoID0gZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0TWVhc3VyZWRIZWlnaHQoKTsKICAgICAgICAgYm9vbGVhbiBtZWFzdXJlID0gZmFsc2U7CiAKICAgICAgICAgd2lkdGhNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyh3aWR0aCwgRVhBQ1RMWSk7Ci0gICAgICAgIGhlaWdodE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgRVhBQ1RMWSk7CiAKLSAgICAgICAgZmluYWwgZmxvYXQgd2lkdGhXZWlnaHQgPSBpc1BvcnRyYWl0ID8gbU1pbm9yV2VpZ2h0IDogbU1ham9yV2VpZ2h0OwotICAgICAgICBpZiAod2lkdGhNb2RlID09IEFUX01PU1QgJiYgd2lkdGhXZWlnaHQgPiAwLjBmKSB7Ci0gICAgICAgICAgICBpZiAod2lkdGggPCAoc2NyZWVuV2lkdGggKiB3aWR0aFdlaWdodCkpIHsKLSAgICAgICAgICAgICAgICB3aWR0aE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKChpbnQpIChzY3JlZW5XaWR0aCAqIHdpZHRoV2VpZ2h0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVYQUNUTFkpOworICAgICAgICBmaW5hbCBmbG9hdCB3aWR0aFdlaWdodE1pbiA9IGlzUG9ydHJhaXQgPyBtTWlub3JXZWlnaHRNaW4gOiBtTWFqb3JXZWlnaHRNaW47CisgICAgICAgIGZpbmFsIGZsb2F0IHdpZHRoV2VpZ2h0TWF4ID0gaXNQb3J0cmFpdCA/IG1NaW5vcldlaWdodE1heCA6IG1NYWpvcldlaWdodE1heDsKKyAgICAgICAgaWYgKHdpZHRoTW9kZSA9PSBBVF9NT1NUKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2VpZ2h0ZWRNaW4gPSAoaW50KSAoc2NyZWVuV2lkdGggKiB3aWR0aFdlaWdodE1pbik7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2VpZ2h0ZWRNYXggPSAoaW50KSAoc2NyZWVuV2lkdGggKiB3aWR0aFdlaWdodE1pbik7CisgICAgICAgICAgICBpZiAod2lkdGhXZWlnaHRNaW4gPiAwLjBmICYmIHdpZHRoIDwgd2VpZ2h0ZWRNaW4pIHsKKyAgICAgICAgICAgICAgICB3aWR0aE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKHdlaWdodGVkTWluLCBFWEFDVExZKTsKKyAgICAgICAgICAgICAgICBtZWFzdXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGhXZWlnaHRNYXggPiAwLjBmICYmIHdpZHRoID4gd2VpZ2h0ZWRNYXgpIHsKKyAgICAgICAgICAgICAgICB3aWR0aE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKHdlaWdodGVkTWF4LCBFWEFDVExZKTsKICAgICAgICAgICAgICAgICBtZWFzdXJlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzgsNyArODUsNyBAQAogICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IGhlaWdodD8KIAogICAgICAgICBpZiAobWVhc3VyZSkgewotICAgICAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkLm1rIGIvY29yZS9qbmkvQW5kcm9pZC5tawppbmRleCBkNTFjMGI3Li42NGEyMzMxIDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkLm1rCisrKyBiL2NvcmUvam5pL0FuZHJvaWQubWsKQEAgLTE5LDEyICsxOSwxNSBAQAogICBMT0NBTF9DRkxBR1MgKz0gLURDVVNUT01fUlVOVElNRV9IRUFQX01BWD0kKFVTRV9DVVNUT01fUlVOVElNRV9IRUFQX01BWCkKIGVuZGlmCiAKK2lmZXEgKCQoVVNFX09QRU5HTF9SRU5ERVJFUiksdHJ1ZSkKKwlMT0NBTF9DRkxBR1MgKz0gLURVU0VfT1BFTkdMX1JFTkRFUkVSCitlbmRpZgorCiBMT0NBTF9DRkxBR1MgKz0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlBY3Rpdml0eU1hbmFnZXIuY3BwIFwKIAlBbmRyb2lkUnVudGltZS5jcHAgXAotCUN1cnNvcldpbmRvdy5jcHAgXAogCVRpbWUuY3BwIFwKIAljb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfRUdMSW1wbC5jcHAgXAogCWNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwLmFybSBcCkBAIC00OCw2ICs1MSw3IEBACiAJYW5kcm9pZF92aWV3X0lucHV0Q2hhbm5lbC5jcHAgXAogCWFuZHJvaWRfdmlld19JbnB1dFF1ZXVlLmNwcCBcCiAJYW5kcm9pZF92aWV3X0tleUV2ZW50LmNwcCBcCisJYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAgXAogCWFuZHJvaWRfdmlld19Nb3Rpb25FdmVudC5jcHAgXAogCWFuZHJvaWRfdGV4dF9BbmRyb2lkQ2hhcmFjdGVyLmNwcCBcCiAJYW5kcm9pZF90ZXh0X0FuZHJvaWRCaWRpLmNwcCBcCkBAIC0xMDEsOSArMTA1LDExIEBACiAJYW5kcm9pZF9ncmFwaGljc19QaXhlbEZvcm1hdC5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUGljdHVyZS5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5jcHAgXAorCWFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2Rlci5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUmFzdGVyaXplci5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwIFwKKwlhbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9VdGlscy5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuY3BwIFwKQEAgLTEyMyw3ICsxMjksNiBAQAogCWFuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAgXAogCWFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aEF1ZGlvR2F0ZXdheS5jcHAgXAogCWFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aFNvY2tldC5jcHAgXAotCWFuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAgXAogCWFuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwIFwKIAlhbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwIFwKIAlhbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhBMmRwU2VydmljZS5jcHAgXApAQCAtMTQyLDYgKzE0Nyw3IEBACiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAkkKExPQ0FMX1BBVEgpL2FuZHJvaWQvZ3JhcGhpY3MgXAorCSQoTE9DQUxfUEFUSCkvLi4vLi4vbGlicy9od3VpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmx1ZWRyb2lkKSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGxpYmhhcmR3YXJlKS9oYXJkd2FyZSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGxpYmhhcmR3YXJlX2xlZ2FjeSkvaGFyZHdhcmVfbGVnYWN5IFwKQEAgLTE5Miw2ICsxOTgsMTAgQEAKIAlsaWJ3cGFfY2xpZW50IFwKIAlsaWJqcGVnCiAKK2lmZXEgKCQoVVNFX09QRU5HTF9SRU5ERVJFUiksdHJ1ZSkKKwlMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmh3dWkKK2VuZGlmCisKIGlmZXEgKCQoQk9BUkRfSEFWRV9ORkMpLHRydWUpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKIAlsaWJuZmNfam5pIFwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcCBiL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcAppbmRleCA1ZjczNDQzLi5hNGExYTcwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKKysrIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCkBAIC01Myw2ICs1Myw3IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfb3NfUHJvY2VzcyhKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQml0bWFwKEpOSUVudiopOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0JpdG1hcEZhY3RvcnkoSk5JRW52Kik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQml0bWFwUmVnaW9uRGVjb2RlcihKTklFbnYqKTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19DYW1lcmEoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0dyYXBoaWNzKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19JbnRlcnBvbGF0b3IoSk5JRW52KiBlbnYpOwpAQCAtMTE0LDYgKzExNSw3IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfUGl4ZWxGb3JtYXQoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9jb21fYW5kcm9pZF9pbnRlcm5hbF9ncmFwaGljc19OYXRpdmVVdGlscyhKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19EaXNwbGF5KEpOSUVudiogZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyhKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19TdXJmYWNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3coSk5JRW52KiBlbnYpOwpAQCAtMTUwLDcgKzE1Miw2IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0hlYWRzZXRCYXNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQXVkaW9HYXRld2F5KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0KEpOSUVudiAqZW52KTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0KEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcChKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEEyZHBTZXJ2aWNlKEpOSUVudiogZW52KTsKQEAgLTEyMDcsNiArMTIwOCw3IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX25pb191dGlscyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpeGVsRm9ybWF0KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfR3JhcGhpY3MpLAorICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfU3VyZmFjZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwpLApAQCAtMTIxOSw2ICsxMjIxLDcgQEAKIAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19CaXRtYXApLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19CaXRtYXBGYWN0b3J5KSwKKyAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQml0bWFwUmVnaW9uRGVjb2RlciksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0NhbWVyYSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0NhbnZhcyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0NvbG9yRmlsdGVyKSwKQEAgLTEyNzcsNyArMTI4MCw2IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9IZWFkc2V0QmFzZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhBdWRpb0dhdGV3YXkpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0KSwKLSAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhBMmRwU2VydmljZSksCmRpZmYgLS1naXQgYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwIGIvY29yZS9qbmkvQ3Vyc29yV2luZG93LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3NzkyMS4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yV2luZG93IgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8Sk5JSGVscC5oPgotCi0jaW5jbHVkZSAiQ3Vyc29yV2luZG93LmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1DdXJzb3JXaW5kb3c6OkN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSkgOgotICAgIG1NYXhTaXplKG1heFNpemUpCi17Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93OjpzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbW9yeSkKLXsKLSAgICBtTWVtb3J5ID0gbWVtb3J5OwotICAgIG1EYXRhID0gKHVpbnQ4X3QgKikgbWVtb3J5LT5wb2ludGVyKCk7Ci0gICAgaWYgKG1EYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBtSGVhZGVyID0gKHdpbmRvd19oZWFkZXJfdCAqKSBtRGF0YTsKLQotICAgIC8vIE1ha2UgdGhlIHdpbmRvdyByZWFkLW9ubHkKLSAgICBzc2l6ZV90IHNpemUgPSBtZW1vcnktPnNpemUoKTsKLSAgICBtU2l6ZSA9IHNpemU7Ci0gICAgbU1heFNpemUgPSBzaXplOwotICAgIG1GcmVlT2Zmc2V0ID0gc2l6ZTsKLUxPR19XSU5ET1coIkNyZWF0ZWQgQ3Vyc29yV2luZG93IGZyb20gZXhpc3RpbmcgSU1lbW9yeTogbUZyZWVPZmZzZXQgPSAlZCwgbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQsIG1TaXplID0gJWQsIG1NYXhTaXplID0gJWQsIG1EYXRhID0gJXAiLCBtRnJlZU9mZnNldCwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucywgbVNpemUsIG1NYXhTaXplLCBtRGF0YSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93Ojppbml0QnVmZmVyKGJvb2wgbG9jYWxPbmx5KQotewotICAgIC8vVE9ETyBVc2UgYSBub24tbWVtb3J5IGRlYWxlciBtbWFwIHJlZ2lvbiBmb3IgbG9jYWxPbmx5Ci0KLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcDsKLSAgICBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKG1NYXhTaXplLCAwLCAiQ3Vyc29yV2luZG93Iik7Ci0gICAgaWYgKGhlYXAgIT0gTlVMTCkgewotICAgICAgICBtTWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMCwgbU1heFNpemUpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopIG1NZW1vcnktPnBvaW50ZXIoKTsKLSAgICAgICAgICAgIGlmIChtRGF0YSkgewotICAgICAgICAgICAgICAgIG1IZWFkZXIgPSAod2luZG93X2hlYWRlcl90ICopIG1EYXRhOwotICAgICAgICAgICAgICAgIG1TaXplID0gbU1heFNpemU7Ci0KLSAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIHdpbmRvdyBpbnRvIGEgY2xlYW4gc3RhdGUKLSAgICAgICAgICAgICAgICBjbGVhcigpOwotICAgICAgICAgICAgTE9HX1dJTkRPVygiQ3JlYXRlZCBDdXJzb3JXaW5kb3cgd2l0aCBuZXcgTWVtb3J5RGVhbGVyOiBtRnJlZU9mZnNldCA9ICVkLCBtU2l6ZSA9ICVkLCBtTWF4U2l6ZSA9ICVkLCBtRGF0YSA9ICVwIiwgbUZyZWVPZmZzZXQsIG1TaXplLCBtTWF4U2l6ZSwgbURhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgTE9HRSgiQ3Vyc29yV2luZG93IGhlYXAgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0UoImZhaWxlZCB0byBjcmVhdGUgdGhlIEN1cnNvcldpbmRvdyBoZWFwIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLUN1cnNvcldpbmRvdzo6fkN1cnNvcldpbmRvdygpCi17Ci0gICAgLy8gRXZlcnl0aGluZyB0aGF0IG1hdHRlcnMgaXMgYSBzbWFydCBwb2ludGVyCi19Ci0KLXZvaWQgQ3Vyc29yV2luZG93OjpjbGVhcigpCi17Ci0gICAgbUhlYWRlci0+bnVtUm93cyA9IDA7Ci0gICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IDA7Ci0gICAgbUZyZWVPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkU7Ci0gICAgLy8gTWFyayB0aGUgZmlyc3QgY2h1bmsncyBuZXh0ICdwb2ludGVyJyBhcyBudWxsCi0gICAgKigodWludDMyX3QgKikobURhdGEgKyBtRnJlZU9mZnNldCAtIHNpemVvZih1aW50MzJfdCkpKSA9IDA7Ci19Ci0KLWludDMyX3QgQ3Vyc29yV2luZG93OjpmcmVlU3BhY2UoKQotewotICAgIGludDMyX3QgZnJlZVNwYWNlID0gbVNpemUgLSBtRnJlZU9mZnNldDsKLSAgICBpZiAoZnJlZVNwYWNlIDwgMCkgewotICAgICAgICBmcmVlU3BhY2UgPSAwOwotICAgIH0KLSAgICByZXR1cm4gZnJlZVNwYWNlOwotfQotCi1maWVsZF9zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmFsbG9jUm93KCkKLXsKLSAgICAvLyBGaWxsIGluIHRoZSByb3cgc2xvdAotICAgIHJvd19zbG90X3QgKiByb3dTbG90ID0gYWxsb2NSb3dTbG90KCk7Ci0gICAgaWYgKHJvd1Nsb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBBbGxvY2F0ZSB0aGUgc2xvdHMgZm9yIHRoZSBmaWVsZCBkaXJlY3RvcnkKLSAgICBzaXplX3QgZmllbGREaXJTaXplID0gbUhlYWRlci0+bnVtQ29sdW1ucyAqIHNpemVvZihmaWVsZF9zbG90X3QpOwotICAgIHVpbnQzMl90IGZpZWxkRGlyT2Zmc2V0ID0gYWxsb2MoZmllbGREaXJTaXplKTsKLSAgICBpZiAoIWZpZWxkRGlyT2Zmc2V0KSB7Ci0gICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKLSAgICAgICAgTE9HRSgiVGhlIHJvdyBmYWlsZWQsIHNvIGJhY2sgb3V0IHRoZSBuZXcgcm93IGFjY291bnRpbmcgZnJvbSBhbGxvY1Jvd1Nsb3QgJWQiLCBtSGVhZGVyLT5udW1Sb3dzKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KTsKLSAgICBtZW1zZXQoZmllbGREaXIsIDB4MCwgZmllbGREaXJTaXplKTsKLQotTE9HX1dJTkRPVygiQWxsb2NhdGVkIHJvdyAldSwgcm93U2xvdCBpcyBhdCBvZmZzZXQgJXUsIGZpZWxkRGlyIGlzICVkIGJ5dGVzIGF0IG9mZnNldCAldVxuIiwgKG1IZWFkZXItPm51bVJvd3MgLSAxKSwgKCh1aW50OF90ICopcm93U2xvdCkgLSBtRGF0YSwgZmllbGREaXJTaXplLCBmaWVsZERpck9mZnNldCk7Ci0gICAgcm93U2xvdC0+b2Zmc2V0ID0gZmllbGREaXJPZmZzZXQ7Ci0KLSAgICByZXR1cm4gZmllbGREaXI7Ci19Ci0KLXVpbnQzMl90IEN1cnNvcldpbmRvdzo6YWxsb2Moc2l6ZV90IHJlcXVlc3RlZFNpemUsIGJvb2wgYWxpZ25lZCkKLXsKLSAgICBpbnQzMl90IHNpemU7Ci0gICAgdWludDMyX3QgcGFkZGluZzsKLSAgICBpZiAoYWxpZ25lZCkgewotICAgICAgICAvLyA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIHBhZGRpbmcgPSA0IC0gKG1GcmVlT2Zmc2V0ICYgMHgzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwYWRkaW5nID0gMDsKLSAgICB9Ci0KLSAgICBzaXplID0gcmVxdWVzdGVkU2l6ZSArIHBhZGRpbmc7Ci0KLSAgICBpZiAoc2l6ZSA+IGZyZWVTcGFjZSgpKSB7Ci0gICAgICAgIExPR0UoIm5lZWQgdG8gZ3JvdzogbVNpemUgPSAlZCwgc2l6ZSA9ICVkLCBmcmVlU3BhY2UoKSA9ICVkLCBudW1Sb3dzID0gJWQiLCBtU2l6ZSwgc2l6ZSwgZnJlZVNwYWNlKCksIG1IZWFkZXItPm51bVJvd3MpOwotICAgICAgICAvLyBPbmx5IGdyb3cgdGhlIHdpbmRvdyBpZiB0aGUgZmlyc3Qgcm93IGRvZXNuJ3QgZml0Ci0gICAgICAgIGlmIChtSGVhZGVyLT5udW1Sb3dzID4gMSkgewotTE9HRSgibm90IGdyb3dpbmcgc2luY2UgdGhlcmUgYXJlIGFscmVhZHkgJWQgcm93KHMpLCBtYXggc2l6ZSAlZCIsIG1IZWFkZXItPm51bVJvd3MsIG1NYXhTaXplKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluZCBhIG5ldyBzaXplIHRoYXQgd2lsbCBmaXQgdGhlIGFsbG9jYXRpb24KLSAgICAgICAgaW50IGFsbG9jYXRlZCA9IG1TaXplIC0gZnJlZVNwYWNlKCk7Ci0gICAgICAgIGludCBuZXdTaXplID0gbVNpemUgKyBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOwotICAgICAgICB3aGlsZSAoc2l6ZSA+IChuZXdTaXplIC0gYWxsb2NhdGVkKSkgewotICAgICAgICAgICAgbmV3U2l6ZSArPSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOwotICAgICAgICAgICAgaWYgKG5ld1NpemUgPiBtTWF4U2l6ZSkgewotICAgICAgICAgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gZ3JvdyB3aW5kb3cgYmV5b25kIG1heCBzaXplICglZCkiLCBtTWF4U2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLUxPR19XSU5ET1coImZvdW5kIHNpemUgJWQiLCBuZXdTaXplKTsKLSAgICAgICAgbVNpemUgPSBuZXdTaXplOwotICAgIH0KLQotICAgIHVpbnQzMl90IG9mZnNldCA9IG1GcmVlT2Zmc2V0ICsgcGFkZGluZzsKLSAgICBtRnJlZU9mZnNldCArPSBzaXplOwotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLXJvd19zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmdldFJvd1Nsb3QoaW50IHJvdykKLXsKLSAgICBMT0dfV0lORE9XKCJlbnRlciBnZXRSb3dTbG90IGN1cnJlbnQgcm93IG51bSAlZCwgdGhpcyByb3cgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCByb3cpOwotICAgIGludCBjaHVua051bSA9IHJvdyAvIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOwotICAgIGludCBjaHVua1BvcyA9IHJvdyAlIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOwotICAgIGludCBjaHVua1B0ck9mZnNldCA9IHNpemVvZih3aW5kb3dfaGVhZGVyX3QpICsgUk9XX1NMT1RfQ0hVTktfU0laRSAtIHNpemVvZih1aW50MzJfdCk7Ci0gICAgdWludDhfdCAqIHJvd0NodW5rID0gbURhdGEgKyBzaXplb2Yod2luZG93X2hlYWRlcl90KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKLSAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cigqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkpOwotICAgICAgICBjaHVua1B0ck9mZnNldCA9IHJvd0NodW5rIC0gbURhdGEgKyAoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpOwotICAgIH0KLSAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKLSAgICBMT0dfV0lORE9XKCJleGl0IGdldFJvd1Nsb3QgY3VycmVudCByb3cgbnVtICVkLCB0aGlzIHJvdyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIHJvdyk7ICAgIAotfQotCi1yb3dfc2xvdF90ICogQ3Vyc29yV2luZG93OjphbGxvY1Jvd1Nsb3QoKQotewotICAgIGludCBjaHVua051bSA9IG1IZWFkZXItPm51bVJvd3MgLyBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKLSAgICBpbnQgY2h1bmtQb3MgPSBtSGVhZGVyLT5udW1Sb3dzICUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7Ci0gICAgaW50IGNodW5rUHRyT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICB1aW50OF90ICogcm93Q2h1bmsgPSBtRGF0YSArIHNpemVvZih3aW5kb3dfaGVhZGVyX3QpOwotTE9HX1dJTkRPVygiQWxsb2NhdGluZyByb3cgc2xvdCwgbUhlYWRlci0+bnVtUm93cyBpcyAlZCwgY2h1bmtOdW0gaXMgJWQsIGNodW5rUG9zIGlzICVkIiwgbUhlYWRlci0+bnVtUm93cywgY2h1bmtOdW0sIGNodW5rUG9zKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKLSAgICAgICAgdWludDMyX3QgbmV4dENodW5rT2Zmc2V0ID0gKigodWludDMyX3QgKikobURhdGEgKyBjaHVua1B0ck9mZnNldCkpOwotTE9HX1dJTkRPVygibmV4dENodW5rT2Zmc2V0IGlzICVkIiwgbmV4dENodW5rT2Zmc2V0KTsKLSAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyByb3cgY2h1bmsKLSAgICAgICAgICAgIG5leHRDaHVua09mZnNldCA9IGFsbG9jKFJPV19TTE9UX0NIVU5LX1NJWkUsIHRydWUpOwotICAgICAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKG5leHRDaHVua09mZnNldCk7Ci1MT0dfV0lORE9XKCJhbGxvY2F0ZWQgbmV3IGNodW5rIGF0ICVkLCByb3dDaHVuayA9ICVwIiwgbmV4dENodW5rT2Zmc2V0LCByb3dDaHVuayk7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkgPSByb3dDaHVuayAtIG1EYXRhOwotICAgICAgICAgICAgLy8gTWFyayB0aGUgbmV3IGNodW5rJ3MgbmV4dCAncG9pbnRlcicgYXMgbnVsbAotICAgICAgICAgICAgKigodWludDMyX3QgKikocm93Q2h1bmsgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KSkpID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLUxPR19XSU5ET1coImZvbGx3aW5nICdwb2ludGVyJyB0byBuZXh0IGNodW5rLCBvZmZzZXQgb2YgbmV4dCBwb2ludGVyIGlzICVkIiwgY2h1bmtQdHJPZmZzZXQpOwotICAgICAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cihuZXh0Q2h1bmtPZmZzZXQpOwotICAgICAgICAgICAgY2h1bmtQdHJPZmZzZXQgPSByb3dDaHVuayAtIG1EYXRhICsgKFJPV19TTE9UX0NIVU5LX05VTV9ST1dTICogc2l6ZW9mKHJvd19zbG90X3QpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSGVhZGVyLT5udW1Sb3dzKys7Ci0KLSAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKLX0KLQotZmllbGRfc2xvdF90ICogQ3Vyc29yV2luZG93OjpnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbikKLXsKLSAgaWYgKHJvdyA8IDAgfHwgcm93ID49IG1IZWFkZXItPm51bVJvd3MgfHwgY29sdW1uIDwgMCB8fCBjb2x1bW4gPj0gbUhlYWRlci0+bnVtQ29sdW1ucykgewotICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0gICAgICAgIAotICByb3dfc2xvdF90ICogcm93U2xvdCA9IGdldFJvd1Nsb3Qocm93KTsKLSAgaWYgKCFyb3dTbG90KSB7Ci0gICAgICBMT0dFKCJGYWlsZWQgdG8gZmluZCByb3dTbG90IGZvciByb3cgJWQiLCByb3cpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgewotICAgICAgTE9HRSgiSW52YWxpZCByb3dTbG90LCBvZmZzZXQgPSAlZCIsIHJvd1Nsb3QtPm9mZnNldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfSAgCi0gIGludCBmaWVsZERpck9mZnNldCA9IHJvd1Nsb3QtPm9mZnNldDsKLSAgcmV0dXJuICgoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIoZmllbGREaXJPZmZzZXQpKSArIGNvbHVtbjsgIAotfQotCi11aW50MzJfdCBDdXJzb3JXaW5kb3c6OnJlYWRfZmllbGRfc2xvdChpbnQgcm93LCBpbnQgY29sdW1uLCBmaWVsZF9zbG90X3QgKiBzbG90T3V0KQotewotICAgIGlmIChyb3cgPCAwIHx8IHJvdyA+PSBtSGVhZGVyLT5udW1Sb3dzIHx8IGNvbHVtbiA8IDAgfHwgY29sdW1uID49IG1IZWFkZXItPm51bUNvbHVtbnMpIHsKLSAgICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSAgICAgICAgCi0gICAgcm93X3Nsb3RfdCAqIHJvd1Nsb3QgPSBnZXRSb3dTbG90KHJvdyk7Ci0gICAgaWYgKCFyb3dTbG90KSB7Ci0gICAgICAgIExPR0UoIkZhaWxlZCB0byBmaW5kIHJvd1Nsb3QgZm9yIHJvdyAlZCIsIHJvdyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgewotICAgICAgICBMT0dFKCJJbnZhbGlkIHJvd1Nsb3QsIG9mZnNldCA9ICVkIiwgcm93U2xvdC0+b2Zmc2V0KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLUxPR19XSU5ET1coIkZvdW5kIGZpZWxkIGRpcmVjdG9yeSBmb3IgJWQsJWQgYXQgcm93U2xvdCAlZCwgb2Zmc2V0ICVkIiwgcm93LCBjb2x1bW4sICh1aW50OF90ICopcm93U2xvdCAtIG1EYXRhLCByb3dTbG90LT5vZmZzZXQpOwotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKHJvd1Nsb3QtPm9mZnNldCk7Ci1MT0dfV0lORE9XKCJSZWFkIGZpZWxkX3Nsb3RfdCAlZCwlZDogb2Zmc2V0ID0gJWQsIHNpemUgPSAlZCwgdHlwZSA9ICVkIiwgcm93LCBjb2x1bW4sIGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIub2Zmc2V0LCBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLnNpemUsIGZpZWxkRGlyW2NvbHVtbl0udHlwZSk7Ci0KLSAgICAvLyBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXQgcGFyYW0KLSAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLm9mZnNldDsKLSAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5zaXplID0gZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5zaXplOwotICAgIHNsb3RPdXQtPnR5cGUgPSBmaWVsZERpcltjb2x1bW5dLnR5cGU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpCi17Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gbVNpemUpOyAgICAKLSAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsIGRhdGEsIHNpemUpOwotfQotCi12b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKQotewotICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoaW50NjRfdCkgPD0gbVNpemUpOwotICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgKHVpbnQ4X3QgKikmZGF0YSwgc2l6ZW9mKGludDY0X3QpKTsKLX0KLQotdm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKQotewotICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoZG91YmxlKSA8PSBtU2l6ZSk7Ci0gICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCAodWludDhfdCAqKSZkYXRhLCBzaXplb2YoZG91YmxlKSk7Ci19Ci0KLXZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5T3V0KHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqIGRhdGEsIHNpemVfdCBzaXplKQotewotICAgIGFzc2VydChvZmZzZXQgKyBzaXplIDw9IG1TaXplKTsKLSAgICBtZW1jcHkoZGF0YSwgbURhdGEgKyBvZmZzZXQsIHNpemUpOwotfQotCi1pbnQ2NF90IEN1cnNvcldpbmRvdzo6Y29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KQotewotICAgIGludDY0X3QgdmFsdWU7Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihpbnQ2NF90KSA8PSBtU2l6ZSk7Ci0gICAgbWVtY3B5KCZ2YWx1ZSwgbURhdGEgKyBvZmZzZXQsIHNpemVvZihpbnQ2NF90KSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1kb3VibGUgQ3Vyc29yV2luZG93Ojpjb3B5T3V0RG91YmxlKHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBkb3VibGUgdmFsdWU7Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihkb3VibGUpIDw9IG1TaXplKTsKLSAgICBtZW1jcHkoJnZhbHVlLCBtRGF0YSArIG9mZnNldCwgc2l6ZW9mKGRvdWJsZSkpOwotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OnB1dExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCB2YWx1ZSkKLXsKLSAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOwotICAgIGlmICghZmllbGRTbG90KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKLSAgICBmaWVsZFNsb3QtPmRhdGEubCA9IHZhbHVlOwotI2Vsc2UKLSAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKLSAgICBpZiAoIW9mZnNldCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29weUluKG9mZnNldCwgdmFsdWUpOwotCi0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGludDY0X3QpOwotI2VuZGlmCi0gICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9JTlRFR0VSOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6cHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOwotICAgIGlmICghZmllbGRTbG90KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKLSAgICBmaWVsZFNsb3QtPmRhdGEuZCA9IHZhbHVlOwotI2Vsc2UKLSAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKLSAgICBpZiAoIW9mZnNldCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29weUluKG9mZnNldCwgdmFsdWUpOwotCi0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGRvdWJsZSk7Ci0jZW5kaWYKLSAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0ZMT0FUOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6cHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfTlVMTDsKLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IDA7Ci0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmdldExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCAqIHZhbHVlT3V0KQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QgfHwgZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfSU5URUdFUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUwotICAgICp2YWx1ZU91dCA9IGZpZWxkU2xvdC0+ZGF0YS5sOwotI2Vsc2UKLSAgICAqdmFsdWVPdXQgPSBjb3B5T3V0TG9uZyhmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmdldERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgKiB2YWx1ZU91dCkKLXsKLSAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOwotICAgIGlmICghZmllbGRTbG90IHx8IGZpZWxkU2xvdC0+dHlwZSAhPSBGSUVMRF9UWVBFX0ZMT0FUKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKLSAgICAqdmFsdWVPdXQgPSBmaWVsZFNsb3QtPmRhdGEuZDsKLSNlbHNlCi0gICAgKnZhbHVlT3V0ID0gY29weU91dERvdWJsZShmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfTlVMTCkgewotICAgICAgICAqdmFsdWVPdXQgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICAqdmFsdWVPdXQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5oIGIvY29yZS9qbmkvQ3Vyc29yV2luZG93LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmY2I1NjAuLjAwMDAwMDAKLS0tIGEvY29yZS9qbmkvQ3Vyc29yV2luZG93LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKLSNkZWZpbmUgX0FORFJPSURfX0RBVEFCQVNFX1dJTkRPV19ICi0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPGpuaS5oPgotCi0jZGVmaW5lIERFRkFVTFRfV0lORE9XX1NJWkUgNDA5NgotI2RlZmluZSBNQVhfV0lORE9XX1NJWkUgKDEwMjQgKiAxMDI0KQotI2RlZmluZSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFIDQwOTYKLQotI2RlZmluZSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAxNgotCi0vLyBSb3cgc2xvdHMgYXJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MsCi0vLyB3aXRoIGFuIG9mZnNldCBhZnRlciB0aGUgcm93cyB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCBjaHVuawotI2RlZmluZSBST1dfU0xPVF9DSFVOS19TSVpFICgoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpICsgc2l6ZW9mKHVpbnQzMl90KSkKLQotCi0jaWYgTE9HX05ERUJVRwotCi0jZGVmaW5lIElGX0xPR19XSU5ET1coKSBpZiAoZmFsc2UpCi0jZGVmaW5lIExPR19XSU5ET1coLi4uKQotCi0jZWxzZQotCi0jZGVmaW5lIElGX0xPR19XSU5ET1coKSBJRl9MT0coTE9HX0RFQlVHLCAiQ3Vyc29yV2luZG93IikKLSNkZWZpbmUgTE9HX1dJTkRPVyguLi4pIExPRyhMT0dfREVCVUcsICJDdXJzb3JXaW5kb3ciLCBfX1ZBX0FSR1NfXykKLQotI2VuZGlmCi0KLQotLy8gV2hlbiBkZWZpbmVkIHRvIHRydWUgc3RyaW5ncyBhcmUgc3RvcmVkIGFzIFVURjgsIG90aGVyd2lzZSB0aGV5J3JlIFVURjE2Ci0jZGVmaW5lIFdJTkRPV19TVE9SQUdFX1VURjggMQotCi0vLyBXaGVuIGRlZmluZWQgdG8gdHJ1ZSBudW1iZXJpYyB2YWx1ZXMgYXJlIHN0b3JlZCBpbmxpbmUgaW4gdGhlIGZpZWxkX3Nsb3RfdCwgb3RoZXJ3aXNlIHRoZXkncmUgYWxsb2NhdGVkIGluIHRoZSB3aW5kb3cKLSNkZWZpbmUgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTIDEKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVpbnQzMl90IG51bVJvd3M7Ci0gICAgdWludDMyX3QgbnVtQ29sdW1uczsKLX0gd2luZG93X2hlYWRlcl90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVpbnQzMl90IG9mZnNldDsKLX0gcm93X3Nsb3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1aW50OF90IHR5cGU7Ci0gICAgdW5pb24gewotICAgICAgICBkb3VibGUgZDsKLSAgICAgICAgaW50NjRfdCBsOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0OwotICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKLSAgICAgICAgfSBidWZmZXI7Ci0gICAgfSBkYXRhOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBmaWVsZF9zbG90X3Q7Ci0KLSNkZWZpbmUgRklFTERfVFlQRV9JTlRFR0VSIDEKLSNkZWZpbmUgRklFTERfVFlQRV9GTE9BVCAyCi0jZGVmaW5lIEZJRUxEX1RZUEVfU1RSSU5HIDMKLSNkZWZpbmUgRklFTERfVFlQRV9CTE9CIDQKLSNkZWZpbmUgRklFTERfVFlQRV9OVUxMIDUKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyBhIHNldCBvZiByb3dzIGZyb20gYSBkYXRhYmFzZSBpbiBhIGJ1ZmZlci4gVGhlIGJlZ2luaW5nIG9mIHRoZQotICogd2luZG93IGhhcyBmaXJzdCBjaHVuayBvZiByb3dfc2xvdF90cywgd2hpY2ggYXJlIG9mZnNldHMgdG8gdGhlIHJvdyBkaXJlY3RvcnksIGZvbGxvd2VkIGJ5Ci0gKiBhbiBvZmZzZXQgdG8gdGhlIG5leHQgY2h1bmsgaW4gYSBsaW5rZWQtbGlzdCBvZiBhZGRpdGlvbmFsIGNodW5rIG9mIHJvd19zbG90X3RzIGluIGNhc2UKLSAqIHRoZSBwcmUtYWxsb2NhdGVkIGNodW5rIGlzbid0IGJpZyBlbm91Z2ggdG8gcmVmZXIgdG8gYWxsIHJvd3MuIEVhY2ggcm93IGRpcmVjdG9yeSBoYXMgYQotICogZmllbGRfc2xvdF90IHBlciBjb2x1bW4sIHdoaWNoIGhhcyB0aGUgc2l6ZSwgb2Zmc2V0LCBhbmQgdHlwZSBvZiB0aGUgZGF0YSBmb3IgdGhhdCBmaWVsZC4KLSAqIE5vdGUgdGhhdCB0aGUgZGF0YSB0eXBlcyBjb21lIGZyb20gc3FsaXRlMy5oLgotICovCi1jbGFzcyBDdXJzb3JXaW5kb3cKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDdXJzb3JXaW5kb3coKXt9Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH5DdXJzb3JXaW5kb3coKTsKLQotICAgIGJvb2wgICAgICAgICAgICAgICAgaW5pdEJ1ZmZlcihib29sIGxvY2FsT25seSk7Ci0gICAgc3A8SU1lbW9yeT4gICAgICAgICBnZXRNZW1vcnkoKSB7cmV0dXJuIG1NZW1vcnk7fQotCi0gICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplKCkge3JldHVybiBtU2l6ZTt9Ci0gICAgdWludDhfdCAqICAgICAgICAgICBkYXRhKCkge3JldHVybiBtRGF0YTt9Ci0gICAgdWludDMyX3QgICAgICAgICAgICBnZXROdW1Sb3dzKCkge3JldHVybiBtSGVhZGVyLT5udW1Sb3dzO30KLSAgICB1aW50MzJfdCAgICAgICAgICAgIGdldE51bUNvbHVtbnMoKSB7cmV0dXJuIG1IZWFkZXItPm51bUNvbHVtbnM7fQotICAgIHZvaWQgICAgICAgICAgICAgICAgZnJlZUxhc3RSb3coKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkZXItPm51bVJvd3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBzZXROdW1Db2x1bW5zKHVpbnQzMl90IG51bUNvbHVtbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXIgPSBtSGVhZGVyLT5udW1Db2x1bW5zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID4gMCAmJiBjdXIgIT0gbnVtQ29sdW1ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiVHJ5aW5nIHRvIGdvIGZyb20gJWQgY29sdW1ucyB0byAlZCIsIGN1ciwgbnVtQ29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgIGludDMyX3QgICAgICAgICAgICAgZnJlZVNwYWNlKCk7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgIGNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYSByb3cgc2xvdCBhbmQgaXRzIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIHJvdydzIGRpcmVjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgTlVMTCBpZiB0aGVyZSB3YXNuJ3Qgcm9vbS4gVGhlIGRpcmVjdG9yeSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICogaW5pdGlhbGllZCB3aXRoIE5VTEwgZW50cmllcyBmb3IgZWFjaCBmaWVsZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZpZWxkX3Nsb3RfdCAqICAgICAgYWxsb2NSb3coKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHBvcnRpb24gb2YgdGhlIHdpbmRvdy4gUmV0dXJucyB0aGUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgYWxsb2NhdGlvbiwgb3IgMCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBhbGlnbmVkIGlzIHRydWUsIHRoZSBhbGxvY2F0aW9uIGdldHMgNCBieXRlIGFsaWdubWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHVpbnQzMl90ICAgICAgICAgICAgYWxsb2Moc2l6ZV90IHNpemUsIGJvb2wgYWxpZ25lZCA9IGZhbHNlKTsKLQotICAgIHVpbnQzMl90ICAgICAgICAgICAgcmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIENvcHkgZGF0YSBpbnRvIHRoZSB3aW5kb3cgYXQgdGhlIGdpdmVuIG9mZnNldC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgdWludDhfdCBjb25zdCAqIGRhdGEsIHNpemVfdCBzaXplKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGludDY0X3QgZGF0YSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBkb3VibGUgZGF0YSk7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIGludDY0X3QgICAgICAgICAgICAgY29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KTsKLSAgICBkb3VibGUgICAgICAgICAgICAgIGNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KTsKLQotICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKTsKLSAgICBib29sICAgICAgICAgICAgICAgIHB1dERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgdmFsdWUpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKTsKLQotICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KTsKLSAgICBib29sICAgICAgICAgICAgICAgIGdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KTsKLQotICAgIHVpbnQ4X3QgKiAgICAgICAgICAgb2Zmc2V0VG9QdHIodWludDMyX3Qgb2Zmc2V0KSB7cmV0dXJuIG1EYXRhICsgb2Zmc2V0O30KLQotICAgIHJvd19zbG90X3QgKiAgICAgICAgYWxsb2NSb3dTbG90KCk7Ci0KLSAgICByb3dfc2xvdF90ICogICAgICAgIGdldFJvd1Nsb3QoaW50IHJvdyk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMIGlmIEZhaWxlZCB0byBmaW5kIHJvd1Nsb3Qgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEludmFsaWQgcm93U2xvdAotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbik7Ci0gICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3QoaW50IHJvdywgaW50IGNvbHVtbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZERpck9mZnNldCA9IGdldFJvd1Nsb3Qocm93KS0+b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCkpICsgY29sdW1uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotcHJpdmF0ZToKLSAgICB1aW50OF90ICogbURhdGE7Ci0gICAgc2l6ZV90IG1TaXplOwotICAgIHNpemVfdCBtTWF4U2l6ZTsKLSAgICB3aW5kb3dfaGVhZGVyX3QgKiBtSGVhZGVyOwotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0KLSAgICAvKioKLSAgICAgKiBPZmZzZXQgb2YgdGhlIGxvd2VzdCB1bnVzZWQgZGF0YSBieXRlIGluIHRoZSBhcnJheS4KLSAgICAgKi8KLSAgICB1aW50MzJfdCBtRnJlZU9mZnNldDsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwCmluZGV4IDg4YmJhZmQuLjg4MGZiNmUgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAKQEAgLTEyLDYgKzEyLDggQEAKIA0KICNpbmNsdWRlIDxqbmkuaD4NCiANCisjaW5jbHVkZSA8Q2FjaGVzLmg+DQorDQogI2lmIDANCiAgICAgI2RlZmluZSBUUkFDRV9CSVRNQVAoY29kZSkgIGNvZGUNCiAjZWxzZQ0KQEAgLTI1MSw2ICsyNTMsMTEgQEAKIH0NCiANCiBzdGF0aWMgdm9pZCBCaXRtYXBfZGVzdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCwgU2tCaXRtYXAqIGJpdG1hcCkgew0KKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSDQorICAgIGlmIChhbmRyb2lkOjp1aXJlbmRlcmVyOjpDYWNoZXM6Omhhc0luc3RhbmNlKCkpIHsNCisgICAgICAgIGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6Z2V0SW5zdGFuY2UoKS50ZXh0dXJlQ2FjaGUucmVtb3ZlKGJpdG1hcCk7DQorICAgIH0NCisjZW5kaWYNCiAgICAgZGVsZXRlIGJpdG1hcDsNCiB9DQogDQpAQCAtMzEzLDYgKzMyMCwxMCBAQAogICAgIHJldHVybiBiaXRtYXAtPmNvbmZpZygpOw0KIH0NCiANCitzdGF0aWMgaW50IEJpdG1hcF9nZXRHZW5lcmF0aW9uSWQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCisgICAgcmV0dXJuIGJpdG1hcC0+Z2V0R2VuZXJhdGlvbklEKCk7DQorfQ0KKw0KIHN0YXRpYyBqYm9vbGVhbiBCaXRtYXBfaGFzQWxwaGEoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCiAgICAgcmV0dXJuICFiaXRtYXAtPmlzT3BhcXVlKCk7DQogfQ0KQEAgLTYwNiw2ICs2MTcsNyBAQAogICAgICAgICAodm9pZCopQml0bWFwX3dyaXRlVG9QYXJjZWwgfSwNCiAgICAgeyAgICJuYXRpdmVFeHRyYWN0QWxwaGEiLCAgICAgICAiKElJW0kpTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOyIsDQogICAgICAgICAodm9pZCopQml0bWFwX2V4dHJhY3RBbHBoYSB9LA0KKyAgICB7ICAgIm5hdGl2ZUdlbmVyYXRpb25JZCIsICAgICAgICIoSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRHZW5lcmF0aW9uSWQgfSwNCiAgICAgeyAgICJuYXRpdmVHZXRQaXhlbCIsICAgICAgICAgICAiKElJSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRQaXhlbCB9LA0KICAgICB7ICAgIm5hdGl2ZUdldFBpeGVscyIsICAgICAgICAgICIoSVtJSUlJSUlJKVYiLCAodm9pZCopQml0bWFwX2dldFBpeGVscyB9LA0KICAgICB7ICAgIm5hdGl2ZVNldFBpeGVsIiwgICAgICAgICAgICIoSUlJSSlWIiwgKHZvaWQqKUJpdG1hcF9zZXRQaXhlbCB9LA0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2Rlci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDA3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXIuY3BwCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCaXRtYXBSZWdpb25EZWNvZGVyIgorCisjaW5jbHVkZSAiU2tCaXRtYXAuaCIKKyNpbmNsdWRlICJTa0ltYWdlRW5jb2Rlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzSk5JLmgiCisjaW5jbHVkZSAiU2tVdGlscy5oIgorI2luY2x1ZGUgIlNrVGVtcGxhdGVzLmgiCisjaW5jbHVkZSAiU2tQaXhlbFJlZi5oIgorI2luY2x1ZGUgIlNrU3RyZWFtLmgiCisjaW5jbHVkZSAiQml0bWFwRmFjdG9yeS5oIgorI2luY2x1ZGUgIkF1dG9EZWNvZGVDYW5jZWwuaCIKKyNpbmNsdWRlICJTa0JpdG1hcFJlZ2lvbkRlY29kZXIuaCIKKyNpbmNsdWRlICJDcmVhdGVKYXZhT3V0cHV0U3RyZWFtQWRhcHRvci5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9uaW9fdXRpbHMuaCIKKyNpbmNsdWRlICJDcmVhdGVKYXZhT3V0cHV0U3RyZWFtQWRhcHRvci5oIgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHV0aWxzL0Fzc2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworc3RhdGljIGpjbGFzcyBnRmlsZURlc2NyaXB0b3JfY2xhc3M7CitzdGF0aWMgamZpZWxkSUQgZ0ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3I7CisKKyNpZiAwCisgICAgI2RlZmluZSBUUkFDRV9CSVRNQVAoY29kZSkgIGNvZGUKKyNlbHNlCisgICAgI2RlZmluZSBUUkFDRV9CSVRNQVAoY29kZSkKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIFNrTWVtb3J5U3RyZWFtKiBidWlsZFNrTWVtb3J5U3RyZWFtKFNrU3RyZWFtICpzdHJlYW0pIHsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDQwOTY7CisgICAgc2l6ZV90IHN0cmVhbUxlbiA9IDA7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyKiBkYXRhID0gKGNoYXIqKXNrX21hbGxvY190aHJvdyhidWZmZXJTaXplKTsKKworICAgIHdoaWxlICgobGVuID0gc3RyZWFtLT5yZWFkKGRhdGEgKyBzdHJlYW1MZW4sCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgLSBzdHJlYW1MZW4pKSAhPSAwKSB7CisgICAgICAgIHN0cmVhbUxlbiArPSBsZW47CisgICAgICAgIGlmIChzdHJlYW1MZW4gPT0gYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgYnVmZmVyU2l6ZSAqPSAyOworICAgICAgICAgICAgZGF0YSA9IChjaGFyKilza19yZWFsbG9jX3Rocm93KGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgfQorICAgIGRhdGEgPSAoY2hhciopc2tfcmVhbGxvY190aHJvdyhkYXRhLCBzdHJlYW1MZW4pOworICAgIFNrTWVtb3J5U3RyZWFtKiBzdHJlYW1NZW0gPSBuZXcgU2tNZW1vcnlTdHJlYW0oKTsKKyAgICBzdHJlYW1NZW0tPnNldE1lbW9yeU93bmVkKGRhdGEsIHN0cmVhbUxlbik7CisgICAgcmV0dXJuIHN0cmVhbU1lbTsKK30KKworc3RhdGljIGpvYmplY3QgZG9CdWlsZFRpbGVJbmRleChKTklFbnYqIGVudiwgU2tTdHJlYW0qIHN0cmVhbSkgeworICAgIFNrSW1hZ2VEZWNvZGVyKiBkZWNvZGVyID0gU2tJbWFnZURlY29kZXI6OkZhY3Rvcnkoc3RyZWFtKTsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoTlVMTCA9PSBkZWNvZGVyKSB7CisgICAgICAgIGRvVGhyb3dJT0UoZW52LCAiSW1hZ2UgZm9ybWF0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxPYmplY3RSZXR1cm4oIlNrSW1hZ2VEZWNvZGVyOjpGYWN0b3J5IHJldHVybmVkIG51bGwiKTsKKyAgICB9CisKKyAgICBKYXZhUGl4ZWxBbGxvY2F0b3IgKmphdmFBbGxvY2F0b3IgPSBuZXcgSmF2YVBpeGVsQWxsb2NhdG9yKGVudiwgdHJ1ZSk7CisgICAgZGVjb2Rlci0+c2V0QWxsb2NhdG9yKGphdmFBbGxvY2F0b3IpOworICAgIEphdmFNZW1vcnlVc2FnZVJlcG9ydGVyICpqYXZhTWVtb3J5UmVwb3J0ZXIgPSBuZXcgSmF2YU1lbW9yeVVzYWdlUmVwb3J0ZXIoZW52KTsKKyAgICBkZWNvZGVyLT5zZXRSZXBvcnRlcihqYXZhTWVtb3J5UmVwb3J0ZXIpOworICAgIGphdmFBbGxvY2F0b3ItPnVucmVmKCk7CisgICAgamF2YU1lbW9yeVJlcG9ydGVyLT51bnJlZigpOworCisgICAgaWYgKCFkZWNvZGVyLT5idWlsZFRpbGVJbmRleChzdHJlYW0sICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICAgICAgY2hhciBtc2dbMTAwXTsKKyAgICAgICAgc25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIkltYWdlIGZhaWxlZCB0byBkZWNvZGUgdXNpbmcgJXMgZGVjb2RlciIsCisgICAgICAgICAgICAgICAgZGVjb2Rlci0+Z2V0Rm9ybWF0TmFtZSgpKTsKKyAgICAgICAgZG9UaHJvd0lPRShlbnYsIG1zZyk7CisgICAgICAgIHJldHVybiBudWxsT2JqZWN0UmV0dXJuKCJkZWNvZGVyLT5idWlsZFRpbGVJbmRleCByZXR1cm5lZCBmYWxzZSIpOworICAgIH0KKworICAgIFNrQml0bWFwUmVnaW9uRGVjb2RlciAqYm0gPSBuZXcgU2tCaXRtYXBSZWdpb25EZWNvZGVyKGRlY29kZXIsIHdpZHRoLCBoZWlnaHQpOworCisgICAgcmV0dXJuIEdyYXBoaWNzSk5JOjpjcmVhdGVCaXRtYXBSZWdpb25EZWNvZGVyKGVudiwgYm0pOworfQorCitzdGF0aWMgam9iamVjdCBuYXRpdmVOZXdJbnN0YW5jZUZyb21CeXRlQXJyYXkoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpieXRlQXJyYXkgYnl0ZUFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGpib29sZWFuIGlzU2hhcmVhYmxlKSB7CisgICAgLyogIElmIGlzU2hhcmVhYmxlIHdlIGNvdWxkIGRlY2lkZSB0byBqdXN0IHdyYXAgdGhlIGphdmEgYXJyYXkgYW5kCisgICAgICAgIHNoYXJlIGl0LCBidXQgdGhhdCBtZWFucyBhZGRpbmcgYSBnbG9iYWxyZWYgdG8gdGhlIGphdmEgYXJyYXkgb2JqZWN0CisgICAgICAgIEZvciBub3cgd2UganVzdCBhbHdheXMgY29weSB0aGUgYXJyYXkncyBkYXRhIGlmIGlzU2hhcmVhYmxlLgorICAgICAqLworICAgIEF1dG9KYXZhQnl0ZUFycmF5IGFyKGVudiwgYnl0ZUFycmF5KTsKKyAgICBTa1N0cmVhbSogc3RyZWFtID0gbmV3IFNrTWVtb3J5U3RyZWFtKGFyLnB0cigpICsgb2Zmc2V0LCBsZW5ndGgsIHRydWUpOworICAgIHJldHVybiBkb0J1aWxkVGlsZUluZGV4KGVudiwgc3RyZWFtKTsKK30KKworc3RhdGljIGpvYmplY3QgbmF0aXZlTmV3SW5zdGFuY2VGcm9tRmlsZURlc2NyaXB0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yLCBqYm9vbGVhbiBpc1NoYXJlYWJsZSkgeworICAgIE5QRV9DSEVDS19SRVRVUk5fWkVSTyhlbnYsIGZpbGVEZXNjcmlwdG9yKTsKKworICAgIGppbnQgZGVzY3JpcHRvciA9IGVudi0+R2V0SW50RmllbGQoZmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvcik7CisgICAgU2tTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgICAgc3RydWN0IHN0YXQgZmRTdGF0OworICAgIGludCBuZXdGRDsKKyAgICBpZiAoZnN0YXQoZGVzY3JpcHRvciwgJmZkU3RhdCkgPT0gLTEpIHsKKyAgICAgICAgZG9UaHJvd0lPRShlbnYsICJicm9rZW4gZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybiBudWxsT2JqZWN0UmV0dXJuKCJmc3RhdCByZXR1cm4gLTEiKTsKKyAgICB9CisKKyAgICBpZiAoaXNTaGFyZWFibGUgJiYKKyAgICAgICAgICAgIFNfSVNSRUcoZmRTdGF0LnN0X21vZGUpICYmCisgICAgICAgICAgICAobmV3RkQgPSA6OmR1cChkZXNjcmlwdG9yKSkgIT0gLTEpIHsKKyAgICAgICAgU2tGRFN0cmVhbSogZmRTdHJlYW0gPSBuZXcgU2tGRFN0cmVhbShuZXdGRCwgdHJ1ZSk7CisgICAgICAgIGlmICghZmRTdHJlYW0tPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgZmRTdHJlYW0tPnVucmVmKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW0gPSBmZFN0cmVhbTsKKyAgICB9IGVsc2UgeworICAgICAgICBTa0ZEU3RyZWFtKiBmZFN0cmVhbSA9IG5ldyBTa0ZEU3RyZWFtKGRlc2NyaXB0b3IsIGZhbHNlKTsKKyAgICAgICAgaWYgKCFmZFN0cmVhbS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBmZFN0cmVhbS0+dW5yZWYoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0cmVhbSA9IGJ1aWxkU2tNZW1vcnlTdHJlYW0oZmRTdHJlYW0pOworICAgICAgICBmZFN0cmVhbS0+dW5yZWYoKTsKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIG91ciBvZmZzZXQgd2hlbiB3ZSBsZWF2ZSwgc28gd2UgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQorICAgICAgIHdpdGggdGhlIHNhbWUgZGVzY3JpcHRvci4gVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGlmIHdlIGRpZG4ndCBkdXAgdGhlCisgICAgICAgZmlsZSBkZXNjcmlwdG9yLCBidXQgaXQgaXMgT0sgdG8gZG8gaXQgYWxsIHRoZSB0aW1lLgorICAgICovCisgICAgQXV0b0ZEU2VlayBhcyhkZXNjcmlwdG9yKTsKKworICAgIHJldHVybiBkb0J1aWxkVGlsZUluZGV4KGVudiwgc3RyZWFtKTsKK30KKworc3RhdGljIGpvYmplY3QgbmF0aXZlTmV3SW5zdGFuY2VGcm9tU3RyZWFtKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgaXMsICAgICAgIC8vIElucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBzdG9yYWdlLCAvLyBieXRlW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBpc1NoYXJlYWJsZSkgeworICAgIGpvYmplY3QgbGFyZ2VCaXRtYXAgPSBOVUxMOworICAgIFNrU3RyZWFtKiBzdHJlYW0gPSBDcmVhdGVKYXZhSW5wdXRTdHJlYW1BZGFwdG9yKGVudiwgaXMsIHN0b3JhZ2UsIDEwMjQpOworCisgICAgaWYgKHN0cmVhbSkgeworICAgICAgICAvLyBmb3Igbm93IHdlIGRvbid0IGFsbG93IHNoYXJlYWJsZSB3aXRoIGphdmEgaW5wdXRzdHJlYW1zCisgICAgICAgIFNrTWVtb3J5U3RyZWFtICptU3RyZWFtID0gYnVpbGRTa01lbW9yeVN0cmVhbShzdHJlYW0pOworICAgICAgICBsYXJnZUJpdG1hcCA9IGRvQnVpbGRUaWxlSW5kZXgoZW52LCBtU3RyZWFtKTsKKyAgICAgICAgc3RyZWFtLT51bnJlZigpOworICAgIH0KKyAgICByZXR1cm4gbGFyZ2VCaXRtYXA7Cit9CisKK3N0YXRpYyBqb2JqZWN0IG5hdGl2ZU5ld0luc3RhbmNlRnJvbUFzc2V0KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBuYXRpdmVfYXNzZXQsIC8vIEFzc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBpc1NoYXJlYWJsZSkgeworICAgIFNrU3RyZWFtKiBzdHJlYW0sICphc3NTdHJlYW07CisgICAgQXNzZXQqIGFzc2V0ID0gcmVpbnRlcnByZXRfY2FzdDxBc3NldCo+KG5hdGl2ZV9hc3NldCk7CisgICAgYXNzU3RyZWFtID0gbmV3IEFzc2V0U3RyZWFtQWRhcHRvcihhc3NldCk7CisgICAgc3RyZWFtID0gYnVpbGRTa01lbW9yeVN0cmVhbShhc3NTdHJlYW0pOworICAgIGFzc1N0cmVhbS0+dW5yZWYoKTsKKyAgICByZXR1cm4gZG9CdWlsZFRpbGVJbmRleChlbnYsIHN0cmVhbSk7Cit9CisKKy8qCisgKiBuaW5lIHBhdGNoIG5vdCBzdXBwb3J0ZWQKKyAqCisgKiBwdXJnZWFibGUgbm90IHN1cHBvcnRlZAorICogcmVwb3J0U2l6ZVRvVk0gbm90IHN1cHBvcnRlZAorICovCitzdGF0aWMgam9iamVjdCBuYXRpdmVEZWNvZGVSZWdpb24oSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwUmVnaW9uRGVjb2RlciAqYnJkLAorICAgICAgICBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwgam9iamVjdCBvcHRpb25zKSB7CisgICAgU2tJbWFnZURlY29kZXIgKmRlY29kZXIgPSBicmQtPmdldERlY29kZXIoKTsKKyAgICBpbnQgc2FtcGxlU2l6ZSA9IDE7CisgICAgU2tCaXRtYXA6OkNvbmZpZyBwcmVmQ29uZmlnID0gU2tCaXRtYXA6OmtOb19Db25maWc7CisgICAgYm9vbCBkb0RpdGhlciA9IHRydWU7CisKKyAgICBpZiAoTlVMTCAhPSBvcHRpb25zKSB7CisgICAgICAgIHNhbXBsZVNpemUgPSBlbnYtPkdldEludEZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX3NhbXBsZVNpemVGaWVsZElEKTsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGVzZSwgaW4gY2FzZSB3ZSBmYWlsIGxhdGVyIG9uCisgICAgICAgIGVudi0+U2V0SW50RmllbGQob3B0aW9ucywgZ09wdGlvbnNfd2lkdGhGaWVsZElELCAtMSk7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQob3B0aW9ucywgZ09wdGlvbnNfaGVpZ2h0RmllbGRJRCwgLTEpOworICAgICAgICBlbnYtPlNldE9iamVjdEZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX21pbWVGaWVsZElELCAwKTsKKworICAgICAgICBqb2JqZWN0IGpjb25maWcgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX2NvbmZpZ0ZpZWxkSUQpOworICAgICAgICBwcmVmQ29uZmlnID0gR3JhcGhpY3NKTkk6OmdldE5hdGl2ZUJpdG1hcENvbmZpZyhlbnYsIGpjb25maWcpOworICAgICAgICBkb0RpdGhlciA9IGVudi0+R2V0Qm9vbGVhbkZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX2RpdGhlckZpZWxkSUQpOworICAgIH0KKworICAgIGRlY29kZXItPnNldERpdGhlckltYWdlKGRvRGl0aGVyKTsKKyAgICBTa0JpdG1hcCogICAgICAgICAgIGJpdG1hcCA9IG5ldyBTa0JpdG1hcDsKKyAgICBTa0F1dG9URGVsZXRlPFNrQml0bWFwPiAgICAgICBhZGIoYml0bWFwKTsKKyAgICBBdXRvRGVjb2RlckNhbmNlbCAgIGFkYyhvcHRpb25zLCBkZWNvZGVyKTsKKworICAgIC8vIFRvIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gaW4gY2FzZSAicmVxdWVzdENhbmNlbERlY29kZSIKKyAgICAvLyBoYXBwZW5zIGVhcmxpZXIgdGhhbiBBdXRvRGVjb2RlckNhbmNlbCBvYmplY3QgaXMgYWRkZWQKKyAgICAvLyB0byB0aGUgZ0F1dG9EZWNvZGVyQ2FuY2VsTXV0ZXggbGlua2VkIGxpc3QuCisgICAgaWYgKE5VTEwgIT0gb3B0aW9ucyAmJiBlbnYtPkdldEJvb2xlYW5GaWVsZChvcHRpb25zLCBnT3B0aW9uc19tQ2FuY2VsSUQpKSB7CisgICAgICAgIHJldHVybiBudWxsT2JqZWN0UmV0dXJuKCJnT3B0aW9uc19tQ2FuY2VsSUQiKTs7CisgICAgfQorCisgICAgU2tJUmVjdCByZWdpb247CisgICAgcmVnaW9uLmZMZWZ0ID0gc3RhcnRfeDsKKyAgICByZWdpb24uZlRvcCA9IHN0YXJ0X3k7CisgICAgcmVnaW9uLmZSaWdodCA9IHN0YXJ0X3ggKyB3aWR0aDsKKyAgICByZWdpb24uZkJvdHRvbSA9IHN0YXJ0X3kgKyBoZWlnaHQ7CisKKyAgICBpZiAoIWJyZC0+ZGVjb2RlUmVnaW9uKGJpdG1hcCwgcmVnaW9uLCBwcmVmQ29uZmlnLCBzYW1wbGVTaXplKSkgeworICAgICAgICByZXR1cm4gbnVsbE9iamVjdFJldHVybigiZGVjb2Rlci0+ZGVjb2RlUmVnaW9uIHJldHVybmVkIGZhbHNlIik7CisgICAgfQorCisgICAgLy8gdXBkYXRlIG9wdGlvbnMgKGlmIGFueSkKKyAgICBpZiAoTlVMTCAhPSBvcHRpb25zKSB7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQob3B0aW9ucywgZ09wdGlvbnNfd2lkdGhGaWVsZElELCBiaXRtYXAtPndpZHRoKCkpOworICAgICAgICBlbnYtPlNldEludEZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX2hlaWdodEZpZWxkSUQsIGJpdG1hcC0+aGVpZ2h0KCkpOworICAgICAgICAvLyBUT0RPOiBzZXQgdGhlIG1pbWVUeXBlIGZpZWxkIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgY29kZWMuCisgICAgICAgIC8vIGJ1dCBob3cgdG8gcmV1c2UgYSBzZXQgb2Ygc3RyaW5ncywgcmF0aGVyIHRoYW4gYWxsb2NhdGluZyBuZXcgb25lCisgICAgICAgIC8vIGVhY2ggdGltZT8KKyAgICAgICAgZW52LT5TZXRPYmplY3RGaWVsZChvcHRpb25zLCBnT3B0aW9uc19taW1lRmllbGRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNaW1lVHlwZVN0cmluZyhlbnYsIGRlY29kZXItPmdldEZvcm1hdCgpKSk7CisgICAgfQorCisgICAgLy8gZGV0YWNoIGJpdG1hcCBmcm9tIGl0cyBhdXRvdGRlbGV0ZXIsIHNpbmNlIHdlIHdhbnQgdG8gb3duIGl0IG5vdworICAgIGFkYi5kZXRhY2goKTsKKworICAgIFNrUGl4ZWxSZWYqIHByOworICAgIHByID0gYml0bWFwLT5waXhlbFJlZigpOworICAgIC8vIHByb21pc2Ugd2Ugd2lsbCBuZXZlciBjaGFuZ2Ugb3VyIHBpeGVscyAoZ3JlYXQgZm9yIHNoYXJpbmcgYW5kIHBpY3R1cmVzKQorICAgIHByLT5zZXRJbW11dGFibGUoKTsKKyAgICAvLyBub3cgY3JlYXRlIHRoZSBqYXZhIGJpdG1hcAorICAgIHJldHVybiBHcmFwaGljc0pOSTo6Y3JlYXRlQml0bWFwKGVudiwgYml0bWFwLCBmYWxzZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgbmF0aXZlR2V0SGVpZ2h0KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0JpdG1hcFJlZ2lvbkRlY29kZXIgKmJyZCkgeworICAgIHJldHVybiBicmQtPmdldEhlaWdodCgpOworfQorCitzdGF0aWMgaW50IG5hdGl2ZUdldFdpZHRoKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0JpdG1hcFJlZ2lvbkRlY29kZXIgKmJyZCkgeworICAgIHJldHVybiBicmQtPmdldFdpZHRoKCk7Cit9CisKK3N0YXRpYyB2b2lkIG5hdGl2ZUNsZWFuKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0JpdG1hcFJlZ2lvbkRlY29kZXIgKmJyZCkgeworICAgIGRlbGV0ZSBicmQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdCaXRtYXBSZWdpb25EZWNvZGVyTWV0aG9kc1tdID0geworICAgIHsgICAibmF0aXZlRGVjb2RlUmVnaW9uIiwKKyAgICAgICAgIihJSUlJSUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkkT3B0aW9uczspTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOyIsCisgICAgICAgICh2b2lkKiluYXRpdmVEZWNvZGVSZWdpb259LAorCisgICAgeyAgICJuYXRpdmVHZXRIZWlnaHQiLCAiKEkpSSIsICh2b2lkKiluYXRpdmVHZXRIZWlnaHR9LAorCisgICAgeyAgICJuYXRpdmVHZXRXaWR0aCIsICIoSSlJIiwgKHZvaWQqKW5hdGl2ZUdldFdpZHRofSwKKworICAgIHsgICAibmF0aXZlQ2xlYW4iLCAiKEkpViIsICh2b2lkKiluYXRpdmVDbGVhbn0sCisKKyAgICB7ICAgIm5hdGl2ZU5ld0luc3RhbmNlIiwKKyAgICAgICAgIihbQklJWilMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBSZWdpb25EZWNvZGVyOyIsCisgICAgICAgICh2b2lkKiluYXRpdmVOZXdJbnN0YW5jZUZyb21CeXRlQXJyYXkKKyAgICB9LAorCisgICAgeyAgICJuYXRpdmVOZXdJbnN0YW5jZSIsCisgICAgICAgICIoTGphdmEvaW8vSW5wdXRTdHJlYW07W0JaKUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXI7IiwKKyAgICAgICAgKHZvaWQqKW5hdGl2ZU5ld0luc3RhbmNlRnJvbVN0cmVhbQorICAgIH0sCisKKyAgICB7ICAgIm5hdGl2ZU5ld0luc3RhbmNlIiwKKyAgICAgICAgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtaKUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXI7IiwKKyAgICAgICAgKHZvaWQqKW5hdGl2ZU5ld0luc3RhbmNlRnJvbUZpbGVEZXNjcmlwdG9yCisgICAgfSwKKworICAgIHsgICAibmF0aXZlTmV3SW5zdGFuY2UiLAorICAgICAgICAiKElaKUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXI7IiwKKyAgICAgICAgKHZvaWQqKW5hdGl2ZU5ld0luc3RhbmNlRnJvbUFzc2V0CisgICAgfSwKK307CisKKyNkZWZpbmUga0NsYXNzUGF0aE5hbWUgICJhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXIiCisKK3N0YXRpYyBqY2xhc3MgbWFrZV9nbG9iYWxyZWYoSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIgY2xhc3NuYW1lW10pIHsKKyAgICBqY2xhc3MgYyA9IGVudi0+RmluZENsYXNzKGNsYXNzbmFtZSk7CisgICAgU2tBU1NFUlQoYyk7CisgICAgcmV0dXJuIChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoYyk7Cit9CisKK3N0YXRpYyBqZmllbGRJRCBnZXRGaWVsZElEQ2hlY2soSk5JRW52KiBlbnYsIGpjbGFzcyBjbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBmaWVsZG5hbWVbXSwgY29uc3QgY2hhciB0eXBlW10pIHsKKyAgICBqZmllbGRJRCBpZCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgZmllbGRuYW1lLCB0eXBlKTsKKyAgICBTa0FTU0VSVChpZCk7CisgICAgcmV0dXJuIGlkOworfQorCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19CaXRtYXBSZWdpb25EZWNvZGVyKEpOSUVudiogZW52KTsKK2ludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0JpdG1hcFJlZ2lvbkRlY29kZXIoSk5JRW52KiBlbnYpCit7CisKKyAgICBnRmlsZURlc2NyaXB0b3JfY2xhc3MgPSBtYWtlX2dsb2JhbHJlZihlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CisgICAgZ0ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3IgPSBnZXRGaWVsZElEQ2hlY2soZW52LCBnRmlsZURlc2NyaXB0b3JfY2xhc3MsICJkZXNjcmlwdG9yIiwgIkkiKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6QW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGtDbGFzc1BhdGhOYW1lLAorICAgICAgICAgICAgZ0JpdG1hcFJlZ2lvbkRlY29kZXJNZXRob2RzLCBTS19BUlJBWV9DT1VOVChnQml0bWFwUmVnaW9uRGVjb2Rlck1ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAppbmRleCBlMWU5NTM2Li5iZjE1MGE5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlICJTa0NhbnZhcy5oIgogI2luY2x1ZGUgIlNrRGV2aWNlLmgiCi0jaW5jbHVkZSAiU2tHTENhbnZhcy5oIgogI2luY2x1ZGUgIlNrR3JhcGhpY3MuaCIKICNpbmNsdWRlICJTa0ltYWdlUmVmX0dsb2JhbFBvb2wuaCIKICNpbmNsdWRlICJTa1BvcnRlckR1ZmYuaCIKQEAgLTMwLDYgKzI5LDEzIEBACiAjaW5jbHVkZSAiU2tCb3VuZGFyeVBhdGNoLmgiCiAjaW5jbHVkZSAiU2tNZXNoVXRpbHMuaCIKIAorI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworI2luY2x1ZGUgInVuaWNvZGUvdWJpZGkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNkZWZpbmUgVElNRV9EUkFXeAogCiBzdGF0aWMgdWludDMyX3QgZ2V0X3RocmVhZF9tc2VjKCkgewpAQCAtNjAsMTMgKzY2LDggQEAKICAgICAgICAgcmV0dXJuIGJpdG1hcCA/IG5ldyBTa0NhbnZhcygqYml0bWFwKSA6IG5ldyBTa0NhbnZhczsKICAgICB9CiAgICAgCi0gICAgc3RhdGljIFNrQ2FudmFzKiBpbml0R0woSk5JRW52KiBlbnYsIGpvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTa0dMQ2FudmFzOwotICAgIH0KLSAgICAKICAgICBzdGF0aWMgdm9pZCBmcmVlQ2FjaGVzKEpOSUVudiogZW52LCBqb2JqZWN0KSB7CiAgICAgICAgIC8vIHRoZXNlIGFyZSBjYWxsZWQgaW4gbm8gcGFydGljdWxhciBvcmRlcgotICAgICAgICBTa0dMQ2FudmFzOjpEZWxldGVBbGxUZXh0dXJlcygpOwogICAgICAgICBTa0ltYWdlUmVmX0dsb2JhbFBvb2w6OlNldFJBTVVzZWQoMCk7CiAgICAgICAgIFNrR3JhcGhpY3M6OlNldEZvbnRDYWNoZVVzZWQoMCk7CiAgICAgfQpAQCAtMTAzLDExICsxMDQsNiBAQAogICAgICAgICByZXR1cm4gY2FudmFzLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKS5oZWlnaHQoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBzZXRWaWV3cG9ydChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgY2FudmFzLT5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0gICAgCiAgICAgc3RhdGljIHZvaWQgc2V0Qml0bWFwKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTa0JpdG1hcCogYml0bWFwKSB7CiAgICAgICAgIGNhbnZhcy0+c2V0Qml0bWFwRGV2aWNlKCpiaXRtYXApOwpAQCAtNzQzLDQ1ICs3MzksNDkgQEAKICAgICAgICAgY2FudmFzLT5kcmF3VmVydGljZXMobW9kZSwgcHRDb3VudCwgdmVydHMsIHRleHMsIGNvbG9ycywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcywgaW5kZXhDb3VudCwgKnBhaW50KTsKICAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX19DSUlGRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAorCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fX0NJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAganNpemUgdGV4dENvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aCh0ZXh0KTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHRleHRBcnJheSArIGluZGV4LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgMCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CiAgICAgfQotIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7Ci0gICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KChjb25zdCB1aW50MTZfdCopdGV4dF8gKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgKGNvbnN0IGpjaGFyKikgdGV4dF8pOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX1N0cmluZ0lJRkZJUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBkcmF3U3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywganN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBqb2JqZWN0IHBhaW50KSB7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGNhbnZhcyk7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIHBhaW50KTsKLSAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgdGV4dCk7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpOwotICAgICAgICBpZiAoMCA9PSBjb3VudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0XyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIFNrQ2FudmFzKiBjID0gR3JhcGhpY3NKTkk6OmdldE5hdGl2ZUNhbnZhcyhlbnYsIGNhbnZhcyk7Ci0gICAgICAgIGMtPmRyYXdUZXh0KHRleHRfLCBjb3VudCA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwKLSAgICAgICAgICAgICAgICAgICAgKkdyYXBoaWNzSk5JOjpnZXROYXRpdmVQYWludChlbnYsIHBhaW50KSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRfKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludCgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LAorICAgICAgICBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLCBTa1BhaW50KiBwYWludCkgeworCisgICAgICAgIGpjaGFyKiBjaGFycyA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0UnVuKHBhaW50LCBjaGFycyArIGNvbnRleHRJbmRleCwgaW5kZXggLSBjb250ZXh0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIGRpckZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjaGFycywgSk5JX0FCT1JUKTsKICAgICB9Ci0gICAgCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fU3RyaW5nSUlJSUZGSVBhaW50KAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCBvYmosIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwgamludCBzdGFydCwKKyAgICAgICAgamludCBlbmQsIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRFbmQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgamludCBkaXJGbGFncywgU2tQYWludCogcGFpbnQpIHsKKworICAgICAgICBqaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGppbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY29uc3QgamNoYXIqIGNoYXJzID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRSdW4ocGFpbnQsIGNoYXJzICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgZGlyRmxhZ3MsIHgsIHksIGNhbnZhcyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIGNoYXJzKTsKKyAgICB9CisKICAgICBzdGF0aWMgdm9pZCBkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IHBvcywgU2tQYWludCogcGFpbnQpIHsKQEAgLTgwNCwxMCArODA0LDExIEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdQb3NUZXh0X19TdHJpbmdfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CiAgICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gdGV4dCA/IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCkgOiBOVUxMOwogICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IHRleHQgPyBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KSA6IDA7CiAgICAgICAgIGZsb2F0KiBwb3NBcnJheSA9IHBvcyA/IGVudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKHBvcywgTlVMTCkgOiBOVUxMOwpAQCAtODI3LDI3ICs4MjgsMjcgQEAKICAgICAgICAgfQogICAgICAgICBkZWxldGVbXSBwb3NQdHI7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGhfX19DSUlQYXRoRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogCiAgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dEFycmF5ICsgaW5kZXgsIGNvdW50IDw8IDEsICpwYXRoLAotICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRBcnJheSwgY291bnQsIGJpZGlGbGFncywgaE9mZnNldCwgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgY2FudmFzKTsKICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCAwKTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgeworICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCisgICAgICAgICAgICBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBjb25zdCBqY2hhciogdGV4dF8gPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpIDw8IDE7Ci0gICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVih0ZXh0XywgYnl0ZUxlbmd0aCwgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgIFNrRmxvYXRUb1NjYWxhcihoT2Zmc2V0KSwgU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpLCAqcGFpbnQpOworICAgICAgICBpbnQgY291bnQgPSBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRfLCBjb3VudCwgYmlkaUZsYWdzLCBoT2Zmc2V0LCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBjYW52YXMpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0Xyk7CiAgICAgfQotIAorCiAgICAgc3RhdGljIGJvb2wgZ2V0Q2xpcEJvdW5kcyhKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgYm91bmRzKSB7CiAgICAgICAgIFNrUmVjdCAgIHI7CkBAIC04NjgsMTIgKzg2OSwxMCBAQAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQ2FudmFzTWV0aG9kc1tdID0gewogICAgIHsiZmluYWxpemVyIiwgIihJKVYiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZmluYWxpemVyfSwKICAgICB7ImluaXRSYXN0ZXIiLCIoSSlJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRSYXN0ZXJ9LAotICAgIHsiaW5pdEdMIiwiKClJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRHTH0sCiAgICAgeyJpc09wYXF1ZSIsIigpWiIsICh2b2lkKikgU2tDYW52YXNHbHVlOjppc09wYXF1ZX0sCiAgICAgeyJnZXRXaWR0aCIsIigpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpnZXRXaWR0aH0sCiAgICAgeyJnZXRIZWlnaHQiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6Z2V0SGVpZ2h0fSwKICAgICB7Im5hdGl2ZV9zZXRCaXRtYXAiLCIoSUkpViIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzZXRCaXRtYXB9LAotICAgIHsibmF0aXZlU2V0Vmlld3BvcnQiLCAiKElJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OnNldFZpZXdwb3J0fSwKICAgICB7InNhdmUiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6c2F2ZUFsbH0sCiAgICAgeyJzYXZlIiwiKEkpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzYXZlfSwKICAgICB7Im5hdGl2ZV9zYXZlTGF5ZXIiLCIoSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3RGO0lJKUkiLApAQCAtOTQwLDI2ICs5MzksMjcgQEAKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBSUn0sCiAgICAgeyJuYXRpdmVfZHJhd0JpdG1hcCIsICIoSVtJSUlGRklJWkkpViIsCiAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcEFycmF5fSwKLSAgICAKICAgICB7Im5hdGl2ZURyYXdCaXRtYXBNYXRyaXgiLCAiKElJSUkpViIsCiAgICAgICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBNYXRyaXh9LAogICAgIHsibmF0aXZlRHJhd0JpdG1hcE1lc2giLCAiKElJSUlbRklbSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwTWVzaH0sCiAgICAgeyJuYXRpdmVEcmF3VmVydGljZXMiLCAiKElJSVtGSVtGSVtJSVtTSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3VmVydGljZXN9LAotICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElbQ0lJRkZJKVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsCi0gICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fU3RyaW5nSUlGRlBhaW50fSwKLSAgICB7ImRyYXdUZXh0IiwiKExqYXZhL2xhbmcvU3RyaW5nO0ZGTGFuZHJvaWQvZ3JhcGhpY3MvUGFpbnQ7KVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1N0cmluZ30sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSVtDSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19TdHJpbmdJSUZGSVBhaW50fSwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dFJ1biIsIihJW0NJSUlJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHRSdW4iLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRSdW5fX1N0cmluZ0lJSUlGRklQYWludH0sCiAgICAgeyJuYXRpdmVfZHJhd1Bvc1RleHQiLCIoSVtDSUlbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQb3NUZXh0IiwiKElMamF2YS9sYW5nL1N0cmluZztbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fU3RyaW5nX0ZQYWludH0sCi0gICAgeyJuYXRpdmVfZHJhd1RleHRPblBhdGgiLCIoSVtDSUlJRkZJKVYiLAorICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElbQ0lJSUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fX0NJSVBhdGhGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSSlWIiwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQaWN0dXJlIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdQaWN0dXJlfSwKIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAppbmRleCBlYmZiMjA5Li5mM2JlOGIwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcApAQCAtMjMsMjggKzIzLDY5IEBACiAjaW5jbHVkZSAiU2tDb2xvck1hdHJpeEZpbHRlci5oIgogI2luY2x1ZGUgIlNrUG9ydGVyRHVmZi5oIgogCisjaW5jbHVkZSA8U2tpYUNvbG9yRmlsdGVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CisKIGNsYXNzIFNrQ29sb3JGaWx0ZXJHbHVlIHsKIHB1YmxpYzoKLQotICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tDb2xvckZpbHRlciogb2JqKSB7CisgICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa0NvbG9yRmlsdGVyKiBvYmosIFNraWFDb2xvckZpbHRlciogZikgeworICAgICAgICBkZWxldGUgZjsKICAgICAgICAgb2JqLT5zYWZlVW5yZWYoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgewotICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTW9kZUZpbHRlcihzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgc3JjQ29sb3IsCisgICAgICAgICAgICBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhQmxlbmRGaWx0ZXIoc3JjQ29sb3IsIFNrUG9ydGVyRHVmZjo6VG9YZmVybW9kZU1vZGUobW9kZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKICAgICB9Ci0gCi0gICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUxpZ2h0aW5nRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG11bCwgamludCBhZGQpIHsKKworICAgIHN0YXRpYyBTa2lhQ29sb3JGaWx0ZXIqIGdsQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvQXJyYXkoZW52LCBqYXJyYXksIDIwKTsKKyAgICAgICAgY29uc3QgZmxvYXQqIHNyYyA9IGF1dG9BcnJheS5wdHIoKTsKKworICAgICAgICBmbG9hdCogY29sb3JNYXRyaXggPSBuZXcgZmxvYXRbMTZdOworICAgICAgICBtZW1jcHkoY29sb3JNYXRyaXgsIHNyYywgNCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBtZW1jcHkoJmNvbG9yTWF0cml4WzRdLCAmc3JjWzVdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbOF0sICZzcmNbMTBdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbMTJdLCAmc3JjWzE1XSwgNCAqIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIGZsb2F0KiBjb2xvclZlY3RvciA9IG5ldyBmbG9hdFs0XTsKKyAgICAgICAgY29sb3JWZWN0b3JbMF0gPSBzcmNbNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzFdID0gc3JjWzldOworICAgICAgICBjb2xvclZlY3RvclsyXSA9IHNyY1sxNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzNdID0gc3JjWzE5XTsKKworICAgICAgICByZXR1cm4gbmV3IFNraWFDb2xvck1hdHJpeEZpbHRlcihjb2xvck1hdHJpeCwgY29sb3JWZWN0b3IpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamludCBzcmNDb2xvciwKKyAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6TW9kZSBtb2RlKSB7CisgICAgICAgIHJldHVybiBTa0NvbG9yRmlsdGVyOjpDcmVhdGVNb2RlRmlsdGVyKHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgewogICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IGphcnJheSkgeworCisgICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKICAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9BcnJheShlbnYsIGphcnJheSwgMjApOwogICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gYXV0b0FycmF5LnB0cigpOwogCkBAIC01OCwyNiArOTksMjUgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTa0NvbG9yTWF0cml4RmlsdGVyKHNyYyk7CiAjZW5kaWYKICAgICB9Ci0gCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9yZmlsdGVyX21ldGhvZHNbXSA9IHsKLSAgICB7ImZpbmFsaXplciIsICIoSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQorICAgIHsiZmluYWxpemVyIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBwb3J0ZXJkdWZmX21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwiKElJKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwgIihJSSlJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlUG9ydGVyRHVmZkZpbHRlciAgIH0sCisgICAgeyAibkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBsaWdodGluZ19tZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCIoSUkpSSIsCi0gICAgICAgICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlciIsICIoSUkpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyICAgfSwKKyAgICB7ICJuQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZUxpZ2h0aW5nRmlsdGVyIH0sCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9ybWF0cml4X21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyIiwiKFtGKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVDb2xvck1hdHJpeEZpbHRlcn0KKyAgICB7ICJuYXRpdmVDb2xvck1hdHJpeEZpbHRlciIsICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUNvbG9yTWF0cml4RmlsdGVyICAgfSwKKyAgICB7ICJuQ29sb3JNYXRyaXhGaWx0ZXIiLCAgICAgICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OmdsQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIgfQogfTsKIAogI2RlZmluZSBSRUcoZW52LCBuYW1lLCBhcnJheSkgXApAQCAtODUsNyArMTI1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS19BUlJBWV9DT1VOVChhcnJheSkpOyAgXAogICAgIGlmIChyZXN1bHQgPCAwKSByZXR1cm4gcmVzdWx0CiAKLQogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQ29sb3JGaWx0ZXIoSk5JRW52KiBlbnYpIHsKICAgICBpbnQgcmVzdWx0OwogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9HcmFwaGljcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzLmNwcAppbmRleCAxOTVmNGQyLi45NDY3YmU4IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzLmNwcApAQCAtNDYsNyArNDYsNyBAQAogfQogCiB2b2lkIGRvVGhyb3dJT0UoSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1zZykgewotICAgIGRvVGhyb3coZW52LCAiamF2YS9sYW5nL0lPRXhjZXB0aW9uIiwgbXNnKTsKKyAgICBkb1Rocm93KGVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBtc2cpOwogfQogCiBib29sIEdyYXBoaWNzSk5JOjpoYXNFeGNlcHRpb24oSk5JRW52ICplbnYpIHsKQEAgLTE2OCw2ICsxNjgsOSBAQAogc3RhdGljIGpjbGFzcyAgIGdCaXRtYXBDb25maWdfY2xhc3M7CiBzdGF0aWMgamZpZWxkSUQgZ0JpdG1hcENvbmZpZ19uYXRpdmVJbnN0YW5jZUlEOwogCitzdGF0aWMgamNsYXNzICAgZ0JpdG1hcFJlZ2lvbkRlY29kZXJfY2xhc3M7CitzdGF0aWMgam1ldGhvZElEIGdCaXRtYXBSZWdpb25EZWNvZGVyX2NvbnN0cnVjdG9yTWV0aG9kSUQ7CisKIHN0YXRpYyBqY2xhc3MgICBnQ2FudmFzX2NsYXNzOwogc3RhdGljIGpmaWVsZElEIGdDYW52YXNfbmF0aXZlSW5zdGFuY2VJRDsKIApAQCAtMzc0LDYgKzM3NywyNCBAQAogICAgIHJldHVybiBvYmo7CiB9CiAKK2pvYmplY3QgR3JhcGhpY3NKTkk6OmNyZWF0ZUJpdG1hcFJlZ2lvbkRlY29kZXIoSk5JRW52KiBlbnYsIFNrQml0bWFwUmVnaW9uRGVjb2RlciogYml0bWFwKQoreworICAgIFNrQVNTRVJUKGJpdG1hcCAhPSBOVUxMKTsKKworICAgIGpvYmplY3Qgb2JqID0gZW52LT5BbGxvY09iamVjdChnQml0bWFwUmVnaW9uRGVjb2Rlcl9jbGFzcyk7CisgICAgaWYgKGhhc0V4Y2VwdGlvbihlbnYpKSB7CisgICAgICAgIG9iaiA9IE5VTEw7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgfQorICAgIGlmIChvYmopIHsKKyAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChvYmosIGdCaXRtYXBSZWdpb25EZWNvZGVyX2NvbnN0cnVjdG9yTWV0aG9kSUQsIChqaW50KWJpdG1hcCk7CisgICAgICAgIGlmIChoYXNFeGNlcHRpb24oZW52KSkgeworICAgICAgICAgICAgb2JqID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb2JqOworfQorCiBqb2JqZWN0IEdyYXBoaWNzSk5JOjpjcmVhdGVSZWdpb24oSk5JRW52KiBlbnYsIFNrUmVnaW9uKiByZWdpb24pCiB7CiAgICAgU2tBU1NFUlQocmVnaW9uICE9IE5VTEwpOwpAQCAtNTkyLDYgKzYxMyw5IEBACiAgICAgZ0JpdG1hcF9jb25zdHJ1Y3Rvck1ldGhvZElEID0gZW52LT5HZXRNZXRob2RJRChnQml0bWFwX2NsYXNzLCAiPGluaXQ+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihJWltCSSlWIik7CiAKKyAgICBnQml0bWFwUmVnaW9uRGVjb2Rlcl9jbGFzcyA9IG1ha2VfZ2xvYmFscmVmKGVudiwgImFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2RlciIpOworICAgIGdCaXRtYXBSZWdpb25EZWNvZGVyX2NvbnN0cnVjdG9yTWV0aG9kSUQgPSBlbnYtPkdldE1ldGhvZElEKGdCaXRtYXBSZWdpb25EZWNvZGVyX2NsYXNzLCAiPGluaXQ+IiwgIihJKVYiKTsKKwogICAgIGdCaXRtYXBDb25maWdfY2xhc3MgPSBtYWtlX2dsb2JhbHJlZihlbnYsICJhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcCRDb25maWciKTsKICAgICBnQml0bWFwQ29uZmlnX25hdGl2ZUluc3RhbmNlSUQgPSBnZXRGaWVsZElEQ2hlY2soZW52LCBnQml0bWFwQ29uZmlnX2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmF0aXZlSW50IiwgIkkiKTsgICAgCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzSk5JLmggYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzSk5JLmgKaW5kZXggMWY5NDQxOC4uZDBmOTEyNSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9HcmFwaGljc0pOSS5oCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvR3JhcGhpY3NKTkkuaApAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlICJTa1BvaW50LmgiCiAjaW5jbHVkZSAiU2tSZWN0LmgiCiAjaW5jbHVkZSAiU2tCaXRtYXAuaCIKKyNpbmNsdWRlICIuLi9pbWFnZXMvU2tCaXRtYXBSZWdpb25EZWNvZGVyLmgiCiAjaW5jbHVkZSAiLi4vaW1hZ2VzL1NrSW1hZ2VEZWNvZGVyLmgiCiAjaW5jbHVkZSA8am5pLmg+CiAKQEAgLTU1LDYgKzU2LDggQEAKICAgICAKICAgICBzdGF0aWMgam9iamVjdCBjcmVhdGVSZWdpb24oSk5JRW52KiBlbnYsIFNrUmVnaW9uKiByZWdpb24pOwogCisgICAgc3RhdGljIGpvYmplY3QgY3JlYXRlQml0bWFwUmVnaW9uRGVjb2RlcihKTklFbnYqIGVudiwgU2tCaXRtYXBSZWdpb25EZWNvZGVyKiBiaXRtYXApOworCiAgICAgLyoqIFNldCBhIHBpeGVscmVmIGZvciB0aGUgYml0bWFwIChuZWVkcyBzZXRDb25maWcgdG8gYWxyZWFkeSBiZSBjYWxsZWQpCiAgICAgICAgIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiBJZiBpdCByZXR1cm5zIGZhbHNlLCB0aGVuIGl0IGZhaWxlZCwgYW5kIHRoZQogICAgICAgICBhcHByb3ByaWF0ZSBleGNlcHRpb24gd2lsbCBoYXZlIGJlZW4gcmFpc2VkLgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguY3BwCmluZGV4IGI3ODI3NjYuLmNhZmNlYWIgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5jcHAKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJTa01hdHJpeC5oIgogI2luY2x1ZGUgIlNrVGVtcGxhdGVzLmgiCiAKKyNpbmNsdWRlICJNYXRyaXguaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBTa01hdHJpeEdsdWUgewpAQCAtNDAzLDEwICs0MDUsMjAgQEAKICAgICB7Im5hdGl2ZV9lcXVhbHMiLCAiKElJKVoiLCAodm9pZCopIFNrTWF0cml4R2x1ZTo6ZXF1YWxzfQogfTsKIAorc3RhdGljIGpmaWVsZElEIHNOYXRpdmVJbnN0YW5jZUZpZWxkOworCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19NYXRyaXgoSk5JRW52KiBlbnYpIHsKICAgICBpbnQgcmVzdWx0ID0gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL2dyYXBoaWNzL01hdHJpeCIsIG1ldGhvZHMsCiAgICAgICAgIHNpemVvZihtZXRob2RzKSAvIHNpemVvZihtZXRob2RzWzBdKSk7CisKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9ncmFwaGljcy9NYXRyaXgiKTsKKyAgICBzTmF0aXZlSW5zdGFuY2VGaWVsZCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm5hdGl2ZV9pbnN0YW5jZSIsICJJIik7CisKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitTa01hdHJpeCogYW5kcm9pZF9ncmFwaGljc19NYXRyaXhfZ2V0U2tNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgbWF0cml4T2JqKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2tNYXRyaXgqPihlbnYtPkdldEludEZpZWxkKG1hdHJpeE9iaiwgc05hdGl2ZUluc3RhbmNlRmllbGQpKTsKK30KKwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguaCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlZGY4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0FORFJPSURfR1JBUEhJQ1NfTUFUUklYX0gKKyNkZWZpbmUgX0FORFJPSURfR1JBUEhJQ1NfTUFUUklYX0gKKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIlNrTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogR2V0cyB0aGUgdW5kZXJseWluZyBTa01hdHJpeCBmcm9tIGEgTWF0cml4IG9iamVjdC4gKi8KK2V4dGVybiBTa01hdHJpeCogYW5kcm9pZF9ncmFwaGljc19NYXRyaXhfZ2V0U2tNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgbWF0cml4T2JqKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX0FORFJPSURfR1JBUEhJQ1NfTUFUUklYX0gKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAKaW5kZXggNzgwYmFkYy4uY2E5ZjM3MSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAKQEAgLTMxLDYgKzMxLDExIEBACiAjaW5jbHVkZSAiU2tTaGFkZXIuaCIKICNpbmNsdWRlICJTa1R5cGVmYWNlLmgiCiAjaW5jbHVkZSAiU2tYZmVybW9kZS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNoYXBlLmgiCisjaW5jbHVkZSAiVGV4dExheW91dC5oIgorCisvLyB0ZW1wb3JhcnkgZm9yIGRlYnVnZ2luZworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU3LDYgKzYyLDkgQEAKIAogY2xhc3MgU2tQYWludEdsdWUgewogcHVibGljOgorICAgIGVudW0gTW92ZU9wdCB7CisgICAgICAgIEFGVEVSLCBBVF9PUl9BRlRFUiwgQkVGT1JFLCBBVF9PUl9CRUZPUkUsIEFUCisgICAgfTsKIAogICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogb2JqKSB7CiAgICAgICAgIGRlbGV0ZSBvYmo7CkBAIC0zOTUsMjAgKzQwMywxNjEgQEAKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fX0NJSUZGUGF0aChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7Ci0gICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBwYWludC0+Z2V0VGV4dFBhdGgodGV4dEFycmF5ICsgaW5kZXgsIGNvdW50IDw8IDEsIFNrRmxvYXRUb1NjYWxhcih4KSwgU2tGbG9hdFRvU2NhbGFyKHkpLCBwYXRoKTsKLSAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgY29uc3RfY2FzdDxqY2hhcio+KHRleHRBcnJheSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpOSV9BQk9SVCk7CisKKyAgICBzdGF0aWMgamZsb2F0IGRvVGV4dFJ1bkFkdmFuY2VzKEpOSUVudiAqZW52LCBTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IGFkdmFuY2VzLCBqaW50IGFkdmFuY2VzSW5kZXgpIHsKKyAgICAgICAgamZsb2F0IGFkdmFuY2VzQXJyYXlbY291bnRdOworICAgICAgICBqZmxvYXQgdG90YWxBZHZhbmNlOworCisgICAgICAgIFRleHRMYXlvdXQ6OmdldFRleHRSdW5BZHZhbmNlcyhwYWludCwgdGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNBcnJheSwgdG90YWxBZHZhbmNlKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRGbG9hdEFycmF5UmVnaW9uKGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4LCBjb3VudCwgYWR2YW5jZXNBcnJheSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsQWR2YW5jZTsKICAgICB9Ci0gCi0gICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGhfX1N0cmluZ0lJRkZQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzX19fQ0lJSUlJX0ZJKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwKKyAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgamludCBpbmRleCwgamludCBjb3VudCwgamludCBjb250ZXh0SW5kZXgsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgamludCBmbGFncywgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamZsb2F0IHJlc3VsdCA9IGRvVGV4dFJ1bkFkdmFuY2VzKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGNvbnRleHRJbmRleCwKKyAgICAgICAgICAgIGluZGV4IC0gY29udGV4dEluZGV4LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAganN0cmluZyB0ZXh0LCBqaW50IHN0YXJ0LCBqaW50IGVuZCwgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywKKyAgICAgICAgICAgIGpmbG9hdEFycmF5IGFkdmFuY2VzLCBqaW50IGFkdmFuY2VzSW5kZXgpIHsKICAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwgcGF0aCk7CisgICAgICAgIGpmbG9hdCByZXN1bHQgPSBkb1RleHRSdW5BZHZhbmNlcyhlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBzdGFydCAtIGNvbnRleHRTdGFydCwgZW5kIC0gc3RhcnQsIGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQsIGZsYWdzLCBhZHZhbmNlcywKKyAgICAgICAgICAgIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBqaW50IGRvVGV4dFJ1bkN1cnNvcihKTklFbnYgKmVudiwgU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgamludCBjb3VudCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgb3B0KSB7CisgICAgICAgIFNrU2NhbGFyIHNjYWxhckFycmF5W2NvdW50XTsKKyAgICAgICAgamNoYXIgYnVmZmVyW2NvdW50XTsKKworICAgICAgICAvLyB0aGlzIGlzIHdoZXJlIHdlJ2QgY2FsbCBoYXJmYnV6egorICAgICAgICAvLyBmb3Igbm93IHdlIGp1c3QgdXNlIHVzaGFwZS5jIGFuZCB3aWR0aHMgcmV0dXJuZWQgZnJvbSBza2lhCisKKyAgICAgICAgaW50IHdpZHRoczsKKyAgICAgICAgaWYgKGZsYWdzICYgMHgxKSB7IC8vIHJ0bCwgY2FsbCBhcmFiaWMgc2hhcGluZyBpbiBjYXNlCisgICAgICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAorICAgICAgICAgICAgdV9zaGFwZUFyYWJpYyh0ZXh0ICsgc3RhcnQsIGNvdW50LCBidWZmZXIsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8IFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8CisgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8IFVfU0hBUEVfWF9MQU1BTEVGX1NVQl9BTFRFUk5BVEUsICZzdGF0dXMpOworICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IGZhaWwgdW5sZXNzIHRoZXJlJ3MgYW4gb3V0IG9mIG1lbW9yeSBjb25kaXRpb24sCisgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlJ3JlIGhvc2VkIGFueXdheQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gMHgyMDBiOyAvLyB6ZXJvLXdpZHRoLXNwYWNlIGZvciBza2lhCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKGJ1ZmZlciwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCArIHN0YXJ0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGhzIDwgY291bnQpIHsKKyAgICAgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkgb25lCisgICAgICAgICAgICAvLyB2YWx1ZS4gRXhwYW5kIHRoZSByZXN1bHQgc28gd2UgaGF2ZSBvbmUgdmFsdWUgcGVyIFVURi0xNiBjb2RlIHVuaXQuCisKKyAgICAgICAgICAgIC8vIE5vdGUsIHNraWEncyBnZXRUZXh0V2lkdGggZ2V0cyBjb25mdXNlZCBpZiBpdCBlbmNvdW50ZXJzIGEgc3Vycm9nYXRlIHBhaXIsCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgICAgIGNvbnN0IGpjaGFyICpjaGFycyA9IHRleHQgKyBzdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCwgcCA9IHdpZHRocyAtIDE7IC0taSA+IHA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID49IDB4ZGMwMCAmJiBjaGFyc1tpXSA8IDB4ZTAwMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNbaS0xXSA+PSAweGQ4MDAgJiYgY2hhcnNbaS0xXSA8IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgICAgICBzY2FsYXJBcnJheVtpXSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckFycmF5W2ldID0gc2NhbGFyQXJyYXlbLS1wXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBqaW50IHBvcyA9IG9mZnNldCAtIHN0YXJ0OworICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICBjYXNlIEFGVEVSOgorICAgICAgICAgIGlmIChwb3MgPCBjb3VudCkgeworICAgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIEFUX09SX0FGVEVSOgorICAgICAgICAgIHdoaWxlIChwb3MgPCBjb3VudCAmJiBzY2FsYXJBcnJheVtwb3NdID09IDApIHsKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRUZPUkU6CisgICAgICAgICAgaWYgKHBvcyA+IDApIHsKKyAgICAgICAgICAgIC0tcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSBBVF9PUl9CRUZPUkU6CisgICAgICAgICAgd2hpbGUgKHBvcyA+IDAgJiYgc2NhbGFyQXJyYXlbcG9zXSA9PSAwKSB7CisgICAgICAgICAgICAtLXBvczsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKHNjYWxhckFycmF5W3Bvc10gPT0gMCkgeworICAgICAgICAgICAgcG9zID0gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcyAhPSAtMSkgeworICAgICAgICAgIHBvcyArPSBzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fX0MoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqY2hhckFycmF5IHRleHQsCisgICAgICAgICAgICBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZmxhZ3MsIGppbnQgb2Zmc2V0LCBqaW50IGN1cnNvck9wdCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamludCByZXN1bHQgPSBkb1RleHRSdW5DdXJzb3IoZW52LCBwYWludCwgdGV4dEFycmF5LCBjb250ZXh0U3RhcnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fU3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwganN0cmluZyB0ZXh0LAorICAgICAgICAgICAgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBqaW50IHJlc3VsdCA9IGRvVGV4dFJ1bkN1cnNvcihlbnYsIHBhaW50LCB0ZXh0QXJyYXksIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0LCBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoKEpOSUVudiogZW52LCBTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGppbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoICpwYXRoKSB7CisgICAgICAgIFRleHRMYXlvdXQ6OmdldFRleHRQYXRoKHBhaW50LCB0ZXh0LCBjb3VudCwgYmlkaUZsYWdzLCB4LCB5LCBwYXRoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fX0MoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBnZXRUZXh0UGF0aChlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIGJpZGlGbGFncywgeCwgeSwgcGF0aCk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIGNvbnN0X2Nhc3Q8amNoYXIqPih0ZXh0QXJyYXkpLCBKTklfQUJPUlQpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19TdHJpbmcoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgICAgIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCogcGF0aCkgeworICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgZ2V0VGV4dFBhdGgoZW52LCBwYWludCwgdGV4dEFycmF5ICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBiaWRpRmxhZ3MsIHgsIHksIHBhdGgpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIHNldFNoYWRvd0xheWVyKEpOSUVudiogZW52LCBqb2JqZWN0IGpwYWludCwgamZsb2F0IHJhZGl1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgZHgsIGpmbG9hdCBkeSwgaW50IGNvbG9yKSB7CiAgICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGpwYWludCk7CkBAIC01NzYsMTMgKzcyNSwyMCBAQAogICAgIHsibmF0aXZlX2JyZWFrVGV4dCIsIihMamF2YS9sYW5nL1N0cmluZztaRltGKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpicmVha1RleHRTfSwKICAgICB7Im5hdGl2ZV9nZXRUZXh0V2lkdGhzIiwiKElbQ0lJW0YpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRXaWR0aHNfX19DSUlfRn0sCiAgICAgeyJuYXRpdmVfZ2V0VGV4dFdpZHRocyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlbRilJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFdpZHRoc19fU3RyaW5nSUlfRn0sCi0gICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSVtDSUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19fQ0lJRkZQYXRofSwKLSAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19TdHJpbmdJSUZGUGF0aH0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzIiwiKElbQ0lJSUlJW0ZJKUYiLCAodm9pZCopCisgICAgICAgIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQWR2YW5jZXNfX19DSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUlbRkkpRiIsCisgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5DdXJzb3IiLCAiKElbQ0lJSUlJKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19fQ30sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvciIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlJKUkiLAorICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19TdHJpbmd9LAorICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElJW0NJSUZGSSlWIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFBhdGhfX19DfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fU3RyaW5nfSwKICAgICB7Im5hdGl2ZUdldFN0cmluZ0JvdW5kcyIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0U3RyaW5nQm91bmRzIH0sCiAgICAgeyJuYXRpdmVHZXRDaGFyQXJyYXlCb3VuZHMiLCAiKElbQ0lJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRDaGFyQXJyYXlCb3VuZHMgfSwKLSAgICB7InNldFNoYWRvd0xheWVyIiwgIihGRkZJKVYiLCAodm9pZCopU2tQYWludEdsdWU6OnNldFNoYWRvd0xheWVyfQorICAgIHsiblNldFNoYWRvd0xheWVyIiwgIihGRkZJKVYiLCAodm9pZCopU2tQYWludEdsdWU6OnNldFNoYWRvd0xheWVyfQogfTsKIAogc3RhdGljIGpmaWVsZElEIHJlcV9maWVsZElEKGpmaWVsZElEIGlkKSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmNwcAppbmRleCBiOGIyYTEwLi5hYmUzM2Y0IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5jcHAKQEAgLTI2LDEyICsyNiwxOSBAQAogCiAjaW5jbHVkZSAiU2tQYXRoLmgiCiAKKyNpbmNsdWRlIDxDYWNoZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBTa1BhdGhHbHVlIHsKIHB1YmxpYzoKIAogICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYXRoKiBvYmopIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIGlmIChhbmRyb2lkOjp1aXJlbmRlcmVyOjpDYWNoZXM6Omhhc0luc3RhbmNlKCkpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6Z2V0SW5zdGFuY2UoKS5wYXRoQ2FjaGUucmVtb3ZlKG9iaik7CisgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBkZWxldGUgb2JqOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwCmluZGV4IGIwOWM2MmIuLmVlNDQ3NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAKQEAgLTgsNiArOCwxNiBAQAogI2luY2x1ZGUgIlNrVGVtcGxhdGVzLmgiCiAjaW5jbHVkZSAiU2tYZmVybW9kZS5oIgogCisjaW5jbHVkZSA8U2tpYVNoYWRlci5oPgorI2luY2x1ZGUgPENhY2hlcy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6dWlyZW5kZXJlcjsKKworc3RhdGljIHN0cnVjdCB7CisgICAgamNsYXNzIGNsYXp6OworICAgIGpmaWVsZElEIHNoYWRlcjsKK30gZ1NoYWRlckNsYXNzSW5mbzsKKwogc3RhdGljIHZvaWQgVGhyb3dJQUVfSWZOdWxsKEpOSUVudiogZW52LCB2b2lkKiBwdHIpIHsKICAgICBpZiAoTlVMTCA9PSBwdHIpIHsKICAgICAgICAgZG9UaHJvd0lBRShlbnYpOwpAQCAtNDEsOCArNTEsMTQgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIHZvaWQgU2hhZGVyX2Rlc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrU2hhZGVyKiBzaGFkZXIpCitzdGF0aWMgdm9pZCBTaGFkZXJfZGVzdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLCBTa2lhU2hhZGVyKiBza2lhU2hhZGVyKQogeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBpZiAoYW5kcm9pZDo6dWlyZW5kZXJlcjo6Q2FjaGVzOjpoYXNJbnN0YW5jZSgpKSB7CisgICAgICAgIGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6Z2V0SW5zdGFuY2UoKS5ncmFkaWVudENhY2hlLnJlbW92ZShzaGFkZXIpOworICAgIH0KKyNlbmRpZgorICAgIGRlbGV0ZSBza2lhU2hhZGVyOwogICAgIHNoYWRlci0+c2FmZVVucmVmKCk7CiB9CiAKQEAgLTUxLDcgKzY3LDggQEAKICAgICByZXR1cm4gc2hhZGVyID8gc2hhZGVyLT5nZXRMb2NhbE1hdHJpeChtYXRyaXgpIDogZmFsc2U7CiB9CiAgCi1zdGF0aWMgdm9pZCBTaGFkZXJfc2V0TG9jYWxNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrU2hhZGVyKiBzaGFkZXIsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgpCitzdGF0aWMgdm9pZCBTaGFkZXJfc2V0TG9jYWxNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwgU2tpYVNoYWRlciogc2tpYVNoYWRlciwKKyAgICAgICAgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCkKIHsKICAgICBpZiAoc2hhZGVyKSB7CiAgICAgICAgIGlmIChOVUxMID09IG1hdHJpeCkgewpAQCAtNjAsMjQgKzc3LDQwIEBACiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgc2hhZGVyLT5zZXRMb2NhbE1hdHJpeCgqbWF0cml4KTsKICAgICAgICAgfQorI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgc2tpYVNoYWRlci0+c2V0TWF0cml4KGNvbnN0X2Nhc3Q8U2tNYXRyaXgqPihtYXRyaXgpKTsKKyNlbmRpZgogICAgIH0KIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBCaXRtYXBTaGFkZXJfY29uc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QsIGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsCitzdGF0aWMgU2tTaGFkZXIqIEJpdG1hcFNoYWRlcl9jb25zdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCBvLCBjb25zdCBTa0JpdG1hcCogYml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVNb2RlWCwgaW50IHRpbGVNb2RlWSkKIHsKICAgICBTa1NoYWRlciogcyA9IFNrU2hhZGVyOjpDcmVhdGVCaXRtYXBTaGFkZXIoKmJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2tTaGFkZXI6OlRpbGVNb2RlKXRpbGVNb2RlWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2tTaGFkZXI6OlRpbGVNb2RlKXRpbGVNb2RlWSk7CisKICAgICBUaHJvd0lBRV9JZk51bGwoZW52LCBzKTsKICAgICByZXR1cm4gczsKIH0KKworc3RhdGljIFNraWFTaGFkZXIqIEJpdG1hcFNoYWRlcl9wb3N0Q29uc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgU2tCaXRtYXAqIGJpdG1hcCwgaW50IHRpbGVNb2RlWCwgaW50IHRpbGVNb2RlWSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBTa2lhU2hhZGVyKiBza2lhU2hhZGVyID0gbmV3IFNraWFCaXRtYXBTaGFkZXIoYml0bWFwLCBzaGFkZXIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlWCksIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGVZKSwKKyAgICAgICAgICAgIE5VTEwsIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQogICAgIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0LAorc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludEFycmF5IGNvbG9yQXJyYXksIGpmbG9hdEFycmF5IHBvc0FycmF5LCBpbnQgdGlsZU1vZGUpCiB7CkBAIC04NSwzMSArMTE4LDk1IEBACiAgICAgcHRzWzBdLnNldChTa0Zsb2F0VG9TY2FsYXIoeDApLCBTa0Zsb2F0VG9TY2FsYXIoeTApKTsKICAgICBwdHNbMV0uc2V0KFNrRmxvYXRUb1NjYWxhcih4MSksIFNrRmxvYXRUb1NjYWxhcih5MSkpOwogCi0gICAgc2l6ZV90ICAgICAgY291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGNvbG9yQXJyYXkpOworICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CiAgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CiAKICAgICBTa0F1dG9TVE1hbGxvYzw4LCBTa1NjYWxhcj4gc3RvcmFnZShwb3NBcnJheSA/IGNvdW50IDogMCk7CiAgICAgU2tTY2FsYXIqICAgICAgICAgICAgICAgICAgIHBvcyA9IE5VTEw7Ci0gICAgCisKICAgICBpZiAocG9zQXJyYXkpIHsKICAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9Qb3MoZW52LCBwb3NBcnJheSwgY291bnQpOwogICAgICAgICBjb25zdCBmbG9hdCogcG9zVmFsdWVzID0gYXV0b1Bvcy5wdHIoKTsKICAgICAgICAgcG9zID0gKFNrU2NhbGFyKilzdG9yYWdlLmdldCgpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgcG9zW2ldID0gU2tGbG9hdFRvU2NhbGFyKHBvc1ZhbHVlc1tpXSk7CisgICAgICAgIH0KICAgICB9Ci0KKyAgICAKICAgICBTa1NoYWRlciogc2hhZGVyID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlTGluZWFyKHB0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTa0NvbG9yKj4oY29sb3JWYWx1ZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MsIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlKSk7Ci0gICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKTklfQUJPUlQpOworCisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksIEpOSV9BQk9SVCk7CiAgICAgVGhyb3dJQUVfSWZOdWxsKGVudiwgc2hhZGVyKTsKICAgICByZXR1cm4gc2hhZGVyOwogfQogCi1zdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QsCitzdGF0aWMgU2tpYVNoYWRlciogTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsIGppbnRBcnJheSBjb2xvckFycmF5LAorICAgICAgICBqZmxvYXRBcnJheSBwb3NBcnJheSwgaW50IHRpbGVNb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CisgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CisKKyAgICBqZmxvYXQqIHN0b3JlZEJvdW5kcyA9IG5ldyBqZmxvYXRbNF07CisgICAgc3RvcmVkQm91bmRzWzBdID0geDA7IHN0b3JlZEJvdW5kc1sxXSA9IHkwOworICAgIHN0b3JlZEJvdW5kc1syXSA9IHgxOyBzdG9yZWRCb3VuZHNbM10gPSB5MTsKKyAgICBqZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBqZmxvYXRbY291bnRdOworICAgIHVpbnQzMl90KiBzdG9yZWRDb2xvcnMgPSBuZXcgdWludDMyX3RbY291bnRdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBzdG9yZWRDb2xvcnNbaV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3JWYWx1ZXNbaV0pOworICAgIH0KKworICAgIGlmIChwb3NBcnJheSkgeworICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b1BvcyhlbnYsIHBvc0FycmF5LCBjb3VudCk7CisgICAgICAgIGNvbnN0IGZsb2F0KiBwb3NWYWx1ZXMgPSBhdXRvUG9zLnB0cigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9uc1tpXSA9IHBvc1ZhbHVlc1tpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1swXSA9IDAuMGY7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisgICAgfQorCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIoc3RvcmVkQm91bmRzLCBzdG9yZWRDb2xvcnMsCisgICAgICAgICAgICBzdG9yZWRQb3NpdGlvbnMsIGNvdW50LCBzaGFkZXIsIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGUpLCBOVUxMLAorICAgICAgICAgICAgKHNoYWRlci0+Z2V0RmxhZ3MoKSAmIFNrU2hhZGVyOjprT3BhcXVlQWxwaGFfRmxhZykgPT0gMCk7CisKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIGNvbnN0X2Nhc3Q8amludCo+KGNvbG9yVmFsdWVzKSwgSk5JX0FCT1JUKTsKKyAgICByZXR1cm4gc2tpYVNoYWRlcjsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIFNraWFTaGFkZXIqIExpbmVhckdyYWRpZW50X3Bvc3RDcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLCBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgZmxvYXQqIHN0b3JlZEJvdW5kcyA9IG5ldyBmbG9hdFs0XTsKKyAgICBzdG9yZWRCb3VuZHNbMF0gPSB4MDsgc3RvcmVkQm91bmRzWzFdID0geTA7CisgICAgc3RvcmVkQm91bmRzWzJdID0geDE7IHN0b3JlZEJvdW5kc1szXSA9IHkxOworCisgICAgZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBmbG9hdFsyXTsKKyAgICBzdG9yZWRQb3NpdGlvbnNbMF0gPSAwLjBmOworICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisKKyAgICB1aW50MzJfdCogc3RvcmVkQ29sb3JzID0gbmV3IHVpbnQzMl90WzJdOworICAgIHN0b3JlZENvbG9yc1swXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjApOworICAgIHN0b3JlZENvbG9yc1sxXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjEpOworCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIoc3RvcmVkQm91bmRzLCBzdG9yZWRDb2xvcnMsCisgICAgICAgICAgICBzdG9yZWRQb3NpdGlvbnMsIDIsIHNoYWRlciwgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZSksIE5VTEwsCisgICAgICAgICAgICAoc2hhZGVyLT5nZXRGbGFncygpICYgU2tTaGFkZXI6OmtPcGFxdWVBbHBoYV9GbGFnKSA9PSAwKTsKKworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpCiB7CkBAIC0xMjAsMTggKzIxNywxNyBAQAogICAgIFNrQ29sb3IgY29sb3JzWzJdOwogICAgIGNvbG9yc1swXSA9IGNvbG9yMDsKICAgICBjb2xvcnNbMV0gPSBjb2xvcjE7Ci0KKyAgICAKICAgICBTa1NoYWRlciogcyA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwdHMsIGNvbG9ycywgTlVMTCwgMiwgKFNrU2hhZGVyOjpUaWxlTW9kZSl0aWxlTW9kZSk7CisKICAgICBUaHJvd0lBRV9JZk51bGwoZW52LCBzKTsKICAgICByZXR1cm4gczsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBSYWRpYWxHcmFkaWVudF9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50QXJyYXkgY29sb3JBcnJheSwgamZsb2F0QXJyYXkgcG9zQXJyYXksIGludCB0aWxlTW9kZSkKLXsKK3N0YXRpYyBTa1NoYWRlciogUmFkaWFsR3JhZGllbnRfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLAorICAgICAgICBqaW50QXJyYXkgY29sb3JBcnJheSwgamZsb2F0QXJyYXkgcG9zQXJyYXksIGludCB0aWxlTW9kZSkgewogICAgIFNrUG9pbnQgY2VudGVyOwogICAgIGNlbnRlci5zZXQoU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSkpOwogCkBAIC0xNjEsMTAgKzI1Nyw4IEBACiAgICAgcmV0dXJuIHNoYWRlcjsKIH0KIAotc3RhdGljIFNrU2hhZGVyKiBSYWRpYWxHcmFkaWVudF9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpCi17CitzdGF0aWMgU2tTaGFkZXIqIFJhZGlhbEdyYWRpZW50X2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywKKyAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKSB7CiAgICAgU2tQb2ludCBjZW50ZXI7CiAgICAgY2VudGVyLnNldChTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSk7CiAKQEAgLTE3OCwxMSArMjcyLDY1IEBACiAgICAgcmV0dXJuIHM7CiB9CiAKK3N0YXRpYyBTa2lhU2hhZGVyKiBSYWRpYWxHcmFkaWVudF9wb3N0Q3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByYWRpdXMsIGppbnRBcnJheSBjb2xvckFycmF5LCBqZmxvYXRBcnJheSBwb3NBcnJheSwgaW50IHRpbGVNb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CisgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CisKKyAgICBqZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBqZmxvYXRbY291bnRdOworICAgIHVpbnQzMl90KiBzdG9yZWRDb2xvcnMgPSBuZXcgdWludDMyX3RbY291bnRdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBzdG9yZWRDb2xvcnNbaV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3JWYWx1ZXNbaV0pOworICAgIH0KKworICAgIGlmIChwb3NBcnJheSkgeworICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b1BvcyhlbnYsIHBvc0FycmF5LCBjb3VudCk7CisgICAgICAgIGNvbnN0IGZsb2F0KiBwb3NWYWx1ZXMgPSBhdXRvUG9zLnB0cigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9uc1tpXSA9IHBvc1ZhbHVlc1tpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1swXSA9IDAuMGY7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisgICAgfQorCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhQ2lyY3VsYXJHcmFkaWVudFNoYWRlcih4LCB5LCByYWRpdXMsIHN0b3JlZENvbG9ycywKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9ucywgY291bnQsIHNoYWRlciwgKFNrU2hhZGVyOjpUaWxlTW9kZSkgdGlsZU1vZGUsIE5VTEwsCisgICAgICAgICAgICAoc2hhZGVyLT5nZXRGbGFncygpICYgU2tTaGFkZXI6OmtPcGFxdWVBbHBoYV9GbGFnKSA9PSAwKTsKKworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgY29uc3RfY2FzdDxqaW50Kj4oY29sb3JWYWx1ZXMpLCBKTklfQUJPUlQpOworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tpYVNoYWRlciogUmFkaWFsR3JhZGllbnRfcG9zdENyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBmbG9hdFsyXTsKKyAgICBzdG9yZWRQb3NpdGlvbnNbMF0gPSAwLjBmOworICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisKKyAgICB1aW50MzJfdCogc3RvcmVkQ29sb3JzID0gbmV3IHVpbnQzMl90WzJdOworICAgIHN0b3JlZENvbG9yc1swXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjApOworICAgIHN0b3JlZENvbG9yc1sxXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjEpOworCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhQ2lyY3VsYXJHcmFkaWVudFNoYWRlcih4LCB5LCByYWRpdXMsIHN0b3JlZENvbG9ycywKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9ucywgMiwgc2hhZGVyLCAoU2tTaGFkZXI6OlRpbGVNb2RlKSB0aWxlTW9kZSwgTlVMTCwKKyAgICAgICAgICAgIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworCisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RhdGljIFNrU2hhZGVyKiBTd2VlcEdyYWRpZW50X2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QsIGZsb2F0IHgsIGZsb2F0IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50QXJyYXkgamNvbG9ycywgamZsb2F0QXJyYXkganBvc2l0aW9ucykKLXsKKyAgICAgICAgamludEFycmF5IGpjb2xvcnMsIGpmbG9hdEFycmF5IGpwb3NpdGlvbnMpIHsKICAgICBzaXplX3QgICAgICBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoamNvbG9ycyk7CiAgICAgY29uc3QgamludCogY29sb3JzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGpjb2xvcnMsIE5VTEwpOwogICAgIApAQCAtMjA5LDggKzM1Nyw3IEBACiB9CiAKIHN0YXRpYyBTa1NoYWRlciogU3dlZXBHcmFkaWVudF9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LCBmbG9hdCB4LCBmbG9hdCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEpCi17CisgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEpIHsKICAgICBTa0NvbG9yIGNvbG9yc1syXTsKICAgICBjb2xvcnNbMF0gPSBjb2xvcjA7CiAgICAgY29sb3JzWzFdID0gY29sb3IxOwpAQCAtMjIwLDIwICszNjcsOTcgQEAKICAgICByZXR1cm4gczsKIH0KIAorc3RhdGljIFNraWFTaGFkZXIqIFN3ZWVwR3JhZGllbnRfcG9zdENyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgamludEFycmF5IGNvbG9yQXJyYXksIGpmbG9hdEFycmF5IHBvc0FycmF5KSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CisgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CisKKyAgICBqZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBqZmxvYXRbY291bnRdOworICAgIHVpbnQzMl90KiBzdG9yZWRDb2xvcnMgPSBuZXcgdWludDMyX3RbY291bnRdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBzdG9yZWRDb2xvcnNbaV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3JWYWx1ZXNbaV0pOworICAgIH0KKworICAgIGlmIChwb3NBcnJheSkgeworICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b1BvcyhlbnYsIHBvc0FycmF5LCBjb3VudCk7CisgICAgICAgIGNvbnN0IGZsb2F0KiBwb3NWYWx1ZXMgPSBhdXRvUG9zLnB0cigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9uc1tpXSA9IHBvc1ZhbHVlc1tpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1swXSA9IDAuMGY7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisgICAgfQorCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcih4LCB5LCBzdG9yZWRDb2xvcnMsIHN0b3JlZFBvc2l0aW9ucywgY291bnQsCisgICAgICAgICAgICBzaGFkZXIsIE5VTEwsIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworCisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksIEpOSV9BQk9SVCk7CisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBTa2lhU2hhZGVyKiBTd2VlcEdyYWRpZW50X3Bvc3RDcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBjb2xvcjAsIGludCBjb2xvcjEpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBmbG9hdFsyXTsKKyAgICBzdG9yZWRQb3NpdGlvbnNbMF0gPSAwLjBmOworICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisKKyAgICB1aW50MzJfdCogc3RvcmVkQ29sb3JzID0gbmV3IHVpbnQzMl90WzJdOworICAgIHN0b3JlZENvbG9yc1swXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjApOworICAgIHN0b3JlZENvbG9yc1sxXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjEpOworCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcih4LCB5LCBzdG9yZWRDb2xvcnMsIHN0b3JlZFBvc2l0aW9ucywgMiwKKyAgICAgICAgICAgIHNoYWRlciwgTlVMTCwgKHNoYWRlci0+Z2V0RmxhZ3MoKSAmIFNrU2hhZGVyOjprT3BhcXVlQWxwaGFfRmxhZykgPT0gMCk7CisKKyAgICByZXR1cm4gc2tpYVNoYWRlcjsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBDb21wb3NlU2hhZGVyX2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrWGZlcm1vZGUqIG1vZGUpCitzdGF0aWMgU2tTaGFkZXIqIENvbXBvc2VTaGFkZXJfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLAorICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrWGZlcm1vZGUqIG1vZGUpCiB7CiAgICAgcmV0dXJuIG5ldyBTa0NvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgbW9kZSk7CiB9CiAKLXN0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTaGFkZXIqIHNoYWRlckEsIFNrU2hhZGVyKiBzaGFkZXJCLCBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkKK3N0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCisgICAgICAgIFNrU2hhZGVyKiBzaGFkZXJBLCBTa1NoYWRlciogc2hhZGVyQiwgU2tQb3J0ZXJEdWZmOjpNb2RlIHBvcnRlckR1ZmZNb2RlKQogewotICAgIFNrQXV0b1VucmVmIGF1KFNrUG9ydGVyRHVmZjo6Q3JlYXRlWGZlcm1vZGUobW9kZSkpOworICAgIFNrQXV0b1VucmVmIGF1KFNrUG9ydGVyRHVmZjo6Q3JlYXRlWGZlcm1vZGUocG9ydGVyRHVmZk1vZGUpKTsKKyAgICBTa1hmZXJtb2RlKiBtb2RlID0gKFNrWGZlcm1vZGUqKSBhdS5nZXQoKTsKKyAgICByZXR1cm4gbmV3IFNrQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBtb2RlKTsKK30KIAotICAgIHJldHVybiBuZXcgU2tDb21wb3NlU2hhZGVyKHNoYWRlckEsIHNoYWRlckIsIChTa1hmZXJtb2RlKilhdS5nZXQoKSk7CitzdGF0aWMgU2tpYVNoYWRlciogQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa2lhU2hhZGVyKiBzaGFkZXJBLCBTa2lhU2hhZGVyKiBzaGFkZXJCLCBTa1BvcnRlckR1ZmY6Ok1vZGUgcG9ydGVyRHVmZk1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlID0gU2tQb3J0ZXJEdWZmOjpUb1hmZXJtb2RlTW9kZShwb3J0ZXJEdWZmTW9kZSk7CisgICAgcmV0dXJuIG5ldyBTa2lhQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBtb2RlLCBzaGFkZXIpOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tpYVNoYWRlciogQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa2lhU2hhZGVyKiBzaGFkZXJBLCBTa2lhU2hhZGVyKiBzaGFkZXJCLCBTa1hmZXJtb2RlKiBtb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIFNrWGZlcm1vZGU6Ok1vZGUgc2tpYU1vZGU7CisgICAgaWYgKCFTa1hmZXJtb2RlOjpJc01vZGUobW9kZSwgJnNraWFNb2RlKSkgeworICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IG90aGVyIG1vZGVzCisgICAgICAgIHNraWFNb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBTa2lhQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBza2lhTW9kZSwgc2hhZGVyKTsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTI0NCwzMyArNDY4LDQyIEBACiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdTaGFkZXJNZXRob2RzW10gPSB7Ci0gICAgeyAibmF0aXZlRGVzdHJ1Y3RvciIsICAgICAgICAiKEkpViIsICAgICAodm9pZCopU2hhZGVyX2Rlc3RydWN0b3IgICAgICAgIH0sCisgICAgeyAibmF0aXZlRGVzdHJ1Y3RvciIsICAgICAgICAiKElJKVYiLCAgICAodm9pZCopU2hhZGVyX2Rlc3RydWN0b3IgICAgICAgIH0sCiAgICAgeyAibmF0aXZlR2V0TG9jYWxNYXRyaXgiLCAgICAiKElJKVoiLCAgICAodm9pZCopU2hhZGVyX2dldExvY2FsTWF0cml4ICAgIH0sCi0gICAgeyAibmF0aXZlU2V0TG9jYWxNYXRyaXgiLCAgICAiKElJKVYiLCAgICAodm9pZCopU2hhZGVyX3NldExvY2FsTWF0cml4ICAgIH0KKyAgICB7ICJuYXRpdmVTZXRMb2NhbE1hdHJpeCIsICAgICIoSUlJKVYiLCAgICh2b2lkKilTaGFkZXJfc2V0TG9jYWxNYXRyaXggICAgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQml0bWFwU2hhZGVyTWV0aG9kc1tdID0gewotICAgIHsgIm5hdGl2ZUNyZWF0ZSIsICAgIihJSUkpSSIsICAodm9pZCopQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yIH0KKyAgICB7ICJuYXRpdmVDcmVhdGUiLCAgICAgIihJSUkpSSIsICAodm9pZCopQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yIH0sCisgICAgeyAibmF0aXZlUG9zdENyZWF0ZSIsICIoSUlJSSlJIiwgKHZvaWQqKUJpdG1hcFNoYWRlcl9wb3N0Q29uc3RydWN0b3IgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTGluZWFyR3JhZGllbnRNZXRob2RzW10gPSB7Ci0gICAgeyAibmF0aXZlQ3JlYXRlMSIsICAiKEZGRkZbSVtGSSlJIiwgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTEgICB9LAotICAgIHsgIm5hdGl2ZUNyZWF0ZTIiLCAgIihGRkZGSUlJKUkiLCAgICh2b2lkKilMaW5lYXJHcmFkaWVudF9jcmVhdGUyICAgfQorICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgICAgIihGRkZGW0lbRkkpSSIsICAodm9pZCopTGluZWFyR3JhZGllbnRfY3JlYXRlMSAgICAgfSwKKyAgICB7ICJuYXRpdmVDcmVhdGUyIiwgICAgICIoRkZGRklJSSlJIiwgICAgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTIgICAgIH0sCisgICAgeyAibmF0aXZlUG9zdENyZWF0ZTEiLCAiKElGRkZGW0lbRkkpSSIsICh2b2lkKilMaW5lYXJHcmFkaWVudF9wb3N0Q3JlYXRlMSB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUyIiwgIihJRkZGRklJSSlJIiwgICAodm9pZCopTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnUmFkaWFsR3JhZGllbnRNZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVDcmVhdGUxIiwgICAiKEZGRltJW0ZJKUkiLCAgKHZvaWQqKVJhZGlhbEdyYWRpZW50X2NyZWF0ZTEgICB9LAotICAgIHsibmF0aXZlQ3JlYXRlMiIsICAgIihGRkZJSUkpSSIsICAgICh2b2lkKilSYWRpYWxHcmFkaWVudF9jcmVhdGUyICAgfQorICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgICAgIihGRkZbSVtGSSlJIiwgICh2b2lkKilSYWRpYWxHcmFkaWVudF9jcmVhdGUxICAgICB9LAorICAgIHsgIm5hdGl2ZUNyZWF0ZTIiLCAgICAgIihGRkZJSUkpSSIsICAgICh2b2lkKilSYWRpYWxHcmFkaWVudF9jcmVhdGUyICAgICB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUxIiwgIihJRkZGW0lbRkkpSSIsICh2b2lkKilSYWRpYWxHcmFkaWVudF9wb3N0Q3JlYXRlMSB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUyIiwgIihJRkZGSUlJKUkiLCAgICh2b2lkKilSYWRpYWxHcmFkaWVudF9wb3N0Q3JlYXRlMiB9CiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdTd2VlcEdyYWRpZW50TWV0aG9kc1tdID0gewotICAgIHsibmF0aXZlQ3JlYXRlMSIsICAgIihGRltJW0YpSSIsICAodm9pZCopU3dlZXBHcmFkaWVudF9jcmVhdGUxICAgfSwKLSAgICB7Im5hdGl2ZUNyZWF0ZTIiLCAgICIoRkZJSSlJIiwgICAgKHZvaWQqKVN3ZWVwR3JhZGllbnRfY3JlYXRlMiAgIH0KKyAgICB7ICJuYXRpdmVDcmVhdGUxIiwgICAgICIoRkZbSVtGKUkiLCAgKHZvaWQqKVN3ZWVwR3JhZGllbnRfY3JlYXRlMSAgICAgfSwKKyAgICB7ICJuYXRpdmVDcmVhdGUyIiwgICAgICIoRkZJSSlJIiwgICAgKHZvaWQqKVN3ZWVwR3JhZGllbnRfY3JlYXRlMiAgICAgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlMSIsICIoSUZGW0lbRilJIiwgKHZvaWQqKVN3ZWVwR3JhZGllbnRfcG9zdENyZWF0ZTEgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlMiIsICIoSUZGSUkpSSIsICAgKHZvaWQqKVN3ZWVwR3JhZGllbnRfcG9zdENyZWF0ZTIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQ29tcG9zZVNoYWRlck1ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZUNyZWF0ZTEiLCAgIihJSUkpSSIsICAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTEgfSwKLSAgICB7Im5hdGl2ZUNyZWF0ZTIiLCAgIihJSUkpSSIsICAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTIgfQorICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgICAgICIoSUlJKUkiLCAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTEgICAgIH0sCisgICAgeyAibmF0aXZlQ3JlYXRlMiIsICAgICAgIihJSUkpSSIsICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMiAgICAgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlMSIsICAiKElJSUkpSSIsICAodm9pZCopQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMSB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUyIiwgICIoSUlJSSlJIiwgICh2b2lkKilDb21wb3NlU2hhZGVyX3Bvc3RDcmVhdGUyIH0KIH07CiAKICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2UxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCisjaW5jbHVkZSAiU2tUZW1wbGF0ZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3ViaWRpLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyBSZXR1cm5zIHRydWUgaWYgd2UgbWlnaHQgbmVlZCBsYXlvdXQuICBJZiBiaWRpRmxhZ3MgZm9yY2UgTFRSLCBhc3N1bWUgbm8gbGF5b3V0LCBpZgorLy8gYmlkaUZsYWdzIGluZGljYXRlIHRoZXJlIHByb2JhYmx5IGlzIFJUTCwgYXNzdW1lIHdlIGRvLCBvdGhlcndpc2Ugc2NhbiB0aGUgdGV4dAorLy8gbG9va2luZyBmb3IgYSBjaGFyYWN0ZXIgPj0gdGhlIGZpcnN0IFJUTCBjaGFyYWN0ZXIgaW4gdW5pY29kZSBhbmQgYXNzdW1lIHdlIGRvIGlmCisvLyB3ZSBmaW5kIG9uZS4KK2Jvb2wgVGV4dExheW91dDo6bmVlZHNMYXlvdXQoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGJpZGlGbGFncykgeworICAgIGlmIChiaWRpRmxhZ3MgPT0ga0JpZGlfRm9yY2VfTFRSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKChiaWRpRmxhZ3MgPT0ga0JpZGlfUlRMKSB8fCAoYmlkaUZsYWdzID09IGtCaWRpX0RlZmF1bHRfUlRMKSB8fAorICAgICAgICAgICAgYmlkaUZsYWdzID09IGtCaWRpX0ZvcmNlX1JUTCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBpZiAodGV4dFtpXSA+PSAweDA1OTApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGFyYWN0ZXItYmFzZWQgQXJhYmljIHNoYXBpbmcuCisgKgorICogV2UnbGwgdXNlIGhhcmZidXp6IGFuZCBnbHlwaC1iYXNlZCBzaGFwaW5nIGluc3RlYWQgb25jZSB3ZSdyZSBzZXQgdXAgZm9yIGl0LgorICoKKyAqIEBjb250ZXh0IHRoZSB0ZXh0IGNvbnRleHQKKyAqIEBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyCisgKiBAY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCB0byByZW5kZXIsIHN0YXJ0ICsgY291bnQgIG11c3QgYmUgPD0gY29udGV4dENvdW50CisgKiBAY29udGV4dENvdW50IHRoZSBsZW5ndGggb2YgdGhlIGNvbnRleHQKKyAqIEBzaGFwZWQgd2hlcmUgdG8gcHV0IHRoZSBzaGFwZWQgdGV4dCwgbXVzdCBoYXZlIGNhcGFjaXR5IGZvciBjb3VudCB1Y2hhcnMKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc2hhcGVkIHRleHQsIG9yIC0xIGlmIGVycm9yCisgKi8KK2ludCBUZXh0TGF5b3V0OjpzaGFwZVJ0bFRleHQoY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIqIHNoYXBlZCwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICAvLyBVc2UgZml4ZWQgbGVuZ3RoIHNpbmNlIHdlIG5lZWQgdG8ga2VlcCBzdGFydCBhbmQgY291bnQgdmFsaWQKKyAgICB1X3NoYXBlQXJhYmljKGNvbnRleHQsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8IFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisKKyAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgLy8gdHJpbSBvdXQgMHhmZmZmIGZvbGxvd2luZyBsaWdhdHVyZXMsIGlmIGFueQorICAgICAgICBpbnQgZW5kID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gc3RhcnQgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSAhPSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbZW5kKytdID0gYnVmZmVyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvdW50ID0gZW5kOworICAgICAgICAvLyBMT0coTE9HX0lORk8sICJDU1JUTCIsICJzdGFydCAlZCBjb3VudCAlZCBjY291bnQgJWRcbiIsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50KTsKKyAgICAgICAgdWJpZGlfd3JpdGVSZXZlcnNlKGJ1ZmZlciwgY291bnQsIHNoYXBlZCwgY291bnQsIFVCSURJX0RPX01JUlJPUklORyB8IFVCSURJX09VVFBVVF9SRVZFUlNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVCSURJX0tFRVBfQkFTRV9DT01CSU5JTkcsICZzdGF0dXMpOworICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBCYXNpYyBjaGFyYWN0ZXItYmFzZWQgbGF5b3V0IHN1cHBvcnRpbmcgcnRsIGFuZCBhcmFiaWMgc2hhcGluZy4KKyAqIFJ1bnMgYmlkaSBvbiB0aGUgdGV4dCBhbmQgZ2VuZXJhdGVzIGEgcmVvcmRlcmVkLCBzaGFwZWQgbGluZSBpbiBidWZmZXIsIHJldHVybmluZworICogdGhlIGxlbmd0aC4KKyAqIEB0ZXh0IHRoZSB0ZXh0CisgKiBAbGVuIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgaW4gdWNoYXJzCisgKiBAZGlyIHJlY2VpdmVzIHRoZSByZXNvbHZlZCBwYXJhZ3JhcGggZGlyZWN0aW9uCisgKiBAYnVmZmVyIHRoZSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcmVvcmRlcmVkLCBzaGFwZWQgbGluZS4gIE11c3QgaGF2ZSBjYXBhY2l0eSBvZgorICogYXQgbGVhc3QgbGVuIGpjaGFycy4KKyAqIEBmbGFncyBsaW5lIGJpZGkgZmxhZ3MKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVvcmRlcmVkLCBzaGFwZWQgbGluZSwgb3IgLTEgaWYgZXJyb3IKKyAqLworamludCBUZXh0TGF5b3V0OjpsYXlvdXRMaW5lKGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBmbGFncywgaW50ICZkaXIsIGpjaGFyKiBidWZmZXIsCisgICAgICAgIFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIHN0YXRpYyBjb25zdCBpbnQgUlRMX09QVFMgPSBVQklESV9ET19NSVJST1JJTkcgfCBVQklESV9LRUVQX0JBU0VfQ09NQklOSU5HIHwKKyAgICAgICAgICAgIFVCSURJX1JFTU9WRV9CSURJX0NPTlRST0xTIHwgVUJJRElfT1VUUFVUX1JFVkVSU0U7CisKKyAgICBVQmlEaUxldmVsIGJpZGlSZXEgPSAwOworICAgIHN3aXRjaCAoZmxhZ3MpIHsKKyAgICBjYXNlIGtCaWRpX0xUUjogYmlkaVJlcSA9IDA7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBMVFIgbGV2ZWwKKyAgICBjYXNlIGtCaWRpX1JUTDogYmlkaVJlcSA9IDE7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBSVEwgbGV2ZWwKKyAgICBjYXNlIGtCaWRpX0RlZmF1bHRfTFRSOiBiaWRpUmVxID0gVUJJRElfREVGQVVMVF9MVFI7IGJyZWFrOworICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9SVEw6IGJpZGlSZXEgPSBVQklESV9ERUZBVUxUX1JUTDsgYnJlYWs7CisgICAgY2FzZSBrQmlkaV9Gb3JjZV9MVFI6IG1lbWNweShidWZmZXIsIHRleHQsIGxlbiAqIHNpemVvZihqY2hhcikpOyByZXR1cm4gbGVuOworICAgIGNhc2Uga0JpZGlfRm9yY2VfUlRMOiByZXR1cm4gc2hhcGVSdGxUZXh0KHRleHQsIDAsIGxlbiwgbGVuLCBidWZmZXIsIHN0YXR1cyk7CisgICAgfQorCisgICAgaW50MzJfdCByZXN1bHQgPSAtMTsKKworICAgIFVCaURpKiBiaWRpID0gdWJpZGlfb3BlbigpOworICAgIGlmIChiaWRpKSB7CisgICAgICAgIHViaWRpX3NldFBhcmEoYmlkaSwgdGV4dCwgbGVuLCBiaWRpUmVxLCBOVUxMLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICBkaXIgPSB1YmlkaV9nZXRQYXJhTGV2ZWwoYmlkaSkgJiAweDE7IC8vIDAgaWYgbHRyLCAxIGlmIHJ0bAorCisgICAgICAgICAgICBpbnQgcmMgPSB1YmlkaV9jb3VudFJ1bnMoYmlkaSwgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAvLyBMT0coTE9HX0lORk8sICJMQVlPVVQiLCAicGFyYSBiaWRpUmVxPSVkIGRpcj0lZCByYz0lZFxuIiwgYmlkaVJlcSwgZGlyLCByYyk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNsZW4gPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0OworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgVUJpRGlEaXJlY3Rpb24gcnVuRGlyID0gdWJpZGlfZ2V0VmlzdWFsUnVuKGJpZGksIGksICZzdGFydCwgJmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bkRpciA9PSBVQklESV9SVEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZW4gKz0gc2hhcGVSdGxUZXh0KHRleHQgKyBzdGFydCwgMCwgbGVuZ3RoLCBsZW5ndGgsIGJ1ZmZlciArIHNsZW4sIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyICsgc2xlbiwgdGV4dCArIHN0YXJ0LCBsZW5ndGggKiBzaXplb2YoamNoYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZW4gKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1YmlkaV9jbG9zZShiaWRpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIFRleHRMYXlvdXQ6OnByZXBhcmVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgY29uc3QgamNoYXIqKiBvdXRUZXh0LCBpbnQzMl90KiBvdXRCeXRlcywgamNoYXIqKiBvdXRCdWZmZXIpIHsKKyAgICBjb25zdCBqY2hhciAqd29ya1RleHQgPSB0ZXh0OworICAgIGpjaGFyICpidWZmZXIgPSBOVUxMOworICAgIGludCBkaXIgPSBrRGlyZWN0aW9uX0xUUjsKKyAgICBpZiAobmVlZHNMYXlvdXQodGV4dCwgbGVuLCBiaWRpRmxhZ3MpKSB7CisgICAgICAgIGJ1ZmZlciA9KGpjaGFyICopIG1hbGxvYyhsZW4gKiBzaXplb2YoamNoYXIpKTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgbGVuID0gbGF5b3V0TGluZSh0ZXh0LCBsZW4sIGJpZGlGbGFncywgZGlyLCBidWZmZXIsIHN0YXR1cyk7IC8vIG1pZ2h0IGNoYW5nZSBsZW4sIGRpcgorICAgICAgICBpZiAoIVVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJMQVlPVVQiLCAiZHJhd1RleHQgZXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGNhbid0IHJlbmRlcgorICAgICAgICB9CisKKyAgICAgICAgd29ya1RleHQgPSBidWZmZXI7IC8vIHVzZSB0aGUgc2hhcGVkIHRleHQKKyAgICB9CisKKyAgICBib29sIHRyaW1MZWZ0ID0gZmFsc2U7CisgICAgYm9vbCB0cmltUmlnaHQgPSBmYWxzZTsKKworICAgIFNrUGFpbnQ6OkFsaWduIGhvcml6ID0gcGFpbnQtPmdldFRleHRBbGlnbigpOworICAgIHN3aXRjaCAoaG9yaXopIHsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprTGVmdF9BbGlnbjogdHJpbUxlZnQgPSBkaXIgJiBrRGlyZWN0aW9uX01hc2s7IGJyZWFrOworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246IHRyaW1MZWZ0ID0gdHJpbVJpZ2h0ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOiB0cmltUmlnaHQgPSAhKGRpciAmIGtEaXJlY3Rpb25fTWFzayk7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgICBjb25zdCBqY2hhciogd29ya0xpbWl0ID0gd29ya1RleHQgKyBsZW47CisKKyAgICBpZiAodHJpbUxlZnQpIHsKKyAgICAgICAgd2hpbGUgKHdvcmtUZXh0IDwgd29ya0xpbWl0ICYmICp3b3JrVGV4dCA9PSAnICcpIHsKKyAgICAgICAgICAgICsrd29ya1RleHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRyaW1SaWdodCkgeworICAgICAgICB3aGlsZSAod29ya0xpbWl0ID4gd29ya1RleHQgJiYgKih3b3JrTGltaXQgLSAxKSA9PSAnICcpIHsKKyAgICAgICAgICAgIC0td29ya0xpbWl0OworICAgICAgICB9CisgICAgfQorCisgICAgKm91dEJ5dGVzID0gKHdvcmtMaW1pdCAtIHdvcmtUZXh0KSA8PCAxOworICAgICpvdXRUZXh0ID0gd29ya1RleHQ7CisgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBEcmF3cyBvciBnZXRzIHRoZSBwYXRoIG9mIGEgcGFyYWdyYXBoIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgcnVubmluZyBiaWRpIGFuZCBzaGFwaW5nLgorLy8gVGhpcyB3aWxsIGRyYXcgaWYgY2FudmFzIGlzIG5vdCBudWxsLCBvdGhlcndpc2UgcGF0aCBtdXN0IGJlIG5vbi1udWxsIGFuZCBpdCB3aWxsIGNyZWF0ZQorLy8gYSBwYXRoIHJlcHJlc2VudGluZyB0aGUgdGV4dCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBkcmF3bi4KK3ZvaWQgVGV4dExheW91dDo6aGFuZGxlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LFNrQ2FudmFzICpjYW52YXMsIFNrUGF0aCAqcGF0aCkgeworICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dDsKKyAgICBqY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQzMl90IHdvcmtCeXRlczsKKyAgICBpZiAocHJlcGFyZVRleHQocGFpbnQsIHRleHQsIGxlbiwgYmlkaUZsYWdzLCAmd29ya1RleHQsICZ3b3JrQnl0ZXMsICZidWZmZXIpKSB7CisgICAgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOworICAgICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKKyAgICAgICAgaWYgKGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dCh3b3JrVGV4dCwgd29ya0J5dGVzLCB4XywgeV8sICpwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWludC0+Z2V0VGV4dFBhdGgod29ya1RleHQsIHdvcmtCeXRlcywgeF8sIHlfLCBwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorfQorCitib29sIFRleHRMYXlvdXQ6OnByZXBhcmVSdGxUZXh0UnVuKGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUmIGNvdW50LAorICAgICAgICBqc2l6ZSBjb250ZXh0Q291bnQsIGpjaGFyKiBzaGFwZWQpIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBjb3VudCA9IHNoYXBlUnRsVGV4dChjb250ZXh0LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgc2hhcGVkLCBzdGF0dXMpOworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coTE9HX1dBUk4sICJMQVlPVVQiLCAiZHJhd1RleHRSdW4gZXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUZXh0TGF5b3V0OjpkcmF3VGV4dFJ1bihTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpckZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgICBTa1NjYWxhciB4XyA9IFNrRmxvYXRUb1NjYWxhcih4KTsKKyAgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7CisKKyAgICAgdWludDhfdCBydGwgPSBkaXJGbGFncyAmIDB4MTsKKyAgICAgaWYgKHJ0bCkgeworICAgICAgICAgU2tBdXRvU1RNYWxsb2M8ODAsIGpjaGFyPiBidWZmZXIoY29udGV4dENvdW50KTsKKyAgICAgICAgIGlmIChwcmVwYXJlUnRsVGV4dFJ1bihjaGFycywgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGJ1ZmZlci5nZXQoKSkpIHsKKyAgICAgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KGJ1ZmZlci5nZXQoKSwgY291bnQgPDwgMSwgeF8sIHlfLCAqcGFpbnQpOworICAgICAgICAgfQorICAgICB9IGVsc2UgeworICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChjaGFycyArIHN0YXJ0LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgIH0KKyB9CisKK3ZvaWQgVGV4dExheW91dDo6Z2V0VGV4dFJ1bkFkdmFuY2VzKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqY2hhcnMsIGppbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBkaXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCAqcmVzdWx0QWR2YW5jZXMsIGpmbG9hdCAmcmVzdWx0VG90YWxBZHZhbmNlKSB7CisgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICBTa1NjYWxhciogc2NhbGFyQXJyYXkgPSAoU2tTY2FsYXIgKilyZXN1bHRBZHZhbmNlczsKKyAgICByZXN1bHRUb3RhbEFkdmFuY2UgPSAwOworCisgICAgLy8gdGhpcyBpcyB3aGVyZSB3ZSdkIGNhbGwgaGFyZmJ1enoKKyAgICAvLyBmb3Igbm93IHdlIGp1c3QgdXNlIHVzaGFwZS5jCisKKyAgICBpbnQgd2lkdGhzOworICAgIGNvbnN0IGpjaGFyKiB0ZXh0OworICAgIGlmIChkaXJGbGFncyAmIDB4MSkgeyAvLyBydGwsIGNhbGwgYXJhYmljIHNoYXBpbmcgaW4gY2FzZQorICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgICAgIHVfc2hhcGVBcmFiaWMoY2hhcnMsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8IFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisgICAgICAgIC8vIHdlIHNob3VsZG4ndCBmYWlsIHVubGVzcyB0aGVyZSdzIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLAorICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlJ3JlIGhvc2VkIGFueXdheQorICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgY291bnQ7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICBpZiAoYnVmZmVyW2ldID09IDB4ZmZmZikgeworICAgICAgICAgICAgYnVmZmVyW2ldID0gMHgyMDBiOyAvLyB6ZXJvLXdpZHRoLXNwYWNlIGZvciBza2lhCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRleHQgPSBidWZmZXIgKyBzdGFydDsKKyAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRleHQgPSBjaGFycyArIHN0YXJ0OworICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyh0ZXh0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgfQorCisgICAgaWYgKHdpZHRocyA8IGNvdW50KSB7CisgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkKKyAgICAgICAgLy8gb25lIHZhbHVlLiBFeHBhbmQgdGhlIHJlc3VsdCBzbyB3ZSBoYXZlIG9uZSB2YWx1ZSBwZXIgVVRGLTE2IGNvZGUgdW5pdC4KKworICAgICAgICAvLyBOb3RlLCBza2lhJ3MgZ2V0VGV4dFdpZHRoIGdldHMgY29uZnVzZWQgaWYgaXQgZW5jb3VudGVycyBhIHN1cnJvZ2F0ZSBwYWlyLAorICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHAgPSAwOyBpIDwgd2lkdGhzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdFRvdGFsQWR2YW5jZSArPSByZXN1bHRBZHZhbmNlc1twKytdID0gU2tTY2FsYXJUb0Zsb2F0KHNjYWxhckFycmF5W2ldKTsKKyAgICAgICAgICAgIGlmIChwIDwgY291bnQgJiYgdGV4dFtwXSA+PSAweGRjMDAgJiYgdGV4dFtwXSA8IDB4ZTAwMCAmJgorICAgICAgICAgICAgICAgICAgICB0ZXh0W3AtMV0gPj0gMHhkODAwICYmIHRleHRbcC0xXSA8IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdEFkdmFuY2VzW3ArK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRUb3RhbEFkdmFuY2UgKz0gcmVzdWx0QWR2YW5jZXNbaV0gPSBTa1NjYWxhclRvRmxvYXQoc2NhbGFyQXJyYXlbaV0pOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vIERyYXdzIGEgcGFyYWdyYXBoIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgcnVubmluZyBiaWRpIGFuZCBzaGFwaW5nCit2b2lkIFRleHRMYXlvdXQ6OmRyYXdUZXh0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgIGhhbmRsZVRleHQocGFpbnQsIHRleHQsIGxlbiwgYmlkaUZsYWdzLCB4LCB5LCBjYW52YXMsIE5VTEwpOworfQorCit2b2lkIFRleHRMYXlvdXQ6OmdldFRleHRQYXRoKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpIHsKKyAgICBoYW5kbGVUZXh0KHBhaW50LCB0ZXh0LCBsZW4sIGJpZGlGbGFncywgeCwgeSwgTlVMTCwgcGF0aCk7Cit9CisKKwordm9pZCBUZXh0TGF5b3V0OjpkcmF3VGV4dE9uUGF0aChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgIFNrU2NhbGFyIGhfID0gU2tGbG9hdFRvU2NhbGFyKGhPZmZzZXQpOworICAgIFNrU2NhbGFyIHZfID0gU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpOworCisgICAgaWYgKCFuZWVkc0xheW91dCh0ZXh0LCBjb3VudCwgYmlkaUZsYWdzKSkgeworICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dCwgY291bnQgPDwgMSwgKnBhdGgsIGhfLCB2XywgKnBhaW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNrQXV0b1NUTWFsbG9jPDgwLCBqY2hhcj4gYnVmZmVyKGNvdW50KTsKKyAgICBpbnQgZGlyID0ga0RpcmVjdGlvbl9MVFI7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgY291bnQgPSBsYXlvdXRMaW5lKHRleHQsIGNvdW50LCBiaWRpRmxhZ3MsIGRpciwgYnVmZmVyLmdldCgpLCBzdGF0dXMpOworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYoYnVmZmVyLmdldCgpLCBjb3VudCA8PCAxLCAqcGF0aCwgaF8sIHZfLCAqcGFpbnQpOworICAgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmggYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgIlNrQ2FudmFzLmgiCisjaW5jbHVkZSAiU2tQYWludC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dExheW91dCB7CitwdWJsaWM6CisKKyAgICBlbnVtIHsKKyAgICAgICAga0RpcmVjdGlvbl9MVFIgPSAwLAorICAgICAgICBrRGlyZWN0aW9uX1JUTCA9IDEsCisKKyAgICAgICAga0RpcmVjdGlvbl9NYXNrID0gMHgxCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrQmlkaV9MVFIgPSAwLAorICAgICAgICBrQmlkaV9SVEwgPSAxLAorICAgICAgICBrQmlkaV9EZWZhdWx0X0xUUiA9IDIsCisgICAgICAgIGtCaWRpX0RlZmF1bHRfUlRMID0gMywKKyAgICAgICAga0JpZGlfRm9yY2VfTFRSID0gNCwKKyAgICAgICAga0JpZGlfRm9yY2VfUlRMID0gNSwKKworICAgICAgICBrQmlkaV9NYXNrID0gMHg3CisgICAgfTsKKworICAgIC8qCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bihTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKTsKKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRSdW5BZHZhbmNlcyhTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKmNoYXJzLCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBkaXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0ICpyZXN1bHRBZHZhbmNlcywgamZsb2F0ICZyZXN1bHRUb3RhbEFkdmFuY2UpOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcyk7CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGgoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgU2tDYW52YXMqIGNhbnZhcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBzdGF0aWMgYm9vbCBwcmVwYXJlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwgamludCBiaWRpRmxhZ3MsCisgICAgICAgIGNvbnN0IGpjaGFyKiogb3V0VGV4dCwgaW50MzJfdCogb3V0Qnl0ZXMsIGpjaGFyKiogb3V0QnVmZmVyKTsKKyAgICBzdGF0aWMgYm9vbCBwcmVwYXJlUnRsVGV4dFJ1bihjb25zdCBqY2hhciogY29udGV4dCwganNpemUgc3RhcnQsIGpzaXplJiBjb3VudCwKKyAgICAgICAganNpemUgY29udGV4dENvdW50LCBqY2hhciogc2hhcGVkKTsKKyAgICAgICAgCisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgbmVlZHNMYXlvdXQoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGJpZGlGbGFncyk7CisgICAgc3RhdGljIGludCBzaGFwZVJ0bFRleHQoY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyKiBzaGFwZWQsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgICAgc3RhdGljIGppbnQgbGF5b3V0TGluZShjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgZmxhZ3MsIGludCAmZGlyLCBqY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgICBzdGF0aWMgdm9pZCBoYW5kbGVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LFNrQ2FudmFzICpjYW52YXMsIFNrUGF0aCAqcGF0aCk7Cit9OworCit9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwCmluZGV4IDdjN2JmZWIuLjFmZTcyZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwCkBAIC0xMzAsNyArMTMwLDEzIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICAKLSAgICByZXR1cm4gU2tUeXBlZmFjZTo6Q3JlYXRlRnJvbVN0cmVhbShuZXcgQXNzZXRTdHJlYW0oYXNzZXQsIHRydWUpKTsKKyAgICBTa1N0cmVhbSogc3RyZWFtID0gbmV3IEFzc2V0U3RyZWFtKGFzc2V0LCB0cnVlKTsKKyAgICBTa1R5cGVmYWNlKiBmYWNlID0gU2tUeXBlZmFjZTo6Q3JlYXRlRnJvbVN0cmVhbShzdHJlYW0pOworICAgIC8vIFNrVHlwZUZhY2U6OkNyZWF0ZUZyb21TdHJlYW0gY2FsbHMgcmVmKCkgb24gdGhlIHN0cmVhbSwgc28gd2UKKyAgICAvLyBuZWVkIHRvIHVucmVmIGl0IGhlcmUgb3IgaXQgd29uJ3QgYmUgZnJlZWQgbGF0ZXIgb24KKyAgICBzdHJlYW0tPnVucmVmKCk7CisKKyAgICByZXR1cm4gZmFjZTsKIH0KIAogc3RhdGljIFNrVHlwZWZhY2UqIFR5cGVmYWNlX2NyZWF0ZUZyb21GaWxlKEpOSUVudiogZW52LCBqb2JqZWN0LCBqc3RyaW5nIGpwYXRoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlNDQwOS4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjg5ICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJibHVldG9vdGhfU2NvU29ja2V0LmNwcCIKLQotI2luY2x1ZGUgImFuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIgotI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJ1dGlscy9taXNjLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0jaW5jbHVkZSA8c3lzL3BvbGwuaD4KLQotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0jaW5jbHVkZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGJsdWV0b290aC9zY28uaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvaGNpLmg+Ci0KLSNkZWZpbmUgTUFYX0xJTkUgMjU1Ci0KLS8qCi0gKiBEZWZpbmVzIHRoZSBtb2R1bGUgc3RyaW5ncyB1c2VkIGluIHRoZSBibGFja2xpc3QgZmlsZS4KLSAqIFRoZXNlIGFyZSB1c2VkIGJ5IGNvbnN1bWVycyBvZiB0aGUgYmxhY2tsaXN0IGZpbGUgdG8gc2VlIGlmIHRoZSBsaW5lIGlzCi0gKiB1c2VkIGJ5IHRoYXQgbW9kdWxlLgotICovCi0jZGVmaW5lIFNDT19CTEFDS0xJU1RfTU9EVUxFX05BTUUgInNjb1NvY2tldCIKLQotCi0vKiBEZWZpbmUgdGhlIHR5cGUgc3RyaW5ncyB1c2VkIGluIHRoZSBibGFja2xpc3QgZmlsZS4gKi8KLSNkZWZpbmUgQkxBQ0tMSVNUX0JZX05BTUUgIm5hbWUiCi0jZGVmaW5lIEJMQUNLTElTVF9CWV9QQVJUSUFMX05BTUUgInBhcnRpYWxfbmFtZSIKLSNkZWZpbmUgQkxBQ0tMSVNUX0JZX09VSSAidmVuZG9yX291aSIKLQotI2VuZGlmCi0KLS8qIElkZWFsbHksIGJsb2NraW5nIEkvTyBvbiBhIFNDTyBzb2NrZXQgd291bGQgcmV0dXJuIHdoZW4gYW5vdGhlciB0aHJlYWQKLSAqIGNhbGxzIGNsb3NlKCkuIEhvd2V2ZXIgaXQgZG9lcyBub3QgcmlnaHQgbm93LCBpbiBmYWN0IGNsb3NlKCkgb24gYSBTQ08KLSAqIHNvY2tldCBoYXMgc3RyYW5nZSBiZWhhdmlvciAocmV0dXJucyBhIGJvZ3VzIHZhbHVlKSB3aGVuIG90aGVyIHRocmVhZHMKLSAqIGFyZSBwZXJmb3JtaW5nIGJsb2NraW5nIEkvTyBvbiB0aGF0IHNvY2tldC4gU28sIHRvIHdvcmthcm91bmQsIHdlIGFsd2F5cwotICogY2FsbCBjbG9zZSgpIGZyb20gdGhlIHNhbWUgdGhyZWFkIHRoYXQgZG9lcyBibG9ja2luZyBJL08uIFRoaXMgcmVxdWlyZXMgdGhlCi0gKiB1c2Ugb2YgYSBzb2NrZXRwYWlyIHRvIHNpZ25hbCB0aGUgYmxvY2tpbmcgSS9PIHRvIGFib3J0LgotICoKLSAqIFVuZm9ydHVuYXRlbHkgSSBkb24ndCBrbm93IGEgd2F5IHRvIGFib3J0IGNvbm5lY3QoKSB5ZXQsIGJ1dCBhdCBsZWFzdCB0aGlzCi0gKiB0aW1lcyBvdXQgYWZ0ZXIgdGhlIEJUIHBhZ2UgdGltZW91dCAoMTAgc2Vjb25kcyBjdXJyZW50bHkpLCBzbyB0aGUgdGhyZWFkCi0gKiB3aWxsIGRpZSBldmVudHVhbGx5LiBUaGUgZmFjdCB0aGF0IHRoZSB0aHJlYWQgY2FuIG91dGxpdmUKLSAqIHRoZSBKYXZhIG9iamVjdCBmb3JjZXMgdXMgdG8gdXNlIGEgbXV0ZXggaW4gZGVzdG9yeU5hdGl2ZSgpLgotICoKLSAqIFRoZSBKTkkgQVBJIGlzIGVudGlyZWx5IGFzeW5jLgotICoKLSAqIEFsc28gbm90ZSB0aGlzIGNsYXNzIGRlYWxzIG9ubHkgd2l0aCBTQ08gY29ubmVjdGlvbnMsIG5vdCB3aXRoIGRhdGEKLSAqIHRyYW5zbWlzc2lvbi4KLSAqLwotbmFtZXNwYWNlIGFuZHJvaWQgewotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0KLXN0YXRpYyBKYXZhVk0gKmp2bTsKLXN0YXRpYyBqZmllbGRJRCBmaWVsZF9tTmF0aXZlRGF0YTsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQWNjZXB0ZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNvbm5lY3RlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ2xvc2VkOwotCi1zdHJ1Y3QgdGhyZWFkX2RhdGFfdDsKLXN0YXRpYyB2b2lkICp3b3JrX3RocmVhZCh2b2lkICphcmcpOwotc3RhdGljIGludCBjb25uZWN0X3dvcmsoY29uc3QgY2hhciAqYWRkcmVzcywgdWludDE2X3Qgc2NvX3BrdF90eXBlKTsKLXN0YXRpYyBpbnQgYWNjZXB0X3dvcmsoaW50IHNpZ25hbF9zayk7Ci1zdGF0aWMgdm9pZCB3YWl0X2Zvcl9jbG9zZShpbnQgc2ssIGludCBzaWduYWxfc2spOwotc3RhdGljIHZvaWQgY2xvc2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0KTsKLQotc3RhdGljIHZvaWQgcGFyc2VCbGFja2xpc3Qodm9pZCk7Ci1zdGF0aWMgdWludDE2X3QgZ2V0U2NvVHlwZShjaGFyICphZGRyZXNzLCBjb25zdCBjaGFyICpuYW1lKTsKLQotI2RlZmluZSBDT01QQVJFX1NUUklORyhrZXksIHMpICghc3RybmNtcChrZXksIHMsIHN0cmxlbihzKSkpCi0KLS8qIEJsYWNrbGlzdCBkYXRhICovCi10eXBlZGVmIHN0cnVjdCBzY29CbGFja2xpc3QgewotICAgIGludCBmaWVsZFR5cGU7Ci0gICAgY2hhciAqdmFsdWU7Ci0gICAgdWludDE2X3Qgc2NvVHlwZTsKLSAgICBzdHJ1Y3Qgc2NvQmxhY2tsaXN0ICpuZXh0OwotfSBzY29CbGFja2xpc3RfdDsKLQotI2RlZmluZSBCTF9UWVBFX05BTUUgMSAgIC8vIEZpZWxkIHR5cGUgaXMgbmFtZSBzdHJpbmcKLQotc3RhdGljIHNjb0JsYWNrbGlzdF90ICpibGFja2xpc3QgPSBOVUxMOwotCi0vKiBzaGFyZWQgbmF0aXZlIGRhdGEgLSBwcm90ZWN0ZWQgYnkgbXV0ZXggKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Ci0gICAgaW50IHNpZ25hbF9zazsgICAgICAgIC8vIHNvY2tldCB0byBzaWduYWwgYmxvY2tlZCBJL08gdG8gdW5ibG9jawotICAgIGpvYmplY3Qgb2JqZWN0OyAgICAgICAvLyBKTkkgZ2xvYmFsIHJlZiB0byB0aGUgSmF2YSBvYmplY3QKLSAgICB0aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YTsgIC8vIHBvaW50ZXIgdG8gdGhyZWFkIGxvY2FsIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heCAxIHRocmVhZCBwZXIgc2NvIHNvY2tldAotfSBuYXRpdmVfZGF0YV90OwotCi0vKiB0aHJlYWQgbG9jYWwgZGF0YSAqLwotc3RydWN0IHRocmVhZF9kYXRhX3QgewotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdDsKLSAgICBib29sIGlzX2FjY2VwdDsgICAgICAgIC8vIGFjY2VwdCAobGlzdGVuaW5nKSBvciBjb25uZWN0IChvdXRnb2luZykgdGhyZWFkCi0gICAgaW50IHNpZ25hbF9zazsgICAgICAgICAvLyBzb2NrZXQgZm9yIHRocmVhZCB0byBsaXN0ZW4gZm9yIHVuYmxvY2sgc2lnbmFsCi0gICAgY2hhciBhZGRyZXNzW0JUQUREUl9TSVpFXTsgIC8vIEJUIGFkZHJlcyBhcyBzdHJpbmcKLSAgICB1aW50MTZfdCBzY29fcGt0X3R5cGU7ICAgLy8gU0NPIHBhY2tldCB0eXBlcyBzdXBwb3J0ZWQKLX07Ci0KLXN0YXRpYyBpbmxpbmUgbmF0aXZlX2RhdGFfdCAqIGdldF9uYXRpdmVfZGF0YShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICByZXR1cm4gKG5hdGl2ZV9kYXRhX3QgKikoZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIGZpZWxkX21OYXRpdmVEYXRhKSk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzdHIyc2NvVHlwZSAoY2hhciAqa2V5KSB7Ci0gICAgTE9HVigiJXM6IGtleSA9ICVzIiwgX19GVU5DVElPTl9fLCBrZXkpOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0hWMSIpKQotICAgICAgICByZXR1cm4gRVNDT19IVjE7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fSFYyIikpCi0gICAgICAgIHJldHVybiBFU0NPX0hWMjsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19IVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fSFYzOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0VWMyIpKQotICAgICAgICByZXR1cm4gRVNDT19FVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fRVY0IikpCi0gICAgICAgIHJldHVybiBFU0NPX0VWNDsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19FVjUiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fRVY1OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzJFVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fMkVWMzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT18zRVYzIikpCi0gICAgICAgIHJldHVybiBFU0NPXzNFVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fMkVWNSIpKQotICAgICAgICByZXR1cm4gRVNDT18yRVY1OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzNFVjUiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fM0VWNTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiU0NPX0VTQ09fTUFTSyIpKQotICAgICAgICByZXR1cm4gU0NPX0VTQ09fTUFTSzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRURSX0VTQ09fTUFTSyIpKQotICAgICAgICByZXR1cm4gRURSX0VTQ09fTUFTSzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiQUxMX0VTQ09fTUFTSyIpKQotICAgICAgICByZXR1cm4gQUxMX0VTQ09fTUFTSzsKLSAgICBMT0dFKCJVbmtub3duIFNDTyBUeXBlICglcykgc2tpcHBpbmciLGtleSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlQmxhY2tsaXN0KHZvaWQpIHsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9ICIvZXRjL2JsdWV0b290aC9ibGFja2xpc3QuY29uZiI7Ci0gICAgY2hhciBsaW5lW01BWF9MSU5FXTsKLSAgICBzY29CbGFja2xpc3RfdCAqbGlzdCA9IE5VTEw7Ci0gICAgc2NvQmxhY2tsaXN0X3QgKm5ld2VsZW07Ci0KLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0KLSAgICAvKiBPcGVuIGZpbGUgKi8KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotICAgIGlmKCFmcCkgewotICAgICAgICBMT0dFKCJFcnJvciglcylvcGVuaW5nIGJsYWNrbGlzdCBmaWxlIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBNQVhfTElORSwgZnApICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChDT01QQVJFX1NUUklORyhsaW5lLCAiLy8iKSkgfHwgKCFzdHJjbXAobGluZSwgIiIpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBjaGFyICptb2R1bGUgPSBzdHJ0b2sobGluZSwiOiIpOwotICAgICAgICBpZiAoQ09NUEFSRV9TVFJJTkcobW9kdWxlLCBTQ09fQkxBQ0tMSVNUX01PRFVMRV9OQU1FKSkgewotICAgICAgICAgICAgbmV3ZWxlbSA9IChzY29CbGFja2xpc3RfdCAqKWNhbGxvYygxLCBzaXplb2Yoc2NvQmxhY2tsaXN0X3QpKTsKLSAgICAgICAgICAgIGlmIChuZXdlbGVtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHBhcnNlIGxpbmUKLSAgICAgICAgICAgIGNoYXIgKnR5cGUgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLSAgICAgICAgICAgIGNoYXIgKnZhbHVlTGlzdCA9IHN0cnRvayhOVUxMLCAiLCIpOwotICAgICAgICAgICAgY2hhciAqcGFyYW1MaXN0ID0gc3RydG9rKE5VTEwsICIsIik7Ci0gICAgICAgICAgICBpZiAoQ09NUEFSRV9TVFJJTkcodHlwZSwgQkxBQ0tMSVNUX0JZX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBOYW1lIGZyb20gVmFsdWUgbGlzdAotICAgICAgICAgICAgICAgIG5ld2VsZW0tPmZpZWxkVHlwZSA9IEJMX1RZUEVfTkFNRTsKLSAgICAgICAgICAgICAgICBuZXdlbGVtLT52YWx1ZSA9IChjaGFyICopY2FsbG9jKDEsIHN0cmxlbih2YWx1ZUxpc3QpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3ZWxlbS0+dmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWVMaXN0Kys7ICAvLyBTa2lwIG9wZW4gcXVvdGUKLSAgICAgICAgICAgICAgICBzdHJuY3B5KG5ld2VsZW0tPnZhbHVlLCB2YWx1ZUxpc3QsIHN0cmxlbih2YWx1ZUxpc3QpIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgU2NvIFNldHRpbmdzIGZyb20gUGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gc3RydG9rKHBhcmFtTGlzdCwgIjsiKTsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBzY29UeXBlcyA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2NvOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1bMF0gPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NvID0gc3RyMnNjb1R5cGUocGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjbyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb1R5cGVzICY9IH5zY287Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1bMF0gPT0gJysnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NvID0gc3RyMnNjb1R5cGUocGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjbyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb1R5cGVzIHw9IHNjbzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbVswXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY28gPSBzdHIyc2NvVHlwZShwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvVHlwZXMgPSBzY287Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIFNDTyB0eXBlIG11c3QgYmUgPSwgKyBvciAtIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBzdHJ0b2soTlVMTCwgIjsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3ZWxlbS0+c2NvVHlwZSA9IHNjb1R5cGVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJVbmtub3duIFNDTyB0eXBlIGVudHJ5IGluIEJsYWNrbGlzdCBmaWxlIik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGlzdCkgewotICAgICAgICAgICAgICAgIGxpc3QtPm5leHQgPSBuZXdlbGVtOwotICAgICAgICAgICAgICAgIGxpc3QgPSBuZXdlbGVtOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBibGFja2xpc3QgPSBsaXN0ID0gbmV3ZWxlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPR0koIkVudHJ5IG5hbWUgPSAlcyBTY29UeXBlcyA9IDB4JXgiLCBuZXdlbGVtLT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgbmV3ZWxlbS0+c2NvVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKGZwKTsKLSAgICByZXR1cm47Ci19Ci1zdGF0aWMgdWludDE2X3QgZ2V0U2NvVHlwZShjaGFyICphZGRyZXNzLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgdWludDE2X3QgcmV0ID0gMDsKLSAgICBzY29CbGFja2xpc3RfdCAqbGlzdCA9IGJsYWNrbGlzdDsKLQotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGxpc3QtPmZpZWxkVHlwZSA9PSBCTF9UWVBFX05BTUUpIHsKLSAgICAgICAgICAgIGlmIChDT01QQVJFX1NUUklORyhuYW1lLCBsaXN0LT52YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBsaXN0LT5zY29UeXBlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgICBMT0dJKCIlcyAlcyAtIDB4JXgiLCAgX19GVU5DVElPTl9fLCBuYW1lLCByZXQpOwotICAgIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgY2xhc3NJbml0TmF0aXZlKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBpZiAoZW52LT5HZXRKYXZhVk0oJmp2bSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIkNvdWxkIG5vdCBnZXQgaGFuZGxlIHRvIHRoZSBWTSIpOwotICAgIH0KLSAgICBmaWVsZF9tTmF0aXZlRGF0YSA9IGdldF9maWVsZChlbnYsIGNsYXp6LCAibU5hdGl2ZURhdGEiLCAiSSIpOwotICAgIG1ldGhvZF9vbkFjY2VwdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQWNjZXB0ZWQiLCAiKEkpViIpOwotICAgIG1ldGhvZF9vbkNvbm5lY3RlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkNvbm5lY3RlZCIsICIoSSlWIik7Ci0gICAgbWV0aG9kX29uQ2xvc2VkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQ2xvc2VkIiwgIigpViIpOwotCi0gICAgLyogUmVhZCB0aGUgYmxhY2tsaXN0IGZpbGUgaW4gaGVyZSAqLwotICAgIHBhcnNlQmxhY2tsaXN0KCk7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJucyBmYWxzZSBpZiBhIHNlcmlvdXMgZXJyb3Igb2NjdXJlZCAqLwotc3RhdGljIGpib29sZWFuIGluaXROYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0KLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSAobmF0aXZlX2RhdGFfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKG5hdGl2ZV9kYXRhX3QpKTsKLSAgICBpZiAobmF0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X2luaXQoJm5hdC0+bXV0ZXgsIE5VTEwpOwotICAgIGVudi0+U2V0SW50RmllbGQob2JqZWN0LCBmaWVsZF9tTmF0aXZlRGF0YSwgKGppbnQpbmF0KTsKLSAgICBuYXQtPnNpZ25hbF9zayA9IC0xOwotICAgIG5hdC0+b2JqZWN0ID0gTlVMTDsKLSAgICBuYXQtPnRocmVhZF9kYXRhID0gTlVMTDsKLQotI2VuZGlmCi0gICAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgCi0gICAgY2xvc2VOYXRpdmUoZW52LCBvYmplY3QpOwotICAgIAotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgaWYgKG5hdC0+dGhyZWFkX2RhdGEgIT0gTlVMTCkgewotICAgICAgICBuYXQtPnRocmVhZF9kYXRhLT5uYXQgPSBOVUxMOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZuYXQtPm11dGV4KTsKLQotICAgIGZyZWUobmF0KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgamJvb2xlYW4gYWNjZXB0TmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgaW50IHNpZ25hbF9za3NbMl07Ci0gICAgcHRocmVhZF90IHRocmVhZDsKLSAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfdCAqZGF0YSA9IE5VTEw7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIGlmIChuYXQtPnNpZ25hbF9zayAhPSAtMSkgewotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gc2V0dXAgc29ja2V0cGFpciB0byBwYXNzIG1lc3NhZ2VzIGJldHdlZW4gdGhyZWFkcwotICAgIGlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzaWduYWxfc2tzKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHNvY2tldHBhaXIoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIG5hdC0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1swXTsKLSAgICBuYXQtPm9iamVjdCA9IGVudi0+TmV3R2xvYmFsUmVmKG9iamVjdCk7Ci0KLSAgICBkYXRhID0gKHRocmVhZF9kYXRhX3QgKiljYWxsb2MoMSwgc2l6ZW9mKHRocmVhZF9kYXRhX3QpKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBuYXQtPnRocmVhZF9kYXRhID0gZGF0YTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0KLSAgICBkYXRhLT5zaWduYWxfc2sgPSBzaWduYWxfc2tzWzFdOwotICAgIGRhdGEtPm5hdCA9IG5hdDsKLSAgICBkYXRhLT5pc19hY2NlcHQgPSB0cnVlOwotCi0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsIE5VTEwsICZ3b3JrX3RocmVhZCwgKHZvaWQgKilkYXRhKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHB0aHJlYWRfY3JlYXRlKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEpOSV9UUlVFOwotCi0jZW5kaWYKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gY29ubmVjdE5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgYWRkcmVzcywKLSAgICAgICAganN0cmluZyBuYW1lKSB7Ci0KLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIGludCBzaWduYWxfc2tzWzJdOwotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0gICAgc3RydWN0IHRocmVhZF9kYXRhX3QgKmRhdGE7Ci0gICAgY29uc3QgY2hhciAqY19hZGRyZXNzOwotICAgIGNvbnN0IGNoYXIgKmNfbmFtZTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgaWYgKG5hdC0+c2lnbmFsX3NrICE9IC0xKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBzZXR1cCBzb2NrZXRwYWlyIHRvIHBhc3MgbWVzc2FnZXMgYmV0d2VlbiB0aHJlYWRzCi0gICAgaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNpZ25hbF9za3MpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogc29ja2V0cGFpcigpIGZhaWxlZDogJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBuYXQtPnNpZ25hbF9zayA9IHNpZ25hbF9za3NbMF07Ci0gICAgbmF0LT5vYmplY3QgPSBlbnYtPk5ld0dsb2JhbFJlZihvYmplY3QpOwotCi0gICAgZGF0YSA9ICh0aHJlYWRfZGF0YV90ICopY2FsbG9jKDEsIHNpemVvZih0aHJlYWRfZGF0YV90KSk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotCi0gICAgZGF0YS0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1sxXTsKLSAgICBkYXRhLT5uYXQgPSBuYXQ7Ci0gICAgY19hZGRyZXNzID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhhZGRyZXNzLCBOVUxMKTsKLSAgICBzdHJsY3B5KGRhdGEtPmFkZHJlc3MsIGNfYWRkcmVzcywgQlRBRERSX1NJWkUpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGFkZHJlc3MsIGNfYWRkcmVzcyk7Ci0gICAgZGF0YS0+aXNfYWNjZXB0ID0gZmFsc2U7Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBOdWxsIHBvaW50ZXIgcGFzc2VkIGluIGZvciBkZXZpY2UgbmFtZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRhdGEtPnNjb19wa3RfdHlwZSA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY19uYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICAgICAgLyogU2VlIGlmIHRoaXMgZGV2aWNlIGlzIGluIHRoZSBibGFjayBsaXN0ICovCi0gICAgICAgIGRhdGEtPnNjb19wa3RfdHlwZSA9IGdldFNjb1R5cGUoZGF0YS0+YWRkcmVzcywgY19uYW1lKTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobmFtZSwgY19uYW1lKTsKLSAgICB9Ci0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsIE5VTEwsICZ3b3JrX3RocmVhZCwgKHZvaWQgKilkYXRhKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHB0aHJlYWRfY3JlYXRlKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEpOSV9UUlVFOwotCi0jZW5kaWYKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgdm9pZCBjbG9zZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIGludCBzaWduYWxfc2s7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIHNpZ25hbF9zayA9IG5hdC0+c2lnbmFsX3NrOwotICAgIG5hdC0+c2lnbmFsX3NrID0gLTE7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobmF0LT5vYmplY3QpOwotICAgIG5hdC0+b2JqZWN0ID0gTlVMTDsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0KLSAgICBpZiAoc2lnbmFsX3NrID49IDApIHsKLSAgICAgICAgTE9HVigiJXM6IHNpZ25hbF9zayA9ICVkIiwgX19GVU5DVElPTl9fLCBzaWduYWxfc2spOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGR1bW15OwotICAgICAgICB3cml0ZShzaWduYWxfc2ssICZkdW1teSwgc2l6ZW9mKGR1bW15KSk7Ci0gICAgICAgIGNsb3NlKHNpZ25hbF9zayk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLSNpZmRlZiBIQVZFX0JMVUVUT09USAotLyogdGhyZWFkIGVudHJ5IHBvaW50ICovCi1zdGF0aWMgdm9pZCAqd29ya190aHJlYWQodm9pZCAqYXJnKSB7Ci0gICAgSk5JRW52KiBlbnY7Ci0gICAgdGhyZWFkX2RhdGFfdCAqZGF0YSA9ICh0aHJlYWRfZGF0YV90ICopYXJnOwotICAgIGludCBzazsKLQotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBpZiAoanZtLT5BdHRhY2hDdXJyZW50VGhyZWFkKCZlbnYsIE5VTEwpICE9IEpOSV9PSykgewotICAgICAgICBMT0dFKCIlczogQXR0YWNoQ3VycmVudFRocmVhZCgpIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIGNvbm5lY3QgdGhlIFNDTyBzb2NrZXQgKi8KLSAgICBpZiAoZGF0YS0+aXNfYWNjZXB0KSB7Ci0gICAgICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgQUNDRVBUICMjIyMjIiwgZGF0YS0+bmF0LT5vYmplY3QpOwotICAgICAgICBzayA9IGFjY2VwdF93b3JrKGRhdGEtPnNpZ25hbF9zayk7Ci0gICAgICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgRU5EIEFDQ0VQVCAqKioqKiIsIGRhdGEtPm5hdC0+b2JqZWN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBzayA9IGNvbm5lY3Rfd29yayhkYXRhLT5hZGRyZXNzLCBkYXRhLT5zY29fcGt0X3R5cGUpOwotICAgIH0KLQotICAgIC8qIGNhbGxiYWNrIHdpdGggY29ubmVjdGlvbiByZXN1bHQgKi8KLSAgICBpZiAoZGF0YS0+bmF0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVigiJXM6IG9iamVjdCBkZXN0cm95ZWQhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgIGlmIChkYXRhLT5uYXQtPm9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICAgICAgTE9HVigiJXM6IGNhbGxiYWNrIGNhbmNlbGxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgaWYgKGRhdGEtPmlzX2FjY2VwdCkgewotICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGRhdGEtPm5hdC0+b2JqZWN0LCBtZXRob2Rfb25BY2NlcHRlZCwgc2spOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZGF0YS0+bmF0LT5vYmplY3QsIG1ldGhvZF9vbkNvbm5lY3RlZCwgc2spOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0KLSAgICBpZiAoc2sgPCAwKSB7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0KLSAgICBMT0dWKCJTQ08gT0JKRUNUICVwICVkIENPTk5FQ1RFRCArKysgKCVzKSIsIGRhdGEtPm5hdC0+b2JqZWN0LCBzaywKLSAgICAgICAgIGRhdGEtPmlzX2FjY2VwdCA/ICJpbiIgOiAib3V0Iik7Ci0KLSAgICAvKiB3YWl0IGZvciB0aGUgc29ja2V0IHRvIGNsb3NlICovCi0gICAgTE9HVigid2FpdF9mb3JfY2xvc2UoKS4uLiIpOwotICAgIHdhaXRfZm9yX2Nsb3NlKHNrLCBkYXRhLT5zaWduYWxfc2spOwotICAgIExPR1YoIndhaXRfZm9yX2Nsb3NlKCkgcmV0dXJuZWQiKTsKLQotICAgIC8qIGNhbGxiYWNrIHdpdGggY2xvc2UgcmVzdWx0ICovCi0gICAgaWYgKGRhdGEtPm5hdCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1YoIiVzOiBvYmplY3QgZGVzdHJveWVkISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICBpZiAoZGF0YS0+bmF0LT5vYmplY3QgPT0gTlVMTCkgewotICAgICAgICBMT0dWKCIlczogY2FsbGJhY2sgY2FuY2VsbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGRhdGEtPm5hdC0+b2JqZWN0LCBtZXRob2Rfb25DbG9zZWQpOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0KLWRvbmU6Ci0gICAgaWYgKHNrID49IDApIHsKLSAgICAgICAgY2xvc2Uoc2spOwotICAgICAgICBMT0dWKCJTQ08gT0JKRUNUICVwICVkIENMT1NFRCAtLS0gKCVzKSIsIGRhdGEtPm5hdC0+b2JqZWN0LCBzaywgZGF0YS0+aXNfYWNjZXB0ID8gImluIiA6ICJvdXQiKTsKLSAgICB9Ci0gICAgaWYgKGRhdGEtPnNpZ25hbF9zayA+PSAwKSB7Ci0gICAgICAgIGNsb3NlKGRhdGEtPnNpZ25hbF9zayk7Ci0gICAgfQotICAgIExPR1YoIlNDTyBzb2NrZXQgY2xvc2VkIik7Ci0KLSAgICBpZiAoZGF0YS0+bmF0ICE9IE5VTEwpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYoZGF0YS0+bmF0LT5vYmplY3QpOwotICAgICAgICBkYXRhLT5uYXQtPm9iamVjdCA9IE5VTEw7Ci0gICAgICAgIGRhdGEtPm5hdC0+dGhyZWFkX2RhdGEgPSBOVUxMOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgfQotCi0gICAgZnJlZShkYXRhKTsKLSAgICBpZiAoanZtLT5EZXRhY2hDdXJyZW50VGhyZWFkKCkgIT0gSk5JX09LKSB7Ci0gICAgICAgIExPR0UoIiVzOiBEZXRhY2hDdXJyZW50VGhyZWFkKCkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0KLSAgICBMT0dWKCJ3b3JrX3RocmVhZCgpIGRvbmUiKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBhY2NlcHRfd29yayhpbnQgc2lnbmFsX3NrKSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIGludCBzazsKLSAgICBpbnQgbnNrOwotICAgIGludCBhZGRyX3N6OwotICAgIGludCBtYXhfZmQ7Ci0gICAgZmRfc2V0IGZkczsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc2NvIGFkZHI7Ci0KLSAgICBzayA9IHNvY2tldChQRl9CTFVFVE9PVEgsIFNPQ0tfU0VRUEFDS0VULCBCVFBST1RPX1NDTyk7Ci0gICAgaWYgKHNrIDwgMCkgewotICAgICAgICBMT0dFKCIlcyBzb2NrZXQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHIuc2NvX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLSAgICBtZW1jcHkoJmFkZHIuc2NvX2JkYWRkciwgQkRBRERSX0FOWSwgc2l6ZW9mKGJkYWRkcl90KSk7Ci0gICAgaWYgKGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzIGJpbmQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmIChsaXN0ZW4oc2ssIDEpKSB7Ci0gICAgICAgIExPR0UoIiVzOiBsaXN0ZW4oKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyX3N6ID0gc2l6ZW9mKGFkZHIpOwotCi0gICAgRkRfWkVSTygmZmRzKTsKLSAgICBGRF9TRVQoc2ssICZmZHMpOwotICAgIEZEX1NFVChzaWduYWxfc2ssICZmZHMpOwotCi0gICAgbWF4X2ZkID0gKHNrID4gc2lnbmFsX3NrKSA/IHNrIDogc2lnbmFsX3NrOwotICAgIExPR0koIkxpc3RlbmluZyBTQ08gc29ja2V0Li4uIik7Ci0gICAgd2hpbGUgKHNlbGVjdChtYXhfZmQgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCBOVUxMKSA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICAgICAgICBMT0dFKCIlczogc2VsZWN0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiJXM6IHNlbGVjdCgpIEVJTlRSLCByZXRyeWluZyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotICAgIExPR1YoInNlbGVjdCgpIHJldHVybmVkIik7Ci0gICAgaWYgKEZEX0lTU0VUKHNpZ25hbF9zaywgJmZkcykpIHsKLSAgICAgICAgLy8gc2lnbmFsIHRvIGNhbmNlbCBsaXN0ZW5pbmcKLSAgICAgICAgTE9HVigiY2FuY2VsbGVkIGxpc3RlbmluZyBzb2NrZXQsIGNsb3NpbmciKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgaWYgKCFGRF9JU1NFVChzaywgJmZkcykpIHsKLSAgICAgICAgTE9HRSgiZXJyb3I6IHNlbGVjdCgpIHJldHVybmVkID49IDAgd2l0aCBubyBmZHMgc2V0Iik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbnNrID0gYWNjZXB0KHNrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRyX3N6KTsKLSAgICBpZiAobnNrIDwgMCkgewotICAgICAgICBMT0dFKCIlczogYWNjZXB0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgTE9HSSgiQ29ubmVjdGVkIFNDTyBzb2NrZXQgKGluY29taW5nKSIpOwotICAgIGNsb3NlKHNrKTsgIC8vIFRoZSBsaXN0ZW5pbmcgc29ja2V0Ci0KLSAgICByZXR1cm4gbnNrOwotCi1lcnJvcjoKLSAgICBjbG9zZShzayk7Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgY29ubmVjdF93b3JrKGNvbnN0IGNoYXIgKmFkZHJlc3MsIHVpbnQxNl90IHNjb19wa3RfdHlwZSkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc2NvIGFkZHI7Ci0gICAgaW50IHNrID0gLTE7Ci0KLSAgICBzayA9IHNvY2tldChQRl9CTFVFVE9PVEgsIFNPQ0tfU0VRUEFDS0VULCBCVFBST1RPX1NDTyk7Ci0gICAgaWYgKHNrIDwgMCkgewotICAgICAgICBMT0dFKCIlczogc29ja2V0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIEJpbmQgdG8gbG9jYWwgYWRkcmVzcyAqLwotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyLnNjb19mYW1pbHkgPSBBRl9CTFVFVE9PVEg7Ci0gICAgbWVtY3B5KCZhZGRyLnNjb19iZGFkZHIsIEJEQUREUl9BTlksIHNpemVvZihiZGFkZHJfdCkpOwotICAgIGlmIChiaW5kKHNrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogYmluZCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHIuc2NvX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLSAgICBnZXRfYmRhZGRyKGFkZHJlc3MsICZhZGRyLnNjb19iZGFkZHIpOwotICAgIGFkZHIuc2NvX3BrdF90eXBlID0gc2NvX3BrdF90eXBlOwotICAgIExPR0koIkNvbm5lY3RpbmcgdG8gc29ja2V0Iik7Ci0gICAgd2hpbGUgKGNvbm5lY3Qoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICAgICAgICBMT0dFKCIlczogY29ubmVjdCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIExPR1YoIiVzOiBjb25uZWN0KCkgRUlOVFIsIHJldHJ5aW5nIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0gICAgTE9HSSgiU0NPIHNvY2tldCBjb25uZWN0ZWQgKG91dGdvaW5nKSIpOwotCi0gICAgcmV0dXJuIHNrOwotCi1lcnJvcjoKLSAgICBpZiAoc2sgPj0gMCkgY2xvc2Uoc2spOwotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgd2FpdF9mb3JfY2xvc2UoaW50IHNrLCBpbnQgc2lnbmFsX3NrKSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIHBvbGxmZCBwWzJdOwotCi0gICAgbWVtc2V0KHAsIDAsIDIgKiBzaXplb2YocG9sbGZkKSk7Ci0gICAgcFswXS5mZCA9IHNrOwotICAgIHBbMV0uZmQgPSBzaWduYWxfc2s7Ci0gICAgcFsxXS5ldmVudHMgPSBQT0xMSU4gfCBQT0xMUFJJOwotCi0gICAgTE9HVigicG9sbC4uLiIpOwotCi0gICAgd2hpbGUgKHBvbGwocCwgMiwgLTEpIDwgMCkgeyAgLy8gYmxvY2tzCi0gICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgewotICAgICAgICAgICAgTE9HRSgiJXM6IHBvbGwoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiJXM6IHBvbGwoKSBFSU5UUiwgcmV0cnlpbmciLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIExPR1YoInBvbGwoKSByZXR1cm5lZCIpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKLSAgICB7ImNsYXNzSW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xhc3NJbml0TmF0aXZlfSwKLSAgICB7ImluaXROYXRpdmUiLCAiKClWIiwgKHZvaWQgKilpbml0TmF0aXZlfSwKLSAgICB7ImRlc3Ryb3lOYXRpdmUiLCAiKClWIiwgKHZvaWQgKilkZXN0cm95TmF0aXZlfSwKLSAgICB7ImNvbm5lY3ROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIiwgKHZvaWQgKiljb25uZWN0TmF0aXZlfSwKLSAgICB7ImFjY2VwdE5hdGl2ZSIsICIoKVoiLCAodm9pZCAqKWFjY2VwdE5hdGl2ZX0sCi0gICAgeyJjbG9zZU5hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWNsb3NlTmF0aXZlfSwKLX07Ci0KLWludCByZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQoSk5JRW52ICplbnYpIHsKLSAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCi0gICAgICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0Iiwgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7Ci19Ci0KLX0gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwCmluZGV4IDQzYzNhOTUuLmFhZTBmMjEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcApAQCAtNjksNiArNjksMTYgQEAKICAgICB7IlVVSURzIiwgREJVU19UWVBFX0FSUkFZfSwKIH07CiAKK3N0YXRpYyBQcm9wZXJ0aWVzIGlucHV0X3Byb3BlcnRpZXNbXSA9IHsKKyAgICB7IkNvbm5lY3RlZCIsIERCVVNfVFlQRV9CT09MRUFOfSwKK307CisKK3N0YXRpYyBQcm9wZXJ0aWVzIHBhbl9wcm9wZXJ0aWVzW10gPSB7CisgICAgeyJDb25uZWN0ZWQiLCBEQlVTX1RZUEVfQk9PTEVBTn0sCisgICAgeyJJbnRlcmZhY2UiLCBEQlVTX1RZUEVfU1RSSU5HfSwKKyAgICB7IlVVSUQiLCBEQlVTX1RZUEVfU1RSSU5HfSwKK307CisKIHR5cGVkZWYgdW5pb24gewogICAgIGNoYXIgKnN0cl92YWw7CiAgICAgaW50IGludF92YWw7CkBAIC0xODcsNiArMTk3LDcgQEAKICAgICBkYnVzX2Jvb2xfdCByZXQ7CiAgICAgdmFfbGlzdCBsc3Q7CiAgICAgdmFfc3RhcnQobHN0LCBmaXJzdF9hcmdfdHlwZSk7CisKICAgICByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luY192YWxpc3QoZW52LCBjb25uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseSwgdXNlciwgbmF0LApAQCAtNjk5LDYgKzcxMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CiB9CiAKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydHlfY2hhbmdlKGVudiwgbXNnLCAoUHJvcGVydGllcyAqKSAmaW5wdXRfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlucHV0X3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKK30KKworam9iamVjdEFycmF5IHBhcnNlX3Bhbl9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydHlfY2hhbmdlKGVudiwgbXNnLCAoUHJvcGVydGllcyAqKSAmcGFuX3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYW5fcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKICAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZhZGFwdGVyX3Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFkYXB0ZXJfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwpAQCAtNzA5LDYgKzczMCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CiB9CiAKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZpbnB1dF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5wdXRfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBpbnQgZ2V0X2JkYWRkcihjb25zdCBjaGFyICpzdHIsIGJkYWRkcl90ICpiYSkgewogICAgIGNoYXIgKmQgPSAoKGNoYXIgKiliYSkgKyA1LCAqZW5kcDsKICAgICBpbnQgaTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKaW5kZXggMzc4YmI2Zi4uOTIyMmUxYSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKQEAgLTE2Miw2ICsxNjIsOSBAQAogam9iamVjdEFycmF5IHBhcnNlX3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKIGpvYmplY3RBcnJheSBwYXJzZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7CiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOworam9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcik7Citqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKK2pvYmplY3RBcnJheSBwYXJzZV9wYW5fcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKIHZvaWQgYXBwZW5kX3ZhcmlhbnQoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgdHlwZSwgdm9pZCAqdmFsKTsKIGludCBnZXRfYmRhZGRyKGNvbnN0IGNoYXIgKnN0ciwgYmRhZGRyX3QgKmJhKTsKIHZvaWQgZ2V0X2JkYWRkcl9hc19zdHJpbmcoY29uc3QgYmRhZGRyX3QgKmJhLCBjaGFyICpzdHIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwCmluZGV4IDkxNDQ5YmMuLjA0MGRhYzMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgIkN1cnNvcldpbmRvdy5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKIApAQCAtMjI1LDcwICsyMjUsNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgamJvb2xlYW4gaXNCbG9iX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGJsb2Igb3IgbnVsbCBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfQkxPQiB8fCBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfTlVMTDsKLX0KLQotc3RhdGljIGpib29sZWFuIGlzU3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIHN0cmluZyBvciBudWxsIGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9TVFJJTkcgfHwgZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX05VTEw7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0ludGVnZXJfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGFuIGludGVnZXIgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX0lOVEVHRVI7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGZsb2F0IGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9GTE9BVDsKLX0KLQogc3RhdGljIGpzdHJpbmcgZ2V0U3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKIHsKICAgICBpbnQzMl90IGVycjsKQEAgLTQ4NywxMCArNDIzLDkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBpc051bGxfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQorYm9vbCBpc051bGxfbmF0aXZlKEN1cnNvcldpbmRvdyAqd2luZG93LCBqaW50IHJvdywgamludCBjb2x1bW4pCiB7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBmb3IgTlVMTCBhdCAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7CisgICAgTE9HX1dJTkRPVygiQ2hlY2tpbmcgZm9yIE5VTEwgYXQgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwogCiAgICAgYm9vbCBpc051bGw7CiAgICAgaWYgKHdpbmRvdy0+Z2V0TnVsbChyb3csIGNvbHVtbiwgJmlzTnVsbCkpIHsKQEAgLTY1Miw2ICs1ODcsMjYgQEAKICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CiB9CiAKK3N0YXRpYyBqaW50IGdldFR5cGVfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQoreworICAgIGludDMyX3QgZXJyOworICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOworICAgIExPR19XSU5ET1coInJldHVybmluZyBjb2x1bW4gdHlwZSBhZmZpbml0eSBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOworCisgICAgaWYgKGlzTnVsbF9uYXRpdmUod2luZG93LCByb3csIGNvbHVtbikpIHsKKyAgICAgIHJldHVybiBGSUVMRF9UWVBFX05VTEw7CisgICAgfQorCisgICAgZmllbGRfc2xvdF90IGZpZWxkOworICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBmaWVsZC50eXBlOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KQEAgLTY2MiwxMSArNjE3LDkgQEAKICAgICB7ImNsb3NlX25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9jbG9zZX0sCiAgICAgeyJnZXRMb25nX25hdGl2ZSIsICIoSUkpSiIsICh2b2lkICopZ2V0TG9uZ19uYXRpdmV9LAogICAgIHsiZ2V0QmxvYl9uYXRpdmUiLCAiKElJKVtCIiwgKHZvaWQgKilnZXRCbG9iX25hdGl2ZX0sCi0gICAgeyJpc0Jsb2JfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc0Jsb2JfbmF0aXZlfSwKICAgICB7ImdldFN0cmluZ19uYXRpdmUiLCAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopZ2V0U3RyaW5nX25hdGl2ZX0sCiAgICAgeyJjb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlIiwgIihJSUlMYW5kcm9pZC9kYXRhYmFzZS9DaGFyQXJyYXlCdWZmZXI7KVtDIiwgKHZvaWQgKiljb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlfSwKICAgICB7ImdldERvdWJsZV9uYXRpdmUiLCAiKElJKUQiLCAodm9pZCAqKWdldERvdWJsZV9uYXRpdmV9LAotICAgIHsiaXNOdWxsX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNOdWxsX25hdGl2ZX0sCiAgICAgeyJnZXROdW1Sb3dzX25hdGl2ZSIsICIoKUkiLCAodm9pZCAqKWdldE51bVJvd3N9LAogICAgIHsic2V0TnVtQ29sdW1uc19uYXRpdmUiLCAiKEkpWiIsICh2b2lkICopc2V0TnVtQ29sdW1uc30sCiAgICAgeyJhbGxvY1Jvd19uYXRpdmUiLCAiKClaIiwgKHZvaWQgKilhbGxvY1Jvd30sCkBAIC02NzYsOSArNjI5LDcgQEAKICAgICB7InB1dERvdWJsZV9uYXRpdmUiLCAiKERJSSlaIiwgKHZvaWQgKilwdXREb3VibGVfbmF0aXZlfSwKICAgICB7ImZyZWVMYXN0Um93X25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWZyZWVMYXN0Um93fSwKICAgICB7InB1dE51bGxfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilwdXROdWxsX25hdGl2ZX0sCi0gICAgeyJpc1N0cmluZ19uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzU3RyaW5nX25hdGl2ZX0sCi0gICAgeyJpc0Zsb2F0X25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNGbG9hdF9uYXRpdmV9LAotICAgIHsiaXNJbnRlZ2VyX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNJbnRlZ2VyX25hdGl2ZX0sCisgICAgeyJnZXRUeXBlX25hdGl2ZSIsICIoSUkpSSIsICh2b2lkICopZ2V0VHlwZV9uYXRpdmV9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93KEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKaW5kZXggOGQxYzM5ZS4uZGU0YzVjOCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKQEAgLTkxLDIyICs5MSwxMSBAQAogICAgIGNvbXBpbGUoZW52LCBvYmplY3QsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpLCBzcWxTdHJpbmcpOwogfQogCi1zdGF0aWMgdm9pZCBuYXRpdmVfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIGludCBlcnI7Ci0gICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gR0VUX1NUQVRFTUVOVChlbnYsIG9iamVjdCk7Ci0KLSAgICBpZiAoc3RhdGVtZW50ICE9IE5VTEwpIHsKLSAgICAgICAgc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotICAgICAgICBlbnYtPlNldEludEZpZWxkKG9iamVjdCwgZ1N0YXRlbWVudEZpZWxkLCAwKTsKLSAgICB9Ci19CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogICAgIHsibmF0aXZlX2NvbXBpbGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKiluYXRpdmVfY29tcGlsZX0sCi0gICAgeyJuYXRpdmVfZmluYWxpemUiLCAiKClWIiwgKHZvaWQgKiluYXRpdmVfZmluYWxpemV9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwoSk5JRW52ICogZW52KQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcAppbmRleCAzNjIzNGE5Li4xYjY4YmE5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIkRhdGFiYXNlIgorI2RlZmluZSBMT0dfVEFHICJTcWxpdGVEYXRhYmFzZUNwcCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTUxLDYgKzUxLDggQEAKIC8qIHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGZvcmNlLWVuYWJsZSBsb2dnaW5nIG9mIGFsbCBzdGF0ZW1lbnRzICovCiAvLyAjZGVmaW5lIERCX0xPR19TVEFURU1FTlRTCiAKKyNkZWZpbmUgREVCVUdfSk5JIDAKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKQEAgLTYyLDkgKzY0LDExIEBACiB9OwogCiBzdGF0aWMgamZpZWxkSUQgb2Zmc2V0X2RiX2hhbmRsZTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjazsKK3N0YXRpYyBqY2xhc3Mgc3RyaW5nX2NsYXNzID0gTlVMTDsKIAotc3RhdGljIGNoYXIgKmNyZWF0ZVN0cihjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKK3N0YXRpYyBjaGFyICpjcmVhdGVTdHIoY29uc3QgY2hhciAqcGF0aCwgc2hvcnQgZXh0cmEpIHsKKyAgICBpbnQgbGVuID0gc3RybGVuKHBhdGgpICsgZXh0cmE7CiAgICAgY2hhciAqc3RyID0gKGNoYXIgKiltYWxsb2MobGVuICsgMSk7CiAgICAgc3RybmNweShzdHIsIHBhdGgsIGxlbik7CiAgICAgc3RyW2xlbl0gPSBOVUxMOwpAQCAtNzMsNyArNzcsNyBAQAogCiBzdGF0aWMgdm9pZCBzcWxMb2dnZXIodm9pZCAqZGF0YWJhc2VOYW1lLCBpbnQgaUVyckNvZGUsIGNvbnN0IGNoYXIgKnpNc2cpIHsKICAgICAvLyBza2lwIHByaW50aW5nIHRoaXMgbWVzc2FnZSBpZiBpdCBpcyBkdWUgdG8gY2VydGFpbiB0eXBlcyBvZiBlcnJvcnMKLSAgICBpZiAoaUVyckNvZGUgPT0gU1FMSVRFX0NPTlNUUkFJTlQpIHJldHVybjsKKyAgICBpZiAoaUVyckNvZGUgPT0gMCB8fCBpRXJyQ29kZSA9PSBTUUxJVEVfQ09OU1RSQUlOVCkgcmV0dXJuOwogICAgIExPR0koInNxbGl0ZSByZXR1cm5lZDogZXJyb3IgY29kZSA9ICVkLCBtc2cgPSAlc1xuIiwgaUVyckNvZGUsIHpNc2cpOwogfQogCkBAIC04NSw5ICs4OSw5IEBACiAgICAgfQogCiAgICAgTE9HVigiUmVnaXN0ZXJpbmcgc3FsaXRlIGxvZ2dpbmcgZnVuYyBcbiIpOwotICAgIGludCBlcnIgPSBzcWxpdGUzX2NvbmZpZyhTUUxJVEVfQ09ORklHX0xPRywgJnNxbExvZ2dlciwgKHZvaWQgKiljcmVhdGVTdHIocGF0aCkpOworICAgIGludCBlcnIgPSBzcWxpdGUzX2NvbmZpZyhTUUxJVEVfQ09ORklHX0xPRywgJnNxbExvZ2dlciwgKHZvaWQgKiljcmVhdGVTdHIocGF0aCwgMCkpOwogICAgIGlmIChlcnIgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExPR0UoInNxbGl0ZV9jb25maWcgZmFpbGVkIGVycm9yX2NvZGUgPSAlZC4gVEhJUyBTSE9VTEQgTkVWRVIgb2NjdXIuXG4iLCBlcnIpOworICAgICAgICBMT0dXKCJzcWxpdGUgcmV0dXJuZWQgZXJyb3IgPSAlZCB3aGVuIHRyeWluZyB0byByZWdpc3RlciBsb2dnaW5nIGZ1bmMuXG4iLCBlcnIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGxvZ2dpbmdGdW5jU2V0ID0gdHJ1ZTsKQEAgLTE3NiwxMyArMTgwLDE3IEBACiAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSBzcWxpdGUzX2Nsb3NlKGhhbmRsZSk7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXREYXRhYmFzZU5hbWUoSk5JRW52KiBlbnYsIHNxbGl0ZTMgKiBoYW5kbGUsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKSB7CitzdGF0aWMgY2hhciAqZ2V0RGF0YWJhc2VOYW1lKEpOSUVudiogZW52LCBzcWxpdGUzICogaGFuZGxlLCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwgc2hvcnQgY29ubk51bSkgewogICAgIGNoYXIgY29uc3QgKnBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRhdGFiYXNlTmFtZSwgTlVMTCk7CiAgICAgaWYgKHBhdGggPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJGYWlsdXJlIGluIGdldERhdGFiYXNlTmFtZSgpLiBWTSByYW4gb3V0IG9mIG1lbW9yeT9cbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsgLy8gVk0gd291bGQgaGF2ZSB0aHJvd24gT3V0T2ZNZW1vcnlFcnJvcgogICAgIH0KLSAgICBjaGFyICpkYk5hbWVTdHIgPSBjcmVhdGVTdHIocGF0aCk7CisgICAgY2hhciAqZGJOYW1lU3RyID0gY3JlYXRlU3RyKHBhdGgsIDQpOworICAgIGlmIChjb25uTnVtID4gOTk5KSB7IC8vIFRPRE86IGlmIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgPiA5OTksIGZpeCB0aGlzIGxpbmUuCisgICAgICBjb25uTnVtID0gLTE7CisgICAgfQorICAgIHNwcmludGYoZGJOYW1lU3RyICsgc3RybGVuKHBhdGgpLCAifCUwM2QiLCBjb25uTnVtKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkYXRhYmFzZU5hbWUsIHBhdGgpOwogICAgIHJldHVybiBkYk5hbWVTdHI7CiB9CkBAIC0xOTIsMTAgKzIwMCwxMCBAQAogfQogCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKQorc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBqc2hvcnQgY29ublR5cGUpCiB7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIHNxbGl0ZTNfdHJhY2UoaGFuZGxlLCAmc3FsVHJhY2UsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUpKTsKKyAgICBzcWxpdGUzX3RyYWNlKGhhbmRsZSwgJnNxbFRyYWNlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLCBjb25uVHlwZSkpOwogfQogCiBzdGF0aWMgdm9pZCBzcWxQcm9maWxlKHZvaWQgKmRhdGFiYXNlTmFtZSwgY29uc3QgY2hhciAqc3FsLCBzcWxpdGUzX3VpbnQ2NCB0bSkgewpAQCAtMjA0LDEzICsyMTIsMTMgQEAKIH0KIAogLyogcHVibGljIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUpCitzdGF0aWMgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwganNob3J0IGNvbm5UeXBlKQogewogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLSAgICBzcWxpdGUzX3Byb2ZpbGUoaGFuZGxlLCAmc3FsUHJvZmlsZSwgKHZvaWQgKilnZXREYXRhYmFzZU5hbWUoZW52LCBoYW5kbGUsIGRhdGFiYXNlTmFtZSkpOworICAgIHNxbGl0ZTNfcHJvZmlsZShoYW5kbGUsICZzcWxQcm9maWxlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLAorICAgICAgICAgICAgY29ublR5cGUpKTsKIH0KIAotCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgY2xvc2UoKTsgKi8KIHN0YXRpYyB2b2lkIGRiY2xvc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewpAQCAtMjQwLDczICsyNDgsNiBAQAogICAgIH0KIH0KIAotLyogcHVibGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjU1FMKFN0cmluZyBzcWwpOyAqLwotc3RhdGljIHZvaWQgbmF0aXZlX2V4ZWNTUUwoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHNxbFN0cmluZykKLXsKLSAgICBpbnQgZXJyOwotICAgIGludCBzdGVwRXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IE5VTEw7Ci0gICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIGpjaGFyIGNvbnN0ICogc3FsID0gZW52LT5HZXRTdHJpbmdDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgIGpzaXplIHNxbExlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHNxbFN0cmluZyk7Ci0KLSAgICBpZiAoc3FsID09IE5VTEwgfHwgc3FsTGVuID09IDApIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICJZb3UgbXVzdCBzdXBwbHkgYW4gU1FMIHN0cmluZyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZXJyID0gc3FsaXRlM19wcmVwYXJlMTZfdjIoaGFuZGxlLCBzcWwsIHNxbExlbiAqIDIsICZzdGF0ZW1lbnQsIE5VTEwpOwotCi0gICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnMoc3FsU3RyaW5nLCBzcWwpOwotCi0gICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgY2hhciBjb25zdCAqIHNxbDggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgTlVMTCk7Ci0gICAgICAgIExPR0UoIkZhaWx1cmUgJWQgKCVzKSBvbiAlcCB3aGVuIHByZXBhcmluZyAnJXMnLlxuIiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSwgc3FsOCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGVwRXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7Ci0gICAgZXJyID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotCi0gICAgaWYgKHN0ZXBFcnIgIT0gU1FMSVRFX0RPTkUpIHsKLSAgICAgICAgaWYgKHN0ZXBFcnIgPT0gU1FMSVRFX1JPVykgewotICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCAiUXVlcmllcyBjYW5ub3QgYmUgcGVyZm9ybWVkIHVzaW5nIGV4ZWNTUUwoKSwgdXNlIHF1ZXJ5KCkgaW5zdGVhZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzcWw4ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgICAgICAgICAgTE9HRSgiRmFpbHVyZSAlZCAoJXMpIG9uICVwIHdoZW4gZXhlY3V0aW5nICclcydcbiIsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0KLSAgICAgICAgfQotICAgIH0gZWxzZQotI2lmbmRlZiBEQl9MT0dfU1RBVEVNRU5UUwotICAgIElGX0xPR1YoKQotI2VuZGlmCi0gICAgewotICAgICAgICBjaGFyIGNvbnN0ICogc3FsOCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgTE9HVigiU3VjY2VzcyBvbiAlcCB3aGVuIGV4ZWN1dGluZyAnJXMnXG4iLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIHNxbDgpOwotICAgIH0KLX0KLQotLyogbmF0aXZlIGxvbmcgbGFzdEluc2VydFJvdygpOyAqLwotc3RhdGljIGpsb25nIGxhc3RJbnNlcnRSb3coSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKGhhbmRsZSk7Ci19Ci0KLS8qIG5hdGl2ZSBpbnQgbGFzdENoYW5nZUNvdW50KCk7ICovCi1zdGF0aWMgamludCBsYXN0Q2hhbmdlQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2NoYW5nZXMoaGFuZGxlKTsKLX0KLQogLyogbmF0aXZlIGludCBuYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsgKi8KIHN0YXRpYyBqaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCiB7CkBAIC00NDMsMTkgKzM4NCw5MyBAQAogICAgIHJldHVybiBzcWxpdGUzX3JlbGVhc2VfbWVtb3J5KFNRTElURV9TT0ZUX0hFQVBfTElNSVQpOwogfQogCitzdGF0aWMgdm9pZCBuYXRpdmVfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHN0YXRlbWVudElkKQoreworICAgIGlmIChzdGF0ZW1lbnRJZCA+IDApIHsKKyAgICAgICAgc3FsaXRlM19maW5hbGl6ZSgoc3FsaXRlM19zdG10ICopc3RhdGVtZW50SWQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCAqIGNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlICoqIGFyZ3YpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpZiAoIWVudikgeworICAgICAgICBMT0dFKCJjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2sgY2Fubm90IGNhbGwgaW50byBKYXZhIG9uIHRoaXMgdGhyZWFkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZ2V0IGdsb2JhbCByZWYgdG8gQ3VzdG9tRnVuY3Rpb24gb2JqZWN0IGZyb20gb3VyIHVzZXIgZGF0YQorICAgIGpvYmplY3QgZnVuY3Rpb24gPSAoam9iamVjdClzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKKworICAgIC8vIHBhY2sgdXAgdGhlIGFyZ3VtZW50cyBpbnRvIGEgc3RyaW5nIGFycmF5CisgICAgaWYgKCFzdHJpbmdfY2xhc3MpCisgICAgICAgIHN0cmluZ19jbGFzcyA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKSk7CisgICAgam9iamVjdEFycmF5IHN0ckFycmF5ID0gZW52LT5OZXdPYmplY3RBcnJheShhcmdjLCBzdHJpbmdfY2xhc3MsIE5VTEwpOworICAgIGlmICghc3RyQXJyYXkpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjaGFyKiBhcmcgPSAoY2hhciAqKXNxbGl0ZTNfdmFsdWVfdGV4dChhcmd2W2ldKTsKKyAgICAgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgICAgIExPR0UoIk5VTEwgYXJndW1lbnQgaW4gY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3U3RyaW5nVVRGKGFyZyk7CisgICAgICAgIGlmICghb2JqKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChzdHJBcnJheSwgaSwgb2JqKTsKKyAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOworICAgIH0KKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZnVuY3Rpb24sIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIHN0ckFycmF5KTsKKworZG9uZToKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGN1c3RvbSBzcWxpdGUzIGZ1bmN0aW9uLiIpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBqaW50IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgIGpzdHJpbmcgbmFtZSwgamludCBudW1BcmdzLCBqb2JqZWN0IGZ1bmN0aW9uKQoreworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKKyAgICBjaGFyIGNvbnN0ICpuYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKKyAgICBqb2JqZWN0IHJlZiA9IGVudi0+TmV3R2xvYmFsUmVmKGZ1bmN0aW9uKTsKKyAgICBMT0dEX0lGKERFQlVHX0pOSSwgIm5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbiAlcyByZWY6ICVwIiwgbmFtZVN0ciwgcmVmKTsKKyAgICBpbnQgZXJyID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oaGFuZGxlLCBuYW1lU3RyLCBudW1BcmdzLCBTUUxJVEVfVVRGOCwKKyAgICAgICAgICAgICh2b2lkICopcmVmLCBjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIE5VTEwsIE5VTEwpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG5hbWVTdHIpOworCisgICAgaWYgKGVyciA9PSBTUUxJVEVfT0spCisgICAgICAgIHJldHVybiAoaW50KXJlZjsKKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRSgic3FsaXRlM19jcmVhdGVfZnVuY3Rpb24gcmV0dXJuZWQgJWQiLCBlcnIpOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihyZWYpOworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiAwOworICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJlZikKK3sKKyAgICBMT0dEX0lGKERFQlVHX0pOSSwgIm5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24gJWQiLCByZWYpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKChqb2JqZWN0KXJlZik7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJkYm9wZW4iLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICh2b2lkICopZGJvcGVufSwKICAgICB7ImRiY2xvc2UiLCAiKClWIiwgKHZvaWQgKilkYmNsb3NlfSwKLSAgICB7ImVuYWJsZVNxbFRyYWNpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKillbmFibGVTcWxUcmFjaW5nfSwKLSAgICB7ImVuYWJsZVNxbFByb2ZpbGluZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCi0gICAgeyJuYXRpdmVfZXhlY1NRTCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjU1FMfSwKLSAgICB7Imxhc3RJbnNlcnRSb3ciLCAiKClKIiwgKHZvaWQgKilsYXN0SW5zZXJ0Um93fSwKLSAgICB7Imxhc3RDaGFuZ2VDb3VudCIsICIoKUkiLCAodm9pZCAqKWxhc3RDaGFuZ2VDb3VudH0sCisgICAgeyJlbmFibGVTcWxUcmFjaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFRyYWNpbmd9LAorICAgIHsiZW5hYmxlU3FsUHJvZmlsaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCiAgICAgeyJuYXRpdmVfc2V0TG9jYWxlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAodm9pZCAqKW5hdGl2ZV9zZXRMb2NhbGV9LAogICAgIHsibmF0aXZlX2dldERiTG9va2FzaWRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2dldERiTG9va2FzaWRlfSwKICAgICB7InJlbGVhc2VNZW1vcnkiLCAiKClJIiwgKHZvaWQgKiluYXRpdmVfcmVsZWFzZU1lbW9yeX0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAiKEkpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SUxhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSRDdXN0b21GdW5jdGlvbjspSSIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopbmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9ufSwKKyAgICB7Im5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24iLCAiKEkpViIsICh2b2lkICopbmF0aXZlX3JlbGVhc2VDdXN0b21GdW5jdGlvbn0sCiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZShKTklFbnYgKmVudikKQEAgLTQ3NCw3ICs0ODksMTkgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlIiwgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7CisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UkQ3VzdG9tRnVuY3Rpb24iKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJEN1c3RvbUZ1bmN0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImNhbGxiYWNrIiwgIihbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBpZiAobWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgbWV0aG9kIFNRTGl0ZURhdGFiYXNlLkN1c3RvbUZ1bmN0aW9uLmNhbGxiYWNrXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlIiwKKyAgICAgICAgICAgIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwogfQogCiAvKiB0aHJvdyBhIFNRTGl0ZUV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGVycm9yIGluIGhhbmRsZSAqLwpAQCAtNTIzLDYgKzU1MCw3IEBACiAgICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXNrSU9FeGNlcHRpb24iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1FMSVRFX0NPUlJVUFQ6CisgICAgICAgIGNhc2UgU1FMSVRFX05PVEFEQjogLy8gdHJlYXQgInVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0IiBlcnJvciBhcyBjb3JydXB0aW9uIGFsc28KICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTUUxJVEVfQ09OU1RSQUlOVDoKQEAgLTU0MCw2ICs1NjgsMzYgQEAKICAgICAgICAgY2FzZSBTUUxJVEVfTUlTVVNFOgogICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVNaXN1c2VFeGNlcHRpb24iOwogICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfUEVSTToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9CVVNZOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9MT0NLRUQ6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1JFQURPTkxZOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0NBTlRPUEVOOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1RPT0JJRzoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9SQU5HRToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX05PTUVNOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9NSVNNQVRDSDoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9VTkNMT1NFRDoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUV4Y2VwdGlvbiI7CiAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVF1ZXJ5LmNwcAppbmRleCA0NDI3MTY4My4uOWU0MjE4OSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJDdXJzb3IiCisjZGVmaW5lIExPR19UQUcgIlNxbGl0ZUN1cnNvci5jcHAiCiAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDxKTklIZWxwLmg+CkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlICJDdXJzb3JXaW5kb3cuaCIKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCiAjaW5jbHVkZSAic3FsaXRlM19leGNlcHRpb24uaCIKIAogCkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgTE9HRCgic2tpcF9yb3dzIHJvdyAlZCIsIG1heFJvd3MpOworICAgIExPR19XSU5ET1coInNraXBfcm93cyByb3cgJWQiLCBtYXhSb3dzKTsKICAgICByZXR1cm4gbWF4Um93czsKIH0KIApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgc3FsaXRlM19yZXNldChzdGF0ZW1lbnQpOwotICAgIExPR0QoImZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50IHJvdyAlZCIsIG51bVJvd3MpOworICAgIExPR19XSU5ET1coImZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50IHJvdyAlZCIsIG51bVJvd3MpOwogICAgIHJldHVybiBudW1Sb3dzOwogfQogCkBAIC0xMTYsNiArMTE2LDggQEAKICAgICBpbnQgcmV0cnlDb3VudDsKICAgICBpbnQgYm91bmRQYXJhbXM7CiAgICAgQ3Vyc29yV2luZG93ICogd2luZG93OworICAgIGJvb2wgZ290QWxsUm93cyA9IHRydWU7CisgICAgYm9vbCBnb3RFeGNlcHRpb24gPSBmYWxzZTsKICAgICAKICAgICBpZiAoc3RhdGVtZW50ID09IE5VTEwpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBzdGF0ZW1lbnQgaW4gZmlsbFdpbmRvdygpIik7CkBAIC0xMzEsOCArMTMzLDcgQEAKICAgICAgICAgZXJyID0gc3FsaXRlM19iaW5kX2ludChzdGF0ZW1lbnQsIG9mZnNldFBhcmFtLCBzdGFydFBvcyk7CiAgICAgICAgIGlmIChlcnIgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgICAgICBMT0dFKCJVbmFibGUgdG8gYmluZCBvZmZzZXQgcG9zaXRpb24sIG9mZnNldFBhcmFtID0gJWQiLCBvZmZzZXRQYXJhbSk7Ci0gICAgICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZTNfZXJybXNnKEdFVF9IQU5ETEUoZW52LCBvYmplY3QpKSk7CisgICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIExPR19XSU5ET1coIkJvdW5kIHRvIHN0YXJ0UG9zICVkIiwgc3RhcnRQb3MpOwpAQCAtMTY3LDcgKzE2OCw3IEBACiAgICAgICAgICAgICBMT0dFKCJzdGFydFBvcyAlZCA+IGFjdHVhbCByb3dzICVkIiwgc3RhcnRQb3MsIG51bSk7CiAgICAgICAgICAgICByZXR1cm4gbnVtOwogICAgICAgICB9Ci0gICAgfSAKKyAgICB9CiAgICAgCiAgICAgd2hpbGUoc3RhcnRQb3MgIT0gMCB8fCBudW1Sb3dzIDwgbWF4UmVhZCkgewogICAgICAgICBlcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKQEAgLTE4MSw4ICsxODIsOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gd2luZG93LT5hbGxvY1JvdygpOwogICAgICAgICAgICAgICAgIGlmICghZmllbGREaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIGFsbG9jYXRpbmcgZmllbGREaXIgYXQgc3RhcnRQb3MgJWQgcm93ICVkIiwgc3RhcnRQb3MsIG51bVJvd3MpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgIExPR19XSU5ET1coIkZhaWxlZCBhbGxvY2F0aW5nIGZpZWxkRGlyIGF0IHN0YXJ0UG9zICVkIHJvdyAlZCIsIHN0YXJ0UG9zLCBudW1Sb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTIwNSw5ICsyMDcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHdpbmRvdy0+YWxsb2Moc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgdGV4dC9ibG9iIGF0ICVkLCVkIiwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19XSU5ET1coIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0ZXh0L2Jsb2IgYXQgJWQsJWQiLCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyArIG51bVJvd3MsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UG9zICsgbnVtUm93cyArIGZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50KHN0YXRlbWVudCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fY291bnQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmNvcHlJbihvZmZzZXQsIHRleHQsIHNpemUpOwpAQCAtMjI1LDggKzIyOCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUgPSBzcWxpdGUzX2NvbHVtbl9pbnQ2NChzdGF0ZW1lbnQsIGkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy0+cHV0TG9uZyhudW1Sb3dzLCBpLCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIGxvbmcgaW4gY29sdW1uICVkIiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBsb25nIGluIGNvbHVtbiAlZCIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fY291bnQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgTE9HX1dJTkRPVygiJWQsJWQgaXMgSU5URUdFUiAweCUwMTZsbHgiLCBzdGFydFBvcyArIG51bVJvd3MsIGksIHZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gU1FMSVRFX0ZMT0FUKSB7CkBAIC0yMzQsOCArMjM4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlID0gc3FsaXRlM19jb2x1bW5fZG91YmxlKHN0YXRlbWVudCwgaSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LT5wdXREb3VibGUobnVtUm93cywgaSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBkb3VibGUgaW4gY29sdW1uICVkIiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBkb3VibGUgaW4gY29sdW1uICVkIiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RBbGxSb3dzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCIlZCwlZCBpcyBGTE9BVCAlbGYiLCBzdGFydFBvcyArIG51bVJvd3MsIGksIHZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gU1FMSVRFX0JMT0IpIHsKQEAgLTI0NSw5ICsyNTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHdpbmRvdy0+YWxsb2Moc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgYmxvYiBhdCAlZCwlZCIsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgYmxvYiBhdCAlZCwlZCIsIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zICsgbnVtUm93cywgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RBbGxSb3dzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+Y29weUluKG9mZnNldCwgYmxvYiwgc2l6ZSk7CkBAIC0yNjksNiArMjc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBkYXRhCiAgICAgICAgICAgICAgICAgICAgIExPR0UoIlVua25vd24gY29sdW1uIHR5cGUgd2hlbiBmaWxsaW5nIGRhdGFiYXNlIHdpbmRvdyIpOwogICAgICAgICAgICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsICJVbmtub3duIGNvbHVtbiB0eXBlIHdoZW4gZmlsbGluZyB3aW5kb3ciKTsKKyAgICAgICAgICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjkwLDYgKzI5Nyw4IEBACiAgICAgICAgICAgICBMT0dfV0lORE9XKCJEYXRhYmFzZSBsb2NrZWQsIHJldHJ5aW5nIik7CiAgICAgICAgICAgICBpZiAocmV0cnlDb3VudCA+IDUwKSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiQmFpbGluZyBvbiBkYXRhYmFzZSBidXN5IHJldHkiKTsKKyAgICAgICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpLCAicmV0cnljb3VudCBleGNlZWRlZCIpOworICAgICAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTMwMCwxOCArMzA5LDMzIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgR0VUX0hBTkRMRShlbnYsIG9iamVjdCkpOworICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgTE9HX1dJTkRPVygiUmVzZXR0aW5nIHN0YXRlbWVudCAlcCBhZnRlciBmZXRjaGluZyAlZCByb3dzIGluICVkIGJ5dGVzXG5cblxuXG4iLCBzdGF0ZW1lbnQsCiAgICAgICAgICAgICBudW1Sb3dzLCB3aW5kb3ctPnNpemUoKSAtIHdpbmRvdy0+ZnJlZVNwYWNlKCkpOwotLy8gICAgTE9HSSgiRmlsbGVkIHdpbmRvdyB3aXRoICVkIHJvd3MgaW4gJWQgYnl0ZXMiLCBudW1Sb3dzLCB3aW5kb3ctPnNpemUoKSAtIHdpbmRvdy0+ZnJlZVNwYWNlKCkpOworICAgIExPR19XSU5ET1coIkZpbGxlZCB3aW5kb3cgd2l0aCAlZCByb3dzIGluICVkIGJ5dGVzIiwgbnVtUm93cywKKyAgICAgICAgICAgIHdpbmRvdy0+c2l6ZSgpIC0gd2luZG93LT5mcmVlU3BhY2UoKSk7CiAgICAgaWYgKGVyciA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIC8vIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBiZSByZXR1cm5lZC4gbGV0IHRoZSBjYWxsZXIga25vdyBieSByZXR1cm5pbmcgLTEKICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSB7CisgICAgfQorICByZXR1cm5fY291bnQ6CisgICAgaWYgKHN0YXJ0UG9zKSB7CiAgICAgICAgIHNxbGl0ZTNfcmVzZXQoc3RhdGVtZW50KTsKLSAgICAgICAgcmV0dXJuIHN0YXJ0UG9zICsgbnVtUm93czsKKyAgICAgICAgTE9HX1dJTkRPVygiTm90IGRvaW5nIGNvdW50KCopIGJlY2F1c2Ugc3RhcnRQb3MgJWQgaXMgbm9uLXplcm8iLCBzdGFydFBvcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoZ290QWxsUm93cykgeworICAgICAgICBzcWxpdGUzX3Jlc2V0KHN0YXRlbWVudCk7CisgICAgICAgIExPR19XSU5ET1coIk5vdCBkb2luZyBjb3VudCgqKSBiZWNhdXNlIHdlIGFscmVhZHkga25vdyB0aGUgY291bnQoKikiKTsKKyAgICAgICAgcmV0dXJuIG51bVJvd3M7CisgICAgfSBlbHNlIGlmIChnb3RFeGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gc2luY2Ugc3RhcnRQb3MgPT0gMCwgd2UgbmVlZCB0byBnZXQgdGhlIGNvdW50KCopIG9mIHRoZSByZXN1bHQgc2V0CisgICAgICAgIHJldHVybiBudW1Sb3dzICsgMSArIGZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50KHN0YXRlbWVudCk7CiAgICAgfQogfQogCkBAIC0zMzYsNyArMzYwLDggQEAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwotICAgIHsibmF0aXZlX2ZpbGxfd2luZG93IiwgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SUlJSSlJIiwgKHZvaWQgKiluYXRpdmVfZmlsbF93aW5kb3d9LAorICAgIHsibmF0aXZlX2ZpbGxfd2luZG93IiwgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SUlJSSlJIiwKKyAgICAgICAgICAgICh2b2lkICopbmF0aXZlX2ZpbGxfd2luZG93fSwKICAgICB7Im5hdGl2ZV9jb2x1bW5fY291bnQiLCAiKClJIiwgKHZvaWQqKW5hdGl2ZV9jb2x1bW5fY291bnR9LAogICAgIHsibmF0aXZlX2NvbHVtbl9uYW1lIiwgIihJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopbmF0aXZlX2NvbHVtbl9uYW1lfSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAKaW5kZXggZmYyZWQ1ZC4uOTdlMDQ4MyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcApAQCAtMTYsNyArMTYsOSBAQAogKi8KIAogI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yIgorI2RlZmluZSBMT0dfVEFHICJTUUxpdGVTdGF0ZW1lbnRDcHAiCisKKyNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCiAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDxKTklIZWxwLmg+CkBAIC0yNCwxMSArMjYsMTYgQEAKIAogI2luY2x1ZGUgPHNxbGl0ZTMuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogCkBAIC00OCwyMiArNTUsNDAgQEAKICAgICAgICAgKHNxbGl0ZTMgKillbnYtPkdldEludEZpZWxkKG9iamVjdCwgZ0hhbmRsZUZpZWxkKQogCiAKLXN0YXRpYyB2b2lkIG5hdGl2ZV9leGVjdXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKK3N0YXRpYyBqaW50IG5hdGl2ZV9leGVjdXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKIHsKICAgICBpbnQgZXJyOwogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSBHRVRfSEFORExFKGVudiwgb2JqZWN0KTsKICAgICBzcWxpdGUzX3N0bXQgKiBzdGF0ZW1lbnQgPSBHRVRfU1RBVEVNRU5UKGVudiwgb2JqZWN0KTsKKyAgICBpbnQgbnVtQ2hhbmdlcyA9IC0xOwogCiAgICAgLy8gRXhlY3V0ZSB0aGUgc3RhdGVtZW50CiAgICAgZXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7CiAKLSAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJlZAotICAgIGlmIChlcnIgIT0gU1FMSVRFX0RPTkUpIHsKKyAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICBpZiAoZXJyID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LAorICAgICAgICAgICAgICAgICJRdWVyaWVzIGNhbiBiZSBwZXJmb3JtZWQgdXNpbmcgU1FMaXRlRGF0YWJhc2UgcXVlcnkgb3IgcmF3UXVlcnkgbWV0aG9kcyBvbmx5LiIpOworICAgIH0gZWxzZSBpZiAoZXJyICE9IFNRTElURV9ET05FKSB7CiAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uX2VycmNvZGUoZW52LCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUNoYW5nZXMgPSBzcWxpdGUzX2NoYW5nZXMoaGFuZGxlKTsKICAgICB9CiAKLSAgICAvLyBSZXNldCB0aGUgc3RhdG1lbnQgc28gaXQncyByZWFkeSB0byB1c2UgYWdhaW4KKyAgICAvLyBSZXNldCB0aGUgc3RhdGVtZW50IHNvIGl0J3MgcmVhZHkgdG8gdXNlIGFnYWluCiAgICAgc3FsaXRlM19yZXNldChzdGF0ZW1lbnQpOworICAgIHJldHVybiBudW1DaGFuZ2VzOworfQorCitzdGF0aWMgamxvbmcgbmF0aXZlX2V4ZWN1dGVJbnNlcnQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQoreworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSBHRVRfSEFORExFKGVudiwgb2JqZWN0KTsKKyAgICBqaW50IG51bUNoYW5nZXMgPSBuYXRpdmVfZXhlY3V0ZShlbnYsIG9iamVjdCk7CisgICAgaWYgKG51bUNoYW5nZXMgPiAwKSB7CisgICAgICAgIHJldHVybiBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIGpsb25nIG5hdGl2ZV8xeDFfbG9uZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCkBAIC0xMTUsMTMgKzE0MCwxMjUgQEAKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXRpYyBqb2JqZWN0IGNyZWF0ZVBhcmNlbEZpbGVEZXNjcmlwdG9yKEpOSUVudiAqIGVudiwgaW50IGZkKQoreworICAgIC8vIENyZWF0ZSBGaWxlRGVzY3JpcHRvciBvYmplY3QKKyAgICBqb2JqZWN0IGZpbGVEZXNjID0gbmV3RmlsZURlc2NyaXB0b3IoZW52LCBmZCk7CisgICAgaWYgKGZpbGVEZXNjID09IE5VTEwpIHsKKyAgICAgICAgLy8gRmlsZURlc2NyaXB0b3IgY29uc3RydWN0b3IgaGFzIHRocm93biBhbiBleGNlcHRpb24KKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBXcmFwIGl0IGluIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IKKyAgICBqb2JqZWN0IHBhcmNlbEZpbGVEZXNjID0gbmV3UGFyY2VsRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzYyk7CisgICAgaWYgKHBhcmNlbEZpbGVEZXNjID09IE5VTEwpIHsKKyAgICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3IgY29uc3RydWN0b3IgaGFzIHRocm93biBhbiBleGNlcHRpb24KKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcGFyY2VsRmlsZURlc2M7Cit9CisKKy8vIENyZWF0ZXMgYW4gYXNobWVtIGFyZWEsIGNvcGllcyBzb21lIGRhdGEgaW50byBpdCwgYW5kIHJldHVybnMKKy8vIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBhc2htZW0gYXJlYS4KK3N0YXRpYyBqb2JqZWN0IGNyZWF0ZV9hc2htZW1fcmVnaW9uX3dpdGhfZGF0YShKTklFbnYgKiBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIGRhdGEsIGludCBsZW5ndGgpCit7CisgICAgLy8gQ3JlYXRlIGFzaG1lbSBhcmVhCisgICAgaW50IGZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oTlVMTCwgbGVuZ3RoKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoImFzaG1lbV9jcmVhdGVfcmVnaW9uIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAvLyBtbWFwIHRoZSBhc2htZW0gYXJlYQorICAgICAgICB2b2lkICogYXNobWVtX3B0ciA9CisgICAgICAgICAgICAgICAgbW1hcChOVUxMLCBsZW5ndGgsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgICAgICAgaWYgKGFzaG1lbV9wdHIgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgTE9HRSgibW1hcCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBlcnJubyk7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgZGF0YSB0byBhc2htZW0gYXJlYQorICAgICAgICBtZW1jcHkoYXNobWVtX3B0ciwgZGF0YSwgbGVuZ3RoKTsKKworICAgICAgICAvLyBtdW5tYXAgYXNobWVtIGFyZWEKKyAgICAgICAgaWYgKG11bm1hcChhc2htZW1fcHRyLCBsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgTE9HRSgibXVubWFwIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIGVycm5vKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTWFrZSBhc2htZW0gYXJlYSByZWFkLW9ubHkKKyAgICBpZiAoYXNobWVtX3NldF9wcm90X3JlZ2lvbihmZCwgUFJPVF9SRUFEKSA8IDApIHsKKyAgICAgICAgTE9HRSgiYXNobWVtX3NldF9wcm90X3JlZ2lvbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIGVycm5vKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBXcmFwIGl0IGluIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IKKyAgICByZXR1cm4gY3JlYXRlUGFyY2VsRmlsZURlc2NyaXB0b3IoZW52LCBmZCk7Cit9CisKK3N0YXRpYyBqb2JqZWN0IG5hdGl2ZV8xeDFfYmxvYl9hc2htZW0oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQoreworICAgIGludCBlcnI7CisgICAgc3FsaXRlMyAqIGhhbmRsZSA9IEdFVF9IQU5ETEUoZW52LCBvYmplY3QpOworICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgdmFsdWUgPSBOVUxMOworCisgICAgLy8gRXhlY3V0ZSB0aGUgc3RhdGVtZW50CisgICAgZXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7CisKKyAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdAorICAgIGlmIChlcnIgPT0gU1FMSVRFX1JPVykgeworICAgICAgICAvLyBObyBlcnJvcnMsIHJlYWQgdGhlIGRhdGEgYW5kIHJldHVybiBpdAorICAgICAgICBjb25zdCB2b2lkICogYmxvYiA9IHNxbGl0ZTNfY29sdW1uX2Jsb2Ioc3RhdGVtZW50LCAwKTsKKyAgICAgICAgaWYgKGJsb2IgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGxlbiA9IHNxbGl0ZTNfY29sdW1uX2J5dGVzKHN0YXRlbWVudCwgMCk7CisgICAgICAgICAgICBpZiAobGVuID49IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hc2htZW1fcmVnaW9uX3dpdGhfZGF0YShlbnYsIGJsb2IsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbl9lcnJjb2RlKGVudiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCB0aGUgc3RhdG1lbnQgc28gaXQncyByZWFkeSB0byB1c2UgYWdhaW4KKyAgICBzcWxpdGUzX3Jlc2V0KHN0YXRlbWVudCk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIG5hdGl2ZV9leGVjdXRlU3FsKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBzcWwpCit7CisgICAgY2hhciBjb25zdCogc3FsU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWwsIE5VTEwpOworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSBHRVRfSEFORExFKGVudiwgb2JqZWN0KTsKKyAgICBpbnQgZXJyID0gc3FsaXRlM19leGVjKGhhbmRsZSwgc3FsU3RyaW5nLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IFNRTElURV9PSykgeworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSk7CisgICAgfQorICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbCwgc3FsU3RyaW5nKTsKK30KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCi0gICAgeyJuYXRpdmVfZXhlY3V0ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjdXRlfSwKKyAgICB7Im5hdGl2ZV9leGVjdXRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2V4ZWN1dGV9LAorICAgIHsibmF0aXZlX2V4ZWN1dGVJbnNlcnQiLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfZXhlY3V0ZUluc2VydH0sCiAgICAgeyJuYXRpdmVfMXgxX2xvbmciLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfMXgxX2xvbmd9LAogICAgIHsibmF0aXZlXzF4MV9zdHJpbmciLCAiKClMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfc3RyaW5nfSwKKyAgICB7Im5hdGl2ZV8xeDFfYmxvYl9hc2htZW0iLCAiKClMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfYmxvYl9hc2htZW19LAorICAgIHsibmF0aXZlX2V4ZWN1dGVTcWwiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKiluYXRpdmVfZXhlY3V0ZVNxbH0sCiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQoSk5JRW52ICogZW52KQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCmluZGV4IDY1NzViOWEuLjM1MWYyNjQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKQEAgLTIyNCw3ICsyMjQsOCBAQAogICAgIHsgImFkZFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztJTGphdmEvbGFuZy9TdHJpbmc7KUkiLAogICAgICAgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfYWRkUm91dGUgfSwKICAgICB7ICJyZW1vdmVIb3N0Um91dGVzIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3JlbW92ZUhvc3RSb3V0ZXMgfSwKLSAgICB7ICJnZXREZWZhdWx0Um91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZ2V0RGVmYXVsdFJvdXRlIH0sCisgICAgeyAiZ2V0RGVmYXVsdFJvdXRlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsCisgICAgICAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19nZXREZWZhdWx0Um91dGUgfSwKICAgICB7ICJyZW1vdmVEZWZhdWx0Um91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcmVtb3ZlRGVmYXVsdFJvdXRlIH0sCiAgICAgeyAicmVzZXRDb25uZWN0aW9ucyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19yZXNldENvbm5lY3Rpb25zIH0sCiAgICAgeyAicnVuRGhjcCIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvbmV0L0RoY3BJbmZvOylaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcnVuRGhjcCB9LApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAKaW5kZXggZmIwMjllNi4uZGVmZDBhMCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwCkBAIC0zMCw2ICszMCw4IEBACiAKIHN0YXRpYyBqYm9vbGVhbiBzU2Nhbk1vZGVBY3RpdmUgPSBmYWxzZTsKIAorLy9UT0RPOiBjaGVjayBnZW5lcmFsIGVycm9ycyBpbiBhZGRpdGlvbiB0byBvdmVyZmxvdyBvbiBzbnByaW50ZgorCiAvKgogICogVGhlIGZvbGxvd2luZyByZW1lbWJlcnMgdGhlIGpmaWVsZElEJ3Mgb2YgdGhlIGZpZWxkcwogICogb2YgdGhlIERoY3BJbmZvIEphdmEgb2JqZWN0LCBzbyB0aGF0IHdlIGRvbid0IGhhdmUKQEAgLTk4LDYgKzEwMCwxMSBAQAogICAgIH0KIH0KIAorc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfaXNEcml2ZXJMb2FkZWQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCit7CisgICAgcmV0dXJuIChqYm9vbGVhbikoOjppc193aWZpX2RyaXZlcl9sb2FkZWQoKSA9PSAxKTsKK30KKwogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfbG9hZERyaXZlcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eikKIHsKICAgICByZXR1cm4gKGpib29sZWFuKSg6OndpZmlfbG9hZF9kcml2ZXIoKSA9PSAwKTsKQEAgLTE1MCw2ICsxNTcsMzYgQEAKICAgICByZXR1cm4gZG9JbnRDb21tYW5kKCJBRERfTkVUV09SSyIpOwogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV93cHNQYmNDb21tYW5kKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqc3RyaW5nIGJzc2lkKQoreworICAgIGNoYXIgY21kc3RyWzUwXTsKKyAgICBqYm9vbGVhbiBpc0NvcHk7CisKKyAgICBjb25zdCBjaGFyICpic3NpZFN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYnNzaWQsICZpc0NvcHkpOworICAgIGludCBudW1Xcml0dGVuID0gc25wcmludGYoY21kc3RyLCBzaXplb2YoY21kc3RyKSwgIldQU19QQkMgJXMiLCBic3NpZFN0cik7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoYnNzaWQsIGJzc2lkU3RyKTsKKworICAgIGlmICgobnVtV3JpdHRlbiA9PSAtMSkgfHwgKG51bVdyaXR0ZW4gPj0gc2l6ZW9mKGNtZHN0cikpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoY21kc3RyLCAiT0siKTsKK30KKworc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfd3BzUGluQ29tbWFuZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBic3NpZCwgaW50IGFwUGluKQoreworICAgIGNoYXIgY21kc3RyWzUwXTsKKyAgICBqYm9vbGVhbiBpc0NvcHk7CisKKyAgICBjb25zdCBjaGFyICpic3NpZFN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYnNzaWQsICZpc0NvcHkpOworICAgIGludCBudW1Xcml0dGVuID0gc25wcmludGYoY21kc3RyLCBzaXplb2YoY21kc3RyKSwgIldQU19SRUcgJXMgJWQiLCBic3NpZFN0ciwgYXBQaW4pOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGJzc2lkLCBic3NpZFN0cik7CisKKyAgICBpZiAoKG51bVdyaXR0ZW4gPT0gLTEpIHx8IChudW1Xcml0dGVuID49IChpbnQpc2l6ZW9mKGNtZHN0cikpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoY21kc3RyLCAiT0siKTsKK30KKwogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChKTklFbnYqIGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBjbGF6eiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBuZXRJZCwKQEAgLTQwNiw2ICs0NDMsMzAgQEAKICAgICByZXR1cm4gKGppbnQpcG93ZXI7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX3NldEJhbmRDb21tYW5kKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IGJhbmQpCit7CisgICAgY2hhciBjbWRzdHJbMjVdOworCisgICAgaW50IG51bVdyaXR0ZW4gPSBzbnByaW50ZihjbWRzdHIsIHNpemVvZihjbWRzdHIpLCAiRFJJVkVSIFNFVEJBTkQgJWQiLCBiYW5kKTsKKyAgICBpbnQgY21kVG9vTG9uZyA9IG51bVdyaXR0ZW4gPj0gKGludClzaXplb2YoY21kc3RyKTsKKworICAgIHJldHVybiAoamJvb2xlYW4pIWNtZFRvb0xvbmcgJiYgZG9Cb29sZWFuQ29tbWFuZChjbWRzdHIsICJPSyIpOworfQorCitzdGF0aWMgamludCBhbmRyb2lkX25ldF93aWZpX2dldEJhbmRDb21tYW5kKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KQoreworICAgIGNoYXIgcmVwbHlbMjVdOworICAgIGludCBiYW5kOworCisgICAgaWYgKGRvQ29tbWFuZCgiRFJJVkVSIEdFVEJBTkQiLCByZXBseSwgc2l6ZW9mKHJlcGx5KSkgIT0gMCkgeworICAgICAgICByZXR1cm4gKGppbnQpLTE7CisgICAgfQorICAgIC8vIHJlcGx5IGNvbWVzIGJhY2sgaW4gdGhlIGZvcm0gIkJhbmQgWCIgd2hlcmUgWCBpcyB0aGUKKyAgICAvLyBudW1iZXIgd2UncmUgaW50ZXJlc3RlZCBpbi4KKyAgICBzc2NhbmYocmVwbHksICIlKnMgJXUiLCAmYmFuZCk7CisgICAgcmV0dXJuIChqaW50KWJhbmQ7Cit9CisKIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX3NldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgbnVtQ2hhbm5lbHMpCiB7CiAgICAgY2hhciBjbWRzdHJbMjU2XTsKQEAgLTQ5MywxNSArNTU0LDYgQEAKICAgICByZXR1cm4gZG9Cb29sZWFuQ29tbWFuZCgiQkxBQ0tMSVNUIGNsZWFyIiwgIk9LIik7CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX3NldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamJvb2xlYW4gZW5hYmxlZCkKLXsKLSAgICBjaGFyIGNtZHN0clsyNV07Ci0KLSAgICBzbnByaW50ZihjbWRzdHIsIHNpemVvZihjbWRzdHIpLCAiRFJJVkVSIFNFVFNVU1BFTkRPUFQgJWQiLCBlbmFibGVkID8gMCA6IDEpOwotICAgIHJldHVybiBkb0Jvb2xlYW5Db21tYW5kKGNtZHN0ciwgIk9LIik7Ci19Ci0KLQogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfZG9EaGNwUmVxdWVzdChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgam9iamVjdCBpbmZvKQogewogICAgIGppbnQgaXBhZGRyLCBnYXRld2F5LCBtYXNrLCBkbnMxLCBkbnMyLCBzZXJ2ZXIsIGxlYXNlOwpAQCAtNTMzLDYgKzU4NSw3IEBACiAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAKICAgICB7ICJsb2FkRHJpdmVyIiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfbG9hZERyaXZlciB9LAorICAgIHsgImlzRHJpdmVyTG9hZGVkIiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfaXNEcml2ZXJMb2FkZWR9LAogICAgIHsgInVubG9hZERyaXZlciIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX3VubG9hZERyaXZlciB9LAogICAgIHsgInN0YXJ0U3VwcGxpY2FudCIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX3N0YXJ0U3VwcGxpY2FudCB9LAogICAgIHsgInN0b3BTdXBwbGljYW50IiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfc3RvcFN1cHBsaWNhbnQgfSwKQEAgLTU2NCw2ICs2MTcsOCBAQAogICAgIHsgInN0b3BQYWNrZXRGaWx0ZXJpbmciLCAiKClaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3N0b3BQYWNrZXRGaWx0ZXJpbmcgfSwKICAgICB7ICJzZXRQb3dlck1vZGVDb21tYW5kIiwgIihJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0UG93ZXJNb2RlQ29tbWFuZCB9LAogICAgIHsgImdldFBvd2VyTW9kZUNvbW1hbmQiLCAiKClJIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2dldFBvd2VyTW9kZUNvbW1hbmQgfSwKKyAgICB7ICJzZXRCYW5kQ29tbWFuZCIsICIoSSlaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3NldEJhbmRDb21tYW5kfSwKKyAgICB7ICJnZXRCYW5kQ29tbWFuZCIsICIoKUkiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfZ2V0QmFuZENvbW1hbmR9LAogICAgIHsgInNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQiLCAiKEkpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kIH0sCiAgICAgeyAiZ2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZCIsICIoKUkiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfZ2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZCB9LAogICAgIHsgInNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQiLCAiKEkpWiIsCkBAIC01ODAsOCArNjM1LDggQEAKICAgICB7ICJzZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kIiwgIihJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZCB9LAogICAgIHsgImFkZFRvQmxhY2tsaXN0Q29tbWFuZCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfYWRkVG9CbGFja2xpc3RDb21tYW5kIH0sCiAgICAgeyAiY2xlYXJCbGFja2xpc3RDb21tYW5kIiwgIigpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9jbGVhckJsYWNrbGlzdENvbW1hbmQgfSwKLSAgICB7ICJzZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmQiLCAiKFopWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmR9LAotCisgICAgeyAic3RhcnRXcHNQYmNDb21tYW5kIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV93cHNQYmNDb21tYW5kIH0sCisgICAgeyAic3RhcnRXcHNQaW5Db21tYW5kIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfd3BzUGluQ29tbWFuZCB9LAogICAgIHsgImRvRGhjcFJlcXVlc3QiLCAiKExhbmRyb2lkL25ldC9EaGNwSW5mbzspWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9kb0RoY3BSZXF1ZXN0IH0sCiAgICAgeyAiZ2V0RGhjcEVycm9yIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2dldERoY3BFcnJvciB9LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRGVidWcuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKaW5kZXggM2VlNDA0YS4uNGE4NzdkMiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKQEAgLTE0LDYgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5vcy5EZWJ1ZyIKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgpAQCAtMjQsNiArMjUsOCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpZmRlZiBIQVZFX01BTExPQ19ICiAjaW5jbHVkZSA8bWFsbG9jLmg+CkBAIC0yNzQsNiArMjc3LDE3NiBAQAogamludCBhbmRyb2lkX29zX0RlYnVnX2dldFByb3h5T2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogamludCBhbmRyb2lkX29zX0RlYnVnX2dldERlYXRoT2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogCisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKy8qIHB1bGxlZCBvdXQgb2YgYmlvbmljICovCitleHRlcm4gIkMiIHZvaWQgZ2V0X21hbGxvY19sZWFrX2luZm8odWludDhfdCoqIGluZm8sIHNpemVfdCogb3ZlcmFsbFNpemUsCisgICAgc2l6ZV90KiBpbmZvU2l6ZSwgc2l6ZV90KiB0b3RhbE1lbW9yeSwgc2l6ZV90KiBiYWNrdHJhY2VTaXplKTsKK2V4dGVybiAiQyIgdm9pZCBmcmVlX21hbGxvY19sZWFrX2luZm8odWludDhfdCogaW5mbyk7CisjZGVmaW5lIFNJWkVfRkxBR19aWUdPVEVfQ0hJTEQgICgxPDwzMSkKKyNkZWZpbmUgQkFDS1RSQUNFX1NJWkUgICAgICAgICAgMzIKKworLyoKKyAqIFRoaXMgaXMgYSBxc29ydCgpIGNhbGxiYWNrLgorICoKKyAqIFNlZSBkdW1wTmF0aXZlSGVhcCgpIGZvciBjb21tZW50cyBhYm91dCB0aGUgZGF0YSBmb3JtYXQgYW5kIHNvcnQgb3JkZXIuCisgKi8KK3N0YXRpYyBpbnQgY29tcGFyZUhlYXBSZWNvcmRzKGNvbnN0IHZvaWQqIHZyZWMxLCBjb25zdCB2b2lkKiB2cmVjMikKK3sKKyAgICBjb25zdCBzaXplX3QqIHJlYzEgPSAoY29uc3Qgc2l6ZV90KikgdnJlYzE7CisgICAgY29uc3Qgc2l6ZV90KiByZWMyID0gKGNvbnN0IHNpemVfdCopIHZyZWMyOworICAgIHNpemVfdCBzaXplMSA9ICpyZWMxOworICAgIHNpemVfdCBzaXplMiA9ICpyZWMyOworCisgICAgaWYgKHNpemUxIDwgc2l6ZTIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChzaXplMSA+IHNpemUyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCogYnQxID0gKGludHB0cl90KikocmVjMSArIDIpOworICAgIGludHB0cl90KiBidDIgPSAoaW50cHRyX3QqKShyZWMyICsgMik7CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgQkFDS1RSQUNFX1NJWkU7IGlkeCsrKSB7CisgICAgICAgIGludHB0cl90IGFkZHIxID0gYnQxW2lkeF07CisgICAgICAgIGludHB0cl90IGFkZHIyID0gYnQyW2lkeF07CisgICAgICAgIGlmIChhZGRyMSA9PSBhZGRyMikgeworICAgICAgICAgICAgaWYgKGFkZHIxID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRkcjEgPCBhZGRyMikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGFkZHIxID4gYWRkcjIpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZ2V0X21hbGxvY19sZWFrX2luZm8oKSBjYWxsIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RydWN0cyB0aGF0CisgKiBsb29rIGxpa2UgdGhpczoKKyAqCisgKiAgIHNpemVfdCBzaXplCisgKiAgIHNpemVfdCBhbGxvY2F0aW9ucworICogICBpbnRwdHJfdCBiYWNrdHJhY2VbMzJdCisgKgorICogInNpemUiIGlzIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uLCAiYmFja3RyYWNlIiBpcyBhIGZpeGVkLXNpemUKKyAqIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgImFsbG9jYXRpb25zIiBpcyB0aGUgbnVtYmVyIG9mCisgKiBhbGxvY2F0aW9ucyB3aXRoIHRoZSBleGFjdCBzYW1lIHNpemUgYW5kIGJhY2t0cmFjZS4KKyAqCisgKiBUaGUgZW50cmllcyBhcmUgc29ydGVkIGJ5IGRlc2NlbmRpbmcgdG90YWwgc2l6ZSAoaS5lLiBzaXplKmFsbG9jYXRpb25zKQorICogdGhlbiBhbGxvY2F0aW9uIGNvdW50LiAgRm9yIGJlc3QgcmVzdWx0cyB3aXRoICJkaWZmIiB3ZSdkIGxpa2UgdG8gc29ydAorICogcHJpbWFyaWx5IGJ5IGluZGl2aWR1YWwgc2l6ZSB0aGVuIHN0YWNrIHRyYWNlLiAgU2luY2UgdGhlIGVudHJpZXMgYXJlCisgKiBmaXhlZC1zaXplLCBhbmQgd2UncmUgYWxsb3dlZCAoYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pIHRvIG1hbmdsZQorICogdGhlbSwgd2UgY2FuIGRvIHRoaXMgaW4gcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBOYXRpdmVIZWFwKEZJTEUqIGZwKQoreworICAgIHVpbnQ4X3QqIGluZm8gPSBOVUxMOworICAgIHNpemVfdCBvdmVyYWxsU2l6ZSwgaW5mb1NpemUsIHRvdGFsTWVtb3J5LCBiYWNrdHJhY2VTaXplOworCisgICAgZ2V0X21hbGxvY19sZWFrX2luZm8oJmluZm8sICZvdmVyYWxsU2l6ZSwgJmluZm9TaXplLCAmdG90YWxNZW1vcnksCisgICAgICAgICZiYWNrdHJhY2VTaXplKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoZnAsICJOYXRpdmUgaGVhcCBkdW1wIG5vdCBhdmFpbGFibGUuIFRvIGVuYWJsZSwgcnVuIHRoZXNlIgorICAgICAgICAgICAgICAgICAgICAiIGNvbW1hbmRzIChyZXF1aXJlcyByb290KTpcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc2V0cHJvcCBsaWJjLmRlYnVnLm1hbGxvYyAxXG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIiQgYWRiIHNoZWxsIHN0b3BcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc3RhcnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFzc2VydChpbmZvU2l6ZSAhPSAwKTsKKyAgICBhc3NlcnQob3ZlcmFsbFNpemUgJSBpbmZvU2l6ZSA9PSAwKTsKKworICAgIGZwcmludGYoZnAsICJBbmRyb2lkIE5hdGl2ZSBIZWFwIER1bXAgdjEuMFxuXG4iKTsKKworICAgIHNpemVfdCByZWNvcmRDb3VudCA9IG92ZXJhbGxTaXplIC8gaW5mb1NpemU7CisgICAgZnByaW50ZihmcCwgIlRvdGFsIG1lbW9yeTogJXp1XG4iLCB0b3RhbE1lbW9yeSk7CisgICAgZnByaW50ZihmcCwgIkFsbG9jYXRpb24gcmVjb3JkczogJXpkXG4iLCByZWNvcmRDb3VudCk7CisgICAgaWYgKGJhY2t0cmFjZVNpemUgIT0gQkFDS1RSQUNFX1NJWkUpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIldBUk5JTkc6IG1pc21hdGNoZWQgYmFja3RyYWNlIHNpemVzICglZCB2cy4gJWQpXG4iLAorICAgICAgICAgICAgYmFja3RyYWNlU2l6ZSwgQkFDS1RSQUNFX1NJWkUpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKworICAgIC8qIHJlLXNvcnQgdGhlIGVudHJpZXMgKi8KKyAgICBxc29ydChpbmZvLCByZWNvcmRDb3VudCwgaW5mb1NpemUsIGNvbXBhcmVIZWFwUmVjb3Jkcyk7CisKKyAgICAvKiBkdW1wIHRoZSBlbnRyaWVzIHRvIHRoZSBmaWxlICovCisgICAgY29uc3QgdWludDhfdCogcHRyID0gaW5mbzsKKyAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCByZWNvcmRDb3VudDsgaWR4KyspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAqKHNpemVfdCopIHB0cjsKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25zID0gKihzaXplX3QqKSAocHRyICsgc2l6ZW9mKHNpemVfdCkpOworICAgICAgICBpbnRwdHJfdCogYmFja3RyYWNlID0gKGludHB0cl90KikgKHB0ciArIHNpemVvZihzaXplX3QpICogMik7CisKKyAgICAgICAgZnByaW50ZihmcCwgInogJWQgIHN6ICU4enUgIG51bSAlNHp1ICBidCIsCisgICAgICAgICAgICAgICAgKHNpemUgJiBTSVpFX0ZMQUdfWllHT1RFX0NISUxEKSAhPSAwLAorICAgICAgICAgICAgICAgIHNpemUgJiB+U0laRV9GTEFHX1pZR09URV9DSElMRCwKKyAgICAgICAgICAgICAgICBhbGxvY2F0aW9ucyk7CisgICAgICAgIGZvciAoc2l6ZV90IGJ0ID0gMDsgYnQgPCBiYWNrdHJhY2VTaXplOyBidCsrKSB7CisgICAgICAgICAgICBpZiAoYmFja3RyYWNlW2J0XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgJTA4eCIsIGJhY2t0cmFjZVtidF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworCisgICAgICAgIHB0ciArPSBpbmZvU2l6ZTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKKyAgICBmcmVlX21hbGxvY19sZWFrX2luZm8oaW5mbyk7Cit9CisjZW5kaWYgLypIQVZFX0FORFJPSURfT1MqLworCisvKgorICogRHVtcCB0aGUgbmF0aXZlIGhlYXAsIHdyaXRpbmcgaHVtYW4tcmVhZGFibGUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQKKyAqIGZpbGUgZGVzY3JpcHRvci4KKyAqLworc3RhdGljIHZvaWQgYW5kcm9pZF9vc19EZWJ1Z19kdW1wTmF0aXZlSGVhcChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKKyAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yKQoreworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgb3JpZ0ZkID0gam5pR2V0RkRGcm9tRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKG9yaWdGZCA8IDApIHsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBkdXAoKSB0aGUgZGVzY3JpcHRvciBzbyB3ZSBkb24ndCBjbG9zZSB0aGUgb3JpZ2luYWwgd2l0aCBmY2xvc2UoKSAqLworICAgIGludCBmZCA9IGR1cChvcmlnRmQpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HVygiZHVwKCVkKSBmYWlsZWQ6ICVzXG4iLCBvcmlnRmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJkdXAoKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZJTEUqIGZwID0gZmRvcGVuKGZkLCAidyIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImZkb3BlbiglZCkgZmFpbGVkOiAlc1xuIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgImZkb3BlbigpIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiTmF0aXZlIGhlYXAgZHVtcCBzdGFydGluZy4uLlxuIik7CisgICAgZHVtcE5hdGl2ZUhlYXAoZnApOworICAgIExPR0QoIk5hdGl2ZSBoZWFwIGR1bXAgY29tcGxldGUuXG4iKTsKKyNlbHNlCisgICAgZnByaW50ZihmcCwgIk5hdGl2ZSBoZWFwIGR1bXAgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtXG4iKTsKKyNlbmRpZgorCisgICAgZmNsb3NlKGZwKTsKK30KKworCiAvKgogICogSk5JIHJlZ2lzdHJhdGlvbi4KICAqLwpAQCAtMjg5LDYgKzQ2Miw4IEBACiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRGVidWdfZ2V0RGlydHlQYWdlcyB9LAogICAgIHsgImdldE1lbW9yeUluZm8iLCAgICAgICAgICAiKElMYW5kcm9pZC9vcy9EZWJ1ZyRNZW1vcnlJbmZvOylWIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19EZWJ1Z19nZXREaXJ0eVBhZ2VzUGlkIH0sCisgICAgeyAiZHVtcE5hdGl2ZUhlYXAiLCAgICAgICAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2R1bXBOYXRpdmVIZWFwIH0sCiAgICAgeyAiZ2V0QmluZGVyU2VudFRyYW5zYWN0aW9ucyIsICIoKUkiLAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2dldEJpbmRlclNlbnRUcmFuc2FjdGlvbnMgfSwKICAgICB7ICJnZXRCaW5kZXJSZWNlaXZlZFRyYW5zYWN0aW9ucyIsICIoKUkiLApAQCAtMzIwLDQgKzQ5NSw0IEBACiAgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL29zL0RlYnVnIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CiB9CiAKLX07Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwCmluZGV4IDIxY2I5MTkuLmQzZmFhMmYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRmlsZVV0aWxzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX0ZpbGVVdGlscy5jcHAKQEAgLTExMyw2ICsxMTMsMTEgQEAKICAgICAjZW5kaWYKIH0KIAoramludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19zZXRVTWFzayhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBtYXNrKQoreworICAgIHJldHVybiB1bWFzayhtYXNrKTsKK30KKwogamludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBwYXRoKQogewogICAgICNpZiBIQVZFX0FORFJPSURfT1MKQEAgLTE3MCw2ICsxNzUsNyBAQAogc3RhdGljIGNvbnN0IEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RzW10gPSB7CiAgICAgeyJzZXRQZXJtaXNzaW9ucyIsICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJSSlJIiwgKHZvaWQqKWFuZHJvaWRfb3NfRmlsZVV0aWxzX3NldFBlcm1pc3Npb25zfSwKICAgICB7ImdldFBlcm1pc3Npb25zIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRQZXJtaXNzaW9uc30sCisgICAgeyJzZXRVTWFzayIsICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfc2V0VU1hc2t9LAogICAgIHsiZ2V0RmF0Vm9sdW1lSWQiLCAgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZH0sCiAgICAgeyJnZXRGaWxlU3RhdHVzIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3MvRmlsZVV0aWxzJEZpbGVTdGF0dXM7KVoiLCAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfZ2V0RmlsZVN0YXR1c30sCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAppbmRleCA4NDhhNTdhLi5lY2VlZjFjIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcApAQCAtNjYsNiArNjYsMjYgQEAKICAgICByZXR1cm4gZmlsZURlc2NyaXB0b3JDbG9uZTsKIH0KIAorc3RhdGljIGludCBhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmUoSk5JRW52KiBlbnYsCisgICAgam9iamVjdCBjbGF6eiwgam9iamVjdEFycmF5IG91dEZkcykKK3sKKyAgICBpbnQgZmRzWzJdOworICAgIGlmIChwaXBlKGZkcykgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgeworICAgICAgICBqb2JqZWN0IGZkT2JqID0gZW52LT5OZXdPYmplY3QoZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgICAgICAgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IpOworICAgICAgICBpZiAoZmRPYmogIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRJbnRGaWVsZChmZE9iaiwgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciwgZmRzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChvdXRGZHMsIGksIGZkT2JqKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGppbnQgZ2V0RmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCiB7CiAgICAgam9iamVjdCBkZXNjcmlwdG9yID0gZW52LT5HZXRPYmplY3RGaWVsZChjbGF6eiwgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRmlsZURlc2NyaXB0b3IpOwpAQCAtMTA5LDYgKzEyOSw4IEBACiBzdGF0aWMgY29uc3QgSk5JTmF0aXZlTWV0aG9kIGdQYXJjZWxGaWxlRGVzY3JpcHRvck1ldGhvZHNbXSA9IHsKICAgICB7ImdldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldCIsICIoTGphdmEvbmV0L1NvY2tldDspTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7IiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0RmlsZURlc2NyaXB0b3JGcm9tU29ja2V0fSwKKyAgICB7ImNyZWF0ZVBpcGVOYXRpdmUiLCAiKFtMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspSSIsCisgICAgICAgICh2b2lkKilhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmV9LAogICAgIHsiZ2V0U3RhdFNpemUiLCAiKClKIiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0U3RhdFNpemV9LAogICAgIHsic2Vla1RvIiwgIihKKUoiLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKaW5kZXggZDhlMDQ5ZC4uYTliOTFiMDQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcApAQCAtNTAsNiArNTAsOCBAQAogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25EZXZpY2VDcmVhdGVkOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25EZXZpY2VSZW1vdmVkOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25OZXR3b3JrRGV2aWNlRGlzY29ubmVjdGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkOwogCiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdDsKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ3JlYXRlRGV2aWNlUmVzdWx0OwpAQCAtNjYsNiArNjgsMTEgQEAKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQWdlbnRBdXRob3JpemU7CiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFnZW50Q2FuY2VsOwogCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdDsKKwogdHlwZWRlZiBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgbmF0aXZlX2RhdGFfdDsKIAogI2RlZmluZSBFVkVOVF9MT09QX1JFRlMgMTAKQEAgLTk3LDYgKzEwNCwxMCBAQAogICAgIG1ldGhvZF9vbkRldmljZVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25EZXZpY2VSZW1vdmVkIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIpOwogICAgIG1ldGhvZF9vbkRldmljZURpc2Nvbm5lY3RSZXF1ZXN0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VDb25uZWN0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztJKVYiKTsKKyAgICBtZXRob2Rfb25OZXR3b3JrRGV2aWNlRGlzY29ubmVjdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uTmV0d29ya0RldmljZURpc2Nvbm5lY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKIAogICAgIG1ldGhvZF9vbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwpAQCAtMTIwLDYgKzEzMSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogICAgIG1ldGhvZF9vbkRpc3BsYXlQYXNza2V5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uRGlzcGxheVBhc3NrZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJKVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1opViIpOworICAgIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1opViIpOwogICAgIG1ldGhvZF9vblJlcXVlc3RPb2JEYXRhID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uUmVxdWVzdE9vYkRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogCkBAIC0yMzIsNiArMjUxLDI3IEBACiAgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuSW5wdXQnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoKG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5OZXR3b3JrJyIsCisgICAgICAgICAgICAgICAgJmVycik7CisgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyKSkgeworICAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1IoJmVycik7CisgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuTmV0d29ya1NlcnZlciciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2gobmF0LT5jb25uLAogICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nb3JnLmJsdWV6LkF1ZGlvU2luayciLAogICAgICAgICAgICAgICAgICZlcnIpOwogICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKQEAgLTM5MCwxMyArNDMwLDMxIEBACiAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX29iamVjdF9wYXRoKG5hdC0+Y29ubiwgYWdlbnRfcGF0aCk7CiAKICAgICAgICAgZGJ1c19idXNfcmVtb3ZlX21hdGNoKG5hdC0+Y29ubiwKLSAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9J29yZy5ibHVlei5BdWRpb1NpbmsnIiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5BdWRpb1NpbmsnIiwKICAgICAgICAgICAgICAgICAmZXJyKTsKICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CiAgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKICAgICAgICAgfQogICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAotICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nb3JnLmJsdWV6LkRldmljZSciLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLkRldmljZSciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX3JlbW92ZV9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuSW5wdXQnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLk5ldHdvcmsnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLk5ldHdvcmtTZXJ2ZXInIiwKICAgICAgICAgICAgICAgICAmZXJyKTsKICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CiAgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKQEAgLTg2MSw2ICs5MTksNzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKHJlbW90ZV9kZXZpY2VfcGF0aCkpOwogICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgfSBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5JbnB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9wZXJ0eUNoYW5nZWQiKSkgeworCisgICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgICBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgICBpZiAoc3RyX2FycmF5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aChtc2cpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2FycmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SX1dJVEhfTVNHKCZlcnIsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHlDaGFuZ2VkIikpIHsKKworICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgIHBhcnNlX3Bhbl9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgIGlmIChzdHJfYXJyYXkgIT0gTlVMTCkgeworICAgICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgobXNnKTsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihjX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9hcnJheSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlRGlzY29ubmVjdGVkIikpIHsKKyAgICAgICBjaGFyICpjX2FkZHJlc3M7CisgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyhtc2csICZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpIHsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19hZGRyZXNzKSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlQ29ubmVjdGVkIikpIHsKKyAgICAgICBjaGFyICpjX2FkZHJlc3M7CisgICAgICAgY2hhciAqY19pZmFjZTsKKyAgICAgICB1aW50MTZfdCB1dWlkOworCisgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyhtc2csICZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19pZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDE2LCAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpIHsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VDb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihjX2lmYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUl9XSVRIX01TRygmZXJyLCBtc2cpOworICAgICAgIH0KKyAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgfQogCiAgICAgcmV0ID0gYTJkcF9ldmVudF9maWx0ZXIobXNnLCBlbnYpOwpAQCAtMTI3MCw2ICsxMzk1LDU3IEBACiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihhZGRyKTsKICAgICBmcmVlKHVzZXIpOwogfQorCit2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm4pIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSAobmF0aXZlX2RhdGFfdCAqKW47CisgICAgY29uc3QgY2hhciAqcGF0aCA9IChjb25zdCBjaGFyICopdXNlcjsKKyAgICBEQnVzRXJyb3IgZXJyOworICAgIGRidXNfZXJyb3JfaW5pdCgmZXJyKTsKKyAgICBKTklFbnYgKmVudjsKKyAgICBuYXQtPnZtLT5HZXRFbnYoKHZvaWQqKikmZW52LCBuYXQtPmVudlZlcik7CisKKyAgICBib29sIHJlc3VsdCA9IEpOSV9UUlVFOworICAgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UoJmVyciwgbXNnKSkgeworICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgcmVzdWx0ID0gSk5JX0ZBTFNFOworICAgIH0KKyAgICBMT0dWKCIuLi4gRGV2aWNlIFBhdGggPSAlcywgcmVzdWx0ID0gJWQiLCBwYXRoLCByZXN1bHQpOworICAgIGpzdHJpbmcgalBhdGggPSBlbnYtPk5ld1N0cmluZ1VURihwYXRoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBqUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqUGF0aCk7CisgICAgZnJlZSh1c2VyKTsKK30KKwordm9pZCBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbikgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IChuYXRpdmVfZGF0YV90ICopbjsKKyAgICBjb25zdCBjaGFyICpwYXRoID0gKGNvbnN0IGNoYXIgKil1c2VyOworICAgIERCdXNFcnJvciBlcnI7CisgICAgZGJ1c19lcnJvcl9pbml0KCZlcnIpOworICAgIEpOSUVudiAqZW52OworICAgIG5hdC0+dm0tPkdldEVudigodm9pZCoqKSZlbnYsIG5hdC0+ZW52VmVyKTsKKworICAgIGJvb2wgcmVzdWx0ID0gSk5JX1RSVUU7CisgICAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSgmZXJyLCBtc2cpKSB7CisgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICByZXN1bHQgPSBKTklfRkFMU0U7CisgICAgfQorICAgIExPR1YoIi4uLiBQYW4gRGV2aWNlIFBhdGggPSAlcywgcmVzdWx0ID0gJWQiLCBwYXRoLCByZXN1bHQpOworICAgIGpzdHJpbmcgalBhdGggPSBlbnYtPk5ld1N0cmluZ1VURihwYXRoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgalBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoalBhdGgpOworICAgIGZyZWUodXNlcik7Cit9CisKICNlbmRpZgogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCmluZGV4IGRhYTU5YTYuLjMzN2RjY2MgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCkBAIC0xNiw2ICsxNiwxMSBAQAogCiAjZGVmaW5lIERCVVNfQURBUFRFUl9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuQWRhcHRlciIKICNkZWZpbmUgREJVU19ERVZJQ0VfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLkRldmljZSIKKyNkZWZpbmUgREJVU19JTlBVVF9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuSW5wdXQiCisjZGVmaW5lIERCVVNfTkVUV09SS19JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuTmV0d29yayIKKyNkZWZpbmUgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5OZXR3b3JrU2VydmVyIgorCisKICNkZWZpbmUgTE9HX1RBRyAiQmx1ZXRvb3RoU2VydmljZS5jcHAiCiAKICNpbmNsdWRlICJhbmRyb2lkX2JsdWV0b290aF9jb21tb24uaCIKQEAgLTY4LDYgKzczLDkgQEAKIHZvaWQgb25DcmVhdGVQYWlyZWREZXZpY2VSZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbmF0KTsKIHZvaWQgb25EaXNjb3ZlclNlcnZpY2VzUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiB2b2lkIG9uQ3JlYXRlRGV2aWNlUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7Cit2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7Cit2b2lkIG9uQ29ubmVjdFBhblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuKTsKK3ZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiAKIAogLyoqIEdldCBuYXRpdmUgZGF0YSBzdG9yZWQgaW4gdGhlIG9wYXF1ZSAoSmF2YSBjb2RlIG1haW50YWluZWQpIHBvaW50ZXIgbU5hdGl2ZURhdGEKQEAgLTk5MCw2ICs5OTgsMTYwIEBACiAgICAgcmV0dXJuIEpOSV9GQUxTRTsKIH0KIAorc3RhdGljIGpib29sZWFuIGNvbm5lY3RJbnB1dERldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgcGF0aCkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSwgb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9wYXRoLCBldmVudExvb3BOYXQsIGNfcGF0aCwgREJVU19JTlBVVF9JRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgZXZlbnRMb29wID0gZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkX21FdmVudExvb3ApOworICAgIHN0cnVjdCBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgKmV2ZW50TG9vcE5hdCA9CisgICAgICAgICAgICBnZXRfRXZlbnRMb29wX25hdGl2ZV9kYXRhKGVudiwgZXZlbnRMb29wKTsKKworICAgIGlmIChuYXQgJiYgZXZlbnRMb29wTmF0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CisKKyAgICAgICAgaW50IGxlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHBhdGgpICsgMTsKKyAgICAgICAgY2hhciAqY29udGV4dF9wYXRoID0gKGNoYXIgKiljYWxsb2MobGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBzdHJsY3B5KGNvbnRleHRfcGF0aCwgY19wYXRoLCBsZW4pOyAgLy8gZm9yIGNhbGxiYWNrCisKKyAgICAgICAgYm9vbCByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luYyhlbnYsIG5hdC0+Y29ubiwgLTEsIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsIERCVVNfSU5QVVRfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKworc3RhdGljIGpib29sZWFuIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpib29sZWFuIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIHNyY19yb2xlLCBqc3RyaW5nIGJyaWRnZSkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgaWYgKG5hdCkgeworICAgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcm9sZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3JjX3JvbGUsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpjX2JyaWRnZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYnJpZGdlLCBOVUxMKTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBMT0dFKCJzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUgdHJ1ZSIpOworICAgICAgICAgICAgcmVwbHkgPSBkYnVzX2Z1bmNfYXJncyhlbnYsIG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYWRhcHRlcl9wYXRoKGVudiwgb2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktTRVJWRVJfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZjX2JyaWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUgZmFsc2UiKTsKKyAgICAgICAgICAgIHJlcGx5ID0gZGJ1c19mdW5jX2FyZ3MoZW52LCBuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FkYXB0ZXJfcGF0aChlbnYsIG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcmNfcm9sZSwgY19yb2xlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoYnJpZGdlLCBjX2JyaWRnZSk7CisgICAgICAgIHJldHVybiByZXBseSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKK3N0YXRpYyBqYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBzcmNSb2xlLCBqc3RyaW5nIGRzdFJvbGUpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBMT0dFKCJjb25uZWN0UGFuRGV2aWNlTmF0aXZlIik7CisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKKyAgICBqb2JqZWN0IGV2ZW50TG9vcCA9IGVudi0+R2V0T2JqZWN0RmllbGQob2JqZWN0LCBmaWVsZF9tRXZlbnRMb29wKTsKKyAgICBzdHJ1Y3QgZXZlbnRfbG9vcF9uYXRpdmVfZGF0YV90ICpldmVudExvb3BOYXQgPQorICAgICAgICAgICAgZ2V0X0V2ZW50TG9vcF9uYXRpdmVfZGF0YShlbnYsIGV2ZW50TG9vcCk7CisKKyAgICBpZiAobmF0ICYmIGV2ZW50TG9vcE5hdCkgeworICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpzcmMgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNyY1JvbGUsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpkc3QgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRzdFJvbGUsIE5VTEwpOworCisgICAgICAgIGludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChwYXRoKSArIDE7CisgICAgICAgIGNoYXIgKmNvbnRleHRfcGF0aCA9IChjaGFyICopY2FsbG9jKGxlbiwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgc3RybGNweShjb250ZXh0X3BhdGgsIGNfcGF0aCwgbGVuKTsgIC8vIGZvciBjYWxsYmFjaworCisgICAgICAgIGJvb2wgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmMoZW52LCBuYXQtPmNvbm4sIC0xLG9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktfSUZBQ0UsICJDb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNyY1JvbGUsIHNyYyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRzdFJvbGUsIGRzdCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRoKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworI2lmZGVmIEhBVkVfQkxVRVRPT1RICisgICAgTE9HRSgiZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZSIpOworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSxvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9wYXRoLCBldmVudExvb3BOYXQsIGNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktfSUZBQ0UsICJEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgY19wYXRoKTsKKyAgICAgICAgcmV0dXJuIHJldCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCkBAIC0xMDM5LDggKzEyMDEsMTggQEAKICAgICB7ImFkZFJmY29tbVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0pKUylJIiwgKHZvaWQgKilhZGRSZmNvbW1TZXJ2aWNlUmVjb3JkTmF0aXZlfSwKICAgICB7InJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKEkpWiIsICh2b2lkICopcmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZX0sCiAgICAgeyJzZXRMaW5rVGltZW91dE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlaIiwgKHZvaWQgKilzZXRMaW5rVGltZW91dE5hdGl2ZX0sCisgICAgLy8gSElEIGZ1bmN0aW9ucworICAgIHsiY29ubmVjdElucHV0RGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopY29ubmVjdElucHV0RGV2aWNlTmF0aXZlfSwKKyAgICB7ImRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZX0sCisKKyAgICB7InNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZSIsICIoWkxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIiwKKyAgICAgICAgICAgICAgKHZvaWQgKilzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmV9LAorICAgIHsiY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiLAorICAgICAgICAgICAgICAodm9pZCAqKWNvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAorICAgIHsiZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAogfTsKIAorCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYgKmVudikgewogICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKICAgICAgICAgICAgICAgICAiYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDAxOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAKQEAgLTAsMCArMSw1MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKyNpbmNsdWRlIDxTa1NjYWxlckNvbnRleHQuaD4KKyNpbmNsdWRlIDxTa1RlbXBsYXRlcy5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPERpc3BsYXlMaXN0UmVuZGVyZXIuaD4KKyNpbmNsdWRlIDxPcGVuR0xEZWJ1Z1JlbmRlcmVyLmg+CisjaW5jbHVkZSA8T3BlbkdMUmVuZGVyZXIuaD4KKyNpbmNsdWRlIDxTa2lhU2hhZGVyLmg+CisjaW5jbHVkZSA8U2tpYUNvbG9yRmlsdGVyLmg+CisjaW5jbHVkZSA8UmVjdC5oPgorCisjaW5jbHVkZSAiVGV4dExheW91dC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSB1aXJlbmRlcmVyOworCisvKioKKyAqIE5vdGU6IE9wZW5HTFJlbmRlcmVyIEpOSSBsYXllciBpcyBnZW5lcmF0ZWQgYW5kIGNvbXBpbGVkIG9ubHkgb24gc3VwcG9ydGVkCisgKiAgICAgICBkZXZpY2VzLiBUaGlzIG1lYW5zIGFsbCB0aGUgbG9naWMgbXVzdCBiZSBjb21waWxlZCBvbmx5IHdoZW4gdGhlCisgKiAgICAgICBwcmVwcm9jZXNzb3IgdmFyaWFibGUgVVNFX09QRU5HTF9SRU5ERVJFUiBpcyBkZWZpbmVkLgorICovCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX1JFTkRFUkVSIDAKKyNkZWZpbmUgUFJPRklMRV9SRU5ERVJFUiAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfUkVOREVSRVIKKyAgICAjZGVmaW5lIFJFTkRFUkVSX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIFJFTkRFUkVSX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphdmEgQVBJcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3RydWN0IHsKKyAgICBqY2xhc3MgY2xheno7CisgICAgam1ldGhvZElEIHNldDsKK30gZ1JlY3RDbGFzc0luZm87CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnN0cnVjdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgT3BlbkdMUmVuZGVyZXIqIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY3JlYXRlUmVuZGVyZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzKSB7CisgICAgUkVOREVSRVJfTE9HRCgiQ3JlYXRlIE9wZW5HTFJlbmRlcmVyIik7CisjaWYgUFJPRklMRV9SRU5ERVJFUgorICAgIHJldHVybiBuZXcgT3BlbkdMRGVidWdSZW5kZXJlcjsKKyNlbHNlCisgICAgcmV0dXJuIG5ldyBPcGVuR0xSZW5kZXJlcjsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIFJFTkRFUkVSX0xPR0QoIkRlc3Ryb3kgT3BlbkdMUmVuZGVyZXIiKTsKKyAgICBkZWxldGUgcmVuZGVyZXI7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNldHVwCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0Vmlld3BvcnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KSB7CisgICAgcmVuZGVyZXItPnNldFZpZXdwb3J0KHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3ByZXBhcmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpib29sZWFuIG9wYXF1ZSkgeworICAgIHJlbmRlcmVyLT5wcmVwYXJlKG9wYXF1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZmluaXNoKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmVuZGVyZXItPmZpbmlzaCgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2FjcXVpcmVDb250ZXh0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmVuZGVyZXItPmFjcXVpcmVDb250ZXh0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVsZWFzZUNvbnRleHQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+cmVsZWFzZUNvbnRleHQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RhdGUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLAorICAgICAgICBqaW50IGZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlKGZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRTYXZlQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPmdldFNhdmVDb3VudCgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+cmVzdG9yZSgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmVUb0NvdW50KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IHNhdmVDb3VudCkgeworICAgIHJlbmRlcmVyLT5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMYXllcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrUGFpbnQqIHBhaW50LCBqaW50IHNhdmVGbGFncykgeworICAgIHJldHVybiByZW5kZXJlci0+c2F2ZUxheWVyKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQsIHNhdmVGbGFncyk7Cit9CisKK3N0YXRpYyBqaW50IGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZUxheWVyQWxwaGEoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIGppbnQgYWxwaGEsIGppbnQgc2F2ZUZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlTGF5ZXJBbHBoYShsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGFscGhhLCBzYXZlRmxhZ3MpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGlwcGluZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3F1aWNrUmVqZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBTa0NhbnZhczo6RWRnZVR5cGUgZWRnZSkgeworICAgIHJldHVybiByZW5kZXJlci0+cXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdEYoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrUmVnaW9uOjpPcCBvcCkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcCk7Cit9CisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY2xpcFJlY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgbGVmdCwgamludCB0b3AsIGppbnQgcmlnaHQsIGppbnQgYm90dG9tLAorICAgICAgICBTa1JlZ2lvbjo6T3Agb3ApIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPmNsaXBSZWN0KGZsb2F0KGxlZnQpLCBmbG9hdCh0b3ApLCBmbG9hdChyaWdodCksIGZsb2F0KGJvdHRvbSksIG9wKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRDbGlwQm91bmRzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqb2JqZWN0IHJlY3QpIHsKKyAgICBjb25zdCBhbmRyb2lkOjp1aXJlbmRlcmVyOjpSZWN0JiBib3VuZHMocmVuZGVyZXItPmdldENsaXBCb3VuZHMoKSk7CisKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHJlY3QsIGdSZWN0Q2xhc3NJbmZvLnNldCwKKyAgICAgICAgICAgIGludChib3VuZHMubGVmdCksIGludChib3VuZHMudG9wKSwgaW50KGJvdW5kcy5yaWdodCksIGludChib3VuZHMuYm90dG9tKSk7CisKKyAgICByZXR1cm4gIWJvdW5kcy5pc0VtcHR5KCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc190cmFuc2xhdGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBkeCwgamZsb2F0IGR5KSB7CisgICAgcmVuZGVyZXItPnRyYW5zbGF0ZShkeCwgZHkpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3JvdGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGRlZ3JlZXMpIHsKKyAgICByZW5kZXJlci0+cm90YXRlKGRlZ3JlZXMpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NjYWxlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgc3gsIGpmbG9hdCBzeSkgeworICAgIHJlbmRlcmVyLT5zY2FsZShzeCwgc3kpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIHJlbmRlcmVyLT5zZXRNYXRyaXgobWF0cml4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Z2V0TWF0cml4KG1hdHJpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY29uY2F0TWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgcmVuZGVyZXItPmNvbmNhdE1hdHJpeChtYXRyaXgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEcmF3aW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgbGVmdCwgdG9wLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcFJlY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrQml0bWFwKiBiaXRtYXAsCisgICAgICAgIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKKyAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgc3JjTGVmdCwgc3JjVG9wLCBzcmNSaWdodCwgc3JjQm90dG9tLAorICAgICAgICAgICAgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwgU2tNYXRyaXgqIG1hdHJpeCwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd0JpdG1hcChiaXRtYXAsIG1hdHJpeCwgcGFpbnQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdQYXRjaChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwgamJ5dGVBcnJheSBjaHVua3MsCisgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgU2tQYWludCogcGFpbnQpIHsKKyAgICBqYnl0ZSogc3RvcmFnZSA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoY2h1bmtzLCBOVUxMKTsKKyAgICBSZXNfcG5nXzlwYXRjaCogcGF0Y2ggPSByZWludGVycHJldF9jYXN0PFJlc19wbmdfOXBhdGNoKj4oc3RvcmFnZSk7CisgICAgUmVzX3BuZ185cGF0Y2g6OmRlc2VyaWFsaXplKHBhdGNoKTsKKworICAgIHJlbmRlcmVyLT5kcmF3UGF0Y2goYml0bWFwLCAmcGF0Y2gtPnhEaXZzWzBdLCAmcGF0Y2gtPnlEaXZzWzBdLAorICAgICAgICAgICAgcGF0Y2gtPm51bVhEaXZzLCBwYXRjaC0+bnVtWURpdnMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQpOworCisgICAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoY2h1bmtzLCBzdG9yYWdlLCAwKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Q29sb3IoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSkgeworICAgIHJlbmRlcmVyLT5kcmF3Q29sb3IoY29sb3IsIG1vZGUpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdSZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3UmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdHMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrUmVnaW9uKiByZWdpb24sIFNrUGFpbnQqIHBhaW50KSB7CisgICAgU2tSZWdpb246Okl0ZXJhdG9yIGl0KCpyZWdpb24pOworICAgIHdoaWxlICghaXQuZG9uZSgpKSB7CisgICAgICAgIGNvbnN0IFNrSVJlY3QmIHIgPSBpdC5yZWN0KCk7CisgICAgICAgIHJlbmRlcmVyLT5kcmF3UmVjdChyLmZMZWZ0LCByLmZUb3AsIHIuZlJpZ2h0LCByLmZCb3R0b20sIHBhaW50KTsKKyAgICAgICAgaXQubmV4dCgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UGF0aChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3UGF0aChwYXRoLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0xpbmVzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXRBcnJheSBwb2ludHMsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBTa1BhaW50KiBwYWludCkgeworICAgIGpmbG9hdCogc3RvcmFnZSA9IGVudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKHBvaW50cywgTlVMTCk7CisKKyAgICByZW5kZXJlci0+ZHJhd0xpbmVzKHN0b3JhZ2UgKyBvZmZzZXQsIGNvdW50LCBwYWludCk7CisKKyAgICBlbnYtPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMocG9pbnRzLCBzdG9yYWdlLCAwKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2hhZGVycyBhbmQgY29sb3IgZmlsdGVycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc2V0TW9kaWZpZXJzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmVuZGVyZXItPnJlc2V0U2hhZGVyKCk7CisgICAgcmVuZGVyZXItPnJlc2V0Q29sb3JGaWx0ZXIoKTsKKyAgICByZW5kZXJlci0+cmVzZXRTaGFkb3coKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cFNoYWRlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tpYVNoYWRlciogc2hhZGVyKSB7CisgICAgcmVuZGVyZXItPnNldHVwU2hhZGVyKHNoYWRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBDb2xvckZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tpYUNvbG9yRmlsdGVyKiBmaWx0ZXIpIHsKKyAgICByZW5kZXJlci0+c2V0dXBDb2xvckZpbHRlcihmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZG93KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgcmFkaXVzLCBqZmxvYXQgZHgsIGpmbG9hdCBkeSwgamludCBjb2xvcikgeworICAgIHJlbmRlcmVyLT5zZXR1cFNoYWRvdyhyYWRpdXMsIGR4LCBkeSwgY29sb3IpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZXh0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIHJlbmRlclRleHQoT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBjb25zdCBqY2hhciogdGV4dCwgaW50IGNvdW50LAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBqY2hhciAqd29ya1RleHQ7CisgICAgamNoYXIqIGJ1ZmZlciA9IE5VTEw7CisgICAgaW50MzJfdCB3b3JrQnl0ZXM7CisgICAgaWYgKFRleHRMYXlvdXQ6OnByZXBhcmVUZXh0KHBhaW50LCB0ZXh0LCBjb3VudCwgZmxhZ3MsICZ3b3JrVGV4dCwgJndvcmtCeXRlcywgJmJ1ZmZlcikpIHsKKyAgICAgICAgcmVuZGVyZXItPmRyYXdUZXh0KChjb25zdCBjaGFyKikgd29ya1RleHQsIHdvcmtCeXRlcywgY291bnQsIHgsIHksIHBhaW50KTsKKyAgICAgICAgZnJlZShidWZmZXIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVuZGVyVGV4dFJ1bihPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGNvbnN0IGpjaGFyKiB0ZXh0LAorICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LAorICAgICAgICBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgdWludDhfdCBydGwgPSBmbGFncyAmIDB4MTsKKyAgICBpZiAocnRsKSB7CisgICAgICAgIFNrQXV0b1NUTWFsbG9jPDgwLCBqY2hhcj4gYnVmZmVyKGNvbnRleHRDb3VudCk7CisgICAgICAgIGpjaGFyKiBzaGFwZWQgPSBidWZmZXIuZ2V0KCk7CisgICAgICAgIGlmIChUZXh0TGF5b3V0OjpwcmVwYXJlUnRsVGV4dFJ1bih0ZXh0LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgc2hhcGVkKSkgeworICAgICAgICAgICAgcmVuZGVyZXItPmRyYXdUZXh0KChjb25zdCBjaGFyKikgc2hhcGVkLCBjb3VudCA8PCAxLCBjb3VudCwgeCwgeSwgcGFpbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVygiZHJhd1RleHRSdW4gZXJyb3IiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlcmVyLT5kcmF3VGV4dCgoY29uc3QgY2hhciopICh0ZXh0ICsgc3RhcnQpLCBjb3VudCA8PCAxLCBjb3VudCwgeCwgeSwgcGFpbnQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dEFycmF5KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0KHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgcmVuZGVyVGV4dChyZW5kZXJlciwgdGV4dEFycmF5ICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHRSdW5BcnJheShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZGlyRmxhZ3MsCisgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CisgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgcmVuZGVyVGV4dFJ1bihyZW5kZXJlciwgdGV4dEFycmF5ICsgY29udGV4dEluZGV4LCBpbmRleCAtIGNvbnRleHRJbmRleCwKKyAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIHgsIHksIGRpckZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOworIH0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1bihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBqZmxvYXQgeCwgamZsb2F0IHksIGludCBkaXJGbGFncywKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICBqaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgamludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgIHJlbmRlclRleHRSdW4ocmVuZGVyZXIsIHRleHRBcnJheSArIGNvbnRleHRTdGFydCwgc3RhcnQgLSBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBjb3VudCwgY29udGV4dENvdW50LCB4LCB5LCBkaXJGbGFncywgcGFpbnQpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3BsYXkgbGlzdHMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIE9wZW5HTFJlbmRlcmVyKiBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZURpc3BsYXlMaXN0UmVuZGVyZXIoCisgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcykgeworICAgIHJldHVybiBuZXcgRGlzcGxheUxpc3RSZW5kZXJlcjsKK30KKworc3RhdGljIERpc3BsYXlMaXN0KiBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZURpc3BsYXlMaXN0KEpOSUVudiogZW52LAorICAgICAgICBqb2JqZWN0IGNhbnZhcywgRGlzcGxheUxpc3RSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPmdldERpc3BsYXlMaXN0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZGVzdHJveURpc3BsYXlMaXN0KEpOSUVudiogZW52LAorICAgICAgICBqb2JqZWN0IGNhbnZhcywgRGlzcGxheUxpc3QqIGRpc3BsYXlMaXN0KSB7CisgICAgZGVsZXRlIGRpc3BsYXlMaXN0OworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdEaXNwbGF5TGlzdChKTklFbnYqIGVudiwKKyAgICAgICAgam9iamVjdCBjYW52YXMsIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgRGlzcGxheUxpc3QqIGRpc3BsYXlMaXN0KSB7CisgICAgZGlzcGxheUxpc3QtPnJlcGxheSgqcmVuZGVyZXIpOworfQorCisjZW5kaWYgLy8gVVNFX09QRU5HTF9SRU5ERVJFUgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21tb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGpib29sZWFuIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfaXNBdmFpbGFibGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgcmV0dXJuIEpOSV9UUlVFOworI2Vsc2UKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEpOSSBHbHVlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMiOworCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyAibklzQXZhaWxhYmxlIiwgICAgICAgIigpWiIsICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19pc0F2YWlsYWJsZSB9LAorCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHsgIm5DcmVhdGVSZW5kZXJlciIsICAgICIoKUkiLCAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY3JlYXRlUmVuZGVyZXIgfSwKKyAgICB7ICJuRGVzdHJveVJlbmRlcmVyIiwgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lSZW5kZXJlciB9LAorICAgIHsgIm5TZXRWaWV3cG9ydCIsICAgICAgICIoSUlJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0Vmlld3BvcnQgfSwKKyAgICB7ICJuUHJlcGFyZSIsICAgICAgICAgICAiKElaKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3ByZXBhcmUgfSwKKyAgICB7ICJuRmluaXNoIiwgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2ZpbmlzaCB9LAorICAgIHsgIm5BY3F1aXJlQ29udGV4dCIsICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfYWNxdWlyZUNvbnRleHQgfSwKKyAgICB7ICJuUmVsZWFzZUNvbnRleHQiLCAgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3JlbGVhc2VDb250ZXh0IH0sCisKKyAgICB7ICJuU2F2ZSIsICAgICAgICAgICAgICAiKElJKUkiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmUgfSwKKyAgICB7ICJuUmVzdG9yZSIsICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmUgfSwKKyAgICB7ICJuUmVzdG9yZVRvQ291bnQiLCAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmVUb0NvdW50IH0sCisgICAgeyAibkdldFNhdmVDb3VudCIsICAgICAgIihJKUkiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRTYXZlQ291bnQgfSwKKworICAgIHsgIm5TYXZlTGF5ZXIiLCAgICAgICAgICIoSUZGRkZJSSlJIiwgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZUxheWVyIH0sCisgICAgeyAiblNhdmVMYXllckFscGhhIiwgICAgIihJRkZGRklJKUkiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXJBbHBoYSB9LAorCisgICAgeyAiblF1aWNrUmVqZWN0IiwgICAgICAgIihJRkZGRkkpWiIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19xdWlja1JlamVjdCB9LAorICAgIHsgIm5DbGlwUmVjdCIsICAgICAgICAgICIoSUZGRkZJKVoiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY2xpcFJlY3RGIH0sCisgICAgeyAibkNsaXBSZWN0IiwgICAgICAgICAgIihJSUlJSUkpWiIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdCB9LAorCisgICAgeyAiblRyYW5zbGF0ZSIsICAgICAgICAgIihJRkYpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc190cmFuc2xhdGUgfSwKKyAgICB7ICJuUm90YXRlIiwgICAgICAgICAgICAiKElGKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3JvdGF0ZSB9LAorICAgIHsgIm5TY2FsZSIsICAgICAgICAgICAgICIoSUZGKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2NhbGUgfSwKKworICAgIHsgIm5TZXRNYXRyaXgiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0TWF0cml4IH0sCisgICAgeyAibkdldE1hdHJpeCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRNYXRyaXggfSwKKyAgICB7ICJuQ29uY2F0TWF0cml4IiwgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NvbmNhdE1hdHJpeCB9LAorCisgICAgeyAibkRyYXdCaXRtYXAiLCAgICAgICAgIihJSUZGSSlWIiwgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwIH0sCisgICAgeyAibkRyYXdCaXRtYXAiLCAgICAgICAgIihJSUZGRkZGRkZGSSlWIiwgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwUmVjdCB9LAorICAgIHsgIm5EcmF3Qml0bWFwIiwgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcE1hdHJpeCB9LAorICAgIHsgIm5EcmF3UGF0Y2giLCAgICAgICAgICIoSUlbQkZGRkZJKVYiLCAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGNoIH0sCisgICAgeyAibkRyYXdDb2xvciIsICAgICAgICAgIihJSUkpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Q29sb3IgfSwKKyAgICB7ICJuRHJhd1JlY3QiLCAgICAgICAgICAiKElGRkZGSSlWIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdSZWN0IH0sCisgICAgeyAibkRyYXdSZWN0cyIsICAgICAgICAgIihJSUkpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdHMgfSwKKyAgICB7ICJuRHJhd1BhdGgiLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdQYXRoIH0sCisgICAgeyAibkRyYXdMaW5lcyIsICAgICAgICAgIihJW0ZJSUkpViIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3TGluZXMgfSwKKworICAgIHsgIm5SZXNldE1vZGlmaWVycyIsICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzZXRNb2RpZmllcnMgfSwKKyAgICB7ICJuU2V0dXBTaGFkZXIiLCAgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZGVyIH0sCisgICAgeyAiblNldHVwQ29sb3JGaWx0ZXIiLCAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cENvbG9yRmlsdGVyIH0sCisgICAgeyAiblNldHVwU2hhZG93IiwgICAgICAgIihJRkZGSSlWIiwgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cFNoYWRvdyB9LAorCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJW0NJSUZGSUkpViIsICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dEFycmF5IH0sCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRklJKVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0IH0sCisKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElbQ0lJSUlGRklJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuQXJyYXkgfSwKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztJSUlJRkZJSSlWIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1biB9LAorCisgICAgeyAibkdldENsaXBCb3VuZHMiLCAgICAgIihJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspWiIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0Q2xpcEJvdW5kcyB9LAorCisgICAgeyAibkNyZWF0ZURpc3BsYXlMaXN0UmVuZGVyZXIiLCAiKClJIiwgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVEaXNwbGF5TGlzdFJlbmRlcmVyIH0sCisgICAgeyAibkNyZWF0ZURpc3BsYXlMaXN0IiwgICIoSSlJIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVEaXNwbGF5TGlzdCB9LAorICAgIHsgIm5EZXN0cm95RGlzcGxheUxpc3QiLCAiKEkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZGVzdHJveURpc3BsYXlMaXN0IH0sCisgICAgeyAibkRyYXdEaXNwbGF5TGlzdCIsICAgICIoSUkpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3RGlzcGxheUxpc3QgfSwKKworI2VuZGlmCit9OworCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICNkZWZpbmUgRklORF9DTEFTUyh2YXIsIGNsYXNzTmFtZSkgXAorICAgICAgICAgICAgdmFyID0gZW52LT5GaW5kQ2xhc3MoY2xhc3NOYW1lKTsgXAorICAgICAgICAgICAgTE9HX0ZBVEFMX0lGKCEgdmFyLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgIiBjbGFzc05hbWUpOyBcCisgICAgICAgICAgICB2YXIgPSBqY2xhc3MoZW52LT5OZXdHbG9iYWxSZWYodmFyKSk7CisgICAgCisgICAgI2RlZmluZSBHRVRfTUVUSE9EX0lEKHZhciwgY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpIFwKKyAgICAgICAgICAgIHZhciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpOyBcCisgICAgICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBtZXRob2QgIiBtZXRob2ROYW1lKTsKKyNlbHNlCisgICAgI2RlZmluZSBGSU5EX0NMQVNTKHZhciwgY2xhc3NOYW1lKQorICAgICNkZWZpbmUgR0VUX01FVEhPRF9JRCh2YXIsIGNsYXp6LCBtZXRob2ROYW1lLCBtZXRob2REZXNjcmlwdG9yKQorI2VuZGlmCisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzKEpOSUVudiogZW52KSB7CisgICAgRklORF9DTEFTUyhnUmVjdENsYXNzSW5mby5jbGF6eiwgImFuZHJvaWQvZ3JhcGhpY3MvUmVjdCIpOworICAgIEdFVF9NRVRIT0RfSUQoZ1JlY3RDbGFzc0luZm8uc2V0LCBnUmVjdENsYXNzSW5mby5jbGF6eiwgInNldCIsICIoSUlJSSlWIik7CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGtDbGFzc1BhdGhOYW1lLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KKworfTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19Nb3Rpb25FdmVudC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQuY3BwCmluZGV4IDkzZmQ1NGYuLjUzN2FjNzIgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19Nb3Rpb25FdmVudC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X01vdGlvbkV2ZW50LmNwcApAQCAtMjIsMTAgKzIyLDI2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dWkvSW5wdXQuaD4KICNpbmNsdWRlICJhbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIlNrTWF0cml4LmgiCisjaW5jbHVkZSAiU2tTY2FsYXIuaCIKIAogLy8gTnVtYmVyIG9mIGZsb2F0IGl0ZW1zIHBlciBlbnRyeSBpbiBhIERWTSBzYW1wbGUgZGF0YSBhcnJheQogI2RlZmluZSBOVU1fU0FNUExFX0RBVEEgOQogCisjZGVmaW5lIFNBTVBMRV9YIDAKKyNkZWZpbmUgU0FNUExFX1kgMQorI2RlZmluZSBTQU1QTEVfUFJFU1NVUkUgMgorI2RlZmluZSBTQU1QTEVfU0laRSAzCisjZGVmaW5lIFNBTVBMRV9UT1VDSF9NQUpPUiA0CisjZGVmaW5lIFNBTVBMRV9UT1VDSF9NSU5PUiA1CisjZGVmaW5lIFNBTVBMRV9UT09MX01BSk9SIDYKKyNkZWZpbmUgU0FNUExFX1RPT0xfTUlOT1IgNworI2RlZmluZSBTQU1QTEVfT1JJRU5UQVRJT04gOAorCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjM4LDggKzI1NCw4NyBAQAogICAgIH0KIH0KIAorc3RhdGljIGlubGluZSBmbG9hdCB0cmFuc2Zvcm1BbmdsZShjb25zdCBTa01hdHJpeCogbWF0cml4LCBmbG9hdCBhbmdsZVJhZGlhbnMpIHsKKyAgICAvLyBDb25zdHJ1Y3QgYW5kIHRyYW5zZm9ybSBhIHZlY3RvciBvcmllbnRlZCBhdCB0aGUgc3BlY2lmaWVkIGNsb2Nrd2lzZSBhbmdsZSBmcm9tIHZlcnRpY2FsLgorICAgIC8vIENvb3JkaW5hdGUgc3lzdGVtOiBkb3duIGlzIGluY3JlYXNpbmcgWSwgcmlnaHQgaXMgaW5jcmVhc2luZyBYLgorICAgIFNrUG9pbnQgdmVjdG9yOworICAgIHZlY3Rvci5mWCA9IFNrRmxvYXRUb1NjYWxhcihzaW5mKGFuZ2xlUmFkaWFucykpOworICAgIHZlY3Rvci5mWSA9IFNrRmxvYXRUb1NjYWxhcigtIGNvc2YoYW5nbGVSYWRpYW5zKSk7CisgICAgbWF0cml4LT5tYXBWZWN0b3JzKCYgdmVjdG9yLCAxKTsKKworICAgIC8vIERlcml2ZSB0aGUgdHJhbnNmb3JtZWQgdmVjdG9yJ3MgY2xvY2t3aXNlIGFuZ2xlIGZyb20gdmVydGljYWwuCisgICAgZmxvYXQgcmVzdWx0ID0gYXRhbjJmKFNrU2NhbGFyVG9GbG9hdCh2ZWN0b3IuZlgpLCBTa1NjYWxhclRvRmxvYXQoLSB2ZWN0b3IuZlkpKTsKKyAgICBpZiAocmVzdWx0IDwgLSBNX1BJXzIpIHsKKyAgICAgICAgcmVzdWx0ICs9IE1fUEk7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPiBNX1BJXzIpIHsKKyAgICAgICAgcmVzdWx0IC09IE1fUEk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19Nb3Rpb25FdmVudF9uYXRpdmVUcmFuc2Zvcm0oSk5JRW52KiBlbnYsCisgICAgICAgIGpvYmplY3QgZXZlbnRPYmosIGpvYmplY3QgbWF0cml4T2JqKSB7CisgICAgU2tNYXRyaXgqIG1hdHJpeCA9IGFuZHJvaWRfZ3JhcGhpY3NfTWF0cml4X2dldFNrTWF0cml4KGVudiwgbWF0cml4T2JqKTsKKworICAgIGpmbG9hdCBvbGRYT2Zmc2V0ID0gZW52LT5HZXRGbG9hdEZpZWxkKGV2ZW50T2JqLCBnTW90aW9uRXZlbnRDbGFzc0luZm8ubVhPZmZzZXQpOworICAgIGpmbG9hdCBvbGRZT2Zmc2V0ID0gZW52LT5HZXRGbG9hdEZpZWxkKGV2ZW50T2JqLCBnTW90aW9uRXZlbnRDbGFzc0luZm8ubVlPZmZzZXQpOworICAgIGppbnQgbnVtUG9pbnRlcnMgPSBlbnYtPkdldEludEZpZWxkKGV2ZW50T2JqLCBnTW90aW9uRXZlbnRDbGFzc0luZm8ubU51bVBvaW50ZXJzKTsKKyAgICBqaW50IG51bVNhbXBsZXMgPSBlbnYtPkdldEludEZpZWxkKGV2ZW50T2JqLCBnTW90aW9uRXZlbnRDbGFzc0luZm8ubU51bVNhbXBsZXMpOworICAgIGpmbG9hdEFycmF5IGRhdGFTYW1wbGVBcnJheSA9IGpmbG9hdEFycmF5KGVudi0+R2V0T2JqZWN0RmllbGQoZXZlbnRPYmosCisgICAgICAgICAgICBnTW90aW9uRXZlbnRDbGFzc0luZm8ubURhdGFTYW1wbGVzKSk7CisgICAgamZsb2F0KiBkYXRhU2FtcGxlcyA9IChqZmxvYXQqKWVudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChkYXRhU2FtcGxlQXJyYXksIE5VTEwpOworCisgICAgLy8gVGhlIHRyaWNreSBwYXJ0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gcHJlc2VydmUgdGhlIHZhbHVlIG9mCisgICAgLy8gcmF3WCBhbmQgcmF3WS4gIFNvIHdlIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiB0byB0aGUgZmlyc3QgcG9pbnQKKyAgICAvLyB0aGVuIGRlcml2ZSBhbiBhcHByb3ByaWF0ZSBuZXcgWC9ZIG9mZnNldCB0aGF0IHdpbGwgcHJlc2VydmUgcmF3WCBhbmQgcmF3WS4KKyAgICBTa1BvaW50IHBvaW50OworICAgIGpmbG9hdCByYXdYID0gZGF0YVNhbXBsZXNbU0FNUExFX1hdOworICAgIGpmbG9hdCByYXdZID0gZGF0YVNhbXBsZXNbU0FNUExFX1ldOworICAgIG1hdHJpeC0+bWFwWFkoU2tGbG9hdFRvU2NhbGFyKHJhd1ggKyBvbGRYT2Zmc2V0KSwgU2tGbG9hdFRvU2NhbGFyKHJhd1kgKyBvbGRZT2Zmc2V0KSwKKyAgICAgICAgICAgICYgcG9pbnQpOworICAgIGpmbG9hdCBuZXdYID0gU2tTY2FsYXJUb0Zsb2F0KHBvaW50LmZYKTsKKyAgICBqZmxvYXQgbmV3WSA9IFNrU2NhbGFyVG9GbG9hdChwb2ludC5mWSk7CisgICAgamZsb2F0IG5ld1hPZmZzZXQgPSBuZXdYIC0gcmF3WDsKKyAgICBqZmxvYXQgbmV3WU9mZnNldCA9IG5ld1kgLSByYXdZOworCisgICAgZGF0YVNhbXBsZXNbU0FNUExFX09SSUVOVEFUSU9OXSA9IHRyYW5zZm9ybUFuZ2xlKG1hdHJpeCwgZGF0YVNhbXBsZXNbU0FNUExFX09SSUVOVEFUSU9OXSk7CisKKyAgICAvLyBBcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYWxsIHNhbXBsZXMuCisgICAgamZsb2F0KiBjdXJyZW50RGF0YVNhbXBsZSA9IGRhdGFTYW1wbGVzOworICAgIGpmbG9hdCogZW5kRGF0YVNhbXBsZSA9IGRhdGFTYW1wbGVzICsgbnVtUG9pbnRlcnMgKiBudW1TYW1wbGVzICogTlVNX1NBTVBMRV9EQVRBOworICAgIGZvciAoOzspIHsKKyAgICAgICAgY3VycmVudERhdGFTYW1wbGUgKz0gTlVNX1NBTVBMRV9EQVRBOworICAgICAgICBpZiAoY3VycmVudERhdGFTYW1wbGUgPT0gZW5kRGF0YVNhbXBsZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBqZmxvYXQgeCA9IGN1cnJlbnREYXRhU2FtcGxlW1NBTVBMRV9YXSArIG9sZFhPZmZzZXQ7CisgICAgICAgIGpmbG9hdCB5ID0gY3VycmVudERhdGFTYW1wbGVbU0FNUExFX1ldICsgb2xkWU9mZnNldDsKKyAgICAgICAgbWF0cml4LT5tYXBYWShTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwgJiBwb2ludCk7CisgICAgICAgIGN1cnJlbnREYXRhU2FtcGxlW1NBTVBMRV9YXSA9IFNrU2NhbGFyVG9GbG9hdChwb2ludC5mWCkgLSBuZXdYT2Zmc2V0OworICAgICAgICBjdXJyZW50RGF0YVNhbXBsZVtTQU1QTEVfWV0gPSBTa1NjYWxhclRvRmxvYXQocG9pbnQuZlkpIC0gbmV3WU9mZnNldDsKKworICAgICAgICBjdXJyZW50RGF0YVNhbXBsZVtTQU1QTEVfT1JJRU5UQVRJT05dID0gdHJhbnNmb3JtQW5nbGUobWF0cml4LAorICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhU2FtcGxlW1NBTVBMRV9PUklFTlRBVElPTl0pOworICAgIH0KKworICAgIGVudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZGF0YVNhbXBsZUFycmF5LCBkYXRhU2FtcGxlcywgMCk7CisKKyAgICBlbnYtPlNldEZsb2F0RmllbGQoZXZlbnRPYmosIGdNb3Rpb25FdmVudENsYXNzSW5mby5tWE9mZnNldCwgbmV3WE9mZnNldCk7CisgICAgZW52LT5TZXRGbG9hdEZpZWxkKGV2ZW50T2JqLCBnTW90aW9uRXZlbnRDbGFzc0luZm8ubVlPZmZzZXQsIG5ld1lPZmZzZXQpOworCisgICAgZW52LT5EZWxldGVMb2NhbFJlZihkYXRhU2FtcGxlQXJyYXkpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01vdGlvbkV2ZW50TWV0aG9kc1tdID0geworICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLworICAgIHsgIm5hdGl2ZVRyYW5zZm9ybSIsCisgICAgICAgICAgICAiKExhbmRyb2lkL2dyYXBoaWNzL01hdHJpeDspViIsCisgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X01vdGlvbkV2ZW50X25hdGl2ZVRyYW5zZm9ybSB9LAorfTsKKwogI2RlZmluZSBGSU5EX0NMQVNTKHZhciwgY2xhc3NOYW1lKSBcCiAgICAgICAgIHZhciA9IGVudi0+RmluZENsYXNzKGNsYXNzTmFtZSk7IFwKICAgICAgICAgTE9HX0ZBVEFMX0lGKCEgdmFyLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgIiBjbGFzc05hbWUpOyBcCkBAIC0yNTgsNiArMzUzLDEwIEBACiAgICAgICAgIExPR19GQVRBTF9JRighIHZhciwgIlVuYWJsZSB0byBmaW5kIGZpZWxkICIgZmllbGROYW1lKTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19Nb3Rpb25FdmVudChKTklFbnYqIGVudikgeworICAgIGludCByZXMgPSBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50IiwKKyAgICAgICAgICAgIGdNb3Rpb25FdmVudE1ldGhvZHMsIE5FTEVNKGdNb3Rpb25FdmVudE1ldGhvZHMpKTsKKyAgICBMT0dfRkFUQUxfSUYocmVzIDwgMCwgIlVuYWJsZSB0byByZWdpc3RlciBuYXRpdmUgbWV0aG9kcy4iKTsKKwogICAgIEZJTkRfQ0xBU1MoZ01vdGlvbkV2ZW50Q2xhc3NJbmZvLmNsYXp6LCAiYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50Iik7CiAKICAgICBHRVRfU1RBVElDX01FVEhPRF9JRChnTW90aW9uRXZlbnRDbGFzc0luZm8ub2J0YWluLCBnTW90aW9uRXZlbnRDbGFzc0luZm8uY2xhenosCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcAppbmRleCA1MTczYmI4Li4yOTg4YWU4IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAKQEAgLTc2LDEwICs3Niw2IEBACiAgICAgY2FudmFzLT5yZXN0b3JlKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19WaWV3Um9vdF9hYmFuZG9uR2xDYWNoZXMoSk5JRW52KiBlbnYsIGpvYmplY3QpIHsKLSAgICBTa0dMQ2FudmFzOjpBYmFuZG9uQWxsVGV4dHVyZXMoKTsKLX0KLQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTg3LDkgKzgzLDcgQEAKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewogICAgIHsgICAibmF0aXZlU2hvd0ZQUyIsICIoTGFuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzO0kpViIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3Um9vdF9zaG93RlBTIH0sCi0gICAgeyAgICJuYXRpdmVBYmFuZG9uR2xDYWNoZXMiLCAiKClWIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3ZpZXdfVmlld1Jvb3RfYWJhbmRvbkdsQ2FjaGVzIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X1ZpZXdSb290X3Nob3dGUFMgfQogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19WaWV3Um9vdChKTklFbnYqIGVudikgewpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvQW5kcm9pZC5tayBiL2NvcmUvcmVzL0FuZHJvaWQubWsKaW5kZXggN2QxMTE0OC4uMjJmNGZkYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvQW5kcm9pZC5taworKysgYi9jb3JlL3Jlcy9BbmRyb2lkLm1rCkBAIC0zMyw4ICszMywxNiBAQAogIyBQUk9EVUNULWFnbm9zdGljIHJlc291cmNlIGRhdGEgbGlrZSBJRHMgYW5kIHR5cGUgZGVmaW5pdGlvbnMuCiBMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVMgOj0gdHJ1ZQogCisjIEluY2x1ZGUgcmVzb3VyY2VzIGdlbmVyYXRlZCBieSBzeXN0ZW0gUmVuZGVyU2NyaXB0IGZpbGVzLgorZnJhbWV3b3JrX0dFTkVSQVRFRF9TT1VSQ0VfRElSIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsZnJhbWV3b3JrLCxDT01NT04pL3NyYworZnJhbWV3b3JrX1JlbmRlclNjcmlwdF9TVEFNUF9GSUxFIDo9ICQoZnJhbWV3b3JrX0dFTkVSQVRFRF9TT1VSQ0VfRElSKS9SZW5kZXJTY3JpcHQuc3RhbXAKKyNMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChmcmFtZXdvcmtfR0VORVJBVEVEX1NPVVJDRV9ESVIpL3JlbmRlcnNjcmlwdC9yZXMgJChMT0NBTF9QQVRIKS9yZXMKKwogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCiAKKyMgTWFrZSBzdXJlIHRoZSBzeXN0ZW0gLnJzIGZpbGVzIGdldCBjb21waWxlZCBiZWZvcmUgYnVpbGRpbmcgdGhlIHBhY2thZ2UtZXhwb3J0LmFway4KKyMgJChyZXNvdXJjZV9leHBvcnRfcGFja2FnZSk6ICQoZnJhbWV3b3JrX1JlbmRlclNjcmlwdF9TVEFNUF9GSUxFKQorCiAjIGRlZmluZSBhIGdsb2JhbCBpbnRlcm1lZGlhdGUgdGFyZ2V0IHRoYXQgb3RoZXIgbW9kdWxlIG1heSBkZXBlbmQgb24uCiAuUEhPTlk6IGZyYW1ld29yay1yZXMtcGFja2FnZS10YXJnZXQKIGZyYW1ld29yay1yZXMtcGFja2FnZS10YXJnZXQ6ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOWQ5MTRhZC4uODVlOGE2MCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC04NSw2ICs4NSw4IEBACiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ09OTkVDVEVEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0RJU0NPTk5FQ1RFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9TVEFURSIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DQU1FUkFfQVRUQUNIRUQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0RFVEFDSEVEIiAvPgogCiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20udHJ1c3RlZGxvZ2ljLnRydXN0ZWRuZmMuYW5kcm9pZC5hY3Rpb24uTkRFRl9UQUdfRElTQ09WRVJFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS50cnVzdGVkbG9naWMudHJ1c3RlZG5mYy5hbmRyb2lkLmFjdGlvbi5UUkFOU0FDVElPTl9ERVRFQ1RFRCIgLz4KQEAgLTM3OSw2ICszODEsMTMgQEAKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19hY2NvdW50TWFuYWdlclNlcnZpY2UiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9hY2NvdW50TWFuYWdlclNlcnZpY2UiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhbiBpbnRlcm5hbCB1c2VyIHRvIHVzZSBwcml2YWxlZGdlZCBDb25uZWN0aXZpdHlNYW5hZ2VyCisgICAgQVBJcy4KKyAgICAgICAgQGhpZGUgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ09OTkVDVElWSVRZX0lOVEVSTkFMIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLk5FVFdPUksiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmVPclN5c3RlbSIgLz4KKwogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIFBlcm1pc3Npb25zIGZvciBhY2Nlc3NpbmcgYWNjb3VudHMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTMxNyw3ICsxMzI2LDcgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4Y2x1ZGVGcm9tUmVjZW50cz0idHJ1ZSI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5QbGF0TG9nb0FjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iPgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5XYWxscGFwZXIuTm9UaXRsZUJhci5GdWxsc2NyZWVuIj4KICAgICAgICAgPC9hY3Rpdml0eT4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkRpc2FibGVDYXJNb2RlQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lLk5vRGlzcGxheSIKQEAgLTEzNTQsNiArMTM2MywxMCBAQAogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX1JFUVVFU1RfU0hVVERPV04iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uUkVCT09UIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5OZXRJbml0aWF0ZWRBY3Rpdml0eSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuRGlhbG9nLkFsZXJ0IgpAQCAtMTM2Nyw2ICsxMzgwLDExIEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9XQUxMUEFQRVIiPgogICAgICAgICA8L3NlcnZpY2U+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JbnB1dE1ldGhvZEFuZFN1YnR5cGVFbmFibGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhjbHVkZUZyb21SZWNlbnRzPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5Cb290UmVjZWl2ZXIiID4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uQk9PVF9DT01QTEVURUQiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LWRpc2FibGVkLnBuZyBiL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtZGlzYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTIyMGU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtZGlzYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1ub0hpZ2hsaWdodC5wbmcgYi9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LW5vSGlnaGxpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJjZGY3Mi4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LW5vSGlnaGxpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMgYi9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2h5cGhfZW5fVVMuZGljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTIwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2h5cGhfZW5fVVMuZGljCkBAIC0wLDAgKzEsOTc4NCBAQAorSVNPODg1OS0xCitMRUZUSFlQSEVOTUlOIDIKK1JJR0hUSFlQSEVOTUlOIDMKKy5hMmNoNAorLmFkNGRlcgorLmEyZAorLmFkMWQ0CisuYTJmMXQKKy5hMmYKKy5hNGwzdAorLmFtNWF0CisuNGExbWEKKy5hbjVjCisuYTJuCisuMmFuZzQKKy5hbjFpNW0KKy5hbjF0NAorLmFuM3RlCisuYW50aTVzCisuYW50MmkKKy5hNHI1czIKKy4yYTJyCisuYXI0dDJpZTQKKy5hcjF0aQorLmFyNHR5CisuYXMzYworLmFzMXAKKy5hMnMxcworLmFzdGVyNQorLmEydG9tNQorLmExdG8KKy5hdTFkCisuYXY0aQorLmF3bjQKKy5iYTRnCisuYmE1bmEKKy5iYTJuCisuYmFzNGUKKy5iZXI0CisuYmU1cjFhCisuYmUzczFtCisuNGJlczQKKy5iNGU1czJ0bworLmJyaTIKKy5idXQ0dGkKKy5idTR0M3QyCisuY2FtNHBlCisuMWNhCisuY2E0bTFwCisuY2FuNWMKKy5jYTJuCisuY2FwYTViCisuY2ExcGEKKy5jYXI1b2wKKy5jMmEycgorLmNhNHQKKy5jZTRsYQorLjJjaDQKKy5jaGlsbDVpCisuY2g0aWwyCisuY2hpbDFsCisuMWNpMgorLmNpdDVyCisuMmMxaXQKKy5jbzNlMgorLjFjbworLmNvNHIKKy5jb3I1bjFlcgorLmNvcm4yZQorLmRlNG1vaTIKKy5kNGVtCisuZGUxbW8KKy5kZTNvCisuZGUzcjFhCisuZGUzcjFpCisuZGUxczRjCisuZGVzMgorLmRpYzF0MmlvNQorLjNkaTJjMXQKKy5kbzR0CisuMWRvCisuZHU0YworLjFkdQorLmR1NG0xYjUKKy5lYXJ0aDUKKy5lYXIydAorLmUyYTJyCisuZWFzM2kKKy4yZTFiNAorLmVlcjQKKy5lZzIKKy5lMmw1ZAorLmVsM2VtCisuZW5hbTMKKy5lMW5hCisuZW4zZworLmUybjNzMgorLmVxNXVpNXQKKy5lMXEKKy5lcXUyCisuZXEydWkyCisuZXI0cmkKKy5lcjFyNAorLmVzMworLjRldTMKKy5leWU1CisuZmVzMworLmZvcjVtZXIKKy4xZm8KKy5mbzJyCisuZm9yMW0KKy5mb3IybWUKKy4xZ2EyCisuZ2UyCisuZ2VuM3Q0CisuMWdlbgorLmdlNW8yZworLjFnZW8KKy4xZzJpNWEKKy5naTRiCisuZ280cgorLjFnbworLmhhbmQ1aQorLmhhMm4KKy5oNGFuZAorLmhhNG41azIKKy5oZTIKKy5oZXJvNWkyCisuaDJlcm8KKy5oMWVzMworLmhlNHQzCisuaGkzYgorLmhpM2VyCisuaDJpZTQKKy5ob241ZXkKKy5obzJuCisuaG9uM28KKy5ob3Y1CisuaWQ0bAorLjJpZAorLmlkb2wzCisuaTFkbworLmltM20KKy5pbTVwMWkybgorLmk0bTFwCisuaW0ycGkKKy5pbjEKKy5pbjNjaQorLjJpbmUyCisuNGk0bjJrMgorLjJpMm4zczIKKy5pcjVyNAorLjRpcgorLmlzNGkKKy5qdTNyCisubGE0Y3kKKy5sYTRtCisubGF0NWVyCisubDRhdGg1CisubGUyCisubGVnNWUKKy5sZW40CisubGVwNQorLmxldjEKKy5sMmk0ZworLmxpMWc1YQorLmxpMm4KKy5sMmkzbworLmwxaTR0CisubWExZzVhNQorLjFtYQorLm1hbDVvCisubWExbjVhCisubWEybgorLm1hcjV0aQorLm0yYTJyCisubWUyCisubWVyM2MKKy5tZTV0ZXIKKy5tZTF0ZQorLm0yaXMxCisubWlzNHQ1aQorLm1vbjNlCisuMW1vCisubW8ybgorLm1vM3JvCisubW8ycgorLm11NXRhCisuMW11CisubXUydGE1YgorLm5pNGMKKy5vZDIKKy5vZDFkNQorLm9mNXRlCisubzJmdAorLm9yNWExdG8KKy5vMXJhCisub3IzYworLm9yMWQKKy5vcjN0Cisub3MzCisub3M0dGwKKy40b3RoMworLm91dDMKKy5vdTIKKy5wZWQ1YWwKKy4ycDJlZAorLnAyZTJkMmEKKy5wZTV0ZQorLnBlMnQKKy5wZTV0aXQKKy5wMmk0ZTQKKy5waW81bjQKKy4zcDJpMW8KKy5waTJ0CisucHJlM20KKy5wcjIKKy5yYTRjCisucmFuNHQKKy5yYTJuCisucmF0aW81bjFhCisucmF0aW8ybjQKKy5yYTF0MmlvCisucmVlMgorLnJlNW1pdAorLnJlczIKKy5yZTVzdGF0CisucmVzMnQKKy5yZXMxdGEKKy5yMmk0ZworLnJpMnQ1dQorLnJvNHEKKy5yb3M1dAorLnJvdzVkCisucnU0ZAorLjNzNGMyaTNlNAorLnMxY2kKKy41c2UybDJmNQorLnNlbDFsNQorLnNlMm4KKy5zZTVyMmllNAorLnNlcjFpCisuczJoMgorLnNpMgorLnMzaW5nNAorLjJzMWluCisuc3Q0Cisuc3RhNWIybDIKKy5zMXRhCisuczJ0YWIKKy5zNHkyCisuMXRhNAorLnRlNAorLjN0ZW41YTJuCisudGUxbmEKKy50aDIKKy50aTIKKy50aWw0CisudGkxbTVvNQorLjF0aW0KKy50aW5nNAorLjJ0MWluCisudDRpNG41azIKKy50bzFuNGEKKy4xdG8KKy50bzJuCisudG80cAorLnRvcDVpCisudG8ydTVzCisudG91MgorLnRyaWI1dXQKKy50cjRpYgorLnUxbjFhCisudW4zY2UKKy51bmRlcjUKKy51bjFkZQorLnUybjFlCisudTRuNWsyCisudW41bworLnVuM3U0CisudXAzCisudXJlMworLnVzNWEyCisuMnVzCisudmVuNGRlCisudmU1cjFhCisud2lsNWkKKy53aTIKKy53aWwyCisueWU0Cis0YWIuCithNWJhbAorYTViYTJuCithYmUyCithYjVlcmQKK2FiMmk1YQorYWI1aTJ0NWFiCithYmkydAorYWJpMXRhCithYjVsYXQKK2FiMmwyCithYjVvNWwxaXoKK2Fib2wyaQorNGFicgorYWI1cm9nCithYjN1bAorYTRjMmEycgorYTFjYQorYWM1YXJkCithYzVhcm8KK2E1Y2VvdTIKK2FjMWVyCithNWNoZTR0CithMmNoCithY2hlMgorNGEyY2kKK2EzYzJpZTQKK2EyYzFpbgorYTNjMmlvCithYzVyb2IKK2FjdDVpZjIKK2EyYzF0CithYzN1bAorYWM0dW0KK2EyZAorYWQ0ZDFpbgorYWQxZDQKK2FkNWVyLgorMmFkaQorYTNkNGkzYQorYWQzaTFjYQorYWRpNGVyCithZDJpZTQKK2EzZDJpbworYTNkaXQKK2E1ZGkxdQorYWQ0bGUKK2FkM293CithMWRvCithZDVyYTJuCithMWRyCithZDRzdQorYTJkMXMyCis0YTFkdQorYTNkdTJjCithZDV1bQorYWU0cgorYWVyMmk0ZTQKK2FlcjFpCithMmYKK2E0ZjFmNAorYTRnYWIKK2ExZ2EKK2FnYTRuCithZzVlbDFsCithMWdlNG8KKzRhZzRldQorYWcxaQorNGFnNGwyCithZzFuCithMmdvCiszYTNnNG80ZworYWczbzNuaQorYWdvMm4yCithNWd1ZXIKK2EyZ3VlCithZzV1bAorYTRneQorYTNoYQorYTNoZQorYTRoNGw0CithM2hvCithaTIKK2E1aTFhCithM2ljLgorYWk1bHkKK2E0aTRuCithaW41aW4KK2EyaW5pCithMmkxbjVvCithaXQ1ZW4KK2EyaXRlCithMWoKK2FrMWVuCithbDVhYgorYWwzYTJkCithNGwyYTJyCis0YWxkaTQKK2EybGQKKzJhbGUKK2FsM2VuZAorYTRsZW50MmkKK2ExbGVuMXQKK2E1bGU1bworYWwxaQorYWw0aWEuCithbDJpMWEKK2FsMmk0ZTQKK2FsNWxldgorYWwxbAorYWwybGUKKzRhbGxpYworYWxsMmkKKzRhMmxtCithNWxvZy4KK2E0bHkuCithMWx5Cis0YTJseXM0Cis1YTVseXMxdAorNWFseXQKKzNhbHl6Cis0YTFtYQorYTJtNWFiCithbTNhZworYW1hNXJhCithbTJhMnIKK2FtNWFzYworYTRtYTN0aXMKK2E0bTVhMXRvCithbTVlcjFhCithbTNpYworYW01aWYKK2FtNWkxbHkKK2FtMWluCithbTJpNG5vCithMm1vCithNW1vMm4KK2Ftb3I1aQorYW1vMnIKK2FtcDVlbgorYTRtMXAKK2EybgorYW4zYWdlCithMW5hCiszYW5hMWx5CithM24yYTJyCithbjNhcjNjCithbmFyNGkKK2EzbmF0aQorYW4yYXQKKzRhbmQKK2FuZGU0czIKK2FuMWRlCithbjNkaXMxCithbjFkbAorYW40ZG93CithbjFkbworYTVuZWUKK2EzbmVuCithbjVlMnN0LgorYTFuZXMKK2EybmVzdAorYTNuNGV1CisyYW5nCithbmc1aWU0CithbjFnbDIKK2E0bjFpYworYTNuaWVzCithbjJpZTQKK2FuM2kzZgorYW40aW1lCithbjFpbQorYTVuaW0xaQorYTVuMmluZQorYW4xaW4KK2FuM2k0bworYTNuMmlwCithbjNpczJoCithbjNpdAorYTNuaTF1CithbjRrbGkKK2E0bmsyCithbjFrMWwKKzVhbm5pegorYTRuMW4yCithbm80CithbjVvdAorYW40b3RoNQorYW4yc2EyCithMm4xczIKK2FuNHMxY28KK2FuczRjCithbjRzMW40CithbjJzcAorYW5zM3BvCithbjRzdAorYW40c3UycgorYW4xc3UKK2FudGEybDQKK2FuMXQKK2FuMXRhCithbjR0MmllNAorYW50MmkKKzRhbjF0bworYW4ydHIKK2FuNHR3NAorYW4zdTFhCithbjN1bAorYTVudXIKKzRhbworYXAyYTJyNAorYTFwYQorYXA1YXQKK2FwNWVyM28KK2EzcGg0ZXIKKzRhcGhpCithNHBpbGxhCithcGlsMWwKK2FwNWlsbDJhMnIKK2FwM2kybgorYXAzaTF0YQorYTNwaTJ0dQorYTJwMmwyCithcG80YzUKK2FwNW8xbGEKK2Fwb3I1aQorYTFwNG9yCithcG9zM3QKK2ExcG9zCithcHM1ZTRzCithMnAxczIKK2FwMnNlCithM3B1CithcXVlNQorYXF1MgorMmEycgorYXIzYTJjMXQKK2E1cmFkZQorYXJhMmQKK2FyNWFkaXMxCithcjJhZGkKK2FyM2FsCithNXJhbWUxdGUKK2FyYW0zZXQKK2FyMmFuNGcKK2FyYTJuCithcmEzcAorYXI0YXQKK2E1cmExdDJpbworYXI1YTF0Mml2CithNXJhdQorYXI1YXY0CithcmF3NAorYXJiYWw0CithcjFiCithcjRjaGEybgorYXIxYworYXIzY2hhCithcjJjaAorYXI1ZDJpbmUKK2FyZDJpCithcmQxaW40CithcjRkcgorYXI1ZWFzCithM3JlZQorYXIzZW4xdAorYTVyMmUyc3MKK2FyNGZpCithcjFmCithcjRmNGwyCithcjFpCithcjVpMmFsCithcjJpM2EKK2FyM2kyYTJuCithM3JpNWV0CithcjJpZTQKK2FyNGltCithcjVpbjJhdAorYXIyaTFuYQorYXIzaTFvCithcjJpegorYXIybWkKK2FyMW0KK2FyNW81ZAorYTVyb25pCithcm8ybgorYTNyb28yCithcjJwCithcjNxCithcnJlNAorYXIxcjQKK2FyNHNhMgorYTRyczIKK2FyMnMyaAorNGFzLgorYTJzNGFiCithc2EyCithczNhbjF0Cithc2EybgorYXNoaTQKK2FzMmgKK2E1c2lhLgorYXMyaTFhCithM3NpMWIKK2Ezc2ljCis1YTVzaTR0Cithc2szaQorYXNrMgorYXM0bDIKK2E0c29jCithMXNvCithczVwaAorYXM0czJoCithMnNzCithczN0ZW4KK2FzMXQ0cgorYXN1MXI1YQorYTFzdQorYXN1MnIKK2EydGEKK2F0M2FiMmwyCithMnRhYgorYXQ1YWMKK2F0M2FsbworYXRhMmwKK2F0NWFwCithdGU1YworYXQ1ZTJjaAorYXQzZTFnbworYXRlZzQKK2F0M2VuLgorYXQzZXIxYQorYXRlcjVuCithNXRlcjFuYQorYXQzZXN0CithdDVldgorNGF0aAorYXRoNWVtCithdGgyZQorYTV0aGUybgorYXQ0aG8KK2F0aDVvbQorNGF0aS4KK2E1dDJpMWEKK2EydDVpNWIKK2F0MWljCithdDNpZjIKK2F0aW9uNWEycgorYTF0MmlvCithdGlvMm4KK2F0aW8xbjFhCithdDNpMXR1CithNHRvZworYTF0bworYTJ0b20KK2F0NW9tMml6CithNHRvcAorYTR0b3MyCithMXRyCithdDVyb3AKK2F0NHNrMgorYTR0MXMyCithdDR0YWcKK2E0dDN0MgorYXQxdGEKK2F0NXRlCithdDR0aAorYTJ0dQorYXQ1dTFhCithNHQ1dWUKK2F0M3VsCithdDN1MXJhCithMnR5CithdTRiCithdWdoMworYXUzZ3UKK2F1NGwyCithdW41ZAorYXUzcgorYXU1c2kxYgorYTJ1cworYTR1dDVlbgorYXUxdGgKK2EydmEKK2F2M2FnNAorYTV2YTJuCithdjRlNG5vCithdjNlcjFhCithdjVlcm4KK2F2NWVyeQorYXYxaQorYXZpNGVyCithdjJpZTQKK2F2M2lnCithdjVvYworYTF2b3IKKzNhd2F5CithdzNpMgorYXc0bHkKK2F3czQKK2F4NGk1YworYXgzaQorYXg0aWQKK2F5NWFsCitheWU0CitheXM0Cithemk0ZXIKK2EyejFpCithejJpZTQKK2F6Mno1aQorYTR6MXoyCis1YmEuCitiYWQ1Z2VyCitiYTJkCitiYTRnZQorYmFsMWEKK2JhbjVkYWcKK2JhMm4KK2I0YW5kCitiYW4xZDJhCitiYW40ZQorYmFuM2kKK2JhcmJpNQorYjJhMnIKK2JhcjFiCitiYXIyaTRhCitiYXIxaQorYmFzNHNpCitiYTJzcworMWJhdAorYmE0egorMmIxYgorYjJiZQorYjNiZXIKK2JiaTRuYQorNGIxZAorNGJlLgorYmVhazQKK2JlYTJ0MworNGJlMmQKK2IyZTNkMmEKK2JlM2RlCitiNGUzZGkKK2JlM2dpCitiZTVndQorMWJlbAorYmUxbDJpCitiZTNsbworNGJlNW0KK2JlNW4yaWcKK2JlNW51Cis0YmVzNAorYmUzc3AKK2IyZTVzdDRyCiszYmV0CitiZTF0NWl6CitiZTV0cgorYmUzdHc0CitiZTN3CitiZTV5MW80CisyYmYKKzRiM2gKK2JpMmIKK2IyaTRkCiszYjJpZTQKK2JpNWVuCitiaTRlcgorMmIzaWYKKzFiaWwKK2JpM2wyaXoKK2JpbDFpCitiaW4yYTVyNAorYmkxbmEKK2I0aW40ZAorYmk1bmV0CitiMmluZQorYmkzbzJncgorYjJpbworYmk1b3UyCitiaTJ0CiszYjJpM3QyaW8KK2JpMXRpCitiaTN0cgorM2JpdDV1MWEKK2JpMXR1CitiNWk0dHoKK2IxagorYms0CitiMmwyCitibDRhdGg1CitiNGxlLgorYmxlbjQKKzVibGUxc3AKK2JsZXMyCitiM2xpcworYjRsbworYmx1bjR0Cis0YjFtCis0YjNuCitibmU1ZworM2JvZAorYm9kM2kKK2JvNGUKK2JvbDNpYworYm9sMmkKK2JvbTRiaQorYm80bTFiCitibzFuNGEKK2JvMm4KK2JvbjVhdAorM2JvbzIKKzVib3IuCis0YjFvMXJhCitib3I1ZAorNWJvcmUKKzVib3JpCis1Ym9zNAorYjVvMXRhCitiNG90aDUKK2JvNHRvCitib3VuMmQzCitib3UyCis0YnAKKzRicml0CiticjRvdGgzCisyYjVzMgorYnNvcjQKK2Ixc28KKzJidAorYjJ0NGwKK2I0dG8KK2IzdHIKK2J1ZjRmZXIxCitidTRmMWYKK2J1NGdhCitidTNsMmkKK2J1MW1pNAorYnU0bgorYnVudDRpCitidW4xdAorYnUzcmUKK2J1czVpZTQKK2IydXMKK2J1c3M0ZQorYnUyc3MKKzVidXN0Cis0YnUxdGEKKzNidTF0MmlvCitiNHUxdDJpCitiNXUxdG8KK2IxdgorNGI1dworNWJ5LgorYnlzNAorMWNhCitjYWIzaW4KK2NhMWIybDIKK2NhMmNoNAorY2E1ZGVuCitjYTJkCis0Y2FnNAorMmM1YWgKK2NhM2xhdAorY2FsNGxhCitjYWwxbAorY2FsMmw1aW40CitjYWxsMmkKKzRjYWxvCitjNGFuNWQKK2NhMm4KK2NhbjRlCitjYTRuNGljCitjYW41aXMKK2NhbjNpegorY2FuNHR5CitjYW4xdAorY2FueTQKK2NhNXBlcgorY2FyNW9tCitjMmEycgorY2FzdDVlcgorY2FzNXQyaWcKK2Nhc3QyaQorNGNhczR5CitjNGE0dGgKKzRjYTF0Mml2CitjYXY1YWwKK2NhMnZhCitjM2MKK2NjaGE1CitjMmNoCitjM2MyaTRhCitjMWNpCitjY29tMXBhNQorYzFjbworY2NvNG0xcAorY2NvMm40CitjY291M3QKK2Njb3UyCisyY2UuCis0Y2VkLgorNGNlMWRlbgorM2NlaTIKKzVjZWwuCiszY2VsMWwKKzFjZW4KKzNjZW5jCisyY2VuNGUKKzRjZW5pCiszY2VuMXQKKzNjZXAKK2NlNXJhbQorY2VyMWEKKzRjZTFzNGEyCiszY2VzMXNpCitjMmUyc3MKK2NlczVzaTViCitjZXM1dAorY2V0NAorYzVlNHRhCitjZXc0CisyY2gKKzRjaC4KKzRjaDNhYgorNWNoYTRuMWljCitjaGEybgorY2g1YTVuaXMKK2NoZTIKK2NoZWFwMworNGNoNGVkCitjaDVlNWxvCiszY2hlbWkKK2NoNWVuZQorY2hlMm4KK2NoM2VyLgorY2gzZTRyMXMyCis0Y2gxaW4KKzVjaGkybmUuCitjaDJpbmUKK2NoNWk1bjJlMnNzCitjaGkxbmVzCis1Y2gyaW5pCis1Y2gyaW8KKzNjaGl0CitjaGkyegorM2NobzIKK2NoNHRpCisxY2kKKzNjMmkxYQorY2kyYTViCitjaTJhNXIKK2NpNWMKKzRjaWVyCitjMmllNAorNWM0aTJmM2ljLgorY2kxZmkKKzRjNGk1aTQKK2NpNGxhCiszY2lsMWkKKzJjaW0KKzJjaW4KK2M0aTFuYQorM2NpbjJhdAorY2luM2VtCitjMmluZQorYzFpbmcKK2M1aW5nLgorNWMyaTFubworY2lvMm40CitjMmlvCis0Y2lwZTQKK2MyaXAKK2NpM3BoCis0Y2lwNGljCitjaXAzaQorNGNpczF0YQorNGNpczF0MmkKKzJjMWl0CitjaTF0M2l6CitjaTF0aQorNWNpegorY2sxCitjazNpCisxYzRsNAorNGNsMmEycgorYzVsYTVyYTF0MmlvCitjbGFyNGF0Cis1Y2xhcmUKK2NsZTRtCis0Y2xpYworY2xpbTQKK2MxbHk0CitjNW4KKzFjbworY281YWcKK2M0b2EKK2NvZTIKKzJjb2cKK2NvNGdyCitjb2k0CitjbzNpbmMKK2NvbDVpCis1Y29sbworY29sM280cgorY29tNWVyCitjbzJtZQorY28xbjRhCitjbzJuCitjNG9uZQorY29uM2cKK2NvbjV0CitjbzNwYQorY29wM2ljCitjbzRwMmwyCis0Y29yMWIKK2Nvcm8zbgorY29zNGUKK2NvdjEKK2NvdmU0Citjb3c1YQorY28yejVlCitjbzV6MWkKK2MxcQorY3JhczV0CitjcjJhcworNWNyYXQuCis1Y3JhdDFpYworY3JlM2EydAorNWMycjJlZAorNGMzcmUxdGEKK2NyZTR2MgorY3JpMgorY3JpNWYKK2M0cmluCitjcjJpczQKKzVjcmkxdGkKK2NybzRwMmwyCitjcm9wNW8KK2Nyb3M0ZQorY3J1NGQKKzRjM3MyCisyYzF0CitjMnRhNGIKK2MxdGEKK2N0NWFuZworY3RhMm4KK2M1dGFuMXQKK2MydGUKK2MzdGVyCitjNHQ0aWMxdQorY3RpbTNpCitjMXRpbQorY3R1NHIKK2MxdHUKK2M0dHc0CitjdWQ1CitjNHVmCitjNHVpMgorY3U1aTF0eQorNWN1bDJpCitjdWw0dGlzNAorY3VsMXRpCitjdTRsdAorM2M0dWwxdHUyCitjdTJtYQorYzN1bWUKK2N1NG1pCiszY3VuCitjdTNwaQorY3U1cHkKK2N1MnI1YTRiCitjdTFyYQorY3U1cjJpM2EKKzFjMnVzCitjdXMxczRpCitjdTJzcworM2M0dXQKK2N1NHQyaWU0CitjNHUxdDJpCis0YzV1MXQyaXYKKzRjdXRyCisxY3kKK2MyemU0CisxZDJhCis1ZGEuCisyZDNhNGIKK2RhMmNoNAorNGRhMmYKKzJkYWcKK2RhMm0yCitkMmFuM2cKK2RhMm4KK2RhcmQ1CitkMmEycgorZGFyazUKKzRkYXJ5CiszZGF0Cis0ZGExdDJpdgorNGRhMXRvCis1ZGF2NAorZGF2NWUKKzVkYXkKK2QxYgorZDVjCitkMWQ0CisyZGUuCitkZWEyZjUKK2RlNGI1aTJ0CitkMmUxYgorZGU0Ym8ybgorZGVjYTJuNAorZGUxY2EKK2RlNGNpbAorZGUxYzJpCitkZTVjb20KK2RlMWNvCisyZDFlZAorNGRlZS4KK2RlNWlmCitkZWkyCitkZWwyaTRlNAorZGVsMmkKK2RlNGw1aTVxCitkZTVsbworZDRlbQorNWRlbS4KKzNkZW1pYworZGVtNWljLgorZGU1bWlsCitkZTRtbzJuM3MyCitkZTFtbworZGVtbzJuCitkZW1vMnI1CisxZGVuCitkZTRuMmEycgorZGUxbmEKK2Q0ZTNubworZGVudGk1ZjIKK2RlbjF0CitkZW50MmkKK2RlM251CitkZTFwCitkZTNwYQorZGVwaTQKK2RlMnB1CitkM2UxcQorZDRlcjFoNAorNWRlcjNtNAorZDVlcm41aXoKK2RlNHI1czIKK2RlczIKK2QyZXMuCitkZTFzMmMKK2RlMnM1bworZGVzM3QyaQorZDJlM3N0NHIKK2RlNHN1CitkZTF0CitkZTJ0bworZGUxdgorZGUydjNpNGwKK2RlMXZpCis0ZGV5Cis0ZDFmCitkNGdhCitkM2dlNHQKK2RnMWkKK2QyZ3kKK2QxaDIKKzVkaS4KKzFkNGkzYQorZGlhNWIKK2Q0aTRjYW0KK2RpMWNhCitkNGljZQorM2RpMmMxdAorM2QyaWQKKzVkaTNlbgorZDJpZTQKK2QxaWYKK2RpM2dlCitkMmlnCitkaTRsYTF0bworZGkxbGEKK2QxaW4KKzFkaTFuYQorM2RpMm5lLgorZDJpbmUKKzVkMmluaQorZGk1bml6CisxZDJpbworZGlvNWcKK2RpNHAybDIKK2QyaXAKK2Q0aXIyCitkaTFyZQorZGlyMXQ1aQorZGlzMQorNWRpc2kKK2Q0aXMzdAorZDJpMXRpCisxZDJpMXYKK2QxagorZDVrMgorNGQ1bGEKKzNkbGUuCiszZGxlZAorM2RsZXMuCitkbGVzMgorNGQzbDJlMnNzCisyZDNsbworNGQ1bHUKKzJkMWx5CitkMW0KKzRkMW40CisxZG8KKzNkby4KK2RvNWRlCis1ZG9lCisyZDVvZgorZDRvZworZG80bGEKK2RvbDJpNAorZG81bG80cgorZG9tNWl6CitkbzNuMmF0CitkbzJuCitkbzFuMWEKK2Rvbmk0Citkb28zZAorZG9vMgorZG80cDRwCitkNG9yCiszZG9zCis0ZDVvdXQKK2RvdTIKK2RvNHYKKzNkb3gKK2QxcAorMWRyCitkcmFnNW8ybjIKK2RyYTJnbworNGRyMmFpMgorZHJlNAorZHJlMmE1cgorNWRyZW4KK2RyNGk0YgorZHJpbDQKK2RybzRwCis0ZHJvdworNWRydXBsaQorZHJ1M3AybDIKKzRkcnkKKzJkMXMyCitkczRwCitkNHN3MgorZDRzNHkKK2QydGgKKzFkdQorZDF1MWEKK2R1MmMKK2QxdTNjYQorZHVjNWVyCis0ZHVjdC4KK2R1MmMxdAorNGR1YzR0MXMyCitkdTVlbAorZHU0ZworZDN1bDRlCitkdW00YmUKK2R1NG0xYgorZHU0bgorNGR1cAorZHU0cGUKK2QxdgorZDF3CitkMnkKKzVkeW4KK2R5NHMyZQorZHlzNXAKK2UxYTRiCitlM2EyYzF0CitlYTJkMQorZWFkNWllNAorZTJhZGkKK2VhNGdlCitlYTVnZXIKK2VhNGwKK2VhbDVlcgorZTJhbGUKK2VhbDNvdTIKK2VhbTNlcgorZTVhbmQKK2VhMm4KK2VhcjNhCitlMmEycgorZWFyNGMKK2VhcjVlcworZWFyNGljCitlYXIxaQorZWFyNGlsCitlYXI1aworZWFyMnQKK2VhcnQzZQorZWE1c3AKK2UzYTJzcworZWFzdDMKK2VhMnQKK2VhdDVlbgorZWF0aDNpCitlNGF0aAorZTVhdDNpZjIKK2U0YTN0dQorZWEydgorZWF2M2VuCitlYXY1aQorZWF2NW8KKzJlMWIKK2U0YmVsLgorZTFiZWwKK2U0YmUybDFzMgorZTRiZW4KK2U0YmkydAorZTNicgorZTRjYTJkCitlMWNhCitlY2FuNWMKK2VjYTJuCitlYzFjYTUKK2VjM2MKK2UxY2UKK2VjNWVzMXNhMgorZWMyZTJzcworZTFjMmkKK2U0Y2liCitlYzVpZmljYXQKK2VjaTFmaQorZWNpZmkxY2EKK2VjNWkzZjJpZTQKK2VjNWkxZnkKK2UyYzNpbQorZTJjMWk0dAorZTVjMml0ZQorZTRjbGFtCitlMWM0bDQKK2U0Y2wydXMKK2UyY29sCitlMWNvCitlNGNvbTFtCitlNGNvbXBlCitlY280bTFwCitlNGNvbjFjCitlY28ybgorZTJjb3IKK2VjM28xcmEKK2VjbzVybworZTFjcgorZTRjcmVtCitlYzR0YTJuCitlMmMxdAorZWMxdGEKK2VjNHRlCitlMWN1CitlNGN1bAorZWMzdTFsYQorMmUyZDJhCis0ZWQzZDQKK2U0ZDFlcgorZWRlNHMyCis0ZWRpCitlM2Q0aTNhCitlZDNpYgorZWQzaTFjYQorZWQzaW0KK2VkMWl0CitlZGk1egorNGUxZG8KK2U0ZG9sCitlZG8ybjIKK2U0ZHJpCitlMWRyCitlNGR1bAorZTFkdQorZWQ1dTFsNG8KK2VlMmMKK2U0ZWQzaQorZWUyZgorZWVsM2kKK2VlNGx5CitlZTJtCitlZTRuYQorZWU0cDEKK2VlMnM0CitlZXN0NAorZWU0dHkKK2U1ZXgKK2UxZgorZTRmM2VyZQorZWZlcjEKKzFlNGYxZgorZTRmaWMKK2UxZmkKKzVlZjJpMWM0aQorZWZpbDQKK2UzZjJpMm5lCitlMmZpbgorZWY1aTVuMml0ZQorZWYyaW5pCitlZmluMml0CiszZWZpdAorZWZvcjVlcworZTFmbworZWZvMnIKK2U0ZnU0c2UuCitlM2Z1CitlZjJ1cworNGVnYWwKK2UxZ2EKK2VnZXI0CitlZzVpYgorZWc0aWMKK2VnNWluZworZTVnaXQ1CitlZzVuCitlNGdvLgorZTFnbworZTRnb3MKK2VnMXVsCitlNWd1cgorNWUxZ3kKK2UxaDQKK2VoZXI0CitlaTIKK2U1aWMKK2UyaTVkCitlMmlnMgorZWk1ZzRsMgorZTNpNG0xYgorZTNpbjNmCitlMWluZworZTVpbnN0CitlMmkybjFzMgorZWlyNGQKK2U0aXIKK2UyaXQzZQorZTJpM3RoCitlNWkxdHkKK2UxagorZTRqdWQKK2VqNXVkaQorZWtpNG4KK2VrMWkKK2VrNGxhCitlazFsCitlMWxhCitlNGxhLgorZTRsYWMKK2UzbDRhbjRkCitlbGEybgorZTRsNWExdDJpdgorZTRsYXcKK2VsYXgxYTQKK2UzbGUyYQorZWw1ZWJyYQorZWwyZTFiCitlbGUzYnIKKzVlbGVjCitlNGxlZAorZWwzZTFnYQorZTVsZW4KK2U0bDFlcgorZTFsZXMyCitlMmwyZgorZWwyaQorZTNsaWJlNAorZTRsNWljLgorZWwzaTFjYQorZTNsaWVyCitlbDJpZTQKK2VsNWkzZ2liCitlbDJpZworZWw0aWdpCitlNWxpbQorZTRsM2luZworZTNsMmlvCitlMmxpcworZWw1aXMyaAorZTNsMml2MworNGVsbGEKK2VsMWwKK2VsNGxhYgorZWxsNG80CitlNWxvYworZWw1b2cKK2VsM29wLgorZWwyczJoCitlMmwxczIKK2VsNHRhCitlNGx0CitlNWx1ZAorZWw1dWcKK2U0bWFjCitlMW1hCitlNG1hZworZTVtYTJuCitlbTVhMW5hCitlNG01YgorZTFtZQorZTJtZWwKK2U0bWV0CitlbTNpMWNhCitlbTJpNGU0CitlbTVpZ3JhCitlbTJpZzQKK2VtaTFncgorZW0xaW4yCitlbTVpbmUKK2VtM2kzbmkKK2U0bTJpcworZW01aXMyaAorZTVtNGkyczFzCitlbTNpegorNWVtbml6CitlNG0xbgorZW1vNGcKK2UxbW8KK2VtbzNuMmk1bworZW1vMm4KK2VtM3BpCitlNG0xcAorZTRtdWwKK2UxbXUKK2VtNXUxbGEKK2VtdTNuMgorZTNteQorZW41YTJtbworZTFuYQorZTRuYW4xdAorZW4yYTJuCitlbmNoNGVyCitlbjJjaAorZW5jaGUyCitlbjNkaWMKK2U1bmVhCitlNW5lZQorZW4zZW0KK2VuNWVybworZW4xZXIKK2VuNWUxc2kKK2UxbmVzCitlMm41ZXN0CitlbjNldHIKK2UzbmU0dworZW41aTRjM3MyCitlNW4yaWU0CitlNW5pbAorZTNuMmk0bworZW4zaXMyaAorZW4zaXQKK2U1bmkxdQorNWVuaXoKKzRlNG4xbjIKKzRlbm8KK2U0bm80ZworZTRub3MKK2VuM292CitlbjRzdzIKK2UybjFzMgorZW50NWFnZQorZW4xdAorZW4xdGEKKzRlbnRoMWVzCitlbnRoMmUKK2VuM3UxYQorZW41dWYKK2UzbnkuCis0ZTRuM3oKK2U1b2YKK2VvMmcKK2U0b2k0CitlM29sCitlb3AzYTJyCitlbzJwYQorZTFvcgorZW8zcmUKK2VvNXJvbAorZW9zNAorZTRvdAorZW80dG8KK2U1b3V0Citlb3UyCitlNW93CitlMnBhCitlM3A0YWkyCitlcDVhbmMKK2VwYTJuCitlNXBlbAorZTNwZW4xdAorZXA1ZTV0MmkxdDJpbworZXBlMnQKK2VwZXRpMXRpCitlcGhlNAorZTRwbGkKK2UxcDJsMgorZTFwbworZTRwcmVjCitlcHIyCitlcDVyZTFjYQorZTRwMnIyZWQKK2VwM3JlMWg0CitlM3BybworZTRwcm9iCitlcDRzNGgKK2UycDFzMgorZXA1dGk1YgorZTJwMXQKK2U0cHUydAorZXA1dTF0YQorZTFxCitlcXVpM2wKK2VxdTIKK2VxMnVpMgorZTRxM3VpM3MKK2VyMWEKK2UycmE0YgorNGVyNGFuZAorZXJhMm4KK2VyM2EycgorNGVyNGF0aS4KKzJlcjFiCitlcjRiMmwyCitlcjNjaAorZXIxYworZXI0Y2hlMgorMmUycmUuCitlM3JlMWE0bAorZXJlNWNvCitlcmUzaW4KK2VyZWkyCitlcjVlbC4KK2VyM2UxbW8KK2VyNWUxbmEKK2VyNWVuY2UKKzRlcmVuZQorZXIzZW4xdAorZXJlNHEKK2VyNWUyc3MKK2VyM2VzMnQKK2VyZXQ0CitlcjFoNAorZXIxaQorZTFyMmkzYTQKKzVlcmljazEKK2UzcmllbgorZXIyaWU0Citlcmk0ZXIKK2VyM2luNGUKK2UxcjJpMW8KKzRlcml0CitlcjRpMXUKK2VyMmk0dgorZTRyaTF2YQorZXIzbTQKK2VyNG5pczQKKzRlcjNuMml0Cis1ZXJuaXoKK2VyM25vNAorMmVybworZXI1b2IKK2U1cjJvYworZXJvNHIKK2VyMW91MgorZTRyMXMyCitlcjNzZXQKK2VyMnNlCitlcnQzZXIKKzRlcjJ0bAorZXIzdHc0Cis0ZXJ1CitlcnU0dAorNWVyd2F1CitlcjF3CitlMXM0YTIKK2U0c2EyZ2UuCitlNHNhZ2VzCitlczJjCitlMnMxY2EKK2VzNWNhMm4KK2Uzc2NyCitlczVjdQorZTFzMmUKK2Uyc2VjCitlczVlMWNyCitlNHM1ZW5jCitlNHNlcnQuCitlNHNlcjR0MXMyCitlNHNlcjF2YQorNGVzMmgKK2Uzc2hhCitlc2g1ZTJuCitlMXNpCitlMnNpYworZTJzMmlkCitlczVpMWRlbgorZTRzNWlnMW40YQorZXMyaWcKK2UyczVpbQorZTJzNGk0bgorZXNpczR0ZQorZTFzaXMKK2U1c2k0dQorZTVza2luCitlc2syCitlc2sxaQorZXM0bWkKK2UyczFtCitlMnNvbAorZTFzbworZXMzb2x1CitlMnNvMm4KK2VzNW8xbjFhNAorZTFzcAorZTJzM3BlcgorZXM1cGkxcmEKK2VzcDRpcgorZXM0cHJlCitlc3ByMgorMmUyc3MKK2VzNHNpNGIKK2VzMXNpCitlc3RhMm40CitlczF0YQorZXMzdDJpZworZXN0MmkKK2VzNXRpbQorNGVzMnRvCitlM3N0bzJuCisyZXN0NHIKK2U1c3RybworZXN0cnVjNQorZTJzdTJyCitlMXN1CitlczV1cjFyNAorZXM0dzIKK2UydGE0YgorZTF0YQorZTN0ZW40ZAorZTN0ZW8KK2V0aG9kMworZXQxaWMKK2U1dGlkZQorZXQyaWQKK2UydDFpbjQKK2V0Mmk0bm8KK2U1dDRpcgorZTV0MmkxdDJpbworZXRpMXRpCitldDVpMXQyaXYKKzRlMnQxbjIKK2V0NW8xbjFhCitlMXRvCitldG8ybgorZTN0cmEKK2UzdHJlCitldDNyaWMKK2V0NXJpZgorZXQzcm9nCitldDVyb3MKK2V0M3UxYQorZTF0dQorZXQ1eW0KK2UxdHkKK2U0dDV6Cis0ZXUKK2U1dW4KK2UzdXAKK2V1M3JvCitlMnVzNAorZXV0ZTQKK2V1dGk1bAorZTR1MXQyaQorZXU1dHIKK2V2YTJwNQorZTF2YQorZTJ2YXMKK2V2NWFzdAorZTV2ZWEKK2V2M2VsMWwKK2V2ZTRsM28KK2U1dmVuZworZXZlbjRpCitldjFlcgorZTV2MmVyMWIKK2UxdmkKK2V2M2lkCitlMnZpNGwKK2U0djFpbgorZTN2Mmk0dgorZTV2b2MKK2U1dnUKK2Uxd2EKK2U0d2FnCitlNXdlZQorZTN3aAorZXdpbDUKK2V3aTIKK2V3M2luNGcKK2Uzd2l0CisxZXgzcAorNWV5MWMKKzVleWUuCitleXM0CisxZmEKK2ZhM2IybDIKK2Y0YWIzcgorZmE0Y2UKKzRmYWcKK2ZhNGk0bjQKK2ZhaTIKK2ZhbDJsNWUKK2ZhbDFsCis0ZjRhNG1hCitmYW01aXMKKzVmMmEycgorZmFyNXRoCitmYTN0YQorZmEzdGgyZQorZjRhdGgKKzRmYTF0bworZmF1NGx0NQorZmF1NGwyCis0ZjViCis0ZmQKKzRmZS4KK2ZlYXM0CitmZTRhdGgzCitmZWEydAorZjJlNGIKKzRmZTFjYQorNWZlMmMxdAorMmZlZAorZmUzbDJpCitmZTRtbworZmVuMmQKK2ZlbjFkNWUKK2ZlcjEKKzVmZXIxcjQKK2ZldjQKKzRmMWYKK2Y0ZmVzCitmNGYyaWU0CitmMWZpCitmNWYyaW4uCitmMmZpbgorZjJmNWlzCitmNGYybHk1CitmZjRsMgorZjJmeQorNGZoCisxZmkKK2YyaTNhCisyZjNpYy4KKzRmM2ljYWwKK2ZpMWNhCitmM2ljYTJuCis0ZmljYXRlCitmM2kxY2VuCitmaTNjZXIKK2YyaTFjNGkKKzVmaTNjMmkxYQorNWZpYzJpZTQKKzRmaTRjM3MyCitmaTNjdQorZmk1ZGVsCitmMmlkCitmaWdodDUKK2YyaWcKK2ZpbDVpCitmaWwybDVpbjQKK2ZpbDFsCitmaWxsMmkKKzRmaTFseQorMmZpbgorNWZpMW5hCitmNGluMmQ1CitmMmkybmUKK2YxaW4zZworZjJpNG40bjIKK2ZpczR0MmkKK2Y0bDIKK2Y1bDJlMnNzCitmbGVzMgorZmxpbjQKK2ZsbzNyZQorZjJseTUKKzRmbQorNGZuCisxZm8KKzVmbzJuCitmb240ZGUKK2Yyb25kCitmb240dAorZm8ycgorZm81cmF0CitmbzFyYQorZm9yNWF5Citmb3JlNXQKK2ZvcjRpCitmb3IxdDVhCitmb3M1Cis0ZjVwCitmcmE0dAorZjVyZWEKK2ZyZXM1YworZnJpMgorZnJpbDQKK2Zyb2w1CisyZjNzCisyZnQKK2Y0dG8KK2YydHkKKzNmdQorZnU1ZWwKKzRmdWcKK2Z1NG1pbgorZnUxbWkKK2Z1NW5lCitmdTNyaQorZnVzaTQKK2YydXMKK2Z1MnM0cworNGZ1MXRhCisxZnkKKzFnYQorZ2EyZjQKKzVnYWwuCiszZ2FsMWkKK2dhM2xvCisyZ2FtCitnYTVtZXQKK2c1YTJtbworZ2FuNWlzCitnYTJuCitnYTNuaXoKK2dhbmk1emExCis0Z2FubzQKK2dhcjVuNAorZzJhMnIKK2dhMnNzNAorZzRhdGgzCis0Z2ExdDJpdgorNGdhegorZzNiCitnZDQKKzJnZS4KKzJnZWQKK2dlZXo0CitnZWw0aW4KK2dlbDJpCitnZTVsaXMKK2dlNWwxaXoKKzRnZTFseQorMWdlbgorZ2U0bjJhdAorZ2UxbmEKK2c1ZTVuaXoKKzRnNGVubworNGdlbnkKKzFnZW8KK2dlM29tCitnNGVyeQorNWdlMXNpCitnZXRoNQorNGdlMXRvCitnZTR0eQorZ2U0dgorNGcxZzIKK2cyZ2UKK2czZ2VyCitnZ2x1NQorZ2dsMgorZzFnbzQKK2doM2luCitnaDVvdXQKK2dob3UyCitnaDR0bworNWdpLgorMWcyaTRhCitnaTJhNXIKK2cxaWMKKzVnaTNjMmkxYQorZzJpMWNpCitnNGkxY28KK2dpZW41CitnMmllNAorNWdpZXMuCitnaWw0CitnM2kxbWVuCiszZzRpbi4KK2c0aW41Z2UKKzVnNGkybjFzMgorNWcyaW8KKzNnNGlyCitnaXI0bAorZzNpczFsMgorZ2k0dQorNWcyaXYKKzNnaXoKK2dsMgorZ2xhNAorZ2wyYWQ1aQorZ2xhMmQKKzVnbGFzCisxZ2xlCitnbGk0YgorZzNsMmlnCiszZ2xvCitnbG8zcgorZzFtCitnNG15CitnMW40YQorZzRuYS4KK2duZTR0NHQyCitnMW5pCitnMm4xaW4KK2c0bjJpNG8KK2cxbm8KK2c0bm80bgorMWdvCiszZ28uCitnb2I1Cis1Z29lCiszZzRvNGcKK2dvM2lzCitnb2kyCitnbzJuMgorNGczbzNuMWEKK2dvbjVkbzUKK2cyb25kCitnbzNuaQorNWdvbzIKK2dvNXJpegorZ29yNW91MgorNWdvcy4KK2dvdjEKK2czcAorMWdyCis0Z3JhMWQyYQorZ3JhMmQKK2c0cjJhaTIKK2dyYTJuMgorNWdyYTRwaC4KK2c1cmEzcGg0ZXIKKzVncmFwaDFpYworZ3I0YXBoaQorNGczcmExcGh5Cis0Z3JheQorZ3JlNG4KKzRncmVzcy4KK2dyMmUyc3MKKzRncml0CitnNHJvCitncnVmNAorZ3MyCitnNXN0ZQorZ3RoMworZ3U0YQorM2d1YXIyZAorZ3UyYTJyCisyZ3VlCis1Z3VpNXQKK2cydWkyCiszZ3VuCiszZzJ1cworNGd1NHQKK2czdworMWd5CisyZzV5M24KK2d5NXJhCitoM2FiNGwyCitoYTJjaDQKK2hhZTRtCitoYWU0dAoraDVhZ3UKK2hhM2xhCitoYWxhM20KK2hhNG0KK2hhbjRjaQoraGEybgoraGFuNGN5Cis1aGFuZC4KK2g0YW5kCitoMmFuNGcKK2hhbmc1ZXIKK2hhbjFnNW8KK2g1YTVuaXoKK2hhNG40azIKK2hhbjR0ZQoraGFuMXQKK2hhMnAzbDIKK2hhMnA1dAoraGEzcmEybgoraDJhMnIKK2hhNXIyYXMKK2hhcjJkCitoYXJkM2UKK2hhcjRsZTQKK2hhcjFsCitoYXJwNWVuCitoYXIycAoraGFyNXRlcgoraGEyczVzCitoYXVuNAorNWhhegoraGF6M2ExCitoMWIKKzFoZWEyZDEKKzNoZTJhMnIKK2hlNGNhMm4KK2hlMWNhCitoNWVjYXQKK2g0ZWQKK2g0ZTVkbzUKK2hlM2w0aQoraGVsNGxpcworaGVsMWwKK2hlbGwyaQoraGVsNGx5CitoNWVsbworaGU0bTRwCitoZTJuCitoZTFuYTQKK2hlbjVhdAoraGUxbzVyCitoZXA1CitoNGVyMWEKK2hlcmEzcAoraGVyNGJhCitoMmVyMWIKK2hlcmU1YQoraDNlcm4KK2g1ZXIxb3UyCitoMmVybworaDNlcnkKK2gxZXMKK2hlMnM1cAoraGU0dAoraGUydDRlZAoraDRldTQKK2gxZgoraDFoCitoaTVhMm4KK2gyaTFhCitoaTRjbworaGlnaDUKK2gyaWcKK2g0aWwyCitoaW1lcjQKK2g0aTFuYQoraGlvbjRlCitoMmlvCitoaW8ybgoraDJpNHAKK2hpcjRsCitoNGlyCitoaTNybworaGlyNHAKK2hpcjRyNAoraGlzM2VsCitoNGlzZQoraDRpMnM0cworaGl0aDVlcgoraDJpdGgKK2hpdGgyZQoraDJpMnYKKzRoaworNGgxbDQKK2hsYTJuNAoraDJsbworaGxvM3JpCis0aDFtCitobWV0NAorMmgxbgoraDVvZGl6CitoNW8yZDFzMgoraG80ZworaG8xZ2U0Citob2w1YTJyCitobzFsYQorM2hvbDRlCitobzRtYQoraG8ybWUzCitobzFuNGEKK2hvMm4KK2hvNW55CiszaG9vZAoraG9vMgoraG9vMm40Citob3I1YXQKK2hvMXJhCitobzVyMmlzCitob3J0M2UKK2hvNXJ1Citob3M0ZQoraG81c2VuCitob3MxcAorMWhvMnVzCitob3UyCitob3VzZTMKK2hvdjVlbAorNGg1cAorNGhyNAoraHJlZTUKK2hybzVuaXoKK2hybzJuCitocm8zcG8KKzRoMXMyCitoNHMyaAoraDR0MmEycgoraDF0YQoraHQxZW4KK2h0NWVzCitoNHR5CitodTRnCitodTRtaW4KK2h1MW1pCitodW41a2UKK2h1NG5rMgoraHVuNHQKK2h1czN0NAoraDJ1cworaHU0dAoraDF3CitoNHdhcjR0CitodzJhMnIKK2h5M3BlCitoeTNwaAoraHkycworMmkxYQoraTJhbAoraWFtNAoraWFtNWUxdGUKK2kyYTJuCis0aWFuYworaWFuM2kKKzRpYW40dAoraWE1cGUKK2lhMnNzNAoraTRhMXQyaXYKK2lhNHRyaWMKK2lhMXRyCitpNGEydHUKK2liZTQKK2liM2VyMWEKK2liNWVydAoraWI1aTFhCitpYjNpbgoraWI1aXQuCitpYmkydAoraWI1aXRlCitpMWIybDIKK2liM2xpCitpNWJvCitpMWJyCitpMmI1cmkKK2k1YnU0bgorNGljYW0KK2kxY2EKKzVpY2FwCis0aWMyYTJyCitpNGNhci4KK2k0Y2FyYQoraWNhczUKK2k0Y2F5CitpY2N1NAoraWMzYworNGljZW8KKzRpMmNoCisyaTFjaQoraTVjMmlkCitpYzVpMW5hCitpMmNpbgoraTJjMmlwCitpYzNpMXBhCitpNGMxbHk0CitpMWM0bDQKK2kyYzVvYworaTFjbworNGkxY3IKKzVpY3JhCitpNGNyeQoraWM0dGUKK2kyYzF0CitpYzF0dTIKK2ljNHQzdTFhCitpYzN1MWxhCitpYzR1bQoraWM1dW8KK2kzY3VyCisyaWQKK2k0ZGFpMgoraTFkMmEKK2lkNWFuYworaWRhMm4KK2lkNWQ0CitpZGUzYTRsCitpZGU0czIKK2kyZGkKK2lkNWkyYTJuCitpMWQ0aTNhCitpZGk0YTJyCitpNWQyaWU0CitpMWQzaW8KK2lkaTVvdTIKK2lkMWl0CitpZDVpMXUKK2kzZGxlCitpNGRvbQoraTFkbworaWQzb3cKK2k0ZHIKK2kyZHUKK2lkNXVvCisyaWU0CitpZWQ0ZQorNWllNWdhCitpZTJsZDMKK2llMW41YTQKK2llbjRlCitpNWU0bjFuMgoraTNlbnQyaQoraWVuMXQKK2kxZXIuCitpM2VzMmMKK2kxZXN0CitpM2V0Cis0aWYuCitpZjVlcm8KK2lmZXIxCitpZmY1ZW4KK2k0ZjFmCitpZjRmcgorNGkyZjNpYy4KK2kxZmkKK2kzZjJpZTQKK2kzZjRsMgorNGkyZnQKKzJpZworaWdhNWIKK2kxZ2EKK2lnM2VyMWEKK2lnaHQzaQorNGlnaQoraTNnaWIKK2lnM2lsNAoraWczaW4KK2lnM2l0CitpNGc0bDIKK2kyZ28KK2lnM29yCitpZzVvdAoraTVncmUKK2kxZ3IKK2lnMnU1aTIKK2lnMXVyCitpM2gKKzRpNWk0CitpM2oKKzRpaworaTFsYQoraWwzYTRiCitpNGw0YWRlCitpbGEyZAoraTJsNWFtCitpbGE1cmEKK2lsMmEycgoraTNsZWcKK2lsMWVyCitpbGV2NAoraTJsNWYKK2lsMWkKK2lsM2kxYQoraWwyaWIKK2lsM2lvCitpbDRpc3QKKzJpbDFpdAoraWwyaXoKK2lsbDVhYgoraWwxbAorNGkybDFuMgoraWwzbzFxCitpbDR0eQoraTRsdAoraWw1dXIKK2lsM3YKK2k0bWFnCitpMW1hCitpbTNhZ2UKK2ltYTVyeQoraW0yYTJyCitpbWVudDJhNXIKK2kxbWVuCitpM21lbjF0CitpbWVuMXRhCis0aW1ldAoraW0xaQoraW01aTFkNGEKK2ltMmlkCitpbWk1bGUKK2k1bTJpbmkKKzRpbWl0CitpbTRuaQoraTRtMW4KK2kzbW8ybgoraTFtbworaTJtdQoraW0zdTFsYQorMmluLgoraTRuM2F1CitpMW5hCis0aW5hdgoraW5jZWw0CitpbjNjZXIKKzRpbmQKK2luNWRsaW5nCisyaW5lCitpM25lZQoraW40ZXI0YTJyCitpbjFlcgoraW5lcjFhCitpNW4yZTJzcworaTFuZXMKKzRpbjFnYQorNGluZ2UKK2luNWdlbgorNGluZ2kKK2luNWdsaW5nCitpbmdsMgorNGluMWdvCis0aW4xZ3UKKzJpbmkKK2k1bmkuCitpNG40aTFhCitpbjNpNG8KK2luMWlzCitpNW5pNHRlLgoraW4yaXQKK2luMml0ZQorNWkzbjJpMXQyaW8KK2luaTF0aQoraW4zaTF0eQorNGk0bmsyCis0aTRuMWwKKzJpNG4xbjIKKzJpMW5vCitpNG5vNGMKK2lubzRzCitpNG5vdAorMmkybjFzMgoraW4zc2UKK2luc3UxcjVhCitpbjFzdQoraW5zdTJyCisyaW50LgoraW4xdAorMmluNHRoCitpbjF1CitpNW4ydXMKKzRpbnkKKzJpbworNGlvLgoraW8xZ2U0CitpbzJncgoraTFvbAoraW80bQoraW9uM2F0CitpbzJuCitpbzFuMWEKK2lvbjRlcnkKK2lvbjFlcgoraW9uM2kKK2kybzVwaAoraW9yM2kKK2k0b3MKK2k0bzV0aAoraTVvdGkKK2lvNHRvCitpNG91cgoraW91MgorMmlwCitpcGU0CitpcGhyMmFzNAoraXA0aHI0CitpcDNpCitpcDRpYworaXA0cmU0CitpcHIyCitpcDN1bAoraTNxdWEKK2lxdTIKK2lxNXVlMWYKK2lxM3UyaWQKK2lxMnVpMgoraXEzdWkzdAorNGlyCitpMXJhCitpMnJhNGIKK2k0cmFjCitpcmQ1ZQoraXJlNGRlCitpMnIyZWQKK2k0cmUxZgoraTRyZWw0CitpNHJlcworaXI1Z2kKK2lyZzIKK2lyMWkKK2lyaTVkZQoraXIyaWQKK2lyNGlzCitpcmkzdHUKKzVpNXIyaXoKK2lyNG1pbgoraXIxbQoraXJvNGcKKzVpcm9uLgoraXJvMm4KK2lyNXVsCisyaXMuCitpczVhZworaXNhMgoraXMzYTJyCitpc2FzNQorMmlzMWMKK2lzM2NoMgorNGlzZQoraXMzZXIKKzNpNHMzZgoraXM1aGEybgoraXMyaAoraXMzaG8ybjMKK2lzaG80Citpc2g1b3AKK2lzM2kxYgoraXMyaTRkCitpNXNpcworaXM1aTF0Mml2Citpc2kxdGkKKzRpczRrMgoraXNsYTJuNAoraXMxbDIKKzRpczRtMXMyCitpMnMxbQoraTJzbworaXNvNW1lcgoraTNzb20KK2lzbzJtZQoraXMxcAoraXMycGkKK2lzNHB5Cis0aTJzMXMKK2lzNHNhbAoraXMxc2EyCitpc3NlbjQKK2lzNHMxZTRzCitpczR0YS4KK2lzMXRhCitpczF0ZQoraXMxdDJpCitpc3Q0bHkKK2lzMnRsCis0aXN0cmFsCitpc3Q0cgoraXMxdHJhCitpMnN1CitpczV1cworNGkzdGEuCitpMXRhCitpdGE0YmkKK2kydGFiCitpNHRhZworNGl0YTVtCitpM3RhMm4KK2kzdGF0CisyaXRlCitpdDNlcjFhCitpNXRlcjFpCitpdDRlcworMml0aAoraTF0aQorNGkxdDJpMWEKKzRpMnRpYworaXQzaTFjYQorNWk1dGljazEKK2kydDNpZworaXQ1aWwxbAoraTJ0aW0KKzJpMXQyaW8KKzRpdGlzCitpNHRpMnM0bQoraTJ0NW81bQoraTF0bworNGl0bzJuCitpNHRyYW0KK2kxdHJhCitpdDVyeQorNGk0dDN0MgoraXQzdTFhdAoraTF0dQoraXR1MWEKK2k1dHVkMgoraXQzdWwKKzRpdHouCitpNHR6CitpMXUKKzJpdgoraXYzZWwxbAoraXYzZW4uCitpNHYzZXIuCitpNHZlcnMuCitpdmU0cjFzMgoraXY1aWwuCitpMnZpbAoraXY1aW8KK2l2MWl0CitpNXZvcmUKK2l2M28zcm8KK2k0djNvdAorNGk1dworaXg0bworNGl5Cis0aXoyYTJyMgoraXphMQoraTJ6MWk0Cis1aXpvbjF0CitpMXpvCitpem8ybgorNWphCitqYWM0cQoramE0cAorMWplCitqZTRyNXMyCis0amVzNHQyaWU0CitqZXN0MmkKKzRqZXMydHkKK2pldzMKK2pvNHAKKzVqdWRnCisza2EuCitrM2FiCitrNWFnCitrYWlzNAora2FpMgora2FsNAorazFiCitrMmVkCisxa2VlCitrZTRnCitrZTVsMmkKK2szZW40ZAorazFlcgora2VzNAorazNlMnN0Lgora2U0dHkKK2szZgora2g0CitrMWkKKzVraS4KKzVrMmljCitrNGlsMWwKK2tpbG81CitrNGltCitrNGluLgora2luNGRlCitrNGluZAorazVpNW4yZTJzcworazJpbmUKK2tpMW5lcwora2luNGcKK2syaTRwCitraXM0CitrNWlzMmgKK2trNAorazFsCis0azNsZXkKKzRrMWx5CitrMW0KK2s1bmVzCisxazJubwora281cgora29zMmg0CitrM291Mgora3JvNW4KKzRrMXMyCitrNHNjCitrczRsMgorazRzNHkKK2s1dAorazF3CitsYWIzaWMKK2w0YWJvCitsNGEyY2k0CitsNGFkZQorbGEyZAorbGEzZDJ5CitsYWc0bgorbGEybTNvCiszbDRhbmQKK2xhMm4KK2xhbjRkbAorbGFuNWV0CitsYW40dGUKK2xhbjF0CitsYXI0ZzIKK2wyYTJyCitsYXIzaQorbGFzNGUKK2xhNXRhMm4KK2xhMnRhCis0bGF0ZWwyaTQKKzRsYTF0Mml2Cis0bGF2CitsYTR2NGEKKzJsMWIKK2xiaW40Cis0bDFjMgorbGNlNAorbDNjaQorMmxkCitsMmRlCitsZDRlcmUKK2xkNGVyMWkKK2xkaTQKK2xkNWlzMQorbDNkcgorbDRkcmkKK2xlMmEKK2xlNGJpCitsMmUxYgorbGUyZnQ1CitsZTFmCis1bGVnLgorNWxlNGcxZzIKK2xlNG1hdAorbGUxbWEKK2xlbTVhdDFpYworNGxlbi4KKzNsZW5jCis1bGUybmUuCisxbGVuMXQKK2xlM3BoCitsZTRwcjIKK2xlMnJhNWIKK2xlcjFhCitsZXI0ZQorM2xlcmcyCiszbDRlcjFpCitsNGVybworbGVzMgorbGU1czFjbworbGVzMmMKKzVsZXNxCiszbDJlMnNzCis1bGVzcy4KK2wzZTF2YQorbGV2NGVyLgorbGV2MWVyCitsZXY0ZXIxYQorbGV2NGU0cjFzMgorM2xleQorNGxleWUKKzJsZgorbDVmcgorNGwxZzQKK2w1Z2EKK2xnMmEycjMKK2w0Z2VzCitsMWdvMworMmwzaAorbGk0YWcKK2wyaTFhCitsaTJhbTQKK2xpYXI1aXoKK2xpMmEycgorbGlhcjFpCitsaTRhcworbGk0YTF0bworbGk1YmkKKzVsaWMyaW8KK2wyaTFjaQorbGk0Y29yCitsaTFjbworNGxpNGMzczIKKzRsaWN0LgorbGkyYzF0CitsNGljdQorbDNpMWN5CitsM2kxZDJhCitsMmlkCitsaWQ1ZXIKKzNsaTJkaQorbGlmM2VyMQorbDRpNGYxZgorbGk0ZjRsMgorNWxpZ2F0ZQorbDJpZworbGkxZ2EKKzNsaWdoCitsaTRncmEKK2xpMWdyCiszbDRpaworNGw0aTRsCitsaW00YjJsMgorbGk0bTFiCitsaW0zaQorbGk0bW8KK2w0aTRtNHAKK2w0aTFuYQorMWw0aW5lCitsaW4zZWEKK2wyaW4zaQorbGluazVlcgorbDRpNG5rMgorbGk1b2cKK2wyaW8KKzRsNGlxCitsaXM0cAorbDFpdAorbDJpdC4KKzVsaXQzaTFjYQorbGkxdGkKK2w0aTJ0aWMKK2w1aTV0aTRjM3MyCitsaXYzZXIKK2wyaXYKK2wxaXoKKzRsagorbGthMworbDNrYWw0Citsa2E0dAorbDFsCitsNGxhdworbDJsZQorbDVsZTJhCitsM2xlYworbDNsZWcKK2wzbGVsCitsM2xlNG4KK2wzbGU0dAorbGwyaQorbDJsaW40CitsNWw0aTFuYQorbGw0bworbGxvcTJ1aTUKK2xsbzFxCitsbG9xdTIKK2wybDVvdXQKK2xsb3UyCitsNWxvdworMmxtCitsNW1ldAorbG0zaW5nCitsNG1vMmQxCitsMW1vCitsbW8ybjQKKzJsMW4yCiszbG8uCitsb2I1YWwKK2xvNGNpCis0bG9mCiszbG9nMWljCitsNW8xZ28KKzNsb2d1Citsb20zZXIKK2xvMm1lCis1bG9uZworbG8ybgorbG9uNGkKK2wzbzNuaXoKK2xvb2Q1Citsb28yCis1bG80cGUuCitsb3AzaQorbDNvNHAxbQorbG8xcmE0CitsbzRyYTF0bworbG81cjJpZTQKK2xvcjVvdTIKKzVsb3MuCitsb3M1ZXQKKzVsb3M1bzNwaGl6CitsbzJzbworbG9zNG9wCitsb3Myb3BoCis1bG9zNW8xcGh5Citsb3M0dAorbG80dGEKK2xvdW41ZAorbG91MgorMmxvdXQKKzRsb3YKKzJscAorbHBhNWIKK2wxcGEKK2wzcGhhCitsNXBoaQorbHA1aW5nCitscGkybgorbDNwaXQKK2w0cDJsMgorbDVwcjIKKzRsMXIKKzJsMXMyCitsNHNjCitsMnNlCitsNHMyaWU0Cis0bHQKK2x0NWFnCitsMXRhCitsdGFuZTUKK2x0YTJuCitsMXRlCitsdGVuNAorbHRlcjFhNAorbHRoM2kKK2w1dGllcy4KK2x0MmllNAorbHRpczQKK2wxdHIKK2wxdHUyCitsdHUxcjNhCitsdTVhCitsdTNicgorbHUyY2g0CitsdTNjaQorbHUzZW4KK2x1ZjQKK2x1NWlkCitsMnVpMgorbHU0bWEKKzVsdTFtaQorbDV1bW4uCitsdTRtMW4KKzVsdW0zbjRpMWEKK2x1M28KK2x1bzNyCis0bHVwCitsdTJzczQKK2wydXMKK2x1czN0ZQorMWx1dAorbDV2ZW4KK2w1dmV0NAorMmwxdworMWx5Cis0bHlhCis0bHkxYgorbHk1bWU0CitseTNubworMmx5czQKK2w1eTNzMmUKKzFtYQorMm1hYgorbWEyY2EKK21hNWNoMmluZQorbWEyY2gKK21hNGNoMWluCittYTRjNGw0CittYWc1aW4KK21hZzFpCis1bWFnMW4KKzJtYWgKK21hMmlkNQorbWFpMgorNG1hMmxkCittYTNsMmlnCittYWwxaQorbWE1bGluCittYWw0bDJpCittYWwxbAorbWFsNHR5CittYTRsdAorNW1hM240aTFhCittYTJuCittYW41aXMKK21hbjNpegorNG1hcAorbWE1cmkybmUuCittMmEycgorbWFyMWkKK21hcjJpbjRlCittYTVyMml6CittYXI0bHkKK21hcjFsCittYXIzdgorbWE1c2NlCittYXM0ZQorbWFzMXQKKzVtYXRlCittNGF0aDMKK21hM3RpcworNG1hdGkzemExCittYTF0aXoKKzRtMWIKK20xYmE0dDUKK201YmlsCittNGIzaW5nCittYjJpNHYKKzRtNWMKKzRtZS4KKzJtZWQKKzRtZWQuCis1bWUzZDRpM2EKK200ZWRpCittZTNkMmllNAorbTVlNWQyeQorbWUyZworbWVsNW8ybgorbWU0bDR0CittZTJtCittZTFtMW8zCisxbWVuCittZTFuNGEKK21lbjVhYworbWVuNGRlCis0bWVuZQorbWVuNGkKK21lMm4xczQKK21lbjFzdTUKKzNtZW4xdAorbWVuNHRlCittZTVvMm4KK201ZXIxc2EyCittZTRyMXMyCisybWVzCiszbWVzdDJpCittZTR0YQorbWV0M2EybAorbWUxdGUKK21lNXRoaQorbTRldHIKKzVtZXQzcmljCittZTV0cjJpZTQKK21lM3RyeQorbWU0dgorNG0xZgorMm1oCis1bWkuCittMmkzYQorbWkxZDRhCittMmlkCittaWQ0ZworbTJpZzQKKzNtaWwzaTFhCittaWwxaQorbTVpNWwyaWU0CittNGlsMWwKK21pMW40YQorM200aW5kCittNWkzbmVlCittMmluZQorbTRpbmdsMgorbWluNWdsaQorbTVpbmcxbHkKK21pbjR0CittNGluMXUKK21pb3Q0CittMmlvCittMmlzCittaTRzNGVyLgorbTRpc2UKK21pczNlcgorbWlzNWwyCittaXM0dDJpCittNWk0c3RyeQorbWlzdDRyCis0bTJpdGgKK20yaXoKKzRtaworNG0xbAorbTFtCittbWE1cnkKK20xbWEKK21tMmEycgorNG0xbgorbTFuNGEKK200bjFpbgorbW40bworMW1vCis0bW9jcgorNW1vYzVyYTF0aXoKK21vMmQxCittbzRnbworbW9pczIKK21vaTIKK21vNGk1c2UKKzRtMm9rCittbzVsZXN0Cittb2xlczIKK21vM21lCittb241ZXQKK21vMm4KK21vbjVnZQorbW8zbjRpM2EKK21vbjRpMnMxbQorbW9uMWlzCittb240aXN0CittbzNuaXoKK21vbm9sNAorbW8zbnkuCittbzJyCis0bW81cmEuCittbzFyYQorbW9zMgorbW81c2V5CittbzNzcAorbTRvdGgzCittNW91ZgorbW91MgorM21vMnVzCittbzJ2Cis0bTFwCittcGFyYTUKK20xcGEKK21wMmEycgorbXBhNXJhYgorbXA0YTRyNWkKK20zcGUydAorbXBoYXM0CittMnBpCittcDJpNGEKK21wNWllcworbXAyaWU0CittNHAxaTJuCittNXA0aXIKK21wNWlzCittcG8zcmkKK20xcDRvcgorbXBvczVpdGUKK20xcG9zCittNHBvMnVzCittcG91MgorbXBvdjUKK21wNHRyCittMnAxdAorbTJweQorNG0zcgorNG0xczIKK200czJoCittNXNpCis0bXQKKzFtdQorbXVsMmE1cjQKK211MWxhCis1bXU0bHQKK211bDF0aTMKKzNtdW0KK211bjIKKzRtdXAKK211NHUKKzRtdworMW5hCisybjFhMmIKK240YWJ1Cis0bmFjLgorbmE0Y2EKK241YTJjMXQKK25hZzVlci4KK25hazQKK25hNGwxaQorbmE1bDJpMWEKKzRuYTRsdAorbmE1bWl0CituMmEybgorbmFuMWNpNAorbmFuNGl0CituYTRuazQKK25hcjNjCituMmEycgorNG5hcmUKK25hcjNpCituYXI0bAorbjVhcjFtCituNGFzCituYXM0YworbmFzNXQyaQorbjJhdAorbmEzdGEybAorbmEydGEKK25hdDVvNW0yaXoKK25hMnRvbQorbmExdG8KK24yYXUKK25hdTNzZQorbmEydXMKKzNuYXV0CituYXY0ZQorNG4xYjQKK25jMmEycjUKK24xY2EKK240Y2VzLgorbjNjaGEKK24yY2gKK241Y2hlbworbmNoZTIKK241Y2g0aWwyCituM2NoaXMKK24yYzFpbgorbjFjaQorbjJjNGl0CituY291MXI1YQorbjFjbworbmNvdTIKK24xY3IKK24xY3UKK240ZGFpMgorbjFkMmEKK241ZGEybgorbjFkZQorbmQ1ZTJzdC4KK25kZXMyCituZGk0YgorbjVkMmlmCituMWRpdAorbjNkaXoKK241ZHUyYworbjFkdQorbmR1NHIKK25kMndlCituZDF3CisybmUuCituM2UyYTJyCituMmUyYgorbmViM3UKK25lMmMKKzVuZWNrMQorMm5lZAorbmU0Z2F0CituZTFnYQorbmU0ZzVhMXQyaXYKKzVuZWdlCituZTRsYQorbmVsNWl6CituZWwyaQorbmU1bWkKK25lNG1vCisxbmVuCis0bmVuZQorM25lbworbmU0cG8KK25lMnEKK24xZXIKK25lMnJhNWIKK25lcjFhCituNGVyM2EycgorbjJlcmUKK240ZXI1aQorbmVyNHI0CisxbmVzCisybmVzLgorNG5lMXNwCisybmVzdAorNG5lczR3MgorM25ldDFpYworbmU0dgorbjVldmUKK25lNHcKK24zZgorbjRnYWIKK24xZ2EKK24zZ2VsCituZ2U0bjRlCituMWdlbgorbjVnZXJlCituM2dlcjFpCituZzVoYQorbjNnaWIKK25nMWluCituNWdpdAorbjRnbGE0CituZ2wyCituZ292NAorbjFnbworbmc1czJoCituZ3MyCituMWd1CituNGd1bQorbjJneQorNG4xaDQKK25oYTQKK25oYWIzCituaGU0CiszbjRpMWEKK25pM2Eybgorbmk0YXAKK25pM2JhCituaTRiMmwyCituMmk0ZAorbmk1ZGkKK25pNGVyCituMmllNAorbmkyZmkKK25pNWZpY2F0CituaWZpMWNhCituNWkxZ3IKK24yaWcKK240aWs0CituMWltCituaTNtMml6CituaW0xaQorbjFpbgorNW5pMm5lLgorbjJpbmUKK25pbjRnCituMmk0bworNW4yaXMuCituaXM0dGEKK24yaXQKK240aXRoCiszbjJpMXQyaW8KK25pMXRpCituM2l0b3IKK25pMXRvCituaTN0cgorbjFqCis0bmsyCituNWsyZXJvCituazFlcgorbjNrZXQKK25rM2luCituazFpCituMWsxbAorNG4xbAorbjVtCitubWU0CitubWV0NAorNG4xbjIKK25uZTQKK25uaTNhbAorbjNuNGkxYQorbm4yaTR2Citub2I0bDIKK25vM2JsZQorbjVvMWM0bDQKKzRuM28yZAorM25vZQorNG5vZworbm8xZ2U0Citub2lzNWkKK25vaTIKK25vNWw0aQorNW5vbDFvMWdpcworM25vbWljCituNW81bTJpegorbm80bW8KK25vM215CitubzRuCitub240YWcKK25vMW4xYQorbm9uNWkKK241b25pegorNG5vcAorNW5vcDVvNWwyaQorbm8ycjVhYgorbm8xcmEKK25vNHJhcnkKK25vcjJhMnIKKzRub3MyYworbm9zNGUKK25vczV0CitubzV0YQorMW5vdTIKKzNub3VuCitub3YzZWwzCitub3dsMworbjFwNAorbnBpNAorbnByZTRjCitucHIyCituMXEKK24xcgorbnJ1NAorMm4xczIKK24yczVhYgorbnNhMgorbnNhdGk0CituczRjCituMnNlCituNHMzZTRzCituczJpZDEKK25zMmlnNAorbjJzMWwyCituMnMzbQorbjRzb2MKK24xc28KK25zNHBlCituNXNwaQorbnN0YTViMmwyCituczF0YQorbnMydGFiCituMXQKK24ydGE0YgorbjF0YQorbnRlNHIzczIKK250MmkKK241dGkyYgorbnRpNGVyCitudDJpZTQKK250aTJmMgorbjN0MmluZQorbjJ0MWluCituNHQzaW5nCitudDJpNHAKK250cm9sNWwyaQorbnRyb2wxbAorbjR0NHMyCitudHUzbWUKK24xdHUKK24zdHVtCitudTFhCitudTRkCitudTVlbgorbnVmNGZlCitudTRmMWYKK24zdWk0bgorbjJ1aTIKKzNudTNpdAorbjR1bQorbnUxbWUKK241dTFtaQorM251NG4KK24zdW8KK251M3RyCituMXYyCituMXc0CitueW00CitueXA0Cis0bnoKK24zemExCis0b2EKK29hMmQzCitvNWE1bGVzMgorbzJhbGUKK29hcmQzCitvMmEycgorb2FzNGUKK29hc3Q1ZQorb2F0NWkKK29iM2EzYgorbzViMmEycgorbzFiZTRsCitvMWJpCitvMmJpbgorb2I1aW5nCitvM2JyCitvYjN1bAorbzFjZQorbzJjaDQKK28zY2hlNHQKK29jaGUyCitvY2lmMworbzFjaQorbzRjaWwKK280Y2xhbQorbzFjNGw0CitvNGNvZAorbzFjbworb2MzcmFjCitvYzVyYTF0aXoKK29jcmUzCis1b2NyaXQKK29jcmkyCitvY3RvMnI1YQorbzJjMXQKK29jMXRvCitvYzN1MWxhCitvNWN1cmUKK29kNWQxZWQKK29kMWQ0CitvZDNpYworbzFkMmkzbworbzJkbzQKK29kNG9yMworbzRkNXVjdC4KK28xZHUKK29kdTJjCitvZHUyYzF0CitvNGQ1dWM0dDFzMgorbzRlbAorbzVlbmcKK28zZXIKK29lNHRhCitvM2V2CitvMmZpCitvZjVpdGUKK29mNGk0dDR0MgorbzJnNWE1cgorbzFnYQorbzRnNWExdDJpdgorbzRnYTF0bworbzFnZQorbzVnZW5lCitvMWdlbgorbzVnZW8KK280Z2VyCitvM2cyaWU0CisxbzFnaXMKK29nM2l0CitvNGdsMgorbzVnMmx5Ciszb2duaXoKK29nMW5pCitvNGc0cm8KK28xZ3IKK29nMnU1aTIKKzFvMWd5CisybzJnNXkzbgorbzFoMgorb2hhYjUKK29pMgorb2ljM2VzCitvaTNkZXIKK28yaWQKK29pNGYxZjQKK28yaWc0CitvaTVsZXQKK28zaW5nCitvaW50NWVyCitvaW4xdAorbzVpMnMxbQorb2k1c28ybgorb2kyc28KK29pc3Q1ZW4KK29pczF0ZQorb2kzdGVyCitvMml0ZQorbzVqCisyb2sKK28za2VuCitvazVpZTQKK29rMWkKK28xbGEKK280bGEybgorb2xhMnNzNAorbzJsMmQKK29sMmQxZQorb2wzZXIKK28zbGVzMmMKK29sZXMyCitvM2xldAorb2w0ZmkKK28ybGYKK29sMmkKK28zbDJpMWEKK28zbGljZQorb2w1aWQuCitvbDJpZAorbzNsaTRmCitvNWw0aTRsCitvbDNpbmcKK281bDJpbworbzVsMmlzLgorb2wzaXMyaAorbzVsMml0ZQorb2wxaXQKK281bDJpMXQyaW8KK29saTF0aQorbzVsMml2CitvbGwyaTRlNAorb2wxbAorb2xsMmkKK29sNW8zZ2l6CitvbG80cgorb2w1cDJsMgorbzJscAorbzRsMnQKK29sM3ViCitvbDN1bWUKK29sM3VuCitvNWwydXMKK29sMnYKK28ybHkKK28ybTVhaAorbzFtYQorb21hNWwKK29tNWExdGl6CitvbTJiZQorbzRtMWIKK29tNGIybDIKK28ybWUKK29tM2UxbjRhCitvMW1lbgorb201ZXIyc2UKK29tZTRyMXMyCitvNG1ldAorb201ZTN0cnkKK29tNGV0cgorbzNtMmkzYQorb20zaWMuCitvbTNpMWNhCitvNW0yaWQKK29tMWluCitvNW0yaW5pCis1b21tZW5kCitvbTFtCitvbTFtZW4KK29tbzRnZQorbzFtbworbzRtbzJuCitvbTNwaQorbzRtMXAKK29tcHJvNQorb21wcjIKK28ybgorbzFuMWEKK29uNGFjCitvM24yYTJuCitvbjFjCiszb25jaWwKK29uMWNpCisyb25kCitvbjVkbworbzNuZW4KK28ybjVlc3QKK28xbmVzCitvbjRndQorb24xaWMKK28zbjJpNG8KK29uMWlzCitvNW5pMXUKK29uM2tleQorbzRuazIKK29uNG9kaQorbzRuM28yZAorb24zbzNteQorbzJuM3MyCitvbjVzcGk0CitvbnNwaTFyNWEKK29uc3A0aXIKK29uMXN1NAorb250ZW40CitvbjF0CitvbjN0NGkKK29udGkyZjUKK29uNXVtCitvbjF2YTUKK29uMXYyCitvbzIKK29vZDVlCitvb2Q1aQorbzJvNGsKK29vcDNpCitvM29yZAorb29zdDUKK28ycGEKK28ycDJlNWQKK29wMWVyCiszb3BlcjFhCis0b3A0ZXJhZworMm9waAorbzVwaGEybgorbzVwaDRlcgorb3AzaW5nCitvcGkybgorbzNwaXQKK281cG8ybgorbzRwb3NpCitvMXBvcworbzFwcjIKK29wMXUKK29weTUKK28xcQorbzFyYQorbzVyYS4KK280cjNhZworb3I1YWwxaXoKK29yYWwxaQorb3I1YW40Z2UKK29yYTJuCitvcjJhbmcKK29yZTVhCitvNXJlMWE0bAorb3IzZWkyCitvcjRlNXMyaAorb3I1ZTJzdC4KK29yZXMydAorb3JldzQKK29yNGd1CitvcmcyCis0bzVyMmkzYQorb3IzaTFjYQorbzVyaWwKK29yMWluCitvMXIyaTFvCitvcjNpMXR5CitvM3JpMXUKK29yMm1pCitvcjFtCitvcm4yZQorbzVyb2YKK29yM291Zworb3JvdTIKK29yNXBlCitvcjFwCiszb3JyaDQKK29yMXI0CitvcjRzZQorbzRyczIKK29yczVlbgorb3JzdDQKK29yM3RoaQorb3IzdGh5CitvcjR0eQorbzVydW0KK28xcnkKK29zM2FsCitvc2EyCitvczJjCitvczRjZQorbzNzY29wCitvczFjbworNG9zY29waQorbzVzY3IKK29zNGk0ZTQKK29zNWkxdDJpdgorb3NpMXRpCitvczNpMXRvCitvczNpMXR5CitvNXNpNHUKK29zNGwyCitvMnNvCitvMnM0cGEKK29zNHBvCitvczJ0YQorbzVzdGF0aQorb3M1dGlsCitvc3QyaQorb3M1dGl0CitvNHRhMm4KK28xdGEKK290ZWxlNGcKK290M2VyLgorb3Q1ZTRyMXMyCitvNHRlcworNG90aAorb3RoNWUxc2kKK290aDJlCitvdGgxZXMKK290aDNpNAorb3QzaWMuCitvdDVpMWNhCitvM3RpY2UKK28zdGlmMgorbzN0aXMKK290bzVzMgorbzF0bworb3UyCitvdTNiMmwyCitvdWNoNWkKK291MmNoCitvdTVldAorb3U0bAorb3VuYzVlcgorb3VuMmQKK291NXYyCitvdjRlbgorb3ZlcjRuZQorb3ZlNHIzczIKK292NGVydAorbzN2aXMKK280dmkxdGk0CitvNXY0b2wKK293M2Rlcgorb3czZWwKK293NWVzdDMKK293MWkyCitvd241aQorbzR3bzIKK295MWEKKzFwYQorcGE0Y2EKK3BhNGNlCitwYTJjNHQKK3A0YTJkCis1cGFnYTRuCitwYTFnYQorcDNhZ2F0CitwNGFpMgorcGE0aTRuNAorcDRhbAorcGExbjRhCitwYTJuCitwYW4zZWwKK3BhbjR0eQorcGFuMXQKK3BhM255CitwYTFwCitwYTRwdQorcGFyYTViMmwyCitwMmEycgorcGEycmFiCitwYXI1YWdlCitwYXI1ZDJpCiszcGFyZQorcGFyNWVsCitwNGE0cjFpCitwYXI0aXMKK3BhMnRlCitwYTV0ZXIKKzVwYXRoaWMKK3A0YXRoCitwYTV0aHkKK3BhNHRyaWMKK3BhMXRyCitwYXY0CiszcGF5Cis0cDFiCitwZDQKKzRwZS4KKzNwZTRhCitwZWFyNGwKK3BlMmEycgorcGUyYworMnAyZWQKKzNwZWRlCiszcDRlZGkKK3BlM2Q0aTNhNAorcGVkNGljCitwNGVlCitwZWU0ZAorcGVrNAorcGU0bGEKK3BlbDJpNGU0CitwZWwyaQorcGU0bjJhMm4KK3BlMW5hCitwNGVuYworcGVuNHRoCitwZW4xdAorcGU1bzJuCitwNGVyYS4KK3BlcjFhCitwZXJhNWIybDIKK3BlMnJhNGIKK3A0ZXJhZworcDRlcjFpCitwZXJpNXN0CitwZXIyaXMKK3BlcjRtYWwKK3BlcjNtNAorcGVyMW1hCitwZXIybWU1CitwNGVybgorcDJlcjNvCitwZXIzdGkKK3A0ZTVydQorcGVyMXYKK3BlMnQKK3BlNXRlbgorcGU1dGl6Cis0cGYKKzRwZworNHBoLgorcGhhcjVpCitwaDJhMnIKK3BoNGUzbm8KK3BoZTJuCitwaDRlcgorcGg0ZXMuCitwaDFlcworcGgxaWMKKzVwaDJpZTQKK3BoNWluZworNXBoaXMxdDJpCiszcGhpegorcDRoMmw0CiszcGhvYgorM3Bob25lCitwaG8ybgorNXBob25pCitwaG80cgorNHA0aDFzMgorcGgzdAorNXBodQorMXBoeQorcDJpM2EKK3BpMmEybjQKK3BpNGMyaWU0CitwMmkxY2kKK3BpNGN5CitwNGlkCitwNWkxZDJhCitwaTNkZQorNXBpMmRpCiszcGllYworcDJpZTQKK3BpM2VuCitwaTRncmFwCitwMmlnCitwaTFncgorcGkzbG8KK3BpMm4KK3A0aW4uCitwNGluZDQKK3A0aTFubworM3AyaTFvCitwaW8ybjQKK3AzaXRoCitwaTV0aGEKK3BpMnR1CisycDNrMgorMXAybDIKKzNwbGEybgorcGxhczV0CitwbDJpM2EKK3BsaTVlcgorcGwyaWU0Cis0cGwyaWcKK3BsaTRuCitwbG9pNAorcGx1NG0KK3BsdTRtNGIKKzRwMW0KKzJwM24KK3BvNGMKKzVwb2QuCitwbzVlbQorcG8zZXQ1Cis1cG80ZworcG9pbjIKK3BvaTIKKzVwb2luMXQKK3BvbHk1dAorcG8ybHkKK3BvNG5pCitwbzJuCitwbzRwCisxcDRvcgorcG80cnkKKzFwb3MKK3BvMnMxcworcDRvdAorcG80dGEKKzVwb3VuCitwb3UyCis0cDFwCitwcGE1cmEKK3AxcGEKK3BwMmEycgorcDJwZQorcDRwMmVkCitwNXBlbAorcDNwZW4KK3AzcGVyCitwM3BlMnQKK3BwbzVzMml0ZQorcDFwb3MKK3ByMgorcHJheTRlNAorNXByZTFjMmkKK3ByZTVjbworcHJlM2UybQorcHJlNGY1YWMKK3ByZTFmCitwcmUxZmEKK3ByZTRsYQorcHIxZTNyNAorcDNyZTFzMmUKKzNwcjJlMnNzCitwcmU1dGVuCitwcmUzdjIKKzVwcjJpNGU0CitwcmluNHQzCitwcjJpNHMKK3ByaTJzM28KK3Azcm8xY2EKK3ByMm9jCitwcm9mNWl0Citwcm8yZmkKK3BybzNsCitwcm9zM2UKK3BybzF0CisycDFzMgorcDJzZQorcHM0aAorcDRzaTFiCisycDF0CitwMnQ1YTRiCitwMXRhCitwMnRlCitwMnRoCitwMXRpM20KK3B0dTRyCitwMXR1CitwNHR3NAorcHViMworcHVlNAorcHVmNAorcHU0bDNjMgorcHU0bQorcHUybgorcHVyNHI0Cis1cDJ1cworcHUydAorNXB1dGUKK3B1dDNlcgorcHUzdHIKK3B1dDR0MWVkCitwdTR0M3QyCitwdXQ0dDFpbgorcDN3CitxdTIKK3F1YTV2NAorMnF1ZS4KKzNxdWVyCiszcXVldAorMnJhYgorcmEzYmkKK3JhY2g0ZTIKK3JhMmNoCityNWExYzRsNAorcmFmNWZpCityYTJmCityYTRmMWY0CityYTJmNHQKK3IyYWkyCityYTRsbworcmFtM2V0CityMmFtaQorcmEzbmU1bworcmEybgorcmFuNGdlCityMmFuZworcjRhbmkKK3JhNW5vNAorcmFwM2VyCiszcmExcGh5CityYXI1YworcjJhMnIKK3JhcmU0CityYXI1ZTFmCis0cmFyaWwKK3JhcjFpCityMmFzCityYXRpbzJuNAorcmExdDJpbworcmF1NHQKK3JhNXZhaTIKK3JhMnZhCityYXYzZWwKK3JhNXoyaWU0CityYTJ6MWkKK3IxYgorcjRiYWIKK3I0YmFnCityYmkyCityMmIzaTRmCityMmJpbgorcjViMmluZQorcmI1aW5nLgorcmI0bworcjFjCityMmNlCityMWNlbjQKK3IzY2hhCityMmNoCityY2g0ZXIKK3JjaGUyCityNGNpNGIKK3IxY2kKK3IyYzRpdAorcmN1bTMKK3I0ZGFsCityMWQyYQorcmQyaQorcjFkNGk0YQorcmRpNGVyCityZDJpZTQKK3JkMWluNAorcmQzaW5nCisycmUuCityZTFhNGwKK3JlM2EybgorcmU1YXIxcjQKK3JlMmEycgorNXJlYTJ2CityZTRhdworcjVlYnJhdAorcjJlMWIKK3JlM2JyCityZWM1b2wxbAorcmUyY29sCityZTFjbworcmU0YzVvbXBlCityZWNvNG0xcAorcmU0Y3JlCityZTFjcgorMnIyZWQKK3JlMWRlCityZTNkaXMxCityNGVkaQorcmVkNWl0CityZTRmYWMKK3JlMWYKK3JlMWZhCityZTJmZQorcmU1ZmVyLgorcmVmZXIxCityZTNmaQorcmU0ZnkKK3JlZzNpcworcmU1aXQKK3JlaTIKK3JlMWwyaQorcmU1bHUKK3I0ZW40dGEKK3JlbjF0CityZW40dGUKK3JlMW8KK3JlNXBpMm4KK3JlNHBvc2kKK3JlMXBvCityZTFwb3MKK3JlMXB1CityMWVyNAorcjRlcjFpCityMmVybzQKK3I0ZTVydQorcjRlcy4KK3JlNHNwaQorcmUxc3AKK3JlczRzNWk0YgorcjJlMnNzCityZXMxc2kKK3JlczJ0CityZTVzMnRhMmwKK3JlczF0YQorcjJlM3N0NHIKK3JlNHRlcgorcmU0dGk0egorcmUzdHJpCityNGV1MgorcmU1dTF0MmkKK3JldjIKK3JlNHZhbAorcmUxdmEKK3JldjNlbAorcjVldjVlci4KK3JldjFlcgorcmU1dmU0cjFzMgorcmU1dmVydAorcmU1dmk0bAorcmUxdmkKK3JldjVvbHUKK3JlNHdoCityMWYKK3IzZnU0CityNGZ5CityZzIKK3JnM2VyCityM2dldAorcjNnMWljCityZ2k0bgorcmczaW5nCityNWdpcworcjVnaXQKK3IxZ2wyCityZ280bjIKK3IxZ28KK3IzZ3UKK3JoNAorNHJoLgorNHJoYWwKK3IyaTNhCityaWE0Ygorcmk0YWcKK3I0aWIKK3JpYjNhCityaWM1YXM1CityaTFjYQorcjRpY2UKKzRyMmkxY2kKKzVyaTVjMmlkCityaTRjMmllNAorcjRpMWNvCityaWQ1ZXIKK3IyaWQKK3JpM2VuYworcjJpZTQKK3JpM2VuMXQKK3JpMWVyCityaTVldAorcmlnNWEybgorcjJpZworcmkxZ2EKKzVyNGlnaQorcmlsM2l6CityaWwxaQorNXJpbWEybgorcmkxbWEKK3JpbTVpCiszcmkxbW8KK3JpbTRwZQorcmk0bTFwCityMmkxbmEKKzVyaW5hLgorcjRpbjRkCityMmluNGUKK3JpbjRnCityMmkxbworNXJpcGgKK3IyaXAKK3JpcGg1ZQorcmkycDJsMgorcmlwNWxpYworcjRpcQorcjJpcworcjRpcy4KK3IyaXM0YworcjNpczJoCityaXM0cAorcmkzdGEzYgorcmkxdGEKK3I1aXRlZC4KK3IyaXRlCityaTJ0MWVkCityaXQ1ZXIuCityaXQ1ZTRyMXMyCityNGkydDNpYworcmkxdGkKK3JpMnR1CityaXQ1dXIKK3JpdjVlbAorcjJpdgorcml2M2V0CityaXYzaQorcjNqCityM2tldAorcms0bGUKK3JrMWwKK3JrNGxpbgorcjFsCitybGU0CityMmxlZAorcjRsMmlnCityNGxpcworcmw1aXMyaAorcjNsbzQKK3IxbQorcm1hNWMKK3IxbWEKK3IybWUKK3IzbWVuCitybTVlNHIxczIKK3JtM2luZworcjRtaW5nLgorcjRtMmlvCityM21pdAorcjRteQorcjRuMmEycgorcjFuYQorcjNuZWwKK3I0bjFlcgorcjVuZXQKK3IzbmV5CityNW5pYworcjFuaXM0CityM24yaXQKK3IzbjJpdgorcm5vNAorcjRub3UyCityM251Cityb2IzbDIKK3Iyb2MKK3JvM2NyCitybzRlCitybzFmZQorcm81ZmlsCitybzJmaQorcjJvazIKK3JvNWsxZXIKKzVyb2xlLgorcm9tNWUxdGUKK3JvMm1lCitybzRtZXQKK3JvbTRpCitybzRtNHAKK3JvbjRhbAorcm8ybgorcm8xbjFhCityb240ZQorcm81bjRpcworcm9uNHRhCityb24xdAorMXJvb20KK3JvbzIKKzVyb290CitybzNwZWwKK3JvcDNpYworcm9yM2kKK3JvNXJvCitybzJzNXBlcgorcm8yczRzCitybzR0aDJlCityNG90aAorcm80dHkKK3JvNHZhCityb3Y1ZWwKK3JveDUKK3IxcAorcjRwZTRhCityNXBlbjF0CitycDVlci4KK3IzcGUydAorcnA0aDQKK3JwM2luZworcnBpMm4KK3IzcG8KK3IxcjQKK3JyZTRjCitycmU0ZgorcjRyZTFvCitycmU0czJ0CitycjJpNG8KK3JyMmk0dgorcnJvMm40Citycm9zNAorcnJ5czQKKzRyczIKK3Ixc2EyCityc2E1dGkKK3JzNGMKK3Iyc2UKK3Izc2VjCityc2U0Y3IKK3I0czVlci4KK3JzM2U0cworcjVzZTV2MgorcjFzMmgKK3I1c2hhCityMXNpCityNHNpNGIKK3JzbzJuMworcjFzbworcjFzcAorcjVzdzIKK3J0YTJjaDQKK3IxdGEKK3I0dGFnCityM3QyZTFiCityM3RlbjRkCityMXRlNW8KK3IxdGkKK3IydDVpMmIKK3J0Mmk0ZAorcjR0aWVyCitydDJpZTQKK3IzdDJpZworcnRpbDNpCitydGlsNGwKK3I0dGkxbHkKK3I0dGlzdAorcjR0Mml2CityM3RyaQorcnRyMm9waDQKK3J0NHMyaDQKK3I0dDFzMgorcnUzYQorcnUzZTRsCitydTNlbgorcnU0Z2wyCitydTNpNG4KK3IydWkyCitydW0zcDJsMgorcnU0bTJwCitydTJuCitydTRuazUKK3J1bjR0eQorcnVuMXQKK3I1dXNjMgorcjJ1cworcnUydDFpNW4KK3I0dTF0MmkKK3J2NGUKK3J2ZWw0aQorcjN2ZW4KK3J2NWVyLgorcjV2ZXN0CitydjRlMnMKK3IzdmV5CityM3ZpYworcjN2Mmk0dgorcjN2bworcjF3CityeTRjCis1cnluZ2UKK3J5bjVnCityeTN0CitzYTIKKzJzMWFiCis1c2FjazEKK3NhYzNyaTIKK3MzYTJjMXQKKzVzYWkyCitzYTRsMmEycjQKK3M0YTJsNG0KK3NhNWxvCitzYTRsNHQKKzNzYW5jCitzYTJuCitzYW40ZGUKK3M0YW5kCitzMWFwCitzYTV0YQorNXNhM3QyaW8KK3NhMnQzdQorc2F1NAorc2E1dm9yCis1c2F3Cis0czViCitzY2FuNHQ1CitzMWNhCitzY2Eybgorc2NhNHAKK3NjYXY1CitzNGNlZAorNHMzY2VpMgorczRjZXMKK3MyY2gyCitzNGNobzIKKzNzNGMyaWU0CitzMWNpCis1c2M0aW40ZAorczJjaW4KK3NjbGU1CitzMWM0bDQKK3M0Y2xpCitzY29mNAorczFjbworNHNjb3B5NQorc2NvdTFyNWEKK3Njb3UyCitzMWN1Cis0czVkCis0c2UuCitzZTRhCitzZWFzNAorc2VhNXcKK3NlMmMzbworM3NlMmMxdAorNHM0ZWQKK3NlNGQ0ZQorczVlZGwKK3NlMmcKK3NlMWczcgorNXNlaTIKK3NlMWxlCis1c2UybDJmCis1c2VsdgorNHNlMW1lCitzZTRtb2wKK3NlMW1vCitzZW41YXQKK3NlMW5hCis0c2VuYworc2VuNGQKK3M1ZTJuZWQKK3NlbjVnCitzNWVuMWluCis0c2VuNHQxZAorc2VuMXQKKzRzZW4ydGwKK3NlMnAzYTMKKzRzMWVyLgorczRlcjFsCitzMmVyNG8KKzRzZXIzdm8KK3MxZTRzCitzNGU1czJoCitzZXM1dAorNXNlNXVtCitzNGV1Cis1c2V2CitzZXYzZW4KK3NldzRpMgorNXNleAorNHMzZgorMnMzZworczJoCisyc2guCitzaDFlcgorNXNoZXYKK3NoMWluCitzaDNpbworM3NoMmk0cAorc2gyaTJ2NQorc2hvNAorc2g1bzJsMmQKK3NobzJuMworc2hvcjQKK3Nob3J0NQorNHNoMXcKK3NpMWIKK3M1aWMzYworM3NpMmRlLgorczJpZAorNXNpZGU0czIKKzVzaTJkaQorc2k1ZGl6Cis0c2lnMW40YQorczJpZworc2lsNGUKKzRzaTFseQorMnMxaW4KK3MyaTFuYQorNXNpMm5lLgorczJpbmUKK3MzaW5nCisxczJpbworNXNpbzJuCitzaW8xbjVhCitzNGkycgorc2kxcjVhCisxc2lzCiszczJpMXQyaW8KK3NpMXRpCis1c2kxdQorMXMyaXYKKzVzaXoKK3NrMgorNHNrZQorczNrZXQKK3NrNWluZQorc2sxaQorc2s1aW40ZworczFsMgorczNsYXQKK3MybGUKK3NsMml0aDUKK3NsMWl0CisyczFtCitzM21hCitzbWFsMWwzCitzbWEybjMKK3NtZWw0CitzNW1lbgorNXM0bTJpdGgKK3NtbzJsNWQ0CitzMW1vCitzMW40Cisxc28KK3NvNGNlCitzbzJmdDMKK3NvNGxhYgorc28xbGEKK3NvMmwzZDIKK3NvM2xpYworc29sMmkKKzVzb2wydgorM3NvbQorM3M0b24uCitzbzJuCitzbzFuMWE0Citzb240ZworczRvcAorNXNvcGgxaWMKK3Myb3BoCitzNW8zcGhpegorczVvMXBoeQorc29yNWMKK3NvcjVkCis0c292CitzbzV2aQorMnMxcGEKKzVzcDRhaTIKK3NwYTRuCitzcGVuNGQKKzJzNXBlbworMnNwZXIKK3MycGhlCiszc3BoNGVyCitzcGhvNQorc3BpbDQKK3NwNWluZworc3BpMm4KKzRzM3AyaTFvCitzNHAxbHkKK3MxcDJsMgorczRwbzJuCitzMXA0b3I0Cis0c3A0b3QKK3NxdWFsNGwKK3NxdTIKK3MxcgorMnNzCitzMXNhMgorc3NhczMKK3MyczVjCitzM3NlbAorczVzZW41ZworczRzZXMuCitzczFlNHMKK3M1c2V0CitzMXNpCitzNHMyaWU0Citzc2k0ZXIKK3M0czVpMWx5CitzNHMxbDIKK3NzNGxpCitzNHMxbjQKK3NzcGVuNGQ0CitzczJ0Citzc3UxcjVhCitzMXN1Citzc3Uycgorc3M1dzIKKzJzdC4KK3MydGFnCitzMXRhCitzMnRhMmwKK3N0YW00aQorNXN0NGFuZAorc3RhMm4KK3M0dGE0cAorNXN0YXQuCitzNHQxZWQKK3N0ZXJuNWkKK3M1dDJlcm8KK3N0ZTJ3CitzdGUxdzVhCitzM3RoMmUKK3N0MmkKK3M0dGkuCitzNXQyaTFhCitzMXRpYworNXM0dGljazEKK3M0dDJpZTQKK3MzdGlmMgorc3QzaW5nCitzMnQxaW4KKzVzdDRpcgorczF0bGUKK3MydGwKKzVzdG9jazEKK3MxdG8KK3N0bzJtM2EKKzVzdG9uZQorc3RvMm4KK3M0dG9wCiszc3RvcmUKK3N0NHIKK3M0dHJhMmQKK3MxdHJhCis1c3RyYTJ0dQorczR0cmF5CitzNHRyMmlkCis0c3RyeQorNHN0M3c0CitzMnR5Cisxc3UKK3N1MWFsCitzdTRiMworc3UyZzMKK3N1NWlzCitzMnVpMgorc3VpdDMKK3M0dWwKK3N1Mm0KK3N1MW0zaQorc3Uybgorc3UycgorNHN2CitzdzIKKzRzMXdvMgorczR5Cis0c3kxYworM3N5bAorc3luNW8KK3N5NXJpbgorMXRhCiszdGEuCisydGFiCit0YTVibGVzMgordGFiMmwyCis1dGFiNW81bDFpegordGFib2wyaQorNHQ0YTJjaQordGE1ZG8KK3RhMmQKKzR0YTJmNAordGFpNWxvCit0YWkyCit0YTJsCit0YTVsYQordGFsNWVuCit0MmFsZQordGFsM2kKKzR0YWxrCit0YWw0bGlzCit0YWwxbAordGFsbDJpCit0YTVsb2cKK3RhNW1vCit0YW40ZGUKK3RhMm4KK3Q0YW5kCisxdGFuMXRhMwordGFuMXQKK3RhNXBlcgordGE1cDJsMgordGFyNGEKK3QyYTJyCis0dGFyMWMKKzR0YXJlCit0YTNyMml6Cit0YXIxaQordGFzNGUKK3RhNXM0eQorNHRhdDFpYwordGE0dHVyCit0YTJ0dQordGF1bjQKK3RhdjQKKzJ0YXcKK3RheDRpcwordGF4M2kKKzJ0MWIKKzR0YwordDRjaAordGNoNWU0dAordGNoZTIKKzR0MWQKKzR0ZS4KK3RlMmFkNGkKK3RlYTJkMQorNHRlYTJ0Cit0ZTFjZTQKKzV0ZTJjMXQKKzJ0MWVkCit0NGU1ZGkKKzF0ZWUKK3RlZzQKK3RlNWdlcjQKK3RlNWdpCiszdGVsLgordGVsMmk0Cis1dGUybDFzMgordGUybWEyCit0ZW0zYXQKKzN0ZW4yYTJuCit0ZTFuYQorM3RlbmMKKzN0ZW5kCis0dGUxbmVzCisxdGVuMXQKK3RlbjR0YWcKK3RlbjF0YQorMXRlbwordGU0cAordGU1cGUKK3RlcjNjCis1dGVyM2QKKzF0ZXIxaQordGVyNWllcwordGVyMmllNAordGVyM2lzCit0ZXJpNXphMQorNXQ0ZXIzbjJpdAordGVyNXYKKzR0ZXMuCis0dDJlMnNzCit0M2Vzcy4KK3RldGg1ZQorM3Q0ZXUKKzN0ZXgKKzR0ZXkKKzJ0MWYKKzR0MWcKKzJ0aC4KK3RoYTJuNAordGgyZQorNHRoZWEKK3RoM2VhcwordGhlNWEydAordGhlM2lzCit0aGVpMgorM3RoZTR0Cit0aDVpYy4KK3RoNWkxY2EKKzR0aDRpbDIKKzV0aDRpNG5rMgorNHQ0aDFsNAordGg1b2RlCis1dGhvZDNpYworNHRob28yCit0aG9yNWl0Cit0aG81cml6CisydDRoMXMyCisxdDJpMWEKK3RpNGFiCit0aTRhMXRvCisydGkyYgorNHRpY2sxCit0NGkxY28KK3Q0aWMxdQorNXRpMmRpCit0MmlkCiszdGllbgordDJpZTQKK3RpZjIKK3RpNWZ5CisydDJpZworNXRpZ3UKK3RpbDJsNWluNAordGlsMWwKK3RpbGwyaQorMXRpbQorNHRpNG0xcAordGltNXVsCit0aTJtdQorMnQxaW4KK3QyaTFuYQorM3RpMm5lLgordDJpbmUKKzN0MmluaQorMXQyaW8KK3RpNW9jCit0aW9uNWVlCit0aW8ybgorNXRpcQordGkzc2EyCiszdDRpc2UKK3RpMnM0bQordGk1c28KK3RpczRwCis1dGlzdGkxY2EKK3RpczF0MmkKK3RpczF0aWMKK3RpM3RsCit0aTR1CisxdDJpdgordGkxdjRhCisxdGl6Cit0aTN6YTEKK3RpM3plNG4KK3RpMnplCisydGwKK3Q1bGEKK3RsYTJuNAorM3RsZS4KKzN0bGVkCiszdGxlcy4KK3RsZXMyCit0NWxldC4KK3Q1bG8KKzR0MW0KK3RtZTQKKzJ0MW4yCisxdG8KK3RvM2IKK3RvNWNyYXQKKzR0bzJkbzQKKzJ0b2YKK3RvMmdyCit0bzVpYwordG9pMgordG8ybWEKK3RvNG00YgordG8zbXkKK3RvbjRhNGwxaQordG8ybgordG8xbjFhCit0bzNuMmF0Cis0dG9ubworNHRvbnkKK3RvMnJhCit0bzNyMmllNAordG9yNWl6Cit0b3MyCis1dG91cgordG91MgorNHRvdXQKK3RvM3cyYTJyCis0dDFwCisxdHJhCit0MnJhM2IKK3RyYTVjaAordHI0YTJjaTQKK3RyYTJjNGl0Cit0cmFjNHRlCit0cmEyYzF0Cit0cjJhczQKK3RyYTV2ZW4KK3RyYXY1ZTJzNQordHJlNWYKK3RyZTRtCit0cmVtNWkKKzV0cjJpM2EKK3RyaTVjZXMKK3RyNGljZQorNXRyaTNjMmkxYQordDRyMmkxY2kKKzR0cmk0YzNzMgorMnRyaW0KK3RyMmk0dgordHJvNW00aQordHJvbjVpCit0cm8ybgorNHRyb255Cit0cm81cGhlCit0cjJvcGgKK3RybzNzcAordHJvM3YKK3RyMnU1aTIKK3RyMnVzNAorNHQxczIKK3Q0c2MKK3RzMmg0Cit0NHN3MgorNHQzdDIKK3Q0dGVzCit0NXRvCit0MXR1NAorMXR1Cit0dTFhCit0dTNhMnIKK3R1NGI0aQordHVkMgorNHR1ZQorNHR1ZjQKKzV0MnUzaTIKKzN0dW0KK3R1NG5pcwordHUxbmkKKzJ0M3VwLgorM3R1cmUKKzV0dXJpCit0dXIzaXMKK3R1cjVvCit0dTVyeQorM3QydXMKKzR0dgordHc0Cis0dDF3YQordHdpczQKK3R3aTIKKzR0MXdvMgorMXR5Cis0dHlhCisydHlsCit0eXBlMwordHk1cGgKKzR0egordDJ6NGUKKzR1YWIKK3VhYzQKK3VhNW5hCit1YTJuCit1YW40aQordWFyNWFuMXQKK3UyYTJyCit1YXJhMm4KK3VhcjJkCit1YXIzaQordWFyM3QKK3UxYXQKK3VhdjQKK3ViNGUKK3U0YmVsCit1M2JlcgordTRiMmVybwordTFiNGkKK3U0YjVpbmcKK3UzYjRsZS4KK3ViMmwyCit1M2NhCit1Y2k0YgordTFjaQordTJjNGl0Cit1Y2xlMwordTFjNGw0Cit1M2NyCit1M2N1Cit1NGN5Cit1ZDVkNAordWQzZXIKK3VkNWVzdAordWRlczIKK3VkZTF2NAordTFkaWMKK3VkM2llZAordWQyaWU0Cit1ZDNpZXMKK3VkNWlzMQordTVkaXQKK3U0ZG8ybgordTFkbwordWQ0c2kKK3UyZDFzMgordTRkdQordTRlbmUKK3VlMm4xczQKK3VlbjR0ZQordWVuMXQKK3VlcjRpbAordWVyMWkKKzN1MWZhCit1M2Y0bDIKK3VnaDNlMm4KK3VnNWluCisydWkyCit1aWw1aXoKK3VpbDFpCit1aTRuCit1MWluZwordWlyNG0KK3U0aXIKK3VpMXRhNAordTJpdjMKK3VpNHY0ZXIuCit1NWoKKzR1awordTFsYQordWxhNWIKK3U1bGF0aQordWwyY2g0Cit1NGwxYzIKKzV1bGNoZTIKK3VsM2RlcgordTJsZAordWwyZGUKK3VsNGUKK3UxbGVuCit1bDRnaQordTRsMWc0Cit1bDJpCit1NWwyaTFhCit1bDNpbmcKK3VsNWlzMmgKK3VsNGwyYTJyCit1bDFsCit1bDRsaTRiCit1bGwyaQordWw0bGlzCis0dTJsM20KK3UxbDRvCis0dTJsMXMyCit1bHM1ZTRzCit1bDJzZQordWwxdGkKK3U0bHQKK3VsMXRyYTMKK3VsMXRyCis0dWwxdHUyCit1M2x1Cit1bDV1bAordWw1dgordTJtNWFiCit1MW1hCit1bTRiaQordTRtMWIKK3VtNGIxbHkKK3VtYjJsMgordTFtaQordTRtM2luZwordW1vcjVvCit1MW1vCit1bW8ycgordTRtMnAKK3VuMmF0NAordTFuYQordTJuZQordW40ZXIKK3UxbmkKK3VuNGltCit1Mm4xaW4KK3VuNWlzMmgKK3VuMmkzdgordTJuM3M0Cit1bjRzdzIKK3VuMnQzYTRiCit1bjF0Cit1bjF0YQordW40dGVyLgordW40dGVzCit1bnU0Cit1bjV5Cit1NG41egordTRvNHJzMgordTVvcwordTFvdTIKK3UxcGUKK3VwZTRyNXMyCit1NXAyaTNhCit1cDNpbmcKK3VwaTJuCit1M3AybDIKK3U0cDNwCit1cHBvcnQ1Cit1cDFwNG9yCit1cDJ0NWkyYgordTJwMXQKK3VwMXR1NAordTFyYQorNHVyYS4KK3U0cmFnCit1NHIyYXMKK3VyNGJlCit1cjFiCit1cjFjNAordXIxZAordXJlNWEydAordXI0ZmVyMQordXIxZgordXI0ZnIKK3UzcmlmCit1cmk0ZmljCit1cmkxZmkKK3VyMWluCit1M3IyaTFvCit1MXJpdAordXIzaXoKK3VyMmwKK3VybDVpbmcuCit1cjRubzQKK3Vyb3M0Cit1cjRwZQordXIxcAordXI0cGkKK3VyczVlcgordTRyczIKK3VyMnNlCit1cjV0ZXMKK3VyM3RoMmUKK3VyMXRpNAordXI0dDJpZTQKK3UzcnUKKzJ1cwordTVzYTJkCit1c2EyCit1NXNhMm4KK3VzNGFwCit1c2MyCit1czNjaQordXNlNWEKK3U1czJpMWEKK3Uzc2ljCit1czRsaW4KK3VzMWwyCit1czFwCit1czVzMWwyCit1MnNzCit1czV0ZXJlCit1czF0NHIKK3Uyc3UKK3VzdTJyNAordTJ0YTRiCit1MXRhCit1M3RhdAorNHU0dGUuCis0dXRlbAorNHV0ZW4KK3V0ZW40aQorNHUxdDJpCit1dGk1bDJpegordXRpbDFpCit1M3QyaW5lCit1MnQxaW4KK3V0M2luZwordXRpbzFuNWEKK3UxdDJpbwordXRpbzJuCit1NHRpcworNXU1dGl6Cit1NHQxbAordTJ0NW9mCit1MXRvCit1dG81ZwordXRvNW1hdDFpYwordXRvMm1hCit1NXRvMm4KK3U0dG91MgordTR0MXM0Cit1M3UKK3V1NG0KK3UxdjIKK3V4MXUzCit1Mno0ZQorMXZhCis1dmEuCisydjFhNGIKK3ZhYzVpbAordjRhMmNpCit2YWMzdQordmFnNAordmE0Z2UKK3ZhNWwyaTRlNAordmFsMWkKK3ZhbDVvCit2YWwxdQordmE1bW8KK3ZhNW5pegordmEybgordmE1cGkKK3ZhcjVpZWQKK3YyYTJyCit2YXIxaQordmFyMmllNAorM3ZhdAorNHZlLgorNHZlZAordmVnMwordjNlbC4KK3ZlbDNsMmkKK3ZlbDFsCit2ZTRsbwordjRlMWx5Cit2ZW4zb20KK3Y0ZW5vCit2NWVudWUKK3Y0ZXJkCis1djJlMnJlLgordjRlcmVsCit2M2VyZW4KK3ZlcjVlbmMKK3Y0ZXJlcwordmVyM2llNAordmVyMWkKK3Zlcm1pNG4KK3ZlcjNtNAorM3ZlcjJzZQordmU0cjFzMgordmVyM3RoCit2NGUycworNHZlcy4KK3ZlczR0ZQordmU0dGUKK3ZldDNlcgordmU0dHkKK3ZpNWFsMWkKK3YyaTFhCit2aTJhbAorNXZpMmEybgorNXZpMmRlLgordjJpZAorNXZpMmQxZWQKKzR2M2kxZGVuCis1dmlkZTRzMgorNXZpMmRpCit2M2lmCit2aTVnbgordjJpZwordjRpazQKKzJ2aWwKKzV2MmlsMWl0Cit2aWwxaQordjNpM2wyaXoKK3YxaW4KKzR2aTRuYQordjJpbmMKK3Y0aW41ZAorNHZpbmcKK3ZpMW8zbAordjJpbwordjNpbzRyCit2aTFvdTIKK3YyaTRwCit2aTVybwordjRpcgordmlzM2l0Cit2aTNzbwordmkzc3UKKzR2aTF0aQordml0M3IKKzR2aTF0eQorM3YyaXYKKzV2by4KK3ZvaTQKKzN2Mm9rCit2bzRsYQordjVvbGUKKzV2bzRsMnQKKzN2b2wydgordm9tNWkKK3ZvMnI1YWIKK3ZvMXJhCit2b3JpNAordm80cnkKK3ZvNHRhCis0dm8xdGVlCis0dnY0Cit2NHkKK3c1YWIybDIKKzJ3YWMKK3dhNWdlcgord2EyZzVvCit3YWl0NQord2FpMgordzVhbC4KK3dhbTQKK3dhcjR0Cit3MmEycgord2FzNHQKK3dhMXRlCit3YTV2ZXIKK3cxYgord2VhNXIyaWU0Cit3ZTJhMnIKK3dlYXIxaQord2U0YXRoMword2VhMnQKK3dlNGQ0bjQKK3dlZXQzCit3ZWU1dgord2VsNGwKK3cxZXIKK3dlc3QzCit3M2V2Cit3aGk0Cit3aTIKK3dpbDIKK3dpbDJsNWluNAord2lsMWwKK3dpbGwyaQord2luNGRlCit3NGluZAord2luNGcKK3c0aXI0CiszdzRpc2UKK3cyaXRoMword2l6NQordzRrCit3bDRlczIKK3dsM2luCit3NG5vCisxd28yCit3b20xCit3bzV2NGVuCit3NXAKK3dyYTQKK3dyaTQKK3dyaTF0YTQKK3czczJoCit3czRsMgord3M0cGUKK3c1czR0Cis0d3QKK3d5NAoreDFhCit4YWM1ZQoreDRhMmdvCit4YW0zCit4NGFwCit4YXM1Cit4M2MyCit4MWUKK3hlNGN1MXRvCit4ZTFjdQoreGUzYzR1dAoreDJlZAoreGVyNGkKK3gyZTVybworeDFoCit4aGkyCit4aDRpbDUKK3hodTQKK3gzaQoreDJpNWEKK3hpNWMKK3hpNWRpCit4MmlkCit4NGltZQoreGk1bTJpegoreGltMWkKK3gzbworeDRvYgoreDNwCit4cDRhbjRkCit4MXBhCit4cGEybgoreHBlYzF0bzUKK3hwZTJjCit4cGUyYzF0Cit4MnAyZTNkCit4MXQyCit4M3RpCit4MXUKK3h1M2EKK3h4NAoreTVhYworM3kyYTJyNAoreTVhdAoreTFiCit5MWMKK3kyY2UKK3ljNWVyCit5M2NoCit5Y2g0ZTIKK3ljb200Cit5MWNvCit5Y290NAoreTFkCit5NWVlCit5MWVyCit5NGVyMWYKK3llczQKK3llNHQKK3k1Z2kKKzR5M2gKK3kxaQoreTNsYQoreWxsYTViMmwyCit5bDFsCit5M2xvCit5NWx1Cit5bWJvbDUKK3k0bTFiCit5bWU0Cit5bTFwYTMKK3k0bTFwCit5bjNjNGhyNAoreW4yY2gKK3luNWQKK3luNWcKK3luNWljCis1eW54Cit5MW80Cit5bzVkCit5NG81ZworeW9tNAoreW81bmV0Cit5bzJuCit5NG8ybjNzMgoreTRvcworeTRwMmVkCit5cGVyNQoreXAzaQoreTNwbworeTRwbzRjCit5cDJ0YQoreTJwMXQKK3k1cHUKK3lyYTVtCit5cjVpM2EKK3kzcm8KK3lyNHI0Cit5czRjCit5M3MyZQoreXMzaTFjYQoreTFzM2lvCiszeTFzaXMKK3k0c28KK3kyc3M0Cit5czF0Cit5czN0YQoreXN1MnI0Cit5MXN1Cit5M3RoaW4KK3l0M2ljCit5MXcKK3phMQorejVhMmIKK3oyYTJyMgorNHpiCisyemUKK3plNG4KK3plNHAKK3oxZXIKK3oyZTNybworemV0NAorMnoxaQorejRpbAorejRpcworNXpsCis0em0KKzF6bworem80bQorem81b2wKK3pvbzIKK3p0ZTQKKzR6MXoyCit6NHp5CisuYXM5czhvOWM4aThhOHRlLgorLmFzMXNvCisuYXNzbzFjaQorLmFzc28zYzJpMWEKKy5hczlzOG85YzhpOGE4dDhlcy4KKy5kZThjOWw4aTluOGE5dDhpOG9uLgorLmRlMWM0bDQKKy5kZWNsNGkxbmEKKy5kZWNsaW4yYXQKKy5kZWNsaW5hMXQyaW8KKy5kZWNsaW5hdGlvMm4KKy5vYjhsOGk4ZzlhOXQ4bzhyeS4KKy5vYjJsMgorLm9ibDJpZworLm9ibGkxZ2EKKy5vYmxpZ2ExdG8KKy5vYmxpZ2F0bzFyeQorLnBoOGk4bDlhOG45dDhoOHI4bzhwOGljLgorLnBoNGlsMgorLnBoaTFsYQorLnBoaWxhMm4KKy5waGlsYW4xdAorLnBoaWxhbnQ0aHI0CisucGhpbGFudGhyb3AzaWMKKy5wcjhlOHM4ZThudC4KKy5wM3JlMXMyZQorLnByZXNlbjF0CisucHI4ZThzOGU4bjh0cy4KKy5wcmVzZW40dDRzMgorLnByOG84ajhlOGN0LgorLnBybzVqCisucHJvMWplCisucHJvamUyYzF0CisucHI4bzhqOGU4Yzh0cy4KKy5wcm9qZWM0dDFzMgorLnJlOGM5aTlwOHI4bzhjOWk5dDh5LgorLnJlMWMyaQorLnJlYzJpcAorLnJlY2lwcjIKKy5yZWNpcHIyb2MKKy5yZTFjaXBybzFjaQorLnJlY2lwcm8yYzFpdAorLnJlY2lwcm9jaTF0eQorLnJlOWM4bzhnOW44aTl6OGE4bjhjZS4KKy5yZTFjbworLnJlMmNvZworLnJlYzNvZ25pegorLnJlY29nMW5pCisucmVjb2duaXphMQorLnJlY29nbml6YTJuCisucmU4ZjlvOHI5bThhOXQ4aThvbi4KKy5yZTFmCisucmUxZm8KKy5yZWZvMnIKKy5yZWZvcjFtCisucmVmb3IxbWEKKy5yZWZvcm1hMXQyaW8KKy5yZWZvcm1hdGlvMm4KKy5yZTh0OXI4aTliOHU5dDhpOG9uLgorLnJlM3RyaQorLnJldHI0aWIKKy5yZXRyaTNidTF0MmlvCisucmV0cmliNHUxdDJpCisucmV0cmlidXRpbzJuCisudGE5YjhsZS4KKy4ydGFiCisudGFiMmwyCisuYWM4YThkOWU5bTh5LgorLmExY2EKKy5hY2EyZAorLmFjYWQ0ZW0KKy5hY2FkZTNteQorLmFjOGE4ZDllOW04aThlOHMuCisuYWNhZGVtMmk0ZTQKKy5hYzljOHU5czhhOXQ4aTh2OGUuCisuYWMzYworLmFjMWMydXMKKy5hY2N1c2EyCisuYWNjdXNhMXQyaXYKKy5hYzhyOG85bjh5OG0uCisuYWNybzJuCisuYWNyb255bTQKKy5hYzhyOHk4bDlhOG04aThkOGUuCisuYWNyeTNsYQorLmFjcnlsYW0yaWQKKy5hYzhyOHk4bDlhOG04aThkOGU4cy4KKy5hY3J5bGFtaWRlNHMyCisuYWM4cjh5OGw5YThsOGQ4ZTloOHk4ZDhlLgorLmFjcnlsYTJsZAorLmFjcnlsYWwyZGUKKy5hY3J5bGFsZGUxaDQKKy5hY3J5bGFsZGVoeTFkCisuYWQ4ZDlhOWI4bDhlLgorLmFkMWQyYQorLmFkMmQzYTRiCisuYWRkYWIybDIKKy5hZDhkOWk5YjhsOGUuCisuYWRkaTFiMmwyCisuYWQ4cjhlOG45YTlsOGk4bjhlLgorLmExZHIKKy5hZHJlNAorLmE1ZHJlbgorLmFkcmUxbmEKKy5hZHJlbmE0bDFpCisuYWRyZW5hMWw0aW5lCisuYWU4cjhvOXM4cDhhOGM4ZS4KKy5hZTRyCisuYTJlcm8KKy5hZXJvMnM0cGEKKy5hZXJvc3BhNGNlCisuYWY5dDhlOHI5dDhoOG84dThnOGg4dC4KKy5hZnRlcnRob3UyCisuYWY5dDhlOHI5dDhoOG84dThnOGg4dDhzLgorLmFmdGVydGhvdWdoNHQxczIKKy5hZzhyOG84bjlvOW04aThzOHQuCisuYTFncgorLmFnNHJvCisuYWdybzJuCisuYWdyb25vbTJpcworLmFnOHI4bzhuOW85bThpOHM4dDhzLgorLmFncm9ub21pczR0MXMyCisuYWw5ZzhlOWI4cjhhOWk5YzhhOGw5bDh5LgorLmE0bDFnNAorLmFsZzJlMWIKKy5hbGdlM2JyCisuYWxnZWJyMmFpMgorLmFsZ2VicmFpMWNhCisuYWxnZWJyYWljYWwxbAorLmFsZ2VicmFpY2FsMWx5CisuYW05cDhoOGU4dDlhOW04aThuOGUuCisuYTRtMXAKKy5hbXBoZTR0CisuYW1waGUxdGEKKy5hbXBoZXRhbTFpbgorLmFtcGhldGFtMmluZQorLmFtOXA4aDhlOHQ5YTltOGk4bjhlOHMuCisuYW1waGV0YW1pMW5lcworLmFuOWE5bDh5OHM4ZS4KKy4zYW5hMWx5CisuYTFuYQorLmFuNGEybHlzNAorLmFuYWw1eTNzMmUKKy5hbjlhOWw4eThzOGU4ZC4KKy5hbmFseTRzNGVkCisuYW44YThsOHk5czhlOHMuCisuYW5hbHlzMWU0cworLmFuOWk4czhvOXQ4cjhvOHA5aThjLgorLmFuaTJzbworLmFuaXNvdHJvcDNpYworLmFuOWk4czhvOXQ4cjhvOHA5aTljOGE4bDlsOHkuCisuYW5pc290cm9waTFjYQorLmFuaXNvdHJvcGljYWwxbAorLmFuaXNvdHJvcGljYWwxbHkKKy5hbjlpOHM4bzh0OXI4bzlwOGk4czhtLgorLmFuaXNvdHJvcGkyczFtCisuYW45aThzOG84dDlyOG84cDh5LgorLmFuaXNvdHJvcHk1CisuYW44bzhtOWE4bDh5LgorLmFubzQKKy5hbm9tYTVsCisuYW5vMW1hCisuYW5vbWExbHkKKy5hbjhvOG05YThsOGk4ZThzLgorLmFub21hbDFpCisuYW5vbWFsMmk0ZTQKKy5hbjh0OGk5ZDhlOHI4aTh2OWE5dDhpOHY4ZS4KKy5hbnQyaWQKKy5hbnRpZGVyMWkKKy5hbnRpZGVyMmk0dgorLmFudGlkZTRyaTF2YQorLmFudGlkZXJpM3ZhdAorLmFudGlkZXIyaXZhMXQyaXYKKy5hbjh0OGk5ZDhlOHI4aTh2OWE5dDhpOHY4ZThzLgorLmFudGlkZXJpdmF0aXY0ZTJzCisuYW44dDhpOWg4bzhsOG85bThvOHI5cDhoOGk4Yy4KKy5hbnRpM2gKKy5hbnRpaG9sbzFtbworLmFudGlob2xvbW8ycgorLmFudGlob2xvbW9yMXAKKy5hbnRpaG9sb21vcnA0aDQKKy5hbnRpaG9sb21vcnBoMWljCisuYW45dDhpOG45bzltOHkuCisuYW4ydDFpbgorLmFudDJpMW5vCisuYW50aW5vM215CisuYW45dDhpOG45bzltOGk4ZThzLgorLmFudGlub20yaWU0CisuYW45dDhpOW44dTljOGw4ZThhOHIuCisuYW50aW4xdQorLmFudGludWNsZTMKKy5hbnRpbnUxYzRsNAorLmFudGludWNsZTJhCisuYW50aW51Y2xlMmEycgorLmFuOXQ4aTluOHU5YzhsOGU5bzhuLgorLmFudGludWNsZW8ybgorLmFuOXQ4aTlyOGU4djlvOWw4dTl0OGk4bzhuOWE4cjh5LgorLmFudDRpcgorLmFudGlyZXYyCisuYW50aXJldjVvbHUKKy5hbnRpcmV2bzFsdXQKKy5hbnRpcmV2b2w0dTF0MmkKKy5hbnRpcmV2b2x1dGlvMW41YQorLmFudGlyZXZvbHUxdDJpbworLmFudGlyZXZvbHV0aW8ybgorLmFudGlyZXZvbHV0aW9uMmEycgorLmFwOG84dDhoOWU5bzlzOGU4cy4KKy5hcDRvdAorLmFwNG90aAorLmFwb3RoMmUKKy5hcG90aGVvczQKKy5hcG90aGVvczFlNHMKKy5hcDhvOHQ4aDllOW85czhpOHMuCisuYXBvdGhlbzFzaXMKKy5hcDlwOGU4bjlkOGk4eC4KKy5hNHAxcAorLmFwMnBlCisuYXAzcGVuCisuYXI5YzhoOGk5bThlOWQ4ZThhOG4uCisuYXIxYworLmFyMmNoCisuYXJjaGkybWVkCisuYXJjaGltZWRlYTJuCisuYXI5YzhoOGk5cDhlOGw5YThnOG8uCisuYXJjaDJpNHAKKy5hcmNoaXBlNAorLmFyY2hpcGU0bGEKKy5hcmNoaXBlbGEyZ28KKy5hcjljOGg4aTlwOGU4bDlhOWc4bzhzLgorLmFyOWM4aDhpOHY4ZS4KKy5hcmNoMmkydgorLmFyOWM4aDhpOHY4ZThzLgorLmFyY2hpdjRlMnMKKy5hcjljOGg4aTh2OWk4bjhnLgorLmFyY2hpdjFpbgorLmFyY2hpNHZpbmcKKy5hcjljOGg4aTh2OWk4czh0LgorLmFyOWM4aDhpOHY5aThzOHQ4cy4KKy5hcmNoaXZpczR0MXMyCisuYXI5YzhoOGU5dDh5OHA5YThsLgorLmFyY2hlMgorLmFyY2hlNHQKKy5hcmNoZTF0eQorLmFyY2hldHkxcGEKKy5hcmNoZXR5cDRhbAorLmFyOWM4aDhlOXQ4eThwOWk5YzhhOGwuCisuYXJjaGV0eXAzaQorLmFyY2hldHlwaTFjYQorLmFyOGM5dDhhOG45ZzhlOG44dC4KKy5hcjJjMXQKKy5hcmN0NWFuZworLmFyYzF0YQorLmFyY3RhMm4KKy5hcmN0YW4xZ2VuCisuYXJjdGFuZ2VuMXQKKy5hcjhjOXQ4YThuOWc4ZThuOHQ4cy4KKy5hcmN0YW5nZW40dDRzMgorLmFzOXM4aThnOG45YTliOGw4ZS4KKy5hczFzaQorLmFzNHNpZzFuNGEKKy5hc3MyaWcKKy5hc3NpZzJuMWEyYgorLmFzc2lnbmFiMmwyCisuYXM5czhpOGc4bjlvOHIuCisuYXNzaWcxbm8KKy5hczlzOGk4ZzhuOW84cjhzLgorLmFzc2lnbm80cnMyCisuYXM5czhpOHM4dDlhOG44dDlzOGg4aThwLgorLmFzMXNpcworLmFzc2lzMXRhCisuYXNzaXN0YTJuCisuYXNzaXN0YW4xdAorLmFzc2lzdGFuNHQ0czIKKy5hc3Npc3RhbnRzMmg0CisuYXNzaXN0YW50M3NoMmk0cAorLmFzOXM4aThzOHQ5YThuOHQ5czhoOGk4cDhzLgorLmFzc2lzdGFudHNoaTJwMXMyCisuYXM4eThtOHA5dDhvOW04YTh0OGk4Yy4KKy5hczR5CisuYXN5NG0xcAorLmFzeW0ycDF0CisuYXN5bXAxdG8KKy5hc3ltcHRvMm1hCisuYXN5bXB0b21hdDFpYworLmFzOXk4bThwOXQ4bzh0OWk4Yy4KKy5hczh5OG45YzhoOHI4bzluOG84dThzLgorLmFzeW4zYzRocjQKKy5hc3luMmNoCisuYXN5bmNocm8ybgorLmFzeW5jaHJvMW5vdTIKKy5hc3luY2hyb25vMnVzCisuYXQ4aDllOHI5bzlzOGM4bDhlOXI4bzlzOGk4cy4KKy40YXRoCisuYXRoMmUKKy5hdGgyZXJvCisuYXRoZXJvczJjCisuYXRoZXJvc2NsZTUKKy5hdGhlcm9zMWM0bDQKKy5hdGgyZXJvc2NsNGVybworLmF0aGVyb3NjbGVybzFzaXMKKy5hdDltOG84czlwOGg4ZThyOGUuCisuYTR0MW0KKy5hdDFtbworLmF0bW9zMgorLmF0bW8zc3AKKy5hdG1vczJwaGUKKy5hdG1vM3NwaDRlcgorLmF0OW04bzhzOXA4aDhlOHI4ZThzLgorLmF0OXQ4cjhpOGI5dTh0OGU4ZC4KKy5hNHQzdDIKKy5hdHRyNGliCisuYXR0cmlidTJ0MWVkCisuYXQ5dDhyOGk4Yjl1OHQ5YThiOGw4ZS4KKy5hdHRyaTRidTF0YQorLmF0dHJpYnUydGE0YgorLmF0dHJpYnV0YWIybDIKKy5hdTl0OG85bThhOXQ4aThvOG4uCisuYXUxdG8KKy5hdXRvMm1hCisuYXV0b21hMXQyaW8KKy5hdXRvbWF0aW8ybgorLmF1OXQ4bzhtOWE5dDhvOG4uCisuYXV0b21hMXRvCisuYXV0b21hdG8ybgorLmF1OXQ4bzhtOWE5dDhhLgorLmF1dG9tYTJ0YQorLmF1OXQ4bzluOHU4bTliOGU4cjlpOG44Zy4KKy5hdTV0bzJuCisuYXV0b241dW0KKy5hdXRvbnU0bTFiCisuYXV0b251bWJlcjFpCisuYXV0b251bWJlcmluNGcKKy5hdTl0OG84bjlvOW04bzh1OHMuCisuYXU0dG9ubworLmF1dG9ubzRtbworLmF1dG9ubzNtbzJ1cworLmF1dG9ub21vdTIKKy5hdTh0OG85cjhvOHU4bjhkOWk4bjhnLgorLmF1dG9yb3UyCisuYXV0b3JvdW4yZAorLmF1dG9yb3VuZDFpbgorLmF2OW84aThyOWQ4dTlwOG84aThzLgorLmF2b2k0CisuYXZvNGlyCisuYXZvaXIxZHUKKy5hdm9pcjRkdXAKKy5hdm9pcmR1cG9pMgorLmJhOG44ZDlsOGU4YThkOGU4ci4KKy5iNGFuZAorLmJhbjFkbAorLmJhbmRsZTJhCisuYmFuZGxlYTJkMQorLmJhOG44ZDlsOGU4YThkOGU4cjhzLgorLmJhbmRsZWFkZTRyNXMyCisuYmE4bjhrOXI4dThwOHQuCisuYmE0bmsyCisuYmFua3J1MnAxdAorLmJhOG44azlyOHU4cDh0OWM4eS4KKy5iYW5rcnVwNHRjCisuYmFua3J1cHQxY3kKKy5iYThuOGs5cjh1OHA4dDljOGk4ZThzLgorLmJhbmtydXB0MWNpCisuYmFua3J1cHRjMmllNAorLmJhOHI5bzhuOGk4ZThzLgorLmIyYTJyCisuYmE1cm9uaQorLmJhcm8ybgorLmJhcm9uMmllNAorLmJhOHM4ZTlsOGk4bjhlOXM4azhpOHAuCisuYmFzZWwyaQorLmJhc2UxbDRpbmUKKy5iYXNlbGkxbmVzCisuYmFzZWxpbmVzazIKKy5iYXNlbGluZXNrMWkKKy5iYXNlbGluZXNrMmk0cAorLmJhOXQ4aDh5OG05ZTl0OHI4eS4KKy4xYmF0CisuYjRhdGgKKy5iYXRoeW1lNAorLmJhdGh5bTRldHIKKy5iYXRoeW1lM3RyeQorLmJhOHQ4aDh5OXM4YzhhOHA4aDhlLgorLmJhdGh5MnMKKy5iYXRoeXM0YworLmJhdGh5c2NhNHAKKy5iYXRoeXMxY2EKKy5iZThhOG45aThlOHMuCisuYmVhMm4KKy5iZWEzbmllcworLmJlYW4yaWU0CisuYmU5aDhhOHY5aThvOHU4ci4KKy5iZTFoNAorLmJlaGF2MWkKKy5iZWhhdmkxb3UyCisuYmVoYXYyaW8KKy5iZWhhdmk0b3VyCisuYmU5aDhhOHY5aThvOHU4cjhzLgorLmJlaGF2aW91NHJzMgorLmJlOHY4aThlOHMuCisuYmUxdmkKKy5iZXYyaWU0CisuYmk4YjlsOGk5bzhnOXI4YTlwOGg4eTlzOHQ4eThsOGUuCisuYmkyYgorLmJpMWIybDIKKy5iaWIzbGkKKy5iaWJsaTVvZworLmJpYmwyaW8KKy5iaWJsaW8yZ3IKKy5iaWJsaW80ZzNyYTFwaHkKKy5iaWJsaW9ncmFwaHkycworLmJpYmxpb2dyYXBoeXMxdAorLmJpYmxpb2dyYXBoeXMydHkKKy5iaWJsaW9ncmFwaHlzMnR5bAorLmJpOWQ4aThmOWY4ZThyOWU4bjl0OGk4YThsLgorLmIyaTRkCisuYmkyZGkKKy5iaWQxaWYKKy5iaWRpNGYxZgorLmJpZGlmZmVyMQorLmJpZGlmZmVyM2VuMXQKKy5iaWRpZmZlcmVudDJpCisuYmlkaWZmZXJlbjF0MmkxYQorLmJpZGlmZmVyZW50aTJhbAorLmJpOGc5ZzhlOHM4dC4KKy5iMmlnCisuYmk0ZzFnMgorLmJpZzJnZQorLmJpOGw4bDlhOGI4bDhlLgorLjFiaWwKKy5iaWxsNWFiCisuYmlsMWwKKy5iaWxsYWIybDIKKy5iaThvOW04YTh0OGg5ZTltOGE4dDlpOGM4cy4KKy5iMmlvCisuYmlvNG0KKy5iaW8xbWEKKy5iaW9tNGF0aDMKKy5iaW9tYXRoNWVtCisuYmlvbWF0aDJlCisuYmlvbWF0aGUxbWEKKy5iaW9tYXRoZW1hdDFpYworLmJpb21hdGhlbWF0aTRjM3MyCisuYmk4bzltOGU4ZDlpOWM4YThsLgorLmJpbzJtZQorLmJpbzJtZWQKKy5iaW9tNGVkaQorLmJpb21lZDNpMWNhCisuYmk4bzltOGU4ZDlpOWM4aThuOGUuCisuYmlvbWVkMmkxY2kKKy5iaW9tZWRpMmNpbgorLmJpb21lZGljMmluZQorLmJpOG85cjhoOHk4dDhoOG04cy4KKy5iaW9yaDQKKy5iaW9yaHl0NGgxbQorLmJpb3JoeXRoNG0xczIKKy5iaTh0OW04YThwLgorLmJpMnQKKy5iaTR0MW0KKy5iaXQxbWEKKy5iaXQ0bWFwCisuYmk4dDltOGE4cDhzLgorLmJpdG1hMnAxczIKKy5ibDhhOG44ZDllOHIuCisuYjJsMgorLmIzbDRhbmQKKy5ibGEybgorLmJsYW4xZGUKKy5ibDhhOG44ZDllOHM4dC4KKy5ibGFuZGU0czIKKy5ibDhpOG44ZDllOHIuCisuYmw0aW5kCisuYmxpbjFkZQorLmJsOG84bjhkOGU4cy4KKy5iNGxvCisuYmxvMm4KKy5ibDJvbmQKKy5ibG9uMWRlCisuYmxvbmRlczIKKy5ibDh1OGU5cDhyOGk4bjh0LgorLmJsdWVwcjIKKy5ibHVlcHJpbjR0MworLmJsOHU4ZTlwOHI4aThuOHQ4cy4KKy5ibHVlcHJpbjR0NHMyCisuYm85bDhvOG05ZTl0OGU4ci4KKy5ib2xvMm1lCisuYm9sbzRtZXQKKy5ib2xvbWUxdGUKKy5ibzhvOGs5czhlOGw4bDllOHIuCisuM2JvbzIKKy5ibzJvNGsKKy5ib280azFzMgorLmJvb2tzZWwxbAorLmJvb2tzZWwybGUKKy5ibzhvOGs5czhlOGw4bDllOHI4cy4KKy5ib29rc2VsbGU0cjFzMgorLmJvOG84bDllOGE4bi4KKy5ib29sZTJhCisuYm9vbGVhMm4KKy5ibzhvOGw5ZThhOG44cy4KKy5ib29sZWEybjFzMgorLmJvOHI5bjhvOWw4bzhnOWk5YzhhOGwuCisuYm9ybm80CisuYm9ybm8zbG9nMWljCisuYm9ybm9sb2dpMWNhCisuYm84dDl1OWw4aThzOG0uCisuYm8xdHUKKy5ib3R1bDJpCisuYm90dWxpMnMxbQorLmJyOHU4czhxOHU4ZThyLgorLmJyMnVzCisuYnJ1c3F1MgorLmJydXMzcXVlcgorLmJ1OGY5ZjhlOHIuCisuYnVmNGZlcjEKKy5idTRmMWYKKy5idThmOWY4ZThyOHMuCisuYnVmZmU0cjFzMgorLmJ1OHM4aThlOHIuCisuYnVzNWllNAorLmIydXMKKy5idThzOGk4ZThzOHQuCisuYnVzaTFlc3QKKy5idThzOHM4aThuOGcuCisuYnUyc3MKKy5idXMxc2kKKy5idXMyczFpbgorLmJ1c3MzaW5nCisuYnU4dDh0OGU4ZC4KKy5idXQydDFlZAorLmJ1OHo4ejl3OG84cjhkLgorLmJ1NHoxejIKKy5idXp6MXdvMgorLmJ1OHo4ejl3OG84cjhkOHMuCisuYnV6endvcjJkMXMyCisuY2E5YzhvOHA4aDlvOW44eS4KKy5jYTFjbworLmNhYzJvcGgKKy5jYWNvcGhvNW55CisuY2Fjb3BobzJuCisuY2E5YzhvOHA4aDlvOW44aThlOHMuCisuY2FjbzVwaG9uaQorLmNhY29waG9uMmllNAorLmNhOGw4bDllOHIuCisuY2FsMWwKKy5jYWwybGUKKy5jYThsOGw5ZThyOHMuCisuY2FsbGU0cjFzMgorLmNhOG05ZThyOGE5bThlOG4uCisuY2FtNWVyMWEKKy5jYW1lcmExbWVuCisuY2E4cjh0OXc4aDhlOGU4bC4KKy5jYXJ0dzQKKy5jYThyOHQ5dzhoOGU4ZThsOHMuCisuY2FydHdoZWUybDFzMgorLmNhOXQ4YThyOHI4aDhzLgorLmNhMnRhCisuY2F0MmEycgorLmNhdGFyMXI0CisuY2F0YXJyaDQKKy5jYXRhcnI0aDFzMgorLmNhOHQ5YTlzOHQ4cjhvOHA4aDlpOGMuCisuY2F0YXMxdDRyCisuY2F0YXN0cjJvcGgKKy5jYXRhc3Ryb3BoMWljCisuY2E4dDlhOXM4dDhyOG84cDhoOWk5YzhhOGw4bDh5LgorLmNhdGFzdHJvcGhpMWNhCisuY2F0YXN0cm9waGljYWwxbAorLmNhdGFzdHJvcGhpY2FsMWx5CisuY2E4dDllOW44bzhpOGQuCisuY2F0NGVubworLmNhdGVub2kyCisuY2F0ZW5vMmlkCisuY2E4dDllOW44bzhpOGQ4cy4KKy5jYXRlbm9pMmQxczIKKy5jYTh1OWw4aTlmOGw4bzh3OWU4ci4KKy5jYXU0bDIKKy5jYXVsMmkKKy5jYXVsaTRmNGwyCisuY2F1bGlmbG93MWVyCisuY2g4YThwOWE4cjlyOGE4bC4KKy5jaGFwMmEycjQKKy5jaGExcGEKKy5jaGFwYXIxcjQKKy5jaDhhOHI5dDhyOGU4dThzOGUuCisuY2gyYTJyCisuY2hhcnRyNGV1MgorLmNoYXJ0cmUydXM0CisuY2g4ZThtOG85dDhoOGU4cjlhOHA4eS4KKy5jaGUyCisuY2hlMW1vCisuY2hlbTRvdGgzCisuY2hlbW90aDJlCisuY2hlbW90aDRlcjFhCisuY2hlbW90aGVyYTNwCisuY2g4ZThtOG85dDhoOGU4cjlhOXA4aThlOHMuCisuY2hlbW90aGVyYXAyaWU0CisuY2g4bDhvOHI4bzltOGU4dDhoOWE4bjhlLgorLmM0aDFsNAorLmNoMmxvCisuY2hsb3JvMm1lCisuY2hsb3JvNG1ldAorLmNobG9yb21ldGhhMm40CisuY2g4bDhvOHI4bzltOGU4dDhoOWE4bjhlOHMuCisuY2hsb3JvbWV0aGExbmVzCisuY2g4bzlsOGU4czl0OGU4cjhpOGMuCisuM2NobzIKKy5jM2hvbDRlCisuY2hvbGVzMgorLmNob2xlczF0ZXIxaQorLmNpOGc5YTlyOGU4dDh0OGUuCisuYzJpZworLmNpMWdhCisuY2lnMmEycgorLmNpZ2FyZTR0M3QyCisuY2k4ZzlhOXI4ZTh0OHQ4ZThzLgorLmNpZ2FyZXQ0dGVzCisuY2k4bjhxOHU4ZTlmOG84aThsLgorLjJjaW4KKy5jaW4xcQorLmNpbnF1MgorLmNpbnF1ZTFmCisuY2lucXVlMWZvCisuY2lucXVlZm9pMgorLmNvOWE4czhzOG85YzhpOGE5dDhpOHY4ZS4KKy5jNG9hCisuY29hMnNzCisuY29hczFzbworLmNvYXNzbzFjaQorLmNvYXNzbzNjMmkxYQorLmNvYXNzb2NpNGExdDJpdgorLmNvOWc4bjhhOGMuCisuMmNvZworLmNvZzFuNGEKKy5jbzlnOG44YThjOHMuCisuY29nbmE0YzNzMgorLmNvOWs4ZThyOW44ZThsLgorLmMyb2sKKy5jb2sxZXIKKy5jb2tlcjNuZWwKKy5jbzlrOGU4cjluOGU4bDhzLgorLmNva2VybmUybDFzMgorLmNvOGw5bDhpOG45ZThhOXQ4aThvOG4uCisuY29sMWwKKy5jb2xsMmkKKy5jb2wybGluNAorLmNvbDFsNGluZQorLmNvbGxpbjNlYQorLmNvbGxpbmVhMnQKKy5jb2xsaW5lYTF0MmlvCisuY29sbGluZWF0aW8ybgorLmNvOGw5dThtOG44cy4KKy5jb2x1NG0xbgorLmNvbHVtMm4xczIKKy5jbzhtOXA4YThyOWE4bjhkLgorLmNvNG0xcAorLmNvbXBhcmE1CisuY29tMXBhCisuY29tcDJhMnIKKy5jb21wYXJhMm4KKy5jb21wYXI0YW5kCisuY284bTlwOGE4cjlhOG44ZDhzLgorLmNvbXBhcmFuMmQxczIKKy5jbzhtOXA4ZThuOWQ4aTh1OG0uCisuY29tcGVuZGkxdQorLmNvOG05cDhvOW44ZThuOHQ5dzhpOHM4ZS4KKy5jb21wbzJuCisuY29tcG8zbmVuCisuY29tcG9uZW4xdAorLmNvbXBvbmVudHc0CisuY29tcG9uZW50d2lzNAorLmNvbXBvbmVudHdpMgorLmNvbXBvbmVudDN3NGlzZQorLmNvOG04cDl0OHI4bzhsOWw4ZThyLgorLmNvbXA0dHIKKy5jb20ycDF0CisuY29tcHRyb2wxbAorLmNvbXB0cm9sMmxlCisuY284bThwOXQ4cjhvOGw5bDhlOHI4cy4KKy5jb21wdHJvbGxlNHIxczIKKy5jbzhuOWY4bzhyOG05YThiOGw4ZS4KKy5jbzJuCisuY29uM2YKKy5jb24xZm8KKy5jb25mbzJyCisuY29uZm9yMW0KKy5jb25mb3IxbWEKKy5jb25mb3IybWFiCisuY29uZm9ybWFiMmwyCisuY284bjlmOG84cjhtOWk4czh0LgorLmNvbmZvcjJtaQorLmNvbmZvcm0yaXMKKy5jbzhuOWY4bzhyOG05aThzOHQ4cy4KKy5jb25mb3JtaXM0dDFzMgorLmNvOG45ZjhvOHI4bTlpOHQ4eS4KKy5jb25mb3IzbWl0CisuY29uZm9ybWkxdHkKKy5jbzhuOWc4cjhlOHM4cy4KKy5jb24zZworLmNvbjFncgorLmNvbmdyMmUyc3MKKy5jbzhuOWc4cjhlOHM4czhlOHMuCisuY29uZ3Jlc3MxZTRzCisuY284bjl0OHI4aThiOXU4dDhlLgorLmNvbjV0CisuY29udHI0aWIKKy5jbzhuOXQ4cjhpOGI5dTh0OGU4cy4KKy5jbzhuOXQ4cjhpOGI5dTh0OGU4ZC4KKy5jb250cmlidTJ0MWVkCisuY285cjhlOWw4YTl0OGk4bzhuLgorLmNvcmUxbGEKKy5jb3JlbGExdDJpbworLmNvcmVsYXRpbzJuCisuY285cjhlOWw4YTl0OGk4bzhuOHMuCisuY29yZWxhdGlvMm4zczIKKy5jbzlyOGU5bDhpOWc4aThvOG45aThzOHQuCisuY29yZTFsMmkKKy5jb3JlbDJpZworLmNvcmVsNGlnaQorLmNvcmVsaTVnMmlvCisuY29yZWxpZ2lvbjNpCisuY29yZWxpZ2lvMm4KKy5jb3JlbGlnaW9uMWlzCisuY285cjhlOWw4aTlnOGk4bzhuOWk4czh0OHMuCisuY29yZWxpZ2lvbmlzNHQxczIKKy5jbzlyOGU5bzhwOXM4aThzLgorLmNvcmUxbworLmNvcmVvMnAxczIKKy5jb3Jlb3Axc2lzCisuY285cjhlOXM4cDhvOG45ZDhlOG44dC4KKy5jb3JlMXNwCisuY29yZXM0cG8ybgorLmNvcmVzcDJvbmQKKy5jb3Jlc3BvbjFkZQorLmNvcmVzcG9uMWRlbgorLmNvcmVzcG9uZGVuMXQKKy5jbzlyOGU5czhwOG84bjlkOGU4bjh0OHMuCisuY29yZXNwb25kZW40dDRzMgorLmNvOXM4ZTljOGE4bjh0LgorLmNvczRlCisuY29zZTFjYQorLmNvc2VjYTJuCisuY29zZWNhbjF0CisuY285dDhhOG45ZzhlOG44dC4KKy5jbzR0YTJuCisuY28xdGEKKy5jb3QyYW5nCisuY290YW4xZ2VuCisuY290YW5nZW4xdAorLmNvOHU4cjlzOGU4cy4KKy5jb3UyCisuY291NHJzMgorLmNvdXIyc2UKKy5jb3VyczNlNHMKKy5jbzl3OG84cjhrOWU4ci4KKy5jbzR3bzIKKy5jb3dvcmsxZXIKKy5jbzl3OG84cjhrOWU4cjhzLgorLmNvd29ya2U0cjFzMgorLmNyOGE4bjhrOWM4YThzOGUuCisuY3JhMm4KKy5jcmE0bmsyCisuY3JhbmsxY2EKKy5jcjhhOG44azlzOGg4YThmOHQuCisuY3JhbjRrMXMyCisuY3JhbmtzMmgKKy5jcmFua3NoYTJmCisuY3JhbmtzaGEyZnQKKy5jcjhvOGM5bzlkOGk4bDhlLgorLmNyMm9jCisuY3JvNGNvZAorLmNybzFjbworLmNyOG84YzlvOWQ4aThsOGU4cy4KKy5jcm9jb2RpbGVzMgorLmNyOG84czhzOWg4YTh0OGM4aC4KKy5jcm8yczRzCisuY3Jvc3MyaAorLmNyb3NzaGE0dGMKKy5jcm9zc2hhdDRjaAorLmNyOG84czhzOWg4YTh0OGM4aDhlOGQuCisuY3Jvc3NoYXRjaGUyCisuY3Jvc3NoYXQ0Y2g0ZWQKKy5jcjhvOHM4czlvOHY4ZThyLgorLmNyb3Mxc28KKy5jcm9zNHNvdgorLmNyOHk4cDl0OG85ZzhyOGE4bS4KKy5jcnkycDF0CisuY3J5cDF0bworLmNyeXB0bzJncgorLmNyOHk4cDl0OG85ZzhyOGE4bThzLgorLmNyeXB0b2dyYTRtMXMyCisuY3U4ZjhmOWw4aThuOGsuCisuYzR1ZgorLmN1NGYxZgorLmN1ZmY0bDIKKy5jdWZmbGluNAorLmN1ZmZsNGk0bmsyCisuY3U4ZjhmOWw4aThuOGs4cy4KKy5jdWZmbGluNGsxczIKKy5jdTluOGU4aTlmOG84cjhtLgorLjNjdW4KKy5jdTJuZQorLmN1bmVpMgorLmN1bmVpMWZvCisuY3VuZWlmbzJyCisuY3VuZWlmb3IxbQorLmN1OHM5dDhvOG05aTh6OWE5YjhsOGUuCisuMWMydXMKKy5jdXMxdG8KKy5jdXN0b20yaXoKKy5jdXN0b21pemExCisuY3VzdG9taXo1YTJiCisuY3VzdG9taXphYjJsMgorLmN1OHM5dDhvOG05aTh6OGUuCisuY3VzdG9taTJ6ZQorLmN1OHM5dDhvOG05aTh6OGU4cy4KKy5jdThzOXQ4bzhtOWk4ejhlOGQuCisuZGE4YzhoOHM5aDh1OG44ZC4KKy4xZDJhCisuZGEyY2g0CisuZGFjNGgxczIKKy5kYWNoNHMyaAorLmRhOG05czhlOGw5ZjhsOHkuCisuZGEybTIKKy5kYTRtMXMyCisuZGFtNXNlMmwyZgorLmRhbXNlbGY0bDIKKy5kYW1zZWxmMmx5NQorLmRhOG05czhlOGw5ZjhsOGk4ZThzLgorLmRhbXNlbGZsMmllNAorLmRhOGM4dDh5OGw5bzlnOHI4YThtLgorLmRhMmMxdAorLmRhYzF0eQorLmRhYzJ0eWwKKy5kYWN0eTNsbworLmRhY3R5bG8xZ3IKKy5kYThjOHQ4eThsOW85ZzhyOGE4cDhoLgorLmRhOHQ4YTliOGE4czhlLgorLjNkYXQKKy5kYTJ0YQorLmRhMnRhYgorLmRhOHQ4YTliOGE4czhlOHMuCisuZGF0YWJhczFlNHMKKy5kYTh0OGE5cDhhOHQ4aC4KKy5kYXQ1YXAKKy5kYXRhcDVhdAorLmRhdGExcGEKKy5kYXRhcDRhdGgKKy5kYTh0OGE5cDhhOHQ4aDhzLgorLmRhdGFwYTJ0NGgxczIKKy5kYTh0OGU5czh0OGE4bThwLgorLmRhdDNlc3QKKy5kYXRlczF0YQorLmRhdGVzdGE0bTFwCisuZGE4dDhlOXM4dDhhOG04cDhzLgorLmRhdGVzdGFtMnAxczIKKy5kZTljOGw4YThyOWE4YjhsOGUuCisuZGU0Y2wyYTJyCisuZGVjbGEycmFiCisuZGVjbGFyYWIybDIKKy5kZTlmOGk4bjlpOXQ4aTh2OGUuCisuZGUxZgorLmRlMWZpCisuZGUyZmluCisuZGVmMmluaQorLmRlZmluMml0CisuZGVmaW5pMXRpCisuZGVmaW5pMXQyaXYKKy5kZTlsOGU4Yzl0OGE5YjhsOGUuCisuZDVlbGVjCisuZGVsZTJjMXQKKy5kZWxlYzJ0YTRiCisuZGVsZWMxdGEKKy5kZWxlY3RhYjJsMgorLmRlOG04aTlzOGU4bThpOXE4dThhOXY4ZThyLgorLmRlNG0yaXMKKy5kZW00aXNlCisuZGVtaXNlbWkzcXVhCisuZGVtaXNlbWlxdTIKKy5kZW1pc2VtaXF1YTV2NAorLmRlOG04aTlzOGU4bThpOXE4dThhOXY4ZThyOHMuCisuZGVtaXNlbWlxdWF2ZTRyMXMyCisuZGU5bThvOGM5cjhhOXQ4aThzOG0uCisuZGU0bW9jcgorLmRlbW9jcmF0aTJzNG0KKy5kZThtOG84cy4KKy5kZW1vczIKKy5kZTlyOGk4djlhOXQ4aTh2OGUuCisuZGVyMmk0dgorLmRlNHJpMXZhCisuZGVyaTN2YXQKKy5kZXIyaXZhMXQyaXYKKy5kZTlyOGk4djlhOXQ4aTh2OGU4cy4KKy5kZXJpdmF0aXY0ZTJzCisuZGk4YTlsOGU4Yzl0OGk4Yy4KKy4xZDRpM2EKKy5kaTJhbAorLmRpMmFsZQorLmRpYWxlMmMxdAorLmRpOGE5bDhlOGM5dDhpOGM4cy4KKy5kaWFsZWN0aTRjM3MyCisuZGk4YTlsOGU4Yzl0OGk5YzhpOGE4bi4KKy5kaWFsZWN0MmkxY2kKKy5kMmkxYWxlY3RpM2MyaTFhCisuZGlhbGVjdGljaTJhMm4KKy5kaThhOWw4ZThjOXQ4aTljOGk4YThuOHMuCisuZGlhbGVjdGljaWEybjFzMgorLmRpOWM4aDhsOG84cjhvOW04ZTh0OGg5YThuOGUuCisuZDRpMmNoCisuZGljNGgxbDQKKy5kaWNoMmxvCisuZGljaGxvcm8ybWUKKy5kaWNobG9ybzRtZXQKKy5kaWNobG9yb21ldGhhMm40CisuZGk4ZjlmOHI4YThjOHQuCisuZDFpZgorLmRpZjRmcgorLmRpNGYxZgorLmRpZmZyYTJjMXQKKy5kaThmOWY4cjhhOGM4dDhzLgorLmRpZmZyYWM0dDFzMgorLmRpOGY5ZjhyOGE4Yzl0OGk4bzhuLgorLmRpZmZyYWMxdDJpbworLmRpZmZyYWN0aW8ybgorLmRpOGY5ZjhyOGE4Yzl0OGk4bzhuOHMuCisuZGlmZnJhY3RpbzJuM3MyCisuZGk4cjhlOHIuCisuZDRpcjIKKy5kaTFyZQorLmRpcjFlcjQKKy5kaThyOGU5bjhlOHM4cy4KKy5kaXJlMW5lcworLmRpcmVuMmUyc3MKKy5kaThzOXA4YThyOWE4bjhkLgorLmRpczEKKy5kaXMxcAorLmRpMnMxcGEKKy5kaXNwMmEycgorLmRpc3BhcmEybgorLmRpc3BhcjRhbmQKKy5kaThzOXA4YThyOWE4bjhkOHMuCisuZGlzcGFyYW4yZDFzMgorLmRpOHM5dDhyOGE4dThnOGg4dDlsOHkuCisuZDRpczN0CisuZGlzdDRyCisuZGlzMXRyYQorLmRpc3RyYXVnaDMKKy5kaXN0cmF1Z2gydGwKKy5kaXN0cmF1Z2h0MWx5CisuZGk4czl0OHI4aThiOXU4dDhlLgorLmRpc3RyNGliCisuZGk4czl0OHI4aThiOXU4dDhlOHMuCisuZGk4czl0OHI4aThiOXU4dDhlOGQuCisuZGlzdHJpYnUydDFlZAorLmRvOHU5YjhsOGU5czhwOGE4YzhlLgorLmRvdTIKKy5kb3UzYjJsMgorLmRvdTVibGUxc3AKKy5kb3VibGVzMgorLmRvdWJsZTJzMXBhCisuZG91Ymxlc3BhNGNlCisuZG84dTliOGw4ZTlzOHA4YThjOWk4bjhnLgorLmRvdWJsZXNwNGEyY2kKKy5kb3VibGVzcGEyYzFpbgorLmRvdWJsZXNwYWMxaW5nCisuZG84bDhsOWk4czhoLgorLmRvbDFsCisuZG9sbDJpCisuZG9sbGlzMmgKKy5kcjhpOGY4dDlhOGc4ZS4KKy4xZHIKKy5kcjRpMmZ0CisuZHJpZjF0YQorLmRyOGk4djllOHI4cy4KKy5kcjJpdgorLmRyaXZlNHIxczIKKy5kcjhvOG05ZTlkOGE4cjh5LgorLmRybzJtZQorLmRybzJtZWQKKy5kcm9tMmUyZDJhCisuZHJvbWU0ZGFyeQorLmRyb21lZDJhMnIKKy5kcjhvOG05ZTlkOGE4cjhpOGU4cy4KKy5kcm9tZWRhcjFpCisuZHJvbWVkYXIyaWU0CisuZHU5bzhwOW85bDhpOHM4dC4KKy5kdW9wb2wyaQorLmR1OW84cDlvOWw4aThzOHQ4cy4KKy5kdW9wb2xpczR0MXMyCisuZHU5bzhwOW84bDh5LgorLmR1b3BvMmx5CisuZHk4czlsOGU4eDhpOGEuCisuZDJ5CisuZHlzMWwyCisuZHlzMmxlCisuZHlzbGV4M2kKKy5keXNsZXgyaTVhCisuZHk4czlsOGU4Yzl0OGk4Yy4KKy5keXNsZTJjMXQKKy5lYThzOHQ5ZThuOGQ5ZThyOHMuCisuZWFzdDMKKy5lYXMzdGVuCisuZWFzM3RlbmQKKy5lYXN0ZW4xZGUKKy5lYXN0ZW5kZTRyNXMyCisuZWM4bzluOG84bTlpOGM4cy4KKy5lMWNvCisuZWNvMm4KKy5lY28zbm9taWMKKy5lY29ub21pNGMzczIKKy5lYzhvOG45bzltOGk4czh0LgorLmVjb25vbTJpcworLmVjOG84bjlvOW04aThzOHQ4cy4KKy5lY29ub21pczR0MXMyCisuZWk5ZzhlOG45YzhsOGE4czhzLgorLmVpMgorLmUyaWcyCisuZWkxZ2VuCisuZWlnZW4xYzRsNAorLmVpZ2VuY2xhMnNzCisuZWk5ZzhlOG45YzhsOGE4czhzOGU4cy4KKy5laWdlbmNsYXNzMWU0cworLmVpOWc4ZThuOXY4YThsOXU4ZS4KKy5laWdlbjF2MgorLmVpZ2VuMXZhCisuZWlnZW52YWwxdQorLmVpOWc4ZThuOXY4YThsOXU4ZThzLgorLmVsOGU4Yzh0OHI4bzltOGU4YzhoOGE4bjlpOWM4YThsLgorLjVlbGVjCisuZWxlMmMxdAorLmVsZWN0cm8ybWUKKy5lbGVjdHJvbWUyY2gKKy5lbGVjdHJvbWU1Y2hhNG4xaWMKKy5lbGVjdHJvbWVjaGEybgorLmVsZWN0cm9tZWNoYW5pMWNhCisuZWw4ZThjOHQ4cjhvOW04ZThjOGg4YThuOG85YThjOG84dThzOHQ4aThjLgorLmVsZWN0cm9tZWNoYW5vNAorLmVsZWN0cm9tZWNoYW40b2EKKy5lbGVjdHJvbWVjaGFub2ExY28KKy5lbGVjdHJvbWVjaGFub2Fjb3UyCisuZWxlY3Ryb21lY2hhbm9hY28ydXMKKy5lbGVjdHJvbWVjaGFub2Fjb3VzdDJpCisuZWxlY3Ryb21lY2hhbm9hY291czF0aWMKKy5lbDhpOHQ5aThzOHQuCisuZWwyaQorLmVsMWl0CisuZWxpMXRpCisuZWw0aXRpcworLmVsOGk4dDlpOHM4dDhzLgorLmVsaXRpczR0MXMyCisuZW45dDhyOGU5cDhyOGU5bjhlOHU4ci4KKy5lbjF0CisuZW50cmVwcjIKKy5lbnRyZXByZW40ZXUKKy5lbjl0OHI4ZTlwOHI4ZTluOGU4dThyOWk4YThsLgorLmVudHJlcHJlbmV1cjJpM2EKKy5lbnRyZXByZW5ldXJpMmFsCisuZXA5aTluOGU4cDhoOXI4aThuOGUuCisuZXBpMm4KKy5lcDJpbmUKKy5lcGluZXA0aHI0CisuZXAyaW5lcGhyMmluNGUKKy5lcTh1OGk5djhhOHI4aTlhOG44dC4KKy5lcXUyaXYzCisuZXF1aTF2YQorLmVxdWl2MmEycgorLmVxdWl2YXIxaQorLmVxdWl2YXIzaTJhMm4KKy5lcXVpdmFyMmkzYQorLmVxdWl2YXI0aWFuNHQKKy5lcTh1OGk5djhhOHI4aTlhOG44YzhlLgorLmVxdWl2YXI0aWFuYworLmV0OGg5YThuOGUuCisuZXRoYTJuNAorLmV0OGg5eThsOWU4bjhlLgorLmV2OGU4cjlzOGk5YjhsOGUuCisuZXYxZXIKKy5ldmU0cjFzMgorLmV2ZXIxc2kKKy5ldmVyNHNpNGIKKy5ldmVyc2kxYjJsMgorLmV2OGU4cjh0LgorLmV2OGU4cjh0OHMuCisuZXZlcjR0MXMyCisuZXY4ZThyOHQ5ZThkLgorLmV2ZXIydDFlZAorLmV2OGU4cjh0OWk4bjhnLgorLmV2ZXIxdGkKKy5ldmVyMnQxaW4KKy5leDlxOHU4aThzOWk4dDhlLgorLmV4cXUyCisuZXhxMnVpMgorLmV4cXVpczJpdGUKKy5leDl0OHI4YTlvOHI5ZDhpOW44YThyOHkuCisuZXgxdDIKKy5leDF0cmEKKy5leHRyNGFvCisuZXh0cmFvcmQyaQorLmV4dHJhb3JkMWluNAorLmV4dHJhb3IxZGkxbmEKKy5leHRyYW9yZGluMmEycgorLmZhOGw4bDlpOG44Zy4KKy4xZmEKKy5mYWwxbAorLmZhbGwyaQorLmZhbDJsaW40CisuZmU4cjhtOGk5bzhuOHMuCisuZmVyMQorLmZlcjNtNAorLmZlcjRtMmlvCisuZmVybWlvMm4KKy5mZXJtaW8ybjNzMgorLmZpOW44aTh0OGU5bDh5LgorLjFmaQorLjJmaW4KKy5mMmluaQorLmZpbjJpdAorLmZpbjJpdGUKKy5maW5pdGUxbHkKKy5mbDhhOWc4ZThsOWw4dThtLgorLmY0bDIKKy5mbGFnNWVsMWwKKy5mbDhhOWc4ZThsOWw4YS4KKy5mbGFnNGVsbGEKKy5mbDhhOG05bThhOWI4bDhlOHMuCisuZmxhbTFtCisuZmxhbTFtYQorLmZsYW0ybWFiCisuZmxhbW1hYjJsMgorLmZsYW1tYWJsZXMyCisuZmw4ZThkOGc5bDhpOG44Zy4KKy5mbGVkZ2wyCisuZmw4bzh3OWM4aDhhOHI4dC4KKy5mbG93MmNoCisuZmxvd2NoMmEycgorLmZsOG84dzljOGg4YThyOHQ4cy4KKy5mbG93Y2hhcjR0MXMyCisuZmw4dThvOHI4bzljOGE4cjliOG84bi4KKy5mbHUzbworLmZsdW8zcgorLmZsdW9yMm9jCisuZmx1b3JvMWNhCisuZmx1b3JvYzJhMnIKKy5mbHVvcm9jYXIxYgorLmZsdW9yb2NhcmI0bworLmZsdW9yb2NhcmJvMm4KKy5mbzhyOW04aTlkOGE5YjhsOGUuCisuZm9yMm1pCisuZm9ybWkxZDRhCisuZm9ybTJpZAorLmZvcm1pMmQzYTRiCisuZm9ybWlkYWIybDIKKy5mbzhyOW04aTlkOGE5YjhsOHkuCisuZm9ybWlkYWIxbHkKKy5mbzhyOXM4eTh0OGg5aThhLgorLmZvNHJzMgorLmZvcnM0eQorLmZvcnN5dGgyaTFhCisuZm84cjh0OGg5cjhpOGc4aDh0LgorLmZvcnQ0aHI0CisuZm9ydGhyMmlnCisuZnI4ZThlOWw4bzhhOGQ4ZThyLgorLmZyZWVsNG9hCisuZnJlZWxvYTJkMworLmZyOGU4ZTlsOG84YThkOGU4cjhzLgorLmZyZWVsb2FkZTRyNXMyCisuZnI4aThlOG44ZDlsOGk4ZThyLgorLmZyaTIKKy5mcjJpZTQKKy5mcmllbmRsMmllNAorLmZyOGk5djhvOGw5aTh0OHkuCisuZnIyaXYKKy5mcml2b2wyaQorLmZyaXZvbDFpdAorLmZyaXZvbGkxdHkKKy5mcjhpOXY4bzhsOWk5dDhpOGU4cy4KKy5mcml2b2xpMXRpCisuZnJpdm9saXQyaWU0CisuZnI4aTh2OW85bDhvOHU4cy4KKy5mcml2b2xvdTIKKy5mcml2b2xvMnVzCisuZ2E5bDhhOGM5dDhpOGMuCisuZ2FsYTJjMXQKKy5nYThsOWE4eDh5LgorLmdhOGw5YTh4OWk4ZThzLgorLmdhbGF4M2kKKy5nYWxheDJpZTQKKy5nYThzOW84bTllOXQ4ZThyLgorLmdhMXNvCisuZ2Ezc29tCisuZ2FzbzJtZQorLmdhc280bWV0CisuZ2Fzb21lMXRlCisuZ2U5bzlkOGU4czlpOGMuCisuZ2VvZGVzMgorLmdlb2RlMXNpCisuZ2VvZGUyc2ljCisuZ2U5bzlkOGU4dDlpOGMuCisuZ2VvZGUxdAorLmdlb2RldDFpYworLmdlOG85bThlOHQ5cjhpOGMuCisuZ2Uzb20KKy5nZW8ybWUKKy5nZW80bWV0CisuZ2VvbTRldHIKKy5nZW81bWV0M3JpYworLmdlOG85bThlOHQ5cjhpOGM4cy4KKy5nZW9tZTR0cmk0YzNzMgorLmdlOW85czh0OHI4bzhwOGg4aThjLgorLmdlb3M0CisuZ2Vvc3Q0cgorLmdlb3N0cjJvcGgKKy5nZW9zdHJvcGgxaWMKKy5nZThvOXQ4aDhlOHI5bThhOGwuCisuZ2U0b3QKKy5nZTRvdGgKKy5nZW90aDJlCisuZ2VvdGhlcjNtNAorLmdlb3RoZXIxbWEKKy5nZTlvOHQ5cjhvOXA4aThzOG0uCisuZ2VvdHJvcGkyczFtCisuZ244bzltOG84bi4KKy5nMW5vCisuZ25vNG1vCisuZ25vNG1vMm4KKy5nbjhvOW04bzhuOHMuCisuZ25vbW8ybjNzMgorLmdyOGE4bjhkOXU4bjhjOGw4ZS4KKy4xZ3IKKy5ncmEybjIKKy5ncjRhbmQKKy5ncmFuMWR1CisuZ3JhbmR1NG4KKy5ncmFuZHVuMWM0bDQKKy5ncjhhOG44ZDl1OG44YzhsOGU4cy4KKy5ncmFuZHVuY2xlczIKKy5ncjhpOGU4djlhOG44YzhlLgorLmdyMmllNAorLmdyaWUxdmEKKy5ncmlldmEybgorLmdyOGk4ZTh2OWE4bjhjOGU4cy4KKy5ncjhpOGU4djlvOHU4cy4KKy5ncmlldm91MgorLmdyaWV2bzJ1cworLmdyOGk4ZTh2OW84dThzOWw4eS4KKy5ncmlldm91czFsMgorLmdyaWV2b3VzMWx5CisuaGE4aThyOXM4dDh5OGw4ZS4KKy5oYWkyCisuaGE0aXIKKy5oYWk0cnMyCisuaGFpcnMydHkKKy5oYWlyczJ0eWwKKy5oYThpOHI5czh0OHk4bDhlOHMuCisuaGFpcnN0eWxlczIKKy5oYThpOHI5czh0OHk4bDlpOHM4dC4KKy5oYThpOHI5czh0OHk4bDlpOHM4dDhzLgorLmhhaXJzdHlsaXM0dDFzMgorLmhhOGw4ZjlzOHA4YThjOGUuCisuaGEybGYKKy5oYWwyZjNzCisuaGFsZjJzMXBhCisuaGFsZnNwYTRjZQorLmhhOGw4ZjlzOHA4YThjOGU4cy4KKy5oYThsOGY5dzhhOHkuCisuaGE4cjliOGk4bjlnOGU4ci4KKy5oMmEycgorLmhhcjFiCisuaGFyYmkyCisuaGFyMmJpbgorLmhhcmI0aW5nZQorLmhhOHI5YjhpOG45ZzhlOHI4cy4KKy5oYXJiaW5nZTRyMXMyCisuaGE4cjlsOGU5cTh1OGk4bi4KKy5oYXI0bGU0CisuaGFyMWwKKy5oYXJsZTFxCisuaGFybGVxdTIKKy5oYXJsZXEydWkyCisuaGFybGVxdWk0bgorLmhhOHI5bDhlOXE4dThpOG44cy4KKy5oYXJsZXF1MmkybjFzMgorLmhhOHQ4YzhoOWU4cjhpOGU4cy4KKy5oYTR0YworLmhhdDRjaAorLmhhdGNoZTIKKy5oYXRjaGVyMWkKKy5oYXRjaGVyMmllNAorLmhlOG04aTlkOGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHIuCisuaGVtMmlkCisuaGVtaWQ0ZW0KKy5oZW1pZGU0bTJpcworLmhlbWlkZW00aXNlCisuaGVtaWRlbWlzZW1pM3F1YQorLmhlbWlkZW1pc2VtaXF1MgorLmhlbWlkZW1pc2VtaXF1YTV2NAorLmhlOG04aTlkOGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHI4cy4KKy5oZW1pZGVtaXNlbWlxdWF2ZTRyMXMyCisuaGU5bThvOWc4bDhvOWI4aThuLgorLmhlbW80ZworLmhlMW1vCisuaGVtbzRnbDIKKy5oZW1vM2dsbworLmhlbW9nbG8xYmkKKy5oZW1vZ2xvMmJpbgorLmhlOW04bzlwOGg4aThsOWk4YS4KKy5oZW0yb3BoCisuaGVtb3BoNGlsMgorLmhlbW9waGlsMWkKKy5oZW1vcGhpbDNpMWEKKy5oZTltOG85cDhoOGk4bDlpOGE4Yy4KKy5oZTltOG85cDhoOGk4bDlpOGE4YzhzLgorLmhlbW9waGlsaWE0YzNzMgorLmhlOG04bzlyOGg4ZTlvOGw5bzhnOHkuCisuaGVtbzJyCisuaGVtb3JoNAorLmhlbW9yaGUzb2wKKy5oZW1vcmhlb2wxbzFneQorLmhlOXA4YTh0OWk4Yy4KKy5oZXA1CisuaGUycGEKKy5oZXBhdDFpYworLmhlOHI5bThhOHA4aDlyOG85ZDhpOHQ4ZS4KKy5oZXIzbTQKKy5oZXIxbWEKKy5oZXI0bWFwCisuaGVybWFwNGhyNAorLmhlcm1hcGhyb2QyaXRlCisuaGU4cjltOGE4cDhoOXI4bzlkOGk4dDlpOGMuCisuaGVybWFwaHJvZDJpMXRpCisuaGVybWFwaHJvZDRpMnRpYworLmhlOXI4bzhlOHMuCisuaGVybzRlCisuaGU4eDhhOWQ4ZThjOWk5bThhOGwuCisuaGV4MWEKKy5oZXhhMmQKKy5oZXhhZGUxYzJpCisuaGV4YWRlMmMzaW0KKy5oZXhhZGVjaTFtYQorLmhvOWw4bzluOG85bTh5LgorLmhvbG8ybgorLmhvbG9uM28zbXkKKy5obzltOGU4bzltOG84cjlwOGg4aThjLgorLmhvMm1lMworLmhvbWVvMW1vCisuaG9tZW9tbzJyCisuaG9tZW9tb3IxcAorLmhvbWVvbW9ycDRoNAorLmhvbWVvbW9ycGgxaWMKKy5obzltOGU4bzltOG84cjlwOGg4aThzOG0uCisuaG9tZW9tb3JwaGkyczFtCisuaG85bThvOXQ4aDhlOHQ4aThjLgorLmhvMW1vCisuaG9tNG90aDMKKy5ob21vdGgyZQorLmhvbW8zdGhlNHQKKy5ob21vdGhldDFpYworLmhvOHI4czhlOXI4YThkOWk4czhoLgorLmhvcjRzZQorLmhvNHJzMgorLmhvcnNlcjFhCisuaG9yc2VyYTJkCisuaG9yc2VyMmFkaQorLmhvcnNlcmFkaXMxCisuaG9yc2VyYWRpczJoCisuaG84dDliOGU4ZC4KKy5obzJ0MWIKKy5ob3Q0YmUyZAorLmhvOHQ5YjhlOGQ4cy4KKy5ob3RiZTJkMXMyCisuaHk5ZDhyOG85dDhoOGU4cjltOGE4bC4KKy5oeTFkCisuaHkxZHIKKy5oeWRybzR0aDJlCisuaHlkcjRvdGgKKy5oeWRyb3RoZXIzbTQKKy5oeWRyb3RoZXIxbWEKKy5oeTlwOG85dDhoOGE4bDlhOW04dThzLgorLmh5M3BvCisuaHlwNG90CisuaHlwNG90aAorLmh5cG90aGEzbGEKKy5oeXBvdGhhbGEzbQorLmh5cG90aGFsYTFtdQorLmh5cG90aGFsYW0ydXMKKy5pZDhlOGE4bDhzLgorLmlkZTNhNGwKKy5pZGVhMmwxczIKKy5pZDhlOG85ZzhyOGE4cDhoOHMuCisuaWRlbzJnCisuaWRlbzFncgorLmlkZW9ncmE0cDRoMXMyCisuaWQ4aThvOXM4eThuOWM4cjhhOHM4eS4KKy5pMmRpCisuaTFkM2lvCisuaWRpNG9zCisuaWRpb3M0eQorLmlkaW9zeW4xY3IKKy5pZGlvc3luY3IyYXMKKy5pZGlvc3luY3JhczR5CisuaWQ4aThvOXM4eThuOWM4cjhhOXM4aThlOHMuCisuaWRpb3N5bmNyYXMyaWU0CisuaWQ4aThvOXM4eThuOWM4cjhhOHQ4aThjLgorLmlkaW9zeW41Y3JhdDFpYworLmlkOGk4bzlzOHk4bjljOHI4YTh0OWk5YzhhOGw5bDh5LgorLmlkaW9zeW5jcmF0aTFjYQorLmlkaW9zeW5jcmF0aWNhbDFsCisuaWRpb3N5bmNyYXRpY2FsMWx5CisuaWc5bjhpOHQ5ZThyLgorLjJpZworLmlnMW5pCisuaWduMml0CisuaWduMml0ZQorLmlnOW44aTh0OWU4cjhzLgorLmlnbml0ZTRyMXMyCisuaWc5bjhpOXQ4bzhyLgorLmlnbjNpdG9yCisuaWduaTF0bworLmlnOG44bzhyOGU5czhwOGE4YzhlOHMuCisuaWcxbm8KKy5pZ25vcmUxc3AKKy5pZ25vcmUyczFwYQorLmlnbm9yZXNwYTRjZQorLmltOXA4ZThkOWE4bjhjOGUuCisuaW0ycDJlZAorLmltcDJlMmQyYQorLmltcGVkYTJuCisuaW05cDhlOGQ5YThuOGM4ZThzLgorLmluOWQ4dTliOGk5dDhhOWI4bDhlLgorLjRpbmQKKy5pbjFkdQorLmluZHUxYjRpCisuaW5kdWJpMnQKKy5pbmR1YmkxdGEKKy5pbmR1YmkydGFiCisuaW5kdWJpdGFiMmwyCisuaW45ZjhpOG45aTh0OGU5bDh5LgorLmluM2YKKy5pbjFmaQorLmluMmZpbgorLmluZjJpbmkKKy5pbmZpbjJpdAorLmluZmluMml0ZQorLmluZmluaXRlMWx5CisuaW45ZjhpOG45aTl0OGU4czlpOW04YThsLgorLmluZmluaXQ0ZXMKKy5pbmZpbml0ZTFzaQorLmluZmluaXRlMnM1aW0KKy5pbmZpbml0ZXNpMW1hCisuaW45ZjhyOGE5czh0OHI4dThjOXQ4dThyOGUuCisuaW5mcjJhcworLmluZnJhczF0NHIKKy5pbmZyYXN0cnUyYzF0CisuaW5mcmFzdHJ1Y3R1NHIKKy5pbmZyYXN0cnVjMXR1CisuaW5mcmFzdHJ1YzN0dXJlCisuaW45ZjhyOGE5czh0OHI4dThjOXQ4dThyOGU4cy4KKy5pbjlzOHQ4YThsOGw5ZThyLgorLmluczJ0YTJsCisuaW5zMXRhCisuaW5zdGFsMWwKKy5pbnN0YWwybGUKKy5pbjlzOHQ4YThsOGw5ZThyOHMuCisuaW5zdGFsbGU0cjFzMgorLmluOXQ4ZThyOWQ4aThzOWM4aTlwOGw4aTluOGE4cjh5LgorLmluMXQKKy5pbjV0ZXIzZAorLmludGVyZDJpCisuaW50ZXJkaXMxCisuaW50ZXJkMmlzMWMKKy5pbnRlcmRpczFjaQorLmludGVyZGlzYzJpcAorLmludGVyZGlzY2kxcDJsMgorLmludGVyZGlzY2lwbGk0bgorLmludGVyZGlzY2lwbDRpMW5hCisuaW50ZXJkaXNjaXBsaW4yYTJyCisuaW45dDhlOHI5ZzhhOWw4YThjOXQ4aThjLgorLmludGVyZzIKKy5pbnRlcjFnYQorLmludGVyZ2FsYTJjMXQKKy5pbjl1OHQ4aThsOGUuCisuaW4xdQorLmluNHUxdDJpCisuaW45dTh0OGk4bDlpOXQ4eS4KKy5pbnV0aWwxaQorLmludXQyaWwxaXQKKy5pbnV0aWxpMXR5CisuaXI5cjhlOWQ4dThjOWk4YjhsOGUuCisuaXIycjJlZAorLmlycmUxZHUKKy5pcnJlZHUyYworLmlycmVkdWNpNGIKKy5pcnJlZHUxY2kKKy5pcnJlZHVjaTFiMmwyCisuaXI5cjhlOWQ4dThjOWk4YjhsOHkuCisuaXJyZWR1Y2liMWx5CisuaXI5cjhlOHY5bzljOGE5YjhsOGUuCisuaXJyZXYyCisuaXJyZTV2b2MKKy5pcnJldm8xY2EKKy5pcnJldm9jYTFiMmwyCisuaXM4bzh0OXI4bzhwOHkuCisuaTJzbworLmlzb3Ryb3B5NQorLmlzOG85dDhyOG84cDlpOGMuCisuaXNvdHJvcDNpYworLml0OGk4bjllOHI5YThyOHkuCisuaTF0aQorLmkydDFpbgorLml0MmluZQorLml0aW40ZXI0YTJyCisuaXRpbjFlcgorLml0aW5lcjFhCisuaXQ4aThuOWU4cjlhOHI5aThlOHMuCisuaXRpbmVyYXIxaQorLml0aW5lcmFyMmllNAorLmplOXI4ZTltOGk5YThkOHMuCisuMWplCisuamVyZW0yaTNhCisuamVyZW1pYTJkCisuamVyZW1pYTJkMXMyCisua2U4eTluOG84dDhlLgorLmtlOHk5bjhvOHQ4ZThzLgorLmtleW5vNHRlcworLmtlOHk5czh0OHI4bzhrOGUuCisua2V5czQKKy5rZXlzMXQKKy5rZXlzdDRyCisua2V5c3RyMm9rMgorLmtlOHk5czh0OHI4bzhrOGU4cy4KKy5rZXlzdHJva2VzNAorLmtpOGw4bjlpOG44Zy4KKy5rMWkKKy5rNGkybDFuMgorLmtpbG4xaW4KKy5raWxuaW40ZworLmxhOGM5aTllOHM4dC4KKy5sNGEyY2k0CisubGEzYzJpZTQKKy5sYWNpMWVzdAorLmxhOG05ZThuOXQ4YTliOGw4ZS4KKy5sYTFtZW4KKy5sYTNtZW4xdAorLmxhbWVuMnRhNGIKKy5sYW1lbjF0YQorLmxhbWVudGFiMmwyCisubGE4bjhkOXM4YzhhOHA5ZThyLgorLjNsNGFuZAorLmxhMm4KKy5sYW4yZDFzMgorLmxhbmRzY2E0cAorLmxhbmRzMWNhCisubGFuZHNjYTVwZXIKKy5sYThuOGQ5czhjOGE4cDllOHI4cy4KKy5sYW5kc2NhcGU0cjFzMgorLmxhOHI5YzhlOW44eS4KKy5sMmEycgorLmxhcjFjCisubGFyMmNlCisubGFyMWNlbjQKKy5sYThyOWM4ZTluOWk4czh0LgorLmxhcjRjZW5pCisubGU4YThmOWg4bzhwOXA4ZThyLgorLmxlMmEKKy5sZWEyZgorLmxlYTRmaAorLmxlYWZobzRwMXAKKy5sZWFmaG9wMnBlCisubGVhZmhvcDNwZXIKKy5sZThhOGY5aDhvOHA5cDhlOHI4cy4KKy5sZWFmaG9wcGU0cjFzMgorLmxlOHQ5dDhlOHI5czhwOGE4YzlpOG44Zy4KKy5sZTR0M3QyCisubGV0dGU0cjFzMgorLmxldHRlcjFzcAorLmxldHRlcjJzMXBhCisubGV0dGVyc3A0YTJjaQorLmxldHRlcnNwYTJjMWluCisubGV0dGVyc3BhYzFpbmcKKy5saThmOGU5czhwOGE4bi4KKy5saWZlMXNwCisubGlmZTJzMXBhCisubGlmZXNwYTRuCisubGk4ZjhlOXM4cDhhOG44cy4KKy5saWZlc3BhMm4xczIKKy5saThmOGU5czh0OHk4bDhlLgorLmxpZmVzMnR5CisubGlmZXMydHlsCisubGk4ZjhlOXM4dDh5OGw4ZThzLgorLmxpZmVzdHlsZXMyCisubGk4ZzhoOHQ5dzhlOGk4ZzhoOHQuCisuM2xpZ2gKKy5saWdodHc0CisubGlnaHR3ZWkyCisubDJpZ2h0d2UyaWcyCisubGk4bTlvOHU5czhpOG44ZThzLgorLmxpNG1vCisubGkzbW8ydXMKKy5saW1vdTIKKy5saW1vdTJzMWluCisubGltb3VzMmluZQorLmxpbW91c2kxbmVzCisubGk4bjhlOWI4YThjOGs4ZThyLgorLjFsNGluZQorLmxpbjJlMmIKKy5saW5lYmFjazEKKy5saW5lYmFjazFlcgorLmxpOG44ZTlzOHA4YThjOGk4bjhnLgorLmxpMW5lcworLmxpNG5lMXNwCisubGluZTJzMXBhCisubGluZXNwNGEyY2kKKy5saW5lc3BhMmMxaW4KKy5saW5lc3BhYzFpbmcKKy5saTlvOG45ZThzOHMuCisubGlvMm4KKy5saW8xbmVzCisubGlvbjJlMnNzCisubGk4dDhoOW85ZzhyOGE4cDhoOGU4ZC4KKy5sMml0aAorLmxpdGhvNGcKKy5saXRobzFncgorLmxpdGhvZ3JhcGg0ZWQKKy5saTh0OGg5bzlnOHI4YThwOGg4cy4KKy5saXRob2dyYTRwNGgxczIKKy5sbzliOG84dDlvOG04eS4KKy5sb2JvNHRvCisubG9ib3RvM215CisubG85YjhvOHQ5bzhtOWk4ejhlLgorLmxvYm90b20yaXoKKy5sb2JvdG9taTJ6ZQorLmxvOGc4ZThzLgorLmxvMWdlCisubG84bjhnOWU4czh0LgorLjVsb25nCisubG8ybgorLmxvOXE4dThhOGM5aTh0OHkuCisubG8xcQorLmxvcXUyCisubG9xdWFjNAorLmxvcXU0YTJjaQorLmxvcXVhMmMxaXQKKy5sb3F1YWNpMXR5CisubG84djhlOXM4dDhyOHU4YzhrLgorLjRsb3YKKy5sb3Y0ZTJzCisubG92MmVzdDRyCisubG92ZXN0cnVjNQorLmxvdmVzdHJ1Y2sxCisubWE4YzhyOG85ZThjOG85bjhvOG04aThjOHMuCisubWFjcm80ZQorLm1hY3JvZTFjbworLm1hY3JvZWNvMm4KKy5tYWNyb2VjbzNub21pYworLm1hY3JvZWNvbm9taTRjM3MyCisubWE4bDlhOXA4cjhvOHA5aThzOG0uCisubWFsYXByMgorLm1hbGFwcm9waTJzMW0KKy5tYThsOWE5cDhyOG84cDlpOHM4bThzLgorLm1hbGFwcm9wNGlzNG0xczIKKy5tYThuOXM4bDhhOHU4ZzhoOXQ4ZThyLgorLm1hMm4xczIKKy5tYW4yczFsMgorLm1hbnNsYXVnaDMKKy5tYThuOXU5czhjOHI4aThwOHQuCisubWFuMnVzCisubWFudXNjMgorLm1hbnVzY3JpMgorLm1hbnVzY3IyaXAKKy5tYW51c2NyaTJwMXQKKy5tYThyOWc4aThuOWE4bC4KKy5tYXJnMgorLm1hcmdpNG4KKy5tYXJnaTFuYQorLm1hOHQ4aDllOW04YTl0OGk5YzhpOGE4bi4KKy5tNGF0aDMKKy5tYXRoNWVtCisubWF0aDJlCisuMW1hdGhlMW1hCisubWF0aGVtYXQxaWMKKy5tYXRoZW1hdDJpMWNpCisubWF0aGVtYXRpM2MyaTFhCisubWF0aGVtYXRpY2kyYTJuCisubWE4dDhoOWU5bThhOXQ4aTljOGk4YThuOHMuCisubWF0aGVtYXRpY2lhMm4xczIKKy5tYTh0OHQ4ZThzLgorLm1hdDV0ZQorLm1hNHQzdDIKKy5tYXQ0dGVzCisubWU4ZDlpOGM5YThpOGQuCisuMm1lZAorLm00ZWRpCisubWVkM2kxY2EKKy5tZWRpY2FpMgorLm1lZGljYTJpZAorLm1lOGQ4aTlvOGM4cjhlLgorLm1lMWQyaW8KKy5tZWRpb2NyZTMKKy5tZThkOGk5bzhjOXI4aTl0OGk4ZThzLgorLm1lZGk1b2NyaXQKKy5tZWRpb2NyaTIKKy5tZWRpbzVjcmkxdGkKKy5tZWRpb2NyaXQyaWU0CisubWU4ZzhhOWw4aTh0OGguCisubWUyZworLm00ZWdhbAorLm1lMWdhCisubWUzZ2FsMWkKKy5tZWdhbDFpdAorLm1lZ2FsMml0aAorLm1lOGc4YTlsOGk4dDhoOHMuCisubWVnYWxpMnQ0aDFzMgorLm1lOHQ4YTliOG84bDlpOGMuCisubWU0dGEKKy5tZTJ0YTRiCisubWV0YWJvbDNpYworLm1ldGFib2wyaQorLm1lOXQ4YThiOW85bDhpOHM4bS4KKy5tZXRhYm9saTJzMW0KKy5tZTl0OGE4YjlvOWw4aThzOG04cy4KKy5tZXRhYm9sNGlzNG0xczIKKy5tZTl0OGE4YjlvOWw4aTh0OGUuCisubWV0YWJvNWwyaXRlCisubWV0YWJvbDFpdAorLm1lOXQ4YThiOW85bDhpOHQ4ZThzLgorLm1ldGFib2xpdDRlcworLm1lOHQ4YTlsOGE4bjlnOHU4YThnOGUuCisubWV0M2EybAorLm1ldGE1bGEKKy5tZXRhbGEybgorLm1ldGFsMmFuZworLm1ldGFsYW4xZ3UKKy5tZXRhbGFuZ3U0YQorLm1lOHQ4YTlsOGE4bjlnOHU4YThnOGU4cy4KKy5tZTh0OGE5cDhoOG84cjlpOGMuCisubWV0YXBobzRyCisubWU4dDhoOWE4bjhlLgorLm1ldGhhMm40CisubWU5dDhyOG84cDlvOWw4aThzLgorLm00ZXRyCisubWV0cm9wb2wyaQorLm1lOXQ4cjhvOHA5bzlsOGk4czhlOHMuCisubWV0cm9wb2w0aXNlCisubWV0cm9wb2xpczFlNHMKKy5tZTh0OXI4bzlwOG84bDlpOXQ4YThuLgorLm1ldHJvcG9sMWl0CisubWV0cm9wb2xpM3RhMm4KKy5tZXRyb3BvbGkxdGEKKy5tZTh0OXI4bzlwOG84bDlpOXQ4YThuOHMuCisubWV0cm9wb2xpdGEybjFzMgorLm1pOGM4cjhvOWU4YzhvOW44bzhtOGk4YzhzLgorLm00aTFjcgorLm1pY3JvNGUKKy5taWNyb2UxY28KKy5taWNyb2VjbzJuCisubWljcm9lY28zbm9taWMKKy5taWNyb2Vjb25vbWk0YzNzMgorLm1pOWM4cjhvOWY4aThjOGg4ZS4KKy5taWNybzJmaQorLm1pY3JvZjRpMmNoCisubWljcm9maWNoZTIKKy5taTljOHI4bzlmOGk4YzhoOGU4cy4KKy5taWNyb2ZpY2gxZXMKKy5taThjOHI4bzlvOHI4ZzhhOG45aThzOG0uCisubWljcm9vMgorLm1pY3Jvb3JnMgorLm1pY3Jvb3IxZ2EKKy5taWNyb29yZ2FuNWlzCisubWljcm9vcmdhMm4KKy5taWNyb29yZ2FuaTJzMW0KKy5taThjOHI4bzlvOHI4ZzhhOG45aThzOG04cy4KKy5taWNyb29yZ2FuNGlzNG0xczIKKy5taThsOGw5YThnOGUuCisubTRpbDFsCisubWk4bDlsOGk5bDhpOHQ4ZThyLgorLm1pbGwyaQorLm1pbDRsNGk0bAorLm1pbGxpbDFpCisubWlsbDJpbDFpdAorLm1pbGxpbDJpdGUKKy5taThtOGU4bzlnOHI4YThwOGg4ZThkLgorLm1pbWVvMmcKKy5taW1lbzFncgorLm1pbWVvZ3JhcGg0ZWQKKy5taThtOGU4bzlnOHI4YThwOGg4cy4KKy5taW1lb2dyYTRwNGgxczIKKy5taThtOWk4YzlyOGk4ZThzLgorLm1pbTFpCisubWltNGkxY3IKKy5taW1pY3JpMgorLm1pbWljcjJpZTQKKy5taThuOWk4cy4KKy5tMmluaQorLm1pbjFpcworLm1pOG44aTlzOHk4bTlwOG85czhpOHU4bS4KKy5taW5pczR5CisubWluaXN5NG0xcAorLm1pbmlzeW0xcG9zCisubWluaXN5bXBvNXNpNHUKKy5taThuOGk5czh5OG05cDhvOXM4aThhLgorLm1pbmlzeW1wb3MyaTFhCisubWk5bjh1OHQ5ZThyLgorLm00aW4xdQorLm1pOW44dTh0OWU4czh0LgorLm1pOHM5YzhoOGk4ZTl2OG84dThzOWw4eS4KKy5tMmlzMWMKKy5taXMzY2gyCisubWlzY2gyaWU0CisubWlzY2hpZXZvdTIKKy5taXNjaGlldm8ydXMKKy5taXNjaGlldm91czFsMgorLm1pc2NoaWV2b3VzMWx5CisubWk5czhlOHI4cy4KKy5tNGlzZQorLm1pczNlcgorLm1pc2U0cjFzMgorLm1pOXM4bzhnOWE5bTh5LgorLm1pMnNvCisubWlzbzFnYQorLm1pc28yZ2FtCisubW84ZDllOGw5bDhpOG44Zy4KKy5tbzJkMQorLm1vZGVsMWwKKy5tb2RlbGwyaQorLm1vZGVsMmxpbjQKKy5tbzhsOWU5Yzh1OGw4ZS4KKy5tb2xlMWN1CisubW9sZTRjdWwKKy5tb2xlY3VsNGUKKy5tbzhsOWU5Yzh1OGw4ZThzLgorLm1vbGVjdWxlczIKKy5tbzhuOWE4cjhjOGg4cy4KKy5tbzFuMWEKKy5tb25hcjNjCisubW9uMmEycgorLm1vbmFyMmNoCisubW9uYXJjNGgxczIKKy5tbzhuOGU4eTlsOGU4bjlkOGU4ci4KKy5tb25leWxlbjFkZQorLm1vOG44ZTh5OWw4ZThuOWQ4ZThyOHMuCisubW9uZXlsZW5kZTRyNXMyCisubW84bjhvOWM4aDhyOG84bThlLgorLm1vbm8yY2g0CisubW9ub2M0aHI0CisubW9ub2Nocm8ybWUKKy5tbzhuOG85ZThuOWU4cjlnOGU4dDhpOGMuCisubW8zbm9lCisubW9ub2VuMWVyCisubW9ub2VuZXJnMgorLm1vbm9lbmVyM2dldAorLm1vbm9lbmVyZ2V0MWljCisubW84bjlvOGk4ZC4KKy5tb25vaTIKKy5tb25vMmlkCisubW84bjhvOXA4bzhsOGUuCisubW80bm9wCisubW84bjhvOXA4bzhsOGU4cy4KKy5tb25vcG9sZXMyCisubW85bjhvOHA5bzhsOHkuCisubW9ub3BvMmx5CisubW84bjhvOXM4cDhsOGk4bjhlLgorLm1vbm9zMXAybDIKKy5tb25vc3BsaTRuCisubW9ub3NwMWw0aW5lCisubW84bjhvOXM4cDhsOGk4bjhlOHMuCisubW9ub3NwbGkxbmVzCisubW84bjhvOXM4dDhyOG84ZjhpOGMuCisubW9ub3M1dAorLm1vbm9zdDRyCisubW9ub3N0cm8yZmkKKy5tbzluOG84dDlvOW44aThlOHMuCisubW9ubzF0bworLm1vMm5vdG8ybgorLm1vbm90b24yaWU0CisubW85bjhvOHQ5bzluOG84dThzLgorLm1vbm80dG9ubworLm1vbm90bzFub3UyCisubW9ub3Rvbm8ydXMKKy5tbzlyOG84bjlpOHM4bS4KKy5tb3JvNW40aXMKKy5tb3JvMm4KKy5tb3JvbmkyczFtCisubW84czlxOHU4aTl0OG8uCisubW9zMgorLm1vc3F1MgorLm1vc3EydWkyCisubW9zcXVpMXRvCisubW84czlxOHU4aTl0OG84cy4KKy5tb3NxdWl0b3MyCisubW84czlxOHU4aTl0OG84ZThzLgorLm11OGQ5cjhvOG84bS4KKy5tdTFkcgorLm11ZDFyb29tCisubXVkcm9vMgorLm11OGQ5cjhvOG84bThzLgorLm11ZHJvbzRtMXMyCisubXU4bDl0OGk5ZjhhOGM5ZTh0OGU4ZC4KKy41bXU0bHQKKy5tdWwxdGkzCisubXVsdGlmMgorLm11bHRpMWZhCisubXVsdGlmYTRjZQorLm11bHRpZmFjZXQ0CisubXVsdGlmYWNlMnQxZWQKKy5tdThsOXQ4aTlwOGw4aThjOWE4YjhsOGUuCisubXVsdDJpcAorLm11bHRpMXAybDIKKy5tdWx0aXBsaTFjYQorLm11bHRpcGxpY2ExYjJsMgorLm11OGw4dDhpOXU4czhlOHIuCisubXVsdGk0dQorLm11bHRpMnVzCisubmU4bzlmOGk4ZThsOGQ4cy4KKy4zbmVvCisubmU1b2YKKy5uZW8yZmkKKy5uZW9mMmllNAorLm5lb2ZpZTJsZDMKKy5uZW9maWVsMmQxczIKKy5uZThvOW44YTh6OGkuCisubmVvMm4KKy5uZW8xbjFhCisubmVvbmEyejFpCisubmU4bzluOGE4ejhpOHMuCisubmVvbmF6NGlzCisubmU4cDhoOWU4dzhzLgorLm5lcGhlNAorLm5lOHA4aDlyOGk4dDhlLgorLm5lcDRocjQKKy5uZXBocjJpdGUKKy5uZThwOGg5cjhpOHQ4aThjLgorLm5lcGhyNGkydDNpYworLm5lcGhyaTF0aQorLm5lOHc5ZThzOHQuCisubmU0dworLm5ld2VzdDMKKy5uZTh3OHM5bDhlOHQ5dDhlOHIuCisubmV3czRsMgorLm5ld3MybGUKKy5uZXdzbGU0dDN0MgorLm5lOHc4czlsOGU4dDl0OGU4cjhzLgorLm5ld3NsZXR0ZTRyMXMyCisubmk4dDhyOG85bThlOHQ4aDlhOG44ZS4KKy5uMml0CisubmkzdHIKKy5uaXRybzJtZQorLm5pdHJvNG1ldAorLm5pdHJvbWV0aGEybjQKKy5ubzluOGE4bThlLgorLm5vNG4KKy5ubzFuMWEKKy5ubzhuOWE4cjlpOHQ4aDltOGU4dDlpOGMuCisubm9uYXIzaQorLm5vbjJhMnIKKy5ub25hcjJpdGgKKy5ub25hcml0NGgxbQorLm5vbmFyaXRobWV0NAorLm5vbmFyaXRobWV0MWljCisubm84bjllOG04ZThyOWc4ZThuOGM4eS4KKy5ub25lMW1lCisubm9uZW1lcmcyCisubm9uZW1lcjFnZW4KKy5ub25lbWVyZ2VuMWN5Cisubm84bjllOHE4dThpOXY4YThyOGk5YThuOGM4ZS4KKy5ub25lMnEKKy5ub25lcXUyCisubm9uZXEydWkyCisubm9uZXF1Mml2MworLm5vbmVxdWkxdmEKKy5ub25lcXVpdjJhMnIKKy5ub25lcXVpdmFyMWkKKy5ub25lcXVpdmFyM2kyYTJuCisubm9uZXF1aXZhcjJpM2EKKy5ub25lcXVpdmFyNGlhbmMKKy5ubzhuOGU5dDhoOGU5bDhlOHM4cy4KKy5ub25ldGgyZQorLm5vbmV0aGUxbGVzMgorLm5vbmV0aGUzbDJlMnNzCisubm84bjllOHU4YzhsOGk4ZDllOGE4bi4KKy5ub240ZXUKKy5ub25ldTFjNGw0Cisubm9uZXVjbDJpZAorLm5vbmV1Y2xpZGVhMm4KKy5ubzhuOWk4czhvOW04bzhyOXA4aDhpOGMuCisubm9uNWkKKy5ub24xaXMKKy5ub25pMnNvCisubm9uaTNzb20KKy5ub25pc28xbW8KKy5ub25pc29tbzJyCisubm9uaXNvbW9yMXAKKy5ub25pc29tb3JwNGg0Cisubm9uaXNvbW9ycGgxaWMKKy5ubzhuOXA4czhlOHU4ZDhvOWM4bzhtOXA4YThjOHQuCisubm9uMXA0Cisubm9uMnAxczIKKy5ub25wMnNlCisubm9ucHM0ZXUKKy5ub25wc2V1MWRvCisubm9ucHNldWRvMWNvCisubm9ucHNldWRvY280bTFwCisubm9ucHNldWRvY29tMXBhCisubm9ucHNldWRvY29tcGEyYzR0Cisubm84bjlzOG04bzhvOHQ4aC4KKy5ubzJuM3MyCisubm9uMnMzbQorLm5vbnMxbW8KKy5ub25zbW9vMgorLm5vbnNtbzRvdGgKKy5ubzhuOXU4bjhpOWY4bzhyOG0uCisubm8zbnU0bgorLm5vbnUxbmkKKy5ub251bmkxZm8KKy5ub251bmlmbzJyCisubm9udW5pZm9yMW0KKy5ubzhuOXU4bjhpOWY4bzhyOG05bDh5LgorLm5vbnVuaWZvcjRtMWwKKy5ub251bmlmb3JtMWx5Cisubm84cjllOHA5aTluOGU4cDhoOXI4aThuOGUuCisubm9yZTVwaTJuCisubm9yZXAyaW5lCisubm9yZXBpbmVwNGhyNAorLm5vcmVwMmluZXBocjJpbjRlCisubm84dDl3OGk4dDhoOXM4dDhhOG44ZDlpOG44Zy4KKy5ub3R3NAorLm5vdHdpMgorLm5vdHcyaXRoMworLm5vdHdpMnQ0aDFzMgorLm5vdHdpdGg1c3Q0YW5kCisubm90d2l0aHMxdGEKKy5ub3R3aXRoc3RhMm4KKy5ub3R3aXRoc3RhbmQxaW4KKy5udTljOGw4ZThvOXQ4aThkOGUuCisubnVjbGUzCisubnUxYzRsNAorLm51Y2xlNG90CisubnVjbGVvdDJpZAorLm51OWM4bDhlOG85dDhpOGQ4ZThzLgorLm51Y2xlb3RpZGU0czIKKy5udTh0OWM4cjhhOGM4azllOHIuCisubnU0dGMKKy5udXRjcmFjazEKKy5udXRjcmFjazFlcgorLm51OHQ5YzhyOGE4YzhrOWU4cjhzLgorLm51dGNyYWNrZTRyMXMyCisub2U4cjlzOHQ4ZThkOHMuCisubzNlcgorLm9lNHIxczIKKy5vZXJzNHQxZWQKKy5vZXJzdGUyZDFzMgorLm9mOGY5bDhpOG44ZS4KKy5vNGYxZgorLm9mZjRsMgorLm9mZmxpbjQKKy5vZmYxbDRpbmUKKy5vZjhmOWw4bzhhOGQuCisub2ZmbDRvYQorLm9mZmxvYTJkMworLm9mOGY5bDhvOGE4ZDhzLgorLm9mZmxvYTJkMXMyCisub2Y4ZjlsOG84YThkOGU4ZC4KKy5vZmZsb2EyZDFlZAorLm9sOGk5ZzhvOHA5bzlsOGk4czh0LgorLm9sMmkKKy5vbDJpZworLm9saTJnbworLm9sMmlnb3BvbDJpCisub2w4aTlnOG84cDlvOWw4aThzOHQ4cy4KKy5vbGlnb3BvbGlzNHQxczIKKy5vbDhpOWc4bzhwOW84bDh5LgorLm9saWdvcG8ybHkKKy5vbDhpOWc4bzhwOW84bDlpOGU4cy4KKy5vbGlnb3BvbDJpZTQKKy5vcDllOHI5YThuOGQuCisub3AxZXIKKy4zb3BlcjFhCisub3A0ZXI0YW5kCisub3BlcmEybgorLm9wOWU4cjlhOG44ZDhzLgorLm9wZXJhbjJkMXMyCisub3I4YThuOGc5dTh0OGE4bi4KKy5vcmEybgorLm9yMmFuZworLm9yYW4xZ3UKKy5vcmFuNGd1NHQKKy5vcmFuZ3UxdGEKKy5vcmEybmd1dGEybgorLm9yOGE4bjhnOXU4dDhhOG44cy4KKy5vcmFuZ3V0YTJuMXMyCisub3I5dDhoOG85ZDhvOG45dDhpOHM4dC4KKy5vcnRobzJkbzQKKy5vcnRob2RvMm4KKy5vcnRob2RvbjN0NGkKKy5vcnRob2RvbjF0Cisub3I5dDhoOG85ZDhvOG45dDhpOHM4dDhzLgorLm9ydGhvZG9udGlzNHQxczIKKy5vcjl0OGg4bzlrOGU4cjlhOXQ4bzhsOW84Zzh5LgorLm9ydGgyb2sKKy5vcnRob2sxZXIKKy5vcnRob2tlcjFhCisub3J0aG9rZXJhMXRvCisub3J0aG9rZXJhdG9sMW8xZ3kKKy5vcjh0OGg4bzluOGk4dDhyOG85dDhvOGw4dThlOG44ZS4KKy5vcnRobzJuCisub3J0aG9uMml0Cisub3J0aG9uaTN0cgorLm9ydGhvbml0cm8xdG8KKy5vcnRob25pdHJvdG9sdTNlbgorLm9ydGhvbml0cm90b2x1NGVuZQorLm92OGU4cjl2OGk4ZTh3LgorLm92ZXJ2MmllNAorLm92OGU4cjl2OGk4ZTh3OHMuCisub3g5aThkOWk4Yy4KKy5veDNpCisub3hpNWRpCisub3gyaWQKKy5wYThkOWQ4aThuOGcuCisuMXBhCisucDRhMmQKKy5wYWQ0ZDFpbgorLnBhZDFkNAorLnBhOGk4bjlsOGU4czhzOWw4eS4KKy5wNGFpMgorLnBhNGk0bjQKKy5wYTRpNG4xbAorLnBhaW5sZXMyCisucGFpbjNsMmUyc3MKKy5wYWlubGVzNHMxbDIKKy5wYWlubGVzczFseQorLnBhOGw5ZTh0OHQ4ZS4KKy5wNGFsCisucDJhbGUKKy5wYWxlNHQzdDIKKy5wYThsOWU4dDh0OGU4cy4KKy5wYWxldDR0ZXMKKy5wYThyOWE5YjhvOGw4YS4KKy5wMmEycgorLnBhMnJhYgorLnBhcmFibzFsYQorLnBhOHI5YTliOG84bDlpOGMuCisucGFyYWJvbDNpYworLnBhcmFib2wyaQorLnBhOXI4YThiOW85bDhvOGk4ZC4KKy5wYXJhYm9sb2kyCisucGFyYWJvbG8yaWQKKy5wYThyOWE5ZDhpOGc4bS4KKy5wYXJhMmQKKy5wYXIyYWRpCisucGFyYWQyaWcKKy5wYXJhZGlnMW0KKy5wYThyOWE5ZDhpOGc4bThzLgorLnBhcmFkaWc0bTFzMgorLnBhOHI4YTljOGg4dTh0OGUuCisucGFyYTJjaAorLnBhcmFjaHU0dAorLnBhOHI4YTljOGg4dTh0OGU4cy4KKy5wYThyOGE5ZDhpOW04ZTh0OGg4eThsOWI4ZThuOHo4ZThuOGUuCisucGFyYWQ0aW1ldAorLnBhcmFkaW1ldGh5MmwxYgorLnBhcmFkaW1ldGh5bGI0ZTRuM3oKKy5wYXJhZGltZXRoeWxiZW4yemUKKy5wYXJhZGltZXRoeWxiZW56ZTRuCisucGE4cjhhOWY4bDh1OG84cjhvOXQ4bzhsOHU4ZThuOGUuCisucGFyYTJmCisucGFyYWY0bDIKKy5wYXJhZmx1M28KKy5wYXJhZmx1bzNyCisucGFyYWZsdW9ybzF0bworLnBhcmFmbHVvcm90b2x1M2VuCisucGFyYWZsdW9yb3RvbHU0ZW5lCisucGE4cjhhOWc4cjhhOHA4aDllOHIuCisucGFyYTFncgorLnBhcmFnNXJhM3BoNGVyCisucGE4cjhhOWw4ZTlnOGE4bC4KKy5wYXIzYWwKKy5wYXIyYWxlCisucGFyYWw0ZWdhbAorLnBhcmFsZTFnYQorLnBhOHI5YThsOWw4ZThsOWk4czhtLgorLnBhcmFsMWwKKy5wYXJhbDJsZQorLnBhcmFsM2xlbAorLnBhcmFsbGVsMmkKKy5wYXJhbGxlMmxpcworLnBhcmFsbGVsaTJzMW0KKy5wYThyOGE5bThhOGc5bjhlOHQ5aThzOG0uCisucGFyNGExbWEKKy5wYXJhbTNhZworLnBhcmE1bWFnMW4KKy5wYXJhbWFnbmV0aTJzNG0KKy5wYThyOGE5bThlOGQ4aThjLgorLnBhcmEybWVkCisucGFyYW00ZWRpCisucGE4cjhhOW04ZTh0OGg4eThsOWE4bjhpOHM4bzhsOGUuCisucGFyYW0zZXQKKy5wYXJhbWV0aHkzbGEKKy5wYXJhbWV0aHlsYTJuCisucGFyYW1ldGh5bGFuaTJzbworLnBhOXI4YThtOWU5dDhyOGk4ejhlLgorLnBhcmFtNGV0cgorLnBhcmFtZXRyaTJ6ZQorLnBhOHI4YTltOGk4bDlpOXQ4YThyOHkuCisucGFyMmFtaQorLnBhcmFtaWwxaQorLnBhcmFtMmlsMWl0CisucGFyYW1pbGkxdGEKKy5wYXJhbWlsaXQyYTJyCisucGE4cjhhOW04bzh1OG44dC4KKy5wYXJhMm1vCisucGFyYW1vdTIKKy5wYXJhbW91bjF0CisucGE4dDhoOW85ZzhlOG45aThjLgorLnA0YXRoCisucGF0NGhvCisucGF0aG80ZworLnBhdGhvMWdlNAorLnBhdGhvMWdlbgorLnBlOGU4djlpOHM4aC4KKy5wNGVlCisucGVlMXZpCisucGVldmlzMmgKKy5wZThlOHY5aThzOGg5bjhlOHM4cy4KKy5wZWV2aXMyaDFuCisucGVldmlzaDFuZXMKKy5wZWV2aXNobjJlMnNzCisucGU4bjl0OGE5ZzhvOG4uCisucGVuMXQKKy5wZW4xdGEKKy5wZW50YTJnbworLnBlbnRhZ28ybjIKKy5wZThuOXQ4YTlnOG84bjhzLgorLnBlbnRhZ28ybjNzMgorLnBlOXQ4cjhvOWw4ZTl1OG0uCisucGV0cm9sNGV1CisucGg4ZTluOG84bTllOW44bzhuLgorLnBoNGUzbm8KKy5waGUybgorLnBoZW5vMm1lCisucGhlbm8xbWVuCisucGhlbm9tNGVubworLnBoZW5vbWVubzRuCisucGg4ZThuOHk4bDlhOGw4YTluOGk4bjhlLgorLnBoZW55M2xhCisucGhlbnlsYWxhMm4KKy5waGVueWxhbGE1bjJpbmUKKy5waGVueWxhbGFuMWluCisucGg4aTlsOGE4dDllOWw4aThzOHQuCisucGhpNGxhdGVsMmk0CisucGhpbGF0ZTJsaXMKKy5waDhpOWw4YTh0OWU5bDhpOHM4dDhzLgorLnBoaWxhdGVsaXM0dDFzMgorLnBoOG85bjhlOG04ZS4KKy4zcGhvbmUKKy5waG8ybgorLnBob25lMW1lCisucGg4bzluOGU4bThlOHMuCisucGhvbmUybWVzCisucGg4bzluOGU5bThpOGMuCisucGhvbmU1bWkKKy5waDhvOHM5cDhoOG84cjlpOGMuCisucGhvczFwCisucGhvc3BobzUKKy5waG9zcGhvNHIKKy5waDhvOXQ4bzlnOHI4YThwOGg4cy4KKy5waG8xdG8KKy5waG90bzJncgorLnBob3RvZ3JhNHA0aDFzMgorLnBoOG85dDhvOW84ZjhmOXM4ZTh0LgorLnBob3RvbzIKKy5waG90b280ZjFmCisucGhvdG9vZjJmM3MKKy5waThjOWE5ZDhvOHIuCisucGkxY2EKKy5waWNhMmQKKy5waWNhMWRvCisucGljYWQ0b3IKKy5waThjOWE5ZDhvOHI4cy4KKy5waWNhZG80cnMyCisucGk4cDhlOWw4aThuOGUuCisucDJpcAorLnBpcGU0CisucGlwZWwyaQorLnBpcGUxbDRpbmUKKy5waThwOGU5bDhpOG44ZThzLgorLnBpcGVsaTFuZXMKKy5waThwOGU5bDhpOG45aThuOGcuCisucGlwZWwyaW4zaQorLnBpcGVsaW4xaW4KKy5waXBlbGluaW40ZworLnBpOXI4YTluOGg4YThzLgorLnA0aXIKKy5waTFyYQorLnBpcmEybgorLnBpcmE0bjFoNAorLnBpcmFuaGE0CisucGw4YThjOGE5YjhsOGUuCisuMXAybDIKKy5wbGExY2EKKy5wbGFjYTFiMmwyCisucGw4YThuOHQ5aDhvOHA5cDhlOHIuCisuM3BsYTJuCisucGxhbjF0CisucGxhbnRobzRwMXAKKy5wbGFudGhvcDJwZQorLnBsYW50aG9wM3BlcgorLnBsOGE4bjh0OWg4bzhwOXA4ZThyOHMuCisucGxhbnRob3BwZTRyMXMyCisucGw4ZThhOHM5YThuOGM4ZS4KKy5wbGUyYQorLnBsZWFzYTIKKy5wbGVhM3NhbmMKKy5wbGVhc2EybgorLnBsOHU4ZzlpOG4uCisucGx1ZzVpbgorLnBsOHU4ZzlpOG44cy4KKy5wbHU1ZzRpMm4xczIKKy5wbzhsOXQ4ZThyOWc4ZThpOHM4dC4KKy5wbzRsMnQKKy5wb2wxdGUKKy5wb2x0ZXJnMgorLnBvbHRlcmdlaTIKKy5wbzhsOHk5ZThuOGUuCisucG8ybHkKKy5wbzhsOHk5ZTh0OGg5eThsOWU4bjhlLgorLnBvbHllNHQKKy5wbzlsOHk4ZzlhOW04aThzOHQuCisucG9seTFnYQorLnBvbHkyZ2FtCisucG9seWdhbTJpcworLnBvOWw4eThnOWE5bThpOHM4dDhzLgorLnBvbHlnYW1pczR0MXMyCisucG84bDh5OGc5bzhuOWk5ejhhOXQ4aThvOG4uCisucG9seTFnbworLnBvbHlnbzJuMgorLnBvbHlnbzNuaQorLnBvbHlnb25pemExCisucG9seWdvbml6YTF0MmlvCisucG9seWdvbml6YXRpbzJuCisucG85bDh5OHA4aDlvOW44bzh1OHMuCisucG9seXBobzJuCisucG9seXBobzFub3UyCisucG9seXBob25vMnVzCisucG84bDh5OXM4dDh5OHI4ZThuOGUuCisucG8ybHlzNAorLnBvbHlzMXQKKy5wb2x5czJ0eQorLnBvOG04ZTlnOHI4YThuOWE4dDhlLgorLnBvMm1lCisucG9tZTJnCisucG9tZTFncgorLnBvbWVncmEybjIKKy5wb21lZ3JhMW5hCisucG9tZWdyYW4yYXQKKy5wbzhyOG85ZThsOGE4czl0OGk4Yy4KKy4xcDRvcgorLnBvcm80ZQorLnBvcm80ZWwKKy5wb3JvZTFsYQorLnBvcm9lbGFzdDJpCisucG9yb2VsYXMxdGljCisucG84cjlvOHU4cy4KKy5wb3JvdTIKKy5wb3JvMnVzCisucG84cjl0OGE5YjhsOGUuCisucG9yMXRhCisucG9yMnRhYgorLnBvcnRhYjJsMgorLnBvOHM4dDlhOG05YjhsOGUuCisuMXBvcworLnBvczJ0YQorLnBvc3RhNG0xYgorLnBvc3RhbWIybDIKKy5wbzhzOHQ5YThtOWI4bDhlOHMuCisucG9zdGFtYmxlczIKKy5wbzhzOHQ5aDh1OW04bzh1OHMuCisucG9zdGh1MW1vCisucG9zdGh1M21vMnVzCisucG9zdGh1bW91MgorLnBvOHM4dDlzOGM4cjhpOHA4dC4KKy5wb3M0dDFzMgorLnBvc3Q0c2MKKy5wb3N0c2NyaTIKKy5wb3N0c2NyMmlwCisucG9zdHNjcmkycDF0CisucG84czh0OXM4YzhyOGk4cDh0OHMuCisucG9zdHNjcmlwNHQxczIKKy5wbzhzOXQ4dThyOWE4bC4KKy5wb3MxdHUKKy5wb3N0dTFyYQorLnByOGU5YThtOWI4bDhlLgorLnByZWE0bTFiCisucHJlYW1iMmwyCisucHI4ZTlhOG05YjhsOGU4cy4KKy5wcmVhbWJsZXMyCisucHI4ZTlsOG84YThkOGU4ZC4KKy5wcmVsNG9hCisucHJlbG9hMmQzCisucHJlbG9hMmQxZWQKKy5wcjhlOXA4YThyOWk4bjhnLgorLnByZTJwYQorLnByZXA0YTRyMWkKKy5wcmVwMmEycgorLnByZXBhcmluNGcKKy5wcjhlOXA4cjhpOG44dC4KKy5wcjJlcHIyCisucHJlcHJpbjR0MworLnByOGU5cDhyOGk4bjh0OHMuCisucHJlcHJpbjR0NHMyCisucHI4ZTlwOHI4bzhjOGU4czlzOG84ci4KKy5wcmUzcHJvCisucHJlcHIyb2MKKy5wcmVwcm8xY2UKKy5wcmVwcm9jMmUyc3MKKy5wcmVwcm9jZXMxc28KKy5wcjhlOXA4cjhvOGM4ZThzOXM4bzhyOHMuCisucHJlcHJvY2Vzc280cnMyCisucHI4ZTlzOHA4bDhpOHQ5dDhpOG44Zy4KKy5wcmUxc3AKKy5wcmVzMXAybDIKKy5wcmVzcGwxaXQKKy5wcmVzcGw0aTR0M3QyCisucHJlc3BsaXQydDFpbgorLnByOGU5dzhyOGE4cC4KKy5wcmV3cmE0CisucHI4ZTl3OHI4YThwOHA4ZThkLgorLnByZXdyYTRwMXAKKy5wcmV3cmFwMnBlCisucHJld3JhcDRwMmVkCisucHI4aThlOHM4dDllOHM4czhlOHMuCisuNXByMmk0ZTQKKy5wcmkxZXN0CisucHJpZXM0dDJlMnNzCisucHJpZXN0ZXNzMWU0cworLnByOGU4dDl0OHk5cDhyOGk4bjl0OGU4ci4KKy5wcmU0dDN0MgorLnByZXQxdHkKKy5wcjJldHR5cHIyCisucHJldHR5cHJpbjR0MworLnByOGU4dDl0OHk5cDhyOGk4bjl0OGk4bjhnLgorLnByZXR0eXByaW50MmkKKy5wcmV0dHlwcmluNHQzaW5nCisucHJldHR5cHJpbjJ0MWluCisucHI4bzljOGU5ZDh1OHI5YThsLgorLnByMm9jCisucHJvMWNlCisucHJvY2UxZHUKKy5wcm9jZWR1MXJhCisucHI4bzhjOGU4czhzLgorLnByb2MyZTJzcworLnByOG85Yzh1OHI5YThuOGM4ZS4KKy5wcm9jdTFyYQorLnByb2N1cmEybgorLnByOG84ZzllOW44aThlOHMuCisucHJvMWdlCisucHJvMWdlbgorLnByb2dlNW4yaWU0CisucHI4bzhnOWU5bjh5LgorLnBybzRnZW55CisucHI4bzlnOHI4YThtOW04YThiOGw4ZS4KKy5wcm8xZ3IKKy5wcm9ncmFtMW0KKy5wcm9ncmFtMW1hCisucHJvZ3JhbTJtYWIKKy5wcm9ncmFtbWFiMmwyCisucHI4bzhtOWk5bjhlOG44dC4KKy5wcm9tNGkKKy5wcm9tMWluCisucHJvbTJpbmUKKy5wcm9taTFuZW4KKy5wcm9taW5lbjF0CisucHI4bzltOGk4czljOHU5bzh1OHMuCisucHJvbTJpcworLnByb20yaXMxYworLnByb21pczFjdQorLnByb21pc2N1MW91MgorLnByb21pc2N1bzJ1cworLnByOG84bTlpOHM5czhvOHI4eS4KKy5wcm9tNGkyczFzCisucHJvbWlzMXNvCisucHJvbWlzc28xcnkKKy5wcjhvOG05aThzOGUuCisucHJvbTRpc2UKKy5wcjhvOG05aThzOGU4cy4KKy5wcm9taXMxZTRzCisucHI4bzlwOGU4bDlsOGU4ci4KKy5wcm8zcGVsCisucHJvcGVsMWwKKy5wcm9wZWwybGUKKy5wcjhvOXA4ZThsOWw4ZThyOHMuCisucHJvcGVsbGU0cjFzMgorLnByOG85cDhlOGw5bDhpOG44Zy4KKy5wcm9wZWxsMmkKKy5wcm9wZWwybGluNAorLnByOG85aDhpOGI5aTl0OGk4djhlLgorLnBybzFoMgorLnByb2hpYmkydAorLnByb2hpYmkxdGkKKy5wcm9oaWJpMXQyaXYKKy5wcjhvOWg4aThiOWk5dDhpOHY4ZTlsOHkuCisucHJvaGliaXRpdjRlMWx5CisucHI4bzlzOGM4aTh1OHQ5dDhvLgorLnByb3MyYworLnByb3MxY2kKKy5wcm9zY2kxdQorLnByb3NjaXU0dDN0MgorLnByb3NjaXV0NXRvCisucHI4bzl0OGU4czh0OWU4ci4KKy5wcm8xdAorLnBybzR0ZXMKKy5wcjhvOXQ4ZThzOHQ5ZThyOHMuCisucHJvdGVzdGU0cjFzMgorLnByOG85dDhlOHM5dDhvOHIuCisucHJvdDRlczJ0bworLnByOG85dDhlOHM5dDhvOHI4cy4KKy5wcm90ZXN0bzRyczIKKy5wcjhvOXQ4bzlsOGE4bjlnOHU4YThnOGUuCisucHJvMXRvCisucHJvdG8xbGEKKy5wcm90bzRsYTJuCisucHJvdG9sMmFuZworLnByb3RvbGFuMWd1CisucHJvdG9sYW5ndTRhCisucHI4bzl0OG85dDh5OHA5YThsLgorLnByb3RvMXR5CisucHJvdG90eTFwYQorLnByb3RvdHlwNGFsCisucHI4bzh2OWk4bjhjOGUuCisucHJvdjFpbgorLnByb3YyaW5jCisucHI4bzh2OWk4bjhjOGU4cy4KKy5wcjhvOXY4aThuOWM4aThhOGwuCisucHJvdmluMWNpCisucHJvdmluM2MyaTFhCisucHJvdmluY2kyYWwKKy5wcjhvOHc5ZThzOHMuCisucHJvdzJlMnNzCisucHM4ZTh1OWQ4bzlkOGk4ZjlmOGU4cjllOG45dDhpOGE4bC4KKy4ycDFzMgorLnAyc2UKKy5wczRldQorLnBzZXUxZG8KKy5wc2V1ZG9kMWlmCisucHNldWRvZGk0ZjFmCisucHNldWRvZGlmZmVyMQorLnBzZXVkb2RpZmZlcjNlbjF0CisucHNldWRvZGlmZmVyZW50MmkKKy5wc2V1ZG9kaWZmZXJlbjF0MmkxYQorLnBzZXVkb2RpZmZlcmVudGkyYWwKKy5wczhlOHU5ZDhvOWY4aTluOGk4dDhlLgorLnBzZXUyZDVvZgorLnBzZXVkbzJmaQorLnBzZXVkbzJmaW4KKy5wc2V1ZG9mMmluaQorLnBzZXVkb2ZpbjJpdAorLnBzZXVkb2ZpbjJpdGUKKy5wczhlOHU5ZDhvOWY4aTluOGk4dDhlOWw4eS4KKy5wc2V1ZG9maW5pdGUxbHkKKy5wczhlOHU5ZDhvOWY4bzhyOGM4ZThzLgorLnBzZXVkbzFmbworLnBzZXVkb2ZvMnIKKy5wc2V1ZG9mb3IxYworLnBzZXVkb2ZvcjJjZQorLnBzOGU4dTlkOG84ZzlyOGE5cDhoOGU4ci4KKy5wc2V1ZDRvZworLnBzZXVkbzFncgorLnBzZXVkb2c1cmEzcGg0ZXIKKy5wczhlOHU5ZDhvOWc4cjhvOHU4cC4KKy5wc2V1ZG80ZzRybworLnBzZXVkb2dyb3UyCisucHM4ZTh1OWQ4bzlnOHI4bzh1OHA4cy4KKy5wc2V1ZG9ncm91MnAxczIKKy5wczhlOHU5ZDhvOW44eThtLgorLnBzZXU0ZG8ybgorLnBzZXVkb255bTQKKy5wczhlOHU5ZDhvOW44eThtOHMuCisucHNldWRvbnk0bTFzMgorLnBzOGU4dTlkOG85dzhvOHI4ZC4KKy5wc2V1ZG80d28yCisucHM4ZTh1OWQ4bzl3OG84cjhkOHMuCisucHNldWRvd29yMmQxczIKKy5wczh5OWM4aDhlOWQ4ZThsOWk4Yy4KKy5wczR5CisucDRzeTFjCisucHN5M2NoCisucHN5Y2g0ZTIKKy5wc3k0Y2g0ZWQKKy5wc3ljaGVkZWwyaQorLnBzOHk4YzhoOHMuCisucHN5YzRoMXMyCisucHU5YjhlOHM5YzhlOG44YzhlLgorLnB1YjMKKy5wdWI0ZQorLnB1NGJlczQKKy5wdWJlczJjCisucHViZXMxY2VuCisucHViZXMzY2VuYworLnF1OGE4ZDlkOGk4bjhnLgorLnF1MgorLnF1YTJkCisucXVhZDRkMWluCisucXVhZDFkNAorLnF1OGE5ZDhyOGE4dDlpOGMuCisucXVhMWRyCisucXVhZHJhdDFpYworLnF1OGE5ZDhyOGE4dDlpOGM4cy4KKy5xdWFkcmF0aTRjM3MyCisucXU4YThkOXI4YTl0OHU4cjhlLgorLnF1YWRyYTJ0dQorLnF1YWRyYTN0dXJlCisucXU4YThkOXI4aTlwOGw4ZThnOWk4Yy4KKy5xdWFkcmkycDJsMgorLnF1YWRyMmlwCisucXVhZHJpcGxlZzRpYworLnF1OGE4aThuOHQ5ZThyLgorLnF1YWkyCisucXVhNGk0bgorLnF1YWluMXQKKy5xdThhOGk4bjh0OWU4czh0LgorLnF1OGE5czhpOWU4cTh1OGk4djlhOWw4ZThuOGM4ZS4KKy5xdWFzMmllNAorLnF1YXNpZTFxCisucXUyYXNpZXF1MgorLnF1YXNpZXEydWkyCisucXVhc2llcXUyaXYzCisucXVhc2llcXVpMXZhCisucXVhc2llcXVpdjJhbGUKKy5xdWFzaWVxdWl2YTNsZW5jCisucXU4YTlzOGk5ZThxOHU4aTh2OWE5bDhlOG44YzhlOHMuCisucXU4YTlzOGk5ZThxOHU4aTh2OWE5bDhlOG44dC4KKy5xdWFzaWVxdWl2YTFsZW4xdAorLnF1OGE5czhpOWg4eTlwOG85bjhvOHI5bThhOGwuCisucXVhc2kzaAorLnF1YXNpaHkzcG8KKy5xdWFzaWh5cG8ybgorLnF1YXNpaHlwb25vcjFtCisucXVhc2loeXBvbm9yMW1hCisucXU4YTlzOGk5cjhhOGQ5aTljOGE4bC4KKy5xdWFzNGkycgorLnF1YXNpMXI1YQorLnF1YXNpcmEyZAorLnF1YXNpcjJhZGkKKy5xdWFzaXJhZDNpMWNhCisucXU4YTlzOGk5cjhlOHM4aThkOXU4YThsLgorLnF1YXNpNHJlcworLnF1YXNpcmUxc2kKKy5xdWFzaXJlMnMyaWQKKy5xdWFzaXJlc2kyZHUKKy5xdWFzaXJlc2lkMXUxYQorLnF1OGE5czhpOXM4bThvOG84dDhoLgorLnF1YTFzaXMKKy5xdWFzaTJzMW0KKy5xdWFzaXMxbW8KKy5xdWFzaXNtb28yCisucXVhc2lzbW80b3RoCisucXU4YTlzOGk5czh0OGE5dDhpOG84bjlhOHI4eS4KKy5xdWFzaXMxdGEKKy5xdWFzaXN0YXRpb241YTJyCisucXVhc2lzdGExdDJpbworLnF1YXNpc3RhdGlvMm4KKy5xdWFzaXN0YXRpbzFuMWEKKy5xdThhOXM4aTl0OG84cDhvOHMuCisucXU1YTVzaTR0CisucXVhc2kxdG8KKy5xdWFzaXRvMXBvcworLnF1OGE5czhpOXQ4cjhpOWE4bjlnOHU5bDhhOHIuCisucXVhc2k1dHIyaTNhCisucXVhc2l0cmkyYTJuCisucXVhc2l0cmkyYW5nCisucXVhc2l0cmlhbjFndQorLnF1YXNpdHJpYW5ndTFsYQorLnF1YXNpdHJpYW5ndWwyYTJyCisucXU4YTlzOGk5dDhyOGk4djlpOGE4bC4KKy5xdWFzaXRyMmk0dgorLnF1YXNpdHJpdjNpCisucXVhc2l0cml2MmkxYQorLnF1YXNpdHJpdmkyYWwKKy5xdThpOG45dDhlOHM5czhlOG44YzhlLgorLnEydWkyCisucXVpNG4KKy5xdWluMXQKKy5xdWluNHQyZTJzcworLnF1aW50ZXM0c2VuYworLnF1OGk4bjl0OGU4czlzOGU4bjhjOGU4cy4KKy5xdThpOG45dDhlOHM5czhlOG45dDhpOGE4bC4KKy5xdWludGVzc2VuMXQKKy5xdWludGVzc2VudDJpCisucXVpbnRlc3NlbjF0MmkxYQorLnF1aW50ZXNzZW50aTJhbAorLnJhOGI5YjhpOHQ5cjh5LgorLjJyYWIKKy5yYTJiMWIKKy5yYWJiaTJ0CisucmFiYmkzdHIKKy5yYWJiaXQ1cnkKKy5yYTlkOGk5bzhnOXI4YTlwOGg4eS4KKy5yYTJkCisucjJhZGkKKy5yYTNkMmlvCisucmFkaW81ZworLnJhZGlvMmdyCisucmFkaW80ZzNyYTFwaHkKKy5yYThmOGY5aThzOGguCisucmFmNWZpCisucmEyZgorLnJhNGYxZjQKKy5yYWYyZjVpcworLnJhZmZpczJoCisucmE4ZjhmOWk4czhoOWw4eS4KKy5yYWZmaXM0aDFsNAorLnJhZmZpc2gxbHkKKy5yYThtOXM4aDhhOGM4azhsOGUuCisucmE0bTFzMgorLnJhbTRzMmgKKy5yYW1zaGFjazEKKy5yYW1zaGFjazFsCisucmE4djllOG45bzh1OHMuCisucmF2NGU0bm8KKy5yYXZlMW5vdTIKKy5yYXZlbm8ydXMKKy5yZTlhOHI4cjhhOG44ZzhlOW04ZThuOHQuCisucmU1YXIxcjQKKy5yZTJhMnIKKy5yZWFycmFuNGdlCisucmVhcnJhMm4KKy5yZWFycjJhbmcKKy5yZWFycmFuZ2UxbWUKKy5yZWFycmFuZ2UxbWVuCisucmVhcnJhbmdlM21lbjF0CisucmU5YThyOHI4YThuOGc4ZTltOGU4bjh0OHMuCisucmVhcnJhbmdlbWVuNHQ0czIKKy5yZThjOWk5cDhyOG84YzlpOXQ4aThlOHMuCisucmVjaXByb2NpMXRpCisucmVjaXByb2NpdDJpZTQKKy5yZThjOXQ4YThuOWc4bDhlLgorLnJlYzR0YTJuCisucmUyYzF0CisucmVjdDVhbmcKKy5yZWMxdGEKKy5yZWN0YW4xZ2wyCisucmVjdGFuMWdsZQorLnJlOGM5dDhhOG45ZzhsOGU4cy4KKy5yZWN0YW5nbGVzMgorLnJlOGM5dDhhOG45Zzh1OWw4YThyLgorLnJlY3RhbjFndQorLnJlY3Rhbmd1MWxhCisucmVjdGFuZ3VsMmEycgorLnJlOWQ4aTlyOGU4Yzh0LgorLjJyMmVkCisucjRlZGkKKy5yZWQ0aXIyCisucmVkaTFyZQorLnJlZGlyZTJjMXQKKy5yZTlkOGk5cjhlOGM4dDlpOG84bi4KKy5yZWRpcmVjMXQyaW8KKy5yZWRpcmVjdGlvMm4KKy5yZTlkOHU4YzlpOGI4bDhlLgorLnJlMWR1CisucmVkdTJjCisucmVkdWNpNGIKKy5yZWR1MWNpCisucmVkdWNpMWIybDIKKy5yZTllOGM4aDhvLgorLnJlZTJjCisucmVlMmNoCisucmVlM2NobzIKKy5yZTlwOGg4cjhhOHM4ZS4KKy5yZXA0aHI0CisucmVwaHIyYXMKKy5yZTlwOGg4cjhhOHM4ZThzLgorLnJlcGhyYXMxZTRzCisucmU5cDhoOHI4YThzOGU4ZC4KKy5yZXBocmE0czRlZAorLnJlOXA4bzlzOGk5dDhpOG84bi4KKy5yZTRwb3NpCisucmUxcG8KKy5yZTFwb3MKKy5yZXBvM3MyaTF0MmlvCisucmVwb3NpMXRpCisucmVwb3NpdGlvMm4KKy5yZTlwOG85czhpOXQ4aThvOG44cy4KKy5yZXBvc2l0aW8ybjNzMgorLnJlOXA4cjhpOG44dC4KKy5yZXByMgorLnJlcHJpbjR0MworLnJlOXA4cjhpOG44dDhzLgorLnJlcHJpbjR0NHMyCisucmU5czh0OG84cjlhOGI4bDhlLgorLnI0ZXMydG8KKy5yZXN0bzJyYQorLnJlc3RvMnJhYgorLnJlc3RvcmFiMmwyCisucmU4dDhyOG85ZjhpOHQuCisucmV0cm8yZmkKKy5yZTh0OHI4bzlmOGk4dDl0OGU4ZC4KKy5yZXRyb2Y0aTR0NHQyCisucmV0cm9maXQydDFlZAorLnJlOXU4czlhOGI4bDhlLgorLnI0ZXUyCisucmUydXM0CisucmV1c2EyCisucmV1MnMxYWIKKy5yZXVzYWIybDIKKy5yZTl1OHM4ZS4KKy5yZTl3OGk4cjhlLgorLnJld2kyCisucmV3NGlyNAorLnJlOXc4cjhhOHAuCisucmV3cmE0CisucmU5dzhyOGE4cDhwOGU4ZC4KKy5yZXdyYTRwMXAKKy5yZXdyYXAycGUKKy5yZXdyYXA0cDJlZAorLnJlOXc4cjhpOHQ4ZS4KKy5yZXdyaTQKKy5yZXdyMml0ZQorLnJoOGk5bjhvOGM5ZThyOW84cy4KKy5yaDQKKy5yaDJpMW5vCisucmhpNG5vNGMKKy5yaGlubzFjZQorLnJoaW5vYzJlcm8KKy5yaThnOGg4dDllOG84dThzLgorLnJpZ2gxdGVvCisucmlnaHRlb3UyCisucmlnaHRlbzJ1cworLnJpOGc4aDh0OWU4bzh1OHM5bjhlOHM4cy4KKy5yaWdodGVvdXMxbjQKKy5yaWdodGVvdXMxbmVzCisucmlnaHRlb3VzbjJlMnNzCisucmk4bjhnOWw4ZThhOGQ4ZThyLgorLnJpbjRnCisucmluZ2wyCisucmluMWdsZQorLnJpbmdsZTJhCisucmluZ2xlYTJkMQorLnJpOG44ZzlsOGU4YThkOGU4cjhzLgorLnJpbmdsZWFkZTRyNXMyCisucm85YjhvOHQuCisucm85YjhvOHQ4cy4KKy5yb2JvNHQxczIKKy5ybzliOG84dDhpOGMuCisucm85YjhvOHQ5aThjOHMuCisucm9ib3RpNGMzczIKKy5ybzh1OG44ZDl0OGE4YjhsOGUuCisucm91MgorLnJvdW4yZAorLnJvdW5kMXRhCisucm91bmQydGFiCisucm91bmR0YWIybDIKKy5ybzh1OG44ZDl0OGE4YjhsOGU4cy4KKy5yb3VuZHRhNWJsZXMyCisuc2E4bDhlOHM5YzhsOGU4cjhrLgorLnNhMgorLnMyYWxlCisuc2FsZXMyCisuc2FsZXMyYworLnNhbGVzY2xlNQorLnNhbGVzMWM0bDQKKy5zYThsOGU4czljOGw4ZThyOGs4cy4KKy5zYWxlc2NsZXI0azFzMgorLnNhOGw4ZThzOXc4bzhtOGE4bi4KKy5zYWxlczR3MgorLnNhbGU0czF3bzIKKy5zYWxlc3dvbTEKKy5zYWxlc3dvMW1hCisuc2FsZXN3b21hMm4KKy5zYThsOGU4czl3OG84bThlOG4uCisuc2FsZXN3bzJtZQorLnNhbGVzd28xbWVuCisuc2E4bDltOG85bjhlOGw5bDhhLgorLnM0YTJsNG0KKy5zYWxtbzJuNAorLnNhbDFtbworLnNhbG1vbjRlbGxhCisuc2FsbW9uZWwxbAorLnNhOGw5dDhhOXQ4aThvOG4uCisuc2E0bDR0Cisuc2FsMXRhCisuc2FsdGExdDJpbworLnNhbHRhdGlvMm4KKy5zYThyOXM4YTlwOGE4cjlpOGw5bDhhLgorLnMyYTJyCisuc2EycjRzYTIKKy5zYTRyczIKKy5zYXJzMWFwCisuczJhMnJzYXAyYTJyNAorLnNhcnNhMXBhCisuc2Fyc2FwNGE0cjFpCisuc2Fyc2FwYXJpbDFsCisuc2E4dThlOHI5azhyOGE4dTh0LgorLnNhdTQKKy5zYXVlcmtyYXU0dAorLnNjOGE4dDlvOWw4bzhnOWk5YzhhOGwuCisuczFjYQorLnNjYTF0bworLnNjYXRvM2xvZzFpYworLnNjYXRvbG9naTFjYQorLnNjOGg4ZThkOXU4bDlpOG44Zy4KKy5zMmNoMgorLnNjaGUyCisuczRjaDRlZAorLnNjaGU0ZHVsCisuc2NoZTFkdQorLnNjaGVkdWwyaQorLnNjaGVkdWwzaW5nCisuc2M4aDhpOHo5bzlwOGg4cjhlOG44aThjLgorLnNjaGkyegorLnNjaGkxem8KKy5zY2hpejJvcGgKKy5zY2hpem9wNGhyNAorLnNjOGg4bjhhOHU5ejhlOHIuCisuc2MyaDFuCisuc2NoMW5hCisuc2NobjJhdQorLnNjaG5hdTJ6NGUKKy5zY2huYXV6MWVyCisuc2M4aDhvOG84bDljOGg4aThsOGQuCisuczRjaG8yCisuc2Nob28yCisuc2Nob280bDFjMgorLnMyY2hvb2wyY2gKKy5zY2hvb2xjaDRpbDIKKy5zY2hvb2xjaGkybGQKKy5zYzhoOG84bzhsOWM4aDhpOGw4ZDlyOGU4bi4KKy5zY2hvb2xjaGlsM2RyCisuc2Nob29sY2hpbGRyZTQKKy5zY2hvb2xjaGlsNWRyZW4KKy5zYzhoOG84bzhsOXQ4ZThhOGM4aDhlOHIuCisuc2Nob280bDJ0Cisuc2Nob29sMXRlCisuczJjaG9vbHRlYTJjaAorLnNjaG9vbHRlYWNoZTIKKy5zYzhoOG84bzhsOXQ4ZThhOGM4aDllOHI4cy4KKy5zY2hvb2x0ZWFjaDNlNHIxczIKKy5zYzhyOHU5dDhpOW44eS4KKy5zY3J1MnQxaTVuCisuc2NyNHUxdDJpCisuc2NydXQ0aW55Cisuc2M4eTh0OGg5aThuOGcuCisuczFjeQorLnNjeTN0aGluCisuc2U4bDhsOWU4ci4KKy5zZWwybGUKKy5zZThsOGw5ZThyOHMuCisuc2VsbGU0cjFzMgorLnNlOGM5cjhlOXQ4YThyOWk4YTh0LgorLnNlMWNyCisuc2U0YzNyZTF0YQorLnNlY3JldDJhMnIKKy5zZWNyZXRhcjFpCisuc2VjcmV0YXIyaTNhCisuc2U4YzlyOGU5dDhhOHI5aThhOHQ4cy4KKy5zZWNyZXRhcmlhNHQxczIKKy5zZThtOWE5cDhoOG84cjhlLgorLnNlMW1hCisuc2U0bWFwCisuc2VtYXBobzRyCisuc2U4bTlhOXA4aDhvOHI4ZThzLgorLnNlOW04ZThzOXQ4ZThyLgorLjRzZTFtZQorLnNlMm1lcworLnNlOG04aTlkOGU4ZjlpOW44aTh0OGUuCisuc2VtMmlkCisuc2VtaWRlMWYKKy5zZW1pZGVmNWk1bjJpdGUKKy5zZW1pZGUxZmkKKy5zZW1pZGUyZmluCisuc2VtaWRlZjJpbmkKKy5zZW1pZGVmaW4yaXQKKy5zZThtOGk5ZDhpOXI4ZThjOHQuCisuc2VtaTJkaQorLnNlbWlkNGlyMgorLnNlbWlkaTFyZQorLnNlbWlkaXJlMmMxdAorLnNlOG04aTloOG85bThvOXQ4aDhlOHQ5aThjLgorLnNlbWkzaAorLnNlbWlobzFtbworLnNlbWlob200b3RoMworLnNlbWlob21vdGgyZQorLnNlbWlob21vM3RoZTR0Cisuc2VtaWhvbW90aGV0MWljCisuc2U4bThpOXI4aThuOGcuCisuc2VtNGlyCisuc2VtaXIxaQorLnNlbWlyaW40ZworLnNlOG04aTlyOGk4bjhnOHMuCisuc2VtaXJpbmdzMgorLnNlOG04aTlzOGk4bTlwOGw4ZS4KKy5zZTRtMmlzCisuc2VtaXNpNG0xcAorLnNlbWlzaW0xcDJsMgorLnNlOG04aTlzOGs4aThsOGw4ZThkLgorLnNlbTRpczRrMgorLnNlbWlzazFpCisuc2VtaXNrNGlsMWwKKy5zZW1pc2tpbDJsZQorLnNlOHI4bzllOHA4aTlkOGU5bThpOW85bDhvOGc5aTljOGE4bC4KKy5zMmVyNG8KKy5zZXJvNGUKKy5zZXJvZXA0aWQKKy5zZXJvZXBpM2RlCisuc2Vyb2VwaWQ0ZW0KKy5zZXJvZXBpZGVtMmlvCisuc2Vyb2VwaWRlbWkxb2wKKy5zZXJvZXBpZGVtaW8zbG9nMWljCisuc2Vyb2VwaWRlbWlvbG9naTFjYQorLnNlOHI5djhvOW04ZThjOGg5YThuOGk4czhtLgorLjRzZXIzdm8KKy5zZXJ2bzJtZQorLnNlcnZvbWUyY2gKKy5zZXJ2b21lY2g1YTVuaXMKKy5zZXJ2b21lY2hhMm4KKy5zZXJ2b21lY2hhbmkyczFtCisuc2U4cjl2OG85bThlOGM4aDlhOG44aThzOG04cy4KKy5zZXJ2b21lY2hhbjRpczRtMXMyCisuc2U4czlxOHU4aTlwOGU5ZDhhOWw4aThhOG4uCisuczFlNHMKKy5zZXNxdTIKKy5zZXNxMnVpMgorLnNlc3F1MmlwCisuc2VzcXVpcGU0Cisuc2VzcXVpMnAyZWQKKy5zZXNxdWlwMmUyZDJhCisuc2VzcXVpcGVkYWwxaQorLnNlc3F1aXBlZGFsMmkxYQorLnNlc3F1aXBlZGFsaTJhMm4KKy5zZTh0OXU4cC4KKy5zZTF0dQorLnNlOHQ5dThwOHMuCisuc2V0dTJwMXMyCisuc2U5djhlOHI4ZTlsOHkuCisuNXNldgorLnNldjFlcgorLnNldjRlcmVsCisuc2V2ZXJlMWx5Cisuc2g4YThwOGU5YThiOGw4ZS4KKy5zaGEzcGU0YQorLnNoYXBlMWE0YgorLnNoYXBlYWIybDIKKy5zaDhvOGU5czh0OHI4aThuOGcuCisuc2hvNAorLnNobzJlc3Q0cgorLnNob2VzdHJpbjRnCisuc2g4bzhlOXM4dDhyOGk4bjhnOHMuCisuc2hvZXN0cmluZ3MyCisuc2k4ZDhlOXM4dDhlOHAuCisuNXNpZGU0czIKKy5zMmlkCisuc2lkZXN0ZTRwCisuc2k4ZDhlOXM4dDhlOHA4cy4KKy5zaWRlc3RlMnAxczIKKy5zaThkOGU5czh3OGk4cDhlLgorLnNpZGVzNHcyCisuc2lkZXN3aTIKKy5zaWRlc3cyaXAKKy5zaWRlc3dpcGU0Cisuc2s4eTlzOGM4cjhhOHA4ZThyLgorLnNrMgorLnNreXM0YworLnNreXNjcmFwM2VyCisuc2s4eTlzOGM4cjhhOHA4ZThyOHMuCisuc2t5c2NyYXBlNHIxczIKKy5zbThvOGs4ZTlzOHQ4YThjOGsuCisuMnMxbQorLnMxbW8KKy5zNG0yb2sKKy5zbW9rZXM0Cisuc21va2VzMXRhCisuc21va2VzdGFjazEKKy5zbThvOGs4ZTlzOHQ4YThjOGs4cy4KKy5zbW9rZXN0YWM0azFzMgorLnNuOG84cjlrOGU4bDlpOG44Zy4KKy5zMW40Cisuc25vcmtlNWwyaQorLnNub3JrZTRsM2luZworLnNvOWw4ZTluOG84aThkLgorLjFzbworLnNvbDRlbm8KKy5zb2xlbm9pMgorLnNvbGVubzJpZAorLnNvOWw4ZTluOG84aThkOHMuCisuc29sZW5vaTJkMXMyCisuc284bDh1OHQ4ZS4KKy5zbzFsdXQKKy5zbzhsOHU4dDhlOHMuCisuc284djllOHI5ZThpOGc4bi4KKy40c292Cisuc292ZXJlaTIKKy5zb3ZlcmUyaWcyCisuc284djllOHI5ZThpOGc4bjhzLgorLnNvdmVyZWlnMm4xczIKKy5zcDhhOWM4ZThzLgorLjJzMXBhCisuc3BhNGNlCisuc3A4ZTljOGk4bzh1OHMuCisuc3BlMmMKKy5zcGUxYzJpCisuc3BlYzJpbworLnNwZWNpb3UyCisuc3BlY2lvMnVzCisuc3A4ZThsOGw5ZThyLgorLnNwZWwxbAorLnNwZWwybGUKKy5zcDhlOGw4bDllOHI4cy4KKy5zcGVsbGU0cjFzMgorLnNwOGU4bDhsOWk4bjhnLgorLnNwZWxsMmkKKy5zcGVsMmxpbjQKKy5zcDhlOWw4dThuOGs5ZThyLgorLnNwZWx1NG5rMgorLnNwZWx1bmsxZXIKKy5zcDhlOG44ZDl0OGg4cjhpOGY4dC4KKy5zcGVuNGQKKy5zcGVuZDJ0aAorLnNwZW5kdDRocjQKKy5zcGVuZHRocjRpMmZ0Cisuc3A4aDhlOHI5bzhpOGQuCisuczJwaGUKKy4zc3BoNGVyCisuc3BoMmVybworLnNwaGVyb2kyCisuc3BoZXJvMmlkCisuc3A4aDhlOHI5bzhpOGQ5YThsLgorLnNwaGVyb2kxZDJhCisuc3A4aDhpOG45ZzhlOHMuCisuc3BoNWluZworLnNwaDRpbmdlCisuc3A4aThjOWk5bDh5LgorLnNwMmkxY2kKKy5zcGljaTFseQorLnNwOGk4bjlvOHI4cy4KKy5zcGkybgorLnNwNGkxbm8KKy5zcGlubzRyczIKKy5zcDhvOGs4ZThzOXc4bzhtOGE4bi4KKy5zcDJvaworLnNwb2tlczQKKy5zcG9rZXM0dzIKKy5zcG9rZTRzMXdvMgorLnNwb2tlc3dvbTEKKy5zcG9rZXN3bzFtYQorLnNwb2tlc3dvbWEybgorLnNwOG84azhlOHM5dzhvOG04ZThuLgorLnNwb2tlc3dvMm1lCisuc3Bva2Vzd28xbWVuCisuc3A4bzhyOHQ4czljOGE4czh0LgorLnMxcDRvcjQKKy5zcG9yNHQxczIKKy5zcG9ydDRzYworLnNwb3J0czFjYQorLnNwOG84cjh0OHM5YzhhOHM4dDllOHIuCisuc3BvcnRzY2FzdDVlcgorLnNwOG84cjl0OGk4djhlOWw4eS4KKy5zcG9yMXRpCisuc3BvcjR0Mml2Cisuc3BvcnRpdjRlMWx5Cisuc3A4bzhyOHQ4czl3OGU4YThyLgorLnNwb3J0NHN3MgorLnNwb3J0c3dlMmEycgorLnNwOG84cjh0OHM5dzhyOGk4dDhlOHIuCisuc3BvcnRzd3JpNAorLnNwb3J0c3dyMml0ZQorLnNwOG84cjh0OHM5dzhyOGk4dDhlOHI4cy4KKy5zcG9ydHN3cml0NWU0cjFzMgorLnNwOHI4aThnOGg4dDlsOGk4ZThyLgorLnNwcjIKKy5zcHIyaWcKKy5zcHJpZ2gydGwKKy5zcHJpZ2h0bDJpZTQKKy5zcTh1OGU4YTltOGk4czhoLgorLnNxdTIKKy5zcXVlYW0yaXMKKy5zcXVlYW1pczJoCisuc3Q4YThuOGQ5YThsOG84bjhlLgorLjVzdDRhbmQKKy5zdGEybgorLnN0YW4xZDJhCisuc3RhbmRhbG8ybgorLnN0OGE4cjl0OGw4aThuOGcuCisuc3QyYTJyCisuc3RhcjJ0bAorLnN0OGE4cjl0OGw4aThuOGc5bDh5LgorLnN0YXJ0bGluZ2wyCisuc3RhcnRsaW5nMWx5Cisuc3Q4YTl0OGk4czl0OGk4YzhzLgorLnN0YXRpczF0MmkKKy5zdGF0aXMxdGljCisuc3RhdGlzdGk0YzNzMgorLnN0OGU4YThsOHQ4aDlpOGw4eS4KKy5zdGVhNGwKKy5zdGVhNGx0Cisuc3RlYWx0aDNpCisuc3RlYWw0dGg0aWwyCisuc3RlYWx0aGkxbHkKKy5zdDhlOGU4cDhsOGU5YzhoOGE4czhlLgorLnMxdGVlCisuc3RlZTRwMQorLnN0ZWUxcDJsMgorLnN0ZWVwbGUyY2gKKy5zdDhlOHI4ZThvOWc4cjhhOHA4aDlpOGMuCisuc3RlcmUxbworLnN0ZXJlbzJnCisuc3RlcmVvMWdyCisuc3RlcmVvNWdyYXBoMWljCisuc3RlcmVvZ3I0YXBoaQorLnN0OG85YzhoOGE4czl0OGk4Yy4KKy5zMXRvCisuc3RvMmNoNAorLnN0b2NoYXN0MmkKKy5zdG9jaGFzMXRpYworLnN0OHI4YThuOGc4ZTluOGU4czhzLgorLnN0NHIKKy5zMXRyYQorLnN0cmFuNGdlCisuc3RyYTJuCisuc3RyMmFuZworLnN0cmFuZ2U0bjRlCisuc3RyYW4xZ2VuCisuc3RyYW5nZTFuZXMKKy5zdHJhbmdlbjJlMnNzCisuc3Q4cjhhOHA5aDhhOG44ZzhlOHIuCisuc3RyYXBoMmFuNGcKKy5zdHJhcGhhbmc1ZXIKKy5zdHJhcGhhMm4KKy5zdDhyOGE4dDlhOWc4ZThtLgorLnN0cmEydGEKKy5zdDhyOGE4dDlhOWc4ZThtOHMuCisuc3RyYXRhZ2U0bTFzMgorLnN0OHI4ZTh0OGM4aDlpOWU4ci4KKy5zdHJlNHRjCisuc3RyZXQ0Y2gKKy5zdHJldGNoMmllNAorLnN0OHI4aThwOXQ4ZThhOHM4ZS4KKy5zdHIyaXAKKy5zdHJpMnAxdAorLnN0cmlwMnRlCisuc3Q4cjhvOG44ZzloOG84bDhkLgorLnN0cm8ybgorLnN0cm9uZ2hvMmwyZAorLnN0OHI4bzhuOGc5ZThzOHQuCisuc3Q4dTlwOGk4ZDllOHIuCisuczF0dQorLnN0dXA0aWQKKy5zdHVwaTNkZQorLnN0OHU5cDhpOGQ5ZThzOHQuCisuc3R1cGlkZTRzMgorLnN1OGI5ZDhpOGY5ZjhlOHI5ZThuOXQ4aThhOGwuCisuMXN1Cisuc3U0YjMKKy5zdTRiMWQKKy5zdWJkMWlmCisuc3ViZGk0ZjFmCisuc3ViZGlmZmVyMQorLnN1YmRpZmZlcjNlbjF0Cisuc3ViZGlmZmVyZW50MmkKKy5zdWJkaWZmZXJlbjF0MmkxYQorLnN1YmRpZmZlcmVudGkyYWwKKy5zdThiOWU4eDlwOHI4ZThzOXM4aThvOG4uCisuc3ViNGUKKy5zdWIxZXgzcAorLnN1YmV4cHIyCisuc3ViZXgzcHIyZTJzcworLnN1YmV4cHJlczFzaQorLnN1YmV4cHJlczFzMmlvCisuc3ViZXhwcmVzNXNpbzJuCisuc3U4YjllOHg5cDhyOGU4czlzOGk4bzhuOHMuCisuc3ViZXhwcmVzc2lvMm4zczIKKy5zdThtOW04YTliOGw4ZS4KKy5zdTJtCisuc3VtMW0KKy5zdW0xbWEKKy5zdW0ybWFiCisuc3VtbWFiMmwyCisuc3U4cDhlOHI5ZThnOG8uCisuc3UxcGUKKy5zdXBlcmUxZ28KKy5zdThwOGU4cjllOGc4bzhzLgorLnN1cGVyZTRnb3MKKy5zdTlwOHI4ZThtOWE5YzhpOHM4dC4KKy5zdXByMgorLnN1cHJlNG1hYworLnN1cHJlMW1hCisuc3VwcmVtNGEyY2kKKy5zdTlwOHI4ZThtOWE5YzhpOHM4dDhzLgorLnN1cHJlbWFjaXM0dDFzMgorLnN1OHI5djhlOGk4bDlsOGE4bjhjOGUuCisuc3UycgorLnN1cnY0ZQorLnN1cnZlaTIKKy5zdXJ2ZWlsMWwKKy5zdXJ2ZWlsbGEybgorLnN3OGk4bTltOGk4bjhnOWw4eS4KKy5zdzIKKy5zd2kyCisuc3dpbTFtCisuc3dpbW00aW5nbDIKKy5zd2ltbTVpbmcxbHkKKy5zeThtOHA5dDhvOW04YTh0OGk4Yy4KKy5zeTRtMXAKKy5zeW0ycDF0Cisuc3ltcDF0bworLnN5bXB0bzJtYQorLnN5bXB0b21hdDFpYworLnN5OG45YzhoOHI4bzltOGU4czhoLgorLnN5bjNjNGhyNAorLnN5bjJjaAorLnN5bmNocm8ybWUKKy5zeW5jaHJvMm1lcworLnN5bmNocm9tNGVzMmgKKy5zeThuOWM4aDhyOG85bjhvOHU4cy4KKy5zeW5jaHJvMm4KKy5zeW5jaHJvMW5vdTIKKy5zeW5jaHJvbm8ydXMKKy5zeThuOWM4aDhyOG85dDhyOG84bi4KKy5zeW5jaHJvdHJvMm4KKy50YThmOGY5cjhhOGk4bC4KKy40dGEyZjQKKy50YTRmMWY0CisudGFmZnIyYWkyCisudGE4bDhrOWE5dDhpOHY4ZS4KKy50YTJsCisuNHRhbGsKKy50YWxrYTMKKy50YWxrYTR0CisudGFsa2ExdDJpdgorLnRhOXA4ZThzOXQ4cjh5LgorLnRhcDJlc3Q0cgorLnRhcGU0c3RyeQorLnRhOXA4ZThzOXQ4cjhpOGU4cy4KKy50YXBlc3RyMmllNAorLnRhOHI5cDhhOHU5bDhpOG4uCisudDJhMnIKKy50YXIycAorLnRhcjFwYQorLnRhcnBhdTRsMgorLnRhcnBhdWwyaQorLnRhOHI5cDhhOHU5bDhpOG44cy4KKy50YXJwYXVsMmkybjFzMgorLnRlOWw4ZThnOXI4YTlwOGg4ZThyLgorLnRlbGUxZ3IKKy50ZWxlZzVyYTNwaDRlcgorLnRlOWw4ZThnOXI4YTlwOGg4ZThyOHMuCisudGVsZWdyYXBoZTRyMXMyCisudGU4bDhlOWs4aTluOGU4dDlpOGMuCisudGVsZWtpNG4KKy50ZWxlazFpCisudGVsZWsyaW5lCisudGVsZWtpM25ldDFpYworLnRlOGw4ZTlrOGk5bjhlOHQ5aThjOHMuCisudGVsZWtpbmV0aTRjM3MyCisudGU4bDhlOXI4bzliOG84dDlpOGM4cy4KKy50ZTRsMWVyCisudGVsNGVybworLnRlbGVyNW9iCisudGVsZXJvYm90aTRjM3MyCisudGU4bDhsOWU4ci4KKy50ZWwxbAorLnRlbDJsZQorLnRlOGw4bDllOHI4cy4KKy50ZWxsZTRyMXMyCisudGU4bTlwOG85cjhhOHI5aThsOHkuCisudGU0bTFwCisudGVtMXA0b3IKKy50ZW1wbzFyYQorLnRlbXBvNHJhcmlsCisudGVtcG9yMmEycgorLnRlbXBvcmFyMWkKKy50ZW1wb3JhcmkxbHkKKy50ZThuOXU4cjhlLgorLnRlOHM4dDliOGU4ZC4KKy50ZXMydDFiCisudGVzdDRiZTJkCisudGU4eDh0OXc4aThkOHQ4aC4KKy4zdGV4CisudGV4MXQyCisudGV4dHc0CisudGV4dHdpMgorLnRleHR3MmlkCisudGV4dHdpZDJ0aAorLnRoOGE4bDlhOW04dThzLgorLnRoYTNsYQorLnRoYWxhM20KKy50aGFsYTFtdQorLnRoYWxhbTJ1cworLnRoOGU4cjltOG85ZThsOGE4czl0OGk4Yy4KKy50aDJlCisudGhlcjNtNAorLnRoZXIxbW8KKy50aGVybW80ZWwKKy50aGVybW9lMWxhCisudGhlcm1vZWxhc3QyaQorLnRoZXJtb2VsYXMxdGljCisudGk4bThlOXM4dDhhOG04cC4KKy50aTJtZXMKKy50aW1lczF0YQorLnRpbWVzdGE0bTFwCisudGk4bThlOXM4dDhhOG04cDhzLgorLnRpbWVzdGFtMnAxczIKKy50bzhvOGw5azhpOHQuCisudG9vMgorLnRvb2xrMWkKKy50bzhvOGw5azhpOHQ4cy4KKy50b29sa2k0dDFzMgorLnRvOHA4bzlnOHI4YThwOGg5aTljOGE4bC4KKy50bzVwbzRnCisudG9wbzFncgorLnRvcG81Z3JhcGgxaWMKKy50b3BvZ3I0YXBoaQorLnRvcG9ncmFwaGkxY2EKKy50bzhxOHU4ZThzLgorLnRvMXEKKy50b3F1MgorLnRyOGE4aTl0OG84cjlvOHU4cy4KKy4xdHJhCisudHIyYWkyCisudHJhaTF0bworLnRyYWl0b3JvdTIKKy50cmFpdG9ybzJ1cworLnRyOGE4bjhzOWM4ZThpOHY4ZThyLgorLnRyYTJuCisudHJhMm4xczIKKy50cmFuczRjCisudHJhbjRzM2NlaTIKKy50cmFuc2NlMml2CisudHI4YThuOHM5YzhlOGk4djhlOHI4cy4KKy50cmFuc2NlaXZlNHIxczIKKy50cjhhOG44czlnOHI4ZThzOHMuCisudHJhbjJzM2cKKy50cmFuczFncgorLnRyYW5zZ3IyZTJzcworLnRyOGE4bjhzOXY4ZThyOXM4YThsLgorLnRyYW40c3YKKy50cmFuc3ZlNHIxczIKKy50cmFuc3ZlcjFzYTIKKy50cjhhOG44czl2OGU4cjlzOGE4bDhzLgorLnRyYW5zdmVyc2EybDFzMgorLnRyOGE4bjhzOXY4ZThzOXQ4aTh0OGUuCisudHJhbnN2NGUycworLnRyYW5zdmVzdDJpCisudHJhbnN2ZXN0Mml0ZQorLnRyOGE4bjhzOXY4ZThzOXQ4aTh0OGU4cy4KKy50cmFuc3Zlc3RpdDRlcworLnRyOGE5djhlOHI4czlhOWI4bDhlLgorLnRyYXZlNHIxczIKKy50cmF2ZXIxc2EyCisudHJhdmVyMnMxYWIKKy50cmF2ZXJzYWIybDIKKy50cjhhOXY4ZThyOXM4YThsLgorLnRyOGE5djhlOHI5czhhOGw4cy4KKy50cmF2ZXJzYTJsMXMyCisudHI4aTllOHQ4aDh5OGw5YThtOGk4bjhlLgorLnRyaTVldAorLnRyMmllNAorLnRyaWV0aHkzbGEKKy50cmlldGh5bGFtMWluCisudHJpZXRoeWxhbTJpbmUKKy50cjhlOGE4YzhoOWU4cjhpOGU4cy4KKy50cmVhMmNoCisudHJlYWNoZTIKKy50cmVhY2hlcjFpCisudHJlYWNoZXIyaWU0CisudHI4bzh1OWI4YTlkOG84dThyLgorLnRyb3UyCisudHJvdWJhMmQKKy50cm91YmExZG8KKy50cm91YmFkb3UyCisudHU4cjlrOGU4eS4KKy4xdHUKKy50dThyOWs4ZTh5OHMuCisudHVya2V5czQKKy50dThyOG45YThyOG84dThuOGQuCisudHVyNG4yYTJyCisudHVyMW5hCisudHVybmFyb3UyCisudHVybmFyb3VuMmQKKy50dThyOG45YThyOG84dThuOGQ4cy4KKy50dXJuYXJvdW4yZDFzMgorLnR5OHA5YThsLgorLjF0eQorLnR5MXBhCisudHlwNGFsCisudW45YTh0OXQ4YThjOGg4ZThkLgorLnVuMmF0NAorLnVuYTR0M3QyCisudW5hdDF0YQorLnVuYXR0YTJjaAorLnVuYXR0YWNoZTIKKy51bmF0dGE0Y2g0ZWQKKy51bjllOHI4cjlpOG44ZzlsOHkuCisudW40ZXIKKy51bmVyNHI0CisudW5lcnJpbjRnCisudW5lcnJpbmdsMgorLnVuZXJyaW5nMWx5CisudW45ZjhyOGk4ZThuOGQ5bDh5LgorLnVuM2YKKy51bmZyaTIKKy51bmZyMmllNAorLnVuZnJpZW4yZDFseQorLnVuOWY4cjhpOGU4bjhkOWw4aTllOHIuCisudW5mcmllbmRsMmllNAorLnZhOGc4dThlOHIuCisuMXZhCisudmFnNAorLnZhNWd1ZXIKKy52YTJndWUKKy52YTh1OGQ4ZTl2OGk4bDhsOGUuCisudmF1ZGUxdjQKKy52YXVkZTJ2M2k0bAorLnZhdWRlMXZpCisudmF1ZGV2aWwxbAorLnZhdWRldmlsMmxlCisudmk4YzlhOHI4cy4KKy52NGljMmEycgorLnZpMWNhCisudmljYTRyczIKKy52aThsOWw4YThpOG45ZThzOHMuCisuMnZpbAorLnZpbDFsCisudmlsbGFpMgorLnZpbGxhNGk0bgorLnZpbGxhMmluZQorLnZpbGxhaTVuMmUyc3MKKy52aWxsYWkxbmVzCisudmk4czl1OGE4bC4KKy52aTNzdQorLnZpc3UxYWwKKy52aThzOXU4YThsOWw4eS4KKy52aXN1YWwxbAorLnZpc3VhbDFseQorLnZpOXY4aThwOWE5cjhvOHU4cy4KKy4zdjJpdgorLnZpdjJpNHAKKy52aXZpMXBhCisudml2aXAyYTJyCisudml2aXBhcm91MgorLnZpdmlwYXJvMnVzCisudm84aThjOGU5cDhyOGk4bjh0LgorLnZvaTQKKy52b2kzY2VwCisudm9pY2VwcjIKKy52b2ljZXByaW40dDMKKy52czhwOGE4YzhlLgorLnYyczFwYQorLnZzcGE0Y2UKKy53YThkOWQ4aThuOGcuCisud2EyZAorLndhZDRkMWluCisud2FkMWQ0Cisud2E4bDhsOWY4bDhvOHc4ZThyLgorLndhbDFsCisud2FsMmxmCisud2FsbGY0bDIKKy53YWxsZmxvdzFlcgorLndhOGw4bDlmOGw4bzh3OWU4cjhzLgorLndhbGxmbG93ZTRyMXMyCisud2E4cjhtOWU4czh0LgorLncyYTJyCisud2FyMW0KKy53YXIybWUKKy53YXIybWVzCisud2E4czh0OGU5dzhhOHQ4ZThyLgorLndhczR0Cisud2FzdGUydworLndhc3RlMXc1YQorLndhc3Rld2ExdGUKKy53YTh2OGU5Zzh1OGk4ZDhlLgorLndhdmVnMworLndhdmVnMnVpMgorLndhdmVndTJpZAorLndhOHY4ZTlnOHU4aThkOGU4cy4KKy53YXZlZ3VpZGU0czIKKy53YTh2OGU5bDhlOHQuCisud2E4djhlOWw4ZTh0OHMuCisud2F2ZWxlNHQxczIKKy53ZThiOWw4aThrOGUuCisudzJlMWIKKy53ZWIybDIKKy53ZWIzbDRpaworLndlOGU4azluOGk4ZzhoOHQuCisud2Vla24yaWcKKy53ZThlOGs5bjhpOGc4aDh0OHMuCisud2Vla25pZ2g0dDFzMgorLndoOGU4ZThsOWM4aDhhOGk4ci4KKy53aGVlNGwxYzIKKy53aGVlbDJjaAorLndoZWVsY2hhaTIKKy53aGVlbGNoYTRpcgorLndoOGU4ZThsOWM4aDhhOGk4cjhzLgorLndoZWVsY2hhaTRyczIKKy53aDhpOGM4aDllOHY4ZThyLgorLndoaTQKKy53aDRpMmNoCisud2hpY2hlMgorLndoaWNoZXYxZXIKKy53aDhpOHQ4ZTlzOGk4ZDhlOGQuCisud2gyaXRlCisud2hpdDRlcworLndoaXRlMXNpCisud2hpdGUyczJpZAorLndoaXRlc2kyZDFlZAorLndoOGk4dDhlOXM4cDhhOGM4ZS4KKy53aGl0ZTFzcAorLndoaXRlMnMxcGEKKy53aGl0ZXNwYTRjZQorLndoOGk4dDhlOXM4cDhhOGM4ZThzLgorLndpOGQ4ZTlzOHA4cjhlOGE4ZC4KKy53MmlkCisud2lkZTRzMgorLndpZGUxc3AKKy53aWRlczRwcmUKKy53aWRlc3ByMgorLndpZGVzcHJlYTJkMQorLndpOG44ZzlzOHA4YThuLgorLndpbjRnCisud2luZ3MyCisud2luZzJzMXBhCisud2luZ3NwYTRuCisud2k4bjhnOXM4cDhhOG44cy4KKy53aW5nc3BhMm4xczIKKy53aThuOGc5czhwOHI4ZThhOGQuCisud2luZ3NwcjIKKy53aW5nc3ByZWEyZDEKKy53aTh0OGM4aDljOHI4YThmOHQuCisud2k0dGMKKy53aXQ0Y2gKKy53aXRjaGNyYTJmNHQKKy53aXRjaGNyYTJmCisud284cjhkOXM4cDhhOGM5aThuOGcuCisuMXdvMgorLndvcjJkMXMyCisud29yZHM0cAorLndvcmQyczFwYQorLndvcmRzcDRhMmNpCisud29yZHNwYTJjMWluCisud29yZHNwYWMxaW5nCisud284cjhrOWE4cjhvOHU4bjhkLgorLndvcmsyYTJyCisud29ya2Fyb3UyCisud29ya2Fyb3VuMmQKKy53bzhyOGs5YThyOG84dThuOGQ4cy4KKy53b3JrYXJvdW4yZDFzMgorLndvOHI4azloOG84cjhzOGUuCisud29ya2g0Cisud29ya2hvcjRzZQorLndvcmtobzRyczIKKy53bzhyOGs5aDhvOHI4czhlOHMuCisud29ya2hvcnMzZTRzCisud3I4YThwOWE4cjhvOHU4bjhkLgorLndyYTQKKy53cmFwMmEycjQKKy53cmExcGEKKy53cmFwYXJvdTIKKy53cmFwYXJvdW4yZAorLndyOGU4dDhjOGg5ZThkLgorLndyZTR0YworLndyZXQ0Y2gKKy53cmV0Y2hlMgorLndyZXQ0Y2g0ZWQKKy53cjhlOHQ4YzhoOWU4ZDlsOHkuCisud3JldGNoZTJkMWx5CisueWU4czl0OGU4cjl5OGU4YThyLgorLnllczQKKy55ZXN0ZXJ5ZTJhMnIKKy5hbDlnOGU5YjhyOGE4aTlzOGM4aDhlLgorLmFsZ2VicmEyaXMxYworLmFsZ2VicmFpczNjaDIKKy5hbGdlYnJhaXNjaGUyCisuYWw5bDhlOWc4aDhlOW44eS4KKy5hbDFsCisuYWwybGUKKy5hbDNsZWcKKy5hbGxlZ2hlMm4KKy5hcjlrOGE4bjlzOGE4cy4KKy5hcmthMm4KKy5hcmthbjJzYTIKKy5hcmthMm4xczIKKy5hdDhwOWE4czhlLgorLmE0dDFwCisuYXQxcGEKKy5hdDhwOWE4czhlOHMuCisuYXRwYXMxZTRzCisuYXU4czl0OHI4YThsOWE4czhpOGE4bi4KKy5hMnVzCisuYXVzMXQ0cgorLmF1czF0cmEKKy5hdXN0cmFsYXMyaTFhCisuYXVzdHJhbGFzaTJhMm4KKy5hdTh0OG85bThhOHQ4aTlzOGk4ZThyOXQ4ZThyLgorLmF1dG9tYTN0aXMKKy5hdXRvbWF0aXMyaWU0CisuYXV0b21hdGlzaWVydDNlcgorLmJlOWQ4aThlOW44dThuOGcuCisuNGJlMmQKKy5iNGUzZGkKKy5iZTVkaTNlbgorLmJlZDJpZTQKKy5iZWRpZTNudTRuCisuYmU4bThiOG8uCisuNGJlNW0KKy5iZTRtNWIKKy5iaThiOWw4aTlvOWc4cjhhOXA4aDhpOXM4YzhoOGUuCisuYmlibGlvZ3I0YXBoaQorLmJpYmxpb2dyYXBoMmlzMWMKKy5iaWJsaW9ncmFwaGlzM2NoMgorLmJpYmxpb2dyYXBoaXNjaGUyCisuYm84czl0OG84bi4KKy41Ym9zNAorLmJvczF0bworLmJvc3RvMm4KKy5icjhvOHc4bjlpOGE4bi4KKy5icm93bjVpCisuYnJvdzNuNGkxYQorLmJyb3duaTNhMm4KKy5icjh1OG44czl3OGk4YzhrLgorLmJydTJuCisuYnJ1Mm4zczQKKy5icnVuNHN3MgorLmJydW5zd2kyCisuYnJ1bnN3aWNrMQorLmJ1OWQ4YTlwOGU4czh0LgorLmJ1MWQyYQorLmNhOHI5aThiOWI4ZThhOG4uCisuY2FyMWkKKy5jYXI0aWIKKy5jYXJpMmIxYgorLmNhcmliMmJlCisuY2FyaWJiZWEybgorLmNoOGE4cjhsOGU4czl0OG84bi4KKy5jaGFyNGxlNAorLmNoYXIxbAorLmNoYXJsZXMyCisuY2hhcmw0ZXMydG8KKy5jaGFybGUzc3RvMm4KKy5jaDhhOHI5bDhvOHQ4dDhlOHM5djhpOGw4bDhlLgorLmNoYXIzbG80CisuY2hhcmxvNHQzdDIKKy5jaGFybG90NHRlcworLmNoYXJsb3R0ZTRzdgorLmNoYXJsb3R0ZXMydmlsCisuY2hhcmxvdHRlc3ZpbDFsCisuY2hhcmxvdHRlc3ZpbDJsZQorLmNvOWw4dThtOWI4aThhLgorLmNvbHVtNGJpCisuY29sdTRtMWIKKy5jb2x1bWIyaTFhCisuY3o4ZThjOGg4bzlzOGw4bzl2OGE5azhpOGEuCisuYzJ6ZTQKKy5jemUyY2gKKy5jemUzY2hvMgorLmN6ZWNob3M0bDIKKy5jemVjaG9zNGxvdgorLmN6ZWNob3NsbzF2YQorLmN6ZWNob3Nsb3ZhazFpCisuY3plY2hvc2xvdmFrMmkxYQorLmRlOGw5YTl3OGE4cjhlLgorLmRlMWxhCisuZGU0bGF3CisuZGVsYXcyYTJyCisuZGk4ajhrOXM4dDhyOGEuCisuZGkzagorLmRpajRrMXMyCisuZGlqa3N0NHIKKy5kaWprczF0cmEKKy5kdThhOG44ZS4KKy5kMXUxYQorLmR1YTJuCisuZHk5bjhhOW04aTlzOGM4aDhlLgorLjVkeW4KKy5keTFuYQorLmR5bmFtMmlzCisuZHluYW0yaXMxYworLmR5bmFtaXMzY2gyCisuZHluYW1pc2NoZTIKKy5lbjhnOWw4aThzOGguCisuZW5nbDIKKy5lbmdsaXMyaAorLmV1OGw4ZThyOWk4YThuLgorLmV1bDRlCisuZXUzbDRlcjFpCisuZXVsZTFyMmkzYTQKKy5ldWxlcmkyYTJuCisuZXY4YThuOXM4dDhvOG4uCisuZTF2YQorLmV2YTJuCisuZXZhbjRzdAorLmV2YTJuMXMyCisuZXZhbnMxdG8KKy5ldmFuc3RvMm4KKy5mZThiOXI4dTlhOHI4eS4KKy5mMmU0YgorLmZlM2JyCisuZmVicnUzYQorLmZlYnJ1MmEycgorLmZlOHM4dDlzOGM4aDhyOGk4Zjh0LgorLmZlczR0MXMyCisuZmVzdDRzYworLmZlc3RzMmNoMgorLmZlc3RzYzRocjQKKy5mZXN0c2NocjRpMmZ0CisuZmw4bzhyOWk5ZDhhLgorLmZsb3IyaWQKKy5mbG9yaTFkMmEKKy5mbDhvOHI5aTlkOWk4YThuLgorLmZsb3JpMmRpCisuZmxvcmlkNWkyYTJuCisuZmxvcmkxZDRpM2EKKy5mbzhyOXM4YzhoOHU4bjhnOHM5aThuOXM4dDhpOXQ4dTh0LgorLmZvcnM0YworLmZvcnMyY2gyCisuZm9yc2NodW5nczIKKy5mb3JzY2h1bmcyczFpbgorLmZvcnNjaHVuZ3MyaTJuMXMyCisuZm9yc2NodW5nc2luc3QyaQorLmZvcnNjaHVuZ3NpbnN0aTF0dQorLmZyOGU4ZTliOHM4ZC4KKy5mcmUyZTFiCisuZnJlZTJiNXMyCisuZnJlZWI0czVkCisuZnU4bjhrOXQ4czhpOG84bjhhOGwuCisuM2Z1CisuZnU0bmsyCisuZnVuazV0CisuZnVuazR0MXMyCisuZnVua3QxczJpbworLmZ1bmt0NXNpbzJuCisuZnVua3RzaW8xbjVhCisuZ2E4dThzOHM5aThhOG4uCisuZ2EydXMKKy5nYXUyc3MKKy5nYXVzMXNpCisuZ2F1c3MyaTFhCisuZ2F1c3NpMmEybgorLmdoOG84czh0OXM4YzhyOGk4cDh0LgorLmdob3M0dDFzMgorLmdob3N0NHNjCisuZ2hvc3RzY3JpMgorLmdob3N0c2NyMmlwCisuZ2hvc3RzY3JpMnAxdAorLmdoOG84czh0OXY4aThlOHcuCisuZ2hvczR0dgorLmdob3N0djJpZTQKKy5ncjhhOHM4czltOGE4bjhuOWk4YThuLgorLmdyMmFzCisuZ3JhMnNzCisuZ3JhczJzMW0KKy5ncmFzczNtYQorLmdyYXNzbWEybjMKKy5ncmFzc21hNG4xbjIKKy5ncmFzc21hbjNuNGkxYQorLmdyYXNzbWEybm5pM2EybgorLmdyOGU4aThmOHM5dzhhOGw4ZC4KKy5ncmVpMgorLmdyZWkyZjNzCisuZ3JlaWZzdzIKKy5ncmVpZnN3YTJsZAorLmdyOG84dDhoOGU4bjlkOGk4ZThjOGsuCisuZzRybworLmdybzR0aDJlCisuZ3I0b3RoCisuZ3JvdGhlMm4KKy5ncm90aGVuZDJpZTQKKy5ncm90aGVuZGllY2sxCisuZ3I4dThuOGQ5bDhlOGg5cjhlOG4uCisuZ3J1Mm4KKy5ncnVuZGxlMWg0CisuZ3J1bmRsZTRocjQKKy5oYTlkOGE5bThhOHI4ZC4KKy5oYTJkCisuaGExZDJhCisuaGFkYTJtMgorLmhhZDRhMW1hCisuaGFkYW0yYTJyCisuaGE4aTlmOGEuCisuaGFpMWZhCisuaGE4bThpOGw5dDhvOG45aThhOG4uCisuaGE0bQorLmhhbWk0bHQKKy5oYW1pbDF0bworLmhhbWlsdG8ybgorLmhhbWlsdG8zbjRpMWEKKy5oYW1pbHRvbmkzYTJuCisuaGU4bDlzOGk4bjhrOGkuCisuaGUybDFzMgorLmhlbDJzMWluCisuaGVsczRpNG5rMgorLmhlbHNpbmsxaQorLmhlOHI5bThpOHQ5aThhOG4uCisuaGVyM21pdAorLmhlcm1pMXRpCisuaGVybTRpMXQyaTFhCisuaGVybWl0aTJhMm4KKy5oaThiOGI4cy4KKy5oaTJiMWIKKy5oaWIyYjVzMgorLmhvOGs5azhhOGk5ZDhvLgorLmgyb2sKKy5ob2trNAorLmhva2thaTIKKy5ob2trYTJpZAorLmhva2thaTFkbworLmphOGM5azhvOHc5czhrOGkuCisuNWphCisuamFjazEKKy5qYWNrb3dzazIKKy5qYWNrb3dzazFpCisuamE4bjl1OWE4cjh5LgorLmphMm4KKy5qYW4zdTFhCisuamFudTJhMnIKKy5qYTlwOGE5bjhlOHM4ZS4KKy5qYTRwCisuamExcGEKKy5qYXBhMm4KKy5qYXBhMW5lcworLmphcGFuZTFzMmUKKy5rYThkOW84bTl0OHM4ZTh2LgorLmthMmQKKy5rYTFkbworLmthZG80bXQKKy5rYWRvbTR0MXMyCisua2Fkb210NXNldgorLmthOG45czhhOHMuCisua2EybgorLmthbjJzYTIKKy5rYTJuMXMyCisua2E4cjhsOHM5cjh1OGg4ZS4KKy5rMmEycgorLmthcjFsCisua2FyMmwxczIKKy5rYXJsczFyCisua284cjl0OGU5dzhlOGcuCisua281cgorLmtyOGk4czhoOG44YS4KKy5rcjJpcworLmtyM2lzMmgKKy5rcmlzMmgxbgorLmtyaXNoMW5hCisua3I4aThzOGg5bjhhOWk4czhtLgorLmtyaXNobmFpMgorLmtyaXNobmFpMnMxbQorLmtyOGk4czhoOW44YThuLgorLmtyaXNobjJhMm4KKy5sYThuOWM4YThzOXQ4ZThyLgorLmxhbjFjYQorLmxhbmNhc3Q1ZXIKKy5sZTlnOGU4bjhkOHI4ZS4KKy5sZTFnZW4KKy5sZWdlbjFkcgorLmxlZ2VuZHJlNAorLmxlOGk4YzhlOHM5dDhlOHIuCisubGVpMgorLmxlNWljCisubGVpY2VzNXQKKy5saThwOXM4YzhoOGk4dDh6LgorLmwyaXAKKy5saTJwMXMyCisubGlwczJjaDIKKy5saXBzM2NoaXQKKy5saXBzY2hpNHR6CisubGk4cDlzOGM4aDhpOHQ4ejlpOGE4bi4KKy5saXBzY2hpdDJ6MWkKKy5saXBzY2hpdHoyaTFhCisubGlwc2NoaXR6aTJhMm4KKy5sbzhqOWI4YThuLgorLmxvNWoKKy5sb2piYTJuCisubG84dTlpOXM4aTlhOG44YS4KKy5sb3UyCisubG8ydWkyCisubG91aXMyaTFhCisubG91aXNpMmEybgorLmxvdWlzaWExbmEKKy5tYThjOW84cy4KKy5tYTFjbworLm1hOG45YzhoOGU4czl0OGU4ci4KKy5tYW4yY2gKKy5tYW5jaGUyCisubWFuY2gxZXMKKy5tYThyOWs4bzh2OWk4YThuLgorLm1hcmtvNXZpMmEybgorLm1hcmtvdjJpMWEKKy5tYThyOGs4dDlvOGI4ZThyOWQ4bzhyOGYuCisubWFyazV0CisubWFyazF0bworLm1hcmt0bzNiCisubWFya3RvYmVyMWRvCisubWFya3RvYmVyZDRvcgorLm1hcmt0b2JlcmRvcjFmCisubWE4czhzOWE5YzhoOHU5czhlOHQ4dDhzLgorLm1hMnNzCisubWFzMXNhMgorLm1hc3NhMmNoCisubWFzc2FjaDJ1cworLm1hc3NhY2h1c2U0dDN0MgorLm1hc3NhY2h1c2V0NHQxczIKKy5tYTh4OXc4ZThsOGwuCisubWF4d2VsNGwKKy5taTljOHI4bzlzOG84Zjh0LgorLm1pY3JvMnNvCisubWljcm9zbzJmdDMKKy5taThuOW44ZTlhOHA5bzlsOGk4cy4KKy5tMmk0bjFuMgorLm1pbm5lNAorLm1pbm5lYXBvbDJpCisubWk4bjluOGU5czhvOHQ4YS4KKy5taW4xbmVzCisubWlubmUxc28KKy5taW5uZXNvMXRhCisubW84czljOG84dy4KKy5tb3MyYworLm1vczFjbworLm5hOGM4aDlyOGk4YzhoOHQ4ZThuLgorLjFuYQorLm5hMmNoCisubmFjNGhyNAorLm5hMmNocjRpMmNoCisubmFjaHJpY2h0MWVuCisubmE4czhoOXY4aThsOGw4ZS4KKy5uNGFzCisubmFzMmgKKy5uYXNoMnZpbAorLm5hc2h2aWwxbAorLm5hc2h2aWwybGUKKy5uZTh0OWI4czhkLgorLm5lMnQxYgorLm5ldDJiNXMyCisubmV0YjRzNWQKKy5uZTh0OXM4YzhhOHA4ZS4KKy5uZTR0MXMyCisubmV0NHNjCisubmV0c2NhNHAKKy5uZXRzMWNhCisubmk4ajltOGU5ZzhlOG4uCisubmkzagorLm5pam1lMmcKKy5uaWptZTFnZW4KKy5ubzhlOXQ4aDhlOHI5aThhOG4uCisuM25vZQorLm5vZXRoMmUKKy5ub2V0aGVyMWkKKy5ub2V0aGUxcjJpM2E0Cisubm9ldGhlcmkyYTJuCisubm84bzhyOGQ5dzhpOGo4azhlOHI5aDhvOHU4dC4KKy5ub28yCisubm8zb3JkCisubm9vcmQxdworLm5vb3Jkd2kyCisubm9vcmR3aTNqCisubm9vcmR3aWprMWVyCisubm9vcmR3aWprZXIxaDQKKy5ub29yZHdpamtlcmhvdTIKKy5ubzl2OGU4bTliOGU4ci4KKy5ub3ZlNG01YgorLm9wOGU4bjliOHM4ZC4KKy5vcGU0bjFiNAorLm9wZW4yYjVzMgorLm9wZW5iNHM1ZAorLm9wOGU4bjlvOGY4ZjhpOGM4ZS4KKy5vcDRlbm8KKy5vcGVubzRmMWYKKy5vcGVub2YxZmkKKy5wYThsOGE5dDhpOG44by4KKy5wYWxhMnQxaW4KKy5wYWxhdDJpMW5vCisucGE5bDhlOHI5bThvLgorLnBhbGVyM200CisucGFsZXIxbW8KKy5wZTl0OHI4bzh2OXM4azhpLgorLnBldHJvM3YKKy5wZXRyb3ZzazIKKy5wZXRyb3ZzazFpCisucGY4YThmOGY5aThhOG4uCisuNHBmCisucDFmYQorLnBmYTJmCisucGZhNGYxZjQKKy5wZmFmMWZpCisucGZhZmYyaTNhCisucGZhZmZpMmEybgorLnBoOGk4bDlhOWQ4ZThsOXA4aDhpOGEuCisucGhpNGw0YWRlCisucGhpbGEyZAorLnBoaWxhZGUybHAKKy5waGlsYWRlbDVwaGkKKy5waGlsYWRlbHBoMmkxYQorLnBoOGk4bDlvOXM4bzhwOGg5aTlzOGM4aDhlLgorLnBoaWxvMnNvCisucGhpbG9zNG9wCisucGhpbG9zMm9waAorLnBoaWxvc29waDJpczFjCisucGhpbG9zb3BoaXMzY2gyCisucGhpbG9zb3BoaXNjaGUyCisucG84aThuOWM4YThyOGUuCisucG9pbjIKKy5wb2kyCisucG9pbmMyYTJyNQorLnBvaW4xY2EKKy5wbzl0OGU4bjl0OGk4YThsOWc4bDhlOGk5YzhoOHU4bjhnLgorLnA0b3QKKy5wbzF0ZW4xdAorLnBvdGVudDJpCisucG90ZW4xdDJpMWEKKy5wb3RlbnRpMmFsCisucG90ZW50aWE0bDFnNAorLnBvdGVudGlhbGdsMgorLnBvdGVudGlhbDFnbGUKKy5wb3RlbnRpYWxnbGVpMgorLnBvdGVudGlhbGdsZTVpYworLnBvdGVudGlhbGdsZTRpMmNoCisucmE5ZDhoOGE5azhyOGk4czhoOW44YThuLgorLnJhZDFoMgorLnJhZGhha3IyaXMKKy5yYWRoYWtyM2lzMmgKKy5yYWRoYWtyaXMyaDFuCisucmFkaGFrcmlzaDFuYQorLnJhZGhha3Jpc2huMmEybgorLnJhOHQ4aDhzOWs4ZThsOWw4ZThyLgorLnI0YXRoCisucmEydDRoMXMyCisucmF0aHNrMgorLnJhdGg0c2tlCisucmF0aHNrZWwxbAorLnJhdGhza2VsMmxlCisucmk4ZTltOGE4bjhuOWk4YThuLgorLnIyaWU0CisucmllNW1hMm4KKy5yaWUxbWEKKy5yaWVtYTRuMW4yCisucmllbWFuM240aTFhCisucmllbWEybm5pM2EybgorLnJ5OGQ5YjhlOHI4Zy4KKy5yeTFkCisucnlkMWIKKy5yeWRiZXJnMgorLnNjOGg4bzh0OXQ4aThzOGM4aDhlLgorLnNjaG80dDN0MgorLnNjaG90dDJpczFjCisuczJjaDJvdHRpczNjaDIKKy5zY2hvdHRpc2NoZTIKKy5zYzhoOHI4bzlkOGk4bjhnOWU4ci4KKy5zYzRocjQKKy5zY2hyb2QxaW4KKy5zY2hyb2Q0aW5nZQorLnNjOGg4dzhhOWI4YTljOGg4ZThyLgorLnNjaDF3Cisuc2Nod2FiYTJjaAorLnNjaHdhYmFjaGUyCisuc2M4aDh3OGE4cjh6OXM4YzhoOGk4bDhkLgorLnNjaHcyYTJyCisuczJjaHdhcnpzMmNoMgorLnNjaHdhcnpzY2g0aWwyCisuc2Nod2FyenNjaGkybGQKKy5zZThwOXQ4ZThtOWI4ZThyLgorLnNlMnAxdAorLnNlcDJ0ZQorLnNlcHRlNG01YgorLnN0OG84azhlOHM5czhjOGg4ZS4KKy5zdDJvaworLnN0b2tlczQKKy5zdG9rMmUyc3MKKy5zdG9rZXMyczVjCisuc3Rva2VzczJjaDIKKy5zdG9rZXNzY2hlMgorLnN0OHU4dDh0OWc4YThyOHQuCisuc3R1NHQzdDIKKy5zdHV0NHQxZworLnN0dXR0MWdhCisuc3R1dHRnMmEycgorLnN1OHM5cTh1OGU5aDhhOG45bjhhLgorLnMydXMKKy5zdXNxdTIKKy5zdXNxdWUxaDQKKy5zdXNxdWVoYTJuCisuc3VzcXVlaGE0bjFuMgorLnN1c3F1ZWhhbjFuYQorLnRhOHU5YjhlOHI5aThhOG4uCisudGF1NGIKKy50YXViNGUKKy50YXUzYmVyCisudGF1YmVyMWkKKy50YXViZTFyMmkzYTQKKy50YXViZXJpMmEybgorLnRlOGM4aDluOGk5czhjOGg4ZS4KKy50ZTJjaAorLnRlYzJoMW4KKy50ZWNobjJpczFjCisudGUyY2huaXMzY2gyCisudGVjaG5pc2NoZTIKKy50ZThuOW44ZThzOXM4ZThlLgorLnQ0ZTRuMW4yCisudGVubmU0CisudGVuMW5lcworLnRlbm4yZTJzcworLnRvOW04YTlzOHo4ZTh3OXM4azhpLgorLnRvMm1hCisudG9tYXMyemUKKy50b21hc3pld3NrMgorLnRvbWFzemV3c2sxaQorLnR5OXA4bzlnOHI4YThwOGg4aThxOHU4ZS4KKy50eTNwbworLnR5NXBvNGcKKy50eXBvMWdyCisudHlwb2dyNGFwaGkKKy50eXBvZ3JhcGhpcXUyCisudWs4cjhhOGk4bjlpOGE4bi4KKy40dWsKKy51a3IyYWkyCisudWtyYTRpNG4KKy51a3JhMmluaQorLnVrcmFpNG40aTFhCisudWtyYWluaTNhMm4KKy52ZThyOWE4bDhsOWc4ZTltOGU4aThuOWU4cjh0OGUuCisudmVyYWwxbAorLnZlcmFsNGwxZzQKKy52ZXJhbGxnZTFtZQorLnZlcmFsbGdlbWVpMgorLnZlcmFsbGdlbWUyaW5lCisudmVyYWxsZ2VtZWluMWVyCisudmU4cjllOGk4bjlpOWc4dThuOGcuCisudmVyZTNpbgorLnZlcmVpMgorLnZlcmUyaW5pCisudmVyZWluMmlnCisudmVyZWluaTNndW4KKy52ZThyOXQ4ZThpOWw4dThuOWc4ZThuLgorLnZlcnRlaTIKKy52ZXJ0ZWlsdW4xZ2VuCisudmk4aThpOHQ4aC4KKy52NGk1aTQKKy52aTRpNWk0CisudmlpMml0aAorLnZpOGk4dDhoLgorLnZpMml0aAorLndhOGg4cjlzOGM4aDhlOGk4bjlsOGk4YzhoOWs4ZThpOHQ4czl0OGg4ZThvOXI4aThlLgorLndhNGhyNAorLndhaDRyczIKKy53YWhyczRjCisud2FocnMyY2gyCisud2FocnNjaGUyCisud2FocnNjaGVpMgorLndhaHJzY2hlNGk0bjFsCisud2FocnMyY2hlaW5sNGkyY2gKKy53YWhyc2NoZWlubGljNGhrCisud2FocnNjaGVpbmxpY2hrZWkyCisud2FocnNjaGVpbmxpY2hrZWk0dDFzMgorLndhaHJzY2hlaW5saWNoa2VpdHMzdGgyZQorLndhaHJzY2hlaW5saWNoa2VpdHN0aGUxbzVyCisud2FocnNjaGVpbmxpY2hrZWl0c3RoZW9yMmllNAorLndlOHI5bjhlOHIuCisudzFlcgorLndlcjRuMWVyCisud2U4cjl0OGg4ZThyOWk4YThuLgorLndlcnRoMmUKKy53ZXJ0aGVyMWkKKy53ZXJ0aGUxcjJpM2E0Cisud2VydGhlcmkyYTJuCisud2k4bjljOGg4ZThzOXQ4ZThyLgorLndpbjJjaAorLndpbmNoZTIKKy53aW5jaDFlcworLndpOHI4dDlzOGM4aDhhOGY4dC4KKy53NGlyNAorLndpcjR0MXMyCisud2lydDRzYworLndpcnRzMmNoMgorLndpcnRzY2hhMmYKKy53aXJ0c2NoYTJmdAorLndpOHM5czhlOG45czhjOGg4YThmOHQ5bDhpOGM4aC4KKy53NGkyczFzCisud2lzc2VuNAorLndpc3NlMm4xczIKKy53aXNzZW5zNGMKKy53aXNzZW5zMmNoMgorLndpc3NlbnNjaGEyZgorLndpc3NlbnNjaGEyZnQKKy53aXNzZW5zY2hhZjJ0bAorLndpc3NlbnMyY2hhZnRsNGkyY2gKKy54djhpOGk4aTh0OGguCisueHY0aTVpNAorLnh2aTRpNWk0CisueHZpaTJpdGgKKy54djhpOGk4dDhoLgorLnh2aTJpdGgKKy54eDhpOGk4aThyOGQuCisueHg0CisueHgzaQorLnh4NGk1aTQKKy54eGk0aTVpNAorLnh4aWk0aXIKKy54eDhpOGk4bjhkLgorLnh4aTRpbmQKKy55aThuOGc5eThvOG44Zy4KKy55MWkKKy55aW4yZ3kKKy55aW5neTFvNAorLnlpbmd5bzJuCisuc2g4dTl4OHU4ZS4KKy5zaHV4MXUzCisuamk5czh1OGE4bi4KKy5qaTJzdQorLmppc3VhMm4KKy56ZThhOWw4YThuOGQuCisuMnplCisuemVhNGwKKy56ZWEzbDRhbmQKKy56ZWFsYTJuCisuemU4aTh0OXM4YzhoOHI4aThmOHQuCisuemVpMgorLnplaTR0MXMyCisuemVpdDRzYworLnplaXRzMmNoMgorLnplaXRzYzRocjQKKy56ZWl0c2NocjRpMmZ0CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2luY29nbml0b19tb2RlX3N0YXJ0X3BhZ2UuaHRtbCBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzBjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2luY29nbml0b19tb2RlX3N0YXJ0X3BhZ2UuaHRtbApAQCAtMCwwICsxLDI0IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KKyAgICA8dGl0bGU+TmV3IGluY29nbml0byB3aW5kb3c8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPjxzdHJvbmc+WW91J3ZlIGdvbmUgaW5jb2duaXRvPC9zdHJvbmc+LiBQYWdlcyB5b3UgdmlldyBpbiB0aGlzIHdpbmRvdworICAgICAgd29uJ3QgYXBwZWFyIGluIHlvdXIgYnJvd3NlciBoaXN0b3J5IG9yIHNlYXJjaCBoaXN0b3J5LCBhbmQgdGhleSB3b24ndAorICAgICAgbGVhdmUgb3RoZXIgdHJhY2VzLCBsaWtlIGNvb2tpZXMsIG9uIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgeW91IGNsb3NlIHRoZQorICAgICAgaW5jb2duaXRvIHdpbmRvdy4gQW55IGZpbGVzIHlvdSBkb3dubG9hZCBvciBib29rbWFya3MgeW91IGNyZWF0ZSB3aWxsIGJlCisgICAgICBwcmVzZXJ2ZWQsIGhvd2V2ZXIuPC9wPgorCisgICAgPHA+PHN0cm9uZz5Hb2luZyBpbmNvZ25pdG8gZG9lc24ndCBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIG90aGVyIHBlb3BsZSwKKwlzZXJ2ZXJzLCBvciBzb2Z0d2FyZS4gQmUgd2FyeSBvZjo8L3N0cm9uZz48L3A+CisKKyAgICA8dWw+CisgICAgICA8bGk+V2Vic2l0ZXMgdGhhdCBjb2xsZWN0IG9yIHNoYXJlIGluZm9ybWF0aW9uIGFib3V0IHlvdTwvbGk+CisgICAgICA8bGk+SW50ZXJuZXQgc2VydmljZSBwcm92aWRlcnMgb3IgZW1wbG95ZXJzIHRoYXQgdHJhY2sgdGhlIHBhZ2VzIHlvdSB2aXNpdDwvbGk+CisgICAgICA8bGk+TWFsaWNpb3VzIHNvZnR3YXJlIHRoYXQgdHJhY2tzIHlvdXIga2V5c3Ryb2tlcyBpbiBleGNoYW5nZSBmb3IgZnJlZSBzbWlsZXlzPC9saT4KKyAgICAgIDxsaT5TdXJ2ZWlsbGFuY2UgYnkgc2VjcmV0IGFnZW50czwvbGk+CisgICAgICA8bGk+UGVvcGxlIHN0YW5kaW5nIGJlaGluZCB5b3U8L2xpPgorICAgIDwvdWw+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfaW4ueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyOGI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfaW4ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG9iamVjdEFuaW1hdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIKKy8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX291dC54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX291dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiNjU5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfb3V0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxvYmplY3RBbmltYXRvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxLjAiCisgICAgYW5kcm9pZDp2YWx1ZVRvPSIwLjAiCisgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2VudGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTlhM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZW50ZXIueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209Ii00MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InRyYW5zbGF0aW9uWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKzwvc2V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZXhpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0MzU3NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iNDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25YIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfbmV4dF9lbnRlci54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9uZXh0X2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQ2ZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfbmV4dF9lbnRlci54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iNTAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InRyYW5zbGF0aW9uWSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIi8+Cis8L3NldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9uZXh0X2V4aXQueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfbmV4dF9leGl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmI4MmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfbmV4dF9leGl0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iLTUwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25ZIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9lbnRlci54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzYwNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9lbnRlci54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSI0MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InRyYW5zbGF0aW9uWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKzwvc2V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZXhpdC54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2V4aXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjFhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2V4aXQueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSItNDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25YIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfcHJldl9lbnRlci54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9wcmV2X2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzdhZmQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfcHJldl9lbnRlci54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iLTUwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblkiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfcHJldl9leGl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X3ByZXZfZXhpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0NWE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X3ByZXZfZXhpdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjUwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25ZIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX2luX25vX2FscGhhLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1ZDY5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYS54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCTx0cmFuc2xhdGUgYW5kcm9pZDpmcm9tWURlbHRhPSItMTAwJXAiIGFuZHJvaWQ6dG9ZRGVsdGE9IjAiCisgICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYS54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI0NzRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYS54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCTx0cmFuc2xhdGUgYW5kcm9pZDpmcm9tWURlbHRhPSIwIiBhbmRyb2lkOnRvWURlbHRhPSIxMDAlcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kYXJrLnhtbAppbmRleCBmMDgxMmVkLi4zZGQ3M2U3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2RhcmsueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZGFyay54bWwKQEAgLTE5LDggKzE5LDYgQEAKICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPgogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KLQogPC9zZWxlY3Rvcj4KLQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX2ZvY3VzZWQueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX2ZvY3VzZWQueG1sCmluZGV4IDdmMzkwNmEuLmM5N2MwYmQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZGFya19mb2N1c2VkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2RhcmtfZm9jdXNlZC54bWwKQEAgLTE2LDYgKzE2LDcgQEAKIAogPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiIC8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiIC8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiIC8+CiAgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZGFya19ub2Rpc2FibGUueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX25vZGlzYWJsZS54bWwKaW5kZXggYmUxYjlmOS4uNDQzZjdmNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX25vZGlzYWJsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX25vZGlzYWJsZS54bWwKQEAgLTE2LDYgKzE2LDcgQEAKIAogPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgogICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmsiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+CiA8L3NlbGVjdG9yPgogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2Rpc2FibGVfb25seV9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kaXNhYmxlX29ubHlfaG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGU0NTgzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kaXNhYmxlX29ubHlfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19kaXNhYmxlZCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmsiLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZGlzYWJsZV9vbmx5X2hvbG9fbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kaXNhYmxlX29ubHlfaG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhOTJjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZGlzYWJsZV9vbmx5X2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2ZvY3VzZWRfaG9sb19kYXJrLnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZm9jdXNlZF9ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzY4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2ZvY3VzZWRfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfaG9sb19kYXJrLnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfaG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWVlMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmsiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmsiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmsiLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrIi8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDMxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgorICAgIAorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0LnhtbAppbmRleCBlMTEyMDM0Li5hMTJjNmI0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0LnhtbApAQCAtMTksNiArMTksNyBAQAogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgogICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgogICAgIAogPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbGlnaHRfbm9kaXNhYmxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbGlnaHRfbm9kaXNhYmxlLnhtbAppbmRleCAyZDM1NDcwLi4wNTFjY2NmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0X25vZGlzYWJsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9saWdodF9ub2Rpc2FibGUueG1sCkBAIC0xNiw2ICsxNiw3IEBACiAKIDxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CiAgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+CiA8L3NlbGVjdG9yPgogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDUwODhmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmsiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMWU4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWFyY2hfdXJsX3RleHRfaG9sby54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2VhcmNoX3VybF90ZXh0X2hvbG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDkzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2VhcmNoX3VybF90ZXh0X2hvbG8ueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL3NlYXJjaF91cmxfdGV4dF9wcmVzc2VkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3Ivc2VhcmNoX3VybF90ZXh0X3NlbGVjdGVkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3Ivc2VhcmNoX3VybF90ZXh0X25vcm1hbCIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfZGFyay54bWwKaW5kZXggYzE5NWVmMC4uMWEzOGZhOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2RhcmsueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9kYXJrLnhtbApAQCAtMjAsNiArMjAsNyBAQAogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZV9kaXNhYmxlZCIvPgogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlX2Rpc2FibGVkIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19kaXNhYmxlZCIvPgogICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmsiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfZGFya19ub2Rpc2FibGUueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2Rhcmtfbm9kaXNhYmxlLnhtbAppbmRleCAyYzg3YTI1Li5jYmM3YjAyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfZGFya19ub2Rpc2FibGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9kYXJrX25vZGlzYWJsZS54bWwKQEAgLTE2LDUgKzE2LDYgQEAKIAogPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgogICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmsiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+CiA8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfaG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzYxNTZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmsiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2VfZGlzYWJsZWQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZV9kaXNhYmxlZCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmtfZGlzYWJsZWQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrIi8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9ob2xvX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzkxYWViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHRfZGlzYWJsZWQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHQiLz4KKyAgICA8IS0tIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIHNlbGVjdG9yIChmb3IgYm90aCBsaWdodCBhbmQgZGFyayksIHRoZSBsaWdodCdzIHNlbGVjdGVkIHN0YXRlIHNob3VsZG4ndCBiZSBpbnZlcnNlZCBsaWtlIHRoZSBkYXJrJ3MuIC0tPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHRfZGlzYWJsZWQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHQiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9saWdodC54bWwKaW5kZXggOTkyNDlhNS4uMjkzZjRhYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbGlnaHQueG1sCkBAIC0yMiw2ICsyMiw3IEBACiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHRfZGlzYWJsZWQiLz4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCIvPgogICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2xpZ2h0Ii8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgogPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9saWdodF9ub2Rpc2FibGUueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0X25vZGlzYWJsZS54bWwKaW5kZXggMmM4N2EyNS4uY2JjN2IwMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0X25vZGlzYWJsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0X25vZGlzYWJsZS54bWwKQEAgLTE2LDUgKzE2LDYgQEAKIAogPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgogICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmsiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+CiA8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjIyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrIi8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjIyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFyayIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3IvdGVydGlhcnlfdGV4dF9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3RlcnRpYXJ5X3RleHRfaG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjlmZjcxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3RlcnRpYXJ5X3RleHRfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iIzgwODA4MCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSIjODA4MDgwIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSIjODA4MDgwIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSIjODA4MDgwIi8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3RlcnRpYXJ5X3RleHRfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvdGVydGlhcnlfdGV4dF9ob2xvX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTVjMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3RlcnRpYXJ5X3RleHRfaG9sb19saWdodC54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IiM4MDgwODAiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iIzgwODA4MCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iIzgwODA4MCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IiM4MDgwODAiLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSIjODA4MDgwIi8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3dpZGdldF9lZGl0dGV4dF9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3dpZGdldF9lZGl0dGV4dF9ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmM2ViNjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivd2lkZ2V0X2VkaXR0ZXh0X2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+IDwhLS0gdW5mb2N1c2VkIC0tPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3dpZGdldF9lZGl0dGV4dF9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci93aWRnZXRfZWRpdHRleHRfaG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5NTBkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci93aWRnZXRfZWRpdHRleHRfaG9sb19saWdodC54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmsiLz4gPCEtLSB1bmZvY3VzZWQgLS0+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1lbi1oZHBpL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWVuLWhkcGkvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNzYzNzUuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWVuLWhkcGkvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmYucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYmI2MmU2Zi4uYWFkOWVmNwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGIzNDYzODEuLmVhZWU5ZTAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDg2NjMzNjkuLjZkMmMyOTMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNlNTgwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYmU3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2U1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiZTc3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjBkMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDNkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjAyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0OGM1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmI3YmE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWNmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDhhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjOTQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ub3JtYWxfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfbm9ybWFsX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxZDRmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfbm9ybWFsX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ub3JtYWxfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQwNTVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ub3JtYWxfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2N2U0OWRmLi4xYzQ0MmU5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGUxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4YzNkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMTc5MWQxZi4uYjg1MmIyYwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxOTkyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2NiNTEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDE1Y2QyNWUuLmNkNWMxODEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGUzZmUzMjMuLmI0ZmM1MWEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZmE0MWJiNy4uYmYzNDY0NwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3YWVlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc0MGFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjdhZWVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzQwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjNlNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDE1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTMxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5OTNlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTdhZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NTkyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzQ0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4NGQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fbm9ybWFsX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fbm9ybWFsX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0ZjNiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ub3JtYWxfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fbm9ybWFsX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJhM2MxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5MDZlMjgzLi5mYTVjN2EyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzM2NiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDEzMzI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlYjQ5NmE4Li5hNmEyMWFkCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NThhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkZjY1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX2Rpc2FibGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9kaXNhYmxlLnBuZwppbmRleCAzOTY1MmE4Li5kODI5NzE2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX2Rpc2FibGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfZGlzYWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9kaXNhYmxlX2ZvY3VzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9kaXNhYmxlX2ZvY3VzZWQucG5nCmluZGV4IDFhYTdmZmUuLmMxYjViNmUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfZGlzYWJsZV9mb2N1c2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX2Rpc2FibGVfZm9jdXNlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9ub3JtYWwucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNjAxMTIxOS4uYmYzZmI1YQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX25vcm1hbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNDk0MmU1MC4uNTBlMjJlNgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX3NlbGVjdGVkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGZlNDlhNDAuLmNmYzY4ZmIKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9zZWxlY3RlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Nsb3NlX25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2xvc2Vfbm9ybWFsLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjExZTUuLjM4YjQ5ZjEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Nsb3NlX25vcm1hbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Nsb3NlX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Nsb3NlX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Nsb3NlX3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNWI5NmI0ZS4uYWE5ZWE0OWYwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2xvc2VfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Nsb3NlX3NlbGVjdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9zZWxlY3RlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlMjdkNjg0Li44NzBjNjcwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9zZWxlY3RlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Nsb3NlX3NlbGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY29kZV9sb2NrX2RlZmF1bHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NvZGVfbG9ja19kZWZhdWx0LnBuZwppbmRleCA0NDY5Y2UwLi5kZjMxMzdmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY29kZV9sb2NrX2RlZmF1bHQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jb2RlX2xvY2tfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NvZGVfbG9ja190b3VjaGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jb2RlX2xvY2tfdG91Y2hlZC5wbmcKaW5kZXggYjkwNTA4Yy4uYmY5ZTQ2YSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NvZGVfbG9ja190b3VjaGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY29kZV9sb2NrX3RvdWNoZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkMTY2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdlYjQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzgxNGYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGJkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2MWQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNhNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDgwMzY1MWIuLjMyOWNlNmUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfZGlzYWJsZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9kaXNhYmxlLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjRmMDFjNy4uYTUxOGM2YgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfZGlzYWJsZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfZGlzYWJsZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfZGlzYWJsZV9mb2N1c2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2Rpc2FibGVfZm9jdXNlZC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDUzNzZkYjIuLjcxYTA1YjcKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2Rpc2FibGVfZm9jdXNlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfZGlzYWJsZV9mb2N1c2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDAwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkMzFiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9wcmVzc2VkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNDMxMmMyNy4uZDlkMDJiZgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9wcmVzc2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU4YzM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDNjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zZWxlY3RlZC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDA2Yjc3OTAuLmFiN2M2MTIKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc2VsZWN0ZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNmQzZWE5YS4uYmFhZmVkNgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsX2Rpc2FibGUuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyNjQ2YmEwLi4xNzUxOTdiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlX2ZvY3VzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWxfZGlzYWJsZV9mb2N1c2VkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMDEzMjEwYy4uZWMxZmVmZgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWxfZGlzYWJsZV9mb2N1c2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlX2ZvY3VzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX3ByZXNzZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyNGNlZmQ0Li5jMWY5YTBmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX3NlbGVjdGVkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYmVkYmNlYi4uMGVhM2Y0MAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9zZWxlY3RlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX2Rpc2FibGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19kaXNhYmxlLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDRmZjYzNGIuLjJmYzVkMWEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19kaXNhYmxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX2Rpc2FibGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfbm9ybWFsLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGUwY2MzMzkuLmM0YTEwMjYKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19ub3JtYWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19wcmVzc2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVkOGUwMDguLjg0NmY4YmYKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfc2VsZWN0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19zZWxlY3RlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5YjFhMTAwLi42NTljMjg5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfc2VsZWN0ZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfc2VsZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9kaXNhYmxlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9kaXNhYmxlZC45LnBuZwppbmRleCAwZDI1YjZlLi5jNjUwM2M3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fZGlzYWJsZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX2Rpc2FibGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9kaXNhYmxlZF9mb2N1c2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWQuOS5wbmcKaW5kZXggZTIxZmQ3NS4uMTUyZGU4YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9ub3JtYWwuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmMTA0MDJmLi45MzkyNDk1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9wcmVzc2VkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMzY2YzZlMC4uYmVhYmE0NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fcHJlc3NlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fc2VsZWN0ZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmMDYzYzhkLi5lYzUxZmM5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9zZWxlY3RlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZGY1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwZjhjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjhkNmNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjRkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTU0NTVjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDhkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19mb2N1c2VkX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1OWZhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19mb2N1c2VkX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE2MTkyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19ub3JtYWxfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4YzZkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19ub3JtYWxfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbm9ybWFsX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGFmZWZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjE1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbm9ybWFsX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19ub3JtYWxfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3MDM4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbm9ybWFsX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0OGVlMmJhLi5jMGIxNGFhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE4YjdhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDUzOGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNWE0YWQ4OS4uMzE4OTU4MQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTc3N2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjIwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDdkNWM2NzYuLmYzMzc3MDMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2E4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1MjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyNDcyYzIwLi5jOTBkMmViCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTExMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2MzllYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5OGQ3NGNlLi5kNzk0NTBiOAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDcyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxYzdhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYjZhYjQ2Yy4uZGI1MGM0MwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQzOWNjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTQzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fcHJlc3NlZF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTEwOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYWY3MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fcHJlc3NlZF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0Y2M1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fcHJlc3NlZF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY4ODAwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X2Rpc2FibGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9kaXNhYmxlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmZjA2Njk3Li43MWEwMzdlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9kaXNhYmxlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X2Rpc2FibGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9ub3JtYWwucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYzMxMTU2Ni4uYmY1ZGEyMgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfbm9ybWFsLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfcHJlc3NlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBhYzdmZGVmLi41MmEzMDJkCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X3NlbGVjdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9zZWxlY3RlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlZTU0MTQ5Li5lMDY1NjgyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9zZWxlY3RlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X3NlbGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vZmZfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3N0YXJfb2ZmX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZlZWYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3N0YXJfb2ZmX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vZmZfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zdGFyX29mZl9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZmYzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vZmZfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vZmZfbm9ybWFsX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vZmZfbm9ybWFsX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4MDcyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zdGFyX29mZl9ub3JtYWxfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vZmZfbm9ybWFsX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3N0YXJfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzYzMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3N0YXJfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vbl9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vbl9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkM2Q3NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zdGFyX29uX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vbl9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3N0YXJfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjEwMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3N0YXJfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vbl9ub3JtYWxfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zdGFyX29uX25vcm1hbF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODYzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vbl9ub3JtYWxfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vbl9ub3JtYWxfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3Rhcl9vbl9ub3JtYWxfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyMGMyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zdGFyX29uX25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhOGM4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjI2MzE1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGJmYTE2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40N2E0M2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3ODdhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzhiZjhiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9ob2xvLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfaG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOTAzYmRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfaG9sby45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjRmMTdhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyYjQzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzNjJhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2M2MTQxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YjgxM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU0Njg2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1NmY0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM0YTZkZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjdhOWJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4NTNlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2hvbG8uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGMxZDg5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25faG9sby45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDc2NzE4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9ub3JtYWxfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMGU2MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9ub3JtYWxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTNjYWQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVhZDRjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX3ByZXNzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NjNhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2RpdmlkZXJfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMmMyMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2RpdmlkZXJfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9kaXZpZGVyX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxZTIyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIxZjAzNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl92ZXJ0aWNhbF9saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl92ZXJ0aWNhbF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjE4M2IxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGUyMDUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMmFmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaWNfY2xvc2VfZm9jdXNlZF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9pY19jbG9zZV9mb2N1c2VkX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlkN2Y5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaWNfY2xvc2VfZm9jdXNlZF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaWNfY2xvc2Vfbm9ybWFsX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2ljX2Nsb3NlX25vcm1hbF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NDE1MDdkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2ljX2Nsb3NlX25vcm1hbF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaWNfY2xvc2VfcHJlc3NlZF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9pY19jbG9zZV9wcmVzc2VkX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViYjBmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaWNfY2xvc2VfcHJlc3NlZF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTc0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlMjAxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZGlzYWJsZWRfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmI2OWM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZGlzYWJsZWRfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZmM1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9mb2N1c2VkX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmUwNGI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9mb2N1c2VkX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9mb2N1c2VkX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9mb2N1c2VkX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9mb2N1c2VkX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMjZhOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2ZvY3VzZWRfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9mb2N1c2VkX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDlhYTNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmMWJjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X25vcm1hbF9vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfbm9ybWFsX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGExZWZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfbm9ybWFsX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTBlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiNTNlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9wcmVzc2VkX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjE0NjIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9wcmVzc2VkX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmY5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9wcmVzc2VkX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9wcmVzc2VkX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9wcmVzc2VkX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkZGIzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X3ByZXNzZWRfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9wcmVzc2VkX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDE2MGU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlYjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2MDMwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfYm90dG9tX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfYm90dG9tX2hvbG8uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E4NGRlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19ib3R0b21faG9sby45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfYm90dG9tX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19ib3R0b21faG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzA4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfYm90dG9tX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfYm90dG9tX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfYm90dG9tX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5NTIxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19ib3R0b21faG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfZnVsbF9ob2xvLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2Z1bGxfaG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJlNGUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2Z1bGxfaG9sby45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfZnVsbF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfZnVsbF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwYWRhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19mdWxsX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfZnVsbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2Z1bGxfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDNkNmNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2Z1bGxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfaWNfY2xvc2VfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2ljX2Nsb3NlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODVhZTZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2ljX2Nsb3NlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfaWNfY2xvc2VfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19pY19jbG9zZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Njc4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfaWNfY2xvc2VfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfaWNfY2xvc2Vfbm9ybWFsX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfaWNfY2xvc2Vfbm9ybWFsX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0MmE4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19pY19jbG9zZV9ub3JtYWxfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfaWNfY2xvc2Vfbm9ybWFsX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2ljX2Nsb3NlX25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdjZjNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2ljX2Nsb3NlX25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfaWNfY2xvc2VfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2ljX2Nsb3NlX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjEzYzViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2ljX2Nsb3NlX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfaWNfY2xvc2VfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19pY19jbG9zZV9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjQ1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfaWNfY2xvc2VfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfbWlkZGxlX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfbWlkZGxlX2hvbG8uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1ZTc5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19taWRkbGVfaG9sby45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19taWRkbGVfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZmFlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5NDg4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG8uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3NWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ190b3BfaG9sby45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ190b3BfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NDZjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjZGM3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ190b3BfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGJkMWNjMGUuLjQxYjc3NmIKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiZDFjYzBlLi5lYjc1YTIyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKaW5kZXggY2I2MjcyMS4uNTVhNWU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYmQxY2MwZS4uNjBlMmNiMgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZwppbmRleCA2Mzg1OWY3Li5jZjM0NjEzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTFkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2Y2JiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKaW5kZXggOTlhNjdiOS4uNDFiNzc2YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCmluZGV4IDVjNTM3ZWUuLmViNzVhMjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCmluZGV4IGE2YzkyOTUuLjU1YTVlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKaW5kZXggOGYzNTMxNS4uNjBlMmNiMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhY2I3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJjODI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5ZjUyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzE4MWQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2E5NzVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25fZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjBhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25fZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkZmI5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjY1NDNjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25fZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ljX2Fycm93X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ljX2Fycm93X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YwMjU3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ljX2Fycm93X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25faWNfYXJyb3dfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGFlZTliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25faWNfYXJyb3dfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25faWNfYXJyb3dfZGlzYWJsZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjU5OTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25faWNfYXJyb3dfZGlzYWJsZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ljX2Fycm93X2Rpc2FibGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMmRiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2NTIyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ljX2Fycm93X2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25faWNfYXJyb3dfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzQ3ZDdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25faWNfYXJyb3dfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19ub3JtYWxfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ljX2Fycm93X25vcm1hbF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTViNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19ub3JtYWxfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19ub3JtYWxfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19ub3JtYWxfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2MmVjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ljX2Fycm93X25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxMDk5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX2ljX2Fycm93X3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9pY19hcnJvd19wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25faWNfYXJyb3dfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTVmOTRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25faWNfYXJyb3dfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9ub3JtYWxfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25fbm9ybWFsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGFjMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZHJvcGRvd25fbm9ybWFsX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9ub3JtYWxfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWI5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9ub3JtYWxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzgyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kcm9wZG93bl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0OWUyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Ryb3Bkb3duX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2VkaXRfcXVlcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTY0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDgzMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjM5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhOGQxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdkYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9leHBhbmRlcl9pY19tYXhpbWl6ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9leHBhbmRlcl9pY19tYXhpbWl6ZWQuOS5wbmcKaW5kZXggMmVjMjdhZi4uMDQ5NDNhYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZXhwYW5kZXJfaWNfbWF4aW1pemVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2V4cGFuZGVyX2ljX21heGltaXplZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9leHBhbmRlcl9pY19taW5pbWl6ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9leHBhbmRlcl9pY19taW5pbWl6ZWQuOS5wbmcKaW5kZXggMGMxOWJiNy4uN2JkZGJjZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZXhwYW5kZXJfaWNfbWluaW1pemVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2V4cGFuZGVyX2ljX21pbmltaXplZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19hZ2dyZWdhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ExNWIxLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjMyODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fYmFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fZmluZF9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjk2YTZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fZmluZF9wcmV2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTUwYzVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzZlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX3JvdW5kX21vcmVfZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX3JvdW5kX21vcmVfZGlzYWJsZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggM2YxMTc2Zi4uMDEyNTk0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fcm91bmRfbW9yZV9kaXNhYmxlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX3JvdW5kX21vcmVfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9yb3VuZF9tb3JlX25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fcm91bmRfbW9yZV9ub3JtYWwucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOGFiZGE0ZC4uMzNkN2Y4OQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fcm91bmRfbW9yZV9ub3JtYWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9yb3VuZF9tb3JlX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX25vcm1hbF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9ub3JtYWxfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlNWJiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9ub3JtYWxfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfcHJlc3NlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTJkYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2ZvY3VzZWRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfZm9jdXNlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjA4NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2ZvY3VzZWRfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZW1lcmdlbmN5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2VtZXJnZW5jeS5wbmcKaW5kZXggODljMDVlMy4uYjQ0NjVmZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZW1lcmdlbmN5LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19lbWVyZ2VuY3kucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2lucHV0X2FkZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19pbnB1dF9hZGQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjljZTU3NC4uZDI2ZWJhYwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19pbnB1dF9hZGQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2lucHV0X2FkZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hY2NvdW50X2xpc3QucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hY2NvdW50X2xpc3QucG5nCmluZGV4IGM2MjI2MWYuLmY4NThkMmMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWNjb3VudF9saXN0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FjY291bnRfbGlzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hZGQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hZGQucG5nCmluZGV4IDdiMGRmYzUuLjY1Y2MwMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWRkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FkZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hZ2VuZGEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hZ2VuZGEucG5nCmluZGV4IDg4NjU5YWUuLjZiYjVjYzggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWdlbmRhLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FnZW5kYS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hbGxmcmllbmRzLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWxsZnJpZW5kcy5wbmcKaW5kZXggNjFjNWY2Yy4uOGQxMWNhMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hbGxmcmllbmRzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FsbGZyaWVuZHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWx3YXlzX2xhbmRzY2FwZV9wb3J0cmFpdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Fsd2F5c19sYW5kc2NhcGVfcG9ydHJhaXQucG5nCmluZGV4IDNhY2FlMjcuLjdhZTE3NjAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWx3YXlzX2xhbmRzY2FwZV9wb3J0cmFpdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hbHdheXNfbGFuZHNjYXBlX3BvcnRyYWl0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FyY2hpdmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hcmNoaXZlLnBuZwppbmRleCA0OGZiY2M0Li45Y2E1YzYyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FyY2hpdmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYXJjaGl2ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hdHRhY2htZW50LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYXR0YWNobWVudC5wbmcKaW5kZXggODc2Mzc3Zi4uOGYxMTE1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hdHRhY2htZW50LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2F0dGFjaG1lbnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmFjay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2JhY2sucG5nCmluZGV4IDdhYmY4MTkuLmE2Y2Q3MTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmFjay5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Jsb2NrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2sucG5nCmluZGV4IDdlNzE2YzQuLmUxZjljMmMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2sucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2tlZF91c2VyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2tlZF91c2VyLnBuZwppbmRleCBiNjc5YmYzLi4zZGQ5YTRhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Jsb2NrZWRfdXNlci5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9ibG9ja2VkX3VzZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2FsbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NhbGwucG5nCmluZGV4IDkzZjk3Y2UuLjJjY2MwODcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2FsbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jYWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NhbWVyYS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NhbWVyYS5wbmcKaW5kZXggNGUxMGUzZS4uNWEzODUwZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jYW1lcmEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2FtZXJhLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NjLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2MucG5nCmluZGV4IDYyNTEwZDIuLjQ3OTA1YTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2MucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2hhdF9kYXNoYm9hcmQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jaGF0X2Rhc2hib2FyZC5wbmcKaW5kZXggZGMyMmU2YS4uZGRlNjc0MSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jaGF0X2Rhc2hib2FyZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jaGF0X2Rhc2hib2FyZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jbGVhcl9wbGF5bGlzdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZwppbmRleCA0NWNlN2U4Li5lNmJlNDhiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbC5wbmcKaW5kZXggNDY4M2Y2MS4uYTU0ZWE5ZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jbG9zZV9jbGVhcl9jYW5jZWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2xvc2VfY2xlYXJfY2FuY2VsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvbXBhc3MucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jb21wYXNzLnBuZwppbmRleCA3NTZiZDIyLi4xMDQyNzBmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvbXBhc3MucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY29tcGFzcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jb21wb3NlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY29tcG9zZS5wbmcKaW5kZXggYmMxNTNmYS4uNmFkMzc5ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jb21wb3NlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvbXBvc2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY29weS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvcHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTExNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvcHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY3JvcC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Nyb3AucG5nCmluZGV4IDgyOTcwYjguLjBkNGM5ZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY3JvcC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jcm9wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2N1dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2N1dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkMzc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY3V0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RheS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RheS5wbmcKaW5kZXggMzk2MTJlOC4uODQ0MjlhYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9kYXkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RlbGV0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RlbGV0ZS5wbmcKaW5kZXggY2U1ZWNjNC4uMmFlZDI2YSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9kZWxldGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGVsZXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RpcmVjdGlvbnMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9kaXJlY3Rpb25zLnBuZwppbmRleCA0MjQyM2IzLi4yM2Y2ZWIzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RpcmVjdGlvbnMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGlyZWN0aW9ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9lZGl0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZWRpdC5wbmcKaW5kZXggNDc0OGNkYS4uNjAyZGQxMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9lZGl0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2VkaXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZW1vdGljb25zLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZW1vdGljb25zLnBuZwppbmRleCBjYjUyMGFlLi4yZmFiNTE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Vtb3RpY29ucy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9lbW90aWNvbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZW5kX2NvbnZlcnNhdGlvbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2VuZF9jb252ZXJzYXRpb24ucG5nCmluZGV4IGU3MWJiMzYuLmMwNWEyMDcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZW5kX2NvbnZlcnNhdGlvbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9lbmRfY29udmVyc2F0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZpbmQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9maW5kLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FjNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9maW5kLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZvcndhcmQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9mb3J3YXJkLnBuZwppbmRleCA2YjE4MDRmLi42MDZlNmFhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZvcndhcmQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZm9yd2FyZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9mcmllbmRzbGlzdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZyaWVuZHNsaXN0LnBuZwppbmRleCBhYjljNTUyLi5hOTBlNTczIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZyaWVuZHNsaXN0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZyaWVuZHNsaXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2dhbGxlcnkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9nYWxsZXJ5LnBuZwppbmRleCBiYTA3OTQxLi43YzUyOGZhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2dhbGxlcnkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZ2FsbGVyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9nb3RvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZ290by5wbmcKaW5kZXggNDllNjhjZS4uYTFhY2VjYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9nb3RvLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2dvdG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaGVscC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2hlbHAucG5nCmluZGV4IGE1YjRhMmYuLjQzMDBlODYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaGVscC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9oZWxwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2hvbWUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9ob21lLnBuZwppbmRleCA5NDlmZDA0Li4zNWNiNTJhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2hvbWUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaG9tZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9pbmZvX2RldGFpbHMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9pbmZvX2RldGFpbHMucG5nCmluZGV4IDZiM2Y3ZmQuLjc2OTZjZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaW5mb19kZXRhaWxzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2luZm9fZGV0YWlscy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9pbnZpdGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9pbnZpdGUucG5nCmluZGV4IGY1Nzg1MjMuLjNjYjEyOWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaW52aXRlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ludml0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9sb2dpbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2xvZ2luLnBuZwppbmRleCAyOWUyZGI2Li5kMjNlYmYwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2xvZ2luLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2xvZ2luLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hbmFnZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hbmFnZS5wbmcKaW5kZXggYzA4ZTY0Zi4uYzdjNGNiY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbWFuYWdlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hbmFnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tYXBtb2RlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbWFwbW9kZS5wbmcKaW5kZXggODBjMmFhOS4uYzg5NWNjYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tYXBtb2RlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hcG1vZGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbWFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hcmsucG5nCmluZGV4IGU2MTI2ZmIuLjcyNGQ3ODcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbWFyay5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21vbnRoLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9udGgucG5nCmluZGV4IDNiZjM3MzguLjNlNTVhZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9udGgucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9udGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9yZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21vcmUucG5nCmluZGV4IDA1MmY4ZjIuLmNjZWNjMWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9yZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tb3JlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21vcmVvdmVyZmxvd19mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21vcmVvdmVyZmxvd19mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZjgwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9yZW92ZXJmbG93X2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21vcmVvdmVyZmxvd19mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODE4ODA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21vcmVvdmVyZmxvd19ub3JtYWxfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9yZW92ZXJmbG93X25vcm1hbF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjNjMWE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9yZW92ZXJmbG93X25vcm1hbF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9yZW92ZXJmbG93X25vcm1hbF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9yZW92ZXJmbG93X25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QyMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfbm9ybWFsX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlfY2FsZW5kYXIucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9teV9jYWxlbmRhci5wbmcKaW5kZXggYWZkNjk2ZC4uM2Q2ZWExZjMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlfY2FsZW5kYXIucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlfY2FsZW5kYXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlsb2NhdGlvbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215bG9jYXRpb24ucG5nCmluZGV4IDM3OWYxNWMuLjFiY2IwY2QgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlsb2NhdGlvbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9teWxvY2F0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215cGxhY2VzLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlwbGFjZXMucG5nCmluZGV4IDZjYjdjOGIuLjVmNzI2ZDggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlwbGFjZXMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlwbGFjZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbm90aWZpY2F0aW9ucy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X25vdGlmaWNhdGlvbnMucG5nCmluZGV4IDFiMWM1ZWQuLmZiNjM5MzcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbm90aWZpY2F0aW9ucy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9ub3RpZmljYXRpb25zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3Bhc3RlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcGFzdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzg1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3Bhc3RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3BsYXlfY2xpcC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3BsYXlfY2xpcC5wbmcKaW5kZXggNDM5ODkwYy4uZGRkZTAzYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9wbGF5X2NsaXAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcGxheV9jbGlwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3ByZWZlcmVuY2VzLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcHJlZmVyZW5jZXMucG5nCmluZGV4IDAzOWM3MjEuLjgxYmNhNGEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcHJlZmVyZW5jZXMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcHJlZmVyZW5jZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVjZW50X2hpc3RvcnkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZWNlbnRfaGlzdG9yeS5wbmcKaW5kZXggYmJkNWRlMy4uMGRkMTYyNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZWNlbnRfaGlzdG9yeS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZWNlbnRfaGlzdG9yeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZWZyZXNoLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVmcmVzaC5wbmcKaW5kZXggYmJiMDhmMS4uNTNjYWNjYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZWZyZXNoLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JlZnJlc2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVwb3J0X2ltYWdlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVwb3J0X2ltYWdlLnBuZwppbmRleCA0ZGIyMTg3Li5iNmFhNWQ2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JlcG9ydF9pbWFnZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZXBvcnRfaW1hZ2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmV2ZXJ0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmV2ZXJ0LnBuZwppbmRleCBmZmM2N2Q5Li4xMTg2MGE0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JldmVydC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZXZlcnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcm90YXRlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcm90YXRlLnBuZwppbmRleCA4MzVlMzkzLi44NTExNWFmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JvdGF0ZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yb3RhdGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2F2ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NhdmUucG5nCmluZGV4IDYyZDBiOWEuLmZjMjZjNWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2F2ZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zYXZlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlYXJjaC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlYXJjaC5wbmcKaW5kZXggOTE1NGQ2ZS4uZjc4MjM0ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWFyY2gucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2VhcmNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbGVjdF9hbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWxlY3RfYWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGU2NzQxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWxlY3RfYWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbmQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZW5kLnBuZwppbmRleCA5NTk3NzMxLi4yNTY3YjU4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbmQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2VuZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZXRfYXMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZXRfYXMucG5nCmluZGV4IDgzYTg3YjkuLjdlNzljMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2V0X2FzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NldF9hcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zaGFyZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NoYXJlLnBuZwppbmRleCBiNDlkOWFkNy4uYjQxYjM0OCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zaGFyZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zaGFyZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zbGlkZXNob3cucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zbGlkZXNob3cucG5nCmluZGV4IDYyMDg1ODUuLjkyNWY0ZWIxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NsaWRlc2hvdy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zbGlkZXNob3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc29ydF9hbHBoYWJldGljYWxseS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NvcnRfYWxwaGFiZXRpY2FsbHkucG5nCmluZGV4IDk0ZWUzYmUuLjVkNjg5OTggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc29ydF9hbHBoYWJldGljYWxseS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zb3J0X2FscGhhYmV0aWNhbGx5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NvcnRfYnlfc2l6ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NvcnRfYnlfc2l6ZS5wbmcKaW5kZXggYjQzYmM1Ny4uYzkzODhmZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zb3J0X2J5X3NpemUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc29ydF9ieV9zaXplLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3N0YXIucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zdGFyLnBuZwppbmRleCAzMGY2MzE0Li4yMWEyYzRiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3N0YXIucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc3Rhci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zdGFydF9jb252ZXJzYXRpb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zdGFydF9jb252ZXJzYXRpb24ucG5nCmluZGV4IDBkZmMwMjQuLmQ2M2QzYTcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc3RhcnRfY29udmVyc2F0aW9uLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3N0YXJ0X2NvbnZlcnNhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zdG9wLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc3RvcC5wbmcKaW5kZXggMzEwYjZjYS4uN2M5OWVkNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zdG9wLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3N0b3AucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdG9kYXkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV90b2RheS5wbmcKaW5kZXggNjUzZjcwY2QuLjRhOTM1MmQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdG9kYXkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdG9kYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdXBsb2FkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdXBsb2FkLnBuZwppbmRleCA3NDU0YmEzLi5kODQ1MTEyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3VwbG9hZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV91cGxvYWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdXBsb2FkX3lvdV90dWJlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdXBsb2FkX3lvdV90dWJlLnBuZwppbmRleCA0NDhmNmM0Li5kZjVmYTdmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3VwbG9hZF95b3VfdHViZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV91cGxvYWRfeW91X3R1YmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdmlldy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3ZpZXcucG5nCmluZGV4IDViOWYyYjkuLjc1MTU1ZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdmlldy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV92aWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3dlZWsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV93ZWVrLnBuZwppbmRleCBjMTg0ZjJlLi5jMjE2ZWNhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3dlZWsucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfd2Vlay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV96b29tLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfem9vbS5wbmcKaW5kZXggYzFkMThkNS4uOWZhNGQ3ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV96b29tLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3pvb20ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3NlYXJjaF9jYXRlZ29yeV9kZWZhdWx0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3NlYXJjaF9jYXRlZ29yeV9kZWZhdWx0LnBuZwppbmRleCBkMzY4YzU0Li5mNzgyMzRlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19zZWFyY2hfY2F0ZWdvcnlfZGVmYXVsdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc2VhcmNoX2NhdGVnb3J5X2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9ncmVlbl91cC5wbmcKaW5kZXggNmY4NWYzOC4uNjU2MDY5NiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9ncmVlbl91cC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9ncmVlbl91cC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9yZWRfdXAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9yZWRfdXAucG5nCmluZGV4IGJlYzA3ZjEuLjY5OGMzZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fcmVkX3VwLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX3JlZF91cC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nCmluZGV4IDQ2N2EwMTMuLjAxMDJhNjEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2dyZWVuLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9ncmVlbi5wbmcKaW5kZXggYzIxYjI0ZS4uODJhZDhmNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2dyZWVuLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZ3JlZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX3JlZC5wbmcKaW5kZXggODcwMDdhMy4uZjlkMGQzMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX3JlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX3JlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JheS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmF5LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDk1OTlmYjUuLjM0OTkyMDgKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JheS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JlZW4ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JlZW4ucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNDZkOWFiMy4uOTFlYWVjOAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmVlbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JlZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3JlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9yZWQucG5nCmluZGV4IDZjMGRjMGEuLjg4MThiOWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3JlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fcmVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV95ZWxsb3cucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1feWVsbG93LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDNmOWZiOGYuLmU1YmM1ZjYKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1feWVsbG93LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV95ZWxsb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X25vcm1hbC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA4Yjg5NTM4Li41MzI2YzdjCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9ub3JtYWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9wcmVzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9wcmVzc2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVjOTg3OTAuLjdiOTA2ZGYKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JheS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JheS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyODYxZThkLi5lYThjMzE1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmF5LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyZWVuLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmVlbi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlOTc0YmJjLi5hYTBjZWI5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmVlbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyZWVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fcmVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9yZWQucG5nCmluZGV4IDk2NDdmYTYuLmQ3NzJmYjYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9yZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9yZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV95ZWxsb3cucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9jb25maXJtX3llbGxvdy5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBhZDg3OGUxLi4zY2ZlYjY3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV95ZWxsb3cucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV95ZWxsb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfbm9ybWFsLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDAxYmJhMGIuLmRhNzcyNmIKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9ub3JtYWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9wcmVzc2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDY0N2U4MDIuLjQ1MGEzMjUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3RfZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3RfZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQzNDdmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9kaXZpZGVyX2hvcml6b250YWxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VjdGlvbl9oZWFkZXJfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWN0aW9uX2hlYWRlcl9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzMGQzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VjdGlvbl9oZWFkZXJfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VjdGlvbl9oZWFkZXJfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VjdGlvbl9oZWFkZXJfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EyNzczCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWN0aW9uX2hlYWRlcl9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYWN0aXZhdGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYWN0aXZhdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTUxNmMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9hY3RpdmF0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYWN0aXZhdGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2FjdGl2YXRlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjIxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2FjdGl2YXRlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjNjI0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNjlmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDllMWM0MmEuLmFiMzc3ZDgKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkYzljZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NjNjODAuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJiNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJiNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI3ZGExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3MmQzYTA4Li5iZDc0NDI2Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzJiYTJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNzU2OGIzMC4uZDE4ZDZmNwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNzg2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmNTBiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlYTg2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmQzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4ZTlhMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWYzZDdkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmIyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX211bHRpc2VsZWN0X2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfbXVsdGlzZWxlY3RfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDJmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX211bHRpc2VsZWN0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX211bHRpc2VsZWN0X2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX211bHRpc2VsZWN0X2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmMjc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfbXVsdGlzZWxlY3RfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQ1YmEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX3ByZXNzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzFjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X2JhY2tncm91bmQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X2JhY2tncm91bmQuOS5wbmcKaW5kZXggMWI0MzQzNS4uNjBmMDczMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9iYWNrZ3JvdW5kLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL21lbnVfYmFja2dyb3VuZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X2JhY2tncm91bmRfZmlsbF9wYXJlbnRfd2lkdGguOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X2JhY2tncm91bmRfZmlsbF9wYXJlbnRfd2lkdGguOS5wbmcKaW5kZXggZWM5NzRkNi4uMDllYWM5YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL21lbnVfYmFja2dyb3VuZF9maWxsX3BhcmVudF93aWR0aC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X2Ryb3Bkb3duX3BhbmVsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL21lbnVfZHJvcGRvd25fcGFuZWxfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzNhMzNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9kcm9wZG93bl9wYW5lbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9kcm9wZG93bl9wYW5lbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9kcm9wZG93bl9wYW5lbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWZlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X2Ryb3Bkb3duX3BhbmVsX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9zdWJtZW51X2JhY2tncm91bmQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X3N1Ym1lbnVfYmFja2dyb3VuZC45LnBuZwppbmRleCBjNzA1NmUwLi5jYmQ0NDAwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X3N1Ym1lbnVfYmFja2dyb3VuZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X3N1Ym1lbnVfYmFja2dyb3VuZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9uYXZfZGl2aWRlci5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9uYXZfZGl2aWRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhM2U2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL25hdl9kaXZpZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9vdmVyc2Nyb2xsX2VkZ2UucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvb3ZlcnNjcm9sbF9lZGdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjMWFhMy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9vdmVyc2Nyb2xsX2VkZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvb3ZlcnNjcm9sbF9nbG93LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL292ZXJzY3JvbGxfZ2xvdy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTgzODQuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvb3ZlcnNjcm9sbF9nbG93LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BpY3R1cmVfZW1lcmdlbmN5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BpY3R1cmVfZW1lcmdlbmN5LnBuZwppbmRleCA2NDk3MmMyLi5iMGYxMGY5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9waWN0dXJlX2VtZXJnZW5jeS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcGljdHVyZV9lbWVyZ2VuY3kucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2JvdHRvbV9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9ib3R0b21fYnJpZ2h0LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZWFhZTYyNC4uY2NhNDdkMwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9ib3R0b21fYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2JvdHRvbV9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9ib3R0b21fZGFyay45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDhiNWQzZDUuLjYyYTBiZDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX21lZGl1bS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2JvdHRvbV9tZWRpdW0uOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyNmVkZTQ0Li42ZWJiNGY3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2JvdHRvbV9tZWRpdW0uOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX21lZGl1bS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9jZW50ZXJfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX2JyaWdodC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGUwZWE5YzBmYS4uNzU2ZTllZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9jZW50ZXJfYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2NlbnRlcl9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9jZW50ZXJfZGFyay45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGFjMWY5MmQuLjc3YjQ1MjQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX21lZGl1bS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2NlbnRlcl9tZWRpdW0uOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAxY2UyYTZkLi5kZTRiZTJhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2NlbnRlcl9tZWRpdW0uOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX21lZGl1bS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2Z1bGxfYnJpZ2h0LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZTViMWI0Ni4uNmMzMGJlYwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2RhcmsuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA4ZjJmZGYwLi5mYzhjMDBlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2Z1bGxfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfdG9wX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX3RvcF9icmlnaHQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3NjZhNjU4Li5kZGQzMGFiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX3RvcF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfdG9wX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF90b3BfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX3RvcF9kYXJrLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMTEwODkwOS4uMTQ0ZDBmYwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF90b3BfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF90b3BfZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3dkb3duX2xlZnRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2thY3Rpb25zX2Fycm93ZG93bl9sZWZ0X2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E4NDE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2thY3Rpb25zX2Fycm93ZG93bl9sZWZ0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3dkb3duX2xlZnRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fbGVmdF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTg1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3dkb3duX2xlZnRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3dkb3duX3JpZ2h0X2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fcmlnaHRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MzJhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3dkb3duX3JpZ2h0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3dkb3duX3JpZ2h0X2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3dkb3duX3JpZ2h0X2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2NmFkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fcmlnaHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3d1cF9sZWZ0X2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX2xlZnRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjE4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3d1cF9sZWZ0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3d1cF9sZWZ0X2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3d1cF9sZWZ0X2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5MDUwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX2xlZnRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3d1cF9sZWZ0X3JpZ2h0X2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX2xlZnRfcmlnaHRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Y2Y0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3d1cF9sZWZ0X3JpZ2h0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2FjdGlvbnNfYXJyb3d1cF9yaWdodF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2thY3Rpb25zX2Fycm93dXBfcmlnaHRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM3ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2thY3Rpb25zX2Fycm93dXBfcmlnaHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDQzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zY3JvbGxiYXJfaGFuZGxlX2FjY2VsZXJhdGVkX2FuaW0yLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2Nyb2xsYmFyX2hhbmRsZV9hY2NlbGVyYXRlZF9hbmltMi45LnBuZwppbmRleCAwYTI4MjIzLi5jOTE2NzgwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zY3JvbGxiYXJfaGFuZGxlX2FjY2VsZXJhdGVkX2FuaW0yLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3Njcm9sbGJhcl9oYW5kbGVfYWNjZWxlcmF0ZWRfYW5pbTIuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2NydWJiZXJfY29udHJvbF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NjcnViYmVyX2NvbnRyb2xfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3MjMwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NjcnViYmVyX2NvbnRyb2xfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2NydWJiZXJfdHJhY2tfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2NydWJiZXJfdHJhY2tfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDcxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zY3J1YmJlcl90cmFja19ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2NydWJiZXJfdHJhY2tfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NjcnViYmVyX3RyYWNrX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1YmZhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NjcnViYmVyX3RyYWNrX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl9ibGFja18xNi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zcGlubmVyX2JsYWNrXzE2LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDQyZWI3MzRmLi5lYjM0ODY3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMTYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMjAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl9ibGFja18yMC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBjODhmYmM5Li5kYWMwNmQ3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMjAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNDgucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl9ibGFja180OC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3ZjljNGYzLi4zMzdmNzJhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNDgucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNzYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl9ibGFja183Ni5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBjMWMxNzdlLi4yZWRjM2U3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNzYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNzYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfMTYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl93aGl0ZV8xNi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0ZTAzN2FlLi43OTE0YTY4Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfMTYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNDgucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl93aGl0ZV80OC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkODUxOWYyLi5mYWVlOGNhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNDgucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNzYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl93aGl0ZV83Ni5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2ZDZhYTk0Li5jZDI2Mzc5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNzYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNzYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2NhbGxfbXV0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jYWxsX211dGUucG5nCmluZGV4IDBjZjVlZjUuLmI4NmQyY2EgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2NhbGxfbXV0ZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfY2FsbF9tdXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jYXJfbW9kZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jYXJfbW9kZS5wbmcKaW5kZXggZTcwMGQ3OS4uMDM0OTlhNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfY2FyX21vZGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Nhcl9tb2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jaGF0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2NoYXQucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNzFlYThkZS4uMDk3YTk3OQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jaGF0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jaGF0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9kaXNrX2Z1bGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfZGlza19mdWxsLnBuZwppbmRleCA2NmU3MzgwLi42Y2VlZGE4IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9kaXNrX2Z1bGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Rpc2tfZnVsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfZW1haWxfZ2VuZXJpYy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9lbWFpbF9nZW5lcmljLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM1ZmNhYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9lbWFpbF9nZW5lcmljLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Vycm9yLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Vycm9yLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGIzYTE4YjMuLjM3Yzg4NTMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfZXJyb3IucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Vycm9yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9nbWFpbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9nbWFpbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOGJlYWUuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfZ21haWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbWlzc2VkX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbWlzc2VkX2NhbGwucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggM2MxOWM5My4uMTkyNTc0ZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9taXNzZWRfY2FsbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbWlzc2VkX2NhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X21vcmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbW9yZS5wbmcKaW5kZXggZjU0YjNkNC4uMWM3ZjlkYiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbW9yZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbW9yZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc2RjYXJkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkZDk0N2E1Li5kM2I2MjRiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc2RjYXJkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zZGNhcmRfcHJlcGFyZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zZGNhcmRfcHJlcGFyZS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0YjliOWNhLi5hNDgzYmEyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZF9wcmVwYXJlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zZGNhcmRfcHJlcGFyZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc2RjYXJkX3VzYi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zZGNhcmRfdXNiLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGZiMmIyNmEuLmE1ZTM2OWUyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZF91c2IucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZF91c2IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NpbV90b29sa2l0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NpbV90b29sa2l0LnBuZwppbmRleCA4ODY1YmRhLi4zYjE0YzI2IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zaW1fdG9vbGtpdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc2ltX3Rvb2xraXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3N5bmMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc3luYy5wbmcKaW5kZXggMDA0Y2ZhYi4uNmY5Y2Y4NCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc3luYy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc3luYy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc3luY19hbmltMC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zeW5jX2FuaW0wLnBuZwppbmRleCA2OTczZmM1Li42ZjljZjg0IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zeW5jX2FuaW0wLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zeW5jX2FuaW0wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zeW5jX2Vycm9yLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3N5bmNfZXJyb3IucG5nCmluZGV4IDI2YjI0NDYuLjZlM2I1NDUgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3N5bmNfZXJyb3IucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3N5bmNfZXJyb3IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3ZvaWNlbWFpbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV92b2ljZW1haWwucG5nCmluZGV4IDViNzc4NDYuLjcwYjI0MTEgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3ZvaWNlbWFpbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfdm9pY2VtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3dpZmlfaW5fcmFuZ2UucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMDQ1ODEyNC4uZTk0MDVkZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19hZGIucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYWRiLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGZkZjZjNmMuLmFlZjg2NTAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYWRiLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19hZGIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV8xMC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0NDg2NTUzLi5jODE2MTZiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAwLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMjAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV8yMC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBjOGY5YzkyLi5lYjVlZjA5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMjAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfNDAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV80MC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5XzYwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfNjAucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV84MC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5XzgwLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfY2hhcmdlX2FuaW0wLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfY2hhcmdlX2FuaW0wLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGM3NDY0ZjcuLjlhNmM2ODMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfY2hhcmdlX2FuaW0wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5OTdmZWIzLi5jNDBjNjIyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfY2hhcmdlX2FuaW0xLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTIucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTIucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTMucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTUucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV91bmtub3duLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfdW5rbm93bi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkYWRmZThkLi4xYTlhYmFmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfdW5rbm93bi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV91bmtub3duLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlOGZiYzllLi43YThiNzhmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV91c2IucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV91c2IucG5nCmluZGV4IGU5MTZmYmIuLjRjMTRjMDcgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfdXNiLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX3VzYi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZG93bmxvYWRfYW5pbTAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZG93bmxvYWRfYW5pbTAucG5nCmluZGV4IGMxMjdlNmUuLmQ5YzllNGMgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2Rvd25sb2FkX2FuaW0wLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kb3dubG9hZF9hbmltMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX29uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2dwc19vbi5wbmcKaW5kZXggMWUxYWIzMi4uOTlhOGM2YyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX29uLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19ncHNfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcGhvbmVfY2FsbC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5YjVmMDc1Li45NTA3MTNiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfZm9yd2FyZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19waG9uZV9jYWxsX2ZvcndhcmQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMDMyZjhmMS4uMDdhMmU5ZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19waG9uZV9jYWxsX2ZvcndhcmQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfZm9yd2FyZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcGhvbmVfY2FsbF9vbl9ob2xkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfb25faG9sZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA1YjBhNjhkLi4wMzNhNTU4Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfb25faG9sZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcGhvbmVfY2FsbF9vbl9ob2xkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8wX2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMF9jZG1hLnBuZwppbmRleCAxNGE3ZTk0Li4yOGIyZmMyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8wX2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzBfY2RtYS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMV9jZG1hLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzFfY2RtYS5wbmcKaW5kZXggOWNmMDRiNS4uYTc0NDljZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMV9jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8xX2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzJfY2RtYS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8yX2NkbWEucG5nCmluZGV4IGRiZDMzMDguLmM0YzFmYjggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzJfY2RtYS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMl9jZG1hLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8zX2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfM19jZG1hLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGEzYTZiNmMuLjBhMzJkMmUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfM19jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8zX2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzRfY2RtYS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF80X2NkbWEucG5nCmluZGV4IDBmOTUwNDEuLmJlZWZkZDIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzRfY2RtYS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfNF9jZG1hLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfMF9jZG1hLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8wX2NkbWEucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYTJmYTU0Ny4uMzMzMzkzMwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfMF9jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfMF9jZG1hLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfMV9jZG1hLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8xX2NkbWEucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMTdjODY4MS4uNmQ2OWVkNgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfMV9jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfMV9jZG1hLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfMl9jZG1hLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8yX2NkbWEucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNGEyMWZiNi4uYTc4OTU3ZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfMl9jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfMl9jZG1hLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yYV9zaWduYWxfM19jZG1hLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8zX2NkbWEucG5nCmluZGV4IDE4OGIxZjkuLjkxMDM3ZGEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8zX2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8zX2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF80X2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcmFfc2lnbmFsXzRfY2RtYS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA1NzI5ZjdkLi40NGMxZGNhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF80X2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF80X2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NlY3VyZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zZWN1cmUucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMDg4OWU0OS4uNGJhZTI1OAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zZWN1cmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NlY3VyZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzBfY2RtYS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfMF9jZG1hLnBuZwppbmRleCBhZjQzZTAwLi4zYzdkYjA4IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfMF9jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfMF9jZG1hLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfMV9jZG1hLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF8xX2NkbWEucG5nCmluZGV4IDRmZmU0MjEuLmY4ZjQwYTggMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF8xX2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF8xX2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF8yX2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzJfY2RtYS5wbmcKaW5kZXggNmYyN2I5Ni4uYTI0MzE5NSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzJfY2RtYS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzJfY2RtYS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzNfY2RtYS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfM19jZG1hLnBuZwppbmRleCBkZGM0NmIwLi45YzM2OWU3IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfM19jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfM19jZG1hLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfNF9jZG1hLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF80X2NkbWEucG5nCmluZGV4IGZiM2NmZTkuLjIxOWJiYmQgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF80X2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF80X2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMC5wbmcKaW5kZXggYjY5N2NhNC4uYWUxOGVjZCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb18xLnBuZwppbmRleCBhNjFkZTRkLi40ZmVkOTJjIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb18xLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb18xLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb18yLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzIucG5nCmluZGV4IDYyZTAzOTMuLjk2ZjEyNDggMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzIucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMy5wbmcKaW5kZXggMDllYWU5ZC4uYjBlMTMyOCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fNC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb180LnBuZwppbmRleCA0MDEyYWM1Li5kYTE1NjQ1IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb180LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb180LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zcGVha2VycGhvbmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc3BlYWtlcnBob25lLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDIxZjk2YzQuLjUxZGVhNTgKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc3BlYWtlcnBob25lLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zcGVha2VycGhvbmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3RldGhlcl9ibHVldG9vdGgucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2JsdWV0b290aC5wbmcKaW5kZXggNGViZWU1OC4uZTQzZmJhZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2JsdWV0b290aC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2JsdWV0b290aC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2dlbmVyYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2dlbmVyYWwucG5nCmluZGV4IGUyM2Y3ZjkuLmM0MmIwMGMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3RldGhlcl9nZW5lcmFsLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfZ2VuZXJhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX3VzYi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfdXNiLnBuZwppbmRleCBkNDMyZjlhLi5jNmM1MzNkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfdXNiLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfdXNiLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfd2lmaS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfd2lmaS5wbmcKaW5kZXggNzRkZmJiYS4uOWZjYWRlZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX3dpZmkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3RldGhlcl93aWZpLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190aHJvdHRsZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGhyb3R0bGVkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWFmYzAuLjMzYzA1MjEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGhyb3R0bGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190aHJvdHRsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdnBfcGhvbmVfY2FsbC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA4M2U4ZWFkLi5kZmIzNDI0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGxfb25faG9sZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c192cF9waG9uZV9jYWxsX29uX2hvbGQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOTczMWM0Ni4uNDAyMjk1YgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c192cF9waG9uZV9jYWxsX29uX2hvbGQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGxfb25faG9sZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfd2FybmluZy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c193YXJuaW5nLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGNiOGEzZDQuLjM3Yzg4NTMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfd2FybmluZy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfd2FybmluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9oZWFkZXJfYmFja2dyb3VuZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaGVhZGVyX2JhY2tncm91bmQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3OWQ3N2FhLi4zN2I1ZmVmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaGVhZGVyX2JhY2tncm91bmQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9oZWFkZXJfYmFja2dyb3VuZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9mb2N1cy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCmluZGV4IGIwN2M3YmMuLjA4NzZiYzYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwppbmRleCBkZTJmM2MzLi44MTBjOTUwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCmluZGV4IGI1ZWFiODMuLjM0M2U0Y2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmUyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZwppbmRleCAxMDVmN2QwLi5kYThhZmVlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X2xlZnRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9hcnJvd19sZWZ0X2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkNmY3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9hcnJvd19sZWZ0X2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X2xlZnRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfYXJyb3dfbGVmdF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZhYThjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X2xlZnRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjI2MDM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNWZiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2RpdmlkZXJfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyY2IwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2RpdmlkZXJfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZGl2aWRlcl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmY0ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2RpdmlkZXJfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzLjkucG5nCmluZGV4IDc1OTFjMDcuLjZlOGE3MWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9mb2N1cy45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZm9jdXMuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzX2Jhcl9sZWZ0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzX2Jhcl9sZWZ0LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMGVlODM0Ny4uNTExOTRhNAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZm9jdXNfYmFyX2xlZnQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzX2Jhcl9sZWZ0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9mb2N1c19iYXJfcmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZm9jdXNfYmFyX3JpZ2h0LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMGVlODM0Ny4uNTExOTRhNAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZm9jdXNfYmFyX3JpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9mb2N1c19iYXJfcmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMDE3OThhMy4uMTE5YjJjNgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfcHJlc3MuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9wcmVzc19iYXJfbGVmdC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9wcmVzc19iYXJfbGVmdC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVlMTI5YmEuLmRjMmZiY2UKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzX2Jhcl9sZWZ0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9wcmVzc19iYXJfbGVmdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfcHJlc3NfYmFyX3JpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzX2Jhcl9yaWdodC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVlMTI5YmEuLmRjMmZiY2UKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzX2Jhcl9yaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfcHJlc3NfYmFyX3JpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDZlZTc3NWYuLmYwMzZiOWEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdGVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc2VsZWN0ZWRfYmFyX2xlZnQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc2VsZWN0ZWRfYmFyX2xlZnQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAwM2JjYzEzLi5hYTkzNWZlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZF9iYXJfbGVmdC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc2VsZWN0ZWRfYmFyX2xlZnQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdGVkX2Jhcl9yaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZF9iYXJfcmlnaHQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmMjI4NDQ1Li5hYTkzNWZlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZF9iYXJfcmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdGVkX2Jhcl9yaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc2VsZWN0b3JfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdG9yX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFiOWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdG9yX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc3RyaXBfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zdHJpcF9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MzdmNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc3RyaXBfaG9sby45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfdW5zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl91bnNlbGVjdGVkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNjc1NjFlMi4uYzNhMWYzMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfdW5zZWxlY3RlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfdW5zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dF9zZWxlY3RfaGFuZGxlLnBuZwppbmRleCA4MGQ0OGFiLi45M2E1YTE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRfc2VsZWN0X2hhbmRsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dF9zZWxlY3RfaGFuZGxlX21pZGRsZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlLnBuZwppbmRleCBkYWY4ZTY4Li41YTgzYzZjIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjdiNmU5OS4uNGMyMDE3OQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjMjE5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDNlNGY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAzMDExNTAyLi44MTU2OWQxCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0MjcxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcyNzUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZTBmODJlYi4uMjU5MTQ5MAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDI0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhMDdjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyOTZkM2RhLi5hNDJkODdmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjcxYWM5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjE3MjJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlYXJjaF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjYyNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlYXJjaF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWFyY2hfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MWVkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWFyY2hfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2YzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyYjEzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWFyY2hfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBjZjJjYWUzLi5hMzZlZDcyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3MWFjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxNzIyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RpdGxlX2Jhcl9zaGFkb3cuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90aXRsZV9iYXJfc2hhZG93LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYzNhMGEyMy4uZTZkYWI2MwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90aXRsZV9iYXJfc2hhZG93LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RpdGxlX2Jhcl9zaGFkb3cuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vZmYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vZmYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzNkYjQ4Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwZGE2ZTMuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3VubG9jay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3VubG9jay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5YWYxYWYuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTU4MzkyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzFmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZWVjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjMzRiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ4MzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODFhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwM2YzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiYmQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ub3JtYWxfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfbm9ybWFsX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzNDYxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfbm9ybWFsX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ub3JtYWxfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQzZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ub3JtYWxfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjlmNGYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWQ0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZWEzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNDVkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Y2MwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllYmJjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjYzAxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWViYmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiZjdmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjJkMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2Y0NTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzdmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjYTA5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2ZvY3VzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWMzM2YwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTRkNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OGYzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX25vcm1hbF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX25vcm1hbF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWMwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fbm9ybWFsX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX25vcm1hbF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ub3JtYWxfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3NmJlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ub3JtYWxfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3MzNmYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ExNWQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjkzZjhiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YWIyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTAwM2JlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3M2YxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2E1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5YTYxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTc2NzZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODU5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkYmY2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9ub3JtYWxfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjdlYjU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTVlZjZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWQ0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsLjkucG5nCmluZGV4IDVkZGRkNDYuLmJjZWRkNWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsX2Rpc2FibGUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWxfZGlzYWJsZS45LnBuZwppbmRleCA2YWI1YzRhLi5hYzYyNjBmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWxfZGlzYWJsZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWxfZGlzYWJsZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWxfZGlzYWJsZV9mb2N1c2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsX2Rpc2FibGVfZm9jdXNlZC45LnBuZwppbmRleCBjNjViYWNlLi40ZWUxYjNmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWxfZGlzYWJsZV9mb2N1c2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlX2ZvY3VzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfc21hbGxfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X3NtYWxsX3ByZXNzZWQuOS5wbmcKaW5kZXggNDNlODJmOS4uMjVlMzhmNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfc21hbGxfcHJlc3NlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9zbWFsbF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X3NtYWxsX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfc21hbGxfc2VsZWN0ZWQuOS5wbmcKaW5kZXggN2EzNzZhOS4uY2MyMDljNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfc21hbGxfc2VsZWN0ZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfc21hbGxfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2Ryb3Bkb3duX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9ub3JtYWwuOS5wbmcKaW5kZXggODU0MDUwMS4uZjZlOWExOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2Ryb3Bkb3duX25vcm1hbC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZHJvcGRvd25fbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2Ryb3Bkb3duX3ByZXNzZWQuOS5wbmcKaW5kZXggOWE1MDM5Ni4uM2JkZjUyZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2Ryb3Bkb3duX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2Ryb3Bkb3duX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2Ryb3Bkb3duX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2Ryb3Bkb3duX3NlbGVjdGVkLjkucG5nCmluZGV4IGEwYTNmZWYuLjA4Nzk1NmUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9zZWxlY3RlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZHJvcGRvd25fc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzcxODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzNWZiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjM4YTRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjg2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZm9jdXNlZF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTVkMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NjdiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZm9jdXNlZF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19mb2N1c2VkX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzYTA2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19mb2N1c2VkX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZm9jdXNlZF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTgwZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX25vcm1hbF9vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2ZDkwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX25vcm1hbF9vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fbm9ybWFsX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTEzMmVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX25vcm1hbF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX25vcm1hbF9vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX25vcm1hbF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTZkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fbm9ybWFsX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX25vcm1hbF9vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzOTQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzY2VmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkZWY1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTkzMTBiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjhiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMGRkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1Y2YxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU0NTAwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjdhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1YzMxMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTA3YzVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZhNzRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MWM5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fcHJlc3NlZF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWIzMmQxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzU4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fcHJlc3NlZF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmYTdiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fcHJlc3NlZF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2E2MzRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb2ZmX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9zdGFyX29mZl9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzZTUwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9zdGFyX29mZl9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb2ZmX2ZvY3VzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fc3Rhcl9vZmZfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzlmZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb2ZmX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb2ZmX25vcm1hbF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb2ZmX25vcm1hbF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzVmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fc3Rhcl9vZmZfbm9ybWFsX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9zdGFyX29mZl9ub3JtYWxfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyMjM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9zdGFyX29mZl9ub3JtYWxfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb25fZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb25fZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDI1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fc3Rhcl9vbl9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9zdGFyX29uX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3YzNiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9zdGFyX29uX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb25fbm9ybWFsX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fc3Rhcl9vbl9ub3JtYWxfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTkzZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb25fbm9ybWFsX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb25fbm9ybWFsX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3N0YXJfb25fbm9ybWFsX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2ZkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fc3Rhcl9vbl9ub3JtYWxfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZWVjYzUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc2ZDRmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlY2QxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTcwMTVlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MTk0OWIyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1MWY3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2hvbG8uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGNhNjU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX25vcm1hbF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDRiOTUwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX25vcm1hbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzBhMWZjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWY5ZDJiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NzIzNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYyYjY3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjg0MThiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjlhMTFhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOTgzYzhhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVkODQwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzFmMzZiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25faG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25faG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NmNiZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMDIzYzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9ub3JtYWxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0MDA4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2ZTExNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTEzYWVkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1MDhmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfZGl2aWRlcl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxNzI2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfZGl2aWRlcl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2RpdmlkZXJfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODI0YWQyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2RpdmlkZXJfdmVydGljYWxfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjdlZDZkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43M2FjMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2RpdmlkZXJfdmVydGljYWxfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkYWFlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGU2NGM1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9mb2N1c2VkX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2ljX2Nsb3NlX2ZvY3VzZWRfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTkxNDllNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9mb2N1c2VkX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9ub3JtYWxfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfaWNfY2xvc2Vfbm9ybWFsX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzNzg4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfaWNfY2xvc2Vfbm9ybWFsX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9wcmVzc2VkX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2ljX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjliMDQwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9wcmVzc2VkX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZGlzYWJsZWRfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwOTRiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTczNzdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZGlzYWJsZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9kaXNhYmxlZF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzUyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9kaXNhYmxlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZGlzYWJsZWRfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiZDkwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9mb2N1c2VkX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjI0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9mb2N1c2VkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZm9jdXNlZF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5M2NlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2RjMWRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZm9jdXNlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9mb2N1c2VkX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzdlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9mb2N1c2VkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODI0Zjc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfbm9ybWFsX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9ub3JtYWxfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NmY2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9ub3JtYWxfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfbm9ybWFsX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmZDQxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTcyZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfbm9ybWFsX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9wcmVzc2VkX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjcwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9wcmVzc2VkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfcHJlc3NlZF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkZDFkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2YyYjFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfcHJlc3NlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9wcmVzc2VkX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGY2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9wcmVzc2VkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzJkYjdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYzMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNkMGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2JvdHRvbV9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhMzBhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2YzNDRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19mdWxsX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfZnVsbF9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzk0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfZnVsbF9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19mdWxsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19mdWxsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJmMjhhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2Z1bGxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19mdWxsX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfZnVsbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZGZlODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfZnVsbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19pY19jbG9zZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfaWNfY2xvc2VfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDhmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfaWNfY2xvc2VfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19pY19jbG9zZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2ljX2Nsb3NlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1MzViZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19pY19jbG9zZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19pY19jbG9zZV9ub3JtYWxfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19pY19jbG9zZV9ub3JtYWxfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDNlNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2ljX2Nsb3NlX25vcm1hbF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19pY19jbG9zZV9ub3JtYWxfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfaWNfY2xvc2Vfbm9ybWFsX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YWZmNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfaWNfY2xvc2Vfbm9ybWFsX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19pY19jbG9zZV9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfaWNfY2xvc2VfcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Zjc2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfaWNfY2xvc2VfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19pY19jbG9zZV9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2ljX2Nsb3NlX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZjlhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19pY19jbG9zZV9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRhNWNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlN2VjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI3MDYyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZDUxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfdG9wX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfdG9wX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjk3ZWFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWJiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKaW5kZXggMzk1MjI3YS4uNDFiNzc2YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKaW5kZXggNWM1MzdlZS4uZWI3NWEyMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZwppbmRleCBiZjQ1ZTM4Li41NWE1ZTUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKaW5kZXggOTQ0NGYwZC4uNjBlMmNiMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKaW5kZXggMDg4MzhjYS4uY2YzNDYxMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjU0OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDJkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCmluZGV4IDM5NTIyN2EuLjQxYjc3NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZwppbmRleCA1YzUzN2VlLi5lYjc1YTIyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZwppbmRleCA3MDJiODc4Li41NWE1ZTUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCmluZGV4IDhmMzUzMTUuLjYwZTJjYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjk2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkZjFiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YWQ5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4MmRjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMjk5MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25fZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODMxNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25fZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjFkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwZmU5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiMzU1NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2ljX2Fycm93X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25faWNfYXJyb3dfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjUwMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25faWNfYXJyb3dfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25faWNfYXJyb3dfZGlzYWJsZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjYzNDExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25faWNfYXJyb3dfZGlzYWJsZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2ljX2Fycm93X2Rpc2FibGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjI0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19kaXNhYmxlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5NmI3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2ljX2Fycm93X2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25faWNfYXJyb3dfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTM3MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25faWNfYXJyb3dfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19ub3JtYWxfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2ljX2Fycm93X25vcm1hbF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NmJlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19ub3JtYWxfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19ub3JtYWxfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19ub3JtYWxfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwMDUwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2ljX2Fycm93X25vcm1hbF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyMWRjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX2ljX2Fycm93X3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9pY19hcnJvd19wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25faWNfYXJyb3dfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmZjMTEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25faWNfYXJyb3dfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9ub3JtYWxfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25fbm9ybWFsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWRhMGNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZHJvcGRvd25fbm9ybWFsX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9ub3JtYWxfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTVhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9ub3JtYWxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTcwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kcm9wZG93bl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2MGM4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Ryb3Bkb3duX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2VkaXRfcXVlcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzIyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjk1N2I4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGQ0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlNTc5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZW1vX2ltX2VtYmFycmFzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lbW9faW1fZW1iYXJyYXNzZWQucG5nCnJlbmFtZSB0byBjb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2V4cGFuZGVyX2ljX21heGltaXplZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2V4cGFuZGVyX2ljX21heGltaXplZC45LnBuZwppbmRleCBkNWMzMjc2Li40NjVjYWJkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9leHBhbmRlcl9pY19tYXhpbWl6ZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZXhwYW5kZXJfaWNfbWF4aW1pemVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2V4cGFuZGVyX2ljX21pbmltaXplZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2V4cGFuZGVyX2ljX21pbmltaXplZC45LnBuZwppbmRleCA0NTE1YjQyLi45OTY3ZWNiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9leHBhbmRlcl9pY19taW5pbWl6ZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZXhwYW5kZXJfaWNfbWluaW1pemVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYWdncmVnYXRlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmUyYjAuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYWdncmVnYXRlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fYmFjay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fYmFjay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZmY0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fZmluZF9uZXh0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9maW5kX25leHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZGMyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fZmluZF9uZXh0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fZmluZF9wcmV2LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9maW5kX3ByZXYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlM2RhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fZmluZF9wcmV2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fbmV4dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fbmV4dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzZjZjQzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9uZXh0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2Vfbm9ybWFsX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX25vcm1hbF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjJhMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX25vcm1hbF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfcHJlc3NlZF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9wcmVzc2VkX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYThlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfcHJlc3NlZF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfZm9jdXNlZF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19mb2N1c2VkX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWYyZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfZm9jdXNlZF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FjY291bnRfbGlzdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FjY291bnRfbGlzdC5wbmcKaW5kZXggZDNhZjAxYi4uZjA5NDViMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hY2NvdW50X2xpc3QucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWNjb3VudF9saXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FkZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FkZC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA1N2E0MDk5Li42NzUyYmZkCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWRkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FkZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hZ2VuZGEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hZ2VuZGEucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggM2ZiMDAzMS4uOWYyYzFkYwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FnZW5kYS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hZ2VuZGEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWxsZnJpZW5kcy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FsbGZyaWVuZHMucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZTRlMjcyNy4uYTViZDMzMQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FsbGZyaWVuZHMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWxsZnJpZW5kcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hbHdheXNfbGFuZHNjYXBlX3BvcnRyYWl0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWx3YXlzX2xhbmRzY2FwZV9wb3J0cmFpdC5wbmcKaW5kZXggNDUxY2NjOS4uNjg5MTFjNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hbHdheXNfbGFuZHNjYXBlX3BvcnRyYWl0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Fsd2F5c19sYW5kc2NhcGVfcG9ydHJhaXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYXJjaGl2ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FyY2hpdmUucG5nCmluZGV4IDcyMzFmYmI1Li5hNDU5OWUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FyY2hpdmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYXJjaGl2ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hdHRhY2htZW50LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYXR0YWNobWVudC5wbmcKaW5kZXggODNlMDY4Ny4uODlkNjI2ZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hdHRhY2htZW50LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2F0dGFjaG1lbnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYmFjay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2JhY2sucG5nCmluZGV4IDkxZmEzZTcuLjVjZTUwZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYmFjay5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Jsb2NrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYmxvY2sucG5nCmluZGV4IGZjZTkyOTcuLjQyMmVlYjEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYmxvY2sucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYmxvY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYmxvY2tlZF91c2VyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYmxvY2tlZF91c2VyLnBuZwppbmRleCA1NTMyMjQ1Li41YTU2MTliIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Jsb2NrZWRfdXNlci5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9ibG9ja2VkX3VzZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2FsbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NhbGwucG5nCmluZGV4IGViMDU5NDkuLmE2M2Y4NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2FsbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NhbWVyYS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NhbWVyYS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3ZmRkZjdjLi5jZGY3Y2EzCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2FtZXJhLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NhbWVyYS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NjLnBuZwppbmRleCA5N2ZiNjYzLi40ODc2MDIxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NjLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NjLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NoYXRfZGFzaGJvYXJkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2hhdF9kYXNoYm9hcmQucG5nCmluZGV4IDU0ZTkwMjMuLjM3ZmQzY2JkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NoYXRfZGFzaGJvYXJkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NoYXRfZGFzaGJvYXJkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2xlYXJfcGxheWxpc3QucG5nCmluZGV4IDUyNzkxYTAuLjc1MGRiNjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2xlYXJfcGxheWxpc3QucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2xlYXJfcGxheWxpc3QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2xvc2VfY2xlYXJfY2FuY2VsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2xvc2VfY2xlYXJfY2FuY2VsLnBuZwppbmRleCAwNGE3NmI1Li43ODIyMmVhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jbG9zZV9jbGVhcl9jYW5jZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY29tcGFzcy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NvbXBhc3MucG5nCmluZGV4IGI1Zjg4NWUuLjc3MTdkZGUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY29tcGFzcy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jb21wYXNzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NvbXBvc2UucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jb21wb3NlLnBuZwppbmRleCAxMjEyMjhjLi4xYjQ3MzNlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NvbXBvc2UucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY29tcG9zZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jb3B5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY29weS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkNjI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY29weS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jcm9wLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY3JvcC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA0ODkyY2EwLi5jMGRmOTk2Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY3JvcC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jcm9wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2N1dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2N1dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0NzMzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY3V0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2RheS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2RheS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBmMzY2YzFiLi5kYjVkM2E0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZGF5LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2RheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9kZWxldGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9kZWxldGUucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYmI1MzNmNy4uN2Q5NTQ5NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2RlbGV0ZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9kZWxldGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZGlyZWN0aW9ucy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2RpcmVjdGlvbnMucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZmJhYzczZC4uMDBhMjg4ZgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2RpcmVjdGlvbnMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZGlyZWN0aW9ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9lZGl0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZWRpdC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAxZGU4NWNhLi40MWE5YzJlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZWRpdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9lZGl0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Vtb3RpY29ucy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Vtb3RpY29ucy5wbmcKaW5kZXggOTVmZDU2Ni4uZThjNGU0NyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9lbW90aWNvbnMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZW1vdGljb25zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2VuZF9jb252ZXJzYXRpb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9lbmRfY29udmVyc2F0aW9uLnBuZwppbmRleCA5ZGRiMDNlLi4wZWEwZmNiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2VuZF9jb252ZXJzYXRpb24ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZW5kX2NvbnZlcnNhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9maW5kLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZmluZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5NjM0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZmluZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9mb3J3YXJkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZm9yd2FyZC5wbmcKaW5kZXggNjMyZTRmNi4uMDkzNmZhYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9mb3J3YXJkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2ZvcndhcmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZnJpZW5kc2xpc3QucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9mcmllbmRzbGlzdC5wbmcKaW5kZXggNDViYWE0OC4uOGVjNmIxYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9mcmllbmRzbGlzdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9mcmllbmRzbGlzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9nYWxsZXJ5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZ2FsbGVyeS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyZDc0OTkzLi5hM2RlZWYxCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZ2FsbGVyeS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9nYWxsZXJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2dvdG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9nb3RvLnBuZwppbmRleCAzODEwZDU0Li40MDE4M2ViIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2dvdG8ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZ290by5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9oZWxwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaGVscC5wbmcKaW5kZXggNGY2NWE2MS4uN2M1NWRmZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9oZWxwLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2hlbHAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaG9tZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2hvbWUucG5nCmluZGV4IDIzZGNlY2QuLjM0OTQzZjYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaG9tZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9ob21lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2luZm9fZGV0YWlscy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2luZm9fZGV0YWlscy5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAxZjhhN2NkLi4xNzg2ZDFlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaW5mb19kZXRhaWxzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2luZm9fZGV0YWlscy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9pbnZpdGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9pbnZpdGUucG5nCmluZGV4IGNjYmYzMTcuLjc1NzdlNmQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaW52aXRlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2ludml0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9sb2dpbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2xvZ2luLnBuZwppbmRleCBkNDg5Nzg3Li4yYjg1NmJjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2xvZ2luLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2xvZ2luLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21hbmFnZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21hbmFnZS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhOTZiYjBjLi5mMTU1YmJjCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbWFuYWdlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21hbmFnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tYXBtb2RlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbWFwbW9kZS5wbmcKaW5kZXggZWY0NTNlMS4uZDg1Y2FiNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tYXBtb2RlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21hcG1vZGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbWFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21hcmsucG5nCmluZGV4IGQyYTAxMTYuLjVlOTVkYTcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbWFyay5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vbnRoLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbW9udGgucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZDUyODVhYi4uYmY2Y2I4OQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vbnRoLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vbnRoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vcmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3JlLnBuZwppbmRleCAxNjhkY2QzLi5iOWZjNWZhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vcmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbW9yZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODdiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vcmVvdmVyZmxvd19mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbW9yZW92ZXJmbG93X2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYWMzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbW9yZW92ZXJmbG93X2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfbm9ybWFsX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vcmVvdmVyZmxvd19ub3JtYWxfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTgwYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfbm9ybWFsX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfbm9ybWFsX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfbm9ybWFsX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjA4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vcmVvdmVyZmxvd19ub3JtYWxfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9teV9jYWxlbmRhci5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X215X2NhbGVuZGFyLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGMxYzljMjAuLjBjODhmZDMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9teV9jYWxlbmRhci5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9teV9jYWxlbmRhci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9teWxvY2F0aW9uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlsb2NhdGlvbi5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA5ZWU1MDI0Li5mZGJkNWNhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlsb2NhdGlvbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9teWxvY2F0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X215cGxhY2VzLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlwbGFjZXMucG5nCmluZGV4IDA0MGY5YjEuLjA2ZjExYmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlwbGFjZXMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlwbGFjZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbm90aWZpY2F0aW9ucy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X25vdGlmaWNhdGlvbnMucG5nCmluZGV4IGYzNjFlODIuLjg2NmQ0ZTAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbm90aWZpY2F0aW9ucy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9ub3RpZmljYXRpb25zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3Bhc3RlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcGFzdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNkZjdjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3Bhc3RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3BsYXlfY2xpcC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3BsYXlfY2xpcC5wbmcKaW5kZXggOGEwMWY3MC4uNDY2OTk0NyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9wbGF5X2NsaXAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcGxheV9jbGlwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3ByZWZlcmVuY2VzLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcHJlZmVyZW5jZXMucG5nCmluZGV4IDJmMzRjNzYuLjYwZGJmZjYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcHJlZmVyZW5jZXMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcHJlZmVyZW5jZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVjZW50X2hpc3RvcnkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZWNlbnRfaGlzdG9yeS5wbmcKaW5kZXggNDcyMmNiYi4uNGNjYWU1ZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZWNlbnRfaGlzdG9yeS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZWNlbnRfaGlzdG9yeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZWZyZXNoLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVmcmVzaC5wbmcKaW5kZXggYzM1NTFiZWMuLjc3ZDcwZGQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVmcmVzaC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZWZyZXNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JlcG9ydF9pbWFnZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JlcG9ydF9pbWFnZS5wbmcKaW5kZXggNGYxMjhkNy4uMzkzZDcyNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZXBvcnRfaW1hZ2UucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVwb3J0X2ltYWdlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JldmVydC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JldmVydC5wbmcKaW5kZXggMmFmYzhlOC4uZTdlMDRmNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZXZlcnQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmV2ZXJ0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JvdGF0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JvdGF0ZS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA1NDdkNGNhLi4yNzM2OGIyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcm90YXRlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JvdGF0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zYXZlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2F2ZS5wbmcKaW5kZXggZmZkN2ZiNy4uMzZkNTBiMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zYXZlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NhdmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VhcmNoLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VhcmNoLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGVmOTQ5ZDUuLjk0NDQ2ZGIKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZWFyY2gucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VhcmNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlbGVjdF9hbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZWxlY3RfYWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2ZkM2NiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VsZWN0X2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZW5kLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VuZC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2NzJhYjcxLi43NGMwOTZkCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VuZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZW5kLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NldF9hcy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NldF9hcy5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBlMmM5MmVmLi5jYjlkYzQ5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2V0X2FzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NldF9hcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zaGFyZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NoYXJlLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGI3YzFjMjUuLjQ0ZGI5YjEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zaGFyZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zaGFyZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zbGlkZXNob3cucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zbGlkZXNob3cucG5nCmluZGV4IDA4YTQwZjIuLjA0ZmRhN2YgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2xpZGVzaG93LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NsaWRlc2hvdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zb3J0X2FscGhhYmV0aWNhbGx5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc29ydF9hbHBoYWJldGljYWxseS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAwNmQ1Yzc0Li4yNTgzZWI4Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc29ydF9hbHBoYWJldGljYWxseS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zb3J0X2FscGhhYmV0aWNhbGx5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NvcnRfYnlfc2l6ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NvcnRfYnlfc2l6ZS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAzYzM5OTUzLi42NWUyNzg2Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc29ydF9ieV9zaXplLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NvcnRfYnlfc2l6ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zdGFyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc3Rhci5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBjZjUwY2Y5Li41MjdkNzRhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc3Rhci5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zdGFyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3N0YXJ0X2NvbnZlcnNhdGlvbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3N0YXJ0X2NvbnZlcnNhdGlvbi5wbmcKaW5kZXggMTBlZjY0OS4uYWFkY2MyZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zdGFydF9jb252ZXJzYXRpb24ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc3RhcnRfY29udmVyc2F0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3N0b3AucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zdG9wLnBuZwppbmRleCA1MWVmYTkxLi40ZmM4MjVjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3N0b3AucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc3RvcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV90b2RheS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3RvZGF5LnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDJiMTVmMjkuLmM2M2I2YWYKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV90b2RheS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV90b2RheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV91cGxvYWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV91cGxvYWQucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMDRmM2EyYzguLjFjMGRkM2YKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV91cGxvYWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdXBsb2FkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3VwbG9hZF95b3VfdHViZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3VwbG9hZF95b3VfdHViZS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhZGQ0NTNiLi4wMDk1NTY0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdXBsb2FkX3lvdV90dWJlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3VwbG9hZF95b3VfdHViZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV92aWV3LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdmlldy5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2YWVhYzdmLi42OTgyOGE5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdmlldy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV92aWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3dlZWsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV93ZWVrLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGNiYTQzN2MuLjYyY2Q2NWUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV93ZWVrLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3dlZWsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfem9vbS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3pvb20ucG5nCmluZGV4IDk2OTVjNjkuLjBiOGM0ZTggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfem9vbS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV96b29tLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19zZWFyY2hfY2F0ZWdvcnlfZGVmYXVsdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19zZWFyY2hfY2F0ZWdvcnlfZGVmYXVsdC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA5YjU1MzgzLi45NDQ0NmRiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3NlYXJjaF9jYXRlZ29yeV9kZWZhdWx0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19zZWFyY2hfY2F0ZWdvcnlfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nCmluZGV4IDg1NDZjNWYuLjRlODhiMzcgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV9ncmF5LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV9ncmF5LjkucG5nCmluZGV4IDQ0NDBhYmMuLmFkYmIxNDYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fZ3JheS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9jb25maXJtX2dyYXkuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV9ncmVlbi45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fZ3JlZW4uOS5wbmcKaW5kZXggMjZjMDdlNi4uZThiZTdiZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV9ncmVlbi45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9jb25maXJtX2dyZWVuLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fcmVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV9yZWQuOS5wbmcKaW5kZXggNjg0ZjhhYy4uMTIwYTlkOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV9yZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV9yZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV95ZWxsb3cuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9jb25maXJtX3llbGxvdy45LnBuZwppbmRleCA1NmNmY2UzM2EuLjYwZWMxNDYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1feWVsbG93LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1feWVsbG93LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX25vcm1hbC45LnBuZwppbmRleCBkNGUxOTI5Li43NDc3NDUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9wcmVzc2VkLjkucG5nCmluZGV4IDM5Y2QxZTUuLmM3OWEzNWMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV9ncmF5LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fZ3JheS45LnBuZwppbmRleCBhNmVlMzI5Li40Y2UwOWZhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV9ncmF5LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9jb25maXJtX2dyYXkuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fZ3JlZW4uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV9ncmVlbi45LnBuZwppbmRleCAzODZlZDlkLi45ZDc1NjVmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV9ncmVlbi45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV9ncmVlbi45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV9yZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV9yZWQuOS5wbmcKaW5kZXggMDI0MmE0Mi4uZDVmOWJkOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fcmVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9jb25maXJtX3JlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV95ZWxsb3cuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV95ZWxsb3cuOS5wbmcKaW5kZXggYjhjMmUxOC4uNWI5YzViNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1feWVsbG93LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9jb25maXJtX3llbGxvdy45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX25vcm1hbC45LnBuZwppbmRleCA0YzYwOGVlLi4yZTZjYTJlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfbm9ybWFsLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfcHJlc3NlZC45LnBuZwppbmRleCA4YmRmZDg0Li5mNDE3NTBkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfcHJlc3NlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmF5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX2dyYXkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggM2RjZTQ1MS4uZTg1NDRmZgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmF5LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmVlbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmVlbi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA4MjliMTQ2Li5kMGJhOGY4Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX2dyZWVuLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmVlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fcmVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3JlZC5wbmcKaW5kZXggZjJjZWIyZS4uNTE4OGM4NiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fcmVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9yZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3llbGxvdy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV95ZWxsb3cucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNWEyOTI2Mi4uODYxZTE3YQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV95ZWxsb3cucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3llbGxvdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfbm9ybWFsLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGViOTFlOTcuLjdhZjFiODUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X25vcm1hbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOTk1MTk5Mi4uYjc2ZTgzZQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfcHJlc3NlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmF5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmF5LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDY0ODAuLjgxNGE1MGQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyYXkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JlZW4ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyZWVuLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDk2ZDdhY2IuLmNmMTU3ZmMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyZWVuLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JlZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9yZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX3JlZC5wbmcKaW5kZXggMmUxZTEwNS4uNzRmMjkzNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX3JlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX3JlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX3llbGxvdy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1feWVsbG93LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDgyMjRjMzguLjY2NTU3MzEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX3llbGxvdy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX3llbGxvdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9ub3JtYWwucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjIxMTNmMi4uNDc5YzlhNQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X25vcm1hbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNjVjZDUxZS4uNDU0YWFmMgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWN0aW9uX2hlYWRlcl9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlY3Rpb25faGVhZGVyX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRmZWEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWN0aW9uX2hlYWRlcl9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWN0aW9uX2hlYWRlcl9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWN0aW9uX2hlYWRlcl9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTA0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlY3Rpb25faGVhZGVyX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9hY3RpdmF0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9hY3RpdmF0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YmMyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2FjdGl2YXRlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9hY3RpdmF0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYWN0aXZhdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4MjJiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYWN0aXZhdGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWM3MWIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVkZmZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCmluZGV4IGJmOTcwYjAuLjYwZjE5ZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTkyNjEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlMjQxNTguLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFmMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFmMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWIwYzFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKaW5kZXggNWNiYjI1MS4uNzgxNzY2NyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmZjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKaW5kZXggMDJiNGU5YS4uMTUzMWQ5ZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGY2ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWMxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODYxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmRhMmYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyY2I2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0NTU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzk5ZmJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9tdWx0aXNlbGVjdF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX211bHRpc2VsZWN0X2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzM2NDdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9tdWx0aXNlbGVjdF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9tdWx0aXNlbGVjdF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9tdWx0aXNlbGVjdF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGM1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX211bHRpc2VsZWN0X2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzNmE0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjBiZTJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9iYWNrZ3JvdW5kLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9iYWNrZ3JvdW5kLjkucG5nCmluZGV4IGVlOTk1ODMuLjlmMTZkZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21lbnVfYmFja2dyb3VuZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9tZW51X2JhY2tncm91bmQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoLjkucG5nCmluZGV4IGQzNjg5ODMuLmRhMzAxMWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21lbnVfYmFja2dyb3VuZF9maWxsX3BhcmVudF93aWR0aC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9tZW51X2JhY2tncm91bmRfZmlsbF9wYXJlbnRfd2lkdGguOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9kcm9wZG93bl9wYW5lbF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9tZW51X2Ryb3Bkb3duX3BhbmVsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDVjMTBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9kcm9wZG93bl9wYW5lbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9kcm9wZG93bl9wYW5lbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9kcm9wZG93bl9wYW5lbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDMwOTRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9kcm9wZG93bl9wYW5lbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfZm9jdXMuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X2ZvY3VzLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWM1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X2ZvY3VzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfcHJlc3MuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3ByZXNzLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjY1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmEyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDUxY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZF9wcmVzcy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZF9wcmVzcy45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQ0NGRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkX3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL25hdl9kaXZpZGVyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL25hdl9kaXZpZGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQxM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbmF2X2RpdmlkZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fbGVmdF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9xdWlja2FjdGlvbnNfYXJyb3dkb3duX2xlZnRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZTY1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9xdWlja2FjdGlvbnNfYXJyb3dkb3duX2xlZnRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fbGVmdF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2thY3Rpb25zX2Fycm93ZG93bl9sZWZ0X2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5NjU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fbGVmdF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fcmlnaHRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2thY3Rpb25zX2Fycm93ZG93bl9yaWdodF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5NTk3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fcmlnaHRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fcmlnaHRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd2Rvd25fcmlnaHRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWJlZjUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2thY3Rpb25zX2Fycm93ZG93bl9yaWdodF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX2xlZnRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2thY3Rpb25zX2Fycm93dXBfbGVmdF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzZTM0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX2xlZnRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX2xlZnRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX2xlZnRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDBlOTFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2thY3Rpb25zX2Fycm93dXBfbGVmdF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX2xlZnRfcmlnaHRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2thY3Rpb25zX2Fycm93dXBfbGVmdF9yaWdodF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2MTdlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX2xlZnRfcmlnaHRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrYWN0aW9uc19hcnJvd3VwX3JpZ2h0X2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9xdWlja2FjdGlvbnNfYXJyb3d1cF9yaWdodF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOGU3YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2thY3Rpb25zX2Fycm93dXBfcmlnaHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTc0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zY3J1YmJlcl9jb250cm9sX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc2NydWJiZXJfY29udHJvbF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzViMmFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc2NydWJiZXJfY29udHJvbF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zY3J1YmJlcl90cmFja19ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zY3J1YmJlcl90cmFja19ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0OGNmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3NjcnViYmVyX3RyYWNrX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zY3J1YmJlcl90cmFja19ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc2NydWJiZXJfdHJhY2tfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzg0YWM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc2NydWJiZXJfdHJhY2tfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwppbmRleCBiZGNiMzc4Li5jMDc5NjE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzYmFyX2JhY2tncm91bmQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjdjMWE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzYmFyX2JhY2tncm91bmQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2Fycm93X2xlZnRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9hcnJvd19sZWZ0X2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4YmFmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9hcnJvd19sZWZ0X2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2Fycm93X2xlZnRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfbGVmdF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTIyNWZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2Fycm93X2xlZnRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTgwMDZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YWFlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2RpdmlkZXJfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkN2I4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2RpdmlkZXJfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfZGl2aWRlcl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzhiMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2RpdmlkZXJfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX3NlbGVjdG9yX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9zZWxlY3Rvcl9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkMzBkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9zZWxlY3Rvcl9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dF9zZWxlY3RfaGFuZGxlX2xlZnQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dF9zZWxlY3RfaGFuZGxlX2xlZnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTJmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0X3NlbGVjdF9oYW5kbGVfbGVmdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dF9zZWxlY3RfaGFuZGxlX21pZGRsZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlLnBuZwppbmRleCAyMDFlN2Y5Li4zZDE2MDUyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0X3NlbGVjdF9oYW5kbGVfcmlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dF9zZWxlY3RfaGFuZGxlX3JpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDM4OTI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dF9zZWxlY3RfaGFuZGxlX3JpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1ZjM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGNjNzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWYwYzcxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZTMxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZkNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNmU5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2N2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjlhZmZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlYXJjaF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ5OTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlYXJjaF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWFyY2hfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjAzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWFyY2hfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDQzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlMjZlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWFyY2hfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjY3ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OWFmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvcGxhdGxvZ28uanBnIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW5vZHBpL3BsYXRsb2dvLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3NzgwYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvcGxhdGxvZ28uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW5vZHBpL3BsYXRsb2dvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9wbGF0bG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhZjM1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9wbGF0bG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWNhZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNmE4MjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWY1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG9jay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb2NrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDVlMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG9jay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDliNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfZGVmYXVsdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL3VubG9ja19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQ0MWMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfaGFsby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL3VubG9ja19oYWxvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWIwNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfaGFsby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfcmluZy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL3VubG9ja19yaW5nLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM2ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfcmluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfd2F2ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL3VubG9ja193YXZlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJmYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfd2F2ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTI5ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmZDFkMmQ0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY4NTg3OGEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzg5ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Z3JhZGllbnQKKyAgICAgICAgYW5kcm9pZDpzdGFydENvbG9yPSIjZmYwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6Y2VudGVyQ29sb3I9IiNmZmQxZDJkNCIKKyAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iI2ZmODU4NzhhIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSIyNzAiIC8+Cis8L3NoYXBlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQzMDlmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmZTFlMmU0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY5NTk3OWEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJmYmExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBjb2xvci90cmFuc3BhcmVudCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmRfbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU2ODFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAY29sb3IvdHJhbnNwYXJlbnQiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNjNjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8IS0tIEVuYWJsZWQgc3RhdGVzIC0tPgorICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25faG9sb19kYXJrIiAvPgorCisKKyAgICA8IS0tIERpc2FibGVkIHN0YXRlcyAtLT4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDk0NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPCEtLSBFbmFibGVkIHN0YXRlcyAtLT4KKyAgICAgICAgCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0IiAvPgorCisKKyAgICA8IS0tIERpc2FibGVkIHN0YXRlcyAtLT4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZWRfaG9sb19saWdodCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fZGVmYXVsdF9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9kZWZhdWx0X2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1MDA3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fZGVmYXVsdF9ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fZGVmYXVsdF9ub3JtYWxfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2RlZmF1bHRfZGlzYWJsZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0KKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODRmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsiIC8+CisgICAgICAgICAgCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxNTA4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19saWdodC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19saWdodCIgLz4KKyAgICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25faG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfaG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThjYTllCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vbl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiICBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbQorICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fdG9nZ2xlX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjEwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb2ZmX2ZvY3VzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0KKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9jYWJfaWNfY2xvc2VfaG9sby54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvY2FiX2ljX2Nsb3NlX2hvbG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYWY3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvY2FiX2ljX2Nsb3NlX2hvbG8ueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvY2FiX2ljX2Nsb3NlX3ByZXNzZWRfaG9sbyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2NhYl9pY19jbG9zZV9mb2N1c2VkX2hvbG8iIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2NhYl9pY19jbG9zZV9ub3JtYWxfaG9sbyIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3F1ZXJ5X2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDZmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX25vcm1hbCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX3ByZXNzZWQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9wcmVzc2VkIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX3NlbGVjdGVkIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9ub3JtYWwiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkMjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTM5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19tZW51X21vcmVvdmVyZmxvd19ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX21lbnVfbW9yZW92ZXJmbG93X2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MWVkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19tZW51X21vcmVvdmVyZmxvd19ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZW51X21vcmVvdmVyZmxvd19mb2N1c2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfbm9ybWFsX2hvbG9fZGFyayIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfaG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1MmZmNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19tZW51X21vcmVvdmVyZmxvd19ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfZm9jdXNlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZW51X21vcmVvdmVyZmxvd19ub3JtYWxfaG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYjY1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIgIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmRfbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmYzFjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmRfbGlnaHQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0IiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbAppbmRleCBiY2E5OTZjLi4wYTUxMTUyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbApAQCAtMTYsMjIgKzE2LDE0IEBACiAKIDxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgogCi0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBjb2xvci90cmFuc3BhcmVudCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgogCiAgICAgPCEtLSBFdmVuIHRob3VnaCB0aGVzZSB0d28gcG9pbnQgdG8gdGhlIHNhbWUgcmVzb3VyY2UsIGhhdmUgdHdvIHN0YXRlcyBzbyB0aGUgZHJhd2FibGUgd2lsbCBpbnZhbGlkYXRlIGl0c2VsZiB3aGVuIGNvbWluZyBvdXQgb2YgcHJlc3NlZCBzdGF0ZS4gLS0+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIgotICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIgotICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkIiAvPgotCi0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KLQotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cyIgLz4KLQorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb24iIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb24iIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQiIC8+CisgICAgPGl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQiIC8+CisgICAgCiA8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjc5ODBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9saWdodC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6ZHJhd2FibGU9IkBjb2xvci90cmFuc3BhcmVudCIgLz4KKworICAgIDwhLS0gRXZlbiB0aG91Z2ggdGhlc2UgdHdvIHBvaW50IHRvIHRoZSBzYW1lIHJlc291cmNlLCBoYXZlIHR3byBzdGF0ZXMgc28gdGhlIGRyYXdhYmxlIHdpbGwgaW52YWxpZGF0ZSBpdHNlbGYgd2hlbiBjb21pbmcgb3V0IG9mIHByZXNzZWQgc3RhdGUuIC0tPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQiIC8+CisgICAgPGl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzRmODk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHRyYW5zaXRpb24geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodCIgIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodCIgIC8+Cis8L3RyYW5zaXRpb24+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfaG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTU5OTA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAY29sb3IvdHJhbnNwYXJlbnQiIC8+CisKKyAgICA8IS0tIEV2ZW4gdGhvdWdoIHRoZXNlIHR3byBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSwgaGF2ZSB0d28gc3RhdGVzIHNvIHRoZSBkcmF3YWJsZSB3aWxsIGludmFsaWRhdGUgaXRzZWxmIHdoZW4gY29taW5nIG91dCBvZiBwcmVzc2VkIHN0YXRlLiAtLT4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2ZvY3VzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfZm9jdXNlZF9ob2xvX2RhcmsiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzM5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAY29sb3IvdHJhbnNwYXJlbnQiIC8+CisKKyAgICA8IS0tIEV2ZW4gdGhvdWdoIHRoZXNlIHR3byBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSwgaGF2ZSB0d28gc3RhdGVzIHNvIHRoZSBkcmF3YWJsZSB3aWxsIGludmFsaWRhdGUgaXRzZWxmIHdoZW4gY29taW5nIG91dCBvZiBwcmVzc2VkIHN0YXRlLiAtLT4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2Rpc2FibGVkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfZm9jdXNlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfZm9jdXNlZF9ob2xvX2xpZ2h0IiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL21pbml0YWJfbHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL21pbml0YWJfbHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWE5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbWluaXRhYl9sdC54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9taW5pdGFiX2x0X3ByZXNzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21pbml0YWJfbHRfc2VsZWN0ZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9taW5pdGFiX2x0X3Vuc2VsZWN0ZWRfcHJlc3MiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21pbml0YWJfbHRfdW5zZWxlY3RlZCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZmEwZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIGJ1YmJsZV93aXRoX2NoYXRzLnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfaGlnaGxpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjUwYjMuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNjOWRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTIyYzg3Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3NjcnViYmVyX3Byb2dyZXNzX2hvcml6b250YWxfaG9sb19kYXJrLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9zY3J1YmJlcl9wcm9ncmVzc19ob3Jpem9udGFsX2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxNzJhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9zY3J1YmJlcl9wcm9ncmVzc19ob3Jpem9udGFsX2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGxheWVyLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2JhY2tncm91bmQiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc2NydWJiZXJfdHJhY2tfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3NlY29uZGFyeVByb2dyZXNzIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBhbmRyb2lkOmRyYXdhYmxlL3NjcnViYmVyX3RyYWNrX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9wcm9ncmVzcyIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAYW5kcm9pZDpkcmF3YWJsZS9zY3J1YmJlcl90cmFja19ob2xvX2RhcmsiIC8+Cis8L2xheWVyLWxpc3Q+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvc2NydWJiZXJfcHJvZ3Jlc3NfaG9yaXpvbnRhbF9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9zY3J1YmJlcl9wcm9ncmVzc19ob3Jpem9udGFsX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzk2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvc2NydWJiZXJfcHJvZ3Jlc3NfaG9yaXpvbnRhbF9ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bGF5ZXItbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYmFja2dyb3VuZCIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAYW5kcm9pZDpkcmF3YWJsZS9zY3J1YmJlcl90cmFja19ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3NlY29uZGFyeVByb2dyZXNzIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBhbmRyb2lkOmRyYXdhYmxlL3NjcnViYmVyX3RyYWNrX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvcHJvZ3Jlc3MiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc2NydWJiZXJfdHJhY2tfaG9sb19saWdodCIgLz4KKzwvbGF5ZXItbGlzdD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQtcG9ydC9wcmVmZXJlbmNlX2hlYWRlcl9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQtcG9ydC9wcmVmZXJlbmNlX2hlYWRlcl9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzc2YzhlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC1wb3J0L3ByZWZlcmVuY2VfaGVhZGVyX2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gTGF5b3V0IG9mIGEgaGVhZGVyIGl0ZW0gaW4gUHJlZmVyZW5jZUFjdGl2aXR5LiAtLT4KKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iOTZkcCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iP2FuZHJvaWQ6YXR0ci9zY3JvbGxiYXJTaXplIj4KKyAgICAKKyAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCI+CisgICAgCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMmRpcCIgLz4KKyAgICAKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJob3Jpem9udGFsIiAvPgorICAgIAorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3N1bW1hcnkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIiAvPgorICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2FsZXJ0X2RpYWxvZy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9hbGVydF9kaWFsb2cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTFlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9hbGVydF9kaWFsb2cueG1sCkBAIC0wLDAgKzEsMTUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5XZWlnaHRlZExpbmVhckxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3BhcmVudFBhbmVsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI5ZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iM2RpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIzZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxZGlwIgorICAgIGFuZHJvaWQ6bWFqb3JXZWlnaHRNaW49IjAuNDUiCisgICAgYW5kcm9pZDptaW5vcldlaWdodE1pbj0iMC43MiIKKyAgICBhbmRyb2lkOm1ham9yV2VpZ2h0TWF4PSIwLjQ1IgorICAgIGFuZHJvaWQ6bWlub3JXZWlnaHRNYXg9IjAuNzIiPgorCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3RvcFBhbmVsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjU0ZGlwIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC90aXRsZV90ZW1wbGF0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIj4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9pY29uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kaWFsb2dfaW5mbyIgLz4KKyAgICAgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlhbG9nVGl0bGUgYW5kcm9pZDppZD0iQCtpZC9hbGVydFRpdGxlIgorICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aXRsZURpdmlkZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJmaWxsX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiIC8+CisgICAgICAgIDwhLS0gSWYgdGhlIGNsaWVudCB1c2VzIGEgY3VzdG9tVGl0bGUsIGl0IHdpbGwgYmUgYWRkZWQgaGVyZS4gLS0+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvY29udGVudFBhbmVsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgICAgIDxTY3JvbGxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2Nyb2xsVmlldyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCI+CisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tZXNzYWdlIgorICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI1ZGlwIiAvPgorICAgICAgICA8L1Njcm9sbFZpZXc+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9jdXN0b21QYW5lbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvY3VzdG9tIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI1ZGlwIiAvPgorICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uUGFuZWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNTRkaXAiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9sZWZ0U3BhY2VyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idXR0b24xIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uMyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idXR0b24yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3JpZ2h0U3BhY2VyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgIDwvTGluZWFyTGF5b3V0PgorPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuV2VpZ2h0ZWRMaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2MjlmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2xheW91dC9rZXlndWFyZC54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiAKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyMGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjIwZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyMGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjIwZGlwIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiAKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmMDAwMDAwIj4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIiAKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiIAorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRkZGIiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcva2V5Z3VhcmRfbGFiZWxfdGV4dCIgLz4KKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fZ2xvZ2luX3VubG9jay54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fZ2xvZ2luX3VubG9jay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0NjU0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9nbG9naW5fdW5sb2NrLnhtbApAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9kYXJrIgorICAgICAgICA+CisgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkAraWQvZW1lcmdlbmN5Q2FsbCI+CisgICAgICAgIDxSZWxhdGl2ZUxheW91dCAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdG9wSGVhZGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19sb2NrX2lkbGVfbG9jayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNWRpcCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gc3BhY2VyIGJlbG93IGhlYWRlciAtLT4KKyAgICAgICAgICAgIDxWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGFjZXJUb3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90b3BIZWFkZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiLz4KKyAgICAgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luc3RydWN0aW9ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAK2lkL3NwYWNlclRvcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9nbG9naW5faW5zdHJ1Y3Rpb25zIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIAorICAgICAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sb2dpbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvaW5zdHJ1Y3Rpb25zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZ2xvZ2luX3VzZXJuYW1lX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRFbWFpbEFkZHJlc3MiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgCisgICAgICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sb2dpbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjdkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjdkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRQYXNzd29yZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2dsb2dpbl9wYXNzd29yZF9oaW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmV4dEZvY3VzUmlnaHQ9IkAraWQvb2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuZXh0Rm9jdXNEb3duPSJAK2lkL29rIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIAorICAgICAgICAgICAgPCEtLSBvayBiZWxvdyBwYXNzd29yZCwgYWxpZ25lZCB0byByaWdodCBvZiBzY3JlZW4gLS0+CisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iODVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9wYXNzd29yZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjdkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjdkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2dsb2dpbl9zdWJtaXRfYnV0dG9uIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIAorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorICAgIDwvU2Nyb2xsVmlldz4KKyAgICAKKyAgICA8IS0tIHNwYWNlciBhYm92ZSBlbWVyZ2VuY3kgY2FsbCAtLT4KKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNGRpcCIKKworICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIvPgorCisgICAgPCEtLSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gYXQgYm90dG9tIGNlbnRlciAtLT4KKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAvPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9sb2NrLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9sb2NrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNhMzUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX2xvY2sueG1sCkBAIC0wLDAgKzEsMjIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKyAgICAgICAgCis8IS0tIFRoaXMgaXMgdGhlIGdlbmVyYWwgbG9jayBzY3JlZW4gd2hpY2ggc2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgIHN0YXRlIG9mIHRoZSBkZXZpY2UsIGFzIHdlbGwgYXMgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBnZXQgcGFzdCBpdAorICBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UuICBJdCBpcyB0aGUgc2FtZSBmb3IgbGFuZHNjYXBlCisgIGFuZCBwb3J0cmFpdC4tLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjZmY4MDAwMDAiCisgICAgICAgID4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTVkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTVkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvcG9wdXBfZnVsbF9kYXJrIgorICAgICAgICA+CisKKyAgICAgICAgPCEtLSB3aGVuIHNpbSBpcyBwcmVzZW50IC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXJTaW1PazEiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjM0c3AiLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyU2ltT2syIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzNHNwIi8+CisKKyAgICAgICAgPCEtLSB3aGVuIHNpbSBpcyBtaXNzaW5nIC8gbG9ja2VkIC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXJTaW1CYWQxIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2UiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyU2ltQmFkMiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iN2RpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iN2RpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9taXNzaW5nX3NpbV9pbnN0cnVjdGlvbnMiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiLz4KKworICAgICAgICA8IS0tIHNwYWNlciBhZnRlciBjYXJyaWVyIGluZm8gLyBzaW0gbWVzc2FnZXMgLS0+CisgICAgICAgIDxWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIvPgorCisgICAgICAgIDwhLS0gdGltZSBhbmQgZGF0ZSAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzRzcCIvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RhdGUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiLz4KKworICAgICAgICA8IS0tIHNwYWNlciBhZnRlciB0aW1lIGFuZCBkYXRlIC0tPgorICAgICAgICA8VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tIGJhdHRlcnkgaW5mbyAtLT4KKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnlJbmZvIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgPgorCisgICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeUluZm9JY29uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYXNlbGluZUFsaWduZWQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5SW5mb1RleHQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8IS0tIHNwYWNlciBhZnRlciBiYXR0ZXJ5IGluZm8gLS0+CisgICAgICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeUluZm9TcGFjZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gbmV4dCBhbGFybSBpbmZvIC0tPgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9uZXh0QWxhcm1JbmZvIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgPgorCisgICAgICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhc2VsaW5lQWxpZ25lZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbG9ja19pZGxlX2FsYXJtIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmV4dEFsYXJtVGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8IS0tIHNwYWNlciBhZnRlciBhbGFybSBpbmZvIC0tPgorICAgICAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL25leHRBbGFybVNwYWNlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIi8+CisKKyAgICAgICAgPCEtLSBsb2NrIGljb24gd2l0aCAnc2NyZWVuIGxvY2tlZCcgbWVzc2FnZQorICAgICAgICAgICAgIChzaG93biB3aGVuIFNJTSBjYXJkIGlzIHByZXNlbnQpIC0tPgorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvc2NyZWVuTG9ja2VkSW5mbyIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgID4KKworICAgICAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYXNlbGluZUFsaWduZWQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX2xvY2tfaWRsZV9sb2NrIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fc2NyZWVuX2xvY2tlZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPCEtLSBtZXNzYWdlIGFib3V0IGhvdyB0byB1bmxvY2sKKyAgICAgICAgICAgICAoc2hvd24gd2hlbiBTSU0gY2FyZCBpcyBwcmVzZW50KSAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbG9ja0luc3RydWN0aW9ucyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNWRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIvPgorCisKKyAgICAgICAgPCEtLSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gc2hvd24gd2hlbiBzaW0gaXMgbWlzc2luZyBvciBQVUtkIC0tPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkODdhMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sCkBAIC0wLDAgKzEsOTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgID4KKyAgICAKKyAgICA8IS0tIGxlZnQgc2lkZTogc3RhdHVzIGFuZCBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgPgorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgIDwhLS0gcmlnaHQgc2lkZTogcGFzc3dvcmQgLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIj4KKworICAgICAgICA8IS0tIFBhc3N3b3JkIGVudHJ5IGZpZWxkIC0tPgorICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZEVudHJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzMwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Im5vcm1hbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0c3AiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEyMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9wYXNzd29yZF9maWVsZF9kZWZhdWx0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNmZmZmZmZmZiIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSBOdW1lcmljIGtleWJvYXJkIC0tPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgYW5kcm9pZDppZD0iQCtpZC9rZXlib2FyZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMzBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDprZXlCYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnRuX2tleWJvYXJkX2tleV9mdWxsdHJhbnMiCisgICAgICAgIC8+CisgICAgICAgIDwhLS0gQWxwaGFudW1lcmljIGtleWJvYXJkIC0tPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgYW5kcm9pZDppZD0iQCtpZC9rZXlib2FyZEFscGhhIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjMwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjMDAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUJhY2tncm91bmQ9IkBkcmF3YWJsZS9idG5fa2V5Ym9hcmRfa2V5X2Z1bGx0cmFucyIKKyAgICAgICAgLz4KKworICAgICAgICA8IS0tIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjdlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sCkBAIC0wLDAgKzEsODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgPgorICAgIAorICAgIDwhLS0gbGVmdCBzaWRlOiBzdGF0dXMgYW5kIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPCEtLSByaWdodCBzaWRlOiBwYXNzd29yZCAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiPgorCisgICAgICAgIDwhLS0gUGFzc3dvcmQgZW50cnkgZmllbGQgLS0+CisgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkRW50cnkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMzBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIgorICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRQYXNzd29yZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3Bhc3N3b3JkX2ZpZWxkX2RlZmF1bHQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI2ZmZmZmZmZmIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tIE51bWVyaWMga2V5Ym9hcmQgLS0+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldyBhbmRyb2lkOmlkPSJAK2lkL2tleWJvYXJkIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMzMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjYwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjMDAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUJhY2tncm91bmQ9IkBkcmF3YWJsZS9idG5fa2V5Ym9hcmRfa2V5X2Z1bGx0cmFucyIKKyAgICAgICAgLz4KKyAgICAgICAgPCEtLSBBbHBoYW51bWVyaWMga2V5Ym9hcmQgLS0+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldyBhbmRyb2lkOmlkPSJAK2lkL2tleWJvYXJkQWxwaGEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyMzBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiMwMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5QmFja2dyb3VuZD0iQGRyYXdhYmxlL2J0bl9rZXlib2FyZF9rZXlfZnVsbHRyYW5zIgorICAgICAgICAvPgorCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zaW1fcGluX2xhbmRzY2FwZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc2ltX3Bpbl9sYW5kc2NhcGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Y2JlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc2ltX3Bpbl9sYW5kc2NhcGUueG1sCkBAIC0wLDAgKzEsMTIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfZGFyayIKKyAgICAgICAgPgorCisgIAorICAgIDwhLS0gcmlnaHQgc2lkZSAtLT4KKyAgICA8IS0tIGhlYWRlciB0ZXh0ICgnRW50ZXIgUGluIENvZGUnKSAtLT4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXJUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQCtpZC9jYXJyaWVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjMwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRzcCIKKyAgICAgICAgICAgIC8+CisKKyAgICA8IS0tIENhcnJpZXIgaW5mbyAtLT4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jYXJyaWVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQCtpZC9waW5EaXNwbGF5R3JvdXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOWRpcCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0fGJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAvPgorCisgICAgPCEtLSBkaXNwbGF5cyBkb3RzIGFzIHVzZXIgZW50ZXJzIHBpbiAtLT4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvcGluRGlzcGxheUdyb3VwIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6YWRkU3RhdGVzRnJvbUNoaWxkcmVuPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpiYXNlbGluZUFsaWduZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjMwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQiCisgICAgPgorCisgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3BpbkRpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQG51bGwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMnNwIgorICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRQYXNzd29yZCIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYmFja3NwYWNlIgorICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19pbnB1dF9kZWxldGUiCisgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjJkaXAiCisgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjJkaXAiCisgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIyZGlwIgorICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29rIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvb2siCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCis8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fcG9ydHJhaXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOTE0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc2ltX3Bpbl9wb3J0cmFpdC54bWwKQEAgLTAsMCArMSwxMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfZGFyayIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIj4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC90b3BEaXNwbGF5R3JvdXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPCEtLSBoZWFkZXIgdGV4dCAoJ0VudGVyIFBpbiBDb2RlJykgLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlYWRlclRleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIvPgorCisgICAgICAgIDwhLS0gQ2FycmllciBpbmZvIC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jYXJyaWVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjlkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIvPgorCisgICAgICAgIDwhLS0gcGFzc3dvcmQgZW50cnkgLS0+CisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0Ij4KKworICAgICAgICAgICAgPCEtLSBkaXNwbGF5cyBkb3RzIGFzIHVzZXIgZW50ZXJzIHBpbiAtLT4KKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3BpbkRpc3BsYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dFBhc3N3b3JkIgorICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYmFja3NwYWNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19pbnB1dF9kZWxldGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iLTNkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSItM2RpcCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8aW5jbHVkZQorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2tleVBhZCIKKyAgICAgICAgbGF5b3V0PSJAYW5kcm9pZDpsYXlvdXQvdHdlbHZlX2tleV9lbnRyeSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90b3BEaXNwbGF5R3JvdXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTBkaXAiCisgICAgLz4KKworICAgIDwhLS0gc3BhY2VyIGJlbG93IGtleXBhZCAtLT4KKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NwYWNlckJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAaWQvZW1lcmdlbmN5Q2FsbCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAvPgorCisgICAgPCEtLSBUaGUgZW1lcmdlbmN5IGJ1dHRvbiBzaG91bGQgdGFrZSB0aGUgcmVzdCBvZiB0aGUgc3BhY2UgYW5kIGJlIGNlbnRlcmVkIHZlcnRpY2FsbHkgLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgICAgICA8IS0tIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTg5ODYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kLnhtbApAQCAtMCwwICsxLDEyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gU3RhdHVzIHRvIHNob3cgb24gdGhlIGxlZnQgc2lkZSBvZiBsb2NrIHNjcmVlbiAtLT4KKzxMaW5lYXJMYXlvdXQKKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE0MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICA+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jYXJyaWVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTdzcCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMzJkaXAiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgIC8+CisKKyAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMjBzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0NvbG9yPSIjQzAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R4PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeT0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIzLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjZkaXAiCisgICAgICAgICAgICAvPgorCisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduQmFzZWxpbmU9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzBzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0MwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeD0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHk9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd1JhZGl1cz0iMy4wIgorICAgICAgICAgICAgLz4KKworICAgIDwvY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jaz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2RhdGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3RpbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNWRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgLz4KKworICAgIDwhLS0gdXNlZCBmb3IgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgImRyYXcgcGF0dGVybiB0byB1bmxvY2siLCB0aGUgbmV4dCBhbGFybSwgYW5kIGNoYXJnaW5nCisgICAgICAgICBzdGF0dXMuICAtLT4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyc3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMnNwIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAvPgorICAgICAgICAKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm9wZXJ0eU9mIgorICAgICAgICBhbmRyb2lkOmxpbmVTcGFjaW5nRXh0cmE9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMnNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfcG9ydC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4OTg2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfcG9ydC54bWwKQEAgLTAsMCArMSwxMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFN0YXR1cyB0byBzaG93IG9uIHRoZSBsZWZ0IHNpZGUgb2YgbG9jayBzY3JlZW4gLS0+Cis8TGluZWFyTGF5b3V0CisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FycmllciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE3c3AiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjMyZGlwIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAvPgorCisgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2sgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgID4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTIwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0MwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeD0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHk9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd1JhZGl1cz0iMy4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgorICAgICAgICAgICAgLz4KKworCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMwc3AiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93Q29sb3I9IiNDMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHg9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R5PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dSYWRpdXM9IjMuMCIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L2NvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2s+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90aW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjVkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyc3AiCisgICAgICAgIC8+CisKKyAgICA8IS0tIHVzZWQgZm9yIGluc3RydWN0aW9ucyBzdWNoIGFzICJkcmF3IHBhdHRlcm4gdG8gdW5sb2NrIiwgdGhlIG5leHQgYWxhcm0sIGFuZCBjaGFyZ2luZworICAgICAgICAgc3RhdHVzLiAgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMnNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxNWRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgLz4KKyAgICAgICAgCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvcGVydHlPZiIKKyAgICAgICAgYW5kcm9pZDpsaW5lU3BhY2luZ0V4dHJhPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjJzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJpbnZpc2libGUiCisgICAgICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY0NWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2sueG1sCkBAIC0wLDAgKzEsOTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgaXMgdGhlIGdlbmVyYWwgbG9jayBzY3JlZW4gd2hpY2ggc2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgIHN0YXRlIG9mIHRoZSBkZXZpY2UsIGFzIHdlbGwgYXMgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBnZXQgcGFzdCBpdAorICBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UuICBJdCBpcyB0aGUgc2FtZSBmb3IgbGFuZHNjYXBlCisgIGFuZCBwb3J0cmFpdC4tLT4KKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6dGFidW5sb2NrPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnRhYnVubG9jayIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzcwMDAwMDAwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDppZD0iQCtpZC9yb290Ij4KKworICAgIDwhLS0gbGVmdCBzaWRlOiBzdGF0dXMgYW5kIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2NyZWVuTG9ja2VkIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9zdGF0dXMyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LldhdmVWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3dhdmVfdmlldyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSAiZW1lcmdlbmN5IGNhbGxzIG9ubHkiIHNob3duIHdoZW4gc2ltIGlzIG1pc3Npbmcgb3IgUFVLZCAtLT4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxUZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9jYXJyaWVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2VtZXJnZW5jeV9jYWxsc19vbmx5IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKKyAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiBzaG93biB3aGVuIHNpbSBpcyBQVUtkIGFuZCB0YWJfc2VsZWN0b3IgaXMKKyAgICAgICAgICAgICBoaWRkZW4gLS0+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEJ1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODBkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvUmVsYXRpdmVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrX2xhbmQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2tfbGFuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5OWNjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9ja19sYW5kLnhtbApAQCAtMCwwICsxLDk1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGlzIHRoZSBnZW5lcmFsIGxvY2sgc2NyZWVuIHdoaWNoIHNob3dzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICBzdGF0ZSBvZiB0aGUgZGV2aWNlLCBhcyB3ZWxsIGFzIGluc3RydWN0aW9ucyBvbiBob3cgdG8gZ2V0IHBhc3QgaXQKKyAgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlLi0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6dGFidW5sb2NrPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnRhYnVubG9jayIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjNzAwMDAwMDAiCisgICAgYW5kcm9pZDppZD0iQCtpZC9yb290Ij4KKworICAgIDwhLS0gbGVmdCBzaWRlOiBzdGF0dXMgYW5kIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8IS0tIHJpZ2h0IHNpZGUgLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zY3JlZW5Mb2NrZWQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3N0YXR1czIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEyZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5XYXZlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC93YXZlX3ZpZXciCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tICJlbWVyZ2VuY3kgY2FsbHMgb25seSIgc2hvd24gd2hlbiBzaW0gaXMgbWlzc2luZyBvciBQVUtkIC0tPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW1lcmdlbmN5X2NhbGxzX29ubHkiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgorICAgICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiBzaG93biB3aGVuIHNpbSBpcyBQVUtkIGFuZCB0YWJfc2VsZWN0b3IgaXMKKyAgICAgICAgICAgICBoaWRkZW4gLS0+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEJ1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iODBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjYzNmFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCkBAIC0wLDAgKzEsMTA2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGlzIHRoZSBzY3JlZW4gdGhhdCBzaG93cyB0aGUgOSBjaXJjbGUgdW5sb2NrIHdpZGdldCBhbmQgaW5zdHJ1Y3RzCisgICAgIHRoZSB1c2VyIGhvdyB0byB1bmxvY2sgdGhlaXIgZGV2aWNlLCBvciBtYWtlIGFuIGVtZXJnZW5jeSBjYWxsLiAgVGhpcworICAgICBpcyB0aGUgcG9ydHJhaXQgbGF5b3V0LiAgLS0+CisKKzxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgID4KKworICAgIDwhLS0gbGVmdCBzaWRlOiBzdGF0dXMgYW5kIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIAorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kIiAvPgorCisgICAgICAgIDwhLS0gZm9vdGVyIC0tPgorICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE0MGRpcCIKKyAgICAgICAgICAgID4KKworICAgICAgICAgICAgPCEtLSBvcHRpb24gMTogYSBzaW5nbGUgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgICAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvZm9vdGVyTm9ybWFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEFsb25lIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgICAgICA8IS0tIG9wdGlvbiAyOiBhbiBlbWVyZ2VuY3kgY2FsbCBidXR0b24sIGFuZCBhICdmb3Jnb3QgcGF0dGVybj8nIGJ1dHRvbiAtLT4KKyAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJGb3Jnb3RQYXR0ZXJuIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZm9yZ290UGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRvZ2V0aGVyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwhLS0gcmlnaHQgc2lkZTogbG9jayBwYXR0ZXJuIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICA+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbG9ja1BhdHRlcm4iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjkwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjkwZGlwIgorICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxpbmVhckxheW91dFdpdGhEZWZhdWx0VG91Y2hSZWNlcGllbnQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWQ3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbApAQCAtMCwwICsxLDEwMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICA+CisKKyAgICA8IS0tIGxlZnQgc2lkZTogc3RhdHVzIGFuZCBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAKKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfcG9ydCIgLz4KKworICAgICAgICA8IS0tIGZvb3RlciAtLT4KKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNDBkaXAiCisgICAgICAgICAgICA+CisKKyAgICAgICAgICAgIDwhLS0gb3B0aW9uIDE6IGEgc2luZ2xlIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICAgICAgICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2Zvb3Rlck5vcm1hbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxBbG9uZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICAgICAgPCEtLSBvcHRpb24gMjogYW4gZW1lcmdlbmN5IGNhbGwgYnV0dG9uLCBhbmQgYSAnZm9yZ290IHBhdHRlcm4/JyBidXR0b24gLS0+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvZm9vdGVyRm9yZ290UGF0dGVybiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZvcmdvdFBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxUb2dldGhlciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8IS0tIHJpZ2h0IHNpZGU6IGxvY2sgcGF0dGVybiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldyBhbmRyb2lkOmlkPSJAK2lkL2xvY2tQYXR0ZXJuIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjM1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1MGRpcCIKKyAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCis8L2NvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMjU1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGggdGhlIEFjdGlvbiBCYXIgZW5hYmxlZC4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8Vmlld0FuaW1hdG9yIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2Jhcl9hbmltYXRvciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6aW5BbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYSIKKyAgICAgICAgYW5kcm9pZDpvdXRBbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEiPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIiAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVTdHlsZSIgLz4KKyAgICA8L1ZpZXdBbmltYXRvcj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZD0iP2FuZHJvaWQ6YXR0ci93aW5kb3dDb250ZW50T3ZlcmxheSIgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA1MWFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheS54bWwKQEAgLTAsMCArMSw0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLQorVGhpcyBpcyBhbiBvcHRpbWl6ZWQgbGF5b3V0IGZvciBhIHNjcmVlbiB3aXRoCit0aGUgQWN0aW9uIEJhciBlbmFibGVkIG92ZXJsYXlpbmcgYXBwbGljYXRpb24gY29udGVudC4KKy0tPgorCis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKyAgICA8Vmlld0FuaW1hdG9yIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2Jhcl9hbmltYXRvciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0idG9wIgorICAgICAgICBhbmRyb2lkOmluQW5pbWF0aW9uPSJAYW5pbS9wdXNoX2Rvd25faW5fbm9fYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6b3V0QW5pbWF0aW9uPSJAYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhIj4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9hY3Rpb25CYXJTdHlsZSIgLz4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fY29udGV4dF9iYXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9hY3Rpb25Nb2RlU3R5bGUiIC8+CisgICAgPC9WaWV3QW5pbWF0b3I+CisgICAgPEltYWdlVmlldyBhbmRyb2lkOnNyYz0iP2FuZHJvaWQ6YXR0ci93aW5kb3dDb250ZW50T3ZlcmxheSIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRYWSIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvYWN0aW9uX2Jhcl9hbmltYXRvciIgLz4KKzwvUmVsYXRpdmVMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF9jb250ZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGI5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF9jb250ZW50LnhtbApAQCAtMCwwICsxLDU2IEBACis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjdkcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRwIgorICAgICAgICA+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjNkcCIKKyAgICAgICAgPgorICAgICAgICA8IS0tY29tLmFuZHJvaWQuc2VydmVyLnN0YXR1cy5BbmltYXRlZEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2ljb24iIC0tPgorICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNWRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNWRwIgorICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdENlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYXJyb3dfZG93bl9mbG9hdCIvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LlRpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZHAiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZHAiCisgICAgICAgICAgICAvPgorICAgICAgICA8YW5kcm9pZC53aWRnZXQuRGF0ZVRpbWVWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkcCIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90aXRsZV9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90aXRsZV9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODY0OTgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2Jhcl90aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIgLz4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX3N1YnRpdGxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkM2NjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51SXRlbVZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiID4KKyAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9pbWFnZUJ1dHRvbiIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hdHRyL2FjdGlvbkJ1dHRvblN0eWxlIiAvPgorICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC90ZXh0QnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudUl0ZW1WaWV3PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDU1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudVZpZXcKKyAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21vZGVfYmFyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21vZGVfYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA5ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9hY3Rpb25Nb2RlU3R5bGUiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKaW5kZXggZDQ2MWY0MC4uNTQxZDg0ZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbApAQCAtMjgsOCArMjgsOSBAQAogICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iM2RpcCIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIzZGlwIgogICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxZGlwIgotICAgIGFuZHJvaWQ6bWFqb3JXZWlnaHQ9IjAuNjUiCi0gICAgYW5kcm9pZDptaW5vcldlaWdodD0iMC45Ij4KKyAgICBhbmRyb2lkOm1ham9yV2VpZ2h0TWluPSIwLjY1IgorICAgIGFuZHJvaWQ6bWlub3JXZWlnaHRNaW49IjAuOSIKKyAgICBhbmRyb2lkOm1ham9yV2VpZ2h0TWF4PSIwLjY1Ij4KIAogICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC90b3BQYW5lbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKQEAgLTgwLDggKzgxLDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3ZlclNjcm9sbE1vZGU9ImlmQ29udGVudFNjcm9sbHMiPgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIj4KICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21lc3NhZ2UiCiAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp1c2VMYXJnZXN0Q2hpbGQ9InRydWUiPgorICAgICAgICAgICAgYW5kcm9pZDptZWFzdXJlV2l0aExhcmdlc3RDaGlsZD0idHJ1ZSI+CiAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbGVmdFNwYWNlciIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvY29udGFjdF9oZWFkZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjQ2N2QzLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvY29udGFjdF9oZWFkZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFubmVyIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS90aXRsZV9iYXJfbWVkaXVtIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIj4KLQotICAgIDxhbmRyb2lkLndpZGdldC5RdWlja0NvbnRhY3RCYWRnZSBhbmRyb2lkOmlkPSJAK2lkL3Bob3RvIgotICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSItMWRpcCIKLSAgICAgICAgc3R5bGU9IkAqYW5kcm9pZDpzdHlsZS9XaWRnZXQuUXVpY2tDb250YWN0QmFkZ2UuV2luZG93U21hbGwiIC8+Ci0gICAgLz4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiID4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWdncmVnYXRlX2JhZGdlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjNkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIzZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfYWdncmVnYXRlZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAvPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0NvbG9yPSIjQkIwMDAwMDAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dSYWRpdXM9IjIuNzUiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcGhvbmV0aWNfbmFtZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9Ii0yZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1cyIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9Ii0yZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1c19kYXRlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyc3AiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9Ii0yZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPEltYWdlVmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ByZXNlbmNlIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIzZGlwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNmRpcCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgIC8+Ci0KLSAgICA8Q2hlY2tCb3gKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL2Rlc2NyaXB0aW9uX3N0YXIiCi0gICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3N0YXJTdHlsZSIgLz4KLQotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2JyZWFkX2NydW1iX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9mcmFnbWVudF9icmVhZF9jcnVtYl9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTdjNTcwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9mcmFnbWVudF9icmVhZF9jcnVtYl9pdGVtLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UKKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL25hdl9kaXZpZGVyIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iMTJkcCIKKyAgICAgICAgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZnJhZ21lbnRfYnJlYWRfY3J1bWJzLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZnJhZ21lbnRfYnJlYWRfY3J1bWJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg5ZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9mcmFnbWVudF9icmVhZF9jcnVtYnMueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZQorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQKKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwKaW5kZXggYWI2NzVjNy4uM2Q1MmY3MSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KICAgICAgICAgPCEtLSAiRW50ZXIgUElOKFBhc3N3b3JkKSB0byB1bmxvY2siIC0tPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9lbnRlcl9wYXNzd29yZF9sYWJlbCIKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwKaW5kZXggOWVlODc4MS4uYWY4YTNlZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiPgogCiAgICAgPCEtLSAiRW50ZXIgUElOKFBhc3N3b3JkKSB0byB1bmxvY2siIC0tPgotICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2VudGVyX3Bhc3N3b3JkX2xhYmVsIgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czEiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAppbmRleCBjMWI0MDZmLi44MzM4MWExIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbApAQCAtNTgsMTggKzU4LDE5IEBACiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHR8Ym90dG9tIgogICAgICAgICAgICAgLz4KKwogICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKICAgICAgICAgICAgID4KIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNzJzcCIKQEAgLTg0LDggKzg1LDkgQEAKIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbAppbmRleCA3NGEwZWVlLi44ZGFjZmFmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKQEAgLTU1LDEyICs1NSwxMiBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCiAgICAgICAgICAgICA+CiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjU2c3AiCkBAIC03NCw4ICs3NCw5IEBACiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCmluZGV4IDZmOWYxZTAuLjE0MTQwMzIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKQEAgLTEsOCArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPCEtLQotLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCkBAIC0xNyw4ICsxNSw0MiBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+Ci08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgotICAgIC8+Cis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzQ29udGFpbmVyIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiPgorICAgICAgICAKKyAgICAgICAgPFByb2dyZXNzQmFyIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVMYXJnZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvYWRpbmciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAKKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9saXN0Q29udGFpbmVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgICAgICAgICAKKyAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvaW50ZXJuYWxFbXB0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIgLz4KKyAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICAKKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjlmMWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9tZW51X2l0ZW1fbGF5b3V0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9tZW51X2l0ZW1fbGF5b3V0LnhtbAppbmRleCAzOWM4ODcyMi4uNTcwOTFhMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X21lbnVfaXRlbV9sYXlvdXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9tZW51X2l0ZW1fbGF5b3V0LnhtbApAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZUludmVyc2UiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiCiAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmR1cGxpY2F0ZVBhcmVudFN0YXRlPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdGl0bGUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgogICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpkdXBsaWNhdGVQYXJlbnRTdGF0ZT0idHJ1ZSIgLz4KIApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9sb2NhbGVfcGlja2VyX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9sb2NhbGVfcGlja2VyX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2M2Y1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xvY2FsZV9waWNrZXJfaXRlbS54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorICAgIGFuZHJvaWQ6cGFkZGluZz0iNWRpcCI+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sb2NhbGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiCisgICAgLz4KKzwvTGluZWFyTGF5b3V0ID4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcG9wdXBfbWVudV9pdGVtX2xheW91dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3BvcHVwX21lbnVfaXRlbV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGM0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3BvcHVwX21lbnVfaXRlbV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lkxpc3RNZW51SXRlbVZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0Ij4KKyAgICAKKyAgICA8IS0tIEljb24gd2lsbCBiZSBpbnNlcnRlZCBoZXJlLiAtLT4KKyAgICAKKyAgICA8IS0tIFRoZSB0aXRsZSBhbmQgc3VtbWFyeSBoYXZlIHNvbWUgZ2FwIGJldHdlZW4gdGhlbSwgYW5kIHRoaXMgJ2dyb3VwJyBzaG91bGQgYmUgY2VudGVyZWQgdmVydGljYWxseS4gLS0+CisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmR1cGxpY2F0ZVBhcmVudFN0YXRlPSJ0cnVlIj4KKyAgICAgICAgCisgICAgICAgIDxUZXh0VmlldyAKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZVBvcHVwTWVudSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHVwbGljYXRlUGFyZW50U3RhdGU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2hvcnRjdXQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsUG9wdXBNZW51IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkdXBsaWNhdGVQYXJlbnRTdGF0ZT0idHJ1ZSIgLz4KKworICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICA8IS0tIENoZWNrYm94LCBhbmQvb3IgcmFkaW8gYnV0dG9uIHdpbGwgYmUgaW5zZXJ0ZWQgaGVyZS4gLS0+CisgICAgCis8L2NvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5MaXN0TWVudUl0ZW1WaWV3PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2RpYWxvZ19lZGl0dGV4dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbAppbmRleCBiMmE0MzY4Li41YmU1NzczIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbApAQCAtMTcsOCArMTcsNyBAQAogPCEtLSBMYXlvdXQgdXNlZCBhcyB0aGUgZGlhbG9nJ3MgY29udGVudCBWaWV3IGZvciBFZGl0VGV4dFByZWZlcmVuY2UuIC0tPgogPFNjcm9sbFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvdmVyU2Nyb2xsTW9kZT0iaWZDb250ZW50U2Nyb2xscyI+CisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgogCiAgICAgPExpbmVhckxheW91dAogICAgICAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvZWRpdHRleHRfY29udGFpbmVyIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2hlYWRlcl9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9oZWFkZXJfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhN2IyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfaGVhZGVyX2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gTGF5b3V0IG9mIGEgaGVhZGVyIGl0ZW0gaW4gUHJlZmVyZW5jZUFjdGl2aXR5LiAtLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2FjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjJkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9zdW1tYXJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBhbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIiAvPgorCisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sCmluZGV4IDhmODY5ODEuLjdjMGI3OTEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sCkBAIC00LDIyICs0LDk3IEBACiAqKgogKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAtLT4KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgotICAgIGFuZHJvaWQ6c2Nyb2xsYmFyQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2s9InRydWUiCi0gICAgLz4KKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXJzIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEwIj4KKworICAgICAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjaz0idHJ1ZSIgLz4KKworICAgICAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbGlzdF9mb290ZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiIC8+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvcHJlZnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjMzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbl9iYXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvYm90dG9tX2JhciIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYmFja19idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2J0bl9iYWNrIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYmFja19idXR0b25fbGFiZWwiCisgICAgICAgIC8+CisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIj4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NraXBfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9za2lwX2J1dHRvbl9sYWJlbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dF9idXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVJpZ2h0PSJAZHJhd2FibGUvaWNfYnRuX25leHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjNkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX2xhYmVsIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sCmluZGV4IGRmYTk3MzEuLjcyZjczOTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbi54bWwKQEAgLTI1LDYgKzI1LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDwhLS0gVGl0bGUgYmFyIC0tPgogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiCiAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU4NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZVN0eWxlIiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZD0iP2FuZHJvaWQ6YXR0ci93aW5kb3dDb250ZW50T3ZlcmxheSIgLz4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTFlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aAordGhlIEFjdGlvbiBCYXIgZW5hYmxlZCBvdmVybGF5aW5nIGFwcGxpY2F0aW9uIGNvbnRlbnQuCistLT4KKworPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisgICAgPFZpZXdBbmltYXRvciBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfYW5pbWF0b3IiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZVN0eWxlIiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDpzcmM9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiCisgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2FjdGlvbl9iYXJfYW5pbWF0b3IiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xvd2VyX2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9jdXN0b21fdGl0bGUueG1sCmluZGV4IDM0YzlkZTAuLmM2MmEwNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fY3VzdG9tX3RpdGxlLnhtbApAQCAtMjEsNiArMjEsMTMgQEAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDwhLS0gUG9wb3V0IGJhciBmb3IgYWN0aW9uIG1vZGVzIC0tPgorICAgIDxWaWV3U3R1YiBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9tb2RlX2Jhcl9zdHViIgorICAgICAgICAgICAgICBhbmRyb2lkOmluZmxhdGVkSWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCiAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIgCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sCmluZGV4IDZlNjk0YzEuLmMzZjQxZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3Byb2dyZXNzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9wcm9ncmVzcy54bWwKQEAgLTI2LDYgKzI2LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiIAogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fc2ltcGxlLnhtbAppbmRleCBkZjUxMWM2Li44N2MyOWY2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3NpbXBsZS54bWwKQEAgLTIxLDkgKzIxLDE5IEBACiBlbmFibGVkLgogLS0+CiAKLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kSW5zaWRlUGFkZGluZz0iZmFsc2UiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKLSAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRJbnNpZGVQYWRkaW5nPSJmYWxzZSIKKyAgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbAppbmRleCAzOWVhMTMxLi5mNTEzNGY5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGUueG1sCkBAIC0yMiw2ICsyMiwxMiBAQAogPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPEZyYW1lTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sCmluZGV4IDYyYTAyMjguLjUxZDZhMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlX2ljb25zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZV9pY29ucy54bWwKQEAgLTIzLDYgKzIzLDEyIEBACiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIKICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlYXJjaF9kcm9wZG93bl9pdGVtX2ljb25zXzJsaW5lLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX2Ryb3Bkb3duX2l0ZW1faWNvbnNfMmxpbmUueG1sCmluZGV4IGQ3MWI0ZjcuLmZjZGY5MWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX2Ryb3Bkb3duX2l0ZW1faWNvbnNfMmxpbmUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX2Ryb3Bkb3duX2l0ZW1faWNvbnNfMmxpbmUueG1sCkBAIC0xLDMxICsxLDMxIEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPCEtLQotLyogCisvKgogKioKICoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+CiAKLTxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIAorPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgogICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyZGlwIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL3NlYXJjaFJlc3VsdExpc3RJdGVtSGVpZ2h0IiA+CiAKICAgICA8IS0tIEljb25zIGNvbWUgZmlyc3QgaW4gdGhlIGxheW91dCwgc2luY2UgdGhlaXIgcGxhY2VtZW50IGRvZXNuJ3QgZGVwZW5kIG9uCi0gICAgICAgICB0aGUgcGxhY2VtZW50IG9mIHRoZSB0ZXh0IHZpZXdzLiAtLT4gICAgCisgICAgICAgICB0aGUgcGxhY2VtZW50IG9mIHRoZSB0ZXh0IHZpZXdzLiAtLT4KICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2ljb24xIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkaXAiCkBAIC0zNSwzMSArMzUsNDQgQEAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCiAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KIAotICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvaWNvbjIiCisgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2VkaXRfcXVlcnkiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRpcCIKICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlckluc2lkZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF9xdWVyeSIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3F1ZXJ5X2JhY2tncm91bmQiCiAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KIAorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvaWNvbjIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRpcCIKKyAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlckluc2lkZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25XaXRoUGFyZW50SWZNaXNzaW5nPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL2VkaXRfcXVlcnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorCisKICAgICA8IS0tIFRoZSBzdWJ0aXRsZSBjb21lcyBiZWZvcmUgdGhlIHRpdGxlLCBzaW5jZSB0aGUgaGVpZ2h0IG9mIHRoZSB0aXRsZSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlCi0gICAgICAgICBzdWJ0aXRsZSBpcyB2aXNpYmxlIG9yIGdvbmUuIC0tPiAKKyAgICAgICAgIHN1YnRpdGxlIGlzIHZpc2libGUgb3IgZ29uZS4gLS0+CiAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQyIgogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9kcm9wRG93bkl0ZW1TdHlsZSIKICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNlYXJjaFJlc3VsdFN1YnRpdGxlIgogICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjlkaXAiIAorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI5ZGlwIgogICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCiAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0idG9wIgogICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBhbmRyb2lkOmlkL2ljb24xIgogICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGFuZHJvaWQ6aWQvaWNvbjIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduV2l0aFBhcmVudElmTWlzc2luZz0idHJ1ZSIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduV2l0aFBhcmVudElmTWlzc2luZz0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCiAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAKKwogICAgIDwhLS0gVGhlIHRpdGxlIGlzIHBsYWNlZCBhYm92ZSB0aGUgc3VidGl0bGUsIGlmIHRoZXJlIGlzIG9uZS4gSWYgdGhlcmUgaXMgbm8KICAgICAgICAgIHN1YnRpdGxlLCBpdCBmaWxscyB0aGUgcGFyZW50LiAtLT4KICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCkBAIC03Miw1ICs4NSw1IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGFuZHJvaWQ6aWQvaWNvbjEiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAYW5kcm9pZDppZC9pY29uMiIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkBhbmRyb2lkOmlkL3RleHQyIiAvPgotICAgIAorCiA8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWFyY2hfdmlldy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI5YjU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWFyY2hfdmlldy54bWwKQEAgLTAsMCArMSwxMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLS0+Cis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2JhciIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIj4KKworICAgIDwhLS0gVGhpcyBpcyBhY3R1YWxseSB1c2VkIGZvciB0aGUgYmFkZ2UgaWNvbiAqb3IqIHRoZSBiYWRnZSBsYWJlbCAob3IgbmVpdGhlcikgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2JhZGdlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIyZGlwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgIC8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2J1dHRvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjM2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfYnRuX3NlYXJjaCIKKyAgICAvPgorCisgICAgPCEtLSBJbm5lciBsYXlvdXQgY29udGFpbnMgdGhlIGFwcCBpY29uLCBidXR0b24ocykgYW5kIEVkaXRUZXh0IC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfZWRpdF9mcmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvZWRpdFRleHRCYWNrZ3JvdW5kIj4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlYXJjaF9hcHBfaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19idG5fc2VhcmNoIgorICAgICAgICAvPgorCisgICAgICAgIDxBdXRvQ29tcGxldGVUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfc3JjX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBudWxsIgorICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHR8dGV4dEF1dG9Db21wbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW1lT3B0aW9ucz0iYWN0aW9uU2VhcmNoIgorICAgICAgICAgICAgYW5kcm9pZDpkcm9wRG93bldpZHRoPSIzMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25IZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25BbmNob3I9IkBpZC9zZWFyY2hfZWRpdF9mcmFtZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25WZXJ0aWNhbE9mZnNldD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwb3B1cEJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL3NlYXJjaF9kcm9wZG93bl9iYWNrZ3JvdW5kIgorICAgICAgICAvPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2Nsb3NlX2J0biIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jbG9zZSIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfZ29fYnRuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19idG5fZmluZF9uZXh0IgorICAgIC8+CisKKyAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfdm9pY2VfYnRuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItNi41ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209Ii03ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iLTVkaXAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2J0bl9zZWFyY2hfZGlhbG9nX3ZvaWNlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfYnRuX3NwZWFrX25vdyIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2cueG1sCmluZGV4IGExYTNlNzYuLjk0ZGNiNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nLnhtbApAQCAtMzAsNiArMzAsNSBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNXB4IgogICAgIGFuZHJvaWQ6Y2FjaGVDb2xvckhpbnQ9IkBudWxsIgotICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodCIKLSAgICBhbmRyb2lkOnNjcm9sbGJhcnM9InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6b3ZlclNjcm9sbE1vZGU9ImlmQ29udGVudFNjcm9sbHMiIC8+CisgICAgYW5kcm9pZDpkaXZpZGVyPSI/YW5kcm9pZDphdHRyL2xpc3REaXZpZGVyQWxlcnREaWFsb2ciCisgICAgYW5kcm9pZDpzY3JvbGxiYXJzPSJ2ZXJ0aWNhbCIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19pdGVtLnhtbAppbmRleCAzMGZlMDJlLi45NmZkY2M2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfaXRlbS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX2l0ZW0ueG1sCkBAIC0yOSw3ICsyOSw3IEBACiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCiAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgotICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbGlnaHRfZGlzYWJsZV9vbmx5IgorICAgIGFuZHJvaWQ6dGV4dENvbG9yPSI/YW5kcm9pZDphdHRyL3RleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iCiAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCiAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTRkaXAiCiAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE1ZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZS54bWwKaW5kZXggNTc4NWQzYi4uYTliZTAxNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfbXVsdGljaG9pY2UueG1sCkBAIC0yMCwxMSArMjAsMTEgQEAKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiCi0gICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodF9kaXNhYmxlX29ubHkiCisgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yQWxlcnREaWFsb2dMaXN0SXRlbSIKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRpcCIKICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iN2RpcCIKLSAgICBhbmRyb2lkOmNoZWNrTWFyaz0iQGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrIgorICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSI/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSIKICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKIC8+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19zaW5nbGVjaG9pY2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKaW5kZXggMzU2MGZlZS4uMWI5Yzk3MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKQEAgLTIwLDEwICsyMCwxMCBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgogICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKLSAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0X2Rpc2FibGVfb25seSIKKyAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JBbGVydERpYWxvZ0xpc3RJdGVtIgogICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgogICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZGlwIgogICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI3ZGlwIgotICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSJAYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW8iCisgICAgYW5kcm9pZDpjaGVja01hcms9Ij9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvclNpbmdsZSIKICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fMi54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fMi54bWwKaW5kZXggNWVhYjU0ZS4uYzg3OTIyYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfbGlzdF9pdGVtXzIueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2ltcGxlX2xpc3RfaXRlbV8yLnhtbApAQCAtMTUsOCArMTUsNiBAQAogLS0+CiAKIDxUd29MaW5lTGlzdEl0ZW0geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiAKLQlhbmRyb2lkOnBhZGRpbmdUb3A9IjJkaXAiCi0JYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIyZGlwIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzEueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfbGlzdF9pdGVtX2FjdGl2YXRlZF8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDE2ZGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfbGlzdF9pdGVtX2FjdGl2YXRlZF8xLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQxIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9hY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2ltcGxlX2xpc3RfaXRlbV9hY3RpdmF0ZWRfMi54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmJmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzIueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxUd29MaW5lTGlzdEl0ZW0geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMmRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjJkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOm1vZGU9InR3b0xpbmUiCis+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBhbmRyb2lkOmlkL3RleHQxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBhbmRyb2lkOmlkL3RleHQxIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgLz4KKworPC9Ud29MaW5lTGlzdEl0ZW0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4YmNkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPENoZWNrZWRUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI5ZGlwIgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJfcnVudGltZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMDk2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgPgorICAgIDxXZWJWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvd2VidmlldyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIC8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BsYXNoc2NyZWVuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRTdGFydCIKKyAgICAvPgorCis8L0ZyYW1lTGF5b3V0PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYnZpZXdfZmluZC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYnZpZXdfZmluZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlZGIyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2Vidmlld19maW5kLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgPgorICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VkaXQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNjcm9sbEhvcml6b250YWxseT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHQiCisgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9maW5kX29uX3BhZ2UiCisgICAgICAgIGFuZHJvaWQ6aW1lT3B0aW9ucz0iYWN0aW9uRG9uZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICAvPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21hdGNoZXMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZSIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19jb3B5LnhtbCBiL2NvcmUvcmVzL3Jlcy9tZW51L3dlYnZpZXdfY29weS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiYTU2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9tZW51L3dlYnZpZXdfY29weS54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2NvcHkiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfY29weSIKKyAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NoYXJlIgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X3NoYXJlIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2VsZWN0X2FsbCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9zZWxlY3RfYWxsIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZmluZCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9maW5kIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorPC9tZW51PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbWVudS93ZWJ2aWV3X2ZpbmQueG1sIGIvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19maW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGE0MGFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19maW5kLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZmluZF9wcmV2IgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19idG5fZmluZF9wcmV2IgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZmluZF9uZXh0IgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19idG5fZmluZF9uZXh0IgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3Jhdy1ybS9sb2FkZXJyb3IuaHRtbCBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0YTNmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L3RpdGxlPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICAgICAgaDIgICB7IG1hcmdpbi10b3A6IDVweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICA8L3N0eWxlPgorCisgICAgICAgIDxib2R5PgorCisgICAgICAgICAgICA8aW1nIHNyYz0iZmlsZTovLy9hbmRyb2lkX2Fzc2V0L3dlYmtpdC9hbmRyb2lkLXdlYmVycm9yLnBuZyIgYWxpZ249InRvcCIgLz4KKyAgICAgICAgICAgIDxoMj5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L2gyPgorICAgICAgICAgICAgPHA+SW1wdXNzaWJlbCBkYSBjaGFyZ2lhciBsYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPi4gRXJydXI6PC9wPgorICAgICAgICAgICAgPCEtLSBUaGUgJWUgaXMgcmVwbGFjZWQgYnkgYSBsb2NhbGl6ZWQgZXJyb3Igc3RyaW5nIC0tPgorICAgICAgICAgICAgPHA+JWU8L3A+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2hlYWQ+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwgYi9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyODMzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbm9kb21haW4uaHRtbApAQCAtMCwwICsxLDIzIEBACis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvdGl0bGU+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgICAgICBib2R5IHsgbWFyZ2luLXRvcDogMHB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgICAgICBoMiAgIHsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgIDwvc3R5bGU+CisKKyAgICAgICAgPGJvZHk+CisKKyAgICAgICAgICAgIDxpbWcgc3JjPSJmaWxlOi8vL2FuZHJvaWRfYXNzZXQvd2Via2l0L2FuZHJvaWQtd2ViZXJyb3IucG5nIiBhbGlnbj0idG9wIiAvPgorICAgICAgICAgICAgPGgyPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvaDI+CisgICAgICAgICAgICA8cD5MYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPiAmZWdyYXZlOyBldmVudHVhbG1haW4gZGVhY3RpdmFkYSB0ZW1wb3Jhcm1haW4gdSBzcHVzdGFkYSBkZWZpbml0aXZhbWFpbiBhZCBpbmEgbm92YSBhZHJlc3NhIGRhIHdlYi48L3A+CisKKyAgICAgICAgICAgIDxwPjxiPlF1YSBpbiBwJmVncmF2ZTtyIHByb3Bvc3Rhczo8L2I+PC9wPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT5Db250cm9sbGFpIGNoZSBWb3NzIGFwcGFyYXQgcmVjZXBlc2NoYSBpbiBzaWduYWwgZSBkaXNwb25hIGQnaW5hIGNvbm5leGl1biBkYSBkYXRhcy48L2xpPgorICAgICAgICAgICAgICAgIDxsaT5DaGFyZ2lhaSBwbGkgdGFyZCBkYW5vdmFtYWluIGxhIHBhZ2luYSBkJ2ludGVybmV0LjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPkNoYXJnaWFpIGluYSBjb3BpYSBkYSBsYSBwYWdpbmEgZGEgd2ViIG1lbW9yaXNhZGEgZW4gaWwgY2FjaGUgZGEgR29vZ2xlLjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2JvZHk+CisgICAgPC9oZWFkPgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKaW5kZXggOTAyOWFiMy4uZTZjMGE0OCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+Ik7DoXN0cm9qZSBwcm8gdsO9dm9qw6HFmWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4iRnVua2NlIHBvdXplIHBybyB2w712b2rDocWZZSBhcGxpa2Fjw60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiLDmmxvxb5pxaF0xJsiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IlDFmcOtc3R1cCBrZSBrYXJ0xJsgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlDFmcOtc3R1cCBrZSBrYXJ0xJsgU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlDFmcOtc3R1cCBrZSBrYXJ0xJsgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4iemFrw6F6w6Fuw60gxI1pIHptxJtueSBzdGF2b3bDqWhvIMWZw6Fka3UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iVW1vxb7FiHVqZSBhcGxpa2FjaSB6YWvDoXphdCBzdGF2b3bDvSDFmcOhZGVrIG5lYm8gcMWZaWRhdCDEjWkgb2RlYnJhdCBzeXN0w6ltb3bDqSBpa29ueS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4ic3Rhdm92w70gxZnDoWRlayI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4iVW1vxb7FiHVqZSBhcGxpa2FjaSB1dm9sbml0IHBhbcSbxaUgdGVsZWZvbnUgc21hesOhbsOtbSBzb3Vib3LFryB2IGFkcmVzw6HFmWkgbWV6aXBhbcSbdGkgYXBsaWthY2UuIFDFmcOtc3R1cCBqZSB2ZWxtaSBvbWV6ZW7DvSwgdsSbdMWhaW5vdSBwb3V6ZSBwcm8gc3lzdMOpbW92w6kgcHJvY2VzeS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iUMWZZXN1biB6ZHJvasWvIGFwbGlrYWNlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSBwxZllc3Vub3V0IHN2w6kgemRyb2plIHogaW50ZXJuw60gcGFtxJt0aSBuYSBleHRlcm7DrSBtw6lkaXVtIGEgb3BhxI1uxJsuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiLEjcOtc3QgY2l0bGl2w6EgZGF0YSB2IHByb3Rva29sZWNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIG1zZ2lkPSI4ODk2NDQ5NDM3NDY0ODY3NzY2Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSDEjcOtc3QgcsWvem7DqSBzeXN0w6ltb3bDqSBzb3Vib3J5IHByb3Rva29sxa8uIFRvdG8gbmFzdGF2ZW7DrSBhcGxpa2FjaSB1bW/Fvm7DrSB6w61za2F0IG9iZWNuw6kgaW5mb3JtYWNlIG8gxI1pbm5vc3RlY2ggcyB0ZWxlZm9uZW0sIGt0ZXLDqSBieSBtb2hseSBvYnNhaG92YXQgb3NvYm7DrSDEjWkgc291a3JvbcOpIGluZm9ybWFjZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiLEjXRlbsOtIG5lYm8gesOhcGlzIGRvIHByb3N0xZllZGvFryBmdW5rY2UgZGlhZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2RpYWdub3N0aWMiIG1zZ2lkPSIzMTIxMjM4MzczOTUxNjM3MDQ5Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSDEjcOtc3QgbGlib3ZvbG7DqSBwcm9zdMWZZWRreSB2ZSBza3VwaW7EmyBkaWFnLCBuYXDFmS4gc291Ym9yeSB2ZSBzbG/FvmNlIC9kZXYsIGEgemFwaXNvdmF0IGRvIG5pY2guIE3Fr8W+ZSBkb2rDrXQgayBvdmxpdm7Em27DrSBzdGFiaWxpdHkgYSBiZXpwZcSNbm9zdGkgc3lzdMOpbXUuIFRvdG8gbmFzdGF2ZW7DrSBieSBtxJtsIHBvdcW+w612YXQgcG91emUgdsO9cm9iY2UgxI1pIG9wZXLDoXRvciBwcm8gZGlhZ25vc3Rpa3UgaGFyZHdhcnUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4icG92b2xlbsOtIMSNaSB6YWvDoXrDoW7DrSBrb21wb25lbnQgYXBsaWthY8OtIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSBrb25maWd1cm92YXQgbcOtc3Ruw60gdGVsZWZvbiBzIHJvemhyYW7DrW0gQmx1ZXRvb3RoIGEgdnlobGVkw6F2YXQgYSBww6Fyb3ZhdCB2emTDoWxlbsOhIHphxZnDrXplbsOtLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+InZ5dHZvxZllbsOtIHDFmWlwb2plbsOtIEJsdWV0b290aCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IlVtb8W+xYh1amUgYXBsaWthY2kgem9icmF6aXQga29uZmlndXJhY2kgbcOtc3Ruw61obyB0ZWxlZm9udSBzIHJvemhyYW7DrW0gQmx1ZXRvb3RoLCB2eXR2w6HFmWV0IHDFmWlwb2plbsOtIGtlIHNww6Fyb3ZhbsO9bSB6YcWZw616ZW7DrW0gYSBwxZlpasOtbWF0IHRhdG8gcMWZaXBvamVuw60uIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjQWRtaW4gKDIyNTEzMDIyMzMwMTIyNTAwNTYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjQWRtaW4gKDE5MzU4NDI2MTE0NjQ4OTU3ODUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNSYXcgKDQ0MjM0NzE3MTExMTQzMjU3MDgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjUmF3ICg1NTMzMDIyNzM2NTU5Mzg1NjY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTm90aWZ5ICg0Nzg0NzAzNjAwODI3OTIzNTgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTm90aWZ5ICgyOTkwMDUzNTE3OTYyMDcwNjE3KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTGxjcCAoNDk3MjA1MTQ2MTAwNzAzMDQyNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNMbGNwICg5MTU5MjEyNzc4NjAwNDY0MCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+InZ5cG51dMOtIHrDoW1rdSBrbMOhdmVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IlVtb8W+xYh1amUgYXBsaWthY2kgdnlwbm91dCB6w6FtZWsga2zDoXZlcyBhIHNvdXZpc2Vqw61jw60gemFiZXpwZcSNZW7DrSBoZXNsZW0uIFDFmcOta2xhZGVtIG9wcsOhdm7Em27DqWhvIHBvdcW+aXTDrSB0w6l0byBmdW5rY2UgamUgdnlwbnV0w60gesOhbWt1IGtsw6F2ZXNuaWNlIHDFmWkgcMWZw61jaG96w61tIGhvdm9ydSBhIGplaG8gb3DEm3Rvdm7DqSB6YXBudXTDrSBwbyBza29uxI1lbsOtIGhvdm9ydS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4ixI10ZW7DrSBuYXN0YXZlbsOtIHN5bmNocm9uaXphY2UiPC9zdHJpbmc+CkBAIC00MzUsMjIgKzQyMCwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSIxMDgyOTcyNjAzNTc2MzYwNjkwIj4iVW1vxb5uw60gYXBsaWthY2kgxI3DrXN0IHNvdWtyb23DoSBzbG92YSwgam3DqW5hIGEgZnLDoXplLCBrdGVyw6EgdcW+aXZhdGVsIG1vaGwgdWxvxb5pdCBkbyBzdsOpaG8gc2xvdm7DrWt1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+InrDoXBpcyBkbyBzbG92bsOta3UgZGVmaW5vdmFuw6lobyB1xb5pdmF0ZWxlbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiJVbW/Fvm7DrSBhcGxpa2FjaSB6YXBpc292YXQgbm92w6Egc2xvdmEgZG8gdcW+aXZhdGVsc2vDqWhvIHNsb3Zuw61rdS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+InptxJtuYS9zbWF6w6Fuw60gb2JzYWh1IGthcnR5IFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJ6bcSbbmEvc21hesOhbsOtIG9ic2FodSBrYXJ0eSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiJVbW/Fvm7DrSBhcGxpa2FjaSB6w6FwaXMgbmEga2FydHUgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iVW1vxb5uw60gYXBsaWthY2kgesOhcGlzIG5hIGthcnR1IFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iem3Em25hL3NtYXrDoW7DrSBvYnNhaHUga2FydHkgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJVbW/Fvm7DrSBhcGxpa2FjaSB6w6FwaXMgbmEga2FydHUgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+InDFmWlzdHVwb3ZhdCBkbyBzb3Vib3JvdsOpaG8gc3lzdMOpbXUgbWV6aXBhbcSbdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IlVtb8W+xYh1amUgYXBsaWthY2kgxI3DrXN0IGEgemFwaXNvdmF0IGRvIHNvdWJvcm92w6lobyBzeXN0w6ltdSBtZXppcGFtxJt0aS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiJPbWV6ZW7DrSBoZXNsYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiJPbWV6dWplIHR5cCBoZXNlbCwga3RlcsOhIGx6ZSBwb3XFvsOtdC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+IlNsZWRvdsOhbsOtIHBva3Vzxa8gbyBwxZlpaGzDocWhZW7DrSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJTbGVkdWplIG5lemRhxZllbsOpIHBva3VzeSBvIHDFmWlobMOhxaFlbsOtIGRvIHphxZnDrXplbsOtIGEgdW1vxb7FiHVqZSBwcm92ZWRlbsOtIHVyxI1pdMOpIGFrY2UuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4iT2Jub3ZlbsOtIGhlc2xhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IlZ5bnV0w60gbmFzdGF2ZW7DrSBoZXNsYSBuYSBub3ZvdSBob2Rub3R1LCBrdGVyb3UgdsOhbSBwxZllZCBwxZlpaGzDocWhZW7DrW0gbXVzw60gc2TEm2xpdCBzcHLDoXZjZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IlZ5bnVjZW7DrSB1emFtxI1lbsOtIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iVXLEjXVqZSwga2R5IGRvamRlIGsgdXphbcSNZW7DrSB6YcWZw616ZW7DrSBhIGJ1ZGUgcG/FvmFkb3bDoW5vIG9wxJt0b3Zuw6kgemFkw6Fuw60gaGVzbGEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iT21lemVuw60gaGVzbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iT21lenVqZSB0eXAgaGVzZWwsIGt0ZXLDoSBsemUgcG91xb7DrXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4iU2xlZG92w6Fuw60gcG9rdXPFryBvIHDFmWlobMOhxaFlbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+IlNsZWR1amUgbmV6ZGHFmWVuw6kgcG9rdXN5IG8gcMWZaWhsw6HFoWVuw60gZG8gemHFmcOtemVuw60gYSB1bW/FvsWIdWplIHByb3ZlZGVuw60gdXLEjWl0w6kgYWtjZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjkwODQ3NzIwOTA3OTc0ODU0MjAiPiJPYm5vdmVuw60gaGVzbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4iVnludXTDrSBuYXN0YXZlbsOtIGhlc2xhIG5hIG5vdm91IGhvZG5vdHUsIGt0ZXJvdSB2w6FtIHDFmWVkIHDFmWlobMOhxaFlbsOtbSBtdXPDrSBzZMSbbGl0IHNwcsOhdmNlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iVnludWNlbsOtIHV6YW3EjWVuw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJVcsSNdWplLCBrZHkgZG9qZGUgayB1emFtxI1lbsOtIHphxZnDrXplbsOtIGEgYnVkZSBwb8W+YWRvdsOhbm8gb3DEm3Rvdm7DqSB6YWTDoW7DrSBoZXNsYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iVnltYXrDoW7DrSB2xaFlY2ggZGF0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiJCZXogZGFsxaHDrWhvIHBvdHZyemVuw60gb2Jub3bDrSB2w71jaG96w60gbmFzdGF2ZW7DrSB6IHbDvXJvYnkgYSBzbWHFvmUgdsWhZWNobmEgZGF0YS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkJleiBkYWzFocOtaG8gcG90dnJ6ZW7DrSBvYm5vdsOtIHbDvWNob3rDrSBuYXN0YXZlbsOtIHogdsO9cm9ieSBhIHNtYcW+ZSB2xaFlY2huYSBkYXRhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+Ik5hc3RhdnRlIGdsb2LDoWxuw60gc2VydmVyIHByb3h5LCBrdGVyw70gamUgcG91xb7DrXbDoW4sIGtkecW+IGpzb3UgesOhc2FkeSBha3Rpdm7DrS4gUGxhdG7DvSBnbG9iw6FsbsOtIHNlcnZlciBwcm94eSBuYXN0YXZ1amUgcG91emUgcHJ2bsOtIHNwcsOhdmNlIHphxZnDrXplbsOtLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbcWvIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJQcsOhY2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iSmluw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iVmxhc3Ruw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiJWbGFzdG7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlSG9tZSIgbXNnaWQ9IjYwOTM1OTgxODEwNjkzNTkyOTUiPiJQbG9jaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZVdvcmsiIG1zZ2lkPSI2OTIwNzI1NzMwNzk3MDk5MDQ3Ij4iUHLDoWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVPdGhlciIgbXNnaWQ9IjQ0MDg0MzYxNjI5NTAxMTk4NDkiPiJKaW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJwb21vY8OtIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gcG9tb2PDrSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUN1c3RvbSAoMjQ3MzU4MDU5MzExMTU5MDk0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUhvbWUgKDYwOTM1OTgxODEwNjkzNTkyOTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVXb3JrICg2OTIwNzI1NzMwNzk3MDk5MDQ3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJaYWRlanRlIGvDs2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJaYWRlanRlIGhlc2xvIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJaYWRlanRlIGvDs2QgUElOIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iTmVzcHLDoXZuw70ga8OzZCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iQ2hjZXRlLWxpIHRlbGVmb24gb2RlbWtub3V0LCBzdGlza27Em3RlIE1lbnUgYSBwb3TDqSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLEjMOtc2xvIHTDrXPFiG92w6kgbGlua3kiPC9zdHJpbmc+CkBAIC01NjQsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iWmF2b2xhdCB6cMSbdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlNwcsOhdm7EmyEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iWmt1c3RlIHRvIHByb3PDrW0gem5vdnUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlprdXN0ZSB0byBwcm9zw61tIHpub3Z1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iTmFiw61qZW7DrSAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iTmFiaXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU3OCw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplIHphYmxva292w6FuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJPZGJsb2tvdsOhbsOtIGthcnR5IFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+a3LDoXQganN0ZSBuYWtyZXNsaWxpIG5lc3Byw6F2bsOpIGJlenBlxI1ub3N0bsOtIGdlc3RvLiAiXG5cbiJPcGFrdWp0ZSBwcm9zw61tIGFrY2kgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkgaGVzbG8uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkga8OzZCBQSU4uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz5rcsOhdCBqc3RlIG5lc3Byw6F2bsSbIG5ha3Jlc2xpbGkgc3bDqSBiZXpwZcSNbm9zdG7DrSBnZXN0by4gUG8gZGFsxaHDrWNoIG5lw7pzcMSbxaFuw71jaCBwb2t1c2VjaCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4pIGJ1ZGV0ZSBwb8W+w6Fkw6FuaSBvIG9kZW3EjWVuw60gdGVsZWZvbnUgcG9tb2PDrSBwxZlpaGzDocWhZW7DrSBkbyDDusSNdHUgR29vZ2xlLiJcblxuIiBBa2NpIHByb3PDrW0gb3Bha3VqdGUgemEgbsSba29saWsgc2VrdW5kICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPikuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlNla3VuZHkgemLDvXZhasOtY8OtIGRvIGRhbMWhw61obyBwb2t1c3U6IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IlphcG9tbsSbbGkganN0ZSBnZXN0bz8iPC9zdHJpbmc+CkBAIC02MDYsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4iQ2hjZXRlIG9wdXN0aXQgdHV0byBzdHLDoW5rdT8iXG5cbiI8eGxpZmY6ZyBpZD0iTUVTU0FHRSI+JXM8L3hsaWZmOmc+IlxuXG4iVnliZXJ0ZSBPSywgY2hjZXRlLWxpIHBva3JhxI1vdmF0LCBuZWJvIFpydcWhaXQsIGNoY2V0ZS1saSBuYSBzdHLDoW5jZSB6xa9zdGF0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4iUG90dnJkaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IlRpcDogRHZvaml0w71tIGtsZXBudXTDrW0gbcWvxb5ldGUgem9icmF6ZW7DrSBwxZlpYmzDrcW+aXQgbmVibyBvZGTDoWxpdC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiLEjXRlbsOtIGhpc3RvcmllIGEgesOhbG/FvmVrIFByb2hsw63FvmXEjWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiJVbW/FvsWIdWplIGFwbGlrYWNpIMSNw61zdCB2xaFlY2hueSBuYXbFoXTDrXZlbsOpIGFkcmVzeSBVUkwgYSB6w6Fsb8W+a3kgUHJvaGzDrcW+ZcSNZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJ6w6FwaXMgZG8gaGlzdG9yaWUgYSB6w6Fsb8W+ZWsgUHJvaGzDrcW+ZcSNZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IlVtb8W+bsOtIGFwbGlrYWNpIHptxJtuaXQgaGlzdG9yaWkgxI1pIHrDoWxvxb5reSBwcm9obMOtxb5lxI1lIHVsb8W+ZW7DqSB2IHRlbGVmb251LiDFoGtvZGxpdsOpIGFwbGlrYWNlIG1vaG91IHBvbW9jw60gdG9ob3RvIG5hc3RhdmVuw60gdnltYXphdCDEjWkgcG96bcSbbml0IGRhdGEgUHJvaGzDrcW+ZcSNZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+IlptxJtuaXQgb3Byw6F2bsSbbsOtIHByb2hsw63FvmXEjWUgcG9za3l0b3ZhdCBpbmZvcm1hY2UgbyB6ZW3Em3Bpc27DqSBwb2xvemUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSB6bcSbbml0IG9wcsOhdm7Em27DrSBwcm9obMOtxb5lxI1lIHBvc2t5dG92YXQgaW5mb3JtYWNlIG8gemVtxJtwaXNuw6kgcG9sb3plLiDFoGtvZGxpdsOpIGFwbGlrYWNlIG1vaG91IHRvdG8gbmFzdGF2ZW7DrSBwb3XFvsOtdCBrIG9kZXPDrWzDoW7DrSBpbmZvcm1hY8OtIG8gdW3DrXN0xJtuw60gbmEgbGlib3ZvbG7DqSB3ZWJvdsOpIHN0csOhbmt5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IkNoY2V0ZSwgYWJ5IHNpIHByb2hsw63FvmXEjSB6YXBhbWF0b3ZhbCB0b3RvIGhlc2xvPyI8L3N0cmluZz4KQEAgLTcyNiwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVnlicmF0IHbFoWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlZ5YnJhdCBzbG92byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJWeWptb3V0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3DDrXJvdmF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iVmxvxb5pdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29ww61yb3ZhdCBhZHJlc3UgVVJMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iVnlicmF0IHRleHQuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iVsO9YsSbciB0ZXh0dSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kYSB6YWTDoXbDoW7DrSBkYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iUMWZaWRhdCBzbG92byDigJ48eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+4oCcIGRvIHNsb3Zuw61rdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IsOacHJhdnkgdGV4dHUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJPcGVyYWNlIHMgdGV4dGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJNw6FsbyBwYW3Em3RpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iViB0ZWxlZm9udSB6YsO9dsOhIG3DoWxvIG3DrXN0YSBwcm8gdWtsw6Fkw6Fuw60gZGF0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQxLDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJacnXFoWl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IlVwb3pvcm7Em27DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iTmHEjcOtdMOhbsOtLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJaQVBOVVRPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iVllQTk9VVCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iRG9rb27EjWl0IGFrY2kgcG9tb2PDrSBhcGxpa2FjZSI8L3N0cmluZz4KQEAgLTc1OSw5ICs3NTAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IlVrb27EjWl0IGFwbGlrYWNpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+Ik5haGzDoXNpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iUG/EjWthdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwbGlrYWNlIHDFmWVzbcSbcm92w6FuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iSmUgc3B1xaF0xJtuYSBhcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iUMWvdm9kbsSbIGJ5bGEgc3B1xaF0xJtuYSBhcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJBcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBwb3J1xaFpbGEgc3bDqSB2bGFzdG7DrSB2eW51Y2Vuw6kgesOhc2FkeSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gcG9ydcWhaWwgc3bDqSB2bGFzdG7DrSB2eW51Y2Vuw6kgesOhc2FkeSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iQsSbxb7DrSBhcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTgwOCwyOCArODAyLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19zaG93X2FsbCIgbXNnaWQ9IjI2NzE3OTExNjM5MzMwOTExODAiPjxiPiJab2JyYXppdCB2xaFlIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IsOabG/FvmnFoXTEmyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJVU0IgcMWZaXBvamVubyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IlDFmWlwb2ppbGkganN0ZSBzdsWvaiB0ZWxlZm9uIGsgcG/EjcOtdGHEjWkgcG9tb2PDrSBVU0IuIENoY2V0ZS1saSBrb3DDrXJvdmF0IHNvdWJvcnkgeiBwb8SNw610YcSNZSBuYSBrYXJ0dSBTRCB2IHphxZnDrXplbsOtIEFuZHJvaWQgxI1pIG9icsOhY2VuxJssIHZ5YmVydGUgbsOhc2xlZHVqw61jw60gdGxhxI3DrXRrby4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IlDFmWlwb2ppbGkganN0ZSBzdsWvaiB0ZWxlZm9uIGsgcG/EjcOtdGHEjWkgcG9tb2PDrSBVU0IuIENoY2V0ZS1saSBrb3DDrXJvdmF0IHNvdWJvcnkgeiBwb8SNw610YcSNZSBuYSBrYXJ0dSBTRCB2IHphxZnDrXplbsOtIEFuZHJvaWQgxI1pIG9icsOhY2VuxJssIHZ5YmVydGUgbsOhc2xlZHVqw61jw60gdGxhxI3DrXRrby4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IlDFmWlwb2ppbGkganN0ZSBzdsWvaiB0ZWxlZm9uIGsgcG/EjcOtdGHEjWkgcG9tb2PDrSBVU0IuIENoY2V0ZS1saSBrb3DDrXJvdmF0IHNvdWJvcnkgeiBwb8SNw610YcSNZSBuYSBrYXJ0dSBTRCB2IHphxZnDrXplbsOtIEFuZHJvaWQgxI1pIG9icsOhY2VuxJssIHZ5YmVydGUgbsOhc2xlZHVqw61jw60gdGxhxI3DrXRrby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iWmFwbm91dCDDumxvxb5pxaF0xJsgVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iUMWZaSBwb3XFvsOtdsOhbsOtIHZhxaHDrSBrYXJ0eSBTRCBqYWtvIMO6bG/FvmnFoXTEmyBVU0IgZG/FoWxvIGsgcHJvYmzDqW11LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iUMWZaSBwb3XFvsOtdsOhbsOtIHZhxaHDrSBrYXJ0eSBTRCBqYWtvIMO6bG/FvmnFoXTEmyBVU0IgZG/FoWxvIGsgcHJvYmzDqW11LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iUMWZaSBwb3XFvsOtdsOhbsOtIHZhxaHDrSBrYXJ0eSBTRCBqYWtvIMO6bG/FvmnFoXTEmyBVU0IgZG/FoWxvIGsgcHJvYmzDqW11LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJVU0IgcMWZaXBvamVubyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IlZ5YmVydGUsIGNoY2V0ZS1saSBrb3DDrXJvdmF0IHNvdWJvcnkgZG8gbmVibyB6IHBvxI3DrXRhxI1lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IlZ5cG5vdXQgw7psb8W+acWhdMSbIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iVnliZXJ0ZSwgY2hjZXRlLWxpIHZ5cG5vdXQgw7psb8W+acWhdMSbIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iw5psb8W+acWhdMSbIFVTQiBqZSBwb3XFvsOtdsOhbm8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IlDFmWVkIHZ5cG51dMOtbSDDumxvxb5pxaF0xJsgVVNCIHprb250cm9sdWp0ZSwgemRhIGpzdGUgb2Rwb2ppbGkgKHZ5am11bGkpIGthcnR1IFNEIHphxZnDrXplbsOtIEFuZHJvaWQgeiBwb8SNw610YcSNZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iUMWZZWQgdnlwbnV0w61tIMO6bG/FvmnFoXTEmyBVU0IgemtvbnRyb2x1anRlLCB6ZGEganN0ZSBvZHBvamlsaSAodnlqbXVsaSkga2FydHUgU0QgemHFmcOtemVuw60gQW5kcm9pZCB6IHBvxI3DrXRhxI1lLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJQxZllZCB2eXBudXTDrW0gw7psb8W+acWhdMSbIFVTQiB6a29udHJvbHVqdGUsIHpkYSBqc3RlIG9kcG9qaWxpICh2eWptdWxpKSBrYXJ0dSBTRCB6YcWZw616ZW7DrSBBbmRyb2lkIHogcG/EjcOtdGHEjWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iVnlwbm91dCDDumxvxb5pxaF0xJsgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMTQzODgxOTE0ODQwNDEyMTA4Ij4iUMWZaSB2eXDDrW7DoW7DrSDDumxvxb5pxaF0xJsgVVNCIGRvxaFsbyBrIHByb2Jsw6ltxa9tLiBaa29udHJvbHVqdGUsIHpkYSBieWwgaG9zdGl0ZWwgVVNCIG9kcG9qZW4sIGEgemt1c3RlIHRvIHpub3Z1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+IlphcG5vdXQgw7psb8W+acWhdMSbIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IlBva3VkIHphcG5ldGUgw7psb8W+acWhdMSbIFVTQiwgZG9qZGUgayB6YXN0YXZlbsOtIG7Em2t0ZXLDvWNoIHBvdcW+w612YW7DvWNoIGFwbGlrYWPDrS4gVHl0byBhcGxpa2FjZSBwcmF2ZMSbcG9kb2JuxJsgbmVidWRvdSBrIGRpc3BvemljaSBhxb4gZG8gdnlwbnV0w60gw7psb8W+acWhdMSbIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iQ2h5YmEgb3BlcmFjZSBuYSByb3pocmFuw60gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+Ik9LIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiJGb3Jtw6F0b3ZhdCBrYXJ0dSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3Jtw6F0b3ZhdCBrYXJ0dSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiJPcHJhdmR1IGNoY2V0ZSBrYXJ0dSBTRCBuYWZvcm3DoXRvdmF0PyBWxaFlY2huYSBkYXRhIG5hIGthcnTEmyBidWRvdSB6dHJhY2VuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJPcHJhdmR1IGNoY2V0ZSBrYXJ0dSBTRCBuYWZvcm3DoXRvdmF0PyBWxaFlY2huYSBkYXRhIG5hIGthcnTEmyBidWRvdSB6dHJhY2VuYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybcOhdG92YXQga2FydHUgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJPcHJhdmR1IGNoY2V0ZSBrYXJ0dSBTRCBuYWZvcm3DoXRvdmF0PyBWxaFlY2huYSBkYXRhIG5hIGthcnTEmyBidWRvdSB6dHJhY2VuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiJGb3Jtw6F0b3ZhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IkxhZMSbbsOtIHDFmWVzIHJvemhyYW7DrSBVU0IgcMWZaXBvamVubyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iVnliZXJ0ZSwgY2hjZXRlLWxpIHpha8OhemF0IGxhZMSbbsOtIFVTQi4iPC9zdHJpbmc+CkBAIC04MzcsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEHDgUJDxIxExI5Fw4nEmkZHSENIScONSktMTU7Fh0/Dk1BRUsWYU8WgVMWkVcOaVldYWcOdWsW9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUHDgUJDxIxExI5Fw4nEmkZHSENIScONSktMTU7Fh0/Dk1BRUsWYU8WgVMWkVcOaVldYWcOdWsW9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiJrYW5kaWTDoXRpIjwvdT48L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU0NTc2MDM0MTg5NzA5OTQwNTAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDIzOTUxNjY3NTAyODQzODk5NyI+IlDFmcOtcHJhdmEga2FydHkgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlDFmcOtcHJhdmEga2FydHkgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlDFmcOtcHJhdmEga2FydHkgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4Mjg3MzE5ODgyOTI2NzM3MDUzIj4iS29udHJvbGEgY2h5Yi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4iUHLDoXpkbsOhIGthcnRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iUHLDoXpkbsOhIGthcnRhIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTMxMjI2NjgyMDA5Mjk1ODAxNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTYwNjY2MDc1NjEyNDYyOTcwOCI+IkthcnRhIFNEIGplIHByw6F6ZG7DoSBuZWJvIHBvdcW+w612w6EgbmVwb2Rwb3JvdmFuw70gc3lzdMOpbSBzb3Vib3LFry4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJLYXJ0YSBTRCBqZSBwcsOhemRuw6EgbmVibyBvYnNhaHVqZSBuZXBvZHBvcm92YW7DvSBzeXN0w6ltIHNvdWJvcsWvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IlBvxaFrb3plbsOhIGthcnRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJQb8Wha296ZW7DoSBrYXJ0YSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4iS2FydGEgU0QgamUgcG/FoWtvemVuYS4gUHJhdmTEm3BvZG9ibsSbIGppIGJ1ZGUgbnV0bsOpIHpub3Z1IGZvcm3DoXRvdmF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJLYXJ0YSBTRCBqZSBwb8Wha296ZW7DoS4gQnVkZSBwcmF2ZMSbcG9kb2JuxJsgbnV0bsOpIGppIHDFmWVmb3Jtw6F0b3ZhdC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IkthcnRhIFNEIGJ5bGEgbmVvxI1la8OhdmFuxJsgb2RlYnLDoW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IkthcnRhIFNEIGJ5bGEgbmVvxI1la8OhdmFuxJsgb2RlYnLDoW5hIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+IkNoY2V0ZS1saSB6YWJyw6FuaXQgenRyw6F0xJsgZGF0LCBrYXJ0dSBTRCBwxZllZCBvZGVicsOhbsOtbSBvZHBvanRlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkNoY2V0ZS1saSB6YWJyw6FuaXQgenRyw6F0xJsgZGF0LCBrYXJ0dSBTRCBwxZllZCBvZGVicsOhbsOtbSBvZHBvanRlLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iS2FydHUgU0QgamUgbW/Fvm7DqSBiZXpwZcSNbsSbIG9kZWJyYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJLYXJ0dSBTRCBqZSBtb8W+bsOpIGJlenBlxI1uxJsgb2RlYnJhdCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IkthcnR1IFNEIGx6ZSBueW7DrSBiZXpwZcSNbsSbIHZ5am1vdXQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IkthcnR1IFNEIGx6ZSBiZXpwZcSNbsSbIG9kZWJyYXQuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJLYXJ0YSBTRCBieWxhIG9kc3RyYW7Em25hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkthcnRhIFNEIGJ5bGEgb2RzdHJhbsSbbmEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iS2FydGEgU0QgYnlsYSBvZGVicsOhbmEuIENoY2V0ZS1saSB6dsSbdMWhaXQgw7psb8W+acWhdMSbIHN2w6lobyB6YcWZw616ZW7DrSwgdmxvxb50ZSBrYXJ0dSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJLYXJ0YSBTRCBieWxhIG9kZWJyw6FuYS4gVmxvxb50ZSBub3ZvdSBrYXJ0dS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJQcsOhemRuw6Ega2FydGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJLYXJ0YSBTRCBqZSBwcsOhemRuw6EgbmVibyBvYnNhaHVqZSBuZXBvZHBvcm92YW7DvSBzeXN0w6ltIHNvdWJvcsWvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iUG/FoWtvemVuw6Ega2FydGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iS2FydGEgU0QgamUgcG/FoWtvemVuw6EuIEJ1ZGUgcHJhdmTEm3BvZG9ibsSbIG51dG7DqSBqaSBwxZllZm9ybcOhdG92YXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IkthcnRhIFNEIGJ5bGEgbmVvxI1la8OhdmFuxJsgb2RlYnLDoW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iQ2hjZXRlLWxpIHphYnLDoW5pdCB6dHLDoXTEmyBkYXQsIGthcnR1IFNEIHDFmWVkIG9kZWJyw6Fuw61tIG9kcG9qdGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iS2FydHUgU0QgamUgbW/Fvm7DqSBiZXpwZcSNbsSbIG9kZWJyYXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iS2FydHUgU0QgbHplIGJlenBlxI1uxJsgb2RlYnJhdC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iS2FydGEgU0QgYnlsYSBvZHN0cmFuxJtuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IkthcnRhIFNEIGJ5bGEgb2RlYnLDoW5hLiBWbG/FvnRlIG5vdm91IGthcnR1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iTmVieWx5IG5hbGV6ZW55IMW+w6FkbsOpIG9kcG92w61kYWrDrWPDrSBha3Rpdml0eS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4iYWt0dWFsaXpvdmF0IHN0YXRpc3Rpa3UgcG91xb5pdMOtIHNvdcSNw6FzdMOtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IlVtb8W+xYh1amUgem3Em251IHNocm9tw6HFvmTEm27DvWNoIHN0YXRpc3RpY2vDvWNoIMO6ZGFqxa8gbyBwb3XFvml0w60gc291xI3DoXN0w60uIE5lbsOtIHVyxI1lbm8gcHJvIGLEm8W+bsOpIGFwbGlrYWNlLiI8L3N0cmluZz4KQEAgLTg5NCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iU8OtxaUgVlBOIEwyVFAvSVBTZWMgcyBwxZllZHNkw61sZW7DvW0ga2zDrcSNZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iU8OtxaUgVlBOIEwyVFAvSVBTZWMgcyBjZXJ0aWZpa8OhdGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iWnZvbGl0IHNvdWJvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5lbsOtIHZ5YnLDoW4gxb7DoWRuw70gc291Ym9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzZXRvdmF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+Ik9kZXNsYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+Im9ibMOtYmVuw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJBa3Rpdm92w6FuIHJlxb5pbSBWIGF1dMSbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlZ5YmVydGUsIGNoY2V0ZS1saSB1a29uxI1pdCByZcW+aW0gTmEgY2VzdMSbLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJKZSBha3Rpdm7DrSB0ZXRoZXJpbmcgbmVibyBob3RzcG90Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iRG90eWtlbSB6YWjDoWrDrXRlIGtvbmZpZ3VyYWNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iWnDEm3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJEYWzFocOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iUMWZZXNrb8SNaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJWeXNva8OpIHZ5dcW+aXTDrSBtb2JpbG7DrWNoIGRhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iRG90eWtlbSB6b2JyYXrDrXRlIGRhbMWhw60gaW5mb3JtYWNlIG8gdnl1xb5pdMOtIG1vYmlsbsOtY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJCeWwgcMWZZWtyb8SNZW4gbGltaXQgbW9iaWxuw61jaCBkYXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4iRG90eWtlbSB6b2JyYXrDrXRlIGRhbMWhw60gaW5mb3JtYWNlIG8gdnl1xb5pdMOtIG1vYmlsbsOtY2ggZGF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiLFvcOhZG7DqSBzaG9keSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiJWeWhsZWRhdCBuYSBzdHLDoW5jZSI8L3N0cmluZz4KKyAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjgxNjcxNDcwODExMzY1Nzk0MzkiPiIxIHNob2RhIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4geiA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKaW5kZXggYTc0YjliNy4uZDdlMzYyNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+IlVkdmlrbGluZ3N2w6Zya3TDuGplciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiJGdW5rdGlvbmVyIGt1biB0aWwgcHJvZ3JhbXVkdmlrbGVyZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiJMYWdyaW5nIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJGw6UgYWRnYW5nIHRpbCBTRC1rb3J0ZXQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkbDpSBhZGdhbmcgdGlsIFNELWtvcnRldC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iRsOlIGFkZ2FuZyB0aWwgU0Qta29ydGV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+ImRlYWt0aXZlciBlbGxlciByZWRpZ2VyIHN0YXR1c2xpbmplIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIGRlYWt0aXZlcmVyIHN0YXR1c2xpbmplbiBlbGxlciB0aWxmw7hqZXIgZWxsZXIgZmplcm5lciBzeXN0ZW1pa29uZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+InN0YXR1c2Jqw6Zsa2UiPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIGZyaWfDuHIgcGxhZHMgcMOlIHRlbGVmb25lbiB2ZWQgYXQgc2xldHRlIGZpbGVyIGkgcHJvZ3JhbW1ldHMgY2FjaGVtYXBwZS4gQWRnYW5nIGVyIG5vcm1hbHQgbWVnZXQgYmVncsOmbnNldCB0aWwgc3lzdGVtcHJvY2Vzc2VyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiJGbHl0IHByb2dyYW1yZXNzb3VyY2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gZmx5dHRlciBwcm9ncmFtcmVzc291cmNlciBmcmEgaW50ZXJuZSB0aWwgZWtzdGVybmUgbWVkaWVyIG9nIG9tdmVuZHQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiJsw6ZzZSBmw7hsc29tbWUgbG9nZGF0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIGzDpnNlciBmcmEgc3lzdGVtZXRzIGZvcnNrZWxsaWdlIGxvZ2ZpbGVyLiBEZXJtZWQga2FuIGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSwgaHZhZCBkdSBsYXZlciBtZWQgdGVsZWZvbmVuLCByZWdpc3RyZXJlcywgb2dzw6UgcGVyc29ubGlnZSBlbGxlciBwcml2YXRlIG9wbHlzbmluZ2VyLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+ImzDpnMvc2tyaXYgdGlsIHJlc3NvdXJjZXIgZWpldCBhZiBkaWFnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJUaWxsYWRlciwgYXQgZXQgcHJvZ3JhbSBsw6ZzZXIgb2cgc2tyaXZlciB0aWwgYWxsZSByZXNzb3VyY2VyLCBkZXIgZWplcyBhZiBkaWFnLWdydXBwZW4sIHNvbSBmLmVrcy4gZmxpZXIgaSAvZGV2LiBEZXR0ZSBrYW4gbXVsaWd2aXMgcMOldmlya2Ugc3lzdGVtZXRzIHN0YWJpbGl0ZXQgb2cgc2lra2VyaGVkLiBEZXR0ZSBiw7hyIEtVTiBicnVnZXMgdGlsIGhhcmR3YXJlc3BlY2lmaWtrZSBkaWFnbm9zdGljZXJpbmdlciBmb3JldGFnZXQgYWYgcHJvZHVjZW50IGVsbGVyIHVkYnlkZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iYWt0aXZlciBlbGxlciBkZWFrdGl2ZXIgcHJvZ3JhbWtvbXBvbmVudGVyIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0ga29uZmlndXJlcmVyIGRlbiBsb2thbGUgQmx1ZXRvb3RoLXRlbGVmb24gc2FtdCBvcGRhZ2VyIG9nIHBhcnJlciBtZWQgZmplcm5lIGVuaGVkZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4ib3ByZXQgQmx1ZXRvb3RoLWZvcmJpbmRlbHNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIHZpc2VyIGtvbmZpZ3VyYXRpb25lbiBhZiBkZW4gbG9rYWxlIEJsdWV0b290aC10ZWxlZm9uIHNhbXQgb3ByZXR0ZXIgb2cgYWNjZXB0ZXJlciBmb3JiaW5kZWxzZSBtZWQgcGFycmVkZSBlbmhlZGVyLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJkZWFrdGl2ZXIgdGFzdGF0dXJsw6VzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIGRlYWt0aXZlcmVyIHRhc3RhdHVybMOlc2VuIG9nIGFsIGFzc29jaWVyZXQgYWRnYW5nc2tvZGVzaWtrZXJoZWQuIEV0IGxlZ2l0aW10IGVrc2VtcGVsIHDDpSBkZXR0ZSBlciwgYXQgdGVsZWZvbmVuIGRlYWt0aXZlcmVyIHRhc3RhdHVybMOlc2VuLCBuw6VyIGRlciBtb2R0YWdlcyBldCBpbmRnw6VlbmRlIHRlbGVmb25vcGthbGQsIG9nIGdlbmFrdGl2ZXJlciB0YXN0YXR1cmzDpXNlbiwgbsOlciBvcGthbGRldCBlciBhZnNsdXR0ZXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+ImzDpnMgaW5kc3RpbGxpbmdlciBmb3Igc3lua3JvbmlzZXJpbmciPC9zdHJpbmc+CkBAIC00MzUsMjIgKzQyMCwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSIxMDgyOTcyNjAzNTc2MzYwNjkwIj4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gbMOmc2VyIGFsbGUgcHJpdmF0ZSBvcmQsIG5hdm5lIG9nIHPDpnRuaW5nZXIsIHNvbSBicnVnZXJlbiBldmVudHVlbHQgaGFyIGdlbXQgaSBicnVnZXJvcmRib2dlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiJza3JpdiB0aWwgZGVuIGJydWdlcmRlZmluZXJlZGUgb3JkYm9nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIHNrcml2ZXIgbnllIG9yZCBpIGJydWdlcm9yZGJvZ2VuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4icmV0L3NsZXQgaW5kaG9sZGV0IHDDpSBTRC1rb3J0ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InJldC9zbGV0IGluZGhvbGRldCBww6UgU0Qta29ydGV0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIHNrcml2ZXIgdGlsIFNELWtvcnRldC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJUaWxsYWRlciwgYXQgZXQgcHJvZ3JhbSBza3JpdmVyIHRpbCBTRC1rb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJyZXQvc2xldCBpbmRob2xkZXQgcMOlIFNELWtvcnRldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIHNrcml2ZXIgdGlsIFNELWtvcnRldC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iZsOlIGFkZ2FuZyB0aWwgY2FjaGUtZmlsc3lzdGVtZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIGzDpnNlciBvZyBza3JpdmVyIHRpbCBjYWNoZS1maWxzeXN0ZW1ldC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiJCZWdyw6ZucyBhZGdhbmdza29kZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiJCZWdyw6ZucyBkZSBhZGdhbmdza29kZXR5cGVyLCBkdSBoYXIgdGlsbGFkZWxzZSB0aWwgYXQgYnJ1Z2UuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiJWaXMgZm9yc8O4ZyBww6UgYXQgbG9nZ2UgaW5kIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+Ik92ZXJ2w6VnIG1pc2x5a2tlZGUgZm9yc8O4ZyBww6UgYXQgbG9nZ2UgaW5kIHDDpSBlbmhlZGVuIGZvciBhdCBmb3JldGFnZSBlbiBoYW5kbGluZy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJOdWxzdGlsIGFkZ2FuZ3Nrb2RlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IlR2aW5nIGRpbiBhZGdhbmdza29kZSB0aWwgZW4gbnkgdsOmcmRpLiBEZXR0ZSBrcsOmdmVyLCBhdCBhZG1pbmlzdHJhdG9yZW4gZ2l2ZXIgZGVuIHRpbCBkaWcsIGbDuHIgZHUga2FuIGtvZ2dlIGluZC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IlR2YW5nc2zDpXMiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiJLb250cm9sIG7DpXIgZW5oZWRlbiBsw6VzZXMsIHPDpSBkdSBza2FsIGluZHRhc3RlIGFkZ2FuZ3Nrb2RlbiBpZ2VuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IkJlZ3LDpm5zIGFkZ2FuZ3Nrb2RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+IkJlZ3LDpm5zIGRlIGFkZ2FuZ3Nrb2RldHlwZXIsIGR1IGhhciB0aWxsYWRlbHNlIHRpbCBhdCBicnVnZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJWaXMgZm9yc8O4ZyBww6UgYXQgbG9nZ2UgaW5kIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+Ik92ZXJ2w6VnIG1pc2x5a2tlZGUgZm9yc8O4ZyBww6UgYXQgbG9nZ2UgaW5kIHDDpSBlbmhlZGVuIGZvciBhdCBmb3JldGFnZSBlbiBoYW5kbGluZy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjkwODQ3NzIwOTA3OTc0ODU0MjAiPiJOdWxzdGlsIGFkZ2FuZ3Nrb2RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IlR2aW5nIGRpbiBhZGdhbmdza29kZSB0aWwgZW4gbnkgdsOmcmRpLiBEZXR0ZSBrcsOmdmVyLCBhdCBhZG1pbmlzdHJhdG9yZW4gZ2l2ZXIgZGVuIHRpbCBkaWcsIGbDuHIgZHUga2FuIGtvZ2dlIGluZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+IlR2YW5nc2zDpXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJLb250cm9sIG7DpXIgZW5oZWRlbiBsw6VzZXMsIHPDpSBkdSBza2FsIGluZHRhc3RlIGFkZ2FuZ3Nrb2RlbiBpZ2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJTbGV0IGFsbGUgZGF0YSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iRm9yZXRhZyBlbiBmYWJyaWtzbnVsc3RpbGxpbmcsIGRlciBzbGV0dGVyIGFsbGUgZGluZSBkYXRhIHVkZW4gYmVrcsOmZnRlbHNlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRm9yZXRhZyBlbiBmYWJyaWtzbnVsc3RpbGxpbmcsIGRlciBzbGV0dGVyIGFsbGUgZGluZSBkYXRhIHVkZW4gYmVrcsOmZnRlbHNlLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IkFuZ2l2IGVuaGVkZW5zIGdsb2JhbGUgcHJveHksIGRlciBza2FsIGJydWdlcywgbWVucyBwb2xpdGlra2VuIGVyIGFrdGl2ZXJldC4gS3VuIGRlbiBmw7hyc3RlIGVuaGVkc2FkbWluaXN0cmF0b3IgYW5naXZlciBkZW4gZWZmZWt0aXZlIGdsb2JhbGUgcHJveHkuIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTU0NCwxNCArNTMwLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQXJiZWpkZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJBbmRyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJUaWxwYXNzZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiJUaWxwYXNzZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUhvbWUiIG1zZ2lkPSI2MDkzNTk4MTgxMDY5MzU5Mjk1Ij4iSGplbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlV29yayIgbXNnaWQ9IjY5MjA3MjU3MzA3OTcwOTkwNDciPiJBcmJlamRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVPdGhlciIgbXNnaWQ9IjQ0MDg0MzYxNjI5NTAxMTk4NDkiPiJBbmRyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVDdXN0b20gKDI0NzM1ODA1OTMxMTE1OTA5NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVIb21lICg2MDkzNTk4MTgxMDY5MzU5Mjk1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlV29yayAoNjkyMDcyNTczMDc5NzA5OTA0NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW5kdGFzdCBQSU4ta29kZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW5kdGFzdCBhZGdhbmdza29kZSBmb3IgYXQgbMOlc2Ugb3AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkluZHRhc3QgcGlua29kZSBmb3IgYXQgbMOlc2Ugb3AiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJGb3JrZXJ0IFBJTi1rb2RlISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJUcnlrIHDDpSBNZW51IG9nIGRlcm7DpnN0IHDDpSAwIGZvciBhdCBsw6VzZSBvcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO4ZG51bW1lciI8L3N0cmluZz4KQEAgLTU2NCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJUaWxiYWdlIHRpbCBvcGthbGQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJSaWd0aWd0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJCZWtsYWdlciEgUHLDuHYgaWdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iQmVrbGFnZXIhIFByw7h2IGlnZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJPcGxhZGVyICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJPcGxhZHQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTc4LDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta29ydGV0IGVyIGzDpXN0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkzDpXNlciBTSU0ta29ydGV0IG9wIC4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkR1IGhhciB0ZWduZXQgZGl0IG9wbMOlc25pbmdzbcO4bnN0ZXIgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gIlxuXG4iUHLDuHYgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJEdSBoYXIgaW5kdGFzdGV0IGRpbiBhZGdhbmdza29kZSBmb3JrZXJ0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlLiAiXG5cbiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJEdSBoYXIgaW5kdGFzdGV0IGRpbiBwaW5rb2RlIGZvcmtlcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2UuICJcblxuIlByw7h2IGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJEdSBoYXIgdGVnbmV0IGRpdCBvcGzDpXNuaW5nc23DuG5zdGVyIGZvcmtlcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2UuIEVmdGVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGZvcnPDuGcgbWVyZSB2aWwgZHUgYmxpdmUgYmVkdCBvbSBhdCBsw6VzZSBkaW4gdGVsZWZvbiBvcCB2ZWQgaGrDpmxwIGFmIGRpdCBHb29nbGUtbG9naW4iXG5cbiIgUHLDuHYgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iUHLDuHYgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJIYXIgZHUgZ2xlbXQgbcO4bnN0cmV0PyI8L3N0cmluZz4KQEAgLTYwNiwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiJOYXZpZ2VyIHbDpmsgZnJhIGRlbm5lIHNpZGU/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIiBWw6ZsZyBPSyBmb3IgYXQgZm9ydHPDpnR0ZSBlbGxlciBBbm51bGxlciBmb3IgYXQgYmxpdmUgcMOlIGRlbiBha3R1ZWxsZSBzaWRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4iQmVrcsOmZnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IlRpcDogRG9iYmVsdGtsaWsgZm9yIGF0IHpvb21lIGluZCBlbGxlciB1ZC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiJsw6ZzIGJyb3dzZXJlbnMgb3ZlcnNpZ3Qgb2cgYm9nbcOmcmtlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IlRpbGxhZGVyLCBhdCBwcm9ncmFtbWV0IGzDpnNlciBhbGxlIGRlIHdlYmFkcmVzc2VyLCBicm93c2VyZW4gaGFyIGJlc8O4Z3QsIG9nIGFsbGUgYnJvd3NlcmVucyBib2dtw6Zya2VyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+InNrcml2IGJyb3dzZXJlbnMgb3ZlcnNpZ3Qgb2cgYm9nbcOmcmtlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIMOmbmRyZXIgYnJvd3Nlcm92ZXJzaWd0ZW4gZWxsZXIgYm9nbcOmcmtlciwgZGVyIGVyIGdlbXQgcMOlIGRpbiB0ZWxlZm9uLiBPbmRzaW5kZWRlIHByb2dyYW1tZXIga2FuIGJydWdlIGRldHRlIHRpbCBhdCBzbGV0dGUgZWxsZXIgw6ZuZHJlIGRpbiBicm93c2VycyBkYXRhLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4iU2tpZnQgYnJvd3NlcnRpbGxhZGVsc2VyIGZvciBnZW9ncmFmaXNrIHBsYWNlcmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiJHaXZlciBldCBwcm9ncmFtIHRpbGxhZGVsc2UgdGlsIGF0IMOmbmRyZSBicm93c2VyZW5zIHRpbGxhZGVsc2VyIGZvciBnZW9ncmFmaXNrIHBsYWNlcmluZy4gU2thZGVsaWdlIHByb2dyYW1tZXIga2FuIGJydWdlIGRldHRlIHRpbCBhdCB0aWxsYWRlLCBhdCBwbGFjZXJpbmdzb3BseXNuaW5nZXIgc2VuZGVzIHRpbCB2aWxrw6VybGlnZSB3ZWJzdGVkZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iw5huc2tlciBkdSwgYXQgYnJvd3NlcmVuIHNrYWwgaHVza2UgZGVubmUgYWRnYW5nc2tvZGU/Ijwvc3RyaW5nPgpAQCAtNzI2LDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJWw6ZsZyBhbGxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJWw6ZsZyBvcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2xpcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iSW5kc8OmdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyIHdlYmFkcmVzc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJNYXJrZXIgdGVrc3QuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iVGVrc3RtYXJrZXJpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJJbnB1dG1ldG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJGw7hqIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIHRpbCBvcmRib2ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJSZWRpZ2VyIHRla3N0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iVGVrc3RoYW5kbGluZ2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJEZXIgZXIgaWtrZSBzw6UgbWVnZXQgcGxhZHMgdGlsYmFnZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkRlciBlciBuw6ZzdGVuIGlra2UgbWVyZSBwbGFkcyBww6UgdGVsZWZvbmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQxLDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBbm51bGxlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJCZW3DpnJrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJJbmRsw6ZzZXIuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlRJTCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkZSQSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iRnVsZGbDuHIgaGFuZGxpbmcgdmVkIGhqw6ZscCBhZiI8L3N0cmluZz4KQEAgLTc1OSw5ICs3NTAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IlR2aW5nIHRpbCBhdCBsdWtrZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJSYXBwb3J0ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IlZlbnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJQcm9ncmFtbWV0IGVyIG9tZGlyaWdlcmV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGvDuHJlciBudS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gYmxldiBvcHJpbmRlbGlndCDDpWJuZXQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IlByb2dyYW1tZXQgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGFyIG92ZXJ0csOlZHQgc2luIGVnZW4gU3RyaWN0TW9kZS1wb2xpdGlrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2Nlc3NlbiA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGFyIG92ZXJ0csOlZHQgc2luIGVnZW4gU3RyaWN0TW9kZS1wb2xpdGlrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gZXIgaSBnYW5nIjwvc3RyaW5nPgpAQCAtODA4LDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+IlZpcyBhbGxlIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQi1tYXNzZWxhZ3JpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJVU0IgZXIgdGlsc2x1dHRldCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IkR1IGhhciBmb3JidW5kZXQgZGluIHRlbGVmb24gdGlsIGRpbiBjb21wdXRlciB2aWEgVVNCLiBWw6ZsZyBrbmFwcGVuIG5lZGVuZm9yLCBodmlzIGR1IMO4bnNrZXIgYXQga29waWVyZSBmaWxlciBtZWxsZW0gZGluIGNvbXB1dGVyIG9nIGRpbiBBbmRyb2lkcyBTRC1rb3J0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iRHUgaGFyIGZvcmJ1bmRldCBkaW4gdGVsZWZvbiB0aWwgZGluIGNvbXB1dGVyIHZpYSBVU0IuIFbDpmxnIGtuYXBwZW4gbmVkZW5mb3IsIGh2aXMgZHUgw7huc2tlciBhdCBrb3BpZXJlIGZpbGVyIG1lbGxlbSBkaW4gY29tcHV0ZXIgb2cgZGluIEFuZHJvaWRzIFNELWtvcnQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJEdSBoYXIgZm9yYnVuZGV0IGRpbiB0ZWxlZm9uIHRpbCBkaW4gY29tcHV0ZXIgdmlhIFVTQi4gVsOmbGcga25hcHBlbiBuZWRlbmZvciwgaHZpcyBkdSDDuG5za2VyIGF0IGtvcGllcmUgZmlsZXIgbWVsbGVtIGRpbiBjb21wdXRlciBvZyBkaW4gQW5kcm9pZHMgU0Qta29ydC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iU2zDpSBVU0ItbGFncmluZ2VuIHRpbCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IkRlciBvcHN0b2QgZXQgcHJvYmxlbSBtZWQgYXQgYnJ1Z2UgZGl0IFNELWtvcnQgdGlsIFVTQi1sYWdyaW5nLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iRGVyIG9wc3RvZCBldCBwcm9ibGVtIG1lZCBhdCBicnVnZSBkaXQgU0Qta29ydCB0aWwgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJEZXIgb3BzdG9kIGV0IHByb2JsZW0gbWVkIGF0IGJydWdlIGRpdCBTRC1rb3J0IHRpbCBVU0ItbGFncmluZy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iVVNCIGVyIHRpbHNsdXR0ZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJWw6ZsZyBmb3IgYXQga29waWVyZSBmaWxlciB0aWwvZnJhIGRpbiBjb21wdXRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJTbMOlIFVTQi1sYWdyaW5nZW4gZnJhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJWw6ZsZyBmb3IgYXQgc2zDpSBVU0ItbGFncmluZyBmcmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlVTQi1sYWdlciBpIGJydWciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IlPDuHJnIGZvciwgYXQgZHUgaGFyIGRlbW9udGVyZXQgKFwidWRza3ViYmV0XCIpIGRpbiBBbmRyb2lkcyBTRC1rb3J0IGZyYSBjb21wdXRlcmVuLCBmw7hyIGR1IHNsw6VyIFVTQi1sYWdyaW5nIGZyYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iU8O4cmcgZm9yLCBhdCBkdSBoYXIgZGVtb250ZXJldCAoXCJ1ZHNrdWJiZXRcIikgZGluIEFuZHJvaWRzIFNELWtvcnQgZnJhIGNvbXB1dGVyZW4sIGbDuHIgZHUgc2zDpXIgVVNCLWxhZ3JpbmcgZnJhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJTw7hyZyBmb3IsIGF0IGR1IGhhciBkZW1vbnRlcmV0IChcInVkc2t1YmJldFwiKSBkaW4gQW5kcm9pZHMgU0Qta29ydCBmcmEgY29tcHV0ZXJlbiwgZsO4ciBkdSBzbMOlciBVU0ItbGFncmluZyBmcmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iU2zDpSBVU0ItbGFncmluZyBmcmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJEZXIgb3BzdG9kIGV0IHByb2JsZW0gbWVkIGF0IHNsw6UgVVNCLWxhZ3JpbmdlbiBmcmEuIFPDuHJnIGZvciwgYXQgZHUgaGFyIGRlbW9udGVyZXQgVVNCLXbDpnJ0ZW4sIG9nIHByw7h2IHPDpSBpZ2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+IlNsw6UgVVNCLWxhZ3JpbmcgdGlsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iSHZpcyBkdSBzbMOlciBVU0ItbGFncmluZyB0aWwsIHZpbCBub2dsZSBhZiBkZSBwcm9ncmFtbWVyLCBzb20gZHUgYnJ1Z2VyLCBzdG9wcGUsIG9nIGRlIGthbiB2w6ZyZSB1dGlsZ8OmbmdlbGlnZSwgaW5kdGlsIGR1IHNsw6VyIFVTQi1sYWdyaW5nIHRpbCBpZ2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiJVU0ItaGFuZGxpbmdlbiBtaXNseWtrZWRlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0ZXIgU0Qta29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRlciBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IkVyIGR1IHNpa2tlciBww6UsIGR1IMO4bnNrZXIgYXQgZm9ybWF0ZXJlIFNELWtvcnRldD8gQWxsZSBkYXRhIHDDpSBrb3J0ZXQgbWlzdGVzLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IkVyIGR1IHNpa2tlciBww6UsIGR1IMO4bnNrZXIgYXQgZm9ybWF0ZXJlIFNELWtvcnRldD8gQWxsZSBkYXRhIHDDpSBrb3J0ZXQgbWlzdGVzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRlciBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iRXIgZHUgc2lra2VyIHDDpSwgZHUgw7huc2tlciBhdCBmb3JtYXRlcmUgU0Qta29ydGV0PyBBbGxlIGRhdGEgcMOlIGtvcnRldCBtaXN0ZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJVU0ItZmVqbHJldG5pbmcgZXIgdGlsc2x1dHRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iVsOmbGcgZm9yIGF0IGRlYWt0aXZlcmUgVVNCLWZlamxyZXRuaW5nLiI8L3N0cmluZz4KQEAgLTgzNywyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+ImthbmRpZGF0ZXIiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iRm9yYmVyZWRlciBTRC1rb3J0ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IkZvcmJlcmVkZXIgU0Qta29ydGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJGb3JiZXJlZGVyIFNELWtvcnRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJLb250cm9sbGVyZXIgZm9yIGZlamwuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IlRvbXQgU0Qta29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlRvbXQgU0Qta29ydCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJTRC1rb3J0ZXQgZXIgdG9tdCBlbGxlciBicnVnZXIgZXQgaWtrZSB1bmRlcnN0w7h0dGV0IGZpbHN5c3RlbS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTRC1rb3J0ZXQgZXIgdG9tdCBlbGxlciBoYXIgZXQgaWtrZSB1bmRlcnN0w7h0dGV0IGZpbHN5c3RlbS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJCZXNrYWRpZ2V0IFNELWtvcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IkJlc2thZGlnZXQgU0Qta29ydCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4iU0Qta29ydGV0IGVyIGJlc2thZGlnZXQuIER1IHNrYWwgbXVsaWd2aXMgb21mb3JtYXRlcmUgZGl0IGtvcnQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNELWtvcnRldCBlciBiZXNrYWRpZ2V0LiBEdSBibGl2ZXIgbXVsaWd2aXMgbsO4ZHQgdGlsIGF0IGZvcm1hdGVyZSBkZXQgaWdlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IlNELWtvcnRldCBibGV2IGZqZXJuZXQgdXZlbnRldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRC1rb3J0ZXQgYmxldiBmamVybmV0IHV2ZW50ZXQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4iRGVtb250ZXIgU0Qta29ydGV0IGluZGVuIGZqZXJuZWxzZSBmb3IgYXQgdW5kZ8OlIHRhYiBhZiBkYXRhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkRlbW9udGVyIFNELWtvcnRldCBpbmRlbiBmamVybmVsc2UgZm9yIGF0IHVuZGfDpSB0YWIgYWYgZGF0YS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+IlNELWtvcnRldCBrYW4gZmplcm5lcyBzaWtrZXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU0Qta29ydGV0IGthbiBmamVybmVzIHNpa2tlcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3NjEzOTYwNjg2NzQ3NTkyNzcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc1MDM3NjkxMDYyODUxODg3MDMiPiJTRC1rb3J0ZXQga2FuIG51IGZqZXJuZXMgc2lra2VydC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iRHUga2FuIG51IGZqZXJuZSBTRC1rb3J0ZXQuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJTRC1rb3J0ZXQgZXIgZmplcm5ldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJTRC1rb3J0ZXQgZXIgZmplcm5ldCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJTRCBlciBmamVybmV0LiBJbmRzw6Z0IGV0IG55dCBTRC1rb3J0IGZvciBhdCDDuGdlIGRpbiBlbmhlZHMgbGFnZXJwbGFkcy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRC1rb3J0ZXQgZXIgZmplcm5ldC4gSW5kc8OmdCBldCBueXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iVG9tdCBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qta29ydGV0IGVyIHRvbXQgZWxsZXIgaGFyIGV0IGlra2UgdW5kZXJzdMO4dHRldCBmaWxzeXN0ZW0uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJCZXNrYWRpZ2V0IFNELWtvcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qta29ydGV0IGVyIGJlc2thZGlnZXQuIER1IGJsaXZlciBtdWxpZ3ZpcyBuw7hkdCB0aWwgYXQgZm9ybWF0ZXJlIGRldCBpZ2VuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRC1rb3J0ZXQgYmxldiBmamVybmV0IHV2ZW50ZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEZW1vbnRlciBTRC1rb3J0ZXQgaW5kZW4gZmplcm5lbHNlIGZvciBhdCB1bmRnw6UgdGFiIGFmIGRhdGEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU0Qta29ydGV0IGthbiBmamVybmVzIHNpa2tlcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iRHUga2FuIG51IGZqZXJuZSBTRC1rb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNELWtvcnRldCBlciBmamVybmV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qta29ydGV0IGVyIGZqZXJuZXQuIEluZHPDpnQgZXQgbnl0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iRGVyIGJsZXYgaWtrZSBmdW5kZXQgbm9nZW4gbWF0Y2hlbmRlIGFrdGl2aXRldGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+Im9wZGF0ZXIgYnJ1Z2Vyc3RhdGlzdGlra2VyIGZvciBrb21wb25lbnRlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiJUaWxsYWRlciDDpm5kcmluZyBhZiBpbmRzYW1sZWRlIGJydWdlcnN0YXRpc3Rpa2tlciBmb3Iga29tcG9uZW50ZXIuIElra2UgdGlsIGJydWcgdGlsIG5vcm1hbGUgcHJvZ3JhbW1lci4iPC9zdHJpbmc+CkBAIC04OTQsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOIGJhc2VyZXQgcMOlIGZvcmjDpW5kc2RlbHQgbsO4Z2xla29kbmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpa2F0YmFzZXJldCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlbDpmxnIGZpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkluZ2VuIGZpbCBlciB2YWxndCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Ik51bHN0aWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iU2VuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbHRpbHN0YW5kIGVyIGFrdGl2ZXJldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWw6ZsZyBmb3IgYXQgYWZzbHV0dGUgYmlsdGlsc3RhbmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRldGhlcmluZyBlbGxlciBob3RzcG90IGVyIGFrdGl2dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRyeWsgZm9yIGF0IGtvbmZpZ3VyZXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iVGlsYmFnZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+Ik7DpnN0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IlNwcmluZyBvdmVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iSMO4anQgbW9iaWxkYXRhZm9yYnJ1ZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVHJ5ayBmb3Igb3BseXNuaW5nZXIgb20gYnJ1ZyBhZiBtb2JpbGRhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ikdyw6Zuc2VuIGZvciBtb2JpbGRhdGEgZXIgb3ZlcnNrcmVkZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4iVHJ5ayBmb3Igb3BseXNuaW5nZXIgb20gYnJ1ZyBhZiBtb2JpbGRhdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+IkRlciBlciBpbmdlbiBtYXRjaGVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IkZpbmQgcMOlIHNpZGVuIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgbWF0Y2giPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiBhZiA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKaW5kZXggMmY0MDEzZi4uYmJlOGRlOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCkBAIC0xNjksMTIgKzE2OSwxMSBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iRW50d2lja2xlci1Ub29scyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiJGdW5rdGlvbmVuIG51ciBmw7xyIEFud2VuZHVuZ3NlbnR3aWNrbGVyIHZvcmdlc2VoZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iU3BlaWNoZXIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IkdyZWlmdCBhdWYgZGllIFNELUthcnRlIHp1LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJHcmVpZnQgYXVmIGRpZSBTRC1LYXJ0ZSB6dS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iR3JlaWZ0IGF1ZiBkaWUgU0QtS2FydGUgenUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4iU3RhdHVzbGVpc3RlIGRlYWt0aXZpZXJlbiBvZGVyIMOkbmRlcm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZywgZGllIFN0YXR1c2FuemVpZ2UgenUgZGVha3RpdmllcmVuIG9kZXIgU3lzdGVtc3ltYm9sZSBoaW56dXp1ZsO8Z2VuIG9kZXIgenUgZW50ZmVybmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiJTdGF0dXNsZWlzdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNDA5NzYwNTg2NzY0MzUyMDkyMCI+IkVybcO2Z2xpY2h0IGRlciBBbndlbmR1bmcsIHp1ciBTdGF0dXNsZWlzdGUgenUgd2VyZGVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI0MDk3NjA1ODY3NjQzNTIwOTIwIj4iRGllIEFud2VuZHVuZyB3aXJkIGRhbWl0IGluIGRlciBTdGF0dXNsZWlzdGUgYW5nZXplaWd0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZXhwYW5kU3RhdHVzQmFyIiBtc2dpZD0iMTE0ODE5ODc4NTkzNzQ4OTI2NCI+IlN0YXR1c2xlaXN0ZSBlaW4tL2F1c2JsZW5kZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19leHBhbmRTdGF0dXNCYXIiIG1zZ2lkPSI3MDg4NjA0NDAwMTEwNzY4NjY1Ij4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZywgZGllIFN0YXR1c2xlaXN0ZSBlaW4tIG9kZXIgYXVzenVibGVuZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcHJvY2Vzc091dGdvaW5nQ2FsbHMiIG1zZ2lkPSIxMTM2MjYyNTUwODc4MzM1OTgwIj4iQWJnZWhlbmRlIEFucnVmZSBhYmZhbmdlbiI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4iRXJtw7ZnbGljaHQgZWluZXIgQW53ZW5kdW5nLCBUZWxlZm9uc3BlaWNoZXIgZHVyY2ggZGFzIEzDtnNjaGVuIHZvbiBEYXRlaWVuIGltIENhY2hlLVZlcnplaWNobmlzIGRlciBBbndlbmR1bmcgZnJlaXp1Z2ViZW4uIERlciBadWdyaWZmIGJlc2NocsOkbmt0IHNpY2ggaW4gZGVyIFJlZ2VsIGF1ZiBTeXN0ZW1wcm96ZXNzZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iQW53ZW5kdW5nc3Jlc3NvdXJjZW4gdmVyc2NoaWViZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3ZlUGFja2FnZSIgbXNnaWQ9IjYzMjMwNDkyOTE5MjM5MjUyNzciPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIEFud2VuZHVuZ3NyZXNzb3VyY2VuIHZvbiBpbnRlcm5lIGF1ZiBleHRlcm5lIE1lZGllbiB6dSB2ZXJzY2hpZWJlbiB1bmQgdW1nZWtlaHJ0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4iTGVzZW4gdmVydHJhdWxpY2hlciBQcm90b2tvbGxkYXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgZGllIHZlcnNjaGllZGVuZW4gUHJvdG9rb2xsZGF0ZWllbiBkZXMgU3lzdGVtcyB6dSBsZXNlbi4gU28ga8O2bm5lbiBhbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGVuIGF1ZiBJaHJlbSBUZWxlZm9uIGR1cmNoZ2Vmw7xocnRlbiBBa3Rpb25lbiBlaW5nZXNlaGVuIHdlcmRlbi4gRGllc2Uga8O2bm5lbiBwZXJzw7ZubGljaGUgb2RlciBnZWhlaW1lIERhdGVuIGVudGhhbHRlbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJMZXNlLS9TY2hyZWliYmVyZWNodGlndW5nIGbDvHIgenUgRGlhZ25vc2VncnVwcGUgZ2Vow7ZyaWdlIEVsZW1lbnRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIGFsbGUgRWxlbWVudGUgaW4gZGVyIERpYWdub3NlZ3J1cHBlIHp1IGxlc2VuIHVuZCB6dSBiZWFyYmVpdGVuLCBldHdhIERhdGVpZW4gaW4gXCIvZGV2XCIuIERpZXMga8O2bm50ZSBlaW5lIHBvdGVuemllbGxlIEdlZsOkaHJkdW5nIGbDvHIgZGllIFN0YWJpbGl0w6R0IHVuZCBTaWNoZXJoZWl0IGRlcyBTeXN0ZW1zIGRhcnN0ZWxsZW4gdW5kIHNvbGx0ZSBOVVIgZsO8ciBIYXJkd2FyZS1zcGV6aWZpc2NoZSBEaWFnbm9zZW4gZGVzIEhlcnN0ZWxsZXJzIG9kZXIgTmV0emJldHJlaWJlcnMgdmVyd2VuZGV0IHdlcmRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJBbndlbmR1bmdza29tcG9uZW50ZW4gYWt0aXZpZXJlbiBvZGVyIGRlYWt0aXZpZXJlbiI8L3N0cmluZz4KQEAgLTMxOCw5ICszMTksOSBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWJvb3QiIG1zZ2lkPSIyODk4NTYwODcyNDYyNjM4MjQyIj4iTmV1c3RhcnQgZGVzIFRlbGVmb25zIGVyendpbmdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYm9vdCIgbXNnaWQ9Ijc5MTQ5MzMyOTI4MTU0OTE3ODIiPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBlaW5lbiBOZXVzdGFydCBkZXMgVGVsZWZvbnMgenUgZXJ6d2luZ2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW91bnRfdW5tb3VudF9maWxlc3lzdGVtcyIgbXNnaWQ9IjE3NjEwMjMyNzIxNzA5NTY1NDEiPiJEYXRlaXN5c3RlbWUgYmVyZWl0c3RlbGxlbiBvZGVyIEJlcmVpdHN0ZWxsdW5nIGF1ZmhlYmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW91bnRfdW5tb3VudF9maWxlc3lzdGVtcyIgbXNnaWQ9IjYyNTMyNjM3OTI1MzU4NTk3NjciPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBEYXRlaXN5c3RlbWUgZsO8ciBhdXN0YXVzY2hiYXJlIERhdGVudHLDpGdlciBiZXJlaXR6dXN0ZWxsZW4gb2RlciBkaWUgQmVyZWl0c3RlbGx1bmcgYXVmenVoZWJlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3VudF91bm1vdW50X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iNjI1MzI2Mzc5MjUzNTg1OTc2NyI+IkVybcO2Z2xpY2h0IGRlciBBbndlbmR1bmcsIERhdGVpc3lzdGVtZSBmw7xyIGF1c3RhdXNjaGJhcmUgU3BlaWNoZXJwbMOkdHplIGJlcmVpdHp1c3RlbGxlbiBvZGVyIGRpZSBCZXJlaXRzdGVsbHVuZyBhdWZ6dWhlYmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW91bnRfZm9ybWF0X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iNTUyMzI4NTE0MzU3NjcxODk4MSI+IkV4dGVybmVuIFNwZWljaGVyIGZvcm1hdGllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW91bnRfZm9ybWF0X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iNTc0MDYwMDQ0OTA2MDQ3Mzg2Ij4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZywgYXVzdGF1c2NoYmFyZSBEYXRlbnRyw6RnZXIgenUgZm9ybWF0aWVyZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW91bnRfZm9ybWF0X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iNTc0MDYwMDQ0OTA2MDQ3Mzg2Ij4iRXJsYXVidCBkZXIgQW53ZW5kdW5nLCBhdXN0YXVzY2hiYXJlbiBTcGVpY2hlciB6dSBmb3JtYXRpZXJlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FzZWNfYWNjZXNzIiBtc2dpZD0iMTA3MDM2NDA3OTI0OTgzNDY2NiI+IkluZm9ybWF0aW9uZW4genVtIHNpY2hlcmVuIFNwZWljaGVyIGFicnVmZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hc2VjX2FjY2VzcyIgbXNnaWQ9Ijc2OTE2MTYyOTIxNzA1OTAyNDQiPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBJbmZvcm1hdGlvbmVuIHp1bSBzaWNoZXJlbiBTcGVpY2hlciBhYnp1cnVmZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hc2VjX2NyZWF0ZSIgbXNnaWQ9IjczMTIwNzgwMzIzMjY5Mjg4OTkiPiJTaWNoZXJlbiBTcGVpY2hlciBlcnN0ZWxsZW4iPC9zdHJpbmc+CkBAIC0zMzYsNyArMzM3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZmxhc2hsaWdodCIgbXNnaWQ9IjIxNTU5MjA4MTAxMjE5ODQyMTUiPiJMaWNodGFuemVpZ2Ugc3RldWVybiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2ZsYXNobGlnaHQiIG1zZ2lkPSI2NDMzMDQ1OTQyMjgzODAyMzA5Ij4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZywgZGllIExpY2h0YW56ZWlnZSB6dSBzdGV1ZXJuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYWNjZXNzVXNiIiBtc2dpZD0iNzM2MjMyNzgxODY1NTc2MDQ5NiI+ImF1ZiBVU0ItR2Vyw6R0ZSB6dWdyZWlmZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NVc2IiIG1zZ2lkPSIyNDE0MjcxNzYyOTE0MDQ5MjkyIj4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZyBkZW4gWnVncmlmZiBhdWYgVVNCLUdlcsOkdGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYWNjZXNzVXNiIiBtc2dpZD0iMjQxNDI3MTc2MjkxNDA0OTI5MiI+IkRpZSBBbndlbmR1bmcgZXJow6RsdCBadWdyaWZmIGF1ZiBVU0ItR2Vyw6R0ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2hhcmR3YXJlX3Rlc3QiIG1zZ2lkPSI0MTQ4MjkwODYwNDAwNjU5MTQ2Ij4iSGFyZHdhcmUgdGVzdGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfaGFyZHdhcmVfdGVzdCIgbXNnaWQ9IjM2Njg4OTQ2ODY1MDAwODE2OTkiPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIHZlcnNjaGllZGVuZSBQZXJpcGhlcmllLUdlcsOkdGUgenUgSGFyZHdhcmUtVGVzdHp3ZWNrZW4genUgc3RldWVybi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhbGxQaG9uZSIgbXNnaWQ9IjM5MjU4MzYzNDc2ODE4NDc5NTQiPiJUZWxlZm9ubnVtbWVybiBkaXJla3QgYW5ydWZlbiI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgZGFzIGxva2FsZSBCbHVldG9vdGgtVGVsZWZvbiB6dSBrb25maWd1cmllcmVuLCBSZW1vdGUtR2Vyw6R0ZSB6dSBlcmtlbm5lbiB1bmQgZWluZSBWZXJiaW5kdW5nIHp1IGRpZXNlbiBoZXJ6dXN0ZWxsZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iQmx1ZXRvb3RoLVZlcmJpbmR1bmdlbiBoZXJzdGVsbGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iRXJtw7ZnbGljaHQgZWluZXIgQW53ZW5kdW5nLCBkaWUgS29uZmlndXJhdGlvbiBkZXMgbG9rYWxlbiBCbHVldG9vdGgtVGVsZWZvbnMgZWluenVzZWhlbiB1bmQgVmVyYmluZHVuZ2VuIG1pdCBQYXJ0bmVyZ2Vyw6R0ZW4gaGVyenVzdGVsbGVuIHVuZCB6dSBha3plcHRpZXJlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iVGFzdGVuc3BlcnJlIGRlYWt0aXZpZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIGRpZSBUYXN0ZW5zcGVycmUgc293aWUgZGVuIGRhbWl0IHZlcmJ1bmRlbmVuIFBhc3N3b3J0c2NodXR6IHp1IGRlYWt0aXZpZXJlbi4gU28gd2lyZCBkaWUgVGFzdGVuc3BlcnJlIHZvbSBUZWxlZm9uIGRlYWt0aXZpZXJ0LCB3ZW5uIGVpbiBBbnJ1ZiBlaW5nZWh0LCB1bmQgbmFjaCBCZWVuZGlndW5nIGRlcyBBbnJ1ZnMgd2llZGVyIGFrdGl2aWVydC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4iU3luY2hyb25pc2llcnVuZ3NlaW5zdGVsbHVuZ2VuIGxlc2VuIjwvc3RyaW5nPgpAQCAtNDM0LDIzICs0MTksMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI0MzI1MzU3MTY4MDQ3NDg3ODEiPiJudXR6ZXJkZWZpbmllcnRlcyBXw7ZydGVyYnVjaCBsZXNlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IkVybGF1YnQgZWluZXIgQW53ZW5kdW5nLCBhbGxlIHByaXZhdGVuIFfDtnJ0ZXIsIE5hbWVuIHVuZCBBdXNkcsO8Y2tlIHp1IGxlc2VuLCBkaWUgZWluIE51dHplciBpbiBzZWluZW0gV8O2cnRlcmJ1Y2ggZ2VzcGVpY2hlcnQgaGF0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+ImluIG51dHplcmRlZmluaWVydGVzIFfDtnJ0ZXJidWNoIHNjaHJlaWJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIG5ldWUgV8O2cnRlciBpbiBkYXMgV8O2cnRlcmJ1Y2ggZGVzIE51dHplcnMgenUgc2NocmVpYmVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4iU0QtS2FydGVuLUluaGFsdCDDpG5kZXJuL2zDtnNjaGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJTRC1LYXJ0ZW4tSW5oYWx0IMOkbmRlcm4vbMO2c2NoZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iRXJtw7ZnbGljaHQgZWluZXIgQW53ZW5kdW5nLCBhdWYgZGllIFNELUthcnRlIHp1IHNjaHJlaWJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgYXVmIGRpZSBTRC1LYXJ0ZSB6dSBzY2hyZWliZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4iRXJsYXVidCBlaW5lciBBbndlbmR1bmcsIG5ldWUgV8O2cnRlciBpbiBkYXMgV8O2cnRlcmJ1Y2ggZGVzIE51dHplcnMgenUgc2NocmVpYmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iU0QtS2FydGVuLUluaGFsdCDDpG5kZXJuL2zDtnNjaGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iRXJtw7ZnbGljaHQgZWluZXIgQW53ZW5kdW5nLCBhdWYgZGllIFNELUthcnRlIHp1IHNjaHJlaWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiJadWdyaWZmIGF1ZiBkYXMgQ2FjaGUtRGF0ZWlzeXN0ZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+Ikdld8OkaHJ0IGVpbmVyIEFud2VuZHVuZyBMZXNlLSB1bmQgU2NocmVpYnp1Z3JpZmYgYXVmIGRhcyBDYWNoZS1EYXRlaXN5c3RlbS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiJQYXNzd29ydCBiZXNjaHLDpG5rZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxNzE5ODc3MjQ1NjkyMzE4Mjk5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI5MDgzNDAwMDgwODYxNzI4MDU2Ij4iQmVzY2hyw6Rua2VuIGRlciBlcmxhdWJ0ZW4gUGFzc3dvcnR0eXBlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iQW5tZWxkZXZlcnN1Y2hlIMO8YmVyd2FjaGVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+IkZlaGxnZXNjaGxhZ2VuZSBWZXJzdWNoZcK3enVtIEFubWVsZGVuL0R1cmNoZsO8aHJlbiBlaW5lciBBa3Rpb24gw7xiZXJ3YWNoZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJQYXNzd29ydCB6dXLDvGNrc2V0emVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IkZlc3RsZWdlbiBlaW5lcyBuZXVlbiBXZXJ0cyBmw7xyIElociBQYXNzd29ydCwgc29kYXNzIGRlciBBZG1pbmlzdHJhdG9yIGVzIElobmVuIHZvciBkZW0gQW5tZWxkZW4gw7xiZXJtaXR0ZWxuIG11c3MuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJTcGVycmVuIGVyendpbmdlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IlN0ZXVlcnVuZyBkZXIgR2Vyw6R0ZXNwZXJyZTsgZXJmb3JkZXJ0IGRpZSBlcm5ldXRlIFBhc3N3b3J0ZWluZ2FiZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IlBhc3N3b3J0IGJlc2NocsOkbmtlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiJCZXNjaHLDpG5rZW4gZGVyIGVybGF1YnRlbiBQYXNzd29ydHR5cGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4iQW5tZWxkZXZlcnN1Y2hlIMO8YmVyd2FjaGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+IkZlaGxnZXNjaGxhZ2VuZSBWZXJzdWNoZcK3enVtIEFubWVsZGVuL0R1cmNoZsO8aHJlbiBlaW5lciBBa3Rpb24gw7xiZXJ3YWNoZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjkwODQ3NzIwOTA3OTc0ODU0MjAiPiJQYXNzd29ydCB6dXLDvGNrc2V0emVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IkZlc3RsZWdlbiBlaW5lcyBuZXVlbiBXZXJ0cyBmw7xyIElociBQYXNzd29ydCwgc29kYXNzIGRlciBBZG1pbmlzdHJhdG9yIGVzIElobmVuIHZvciBkZW0gQW5tZWxkZW4gw7xiZXJtaXR0ZWxuIG11c3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiJTcGVycmVuIGVyendpbmdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IlN0ZXVlcnVuZyBkZXIgR2Vyw6R0ZXNwZXJyZTsgZXJmb3JkZXJ0IGRpZSBlcm5ldXRlIFBhc3N3b3J0ZWluZ2FiZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBbGxlIERhdGVuIGzDtnNjaGVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiJadXLDvGNrc2V0emVuIGF1ZiBkaWUgV2Vya3NlaW5zdGVsbHVuZ2VuLiBEYWJlaSB3ZXJkZW4gYWxsZSBJaHJlIERhdGVuIG9obmUgTmFjaGZyYWdlIGdlbMO2c2NodC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+Ilp1csO8Y2tzZXR6ZW4gYXVmIGRpZSBXZXJrc2VpbnN0ZWxsdW5nZW4uIERhYmVpIHdlcmRlbiBhbGxlIElocmUgRGF0ZW4gb2huZSBOYWNoZnJhZ2UgZ2Vsw7ZzY2h0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IkRlbiBnbG9iYWxlbiBQcm94eSBkZXMgR2Vyw6R0cyB6dXIgVmVyd2VuZHVuZyB3w6RocmVuZCBkZXIgQWt0aXZpZXJ1bmcgZGVyIFJpY2h0bGluaWUgZmVzdGxlZ2VuLiBOdXIgZGVyIGVyc3RlIEdlcsOkdGVhZG1pbmlzdHJhdG9yIGthbm4gZGVuIGfDvGx0aWdlbiBnbG9iYWxlbiBQcm94eSBmZXN0bGVnZW4uIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUHJpdmF0IjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNDg3LDcgKzQ3Myw3IEBACiAgIDxzdHJpbmctYXJyYXkgbmFtZT0iaW1Qcm90b2NvbHMiPgogICAgIDxpdGVtIG1zZ2lkPSI4NTk1MjYxMzYzNTE4NDU5NTY1Ij4iQUlNIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iNzM5MDQ3MzYyODI3NTQ5MDcwMCI+IldpbmRvd3MgTGl2ZSI8L2l0ZW0+Ci0gICAgPGl0ZW0gbXNnaWQ9Ijc4ODI4NzcxMzQ5MzE0NTgyMTciPiJZYWhvbyEiPC9pdGVtPgorICAgIDxpdGVtIG1zZ2lkPSI3ODgyODc3MTM0OTMxNDU4MjE3Ij4iWWFob28iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI1MDM1Mzc2MzEzMjAwNTg1MjQyIj4iU2t5cGUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI3NTMyMzYzMTc4NDU5NDQ0OTQzIj4iUVEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSIzNzEzNDQxMDM0Mjk5NjYwNzQ5Ij4iR29vZ2xlIFRhbGsiPC9pdGVtPgpAQCAtNTM0LDcgKzUyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJpbVByb3RvY29sQ3VzdG9tIiBtc2dpZD0iNjkxOTQ1MzgzNjYxODc0OTk5MiI+IkJlbnV0emVyZGVmaW5pZXJ0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW1Qcm90b2NvbEFpbSIgbXNnaWQ9IjcwNTAzNjA2MTIzNjgzODM0MTciPiJBSU0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbVByb3RvY29sTXNuIiBtc2dpZD0iMTQ0NTU2NTQ1NDIwNzY5NDQyIj4iV2luZG93cyBMaXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iaW1Qcm90b2NvbFlhaG9vIiBtc2dpZD0iODI3MTQzOTQwODQ2OTAyMTI3MyI+IllhaG9vISI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xZYWhvbyIgbXNnaWQ9IjgyNzE0Mzk0MDg0NjkwMjEyNzMiPiJZYWhvbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xTa3lwZSIgbXNnaWQ9IjkwMTkyOTY3NDQ2MjI4MzI5NTEiPiJTa3lwZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xRcSIgbXNnaWQ9Ijg4ODc0ODQzNzk0OTQxMTE4ODQiPiJRUSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xHb29nbGVUYWxrIiBtc2dpZD0iMzgwODM5Mzk3OTE1NzY5ODc2NiI+Ikdvb2dsZSBUYWxrIjwvc3RyaW5nPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJCZXJ1ZmxpY2giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iQW5kZXJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IkJlbnV0emVyZGVmaW5pZXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVDdXN0b20iIG1zZ2lkPSIyNDczNTgwNTkzMTExNTkwOTQ1Ij4iQmVudXR6ZXJkZWZpbmllcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUhvbWUiIG1zZ2lkPSI2MDkzNTk4MTgxMDY5MzU5Mjk1Ij4iUHJpdmF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+Ikdlc2Now6RmdGxpY2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZU90aGVyIiBtc2dpZD0iNDQwODQzNjE2Mjk1MDExOTg0OSI+IkFuZGVyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLDvGJlciA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IMO8YmVyIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlQ3VzdG9tICgyNDczNTgwNTkzMTExNTkwOTQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlSG9tZSAoNjA5MzU5ODE4MTA2OTM1OTI5NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZVdvcmsgKDY5MjA3MjU3MzA3OTcwOTkwNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlBJTi1Db2RlIGVpbmdlYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJQYXNzd29ydCB6dW0gRW50c3BlcnJlbiBlaW5nZWJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iUElOIHp1bSBFbnRzcGVycmVuIGVpbmdlYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iRmFsc2NoZXIgUElOLUNvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IkRyw7xja2VuIFNpZSB6dW0gRW50c3BlcnJlbiBkaWUgTWVuw7x0YXN0ZSB1bmQgZGFubiBhdWYgXCIwXCIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik5vdHJ1Zm51bW1lciI8L3N0cmluZz4KQEAgLTU2NCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJadXLDvGNrIHp1bSBBbnJ1ZiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IktvcnJla3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlR1dCB1bnMgbGVpZC4gVmVyc3VjaGVuIFNpZSBlcyBub2NoIGVpbm1hbC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlR1dCB1bnMgbGVpZC4gVmVyc3VjaGVuIFNpZSBlcyBub2NoIGVpbm1hbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJXaXJkIGdlbGFkZW4gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkF1ZmdlbGFkZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NzgsNiArNTY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkJpdHRlIFBJTi1Db2RlIGVpbmdlYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNLUthcnRlIHdpcmQgZW50c3BlcnJ0Li4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iU2llIGhhYmVuIElociBFbnRzcGVycnVuZ3NtdXN0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4tbWFsIGZhbHNjaCBnZXplaWNobmV0LiAiXG5cbiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJTaWUgaGFiZW4gSWhyIFBhc3N3b3J0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IE1hbCBmYWxzY2ggZWluZ2VnZWJlbi4gIlxuXG4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlNpZSBoYWJlbiBJaHJlIFBJTiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBNYWwgZmFsc2NoIGVpbmdlZ2ViZW4uICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iU2llIGhhYmVuIElociBFbnRzcGVycnVuZ3NtdXN0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4tbWFsIGZhbHNjaCBnZXplaWNobmV0LiBOYWNoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHdlaXRlcmVuIGVyZm9sZ2xvc2VuIFZlcnN1Y2hlbiB3ZXJkZW4gU2llIGF1ZmdlZm9yZGVydCwgSWhyIFRlbGVmb24gbWl0aGlsZmUgSWhyZXIgR29vZ2xlLUFubWVsZGVpbmZvcm1hdGlvbmVuIHp1IGVudHNwZXJyZW4uICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJNdXN0ZXIgdmVyZ2Vzc2VuPyI8L3N0cmluZz4KQEAgLTYwNiwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiJWb24gZGllc2VyIFNlaXRlIG5hdmlnaWVyZW4/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIlfDpGhsZW4gU2llIFwiT0tcIiwgdW0gZm9ydHp1ZmFocmVuLCBvZGVyIHfDpGhsZW4gU2llIFwiQWJicmVjaGVuXCIsIHVtIGF1ZiBkZXIgYWt0dWVsbGVuIFNlaXRlIHp1IGJsZWliZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9sYWJlbCIgbXNnaWQ9IjY4NjAyNjE3NTg2NjU4MjUwNjkiPiJCZXN0w6R0aWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iVGlwcDogWnVtIEhlcmFuem9vbWVuIHVuZCBWZXJncsO2w59lcm4gendlaW1hbCB0aXBwZW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiJCcm93c2VydmVybGF1ZiB1bmQgTGVzZXplaWNoZW4gbGVzZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBhbGxlIFVSTHMsIGRpZSBtaXQgZGVtIEJyb3dzZXIgYmVzdWNodCB3dXJkZW4sIHNvd2llIGFsbGUgTGVzZXplaWNoZW4gZGVzIEJyb3dzZXJzIHp1IGxlc2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+IkJyb3dzZXJ2ZXJsYXVmIHVuZCBMZXNlemVpY2hlbiBzY2hyZWliZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIGRlbiBhdWYgSWhyZW0gVGVsZWZvbiBnZXNwZWljaGVydGVuIEJyb3dzZXJ2ZXJsYXVmIHVuZCBkaWUgTGVzZXplaWNoZW4genUgw6RuZGVybi4gU2Now6RkbGljaGUgQW53ZW5kdW5nZW4ga8O2bm5lbiBzbyBJaHJlIEJyb3dzZXJkYXRlbiBsw7ZzY2hlbiBvZGVyIMOkbmRlcm4uIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJHZW9sb2thbGlzaWVydW5nc2JlcmVjaHRpZ3VuZ2VuIGRlcyBCcm93c2VycyDDpG5kZXJuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgZGllIEdlb2xva2FsaXNpZXJ1bmdzYmVyZWNodGlndW5nZW4gZGVzIEJyb3dzZXJzIHp1IMOkbmRlcm4uIFNjaMOkZGxpY2hlIEFud2VuZHVuZ2VuIGvDtm5uZW4gZGllcyBudXR6ZW4sIHVtIGRhcyBTZW5kZW4gdm9uIFN0YW5kb3J0aW5mb3JtYXRpb25lbiBhbiB3aWxsa8O8cmxpY2hlIFdlYnNpdGVzIHp1enVsYXNzZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iTcO2Y2h0ZW4gU2llLCBkYXNzIGRlciBCcm93c2VyIGRpZXNlcyBQYXNzd29ydCBzcGVpY2hlcnQ/Ijwvc3RyaW5nPgpAQCAtNzI2LDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJBbGxlcyBhdXN3w6RobGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJXb3J0IGF1c3fDpGhsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQXVzc2NobmVpZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkVpbmbDvGdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMIGtvcGllcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iVGV4dCBhdXN3w6RobGVuLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlRleHRhdXN3YWhsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iRWluZ2FiZW1ldGhvZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgenVtIFfDtnJ0ZXJidWNoIGhpbnp1ZsO8Z2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iVGV4dCBiZWFyYmVpdGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iVGV4dGFrdGlvbmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJHZXJpbmdlciBTcGVpY2hlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkthdW0gbm9jaCBmcmVpZXIgVGVsZWZvbnNwZWljaGVyIHZlcmbDvGdiYXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03NDEsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkFiYnJlY2hlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBY2h0dW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJXaXJkIGdlbGFkZW4uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkVJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkFVUyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQWt0aW9uIGR1cmNoZsO8aHJlbiBtaXQiPC9zdHJpbmc+CkBAIC03NTksMTkgKzc1MCwyMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iU2NobGllw59lbiBlcnp3aW5nZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iQmVyaWNodCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iV2FydGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQW53ZW5kdW5nIHVtZ2VsZWl0ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gd2lyZCBqZXR6dCBhdXNnZWbDvGhydC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gd3VyZGUgdXJzcHLDvG5nbGljaCBnZXN0YXJ0ZXQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkRpZSBBbndlbmR1bmcgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAoUHJvemVzcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhdCBnZWdlbiBpaHJlIHNlbGJzdGVyend1bmdlbmUgU3RyaWN0TW9kZS1SaWNodGxpbmllIHZlcnN0b8OfZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iRGVyIFByb3plc3MgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhdCBnZWdlbiBzZWluZSBzZWxic3Rlcnp3dW5nZW5lIFN0cmljdE1vZGUtUmljaHRsaW5pZSB2ZXJzdG/Dn2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gbMOkdWZ0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbl9kZXRhaWwiIG1zZ2lkPSIyNDIzOTc3NDk5MzM5NDAzNDAyIj4iQXVzd8OkaGxlbiB6dW0gV2VjaHNlbG4gaW4gZGllIEFud2VuZHVuZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9zd2l0Y2hlcl90aXRsZSIgbXNnaWQ9IjExMzU0MDM2MzM3NjY2OTQzMTYiPiJBbndlbmR1bmcgd2VjaHNlbG4/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RleHQiIG1zZ2lkPSI0NTkyMDc1NjEwMDc5MzE5NjY3Ij4iRXMgbMOkdWZ0IGdlcmFkZSBlaW5lIGFuZGVyZSBBbndlbmR1bmcsIGRpZSB2b3IgZGVtIFN0YXJ0IGVpbmVyIG5ldWVuIGJlZW5kZXQgd2VyZGVuIG11c3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RleHQiIG1zZ2lkPSI0NTkyMDc1NjEwMDc5MzE5NjY3Ij4iRWluZSBhbmRlcmUgQW53ZW5kdW5nIHdpcmQgYmVyZWl0cyBhdXNnZWbDvGhydCB1bmQgbXVzcyB2b3IgZGVtIFN0YXJ0IGVpbmVyIG5ldWVuIEFud2VuZHVuZyBiZWVuZGV0IHdlcmRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvbGRfYXBwX2FjdGlvbiIgbXNnaWQ9IjQ5MzEyOTE3MjIzODU2NjI4MiI+Ilp1IDx4bGlmZjpnIGlkPSJPTERfQVBQIj4lMSRzPC94bGlmZjpnPiB6dXLDvGNra2VocmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9kZXNjcmlwdGlvbiIgbXNnaWQ9Ijk0Mjk2NzkwMDIzNzIwODQ2NiI+IkRpZSBuZXVlIEFud2VuZHVuZyBuaWNodCBzdGFydGVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im9sZF9hcHBfZGVzY3JpcHRpb24iIG1zZ2lkPSI5NDI5Njc5MDAyMzcyMDg0NjYiPiJTdGFydGVuIFNpZSBkaWUgbmV1ZSBBbndlbmR1bmcgbmljaHQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibmV3X2FwcF9hY3Rpb24iIG1zZ2lkPSI1NDcyNzU2OTI2OTQ1NDQwNzA2Ij4iPHhsaWZmOmcgaWQ9Ik9MRF9BUFAiPiUxJHM8L3hsaWZmOmc+IHN0YXJ0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNjgzMDM5ODMzOTgyNjc4OTQ5MyI+IkFud2VuZHVuZyBiZWVuZGVuLCBvaG5lIHp1IHNwZWljaGVybi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNjgzMDM5ODMzOTgyNjc4OTQ5MyI+IkJlZW5kZW4gU2llIGRpZSBBbndlbmR1bmcgb2huZSB6dSBzcGVpY2hlcm4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VuZFRleHQiIG1zZ2lkPSI1MTMyNTA2MTIxNjQ1NjE4MzEwIj4iQWt0aW9uIGbDvHIgVGV4dCBhdXN3w6RobGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idm9sdW1lX3Jpbmd0b25lIiBtc2dpZD0iNjg4NTQyMTQwNjg0NTczNDY1MCI+IktsaW5nZWx0b25sYXV0c3TDpHJrZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InZvbHVtZV9tdXNpYyIgbXNnaWQ9IjU0MjE2NTExNTcxMzg2MjgxNzEiPiJNZWRpZW5sYXV0c3TDpHJrZSI8L3N0cmluZz4KQEAgLTgwOCw1OCArODAyLDQyIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19zaG93X2FsbCIgbXNnaWQ9IjI2NzE3OTExNjM5MzMwOTExODAiPjxiPiJBbGxlIGFuemVpZ2VuIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQi1NYXNzZW5zcGVpY2hlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQi1WZXJiaW5kdW5nIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4iU2llIGhhYmVuIElociBUZWxlZm9uIMO8YmVyIFVTQiBtaXQgSWhyZW0gQ29tcHV0ZXIgdmVyYnVuZGVuLiBXw6RobGVuIFNpZSBkaWUgU2NoYWx0ZmzDpGNoZSB1bnRlbiBhdXMsIHdlbm4gU2llIERhdGVpZW4gYXVmIElocmVuIENvbXB1dGVyIG9kZXIgZGllIFNELUthcnRlIElocmVzIEFuZHJvaWQtR2Vyw6R0cyBrb3BpZXJlbiBtw7ZjaHRlbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IlNpZSBoYWJlbiBJaHIgVGVsZWZvbiDDvGJlciBVU0IgbWl0IElocmVtIENvbXB1dGVyIHZlcmJ1bmRlbi4gV8OkaGxlbiBTaWUgZGllIFNjaGFsdGZsw6RjaGUgdW50ZW4gYXVzLCB3ZW5uIFNpZSBEYXRlaWVuIGF1ZiBJaHJlbiBDb21wdXRlciBvZGVyIGRpZSBTRC1LYXJ0ZSBJaHJlcyBBbmRyb2lkLUdlcsOkdHMga29waWVyZW4gbcO2Y2h0ZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJTaWUgaGFiZW4gSWhyIFRlbGVmb24gw7xiZXIgVVNCIG1pdCBJaHJlbSBDb21wdXRlciB2ZXJidW5kZW4uIFfDpGhsZW4gU2llIGRpZSBTY2hhbHRmbMOkY2hlIHVudGVuIGF1cywgd2VubiBTaWUgRGF0ZWllbiBhdWYgSWhyZW4gQ29tcHV0ZXIgb2RlciBkaWUgU0QtS2FydGUgSWhyZXMgQW5kcm9pZC1HZXLDpHRzIGtvcGllcmVuIG3DtmNodGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiJVU0ItU3BlaWNoZXIgYWt0aXZpZXJlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IkJlaSBkZXIgVmVyd2VuZHVuZyBJaHJlciBTRC1LYXJ0ZSBhbHMgVVNCLVNwZWljaGVyIGlzdCBlaW4gUHJvYmxlbSBhdWZnZXRyZXRlbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkJlaSBkZXIgVmVyd2VuZHVuZyBJaHJlciBTRC1LYXJ0ZSBhbHMgVVNCLVNwZWljaGVyIGlzdCBlaW4gUHJvYmxlbSBhdWZnZXRyZXRlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkJlaSBkZXIgVmVyd2VuZHVuZyBJaHJlciBTRC1LYXJ0ZSBhbHMgVVNCLVNwZWljaGVyIGlzdCBlaW4gUHJvYmxlbSBhdWZnZXRyZXRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iVVNCLVZlcmJpbmR1bmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJadW0gS29waWVyZW4gdm9uIERhdGVpZW4genVtL3ZvbSBDb21wdXRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+Ilp1bSBLb3BpZXJlbiB2b24gRGF0ZWllbiB6dS92b24gSWhyZW0gQ29tcHV0ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4iVVNCLVNwZWljaGVyIGRlYWt0aXZpZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iQXVzd8OkaGxlbiwgdW0gVVNCLVNwZWljaGVyIHp1IGRlYWt0aXZpZXJlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iVVNCLVNwZWljaGVyIGluIFZlcndlbmR1bmciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IlN0ZWxsZW4gU2llIHZvciBkZW0gRGVha3RpdmllcmVuIGRlcyBVU0ItU3BlaWNoZXJzIHNpY2hlciwgZGFzcyBTaWUgSWhyZSBBbmRyb2lkLVNELUthcnRlIHZvbiBJaHJlbSBDb21wdXRlciBnZXRyZW5udCAoXCJhdXNnZXdvcmZlblwiKSBoYWJlbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iU3RlbGxlbiBTaWUgdm9yIGRlbSBEZWFrdGl2aWVyZW4gZGVzIFVTQi1TcGVpY2hlcnMgc2ljaGVyLCBkYXNzIFNpZSBJaHJlIEFuZHJvaWQtU0QtS2FydGUgdm9uIElocmVtIENvbXB1dGVyIGdldHJlbm50IChcImF1c2dld29yZmVuXCIpIGhhYmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJTdGVsbGVuIFNpZSB2b3IgZGVtIERlYWt0aXZpZXJlbiBkZXMgVVNCLVNwZWljaGVycyBzaWNoZXIsIGRhc3MgU2llIElocmUgQW5kcm9pZC1TRC1LYXJ0ZSB2b24gSWhyZW0gQ29tcHV0ZXIgZ2V0cmVubnQgKFwiYXVzZ2V3b3JmZW5cIikgaGFiZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iVVNCLVNwZWljaGVyIGRlYWt0aXZpZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IkJlaW0gRGVha3RpdmllcmVuIGRlcyBVU0ItU3BlaWNoZXJzIGlzdCBlaW4gUHJvYmxlbSBhdWZnZXRyZXRlbi4gw5xiZXJwcsO8ZmVuIFNpZSwgb2IgU2llIGRlbiBVU0ItSG9zdCBnZXRyZW5udCBoYWJlbiwgdW5kIHZlcnN1Y2hlbiBTaWUgZXMgZXJuZXV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+IlVTQi1TcGVpY2hlciBha3RpdmllcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iV2VubiBTaWUgZGVuIFVTQi1TcGVpY2hlciBha3RpdmllcmVuLCB3ZXJkZW4gZWluaWdlIHZvbiBJaG5lbiB2ZXJ3ZW5kZXRlIEFud2VuZHVuZ2VuIGFuZ2VoYWx0ZW4gdW5kIHNpbmQgbcO2Z2xpY2hlcndlaXNlIG5pY2h0IHZlcmbDvGdiYXIsIGJpcyBTaWUgZGVuIFVTQi1TcGVpY2hlciB3aWVkZXIgZGVha3RpdmllcmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiJVU0ItVm9yZ2FuZyBmZWhsZ2VzY2hsYWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iU0QtS2FydGUgZm9ybWF0aWVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iU0QtS2FydGUgZm9ybWF0aWVyZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4iTcO2Y2h0ZW4gU2llIGRpZSBTRC1LYXJ0ZSB3aXJrbGljaCBmb3JtYXRpZXJlbj8gQWxsZSBEYXRlbiBhdWYgSWhyZXIgS2FydGUgZ2VoZW4gZGFubiB2ZXJsb3Jlbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJNw7ZjaHRlbiBTaWUgZGllIFNELUthcnRlIHdpcmtsaWNoIGZvcm1hdGllcmVuPyBBbGxlIERhdGVuIGF1ZiBJaHJlciBLYXJ0ZSBnZWhlbiBkYW5uIHZlcmxvcmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTRC1LYXJ0ZSBmb3JtYXRpZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+Ik3DtmNodGVuIFNpZSBkaWUgU0QtS2FydGUgd2lya2xpY2ggZm9ybWF0aWVyZW4/IEFsbGUgRGF0ZW4gYXVmIElocmVyIEthcnRlIGdlaGVuIGRhbm4gdmVybG9yZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iVVNCLURlYnVnZ2luZyB2ZXJidW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODQ3MDI5NjgxODI3MDExMDM5NiI+IkF1c3fDpGhsZW4sIHVtIFVTQi1EZWJ1Z2dpbmcgenUgZGVha3RpdmllcmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iWnVtIERlYWt0aXZpZXJlbiBkZXMgVVNCLURlYnVnZ2luZyBhdXN3w6RobGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjY4NjU1MTI3NDk0NjIwNzI3NjUiPiJFaW5nYWJlbWV0aG9kZSBhdXN3w6RobGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiJLYW5kaWRhdGVuIjwvdT48L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU0NTc2MDM0MTg5NzA5OTQwNTAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDIzOTUxNjY3NTAyODQzODk5NyI+IlNELUthcnRlIHdpcmQgdm9yYmVyZWl0ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlNELUthcnRlIHdpcmQgdm9yYmVyZWl0ZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlNELUthcnRlIHdpcmQgdm9yYmVyZWl0ZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4Mjg3MzE5ODgyOTI2NzM3MDUzIj4iU3VjaGUgbmFjaCBGZWhsZXJuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IlNELUthcnRlIGxlZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJTRC1LYXJ0ZSBsZWVyIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTMxMjI2NjgyMDA5Mjk1ODAxNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTYwNjY2MDc1NjEyNDYyOTcwOCI+IkRpZSBTRC1LYXJ0ZSBpc3QgbGVlciBvZGVyIHZlcndlbmRldCBlaW4gRGF0ZWlzeXN0ZW0sIGRhcyBuaWNodCB1bnRlcnN0w7x0enQgd2lyZC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTRC1LYXJ0ZSBpc3QgbGVlciBvZGVyIHZlcmbDvGd0IMO8YmVyIGVpbiBuaWNodCB1bnRlcnN0w7x0enRlcyBEYXRlaXN5c3RlbS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJCZXNjaMOkZGlndGUgU0QtS2FydGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IkJlc2Now6RkaWd0ZSBTRC1LYXJ0ZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4iRGllIFNELUthcnRlIGlzdCBiZXNjaMOkZGlndC4gU2llIG3DvHNzZW4gSWhyZSBLYXJ0ZSBldmVudHVlbGwgbmV1IGZvcm1hdGllcmVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJEaWUgU0QtS2FydGUgaXN0IGJlc2Now6RkaWd0LiBTaWUgbcO8c3NlbiBJaHJlIEthcnRlIGV2ZW50dWVsbCBuZXUgZm9ybWF0aWVyZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiJTRC1LYXJ0ZSB1bmVyd2FydGV0IGVudGZlcm50Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNELUthcnRlIHVuZXJ3YXJ0ZXQgZW50ZmVybnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4iU0QtS2FydGUgdm9yIGRlbSBFbnRuZWhtZW4gdHJlbm5lbiwgdW0gRGF0ZW52ZXJsdXN0IHp1IHZlcm1laWRlbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJTRC1LYXJ0ZSB2b3IgZGVtIEVudG5laG1lbiB0cmVubmVuLCB1bSBEYXRlbnZlcmx1c3QgenUgdmVybWVpZGVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iU0QtS2FydGUga2FubiBlbnRmZXJudCB3ZXJkZW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU0QtS2FydGUga2FubiBlbnRmZXJudCB3ZXJkZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iRGllIFNELUthcnRlIGthbm4gamV0enQgZW50ZmVybnQgd2VyZGVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJEaWUgU0QtS2FydGUga2FubiBlbnRmZXJudCB3ZXJkZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJTRC1LYXJ0ZSBlbnRmZXJudCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJTRC1LYXJ0ZSBlbnRmZXJudCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJEaWUgU0QtS2FydGUgd3VyZGUgZW50ZmVybnQuIExlZ2VuIFNpZSBlaW5lIG5ldWUgU0QtS2FydGUgZWluLCB1bSBkZW4gU3BlaWNoZXJwbGF0eiBJaHJlcyBHZXLDpHRzIHp1IGVyd2VpdGVybi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRC1LYXJ0ZSBlbnRmZXJudC4gTGVnZW4gU2llIGVpbmUgbmV1ZSBlaW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iU0QtS2FydGUgbGVlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNELUthcnRlIGlzdCBsZWVyIG9kZXIgdmVyZsO8Z3Qgw7xiZXIgZWluIG5pY2h0IHVudGVyc3TDvHR6dGVzIERhdGVpc3lzdGVtLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQmVzY2jDpGRpZ3RlIFNELUthcnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkRpZSBTRC1LYXJ0ZSBpc3QgYmVzY2jDpGRpZ3QuIFNpZSBtw7xzc2VuIElocmUgS2FydGUgZXZlbnR1ZWxsIG5ldSBmb3JtYXRpZXJlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0QtS2FydGUgdW5lcndhcnRldCBlbnRmZXJudCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IlNELUthcnRlIHZvciBkZW0gRW50bmVobWVuIHRyZW5uZW4sIHVtIERhdGVudmVybHVzdCB6dSB2ZXJtZWlkZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU0QtS2FydGVcbmthbm4gZW50ZmVybnQgd2VyZGVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJEaWUgU0QtS2FydGUga2FubiBlbnRmZXJudCB3ZXJkZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNELUthcnRlIGVudGZlcm50Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0QtS2FydGUgZW50ZmVybnQuIExlZ2VuIFNpZSBlaW5lIG5ldWUgZWluLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iS2VpbmUgcGFzc2VuZGVuIEFrdGl2aXTDpHRlbiBnZWZ1bmRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiJOdXR6dW5nc3N0YXRpc3RpayBkZXIgS29tcG9uZW50ZSBha3R1YWxpc2llcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IkVybcO2Z2xpY2h0IGRpZSDDhG5kZXJ1bmcgdm9uIGdlc2FtbWVsdGVuIE51dHp1bmdzc3RhdGlzdGlrZW4gZGVyIEtvbXBvbmVudGUuIE5pY2h0IGbDvHIgbm9ybWFsZSBBbndlbmR1bmdlbiB2b3JnZXNlaGVuLiI8L3N0cmluZz4KQEAgLTg5NCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYy1WUE4gbWl0IHZvcmluc3RhbGxpZXJ0ZW0gU2NobMO8c3NlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJaZXJ0aWZpa2F0IG1pdCB2b3JpbnN0YWxsaWVydGVtIFNjaGzDvHNzZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJEYXRlaSBhdXN3w6RobGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iS2VpbmUgRGF0ZWkgYXVzZ2V3w6RobHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJadXLDvGNrc2V0emVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNlbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iRmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkF1dG9tb2R1cyBha3RpdmllcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iWnVtIEJlZW5kZW4gZGVzIEF1dG9tb2R1cyBhdXN3w6RobGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRldGhlcmluZyBvZGVyIEhvdHNwb3QgYWt0aXYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJadW0gS29uZmlndXJpZXJlbiBiZXLDvGhyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJadXLDvGNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iV2VpdGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iw5xiZXJzcHJpbmdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkhvaGUgTW9iaWxkYXRlbm51dHp1bmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IldlaXRlcmUgSW5mb3JtYXRpb25lbiDDvGJlciBkaWUgTW9iaWxkYXRlbm51dHp1bmcgZHVyY2ggQmVyw7xocmVuIGF1ZnJ1ZmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJNb2JpbGRhdGVubGltaXQgw7xiZXJzY2hyaXR0ZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4iV2VpdGVyZSBJbmZvcm1hdGlvbmVuIMO8YmVyIGRpZSBNb2JpbGRhdGVubnV0enVuZyBkdXJjaCBCZXLDvGhyZW4gYXVmcnVmZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+IktlaW5lIMOcYmVyZWluc3RpbW11bmdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiJBdWYgU2VpdGUgc3VjaGVuIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgw5xiZXJlaW5zdGltbXVuZyI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IHZvbiA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKaW5kZXggNzEyOGFkNy4uZTJhMDFmNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+Is6Vz4HOs86xzrvOtc6vzrEgzrHOvc6sz4DPhM+Fzr7Ot8+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+Is6Uz4XOvc6xz4TPjM+EzrfPhM61z4Igz4DOv8+FIM61zq/Ovc6xzrkgzrHPgM6xz4HOsc6vz4TOt8+EzrXPgiDOvM+Mzr3OvyDPg861IM+Az4HOv86zz4HOsc68zrzOsc+EzrnPg8+Ezq3PgiDOtc+GzrHPgc68zr/Os8+Ozr0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4izpHPgM6/zrjOt866zrXPhc+EzrnOus+Mz4Igz4fPjs+Bzr/PgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4izqDPgc+Mz4POss6xz4POtyDPg8+EzrfOvSDOus6sz4HPhM6xIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiLOoM+Bz4zPg86yzrHPg863IM+Dz4TOt869IM66zqzPgc+EzrEgU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+Is6gz4HPjM+DzrLOsc+Dzrcgz4PPhM63zr0gzrrOrM+Bz4TOsSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiLOsc+AzrXOvc61z4HOs86/z4DOv86vzrfPg863IM6uIM+Ez4HOv8+Azr/PgM6/zq/Ot8+DzrcgzrPPgc6xzrzOvM6uz4IgzrrOsc+EzqzPg8+EzrHPg863z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4izpXPgM65z4TPgc6tz4DOtc65IM+Dz4TOt869IM61z4bOsc+BzrzOv86zzq4gzr3OsSDOsc+AzrXOvc61z4HOs86/z4DOv865zrXOryDPhM63IM6zz4HOsc68zrzOriDOus6xz4TOrM+Dz4TOsc+DzrfPgiDOriDOvc6xIM+Az4HOv8+DzrjOrc+EzrXOuSDOus6xzrkgzr3OsSDOsc+GzrHOuc+BzrXOryDOtc65zrrOv869zq/OtM65zrEgz4PPhc+Dz4TOrs68zrHPhM6/z4IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+Is6zz4HOsc68zrzOriDOus6xz4TOrM+Dz4TOsc+DzrfPgiI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gzr3OsSDOsc+Fzr7Ors+DzrXOuSDPhM6/zr0gzrXOu861z43OuM61z4HOvyDPh8+Oz4HOvyDOsc+Azr/OuM6uzrrOtc+Fz4POt8+CIM+Ezr/PhSDPhM63zrvOtc+Gz47Ovc6/z4UgzrTOuc6xzrPPgc6sz4bOv869z4TOsc+CIM6xz4HPh861zq/OsSDOsc+Az4wgz4TOv869IM66zrHPhM6szrvOv86zzr8gz4DPgc6/z4PPic+BzrnOvc6uz4IgzrzOvc6uzrzOt8+CIM+EzrfPgiDOtc+GzrHPgc68zr/Os86uz4IuIM6XIM+Az4HPjM+DzrLOsc+DzrcgzrXOr869zrHOuSDPg8+Fzr3Ors64z4nPgiDPgM6/zrvPjSDPgM61z4HOuc6/z4HOuc+DzrzOrc69zrcgz4PPhM63IM60zrnOsc60zrnOus6xz4POr86xIM+Dz4XPg8+Ezq7OvM6xz4TOv8+CLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiLOnM61z4TOsc66zq/Ovc63z4POtyDPgM+Mz4HPic69IM61z4bOsc+BzrzOv86zzq7PgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM+EzrcgzrzOtc+EzrHOus6vzr3Ot8+Dzrcgz4DPjM+Bz4nOvSDOtc+GzrHPgc68zr/Os86uz4IgzrHPgM+MIM6tzr3OsSDOtc+Dz4nPhM61z4HOuc66z4wgz4POtSDOrc69zrEgzrXOvs+Jz4TOtc+BzrnOus+MIM68zq3Pg86/IM66zrHOuSDOsc69z4TOr8+Dz4TPgc6/z4bOsS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+Is6xzr3OrM6zzr3Pic+DzrcgzrXPhc6xzq/Pg864zrfPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69IM6xz4HPh861zq/Ov8+FIM66zrHPhM6xzrPPgc6xz4bOrs+CIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIG1zZ2lkPSI4ODk2NDQ5NDM3NDY0ODY3NzY2Ij4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gz4TOt869IM6xzr3OrM6zzr3Pic+Dzrcgz4TPic69IM6xz4HPh861zq/Pic69IM66zrHPhM6xzrPPgc6xz4bOrs+CIM+Ezr/PhSDPg8+Fz4PPhM6uzrzOsc+Ezr/Pgi4gzojPhM+DzrksIM68z4DOv8+BzrXOryDOvc6xIM6xzr3Osc66zrHOu8+Nz4jOtc65IM6zzrXOvc65zrrOrc+CIM+AzrvOt8+Bzr/Phs6/z4HOr861z4Igz4PPh861z4TOuc66zqwgzrzOtSDPhM65z4IgzrTPgc6xz4PPhM63z4HOuc+Mz4TOt8+Ezq3PgiDPg86xz4Igz4PPhM6/IM+EzrfOu86tz4bPic69zr8sIM+Dz4XOvM+AzrXPgc65zrvOsc68zrLOrM69zr/Ovc+EzrHPgiDPgM65zrjOsc69z47PgiDOus6xzrkgz4DPgc6/z4PPic+AzrnOus6tz4Igzq4gzrnOtM65z4nPhM65zrrOrc+CIM+AzrvOt8+Bzr/Phs6/z4HOr861z4IuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4izrHOvc6szrPOvc+Jz4POty/Otc6zzrPPgc6xz4bOriDPg861IM+Az4zPgc6/z4XPgiDPgM6/z4UgzrHOvc6uzrrOv8+Fzr0gz4PPhM6/IM60zrnOsc6zzr3Pic+Dz4TOuc66z4wiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOsc69zqzOs869z4nPg863IM66zrHOuSDPhM63zr0gzrXOs86zz4HOsc+Gzq4gz4POtSDPgM+Mz4HOvyDPgM6/z4UgzrHOvc6uzrrOtc65IM+Dz4TOt869IM6/zrzOrM60zrEgzrTOuc6xzrPOvc+Jz4PPhM65zrrOv8+NICjPgC7Phy4gzrHPgc+HzrXOr86xIM+Dz4TOv869IM66zrHPhM6szrvOv86zzr8gL2RldikuIM6Rz4XPhM+MIM61zr3OtM6tz4fOtc+EzrHOuSDOvc6xIM61z4DOt8+BzrXOrM+DzrXOuSDPhM63zr0gz4PPhM6xzrjOtc+Bz4zPhM63z4TOsSDOus6xzrkgz4TOt869IM6xz4PPhs6szrvOtc65zrEgz4TOv8+FIM+Dz4XPg8+Ezq7OvM6xz4TOv8+CLiDOmM6xIM+Az4HOrc+AzrXOuSDOvc6xIM+Hz4HOt8+DzrnOvM6/z4DOv865zrXOr8+EzrHOuSDOnM6fzp3OnyDOs865zrEgzrTOuc6xzrPOvc+Jz4PPhM65zrrOrCDPhc67zrnOus6/z40gz4TOv8+FIM66zrHPhM6xz4POus61z4XOsc+Dz4TOriDOriDPhM6/z4Ugz4fOtc65z4HOuc+Dz4TOri4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiLOtc69zrXPgc6zzr/PgM6/zq/Ot8+Dzrcgzq4gzrHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyDPg8+Ezr/Ouc+HzrXOr8+Jzr0gzrXPhs6xz4HOvM6/zrPOrs+CIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gz4TOtyDOtM65zrHOvM+Mz4HPhs+Jz4POtyDPhM6/z4Ugz4TOv8+AzrnOus6/z40gz4TOt867zrXPhs+Ozr3Ov8+FIEJsdWV0b290aCDOus6xzrkgz4TOt869IM6xzr3Osc66zqzOu8+Fz4jOtyDOus6xzrkgz4PPjc62zrXPhc6+zrcgzrzOtSDOsc+Azr/OvM6xzrrPgc+Fz4POvM6tzr3Otc+CIM+Dz4XPg866zrXPhc6tz4IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4izrTOt868zrnOv8+Fz4HOs86vzrEgz4PPhc69zrTOrc+DzrXPic69IEJsdWV0b290aCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM69zrEgz4DPgc6/zrLOrM67zrXOuSDPhM63IM60zrnOsc68z4zPgc+Gz4nPg863IM+Ezr/PhSDPhM6/z4DOuc66zr/PjSDPhM63zrvOtc+Gz47Ovc6/z4UgQmx1ZXRvb3RoIM66zrHOuSDOtc+Azq/Pg863z4Igzr3OsSDPgM+BzrHOs868zrHPhM6/z4DOv865zrXOryDOus6xzrkgzr3OsSDOsc+Azr/OtM6tz4fOtc+EzrHOuSDPg8+Fzr3OtM6tz4POtc65z4IgzrzOtSDPg8+FzrbOtc+FzrPOvM6tzr3Otc+CIM+Dz4XPg866zrXPhc6tz4IuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjQWRtaW4gKDIyNTEzMDIyMzMwMTIyNTAwNTYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjQWRtaW4gKDE5MzU4NDI2MTE0NjQ4OTU3ODUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNSYXcgKDQ0MjM0NzE3MTExMTQzMjU3MDgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjUmF3ICg1NTMzMDIyNzM2NTU5Mzg1NjY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTm90aWZ5ICg0Nzg0NzAzNjAwODI3OTIzNTgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTm90aWZ5ICgyOTkwMDUzNTE3OTYyMDcwNjE3KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTGxjcCAoNDk3MjA1MTQ2MTAwNzAzMDQyNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNMbGNwICg5MTU5MjEyNzc4NjAwNDY0MCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+Is6xz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+DzrcgzrrOu861zrnOtM+OzrzOsc+Ezr/PgiDPgM67zrfOus+Ez4HOv867zr/Os86vzr/PhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gzrHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyDPhM6/z4UgzrrOu861zrnOtM+OzrzOsc+Ezr/PgiDPgM67zrfOus+Ez4HOv867zr/Os86vzr/PhSDOus6xzrkgzqzOu867zrfPgiDPg8+HzrXPhM65zrrOrs+CIM6xz4PPhs6szrvOtc65zrHPgiDOvM61IM66z4nOtM65zrrPjCDPgM+Bz4zPg86yzrHPg863z4IuIM6TzrnOsSDPgM6xz4HOrM60zrXOuc6zzrzOsSwgzrcgzrHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyDPhM6/z4UgzrrOu861zrnOtM+OzrzOsc+Ezr/PgiDPgM67zrfOus+Ez4HOv867zr/Os86vzr/PhSDPjM+EzrHOvSDOu86xzrzOss6szr3Otc+EzrHOuSDOtc65z4POtc+Bz4fPjM68zrXOvc63IM+EzrfOu861z4bPic69zrnOus6uIM66zrvOrs+DzrcgzrrOsc65IM63IM61z4DOsc69zrXOvc61z4HOs86/z4DOv86vzrfPg863IM+Ezr/PhSDOus67zrXOuc60z47OvM6xz4TOv8+CIM+AzrvOt866z4TPgc6/zrvOv86zzq/Ov8+FIM+Mz4TOsc69IM63IM66zrvOrs+Dzrcgz4TOtc+BzrzOsc+EzrnPg8+EzrXOry4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4izrHOvc6szrPOvc+Jz4POtyDPgc+FzrjOvM6vz4POtc+Jzr0gz4PPhc6zz4fPgc6/zr3Ouc+DzrzOv8+NIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM69zrEgzrHOvc6xzrPOvc+Oz4POtc65IM65zrTOuc+Jz4TOuc66zq3PgiDOu86tzr7Otc65z4IgzrrOsc65IM+Gz4HOrM+DzrXOuc+CIM66zrHOuSDOuc60zrnPic+EzrnOus6sIM6/zr3PjM68zrHPhM6xLCDPhM6xIM6/z4DOv86vzrEgzr8gz4fPgc6uz4PPhM63z4IgzrXOvc60zq3Ph861z4TOsc65IM69zrEgzq3Ph861zrkgzrHPgM6/zrjOt866zrXPjc+DzrXOuSDPg8+Ezr8gzrvOtc6+zrnOus+MIM+Hz4HOrs+Dz4TOty4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiLOtc6zzrPPgc6xz4bOriDPg861IM66zrHOuM6/z4HOuc+DzrzOrc69zr8gzrHPgM+MIM+Ezr/OvSDPh8+Bzq7Pg8+EzrcgzrvOtc6+zrnOus+MIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOtc6zzrPPgc6xz4bOriDOvc6tz4nOvSDOu86tzr7Otc+Jzr0gz4PPhM6/IM67zrXOvs65zrrPjCDPh8+Bzq7Pg8+EzrcuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiLPhM+Bzr/PgM6/z4DOv86vzrfPg863L860zrnOsc6zz4HOsc+Gzq4gz4DOtc+BzrnOtc+Hzr/OvM6tzr3Pic69IM66zqzPgc+EzrHPgiBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iz4TPgc6/z4DOv8+Azr/Or863z4POty/OtM65zrHOs8+BzrHPhs6uIM+AzrXPgc65zrXPh86/zrzOrc69z4nOvSDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4izpXPgM65z4TPgc6tz4DOtc65IM+Dz4TOt869IM61z4bOsc+BzrzOv86zzq4gz4TOt869IM61zrPOs8+BzrHPhs6uIM+Dz4TOt869IM66zqzPgc+EzrEgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4izpXPgM65z4TPgc6tz4DOtc65IM+Dz4TOt869IM61z4bOsc+BzrzOv86zzq4gz4TOt869IM61zrPOs8+BzrHPhs6uIM+Dz4TOt869IM66zqzPgc+EzrEgU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLPhM+Bzr/PgM6/z4DOv86vzrfPg863L860zrnOsc6zz4HOsc+Gzq4gz4DOtc+BzrnOtc+Hzr/OvM6tzr3Pic69IM66zqzPgc+EzrHPgiBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg8+EzrfOvSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOtc6zzrPPgc6xz4bOriDPg8+EzrfOvSDOus6sz4HPhM6xIFNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiLPgM+Bz4zPg86yzrHPg863IM+Dz4TOvyDPg8+Nz4PPhM63zrzOsSDOsc+Bz4fOtc6vz4nOvSDPgM+Bzr/Pg8+Jz4HOuc69zq7PgiDOvM69zq7OvM63z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOsc69zqzOs869z4nPg863IM66zrHOuSDPhM63zr0gzrXOs86zz4HOsc+Gzq4gz4TOv8+FIM+Dz4XPg8+Ezq7OvM6xz4TOv8+CIM6xz4HPh861zq/Pic69IM+Az4HOv8+Dz4nPgc65zr3Ors+CIM68zr3Ors68zrfPgi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiLOoM61z4HOuc6/z4HOuc+DzrzPjM+CIM61z4DOuc67zr/Os8+Ozr0gzrrPic60zrnOus6/z40gz4DPgc+Mz4POss6xz4POt8+CIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+Is6gzrXPgc65zr/Pgc65z4POvM+Mz4Igz4TPic69IM+Ez43PgM+Jzr0gzrrPic60zrnOus6/z40gz4DPgc+Mz4POss6xz4POt8+CIM+Azr/PhSDOtc+AzrnPhM+Bzq3PgM61z4TOsc65IM69zrEgz4fPgc63z4POuc68zr/PgM6/zrnOtc6vz4TOtS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+Is6gzrHPgc6xzrrOv867zr/Pjc64zrfPg863IM+Az4HOv8+Dz4DOsc64zrXOuc+Ozr0gz4PPjc69zrTOtc+DzrfPgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiLOoM6xz4HOsc66zr/Ou86/z43OuM63z4POtyDOsc+Azr/PhM+Fz4fOt868zq3Ovc+Jzr0gz4DPgc6/z4PPgM6xzrjOtc65z47OvSDPg8+Nzr3OtM61z4POt8+CIM68zrUgz4TOtyDPg8+Fz4POus61z4XOriwgzrPOuc6xIM+EzrfOvSDOtc66z4TOrc67zrXPg863z4IgzrrOrM+Azr/Ouc6xz4IgzrXOvc6tz4HOs861zrnOsc+CLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+Is6Vz4DOsc69zrHPhs6/z4HOrCDOus+JzrTOuc66zr/PjSDPgM+Bz4zPg86yzrHPg863z4IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4izpXPhs6xz4HOvM6/zrPOriDPhM6/z4UgzrrPic60zrnOus6/z40gz4DPgc+Mz4POss6xz4POrs+CIM+DzrHPgiDPg861IM68zrnOsSDOvc6tzrEgz4TOuc68zq4sIM68zrUgz4TOt869IM+Az4HOv8+Lz4DPjM64zrXPg863IM+Mz4TOuSDPg86xz4Igz4DOsc+Bzq3Ph861z4TOsc65IM6xz4DPjCDPhM6/zr0gzrTOuc6xz4fOtc65z4HOuc+Dz4TOriDOs865zrEgzr3OsSDOvM+Azr/Pgc61zq/PhM61IM69zrEgz4PPhc69zrTOtc64zrXOr8+EzrUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiLOlc+GzrHPgc68zr/Os86uIM66zrvOtc65zrTPjs68zrHPhM6/z4IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiLOlc67zq3Os8+HzrXOuSDPgM+Mz4TOtSDOus67zrXOuc60z47Ovc61zrkgzrcgz4PPhc+DzrrOtc+Fzq4sIM6xz4DOsc65z4TPjs69z4TOsc+CIM66z4nOtM65zrrPjCDPgM+Bz4zPg86yzrHPg863z4IgzrPOuc6xIM61z4DOsc69zrXOr8+Dzr/OtM6/LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+Is6gzrXPgc65zr/Pgc65z4POvM+Mz4IgzrXPgM65zrvOv86zz47OvSDOus+JzrTOuc66zr/PjSDPgM+Bz4zPg86yzrHPg863z4IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4izqDOtc+BzrnOv8+BzrnPg868z4zPgiDPhM+Jzr0gz4TPjc+Az4nOvSDOus+JzrTOuc66zr/PjSDPgM+Bz4zPg86yzrHPg863z4Igz4DOv8+FIM61z4DOuc+Ez4HOrc+AzrXPhM6xzrkgzr3OsSDPh8+BzrfPg865zrzOv8+Azr/Ouc61zq/PhM61LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+Is6gzrHPgc6xzrrOv867zr/Pjc64zrfPg863IM+Az4HOv8+Dz4DOsc64zrXOuc+Ozr0gz4PPjc69zrTOtc+DzrfPgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiLOoM6xz4HOsc66zr/Ou86/z43OuM63z4POtyDOsc+Azr/PhM+Fz4fOt868zq3Ovc+Jzr0gz4DPgc6/z4PPgM6xzrjOtc65z47OvSDPg8+Nzr3OtM61z4POt8+CIM68zrUgz4TOtyDPg8+Fz4POus61z4XOriwgzrPOuc6xIM+EzrfOvSDOtc66z4TOrc67zrXPg863z4IgzrrOrM+Azr/Ouc6xz4IgzrXOvc6tz4HOs861zrnOsc+CLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+Is6Vz4DOsc69zrHPhs6/z4HOrCDOus+JzrTOuc66zr/PjSDPgM+Bz4zPg86yzrHPg863z4IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4izpXPhs6xz4HOvM6/zrPOriDPhM6/z4UgzrrPic60zrnOus6/z40gz4DPgc+Mz4POss6xz4POrs+CIM+DzrHPgiDPg861IM68zrnOsSDOvc6tzrEgz4TOuc68zq4sIM68zrUgz4TOt869IM+Az4HOv8+Lz4DPjM64zrXPg863IM+Mz4TOuSDPg86xz4Igz4DOsc+Bzq3Ph861z4TOsc65IM6xz4DPjCDPhM6/zr0gzrTOuc6xz4fOtc65z4HOuc+Dz4TOriDOs865zrEgzr3OsSDOvM+Azr/Pgc61zq/PhM61IM69zrEgz4PPhc69zrTOtc64zrXOr8+EzrUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiLOlc+GzrHPgc68zr/Os86uIM66zrvOtc65zrTPjs68zrHPhM6/z4IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLOlc67zq3Os8+HzrXOuSDPgM+Mz4TOtSDOus67zrXOuc60z47Ovc61zrkgzrcgz4PPhc+DzrrOtc+Fzq4sIM6xz4DOsc65z4TPjs69z4TOsc+CIM66z4nOtM65zrrPjCDPgM+Bz4zPg86yzrHPg863z4IgzrPOuc6xIM61z4DOsc69zrXOr8+Dzr/OtM6/LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLOlM65zrHOs8+BzrHPhs6uIM+MzrvPic69IM+Ez4nOvSDOtM61zrTOv868zq3Ovc+Jzr0iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+Is6gz4HOsc6zzrzOsc+Ezr/PgM6/zrnOtc6vz4TOsc65IM61z4DOsc69zrHPhs6/z4HOrCDOtc+BzrPOv8+Dz4TOsc+DzrnOsc66z47OvSDPgc+FzrjOvM6vz4POtc+Jzr0sIM68zrUgz4TOtyDOtM65zrHOs8+BzrHPhs6uIM+MzrvPic69IM+Ez4nOvSDOtM61zrTOv868zq3Ovc+Jzr0gz4POsc+CIM+Hz4nPgc6vz4IgzrXPgM65zrLOtc6yzrHOr8+Jz4POty4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+Is6gz4HOsc6zzrzOsc+Ezr/PgM6/zrnOtc6vz4TOsc65IM61z4DOsc69zrHPhs6/z4HOrCDOtc+BzrPOv8+Dz4TOsc+DzrnOsc66z47OvSDPgc+FzrjOvM6vz4POtc+Jzr0sIM68zrUgz4TOtyDOtM65zrHOs8+BzrHPhs6uIM+MzrvPic69IM+Ez4nOvSDOtM61zrTOv868zq3Ovc+Jzr0gz4POsc+CIM+Hz4nPgc6vz4IgzrXPgM65zrLOtc6yzrHOr8+Jz4POty4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiLOn8+Bzq/Pg8+EzrUgz4TOtyDPh8+Bzq7Pg863IM+Ezr/PhSDOs861zr3Ouc66zr/PjSDOtM65zrHOus6/zrzOuc+Dz4TOriDOvM61z4POv867zqzOss63z4POt8+CIM+EzrfPgiDPg8+Fz4POus61z4XOrs+CIM+Mz4TOsc69IM61zq/Ovc6xzrkgzrXOvc61z4HOs86/z4DOv865zrfOvM6tzr3OtyDOtyDPgM6/zrvOuc+EzrnOus6uLiDOnM+Mzr3OvyDOvyDOtM65zrHPh861zrnPgc65z4PPhM6uz4Igz4TOt8+CIM+Az4HPjs+EzrfPgiDPg8+Fz4POus61z4XOrs+CIM6/z4HOr862zrXOuSDPhM6/zr0gzrnPg8+Hz43Ov869z4TOsSDOs861zr3Ouc66z4wgzrTOuc6xzrrOv868zrnPg8+Ezq4gzrzOtc+Dzr/Ou86szrLOt8+DzrfPgi4iPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLOn865zrrOr86xIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4izprOuc69zrfPhM+MIjwvaXRlbT4KQEAgLTU0NCwxNCArNTMwLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4izpXPgc6zzrHPg86vzrEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4izobOu867zr8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4izqDPgc6/z4POsc+BzrzOv8+DzrzOrc69zr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiLOoM+Bzr/Pg86xz4HOvM6/z4POvM6tzr3OvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlSG9tZSIgbXNnaWQ9IjYwOTM1OTgxODEwNjkzNTkyOTUiPiLOkc+Bz4fOuc66zq4gz4POtc67zq/OtM6xIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+Is6Vz4HOs86xz4POr86xIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVPdGhlciIgbXNnaWQ9IjQ0MDg0MzYxNjI5NTAxMTk4NDkiPiLOhs67zrvOvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLOvM6tz4PPiSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IM68zq3Pg8+JIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlQ3VzdG9tICgyNDczNTgwNTkzMTExNTkwOTQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlSG9tZSAoNjA5MzU5ODE4MTA2OTM1OTI5NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZVdvcmsgKDY5MjA3MjU3MzA3OTcwOTkwNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Is6gzrvOt866z4TPgc6/zrvOv86zzq7Pg8+EzrUgz4TOv869IM66z4nOtM65zrrPjCDOsc+BzrnOuM68z4wgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLOlc65z4POsc6zzqzOs861z4TOtSDPhM6/zr0gzrrPic60zrnOus+MIM+Az4HPjM+DzrLOsc+DzrfPgiDOs865zrEgzr7Otc66zrvOtc6vzrTPic68zrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Is6VzrnPg86xzrPOrM6zzrXPhM61IM+Ezr8gUElOIM6zzrnOsSDOvs61zrrOu861zq/OtM+JzrzOsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+Is6Vz4PPhs6xzrvOvM6tzr3Ov8+CIM66z4nOtM65zrrPjM+CIM6xz4HOuc64zrzPjM+CIFBJTiEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4izpPOuc6xIM6+zrXOus67zrXOr860z4nOvM6xLCDPgM6xz4TOrs+Dz4TOtSDPhM6/IM+AzrvOrs66z4TPgc6/IE1lbnUgzrrOsc65LCDPg8+Ezrcgz4PPhc69zq3Ph861zrnOsSwgz4TOvyDPgM67zq7Ous+Ez4HOvyAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLOkc+BzrnOuM68z4zPgiDOrc66z4TOsc66z4TOt8+CIM6xzr3OrM6zzrrOt8+CIjwvc3RyaW5nPgpAQCAtNTY0LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Is6Vz4DOuc+Dz4TPgc6/z4bOriDPg8+EzrfOvSDOus67zq7Pg863Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4izqPPic+Dz4TPjCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOsc+BzrPPjM+EzrXPgc6xIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6xz4HOs8+Mz4TOtc+BzrEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLOps+Mz4HPhM65z4POtyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4izqbOv8+Bz4TOr8+Dz4TOt866zrUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NzgsNyArNTY4LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+Is6XIM66zqzPgc+EzrEgU0lNIM61zq/Ovc6xzrkgzrrOu861zrnOtM+JzrzOrc69zrcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4izp7Otc66zrvOtc6vzrTPic68zrEgzrrOrM+Bz4TOsc+CIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Is6jz4fOtc60zrnOrM+DzrHPhM61IM61z4PPhs6xzrvOvM6tzr3OsSDPhM6/IM68zr/PhM6vzrLOvyDOvs61zrrOu861zrnOtM+OzrzOsc+Ezr/Pgjx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IM+Gzr/Pgc6tz4IuICJcblxuIs6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLOo8+HzrXOtM65zqzPg86xz4TOtSDPhM6/IM68zr/PhM6vzrLOvyDOvs61zrrOu861zrnOtM+OzrzOsc+Ezr/PgiDOtc+Dz4bOsc67zrzOrc69zrEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gz4bOv8+Bzq3Pgi4gzpzOtc+EzqwgzrHPgM+MIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IM6xzr3Otc+AzrnPhM+Fz4fOtc6vz4Igz4DPgc6/z4PPgM6szrjOtc65zrXPgiDOsc66z4zOvM63LCDOuM6xIM+DzrHPgiDOts63z4TOt864zrXOryDOvc6xIM6+zrXOus67zrXOuc60z47Pg861z4TOtSDPhM6/IM+EzrfOu86tz4bPic69z4wgz4POsc+CIM68zrUgz4TOtyDPh8+Bzq7Pg863IM+EzrfPgiDPg8+Nzr3OtM61z4POrs+CIM+DzrHPgiBHb29nbGUuIlxuXG4iIM6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4izprOsc+EzrHPh8+Jz4HOr8+DzrHPhM61IM61z4PPhs6xzrvOvM6tzr3OsSDPhM6/zr0gzrrPic60zrnOus+MIM+Az4HPjM+DzrLOsc+DzrfPgiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDPhs6/z4HOrc+CLiAiXG5cbiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLOms6xz4TOsc+Hz4nPgc6vz4POsc+EzrUgzrXPg8+GzrHOu868zq3Ovc6xIM+Ezr8gUElOIM+DzrHPgjx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IM+Gzr/Pgc6tz4IuICJcblxuIs6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLOo8+HzrXOtM65zqzPg86xz4TOtSDPhM6/IM68zr/PhM6vzrLOvyDOvs61zrrOu861zrnOtM+OzrzOsc+Ezr/PgiDOtc+Dz4bOsc67zrzOrc69zrEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gz4bOv8+Bzq3Pgi4gzpzOtc+EzqwgzrHPgM+MIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IM6xzr3Otc+AzrnPhM+Fz4fOtc6vz4Igz4DPgc6/z4PPgM6szrjOtc65zrXPgiDOsc66z4zOvM63LCDOuM6xIM+DzrHPgiDOts63z4TOt864zrXOryDOvc6xIM6+zrXOus67zrXOuc60z47Pg861z4TOtSDPhM6/IM+EzrfOu86tz4bPic69z4wgz4POsc+CIM68zrUgz4TOtyDPh8+Bzq7Pg863IM+EzrfPgiDPg8+Nzr3OtM61z4POrs+CIM+DzrHPgiBHb29nbGUuIlxuXG4iIM6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBcbs60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvs6xzr3OrCDPg861IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLOns61z4fOrM+DzrHPhM61IM+Ezr8gzrzOv8+Ezq/Oss6/OyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZ2xvZ2luX2ZvcmdvdF9wYXR0ZXJuIiBtc2dpZD0iMjU4ODUyMTUwMTE2NjAzMjc0NyI+Is6ezrXOus67zrXOr860z4nOvM6xIM67zr/Os86xz4HOuc6xz4POvM6/z40iPC9zdHJpbmc+CkBAIC02MDYsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4izpHPgM6/zrzOrM66z4HPhc69z4POtyDOsc+Az4wgzrHPhc+Ezq4gz4TOtyDPg861zrvOr860zrE7IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIs6Vz4DOuc67zq3Ovs+EzrUgT0sgzrPOuc6xIM+Dz4XOvc6tz4fOtc65zrEsIM6uIM6RzrrPjc+Bz4nPg863IM6zzrnOsSDPgM6xz4HOsc68zr/Ovc6uIM+Dz4TOt869IM+Ez4HOrc+Hzr/Phc+DzrEgz4POtc67zq/OtM6xLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4izpXPgM65zrLOtc6yzrHOr8+Jz4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4izqPPhc68zrLOv8+FzrvOrjogzrTOuc+AzrvPjCDOrM6zzrPOuc6zzrzOsSDOs865zrEgzrzOtc6zzq3OuM+Fzr3Pg863IM66zrHOuSDPg868zq/Ous+Bz4XOvc+DzrcuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4izrHOvc6szrPOvc+Jz4POtyDOuc+Dz4TOv8+BzrnOus6/z40gzrrOsc65IM+DzrXOu865zrTOv860zrXOuc66z4TPjs69IM+Az4HOv86zz4HOrM68zrzOsc+Ezr/PgiDPgM61z4HOuc6uzrPOt8+DzrfPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg8+EzrfOvSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOsc69zqzOs869z4nPg863IM+MzrvPic69IM+Ez4nOvSDOtM65zrXPhc64z43Ovc+DzrXPic69IFVSTCDPgM6/z4Ugz4TOvyDPgM+Bz4zOs8+BzrHOvM68zrEgz4DOtc+BzrnOrs6zzrfPg863z4Igzq3Ph861zrkgzrXPgM65z4POus61z4bOuM61zq8gzrrOsc65IM+MzrvPic69IM+Ez4nOvSDPg861zrvOuc60zr/OtM61zrnOus+Ez47OvSDPhM6/z4Ugz4DPgc6/zrPPgc6szrzOvM6xz4TOv8+CIM+AzrXPgc65zq7Os863z4POt8+CLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+Is61zrPOs8+BzrHPhs6uIM65z4PPhM6/z4HOuc66zr/PjSDOus6xzrkgz4POtc67zrnOtM6/zrTOtc65zrrPhM+Ozr0gz4DPgc6/zrPPgc6szrzOvM6xz4TOv8+CIM+AzrXPgc65zq7Os863z4POt8+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gzr3OsSDPhM+Bzr/PgM6/z4DOv865zq7Pg861zrkgz4TOvyDOuc+Dz4TOv8+BzrnOus+MIM6uIM+Ezr/Phc+CIM+DzrXOu865zrTOv860zrXOr866z4TOtc+CIM+Ezr/PhSDPgM+Bzr/Os8+BzqzOvM68zrHPhM6/z4Igz4DOtc+BzrnOrs6zzrfPg863z4Igz4DOv8+FIM6yz4HOr8+DzrrOv869z4TOsc65IM6xz4DOv864zrfOus61z4XOvM6tzr3OsSDPg8+Ezr8gz4TOt867zq3Phs+Jzr3PjCDPg86xz4IuIM6azrHOus+MzrLOv8+FzrvOtc+CIM61z4bOsc+BzrzOv86zzq3PgiDOvM+Azr/Pgc6/z43OvSDOvc6xIM+Ezr8gz4fPgc63z4POuc68zr/PgM6/zrnOrs+Dzr/Phc69IM6zzrnOsSDOvc6xIM60zrnOsc6zz4HOrM+Izr/Phc69IM6uIM69zrEgz4TPgc6/z4DOv8+Azr/Ouc6uz4POv8+Fzr0gz4TOsSDOtM61zrTOv868zq3Ovc6xIM+Ezr/PhSDPgM+Bzr/Os8+BzqzOvM68zrHPhM6/z4Igz4DOtc+BzrnOrs6zzrfPg863z4IuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiLOpM+Bzr/PgM6/z4DOv86vzrfPg863IM60zrnOus6xzrnPic68zqzPhM+Jzr0gzrPOtc+JzrPPgc6xz4bOuc66zq7PgiDOuM6tz4POt8+CIM+Az4HOv86zz4HOrM68zrzOsc+Ezr/PgiDPgM61z4HOuc6uzrPOt8+DzrfPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gz4TPgc6/z4DOv8+Azr/Or863z4POtyDPhM+Jzr0gzrTOuc66zrHOuc+JzrzOrM+Ez4nOvSDOs861z4nOs8+BzrHPhs65zrrOrs+CIM64zq3Pg863z4Igz4TOv8+FIM+Az4HOv86zz4HOrM68zrzOsc+Ezr/PgiDPgM61z4HOuc6uzrPOt8+DzrfPgi4gzp/OuSDOus6xzrrPjM6yzr/Phc67zrXPgiDOtc+GzrHPgc68zr/Os86tz4IgzrzPgM6/z4HOv8+Nzr0gzr3OsSDPhM6/IM+Hz4HOt8+DzrnOvM6/z4DOv865zq7Pg86/z4XOvSDOs865zrEgzr3OsSDOtc+AzrnPhM+Bzq3PiM6/z4XOvSDPhM63zr0gzrHPgM6/z4PPhM6/zrvOriDPg8+Ezr/Ouc+HzrXOr8+Jzr0gz4TOv8+Azr/OuM61z4POr86xz4Igz4POtSDOsc+FzrjOsc6vz4HOtc+Ezr/Phc+CIM65z4PPhM+Mz4TOv8+Azr/Phc+CLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+Is6Yzq3Ou861z4TOtSDPhM6/IM+Az4HPjM6zz4HOsc68zrzOsSDPgM61z4HOuc6uzrPOt8+DzrfPgiDOvc6xIM60zrnOsc+EzrfPgc6uz4POtc65IM6xz4XPhM+Mzr0gz4TOv869IM66z4nOtM65zrrPjCDPgM+Bz4zPg86yzrHPg863z4I7Ijwvc3RyaW5nPgpAQCAtNzI2LDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLOlc+AzrnOu86/zrPOriDPjM67z4nOvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4izpXPgM65zrvOv86zzq4gzrvOrc6+zrfPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLOkc+Azr/Ous6/z4DOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4izpHOvc+EzrnOs8+BzrHPhs6uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4izpXPgM65zrrPjM67zrvOt8+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+Is6Rzr3PhM65zrPPgc6xz4bOriDOtM65zrXPjc64z4XOvc+DzrfPgiBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiLOlc+AzrnOu86/zrPOriDOus61zrnOvM6tzr3Ov8+FLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+Is6Vz4DOuc67zr/Os86uIM66zrXOuc68zq3Ovc6/z4UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLOnM6tzrjOv860zr/PgiDOtc65z4PPjM60zr/PhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLOoM+Bzr/Pg864zq7Ous63IM+EzrfPgiDOu86tzr7Ot8+CIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIM+Dz4TOvyDOu861zr7Ouc66z4wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLOlc+AzrXOvs61z4HOs86xz4POr86xIM66zrXOuc68zq3Ovc6/z4UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiLOlc69zq3Pgc6zzrXOuc61z4IgzrrOtc65zrzOrc69zr/PhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4izpHPgM6/zrzOrc69zrXOuSDOu86vzrPOv8+CIM61zrvOtc+NzrjOtc+Bzr/PgiDPh8+Oz4HOv8+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4izojPh861zrkgzrHPgM6/zrzOtc6vzr3Otc65IM67zq/Os86/z4IgzrXOu861z43OuM61z4HOv8+CIM6xz4DOv864zrfOus61z4XPhM65zrrPjM+CIM+Hz47Pgc6/z4Igz4PPhM6/IM+EzrfOu86tz4bPic69zr8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03NDEsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+Is6RzrrPjc+Bz4nPg863Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+Is6gz4HOv8+Dzr/Ph86uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLOps+Mz4HPhM+Jz4POty4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4izpXOvc61z4HOs86/z4DOv865zrfOvM6tzr3OvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Is6Rz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+Is6fzrvOv866zrvOrs+Bz4nPg863IM61zr3Orc+BzrPOtc65zrHPgiDOvM61IM+Ezrcgz4fPgc6uz4POtyI8L3N0cmluZz4KQEAgLTc1OSw5ICs3NTAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+Is6Rzr3Osc6zzrrOsc+Dz4TOuc66z4wgzrrOu861zq/Pg865zrzOvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiLOkc69zrHPhs6/z4HOrCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4izpHOvc6xzrzOv869zq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLOkc69zrHOus6xz4TOtc+NzrjPhc69z4POtyDOtc+GzrHPgc68zr/Os86uz4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Is6XIM61z4bOsc+BzrzOv86zzq4gPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDOtc66z4TOtc67zrXOr8+EzrHOuSDPhM+Oz4HOsS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Is6IzrPOuc69zrUgzrXOus66zq/Ovc63z4POtyDPgM+Bz47PhM6xIM+EzrfPgiDOtc+GzrHPgc68zr/Os86uz4IgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4izpcgzrXPhs6xz4HOvM6/zrPOriA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjOtM65zrXPgc6zzrHPg86vzrEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDPgM6xz4HOsc6yzq/Osc+DzrUgz4TOt869IM6xz4XPhM6/zrXPgM65zrLOsc67z4zOvM61zr3OtyDPgM6/zrvOuc+EzrnOus6uIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4izpcgzrTOuc61z4HOs86xz4POr86xIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDPgM6xz4HOsc6yzq/Osc+DzrUgz4TOt869IM6xz4XPhM6/zrXPgM65zrLOsc67z4zOvM61zr3OtyDPgM6/zrvOuc+EzrnOus6uIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiLOlyDOtc+GzrHPgc68zr/Os86uIDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IM61zrrPhM61zrvOtc6vz4TOsc65Ijwvc3RyaW5nPgpAQCAtODA4LDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+Is6VzrzPhs6szr3Ouc+Dzrcgz4zOu8+Jzr0iPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4izpzOsc62zrnOus6uIM6xz4DOv864zq7Ous61z4XPg863IFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+Is6kzr8gVVNCIM61zq/Ovc6xzrkgz4PPhc69zrTOtc60zrXOvM6tzr3OvyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+Is6jz4XOvc60zq3Pg86xz4TOtSDPhM6/IM+EzrfOu86tz4bPic69z4wgz4POsc+CIM+Dz4TOv869IM+Fz4DOv867zr/Os865z4PPhM6uIM68zq3Pg8+JIFVTQi4gzpXPgM65zrvOrc6+z4TOtSDPhM6/IM+AzrHPgc6xzrrOrM+Ez4kgzrrOv8+FzrzPgM6vIM6xzr0gzrjOrc67zrXPhM61IM69zrEgzrHOvc+EzrnOs8+BzqzPiM61z4TOtSDOsc+Bz4fOtc6vzrEgzrzOtc+EzrHOvs+NIM+Ezr/PhSDPhc+Azr/Ou86/zrPOuc+Dz4TOriDOus6xzrkgz4TOt8+CIM66zqzPgc+EzrHPgiBTRCDPhM6/z4UgQW5kcm9pZC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+Is6jz4XOvc60zq3Pg86xz4TOtSDPhM6/IM+EzrfOu86tz4bPic69z4wgz4POsc+CIM+Dz4TOv869IM+Fz4DOv867zr/Os865z4PPhM6uIM68zq3Pg8+JIFVTQi4gzpXPgM65zrvOrc6+z4TOtSDPhM6/IM+AzrHPgc6xzrrOrM+Ez4kgzrrOv8+FzrzPgM6vIM6xzr0gzrjOrc67zrXPhM61IM69zrEgzrHOvc+EzrnOs8+BzqzPiM61z4TOtSDOsc+Bz4fOtc6vzrEgzrzOtc+EzrHOvs+NIM+Ezr/PhSDPhc+Azr/Ou86/zrPOuc+Dz4TOriDOus6xzrkgz4TOt8+CIM66zqzPgc+EzrHPgiBTRCDPhM6/z4UgQW5kcm9pZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+Is6jz4XOvc60zq3Pg86xz4TOtSDPhM6/IM+EzrfOu86tz4bPic69z4wgz4POsc+CIM+Dz4TOv869IM+Fz4DOv867zr/Os865z4PPhM6uIM68zq3Pg8+JIFVTQi4gzpXPgM65zrvOrc6+z4TOtSDPhM6/IM+AzrHPgc6xzrrOrM+Ez4kgzrrOv8+FzrzPgM6vIM6xzr0gzrjOrc67zrXPhM61IM69zrEgzrHOvc+EzrnOs8+BzqzPiM61z4TOtSDOsc+Bz4fOtc6vzrEgzrzOtc+EzrHOvs+NIM+Ezr/PhSDPhc+Azr/Ou86/zrPOuc+Dz4TOriDOus6xzrkgz4TOt8+CIM66zqzPgc+EzrHPgiBTRCDPhM6/z4UgQW5kcm9pZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4izpXOvc61z4HOs86/z4DOv86vzrfPg863IM6xz4DOv864zrfOus61z4XPhM65zrrOv8+NIM+Hz47Pgc6/z4UgVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4izqDOsc+Bzr/Phc+DzrnOrM+Dz4TOt866zrUgzq3Ovc6xIM+Az4HPjM6yzrvOt868zrEgz4PPhM63IM+Hz4HOrs+Dzrcgz4TOt8+CIM66zqzPgc+EzrHPgiBTRCDPic+CIM6xz4DOv864zrfOus61z4XPhM65zrrPjCDPh8+Oz4HOvyBVU0IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiLOoM6xz4HOv8+Fz4POuc6sz4PPhM63zrrOtSDOrc69zrEgz4DPgc+MzrLOu863zrzOsSDPg8+Ezrcgz4fPgc6uz4POtyDPhM63z4IgzrrOrM+Bz4TOsc+CIFNEIM+Jz4IgzrHPgM6/zrjOt866zrXPhc+EzrnOus+MIM+Hz47Pgc6/IFVTQi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+Is6gzrHPgc6/z4XPg865zqzPg8+EzrfOus61IM6tzr3OsSDPgM+Bz4zOss67zrfOvM6xIM+Dz4TOtyDPh8+Bzq7Pg863IM+EzrfPgiDOus6sz4HPhM6xz4IgU0Qgz4nPgiDOsc+Azr/OuM63zrrOtc+Fz4TOuc66z4wgz4fPjs+Bzr8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiLOpM6/IFVTQiDOtc6vzr3Osc65IM+Dz4XOvc60zrXOtM61zrzOrc69zr8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiLOlc+AzrnOu86tzr7PhM61IM6zzrnOsSDOsc69z4TOuc6zz4HOsc+Gzq4gz4DPgc6/z4IvzrHPgM+MIM+Ezr/OvSDPhc+Azr/Ou86/zrPOuc+Dz4TOriDPg86xz4IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4izpHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyDOsc+Azr/OuM63zrrOtc+Fz4TOuc66zr/PjSDPh8+Oz4HOv8+FIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4izpXPgM65zrvOv86zzq4gzrPOuc6xIM6xz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+DzrcgzrHPgM6/zrjOt866zrXPhc+EzrnOus6/z40gz4fPjs+Bzr/PhSBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+Is6nz47Pgc6/z4IgzrHPgM6/zrjOrs66zrXPhc+DzrfPgiBVU0Igz4POtSDPh8+Bzq7Pg863Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiLOoM+Bzr/PhM6/z40gzrHPgM61zr3Otc+BzrPOv8+Azr/Ouc6uz4POtc+EzrUgz4TOvyDPh8+Oz4HOvyDOsc+Azr/OuM6uzrrOtc+Fz4POt8+CIFVTQiwgzrLOtc6yzrHOuc+JzrjOtc6vz4TOtSDPjM+Ezrkgzq3Ph861z4TOtSDOsc+Azr/Pg8+Fzr3OtM6tz4POtc65ICjigJzOsc+GzrHOuc+Bzq3Pg861zrnigJ0pIM+EzrfOvSDOus6sz4HPhM6xIFNEIM+Ezr/PhSBBbmRyb2lkIM6xz4DPjCDPhM6/zr0gz4XPgM6/zrvOv86zzrnPg8+Ezq4gz4POsc+CLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiLOoM+Bzr/PhM6/z40gzrHPgM61zr3Otc+BzrPOv8+Azr/Ouc6uz4POtc+EzrUgz4TOvyDPh8+Oz4HOvyDOsc+Azr/OuM6uzrrOtc+Fz4POt8+CIFVTQiwgzrLOtc6yzrHOuc+JzrjOtc6vz4TOtSDPjM+Ezrkgzq3Ph861z4TOtSDOsc+Azr/Pg8+Fzr3OtM6tz4POtc65ICjigJzOsc+GzrHOuc+Bzq3Pg861zrnigJ0pIM+EzrfOvSDOus6sz4HPhM6xIFNEIM+Ezr/PhSBBbmRyb2lkIM6xz4DPjCDPhM6/zr0gz4XPgM6/zrvOv86zzrnPg8+Ezq4gz4POsc+CLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiLOoM+Bzr/PhM6/z40gzrHPgM61zr3Otc+BzrPOv8+Azr/Ouc6uz4POtc+EzrUgz4TOvyDPh8+Oz4HOvyDOsc+Azr/OuM6uzrrOtc+Fz4POt8+CIFVTQiwgzrLOtc6yzrHOuc+JzrjOtc6vz4TOtSDPjM+Ezrkgzq3Ph861z4TOtSDOsc+Azr/Pg8+Fzr3OtM6tz4POtc65ICjigJzOsc+GzrHOuc+Bzq3Pg861zrnigJ0pIM+EzrfOvSDOus6sz4HPhM6xIFNEIM+Ezr/PhSBBbmRyb2lkIM6xz4DPjCDPhM6/zr0gz4XPgM6/zrvOv86zzrnPg8+Ezq4gz4POsc+CLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+Is6Rz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+Dzrcgz4fPjs+Bzr/PhSDOsc+Azr/OuM6uzrrOtc+Fz4POt8+CIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+Is6gzrHPgc6/z4XPg865zqzPg8+EzrfOus61IM+Az4HPjM6yzrvOt868zrEgzrrOsc+Ezqwgz4TOt869IM6xz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+Dzrcgz4TOv8+FIM6xz4DOv864zrfOus61z4XPhM65zrrOv8+NIM+Hz47Pgc6/z4UgVVNCLiDOks61zrLOsc65z4nOuM61zq/PhM61IM+Mz4TOuSDOrc+HzrXPhM61IM6xz4bOsc65z4HOrc+DzrXOuSDPhM63zr0gz4XPgM6/zrTOv8+Hzq4gVVNCIM66zrHOuSDPgM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+Is6Vzr3Otc+BzrPOv8+Azr/Or863z4POtyDOsc+Azr/OuM63zrrOtc+Fz4TOuc66zr/PjSDPh8+Oz4HOv8+FIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+Is6VzqzOvSDOtc69zrXPgc6zzr/PgM6/zrnOrs+DzrXPhM61IM+Ezr/OvSDOsc+Azr/OuM63zrrOtc+Fz4TOuc66z4wgz4fPjs+Bzr8gVVNCLCDOv8+BzrnPg868zq3Ovc61z4IgzrHPgM+MIM+EzrnPgiDOtc+GzrHPgc68zr/Os86tz4Igz4DOv8+FIM+Hz4HOt8+DzrnOvM6/z4DOv865zrXOr8+EzrUgzrjOsSDPg8+EzrHOvM6xz4TOrs+Dzr/Phc69IM66zrHOuSDOtc69zrTOrc+HzrXPhM6xzrkgzr3OsSDOvM63zr0gzrXOr869zrHOuSDOtM65zrHOuM6tz4POuc68zrXPgiDOvM6tz4fPgc65IM69zrEgzrHPgM61zr3Otc+BzrPOv8+Azr/Ouc6uz4POtc+EzrUgz4TOv869IM6xz4DOv864zrfOus61z4XPhM65zrrPjCDPh8+Oz4HOvyBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+Is6Rz4DOrc+Ez4XPh861IM63IM67zrXOuc+Ezr/Phc+BzrPOr86xIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiLOn86aIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiLOlM65zrHOvM+Mz4HPhs+Jz4POtyDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4izpTOuc6xzrzPjM+Bz4bPic+DzrcgzrrOrM+Bz4TOsc+CIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+Is6Vzq/Pg8+EzrUgzrLOrc6yzrHOuc6/zrkgz4zPhM65IM64zq3Ou861z4TOtSDOvc6xIM60zrnOsc68zr/Pgc+Gz47Pg861z4TOtSDPhM63zr0gzrrOrM+Bz4TOsSBTRDsgzozOu86xIM+EzrEgzrTOtc60zr/OvM6tzr3OsSDPg8+EzrfOvSDOus6sz4HPhM6xIM+DzrHPgiDOuM6xIM+HzrHOuM6/z43OvS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiLOlc6vz4PPhM61IM6yzq3Oss6xzrnOv865IM+Mz4TOuSDOuM6tzrvOtc+EzrUgzr3OsSDOtM65zrHOvM6/z4HPhs+Oz4POtc+EzrUgz4TOt869IM66zqzPgc+EzrEgU0Q7IM6MzrvOsSDPhM6xIM60zrXOtM6/zrzOrc69zrEgz4PPhM63zr0gzrrOrM+Bz4TOsSDPg86xz4IgzrjOsSDPh86xzrjOv8+Nzr0uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+Is6UzrnOsc68z4zPgc+Gz4nPg863IM66zqzPgc+EzrHPgiBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+Is6Vzq/Pg8+EzrUgzrLOrc6yzrHOuc6/zrkgz4zPhM65IM64zq3Ou861z4TOtSDOvc6xIM60zrnOsc68zr/Pgc+Gz47Pg861z4TOtSDPhM63zr0gzrrOrM+Bz4TOsSBTRDsgzozOu86xIM+EzrEgzrTOtc60zr/OvM6tzr3OsSDPg8+EzrfOvSDOus6sz4HPhM6xIM+DzrHPgiDOuM6xIM+HzrHOuM6/z43OvS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiLOlM65zrHOvM+Mz4HPhs+Jz4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+Is6jz4XOvc60zq3OuM63zrrOtSDOvyDOtc69z4TOv8+AzrnPg868z4zPgiDPg8+GzrHOu868zqzPhM+Jzr0gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiLOlc+AzrnOu86/zrPOriDOs865zrEgzrHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyDPhM6/z4UgzrXOvc+Ezr/PgM65z4POvM6/z40gz4PPhs6xzrvOvM6sz4TPic69IFVTQi4iPC9zdHJpbmc+CkBAIC04MzcsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiLPhc+Azr/PiM6uz4bOuc6/zrkiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4izqDPgc6/zrXPhM6/zrnOvM6xz4POr86xIM66zqzPgc+EzrHPgiBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4izqDPgc6/zrXPhM6/zrnOvM6xz4POr86xIM66zqzPgc+EzrHPgiBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4izqDPgc6/zrXPhM6/zrnOvM6xz4POr86xIM66zqzPgc+EzrHPgiBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiLOiM67zrXOs8+Hzr/PgiDOs865zrEgz4PPhs6szrvOvM6xz4TOsS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4izprOtc69zq4gzrrOrM+Bz4TOsSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+Is6azrXOvc6uIM66zqzPgc+EzrEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4izpcgzrrOrM+Bz4TOsSBTRCDOtc6vzr3Osc65IM66zrXOvc6uIM6uIM+Hz4HOt8+DzrnOvM6/z4DOv865zrXOryDPg8+Nz4PPhM63zrzOsSDOsc+Bz4fOtc6vz4nOvSDPgM6/z4UgzrTOtc69IM+Fz4DOv8+Dz4TOt8+Bzq/Ots61z4TOsc65LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+Is6XIM66zqzPgc+EzrEgU0QgzrXOr869zrHOuSDOus61zr3OriDOriDOrc+HzrXOuSDOvM63IM+Fz4DOv8+Dz4TOt8+BzrnOts+MzrzOtc69zr8gz4PPjc+Dz4TOt868zrEgzrHPgc+HzrXOr8+Jzr0uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4izprOsc+EzrXPg8+Ez4HOsc68zrzOrc69zrcgzrrOrM+Bz4TOsSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4izprOsc+EzrXPg8+Ez4HOsc68zrzOrc69zrcgzrrOrM+Bz4TOsSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4izpcgzrrOrM+Bz4TOsSBTRCDOrc+HzrXOuSDPhc+Azr/Pg8+EzrXOryDOss67zqzOss63LiDOlc69zrTOrc+HzrXPhM6xzrkgzr3OsSDPh8+BzrXOuc6xz4PPhM61zq8gzrHOvc6xzrTOuc6xzrzPjM+Bz4bPic+Dzrcgz4TOt8+CIM66zqzPgc+EzrHPgiDPg86xz4IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+Is6XIM66zqzPgc+EzrEgU0Qgz4DOsc+Bzr/Phc+DzrnOrM62zrXOuSDOss67zqzOss63LiDOlc69zrTOtc+Hzr/OvM6tzr3Pic+CIM64zrEgz4DPgc6tz4DOtc65IM69zrEgz4DPgc6/zrLOtc6vz4TOtSDPg861IM60zrnOsc68z4zPgc+Gz4nPg86uIM+EzrfPgi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+Is6czrcgzrHOvc6xzrzOtc69z4zOvM61zr3OtyDOsc+GzrHOr8+BzrXPg863IM66zqzPgc+EzrHPgiBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiLOnM63IM6xzr3Osc68zrXOvc+MzrzOtc69zrcgzrHPhs6xzq/Pgc61z4POtyDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4izpHPgM6/z4DPgc6/z4POsc+Bz4TOrs+Dz4TOtSDPhM63zr0gzrrOrM+Bz4TOsSBTRCDPgM+BzrnOvSDPhM63zr0gzrHPhs6xzrnPgc6tz4POtc+EzrUgzrPOuc6xIM+EzrfOvSDOsc+Azr/Phs+FzrPOriDOsc+Az47Ou861zrnOsc+CIM60zrXOtM6/zrzOrc69z4nOvS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLOkc+Azr/PgM+Bzr/Pg86xz4HPhM6uz4PPhM61IM+EzrfOvSDOus6sz4HPhM6xIFNEIM+Az4HOuc69IM+EzrfOvSDOsc+GzrHOuc+Bzq3Pg861z4TOtSDOs865zrEgz4TOt869IM6xz4DOv8+Gz4XOs86uIM6xz4DPjs67zrXOuc6xz4IgzrTOtc60zr/OvM6tzr3Pic69LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4izpcgzrrOrM+Bz4TOsSBTRCDOvM+Azr/Pgc61zq8gzr3OsSDOsc+GzrHOuc+BzrXOuM61zq8gzrzOtSDOsc+Dz4bOrM67zrXOuc6xIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4izpcgzrrOrM+Bz4TOsSBTRCDOvM+Azr/Pgc61zq8gzr3OsSDOsc+GzrHOuc+BzrXOuM61zq8gzrzOtSDOsc+Dz4bOrM67zrXOuc6xIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4izqTPjs+BzrEgzrzPgM6/z4HOtc6vz4TOtSDOvc6xIM6xz4bOsc65z4HOrc+DzrXPhM61IM68zrUgzrHPg8+GzqzOu861zrnOsSDPhM63zr0gzrrOrM+Bz4TOsSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4izpzPgM6/z4HOtc6vz4TOtSDOvc6xIM6xz4bOsc65z4HOrc+DzrXPhM61IM68zrUgzrHPg8+GzqzOu861zrnOsSDPhM63z4IgzrrOrM+Bz4TOsSBTRC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+Is6XIM66zqzPgc+EzrEgU0QgzrHPhs6xzrnPgc6tzrjOt866zrUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4izpcgzrrOrM+Bz4TOsSBTRCDOsc+GzrHOuc+Bzq3OuM63zrrOtSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiLOlyDOus6sz4HPhM6xIFNEIM6xz4bOsc65z4HOrc64zrfOus61LiDOlc65z4POsc6zzqzOs861z4TOtSDOvM65zrEgzr3Orc6xIM66zqzPgc+EzrEgU0QgzrPOuc6xIM69zrEgzrHPhc6+zq7Pg861z4TOtSDPhM6/zr0gzrHPgM6/zrjOt866zrXPhc+EzrnOus+MIM+Hz47Pgc6/IM+EzrfPgiDPg8+Fz4POus61z4XOrs+CIM+DzrHPgi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiLOkc+GzrHOuc+Bzq3OuM63zrrOtSDOtyDOus6sz4HPhM6xIFNELiDOpM6/z4DOv864zrXPhM6uz4PPhM61IM68zrnOsSDOvc6tzrEgzrrOrM+Bz4TOsS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiLOms61zr3OriDOus6sz4HPhM6xIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4izpcgzrrOrM+Bz4TOsSBTRCDOtc6vzr3Osc65IM66zrXOvc6uIM6uIM6tz4fOtc65IM68zrcgz4XPgM6/z4PPhM63z4HOuc62z4zOvM61zr3OvyDPg8+Nz4PPhM63zrzOsSDOsc+Bz4fOtc6vz4nOvS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+Is6azrHPhM61z4PPhM+BzrHOvM68zq3Ovc63IM66zqzPgc+EzrEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4izpcgzrrOrM+Bz4TOsSBTRCDPgM6xz4HOv8+Fz4POuc6szrbOtc65IM6yzrvOrM6yzrcuIM6Vzr3OtM61z4fOv868zq3Ovc+Jz4IgzrjOsSDPgM+Bzq3PgM61zrkgzr3OsSDPgM+Bzr/Oss61zq/PhM61IM+DzrUgzrTOuc6xzrzPjM+Bz4bPic+Dzq4gz4TOt8+CLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiLOnM63IM6xzr3Osc68zrXOvc+MzrzOtc69zrcgzrHPhs6xzq/Pgc61z4POtyDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLOkc+Azr/PgM+Bzr/Pg86xz4HPhM6uz4PPhM61IM+EzrfOvSDOus6sz4HPhM6xIFNEIM+Az4HOuc69IM+EzrfOvSDOsc+GzrHOuc+Bzq3Pg861z4TOtSDOs865zrEgz4TOt869IM6xz4DOv8+Gz4XOs86uIM6xz4DPjs67zrXOuc6xz4IgzrTOtc60zr/OvM6tzr3Pic69LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+Is6XIM66zqzPgc+EzrEgU0QgzrzPgM6/z4HOtc6vIM69zrEgzrHPhs6xzrnPgc61zrjOtc6vIM68zrUgzrHPg8+GzqzOu861zrnOsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiLOnM+Azr/Pgc61zq/PhM61IM69zrEgzrHPhs6xzrnPgc6tz4POtc+EzrUgzrzOtSDOsc+Dz4bOrM67zrXOuc6xIM+EzrfPgiDOus6sz4HPhM6xIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiLOlyDOus6sz4HPhM6xIFNEIM6xz4bOsc65z4HOrc64zrfOus61Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4izpHPhs6xzrnPgc6tzrjOt866zrUgzrcgzrrOrM+Bz4TOsSBTRC4gzqTOv8+Azr/OuM61z4TOrs+Dz4TOtSDOvM65zrEgzr3Orc6xIM66zqzPgc+EzrEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiLOlM61zr0gzrLPgc6tzrjOt866zrHOvSDOtM+BzrHPg8+EzrfPgc65z4zPhM63z4TOtc+CIM+Azr/PhSDOvc6xIM6xzr3PhM65z4PPhM6/zrnPh86/z43OvSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiLOtc69zrfOvM6tz4HPic+Dzrcgz4PPhM6xz4TOuc+Dz4TOuc66z47OvSDPh8+Bzq7Pg863z4Igz4PPhM6/zrnPh861zq/Ov8+FIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPhM63zr0gz4TPgc6/z4DOv8+Azr/Or863z4POtyDPg8+EzrHPhM65z4PPhM65zrrPjs69IM+Hz4HOrs+DzrfPgiDPg8+Ezr/Ouc+HzrXOr8+Jzr0gz4DOv8+FIM6tz4fOv8+Fzr0gz4PPhc67zrvOtc+HzrjOtc6vLiDOlM61zr0gz4DPgc6tz4DOtc65IM69zrEgz4fPgc63z4POuc68zr/PgM6/zrnOtc6vz4TOsc65IM6xz4DPjCDOus6xzr3Ov869zrnOus6tz4IgzrXPhs6xz4HOvM6/zrPOrc+CLiI8L3N0cmluZz4KQEAgLTg5NCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4izprOu861zrnOtM6vIHByZS1zaGFyZWQgzrLOrM+DzrXOuSBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiLOoM65z4PPhM6/z4DOv865zrfPhM65zrrPjCDOss6sz4POtc65IEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4izpXPgM65zrvOv86zzq4gzrHPgc+HzrXOr86/z4UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLOlM61zr0gzq3Ph861zrkgzrXPgM65zrvOtc6zzrXOryDOsc+Bz4fOtc6vzr8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLOlc+AzrHOvc6xz4bOv8+BzqwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4izqXPgM6/zrLOv867zq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+Is6xzrPOsc+AzrfOvM6tzr3OvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Is6XIM67zrXOuc+Ezr/Phc+BzrPOr86xIM6xz4XPhM6/zrrOuc69zq7PhM6/z4UgzrXOr869zrHOuSDOtc69zrXPgc6zzr/PgM6/zrnOt868zq3Ovc63Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+Is6Vz4DOuc67zq3Ovs+EzrUgzrPOuc6xIM6tzr7Ov860zr8gzrHPgM+MIM+EzrcgzrvOtc65z4TOv8+Fz4HOs86vzrEgzrHPhc+Ezr/Ous65zr3Ors+Ezr/PhS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4izqPPjc69zrTOtc+DzrcgzrzOrc+Dz4kgzrrOuc69zrfPhM6uz4Igz4PPhc+DzrrOtc+Fzq7PgiDOriDPg863zrzOtc6vzr/PhSDPgM+Bz4zPg86yzrHPg863z4IgzrXOvc61z4HOs86uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4izpHOs86zzq/Ovs+EzrUgzrPOuc6xIM69zrEgzrPOr869zrXOuSDOtM65zrHOvM+Mz4HPhs+Jz4POtyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+Is6gzq/Pg8+JIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4izpXPgM+MzrzOtc69zr8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLOoM6xz4HOrM6yzrvOtc+IzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLOpc+IzrfOu86uIM+Hz4HOrs+DzrcgzrTOtc60zr/OvM6tzr3Pic69IM66zrnOvc63z4TOrs+CIM+EzrfOu861z4bPic69zq/Osc+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLOkc6zzrPOr86+z4TOtSDOs865zrEgzr3OsSDOvM6szrjOtc+EzrUgz4DOtc+BzrnPg8+Dz4zPhM61z4HOsSDPg8+HzrXPhM65zrrOrCDOvM61IM+Ezrcgz4fPgc6uz4POtyDOtM61zrTOv868zq3Ovc+Jzr0gzrrOuc69zrfPhM6uz4Igz4TOt867zrXPhs+Jzr3Or86xz4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Is6ezrXPgM61z4HOrM+Dz4TOt866zrUgz4TOvyDPjM+BzrnOvyDOtM61zrTOv868zq3Ovc+Jzr0gzrrOuc69zrfPhM6uz4Igz4TOt867zrXPhs+Jzr3Or86xz4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4izpHOs86zzq/Ovs+EzrUgzrPOuc6xIM69zrEgzrzOrM64zrXPhM61IM+AzrXPgc65z4PPg8+Mz4TOtc+BzrEgz4PPh861z4TOuc66zqwgzrzOtSDPhM63IM+Hz4HOrs+DzrcgzrTOtc60zr/OvM6tzr3Pic69IM66zrnOvc63z4TOrs+CIM+EzrfOu861z4bPic69zq/Osc+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiLOlM61zr0gz4XPgM6sz4HPh86/z4XOvSDOsc+Azr/PhM61zrvOrc+DzrzOsc+EzrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiIG1zZ2lkPSIxOTQ2Nzk5MjMzODIyODIwMzg0Ij4izpXPjc+BzrXPg863IM+Dz4TOtyDPg861zrvOr860zrEiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMSDOsc+Azr/PhM6tzrvOtc+DzrzOsSI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IM6xz4DPjCA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAppbmRleCA0MDZkMzM1Li5mZTI3Yjk1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbApAQCAtMTY5LDggKzE2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjM0NDYxNjQ1ODQ3MTA1OTY1MTMiPiJIZXJyYW1pZW50YXMgZGUgZGVzYXJyb2xsbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiJMYXMgZnVuY2lvbmVzIHPDs2xvIHNvbiBuZWNlc2FyaWFzIHBhcmEgbG9zIGRlc2Fycm9sbGFkb3JlcyBkZSBhcGxpY2FjaW9uZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iRXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iQWNjZWRlciBhIGxhIHRhcmpldGEgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkFjY2VkZXIgYSBsYSB0YXJqZXRhIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJBY2NlZGVyIGEgbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiJkZXNhY3RpdmFyIG8gbW9kaWZpY2FyIGxhIGJhcnJhIGRlIGVzdGFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJBZG1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIGRlc2FjdGl2ZSBsYSBiYXJyYSBkZSBlc3RhZG8sIG8gYWdyZWd1ZSB5IGVsaW1pbmUgw61jb25vcyBkZWwgc2lzdGVtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4iYmFycmEgZGUgZXN0YWRvIjwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSBsaWJlcmEgZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byBlbiBlbCB0ZWzDqWZvbm8gYWwgZWxpbWluYXIgYXJjaGl2b3MgZGVsIGRpcmVjdG9yaW8gZGUgbWVtb3JpYSBjYWNow6kgZGUgbGEgYXBsaWNhY2nDs24uIEVuIGdlbmVyYWwsIGVsIGFjY2VzbyBlcyBtdXkgcmVzdHJpbmdpZG8gcGFyYSBlbCBwcm9jZXNvIGRlbCBzaXN0ZW1hLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiJNb3ZlciByZWN1cnNvcyBkZSBsYSBhcGxpY2FjacOzbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IlBlcm1pdGUgYSB1bmEgYXBsaWNhY2nDs24gbW92ZXIgcmVjdXJzb3MgZGUgYXBsaWNhY2nDs24gZGUgbWVkaW9zIGludGVybm9zIGEgZXh0ZXJub3MgeSB2aWNldmVyc2EuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiJsZWUgbG9zIGRhdG9zIGNvbmZpZGVuY2lhbGVzIGRlbCByZWdpc3RybyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IkFkbWl0ZSB1bmEgYXBsaWNhY2nDs24gcXVlIGxlZSBkaXZlcnNvcyBhcmNoaXZvcyBkZSByZWdpc3RybyBkZWwgc2lzdGVtYS4gRXN0byB0ZSBwZXJtaXRlIGRlc2N1YnJpciBpbmZvcm1hY2nDs24gZ2VuZXJhbCBhY2VyY2EgZGUgbG8gcXVlIGhhY2VzIGNvbiBlbCB0ZWzDqWZvbm8sIHkgcHVlZGUgcG90ZW5jaWFsbWVudGUgaW5jbHVpciBpbmZvcm1hY2nDs24gcGVyc29uYWwgbyBwcml2YWRhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+ImxlZXIgeSBlc2NyaWJpciBhIHJlY3Vyc29zIGRlbnRybyBkZWwgZ3J1cG8gZGUgZGlhZ27Ds3N0aWNvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSBsZWUgeSBlc2NyaWJlIGEgY3VhbHF1aWVyIHJlY3Vyc28gZGVudHJvIGRlbCBncnVwbyBkZSBkaWFnbsOzc3RpY287IHBvciBlamVtcGxvLCBhcmNoaXZvcyBjb24gL2Rldi4gRXN0byBwdWVkZSBhZmVjdGFyIHBvdGVuY2lhbG1lbnRlIGxhIGVzdGFiaWxpZGFkIHkgbGEgc2VndXJpZGFkIGRlbCBzaXN0ZW1hLiBEZWJlIHV0aWxpemFybG8gU8OTTE8gZWwgZmFicmljYW50ZSBvIGVsIG9wZXJhZG9yIGVuIGxvcyBkaWFnbsOzc3RpY29zIGVzcGVjw61maWNvcyBkZWwgaGFyZHdhcmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iYWN0aXZhciBvIGRlc2FjdGl2YXIgY29tcG9uZW50ZXMgZGUgbGEgYXBsaWNhY2nDs24iPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSBjb25maWd1cmEgZWwgdGVsw6lmb25vIEJsdWV0b290aCBsb2NhbCB5IGRlc2N1YnJlIHkgc2UgdmluY3VsYSBjb24gZGlzcG9zaXRpdm9zIHJlbW90b3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iY3JlYXIgY29uZXhpb25lcyBkZSBCbHVldG9vdGgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSB2ZSBsYSBjb25maWd1cmFjacOzbiBkZWwgdGVsw6lmb25vIEJsdWV0b290aCBsb2NhbCwgeSByZWFsaXphIHkgYWNlcHRhIGNvbmV4aW9uZXMgY29uIGRpc3Bvc2l0aXZvcyB2aW5jdWxhZG9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJkZXNhY3RpdmFyIGVsIGJsb3F1ZW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4iQWRtaXRlIHVuYSBhcGxpY2FjacOzbiBxdWUgZGVzYWN0aXZhIGVsIGJsb3F1ZW8geSBjdWFscXVpZXIgc2VndXJpZGFkIGNvbiBjb250cmFzZcOxYSByZWxhY2lvbmFkYS4gVW4gZWplbXBsbyBsZWfDrXRpbW8gZGUgZXN0byBlcyBlbCBibG9xdWVvIGRlc2FjdGl2YWRvIHBvciBlbCB0ZWzDqWZvbm8gY3VhbmRvIHJlY2liZSB1bmEgbGxhbWFkYSB0ZWxlZsOzbmljYSBlbnRyYW50ZSwgeSBsdWVnbyBsYSByZWFjdGl2YWNpw7NuIGRlbCBibG9xdWVvIGN1YW5kbyBmaW5hbGl6YSBsYSBsbGFtYWRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiJsZWVyIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIHNpbmNyb25pemFjacOzbiI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHBhcmEgbGVlciBwYWxhYnJhcywgbm9tYnJlcyB5IGZyYXNlcyBwcml2YWRhcyBxdWUgcG9zaWJsZW1lbnRlIGVsIHVzdWFyaW8gaGF5YSBhbG1hY2VuYWRvIGVuIGVsIGRpY2Npb25hcmlvIGRlbCB1c3VhcmlvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+ImVzY3JpYmlyIGFsIGRpY2Npb25hcmlvIGRlZmluaWRvIHBvciBlbCB1c3VhcmlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IkFkbWl0ZSB1bmEgYXBsaWNhY2nDs24gcXVlIGVzY3JpYmUgcGFsYWJyYXMgbnVldmFzIGVuIGVsIGRpY2Npb25hcmlvIGRlbCB1c3VhcmlvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4ibW9kaWZpY2FyL3N1cHJpbWlyIGVsIGNvbnRlbmlkbyBkZSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXIvc3VwcmltaXIgZWwgY29udGVuaWRvIGRlIGxhIHRhcmpldGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iQWRtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gZXNjcmliYSBlbiBsYSB0YXJqZXRhIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkFkbWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGVzY3JpYmEgZW4gbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9zdXByaW1pciBlbCBjb250ZW5pZG8gZGUgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkFkbWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGVzY3JpYmEgZW4gbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iQWNjZWRlciBhbCBzaXN0ZW1hIGRlIGFyY2hpdm9zIGNhY2jDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGxlYSB5IGVzY3JpYmEgZWwgc2lzdGVtYSBkZSBhcmNoaXZvcyBjYWNow6kuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iTGltaXRhciBsYSBjb250cmFzZcOxYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiJSZXN0cmluZ2UgbG9zIHRpcG9zIGRlIGNvbnRyYXNlw7FhcyBxdWUgcHVlZGVzIHV0aWxpemFyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iT2JzZXJ2YXIgbG9zIGludGVudG9zIGRlIGFjY2VzbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJJbnRlbnRvcyBmYWxsaWRvcyBkZWwgY29udHJvbCBwYXJhIGFjY2VkZXIgYWwgZGlzcG9zaXRpdm8gcGFyYSByZWFsaXphciBhbGd1bmEgYWNjacOzbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJSZXN0YWJsZWNlciBjb250cmFzZcOxYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDMzMzIxNjc2MDAzMzE3OTk5OTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjUzOTEyNDA2MTY5ODEyOTczNjEiPiJGb3J6YXIgdW4gbnVldm8gdmFsb3IgcGFyYSB0dSBjb250cmFzZcOxYSwgZWwgYWRtaW5pc3RyYWRvciBkZWJlcsOhIGVudmnDoXJ0ZWxvIGFudGVzIGRlIHBvZGVyIGFjY2VkZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJQcm92b2NhciBlbCBibG9xdWVvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iQ29udHJvbGFyIGN1YW5kbyBzZSBibG9xdWVlIGVsIGRpc3Bvc2l0aXZvLCByZXF1aWVyZSBxdWUgdnVlbHZhcyBhIGluZ3Jlc2FyIHR1IGNvbnRyYXNlw7FhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IkxpbWl0YXIgbGEgY29udHJhc2XDsWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iUmVzdHJpbmdlIGxvcyB0aXBvcyBkZSBjb250cmFzZcOxYXMgcXVlIHB1ZWRlcyB1dGlsaXphci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJPYnNlcnZhciBsb3MgaW50ZW50b3MgZGUgYWNjZXNvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+IkludGVudG9zIGZhbGxpZG9zIGRlbCBjb250cm9sIHBhcmEgYWNjZWRlciBhbCBkaXNwb3NpdGl2byBwYXJhIHJlYWxpemFyIGFsZ3VuYSBhY2Npw7NuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IlJlc3RhYmxlY2VyIGNvbnRyYXNlw7FhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IkZvcnphciB1biBudWV2byB2YWxvciBwYXJhIHR1IGNvbnRyYXNlw7FhLCBlbCBhZG1pbmlzdHJhZG9yIGRlYmVyw6EgZW52acOhcnRlbG8gYW50ZXMgZGUgcG9kZXIgYWNjZWRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+IlByb3ZvY2FyIGVsIGJsb3F1ZW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJDb250cm9sYXIgY3VhbmRvIHNlIGJsb3F1ZWUgZWwgZGlzcG9zaXRpdm8sIHJlcXVpZXJlIHF1ZSB2dWVsdmFzIGEgaW5ncmVzYXIgdHUgY29udHJhc2XDsWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkJvcnJhciB0b2RvcyBsb3MgZGF0b3MiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IlJlYWxpemFyIHVuIHJlZXN0YWJsZWNpbWllbnRvIGRlIGbDoWJyaWNhIHkgYm9ycmFyIHRvZG9zIHR1cyBkYXRvcyBzaW4gbmluZ3VuYSBjb25maXJtYWNpw7NuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iUmVhbGl6YXIgdW4gcmVlc3RhYmxlY2ltaWVudG8gZGUgZsOhYnJpY2EgeSBib3JyYXIgdG9kb3MgdHVzIGRhdG9zIHNpbiBuaW5ndW5hIGNvbmZpcm1hY2nDs24uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iQ29uZmlndXJhY2nDs24gZGVsIHByb3h5IGdsb2JhbCBkZSBkaXNwb3NpdGl2byBxdWUgc2UgdXRpbGl6YXLDoSBtaWVudHJhcyBzZSBoYWJpbGl0YSBsYSBwb2zDrXRpY2EuIFPDs2xvIGxhIHByaW1lcmEgYWRtaW5pc3RyYWNpw7NuIGRlIGRpc3Bvc2l0aXZvIGNvbmZpZ3VyYSBlbCBwcm94eSBnbG9iYWwgZWZlY3Rpdm8uIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iQ2FzYSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IkNlbHVsYXIiPC9pdGVtPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJUcmFiYWpvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik90cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlQ3VzdG9tIiBtc2dpZD0iMjQ3MzU4MDU5MzExMTU5MDk0NSI+IlBlcnNvbmFsaXphZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUhvbWUiIG1zZ2lkPSI2MDkzNTk4MTgxMDY5MzU5Mjk1Ij4iUMOhZ2luYSBwcmluY2lwYWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZVdvcmsiIG1zZ2lkPSI2OTIwNzI1NzMwNzk3MDk5MDQ3Ij4iVHJhYmFqbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlT3RoZXIiIG1zZ2lkPSI0NDA4NDM2MTYyOTUwMTE5ODQ5Ij4iT3RybyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVDdXN0b20gKDI0NzM1ODA1OTMxMTE1OTA5NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVIb21lICg2MDkzNTk4MTgxMDY5MzU5Mjk1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlV29yayAoNjkyMDcyNTczMDc5NzA5OTA0NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW5ncmVzYXIgZWwgY8OzZGlnbyBkZSBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkluZ3Jlc2FyIGxhIGNvbnRyYXNlw7FhIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkluZ3Jlc2EgZWwgUElOIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiLCoUPDs2RpZ28gZGUgUElOIGluY29ycmVjdG8hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIsIHByZXNpb25hIGVsIG1lbsO6IHkgbHVlZ28gMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO6bWVybyBkZSBlbWVyZ2VuY2lhIjwvc3RyaW5nPgpAQCAtNTY0LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlJlZ3Jlc2FyIGEgbGxhbWFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJlY3RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkxvIHNlbnRpbW9zLCB2dWVsdmUgYSBpbnRlbnRhcmxvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJMbyBzZW50aW1vcywgdnVlbHZlIGEgaW50ZW50YXJsbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNhcmdhbmRvICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJnYWRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiJTZWdtZW50byA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTc4LDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJMYSB0YXJqZXRhIFNJTSBlc3TDoSBibG9xdWVhZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRGVzYmxvcXVlYW5kbyB0YXJqZXRhIFNJTeKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkhhcyBleHRyYcOtZG8gaW5jb3JyZWN0YW1lbnRlIHR1IHBhdHLDs24gZGUgZGVzYmxvcXVlbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gIlxuXG4iVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJIYXMgaW5ncmVzYWRvIHR1IGNvbnRyYXNlw7FhIGRlIG1hbmVyYSBpbmNvcnJlY3RhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJIYXMgaW5ncmVzYWRvIHR1IFBJTiBkZSBtYW5lcmEgaW5jb3JyZWN0YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gIlxuXG4iVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkhhcyBleHRyYcOtZG8gaW5jb3JyZWN0YW1lbnRlIHR1IHBhdHLDs24gZGUgZGVzYmxvcXVlbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gTHVlZ28gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgaW5jb3JyZWN0b3MsIHNlIHRlIHNvbGljaXRhcsOhIHF1ZSBkZXNibG9xdWVlcyB0dSB0ZWzDqWZvbm8gYWwgaW5pY2lhciBzZXNpw7NuIGVuIEdvb2dsZS4gIlxuXG4iIFZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iwr9PbHZpZGFzdGUgZWwgcGF0csOzbj8iPC9zdHJpbmc+CkBAIC02MDYsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4iwr9EZXNlYXMgc2FsaXIgZGUgZXN0YSBww6FnaW5hPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJTZWxlY2Npb25hIEFjZXB0YXIgcGFyYSBjb250aW51YXIgbyBDYW5jZWxhciBwYXJhIHBlcm1hbmVjZXIgZW4gbGEgcMOhZ2luYSBhY3R1YWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9sYWJlbCIgbXNnaWQ9IjY4NjAyNjE3NTg2NjU4MjUwNjkiPiJDb25maXJtYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IlN1Z2VyZW5jaWE6IHByZXNpb25hIGRvcyB2ZWNlcyBwYXJhIGFjZXJjYXIgeSBhbGVqYXIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiJsZWVyIGhpc3RvcmlhbCB5IG1hcmNhZG9yZXMgZGVsIG5hdmVnYWRvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IlBlcm1pdGUgYSBsYSBhcGxpY2FjacOzbiBsZWVyIHRvZGFzIGxhcyBVUkwgcXVlIGhhIHZpc2l0YWRvIGVsIG5hdmVnYWRvciB5IHRvZG9zIGxvcyBtYXJjYWRvcmVzIGRlbCBuYXZlZ2Fkb3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4iZXNjcmliaXIgaGlzdG9yaWFsIHkgbWFyY2Fkb3JlcyBkZWwgbmF2ZWdhZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4iUGVybWl0ZSBhIHVuYSBhcGxpY2FjacOzbiBtb2RpZmljYXIgZWwgaGlzdG9yaWFsIHkgbG9zIG1hcmNhZG9yZXMgZGVsIG5hdmVnYWRvciBhbG1hY2VuYWRvcyBlbiB0dSB0ZWzDqWZvbm8uIExhcyBhcGxpY2FjaW9uZXMgbWFsaWNpb3NhcyBwdWVkZW4gdXRpbGl6YXJsbyBwYXJhIGJvcnJhciBvIG1vZGlmaWNhciB0dXMgZGF0b3MuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJNb2RpZmljYXIgbG9zIHBlcm1pc29zIGRlIHViaWNhY2nDs24gZ2VvZ3LDoWZpY2EgZGVsIG5hdmVnYWRvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gbW9kaWZpcXVlIGxvcyBwZXJtaXNvcyBkZSB1YmljYWNpw7NuIGdlb2dyw6FmaWNhIGRlbCBuYXZlZ2Fkb3IuIExhcyBhcGxpY2FjaW9uZXMgbWFsaWNpb3NhcyBwdWVkZW4gdXRpbGl6YXJsb3MgcGFyYSBwZXJtaXRpciBlbCBlbnbDrW8gZGUgaW5mb3JtYWNpw7NuIHNvYnJlIGxhIHViaWNhY2nDs24gYSBzaXRvcyB3ZWIgZGUgZm9ybWEgYXJiaXRyYXJpYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLCv1F1aWVyZXMgcmVjb3JkYXIgZXN0YSBjb250cmFzZcOxYSBlbiBlbCBuYXZlZ2Fkb3I/Ijwvc3RyaW5nPgpAQCAtNzI2LDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2Npb25hciB0b2RvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iU2VsZWNjaW9uYXIgcGFsYWJyYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJDb3J0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IlBlZ2FyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpYXIgVVJMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iU2VsZWNjaW9uYXIgdGV4dG8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iU2VsZWNjacOzbiBkZSB0ZXh0byAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQWdyZWdhciBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkaXRhciB0ZXh0byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+IkFjY2lvbmVzIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJQb2NvIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJIYXkgcG9jbyBlc3BhY2lvIGRlIGFsbWFjZW5hbWllbnRvIGVuIGVsIHRlbMOpZm9uby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJBY2VwdGFyIjwvc3RyaW5nPgpAQCAtNzQxLDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iQWNlcHRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkNhbmNlbGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkF0ZW5jacOzbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iQ2FyZ2FuZG8uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkVuY2VuZGlkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkFQQUdBRE8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbXBsZXRhciBsYSBhY2Npw7NuIG1lZGlhbnRlIjwvc3RyaW5nPgpAQCAtNzU5LDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iUHJvdm9jYXIgYWNlcmNhbWllbnRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+Ik5vdGlmaWNhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iRXNwZXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iU2UgcmVkaXJpZ2nDsyBsYSBhcGxpY2FjacOzbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBzZSBlc3TDoSBlamVjdXRhbmRvIGFob3JhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBzZSBpbmljacOzIG9yaWdpbmFsbWVudGUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkxhIGFwbGljYWNpw7NuIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYSB2aW9sYWRvIHN1IHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG9pbXB1ZXN0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJFbCBwcm9jZXNvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYSB2aW9sYWRvIHN1IHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG9pbXB1ZXN0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IENvcnJlciI8L3N0cmluZz4KQEAgLTgwOCwyOCArODAyLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19zaG93X2FsbCIgbXNnaWQ9IjI2NzE3OTExNjM5MzMwOTExODAiPjxiPiJNb3N0cmFyIHRvZG9zIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IkFsbWFjZW5hbWllbnRvIG1hc2l2byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJjb25lY3RhZG8gYWwgVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4iSGFzIGNvbmVjdGFkbyB0dSB0ZWzDqWZvbm8gYSB0dSBjb21wdXRhZG9yYSBtZWRpYW50ZSBVU0IuIFNlbGVjY2lvbmEgZWwgYm90w7NuIGEgY29udGludWFjacOzbiBzaSBkZXNlYXMgY29waWFyIGxvcyBhcmNoaXZvcyBlbnRyZSB0dSBjb21wdXRhZG9yYSB5IGxhIHRhcmpldGEgU0QgZGUgQW5kcm9pZC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IkhhcyBjb25lY3RhZG8gdHUgdGVsw6lmb25vIGEgdHUgY29tcHV0YWRvcmEgbWVkaWFudGUgVVNCLiBTZWxlY2Npb25hIGVsIGJvdMOzbiBhIGNvbnRpbnVhY2nDs24gc2kgZGVzZWFzIGNvcGlhciBsb3MgYXJjaGl2b3MgZW50cmUgdHUgY29tcHV0YWRvcmEgeSBsYSB0YXJqZXRhIFNEIGRlIEFuZHJvaWQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJIYXMgY29uZWN0YWRvIHR1IHRlbMOpZm9ubyBhIHR1IGNvbXB1dGFkb3JhIG1lZGlhbnRlIFVTQi4gU2VsZWNjaW9uYSBlbCBib3TDs24gYSBjb250aW51YWNpw7NuIHNpIGRlc2VhcyBjb3BpYXIgbG9zIGFyY2hpdm9zIGVudHJlIHR1IGNvbXB1dGFkb3JhIHkgbGEgdGFyamV0YSBTRCBkZSBBbmRyb2lkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiJBY3RpdmFyIGVsIGFsbWFjZW5hbWllbnRvIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IkhheSB1biBwcm9ibGVtYSBwYXJhIHV0aWxpemFyIHR1IHRhcmpldGEgU0QgZW4gZWwgYWxtYWNlbmFtaWVudG8gVVNCLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iSGF5IHVuIHByb2JsZW1hIHBhcmEgdXRpbGl6YXIgdHUgdGFyamV0YSBTRCBlbiBlbCBhbG1hY2VuYW1pZW50byBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJIYXkgdW4gcHJvYmxlbWEgcGFyYSB1dGlsaXphciB0dSB0YXJqZXRhIFNEIGVuIGVsIGFsbWFjZW5hbWllbnRvIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iY29uZWN0YWRvIGFsIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IlNlbGVjY2lvbmFyIHBhcmEgY29waWFyIGFyY2hpdm9zIGRlc2RlIG8gaGFjaWEgdHUgY29tcHV0YWRvcmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4iQXBhZ2FyIGVsIGFsbWFjZW5hbWllbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iU2VsZWNjaW9uYXIgcGFyYSBkZXNhY3RpdmFyIGVsIGFsbWFjZW5hbWllbnRvIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iQWxtYWNlbmFtaWVudG8gVVNCIGVuIHVzbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iQW50ZXMgZGUgZGVzYWN0aXZhciBlbCBhbG1hY2VuYW1pZW50byBVU0IsIGFzZWfDunJhdGUgZGUgaGFiZXIgZGVzbW9udGFkbyAoXCJleHB1bHNhZG9cIikgbGEgdGFyamV0YSBTRCBkZSBBbmRyb2lkIGRlIHR1IGNvbXB1dGFkb3JhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJBbnRlcyBkZSBkZXNhY3RpdmFyIGVsIGFsbWFjZW5hbWllbnRvIFVTQiwgYXNlZ8O6cmF0ZSBkZSBoYWJlciBkZXNtb250YWRvIChcImV4cHVsc2Fkb1wiKSBsYSB0YXJqZXRhIFNEIGRlIEFuZHJvaWQgZGUgdHUgY29tcHV0YWRvcmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IkFudGVzIGRlIGRlc2FjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCLCBhc2Vnw7pyYXRlIGRlIGhhYmVyIGRlc21vbnRhZG8gKFwiZXhwdWxzYWRvXCIpIGxhIHRhcmpldGEgU0QgZGUgQW5kcm9pZCBkZSB0dSBjb21wdXRhZG9yYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJEZXNhY3RpdmFyIGVsIGFsbWFjZW5hbWllbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IlNlIGhhIHByb2R1Y2lkbyB1biBwcm9ibGVtYSBhbCBkZXNhY3RpdmFyIGVsIGFsbWFjZW5hbWllbnRvIFVTQi4gQXNlZ8O6cmF0ZSBkZSBoYWJlciBkZXNtb250YWRvIGVsIGhvc3QgVVNCLCBsdWVnbyB2dWVsdmUgYSBpbnRlbnRhcmxvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+IkFjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iU2kgYWN0aXZhcyBlbCBhbG1hY2VuYW1pZW50byBVU0IsIGFsZ3VuYXMgYXBsaWNhY2lvbmVzIHF1ZSBlc3TDoXMgdXNhbmRvIHNlIGRldGVuZHLDoW4geSBlcyBwb3NpYmxlIHF1ZSBubyBlc3TDqW4gZGlzcG9uaWJsZXMgaGFzdGEgcXVlIGRlc2FjdGl2ZXMgZWwgYWxtYWNlbmFtaWVudG8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiJFcnJvciBlbiBlbCBmdW5jaW9uYW1pZW50byBkZWwgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+IkFjZXB0YXIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IkZvcm1hdGVhciB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVhciB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IsK/RXN0w6FzIHNlZ3VybyBkZSBxdWUgcXVpZXJlcyBmb3JtYXRlYXIgbGEgdGFyamV0YSBTRD8gU2UgcGVyZGVyw6FuIHRvZG9zIGxvcyBkYXRvcyBkZSB0dSB0YXJqZXRhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IsK/RXN0w6FzIHNlZ3VybyBkZSBxdWUgcXVpZXJlcyBmb3JtYXRlYXIgbGEgdGFyamV0YSBTRD8gU2UgcGVyZGVyw6FuIHRvZG9zIGxvcyBkYXRvcyBkZSB0dSB0YXJqZXRhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRlYXIgdGFyamV0YSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IsK/RXN0w6FzIHNlZ3VybyBkZSBxdWUgcXVpZXJlcyBmb3JtYXRlYXIgbGEgdGFyamV0YSBTRD8gU2UgcGVyZGVyw6FuIHRvZG9zIGxvcyBkYXRvcyBkZSB0dSB0YXJqZXRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkZvcm1hdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJEZXB1cmFjacOzbiBkZSBVU0IgY29uZWN0YWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJTZWxlY2Npb25hciBwYXJhIGRlc2FjdGl2YXIgbGEgZGVwdXJhY2nDs24gZGUgVVNCLiI8L3N0cmluZz4KQEAgLTgzNywyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+ImNhbmRpZGF0b3MiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iUHJlcGFyYWNpw7NuIGRlIGxhIHRhcmpldGEgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByZXBhcmFjacOzbiBkZSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJQcmVwYXJhY2nDs24gZGUgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJWZXJpZmljYW5kbyBlcnJvcmVzIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IlRhcmpldGEgU0QgdmFjw61hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iVGFyamV0YSBTRCB2YWPDrWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iTGEgdGFyamV0YSBTRCBlc3TDoSB2YWPDrWEgbyB1dGlsaXphIHVuIGZpbGVzeXN0ZW0gbm8gYWRtaXRpZG8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iVGFyamV0YSBTRCBlbiBibGFuY28gbyBlbCBzaXN0ZW1hIGRlIGFyY2hpdm9zIG5vIGVzIGNvbXBhdGlibGUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4iVGFyamV0YSBTRCBkYcOxYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJUYXJqZXRhIFNEIGRhw7FhZGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IkxhIHRhcmpldGEgU0QgZXN0w6EgZGHDsWFkYS4gRXMgcG9zaWJsZSBxdWUgZGViYXMgcmVmb3JtYXRlYXIgdHUgdGFyamV0YS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iVGFyamV0YSBTRCBkYcOxYWRhLiBFcyBwb3NpYmxlIHF1ZSBkZWJhcyByZWZvcm1hdGVhcmxhLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iVGFyamV0YSBTRCBleHRyYcOtZGEgZGUgZm9ybWEgaW1wcmV2aXN0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJUYXJqZXRhIFNEIGV4dHJhw61kYSBkZSBmb3JtYSBpbXByZXZpc3RhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+IkRlc21vbnRhciBsYSB0YXJqZXRhIFNEIGFudGVzIGRlIGV4dHJhZXJsYSBwYXJhIGV2aXRhciBsYSBww6lyZGlkYSBkZSBkYXRvcy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEZXNtb250YXIgbGEgdGFyamV0YSBTRCBhbnRlcyBkZSBleHRyYWVybGEgcGFyYSBldml0YXIgbGEgcMOpcmRpZGEgZGUgZGF0b3MuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiJUYXJqZXRhIFNEIGbDoWNpbCBkZSBleHRyYWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iVGFyamV0YSBTRCBmw6FjaWwgZGUgZXh0cmFlciI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IkxhIHRhcmpldGEgU0QgYWhvcmEgc2UgcHVlZGUgZXh0cmFlciBkZSBtYW5lcmEgc2VndXJhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJQdWVkZXMgZWxpbWluYXIgbGEgdGFyamV0YSBTRCBzaW4gcmllc2dvcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+IlRhcmpldGEgU0QgZXh0cmHDrWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlRhcmpldGEgU0QgZXh0cmHDrWRhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IlNlIGV4dHJham8gbGEgU0QuIEluc2VydGEgdW5hIG52YS4gdGFyamV0YSBTRCBwYXJhIGF1bWVudGFyIGVsIGVzcGFjaW8gZGUgYWxtYWMuIGRlIHR1IGRpc3Bvc2l0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlRhcmpldGEgU0QgZWxpbWluYWRhLiBJbnNlcnRhIHVuYSBudWV2YS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJUYXJqZXRhIFNEIHZhY8OtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlRhcmpldGEgU0QgZW4gYmxhbmNvIG8gZWwgc2lzdGVtYSBkZSBhcmNoaXZvcyBubyBlcyBjb21wYXRpYmxlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iVGFyamV0YSBTRCBkYcOxYWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlRhcmpldGEgU0QgZGHDsWFkYS4gRXMgcG9zaWJsZSBxdWUgZGViYXMgcmVmb3JtYXRlYXJsYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iVGFyamV0YSBTRCBleHRyYcOtZGEgZGUgZm9ybWEgaW1wcmV2aXN0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkRlc21vbnRhciBsYSB0YXJqZXRhIFNEIGFudGVzIGRlIGV4dHJhZXJsYSBwYXJhIGV2aXRhciBsYSBww6lyZGlkYSBkZSBkYXRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJUYXJqZXRhIFNEIGbDoWNpbCBkZSBleHRyYWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlB1ZWRlcyBlbGltaW5hciBsYSB0YXJqZXRhIFNEIHNpbiByaWVzZ29zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJUYXJqZXRhIFNEIGV4dHJhw61kYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlRhcmpldGEgU0QgZWxpbWluYWRhLiBJbnNlcnRhIHVuYSBudWV2YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+Ik5vIHNlIGVuY29udHJhcm9uIGFjdGl2aWRhZGVzIGNvaW5jaWRlbnRlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiJhY3R1YWxpemFyIGxhIGVzdGFkw61zdGljYSBkZSB1c28gZGUgbG9zIGNvbXBvbmVudGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IlBlcm1pdGUgbGEgbW9kaWZpY2FjacOzbiBkZSBlc3RhZMOtc3RpY2FzIHJlY29waWxhZGFzIHNvYnJlIGVsIHVzbyBkZSBjb21wb25lbnRlcy4gTGFzIGFwbGljYWNpb25lcyBub3JtYWxlcyBubyBkZWJlbiB1dGlsaXphcmxvLiI8L3N0cmluZz4KQEAgLTg5NCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iQ2xhdmUgcHJldmlhbWVudGUgY29tcGFydGlkYSBzZWfDum4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWNhZG8gc2Vnw7puIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iRWxlZ2lyIGFyY2hpdm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJObyBzZSBzZWxlY2Npb27DsyB1biBhcmNoaXZvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlc3RhYmxlY2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RvIGF1dG8gaGFiaWxpdGFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY2Npb25hciBwYXJhIHNhbGlyIGRlbCBtb2RvIGF1dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iQW5jbGFqZSBhIHJlZCBvIHpvbmEgYWN0aXZhIGNvbmVjdGFkb3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb2NhciBwYXJhIGNvbmZpZ3VyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJBdHLDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJTaWd1aWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJPbWl0aXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJBbXBsaWEgdXRpbGl6YWNpw7NuIGRlIGRhdG9zIG3Ds3ZpbGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb2NhIHBhcmEgb2J0ZW5lciBtw6FzIGluZm9ybWFjacOzbiBhY2VyY2EgZGUgbGEgdXRpbGl6YWNpw7NuIGRlIGRhdG9zIG3Ds3ZpbGVzLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTMOtbWl0ZSBkZSBkYXRvcyBtw7N2aWxlcyBleGNlZGlkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTMOtbWl0ZSBkZSBkYXRvcyBtw7N2aWxlcyBleGNlZGlkbyAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4iVG9jYSBwYXJhIG9idGVuZXIgbcOhcyBpbmZvcm1hY2nDs24gYWNlcmNhIGRlIGxhIHV0aWxpemFjacOzbiBkZSBkYXRvcyBtw7N2aWxlcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+IlNpbiBjb2luY2lkZW5jaWFzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IkJ1c2NhciBlbiBsYSBww6FnaW5hIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgY29pbmNpZGVuY2lhIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4gZGUgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmluZGV4IDFjZjk3MWEuLjEwZWNhY2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbApAQCAtMTY5LDggKzE2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjM0NDYxNjQ1ODQ3MTA1OTY1MTMiPiJIZXJyYW1pZW50YXMgZGUgZGVzYXJyb2xsbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiJGdW5jaW9uZXMgbmVjZXNhcmlhcyBzb2xvIHBhcmEgZGVzYXJyb2xsYWRvcmVzIGRlIGFwbGljYWNpb25lcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9zdG9yYWdlIiBtc2dpZD0iMTk3MTExODc3MDU0NjMzNjk2NiI+IkFsbWFjZW5hbWllbnRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJBY2NlZGVyIGEgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJBY2NlZGVyIGEgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJBY2NlZGVyIGEgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+ImluaGFiaWxpdGFyIG8gbW9kaWZpY2FyIGxhIGJhcnJhIGRlIGVzdGFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJQZXJtaXRlIHF1ZSBsYXMgYXBsaWNhY2lvbmVzIGluaGFiaWxpdGVuIGxhIGJhcnJhIGRlIGVzdGFkbywgbyBhw7FhZGFuIHkgZWxpbWluZW4gaWNvbm9zIGRlbCBzaXN0ZW1hLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiJiYXJyYSBkZSBlc3RhZG8iPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBsaWJlcmUgZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byBlbiBlbCB0ZWzDqWZvbm8gbWVkaWFudGUgbGEgZWxpbWluYWNpw7NuIGRlIGFyY2hpdm9zIGVuIGVsIGRpcmVjdG9yaW8gZGUgY2FjaMOpIGRlIGxhIGFwbGljYWNpw7NuLiBFbCBhY2Nlc28gYWwgcHJvY2VzbyBkZWwgc2lzdGVtYSBzdWVsZSBlc3RhciBtdXkgcmVzdHJpbmdpZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3ZlUGFja2FnZSIgbXNnaWQ9IjcyODQ1NDk3OTk0NjUwMzkyNiI+Ik1vdmVyIHJlY3Vyc29zIGRlIGFwbGljYWNpb25lcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBtdWV2YSBsb3MgcmVjdXJzb3MgZGUgYXBsaWNhY2lvbmVzIGRlIHVuIG1lZGlvIGludGVybm8gYSBvdHJvIGV4dGVybm8geSB2aWNldmVyc2EuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiJsZWVyIGRhdG9zIGRlIHJlZ2lzdHJvIHBlcnNvbmFsZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgbXNnaWQ9Ijg4OTY0NDk0Mzc0NjQ4Njc3NjYiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gbGVhIGRpc3RpbnRvcyBhcmNoaXZvcyBkZSByZWdpc3RybyBkZWwgc2lzdGVtYS4gQ29uIGVzdGUgcGVybWlzbywgbGEgYXBsaWNhY2nDs24gcHVlZGUgdmVyIGluZm9ybWFjacOzbiBnZW5lcmFsIHNvYnJlIGxhcyBhY2Npb25lcyBxdWUgcmVhbGl6YXMgY29uIGVsIHRlbMOpZm9ubywgcXVlIHB1ZWRlIGluY2x1aXIgZGF0b3MgcGVyc29uYWxlcyBvIHByaXZhZG9zLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+ImxlZXIvZXNjcmliaXIgZW4gbG9zIHJlY3Vyc29zIHByb3BpZWRhZCBkZWwgZ3J1cG8gZGUgZGlhZ27Ds3N0aWNvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gbGVhIHkgZXNjcmliYSBlbiBjdWFscXVpZXIgcmVjdXJzbyBwcm9waWVkYWQgZGVsIGdydXBvIGRlIGRpYWduw7NzdGljbyBjb21vLCBwb3IgZWplbXBsbywgYXJjaGl2b3MgaW4vZGV2LiBFc3RlIHBlcm1pc28gcG9kcsOtYSBhZmVjdGFyIGEgbGEgc2VndXJpZGFkIHkgZXN0YWJpbGlkYWQgZGVsIHNpc3RlbWEuIFPDk0xPIHNlIGRlYmUgdXRpbGl6YXIgcGFyYSBkaWFnbsOzc3RpY29zIGVzcGVjw61maWNvcyBkZSBoYXJkd2FyZSByZWFsaXphZG9zIHBvciBlbCBmYWJyaWNhbnRlIG8gZWwgb3BlcmFkb3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iaGFiaWxpdGFyIG8gaW5oYWJpbGl0YXIgY29tcG9uZW50ZXMgZGUgbGEgYXBsaWNhY2nDs24iPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gY29uZmlndXJlIGVsIHRlbMOpZm9ubyBCbHVldG9vdGggbG9jYWwsIHkgdmVhIGRpc3Bvc2l0aXZvcyByZW1vdG9zIHkgc2luY3JvbmljZSBlbCB0ZWzDqWZvbm8gY29uIGVsbG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+ImNyZWFyIGNvbmV4aW9uZXMgZGUgQmx1ZXRvb3RoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIHZlYSBsYSBjb25maWd1cmFjacOzbiBkZWwgdGVsw6lmb25vIEJsdWV0b290aCBsb2NhbCwgeSBjcmVlIHkgYWNlcHRlIGNvbmV4aW9uZXMgY29uIGxvcyBkaXNwb3NpdGl2b3Mgc2luY3Jvbml6YWRvcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iaW5oYWJpbGl0YXIgYmxvcXVlbyBkZWwgdGVjbGFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gaW5oYWJpbGl0ZSBlbCBibG9xdWVvIGRlbCB0ZWNsYWRvIHkgY3VhbHF1aWVyIHByb3RlY2Npw7NuIGNvbiBjb250cmFzZcOxYSBhc29jaWFkYS4gVW4gZWplbXBsbyBsZWfDrXRpbW8gZGUgZXN0ZSBwZXJtaXNvIGVzIGxhIGluaGFiaWxpdGFjacOzbiBwb3IgcGFydGUgZGVsIHRlbMOpZm9ubyBkZWwgYmxvcXVlbyBkZWwgdGVjbGFkbyBjdWFuZG8gcmVjaWJlIHVuYSBsbGFtYWRhIHRlbGVmw7NuaWNhIGVudHJhbnRlIHkgc3UgcG9zdGVyaW9yIGhhYmlsaXRhY2nDs24gY3VhbmRvIGZpbmFsaXphIGxhIGxsYW1hZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+ImxlZXIgbGEgY29uZmlndXJhY2nDs24gZGUgc2luY3Jvbml6YWNpw7NuIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IlBlcm1pdGUgYSB1bmEgYXBsaWNhY2nDs24gbGVlciBjdWFscXVpZXIgZnJhc2UsIHBhbGFicmEgbyBub21icmUgcHJpdmFkbyBxdWUgZWwgdXN1YXJpbyBoYXlhIGFsbWFjZW5hZG8gZW4gc3UgZGljY2lvbmFyaW8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4iZXNjcmliaXIgZW4gZWwgZGljY2lvbmFyaW8gZGVmaW5pZG8gcG9yIGVsIHVzdWFyaW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4iUGVybWl0ZSBhIHVuYSBhcGxpY2FjacOzbiBlc2NyaWJpciBwYWxhYnJhcyBudWV2YXMgZW4gZWwgZGljY2lvbmFyaW8gZGUgdXN1YXJpby4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+Im1vZGlmaWNhci9lbGltaW5hciBjb250ZW5pZG8gZGUgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyL2VsaW1pbmFyIGNvbnRlbmlkbyBkZSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBlc2NyaWJhIGVuIGxhIHRhcmpldGEgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGVzY3JpYmEgZW4gbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9lbGltaW5hciBjb250ZW5pZG8gZGUgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBlc2NyaWJhIGVuIGxhIHRhcmpldGEgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+ImFjY2VkZXIgYWwgc2lzdGVtYSBkZSBhcmNoaXZvcyBhbG1hY2VuYWRvIGVuIGNhY2jDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGxlYSB5IGVzY3JpYmEgZWwgc2lzdGVtYSBkZSBhcmNoaXZvcyBhbG1hY2VuYWRvIGVuIGNhY2jDqS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiJMaW1pdGFyIG9wY2lvbmVzIGRlIGNvbnRyYXNlw7FhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IlBlcm1pdGUgcmVzdHJpbmdpciBsb3MgdGlwb3MgZGUgY29udHJhc2XDsWFzIHF1ZSBwdWVkZSB1dGlsaXphciBlbCB1c3VhcmlvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iQ29udHJvbGFyIGludGVudG9zIGRlIGFjY2VzbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgaW50ZW50YXIgY29udHJvbGFyIGVsIGFjY2VzbyBhbCBkaXNwb3NpdGl2byBwYXJhIHJlYWxpemFyIHVuYSBhY2Npw7NuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+IlJlc3RhYmxlY2VyIGNvbnRyYXNlw7FhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IlBlcm1pdGUgZm9yemFyIGxhIGNvbnRyYXNlw7FhIHBhcmEgZXN0YWJsZWNlciB1biB2YWxvciBudWV2byBxdWUgZWwgYWRtaW5pc3RyYWRvciBkZWJlcsOhIHByb3BvcmNpb25hciBhbCB1c3VhcmlvIHBhcmEgcG9kZXIgYWNjZWRlci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IkZvcnphciBibG9xdWVvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iUGVybWl0ZSBjb250cm9sYXIgZWwgbW9tZW50byBkZSBibG9xdWVvIGRlbCBkaXNwb3NpdGl2byBzb2xpY2l0YW5kbyBhbCB1c3VhcmlvIHF1ZSB2dWVsdmEgYSBpbnRyb2R1Y2lyIGxhIGNvbnRyYXNlw7FhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IkxpbWl0YXIgb3BjaW9uZXMgZGUgY29udHJhc2XDsWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iUGVybWl0ZSByZXN0cmluZ2lyIGxvcyB0aXBvcyBkZSBjb250cmFzZcOxYXMgcXVlIHB1ZWRlIHV0aWxpemFyIGVsIHVzdWFyaW8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4iQ29udHJvbGFyIGludGVudG9zIGRlIGFjY2VzbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiJTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgaW50ZW50YXIgY29udHJvbGFyIGVsIGFjY2VzbyBhbCBkaXNwb3NpdGl2byBwYXJhIHJlYWxpemFyIHVuYSBhY2Npw7NuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IlJlc3RhYmxlY2VyIGNvbnRyYXNlw7FhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IlBlcm1pdGUgZm9yemFyIGxhIGNvbnRyYXNlw7FhIHBhcmEgZXN0YWJsZWNlciB1biB2YWxvciBudWV2byBxdWUgZWwgYWRtaW5pc3RyYWRvciBkZWJlcsOhIHByb3BvcmNpb25hciBhbCB1c3VhcmlvIHBhcmEgcG9kZXIgYWNjZWRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+IkZvcnphciBibG9xdWVvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iUGVybWl0ZSBjb250cm9sYXIgZWwgbW9tZW50byBkZSBibG9xdWVvIGRlbCBkaXNwb3NpdGl2byBzb2xpY2l0YW5kbyBhbCB1c3VhcmlvIHF1ZSB2dWVsdmEgYSBpbnRyb2R1Y2lyIGxhIGNvbnRyYXNlw7FhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJCb3JyYXIgdG9kb3MgbG9zIGRhdG9zIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiJQZXJtaXRlIHJlYWxpemFyIHVuIHJlc3RhYmxlY2ltaWVudG8gZGUgZsOhYnJpY2EgZWxpbWluYW5kbyB0b2RvcyBsb3MgZGF0b3Mgc2luIGNvbmZpcm1hY2nDs24uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJQZXJtaXRlIHJlYWxpemFyIHVuIHJlc3RhYmxlY2ltaWVudG8gZGUgZsOhYnJpY2EgZWxpbWluYW5kbyB0b2RvcyBsb3MgZGF0b3Mgc2luIGNvbmZpcm1hY2nDs24uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iRGVmaW5lIGVsIHNlcnZpZG9yIHByb3h5IGdsb2JhbCBxdWUgc2UgZGViZSB1dGlsaXphciBtaWVudHJhcyBsYSBwb2zDrXRpY2EgZXN0w6kgaGFiaWxpdGFkYS4gU29sbyBlbCBwcmltZXIgYWRtaW5pc3RyYWRvciBkZSBkaXNwb3NpdGl2b3MgZGVmaW5lIGVsIHNlcnZpZG9yIHByb3h5IGdsb2JhbCBlZmVjdGl2by4iPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJDYXNhIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTcOzdmlsIjwvaXRlbT4KQEAgLTU0NCwxNCArNTMwLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iVHJhYmFqbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJPdHJhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbmFsaXphZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiJQZXJzb25hbGl6YWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVIb21lIiBtc2dpZD0iNjA5MzU5ODE4MTA2OTM1OTI5NSI+IkNhc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZVdvcmsiIG1zZ2lkPSI2OTIwNzI1NzMwNzk3MDk5MDQ3Ij4iVHJhYmFqbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlT3RoZXIiIG1zZ2lkPSI0NDA4NDM2MTYyOTUwMTE5ODQ5Ij4iT3RybyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVDdXN0b20gKDI0NzM1ODA1OTMxMTE1OTA5NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVIb21lICg2MDkzNTk4MTgxMDY5MzU5Mjk1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlV29yayAoNjkyMDcyNTczMDc5NzA5OTA0NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW50cm9kdWNlIGVsIGPDs2RpZ28gUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbnRyb2R1Y2lyIGNvbnRyYXNlw7FhIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkludHJvZHVjaXIgUElOIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJFbCBjw7NkaWdvIFBJTiBlcyBpbmNvcnJlY3RvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyIGVsIHRlbMOpZm9ubywgcHVsc2EgbGEgdGVjbGEgZGUgbWVuw7ogeSwgYSBjb250aW51YWNpw7NuLCBwdWxzYSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7ptZXJvIGRlIGVtZXJnZW5jaWEiPC9zdHJpbmc+CkBAIC01NjQsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iVm9sdmVyIGEgbGxhbWFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJlY3RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkludMOpbnRhbG8gZGUgbnVldm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkludMOpbnRhbG8gZGUgbnVldm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDYXJnYW5kbyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2FyZ2FkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU3OCw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iSW50cm9kdWNlIGVsIGPDs2RpZ28gUElOLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkRlc2Jsb3F1ZWFuZG8gdGFyamV0YSBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJIYXMgcmVhbGl6YWRvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGZhbGxpZG9zIGRlIGNyZWFjacOzbiBkZSB1biBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8uICJcblxuIkludMOpbnRhbG8gZGUgbnVldm8gZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkhhcyBpbnRyb2R1Y2lkbyB1bmEgY29udHJhc2XDsWEgaW5jb3JyZWN0YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gIlxuXG4iSW50w6ludGFsbyBkZSBudWV2byBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkhhcyBpbnRyb2R1Y2lkbyB1biBQSU4gaW5jb3JyZWN0byA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gIlxuXG4iSW50w6ludGFsbyBkZSBudWV2byBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJIYXMgcmVhbGl6YWRvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGZhbGxpZG9zIGRlIGNyZWFjacOzbiBkZWwgcGF0csOzbiBkZSBkZXNibG9xdWVvLiBTaSByZWFsaXphcyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBpbnRlbnRvcyBmYWxsaWRvcyBtw6FzLCBzZSB0ZSBwZWRpcsOhIHF1ZSBkZXNibG9xdWVlcyBlbCB0ZWzDqWZvbm8gY29uIHR1cyBjcmVkZW5jaWFsZXMgZGUgYWNjZXNvIGRlIEdvb2dsZS4iXG5cbiIgRXNwZXJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zIGUgaW50w6ludGFsbyBkZSBudWV2by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iRXNwZXJhIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcyB5IHZ1ZWx2ZSBhIGludGVudGFybG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLCv0hhcyBvbHZpZGFkbyBlbCBwYXRyw7NuPyI8L3N0cmluZz4KQEAgLTYwNiwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiLCv1F1aWVyZXMgc2FsaXIgZGUgZXN0YSBww6FnaW5hPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJTZWxlY2Npb25hIFwiQWNlcHRhclwiIHBhcmEgY29udGludWFyIG8gXCJDYW5jZWxhclwiIHBhcmEgcGVybWFuZWNlciBlbiBsYSBww6FnaW5hIGFjdHVhbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkNvbmZpcm1hciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iU3VnZXJlbmNpYTogdG9jYSBkb3MgdmVjZXMgcGFyYSBhbXBsaWFyIG8gcmVkdWNpci4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiJsZWVyIGluZm9ybWFjacOzbiBkZSBtYXJjYWRvcmVzIHkgZGVsIGhpc3RvcmlhbCBkZWwgbmF2ZWdhZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iUGVybWl0ZSBxdWUgbGEgYXBsaWNhY2nDs24gbGVhIHRvZGFzIGxhcyBVUkwgcXVlIGhhIHZpc2l0YWRvIGVsIG5hdmVnYWRvciB5IHRvZG9zIHN1cyBtYXJjYWRvcmVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+ImVzY3JpYmlyIGVuIG1hcmNhZG9yZXMgeSBlbiBlbCBoaXN0b3JpYWwgZGVsIG5hdmVnYWRvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBtb2RpZmlxdWUgbGEgaW5mb3JtYWNpw7NuIGRlIGxvcyBtYXJjYWRvcmVzIG8gZGVsIGhpc3RvcmlhbCBkZWwgbmF2ZWdhZG9yIGFsbWFjZW5hZGEgZW4gZWwgdGVsw6lmb25vLiBMYXMgYXBsaWNhY2lvbmVzIG1hbGludGVuY2lvbmFkYXMgcHVlZGVuIHV0aWxpemFyIGVzdGUgcGVybWlzbyBwYXJhIGJvcnJhciBvIG1vZGlmaWNhciBsb3MgZGF0b3MgZGVsIG5hdmVnYWRvci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+Ik1vZGlmaWNhciBsb3MgcGVybWlzb3MgZGUgdWJpY2FjacOzbiBnZW9ncsOhZmljYSBkZWwgbmF2ZWdhZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBtb2RpZmlxdWUgbG9zIHBlcm1pc29zIGRlIHViaWNhY2nDs24gZ2VvZ3LDoWZpY2EgZGVsIG5hdmVnYWRvci4gTGFzIGFwbGljYWNpb25lcyBtYWxpbnRlbmNpb25hZGFzIHB1ZWRlbiB1dGlsaXphciBlc3RlIHBlcm1pc28gcGFyYSBwZXJtaXRpciBlbCBlbnbDrW8gZGUgaW5mb3JtYWNpw7NuIHNvYnJlIGxhIHViaWNhY2nDs24gYSBzaXRpb3Mgd2ViIGFyYml0cmFyaW9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IsK/RGVzZWFzIHF1ZSBlbCBuYXZlZ2Fkb3IgcmVjdWVyZGUgZXN0YSBjb250cmFzZcOxYT8iPC9zdHJpbmc+CkBAIC03MjYsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjY2lvbmFyIHRvZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGVjY2lvbmFyIHBhbGFicmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQ29ydGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJQZWdhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+IlNlbGVjY2lvbmFyIHRleHRvLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlNlbGVjY2nDs24gZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGludHJvZHVjY2nDs24gZGUgdGV4dG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQcOxYWRpciBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkaXRhciB0ZXh0byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+IkFjY2lvbmVzIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJQb2NvIGVzcGFjaW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJTZSBlc3TDoSBhZ290YW5kbyBlbCBlc3BhY2lvIGRlIGFsbWFjZW5hbWllbnRvIGRlbCB0ZWzDqWZvbm8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iQWNlcHRhciI8L3N0cmluZz4KQEAgLTc0MSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IkFjZXB0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJDYW5jZWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdGVuY2nDs24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNhcmdhbmRv4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBY3RpdmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkRlc2NvbmVjdGFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGFyIGFjY2nDs24gdXRpbGl6YW5kbyI8L3N0cmluZz4KQEAgLTc1OSw5ICs3NTAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IkZvcnphciBjaWVycmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iSW5mb3JtZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iRXNwZXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwbGljYWNpw7NuIHJlZGlyZWNjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHNlIGVzdMOhIGVqZWN1dGFuZG8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiJJbmljaWFsbWVudGUsIHNlIGluaWNpw7MgbGEgYXBsaWNhY2nDs24gPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iTGEgYXBsaWNhY2nDs24gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhIGluZnJpbmdpZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2FwbGljYWJsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJFbCBwcm9jZXNvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYSBpbmZyaW5naWRvIHN1IHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG9hcGxpY2FibGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBlbiBlamVjdWNpw7NuIjwvc3RyaW5nPgpAQCAtODA4LDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+Ik1vc3RyYXIgdG9kb3MiPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iQWxtYWNlbmFtaWVudG8gVVNCIG1hc2l2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IkNvbmVjdGFkbyBwb3IgVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4iSGFzIGNvbmVjdGFkbyBlbCB0ZWzDqWZvbm8gYWwgZXF1aXBvIG1lZGlhbnRlIFVTQi4gU2VsZWNjaW9uYSBlbCBib3TDs24gc2l0dWFkbyBkZWJham8gc2kgZGVzZWFzIGNvcGlhciBhcmNoaXZvcyBlbnRyZSBlbCBlcXVpcG8geSBsYSB0YXJqZXRhIFNEIGRlbCB0ZWzDqWZvbm8gY29uIEFuZHJvaWQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJIYXMgY29uZWN0YWRvIGVsIHRlbMOpZm9ubyBhbCBlcXVpcG8gbWVkaWFudGUgVVNCLiBTZWxlY2Npb25hIGVsIGJvdMOzbiBzaXR1YWRvIGRlYmFqbyBzaSBkZXNlYXMgY29waWFyIGFyY2hpdm9zIGVudHJlIGVsIGVxdWlwbyB5IGxhIHRhcmpldGEgU0QgZGVsIHRlbMOpZm9ubyBjb24gQW5kcm9pZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IkhhcyBjb25lY3RhZG8gZWwgdGVsw6lmb25vIGFsIGVxdWlwbyBtZWRpYW50ZSBVU0IuIFNlbGVjY2lvbmEgZWwgYm90w7NuIHNpdHVhZG8gZGViYWpvIHNpIGRlc2VhcyBjb3BpYXIgYXJjaGl2b3MgZW50cmUgZWwgZXF1aXBvIHkgbGEgdGFyamV0YSBTRCBkZWwgdGVsw6lmb25vIGNvbiBBbmRyb2lkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiJBY3RpdmFyIGFsbWFjZW5hbWllbnRvIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IlNlIGhhIHByb2R1Y2lkbyB1biBwcm9ibGVtYSBhbCBpbnRlbnRhciB1dGlsaXphciBsYSB0YXJqZXRhIFNEIHBhcmEgZWwgYWxtYWNlbmFtaWVudG8gVVNCLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iU2UgaGEgcHJvZHVjaWRvIHVuIHByb2JsZW1hIGFsIGludGVudGFyIHV0aWxpemFyIGxhIHRhcmpldGEgU0QgcGFyYSBlbCBhbG1hY2VuYW1pZW50byBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJTZSBoYSBwcm9kdWNpZG8gdW4gcHJvYmxlbWEgYWwgaW50ZW50YXIgdXRpbGl6YXIgbGEgdGFyamV0YSBTRCBwYXJhIGVsIGFsbWFjZW5hbWllbnRvIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iQ29uZWN0YWRvIHBvciBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJQYXJhIGNvcGlhciBhcmNoaXZvcyBhbC9kZXNkZSBlbCBlcXVpcG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJEZXNhY3RpdmFyIGFsbWFjZW5hbWllbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iU2VsZWNjaW9uYXIgcGFyYSBkZXNhY3RpdmFyIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iRWwgYWxtYWNlbmFtaWVudG8gVVNCIGVzdMOhIGVuIHVzby4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IkFudGVzIGRlIGRlc2FjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCLCBhc2Vnw7pyYXRlIGRlIGhhYmVyIGRlc21vbnRhZG8gKFwicmV0aXJhZG9cIikgbGEgdGFyamV0YSBTRCBkZWwgdGVsw6lmb25vIGNvbiBBbmRyb2lkIGRlbCBlcXVpcG8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IkFudGVzIGRlIGRlc2FjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCLCBhc2Vnw7pyYXRlIGRlIGhhYmVyIGRlc21vbnRhZG8gKFwicmV0aXJhZG9cIikgbGEgdGFyamV0YSBTRCBkZWwgdGVsw6lmb25vIGNvbiBBbmRyb2lkIGRlbCBlcXVpcG8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IkFudGVzIGRlIGRlc2FjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCLCBhc2Vnw7pyYXRlIGRlIGhhYmVyIGRlc21vbnRhZG8gKFwicmV0aXJhZG9cIikgbGEgdGFyamV0YSBTRCBkZWwgdGVsw6lmb25vIGNvbiBBbmRyb2lkIGRlbCBlcXVpcG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iRGVzYWN0aXZhciBhbG1hY2VuYW1pZW50byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJTZSBoYSBwcm9kdWNpZG8gdW4gcHJvYmxlbWEgYWwgZGVzYWN0aXZhciBlbCBhbG1hY2VuYW1pZW50byBVU0IuIEFzZWfDunJhdGUgZGUgaGFiZXIgZGVzYWN0aXZhZG8gZWwgaG9zdCBVU0IgeSwgYSBjb250aW51YWNpw7NuLCB2dWVsdmUgYSBpbnRlbnRhcmxvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+IkFjdGl2YXIgYWxtYWNlbmFtaWVudG8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iU2kgYWN0aXZhcyBlbCBhbG1hY2VuYW1pZW50byBVU0IsIHNlIGRldGVuZHLDoW4gYWxndW5hcyBhcGxpY2FjaW9uZXMgcXVlIGVzdMOhcyB1dGlsaXphbmRvIHkgZXN0YXMgbm8gZXN0YXLDoW4gZGlzcG9uaWJsZXMgaGFzdGEgcXVlIGxvIGRlc2FjdGl2ZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+Ik5vIHNlIGhhIHBvZGlkbyByZWFsaXphciBsYSBvcGVyYWNpw7NuIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJBY2VwdGFyIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiJGb3JtYXRlYXIgdGFyamV0YSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRlYXIgdGFyamV0YSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiLCv0VzdMOhcyBzZWd1cm8gZGUgcXVlIHF1aWVyZXMgZm9ybWF0ZWFyIGxhIHRhcmpldGEgU0Q/IFNlIHBlcmRlcsOhbiB0b2RvcyBsb3MgZGF0b3MgZGUgbGEgdGFyamV0YS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiLCv0VzdMOhcyBzZWd1cm8gZGUgcXVlIHF1aWVyZXMgZm9ybWF0ZWFyIGxhIHRhcmpldGEgU0Q/IFNlIHBlcmRlcsOhbiB0b2RvcyBsb3MgZGF0b3MgZGUgbGEgdGFyamV0YS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybWF0ZWFyIHRhcmpldGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiLCv0VzdMOhcyBzZWd1cm8gZGUgcXVlIHF1aWVyZXMgZm9ybWF0ZWFyIGxhIHRhcmpldGEgU0Q/IFNlIHBlcmRlcsOhbiB0b2RvcyBsb3MgZGF0b3MgZGUgbGEgdGFyamV0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiJGb3JtYXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iRGlzcG9zaXRpdm8gZGUgZGVwdXJhY2nDs24gVVNCIGNvbmVjdGFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iU2VsZWNjaW9uYXIgcGFyYSBpbmhhYmlsaXRhciBsYSBkZXB1cmFjacOzbiBVU0IiPC9zdHJpbmc+CkBAIC04MzcsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiJjYW5kaWRhdG9zIjwvdT48L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU0NTc2MDM0MTg5NzA5OTQwNTAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDIzOTUxNjY3NTAyODQzODk5NyI+IlByZXBhcmFuZG8gdGFyamV0YSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iUHJlcGFyYW5kbyB0YXJqZXRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJQcmVwYXJhbmRvIHRhcmpldGEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4Mjg3MzE5ODgyOTI2NzM3MDUzIj4iQ29tcHJvYmFuZG8gZXJyb3Jlcy4uLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJUYXJqZXRhIFNEIHZhY8OtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlRhcmpldGEgU0QgdmFjw61hIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTMxMjI2NjgyMDA5Mjk1ODAxNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTYwNjY2MDc1NjEyNDYyOTcwOCI+IkxhIHRhcmpldGEgU0QgZXN0w6EgdmFjw61hIG8gdXRpbGl6YSB1biBzaXN0ZW1hIGRlIGFyY2hpdm9zIGluY29tcGF0aWJsZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJMYSB0YXJqZXRhIFNEIGVzdMOhIHZhY8OtYSBvIHN1IHNpc3RlbWEgZGUgYXJjaGl2b3MgZXMgaW5jb21wYXRpYmxlLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IlRhcmpldGEgU0QgZGHDsWFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iVGFyamV0YSBTRCBkYcOxYWRhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJMYSB0YXJqZXRhIFNEIGVzdMOhIGRhw7FhZGEuIEVzIHBvc2libGUgcXVlIHNlYSBuZWNlc2FyaW8gdm9sdmVyIGEgZm9ybWF0ZWFybGEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkxhIHRhcmpldGEgU0QgZXN0w6EgZGHDsWFkYS4gRXMgcG9zaWJsZSBxdWUgc2VhIG5lY2VzYXJpbyB2b2x2ZXIgYSBmb3JtYXRlYXJsYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IkxhIHRhcmpldGEgU0Qgc2UgaGEgZXh0cmHDrWRvIGluZXNwZXJhZGFtZW50ZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iTGEgdGFyamV0YSBTRCBzZSBoYSBleHRyYcOtZG8gaW5lc3BlcmFkYW1lbnRlLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiJEZXNhY3RpdmEgbGEgdGFyamV0YSBTRCBhbnRlcyBkZSBleHRyYWVybGEgcGFyYSBldml0YXIgbGEgcMOpcmRpZGEgZGUgZGF0b3MuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iRGVzYWN0aXZhIGxhIHRhcmpldGEgU0QgYW50ZXMgZGUgZXh0cmFlcmxhIHBhcmEgZXZpdGFyIGxhIHDDqXJkaWRhIGRlIGRhdG9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iRXMgc2VndXJvIGV4dHJhZXIgbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJFcyBzZWd1cm8gZXh0cmFlciBsYSB0YXJqZXRhIFNELiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IllhIHB1ZWRlcyBleHRyYWVyIGxhIHRhcmpldGEgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlB1ZWRlcyBleHRyYWVyIGxhIHRhcmpldGEgU0QgZGUgZm9ybWEgc2VndXJhLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4iVGFyamV0YSBTRCBleHRyYcOtZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iVGFyamV0YSBTRCBleHRyYcOtZGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iTGEgdGFyamV0YSBTRCBzZSBoYSBleHRyYcOtZG8uIEluc2VydGEgdW5hIG51ZXZhIHRhcmpldGEgU0QgcGFyYSBhdW1lbnRhciBsYSBjYXBhY2lkYWQgZGUgYWxtYWNlbmFtaWVudG8gZGUgdHUgZGlzcG9zaXRpdm8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iTGEgdGFyamV0YSBTRCBzZSBoYSBleHRyYcOtZG8uIEluc2VydGEgdW5hIG51ZXZhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlRhcmpldGEgU0QgdmFjw61hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iTGEgdGFyamV0YSBTRCBlc3TDoSB2YWPDrWEgbyBzdSBzaXN0ZW1hIGRlIGFyY2hpdm9zIGVzIGluY29tcGF0aWJsZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IlRhcmpldGEgU0QgZGHDsWFkYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJMYSB0YXJqZXRhIFNEIGVzdMOhIGRhw7FhZGEuIEVzIHBvc2libGUgcXVlIHNlYSBuZWNlc2FyaW8gdm9sdmVyIGEgZm9ybWF0ZWFybGEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IkxhIHRhcmpldGEgU0Qgc2UgaGEgZXh0cmHDrWRvIGluZXNwZXJhZGFtZW50ZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEZXNhY3RpdmEgbGEgdGFyamV0YSBTRCBhbnRlcyBkZSBleHRyYWVybGEgcGFyYSBldml0YXIgbGEgcMOpcmRpZGEgZGUgZGF0b3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iRXMgc2VndXJvIGV4dHJhZXIgbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iUHVlZGVzIGV4dHJhZXIgbGEgdGFyamV0YSBTRCBkZSBmb3JtYSBzZWd1cmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlRhcmpldGEgU0QgZXh0cmHDrWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iTGEgdGFyamV0YSBTRCBzZSBoYSBleHRyYcOtZG8uIEluc2VydGEgdW5hIG51ZXZhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iTm8gc2UgaGEgZW5jb250cmFkbyBuaW5ndW5hIGFjdGl2aWRhZCBjb2luY2lkZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4iYWN0dWFsaXphciBlc3RhZMOtc3RpY2FzIGRlIHVzbyBkZSBjb21wb25lbnRlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiJQZXJtaXRlIGxhIG1vZGlmaWNhY2nDs24gZGUgZXN0YWTDrXN0aWNhcyByZWNvcGlsYWRhcyBzb2JyZSBlbCB1c28gZGUgY29tcG9uZW50ZXMuIE5vIGVzdMOhIGRlc3RpbmFkbyBhbCB1c28gcG9yIHBhcnRlIGRlIGFwbGljYWNpb25lcyBub3JtYWxlcy4iPC9zdHJpbmc+CkBAIC04OTQsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlJlZCBwcml2YWRhIHZpcnR1YWwgTDJUUC9JUFNlYyBiYXNhZGEgZW4gY2xhdmUgY29tcGFydGlkYSBwcmV2aWFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJSZWQgcHJpdmFkYSB2aXJ0dWFsIEwyVFAvSVBTZWMgYmFzYWRhIGVuIGNlcnRpZmljYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iU2VsZWNjaW9uYXIgYXJjaGl2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkFyY2hpdm8gbm8gc2VsZWNjaW9uYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzdGFibGVjZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJTZSBoYSBoYWJpbGl0YWRvIGVsIG1vZG8gY29jaGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjY2lvbmEgZXN0YSBvcGNpw7NuIHBhcmEgc2FsaXIgZGVsIG1vZG8gY29jaGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkFuY2xhamUgYSByZWQgYWN0aXZvIG8gem9uYSBXaS1GaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2EgcGFyYSBpbmljaWFyIGxhIGNvbmZpZ3VyYWNpw7NuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkF0csOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlNpZ3VpZW50ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Ik9taXRpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlVzbyBlbGV2YWRvIGRhdG9zIG3Ds3ZpbGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJNw6FzIGluZm9ybWFjacOzbiBzb2JyZSB1c28gZGUgZGF0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkzDrW1pdGUgZGF0b3Mgc3VwZXJhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4iTcOhcyBpbmZvcm1hY2nDs24gc29icmUgdXNvIGRlIGRhdG9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJObyBoYXkgY29pbmNpZGVuY2lhcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiIG1zZ2lkPSIxOTQ2Nzk5MjMzODIyODIwMzg0Ij4iQnVzY2FyIGVuIGxhIHDDoWdpbmEiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iVW5hIGNvaW5jaWRlbmNpYSI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IGRlIDx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAppbmRleCAzYzU2N2Y0Li4yNDkyYTg1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iT3V0aWxzIGRlIGTDqXZlbG9wcGVtZW50Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkNlcyBmb25jdGlvbm5hbGl0w6lzIHNvbnQgcsOpc2VydsOpZXMgYXV4IGTDqXZlbG9wcGV1cnMgZFwnYXBwbGljYXRpb25zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9zdG9yYWdlIiBtc2dpZD0iMTk3MTExODc3MDU0NjMzNjk2NiI+IlN0b2NrYWdlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJBY2PDqHMgw6AgbGEgY2FydGUgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iQWNjw6hzIMOgIGxhIGNhcnRlIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkFjY8OocyDDoCBsYSBjYXJ0ZSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+IkTDqXNhY3RpdmF0aW9uIG91IG1vZGlmaWNhdGlvbiBkZSBsYSBiYXJyZSBkXCfDqXRhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIGTDqXNhY3RpdmVyIGxhIGJhcnJlIGRcJ8OpdGF0IG91IGRcJ2Fqb3V0ZXIvc3VwcHJpbWVyIGRlcyBpY8O0bmVzIHN5c3TDqG1lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiJiYXJyZSBkXCfDqXRhdCI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkZSBsaWLDqXJlciBkZSBsXCdlc3BhY2UgZGFucyBsYSBtw6ltb2lyZSBkdSB0w6lsw6lwaG9uZSBlbiBzdXBwcmltYW50IGRlcyBmaWNoaWVycyBkdSByw6lwZXJ0b2lyZSBkdSBjYWNoZSBkZXMgYXBwbGljYXRpb25zLiBDZXQgYWNjw6hzIGVzdCBlbiBnw6luw6lyYWwgbGltaXTDqSBhdXggcHJvY2Vzc3VzIHN5c3TDqG1lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiJEw6lwbGFjZXIgZGVzIHJlc3NvdXJjZXMgZFwnYXBwbGljYXRpb24iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3ZlUGFja2FnZSIgbXNnaWQ9IjYzMjMwNDkyOTE5MjM5MjUyNzciPiJBdXRvcmlzZSBsXCdhcHBsaWNhdGlvbiDDoCBkw6lwbGFjZXIgZGVzIHJlc3NvdXJjZXMgZFwnYXBwbGljYXRpb24gZFwndW4gc3VwcG9ydCBpbnRlcm5lIMOgIHVuIHN1cHBvcnQgZXh0ZXJuZSBldCBpbnZlcnNlbWVudC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+ImxpcmUgbGVzIGRvbm7DqWVzIGRlcyBqb3VybmF1eCDDoCBjYXJhY3TDqHJlIGNvbmZpZGVudGllbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgbGlyZSBsZXMgZGlmZsOpcmVudHMgZmljaGllcnMgam91cm5hdXggZHUgc3lzdMOobWUgYWZpbiBkXCdvYnRlbmlyIGRlcyBpbmZvcm1hdGlvbnMgZ8OpbsOpcmFsZXMgc3VyIGxhIGZhw6dvbiBkb250IHZvdXMgdXRpbGlzZXogdm90cmUgdMOpbMOpcGhvbmUgKGNlbGxlcy1jaSBwZXV2ZW50IMOpdmVudHVlbGxlbWVudCBpbmNsdXJlIGRlcyBpbmZvcm1hdGlvbnMgZFwnb3JkcmUgcGVyc29ubmVsIG91IHByaXbDqSkuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4iTGVjdHVyZS/DqWNyaXR1cmUgZGFucyBsZXMgcmVzc291cmNlcyBhcHBhcnRlbmFudCBhdXggZGlhZ25vc3RpY3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgbGlyZSBldCBkXCfDqWRpdGVyIHRvdXRlIHJlc3NvdXJjZSBhcHBhcnRlbmFudCBhdSBncm91cGUgZGUgZGlhZ25vc3RpY3MgKHBhciBleGVtcGxlLCBsZXMgZmljaGllcnMgaW4vZGV2KS4gQ2VjaSBwZXV0IGFmZmVjdGVyIGxhIHN0YWJpbGl0w6kgZXQgbGEgc8OpY3VyaXTDqSBkdSBzeXN0w6htZS4gQ2V0dGUgZm9uY3Rpb25uYWxpdMOpIGVzdCBVTklRVUVNRU5UIHLDqXNlcnbDqWUgYXV4IGRpYWdub3N0aWNzIG1hdMOpcmllbHMgZWZmZWN0dcOpcyBwYXIgbGUgZmFicmljYW50IG91IGxcJ29ww6lyYXRldXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iQWN0aXZlciBvdSBkw6lzYWN0aXZlciBkZXMgw6lsw6ltZW50cyBkZSBsXCdhcHBsaWNhdGlvbiI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgY29uZmlndXJlciBsZSB0w6lsw6lwaG9uZSBCbHVldG9vdGggbG9jYWwsIGRcJ2lkZW50aWZpZXIgZGVzIHDDqXJpcGjDqXJpcXVlcyBkaXN0YW50cyBldCBkZSBsZXMgYXNzb2NpZXIgYXUgdMOpbMOpcGhvbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iQ3LDqWF0aW9uIGRlIGNvbm5leGlvbnMgQmx1ZXRvb3RoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkXCdvYnRlbmlyIGxhIGNvbmZpZ3VyYXRpb24gZHUgdMOpbMOpcGhvbmUgQmx1ZXRvb3RoIGxvY2FsIGV0IGRlIGNyw6llciBldCBhY2NlcHRlciBkZXMgY29ubmV4aW9ucyDDoCBkZXMgYXBwYXJlaWxzIGFzc29jacOpcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iRMOpc2FjdGl2YXRpb24gZHUgdmVycm91aWxsYWdlIGRlcyB0b3VjaGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgZMOpc2FjdGl2ZXIgbGUgdmVycm91aWxsYWdlIGRlcyB0b3VjaGVzIGV0IHRvdXRlIHPDqWN1cml0w6kgcGFyIG1vdCBkZSBwYXNzZS4gRXhlbXBsZcKgOiBWb3RyZSB0w6lsw6lwaG9uZSBkw6lzYWN0aXZlIGxlIHZlcnJvdWlsbGFnZSBkdSBjbGF2aWVyIGxvcnNxdWUgdm91cyByZWNldmV6IHVuIGFwcGVsLCBwdWlzIGxlIHLDqWFjdGl2ZSBsb3JzcXVlIHZvdXMgcmFjY3JvY2hlei4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4iTGVjdHVyZSBkZXMgcGFyYW3DqHRyZXMgZGUgc3luY2hyb25pc2F0aW9uIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgbGlyZSB0b3VzIGxlcyBtb3RzLCBub21zIGV0IGV4cHJlc3Npb25zIHF1ZSBsXCd1dGlsaXNhdGV1ciBhIHB1IGVucmVnaXN0cmVyIGRhbnMgc29uIGRpY3Rpb25uYWlyZSBwZXJzb25uZWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4iRW5yZWdpc3RyZW1lbnQgZGFucyBsZSBkaWN0aW9ubmFpcmUgZMOpZmluaSBwYXIgbFwndXRpbGlzYXRldXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkXCdlbnJlZ2lzdHJlciBkZSBub3V2ZWF1eCBtb3RzIGRhbnMgbGUgZGljdGlvbm5haXJlIHBlcnNvbm5lbCBkZSBsXCd1dGlsaXNhdGV1ci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+Ik1vZGlmaWVyL3N1cHByaW1lciBsZSBjb250ZW51IGRlIGxhIGNhcnRlIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJNb2RpZmllci9zdXBwcmltZXIgbGUgY29udGVudSBkZSBsYSBjYXJ0ZSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiJBdXRvcmlzZSB1bmUgYXBwbGljYXRpb24gw6Agw6ljcmlyZSBzdXIgbGEgY2FydGUgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iQXV0b3Jpc2UgdW5lIGFwcGxpY2F0aW9uIMOgIMOpY3JpcmUgc3VyIGxhIGNhcnRlIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iTW9kaWZpZXIvc3VwcHJpbWVyIGxlIGNvbnRlbnUgZGUgbGEgY2FydGUgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJBdXRvcmlzZSB1bmUgYXBwbGljYXRpb24gw6Agw6ljcmlyZSBzdXIgbGEgY2FydGUgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+ImFjY8OpZGVyIGF1IHN5c3TDqG1lIGRlIGZpY2hpZXJzIGVuIGNhY2hlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIGxpcmUgZXQgZFwnw6ljcmlyZSBkYW5zIGxlIHN5c3TDqG1lIGRlIGZpY2hpZXJzIGVuIGNhY2hlLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+IkxpbWl0ZXIgbGUgbW90IGRlIHBhc3NlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IlJlc3RyZWludCBsZXMgdHlwZXMgZGUgbW90cyBkZSBwYXNzZSBxdWUgdm91cyDDqnRlcyBhdXRvcmlzw6kgw6AgdXRpbGlzZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiJTdXJ2ZWlsbGVyIGxlcyB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJTdXJ2ZWlsbGUgbGVzIMOpY2hlY3MgZGUgY29ubmV4aW9uIGF1IHDDqXJpcGjDqXJpcXVlIHBvdXIgZWZmZWN0dWVyIHVuZSBhY3Rpb24uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4iUsOpaW5pdGlhbGlzZXIgbGUgbW90IGRlIHBhc3NlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IkZvcmNlIGxcJ3V0aWxpc2F0aW9uIGRcJ3VuIG5vdXZlYXUgbW90IGRlIHBhc3NlLCBxdWkgZG9pdCB2b3VzIMOqdHJlIGNvbW11bmlxdcOpIHBhciBsXCdhZG1pbmlzdHJhdGV1ciBwb3VyIHF1ZSB2b3VzIHB1aXNzaWV6IHZvdXMgY29ubmVjdGVyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iRm9yY2VyIGxlIHZlcnJvdWlsbGFnZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IkNvbnRyw7RsZSBsZSB2ZXJyb3VpbGxhZ2UgZHUgcMOpcmlwaMOpcmlxdWUsIGF2ZWMgb2JsaWdhdGlvbiBkZSBzYWlzaXIgw6Agbm91dmVhdSBsZSBtb3QgZGUgcGFzc2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iTGltaXRlciBsZSBtb3QgZGUgcGFzc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iUmVzdHJlaW50IGxlcyB0eXBlcyBkZSBtb3RzIGRlIHBhc3NlIHF1ZSB2b3VzIMOqdGVzIGF1dG9yaXPDqSDDoCB1dGlsaXNlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJTdXJ2ZWlsbGVyIGxlcyB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiJTdXJ2ZWlsbGUgbGVzIMOpY2hlY3MgZGUgY29ubmV4aW9uIGF1IHDDqXJpcGjDqXJpcXVlIHBvdXIgZWZmZWN0dWVyIHVuZSBhY3Rpb24uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iUsOpaW5pdGlhbGlzZXIgbGUgbW90IGRlIHBhc3NlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IkZvcmNlIGxcJ3V0aWxpc2F0aW9uIGRcJ3VuIG5vdXZlYXUgbW90IGRlIHBhc3NlLCBxdWkgZG9pdCB2b3VzIMOqdHJlIGNvbW11bmlxdcOpIHBhciBsXCdhZG1pbmlzdHJhdGV1ciBwb3VyIHF1ZSB2b3VzIHB1aXNzaWV6IHZvdXMgY29ubmVjdGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iRm9yY2VyIGxlIHZlcnJvdWlsbGFnZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyw7RsZSBsZSB2ZXJyb3VpbGxhZ2UgZHUgcMOpcmlwaMOpcmlxdWUsIGF2ZWMgb2JsaWdhdGlvbiBkZSBzYWlzaXIgw6Agbm91dmVhdSBsZSBtb3QgZGUgcGFzc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkVmZmFjZXIgdG91dGVzIGxlcyBkb25uw6llcyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iUsOpdGFibGl0IGxlcyBwYXJhbcOodHJlcyBkXCd1c2luZSwgc3VwcHJpbWFudCB0b3V0ZXMgdm9zIGRvbm7DqWVzIHNhbnMgZGVtYW5kZSBkZSBjb25maXJtYXRpb24uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJSw6l0YWJsaXQgbGVzIHBhcmFtw6h0cmVzIGRcJ3VzaW5lLCBzdXBwcmltYW50IHRvdXRlcyB2b3MgZG9ubsOpZXMgc2FucyBkZW1hbmRlIGRlIGNvbmZpcm1hdGlvbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiJJbmRpcXVleiBsZSBwcm94eSBnbG9iYWwgw6AgdXRpbGlzZXIgcG91ciBjZSBtb2JpbGUgbG9yc3F1ZSBsZXMgcsOoZ2xlcyBzb250IGFjdGl2w6llcy4gU2V1bCBsXCdhZG1pbmlzdHJhdGV1ciBwcmluY2lwYWwgZHUgbW9iaWxlIHBldXQgZMOpZmluaXIgbGUgcHJveHkgZ2xvYmFsIGVmZmVjdGlmLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbWljaWxlIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWxlIjwvaXRlbT4KQEAgLTU0NCwxNCArNTMwLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQnVyZWF1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkF1dHJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbm5hbGlzw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiJQZXJzb25uYWxpc8OpZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlSG9tZSIgbXNnaWQ9IjYwOTM1OTgxODEwNjkzNTkyOTUiPiJBY2N1ZWlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+IlByb2Zlc3Npb25uZWxsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlT3RoZXIiIG1zZ2lkPSI0NDA4NDM2MTYyOTUwMTE5ODQ5Ij4iQXV0cmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlQ3VzdG9tICgyNDczNTgwNTkzMTExNTkwOTQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlSG9tZSAoNjA5MzU5ODE4MTA2OTM1OTI5NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZVdvcmsgKDY5MjA3MjU3MzA3OTcwOTkwNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlNhaXNpc3NleiBsZSBjb2RlIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iU2Fpc2lzc2V6IGxlIG1vdCBkZSBwYXNzZSBwb3VyIHByb2PDqWRlciBhdSBkw6l2ZXJyb3VpbGxhZ2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJTYWlzaXNzZXogbGUgY29kZSBQSU4gcG91ciBwcm9jw6lkZXIgYXUgZMOpdmVycm91aWxsYWdlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkxlIGNvZGUgUElOIGVzdCBpbmNvcnJlY3TCoCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUG91ciBkw6libG9xdWVyIGxlIGNsYXZpZXIsIGFwcHV5ZXogc3VyIFwiTWVudVwiIHB1aXMgc3VyIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik51bcOpcm8gZFwndXJnZW5jZSI8L3N0cmluZz4KQEAgLTU2NCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZXRvdXIgw6AgbFwnYXBwZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb21iaW5haXNvbiBjb3JyZWN0ZcKgISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJJbmNvcnJlY3QuIE1lcmNpIGRlIHLDqWVzc2F5ZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJJbmNvcnJlY3QuIE1lcmNpIGRlIHLDqWVzc2F5ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iQ2hhcmdlbWVudCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+wqA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDaGFyZ8OpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPsKgPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU3OCw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTGEgY2FydGUgU0lNIGVzdCB2ZXJyb3VpbGzDqWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRMOpYmxvY2FnZSBkZSBsYSBjYXJ0ZSBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJWb3VzIGF2ZXogbWFsIHJlcHJvZHVpdCBsZSBzY2jDqW1hIGRlIGTDqXZlcnJvdWlsbGFnZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBmb2lzLiAiXG5cbiJWZXVpbGxleiByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kZXMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iVm91cyBhdmV6IHNhaXNpIHVuIG1vdCBkZSBwYXNzZSBpbmNvcnJlY3Qgw6AgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7CoHJlcHJpc2VzLiAiXG5cbiJWZXVpbGxleiByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7CoHNlY29uZGVzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJWb3VzIGF2ZXogc2Fpc2kgdW4gY29kZSBQSU4gaW5jb3JyZWN0IMOgIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+wqByZXByaXNlcy4gIlxuXG4iVmV1aWxsZXogcsOpZXNzYXllciBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+wqBzZWNvbmRlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IlZvdXMgYXZleiBtYWwgc2Fpc2kgbGUgc2Now6ltYSBkZSBkw6l2ZXJyb3VpbGxhZ2UgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZm9pcy4gQXUgYm91dCBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmVzIHN1cHBsw6ltZW50YWlyZXMsIHZvdXMgZGV2cmV6IGTDqWJsb3F1ZXIgdm90cmUgdMOpbMOpcGhvbmUgw6AgbFwnYWlkZSBkZSB2b3RyZSBpZGVudGlmaWFudCBHb29nbGUuIlxuXG4iTWVyY2kgZGUgcsOpZXNzYXllciBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJSw6llc3NheWV6IGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+wqBzZWNvbmRlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IlNjaMOpbWEgb3VibGnDqSA/Ijwvc3RyaW5nPgpAQCAtNjA2LDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IlZvdXMgc291aGFpdGV6IHF1aXR0ZXIgY2V0dGUgcGFnZcKgPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJTw6lsZWN0aW9ubmV6IE9LIHBvdXIgY29udGludWVyIG91IEFubnVsZXIgcG91ciByZXN0ZXIgc3VyIGxhIHBhZ2UgYWN0dWVsbGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9sYWJlbCIgbXNnaWQ9IjY4NjAyNjE3NTg2NjU4MjUwNjkiPiJDb25maXJtZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IkNvbnNlaWzCoDogQXBwdXlleiBkZXV4IGZvaXMgcG91ciBlZmZlY3R1ZXIgdW4gem9vbSBhdmFudCBvdSBhcnJpw6hyZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiJsaXJlIGxcJ2hpc3RvcmlxdWUgZXQgbGVzIGZhdm9yaXMgZHUgbmF2aWdhdGV1ciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IkF1dG9yaXNlIGxcJ2FwcGxpY2F0aW9uIMOgIGxpcmUgdG91dGVzIGxlcyBVUkwgYXV4cXVlbGxlcyBsZSBuYXZpZ2F0ZXVyIGEgYWNjw6lkw6kgZXQgdG91cyBzZXMgZmF2b3Jpcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiLDqWNyaXJlIGRhbnMgbFwnaGlzdG9yaXF1ZSBldCBsZXMgZmF2b3JpcyBkdSBuYXZpZ2F0ZXVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4iQXV0b3Jpc2UgdW5lIGFwcGxpY2F0aW9uIMOgIG1vZGlmaWVyIGxcJ2hpc3RvcmlxdWUgZHUgbmF2aWdhdGV1ciBvdSBsZXMgZmF2b3JpcyBlbnJlZ2lzdHLDqXMgc3VyIHZvdHJlIHTDqWzDqXBob25lLiBEZXMgYXBwbGljYXRpb25zIG1hbHZlaWxsYW50ZXMgcGV1dmVudCB1dGlsaXNlciBjZXR0ZSBmb25jdGlvbiBwb3VyIGVmZmFjZXIgb3UgbW9kaWZpZXIgbGVzIGRvbm7DqWVzIGRlIHZvdHJlIG5hdmlnYXRldXIuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJNb2RpZmllciBsZXMgYXV0b3Jpc2F0aW9ucyBkZSBnw6lvbG9jYWxpc2F0aW9uIGR1IG5hdmlnYXRldXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkZSBtb2RpZmllciBsZXMgYXV0b3Jpc2F0aW9ucyBkZSBnw6lvbG9jYWxpc2F0aW9uIGR1IG5hdmlnYXRldXIuIExlcyBhcHBsaWNhdGlvbnMgbWFsdmVpbGxhbnRlcyBwZXV2ZW50IHNlIHNlcnZpciBkZSBjZXR0ZSBmb25jdGlvbm5hbGl0w6kgcG91ciBlbnZveWVyIGRlcyBpbmZvcm1hdGlvbnMgZGUgbGlldSDDoCBkZXMgc2l0ZXMgV2ViIGFyYml0cmFpcmVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IlZvdWxlei12b3VzIHF1ZSBsZSBuYXZpZ2F0ZXVyIHNlIHNvdXZpZW5uZSBkZSBjZSBtb3QgZGUgcGFzc2XCoD8iPC9zdHJpbmc+CkBAIC03MjYsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlRvdXQgc8OpbGVjdGlvbm5lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iU8OpbGVjdGlvbm5lciB0ZXh0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJDb3VwZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGllciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkNvbGxlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWVyIGxcJ1VSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+IlPDqWxlY3QuIGxlIHRleHRlLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlPDqWxlY3Rpb24gZGUgdGV4dGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNb2RlIGRlIHNhaXNpZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBam91dGVyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGF1IGRpY3Rpb25uYWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Ik1vZGlmaWVyIGxlIHRleHRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iQWN0aW9ucyBzdXIgbGUgdGV4dGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkVzcGFjZSBkaXNwb25pYmxlIGZhaWJsZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkxhIG3DqW1vaXJlIGR1IHTDqWzDqXBob25lIGNvbW1lbmNlIMOgIMOqdHJlIHBsZWluZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTc0MSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdHRlbnRpb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNoYXJnZW1lbnQgZW4gY291cnMuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+Ik9OIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iT0ZGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb250aW51ZXIgYXZlYyI8L3N0cmluZz4KQEAgLTc1OSw5ICs3NTAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IkZvcmNlciBsYSBmZXJtZXR1cmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iUmFwcG9ydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iQXR0ZW5kcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcHBsaWNhdGlvbiByZWRpcmlnw6llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGVzdCBtYWludGVuYW50IGxhbmPDqWUuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiJBcHBsaWNhdGlvbiBsYW5jw6llIGluaXRpYWxlbWVudMKgOiA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMXCdhcHBsaWNhdGlvbiA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzdXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBhIGVuZnJlaW50IHNlcyBwcm9wcmVzIHLDqGdsZXMgZHUgbW9kZSBzdHJpY3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iTGUgcHJvY2Vzc3VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBhIGVuZnJlaW50IHNlcyBwcm9wcmVzIHLDqGdsZXMgZHUgbW9kZSBzdHJpY3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPsKgZW4gY291cnMgZFwnZXjDqWN1dGlvbiI8L3N0cmluZz4KQEAgLTgwOCwyOCArODAyLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19zaG93X2FsbCIgbXNnaWQ9IjI2NzE3OTExNjM5MzMwOTExODAiPjxiPiJUb3V0IGFmZmljaGVyIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlN0b2NrYWdlIGRlIG1hc3NlIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IkNvbm5lY3TDqSDDoCBsXCdhaWRlIGRcJ3VuIGPDomJsZSBVU0IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJWb3VzIGF2ZXogY29ubmVjdMOpIHZvdHJlIHTDqWzDqXBob25lIMOgIHZvdHJlIG9yZGluYXRldXIgw6AgbFwnYWlkZSBkXCd1biBjw6JibGUgVVNCLiBTw6lsZWN0aW9ubmV6IGxlIGJvdXRvbiBjaS1kZXNzb3VzIHBvdXIgY29waWVyIGRlcyBmaWNoaWVycyBkZSB2b3RyZSBvcmRpbmF0ZXVyIHZlcnMgbGEgY2FydGUgU0QgZGUgdm90cmUgQW5kcm9pZCwgb3UgaW52ZXJzZW1lbnQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJWb3VzIGF2ZXogY29ubmVjdMOpIHZvdHJlIHTDqWzDqXBob25lIMOgIHZvdHJlIG9yZGluYXRldXIgw6AgbFwnYWlkZSBkXCd1biBjw6JibGUgVVNCLiBTw6lsZWN0aW9ubmV6IGxlIGJvdXRvbiBjaS1kZXNzb3VzIHBvdXIgY29waWVyIGRlcyBmaWNoaWVycyBkZSB2b3RyZSBvcmRpbmF0ZXVyIHZlcnMgbGEgY2FydGUgU0QgZGUgdm90cmUgQW5kcm9pZCwgb3UgaW52ZXJzZW1lbnQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJWb3VzIGF2ZXogY29ubmVjdMOpIHZvdHJlIHTDqWzDqXBob25lIMOgIHZvdHJlIG9yZGluYXRldXIgw6AgbFwnYWlkZSBkXCd1biBjw6JibGUgVVNCLiBTw6lsZWN0aW9ubmV6IGxlIGJvdXRvbiBjaS1kZXNzb3VzIHBvdXIgY29waWVyIGRlcyBmaWNoaWVycyBkZSB2b3RyZSBvcmRpbmF0ZXVyIHZlcnMgbGEgY2FydGUgU0QgZGUgdm90cmUgQW5kcm9pZCwgb3UgaW52ZXJzZW1lbnQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IkFjdGl2ZXIgbGUgcMOpcmlwaMOpcmlxdWUgZGUgc3RvY2thZ2UgVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iVW4gcHJvYmzDqG1lIGVzdCBzdXJ2ZW51IGxvcnMgZGUgbFwndXRpbGlzYXRpb24gZGUgdm90cmUgY2FydGUgU0QgZW4gdGFudCBxdWUgcMOpcmlwaMOpcmlxdWUgZGUgc3RvY2thZ2UgVVNCLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iVW4gcHJvYmzDqG1lIGVzdCBzdXJ2ZW51IGxvcnMgZGUgbFwndXRpbGlzYXRpb24gZGUgdm90cmUgY2FydGUgU0QgZW4gdGFudCBxdWUgcMOpcmlwaMOpcmlxdWUgZGUgc3RvY2thZ2UgVVNCLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iVW4gcHJvYmzDqG1lIGVzdCBzdXJ2ZW51IGxvcnMgZGUgbFwndXRpbGlzYXRpb24gZGUgdm90cmUgY2FydGUgU0QgZW4gdGFudCBxdWUgcMOpcmlwaMOpcmlxdWUgZGUgc3RvY2thZ2UgVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJDb25uZWN0w6kgYXZlYyB1biBjw6JibGUgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4iQWN0aXZleiBwb3VyIGNvcGllciBkZXMgZmljaGllcnMgdmVycy9kZSB2b3RyZSBvcmRpbmF0ZXVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IsOJdGVpbmRyZSBsZSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjU5MTgxMzQ5MDI2OTg0MTUzOSI+IlPDqWxlY3Rpb25uZXIgcG91ciDDqXRlaW5kcmUgbGUgcMOpcmlwaMOpcmlxdWUgZGUgc3RvY2thZ2UgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlN0b2NrYWdlIFVTQiBlbiBjb3VycyBkXCd1dGlsaXNhdGlvbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iQXZhbnQgZGUgbWV0dHJlIGhvcnMgdGVuc2lvbiBsZSBzdG9ja2FnZSBVU0IsIGFzc3VyZXotdm91cyBkXCdhdm9pciBkw6lzYWN0aXbDqSAoXCLDqWplY3TDqVwiKSBsYSBjYXJ0ZSBTRCBkZSB2b3RyZSB0w6lsw6lwaG9uZSBBbmRyb2lkIMOgIHBhcnRpciBkZSB2b3RyZSBvcmRpbmF0ZXVyLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJBdmFudCBkZSBtZXR0cmUgaG9ycyB0ZW5zaW9uIGxlIHN0b2NrYWdlIFVTQiwgYXNzdXJlei12b3VzIGRcJ2F2b2lyIGTDqXNhY3RpdsOpIChcIsOpamVjdMOpXCIpIGxhIGNhcnRlIFNEIGRlIHZvdHJlIHTDqWzDqXBob25lIEFuZHJvaWQgw6AgcGFydGlyIGRlIHZvdHJlIG9yZGluYXRldXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IkF2YW50IGRlIG1ldHRyZSBob3JzIHRlbnNpb24gbGUgc3RvY2thZ2UgVVNCLCBhc3N1cmV6LXZvdXMgZFwnYXZvaXIgZMOpc2FjdGl2w6kgKFwiw6lqZWN0w6lcIikgbGEgY2FydGUgU0QgZGUgdm90cmUgdMOpbMOpcGhvbmUgQW5kcm9pZCDDoCBwYXJ0aXIgZGUgdm90cmUgb3JkaW5hdGV1ci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJEw6lzYWN0aXZlciBsZSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJVbiBwcm9ibMOobWUgZXN0IHN1cnZlbnUgbG9ycyBkZSBsYSBtaXNlIGhvcnMgdGVuc2lvbiBkdSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IuIEFzc3VyZXotdm91cyBxdWUgbFwnaMO0dGUgVVNCIGEgYmllbiDDqXTDqSBkw6lzYWN0aXbDqSwgcHVpcyBlc3NheWV6IMOgIG5vdXZlYXUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iQWN0aXZlciBsZSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiJTaSB2b3VzIGFjdGl2ZXogbGUgcMOpcmlwaMOpcmlxdWUgZGUgc3RvY2thZ2UgVVNCLCBjZXJ0YWluZXMgYXBwbGljYXRpb25zIHF1ZSB2b3VzIHV0aWxpc2V6IHNlIGZlcm1lcm9udCBldCByaXNxdWVudCBkZSBuXCfDqnRyZSBkZSBub3V2ZWF1IGRpc3BvbmlibGVzIHF1XCdhcHLDqHMgbGEgZMOpc2FjdGl2YXRpb24gZHUgcMOpcmlwaMOpcmlxdWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IsOJY2hlYyBkdSBmb25jdGlvbm5lbWVudCBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4iT0siPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IkZvcm1hdGVyIGxhIGNhcnRlIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVyIGxhIGNhcnRlIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IlZvdWxlei12b3VzIHZyYWltZW50IGZvcm1hdGVyIGxhIGNhcnRlIFNEwqA/IFRvdXRlcyBsZXMgZG9ubsOpZXMgZGUgY2V0dGUgY2FydGUgc2Vyb250IHBlcmR1ZXMuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iVm91bGV6LXZvdXMgdnJhaW1lbnQgZm9ybWF0ZXIgbGEgY2FydGUgU0TCoD8gVG91dGVzIGxlcyBkb25uw6llcyBkZSBjZXR0ZSBjYXJ0ZSBzZXJvbnQgcGVyZHVlcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybWF0ZXIgbGEgY2FydGUgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJWb3VsZXotdm91cyB2cmFpbWVudCBmb3JtYXRlciBsYSBjYXJ0ZSBTRMKgPyBUb3V0ZXMgbGVzIGRvbm7DqWVzIGRlIGNldHRlIGNhcnRlIHNlcm9udCBwZXJkdWVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkZvcm1hdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IkTDqWJvZ2FnZSBVU0IgY29ubmVjdMOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJTw6lsZWN0aW9ubmV6IGNldHRlIG9wdGlvbiBwb3VyIGTDqXNhY3RpdmVyIGxlIGTDqWJvZ2FnZSBVU0IuIjwvc3RyaW5nPgpAQCAtODM3LDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4iY2FuZGlkYXRzIjwvdT48L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU0NTc2MDM0MTg5NzA5OTQwNTAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDIzOTUxNjY3NTAyODQzODk5NyI+IlByw6lwYXJhdGlvbiBkZSBsYSBjYXJ0ZSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iUHLDqXBhcmF0aW9uIGRlIGxhIGNhcnRlIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJQcsOpcGFyYXRpb24gZGUgbGEgY2FydGUgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4Mjg3MzE5ODgyOTI2NzM3MDUzIj4iUmVjaGVyY2hlIGRcJ2VycmV1cnMiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4iQ2FydGUgU0QgdmlkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IkNhcnRlIFNEIHZpZGUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iTGEgY2FydGUgU0QgZXN0IHZpZGUgb3UgdXRpbGlzZSB1biBzeXN0w6htZSBkZSBmaWNoaWVycyBub24gcHJpcyBlbiBjaGFyZ2UuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iTGEgY2FydGUgU0QgZXN0IHZpZGUgb3Ugc29uIHN5c3TDqG1lIGRlIGZpY2hpZXJzIG5cJ2VzdCBwYXMgcHJpcyBlbiBjaGFyZ2UuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4iQ2FydGUgU0QgZW5kb21tYWfDqWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IkNhcnRlIFNEIGVuZG9tbWFnw6llIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJMYSBjYXJ0ZSBTRCBlc3QgZW5kb21tYWfDqWUuIFZvdXMgZGV2cmV6IHBldXQtw6p0cmUgcmVmb3JtYXRlciB2b3RyZSBjYXJ0ZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iTGEgY2FydGUgU0QgZXN0IGVuZG9tbWFnw6llLiBWb3VzIGRldnJleiBwZXV0LcOqdHJlIGxhIHJlZm9ybWF0ZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiJDYXJ0ZSBTRCByZXRpcsOpZSBpbm9waW7DqW1lbnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iQ2FydGUgU0QgcmV0aXLDqWUgaW5vcGluw6ltZW50Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+IkTDqXNhY3RpdmVyIGxhIGNhcnRlIFNEIGF2YW50IGRlIGxhIHJldGlyZXIgcG91ciDDqXZpdGVyIHRvdXRlIHBlcnRlIGRlIGRvbm7DqWVzLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkTDqXNhY3RpdmVyIGxhIGNhcnRlIFNEIGF2YW50IGRlIGxhIHJldGlyZXIgcG91ciDDqXZpdGVyIHRvdXRlIHBlcnRlIGRlIGRvbm7DqWVzLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iTGEgY2FydGUgU0QgcGV1dCDDqnRyZSByZXRpcsOpZSBlbiB0b3V0ZSBzw6ljdXJpdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iTGEgY2FydGUgU0QgcGV1dCDDqnRyZSByZXRpcsOpZSBlbiB0b3V0ZSBzw6ljdXJpdMOpIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iVm91cyBwb3V2ZXogZMOpc29ybWFpcyByZXRpcmVyIGxhIGNhcnRlIFNEIGVuIHRvdXRlIHPDqWN1cml0w6kuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlZvdXMgcG91dmV6IHJldGlyZXIgbGEgY2FydGUgU0QgZW4gdG91dGUgc8OpY3VyaXTDqS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+IkNhcnRlIFNEIG1hbnF1YW50ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJDYXJ0ZSBTRCBtYW5xdWFudGUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iQ2FydGUgU0QgbWFucXVhbnRlLiBJbnPDqXJleiB1bmUgYXV0cmUgY2FydGUgcG91ciBhdWdtZW50ZXIgbGEgY2FwYWNpdMOpIGRlIHN0b2NrYWdlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IkxhIGNhcnRlIFNEIGEgw6l0w6kgcmV0aXLDqWUuIEluc8OpcmV6LWVuIHVuZSBhdXRyZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJDYXJ0ZSBTRCB2aWRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iTGEgY2FydGUgU0QgZXN0IHZpZGUgb3Ugc29uIHN5c3TDqG1lIGRlIGZpY2hpZXJzIG5cJ2VzdCBwYXMgcHJpcyBlbiBjaGFyZ2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJDYXJ0ZSBTRCBlbmRvbW1hZ8OpZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJMYSBjYXJ0ZSBTRCBlc3QgZW5kb21tYWfDqWUuIFZvdXMgZGV2cmV6IHBldXQtw6p0cmUgbGEgcmVmb3JtYXRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iQ2FydGUgU0QgcmV0aXLDqWUgaW5vcGluw6ltZW50Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iRMOpc2FjdGl2ZXIgbGEgY2FydGUgU0QgYXZhbnQgZGUgbGEgcmV0aXJlciBwb3VyIMOpdml0ZXIgdG91dGUgcGVydGUgZGUgZG9ubsOpZXMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iTGEgY2FydGUgU0QgcGV1dCDDqnRyZSByZXRpcsOpZSBlbiB0b3V0ZSBzw6ljdXJpdMOpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlZvdXMgcG91dmV6IHJldGlyZXIgbGEgY2FydGUgU0QgZW4gdG91dGUgc8OpY3VyaXTDqS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iQ2FydGUgU0QgbWFucXVhbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iTGEgY2FydGUgU0QgYSDDqXTDqSByZXRpcsOpZS4gSW5zw6lyZXotZW4gdW5lIGF1dHJlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iQXVjdW5lIGFjdGl2aXTDqSBjb3JyZXNwb25kYW50ZSB0cm91dsOpZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiJtZXR0cmUgw6Agam91ciBsZXMgZG9ubsOpZXMgc3RhdGlzdGlxdWVzIGR1IGNvbXBvc2FudCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiJQZXJtZXQgZGUgbW9kaWZpZXIgbGVzIGRvbm7DqWVzIHN0YXRpc3RpcXVlcyBjb2xsZWN0w6llcyBkdSBjb21wb3NhbnQuIENldHRlIG9wdGlvbiBuXCdlc3QgcGFzIHV0aWxpc8OpZSBwYXIgbGVzIGFwcGxpY2F0aW9ucyBzdGFuZGFyZC4iPC9zdHJpbmc+CkBAIC04OTQsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGJhc8OpIHN1ciB1bmUgY2zDqSBwcsOpLXBhcnRhZ8OpZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJWUE4gTDJUUC9JUFNlYyBiYXPDqSBzdXIgdW4gY2VydGlmaWNhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlPDqWxlY3Rpb25uZXIgdW4gZmljaGllciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkF1Y3VuIGZpY2hpZXIgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlLDqWluaXRpYWxpc2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudm95ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Ik1vZGUgVm9pdHVyZSBhY3RpdsOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlPDqWxlY3Rpb25uZXogY2V0dGUgb3B0aW9uIHBvdXIgcXVpdHRlciBsZSBtb2RlIFZvaXR1cmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlBhcnRhZ2UgZGUgY29ubmV4aW9uIG91IHBvaW50IGRcJ2FjY8OocyBzYW5zIGZpbCBhY3RpdsOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG91Y2hlciBwb3VyIGNvbmZpZ3VyZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJSZXRvdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJTdWl2YW50Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iSWdub3JlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlV0aWxpc2F0aW9uIMOpbGV2w6llIGRlcyBkb25uw6llcyBtb2JpbGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb3VjaGV6IHBvdXIgZW4gc2F2b2lyIHBsdXMgc3VyIGxcJ3V0aWxpc2F0aW9uIGRlcyBkb25uw6llcyBtb2JpbGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJRdW90YSBkXCd1dGlsaXNhdGlvbiBkZXMgZG9ubsOpZXMgbW9iaWxlcyBkw6lwYXNzw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4iVG91Y2hleiBwb3VyIGVuIHNhdm9pciBwbHVzIHN1ciBsXCd1dGlsaXNhdGlvbiBkZXMgZG9ubsOpZXMgbW9iaWxlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iQXVjdW5lIGNvcnJlc3BvbmRhbmNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IlJlY2hlcmNoZXIgc3VyIGxhIHBhZ2UiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMcKgY29ycmVzcG9uZGFuY2UiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiBzdXLCoDx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAppbmRleCA0ZThkMTlhLi5hYjM3ODkzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iU3RydW1lbnRpIGRpIHN2aWx1cHBvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bnppb25hbGl0w6AgbmVjZXNzYXJpZSBzb2x0YW50byBhZ2xpIHN2aWx1cHBhdG9yaSBkaSBhcHBsaWNhemlvbmkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iQXJjaGl2aWF6aW9uZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iQWNjZXNzbyBhbGxhIHNjaGVkYSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iQWNjZXNzbyBhbGxhIHNjaGVkYSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iQWNjZXNzbyBhbGxhIHNjaGVkYSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiJkaXNhdHRpdmFyZSBvIG1vZGlmaWNhcmUgbGEgYmFycmEgZGkgc3RhdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iQ29uc2VudGUgYWxsXCdhcHBsaWNhemlvbmUgZGkgZGlzYXR0aXZhcmUgbGEgYmFycmEgZGkgc3RhdG8gbyBkaSBhZ2dpdW5nZXJlIGUgcmltdW92ZXJlIGljb25lIGRpIHNpc3RlbWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+ImJhcnJhIGRpIHN0YXRvIjwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgbGliZXJhcmUgc3BhemlvIHN1bCB0ZWxlZm9ubyBlbGltaW5hbmRvIGZpbGUgbmVsbGEgZGlyZWN0b3J5IGRlbGxhIGNhY2hlIGRlbGxcJ2FwcGxpY2F6aW9uZS4gTFwnYWNjZXNzbyDDqCBnZW5lcmFsbWVudGUgbGltaXRhdG8gYSBwcm9jZXNzaSBkaSBzaXN0ZW1hLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiJTcG9zdGFyZSByaXNvcnNlIGRlbGxcJ2FwcGxpY2F6aW9uZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBzcG9zdGFyZSByaXNvcnNlIGFwcGxpY2F0aXZlIGRhIHN1cHBvcnRpIGludGVybmkgYSBlc3Rlcm5pIGUgdmljZXZlcnNhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4iTGV0dHVyYSBkYXRpIGRpIHJlZ2lzdHJvIHNlbnNpYmlsaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIHZhcmkgZmlsZSBkaSByZWdpc3RybyBkZWwgc2lzdGVtYSBwZXIgdHJvdmFyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3VsbGUgb3BlcmF6aW9uaSBlZmZldHR1YXRlIGNvbiBpbCB0ZWxlZm9uby4gVGFsaSBmaWxlIHBvdHJlYmJlcm8gY29udGVuZXJlIGluZm9ybWF6aW9uaSBwZXJzb25hbGkgbyByaXNlcnZhdGUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4ibGV0dHVyYS9zY3JpdHR1cmEgcmlzb3JzZSBkaSBwcm9wcmlldMOgIGRpIGRpYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIGxlIHJpc29yc2UgZGVsIGdydXBwbyBkaWFnIGUgc2NyaXZlcmUgYSBlc3NlLCBwZXIgZXNlbXBpbyBpIGZpbGUgaW4gL2Rldi4gUXVlc3RhIGNhcGFjaXTDoCBwb3RyZWJiZSBpbmZsdWlyZSBzdWxsYSBzdGFiaWxpdMOgIGUgc2ljdXJlenphIGRlbCBzaXN0ZW1hLiBEb3ZyZWJiZSBlc3NlcmUgdXRpbGl6emF0YSBTT0xUQU5UTyBwZXIgZGlhZ25vc3RpY2hlIHNwZWNpZmljaGUgZGVsbFwnaGFyZHdhcmUgZWZmZXR0dWF0ZSBkYWwgcHJvZHV0dG9yZSBvIGRhbGxcJ29wZXJhdG9yZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJhdHRpdmF6aW9uZS9kaXNhdHRpdmF6aW9uZSBjb21wb25lbnRpIGFwcGxpY2F6aW9uaSI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBjb25maWd1cmFyZSBpbCB0ZWxlZm9ubyBCbHVldG9vdGggbG9jYWxlIGUgZGkgcmlsZXZhcmUgZSBhYmJpbmFyZSBkaXNwb3NpdGl2aSByZW1vdGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iY3JlYXppb25lIGNvbm5lc3Npb25pIEJsdWV0b290aCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSB2aXN1YWxpenphcmUgbGEgY29uZmlndXJhemlvbmUgZGVsIHRlbGVmb25vIEJsdWV0b290aCBsb2NhbGUgZSBkaSBzdGFiaWxpcmUgZSBhY2NldHRhcmUgY29ubmVzc2lvbmkgY29uIGRpc3Bvc2l0aXZpIGFzc29jaWF0aS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iZGlzYXR0aXZhemlvbmUgYmxvY2NvIHRhc3RpZXJhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IkNvbnNlbnRlIGxhIGRpc2F0dGl2YXppb25lIGRhIHBhcnRlIGRpIHVuXCdhcHBsaWNhemlvbmUgZGVsIGJsb2NjbyB0YXN0aWVyYSBlIGRpIGV2ZW50dWFsaSBwcm90ZXppb25pIHRyYW1pdGUgcGFzc3dvcmQgYXNzb2NpYXRlLiBVbiB2YWxpZG8gZXNlbXBpbyDDqCBsYSBkaXNhdHRpdmF6aW9uZSBkYSBwYXJ0ZSBkZWwgdGVsZWZvbm8gZGVsIGJsb2NjbyB0YXN0aWVyYSBxdWFuZG8gcmljZXZlIHVuYSB0ZWxlZm9uYXRhIGluIGVudHJhdGEsIGUgbGEgc3VjY2Vzc2l2YSByaWF0dGl2YXppb25lIGRlbCBibG9jY28gYWwgdGVybWluZSBkZWxsYSBjaGlhbWF0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4ibGV0dHVyYSBpbXBvc3RhemlvbmkgZGkgc2luY3Jvbml6ei4iPC9zdHJpbmc+CkBAIC00MzUsMjIgKzQyMCwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSIxMDgyOTcyNjAzNTc2MzYwNjkwIj4iQ29uc2VudGUgYSB1blwnYXBwbGljYXppb25lIGRpIGxlZ2dlcmUgcGFyb2xlLCBub21pIGUgZnJhc2kgcHJpdmF0ZSBjaGUgbFwndXRlbnRlIHBvdHJlYmJlIGF2ZXIgbWVtb3JpenphdG8gbmVsIGRpemlvbmFyaW8gdXRlbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+InNjcml0dHVyYSBuZWwgZGl6aW9uYXJpbyBkZWZpbml0byBkYWxsXCd1dGVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4iQ29uc2VudGUgYSB1blwnYXBwbGljYXppb25lIGRpIHNjcml2ZXJlIG51b3ZlIHBhcm9sZSBuZWwgZGl6aW9uYXJpbyB1dGVudGUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiJtb2RpZmljYXJlL2VsaW1pbmFyZSBpIGNvbnRlbnV0aSBkZWxsYSBzY2hlZGEgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhcmUvZWxpbWluYXJlIGkgY29udGVudXRpIGRlbGxhIHNjaGVkYSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgc2NyaXZlcmUgc3VsbGEgc2NoZWRhIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBzY3JpdmVyZSBzdWxsYSBzY2hlZGEgU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXJlL2VsaW1pbmFyZSBpIGNvbnRlbnV0aSBkZWxsYSBzY2hlZGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgc2NyaXZlcmUgc3VsbGEgc2NoZWRhIFNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiJhY2Nlc3NvIGFsIGZpbGVzeXN0ZW0gbmVsbGEgY2FjaGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIGUgc2NyaXZlcmUgaWwgZmlsZXN5c3RlbSBuZWxsYSBjYWNoZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiJMaW1pdGEgcGFzc3dvcmQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxNzE5ODc3MjQ1NjkyMzE4Mjk5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI5MDgzNDAwMDgwODYxNzI4MDU2Ij4iTGltaXRhIGkgdGlwaSBkaSBwYXNzd29yZCBjaGUgc2VpIGF1dG9yaXp6YXRvIGEgdXRpbGl6emFyZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+IkNvbnRyb2xsYSBpIHRlbnRhdGl2aSBkaSBhY2Nlc3NvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+Ik1vbml0b3JhIGkgdGVudGF0aXZpIG5vbiByaXVzY2l0aSBkaSBhY2NlZGVyZSBhbCBkaXNwb3NpdGl2byBwZXIgZXNlZ3VpcmUgdW5cJ2F6aW9uZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJSZWltcG9zdGEgcGFzc3dvcmQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4iRm9yemEgdW4gbnVvdm8gdmFsb3JlIHBlciBsYSBwYXNzd29yZCwgY2hpZWRlbmRvIGFsbFwnYW1taW5pc3RyYXRvcmUgZGkgY29uY2VkZXJ0ZWxvIHByaW1hIGRpIHBvdGVyIGVzZWd1aXJlIGxcJ2FjY2Vzc28uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJGb3J6YSBibG9jY28iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiJDb250cm9sbGEgcXVhbmRvIGlsIGRpc3Bvc2l0aXZvIHNpIGJsb2NjYSwgY2hpZWRlbmRvdGkgZGkgcmVpbnNlcmlyZSBsYSBwYXNzd29yZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiJMaW1pdGEgcGFzc3dvcmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iTGltaXRhIGkgdGlwaSBkaSBwYXNzd29yZCBjaGUgc2VpIGF1dG9yaXp6YXRvIGEgdXRpbGl6emFyZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJDb250cm9sbGEgaSB0ZW50YXRpdmkgZGkgYWNjZXNzbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiJNb25pdG9yYSBpIHRlbnRhdGl2aSBub24gcml1c2NpdGkgZGkgYWNjZWRlcmUgYWwgZGlzcG9zaXRpdm8gcGVyIGVzZWd1aXJlIHVuXCdhemlvbmUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iUmVpbXBvc3RhIHBhc3N3b3JkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IkZvcnphIHVuIG51b3ZvIHZhbG9yZSBwZXIgbGEgcGFzc3dvcmQsIGNoaWVkZW5kbyBhbGxcJ2FtbWluaXN0cmF0b3JlIGRpIGNvbmNlZGVydGVsbyBwcmltYSBkaSBwb3RlciBlc2VndWlyZSBsXCdhY2Nlc3NvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iRm9yemEgYmxvY2NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHJvbGxhIHF1YW5kbyBpbCBkaXNwb3NpdGl2byBzaSBibG9jY2EsIGNoaWVkZW5kb3RpIGRpIHJlaW5zZXJpcmUgbGEgcGFzc3dvcmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkNhbmNlbGxhIHR1dHRpIGkgZGF0aSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iRXNlZ3VpIHVuIHJpcHJpc3Rpbm8gZGkgZmFiYnJpY2EsIGVsaW1pbmFuZG8gdHV0dGkgaSB0dW9pIGRhdGkgc2VuemEgY29uZmVybWEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJFc2VndWkgdW4gcmlwcmlzdGlubyBkaSBmYWJicmljYSwgZWxpbWluYW5kbyB0dXR0aSBpIHR1b2kgZGF0aSBzZW56YSBjb25mZXJtYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiJJbXBvc3RhIGlsIHByb3h5IGdsb2JhbGUgZGVsIGRpc3Bvc2l0aXZvIGluIG1vZG8gZGEgdXRpbGl6emFybG8gbWVudHJlIGxhIG5vcm1hIMOoIGF0dGl2YS4gSWwgcHJveHkgZ2xvYmFsZSBlZmZldHRpdm8gw6ggaW1wb3N0YWJpbGUgc29sbyBkYWwgcHJpbW8gYW1taW5pc3RyYXRvcmUgZGVsIGRpc3Bvc2l0aXZvLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkNhc2EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJDZWxsdWxhcmUiPC9pdGVtPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJMYXZvcm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iQWx0cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpenphdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiJQZXJzb25hbGl6emF0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlSG9tZSIgbXNnaWQ9IjYwOTM1OTgxODEwNjkzNTkyOTUiPiJDYXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+Ikxhdm9ybyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlT3RoZXIiIG1zZ2lkPSI0NDA4NDM2MTYyOTUwMTE5ODQ5Ij4iQWx0cm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idHJhbWl0ZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHRyYW1pdGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVDdXN0b20gKDI0NzM1ODA1OTMxMTE1OTA5NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVIb21lICg2MDkzNTk4MTgxMDY5MzU5Mjk1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlV29yayAoNjkyMDcyNTczMDc5NzA5OTA0NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW5zZXJpc2NpIGlsIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW5zZXJpc2NpIHBhc3N3b3JkIHBlciBzYmxvY2NhcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Ikluc2VyaXNjaSBQSU4gcGVyIHNibG9jY2FyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkNvZGljZSBQSU4gZXJyYXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQZXIgc2Jsb2NjYXJlLCBwcmVtaSBNZW51LCBwb2kgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtZXJvIGRpIGVtZXJnZW56YSI8L3N0cmluZz4KQEAgLTU2NCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJUb3JuYSBhIGNoaWFtYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmV0dGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlJpcHJvdmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlJpcHJvdmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJJbiBjYXJpY2EgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcmljby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU3OCw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTGEgU0lNIMOoIGJsb2NjYXRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNibG9jY28gU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGRpIGluc2VyaW1lbnRvIGRlbGxhIHNlcXVlbnphIGRpIHNibG9jY28uICJcblxuIlJpcHJvdmEgZnJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGVycmF0aSBkaSBpbnNlcmltZW50byBkZWxsYSBwYXNzd29yZC4gIlxuXG4iUmlwcm92YSB0cmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGVycmF0aSBkaSBpbnNlcmltZW50byBkZWwgUElOLiAiXG5cbiJSaXByb3ZhIHRyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGRpIGluc2VyaW1lbnRvIGRlbGxhIHNlcXVlbnphIGRpIHNibG9jY28uIERvcG8gYWx0cmkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGZhbGxpdGksIHRpIHZlcnLDoCBjaGllc3RvIGRpIHNibG9jY2FyZSBpbCB0ZWxlZm9ubyB0cmFtaXRlIGkgZGF0aSBkaSBhY2Nlc3NvIGRpIEdvb2dsZS4iXG5cbiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhaSBkaW1lbnRpY2F0byBsYSBzZXF1ZW56YT8iPC9zdHJpbmc+CkBAIC02MDYsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4iVXNjaXJlIGRhIHF1ZXN0YSBwYWdpbmE/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIlNlbGV6aW9uYSBPSyBwZXIgY29udGludWFyZSBvIEFubnVsbGEgcGVyIHJpbWFuZXJlIG5lbGxhIHBhZ2luYSBjb3JyZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkNvbmZlcm1hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiJTdWdnZXJpbWVudG8uIFRvY2NhIGR1ZSB2b2x0ZSBwZXIgYXVtZW50YXJlL3JpZHVycmUgbG8gem9vbS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiJsZXR0dXJhIGNyb25vbG9naWEgZSBzZWduYWxpYnJpIGRlbCBicm93c2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iQ29uc2VudGUgYWxsXCdhcHBsaWNhemlvbmUgZGkgbGVnZ2VyZSB0dXR0aSBnbGkgVVJMIHZpc2l0YXRpIGUgdHV0dGkgaSBzZWduYWxpYnJpIGRlbCBicm93c2VyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+ImNyZWF6aW9uZSBjcm9ub2xvZ2lhIGUgc2VnbmFsaWJyaSBkZWwgYnJvd3NlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBtb2RpZmljYXJlIGxhIGNyb25vbG9naWEgbyBpIHNlZ25hbGlicmkgZGVsIGJyb3dzZXIgbWVtb3JpenphdGkgc3VsIHRlbGVmb25vLiBMZSBhcHBsaWNhemlvbmkgZGFubm9zZSBwb3Nzb25vIHNmcnV0dGFyZSBxdWVzdGEgcG9zc2liaWxpdMOgIHBlciBjYW5jZWxsYXJlIG8gbW9kaWZpY2FyZSBpIGRhdGkgZGVsIGJyb3dzZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJNb2RpZmljYSBsZSBhdXRvcml6emF6aW9uaSBkaSBsb2NhbGl6emF6aW9uZSBnZW9ncmFmaWNhIGRlbCBicm93c2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBtb2RpZmljYXJlIGxlIGF1dG9yaXp6YXppb25pIGRpIGxvY2FsaXp6YXppb25lIGdlb2dyYWZpY2EgZGVsIGJyb3dzZXIuIExlIGFwcGxpY2F6aW9uaSBkYW5ub3NlIHBvc3Nvbm8gdXRpbGl6emFyZSBxdWVzdGEgYXV0b3JpenphemlvbmUgcGVyIGNvbnNlbnRpcmUgbFwnaW52aW8gZGkgaW5mb3JtYXppb25pIHN1bGxhIHBvc2l6aW9uZSBhIHNpdGkgd2ViIGFyYml0cmFyaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJNZW1vcml6emFyZSBsYSBwYXNzd29yZCBuZWwgYnJvd3Nlcj8iPC9zdHJpbmc+CkBAIC03MjYsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGV6aW9uYSB0dXR0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iU2VsZXppb25hIHBhcm9sYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJUYWdsaWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iSW5jb2xsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWEgVVJMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iU2VsZXppb25hIHRlc3RvLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlNlbGV6aW9uZSB0ZXN0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kbyBpbnNlcmltZW50byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZ2dpdW5naSBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaXppb25hcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpY2EgdGVzdG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJBemlvbmkgdGVzdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlNwYXppbyBpbiBlc2F1cmltZW50byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlNwYXppbyBkaSBhcmNoaXZpYXppb25lIGRlbCB0ZWxlZm9ubyBpbiBlc2F1cmltZW50by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTc0MSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdHRlbnppb25lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJpY2FtZW50byBpbiBjb3Jzby4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iT04iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJPRkYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbXBsZXRhIGxcJ2F6aW9uZSBjb24iPC9zdHJpbmc+CkBAIC03NTksMTYgKzc1MCwxOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iVGVybWluYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJTZWduYWxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJBdHRlbmRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBwbGljYXppb25lIHJlaW5kaXJpenphdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gw6ggb3JhIGluIGVzZWN1emlvbmUuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGdpw6AgYXZ2aWF0YS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iTFwnYXBwbGljYXppb25lIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc3NvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGEgdmlvbGF0byBsYSBub3JtYSBTdHJpY3RNb2RlIGF1dG9pbXBvc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IklsIHByb2Nlc3NvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYSB2aW9sYXRvIGxhIG5vcm1hIFN0cmljdE1vZGUgYXV0b2ltcG9zdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBpbiBlc2VjdXppb25lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbl9kZXRhaWwiIG1zZ2lkPSIyNDIzOTc3NDk5MzM5NDAzNDAyIj4iU2VsZXppb25hIHBlciBwYXNzYXJlIGFsbFwnYXBwbGljYXppb25lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RpdGxlIiBtc2dpZD0iMTEzNTQwMzYzMzc2NjY5NDMxNiI+IlNjYW1iaWFyZSBsZSBhcHBsaWNhemlvbmk/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RleHQiIG1zZ2lkPSI0NTkyMDc1NjEwMDc5MzE5NjY3Ij4iVW5cJ2FsdHJhIGFwcGxpY2F6aW9uZSBnacOgIGluIGVzZWN1emlvbmUgZGV2ZSBlc3NlcmUgY2hpdXNhIHByaW1hIGRpIHBvdGVybmUgYXZ2aWFyZSB1blwnYWx0cmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9hY3Rpb24iIG1zZ2lkPSI0OTMxMjkxNzIyMzg1NjYyODIiPiJUb3JuYSBhIDx4bGlmZjpnIGlkPSJPTERfQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im9sZF9hcHBfYWN0aW9uIiBtc2dpZD0iNDkzMTI5MTcyMjM4NTY2MjgyIj4iVG9ybmEgYSA8eGxpZmY6ZyBpZD0iT0xEX0FQUCI+JTEkczwveGxpZmY6Zz4gIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9kZXNjcmlwdGlvbiIgbXNnaWQ9Ijk0Mjk2NzkwMDIzNzIwODQ2NiI+Ik5vbiBhdnZpYXJlIGxhIG51b3ZhIGFwcGxpY2F6aW9uZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2FjdGlvbiIgbXNnaWQ9IjU0NzI3NTY5MjY5NDU0NDA3MDYiPiJBdnZpYSA8eGxpZmY6ZyBpZD0iT0xEX0FQUCI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNjgzMDM5ODMzOTgyNjc4OTQ5MyI+IkludGVycm9tcGkgbGEgdmVjY2hpYSBhcHBsaWNhemlvbmUgc2VuemEgc2FsdmFyZS4iPC9zdHJpbmc+CkBAIC04MDgsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iTW9zdHJhIHR1dHRvIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IkFyY2hpdmlhemlvbmUgZGkgbWFzc2EgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iVVNCIGNvbGxlZ2F0YSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IklsIHRlbGVmb25vIMOoIHN0YXRvIGNvbGxlZ2F0byBhbCBjb21wdXRlciB0cmFtaXRlIFVTQi4gU2VsZXppb25hIGlsIHB1bHNhbnRlIHNvdHRvc3RhbnRlIHNlIGRlc2lkZXJpIGNvcGlhcmUgZmlsZSB0cmEgaWwgY29tcHV0ZXIgZSBsYSBzY2hlZGEgU0QgZGkgQW5kcm9pZC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IklsIHRlbGVmb25vIMOoIHN0YXRvIGNvbGxlZ2F0byBhbCBjb21wdXRlciB0cmFtaXRlIFVTQi4gU2VsZXppb25hIGlsIHB1bHNhbnRlIHNvdHRvc3RhbnRlIHNlIGRlc2lkZXJpIGNvcGlhcmUgZmlsZSB0cmEgaWwgY29tcHV0ZXIgZSBsYSBzY2hlZGEgU0QgZGkgQW5kcm9pZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IklsIHRlbGVmb25vIMOoIHN0YXRvIGNvbGxlZ2F0byBhbCBjb21wdXRlciB0cmFtaXRlIFVTQi4gU2VsZXppb25hIGlsIHB1bHNhbnRlIHNvdHRvc3RhbnRlIHNlIGRlc2lkZXJpIGNvcGlhcmUgZmlsZSB0cmEgaWwgY29tcHV0ZXIgZSBsYSBzY2hlZGEgU0QgZGkgQW5kcm9pZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iQXR0aXZhIGFyY2hpdmlvIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IlByb2JsZW1hIGRpIHV0aWxpenpvIGRlbGxhIHNjaGVkYSBTRCBwZXIgbFwnYXJjaGl2aWF6aW9uZSBVU0IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJQcm9ibGVtYSBkaSB1dGlsaXp6byBkZWxsYSBzY2hlZGEgU0QgcGVyIGxcJ2FyY2hpdmlhemlvbmUgVVNCLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iUHJvYmxlbWEgZGkgdXRpbGl6em8gZGVsbGEgc2NoZWRhIFNEIHBlciBsXCdhcmNoaXZpYXppb25lIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iVVNCIGNvbGxlZ2F0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IlNlbGV6aW9uYSBwZXIgY29waWFyZSBmaWxlIHN1bC9kYWwgdHVvIGNvbXB1dGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IkRpc2F0dGl2YSBhcmNoaXZpbyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjU5MTgxMzQ5MDI2OTg0MTUzOSI+IlNlbGV6aW9uYSBwZXIgZGlzYXR0aXZhcmUgYXJjaGl2aW8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiJBcmNoaXZpYXppb25lIFVTQiBpbiB1c28iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IlByaW1hIGRpIGRpc2F0dGl2YXJlIGxcJ2FyY2hpdmlhemlvbmUgVVNCLCBhc3NpY3VyYXRpIGRpIGF2ZXJlIHNtb250YXRvIChcImVzcHVsc29cIikgbGEgc2NoZWRhIFNEIGRpIEFuZHJvaWQgZGFsIGNvbXB1dGVyLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJQcmltYSBkaSBkaXNhdHRpdmFyZSBsXCdhcmNoaXZpYXppb25lIFVTQiwgYXNzaWN1cmF0aSBkaSBhdmVyZSBzbW9udGF0byAoXCJlc3B1bHNvXCIpIGxhIHNjaGVkYSBTRCBkaSBBbmRyb2lkIGRhbCBjb21wdXRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iUHJpbWEgZGkgZGlzYXR0aXZhcmUgbFwnYXJjaGl2aWF6aW9uZSBVU0IsIGFzc2ljdXJhdGkgZGkgYXZlcmUgc21vbnRhdG8gKFwiZXNwdWxzb1wiKSBsYSBzY2hlZGEgU0QgZGkgQW5kcm9pZCBkYWwgY29tcHV0ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iRGlzYXR0aXZhIGFyY2hpdmlhemlvbmUgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMTQzODgxOTE0ODQwNDEyMTA4Ij4iU2kgw6ggdmVyaWZpY2F0byB1biBwcm9ibGVtYSBkdXJhbnRlIGxhIGRpc2F0dGl2YXppb25lIGRlbGxcJ2FyY2hpdmlhemlvbmUgVVNCLiBWZXJpZmljYSBkaSBhdmVyZSBzbW9udGF0byBsXCdob3N0IFVTQiBlIHJpcHJvdmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iQXR0aXZhIGFyY2hpdmlvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IlNlIGF0dGl2aSBsXCdhcmNoaXZpbyBVU0IsIGFsY3VuZSBhcHBsaWNhemlvbmkgaW4gdXNvIHNpIGJsb2NjaGVyYW5ubyBlIHBvdHJlYmJlcm8gcmlzdWx0YXJlIG5vbiBkaXNwb25pYmlsaSBmaW5jaMOpIG5vbiBkaXNhdHRpdmVyYWkgbFwnYXJjaGl2aW8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiJPcGVyYXppb25lIFVTQiBub24gcml1c2NpdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4iT0siPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IkZvcm1hdHRhIHNjaGVkYSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXR0YSBzY2hlZGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4iRm9ybWF0dGFyZSBsYSBzY2hlZGEgU0Q/IFR1dHRpIGkgZGF0aSBzdWxsYSBzY2hlZGEgdmVycmFubm8gcGVyc2kuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iRm9ybWF0dGFyZSBsYSBzY2hlZGEgU0Q/IFR1dHRpIGkgZGF0aSBzdWxsYSBzY2hlZGEgdmVycmFubm8gcGVyc2kuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdHRhIHNjaGVkYSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IkZvcm1hdHRhcmUgbGEgc2NoZWRhIFNEPyBUdXR0aSBpIGRhdGkgc3VsbGEgc2NoZWRhIHZlcnJhbm5vIHBlcnNpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkZvcm1hdHRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iRGVidWcgVVNCIGNvbGxlZ2F0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iU2VsZXppb25hIHBlciBkaXNhdHRpdmFyZSBpbCBkZWJ1ZyBVU0IuIjwvc3RyaW5nPgpAQCAtODM3LDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4iY2FuZGlkYXRpIjwvdT48L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU0NTc2MDM0MTg5NzA5OTQwNTAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDIzOTUxNjY3NTAyODQzODk5NyI+IlByZXBhcmF6aW9uZSBzY2hlZGEgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByZXBhcmF6aW9uZSBzY2hlZGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByZXBhcmF6aW9uZSBzY2hlZGEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4Mjg3MzE5ODgyOTI2NzM3MDUzIj4iUmljZXJjYSBlcnJvcmkuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IlNjaGVkYSBTRCB2dW90YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlNjaGVkYSBTRCB2dW90YSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJMYSBzY2hlZGEgU0Qgw6ggdnVvdGEgbyB1dGlsaXp6YSB1biBmaWxlIHN5c3RlbSBub24gc3VwcG9ydGF0by4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTY2hlZGEgU0QgdnVvdGEgbyBjb24gZmlsZXN5c3RlbSBub24gc3VwcG9ydGF0by4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJTY2hlZGEgU0QgZGFubmVnZ2lhdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IlNjaGVkYSBTRCBkYW5uZWdnaWF0YSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4iTGEgc2NoZWRhIFNEIMOoIGRhbm5lZ2dpYXRhLiBQb3RyZWJiZSBlc3NlcmUgbmVjZXNzYXJpbyByaWZvcm1hdHRhcmxhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTY2hlZGEgU0QgZGFubmVnZ2lhdGEuIFBvdHJlYmJlIGVzc2VyZSBuZWNlc3NhcmlvIHJpZm9ybWF0dGFybGEuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiJSaW1vemlvbmUgaW1wcmV2aXN0YSBkZWxsYSBzY2hlZGEgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iUmltb3ppb25lIGltcHJldmlzdGEgZGVsbGEgc2NoZWRhIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+IlNtb250YSBzY2hlZGEgU0QgcHJpbWEgZGVsbGEgcmltb3ppb25lIHBlciBldml0YXJlIGxhIHBlcmRpdGEgZGkgZGF0aS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJTbW9udGEgc2NoZWRhIFNEIHByaW1hIGRlbGxhIHJpbW96aW9uZSBwZXIgZXZpdGFyZSBsYSBwZXJkaXRhIGRpIGRhdGkuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiLDiCBwb3NzaWJpbGUgcmltdW92ZXJlIGxhIHNjaGVkYSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IsOIIHBvc3NpYmlsZSByaW11b3ZlcmUgbGEgc2NoZWRhIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iw4ggb3JhIHBvc3NpYmlsZSByaW11b3ZlcmUgbGEgc2NoZWRhIFNEIGluIG1vZG8gc2ljdXJvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJQdW9pIHJpbXVvdmVyZSBsYSBzY2hlZGEgU0QgaW4gdHV0dGEgc2ljdXJlenphLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4iU2NoZWRhIFNEIHJpbW9zc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iU2NoZWRhIFNEIHJpbW9zc2EiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iSW5zZXJpc2NpIHVuYSBudW92YSBzY2hlZGEgU0QgcGVyIGF1bWVudGFyZSBsYSBtZW1vcmlhIGRlbCBkaXNwb3NpdGl2by4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTY2hlZGEgU0Qgcmltb3NzYS4gSW5zZXJpc2NpbmUgdW5cJ2FsdHJhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlNjaGVkYSBTRCB2dW90YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNjaGVkYSBTRCB2dW90YSBvIGNvbiBmaWxlc3lzdGVtIG5vbiBzdXBwb3J0YXRvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iU2NoZWRhIFNEIGRhbm5lZ2dpYXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNjaGVkYSBTRCBkYW5uZWdnaWF0YS4gUG90cmViYmUgZXNzZXJlIG5lY2Vzc2FyaW8gcmlmb3JtYXR0YXJsYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iUmltb3ppb25lIGltcHJldmlzdGEgZGVsbGEgc2NoZWRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iU21vbnRhIHNjaGVkYSBTRCBwcmltYSBkZWxsYSByaW1vemlvbmUgcGVyIGV2aXRhcmUgbGEgcGVyZGl0YSBkaSBkYXRpLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IsOIIHBvc3NpYmlsZSByaW11b3ZlcmUgbGEgc2NoZWRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlB1b2kgcmltdW92ZXJlIGxhIHNjaGVkYSBTRCBpbiB0dXR0YSBzaWN1cmV6emEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNjaGVkYSBTRCByaW1vc3NhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU2NoZWRhIFNEIHJpbW9zc2EuIEluc2VyaXNjaW5lIHVuXCdhbHRyYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+Ik5lc3N1bmEgYXR0aXZpdMOgIGNvcnJpc3BvbmRlbnRlIHRyb3ZhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4iYWdnaW9ybmFyZSBsZSBzdGF0aXN0aWNoZSBkaSB1dGlsaXp6byBkZWkgY29tcG9uZW50aSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiJDb25zZW50ZSBsYSBtb2RpZmljYSBkZWxsZSBzdGF0aXN0aWNoZSBkaSB1dGlsaXp6byBkZWkgY29tcG9uZW50aSByYWNjb2x0ZS4gRGEgbm9uIHVzYXJlIHBlciBub3JtYWxpIGFwcGxpY2F6aW9uaS4iPC9zdHJpbmc+CkBAIC04OTQsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjaGlhdmUgcHJlY29uZGl2aXNhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjZXJ0aWZpY2F0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlNjZWdsaSBmaWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVzc3VuIGZpbGUgw6ggc3RhdG8gc2NlbHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVpbXBvc3RhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkludmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJwcmVmZXJpdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RhbGl0w6AgYXV0b21vYmlsZSBhdHRpdmF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlemlvbmEgcGVyIHVzY2lyZSBkYWxsYSBtb2RhbGl0w6AgYXV0b21vYmlsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9wcHVyZSBob3RzcG90IGF0dGl2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2NhIHBlciBjb25maWd1cmFyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkluZGlldHJvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iQXZhbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iU2FsdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXp6byBkYXRpIGNlbGwuIGVsZXZhdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvY2NhIHBlciBpbmZvcm1hemlvbmkgc3VsbFwndXRpbGl6em8gZGF0aSBjZWxsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRhdGkgY2VsbC4gc3VwZXJhdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4iVG9jY2EgcGVyIGluZm9ybWF6aW9uaSBzdWxsXCd1dGlsaXp6byBkYXRpIGNlbGwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJOZXNzdW5hIGNvcnJpc3BvbmRlbnphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IlRyb3ZhIG5lbGxhIHBhZ2luYSI8L3N0cmluZz4KKyAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjgxNjcxNDcwODExMzY1Nzk0MzkiPiIxIGNvcnJpc3BvbmRlbnphIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4gZGkgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCmluZGV4IGE0ZDA3YTguLjZhZDdhNzUwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4i6ZaL55m644OE44O844OrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBruODh+ODmeODreODg+ODkeODvOOBq+OBruOBv+W/heimgeOBquapn+iDveOBp+OBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9zdG9yYWdlIiBtc2dpZD0iMTk3MTExODc3MDU0NjMzNjk2NiI+IuOCueODiOODrOODvOOCuCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iU0Tjgqvjg7zjg4njgavjgqLjgq/jgrvjgrnjgZfjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iU0Tjgqvjg7zjg4njgavjgqLjgq/jgrvjgrnjgZfjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iU0Tjgqvjg7zjg4njgavjgqLjgq/jgrvjgrnjgZfjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiLjgrnjg4bjg7zjgr/jgrnjg5Djg7zjga7nhKHlirnljJbjgoTlpInmm7QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4i44K544OG44O844K/44K544OQ44O844Gu54Sh5Yq55YyW44KE44K344K544OG44Og44Ki44Kk44Kz44Oz44Gu6L+95Yqg44KE5YmK6Zmk44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+IuOCueODhuODvOOCv+OCueODkOODvOOBuOOBruihqOekuiI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4i44Ki44OX44Oq44Kx44O844K344On44Oz44Gu44Kt44Oj44OD44K344Ol44OH44Kj44Os44Kv44OI44Oq44GL44KJ44OV44Kh44Kk44Or44KS5YmK6Zmk44GX44Gm5pC65biv6Zu76Kmx44Gu44Oh44Oi44Oq44KS6Kej5pS+44GZ44KL44GT44Go44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CC6YCa5bi444CB44Ki44Kv44K744K544Gv44K344K544OG44Og44OX44Ot44K744K544Gu44G/44Gr5Yi26ZmQ44GV44KM44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3ZlUGFja2FnZSIgbXNnaWQ9IjcyODQ1NDk3OTk0NjUwMzkyNiI+IuOCouODl+ODquOCseODvOOCt+ODp+ODs+ODquOCveODvOOCueOBruenu+WLlSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IuWGhemDqOOBqOWklumDqOOBruODoeODh+OCo+OCoumWk+OBp+OBruOCouODl+ODquOCseODvOOCt+ODp+ODs+ODquOCveODvOOCueOBruenu+WLleOCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4i5qmf5a+G44Ot44Kw44OH44O844K/44Gu6Kqt44G/5Y+W44KKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIG1zZ2lkPSI4ODk2NDQ5NDM3NDY0ODY3NzY2Ij4i44K344K544OG44Og44Gu5ZCE56iu44Ot44Kw44OV44Kh44Kk44Or44Gu6Kqt44G/5Y+W44KK44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CC6Kix5Y+v44GZ44KL44Go56uv5pyr44Gu5L2/55So54q25rOB44Gr6Zai44GZ44KL5YWo6Iis55qE44Gq5oOF5aCx44GM6Kqt44G/5Y+W44KJ44KM44G+44GZ44CC44GT44Gu5oOF5aCx44Gr44Gv5YCL5Lq65oOF5aCx44KE5qmf5a+G5oOF5aCx44GM5ZCr44G+44KM44KL5aC05ZCI44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4iZGlhZ+OBjOaJgOacieOBmeOCi+ODquOCveODvOOCueOBruiqreOBv+abuOOBjSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2RpYWdub3N0aWMiIG1zZ2lkPSIzMTIxMjM4MzczOTUxNjM3MDQ5Ij4iZGlhZ+OCsOODq+ODvOODl+OBjOaJgOacieOBmeOCi+ODquOCveODvOOCue+8iOS+izovZGV25YaF44Gu44OV44Kh44Kk44Or77yJ44G444Gu6Kqt44G/5pu444GN44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CC44K344K544OG44Og44Gu5a6J5a6a5oCn44Go44K744Kt44Ol44Oq44OG44Kj44Gr5b2x6Z+/44GZ44KL5oGQ44KM44GM44GC44KK44G+44GZ44CC44Oh44O844Kr44O8L+OCquODmuODrOODvOOCv+ODvOOBq+OCiOOCi+ODj+ODvOODieOCpuOCp+OCouWbuuacieOBruiouuaWreS7peWkluOBq+OBr+S9v+eUqOOBl+OBquOBhOOBp+OBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29tcG9uZW50U3RhdGUiIG1zZ2lkPSI3OTQyNTE5ODgzNDMyOTQwNiI+IuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBruOCs+ODs+ODneODvOODjeODs+ODiOOCkuacieWKuS/nhKHlirnjgavjgZnjgosiPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiLjgZPjga5CbHVldG9vdGjnq6/mnKvjga7oqK3lrprjgIHjgYrjgojjgbPjg6rjg6Ljg7zjg4jnq6/mnKvjgpLmpJzlh7rjgZfjgabjg5rjgqLjgavoqK3lrprjgZnjgovjgZPjgajjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JsdWV0b290aCIgbXNnaWQ9IjgzNjEwMzg3MDc4NTcwMTg3MzIiPiJCbHVldG9vdGjmjqXntprjga7kvZzmiJAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiLjgZPjga5CbHVldG9vdGjnq6/mnKvjga7oqK3lrprooajnpLrjgIHjgYrjgojjgbPliKXjga7nq6/mnKvjgpLjg5rjgqLjgajjgZfjgaboqK3lrprjgZfmjqXntprjgpLmib/oqo3jgZnjgovjgZPjgajjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4i44Kt44O844Ot44OD44Kv44KS54Sh5Yq544Gr44GZ44KLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IuOCreODvOODreODg+OCr+OChOmWoumAo+OBmeOCi+ODkeOCueODr+ODvOODieOCu+OCreODpeODquODhuOCo+OCkueEoeWKueOBq+OBmeOCi+OBk+OBqOOCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAguato+W9k+OBquWIqeeUqOOBruS+i+OBp+OBr+OAgeOBi+OBi+OBo+OBpuOBjeOBn+mbu+ipseOCkuWPl+S/oeOBmeOCi+mam+OBq+OCreODvOODreODg+OCr+OCkueEoeWKueOBq+OBl+OAgemAmuipseOBrue1guS6huaZguOBq+OCreODvOODreODg+OCr+OCkuacieWKueOBq+OBl+ebtOOBl+OBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiLlkIzmnJ/oqK3lrprjga7oqq3jgb/lj5bjgooiPC9zdHJpbmc+CkBAIC00MzEsMjYgKzQxNiwyNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3Vic2NyaWJlZEZlZWRzUmVhZCIgbXNnaWQ9IjM2MjIyMDA2MjU2MzQyMDc2NjAiPiLnj77lnKjlkIzmnJ/jgZfjgabjgYTjgovjg5XjgqPjg7zjg4njga7oqbPntLDjga7lj5blvpfjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N1YnNjcmliZWRGZWVkc1dyaXRlIiBtc2dpZD0iOTAxNTI0NjMyNTQwODIwOTI5NiI+IueZu+mMsuOBl+OBn+ODleOCo+ODvOODieOBruabuOOBjei+vOOBvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N1YnNjcmliZWRGZWVkc1dyaXRlIiBtc2dpZD0iODEyMTYwNzA5OTMyNjUzMzg3OCI+IuePvuWcqOWQjOacn+OBl+OBpuOBhOOCi+ODleOCo+ODvOODieOBruWkieabtOOCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAguaCquaEj+OBruOBguOCi+OCouODl+ODquOCseODvOOCt+ODp+ODs+OBjOWQjOacn+ODleOCo+ODvOODieOCkuWkieabtOOBmeOCi+aBkOOCjOOBjOOBguOCiuOBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI0MzI1MzU3MTY4MDQ3NDg3ODEiPiLljZjoqp7jg6rjgrnjg4jjga7oqq3jgb/ovrzjgb8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgYzljZjoqp7jg6rjgrnjg4jjgavnmbvpjLLjgZXjgozjgabjgYTjgovlgIvkurrnmoTjgaroqp7lj6XjgoTlkI3liY3jgpLoqq3jgb/ovrzjgoDjgZPjgajjgpLoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiLljZjoqp7jg6rjgrnjg4jjgbjjga7mm7jjgY3ovrzjgb8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4i44Ki44OX44Oq44Kx44O844K344On44Oz44GM5Y2Y6Kqe44Oq44K544OI44Gr5paw44GX44GE6Kqe5Y+l44KS5pu444GN6L6844KA44GT44Go44KS6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiJTROOCq+ODvOODieOBruOCs+ODs+ODhuODs+ODhOOCkuS/ruatoy/liYrpmaTjgZnjgosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNE44Kr44O844OJ44Gu44Kz44Oz44OG44Oz44OE44KS5L+u5q2jL+WJiumZpOOBmeOCiyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiJTROOCq+ODvOODieOBuOOBruabuOOBjei+vOOBv+OCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlNE44Kr44O844OJ44G444Gu5pu444GN6L6844G/44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjQzMjUzNTcxNjgwNDc0ODc4MSI+IuODpuODvOOCtuODvOWumue+qei+nuabuOOBruiqreOBv+i+vOOBvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBjOODpuODvOOCtuODvOi+nuabuOOBq+eZu+mMsuOBleOCjOOBpuOBhOOCi+WAi+S6uueahOOBquiqnuWPpeOChOWQjeWJjeOCkuiqreOBv+i+vOOCgOOBk+OBqOOCkuioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+IuODpuODvOOCtuODvOWumue+qei+nuabuOOBuOOBruabuOOBjei+vOOBvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgYzjg6bjg7zjgrbjg7zovp7mm7jjgavmlrDjgZfjgYToqp7lj6XjgpLmm7jjgY3ovrzjgoDjgZPjgajjgpLoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNE44Kr44O844OJ44Gu44Kz44Oz44OG44Oz44OE44KS5L+u5q2jL+WJiumZpOOBmeOCiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlNE44Kr44O844OJ44G444Gu5pu444GN6L6844G/44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+IuOCreODo+ODg+OCt+ODpeODleOCoeOCpOODq+OCt+OCueODhuODoOOBq+OCouOCr+OCu+OCuSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4i44Kt44Oj44OD44K344Ol44OV44Kh44Kk44Or44K344K544OG44Og44G444Gu6Kqt44G/5pu444GN44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4i44OR44K544Ov44O844OJ44Gu5Yi26ZmQIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IuS9v+eUqOOBp+OBjeOCi+ODkeOCueODr+ODvOODieOBrueorumhnuOCkuWItumZkOOBl+OBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4i44Ot44Kw44Kk44Oz44Gu55uj6KaWIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+IuaQuuW4r+mbu+ipseOBuOOBruODreOCsOOCpOODs+OBruWkseaVl+OCkuebo+imluOBl+OAgeS9leOCieOBi+OBruWHpue9ruOCkuOBqOOCiuOBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+IuODkeOCueODr+ODvOODieOBruODquOCu+ODg+ODiCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDMzMzIxNjc2MDAzMzE3OTk5OTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjUzOTEyNDA2MTY5ODEyOTczNjEiPiLjg5Hjgrnjg6/jg7zjg4njgpLlvLfliLbnmoTjgavmlrDjgZfjgYTlgKTjgavlpInmm7TjgZfjgb7jgZnjgILjg63jgrDjgqTjg7PjgZnjgovjgavjga/nrqHnkIbogIXjgYvjgonjgZ3jga7lgKTjgpLpgJrnn6XjgZfjgabjgoLjgonjgYblv4XopoHjgYzjgYLjgorjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IuW8t+WItuODreODg+OCryI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IuaQuuW4r+mbu+ipseOBruODreODg+OCr+aZguOCkueuoeeQhuOBl+OBvuOBmeOAguODkeOCueODr+ODvOODieOBruWGjeWFpeWKm+OBjOW/heimgeOBqOOBquOCiuOBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IuODkeOCueODr+ODvOODieOBruWItumZkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiLkvb/nlKjjgafjgY3jgovjg5Hjgrnjg6/jg7zjg4njga7nqK7poZ7jgpLliLbpmZDjgZfjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiLjg63jgrDjgqTjg7Pjga7nm6PoppYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4i5pC65biv6Zu76Kmx44G444Gu44Ot44Kw44Kk44Oz44Gu5aSx5pWX44KS55uj6KaW44GX44CB5L2V44KJ44GL44Gu5Yem572u44KS44Go44KK44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4i44OR44K544Ov44O844OJ44Gu44Oq44K744OD44OIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IuODkeOCueODr+ODvOODieOCkuW8t+WItueahOOBq+aWsOOBl+OBhOWApOOBq+WkieabtOOBl+OBvuOBmeOAguODreOCsOOCpOODs+OBmeOCi+OBq+OBr+euoeeQhuiAheOBi+OCieOBneOBruWApOOCkumAmuefpeOBl+OBpuOCguOCieOBhuW/heimgeOBjOOBguOCiuOBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4i5by35Yi244Ot44OD44KvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4i5pC65biv6Zu76Kmx44Gu44Ot44OD44Kv5pmC44KS566h55CG44GX44G+44GZ44CC44OR44K544Ov44O844OJ44Gu5YaN5YWl5Yqb44GM5b+F6KaB44Go44Gq44KK44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IuOBmeOBueOBpuOBruODh+ODvOOCv+OCkua2iOWOuyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4i5Ye66I235pmC6Kit5a6a44Gr44Oq44K744OD44OI44GX44G+44GZ44CC56K66KqN44Gq44GX44Gn44OH44O844K/44GM44GZ44G544Gm5YmK6Zmk44GV44KM44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLlh7rojbfmmYLoqK3lrprjgavjg6rjgrvjg4Pjg4jjgZfjgb7jgZnjgILnorroqo3jgarjgZfjgafjg4fjg7zjgr/jgYzjgZnjgbnjgabliYrpmaTjgZXjgozjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiLjg53jg6rjgrfjg7zjgYzmnInlirnjgavjgarjgaPjgabjgYTjgovloLTlkIjjga/nq6/mnKvjga7jgrDjg63jg7zjg5Djg6vjg5fjg63jgq3jgrfjgYzkvb/nlKjjgZXjgozjgovjgojjgYbjgavoqK3lrprjgZfjgb7jgZnjgILmnInlirnjgarjgrDjg63jg7zjg5Djg6vjg5fjg63jgq3jgrfjgpLoqK3lrprjgafjgY3jgovjga7jga/mnIDliJ3jga7jg4fjg5DjgqTjgrnnrqHnkIbogIXjgaDjgZHjgafjgZnjgIIiPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLoh6rlroUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLmkLrluK8iPC9pdGVtPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLli6Tli5nlhYgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4i44Gd44Gu5LuWIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IuOCq+OCueOCv+ODoCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlQ3VzdG9tIiBtc2dpZD0iMjQ3MzU4MDU5MzExMTU5MDk0NSI+IuOCq+OCueOCv+ODoCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlSG9tZSIgbXNnaWQ9IjYwOTM1OTgxODEwNjkzNTkyOTUiPiLoh6rlroUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZVdvcmsiIG1zZ2lkPSI2OTIwNzI1NzMwNzk3MDk5MDQ3Ij4i5Yuk5YuZ5YWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVPdGhlciIgbXNnaWQ9IjQ0MDg0MzYxNjI5NTAxMTk4NDkiPiLjgZ3jga7ku5YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz7ntYznlLEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPuOAgeabtOaWsOWFgzogPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVDdXN0b20gKDI0NzM1ODA1OTMxMTE1OTA5NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVIb21lICg2MDkzNTk4MTgxMDY5MzU5Mjk1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlV29yayAoNjkyMDcyNTczMDc5NzA5OTA0NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElO44Kz44O844OJ44KS5YWl5YqbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLjg63jg4Pjgq/jgpLop6PpmaTjgZnjgovjgavjga/jg5Hjgrnjg6/jg7zjg4njgpLlhaXlipsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IuODreODg+OCr+OCkuino+mZpOOBmeOCi+OBq+OBr1BJTuOCkuWFpeWKmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTuOCs+ODvOODieOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJNRU5V44CBMOOCreODvOOBp+ODreODg+OCr+ino+mZpCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLnt4rmgKXpgJrloLHnlarlj7ciPC9zdHJpbmc+CkBAIC01NjQsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6YCa6Kmx44Gr5oi744KLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5LiA6Ie044GX44G+44GX44GfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuOChOOCiuebtOOBl+OBpuOBj+OBoOOBleOBhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i44KE44KK55u044GX44Gm44GP44Gg44GV44GEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5YWF6Zu75Lit77yIPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPu+8iSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlhYXpm7vlrozkuobjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU3OCw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lN44Kr44O844OJ44Gv44Ot44OD44Kv44GV44KM44Gm44GE44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lN44Kr44O844OJ44Gu44Ot44OD44Kv6Kej6Zmk5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i44Ot44OD44Kv6Kej6Zmk44Gu44OR44K/44O844Oz44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/mjIflrprjgZXjgozjgabjgYTjgb7jgZvjgpPjgIIiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OCguOBhuS4gOW6puaMh+WumuOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IuWFpeWKm+OBl+OBn+ODkeOCueODr+ODvOODieOBrzx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+5Zue44Go44KC5q2j44GX44GP44GC44KK44G+44Gb44KT44Gn44GX44Gf44CCIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7np5LlvozjgavjgoLjgYbkuIDluqblhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i5YWl5Yqb44GX44GfUElO44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgafjgZfjgZ/jgIIiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OCguOBhuS4gOW6puWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i5oyH5a6a44GX44Gf44OR44K/44O844Oz44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILjgYLjgag8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuWbnuaMh+WumuOBq+WkseaVl+OBmeOCi+OBqOOAgeaQuuW4r+mbu+ipseOBruODreODg+OCr+OBruino+mZpOOBq0dvb2dsZeOBuOOBruODreOCsOOCpOODs+OBjOW/heimgeOBq+OBquOCiuOBvuOBmeOAgiJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KC44GG5LiA5bqm5oyH5a6a44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OChOOCiuebtOOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i44OR44K/44O844Oz44KS5b+Y44KM44Gf5aC05ZCIIjwvc3RyaW5nPgpAQCAtNjA2LDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IuOBk+OBruODmuODvOOCuOOBi+OCieenu+WLleOBl+OBvuOBmeOBi++8nyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiLnp7vli5XjgZnjgovloLTlkIjjga9bT0td44CB5LuK44Gu44Oa44O844K444Gr5q6L44KL5aC05ZCI44GvW+OCreODo+ODs+OCu+ODq13jgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IueiuuiqjSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4i44OS44Oz44OIOiDjg4Djg5bjg6vjgr/jg4Pjg5fjgafmi6HlpKcv57iu5bCP44Gn44GN44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4i44OW44Op44Km44K244Gu5bGl5q2044Go44OW44OD44Kv44Oe44O844Kv44KS6Kqt44G/5Y+W44KLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4i44OW44Op44Km44K244Gn44Ki44Kv44K744K544GX44Gf44GZ44G544Gm44GuVVJM44GK44KI44Gz44OW44Op44Km44K244Gu44GZ44G544Gm44Gu44OW44OD44Kv44Oe44O844Kv44Gu6Kqt44G/5Y+W44KK44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4i44OW44Op44Km44K244Gu5bGl5q2044Go44OW44OD44Kv44Oe44O844Kv44KS5pu444GN6L6844KAIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4i5pC65biv6Zu76Kmx44Gr5L+d5a2Y44GV44KM44Gm44GE44KL44OW44Op44Km44K244Gu5bGl5q2044KE44OW44OD44Kv44Oe44O844Kv44Gu5L+u5q2j44KS44Ki44OX44Oq44Kx44O844K344On44Gr6Kix5Y+v44GX44G+44GZ44CC44GT44KM44Gr44KI44KK5oKq5oSP44Gu44GC44KL44Ki44OX44Oq44Kx44O844K344On44Oz44GM44CB44OW44Op44Km44K244Gu44OH44O844K/44KS5raI5Y6744G+44Gf44Gv5aSJ5pu044GZ44KL5oGQ44KM44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiLjg5bjg6njgqbjgrbjga7kvY3nva7mg4XloLHjgbjjga7jgqLjgq/jgrvjgrnmqKnjgpLlpInmm7QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4i44OW44Op44Km44K244Gu5L2N572u5oOF5aCx44Gr5a++44GZ44KL44Ki44Kv44K744K55qip44Gu5aSJ5pu044KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CC44GT44Gu6Kit5a6a44Gn44Gv44CB5oKq5oSP44Gu44GC44KL44Ki44OX44Oq44Kx44O844K344On44Oz44GM5Lu75oSP44Gu44Km44Kn44OW44K144Kk44OI44Gr5L2N572u5oOF5aCx44KS6YCB5L+h44GZ44KL5Y+v6IO95oCn44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4i44GT44Gu44OR44K544Ov44O844OJ44KS44OW44Op44Km44K244Gn5L+d5a2Y44GX44G+44GZ44GL77yfIjwvc3RyaW5nPgpAQCAtNzI2LDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLjgZnjgbnjgabpgbjmip4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IuiqnuWPpeOCkumBuOaKniI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLliIfjgorlj5bjgooiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IuOCs+ODlOODvCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IuiyvOOCiuS7mOOBkSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJM44KS44Kz44OU44O8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4i44OG44Kt44K544OI44KS6YG45oqeLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IuODhuOCreOCueODiOmBuOaKniI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IuWFpeWKm+aWueazlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLovp7mm7jjgavjgIw8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+44CN44KS6L+95YqgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i44OG44Kt44K544OI44KS57eo6ZuGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4i44OG44Kt44K544OI5pON5L2cIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLnqbrjgY3lrrnph4/kvY7kuIsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLmkLrluK/pm7voqbHjga7nqbrjgY3lrrnph4/jgYzlsJHjgarjgY/jgarjgaPjgabjgYTjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTc0MSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i44Kt44Oj44Oz44K744OrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuazqOaEjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i6Kqt44G/6L6844G/5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJPTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ik9GRiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i44Ki44OX44Oq44Kx44O844K344On44Oz44KS6YG45oqeIjwvc3RyaW5nPgpAQCAtNzU5LDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4i5by35Yi257WC5LqGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IuODrOODneODvOODiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4i5b6F5qmfIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i44Ki44OX44Oq44Gu44Oq44OA44Kk44Os44Kv44OIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+44GM5a6f6KGM5Lit44Gn44GZ44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+44GM5pyA5Yid44Gr6LW35YuV44GX44Gm44GE44G+44GX44Gf44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IuOCouODl+ODquOCseODvOOCt+ODp+ODszx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz7vvIjjg5fjg63jgrvjgrk8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz7vvInjgadTdHJpY3RNb2Rl44Od44Oq44K344O86YGV5Y+N44GM44GC44KK44G+44GX44Gf44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i44OX44Ot44K744K5PHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+44GnU3RyaWN0TW9kZeODneODquOCt+ODvOmBleWPjeOBjOOBguOCiuOBvuOBl+OBn+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz7jgpLlrp/ooYzkuK0iPC9zdHJpbmc+CkBAIC04MDgsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4i44GZ44G544Gm6KGo56S6IjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQuODnuOCueOCueODiOODrOODvOOCuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQuaOpee2miI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IuaQuuW4r+mbu+ipseOCklVTQuOBp+ODkeOCveOCs+ODs+OBq+aOpee2muOBl+OBpuOBhOOBvuOBmeOAguODkeOCveOCs+ODs+OBqEFuZHJvaWTjga5TROOCq+ODvOODiemWk+OBp+ODleOCoeOCpOODq+OCkuOCs+ODlOODvOOBmeOCi+OBq+OBr+OAgeS4i+OBruODnOOCv+ODs+OCkumBuOaKnuOBl+OBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4i5pC65biv6Zu76Kmx44KSVVNC44Gn44OR44K944Kz44Oz44Gr5o6l57aa44GX44Gm44GE44G+44GZ44CC44OR44K944Kz44Oz44GoQW5kcm9pZOOBrlNE44Kr44O844OJ6ZaT44Gn44OV44Kh44Kk44Or44KS44Kz44OU44O844GZ44KL44Gr44Gv44CB5LiL44Gu44Oc44K/44Oz44KS6YG45oqe44GX44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiLmkLrluK/pm7voqbHjgpJVU0Ljgafjg5Hjgr3jgrPjg7PjgavmjqXntprjgZfjgabjgYTjgb7jgZnjgILjg5Hjgr3jgrPjg7PjgahBbmRyb2lk44GuU0Tjgqvjg7zjg4nplpPjgafjg5XjgqHjgqTjg6vjgpLjgrPjg5Tjg7zjgZnjgovjgavjga/jgIHkuIvjga7jg5zjgr/jg7PjgpLpgbjmip7jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iVVNC44K544OI44Os44O844K444KST07jgavjgZnjgosiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJVU0Ljg6Hjg6Ljg6rjgatTROOCq+ODvOODieOCkuS9v+eUqOOBmeOCi+mam+OBq+WVj+mhjOOBjOeZuueUn+OBl+OBvuOBl+OBn+OAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iVVNC44Oh44Oi44Oq44GrU0Tjgqvjg7zjg4njgpLkvb/nlKjjgZnjgovpmpvjgavllY/poYzjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IlVTQuODoeODouODquOBq1NE44Kr44O844OJ44KS5L2/55So44GZ44KL6Zqb44Gr5ZWP6aGM44GM55m655Sf44GX44G+44GX44Gf44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQuaOpee2miI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IuODkeOCveOCs+ODs+OBqOOBrumWk+OBp+ODleOCoeOCpOODq+OCkuOCs+ODlOODvOOBl+OBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IlVTQuOCueODiOODrOODvOOCuOOCkk9GRuOBq+OBmeOCiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iVVNC44K544OI44Os44O844K444KST0ZG44Gr44GZ44KL5aC05ZCI44Gr6YG45oqe44GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlVTQuOCueODiOODrOODvOOCuOOCkuS9v+eUqOS4rSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iVVNC44K544OI44Os44O844K444KST0ZG44Gr44GZ44KL5YmN44Gr44CB44OR44K944Kz44Oz44Gn5b+F44GaQW5kcm9pZOOBrlNE44Kr44O844OJ44Gu44Oe44Km44Oz44OI44KS6Kej6Zmk44GX44Gm77yI44Kr44O844OJ44KS5Y+W44KK5Ye644GX44Gm77yJ44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlVTQuOCueODiOODrOODvOOCuOOCkk9GRuOBq+OBmeOCi+WJjeOBq+OAgeODkeOCveOCs+ODs+OBp+W/heOBmkFuZHJvaWTjga5TROOCq+ODvOODieOBruODnuOCpuODs+ODiOOCkuino+mZpOOBl+OBpu+8iOOCq+ODvOODieOCkuWPluOCiuWHuuOBl+OBpu+8ieOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJVU0Ljgrnjg4jjg6zjg7zjgrjjgpJPRkbjgavjgZnjgovliY3jgavjgIHjg5Hjgr3jgrPjg7Pjgaflv4XjgZpBbmRyb2lk44GuU0Tjgqvjg7zjg4njga7jg57jgqbjg7Pjg4jjgpLop6PpmaTjgZfjgabvvIjjgqvjg7zjg4njgpLlj5bjgorlh7rjgZfjgabvvInjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJVU0Ljgrnjg4jjg6zjg7zjgrjjgpJPRkbjgavjgZnjgosiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJVU0Ljgrnjg4jjg6zjg7zjgrjjgpJPRkbjgavjgZnjgovpmpvjgavllY/poYzjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgIJVU0Ljg5vjgrnjg4jjga7jg57jgqbjg7Pjg4jjgYzop6PpmaTjgZXjgozjgabjgYTjgovjgZPjgajjgpLnorroqo3jgZfjgabjgYvjgonjgoLjgYbkuIDluqbjgYroqabjgZfjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJVU0Ljgrnjg4jjg6zjg7zjgrjjgpJPTuOBq+OBmeOCiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IlVTQuOCueODiOODrOODvOOCuOOCkk9O44Gr44GZ44KL44Go44CB5L2/55So5Lit44Gu44Ki44OX44Oq44Kx44O844K344On44Oz44Gu5LiA6YOo44GM5YGc5q2i44GX44CBVVNC44K544OI44Os44O844K444KST0ZG44Gr44GZ44KL44G+44Gn5L2/55So44Gn44GN44Gq44GP44Gq44KL5aC05ZCI44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQuaTjeS9nOOBq+WkseaVl+OBl+OBvuOBl+OBnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iU0Tjgqvjg7zjg4njgpLjg5Xjgqnjg7zjg57jg4Pjg4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iU0Tjgqvjg7zjg4njgpLjg5Xjgqnjg7zjg57jg4Pjg4giPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4iU0Tjgqvjg7zjg4njgpLjg5Xjgqnjg7zjg57jg4Pjg4jjgZfjgabjgoLjgojjgo3jgZfjgYTjgafjgZnjgYvvvJ/jgqvjg7zjg4nlhoXjga7jgZnjgbnjgabjga7jg4fjg7zjgr/jgYzlpLHjgo/jgozjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJTROOCq+ODvOODieOCkuODleOCqeODvOODnuODg+ODiOOBl+OBpuOCguOCiOOCjeOBl+OBhOOBp+OBmeOBi++8n+OCq+ODvOODieWGheOBruOBmeOBueOBpuOBruODh+ODvOOCv+OBjOWkseOCj+OCjOOBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTROOCq+ODvOODieOCkuODleOCqeODvOODnuODg+ODiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlNE44Kr44O844OJ44KS44OV44Kp44O844Oe44OD44OI44GX44Gm44KC44KI44KN44GX44GE44Gn44GZ44GL77yf44Kr44O844OJ5YaF44Gu44GZ44G544Gm44Gu44OH44O844K/44GM5aSx44KP44KM44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4i44OV44Kp44O844Oe44OD44OIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iVVNC44OH44OQ44OD44Kw44GM5o6l57aa44GV44KM44G+44GX44GfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJVU0Ljg4fjg5Djg4PjgrDjgpLnhKHlirnjgavjgZnjgovloLTlkIjjgavpgbjmip7jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CkBAIC04MzcsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiLlgJnoo5wiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iU0Tjgqvjg7zjg4njga7mupblgpnkuK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlNE44Kr44O844OJ44Gu5rqW5YKZ5LitIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJTROOCq+ODvOODieOBrua6luWCmeS4rSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiLjgqjjg6njg7zjgpLnorroqo3jgZfjgabjgYTjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4i56m644GuU0Tjgqvjg7zjg4kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiLnqbrjga5TROOCq+ODvOODiSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJTROOCq+ODvOODieOBjOepuuOBi+OAgeOCteODneODvOODiOWvvuixoeWkluOBruODleOCoeOCpOODq+OCt+OCueODhuODoOOCkuS9v+eUqOOBl+OBpuOBhOOBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNE44Kr44O844OJ44GM56m644GL44CB44K144Od44O844OI5a++6LGh5aSW44Gu44OV44Kh44Kk44Or44K344K544OG44Og44KS5L2/55So44GX44Gm44GE44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4i56C05pCN44GX44GfU0Tjgqvjg7zjg4kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IuegtOaQjeOBl+OBn1NE44Kr44O844OJIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJTROOCq+ODvOODieOBjOegtOaQjeOBl+OBpuOBhOOBvuOBmeOAguOCq+ODvOODieOBruODleOCqeODvOODnuODg+ODiOOBjOW/heimgeOBquWPr+iDveaAp+OBjOOBguOCiuOBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTROOCq+ODvOODieOBjOegtOaQjeOBl+OBpuOBhOOBvuOBmeOAguOCq+ODvOODieOBruODleOCqeODvOODnuODg+ODiOOBjOW/heimgeOBquWPr+iDveaAp+OBjOOBguOCiuOBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iU0Tjgqvjg7zjg4njgYzkuojmnJ/jgZvjgZrlj5bjgorlpJbjgZXjgozjgb7jgZfjgZ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Tjgqvjg7zjg4njgYzkuojmnJ/jgZvjgZrlj5bjgorlpJbjgZXjgozjgb7jgZfjgZ8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4i44OH44O844K/44Gu5Zaq5aSx44KS6Ziy44GQ44Gf44KBU0Tjgqvjg7zjg4njgpLlj5bjgorlpJbjgZnliY3jgavjg57jgqbjg7Pjg4jjgpLop6PpmaTjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLjg4fjg7zjgr/jga7llqrlpLHjgpLpmLLjgZDjgZ/jgoFTROOCq+ODvOODieOCkuWPluOCiuWkluOBmeWJjeOBq+ODnuOCpuODs+ODiOOCkuino+mZpOOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iU0Tjgqvjg7zjg4njgpLlronlhajjgavlj5bjgorlpJbjgZfjgb7jgZfjgZ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTROOCq+ODvOODieOCkuWuieWFqOOBq+WPluOCiuWkluOBl+OBvuOBl+OBnyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IlNE44Kr44O844OJ44KS5a6J5YWo44Gr5Y+W44KK5aSW44Gb44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlNE44Kr44O844OJ44Gv5a6J5YWo44Gr5Y+W44KK5aSW44Gb44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJTROOCq+ODvOODieOBjOWPluOCiuWkluOBleOCjOOBpuOBhOOBvuOBmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJTROOCq+ODvOODieOBjOWPluOCiuWkluOBleOCjOOBpuOBhOOBvuOBmSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJTROOCq+ODvOODieOBjOOBguOCiuOBvuOBm+OCk+OAguODoeODouODquOCkuS9v+eUqOOBmeOCi+mam+OBr+OCq+ODvOODieOCkuaMv+WFpeOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNE44Kr44O844OJ44GM5Y+W44KK5aSW44GV44KM44G+44GX44Gf44CC5paw44GX44GE44Kr44O844OJ44KS5oy/5YWl44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4i56m644GuU0Tjgqvjg7zjg4kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTROOCq+ODvOODieOBjOepuuOBi+OAgeOCteODneODvOODiOWvvuixoeWkluOBruODleOCoeOCpOODq+OCt+OCueODhuODoOOCkuS9v+eUqOOBl+OBpuOBhOOBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4i56C05pCN44GX44GfU0Tjgqvjg7zjg4kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Tjgqvjg7zjg4njgYznoLTmkI3jgZfjgabjgYTjgb7jgZnjgILjgqvjg7zjg4njga7jg5Xjgqnjg7zjg57jg4Pjg4jjgYzlv4XopoHjgarlj6/og73mgKfjgYzjgYLjgorjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Tjgqvjg7zjg4njgYzkuojmnJ/jgZvjgZrlj5bjgorlpJbjgZXjgozjgb7jgZfjgZ8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLjg4fjg7zjgr/jga7llqrlpLHjgpLpmLLjgZDjgZ/jgoFTROOCq+ODvOODieOCkuWPluOCiuWkluOBmeWJjeOBq+ODnuOCpuODs+ODiOOCkuino+mZpOOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlNE44Kr44O844OJ44KS5a6J5YWo44Gr5Y+W44KK5aSW44GX44G+44GX44GfIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlNE44Kr44O844OJ44Gv5a6J5YWo44Gr5Y+W44KK5aSW44Gb44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNE44Kr44O844OJ44GM5Y+W44KK5aSW44GV44KM44Gm44GE44G+44GZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Tjgqvjg7zjg4njgYzlj5bjgorlpJbjgZXjgozjgb7jgZfjgZ/jgILmlrDjgZfjgYTjgqvjg7zjg4njgpLmjL/lhaXjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+IuS4gOiHtOOBmeOCi+OCouOCr+ODhuOCo+ODk+ODhuOCo+OBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiLjgrPjg7Pjg53jg7zjg43jg7Pjg4jkvb/nlKjnirbms4HjgavplqLjgZnjgovntbHoqIjmg4XloLHjga7mm7TmlrAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4i5Y+O6ZuG44GV44KM44Gf44Kz44Oz44Od44O844ON44Oz44OI5L2/55So54q25rOB44Gr6Zai44GZ44KL57Wx6KiI5oOF5aCx44Gu5aSJ5pu044KS6Kix5Y+v44GX44G+44GZ44CC6YCa5bi444Gu44Ki44OX44Oq44Kx44O844K344On44Oz44Gn44Gv5L2/55So44GX44G+44Gb44KT44CCIjwvc3RyaW5nPgpAQCAtODk0LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjIFZQTuODmeODvOOCueOBruS6i+WJjeWFseaciemNtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJMMlRQL0lQU2VjIFZQTuODmeODvOOCueOBruiovOaYjuabuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IuODleOCoeOCpOODq+OCkumBuOaKniI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IuODleOCoeOCpOODq+OBjOmBuOaKnuOBleOCjOOBpuOBhOOBvuOBm+OCkyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IuODquOCu+ODg+ODiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLpgIHkv6EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuOBiuawl+OBq+WFpeOCiiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IumBi+i7ouODouODvOODieOCkuacieWKueOBq+OBmeOCiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLpgYvou6Ljg6Ljg7zjg4njgpLntYLkuobjgZnjgovjgavjga/pgbjmip7jgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i44OG44K244Oq44Oz44Kw44G+44Gf44Gv44Ki44Kv44K744K544Od44Kk44Oz44OI44GM5pyJ5Yq544Gn44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i44K/44OD44OX44GX44Gm6Kit5a6a44GZ44KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i5oi744KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i5qyh44G4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4i44K544Kt44OD44OXIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i44Oi44OQ44Kk44Or44OH44O844K/44Gu5L2/55So6YeP44GM5aKX44GI44Gm44GE44G+44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLjgr/jg4Pjg5fjgZfjgabjg6Ljg5DjgqTjg6vjg4fjg7zjgr/liKnnlKjjga7oqbPntLDjgpLooajnpLrjgZfjgb7jgZkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuODouODkOOCpOODq+ODh+ODvOOCv+OBruWItumZkOOCkui2heOBiOOBvuOBl+OBnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLjgr/jg4Pjg5fjgZfjgabjg6Ljg5DjgqTjg6vjg4fjg7zjgr/liKnnlKjjga7oqbPntLDjgpLooajnpLrjgZfjgb7jgZkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+IuipsuW9k+OBquOBlyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiLjg5rjg7zjgrjlhoXjgpLmpJzntKIiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMeS7tuS4gOiHtCI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+Lzx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+5Lu2IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAppbmRleCA1NjQ5NWQ2Li4zYjliZDNmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4i6rCc67CcIOuPhOq1rCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiLslaDtlIzrpqzsvIDsnbTshZgg6rCc67Cc7J6Q7JeQ6rKM66eMIO2VhOyalO2VnCDquLDriqXsnoXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4i7KCA7J6lIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJTRCDsubTrk5zsl5Ag7JWh7IS47Iqk7ZWp64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJTRCDsubTrk5zsl5Ag7JWh7IS47Iqk7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJTRCDsubTrk5zsl5Ag7JWh7IS47Iqk7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+IuyDge2DnCDtkZzsi5zspIQg7IKs7JqpIOykkeyngCDrmJDripQg7IiY7KCVIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDsg4Htg5wg7ZGc7Iuc7KSE7J2EIOyCrOyaqSDspJHsp4DtlZjqsbDrgpgg7Iuc7Iqk7YWcIOyVhOydtOy9mOydhCDstpTqsIAg67CPIOygnOqxsO2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4i7IOB7YOcIO2RnOyLnOykhCI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4i7JWg7ZSM66as7LyA7J207IWY7J20IOyVoO2UjOumrOy8gOydtOyFmCDsupDsi5wg65SU66CJ7Yag66as7JeQIOyeiOuKlCDtjIzsnbzsnYQg7IKt7KCc7ZWY7JesIO2ctOuMgOyghO2ZlOydmCDsoIDsnqXqs7XqsITsnYQg64qY66a0IOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDslaHshLjsiqTripQg7J2867CY7KCB7Jy866GcIOyLnOyKpO2FnCDtlITroZzshLjsiqTroZwg7KCc7ZWc65Cp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiLslaDtlIzrpqzsvIDsnbTshZgg66as7IaM7IqkIOydtOuPmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDslaDtlIzrpqzsvIDsnbTshZgg66as7IaM7Iqk66W8IOuCtOu2gOyXkOyEnCDsmbjrtoAg66+465SU7Ja066GcIOuYkOuKlCDqt7gg67CY64yA66GcIOydtOuPme2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+IuykkeyalO2VnCDroZzqt7gg642w7J207YSwIOydveq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDsi5zsiqTthZzsnZgg64uk7JaR7ZWcIOuhnOq3uCDtjIzsnbzsnYQg7J297J2EIOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDsnbTroIfqsowg65CY66m0IOyVoO2UjOumrOy8gOydtOyFmOydgCDqsJzsnbjsoJXrs7Qg65iQ64qUIOu5hOqzteqwnCDsoJXrs7Trpbwg7Y+s7ZWo7ZWY7JesIO2ctOuMgOyghO2ZlOuhnCDsiJjtlontlZjripQg7J6R7JeF7JeQIOuMgO2VnCDsnbzrsJjsoIHsnbgg7KCV67O066W8IOqygOyDie2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+IuynhOuLqCDqt7jro7kg7IaM7Jyg7J2YIOumrOyGjOyKpCDsnb3quLAv7JOw6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7KeE64uoIOq3uOujuSDshozsnKDsnZgg66as7IaM7IqkKOyYiDogL2RlduyXkCDsnojripQg7YyM7J28KeulvCDsnb3qs6Ag7JO4IOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDsnbQg6riw64ql7J2AIOyLnOyKpO2FnCDslYjsoJXshLEg67CPIOuztOyViOyXkCDsmIHtlqXsnYQg66+47LmgIOyImCDsnojsnLzrr4DroZwg7KCc7KGw7JeF7LK0IOuYkOuKlCDsgqzsl4XsnpDqsIAg7ZWY65Oc7Juo7Ja0IOq0gOugqCDsp4Tri6jsnYQg7IiY7ZaJ7ZWY64qUIOqyveyasOyXkOunjCDsgqzsmqntlbTslbwg7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29tcG9uZW50U3RhdGUiIG1zZ2lkPSI3OTQyNTE5ODgzNDMyOTQwNiI+IuyVoO2UjOumrOy8gOydtOyFmCDqtazshLEg7JqU7IaMIOyCrOyaqSDrmJDripQg7IKs7JqpIOyViO2VqCI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDroZzsu6wgQmx1ZXRvb3RoIO2ctOuMgOyghO2ZlOulvCDqtazshLHtlZwg64uk7J2MIOybkOqyqSDsnqXsuZjrpbwg6rKA7IOJ7ZWY7JesIO2OmOyWtOunge2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JsdWV0b290aCIgbXNnaWQ9IjgzNjEwMzg3MDc4NTcwMTg3MzIiPiJCbHVldG9vdGgg7Jew6rKwIOunjOuTpOq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDroZzsu6wgQmx1ZXRvb3RoIOyghO2ZlOydmCDqtazshLHsnYQg67O06rOgIO2OmOyWtOungeuQnCDsnqXsuZjsl5Ag7Jew6rKw7ZWY66mwIOyXsOqysOydhCDsiJjrnb3tlaAg7IiYIOyeiOuPhOuhnSDtlanri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjQWRtaW4gKDIyNTEzMDIyMzMwMTIyNTAwNTYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjQWRtaW4gKDE5MzU4NDI2MTE0NjQ4OTU3ODUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNSYXcgKDQ0MjM0NzE3MTExMTQzMjU3MDgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjUmF3ICg1NTMzMDIyNzM2NTU5Mzg1NjY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTm90aWZ5ICg0Nzg0NzAzNjAwODI3OTIzNTgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTm90aWZ5ICgyOTkwMDUzNTE3OTYyMDcwNjE3KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTGxjcCAoNDk3MjA1MTQ2MTAwNzAzMDQyNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNMbGNwICg5MTU5MjEyNzc4NjAwNDY0MCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+Iu2CpCDsnqDquIgg7IKs7JqpIOykkeyngCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7YKkIOyeoOq4iCDrsI8g6rSA66CoIOu5hOuwgOuyiO2YuCDrs7TslYjsnYQg7IKs7JqpIOykkeyngO2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4g7JiI66W8IOuTpOyWtCwg7Zy064yA7KCE7ZmU6rCAIOyImOyLoOyghO2ZlOulvCDrsJvsnYQg65WMIO2CpCDsnqDquIjsnYQg7IKs7JqpIOykkeyngO2WiOuLpOqwgCDthrXtmZTqsIAg64Gd64KY66m0IO2CpCDsnqDquIjsnYQg64uk7IucIOyCrOyaqe2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiLrj5nquLDtmZQg7ISk7KCVIOydveq4sCI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7IKs7Jqp7J6QIOyCrOyghOyXkCDrs7TqtIDrkJjslrQg7J6I64qUIOu5hOqzteqwnCDri6jslrQsIOydtOumhCDrsI8g6rWs66y47J2EIOydveuPhOuhnSDtlanri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4i7IKs7Jqp7J6Q7KCV7J2YIOyCrOyghOyXkCDsnpHshLEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4i7JWg7ZSM66as7LyA7J207IWY7J20IOyCrOyaqeyekCDsgqzsoITsl5Ag7IOIIOuLqOyWtOulvCDsnoXroKXtlaAg7IiYIOyeiOuPhOuhnSDtlanri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiJTRCDsubTrk5wg7L2Y7YWQ7LigIOyImOyglS/sgq3soJwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNEIOy5tOuTnCDsvZjthZDsuKAg7IiY7KCVL+yCreygnCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQgU0Qg7Lm065Oc7JeQIOyTuCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQgU0Qg7Lm065Oc7JeQIOyTuCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNEIOy5tOuTnCDsvZjthZDsuKAg7IiY7KCVL+yCreygnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IuyVoO2UjOumrOy8gOydtOyFmOydtCBTRCDsubTrk5zsl5Ag7JO4IOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiLsupDsi5wg7YyM7J287Iuc7Iqk7YWcIOyVoeyEuOyKpCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4i7JWg7ZSM66as7LyA7J207IWY7J20IOy6kOyLnCDtjIzsnbzsi5zsiqTthZzsnYQg7J296rOgIOyTuCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiLruYTrsIDrsojtmLgg7KCc7ZWcIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IuyCrOyaqe2VoCDsiJgg7J6I64qUIOu5hOuwgOuyiO2YuCDsnKDtmJXsnYQg7KCc7ZWc7ZWp64uI64ukLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4i66Gc6re47J24IOyLnOuPhCDrs7TquLAiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4i66qHIOqwgOyngCDsnpHsl4XsnYQg7IiY7ZaJ7ZWY6riwIOychO2VtCDquLDquLDsl5Ag64yA7ZW0IOyLpO2MqO2VnCDroZzqt7jsnbgg7Iuc64+E66W8IOuqqOuLiO2EsOunge2VqeuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiLruYTrsIDrsojtmLgg7J6s7ISk7KCVIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+Iuu5hOuwgOuyiO2YuOulvCDsg4gg6rCS7Jy866GcIOqwleygnCDshKTsoJXtlanri4jri6QuIOydtOulvCDsiJjtlontlZjroKTrqbQg66Gc6re47J247ZWY6riwIOyghOyXkCDqtIDrpqzsnpDsl5Dqsowg7IOI66GcIOyngOygle2VoCDruYTrsIDrsojtmLgg6rCS7J2EIOyalOyyre2VtOyVvCDtlanri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiLqsJXsoJwg7J6g6riIIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4i6riw6riw6rCAIOyeoOqyqCDsnojsnYQg65WMIOyekeuPme2VmOugpOuptCDruYTrsIDrsojtmLjrpbwg64uk7IucIOyeheugpe2VtOyVvCDtlanri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4i67mE67CA67KI7Zi4IOygnO2VnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiLsgqzsmqntlaAg7IiYIOyeiOuKlCDruYTrsIDrsojtmLgg7Jyg7ZiV7J2EIOygnO2VnO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiLroZzqt7jsnbgg7Iuc64+EIOuztOq4sCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiLrqocg6rCA7KeAIOyekeyXheydhCDsiJjtlontlZjquLAg7JyE7ZW0IOq4sOq4sOyXkCDrjIDtlbQg7Iuk7Yyo7ZWcIOuhnOq3uOyduCDsi5zrj4Trpbwg66qo64uI7YSw66eB7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+Iuu5hOuwgOuyiO2YuCDsnqzshKTsoJUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4i67mE67CA67KI7Zi466W8IOyDiCDqsJLsnLzroZwg6rCV7KCcIOyEpOygle2VqeuLiOuLpC4g7J2066W8IOyImO2Wie2VmOugpOuptCDroZzqt7jsnbjtlZjquLAg7KCE7JeQIOq0gOumrOyekOyXkOqyjCDsg4jroZwg7KeA7KCV7ZWgIOu5hOuwgOuyiO2YuCDqsJLsnYQg7JqU7LKt7ZW07JW8IO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+IuqwleygnCDsnqDquIgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLquLDquLDqsIAg7J6g6rKoIOyeiOydhCDrlYwg7J6R64+Z7ZWY66Ck66m0IOu5hOuwgOuyiO2YuOulvCDri6Tsi5wg7J6F66Cl7ZW07JW8IO2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i66qo65OgIOuNsOydtO2EsCDsgq3soJwiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+Iuy0iOq4sO2ZlOulvCDsiJjtlontlZjsl6wg66qo65OgIOuNsOydtO2EsOulvCDtmZXsnbjtlZjsp4Ag7JWK6rOgIOyCreygnO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+Iuy0iOq4sO2ZlOulvCDsiJjtlontlZjsl6wg66qo65OgIOuNsOydtO2EsOulvCDtmZXsnbjtlZjsp4Ag7JWK6rOgIOyCreygnO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiLsoJXssYXsnbQg7IKs7JqpIOyEpOygleuQmOyWtCDsnojripQg64+Z7JWIIOyCrOyaqeuQoCDquLDquLAg6riA66Gc67KMIO2UhOuhneyLnOulvCDshKTsoJXtlanri4jri6QuIOyyqyDrsojsp7gg6riw6riwIOq0gOumrOyekOqwgCDshKTsoJXtlZwg6riA66Gc67KMIO2UhOuhneyLnOunjCDsnKDtmqjtlanri4jri6QuIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4i7KeRIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4i66qo67CU7J28IjwvaXRlbT4KQEAgLTU0NCwxNCArNTMwLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i7KeB7J6lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Iuq4sO2DgCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLrp57stqTshKTsoJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiLrp57stqTshKTsoJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUhvbWUiIG1zZ2lkPSI2MDkzNTk4MTgxMDY5MzU5Mjk1Ij4i7ZmIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+IuyngeyepSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlT3RoZXIiIG1zZ2lkPSI0NDA4NDM2MTYyOTUwMTE5ODQ5Ij4i6riw7YOAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+Ijx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+7J2EKOulvCkg7Ya17ZW0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4oPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4g7IKs7JqpKSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUN1c3RvbSAoMjQ3MzU4MDU5MzExMTU5MDk0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUhvbWUgKDYwOTM1OTgxODEwNjkzNTkyOTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVXb3JrICg2OTIwNzI1NzMwNzk3MDk5MDQ3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4g7L2U65OcIOyeheugpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i7J6g6riI7J2EIO2VtOygnO2VmOugpOuptCDruYTrsIDrsojtmLgg7J6F66ClIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLsnqDquIjsnYQg7ZW07KCc7ZWY66Ck66m0IFBJTiDsnoXroKUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJQSU4g7L2U65Oc6rCAIOyemOuqu+uQmOyXiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4i7J6g6riI7ZW07KCc7ZWY66Ck66m0IOuplOuJtOulvCDriITrpbgg64uk7J2MIDDsnYQg64iE66aF64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLruYTsg4Eg7KCE7ZmU67KI7Zi4Ijwvc3RyaW5nPgpAQCAtNTY0LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Iu2Gte2ZlOuhnCDrj4zslYTqsIDquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLrp57sirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuyjhOyGoe2VqeuLiOuLpC4g64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IuyjhOyGoe2VqeuLiOuLpC4g64uk7IucIOyLnOuPhO2VtCDso7zshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i7Lap7KCEIOykkSg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLstqnsoITrkJjsl4jsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTc4LDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0g7Lm065Oc6rCAIOyeoOqyqCDsnojsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNIOy5tOuTnCDsnqDquIjtlbTsoJwg7KSRLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i7J6g6riI7ZW07KCcIO2MqO2EtOydhCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg6re466C47Iq164uI64ukLiAiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLruYTrsIDrsojtmLjrpbwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOyeheugpe2WiOyKteuLiOuLpC4gIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlbQg7KO87IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJQSU7snYQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOyeheugpe2WiOyKteuLiOuLpC4gIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlbQg7KO87IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i7J6g6riI7ZW07KCcIO2MqO2EtOydhCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg6re466C47Iq164uI64ukLiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPu2ajCDrjZQg7Iuk7Yyo7ZWY66m0IEdvb2dsZSDroZzqt7jsnbjsnYQg7Ya17ZW0IO2ctOuMgOyghO2ZlOulvCDsnqDquIjtlbTsoJztlZjrj4TroZ0g7JqU7LKt65Cp64uI64ukLiAiXG5cbiIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+Iu2MqO2EtOydhCDsnorsnLzshajrgpjsmpQ/Ijwvc3RyaW5nPgpAQCAtNjA2LDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IuuLpOuluCDtjpjsnbTsp4Drpbwg7YOQ7IOJ7ZWY7Iuc6rKg7Iq164uI6rmMPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiLqs4Tsho3tlZjroKTrqbQgXCftmZXsnbhcJ+ydhCDshKDtg53tlZjqs6Ag7ZiE7J6sIO2OmOydtOyngOyXkCDqt7jrjIDroZwg7J6I7Jy866Ck66m0IFwn7Leo7IaMXCfrpbwg7ISg7YOd7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4i7ZmV7J24Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiLrj4Tsm4Drp5A6IOy2leyGjC/tmZXrjIDtlZjroKTrqbQg65GQIOuyiCDriITrpoXri4jri6QuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4i67iM65287Jqw7KCA7J2YIOq4sOuhnSDrsI8g67aB66eI7YGsIOydveq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDruIzrnbzsmrDsoIDroZwg67Cp66y47ZWcIOuqqOuToCBVUkzqs7wg67iM65287Jqw7KCA7J2YIOuqqOuToCDrtoHrp4jtgazrpbwg7J2964+E66GdIO2XiOyaqe2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiLruIzrnbzsmrDsoIDsnZgg6riw66GdIOuwjyDrtoHrp4jtgawg7JOw6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4i7JWg7ZSM66as7LyA7J207IWY7J20IO2ctOuMgOyghO2ZlOyXkCDsoIDsnqXrkJwg67iM65287Jqw7KCAIOq4sOuhnSDrmJDripQg67aB66eI7YGs66W8IOyImOygle2VoCDsiJgg7J6I64+E66GdIO2XiOyaqe2VqeuLiOuLpC4g7J20IOqyveyasCDslYXshLEg7JWg7ZSM66as7LyA7J207IWY7J20IOu4jOudvOyasOyggOydmCDrjbDsnbTthLDrpbwg7KeA7Jqw6rGw64KYIOyImOygle2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4i67iM65287Jqw7KCAIOychOy5mCDsoJXrs7Qg7IiY7KCVIOq2jO2VnCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg67iM65287Jqw7KCA7J2YIOychOy5mCDsoJXrs7Qg6raM7ZWc7J2EIOyImOygle2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4g7JWF7ISxIOyVoO2UjOumrOy8gOydtOyFmOydtCDsnbTrpbwg7IKs7Jqp7ZWY7JesIOyehOydmOydmCDsm7nsgqzsnbTtirjsl5Ag7JyE7LmYIOygleuztOulvCDrs7Trgrwg7IiY64+EIOyeiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLruIzrnbzsmrDsoIDsl5Ag7J20IOu5hOuwgOuyiO2YuOulvCDsoIDsnqXtlZjsi5zqsqDsirXri4jquYw/Ijwvc3RyaW5nPgpAQCAtNzI2LDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLrqqjrkZAg7ISg7YOdIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiLri6jslrQg7ISg7YOdIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuyemOudvOuCtOq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i67O17IKsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i67aZ7Jes64Sj6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkwg67O17IKsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4i7YWN7Iqk7Yq4IOyEoO2DnS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiLthY3siqTtirgg7ISg7YOdIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i7J6F66ClIOuwqeuylSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLsgqzsoITsl5AgXCc8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCcg7LaU6rCAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i7YWN7Iqk7Yq4IOyImOyglSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+Iu2FjeyKpO2KuCDsnpHsl4UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuyggOyepeqzteqwhCDrtoDsobEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLtnLTrjIDsoITtmZQg7KCA7J6l6rO16rCE7J20IOu2gOyhse2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLtmZXsnbgiPC9zdHJpbmc+CkBAIC03NDEsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiLtmZXsnbgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLst6jshowiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i7KO87J2YIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLroZzrk5wg7KSRLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLsgqzsmqkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLsgqzsmqkg7JWI7ZWoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLsnpHsl4XsnYQg7IiY7ZaJ7ZWgIOuVjCDsgqzsmqntlZjripQg7JWg7ZSM66as7LyA7J207IWYIjwvc3RyaW5nPgpAQCAtNzU5LDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4i64ur6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IuyLoOqzoCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4i64yA6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i7JWg7ZSM66as7LyA7J207IWYIOumrOuUlOugieyFmOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuydtCjqsIApIOyLpO2WiSDspJHsnoXri4jri6QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLsm5DrnpggPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuydhCjrpbwpIOyLpO2Wie2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i7JWg7ZSM66as7LyA7J207IWYIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4o7ZSE66Gc7IS47IqkIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPinsnbQo6rCAKSDsnpDssrQg7Iuc7ZaJIFN0cmljdE1vZGUg7KCV7LGF7J2EIOychOuwmO2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLtlITroZzshLjsiqQoPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+KeqwgCDsnpDssrQg7Iuc7ZaJIFN0cmljdE1vZGUg7KCV7LGF7J2EIOychOuwmO2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IOyLpO2WiSDspJEiPC9zdHJpbmc+CkBAIC04MDgsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4i66qo65GQIO2RnOyLnCI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjIzOTkyODk5OTk2MDg5MDA0NDMiPiJVU0Ig64yA7Jqp65+JIOyggOyepeyGjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQiDsl7DqsrDrkKgiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJVU0Lrpbwg7Ya17ZW0IO2ctOuMgOyghO2ZlOulvCDsu7Ttk6jthLDsl5Ag7Jew6rKw7ZaI7Iq164uI64ukLiDsu7Ttk6jthLDsmYAgQW5kcm9pZOydmCBTRCDsubTrk5wg6rCE7JeQIO2MjOydvOydhCDrs7XsgqztlZjroKTrqbQg7JWE656Y7J2YIOuyhO2KvOydhCDshKDtg53tlZjshLjsmpQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJVU0Lrpbwg7Ya17ZW0IO2ctOuMgOyghO2ZlOulvCDsu7Ttk6jthLDsl5Ag7Jew6rKw7ZaI7Iq164uI64ukLiDsu7Ttk6jthLDsmYAgQW5kcm9pZOydmCBTRCDsubTrk5wg6rCE7JeQIO2MjOydvOydhCDrs7XsgqztlZjroKTrqbQg7JWE656Y7J2YIOuyhO2KvOydhCDshKDtg53tlZjshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJVU0Lrpbwg7Ya17ZW0IO2ctOuMgOyghO2ZlOulvCDsu7Ttk6jthLDsl5Ag7Jew6rKw7ZaI7Iq164uI64ukLiDsu7Ttk6jthLDsmYAgQW5kcm9pZOydmCBTRCDsubTrk5wg6rCE7JeQIO2MjOydvOydhCDrs7XsgqztlZjroKTrqbQg7JWE656Y7J2YIOuyhO2KvOydhCDshKDtg53tlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IlVTQiDsoIDsnqXshowg7IKs7JqpIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iVVNCIOyggOyepeyGjOuhnCBTRCDsubTrk5zrpbwg7IKs7Jqp7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iVVNCIOyggOyepeyGjOuhnCBTRCDsubTrk5zrpbwg7IKs7Jqp7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iVVNCIOyggOyepeyGjOuhnCBTRCDsubTrk5zrpbwg7IKs7Jqp7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJVU0Ig7Jew6rKw65CoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4i7Lu07ZOo7YSw7JeQIO2MjOydvOydhCDrs7XsgqztlZjqsbDrgpgg7Lu07ZOo7YSw7J2YIO2MjOydvOydhCDrs7XsgqztlZjroKTrqbQg7ISg7YOd7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IlVTQiDsoIDsnqXshowg64GE6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJVU0Ig7KCA7J6l7IaMIOuBhOq4sOulvCDshKDtg53tlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlVTQiDsoIDsnqXshowg7IKs7JqpIOykkSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iVVNCIOyggOyepeyGjOulvCDsgqzsmqntlZjsp4Ag7JWK64+E66GdIOyEpOygle2VmOq4sCDsoITsl5Ag7Lu07ZOo7YSw7JeQ7IScIEFuZHJvaWTsnZggU0Qg7Lm065Oc66W8IOuniOyatO2KuCDtlbTsoJztlojripTsp4Ao6rq864OI64qU7KeAKSDtmZXsnbjtlZjsi5zquLAg67CU656N64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJVU0Ig7KCA7J6l7IaM66W8IOyCrOyaqe2VmOyngCDslYrrj4TroZ0g7ISk7KCV7ZWY6riwIOyghOyXkCDsu7Ttk6jthLDsl5DshJwgQW5kcm9pZOydmCBTRCDsubTrk5zrpbwg66eI7Jq07Yq4IO2VtOygnO2WiOuKlOyngCjqurzrg4jripTsp4ApIO2ZleyduO2VmOyLnOq4sCDrsJTrno3ri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlVTQiDsoIDsnqXshozrpbwg7IKs7Jqp7ZWY7KeAIOyViuuPhOuhnSDshKTsoJXtlZjquLAg7KCE7JeQIOy7tO2TqO2EsOyXkOyEnCBBbmRyb2lk7J2YIFNEIOy5tOuTnOulvCDrp4jsmrTtirgg7ZW07KCc7ZaI64qU7KeAKOq6vOuDiOuKlOyngCkg7ZmV7J247ZWY7Iuc6riwIOuwlOuejeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJVU0Ig7KCA7J6l7IaMIOyCrOyaqSDslYjtlagiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJVU0Ig7KCA7J6l7IaM66W8IOyCrOyaqe2VmOyngCDslYrrj4TroZ0g7ISk7KCV7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiBVU0Ig7Zi47Iqk7Yq47JmAIOyXsOqysOydhCDtlbTsoJztlojripTsp4Ag7ZmV7J247ZWcIOuLpOydjCDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+IlVTQiDsoIDsnqXshowg7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iVVNCIOyggOyepeyGjOulvCDsgqzsmqkg7ISk7KCV7ZWY66m0IOyCrOyaqSDspJHsnbgg7J2867aAIOyVoO2UjOumrOy8gOydtOyFmOydtCDspJHsp4DrkJjqs6AgVVNCIOyggOyepeyGjOulvCDsgqzsmqkg7KSR7KeA7ZWgIOuVjOq5jOyngCDsgqzsmqntlaAg7IiYIOyXhuqyjCDrkKnri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQiDsnpHsl4Ug7Iuk7YyoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+Iu2ZleyduCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iU0Qg7Lm065OcIO2PrOuntyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTRCDsubTrk5wg7Y+s66e3Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IlNEIOy5tOuTnOulvCDtj6zrp7ftlZjsi5zqsqDsirXri4jquYw/IO2PrOunt+2VmOuptCDsubTrk5zsnZgg66qo65OgIOuNsOydtO2EsOulvCDsnoPqsowg65Cp64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlNEIOy5tOuTnOulvCDtj6zrp7ftlZjsi5zqsqDsirXri4jquYw/IO2PrOunt+2VmOuptCDsubTrk5zsnZgg66qo65OgIOuNsOydtO2EsOulvCDsnoPqsowg65Cp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTRCDsubTrk5wg7Y+s66e3Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iU0Qg7Lm065Oc66W8IO2PrOunt+2VmOyLnOqyoOyKteuLiOq5jD8g7Y+s66e37ZWY66m0IOy5tOuTnOydmCDrqqjrk6Ag642w7J207YSw66W8IOyeg+qyjCDrkKnri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4i7Y+s66e3Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iVVNCIOuUlOuyhOq5hSDsl7DqsrDrkKgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODQ3MDI5NjgxODI3MDExMDM5NiI+IlVTQiDrlJTrsoTquYXsnYQg7IKs7Jqp7ZWY7KeAIOyViuycvOugpOuptCDshKDtg53tlanri4jri6QuIjwvc3RyaW5nPgpAQCAtODM3LDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4i6rCA64ql7ZWcIOybkOyduCI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJTRCDsubTrk5wg7KSA67mEIOykkSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iU0Qg7Lm065OcIOykgOu5hCDspJEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlNEIOy5tOuTnCDspIDruYQg7KSRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IuyYpOulmCDtmZXsnbgg7KSR7J6F64uI64ukLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiLruYggU0Qg7Lm065OcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4i67mIIFNEIOy5tOuTnCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJTRCDsubTrk5zqsIAg67mE7Ja0IOyeiOqxsOuCmCDsp4Dsm5DrkJjsp4Ag7JWK64qUIO2MjOydvOyLnOyKpO2FnOydhCDsgqzsmqkg7KSR7J6F64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNEIOy5tOuTnOqwgCDruYTslrQg7J6I6rGw64KYIOyngOybkOuQmOyngCDslYrripQg7YyM7J28IOyLnOyKpO2FnOydhCDsgqzsmqntlanri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4i7IaQ7IOB65CcIFNEIOy5tOuTnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4i7IaQ7IOB65CcIFNEIOy5tOuTnCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4iU0Qg7Lm065Oc6rCAIOyGkOyDgeuQmOyXiOyKteuLiOuLpC4g7Lm065Oc66W8IOuLpOyLnCDtj6zrp7ftlZjsi5zquLAg67CU656N64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTRCDsubTrk5zqsIAg7IaQ7IOB65CY7JeI7Iq164uI64ukLiDsubTrk5zrpbwg64uk7IucIO2PrOunt+2VtOyVvCDtlaAg7IiYIOyeiOyKteuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IlNEIOy5tOuTnOqwgCDsmIjsg4HsuZgg7JWK6rKMIOygnOqxsOuQmOyXiOyKteuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Qg7Lm065Oc6rCAIOyYiOyDgey5mCDslYrqsowg7KCc6rGw65CY7JeI7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiLrjbDsnbTthLAg7IaQ7Iuk7J2EIO2UvO2VmOugpOuptCBTRCDsubTrk5zrpbwg7KCc6rGw7ZWY6riwIOyghOyXkCDrp4jsmrTtirgg7ZW07KCc7ZWp64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IuuNsOydtO2EsCDshpDsi6TsnYQg7ZS87ZWY66Ck66m0IFNEIOy5tOuTnOulvCDsoJzqsbDtlZjquLAg7KCE7JeQIOuniOyatO2KuCDtlbTsoJztlanri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiJTRCDsubTrk5wg7KCc6rGwIOqwgOuKpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlNEIOy5tOuTnCDsoJzqsbAg6rCA64qlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4i7J207KCcIFNEIOy5tOuTnOulvCDslYjsoITtlZjqsowg7KCc6rGw7ZWgIOyImCDsnojsirXri4jri6QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IuyViOyghO2VmOqyjCBTRCDsubTrk5zrpbwg7KCc6rGw7ZWgIOyImCDsnojsirXri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJTRCDsubTrk5wg7JeG7J2MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNEIOy5tOuTnCDsl4bsnYwiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iU0TqsIAg7KCc6rGw65CY7JeI7Iq164uI64ukLiDquLDquLDsnZgg7KCA7J6lIOyaqeufieydhCDripjrpqzroKTrqbQg7IOIIFNEIOy5tOuTnOulvCDsgr3snoXtlZjshLjsmpQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qg7Lm065Oc6rCAIOyXhuyKteuLiOuLpC4gIFNEIOy5tOuTnOulvCDrhKPsnLzshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4i67mIIFNEIOy5tOuTnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNEIOy5tOuTnOqwgCDruYTslrQg7J6I6rGw64KYIOyngOybkOuQmOyngCDslYrripQg7YyM7J28IOyLnOyKpO2FnOydhCDsgqzsmqntlanri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiLshpDsg4HrkJwgU0Qg7Lm065OcIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNEIOy5tOuTnOqwgCDshpDsg4HrkJjsl4jsirXri4jri6QuIOy5tOuTnOulvCDri6Tsi5wg7Y+s66e37ZW07JW8IO2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRCDsubTrk5zqsIAg7JiI7IOB7LmYIOyViuqyjCDsoJzqsbDrkJjsl4jsirXri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4i642w7J207YSwIOyGkOyLpOydhCDtlLztlZjroKTrqbQgU0Qg7Lm065Oc66W8IOygnOqxsO2VmOq4sCDsoITsl5Ag66eI7Jq07Yq4IO2VtOygnO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTRCDsubTrk5wg7KCc6rGwIOqwgOuKpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiLslYjsoITtlZjqsowgU0Qg7Lm065Oc66W8IOygnOqxsO2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJTRCDsubTrk5wg7JeG7J2MIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qg7Lm065Oc6rCAIOyXhuyKteuLiOuLpC4gIFNEIOy5tOuTnOulvCDrhKPsnLzshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiLsnbzsuZjtlZjripQg7Zmc64+Z7J20IOyXhuyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4i6rWs7ISxIOyalOyGjCDsgqzsmqkg7Ya16rOEIOyXheuNsOydtO2KuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiLsiJjsp5HrkJwg6rWs7ISx7JqU7IaMIOyCrOyaqSDthrXqs4Trpbwg7IiY7KCV7ZWgIOyImCDsnojripQg6raM7ZWc7J2EIOu2gOyXrO2VqeuLiOuLpC4g7J2867CYIOyVoO2UjOumrOy8gOydtOyFmOydgCDsnbQg6raM7ZWc7J2EIOyCrOyaqe2VmOyngCDslYrsirXri4jri6QuIjwvc3RyaW5nPgpAQCAtODk0LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLsgqzsoIQg6rO17JygIO2CpCDquLDrsJggTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4i7J247Kad7IScIOq4sOuwmCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+Iu2MjOydvCDshKDtg50iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLtjIzsnbzsnYQg7ISg7YOd7ZWY7KeAIOyViuyVmOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLsnqzshKTsoJUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i7KCc7LacIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLsppDqsqjssL7quLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLsmrTsoITrqqjrk5wg7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IuyatOyghOuqqOuTnOulvCDsooXro4ztlZjroKTrqbQg7ISg7YOd7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiLthYzrjZTrp4Eg65iQ64qUIO2Vq+yKpO2MnyDsgqzsmqkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLqtazshLHtlZjroKTrqbQg7YSw7LmY7ZWY7IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IuuSpOuhnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IuuLpOydjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IuqxtOuEiOubsOq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IuuGkuydgCDrqqjrsJTsnbwg642w7J207YSwIOyCrOyaqeufiSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i66qo67CU7J28IOuNsOydtO2EsCDsgqzsmqnsl5Ag64yA7ZW0IOyekOyEuO2eiCDslYzslYTrs7TroKTrqbQg7YSw7LmY7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i66qo67CU7J28IOuNsOydtO2EsCDsoJztlZzsnYQg7LSI6rO87ZaI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLrqqjrsJTsnbwg642w7J207YSwIOyCrOyaqeyXkCDrjIDtlbQg7J6Q7IS47Z6IIOyVjOyVhOuztOugpOuptCDthLDsuZjtlZjshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiLqsoDsg4nqsrDqs7wg7JeG7J2MIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+Iu2OmOydtOyngOyXkOyEnCDssL7quLAiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4i6rKA7IOJ6rKw6rO8IDHqsJwiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPi88eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1tY2M0NTAta28vY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbWNjNDUwLWtvL2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1Yjk2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbWNjNDUwLWtvL2NvbmZpZy54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImdzbV9hbHBoYWJldF9kZWZhdWx0X2NoYXJzZXQiPmV1Yy1rcjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAppbmRleCAzNzVlNTkyLi44MzFlMTgzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iVXR2aWtsaW5nc3Zlcmt0w7h5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bmtzam9uYWxpdGV0IGt1biB1dHZpa2xlcmUgdHJlbmdlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiJMYWdyaW5nIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJUaWxnYW5nIHRpbCBtaW5uZWtvcnRldC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iVGlsZ2FuZyB0aWwgbWlubmVrb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlRpbGdhbmcgdGlsIG1pbm5la29ydGV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+ImRlYWt0aXZlcmUgZWxsZXIgZW5kcmUgc3RhdHVzZmVsdGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IkxhciBhcHBsaWthc2pvbmVuIGRlYWt0aXZlcmUgc3RhdHVzZmVsdGV0LCBzYW10IGxlZ2dlIHRpbCBvZyBmamVybmUgc3lzdGVtaWtvbmVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiJzdGF0dXNyYWQiPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IkxhciBhcHBsaWthc2pvbmVuIGZyaWdqw7hyZSBsYWdyaW5nc3BsYXNzIHZlZCDDpSBzbGV0dGUgZmlsZXIgaSBhcHBsaWthc2pvbmVycyBodXJ0aWdidWZmZXJrYXRhbG9nLiBUaWxnYW5nZW4gZXIgdmFubGlndmlzIHN0ZXJrdCBiZWdyZW5zZXQsIHRpbCBzeXN0ZW1wcm9zZXNzZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3ZlUGFja2FnZSIgbXNnaWQ9IjcyODQ1NDk3OTk0NjUwMzkyNiI+IkZseXR0ZXIgcHJvZ3JhbXJlc3N1cnNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IkdpciBldCBwcm9ncmFtIHRpbGxhdGVsc2UgdGlsIMOlIGZseXR0ZSBwcm9ncmFtcmVzc3Vyc2VyIGZyYSBpbnRlcm5lIHRpbCBla3N0ZXJuZSBtZWRpZXIgb2cgb212ZW5kdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+ImxlcyBzZW5zaXRpdmUgbG9nZ2RhdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgbXNnaWQ9Ijg4OTY0NDk0Mzc0NjQ4Njc3NjYiPiJMYXIgcHJvZ3JhbW1ldCBsZXNlIGZyYSBkaXZlcnNlIGxvZ2dmaWxlciBww6Ugc3lzdGVtZXQuIERpc3NlIGlubmVob2xkZXIgZ2VuZXJlbGwgaW5mb3JtYXNqb24gb20gaHZhIHNvbSBnasO4cmVzIG1lZCB0ZWxlZm9uZW4sIG9nIGthbiBpbm5laG9sZGUgcGVyc29ubGlnIGVsbGVyIHByaXZhdCBpbmZvcm1hc2pvbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJsZXNlL3Nrcml2ZSByZXNzdXJzZXIgZWlkIGF2IGRpYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IkxhciBhcHBsaWthc2pvbmVuIGxlc2Ugb2cgc2tyaXZlIGVuaHZlciByZXNzdXJzIGVpZCBhdiBncnVwcGVuIGRpYWc7IGZvciBla3NlbXBlbCwgZmlsZXIgaSAvZGV2LiBEZXR0ZSBrYW4gcG90ZW5zaWVsdCBww6V2aXJrZSBzeXN0ZW1ldHMgc2lra2VyaGV0IG9nIHN0YWJpbGl0ZXQuIERldHRlIGLDuHIgS1VOIGJydWtlcyBmb3IgbWFza2ludmFyZXNwZXNpZmlra2UgZGlhZ25vc2V2ZXJrdMO4eSBsYWdldCBhdiBvcGVyYXTDuHJlbiBlbGxlciBwcm9kdXNlbnRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJha3RpdmVyZSBlbGxlciBkZWFrdGlnZXJlIGFwcGxpa2Fzam9uc2tvbXBvbmVudGVyIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4iTGFyIGFwcGxpa2Fzam9uZW4ga29uZmlndXJlcmUgZGVuIGxva2FsZSBCbHVldG9vdGgtdGVsZWZvbmVuLCBvZyDDpSBvcHBkYWdlIG9nIHBhcmUgbWVkIGFuZHJlIGVuaGV0ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4ib3BwcmV0dGUgQmx1ZXRvb3RoLXRpbGtvYmxpbmdlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IkxhciBhcHBsaWthc2pvbmVuIHNlIGtvbmZpZ3VyYXNqb25lbiB0aWwgZGVuIGxva2FsZSBCbHVldG9vdGgtdGVsZWZvbmVuLCBvZyDDpSBvcHByZXR0ZSBvZyBnb2R0YSB0aWxrb2JsaW5nZXIgbWVkIHBhcmVkZSBlbmhldGVyLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJzbMOlIGF2IHRhc3RhdHVybMOlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJMYXIgYXBwbGlrYXNqb25lbiBzbMOlIGF2IHRhc3RhdHVybMOlc2VuIG9nIGVuaHZlciB0aWxrbnl0dGV0IHBhc3NvcmRzaWtrZXJoZXQuIEV0IGxlZ2l0aW10IGVrc2VtcGVsIHDDpSBkZXR0ZSBlciBhdCB0ZWxlZm9uZW4gc2zDpXIgYXYgdGFzdGF0dXJsw6VzZW4gbsOlciBkZW4gbW90dGFyIGV0IGlubmtvbW1lbmRlIGFucm9wLCBvZyBzw6Ugc2zDpXIgZGVuIHDDpSBpZ2plbiBuw6VyIHNhbXRhbGVuIGVyIG92ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+Imxlc2Ugc3lua3JvbmlzZXJpbmdzaW5uc3RpbGxpbmdlciI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJMYXIgYXBwbGlrYXNqb25lbiBsZXNlIHByaXZhdGUgb3JkLCBuYXZuIG9nIHV0dHJ5a2sgc29tIGJydWtlcmVuIGhhciBsYWdyZXQgaSBkZW4gYnJ1a2VyZGVmaW5lcnRlIG9yZGxpc3Rlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiJza3JpdmUgdGlsIGJydWtlcmRlZmluZXJ0IG9yZGxpc3RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IkxhciBhcHBsaWthc2pvbmVuIHNrcml2ZSBueWUgb3JkIHRpbCBkZW4gYnJ1a2VyZGVmaW5lcnRlIG9yZGxpc3Rlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+InJlZGlnZXJlL3NsZXR0ZSBpbm5ob2xkIHDDpSBtaW5uZWtvcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InJlZGlnZXJlL3NsZXR0ZSBpbm5ob2xkIHDDpSBtaW5uZWtvcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iTGFyIGFwcGxpa2Fzam9uZW4gc2tyaXZlIHRpbCBtaW5uZWtvcnRldC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJMYXIgYXBwbGlrYXNqb25lbiBza3JpdmUgdGlsIG1pbm5la29ydGV0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4icmVkaWdlcmUvc2xldHRlIGlubmhvbGQgcMOlIG1pbm5la29ydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkxhciBhcHBsaWthc2pvbmVuIHNrcml2ZSB0aWwgbWlubmVrb3J0ZXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+InRpbGdhbmcgdGlsIGJ1ZnJlZGUgZmlsZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IlRpbGxhdGVyIGV0IHByb2dyYW0gw6UgbGVzZSBvZyBza3JpdmUgdGlsIGJ1ZnJlZGUgZmlsZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iQmVncmVucyBwYXNzb3JkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IkJlZ3JlbnNlIHR5cGVuZSBwYXNzb3JkIGR1IGthbiBicnVrZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+Ik92ZXJ2w6VrIHDDpWxvZ2dpbmdzZm9yc8O4ayI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJPdmVydsOlayBtaXNseWtrZWRlIHDDpWxvZ2dpbmdzZm9yc8O4ayBlbGxlciBmb3Jzw7hrIHDDpSBoYW5kbGluZ2VyIHDDpSBlbmhldGVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+IlRpbGJha2VzdGlsbCBwYXNzb3JkZXQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4iRnJlbXR2aW5nIHRpbGJha2VzdGlsbGluZyBhdiBwYXNzb3JkLCBzbGlrIGF0IGFkbWluaXN0cmF0b3JlbiBtw6UgZ2kgZGVnIGV0IG55dHQgcGFzc29yZCBuw6VyIGR1IHNrYWwgbG9nZ2UgZGVnIHDDpS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+Ik9ibGlnYXRvcmlzayBsw6VzaW5nIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iS29udHJvbGxlcmVyIG7DpXIgZW5oZXRlbiBsw6VzZXMuIER1IG3DpSBza3JpdmUgaW5uIHBhc3NvcmRldCBww6Ugbnl0dCBmb3Igw6UgbMOlc2UgZGVuIG9wcC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiJCZWdyZW5zIHBhc3NvcmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iQmVncmVuc2UgdHlwZW5lIHBhc3NvcmQgZHUga2FuIGJydWtlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+Ik92ZXJ2w6VrIHDDpWxvZ2dpbmdzZm9yc8O4ayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiJPdmVydsOlayBtaXNseWtrZWRlIHDDpWxvZ2dpbmdzZm9yc8O4ayBlbGxlciBmb3Jzw7hrIHDDpSBoYW5kbGluZ2VyIHDDpSBlbmhldGVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IlRpbGJha2VzdGlsbCBwYXNzb3JkZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4iRnJlbXR2aW5nIHRpbGJha2VzdGlsbGluZyBhdiBwYXNzb3JkLCBzbGlrIGF0IGFkbWluaXN0cmF0b3JlbiBtw6UgZ2kgZGVnIGV0IG55dHQgcGFzc29yZCBuw6VyIGR1IHNrYWwgbG9nZ2UgZGVnIHDDpS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+Ik9ibGlnYXRvcmlzayBsw6VzaW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iS29udHJvbGxlcmVyIG7DpXIgZW5oZXRlbiBsw6VzZXMuIER1IG3DpSBza3JpdmUgaW5uIHBhc3NvcmRldCBww6Ugbnl0dCBmb3Igw6UgbMOlc2UgZGVuIG9wcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iU2xldHQgYWxsZSBkYXRhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiJVdGbDuHJlciB0aWxiYWtlc3RpbGxpbmcgdGlsIGZhYnJpa2tzdGFuZGFyZC4gQWxsZSBkYXRhIHNsZXR0ZXMgdXRlbiB2YXJzZWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJVdGbDuHJlciB0aWxiYWtlc3RpbGxpbmcgdGlsIGZhYnJpa2tzdGFuZGFyZC4gQWxsZSBkYXRhIHNsZXR0ZXMgdXRlbiB2YXJzZWwuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iQW5naXIgZGVuIGdsb2JhbGUgbWVsbG9tdGplbmVyZW4gcMOlIGVuaGV0ZW4gc29tIHNrYWwgYnJ1a2VzIG7DpXIgcmVnZWxlbiBlciBha3RpdmVydC4gS3VuIGRlbiBvcHByaW5uZWxpZ2UgYWRtaW5pc3RyYXRvcmVuIGF2IGVuaGV0ZW4ga2FuIGFuZ2kgZGVuIGdsb2JhbGUgbWVsbG9tdGplbmVyZW4uIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbW1lbnVtbWVyIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJBcmJlaWQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iQW5uZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iRWdlbmRlZmluZXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVDdXN0b20iIG1zZ2lkPSIyNDczNTgwNTkzMTExNTkwOTQ1Ij4iRWdlbmRlZmluZXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVIb21lIiBtc2dpZD0iNjA5MzU5ODE4MTA2OTM1OTI5NSI+IlN0YXJ0c2lkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlV29yayIgbXNnaWQ9IjY5MjA3MjU3MzA3OTcwOTkwNDciPiJBcmJlaWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZU90aGVyIiBtc2dpZD0iNDQwODQzNjE2Mjk1MDExOTg0OSI+IkFubmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUN1c3RvbSAoMjQ3MzU4MDU5MzExMTU5MDk0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUhvbWUgKDYwOTM1OTgxODEwNjkzNTkyOTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVXb3JrICg2OTIwNzI1NzMwNzk3MDk5MDQ3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJTa3JpdiBpbm4gUElOLWtvZGU6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJTa3JpdiBpbm4gcGFzc29yZCBmb3Igw6UgbMOlc2Ugb3BwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJTa3JpdiBpbm4gcGVyc29ubGlnIGtvZGUgZm9yIMOlIGzDpXNlIG9wcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkdhbCBQSU4ta29kZSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iRm9yIMOlIGzDpXNlIG9wcCwgdHJ5a2sgcMOlIG1lbnlrbmFwcGVuIG9nIGRlcmV0dGVyIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7DuGRudW1tZXIiPC9zdHJpbmc+CkBAIC01NjQsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iVGlsYmFrZSB0aWwgc2FtdGFsZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlJpa3RpZyEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iQmVrbGFnZXIsIHByw7h2IGlnamVuOiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iUHLDuHYgaWdqZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJMYWRlciAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iRnVsbHQgbGFkZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU3OCw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNLWtvcnRldCBlciBsw6VzdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJMw6VzZXIgb3BwIFNJTS1rb3J04oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iWW91IGhhdmUgaW5jb3JyZWN0bHkgZHJhd24geW91ciB1bmxvY2sgcGF0dGVybiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB0aW1lcy4gIlxuXG4iUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBvcHBnaXR0IGZlaWwgcGFzc29yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZXIuICJcblxuIlByw7h2IGlnamVuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJEdSBoYXIgb3BwZ2l0dCBmZWlsIHBlcnNvbmxpZyBrb2RlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlci4gIlxuXG4iUHLDuHYgaWdqZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRpbWVzLiBBZnRlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBtb3JlIHVuc3VjY2Vzc2Z1bCBhdHRlbXB0cywgeW91IHdpbGwgYmUgYXNrZWQgdG8gdW5sb2NrIHlvdXIgcGhvbmUgdXNpbmcgeW91ciBHb29nbGUgc2lnbi1pbi4iXG5cbiIgUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcsO4diBpZ2plbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJHbGVtdCBtw7huc3RlcmV0PyI8L3N0cmluZz4KQEAgLTYwNiwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiJOYXZpZ2VyIGJvcnQgZnJhIGRlbm5lIHNpZGVuPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJWZWxnIE9LIGZvciDDpSBmb3J0c2V0dGUsIGVsbGVyIEF2YnJ5dCBmb3Igw6UgZm9yYmxpIHDDpSBkZW5uZSBzaWRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkJla3JlZnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IkRvYmJlbHR0cnlrayBmb3Igw6Ugem9vbWUgaW5uIG9nIHV0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+Imxlc2UgbmV0dGxlc2VyZW5zIGxvZ2cgb2cgYm9rbWVya2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iTGFyIGFwcGxpa2Fzam9uZW4gbGVzZSBhbGxlIGFkcmVzc2VyIG5ldHRsZXNlcmVuIGhhciBiZXPDuGt0LCBvZyBhbGxlIG5ldHRsZXNlcmVucyBib2ttZXJrZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4ic2tyaXZlIHRpbCBuZXR0bGVzZXJlbnMgbG9nZyBvZyBib2ttZXJrZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJMYXIgYXBwbGlrYXNqb25lbiBlbmRyZSBuZXR0bGVzZXJlbnMgbG9nZyBvZyBib2ttZXJrZXIgbGFncmV0IHDDpSB0ZWxlZm9uZW4uIE9uZHNpbm5lZGUgYXBwbGlrYXNqb25lciBrYW4gYnJ1a2UgZGV0dGUgdGlsIMOlIGZqZXJuZSBlbGxlciByZWRpZ2VyZSBuZXR0bGVzZXJlbnMgZGF0YS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+IkVuZHJlIG5ldHRsZXNlcmVucyB0aWxsYXRlbHNlciBmb3IgZ2VvZ3JhZmlzayBwb3Npc2pvbmVyaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IlRpbGxhdGVyIHByb2dyYW1tZXQgw6UgZW5kcmUgbmV0dGxlc2VyZW5zIHRpbGxhdGVsc2VyIGZvciBnZW9ncmFmaXNrIHBvc2lzam9uZXJpbmcuIFNrYWRlbGlnZSBwcm9ncmFtbWVyIGthbiBicnVrZSBkZW5uZSBmdW5rc2pvbmVuIHRpbCDDpSBzZW5kZSBwb3Npc2pvbnNvcHBseXNuaW5nZXIgdGlsIHZpbGvDpXJsaWdlIG5ldHRzdGVkZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iw5huc2tlciBkdSBhdCBuZXR0bGVzZXJlbiBza2FsIGh1c2tlIGRldHRlIHBhc3NvcmRldD8iPC9zdHJpbmc+CkBAIC03MjYsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Ik1lcmsgYWx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJWZWxnIG9yZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLbGlwcCB1dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iTGltIGlubiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+Ik1hcmtlciB0ZWtzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJNZXJrZXQgdGVrc3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJJbm5kYXRhbWV0b2RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkxlZ2cgwqs8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+wrsgdGlsIG9yZGxpc3RlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlJlZGlnZXIgdGVrc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJUZWtzdGhhbmRsaW5nZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkxpdGUgcGxhc3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJEZXQgYmVneW5uZXIgw6UgYmxpIGxpdGUgbGFncmluZ3NwbGFzcyBww6UgdGVsZWZvbmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQxLDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBdmJyeXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iTWVyayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iTGFzdGVyIGlubiAuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlDDpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkF2Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJGdWxsZsO4ciBtZWQiPC9zdHJpbmc+CkBAIC03NTksOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJUdmluZyBhdnNsdXRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlJhcHBvcnTDqXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IlZlbnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJQcm9ncmFtbWV0IGVyIG9tZGlyaWdlcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4ga2rDuHJlciBuw6UuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGJsZSBvcHByaW5uZWxpZyBzdGFydGV0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJQcm9ncmFtbWV0IDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb3Nlc3NlbiA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhciBicnV0dCBkZSBzZWx2cMOlbGFndGUgU3RyaWN0TW9kZS1yZXRuaW5nc2xpbmplbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvc2Vzc2VuPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhciBicnV0dCBkZSBzZWx2cMOlbGFndGUgU3RyaWN0TW9kZS1yZXRuaW5nc2xpbmplbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBrasO4cmVyIjwvc3RyaW5nPgpAQCAtODA4LDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+IlZpcyBhbGxlIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQi1tYXNzZWxhZ3JpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJVU0Iga29ibGV0IHRpbCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IkR1IGhhciBrb2JsZXQgdGVsZWZvbmVuIHRpbCBkYXRhbWFza2luZW4gdmlhIFVTQi4gVmVsZyBrbmFwcGVuIG5lZGVuZm9yIGh2aXMgZHUgdmlsIGtvcGllcmUgZmlsZXIgbWVsbG9tIGRhdGFtYXNraW5lbiBvZyBtaW5uZWtvcnRldCBpIHRlbGVmb25lbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IkR1IGhhciBrb2JsZXQgdGVsZWZvbmVuIHRpbCBkYXRhbWFza2luZW4gdmlhIFVTQi4gVmVsZyBrbmFwcGVuIG5lZGVuZm9yIGh2aXMgZHUgdmlsIGtvcGllcmUgZmlsZXIgbWVsbG9tIGRhdGFtYXNraW5lbiBvZyBtaW5uZWtvcnRldCBpIHRlbGVmb25lbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IkR1IGhhciBrb2JsZXQgdGVsZWZvbmVuIHRpbCBkYXRhbWFza2luZW4gdmlhIFVTQi4gVmVsZyBrbmFwcGVuIG5lZGVuZm9yIGh2aXMgZHUgdmlsIGtvcGllcmUgZmlsZXIgbWVsbG9tIGRhdGFtYXNraW5lbiBvZyBtaW5uZWtvcnRldCBpIHRlbGVmb25lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iU2zDpSBww6UgVVNCLWxhZ3JpbmciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJEZXQgb3Bwc3RvIGV0IHByb2JsZW0gbWVkIMOlIGJydWtlIG1pbm5la29ydGV0IGRpdHQgZm9yIFVTQi1sYWdyaW5nLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iRGV0IG9wcHN0byBldCBwcm9ibGVtIG1lZCDDpSBicnVrZSBtaW5uZWtvcnRldCBkaXR0IGZvciBVU0ItbGFncmluZy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkRldCBvcHBzdG8gZXQgcHJvYmxlbSBtZWQgw6UgYnJ1a2UgbWlubmVrb3J0ZXQgZGl0dCBmb3IgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQiB0aWxrb2JsZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJWZWxnIG9tIGR1IMO4bnNrZXIgw6Uga29waWVyZSBmaWxlciB0aWwvZnJhIGVuIGRhdGFtYXNraW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4iU2zDpSBhdiBVU0ItbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iVmVsZyBmb3Igw6Ugc2zDpSBhdiBVU0ItbGFncmluZy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iVVNCLWxhZ3JpbmcgZXIgaSBicnVrIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiJGw7hyIGR1IHNsw6VyIGF2IFVTQi1sYWdyaW5nLCBzamVrayBhdCBkdSBoYXIgYXZtb250ZXJ0IHRlbGVmb25lbiBww6UgZGF0YW1hc2tpbmVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJGw7hyIGR1IHNsw6VyIGF2IFVTQi1sYWdyaW5nLCBzamVrayBhdCBkdSBoYXIgYXZtb250ZXJ0IHRlbGVmb25lbiBww6UgZGF0YW1hc2tpbmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJGw7hyIGR1IHNsw6VyIGF2IFVTQi1sYWdyaW5nLCBzamVrayBhdCBkdSBoYXIgYXZtb250ZXJ0IHRlbGVmb25lbiBww6UgZGF0YW1hc2tpbmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+IlNsw6UgYXYgVVNCLWxhZ3JpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJEZXQgb3Bwc3RvZCBldCBwcm9ibGVtIHZlZCBkZWFrdGl2ZXJpbmcgYXYgVVNCLWxhZ3JpbmcuIEtvbnRyb2xsZXIgYXQgZHUgaGFyIGRlbW9udGVydCBVU0ItdmVydGVuLCBvZyBwcsO4diBww6Ugbnl0dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJTbMOlIHDDpSBVU0ItbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+Ikh2aXMgZHUgYWt0aXZlcmVyIFVTQi1sYWdyaW5nLCB2aXJrZXIgaWtrZSBsZW5nZXIgZW5rZWx0ZSBhdiBwcm9ncmFtbWVuZSBkdSBicnVrZXIsIG9nIGRlIGthbiB2w6ZyZSB1dGlsZ2plbmdlbGlnZSBpbm50aWwgZHUgZGVha3RpdmVyZXIgVVNCLWxhZ3Jpbmdlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iVVNCLW9wZXJhc2pvbmVuIG1pc2x5a3RlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0ZXJlIG1pbm5la29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRlcmUgbWlubmVrb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IkVyIGR1IHNpa2tlciBww6UgYXQgZHUgw7huc2tlciDDpSBmb3JtYXRlcmUgbWlubmVrb3J0ZXQ/IEFsbGUgZGF0YSBww6Uga29ydGV0IHZpbCBnw6UgdGFwdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJFciBkdSBzaWtrZXIgcMOlIGF0IGR1IMO4bnNrZXIgw6UgZm9ybWF0ZXJlIG1pbm5la29ydGV0PyBBbGxlIGRhdGEgcMOlIGtvcnRldCB2aWwgZ8OlIHRhcHQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVyZSBtaW5uZWtvcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJFciBkdSBzaWtrZXIgcMOlIGF0IGR1IMO4bnNrZXIgw6UgZm9ybWF0ZXJlIG1pbm5la29ydGV0PyBBbGxlIGRhdGEgcMOlIGtvcnRldCB2aWwgZ8OlIHRhcHQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0w6lyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iVVNCLWRlYnVnZ2luZyB0aWxrb2JsZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODQ3MDI5NjgxODI3MDExMDM5NiI+IlZlbGcgZm9yIMOlIGRlYWt0aXZlcmUgVVNCLWRlYnVnZ2luZy4iPC9zdHJpbmc+CkBAIC04MzcsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaw4bDmMOFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaw4bDmMOFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPiJUQUdfRk9OVCI8dT4ia2FuZGlkYXRlciI8L3U+IkNMT1NFX0ZPTlQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJGb3JiZXJlZGVyIG1pbm5la29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iRm9yYmVyZWRlciBtaW5uZWtvcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IkZvcmJlcmVkZXIgbWlubmVrb3J0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IlNqZWtrZXIgZm9yIGZlaWwuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IlRvbXQgbWlubmVrb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iVG9tdCBtaW5uZWtvcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iTWlubmVrb3J0ZXQgZXIgdG9tdCBlbGxlciBicnVrZXIgZXQgdXN0w7h0dGV0IGZpbHN5c3RlbS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJNaW5uZWtvcnRldCBlciB0b210IGVsbGVyIGhhciBldCBpa2tlLXN0w7h0dGV0IGZpbHN5c3RlbS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJTa2FkZXQgbWlubmVrb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJTa2FkZXQgbWlubmVrb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJNaW5uZWtvcnRldCBlciBza2FkZXQuIERldCBrYW4gdsOmcmUgZHUgbcOlIGZvcm1hdGVyZSBrb3J0ZXQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+Ik1pbm5la29ydGV0IGVyIHNrYWRldC4gRHUgbcOlIGthbnNramUgZm9ybWF0ZXJlIGRldC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+Ik1pbm5la29ydGV0IGJsZSB0YXR0IHV0IHV2ZW50ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iTWlubmVrb3J0ZXQgYmxlIHRhdHQgdXQgdXZlbnRldCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiJBdm1vbnRlciBtaW5uZWtvcnRldCBmw7hyIGRldCB0YXMgdXQsIGZvciDDpSB1bm5nw6UgZGF0YXRhcC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJBdm1vbnRlciBtaW5uZWtvcnRldCBmw7hyIGRldCB0YXMgdXQsIGZvciDDpSB1bm5nw6UgZGF0YXRhcC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+IlRyeWd0IMOlIHRhIHV0IG1pbm5la29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlRyeWd0IMOlIHRhIHV0IG1pbm5la29ydCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+Ik1pbm5la29ydGV0IGthbiBuw6UgdHJ5Z3QgdGFzIHV0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJEZXQgZXIgdHJ5Z3Qgw6UgdGEgdXQgbWlubmVrb3J0ZXQuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJNaW5uZWtvcnRldCBibGUgdGF0dCB1dCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJNaW5uZWtvcnRldCBibGUgdGF0dCB1dCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJNaW5uZWtvcnRldCBibGUgdGF0dCB1dC4gU2V0dCBpbm4gZXQgbnl0dCBtaW5uZWtvcnQgZm9yIMOlIMO4a2UgbGFncmluZ3NwbGFzc2VuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+Ik1pbm5la29ydGV0IGJsZSBmamVybmV0LiBTZXR0IGlubiBldCBueXR0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlRvbXQgbWlubmVrb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iTWlubmVrb3J0ZXQgZXIgdG9tdCBlbGxlciBoYXIgZXQgaWtrZS1zdMO4dHRldCBmaWxzeXN0ZW0uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJTa2FkZXQgbWlubmVrb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+Ik1pbm5la29ydGV0IGVyIHNrYWRldC4gRHUgbcOlIGthbnNramUgZm9ybWF0ZXJlIGRldC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iTWlubmVrb3J0ZXQgYmxlIHRhdHQgdXQgdXZlbnRldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkF2bW9udGVyIG1pbm5la29ydGV0IGbDuHIgZGV0IHRhcyB1dCwgZm9yIMOlIHVubmfDpSBkYXRhdGFwLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlRyeWd0IMOlIHRhIHV0IG1pbm5la29ydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJEZXQgZXIgdHJ5Z3Qgw6UgdGEgdXQgbWlubmVrb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+Ik1pbm5la29ydGV0IGJsZSB0YXR0IHV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iTWlubmVrb3J0ZXQgYmxlIGZqZXJuZXQuIFNldHQgaW5uIGV0IG55dHQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiJGYW50IGluZ2VuIHRpbHN2YXJlbmRlIGFrdGl2aXRldGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+Im9wcGRhdGVyIHN0YXRpc3Rpa2sgb3ZlciBrb21wb25lbnRicnVrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IlRpbGxhdGVyIGVuZHJpbmcgYXYgaW5uc2FtbGV0IGRhdGEgb20gYnJ1ayBhdiBrb21wb25lbnRlci4gSWtrZSBtZW50IGZvciB2YW5saWdlIGFwcGxpa2Fzam9uZXIuIjwvc3RyaW5nPgpAQCAtODk0LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJQYXNzb3JkYmFzZXJ0IEwyVFAvSVBTZWMtVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlNlcnRpZmlrYXRiYXNlcnQgTDJUUC9JUFNlYy1WUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJWZWxnIGZpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkluZ2VuIGZpbCBlciB2YWxndCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlRpbGJha2VzdGlsbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJTZW5kIGlubiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJCaWxtb2R1cyBlciBha3RpdmVydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWZWxnIGZvciDDpSBhdnNsdXR0ZSBiaWxtb2R1cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUaWxrbnl0bmluZyBlbGxlciB0csOlZGzDuHMgc29uZSBlciBha3RpdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRyeWtrIGZvciDDpSBrb25maWd1cmVyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGJha2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJOZXN0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IkhvcHAgb3ZlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkjDuHkgbW9iaWxkYXRhYnJ1ayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iQmVyw7hyIGZvciDDpSBsZXNlIG1lciBvbSBicnVrIGF2IG1vYmlsZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3JlbnNlbiBmb3IgbW9iaWxkYXRhYnJ1ayBlciBvdmVyc2tyZWRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJCZXLDuHIgZm9yIMOlIGxlc2UgbWVyIG9tIGJydWsgYXYgbW9iaWxkYXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJJbmdlbiB0cmVmZiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiJGaW5uIHDDpSBzaWRlIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgdHJlZmYiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiBhdiA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKaW5kZXggMmRlZGQ3Yi4uMjhmZGNjMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+Ik9udHdpa2tlbGluZ3NodWxwcHJvZ3JhbW1hXCdzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bmN0aWVzIGRpZSBhbGxlZW4gZG9vciB0b2VwYXNzaW5nc29udHdpa2tlbGFhcnMgd29yZGVuIGdlYnJ1aWt0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9zdG9yYWdlIiBtc2dpZD0iMTk3MTExODc3MDU0NjMzNjk2NiI+Ik9wc2xhZ3J1aW10ZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iVG9lZ2FuZyB0b3QgZGUgU0Qta2FhcnQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlRvZWdhbmcgdG90IGRlIFNELWthYXJ0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJUb2VnYW5nIHRvdCBkZSBTRC1rYWFydC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiJzdGF0dXNiYWxrIHVpdHNjaGFrZWxlbiBvZiB3aWp6aWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBkZSBzdGF0dXNiYWxrIHVpdHNjaGFrZWxlbiBvZiBzeXN0ZWVtcGljdG9ncmFtbWVuIHRvZXZvZWdlbiBlbiB2ZXJ3aWpkZXJlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4ic3RhdHVzYmFsayI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4iSGllcm1lZSBrYW4gZWVuIHRvZXBhc3Npbmcgb3BzbGFncnVpbXRlIG9wIGRlIHRlbGVmb29uIHZyaWogbWFrZW4gZG9vciBiZXN0YW5kZW4gdGUgdmVyd2lqZGVyZW4gdWl0IGRlIGNhY2hlbWFwIHZhbiBkZSB0b2VwYXNzaW5nLiBEZSB0b2VnYW5nIGlzIGRvb3JnYWFucyBiZXBlcmt0IHRvdCBoZXQgc3lzdGVlbXByb2Nlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iVG9lcGFzc2luZ3Nicm9ubmVuIHZlcnBsYWF0c2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iRWVuIHRvZXBhc3NpbmcgdG9lc3RhYW4gdG9lcGFzc2luZ3Nicm9ubmVuIHRlIHZlcnBsYWF0c2VuIHZhbiBpbnRlcm5lIG5hYXIgZXh0ZXJuZSBtZWRpYSBlbiBvbWdla2VlcmQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiJnZXZvZWxpZ2UgbG9nYmVzdGFuZHNnZWdldmVucyBsZXplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGRlIHZlcnNjaGlsbGVuZGUgbG9nYmVzdGFuZGVuIHZhbiBoZXQgc3lzdGVlbSBsZXplbi4gRGUgdG9lcGFzc2luZyBrYW4gb3AgZGV6ZSBtYW5pZXIgYWxnZW1lbmUgaW5mb3JtYXRpZSBhY2h0ZXJoYWxlbiBvdmVyIHV3IHRlbGVmb29uZ2VicnVpaywgbW9nZWxpamsgaW5jbHVzaWVmIHBlcnNvb25saWprZSBvZiBwcml2w6ktaW5mb3JtYXRpZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJsZXplbi9zY2hyaWp2ZW4gbmFhciBicm9ubmVuIHZhbiBkaWFnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBsZXplbiBlbiBzY2hyaWp2ZW4gbmFhciBlbGtlIGJyb24gZGllIGhvb3J0IGJpaiBkZSBkaWFnbm9zdGlzY2hlIGdyb2VwLCB6b2FscyBiZXN0YW5kZW4gaW4gL2Rldi4gSGllcmRvb3Iga2FuIGRlIHN5c3RlZW1zdGFiaWxpdGVpdCBlbiAtdmVpbGlnaGVpZCB3b3JkZW4gYmXDr252bG9lZC4gRGl0IG1hZyBBTExFRU4gd29yZGVuIGdlYnJ1aWt0IHZvb3IgaGFyZHdhcmVzcGVjaWZpZWtlIGRpYWdub3N0aWVrIGRvb3IgZGUgZmFicmlrYW50IG9mIG9wZXJhdG9yLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29tcG9uZW50U3RhdGUiIG1zZ2lkPSI3OTQyNTE5ODgzNDMyOTQwNiI+InRvZXBhc3NpbmdzY29tcG9uZW50ZW4gaW4tIG9mIHVpdHNjaGFrZWxlbiI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGRlIGxva2FsZSBCbHVldG9vdGgtdGVsZWZvb24gY29uZmlndXJlcmVuIGVuIGV4dGVybmUgYXBwYXJhdGVuIHpvZWtlbiBlbiBhYW5zbHVpdGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+IkJsdWV0b290aC12ZXJiaW5kaW5nZW4gbWFrZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBkZSBjb25maWd1cmF0aWUgdmFuIGVlbiBsb2thbGUgQmx1ZXRvb3RoLXRlbGVmb29uIGJla2lqa2VuIGVuIHZlcmJpbmRpbmdlbiBtZXQgZ2Vrb3BwZWxkZSBhcHBhcmF0ZW4gbWFrZW4gZW4gYWNjZXB0ZXJlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4idG9ldHN2ZXJncmVuZGVsaW5nIHVpdHNjaGFrZWxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBkZSB0b2V0c3ZlcmdyZW5kZWxpbmcgZW4gYmlqYmVob3JlbmRlIHdhY2h0d29vcmRiZXZlaWxpZ2luZyB1aXRzY2hha2VsZW4uIEVlbiB2b29yYmVlbGQ6IGRlIHRlbGVmb29uIHNjaGFrZWx0IGRlIHRvZXRzdmVyZ3JlbmRlbGluZyB1aXQgYWxzIGVyIGVlbiBvcHJvZXAgYmlubmVua29tdCBlbiBzY2hha2VsdCBkZSB0b2V0c3ZlcmdyZW5kZWxpbmcgd2VlciBpbiBhbHMgZGUgb3Byb2VwIGlzIGJlw6tpbmRpZ2QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+InN5bmNocm9uaXNhdGllLWluc3RlbGxpbmdlbiBsZXplbiI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBwcml2w6l3b29yZGVuLCBuYW1lbiBlbiB3b29yZGNvbWJpbmF0aWVzIGxlemVuIGRpZSBkZSBnZWJydWlrZXIgaGVlZnQgb3BnZXNsYWdlbiBpbiBoZXQgZ2VicnVpa2Vyc3dvb3JkZW5ib2VrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+InNjaHJpanZlbiBuYWFyIGRvb3IgZ2VicnVpa2VyIGdlZGVmaW5pZWVyZCB3b29yZGVuYm9layI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBuaWV1d2Ugd29vcmRlbiBzY2hyaWp2ZW4gbmFhciBoZXQgZ2VicnVpa2Vyc3dvb3JkZW5ib2VrLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4iaW5ob3VkIG9wIGRlIFNELWthYXJ0IGFhbnBhc3Nlbi92ZXJ3aWpkZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iaW5ob3VkIG9wIGRlIFNELWthYXJ0IGFhbnBhc3Nlbi92ZXJ3aWpkZXJlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBzY2hyaWp2ZW4gbmFhciBkZSBTRC1rYWFydC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBzY2hyaWp2ZW4gbmFhciBkZSBTRC1rYWFydC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ImluaG91ZCBvcCBkZSBTRC1rYWFydCBhYW5wYXNzZW4vdmVyd2lqZGVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBzY2hyaWp2ZW4gbmFhciBkZSBTRC1rYWFydC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iaGV0IGNhY2hlYmVzdGFuZHNzeXN0ZWVtIG9wZW5lbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4iU3RhYXQgZWVuIHRvZXBhc3NpbmcgdG9lIGhldCBjYWNoZWJlc3RhbmRzc3lzdGVlbSB0ZSBsZXplbiBlbiB0ZSBzY2hyaWp2ZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iV2FjaHR3b29yZCBiZXBlcmtlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiJEZSB0eXBlbiB3YWNodHdvb3JkZW4gYmVwZXJrZW4gZGllIHUgbWFnIGdlYnJ1aWtlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+IkFhbm1lbGRpbmdzcG9naW5nZW4gY29udHJvbGVyZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4iTWlzbHVrdGUgcG9naW5nZW4gY29udHJvbGVyZW4gdm9vciBhYW5tZWxkaW5nIGJpaiBoZXQgYXBwYXJhYXQgb20gZWVuIGJlcGFhbGRlIGFjdGllIHVpdCB0ZSB2b2VyZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4iV2FjaHR3b29yZCBvcG5pZXV3IGluc3RlbGxlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDMzMzIxNjc2MDAzMzE3OTk5OTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjUzOTEyNDA2MTY5ODEyOTczNjEiPiJVdyB3YWNodHdvb3JkIGdlZHdvbmdlbiB3aWp6aWdlbiBpbiBlZW4gbmlldXdlIHdhYXJkZSwgd2F0IHZlcmVpc3QgZGF0IGRlIGJlaGVlcmRlciB1IGhldCB3YWNodHdvb3JkIGdlZWZ0IHZvb3JkYXQgdSB6aWNoIGt1bnQgYWFubWVsZGVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iR2Vkd29uZ2VuIHZlcmdyZW5kZWxlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IkJlaGVyZW4gd2FubmVlciBoZXQgYXBwYXJhYXQgd29yZHQgdmVyZ3JlbmRlbGQsIHdhdCB2ZXJlaXN0IGRhdCB1IGhldCB3YWNodHdvb3JkIG9wbmlldXcgaW52b2VydC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiJXYWNodHdvb3JkIGJlcGVya2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+IkRlIHR5cGVuIHdhY2h0d29vcmRlbiBiZXBlcmtlbiBkaWUgdSBtYWcgZ2VicnVpa2VuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+IkFhbm1lbGRpbmdzcG9naW5nZW4gY29udHJvbGVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4iTWlzbHVrdGUgcG9naW5nZW4gY29udHJvbGVyZW4gdm9vciBhYW5tZWxkaW5nIGJpaiBoZXQgYXBwYXJhYXQgb20gZWVuIGJlcGFhbGRlIGFjdGllIHVpdCB0ZSB2b2VyZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iV2FjaHR3b29yZCBvcG5pZXV3IGluc3RlbGxlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjMzMzIxNjc2MDAzMzE3OTk5OTEiPiJVdyB3YWNodHdvb3JkIGdlZHdvbmdlbiB3aWp6aWdlbiBpbiBlZW4gbmlldXdlIHdhYXJkZSwgd2F0IHZlcmVpc3QgZGF0IGRlIGJlaGVlcmRlciB1IGhldCB3YWNodHdvb3JkIGdlZWZ0IHZvb3JkYXQgdSB6aWNoIGt1bnQgYWFubWVsZGVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iR2Vkd29uZ2VuIHZlcmdyZW5kZWxlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkJlaGVyZW4gd2FubmVlciBoZXQgYXBwYXJhYXQgd29yZHQgdmVyZ3JlbmRlbGQsIHdhdCB2ZXJlaXN0IGRhdCB1IGhldCB3YWNodHdvb3JkIG9wbmlldXcgaW52b2VydC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQWxsZSBnZWdldmVucyB3aXNzZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IkRlIGZhYnJpZWtzaW5zdGVsbGluZ2VuIGhlcnN0ZWxsZW4sIHdhYXJiaWogYWxsZSBnZWdldmVucyB3b3JkZW4gdmVyd2lqZGVyZCB6b25kZXIgYmV2ZXN0aWdpbmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJEZSBmYWJyaWVrc2luc3RlbGxpbmdlbiBoZXJzdGVsbGVuLCB3YWFyYmlqIGFsbGUgZ2VnZXZlbnMgd29yZGVuIHZlcndpamRlcmQgem9uZGVyIGJldmVzdGlnaW5nLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IlN0ZWwgZGUgYWxnZW1lbmUgcHJveHkgdm9vciBoZXQgYXBwYXJhYXQgaW4gZGllIG1vZXQgd29yZGVuIGdlYnJ1aWt0IHRlcndpamwgaGV0IGJlbGVpZCBpcyBnZWFjdGl2ZWVyZC4gQWxsZWVuIGRlIGVlcnN0ZSBhcHBhcmFhdGJlaGVlcmRlciBzdGVsdCBkZSBhbGdlbWVuZSBwcm94eSBpcy4iPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJUaHVpcyI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmllbCI8L2l0ZW0+CkBAIC01NDQsMTQgKzUzMCwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IldlcmsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3ZlcmlnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IkFhbmdlcGFzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlQ3VzdG9tIiBtc2dpZD0iMjQ3MzU4MDU5MzExMTU5MDk0NSI+IkFhbmdlcGFzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlSG9tZSIgbXNnaWQ9IjYwOTM1OTgxODEwNjkzNTkyOTUiPiJTdGFydHBhZ2luYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlV29yayIgbXNnaWQ9IjY5MjA3MjU3MzA3OTcwOTkwNDciPiJXZXJrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVPdGhlciIgbXNnaWQ9IjQ0MDg0MzYxNjI5NTAxMTk4NDkiPiJPdmVyaWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlQ3VzdG9tICgyNDczNTgwNTkzMTExNTkwOTQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlSG9tZSAoNjA5MzU5ODE4MTA2OTM1OTI5NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZVdvcmsgKDY5MjA3MjU3MzA3OTcwOTkwNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlBJTi1jb2RlIGludm9lcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJWb2VyIGhldCB3YWNodHdvb3JkIGluIG9tIHRlIG9udGdyZW5kZWxlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iVm9lciBkZSBQSU4tY29kZSBpbiBvbSB0ZSBvbnRncmVuZGVsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJPbmp1aXN0ZSBQSU4tY29kZSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iRHJ1ayBvcCBcJ01lbnVcJyBlbiB2ZXJ2b2xnZW5zIG9wIDAgb20gdGUgb250Z3JlbmRlbGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJBbGFybW51bW1lciI8L3N0cmluZz4KQEAgLTU2NCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJUZXJ1ZyBuYWFyIGdlc3ByZWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJKdWlzdCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iUHJvYmVlciBoZXQgb3BuaWV1dyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iUHJvYmVlciBoZXQgb3BuaWV1dyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Ik9wbGFkZW4gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik9wZ2VsYWRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU3OCw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNLWthYXJ0IGlzIHZlcmdyZW5kZWxkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTS1rYWFydCBvbnRncmVuZGVsZW4uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJVIGhlZWZ0IHV3IG9udGdyZW5kZWxpbmdzcGF0cm9vbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZWVyIG9uanVpc3QgZ2V0ZWtlbmQuICJcblxuIlByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kZW4gb3BuaWV1dy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJVIGhlZWZ0IHV3IHdhY2h0d29vcmQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGluZ2V2b2VyZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJVIGhlZWZ0IHV3IFBJTi1jb2RlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtlZXIgb25qdWlzdCBpbmdldm9lcmQuICJcblxuIlByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kZW4gb3BuaWV1dy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IlUgaGVlZnQgdXcgb250Z3JlbmRlbGluZ3NwYXRyb29uIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtlZXIgb25qdWlzdCBnZXRla2VuZC4gTmEgbm9nIGVlbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gbWlzbHVrdGUgcG9naW5nZW4sIHdvcmR0IHUgZ2V2cmFhZ2Qgb20gdXcgdGVsZWZvb24gdGUgb250Z3JlbmRlbGVuIG1ldCB1dyBHb29nbGUgYWFubWVsZGluZy4iXG5cbiIgUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iUGF0cm9vbiB2ZXJnZXRlbj8iPC9zdHJpbmc+CkBAIC02MDYsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4iV2lsdCB1IGRlemUgcGFnaW5hIHZlcmxhdGVuPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJLaWVzIE9LIG9tIGRvb3IgdGUgZ2FhbiBvZiBBbm51bGVyZW4gb20gb3AgZGUgaHVpZGlnZSBwYWdpbmEgdGUgYmxpanZlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkJldmVzdGlnZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IlRpcDogdGlrIHR3ZWVtYWFsIG9tIGluIG9mIHVpdCB0ZSB6b29tZW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4iYnJvd3Nlcmdlc2NoaWVkZW5pcyBlbiBibGFkd2lqemVycyBsZXplbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGRlIFVSTFwncyBsZXplbiBkaWUgdSB2aWEgZGUgYnJvd3NlciBoZWVmdCBiZXpvY2h0LCBldmVuYWxzIGFsbGUgYmxhZHdpanplcnMgdmFuIGRlIGJyb3dzZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4iYnJvd3Nlcmdlc2NoaWVkZW5pcyBlbiBibGFkd2lqemVycyBzY2hyaWp2ZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBkZSBvcCB1dyB0ZWxlZm9vbiBvcGdlc2xhZ2VuIGJyb3dzZXJnZXNjaGllZGVuaXMgb2YgYmxhZHdpanplcnMgd2lqemlnZW4uIFNjaGFkZWxpamtlIHRvZXBhc3NpbmdlbiBrdW5uZW4gaGllcm1lZSB1dyBicm93c2VyZ2VnZXZlbnMgdmVyd2lqZGVyZW4gb2Ygd2lqemlnZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJHZW9sb2NhdGllcmVjaHRlbiB2b29yIGJyb3dzZXIgYWFucGFzc2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IlN0YWF0IGVlbiB0b2VwYXNzaW5nIHRvZSBkZSBnZW9sb2NhdGllcmVjaHRlbiB2YW4gZGUgYnJvd3NlciBhYW4gdGUgcGFzc2VuLiBTY2hhZGVsaWprZSB0b2VwYXNzaW5nZW4ga3VubmVuIGRpdCBnZWJydWlrZW4gb20gbG9jYXRpZWdlZ2V2ZW5zIHRlIHZlcnplbmRlbiBuYWFyIHdpbGxla2V1cmlnZSB3ZWJzaXRlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJXaWx0IHUgZGF0IGRlIGJyb3dzZXIgZGl0IHdhY2h0d29vcmQgb250aG91ZHQ/Ijwvc3RyaW5nPgpAQCAtNzI2LDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJBbGxlcyBzZWxlY3RlcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJXb29yZCBzZWxlY3RlcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktuaXBwZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGnDq3JlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IlBsYWtrZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IlVSTCBrb3Bpw6tyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJUZWtzdCBzZWxlY3RlcmVuLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlRla3N0c2VsZWN0aWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJJbnZvZXJtZXRob2RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IlwnPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwnIHRvZXZvZWdlbiBhYW4gd29vcmRlbmJvZWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJUZWtzdCBiZXdlcmtlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+IlRla3N0YWN0aWVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJXZWluaWcgcnVpbXRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iT3BzbGFncnVpbXRlIHZhbiB0ZWxlZm9vbiByYWFrdCBvcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTc0MSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxlcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkxldCBvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iTGFkZW4uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFBTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IlVJVCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQWN0aWUgdm9sdG9vaWVuIG1ldCI8L3N0cmluZz4KQEAgLTc1OSw5ICs3NTAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+Ik51IHNsdWl0ZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iUmFwcG9ydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iV2FjaHRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlRvZXBhc3Npbmcgb21nZWxlaWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gaXMgbnUgYWN0aWVmLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiB3YXMgaGV0IGVlcnN0IGdlc3RhcnQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkRlIHRvZXBhc3NpbmcgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGVlZnQgaGV0IHplbGYgYWZnZWR3b25nZW4gU3RyaWN0TW9kZS1iZWxlaWQgZ2VzY2hvbmRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJIZXQgcHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoZWVmdCBoZXQgemVsZiBhZmdlZHdvbmdlbiBTdHJpY3RNb2RlLWJlbGVpZCBnZXNjaG9uZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gd29yZHQgdWl0Z2V2b2VyZCI8L3N0cmluZz4KQEAgLTgwOCwyOCArODAyLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19zaG93X2FsbCIgbXNnaWQ9IjI2NzE3OTExNjM5MzMwOTExODAiPjxiPiJBbGxlcyB3ZWVyZ2V2ZW4iPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iVVNCLW1hc3Nhb3BzbGFnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iVVNCLXZlcmJpbmRpbmciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJVIGhlZWZ0IHV3IHRlbGVmb29uIHZpYSBVU0Igb3AgdXcgY29tcHV0ZXIgYWFuZ2VzbG90ZW4uIFNlbGVjdGVlciBkZSBvbmRlcnN0YWFuZGUga25vcCBhbHMgdSBiZXN0YW5kZW4gdHVzc2VuIHV3IGNvbXB1dGVyIGVuIGRlIFNELWthYXJ0IHZhbiB1dyBBbmRyb2lkIHdpbHQga29wacOrcmVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iVSBoZWVmdCB1dyB0ZWxlZm9vbiB2aWEgVVNCIG9wIHV3IGNvbXB1dGVyIGFhbmdlc2xvdGVuLiBTZWxlY3RlZXIgZGUgb25kZXJzdGFhbmRlIGtub3AgYWxzIHUgYmVzdGFuZGVuIHR1c3NlbiB1dyBjb21wdXRlciBlbiBkZSBTRC1rYWFydCB2YW4gdXcgQW5kcm9pZCB3aWx0IGtvcGnDq3Jlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IlUgaGVlZnQgdXcgdGVsZWZvb24gdmlhIFVTQiBvcCB1dyBjb21wdXRlciBhYW5nZXNsb3Rlbi4gU2VsZWN0ZWVyIGRlIG9uZGVyc3RhYW5kZSBrbm9wIGFscyB1IGJlc3RhbmRlbiB0dXNzZW4gdXcgY29tcHV0ZXIgZW4gZGUgU0Qta2FhcnQgdmFuIHV3IEFuZHJvaWQgd2lsdCBrb3Bpw6tyZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IlVTQi1vcHNsYWcgaW5zY2hha2VsZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJFciBpcyBlZW4gcHJvYmxlZW0gYmlqIGhldCBnZWJydWlrIHZhbiB1dyBTRC1rYWFydCB2b29yIFVTQi1vcHNsYWcuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJFciBpcyBlZW4gcHJvYmxlZW0gYmlqIGhldCBnZWJydWlrIHZhbiB1dyBTRC1rYWFydCB2b29yIFVTQi1vcHNsYWcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJFciBpcyBlZW4gcHJvYmxlZW0gYmlqIGhldCBnZWJydWlrIHZhbiB1dyBTRC1rYWFydCB2b29yIFVTQi1vcHNsYWcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQi12ZXJiaW5kaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4iU2VsZWN0ZWVyIGRpdCBvbSBiZXN0YW5kZW4gbmFhci92YW4gdXcgY29tcHV0ZXIgdGUga29wacOrcmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IlVTQi1vcHNsYWcgdWl0c2NoYWtlbGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJTZWxlY3RlZXIgZGl0IG9tIFVTQi1vcHNsYWcgdWl0IHRlIHNjaGFrZWxlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iVVNCLW9wc2xhZyBpbiBnZWJydWlrIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiJWb29yZGF0IHUgVVNCLW9wc2xhZyB1aXRzY2hha2VsdCwgbW9ldCB1IGRlIFNELWthYXJ0IHZhbiB1dyBBbmRyb2lkIGhlYmJlbiBvbnRrb3BwZWxkIChcJ3VpdGdld29ycGVuXCcpIHZhbiB1dyBjb21wdXRlci4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iVm9vcmRhdCB1IFVTQi1vcHNsYWcgdWl0c2NoYWtlbHQsIG1vZXQgdSBkZSBTRC1rYWFydCB2YW4gdXcgQW5kcm9pZCBoZWJiZW4gb250a29wcGVsZCAoXCd1aXRnZXdvcnBlblwnKSB2YW4gdXcgY29tcHV0ZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlZvb3JkYXQgdSBVU0Itb3BzbGFnIHVpdHNjaGFrZWx0LCBtb2V0IHUgZGUgU0Qta2FhcnQgdmFuIHV3IEFuZHJvaWQgaGViYmVuIG9udGtvcHBlbGQgKFwndWl0Z2V3b3JwZW5cJykgdmFuIHV3IGNvbXB1dGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+IlVTQi1vcHNsYWcgdWl0c2NoYWtlbGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMTQzODgxOTE0ODQwNDEyMTA4Ij4iRXIgaXMgZWVuIHByb2JsZWVtIG9wZ2V0cmVkZW4gdGlqZGVucyBoZXQgdWl0c2NoYWtlbGVuIHZhbiBkZSBVU0Itb3BzbGFnLiBDb250cm9sZWVyIG9mIHUgZGUgVVNCLWhvc3QgaGVlZnQgbG9zZ2Vrb3BwZWxkIGVuIHByb2JlZXIgaGV0IG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iVVNCLW9wc2xhZyBpbnNjaGFrZWxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IkFscyB1IFVTQi1vcHNsYWcgaW5zY2hha2VsdCwgd29yZGVuIGJlcGFhbGRlIHRvZXBhc3NpbmdlbiBkaWUgdSBnZWJydWlrdCwgZ2VzdG9wdCBlbiB3b3JkZW4gZGV6ZSBtb2dlbGlqayBwYXMgd2VlciBiZXNjaGlrYmFhciB3YW5uZWVyIHUgVVNCLW9wc2xhZyB1aXRzY2hha2VsdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iVVNCLWJld2Vya2luZyBtaXNsdWt0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+Ik9LIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiJTRC1rYWFydCBmb3JtYXR0ZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTRC1rYWFydCBmb3JtYXR0ZXJlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiJXZWV0IHUgemVrZXIgZGF0IHUgZGUgU0Qta2FhcnQgd2lsdCBmb3JtYXR0ZXJlbj8gQWxsZSBnZWdldmVucyBvcCB1dyBrYWFydCBnYWFuIGRhbiB2ZXJsb3Jlbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJXZWV0IHUgemVrZXIgZGF0IHUgZGUgU0Qta2FhcnQgd2lsdCBmb3JtYXR0ZXJlbj8gQWxsZSBnZWdldmVucyBvcCB1dyBrYWFydCBnYWFuIGRhbiB2ZXJsb3Jlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iU0Qta2FhcnQgZm9ybWF0dGVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJXZWV0IHUgemVrZXIgZGF0IHUgZGUgU0Qta2FhcnQgd2lsdCBmb3JtYXR0ZXJlbj8gQWxsZSBnZWdldmVucyBvcCB1dyBrYWFydCBnYWFuIGRhbiB2ZXJsb3Jlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiJGb3JtYXR0ZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IlVTQi1mb3V0b3BzcG9yaW5nIHZlcmJvbmRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iU2VsZWN0ZWVyIGRlemUgb3B0aWUgb20gVVNCLWZvdXRvcHNwb3JpbmcgdWl0IHRlIHNjaGFrZWxlbi4iPC9zdHJpbmc+CkBAIC04MzcsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiJrYW5kaWRhdGVuIjwvdT48L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU0NTc2MDM0MTg5NzA5OTQwNTAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDIzOTUxNjY3NTAyODQzODk5NyI+IlNELWthYXJ0IHZvb3JiZXJlaWRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iU0Qta2FhcnQgdm9vcmJlcmVpZGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJTRC1rYWFydCB2b29yYmVyZWlkZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4Mjg3MzE5ODgyOTI2NzM3MDUzIj4iQ29udHJvbGVyZW4gb3AgZm91dGVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJMZWdlIFNELWthYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iTGVnZSBTRC1rYWFydCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJEZSBTRC1rYWFydCBpcyBsZWVnIG9mIGdlYnJ1aWt0IGVlbiBuaWV0LW9uZGVyc3RldW5kIGJlc3RhbmRzc3lzdGVlbS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTRC1rYWFydCBpcyBsZWVnIG9mIGhlZWZ0IGVlbiBuaWV0LW9uZGVyc3RldW5kIGJlc3RhbmRzc3lzdGVlbS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJCZXNjaGFkaWdkZSBTRC1rYWFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQmVzY2hhZGlnZGUgU0Qta2FhcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IkRlIFNELWthYXJ0IGlzIGJlc2NoYWRpZ2QuIFUgbW9ldCBkZSBrYWFydCBtb2dlbGlqayBvcG5pZXV3IGZvcm1hdHRlcmVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTRC1rYWFydCBiZXNjaGFkaWdkLiBVIG1vZXQgZGUga2FhcnQgbW9nZWxpamsgb3BuaWV1dyBmb3JtYXR0ZXJlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IlNELWthYXJ0IG9udmVyd2FjaHRzIHZlcndpamRlcmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Qta2FhcnQgb252ZXJ3YWNodHMgdmVyd2lqZGVyZCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiJPbnRrb3BwZWwgZGUgU0Qta2FhcnQgdm9vcmRhdCB1IGRlemUgdmVyd2lqZGVydCBvbSBnZWdldmVuc3ZlcmxpZXMgdGUgdm9vcmtvbWVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+Ik9udGtvcHBlbCBkZSBTRC1rYWFydCB2b29yZGF0IHUgZGV6ZSB2ZXJ3aWpkZXJ0IG9tIGdlZ2V2ZW5zdmVybGllcyB0ZSB2b29ya29tZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiJEZSBTRC1rYWFydCBrYW4gdmVpbGlnIHdvcmRlbiB2ZXJ3aWpkZXJkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iRGUgU0Qta2FhcnQga2FuIHZlaWxpZyB3b3JkZW4gdmVyd2lqZGVyZCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IkRlIFNELWthYXJ0IGthbiBudSB2ZWlsaWcgd29yZGVuIHZlcndpamRlcmQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlUga3VudCBkZSBTRC1rYWFydCB2ZWlsaWcgdmVyd2lqZGVyZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJTRC1rYWFydCBpcyB2ZXJ3aWpkZXJkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNELWthYXJ0IGlzIHZlcndpamRlcmQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iRGUgU0Qta2FhcnQgaXMgdmVyd2lqZGVyZC4gUGxhYXRzIGVlbiBuaWV1d2UgU0Qta2FhcnQgb20gZGUgb3BzbGFnY2FwYWNpdGVpdCB2YW4gdXcgYXBwYXJhYXQgdGUgdmVyZ3JvdGVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNELWthYXJ0IHZlcndpamRlcmQuIFBsYWF0cyBlZW4gbmlldXdlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IkxlZ2UgU0Qta2FhcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTRC1rYWFydCBpcyBsZWVnIG9mIGhlZWZ0IGVlbiBuaWV0LW9uZGVyc3RldW5kIGJlc3RhbmRzc3lzdGVlbS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IkJlc2NoYWRpZ2RlIFNELWthYXJ0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNELWthYXJ0IGJlc2NoYWRpZ2QuIFUgbW9ldCBkZSBrYWFydCBtb2dlbGlqayBvcG5pZXV3IGZvcm1hdHRlcmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRC1rYWFydCBvbnZlcndhY2h0cyB2ZXJ3aWpkZXJkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iT250a29wcGVsIGRlIFNELWthYXJ0IHZvb3JkYXQgdSBkZXplIHZlcndpamRlcnQgb20gZ2VnZXZlbnN2ZXJsaWVzIHRlIHZvb3Jrb21lbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJEZSBTRC1rYWFydCBrYW4gdmVpbGlnIHdvcmRlbiB2ZXJ3aWpkZXJkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlUga3VudCBkZSBTRC1rYWFydCB2ZWlsaWcgdmVyd2lqZGVyZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNELWthYXJ0IGlzIHZlcndpamRlcmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRC1rYWFydCB2ZXJ3aWpkZXJkLiBQbGFhdHMgZWVuIG5pZXV3ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+IkdlZW4gb3ZlcmVlbmtvbWVuZGUgYWN0aXZpdGVpdGVuIGdldm9uZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+ImdlYnJ1aWtzc3RhdGlzdGlla2VuIHZhbiBjb21wb25lbnQgYmlqd2Vya2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IkhpZXJtZWUga3VubmVuIHZlcnphbWVsZGUgZ2VicnVpa3NzdGF0aXN0aWVrZW4gdmFuIGVlbiBjb21wb25lbnQgd29yZGVuIGdld2lqemlnZC4gTmlldCB2b29yIGdlYnJ1aWsgZG9vciBub3JtYWxlIHRvZXBhc3Npbmdlbi4iPC9zdHJpbmc+CkBAIC04OTQsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZvb3JhZiBnZWRlZWxkZSBzbGV1dGVsIG9wIGJhc2lzIHZhbiBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpY2FhdCBvcCBiYXNpcyB2YW4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJCZXN0YW5kIGtpZXplbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkdlZW4gYmVzdGFuZCBnZXNlbGVjdGVlcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJPcG5pZXV3IGluc3RlbGxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJWZXJ6ZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaWV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXV0b21vZHVzIGluZ2VzY2hha2VsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY3RlZXIgZGl0IG9tIGRlIGF1dG9tb2R1cyBhZiB0ZSBzbHVpdGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUZXRoZXJpbmcgb2YgaG90c3BvdCBhY3RpZWYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJBYW5yYWtlbiBvbSB0ZSBjb25maWd1cmVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJWb3JpZ2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJWb2xnZW5kZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Ik92ZXJzbGFhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Ikhvb2cgbW9iaWVsIGdlZ2V2ZW5zZ2VicnVpayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iUmFhayBhYW4gdm9vciBtZWVyIGluZm9ybWF0aWUgb3ZlciBtb2JpZWwgZ2VnZXZlbnNnZWJydWlrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJNb2JpZWxlIGdlZ2V2ZW5zbGltaWV0IG92ZXJzY2hyZWRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJSYWFrIGFhbiB2b29yIG1lZXIgaW5mb3JtYXRpZSBvdmVyIG1vYmllbCBnZWdldmVuc2dlYnJ1aWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+IkdlZW4gb3ZlcmVlbmtvbXN0ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiIG1zZ2lkPSIxOTQ2Nzk5MjMzODIyODIwMzg0Ij4iWm9la2VuIG9wIHBhZ2luYSI8L3N0cmluZz4KKyAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjgxNjcxNDcwODExMzY1Nzk0MzkiPiIxIG92ZXJlZW5rb21zdCI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IHZhbiA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKaW5kZXggNGU1MjU2Zi4uMzNiMDNhZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+Ik5hcnrEmWR6aWEgcHJvZ3JhbWlzdHljem5lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bmtjamUgcG90cnplYm5lIGplZHluaWUgcHJvZ3JhbWlzdG9tIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iUGFtacSZxIciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IkRvc3TEmXAgZG8ga2FydHkgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkRvc3TEmXAgZG8ga2FydHkgU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkRvc3TEmXAgZG8ga2FydHkgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4id3nFgsSFY3phbmllIGx1YiB6bWllbmlhbmllIHBhc2thIHN0YW51Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IlBvendhbGEgYXBsaWthY2pvbSBuYSB3ecWCxIVjemVuaWUgcGFza2Egc3RhbnUgbHViIGRvZGF3YW5pZSBpIHVzdXdhbmllIGlrb24gc3lzdGVtb3d5Y2guIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+InBhc2VrIHN0YW51Ijwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJQb3p3YWxhIGFwbGlrYWNqaSBuYSB6d2FsbmlhbmllIHBhbWnEmWNpIHRlbGVmb251IHByemV6IHVzdXdhbmllIHBsaWvDs3cgeiBrYXRhbG9ndSBwYW1pxJljaSBwb2RyxJljem5laiBhcGxpa2FjamkuIERvc3TEmXAgamVzdCBiYXJkem8gb2dyYW5pY3pvbnksIHogcmVndcWCeSBkbyBwcm9jZXPDs3cgc3lzdGVtdS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iUHJ6ZW5vc3plbmllIHphc29iw7N3IGFwbGlrYWNqaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IlplendhbGEgYXBsaWthY2ppIG5hIHByemVuaWVzaWVuaWUgemFzb2LDs3cgYXBsaWthY2ppIHogbm/Fm25pa2Egd2V3bsSZdHJ6bmVnbyBuYSB6ZXduxJl0cnpueSBpIG9kd3JvdG5pZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+Im9kY3p5dCB3cmHFvGxpd3ljaCBkYW55Y2ggZHppZW5uaWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIG1zZ2lkPSI4ODk2NDQ5NDM3NDY0ODY3NzY2Ij4iVW1vxbxsaXdpYSBhcGxpa2Fjam9tIG9kY3p5dCB6IHLDs8W8bnljaCBwbGlrw7N3IGR6aWVubmlrw7N3IHN5c3RlbW93eWNoLiBQb3p3YWxhIHRvIHBvem5hxIcgb2fDs2xuZSBpbmZvcm1hY2plIG5hIHRlbWF0IGtvcnp5c3RhbmlhIHogdGVsZWZvbnUsIGNvIHBvdGVuY2phbG5pZSBtb8W8ZSBvYmVqbW93YcSHIHLDs3duaWXFvCBpbmZvcm1hY2plIHByeXdhdG5lIGx1YiBvc29iaXN0ZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJjenl0YW5pZS96YXBpc3l3YW5pZSB3IHphc29iYWNoIG5hbGXFvMSFY3ljaCBkbyBkaWFnbm9zdHlraSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2RpYWdub3N0aWMiIG1zZ2lkPSIzMTIxMjM4MzczOTUxNjM3MDQ5Ij4iUG96d2FsYSBhcGxpa2FjamkgbmEgY3p5dGFuaWUgaSB6YXBpc3l3YW5pZSB3ZSB3c3p5c3RraWNoIHphc29iYWNoIHBvc2lhZGFueWNoIHByemV6IGRpYWdub3pvd2FuxIUgZ3J1cMSZLCBqYWsgbmEgcHJ6eWvFgmFkIHBsaWtpIHcga2F0YWxvZ3UgL2Rldi4gTW/FvGUgdG8gcG90ZW5jamFsbmllIHdwxYJ5bsSFxIcgbmEgc3RhYmlsbm/Fm8SHIGkgYmV6cGllY3plxYRzdHdvIHN5c3RlbXUuIFBvd2lubm8gYnnEhyB3eWtvcnp5c3R5d2FuZSBUWUxLTyB3IGNlbGFjaCBkaWFnbm96b3dhbmlhIHNwcnrEmXR1IHByemV6IHByb2R1Y2VudGEgbHViIG9wZXJhdG9yYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJ3xYLEhWN6YW5pZSBsdWIgd3nFgsSFY3phbmllIHNrxYJhZG5pa8OzdyBhcGxpa2FjamkiPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJQb3p3YWxhIGFwbGlrYWNqaSBuYSBrb25maWd1cm93YW5pZSBsb2thbG5lZ28gdGVsZWZvbnUgQmx1ZXRvb3RoLCB3eXN6dWtpd2FuaWUgdXJ6xIVkemXFhCB6ZGFsbnljaCBpIMWCxIVjemVuaWUgc2nEmSB6IG5pbWkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4idHdvcnplbmllIHBvxYLEhWN6ZcWEIEJsdWV0b290aCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IlBvendhbGEgYXBsaWthY2ppIG5hIHd5xZt3aWV0bGFuaWUga29uZmlndXJhY2ppIGxva2FsbmVnbyB0ZWxlZm9udSBCbHVldG9vdGggb3JheiBuYSB0d29yemVuaWUgaSBha2NlcHRvd2FuaWUgcG/FgsSFY3plxYQgemUgc3Bhcm93YW55bWkgdXJ6xIVkemVuaWFtaS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4id3nFgsSFY3phbmllIGJsb2thZHkga2xhd2lhdHVyeSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJQb3p3YWxhIGFwbGlrYWNqaSBuYSB3ecWCxIVjemVuaWUgYmxva2FkeSBrbGF3aWF0dXJ5IGkgd3N6eXN0a2ljaCB6d2nEhXphbnljaCB6IHR5bSBoYXNlxYIgemFiZXpwaWVjemFqxIVjeWNoLiBUeXBvd3ltIHByenlrxYJhZGVtIHRha2llZ28gZHppYcWCYW5pYSBqZXN0IHd5xYLEhWN6YW5pZSBibG9rYWR5IGtsYXdpYXR1cnksIGdkeSBwb2phd2lhIHNpxJkgcG/FgsSFY3plbmllIHByenljaG9kesSFY2UsIGEgbmFzdMSZcG5pZSBwb25vd25lIGplaiB3xYLEhWN6YW5pZSBwbyB6YWtvxYRjemVuaXUgcG/FgsSFY3plbmlhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiJjenl0YW5pZSB1c3Rhd2llxYQgc3luY2hyb25pem93YW5pYSI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJaZXp3YWxhIGFwbGlrYWNqaSBuYSBvZGN6eXR5d2FuaWUgd3N6ZWxraWNoIHByeXdhdG55Y2ggc8WCw7N3LCBuYXp3IGkgd3lyYcW8ZcWEIHphcGlzYW55Y2ggcHJ6ZXogdcW8eXRrb3duaWthIHcgc3dvaW0gc8WCb3duaWt1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+InphcGlzeXdhbmllIHcgc8WCb3duaWt1IHpkZWZpbmlvd2FueW0gcHJ6ZXogdcW8eXRrb3duaWthIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IlplendhbGEgYXBsaWthY2pvbSBuYSB6YXBpc3l3YW5pZSBub3d5Y2ggc8WCw7N3IHcgc8WCb3duaWt1IHXFvHl0a293bmlrYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+Im1vZHlmaWtvd2FuaWUvdXN1d2FuaWUgemF3YXJ0b8WbY2kga2FydHkgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZHlmaWtvd2FuaWUvdXN1d2FuaWUgemF3YXJ0b8WbY2kga2FydHkgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iVW1vxbxsaXdpYSBhcGxpa2FjamkgemFwaXMgbmEga2FyY2llIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlVtb8W8bGl3aWEgYXBsaWthY2ppIHphcGlzIG5hIGthcmNpZSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZHlmaWtvd2FuaWUvdXN1d2FuaWUgemF3YXJ0b8WbY2kga2FydHkgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJVbW/FvGxpd2lhIGFwbGlrYWNqaSB6YXBpcyBuYSBrYXJjaWUgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+ImRvc3TEmXAgZG8gc3lzdGVtdSBwbGlrw7N3IHBhbWnEmWNpIHBvZHLEmWN6bmVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiJaZXp3YWxhIGFwbGlrYWNqaSBuYSBvZGN6eXQgaSB6YXBpcyB3IHN5c3RlbWllIHBsaWvDs3cgcGFtacSZY2kgcG9kcsSZY3puZWouIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iT2dyYW5pY3ogbGljemLEmSBwcsOzYiB3cHJvd2FkemVuaWEgaGFzxYJhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+Ik9ncmFuaWN6YSBkb3p3b2xvbmUgdHlweSBoYXNlxYIgdcW8eXRrb3duaWthLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iTW9uaXRvcnVqIHByw7NieSBsb2dvd2FuaWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4iTW9uaXRvcnVqZSBuaWV1ZGFuZSBwcsOzYnkgemFsb2dvd2FuaWEgZG8gdXJ6xIVkemVuaWEgdyBjZWx1IHd5a29uYW5pYSBva3JlxZtsb25lZ28gZHppYcWCYW5pYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJSZXNldHVqIGhhc8WCbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDMzMzIxNjc2MDAzMzE3OTk5OTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjUzOTEyNDA2MTY5ODEyOTczNjEiPiJXeW11c3phIHBvZGFuaWUgbm93ZWogd2FydG/Fm2NpIGhhc8WCYSwgd3ltYWdhasSFYyBwcnpla2F6YW5pYSBnbyB1xbx5dGtvd25pa293aSBwcnpleiBhZG1pbmlzdHJhdG9yYSBwcnplZCB6YWxvZ293YW5pZW0uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJXeW11xZsgemFibG9rb3dhbmllIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iS29udHJvbHVqZSwga2llZHkgdXJ6xIVkemVuaWUgamVzdCBibG9rb3dhbmUsIHd5bWFnYWrEhWMgcG9ub3duZWdvIHdwcm93YWR6ZW5pYSBoYXPFgmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iT2dyYW5pY3ogbGljemLEmSBwcsOzYiB3cHJvd2FkemVuaWEgaGFzxYJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+Ik9ncmFuaWN6YSBkb3p3b2xvbmUgdHlweSBoYXNlxYIgdcW8eXRrb3duaWthLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+Ik1vbml0b3J1aiBwcsOzYnkgbG9nb3dhbmlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+Ik1vbml0b3J1amUgbmlldWRhbmUgcHLDs2J5IHphbG9nb3dhbmlhIGRvIHVyesSFZHplbmlhIHcgY2VsdSB3eWtvbmFuaWEgb2tyZcWbbG9uZWdvIGR6aWHFgmFuaWEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iUmVzZXR1aiBoYXPFgm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4iV3ltdXN6YSBwb2RhbmllIG5vd2VqIHdhcnRvxZtjaSBoYXPFgmEsIHd5bWFnYWrEhWMgcHJ6ZWthemFuaWEgZ28gdcW8eXRrb3duaWtvd2kgcHJ6ZXogYWRtaW5pc3RyYXRvcmEgcHJ6ZWQgemFsb2dvd2FuaWVtLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iV3ltdcWbIHphYmxva293YW5pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2x1amUsIGtpZWR5IHVyesSFZHplbmllIGplc3QgYmxva293YW5lLCB3eW1hZ2FqxIVjIHBvbm93bmVnbyB3cHJvd2FkemVuaWEgaGFzxYJhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJVc3XFhCB3c3p5c3RraWUgZGFuZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iV3lrb251amUgcmVzZXQgZmFicnljem55LCB1c3V3YWrEhWMgd3N6eXN0a2llIGRhbmUgdcW8eXRrb3duaWthIGJleiDFvGFkbmVnbyBwb3R3aWVyZHplbmlhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iV3lrb251amUgcmVzZXQgZmFicnljem55LCB1c3V3YWrEhWMgd3N6eXN0a2llIGRhbmUgdcW8eXRrb3duaWthIGJleiDFvGFkbmVnbyBwb3R3aWVyZHplbmlhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IlVzdGF3IGdsb2JhbG55IHNlcndlciBwcm94eSB1cnrEhWR6ZW5pYSBkbyB1xbx5d2FuaWEgcHJ6eSB3xYLEhWN6b255Y2ggemFzYWRhY2guIFR5bGtvIHBpZXJ3c3p5IGFkbWluaXN0cmF0b3IgdXJ6xIVkemVuaWEgdXN0YXdpYSBvYm93acSFenVqxIVjeSBnbG9iYWxueSBzZXJ3ZXIgcHJveHkuIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRG9tIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iS29tw7Nya2EiPC9pdGVtPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJTxYJ1xbxib3d5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IklubnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iTmllc3RhbmRhcmRvd3kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiJOaWVzdGFuZGFyZG93eSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlSG9tZSIgbXNnaWQ9IjYwOTM1OTgxODEwNjkzNTkyOTUiPiJEb21vd3kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZVdvcmsiIG1zZ2lkPSI2OTIwNzI1NzMwNzk3MDk5MDQ3Ij4iU8WCdcW8Ym93eSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlT3RoZXIiIG1zZ2lkPSI0NDA4NDM2MTYyOTUwMTE5ODQ5Ij4iSW5ueSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJwcnpleiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHByemV6IDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlQ3VzdG9tICgyNDczNTgwNTkzMTExNTkwOTQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlSG9tZSAoNjA5MzU5ODE4MTA2OTM1OTI5NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZVdvcmsgKDY5MjA3MjU3MzA3OTcwOTkwNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Ildwcm93YWTFuiBrb2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJXcHJvd2FkxbogaGFzxYJvLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Ildwcm93YWTFuiBrb2QgUElOLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJCxYLEmWRueSBrb2QgUElOISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJBYnkgb2RibG9rb3dhxIcsIG5hY2nFm25paiBNZW51LCBhIG5hc3TEmXBuaWUgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtZXIgYWxhcm1vd3kiPC9zdHJpbmc+CkBAIC01NjQsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUG93csOzdCBkbyBwb8WCxIVjemVuaWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJQb3ByYXduaWUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+Ik5pZXN0ZXR5LCBzcHLDs2J1aiBwb25vd25pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iU3Byw7NidWogcG9ub3duaWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFgWFkb3dhbmllICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJOYcWCYWRvd2FueS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU3OCw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplc3QgemFibG9rb3dhbmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iT2RibG9rb3d5d2FuaWUga2FydHkgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iV3rDs3Igb2RibG9rb3dhbmlhIHpvc3RhxYIgbmllcHJhd2lkxYJvd28gbmFyeXNvd2FueSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiByYXp5LiAiXG5cbiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzxYJvIHpvc3RhxYJvIG5pZXByYXdpZMWCb3dvIHdwcm93YWR6b25lIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+Ik5pZXBvcHJhd25pZSB3cHJvd2Fkem9ubyBrb2QgUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJXesOzciBvZGJsb2tvd2FuaWEgem9zdGHFgiBuYXJ5c293YW55IG5pZXByYXdpZMWCb3dvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuIFBvIGtvbGVqbnljaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBuaWV1ZGFueWNoIHByw7NiYWNoIHRlbGVmb24gdHJ6ZWJhIGLEmWR6aWUgb2RibG9rb3dhxIcgcHJ6ZXogemFsb2dvd2FuaWUgbmEga29uY2llIEdvb2dsZS4iXG5cbiIgU3Byw7NidWogcG9ub3duaWUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iWmFwb21uaWHFgmXFmyB3em9ydT8iPC9zdHJpbmc+CkBAIC02MDYsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4iQ3p5IG9wdcWbY2nEhyB0xJkgc3Ryb27EmT8iXG5cbiI8eGxpZmY6ZyBpZD0iTUVTU0FHRSI+JXM8L3hsaWZmOmc+IlxuXG4iV3liaWVyeiBvcGNqxJkgT0ssIGFieSBrb250eW51b3dhxIcsIGx1YiBvcGNqxJkgQW51bHVqLCBhYnkgcG96b3N0YcSHIG5hIHRlaiBzdHJvbmllLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4iUG90d2llcmTFuiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iV3NrYXrDs3drYTogZG90a25paiBkd3Vrcm90bmllLCBhYnkgcG93acSZa3N6ecSHIGx1YiBwb21uaWVqc3p5xIcuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4ib2Rjenl0IGhpc3RvcmlpIGkgemFrxYJhZGVrIHByemVnbMSFZGFya2kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiJVbW/FvGxpd2lhIGFwbGlrYWNqaSBvZGN6eXQgd3N6eXN0a2ljaCBhZHJlc8OzdyBVUkwgb2R3aWVkem9ueWNoIHByemV6IHByemVnbMSFZGFya8SZLCBhIHRha8W8ZSB3c3p5c3RraWNoIHpha8WCYWRlayBwcnplZ2zEhWRhcmtpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+InphcGlzIGhpc3RvcmlpIGkgemFrxYJhZGVrIHByemVnbMSFZGFya2kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJVbW/FvGxpd2lhIGFwbGlrYWNqaSBtb2R5Zmlrb3dhbmllIGhpc3RvcmlpIGx1YiB6YWvFgmFkZWsgcHJ6ZWdsxIVkYXJraSB6YXBpc2FueWNoIHcgdGVsZWZvbmllLiBaxYJvxZtsaXdlIGFwbGlrYWNqZSBtb2fEhSB1xbx5d2HEhyB0ZWogb3BjamkgZG8gdXN1d2FuaWEgbHViIG1vZHlmaWtvd2FuaWEgZGFueWNoIHByemVnbMSFZGFya2kuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJNb2R5Zmlrb3dhbmllIHVwcmF3bmllxYQgcHJ6ZWdsxIVkYXJraSBkb3R5Y3rEhWN5Y2ggbG9rYWxpemFjamkgZ2VvZ3JhZmljem5laiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiJaZXp3YWxhIGFwbGlrYWNqaSBuYSBtb2R5Zmlrb3dhbmllIHVwcmF3bmllxYQgcHJ6ZWdsxIVkYXJraSBkb3R5Y3rEhWN5Y2ggbG9rYWxpemFjamkgZ2VvZ3JhZmljem5lai4gWsWCb8WbbGl3ZSBhcGxpa2FjamUgbW9nxIUgdcW8eXdhxIcgdGVqIG9wY2ppIGRvIHd5c3nFgmFuaWEgaW5mb3JtYWNqaSBvIGxva2FsaXphY2ppIGRvIGRvd29sbnljaCB3aXRyeW4gaW50ZXJuZXRvd3ljaC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJDenkgY2hjZXN6LCBhYnkgemFwYW1pxJl0YcSHIHRvIGhhc8WCbyB3IHByemVnbMSFZGFyY2U/Ijwvc3RyaW5nPgpAQCAtNzI2LDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJaYXpuYWN6IHdzenlzdGtvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJaYXpuYWN6IHd5cmF6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+Ild5dG5paiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waXVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iV2tsZWoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IktvcGl1aiBhZHJlcyBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJaYXpuYWN6IHRla3N0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+Ilphem5hY3phbmllIHRla3N0dSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kYSB3cHJvd2FkemFuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iRG9kYWogdGVybWluIOKAnjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7igJ0gZG8gc8WCb3duaWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWR5dHVqIHRla3N0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iRHppYcWCYW5pYSBuYSB0ZWvFm2NpZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iTWHFgm8gbWllanNjYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+Ik1hbGVqZSBpbG/Fm8SHIGRvc3TEmXBuZWogcGFtacSZY2kgdGVsZWZvbnUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03NDEsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkFudWx1aiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJVd2FnYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iV2N6eXR5d2FuaWUuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlfFgsSFY3oiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJXecWCxIVjeiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iWmFrb8WEY3ogY3p5bm5vxZvEhyBrb3J6eXN0YWrEhWMgeiI8L3N0cmluZz4KQEAgLTc1OSw5ICs3NTAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+Ild5bXXFmyB6YW1rbmnEmWNpZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJaZ8WCb8WbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJDemVrYWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcGxpa2FjamEgcHJ6ZWtpZXJvd2FuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iQXBsaWthY2phIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gamVzdCB1cnVjaG9taW9uYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IkFwbGlrYWNqYSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHpvc3RhxYJhIHBpZXJ3b3RuaWUgdXJ1Y2hvbWlvbmEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkFwbGlrYWNqYSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBuYXJ1c3p5xYJhIHd5bXVzem9uZSBwcnpleiBzaWViaWUgemFzYWR5IFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBuYXJ1c3p5xYIgd3ltdXN6b25lIHByemV6IHNpZWJpZSB6YXNhZHkgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+IkR6aWHFgmEgPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC04MDgsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iUG9rYcW8IHdzenlzdGtvIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlBhbWnEmcSHIG1hc293YSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJQb8WCxIVjemVuaWUgcHJ6ZXogVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4iVGVsZWZvbiB6b3N0YcWCIHBvxYLEhWN6b255IHoga29tcHV0ZXJlbSB6YSBwb8WbcmVkbmljdHdlbSBVU0IuIFd5YmllcnogcG9uacW8c3p5IHByenljaXNrLCBhYnkgc2tvcGlvd2HEhyBwbGlraSBtacSZZHp5IGtvbXB1dGVyZW0gYSBrYXJ0xIUgU0Qgc3lzdGVtdSBBbmRyb2lkLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iVGVsZWZvbiB6b3N0YcWCIHBvxYLEhWN6b255IHoga29tcHV0ZXJlbSB6YSBwb8WbcmVkbmljdHdlbSBVU0IuIFd5YmllcnogcG9uacW8c3p5IHByenljaXNrLCBhYnkgc2tvcGlvd2HEhyBwbGlraSBtacSZZHp5IGtvbXB1dGVyZW0gYSBrYXJ0xIUgU0Qgc3lzdGVtdSBBbmRyb2lkLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iVGVsZWZvbiB6b3N0YcWCIHBvxYLEhWN6b255IHoga29tcHV0ZXJlbSB6YSBwb8WbcmVkbmljdHdlbSBVU0IuIFd5YmllcnogcG9uacW8c3p5IHByenljaXNrLCBhYnkgc2tvcGlvd2HEhyBwbGlraSBtacSZZHp5IGtvbXB1dGVyZW0gYSBrYXJ0xIUgU0Qgc3lzdGVtdSBBbmRyb2lkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiJXxYLEhWN6IG5vxZtuaWsgVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iV3lzdMSFcGnFgiBwcm9ibGVtIHogd3lrb3J6eXN0YW5pZW0ga2FydHkgU0QgZGxhIHBhbWnEmWNpIFVTQi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+Ild5c3TEhXBpxYIgcHJvYmxlbSB6IHd5a29yenlzdGFuaWVtIGthcnR5IFNEIGRsYSBwYW1pxJljaSBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJXeXN0xIVwacWCIHByb2JsZW0geiB3eWtvcnp5c3RhbmllbSBrYXJ0eSBTRCBkbGEgcGFtacSZY2kgVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJQb8WCxIVjemVuaWUgcHJ6ZXogVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4iV3liaWVyeiwgYWJ5IHNrb3Bpb3dhxIcgcGxpa2kgZG8veiBrb21wdXRlcmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJXecWCxIVjeiBub8WbbmlrIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iV3liaWVyeiwgYWJ5IHd5xYLEhWN6ecSHIG5vxZtuaWsgVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiJOb8WbbmlrIFVTQiB3IHXFvHljaXUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IlByemVkIHd5xYLEhWN6ZW5pZW0gbm/Fm25pa2EgVVNCIHVwZXduaWogc2nEmSwgxbxlIGthcnRhIFNEIHN5c3RlbXUgQW5kcm9pZCB6b3N0YcWCYSBvZMWCxIVjem9uYSAo4oCed3lqxJl0YeKAnSkgb2Qga29tcHV0ZXJhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJQcnplZCB3ecWCxIVjemVuaWVtIG5vxZtuaWthIFVTQiB1cGV3bmlqIHNpxJksIMW8ZSBrYXJ0YSBTRCBzeXN0ZW11IEFuZHJvaWQgem9zdGHFgmEgb2TFgsSFY3pvbmEgKOKAnnd5asSZdGHigJ0pIG9kIGtvbXB1dGVyYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iUHJ6ZWQgd3nFgsSFY3plbmllbSBub8WbbmlrYSBVU0IgdXBld25paiBzacSZLCDFvGUga2FydGEgU0Qgc3lzdGVtdSBBbmRyb2lkIHpvc3RhxYJhIG9kxYLEhWN6b25hICjigJ53eWrEmXRh4oCdKSBvZCBrb21wdXRlcmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iV3nFgsSFY3ogbm/Fm25payBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJXeXN0xIVwacWCIHByb2JsZW0gcG9kY3phcyB3ecWCxIVjemFuaWEgbm/Fm25pa2EgVVNCLiBVcGV3bmlqIHNpxJksIMW8ZSBob3N0IFVTQiB6b3N0YcWCIG9kxYLEhWN6b255LCBhIG5hc3TEmXBuaWUgc3Byw7NidWogcG9ub3duaWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iV8WCxIVjeiBub8WbbmlrIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IlBvIHfFgsSFY3plbml1IG5vxZtuaWthIFVTQiBuaWVrdMOzcmUgdcW8eXdhbmUgYXBsaWthY2plIHpvc3RhbsSFIHphdHJ6eW1hbmUgaSBtb2fEhSBiecSHIG5pZWRvc3TEmXBuZSBkbyBjaHdpbGkgd3nFgsSFY3plbmlhIG5vxZtuaWthIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iT3BlcmFjamEgVVNCIG5pZSBwb3dpb2TFgmEgc2nEmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0dWoga2FydMSZIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdHVqIGthcnTEmSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiJDenkgbmEgcGV3bm8gc2Zvcm1hdG93YcSHIGthcnTEmSBTRD8gV3N6eXN0a2llIGRhbmUgbmEga2FyY2llIHpvc3RhbsSFIHV0cmFjb25lLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IkN6eSBuYSBwZXdubyBzZm9ybWF0b3dhxIcga2FydMSZIFNEPyBXc3p5c3RraWUgZGFuZSBuYSBrYXJjaWUgem9zdGFuxIUgdXRyYWNvbmUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdHVqIGthcnTEmSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IkN6eSBuYSBwZXdubyBzZm9ybWF0b3dhxIcga2FydMSZIFNEPyBXc3p5c3RraWUgZGFuZSBuYSBrYXJjaWUgem9zdGFuxIUgdXRyYWNvbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0dWoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJQb2TFgsSFY3pvbm8gbW9kdcWCIGRlYnVnb3dhbmlhIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iV3liaWVyeiwgYWJ5IHd5xYLEhWN6ecSHIGRlYnVnb3dhbmllIFVTQi4iPC9zdHJpbmc+CkBAIC04MzcsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEHEhEJDxIZERcSYRkdISUpLTMWBTU7Fg0/Dk1BRUlPFmlRVVldYWVrFucW7Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiJrYW5keWRhY2kiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iUHJ6eWdvdG93eXdhbmllIGthcnR5IFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJQcnp5Z290b3d5d2FuaWUga2FydHkgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByenlnb3Rvd3l3YW5pZSBrYXJ0eSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJTcHJhd2R6YW5pZSB3IHBvc3p1a2l3YW5pdSBixYLEmWTDs3cuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IlB1c3RhIGthcnRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iUHVzdGEga2FydGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iS2FydGEgU0QgamVzdCBwdXN0YSBsdWIgdcW8eXdhIG5pZW9ic8WCdWdpd2FuZWdvIHN5c3RlbXUgcGxpa8Ozdy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJLYXJ0YSBTRCBqZXN0IHB1c3RhIGx1YiB6YXdpZXJhIG5pZW9ic8WCdWdpd2FueSBzeXN0ZW0gcGxpa8Ozdy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJVc3prb2R6b25hIGthcnRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJVc3prb2R6b25hIGthcnRhIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJLYXJ0YSBTRCBqZXN0IHVzemtvZHpvbmEuIEtvbmllY3puZSBtb8W8ZSBiecSHIHByemVmb3JtYXRvd2FuaWUga2FydHkuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkthcnRhIFNEIGplc3QgdXN6a29kem9uYS4gS29uaWVjem5lIG1vxbxlIGJ5xIcgcG9ub3duZSBzZm9ybWF0b3dhbmllLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iS2FydGEgU0Qgem9zdGHFgmEgbmllb2N6ZWtpd2FuaWUgd3lqxJl0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJLYXJ0YSBTRCB6b3N0YcWCYSBuaWVvY3pla2l3YW5pZSB3eWrEmXRhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+Ik9kxYLEhWN6IGthcnTEmSBTRCBwcnplZCBqZWogd3lqxJljaWVtLCBhYnkgdW5pa27EhcSHIHV0cmF0eSBkYW55Y2guIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iT2TFgsSFY3oga2FydMSZIFNEIHByemVkIGplaiB3eWrEmWNpZW0sIGFieSB1bmlrbsSFxIcgdXRyYXR5IGRhbnljaC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+Ik1vxbxuYSBiZXpwaWVjem5pZSB1c3VuxIXEhyBrYXJ0xJkgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJNb8W8bmEgYmV6cGllY3puaWUgdXN1bsSFxIcga2FydMSZIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iTW/FvG5hIHRlcmF6IGJlenBpZWN6bmllIHVzdW7EhcSHIGthcnTEmSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iTW/FvGVzeiBiZXpwaWVjem5pZSB3eWrEhcSHIGthcnTEmSBTRC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+IlVzdW5pxJl0YSBrYXJ0YSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJVc3VuacSZdGEga2FydGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iS2FydGEgU0Qgem9zdGHFgmEgdXN1bmnEmXRhLiBXxYLDs8W8IG5vd8SFIGthcnTEmSBTRCwgYWJ5IHp3acSZa3N6ecSHIHBhbWnEmcSHIHVyesSFZHplbmlhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IkthcnRhIFNEIHpvc3RhxYJhIHd5asSZdGEuIFfFgsOzxbwgbm93xIUga2FydMSZLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlB1c3RhIGthcnRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iS2FydGEgU0QgamVzdCBwdXN0YSBsdWIgemF3aWVyYSBuaWVvYnPFgnVnaXdhbnkgc3lzdGVtIHBsaWvDs3cuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJVc3prb2R6b25hIGthcnRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkthcnRhIFNEIGplc3QgdXN6a29kem9uYS4gS29uaWVjem5lIG1vxbxlIGJ5xIcgcG9ub3duZSBzZm9ybWF0b3dhbmllLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJLYXJ0YSBTRCB6b3N0YcWCYSBuaWVvY3pla2l3YW5pZSB3eWrEmXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iT2TFgsSFY3oga2FydMSZIFNEIHByemVkIGplaiB3eWrEmWNpZW0sIGFieSB1bmlrbsSFxIcgdXRyYXR5IGRhbnljaC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJNb8W8bmEgYmV6cGllY3puaWUgdXN1bsSFxIcga2FydMSZIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+Ik1vxbxlc3ogYmV6cGllY3puaWUgd3lqxIXEhyBrYXJ0xJkgU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlVzdW5pxJl0YSBrYXJ0YSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IkthcnRhIFNEIHpvc3RhxYJhIHd5asSZdGEuIFfFgsOzxbwgbm93xIUga2FydMSZLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iTmllIHpuYWxlemlvbm8gcGFzdWrEhWN5Y2ggZHppYcWCYcWEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+ImFrdHVhbGl6b3dhbmllIHN0YXR5c3R5ayB1xbx5Y2lhIGtvbXBvbmVudHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iWmV6d2FsYSBuYSBtb2R5ZmlrYWNqZSB6ZWJyYW55Y2ggc3RhdHlzdHlrIHXFvHljaWEga29tcG9uZW50dS4gTmllcHJ6ZXpuYWN6b25lIGRsYSB6d3lrxYJ5Y2ggYXBsaWthY2ppLiI8L3N0cmluZz4KQEAgLTg5NCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iU2llxIcgVlBOIEwyVFAvSVBTZWMgeiBrbHVjemVtIFBTSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJTaWXEhyBWUE4gTDJUUC9JUFNlYyB6IGNlcnR5ZmlrYXRlbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+Ild5YmllcnogcGxpayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5pZSB3eWJyYW5vIHBsaWt1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzZXR1aiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJQcnplxZtsaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+InVsdWJpb25lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iVHJ5YiBzYW1vY2hvZG93eSB3xYLEhWN6b255Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+Ild5YmllcnosIGFieSB6YWtvxYRjennEhyB0cnliIHNhbW9jaG9kb3d5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJKZXN0IGFrdHl3bmUgcG93acSFemFuaWUgbHViIHB1bmt0IGRvc3TEmXB1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iRG90a25paiwgYWJ5IHNrb25maWd1cm93YcSHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iV3LDs8SHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iRGFsZWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJQb21pxYQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJXeXNva2kgcG96aW9tIHXFvHljaWEgZGFueWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJEb3RrbmlqLCBhYnkgem9iYWN6ecSHIHN0YXR5c3R5a2kgcHJ6ZXN5xYJ1IGRhbnljaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iUHJ6ZWtyb2N6b25vIGxpbWl0IGRhbnljaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJEb3RrbmlqLCBhYnkgem9iYWN6ecSHIHN0YXR5c3R5a2kgcHJ6ZXN5xYJ1IGRhbnljaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iQnJhayB3eW5pa8OzdyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiJabmFqZMW6IG5hIHN0cm9uaWUiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMSB3eW5payI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IHogPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKaW5kZXggNTVmZGQxOC4uZGM3NjJkMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iRmVycmFtZW50YXMgZGUgZGVzZW52b2x2aW1lbnRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bmNpb25hbGlkYWRlcyBhcGVuYXMgbmVjZXNzw6FyaWFzIHBhcmEgcHJvZ3JhbWFkb3JlcyBkZSBhcGxpY2HDp8O1ZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iQXJtYXplbmFtZW50byI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iQWNlZGVyIGFvIGNhcnTDo28gU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkFjZWRlciBhbyBjYXJ0w6NvIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJBY2VkZXIgYW8gY2FydMOjbyBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiJkZXNhY3RpdmFyIG91IG1vZGlmaWNhciBiYXJyYSBkZSBlc3RhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iUGVybWl0ZSDDoCBhcGxpY2HDp8OjbyBkZXNhY3RpdmFyIGEgYmFycmEgZGUgZXN0YWRvIG91IGFkaWNpb25hciBlIHJlbW92ZXIgw61jb25lcyBkbyBzaXN0ZW1hLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiJiYXJyYSBkZSBlc3RhZG8iPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IlBlcm1pdGUgYSB1bWEgYXBsaWNhw6fDo28gbGliZXJ0YXIgZXNwYcOnbyBkZSBhcm1hemVuYW1lbnRvIG5vIHRlbGVmb25lIGVsaW1pbmFuZG8gZmljaGVpcm9zIG5vIGRpcmVjdMOzcmlvIGRhIGNhY2hlIGRhIGFwbGljYcOnw6NvLiBHZXJhbG1lbnRlLCBvIGFjZXNzbyDDqSBtdWl0byBsaW1pdGFkbyBwYXJhIHByb2Nlc3NhbWVudG8gZG8gc2lzdGVtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iTW92ZXIgcmVjdXJzb3MgZGUgYXBsaWNhw6fDtWVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iUGVybWl0ZSBxdWUgdW1hIGFwbGljYcOnw6NvIG1vdmEgcmVjdXJzb3MgZGUgYXBsaWNhw6fDtWVzIGRlIG1laW9zIGludGVybm9zIHBhcmEgbWVpb3MgZXh0ZXJub3MgZSB2aWNlLXZlcnNhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4ibGVyIGRhZG9zIHNlbnPDrXZlaXMgZGUgcmVnaXN0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IlBlcm1pdGUgYSB1bWEgYXBsaWNhw6fDo28gbGVyIGEgcGFydGlyIGRvcyBkaXZlcnNvcyBmaWNoZWlyb3MgZGUgcmVnaXN0byBkbyBzaXN0ZW1hLiBJc3RvIHBlcm1pdGUgZGVzY29icmlyIGluZm9ybWHDp8O1ZXMgZ2VyYWlzIHNvYnJlIGEgZm9ybWEgY29tbyBvIHV0aWxpemFkb3IgdXNhIG8gdGVsZWZvbmUsIHBvZGVuZG8sIGluY2x1c2l2ZSwgaW5jbHVpciBkYWRvcyBwZXNzb2FpcyBvdSBwcml2YWRvcy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJsZXIvZXNjcmV2ZXIgZW0gcmVjdXJzb3MgcHJvcHJpZWRhZGUgZGUgZGlhZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2RpYWdub3N0aWMiIG1zZ2lkPSIzMTIxMjM4MzczOTUxNjM3MDQ5Ij4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBsZXIgZSBlc2NyZXZlciBlbSBxdWFscXVlciByZWN1cnNvIHF1ZSBzZWphIHByb3ByaWVkYWRlIGRvIGdydXBvIGRpYWcuIFBvciBleGVtcGxvLCBmaWNoZWlyb3MgZW0gL2Rldi4gSXN0byBwb2RlIGFmZWN0YXIgcG90ZW5jaWFsbWVudGUgYSBlc3RhYmlsaWRhZGUgZSBhIHNlZ3VyYW7Dp2EgZG8gc2lzdGVtYSBlIGRldmUgc2VyIHV0aWxpemFkbyBBUEVOQVMgcGFyYSBkaWFnbsOzc3RpY29zIGVzcGVjw61maWNvcyBkbyBoYXJkd2FyZSBwZWxvIGZhYnJpY2FudGUgb3UgcGVsbyBvcGVyYWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJhY3RpdmFyIG91IGRlc2FjdGl2YXIgY29tcG9uZW50ZXMgZGEgYXBsaWNhw6fDo28iPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIGNvbmZpZ3VyYXIgbyB0ZWxlZm9uZSBCbHVldG9vdGggbG9jYWwsIGJlbSBjb21vIGRlc2NvYnJpciBlIGVtcGFyZWxoYXIgY29tIGRpc3Bvc2l0aXZvcyByZW1vdG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+ImNyaWFyIGxpZ2HDp8O1ZXMgQmx1ZXRvb3RoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyB2ZXIgYSBjb25maWd1cmHDp8OjbyBkbyB0ZWxlZm9uZSBCbHVldG9vdGggbG9jYWwsIGJlbSBjb21vIGVmZWN0dWFyIGUgYWNlaXRhciBsaWdhw6fDtWVzIGNvbSBkaXNwb3NpdGl2b3MgZW1wYXJlbGhhZG9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJkZXNhY3RpdmFyIGJsb3F1ZWlvIGRlIHRlY2xhcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIGRlc2FjdGl2YXIgbyBibG9xdWVpbyBkZSB0ZWNsYXMgZSBxdWFscXVlciBzZWd1cmFuw6dhIHBvciBwYWxhdnJhLXBhc3NlIGFzc29jaWFkYS4gVW0gZXhlbXBsbyBsZWfDrXRpbW8gw6kgYSBkZXNhY3RpdmHDp8OjbyBkbyBibG9xdWVpbyBkZSB0ZWNsYXMgcGVsbyB0ZWxlZm9uZSBhbyByZWNlYmVyIHVtYSBjaGFtYWRhLCByZWFjdGl2YW5kbywgZW0gc2VndWlkYSwgbyBibG9xdWVpbyBkZSB0ZWNsYXMgYW8gdGVybWluYXIgYSBjaGFtYWRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiJsZXIgZGVmaW5pw6fDtWVzIGRlIHNpbmNyb25pemHDp8OjbyI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIGxlciBxdWFpc3F1ZXIgcGFsYXZyYXMsIG5vbWVzIGUgZXhwcmVzc8O1ZXMgcHJpdmFkYXMgcXVlIG8gdXRpbGl6YWRvciBwb3NzYSB0ZXIgYXJtYXplbmFkbyBubyBkaWNpb27DoXJpbyBkbyB1dGlsaXphZG9yLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+ImVzY3JldmVyIG5vIGRpY2lvbsOhcmlvIGRlZmluaWRvIHBlbG8gdXRpbGl6YWRvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIGVzY3JldmVyIG5vdmFzIHBhbGF2cmFzIG5vIGRpY2lvbsOhcmlvIGRvIHV0aWxpemFkb3IuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiJtb2RpZmljYXIvZWxpbWluYXIgY29udGXDumRvIGRvIGNhcnTDo28gU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9lbGltaW5hciBjb250ZcO6ZG8gZG8gY2FydMOjbyBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiJQZXJtaXRlIHF1ZSB1bWEgYXBsaWNhw6fDo28gZXNjcmV2YSBubyBjYXJ0w6NvIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlBlcm1pdGUgcXVlIHVtYSBhcGxpY2HDp8OjbyBlc2NyZXZhIG5vIGNhcnTDo28gU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXIvZWxpbWluYXIgY29udGXDumRvIGRvIGNhcnTDo28gU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJQZXJtaXRlIHF1ZSB1bWEgYXBsaWNhw6fDo28gZXNjcmV2YSBubyBjYXJ0w6NvIFNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiJhY2VkZXIgYW8gc2lzdGVtYSBkZSBmaWNoZWlyb3MgZGEgY2FjaGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IlBlcm1pdGUgYSB1bWEgYXBsaWNhw6fDo28gbGVyIGUgZXNjcmV2ZXIgbm8gc2lzdGVtYSBkZSBmaWNoZWlyb3MgZGEgY2FjaGUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iTGltaXRhciBwYWxhdnJhLXBhc3NlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IlJlc3RyaW5qYSBvcyB0aXBvcyBkZSBwYWxhdnJhcy1wYXNzZSBxdWUgZXN0w6EgYXV0b3JpemFkbyBhIHV0aWxpemFyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iVmVyIHRlbnRhdGl2YXMgZGUgaW7DrWNpbyBkZSBzZXNzw6NvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+Ik8gbW9uaXRvciBmYWxob3UgYXMgdGVudGF0aXZhcyBkZSBpbmljaWFyIHNlc3PDo28gbm8gZGlzcG9zaXRpdm8gcGFyYSBlZmVjdHVhciBhbGd1bWFzIGFjw6fDtWVzLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+IlJlcG9yIHBhbGF2cmEtcGFzc2UiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4iRm9yY2UgYSBwYWxhdnJhLXBhc3NlIHBhcmEgdW0gbm92byB2YWxvciwgc2VuZG8gbmVjZXNzw6FyaW8gcXVlIG8gYWRtaW5pc3RyYWRvciBsaG8gZm9ybmXDp2EgYW50ZXMgZGUgcG9kZXIgaW5pY2lhciBzZXNzw6NvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iRm9yw6dhciBibG9xdWVpbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IkNvbnRyb2xlIHF1YW5kbyBvIGRpc3Bvc2l0aXZvIMOpIGJsb3F1ZWFkbywgc2VuZG8gbmVjZXNzw6FyaW8gcmVpbnRyb2R1emlyIGEgcmVzcGVjdGl2YSBwYWxhdnJhLXBhc3NlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IkxpbWl0YXIgcGFsYXZyYS1wYXNzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiJSZXN0cmluamEgb3MgdGlwb3MgZGUgcGFsYXZyYXMtcGFzc2UgcXVlIGVzdMOhIGF1dG9yaXphZG8gYSB1dGlsaXphci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJWZXIgdGVudGF0aXZhcyBkZSBpbsOtY2lvIGRlIHNlc3PDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4iTyBtb25pdG9yIGZhbGhvdSBhcyB0ZW50YXRpdmFzIGRlIGluaWNpYXIgc2Vzc8OjbyBubyBkaXNwb3NpdGl2byBwYXJhIGVmZWN0dWFyIGFsZ3VtYXMgYWPDp8O1ZXMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iUmVwb3IgcGFsYXZyYS1wYXNzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjMzMzIxNjc2MDAzMzE3OTk5OTEiPiJGb3JjZSBhIHBhbGF2cmEtcGFzc2UgcGFyYSB1bSBub3ZvIHZhbG9yLCBzZW5kbyBuZWNlc3PDoXJpbyBxdWUgbyBhZG1pbmlzdHJhZG9yIGxobyBmb3JuZcOnYSBhbnRlcyBkZSBwb2RlciBpbmljaWFyIHNlc3PDo28uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiJGb3LDp2FyIGJsb3F1ZWlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHJvbGUgcXVhbmRvIG8gZGlzcG9zaXRpdm8gw6kgYmxvcXVlYWRvLCBzZW5kbyBuZWNlc3PDoXJpbyByZWludHJvZHV6aXIgYSByZXNwZWN0aXZhIHBhbGF2cmEtcGFzc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFwYWdhciB0b2RvcyBvcyBkYWRvcyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iRWZlY3R1ZSB1bWEgcmVwb3Npw6fDo28gZGUgZsOhYnJpY2EsIGVsaW1pbmFuZG8gdG9kb3Mgb3MgZGFkb3Mgc2VtIHF1YWxxdWVyIGNvbmZpcm1hw6fDo28uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJFZmVjdHVlIHVtYSByZXBvc2nDp8OjbyBkZSBmw6FicmljYSwgZWxpbWluYW5kbyB0b2RvcyBvcyBkYWRvcyBzZW0gcXVhbHF1ZXIgY29uZmlybWHDp8Ojby4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiJEZWZpbmlyIG8gcHJveHkgZ2xvYmFsIGRvIGRpc3Bvc2l0aXZvIGEgc2VyIHV0aWxpemFkbyBxdWFuZG8gYSBwb2zDrXRpY2EgZXN0aXZlciBhY3RpdmFkYS4gU8OzIG8gcHJpbWVpcm8gYWRtaW5pc3RyYWRvciBkbyBkaXNwb3NpdGl2byBkZWZpbmUgbyBwcm94eSBnbG9iYWwgZWZlY3Rpdm8uIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUmVzaWTDqm5jaWEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNw7N2ZWwiPC9pdGVtPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJFbXByZWdvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik91dHJvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbmFsaXphZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiJQZXJzb25hbGl6YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVIb21lIiBtc2dpZD0iNjA5MzU5ODE4MTA2OTM1OTI5NSI+IlDDoWdpbmEgaW5pY2lhbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlV29yayIgbXNnaWQ9IjY5MjA3MjU3MzA3OTcwOTkwNDciPiJFbXByZWdvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVPdGhlciIgbXNnaWQ9IjQ0MDg0MzYxNjI5NTAxMTk4NDkiPiJPdXRybyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhdHJhdsOpcyBkbyA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IGF0cmF2w6lzIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlQ3VzdG9tICgyNDczNTgwNTkzMTExNTkwOTQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlSG9tZSAoNjA5MzU5ODE4MTA2OTM1OTI5NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZVdvcmsgKDY5MjA3MjU3MzA3OTcwOTkwNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkludHJvZHV6aXIgY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkludHJvZHV6YSBhIHBhbGF2cmEtcGFzc2UgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW50cm9kdXphIG8gUElOIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJDw7NkaWdvIFBJTiBpbmNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyLCBwcmltYSBNZW51IGUsIGVtIHNlZ3VpZGEsIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmfDqm5jaWEiPC9zdHJpbmc+CkBAIC01NjQsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmVncmVzc2FyIMOgIGNoYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZWN0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iTGFtZW50YW1vcywgdGVudGUgbm92YW1lbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJMYW1lbnRhbW9zLCB0ZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJBIGNhcnJlZ2FyICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJyZWdhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NzgsNiArNTY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+Ik8gY2FydMOjbyBTSU0gZXN0w6EgYmxvcXVlYWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkEgZGVzYmxvcXVlYXIgY2FydMOjbyBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJFZmVjdHVvdSBpbmNvcnJlY3RhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJJbnRyb2R1eml1IGluY29ycmVjdGFtZW50ZSBhIHBhbGF2cmEtcGFzc2UgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkludHJvZHV6aXUgaW5jb3JyZWN0YW1lbnRlIG8gUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iRWZlY3R1b3UgaW5jb3JyZWN0YW1lbnRlIG8gc2V1IHBhZHLDo28gZGUgZGVzYmxvcXVlaW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuIEFww7NzIG91dHJhcyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmFzIHNlbSBzdWNlc3NvLCBzZXItbGhlLcOhIHBlZGlkbyBwYXJhIGRlc2Jsb3F1ZWFyIG8gdGVsZWZvbmUgdXRpbGl6YW5kbyBvIHNldSBpbsOtY2lvIGRlIHNlc3PDo28gbm8gR29vZ2xlLiJcblxuIiBUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkVzcXVlY2V1LXNlIGRvIHBhZHLDo28/Ijwvc3RyaW5nPgpAQCAtNjA2LDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+Ik5hdmVnYXIgcGFyYSBvdXRyYSBww6FnaW5hPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJTZWxlY2Npb25lIE9LIHBhcmEgY29udGludWFyIG91IENhbmNlbGFyIHBhcmEgcGVybWFuZWNlciBuYSBww6FnaW5hIGFjdHVhbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkNvbmZpcm1hciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iU3VnZXN0w6NvOiB0b3F1ZSBkdWFzIHZlemVzIHBhcmEgYXVtZW50YXIgb3UgZGltaW51aXIgbyB6b29tLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ImxlciBoaXN0w7NyaWNvIGUgbWFyY2Fkb3JlcyBkbyBicm93c2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iUGVybWl0ZSBxdWUgYSBhcGxpY2HDp8OjbyBsZWlhIHRvZG9zIG9zIFVSTHMgdmlzaXRhZG9zIHBlbG8gYnJvd3NlciBlIHRvZG9zIG9zIG1hcmNhZG9yZXMgZG8gYnJvd3Nlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJncmF2YXIgaGlzdMOzcmljbyBlIG1hcmNhZG9yZXMgZG8gYnJvd3NlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IlBlcm1pdGUgcXVlIHVtYSBhcGxpY2HDp8OjbyBtb2RpZmlxdWUgbyBoaXN0w7NyaWNvIGUgb3MgbWFyY2Fkb3JlcyBkbyBicm93c2VyIGFybWF6ZW5hZG9zIG5vIHRlbGVmb25lLiBBcyBhcGxpY2HDp8O1ZXMgbWFsaWNpb3NhcyBwb2RlbSB1dGlsaXphciBlc3RhIHBlcm1pc3PDo28gcGFyYSBhcGFnYXIgb3UgbW9kaWZpY2FyIG9zIGRhZG9zIGRvIGJyb3dzZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJNb2RpZmljYXIgcGVybWlzc8O1ZXMgZGUgbG9jYWxpemHDp8OjbyBnZW9ncsOhZmljYSBkbyBOYXZlZ2Fkb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBtb2RpZmljYXIgYXMgcGVybWlzc8O1ZXMgZGUgbG9jYWxpemHDp8OjbyBnZW9ncsOhZmljYSBkbyBOYXZlZ2Fkb3IuIEFzIGFwbGljYcOnw7VlcyBtYWwgaW50ZW5jaW9uYWRhcyBwb2RlbSB1dGlsaXphciBpc3RvIHBhcmEgZW52aWFyIGluZm9ybWHDp8O1ZXMgZGUgbG9jYWxpemHDp8OjbyBwYXJhIFdlYiBzaXRlcyBhcmJpdHLDoXJpb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iUXVlciBxdWUgbyBicm93c2VyIG1lbW9yaXplIGVzdGEgcGFsYXZyYS1wYXNzZT8iPC9zdHJpbmc+CkBAIC03MjYsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjY2lvbmFyIHR1ZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGVjY2lvbmFyIHBhbGF2cmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQ29ydGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJDb2xhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+IlNlbGVjY2lvbmFyIHRleHRvLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlNlbGVjw6fDo28gZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQWRpY2lvbmFyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFvIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iQWPDp8O1ZXMgZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvdWNvIGVzcGHDp28gbGl2cmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJPIGVzcGHDp28gZGUgYXJtYXplbmFtZW50byBkbyB0ZWxlZm9uZSBlc3TDoSBhIGZpY2FyIHJlZHV6aWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQxLDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJDYW5jZWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdGVuw6fDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkEgY2FycmVnYXIuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFjdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iRGVzYWN0aXZhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29uY2x1aXIgYWPDp8OjbyB1dGlsaXphbmRvIjwvc3RyaW5nPgpAQCAtNzU5LDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iRm9yw6dhciBmZWNobyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJSZWxhdMOzcmlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJFc3BlcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWNhw6fDo28gcmVkaXJlY2Npb25hZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gZXN0w6EgYWdvcmEgYSBzZXIgZXhlY3V0YWRvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBmb2kgb3JpZ2luYWxtZW50ZSBpbmljaWFkby4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQSBhcGxpY2HDp8OjbyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIHZpb2xvdSBhIHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG8taW1wb3N0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJPIHByb2Nlc3NvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiB2aW9sb3UgYSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBhdXRvLWltcG9zdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBlbSBleGVjdcOnw6NvIjwvc3RyaW5nPgpAQCAtODA2LDMwICs4MDAsMjUgQEAKICAgICA8c3RyaW5nIG5hbWU9Im5vX3Blcm1pc3Npb25zIiBtc2dpZD0iNzI4MzM1NzcyODIxOTMzODExMiI+Ik7Do28gc8OjbyBuZWNlc3PDoXJpYXMgcGVybWlzc8O1ZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19oaWRlIiBtc2dpZD0iNzI4MzkxNTM5MTMyMDY3NjIyNiI+PGI+Ik9jdWx0YXIiPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iTW9zdHJhciB0dWRvIjwvYj48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IkFybWF6ZW5hbWVudG8gZW0gbWFzc2EgVVNCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iQXJtYXplbmFtZW50byBlbSBtYXNzYSBVU0IgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iTGlnYWRvIGF0cmF2w6lzIGRlIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IkxpZ291IG8gdGVsZWZvbmUgYW8gY29tcHV0YWRvciBhdHJhdsOpcyBkZSBVU0IuIFNlbGVjY2lvbmUgbyBib3TDo28gYWJhaXhvIHNlIHByZXRlbmRlciBjb3BpYXIgZmljaGVpcm9zIGVudHJlIG8gY29tcHV0YWRvciBlIG8gY2FydMOjbyBTRCBkbyBBbmRyb2lkLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iTGlnb3UgbyB0ZWxlZm9uZSBhbyBjb21wdXRhZG9yIGF0cmF2w6lzIGRlIFVTQi4gU2VsZWNjaW9uZSBvIGJvdMOjbyBhYmFpeG8gc2UgcHJldGVuZGVyIGNvcGlhciBmaWNoZWlyb3MgZW50cmUgbyBjb21wdXRhZG9yIGUgbyBjYXJ0w6NvIFNEIGRvIEFuZHJvaWQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJMaWdvdSBvIHRlbGVmb25lIGFvIGNvbXB1dGFkb3IgYXRyYXbDqXMgZGUgVVNCLiBTZWxlY2Npb25lIG8gYm90w6NvIGFiYWl4byBzZSBwcmV0ZW5kZXIgY29waWFyIGZpY2hlaXJvcyBlbnRyZSBvIGNvbXB1dGFkb3IgZSBvIGNhcnTDo28gU0QgZG8gQW5kcm9pZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iQWN0aXZhciBhcm1hemVuYW1lbnRvIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IkV4aXN0ZSB1bSBwcm9ibGVtYSBhbyB1dGlsaXphciBvIGNhcnTDo28gU0QgcGFyYSBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkV4aXN0ZSB1bSBwcm9ibGVtYSBhbyB1dGlsaXphciBvIGNhcnTDo28gU0QgcGFyYSBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkV4aXN0ZSB1bSBwcm9ibGVtYSBhbyB1dGlsaXphciBvIGNhcnTDo28gU0QgcGFyYSBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iTGlnYWRvIGF0cmF2w6lzIGRlIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IlNlbGVjY2lvbmUgcGFyYSBjb3BpYXIgZmljaGVpcm8gcGFyYS9kbyBzZXUgY29tcHV0YWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJEZXNhY3RpdmFyIGFybWF6ZW5hbWVudG8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJPcHRlIHBvciBkZXNhY3RpdmFyIG8gYXJtYXplbmFtZW50byBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+Ik8gYXJtYXplbmFtZW50byBVU0IgZXN0w6EgYSBzZXIgdXRpbGl6YWRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiJBbnRlcyBkZSBkZXNhY3RpdmFyIG8gYXJtYXplbmFtZW50byBVU0IsIGNlcnRpZmlxdWUtc2UgZGUgcXVlIGRlc2luc3RhbG91IChcImVqZWN0b3VcIikgbyBjYXJ0w6NvIFNEIGRvIEFuZHJvaWQgZG8gY29tcHV0YWRvci4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iQW50ZXMgZGUgZGVzYWN0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLCBjZXJ0aWZpcXVlLXNlIGRlIHF1ZSBkZXNpbnN0YWxvdSAoXCJlamVjdG91XCIpIG8gY2FydMOjbyBTRCBkbyBBbmRyb2lkIGRvIGNvbXB1dGFkb3IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IkFudGVzIGRlIGRlc2FjdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiwgY2VydGlmaXF1ZS1zZSBkZSBxdWUgZGVzaW5zdGFsb3UgKFwiZWplY3RvdVwiKSBvIGNhcnTDo28gU0QgZG8gQW5kcm9pZCBkbyBjb21wdXRhZG9yLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+IkRlc2FjdGl2YXIgYXJtYXplbmFtZW50byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJPY29ycmV1IHVtIHByb2JsZW1hIGFvIGRlc2FjdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQi4gQ29uZmlybWUgc2UgZGVzaW5zdGFsb3UgbyBhbmZpdHJpw6NvIFVTQiBlLCBlbSBzZWd1aWRhLCB0ZW50ZSBub3ZhbWVudGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iQWN0aXZhciBhcm1hemVuYW1lbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IlNlIGFjdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiwgYWxndW1hcyBhcGxpY2HDp8O1ZXMgcXVlIGVzdGl2ZXIgYSB1dGlsaXphciBzZXLDo28gcGFyYWRhcyBlIHBvZGVyw6NvIGZpY2FyIGluZGlzcG9uw612ZWlzIGF0w6kgZGVzYWN0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiJGYWxoYSBuYSBvcGVyYcOnw6NvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0YXIgY2FydMOjbyBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRhciBjYXJ0w6NvIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IlRlbSBhIGNlcnRlemEgZGUgcXVlIHByZXRlbmRlIGZvcm1hdGFyIG8gY2FydMOjbyBTRD8gUGVyZGVyLXNlLcOjbyB0b2RvcyBvcyBkYWRvcyBubyBjYXJ0w6NvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlRlbSBhIGNlcnRlemEgZGUgcXVlIHByZXRlbmRlIGZvcm1hdGFyIG8gY2FydMOjbyBTRD8gUGVyZGVyLXNlLcOjbyB0b2RvcyBvcyBkYWRvcyBubyBjYXJ0w6NvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRhciBjYXJ0w6NvIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iVGVtIGEgY2VydGV6YSBkZSBxdWUgcHJldGVuZGUgZm9ybWF0YXIgbyBjYXJ0w6NvIFNEPyBQZXJkZXItc2Utw6NvIHRvZG9zIG9zIGRhZG9zIG5vIGNhcnTDo28uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJEZXB1cmHDp8OjbyBVU0IgbGlnYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJTZWxlY2Npb25lIHBhcmEgZGVzYWN0aXZhciBkZXB1cmHDp8OjbyBVU0IuIjwvc3RyaW5nPgpAQCAtODM3LDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4iY2FuZGlkYXRvcyI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJBIHByZXBhcmFyIGNhcnTDo28gU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IkEgcHJlcGFyYXIgY2FydMOjbyBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iQSBwcmVwYXJhciBjYXJ0w6NvIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IkEgdmVyaWZpY2FyIGEgcHJlc2Vuw6dhIGRlIGVycm9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJDYXJ0w6NvIFNEIHZhemlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iQ2FydMOjbyBTRCB2YXppbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJPIGNhcnTDo28gU0QgZXN0w6EgdmF6aW8gb3UgYSB1dGlsaXphciB1bSBzaXN0ZW1hIGRlIGZpY2hlaXJvcyBuw6NvIHN1cG9ydGFkby4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJDYXJ0w6NvIFNEIHZhemlvIG91IHNpc3RlbWEgZGUgZmljaGVpcm9zIG7Do28gc3Vwb3J0YWRvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IkNhcnTDo28gU0QgZGFuaWZpY2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQ2FydMOjbyBTRCBkYW5pZmljYWRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJPIGNhcnTDo28gU0QgZXN0w6EgZGFuaWZpY2Fkby4gUG9kZXLDoSBzZXIgbmVjZXNzw6FyaW8gcmVmb3JtYXRhciBvIGNhcnTDo28uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkNhcnTDo28gU0QgZGFuaWZpY2Fkby4gUG9kZXLDoSBzZXIgbmVjZXNzw6FyaW8gcmVmb3JtYXTDoS1sby4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IkNhcnTDo28gU0QgcmVtb3ZpZG8gZGUgZm9ybWEgaW5lc3BlcmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJDYXJ0w6NvIFNEIHJlbW92aWRvIGRlIGZvcm1hIGluZXNwZXJhZGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4iRGVzbW9udGUgbyBjYXJ0w6NvIFNEIGFudGVzIGRlIHJldGlyw6EtbG8gcGFyYSBldml0YXIgYSBwZXJkYSBkZSBkYWRvcy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEZXNtb250ZSBvIGNhcnTDo28gU0QgYW50ZXMgZGUgcmV0aXLDoS1sbyBwYXJhIGV2aXRhciBhIHBlcmRhIGRlIGRhZG9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iw4kgc2VndXJvIHJldGlyYXIgbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iw4kgc2VndXJvIHJldGlyYXIgbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iw4kgcG9zc8OtdmVsIHJlbW92ZXIgYWdvcmEgbyBjYXJ0w6NvIFNEIGVtIHNlZ3VyYW7Dp2EuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlBvZGUgcmVtb3ZlciBvIGNhcnTDo28gU0QgY29tIHNlZ3VyYW7Dp2EuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJDYXJ0w6NvIFNEIHJlbW92aWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkNhcnTDo28gU0QgcmVtb3ZpZG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iTyBjYXJ0w6NvIFNEIGZvaSByZW1vdmlkby4gSW50cm9kdXphIHVtIG5vdm8gY2FydMOjbyBTRCBwYXJhIGF1bWVudGFyIGEgY2FwYWNpZGFkZSBkZSBhcm1hemVuYW1lbnRvIGRvIGRpc3Bvc2l0aXZvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IkNhcnTDo28gU0QgcmVtb3ZpZG8uIEluc2lyYSB1bSBub3ZvIGNhcnTDo28uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iQ2FydMOjbyBTRCB2YXppbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IkNhcnTDo28gU0QgdmF6aW8gb3Ugc2lzdGVtYSBkZSBmaWNoZWlyb3MgbsOjbyBzdXBvcnRhZG8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJDYXJ0w6NvIFNEIGRhbmlmaWNhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iQ2FydMOjbyBTRCBkYW5pZmljYWRvLiBQb2RlcsOhIHNlciBuZWNlc3PDoXJpbyByZWZvcm1hdMOhLWxvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJDYXJ0w6NvIFNEIHJlbW92aWRvIGRlIGZvcm1hIGluZXNwZXJhZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEZXNtb250ZSBvIGNhcnTDo28gU0QgYW50ZXMgZGUgcmV0aXLDoS1sbyBwYXJhIGV2aXRhciBhIHBlcmRhIGRlIGRhZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IsOJIHNlZ3VybyByZXRpcmFyIG8gY2FydMOjbyBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJQb2RlIHJlbW92ZXIgbyBjYXJ0w6NvIFNEIGNvbSBzZWd1cmFuw6dhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJDYXJ0w6NvIFNEIHJlbW92aWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iQ2FydMOjbyBTRCByZW1vdmlkby4gSW5zaXJhIHVtIG5vdm8gY2FydMOjby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+Ik5lbmh1bWEgYWN0aXZpZGFkZSBjb3JyZXNwb25kZW50ZSBlbmNvbnRyYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+ImFjdHVhbGl6YXIgZXN0YXTDrXN0aWNhcyBkZSB1dGlsaXphw6fDo28gZGUgY29tcG9uZW50ZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iUGVybWl0ZSBhIG1vZGlmaWNhw6fDo28gZGUgZXN0YXTDrXN0aWNhcyBkZSB1dGlsaXphw6fDo28gZGUgY29tcG9uZW50ZXMgcmVjb2xoaWRhcy4gTsOjbyBzZSBkZXN0aW5hIGEgdXRpbGl6YcOnw6NvIHBvciBhcGxpY2HDp8O1ZXMgbm9ybWFpcy4iPC9zdHJpbmc+CkBAIC04OTQsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGJhc2VhZGEgZW0gY2hhdmUgcHLDqS0gcGFydGlsaGFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJWUE4gTDJUUC9JUFNlYyBiYXNlYWRhIGVtIGNlcnRpZmljYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iRXNjb2xoZXIgZmljaGVpcm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJOw6NvIGZvaSBzZWxlY2Npb25hZG8gbmVuaHVtIGZpY2hlaXJvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVwb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Ik1vZG8gYXV0b23Ds3ZlbCBhY3RpdmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY2Npb25hciBwYXJhIHNhaXIgZG8gbW9kbyBhdXRvbcOzdmVsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJMaWdhw6fDo28gcG9udG8gYSBwb250byBvdSBob3RzcG90IGFjdGl2b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb2NhciBwYXJhIGNvbmZpZ3VyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJBbnRlcmlvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlNlZ3VpbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iSWdub3JhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlV0aWxpemHDp8OjbyBlbGV2YWRhIGRlIGRhZG9zIG3Ds3ZlaXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvcXVlIHBhcmEgc2FiZXIgbWFpcyBzb2JyZSBhIHV0aWxpemHDp8OjbyBkZSBkYWRvcyBtw7N2ZWlzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMaW1pdGUgZGUgZGFkb3MgbcOzdmVpcyBleGNlZGlkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUb3F1ZSBwYXJhIHNhYmVyIG1haXMgc29icmUgYSB1dGlsaXphw6fDo28gZGUgZGFkb3MgbcOzdmVpcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iU2VtIGNvcnJlc3BvbmTDqm5jaWFzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IkxvY2FsaXphciBuYSBww6FnaW5hIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgY29ycmVzcG9uZMOqbmNpYSI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IGRlIDx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAppbmRleCBkNWUxY2EwLi5lZTAzOGMzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iRmVycmFtZW50YXMgZGUgZGVzZW52b2x2aW1lbnRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IlJlY3Vyc29zIG5lY2Vzc8OhcmlvcyBhcGVuYXMgcGFyYSBkZXNlbnZvbHZlZG9yZXMgZGUgYXBsaWNhdGl2by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiJBcm1hemVuYW1lbnRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJBY2Vzc2FyIG8gY2FydMOjbyBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iQWNlc3NhciBvIGNhcnTDo28gU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkFjZXNzYXIgbyBjYXJ0w6NvIFNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+ImRlc2F0aXZhciBvdSBtb2RpZmljYXIgYSBiYXJyYSBkZSBzdGF0dXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iUGVybWl0ZSBxdWUgbyBhcGxpY2F0aXZvIGRlc2F0aXZlIGEgYmFycmEgZGUgc3RhdHVzIG91IGFkaWNpb25lIGUgcmVtb3ZhIMOtY29uZXMgZG8gc2lzdGVtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4iYmFycmEgZGUgc3RhdHVzIjwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGxpYmVyZSBvIGVzcGHDp28gZGUgYXJtYXplbmFtZW50byBkbyB0ZWxlZm9uZSBleGNsdWluZG8gYXJxdWl2b3Mgbm8gZGlyZXTDs3JpbyBkZSBjYWNoZSBkbyBhcGxpY2F0aXZvLiBPIGFjZXNzbyDDqSBub3JtYWxtZW50ZSBtdWl0byByZXN0cml0byBwYXJhIG8gcHJvY2Vzc28gZG8gc2lzdGVtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iTW92ZXIgcmVjdXJzb3MgZG8gYXBsaWNhdGl2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gbW92YSBvcyByZWN1cnNvcyBkbyBhcGxpY2F0aXZvIGRhIG3DrWRpYSBpbnRlcm5hIHBhcmEgYSBleHRlcm5hIGUgdmljZS12ZXJzYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+ImxlciBkYWRvcyBkZSByZWdpc3RybyBkZSBpbmZvcm1hw6fDtWVzIGNvbmZpZGVuY2lhaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgbXNnaWQ9Ijg4OTY0NDk0Mzc0NjQ4Njc3NjYiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGxlaWEgb3MgZGl2ZXJzb3MgYXJxdWl2b3MgZGUgcmVnaXN0cm8gZG8gc2lzdGVtYS4gSXNzbyBwZXJtaXRlIHF1ZSBlbGUgZGVzY3VicmEgaW5mb3JtYcOnw7VlcyBnZXJhaXMgc29icmUgbyBxdWUgdm9jw6ogZXN0w6EgZmF6ZW5kbyBjb20gbyB0ZWxlZm9uZSwgaW5jbHVzaXZlIHBvc3PDrXZlaXMgaW5mb3JtYcOnw7VlcyBwZXNzb2FpcyBvdSBwcml2YWRhcy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJsZXIvZ3JhdmFyIGVtIHJlY3Vyc29zIHBlcnRlbmNlbnRlcyBhbyBkaWFnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGxlaWEgZSBncmF2ZSBlbSBxdWFscXVlciByZWN1cnNvIHF1ZSBwZXJ0ZW7Dp2EgYW8gZ3J1cG8gZGUgZGlhZ27Ds3N0aWNvczsgcG9yIGV4ZW1wbG8sIGFycXVpdm9zIGVtIC9kZXYuIElzc28gcG9zc2l2ZWxtZW50ZSBwb2RlIGFmZXRhciBhIGVzdGFiaWxpZGFkZSBlIGEgc2VndXJhbsOnYSBkbyBzaXN0ZW1hLiBJc3NvIGRldmUgc2VyIHVzYWRvIEFQRU5BUyBwYXJhIGRpYWduw7NzdGljb3MgZXNwZWPDrWZpY29zIGRvIGhhcmR3YXJlIHJlYWxpemFkb3MgcGVsbyBmYWJyaWNhbnRlIG91IHBlbG8gb3BlcmFkb3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iYXRpdmFyIG91IGRlc2F0aXZhciBvcyBjb21wb25lbnRlcyBkbyBhcGxpY2F0aXZvIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byBjb25maWd1cmUgbyB0ZWxlZm9uZSBCbHVldG9vdGggbG9jYWwsIGRlc2N1YnJhIGUgcGFyZWllIGNvbSBkaXNwb3NpdGl2b3MgcmVtb3Rvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JsdWV0b290aCIgbXNnaWQ9IjgzNjEwMzg3MDc4NTcwMTg3MzIiPiJjcmlhciBjb25leMO1ZXMgQmx1ZXRvb3RoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byB2ZWphIGEgY29uZmlndXJhw6fDo28gZG8gdGVsZWZvbmUgQmx1ZXRvb3RoIGxvY2FsIGUgcXVlIHBvc3NhIGZhemVyIGUgYWNlaXRhciBjb25leMO1ZXMgY29tIGRpc3Bvc2l0aXZvcyBwYXJlYWRvcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iZGVzYXRpdmFyIG8gYmxvcXVlaW8gZGUgdGVjbGFzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gZGVzYXRpdmUgbyBibG9xdWVpbyBkZSB0ZWNsYXMgZSBxdWFscXVlciBzZWd1cmFuw6dhIHBvciBzZW5oYSBhc3NvY2lhZGEuIFVtIGV4ZW1wbG8gbGVnw610aW1vIGRpc3NvIMOpIGEgZGVzYXRpdmHDp8OjbyBkbyBibG9xdWVpbyBkZSB0ZWNsYXMgcGVsbyB0ZWxlZm9uZSBhbyByZWNlYmVyIHVtYSBjaGFtYWRhIGUgYSByZWF0aXZhw6fDo28gZG8gYmxvcXVlaW8gcXVhbmRvIGEgY2hhbWFkYSDDqSBmaW5hbGl6YWRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiJsZXIgYXMgY29uZmlndXJhw6fDtWVzIGRlIHNpbmNyb25pemHDp8OjbyI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGxlaWEgcXVhaXNxdWVyIHBhbGF2cmFzLCBub21lcyBlIGZyYXNlcyBwYXJ0aWN1bGFyZXMgYXJtYXplbmFkb3MgcGVsbyB1c3XDoXJpbyBubyBkaWNpb27DoXJpbyBkbyB1c3XDoXJpby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiJncmF2YXIgbm8gZGljaW9uw6FyaW8gZGVmaW5pZG8gcGVsbyB1c3XDoXJpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGdyYXZlIG5vdmFzIHBhbGF2cmFzIG5vIGRpY2lvbsOhcmlvIGRvIHVzdcOhcmlvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4ibW9kaWZpY2FyL2V4Y2x1aXIgY29udGXDumRvIGRvIGNhcnTDo28gU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9leGNsdWlyIGNvbnRlw7pkbyBkbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gZ3JhdmUgbm8gY2FydMOjbyBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGdyYXZlIG5vIGNhcnTDo28gU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXIvZXhjbHVpciBjb250ZcO6ZG8gZG8gY2FydMOjbyBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gZ3JhdmUgbm8gY2FydMOjbyBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iYWNlc3NhciBvIHNpc3RlbWEgZGUgYXJxdWl2b3MgZGUgY2FjaGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gbGVpYSBlIGdyYXZlIG5vIHNpc3RlbWEgZGUgYXJxdWl2b3MgZGUgY2FjaGUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iTGltaXRhciBzZW5oYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiJSZXN0cmluZ2Ugb3MgdGlwb3MgZGUgc2VuaGEgcXVlIHZvY8OqIHRlbSBwZXJtaXNzw6NvIGRlIHVzYXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiJFeGliaXIgdGVudGF0aXZhcyBkZSBsb2dpbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJNb25pdG9yYSBhcyB0ZW50YXRpdmFzIG1hbHN1Y2VkaWRhcyBkZSBsb2dpbiBubyBhcGFyZWxobyBwYXJhIGV4ZWN1dGFyIGFsZ3VtYSBhw6fDo28uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4iUmVkZWZpbmlyIHNlbmhhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IkZvcsOnYSBhIHN1YSBzZW5oYSBwYXJhIHVtIG5vdm8gdmFsb3IsIGV4aWdpbmRvIHF1ZSBvIGFkbWluaXN0cmFkb3IgYSBmb3JuZcOnYSBhbnRlcyBxdWUgdm9jw6ogcG9zc2EgZmF6ZXIgbG9naW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJGb3LDp2FyIGJsb3F1ZWlvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iQ29udHJvbGEgbyBibG9xdWVpbyBkbyBhcGFyZWxobywgZXhpZ2luZG8gcXVlIGEgc2VuaGEgc2VqYSBkaWdpdGFkYSBub3ZhbWVudGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iTGltaXRhciBzZW5oYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiJSZXN0cmluZ2Ugb3MgdGlwb3MgZGUgc2VuaGEgcXVlIHZvY8OqIHRlbSBwZXJtaXNzw6NvIGRlIHVzYXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4iRXhpYmlyIHRlbnRhdGl2YXMgZGUgbG9naW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4iTW9uaXRvcmEgYXMgdGVudGF0aXZhcyBtYWxzdWNlZGlkYXMgZGUgbG9naW4gbm8gYXBhcmVsaG8gcGFyYSBleGVjdXRhciBhbGd1bWEgYcOnw6NvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IlJlZGVmaW5pciBzZW5oYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjMzMzIxNjc2MDAzMzE3OTk5OTEiPiJGb3LDp2EgYSBzdWEgc2VuaGEgcGFyYSB1bSBub3ZvIHZhbG9yLCBleGlnaW5kbyBxdWUgbyBhZG1pbmlzdHJhZG9yIGEgZm9ybmXDp2EgYW50ZXMgcXVlIHZvY8OqIHBvc3NhIGZhemVyIGxvZ2luLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iRm9yw6dhciBibG9xdWVpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xhIG8gYmxvcXVlaW8gZG8gYXBhcmVsaG8sIGV4aWdpbmRvIHF1ZSBhIHNlbmhhIHNlamEgZGlnaXRhZGEgbm92YW1lbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBcGFnYXIgdG9kb3Mgb3MgZGFkb3MiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IkV4ZWN1dGUgdW1hIHJlZGVmaW5pw6fDo28gZGUgZsOhYnJpY2EsIGV4Y2x1aW5kbyB0b2RvcyBvcyBzZXVzIGRhZG9zIHNlbSBxdWFscXVlciBjb25maXJtYcOnw6NvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRXhlY3V0ZSB1bWEgcmVkZWZpbmnDp8OjbyBkZSBmw6FicmljYSwgZXhjbHVpbmRvIHRvZG9zIG9zIHNldXMgZGFkb3Mgc2VtIHF1YWxxdWVyIGNvbmZpcm1hw6fDo28uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iQ29uZmlndXJhIG8gcHJveHkgZ2xvYmFsIGRvIGRpc3Bvc2l0aXZvIHBhcmEgc2VyIHVzYWRvIGVucXVhbnRvIGEgcG9sw610aWNhIGVzdGl2ZXIgYXRpdmFkYS4gU29tZW50ZSBvIHByaW1laXJvIGFkbWluaXN0cmFkb3IgZG8gZGlzcG9zaXRpdm8gcG9kZSBjb25maWd1cmFyIHVtIHZlcmRhZGVpcm8gcHJveHkgZ2xvYmFsLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlJlc2lkZW5jaWFsIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iQ2VsdWxhciI8L2l0ZW0+CkBAIC01NDQsMTQgKzUzMCwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkNvbWVyY2lhbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJPdXRyb3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlQ3VzdG9tIiBtc2dpZD0iMjQ3MzU4MDU5MzExMTU5MDk0NSI+IlBlcnNvbmFsaXphZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUhvbWUiIG1zZ2lkPSI2MDkzNTk4MTgxMDY5MzU5Mjk1Ij4iUMOhZ2luYSBpbmljaWFsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+IkNvbWVyY2lhbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlT3RoZXIiIG1zZ2lkPSI0NDA4NDM2MTYyOTUwMTE5ODQ5Ij4iT3V0cm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InBvciBtZWlvIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlQ3VzdG9tICgyNDczNTgwNTkzMTExNTkwOTQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlSG9tZSAoNjA5MzU5ODE4MTA2OTM1OTI5NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZVdvcmsgKDY5MjA3MjU3MzA3OTcwOTkwNDcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkRpZ2l0ZSBvIGPDs2RpZ28gUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJEaWdpdGUgYSBzZW5oYSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJEaWdpdGUgbyBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkPDs2RpZ28gUElOIGluY29ycmV0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUGFyYSBkZXNibG9xdWVhciwgcHJlc3Npb25lIE1lbnUgZSwgZW0gc2VndWlkYSwgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO6bWVybyBkZSBlbWVyZ8OqbmNpYSI8L3N0cmluZz4KQEAgLTU2NCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZXRvcm5hciDDoCBjaGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmV0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iVGVudGUgbm92YW1lbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJUZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDYXJyZWdhbmRvICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJyZWdhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NzgsNiArNTY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+Ik8gY2FydMOjbyBTSU0gZXN0w6EgYmxvcXVlYWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkRlc2Jsb3F1ZWFuZG8gbyBjYXJ0w6NvIFNJTeKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlZvY8OqIGRlc2VuaG91IGluY29ycmV0YW1lbnRlIG8gc2V1IHBhZHLDo28gZGUgZGVzYmxvcXVlaW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWb2PDqiBpbnNlcml1IGluY29ycmV0YW1lbnRlIGEgc3VhIHNlbmhhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlZvY8OqIGRpZ2l0b3UgaW5jb3JyZXRhbWVudGUgbyBzZXUgUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJWb2PDqiBkZXNlbmhvdSBvIHNldSBwYWRyw6NvIGRlIGRlc2Jsb3F1ZWlvIGluY29ycmV0YW1lbnRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiBNYWlzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2YXMgaW5jb3JyZXRhcyBlIHZvY8OqIHJlY2ViZXLDoSB1bWEgc29saWNpdGHDp8OjbyBwYXJhIGRlc2Jsb3F1ZWFyIG8gc2V1IHRlbGVmb25lIHVzYW5kbyBvIHNldSBsb2dpbiBkbyBHb29nbGUuIlxuXG4iIFRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkVzcXVlY2V1IG8gcGFkcsOjbz8iPC9zdHJpbmc+CkBAIC02MDYsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4iRGVzZWphIHNhaXIgZGVzdGEgcMOhZ2luYT8iXG5cbiI8eGxpZmY6ZyBpZD0iTUVTU0FHRSI+JXM8L3hsaWZmOmc+IlxuXG4iU2VsZWNpb25lIE9LIHBhcmEgY29udGludWFyIG91IENhbmNlbGFyIHBhcmEgcGVybWFuZWNlciBuYSBww6FnaW5hIGF0dWFsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4iQ29uZmlybWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiJEaWNhOiB0b3F1ZSBkdWFzIHZlemVzIHBhcmEgYXVtZW50YXIgZSBkaW1pbnVpciBvIHpvb20uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4ibGVyIGhpc3TDs3JpY28gZSBmYXZvcml0b3MgZG8gTmF2ZWdhZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iUGVybWl0ZSBxdWUgbyBhcGxpY2F0aXZvIGxlaWEgdG9kb3Mgb3MgVVJMcyB2aXNpdGFkb3MgcGVsbyBOYXZlZ2Fkb3IgZSB0b2RvcyBvcyBmYXZvcml0b3MgZG8gTmF2ZWdhZG9yLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+ImdyYXZhciBoaXN0w7NyaWNvIGUgZmF2b3JpdG9zIGRvIE5hdmVnYWRvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gbW9kaWZpcXVlIG8gaGlzdMOzcmljbyBvdSBvcyBmYXZvcml0b3MgZG8gTmF2ZWdhZG9yIGFybWF6ZW5hZG9zIG5vIHNldSB0ZWxlZm9uZS4gQXBsaWNhdGl2b3MgbWFsaWNpb3NvcyBwb2RlbSB1c2FyIGlzc28gcGFyYSBhcGFnYXIgb3UgbW9kaWZpY2FyIG9zIGRhZG9zIGRvIHNldSBOYXZlZ2Fkb3IuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJNb2RpZmlxdWUgYXMgcGVybWlzc8O1ZXMgZGUgZ2VvbG9jYWxpemHDp8OjbyBkbyBzZXUgbmF2ZWdhZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gbW9kaWZpcXVlIGFzIHBlcm1pc3PDtWVzIGRlIGdlb2xvY2FsaXphw6fDo28gZG8gbmF2ZWdhZG9yLiBBcGxpY2F0aXZvcyBtYWxpY2lvc29zIHBvZGVtIHVzYXIgaXNzbyBwYXJhIHBlcm1pdGlyIG8gZW52aW8gZGUgaW5mb3JtYcOnw7VlcyBkZSBsb2NhbGl6YcOnw6NvIGEgc2l0ZXMgYXJiaXRyw6FyaW9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IkRlc2VqYSBxdWUgbyBuYXZlZ2Fkb3IgbGVtYnJlIGRlc3RhIHNlbmhhPyI8L3N0cmluZz4KQEAgLTY2OSw3ICs2NTksNyBAQAogICA8L3BsdXJhbHM+CiAgIDxwbHVyYWxzIG5hbWU9ImFiYnJldl9udW1fc2Vjb25kc19hZ28iPgogICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSIxODQ5MDM2ODQwMjAwMDY5MTE4Ij4iMSBzZWcuIGF0csOhcyI8L2l0ZW0+Ci0gICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iMzY5OTE2OTM2NjY1MDkzMDQxNSI+Ijx4bGlmZjpnIGlkPSJDT1VOVCI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zICAgYXRyw6FzIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSIzNjk5MTY5MzY2NjUwOTMwNDE1Ij4iPHhsaWZmOmcgaWQ9IkNPVU5UIj4lZDwveGxpZmY6Zz4gc2VndW5kb3NcbiAgYXRyw6FzIjwvaXRlbT4KICAgPC9wbHVyYWxzPgogICA8cGx1cmFscyBuYW1lPSJhYmJyZXZfbnVtX21pbnV0ZXNfYWdvIj4KICAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iNjM2MTQ5MDE0NzExMzg3MTU0NSI+IjEgbWludXRvIGF0csOhcyI8L2l0ZW0+CkBAIC03MjYsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjaW9uYXIgdHVkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iU2VsZWNpb25hciBwYWxhdnJhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IlJlY29ydGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJDb2xhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+IlNlbGVjaW9uYXIgdGV4dG8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iU2VsZcOnw6NvIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTcOpdG9kbyBkZSBlbnRyYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFkaWNpb25hciBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbyBkaWNpb27DoXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkaXRhciB0ZXh0byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+IkHDp8O1ZXMgZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvdWNvIGVzcGHDp28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJPIGVzcGHDp28gZGUgYXJtYXplbmFtZW50byBkbyB0ZWxlZm9uZSBlc3TDoSBmaWNhbmRvIGJhaXhvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQxLDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJDYW5jZWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdGVuw6fDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNhcnJlZ2FuZG8uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFUSVZBRE8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJERVNBVElWQURPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb21wbGV0ZSBhIGHDp8OjbyB1c2FuZG8iPC9zdHJpbmc+CkBAIC03NTksOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJGb3LDp2FyIGZlY2hhbWVudG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iSW5mb3JtYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IkFndWFyZGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWNhdGl2byByZWRpcmVjaW9uYWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IG7Do28gZXN0w6EgZW0gZXhlY3XDp8Ojby4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gZm9pIGluaWNpYWRvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJPIGFwbGljYXRpdm8gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSB2aW9sb3UgYSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBpbXBvc3RhIGF1dG9tYXRpY2FtZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJPIHByb2Nlc3NvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiB2aW9sb3UgYSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBpbXBvc3RhIGF1dG9tYXRpY2FtZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGVtIGV4ZWN1w6fDo28iPC9zdHJpbmc+CkBAIC04MDgsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iTW9zdHJhciB0b2RhcyI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjIzOTkyODk5OTk2MDg5MDA0NDMiPiJBcm1hemVuYW1lbnRvIFVTQiBlbSBtYXNzYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IkNvbmVjdGFkbyBwb3IgVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4iVm9jw6ogY29uZWN0b3UgbyB0ZWxlZm9uZSBhbyBjb21wdXRhZG9yIHZpYSBVU0IuIFNlbGVjaW9uZSBvIGJvdMOjbyBhYmFpeG8gc2UgcXVpc2VyIGNvcGlhciBhcnF1aXZvcyBlbnRyZSBvIGNvbXB1dGFkb3IgZSBvIGNhcnTDo28gU0QgZG8gc2V1IEFuZHJvaWQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJWb2PDqiBjb25lY3RvdSBvIHRlbGVmb25lIGFvIGNvbXB1dGFkb3IgdmlhIFVTQi4gU2VsZWNpb25lIG8gYm90w6NvIGFiYWl4byBzZSBxdWlzZXIgY29waWFyIGFycXVpdm9zIGVudHJlIG8gY29tcHV0YWRvciBlIG8gY2FydMOjbyBTRCBkbyBzZXUgQW5kcm9pZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IlZvY8OqIGNvbmVjdG91IG8gdGVsZWZvbmUgYW8gY29tcHV0YWRvciB2aWEgVVNCLiBTZWxlY2lvbmUgbyBib3TDo28gYWJhaXhvIHNlIHF1aXNlciBjb3BpYXIgYXJxdWl2b3MgZW50cmUgbyBjb21wdXRhZG9yIGUgbyBjYXJ0w6NvIFNEIGRvIHNldSBBbmRyb2lkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiJBdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IkjDoSB1bSBwcm9ibGVtYSBjb20gbyB1c28gZG8gc2V1IGNhcnTDo28gU0QgcGFyYSBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkjDoSB1bSBwcm9ibGVtYSBjb20gbyB1c28gZG8gc2V1IGNhcnTDo28gU0QgcGFyYSBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkjDoSB1bSBwcm9ibGVtYSBjb20gbyB1c28gZG8gc2V1IGNhcnTDo28gU0QgcGFyYSBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iQ29uZWN0YWRvIHBvciBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJTZWxlY2lvbmUgcGFyYSBjb3BpYXIgYXJxdWl2b3MgcGFyYS9kbyBzZXUgY29tcHV0YWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJEZXNhdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iU2VsZWNpb25lIHBhcmEgZGVzYXRpdmFyIG8gYXJtYXplbmFtZW50byBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IkFybWF6ZW5hbWVudG8gVVNCIGVtIHVzbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iQW50ZXMgZGUgZGVzYXRpdmFyIG8gYXJtYXplbmFtZW50byBVU0IsIHZlcmlmaXF1ZSBzZSBkZXNjb25lY3RvdSAo4oCcZWpldG914oCdKSBvIGNhcnTDo28gU0QgZG8gQW5kcm9pZCBkbyBjb21wdXRhZG9yLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJBbnRlcyBkZSBkZXNhdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiwgdmVyaWZpcXVlIHNlIGRlc2NvbmVjdG91ICjigJxlamV0b3XigJ0pIG8gY2FydMOjbyBTRCBkbyBBbmRyb2lkIGRvIGNvbXB1dGFkb3IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IkFudGVzIGRlIGRlc2F0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLCB2ZXJpZmlxdWUgc2UgZGVzY29uZWN0b3UgKOKAnGVqZXRvdeKAnSkgbyBjYXJ0w6NvIFNEIGRvIEFuZHJvaWQgZG8gY29tcHV0YWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJEZXNhdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IkhvdXZlIHVtIHByb2JsZW1hIGFvIGRlc2F0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLiBWZXJpZmlxdWUgc2UgZGVzY29uZWN0b3UgbyBob3N0IFVTQiBlIHRlbnRlIG5vdmFtZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJBdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IlNlIHZvY8OqIGF0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLCBhbGd1bnMgYXBsaWNhdGl2b3MgcXVlIGVzdMOjbyBlbSB1c28gc2Vyw6NvIGludGVycm9tcGlkb3MgZSBwb2RlcsOjbyBuw6NvIGVzdGFyIGRpc3BvbsOtdmVpcyBhdMOpIHZvY8OqIGRlc2F0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiJGYWxoYSBkZSBvcGVyYcOnw6NvIGRlIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0YXIgY2FydMOjbyBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRhciBjYXJ0w6NvIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IlRlbSBjZXJ0ZXphIGRlIHF1ZSBkZXNlamEgZm9ybWF0YXIgbyBjYXJ0w6NvIFNEPyBUb2RvcyBvcyBkYWRvcyBubyBzZXUgY2FydMOjbyBzZXLDo28gcGVyZGlkb3MuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iVGVtIGNlcnRlemEgZGUgcXVlIGRlc2VqYSBmb3JtYXRhciBvIGNhcnTDo28gU0Q/IFRvZG9zIG9zIGRhZG9zIG5vIHNldSBjYXJ0w6NvIHNlcsOjbyBwZXJkaWRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybWF0YXIgY2FydMOjbyBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlRlbSBjZXJ0ZXphIGRlIHF1ZSBkZXNlamEgZm9ybWF0YXIgbyBjYXJ0w6NvIFNEPyBUb2RvcyBvcyBkYWRvcyBubyBzZXUgY2FydMOjbyBzZXLDo28gcGVyZGlkb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJEZXB1cmHDp8OjbyBVU0IgY29uZWN0YWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJTZWxlY2lvbmUgcGFyYSBkZXNhdGl2YXIgYSBkZXB1cmHDp8OjbyBVU0IuIjwvc3RyaW5nPgpAQCAtODM3LDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4iY2FuZGlkYXRvcyI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJQcmVwYXJhbmRvIG8gY2FydMOjbyBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iUHJlcGFyYW5kbyBvIGNhcnTDo28gU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByZXBhcmFuZG8gbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IlByb2N1cmFuZG8gZXJyb3MuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IkNhcnTDo28gU0QgZW0gYnJhbmNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iQ2FydMOjbyBTRCBlbSBicmFuY28iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iTyBjYXJ0w6NvIFNEIGVzdMOhIGVtIGJyYW5jbyBvdSBlc3TDoSB1c2FuZG8gdW0gc2lzdGVtYSBkZSBhcnF1aXZvcyBuw6NvIHN1cG9ydGFkby4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJDYXJ0w6NvIFNEIHZhemlvIG91IGNvbSBzaXN0ZW1hIGRlIGFycXVpdm9zIGluY29tcGF0w612ZWwuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4iQ2FydMOjbyBTRCBkYW5pZmljYWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJDYXJ0w6NvIFNEIGRhbmlmaWNhZG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+Ik8gY2FydMOjbyBTRCBlc3TDoSBkYW5pZmljYWRvLiBUYWx2ZXogc2VqYSBuZWNlc3PDoXJpbyByZWZvcm1hdGFyIG8gc2V1IGNhcnTDo28uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+Ik8gY2FydMOjbyBTRCBlc3TDoSBkYW5pZmljYWRvLiBUYWx2ZXogc2VqYSBuZWNlc3PDoXJpbyByZWZvcm1hdMOhLWxvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iQ2FydMOjbyBTRCByZW1vdmlkbyBpbmVzcGVyYWRhbWVudGUuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IkNhcnTDo28gU0QgcmVtb3ZpZG8gaW5lc3BlcmFkYW1lbnRlLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiJEZXNtb250ZSBvIGNhcnTDo28gU0QgYW50ZXMgZGEgcmVtb8Onw6NvIHBhcmEgZXZpdGFyIGEgcGVyZGEgZGUgZGFkb3MuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iRGVzbW9udGUgbyBjYXJ0w6NvIFNEIGFudGVzIGRhIHJlbW/Dp8OjbyBwYXJhIGV2aXRhciBhIHBlcmRhIGRlIGRhZG9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iTyBjYXJ0w6NvIFNEIGrDoSBwb2RlIHNlciByZW1vdmlkbyBjb20gc2VndXJhbsOnYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJPIGNhcnTDo28gU0QgasOhIHBvZGUgc2VyIHJlbW92aWRvIGNvbSBzZWd1cmFuw6dhLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+Ik8gY2FydMOjbyBTRCBqw6EgcG9kZSBzZXIgcmVtb3ZpZG8gY29tIHNlZ3VyYW7Dp2EuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlZvY8OqIHBvZGUgcmVtb3ZlciBvIGNhcnTDo28gU0QgY29tIHNlZ3VyYW7Dp2EuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJDYXJ0w6NvIFNEIHJlbW92aWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkNhcnTDo28gU0QgcmVtb3ZpZG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iTyBTRCBmb2kgcmVtb3ZpZG8uIEluc2lyYSB1bSBub3ZvIGNhcnTDo28gU0QgcGFyYSBhdW1lbnRhciBvIGFybWF6ZW5hbWVudG8gZG8gc2V1IGRpc3Bvc2l0aXZvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IkNhcnTDo28gU0QgcmVtb3ZpZG8uIEluc2lyYSB1bSBub3ZvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IkNhcnTDo28gU0QgZW0gYnJhbmNvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iQ2FydMOjbyBTRCB2YXppbyBvdSBjb20gc2lzdGVtYSBkZSBhcnF1aXZvcyBpbmNvbXBhdMOtdmVsLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQ2FydMOjbyBTRCBkYW5pZmljYWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+Ik8gY2FydMOjbyBTRCBlc3TDoSBkYW5pZmljYWRvLiBUYWx2ZXogc2VqYSBuZWNlc3PDoXJpbyByZWZvcm1hdMOhLWxvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJDYXJ0w6NvIFNEIHJlbW92aWRvIGluZXNwZXJhZGFtZW50ZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEZXNtb250ZSBvIGNhcnTDo28gU0QgYW50ZXMgZGEgcmVtb8Onw6NvIHBhcmEgZXZpdGFyIGEgcGVyZGEgZGUgZGFkb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iTyBjYXJ0w6NvIFNEIGrDoSBwb2RlIHNlciByZW1vdmlkbyBjb20gc2VndXJhbsOnYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iVm9jw6ogcG9kZSByZW1vdmVyIG8gY2FydMOjbyBTRCBjb20gc2VndXJhbsOnYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iQ2FydMOjbyBTRCByZW1vdmlkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IkNhcnTDo28gU0QgcmVtb3ZpZG8uIEluc2lyYSB1bSBub3ZvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iTmVuaHVtIGF0aXZpZGFkZSBjb3JyZXNwb25kZW50ZSBmb2kgZW5jb250cmFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiJhdHVhbGl6YXIgZXN0YXTDrXN0aWNhcyBkZSB1c28gZG8gY29tcG9uZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiJQZXJtaXRlIGEgbW9kaWZpY2HDp8OjbyBkYXMgZXN0YXTDrXN0aWNhcyBkZSB1c28gZG8gY29tcG9uZW50ZSBjb2xldGFkYXMuIE7Do28gZGV2ZSBzZXIgdXNhZG8gcG9yIGFwbGljYXRpdm9zIG5vcm1haXMuIjwvc3RyaW5nPgpAQCAtODk0LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWUE4gTDJUUC9JUFNlYyBjb20gYmFzZSBlbSBjaGF2ZSBwcsOpLWNvbXBhcnRpbGhhZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iVlBOIEwyVFAvSVBTZWMgY29tIGJhc2UgZW0gY2VydGlmaWNhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJFc2NvbGhlciBhcnF1aXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVuaHVtIGFycXVpdm8gZXNjb2xoaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVkZWZpbmlyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RvIGRlIGNhcnJvIGF0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNpb25lIHBhcmEgc2FpciBkbyBtb2RvIGRlIGNhcnJvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJWw61uY3VsbyBvdSBwb250byBkZSBhY2Vzc28gYXRpdm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb3F1ZSBwYXJhIGNvbmZpZ3VyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJWb2x0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJBdmFuw6dhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Iklnbm9yYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJBbHRvIHVzbyBkZSBkYWRvcyBkbyBjZWx1bGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb3F1ZSBwYXJhIHNhYmVyIG1haXMgc29icmUgdXNvIGRlIGRhZG9zIGRvIGNlbHVsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkxpbWl0ZSBkZSBkYWRvcyBkbyBjZWx1bGFyIGV4Y2VkaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IlRvcXVlIHBhcmEgc2FiZXIgbWFpcyBzb2JyZSBvIHVzbyBkZSBkYWRvcyBkbyBjZWx1bGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJOw6NvIGVuY29udHJhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiIG1zZ2lkPSIxOTQ2Nzk5MjMzODIyODIwMzg0Ij4iTG9jYWxpemFyIG5hIHDDoWdpbmEiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iVW1hIGNvcnJlc3BvbmTDqm5jaWEiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiBkZSA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS1yQ0gvYXJyYXlzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0tckNIL2FycmF5cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlODYxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0tckNIL2FycmF5cy54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvYW55L2NvbG9ycy54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgR29vZ2xlIEluYy4KKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKworICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gLS0+CisgICAgPGludGVnZXItYXJyYXkgbmFtZT0ibWFwc19zdGFydGluZ19sYXRfbG5nIj4KKyAgICAgICAgPGl0ZW0+NDY5NDgwMjA8L2l0ZW0+CisgICAgICAgIDxpdGVtPjc0NDgyMDY8L2l0ZW0+CisgICAgPC9pbnRlZ2VyLWFycmF5PgorICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gLS0+CisgICAgPGludGVnZXItYXJyYXkgbmFtZT0ibWFwc19zdGFydGluZ196b29tIj4KKyAgICAgICAgPGl0ZW0+NDwvaXRlbT4KKyAgICA8L2ludGVnZXItYXJyYXk+CisKKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS9kb25vdHRyYW5zbGF0ZS1jbGRyLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vZG9ub3R0cmFuc2xhdGUtY2xkci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkYjE3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vZG9ub3R0cmFuc2xhdGUtY2xkci54bWwKQEAgLTAsMCArMSwxNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfamFudWFyeSI+c2NoYW5lcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2ZlYnJ1YXJ5Ij5mYXZyZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9tYXJjaCI+bWFyczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2FwcmlsIj5hdnJpZ2w8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9tYXkiPm1hdGc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9qdW5lIj56ZXJjbGFkdXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9qdWx5Ij5mYW5hZHVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfYXVndXN0Ij5hdnVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX3NlcHRlbWJlciI+c2V0dGVtYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfb2N0b2JlciI+b2N0b2Jlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX25vdmVtYmVyIj5ub3ZlbWJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2RlY2VtYmVyIj5kZWNlbWJlcjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2phbnVhcnkiPnNjaGFuZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfZmVicnVhcnkiPmZhdnJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19tYXJjaCI+bWFyczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19hcHJpbCI+YXZyaWdsPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX21heSI+bWF0Zzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19qdW5lIj56ZXJjbGFkdXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfanVseSI+ZmFuYWR1cjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19hdWd1c3QiPmF2dXN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3NlcHRlbWJlciI+c2V0dGVtYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX29jdG9iZXIiPm9jdG9iZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfbm92ZW1iZXIiPm5vdmVtYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2RlY2VtYmVyIj5kZWNlbWJlcjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1famFudWFyeSI+c2NoYW4uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fZmVicnVhcnkiPmZhdnIuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fbWFyY2giPm1hcnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9hcHJpbCI+YXZyLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX21heSI+bWF0Zzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2p1bmUiPnplcmNsLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2p1bHkiPmZhbi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9hdWd1c3QiPmF2dXN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fc2VwdGVtYmVyIj5zZXR0Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX29jdG9iZXIiPm9jdC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9ub3ZlbWJlciI+bm92Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2RlY2VtYmVyIj5kZWMuPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2phbnVhcnkiPlM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2ZlYnJ1YXJ5Ij5GPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9tYXJjaCI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfYXByaWwiPkE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X21heSI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfanVuZSI+Wjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfanVseSI+Rjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfYXVndXN0Ij5BPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9zZXB0ZW1iZXIiPlM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X29jdG9iZXIiPk88L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X25vdmVtYmVyIj5OPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9kZWNlbWJlciI+RDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3N1bmRheSI+ZHVtZW5naWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfbW9uZGF5Ij5nbGluZGVzZGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfdHVlc2RheSI+bWFyZGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfd2VkbmVzZGF5Ij5tZXNlbW5hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3RodXJzZGF5Ij5naWV2Z2lhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX2ZyaWRheSI+dmVuZGVyZGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfc2F0dXJkYXkiPnNvbmRhPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV9zdW5kYXkiPmR1PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fbW9uZGF5Ij5nbGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV90dWVzZGF5Ij5tYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX3dlZG5lc2RheSI+bWU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV90aHVyc2RheSI+Z2llPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fZnJpZGF5Ij52ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX3NhdHVyZGF5Ij5zbzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF9zdW5kYXkiPmR1PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF9tb25kYXkiPmdsaTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfdHVlc2RheSI+bWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X3dlZG5lc2RheSI+bWU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X3RodXJzZGF5Ij5naWU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X2ZyaWRheSI+dmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X3NhdHVyZGF5Ij5zbzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF9zdW5kYXkiPkQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X21vbmRheSI+Rzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3RfdHVlc2RheSI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3Rfd2VkbmVzZGF5Ij5NPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF90aHVyc2RheSI+Rzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3RfZnJpZGF5Ij5WPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF9zYXR1cmRheSI+Uzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJ5ZXN0ZXJkYXkiPmllcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idG9kYXkiPm96PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0b21vcnJvdyI+ZGFtYXVuPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfbWludXRlXzI0Ij4lLWs6JU08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfbWludXRlX2FtcG0iPiUtbDolTSAlcDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9taW51dGVfY2FwX2FtcG0iPiUtbDolTSAlXnA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InR3ZWx2ZV9ob3VyX3RpbWVfZm9ybWF0Ij5oOm1tIGE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InR3ZW50eV9mb3VyX2hvdXJfdGltZV9mb3JtYXQiPkg6bW08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfZGF0ZSI+JWQuJW0uJVk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfZGF0ZV9mb3JtYXQiPmRkLk1NLnl5eXk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfZGF0ZV90ZW1wbGF0ZSI+IiVzLiVzLiVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfZGF5X3llYXIiPiUtZS4gJUIgJVk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpbWVfb2ZfZGF5Ij4lSDolTTolUzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF0ZV9hbmRfdGltZSI+JUg6JU06JVMgJWQuJW0uJVk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGVfdGltZSI+JTEkcywgJTIkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGltZV9kYXRlIj4lMyRzLCAlMSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhYmJyZXZfbW9udGhfZGF5X3llYXIiPiVkLiVtLiVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9kYXkiPiUtZS4gJUI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoIj4lLUI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3llYXIiPiVCICVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhYmJyZXZfbW9udGhfZGF5Ij4lLWUuICViPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhYmJyZXZfbW9udGgiPiUtYjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWJicmV2X21vbnRoX3llYXIiPiViICVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aW1lMV90aW1lMiI+JTEkcyAtICUyJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGUxX2RhdGUyIj4lMiRzIC0gJTUkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19tZDFfbWQyIj4lMyRzLiUyJHMuIC0gJTgkcy4lNyRzLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY193ZGF5MV9tZDFfd2RheTJfbWQyIj4lMSRzLCAlMyRzLiUyJHMuIC0gJTYkcywgJTgkcy4lNyRzLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19tZHkxX21keTIiPiUzJHMuJTIkcy4lNCRzIC0gJTgkcy4lNyRzLiU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfd2RheTFfbWR5MV93ZGF5Ml9tZHkyIj4lMSRzLCAlMyRzLiUyJHMuJTQkcyAtICU2JHMsICU4JHMuJTckcy4lOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX3dkYXkxX21keTFfdGltZTFfd2RheTJfbWR5Ml90aW1lMiI+JTUkcyAlMSRzLCAlNCRzLSUyJHMtJTMkcyAtICUxMCRzICU2JHMsICU5JHMtJTckcy0lOCRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX21kMV90aW1lMV9tZDJfdGltZTIiPiU1JHMgJTMkcy4lMiRzLiAtICUxMCRzICU4JHMuJTckcy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfd2RheTFfbWQxX3RpbWUxX3dkYXkyX21kMl90aW1lMiI+JTUkcyAlMSRzLCAlMyRzLiUyJHMuIC0gJTEwJHMgJTYkcywgJTgkcy4lNyRzLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19tZHkxX3RpbWUxX21keTJfdGltZTIiPiU1JHMgJTMkcy4lMiRzLiU0JHMgLSAlMTAkcyAlOCRzLiU3JHMuJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0id2RheTFfZGF0ZTFfdGltZTFfd2RheTJfZGF0ZTJfdGltZTIiPiUzJHMgJTEkcyAlMiRzIC0gJTYkcyAlNCRzICU1JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndkYXkxX2RhdGUxX3dkYXkyX2RhdGUyIj4lMSRzICUyJHMgLSAlNCRzICU1JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGUxX3RpbWUxX2RhdGUyX3RpbWUyIj4lMyRzICUyJHMgLSAlNiRzICU1JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpbWVfd2RheV9kYXRlIj4lMSRzICUyJHMgJTMkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0id2RheV9kYXRlIj4lMiRzICUzJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpbWVfd2RheSI+JTEkcyAlMiRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfbWQxX21kMiI+JTMkcy4gJTIkcyAtICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl93ZGF5MV9tZDFfd2RheTJfbWQyIj4lMSRzICUzJHMuICUyJHMgLSAlNiRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl9tZDFfdGltZTFfbWQyX3RpbWUyIj4lNSRzICUzJHMuICUyJHMgLSAlMTAkcyAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX21kMV90aW1lMV9tZDJfdGltZTIiPiU1JHMgJTMkcy4gJTIkcyAtICUxMCRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl93ZGF5MV9tZDFfdGltZTFfd2RheTJfbWQyX3RpbWUyIj4lNSRzICUxJHMgJTMkcy4gJTIkcyAtICUxMCRzICU2JHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF93ZGF5MV9tZDFfdGltZTFfd2RheTJfbWQyX3RpbWUyIj4lNSRzICUxJHMgJTMkcy4gJTIkcyAtICUxMCRzICU2JHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX21keTFfdGltZTFfbWR5Ml90aW1lMiI+JTUkcyAlMyRzLiAlMiRzICU0JHMgLSAlMTAkcyAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfbWR5MV90aW1lMV9tZHkyX3RpbWUyIj4lNSRzICUzJHMuICUyJHMgJTQkcyAtICUxMCRzICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX3dkYXkxX21keTFfdGltZTFfd2RheTJfbWR5Ml90aW1lMiI+JTUkcyAlMSRzLCAlMyRzLiAlMiRzICU0JHMgLSAlMTAkcyAlNiRzLCAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfd2RheTFfbWR5MV90aW1lMV93ZGF5Ml9tZHkyX3RpbWUyIj4lNSRzICUxJHMsICUzJHMuICUyJHMgJTQkcyAtICUxMCRzICU2JHMsICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF93ZGF5MV9tZHkxX3dkYXkyX21keTIiPiUxJHMsICUzJHMuICUyJHMgJTQkcyAtICU2JHMsICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF9tZDFfbWQyIj4lMyRzLi0lOCRzLiAlMiRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX3dkYXkxX21kMV93ZGF5Ml9tZDIiPiUxJHMgJTMkcy4gJTIkcyAtICU2JHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX21keTFfbWR5MiI+JTMkcy4gJTIkcyAtICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF9tZHkxX21keTIiPiUzJHMuLSU4JHMuICUyJHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX3dkYXkxX21keTFfd2RheTJfbWR5MiI+JTEkcywgJTMkcy4gJTIkcyAtICU2JHMsICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvcnRfZm9ybWF0X21vbnRoIj4lYjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAppbmRleCBiNjE2MzVmLi5mMDQwYmQwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4i0JjQvdGB0YLRgNGD0LzQtdC90YLRiyDRgNCw0LfRgNCw0LHQvtGC0LrQuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiLQpNGD0L3QutGG0LjQuCwg0L3QtdC+0LHRhdC+0LTQuNC80YvQtSDRgtC+0LvRjNC60L4g0YDQsNC30YDQsNCx0L7RgtGH0LjQutCw0Lwg0L/RgNC40LvQvtC20LXQvdC40LkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4i0J/QsNC80Y/RgtGMIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiLQlNC+0YHRgtGD0L8g0LogU0Qt0LrQsNGA0YLQtS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4i0JTQvtGB0YLRg9C/INC6IFNELdC60LDRgNGC0LUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+ItCU0L7RgdGC0YPQvyDQuiBTRC3QutCw0YDRgtC1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+ItC+0YLQutC70Y7Rh9Cw0YLRjCDQuNC70Lgg0LjQt9C80LXQvdGP0YLRjCDRgdGC0YDQvtC60YMg0YHQvtGB0YLQvtGP0L3QuNGPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQvtGC0LrQu9GO0YfQsNGC0Ywg0YHRgtGA0L7QutGDINGB0L7RgdGC0L7Rj9C90LjRjyDQuNC70Lgg0LTQvtCx0LDQstC70Y/RgtGML9GD0LTQsNC70Y/RgtGMINGB0LjRgdGC0LXQvNC90YvQtSDQt9C90LDRh9C60LguIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+ItGB0YLRgNC+0LrQsCDRgdC+0YHRgtC+0Y/QvdC40Y8iPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQvtGB0LLQvtCx0L7QttC00LDRgtGMINC/0LDQvNGP0YLRjCDRgtC10LvQtdGE0L7QvdCwINGBINC/0L7QvNC+0YnRjNGOINGD0LTQsNC70LXQvdC40Y8g0YTQsNC50LvQvtCyINC40Lcg0LrQsNGC0LDQu9C+0LPQsCDQutGN0YjQsCDQv9GA0LjQu9C+0LbQtdC90LjQuS4g0J7QsdGL0YfQvdC+INGN0YLQviDRgNCw0LfRgNC10YjQsNC10YLRgdGPINGC0L7Qu9GM0LrQviDRgdC40YHRgtC10LzQvdGL0Lwg0L/RgNC+0YbQtdGB0YHQsNC8LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiLQn9C10YDQtdC80LXRidCw0YLRjCDRgNC10YHRg9GA0YHRiyDQv9GA0LjQu9C+0LbQtdC90LjRjyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQv9C10YDQtdC80LXRidCw0YLRjCDRgNC10YHRg9GA0YHRiyDQv9GA0LjQu9C+0LbQtdC90LjRjyDRgSDQstC90YPRgtGA0LXQvdC90LjRhSDQvdCwINCy0L3QtdGI0L3QuNC1INC90L7RgdC40YLQtdC70Lgg0Lgg0L3QsNC+0LHQvtGA0L7Rgi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+ItGB0YfQuNGC0YvQstCw0YLRjCDQutC+0L3RhNC40LTQtdC90YbQuNCw0LvRjNC90YvQtSDQtNCw0L3QvdGL0LUg0LbRg9GA0L3QsNC70LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgbXNnaWQ9Ijg4OTY0NDk0Mzc0NjQ4Njc3NjYiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0YHRh9C40YLRi9Cy0LDRgtGMINC40L3RhNC+0YDQvNCw0YbQuNGOINC40Lcg0YDQsNC30LvQuNGH0L3Ri9GFINC20YPRgNC90LDQu9C+0LIg0YHQuNGB0YLQtdC80YsuINCf0YDQuNC70L7QttC10L3QuNC1INC80L7QttC10YIg0L/QvtC70YPRh9Cw0YLRjCDRgdCy0LXQtNC10L3QuNGPINC+INGA0LDQsdC+0YLQtSDQv9C+0LvRjNC30L7QstCw0YLQtdC70Y8g0YEg0YLQtdC70LXRhNC+0L3QvtC8LCDQutC+0YLQvtGA0YvQtSDQvNC+0LPRg9GCINGB0L7QtNC10YDQttCw0YLRjCDQu9C40YfQvdGD0Y4g0LjQu9C4INC60L7QvdGE0LjQtNC10L3RhtC40LDQu9GM0L3Rg9GOINC40L3RhNC+0YDQvNCw0YbQuNGOLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+ItGB0YfQuNGC0YvQstCw0YLRjC/Qt9Cw0L/QuNGB0YvQstCw0YLRjCDQtNCw0L3QvdGL0LUg0LIg0YDQtdGB0YPRgNGB0YssINC/0YDQuNC90LDQtNC70LXQttCw0YnQuNC1INCz0YDRg9C/0L/QtSDQtNC40LDQs9C90L7RgdGC0LjQutC4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0YHRh9C40YLRi9Cy0LDRgtGMINC4INC30LDQv9C40YHRi9Cy0LDRgtGMINC00LDQvdC90YvQtSDQsiDQu9GO0LHRi9C1INGA0LXRgdGD0YDRgdGLLCDQv9GA0LjQvdCw0LTQu9C10LbQsNGJ0LjQtSDQs9GA0YPQv9C/0LUg0LTQuNCw0LPQvdC+0YHRgtC40LrQuCAo0L3QsNC/0YDQuNC80LXRgCwg0YTQsNC50LvRiyDQsiDQutCw0YLQsNC70L7Qs9C1IC9kZXYpLiDQrdGC0L4g0LzQvtC20LXRgiDQv9C+0LLQu9C40Y/RgtGMINC90LAg0YHRgtCw0LHQuNC70YzQvdC+0YHRgtGMINC4INCx0LXQt9C+0L/QsNGB0L3QvtGB0YLRjCDRgdC40YHRgtC10LzRiy4g0K3RgtCwINCy0L7Qt9C80L7QttC90L7RgdGC0Ywg0LzQvtC20LXRgiDQsdGL0YLRjCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LAg0KLQntCb0KzQmtCeINC/0YDQvtC40LfQstC+0LTQuNGC0LXQu9C10Lwg0LjQu9C4INC+0L/QtdGA0LDRgtC+0YDQvtC8INC00LvRjyDQtNC40LDQs9C90L7RgdGC0LjQutC4INCw0L/Qv9Cw0YDQsNGC0L3QvtCz0L4g0L7QsdC10YHQv9C10YfQtdC90LjRjy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiLQstC60LvRjtGH0LDRgtGMINC40LvQuCDQvtGC0LrQu9GO0YfQsNGC0Ywg0LrQvtC80L/QvtC90LXQvdGC0Ysg0L/RgNC40LvQvtC20LXQvdC40Y8iPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0L3QsNGB0YLRgNCw0LjQstCw0YLRjCDQu9C+0LrQsNC70YzQvdGL0Lkg0YLQtdC70LXRhNC+0L0gQmx1ZXRvb3RoLCDQvtCx0L3QsNGA0YPQttC40LLQsNGC0Ywg0Lgg0LLRi9C/0L7Qu9C90Y/RgtGMINGB0L7Qv9GA0Y/QttC10L3QuNC1INGD0LTQsNC70LXQvdC90YvRhSDRg9GB0YLRgNC+0LnRgdGC0LIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4i0YHQvtC30LTQsNCy0LDRgtGMINC/0L7QtNC60LvRjtGH0LXQvdC40Y8gQmx1ZXRvb3RoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4i0J/QvtC30LLQvtC70Y/QtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC/0YDQvtGB0LzQsNGC0YDQuNCy0LDRgtGMINC60L7QvdGE0LjQs9GD0YDQsNGG0LjRjiDQu9C+0LrQsNC70YzQvdC+0LPQviDRgtC10LvQtdGE0L7QvdCwIEJsdWV0b290aCwg0YHQvtC30LTQsNCy0LDRgtGMINC/0L7QtNC60LvRjtGH0LXQvdC40Y8g0YEg0YHQvtC/0YDRj9C20LXQvdC90YvQvNC4INGD0YHRgtGA0L7QudGB0YLQstCw0LzQuC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4i0L7RgtC60LvRjtGH0LDRgtGMINCx0LvQvtC60LjRgNC+0LLQutGDINC60LvQsNCy0LjQsNGC0YPRgNGLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQvtGC0LrQu9GO0YfQuNGC0Ywg0LHQu9C+0LrQuNGA0L7QstC60YMg0LrQu9Cw0LLQuNCw0YLRg9GA0Ysg0Lgg0LTRgNGD0LPQuNC1INGE0YPQvdC60YbQuNC4INC30LDRidC40YLRiyDQv9Cw0YDQvtC70LXQvC4g0J/RgNC40LzQtdGA0L7QvCDQtNC+0L/Rg9GB0YLQuNC80L7Qs9C+INC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINGN0YLQvtC5INGE0YPQvdC60YbQuNC4INGP0LLQu9GP0LXRgtGB0Y8g0L7RgtC60LvRjtGH0LXQvdC40LUg0LHQu9C+0LrQuNGA0L7QstC60Lgg0LrQu9Cw0LLQuNCw0YLRg9GA0Ysg0L/RgNC4INC/0L7Qu9GD0YfQtdC90LjQuCDQstGF0L7QtNGP0YnQtdCz0L4g0LLRi9C30L7QstCwINC4INCy0LrQu9GO0YfQtdC90LjQtSDQsdC70L7QutC40YDQvtCy0LrQuCDQv9C+0YHQu9C1INC30LDQstC10YDRiNC10L3QuNGPINGA0LDQt9Cz0L7QstC+0YDQsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4i0YHRh9C40YLRi9Cy0LDRgtGMINC90LDRgdGC0YDQvtC50LrQuCDRgdC40L3RhdGA0L7QvdC40LfQsNGG0LjQuCI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0YHRh9C40YLRi9Cy0LDRgtGMINC70Y7QsdGL0LUg0YHQu9C+0LLQsCwg0LjQvNC10L3QsCDQuCDRhNGA0LDQt9GLINC70LjRh9C90L7Qs9C+INC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8sINC60L7RgtC+0YDRi9C1INC80L7Qs9GD0YIg0YXRgNCw0L3QuNGC0YzRgdGPINCyINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQvtC8INGB0LvQvtCy0LDRgNC1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+ItC30LDQv9C40YHRi9Cy0LDRgtGMINCyINGB0LvQvtCy0LDRgNGMINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0LfQsNC/0LjRgdGL0LLQsNGC0Ywg0L3QvtCy0YvQtSDRgdC70L7QstCwINCyINGB0LvQvtCy0LDRgNGMINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+ItC40LfQvNC10L3Rj9GC0Ywv0YPQtNCw0LvRj9GC0Ywg0YHQvtC00LXRgNC20LjQvNC+0LUgU0Qt0LrQsNGA0YLRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i0LjQt9C80LXQvdGP0YLRjC/Rg9C00LDQu9GP0YLRjCDRgdC+0LTQtdGA0LbQuNC80L7QtSBTRC3QutCw0YDRgtGLIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+ItCg0LDQt9GA0LXRiNCw0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQt9Cw0L/QuNGB0Ywg0L3QsCBTRC3QutCw0YDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4i0KDQsNC30YDQtdGI0LDQtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC30LDQv9C40YHRjCDQvdCwIFNELdC60LDRgNGC0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ItC40LfQvNC10L3Rj9GC0Ywv0YPQtNCw0LvRj9GC0Ywg0YHQvtC00LXRgNC20LjQvNC+0LUgU0Qt0LrQsNGA0YLRiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+ItCg0LDQt9GA0LXRiNCw0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQt9Cw0L/QuNGB0Ywg0L3QsCBTRC3QutCw0YDRgtGDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+ItC/0L7Qu9GD0YfQsNGC0Ywg0LTQvtGB0YLRg9C/INC6INC60Y3RiNGDINGE0LDQudC70L7QstC+0Lkg0YHQuNGB0YLQtdC80YsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+ItCg0LDQt9GA0LXRiNCw0LXRgiDQv9GA0L7Qs9GA0LDQvNC80LDQvCDQtNC+0YHRgtGD0L8g0LTQu9GPINC30LDQv9C40YHQuCDQuCDRh9GC0LXQvdC40Y8g0Log0LrRjdGI0YMg0YTQsNC50LvQvtCy0L7QuSDRgdC40YHRgtC10LzRiy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiLQntCz0YDQsNC90LjRh9C40YLRjCDQv9Cw0YDQvtC70YwiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxNzE5ODc3MjQ1NjkyMzE4Mjk5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI5MDgzNDAwMDgwODYxNzI4MDU2Ij4i0J7Qs9GA0LDQvdC40YfQuNGC0Ywg0YLQuNC/0Ysg0L/QsNGA0L7Qu9C10LksINC00L7RgdGC0YPQv9C90YvRhSDQtNC70Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiLQn9GA0L7RgdC80L7RgtGAINC/0L7Qv9GL0YLQvtC6INCy0YXQvtC00LAiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4i0JzQvtC90LjRgtC+0YDQuNC90LMg0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INC/0L7QtNC60LvRjtGH0LXQvdC40Y8g0Log0YPRgdGC0YDQvtC50YHRgtCy0YMg0LTQu9GPINCy0YvQv9C+0LvQvdC10L3QuNGPINC+0L/RgNC10LTQtdC70LXQvdC90YvRhSDQtNC10LnRgdGC0LLQuNC5LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+ItCh0LHRgNC+0YHQuNGC0Ywg0L/QsNGA0L7Qu9GMIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+ItCf0YDQuNC90YPQtNC40YLQtdC70YzQvdC+INC40LfQvNC10L3QuNGC0Ywg0L/QsNGA0L7Qu9GMLCDQutC+0YLQvtGA0YvQuSDQsNC00LzQuNC90LjRgdGC0YDQsNGC0L7RgCDQtNC+0LvQttC10L0g0LHRg9C00LXRgiDRgdC+0L7QsdGJ0LjRgtGMINCy0LDQvCwg0YfRgtC+0LHRiyDQstGLINGB0LzQvtCz0LvQuCDQstGL0L/QvtC70L3QuNGC0Ywg0LLRhdC+0LQuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiLQn9GA0LjQvdGD0LTQuNGC0LXQu9GM0L3QsNGPINCx0LvQvtC60LjRgNC+0LLQutCwIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4i0KPQv9GA0LDQstC70LXQvdC40LUg0LHQu9C+0LrQuNGA0L7QstC60L7QuSDRg9GB0YLRgNC+0LnRgdGC0LLQsCwg0YLRgNC10LHRg9GO0YnQtdC5INCy0LLQvtC00LAg0L/QsNGA0L7Qu9GPLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+ItCe0LPRgNCw0L3QuNGH0LjRgtGMINC/0LDRgNC+0LvRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiLQntCz0YDQsNC90LjRh9C40YLRjCDRgtC40L/RiyDQv9Cw0YDQvtC70LXQuSwg0LTQvtGB0YLRg9C/0L3Ri9GFINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiLQn9GA0L7RgdC80L7RgtGAINC/0L7Qv9GL0YLQvtC6INCy0YXQvtC00LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4i0JzQvtC90LjRgtC+0YDQuNC90LMg0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INC/0L7QtNC60LvRjtGH0LXQvdC40Y8g0Log0YPRgdGC0YDQvtC50YHRgtCy0YMg0LTQu9GPINCy0YvQv9C+0LvQvdC10L3QuNGPINC+0L/RgNC10LTQtdC70LXQvdC90YvRhSDQtNC10LnRgdGC0LLQuNC5LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+ItCh0LHRgNC+0YHQuNGC0Ywg0L/QsNGA0L7Qu9GMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+ItCf0YDQuNC90YPQtNC40YLQtdC70YzQvdC+INC40LfQvNC10L3QuNGC0Ywg0L/QsNGA0L7Qu9GMLCDQutC+0YLQvtGA0YvQuSDQsNC00LzQuNC90LjRgdGC0YDQsNGC0L7RgCDQtNC+0LvQttC10L0g0LHRg9C00LXRgiDRgdC+0L7QsdGJ0LjRgtGMINCy0LDQvCwg0YfRgtC+0LHRiyDQstGLINGB0LzQvtCz0LvQuCDQstGL0L/QvtC70L3QuNGC0Ywg0LLRhdC+0LQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiLQn9GA0LjQvdGD0LTQuNGC0LXQu9GM0L3QsNGPINCx0LvQvtC60LjRgNC+0LLQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4i0KPQv9GA0LDQstC70LXQvdC40LUg0LHQu9C+0LrQuNGA0L7QstC60L7QuSDRg9GB0YLRgNC+0LnRgdGC0LLQsCwg0YLRgNC10LHRg9GO0YnQtdC5INCy0LLQvtC00LAg0L/QsNGA0L7Qu9GPLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLQo9C00LDQu9C40YLRjCDQstGB0LUg0LTQsNC90L3Ri9C1Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiLQktGL0L/QvtC70L3QuNGC0Ywg0YHQsdGA0L7RgSDQuiDQvdCw0YfQsNC70YzQvdGL0Lwg0L3QsNGB0YLRgNC+0LnQutCw0Lwg0YEg0YPQtNCw0LvQtdC90LjQtdC8INCy0YHQtdGFINC00LDQvdC90YvRhSDQsdC10Lcg0LfQsNC/0YDQvtGB0LAg0L/QvtC00YLQstC10YDQttC00LXQvdC40Y8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLQktGL0L/QvtC70L3QuNGC0Ywg0YHQsdGA0L7RgSDQuiDQvdCw0YfQsNC70YzQvdGL0Lwg0L3QsNGB0YLRgNC+0LnQutCw0Lwg0YEg0YPQtNCw0LvQtdC90LjQtdC8INCy0YHQtdGFINC00LDQvdC90YvRhSDQsdC10Lcg0LfQsNC/0YDQvtGB0LAg0L/QvtC00YLQstC10YDQttC00LXQvdC40Y8uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4i0J3QsNGB0YLRgNC+0LnRgtC1INCz0LvQvtCx0LDQu9GM0L3Ri9C5INC/0YDQvtC60YHQuC3RgdC10YDQstC10YAg0YPRgdGC0YDQvtC50YHRgtCy0LAsINC60L7RgtC+0YDRi9C5INCx0YPQtNC10YIg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyDQv9GA0Lgg0LDQutGC0LjQstC90L7QuSDQv9C+0LvQuNGC0LjQutC1LiDQk9C70L7QsdCw0LvRjNC90YvQuSDQv9GA0L7QutGB0Lgt0YHQtdGA0LLQtdGAINC00L7Qu9C20LXQvSDQvdCw0YHRgtGA0L7QuNGC0Ywg0LDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YAg0L/QtdGA0LLQvtCz0L4g0YPRgdGC0YDQvtC50YHRgtCy0LAuIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4i0JTQvtC80LDRiNC90LjQuSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+ItCc0L7QsdC40LvRjNC90YvQuSI8L2l0ZW0+CkBAIC01NDQsMTQgKzUzMCwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+ItCg0LDQsdC+0YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLQlNGA0YPQs9C+0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i0KHQvtC30LTQsNGC0Ywg0YHQstC+0Lkg0Y/RgNC70YvQuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlQ3VzdG9tIiBtc2dpZD0iMjQ3MzU4MDU5MzExMTU5MDk0NSI+ItCe0YHQvtCx0YvQuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlSG9tZSIgbXNnaWQ9IjYwOTM1OTgxODEwNjkzNTkyOTUiPiLQlNC+0LzQsNGI0L3QuNC5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+ItCg0LDQsdC+0YfQuNC5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVPdGhlciIgbXNnaWQ9IjQ0MDg0MzYxNjI5NTAxMTk4NDkiPiLQlNGA0YPQs9C+0LkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i0YEg0L/QvtC80L7RidGM0Y4gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiDRgSDQv9C+0LzQvtGJ0YzRjiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUN1c3RvbSAoMjQ3MzU4MDU5MzExMTU5MDk0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUhvbWUgKDYwOTM1OTgxODEwNjkzNTkyOTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVXb3JrICg2OTIwNzI1NzMwNzk3MDk5MDQ3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiLQktCy0LXQtNC40YLQtSBQSU4t0LrQvtC0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLQktCy0LXQtNC40YLQtSDQv9Cw0YDQvtC70Ywg0LTQu9GPINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQutC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLQktCy0LXQtNC40YLQtSBQSU4t0LrQvtC0INC00LvRjyDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+ItCd0LXQstC10YDQvdGL0LkgUElOLdC60L7QtCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4i0JTQu9GPINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQutC4INC90LDQttC80LjRgtC1IFwi0JzQtdC90Y5cIiwg0LAg0LfQsNGC0LXQvCAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLQrdC60YHRgtGA0LXQvdC90LDRjyDRgdC70YPQttCx0LAiPC9zdHJpbmc+CkBAIC01NjQsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i0JLQtdGA0L3Rg9GC0YzRgdGPINC6INCy0YvQt9C+0LLRgyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+ItCf0YDQsNCy0LjQu9GM0L3QviEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLQmNC00LXRgiDQt9Cw0YDRj9C00LrQsCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i0JfQsNGA0Y/QttC10L3QsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU3OCw3ICs1NjgsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNLdC60LDRgNGC0LAg0LfQsNCx0LvQvtC60LjRgNC+0LLQsNC90LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4i0KDQsNC30LHQu9C+0LrQuNGA0L7QstC60LAgU0lNLdC60LDRgNGC0YvigKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCDQs9GA0LDRhNC40YfQtdGB0LrQvtCz0L4g0LrQu9GO0YfQsCDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuDogPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4uICJcblxuItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+INGBLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAg0LPRgNCw0YTQuNGH0LXRgdC60L7Qs9C+INC60LvRjtGH0LAg0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60Lg6IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LiDQn9C+0YHQu9C1IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+INC90LXRg9C00LDRh9C90YvRhSDQv9C+0L/Ri9GC0L7QuiDQstCw0Lwg0LHRg9C00LXRgiDQv9GA0LXQtNC70L7QttC10L3QviDRgNCw0LfQsdC70L7QutC40YDQvtCy0LDRgtGMINGC0LXQu9C10YTQvtC9INGBINC/0L7QvNC+0YnRjNGOINGD0YfQtdGC0L3Ri9GFINC00LDQvdC90YvRhSBHb29nbGUuICAiXG5cbiIg0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAg0L/QsNGA0L7Qu9GPOiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi4gIlxuXG4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+ItCa0L7Qu9C40YfQtdGB0YLQstC+INC90LXRg9C00LDRh9C90YvRhSDQv9C+0L/Ri9GC0L7QuiDQstCy0L7QtNCwIFBJTi3QutC+0LTQsDogPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4uICJcblxuItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+INGBLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAg0LPRgNCw0YTQuNGH0LXRgdC60L7Qs9C+INC60LvRjtGH0LAg0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60Lg6IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LiDQn9C+0YHQu9C1IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+INC90LXRg9C00LDRh9C90YvRhSDQv9C+0L/Ri9GC0L7QuiDQstCw0Lwg0LHRg9C00LXRgiDQv9GA0LXQtNC70L7QttC10L3QviDRgNCw0LfQsdC70L7QutC40YDQvtCy0LDRgtGMINGC0LXQu9C10YTQvtC9INGBINC/0L7QvNC+0YnRjNGOINGD0YfQtdGC0L3Ri9GFINC00LDQvdC90YvRhSBHb29nbGUuXG4gIlxuXG4iINCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+INGBLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLQl9Cw0LHRi9C70Lgg0LPRgNCw0YTQuNGH0LXRgdC60LjQuSDQutC70Y7Rhz8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2dsb2dpbl9mb3Jnb3RfcGF0dGVybiIgbXNnaWQ9IjI1ODg1MjE1MDExNjYwMzI3NDciPiLQodC90Y/RgtC40LUg0LHQu9C+0LrQuNGA0L7QstC60Lgg0LDQutC60LDRg9C90YLQsCI8L3N0cmluZz4KQEAgLTYwNiwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiLQn9C10YDQtdC50YLQuCDRgSDRjdGC0L7QuSDRgdGC0YDQsNC90LjRhtGLPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiLQndCw0LbQvNC40YLQtSBcItCe0JpcIiwg0YfRgtC+0LHRiyDQv9GA0L7QtNC+0LvQttC40YLRjCwg0LjQu9C4IFwi0J7RgtC80LXQvdCwXCIsINGH0YLQvtCx0Ysg0L7RgdGC0LDRgtGM0YHRjyDQvdCwINGC0LXQutGD0YnQtdC5INGB0YLRgNCw0L3QuNGG0LUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9sYWJlbCIgbXNnaWQ9IjY4NjAyNjE3NTg2NjU4MjUwNjkiPiLQn9C+0LTRgtCy0LXRgNC00LjRgtC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiLQodC+0LLQtdGCOiDQvdCw0LbQvNC40YLQtSDQtNCy0LDQttC00YssINGH0YLQvtCx0Ysg0YPQstC10LvQuNGH0LjRgtGMINC4INGD0LzQtdC90YzRiNC40YLRjCDQvNCw0YHRiNGC0LDQsS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiLRgdGH0LjRgtGL0LLQsNGC0Ywg0LjRgdGC0L7RgNC40Y4g0Lgg0LfQsNC60LvQsNC00LrQuCDQsdGA0LDRg9C30LXRgNCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4i0KDQsNC30YDQtdGI0LDQtdGCINC/0YDQuNC70L7QttC10L3QuNGOINGB0YfQuNGC0YvQstCw0YLRjCDQstGB0LUgVVJMLCDQv9C+0YHQtdGJ0LXQvdC90YvQtSDQsdGA0LDRg9C30LXRgNC+0LwsINC4INCy0YHQtSDQtdCz0L4g0LfQsNC60LvQsNC00LrQuC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiLQt9Cw0L/QuNGB0YvQstCw0YLRjCDQuNGB0YLQvtGA0LjRjiDQuCDQt9Cw0LrQu9Cw0LTQutC4INCx0YDQsNGD0LfQtdGA0LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiLQoNCw0LfRgNC10YjQsNC10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0LjQt9C80LXQvdGP0YLRjCDQuNGB0YLQvtGA0LjRjiDQuCDQt9Cw0LrQu9Cw0LTQutC4INCx0YDQsNGD0LfQtdGA0LAsINGB0L7RhdGA0LDQvdC10L3QvdGL0LUg0LIg0LLQsNGI0LXQvCDRgtC10LvQtdGE0L7QvdC1LiDQktGA0LXQtNC+0L3QvtGB0L3QvtC1INCf0J4g0LzQvtC20LXRgiDQv9C+0LvRjNC30L7QstCw0YLRjNGB0Y8g0Y3RgtC40LwsINGH0YLQvtCx0Ysg0YHRgtC40YDQsNGC0Ywg0LjQu9C4INC40LfQvNC10L3Rj9GC0Ywg0LTQsNC90L3Ri9C1INCy0LDRiNC10LPQviDQsdGA0LDRg9C30LXRgNCwLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4i0JjQt9C80LXQvdC40YLRjCDRgNCw0LfRgNC10YjQtdC90LjRjyDQsdGA0LDRg9C30LXRgNCwINC00LvRjyDQtNC+0YHRgtGD0L/QsCDQuiDQs9C10L7Qs9GA0LDRhNC40YfQtdGB0LrQvtC80YMg0LzQtdGB0YLQvtC/0L7Qu9C+0LbQtdC90LjRjiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC+0LPRgNCw0LzQvNC1INC40LfQvNC10L3Rj9GC0Ywg0YDQsNC30YDQtdGI0LXQvdC40Y8g0LHRgNCw0YPQt9C10YDQsCDQtNC70Y8g0LTQvtGB0YLRg9C/0LAg0Log0LPQtdC+0LPRgNCw0YTQuNGH0LXRgdC60L7QvNGDINC/0L7Qu9C+0LbQtdC90LjRji4g0JLRgNC10LTQvtC90L7RgdC90YvQtSDQv9GA0L7Qs9GA0LDQvNC80Ysg0LzQvtCz0YPRgiDQv9C+0LvRjNC30L7QstCw0YLRjNGB0Y8g0Y3RgtC40Lwg0LTQu9GPINC+0YLQv9GA0LDQstC60Lgg0LjQvdGE0L7RgNC80LDRhtC40Lgg0L4g0LzQtdGB0YLQvtC/0L7Qu9C+0LbQtdC90LjQuCDQvdCwINC90LXQutC+0YLQvtGA0YvQtSDRgdCw0LnRgtGLLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+ItCS0Ysg0YXQvtGC0LjRgtC1LCDRh9GC0L7QsdGLINCx0YDQsNGD0LfQtdGAINC30LDQv9C+0LzQvdC40Lsg0Y3RgtC+0YIg0L/QsNGA0L7Qu9GMPyI8L3N0cmluZz4KQEAgLTcyNiwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i0JLRi9Cx0YDQsNGC0Ywg0LLRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiLQktGL0LHQtdGA0LjRgtC1INGB0LvQvtCy0L4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4i0JLRi9GA0LXQt9Cw0YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i0JrQvtC/0LjRgNC+0LLQsNGC0YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiLQktGB0YLQsNCy0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiLQmtC+0L/QuNGA0L7QstCw0YLRjCBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiLQktGL0LHRgNCw0YLRjCDRgtC10LrRgdGCLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+ItCS0YvQsdC+0YAg0YLQtdC60YHRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i0KHQv9C+0YHQvtCxINCy0LLQvtC00LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4i0JTQvtCx0LDQstC40YLRjCBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiDQsiDRgdC70L7QstCw0YDRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+ItCY0LfQvNC10L3QuNGC0Ywg0YLQtdC60YHRgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+ItCe0L/QtdGA0LDRhtC40Lgg0YEg0YLQtdC60YHRgtC+0LwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+ItCd0LXQtNC+0YHRgtCw0YLQvtGH0L3QviDQvNC10YHRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i0JfQsNC60LDQvdGH0LjQstCw0LXRgtGB0Y8g0LzQtdGB0YLQviDQsiDQv9Cw0LzRj9GC0Lgg0YLQtdC70LXRhNC+0L3QsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLQntCaIjwvc3RyaW5nPgpAQCAtNzQxLDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i0J7QmiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+ItCe0YLQvNC10L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLQktC90LjQvNCw0L3QuNC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLQktCa0JsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLQktCr0JrQmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i0KfRgtC+INC40YHQv9C+0LvRjNC30L7QstCw0YLRjD8iPC9zdHJpbmc+CkBAIC03NTksOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiLQl9Cw0LrRgNGL0YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiLQntGC0YfQtdGCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiLQn9C+0LTQvtC20LTQsNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSDQv9C10YDQtdC90LDQv9GA0LDQstC70LXQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+INCy0YvQv9C+0LvQvdGP0LXRgtGB0Y8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLQmNC30L3QsNGH0LDQu9GM0L3QviDQsdGL0LvQviDQt9Cw0L/Rg9GJ0LXQvdC+INC/0YDQuNC70L7QttC10L3QuNC1IDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+ItCf0YDQuNC70L7QttC10L3QuNC1IDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKNC/0YDQvtGG0LXRgdGBIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikg0L3QsNGA0YPRiNC40LvQviDRgdC+0LHRgdGC0LLQtdC90L3Rg9GOINC/0L7Qu9C40YLQuNC60YMgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLQn9GA0L7RhtC10YHRgSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4g0L3QsNGA0YPRiNC40Lsg0YHQvtCx0YHRgtCy0LXQvdC90YPRjiDQv9C+0LvQuNGC0LjQutGDIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiDQt9Cw0L/Rg9GJ0LXQvdC+Ijwvc3RyaW5nPgpAQCAtODA4LDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+ItCf0L7QutCw0LfQsNGC0Ywg0LLRgdC1IjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+ItCX0LDQv9C+0LzQuNC90LDRjtGJ0LXQtSDRg9GB0YLRgNC+0LnRgdGC0LLQviBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJVU0It0L/QvtC00LrQu9GO0YfQtdC90LjQtSDRg9GB0YLQsNC90L7QstC70LXQvdC+Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4i0KLQtdC70LXRhNC+0L0g0L/QvtC00LrQu9GO0YfQtdC9INC6INC60L7QvNC/0YzRjtGC0LXRgNGDINGH0LXRgNC10Lcg0L/QvtGA0YIgVVNCLiDQndCw0LbQvNC40YLQtSDQutC90L7Qv9C60YMg0L3QuNC20LUsINC10YHQu9C4INC90LXQvtCx0YXQvtC00LjQvNC+INC60L7Qv9C40YDQvtCy0LDRgtGMINGE0LDQudC70Ysg0YEg0LrQvtC80L/RjNGO0YLQtdGA0LAg0L3QsCBTRC3QutCw0YDRgtGDINGD0YHRgtGA0L7QudGB0YLQstCwIEFuZHJvaWQgKNC40LvQuCDQvdCw0L7QsdC+0YDQvtGCKS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+ItCi0LXQu9C10YTQvtC9INC/0L7QtNC60LvRjtGH0LXQvSDQuiDQutC+0LzQv9GM0Y7RgtC10YDRgyDRh9C10YDQtdC3INC/0L7RgNGCIFVTQi4g0J3QsNC20LzQuNGC0LUg0LrQvdC+0L/QutGDINC90LjQttC1LCDQtdGB0LvQuCDQvdC10L7QsdGF0L7QtNC40LzQviDQutC+0L/QuNGA0L7QstCw0YLRjCDRhNCw0LnQu9GLINGBINC60L7QvNC/0YzRjtGC0LXRgNCwINC90LAgU0Qt0LrQsNGA0YLRgyDRg9GB0YLRgNC+0LnRgdGC0LLQsCBBbmRyb2lkICjQuNC70Lgg0L3QsNC+0LHQvtGA0L7RgikuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiLQotC10LvQtdGE0L7QvSDQv9C+0LTQutC70Y7Rh9C10L0g0Log0LrQvtC80L/RjNGO0YLQtdGA0YMg0YfQtdGA0LXQtyDQv9C+0YDRgiBVU0IuINCd0LDQttC80LjRgtC1INC60L3QvtC/0LrRgyDQvdC40LbQtSwg0LXRgdC70Lgg0L3QtdC+0LHRhdC+0LTQuNC80L4g0LrQvtC/0LjRgNC+0LLQsNGC0Ywg0YTQsNC50LvRiyDRgSDQutC+0LzQv9GM0Y7RgtC10YDQsCDQvdCwIFNELdC60LDRgNGC0YMg0YPRgdGC0YDQvtC50YHRgtCy0LAgQW5kcm9pZCAo0LjQu9C4INC90LDQvtCx0L7RgNC+0YIpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiLQktC60LvRjtGH0LjRgtGMIFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+ItCf0YDQuCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQuCBTRC3QutCw0YDRgtGLINC60LDQuiBVU0It0L3QsNC60L7Qv9C40YLQtdC70Y8g0LLQvtC30L3QuNC60LvQsCDQvdC10L/QvtC70LDQtNC60LAuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiLQn9GA0Lgg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LggU0Qt0LrQsNGA0YLRiyDQutCw0LogVVNCLdC90LDQutC+0L/QuNGC0LXQu9GPINCy0L7Qt9C90LjQutC70LAg0L3QtdC/0L7Qu9Cw0LTQutCwLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4i0J/RgNC4INC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC4IFNELdC60LDRgNGC0Ysg0LrQsNC6IFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjyDQstC+0LfQvdC40LrQu9CwINC90LXQv9C+0LvQsNC00LrQsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iVVNCLdC/0L7QtNC60LvRjtGH0LXQvdC40LUg0YPRgdGC0LDQvdC+0LLQu9C10L3QviI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+ItCS0YvQsdC10YDQuNGC0LUg0LrQvtC/0LjRgNC+0LLQsNC90LjQtSDRhNCw0LnQu9C+0LIg0L3QsCDQutC+0LzQv9GM0Y7RgtC10YAg0LjQu9C4INGBINC60L7QvNC/0YzRjtGC0LXRgNCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+ItCS0YvQutC70Y7Rh9C40YLRjCBVU0It0L3QsNC60L7Qv9C40YLQtdC70YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjU5MTgxMzQ5MDI2OTg0MTUzOSI+ItCS0YvQsdC10YDQuNGC0LUsINGH0YLQvtCx0Ysg0LLRi9C60LvRjtGH0LjRgtGMIFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iVVNCLdC90LDQutC+0L/QuNGC0LXQu9GMINC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4i0J/QtdGA0LXQtCDQvtGC0LrQu9GO0YfQtdC90LjQtdC8IFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjyDRg9Cx0LXQtNC40YLQtdGB0YwsINGH0YLQviBTRC3QutCw0YDRgtCwINGD0YHRgtGA0L7QudGB0YLQstCwIEFuZHJvaWQg0LHRi9C70LAg0L7RgtC60LvRjtGH0LXQvdCwINC+0YIg0LrQvtC80L/RjNGO0YLQtdGA0LAuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+ItCf0LXRgNC10LQg0L7RgtC60LvRjtGH0LXQvdC40LXQvCBVU0It0L3QsNC60L7Qv9C40YLQtdC70Y8g0YPQsdC10LTQuNGC0LXRgdGMLCDRh9GC0L4gU0Qt0LrQsNGA0YLQsCDRg9GB0YLRgNC+0LnRgdGC0LLQsCBBbmRyb2lkINCx0YvQu9CwINC+0YLQutC70Y7Rh9C10L3QsCDQvtGCINC60L7QvNC/0YzRjtGC0LXRgNCwLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiLQn9C10YDQtdC0INC+0YLQutC70Y7Rh9C10L3QuNC10LwgVVNCLdC90LDQutC+0L/QuNGC0LXQu9GPINGD0LHQtdC00LjRgtC10YHRjCwg0YfRgtC+IFNELdC60LDRgNGC0LAg0YPRgdGC0YDQvtC50YHRgtCy0LAgQW5kcm9pZCDQsdGL0LvQsCDQvtGC0LrQu9GO0YfQtdC90LAg0L7RgiDQutC+0LzQv9GM0Y7RgtC10YDQsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiLQktGL0LrQu9GO0YfQuNGC0YwgVVNCLdC90LDQutC+0L/QuNGC0LXQu9GMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMTQzODgxOTE0ODQwNDEyMTA4Ij4i0J/RgNC4INCy0YvQutC70Y7Rh9C10L3QuNC4IFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjyDQv9GA0L7QuNC30L7RiNC70LAg0L3QtdC/0L7Qu9Cw0LTQutCwLiDQo9Cx0LXQtNC40YLQtdGB0YwsINGH0YLQviBVU0It0YXQvtGB0YIg0L7RgtC60LvRjtGH0LXQvSwg0Lgg0L/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+ItCS0LrQu9GO0YfQtdC90LjQtSBVU0It0L3QsNC60L7Qv9C40YLQtdC70Y8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiLQn9GA0Lgg0LLQutC70Y7Rh9C10L3QuNC4IFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjyDQvdC10LrQvtGC0L7RgNGL0LUg0LjRgdC/0L7Qu9GM0LfRg9C10LzRi9C1INC/0YDQuNC70L7QttC10L3QuNGPINC80L7Qs9GD0YIg0L/RgNC10LrRgNCw0YLQuNGC0Ywg0YDQsNCx0L7RgtGDINC4INC+0YHRgtCw0LLQsNGC0YzRgdGPINC90LXQtNC+0YHRgtGD0L/QvdGL0LzQuCDQtNC+INC+0YLQutC70Y7Rh9C10L3QuNGPIFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4i0KHQsdC+0Lkg0L7Qv9C10YDQsNGG0LjQuCBVU0It0L/QvtC00LrQu9GO0YfQtdC90LjRjyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiLQntCaIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiLQntGH0LjRgdGC0LjRgtGMIFNELdC60LDRgNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4i0J7Rh9C40YHRgtC40YLRjCBTRC3QutCw0YDRgtGDIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+ItCe0YLRhNC+0YDQvNCw0YLQuNGA0L7QstCw0YLRjCDQutCw0YDRgtGDIFNEPyDQktGB0LUg0LTQsNC90L3Ri9C1LCDQvdCw0YXQvtC00Y/RidC40LXRgdGPINC90LAg0LrQsNGA0YLQtSwg0LHRg9C00YPRgiDRg9C90LjRh9GC0L7QttC10L3Riy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiLQntGC0YTQvtGA0LzQsNGC0LjRgNC+0LLQsNGC0Ywg0LrQsNGA0YLRgyBTRD8g0JLRgdC1INC00LDQvdC90YvQtSwg0L3QsNGF0L7QtNGP0YnQuNC10YHRjyDQvdCwINC60LDRgNGC0LUsINCx0YPQtNGD0YIg0YPQvdC40YfRgtC+0LbQtdC90YsuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+ItCe0YfQuNGB0YLQuNGC0YwgU0Qt0LrQsNGA0YLRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+ItCe0YLRhNC+0YDQvNCw0YLQuNGA0L7QstCw0YLRjCDQutCw0YDRgtGDIFNEPyDQktGB0LUg0LTQsNC90L3Ri9C1LCDQvdCw0YXQvtC00Y/RidC40LXRgdGPINC90LAg0LrQsNGA0YLQtSwg0LHRg9C00YPRgiDRg9C90LjRh9GC0L7QttC10L3Riy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiLQpNC+0YDQvNCw0YIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiLQntGC0LvQsNC00LrQsCDQv9C+IFVTQiDRgNCw0LfRgNC10YjQtdC90LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODQ3MDI5NjgxODI3MDExMDM5NiI+ItCd0LDQttC80LjRgtC1LCDRh9GC0L7QsdGLINC+0YLQutC70Y7Rh9C40YLRjCDQvtGC0LvQsNC00LrRgyBVU0IuIjwvc3RyaW5nPgpAQCAtODM3LDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4i0LLQsNGA0LjQsNC90YLRiyI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiLQn9C+0LTQs9C+0YLQvtCy0LrQsCDQutCw0YDRgtGLIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiLQn9C+0LTQs9C+0YLQvtCy0LrQsCDQutCw0YDRgtGLIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiLQn9C+0LTQs9C+0YLQvtCy0LrQsCDQutCw0YDRgtGLIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+ItCf0YDQvtCy0LXRgNC60LAg0L7RiNC40LHQvtC6LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiLQn9GD0YHRgtCw0Y8g0LrQsNGA0YLQsCBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+ItCf0YPRgdGC0LDRjyDQutCw0YDRgtCwIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTMxMjI2NjgyMDA5Mjk1ODAxNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTYwNjY2MDc1NjEyNDYyOTcwOCI+ItCa0LDRgNGC0LAgU0Qg0L/Rg9GB0YLQsCDQuNC70Lgg0LjRgdC/0L7Qu9GM0LfRg9C10YIg0L3QtdC/0L7QtNC00LXRgNC20LjQstCw0LXQvNGD0Y4g0YTQsNC50LvQvtCy0YPRjiDRgdC40YHRgtC10LzRgy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTRC3QutCw0YDRgtCwINC/0YPRgdGC0LAg0LjQu9C4INC40YHQv9C+0LvRjNC30YPQtdGCINC90LXQv9C+0LTQtNC10YDQttC40LLQsNC10LzRg9GOINGE0LDQudC70L7QstGD0Y4g0YHQuNGB0YLQtdC80YMiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiLQn9C+0LLRgNC10LbQtNC10L3QvdCw0Y8g0LrQsNGA0YLQsCBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4i0J/QvtCy0YDQtdC20LTQtdC90L3QsNGPINC60LDRgNGC0LAgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+ItCa0LDRgNGC0LAgU0Qg0L/QvtCy0YDQtdC20LTQtdC90LAuINCS0L7Qt9C80L7QttC90L4sINC/0L7RgtGA0LXQsdGD0LXRgtGB0Y8g0L7RgtGE0L7RgNC80LDRgtC40YDQvtCy0LDRgtGMINC10LUuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNELdC60LDRgNGC0LAg0L/QvtCy0YDQtdC20LTQtdC90LAuINCf0L7Qv9GA0L7QsdGD0LnRgtC1INC+0YLRhNC+0YDQvNCw0YLQuNGA0L7QstCw0YLRjCDQtdC1LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4i0JrQsNGA0YLQsCBTRCDQvdC10L7QttC40LTQsNC90L3QviDQuNC30LLQu9C10YfQtdC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4i0JrQsNGA0YLQsCBTRCDQvdC10L7QttC40LTQsNC90L3QviDQuNC30LLQu9C10YfQtdC90LAiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4i0J/QtdGA0LXQtCDQuNC30LLQu9C10YfQtdC90LjQtdC8INC60LDRgNGC0YsgU0Qg0L7RgtC60LvRjtGH0LjRgtC1INC10LUg0LLQviDQuNC30LHQtdC20LDQvdC40LUg0L/QvtGC0LXRgNC4INC00LDQvdC90YvRhS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLQn9C10YDQtdC0INC40LfQstC70LXRh9C10L3QuNC10Lwg0LrQsNGA0YLRiyBTRCDQvtGC0LrQu9GO0YfQuNGC0LUg0LXQtSDQstC+INC40LfQsdC10LbQsNC90LjQtSDQv9C+0YLQtdGA0Lgg0LTQsNC90L3Ri9GFLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4i0JHQtdC30L7Qv9Cw0YHQvdC+0LUg0YPQtNCw0LvQtdC90LjQtSDQutCw0YDRgtGLIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4i0JHQtdC30L7Qv9Cw0YHQvdC+0LUg0YPQtNCw0LvQtdC90LjQtSDQutCw0YDRgtGLIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4i0KLQtdC/0LXRgNGMINC60LDRgNGC0YMgU0Qg0LzQvtC20L3QviDQsdC10LfQvtC/0LDRgdC90L4g0YPQtNCw0LvQuNGC0YwuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+ItCc0L7QttC90L4g0LHQtdC30L7Qv9Cw0YHQvdC+INC40LfQstC70LXRh9GMIFNELdC60LDRgNGC0YMuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiLQntGC0YHRg9GC0YHRgtCy0YPQtdGCINC60LDRgNGC0LAgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4i0J7RgtGB0YPRgtGB0YLQstGD0LXRgiDQutCw0YDRgtCwIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+ItCa0LDRgNGC0LAgU0Qg0L7RgtGB0YPRgtGB0YLQstGD0LXRgi4g0JTQu9GPINGD0LLQtdC70LjRh9C10L3QuNGPINC10LzQutC+0YHRgtC4INGD0YHRgtGA0L7QudGB0YLQstCwINCy0YHRgtCw0LLRjNGC0LUg0L3QvtCy0YPRjiDQutCw0YDRgtGDIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNELdC60LDRgNGC0LAg0LjQt9Cy0LvQtdGH0LXQvdCwLiDQktGB0YLQsNCy0YzRgtC1INC90L7QstGD0Y4g0LrQsNGA0YLRgy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiLQn9GD0YHRgtCw0Y8g0LrQsNGA0YLQsCBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNELdC60LDRgNGC0LAg0L/Rg9GB0YLQsCDQuNC70Lgg0LjRgdC/0L7Qu9GM0LfRg9C10YIg0L3QtdC/0L7QtNC00LXRgNC20LjQstCw0LXQvNGD0Y4g0YTQsNC50LvQvtCy0YPRjiDRgdC40YHRgtC10LzRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4i0J/QvtCy0YDQtdC20LTQtdC90L3QsNGPINC60LDRgNGC0LAgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qt0LrQsNGA0YLQsCDQv9C+0LLRgNC10LbQtNC10L3QsC4g0J/QvtC/0YDQvtCx0YPQudGC0LUg0L7RgtGE0L7RgNC80LDRgtC40YDQvtCy0LDRgtGMINC10LUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+ItCa0LDRgNGC0LAgU0Qg0L3QtdC+0LbQuNC00LDQvdC90L4g0LjQt9Cy0LvQtdGH0LXQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4i0J/QtdGA0LXQtCDQuNC30LLQu9C10YfQtdC90LjQtdC8INC60LDRgNGC0YsgU0Qg0L7RgtC60LvRjtGH0LjRgtC1INC10LUg0LLQviDQuNC30LHQtdC20LDQvdC40LUg0L/QvtGC0LXRgNC4INC00LDQvdC90YvRhS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiLQkdC10LfQvtC/0LDRgdC90L7QtSDRg9C00LDQu9C10L3QuNC1INC60LDRgNGC0YsgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4i0JzQvtC20L3QviDQsdC10LfQvtC/0LDRgdC90L4g0LjQt9Cy0LvQtdGH0YwgU0Qt0LrQsNGA0YLRgy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4i0J7RgtGB0YPRgtGB0YLQstGD0LXRgiDQutCw0YDRgtCwIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qt0LrQsNGA0YLQsCDQuNC30LLQu9C10YfQtdC90LAuINCS0YHRgtCw0LLRjNGC0LUg0L3QvtCy0YPRjiDQutCw0YDRgtGDLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4i0J/QvtC00YXQvtC00Y/RidC40YUg0LTQtdC50YHRgtCy0LjQuSDQvdC1INC90LDQudC00LXQvdC+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+ItC+0LHQvdC+0LLQu9GP0YLRjCDRgdGC0LDRgtC40YHRgtC40LrRgyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQutC+0LzQv9C+0L3QtdC90YLQvtCyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQuNC30LzQtdC90Y/RgtGMINGB0L7QsdGA0LDQvdC90YPRjiDRgdGC0LDRgtC40YHRgtC40LrRgyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQutC+0LzQv9C+0L3QtdC90YLQvtCyLiDQndC1INC/0YDQtdC00L3QsNC30L3QsNGH0LXQvdC+INC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQvtCx0YvRh9C90YvQvNC4INC/0YDQuNC70L7QttC10L3QuNGP0LzQuC4iPC9zdHJpbmc+CkBAIC04OTQsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDQv9GA0LXQtNCyLiDQvtCx0YkuINC60LvRjtGH0LApIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDRgdC10YDRgtC40YTQuNC60LDRgtCwKSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+ItCS0YvQsdGA0LDRgtGMINGE0LDQudC7Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i0J3QtSDQstGL0LHRgNCw0L0g0YTQsNC50LsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLQodCx0YDQvtGB0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+ItCe0YLQv9GA0LDQstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i0LjQt9Cx0YDQsNC90L3QvtC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i0KDQtdC20LjQvCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4INCy0LrQu9GO0YfQtdC9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+ItCS0YvQsdC10YDQuNGC0LUg0LTQu9GPINCy0YvRhdC+0LTQsCDQuNC3INGA0LXQttC40LzQsCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJVU0It0LzQvtC00LXQvCDQuNC70Lgg0YLQvtGH0LrQsCDQtNC+0YHRgtGD0L/QsCBXaS1GaSDQsNC60YLQuNCy0L3RiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+ItCd0LDQttC80LjRgtC1INC00LvRjyDQvdCw0YHRgtGA0L7QudC60LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLQndCw0LfQsNC0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i0JTQsNC70LXQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+ItCf0YDQvtC/0YPRgdGC0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i0JDQutGC0LjQstC90LDRjyDQv9C10YDQtdC00LDRh9CwINC00LDQvdC90YvRhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i0J3QsNC20LzQuNGC0LUsINGH0YLQvtCx0Ysg0YPQt9C90LDRgtGMINCx0L7Qu9GM0YjQtSDQviDQvNC+0LHQuNC70YzQvdC+0Lkg0L/QtdGA0LXQtNCw0YfQtSDQtNCw0L3QvdGL0YUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+ItCf0YDQtdCy0YvRiNC10L0g0LvQuNC80LjRgiDQvdCwINC80L7QsdC40LvRjNC90YvQtSDQtNCw0L3QvdGL0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4i0J3QsNC20LzQuNGC0LUsINGH0YLQvtCx0Ysg0YPQt9C90LDRgtGMINCx0L7Qu9GM0YjQtSDQviDQvNC+0LHQuNC70YzQvdC+0Lkg0L/QtdGA0LXQtNCw0YfQtSDQtNCw0L3QvdGL0YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+ItCd0LXRgiDRgdC+0LLQv9Cw0LTQtdC90LjQuSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiLQndCw0LnRgtC4INC90LAg0YHRgtGA0LDQvdC40YbQtSI8L3N0cmluZz4KKyAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjgxNjcxNDcwODExMzY1Nzk0MzkiPiIxINGB0L7QstC/0LDQtNC10L3QuNC1IjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4g0LjQtyA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKaW5kZXggOGJjNTk4ZC4uNDE4YThlNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+IlV0dmVja2xpbmdzdmVya3R5ZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiJGdW5rdGlvbmVyIHNvbSBlbmRhc3QgYmVow7Z2cyBmw7ZyIHByb2dyYW11dHZlY2tsYXJlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9zdG9yYWdlIiBtc2dpZD0iMTk3MTExODc3MDU0NjMzNjk2NiI+IkxhZ3JpbmciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IkbDpSDDpXRrb21zdCB0aWxsIFNELWtvcnRldC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iRsOlIMOldGtvbXN0IHRpbGwgU0Qta29ydGV0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJGw6Ugw6V0a29tc3QgdGlsbCBTRC1rb3J0ZXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4iaW5ha3RpdmVyYSBlbGxlciDDpG5kcmEgc3RhdHVzZsOkbHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iVGlsbMOldGVyIGF0dCBwcm9ncmFtbWV0IGluYWt0aXZlcmFyIHN0YXR1c2bDpGx0ZXQgZWxsZXIgbMOkZ2dlciB0aWxsIG9jaCB0YXIgYm9ydCBzeXN0ZW1pa29uZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+InN0YXR1c2bDpGx0Ijwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIGZyaWfDtnIgbGFncmluZ3N1dHJ5bW1lIGkgdGVsZWZvbmVuIGdlbm9tIGF0dCB0YSBib3J0IGZpbGVyIGkgcHJvZ3JhbW1ldHMga2F0YWxvZyBmw7ZyIGNhY2hlbGFncmluZy4gw4V0a29tc3Qgw6RyIG15Y2tldCBiZWdyw6Ruc2FkLCB2YW5saWd0dmlzIHRpbGwgc3lzdGVtcHJvY2Vzc2VyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiJGbHl0dGEgcHJvZ3JhbXJlc3Vyc2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBmbHl0dGFyIHByb2dyYW1yZXN1cnNlciBmcsOlbiBpbnRlcm5hIHRpbGwgZXh0ZXJuYSBtZWRpZXIgb2NoIHR2w6RydCBvbS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+ImzDpHNhIGvDpG5zbGlnYSBsb2dnZGF0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gbMOkc2VyIGZyw6VuIHN5c3RlbWV0cyBvbGlrYSBsb2dnZmlsZXIuIERldCBpbm5lYsOkciBhdHQgcHJvZ3JhbW1ldCBrYW4gdXBwdMOkY2thIGFsbG3DpG4gaW5mb3JtYXRpb24gb20gdmFkIGR1IGfDtnIgbWVkIHRlbGVmb25lbiwgdmlsa2V0IGthbiBpbmtsdWRlcmEgcGVyc29ubGlnIGVsbGVyIHByaXZhdCBpbmZvcm1hdGlvbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJsw6RzYS9za3JpdmEgdGlsbCByZXN1cnNlciBzb20gw6RncyBhdiBkaWFnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIGzDpHNlciBvY2ggc2tyaXZlciB0aWxsIGVuIHJlc3VycyBzb20gw6RncyBhdiBkaWFnLWdydXBwZW47IHRpbGwgZXhlbXBlbCBmaWxlciBpIC9kZXYuIERldHRhIGthbiBldmVudHVlbGx0IHDDpXZlcmthIHN5c3RlbWV0cyBzdGFiaWxpdGV0IG9jaCBzw6RrZXJoZXQuIERldHRhIGLDtnIgRU5EQVNUIGFudsOkbmRzIGF2IHRpbGx2ZXJrYXJlbiBlbGxlciBvcGVyYXTDtnJlbiBmw7ZyIG1hc2tpbnZhcnVzcGVjaWZpayBkaWFnbm9zdGlrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29tcG9uZW50U3RhdGUiIG1zZ2lkPSI3OTQyNTE5ODgzNDMyOTQwNiI+ImFrdGl2ZXJhIGVsbGVyIGluYWt0aXZlcmEgcHJvZ3JhbWtvbXBvbmVudGVyIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBrb25maWd1cmVyYXIgZGVuIGxva2FsYSBCbHVldG9vdGgtdGVsZWZvbmVuIHNhbXQgdXBwdMOkY2tlciBvY2ggcGFya29wcGxhciBkZW4gbWVkIGZqw6RycmFuc2x1dG5hIGVuaGV0ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4ic2thcGEgQmx1ZXRvb3RoLWFuc2x1dG5pbmdhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gc2VyIGRlbiBsb2thbGEgQmx1ZXRvb3RoLXRlbGVmb25lbnMga29uZmlndXJhdGlvbiwgb2NoIHNrYXBhciBvY2ggYWNjZXB0ZXJhciBhbnNsdXRuaW5nYXIgbWVkIHBhcmtvcHBsYWRlIGVuaGV0ZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjQWRtaW4gKDIyNTEzMDIyMzMwMTIyNTAwNTYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjQWRtaW4gKDE5MzU4NDI2MTE0NjQ4OTU3ODUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNSYXcgKDQ0MjM0NzE3MTExMTQzMjU3MDgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjUmF3ICg1NTMzMDIyNzM2NTU5Mzg1NjY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTm90aWZ5ICg0Nzg0NzAzNjAwODI3OTIzNTgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTm90aWZ5ICgyOTkwMDUzNTE3OTYyMDcwNjE3KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTGxjcCAoNDk3MjA1MTQ2MTAwNzAzMDQyNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNMbGNwICg5MTU5MjEyNzc4NjAwNDY0MCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+ImluYWt0aXZlcmEgdGFuZ2VudGzDpXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBpbmFrdGl2ZXJhciB0YW5nZW50bMOlc2V0IG9jaCB0aWxsaMO2cmFuZGUgbMO2c2Vub3Jkc3NreWRkLiBFdHQgZXhlbXBlbCBww6UgZGV0dGEgw6RyIGF0dCB0ZWxlZm9uZW4gaW5ha3RpdmVyYXIgdGFuZ2VudGzDpXNldCB2aWQgaW5rb21tYW5kZSBzYW10YWwgb2NoIHNlZGFuIGFrdGl2ZXJhciBkZXQgaWdlbiBuw6RyIHNhbXRhbGV0IMOkciBhdnNsdXRhdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4ibMOkc2Egc3lua3JvbmlzZXJpbmdzaW5zdMOkbGxuaW5nYXIiPC9zdHJpbmc+CkBAIC00MzUsMjIgKzQyMCwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSIxMDgyOTcyNjAzNTc2MzYwNjkwIj4iVGlsbMOldCBhdHQgZXR0IHByb2dyYW0gbMOkc2VyIGFsbGEgcHJpdmF0YSBvcmQsIG5hbW4gb2NoIGZyYXNlciBzb20gYW52w6RuZGFyZW4gbGFncmFyIGkgc2luIG9yZGxpc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+InNrcml2YSB0aWxsIGFudsOkbmRhcmRlZmluaWVyYWQgb3JkbGlzdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBza3JpdmVyIGluIG55YSBvcmQgaSBhbnbDpG5kYXJvcmRsaXN0YW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiLDpG5kcmEvdGEgYm9ydCBpbm5laMOlbGwgcMOlIFNELWtvcnRldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iw6RuZHJhL3RhIGJvcnQgaW5uZWjDpWxsIHDDpSBTRC1rb3J0ZXQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBza3JpdmVyIHRpbGwgU0Qta29ydGV0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gc2tyaXZlciB0aWxsIFNELWtvcnRldC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IsOkbmRyYS90YSBib3J0IGlubmVow6VsbCBww6UgU0Qta29ydGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBza3JpdmVyIHRpbGwgU0Qta29ydGV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiLDpXRrb21zdCB0aWxsIGNhY2hlZmlsc3lzdGVtZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gbMOkc2VyIG9jaCBza3JpdmVyIHRpbGwgY2FjaGVmaWxzeXN0ZW1ldC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiJCZWdyw6Ruc2EgbMO2c2Vub3JkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IkJlZ3LDpG5zYXIgdmlsa2EgdHlwZXIgYXYgbMO2c2Vub3JkIHNvbSBmw6VyIGFudsOkbmRhcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+IlZpc2EgaW5sb2dnbmluZ3Nmw7Zyc8O2ayI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiLDlnZlcnZha2EgbWlzc2x5Y2thZGUgaW5sb2dnbmluZ3Nmw7Zyc8O2ayBww6UgZW5oZXRlbiBmw7ZyIGF0dCB1dGbDtnJhIMOldGfDpHJkZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4iw4V0ZXJzdMOkbGwgbMO2c2Vub3JkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IkZyYW10dmluZ2EgZXR0IG55dHQgdsOkcmRlIGbDtnIgZGl0dCBsw7ZzZW5vcmQuIEtyw6R2ZXIgYXR0IGFkbWluaXN0cmF0w7ZyZW4gdGlsbGhhbmRhaMOlbGxlciBkZXQgaW5uYW4gZHUga2FuIGxvZ2dhIGluLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iRnJhbXR2aW5nYSBsw6VzbmluZyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IktvbnRyb2xsZXJhIG7DpHIgZW5oZXRlbiBsw6VzZXMsIHZpbGtldCBrcsOkdmVyIGF0dCBkdSBhbmdlciBsw7ZzZW5vcmRldCBpZ2VuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IkJlZ3LDpG5zYSBsw7ZzZW5vcmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iQmVncsOkbnNhciB2aWxrYSB0eXBlciBhdiBsw7ZzZW5vcmQgc29tIGbDpXIgYW52w6RuZGFzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+IlZpc2EgaW5sb2dnbmluZ3Nmw7Zyc8O2ayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiLDlnZlcnZha2EgbWlzc2x5Y2thZGUgaW5sb2dnbmluZ3Nmw7Zyc8O2ayBww6UgZW5oZXRlbiBmw7ZyIGF0dCB1dGbDtnJhIMOldGfDpHJkZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iw4V0ZXJzdMOkbGwgbMO2c2Vub3JkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IkZyYW10dmluZ2EgZXR0IG55dHQgdsOkcmRlIGbDtnIgZGl0dCBsw7ZzZW5vcmQuIEtyw6R2ZXIgYXR0IGFkbWluaXN0cmF0w7ZyZW4gdGlsbGhhbmRhaMOlbGxlciBkZXQgaW5uYW4gZHUga2FuIGxvZ2dhIGluLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iRnJhbXR2aW5nYSBsw6VzbmluZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2xsZXJhIG7DpHIgZW5oZXRlbiBsw6VzZXMsIHZpbGtldCBrcsOkdmVyIGF0dCBkdSBhbmdlciBsw7ZzZW5vcmRldCBpZ2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJSYWRlcmEgYWxsYSBkYXRhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiLDhXRlcnN0w6RsbCBmYWJyaWtzaW5zdMOkbGxuaW5nYXJuYSBvY2ggdGEgYm9ydCBhbGxhIGRhdGEgdXRhbiBuw6Vnb24gYmVrcsOkZnRlbHNlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iw4V0ZXJzdMOkbGwgZmFicmlrc2luc3TDpGxsbmluZ2FybmEgb2NoIHRhIGJvcnQgYWxsYSBkYXRhIHV0YW4gbsOlZ29uIGJla3LDpGZ0ZWxzZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiJBbmdlIHZpbGtlbiBnbG9iYWwgcHJveHlzZXJ2ZXIgc29tIHNrYSBhbnbDpG5kYXMgbsOkciBwb2xpY3luIMOkciBha3RpdmVyYWQuIEVuZGFzdCBkZW4gZsO2cnN0YSBlbmhldHNhZG1pbmlzdHJhdMO2cmVuIGFuZ2VyIGRlbiBmYWt0aXNrYSBnbG9iYWxhIHByb3h5c2VydmVybi4iPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJIZW0iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01NDQsMTQgKzUzMCwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkFyYmV0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLDlnZyaWd0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IkFucGFzc2FkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVDdXN0b20iIG1zZ2lkPSIyNDczNTgwNTkzMTExNTkwOTQ1Ij4iQW5wYXNzYWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUhvbWUiIG1zZ2lkPSI2MDkzNTk4MTgxMDY5MzU5Mjk1Ij4iU3RhcnRzaWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+IkFyYmV0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlT3RoZXIiIG1zZ2lkPSI0NDA4NDM2MTYyOTUwMTE5ODQ5Ij4iw5Z2cmlndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVDdXN0b20gKDI0NzM1ODA1OTMxMTE1OTA5NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVIb21lICg2MDkzNTk4MTgxMDY5MzU5Mjk1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlV29yayAoNjkyMDcyNTczMDc5NzA5OTA0NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iQW5nZSBQSU4ta29kIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJBbmdlIGzDtnNlbm9yZCBmw7ZyIGF0dCBsw6VzYSB1cHAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkFuZ2UgUElOLWtvZCBmw7ZyIGF0dCBsw6VzYSB1cHAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJGZWwgUElOLWtvZCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iVHJ5Y2sgcMOlIE1lbnUgb2NoIHNlZGFuIHDDpSAwIG9tIGR1IHZpbGwgbMOlc2EgdXBwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7Zkc2FtdGFsc251bW1lciI8L3N0cmluZz4KQEAgLTU2NCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLDhXRlcmfDpSB0aWxsIHNhbXRhbGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iS29ycmVrdCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iRsO2cnPDtmsgaWdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iRsO2cnPDtmsgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkxhZGRhciAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iTGFkZGFkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTc4LDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta29ydGV0IMOkciBsw6VzdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJMw6VzZXIgdXBwIFNJTS1rb3J04oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHJpdGF0IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBhbmdldHQgZmVsIGzDtnNlbm9yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJEdSBoYXIgYW5nZXR0IGRpbiBQSU4ta29kIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iRHUgaGFyIHJpdGF0IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiBFZnRlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBmw7Zyc8O2ayB0aWxsIGtvbW1lciBkdSBhdHQgdXBwbWFuYXMgYXR0IGzDpXNhIHVwcCB0ZWxlZm9uZW4gbWVkIGRpbiBHb29nbGUtaW5sb2dnbmluZy4iXG5cbiIgRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJHbMO2bXQgZGl0dCBncmFmaXNrYSBsw7ZzZW5vcmQ/Ijwvc3RyaW5nPgpAQCAtNjA2LDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IlZpbGwgZHUgbMOkbW5hIGRlbiBow6RyIGRlbiBow6RyIHNpZGFuPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJUcnljayBww6UgT0sgb20gZHUgdmlsbCBmb3J0c8OkdHRhIGVsbGVyIHDDpSBBdmJyeXQgb20gZHUgdmlsbCB2YXJhIGt2YXIgcMOlIGRlbiBha3R1ZWxsYSBzaWRhbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkJla3LDpGZ0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iVGlwcyEgRHViYmVsa2xpY2thIG9tIGR1IHZpbGwgem9vbWEgaW4gZWxsZXIgdXQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4ibMOkc2Egd2ViYmzDpHNhcmhpc3RvcmlrIG9jaCBib2ttw6Rya2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iVGlsbMOldGVyIGF0dCBwcm9ncmFtIGzDpHNlciBhbGxhIHdlYmJhZHJlc3NlciBzb20gd2ViYmzDpHNhcmVuIGhhciDDtnBwbmF0IG9jaCBhbGxhIHdlYmJsw6RzYXJlbnMgYm9rbcOkcmtlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJza3JpdmEgd2ViYmzDpHNhcmhpc3RvcmlrIG9jaCBib2ttw6Rya2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSDDpG5kcmFyIHdlYmJsw6RzYXJoaXN0b3Jpa2VuIG9jaCBib2ttw6Rya2VuYSBpIGRpbiB0ZWxlZm9uLiBTa2FkbGlnYSBwcm9ncmFtIGthbiBhbnbDpG5kYSBkZXR0YSBmw7ZyIGF0dCB0YSBib3J0IGVsbGVyIMOkbmRyYSBkYXRhIGkgd2ViYmzDpHNhcmVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4iw4RuZHJhIGdlb2dyYWZpc2sgcGxhdHMgZsO2ciB3ZWJibMOkc2FyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSDDpG5kcmFyIHdlYmJsw6RzYXJlbnMgYmVow7ZyaWdoZXRlciBmw7ZyIGdlb2dyYWZpc2sgcGxhdHMuIFNrYWRsaWdhIHByb2dyYW0ga2FuIGFudsOkbmRhIGRldHRhIGbDtnIgYXR0IHRpbGzDpXRhIGF0dCBwbGF0c2luZm9ybWF0aW9uIHNraWNrYXMgdGlsbCBnb2R0eWNrbGlnYSB3ZWJicGxhdHNlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJWaWxsIGR1IGF0dCB3ZWJibMOkc2FyZW4gc2thIGtvbW1hIGlow6VnIGzDtnNlbm9yZGV0PyI8L3N0cmluZz4KQEAgLTcyNiwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVsOkbGogYWxsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iVsOkbGogb3JkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktsaXBwIHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXJhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iS2xpc3RyYSBpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyYSB3ZWJiYWRyZXNzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iTWFya2VyYSB0ZXh0Li4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlRleHRtYXJrZXJpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJJbmRhdGFtZXRvZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJMw6RnZyB0aWxsIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGkgb3JkbGlzdGFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iUmVkaWdlcmEgdGV4dCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+IlRleHTDpXRnw6RyZGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJEw6VsaWd0IG1lZCB1dHJ5bW1lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iVGVsZWZvbmVucyBsYWdyaW5nc3V0cnltbWUgaMOlbGxlciBww6UgYXR0IHRhIHNsdXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03NDEsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkF2YnJ5dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJPYnMhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJMw6RzZXIgaW4uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlDDhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkFWIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJTbHV0ZsO2ciDDpXRnw6RyZCBnZW5vbSBhdHQgYW52w6RuZGEiPC9zdHJpbmc+CkBAIC03NTksOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJUdmluZ2EgZnJhbSBlbiBzdMOkbmduaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlJhcHBvcnRlcmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IlbDpG50YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlByb2dyYW1tZXQgb21kaXJpZ2VyYWRlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBrw7Zycy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gc3RhcnRhZGVzIGbDtnJzdC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iUHJvZ3JhbW1ldCA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzZW4gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYXIgYnJ1dGl0IG1vdCBzaW4gZWdlbiBTdHJpY3RNb2RlLXBvbGljeS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXNzZW4gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhciBicnV0aXQgbW90IHNpbiBlZ2VuIFN0cmljdE1vZGUtcG9saWN5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4ga8O2cnMiPC9zdHJpbmc+CkBAIC04MDgsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iVmlzYSBhbGxhIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQi1tYXNzbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQi1hbnNsdXRlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IkR1IGhhciBhbnNsdXRpdCB0ZWxlZm9uZW4gdGlsbCBkYXRvcm4gdmlhIFVTQi4gVsOkbGoga25hcHBlbiBuZWRhbiBvbSBkdSB2aWxsIGtvcGllcmEgZmlsZXIgbWVsbGFuIGRhdG9ybiBvY2ggU0Qta29ydGV0IGkgZGluIEFuZHJvaWQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJEdSBoYXIgYW5zbHV0aXQgdGVsZWZvbmVuIHRpbGwgZGF0b3JuIHZpYSBVU0IuIFbDpGxqIGtuYXBwZW4gbmVkYW4gb20gZHUgdmlsbCBrb3BpZXJhIGZpbGVyIG1lbGxhbiBkYXRvcm4gb2NoIFNELWtvcnRldCBpIGRpbiBBbmRyb2lkLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iRHUgaGFyIGFuc2x1dGl0IHRlbGVmb25lbiB0aWxsIGRhdG9ybiB2aWEgVVNCLiBWw6RsaiBrbmFwcGVuIG5lZGFuIG9tIGR1IHZpbGwga29waWVyYSBmaWxlciBtZWxsYW4gZGF0b3JuIG9jaCBTRC1rb3J0ZXQgaSBkaW4gQW5kcm9pZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iQWt0aXZlcmEgVVNCLWxhZ3JpbmciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJEZXQgZ2ljayBpbnRlIGF0dCBhbnbDpG5kYSBkaXR0IFNELWtvcnQgZsO2ciBVU0ItbGFncmluZy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkRldCBnaWNrIGludGUgYXR0IGFudsOkbmRhIGRpdHQgU0Qta29ydCBmw7ZyIFVTQi1sYWdyaW5nLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iRGV0IGdpY2sgaW50ZSBhdHQgYW52w6RuZGEgZGl0dCBTRC1rb3J0IGbDtnIgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQi1hbnNsdXRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IlbDpGxqIG9tIGR1IHZpbGwga29waWVyYSBmaWxlciB0aWxsL2Zyw6VuIGRpbiBkYXRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJJbmFrdGl2ZXJhIFVTQi1sYWdyaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJWw6RsaiBvbSBVU0ItbGFncmluZyBza2EgaW5ha3RpdmVyYXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlVTQi1sYWdyZXQgYW52w6RuZHMiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IktvbnRyb2xsZXJhIGF0dCBkdSBoYXIgZGVtb250ZXJhdCAoXCJtYXRhdCB1dFwiKSBBbmRyb2lkLXRlbGVmb25lbnMgU0Qta29ydCBmcsOlbiBkYXRvcm4sIGlubmFuIGR1IGluYWt0aXZlcmFyIFVTQi1sYWdyaW5nLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJLb250cm9sbGVyYSBhdHQgZHUgaGFyIGRlbW9udGVyYXQgKFwibWF0YXQgdXRcIikgQW5kcm9pZC10ZWxlZm9uZW5zIFNELWtvcnQgZnLDpW4gZGF0b3JuLCBpbm5hbiBkdSBpbmFrdGl2ZXJhciBVU0ItbGFncmluZy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iS29udHJvbGxlcmEgYXR0IGR1IGhhciBkZW1vbnRlcmF0IChcIm1hdGF0IHV0XCIpIEFuZHJvaWQtdGVsZWZvbmVucyBTRC1rb3J0IGZyw6VuIGRhdG9ybiwgaW5uYW4gZHUgaW5ha3RpdmVyYXIgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iSW5ha3RpdmVyYSBVU0ItbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IkV0dCBwcm9ibGVtIHVwcHN0b2QgbsOkciBVU0ItbGFncmluZ3NwbGF0c2VuIHNrdWxsZSBpbmFrdGl2ZXJhcy4gS29udHJvbGxlcmEgYXR0IFVTQi12w6RyZGVuIGhhciBkZW1vbnRlcmF0cyBvY2ggZsO2cnPDtmsgaWdlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJBa3RpdmVyYSBVU0ItbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+Ik9tIGR1IGFrdGl2ZXJhciBVU0ItbGFncmluZyBhdmJyeXRzIG7DpWdyYSBhdiBkZSBwcm9ncmFtIHNvbSBrw7ZycyBvY2ggZGUga2Fuc2tlIGludGUgYmxpciB0aWxsZ8OkbmdsaWdhIGlnZW4gZsO2cnLDpG4gZHUgaW5ha3RpdmVyYXIgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQi3DpXRnw6RyZCBtaXNzbHlja2FkZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4iT0siPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IkZvcm1hdGVyYSBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVyYSBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IlZpbGwgZHUgZm9ybWF0ZXJhIFNELWtvcnRldD8gQWxsYSBkYXRhIHDDpSBkaXR0IGtvcnQga29tbWVyIGF0dCBnw6UgZsO2cmxvcmFkZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJWaWxsIGR1IGZvcm1hdGVyYSBTRC1rb3J0ZXQ/IEFsbGEgZGF0YSBww6UgZGl0dCBrb3J0IGtvbW1lciBhdHQgZ8OlIGbDtnJsb3JhZGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVyYSBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iVmlsbCBkdSBmb3JtYXRlcmEgU0Qta29ydGV0PyBBbGxhIGRhdGEgcMOlIGRpdHQga29ydCBrb21tZXIgYXR0IGfDpSBmw7ZybG9yYWRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkZvcm1hdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IlVTQi1mZWxzw7ZrbmluZyBhbnNsdXRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iVsOkbGogYXR0IGluYWt0aXZlcmEgVVNCLWZlbHPDtmtuaW5nLiI8L3N0cmluZz4KQEAgLTgzNywyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+ImthbmRpZGF0ZXIiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iRsO2cmJlcmVkZXIgU0Qta29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iRsO2cmJlcmVkZXIgU0Qta29ydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iRsO2cmJlcmVkZXIgU0Qta29ydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJTw7ZrZXIgZWZ0ZXIgZmVsLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJUb210IFNELWtvcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJUb210IFNELWtvcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iU0Qta29ydGV0IMOkciB0b210IGVsbGVyIHPDpSBhbnbDpG5kZXIgZGV0IGV0dCBmaWxzeXN0ZW0gc29tIGludGUgc3TDtmRzLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNELWtvcnRldCDDpHIgdG9tdCBlbGxlciBzw6UgaGFyIGRldCBldHQgZmlsc3lzdGVtIHNvbSBpbnRlIHN0w7Zkcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJTa2FkYXQgU0Qta29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iU2thZGF0IFNELWtvcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IlNELWtvcnRldCDDpHIgc2thZGF0LiBEdSBtw6VzdGUgZXZlbnR1ZWxsdCBmb3JtYXRlcmEgb20gZGl0dCBrb3J0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTRC1rb3J0ZXQgw6RyIHNrYWRhdC4gRHUgbcOlc3RlIGV2ZW50dWVsbHQgZm9ybWF0ZXJhIG9tIGRldC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IlNELWtvcnQgdG9ncyBvdsOkbnRhdCBib3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNELWtvcnQgdG9ncyBvdsOkbnRhdCBib3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+IkRlbW9udGVyYSBTRC1rb3J0IGlubmFuIGJvcnR0YWduaW5nIGbDtnIgYXR0IHVuZHZpa2EgZGF0YWbDtnJsdXN0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkRlbW9udGVyYSBTRC1rb3J0IGlubmFuIGJvcnR0YWduaW5nIGbDtnIgYXR0IHVuZHZpa2EgZGF0YWbDtnJsdXN0LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iU8Oka2VydCBhdHQgdGEgYm9ydCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU8Oka2VydCBhdHQgdGEgYm9ydCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iU0Qta29ydGV0IGthbiBudSB0YXMgYm9ydC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iRGV0IMOkciBudSBzw6RrZXJ0IGF0dCB0YSBib3J0IFNELWtvcnRldC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+IkJvcnR0YWdldCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkJvcnR0YWdldCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IlNEIGhhciB0YWdpdHMgYm9ydC4gU8OkdHQgaSBldHQgbnl0dCBTRC1rb3J0IGbDtnIgYXR0IMO2a2EgZW5oZXRlbnMgbGFncmluZ3N1dHJ5bW1lLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNELWtvcnRldCBoYXIgdGFnaXRzIGJvcnQuIFPDpHR0IGkgZXR0IG55dHQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iVG9tdCBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qta29ydGV0IMOkciB0b210IGVsbGVyIHPDpSBoYXIgZGV0IGV0dCBmaWxzeXN0ZW0gc29tIGludGUgc3TDtmRzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iU2thZGF0IFNELWtvcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qta29ydGV0IMOkciBza2FkYXQuIER1IG3DpXN0ZSBldmVudHVlbGx0IGZvcm1hdGVyYSBvbSBkZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNELWtvcnQgdG9ncyBvdsOkbnRhdCBib3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iRGVtb250ZXJhIFNELWtvcnQgaW5uYW4gYm9ydHRhZ25pbmcgZsO2ciBhdHQgdW5kdmlrYSBkYXRhZsO2cmx1c3QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU8Oka2VydCBhdHQgdGEgYm9ydCBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IkRldCDDpHIgbnUgc8Oka2VydCBhdHQgdGEgYm9ydCBTRC1rb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkJvcnR0YWdldCBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qta29ydGV0IGhhciB0YWdpdHMgYm9ydC4gU8OkdHQgaSBldHQgbnl0dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+IkluZ2EgbWF0Y2hhbmRlIGFrdGl2aXRldGVyIGhpdHRhZGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+InVwcGRhdGVyYSBzdGF0aXN0aWsgw7Z2ZXIgYW52w6RuZG5pbmcgYXYga29tcG9uZW50ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iVGlsbMOldGVyIGF0dCBzYW1sYWQga29tcG9uZW50c3RhdGlzdGlrIMOkbmRyYXMuIEFudsOkbmRzIGludGUgYXYgdmFubGlnYSBwcm9ncmFtLiI8L3N0cmluZz4KQEAgLTg5NCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iSSBmw7ZydsOkZyBkZWxhZCBMMlRQL0lQU2VjIFZQTi1ueWNrZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWthdHNiYXNlcmFkIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iVsOkbGogZmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iSW5nZW4gZmlsIGhhciB2YWx0cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IsOFdGVyc3TDpGxsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNraWNrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbGzDpGdlIGFrdGl2ZXJhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWw6RsaiBvbSBkdSB2aWxsIGF2c2x1dGEgYmlsbMOkZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkludGVybmV0ZGVsbmluZyBlbGxlciBzdXJmcHVua3QgYWt0aXZlcmFkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVHJ5Y2sgb20gZHUgdmlsbCBrb25maWd1cmVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGxiYWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iTsOkc3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iSG9wcGEgw7Z2ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIw7ZnIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUcnljayBvbSBkdSB2aWxsIHZldGEgbWVyIG9tIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJHcsOkbnNlbiBmw7ZyIG1vYmlsZGF0YSBoYXIgw7Z2ZXJza3JpZGl0cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUcnljayBvbSBkdSB2aWxsIHZldGEgbWVyIG9tIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJJbmdhIHRyw6RmZmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IlPDtmsgcMOlIHNpZGFuIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgdHLDpGZmIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4gYXYgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmluZGV4IDU4ZWI0MmEuLjZhYzViODZkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iR2VsacWfdGlybWUgYXJhw6dsYXLEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiJZYWxuxLF6Y2EgdXlndWxhbWEgZ2VsacWfdGlyaWNpbGVyIGnDp2luIGdlcmVrbGkgw7Z6ZWxsaWtsZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iRGVwb2xhbWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IlNEIGthcnRhIGVyacWfaW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlNEIGthcnRhIGVyacWfaW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlNEIGthcnRhIGVyacWfaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4iZHVydW0gw6d1YnXEn3VudSBkZXZyZSBkxLHFn8SxIGLEsXJhayB2ZXlhIGRlxJ9pxZ90aXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iVXlndWxhbWFuxLFuIGR1cnVtIMOndWJ1xJ91bnUgZGV2cmUgZMSxxZ/EsSBixLFyYWttYXPEsW5hIHZleWEgc2lzdGVtIHNpbWdlbGVyaSBla2xleWlwIGthbGTEsXJtYXPEsW5hIGl6aW4gdmVyaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+ImR1cnVtIMOndWJ1xJ91Ijwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJVeWd1bGFtYWxhcsSxbiB1eWd1bGFtYSDDtm5iZWxsZcSfaSBkaXppbmluZGVraSBkb3N5YWxhcsSxIHNpbGVyZWsgdGVsZWZvbmRhIHllciBhw6dtYXPEsW5hIGl6aW4gdmVyaXIuIEVyacWfaW0gZ2VuZWxsaWtsZSBzaXN0ZW0gacWfbGVtbGVyaW5lIHZlIHnDvGtzZWsgZMO8emV5ZGUga8Sxc8SxdGzEsSBvbGFyYWsgdmVyaWxpci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iVXlndWxhbWEga2F5bmFrbGFyxLFuxLEgdGHFn8SxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iQmlyIHV5Z3VsYW1hbsSxbiwgdXlndWxhbWEga2F5bmFrbGFyxLFuxLEgZGFoaWxpIHZlIGhhcmljaSBvcnRhbWxhciBhcmFzxLFuZGEgdGHFn8SxbWFzxLFuYSBvbGFuYWsgdGFuxLFyLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4iaGFzc2FzIGfDvG5sw7xrIHZlcmlsZXJpbmkgb2t1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgbXNnaWQ9Ijg4OTY0NDk0Mzc0NjQ4Njc3NjYiPiJCaXIgdXlndWxhbWFuxLFuLCBzaXN0ZW1pbiDDp2XFn2l0bGkgZ8O8bmzDvGsgZG9zeWFsYXLEsW5kYWtpIGJpbGdpbGVyaSBva3VtYXPEsW5hIGl6aW4gdmVyaXIuIEJ1IGl6aW4sIHV5Z3VsYW1hbsSxbiwgdGVsZWZvbmRhIHlhcHTEsWtsYXLEsW7EsXpsYSBpbGdpbGkgZ2VuZWwgYmlsZ2lsZXJpIGJ1bG1hc8SxbmEgb2xhbmFrIHNhxJ9sYXIgdmUgYnVubGFyIGtpxZ9pc2VsIHZlIGdpemxpIGJpbGdpbGVyaW5pemkgZGUgacOnZXJlYmlsaXIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4ic2FoaWJpIHRhbsSxbGFtYSBvbGFuIGtheW5ha2xhcsSxIG9rdS9idW5sYXJhIHlheiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2RpYWdub3N0aWMiIG1zZ2lkPSIzMTIxMjM4MzczOTUxNjM3MDQ5Ij4iVXlndWxhbWFuxLFuIHRhbsSxbGFtYSBncnVidW5kYWtpIGJpciBrYXluYcSfYSBhaXQgaGVyaGFuZ2kgYmlyIGtheW5hxJ/EsTsgw7ZybmXEn2luIC9kZXYgacOnaW5kZWtpIGRvc3lhbGFyxLEgb2t1bWFzxLFuYSB2ZSBidW5sYXJhIHlhem1hc8SxbmEgaXppbiB2ZXJpci4gQnUgacWfbGV2aW4gc2lzdGVtIGthcmFybMSxbMSxxJ/EsW7EsSB2ZSBnw7x2ZW5sacSfaW5pIG9sdW1zdXogZXRraWxlbWUgb2xhc8SxbMSxxJ/EsSB2YXJkxLFyLiDDnHJldGljaSB2ZXlhIG9wZXJhdMO2ciB0YXJhZsSxbmRhbiBZQUxOSVpDQSBkb25hbsSxbWEgw7Z6Z8O8IHRhbsSxbGFtYSBpw6dpbiBrdWxsYW7EsWxtYWzEsWTEsXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4idXlndWxhbWEgYmlsZcWfZW5sZXJpbmkgZXRraW5sZcWfdGlyIHZleWEgZGV2cmUgZMSxxZ/EsSBixLFyYWsiPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJVeWd1bGFtYWxhcsSxbiB5ZXJlbCBCbHVldG9vdGggdGVsZWZvbnVudSB5YXDEsWxhbmTEsXJtYXPEsW5hIHZlIHV6YWsgY2loYXpsYXLEsSBrZcWfZmVkaXAgYnVubGFyIGlsZSBlxZ9sZcWfbWVzaW5lIGl6aW4gdmVyaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iQmx1ZXRvb3RoIGJhxJ9sYW50xLFsYXLEsSBvbHXFn3R1ciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IlV5Z3VsYW1hbGFyxLFuIHllcmVsIEJsdWV0b290aCB0ZWxlZm9udW51biB5YXDEsWxhbmTEsXJtYXPEsW7EsSBnw7Zyw7xudMO8bGVtZXNpbmUgdmUgZcWfbGXFn2lsbWnFnyBjaWhhemxhciBpbGUgYmHEn2xhbnTEsSBrdXJ1cCBrYWJ1bCBldG1lc2luZSBpemluIHZlcmlyLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJ0dcWfIGtpbGlkaW5pIGRldnJlIGTEscWfxLEgYsSxcmFrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IlV5Z3VsYW1hbGFyxLFuIHR1xZ8ga2lsaWRpbmkgdmUgaWxnaWxpIMWfaWZyZWxpIGfDvHZlbmxpayDDtm5sZW1pbmkgZGV2cmUgZMSxxZ/EsSBixLFyYWttYXPEsW5hIGl6aW4gdmVyaXIuIEJ1bnVuIGdlw6dlcmxpIGJpciDDtnJuZcSfaSBnZWxlbiBiaXIgw6dhxJ9yxLEgYWzEsW5kxLHEn8SxbmRhIHR1xZ8ga2lsaWRpbmluIGRldnJlIGTEscWfxLEgYsSxcmFrxLFsbWFzxLEsIHNvbnJhIMOnYcSfcsSxIGJpdHRpxJ9pbmRlIGtpbGlkaW4geWVuaWRlbiBkZXZyZXllIHNva3VsbWFzxLFkxLFyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiJzZW5rLiBheWFybGFyxLFuxLEgb2t1Ijwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+Ikt1bGxhbsSxY8SxbsSxbiBrdWxsYW7EsWPEsSBzw7Z6bMO8xJ/DvG5kZSBkZXBvbGFtxLHFnyBvbGFiaWxlY2XEn2kga2nFn2lzZWwga2VsaW1lbGVyaSwgYWRsYXLEsSB2ZSBrZWxpbWUgw7ZiZWtsZXJpbmkgdXlndWxhbWFsYXLEsW4gb2t1bWFzxLFuYSBpemluIHZlcmlyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+Imt1bGxhbsSxY8SxIHRhbsSxbWzEsSBzw7Z6bMO8xJ9lIHlheiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiJVeWd1bGFtYWxhcsSxbiBrdWxsYW7EsWPEsSBzw7Z6bMO8xJ/DvG5lIHllbmkga2VsaW1lbGVyIHlhem1hc8SxbmEgaXppbiB2ZXJpci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+IlNEIGthcnQgacOnZXJpa2xlcmluaSBkZcSfacWfdGlyL3NpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iU0Qga2FydCBpw6dlcmlrbGVyaW5pIGRlxJ9pxZ90aXIvc2lsIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+IkJpciB1eWd1bGFtYXlhIFNEIGthcnRhIHlhem1hIGl6bmkgdmVyaXIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iQmlyIHV5Z3VsYW1heWEgU0Qga2FydGEgeWF6bWEgaXpuaSB2ZXJpci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNEIGthcnQgacOnZXJpa2xlcmluaSBkZcSfacWfdGlyL3NpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkJpciB1eWd1bGFtYXlhIFNEIGthcnRhIHlhem1hIGl6bmkgdmVyaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+IsO2bmJlbGxlayBkb3N5YSBzaXN0ZW1pbmUgZXJpxZ8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IkJpciB1eWd1bGFtYW7EsW4gw7ZuYmVsbGVrIGRvc3lhIHNpc3RlbWluZGUgb2t1bWEgeWF6bWEgeWFwbWFzxLFuYSBpemluIHZlcmlyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+IsWeaWZyZXlpIHPEsW7EsXJsYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiJLdWxsYW5tYW7EsXphIGl6aW4gdmVyaWxlbiDFn2lmcmUgdMO8cmxlcmluaSBzxLFuxLFybGF5xLFuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iT3R1cnVtIGHDp21hIGRlbmVtZWxlcmluaSBpemxlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+IkJpciBpxZ9sZW0gZ2Vyw6dla2xlxZ90aXJtZWsgacOnaW4gY2loYXpkYWtpIGJhxZ9hcsSxc8SxeiBvdHVydW0gYcOnbWEgZ2lyacWfaW1sZXJpbmkgaXpsZXlpbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiLFnmlmcmUgc8SxZsSxcmxhbWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4ixZ5pZnJlbml6aSB5ZW5pIGJpciBkZcSfZXIgYWxtYXPEsSBpw6dpbiB6b3JsYXnEsW4uIEdpcmnFnyB5YXBhYmlsbWVuaXogacOnaW4gecO2bmV0aWNpbmluIHNpemUgeWVuaSBiaXIgZGXEn2VyIHNhxJ9sYW1hc8SxbsSxIGdlcmVrZWNla3Rpci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IktpbGl0bGVtZXllIHpvcmxhbWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiJDaWhheiBraWxpdGxlbmRpxJ9pbmRlLCDFn2lmcmVzaW5pIHllbmlkZW4gZ2lybWVuaXppIGdlcmVrdGlyZW4gZGVuZXRpbS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiLFnmlmcmV5aSBzxLFuxLFybGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iS3VsbGFubWFuxLF6YSBpemluIHZlcmlsZW4gxZ9pZnJlIHTDvHJsZXJpbmkgc8SxbsSxcmxhecSxbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJPdHVydW0gYcOnbWEgZGVuZW1lbGVyaW5pIGl6bGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4iQmlyIGnFn2xlbSBnZXLDp2VrbGXFn3Rpcm1layBpw6dpbiBjaWhhemRha2kgYmHFn2FyxLFzxLF6IG90dXJ1bSBhw6dtYSBnaXJpxZ9pbWxlcmluaSBpemxleWluLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IsWeaWZyZSBzxLFmxLFybGFtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjMzMzIxNjc2MDAzMzE3OTk5OTEiPiLFnmlmcmVuaXppIHllbmkgYmlyIGRlxJ9lciBhbG1hc8SxIGnDp2luIHpvcmxhecSxbi4gR2lyacWfIHlhcGFiaWxtZW5peiBpw6dpbiB5w7ZuZXRpY2luaW4gc2l6ZSB5ZW5pIGJpciBkZcSfZXIgc2HEn2xhbWFzxLFuxLEgZ2VyZWtlY2VrdGlyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iS2lsaXRsZW1leWUgem9ybGFtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNpaGF6IGtpbGl0bGVuZGnEn2luZGUsIMWfaWZyZXNpbmkgeWVuaWRlbiBnaXJtZW5pemkgZ2VyZWt0aXJlbiBkZW5ldGltLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJUw7xtIHZlcmlsZXJpIHNpbCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iVMO8bSB2ZXJpbGVyaW5pemkgb25heSBvbG1hZGFuIHNpbG1layBpw6dpbiBmYWJyaWthIGF5YXJsYXLEsW5hIHPEsWbEsXJsYXnEsW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJUw7xtIHZlcmlsZXJpbml6aSBvbmF5IG9sbWFkYW4gc2lsbWVrIGnDp2luIGZhYnJpa2EgYXlhcmxhcsSxbmEgc8SxZsSxcmxhecSxbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiJQb2xpdGlrYSBldGtpbiBvbGR1xJ91bmRhIGt1bGxhbsSxbGFjYWsgY2loYXogZ2VuZWxpbmRlIGdlw6dlcmxpIHByb3h5XCd5aSBheWFybGF5xLFuLiBFdGtpbiBnZW5lbCBwcm94eVwneWkgeWFsbsSxemNhIGlsayBjaWhheiB5w7ZuZXRpY2lzaSBheWFybGFyLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkV2IjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLEsMWfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkRpxJ9lciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLDlnplbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlQ3VzdG9tIiBtc2dpZD0iMjQ3MzU4MDU5MzExMTU5MDk0NSI+IsOWemVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVIb21lIiBtc2dpZD0iNjA5MzU5ODE4MTA2OTM1OTI5NSI+IkV2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+IsSwxZ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZU90aGVyIiBtc2dpZD0iNDQwODQzNjE2Mjk1MDExOTg0OSI+IkRpxJ9lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiI8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiBhcmFjxLFsxLHEn8SxeWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiBpbGUgPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHRhcmloaW5kZSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUN1c3RvbSAoMjQ3MzU4MDU5MzExMTU5MDk0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUhvbWUgKDYwOTM1OTgxODEwNjkzNTkyOTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVXb3JrICg2OTIwNzI1NzMwNzk3MDk5MDQ3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4ga29kdW51IGdpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDFn2lmcmV5aSBnaXJpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiBQSU5cJ2kgZ2lyaW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJZYW5sxLHFnyBQSU4ga29kdSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDDtm5jZSBNZW7DvFwneWUsIHNvbnJhIDBcJ2EgYmFzxLFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJBY2lsIGR1cnVtIG51bWFyYXPEsSI8L3N0cmluZz4KQEAgLTU2NCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLDh2HEn3LEsXlhIGTDtm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJEb8SfcnUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IsOcemfDvG7DvHosIGzDvHRmZW4geWVuaWRlbiBkZW5leWluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJNYWFsZXNlZiwgdGVrcmFyIGRlbmV5aW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFnmFyaiBvbHV5b3IgKDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IsWeYXJqIG9sZHUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTc4LDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ga2FydCBraWxpdGxpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTSBrYXJ0IGtpbGlkaSBhw6fEsWzEsXlvcuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IktpbGl0IGHDp21hIGRlc2VuaW5pemkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2V6IHlhbmzEscWfIMOnaXpkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4ixZ5pZnJlbml6aSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZXogeWFubMSxxZ8gZ2lyZGluaXouICJcblxuIkzDvHRmZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2FuaXllIGnDp2luZGUgeWVuaWRlbiBkZW5leWluLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJQSU5cJ2luaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyBnaXJkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJLaWxpdCBhw6dtYSBkZXNlbmluaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyDDp2l6ZGluaXouIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGJhxZ9hcsSxc8SxeiBkZW5lbWVkZW4gc29ucmEgdGVsZWZvbnVudXp1IEdvb2dsZSBvdHVydW0gYcOnbWEgYmlsZ2lsZXJpbml6aSBrdWxsYW5hcmFrIGHDp21hbsSxeiBpc3RlbmlyLiJcblxuIiBMw7x0ZmVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkRlc2VuaSB1bnV0dHVudXogbXU/Ijwvc3RyaW5nPgpAQCAtNjA2LDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IkJ1IHNheWZhZGFuIGF5csSxbMSxeW9yIG11c3VudXo/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIkRldmFtIGV0bWVrIGnDp2luIFRhbWFtXCfEsSwgc2F5ZmFkYSBrYWxtYWsgacOnaW4gxLBwdGFsXCdpIHTEsWtsYXTEsW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9sYWJlbCIgbXNnaWQ9IjY4NjAyNjE3NTg2NjU4MjUwNjkiPiJPbmF5bGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IsSwcHVjdTogWWFrxLFubGHFn3TEsXJtYWsgdmUgdXpha2xhxZ90xLFybWFrIGnDp2luIGlraSBrZXogaGFmaWbDp2UgdnVydW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4iVGFyYXnEsWPEsSBnZcOnbWnFn2luaSB2ZSBmYXZvcmlsZXJpIG9rdSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IlV5Z3VsYW1heWEgVGFyYXnEsWPEsW7EsW4geml5YXJldCBldG1pxZ8gb2xkdcSfdSB0w7xtIFVSTFwnbGVyaSB2ZSBUYXJhecSxY8SxbsSxbiB0w7xtIGZhdm9yaWxlcmluaSBva3VtYSBpem5pIHZlcmlyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+IlRhcmF5xLFjxLEgZ2XDp21pxZ9pbmkgdmUgZmF2b3JpbGVyaSB5YXoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJVeWd1bGFtYXlhIHRlbGVmb251bnV6ZGEgZGVwb2xhbmFuIFRhcmF5xLFjxLEgZ2XDp21pxZ9pbmkgdmV5YSBmYXZvcmlsZXJpIGRlxJ9pxZ90aXJtZSBpem5pIHZlcmlyLiBLw7Z0w7wgYW1hw6dsxLEgdXlndWxhbWFsYXIgYnVudSBUYXJhecSxY8SxIHZlcmlsZXJpbml6aSBzaWxtZWsgdmV5YSBkZcSfacWfdGlybWVrIGnDp2luIGt1bGxhbmFiaWxpci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+IlRhcmF5xLFjxLFcJ27EsW4gY2/En3JhZmkga29udW0gaXppbmxlcmluaSBkZcSfacWfdGlyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IkJpciB1eWd1bGFtYW7EsW4sIFRhcmF5xLFjxLFcJ27EsW4gY2/En3JhZmkga29udW0gaXppbmxlcmluaSBkZcSfacWfdGlybWVzaW5lIGl6aW4gdmVyaXIuIEvDtnTDvCBhbWHDp2zEsSB1eWd1bGFtYWxhciwgYnUgw7Z6ZWxsacSfaSBrb251bSBiaWxnaWxlcmluaSByYXN0Z2VsZSB3ZWIgc2l0ZWxlcmluZSBnw7ZuZGVybWVrIGnDp2luIGt1bGxhbmFiaWxpci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJUYXJhecSxY8SxbsSxbiBidSDFn2lmcmV5aSBhbsSxbXNhbWFzxLFuxLEgaXN0aXlvciBtdXN1bnV6PyI8L3N0cmluZz4KQEAgLTcyNiwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVMO8bcO8bsO8IHNlw6ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IktlbGltZSBzZcOnaW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2VzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3B5YWxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iWWFwxLHFn3TEsXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IlVSTFwneWkga29weWFsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+Ik1ldGluIHNlw6cuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iTWV0aW4gc2XDp2ltaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IkdpcmnFnyB5w7ZudGVtaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBrZWxpbWVzaW5pIHPDtnpsw7zEn2UgZWtsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Ik1ldGluIGTDvHplbmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iTWV0aW4gZXlsZW1sZXJpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJZZXIgYXoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJUZWxlZm9udW4gZGVwb2xhbWEgYWxhbsSxIGF6YWzEsXlvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJUYW1hbSI8L3N0cmluZz4KQEAgLTc0MSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IlRhbWFtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4ixLBwdGFsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkRpa2thdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iWcO8a2xlbml5b3IuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkHDh0lLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iS0FQQUxJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLEsMWfbGVtaSDFn3VudSBrdWxsYW5hcmFrIHRhbWFtbGEiPC9zdHJpbmc+CkBAIC03NTksOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJLYXBhbm1heWEgem9ybGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iUmFwb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IkJla2xlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iVXlndWxhbWEgecO2bmxlbmRpcmlsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gxZ9pbWRpIMOnYWzEscWfxLF5b3IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLEsGxrIG9sYXJhayA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGJhxZ9sYXTEsWxkxLEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+Ijx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gdXlndWxhbWFzxLEgKDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPiBpxZ9sZW1pKSBrZW5kaWxpxJ9pbmRlbiB1eWd1bGFkxLHEn8SxIFN0cmljdE1vZGUgcG9saXRpa2FzxLFuxLEgaWhsYWwgZXR0aS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiI8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gacWfbGVtaSBrZW5kaWxpxJ9pbmRlbiB1eWd1bGFkxLHEn8SxIFN0cmljdE1vZGUgcG9saXRpa2FzxLFuxLEgaWhsYWwgZXR0aS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IMOnYWzEscWfxLF5b3IiPC9zdHJpbmc+CkBAIC04MDgsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iVMO8bcO8bsO8IGfDtnN0ZXIiPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iVVNCIFnEscSfxLFuIERlcG9sYW1hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iVVNCIGJhxJ9sYW5kxLEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJUZWxlZm9udW51enUgVVNCIGlsZSBiaWxnaXNheWFyxLFuxLF6YSBiYcSfbGFkxLFuxLF6LiBCaWxnaXNheWFyxLFuxLF6IGlsZSBBbmRyb2lkXCdpbml6aW4gU0Qga2FydMSxIGFyYXPEsW5kYSBkb3N5YSBrb3B5YWxhbWFrIGlzdGl5b3JzYW7EsXogYcWfYcSfxLFkYWtpIGTDvMSfbWV5aSBzZcOnaW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJUZWxlZm9udW51enUgVVNCIGlsZSBiaWxnaXNheWFyxLFuxLF6YSBiYcSfbGFkxLFuxLF6LiBCaWxnaXNheWFyxLFuxLF6IGlsZSBBbmRyb2lkXCdpbml6aW4gU0Qga2FydMSxIGFyYXPEsW5kYSBkb3N5YSBrb3B5YWxhbWFrIGlzdGl5b3JzYW7EsXogYcWfYcSfxLFkYWtpIGTDvMSfbWV5aSBzZcOnaW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJUZWxlZm9udW51enUgVVNCIGlsZSBiaWxnaXNheWFyxLFuxLF6YSBiYcSfbGFkxLFuxLF6LiBCaWxnaXNheWFyxLFuxLF6IGlsZSBBbmRyb2lkXCdpbml6aW4gU0Qga2FydMSxIGFyYXPEsW5kYSBkb3N5YSBrb3B5YWxhbWFrIGlzdGl5b3JzYW7EsXogYcWfYcSfxLFkYWtpIGTDvMSfbWV5aSBzZcOnaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IlVTQiBkZXBvbGFtYSBiaXJpbWluaSBhw6ciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJTRCBrYXJ0xLFuxLF6xLEgVVNCIGRlcG9sYW1hIGJpcmltaSBpw6dpbiBrdWxsYW5tYWRhIGJpciBzb3J1biB2YXIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJTRCBrYXJ0xLFuxLF6xLEgVVNCIGRlcG9sYW1hIGJpcmltaSBpw6dpbiBrdWxsYW5tYWRhIGJpciBzb3J1biB2YXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJTRCBrYXJ0xLFuxLF6xLEgVVNCIGRlcG9sYW1hIGJpcmltaSBpw6dpbiBrdWxsYW5tYWRhIGJpciBzb3J1biB2YXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQiBiYcSfbGFuZMSxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4iQmlsZ2lzYXlhcsSxbsSxemEvYmlsZ2lzYXlhcsSxbsSxemRhbiBkb3N5YSBrb3B5YWxhbWFrIGnDp2luIHNlw6dpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJVU0IgZGVwb2xhbWEgYmlyaW1pbmkga2FwYXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjU5MTgxMzQ5MDI2OTg0MTUzOSI+IlVTQiBkZXBvbGFtYSBiaXJpbWluaSBrYXBhdG1hayBpw6dpbiBzZcOnaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlVTQiBkZXBvbGFtYSBiaXJpbWkga3VsbGFuxLFsxLF5b3IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IlVTQiBkZXBvbGFtYSBiaXJpbWluaSBrYXBhdG1hZGFuIMO2bmNlIEFuZHJvaWQgU0Qga2FydMSxbsSxIGJpbGdpc2F5YXLEsW7EsXpkYW4ga2FsZMSxcmTEscSfxLFuxLF6ZGFuIChcIsOnxLFrYXJkxLHEn8SxbsSxemRhblwiKSBlbWluIG9sdW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlVTQiBkZXBvbGFtYSBiaXJpbWluaSBrYXBhdG1hZGFuIMO2bmNlIEFuZHJvaWQgU0Qga2FydMSxbsSxIGJpbGdpc2F5YXLEsW7EsXpkYW4ga2FsZMSxcmTEscSfxLFuxLF6ZGFuIChcIsOnxLFrYXJkxLHEn8SxbsSxemRhblwiKSBlbWluIG9sdW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlVTQiBkZXBvbGFtYSBiaXJpbWluaSBrYXBhdG1hZGFuIMO2bmNlIEFuZHJvaWQgU0Qga2FydMSxbsSxIGJpbGdpc2F5YXLEsW7EsXpkYW4ga2FsZMSxcmTEscSfxLFuxLF6ZGFuIChcIsOnxLFrYXJkxLHEn8SxbsSxemRhblwiKSBlbWluIG9sdW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iVVNCIGRlcG9sYW1hIGJpcmltaW5pIGthcGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMTQzODgxOTE0ODQwNDEyMTA4Ij4iVVNCIGRlcG9sYW1hIGJpcmltaW5pIGthcGF0xLFya2VuIGJpciBzb3J1biBvbHXFn3R1LiBVU0IgYW5hIG1ha2luZXNpbmkga2FsZMSxcmTEscSfxLFuxLF6ZGFuIGVtaW4gb2x1biB2ZSBkYWhhIHNvbnJhIHRla3JhciBkZW5leWluLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+IlVTQiBkZXBvbGFtYSBiaXJpbWluaSBhw6ciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiJVU0IgZGVwb2xhbWEgYmlyaW1pbmkgYcOnYXJzYW7EsXosIGt1bGxhbm1ha3RhIG9sZHXEn3VudXogYmF6xLEgdXlndWxhbWFsYXIgZHVydXIgdmUgVVNCIGRlcG9sYW1hIGJpcmltaSBrYXBhdMSxbMSxbmNheWEga2FkYXIga3VsbGFuxLFsYW1heWFiaWxpci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iVVNCIGnFn2xlbWkgYmHFn2FyxLFzxLF6IG9sZHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4iVGFtYW0iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IlNEIGthcnTEsSBiacOnaW1sZW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iU0Qga2FydMSxIGJpw6dpbWxlbmRpciI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiJTRCBrYXJ0xLEgYmnDp2ltbGVuZGlybWVrIGlzdGVkacSfaW5pemRlbiBlbWluIG1pc2luaXo/IEthcnTEsW7EsXpkYWtpIHTDvG0gdmVyaWxlciB5b2sgb2xhY2FrLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlNEIGthcnTEsSBiacOnaW1sZW5kaXJtZWsgaXN0ZWRpxJ9pbml6ZGVuIGVtaW4gbWlzaW5pej8gS2FydMSxbsSxemRha2kgdMO8bSB2ZXJpbGVyIHlvayBvbGFjYWsuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IlNEIGthcnTEsSBiacOnaW1sZW5kaXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJTRCBrYXJ0xLEgYmnDp2ltbGVuZGlybWVrIGlzdGVkacSfaW5pemRlbiBlbWluIG1pc2luaXo/IEthcnTEsW7EsXpkYWtpIHTDvG0gdmVyaWxlciB5b2sgb2xhY2FrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkJpw6dpbWxlbmRpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IlVTQiBoYXRhIGF5xLFrbGFtYXPEsSBiYcSfbGFuZMSxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJVU0IgaGF0YSBhecSxa2xhbWFzxLFuxLEgZGV2cmUgZMSxxZ/EsSBixLFyYWttYWsgacOnaW4gdMSxa2xhecSxbi4iPC9zdHJpbmc+CkBAIC04MzcsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiJhZGF5bGFyIjwvdT48L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU0NTc2MDM0MTg5NzA5OTQwNTAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDIzOTUxNjY3NTAyODQzODk5NyI+IlNEIGthcnQgaGF6xLFybGFuxLF5b3IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlNEIGthcnQgaGF6xLFybGFuxLF5b3IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlNEIGthcnQgaGF6xLFybGFuxLF5b3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4Mjg3MzE5ODgyOTI2NzM3MDUzIj4iSGF0YWxhciBkZW5ldGxlbml5b3IuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IkJvxZ8gU0Qga2FydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IkJvxZ8gU0Qga2FydCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJTRCBrYXJ0IGJvxZ8gdmV5YSBkZXN0ZWtsZW5tZXllbiBiaXIgZG9zeWEgc2lzdGVtaSBrdWxsYW7EsXlvci4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTRCBrYXJ0IGJvxZ8gdmV5YSBkZXN0ZWtsZW5tZXllbiBkb3N5YSBzaXN0ZW1pIGnDp2VyaXlvciI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+Ikhhc2FybMSxIFNEIGthcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+Ikhhc2FybMSxIFNEIGthcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IlNEIGthcnQgaGFzYXJsxLEuIEthcnTEsW7EsXrEsSB5ZW5pZGVuIGJpw6dpbWxlbmRpcm1lbml6IGdlcmVrZWJpbGlyLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTRCBrYXJ0IHphcmFyIGfDtnJkw7wuIFllbmlkZW4gYmnDp2ltbGVuZGlybWVuaXogZ2VyZWtlYmlsaXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiJTRCBrYXJ0IGJla2xlbm1lZGlrIGJpw6dpbWRlIMOnxLFrYXLEsWxkxLEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Qga2FydCBiZWtsZW5tZWRpayBiacOnaW1kZSDDp8Sxa2FyxLFsZMSxIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+IlZlcmkga2F5YsSxbmRhbiBrYcOnxLFubWFrIGnDp2luIFNEIGthcnTEsSDDp8Sxa2FybWFkYW4gw7ZuY2UgYmHEn2xhbnTEsXPEsW7EsSBrZXNpbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJWZXJpIGtheWLEsW5kYW4ga2HDp8Sxbm1hayBpw6dpbiBTRCBrYXJ0xLEgw6fEsWthcm1hZGFuIMO2bmNlIGJhxJ9sYW50xLFzxLFuxLEga2VzaW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiJTRCBrYXJ0IGfDvHZlbmxlIMOnxLFrYXLEsWxhYmlsaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTRCBrYXJ0IGfDvHZlbmxlIMOnxLFrYXLEsWxhYmlsaXIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3NjEzOTYwNjg2NzQ3NTkyNzcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc1MDM3NjkxMDYyODUxODg3MDMiPiJTRCBrYXJ0IMWfaW1kaSBnw7x2ZW5saSBiaXIgxZ9la2lsZGUgw6fEsWthcsSxbGFiaWxpci4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iU0Qga2FydMSxIGfDvHZlbmxlIGthbGTEsXJhYmlsaXJzaW5pei4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+IlNEIGthcnQgw6fEsWthcsSxbG3EscWfIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNEIGthcnQgw6fEsWthcsSxbG3EscWfIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IlNEIGthcnQgw6fEsWthcsSxbG3EscWfLiBDaWhhesSxbsSxesSxbiBkZXBvbGFtYSBhbGFuxLFuxLEgYXJ0xLFybWFrIGnDp2luIHllbmkgYmlyIFNEIGthcnQgdGFrxLFuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNEIGthcnQgw6fEsWthcsSxbGTEsS4gWWVuaSBiaXIgU0Qga2FydCB0YWvEsW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iQm/FnyBTRCBrYXJ0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qga2FydCBib8WfIHZleWEgZGVzdGVrbGVubWV5ZW4gZG9zeWEgc2lzdGVtaSBpw6dlcml5b3IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+Ikhhc2FybMSxIFNEIGthcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qga2FydCB6YXJhciBnw7ZyZMO8LiBZZW5pZGVuIGJpw6dpbWxlbmRpcm1lbml6IGdlcmVrZWJpbGlyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRCBrYXJ0IGJla2xlbm1lZGlrIGJpw6dpbWRlIMOnxLFrYXLEsWxkxLEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJWZXJpIGtheWLEsW5kYW4ga2HDp8Sxbm1hayBpw6dpbiBTRCBrYXJ0xLEgw6fEsWthcm1hZGFuIMO2bmNlIGJhxJ9sYW50xLFzxLFuxLEga2VzaW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU0Qga2FydCBnw7x2ZW5sZSDDp8Sxa2FyxLFsYWJpbGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlNEIGthcnTEsSBnw7x2ZW5sZSBrYWxkxLFyYWJpbGlyc2luaXouIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNEIGthcnQgw6fEsWthcsSxbG3EscWfIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qga2FydCDDp8Sxa2FyxLFsZMSxLiBZZW5pIGJpciBTRCBrYXJ0IHRha8Sxbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+IkXFn2xlxZ9lbiBoacOnYmlyIGV0a2lubGlrIGJ1bHVuYW1hZMSxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+ImJpbGXFn2VuIGt1bGxhbsSxbSBpc3RhdGlzdGlrbGVyaW5pIGfDvG5jZWxsZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiJUb3BsYW5txLHFnyBiaWxlxZ9lbiBpc3RhdGlzdGlrbGVyaW5pbiBkZcSfacWfdGlyaWxtZXNpbmUgaXppbiB2ZXJpci4gTm9ybWFsIHV5Z3VsYW1hbGFyZGEga3VsbGFuxLFsbWFtYWzEsWTEsXIuIjwvc3RyaW5nPgpAQCAtODk0LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjIFZQTiB0ZW1lbGxpIMO2bmNlZGVuIHBheWxhxZ/EsWxtxLHFnyBhbmFodGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkwyVFAvSVBTZWMgVlBOIHRlbWVsbGkgc2VydGlmaWthIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iRG9zeWEgc2XDpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IlNlw6dpbGkgZG9zeWEgeW9rIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iU8SxZsSxcmxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkfDtm5kZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkFyYWJhIG1vZHUgZXRraW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iQXJhYmEgbW9kdW5kYW4gw6fEsWttYWsgacOnaW4gc2XDp2luLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJEb8SfcnVkYW4gYmHEn2xhbnTEsSB2ZXlhIG9ydGFrIGVyacWfaW0gbm9rdGFzxLEgZXRraW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJZYXDEsWxhbmTEsXJtYWsgacOnaW4gZG9rdW51biI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkdlcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLEsGxlcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJBdGxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iWcO8a3NlayBkw7x6ZXlkZSBtb2JpbCB2ZXJpIGt1bGxhbsSxbcSxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJNb2JpbCB2ZXJpIGt1bGxhbsSxbcSxIGhha2vEsW5kYSBkYWhhIGZhemxhIGJpbGdpIGVkaW5tZWsgacOnaW4gZG9rdW51biI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTW9iaWwgdmVyaSBsaW1pdGkgYcWfxLFsZMSxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+Ik1vYmlsIHZlcmkga3VsbGFuxLFtxLEgaGFra8SxbmRhIGRhaGEgZmF6bGEgYmlsZ2kgZWRpbm1layBpw6dpbiBkb2t1bnVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJFxZ9sZcWfbWUgeW9rIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IlNheWZhZGEgYnVsIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgZcWfbGXFn21lIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4gLyA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNjUxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAorICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+Cis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIENvbXBvbmVudCB0byBiZSB1c2VkIGFzIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UuICBNdXN0IGltcGxlbWVudCB0aGUgSVN0YXR1c0JhcgorICAgICAgICAgaW50ZXJmYWNlLiAgVGhpcyBuYW1lIGlzIGluIHRoZSBDb21wb25lbnROYW1lIGZsYXR0ZW5lZCBmb3JtYXQgKHBhY2thZ2UvY2xhc3MpICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDb21wb25lbnQiPmNvbS5hbmRyb2lkLnN5c3RlbXVpL2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuVGFibGV0U3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gc2VlIGNvbW1lbnQgaW4gdmFsdWVzL2NvbmZpZy54bWwgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2xvbmdQcmVzc09uUG93ZXJCZWhhdmlvciI+MjwvaW50ZWdlcj4KKworICAgIDwhLS0gU2hvdyBzbGlkaW5nIHRhYiBiZWZvcmUgbG9ja3NjcmVlbiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlU2xpZGluZ1RhYkZpcnN0Ij5mYWxzZTwvYm9vbD4KKyAgICA8IS0tIEVuYWJsZSBsb2Nrc2NyZWVuIHJvdGF0aW9uIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24iPnRydWU8L2Jvb2w+CisKKyAgICA8IS0tIEVuYWJsZXMgM2QgdGFzayBzd2l0Y2hlciBvbiB4bGFyZ2UgZGV2aWNlIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVSZWNlbnRBcHBzM0QiPnRydWU8L2Jvb2w+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTVjYjMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9hbnkvZGltZW5zLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2hlaWdodCI+NDhkaXA8L2RpbWVuPgorICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzdGF0dXMgYmFyIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fc2l6ZSI+NDhkaXA8L2RpbWVuPgorICAgIDwhLS0gTWFyZ2luIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gaWdub3JlIHRvdWNoIGV2ZW50cyBmb3IgaW4gdGhlIHdpbmRvd3NoYWRlLiAtLT4KKyAgICA8IS0tIE1hcmdpbiBmb3IgcGVybWFuZW50IHNjcmVlbiBkZWNvcmF0aW9ucyBhdCB0aGUgYm90dG9tLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic2NyZWVuX21hcmdpbl9ib3R0b20iPjQ4ZGlwPC9kaW1lbj4KKyAgICAKKyAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCBmb3IgYWxwaGEgLS0+CisgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiPjAuMzVpbjwvZGltZW4+CisgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIG51bWVyaWMgLS0+CisgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfbnVtZXJpYyI+MC40N2luPC9kaW1lbj4KKworICAgIDwhLS0gVGhlIHdpZHRoIHRoYXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRodW1ibmFpbHMgb2YgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0idGh1bWJuYWlsX3dpZHRoIj4yNTZkcDwvZGltZW4+CisgICAgPCEtLSBUaGUgaGVpZ2h0IHRoYXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRodW1ibmFpbHMgb2YgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0idGh1bWJuYWlsX2hlaWdodCI+MjU1ZHA8L2RpbWVuPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjBiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9hbnkvc3RyaW5ncy54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisKKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgdGFyZ2V0ZWQgY29udGVudCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj48L3N0cmluZz4KKworPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3R5bGVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0eWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MjY1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0eWxlcy54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTdGF0dXMgQmFyIFN0eWxlcyAtLT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciI+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSWNvbiI+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudC5UaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgIDwvc3R5bGU+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKaW5kZXggYWFkNTZmZC4uNjk3ZWI5OCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4i5byA5Y+R5bel5YW3Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IuWPquacieW6lOeUqOeoi+W6j+W8gOWPkeS6uuWRmOaJjeS8mueUqOWIsOeahOWKn+iDveOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9zdG9yYWdlIiBtc2dpZD0iMTk3MTExODc3MDU0NjMzNjk2NiI+IuWtmOWCqCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4i6K6/6ZeuIFNEIOWNoeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiLorr/pl64gU0Qg5Y2h44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+Iuiuv+mXriBTRCDljaHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiLlgZznlKjmiJbkv67mlLnnirbmgIHmoI8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4i5YWB6K645bqU55So56iL5bqP5YGc55So54q25oCB5qCP5oiW6ICF5aKe5Yig57O757uf5Zu+5qCH44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+IueKtuaAgeagjyI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4i5YWB6K645bqU55So56iL5bqP6YCa6L+H5Yig6Zmk5bqU55So56iL5bqP57yT5a2Y55uu5b2V5Lit55qE5paH5Lu26YeK5pS+5omL5py65a2Y5YKo56m66Ze044CC6YCa5bi45q2k5p2D6ZmQ5Y+q6YCC55So5LqO57O757uf6L+b56iL44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3ZlUGFja2FnZSIgbXNnaWQ9IjcyODQ1NDk3OTk0NjUwMzkyNiI+Iuenu+WKqOW6lOeUqOeoi+W6j+i1hOa6kCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IuWFgeiuuOW6lOeUqOeoi+W6j+WcqOWGhemDqOS7i+i0qOWSjOWklumDqOS7i+i0qOS5i+mXtOenu+WKqOW6lOeUqOeoi+W6j+i1hOa6kOOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4i5p+l6ZiF5pWP5oSf5pel5b+X5pWw5o2uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIG1zZ2lkPSI4ODk2NDQ5NDM3NDY0ODY3NzY2Ij4i5YWB6K645bqU55So56iL5bqP5LuO57O757uf55qE5ZCE5Liq5pel5b+X5paH5Lu25Lit6K+75Y+W5L+h5oGv44CC6L+Z5qC377yM5bqU55So56iL5bqP5bCx5Y+v5Lul5Y+R546w5YWz5LqO5oKo5omL5py65L2/55So5oOF5Ya155qE5LiA6Iis5L+h5oGv77yM5YW25Lit5Y+v6IO95YyF5ZCr5Liq5Lq65L+h5oGv5oiW56eB5a+G5L+h5oGv44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4i6K+75Y+WL+WGmeWFpeiviuaWreaJgOaLpeacieeahOi1hOa6kCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2RpYWdub3N0aWMiIG1zZ2lkPSIzMTIxMjM4MzczOTUxNjM3MDQ5Ij4i5YWB6K645bqU55So56iL5bqP6K+75Y+WL+WGmeWFpeiviuaWree7hOaJgOaLpeacieeahOS7u+S9lei1hOa6kO+8iOS+i+Wmgu+8jC9kZXYg5Lit55qE5paH5Lu277yJ44CC6L+Z5Y+v6IO95Lya5b2x5ZON57O757uf56iz5a6a5oCn5ZKM5a6J5YWo5oCn44CC5q2k5p2D6ZmQ5LuF5L6b5Yi26YCg5ZWG5oiW6L+Q6JCl5ZWG6K+K5pat56Gs5Lu26Zeu6aKY44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4i5ZCv55So5oiW5YGc55So5bqU55So56iL5bqP57uE5Lu2Ijwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4i5YWB6K645bqU55So56iL5bqP6YWN572u5pys5Zyw6JOd54mZ5omL5py677yM5Lul5Y+K5Y+R546w6L+c56iL6K6+5aSH5bm25LiO5YW26YWN5a+544CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4i5Yib5bu66JOd54mZ6L+e5o6lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4i5YWB6K645bqU55So56iL5bqP5p+l55yL5pys5Zyw6JOd54mZ5omL5py655qE6YWN572u77yM5Lul5Y+K5bu656uL5oiW5o6l5Y+X5LiO6YWN5a+56K6+5aSH55qE6L+e5o6l44CCIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjQWRtaW4gKDIyNTEzMDIyMzMwMTIyNTAwNTYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjQWRtaW4gKDE5MzU4NDI2MTE0NjQ4OTU3ODUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNSYXcgKDQ0MjM0NzE3MTExMTQzMjU3MDgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjUmF3ICg1NTMzMDIyNzM2NTU5Mzg1NjY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTm90aWZ5ICg0Nzg0NzAzNjAwODI3OTIzNTgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTm90aWZ5ICgyOTkwMDUzNTE3OTYyMDcwNjE3KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTGxjcCAoNDk3MjA1MTQ2MTAwNzAzMDQyNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNMbGNwICg5MTU5MjEyNzc4NjAwNDY0MCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+IuWBnOeUqOmUrumUgSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiLlhYHorrjlupTnlKjnqIvluo/lgZznlKjplK7plIHlkozku7vkvZXlhbPogZTnmoTlr4bnoIHlronlhajorr7nva7jgILkvovlpoLvvIzlnKjmiYvmnLrkuIrmjqXlkKznlLXor53ml7blgZznlKjplK7plIHvvIzlnKjpgJror53nu5PmnZ/lkI7ph43mlrDlkK/nlKjplK7plIHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4i6K+75Y+W5ZCM5q2l6K6+572uIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IuWFgeiuuOW6lOeUqOeoi+W6j+ivu+WPlueUqOaIt+WcqOeUqOaIt+ivjeWFuOS4reWtmOWCqOeahOS7u+aEj+engeacieWtl+ivjeOAgeWQjeensOWSjOefreivreOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+IuWGmeWFpeeUqOaIt+WumuS5ieeahOivjeWFuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiLlhYHorrjlupTnlKjnqIvluo/lkJHnlKjmiLfor43lhbjkuK3lhpnlhaXmlrDor43jgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+IuS/ruaUuS/liKDpmaQgU0Qg5Y2h5Lit55qE5YaF5a65Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLkv67mlLkv5Yig6ZmkIFNEIOWNoeS4reeahOWGheWuuSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiLlhYHorrjlupTnlKjnqIvluo/lhpnlhaUgU0Qg5Y2h44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4i5YWB6K645bqU55So56iL5bqP5YaZ5YWlIFNEIOWNoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i5L+u5pS5L+WIoOmZpCBTRCDljaHkuK3nmoTlhoXlrrkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiLlhYHorrjlupTnlKjnqIvluo/lhpnlhaUgU0Qg5Y2h44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+Iuiuv+mXrue8k+WtmOaWh+S7tuezu+e7nyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4i5YWB6K645bqU55So56iL5bqP6K+75Y+W5ZKM5YaZ5YWl57yT5a2Y5paH5Lu257O757uf44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4i6ZmQ5Yi25a+G56CB6YCJ5oupIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IumZkOWItuaCqOiDveWkn+S9v+eUqOeahOWvhueggeexu+Wei+OAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4i55uR5o6n55m75b2V5bCd6K+VIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+IuebkeaOp+WvueS6jueZu+W9leiuvuWkh+WSjOaJp+ihjOafkOmhueaTjeS9nOeahOWksei0peWwneivleOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+IumHjee9ruWvhueggSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDMzMzIxNjc2MDAzMzE3OTk5OTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjUzOTEyNDA2MTY5ODEyOTczNjEiPiLlvLrooYzmm7TmlrDlr4bnoIHvvIzmgqjpnIDopoHojrflvpfnrqHnkIblkZjmj5DkvpvnmoTmlrDlr4bnoIHmiY3og73nmbvlvZXjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IuW8uuihjOmUgeWumiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IuaOp+WItuS9leaXtumUgeWumuiuvuWkh++8jOi/memcgOimgeaCqOmHjeaWsOi+k+WFpeWvhueggeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IumZkOWItuWvhueggemAieaLqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiLpmZDliLbmgqjog73lpJ/kvb/nlKjnmoTlr4bnoIHnsbvlnovjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiLnm5HmjqfnmbvlvZXlsJ3or5UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4i55uR5o6n5a+55LqO55m75b2V6K6+5aSH5ZKM5omn6KGM5p+Q6aG55pON5L2c55qE5aSx6LSl5bCd6K+V44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4i6YeN572u5a+G56CBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IuW8uuihjOabtOaWsOWvhuegge+8jOaCqOmcgOimgeiOt+W+l+euoeeQhuWRmOaPkOS+m+eahOaWsOWvhueggeaJjeiDveeZu+W9leOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4i5by66KGM6ZSB5a6aIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4i5o6n5Yi25L2V5pe26ZSB5a6a6K6+5aSH77yM6L+Z6ZyA6KaB5oKo6YeN5paw6L6T5YWl5a+G56CB44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+Iua4hemZpOaJgOacieaVsOaNriI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4i5oGi5aSN5Ye65Y6C6K6+572u77yM6L+Z5Lya5Zyo5LiN5o+Q56S656Gu6K6k55qE5oOF5Ya15LiL5Yig6Zmk5oKo55qE5omA5pyJ5pWw5o2u44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLmgaLlpI3lh7rljoLorr7nva7vvIzov5nkvJrlnKjkuI3mj5DnpLrnoa7orqTnmoTmg4XlhrXkuIvliKDpmaTmgqjnmoTmiYDmnInmlbDmja7jgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiLor7forr7nva7lnKjlkK/nlKjmlL/nrZbnmoTmg4XlhrXkuIvopoHkvb/nlKjnmoTorr7lpIflhajlsYDku6PnkIbjgILlj6rmnInnrKzkuIDorr7lpIfnrqHnkIblkZjmiY3lj6/orr7nva7mnInmlYjnmoTlhajlsYDku6PnkIbjgIIiPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLkvY/lroUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLmiYvmnLoiPC9pdGVtPgpAQCAtNTQ0LDE0ICs1MzAsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLlhazlj7giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4i5YW25LuWIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IuiHquWumuS5iSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlQ3VzdG9tIiBtc2dpZD0iMjQ3MzU4MDU5MzExMTU5MDk0NSI+IuiHquWumuS5iSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlSG9tZSIgbXNnaWQ9IjYwOTM1OTgxODEwNjkzNTkyOTUiPiLkvY/lroUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZVdvcmsiIG1zZ2lkPSI2OTIwNzI1NzMwNzk3MDk5MDQ3Ij4i5Y2V5L2NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVPdGhlciIgbXNnaWQ9IjQ0MDg0MzYxNjI5NTAxMTk4NDkiPiLlhbbku5YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i6YCa6L+HIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiLml7bpl7TvvJo8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7vvIzmlrnlvI/vvJo8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUN1c3RvbSAoMjQ3MzU4MDU5MzExMTU5MDk0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZUhvbWUgKDYwOTM1OTgxODEwNjkzNTkyOTUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVXb3JrICg2OTIwNzI1NzMwNzk3MDk5MDQ3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiLovpPlhaUgUElOIOeggSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i6L6T5YWl5a+G56CB6L+b6KGM6Kej6ZSBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLovpPlhaUgUElOIOi/m+ihjOino+mUgSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTiDnoIHkuI3mraPnoa7vvIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4i6KaB6Kej6ZSB77yM6K+35YWI5oyJIE1FTlUg5YaN5oyJIDDjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i5oCl5pWR5oiW5oql6K2m55S16K+dIjwvc3RyaW5nPgpAQCAtNTY0LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Iui/lOWbnumAmuivnSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Iuato+ehru+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLlvojmirHmrYnvvIzor7fph43or5UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IuW+iOaKseatie+8jOivt+mHjeivlSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Iuato+WcqOWFheeUtSAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i5bey5YWF5ruh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NzgsNiArNTY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTSDljaHooqvplIHlrpoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiLmraPlnKjop6PplIEgU0lNIOWNoS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IuaCqOW3sue7jyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHnu5jplJnkuoboh6rlt7HnmoTop6PplIHlm77moYjjgIIiXG5cbiLor7flnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5ZCO6YeN6K+V44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i5oKo5bey57uPIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoemUmeivr+WcsOi+k+WFpeS6huWvhueggeOAgiJcblxuIuivt+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5LlkI7ph43or5XjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i5oKo5bey57uPIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoemUmeivr+WcsOi+k+WFpeS6hiBQSU7jgIIiXG5cbiLor7flnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5ZCO6YeN6K+V44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLmgqjlt7Lnu48gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh57uY6ZSZ5LqG6Ieq5bex55qE6Kej6ZSB5Zu+5qGI44CC5aaC5p6c5YaN5bCd6K+VIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOasoeWQjuS7jeS4jeaIkOWKn++8jOezu+e7n+S8muimgeaxguaCqOS9v+eUqOiHquW3seeahCBHb29nbGUg55m75b2V5L+h5oGv6Kej6ZSB5omL5py644CCIlxuXG4i6K+35ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IOenkuWQjumHjeivleOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4g56eS5ZCO6YeN6K+V44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLlv5jorrDkuoblm77moYjvvJ8iPC9zdHJpbmc+CkBAIC02MDYsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4i5piv5ZCm5LuO6K+l6aG16Z2i5a+86Iiq6Iez5a6D5aSE77yfIlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIumAieaLqeKAnOehruWumuKAnee7p+e7re+8jOaIlumAieaLqeKAnOWPlua2iOKAneeVmeWcqOW9k+WJjemhtemdouOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4i56Gu6K6kIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiLmj5DnpLrvvJrngrnmjInkuKTmrKHlj6/mlL7lpKflkoznvKnlsI/jgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiLor7vlj5bmtY/op4jlmajnmoTljoblj7LorrDlvZXlkozkuabnrb4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiLlhYHorrjlupTnlKjnqIvluo/or7vlj5bnlKjmtY/op4jlmajorr/pl67ov4fnmoTmiYDmnInnvZHlnYDvvIzku6Xlj4rmtY/op4jlmajnmoTmiYDmnInkuabnrb7jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiLlhpnlhaXmtY/op4jlmajnmoTljoblj7LorrDlvZXlkozkuabnrb4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiLlhYHorrjlupTnlKjnqIvluo/kv67mlLnlrZjlgqjlnKjmiYvmnLrkuK3nmoTmtY/op4jlmajljoblj7LorrDlvZXmiJbkuabnrb7jgILmgbbmhI/lupTnlKjnqIvluo/lj6/lgJ/mraTmuIXpmaTmiJbkv67mlLnmtY/op4jlmajmlbDmja7jgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+IuS/ruaUuea1j+iniOWZqOeahOWcsOeQhuS9jee9ruadg+mZkCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiLlhYHorrjlupTnlKjnqIvluo/kv67mlLnmtY/op4jlmajnmoTlnLDnkIbkvY3nva7mnYPpmZDjgILmgbbmhI/lupTnlKjnqIvluo/kvJrliKnnlKjov5nkuIDngrnlsIbkvY3nva7kv6Hmga/lj5HpgIHliLDku7vmhI/nvZHnq5njgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLmmK/lkKbluIzmnJvmtY/op4jlmajorrDkvY/mraTlr4bnoIHvvJ8iPC9zdHJpbmc+CkBAIC03MjYsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuWFqOmAiSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4i6YCJ5oup5paH5a2XIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuWJquWIhyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i5aSN5Yi2Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i57KY6LS0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiLlpI3liLbnvZHlnYAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiLpgInmi6nmloflrZcuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4i5paH5a2X6YCJ5oupIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i6L6T5YWl5rOVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IuWwhuKAnDx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7igJ3mt7vliqDliLDor43lhbgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLnvJbovpHmloflrZciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiLmloflrZfmk43kvZwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuWtmOWCqOepuumXtOS4jei2syI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IuaJi+acuuWGheWtmOepuumXtOaJgOWJqeS4jeWkmuS6huOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IuehruWumiI8L3N0cmluZz4KQEAgLTc0MSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IuehruWumiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IuWPlua2iCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLms6jmhI8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Iuato+WcqOi9veWFpS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i5omT5byAIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i5YWz6ZetIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLkvb/nlKjku6XkuIvmlrnlvI/lj5HpgIEiPC9zdHJpbmc+CkBAIC03NTksOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiLlvLrooYzlhbPpl60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4i5oql5ZGKIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiLnrYnlvoUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLlupTnlKjnqIvluo/lt7Lph43lrprlkJEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz7nm67liY3mraPlnKjov5DooYzjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz7lt7LlkK/liqjjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i5bqU55So56iL5bqPPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPu+8iDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPiDov5vnqIvvvInov53lj43kuoboh6rmiJHlvLrliLbmiafooYznmoTkuKXmoLzmqKHlvI8gKFN0cmljdE1vZGUpIOaUv+etluOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+Iui/m+eoiyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4g6L+d5Y+N5LqG6Ieq5oiR5by65Yi25omn6KGM55qE5Lil5qC85qih5byPIChTdHJpY3RNb2RlKSDmlL/nrZbjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+5q2j5Zyo6L+Q6KGMIjwvc3RyaW5nPgpAQCAtODA4LDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+IuWFqOmDqOaYvuekuiI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjIzOTkyODk5OTk2MDg5MDA0NDMiPiJVU0Ig5aSn5a656YeP5a2Y5YKoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iVVNCIOW3sui/nuaOpSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IuaCqOW3sumAmui/hyBVU0Ig5bCG5omL5py66L+e5o6l6Iez6K6h566X5py644CC5aaC5p6c5oKo6KaB5Zyo6K6h566X5py65ZKMIEFuZHJvaWQg5omL5py655qEIFNEIOWNoeS5i+mXtOWkjeWItuaWh+S7tu+8jOivt+eCueWHu+S4i+mdoueahOaMiemSruOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4i5oKo5bey6YCa6L+HIFVTQiDlsIbmiYvmnLrov57mjqXoh7PorqHnrpfmnLrjgILlpoLmnpzmgqjopoHlnKjorqHnrpfmnLrlkowgQW5kcm9pZCDmiYvmnLrnmoQgU0Qg5Y2h5LmL6Ze05aSN5Yi25paH5Lu277yM6K+354K55Ye75LiL6Z2i55qE5oyJ6ZKu44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiLmgqjlt7LpgJrov4cgVVNCIOWwhuaJi+acuui/nuaOpeiHs+iuoeeul+acuuOAguWmguaenOaCqOimgeWcqOiuoeeul+acuuWSjCBBbmRyb2lkIOaJi+acuueahCBTRCDljaHkuYvpl7TlpI3liLbmlofku7bvvIzor7fngrnlh7vkuIvpnaLnmoTmjInpkq7jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4i5omT5byAIFVTQiDlrZjlgqjorr7lpIciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiLkvb/nlKggU0Qg5Y2h6L+b6KGMIFVTQiDlrZjlgqjml7blh7rnjrDpl67popjjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IuS9v+eUqCBTRCDljaHov5vooYwgVVNCIOWtmOWCqOaXtuWHuueOsOmXrumimOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4i5L2/55SoIFNEIOWNoei/m+ihjCBVU0Ig5a2Y5YKo5pe25Ye6546w6Zeu6aKY44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQiDlt7Lov57mjqUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiLpgInmi6nlsIbmlofku7blpI3liLbliLDorqHnrpfmnLrmiJbku47orqHnrpfmnLrlpI3liLbliLDlrZjlgqjorr7lpIfjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiLlhbPpl60gVVNCIOWtmOWCqOiuvuWkhyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4i6YCJ5Lit5Lul5YWz6ZetIFVTQiDlrZjlgqjorr7lpIfjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4i5L2/55So5Lit55qEIFVTQiDlrZjlgqjorr7lpIciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IuWcqOWFs+mXrSBVU0Ig5a2Y5YKo6K6+5aSH5YmN77yM6K+356Gu5L+d5oKo5bey5LuO6K6h566X5py65Lit5Y246L2977yI4oCc5by55Ye64oCd77yJQW5kcm9pZCDmiYvmnLrnmoQgU0Qg5Y2h44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IuWcqOWFs+mXrSBVU0Ig5a2Y5YKo6K6+5aSH5YmN77yM6K+356Gu5L+d5oKo5bey5LuO6K6h566X5py65Lit5Y246L2977yI4oCc5by55Ye64oCd77yJQW5kcm9pZCDmiYvmnLrnmoQgU0Qg5Y2h44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IuWcqOWFs+mXrSBVU0Ig5a2Y5YKo6K6+5aSH5YmN77yM6K+356Gu5L+d5oKo5bey5LuO6K6h566X5py65Lit5Y246L2977yI4oCc5by55Ye64oCd77yJQW5kcm9pZCDmiYvmnLrnmoQgU0Qg5Y2h44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4i5YWz6ZetIFVTQiDlrZjlgqjorr7lpIciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiLlhbPpl60gVVNCIOWtmOWCqOiuvuWkh+aXtumBh+WIsOmXrumimOOAguivt+ajgOafpeW5tuehruS/neW3suWNuOi9veS6hiBVU0Ig5Li76K6+5aSH77yM54S25ZCO6YeN6K+V44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4i5omT5byAIFVTQiDlrZjlgqjorr7lpIciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiLlpoLmnpzmgqjmiZPlvIDkuoYgVVNCIOWtmOWCqOiuvuWkh++8jOWImeaCqOW9k+WJjeS9v+eUqOeahOafkOS6m+W6lOeUqOeoi+W6j+S8muWBnOatou+8jOiAjOS4lOWcqOaCqOWFs+mXrSBVU0Ig5a2Y5YKo6K6+5aSH5YmN5Y+v6IO96YO95peg5rOV5L2/55So44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQiDmk43kvZzlpLHotKUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4i56Gu5a6aIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiLmoLzlvI/ljJYgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IuagvOW8j+WMliBTRCDljaEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4i56Gu5a6a6KaB5bCGIFNEIOWNoeagvOW8j+WMluWQl++8n+ivpeWNoeS4iueahOaJgOacieaVsOaNrumDveWwhuS4ouWkseOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IuehruWumuimgeWwhiBTRCDljaHmoLzlvI/ljJblkJfvvJ/or6XljaHkuIrnmoTmiYDmnInmlbDmja7pg73lsIbkuKLlpLHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4i5qC85byP5YyWIFNEIOWNoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IuehruWumuimgeWwhiBTRCDljaHmoLzlvI/ljJblkJfvvJ/or6XljaHkuIrnmoTmiYDmnInmlbDmja7pg73lsIbkuKLlpLHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiLmoLzlvI/ljJYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiLlt7Lov57mjqUgVVNCIOiwg+ivlSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4i6YCJ5oup5YGc55SoIFVTQiDosIPor5XjgIIiPC9zdHJpbmc+CkBAIC04MzcsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiLlgJnpgIkiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4i5q2j5Zyo5YeG5aSHIFNEIOWNoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4i5q2j5Zyo5YeG5aSHIFNEIOWNoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4i5q2j5Zyo5YeG5aSHIFNEIOWNoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiLmraPlnKjmo4Dmn6XmmK/lkKbmnInplJnor6/jgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4i56m6IFNEIOWNoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IuepuiBTRCDljaEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iU0Qg5Y2h5Li656m65oiW5L2/55So5LiN5pSv5oyB55qE5paH5Lu257O757uf44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qg5Y2h5peg5paH5Lu257O757uf77yM5oiW5paH5Lu257O757uf5LiN5Y+X5pSv5oyB44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4iU0Qg5Y2h5Y+X5o2fIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJTRCDljaHlj5fmjZ8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IlNEIOWNoeWPl+aNn+OAguaCqOWPr+iDvemcgOimgemHjeaWsOagvOW8j+WMluaCqOeahOWNoeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTRCDljaHlt7LmjZ/lnY/jgILmgqjlj6/og73lv4XpobvlsIblhbbph43mlrDmoLzlvI/ljJbjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IlNEIOWNoeacquato+W4uOenu+mZpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRCDljaHmnKrmraPluLjnp7vpmaQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4i6K+35YWI5Y246L29IFNEIOWNoe+8jOWGjeWwhuWFtuenu+mZpO+8jOS7pemYsuaVsOaNruS4ouWkseOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+Iuivt+WFiOWNuOi9vSBTRCDljaHvvIzlho3lsIblhbbnp7vpmaTvvIzku6XpmLLmlbDmja7kuKLlpLHjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+IlNEIOWNoeW3suWuieWFqOenu+mZpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlNEIOWNoeW3suWuieWFqOenu+mZpCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IueOsOWcqOWPr+S7peWuieWFqOenu+mZpCBTRCDljaHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4i5oKo546w5Zyo5Y+v5Lul5a6J5YWo56e76ZmkIFNEIOWNoeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4i5bey56e76ZmkIFNEIOWNoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiLlt7Lnp7vpmaQgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IlNEIOWNoeW3suenu+mZpOOAguivt+aPkuWFpeaWsCBTRCDljaHmnaXlop7liqDmgqjnmoTorr7lpIflrZjlgqjnqbrpl7TjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRCDljaHlt7Lnp7vpmaTjgILor7fmj5LlhaXmlrDnmoQgU0Qg5Y2h44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4i56m6IFNEIOWNoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNEIOWNoeaXoOaWh+S7tuezu+e7n++8jOaIluaWh+S7tuezu+e7n+S4jeWPl+aUr+aMgeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iU0Qg5Y2h5Y+X5o2fIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNEIOWNoeW3suaNn+Wdj+OAguaCqOWPr+iDveW/hemhu+WwhuWFtumHjeaWsOagvOW8j+WMluOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRCDljaHmnKrmraPluLjnp7vpmaQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLor7flhYjljbjovb0gU0Qg5Y2h77yM5YaN5bCG5YW256e76Zmk77yM5Lul6Ziy5pWw5o2u5Lii5aSx44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU0Qg5Y2h5bey5a6J5YWo56e76ZmkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IuaCqOeOsOWcqOWPr+S7peWuieWFqOenu+mZpCBTRCDljaHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4i5bey56e76ZmkIFNEIOWNoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNEIOWNoeW3suenu+mZpOOAguivt+aPkuWFpeaWsOeahCBTRCDljaHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+IuaJvuS4jeWIsOWMuemFjeeahOa0u+WKqCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiLmm7TmlrDnu4Tku7bkvb/nlKjmg4XlhrXnu5/orqEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4i5YWB6K645L+u5pS55pS26ZuG55qE57uE5Lu25L2/55So5oOF5Ya157uf6K6h44CC5pmu6YCa5bqU55So56iL5bqP5LiN6IO95L2/55So5q2k5p2D6ZmQ44CCIjwvc3RyaW5nPgpAQCAtODk0LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLln7rkuo7pooTlhbHkuqvlr4bpkqXnmoQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4i5Z+65LqO6K+B5Lmm55qEIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4i6YCJ5oup5paH5Lu2Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i5pyq6YCJ5a6a5Lu75L2V5paH5Lu2Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4i6YeN572uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IuaPkOS6pCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i5pS26JePIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i5bey5ZCv55So6L2m6L295qih5byPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IumAieaLqemAgOWHuui9pui9veaooeW8jyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJVU0Ig57uR5a6a5oiW54Ot54K55bey5ZCv55SoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i6Kem5pG45Y+v6L+b6KGM6YWN572uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i5LiK5LiA5q2lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i5LiL5LiA5q2lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4i6Lez6L+HIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i5omL5py65rWB6YeP6L+H5aSaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLovbvop6bku6Xkuobop6PmnInlhbPmiYvmnLrmtYHph4/or6bmg4UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuW3sui2heWHuuaJi+acuuaVsOaNruS4iumZkCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLovbvop6bku6Xkuobop6PmnInlhbPmiYvmnLrmtYHph4/or6bmg4UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+IuaXoOWMuemFjemhuSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiLlnKjnvZHpobXkuIrmn6Xmib4iPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMSDkuKrljLnphY3pobkiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiLnrKwgPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4g6aG577yM5YWxIDx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+IOmhuSI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAppbmRleCA2NDkwYzU1Li41ZGJkOGEzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApAQCAtMTY5LDggKzE2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjM0NDYxNjQ1ODQ3MTA1OTY1MTMiPiLplovnmbzlt6XlhbciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4i5Y+q5pyJ6ZaL55m86ICF6ZyA6KaB5q2k5Yqf6IO944CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4i5YSy5a2YIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiLlrZjlj5YgU0Qg5Y2h44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IuWtmOWPliBTRCDljaHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4i5a2Y5Y+WIFNEIOWNoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+IuWBnOeUqOaIluiuiuabtOeLgOaFi+WIlyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiLlhYHoqLHmh4nnlKjnqIvlvI/lgZznlKjni4DmhYvliJfmiJbmlrDlop7jgIHnp7vpmaTns7vntbHlnJbnpLrjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4i54uA5oWL5YiXIjwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiLlhYHoqLHmh4nnlKjnqIvlvI/liKrpmaTlv6vlj5bnm67pjIToo6HnmoTmqpTmoYjvvIzph4vmlL7lhLLlrZjnqbrplpPjgILmraTmk43kvZzpgJrluLjlj5fliLDns7vntbHnqIvluo/lmrTmoLzpmZDliLbjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4i56e75YuV5oeJ55So56iL5byP6LOH5rqQIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4i5YWB6Kix5oeJ55So56iL5byP5bCH5oeJ55So56iL5byP6LOH5rqQ5b6e5YWn6YOo5aqS6auU56e75Yiw5aSW6YOo5aqS6auU77yM5Y+N5LmL5Lqm5Y+v44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiLoroDlj5bmqZ/lr4boqJjpjITos4fmlpkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgbXNnaWQ9Ijg4OTY0NDk0Mzc0NjQ4Njc3NjYiPiLlhYHoqLHmh4nnlKjnqIvlvI/oroDlj5bns7vntbHnmoTlkITnqK7oqJjpjITmqpTjgILpgJnmnIPlhYHoqLHmh4nnlKjnqIvlvI/mkJzlsIvkuIDoiKzmgKfnmoTpm7voqbHkvb/nlKjos4foqIrvvIzlj6/og73ljIXlkKvmgqjnmoTlgIvkurrmiJbnp4Hkurros4foqIrjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiLoroDlr6sgZGlhZyDmk4HmnInnmoTos4fmupAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IuWFgeioseaHieeUqOeoi+W8j+iugOWvqyBkaWFnIOe+pOe1hOeahOizh+a6kO+8m+S+i+Wmgu+8mi9kZXYg6KOh55qE5qqU5qGI44CC6YCZ5Y+v6IO95pyD5b2x6Z+/57O757Wx56mp5a6a5oCn6IiH5a6J5YWo5oCn44CC5q2k5Yqf6IO95YOF5L6b6KO96YCg5ZWG5oiW5oqA6KGT5Lq65ZOh55So5pa856Gs6auU6KaP5qC85YG15ris44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4i5ZWf55So5oiW5YGc55So5oeJ55So56iL5byP5YWD5Lu2Ijwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4i5YWB6Kix5oeJ55So56iL5byP6Kit5a6a5pys5qmf6JeN54mZ6Zu76Kmx77yM5Lul5Y+K5YG15ris6IiH6YWN5bCN5YW25LuW6YGg56uv6KOd572u44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4i5bu656uL6JeN54mZ6YCj57eaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4i5YWB6Kix5oeJ55So56iL5byP5qqi6KaW5pys5qmf6JeN54mZ6Zu76Kmx6Kit5a6a77yM5Lim6IiH5YW25LuW6YWN5bCN6KOd572u6YCj57ea44CCIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjQWRtaW4gKDIyNTEzMDIyMzMwMTIyNTAwNTYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjQWRtaW4gKDE5MzU4NDI2MTE0NjQ4OTU3ODUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNSYXcgKDQ0MjM0NzE3MTExMTQzMjU3MDgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjUmF3ICg1NTMzMDIyNzM2NTU5Mzg1NjY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTm90aWZ5ICg0Nzg0NzAzNjAwODI3OTIzNTgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTm90aWZ5ICgyOTkwMDUzNTE3OTYyMDcwNjE3KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTGxjcCAoNDk3MjA1MTQ2MTAwNzAzMDQyNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNMbGNwICg5MTU5MjEyNzc4NjAwNDY0MCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+IuWBnOeUqOaMiemNtemOluWumiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiLlhYHoqLHmh4nnlKjnqIvlvI/lgZznlKjmjInpjbXpjpblrprku6Xlj4rlhbbku5bnm7jpl5znmoTlr4bnorzlronlhajmgKfjgILkvovlpoLvvJrmlLbliLDkvobpm7vmmYLop6PpmaTmjInpjbXpjpblrprvvIzpgJroqbHntZDmnZ/lvozph43mlrDllZ/li5XmjInpjbXpjpblrprjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4i6K6A5Y+W5ZCM5q2l6JmV55CG6Kit5a6aIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IuWFgeioseaHieeUqOeoi+W8j+iugOWPluS9v+eUqOiAheWEsuWtmOWcqOS9v+eUqOiAheWtl+WFuOWFp+eahOS7u+S9leengeS6uuWtl+ipnuOAgeWQjeeoseWSjOipnue1hOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+IuWvq+WFpeS9v+eUqOiAheWumue+qeeahOWtl+WFuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiLlhYHoqLHmh4nnlKjnqIvlvI/lsIfmlrDlrZfoqZ7lr6vlhaXkvb/nlKjogIXnmoTlrZflhbjjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+IuS/ruaUuS/liKrpmaQgU0Qg5Y2h55qE5YWn5a65Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLkv67mlLkv5Yiq6ZmkIFNEIOWNoeeahOWFp+WuuSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiLlhYHoqLHmh4nnlKjnqIvlvI/lr6vlhaUgU0Qg5Y2h44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4i5YWB6Kix5oeJ55So56iL5byP5a+r5YWlIFNEIOWNoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i5L+u5pS5L+WIqumZpCBTRCDljaHnmoTlhaflrrkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiLlhYHoqLHmh4nnlKjnqIvlvI/lr6vlhaUgU0Qg5Y2h44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+IuWtmOWPluW/q+WPluaqlOahiOezu+e1sSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4i5YWB6Kix5oeJ55So56iL5byP6K6A5Y+W5Y+K5a+r5YWl5b+r5Y+W5qqU5qGI57O757Wx44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4i6ZmQ5Yi25a+G56K86Kit5a6a6KaP5YmHIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IumZkOWItuWFgeioseS9v+eUqOeahOWvhueivOmhnuWei+OAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4i5p+l55yL55m75YWl5ZiX6Kmm6KiY6YyEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+Iuebo+imluiAheeEoeazleeZu+WFpeijnee9ruWft+ihjOmDqOWIhuWLleS9nOOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+IumHjeioreWvhueivCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDMzMzIxNjc2MDAzMzE3OTk5OTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjUzOTEyNDA2MTY5ODEyOTczNjEiPiLlvLfliLbph43mlrDoqK3lrprlr4bnorzjgILmgqjlv4XpoIjlj5blvpfku6XnrqHnkIblk6Hmj5DkvpvnmoTmlrDlr4bnorzvvIzmiY3og73nmbvlhaXjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IuW8t+WItumOluWumiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+Iuijnee9rumOluWumuaZguWPr+WPluW+l+aOp+WItu+8jOS9huW/hemgiOmHjeaWsOi8uOWFpeWvhueivOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IumZkOWItuWvhueivOioreWumuimj+WJhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiLpmZDliLblhYHoqLHkvb/nlKjnmoTlr4bnorzpoZ7lnovjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiLmn6XnnIvnmbvlhaXlmJfoqaboqJjpjIQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4i55uj6KaW6ICF54Sh5rOV55m75YWl6KOd572u5Z+36KGM6YOo5YiG5YuV5L2c44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4i6YeN6Kit5a+G56K8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IuW8t+WItumHjeaWsOioreWumuWvhueivOOAguaCqOW/hemgiOWPluW+l+S7peeuoeeQhuWToeaPkOS+m+eahOaWsOWvhueivO+8jOaJjeiDveeZu+WFpeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4i5by35Yi26Y6W5a6aIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4i6KOd572u6Y6W5a6a5pmC5Y+v5Y+W5b6X5o6n5Yi277yM5L2G5b+F6aCI6YeN5paw6Ly45YWl5a+G56K844CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+Iua4hemZpOaJgOacieizh+aWmSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4i6YeN6Kit54K65Y6f5bug6Kit5a6aICjns7vntbHmnIPliKrpmaTmiYDmnInos4fmlpnvvIzkuJTkuI3mnIPlkJHmgqjpgLLooYznorroqo0p44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLph43oqK3ngrrljp/lu6DoqK3lrpogKOezu+e1seacg+WIqumZpOaJgOacieizh+aWme+8jOS4lOS4jeacg+WQkeaCqOmAsuihjOeiuuiqjSnjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiLoqK3lrprmlL/nrZbllZ/nlKjmmYLmiYDopoHkvb/nlKjnmoToo53nva7lhajln58gUHJveHnvvIzlj6rmnInnrKzkuIDlgIvoo53nva7nrqHnkIblk6HmiYDoqK3lrprnmoTlhajln58gUHJveHkg5YW35pyJ5pWI5Yqb44CCIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4i5L2P5a626Zu76KmxIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4i6KGM5YuV6Zu76KmxIjwvaXRlbT4KQEAgLTU0NCwxNCArNTMwLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i5YWs5Y+4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IuWFtuS7liI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLoh6roqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUN1c3RvbSIgbXNnaWQ9IjI0NzM1ODA1OTMxMTE1OTA5NDUiPiLoh6roqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZUhvbWUiIG1zZ2lkPSI2MDkzNTk4MTgxMDY5MzU5Mjk1Ij4i5L2P5a62Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2lwQWRkcmVzc1R5cGVXb3JrIiBtc2dpZD0iNjkyMDcyNTczMDc5NzA5OTA0NyI+IuWFrOWPuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNpcEFkZHJlc3NUeXBlT3RoZXIiIG1zZ2lkPSI0NDA4NDM2MTYyOTUwMTE5ODQ5Ij4i5YW25LuWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+IumAj+mBjiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+6YCP6YGO44CMPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz7jgI0iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVDdXN0b20gKDI0NzM1ODA1OTMxMTE1OTA5NDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVIb21lICg2MDkzNTk4MTgxMDY5MzU5Mjk1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlV29yayAoNjkyMDcyNTczMDc5NzA5OTA0NykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4i6Ly45YWlIFBJTiDnorwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+Iui8uOWFpeWvhueivOWNs+WPr+ino+mOliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i6Ly45YWlIFBJTiDpgLLooYzop6PpjpYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJQSU4g56K86Yyv6Kqk77yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IuWmguimgeino+mOlu+8jOiri+aMiSBNZW51IOmNte+8jOeEtuW+jOaMiSAw44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Iue3iuaApembu+ipseiZn+eivCI8L3N0cmluZz4KQEAgLTU2NCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLov5Tlm57pgJroqbEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLmraPnorrvvIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i5b6I5oqx5q2J77yM6KuL5YaN6Kmm5LiA5qyhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLlvojmirHmrYnvvIzoq4vlho3oqabkuIDmrKEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLmraPlnKjlhYXpm7sgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IuWFhembu+WujOaIkOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTc4LDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0g5Y2h5bey6Y6W5a6a44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4i6Kej6Y6WIFNJTSDljaHkuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLnlavlh7rop6PpjpblnJblvaLlt7LpjK/oqqQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh44CCIlxuXG4iIOiri+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5Llvozlho3lmJfoqabjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLmgqjlt7IgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6Ly45YWl5LiN5q2j56K655qE5a+G56K844CCIlxuXG4i6KuL5pa8IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLmgqjlt7IgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6Ly45YWl5LiN5q2j56K655qEIFBJTuOAgiJcblxuIuiri+aWvCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IueVq+WHuuino+mOluWcluW9ouW3sumMr+iqpCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHjgILlho3pjK/oqqQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g5qyh5b6M77yM57O757Wx5pyD6KaB5rGC5L2/55SoIEdvb2dsZSDnmbvlhaXkvobop6PpjpbjgIIiXG5cbiIg6KuL5ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLlv5joqJjop6PpjpblnJblvaLvvJ8iPC9zdHJpbmc+CkBAIC02MDYsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4i6Zui6ZaL5q2k6aCB77yfIlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIiDpgbjlj5YgW+eiuuWuml0g6Zui6ZaL5q2k6aCB77yb5oiWIFvlj5bmtohdIOeVmeWcqOatpOmggeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4i56K66KqNIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiLmj5DnpLrvvJrovJXmjInlhankuIvlj6/mlL7lpKfnuK7lsI/jgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiLoroDlj5bngI/opr3lmajnmoToqJjpjIToiIfmm7jnsaQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiLlhYHoqLHmh4nnlKjnqIvlvI/oroDlj5bngI/opr3lmajmm77ntpPpgKDoqKrpgY7nmoTmiYDmnInntrLlnYDvvIzku6Xlj4rngI/opr3lmajnmoTmiYDmnInmm7jnsaTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiLlr6vlhaXngI/opr3lmajnmoToqJjpjIToiIfmm7jnsaQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiLlhYHoqLHmh4nnlKjnqIvlvI/kv67mlLnlhLLlrZjlnKjpm7voqbHkuIrnmoTngI/opr3oqJjpjITmiJbmm7jnsaTjgILoq4vms6jmhI/vvJrmg6HmhI/mh4nnlKjnqIvlvI/lj6/og73mnIPkvb/nlKjmraTpgbjpoIXkvobmuIXpmaTmiJbkv67mlLnmgqjngI/opr3lmajnmoTos4fmlpnjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+IuS/ruaUueeAj+imveWZqOWcsOeQhuizh+ioiueahOasiumZkCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiLlhYHoqLHmh4nnlKjnqIvlvI/kv67mlLnngI/opr3lmajnmoTlnLDnkIbkvY3nva7mrIrpmZDvvIzmg6HmhI/mh4nnlKjnqIvlvI/lj6/og73mnIPpgI/pgY7mraTmlrnlvI/lhYHoqLHlsIfmgqjnmoTkvY3nva7os4foqIrku7vmhI/lgrPpgIHntabmn5DkupvntrLnq5njgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLmmK/lkKboqJjkvY/mraTlr4bnorzvvJ8iPC9zdHJpbmc+CkBAIC03MjYsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuWFqOmDqOmBuOWPliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4i6YG45Y+W5a2X6KmeIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuWJquS4iyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i6KSH6KO9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i6LK85LiKIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiLopIfoo73ntrLlnYAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiLpgbjlj5bmloflrZcuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4i6YG45Y+W5paH5a2XIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i6Ly45YWl5pa55byPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IuWwh+OAjDx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7jgI3mlrDlop7oh7PlrZflhbgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLnt6jovK/mloflrZciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiLmloflrZfli5XkvZwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuWEsuWtmOepuumWk+WNs+Wwh+S4jei2syI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IuaJi+apn+WEsuWtmOepuumWk+WNs+Wwh+S4jei2s+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IueiuuWumiI8L3N0cmluZz4KQEAgLTc0MSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IueiuuWumiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IuWPlua2iCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLms6jmhI8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Iui8ieWFpeS4rS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i6ZaL5ZWfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i6Zec6ZaJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLlrozmiJDmk43kvZzpnIDkvb/nlKgiPC9zdHJpbmc+CkBAIC03NTksOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiLlvLfliLbpl5zplokiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4i5Zue5aCxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiLnrYnlvoUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLmh4nnlKjnqIvlvI/lt7Lph43mlrDlsI7lkJEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+IuOAjDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz7jgI3nj77lnKjmraPlnKjln7fooYzjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IuOAjDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz7jgI3ljp/lhYjlt7LllZ/li5XjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i5oeJ55So56iL5byPIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKOiZleeQhueoi+W6jyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIOW3sumBleWPjeWFtuiHquihjOW8t+WItuWvpuaWveeahOWatOagvOaooeW8jyAoU3RyaWN0TW9kZSkg5pS/562W44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i6JmV55CG56iL5bqPIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDlt7LpgZXlj43lhbboh6rooYzlvLfliLblr6bmlr3nmoTlmrTmoLzmqKHlvI8gKFN0cmljdE1vZGUpIOaUv+etluOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g5Z+36KGM5LitIjwvc3RyaW5nPgpAQCAtODA4LDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+Iumhr+ekuuWFqOmDqCI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjIzOTkyODk5OTk2MDg5MDA0NDMiPiJVU0Ig5aSn6YeP5YSy5a2Y6KOd572uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iVVNCIOW3sumAo+aOpSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IuW3sumAj+mBjiBVU0Ig6YCj5o6l5omL5qmf6IiH6Zu76IWm44CC5aaC6KaB5b6e6Zu76IWm5oiWIEFuZHJvaWQg57O757Wx55qEIFNEIOWNoeikh+ijveaqlOahiO+8jOiri+mBuOWPluS4i+aWueaMiemIleOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4i5bey6YCP6YGOIFVTQiDpgKPmjqXmiYvmqZ/oiIfpm7vohabjgILlpoLopoHlvp7pm7vohabmiJYgQW5kcm9pZCDns7vntbHnmoQgU0Qg5Y2h6KSH6KO95qqU5qGI77yM6KuL6YG45Y+W5LiL5pa55oyJ6YiV44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiLlt7LpgI/pgY4gVVNCIOmAo+aOpeaJi+apn+iIh+mbu+iFpuOAguWmguimgeW+numbu+iFpuaIliBBbmRyb2lkIOezu+e1seeahCBTRCDljaHopIfoo73mqpTmoYjvvIzoq4vpgbjlj5bkuIvmlrnmjInpiJXjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4i6ZaL5ZWfIFVTQiDlhLLlrZjoo53nva4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiLmioogU0Qg5Y2h55W25oiQIFVTQiDlhLLlrZjoo53nva7mmYLnmbznlJ/llY/poYzjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IuaKiiBTRCDljaHnlbbmiJAgVVNCIOWEsuWtmOijnee9ruaZgueZvOeUn+WVj+mhjOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4i5oqKIFNEIOWNoeeVtuaIkCBVU0Ig5YSy5a2Y6KOd572u5pmC55m855Sf5ZWP6aGM44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQiDlt7LpgKPmjqUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiLpgbjlj5bmraTpoIXlsIfmqpTmoYjopIfoo73liLDpm7vohabvvIzmiJblvp7pm7vohabopIfoo73jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiLpl5zplokgVVNCIOWEsuWtmOijnee9riI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4i6YG45Y+W5q2k6JmV6Zec6ZaJIFVTQiDlhLLlrZjoo53nva7jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iVVNCIOWEsuWtmOepuumWk+S9v+eUqOS4rSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4i6Zec6ZaJIFVTQiDlhLLlrZjoo53nva7liY3vvIzoq4vli5nlv4XlhYjlsIcgQW5kcm9pZCDns7vntbHnmoQgU0Qg5Y2h5b6e6Zu76IWm5LiK5Y245LiLICjpgIDlh7op44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IumXnOmWiSBVU0Ig5YSy5a2Y6KOd572u5YmN77yM6KuL5YuZ5b+F5YWI5bCHIEFuZHJvaWQg57O757Wx55qEIFNEIOWNoeW+numbu+iFpuS4iuWNuOS4iyAo6YCA5Ye6KeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiLpl5zplokgVVNCIOWEsuWtmOijnee9ruWJje+8jOiri+WLmeW/heWFiOWwhyBBbmRyb2lkIOezu+e1seeahCBTRCDljaHlvp7pm7vohabkuIrljbjkuIsgKOmAgOWHuinjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiLpl5zplokgVVNCIOWEsuWtmOijnee9riI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IumXnOmWiSBVU0Ig5YSy5a2Y6KOd572u5pmC55m855Sf5ZWP6aGM44CC6KuL5qqi5p+l5oKo5piv5ZCm5bey5Y246LyJIFVTQiBIb3N077yM54S25b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4i6ZaL5ZWfIFVTQiDlhLLlrZjoo53nva4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiLlpoLmnpzmgqjplovllZ8gVVNCIOWEsuWtmOijnee9ru+8jOWJh+aCqOato+WcqOS9v+eUqOeahOafkOS6m+aHieeUqOeoi+W8j+acg+WBnOatoumBi+S9nO+8jOiAjOS4lOWPr+iDveeEoeazleS9v+eUqO+8jOW+heaCqOWwhyBVU0Ig5YSy5a2Y6KOd572u6Zec6ZaJ5omN5pyD5oGi5b6p5q2j5bi444CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQiDmk43kvZzlpLHmlZciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4i56K65a6aIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiLlsIcgU0Qg5Y2h5qC85byP5YyWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IuWwhyBTRCDljaHmoLzlvI/ljJYiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4i56K65a6a6KaB5bCHIFNEIOWNoeagvOW8j+WMluWXju+8n+ipsiBTRCDljaHkuK3nmoTmiYDmnInos4fmlpnlsIfmnIPpgbrlpLHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiLnorrlrpropoHlsIcgU0Qg5Y2h5qC85byP5YyW5ZeO77yf6KmyIFNEIOWNoeS4reeahOaJgOacieizh+aWmeWwh+acg+mBuuWkseOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiLlsIcgU0Qg5Y2h5qC85byP5YyWIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4i56K65a6a6KaB5bCHIFNEIOWNoeagvOW8j+WMluWXju+8n+ipsiBTRCDljaHkuK3nmoTmiYDmnInos4fmlpnlsIfmnIPpgbrlpLHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiLmoLzlvI/ljJYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJVU0Ig5YG16Yyv5qih5byP5bey5ZWf55SoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiLpgbjlj5bku6XlgZznlKggVVNCIOWBtemMr+OAgiI8L3N0cmluZz4KQEAgLTgzNywyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+IuW+hemBuOmgheebriI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiLmraPlnKjmupblgpkgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiLmraPlnKjmupblgpkgU0Qg5Y2hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiLmraPlnKjmupblgpkgU0Qg5Y2hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+Iuato+WcqOaqouafpemMr+iqpOOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJTRCDljaHngrrnqbrnmb0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJTRCDljaHngrrnqbrnmb0iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iU0Qg5Y2h54K656m655m95oiW5L2/55So5LiN5pSv5o+055qE5qqU5qGI57O757Wx44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qg5Y2h5YWn54Sh5qqU5qGI57O757Wx77yM5oiW5qqU5qGI57O757Wx5LiN5Y+X5pSv5o+044CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4iU0Qg5Y2h5bey5pCN5aOeIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJTRCDljaHlt7LmkI3lo54iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IlNEIOWNoeW3suaQjeWjnuOAguaCqOWPr+iDvemcgOimgeWwhyBTRCDljaHph43mlrDmoLzlvI/ljJbjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qg5Y2h5bey5q+A5pCN77yM5oKo5Y+v6IO95b+F6aCI5LqI5Lul6YeN5paw5qC85byP5YyW44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiJTRCDljaHmnKrmraPluLjnp7vpmaQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Qg5Y2h5pyq5q2j5bi456e76ZmkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+Iuiri+WFiOWNuOi8iSBTRCDljaHvvIzlho3lsIflhbbnp7vpmaTvvIzku6XlhY3os4fmlpnpgbrlpLHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLoq4vlhYjljbjovIkgU0Qg5Y2h77yM5YaN5bCH5YW256e76Zmk77yM5Lul5YWN6LOH5paZ6YG65aSx44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiLlj6/lronlhajnp7vpmaQgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4i5Y+v5a6J5YWo56e76ZmkIFNEIOWNoSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IuePvuWcqOWPr+S7peWuieWFqOenu+mZpCBTRCDljaHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4i5oKo54++5Zyo5Y+v5Lul5a6J5YWo5Zyw56e76ZmkIFNEIOWNoeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4i5bey56e76ZmkIFNEIOWNoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiLlt7Lnp7vpmaQgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IuW3suenu+mZpCBTRCDljaHjgILoq4vmj5LlhaXmlrDnmoQgU0Qg5Y2h5L6G5aKe5Yqg6KOd572u55qE5YSy5a2Y5a656YeP44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qg5Y2h5bey56e76Zmk77yM6KuL5o+S5YWl5paw55qEIFNEIOWNoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlNEIOWNoeeCuuepuueZvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNEIOWNoeWFp+eEoeaqlOahiOezu+e1se+8jOaIluaqlOahiOezu+e1seS4jeWPl+aUr+aPtOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iU0Qg5Y2h5bey5pCN5aOeIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNEIOWNoeW3suavgOaQje+8jOaCqOWPr+iDveW/hemgiOS6iOS7pemHjeaWsOagvOW8j+WMluOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRCDljaHmnKrmraPluLjnp7vpmaQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLoq4vlhYjljbjovIkgU0Qg5Y2h77yM5YaN5bCH5YW256e76Zmk77yM5Lul5YWN6LOH5paZ6YG65aSx44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4i5Y+v5a6J5YWo56e76ZmkIFNEIOWNoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiLmgqjnj77lnKjlj6/ku6XlronlhajlnLDnp7vpmaQgU0Qg5Y2h44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IuW3suenu+mZpCBTRCDljaEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRCDljaHlt7Lnp7vpmaTvvIzoq4vmj5LlhaXmlrDnmoQgU0Qg5Y2h44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiLmib7kuI3liLDnrKblkIjnmoTmtLvli5UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4i5pu05paw5YWD5Lu25L2/55So57Wx6KiI6LOH5paZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IuWFgeioseS/ruaUueaUtumbhuWIsOeahOWFg+S7tuS9v+eUqOe1seioiOizh+aWmeOAguS4gOiIrOaHieeUqOeoi+W8j+S4jeacg+S9v+eUqOatpOWKn+iDveOAgiI8L3N0cmluZz4KQEAgLTg5NCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4i5o6h55So6aCQ5YWI5YWx55So6YeR6ZGw55qEIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IuaOoeeUqOaGkeitieeahCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IumBuOaTh+aqlOahiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IuacqumBuOaTh+S7u+S9leaqlOahiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IumHjeiorSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLmj5DkuqQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuaIkeeahOacgOaEmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IuW3suWVn+eUqOi7iueUqOaooeW8jyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLpgbjlj5bntZDmnZ/ou4rnlKjmqKHlvI/jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i5pW45pOa6YCj57ea5oiW54Sh57ea5Z+65Zyw5Y+w5bey5ZWf55SoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i6LyV6Ke45Lul6Kit5a6aIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i6L+U5ZueIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i57m857qMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4i55Wl6YGOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i6auY6KGM5YuV6LOH5paZ55So6YePIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLovJXop7jljbPlj6/nnq3op6Pmm7TlpJrmnInpl5zooYzli5Xos4fmlpnnlKjph4/nmoToqbPntLDos4foqIoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuW3sumBlOihjOWLleizh+aWmeS4iumZkCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLovJXop7jljbPlj6/nnq3op6Pmm7TlpJrmnInpl5zooYzli5Xos4fmlpnnlKjph4/nmoToqbPntLDos4foqIoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+IuaykuacieebuOespumgheebriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiLlnKjpoIHpnaLkuK3lsIvmib4iPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMSDlgIvnm7jnrKbpoIXnm64iPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiLnrKwgPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4g5YCL55u456ym6aCF55uuICjlhbEgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4g5YCL55u456ym6aCF55uuKSI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCmluZGV4IGEzMzg1MWMuLjgzMGZiMDEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKQEAgLTEwMyw0ICsxMDMsMTYgQEAKICAgICAgICAgPGl0ZW0+MzwvaXRlbT4KICAgICA8L2ludGVnZXItYXJyYXk+CiAKKyAgICA8IS0tIFVzZWQgaW4gTG9jYWxlUGlja2VyIC0tPgorICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0ic3BlY2lhbF9sb2NhbGVfY29kZXMiPgorICAgICAgICA8aXRlbT56aF9DTjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+emhfVFc8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CisKKyAgICA8IS0tIFVzZWQgaW4gTG9jYWxlUGlja2VyIC0tPgorICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0ic3BlY2lhbF9sb2NhbGVfbmFtZXMiPgorICAgICAgICA8aXRlbT7kuK3mlocgKOeugOS9kyk8L2l0ZW0+CisgICAgICAgIDxpdGVtPuS4reaWhyAo57mB6auUKTwvaXRlbT4KKyAgICA8L3N0cmluZy1hcnJheT4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCmluZGV4IDYzNzA2OTYuLmQ5ZjAwMzkgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0xNCw4ICsxNCw4IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTwhLS0gRm9ybWF0dGluZyBub3RlOiB0ZXJtaW5hdGUgYWxsIGNvbW1lbnRzIHdpdGggYSBwZXJpb2QsIHRvIGF2b2lkIGJyZWFraW5nIAotICAgICB0aGUgZG9jdW1lbnRhdGlvbiBvdXRwdXQuIFRvIHN1cHByZXNzIGNvbW1lbnQgbGluZXMgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbiAKKzwhLS0gRm9ybWF0dGluZyBub3RlOiB0ZXJtaW5hdGUgYWxsIGNvbW1lbnRzIHdpdGggYSBwZXJpb2QsIHRvIGF2b2lkIGJyZWFraW5nCisgICAgIHRoZSBkb2N1bWVudGF0aW9uIG91dHB1dC4gVG8gc3VwcHJlc3MgY29tbWVudCBsaW5lcyBmcm9tIHRoZSBkb2N1bWVudGF0aW9uCiAgICAgIG91dHB1dCwgaW5zZXJ0IGFuIGVhdC1jb21tZW50IGVsZW1lbnQgYWZ0ZXIgdGhlIGNvbW1lbnQgbGluZXMuCiAtLT4KIApAQCAtNDYsNiArNDYsNyBAQAogICAgICAgICAgICAgIHRoZW1lIGRvZXMgbm90IHNldCB0aGlzIHZhbHVlLCBtZWFuaW5nIGl0IGlzIGJhc2VkIG9uIHdoZXRoZXIgdGhlCiAgICAgICAgICAgICAgd2luZG93IGlzIGZsb2F0aW5nLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZERpbUVuYWJsZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgCiAKICAgICAgICAgPCEtLSA9PT09PT09PT09PSAtLT4KICAgICAgICAgPCEtLSBUZXh0IHN0eWxlcyAtLT4KQEAgLTk1LDYgKzk2LDE1IEBACiAKICAgICAgICAgPCEtLSBUZXh0IGNvbG9yIGZvciB1cmxzIGluIHNlYXJjaCBzdWdnZXN0aW9ucywgdXNlZCBieSB0aGluZ3MgbGlrZSBnbG9iYWwgc2VhcmNoIGFuZCB0aGUgYnJvd3Nlci4gQGhpZGUgLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvclNlYXJjaFVybCIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisKKyAgICAgICAgPCEtLSBDb2xvciBvZiBoaWdobGlnaHRlZCB0ZXh0LCB3aGVuIHVzZWQgaW4gYSBsaWdodCB0aGVtZS4gQGhpZGUgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodEludmVyc2UiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgorICAgICAgICA8IS0tIENvbG9yIG9mIGxpbmsgdGV4dCAoVVJMcyksIHdoZW4gdXNlZCBpbiBhIGxpZ2h0IHRoZW1lLiBAaGlkZSAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9yTGlua0ludmVyc2UiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgorCisgICAgICAgIDwhLS0gQ29sb3Igb2YgbGlzdCBpdGVtIHRleHQgaW4gYWxlcnQgZGlhbG9ncy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgorICAgICAgICAKICAgICAgICAgPCEtLSBTZWFyY2ggd2lkZ2V0IG1vcmUgY29ycHVzIHJlc3VsdCBpdGVtIGJhY2tncm91bmQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzZWFyY2hXaWRnZXRDb3JwdXNJdGVtQmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAKQEAgLTExNywxMCArMTI3LDIwIEBACiAgICAgICAgIDwhLS0gVGV4dCBjb2xvciwgdHlwZWZhY2UsIHNpemUsIGFuZCBzdHlsZSBmb3Igc3lzdGVtIHNlYXJjaCByZXN1bHQgc3VidGl0bGUuIERlZmF1bHRzIHRvIHByaW1hcnkgaW52ZXJzZSB0ZXh0IGNvbG9yLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dEFwcGVhcmFuY2VTZWFyY2hSZXN1bHRTdWJ0aXRsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKLQogICAgICAgICA8IS0tIFRleHQgY29sb3IsIHR5cGVmYWNlLCBzaXplLCBhbmQgc3R5bGUgZm9yIHRoZSB0ZXh0IGluc2lkZSBvZiBhIGJ1dHRvbi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRBcHBlYXJhbmNlQnV0dG9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KIAorICAgICAgICA8IS0tIFRleHQgY29sb3IsIHR5cGVmYWNlLCBzaXplLCBhbmQgc3R5bGUgZm9yIHRoZSB0ZXh0IGluc2lkZSBvZiBhIHBvcHVwIG1lbnUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlUG9wdXBNZW51IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tIFRleHQgY29sb3IsIHR5cGVmYWNlLCBzaXplLCBhbmQgc3R5bGUgZm9yIHNtYWxsIHRleHQgaW5zaWRlIG9mIGEgcG9wdXAgbWVudS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxQb3B1cE1lbnUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gRWRpdFRleHQgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZWRpdFRleHRDb2xvciIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisgICAgICAgIDwhLS0gRWRpdFRleHQgYmFja2dyb3VuZCBkcmF3YWJsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKICAgICAgICAgPCEtLSBBIHN0eWxlZCBzdHJpbmcsIHNwZWNpZnlpbmcgdGhlIHN0eWxlIHRvIGJlIHVzZWQgZm9yIHNob3dpbmcKICAgICAgICAgICAgICBpbmxpbmUgY2FuZGlkYXRlIHRleHQgd2hlbiBjb21wb3Npbmcgd2l0aCBhbiBpbnB1dCBtZXRob2QuICBUaGUKICAgICAgICAgICAgICB0ZXh0IGl0c2VsZiB3aWxsIGJlIGlnbm9yZWQsIGJ1dCB0aGUgc3R5bGUgc3BhbnMgd2lsbCBiZSBhcHBsaWVkCkBAIC0xMzcsNiArMTU3LDEyIEBACiAgICAgICAgIDwhLS0gRHJhd2FibGUgdG8gdXNlIGZvciBzaW5nbGUgY2hvaWNlIGluZGljYXRvcnMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KIAorICAgICAgICA8IS0tIERyYXdhYmxlIHVzZWQgYXMgYSBiYWNrZ3JvdW5kIGZvciBzZWxlY3RlZCBsaXN0IGl0ZW1zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gRHJhd2FibGUgdXNlZCBhcyBhIGJhY2tncm91bmQgZm9yIGFjdGl2YXRlZCBpdGVtcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PSAtLT4KICAgICAgICAgPCEtLSBCdXR0b24gc3R5bGVzIC0tPgogICAgICAgICA8IS0tID09PT09PT09PT09PT0gLS0+CkBAIC0xNzQsNiArMjAwLDggQEAKICAgICAgICAgPCEtLSBUaGUgbGlzdCBpdGVtIGhlaWdodCBmb3Igc2VhcmNoIHJlc3VsdHMuIEBoaWRlIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9Imxpc3REaXZpZGVyIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBUaGUgbGlzdCBkaXZpZGVyIHVzZWQgaW4gYWxlcnQgZGlhbG9ncy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imxpc3REaXZpZGVyQWxlcnREaWFsb2ciIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFRleHRWaWV3IHN0eWxlIGZvciBsaXN0IHNlcGFyYXRvcnMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJsaXN0U2VwYXJhdG9yVGV4dFZpZXdTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gVGhlIHByZWZlcnJlZCBsZWZ0IHBhZGRpbmcgZm9yIGFuIGV4cGFuZGFibGUgbGlzdCBpdGVtIChmb3IgY2hpbGQtc3BlY2lmaWMgbGF5b3V0cywKQEAgLTI0NCw2ICsyNzIsMTkgQEAKICAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNXaW5kb3dBbmltYXRpb259LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QW5pbWF0aW9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGhhdmUgYW4gQWN0aW9uIEJhcgorICAgICAgICAgICAgIGluIHBsYWNlIG9mIHRoZSB1c3VhbCB0aXRsZSBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgd2luZG93J3MgQWN0aW9uIEJhciBzaG91bGQgb3ZlcmxheQorICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNvbnRlbnQuIERvZXMgbm90aGluZyBpZiB0aGUgd2luZG93IHdvdWxkIG5vdAorICAgICAgICAgICAgIGhhdmUgYW4gQWN0aW9uIEJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGFjdGlvbiBtb2RlcyBzaG91bGQgb3ZlcmxheSB3aW5kb3cgY29udGVudAorICAgICAgICAgICAgIHdoZW4gdGhlcmUgaXMgbm90IHJlc2VydmVkIHNwYWNlIGZvciB0aGVpciBVSSAoc3VjaCBhcyBhbiBBY3Rpb24gQmFyKS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisKICAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBkZWZhdWx0IHNvZnQgaW5wdXQgc3RhdGUgdGhhdCB0aGlzIHdpbmRvdyB3b3VsZAogICAgICAgICAgICAgIGxpa2Ugd2hlbiBpdCBpcyBkaXNwbGF5ZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dTb2Z0SW5wdXRNb2RlIj4KQEAgLTM5MCw2ICs0MzEsMTIgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRGVmYXVsdCBTcGlubmVyIHN0eWxlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3Bpbm5lclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGRyb3Bkb3duIFNwaW5uZXIgc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmYXVsdCBBY3Rpb25CYXIgZHJvcGRvd24gc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGFjdGlvbiBidXR0b24gc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRGVmYXVsdCBTdGFyIHN0eWxlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFRhYldpZGdldCBzdHlsZS4gLS0+CkBAIC00MjcsNiArNDc0LDQxIEBACiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgc3R5bGUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB3aW5kb3cgY29udGFpbmluZyBhIHRleHQKICAgICAgICAgICAgICBzZWxlY3Rpb24gYW5jaG9yLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dFNlbGVjdEhhbmRsZVdpbmRvd1N0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IExpc3RQb3B1cFdpbmRvdyBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imxpc3RQb3B1cFdpbmRvd1N0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IFBvcHVwTWVudSBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwTWVudVN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDwhLS0gQWN0aW9uIGJhciBzdHlsZXMgICAtLT4KKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGFtb3VudCBvZiBwYWRkaW5nIHRvIHVzZSBiZXR3ZWVuIGFjdGlvbiBidXR0b25zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisgICAgICAgIDwhLS0gRGVmYXVsdCBzdHlsZSBmb3IgdGFicyB3aXRoaW4gYW4gYWN0aW9uIGJhciAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJhclRhYlRleHRTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhIHN0eWxlIGZvciB0aGUgQWN0aW9uIEJhciAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQmFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNpemUgb2YgdGhlIEFjdGlvbiBCYXIsIGluY2x1ZGluZyB0aGUgY29udGV4dHVhbAorICAgICAgICAgICAgIGJhciB1c2VkIHRvIHByZXNlbnQgQWN0aW9uIE1vZGVzLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQmFyU2l6ZSIgZm9ybWF0PSJkaW1lbnNpb24iID4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9IndyYXBfY29udGVudCIgdmFsdWU9IjAiIC8+CisgICAgICAgIDwvYXR0cj4KKworCisgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgICAgPCEtLSBBY3Rpb24gbW9kZSBzdHlsZXMgIC0tPgorICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDxlYXQtY29tbWVudCAvPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gQmFja2dyb3VuZCBkcmF3YWJsZSB0byB1c2UgZm9yIGFjdGlvbiBtb2RlIFVJIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlQmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRHJhd2FibGUgdG8gdXNlIGZvciB0aGUgY2xvc2UgYWN0aW9uIG1vZGUgYnV0dG9uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgogICAgICAgICA8IS0tIFByZWZlcmVuY2Ugc3R5bGVzICAgLS0+CkBAIC00NjksNiArNTUxLDEwIEBACiAgICAgICAgICAgICAgYW5jaG9yIGZvciBwb3NpdGlvbmluZyB0aGUgY3Vyc29yIHdpdGhpbiB0ZXh0LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dFNlbGVjdEhhbmRsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKKyAgICAgICAgPCEtLSBUaGVtZSB0byB1c2UgZm9yIGRpYWxvZ3Mgc3Bhd25lZCBmcm9tIHRoaXMgdGhlbWUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkaWFsb2dUaGVtZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gVGhlbWUgdG8gdXNlIGZvciBhbGVydCBkaWFsb2dzIHNwYXduZWQgZnJvbSB0aGlzIHRoZW1lLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWxlcnREaWFsb2dUaGVtZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KQEAgLTk4MSw2ICsxMDY3LDkgQEAKICAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9yIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kRGltRW5hYmxlZCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZERpbUFtb3VudCIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyT3ZlcmxheSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMgdGhhdCBkZXNjcmliZSBhIEFsZXJ0RGlhbG9nJ3MgdGhlbWUuIC0tPgpAQCAtOTk3LDYgKzEwODYsMTggQEAKICAgICAgICAgPGF0dHIgbmFtZT0iY2VudGVyTWVkaXVtIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPCEtLSBGcmFnbWVudCBhbmltYXRpb24gY2xhc3MgYXR0cmlidXRlcy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkZyYWdtZW50QW5pbWF0aW9uIj4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudE9wZW5FeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudE5leHRFbnRlckFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50TmV4dEV4aXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudFByZXZFbnRlckFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50UHJldkV4aXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tIFdpbmRvdyBhbmltYXRpb24gY2xhc3MgYXR0cmlidXRlcy4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IldpbmRvd0FuaW1hdGlvbiI+CiAgICAgICAgIDwhLS0gVGhlIGFuaW1hdGlvbiB1c2VkIHdoZW4gYSB3aW5kb3cgaXMgYmVpbmcgYWRkZWQuIC0tPgpAQCAtMTAwNyw3ICsxMTA4LDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93U2hvd0FuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gVGhlIGFuaW1hdGlvbiB1c2VkIHdoZW4gYSB3aW5kb3cgaXMgZ29pbmcgZnJvbSBWSVNJQkxFIHRvIElOVklTSUJMRS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0hpZGVBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgICAgICAKKwogICAgICAgICA8IS0tICBXaGVuIG9wZW5pbmcgYSBuZXcgYWN0aXZpdHksIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0IGlzCiAgICAgICAgICAgICAgIHJ1biBvbiB0aGUgbmV4dCBhY3Rpdml0eSAod2hpY2ggaXMgZW50ZXJpbmcgdGhlIHNjcmVlbikuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpdml0eU9wZW5FbnRlckFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CkBAIC0xMDQ4LDcgKzExNDksNyBAQAogICAgICAgICAgICAgICBhbmltYXRpb24gdGhhdCBpcyBydW4gb24gdGhlIHRvcCBhY3Rpdml0eSBvZiB0aGUgY3VycmVudCB0YXNrCiAgICAgICAgICAgICAgICh3aGljaCBpcyBleGl0aW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGFza1RvQmFja0V4aXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgICAgICAKKwogICAgICAgICA8IS0tICBXaGVuIG9wZW5pbmcgYSBuZXcgYWN0aXZpdHkgdGhhdCBzaG93cyB0aGUgd2FsbHBhcGVyLCB3aGlsZQogICAgICAgICAgICAgICBjdXJyZW50bHkgbm90IHNob3dpbmcgdGhlIHdhbGxwYXBlciwgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQKICAgICAgICAgICAgICAgaXMgcnVuIG9uIHRoZSBuZXcgd2FsbHBhcGVyIGFjdGl2aXR5ICh3aGljaCBpcyBlbnRlcmluZyB0aGUgc2NyZWVuKS4gLS0+CkBAIC0xMDY1LDcgKzExNjYsNyBAQAogICAgICAgICAgICAgICBjdXJyZW50bHkgc2hvd2luZyB0aGUgd2FsbHBhcGVyLCB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdAogICAgICAgICAgICAgICBpcyBydW4gb24gdGhlIG9sZCB3YWxscGFwZXIgYWN0aXZpdHkgKHdoaWNoIGlzIGV4aXRpbmcgdGhlIHNjcmVlbikuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3YWxscGFwZXJDbG9zZUV4aXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgICAgICAKKwogICAgICAgICA8IS0tICBXaGVuIG9wZW5pbmcgYSBuZXcgYWN0aXZpdHkgdGhhdCBpcyBvbiB0b3Agb2YgdGhlIHdhbGxwYXBlcgogICAgICAgICAgICAgICB3aGVuIHRoZSBjdXJyZW50IGFjdGl2aXR5IGlzIGFsc28gb24gdG9wIG9mIHRoZSB3YWxscGFwZXIsCiAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0IGlzIHJ1biBvbiB0aGUgbmV3IGFjdGl2aXR5CkBAIC0xMzUwLDI2ICsxNDUxLDE3IEBACiAgICAgICAgICAgICAgPGNvZGU+cHVibGljIHZvaWQgc2F5SGVsbG8oVmlldyB2KTwvY29kZT4gbWV0aG9kIG9mIHlvdXIgY29udGV4dAogICAgICAgICAgICAgICh0eXBpY2FsbHksIHlvdXIgQWN0aXZpdHkpLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ib25DbGljayIgZm9ybWF0PSJzdHJpbmciIC8+Ci0KLSAgICAgICAgPCEtLSBEZWZpbmVzIG92ZXItc2Nyb2xsaW5nIGJlaGF2aW9yLiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgb25seSBpZiB0aGUKLSAgICAgICAgICAgICBWaWV3IGlzIHNjcm9sbGFibGUuIE92ZXItc2Nyb2xsaW5nIGlzIHRoZSBhYmlsaXR5IGZvciB0aGUgdXNlciB0bwotICAgICAgICAgICAgIHJlY2VpdmUgZmVlZGJhY2sgd2hlbiBhdHRlbXB0aW5nIHRvIHNjcm9sbCBiZXlvbmQgbWVhbmluZ2Z1bCBjb250ZW50LiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ib3ZlclNjcm9sbE1vZGUiPgotICAgICAgICAgICAgPCEtLSBBbHdheXMgc2hvdyBvdmVyLXNjcm9sbCBlZmZlY3RzLCBldmVuIGlmIHRoZSBjb250ZW50IGZpdHMgZW50aXJlbHkKLSAgICAgICAgICAgICAgICAgd2l0aGluIHRoZSBhdmFpbGFibGUgc3BhY2UuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0iYWx3YXlzIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gT25seSBzaG93IG92ZXItc2Nyb2xsIGVmZmVjdHMgaWYgdGhlIGNvbnRlbnQgaXMgbGFyZ2UKLSAgICAgICAgICAgICAgICAgZW5vdWdoIHRvIG1lYW5pbmdmdWxseSBzY3JvbGwuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0iaWZDb250ZW50U2Nyb2xscyIgdmFsdWU9IjEiIC8+Ci0gICAgICAgICAgICA8IS0tIE5ldmVyIHNob3cgb3Zlci1zY3JvbGwgZWZmZWN0cy4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJuZXZlciIgdmFsdWU9IjIiIC8+Ci0gICAgICAgIDwvYXR0cj4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBhIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwfSBvciBhbnkKICAgICAgICAgIG9mIGl0cyBzdWJjbGFzc2VzLiAgQWxzbyBzZWUge0BsaW5rICNWaWV3R3JvdXBfTGF5b3V0fSBmb3IKICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCB0aGlzIGNsYXNzIHByb2Nlc3NlcyBpbiBpdHMgY2hpbGRyZW4uIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3R3JvdXAiPgorICAgICAgICA8IS0tIERlZmluZXMgd2hldGhlciBjaGFuZ2VzIGluIGxheW91dCAoY2F1c2VkIGJ5IGFkZGluZyBhbmQgcmVtb3ZpbmcgaXRlbXMpIHNob3VsZAorICAgICAgICAgICAgIGNhdXNlIGEgTGF5b3V0VHJhbnNpdGlvbiB0byBydW4uIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLCBhIGRlZmF1bHQKKyAgICAgICAgICAgICBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCB3aWxsIGJlIHNldCBvbiB0aGUgVmlld0dyb3VwIGNvbnRhaW5lciBhbmQgZGVmYXVsdAorICAgICAgICAgICAgIGFuaW1hdGlvbnMgd2lsbCBydW4gd2hlbiB0aGVzZSBsYXlvdXQgY2hhbmdlcyBvY2N1ci4tLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYW5pbWF0ZUxheW91dENoYW5nZXMiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICAgICAgPCEtLSBEZWZpbmVzIHdoZXRoZXIgYSBjaGlsZCBpcyBsaW1pdGVkIHRvIGRyYXcgaW5zaWRlIG9mIGl0cyBib3VuZHMgb3Igbm90LgogICAgICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIHdpdGggYW5pbWF0aW9ucyB0aGF0IHNjYWxlIHRoZSBzaXplIG9mIHRoZSBjaGlsZHJlbiB0byBtb3JlCiAgICAgICAgICAgICAgdGhhbiAxMDAlIGZvciBpbnN0YW5jZS4gSW4gc3VjaCBhIGNhc2UsIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHNldCB0byBmYWxzZQpAQCAtMTQyMyw2ICsxNTE1LDE3IEBACiAgICAgICAgICAgICA8ZW51bSBuYW1lPSJibG9ja3NEZXNjZW5kYW50cyIgdmFsdWU9IjIiIC8+CiAgICAgICAgIDwvYXR0cj4KIAorICAgICAgICA8IS0tIFNldHMgd2hldGhlciB0aGlzIFZpZXdHcm91cCBzaG91bGQgc3BsaXQgTW90aW9uRXZlbnRzCisgICAgICAgICAgICAgdG8gc2VwYXJhdGUgY2hpbGQgdmlld3MgZHVyaW5nIHRvdWNoIGV2ZW50IGRpc3BhdGNoLgorICAgICAgICAgICAgIElmIGZhbHNlIChkZWZhdWx0KSwgdG91Y2ggZXZlbnRzIHdpbGwgYmUgZGlzcGF0Y2hlZCB0bworICAgICAgICAgICAgIHRoZSBjaGlsZCB2aWV3IHdoZXJlIHRoZSBmaXJzdCBwb2ludGVyIHdlbnQgZG93biB1bnRpbAorICAgICAgICAgICAgIHRoZSBsYXN0IHBvaW50ZXIgZ29lcyB1cC4KKyAgICAgICAgICAgICBJZiB0cnVlLCB0b3VjaCBldmVudHMgbWF5IGJlIGRpc3BhdGNoZWQgdG8gbXVsdGlwbGUgY2hpbGRyZW4uCisgICAgICAgICAgICAgTW90aW9uRXZlbnRzIGZvciBlYWNoIHBvaW50ZXIgd2lsbCBiZSBkaXNwYXRjaGVkIHRvIHRoZSBjaGlsZAorICAgICAgICAgICAgIHZpZXcgd2hlcmUgdGhlIGluaXRpYWwgQUNUSU9OX0RPV04gZXZlbnQgaGFwcGVuZWQuCisgICAgICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwI3NldE1vdGlvbkV2ZW50U3BsaXR0aW5nRW5hYmxlZChib29sZWFuKX0KKyAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNwbGl0TW90aW9uRXZlbnRzIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gQSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdTdHVifSBsZXRzIHlvdSBsYXppbHkgaW5jbHVkZSBvdGhlciBYTUwgbGF5b3V0cwpAQCAtMTUyNCw2ICsxNjI3LDI4IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImlzRGVmYXVsdCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIFRoaXMgaXMgdGhlIHN1YnR5cGUgb2YgSW5wdXRNZXRob2QuIFN1YnR5cGUgY2FuIGRlc2NyaWJlIGxvY2FsZXMgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgYW5kIG1vZGVzIChlLmcuIHZvaWNlLCBrZXlib2FyZC4uLiksIGFuZCBpcyB1c2VkIGZvciBJTUUgc3dpdGNoLiBUaGlzIHN1YnR5cGUgYWxsb3dzCisgICAgICAgICB0aGUgc3lzdGVtIHRvIGNhbGwgdGhlIHNwZWNpZmllZCBzdWJ0eXBlIG9mIHRoZSBJTUUgZGlyZWN0bHkuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJJbnB1dE1ldGhvZF9TdWJ0eXBlIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgc3VidHlwZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgorICAgICAgICA8IS0tIFRoZSBpY29uIG9mIHRoZSBzdWJ0eXBlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBUaGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBzaG91bGQgYmUgYSBsb2NhbGUgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgICAgIGFuZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FCisgICAgICAgICAgICAgd2l0aCB0aGUgc3VidHlwZS4gVGhpcyBpcyBhbHNvIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBrbm93IHRoZSBzdXBwb3J0ZWQgbG9jYWxlcworICAgICAgICAgICAgIG9mIHRoZSBJTUUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUxvY2FsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIG1vZGUgb2YgdGhlIHN1YnR5cGUuIFRoaXMgc3RyaW5nIGNhbiBiZSBhIG1vZGUgKGUuZy4gdm9pY2UsIGtleWJvYXJkLi4uKSBhbmQgdGhpcworICAgICAgICAgICAgIHN0cmluZyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlCisgICAgICAgICAgICAgc3VidHlwZS4gIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBjYW4gYmUgYW55IHN0cmluZyBhbmQgd2lsbCBiZSBwYXNzZWQgdG8KKyAgICAgICAgICAgICB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlIHN1YnR5cGUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBXaWRnZXQgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTE1NzMsNiArMTY5OCwyOCBAQAogICAgICAgICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYWRhcHRlciBhbmQgdGhlIG51bWJlciBvZiBpdGVtcyB2aXNpYmxlCiAgICAgICAgICAgICAgb24gc2NyZWVuIHRvIGRldGVybWluZSB0aGUgc2Nyb2xsYmFyJ3MgcHJvcGVydGllcy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InNtb290aFNjcm9sbGJhciIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIEEgcmVmZXJlbmNlIHRvIGFuIFhNTCBkZXNjcmlwdGlvbiBvZiB0aGUgYWRhcHRlciB0byBhdHRhY2ggdG8gdGhlIGxpc3QuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhZGFwdGVyIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBjaG9pY2UgYmVoYXZpb3IgZm9yIHRoZSB2aWV3LiBCeSBkZWZhdWx0LCBsaXN0cyBkbyBub3QgaGF2ZQorICAgICAgICAgICAgIGFueSBjaG9pY2UgYmVoYXZpb3IuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gc2luZ2xlQ2hvaWNlLCB0aGUgbGlzdAorICAgICAgICAgICAgIGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bworICAgICAgICAgICAgIG11bHRpcGxlQ2hvaWNlLCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uCisgICAgICAgICAgICAgRmluYWxseSwgYnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0byBtdWx0aXBsZUNob2ljZU1vZGFsIHRoZSBsaXN0IGFsbG93cworICAgICAgICAgICAgIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuIGluIGEgc3BlY2lhbCBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gd2lsbCBzdXBwbHkgYQorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lcn0gdXNpbmcKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXJ9IHRvIGNvbnRyb2wgdGhlCisgICAgICAgICAgICAgc2VsZWN0aW9uIG1vZGUuIFRoaXMgdXNlcyB0aGUge0BsaW5rIGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlfSBBUEkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjaG9pY2VNb2RlIj4KKyAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vbmUiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJzaW5nbGVDaG9pY2UiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZSIgdmFsdWU9IjIiIC8+CisgICAgICAgICAgICA8IS0tIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzIGluIGEgY3VzdG9tIHNlbGVjdGlvbiBtb2RlLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im11bHRpcGxlQ2hvaWNlTW9kYWwiIHZhbHVlPSIzIiAvPgorICAgICAgICA8L2F0dHI+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWJzU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgU3Bpbm5lci4gIEZvciBzdGF0aWMgY29udGVudCwKQEAgLTE3NjgsNyArMTkxNSw3IEBACiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZwogICAgICAgICAgICAgIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCiAgICAgICAgICAgICAgbWVhc3VyZWQgbm9ybWFsbHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJ1c2VMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJMaXN0VmlldyI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgTGlzdFZpZXcuICBGb3Igc3RhdGljIGNvbnRlbnQsCkBAIC0xNzc5LDI4ICsxOTI2LDEyIEBACiAgICAgICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBkaXZpZGVyLiBXaWxsIHVzZSB0aGUgaW50cmluc2ljIGhlaWdodCBvZiB0aGUgZGl2aWRlciBpZiB0aGlzCiAgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRpdmlkZXJIZWlnaHQiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgotICAgICAgICA8IS0tIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3RWaWV3LiBCeSBkZWZhdWx0LCBsaXN0cyBkbyBub3QgaGF2ZQotICAgICAgICAgICAgIGFueSBjaG9pY2UgYmVoYXZpb3IuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gc2luZ2xlQ2hvaWNlLCB0aGUgTGlzdAotICAgICAgICAgICAgIGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bwotICAgICAgICAgICAgIG11bHRpcGxlQ2hvaWNlLCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJjaG9pY2VNb2RlIj4KLSAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vbmUiIHZhbHVlPSIwIiAvPgotICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZS4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJzaW5nbGVDaG9pY2UiIHZhbHVlPSIxIiAvPgotICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcy4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZSIgdmFsdWU9IjIiIC8+Ci0gICAgICAgIDwvYXR0cj4KICAgICAgICAgPCEtLSBXaGVuIHNldCB0byBmYWxzZSwgdGhlIExpc3RWaWV3IHdpbGwgbm90IGRyYXcgdGhlIGRpdmlkZXIgYWZ0ZXIgZWFjaCBoZWFkZXIgdmlldy4KICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iaGVhZGVyRGl2aWRlcnNFbmFibGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gZmFsc2UsIHRoZSBMaXN0VmlldyB3aWxsIG5vdCBkcmF3IHRoZSBkaXZpZGVyIGJlZm9yZSBlYWNoIGZvb3RlciB2aWV3LgogICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJmb290ZXJEaXZpZGVyc0VuYWJsZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KLSAgICAgICAgPCEtLSBEcmF3YWJsZSB0byBkcmF3IGFib3ZlIGxpc3QgY29udGVudC4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im92ZXJTY3JvbGxIZWFkZXIiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgotICAgICAgICA8IS0tIERyYXdhYmxlIHRvIGRyYXcgYmVsb3cgbGlzdCBjb250ZW50LiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ib3ZlclNjcm9sbEZvb3RlciIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVudVZpZXciPgogICAgICAgICA8IS0tIERlZmF1bHQgYXBwZWFyYW5jZSBvZiBtZW51IGl0ZW0gdGV4dC4gLS0+CkBAIC0yMjA2LDcgKzIzMzcsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bkFuY2hvciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBiYXNpYyB3aWR0aCBvZiB0aGUgZHJvcGRvd24uIEl0cyB2YWx1ZSBtYXkKICAgICAgICAgICAgICBiZSBhIGRpbWVuc2lvbiAoc3VjaCBhcyAiMTJkaXAiKSBmb3IgYSBjb25zdGFudCB3aWR0aCwKLSAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZSAKKyAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZQogICAgICAgICAgICAgIHNjcmVlbiwgb3Igd3JhcF9jb250ZW50IHRvIG1hdGNoIHRoZSB3aWR0aCBvZgogICAgICAgICAgICAgIHRoZSBhbmNob3JlZCB2aWV3LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgZm9ybWF0PSJkaW1lbnNpb24iPgpAQCAtMjI0MywxNCArMjM3NCwzNiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cEFuaW1hdGlvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3QW5pbWF0b3IiPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIHNob3duLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iaW5BbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIGhpZGRlbi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im91dEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIGN1cnJlbnQgVmlldyB3aGVuIHRoZSBWaWV3QW5pbWF0aW9uCisgICAgICAgICAgICAgaXMgZmlyc3QgZGlzcGxheWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYW5pbWF0ZUZpcnN0VmlldyIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlZpZXdGbGlwcGVyIj4KICAgICAgICAgPGF0dHIgbmFtZT0iZmxpcEludGVydmFsIiBmb3JtYXQ9ImludGVnZXIiIG1pbj0iMCIgLz4KICAgICAgICAgPCEtLSBXaGVuIHRydWUsIGF1dG9tYXRpY2FsbHkgc3RhcnQgYW5pbWF0aW5nIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJhdXRvU3RhcnQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBZGFwdGVyVmlld0FuaW1hdG9yIj4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBzaG93bi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImluQW5pbWF0aW9uIiAvPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIGhpZGRlbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im91dEFuaW1hdGlvbiIgLz4KKyAgICAgICAgPCEtLURlZmluZXMgd2hldGhlciB0aGUgYW5pbWF0b3IgbG9vcHMgdG8gdGhlIGZpcnN0IHZpZXcgb25jZSBpdAorICAgICAgICBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXN0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9vcFZpZXdzIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIGN1cnJlbnQgVmlldyB3aGVuIHRoZSBWaWV3QW5pbWF0aW9uCisgICAgICAgIGlzIGZpcnN0IGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIj4KKyAgICAgICAgPGF0dHIgbmFtZT0iZmxpcEludGVydmFsIiAvPgorICAgICAgICA8IS0tIFdoZW4gdHJ1ZSwgYXV0b21hdGljYWxseSBzdGFydCBhbmltYXRpbmcgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImF1dG9TdGFydCIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3U3dpdGNoZXIiPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNjcm9sbFZpZXciPgpAQCAtMjI2NCw2ICsyNDE3LDMwIEBACiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNwaW5uZXIiPgogICAgICAgICA8IS0tIFRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBzcGlubmVyJ3MgZGlhbG9nIGlzIHNob3duLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0icHJvbXB0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEaXNwbGF5IG1vZGUgZm9yIHNwaW5uZXIgb3B0aW9ucy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNwaW5uZXJNb2RlIiBmb3JtYXQ9ImVudW0iPgorICAgICAgICAgICAgPCEtLSBTcGlubmVyIG9wdGlvbnMgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYXMgYSBkaWFsb2cgd2luZG93LiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRpYWxvZyIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIFNwaW5uZXIgb3B0aW9ucyB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhcyBhbiBpbmxpbmUgZHJvcGRvd24KKyAgICAgICAgICAgICAgICAgYW5jaG9yZWQgdG8gdGhlIHNwaW5uZXIgd2lkZ2V0IGl0c2VsZi4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJkcm9wZG93biIgdmFsdWU9IjEiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBMaXN0IHNlbGVjdG9yIHRvIHVzZSBmb3Igc3Bpbm5lck1vZGU9ImRyb3Bkb3duIiBkaXNwbGF5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25TZWxlY3RvciIgLz4KKyAgICAgICAgPCEtLSBCYWNrZ3JvdW5kIGRyYXdhYmxlIHRvIHVzZSBmb3IgdGhlIGRyb3Bkb3duIGluIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cEJhY2tncm91bmQiIC8+CisgICAgICAgIDwhLS0gVmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHNwaW5uZXIgd2lkZ2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJvcGRvd24gaW4KKyAgICAgICAgICAgICBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIgLz4KKyAgICAgICAgPCEtLSBIb3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBzcGlubmVyIHdpZGdldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyb3Bkb3duCisgICAgICAgICAgICAgaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCIgLz4KKyAgICAgICAgPCEtLSBXaWR0aCBvZiB0aGUgZHJvcGRvd24gaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duV2lkdGgiIC8+CisgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgbGF5b3V0IHRvIHVzZSBmb3IgZGlzcGxheWluZyBhIHByb21wdCBpbiB0aGUgZHJvcGRvd24gZm9yCisgICAgICAgICAgICAgc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gVGhpcyBsYXlvdXQgbXVzdCBjb250YWluIGEgVGV4dFZpZXcgd2l0aCB0aGUgaWQKKyAgICAgICAgICAgICBAYW5kcm9pZDppZC90ZXh0MSB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgcHJvbXB0IHRleHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cFByb21wdFZpZXciIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkRhdGVQaWNrZXIiPgogICAgICAgICA8IS0tIFRoZSBmaXJzdCB5ZWFyIChpbmNsdXNpdmUpLCBmb3IgZXhhbXBsZSAiMTk0MCIuIC0tPgpAQCAtMjQzMiw4ICsyNjA5LDEwIEBACiAKICAgICA8IS0tIEBoaWRlIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJXZWlnaHRlZExpbmVhckxheW91dCI+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im1ham9yV2VpZ2h0IiBmb3JtYXQ9ImZsb2F0IiAvPgotICAgICAgICA8YXR0ciBuYW1lPSJtaW5vcldlaWdodCIgZm9ybWF0PSJmbG9hdCIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWFqb3JXZWlnaHRNaW4iIGZvcm1hdD0iZmxvYXQiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9Im1pbm9yV2VpZ2h0TWluIiBmb3JtYXQ9ImZsb2F0IiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJtYWpvcldlaWdodE1heCIgZm9ybWF0PSJmbG9hdCIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWlub3JXZWlnaHRNYXgiIGZvcm1hdD0iZmxvYXQiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTI1NzQsNiArMjc1MywxMCBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkcmF3YWJsZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1pcG1hcERyYXdhYmxlSXRlbSI+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyYXdhYmxlIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iUm90YXRlRHJhd2FibGUiPgogICAgICAgICA8YXR0ciBuYW1lPSJ2aXNpYmxlIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJmcm9tRGVncmVlcyIgZm9ybWF0PSJmbG9hdCIgLz4KQEAgLTI4OTcsNiArMzA4MCw2OSBAQAogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gVmFsdWVBbmltYXRvciBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQW5pbWF0b3IiPgorICAgICAgICA8IS0tIERlZmluZXMgdGhlIGludGVycG9sYXRvciB1c2VkIHRvIHNtb290aCB0aGUgYW5pbWF0aW9uIG1vdmVtZW50IGluIHRpbWUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbnRlcnBvbGF0b3IiIC8+CisgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgZmlsbEFmdGVyIGlzIHRha2VuIGludG8gYWNjb3VudC4gLS0+CisgICAgICAgIDwhLS0gQW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgZm9yIHRoZSBhbmltYXRpb24gdG8gcnVuLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHVyYXRpb24iIC8+CisgICAgICAgIDwhLS0gRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgYW5pbWF0aW9uIHJ1bnMsIG9uY2Ugc3RhcnQgdGltZSBpcyByZWFjaGVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3RhcnRPZmZzZXQiLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIGhvdyBtYW55IHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InJlcGVhdENvdW50Ii8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgYW5pbWF0aW9uIGJlaGF2aW9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIGFuZCB0aGUgcmVwZWF0IGNvdW50IGlzCisgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIDAgb3IgaW5maW5pdGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHJlc3RhcnQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJyZXBlYXRNb2RlIi8+CisgICAgICAgIDwhLS0gVmFsdWUgdGhlIGFuaW1hdGlvbiBzdGFydHMgZnJvbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZhbHVlRnJvbSIgZm9ybWF0PSJmbG9hdHxpbnRlZ2VyIi8+CisgICAgICAgIDwhLS0gVmFsdWUgdGhlIGFuaW1hdGlvbiBhbmltYXRlcyB0by4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZhbHVlVG8iIGZvcm1hdD0iZmxvYXR8aW50ZWdlciIvPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIHZhbHVlRnJvbSBhbmQgdmFsdWVUby4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZhbHVlVHlwZSI+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgZmxvYXRzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImZsb2F0VHlwZSIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgaW50ZWdlcnMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iaW50VHlwZSIgICB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBkb3VibGVzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRvdWJsZVR5cGUiIHZhbHVlPSIyIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGNvbG9ycy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJjb2xvclR5cGUiIHZhbHVlPSIzIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGEgY3VzdG9tIHR5cGUuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iY3VzdG9tVHlwZSIgdmFsdWU9IjQiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIE9iamVjdEFuaW1hdG9yIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJQcm9wZXJ0eUFuaW1hdG9yIj4KKyAgICAgICAgPCEtLSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InByb3BlcnR5TmFtZSIgZm9ybWF0PSJzdHJpbmciLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gQW5pbWF0b3JTZXQgY2xhc3MgYXR0cmlidXRlcyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFuaW1hdG9yU2V0Ij4KKyAgICAgICAgPCEtLSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyaW5nIj4KKyAgICAgICAgICAgIDwhLS0gY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgYmUgcGxheWVkIHRvZ2V0aGVyLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9InRvZ2V0aGVyIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgYmUgcGxheWVkIHNlcXVlbnRpYWxseSwgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHhtbC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJzZXF1ZW50aWFsbHkiIHZhbHVlPSIxIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBTdGF0ZSBhdHRyaWJ1dGVzICAgICAgICAgICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgpAQCAtMjkxOCw2ICszMTY0LDcgQEAKICAgICAgICAgIDxsaT4ic3RhdGVfbGFzdCIKICAgICAgICAgIDxsaT4ic3RhdGVfb25seSIKICAgICAgICAgIDxsaT4ic3RhdGVfcHJlc3NlZCIKKyAgICAgICAgIDxsaT4ic3RhdGVfYWN0aXZhdGVkIgogICAgICAgICAgPGxpPiJzdGF0ZV9lcnJvciIKICAgICAgICAgIDxsaT4ic3RhdGVfY2lyY2xlIgogICAgICAgICAgPGxpPiJzdGF0ZV9yZWN0IgpAQCAtMjkyNSwyMyArMzE3MiwzNSBAQAogICAgICAgICAgPGxpPiJzdGF0ZV9tb3ZlIgogICAgICAgICAgPC91bD4gIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJEcmF3YWJsZVN0YXRlcyI+Ci0gICAgICAgIDwhLS0gIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0uLS0+CisgICAgICAgIDwhLS0gU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfSwKKyAgICAgICAgICAgICBzZXQgd2hlbiBhIHZpZXcgaGFzIGlucHV0IGZvY3VzLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfZm9jdXNlZCIgZm9ybWF0PSJib29sZWFuIiAvPgotICAgICAgICA8IS0tICBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9Li0tPgorICAgICAgICA8IS0tIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0sCisgICAgICAgICAgICAgc2V0IHdoZW4gYSB2aWV3J3Mgd2luZG93IGhhcyBpbnB1dCBmb2N1cy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX3dpbmRvd19mb2N1c2VkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+Ci0gICAgICAgIDwhLS0gIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0uLS0+CisgICAgICAgIDwhLS0gU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfSwKKyAgICAgICAgICAgICBzZXQgd2hlbiBhIHZpZXcgaXMgZW5hYmxlZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX2VuYWJsZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KLSAgICAgICAgPCEtLSAgU3RhdGUgaWRlbnRpZmllciBpbmRpY2F0aW5nIHRoYXQgdGhlIG9iamVjdCA8dmFyPm1heTwvdmFyPiBkaXNwbGF5IGEgY2hlY2sgbWFyay4KLSAgICAgICAgICAgICAgU2VlIHtAbGluayBSLmF0dHIjc3RhdGVfY2hlY2tlZH0gZm9yIHRoZSBpZGVudGlmaWVyIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMKLSAgICAgICAgICAgICAgYWN0dWFsbHkgY2hlY2tlZC4gLS0+CisgICAgICAgIDwhLS0gU3RhdGUgaWRlbnRpZmllciBpbmRpY2F0aW5nIHRoYXQgdGhlIG9iamVjdCA8dmFyPm1heTwvdmFyPiBkaXNwbGF5IGEgY2hlY2sgbWFyay4KKyAgICAgICAgICAgICBTZWUge0BsaW5rIFIuYXR0ciNzdGF0ZV9jaGVja2VkfSBmb3IgdGhlIGlkZW50aWZpZXIgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBpdCBpcworICAgICAgICAgICAgIGFjdHVhbGx5IGNoZWNrZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9jaGVja2FibGUiIGZvcm1hdD0iYm9vbGVhbiIvPgotICAgICAgICA8IS0tICBTdGF0ZSBpZGVudGlmaWVyIGluZGljYXRpbmcgdGhhdCB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBjaGVja2VkLiAgU2VlCi0gICAgICAgICAgICAgIHtAbGluayBSLmF0dHIjc3RhdGVfY2hlY2thYmxlfSBmb3IgYW4gYWRkaXRpb25hbCBpZGVudGlmaWVyIHRoYXQgY2FuIGluZGljYXRlIGlmCi0gICAgICAgICAgICAgIGFueSBvYmplY3QgbWF5IGV2ZXIgZGlzcGxheSBhIGNoZWNrLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgc3RhdGVfY2hlY2tlZCBpcwotICAgICAgICAgICAgICBjdXJyZW50bHkgc2V0LiAtLT4KKyAgICAgICAgPCEtLSBTdGF0ZSBpZGVudGlmaWVyIGluZGljYXRpbmcgdGhhdCB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBjaGVja2VkLiAgU2VlCisgICAgICAgICAgICAge0BsaW5rIFIuYXR0ciNzdGF0ZV9jaGVja2FibGV9IGZvciBhbiBhZGRpdGlvbmFsIGlkZW50aWZpZXIgdGhhdCBjYW4gaW5kaWNhdGUgaWYKKyAgICAgICAgICAgICBhbnkgb2JqZWN0IG1heSBldmVyIGRpc3BsYXkgYSBjaGVjaywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHN0YXRlX2NoZWNrZWQgaXMKKyAgICAgICAgICAgICBjdXJyZW50bHkgc2V0LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfY2hlY2tlZCIgZm9ybWF0PSJib29sZWFuIi8+Ci0gICAgICAgIDwhLS0gIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0uLS0+CisgICAgICAgIDwhLS0gU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfSwKKyAgICAgICAgICAgICBzZXQgd2hlbiBhIHZpZXcgKG9yIG9uZSBvZiBpdHMgcGFyZW50cykgaXMgY3VycmVudGx5IHNlbGVjdGVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfc2VsZWN0ZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPCEtLSBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9LAorICAgICAgICAgICAgIHNldCB3aGVuIHRoZSB1c2VyIGlzIHByZXNzaW5nIGRvd24gaW4gYSB2aWV3LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfcHJlc3NlZCIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0sCisgICAgICAgICAgICAgc2V0IHdoZW4gYSB2aWV3IG9yIGl0cyBwYXJlbnQgaGFzIGJlZW4gImFjdGl2YXRlZCIgbWVhbmluZyB0aGUgdXNlciBoYXMgY3VycmVudGx5CisgICAgICAgICAgICAgbWFya2VkIGl0IGFzIGJlaW5nIG9mIGludGVyZXN0LiAgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZgorICAgICAgICAgICAgIHN0YXRlX2NoZWNrZWQgZm9yIHdoZW4gdGhlIHN0YXRlIHNob3VsZCBiZSBwcm9wYWdhdGVkIGRvd24gdGhlIHZpZXcgaGllcmFyY2h5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfYWN0aXZhdGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0uLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX2FjdGl2ZSIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgICAgICA8IS0tICBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9Li0tPgpAQCAtMjk1Miw4ICszMjExLDYgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfbWlkZGxlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0uLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX2xhc3QiIGZvcm1hdD0iYm9vbGVhbiIgLz4KLSAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfcHJlc3NlZCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlZpZXdEcmF3YWJsZVN0YXRlcyI+CiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX3ByZXNzZWQiIC8+CkBAIC0yOTYxLDYgKzMyMTgsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9zZWxlY3RlZCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfd2luZG93X2ZvY3VzZWQiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX2VuYWJsZWQiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX2FjdGl2YXRlZCIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDwhLS0gU3RhdGUgYXJyYXkgcmVwcmVzZW50aW5nIGEgbWVudSBpdGVtIHRoYXQgaXMgY3VycmVudGx5IGNoZWNrZWQuIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJNZW51SXRlbUNoZWNrZWRTdGF0ZSI+CkBAIC0zMzA1LDYgKzM1NjMsMjcgQEAKICAgICAgICAgPCEtLSBXaGV0aGVyIHRoZSBpdGVtIGlzIGVuYWJsZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJlbmFibGVkIiAvPgogCisgICAgICAgIDwhLS0gTmFtZSBvZiBhIG1ldGhvZCBvbiB0aGUgQ29udGV4dCB1c2VkIHRvIGluZmxhdGUgdGhlIG1lbnUgdGhhdCB3aWxsIGJlCisgICAgICAgICAgICAgY2FsbGVkIHdoZW4gdGhlIGl0ZW0gaXMgY2xpY2tlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im9uQ2xpY2siIC8+CisKKyAgICAgICAgPCEtLSBIb3cgdGhpcyBpdGVtIHNob3VsZCBkaXNwbGF5IGluIHRoZSBBY3Rpb24gQmFyLCBpZiBwcmVzZW50LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic2hvd0FzQWN0aW9uIiBmb3JtYXQ9ImVudW0iPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ibmV2ZXIiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iaWZSb29tIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImFsd2F5cyIgdmFsdWU9IjIiIC8+CisgICAgICAgIDwvYXR0cj4KKworICAgICAgICA8IS0tIEFuIG9wdGlvbmFsIGxheW91dCB0byBiZSB1c2VkIGFzIGFuIGFjdGlvbiB2aWV3LgorICAgICAgICAgICAgIFNlZSB7QGxpbmsgYW5kcm9pZC52aWV3Lk1lbnVJdGVtI3NldEFjdGlvblZpZXcoYW5kcm9pZC52aWV3LlZpZXcpfQorICAgICAgICAgICAgIGZvciBtb3JlIGluZm8uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25MYXlvdXQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gVGhlIG5hbWUgb2YgYW4gb3B0aW9uYWwgVmlldyBjbGFzcyB0byBpbnN0YW50aWF0ZSBhbmQgdXNlIGFzIGFuCisgICAgICAgICAgICAgYWN0aW9uIHZpZXcuIFNlZSB7QGxpbmsgYW5kcm9pZC52aWV3Lk1lbnVJdGVtI3NldEFjdGlvblZpZXcoYW5kcm9pZC52aWV3LlZpZXcpfQorICAgICAgICAgICAgIGZvciBtb3JlIGluZm8uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25WaWV3Q2xhc3MiIGZvcm1hdD0ic3RyaW5nIiAvPgorCiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KQEAgLTMzMjAsNiArMzU5OSwyNSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJvcmRlcmluZ0Zyb21YbWwiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPCEtLSBBdHRyaWJ1dGUgZm9yIGEgaGVhZGVyIGRlc2NyaWJpbmcgdGhlIGl0ZW0gc2hvd24gaW4gdGhlIHRvcC1sZXZlbCBsaXN0CisgICAgICAgICBmcm9tIHdoaWNoIHRoZSBzZWxlY3RzIHRoZSBzZXQgb2YgcHJlZmVyZW5jZSB0byBkaWcgaW4gdG8uIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJQcmVmZXJlbmNlSGVhZGVyIj4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIHZhbHVlIGZvciB0aGUgaGVhZGVyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWQiIC8+CisgICAgICAgIDwhLS0gVGhlIHRpdGxlIG9mIHRoZSBpdGVtIHRoYXQgaXMgc2hvd24gdG8gdGhlIHVzZXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0aXRsZSIgLz4KKyAgICAgICAgPCEtLSBUaGUgc3VtbWFyeSBmb3IgdGhlIGl0ZW0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdW1tYXJ5IiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgdGl0bGUgZm9yIHRoZSBicmVhZCBjcnVtYiBvZiB0aGlzIGl0ZW0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJicmVhZENydW1iVGl0bGUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSBzaG9ydCB0aXRsZSBmb3IgdGhlIGJyZWFkIGNydW1iIG9mIHRoaXMgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImJyZWFkQ3J1bWJTaG9ydFRpdGxlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBBbiBpY29uIGZvciB0aGUgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDwhLS0gVGhlIGZyYWdtZW50IHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGlzIGl0ZW0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudCIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gV0FSTklORzogIElmIGFkZGluZyBhdHRyaWJ1dGVzIHRvIFByZWZlcmVuY2UsIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjb25mbGljdAogICAgICAgICAgICAgICAgICAgIHdpdGggYSBWaWV3J3MgYXR0cmlidXRlcy4gIFNvbWUgc3ViY2xhc3NlcyAoZS5nLiwgRWRpdFRleHRQcmVmZXJlbmNlKQogICAgICAgICAgICAgICAgICAgIHByb3h5IGFsbCBhdHRyaWJ1dGVzIHRvIGl0cyBFZGl0VGV4dCB3aWRnZXQuIC0tPgpAQCAtMzMzMiwxMCArMzYzMCwxMyBAQAogICAgICAgICA8IS0tIFRoZSB0aXRsZSBmb3IgdGhlIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkgc2NyZWVuLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGl0bGUiIC8+CiAgICAgICAgIDwhLS0gVGhlIHN1bW1hcnkgZm9yIHRoZSBQcmVmZXJlbmNlIGluIGEgUHJlZmVyZW5jZUFjdGl2aXR5IHNjcmVlbi4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9InN1bW1hcnkiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJzdW1tYXJ5IiAvPgogICAgICAgICA8IS0tIFRoZSBvcmRlciBmb3IgdGhlIFByZWZlcmVuY2UgKGxvd2VyIHZhbHVlcyBhcmUgdG8gYmUgb3JkZXJlZCBmaXJzdCkuIElmIHRoaXMgaXMgbm90CiAgICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBvcmRlcmluIHdpbGwgYmUgYWxwaGFiZXRpYy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyIiBmb3JtYXQ9ImludGVnZXIiIC8+CisgICAgICAgIDwhLS0gV2hlbiB1c2VkIGluc2lkZSBvZiBhIG1vZGVybiBQcmVmZXJlbmNlQWN0aXZpdHksIHRoaXMgZGVjbGFyZXMKKyAgICAgICAgICAgICBhIG5ldyBQcmVmZXJlbmNlRnJhZ21lbnQgdG8gYmUgc2hvd24gd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoaXMgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50IiAvPgogICAgICAgICA8IS0tIFRoZSBsYXlvdXQgZm9yIHRoZSBQcmVmZXJlbmNlIGluIGEgUHJlZmVyZW5jZUFjdGl2aXR5IHNjcmVlbi4gVGhpcyBzaG91bGQKICAgICAgICAgICAgICByYXJlbHkgbmVlZCB0byBiZSBjaGFuZ2VkLCBsb29rIGF0IHdpZGdldExheW91dCBpbnN0ZWFkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0IiAvPgpAQCAtMzQwNyw2ICszNzA4LDE2IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImVudHJ5VmFsdWVzIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiPgorICAgICAgICA8IS0tIFRoZSBodW1hbi1yZWFkYWJsZSBhcnJheSB0byBwcmVzZW50IGFzIGEgbGlzdC4gRWFjaCBlbnRyeSBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgaW5kZXggaW4gZW50cnlWYWx1ZXMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJlbnRyaWVzIiAvPgorICAgICAgICA8IS0tIFRoZSBhcnJheSB0byBmaW5kIHRoZSB2YWx1ZSB0byBzYXZlIGZvciBhIHByZWZlcmVuY2Ugd2hlbiBhbiBlbnRyeSBmcm9tCisgICAgICAgICAgICAgZW50cmllcyBpcyBzZWxlY3RlZC4gSWYgYSB1c2VyIGNsaWNrcyB0aGUgc2Vjb25kIGl0ZW0gaW4gZW50cmllcywgdGhlCisgICAgICAgICAgICAgc2Vjb25kIGl0ZW0gaW4gdGhpcyBhcnJheSB3aWxsIGJlIHNhdmVkIHRvIHRoZSBwcmVmZXJlbmNlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZW50cnlWYWx1ZXMiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gQmFzZSBhdHRyaWJ1dGVzIGF2YWlsYWJsZSB0byBSaW5ndG9uZVByZWZlcmVuY2UuIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJSaW5ndG9uZVByZWZlcmVuY2UiPgogICAgICAgICA8IS0tIFdoaWNoIHJpbmd0b25lIHR5cGUocykgdG8gc2hvdyBpbiB0aGUgcGlja2VyLiAtLT4KQEAgLTM1NTgsNyArMzg2OSw3IEBACiAgICAgPCEtLSBBcHBXaWRnZXQgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVXNlIDxjb2RlPmFwcHdpZGdldC1wcm92aWRlcjwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAogICAgICAgICAgZGVzY3JpYmVzIGFuIEFwcFdpZGdldCBwcm92aWRlci4gIFNlZSB7QGxpbmsgYW5kcm9pZC5hcHB3aWRnZXQgYW5kcm9pZC5hcHB3aWRnZXR9CiAgICAgICAgICBwYWNrYWdlIGZvciBtb3JlIGluZm8uCkBAIC0zNTc1LDEzICszODg2LDQ5IEBACiAgICAgICAgIDwhLS0gQSBjbGFzcyBuYW1lIGluIHRoZSBBcHBXaWRnZXQncyBwYWNrYWdlIHRvIGJlIGxhdW5jaGVkIHRvIGNvbmZpZ3VyZS4KICAgICAgICAgICAgICBJZiBub3Qgc3VwcGxpZWQsIHRoZW4gbm8gYWN0aXZpdHkgd2lsbCBiZSBsYXVuY2hlZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImNvbmZpZ3VyZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gQSBwcmV2aWV3IG9mIHdoYXQgdGhlIEFwcFdpZGdldCB3aWxsIGxvb2sgbGlrZSBhZnRlciBpdCdzIGNvbmZpZ3VyZWQuCisgICAgICAgCSAgICAgSWYgbm90IHN1cHBsaWVkLCB0aGUgQXBwV2lkZ2V0J3MgaWNvbiB3aWxsIGJlIHVzZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwcmV2aWV3SW1hZ2UiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBBcHAgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBWaWV3IHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCA8Y29kZT4mbHQ7ZnJhZ21lbnQmZ3Q7PC9jb2RlPgorICAgICAgICAgdGFncyBpbnNpZGUgb2YgdGhlIGxheW91dCBvZiBhbiBBY3Rpdml0eS4gIFRoaXMgaW5zdGFudGlhdGVzCisgICAgICAgICB0aGUgZ2l2ZW4ge0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50fSBhbmQgaW5zZXJ0cyBpdHMgY29udGVudAorICAgICAgICAgdmlldyBpbnRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBsYXlvdXQuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJGcmFnbWVudCI+CisgICAgICAgIDwhLS0gU3VwcGx5IHRoZSBuYW1lIG9mIHRoZSBmcmFnbWVudCBjbGFzcyB0byBpbnN0YW50aWF0ZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im5hbWUiIC8+CisKKyAgICAgICAgPCEtLSBTdXBwbHkgYW4gaWRlbnRpZmllciBuYW1lIGZvciB0aGUgdG9wLWxldmVsIHZpZXcsIHRvIGxhdGVyIHJldHJpZXZlIGl0CisgICAgICAgICAgICAgd2l0aCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZmluZFZpZXdCeUlkIFZpZXcuZmluZFZpZXdCeUlkKCl9IG9yCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2ZpbmRWaWV3QnlJZCBBY3Rpdml0eS5maW5kVmlld0J5SWQoKX0uCisgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGEKKyAgICAgICAgICAgICByZXNvdXJjZSByZWZlcmVuY2U7IHR5cGljYWxseSB5b3Ugc2V0IHRoaXMgdXNpbmcgdGhlCisgICAgICAgICAgICAgPGNvZGU+QCs8L2NvZGU+IHN5bnRheCB0byBjcmVhdGUgYSBuZXcgSUQgcmVzb3VyY2VzLgorICAgICAgICAgICAgIEZvciBleGFtcGxlOiA8Y29kZT5hbmRyb2lkOmlkPSJAK2lkL215X2lkIjwvY29kZT4gd2hpY2gKKyAgICAgICAgICAgICBhbGxvd3MgeW91IHRvIGxhdGVyIHJldHJpZXZlIHRoZSB2aWV3CisgICAgICAgICAgICAgd2l0aCA8Y29kZT5maW5kVmlld0J5SWQoUi5pZC5teV9pZCk8L2NvZGU+LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWQiIC8+CisKKyAgICAgICAgPCEtLSBTdXBwbHkgYSB0YWcgZm9yIHRoZSB0b3AtbGV2ZWwgdmlldyBjb250YWluaW5nIGEgU3RyaW5nLCB0byBiZSByZXRyaWV2ZWQKKyAgICAgICAgICAgICBsYXRlciB3aXRoIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNnZXRUYWcgVmlldy5nZXRUYWcoKX0gb3IKKyAgICAgICAgICAgICBzZWFyY2hlZCBmb3Igd2l0aCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZmluZFZpZXdXaXRoVGFnCisgICAgICAgICAgICAgVmlldy5maW5kVmlld1dpdGhUYWcoKX0uICBJdCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2UKKyAgICAgICAgICAgICBJRHMgKHRocm91Z2ggdGhlIGFuZHJvaWQ6aWQgYXR0cmlidXRlKSBpbnN0ZWFkIG9mIHRhZ3MgYmVjYXVzZQorICAgICAgICAgICAgIHRoZXkgYXJlIGZhc3RlciBhbmQgYWxsb3cgZm9yIGNvbXBpbGUtdGltZSB0eXBlIGNoZWNraW5nLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGFnIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tIFVzZSA8Y29kZT5kZXZpY2UtYWRtaW48L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhCiAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlQWRtaW5SZWNlaXZlcn0sIHdoaWNoIGlzCkBAIC0zNjIxLDcgKzM5NjgsNyBAQAogICAgIDwhLS0gQWNjb3VudHMgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVXNlIDxjb2RlPmFjY291bnQtYXV0aGVudGljYXRvcjwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAogICAgICAgICAgZGVzY3JpYmVzIGFuIGFjY291bnQgYXV0aGVudGljYXRvci4KICAgICAgLS0+CkBAIC0zNjQyLDcgKzM5ODksNyBAQAogICAgIDwhLS0gQWNjb3VudHMgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVXNlIDxjb2RlPmFjY291bnQtYXV0aGVudGljYXRvcjwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAogICAgICAgICAgZGVzY3JpYmVzIGFuIGFjY291bnQgYXV0aGVudGljYXRvci4KICAgICAgLS0+CkBAIC0zNjU4LDcgKzQwMDUsNyBAQAogICAgIDwhLS0gQ29udGFjdHMgbWV0YS1kYXRhIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBUT0RPOiByZW1vdmUgdGhpcyBkZXByZWNhdGVkIHN0eWxlYWJsZS4gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ikljb24iPgpAQCAtMzY4NCw2ICs0MDMxLDkgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZGV0YWlsQ29sdW1uIiBmb3JtYXQ9InN0cmluZyIgLz4KICAgICAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgdGhhdCBkZXRhaWwgc2hvdWxkIGJlIGJ1aWx0IGZyb20gU29jaWFsUHJvdmlkZXIuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJkZXRhaWxTb2NpYWxTdW1tYXJ5IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDwhLS0gUmVzb3VyY2UgcmVwcmVzZW50aW5nIHRoZSB0ZXJtICJBbGwgQ29udGFjdHMiIChlLmcuICJBbGwgRnJpZW5kcyIgb3IKKyAgICAgICAgIkFsbCBjb25uZWN0aW9ucyIpLiBPcHRpb25hbCAoRGVmYXVsdCBpcyAiQWxsIENvbnRhY3RzIikuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhbGxDb250YWN0c05hbWUiIGZvcm1hdD0ic3RyaW5nIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0zNzE1LDQgKzQwNjUsMTI1IEBACiAgICAgICAgIDxhdHRyIG5hbWU9InNldHRpbmdzQWN0aXZpdHkiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIEFkYXB0ZXJzIGF0dHJpYnV0ZXMgICAgICAgICAgICAgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPCEtLSBBZGFwdGVyIHVzZWQgdG8gYmluZCBjdXJzb3JzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlciI+CisgICAgICAgIDwhLS0gVVJJIHRvIGdldCB0aGUgY3Vyc29yIGZyb20uIE9wdGlvbmFsLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idXJpIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBTZWxlY3Rpb24gc3RhdGVtZW50IGZvciB0aGUgcXVlcnkuIE9wdGlvbmFsLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic2VsZWN0aW9uIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBTb3J0IG9yZGVyIHN0YXRlbWVudCBmb3IgdGhlIHF1ZXJ5LiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNvcnRPcmRlciIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gTGF5b3V0IHJlc291cmNlIHVzZWQgdG8gZGlzcGxheSBlYWNoIHJvdyBmcm9tIHRoZSBjdXJzb3IuIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImxheW91dCIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgaW4gYmluZCBpdGVtcyBmb3IgWE1MIGN1cnNvciBhZGFwdGVycy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfQmluZEl0ZW0iPgorICAgICAgICA8IS0tIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gYmluZCBmcm9tLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcm9tIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIHZpZXcgdG8gYmluZCB0by4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idG8iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIGJpbmRpbmcuIElmIHRoaXMgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIHR5cGUgd2lsbCBiZQorICAgICAgICAgICAgIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlICJ0byIgdGFyZ2V0IHZpZXcuIE1hbmRhdG9yeS4KKworICAgICAgICAgICAgIFRoZSB0eXBlIGNhbiBiZSBvbmUgb2Y6CisgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgIDxsaT5zdHJpbmcsIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcuPC9saT4KKyAgICAgICAgICAgICA8bGk+aW1hZ2UsIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBibG9iIGRlc2NyaWJpbmcgYW4gaW1hZ2UuPC9saT4KKyAgICAgICAgICAgICA8bGk+aW1hZ2UtdXJpLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgVVJJIHRvIGFuIGltYWdlLjwvbGk+CisgICAgICAgICAgICAgPGxpPmRyYXdhYmxlLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWQgdG8gYSBkcmF3YWJsZS48L2xpPgorICAgICAgICAgICAgIDxsaT5BIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLCBjb3JyZXNwb25kaW5nIHRvIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAgICAgICAgIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlci48L2xpPgorICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYXMiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCBpbiBzZWxlY3QgaXRlbXMgZm9yIFhNTCBjdXJzb3IgYWRhcHRlcnMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW0iPgorICAgICAgICA8IS0tIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gc2VsZWN0LiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjb2x1bW4iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCB0byBtYXAgdmFsdWVzIHRvIG5ldyB2YWx1ZXMgaW4gWE1MIGN1cnNvciBhZGFwdGVycycgYmluZCBpdGVtcy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfTWFwSXRlbSI+CisgICAgICAgIDwhLS0gVGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gdGhlIGNvbHVtbi4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJvbVZhbHVlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgbmV3IHZhbHVlIGZyb20gdGhlIGNvbHVtbi4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idG9WYWx1ZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIHRvIG1hcCB2YWx1ZXMgdG8gbmV3IHZhbHVlcyBpbiBYTUwgY3Vyc29yIGFkYXB0ZXJzJyBiaW5kIGl0ZW1zLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgdHJhbnNmb3JtYXRpb24gZXhwcmVzc2lvbi4gTWFuZGF0b3J5IGlmICJ3aXRoQ2xhc3MiIGlzIG5vdCBzcGVjaWZpZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aXRoRXhwcmVzc2lvbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIHRyYW5zZm9ybWF0aW9uIGNsYXNzLCBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgICAgIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uLiBNYW5kYXRvcnkgaWYgIndpdGhFeHByZXNzaW9uIgorICAgICAgICAgICAgIGlzIG5vdCBzcGVjaWZpZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aXRoQ2xhc3MiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCB0byBzdHlsZSB0aGUgQWN0aW9uIEJhci4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFjdGlvbkJhciI+CisgICAgICAgIDwhLS0gVGhlIHR5cGUgb2YgbmF2aWdhdGlvbiB0byB1c2UuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJuYXZpZ2F0aW9uTW9kZSI+CisgICAgICAgICAgICA8IS0tIE5vcm1hbCBzdGF0aWMgdGl0bGUgdGV4dCAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vcm1hbCIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIFRoZSBhY3Rpb24gYmFyIHdpbGwgdXNlIGEgZHJvcC1kb3duIHNlbGVjdGlvbiBpbiBwbGFjZSBvZiB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRyb3Bkb3duTGlzdCIgdmFsdWU9IjEiIC8+CisgICAgICAgICAgICA8IS0tIFRoZSBhY3Rpb24gYmFyIHdpbGwgdXNlIGEgc2VyaWVzIG9mIGhvcml6b250YWwgdGFicyBpbiBwbGFjZSBvZiB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9InRhYkJhciIgdmFsdWU9IjIiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBPcHRpb25zIGFmZmVjdGluZyBob3cgdGhlIGFjdGlvbiBiYXIgaXMgZGlzcGxheWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZGlzcGxheU9wdGlvbnMiPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0idXNlTG9nbyIgdmFsdWU9IjEiIC8+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJoaWRlSG9tZSIgdmFsdWU9IjIiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGNvbG9yIHVzZWQgdG8gc3R5bGUgdGhlIGFjdGlvbiBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjb2xvckZpbHRlciIgZm9ybWF0PSJjb2xvciIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGl0bGUgdGV4dCB1c2VkIGZvciBuYXZpZ2F0aW9uTW9kZT0ibm9ybWFsIiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGUiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHN1YnRpdGxlIHRleHQgdXNlZCBmb3IgbmF2aWdhdGlvbk1vZGU9Im5vcm1hbCIgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1YnRpdGxlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBzdHlsZSB0byB1c2UgZm9yIHRpdGxlIHRleHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0aXRsZVRleHRTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciBzdWJ0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VidGl0bGVUZXh0U3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgZHJhd2FibGUgdXNlZCBmb3IgdGhlIGFwcGxpY2F0aW9uIGljb24uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgZHJhd2FibGUgdXNlZCBmb3IgdGhlIGFwcGxpY2F0aW9uIGxvZ28uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgZHJhd2FibGUgdXNlZCBmb3IgaXRlbSBkaXZpZGVycy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRpdmlkZXIiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgYmFja2dyb3VuZCBkcmF3YWJsZSBmb3IgdGhlIGFjdGlvbiBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGxheW91dCBmb3IgY3VzdG9tIG5hdmlnYXRpb24uIE92ZXJyaWRlcyBuYXZpZ2F0aW9uTW9kZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImN1c3RvbU5hdmlnYXRpb25MYXlvdXQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGZpeGVkIGhlaWdodC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImhlaWdodCIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFjdGlvbk1vZGUiPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3IgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlVGV4dFN0eWxlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3Igc3VidGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1YnRpdGxlVGV4dFN0eWxlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGJhY2tncm91bmQgZm9yIHRoZSBhY3Rpb24gbW9kZSBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGZpeGVkIGhlaWdodCBmb3IgdGhlIGFjdGlvbiBtb2RlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImhlaWdodCIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBwYWRkaW5nIHRvIHVzZSBiZXR3ZWVuIGVsZW1lbnRzIG9uIHRoZSBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpdGVtUGFkZGluZyIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJTZWFyY2hWaWV3Ij4KKyAgICAgICAgPCEtLSBUaGUgZGVmYXVsdCBzdGF0ZSBvZiB0aGUgU2VhcmNoVmlldy4gSWYgdHJ1ZSwgaXQgd2lsbCBiZSBpY29uaWZpZWQgd2hlbiBub3QgaW4KKyAgICAgICAgICAgICB1c2UgYW5kIGV4cGFuZGVkIHdoZW4gY2xpY2tlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imljb25pZmllZEJ5RGVmYXVsdCIgZm9ybWF0PSJib29sZWFuIi8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbAppbmRleCAyOTg0NjNhLi45NDlkOTYwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbApAQCAtNzUsOCArNzUsNyBAQAogICAgICAgICAgaGVhZGVyIGluIHRoZSBBY3Rpb24gQmFyLiBUaGUgcHJpbWFyeSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGFuIGljb24KICAgICAgICAgIGFuZCBhIGxvZ28gYXJlIHRoYXQgbG9nb3MgYXJlIG9mdGVuIHdpZGVyIGFuZCBtb3JlIGRldGFpbGVkLCBhbmQgYXJlCiAgICAgICAgICB1c2VkIHdpdGhvdXQgYW4gYWNjb21wYW55aW5nIHRleHQgY2FwdGlvbi4gVGhpcyBtdXN0IGJlIGEgcmVmZXJlbmNlCi0gICAgICAgICB0byBhIERyYXdhYmxlIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIGltYWdlIGRlZmluaXRpb24uCi0gICAgICAgICBAaGlkZSAtLT4KKyAgICAgICAgIHRvIGEgRHJhd2FibGUgcmVzb3VyY2UgY29udGFpbmluZyB0aGUgaW1hZ2UgZGVmaW5pdGlvbi4gLS0+CiAgICAgPGF0dHIgbmFtZT0ibG9nbyIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKICAgICA8IS0tIE5hbWUgb2YgdGhlIGFjdGl2aXR5IHRvIGJlIGxhdW5jaGVkIHRvIG1hbmFnZSBhcHBsaWNhdGlvbidzIHNwYWNlIG9uCkBAIC0yMzYsNiArMjM1LDEwIEBACiAgICAgICAgICB0aGUgc2FmZSBtb2RlLiAgLS0+CiAgICAgPGF0dHIgbmFtZT0idm1TYWZlTW9kZSIgZm9ybWF0PSJib29sZWFuIiAvPgogCisgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYXBwbGljYXRpb24ncyByZW5kZXJpbmcgc2hvdWxkIGJlIGhhcmR3YXJlCisgICAgICAgICBhY2NlbGVyYXRlZCBpZiBwb3NzaWJsZS4gIC0tPgorICAgIDxhdHRyIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKwogICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBpcyBhdmFpbGFibGUKICAgICAgICAgIHRvIG90aGVyIGFwcGxpY2F0aW9ucy4gIElmIGZhbHNlLCBpdCBjYW4gb25seSBiZSBhY2Nlc3NlZCBieQogICAgICAgICAgYXBwbGljYXRpb25zIHdpdGggaXRzIHNhbWUgdXNlciBpZCAod2hpY2ggdXN1YWxseSBtZWFucyBvbmx5IGJ5CkBAIC00MDAsOCArNDAzLDcgQEAKICAgICA8YXR0ciBuYW1lPSJzeW5jYWJsZSIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIAogICAgIDwhLS0gRmxhZyBkZWNsYXJpbmcgdGhpcyBhY3Rpdml0eSB0byBiZSAnaW1tZXJzaXZlJzsgaW1tZXJzaXZlIGFjdGl2aXRpZXMKLSAgICAgICAgIHNob3VsZCBub3QgYmUgaW50ZXJydXB0ZWQgd2l0aCBvdGhlciBhY3Rpdml0aWVzIG9yIG5vdGlmaWNhdGlvbnMuCi0gICAgICAgICBAaGlkZSAtLT4KKyAgICAgICAgIHNob3VsZCBub3QgYmUgaW50ZXJydXB0ZWQgd2l0aCBvdGhlciBhY3Rpdml0aWVzIG9yIG5vdGlmaWNhdGlvbnMuIC0tPgogICAgIDxhdHRyIG5hbWU9ImltbWVyc2l2ZSIgZm9ybWF0PSJib29sZWFuIiAvPgogCiAgICAgPCEtLSBTcGVjaWZ5IHRoZSBvcmRlciBpbiB3aGljaCBjb250ZW50IHByb3ZpZGVycyBob3N0ZWQgYnkgYSBwcm9jZXNzCkBAIC03MzUsNiArNzM3LDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0idGhlbWUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZXNjcmlwdGlvbiIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0icGVybWlzc2lvbiIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0icHJvY2VzcyIgLz4KQEAgLTc1Myw2ICs3NTYsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJlbmFibGVkIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZWJ1Z2dhYmxlIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJ2bVNhZmVNb2RlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgogICAgICAgICA8IS0tIE5hbWUgb2YgYWN0aXZpdHkgdG8gYmUgbGF1bmNoZWQgZm9yIG1hbmFnaW5nIHRoZSBhcHBsaWNhdGlvbidzIHNwYWNlIG9uIHRoZSBkZXZpY2UuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJtYW5hZ2VTcGFjZUFjdGl2aXR5IiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJhbGxvd0NsZWFyVXNlckRhdGEiIC8+CkBAIC03OTMsNiArNzk3LDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ibmFtZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0ibGFiZWwiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImxvZ28iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InBlcm1pc3Npb25Hcm91cCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZGVzY3JpcHRpb24iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InByb3RlY3Rpb25MZXZlbCIgLz4KQEAgLTgxNyw2ICs4MjIsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJuYW1lIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJsYWJlbCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZGVzY3JpcHRpb24iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICAKQEAgLTg0Niw2ICs4NTIsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJuYW1lIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJsYWJlbCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIAogICAgIDwhLS0gVGhlIDxjb2RlPnVzZXMtcGVybWlzc2lvbjwvY29kZT4gdGFnIHJlcXVlc3RzIGEKQEAgLTEwNTAsNiArMTA1Nyw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZXNjcmlwdGlvbiIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0icHJvY2VzcyIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYXV0aG9yaXRpZXMiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InN5bmNhYmxlIiAvPgpAQCAtMTEyOSw2ICsxMTM3LDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ibGFiZWwiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRlc2NyaXB0aW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJwZXJtaXNzaW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJwcm9jZXNzIiAvPgogICAgICAgICA8IS0tIFNwZWNpZnkgd2hldGhlciB0aGUgc2VydmljZSBpcyBlbmFibGVkIG9yIG5vdCAodGhhdCBpcywgY2FuIGJlIGluc3RhbnRpYXRlZCBieSB0aGUgc3lzdGVtKS4KQEAgLTExNjEsNiArMTE3MCw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZXNjcmlwdGlvbiIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0icGVybWlzc2lvbiIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0icHJvY2VzcyIgLz4KICAgICAgICAgPCEtLSBTcGVjaWZ5IHdoZXRoZXIgdGhlIHJlY2VpdmVyIGlzIGVuYWJsZWQgb3Igbm90ICh0aGF0IGlzLCBjYW4gYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBzeXN0ZW0pLgpAQCAtMTE5Myw2ICsxMjAzLDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ibGFiZWwiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRlc2NyaXB0aW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJsYXVuY2hNb2RlIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJzY3JlZW5PcmllbnRhdGlvbiIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iY29uZmlnQ2hhbmdlcyIgLz4KQEAgLTEyMTgsNiArMTIyOSw4IEBACiAgICAgICAgICAgICAgdGhpcyBhY3Rpdml0eS4gIEEgdmFsdWUgYmVzaWRlcyAidW5zcGVjaWZpZWQiIGhlcmUgb3ZlcnJpZGVzCiAgICAgICAgICAgICAgYW55IHZhbHVlIGluIHRoZSB0aGVtZS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1NvZnRJbnB1dE1vZGUiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImltbWVyc2l2ZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIAogICAgIDwhLS0gVGhlIDxjb2RlPmFjdGl2aXR5LWFsaWFzPC9jb2RlPiB0YWcgZGVjbGFyZXMgYSBuZXcKQEAgLTEyNDYsNiArMTI1OSw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZXNjcmlwdGlvbiIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0icGVybWlzc2lvbiIgLz4KICAgICAgICAgPCEtLSBTcGVjaWZ5IHdoZXRoZXIgdGhlIGFjdGl2aXR5LWFsaWFzIGlzIGVuYWJsZWQgb3Igbm90ICh0aGF0IGlzLCBjYW4gYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBzeXN0ZW0pLgogICAgICAgICAgICAgIEl0IGNhbiBhbHNvIGJlIHNwZWNpZmllZCBmb3IgYW4gYXBwbGljYXRpb24gYXMgYSB3aG9sZSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG9mICJmYWxzZSIKQEAgLTEzMTUsNiArMTMyOSw3IEBACiAgICAgICAgICBwYXJlbnQ9IkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5IEFuZHJvaWRNYW5pZmVzdFJlY2VpdmVyIEFuZHJvaWRNYW5pZmVzdFNlcnZpY2UiPgogICAgICAgICA8YXR0ciBuYW1lPSJsYWJlbCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0icHJpb3JpdHkiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICAKQEAgLTE0MjEsNiArMTQzNiw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9InRhcmdldFBhY2thZ2UiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJoYW5kbGVQcm9maWxpbmciIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImZ1bmN0aW9uYWxUZXN0IiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbG9ycy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKaW5kZXggYjZhZjZiMi4uNjIzMzY4ZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApAQCAtMTgsOCArMTgsOCBAQAogKi8KIC0tPgogPHJlc291cmNlcz4KLQk8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfbGlnaHQiPiNmZmZmZmZmZjwvZHJhd2FibGU+Ci0JPGRyYXdhYmxlIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2RhcmsiPiNmZjAwMDAwMDwvZHJhd2FibGU+CisJICA8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfbGlnaHQiPiNmZmYzZjNmMzwvZHJhd2FibGU+CisJICA8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFyayI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KICAgICA8ZHJhd2FibGUgbmFtZT0ic3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIj4jZmYwMDAwMDA8L2RyYXdhYmxlPgogICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0dXNfYmFyX29wZW5lZF9kZWZhdWx0X2JhY2tncm91bmQiPiNmZjAwMDAwMDwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9InNlYXJjaF9iYXJfZGVmYXVsdF9jb2xvciI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KQEAgLTM3LDIzICszNywyOSBAQAogICAgIDxjb2xvciBuYW1lPSJibGFjayI+I2ZmMDAwMDAwPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0idHJhbnNwYXJlbnQiPiMwMDAwMDAwMDwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImJhY2tncm91bmRfZGFyayI+I2ZmMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFyayI+I2ZmZmZmZmZmPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9saWdodCI+I2ZmZjNmM2YzPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFyayI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9saWdodDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ij5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2Rhcms8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIj4jODBmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiPiNmZjAwMDAwMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIj4jODAwMDAwMDA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyazwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2RhcmsiPiNiZWJlYmU8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIj4jODBiZWJlYmU8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiPiMzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2VfZGlzYWJsZWQiPiM4MDMyMzIzMjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImhpbnRfZm9yZWdyb3VuZF9kYXJrIj4jODA4MDgwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9saWdodCI+I2ZmZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiPiNmZjAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2UiPiNmZmZmZmZmZjwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIj4jODAwMDAwMDA8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9saWdodCI+IzMyMzIzMjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIj4jODAzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9saWdodF9pbnZlcnNlIj4jYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZV9kaXNhYmxlZCI+IzgwYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iaGludF9mb3JlZ3JvdW5kX2xpZ2h0Ij4jODA4MDgwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0X2JhY2tncm91bmQiPiNjYzQ3NTkyNTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodF9iYWNrZ3JvdW5kX2ludmVyc2UiPiNjY2QyZTQ2MTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodGVkX3RleHRfZGFyayI+I2NjNDc1OTI1PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0ZWRfdGV4dF9saWdodCI+I2NjZDJlNDYxPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0ibGlua190ZXh0X2RhcmsiPiM1YzVjZmY8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJsaW5rX3RleHRfbGlnaHQiPiMwMDAwZWU8L2NvbG9yPgogCiAgICAgPGRyYXdhYmxlIG5hbWU9InN0YXRfbm90aWZ5X3N5bmNfbm9hbmltIj5AZHJhd2FibGUvc3RhdF9ub3RpZnlfc3luY19hbmltMDwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9InN0YXRfc3lzX2Rvd25sb2FkX2RvbmUiPkBkcmF3YWJsZS9zdGF0X3N5c19kb3dubG9hZF9hbmltMDwvZHJhd2FibGU+CkBAIC05Nyw1ICsxMDMsMzIgQEAKICAgICA8Y29sb3IgbmFtZT0ia2V5Z3VhcmRfdGV4dF9jb2xvcl9zb3VuZG9uIj4jZTY5MzEwPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0ia2V5Z3VhcmRfdGV4dF9jb2xvcl9kZWNsaW5lIj4jZmUwYTVhPC9jb2xvcj4KIAorICAgIDwhLS0gRm9yIGhvbG8gdGhlbWUgLS0+CisJICA8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfaG9sb19saWdodCI+I2ZmZjNmM2YzPC9kcmF3YWJsZT4KKwkgIDxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9ob2xvX2RhcmsiPiNmZjAwMDAwMDwvZHJhd2FibGU+CisgICAgPGNvbG9yIG5hbWU9ImJhY2tncm91bmRfaG9sb19kYXJrIj4jZmYwMDAwMDA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJiYWNrZ3JvdW5kX2hvbG9fbGlnaHQiPiNmZmYzZjNmMzwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2hvbG9fZGFyayI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9ob2xvX2xpZ2h0PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfaG9sb19saWdodCI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9ob2xvX2Rhcms8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kaXNhYmxlZF9ob2xvX2RhcmsiPiM4MGZmZmZmZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2Rpc2FibGVkX2hvbG9fbGlnaHQiPiM4MDAwMDAwMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2ludmVyc2VfaG9sb19kYXJrIj5AYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9ob2xvX2xpZ2h0PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfaW52ZXJzZV9ob2xvX2xpZ2h0Ij5AYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9ob2xvX2Rhcms8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9ob2xvX2RhcmsiPiNiZWJlYmU8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kaXNhYmxlZF9ob2xvX2RhcmsiPiM4MGJlYmViZTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2ludmVyc2VfaG9sb19kYXJrIj4jMzIzMjMyPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfaW52ZXJzZV9kaXNhYmxlZF9ob2xvX2RhcmsiPiM4MDMyMzIzMjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpbnRfZm9yZWdyb3VuZF9ob2xvX2RhcmsiPiM4MDgwODA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9ob2xvX2xpZ2h0Ij4jMzIzMjMyPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfZGlzYWJsZWRfaG9sb19saWdodCI+IzgwMzIzMjMyPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfaW52ZXJzZV9ob2xvX2xpZ2h0Ij4jYmViZWJlPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfaW52ZXJzZV9kaXNhYmxlZF9ob2xvX2xpZ2h0Ij4jODBiZWJlYmU8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJoaW50X2ZvcmVncm91bmRfaG9sb19saWdodCI+IzgwODA4MDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodF9iYWNrZ3JvdW5kX2hvbG8iPiNjYzQ3NTkyNTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodF9iYWNrZ3JvdW5kX2ludmVyc2VfaG9sbyI+I2NjZDJlNDYxPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0ZWRfdGV4dF9ob2xvX2RhcmsiPiNjYzQ3NTkyNTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodGVkX3RleHRfaG9sb19saWdodCI+I2NjZDJlNDYxPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0ibGlua190ZXh0X2hvbG9fZGFyayI+IzVjNWNmZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImxpbmtfdGV4dF9ob2xvX2xpZ2h0Ij4jMDAwMGVlPC9jb2xvcj4KIDwvcmVzb3VyY2VzPgogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggMjljODZjMC4uZjZjNWYzNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtMjIsNyArMjIsOCBAQAogPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CiAgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKICAgICAgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50Ij5jb20uYW5kcm9pZC5zeXN0ZW11aS9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuU3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudCI+Y29tLmFuZHJvaWQuc3lzdGVtdWkvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlBob25lU3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlIj50cnVlPC9ib29sPgogCiAgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiBEZWZpbmVzIHRoZSBzbG90cyBmb3IgdGhlIHJpZ2h0LWhhbmQgc2lkZSBpY29ucy4gIFRoYXQgaXMgdG8gc2F5LCB0aGUKICAgICAgICAgIGljb25zIGluIHRoZSBzdGF0dXMgYmFyIHRoYXQgYXJlIG5vdCBub3RpZmljYXRpb25zLiAtLT4KQEAgLTcxLDYgKzcyLDE3IEBACiAgICAgICAgICB3aGVuIHRoZXJlJ3Mgbm8gbmV0d29yayBjb25uZWN0aW9uLiBJZiB0aGUgc2NhbiBkb2Vzbid0IHRpbWVvdXQsIHVzZSB6ZXJvIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19yYWRpb1NjYW5uaW5nVGltZW91dCI+MDwvaW50ZWdlcj4KIAorICAgIDwhLS0gU2V0IHRvIHRydWUgaWYgdGhlIGxvY2F0aW9uIHJldHVybmVkIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpCisgICAgICAgICBpcyBhY3R1YWxseSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgaW50ZXJuYWwgc3RvcmFnZS4KKyAgICAgICAgIElmIHRoaXMgaXMgc2V0IHRoZW4gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKSB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAgICAgIE1FRElBX01PVU5URUQgYW5kIEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCB3aWxsIGJlIGJyb2FkY2FzdCBhdCBib290IHRpbWUKKyAgICAgICAgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggYXBwcyB0aGF0IHJlcXVpcmUgZXh0ZXJuYWwgc3RvcmFnZS4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VtdWxhdGVFeHRlcm5hbFN0b3JhZ2UiPmZhbHNlPC9ib29sPgorCisgICAgPCEtLSBTZXQgdG8gdHJ1ZSBpZiBleHRlcm5hbCBzdG9yYWdlIGlzIGNhc2Ugc2Vuc2l0aXZlLgorICAgICAgICAgVHlwaWNhbGx5IGV4dGVybmFsIHN0b3JhZ2UgaXMgRkFULCB3aGljaCBpcyBjYXNlIGluc2Vuc2l0aXZlLiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfY2FzZVNlbnNpdGl2ZUV4dGVybmFsU3RvcmFnZSI+ZmFsc2U8L2Jvb2w+CisgICAgCiAgICAgPCEtLSBBIHByb2R1Y3Qgd2l0aCBubyBTRCBjYXJkID09IG5vdCByZW1vdmFibGUuIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19leHRlcm5hbFN0b3JhZ2VSZW1vdmFibGUiIHByb2R1Y3Q9Im5vc2RjYXJkIj5mYWxzZTwvYm9vbD4KICAgICA8IS0tIENvbmZpZ3VyZXMgd2hldGhlciB0aGUgcHJpbWFyeSBleHRlcm5hbCBzdG9yYWdlIGRldmljZSBpcwpAQCAtMTA2LDYgKzExOCw5IEBACiAgICAgICAgIDxpdGVtPiIwLDEiPC9pdGVtPgogICAgIDwvc3RyaW5nLWFycmF5PgogCisgICAgPCEtLSBUaGUgbWF4aW11bSBkdXJhdGlvbiAoaW4gbWlsbGlzZWNvbmRzKSB3ZSBleHBlY3QgYSBuZXR3b3JrIHRyYW5zaXRpb24gdG8gdGFrZSAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbmV0d29ya1RyYW5zaXRpb25UaW1lb3V0Ij42MDAwMDwvaW50ZWdlcj4KKwogICAgIDwhLS0gTGlzdCBvZiByZWdleHByZXNzaW9ucyBkZXNjcmliaW5nIHRoZSBpbnRlcmZhY2UgKGlmIGFueSkgdGhhdCByZXByZXNlbnQgdGV0aGVyYWJsZQogICAgICAgICAgVVNCIGludGVyZmFjZXMuICBJZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgd2FudCB0byBzdXBwb3J0IHRldGhpbmcgb3ZlciBVU0IgdGhpcyBzaG91bGQKICAgICAgICAgIGJlIGVtcHR5LiAgQW4gZXhhbXBsZSB3b3VsZCBiZSAidXNiLioiIC0tPgpAQCAtMTE4LDYgKzEzMywxNiBAQAogICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX3RldGhlcl93aWZpX3JlZ2V4cyI+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKKyAgICA8IS0tIExpc3Qgb2YgcmVnZXhwcmVzc2lvbnMgZGVzY3JpYmluZyB0aGUgaW50ZXJmYWNlIChpZiBhbnkpIHRoYXQgcmVwcmVzZW50IHRldGhlcmFibGUKKyAgICAgICAgIGJsdWV0b290aCBpbnRlcmZhY2VzLiAgSWYgdGhlIGRldmljZSBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCB0ZXRoZXJpbmcgb3ZlciBibHVldG9vdGggdGhpcworICAgICAgICAgc2hvdWxkIGJlIGVtcHR5LiAtLT4KKyAgICA8c3RyaW5nLWFycmF5IHRyYW5zbGF0YWJsZT0iZmFsc2UiIG5hbWU9ImNvbmZpZ190ZXRoZXJfYmx1ZXRvb3RoX3JlZ2V4cyI+CisgICAgPC9zdHJpbmctYXJyYXk+CisKKyAgICA8IS0tIE1heCBudW1iZXIgb2YgQmx1ZXRvb3RoIHRldGhlcmluZyBjb25uZWN0aW9ucyBhbGxvd2VkLiBJZiB0aGlzIGlzCisgICAgICAgICB1cGRhdGVkIGNvbmZpZ190ZXRoZXJfZGhjcF9yYW5nZSBoYXMgdG8gYmUgdXBkYXRlZCBhcHByb3ByaWF0ZWx5LiAtLT4KKyAgICA8aW50ZWdlciB0cmFuc2xhdGVhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX21heF9wYW5fZGV2aWNlcyI+NTwvaW50ZWdlcj4KKwogICAgIDwhLS0gRGhjcCByYW5nZSAobWluLCBtYXgpIHRvIHVzZSBmb3IgdGV0aGVyaW5nIHB1cnBvc2VzIC0tPgogICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX3RldGhlcl9kaGNwX3JhbmdlIj4KICAgICA8L3N0cmluZy1hcnJheT4KQEAgLTE5Niw5ICsyMjEsMTkgQEAKICAgICAgICAgIGNsb3NlZC4gIFRoZSBkZWZhdWx0IGlzIDAuIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19saWROYXZpZ2F0aW9uQWNjZXNzaWJpbGl0eSI+MDwvaW50ZWdlcj4KIAorICAgIDwhLS0gQ29udHJvbCB0aGUgYmVoYXZpb3Igd2hlbiB0aGUgdXNlciBsb25nIHByZXNzZXMgdGhlIHBvd2VyIGJ1dHRvbi4KKyAgICAgICAgICAgIDAgLSBOb3RoaW5nCisgICAgICAgICAgICAxIC0gR2xvYmFsIGFjdGlvbnMgbWVudQorICAgICAgICAgICAgMiAtIFBvd2VyIG9mZiAod2l0aCBjb25maXJtYXRpb24pCisgICAgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2xvbmdQcmVzc09uUG93ZXJCZWhhdmlvciI+MTwvaW50ZWdlcj4KKwogICAgIDwhLS0gSW5kaWNhdGUgd2hldGhlciB0aGUgU0QgY2FyZCBpcyBhY2Nlc3NpYmxlIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIGJhdHRlcnkuIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19iYXR0ZXJ5U2RDYXJkQWNjZXNzaWJpbGl0eSI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIEluZGljYXRlIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgVVNCIGhvc3Qgc3VwcG9ydC4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2hhc1VzYkhvc3RTdXBwb3J0Ij5mYWxzZTwvYm9vbD4KKwogICAgIDwhLS0gVmlicmF0b3IgcGF0dGVybiBmb3IgZmVlZGJhY2sgYWJvdXQgYSBsb25nIHNjcmVlbi9rZXkgcHJlc3MgLS0+CiAgICAgPGludGVnZXItYXJyYXkgbmFtZT0iY29uZmlnX2xvbmdQcmVzc1ZpYmVQYXR0ZXJuIj4KICAgICAgICAgPGl0ZW0+MDwvaXRlbT4KQEAgLTI4MSw2ICszMTYsMTUgQEAKICAgICA8IS0tIEFsbG93IHRoZSBtZW51IGhhcmQga2V5IHRvIGJlIGRpc2FibGVkIGluIExvY2tTY3JlZW4gb24gc29tZSBkZXZpY2VzIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19kaXNhYmxlTWVudUtleUluTG9ja1NjcmVlbiI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIFNob3cgc2xpZGluZyB0YWIgYmVmb3JlIGxvY2tzY3JlZW4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZVNsaWRpbmdUYWJGaXJzdCI+dHJ1ZTwvYm9vbD4KKworICAgIDwhLS0gRGlhYmxlIGxvY2tzY3JlZW4gcm90YXRpb24gYnkgZGVmYXVsdCAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlTG9ja1NjcmVlblJvdGF0aW9uIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gRW5hYmxlIDNEIFJlY2VudEFwcGxpY2F0aW9ucyB2aWV3IC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVSZWNlbnRBcHBzM0QiPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBBcnJheSBvZiBsaWdodCBzZW5zb3IgTFVYIHZhbHVlcyB0byBkZWZpbmUgb3VyIGxldmVscyBmb3IgYXV0byBiYWNrbGlnaHQgYnJpZ2h0bmVzcyBzdXBwb3J0LgogICAgICAgICAgVGhlIE4gZW50cmllcyBvZiB0aGlzIGFycmF5IGRlZmluZSBOICsgMSB6b25lcyBhcyBmb2xsb3dzOgogCkBAIC0zNjUsMTAgKzQwOSwzNCBAQAogICAgIDwhLS0gMiBtZWFucyBnaXZlIHdhcm5pbmcgLS0+CiAgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2RhdGF1c2Vfbm90aWZpY2F0aW9uX3R5cGUiPjI8L2ludGVnZXI+CiAKKyAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSBpcyAidm9pY2UgY2FwYWJsZSIuCisgICAgICAgICBJZiB0cnVlLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0cyBjaXJjdWl0LXN3aXRjaGVkCisgICAgICAgICAoaS5lLiB2b2ljZSkgcGhvbmUgY2FsbHMgb3ZlciB0aGUgdGVsZXBob255IG5ldHdvcmssIGFuZCBpcworICAgICAgICAgYWxsb3dlZCB0byBkaXNwbGF5IHRoZSBpbi1jYWxsIFVJIHdoaWxlIGEgY2VsbHVsYXIgdm9pY2UgY2FsbCBpcworICAgICAgICAgYWN0aXZlLiAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBmYWxzZSBmb3IgImRhdGEgb25seSIgZGV2aWNlcworICAgICAgICAgd2hpY2ggY2FuJ3QgbWFrZSB2b2ljZSBjYWxscyBhbmQgZG9uJ3Qgc3VwcG9ydCBhbnkgaW4tY2FsbCBVSS4KKworICAgICAgICAgTm90ZTogdGhpcyBmbGFnIGlzIHN1YnRseSBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVEVMRVBIT05ZIHN5c3RlbSBmZWF0dXJlLCB3aGljaCBpcworICAgICAgICAgYXZhaWxhYmxlIG9uICphbnkqIGRldmljZSB3aXRoIGEgdGVsZXBob255IHJhZGlvLCBldmVuIGlmIHRoZQorICAgICAgICAgZGV2aWNlIGlzIGRhdGEtb25seS4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX3ZvaWNlX2NhcGFibGUiPnRydWU8L2Jvb2w+CisKKyAgICA8IS0tIElQIGFkZHJlc3Mgb2YgdGhlIGRucyBzZXJ2ZXIgdG8gdXNlIGlmIG5vYm9keSBlbHNlIHN1Z2dlc3RzIG9uZSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ19kZWZhdWx0X2Ruc19zZXJ2ZXIiPjguOC44Ljg8L3N0cmluZz4KKworICAgIDwhLS0gVGhlIGRlZmF1bHQgY2hhcmFjdGVyIHNldCBmb3IgR3NtQWxwaGFiZXQgLS0+CisgICAgPCEtLSBFbXB0eSBzdHJpbmcgbWVhbnMgTUJDUyBpcyBub3QgY29uc2lkZXJlZCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImdzbV9hbHBoYWJldF9kZWZhdWx0X2NoYXJzZXQiPjwvc3RyaW5nPgorCiAgICAgPCEtLSBFbmFibGVzIFNJUCBvbiBXSUZJIG9ubHkgLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX3NpcF93aWZpX29ubHkiPmZhbHNlPC9ib29sPgogCiAgICAgPCEtLSBCb29sZWFuIGluZGljYXRpbmcgaWYgcmVzdG9yaW5nIG5ldHdvcmsgc2VsZWN0aW9uIHNob3VsZCBiZSBza2lwcGVkIC0tPgogICAgIDwhLS0gVGhlIHJlc3RvcmluZyBpcyBoYW5kbGVkIGJ5IG1vZGVtIGlmIGl0IGlzIHRydWUtLT4KICAgICA8Ym9vbCB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJza2lwX3Jlc3RvcmluZ19uZXR3b3JrX3NlbGVjdGlvbiI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIE51bWJlciBvZiBkYXRhYmFzZSBjb25uZWN0aW9ucyBvcGVuZWQgYW5kIG1hbmFnZWQgYnkgZnJhbWV3b3JrIGxheWVyCisgICAgICAgICB0byBoYW5kbGUgcXVlcmllcyBvbiBlYWNoIGRhdGFiYXNlLiAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJkYl9jb25uZWN0aW9uX3Bvb2xfc2l6ZSI+MTwvaW50ZWdlcj4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCmluZGV4IDExZjNlNTAuLjE3MWJiNDUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKQEAgLTI1LDYgKzI1LDkgQEAKICAgICA8IS0tIFRoZSBzdGFuZGFyZCBzaXplIChib3RoIHdpZHRoIGFuZCBoZWlnaHQpIG9mIGFuIGFwcGxpY2F0aW9uIGljb24gdGhhdAogICAgICAgICAgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGFwcCBsYXVuY2hlciBhbmQgZWxzZXdoZXJlLiAtLT4KICAgICA8ZGltZW4gbmFtZT0iYXBwX2ljb25fc2l6ZSI+NDhkaXA8L2RpbWVuPgorICAgIDwhLS0gVGhlIHN0YW5kYXJkIHNpemUgKGJvdGggd2lkdGggYW5kIGhlaWdodCkgb2YgYW4gYWN0aW9uIGljb24gdGhhdCB3aWxsCisgICAgICAgICBiZSBkaXNwbGF5ZWQgaW4gYXBwbGljYXRpb24gYWN0aW9uIGJhcnMuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJhY3Rpb25faWNvbl9zaXplIj40OGRpcDwvZGltZW4+CiAgICAgPGRpbWVuIG5hbWU9InRvYXN0X3lfb2Zmc2V0Ij42NGRpcDwvZGltZW4+CiAgICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaGVpZ2h0Ij4yNWRpcDwvZGltZW4+CkBAIC0zMiwxNCArMzUsMjIgQEAKICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3NpemUiPjI1ZGlwPC9kaW1lbj4KICAgICA8IS0tIE1hcmdpbiBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuIHRvIGlnbm9yZSB0b3VjaCBldmVudHMgZm9yIGluIHRoZSB3aW5kb3dzaGFkZS4gLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfZWRnZV9pZ25vcmUiPjVkcDwvZGltZW4+CisgICAgPCEtLSBNYXJnaW4gZm9yIHBlcm1hbmVudCBzY3JlZW4gZGVjb3JhdGlvbnMgYXQgdGhlIGJvdHRvbS4gLS0+CisgICAgPGRpbWVuIG5hbWU9InNjcmVlbl9tYXJnaW5fYm90dG9tIj4wZGlwPC9kaW1lbj4KICAgICA8IS0tIFNpemUgb2YgdGhlIGZhc3RzY3JvbGwgaGludCBsZXR0ZXIgLS0+CiAgICAgPGRpbWVuIG5hbWU9ImZhc3RzY3JvbGxfb3ZlcmxheV9zaXplIj4xMDRkcDwvZGltZW4+CiAgICAgPCEtLSBXaWR0aCBvZiB0aGUgZmFzdHNjcm9sbCB0aHVtYiAtLT4KICAgICA8ZGltZW4gbmFtZT0iZmFzdHNjcm9sbF90aHVtYl93aWR0aCI+NjRkcDwvZGltZW4+CiAgICAgPCEtLSBIZWlnaHQgb2YgdGhlIGZhc3RzY3JvbGwgdGh1bWIgLS0+CiAgICAgPGRpbWVuIG5hbWU9ImZhc3RzY3JvbGxfdGh1bWJfaGVpZ2h0Ij41MmRwPC9kaW1lbj4KLSAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCAtLT4KLSAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCI+NTZkaXA8L2RpbWVuPgorICAgIDwhLS0gTWluIHdpZHRoIGZvciBhIHRhYmxldCBkZXZpY2UgLS0+CisgICAgPGRpbWVuIG5hbWU9Im1pbl94bGFyZ2Vfc2NyZWVuX3dpZHRoIj44MDBkcDwvZGltZW4+CisgICAgPCEtLSBGaXhlZCB2aWV3cG9ydCBtYXJnaW4gZm9yIHdlYnNpdGUgY29udGVudCB3aWR0aCBjaGFuZ2UgLS0+CisgICAgPGRpbWVuIG5hbWU9ImZpeGVkX3ZpZXdwb3J0X21hcmdpbiI+N2RwPC9kaW1lbj4KKyAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCBmb3IgYWxwaGEgLS0+CisgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiPjU2ZGlwPC9kaW1lbj4KKyAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCBmb3IgbnVtZXJpYyAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9udW1lcmljIj41NmRpcDwvZGltZW4+CiAgICAgPCEtLSBEZWZhdWx0IGNvcnJlY3Rpb24gZm9yIHRoZSBzcGFjZSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIC0tPgogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9zcGFjZWJhcl92ZXJ0aWNhbF9jb3JyZWN0aW9uIj40ZGlwPC9kaW1lbj4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCmluZGV4IDhiNmFmNzEuLjMzY2QxMDAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvaWRzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwKQEAgLTU5LDYgKzU5LDcgQEAKICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImNvcHkiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJwYXN0ZSIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImNvcHlVcmwiIC8+CisgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9InN3aXRjaElucHV0TWV0aG9kIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0ia2V5Ym9hcmRWaWV3IiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iY2xvc2VCdXR0b24iIC8+CkBAIC02OCw0ICs2OSw1IEBACiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJhY2NvdW50UHJlZmVyZW5jZXMiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzbWFsbEljb24iIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjdXN0b20iIC8+CisgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJob21lIiAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKaW5kZXggY2M5MWZiNy4uYWUyNTcxNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbApAQCAtMTE4Myw3ICsxMTgzLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2xvckJhY2tncm91bmRDYWNoZUhpbnQiIGlkPSIweDAxMDEwMmFiIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCIgaWQ9IjB4MDEwMTAyYWMiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIgaWQ9IjB4MDEwMTAyYWQiIC8+Ci0gIAorCiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlciIgaWQ9IjB4MDEwMzAwNWUiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlci5Ob1RpdGxlQmFyIiBpZD0iMHgwMTAzMDA1ZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2FsbHBhcGVyLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIgaWQ9IjB4MDEwMzAwNjAiIC8+CkBAIC0xMTkxLDcgKzExOTEsNyBAQAogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5MaWdodC5XYWxscGFwZXJTZXR0aW5ncyIgaWQ9IjB4MDEwMzAwNjIiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNlYXJjaFJlc3VsdC5UaXRsZSIgaWQ9IjB4MDEwMzAwNjMiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNlYXJjaFJlc3VsdC5TdWJ0aXRsZSIgaWQ9IjB4MDEwMzAwNjQiIC8+Ci0gIAorCiAgIDwhLS0gU2VtaS10cmFuc3BhcmVudCBiYWNrZ3JvdW5kIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBwbGFjaW5nIGEgZGFyawogICAgICAgIHRoZW1lZCBVSSBvbiB0b3Agb2Ygc29tZSBhcmJpdHJhcnkgYmFja2dyb3VuZCAoc3VjaCBhcyB0aGUKICAgICAgICB3YWxscGFwZXIpLiAgVGhpcyBkYXJrZW5zIHRoZSBiYWNrZ3JvdW5kIHN1ZmZpY2llbnRseSB0aGF0IHRoZSBVSQpAQCAtMTE5OSw3ICsxMTk5LDcgQEAKICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFya190cmFuc3BhcmVudCIgaWQ9IjB4MDEwODAwYTkiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2xpZ2h0X3RyYW5zcGFyZW50IiBpZD0iMHgwMTA4MDBhYSIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic3RhdF9ub3RpZnlfc2RjYXJkX3ByZXBhcmUiIGlkPSIweDAxMDgwMGFiIiAvPgotICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gNiBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciAyLjAuMSkuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyMTEsNyArMTIxMSw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93U21hbGwiIGlkPSIweDAxMDEwMmIxIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd01lZGl1bSIgaWQ9IjB4MDEwMTAyYjIiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TGFyZ2UiIGlkPSIweDAxMDEwMmIzIiAvPgotICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gNyBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciBNUjEpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjIwLDcgKzEyMjAsNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImF1dGhvciIgaWQ9IjB4MDEwMTAyYjQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYXV0b1N0YXJ0IiBpZD0iMHgwMTAxMDJiNSIgLz4KIAotICAgIAorCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiA4IG9mIHRoZSBwbGF0Zm9ybSAoRWNsYWlyIE1SMikuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyNDEsMTkgKzEyNDEsMTYgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0YWJTdHJpcEVuYWJsZWQiIGlkPSIweDAxMDEwMmJkIiAvPgogCiAgIDxwdWJsaWMgdHlwZT0iaWQiIG5hbWU9ImN1c3RvbSIgaWQ9IjB4MDEwMjAwMmIiIC8+Ci0gICAgCisKICAgPHB1YmxpYyB0eXBlPSJhbmltIiBuYW1lPSJjeWNsZV9pbnRlcnBvbGF0b3IiIGlkPSIweDAxMGEwMDBjIiAvPgogCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgaW50cm9kdWNlZCBpbiBHaW5nZXJicmVhZC4KICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAKKyAgPGVhdC1jb21tZW50IC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibG9nbyIgaWQ9IjB4MDEwMTAyYmUiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ieGxhcmdlU2NyZWVucyIgaWQ9IjB4MDEwMTAyYmYiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaW1tZXJzaXZlIiBpZD0iMHgwMTAxMDJjMCIgLz4KLSAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJvdmVyU2Nyb2xsTW9kZSIgaWQ9IjB4MDEwMTAyYzEiIC8+Ci0gIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ib3ZlclNjcm9sbEhlYWRlciIgaWQ9IjB4MDEwMTAyYzIiIC8+Ci0gIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ib3ZlclNjcm9sbEZvb3RlciIgaWQ9IjB4MDEwMTAyYzMiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZmlsdGVyVG91Y2hlc1doZW5PYnNjdXJlZCIgaWQ9IjB4MDEwMTAyYzQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGV4dFNlbGVjdEhhbmRsZUxlZnQiIGlkPSIweDAxMDEwMmM1IiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRleHRTZWxlY3RIYW5kbGVSaWdodCIgaWQ9IjB4MDEwMTAyYzYiIC8+CkBAIC0xMjYyLDcgKzEyNTksNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InBvcHVwQW5pbWF0aW9uU3R5bGUiIGlkPSIweDAxMDEwMmM5IiAvPgogCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhdHRyIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMTAzMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJpZCIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDIwMDQwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iYW5pbSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMGEwMDIwIiAvPgogCkBAIC0xMjczLDkgKzEyNzAsOCBAQAogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19hd2F5IiBpZD0iMHgwMTA4MDBhZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fYnVzeSIgaWQ9IjB4MDEwODAwYjAiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX29ubGluZSIgaWQ9IjB4MDEwODAwYjEiIC8+Ci0KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwODAxMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSIgaWQ9IjB4MDEwMzAwNjUiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JY29uIiBpZD0iMHgwMTAzMDA2NiIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCIgaWQ9IjB4MDEwMzAwNjciIC8+CkBAIC0xMjg5LDQgKzEyODUsMTM5IEBACiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJkaW1lbiIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDUwMDEwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iY29sb3IiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA2MDAyMCIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImFycmF5IiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNzAwMTAiIC8+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJlc291cmNlcyBwcm9wb3NlZCBmb3IgSG9uZXljb21iLgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxlYXQtY29tbWVudCAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFkYXB0ZXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic2VsZWN0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNvcnRPcmRlciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ1cmkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJvbSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0byIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcm9tVmFsdWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idG9WYWx1ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2x1bW4iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2l0aEV4cHJlc3Npb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2l0aENsYXNzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQmFyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibmF2aWdhdGlvbk1vZGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZGlzcGxheU9wdGlvbnMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3VidGl0bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzaG93QXNBY3Rpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJwcmV2aWV3SW1hZ2UiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVGcm9tIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InZhbHVlVG8iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVUeXBlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InByb3BlcnR5TmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJvcmRlcmluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJPdmVybGF5IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50T3BlbkVudGVyQW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50TmV4dEVudGVyQW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50TmV4dEV4aXRBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRQcmV2RW50ZXJBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRQcmV2RXhpdEFuaW1hdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CYXJTaXplIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImltZVN1YnR5cGVMb2NhbGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaW1lU3VidHlwZU1vZGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3BsaXRNb3Rpb25FdmVudHMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3Bpbm5lck1vZGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYW5pbWF0ZUxheW91dENoYW5nZXMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaXRlbVBhZGRpbmciIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUNsb3NlQnV0dG9uU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGl0bGVUZXh0U3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3VidGl0bGVUZXh0U3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaWNvbmlmaWVkQnlEZWZhdWx0IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkxheW91dCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25WaWV3Q2xhc3MiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzdGF0ZV9hY3RpdmF0ZWQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibGlzdFBvcHVwV2luZG93U3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icG9wdXBNZW51U3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZVBvcHVwTWVudSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNtYWxsUG9wdXBNZW51IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImJyZWFkQ3J1bWJUaXRsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJicmVhZENydW1iU2hvcnRUaXRsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsaXN0RGl2aWRlckFsZXJ0RGlhbG9nIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibG9vcFZpZXdzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRpYWxvZ1RoZW1lIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFsZXJ0RGlhbG9nVGhlbWUiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJhbmltIiBuYW1lPSJhbmltYXRvcl9mYWRlX2luIiAvPgorICA8cHVibGljIHR5cGU9ImFuaW0iIG5hbWU9ImFuaW1hdG9yX2ZhZGVfb3V0IiAvPgorCisgIDxwdWJsaWMgdHlwZT0iaWQiIG5hbWU9ImhvbWUiIC8+CisgIDwhLS0gQ29udGV4dCBtZW51IElEIGZvciB0aGUgIlNlbGVjdCB0ZXh0Li4uIiBtZW51IGl0ZW0gdG8gc3dpdGNoIHRvIHRleHQKKyAgICAgICBzZWxlY3Rpb24gY29udGV4dCBtb2RlIGluIHRleHQgdmlld3MuIC0tPgorICA8cHVibGljIHR5cGU9ImlkIiBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgLz4KKworICA8IS0tIFN0YW5kYXJkIGNvbnRlbnQgdmlldyBmb3IgYSB7QGxpbmsgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50fS4KKyAgICAgICBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhIHN1YmNsYXNzIG9mIExpc3RGcmFnbWVudCB3aXRoIHlvdXIKKyAgICAgICBvd24gY3VzdG9taXplZCBjb250ZW50LCB5b3UgY2FuIGluY2x1ZGUgdGhpcyBsYXlvdXQgaW4gdGhhdAorICAgICAgIGNvbnRlbnQgdG8gc3RpbGwgcmV0YWluIGFsbCBvZiB0aGUgc3RhbmRhcmQgZnVuY3Rpb25hbGl0eSBvZgorICAgICAgIHRoZSBiYXNlIGNsYXNzLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJsYXlvdXQiIG5hbWU9Imxpc3RfY29udGVudCIgLz4KKworICA8IS0tIEEgc2ltcGxlIExpc3RWaWV3IGl0ZW0gbGF5b3V0IHdoaWNoIGNhbiBjb250YWluIHRleHQgYW5kIHN1cHBvcnQgKHNpbmdsZSBvciBtdWx0aXBsZSkgaXRlbSBzZWxlY3Rpb24uIC0tPgorICA8cHVibGljIHR5cGU9ImxheW91dCIgbmFtZT0ic2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtIiAvPgorCisgIDwhLS0gQSB2ZXJzaW9uIG9mIHtAbGluayAjc2ltcGxlX2xpc3RfaXRlbV8xfSB0aGF0IGlzIGFibGUgdG8gY2hhbmdlIGl0cworICAgICAgIGJhY2tncm91bmQgc3RhdGUgdG8gaW5kaWNhdGUgd2hlbiBpdCBpcyBhY3RpdmF0ZWQgKHRoYXQgaXMgY2hlY2tlZCBieQorICAgICAgIGEgTGlzdFZpZXcpLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJsYXlvdXQiIG5hbWU9InNpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzEiIC8+CisKKyAgPCEtLSBBIHZlcnNpb24gb2Yge0BsaW5rICNzaW1wbGVfbGlzdF9pdGVtXzJ9IHRoYXQgaXMgYWJsZSB0byBjaGFuZ2UgaXRzCisgICAgICAgYmFja2dyb3VuZCBzdGF0ZSB0byBpbmRpY2F0ZSB3aGVuIGl0IGlzIGFjdGl2YXRlZCAodGhhdCBpcyBjaGVja2VkIGJ5CisgICAgICAgYSBMaXN0VmlldykuIC0tPgorICA8cHVibGljIHR5cGU9ImxheW91dCIgbmFtZT0ic2ltcGxlX2xpc3RfaXRlbV9hY3RpdmF0ZWRfMiIgLz4KKworICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XaXRoQWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuU3Bpbm5lci5Ecm9wRG93biIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuRGlhbG9nLk5vRnJhbWUiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLk5vVGl0bGVCYXIuT3ZlcmxheUFjdGlvbk1vZGVzIiAvPgorCisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuSG9sby5Ob0FjdGlvbkJhciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuSG9sby5Ob0FjdGlvbkJhci5GdWxsc2NyZWVuIiAvPgorCisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5MaXN0UG9wdXBXaW5kb3ciIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5Qb3B1cE1lbnUiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3ciIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24uQ2xvc2VNb2RlIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuUG9wdXBNZW51LkxhcmdlIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuUG9wdXBNZW51LlNtYWxsIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuRnJhZ21lbnRCcmVhZENydW1icyIgLz4KKworICA8cHVibGljIHR5cGU9InN0cmluZyIgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIC8+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggNWM2MGZkNS4uOGZlYjJkNiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0yODAsMTIgKzI4MCwyNSBAQAogICAgIDwhLS0gU2h1dGRvd24gUHJvZ3Jlc3MgRGlhbG9nLiBUaGlzIGlzIHNob3duIGlmIHRoZSB1c2VyIGNob29zZXMgdG8gcG93ZXIgb2ZmIHRoZSBwaG9uZS4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzaHV0ZG93bl9wcm9ncmVzcyI+U2h1dHRpbmcgZG93blx1MjAyNjwvc3RyaW5nPgogCi0gICAgPCEtLSBTaHV0ZG93biBDb25maXJtYXRpb24gRGlhbG9nLiAgV2hlbiB0aGUgdXNlciBjaG9vc2VzIHRvIHBvd2VyIG9mZiB0aGUgcGhvbmUsIHRoZXJlIHdpbGwgYmUgYSBjb25maXJtYXRpb24gZGlhbG9nLiAgVGhpcyBpcyB0aGUgbWVzc2FnZS4gLS0+CisgICAgPCEtLSBTaHV0ZG93biBDb25maXJtYXRpb24gRGlhbG9nLiAgV2hlbiB0aGUgdXNlciBjaG9vc2VzIHRvIHBvd2VyIG9mZiB0aGUgcGhvbmUsIHRoZXJlIHdpbGwKKyAgICAgICAgIGJlIGEgY29uZmlybWF0aW9uIGRpYWxvZy4gIFRoaXMgaXMgdGhlIG1lc3NhZ2UuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2h1dGRvd25fY29uZmlybSI+WW91ciBwaG9uZSB3aWxsIHNodXQgZG93bi48L3N0cmluZz4KIAotICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogdGl0bGUgLS0+CisgICAgPCEtLSBTaHV0ZG93biBDb25maXJtYXRpb24gRGlhbG9nLiAgV2hlbiB0aGUgdXNlciBjaG9vc2VzIHRvIHBvd2VyIG9mZiB0aGUgcGhvbmUsIGl0IGFza3MKKyAgICAgICAgIHRoZSB1c2VyIGlmIHRoZXknZCBsaWtlIHRvIHNodXQgZG93bi4gIFRoaXMgaXMgdGhlIG1lc3NhZ2UuICBUaGlzIGlzIHVzZWQgaW5zdGVhZCBvZgorICAgICAgICAgc2h1dGRvd25fY29uZmlybSB3aGVuIHRoZSBzeXN0ZW0gaXMgY29uZmlndXJlZCB0byB1c2UgbG9uZyBwcmVzcyB0byBnbyBkaXJlY3RseSB0byB0aGUKKyAgICAgICAgIHBvd2VyIG9mZiBkaWFsb2cgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIGFjdGlvbnMgbWVudS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzaHV0ZG93bl9jb25maXJtX3F1ZXN0aW9uIj5Xb3VsZCB5b3UgbGlrZSB0byBzaHV0IGRvd24/PC9zdHJpbmc+CisKKyAgICA8IS0tIFJlY2VudCBUYXNrcyBkaWFsb2c6IHRpdGxlCisgICAgIFRPRE86IHRoaXMgc2hvdWxkIG1vdmUgdG8gU3lzdGVtVUkuYXBrLCBidXQgdGhlIGNvZGUgZm9yIHRoZSBvbGQgCisgICAgICAgICAgICByZWNlbnQgZGlhbG9nIGlzIHN0aWxsIGluIHRoZSBmcmFtZXdvcmsKKyAgICAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJyZWNlbnRfdGFza3NfdGl0bGUiPlJlY2VudDwvc3RyaW5nPgotICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogbWVzc2FnZSB3aGVuIHRoZXJlIGFyZSBubyByZWNlbnQgYXBwbGljYXRpb25zIC0tPgorICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogbWVzc2FnZSB3aGVuIHRoZXJlIGFyZSBubyByZWNlbnQgYXBwbGljYXRpb25zCisgICAgIFRPRE86IHRoaXMgc2hvdWxkIG1vdmUgdG8gU3lzdGVtVUkuYXBrLCBidXQgdGhlIGNvZGUgZm9yIHRoZSBvbGQgCisgICAgICAgICAgICByZWNlbnQgZGlhbG9nIGlzIHN0aWxsIGluIHRoZSBmcmFtZXdvcmsKKyAgICAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJub19yZWNlbnRfdGFza3MiPk5vIHJlY2VudCBhcHBsaWNhdGlvbnMuPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIG9mIHRoZSBHbG9iYWwgQWN0aW9ucyBEaWFsb2cgLS0+CkBAIC03OTUsOCArODA4LDggQEAKICAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDYWxlbmRhciI+YWRkIG9yIG1vZGlmeSBjYWxlbmRhciBldmVudHMgYW5kIHNlbmQgZW1haWwgdG8gZ3Vlc3RzPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNhbGVuZGFyIj5BbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gYWRkIG9yIGNoYW5nZSB0aGUgCi0gICAgICAgIGV2ZW50cyBvbiB5b3VyIGNhbGVuZGFyLCB3aGljaCBtYXkgc2VuZCBlbWFpbCB0byBndWVzdHMuIE1hbGljaW91cyBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIAorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDYWxlbmRhciI+QWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGFkZCBvciBjaGFuZ2UgdGhlCisgICAgICAgIGV2ZW50cyBvbiB5b3VyIGNhbGVuZGFyLCB3aGljaCBtYXkgc2VuZCBlbWFpbCB0byBndWVzdHMuIE1hbGljaW91cyBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzCiAgICAgICAgIHRvIGVyYXNlIG9yIG1vZGlmeSB5b3VyIGNhbGVuZGFyIGV2ZW50cyBvciB0byBzZW5kIGVtYWlsIHRvIGd1ZXN0cy48L3N0cmluZz4KIAogICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgpAQCAtMTI1MCwxNCArMTI2MywxNCBAQAogICAgIDwhLS0gVGl0bGUgb2YgcG9saWN5IGFjY2VzcyB0byBsaW1pdGluZyB0aGUgdXNlcidzIHBhc3N3b3JkIGNob2ljZXMgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCI+U2V0IHBhc3N3b3JkIHJ1bGVzPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBwb2xpY3kgYWNjZXNzIHRvIGxpbWl0aW5nIHRoZSB1c2VyJ3MgcGFzc3dvcmQgY2hvaWNlcyAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCI+Q29udHJvbCB0aGUgbGVuZ3RoIGFuZCB0aGUgY2hhcmFjdGVycyBhbGxvd2VkIGluCi0gICAgc2NyZWVuLXVubG9jayBwYXNzd29yZHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCI+Q29udHJvbCB0aGUgbGVuZ3RoIGFuZCB0aGUgY2hhcmFjdGVycyAKKyAgICBhbGxvd2VkIGluIHNjcmVlbi11bmxvY2sgcGFzc3dvcmRzPC9zdHJpbmc+CiAgICAgPCEtLSBUaXRsZSBvZiBwb2xpY3kgYWNjZXNzIHRvIHdhdGNoIHVzZXIgbG9naW4gYXR0ZW1wdHMgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiI+TW9uaXRvciBzY3JlZW4tdW5sb2NrIGF0dGVtcHRzPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBwb2xpY3kgYWNjZXNzIHRvIHdhdGNoIHVzZXIgbG9naW4gYXR0ZW1wdHMgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iPk1vbml0b3IgdGhlIG51bWJlciBvZiBpbmNvcnJlY3QgcGFzc3dvcmRzIGVudGVyZWQgd2hlbiB1bmxvY2tpbmcgCi0gICAgdGhlIHNjcmVlbiwgYW5kIGxvY2sgdGhlIHBob25lIG9yIGVyYXNlIGFsbCB0aGUgcGhvbmVcJ3MgZGF0YSBpZiB0b28gbWFueSBpbmNvcnJlY3QgcGFzc3dvcmRzIGFyZSBlbnRlcmVkCi0gICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iPk1vbml0b3IgdGhlIG51bWJlciBvZiBpbmNvcnJlY3QgcGFzc3dvcmRzIAorICAgIGVudGVyZWQgd2hlbiB1bmxvY2tpbmcgdGhlIHNjcmVlbiwgYW5kIGxvY2sgdGhlIHBob25lIG9yIGVyYXNlIGFsbCB0aGUgcGhvbmVcJ3MgCisgICAgZGF0YSBpZiB0b28gbWFueSBpbmNvcnJlY3QgcGFzc3dvcmRzIGFyZSBlbnRlcmVkPC9zdHJpbmc+CiAgICAgPCEtLSBUaXRsZSBvZiBwb2xpY3kgYWNjZXNzIHRvIHJlc2V0IHVzZXIncyBwYXNzd29yZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIj5DaGFuZ2UgdGhlIHNjcmVlbi11bmxvY2sgcGFzc3dvcmQ8L3N0cmluZz4KICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIHBvbGljeSBhY2Nlc3MgdG8gcmVzZXQgdXNlcidzIHBhc3N3b3JkIC0tPgpAQCAtMTI2OSw3ICsxMjgyLDEzIEBACiAgICAgPCEtLSBUaXRsZSBvZiBwb2xpY3kgYWNjZXNzIHRvIHdpcGUgdGhlIHVzZXIncyBkYXRhIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIj5FcmFzZSBhbGwgZGF0YTwvc3RyaW5nPgogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiPkVyYXNlIHRoZSBwaG9uZVwncyBkYXRhIHdpdGhvdXQgd2FybmluZywgYnkgcGVyZm9ybWluZyBhIGZhY3RvcnkgZGF0YSByZXNldDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSI+RXJhc2UgdGhlIHBob25lXCdzIGRhdGEgd2l0aG91dCB3YXJuaW5nLCAKKyAgICBieSBwZXJmb3JtaW5nIGEgZmFjdG9yeSBkYXRhIHJlc2V0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkiPlNldCB0aGUgZGV2aWNlIGdsb2JhbCBwcm94eTwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiPlNldCB0aGUgZGV2aWNlIGdsb2JhbCBwcm94eQorICAgICAgICB0byBiZSB1c2VkIHdoaWxlIHBvbGljeSBpcyBlbmFibGVkLiBPbmx5IHRoZSBmaXJzdCBkZXZpY2UgYWRtaW4KKyAgICAgICAgc2V0cyB0aGUgZWZmZWN0aXZlIGdsb2JhbCBwcm94eS48L3N0cmluZz4KIAogICAgIDwhLS0gVGhlIG9yZGVyIG9mIHRoZXNlIGlzIGltcG9ydGFudCwgZG9uJ3QgcmVvcmRlciB3aXRob3V0IGNoYW5naW5nIENvbnRhY3RzLmphdmEgLS0+IDxza2lwIC8+CiAgICAgPCEtLSBQaG9uZSBudW1iZXIgdHlwZXMgZnJvbSBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzLiBUaGlzIGNvdWxkIGJlIHVzZWQgd2hlbiBhZGRpbmcgYSBuZXcgcGhvbmUgbnVtYmVyIGZvciBhIGNvbnRhY3QsIGZvciBleGFtcGxlLiAtLT4KQEAgLTE0NDgsMjAgKzE0NjcsMTggQEAKICAgICA8IS0tIE90aGVyIFNJUCBhZGRyZXNzIHR5cGUgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZU90aGVyIj5PdGhlcjwvc3RyaW5nPgogCi0gICAgPCEtLSBBdHRidXRpb24gb2YgYSBjb250YWN0IHN0YXR1cyB1cGRhdGUsIHdoZW4gdGhlIHRpbWUgb2YgdXBkYXRlIGlzIHVua25vd24gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iPnZpYSA8eGxpZmY6ZyBpZD0ic291cmNlIiBleGFtcGxlPSJHb29nbGUgVGFsayI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KLQotICAgIDwhLS0gQXR0YnV0aW9uIG9mIGEgY29udGFjdCBzdGF0dXMgdXBkYXRlLCB3aGVuIHRoZSB0aW1lIG9mIHVwZGF0ZSBpcyBrbm93biAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiPjx4bGlmZjpnIGlkPSJkYXRlIiBleGFtcGxlPSIzIGhvdXJzIGFnbyI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJzb3VyY2UiIGV4YW1wbGU9Ikdvb2dsZSBUYWxrIj4lMiRzPC94bGlmZjpnPjwvc3RyaW5nPgotCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBTSU0gUElOIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSI+RW50ZXIgUElOIGNvZGU8L3N0cmluZz4KIAotICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciB0ZXh0IHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIj5FbnRlciBwYXNzd29yZCB0byB1bmxvY2s8L3N0cmluZz4KIAorICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSI+RW50ZXIgUElOIHRvIHVubG9jazwvc3RyaW5nPgorCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0aGF0IHRoZXkgZW50ZXJlZCB0aGUgd3JvbmcgcGluIHdoaWxlIHRyeWluZwogICAgICAgICAgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4gIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIj5JbmNvcnJlY3QgUElOIGNvZGUhPC9zdHJpbmc+CkBAIC0xNDk4LDYgKzE1MTUsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiPkNvcnJlY3QhPC9zdHJpbmc+CiAgICAgPCEtLSBPbiB0aGUgdW5sb2NrIHBhdHRlcm4gc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXR0ZXJuIGFuZCBtdXN0IHRyeSBhZ2Fpbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciPlNvcnJ5LCB0cnkgYWdhaW48L3N0cmluZz4KKyAgICA8IS0tIE9uIHRoZSB1bmxvY2sgcGFzc3dvcmQgc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXNzd29yZCBhbmQgbXVzdCB0cnkgYWdhaW4uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyI+U29ycnksIHRyeSBhZ2Fpbjwvc3RyaW5nPgogCiAgICAgPCEtLSBXaGVuIHRoZSBsb2NrIHNjcmVlbiBpcyBzaG93aW5nIGFuZCB0aGUgcGhvbmUgcGx1Z2dlZCBpbiwgYW5kIHRoZSBiYXR0ZXJ5CiAgICAgICAgICBpcyBub3QgZnVsbHkgY2hhcmdlZCwgc2hvdyB0aGUgY3VycmVudCBjaGFyZ2UgJS4gIC0tPgpAQCAtMTU0MSwxMiArMTU2MCwyNyBAQAogICAgICAgICAgcHJvZ3Jlc3MgZGlhbG9nIGluIHRoZSBtZWFudGltZS4gIHRoaXMgaXMgdGhlIGVtc3NhZ2UuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIj5VbmxvY2tpbmcgU0lNIGNhcmRcdTIwMjY8L3N0cmluZz4KIAotICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyAtLT4KKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGRyYXdpbmcgdGhlIHVubG9jayBwYXR0ZXJuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgogICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KICAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCiAgICAgPC9zdHJpbmc+CiAKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBwYXNzd29yZCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIj4KKyAgICAgICAgWW91IGhhdmUgaW5jb3JyZWN0bHkgZW50ZXJlZCB5b3VyIHBhc3N3b3JkIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBQSU4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgorICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBlbnRlcmVkIHlvdXIgUElOIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKICAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGlzIGFsbW9zdCBhdCB0aGUgbGltaXQKICAgICAgICAgIHdoZXJlIHRoZXkgd2lsbCBiZSBsb2NrZWQgb3V0IGFuZCBtYXkgaGF2ZSB0byBlbnRlciBhbiBhbHRlcm5hdGUgdXNlcm5hbWUvcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBwaG9uZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iPgpAQCAtMTYxNiw4ICsxNjUwLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9yZWJvb3QiPlJlYm9vdDwvc3RyaW5nPgogCiAgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHN0cmluZyAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj48eGxpZmY6ZyBpZD0ieCI+TW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkICVzKQotICAgICAgICBBcHBsZVdlYktpdC81MzMuMSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIE1vYmlsZSBTYWZhcmkvNTMzLjE8L3hsaWZmOmc+PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+TW96aWxsYS81LjAgKExpbnV4OyBVOyA8eGxpZmY6ZyBpZD0ieCI+QW5kcm9pZCAlczwveGxpZmY6Zz4pCisgICAgICAgIEFwcGxlV2ViS2l0LzUzNC4xMCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIDx4bGlmZjpnIGlkPSJtb2JpbGUiPiVzPC94bGlmZjpnPlNhZmFyaS81MzQuMTA8L3N0cmluZz4KKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgdGFyZ2V0ZWQgY29udGVudCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj4iTW9iaWxlICI8L3N0cmluZz4KIAogICAgIDwhLS0gVGl0bGUgZm9yIGEgSmF2YVNjcmlwdCBkaWFsb2cuICJUaGUgcGFnZSBhdCA8dXJsIG9mIGN1cnJlbnQgcGFnZT4gc2F5czoiIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX3RpdGxlIj5UaGUgcGFnZSBhdCBcJzx4bGlmZjpnIGlkPSJ0aXRsZSI+JXM8L3hsaWZmOmc+XCcgc2F5czo8L3N0cmluZz4KQEAgLTE2MzMsNiArMTY2OSw5IEBACiAgICAgPCEtLSBUb2FzdCBmb3IgZG91YmxlLXRhcCAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiPlRpcDogZG91YmxlLXRhcCB0byB6b29tIGluIGFuZCBvdXQuPC9zdHJpbmc+CiAKKyAgICA8IS0tIFRleHQgdG8gc2hvdyBpbiB0aGUgYXV0byBjb21wbGV0ZSBkcm9wIGRvd24gbGlzdCBvbiBhIHRleHQgdmlldyB3aGVuIHRoZSBicm93c2VyIGNhbiBhdXRvIGZpbGwgdGhlIGVudGlyZSBmb3JtIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfdGhpc19mb3JtIj5BdXRvRmlsbCB0aGlzIGZvcm08L3N0cmluZz4KKwogICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlcgogICAgICAgICB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyI+cmVhZCBCcm93c2VyXCdzIGhpc3RvcnkgYW5kIGJvb2ttYXJrczwvc3RyaW5nPgpAQCAtMTg4OSw5ICsxOTI4LDYgQEAKICAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCBhbGwgdGV4dCBpbiB0aGUgZWRpdCBmaWVsZC4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiPlNlbGVjdCBhbGw8L3N0cmluZz4KIAotICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgc2VsZWN0aW5nIHRleHQgaW4gdGhlIGVkaXQgZmllbGQuIFtDSEFSIExJTUlUPTIwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiPlNlbGVjdCB3b3JkPC9zdHJpbmc+Ci0KICAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiAgVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBjdXQgc2VsZWN0ZWQgdGhlIHRleHQgaW50byB0aGUgY2xpcGJvYXJkLiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiPkN1dDwvc3RyaW5nPgogCkBAIC0xOTA0LDE1ICsxOTQwLDE3IEBACiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBjb3B5IGEgVVJMIGZyb20gdGhlIGVkaXQgZmllbGQgaW50byB0aGUgY2xpcGJvYXJkLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiPkNvcHkgVVJMPC9zdHJpbmc+CiAKKyAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBBZGRlZCBvbmx5IHdoZW4gdGhlIGNvbnRleHQgbWVudSBpcyBub3QgZW1wdHksIGl0IGVuYWJsZSBzZWxlY3Rpb24gY29udGV4dCBtb2RlLiBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSI+U2VsZWN0IHRleHQuLi48L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCBzZWxlY3Rpb24gY29udGV4dHVhbCBtb2RlIHRpdGxlLCBkaXNwbGF5ZWQgaW4gdGhlIENBQi4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIj5UZXh0IHNlbGVjdGlvbjwvc3RyaW5nPgorCiAgICAgPCEtLSBFZGl0VGV4dCBjb250ZXh0IG1lbnUgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCI+SW5wdXQgbWV0aG9kPC9zdHJpbmc+CiAKLSAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LCB1c2VkIHRvIGFkZCBhIHdvcmQgdG8gdGhlCi0gICAgICAgICBpbnB1dCBtZXRob2QgZGljdGlvbmFyeS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiPiJBZGQgXCI8eGxpZmY6ZyBpZD0id29yZCIgZXhhbXBsZT0icmlja3JvbGwiPiVzPC94bGlmZjpnPlwiIHRvIGRpY3Rpb25hcnk8L3N0cmluZz4KLQotICAgIDwhLS0gVGl0bGUgZm9yIEVkaXRUZXh0IGNvbnRleHQgbWVudSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIj5FZGl0IHRleHQ8L3N0cmluZz4KKyAgICA8IS0tIFRpdGxlIGZvciBFZGl0VGV4dCBjb250ZXh0IG1lbnUgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiPlRleHQgYWN0aW9uczwvc3RyaW5nPgogCiAgICAgPCEtLSBJZiB0aGUgZGV2aWNlIGlzIGdldHRpbmcgbG93IG9uIGludGVybmFsIHN0b3JhZ2UsIGEgbm90aWZpY2F0aW9uIGlzIHNob3duIHRvIHRoZSB1c2VyLiAgVGhpcyBpcyB0aGUgdGl0bGUgb2YgdGhhdCBub3RpZmljYXRpb24uIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSI+TG93IG9uIHNwYWNlPC9zdHJpbmc+CkBAIC0xOTMxLDYgKzE5NjksOSBAQAogICAgICAgICAgY29tYmluZWQgd2l0aCBzZXRJY29uKGFuZHJvaWQuUi5kcmF3YWJsZS5pY19kaWFsb2dfYWxlcnQpIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIj5BdHRlbnRpb248L3N0cmluZz4KIAorICAgIDwhLS0gVGV4dCBzaG93biBieSBsaXN0IGZyYWdtZW50IHdoZW4gd2FpdGluZyBmb3IgZGF0YSB0byBkaXNwbGF5LiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciPkxvYWRpbmcuLi48L3N0cmluZz4KKwogICAgIDwhLS0gRGVmYXVsdCB0ZXh0IGZvciBhIGJ1dHRvbiB0aGF0IGNhbiBiZSB0b2dnbGVkIG9uIGFuZCBvZmYuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiI+T048L3N0cmluZz4KICAgICA8IS0tIERlZmF1bHQgdGV4dCBmb3IgYSBidXR0b24gdGhhdCBjYW4gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLiAtLT4KQEAgLTE5ODcsMjMgKzIwMjgsMjMgQEAKIAogICAgIDwhLS0gTm90aWZpY2F0aW9uIHRleHQgdG8gdGVsbCB0aGUgdXNlciB0aGF0IGEgaGVhdnktd2VpZ2h0IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiI+PHhsaWZmOmcgaWQ9ImFwcCI+JTEkczwveGxpZmY6Zz4gcnVubmluZzwvc3RyaW5nPgotICAgIAorCiAgICAgPCEtLSBOb3RpZmljYXRpb24gZGV0YWlscyB0byB0ZWxsIHRoZSB1c2VyIHRoYXQgYSBoZWF2eS13ZWlnaHQgYXBwbGljYXRpb24gaXMgcnVubmluZy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uX2RldGFpbCI+U2VsZWN0IHRvIHN3aXRjaCB0byBhcHBsaWNhdGlvbjwvc3RyaW5nPgotICAgIAorCiAgICAgPCEtLSBUaXRsZSBvZiBkaWFsb2cgcHJvbXB0aW5nIHdoZXRoZXIgdXNlciB3YW50cyB0byBzd2l0Y2ggYmV0d2VlbiBoZWF2eS13ZWlnaHQgYXBwcy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfc3dpdGNoZXJfdGl0bGUiPlN3aXRjaCBhcHBsaWNhdGlvbnM/PC9zdHJpbmc+Ci0gICAgCisKICAgICA8IS0tIERlc2NyaXB0aXZlIHRleHQgZm9yIHN3aXRjaGluZyB0byBhIG5ldyBoZWF2eS13ZWlnaHQgYXBwbGljYXRpb24uIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RleHQiPkFub3RoZXIgYXBwbGljYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nCiAgICAgdGhhdCBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIHlvdSBjYW4gc3RhcnQgYSBuZXcgb25lLjwvc3RyaW5nPgotICAgIAorCiAgICAgPHN0cmluZyBuYW1lPSJvbGRfYXBwX2FjdGlvbiI+UmV0dXJuIHRvIDx4bGlmZjpnIGlkPSJvbGRfYXBwIj4lMSRzPC94bGlmZjpnPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9kZXNjcmlwdGlvbiI+RG9uXCd0IHN0YXJ0IHRoZSBuZXcgYXBwbGljYXRpb24uPC9zdHJpbmc+Ci0gICAgCisKICAgICA8c3RyaW5nIG5hbWU9Im5ld19hcHBfYWN0aW9uIj5TdGFydCA8eGxpZmY6ZyBpZD0ib2xkX2FwcCI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5ld19hcHBfZGVzY3JpcHRpb24iPlN0b3AgdGhlIG9sZCBhcHBsaWNhdGlvbiB3aXRob3V0IHNhdmluZy48L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gRGlzcGxheWVkIGluIHRoZSB0aXRsZSBvZiB0aGUgY2hvb3NlciBmb3IgdGhpbmdzIHRvIGRvIHdpdGggdGV4dCB0aGF0CiAgICAgICAgICBpcyB0byBiZSBzZW50IHRvIGFub3RoZXIgYXBwbGljYXRpb24uIEZvciBleGFtcGxlLCBJIGNhbiBzZW5kCiAgICAgICAgICB0ZXh0IHRocm91Z2ggU01TIG9yIElNLiAgQSBkaWFsb2cgd2l0aCB0aG9zZSBjaG9pY2VzIHdvdWxkIGJlIHNob3duLApAQCAtMjMwNywxNyArMjM0OCwxMyBAQAogICAgIDwhLS0gTG9jYWxpemVkIHN0cmluZ3MgZm9yIFdlYlZpZXcgLS0+CiAgICAgPCEtLSBMYWJlbCBmb3IgYnV0dG9uIGluIGEgV2ViVmlldyB0aGF0IHdpbGwgb3BlbiBhIGNob29zZXIgdG8gY2hvb3NlIGEgZmlsZSB0byB1cGxvYWQgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSI+Q2hvb3NlIGZpbGU8L3N0cmluZz4KKyAgICA8IS0tIExhYmVsIGZvciB0aGUgZmlsZSB1cGxvYWQgY29udHJvbCB3aGVuIG5vIGZpbGUgaGFzIGJlZW4gY2hvc2VuIHlldCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIj5ObyBmaWxlIGNob3Nlbjwvc3RyaW5nPgogICAgIDwhLS0gTGFiZWwgZm9yIDxpbnB1dCB0eXBlPSJyZXNldCI+IGJ1dHRvbiBpbiBodG1sIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiPlJlc2V0PC9zdHJpbmc+CiAgICAgPCEtLSBMYWJlbCBmb3IgPGlucHV0IHR5cGU9InN1Ym1pdCI+IGJ1dHRvbiBpbiBodG1sIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0Ij5TdWJtaXQ8L3N0cmluZz4KIAotICAgIDwhLS0gU3RyaW5nIGRlc2NyaWJpbmcgdGhlIFN0YXIvRmF2b3JpdGUgY2hlY2tib3gKLQotICAgICAgICAgVXNlZCBieSBBY2Nlc3NpYmlsaXR5U2VydmljZSB0byBhbm5vdW5jZSB0aGUgcHVycG9zZSBvZiB0aGUgdmlldy4KLSAgICAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiPmZhdm9yaXRlPC9zdHJpbmc+Ci0KICAgICA8IS0tIFN0cmluZ3MgZm9yIGNhciBtb2RlIG5vdGlmaWNhdGlvbiAtLT4KICAgICA8IS0tIFNob3duIHdoZW4gY2FyIG1vZGUgaXMgZW5hYmxlZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIj5DYXIgbW9kZSBlbmFibGVkPC9zdHJpbmc+CkBAIC0yMzI4LDYgKzIzNjUsMTMgQEAKICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSI+VGV0aGVyaW5nIG9yIGhvdHNwb3QgYWN0aXZlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSI+VG91Y2ggdG8gY29uZmlndXJlPC9zdHJpbmc+CiAKKyAgICA8IS0tICBTdHJpbmdzIGZvciBwb3NzaWJsZSBQcmVmZXJlbmNlQWN0aXZpdHkgQmFjay9OZXh0IGJ1dHRvbnMgLS0+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCI+QmFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiPk5leHQ8L3N0cmluZz4KKworICAgIDwhLS0gT3B0aW9uYWwgYnV0dG9uIHRvIFNraXAgYSBQcmVmZXJlbmNlQWN0aXZpdHkgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiPlNraXA8L3N0cmluZz4KKwogICAgIDwhLS0gU3RyaW5ncyBmb3IgdGhyb3R0bGluZyBub3RpZmljYXRpb24gLS0+CiAgICAgPCEtLSBTaG93biB3aGVuIHRoZSB1c2VyIGlzIGluIGRhbmdlciBvZiBiZWluZyB0aHJvdHRsZWQgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSI+SGlnaCBtb2JpbGUgZGF0YSB1c2U8L3N0cmluZz4KQEAgLTIzMzcsNCArMjM4MSwyNSBAQAogICAgIDwhLS0gU2hvd24gd2hlbiB0aGUgdXNlcnMgYmFuZHdpZHRoIGlzIHJlZHVjZWQgYmVjYXVzZSBvZiBleGNlc3NpdmUgZGF0YSB1c2UgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIj5Nb2JpbGUgZGF0YSBsaW1pdCBleGNlZWRlZDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIj5Ub3VjaCB0byBsZWFybiBtb3JlIGFib3V0IG1vYmlsZSBkYXRhIHVzZTwvc3RyaW5nPgorCisgICAgPCEtLSBEaXNwbGF5ZWQgb24gdGhlIEZpbmQgZGlhbG9nIHdoZW4gdGhlcmUgYXJlIG5vIG1hdGNoZXMgW0NIQVIgTElNSVQ9Tk9ORV0tLT4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiPk5vIG1hdGNoZXM8L3N0cmluZz4KKworICAgIDwhLS0gRmluZCBkaWFsb2cgaGludCB0ZXh0LiAgQWxzbyB1c2VkIGluIHRoZSBtZW51IGl0ZW0gdG8gb3BlbiBmaW5kIG9uIHBhZ2UgW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiPkZpbmQgb24gcGFnZTwvc3RyaW5nPgorCisgICAgPCEtLSBEaXNwbGF5ZWQgb24gdGhlIEZpbmQgZGlhbG9nIHRvIGRpc3BsYXkgdGhlIGluZGV4IG9mIHRoZSBoaWdobGlnaHRlZAorICAgICAgICAgbWF0Y2ggYW5kIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kIGluIHRoZSBjdXJyZW50IHBhZ2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgICAgICA8IS0tIENhc2Ugb2Ygb25lIG1hdGNoIC0tPgorICAgICAgICA8aXRlbSBxdWFudGl0eT0ib25lIj4xIG1hdGNoPC9pdGVtPgorICAgICAgICA8IS0tIENhc2Ugb2YgbXVsdGlwbGUgdG90YWwgbWF0Y2hlcyAtLT4KKyAgICAgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIj48eGxpZmY6ZyBpZD0iaW5kZXgiIGV4YW1wbGU9IjIiPiVkPC94bGlmZjpnPiBvZiA8eGxpZmY6ZyBpZD0idG90YWwiIGV4YW1wbGU9IjEzNyI+JWQ8L3hsaWZmOmc+PC9pdGVtPgorICAgIDwvcGx1cmFscz4KKworICAgIDwhLS0gV2FybmluZyBtZXNzYWdlIGFib3V0IHNlY3VyaXR5IGltcGxpY2F0aW9ucyBvZiBlbmFibGluZyBhbiBpbnB1dCBtZXRob2QsIGRpc3BsYXllZCBhcyBhIGRpYWxvZyBtZXNzYWdlIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0byBlbmFibGUgYW4gSU1FLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImltZV9lbmFibGVyX3NlY3VyaXR5X3dhcm5pbmciPlRoaXMgaW5wdXQgbWV0aG9kIG1heSBiZSBhYmxlIHRvIGNvbGxlY3QgYWxsIHRoZSB0ZXh0IHlvdSB0eXBlLCBpbmNsdWRpbmcgcGVyc29uYWwgZGF0YSBsaWtlIHBhc3N3b3JkcyBhbmQgY3JlZGl0IGNhcmQgbnVtYmVycy4gSXQgY29tZXMgZnJvbSB0aGUgYXBwbGljYXRpb24gPHhsaWZmOmcgaWQ9ImltZV9hcHBsaWNhdGlvbl9uYW1lIj4lMSRzPC94bGlmZjpnPi4gVXNlIHRoaXMgaW5wdXQgbWV0aG9kPzwvc3RyaW5nPgorICAgIDwhLS0gTGFiZWwgZm9yIHNlbGVjdGluZyB0aGUgaW5wdXQgbWV0aG9kIHRvIHVzZSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImltZV9lbmFibGVyX3N1YnR5cGVfdGl0bGUiPlNlbGVjdCBpbnB1dG1ldGhvZHMgaW4gPHhsaWZmOmcgaWQ9ImltZV9hcHBsaWNhdGlvbl9uYW1lIj4lMSRzPC94bGlmZjpnPjwvc3RyaW5nPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAppbmRleCA1MmMwNDZkLi44ZjdhY2U5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC03NCw2ICs3NCwxNCBAQAogICAgICAgICA8aXRlbSBuYW1lPSJ3YWxscGFwZXJJbnRyYU9wZW5FeGl0QW5pbWF0aW9uIj5AYW5pbS93YWxscGFwZXJfaW50cmFfb3Blbl9leGl0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ3YWxscGFwZXJJbnRyYUNsb3NlRW50ZXJBbmltYXRpb24iPkBhbmltL3dhbGxwYXBlcl9pbnRyYV9jbG9zZV9lbnRlcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2FsbHBhcGVySW50cmFDbG9zZUV4aXRBbmltYXRpb24iPkBhbmltL3dhbGxwYXBlcl9pbnRyYV9jbG9zZV9leGl0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJmcmFnbWVudE9wZW5FbnRlckFuaW1hdGlvbiI+QGFuaW0vZnJhZ21lbnRfb3Blbl9lbnRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRPcGVuRXhpdEFuaW1hdGlvbiI+QGFuaW0vZnJhZ21lbnRfb3Blbl9leGl0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJmcmFnbWVudENsb3NlRW50ZXJBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X2Nsb3NlX2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJmcmFnbWVudENsb3NlRXhpdEFuaW1hdGlvbiI+QGFuaW0vZnJhZ21lbnRfY2xvc2VfZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnROZXh0RW50ZXJBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X25leHRfZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50TmV4dEV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X25leHRfZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRQcmV2RW50ZXJBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X3ByZXZfZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50UHJldkV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X3ByZXZfZXhpdDwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPCEtLSBTdGFuZGFyZCBhbmltYXRpb25zIGZvciBhIG5vbi1mdWxsLXNjcmVlbiB3aW5kb3cgb3IgYWN0aXZpdHkuIC0tPgpAQCAtODgsNiArOTYsMTMgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93RXhpdEFuaW1hdGlvbiI+QGFuaW0vc3RhdHVzX2Jhcl9leGl0PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKKyAgICA8IS0tIHtAaGlkZX0gLS0+CisgICAgPHN0eWxlIG5hbWU9IkFuaW1hdGlvbi5TdGF0dXNCYXIuSW50cnVkZXJBbGVydCIKKyAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uU3RhdHVzQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dFbnRlckFuaW1hdGlvbiI+QGFuaW0vcHJpb3JpdHlfYWxlcnRfZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RXhpdEFuaW1hdGlvbiI+QGFuaW0vcHJpb3JpdHlfYWxlcnRfZXhpdDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCiAgICAgPCEtLSBTdGFuZGFyZCBhbmltYXRpb25zIGZvciBhIHRyYW5zbHVjZW50IHdpbmRvdyBvciBhY3Rpdml0eS4gIFRoaXMKICAgICAgICAgIHN0eWxlIGlzIDxlbT5ub3Q8ZW0+IHVzZWQgYnkgZGVmYXVsdCBmb3IgdGhlIHRyYW5zbHVjZW50IHRoZW1lCiAgICAgICAgICAoc2luY2UgdHJhbnNsdWNlbnQgYWN0aXZpdGllcyBhcmUgYSBzcGVjaWFsIGNhc2UgdGhhdCBoYXZlIG5vCkBAIC0xOTEsOCArMjA2LDcgQEAKICAgICA8IS0tIFN0YXR1cyBCYXIgU3R5bGVzIC0tPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGlja2VyIj4KQEAgLTIwNSwxMiArMjE5LDExIEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+I2ZmNmI2YjZiPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LlRpdGxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTZzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8IS0tIFdpZGdldCBTdHlsZXMgLS0+CkBAIC0yMjEsNyArMjM0LDcgQEAKIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWJzTGlzdFZpZXciPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjcm9sbGJhcnMiPnZlcnRpY2FsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhZGluZ0VkZ2UiPnZlcnRpY2FsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhZGluZ0VkZ2UiPm5vbmU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuR2VzdHVyZU92ZXJsYXlWaWV3Ij4KQEAgLTI3NCwxMiArMjg3LDEyIEBACiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLkNoZWNrQm94Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2tfbGFiZWxfYmFja2dyb3VuZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVjazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPj9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvck11bHRpcGxlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlJhZGlvQnV0dG9uIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW9fbGFiZWxfYmFja2dyb3VuZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPj9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvclNpbmdsZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Db21wb3VuZEJ1dHRvbi5TdGFyIj4KQEAgLTQxMiw5ICs0MjUsOSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZSI+dHJ1ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmb2N1c2FibGVJblRvdWNoTW9kZSI+dHJ1ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPj9hbmRyb2lkOmF0dHIvZWRpdFRleHRCYWNrZ3JvdW5kPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvZWRpdFRleHRDb2xvcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfdmVydGljYWw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKQEAgLTQ0MCwxNCArNDUzLDggQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fZGVmYXVsdDwvaXRlbT4KICAgICA8L3N0eWxlPgogCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Zm9jdXNhYmxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZUluVG91Y2hNb2RlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNsaWNrYWJsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQ8L2l0ZW0+CisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyIgcGFyZW50PSJXaWRnZXQuRWRpdFRleHQiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbXBsZXRpb25IaW50VmlldyI+QGFuZHJvaWQ6bGF5b3V0L3NpbXBsZV9kcm9wZG93bl9oaW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfdmVydGljYWw8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29tcGxldGlvblRocmVzaG9sZCI+MjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blNlbGVjdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cG9wdXBCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9zcGlubmVyX2Ryb3Bkb3duX2JhY2tncm91bmQ8L2l0ZW0+CkBAIC00NTksNiArNDY2LDE4IEBACiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5TcGlubmVyIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fZHJvcGRvd248L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2xpY2thYmxlIj50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNwaW5uZXJNb2RlIj5kaWFsb2c8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blNlbGVjdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cG9wdXBCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9zcGlubmVyX2Ryb3Bkb3duX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25WZXJ0aWNhbE9mZnNldCI+LTEwZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCI+MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93bldpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cG9wdXBQcm9tcHRWaWV3Ij5AYW5kcm9pZDpsYXlvdXQvc2ltcGxlX2Ryb3Bkb3duX2hpbnQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuU3Bpbm5lci5Ecm9wRG93biI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3Bpbm5lck1vZGUiPmRyb3Bkb3duPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlRleHRWaWV3LlBvcHVwTWVudSI+CkBAIC00NzgsMTcgKzQ5NywxNyBAQAogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ecm9wRG93bkl0ZW0uU3Bpbm5lciI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2hlY2tNYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2hlY2tNYXJrIj4/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuU2Nyb2xsVmlldyI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2Nyb2xsYmFycyI+dmVydGljYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZmFkaW5nRWRnZSI+dmVydGljYWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZmFkaW5nRWRnZSI+bm9uZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib3Jpem9udGFsU2Nyb2xsVmlldyI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2Nyb2xsYmFycyI+aG9yaXpvbnRhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmYWRpbmdFZGdlIj5ob3Jpem9udGFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhZGluZ0VkZ2UiPm5vbmU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTGlzdFZpZXciIHBhcmVudD0iV2lkZ2V0LkFic0xpc3RWaWV3Ij4KQEAgLTQ5OCw3ICs1MTcsNyBAQAogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5MaXN0Vmlldy5XaGl0ZSIgcGFyZW50PSJXaWRnZXQuQWJzTGlzdFZpZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxpc3RTZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxpc3RTZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNhY2hlQ29sb3JIaW50Ij4/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZENhY2hlSGludDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyIj5AYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZTwvaXRlbT4KICAgICA8L3N0eWxlPiAgICAKQEAgLTUxMSw3ICs1MzAsNyBAQAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTGlzdFZpZXcuTWVudSI+CiAJCTxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2FjaGVDb2xvckhpbnQiPkBudWxsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjcm9sbGJhcnMiPnZlcnRpY2FsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhZGluZ0VkZ2UiPnZlcnRpY2FsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhZGluZ0VkZ2UiPm5vbmU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbWVudV9zZWxlY3RvcjwvaXRlbT4KICAgICAgICAgPCEtLSBMaWdodCBiYWNrZ3JvdW5kIGZvciB0aGUgbGlzdCBpbiBtZW51cywgc28gdGhlIGRpdmlkZXIgZm9yIGJyaWdodCB0aGVtZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGl2aWRlciI+QGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcms8L2l0ZW0+CkBAIC01NDQsNyArNTYzLDcgQEAKICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5HYWxsZXJ5Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmYWRpbmdFZGdlIj5ob3Jpem9udGFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhZGluZ0VkZ2UiPm5vbmU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyX3ZlcnRpY2FsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNwYWNpbmciPi0yMGRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp1bnNlbGVjdGVkQWxwaGEiPjAuODU8L2l0ZW0+CkBAIC01NTUsNiArNTc0LDExIEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cG9wdXBBbmltYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLlBvcHVwV2luZG93PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKKyAgICA8IS0tIERlZmF1bHQgc3R5bGUgZm9yIHtAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudEJyZWFkQ3J1bWJzfSB2aWV3LiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkZyYWdtZW50QnJlYWRDcnVtYnMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmciPjRkcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5LZXlib2FyZFZpZXciIHBhcmVudD0iYW5kcm9pZDpXaWRnZXQiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2tleWJvYXJkX2JhY2tncm91bmQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6a2V5QmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2tleWJvYXJkX2tleTwvaXRlbT4KQEAgLTU3Niw2ICs2MDAsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3F1aWNrY29udGFjdF9iYWRnZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRDZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19jb250YWN0X3BpY3R1cmU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwiPgpAQCAtNjE1LDkgKzY0MCw5IEBACiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4jRkZGRjkyMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPiM1QzVDRkY8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE2c3A8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KQEAgLTYyNSw3ICs2NTAsOCBAQAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5JbnZlcnNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPiMwMDAwRUU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5UaGVtZSI+CkBAIC02MzMsNDEgKzY1OSw0MCBAQAogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkRpYWxvZ1dpbmRvd1RpdGxlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTGFyZ2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4yMnNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5MYXJnZS5JbnZlcnNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpdW0iPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpdW0uSW52ZXJzZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU21hbGwiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclNlY29uZGFyeTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNtYWxsLkludmVyc2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclNlY29uZGFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuVGhlbWUuRGlhbG9nIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLlRoZW1lIj4KQEAgLTg3NCw0ICs4OTksODU5IEBACiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0VudGVyQW5pbWF0aW9uIj5AYW5kcm9pZDphbmltL2ZhZGVfaW48L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0V4aXRBbmltYXRpb24iPkBhbmRyb2lkOmFuaW0vZmFkZV9vdXQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGlzcGxheU9wdGlvbnMiPnVzZUxvZ288L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGl2aWRlciI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmhlaWdodCI+P2FuZHJvaWQ6YXR0ci9hY3Rpb25CYXJTaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij4zZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdUb3AiPjBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij4zZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdCb3R0b20iPjBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25CYXIuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3VidGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25CYXIuU3VidGl0bGU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uTW9kZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+P2FuZHJvaWQ6YXR0ci9hY3Rpb25Nb2RlQmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpoZWlnaHQiPj9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDppdGVtUGFkZGluZyI+P2FuZHJvaWQ6YXR0ci9hY3Rpb25CdXR0b25QYWRkaW5nPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uTW9kZS5UaXRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzdWJ0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbk1vZGUuU3VidGl0bGU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uQmFyLlRpdGxlIgorICAgICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGl1bS5JbnZlcnNlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25CYXIuU3VidGl0bGUiCisgICAgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU21hbGwuSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uTW9kZS5UaXRsZSIKKyAgICAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpdW0uSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uTW9kZS5TdWJ0aXRsZSIKKyAgICAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TbWFsbC5JbnZlcnNlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbi5PdmVyZmxvdyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfbWVudV9tb3JlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tb3JlX2l0ZW1fbGFiZWw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQnV0dG9uLkNsb3NlTW9kZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj4/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVDbG9zZURyYXdhYmxlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiVmlldyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGRyYXdhYmxlL21pbml0YWJfbHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0xlZnQiPjRkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij40ZGlwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiQmFyIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYlRleHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj5Ac3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlRleHRWaWV3LlBvcHVwTWVudTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTGlzdFBvcHVwV2luZG93Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blNlbGVjdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cG9wdXBCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9zcGlubmVyX2Ryb3Bkb3duX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25WZXJ0aWNhbE9mZnNldCI+LTEwZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCI+MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93bldpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+ICAgICAgICAKKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Qb3B1cE1lbnUiIHBhcmVudD0iV2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuUG9wdXBNZW51Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9saWdodDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5Qb3B1cE1lbnUuTGFyZ2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4yMnNwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlBvcHVwTWVudS5TbWFsbCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9saWdodDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBCZWdpbiBIb2xvIHRoZW1lIHN0eWxlcyAtLT4KKworICAgIDwhLS0gVGV4dCBTdHlsZXMgLS0+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8iIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5JbnZlcnNlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkludmVyc2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGFyZ2UiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuTGFyZ2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5NZWRpdW0iIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuTWVkaXVtIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uU21hbGwiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuU21hbGwiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MYXJnZS5JbnZlcnNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLk1lZGl1bS5JbnZlcnNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNtYWxsLkludmVyc2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uU2VhcmNoUmVzdWx0Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uU2VhcmNoUmVzdWx0LlRpdGxlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uU2VhcmNoUmVzdWx0LlN1YnRpdGxlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLldpZGdldCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5CdXR0b24iIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuSG9sby5TbWFsbC5JbnZlcnNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodF9ub2Rpc2FibGU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5JY29uTWVudS5JdGVtIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkhvbG8uU21hbGwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5UYWJXaWRnZXQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3IvdGFiX2luZGljYXRvcl90ZXh0PC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlRleHRWaWV3Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5RGlzYWJsZU9ubHk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5UZXh0Vmlldy5Qb3B1cE1lbnUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlEaXNhYmxlT25seTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkRyb3BEb3duSGludCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Ecm9wRG93bkl0ZW0iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0X2Rpc2FibGVfb25seTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlRleHRWaWV3LlNwaW5uZXJJdGVtIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodF9kaXNhYmxlX29ubHk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5FZGl0VGV4dCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2lkZ2V0X2VkaXR0ZXh0X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfaG9sb19saWdodDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlBvcHVwTWVudSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuUG9wdXBNZW51Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlBvcHVwTWVudS5MYXJnZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjIyc3A8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Qb3B1cE1lbnUuU21hbGwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uQmFyLlRpdGxlIgorICAgICAgICAgICBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkhvbG8uTWVkaXVtIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbkJhci5TdWJ0aXRsZSIKKyAgICAgICAgICAgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNtYWxsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbk1vZGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uTW9kZS5UaXRsZSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uTW9kZS5UaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5BY3Rpb25Nb2RlLlN1YnRpdGxlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25Nb2RlLlN1YnRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yU2Vjb25kYXJ5PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaW5kb3dUaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4jZmZmPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uRGlhbG9nV2luZG93VGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIExpZ2h0IHRleHQgc3R5bGVzIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkhvbG8iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5JbnZlcnNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LkxhcmdlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkxhcmdlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuTWVkaXVtIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLk1lZGl1bSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNtYWxsIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLlNtYWxsIj4KKyAgICA8L3N0eWxlPgorIAorICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuTGFyZ2UuSW52ZXJzZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5NZWRpdW0uSW52ZXJzZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5TbWFsbC5JbnZlcnNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNlYXJjaFJlc3VsdCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNlYXJjaFJlc3VsdCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNlYXJjaFJlc3VsdC5UaXRsZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNlYXJjaFJlc3VsdC5TdWJ0aXRsZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LldpZGdldCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5XaWRnZXQuQnV0dG9uIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuV2lkZ2V0LkVkaXRUZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBjb2xvci93aWRnZXRfZWRpdHRleHRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfaG9sb19kYXJrPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5XaWRnZXQuUG9wdXBNZW51IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlBvcHVwTWVudSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LldpZGdldC5Qb3B1cE1lbnUuTGFyZ2UiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuUG9wdXBNZW51LkxhcmdlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuV2lkZ2V0LlBvcHVwTWVudS5TbWFsbCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Qb3B1cE1lbnUuU21hbGwiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5XaWRnZXQuRHJvcERvd25IaW50IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkRyb3BEb3duSGludCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LldpZGdldC5BY3Rpb25Nb2RlLlRpdGxlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25Nb2RlLlRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuV2lkZ2V0LkFjdGlvbk1vZGUuU3VidGl0bGUiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbk1vZGUuU3VidGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5XaW5kb3dUaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4jZmZmPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuRGlhbG9nV2luZG93VGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIFdpZGdldCBTdHlsZXMgLS0+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8iIHBhcmVudD0iV2lkZ2V0Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkJ1dHRvbiIgcGFyZW50PSJXaWRnZXQuQnV0dG9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fZGVmYXVsdF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW08L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm1pbkhlaWdodCI+NDhkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0xlZnQiPjMyZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+MzJkaXA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5CdXR0b24uU21hbGwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9kZWZhdWx0X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiPjQwZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij4yNGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjI0ZGlwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQnV0dG9uLkluc2V0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idXR0b25faW5zZXQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5CdXR0b24uVG9nZ2xlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fdG9nZ2xlX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0T24iPkBhbmRyb2lkOnN0cmluZy9jYXBpdGFsX29uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRPZmYiPkBhbmRyb2lkOnN0cmluZy9jYXBpdGFsX29mZjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXNhYmxlZEFscGhhIj4/YW5kcm9pZDphdHRyL2Rpc2FibGVkQWxwaGE8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiPjQ4ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij4yNGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjI0ZGlwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uVGV4dFZpZXciIHBhcmVudD0iV2lkZ2V0LlRleHRWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlRleHRWaWV3Lkxpc3RTZXBhcmF0b3IiIHBhcmVudD0iV2lkZ2V0LlRleHRWaWV3Lkxpc3RTZXBhcmF0b3IiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VjdGlvbl9oZWFkZXJfaG9sb19kYXJrPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uVGV4dFNlbGVjdEhhbmRsZSIgcGFyZW50PSJXaWRnZXQuVGV4dFNlbGVjdEhhbmRsZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5BYnNMaXN0VmlldyIgcGFyZW50PSJXaWRnZXQuQWJzTGlzdFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQXV0b0NvbXBsZXRlVGV4dFZpZXciIHBhcmVudD0iV2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkNvbXBvdW5kQnV0dG9uLkNoZWNrQm94IiBwYXJlbnQ9IldpZGdldC5Db21wb3VuZEJ1dHRvbi5DaGVja0JveCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaXN0Vmlldy5Ecm9wRG93biI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5FZGl0VGV4dCIgcGFyZW50PSJXaWRnZXQuRWRpdFRleHQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uRXhwYW5kYWJsZUxpc3RWaWV3IiBwYXJlbnQ9IldpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uRXhwYW5kYWJsZUxpc3RWaWV3LldoaXRlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkdhbGxlcnkiIHBhcmVudD0iV2lkZ2V0LkdhbGxlcnkiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uR2VzdHVyZU92ZXJsYXlWaWV3IiBwYXJlbnQ9IldpZGdldC5HZXN0dXJlT3ZlcmxheVZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uR3JpZFZpZXciIHBhcmVudD0iV2lkZ2V0LkdyaWRWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkltYWdlQnV0dG9uIiBwYXJlbnQ9IldpZGdldC5JbWFnZUJ1dHRvbiI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5JbWFnZVdlbGwiIHBhcmVudD0iV2lkZ2V0LkltYWdlV2VsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaXN0VmlldyIgcGFyZW50PSJXaWRnZXQuTGlzdFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlzdFZpZXcuV2hpdGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUG9wdXBXaW5kb3ciIHBhcmVudD0iV2lkZ2V0LlBvcHVwV2luZG93Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlByb2dyZXNzQmFyIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0JhciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlByb2dyZXNzQmFyLlNtYWxsIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlByb2dyZXNzQmFyLlNtYWxsLlRpdGxlIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5UaXRsZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5MYXJnZSIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuSW52ZXJzZSIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2UiIHBhcmVudD0iV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uU2Vla0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6aW5kZXRlcm1pbmF0ZU9ubHkiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnByb2dyZXNzRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL3NjcnViYmVyX3Byb2dyZXNzX2hvcml6b250YWxfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmluZGV0ZXJtaW5hdGVEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvc2NydWJiZXJfcHJvZ3Jlc3NfaG9yaXpvbnRhbF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bWluSGVpZ2h0Ij4xNmRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDptYXhIZWlnaHQiPjE2ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRodW1iIj5AYW5kcm9pZDpkcmF3YWJsZS9zY3J1YmJlcl9jb250cm9sX2hvbG88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGh1bWJPZmZzZXQiPjE2ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlJhdGluZ0JhciIgcGFyZW50PSJXaWRnZXQuUmF0aW5nQmFyIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlJhdGluZ0Jhci5JbmRpY2F0b3IiIHBhcmVudD0iV2lkZ2V0LlJhdGluZ0Jhci5JbmRpY2F0b3IiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUmF0aW5nQmFyLlNtYWxsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkNvbXBvdW5kQnV0dG9uLlJhZGlvQnV0dG9uIiBwYXJlbnQ9IldpZGdldC5Db21wb3VuZEJ1dHRvbi5SYWRpb0J1dHRvbiI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5TY3JvbGxWaWV3IiBwYXJlbnQ9IldpZGdldC5TY3JvbGxWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkhvcml6b250YWxTY3JvbGxWaWV3IiBwYXJlbnQ9IldpZGdldC5Ib3Jpem9udGFsU2Nyb2xsVmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5TcGlubmVyIiBwYXJlbnQ9IldpZGdldC5TcGlubmVyLkRyb3BEb3duIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blNlbGVjdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL21lbnVfZHJvcGRvd25fcGFuZWxfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duVmVydGljYWxPZmZzZXQiPjBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0Ij4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duV2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cFByb21wdFZpZXciPkBhbmRyb2lkOmxheW91dC9zaW1wbGVfZHJvcGRvd25faGludDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlNwaW5uZXIuRHJvcERvd24iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQ29tcG91bmRCdXR0b24uU3RhciIgcGFyZW50PSJXaWRnZXQuQ29tcG91bmRCdXR0b24uU3RhciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5UYWJXaWRnZXQiIHBhcmVudD0iV2lkZ2V0LlRhYldpZGdldCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5XZWJUZXh0VmlldyIgcGFyZW50PSJXaWRnZXQuV2ViVGV4dFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uV2ViVmlldyIgcGFyZW50PSJXaWRnZXQuV2ViVmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Ecm9wRG93bkl0ZW0iIHBhcmVudD0iV2lkZ2V0LkRyb3BEb3duSXRlbSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Ecm9wRG93bkl0ZW0uU3Bpbm5lciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5UZXh0Vmlldy5TcGlubmVySXRlbSIgcGFyZW50PSJXaWRnZXQuVGV4dFZpZXcuU3Bpbm5lckl0ZW0iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uS2V5Ym9hcmRWaWV3IiBwYXJlbnQ9IldpZGdldC5LZXlib2FyZFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2UuV2luZG93U21hbGwiIHBhcmVudD0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd01lZGl1bSIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2UuV2luZG93TWVkaXVtIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd0xhcmdlIiBwYXJlbnQ9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dMYXJnZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd1NtYWxsIiBwYXJlbnQ9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd1NtYWxsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93TWVkaXVtIiBwYXJlbnQ9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd01lZGl1bSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd0xhcmdlIiBwYXJlbnQ9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd0xhcmdlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpc3RQb3B1cFdpbmRvdyIgcGFyZW50PSJXaWRnZXQuTGlzdFBvcHVwV2luZG93Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blNlbGVjdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL21lbnVfZHJvcGRvd25fcGFuZWxfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duVmVydGljYWxPZmZzZXQiPjBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0Ij4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duV2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlBvcHVwTWVudSIgcGFyZW50PSJXaWRnZXQuSG9sby5MaXN0UG9wdXBXaW5kb3ciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQnV0dG9uIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CdXR0b24iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQnV0dG9uLk92ZXJmbG93IiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3ciPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfaG9sb19kYXJrPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJWaWV3IiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYlZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJCYXIiIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiQmFyIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVGV4dCIgcGFyZW50PSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJUZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+QHN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTWVkaXVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uTW9kZSIgcGFyZW50PSJXaWRnZXQuQWN0aW9uTW9kZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvY2FiX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uTW9kZS5UaXRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzdWJ0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uTW9kZS5TdWJ0aXRsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGUiIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2NhYl9pY19jbG9zZV9ob2xvPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5BY3Rpb25CYXIuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3VidGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbkJhci5TdWJ0aXRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBMaWdodCB3aWRnZXQgc3R5bGVzIC0tPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbiIgcGFyZW50PSJXaWRnZXQuQnV0dG9uIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbi5TbWFsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5CdXR0b24uSW5zZXQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQnV0dG9uLlRvZ2dsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3RvZ2dsZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRPbiI+QGFuZHJvaWQ6c3RyaW5nL2NhcGl0YWxfb248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dE9mZiI+QGFuZHJvaWQ6c3RyaW5nL2NhcGl0YWxfb2ZmPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpc2FibGVkQWxwaGEiPj9hbmRyb2lkOmF0dHIvZGlzYWJsZWRBbHBoYTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm1pbkhlaWdodCI+NDhkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0xlZnQiPjI0ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+MjRkaXA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5UZXh0VmlldyIgcGFyZW50PSJXaWRnZXQuVGV4dFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvciIgcGFyZW50PSJXaWRnZXQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWN0aW9uX2hlYWRlcl9ob2xvX2xpZ2h0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuVGV4dFNlbGVjdEhhbmRsZSIgcGFyZW50PSJXaWRnZXQuVGV4dFNlbGVjdEhhbmRsZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BYnNMaXN0VmlldyIgcGFyZW50PSJXaWRnZXQuQWJzTGlzdFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQXV0b0NvbXBsZXRlVGV4dFZpZXciIHBhcmVudD0iV2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkNvbXBvdW5kQnV0dG9uLkNoZWNrQm94IiBwYXJlbnQ9IldpZGdldC5Db21wb3VuZEJ1dHRvbi5DaGVja0JveCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5MaXN0Vmlldy5Ecm9wRG93biI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5FZGl0VGV4dCIgcGFyZW50PSJXaWRnZXQuRWRpdFRleHQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuRXhwYW5kYWJsZUxpc3RWaWV3IiBwYXJlbnQ9IldpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuRXhwYW5kYWJsZUxpc3RWaWV3LldoaXRlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkdhbGxlcnkiIHBhcmVudD0iV2lkZ2V0LkdhbGxlcnkiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuR2VzdHVyZU92ZXJsYXlWaWV3IiBwYXJlbnQ9IldpZGdldC5HZXN0dXJlT3ZlcmxheVZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuR3JpZFZpZXciIHBhcmVudD0iV2lkZ2V0LkdyaWRWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkltYWdlQnV0dG9uIiBwYXJlbnQ9IldpZGdldC5JbWFnZUJ1dHRvbiI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5JbWFnZVdlbGwiIHBhcmVudD0iV2lkZ2V0LkltYWdlV2VsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5MaXN0VmlldyIgcGFyZW50PSJXaWRnZXQuTGlzdFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuTGlzdFZpZXcuV2hpdGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUG9wdXBXaW5kb3ciIHBhcmVudD0iV2lkZ2V0LlBvcHVwV2luZG93Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlByb2dyZXNzQmFyIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0JhciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlByb2dyZXNzQmFyLlNtYWxsIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5Qcm9ncmVzc0Jhci5TbWFsbC5UaXRsZSIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuVGl0bGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUHJvZ3Jlc3NCYXIuTGFyZ2UiIHBhcmVudD0iV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlByb2dyZXNzQmFyLkludmVyc2UiIHBhcmVudD0iV2lkZ2V0LlByb2dyZXNzQmFyLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZSIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlNlZWtCYXIiIHBhcmVudD0iV2lkZ2V0LkhvbG8uU2Vla0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cHJvZ3Jlc3NEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvc2NydWJiZXJfcHJvZ3Jlc3NfaG9yaXpvbnRhbF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmluZGV0ZXJtaW5hdGVEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvc2NydWJiZXJfcHJvZ3Jlc3NfaG9yaXpvbnRhbF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUmF0aW5nQmFyIiBwYXJlbnQ9IldpZGdldC5SYXRpbmdCYXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUmF0aW5nQmFyLkluZGljYXRvciIgcGFyZW50PSJXaWRnZXQuUmF0aW5nQmFyLkluZGljYXRvciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5SYXRpbmdCYXIuU21hbGwiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQ29tcG91bmRCdXR0b24uUmFkaW9CdXR0b24iIHBhcmVudD0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlJhZGlvQnV0dG9uIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlNjcm9sbFZpZXciIHBhcmVudD0iV2lkZ2V0LlNjcm9sbFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuSG9yaXpvbnRhbFNjcm9sbFZpZXciIHBhcmVudD0iV2lkZ2V0Lkhvcml6b250YWxTY3JvbGxWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlNwaW5uZXIiIHBhcmVudD0iV2lkZ2V0LlNwaW5uZXIuRHJvcERvd24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duU2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL21lbnVfZHJvcGRvd25fcGFuZWxfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blZlcnRpY2FsT2Zmc2V0Ij4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCI+MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93bldpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cG9wdXBQcm9tcHRWaWV3Ij5AYW5kcm9pZDpsYXlvdXQvc2ltcGxlX2Ryb3Bkb3duX2hpbnQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5TcGlubmVyLkRyb3BEb3duIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkNvbXBvdW5kQnV0dG9uLlN0YXIiIHBhcmVudD0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlN0YXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuVGFiV2lkZ2V0IiBwYXJlbnQ9IldpZGdldC5UYWJXaWRnZXQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuV2ViVGV4dFZpZXciIHBhcmVudD0iV2lkZ2V0LldlYlRleHRWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LldlYlZpZXciIHBhcmVudD0iV2lkZ2V0LldlYlZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuRHJvcERvd25JdGVtIiBwYXJlbnQ9IldpZGdldC5Ecm9wRG93bkl0ZW0iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuRHJvcERvd25JdGVtLlNwaW5uZXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuVGV4dFZpZXcuU3Bpbm5lckl0ZW0iIHBhcmVudD0iV2lkZ2V0LlRleHRWaWV3LlNwaW5uZXJJdGVtIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LktleWJvYXJkVmlldyIgcGFyZW50PSJXaWRnZXQuS2V5Ym9hcmRWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsIiBwYXJlbnQ9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dTbWFsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dNZWRpdW0iIHBhcmVudD0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd01lZGl1bSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dMYXJnZSIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2UuV2luZG93TGFyZ2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dTbWFsbCIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dTbWFsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd01lZGl1bSIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dNZWRpdW0iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dMYXJnZSIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dMYXJnZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5MaXN0UG9wdXBXaW5kb3ciIHBhcmVudD0iV2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25TZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBvcHVwQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvbWVudV9kcm9wZG93bl9wYW5lbF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duVmVydGljYWxPZmZzZXQiPjBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0Ij4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duV2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlBvcHVwTWVudSIgcGFyZW50PSJXaWRnZXQuSG9sby5MaWdodC5MaXN0UG9wdXBXaW5kb3ciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQnV0dG9uIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CdXR0b24iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQnV0dG9uLk92ZXJmbG93IiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3ciPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9tb3Jlb3ZlcmZsb3dfaG9sb19saWdodDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbkJhclZpZXdfVGFiVmlldyIgcGFyZW50PSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbkJhclZpZXdfVGFiQmFyIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYkJhciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CYXJWaWV3X1RhYlRleHQiIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiVGV4dCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25Nb2RlIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25Nb2RlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9jYWJfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uTW9kZS5UaXRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzdWJ0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uTW9kZS5TdWJ0aXRsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGUiIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQmFyIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5BY3Rpb25CYXIuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3VidGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbkJhci5TdWJ0aXRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBBbmltYXRpb24gU3R5bGVzIC0tPgorCisgICAgPHN0eWxlIG5hbWU9IkFuaW1hdGlvbi5Ib2xvIiBwYXJlbnQ9IkFuaW1hdGlvbiI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJBbmltYXRpb24uSG9sby5BY3Rpdml0eSIgcGFyZW50PSJBbmltYXRpb24uQWN0aXZpdHkiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQW5pbWF0aW9uLkhvbG8uRGlhbG9nIiBwYXJlbnQ9IkFuaW1hdGlvbi5EaWFsb2ciPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIERpYWxvZyBzdHlsZXMgLS0+CisKKyAgICA8c3R5bGUgbmFtZT0iQWxlcnREaWFsb2cuSG9sbyIgcGFyZW50PSJBbGVydERpYWxvZyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImZ1bGxEYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfZnVsbF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRvcERhcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2RpYWxvZ190b3BfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjZW50ZXJEYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfbWlkZGxlX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYm90dG9tRGFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX2JvdHRvbV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZ1bGxCcmlnaHQiPkBhbmRyb2lkOmRyYXdhYmxlL2RpYWxvZ19mdWxsX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idG9wQnJpZ2h0Ij5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfdG9wX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY2VudGVyQnJpZ2h0Ij5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfbWlkZGxlX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYm90dG9tQnJpZ2h0Ij5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfYm90dG9tX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYm90dG9tTWVkaXVtIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfYm90dG9tX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY2VudGVyTWVkaXVtIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfbWlkZGxlX2hvbG9fZGFyazwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkFsZXJ0RGlhbG9nLkhvbG8uTGlnaHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJmdWxsRGFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX2Z1bGxfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idG9wRGFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjZW50ZXJEYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImJvdHRvbURhcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2RpYWxvZ19ib3R0b21faG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnVsbEJyaWdodCI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX2Z1bGxfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idG9wQnJpZ2h0Ij5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImNlbnRlckJyaWdodCI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJib3R0b21CcmlnaHQiPkBhbmRyb2lkOmRyYXdhYmxlL2RpYWxvZ19ib3R0b21faG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYm90dG9tTWVkaXVtIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfYm90dG9tX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImNlbnRlck1lZGl1bSI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIFdpbmRvdyB0aXRsZSAtLT4KKyAgICA8c3R5bGUgbmFtZT0iV2luZG93VGl0bGVCYWNrZ3JvdW5kLkhvbG8iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3RpdGxlX2JhcjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpbmRvd1RpdGxlLkhvbG8iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNpbmdsZUxpbmUiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpbmRvd1RpdGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNoYWRvd0NvbG9yIj4jQkIwMDAwMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2hhZG93UmFkaXVzIj4yLjc1PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRGlhbG9nV2luZG93VGl0bGUuSG9sbyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bWF4TGluZXMiPjE8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2Nyb2xsSG9yaXpvbnRhbGx5Ij50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj5Ac3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5EaWFsb2dXaW5kb3dUaXRsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkRpYWxvZ1dpbmRvd1RpdGxlLkhvbG8uTGlnaHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm1heExpbmVzIj4xPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjcm9sbEhvcml6b250YWxseSI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+QHN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuRGlhbG9nV2luZG93VGl0bGU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKaW5kZXggMDQwZTczMi4uOGRhYTgwMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbApAQCAtNTMsNiArNTMsMTEgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlYXJjaFVybCI+QGFuZHJvaWQ6Y29sb3Ivc2VhcmNoX3VybF90ZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHQiPkBhbmRyb2lkOmNvbG9yL2hpZ2hsaWdodGVkX3RleHRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGluayI+QGFuZHJvaWQ6Y29sb3IvbGlua190ZXh0X2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmtJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodF9kaXNhYmxlX29ubHk8L2l0ZW0+CiAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuTGFyZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTWVkaXVtIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpdW08L2l0ZW0+CkBAIC02NSwxMSArNzAsMTcgQEAKICAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlQnV0dG9uIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuQnV0dG9uPC9pdGVtPgogICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQ8L2l0ZW0+CisgICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJjYW5kaWRhdGVzVGV4dFN0eWxlU3BhbnMiPkBhbmRyb2lkOnN0cmluZy9jYW5kaWRhdGVzX3N0eWxlPC9pdGVtPgogICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENoZWNrTWFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvaW5kaWNhdG9yX2NoZWNrX21hcmtfZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENoZWNrTWFya0ludmVyc2UiPkBhbmRyb2lkOmRyYXdhYmxlL2luZGljYXRvcl9jaGVja19tYXJrX2xpZ2h0PC9pdGVtPgogCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTGFyZ2VQb3B1cE1lbnUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5Qb3B1cE1lbnUuTGFyZ2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxQb3B1cE1lbnUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5Qb3B1cE1lbnUuU21hbGw8L2l0ZW0+CisKICAgICAgICAgPCEtLSBCdXR0b24gc3R5bGVzIC0tPgogICAgICAgICA8aXRlbSBuYW1lPSJidXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkJ1dHRvbjwvaXRlbT4KIApAQCAtODQsOSArOTUsMTUgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoUmVzdWx0TGlzdEl0ZW1IZWlnaHQiPjU4ZGlwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RGl2aWRlciI+QGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0U2VwYXJhdG9yVGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRleHRWaWV3Lkxpc3RTZXBhcmF0b3I8L2l0ZW0+ICAgCi0gICAgICAgIAotCQk8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW88L2l0ZW0+Ci0gICAgCTxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrPC9pdGVtPiAgICAKKworICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VCYWNrZ3JvdW5kSW5kaWNhdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQ8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmQ8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdERpdmlkZXJBbGVydERpYWxvZyI+QGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodDwvaXRlbT4KIAogICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1QYWRkaW5nTGVmdCI+NDBkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkQ2hpbGRQYWRkaW5nTGVmdCI+CkBAIC0xMTUsOSArMTMyLDEzIEBACiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaW5kb3dUaXRsZUJhY2tncm91bmQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5BY3Rpdml0eTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlIj5zdGF0ZVVuc3BlY2lmaWVkfGFkanVzdFVuc3BlY2lmaWVkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSI+ZmFsc2U8L2l0ZW0+CiAKICAgICAgICAgPCEtLSBEaWFsb2cgYXR0cmlidXRlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWxlcnREaWFsb2dTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQWxlcnREaWFsb2c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRpYWxvZ1RoZW1lIj5AYW5kcm9pZDpzdHlsZS9UaGVtZS5EaWFsb2c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFsZXJ0RGlhbG9nVGhlbWUiPkBhbmRyb2lkOnN0eWxlL1RoZW1lLkRpYWxvZy5BbGVydDwvaXRlbT4KICAgICAgICAgCiAgICAgICAgIDwhLS0gUGFuZWwgYXR0cmlidXRlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0icGFuZWxCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9tZW51X2JhY2tncm91bmQ8L2l0ZW0+CkBAIC0xNjQsOCArMTg1LDggQEAKICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsVGl0bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5UaXRsZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuSW52ZXJzZTwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+Ci0JICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPiAKKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzZWVrQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TZWVrQmFyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJyYXRpbmdCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlJhdGluZ0JhcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGVJbmRpY2F0b3IiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5SYXRpbmdCYXIuSW5kaWNhdG9yPC9pdGVtPgpAQCAtMTc0LDYgKzE5NSw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNjcm9sbFZpZXc8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imhvcml6b250YWxTY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib3Jpem9udGFsU2Nyb2xsVmlldzwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic3Bpbm5lclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TcGlubmVyLkRyb3BEb3duPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzdGFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Db21wb3VuZEJ1dHRvbi5TdGFyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0YWJXaWRnZXRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRhYldpZGdldDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRleHRWaWV3PC9pdGVtPgpAQCAtMTkwLDYgKzIxMiw4IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd1NtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dTbWFsbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TWVkaXVtIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dNZWRpdW08L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd0xhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dMYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFBvcHVwV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5MaXN0UG9wdXBXaW5kb3c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBvcHVwTWVudVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUG9wdXBNZW51PC9pdGVtPgogICAgICAgICAKICAgICAgICAgPCEtLSBQcmVmZXJlbmNlIHN0eWxlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZVNjcmVlblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW48L2l0ZW0+CkBAIC0yMDUsNiArMjI5LDIxIEBACiAKICAgICAgICAgPCEtLSBTZWFyY2ggd2lkZ2V0IHN0eWxlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoV2lkZ2V0Q29ycHVzSXRlbUJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3NlYXJjaF93aWRnZXRfY29ycHVzX2l0ZW1fYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8IS0tIEFjdGlvbiBiYXIgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lci5Ecm9wRG93bjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5BY3Rpb25CdXR0b248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciPjEyZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiPkBzdHlsZS9XaWRnZXQuQWN0aW9uQmFyVmlld19UYWJWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSI+QHN0eWxlL1dpZGdldC5BY3Rpb25CYXJWaWV3X1RhYkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiVGV4dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbk1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDbG9zZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQWN0aW9uQmFyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJTaXplIj41MGRpcDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIAogICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgZGVmYXVsdCAoZGFyaykgdGhlbWUgd2l0aCBubyB0aXRsZSBiYXIgLS0+CkBAIC0yMjgsNyArMjY3LDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckZvcmVncm91bmQiPkBjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JGb3JlZ3JvdW5kSW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZTwvaXRlbT4KLQorICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnkiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JUZXJ0aWFyeSI+QGFuZHJvaWQ6Y29sb3IvdGVydGlhcnlfdGV4dF9saWdodDwvaXRlbT4KQEAgLTI0Miw4ICsyODEsMTcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeUludmVyc2VOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX25vZGlzYWJsZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfZGFya19ub2Rpc2FibGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnQiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2Rhcms8L2l0ZW0+ICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0Ij5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmsiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGlua0ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9kYXJrPC9pdGVtPgogICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgorCiAgICAgICAgIDxpdGVtIG5hbWU9InBvcHVwV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qb3B1cFdpbmRvdzwvaXRlbT4KICAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2luZGljYXRvcl9jaGVja19tYXJrX2xpZ2h0PC9pdGVtPgpAQCAtMjU0LDEzICszMDIsMTMgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0Lkxpc3RWaWV3LldoaXRlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RGl2aWRlciI+QGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvci5XaGl0ZTwvaXRlbT4KLSAgICAgICAgCisKICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXI8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbDwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlPC9pdGVtPiAKKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0JhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGxpZ2h0IHRoZW1lIHdpdGggbm8gdGl0bGUgYmFyIC0tPgpAQCAtNDIzLDEzICs0NzEsMjUgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlNtYWxsLkludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAorICAgIDwhLS0gVmFyaWF0aW9uIG9mIFRoZW1lLkRpYWxvZyB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSBmcmFtZSAob3IgYmFja2dyb3VuZCkuCisgICAgICAgICBUaGUgdmlldyBoaWVyYXJjaHkgb2YgdGhlIGRpYWxvZyBpcyByZXNwb25zaWJsZSBmb3IgZHJhd2luZyBhbGwgb2YKKyAgICAgICAgIGl0cyBwaXhlbHMuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5EaWFsb2cuTm9GcmFtZSI+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0JhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0ZyYW1lIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kRGltRW5hYmxlZCI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93SXNUcmFuc2x1Y2VudCI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKICAgICA8IS0tIERlZmF1bHQgdGhlbWUgZm9yIGFsZXJ0IGRpYWxvZyB3aW5kb3dzLCB3aGljaCBpcyB1c2VkIGJ5IHRoZQogICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nfSBjbGFzcy4gIFRoaXMgaXMgYmFzaWNhbGx5IGEgZGlhbG9nCiAgICAgICAgICBidXQgc2V0cyB0aGUgYmFja2dyb3VuZCB0byBlbXB0eSBzbyBpdCBjYW4gZG8gdHdvLXRvbmUgYmFja2dyb3VuZHMuIC0tPgogICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5EaWFsb2cuQWxlcnQiPgogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvRGlhbG9nV2luZG93VGl0bGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0lzRmxvYXRpbmciPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIApAQCAtNTM1LDUgKzU5NSw1ODkgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLlRvYXN0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmREaW1FbmFibGVkIj5mYWxzZTwvaXRlbT4KICAgICA8L3N0eWxlPgorCisgICAgPCEtLSBEZWZhdWx0IHRoZW1lIHdpdGggYW4gQWN0aW9uIEJhci4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLldpdGhBY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbkJhciI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBObyB0aXRsZSBiYXIsIGJ1dCBBY3Rpb24gTW9kZSBiYXJzIHdpbGwgb3ZlcmxheSBhcHBsaWNhdGlvbiBjb250ZW50CisgICAgICAgICBpbnN0ZWFkIG9mIHB1c2hpbmcgaXQgZG93biB0byBtYWtlIHJvb20uIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5Ob1RpdGxlQmFyLk92ZXJsYXlBY3Rpb25Nb2RlcyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uTW9kZU92ZXJsYXkiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KICAgICAKKyAgICA8IS0tIE5ldyBIb25leWNvbWIgaG9sb2dyYXBoaWMgdGhlbWUuIERhcmsgdmVyc2lvbi4gIFRoZSB3aWRnZXRzIGluIHRoZQorICAgICAgICAgaG9sb2dyYXBoaWMgdGhlbWUgYXJlIHRyYW5zbHVjZW50IG9uIHRoZWlyIGJyYWNrZ3JvdW5kLCBzbyBhcHBsaWNhdGlvbnMKKyAgICAgICAgIG11c3QgZW5zdXJlIHRoYXQgYW55IGJhY2tncm91bmQgdGhleSB1c2Ugd2l0aCB0aGlzIHRoZW1lIGlzIGl0c2VsZgorICAgICAgICAgZGFyazsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGRpZmZpY3VsdCB0byBzZWUgdGhlIHdpZGdldHMuICBUaGUgbmV3CisgICAgICAgICBVSSBzdHlsZSBhbHNvIGluY2x1ZGVzIGEgZnVsbCBhY3Rpb24gYmFyIGJ5IGRlZmF1bHQuCisKKyAgICAgICAgIFN0eWxlcyB1c2VkIGJ5IHRoZSBIb2xvIHRoZW1lIGFyZSBuYW1lZCB1c2luZyB0aGUgY29udmVudGlvbiBUeXBlLkhvbG8uRXRjLgorICAgICAgICAgKEZvciBleGFtcGxlLCBXaWRnZXQuSG9sby5CdXR0b24sIFRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlBvcHVwTWVudS5MYXJnZS4pCisgICAgICAgICBTcGVjaWZpYyByZXNvdXJjZXMgdXNlZCBieSBIb2xvIGFyZSBuYW1lZCB1c2luZyB0aGUgY29udmVudGlvbiBAdHlwZS9mb29fYmFyX2Jhel9ob2xvCisgICAgICAgICB3aXRoIHRyYWlsaW5nIF9kYXJrIG9yIF9saWdodCBzcGVjaWZpZXJzIGlmIHRoZXkgYXJlIG5vdCBzaGFyZWQgYmV0d2VlbiBib3RoIGxpZ2h0IGFuZAorICAgICAgICAgZGFyayB2ZXJzaW9ucyBvZiB0aGUgdGhlbWUuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5Ib2xvIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JGb3JlZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImNvbG9yRm9yZWdyb3VuZEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2ludmVyc2VfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckJhY2tncm91bmRDYWNoZUhpbnQiPj9hbmRyb2lkOmF0dHIvY29sb3JCYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkaXNhYmxlZEFscGhhIj4wLjU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImJhY2tncm91bmREaW1BbW91bnQiPjAuNjwvaXRlbT4KKworICAgICAgICA8IS0tIFRleHQgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkludmVyc2U8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2Vjb25kYXJ5Ij5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclRlcnRpYXJ5Ij5AYW5kcm9pZDpjb2xvci90ZXJ0aWFyeV90ZXh0X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeUludmVyc2UiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JUZXJ0aWFyeUludmVyc2UiPkBhbmRyb2lkOmNvbG9yL3RlcnRpYXJ5X3RleHRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeURpc2FibGVPbmx5Ij5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfZGlzYWJsZV9vbmx5X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeUludmVyc2VEaXNhYmxlT25seSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2Rpc2FibGVfb25seV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JQcmltYXJ5Tm9EaXNhYmxlIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2Vjb25kYXJ5Tm9EaXNhYmxlIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlTm9EaXNhYmxlIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWFyY2hVcmwiPkBhbmRyb2lkOmNvbG9yL3NlYXJjaF91cmxfdGV4dF9ob2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHQiPkBhbmRyb2lkOmNvbG9yL2hpZ2hsaWdodGVkX3RleHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmsiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmtJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yQWxlcnREaWFsb2dMaXN0SXRlbSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2hvbG9fZGFyazwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxhcmdlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZU1lZGl1bSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5NZWRpdW08L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uU21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxhcmdlLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5NZWRpdW0uSW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uU21hbGwuSW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VTZWFyY2hSZXN1bHRUaXRsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5TZWFyY2hSZXN1bHQuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU2VhcmNoUmVzdWx0U3VidGl0bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uU2VhcmNoUmVzdWx0LlN1YnRpdGxlPC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VCdXR0b24iPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkJ1dHRvbjwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0iY2FuZGlkYXRlc1RleHRTdHlsZVNwYW5zIj5AYW5kcm9pZDpzdHJpbmcvY2FuZGlkYXRlc19zdHlsZTwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2luZGljYXRvcl9jaGVja19tYXJrX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmtJbnZlcnNlIj5AYW5kcm9pZDpkcmF3YWJsZS9pbmRpY2F0b3JfY2hlY2tfbWFya19saWdodDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlUG9wdXBNZW51Ij5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Qb3B1cE1lbnUuTGFyZ2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxQb3B1cE1lbnUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlBvcHVwTWVudS5TbWFsbDwvaXRlbT4KKworICAgICAgICA8IS0tIEJ1dHRvbiBzdHlsZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9ImJ1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5CdXR0b248L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iYnV0dG9uU3R5bGVTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQnV0dG9uLlNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJidXR0b25TdHlsZUluc2V0Ij5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5CdXR0b24uSW5zZXQ8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iYnV0dG9uU3R5bGVUb2dnbGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkJ1dHRvbi5Ub2dnbGU8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBMaXN0IGF0dHJpYnV0ZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0Ij42NGRpcDwvaXRlbT4KKyAgICAgICAgPCEtLSBAaGlkZSAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoUmVzdWx0TGlzdEl0ZW1IZWlnaHQiPjU4ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RGl2aWRlciI+QGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5UZXh0Vmlldy5MaXN0U2VwYXJhdG9yPC9pdGVtPiAgIAorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyazwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9ob2xvX2Rhcms8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9hY3RpdmF0ZWRfaG9sb19kYXJrPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3REaXZpZGVyQWxlcnREaWFsb2ciPkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2Rhcms8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtUGFkZGluZ0xlZnQiPjQwZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZENoaWxkUGFkZGluZ0xlZnQiPgorICAgICAgICAgICAgICAgID9hbmRyb2lkOmF0dHIvZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtUGFkZGluZ0xlZnQ8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtSW5kaWNhdG9yTGVmdCI+M2RpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtSW5kaWNhdG9yUmlnaHQiPjMzZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZENoaWxkSW5kaWNhdG9yTGVmdCI+CisgICAgICAgICAgICAgICAgP2FuZHJvaWQ6YXR0ci9leHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1JbmRpY2F0b3JMZWZ0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZENoaWxkSW5kaWNhdG9yUmlnaHQiPgorICAgICAgICAgICAgICAgID9hbmRyb2lkOmF0dHIvZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtSW5kaWNhdG9yUmlnaHQ8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBHYWxsZXJ5IGF0dHJpYnV0ZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9ImdhbGxlcnlJdGVtQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZ2FsbGVyeV9pdGVtX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIAorICAgICAgICA8IS0tIFdpbmRvdyBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9zY3JlZW5fYmFja2dyb3VuZF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0ZyYW1lIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Tm9UaXRsZSI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0Z1bGxzY3JlZW4iPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dJc0Zsb2F0aW5nIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dTaG93V2FsbHBhcGVyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2luZG93VGl0bGUuSG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTaXplIj4yNWRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpbmRvd1RpdGxlQmFja2dyb3VuZC5Ib2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uSG9sby5BY3Rpdml0eTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlIj5zdGF0ZVVuc3BlY2lmaWVkfGFkanVzdFVuc3BlY2lmaWVkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5Ij5mYWxzZTwvaXRlbT4KKworICAgICAgICA8IS0tIERpYWxvZyBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhbGVydERpYWxvZ1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbGVydERpYWxvZy5Ib2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkaWFsb2dUaGVtZSI+QGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sby5EaWFsb2c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFsZXJ0RGlhbG9nVGhlbWUiPkBhbmRyb2lkOnN0eWxlL1RoZW1lLkhvbG8uRGlhbG9nLkFsZXJ0PC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPCEtLSBQYW5lbCBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJwYW5lbEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL21lbnVfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icGFuZWxGdWxsQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoPC9pdGVtPgorICAgICAgICA8IS0tIFRoZXNlIHRocmVlIGF0dHJpYnV0ZXMgZG8gbm90IHNlZW1zIHRvIGJlIHVzZWQgYnkgdGhlIGZyYW1ld29yay4gRGVjbGFyZWQgcHVibGljIHRob3VnaCAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icGFuZWxDb2xvckJhY2tncm91bmQiPiMwMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBhbmVsQ29sb3JGb3JlZ3JvdW5kIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBhbmVsVGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2U8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBTY3JvbGxiYXIgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyRmFkZUR1cmF0aW9uIj4yNTA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbGJhckRlZmF1bHREZWxheUJlZm9yZUZhZGUiPjMwMDwvaXRlbT4gCisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbGJhclNpemUiPjEwZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxiYXJUaHVtYkhvcml6b250YWwiPkBhbmRyb2lkOmRyYXdhYmxlL3Njcm9sbGJhcl9oYW5kbGVfaG9yaXpvbnRhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyVGh1bWJWZXJ0aWNhbCI+QGFuZHJvaWQ6ZHJhd2FibGUvc2Nyb2xsYmFyX2hhbmRsZV92ZXJ0aWNhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyVHJhY2tIb3Jpem9udGFsIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyVHJhY2tWZXJ0aWNhbCI+QG51bGw8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBUZXh0IHNlbGVjdGlvbiBoYW5kbGUgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFNlbGVjdEhhbmRsZUxlZnQiPkBhbmRyb2lkOmRyYXdhYmxlL3RleHRfc2VsZWN0X2hhbmRsZV9taWRkbGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRTZWxlY3RIYW5kbGVSaWdodCI+QGFuZHJvaWQ6ZHJhd2FibGUvdGV4dF9zZWxlY3RfaGFuZGxlX21pZGRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFNlbGVjdEhhbmRsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvdGV4dF9zZWxlY3RfaGFuZGxlX21pZGRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFNlbGVjdEhhbmRsZVdpbmRvd1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5UZXh0U2VsZWN0SGFuZGxlPC9pdGVtPgorCisgICAgICAgIDwhLS0gV2lkZ2V0IHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWJzTGlzdFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQWJzTGlzdFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImF1dG9Db21wbGV0ZVRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkF1dG9Db21wbGV0ZVRleHRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjaGVja2JveFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Db21wb3VuZEJ1dHRvbi5DaGVja0JveDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcERvd25MaXN0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5MaXN0Vmlldy5Ecm9wRG93bjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uRWRpdFRleHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5FeHBhbmRhYmxlTGlzdFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0Vmlld1doaXRlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkV4cGFuZGFibGVMaXN0Vmlldy5XaGl0ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZ2FsbGVyeVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5HYWxsZXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlT3ZlcmxheVZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uR2VzdHVyZU92ZXJsYXlWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJncmlkVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5HcmlkVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iaW1hZ2VCdXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uSW1hZ2VCdXR0b248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImltYWdlV2VsbFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5JbWFnZVdlbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpc3RWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Vmlld1doaXRlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpc3RWaWV3LldoaXRlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwb3B1cFdpbmRvd1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qb3B1cFdpbmRvdzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLlNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxUaXRsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuU21hbGwuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzZWVrQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlNlZWtCYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5SYXRpbmdCYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlSW5kaWNhdG9yIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5SYXRpbmdCYXIuSW5kaWNhdG9yPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJyYXRpbmdCYXJTdHlsZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5SYXRpbmdCYXIuU21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJhZGlvQnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkNvbXBvdW5kQnV0dG9uLlJhZGlvQnV0dG9uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlNjcm9sbFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imhvcml6b250YWxTY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkhvcml6b250YWxTY3JvbGxWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzcGlubmVyU3R5bGUiPj9hbmRyb2lkOmF0dHIvZHJvcERvd25TcGlubmVyU3R5bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5TcGlubmVyLkRyb3BEb3duPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzdGFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkNvbXBvdW5kQnV0dG9uLlN0YXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRhYldpZGdldFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5UYWJXaWRnZXQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlRleHRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3ZWJUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5XZWJUZXh0VmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2ViVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5XZWJWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkcm9wRG93bkl0ZW1TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uRHJvcERvd25JdGVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzcGlubmVyRHJvcERvd25JdGVtU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkRyb3BEb3duSXRlbS5TcGlubmVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzcGlubmVySXRlbVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5UZXh0Vmlldy5TcGlubmVySXRlbTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcERvd25IaW50QXBwZWFyYW5jZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuRHJvcERvd25IaW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJrZXlib2FyZFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uS2V5Ym9hcmRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlV2luZG93U21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlV2luZG93TWVkaXVtIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dNZWRpdW08L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVXaW5kb3dMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2UuV2luZG93TGFyZ2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd1NtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd1NtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dNZWRpdW0iPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93TWVkaXVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dMYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFBvcHVwV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpc3RQb3B1cFdpbmRvdzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icG9wdXBNZW51U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlBvcHVwTWVudTwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDwhLS0gUHJlZmVyZW5jZSBzdHlsZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VTY3JlZW5TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcmVmZXJlbmNlQ2F0ZWdvcnlTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5DYXRlZ29yeTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcmVmZXJlbmNlSW5mb3JtYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5JbmZvcm1hdGlvbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY2hlY2tCb3hQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuQ2hlY2tCb3hQcmVmZXJlbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ5ZXNOb1ByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlLlllc05vUHJlZmVyZW5jZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZGlhbG9nUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0UHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UuRWRpdFRleHRQcmVmZXJlbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJyaW5ndG9uZVByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5SaW5ndG9uZVByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VMYXlvdXRDaGlsZCI+QGFuZHJvaWQ6bGF5b3V0L3ByZWZlcmVuY2VfY2hpbGQ8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBTZWFyY2ggd2lkZ2V0IHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoV2lkZ2V0Q29ycHVzSXRlbUJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3NlYXJjaF93aWRnZXRfY29ycHVzX2l0ZW1fYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8IS0tIEFjdGlvbiBiYXIgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5TcGlubmVyLkRyb3BEb3duPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQWN0aW9uQnV0dG9uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25PdmVyZmxvd0J1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CdXR0b24uT3ZlcmZsb3c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciPjEyZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvY2FiX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2NhYl9pY19jbG9zZV9ob2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJTdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXJWaWV3X1RhYkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJUZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25Nb2RlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclNpemUiPjUwZGlwPC9pdGVtPgorCisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gTmV3IEhvbmV5Y29tYiBob2xvZ3JhcGhpYyB0aGVtZS4gTGlnaHQgdmVyc2lvbi4gIFRoZSB3aWRnZXRzIGluIHRoZQorICAgICAgICAgaG9sb2dyYXBoaWMgdGhlbWUgYXJlIHRyYW5zbHVjZW50IG9uIHRoZWlyIGJyYWNrZ3JvdW5kLCBzbyBhcHBsaWNhdGlvbnMKKyAgICAgICAgIG11c3QgZW5zdXJlIHRoYXQgYW55IGJhY2tncm91bmQgdGhleSB1c2Ugd2l0aCB0aGlzIHRoZW1lIGlzIGl0c2VsZgorICAgICAgICAgbGlnaHQ7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSBkaWZmaWN1bHQgdG8gc2VlIHRoZSB3aWRnZXRzLiAgVGhlIG5ldworICAgICAgICAgVUkgc3R5bGUgYWxzbyBpbmNsdWRlcyBhIGZ1bGwgYWN0aW9uIGJhciBieSBkZWZhdWx0LiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5MaWdodCIgcGFyZW50PSJUaGVtZS5MaWdodCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImNvbG9yRm9yZWdyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JGb3JlZ3JvdW5kSW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfaW52ZXJzZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50Ij4/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZGlzYWJsZWRBbHBoYSI+MC41PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJiYWNrZ3JvdW5kRGltQW1vdW50Ij4wLjY8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBUZXh0IHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5JbnZlcnNlPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnkiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnkiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclRlcnRpYXJ5Ij5AYW5kcm9pZDpjb2xvci90ZXJ0aWFyeV90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnlJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclRlcnRpYXJ5SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvdGVydGlhcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnlEaXNhYmxlT25seSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2Rpc2FibGVfb25seV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZURpc2FibGVPbmx5Ij5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfZGlzYWJsZV9vbmx5X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnlOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlY29uZGFyeUludmVyc2VOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnQiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2VhcmNoVXJsIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfdXJsX3RleHRfaG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0Ij5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpZ2hsaWdodGVkX3RleHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JMaW5rIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGlua0ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5MYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VNZWRpdW0iPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuTWVkaXVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5MYXJnZS5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuTWVkaXVtLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU2VhcmNoUmVzdWx0VGl0bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuU2VhcmNoUmVzdWx0LlRpdGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNlYXJjaFJlc3VsdFN1YnRpdGxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNlYXJjaFJlc3VsdC5TdWJ0aXRsZTwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlQnV0dG9uIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LldpZGdldC5CdXR0b248L2l0ZW0+CisgICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJjYW5kaWRhdGVzVGV4dFN0eWxlU3BhbnMiPkBhbmRyb2lkOnN0cmluZy9jYW5kaWRhdGVzX3N0eWxlPC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENoZWNrTWFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvaW5kaWNhdG9yX2NoZWNrX21hcmtfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmtJbnZlcnNlIj5AYW5kcm9pZDpkcmF3YWJsZS9pbmRpY2F0b3JfY2hlY2tfbWFya19kYXJrPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTGFyZ2VQb3B1cE1lbnUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuV2lkZ2V0LlBvcHVwTWVudS5MYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VTbWFsbFBvcHVwTWVudSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5XaWRnZXQuUG9wdXBNZW51LlNtYWxsPC9pdGVtPgorCisgICAgICAgIDwhLS0gQnV0dG9uIHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbjwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJidXR0b25TdHlsZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5MaWdodC5CdXR0b24uU21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImJ1dHRvblN0eWxlSW5zZXQiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbi5JbnNldDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJidXR0b25TdHlsZVRvZ2dsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uTGlnaHQuQnV0dG9uLlRvZ2dsZTwvaXRlbT4KKworICAgICAgICA8IS0tIExpc3QgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPjY0ZGlwPC9pdGVtPgorICAgICAgICA8IS0tIEBoaWRlIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCI+NThkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3REaXZpZGVyIj5AZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5MaWdodC5UZXh0Vmlldy5MaXN0U2VwYXJhdG9yPC9pdGVtPiAgIAorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVja19ob2xvX2xpZ2h0PC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VCYWNrZ3JvdW5kSW5kaWNhdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2hvbG9fbGlnaHQ8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9hY3RpdmF0ZWRfaG9sb19saWdodDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1QYWRkaW5nTGVmdCI+NDBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkQ2hpbGRQYWRkaW5nTGVmdCI+CisgICAgICAgICAgICAgICAgP2FuZHJvaWQ6YXR0ci9leHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1QYWRkaW5nTGVmdDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1JbmRpY2F0b3JMZWZ0Ij4zZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1JbmRpY2F0b3JSaWdodCI+MzNkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkQ2hpbGRJbmRpY2F0b3JMZWZ0Ij4KKyAgICAgICAgICAgICAgICA/YW5kcm9pZDphdHRyL2V4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvckxlZnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkQ2hpbGRJbmRpY2F0b3JSaWdodCI+CisgICAgICAgICAgICAgICAgP2FuZHJvaWQ6YXR0ci9leHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1JbmRpY2F0b3JSaWdodDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RGl2aWRlckFsZXJ0RGlhbG9nIj5AYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19saWdodDwvaXRlbT4KKworICAgICAgICA8IS0tIEdhbGxlcnkgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZ2FsbGVyeUl0ZW1CYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9nYWxsZXJ5X2l0ZW1fYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDwhLS0gV2luZG93IGF0dHJpYnV0ZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0JhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3NjcmVlbl9iYWNrZ3JvdW5kX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0ZyYW1lIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Tm9UaXRsZSI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0Z1bGxzY3JlZW4iPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dJc0Zsb2F0aW5nIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dTaG93V2FsbHBhcGVyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2luZG93VGl0bGUuSG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTaXplIj4yNWRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpbmRvd1RpdGxlQmFja2dyb3VuZC5Ib2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uSG9sby5BY3Rpdml0eTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlIj5zdGF0ZVVuc3BlY2lmaWVkfGFkanVzdFVuc3BlY2lmaWVkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5Ij5mYWxzZTwvaXRlbT4KKworICAgICAgICA8IS0tIERpYWxvZyBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhbGVydERpYWxvZ1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbGVydERpYWxvZy5Ib2xvLkxpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkaWFsb2dUaGVtZSI+QGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sby5MaWdodC5EaWFsb2c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFsZXJ0RGlhbG9nVGhlbWUiPkBhbmRyb2lkOnN0eWxlL1RoZW1lLkhvbG8uTGlnaHQuRGlhbG9nLkFsZXJ0PC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPCEtLSBQYW5lbCBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJwYW5lbEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL21lbnVfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icGFuZWxGdWxsQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoPC9pdGVtPgorICAgICAgICA8IS0tIFRoZXNlIHRocmVlIGF0dHJpYnV0ZXMgZG8gbm90IHNlZW1zIHRvIGJlIHVzZWQgYnkgdGhlIGZyYW1ld29yay4gRGVjbGFyZWQgcHVibGljIHRob3VnaCAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icGFuZWxDb2xvckJhY2tncm91bmQiPiMwMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBhbmVsQ29sb3JGb3JlZ3JvdW5kIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBhbmVsVGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2U8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBTY3JvbGxiYXIgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyRmFkZUR1cmF0aW9uIj4yNTA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbGJhckRlZmF1bHREZWxheUJlZm9yZUZhZGUiPjMwMDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyU2l6ZSI+MTBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbGJhclRodW1iSG9yaXpvbnRhbCI+QGFuZHJvaWQ6ZHJhd2FibGUvc2Nyb2xsYmFyX2hhbmRsZV9ob3Jpem9udGFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxiYXJUaHVtYlZlcnRpY2FsIj5AYW5kcm9pZDpkcmF3YWJsZS9zY3JvbGxiYXJfaGFuZGxlX3ZlcnRpY2FsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxiYXJUcmFja0hvcml6b250YWwiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxiYXJUcmFja1ZlcnRpY2FsIj5AbnVsbDwvaXRlbT4KKworICAgICAgICA8IS0tIFRleHQgc2VsZWN0aW9uIGhhbmRsZSBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0U2VsZWN0SGFuZGxlTGVmdCI+QGFuZHJvaWQ6ZHJhd2FibGUvdGV4dF9zZWxlY3RfaGFuZGxlX21pZGRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFNlbGVjdEhhbmRsZVJpZ2h0Ij5AYW5kcm9pZDpkcmF3YWJsZS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0U2VsZWN0SGFuZGxlIj5AYW5kcm9pZDpkcmF3YWJsZS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0U2VsZWN0SGFuZGxlV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlRleHRTZWxlY3RIYW5kbGU8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBXaWRnZXQgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhYnNMaXN0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BYnNMaXN0VmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYXV0b0NvbXBsZXRlVGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQXV0b0NvbXBsZXRlVGV4dFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImNoZWNrYm94U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkNvbXBvdW5kQnV0dG9uLkNoZWNrQm94PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkcm9wRG93bkxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpc3RWaWV3LkRyb3BEb3duPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5FZGl0VGV4dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkV4cGFuZGFibGVMaXN0VmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RWaWV3V2hpdGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uRXhwYW5kYWJsZUxpc3RWaWV3LldoaXRlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnYWxsZXJ5U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkdhbGxlcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVPdmVybGF5Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5HZXN0dXJlT3ZlcmxheVZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImdyaWRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkdyaWRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJpbWFnZUJ1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5JbWFnZUJ1dHRvbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iaW1hZ2VXZWxsU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkltYWdlV2VsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uTGlzdFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RWaWV3V2hpdGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uTGlzdFZpZXcuV2hpdGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBvcHVwV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlBvcHVwV2luZG93PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0JhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUhvcml6b250YWwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLkhvcml6b250YWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuU21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbFRpdGxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5TbWFsbC5UaXRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5MYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNlZWtCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uU2Vla0JhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlJhdGluZ0JhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGVJbmRpY2F0b3IiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlJhdGluZ0Jhci5JbmRpY2F0b3I8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlJhdGluZ0Jhci5TbWFsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icmFkaW9CdXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQ29tcG91bmRCdXR0b24uUmFkaW9CdXR0b248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uU2Nyb2xsVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uSG9yaXpvbnRhbFNjcm9sbFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNwaW5uZXJTdHlsZSI+P2FuZHJvaWQ6YXR0ci9kcm9wRG93blNwaW5uZXJTdHlsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InN0YXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQ29tcG91bmRCdXR0b24uU3RhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGFiV2lkZ2V0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlRhYldpZGdldDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uVGV4dFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndlYlRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLldlYlRleHRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3ZWJWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLldlYlZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3BEb3duSXRlbVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Ecm9wRG93bkl0ZW08L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNwaW5uZXJEcm9wRG93bkl0ZW1TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uRHJvcERvd25JdGVtLlNwaW5uZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNwaW5uZXJJdGVtU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlRleHRWaWV3LlNwaW5uZXJJdGVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkcm9wRG93bkhpbnRBcHBlYXJhbmNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Ecm9wRG93bkhpbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImtleWJvYXJkVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5LZXlib2FyZFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVXaW5kb3dTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2UuV2luZG93U21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVXaW5kb3dNZWRpdW0iPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd01lZGl1bTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVdpbmRvd0xhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dMYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93U21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93U21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd01lZGl1bSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dNZWRpdW08L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd0xhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd0xhcmdlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0UG9wdXBXaW5kb3dTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uTGlnaHQuTGlzdFBvcHVwV2luZG93PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwb3B1cE1lbnVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uTGlnaHQuUG9wdXBNZW51PC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPCEtLSBQcmVmZXJlbmNlIHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZVNjcmVlblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW48L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VDYXRlZ29yeVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkNhdGVnb3J5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VJbmZvcm1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkluZm9ybWF0aW9uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjaGVja0JveFByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5DaGVja0JveFByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Inllc05vUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UuWWVzTm9QcmVmZXJlbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkaWFsb2dQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZS5FZGl0VGV4dFByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJpbmd0b25lUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLlJpbmd0b25lUHJlZmVyZW5jZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZUxheW91dENoaWxkIj5AYW5kcm9pZDpsYXlvdXQvcHJlZmVyZW5jZV9jaGlsZDwvaXRlbT4KKworICAgICAgICA8IS0tIFNlYXJjaCB3aWRnZXQgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hXaWRnZXRDb3JwdXNJdGVtQmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3Ivc2VhcmNoX3dpZGdldF9jb3JwdXNfaXRlbV9iYWNrZ3JvdW5kPC9pdGVtPgorCisgICAgICAgIDwhLS0gQWN0aW9uIGJhciBzdHlsZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CdXR0b248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJ1dHRvbi5PdmVyZmxvdzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyI+MTJkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9jYWJfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2NhYl9pY19jbG9zZV9ob2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJTdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXJWaWV3X1RhYkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJUZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5MaWdodC5BY3Rpb25Nb2RlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclNpemUiPjUwZGlwPC9pdGVtPgorCisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gRGV2ZWxvcG1lbnQgbGVnYWN5IG5hbWU7IGlmIHlvdSdyZSB1c2luZyB0aGlzLCBzd2l0Y2guIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvIiBwYXJlbnQ9IlRoZW1lLkhvbG8uTGlnaHQiPgorICAgIDwvc3R5bGU+CisgICAgCisgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBob2xvZ3JhcGhpYyAoZGFyaykgdGhlbWUgd2l0aCBubyBhY3Rpb24gYmFyLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5Ob0FjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgCisgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBob2xvZ3JhcGhpYyAoZGFyaykgdGhlbWUgdGhhdCBoYXMgbm8gdGl0bGUgYmFyIGFuZCBmaWxscworICAgICAgICAgdGhlIGVudGlyZSBzY3JlZW4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RnVsbHNjcmVlbiI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgbGlnaHQgdGhlbWUgd2l0aCBubyBhY3Rpb24gYmFyIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvLk5vQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgbGlnaHQgdGhlbWUgdGhhdCBoYXMgbm8gdGl0bGUgYmFyIGFuZCBmaWxscworICAgICAgICAgdGhlIGVudGlyZSBzY3JlZW4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RnVsbHNjcmVlbiI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAKKyAgICA8IS0tIERpYWxvZyB0aGVtZXMgZm9yIEhvbG8gLS0+CisKKyAgICA8IS0tIEhvbG8gdGhlbWUgZm9yIGRpYWxvZyB3aW5kb3dzIGFuZCBhY3Rpdml0aWVzLCB3aGljaCBpcyB1c2VkIGJ5IHRoZQorICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLkRpYWxvZ30gY2xhc3MuICBUaGlzIGNoYW5nZXMgdGhlIHdpbmRvdyB0byBiZQorICAgICAgICAgZmxvYXRpbmcgKG5vdCBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuKSwgYW5kIHB1dHMgYSBmcmFtZSBhcm91bmQgaXRzCisgICAgICAgICBjb250ZW50cy4gIFlvdSBjYW4gc2V0IHRoaXMgdGhlbWUgb24gYW4gYWN0aXZpdHkgaWYgeW91IHdvdWxkIGxpa2UgdG8KKyAgICAgICAgIG1ha2UgYW4gYWN0aXZpdHkgdGhhdCBsb29rcyBsaWtlIGEgRGlhbG9nLgorICAgICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCBEaWFsb2cgdGhlbWUgZm9yIGFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgSG9uZXljb21iCisgICAgICAgICBvciBuZXdlci4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uRGlhbG9nIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dGcmFtZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvRGlhbG9nV2luZG93VGl0bGUuSG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfZnVsbF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93SXNGbG9hdGluZyI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5Ib2xvLkRpYWxvZzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlIj5zdGF0ZVVuc3BlY2lmaWVkfGFkanVzdFBhbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPmZhbHNlPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50Ij5AbnVsbDwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uSW52ZXJzZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBWYXJpYXRpb24gb2YgVGhlbWUuSG9sby5EaWFsb2cgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGEgZnJhbWUgKG9yIGJhY2tncm91bmQpLgorICAgICAgICAgVGhlIHZpZXcgaGllcmFyY2h5IG9mIHRoZSBkaWFsb2cgaXMgcmVzcG9uc2libGUgZm9yIGRyYXdpbmcgYWxsIG9mCisgICAgICAgICBpdHMgcGl4ZWxzLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5EaWFsb2cuTm9GcmFtZSI+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0JhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0ZyYW1lIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kRGltRW5hYmxlZCI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93SXNUcmFuc2x1Y2VudCI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIEhvbG8gdGhlbWUgZm9yIGFsZXJ0IGRpYWxvZyB3aW5kb3dzLCB3aGljaCBpcyB1c2VkIGJ5IHRoZQorICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nfSBjbGFzcy4gIFRoaXMgaXMgYmFzaWNhbGx5IGEgZGlhbG9nCisgICAgICAgICBidXQgc2V0cyB0aGUgYmFja2dyb3VuZCB0byBlbXB0eSBzbyBpdCBjYW4gZG8gdHdvLXRvbmUgYmFja2dyb3VuZHMuCisgICAgICAgICBGb3IgYXBwbGljYXRpb25zIHRhcmdldGluZyBIb25leWNvbWIgb3IgbmV3ZXIsIHRoaXMgaXMgdGhlIGRlZmF1bHQKKyAgICAgICAgIEFsZXJ0RGlhbG9nIHRoZW1lLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5EaWFsb2cuQWxlcnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvRGlhbG9nV2luZG93VGl0bGUuSG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIExpZ2h0IGhvbG8gZGlhbG9nIHRoZW1lcyAtLT4KKworICAgIDwhLS0gSG9sbyBsaWdodCB0aGVtZSBmb3IgZGlhbG9nIHdpbmRvd3MgYW5kIGFjdGl2aXRpZXMsIHdoaWNoIGlzIHVzZWQgYnkgdGhlCisgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuRGlhbG9nfSBjbGFzcy4gIFRoaXMgY2hhbmdlcyB0aGUgd2luZG93IHRvIGJlCisgICAgICAgICBmbG9hdGluZyAobm90IGZpbGwgdGhlIGVudGlyZSBzY3JlZW4pLCBhbmQgcHV0cyBhIGZyYW1lIGFyb3VuZCBpdHMKKyAgICAgICAgIGNvbnRlbnRzLiAgWW91IGNhbiBzZXQgdGhpcyB0aGVtZSBvbiBhbiBhY3Rpdml0eSBpZiB5b3Ugd291bGQgbGlrZSB0bworICAgICAgICAgbWFrZSBhbiBhY3Rpdml0eSB0aGF0IGxvb2tzIGxpa2UgYSBEaWFsb2cuCisgICAgICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IERpYWxvZyB0aGVtZSBmb3IgYXBwbGljYXRpb25zIHRhcmdldGluZyBIb25leWNvbWIKKyAgICAgICAgIG9yIG5ld2VyLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5MaWdodC5EaWFsb2ciPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0ZyYW1lIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dUaXRsZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9EaWFsb2dXaW5kb3dUaXRsZS5Ib2xvLkxpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0JhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2RpYWxvZ19mdWxsX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93SXNGbG9hdGluZyI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5Ib2xvLkRpYWxvZzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlIj5zdGF0ZVVuc3BlY2lmaWVkfGFkanVzdFBhbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPmZhbHNlPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50Ij5AbnVsbDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LkludmVyc2U8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gSG9sbyBsaWdodCB0aGVtZSBmb3IgYWxlcnQgZGlhbG9nIHdpbmRvd3MsIHdoaWNoIGlzIHVzZWQgYnkgdGhlCisgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2d9IGNsYXNzLiAgVGhpcyBpcyBiYXNpY2FsbHkgYSBkaWFsb2cKKyAgICAgICAgIGJ1dCBzZXRzIHRoZSBiYWNrZ3JvdW5kIHRvIGVtcHR5IHNvIGl0IGNhbiBkbyB0d28tdG9uZSBiYWNrZ3JvdW5kcy4KKyAgICAgICAgIEZvciBhcHBsaWNhdGlvbnMgdGFyZ2V0aW5nIEhvbmV5Y29tYiBvciBuZXdlciwgdGhpcyBpcyB0aGUgZGVmYXVsdAorICAgICAgICAgQWxlcnREaWFsb2cgdGhlbWUuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5Ib2xvLkxpZ2h0LkRpYWxvZy5BbGVydCI+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0JhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dUaXRsZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9EaWFsb2dXaW5kb3dUaXRsZS5Ib2xvLkxpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKaW5kZXggNzAwYzUyNy4uZmQ4YmQ0OSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKaW5kZXggMWUzN2I2Yy4uOWZmNmZkNyAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3c+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKaW5kZXggYmFlMWI0Mi4uODJhN2M3NSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKaW5kZXggNjEyZGY5Yy4uOWZmZjNjYyAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3c+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhMzUwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbApAQCAtMCwwICsxLDEwMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPEtleWJvYXJkIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgorICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgorICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCisgICAgPgorCisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIxIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIzIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iNCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI2Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iNyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjgiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI5Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJyIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ1Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im8iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYSIgYW5kcm9pZDpob3Jpem9udGFsR2FwPSI1JXAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJkIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImciLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJoIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImsiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJsIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTEiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9zaGlmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6aXNNb2RpZmllcj0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfc2hpZnQiCisgICAgICAgICAgICBhbmRyb2lkOmlzU3RpY2t5PSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InoiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ4Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJiIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im0iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItNSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2RlbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3cgYW5kcm9pZDprZXlib2FyZE1vZGU9IkAraWQvbW9kZV9ub3JtYWwiIGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJib3R0b20iPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii0yIiBhbmRyb2lkOmtleUxhYmVsPSJAc3RyaW5nL3Bhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiwiIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLSIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIzMiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX3NwYWNlIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19zcGFjZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI9IiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ii4iCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfb2siCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworPC9LZXlib2FyZD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWU5ZGI4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKQEAgLTAsMCArMSwxMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxLZXlib2FyZCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKKyAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKKyAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgorICAgID4KKworICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iXEAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iXCMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIkIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iJSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiZhbXA7Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ii0iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIrIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IikiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJxIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InciLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJlIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iciIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ5Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJvIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImEiIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iNSVwIgorICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJzIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJnIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImoiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJrIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii0xIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfc2hpZnQiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIxNSVwIiBhbmRyb2lkOmlzTW9kaWZpZXI9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX3NoaWZ0IgorICAgICAgICAgICAgYW5kcm9pZDppc1N0aWNreT0idHJ1ZSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ6Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ2Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im4iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJtIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTUiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9kZWxldGUiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIxNSVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aXNSZXBlYXRhYmxlPSJ0cnVlIi8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93IGFuZHJvaWQ6a2V5Ym9hcmRNb2RlPSJAK2lkL21vZGVfbm9ybWFsIiBhbmRyb2lkOnJvd0VkZ2VGbGFncz0iYm90dG9tIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItMiIgYW5kcm9pZDprZXlMYWJlbD0iQHN0cmluZy9wYXNzd29yZF9rZXlib2FyZF9sYWJlbF9zeW1ib2xfa2V5IgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMjAlcCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIsIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Il8iIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMzIiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9zcGFjZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfc3BhY2UiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKyIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIuIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfb2siCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworPC9LZXlib2FyZD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfZXh0ZW5zaW9uLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX2V4dGVuc2lvbi54bWwKaW5kZXggMjhiN2VmZS4uZjNmYTU3YiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfZXh0ZW5zaW9uLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9leHRlbnNpb24ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfbnVtZXJpYy54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9udW1lcmljLnhtbAppbmRleCBlM2YxNjEyLi4yMjcwYjhhIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9udW1lcmljLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9udW1lcmljLnhtbApAQCAtMTksMzUgKzE5LDQxIEBACiAtLT4KIDxLZXlib2FyZCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMzMuMzMlcCIKLSAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjJweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9udW1lcmljIgogICAgID4KIAotICAgIDxSb3c+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNDkiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0xIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNDkiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0xIgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0yIi8+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTEiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0zIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTEiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0zIgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgogICAgIDwvUm93PgogCiAgICAgPFJvdz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTQiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTIiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW00IgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTMiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW01Ii8+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTQiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW02Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTQiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW02IgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgogICAgIDwvUm93PgogCiAgICAgPFJvdz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTciIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTUiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW03IgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTYiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW04Ii8+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTciIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW05Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTciIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW05IgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgogICAgIDwvUm93PgogCiAgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0iYm90dG9tIj4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9vayIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjQ4IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMF9ub19wbHVzIi8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTUiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9kZWxldGUiCi0gICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aXNSZXBlYXRhYmxlPSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZSIKKyAgICAgICAgICAgICBhbmRyb2lkOmlzUmVwZWF0YWJsZT0idHJ1ZSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKIDwvS2V5Ym9hcmQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9wb3B1cF90ZW1wbGF0ZS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9wb3B1cF90ZW1wbGF0ZS54bWwKaW5kZXggNWRkZmQzZS4uOWI4NTNlMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcG9wdXBfdGVtcGxhdGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3BvcHVwX3RlbXBsYXRlLnhtbApAQCAtMjIsNiArMjIsNiBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogPC9LZXlib2FyZD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCmluZGV4IDVmYTliOGEuLjBhMzUwNDAgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAppbmRleCBlNDkxYWZmLi45ZTlkYjgxIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9scy54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbAppbmRleCAxNGE3ZWM4Li45YTk0OTMwIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbApAQCAtMjIsMTAgKzIyLDEwIEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKLSAgICA8Um93PgorICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIyIi8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMyIvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9sc19zaGlmdC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbAppbmRleCA0Yjg0ZjRiLi5hOTcyZWIyIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbApAQCAtMjIsMTAgKzIyLDEwIEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKLSAgICA8Um93PgorICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ifiIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJgIi8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ifCIvPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNDg3YTAwZC4uYjFlMzhlZSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xMDIzLDcgKzEwMjMsMTMgQEAKICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9zZXJ2aWNlPgotICAgICAgICAKKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQud2Via2l0LkFjY2Vzc2liaWxpdHlJbmplY3RvclRlc3QkTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cEFjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJSYWRpb0dyb3VwQWN0aXZpdHkiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfYmFja3NsYXNoLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2JhY2tzbGFzaC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzAwMmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfYmFja3NsYXNoLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU46O0FcO0JcXDtDXFxcOztEO1w6RTtcXFxcOw0KLUZOOkE7QlxDXDtEOkVcXA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2NvbXBsaWNhdGVkLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2NvbXBsaWNhdGVkLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzNGUxNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9jb21wbGljYXRlZC52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU46R3VtcDtGb3JyZXN0O0hvZ2U7UG9zO1Rhbw0KLUZOOkpvZSBEdWUNCi1PUkc6R3VtcCBTaHJpbXAgQ28uO1NhbGVzIERlcHQuXDtNYW5hZ2VyO0Zpc2gga2VlcGVyDQotUk9MRTpGaXNoIENha2UgS2VlcGVyIQ0KLVgtQ0xBU1M6UFVCTElDDQotVElUTEU6U2hyaW1wIE1hbg0KLVRFTDtXT1JLO1ZPSUNFOigxMTEpIDU1NS0xMjEyDQotVEVMO0hPTUU7Vk9JQ0U6KDQwNCkgNTU1LTEyMTINCi1URUw7Q0VMTDowMzExMTExMTExDQotVEVMO1ZJREVPOjAzMjIyMjIyMjINCi1URUw7Vk9JQ0U6MDMzMzMzMzMzMw0KLUFEUjtXT1JLOjs7MTAwIFdhdGVycyBFZGdlO0JheXRvd247TEE7MzAzMTQ7VW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhDQotTEFCRUw7V09SSztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOjEwMCBXYXRlcnMgRWRnZT0wRD0wQUJheXRvd24sIExBIDMwMzE0PTBEPTBBVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYQ0KLUFEUjtIT01FOjs7NDIgUGxhbnRhdGlvbiBTdC47QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2ENCi1MQUJFTDtIT01FO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6NDIgUGxhbnRhdGlvbiBTdC49MEQ9MEE9DQotQmF5dG93biwgTEEgMzAzMTQ9MEQ9MEE9DQotVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYQ0KLUVNQUlMO1BSRUY7SU5URVJORVQ6Zm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20NCi1FTUFJTDtDRUxMOmNlbGxAZXhhbXBsZS5jb20NCi1OT1RFOlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1Lg0KLU5PVEU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpOb3cncyB0aGUgdGltZSA9DQotZm9yIGFsbCBmb2xrIHRvIGNvbWU9DQotIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4NCi0NCi1QSE9UTztFTkNPRElORz1CQVNFNjQ7VFlQRT1KUEVHOg0KLSAvOWovNFFvUFJYaHBaZ0FBVFUwQUtnQUFBQWdBRFFFT0FBSUFBQUFQQUFBQXFnRVBBQUlBQUFBSEFBQUF1Z0VRQUFJQUFBQUcNCi0gQUFBQXdnRVNBQU1BQUFBQkFBRUFBQUVhQUFVQUFBQUJBQUFBeUFFYkFBVUFBQUFCQUFBQTBBRW9BQU1BQUFBQkFBSUFBQUV4DQotIEFBSUFBQUFPQUFBQTJBRXlBQUlBQUFBVUFBQUE1Z0lUQUFNQUFBQUJBQUVBQUlLWUFBSUFBQUFPQUFBQStvZHBBQVFBQUFBQg0KLSBBQUFCaE1TbEFBY0FBQUI4QUFBQkNBQUFCQjR5TURBNE1UQXlPVEV6TlRVek1RQUFSRzlEYjAxdkFBQkVPVEExYVFBQUFBQkkNCi0gQUFBQUFRQUFBRWdBQUFBQlJEa3dOV2tnVm1WeU1TNHdNQUF5TURBNE9qRXdPakk1SURFek9qVTFPalEzQUNBZ0lDQWdJQ0FnDQotIElDQWdJQ0FBVUhKcGJuUkpUUUF3TXpBd0FBQUFCZ0FCQUJRQUZBQUNBUUFBQUFBREFBQUFOQUVBQlFBQUFBRUJBUUFBQUFFUQ0KLSBnQUFBQUFBQUVRa0FBQ2NRQUFBUEN3QUFKeEFBQUFXWEFBQW5FQUFBQ0xBQUFDY1FBQUFjQVFBQUp4QUFBQUplQUFBbkVBQUENCi0gQUlzQUFDY1FBQUFEeXdBQUp4QUFBQnZsQUFBbkVBQW9ncG9BQlFBQUFBRUFBQU5xZ3AwQUJRQUFBQUVBQUFOeWlDSUFBd0FBDQotIEFBRUFBZ0FBa0FBQUJ3QUFBQVF3TWpJd2tBTUFBZ0FBQUJRQUFBTjZrQVFBQWdBQUFCUUFBQU9Pa1FFQUJ3QUFBQVFCQWdNQQ0KLSBrUUlBQlFBQUFBRUFBQU9pa2dFQUNnQUFBQUVBQUFPcWtnSUFCUUFBQUFFQUFBT3lrZ1FBQ2dBQUFBRUFBQU82a2dVQUJRQUENCi0gQUFFQUFBUENrZ2NBQXdBQUFBRUFBZ0FBa2dnQUF3QUFBQUVBQUFBQWtna0FBd0FBQUFFQUFBQUFrZ29BQlFBQUFBRUFBQVBLDQotIGtud0FCd0FBQUFFQUFBQUFrb1lBQndBQUFCWUFBQVBTb0FBQUJ3QUFBQVF3TVRBd29BRUFBd0FBQUFFQUFRQUFvQUlBQXdBQQ0KLSBBQUVBWUFBQW9BTUFBd0FBQUFFQVNBQUFvQVVBQkFBQUFBRUFBQVFBb2c0QUJRQUFBQUVBQUFQb29nOEFCUUFBQUFFQUFBUHcNCi0gb2hBQUF3QUFBQUVBQWdBQW9oY0FBd0FBQUFFQUFnQUFvd0FBQndBQUFBRURBQUFBb3dFQUJ3QUFBQUVCQUFBQXBBRUFBd0FBDQotIEFBRUFBQUFBcEFJQUF3QUFBQUVBQUFBQXBBTUFBd0FBQUFFQUFBQUFwQVFBQlFBQUFBRUFBQVA0cEFVQUF3QUFBQUVBSFFBQQ0KLSBwQVlBQXdBQUFBRUFBQUFBcEFjQUF3QUFBQUVBQUFBQXBBZ0FBd0FBQUFFQUFBQUFwQWtBQXdBQUFBRUFBQUFBcEFvQUF3QUENCi0gQUFFQUFBQUFwQXdBQXdBQUFBRUFBZ0FBQUFBQUFBQUFBRk1BQUNjUUFBQUJYZ0FBQUdReU1EQTRPakV3T2pJNUlERXpPalUxDQotIE9qTXhBREl3TURnNk1UQTZNamtnTVRNNk5UVTZORGNBQUFBcGlBQUFHd0FBQUFLeUFBQUFaQUFBQVY0QUFBQmtBQUFBQUFBQQ0KLSBBR1FBQUFBbEFBQUFDZ0FBRHBJQUFBUG9BQUFBQUFBQUFBQXlNREE0TVRBeU9URXpOVFV6TVFBQUlDb0FBQUFLQUFBcTRnQUENCi0gQUFvQUFBQUFBQUFBQVFBQ0FBRUFBZ0FBQUFSU09UZ0FBQUlBQndBQUFBUXdNVEF3QUFBQUFBQUdBUU1BQXdBQUFBRUFCZ0FBDQotIEFSb0FCUUFBQUFFQUFBUnNBUnNBQlFBQUFBRUFBQVIwQVNnQUF3QUFBQUVBQWdBQUFnRUFCQUFBQUFFQUFBUjhBZ0lBQkFBQQ0KLSBBQUVBQUFXTEFBQUFBQUFBQUVnQUFBQUJBQUFBU0FBQUFBSC8yUC9iQUlRQUlCWVlIQmdVSUJ3YUhDUWlJQ1l3VURRd0xDd3cNCi0gWWtaS09sQjBabnA0Y21ad2JvQ1F1SnlBaUs2S2JuQ2cycUt1dnNUTzBNNThtdUx5NE1qd3VNck94Z0VpSkNRd0tqQmVORFJlDQotIHhvUndoTWJHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiRw0KLSAvOEFBRVFnQWVBQ2dBd0VoQUFJUkFRTVJBZi9FQWFJQUFBRUZBUUVCQVFFQkFBQUFBQUFBQUFBQkFnTUVCUVlIQ0FrS0N4QUENCi0gQWdFREF3SUVBd1VGQkFRQUFBRjlBUUlEQUFRUkJSSWhNVUVHRTFGaEJ5SnhGREtCa2FFSUkwS3h3UlZTMGZBa00ySnlnZ2tLDQotIEZoY1lHUm9sSmljb0tTbzBOVFkzT0RrNlEwUkZSa2RJU1VwVFZGVldWMWhaV21Oa1pXWm5hR2xxYzNSMWRuZDRlWHFEaElXRw0KLSBoNGlKaXBLVGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVIaTQrVGwNCi0gNXVmbzZlcng4dlAwOWZiMytQbjZBUUFEQVFFQkFRRUJBUUVCQUFBQUFBQUFBUUlEQkFVR0J3Z0pDZ3NSQUFJQkFnUUVBd1FIDQotIEJRUUVBQUVDZHdBQkFnTVJCQVVoTVFZU1FWRUhZWEVUSWpLQkNCUkNrYUd4d1Frak0xTHdGV0p5MFFvV0pEVGhKZkVYR0JrYQ0KLSBKaWNvS1NvMU5qYzRPVHBEUkVWR1IwaEpTbE5VVlZaWFdGbGFZMlJsWm1kb2FXcHpkSFYyZDNoNWVvS0RoSVdHaDRpSmlwS1QNCi0gbEpXV2w1aVptcUtqcEtXbXA2aXBxckt6dExXMnQ3aTV1c0xEeE1YR3g4akp5dExUMU5YVzE5aloydUxqNU9YbTUranA2dkx6DQotIDlQWDI5L2o1K3YvYUFBd0RBUUFDRVFNUkFEOEFGRlNxS2taSW9xUlZwZ1NLS2VCVEVPQXB3RkFEc1VZcGdJUlNFVUFOSXBwRg0KLSBJQ05oVVRDZ0NNaW8yRklDSmhVTENnQzBvcVZhQUpGRlNxS0JrZ0ZPQXBpSENuQ2dCMktNVUNFTkpRQTBpbUVVREdNS2lZVUENCi0gUnRVYlVnSVdxSmhRQlpTcEZvQWxXcFZvR1BGUEZNUTd0U0syT0RRQTR5S085SG1LZTlGeEF6REhGSU9sQUFhWWFBR05VVFVEDQotIEltcU5xUUVUVkUxQUU2VktLQUpGTlNxYUFIZzA4R21BTklGRlFNNVk1cUpNQnVUNjBaTlFJY3JrVllTUU1LdUxHS2FhYXNReA0KLSBxaWFnWkUxUnRTQWphb21vQWtRMUtwb0FsVTFJcG9Ba1UwN09CVEFyTys1cWtWMTJZNzFsZlVCbWFLa0NSU3V6bnJURmJhMmENCi0gb0N3R3lNMEUxcUlqWTFHeG9HUk5VWk5JQ05xaWFnQnlHcGxOQUVpbXBGTk1CNFlEdlN1Y3B4U1lFSVUwNEthenNBdTFxQXJVDQotIFdFTHRQcFRTcG9zQk5FVHQ1cHhOYW9DTmpVYkdnQ05qVVpvR1J0VVRVZ0ZVMUtwb0FrQnFRSGlnQ0ZuTzdyVXFPZGxacDZnQQ0KLSBjK3RPRG4xcFhBWHpENjBlWWZXbmNRdm1OU0dRMDdnT01oQ1ZFSkd6MXB0Z1M1eUtZeHF3R0UxR3hvQWlhbUdrTWFwcVZUUUINCi0gS3BwK2VLQUlDZm1xV00vS2F6NmdBTk9CcVFGelJtbUF1YVROQUNzZmtxTUhtbTl3SnM4VTBtdFJER05Sc2FBSTJwaHBESTFODQotIFNxYUFKRk5TQThVQ0lTZm1xU00vS2F6NmpBSG1uQTFJQ2cwdWFBRnpTWnBnS3grU21EclRlNEUyZUthVFdvaU1tbU1hQUl6VA0KLSBEU0dSS2FrVTBBU0thZURURVJzZWFralB5bXMrb3hBYWNEVWdPQnBjMGdGelNacGdPWS9LS1l2M3FycUlscHByUUJqR295YUENCi0gR0dtbWtNZ1UxSXBwZ1BCcVFHZ1F1MEduNHd2Rkt3RVFwd05aREhacGMwQUxtaWdSS0JsZWFRS0JXdGdBMDAxUURHcU0wZ0dtDQotIG1Ha01ycWFrQm9BZXBwNE5NUklEVHdhQUUyQTAwOEdva2dIeGpkMXB6S0ZwVzB1QWc1TlNCQlRpcmdPcERXZ0RUVFRRQXcwdw0KLSAwZ0dHbW1nWldCcDRwQVNLYWVEVEVPQnA0TkFEd2FqYnJVeUJFa1hXblNVZEFHcjFxZWlBTVNrTldBaHBob0FhYVlhUUREVFQNCi0gU0dWUlR3YVlEeFR3YUJEd2FlRFFBNEdsSzVvYXVJZW8yMHBHYUxhQUtxZ1U2aEt3QlNHbUFocGhvQWFhWWFReGhwcHBES2dODQotIFBGTUI0cDRvRVBGT0JwZ1BCcDROQWh3cHdvQVdsb0FLU2dCRFRUUU1ZYVlhUURUVFRTR0EvOW4vMndDRUFBb0hCd2dIQmdvSQ0KLSBDQWdMQ2dvTERoZ1FEZzBORGgwVkZoRVlJeDhsSkNJZklpRW1LemN2SmlrMEtTRWlNRUV4TkRrN1BqNCtKUzVFU1VNOFNEYzkNCi0gUGpzQkNnc0xEZzBPSEJBUUhEc29JaWc3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3DQotIE96czdPenM3T3pzN096czdPLy9BQUJFSUFFZ0FZQU1CSVFBQ0VRRURFUUgveEFHaUFBQUJCUUVCQVFFQkFRQUFBQUFBQUFBQQ0KLSBBUUlEQkFVR0J3Z0pDZ3NRQUFJQkF3TUNCQU1GQlFRRUFBQUJmUUVDQXdBRUVRVVNJVEZCQmhOUllRY2ljUlF5Z1pHaENDTkMNCi0gc2NFVlV0SHdKRE5pY29JSkNoWVhHQmthSlNZbktDa3FORFUyTnpnNU9rTkVSVVpIU0VsS1UxUlZWbGRZV1ZwalpHVm1aMmhwDQotIGFuTjBkWFozZUhsNmc0U0Zob2VJaVlxU2s1U1ZscGVZbVpxaW82U2xwcWVvcWFxeXM3UzF0cmU0dWJyQ3c4VEZ4c2ZJeWNyUw0KLSAwOVRWMXRmWTJkcmg0dVBrNWVibjZPbnE4Zkx6OVBYMjkvajUrZ0VBQXdFQkFRRUJBUUVCQVFBQUFBQUFBQUVDQXdRRkJnY0kNCi0gQ1FvTEVRQUNBUUlFQkFNRUJ3VUVCQUFCQW5jQUFRSURFUVFGSVRFR0VrRlJCMkZ4RXlJeWdRZ1VRcEdoc2NFSkl6TlM4QlZpDQotIGN0RUtGaVEwNFNYeEZ4Z1pHaVluS0NrcU5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNA0KLSBlWHFDZzRTRmhvZUlpWXFTazVTVmxwZVltWnFpbzZTbHBxZW9xYXF5czdTMXRyZTR1YnJDdzhURnhzZkl5Y3JTMDlUVjF0ZlkNCi0gMmRyaTQrVGw1dWZvNmVyeTgvVDE5dmY0K2ZyLzJnQU1Bd0VBQWhFREVRQS9BSjdTTGdjVnIyMEk0ck5GR3ZiUUFBSEZhRVVYDQotIFNyUWk1SENNZEtrOG9ZNlZTSll4NGhqcFZhV01lbEFGQzRpR0R4V1BkUjhta3htUmR4akJyRXZJK3Raak4yMHh0SE5iTnFBYw0KLSBVSURYZzZDcjBXS3RDWThYS1FPeXpPQjNGS05Xc3ljZVorbFM2c1k2TmtqdlBTZHdJbUJIVW1teTRxMDc2b0NqT09EV1BkZ2MNCi0gME1wR1BkQVlOWWw0bzVyTmpOS3preW9yWnRYeGloQWExdklEaXA3bTlGcmI3LzRqd0tjbnl4YkV6TjNpZUpwcFpzeVo0VTFIDQotIHVyelphdTRtV1ZsTnJHazBVdVdQVmExWXJvWEVJa0hmclhaaDVXOTBSV25jQUhtc2k2YkpOZFEwWk53M0JyR3VpTUdzMk1rcw0KLSBwdUJ6V3piemRPYUVCZU9wUjJvVXRrazloVHJ1N2l1bzRtOHdnZW1LeXFUaTA0c0JzZmtFZjY4ajhLbFVRWno5by9TdVpSajMNCi0gSllyaUFqaTQvU3A3VzZodGJWMmFYY3U3MHJhbW94bGU0Z043SGNJWGpiaXMrNGs1TmRhYWF1aG1WY3Yxckh1VzYxREdpRzFtDQotIDZjMXMyMC9UbWdBdjV2bWo1N1ZLazMraXhuUGMxeFZWNzBoOUNWSnVPdFNyTDcxaEZneHpTY1Vra24raVkvMnExaTl4RHJHVA0KLSA5eTMxcEo1T3RkMUwrR2hNeTdtVHJXWE8yU2FwalJuMjh2VG10YTNueGptZ0dPdkpkMncxS2t2K2lwei9BQkd1T292ZVlkQ2UNCi0gT2JqclU2eTVybHNBOHljVWtzbitpai9lTmF3NmlKTE5zVzU5elRKbjY4MTZGUDRFSm1iTytTYXo1bTYwMlVqSWdrNEhOYWR2DQotIEx3S2FCbCtNcElNT01pcHA0OTBTQ0plRjdDb3FRdkYySnVScVdRNFlFR3JTaVFKdUtuSHJYQnlNcGtpNzNHRkJOWElvaDluMg0KLSBTcm5uT0s2TVBUYmQzc1N3SVZGMnFNQ3FrekhtdXkxbFlSblRIclZHV3BaYU1LQitCV2xieWNZb1FNMElaRHh6VitHVThjMWENCi0gSVl5NVkrZG5IYXRBc2ZzQUhmQXJtUzFtUG9oMWdUOHg5cXRrMXJRWDd0Q2U1RElhcHpHdEdCUW03MVNscUdXam5JSDZWb3d0DQotIHptaEF5L0UzdlY2RjZ0RU11eGxXSXlBZnJWeENDQU8xVlpFRXlZQTRBQXB4Tkd3eUorbFZKUlVzYUtNdzYxU2xGUXpSQVAvWg0KLQ0KLVgtQVRUUklCVVRFOlNvbWUgU3RyaW5nDQotQkRBWToxOTgwMDEwMQ0KLUdFTzozNS42NTYzODU0LDEzOS42OTk0MjMzDQotVVJMOmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vDQotUkVWOjIwMDgwNDI0VDE5NTI0M1oNCi1FTkQ6VkNBUkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMWFhYmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW0udmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRAotVkVSU0lPTjoyLjEKLVgtQU5EUk9JRC1DVVNUT006dm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vbmlja25hbWU7TmljazsxOzs7Ozs7Ozs7Ozs7OwotWC1HT09HTEUtVEFMSzpoaGhAZ21haWwuY29tCi1FTkQ6VkNBUkQKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfY29tbWVudF9saW5lLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfY29tbWVudF9saW5lLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxMDcxMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX2NvbW1lbnRfbGluZS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1CRUdJTjp2Q2FyZA0KLVZFUlNJT046Mi4xDQotVUlEOjM1Nw0KLU46O0NvbmZlcmVuY2UgQ2FsbA0KLUZOOkNvbmZlcmVuY2UgQ2FsbA0KLSMgVGhpcyBsaW5lIG11c3QgYmUgaWdub3JlZC4NCi1OT1RFO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6VGhpcyBpcyBhbiAoc2hhcnAgLT49DQotIzwtIHNoYXJwKSBleGFtcGxlLiBUaGlzIG1lc3NhZ2UgbXVzdCBOT1QgYmUgaWdub3JlZC4NCi0jIFRoaXMgbGluZSBtdXN0IGJlIGlnbm9yZWQgdG9vLg0KLUVORDp2Q2FyZA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfbXVsdGlwbGVfbGluZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX211bHRpcGxlX2xpbmUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzgxZmQ1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfbXVsdGlwbGVfbGluZS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLUJFR0lOOlZDQVJECi1WRVJTSU9OOjIuMQotTjo7T21lZ2E7OzsKLUVNQUlMO0lOVEVSTkVUOiJPbWVnYSIKLSAgPG9tZWdhQGV4YW1wbGUuY29tPgotRk46T21lZ2EKLUVORDpWQ0FSRApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ZTJmZi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN47Ozs7DQotVEVMO1BSRUY7Vk9JQ0U6MDMwMDAwMDAwMA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzIudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTRhY2IuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotRk47Q0hBUlNFVD1TSElGVF9KSVM6iMCToSCDjYNDg2ggMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToTuDjYNDg2gxOzs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rM727LE3jE7OzsNCi1BRFI7SE9NRTtDSEFSU0VUPVNISUZUX0pJUztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOjs9OTM9OEM9OEI9OUU9OTM9NzM9DQotPThGPTYxPTkyPTRBPThCPUU2PThEPUY3PThCPTc1PTkyPUFDMjYtMT04Mz01QT04Mz04Qj04Mz04QT04Mz00MT04Mz05Mz0NCi09ODM9NUU9ODM9OEY9ODE9NUI2PThBPTRCOzs7OzE1MC04NTEyOw0KLU5PVEU7Q0hBUlNFVD1TSElGVF9KSVM7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTo9ODM9ODE9ODM9ODINCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYmIxOWEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfbXVsdGlwbGVfZW50cnkudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDM7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeMzs7OzsNCi1URUw7WC1ORUMtU0VDUkVUOjkNCi1URUw7WC1ORUMtSE9URUw6MTANCi1URUw7WC1ORUMtU0NIT09MOjExDQotVEVMO0hPTUU7RkFYOjEyDQotRU5EOlZDQVJEDQotDQotDQotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDQ7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeNDs7OzsNCi1URUw7TU9ERU06MTMNCi1URUw7UEFHRVI6MTQNCi1URUw7WC1ORUMtRkFNSUxZOjE1DQotVEVMO1gtTkVDLUdJUkw6MTYNCi1FTkQ6VkNBUkQNCi0NCi0NCi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoNTs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN41Ozs7Ow0KLVRFTDtYLU5FQy1CT1k6MTcNCi1URUw7WC1ORUMtRlJJRU5EOjE4DQotVEVMO1gtTkVDLVBIUzoxOQ0KLVRFTDtYLU5FQy1SRVNUQVVSQU5UOjIwDQotRU5EOlZDQVJEDQotDQotDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfb3JnX2JlZm9yZV90aXRsZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmMTE5MC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLUZOOk5vcm1hbCBHdXkNCi1PUkc6Q29tcGFueTtPcmdhbml6YXRpb247RGV2aXNpb247Um9vbTtTaGVldCBOby4NCi1USVRMRTpFeGNlbGxlbnQgSmFuaXRvcg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3ByZWZfaGFuZGxpbmcudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDUzMTAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1CRUdJTjpWQ0FSRAotVkVSU0lPTjoyLjEKLUZOOlNtaXRoCi1URUw7SE9NRToxCi1URUw7V09SSztQUkVGOjIKLVRFTDtJU0ROOjMKLUVNQUlMO1BSRUY7SE9NRTp0ZXN0QGV4YW1wbGUuY29tCi1FTUFJTDtDRUxMO1BSRUY6dGVzdDJAZXhhbWluYXRpb24uY29tCi1PUkc6Q29tcGFueQotVElUTEU6RW5naW5lZXIKLU9SRzpNeXN0ZXJ5Ci1USVRMRTpCbG9nZ2VyCi1PUkc6UG9ldHJ5Ci1USVRMRTpQb2V0Ci1FTkQ6VkNBUkQKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFhYmI0Yy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUJFR0lOOlZDQVJEDQotTjpBbmRvO1JvaWQ7DQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ1YWI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8yLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1GTjpBbmRvIFJvaWQNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGRhYmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzMudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLU46QW5kbztSb2lkOw0KLUZOOkFuZG8gUm9pZA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3RpdGxlX2JlZm9yZV9vcmcudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZGM3MzguLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1GTjpOaWNlIEd1eQ0KLVRJVExFOkNvb2wgVGl0bGUNCi1PUkc6TWFydmVyb3VzO1BlcmZlY3Q7R3JlYXQ7R29vZDtCYWQ7UG9vcg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4MGQwZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV93aW5tb182NS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjpFeGFtcGxlOzs7Ow0KLUZOOkV4YW1wbGUNCi1BTk5JVkVSU0FSWTtWQUxVRT1EQVRFOjIwMDkxMDEwDQotQUdFTlQ6SW52YWxpZCBsaW5lIHdoaWNoIG11c3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkuDQotWC1DTEFTUzpQVUJMSUMNCi1YLVJFRFVDVElPTjoNCi1YLU5POg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9jb21tYV9zZXBhcmF0ZWQudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWJhZjg4Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjozLjANCi1OO1RZUEU9UFJFRixIT01FOkY7RztNOzsNCi1URUw7VFlQRT0iQ09NTUEsU0VQQVJBVEVEOklOU0lERS5EUVVPVEUiLFBSRUY6MQ0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX211bHRpYnl0ZV9wYXJhbS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9tdWx0aWJ5dGVfcGFyYW0udmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDIwMGU1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX211bHRpYnl0ZV9wYXJhbS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjozLjANCi1OOkY7RztNOzsNCi1URUw7VFlQRT0i6LS5IjoxDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfcGFnZXIudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfcGFnZXIudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGE3ZjIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3BhZ2VyLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLU46RjtHO007Ow0KLVRFTDtUWVBFPVBBR0VSLFdPUkssTVNHOjYxMDEyMzEyMzRAcGFnZXJzYW1wbGUuY29tDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfc2ltcGxlLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODY2MWYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfc2ltcGxlLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjozLjANCi1GTjpBbmQgUm9pZA0KLU46QW5kO1JvaWQ7OzsNCi1PUkc6T3BlbjtIYW5kc2V0OyBBbGxpYW5jZQ0KLVNPUlQtU1RSSU5HOmFuZHJvaWQNCi1URUw7VFlQRT1QUkVGO1RZUEU9Vk9JQ0U6MDMwMDAwMDAwMA0KLUNMQVNTOlBVQkxJQw0KLVgtR05POjANCi1YLUdOOmdyb3VwMA0KLVgtUkVEVUNUSU9OOjANCi1SRVY6MjAwODEwMzFUMDY1ODU0Wg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjQwX3NvcnRfYXMudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92NDBfc29ydF9hcy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmJjM2IuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92NDBfc29ydF9hcy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjo0LjANCi1GTjrlronol6Qg44Ot44Kk44OJDQotTjtTT1JULUFTPSLjgYLjgpPjganjgYY744KN44GE44GpIjrlronol6Q744Ot44Kk44OJOzs7DQotT1JHO1RZUEU9V09SSztTT1JULUFTPSLjgZDjg7zjgZDjgos744GR44KT44GV44GP44G244KC44KTIjrjgrDjg7zjgrDjg6s75qSc57Si6YOo6ZaADQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1MWVlYS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlOwotCi1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVGltZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRleHQgdGhlIGFjY2Vzc2liaWxpdHkgZnJhbWV3b3JrIGVuZCB0byBlbmQuCi0gKiA8cD4KLSAqIE5vdGU6IFNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgcHJvdmlkZWQgYnkge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfXMgd2UgY3JlYXRlIG9uZSwKLSAqIGFuZCBpdCBnZW5lcmF0ZXMgYW4gZXZlbnQgYW5kIGFuIGludGVycnVwdGlvbiBkaXNwYXRjaGluZyB0aGVtIHRocm91Z2ggdGhlCi0gKiB7QGxpbmsgQWNjZXNzaWJpbGl0eU1hbmFnZXJ9LiBXZSB2ZXJpZnkgdGhlIHJlY2VpdmVkIHJlc3VsdC4gVG8gdHJpZ2dlciB0aGUgdGVzdAotICogZ28gdG8gU2V0dGluZ3MtPkFjY2Vzc2liaWxpdHkgYW5kIHNlbGVjdCB0aGUgZW5hYmxlIGFjY2Vzc2liaWxpdHkgY2hlY2sgYW5kIHRoZW4KLSAqIHNlbGVjdCB0aGUgY2hlY2sgZm9yIHRoaXMgc2VydmljZSAoc2FtZSBuYW1lIGFzIHRoZSBjbGFzcykuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUUgPSAiZm9vLmJhci5iYXouVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJmb28uYmFyLmJheiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAiU29tZSBzdHVmZiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9URVhUID0gIlNvbWUgb3RoZXIgc3R1ZmYiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfREVTQ1JJUFRJT04gPSAiQ29udGVudCBkZXNjcmlwdGlvbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFTV9DT1VOVCA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDVVJSRU5UX0lURU1fSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlRFUlJVUFRfSU5WT0NBVElPTl9UWVBFID0gMHgwMDAwMDIwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGUk9NX0lOREVYID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURERURfQ09VTlQgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEX0NPVU5UID0gMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RJRklDQVRJT05fVElNRU9VVF9NSUxMSVMgPSA4MDsKLQotICAgIHByaXZhdGUgaW50IG1SZWNlaXZlZFJlc3VsdDsKLQotICAgIHByaXZhdGUgVGltZXIgbVRpbWVyID0gbmV3IFRpbWVyKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoKSB7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOwotICAgICAgICBpbmZvLmV2ZW50VHlwZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRVNfQUxMX01BU0s7Ci0gICAgICAgIGluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0FVRElCTEU7Ci0gICAgICAgIGluZm8ubm90aWZpY2F0aW9uVGltZW91dCA9IE5PVElGSUNBVElPTl9USU1FT1VUX01JTExJUzsKLSAgICAgICAgaW5mby5mbGFncyAmPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKLSAgICAgICAgc2V0U2VydmljZUluZm8oaW5mbyk7Ci0KLSAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBzeXN0ZW0gcGlja3Mgb3VyIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IHdpbGwgbm90IG5vdGlmeSB1cwotICAgICAgICBtVGltZXIuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RBY2Nlc3NpYmlsaXR5RXZlbnREaXNwYXRjaGluZygpOwotICAgICAgICAgICAgICAgICAgICB0ZXN0SW50ZXJydXB0KCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yIGluIHRlc3RpbmcgQWNjZXNzaWJpbGl0eSBmZWF0dXJlIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LCAxMDAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBoZXJlIGlmIHRoZSBldmVudCB3ZSByZWNlaXZlZCBpcyBhY3R1YWxseSB0aGUgb25lIHdlIHNlbnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGFzc2VydChBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCA9PSBldmVudC5nZXRFdmVudFR5cGUoKSk7Ci0gICAgICAgIGFzc2VydChldmVudCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmdldEV2ZW50VGltZSgpID4gMCk7Ci0gICAgICAgIGFzc2VydChDTEFTU19OQU1FLmVxdWFscyhldmVudC5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICBhc3NlcnQoUEFDS0FHRV9OQU1FLmVxdWFscyhldmVudC5nZXRQYWNrYWdlTmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydCgxID09IGV2ZW50LmdldFRleHQoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnQoVEVYVC5lcXVhbHMoZXZlbnQuZ2V0VGV4dCgpLmdldCgwKSkpOwotICAgICAgICBhc3NlcnQoQkVGT1JFX1RFWFQuZXF1YWxzKGV2ZW50LmdldEJlZm9yZVRleHQoKSkpOwotICAgICAgICBhc3NlcnQoZXZlbnQuaXNDaGVja2VkKCkpOwotICAgICAgICBhc3NlcnQoQ09OVEVOVF9ERVNDUklQVElPTi5lcXVhbHMoZXZlbnQuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpKTsKLSAgICAgICAgYXNzZXJ0KElURU1fQ09VTlQgPT0gZXZlbnQuZ2V0SXRlbUNvdW50KCkpOwotICAgICAgICBhc3NlcnQoQ1VSUkVOVF9JVEVNX0lOREVYID09IGV2ZW50LmdldEN1cnJlbnRJdGVtSW5kZXgoKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5pc0VuYWJsZWQoKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5pc1Bhc3N3b3JkKCkpOwotICAgICAgICBhc3NlcnQoRlJPTV9JTkRFWCA9PSBldmVudC5nZXRGcm9tSW5kZXgoKSk7Ci0gICAgICAgIGFzc2VydChBRERFRF9DT1VOVCA9PSBldmVudC5nZXRBZGRlZENvdW50KCkpOwotICAgICAgICBhc3NlcnQoUkVNT1ZFRF9DT1VOVCA9PSBldmVudC5nZXRSZW1vdmVkQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpICE9IG51bGwpOwotICAgICAgICBhc3NlcnQoMSA9PSAoKE5vdGlmaWNhdGlvbikgZXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKSkuaWNvbik7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSB0eXBlIG9mIHRoZSByZWNldmVkIHJlcXVlc3QKLSAgICAgICAgbVJlY2VpdmVkUmVzdWx0ID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgZmxhZyB0aGF0IHdlIHJlY2VpdmVkIHRoZSBpbnRlcnJ1cHQgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkludGVycnVwdCgpIHsKLQotICAgICAgICAvLyBzZXQgdGhlIHR5cGUgb2YgdGhlIHJlY2V2ZWQgcmVxdWVzdAotICAgICAgICBtUmVjZWl2ZWRSZXN1bHQgPSBJTlRFUlJVUFRfSU5WT0NBVElPTl9UWVBFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9IGlzIHNlbnQgYW5kIHJlY2VpdmVkIGNvcnJlY3RseS4KLSAgICAgKi8KLSAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NpYmlsaXR5RXZlbnREaXNwYXRjaGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9Ci0gICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQpOwotCi0gICAgICAgYXNzZXJ0KGV2ZW50ICE9IG51bGwpOwotICAgICAgIGV2ZW50LnNldENsYXNzTmFtZShDTEFTU19OQU1FKTsKLSAgICAgICBldmVudC5zZXRQYWNrYWdlTmFtZShQQUNLQUdFX05BTUUpOwotICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoVEVYVCk7Ci0gICAgICAgZXZlbnQuc2V0QmVmb3JlVGV4dChCRUZPUkVfVEVYVCk7Ci0gICAgICAgZXZlbnQuc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICBldmVudC5zZXRDb250ZW50RGVzY3JpcHRpb24oQ09OVEVOVF9ERVNDUklQVElPTik7Ci0gICAgICAgZXZlbnQuc2V0SXRlbUNvdW50KElURU1fQ09VTlQpOwotICAgICAgIGV2ZW50LnNldEN1cnJlbnRJdGVtSW5kZXgoQ1VSUkVOVF9JVEVNX0lOREVYKTsKLSAgICAgICBldmVudC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgIGV2ZW50LnNldFBhc3N3b3JkKHRydWUpOwotICAgICAgIGV2ZW50LnNldEZyb21JbmRleChGUk9NX0lOREVYKTsKLSAgICAgICBldmVudC5zZXRBZGRlZENvdW50KEFEREVEX0NPVU5UKTsKLSAgICAgICBldmVudC5zZXRSZW1vdmVkQ291bnQoUkVNT1ZFRF9DT1VOVCk7Ci0gICAgICAgZXZlbnQuc2V0UGFyY2VsYWJsZURhdGEobmV3IE5vdGlmaWNhdGlvbigxLCAiRm9vIiwgMTIzNCkpOwotCi0gICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UodGhpcykuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7Ci0KLSAgICAgICBhc3NlcnQobVJlY2VpdmVkUmVzdWx0ID09IGV2ZW50LmdldEV2ZW50VHlwZSgpKTsKLQotICAgICAgIExvZy5pKExPR19UQUcsICJBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UjdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nOiBTdWNjZXNzIik7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogSWYgYWNjZXNzaWJpbGl0eSBmZWVkYmFjayBpbnRlcnJ1cHRpb24gaXMgdHJpZ2dlcmVkIGFuZCByZWNlaXZlZCBjb3JyZWN0bHkuCi0gICAgKi8KLSAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKS5pbnRlcnJ1cHQoKTsKLQotICAgICAgIGFzc2VydChJTlRFUlJVUFRfSU5WT0NBVElPTl9UWVBFID09IG1SZWNlaXZlZFJlc3VsdCk7Ci0KLSAgICAgICBMb2cuaShMT0dfVEFHLCAiQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlI3Rlc3RJbnRlcnJ1cHQ6IFN1Y2Nlc3MiKTsKLSAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTdHJlc3NUZXN0LmphdmEKaW5kZXggMTQ5Njg1Yy4uZDhkOWViYSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhCkBAIC03OCw1MCArNzgsNCBAQAogCiAgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFpcigpIHsKLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zSGVhZHNldEFkZHJlc3MpOwotCi0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0QTJkcCgpIHsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0QTJkcEl0ZXJhdGlvbnM7Ci0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0EyZHBBZGRyZXNzKTsKLQotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImNvbm5lY3RBMmRwIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0QTJkcChhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0QTJkcChhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogVW5wYWlyIGZyb20gZGV2aWNlIGlmIGRldmljZSBjYW4gYWNjZXB0IHBhaXJpbmcgYWZ0ZXIgdW5wYWlyaW5nCi0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdEhlYWRzZXQoKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zOwotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNIZWFkc2V0QWRkcmVzcyk7Ci0KLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJjb25uZWN0SGVhZHNldCBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuY29ubmVjdEhlYWRzZXQoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdEhlYWRzZXQoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IFVucGFpciBmcm9tIGRldmljZSBpZiBkZXZpY2UgY2FuIGFjY2VwdCBwYWlyaW5nIGFmdGVyIHVucGFpcmluZwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RSdW5uZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEKaW5kZXggMmU2ZGFhMy4uY2YwZmY5OSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RSdW5uZXIuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhCkBAIC0yNiwxMSArMjYsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgaW50IHNFbmFibGVJdGVyYXRpb25zID0gMTAwOwogICAgIHB1YmxpYyBzdGF0aWMgaW50IHNEaXNjb3ZlcmFibGVJdGVyYXRpb25zID0gMTAwMDsKICAgICBwdWJsaWMgc3RhdGljIGludCBzU2Nhbkl0ZXJhdGlvbnMgPSAxMDAwOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNDb25uZWN0SGVhZHNldEl0ZXJhdGlvbnMgPSAxMDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgc0Nvbm5lY3RBMmRwSXRlcmF0aW9ucyA9IDEwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNIZWFkc2V0QWRkcmVzcyA9ICIiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNBMmRwQWRkcmVzcyA9ICIiOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFRlc3RTdWl0ZSBnZXRBbGxUZXN0cygpIHsKQEAgLTc0LDMzICs2OSw1IEBACiAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImNvbm5lY3RfYTJkcF9pdGVyYXRpb25zIik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzQ29ubmVjdEEyZHBJdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiY29ubmVjdF9oZWFkc2V0X2l0ZXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNDb25uZWN0SGVhZHNldEl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQsIGZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJoZWFkc2V0X2FkZHJlc3MiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzSGVhZHNldEFkZHJlc3MgPSB2YWw7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJhMmRwX2FkZHJlc3MiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzQTJkcEFkZHJlc3MgPSB2YWw7Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEKaW5kZXggMmQwNDI0ZC4uODJkZTUwOSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0VXRpbHMuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwogCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldC5TZXJ2aWNlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC01OCwzNiArNTcsNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfRElTQ09WRVJZX1RJTUVPVVQgPSA1MDAwOwogCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aERldmljZSNjcmVhdGVCb25kKCl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1RJTUVPVVQgPSAyMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhEZXZpY2UjcmVtb3ZlQm9uZCgpfSBpbiBtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5QQUlSX1RJTUVPVVQgPSAyMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhBMmRwI2Nvbm5lY3RTaW5rKEJsdWV0b290aERldmljZSl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0EyRFBfVElNRU9VVCA9IDIwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aEEyZHAjZGlzY29ubmVjdFNpbmsoQmx1ZXRvb3RoRGV2aWNlKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfQTJEUF9USU1FT1VUID0gMjAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciB7QGxpbmsgQmx1ZXRvb3RoSGVhZHNldCNjb25uZWN0SGVhZHNldChCbHVldG9vdGhEZXZpY2UpfSBpbiBtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9IRUFEU0VUX1RJTUVPVVQgPSAyMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhIZWFkc2V0I2Rpc2Nvbm5lY3RIZWFkc2V0KEJsdWV0b290aERldmljZSl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hFQURTRVRfVElNRU9VVCA9IDIwMDAwOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPVkVSWV9TVEFSVEVEX0ZMQUcgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT1ZFUllfRklOSVNIRURfRkxBRyA9IDEgPDwgMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9NT0RFX05PTkVfRkxBRyA9IDEgPDwgMjsKQEAgLTk3LDIzICs2Niw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RVUk5JTkdfT05fRkxBRyA9IDEgPDwgNjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfT05fRkxBRyA9IDEgPDwgNzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVFVSTklOR19PRkZfRkxBRyA9IDEgPDwgODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFJUl9TVEFURV9GTEFHID0gMSA8PCA5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX0EyRFBfRkxBRyA9IDEgPDwgMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfSEVBRFNFVF9GTEFHID0gMSA8PCAxMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1NUQVRFX0JPTkRFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfU1RBVEVfQk9ORElORyA9IDEgPDwgMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFJUl9TVEFURV9OT05FID0gMSA8PCAyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RBVEVfRElTQ09OTkVDVEVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQTJEUF9TVEFURV9DT05ORUNUSU5HID0gMSA8PCAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBMkRQX1NUQVRFX0NPTk5FQ1RFRCA9IDEgPDwgMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQTJEUF9TVEFURV9ESVNDT05ORUNUSU5HID0gMSA8PCAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBMkRQX1NUQVRFX1BMQVlJTkcgPSAxIDw8IDQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEVBRFNFVF9TVEFURV9ESVNDT05ORUNURUQgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RJTkcgPSAxIDw8IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFQURTRVRfU1RBVEVfQ09OTkVDVEVEID0gMSA8PCAyOwogCiAgICAgLyoqCiAgICAgICogVGltZSBiZXR3ZWVuIHBvbGxzIGluIG1zLgpAQCAtMTI0LDQxICs3NiwxMSBAQAogCiAgICAgcHJpdmF0ZSBCdWZmZXJlZFdyaXRlciBtT3V0cHV0V3JpdGVyOwogCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1BMmRwOwotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1IZWFkc2V0OwotCiAgICAgcHJpdmF0ZSBTdHJpbmcgbU91dHB1dEZpbGU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKLSAgICBwcml2YXRlIGNsYXNzIEhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIgaW1wbGVtZW50cyBTZXJ2aWNlTGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3RlZCA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3RlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSGVhZHNldFNlcnZpY2VMaXN0ZW5lciBtSGVhZHNldFNlcnZpY2VMaXN0ZW5lciA9IG5ldyBIZWFkc2V0U2VydmljZUxpc3RlbmVyKCk7CiAKICAgICBwcml2YXRlIGNsYXNzIEJsdWV0b290aFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewogICAgICAgICBwcml2YXRlIGludCBtRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QYWlyRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1BMmRwRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1IZWFkc2V0RmlyZWRGbGFncyA9IDA7CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKQEAgLTIwMCw1OCArMTIyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyB8PSBTVEFURV9UVVJOSU5HX09GRl9GTEFHOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyB8PSBQQUlSX1NUQVRFX0ZMQUc7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfQk9ORF9TVEFURSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKHN0YXRlLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWlyRmlyZWRGbGFncyB8PSBQQUlSX1NUQVRFX0JPTkRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9ORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgfD0gUEFJUl9TVEFURV9CT05ESU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWlyRmlyZWRGbGFncyB8PSBQQUlSX1NUQVRFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyB8PSBQUk9GSUxFX0EyRFBfRkxBRzsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aEEyZHAuRVhUUkFfU0lOS19TVEFURSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKHN0YXRlLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfRElTQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gUFJPRklMRV9IRUFEU0VUX0ZMQUc7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhIZWFkc2V0LkVYVFJBX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1IpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKHN0YXRlLCBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldEZpcmVkRmxhZ3MgfD0gSEVBRFNFVF9TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldEZpcmVkRmxhZ3MgfD0gSEVBRFNFVF9TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldEZpcmVkRmxhZ3MgfD0gSEVBRFNFVF9TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2MiwzMCArMTMyLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGFpckZpcmVkRmxhZ3MoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBhaXJGaXJlZEZsYWdzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRBMmRwRmlyZWRGbGFncygpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybiBtQTJkcEZpcmVkRmxhZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEhlYWRzZXRGaXJlZEZsYWdzKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1IZWFkc2V0RmlyZWRGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0RmlyZWRGbGFncygpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgICAgIG1GaXJlZEZsYWdzID0gMDsKLSAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgPSAwOwotICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXRGaXJlZEZsYWdzID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMxOSw5ICsxNjgsNiBAQAogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NDQU5fTU9ERV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9TVEFURV9DSEFOR0VEKTsKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7Ci0KLSAgICAgICAgbUEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7Ci0gICAgICAgIG1IZWFkc2V0ID0gbmV3IEJsdWV0b290aEhlYWRzZXQobUNvbnRleHQsIG1IZWFkc2V0U2VydmljZUxpc3RlbmVyKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKQEAgLTU3MywzNTEgKzQxOSw2IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwYWlyKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBBSVJfU1RBVEVfRkxBRzsKLSAgICAgICAgaW50IHBhaXJNYXNrID0gUEFJUl9TVEFURV9CT05ESU5HIHwgUEFJUl9TVEFURV9CT05ERUQ7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoInBhaXIoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IGRldmljZS5nZXRCb25kU3RhdGUoKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRJTkc6Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KLSAgICAgICAgICAgICAgICBtYXNrID0gcGFpck1hc2sgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLmNyZWF0ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoInBhaXIoKSBpbnZhbGlkZSBzdGF0ZTogc3RhdGU9IiArIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgUEFJUl9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IGRldmljZS5nZXRCb25kU3RhdGUoKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKSAmIHBhaXJNYXNrKSA9PSBwYWlyTWFzaykgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJwYWlyKCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGludCBwYWlyRmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRQYWlyRmlyZWRGbGFncygpOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgicGFpcigpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCAiCi0gICAgICAgICAgICAgICAgKyAicGFpckZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCwgZmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBtYXNrLCBwYWlyRmlyZWRGbGFncywgcGFpck1hc2spKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1bnBhaXIoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUEFJUl9TVEFURV9GTEFHOwotICAgICAgICBpbnQgcGFpck1hc2sgPSBQQUlSX1NUQVRFX05PTkU7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoInVucGFpcigpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gZGV2aWNlLmdldEJvbmRTdGF0ZSgpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLnJlbW92ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UucmVtb3ZlQm9uZCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoInVucGFpcigpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5yZW1vdmVCb25kKCkpOwotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgVU5QQUlSX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0Qm9uZFN0YXRlKCkgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORSkgewotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKSAmIHBhaXJNYXNrKSA9PSBwYWlyTWFzaykgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJ1bnBhaXIoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgcGFpckZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoInVucGFpcigpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCAiCi0gICAgICAgICAgICAgICAgKyAicGFpckZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCwgZmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBtYXNrLCBwYWlyRmlyZWRGbGFncywgcGFpck1hc2spKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0QTJkcChCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IG1hc2sgPSBQUk9GSUxFX0EyRFBfRkxBRzsKLSAgICAgICAgaW50IGEyZHBNYXNrMSA9IEEyRFBfU1RBVEVfQ09OTkVDVElORyB8IEEyRFBfU1RBVEVfQ09OTkVDVEVEIHwgQTJEUF9TVEFURV9QTEFZSU5HOwotICAgICAgICBpbnQgYTJkcE1hc2syID0gYTJkcE1hc2sxIF4gQTJEUF9TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIGludCBhMmRwTWFzazMgPSBhMmRwTWFzazEgXiBBMkRQX1NUQVRFX1BMQVlJTkc7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoImNvbm5lY3RBMmRwKCkgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKLSAgICAgICAgICAgIGZhaWwoImNvbm5lY3RBMmRwKCkgZGV2aWNlIG5vdCBwYWlyZWQ6IGRldmljZT0iICsgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IG1BMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1BMmRwLmNvbm5lY3RTaW5rKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgbWFzayA9IGEyZHBNYXNrMSA9IGEyZHBNYXNrMiA9IGEyZHBNYXNrMyA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoImNvbm5lY3RBMmRwKCkgaW52YWxpZCBzdGF0ZTogc3RhdGU9IiArIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9BMkRQX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gbUEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQgfHwgc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBTVEFURV9DT05ORUNUSU5HIGFuZCAoU1RBVEVfQ09OTkVDVEVEIG9yIFNUQVRFX1BMQVlJTkcpIGludGVudHMKLSAgICAgICAgICAgICAgICAvLyBoYXZlIGZpcmVkIGlmIHdlIGFyZSBjaGVja2luZyBpZiBpbnRlbnRzIHNob3VsZCBiZSBmaXJlZC4KLSAgICAgICAgICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGEyZHBGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEEyZHBGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChhMmRwRmlyZWRGbGFncyAmIGEyZHBNYXNrMSkgPT0gYTJkcE1hc2sxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChhMmRwRmlyZWRGbGFncyAmIGEyZHBNYXNrMikgPT0gYTJkcE1hc2syCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChhMmRwRmlyZWRGbGFncyAmIGEyZHBNYXNrMykgPT0gYTJkcE1hc2szKSkgewotICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImNvbm5lY3RBMmRwKCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGludCBhMmRwRmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRBMmRwRmlyZWRGbGFncygpOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiY29ubmVjdEEyZHAoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQgb3IgJWQpLCAiCi0gICAgICAgICAgICAgICAgKyAiZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCksIGEyZHBGbGFncz0weCV4IChleHBlY3RlZCAweCV4IG9yIDB4JXggb3IgMHgleCkiLAotICAgICAgICAgICAgICAgIHN0YXRlLCBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCwgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HLCBmaXJlZEZsYWdzLAotICAgICAgICAgICAgICAgIG1hc2ssIGEyZHBGaXJlZEZsYWdzLCBhMmRwTWFzazEsIGEyZHBNYXNrMiwgYTJkcE1hc2szKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzY29ubmVjdEEyZHAoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUFJPRklMRV9BMkRQX0ZMQUc7Ci0gICAgICAgIGludCBhMmRwTWFzayA9IEEyRFBfU1RBVEVfRElTQ09OTkVDVElORyB8IEEyRFBfU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0QTJkcCgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0QTJkcCgpIGRldmljZSBub3QgcGFpcmVkOiBkZXZpY2U9IiArIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBtQTJkcC5nZXRTaW5rU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuZGlzY29ubmVjdFNpbmsoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5kaXNjb25uZWN0U2luayhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIG1hc2sgPSBhMmRwTWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoImRpc2Nvbm5lY3RBMmRwKCkgaW52YWxpZCBzdGF0ZTogc3RhdGU9IiArIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgRElTQ09OTkVDVF9BMkRQX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gbUEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZWNlaXZlci5nZXRBMmRwRmlyZWRGbGFncygpICYgYTJkcE1hc2spID09IGEyZHBNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdEEyZHAoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IGEyZHBGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEEyZHBGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0QTJkcCgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksICIKLSAgICAgICAgICAgICAgICArICJmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgYTJkcEZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2ssIGEyZHBGaXJlZEZsYWdzLCBhMmRwTWFzaykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RIZWFkc2V0KEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBST0ZJTEVfSEVBRFNFVF9GTEFHOwotICAgICAgICBpbnQgaGVhZHNldE1hc2sgPSBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RJTkcgfCBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgiY29ubmVjdEhlYWRzZXQoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbCgiY29ubmVjdEhlYWRzZXQoKSBkZXZpY2Ugbm90IHBhaXJlZDogZGV2aWNlPSIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFtSGVhZHNldFNlcnZpY2VMaXN0ZW5lci5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gbUhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUhlYWRzZXQuaXNDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXQuY29ubmVjdEhlYWRzZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgbWFzayA9IGhlYWRzZXRNYXNrID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9FUlJPUjoKLSAgICAgICAgICAgICAgICBmYWlsKCJjb25uZWN0SGVhZHNldCgpIGVycm9yIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoImNvbm5lY3RIZWFkc2V0KCkgaW52YWxpZCBzdGF0ZTogc3RhdGU9IiArIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9IRUFEU0VUX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gbUhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUhlYWRzZXQuaXNDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZWNlaXZlci5nZXRIZWFkc2V0RmlyZWRGbGFncygpICYgaGVhZHNldE1hc2spID09IGhlYWRzZXRNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiY29ubmVjdEhlYWRzZXQoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IGhlYWRzZXRGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEhlYWRzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJjb25uZWN0SGVhZHNldCgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksICIKLSAgICAgICAgICAgICAgICArICJmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgaGVhZHNldEZsYWdzPTB4JXMgKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2ssIGhlYWRzZXRGaXJlZEZsYWdzLAotICAgICAgICAgICAgICAgIGhlYWRzZXRNYXNrKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzY29ubmVjdEhlYWRzZXQoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUFJPRklMRV9IRUFEU0VUX0ZMQUc7Ci0gICAgICAgIGludCBoZWFkc2V0TWFzayA9IEhFQURTRVRfU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0SGVhZHNldCgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0SGVhZHNldCgpIGRldmljZSBub3QgcGFpcmVkOiBkZXZpY2U9IiArIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoIW1IZWFkc2V0U2VydmljZUxpc3RlbmVyLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBtSGVhZHNldC5nZXRTdGF0ZShkZXZpY2UpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIG1IZWFkc2V0LmRpc2Nvbm5lY3RIZWFkc2V0KGRldmljZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBtSGVhZHNldC5kaXNjb25uZWN0SGVhZHNldChkZXZpY2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0SGVhZHNldCgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IERJU0NPTk5FQ1RfSEVBRFNFVF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1IZWFkc2V0LmdldFN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtSGVhZHNldC5pc0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBpZiAoKG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVJlY2VpdmVyLmdldEhlYWRzZXRGaXJlZEZsYWdzKCkgJiBoZWFkc2V0TWFzaykgPT0gaGVhZHNldE1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0SGVhZHNldCgpIGNvbXBsZXRlZCBpbiAlZCBtczogZGV2aWNlPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzKSwgZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgaGVhZHNldEZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0SGVhZHNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RIZWFkc2V0KCkgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgIgotICAgICAgICAgICAgICAgICsgImZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCBoZWFkc2V0RmxhZ3M9MHglcyAoZXhwZWN0ZWQgMHgleCkiLCBzdGF0ZSwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaywgaGVhZHNldEZpcmVkRmxhZ3MsCi0gICAgICAgICAgICAgICAgaGVhZHNldE1hc2spKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB3cml0ZU91dHB1dChTdHJpbmcgcykgewogICAgICAgICBMb2cuaShtVGFnLCBzKTsKICAgICAgICAgaWYgKG1PdXRwdXRXcml0ZXIgPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyLmphdmEKaW5kZXggYzRiYzc2Ny4uNzM1MzBkNyAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXIuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlci5qYXZhCkBAIC0xNiwxNiArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5VcmlNYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZW1vcnlGaWxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtMTM0LDY0ICsxMjksMzQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBpbnQgbWF0Y2ggPSBzVVJMTWF0Y2hlci5tYXRjaCh1cmwpOwogICAgICAgICBzd2l0Y2ggKG1hdGNoKSB7CiAgICAgICAgICAgICBjYXNlIERBVEFfSURfQkxPQjoKICAgICAgICAgICAgICAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBfYmxvYiBGUk9NIGRhdGEgV0hFUkUgX2lkPSIgKyB1cmwuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDEpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXRCbG9iQ29sdW1uQXNBc3NldEZpbGUodXJsLCBtb2RlLCBzcWwpOworICAgICAgICAgICAgICAgIHJldHVybiBnZXRCbG9iQ29sdW1uQXNGaWxlKHVybCwgbW9kZSwgc3FsKTsKICAgICAgICAgICAgIGNhc2UgSFVHRToKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBNZW1vcnlGaWxlIG1lbW9yeUZpbGUgPSBuZXcgTWVtb3J5RmlsZShudWxsLCA1MDAwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5RmlsZS53cml0ZUJ5dGVzKFRFU1RfQkxPQiwgMCwgMTAwMDAwMCwgVEVTVF9CTE9CLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeUZpbGUuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXNzZXRGaWxlRGVzY3JpcHRvci5mcm9tTWVtb3J5RmlsZShtZW1vcnlGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmNlbEZpbGVEZXNjcmlwdG9yLmZyb21EYXRhKFRFU1RfQkxPQiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyAiICsgdXJsICsgIjoiICsgZXgudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBGSUxFOgogICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGdldENvbnRleHQoKS5nZXRGaWxlU3RyZWFtUGF0aChEQVRBX0ZJTEUpOwotICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oZmlsZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFkpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihmZCwgMCwgQXNzZXRGaWxlRGVzY3JpcHRvci5VTktOT1dOX0xFTkdUSCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oZmlsZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFkpOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBmaWxlcyBzdXBwb3J0ZWQgYnkgcHJvdmlkZXIgYXQgIiArIHVybCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIEFzc2V0RmlsZURlc2NyaXB0b3IgZ2V0QmxvYkNvbHVtbkFzQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlLCBTdHJpbmcgc3FsKQorICAgIHByaXZhdGUgUGFyY2VsRmlsZURlc2NyaXB0b3IgZ2V0QmxvYkNvbHVtbkFzRmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSwgU3RyaW5nIHNxbCkKICAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBpZiAoISJyIi5lcXVhbHMobW9kZSkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk1vZGUgIiArIG1vZGUgKyAiIG5vdCBzdXBwb3J0ZWQgZm9yICIgKyB1cmwpOwogICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoZGIsIHNxbCk7Ci0gICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBzdWNoIGVudHJ5OiAiICsgdXJsKTsKLSAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgYWZkID0gQXNzZXRGaWxlRGVzY3JpcHRvci5mcm9tTWVtb3J5RmlsZShmaWxlKTsKLSAgICAgICAgICAgIGZpbGUuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgLy8gbmVlZCB0byBkdXAgYW5kIHRoZW4gY2xvc2U/IG9wZW5GaWxlSGVscGVyKCkgZG9lc24ndCBkbyB0aGF0IHRob3VnaAotICAgICAgICAgICAgcmV0dXJuIGFmZDsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgIiArIHVybCArICI6IiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQogCi0gICAgcHJpdmF0ZSBNZW1vcnlGaWxlIHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBkYi5yYXdRdWVyeShzcWwsIG51bGwpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY3Vyc29yLmdldEJsb2IoMCk7Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBuZXcgTWVtb3J5RmlsZShudWxsLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgZmlsZS53cml0ZUJ5dGVzKGJ5dGVzLCAwLCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMuYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkoZGIsIHNxbCwgbnVsbCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhCmluZGV4IDYyYjRlN2UuLmJiZTdjMTAgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC01Niw3ICs1Niw2IEBACiAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYW5kcm9pZC5jb250ZW50Lk1lbW9yeUZpbGVQcm92aWRlci9odWdlIik7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHJlc29sdmVyLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIG9wZW4gc3RyZWFtIG51bWJlciAiICsgaSwgaW4pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDAwMDAsIGluLnNraXAoMTAwMDAwMCkpOwogICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW01lbW9yeUZpbGVQcm92aWRlci5URVNUX0JMT0IubGVuZ3RoXTsKICAgICAgICAgICAgIGludCBjb3VudCA9IGluLnJlYWQoYnVmKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWYubGVuZ3RoLCBjb3VudCk7CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L1N5bmNRdWV1ZVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvU3luY1F1ZXVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGE1OWQxLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvU3luY1F1ZXVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuY29udGVudDsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLQotcHVibGljIGNsYXNzIFN5bmNRdWV1ZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY291bnQgQUNDT1VOVDEgPSBuZXcgQWNjb3VudCgidGVzdC5hY2NvdW50MSIsICJ0ZXN0LnR5cGUxIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWNjb3VudCBBQ0NPVU5UMiA9IG5ldyBBY2NvdW50KCJ0ZXN0LmFjY291bnQyIiwgInRlc3QudHlwZTIiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZMSA9ICJ0ZXN0LmF1dGhvcml0eTEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkyID0gInRlc3QuYXV0aG9yaXR5MiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWTMgPSAidGVzdC5hdXRob3JpdHkzIjsKLQotICAgIHByaXZhdGUgU3luY1N0b3JhZ2VFbmdpbmUgbVNldHRpbmdzOwotICAgIHByaXZhdGUgU3luY1F1ZXVlIG1TeW5jUXVldWU7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBNb2NrQ29udGVudFJlc29sdmVyIG1vY2tSZXNvbHZlciA9IG5ldyBNb2NrQ29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIG1TZXR0aW5ncyA9IFN5bmNTdG9yYWdlRW5naW5lLm5ld1Rlc3RJbnN0YW5jZShuZXcgVGVzdENvbnRleHQobW9ja1Jlc29sdmVyLCBnZXRDb250ZXh0KCkpKTsKLSAgICAgICAgbVN5bmNRdWV1ZSA9IG5ldyBTeW5jUXVldWUobVNldHRpbmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY1F1ZXVlT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBvcDEgPSBuZXcgU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBBQ0NPVU5UMSwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX1VTRVIsIEFVVEhPUklUWTEsIG5ld1Rlc3RCdW5kbGUoIjEiKSwgMCk7Ci0gICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3AyID0gbmV3IFN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQUNDT1VOVDIsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9VU0VSLCBBVVRIT1JJVFkyLCBuZXdUZXN0QnVuZGxlKCIyIiksIDEwMCk7Ci0gICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3AzID0gbmV3IFN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQUNDT1VOVDEsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9VU0VSLCBBVVRIT1JJVFkxLCBuZXdUZXN0QnVuZGxlKCIzIiksIDE1MCk7Ci0gICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3A0ID0gbmV3IFN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQUNDT1VOVDIsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9VU0VSLCBBVVRIT1JJVFkyLCBuZXdUZXN0QnVuZGxlKCI0IiksIDYwKTsKLSAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBvcDUgPSBuZXcgU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBBQ0NPVU5UMSwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX1VTRVIsIEFVVEhPUklUWTEsIG5ld1Rlc3RCdW5kbGUoIjUiKSwgODApOwotICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIG9wNiA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFDQ09VTlQyLCBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfVVNFUiwgQVVUSE9SSVRZMiwgbmV3VGVzdEJ1bmRsZSgiNiIpLCAwKTsKLSAgICAgICAgb3A2LmV4cGVkaXRlZCA9IHRydWU7Ci0KLSAgICAgICAgbVN5bmNRdWV1ZS5hZGQob3AxKTsKLSAgICAgICAgbVN5bmNRdWV1ZS5hZGQob3AyKTsKLSAgICAgICAgbVN5bmNRdWV1ZS5hZGQob3AzKTsKLSAgICAgICAgbVN5bmNRdWV1ZS5hZGQob3A0KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5hZGQob3A1KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5hZGQob3A2KTsKLQotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgMjAwOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDYsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0gICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKG9wNik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wMSwgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5yZW1vdmUob3AxKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3A0LCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShvcDQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDUsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0gICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKG9wNSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wMiwgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5yZW1vdmUob3AyKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3AzLCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShvcDMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlcldpdGhCYWNrb2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3AxID0gbmV3IFN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQUNDT1VOVDEsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9VU0VSLCBBVVRIT1JJVFkxLCBuZXdUZXN0QnVuZGxlKCIxIiksIDApOwotICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIG9wMiA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFDQ09VTlQyLCBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfVVNFUiwgQVVUSE9SSVRZMiwgbmV3VGVzdEJ1bmRsZSgiMiIpLCAxMDApOwotICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIG9wMyA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFDQ09VTlQxLCBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfVVNFUiwgQVVUSE9SSVRZMSwgbmV3VGVzdEJ1bmRsZSgiMyIpLCAxNTApOwotICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIG9wNCA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFDQ09VTlQyLCBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfVVNFUiwgQVVUSE9SSVRZMywgbmV3VGVzdEJ1bmRsZSgiNCIpLCA2MCk7Ci0gICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3A1ID0gbmV3IFN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQUNDT1VOVDEsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9VU0VSLCBBVVRIT1JJVFkxLCBuZXdUZXN0QnVuZGxlKCI1IiksIDgwKTsKLSAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBvcDYgPSBuZXcgU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBBQ0NPVU5UMiwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX1VTRVIsIEFVVEhPUklUWTIsIG5ld1Rlc3RCdW5kbGUoIjYiKSwgMCk7Ci0gICAgICAgIG9wNi5leHBlZGl0ZWQgPSB0cnVlOwotCi0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wMSk7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wMik7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wMyk7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wNCk7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wNSk7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wNik7Ci0KLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIDIwMDsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3A2LCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShvcDYpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDEsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0gICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKG9wMSk7Ci0KLSAgICAgICAgbVNldHRpbmdzLnNldEJhY2tvZmYoQUNDT1VOVDIsICBBVVRIT1JJVFkzLCBub3cgKyAyMDAsIDUpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3A1LCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotCi0gICAgICAgIG1TZXR0aW5ncy5zZXRCYWNrb2ZmKEFDQ09VTlQyLCAgQVVUSE9SSVRZMywgU3luY1N0b3JhZ2VFbmdpbmUuTk9UX0lOX0JBQ0tPRkZfTU9ERSwgMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcDQsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0KLSAgICAgICAgbVNldHRpbmdzLnNldERlbGF5VW50aWxUaW1lKEFDQ09VTlQyLCAgQVVUSE9SSVRZMywgbm93ICsgMjAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wNSwgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLQotICAgICAgICBtU2V0dGluZ3Muc2V0RGVsYXlVbnRpbFRpbWUoQUNDT1VOVDIsICBBVVRIT1JJVFkzLCAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wNCwgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5yZW1vdmUob3A0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3A1LCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShvcDUpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDIsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0gICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKG9wMik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wMywgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5yZW1vdmUob3AzKTsKLSAgICB9Ci0KLSAgICBCdW5kbGUgbmV3VGVzdEJ1bmRsZShTdHJpbmcgdmFsKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoInRlc3QiLCB2YWwpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBUZXN0Q29udGV4dCBleHRlbmRzIENvbnRleHRXcmFwcGVyIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKLQotICAgICAgICBwdWJsaWMgVGVzdENvbnRleHQoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBDb250ZXh0IHJlYWxDb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihuZXcgUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dChuZXcgTW9ja0NvbnRleHQoKSwgcmVhbENvbnRleHQsICJ0ZXN0LiIpKTsKLSAgICAgICAgICAgIG1SZXNvbHZlciA9IHJlc29sdmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihTdHJpbmcgcGVybWlzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVzb2x2ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCmluZGV4IGZiNWEzNmYuLjA3MzMyMjkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TdXBwcmVzczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC00MSw4ICs0MCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiBwdWJsaWMgY2xhc3MgRGF0YWJhc2VDdXJzb3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIGltcGxlbWVudHMgUGVyZm9ybWFuY2VUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1N0cmluZzEgPSAidGhpcyBpcyBhIHRlc3QiOwpAQCAtOTIsNDMgKzg5LDYgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JVcGRhdGUoKSB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKAotICAgICAgICAgICAgIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZCBJTlRFR0VSLCBzIElOVEVHRVIpOyIpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewotICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBJTlRPIHRlc3QgKGQsIHMpIFZBTFVFUyAoIiArIGkgKyAKLSAgICAgICAgICAgICAgICAiLCIgKyBpJTIgKyAiKTsiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucXVlcnkoInRlc3QiLCBudWxsLCAicyA9IDAiLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgaW50IGRDb2wgPSBjLmdldENvbHVtbkluZGV4T3JUaHJvdygiZCIpOwotICAgICAgICBpbnQgc0NvbCA9IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJzIik7Ci0gICAgICAgIAotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYy51cGRhdGVJbnQoZENvbCwgMykpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGNvdW50KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoYy5jb21taXRVcGRhdGVzKCkpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLnJlcXVlcnkoKSk7Ci0gICAgICAgIAotICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGMuZ2V0SW50KGRDb2wpKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygxMCwgY291bnQpOwotICAgICAgICBhc3NlcnRUcnVlKGMubW92ZVRvRmlyc3QoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5kZWxldGVSb3coKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg5LCBjLmdldENvdW50KCkpOwotICAgICAgICBjLmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY3JlYXRlIHRhYmxlCiAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKApAQCAtMTY0LDI0ICsxMjQsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYmxvYiwgY0Jsb2IpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIGMuZ2V0U3RyaW5nKHNDb2wpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKChkb3VibGUpZCwgYy5nZXREb3VibGUoZENvbCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKGxvbmcpbCwgYy5nZXRMb25nKGxDb2wpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG5ldyBieXRlW10KLSAgICAgICAgYnl0ZVtdIG5ld2Jsb2IgPSBuZXcgYnl0ZVsxMDAwXTsKLSAgICAgICAgdmFsdWUgPSA5ODsKLSAgICAgICAgQXJyYXlzLmZpbGwoYmxvYiwgdmFsdWUpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBjLnVwZGF0ZUJsb2IoYkNvbCwgbmV3YmxvYik7Ci0gICAgICAgIGNCbG9iID0gIGMuZ2V0QmxvYihiQ29sKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ld2Jsb2IsIGNCbG9iKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBjb21taXQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmNvbW1pdFVwZGF0ZXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5yZXF1ZXJ5KCkpOwotICAgICAgICBjLm1vdmVUb05leHQoKTsKLSAgICAgICAgY0Jsb2IgPSAgYy5nZXRCbG9iKGJDb2wpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3YmxvYiwgY0Jsb2IpKTsgICAgICAgIAotICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygobG9uZylsLCBjLmdldExvbmcobENvbCkpOyAgICAgICAgCiAgICAgfQogICAgIAogICAgIEBNZWRpdW1UZXN0CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlRXJyb3JIYW5kbGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZDI1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlclRlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIERhdGFiYXNlRXJyb3JIYW5kbGVyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfTkFNRSA9ICJkYXRhYmFzZV90ZXN0LmRiIjsKKyAgICBwcml2YXRlIEZpbGUgZGJEaXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsIERCX05BTUUpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQ29ycnVwdGlvbkNhc2UoKSB7CisgICAgICAgIG5ldyBNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIoKS5vbkNvcnJ1cHRpb24obURhdGFiYXNlKTsKKyAgICAgICAgLy8gZGF0YWJhc2UgZmlsZSBzaG91bGQgc3RpbGwgZXhpc3QKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2VGaWxlLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YWJhc2VJc0NvcnJ1cHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHQgKGkgaW50KTsiKTsKKyAgICAgICAgLy8gd3JpdGUganVuayBpbnRvIHRoZSBkYXRhYmFzZSBmaWxlCisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSkpOworICAgICAgICB3cml0ZXIud3JpdGUoImJsYWgiKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlRmlsZS5leGlzdHMoKSk7CisgICAgICAgIC8vIHNpbmNlIHRoZSBkYXRhYmFzZSBmaWxlIGlzIG5vdyBjb3JydXB0LCBkb2luZyBhbnkgc3FsIG9uIHRoaXMgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAvLyBzaG91bGQgdHJpZ2dlciBjYWxsIHRvIE15RGF0YWJhc2VDb3JydXB0aW9uSGFuZGxlci5vbkNvcnJ1cHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJzZWxlY3QgKiBmcm9tIHQ7Iik7CisgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgLy8gYWZ0ZXIgY29ycnVwdGlvbiBoYW5kbGVyIGlzIGNhbGxlZCwgdGhlIGRhdGFiYXNlIGZpbGUgc2hvdWxkIGJlIGZyZWUgb2YKKyAgICAgICAgLy8gZGF0YWJhc2UgY29ycnVwdGlvbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIoKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNEYXRhYmFzZUludGVncml0eU9rKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBkZW1vbnN0cmF0ZQorICAgICAqIGRhdGFiYXNlIGNvcnJ1cHRpb24gaGFuZGxlciB3aGljaCBjaGVja3MgdG8gbWFrZSBzdXJlIGRhdGFiYXNlIGlzIGluZGVlZAorICAgICAqIGNvcnJ1cHQgYmVmb3JlIGRlbGV0aW5nIHRoZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBEYXRhYmFzZUVycm9ySGFuZGxlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29ycnVwdGlvbihTUUxpdGVEYXRhYmFzZSBkYk9iaikgeworICAgICAgICAgICAgYm9vbGVhbiBkYXRhYmFzZU9rID0gZGJPYmouaXNEYXRhYmFzZUludGVncml0eU9rKCk7CisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGJPYmouY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGF0YWJhc2VPaykgeworICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlIGlzIGp1c3QgZmluZS4gbm8gbmVlZCB0byBkZWxldGUgdGhlIGRhdGFiYXNlIGZpbGUKKyAgICAgICAgICAgICAgICBMb2cuZSgiTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyIiwgIm5vIGNvcnJ1cHRpb24gaW4gdGhlIGRhdGFiYXNlOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UgaXMgY29ycnVwdC4gZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlCisgICAgICAgICAgICAgICAgTG9nLmUoIk15RGF0YWJhc2VDb3JydXB0aW9uSGFuZGxlciIsICJkZWxldGluZyB0aGUgZGF0YWJhc2UgZmlsZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgbmV3IEZpbGUoZGJEaXIsIERCX05BTUUpLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQppbmRleCA2NTYwMjlkLi5jZDM4YmYwNyAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VHZW5lcmFsVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQpAQCAtMjEsMTggKzIxLDIxIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKQEAgLTM4Miw1NCArMzg1LDI4IEBACiAKICAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFDaGFuZ2UyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1EYXRhYmFzZTsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZSwgbnVsbCk7Ci0gICAgICAgIEN1cnNvciBjdXJzb3I7Ci0KLSAgICAgICAgZGIxLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkN1cnNvciBpcyBudWxsIiwgY3Vyc29yKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbURhdGFiYXNlLnF1ZXJ5KCJkYjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXJzb3IpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yLmdldENvdW50KCkpOwotICAgICAgICBjdXJzb3IuZGVhY3RpdmF0ZSgpOwotICAgICAgICAvLyB0aGlzIGNhdXNlIGV4Y2VwdGlvbiBiZWNhdXNlIHdlJ3JlIHN0aWxsIHVzaW5nIHNxbGl0ZV9wcmVwYXRlMTYgYW5kIG5vdAotICAgICAgICAvLyBzcWxpdGVfcHJlcGFyZTE2X3YyLiBUaGUgdjIgdmFyaWFudCBhZGRlZCB0aGUgYWJpbGl0eSB0byBjaGVjayB0aGUKLSAgICAgICAgLy8gc2NoZW1hIHZlcnNpb24gYW5kIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBzY2hlbWEgaGFzIGNoYW5nZWQKLSAgICAgICAgLy8gTWFyY28gTmVsaXNzZW4gY2xhaW0gaXQgd2FzIDJ4IHNsb3dlciB0byBjb21waWxlIFNRTCBzdGF0ZW1lbnRzIHNvCi0gICAgICAgIC8vIEkgcmV2ZXJ0ZWQgYmFjayB0byB0aGUgdjEgdmFyaWFudC4KLSAgICAgICAgLyogZGIyLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjIgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkN1cnNvciBpcyBudWxsIiwgY3Vyc29yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5jb3VudCgpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgKi8KKyAgICAgICAgY3Vyc29yLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQ2hhbmdlMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtRGF0YWJhc2U7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUsIG51bGwpOwotICAgICAgICBDdXJzb3IgY3Vyc29yOwotCi0KLSAgICAgICAgZGIxLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotICAgICAgICBkYjEuZXhlY1NRTCgiSU5TRVJUIElOVE8gZGIxIChkYXRhKSBWQUxVRVMgKCd0ZXN0Jyk7Iik7Ci0KLSAgICAgICAgY3Vyc29yID0gZGIxLnF1ZXJ5KCJkYjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgLy8gdGhpcyBjYXVzZSBleGNlcHRpb24gYmVjYXVzZSB3ZSdyZSBzdGlsbCB1c2luZyBzcWxpdGVfcHJlcGF0ZTE2IGFuZCBub3QKLSAgICAgICAgLy8gc3FsaXRlX3ByZXBhcmUxNl92Mi4gVGhlIHYyIHZhcmlhbnQgYWRkZWQgdGhlIGFiaWxpdHkgdG8gY2hlY2sgdGhlCi0gICAgICAgIC8vIHNjaGVtYSB2ZXJzaW9uIGFuZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgc2NoZW1hIGhhcyBjaGFuZ2VkCi0gICAgICAgIC8vIE1hcmNvIE5lbGlzc2VuIGNsYWltIGl0IHdhcyAyeCBzbG93ZXIgdG8gY29tcGlsZSBTUUwgc3RhdGVtZW50cyBzbwotICAgICAgICAvLyBJIHJldmVydGVkIGJhY2sgdG8gdGhlIHYxIHZhcmlhbnQuCi0gICAgICAgIC8qIGRiMi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIyIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjdXJzb3IuY291bnQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3Vyc29yLmZpcnN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBjdXJzb3IuZ2V0U3RyaW5nKGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coImRhdGEiKSkpOwotICAgICAgICBjdXJzb3IuZGVhY3RpdmF0ZSgpOwotICAgICAgICAqLworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIGRiMSAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGRhdGEgVEVYVCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgSU5UTyBkYjEgKGRhdGEpIFZBTFVFUyAoJ3Rlc3QnKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkFMVEVSIFRBQkxFIGRiMSBBREQgQ09MVU1OIGJsYWggaW50OyIpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgYmxhaCBmcm9tIGRiMSIsIG51bGwpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBDaGFuZ2VPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CkBAIC00NjcsNDUgKzQ0NCw2IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZpY2F0aW9uVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLyoKLSAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KE5vdGVzLkNPTlRFTlRfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Tm90ZXMuX0lELCBOb3Rlcy5OT1RFfSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihuZXcgTXlDb250ZW50T2JzZXJ2ZXIodHJ1ZSkpOwotICAgICAgICBpbnQgY291bnQgPSBjLmNvdW50KCk7Ci0KLSAgICAgICAgTXlDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgTXlDb250ZW50T2JzZXJ2ZXIoZmFsc2UpOwotICAgICAgICBtQ29udGVudFJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKE5vdGVzLkNPTlRFTlRfVVJJLCB0cnVlLCBvYnNlcnZlcik7Ci0KLSAgICAgICAgVXJpIHVyaTsKLQotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgdmFsdWVzLnB1dChOb3Rlcy5OT1RFLCAidGVzdCBub3RlMSIpOwotICAgICAgICB1cmkgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChOb3Rlcy5DT05URU5UX1VSSSwgdmFsdWVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIGMucmVxdWVyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQgKyAxLCBjLmNvdW50KCkpOwotICAgICAgICBjLmZpcnN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdCBub3RlMSIsIGMuZ2V0U3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoTm90ZXMuTk9URSkpKTsKLSAgICAgICAgYy51cGRhdGVTdHJpbmcoYy5nZXRDb2x1bW5JbmRleChOb3Rlcy5OT1RFKSwgInRlc3Qgbm90ZTIiKTsKLSAgICAgICAgYy5jb21taXRVcGRhdGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKHVyaSwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgICovCi0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQXJncygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwogICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwpAQCAtOTg5LDIxICs5MjcsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERiQ2xvc2VSZWxlYXNpbmdBbGxDYWNoZWRTcWwoKSB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIHRleHQxIFRFWFQsIHRleHQyIFRFWFQsICIgKwotICAgICAgICAgICAgICAgICJudW0xIElOVEVHRVIsIG51bTIgSU5URUdFUiwgaW1hZ2UgQkxPQik7Iik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZW1lbnQgPSAiREVMRVRFIEZST00gdGVzdCBXSEVSRSBfaWQ9PzsiOwotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50RG9Ob3RDbG9zZSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50RG9Ob3RDbG9zZS5nZXRVbmlxdWVJZCgpID4gMCk7Ci0gICAgICAgIGludCBuU3RhdGVtZW50ID0gc3RhdGVtZW50RG9Ob3RDbG9zZS5nZXRVbmlxdWVJZCgpOwotICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKSA9PSBuU3RhdGVtZW50KTsKLSAgICAgICAgLyogZG8gbm90IGNsb3NlIHN0YXRlbWVudERvTm90Q2xvc2Ugb2JqZWN0LiAKLSAgICAgICAgICogVGhhdCBzaG91bGQgbGVhdmUgaXQgaW4gU1FMaXRlRGF0YWJhc2UubVByb2dyYW1zLgotICAgICAgICAgKiBtRGF0YWJhc2UuY2xvc2UoKSBpbiB0ZWFyRG93bigpIHNob3VsZCByZWxlYXNlIGl0LgotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZW1pY29sb25zSW5TdGF0ZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgcHJhZ21hX3Rlc3QgKCIgKwogICAgICAgICAgICAgICAgICJpIElOVEVHRVIgREVGQVVMVCAxMjM0LCAiICsKQEAgLTEwMjMsNiArOTQ2LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbnNXaXRoQmluZEFyZ3MoKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB1bmlvbnMgd2l0aCBiaW5kYXJncyB3b3JrIGh0dHA6Ly9iL2lzc3VlP2lkPTEwNjEyOTEgKi8KKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBBIChpIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgQiAoayBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIEMgKG4gaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEEgdmFsdWVzKDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQSB2YWx1ZXMoMik7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBBIHZhbHVlcygzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEIgdmFsdWVzKDIwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBCIHZhbHVlcygyMDIpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQiB2YWx1ZXMoMjAzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEMgdmFsdWVzKDkwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBDIHZhbHVlcyg5MDIpOyIpOworICAgICAgICBTdHJpbmcgcyA9ICJzZWxlY3QgaSBmcm9tIEEgd2hlcmUgaSA+IDIgIiArCisgICAgICAgICAgICAgICAgIlVOSU9OIHNlbGVjdCBrIGZyb20gQiB3aGVyZSBrID4gMjAxICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPTkwMDsiOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzLCBudWxsKTsKKyAgICAgICAgaW50IG4gPSBjLmdldENvdW50KCk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgU3RyaW5nIHMxID0gInNlbGVjdCBpIGZyb20gQSB3aGVyZSBpID4gPyAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IGsgZnJvbSBCIHdoZXJlIGsgPiA/ICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPSA/OyI7CisgICAgICAgIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeShzMSwgbmV3IFN0cmluZ1tdeyIyIiwgIjIwMSIsICI5MDAifSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIHRlc3QgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaGFzIGEgbG9jYWxlIHdpdGggdGhlIGxhbmd1YWdlICJqYSIuCiAgICAgICogSXQgZmluaXNoZXMgd2l0aG91dCBmYWlsdXJlIHdoZW4gaXQgaXMgbm90IGF2YWlsYWJsZS4gIApAQCAtMTEwOCw1ICsxMDU5LDExMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gICAgCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNYXhDYWhlc2l6ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSwxKTsiKTsKKyAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisKKyAgICAgICAgLy8gdHJ5IHJlZHVjZSBjYWNoZXNpemUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoMSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJjYW5ub3Qgc2V0IGNhY2hlU2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkgeworICAgICAgICBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZS4gYW5kIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLgorICAgICAgICAvLyBpdCBzaG91bGQgZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlLgorICAgICAgICBGaWxlIGRiZmlsZSA9IG5ldyBGaWxlKG1EYXRhYmFzZS5nZXRQYXRoKCkpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihtRGF0YWJhc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhbiBpbi1tZW1vcnkgZGF0YWJhc2UuIGFuZCBjb3JydXB0aW9uIGhhbmRsZXIgc2hvdWxkbid0IHRyeSB0byBkZWxldGUgaXQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgbWVtb3J5RGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZSgiOm1lbW9yeToiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZW1vcnlEYik7CisgICAgICAgIG1lbW9yeURiLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1lbW9yeURiLmlzT3BlbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24obWVtb3J5RGIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGF0YWJhc2UsIGtlZXAgaXQgb3BlbiwgY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGUgc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGJPYmogPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2UuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9iai5pc09wZW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBkYXRhYmFzZSwgYXR0YWNoIDIgbW9yZSBkYXRhYmFzZXMgdG8gaXQKKyAgICAgICAgLy8gICAgYXR0YWNoZWQgZGF0YWJhc2UgIyAxOiAiOm1lbW9yeToiCisgICAgICAgIC8vICAgIGF0dGFjaGVkIGRhdGFiYXNlICMgMjogbURhdGFiYXNlLmdldFBhdGgoKSArICIxIjsKKyAgICAgICAgLy8gY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGVzIGluY2x1ZGluZyB0aGUgb25lIGZvciBhdHRhY2hlZCBkYXRhYmFzZSAjIDIKKyAgICAgICAgLy8gc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU3RyaW5nIGF0dGFjaGVkRGIxRmlsZSA9IG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiMSI7CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnIiArICBhdHRhY2hlZERiMUZpbGUgKyAiJyBhcyBhdHRhY2hlZERiMSIpOworICAgICAgICBhc3NlcnRUcnVlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYXR0YWNoZWREYjFGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGJPYmopOworICAgICAgICBhc3NlcnRUcnVlKGRiT2JqLmlzT3BlbigpKTsKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShhdHRhY2hlZERiMUZpbGUpLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIGV4Y2VwdCB0aGlzIGlzIGEgYml0IG9mIHN0cmVzcyB0ZXN0aW5nLiBhdHRhY2ggNSBkYXRhYmFzZSBmaWxlcworICAgICAgICAvLyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCByZW1vdmVkLgorICAgICAgICBpbnQgTiA9IDU7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF0dGFjaGVkRGJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihOKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGF0dGFjaGVkRGJGaWxlcy5hZGQobURhdGFiYXNlLmdldFBhdGgoKSArIGkpOworICAgICAgICB9CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJyIgKyAgYXR0YWNoZWREYkZpbGVzLmdldChpKSArICInIGFzIGF0dGFjaGVkRGIiICsgaSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShhdHRhY2hlZERiRmlsZXMuZ2V0KGkpKS5leGlzdHMoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYk9iaik7CisgICAgICAgIGFzc2VydFRydWUoZGJPYmouaXNPcGVuKCkpOworICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKGF0dGFjaGVkRGJGaWxlcy5nZXQoaSkpLmV4aXN0cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1ZGQyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlVGVzdC5DbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9DT05OID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TUUwgPSAic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIGkgPSA/IEFORCBqID0gMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVTVF9TUUxTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgVEVTVF9TUUwsIFRFU1RfU1FMICsgMSwgVEVTVF9TUUwgKyAyLCBURVNUX1NRTCArIDMsIFRFU1RfU1FMICsgNAorICAgIH07CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgbVRlc3RQb29sOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbVRlc3RQb29sID0gbmV3IERhdGFiYXNlQ29ubmVjdGlvblBvb2wobURhdGFiYXNlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtVGVzdFBvb2wpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1UZXN0UG9vbC5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZFJlbGVhc2UoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIC8vIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBsYXppbHkgY3JlYXRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICAvLyBNQVggcG9vbCBzaXplIHNob3VsZCBiZSBzZXQgdG8gTUFYX0NPTk4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCBhIGNvbm5lY3Rpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgLy8gcG9vbCBzaXplIHNob3VsZCBiZSBvbmUgLSBzaW5jZSBvbmx5IG9uZSBzaG91bGQgYmUgYWxsb2NhdGVkIGZvciB0aGUgYWJvdmUgZ2V0KCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIC8vIG5vIGZyZWUgY29ubmVjdGlvbnMgc2hvdWxkIGJlIGF2YWlsYWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiKSk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgc2FtZSBvYmplY3QgYWdhaW4gYW5kIGV4cGVjdCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiKTsKKyAgICAgICAgICAgIGZhaWwoImlsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkLgorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoZSBwb29sIGFuZCBhc2sgZm9yIG9uZSBtb3JlLgorICAgICAqIHNob3VsZCBnZXQgb25lIG9mIHRoZSBjb25uZWN0aW9ucyBhbHJlYWR5IGdvdCBzbyBmYXIuIAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQ29ubkFuZE9uZU1vcmUoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLmFkZChkYik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBwb29sIGlzIG1heGVkIG91dCBhbmQgbm8gZnJlZSBjb25uZWN0aW9ucy4gYXNrIGZvciBvbmUgbW9yZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy5jb250YWlucyhkYjEpKTsKKyAgICAgICAgLy8gcG9vbCBzaXplIHNob3VsZCByZW1haW4gYXQgTUFYX0NPTk4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyByZWxlYXNlIGRiMSBidXQgc2luY2UgaXQgaXMgYWxsb2NhdGVkIDIgdGltZXMsIGl0IHNob3VsZCBzdGlsbCByZW1haW4gJ2J1c3knCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyByZWxlYXNlIGFsbCBjb25uZWN0aW9ucworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiT2Jqcy5nZXQoaSkpOworICAgICAgICB9CisgICAgICAgIC8vIGFsbCBvYmplY3RzIGluIHRoZSBwb29sIHNob3VsZCBiZSBmcmVlZCBub3cKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSBleGNlcHQgdGhhdCBlYWNoIGNvbm5lY3Rpb24gaGFzIGRpZmZlcmVudCBTUUwgc3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC4gCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uUmV0cmlldmFsRm9yUHJldmlvdXNseVNlZW5TcWwoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLnB1dChURVNUX1NRTFNbaV0sIGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHBvb2wgaXMgbWF4ZWQgb3V0IGFuZCBubyBmcmVlIGNvbm5lY3Rpb25zLiBhc2sgZm9yIG9uZSBtb3JlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gdXNlIGEgcHJldmlvdXNseSBzZWVuIFNRTCBzdGF0ZW1lbnQKKyAgICAgICAgU3RyaW5nIHRlc3RTcWwgPSBURVNUX1NRTFNbTUFYX0NPTk4gLSAxXTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiMSwgZGJPYmpzLmdldCh0ZXN0U3FsKSk7CisgICAgICAgIC8vIGRvIHRoZSBzYW1lIGFnYWluCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydEVxdWFscyhkYjIsIGRiT2Jqcy5nZXQodGVzdFNxbCkpOworCisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgcmVtYWluIGF0IE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICAvLyByZWxlYXNlIGRiMSBidXQgc2luY2UgdGhlIHNhbWUgY29ubmVjdGlvbiBpcyBhbGxvY2F0ZWQgMyB0aW1lcywKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHJlbWFpbiAnYnVzeScKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiT2Jqcy5nZXQodGVzdFNxbCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIC8vIHJlbGVhc2UgZGIyIGJ1dCBzaW5jZSB0aGUgc2FtZSBjb25uZWN0aW9uIGlzIGFsbG9jYXRlZCAyIHRpbWVzLAorICAgICAgICAvLyBpdCBzaG91bGQgc3RpbGwgcmVtYWluICdidXN5JworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjIpOworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGJPYmpzLmdldCh0ZXN0U3FsKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgLy8gcmVsZWFzZSBhbGwgY29ubmVjdGlvbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYk9ianMuZ2V0KFRFU1RfU1FMU1tpXSkpOworICAgICAgICB9CisgICAgICAgIC8vIGFsbCBvYmplY3RzIGluIHRoZSBwb29sIHNob3VsZCBiZSBmcmVlZCBub3cKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7CisgICAgICAgIC8vIGdldCB0aGUgZ2l2ZW4gc3FsIGJlIGNvbXBpbGVkIG9uIHRoZSBnaXZlbiBkYXRhYmFzZSBjb25uZWN0aW9uLgorICAgICAgICAvLyB0aGlzIHdpbGwgaGVscCBEYXRhYmFzZUNvbmVuY3Rpb25Qb29sIGZpZ3VyZSBvdXQgaWYgYSBnaXZlbiBTUUwgc3RhdGVtZW50CisgICAgICAgIC8vIGlzIGFscmVhZHkgY2FjaGVkIGJ5IGEgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGRiLCBzcWwpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgY29ubmVjdGlvbiBmb3IgYSBTUUwgc3RhdGVtZW50ICdibGFoJy4gKGNvbm5lY3Rpb25fcykKKyAgICAgKiBtYWtlIHN1cmUgdGhlIHBvb2wgaGFzIGF0IGxlYXN0IG9uZSBmcmVlIGNvbm5lY3Rpb24gZXZlbiBhZnRlciB0aGlzIGdldCgpLgorICAgICAqIGFuZCBnZXQgYSBjb25uZWN0aW9uIGZvciB0aGUgc2FtZSBTUUwgYWdhaW4uCisgICAgICogICAgdGhpcyBjb25uZWN0aW9uIHNob3VsZCBiZSBkaWZmZXJlbnQgZnJvbSBjb25uZWN0aW9uX3MuCisgICAgICogICAgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIFNRTCBwcmUtY29tcGlsZWQsIHNpbmNlIGlzIGl0IG5vdCBmcmVlCisgICAgICogICAgQU5EIHNpbmNlIHRoZSBwb29sIGhhcyBmcmVlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZSwgc2hvdWxkIGdldCBhIG5ldyBjb25uZWN0aW9uLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubkZvclRoZVNhbWVTcWwoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKGRiLCBURVNUX1NRTCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiMS5lcXVhbHMoZGIpKTsKKworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgc2FtZSBjb25uZWN0aW9uIE4gdGltZXMgYW5kIHJlbGVhc2UgaXQgTiB0aW1lcy4KKyAgICAgKiB0aGlzIHRlc3RzIERhdGFiYXNlQ29ubmVjdGlvblBvb2wuUG9vbE9iai5tTnVtSG9sZGVycworICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2FtZUNvbm5OdGltZXNBbmRSZWxlYXNlSXROdGltZXMoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLnB1dChURVNUX1NRTFNbaV0sIGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGV2ZXJ5IGNvbm5lY3Rpb24gaW4gdGhlIHBvb2wgc2hvdWxkIGhhdmUgbnVtSG9sZGVycyA9IDEKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSArKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGkpLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcG9vbCBpcyBtYXhlZCBvdXQgYW5kIG5vIGZyZWUgY29ubmVjdGlvbnMuIGFzayBmb3Igb25lIG1vcmUgY29ubmVjdGlvbgorICAgICAgICAvLyB1c2UgYSBwcmV2aW91c2x5IHNlZW4gU1FMIHN0YXRlbWVudAorICAgICAgICBTdHJpbmcgdGVzdFNxbCA9IFRFU1RfU1FMU1tNQVhfQ09OTiAtIDFdOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KHRlc3RTcWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydFRydWUoZGJPYmpzLnZhbHVlcygpLmNvbnRhaW5zKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIxLCBkYk9ianMuZ2V0KHRlc3RTcWwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sLlBvb2xPYmogcG9vbE9iaiA9IG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGRiMS5tQ29ubmVjdGlvbk51bSAtIDEpOworICAgICAgICBpbnQgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbnVtSG9sZGVycyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gZ2V0IHRoZSBzYW1lIGNvbm5lY3Rpb24gTiB0aW1lcyBtb3JlCisgICAgICAgIGludCBOID0gMTAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYjEsIGRiMik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIyKSk7CisgICAgICAgICAgICAvLyBudW1Ib2xkZXJzIGZvciB0aGlzIG9iamVjdCBzaG91bGQgYmUgbm93IHVwIGJ5IDEKKyAgICAgICAgICAgIGludCBwcmV2ID0gbnVtSG9sZGVyczsKKyAgICAgICAgICAgIG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmV2ICsgMSwgbnVtSG9sZGVycyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpdCBOIHRpbWVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICAgICAgaW50IHByZXYgPSBudW1Ib2xkZXJzOworICAgICAgICAgICAgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByZXYgLSAxLCBudW1Ib2xkZXJzKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aGUgY29ubmVjdGlvbiBzaG91bGQgc3RpbGwgaGF2ZSAyIG1vcmUgaG9sZGVycworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwb29sT2JqLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSAyIG1vcmUgdGltZXMKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBvb2xPYmouZ2V0TnVtSG9sZGVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmVzc1Rlc3QoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+IGRiTWFwID0gbmV3IEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCAxKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGFzayBmb3IgbG90IG1vcmUgY29ubmVjdGlvbnMgYnV0IHNpbmNlIHRoZSBwb29sIGlzIG1heGVkIG91dCwgd2Ugc2hvdWxkIHN0YXJ0IHJlY2VpdmluZworICAgICAgICAvLyBjb25uZWN0aW9ucyB0aGF0IHdlIGFscmVhZHkgZ290IHNvIGZhcgorICAgICAgICBmb3IgKGludCBpID0gTUFYX0NPTk47IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCArIGkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgaW50IGsgPSBkYk1hcC5nZXQoZGIpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCArK2spOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcHJpbnQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGVzIHJlY2VpdmVkLCBzaG91bGQgYmUgdW5pZm9ybS4KKyAgICAgICAgZm9yIChTUUxpdGVEYXRhYmFzZSBkIDogZGJNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNvbm5lY3Rpb24gIyAiICsgZC5tQ29ubmVjdGlvbk51bSArICIsIG51bUhvbGRlcnM6ICIgKyBkYk1hcC5nZXQoZCkpOworICAgICAgICB9CisgICAgICAgIC8vIHByaW50IHRoZSBwb29sIGluZm8KKyAgICAgICAgTG9nLmkoVEFHLCBtVGVzdFBvb2wudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgYWxsCisgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgZCA6IGRiTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBpbnQgbnVtID0gZGJNYXAuZ2V0KGQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiMWQwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgU1FMaXRlQ3Vyc29yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAidGVzdEN1cnNvciI7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgInNxbGl0ZWN1cnNvcl90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgICAgICAvLyBjcmVhdGUgYSB0ZXN0IHRhYmxlCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIFRBQkxFX05BTUUgKyAiIChpIGludCwgaiBpbnQpOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlPYmpSZWFzc2lnbm1lbnQoKSB7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICAvLyBoYXZlIGEgZmV3IGNvbm5lY3Rpb25zIGluIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBwb29sID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbDsKKyAgICAgICAgcG9vbC5zZXRNYXhQb29sU2l6ZSg1KTsKKyAgICAgICAgU1FMaXRlQ3Vyc29yIGN1cnNvciA9CisgICAgICAgICAgICAgICAgKFNRTGl0ZUN1cnNvcikgbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgKiBmcm9tICIgKyBUQUJMRV9OQU1FLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXJzb3IpOworICAgICAgICAvLyBpdCBzaG91bGQgdXNlIGEgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBjdXJzb3IuZ2V0RGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5tQ29ubmVjdGlvbk51bSA+IDApOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIGRiLm1QYXJlbnRDb25uT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwb29sLmdldENvbm5lY3Rpb25MaXN0KCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5pc09wZW4oKSk7CisgICAgICAgIC8vIGRvIGEgcmVxdWVyeS4gY3Vyc29yIHNob3VsZCBjb250aW51ZSB0byB1c2UgdGhlIGFib3ZlIHBvb2xlZCBjb25uZWN0aW9uCisgICAgICAgIGN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiQWdhaW4gPSBjdXJzb3IuZ2V0RGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiLCBkYkFnYWluKTsKKyAgICAgICAgLy8gZGlzYWJsZSBXQUwgc28gdGhhdCB0aGUgcG9vbGVkIGNvbm5lY3Rpb24gaGVsZCBieSB0aGUgYWJvdmUgY3Vyc29yIGlzIGNsb3NlZAorICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgLy8gcmVxdWVyeSAtIHdoaWNoIHNob3VsZCBtYWtlIHRoZSBjdXJzb3IgdXNlIG1EYXRhYmFzZSBjb25uZWN0aW9uIHNpbmNlIHRoZSBwb29sZWQKKyAgICAgICAgLy8gY29ubmVjdGlvbiBpcyBubyBsb25nZXIgYXZhaWxhYmxlCisgICAgICAgIGN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRiMS5tQ29ubmVjdGlvbk51bSA9PSAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIxKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYjEuaXNPcGVuKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIC8vIGVuYWJsZSBXQUwgYW5kIHJlcXVlcnkgLSB0aGlzIHRpbWUgYSBwb29sZWQgY29ubmVjdGlvbiBzaG91bGQgYmUgdXNlZAorICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgZGIgPSBjdXJzb3IuZ2V0RGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5tQ29ubmVjdGlvbk51bSA+IDApOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIGRiLm1QYXJlbnRDb25uT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb25MaXN0KCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5pc09wZW4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhpcyB0ZXN0IGNvdWxkIHRha2UgYSB3aGlsZSB0byBleGVjdXRlLiBzbywgZGVzaWduYXRlIGl0IGFzIExhcmdldFRlc3QKKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGxXaW5kb3coKSB7CisgICAgICAgIC8vIGNyZWF0ZSBzY2hlbWEKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RUYWJsZSA9ICJ0ZXN0ViI7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIHRlc3RUYWJsZSArICIgKGNvbDEgaW50LCBkZXNjIHRleHQgbm90IG51bGwpOyIpOworICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworCisgICAgICAgIC8vIHBvcHVsYXRlIHRoZSB0YWJsZSB3aXRoIGRhdGEKKyAgICAgICAgLy8gY3JlYXRlIGEgYmlnIHN0cmluZyB0aGF0IHdpbGwgYWxtb3N0IGZpdCBhIHBhZ2UgYnV0IG5vdCBxdWl0ZS4KKyAgICAgICAgLy8gc2luY2Ugc3FsaXRlIHdhbnRzIHRvIG1ha2Ugc3VyZSBlYWNoIHJvdyBpcyBpbiBhIHBhZ2UsIHRoaXMgc3RyaW5nIHdpbGwgYWxsb2NhdGUKKyAgICAgICAgLy8gYSBuZXcgZGF0YWJhc2UgcGFnZSBmb3IgZWFjaCByb3cuCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKGkgJSAxMCArICIiKTsKKyAgICAgICAgfQorICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoImRlc2MiLCBidWZmLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIGluc2VydCBtb3JlIHRoYW4gMU1CIG9mIGRhdGEgaW4gdGhlIHRhYmxlLiB0aGlzIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgZW50aXJlIHRhYmxlZGF0YQorICAgICAgICAvLyB3aWxsIG5lZWQgbW9yZSB0aGFuIG9uZSBDdXJzb3JXaW5kb3cKKyAgICAgICAgaW50IE4gPSA1MDAwOworICAgICAgICBTZXQ8SW50ZWdlcj4gcm93cyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJjb2wxIiwgaik7CisgICAgICAgICAgICBtRGF0YWJhc2UuaW5zZXJ0KHRlc3RUYWJsZSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgICAgIHJvd3MuYWRkKGopOyAvLyBzdG9yZSBpbiBhIGhhc2h0YWJsZSBzbyB3ZSBjYW4gdmVyaWZ5IHRoZSByZXN1bHRzIGZyb20gY3Vyc29yIGxhdGVyIG9uCisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE4sIHJvd3Muc2l6ZSgpKTsKKyAgICAgICAgQ3Vyc29yIGMxID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgKiBmcm9tICIgKyB0ZXN0VGFibGUsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoTiwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIGMxLmNsb3NlKCk7CisKKyAgICAgICAgLy8gc2Nyb2xsIHRocm91Z2ggQUxMIGRhdGEgaW4gdGhlIHRhYmxlIHVzaW5nIGEgY3Vyc29yLiBzaG91bGQgY2F1c2UgbXVsdGlwbGUgY2FsbHMgdG8KKyAgICAgICAgLy8gbmF0aXZlX2ZpbGxfd2luZG93IChhbmQgcmUtZmlsbHMgb2YgdGhlIEN1cnNvcldpbmRvdyBvYmplY3QpCisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnF1ZXJ5KHRlc3RUYWJsZSwgbmV3IFN0cmluZ1tdeyJjb2wxIiwgImRlc2MifSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgIGludCB2YWwgPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocm93cy5jb250YWlucyh2YWwpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocm93cy5yZW1vdmUodmFsKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZGlkIEkgc2VlIGFsbCB0aGUgcm93cyBpbiB0aGUgdGFibGU/CisgICAgICAgIGFzc2VydFRydWUocm93cy5pc0VtcHR5KCkpOworCisgICAgICAgIC8vIGNoYW5nZSBkYXRhIGFuZCBtYWtlIHN1cmUgdGhlIGN1cnNvciBwaWNrcyB1cCBuZXcgZGF0YSAmIGNvdW50CisgICAgICAgIHJvd3MgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBpbnQgTSA9IE4gKyAxMDAwOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE07IGorKykgeworICAgICAgICAgICAgcm93cy5hZGQoaik7CisgICAgICAgICAgICBpZiAoaiA8IE4pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImNvbDEiLCBqKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5pbnNlcnQodGVzdFRhYmxlLCBudWxsLCB2YWx1ZXMpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhNLCByb3dzLnNpemUoKSk7CisgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gYy5nZXRJbnQoMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJvd3MuY29udGFpbnModmFsKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJvd3MucmVtb3ZlKHZhbCkpOworICAgICAgICB9CisgICAgICAgIC8vIGRpZCBJIHNlZSBhbGwgZGF0YSBmcm9tIHRoZSBtb2RpZmllZCB0YWJsZQorICAgICAgICBhc3NlcnRUcnVlKHJvd3MuaXNFbXB0eSgpKTsKKworICAgICAgICAvLyBtb3ZlIGN1cnNvciBiYWNrIHRvIDFzdCByb3cgYW5kIHNjcm9sbCB0byBhYm91dCBoYWxmd2F5IGluIHRoZSByZXN1bHQgc2V0CisgICAgICAgIC8vIGFuZCB0aGVuIGRlbGV0ZSA3NSUgb2YgZGF0YSAtIGFuZCB0aGVuIGRvIHJlcXVlcnkKKyAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICBpbnQgSyA9IE4gLyAyOworICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IEsgJiYgYy5tb3ZlVG9OZXh0KCk7IHArKykgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyAtIGp1c3Qgc2Nyb2xsaW5nIHRvIGFib3V0IGhhbGYtcG9pbnQgaW4gdGhlIHJlc3VsdHNldAorICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1EYXRhYmFzZS5kZWxldGUodGVzdFRhYmxlLCAiY29sMSA8ID8iLCBuZXcgU3RyaW5nW117ICgzICogTSAvIDQpICsgIiJ9KTsKKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhNIC8gNCwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAvLyBqdXN0IG1vdmUgdGhlIGN1cnNvciB0byBuZXh0IHJvdyAtIHRvIG1ha2Ugc3VyZSBpdCBjYW4gZ28gdGhyb3VnaCB0aGUgZW50aXJlCisgICAgICAgICAgICAvLyByZXN1bHRzZXQgd2l0aG91dCBhbnkgcHJvYmxlbXMKKyAgICAgICAgfQorICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjU4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSw5MjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlN1cHByZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworcHVibGljIGNsYXNzIFNRTGl0ZURhdGFiYXNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEYXRhYmFzZUdlbmVyYWxUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9UQUJMRSA9ICJ0ZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OID0gNDI7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOU0VSVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQREFURSA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEVURSA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX05BTUUgPSAiZGF0YWJhc2VfdGVzdC5kYiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBkYlNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGJUZWFyZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlRlYXJkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCBEQl9OQU1FKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIG1EYXRhYmFzZS5zZXRWZXJzaW9uKENVUlJFTlRfREFUQUJBU0VfVkVSU0lPTik7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBwb29sID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbDsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwb29sKTsKKyAgICAgICAgLy8gbWFrZSB0aGUgc2FtZSBjYWxsIGFnYWluIGFuZCBtYWtlIHN1cmUgdGhlIHBvb2wgYWxyZWFkeSBzZXR1cCBpcyBub3QgcmUtY3JlYXRlZAorICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvb2wsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHRlc3QgKGkgaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIC8vIGdldCBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbURhdGFiYXNlLmdldERiQ29ubmVjdGlvbigic2VsZWN0ICogZnJvbSB0ZXN0Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGIpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBkaXNhYmxlIFdBTCAtIHdoaWNoIHNob3VsZCBjbG9zZSBjb25uZWN0aW9uIHBvb2wgYW5kIGFsbCBwb29sZWQgY29ubmVjdGlvbnMKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRGYWxzZShkYi5pc09wZW4oKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JzV2l0aENsb3NlZERiQ29ubkFmdGVyRGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCBhIGN1cnNvciB3aGljaCBzaG91bGQgdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgKiBmcm9tIHRlc3QiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb25MaXN0KCkuZ2V0KDApOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKyAgICAgICAgLy8gZGlzYWJsZSBXQUwgLSB3aGljaCBzaG91bGQgY2xvc2UgY29ubmVjdGlvbiBwb29sIGFuZCBhbGwgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBjdXJzb3IgZGF0YSBzaG91bGQgc3RpbGwgYmUgYWNjZXNzaWJsZSBiZWNhdXNlIGl0IGlzIGZldGNoaW5nIGRhdGEgZnJvbSBDdXJzb3JXaW5kb3cKKyAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldEludCgwKSk7CisgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldEludCgwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBzdGFydGVkIGJlZm9yZSBhIHN0YW5kYWxvbmUtdXBkYXRlL2luc2VydC9kZWxldGUgc3RhdGVtZW50CisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKElOU0VSVCk7CisgICAgICAgIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoVVBEQVRFKTsKKyAgICAgICAgcnVuVGVzdEZvclN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbChERUxFVEUpOworICAgIH0KKyAgICBwcml2YXRlIHZvaWQgcnVuVGVzdEZvclN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbChpbnQgc3RtdFR5cGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgLy8gbWFrZSBzb21lIGNoYW5nZXMgdG8gZGF0YSBpbiBURVNUX1RBQkxFCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJpIiwgaSk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJqIiwgImkiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgbURhdGFiYXNlLmluc2VydChURVNUX1RBQkxFLCBudWxsLCB2YWx1ZXMpOworICAgICAgICAgICAgc3dpdGNoIChzdG10VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJqIiwgInUiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UudXBkYXRlKFRFU1RfVEFCTEUsIHZhbHVlcywgImkgPSAiICsgaSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFOgorICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGVsZXRlKFRFU1RfVEFCTEUsICJpID0gMSIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBkbyBhIHF1ZXJ5LiBldmVuIHRob3VnaCBxdWVyeSB1c2VzIGEgZGlmZmVyZW50IGRhdGFiYXNlIGNvbm5lY3Rpb24sCisgICAgICAgIC8vIGl0IHNob3VsZCBzdGlsbCBzZWUgdGhlIGFib3ZlIGNoYW5nZXMgdG8gZGF0YSBiZWNhdXNlIHRoZSBhYm92ZSBzdGFuZGFsb25lCisgICAgICAgIC8vIGluc2VydC91cGRhdGUvZGVsZXRlcyBhcmUgZG9uZSBpbiB0cmFuc2FjdGlvbnMgYXV0b21hdGljYWxseS4KKyAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzcWwpOworICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRWYWx1ZSA9IChzdG10VHlwZSA9PSBERUxFVEUpID8gNCA6IDU7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpKTsKKyAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgYy5nZXRMb25nKDApKTsKKyAgICAgICAgYy5jbG9zZSgpOworCisgICAgICAgIC8vIGRvIDUgbW9yZSBjaGFuZ2VzIGluIGEgdHJhbnNhY3Rpb24gYnV0IGRvIGEgcXVlcnkgYmVmb3JlIGFuZCBhZnRlciB0aGUgY29tbWl0CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAxMDsgaSA8IDE1OyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImkiLCBpKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImoiLCAiaSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICBtRGF0YWJhc2UuaW5zZXJ0KFRFU1RfVEFCTEUsIG51bGwsIHZhbHVlcyk7CisgICAgICAgICAgICBzd2l0Y2ggKHN0bXRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoImoiLCAidSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51cGRhdGUoVEVTVF9UQUJMRSwgdmFsdWVzLCAiaSA9ICIgKyBpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5kZWxldGUoVEVTVF9UQUJMRSwgImkgPSAxIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgLy8gZG8gYSBxdWVyeSBiZWZvcmUgY29tbWl0IC0gc2hvdWxkIHN0aWxsIGhhdmUgNSByb3dzCisgICAgICAgIC8vIHRoaXMgcXVlcnkgc2hvdWxkIHJ1biBpbiBhIGRpZmZlcmVudCB0aHJlYWQgdG8gZm9yY2UgaXQgdG8gdXNlIGEgZGlmZmVyZW50IGRhdGFiYXNlCisgICAgICAgIC8vIGNvbm5lY3Rpb24KKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFOworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gZ2V0RGIoKS5jb21waWxlU3RhdGVtZW50KHNxbCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHN0bXQuc2ltcGxlUXVlcnlGb3JMb25nKCkpOworICAgICAgICAgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBDdXJzb3IgYyA9IGdldERiKCkucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGMuZ2V0TG9uZygwKSk7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIGFib3ZlIHRocmVhZCBpcyBkb25lCisgICAgICAgIHQuam9pbigpOworICAgICAgICAvLyBjb21taXQgYW5kIHRoZW4gcXVlcnkuIHNob3VsZCBzZWUgY2hhbmdlcyBmcm9tIHRoZSB0cmFuc2FjdGlvbgorICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHNxbCk7CisgICAgICAgIGZpbmFsIGludCBleHBlY3RlZFZhbHVlMiA9IChzdG10VHlwZSA9PSBERUxFVEUpID8gOSA6IDEwOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZTIsIHN0bXQuc2ltcGxlUXVlcnlGb3JMb25nKCkpOworICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUyLCBjLmdldExvbmcoMCkpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNRTGl0ZURhdGFiYXNlIGdldERiKCkgeworICAgICAgICByZXR1cm4gbURhdGFiYXNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgcmVhZGVycyBhcmUgYWJsZSB0byByZWFkIHRoZSBkYXRhYmFzZSBkYXRhIChvbGQgdmVyc2lvbnMpCisgICAgICogRVZFTiBXSEVOIHRoZSB3cml0ZXIgaXMgaW4gYSB0cmFuc2FjdGlvbiBvbiB0aGUgc2FtZSBkYXRhYmFzZS4KKyAgICAgKjxwPgorICAgICAqIFRoaXMgdGVzdCBzdGFydHMgMSBXcml0ZXIgYW5kIDIgUmVhZGVycyBhbmQgc2V0cyB1cCBjb25uZWN0aW9uIHBvb2wgZm9yIHJlYWRlcnMKKyAgICAgKiBieSBjYWxsaW5nIHRoZSBtZXRob2Qge0BsaW5rIFNRTGl0ZURhdGFiYXNlI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LgorICAgICAqIDxwPgorICAgICAqIFdyaXRlciBkb2VzIHRoZSBmb2xsb3dpbmcgaW4gYSB0aWdodCBsb29wCisgICAgICogPHByZT4KKyAgICAgKiAgICAgYmVnaW4gdHJhbnNhY3Rpb24KKyAgICAgKiAgICAgaW5zZXJ0IGludG8gdGFibGVfMQorICAgICAqICAgICBpbnNlcnQgaW50byB0YWJsZV8yCisgICAgICogICAgIGNvbW1pdAorICAgICAqIDwvcHJlPgorICAgICAqIDxwPgorICAgICAqIEFzIGxvbmcgYSB0aGUgd3JpdGVyIGlzIGFsaXZlLCBSZWFkZXJzIGRvIHRoZSBmb2xsb3dpbmcgaW4gYSB0aWdodCBsb29wIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBSZWFkZXJfSyBkb2VzICJzZWxlY3QgY291bnQoKikgZnJvbSB0YWJsZV9LIiAgd2hlcmUgSyA9IDEgb3IgMgorICAgICAqIDwvcHJlPgorICAgICAqIDxwPgorICAgICAqIFRoZSB0ZXN0IGlzIHJ1biBmb3IgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SIHNlYy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdGVzdCBpcyByZXBlYXRlZCBmb3IgZGlmZmVyZW50IGNvbm5lY3Rpb24tcG9vbC1zaXplcyAoMS4uMykKKyAgICAgKiA8cD4KKyAgICAgKiBBbmQgYXQgdGhlIGVuZCBvZiBvZiBlYWNoIHRlc3QsIHRoZSBmb2xsb3dpbmcgc3RhdGlzdGljcyBhcmUgcHJpbnRlZAorICAgICAqIDx1bD4KKyAgICAgKiAgICA8bGk+Y29ubmVjdGlvbi1wb29sLXNpemU8L2xpPgorICAgICAqICAgIDxsaT5udW1iZXItb2YtdHJhbnNhY3Rpb25zIGJ5IHdyaXRlcjwvbGk+CisgICAgICogICAgPGxpPm51bWJlciBvZiByZWFkcyBieSByZWFkZXJfSyB3aGlsZSB0aGUgd3JpdGVyIGlzIElOIG9yIE5PVC1JTiB4YWN0aW9uPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBAU3VwcHJlc3MgLy8gcnVuIHRoaXMgdGVzdCBvbmx5IGlmIHlvdSBuZWVkIHRvIGNvbGxlY3QgdGhlIG51bWJlcnMgZnJvbSB0aGlzIHRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVuY3lFZmZlY3RzT2ZDb25uUG9vbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBydW4gdGhlIHRlc3Qgd2l0aCBzcWxpdGUgV0FMIGVuYWJsZQorICAgICAgICBydW5Db25uZWN0aW9uUG9vbFRlc3QodHJ1ZSk7CisKKyAgICAgICAgLy8gcnVuIHRoZSBzYW1lIHRlc3QgV0lUSE9VVCBzcWxpdGUgV0FMIGVuYWJsZWQKKyAgICAgICAgcnVuQ29ubmVjdGlvblBvb2xUZXN0KGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuQ29ubmVjdGlvblBvb2xUZXN0KGJvb2xlYW4gdXNlV2FsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IE0gPSAzOworICAgICAgICBTdHJpbmdCdWlsZGVyW10gYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyW01dOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgeworICAgICAgICAgICAgaWYgKHVzZVdhbCkgeworICAgICAgICAgICAgICAgIC8vIHNldCB1cCBjb25uZWN0aW9uIHBvb2wKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLnNldE1heFBvb2xTaXplKGkgKyAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0MSAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdDIgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyBrKyspIHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDEgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtrKyIiLCBrKyIifSk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHQyIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aysiIiwgaysiIn0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IGEgd3JpdGVyCisgICAgICAgICAgICBXcml0ZXIgdyA9IG5ldyBXcml0ZXIobURhdGFiYXNlKTsKKworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBhbiBhcnJheSBvZiBjb3VudGVycyB0byBiZSBwYXNzZWQgdG8gdGhlIHJlYWRlcnMKKyAgICAgICAgICAgIFJlYWRlciByMSA9IG5ldyBSZWFkZXIobURhdGFiYXNlLCAidDEiLCB3LCAwKTsKKyAgICAgICAgICAgIFJlYWRlciByMiA9IG5ldyBSZWFkZXIobURhdGFiYXNlLCAidDIiLCB3LCAxKTsKKyAgICAgICAgICAgIHcuc3RhcnQoKTsKKyAgICAgICAgICAgIHIxLnN0YXJ0KCk7CisgICAgICAgICAgICByMi5zdGFydCgpOworCisgICAgICAgICAgICAvLyB3YWl0IGZvciBhbGwgdGhyZWFkcyB0byBkaWUKKyAgICAgICAgICAgIHcuam9pbigpOworICAgICAgICAgICAgcjEuam9pbigpOworICAgICAgICAgICAgcjIuam9pbigpOworCisgICAgICAgICAgICAvLyBwcmludCB0aGUgc3RhdHMKKyAgICAgICAgICAgIGludFtdW10gY291bnRzID0gZ2V0Q291bnRzKCk7CisgICAgICAgICAgICBidWZmW2ldID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCJjb25ucG9vbC1zaXplID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChpICsgMSk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiLCBudW0geGFjdHMgYnkgd3JpdGVyID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChnZXROdW1YYWN0cygpKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCIsIG51bS1yZWFkcy1pbi14YWN0L05PVC1pbi14YWN0IGJ5IHJlYWRlcjEgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGNvdW50c1swXVsxXSArICIvIiArIGNvdW50c1swXVswXSk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiLCBieSByZWFkZXIyID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChjb3VudHNbMV1bMV0gKyAiLyIgKyBjb3VudHNbMV1bMF0pOworCisgICAgICAgICAgICBMb2cuaShUQUcsICJkb25lIHRlc3RpbmcgZm9yIGNvbm4tcG9vbC1zaXplIG9mICIgKyAoaSsxKSk7CisKKyAgICAgICAgICAgIGRiVGVhcmRvd24oKTsKKyAgICAgICAgICAgIGRiU2V0VXAoKTsKKyAgICAgICAgfQorICAgICAgICBMb2cuaShUQUcsICJkdXJhdGlvbiBvZiB0ZXN0ICIgKyBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1IgKyAiIHNlYyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCBidWZmW2ldLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluWGFjdCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG51bVhhY3RzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1IgPSAxNTsgLy8gbnVtIHNlYyB0aGlzIHRlc3Qgc2hvdWxkIHJ1bgorICAgIHByaXZhdGUgaW50W11bXSBjb3VudHMgPSBuZXcgaW50WzJdWzJdOworCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpblhhY3QoKSB7CisgICAgICAgIHJldHVybiBpblhhY3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJblhhY3RGbGFnKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpblhhY3QgPSBmbGFnOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0Q291bnRzKGludCByZWFkZXJOdW0sIGludFtdIG51bVJlYWRzKSB7CisgICAgICAgIGNvdW50c1tyZWFkZXJOdW1dWzBdID0gbnVtUmVhZHNbMF07CisgICAgICAgIGNvdW50c1tyZWFkZXJOdW1dWzFdID0gbnVtUmVhZHNbMV07CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50W11bXSBnZXRDb3VudHMoKSB7CisgICAgICAgIHJldHVybiBjb3VudHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXROdW1YYWN0cyhpbnQgbnVtKSB7CisgICAgICAgIG51bVhhY3RzID0gbnVtOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXROdW1YYWN0cygpIHsKKyAgICAgICAgcmV0dXJuIG51bVhhY3RzOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgV3JpdGVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBkYiA9IG51bGw7CisgICAgICAgIHB1YmxpYyBXcml0ZXIoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIHRoaXMuZGIgPSBkYjsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgLy8gaW4gYSBsb29wLCBmb3IgTiBzZWMsIGRvIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgIC8vICAgIEJFR0lOIHRyYW5zYWN0aW9uCisgICAgICAgICAgICAvLyAgICBpbnNlcnQgaW50byB0YWJsZSB0MSwgdDIKKyAgICAgICAgICAgIC8vICAgIENvbW1pdAorICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgZm9yIChrID0gMDsoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBub3cpIC8gMTAwMCA8IFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUjsgaysrKSB7CisgICAgICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICAgICAgICAgIHNldEluWGFjdEZsYWcodHJ1ZSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoImluc2VydCBpbnRvIHQxIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aSsiIiwgaSsiIn0pOworICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJpbnNlcnQgaW50byB0MiB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2krIiIsIGkrIiJ9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICAgICAgc2V0SW5YYWN0RmxhZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE51bVhhY3RzKGspOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZWFkZXIgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGFibGUgPSBudWxsOworICAgICAgICBwcml2YXRlIFdyaXRlciB3ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcmVhZGVyTnVtOworICAgICAgICBwcml2YXRlIGludFtdIG51bVJlYWRzID0gbmV3IGludFsyXTsKKyAgICAgICAgcHVibGljIFJlYWRlcihTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHRhYmxlLCBXcml0ZXIgdywgaW50IHJlYWRlck51bSkgeworICAgICAgICAgICAgdGhpcy5kYiA9IGRiOworICAgICAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlOworICAgICAgICAgICAgdGhpcy53ID0gdzsKKyAgICAgICAgICAgIHRoaXMucmVhZGVyTnVtID0gcmVhZGVyTnVtOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAvLyB3aGlsZSB0aGUgd3JpdGUgaXMgYWxpdmUsIGluIGEgbG9vcCBkbyB0aGUgcXVlcnkgb24gYSB0YWJsZQorICAgICAgICAgICAgd2hpbGUgKHcuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLCAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIHRoaXMudGFibGUsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY291bnQgb2YgcmVhZHMKKyAgICAgICAgICAgICAgICAgICAgbnVtUmVhZHNbaW5YYWN0KCkgPyAxIDogMF0gKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDb3VudHMocmVhZGVyTnVtLCBudW1SZWFkcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGV4dGVuZHMgU1FMaXRlUHJvZ3JhbSB7CisgICAgICAgIHByaXZhdGUgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKKyAgICAgICAgICAgIHN1cGVyKGRiLCBzcWwpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgY3JlYXRlKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7CisgICAgICAgICAgICBkYi5sb2NrKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcoZGIsIHNxbCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGRiLnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMcnVDYWNoaW5nT2ZTcWxpdGVDb21waWxlZFNxbE9ianMoKSB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBzZXQgY2FjaGUgc2l6ZQorICAgICAgICBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgbURhdGFiYXNlLnNldE1heFNxbENhY2hlU2l6ZShOKTsKKworICAgICAgICAvLyBkbyBOKzEgcXVlcmllcyAtIGFuZCB3aGVuIHRoZSAwdGggZW50cnkgaXMgcmVtb3ZlZCBmcm9tIExSVSBjYWNoZSBkdWUgdG8gdGhlCisgICAgICAgIC8vIGluc2VydGlvbiBvZiAoTisxKXRoIGVudHJ5LCBtYWtlIHN1cmUgMHRoIGVudHJ5IGlzIGNsb3NlZAorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RtdE9ianMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHNxbFN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgaW50IHN0bXQwID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOKzE7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHMgPSAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiLD8pOyI7CisgICAgICAgICAgICBzcWxTdHJpbmdzLmFkZChzKTsKKyAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLCBzKTsKKyAgICAgICAgICAgIGludCBuID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgc3RtdE9ianMuYWRkKGksIG4pOworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIHN0YXRlbWVudElkIG9mIHRoaXMgb2JqLiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBpdCBpcyB0aHJvd24gb3V0IG9mCisgICAgICAgICAgICAgICAgLy8gdGhlIGNhY2hlIGF0IHRoZSBlbmQgb2YgdGhpcyB0ZXN0LgorICAgICAgICAgICAgICAgIHN0bXQwID0gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpcyAwJ3RoIGVudHJ5IG91dCBvZiB0aGUgY2FjaGU/IGl0IHNob3VsZCBiZSBpbiB0aGUgbGlzdCBvZiBzdGF0ZW1lbnRJZHMKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgcHJlLWNvbXBpbGVkIHNxbCBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZC4KKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpLmNvbnRhaW5zKHN0bXQwKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTisxOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBTcWwgPSBtRGF0YWJhc2UuZ2V0Q29tcGlsZWRTdGF0ZW1lbnRGb3JTcWwoc3FsU3RyaW5ncy5nZXQoaSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21wU3FsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3RtdE9ianMuY29udGFpbnMoY29tcFNxbC5uU3RhdGVtZW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYkNsb3NlUmVsZWFzaW5nQWxsQ2FjaGVkU3FsKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCB0ZXh0MSBURVhULCB0ZXh0MiBURVhULCAiICsKKyAgICAgICAgICAgICAgICAibnVtMSBJTlRFR0VSLCBudW0yIElOVEVHRVIsIGltYWdlIEJMT0IpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RhdGVtZW50ID0gIkRFTEVURSBGUk9NIHRlc3QgV0hFUkUgX2lkPT87IjsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudERvTm90Q2xvc2UgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgICAgICBzdGF0ZW1lbnREb05vdENsb3NlLmJpbmRMb25nKDEsIDEpOworICAgICAgICAvKiBkbyBub3QgY2xvc2Ugc3RhdGVtZW50RG9Ob3RDbG9zZSBvYmplY3QuCisgICAgICAgICAqIFRoYXQgc2hvdWxkIGxlYXZlIGl0IGluIFNRTGl0ZURhdGFiYXNlLm1Qcm9ncmFtcy4KKyAgICAgICAgICogbURhdGFiYXNlLmNsb3NlKCkgaW4gdGVhckRvd24oKSBzaG91bGQgcmVsZWFzZSBpdC4KKyAgICAgICAgICovCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIFRFU1RfVEFCTEUpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyBURVNUX1RBQkxFICsgIiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgIC8vIGZsdXNoIHRoZSBhYm92ZSBzdGF0ZW1lbnQgZnJvbSBjYWNoZSBhbmQgY2xvc2UgYWxsIHRoZSBwZW5kaW5nIHN0YXRlbWVudHMgdG8gYmUgcmVsZWFzZWQKKyAgICAgICAgbURhdGFiYXNlLmRlYWxsb2NDYWNoZWRTcWxTdGF0ZW1lbnRzKCk7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGVtZW50IGZpbmFsaXphdGlvbnMgYXJlIG5vdCBkb25lIHJpZ2h0IGF3YXkgYnV0CisgICAgICogcGlnZ3ktYmFja2VkIG9udG8gdGhlIG5leHQgc3FsIHN0YXRlbWVudCBleGVjdXRpb24gb24gdGhlIHNhbWUgZGF0YWJhc2UuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZSgpIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZQorICAgICAgICBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgbURhdGFiYXNlLnNldE1heFNxbENhY2hlU2l6ZShOKTsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7CisgICAgICAgIGludCBzdG10MElkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpICsrKSB7CisgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiLCA/KTsiKTsKKyAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RtdDBJZCA9IGMuZ2V0U3FsU3RhdGVtZW50SWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgc3RtdDEgPQorICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMTAwLCA/KTsiKTsKKyAgICAgICAgc3RtdDEuY2xvc2UoKTsKKworICAgICAgICAvLyB0aGUgYWJvdmUgY2xvc2UoKSBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RhdGVtZW50IGZvciBmaW5hbGl6YXRpb24KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKKworICAgICAgICAvLyBleGVjdXRlIHNvbWV0aGluZyB0byBzZWUgaWYgdGhpcyBzdGF0ZW1lbnQgZ2V0cyBmaW5hbGl6ZWQKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImRlbGV0ZSBmcm9tIHRlc3Qgd2hlcmUgaSA9IDEwOyIpOworICAgICAgICBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRGYWxzZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoc3RtdDBJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgLSBleGNlcHQgdGhhdCB0aGUgc3RhdGVtZW50IHRvIGJlIGZpbmFsaXplZCBpcyBmcm9tIFRocmVhZCAjIDEuCisgICAgICogYW5kIGl0IGlzIGV2ZW50dWFsbHkgZmluYWxpemVkIGluIFRocmVhZCAjIDIgd2hlbiBpdCBleGVjdXRlcyBhIFNRTCBzdGF0ZW1lbnQuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2VEaWZmVGhyZWFkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIGZpbmFsIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2UgaW4gYSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiwgPyk7Iik7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2gKKyAgICAgICAgdDEuam9pbigpOworICAgICAgICAvLyBtRGF0YWJhc2Ugc2hvdWxkbid0IGhhdmUgYW55IHN0YXRlbWVudHMgdG8gYmUgcmVsZWFzZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCkuc2l6ZSgpKTsKKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIC8vIGp1c3QgZm9yIHRoZSBoZWNrIG9mIGl0LCBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBzdG10MSA9CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxMDAsID8pOyIpOworICAgICAgICAgICAgICAgIHN0bXQxLmJpbmRMb25nKDEsIDEpOworICAgICAgICAgICAgICAgIHN0bXQxLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgIHQyLmpvaW4oKTsKKworICAgICAgICAvLyBjbG9zZSgpIGluIHRoZSBhYm92ZSB0aHJlYWQgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0bXQwSWQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gZ2V0RGIoKS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50SWRzLmNvbnRhaW5zKGdldFN0bXQwSWQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBzb21ldGhpbmcgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IGdldHMgZmluYWxpemVkCisgICAgICAgIC8vIGFnYWluIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MyA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGdldERiKCkuZXhlY1NRTCgiZGVsZXRlIGZyb20gdGVzdCB3aGVyZSBpID0gMTA7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQzLnN0YXJ0KCk7CisgICAgICAgIHQzLmpvaW4oKTsKKworICAgICAgICAvLyBpcyB0aGUgc3RhdGVtZW50IGZpbmFsaXplZD8KKyAgICAgICAgc3RhdGVtZW50SWRzID0gZ2V0RGIoKS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHN0YXRlbWVudElkcy5jb250YWlucyhnZXRTdG10MElkKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBzdG10MElkID0gMDsKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnQgZ2V0U3RtdDBJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RtdDBJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzYW1lIGFzIGFib3ZlIC0gZXhjZXB0IHRoYXQgdGhlIHF1ZXVlIG9mIHN0YXRlbWVudHMgdG8gYmUgZmluYWxpemVkIGFyZSBmaW5hbGl6ZWQKKyAgICAgKiBieSBkYXRhYmFzZSBjbG9zZSgpIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudENsb3NlQnlEYkNsb3NlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZSBpbiBhIHRocmVhZAorICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgICAgICAgICBnZXREYigpLnNldE1heFNxbENhY2hlU2l6ZShOKTsKKyAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiLCA/KTsiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiAwdGggZW50cnkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RtdDBJZCA9IGMuZ2V0U3FsU3RhdGVtZW50SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaAorICAgICAgICB0MS5qb2luKCk7CisKKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQorICAgICAgICAvLyBqdXN0IGZvciB0aGUgaGVjayBvZiBpdCwgZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgc3RtdDEgPQorICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxMDAsID8pOyIpOworICAgICAgICAgICAgICAgIHN0bXQxLmJpbmRMb25nKDEsIDEpOworICAgICAgICAgICAgICAgIHN0bXQxLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgIHQyLmpvaW4oKTsKKworICAgICAgICAvLyBjbG9zZSgpIGluIHRoZSBhYm92ZSB0aHJlYWQgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRTdG10MElkKCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoc3RtdDBJZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisKKyAgICAgICAgLy8gY2xvc2UgdGhlIGRhdGFiYXNlLiBldmVyeXRoaW5nIGZyb20gbUNsb3NlZFN0YXRlbWVudElkcyBpbiBtRGF0YWJhc2UKKyAgICAgICAgLy8gc2hvdWxkIGJlIGZpbmFsaXplZCBhbmQgY2xlYXJlZCBmcm9tIHRoZSBsaXN0CisgICAgICAgIC8vIGFnYWluIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MyA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGdldERiKCkuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDMuc3RhcnQoKTsKKyAgICAgICAgdDMuam9pbigpOworCisgICAgICAgIC8vIGNoZWNrIG1DbG9zZWRTdGF0ZW1lbnRJZHMgaW4gbURhdGFiYXNlLiBpdCBzaG91bGQgYmUgZW1wdHkKKyAgICAgICAgc3RhdGVtZW50SWRzID0gZ2V0RGIoKS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgdGVzdHMgdXNhZ2UgZXhlY1NRTCgpIHRvIGJlZ2luIHRyYW5zYWN0aW9uIHdvcmtzIGluIHRoZSBmb2xsb3dpbmcgd2F5CisgICAgICogICBUaHJlYWQgIzEgZG9lcworICAgICAqICAgICAgIGV4ZWNTUUwoImJlZ2luIHRyYW5zYWN0aW9uIik7CisgICAgICogICAgICAgaW5zZXJ0KCkKKyAgICAgKiAgIFRocmVhZCAjIDIKKyAgICAgKiAgICAgICBxdWVyeSgpCisgICAgICogICBUaHJlYWQjMSAoImVuZCB0cmFuc2FjdGlvbiIpCisgICAgICogVGhyZWFkICMgMiBxdWVyeSB3aWxsIGV4ZWN1dGUgLSBiZWNhdXNlIGphdmEgbGF5ZXIgd2lsbCBub3QgaGF2ZSBsb2NrZWQgdGhlIFNRTGl0ZURhdGFiYXNlCisgICAgICogb2JqZWN0IGFuZCBzcWxpdGUgd2lsbCBjb25zaWRlciB0aGlzIHF1ZXJ5IHRvIGJlIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogYnV0IGlmIHRocmVhZCAjIDEgdXNlcyBiZWdpblRyYW5zYWN0aW9uKCkgaW5zdGVhZCBvZiBleGVjU1FMKCkgdG8gc3RhcnQgdHJhbnNhY3Rpb24sCisgICAgICogdGhlbiBUaHJlYWQgIyAyJ3MgcXVlcnkgd2lsbCBoYXZlIGJlZW4gYmxvY2tlZCBieSBqYXZhIGxheWVyCisgICAgICogdW50aWwgVGhyZWFkIzEgZW5kcyB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBydW5FeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKCJFTkQiKTsKKyAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSwgaW5zdGVhZCBub3cgZG8gIkNPTU1JVCIgb3IgIlJPTExCQUNLIiBpbnN0ZWFkIG9mICJFTkQiIHRyYW5zYWN0aW9uCisgICAgICAgIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oIkNPTU1JVCIpOworICAgICAgICBydW5FeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKCJST0xMQkFDSyIpOworICAgIH0KKyAgICBwcml2YXRlIHZvaWQgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbihTdHJpbmcgc3RyKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gZGlzYWJsZSBXQUwganVzdCBzbyBxdWVyaWVzIGFuZCB1cGRhdGVzIHVzZSB0aGUgc2FtZSBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIik7CisgICAgICAgIC8vIGV2ZW4gdGhvdWdoIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCkgaXMgbm90IGNhbGxlZCB0byBzdGFydCB0cmFuc2FjdGlvbiwKKyAgICAgICAgLy8gbURhdGFiYXNlIGNvbm5lY3Rpb24gc2hvdWxkIG5vdyBiZSBpbiB0cmFuc2FjdGlvbiBhcyBhIHJlc3VsdCBvZgorICAgICAgICAvLyBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKQorICAgICAgICAvLyBidXQgbURhdGFiYXNlLm1Mb2NrIHNob3VsZCBub3QgYmUgaGVsZCBieSBhbnkgdGhyZWFkCisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuaW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlPdGhlclRocmVhZHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTk5LCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBqIGZyb20gIiArIFRFU1RfVEFCTEUgKyAiIFdIRVJFIGkgPSAxMCIsIG51bGwpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldERiKCkuaW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShnZXREYigpLmlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0RGIoKS5pc0RiTG9ja2VkQnlPdGhlclRocmVhZHMoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuaW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlPdGhlclRocmVhZHMoKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKHN0cik7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlPdGhlclRocmVhZHMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGUgZm9sbG93aW5nCisgICAgICogaHR0cDovL2IvaXNzdWU/aWQ9Mjg3MTAzNworICAgICAqICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBkYi5xdWVyeSguLi4pOworICAgICAqICAgICAgICAgIC8vIHdpdGggV0FMIGVuYWJsZWQsIHRoZSBhYm92ZSB1c2VzIGEgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uKCkKKyAgICAgKiAgICAgICAgICB0cnkgeworICAgICAqICAgICAgICAgICAgZGIuaW5zZXJ0KC4uLi4uLik7CisgICAgICogICAgICAgICAgICBjdXJzb3IucmVxdWVyeSgpOworICAgICAqICAgICAgICAgICAgLy8gc2luY2UgdGhlIGN1cnNvciB1c2VzIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uLCB0aGUgYWJvdmUgcmVxdWVyeQorICAgICAqICAgICAgICAgICAgLy8gd2lsbCBub3QgcmV0dXJuIHRoZSByZXN1bHRzIHRoYXQgd2VyZSBpbnNlcnRlZCBhYm92ZSBzaW5jZSB0aGUgaW5zZXJ0IGlzCisgICAgICogICAgICAgICAgICAvLyBkb25lIHVzaW5nIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBBTkQgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBjb21taXR0ZWQgeWV0LgorICAgICAqICAgICAgICAgICAgLy8gZml4IGlzIHRvIG1ha2UgdGhlIGFib3ZlIGN1cnNvciB1c2UgdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiAtIGFuZCBOT1QKKyAgICAgKiAgICAgICAgICAgIC8vIHRoZSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCkKKyAgICAgKiAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAqICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKQorICAgICAqICAgICAgICAgIH0KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zYWN0aW9uQW5kV2FsSW50ZXJwbGF5MSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgKiBmcm9tICIgKyBURVNUX1RBQkxFOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyByZXF1ZXJ5IG9uIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBjdXJzb3IKKyAgICAgICAgICAgIC8vIGN1cnNvciBzaG91bGQgbm93IHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzZWUgMiByb3dzCisgICAgICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjLmdldENvdW50KCkpOworICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgYy5jbG9zZSgpOworCisgICAgICAgIC8vIGRvIHRoZSBzYW1lIHRlc3QgYnV0IG5vdyBkbyB0aGUgcmVxdWVyeSBpbiBhIHNlcGFyYXRlIHRocmVhZC4KKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBmaW5hbCBDdXJzb3IgYzEgPSBtRGF0YWJhc2UucmF3UXVlcnkoInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKTsKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgMSByb3cgaW4gdGhlIHRhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGluIGEgZGlmZmVyZW50IHRocmVhZC4gdGhhdCBjYXVzZXMgdGhlIGN1cnNvciB0byB1c2UgYSBwb29sZWQgY29ubmVjdGlvbgorICAgICAgICAgICAgLy8gYW5kIHNpbmNlIHRoaXMgdGhyZWFkIGhhc24ndCBjb21taXR0ZWQgaXRzIGNoYW5nZXMsIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIHNlZSBvbmx5CisgICAgICAgICAgICAvLyAxIHJvdworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGMxLnJlcXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSAyIHJvd3Mgbm93IC0gaW5jbHVkaW5nIHRoZSB0aGUgcm93IGluc2VydGVkIGFib3ZlCisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICBjMS5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBpcyBzYW1lIGFzIHtAbGluayAjdGVzdFRyYW5zYWN0aW9uQW5kV2FsSW50ZXJwbGF5MSgpfSBleGNlcHQgdGhlIGZvbGxvd2luZzoKKyAgICAgKiBpbnN0ZWFkIG9mIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCksIHVzZSBleGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpCisgICAgICogYW5kIGluc3RlYWQgb2YgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCksIHVzZSBleGVjU1FMKCJFTkQiKTsKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zYWN0aW9uQW5kV2FsSW50ZXJwbGF5MigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgKiBmcm9tICIgKyBURVNUX1RBQkxFOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcmVxdWVyeSBvbiB0aGUgcHJldmlvdXNseSBvcGVuZWQgY3Vyc29yCisgICAgICAgICAgICAvLyBjdXJzb3Igc2hvdWxkIG5vdyB1c2UgdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2VlIDIgcm93cworICAgICAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjb21taXQ7Iik7CisgICAgICAgIH0KKyAgICAgICAgYy5jbG9zZSgpOworCisgICAgICAgIC8vIGRvIHRoZSBzYW1lIHRlc3QgYnV0IG5vdyBkbyB0aGUgcmVxdWVyeSBpbiBhIHNlcGFyYXRlIHRocmVhZC4KKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBmaW5hbCBDdXJzb3IgYzEgPSBtRGF0YWJhc2UucmF3UXVlcnkoInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKTsKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgMSByb3cgaW4gdGhlIHRhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyBxdWVyeSBpbiBhIGRpZmZlcmVudCB0aHJlYWQuIGJ1dCBzaW5jZSB0aGUgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZCB1c2luZworICAgICAgICAgICAgLy8gZXhlY1NRKCkgaW5zdGVhZCBvZiBiZWdpblRyYW5zYWN0aW9uKCksIGN1cnNvcidzIHF1ZXJ5IGlzIGNvbnNpZGVyZWQgcGFydCBvZgorICAgICAgICAgICAgLy8gdGhlIHNhbWUgdHJhbnNhY3Rpb24gLSBhbmQgaGVuY2UgaXQgc2hvdWxkIHNlZSB0aGUgYWJvdmUgaW5zZXJ0ZWQgcm93CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYzEucmVxdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgLy8gc2hvdWxkIGJlIDIgcm93cyBub3cgLSBpbmNsdWRpbmcgdGhlIHRoZSByb3cgaW5zZXJ0ZWQgYWJvdmUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjb21taXQiKTsKKyAgICAgICAgfQorICAgICAgICBjMS5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBpcyBzYW1lIGFzIHtAbGluayAjdGVzdFRyYW5zYWN0aW9uQW5kV2FsSW50ZXJwbGF5MigpfSBleGNlcHQgdGhlIGZvbGxvd2luZzoKKyAgICAgKiBpbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGRhdGEsIGRvIHJvbGxiYWNrIGFuZCBtYWtlIHN1cmUgdGhlIGRhdGEgc2VlbiBieSB0aGUgcXVlcnkKKyAgICAgKiB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIGlzIG5vdyBnb25lLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkzKCkgeworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0ICogZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgMSByb3cgaW4gdGhlIHRhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHJlcXVlcnkgb24gdGhlIHByZXZpb3VzbHkgb3BlbmVkIGN1cnNvcgorICAgICAgICAgICAgLy8gY3Vyc29yIHNob3VsZCBub3cgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNlZSAyIHJvd3MKKyAgICAgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyByb2xsYmFjayB0aGUgY2hhbmdlCisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgicm9sbGJhY2s7Iik7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2luY2UgdGhlIGNoYW5nZSBpcyByb2xsZWQgYmFjaywgZG8gdGhlIHNhbWUgcXVlcnkgYWdhaW4gYW5kIHNob3VsZCBub3cgZmluZCBvbmx5IDEgcm93CisgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGh0dHA6Ly9iL2lzc3VlP2lkPTI5NDMwMjgKKyAgICAgKiBTUUxpdGVPcGVuSGVscGVyIG1haW50YWlucyBhIFNpbmdsZXRvbiBldmVuIGlmIGl0IGlzIGluIGJhZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlQW5kUmVvcGVuKCkgeworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgVGVzdE9wZW5IZWxwZXIgaGVscGVyID0gbmV3IFRlc3RPcGVuSGVscGVyKGdldENvbnRleHQoKSwgREJfTkFNRSwgbnVsbCwKKyAgICAgICAgICAgICAgICBDVVJSRU5UX0RBVEFCQVNFX1ZFUlNJT04sIG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSk7CisgICAgICAgIG1EYXRhYmFzZSA9IGhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucXVlcnkoVEVTVF9UQUJMRSwgbmV3IFN0cmluZ1tdeyJpIiwgImoifSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNPcGVuKCkpOworICAgICAgICBtRGF0YWJhc2UgPSBoZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pc09wZW4oKSk7CisgICAgICAgIGMgPSBtRGF0YWJhc2UucXVlcnkoVEVTVF9UQUJMRSwgbmV3IFN0cmluZ1tdeyJpIiwgImoifSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorICAgIHByaXZhdGUgY2xhc3MgVGVzdE9wZW5IZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKKyAgICAgICAgcHVibGljIFRlc3RPcGVuSGVscGVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBuYW1lLCBmYWN0b3J5LCB2ZXJzaW9uLCBlcnJvckhhbmRsZXIpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkNyZWF0ZShTUUxpdGVEYXRhYmFzZSBkYikge30KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uVXBncmFkZShTUUxpdGVEYXRhYmFzZSBkYiwgaW50IG9sZFZlcnNpb24sIGludCBuZXdWZXJzaW9uKSB7fQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUdlbmVyYWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmN2NjY2UuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUdlbmVyYWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5GbGFreVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIFNRTGl0ZUdlbmVyYWxUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlOwotICAgIHByaXZhdGUgRmlsZSBtRGF0YWJhc2VGaWxlOwotICAgIEJvb2xlYW4gZXhjZXB0aW9uUmVjdmQgPSBmYWxzZTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGV4Y2VwdGlvblJlY3ZkID0gZmFsc2U7Ci0gICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKLSAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAiZGF0YWJhc2VfdGVzdC5kYiIpOwotICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKLSAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFVzZU9mU2FtZVNxbFN0YXRlbWVudEJ5MlRocmVhZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0X3BzdG10IChpIElOVEVHRVIgUFJJTUFSWSBLRVksIGogdGV4dCk7Iik7Ci0KLSAgICAgICAgLy8gdGhyZWFkIDEgY3JlYXRlcyBhIHByZXBhcmVkIHN0YXRlbWVudAotICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOwotCi0gICAgICAgIC8vIHN0YXJ0IDIgdGhyZWFkcyB0byBkbyByZXBlYXRlZGx5IGV4ZWN1dGUgInN0bXQiCi0gICAgICAgIC8vIHNpbmNlIHRoZXNlIDIgdGhyZWFkcyBhcmUgZXhlY3V0aW5nIHRoZSBzYW1lIHNxbCwgdGhleSBlYWNoIHNob3VsZCBnZXQKLSAgICAgICAgLy8gdGhlaXIgb3duIGNvcHkgYW5kCi0gICAgICAgIC8vIHRoZXJlIFNIT1VMRCBOT1QgYmUgYW4gZXJyb3IgZnJvbSBzcWxpdGU6ICJwcmVwYXJlZCBzdGF0ZW1lbnQgaXMgYnVzeSIKLSAgICAgICAgY2xhc3MgUnVuU3RtdFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTiA9IDEwMDA7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIG1hbnkgdGltZXMKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5iaW5kTG9uZygxLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJTUUxpdGVFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBmYWlsKCJyYW5kb20gdW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUnVuU3RtdFRocmVhZCB0MSA9IG5ldyBSdW5TdG10VGhyZWFkKCk7Ci0gICAgICAgIHQxLnN0YXJ0KCk7Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDIgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0Mi5zdGFydCgpOwotICAgICAgICB3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQEZsYWt5VGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VPZlNhbWVQcmVwYXJlZFN0YXRlbWVudEJ5MlRocmVhZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0X3BzdG10IChpIElOVEVHRVIgUFJJTUFSWSBLRVksIGogdGV4dCk7Iik7Ci0KLSAgICAgICAgLy8gdGhyZWFkIDEgY3JlYXRlcyBhIHByZXBhcmVkIHN0YXRlbWVudAotICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOwotICAgICAgICBmaW5hbCBTUUxpdGVTdGF0ZW1lbnQgczEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdG10KTsKLQotICAgICAgICAvLyBzdGFydCAyIHRocmVhZHMgdG8gZG8gcmVwZWF0ZWRseSBleGVjdXRlICJzdG10IgotICAgICAgICAvLyBzaW5jZSB0aGVzZSAyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyB0aGUgc2FtZSBwcmVwYXJlZCBzdGF0ZW1lbnQsCi0gICAgICAgIC8vIHNob3VsZCBzZWUgYW4gZXJyb3IgZnJvbSBzcWxpdGU6ICJwcmVwYXJlZCBzdGF0ZW1lbnQgaXMgYnVzeSIKLSAgICAgICAgY2xhc3MgUnVuU3RtdFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTiA9IDEwMDA7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIG1hbnkgdGltZXMKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgczEuYmluZExvbmcoMSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3QgaXQKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibGlicmFyeSByb3V0aW5lIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2U6IikpOwotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25SZWN2ZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBmYWlsKCJyYW5kb20gdW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUnVuU3RtdFRocmVhZCB0MSA9IG5ldyBSdW5TdG10VGhyZWFkKCk7Ci0gICAgICAgIHQxLnN0YXJ0KCk7Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDIgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0Mi5zdGFydCgpOwotICAgICAgICB3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZXhjZXB0aW9uUmVjdmQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnRUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTMzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKKworcHVibGljIGNsYXNzIFNRTGl0ZVN0YXRlbWVudFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlOworICAgIHByaXZhdGUgRmlsZSBtRGF0YWJhc2VGaWxlOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgMiB0aHJlYWRzIHRvIHJlcGVhdGVkbHkgZXhlY3V0ZSB0aGUgYWJvdmUgU1FMIHN0YXRlbWVudC4KKyAgICAgKiBFdmVuIHRob3VnaCAyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyB0aGUgc2FtZSBTUUwsIHRoZXkgZWFjaCBzaG91bGQgZ2V0IHRoZWlyIG93biBjb3B5IG9mCisgICAgICogcHJlcGFyZWQgU1FMIHN0YXRlbWVudCBpZCBhbmQgdGhlcmUgU0hPVUxEIE5PVCBiZSBhbiBlcnJvciBmcm9tIHNxbGl0ZSBvciBhbmRyb2lkLgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gdGhyb3duIGlmIHRoZSB0ZXN0IHRocmVhZHMgc3RhcnRlZCBieSB0aGlzIHRlc3QgYXJlIGludGVycnVwdGVkCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VPZlNhbWVTcWxTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0X3BzdG10IChpIElOVEVHRVIgUFJJTUFSWSBLRVksIGogdGV4dCk7Iik7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdG10ID0gIlNFTEVDVCAqIEZST00gdGVzdF9wc3RtdCBXSEVSRSBpID0gPyI7CisgICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBpdCBlbm91Z2ggdGltZXMgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBjb3JuZXIgY2FzZXMgZ29pbmcgdW50ZXN0ZWQKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgczEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdG10KTsKKyAgICAgICAgICAgICAgICAgICAgczEuYmluZExvbmcoMSwgaSk7CisgICAgICAgICAgICAgICAgICAgIHMxLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgczEuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgIHdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCisgICAgICogQSBzaW1wbGUgdGVzdDogc3RhcnQgMiB0aHJlYWRzIHRvIHJlcGVhdGVkbHkgZXhlY3V0ZSB0aGUgc2FtZSB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fS4KKyAgICAgKiBUaGUgMiB0aHJlYWRzIHRha2UgdHVybnMgdG8gdXNlIHRoZSB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fTsgaS5lLiwgaXQgaXMgTk9UIGluIHVzZQorICAgICAqIGJ5IGJvdGggdGhlIHRocmVhZHMgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gdGhyb3duIGlmIHRoZSB0ZXN0IHRocmVhZHMgc3RhcnRlZCBieSB0aGlzIHRlc3QgYXJlIGludGVycnVwdGVkCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VPZlNhbWVTcWxpdGVTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0X3BzdG10IChpIElOVEVHRVIgUFJJTUFSWSBLRVksIGogdGV4dCk7Iik7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdG10ID0gIlNFTEVDVCAqIEZST00gdGVzdF9wc3RtdCBXSEVSRSBpID0gPyI7CisgICAgICAgIGZpbmFsIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOworICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gaXQgZW5vdWdoIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gY29ybmVyIGNhc2VzIGdvaW5nIHVudGVzdGVkCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jaygpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgczEuYmluZExvbmcoMSwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBUaHJlYWQueWllbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MSA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIFJ1blN0bXRUaHJlYWQgdDIgPSBuZXcgUnVuU3RtdFRocmVhZCgpOworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiogU3luY2hyb25pemUgb24gdGhpcyB3aGVuIGFjY2Vzc2luZyB0aGUgU3FsaXRlU3RhdGVtZXQgaW4gdGhlIGFib3ZlICovCisgICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIG1Mb2NrID0gbmV3IFJlZW50cmFudExvY2sodHJ1ZSk7CisgICAgcHJpdmF0ZSB2b2lkIGxvY2soKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHVubG9jaygpIHsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIGZvbGxvd2luZzogYSB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fSBvYmplY3Qgc2hvdWxkIG5vdCByZWZlciB0byBhCisgICAgICogcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgaWQgZXhjZXB0IGluIGR1cmluZyB0aGUgcGVyaW9kIG9mIGJpbmRpbmcgdGhlIGFyZ3VtZW50cworICAgICAqIGFuZCBleGVjdXRpbmcgdGhlIFNRTCBzdGF0ZW1lbnQuCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdCAoaSBpbnQsIGogdGV4dCk7Iik7CisgICAgICAgIHZlcmlmeVJlZmVyZW5jZVRvUHJlY29tcGlsZWRTdGF0ZW1lbnRJZChmYWxzZSk7CisgICAgICAgIHZlcmlmeVJlZmVyZW5jZVRvUHJlY29tcGlsZWRTdGF0ZW1lbnRJZCh0cnVlKTsKKworICAgICAgICAvLyBhIHNtYWxsIHN0cmVzcyB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gc2lkZSBlZmZlY3RzIG9mCisgICAgICAgIC8vIHRoZSBhY3F1aXJlICYgcmVsZWFzZSBvZiBwcmUtY29tcGlsZWQgc3RhdGVtZW50IGlkIGJ5IFNRTGl0ZVN0YXRlbWVudCBvYmplY3QuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgICAgIHZlcmlmeVJlZmVyZW5jZVRvUHJlY29tcGlsZWRTdGF0ZW1lbnRJZChmYWxzZSk7CisgICAgICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoYm9vbGVhbiB3YWwpIHsKKyAgICAgICAgaWYgKHdhbCkgeworICAgICAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGVzdCB3aXRoIElOU0VSVCBzdGF0ZW1lbnQgLSBkb2Vzbid0IHVzZSBjb25uZWN0aW9uIHBvb2wsIGlmIFdBTCBpcyBzZXQKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudCgiaW5zZXJ0IGludG8gdCB2YWx1ZXMoPyw/KTsiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIC8vIHNxbCBzdGF0ZW1lbnQgc2hvdWxkIG5vdCBiZSBjb21waWxlZCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBpbnQgY29sVmFsdWUgPSBuZXcgUmFuZG9tKCkubmV4dEludCgpOworICAgICAgICBzdG10LmJpbmRMb25nKDEsIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICAvLyBzaG91bGQgc3RpbGwgYmUgdXNpbmcgdGhlIG1EYXRhYmFzZSBjb25uZWN0aW9uIC0gdmVyaWZ5CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICBzdG10LmJpbmRTdHJpbmcoMiwgImJsYWgiICsgY29sVmFsdWUpOworICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgc3FsIHN0YXRlbWVudCBpcyBzdGlsbCBub3QgY29tcGlsZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICBzdG10LmV4ZWN1dGVJbnNlcnQoKTsKKyAgICAgICAgLy8gbm93IHRoYXQgdGhlIHN0YXRlbWVudCBpcyBleGVjdXRlZCwgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBzaG91bGQgYmUgcmVsZWFzZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICAvLyBwcmUtY29tcGlsZWQgU1FMIHN0YXRlbWVudCBzaG91bGQgc3RpbGwgcmVtYWluIHJlbGVhc2VkIGZyb20gdGhpcyBvYmplY3QKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICAvLyBidXQgdGhlIGRhdGFiYXNlIGhhbmRsZSBzaG91bGQgc3RpbGwgYmUgdGhlIHNhbWUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworCisgICAgICAgIC8vIHRlc3Qgd2l0aCBhIFNFTEVDVCBzdGF0ZW1lbnQgLSB1c2VzIGNvbm5lY3Rpb24gcG9vbCBpZiBXQUwgaXMgc2V0CisgICAgICAgIHN0bXQgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudCgic2VsZWN0IGkgZnJvbSB0IHdoZXJlIGo9PzsiKTsKKyAgICAgICAgLy8gc3FsIHN0YXRlbWVudCBzaG91bGQgbm90IGJlIGNvbXBpbGVkIHlldAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICBzdG10LmJpbmRTdHJpbmcoMSwgImJsYWgiICsgY29sVmFsdWUpOworICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgc3FsIHN0YXRlbWVudCBpcyBzdGlsbCBub3QgY29tcGlsZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgLy8gZXhlY3V0ZSB0aGUgc3RhdGVtZW50CisgICAgICAgIExvbmcgbCA9IHN0bXQuc2ltcGxlUXVlcnlGb3JMb25nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb2xWYWx1ZSwgbC5pbnRWYWx1ZSgpKTsKKyAgICAgICAgLy8gbm93IHRoYXQgdGhlIHN0YXRlbWVudCBpcyBleGVjdXRlZCwgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBzaG91bGQgYmUgcmVsZWFzZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICAvLyBwcmUtY29tcGlsZWQgU1FMIHN0YXRlbWVudCBzaG91bGQgc3RpbGwgcmVtYWluIHJlbGVhc2VkIGZyb20gdGhpcyBvYmplY3QKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICAvLyBidXQgdGhlIGRhdGFiYXNlIGhhbmRsZSBzaG91bGQgc3RpbGwgcmVtYWluIGF0dGFjaGVkIHRvIHRoZSBzdGF0ZW1lbnQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkRXhjZXB0aW9uVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjAwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVW5maW5hbGl6ZWRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZVRlc3QuQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlVW5maW5hbGl6ZWRFeGNlcHRpb25UZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJ0ZXN0Q3Vyc29yIjsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAiVW5maW5hbGl6ZWRFeGNlcHRpb25UZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5maW5hbGl6ZWRFeGNlcHRpb25Ob3RFeGNwZWN0ZWQoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIFRBQkxFX05BTUUgKyAiIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICAvLyB0aGUgYWJvdmUgc3RhdGVtZW50IHNob3VsZCBiZSBpbiBTUUxpdGVEYXRhYmFzZS5tUHJvZ3JhbXMKKyAgICAgICAgLy8gYW5kIHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIGZpbmFsaXplZCB3aGVuIGRhdGFiYXNlIGlzIGNsb3NlZAorICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlRGF0YWJhc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5maW5hbGl6ZWRFeGNlcHRpb24oKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIFRBQkxFX05BTUUgKyAiIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOyAvLyBjbGVhcnMgdGhlIGFib3ZlIGZyb20gZmluYWxpemVyIHF1ZXVlIGluIG1kYXRhYmFzZQorICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsICJzZWxlY3QgKiBmcm9tICIgICsgVEFCTEVfTkFNRSk7CisgICAgICAgIC8vIHNpbmNlIHRoZSBhYm92ZSBpcyBOT1QgY2xvc2VkLCBjbG9zaW5nIGRhdGFiYXNlIHNob3VsZCBmYWlsCisgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuY2xvc2VEYXRhYmFzZSgpOworICAgICAgICAgICAgZmFpbCgiZXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L0xpbmtTb2NrZXRUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvTGlua1NvY2tldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc3ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L0xpbmtTb2NrZXRUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rU29ja2V0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgTGlua1NvY2tldAorICovCitwdWJsaWMgY2xhc3MgTGlua1NvY2tldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpbmtTb2NrZXQgbHM7CisKKyAgICAgICAgbHMgPSBuZXcgTGlua1NvY2tldCgpOworICAgICAgICBscy5jbG9zZSgpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlua0NhcGFiaWxpdGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaW5rQ2FwYWJpbGl0aWVzIGxjOworCisgICAgICAgIGxjID0gbmV3IExpbmtDYXBhYmlsaXRpZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGxjLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBsYy5pc0VtcHR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9VcmlUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvVXJpVGVzdC5qYXZhCmluZGV4IGE1ZmRhMjAuLmM4YWQ2MGQgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9VcmlUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1VyaVRlc3QuamF2YQpAQCAtMjQsNiArMjQsOSBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBVcmlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCkBAIC01MiwyMCArNTUsMjAgQEAKIAogICAgIHByaXZhdGUgdm9pZCBwYXJjZWxBbmRVbnBhcmNlbChVcmkgdSkgewogICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKLQl0cnkgewotCQlVcmkud3JpdGVUb1BhcmNlbChwLCB1KTsKLQkJcC5zZXREYXRhUG9zaXRpb24oMCk7Ci0JCWFzc2VydEVxdWFscyh1LCBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaS53cml0ZVRvUGFyY2VsKHAsIHUpOworICAgICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModSwgVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKSk7CiAKLQkJcC5zZXREYXRhUG9zaXRpb24oMCk7Ci0JCXUgPSB1LmJ1aWxkVXBvbigpLmJ1aWxkKCk7ICAgICAgICAKLQkJVXJpLndyaXRlVG9QYXJjZWwocCwgdSk7Ci0JCXAuc2V0RGF0YVBvc2l0aW9uKDApOwotCQlhc3NlcnRFcXVhbHModSwgVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKSk7Ci0JfQotCWZpbmFsbHkgewotCQlwLnJlY3ljbGUoKTsKLQl9CisgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgIHUgPSB1LmJ1aWxkVXBvbigpLmJ1aWxkKCk7CisgICAgICAgICAgICBVcmkud3JpdGVUb1BhcmNlbChwLCB1KTsKKyAgICAgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHUsIFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgcC5yZWN5Y2xlKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAU21hbGxUZXN0CkBAIC0yODIsNiArMjg1LDE0IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiZCIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiYyIpKTsKICAgICB9CiAKKyAgICAvLyBodHRwOi8vYi8yMzM3MDQyCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIb3N0V2l0aFRyYWlsaW5nRG90KCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vZ29vZ2xlLmNvbS4vYi9jL2ciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnb29nbGUuY29tLiIsIHVyaS5nZXRIb3N0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9iL2MvZyIsIHVyaS5nZXRQYXRoKCkpOworICAgIH0KKwogICAgIEBTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1lT25seSgpIHsKICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiZW1wdHk6Iik7CkBAIC02MDMsNCArNjE0LDEyMiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiYiIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoImMiKSk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyRW1wdHlLZXkoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/PWIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyRW1wdHlLZXkyKCkgeworICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPWImJmM9ZCIpOworICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoIiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJFbXB0eUtleTMoKSB7CisgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20/Iik7CisgICAgICBhc3NlcnRFcXVhbHMoIiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVtcHR5S2V5NCgpIHsKKyAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbT9hPWImIik7CisgICAgICBhc3NlcnRFcXVhbHMoIiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbXB0eUtleSgpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz89YiYiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcnMoIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHZhbHVlcy5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHZhbHVlcy5nZXQoMSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbXB0eUtleTIoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbT8iKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcnMoIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgdmFsdWVzLmdldCgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyc0VtcHR5S2V5MygpIHsKKyAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT1iJiZjPWQiKTsKKyAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCIiKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCB2YWx1ZXMuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiIiwgdmFsdWVzLmdldCgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly90ZXN0P2E9MSIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBuYW1lcy5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFbXB0eUtleSgpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPXgmJmM9eiIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFbXB0eUtleTIoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT14Jj1kJmM9eiIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFbXB0eVZhbHVlcygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPWZvbyZiPSZjPSIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzRWRnZUNhc2VzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vZm9vP2E9YmFyJmI9YmFyJmM9JiZkPWJheiZlJmYmZz1idXp6JiYmYSZiPWJhciZoIik7CisgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDksIG5hbWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImQiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZSIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImciLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaCIsIGl0ZXIubmV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJOYW1lc0VzY2FwZWRLZXlzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2ElMjBiPWZvbyZjJTIwZD0iKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIGIiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYyBkIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVzY2FwZWRLZXlzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2ElMjBiPWZvbyZjJTIwZD0iKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJhIGIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclF1ZXJ5UGFyYW1ldGVycygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPXgmYj15JmM9eiIpLmJ1aWxkVXBvbigpCisgICAgICAgICAgICAuY2xlYXJRdWVyeSgpLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJmb28iLCAiYmFyIikuYnVpbGQoKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lcy5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3NUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvV2ViQWRkcmVzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGFmMzVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3NUZXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5XZWJBZGRyZXNzOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgV2ViQWRkcmVzc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvLyBodHRwOi8vYi8yMzM3MDQyCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIb3N0V2l0aFRyYWlsaW5nRG90KCkgeworICAgICAgICBXZWJBZGRyZXNzIHdlYkFkZHJlc3MgPSBuZXcgV2ViQWRkcmVzcygiaHR0cDovL2dvb2dsZS5jb20uL2IvYy9nIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZ29vZ2xlLmNvbS4iLCB3ZWJBZGRyZXNzLm1Ib3N0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYi9jL2ciLCB3ZWJBZGRyZXNzLm1QYXRoKTsKKyAgICB9CisKKyAgICAvLyBodHRwOi8vYi8xMDExNjAyCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoV2l0aG91dExlYWRpbmdTbGFzaCgpIHsKKyAgICAgICAgV2ViQWRkcmVzcyB3ZWJBZGRyZXNzID0gbmV3IFdlYkFkZHJlc3MoImh0dHA6Ly93d3cubXlzcGFjZS5jb20/c2k9MSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInd3dy5teXNwYWNlLmNvbSIsIHdlYkFkZHJlc3MubUhvc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi8/c2k9MSIsIHdlYkFkZHJlc3MubVBhdGgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lbW9yeUZpbGVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZW1vcnlGaWxlVGVzdC5qYXZhCmluZGV4IDAwOWEwZTIuLmU2MjdiYjQgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lbW9yeUZpbGVUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVtb3J5RmlsZVRlc3QuamF2YQpAQCAtMjM3LDUxICsyMzcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJc01lbW9yeUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUoIk1lbW9yeUZpbGVUZXN0IiwgMTAwMDAwMCk7Ci0gICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gZmlsZS5nZXRGaWxlRGVzY3JpcHRvcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmZC52YWxpZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShmZCkpOwotICAgICAgICBmaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoRmlsZURlc2NyaXB0b3IuaW4pKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoRmlsZURlc2NyaXB0b3Iub3V0KSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLmVycikpOwotCi0gICAgICAgIEZpbGUgdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJNZW1vcnlGaWxlVGVzdCIsIi50bXAiLCBnZXRDb250ZXh0KCkuZ2V0RmlsZXNEaXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZmlsZSk7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKLSAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGVGZCA9IG91dC5nZXRGRCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWxlRmQpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoZmlsZUZkKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRlbXBGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBuZXcgTWVtb3J5RmlsZSgiTWVtb3J5RmlsZVRlc3QiLCAxMDAwMDAwKTsKLSAgICAgICAgTWVtb3J5RmlsZSByZWYgPSBuZXcgTWVtb3J5RmlsZShmaWxlLmdldEZpbGVEZXNjcmlwdG9yKCksIGZpbGUubGVuZ3RoKCksICJyIik7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXI7Ci0KLSAgICAgICAgLy8gd3JpdGUgdG8gb3JpZ2luYWwsIHJlYWQgZnJvbSByZWZlcmVuY2UKLSAgICAgICAgZmlsZS53cml0ZUJ5dGVzKHRlc3RTdHJpbmcsIDAsIDIwMDAsIHRlc3RTdHJpbmcubGVuZ3RoKTsKLSAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbdGVzdFN0cmluZy5sZW5ndGhdOwotICAgICAgICByZWYucmVhZEJ5dGVzKGJ1ZmZlciwgMjAwMCwgMCwgdGVzdFN0cmluZy5sZW5ndGgpOwotICAgICAgICBjb21wYXJlQnVmZmVycyh0ZXN0U3RyaW5nLCBidWZmZXIsIHRlc3RTdHJpbmcubGVuZ3RoKTsKLQotICAgICAgICBmaWxlLmNsb3NlKCk7Ci0gICAgICAgIHJlZi5jbG9zZSgpOyAgLy8gRG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZywgc2luY2UgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgZHVwKDIpOmVkCi0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHRlc3RTdHJpbmcgPSBuZXcgYnl0ZVtdIHsKICAgICAgICAgMywgMSwgNCwgMSwgNSwgOSwgMiwgNiwgNSwgMywgNSwgOCwgOSwgNywgOSwgMywgMiwgMywgOCwgNCwgNiwgMiwgNiwgNCwgMywgMywgOCwgMywgMiwgNywgOSwgNSwgMCwgMiwgOCwgOCwgNCwgMSwgOSwgNywgMSwgNiwgOSwgMywgOSwgOSwgMywgNywgNSwgMSwgMCwgNSwgOCwgMiwgMCwgOSwgNywgNCwgOSwgNCwgNCwgNSwgOSwgMiwgMywgMCwgNywgOCwgMSwgNiwgNCwKICAgICAgICAgMCwgNiwgMiwgOCwgNiwgMiwgMCwgOCwgOSwgOSwgOCwgNiwgMiwgOCwgMCwgMywgNCwgOCwgMiwgNSwgMywgNCwgMiwgMSwgMSwgNywgMCwgNiwgNywgOSwgOCwgMiwgMSwgNCwgOCwgMCwgOCwgNiwgNSwgMSwgMywgMiwgOCwgMiwgMywgMCwgNiwgNiwgNCwgNywgMCwgOSwgMywgOCwgNCwgNCwgNiwgMCwgOSwgNSwgNSwgMCwgNSwgOCwgMiwgMiwgMywgMSwgNywgMiwKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZVRlc3QuamF2YQppbmRleCBiN2MyZDFmLi5mODJiZmNlIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWVUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlVGVzdC5qYXZhCkBAIC00MSw2ICs0MSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKCFtc2cuaXNJblVzZSgpKSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuaXNJbnVzZSBpcyBmYWxzZSwgc2hvdWxkIGFsd2F5cyBiZSB0cnVlLCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUNvdW50IDw9IG1MYXN0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCAhPSBtQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKQEAgLTk5LDUgKzEwMywxNzQgQEAKIAogICAgICAgICB0ZXN0ZXIuZG9UZXN0KDEwMDApOwogICAgIH0KLX0KIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RGaWVsZEludGVncml0eUhhbmRsZXIgZXh0ZW5kcyBUZXN0SGFuZGxlclRocmVhZCB7CisgICAgICAgIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgICAgIGludCBtTGFzdE1lc3NhZ2U7CisgICAgICAgIGludCBtQ291bnQ7CisKKyAgICAgICAgcHVibGljIFRlc3RGaWVsZEludGVncml0eUhhbmRsZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBnbygpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgICAgICBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyLnRoaXMuaGFuZGxlTWVzc2FnZShtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAoIW1zZy5pc0luVXNlKCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5pc0ludXNlIGlzIGZhbHNlLCBzaG91bGQgYWx3YXlzIGJlIHRydWUsICMiICsgbXNnLndoYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ291bnQgPD0gbUxhc3RNZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ICE9IG1Db3VudCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBtZXNzYWdlICMiICsgbUNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlY2VpdmVkICMiICsgbXNnLndoYXQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Db3VudCA9PSBtTGFzdE1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ291bnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIHJlY2VpdmVkIGFmdGVyIGRvbmUsICMiICsgbXNnLndoYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkSW50ZWdyaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgVGVzdEhhbmRsZXJUaHJlYWQgdGVzdGVyID0gbmV3IFRlc3RGaWVsZEludGVncml0eUhhbmRsZXIoKSB7CisgICAgICAgICAgICBCdW5kbGUgbUJ1bmRsZTsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgZ28oKSB7CisgICAgICAgICAgICAgICAgc3VwZXIuZ28oKTsKKyAgICAgICAgICAgICAgICBtTGFzdE1lc3NhZ2UgPSAxOworICAgICAgICAgICAgICAgIG1Db3VudCA9IDA7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobUhhbmRsZXIub2J0YWluTWVzc2FnZSgwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmZsYWdzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIG1zZy53aGF0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEgPSA0NTY7CisgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcyID0gNzg5OworICAgICAgICAgICAgICAgICAgICBtc2cub2JqID0gdGhpczsKKyAgICAgICAgICAgICAgICAgICAgbXNnLnJlcGx5VG8gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICBtc2cuZGF0YSA9IG1CdW5kbGU7CisgICAgICAgICAgICAgICAgICAgIG1zZy5kYXRhLnB1dFN0cmluZygia2V5IiwgInZhbHVlIik7CisKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBuZXdNc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld01zZy5jb3B5RnJvbShtc2cpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmlzSW5Vc2UoKSAhPSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5pc0luVXNlIGlzIHRydWUgc2hvdWxkIGJlIGZhbHNlIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cuZmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5mbGFncyBpcyAlZCBzaG91bGQgYmUgMCBhZnRlciBjb3B5RnJvbSIsIG5ld01zZy5mbGFncykpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLndoYXQgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLndoYXQgaXMgJWQgc2hvdWxkIGJlICVkIGFmdGVyIGNvcHlGcm9tIiwgbmV3TXNnLndoYXQsIDEpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5hcmcxICE9IDQ1NikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmFyZzEgaXMgJWQgc2hvdWxkIGJlICVkIGFmdGVyIGNvcHlGcm9tIiwgbXNnLmFyZzEsIDQ1NikpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmFyZzIgIT0gNzg5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuYXJnMiBpcyAlZCBzaG91bGQgYmUgJWQgYWZ0ZXIgY29weUZyb20iLCBtc2cuYXJnMiwgNzg5KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cub2JqICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cub2JqIHNob3VsZCBiZSAndGhpcycgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5yZXBseVRvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cucmVwbHlUbyBzaG91bGQgYmUgbnVsbCBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmRhdGEgPT0gbUJ1bmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5kYXRhIHNob3VsZCBOT1QgYmUgbUJ1bmRsZSBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld01zZy5kYXRhLmdldFN0cmluZygia2V5IikuZXF1YWxzKG1CdW5kbGUuZ2V0U3RyaW5nKCJrZXkiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5kYXRhLmdldFN0cmluZyhcImtleVwiKSBpcyAlcyBhbmQgZG9lcyBub3QgZXF1YWwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtQnVuZGxlLmdldFN0cmluZyhcImtleVwiKSB3aGljaCBpcyAlcyBhZnRlciBjb3B5RnJvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01zZy5kYXRhLmdldFN0cmluZygia2V5IiksICBtQnVuZGxlLmdldFN0cmluZygia2V5IikpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy53aGVuICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy53aGVuIGlzICVkIHNob3VsZCBiZSAwIGFmdGVyIGNvcHlGcm9tIiwgbmV3TXNnLndoZW4pKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy50YXJnZXQgIT0gbUhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cudGFyZ2V0IGlzIE5PVCBtSGFuZGxlciBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuY2FsbGJhY2sgaXMgTk9UIG51bGwgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShuZXdNc2cpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLndoYXQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmlzSW5Vc2UoKSAhPSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuaXNJblVzZSBpcyBmYWxzZSBzaG91bGQgYmUgdHJ1ZSBhZnRlciB3aGVuIHByb2Nlc3NpbmcgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmFyZzEgIT0gNDU2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuYXJnMSBpcyAlZCBzaG91bGQgYmUgJWQgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwgNDU2LCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmFyZzIgIT0gNzg5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuYXJnMiBpcyAlZCBzaG91bGQgYmUgJWQgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMiwgNzg5LCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm9iaiAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cub2JqIHNob3VsZCBiZSAndGhpcycgd2hlbiBwcm9jZXNzaW5nICMgJWQiLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLnJlcGx5VG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLnJlcGx5VG8gc2hvdWxkIGJlIG51bGwgd2hlbiBwcm9jZXNzaW5nICMgJWQiLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy5kYXRhLmdldFN0cmluZygia2V5IikuZXF1YWxzKG1CdW5kbGUuZ2V0U3RyaW5nKCJrZXkiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5kYXRhLmdldFN0cmluZyhcImtleVwiKSBpcyAlcyBhbmQgZG9lcyBub3QgZXF1YWwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtQnVuZGxlLmdldFN0cmluZyhcImtleVwiKSB3aGljaCBpcyAlcyB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5kYXRhLmdldFN0cmluZygia2V5IiksICBtQnVuZGxlLmdldFN0cmluZygia2V5IiksIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cud2hlbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cud2hlbiBpcyAlZCBzaG91bGQgYmUgMCB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy53aGVuLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLnRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cudGFyZ2V0IGlzIE5PVCBudWxsIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5jYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuY2FsbGJhY2sgaXMgTk9UIG51bGwgd2hlbiBwcm9jZXNzaW5nICMgJWQiLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBtc2cud2hhdCBpcyAlZCIgKyBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdGVzdGVyLmRvVGVzdCgxMDAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFeHBvcnRlclRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFeHBvcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZWM0NjIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGFjdEVudHJ5OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlZDYXJkVGVzdHNCYXNlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBjb2RlIHJlbGF0ZWQgdG8gdkNhcmQgZXhwb3J0ZXIsIGluY3VsZGluZyB2Q2FyZCBjb21wb3Nlci4KLSAqIFRoaXMgdGVzdCBjbGFzcyBkZXBlbmRzIG9uIHZDYXJkIGltcG9ydGVyIGNvZGUsIHNvIGlmIHRlc3RzIGZvciB2Q2FyZCBpbXBvcnRlciBmYWlsLAotICogdGhlIHJlc3VsdCBvZiB0aGlzIGNsYXNzIHdpbGwgbm90IGJlIHJlbGlhYmxlLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFeHBvcnRlclRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBzUGhvdG9CeXRlQXJyYXkgPQotICAgICAgICBWQ2FyZEltcG9ydGVyVGVzdHMuc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiUm9pZCBBbmRvIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIkFuZG87Um9pZDs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBbmRvIiwgIlJvaWQiLCAiIiwgIiIsICIiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJESVNQTEFZIE5BTUUiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiRElTUExBWSBOQU1FIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWNWMjEoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWNWNDAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKFY0MCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG9ubHkgInByaW1hcnkiIFN0cnVjdHVyZWROYW1lIGlzIGVtaXR0ZWQsIHNvIHRoYXQgb3VyIHZDYXJkIGZpbGUKLSAgICAgKiB3aWxsIG5vdCBjb25mdXNlIHRoZSBleHRlcm5hbCBpbXBvcnRlciwgYXNzdW1pbmcgdGhlcmUgbWF5IGJlIHNvbWUgaW1wb3J0ZXIKLSAgICAgKiB3aGljaCBwcmVzdW1lIHRoYXQgdGhlcmUncyBvbmx5IG9uZSBwcm9wZXJ0eSB0b3dhcmQgZWFjaCBvZiAgIk4iLCAiRk4iLCBldGMuCi0gICAgICogTm90ZSB0aGF0IG1vcmUgdGhhbiBvbmUgIk4iLCAiRk4iLCBldGMuIHByb3BlcnRpZXMgYXJlIGFjY2VwdGFibGUgaW4gdkNhcmQgc3BlYy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBmaW5hbCBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5TmFtZTEiKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLiBUaGlzIGlzIHdoYXQgd2Ugc2hvdWxkIHVzZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1BSSU1BUlk9MSIsIGJ1dCB3ZSBzaG91bGQgaWdub3JlIHRoaXMgdGltZSwgc2luY2UgdGhpcyBpcyBzZWNvbmQsIG5vdCBmaXJzdC4KLSAgICAgICAgLy8gdkNhcmQgMi4xIGRvZXMgbm90IHNwZWNpZnkgYW55dGhpbmcgYWJvdXQgdGhlIG51bWJlciBvZiBOIHByb3BlcnRpZXMuIFdlIGNob29zZSBub3QKLSAgICAgICAgLy8gZW1pdHRpbmcgdGhpcyBwcm9wZXJ0eS4KLSAgICAgICAgLy8gdkNhcmQgMy4wIGRvZXMgKFRoZXJlIG11c3QgYmUgb25lIE4gcHJvcGVydHkpCi0gICAgICAgIC8vIHZDYXJkIDQuMCAocmV2MTMpIGRvZXMgKGNhcmRpbmFsaXR5ICgwLCAxKSkuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkRvTm90RW1pdERpc3BsYXlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUHJlZml4O0FwcHJvcHJpYXRlU3VmZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5VjQwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBvbmx5ICJzdXBlciBwcmltYXJ5IiBTdHJ1Y3R1cmVkTmFtZSBpcyBlbWl0dGVkLgotICAgICAqIFNlZSBhbHNvIHRoZSBjb21tZW50IGluIHtAbGluayAjdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihpbnQpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIGZpbmFsIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkRvTm90RW1pdERpc3BsYXkxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIiwgYnV0IHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19TVVBFUl9QUklNQVJZPTEiLiBUaGlzIGlzIHdoYXQgd2Ugc2hvdWxkIHVzZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1NVUEVSX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkRvTm90RW1pdERpc3BsYXkzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpOwotCi0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5VjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeVY0MCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5Q29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgcGhvbmV0aWMgbmFtZXMgZmllbGQgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgotICAgICAqCi0gICAgICogdkNhcmQgMi4xIGRvZXMgbm90IGhhdmUgYW55IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlbS4KLSAgICAgKiB2Q2FyZCAzLjAgaGFzIFNPUlQtU1RSSU5HIHByb3BlcnR5LCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHZhbHVlcyBpbnNpZGUgaXQuCi0gICAgICogdkNhcmQgNC4wIChyZXYxMykgaGFzIFNPUlQtQVMgcGFyYW1ldGVyLCB3aGljaCBoYXMgdGhyZWUgdmFsdWVzIChmYW1pbHksIGdpdmVuLCBtaWRkbGUpCi0gICAgICogaW5zaWRlIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgZmluYWwgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpOwotCi0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgY29udGVudFZhbHVlcy5wdXQoIlNPUlQtQVMiLAotICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZSIpOwotICAgICAgICAgICAgLy8gdkNhcmQgNC4wIChyZXYxMykgbm93IHVzZXMgU09SVC1BUyBwYXJhbWV0ZXIsIHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKLSAgICAgICAgICAgIC8vIGVpdGhlciAyLjEgbm9yIDMuMC4KLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKTsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4gQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lVjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVBob25ldGljTmFtZUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVBob25ldGljTmFtZVY0MCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogbmVlZCB0byBhZGQgdGVzdCBjYXNlcyBjb25maXJtaW5nIGVzY2FwaW5nLCBlbXB0eSB2YWx1ZXMsIGV0Yy4KLQotICAgIC8qKgotICAgICAqIENvbmZpcm1zIGFsbCB0aGUgb3RoZXIgc2lkZXMgb2YgdGhlIGhhbmRsaW5nIGlzIGNvcnJlY3RseSBpbnRlcnByZXRlZCBhdCBvbmUgdGltZS4KLSAgICAgKgotICAgICAqIEEga2luZCBvZiByZWdyZXNzaW9uIHRlc3QgZm9yIFN0cnVjdHVyZWROYW1lIGhhbmRsaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVDb21wbGljYXRlZENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBmaW5hbCBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTEiKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLCBidXQgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWUuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19TVVBFUl9QUklNQVJZPTEiLiBUaGlzIGlzIHdoYXQgd2Ugc2hvdWxkIHVzZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfU1VQRVJfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4zIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgY29udGVudFZhbHVlcy5wdXQoIlNPUlQtQVMiLAotICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZSIpOwotICAgICAgICAgICAgLy8gdkNhcmQgNC4wIChyZXYxMykgbm93IHVzZXMgU09SVC1BUyBwYXJhbWV0ZXIsIHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKLSAgICAgICAgICAgIC8vIGVpdGhlciAyLjEgbm9yIDMuMC4KLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKTsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4gQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLAotICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVByZWZpeCBBcHByb3ByaWF0ZUdpdmVuTmFtZSAiCi0gICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIEFwcHJvcHJpYXRlRmFtaWx5TmFtZSBBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQ29tcGxpY2F0ZWRWMjEoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQ29tcGxpY2F0ZWRWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQ29tcGxpY2F0ZWRWNDAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5pY2tOYW1lVjMwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjMwKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5JQ0tOQU1FIiwgIk5pY2t5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5pY2tOYW1lVjQwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjQwKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5JQ0tOQU1FIiwgIk5pY2t5Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZUJhc2ljQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZUJhc2ljVjIxKCkgewotICAgICAgICB0ZXN0UGhvbmVCYXNpY0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZUJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVCYXNpY0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZUJhc2ljVjQwKCkgewotICAgICAgICB0ZXN0UGhvbmVCYXNpY0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVJlZnJhaW5Gb3JtYXR0aW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjIxIHwgVkNhcmRDb25maWcuRkxBR19SRUZSQUlOX1BIT05FX05VTUJFUl9GT1JNQVRUSU5HKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTIzNDU2Nzg5MChhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eikiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTIzNDU2Nzg5MChhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eikiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB2Q2FyZCBjb21wb3NlciBlbWl0cyBjb3JyZXNwb25kaW5nIHR5cGUgcGFyYW0gd2hpY2ggd2UgZXhwZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjUwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjYwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfUEFHRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9PVEhFUik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI4MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NBUik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI5MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NPTVBBTllfTUFJTik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9JU0ROKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjExMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01BSU4pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTIwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfT1RIRVJfRkFYKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEzMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1RFTEVYKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE0MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUktfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE1MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUktfUEFHRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTYwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU1TKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMCIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIwIiwgbmV3IFR5cGVTZXQoIldPUksiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMzAiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNDAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNTAiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI2MCIsIG5ldyBUeXBlU2V0KCJQQUdFUiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3MCIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI4MCIsIG5ldyBUeXBlU2V0KCJDQVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOTAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEwMCIsIG5ldyBUeXBlU2V0KCJJU0ROIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjExMCIsIG5ldyBUeXBlU2V0KCJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEyMCIsIG5ldyBUeXBlU2V0KCJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTMwIiwgbmV3IFR5cGVTZXQoIlRMWCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNDAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjE1MCIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlBBR0VSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjE2MCIsIG5ldyBUeXBlU2V0KCJNU0ciKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0VjIxKCkgewotICAgICAgICB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnRWMzAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydChWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydFY0MCgpIHsKLSAgICAgICAgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KFY0MCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCAiUFJFRiJzIGFyZSBlbWl0dGVkIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9XT1JLKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0IiwgbmV3IFR5cGVTZXQoIldPUksiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJGQVgiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ1Y0MCgpIHsKLSAgICAgICAgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk1vZGVtIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNU0ciKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIkJCUyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjUiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiX0FVVE9fQ0VMTCIpOyAgLy8gVGhlIG9sZCBpbmRpY2F0b3IgZm9yIHRoZSB0eXBlIG1vYmlsZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjciKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlx1NjQzQVx1NUUyRiIpOyAgLy8gTW9iaWxlIHBob25lIGluIEphcGFuZXNlIEthbmppCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI4IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJpbnZhbGlkIik7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSB8fCBWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCAzLjAgYWNjZXB0cyAiaW52YWxpZCIuIEFsc28gc3RvcCB1c2luZyB0b1VwcGVyKCkKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJNb2RlbSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJNU0ciKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMiLCBuZXcgVHlwZVNldCgiQkJTIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0IiwgbmV3IFR5cGVTZXQoIlZJREVPIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI1IiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI2IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjciLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOCIsIG5ldyBUeXBlU2V0KCJpbnZhbGlkIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIk1PREVNIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyIiwgbmV3IFR5cGVTZXQoIk1TRyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMyIsIG5ldyBUeXBlU2V0KCJCQlMiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQiLCBuZXcgVHlwZVNldCgiVklERU8iKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjUiLCBuZXcgVHlwZVNldCgiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjYiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNyIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI4IiwgbmV3IFR5cGVTZXQoIlgtaW52YWxpZCIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVR5cGVIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdE1pc2NQaG9uZVR5cGVIYW5kbGluZyhWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVR5cGVIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdE1pc2NQaG9uZVR5cGVIYW5kbGluZyhWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVR5cGVIYW5kbGluZ1Y0MCgpIHsKLSAgICAgICAgdGVzdE1pc2NQaG9uZVR5cGVIYW5kbGluZyhWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RW1haWxCYXNpY0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAic2FtcGxlQGV4YW1wbGUuY29tIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJzYW1wbGVAZXhhbXBsZS5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsQmFzaWNDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdEVtYWlsQmFzaWNDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxCYXNpY1Y0MCgpIHsKLSAgICAgICAgdGVzdEVtYWlsQmFzaWNDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9ob21lQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV93b3JrQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfV09SSyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9tb2JpbGVAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9NT0JJTEUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfb3RoZXJAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9PVEhFUik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9ob21lQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX3dvcmtAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiV09SSyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfbW9iaWxlQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX290aGVyQGV4YW1wbGUuY29tIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0VjIxKCkgewotICAgICAgICB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRWMzAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydFY0MCgpIHsKLSAgICAgICAgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX25vdHlwZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfbm90eXBlQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiSE9NRSIsICJQUkVGIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsUHJlZkhhbmRsaW5nQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxQcmVmSGFuZGxpbmdWNDAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJQb2JveCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCwgIk5laWdoYm9yaG9vZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlN0cmVldCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJDaXR5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiUmVnaW9uIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIxMDAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiQ291bnRyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLCAiRm9ybWF0dGVkIEFkZHJlc3MiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSyk7Ci0gICAgICAgIC8vIGFkci12YWx1ZSAgICA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAvLyAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsIENvZGUsCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IENvdW50cnkgTmFtZQotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgTkVJR0hCT1JIT09EIGZpZWxkIGlzIGFwcGVuZGVkIGFmdGVyIHRoZSBDSVRZIGZpZWxkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQb2JveCIsICIiLCAiU3RyZWV0IiwgIkNpdHkgTmVpZ2hib3Job29kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lvbiIsICIxMDAiLCAiQ291bnRyeSIpLCBuZXcgVHlwZVNldCgiV09SSyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1YyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1YzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1Y0MCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2QoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJDaXR5Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICIiLCAiIiwgIkNpdHkiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWNDAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTkVJR0hCT1JIT09ELCAiTmVpZ2hib3Job29kIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICIiLCAiIiwgIk5laWdoYm9yaG9vZCIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHlWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eVYzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5KFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5VjQwKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiIikgIC8vIE11c3QgYmUgaWdub3JlZC4KLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgIkZvcm1hdHRlZCBhZGRyZXNzIENBIDEyMy0zMzQgVW5pdGVkIFN0YXR1ZSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsICI7Rm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlOzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIkZvcm1hdHRlZCBhZGRyZXNzIENBIDEyMy0zMzQgVW5pdGVkIFN0YXR1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc1Y0MCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIHZDYXJkIGNvbXBvc2VyIGhvbm9ycyBmb3JtYXR0ZWQgZGF0YSB3aGVuIGl0IGlzIGF2YWlsYWJsZQotICAgICAqIGV2ZW4gd2hlbiBpdCBpcyBwYXJ0aWFsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlBvYm94IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIkNvdW50cnkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiKTsgIC8vIFNob3VsZCBiZSBpZ25vcmVkCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIlBvYm94Ozs7Ozs7Q291bnRyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQb2JveCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIkNvdW50cnkiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZFY0MCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55WCIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRZIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlRpdGxlWiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uSk9CX0RFU0NSSVBUSU9OLCAiRGVzY3JpcHRpb24gUmFtYmRhIikgIC8vIElnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uT0ZGSUNFX0xPQ0FUSU9OLCAiTW91bnRhaW4gVmlldyIpICAvLyBJZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlBIT05FVElDX05BTUUsICJQaG9uZXRpY05hbWUhIikgIC8vIElnbm9yZWQKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5TWU1CT0wsICIoXm9eKS9+fiIpOyAgLy8gSWdub3JlIGhpbSAoaGVyKS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLkNPTVBBTlkpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRYWCIpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLlRJVExFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnlYWVoiKQotICAgICAgICAgICAgICAgIC5wdXROdWxsKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5UKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiVGl0bGVYWVpZWCIpOwotICAgICAgICAvLyBDdXJyZW50bHkgd2UgZG8gbm90IHVzZSBncm91cCBidXQgZGVwZW5kIG9uIHRoZSBvcmRlci4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiQ29tcGFueVg7RGVwYXJ0bWVudFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQ29tcGFueVgiLCAiRGVwYXJ0bWVudFkiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJEZXBhcnRtZW50WFgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJDb21wYW55WFlaIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVhZWllYIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9yZ2FuaXphdGlvblYyMSgpIHsKLSAgICAgICAgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdhbml6YXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RPcmdhbml6YXRpb25Db21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnYW5pemF0aW9uVjQwKCkgewotICAgICAgICB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RJbVZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9NU04pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAibXNuIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfWUFIT08pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAieWFob28iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9TS1lQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJza3lwZSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX1FRKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgInFxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfR09PR0xFX1RBTEspCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiZ29vZ2xlIHRhbGsiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9JQ1EpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiaWNxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfSkFCQkVSKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImphYmJlciIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX05FVE1FRVRJTkcpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAibmV0bWVldGluZyIpOwotCi0gICAgICAgIC8vIE5vIGRldGVybWluZWQgd2F5IHRvIGV4cHJlc3MgdW5rbm93biB0eXBlLi4uCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1KQUJCRVIiLCAiamFiYmVyIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUlDUSIsICJpY3EiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtR09PR0xFLVRBTEsiLCAiZ29vZ2xlIHRhbGsiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUVEiLCAicXEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtU0tZUEUtVVNFUk5BTUUiLCAic2t5cGUiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtWUFIT08iLCAieWFob28iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTVNOIiwgIm1zbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1ORVRNRUVUSU5HIiwgIm5ldG1lZXRpbmciKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQUlNIiwgImFpbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbUJhc2lWMjEoKSB7Ci0gICAgICAgIHRlc3RJbVZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbUJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpY1Y0MCgpIHsKLSAgICAgICAgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0xIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfQUlNKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImFpbTIiKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uVFlQRSwgSW0uVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0yIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiUFJFRiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdEltUHJlZkhhbmRsaW5nQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltUHJlZkhhbmRsaW5nVjQwKCkgewotICAgICAgICB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFdlYnNpdGVDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5VUkwsICJodHRwOi8vd2Vic2l0ZS5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfQkxPRyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiZnRwOi8vZnRwLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9GVFApOwotCi0gICAgICAgIC8vIFdlIGRyb3AgVFlQRSBpbmZvcm1hdGlvbiBzaW5jZSB2Q2FyZCAoZXNwZWNpYWxseSAzLjApIGRvZXMgbm90IGFsbG93IHVzIHRvIGVtaXQgaXQuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVVJMIiwgImZ0cDovL2Z0cC5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlVSTCIsICJodHRwOi8vd2Vic2l0ZS5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vic2l0ZVYyMSgpIHsKLSAgICAgICAgdGVzdFdlYnNpdGVDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vic2l0ZVYzMCgpIHsKLSAgICAgICAgdGVzdFdlYnNpdGVDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vic2l0ZVY0MCgpIHsKLSAgICAgICAgdGVzdFdlYnNpdGVDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBbmRyb2lkUHJvcFZhbHVlKGZpbmFsIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIHZhbHVlLCBJbnRlZ2VyIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIGdldEFuZHJvaWRQcm9wVmFsdWUobWltZVR5cGUsIHZhbHVlLCB0eXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBbmRyb2lkUHJvcFZhbHVlKGZpbmFsIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgSW50ZWdlciB0eXBlLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgcmV0dXJuIChtaW1lVHlwZSArICI7IiArIHZhbHVlICsgIjsiCi0gICAgICAgICAgICAgICAgKyAodHlwZSAhPSBudWxsID8gdHlwZSA6ICIiKSArICI7IgotICAgICAgICAgICAgICAgICsgKGxhYmVsICE9IG51bGwgPyBsYWJlbCA6ICIiKSArICI7Ozs7Ozs7Ozs7OzsiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEV2ZW50Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0FOTklWRVJTQVJZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjE5ODItMDYtMTYiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAwOC0xMC0yMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDE4LTAzLTEyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LkxBQkVMLCAiVGhlIGxhc3QgZGF5IikKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICJXaGVuIHRoZSBUb3dlciBvZiBIYW5vaSB3aXRoIDY0IHJpbmdzIGlzIGNvbXBsZXRlZC4iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAwOS0wNS0xOSIpOyAgLy8gU2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQkRBWSIsICIyMDA4LTEwLTIyIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFuZHJvaWRQcm9wVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCAiMTk4Mi0wNi0xNiIsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5kcm9pZFByb3BWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsICIyMDE4LTAzLTEyIiwgRXZlbnQuVFlQRV9PVEhFUikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmRyb2lkUHJvcFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoZW4gdGhlIFRvd2VyIG9mIEhhbm9pIHdpdGggNjQgcmluZ3MgaXMgY29tcGxldGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LlRZUEVfQ1VTVE9NLCAiVGhlIGxhc3QgZGF5IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudFYyMSgpIHsKLSAgICAgICAgdGVzdEV2ZW50Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50VjMwKCkgewotICAgICAgICB0ZXN0RXZlbnRDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRWNDAoKSB7Ci0gICAgICAgIHRlc3RFdmVudENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm90ZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLklTX1BSSU1BUlksIDEpOyAgLy8gSnVzdCBpZ25vcmVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYyMSgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYzMCgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVY0MCgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob3RvQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiB1c2VCID0KLSAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpIHx8IFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKHZjYXJkVHlwZSkpOwotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiUGhvdG9UZXN0Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG90by5QSE9UTywgc1Bob3RvQnl0ZUFycmF5KTsKLQotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXNGb3JQaG90byA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JQaG90by5wdXQoIkVOQ09ESU5HIiwgKHVzZUIgPyAiYiIgOiAiQkFTRTY0IikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiUGhvdG9UZXN0IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlBob3RvVGVzdDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUGhvdG9UZXN0IiwgIiIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlBIT1RPIiwgbnVsbCwgbnVsbCwgc1Bob3RvQnl0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0ZvclBob3RvLCBuZXcgVHlwZVNldCgiSlBFRyIpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvdG9WMjEoKSB7Ci0gICAgICAgIHRlc3RQaG90b0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG90b1YzMCgpIHsKLSAgICAgICAgdGVzdFBob3RvQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob3RvVjQwKCkgewotICAgICAgICB0ZXN0UGhvdG9Db21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFJlbGF0aW9uQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLlRZUEUsIFJlbGF0aW9uLlRZUEVfTU9USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoUmVsYXRpb24uTkFNRSwgIk1zLiBNb3RoZXIiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLlRZUEUsIFJlbGF0aW9uLlRZUEVfTU9USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoUmVsYXRpb24uTkFNRSwgIk1zLiBNb3RoZXIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25WMjEoKSB7Ci0gICAgICAgIHRlc3RSZWxhdGlvbkNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGlvblYzMCgpIHsKLSAgICAgICAgdGVzdFJlbGF0aW9uQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYzMEhhbmRsZUVzY2FwZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXFwiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIjsiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICIsIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlxuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgLy8gVmVyaWZpZXMgdGhlIHZDYXJkIFN0cmluZyBjb3JyZWN0bHkgZXNjYXBlcyBlYWNoIGNoYXJhY3RlciB3aGljaCBtdXN0IGJlIGVzY2FwZWQuCi0gICAgICAgIG1WZXJpZmllci5hZGRMaW5lVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIk46XFxcXDtcXDs7XFwsO1xcbjsiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiRk46Wzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiWzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsIEFycmF5cy5hc0xpc3QoIlxcIiwgIjsiLCAiLCIsICJcbiIsICIiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlcmUncyBubyAiTklDS05BTUUiIHByb3BlcnR5IGluIHZDYXJkIDIuMSwgd2hpbGUgdGhlcmUgaXMgaW4gdkNhcmQgMy4wLgotICAgICAqIFdlIHVzZSBBbmRyb2lkLXNwZWNpZmljICJYLUFORFJPSUQtQ1VTVE9NIiBwcm9wZXJ0eS4KLSAgICAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5pY2tOYW1lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjIxKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSArICI7Tmlja3k7Ozs7Ozs7Ozs7Ozs7OyIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpLmFkZEV4cGVjdGVkKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvbGVyYXRlQnJva2VuUGhvbmVOdW1iZXJFbnRyeVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTEtMjIyLTMzMzMgKE1pYW1pKVxuNDQ0LTU1NTUtNjY2IChUb2t5byk7IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiNzc3LTg4OC05OTk5IChDaGljYWdvKTsxMTEtMjIyLTMzMzMgKE1pYW1pKSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMTEtMjIyLTMzMzMiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0NDQtNTU1LTU2NjYiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3NzctODg4LTk5OTkiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7ICAvLyBFbXB0eSBuYW1lLiBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MSIpICAvLyBOb3QgcHJpbWFyeS4gU2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJkaXNwbGF5Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJmYW1pbHkyIikgIC8vIFRoaXMgZW50cnkgaXMgd2hhdCB3ZSB3YW50LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiZGlzcGxheSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJkaXNwbGF5Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiZGlzcGxheSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsIEFycmF5cy5hc0xpc3QoImZhbWlseTIiLCAiIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiZGlzcGxheSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNWMjEoKSB7Ci0gICAgICAgIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzVjMwKCkgewotICAgICAgICB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc1Y0MCgpIHsKLSAgICAgICAgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VNdWx0aUJ5dGVUeXBlVjMwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjMwKTsKLSAgICAgICAgZmluYWwgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJcdTk2RkJcdThBNzEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJOOiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJGTjoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiVEVMO1RZUEU9XHU5NkZCXHU4QTcxOjEiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJcdTk2RkJcdThBNzEiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW1wb3J0ZXJUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW1wb3J0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWUyOTE0Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5jb3JldGVzdHMuUjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5UeXBlU2V0OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuVkNhcmRUZXN0c0Jhc2U7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Db250ZW50VmFsdWVzVmVyaWZpZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRJbXBvcnRlclRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIC8vIFB1c2ggZGF0YSBpbnRvIGludCBhcnJheSBhdCBmaXJzdCBzaW5jZSB2YWx1ZXMgbGlrZSAweDgwIGFyZQotICAgIC8vIGludGVycHJldGVkIGFzIGludCBieSB0aGUgY29tcGlsZXIgYW5kIGNhc3RpbmcgYWxsIG9mIHRoZW0gaXMKLSAgICAvLyBjdW1iZXJzb21lLi4uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc1Bob3RvSW50QXJyYXlGb3JDb21wbGljYXRlZENhc2UgPSB7Ci0gICAgICAgIDB4ZmYsIDB4ZDgsIDB4ZmYsIDB4ZTEsIDB4MGEsIDB4MGYsIDB4NDUsIDB4NzgsIDB4NjksIDB4NjYsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4NGQsIDB4NGQsIDB4MDAsIDB4MmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MGQsCi0gICAgICAgIDB4MDEsIDB4MGUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4YWEsIDB4MDEsIDB4MGYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4YmEsIDB4MDEsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4YzIsIDB4MDEsIDB4MTIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MWEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzgsIDB4MDEsIDB4MWIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDAsIDB4MDEsIDB4MjgsIDB4MDAsIDB4MDMsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MzEsIDB4MDAsIDB4MDIsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDgsIDB4MDEsIDB4MzIsIDB4MDAsCi0gICAgICAgIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTYsIDB4MDIsIDB4MTMsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ODIsCi0gICAgICAgIDB4OTgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmEsCi0gICAgICAgIDB4ODcsIDB4NjksIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4ODQsIDB4YzQsIDB4YTUsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MWUsIDB4MzIsIDB4MzAsIDB4MzAsIDB4MzgsIDB4MzEsCi0gICAgICAgIDB4MzAsIDB4MzIsIDB4MzksIDB4MzEsIDB4MzMsIDB4MzUsIDB4MzUsIDB4MzMsIDB4MzEsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4NDQsIDB4NmYsIDB4NDMsIDB4NmYsIDB4NGQsIDB4NmYsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MzksIDB4MzAsCi0gICAgICAgIDB4MzUsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDQsIDB4MzksIDB4MzAsCi0gICAgICAgIDB4MzUsIDB4NjksIDB4MjAsIDB4NTYsIDB4NjUsIDB4NzIsIDB4MzEsIDB4MmUsIDB4MzAsIDB4MzAsIDB4MDAsCi0gICAgICAgIDB4MzIsIDB4MzAsIDB4MzAsIDB4MzgsIDB4M2EsIDB4MzEsIDB4MzAsIDB4M2EsIDB4MzIsIDB4MzksIDB4MjAsCi0gICAgICAgIDB4MzEsIDB4MzMsIDB4M2EsIDB4MzUsIDB4MzUsIDB4M2EsIDB4MzQsIDB4MzcsIDB4MDAsIDB4MjAsIDB4MjAsCi0gICAgICAgIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCi0gICAgICAgIDB4MDAsIDB4NTAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NDksIDB4NGQsIDB4MDAsIDB4MzAsIDB4MzMsCi0gICAgICAgIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MTQsIDB4MDAsCi0gICAgICAgIDB4MTQsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MzQsIDB4MDEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MTAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MTEsIDB4MDksIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGIsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4OTcsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDgsIDB4YjAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MWMsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4NWUsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGIsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4Y2IsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MWIsIDB4ZTUsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MjgsIDB4ODIsIDB4OWEsIDB4MDAsIDB4MDUsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NmEsIDB4ODIsIDB4OWQsIDB4MDAsIDB4MDUsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NzIsIDB4ODgsIDB4MjIsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4OTAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MzAsIDB4MzIsIDB4MzIsIDB4MzAsIDB4OTAsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4N2EsCi0gICAgICAgIDB4OTAsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDMsCi0gICAgICAgIDB4OGUsIDB4OTEsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDEsIDB4MDIsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4OTEsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4YTIsIDB4OTIsIDB4MDEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDMsIDB4YWEsIDB4OTIsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YjIsIDB4OTIsIDB4MDQsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YmEsIDB4OTIsIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YzIsIDB4OTIsIDB4MDcsIDB4MDAsIDB4MDMsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDgsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDksCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsCi0gICAgICAgIDB4MGEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4Y2EsCi0gICAgICAgIDB4OTIsIDB4N2MsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4OTIsIDB4ODYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4ZDIsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MzAsCi0gICAgICAgIDB4MzEsIDB4MzAsIDB4MzAsIDB4YTAsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4YTAsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4YTAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4YTAsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4YTIsIDB4MGUsIDB4MDAsIDB4MDUsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZTgsIDB4YTIsIDB4MGYsIDB4MDAsCi0gICAgICAgIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZjAsIDB4YTIsIDB4MTAsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4YTIsCi0gICAgICAgIDB4MTcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4YTMsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4YTMsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDQsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZjgsIDB4YTQsIDB4MDUsIDB4MDAsIDB4MDMsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MWQsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDYsIDB4MDAsIDB4MDMsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDcsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDgsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsCi0gICAgICAgIDB4MDksIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4YTQsIDB4MGEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4YTQsIDB4MGMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTMsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NWUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjQsCi0gICAgICAgIDB4MzIsIDB4MzAsIDB4MzAsIDB4MzgsIDB4M2EsIDB4MzEsIDB4MzAsIDB4M2EsIDB4MzIsIDB4MzksIDB4MjAsCi0gICAgICAgIDB4MzEsIDB4MzMsIDB4M2EsIDB4MzUsIDB4MzUsIDB4M2EsIDB4MzMsIDB4MzEsIDB4MDAsIDB4MzIsIDB4MzAsCi0gICAgICAgIDB4MzAsIDB4MzgsIDB4M2EsIDB4MzEsIDB4MzAsIDB4M2EsIDB4MzIsIDB4MzksIDB4MjAsIDB4MzEsIDB4MzMsCi0gICAgICAgIDB4M2EsIDB4MzUsIDB4MzUsIDB4M2EsIDB4MzQsIDB4MzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjksIDB4ODgsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NWUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MGUsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZTgsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzIsIDB4MzAsIDB4MzAsCi0gICAgICAgIDB4MzgsIDB4MzEsIDB4MzAsIDB4MzIsIDB4MzksIDB4MzEsIDB4MzMsIDB4MzUsIDB4MzUsIDB4MzMsIDB4MzEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MjAsIDB4MmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MmEsCi0gICAgICAgIDB4ZTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDQsIDB4NTIsIDB4MzksIDB4MzgsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDQsIDB4MzAsIDB4MzEsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDYsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MWEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDQsIDB4NmMsIDB4MDEsIDB4MWIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDQsIDB4NzQsIDB4MDEsIDB4MjgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDQsIDB4N2MsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDUsIDB4OGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ZmYsIDB4ZDgsIDB4ZmYsIDB4ZGIsIDB4MDAsIDB4ODQsCi0gICAgICAgIDB4MDAsIDB4MjAsIDB4MTYsIDB4MTgsIDB4MWMsIDB4MTgsIDB4MTQsIDB4MjAsIDB4MWMsIDB4MWEsIDB4MWMsCi0gICAgICAgIDB4MjQsIDB4MjIsIDB4MjAsIDB4MjYsIDB4MzAsIDB4NTAsIDB4MzQsIDB4MzAsIDB4MmMsIDB4MmMsIDB4MzAsCi0gICAgICAgIDB4NjIsIDB4NDYsIDB4NGEsIDB4M2EsIDB4NTAsIDB4NzQsIDB4NjYsIDB4N2EsIDB4NzgsIDB4NzIsIDB4NjYsCi0gICAgICAgIDB4NzAsIDB4NmUsIDB4ODAsIDB4OTAsIDB4YjgsIDB4OWMsIDB4ODAsIDB4ODgsIDB4YWUsIDB4OGEsIDB4NmUsCi0gICAgICAgIDB4NzAsIDB4YTAsIDB4ZGEsIDB4YTIsIDB4YWUsIDB4YmUsIDB4YzQsIDB4Y2UsIDB4ZDAsIDB4Y2UsIDB4N2MsCi0gICAgICAgIDB4OWEsIDB4ZTIsIDB4ZjIsIDB4ZTAsIDB4YzgsIDB4ZjAsIDB4YjgsIDB4Y2EsIDB4Y2UsIDB4YzYsIDB4MDEsCi0gICAgICAgIDB4MjIsIDB4MjQsIDB4MjQsIDB4MzAsIDB4MmEsIDB4MzAsIDB4NWUsIDB4MzQsIDB4MzQsIDB4NWUsIDB4YzYsCi0gICAgICAgIDB4ODQsIDB4NzAsIDB4ODQsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCi0gICAgICAgIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCi0gICAgICAgIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCi0gICAgICAgIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCi0gICAgICAgIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4ZmYsIDB4YzAsCi0gICAgICAgIDB4MDAsIDB4MTEsIDB4MDgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4YTAsIDB4MDMsIDB4MDEsIDB4MjEsIDB4MDAsCi0gICAgICAgIDB4MDIsIDB4MTEsIDB4MDEsIDB4MDMsIDB4MTEsIDB4MDEsIDB4ZmYsIDB4YzQsIDB4MDEsIDB4YTIsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCi0gICAgICAgIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDMsCi0gICAgICAgIDB4MDMsIDB4MDIsIDB4MDQsIDB4MDMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4N2QsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MTEsIDB4MDUsIDB4MTIsIDB4MjEsIDB4MzEsCi0gICAgICAgIDB4NDEsIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsCi0gICAgICAgIDB4OTEsIDB4YTEsIDB4MDgsIDB4MjMsIDB4NDIsIDB4YjEsIDB4YzEsIDB4MTUsIDB4NTIsIDB4ZDEsIDB4ZjAsCi0gICAgICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCi0gICAgICAgIDB4MWEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCi0gICAgICAgIDB4MzgsIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsCi0gICAgICAgIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsCi0gICAgICAgIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCi0gICAgICAgIDB4NzksIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsCi0gICAgICAgIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsCi0gICAgICAgIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsCi0gICAgICAgIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsCi0gICAgICAgIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsCi0gICAgICAgIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZjEsCi0gICAgICAgIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCi0gICAgICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MDQsCi0gICAgICAgIDB4MDQsIDB4MDMsIDB4MDQsIDB4MDcsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NzcsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsIDB4MzEsIDB4MDYsIDB4MTIsCi0gICAgICAgIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsCi0gICAgICAgIDB4NDIsIDB4OTEsIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsIDB4MTUsCi0gICAgICAgIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsCi0gICAgICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsCi0gICAgICAgIDB4MzgsIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsCi0gICAgICAgIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsCi0gICAgICAgIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCi0gICAgICAgIDB4NzksIDB4N2EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsCi0gICAgICAgIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsCi0gICAgICAgIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsCi0gICAgICAgIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsCi0gICAgICAgIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksCi0gICAgICAgIDB4ZGEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZjIsCi0gICAgICAgIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmYsIDB4ZGEsIDB4MDAsCi0gICAgICAgIDB4MGMsIDB4MDMsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MTEsIDB4MDMsIDB4MTEsIDB4MDAsIDB4M2YsIDB4MDAsCi0gICAgICAgIDB4MTQsIDB4NTQsIDB4YWEsIDB4MmEsIDB4NDYsIDB4NDgsIDB4YTIsIDB4YTQsIDB4NTUsIDB4YTYsIDB4MDQsCi0gICAgICAgIDB4OGEsIDB4MjksIDB4ZTAsIDB4NTMsIDB4MTAsIDB4ZTAsIDB4MjksIDB4YzAsIDB4NTAsIDB4MDMsIDB4YjEsCi0gICAgICAgIDB4NDYsIDB4MjksIDB4ODAsIDB4ODQsIDB4NTIsIDB4MTEsIDB4NDAsIDB4MGQsIDB4MjIsIDB4OWEsIDB4NDUsCi0gICAgICAgIDB4MjAsIDB4MjMsIDB4NjEsIDB4NTEsIDB4MzAsIDB4YTAsIDB4MDgsIDB4YzgsIDB4YTgsIDB4ZDgsIDB4NTIsCi0gICAgICAgIDB4MDIsIDB4MjYsIDB4MTUsIDB4MGIsIDB4MGEsIDB4MDAsIDB4YjQsIDB4YTIsIDB4YTUsIDB4NWEsIDB4MDAsCi0gICAgICAgIDB4OTEsIDB4NDUsIDB4NGEsIDB4YTIsIDB4ODEsIDB4OTIsIDB4MDEsIDB4NGUsIDB4MDIsIDB4OTgsIDB4ODcsCi0gICAgICAgIDB4MGEsIDB4NzAsIDB4YTAsIDB4MDcsIDB4NjIsIDB4OGMsIDB4NTAsIDB4MjEsIDB4MGQsIDB4MjUsIDB4MDAsCi0gICAgICAgIDB4MzQsIDB4OGEsIDB4NjEsIDB4MTQsIDB4MGMsIDB4NjMsIDB4MGEsIDB4ODksIDB4ODUsIDB4MDAsIDB4NDYsCi0gICAgICAgIDB4ZDUsIDB4MWIsIDB4NTIsIDB4MDIsIDB4MTYsIDB4YTgsIDB4OTgsIDB4NTAsIDB4MDUsIDB4OTQsIDB4YTksCi0gICAgICAgIDB4MTYsIDB4ODAsIDB4MjUsIDB4NWEsIDB4OTUsIDB4NjgsIDB4MTgsIDB4ZjEsIDB4NGYsIDB4MTQsIDB4YzQsCi0gICAgICAgIDB4M2IsIDB4YjUsIDB4MjIsIDB4YjYsIDB4MzgsIDB4MzQsIDB4MDAsIDB4ZTMsIDB4MjIsIDB4OGUsIDB4ZjQsCi0gICAgICAgIDB4NzksIDB4OGEsIDB4N2IsIDB4ZDEsIDB4NzEsIDB4MDMsIDB4MzAsIDB4YzcsIDB4MTQsIDB4ODMsIDB4YTUsCi0gICAgICAgIDB4MDAsIDB4MDYsIDB4OTgsIDB4NjgsIDB4MDEsIDB4OGQsIDB4NTEsIDB4MzUsIDB4MDMsIDB4MjIsIDB4NmEsCi0gICAgICAgIDB4OGQsIDB4YTksIDB4MDEsIDB4MTMsIDB4NTQsIDB4NGQsIDB4NDAsIDB4MTMsIDB4YTUsIDB4NGEsIDB4MjgsCi0gICAgICAgIDB4MDIsIDB4NDUsIDB4MzUsIDB4MmEsIDB4OWEsIDB4MDAsIDB4NzgsIDB4MzQsIDB4ZjAsIDB4NjksIDB4ODAsCi0gICAgICAgIDB4MzQsIDB4ODEsIDB4NDUsIDB4NDAsIDB4Y2UsIDB4NTgsIDB4ZTYsIDB4YTIsIDB4NGMsIDB4MDYsIDB4ZTQsCi0gICAgICAgIDB4ZmEsIDB4ZDEsIDB4OTMsIDB4NTAsIDB4MjEsIDB4Y2EsIDB4ZTQsIDB4NTUsIDB4ODQsIDB4OTAsIDB4MzAsCi0gICAgICAgIDB4YWIsIDB4OGIsIDB4MTgsIDB4YTYsIDB4OWEsIDB4NmEsIDB4YzQsIDB4MzEsIDB4YWEsIDB4MjYsIDB4YTAsCi0gICAgICAgIDB4NjQsIDB4NGQsIDB4NTEsIDB4YjUsIDB4MjAsIDB4MjMsIDB4NmEsIDB4ODksIDB4YTgsIDB4MDIsIDB4NDQsCi0gICAgICAgIDB4MzUsIDB4MmEsIDB4OWEsIDB4MDAsIDB4OTUsIDB4NGQsIDB4NDgsIDB4YTYsIDB4ODAsIDB4MjQsIDB4NTMsCi0gICAgICAgIDB4NGUsIDB4Y2UsIDB4MDUsIDB4MzAsIDB4MmIsIDB4M2IsIDB4ZWUsIDB4NmEsIDB4OTEsIDB4NWQsIDB4NzYsCi0gICAgICAgIDB4NjMsIDB4YmQsIDB4NjUsIDB4N2QsIDB4NDAsIDB4NjYsIDB4NjgsIDB4YTksIDB4MDIsIDB4NDUsIDB4MmIsCi0gICAgICAgIDB4YjMsIDB4OWUsIDB4YjQsIDB4YzUsIDB4NmQsIDB4YWQsIDB4OWEsIDB4YTAsIDB4MmMsIDB4MDYsIDB4YzgsCi0gICAgICAgIDB4Y2QsIDB4MDQsIDB4ZDYsIDB4YTIsIDB4MjMsIDB4NjMsIDB4NTEsIDB4YjEsIDB4YTAsIDB4NjQsIDB4NGQsCi0gICAgICAgIDB4NTEsIDB4OTMsIDB4NDgsIDB4MDgsIDB4ZGEsIDB4YTIsIDB4NmEsIDB4MDAsIDB4NzIsIDB4MWEsIDB4OTksCi0gICAgICAgIDB4NGQsIDB4MDAsIDB4NDgsIDB4YTYsIDB4YTQsIDB4NTMsIDB4NGMsIDB4MDcsIDB4ODYsIDB4MDMsIDB4YmQsCi0gICAgICAgIDB4MmIsIDB4OWMsIDB4YTcsIDB4MTQsIDB4OTgsIDB4MTAsIDB4ODUsIDB4MzQsIDB4ZTAsIDB4YTYsIDB4YjMsCi0gICAgICAgIDB4YjAsIDB4MGIsIDB4YjUsIDB4YTgsIDB4MGEsIDB4ZDQsIDB4NTgsIDB4NDIsIDB4ZWQsIDB4M2UsIDB4OTQsCi0gICAgICAgIDB4ZDIsIDB4YTYsIDB4OGIsIDB4MDEsIDB4MzQsIDB4NDQsIDB4ZWQsIDB4ZTYsIDB4OWMsIDB4NGQsIDB4NmEsCi0gICAgICAgIDB4ODAsIDB4OGQsIDB4OGQsIDB4NDYsIDB4YzYsIDB4ODAsIDB4MjMsIDB4NjMsIDB4NTEsIDB4OWEsIDB4MDYsCi0gICAgICAgIDB4NDYsIDB4ZDUsIDB4MTMsIDB4NTIsIDB4MDEsIDB4NTQsIDB4ZDQsIDB4YWEsIDB4NjgsIDB4MDIsIDB4NDAsCi0gICAgICAgIDB4NmEsIDB4NDAsIDB4NzgsIDB4YTAsIDB4MDgsIDB4NTksIDB4Y2UsIDB4ZWUsIDB4YjUsIDB4MmEsIDB4MzksCi0gICAgICAgIDB4ZDksIDB4NTksIDB4YTcsIDB4YTgsIDB4MDAsIDB4NzMsIDB4ZWIsIDB4NGUsIDB4MGUsIDB4N2QsIDB4NjksCi0gICAgICAgIDB4NWMsIDB4MDUsIDB4ZjMsIDB4MGYsIDB4YWQsIDB4MWUsIDB4NjEsIDB4ZjUsIDB4YTcsIDB4NzEsIDB4MGIsCi0gICAgICAgIDB4ZTYsIDB4MzUsIDB4MjEsIDB4OTAsIDB4ZDMsIDB4YjgsIDB4MGUsIDB4MzIsIDB4MTAsIDB4OTUsIDB4MTAsCi0gICAgICAgIDB4OTEsIDB4YjMsIDB4ZDYsIDB4OWIsIDB4NjAsIDB4NGIsIDB4OWMsIDB4OGEsIDB4NjMsIDB4MWEsIDB4YjAsCi0gICAgICAgIDB4MTgsIDB4NGQsIDB4NDYsIDB4YzYsIDB4ODAsIDB4MjIsIDB4NmEsIDB4NjEsIDB4YTQsIDB4MzEsIDB4YWEsCi0gICAgICAgIDB4NmEsIDB4NTUsIDB4MzQsIDB4MDEsIDB4MmEsIDB4OWEsIDB4N2UsIDB4NzgsIDB4YTAsIDB4MDgsIDB4MDksCi0gICAgICAgIDB4ZjksIDB4YWEsIDB4NTgsIDB4Y2YsIDB4Y2EsIDB4NmIsIDB4M2UsIDB4YTAsIDB4MDAsIDB4ZDMsIDB4ODEsCi0gICAgICAgIDB4YTksIDB4MDEsIDB4NzMsIDB4NDYsIDB4NjksIDB4ODAsIDB4YjksIDB4YTQsIDB4Y2QsIDB4MDAsIDB4MmIsCi0gICAgICAgIDB4MWYsIDB4OTIsIDB4YTMsIDB4MDcsIDB4OWEsIDB4NmYsIDB4NzAsIDB4MjYsIDB4Y2YsIDB4MTQsIDB4ZDIsCi0gICAgICAgIDB4NmIsIDB4NTEsIDB4MGMsIDB4NjMsIDB4NTEsIDB4YjEsIDB4YTAsIDB4MDgsIDB4ZGEsIDB4OTgsIDB4NjksCi0gICAgICAgIDB4MGMsIDB4OGQsIDB4NGQsIDB4NGEsIDB4YTYsIDB4ODAsIDB4MjQsIDB4NTMsIDB4NTIsIDB4MDMsIDB4YzUsCi0gICAgICAgIDB4MDIsIDB4MjEsIDB4MjcsIDB4ZTYsIDB4YTksIDB4MjMsIDB4M2YsIDB4MjksIDB4YWMsIDB4ZmEsIDB4OGMsCi0gICAgICAgIDB4MDEsIDB4ZTYsIDB4OWMsIDB4MGQsIDB4NDgsIDB4MGEsIDB4MGQsIDB4MmUsIDB4NjgsIDB4MDEsIDB4NzMsCi0gICAgICAgIDB4NDksIDB4OWEsIDB4NjAsIDB4MmIsIDB4MWYsIDB4OTIsIDB4OTgsIDB4M2EsIDB4ZDMsIDB4N2IsIDB4ODEsCi0gICAgICAgIDB4MzYsIDB4NzgsIDB4YTYsIDB4OTMsIDB4NWEsIDB4ODgsIDB4OGMsIDB4OWEsIDB4NjMsIDB4MWEsIDB4MDAsCi0gICAgICAgIDB4OGMsIDB4ZDMsIDB4MGQsIDB4MjEsIDB4OTEsIDB4MjksIDB4YTksIDB4MTQsIDB4ZDAsIDB4MDQsIDB4OGEsCi0gICAgICAgIDB4NjksIDB4ZTAsIDB4ZDMsIDB4MTEsIDB4MWIsIDB4MWUsIDB4NmEsIDB4NDgsIDB4Y2YsIDB4Y2EsIDB4NmIsCi0gICAgICAgIDB4M2UsIDB4YTMsIDB4MTAsIDB4MWEsIDB4NzAsIDB4MzUsIDB4MjAsIDB4MzgsIDB4MWEsIDB4NWMsIDB4ZDIsCi0gICAgICAgIDB4MDEsIDB4NzMsIDB4NDksIDB4OWEsIDB4NjAsIDB4MzksIDB4OGYsIDB4Y2EsIDB4MjksIDB4OGIsIDB4ZjcsCi0gICAgICAgIDB4YWEsIDB4YmEsIDB4ODgsIDB4OTYsIDB4OWEsIDB4NmIsIDB4NDAsIDB4MTgsIDB4YzYsIDB4YTMsIDB4MjYsCi0gICAgICAgIDB4ODAsIDB4MTgsIDB4NjksIDB4YTYsIDB4OTAsIDB4YzgsIDB4MTQsIDB4ZDQsIDB4OGEsIDB4NjksIDB4ODAsCi0gICAgICAgIDB4ZjAsIDB4NmEsIDB4NDAsIDB4NjgsIDB4MTAsIDB4YmIsIDB4NDEsIDB4YTcsIDB4ZTMsIDB4MGIsIDB4YzUsCi0gICAgICAgIDB4MmIsIDB4MDEsIDB4MTAsIDB4YTcsIDB4MDMsIDB4NTksIDB4MGMsIDB4NzYsIDB4NjksIDB4NzMsIDB4NDAsCi0gICAgICAgIDB4MGIsIDB4OWEsIDB4MjgsIDB4MTEsIDB4MjgsIDB4MTksIDB4NWUsIDB4NjksIDB4MDIsIDB4ODEsIDB4NWEsCi0gICAgICAgIDB4ZDgsIDB4MDAsIDB4ZDMsIDB4NGQsIDB4NTAsIDB4MGMsIDB4NmEsIDB4OGMsIDB4ZDIsIDB4MDEsIDB4YTYsCi0gICAgICAgIDB4OTgsIDB4NjksIDB4MGMsIDB4YWUsIDB4YTYsIDB4YTQsIDB4MDYsIDB4ODAsIDB4MWUsIDB4YTYsIDB4OWUsCi0gICAgICAgIDB4MGQsIDB4MzEsIDB4MTIsIDB4MDMsIDB4NGYsIDB4MDYsIDB4ODAsIDB4MTMsIDB4NjAsIDB4MzQsIDB4ZDMsCi0gICAgICAgIDB4YzEsIDB4YTgsIDB4OTIsIDB4MDEsIDB4ZjEsIDB4OGQsIDB4ZGQsIDB4NjksIDB4Y2MsIDB4YTEsIDB4NjksCi0gICAgICAgIDB4NWIsIDB4NGIsIDB4ODAsIDB4ODMsIDB4OTMsIDB4NTIsIDB4MDQsIDB4MTQsIDB4ZTIsIDB4YWUsIDB4MDMsCi0gICAgICAgIDB4YTksIDB4MGQsIDB4NjgsIDB4MDMsIDB4NGQsIDB4MzQsIDB4ZDAsIDB4MDMsIDB4MGQsIDB4MzAsIDB4ZDIsCi0gICAgICAgIDB4MDEsIDB4ODYsIDB4OWEsIDB4NjgsIDB4MTksIDB4NTgsIDB4MWEsIDB4NzgsIDB4YTQsIDB4MDQsIDB4OGEsCi0gICAgICAgIDB4NjksIDB4ZTAsIDB4ZDMsIDB4MTAsIDB4ZTAsIDB4NjksIDB4ZTAsIDB4ZDAsIDB4MDMsIDB4YzEsIDB4YTgsCi0gICAgICAgIDB4ZGIsIDB4YWQsIDB4NGMsIDB4ODEsIDB4MTIsIDB4NDUsIDB4ZDYsIDB4OWQsIDB4MjUsIDB4MWQsIDB4MDAsCi0gICAgICAgIDB4NmEsIDB4ZjUsIDB4YTksIDB4ZTgsIDB4ODAsIDB4MzEsIDB4MjksIDB4MGQsIDB4NTgsIDB4MDgsIDB4NjksCi0gICAgICAgIDB4ODYsIDB4ODAsIDB4MWEsIDB4NjksIDB4ODYsIDB4OTAsIDB4MGMsIDB4MzQsIDB4ZDMsIDB4NDgsIDB4NjUsCi0gICAgICAgIDB4NTEsIDB4NGYsIDB4MDYsIDB4OTgsIDB4MGYsIDB4MTQsIDB4ZjAsIDB4NjgsIDB4MTAsIDB4ZjAsIDB4NjksCi0gICAgICAgIDB4ZTAsIDB4ZDAsIDB4MDMsIDB4ODEsIDB4YTUsIDB4MmIsIDB4OWEsIDB4MWEsIDB4YjgsIDB4ODcsIDB4YTgsCi0gICAgICAgIDB4ZGIsIDB4NGEsIDB4NDYsIDB4NjgsIDB4YjYsIDB4ODAsIDB4MmEsIDB4YTgsIDB4MTQsIDB4ZWEsIDB4MTIsCi0gICAgICAgIDB4YjAsIDB4MDUsIDB4MjEsIDB4YTYsIDB4MDIsIDB4MWEsIDB4NjEsIDB4YTAsIDB4MDYsIDB4OWEsIDB4NjEsCi0gICAgICAgIDB4YTQsIDB4MzEsIDB4ODYsIDB4OWEsIDB4NjksIDB4MGMsIDB4YTgsIDB4MGQsIDB4M2MsIDB4NTMsIDB4MDEsCi0gICAgICAgIDB4ZTIsIDB4OWUsIDB4MjgsIDB4MTAsIDB4ZjEsIDB4NGUsIDB4MDYsIDB4OTgsIDB4MGYsIDB4MDYsIDB4OWUsCi0gICAgICAgIDB4MGQsIDB4MDIsIDB4MWMsIDB4MjksIDB4YzIsIDB4ODAsIDB4MTYsIDB4OTYsIDB4ODAsIDB4MGEsIDB4NGEsCi0gICAgICAgIDB4MDAsIDB4NDMsIDB4NGQsIDB4MzQsIDB4MGMsIDB4NjEsIDB4YTYsIDB4MWEsIDB4NDAsIDB4MzQsIDB4ZDMsCi0gICAgICAgIDB4NGQsIDB4MjEsIDB4ODAsIDB4ZmYsIDB4ZDksIDB4ZmYsIDB4ZGIsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MGEsCi0gICAgICAgIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDcsIDB4MDYsIDB4MGEsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MGIsIDB4MGEsCi0gICAgICAgIDB4MGEsIDB4MGIsIDB4MGUsIDB4MTgsIDB4MTAsIDB4MGUsIDB4MGQsIDB4MGQsIDB4MGUsIDB4MWQsIDB4MTUsCi0gICAgICAgIDB4MTYsIDB4MTEsIDB4MTgsIDB4MjMsIDB4MWYsIDB4MjUsIDB4MjQsIDB4MjIsIDB4MWYsIDB4MjIsIDB4MjEsCi0gICAgICAgIDB4MjYsIDB4MmIsIDB4MzcsIDB4MmYsIDB4MjYsIDB4MjksIDB4MzQsIDB4MjksIDB4MjEsIDB4MjIsIDB4MzAsCi0gICAgICAgIDB4NDEsIDB4MzEsIDB4MzQsIDB4MzksIDB4M2IsIDB4M2UsIDB4M2UsIDB4M2UsIDB4MjUsIDB4MmUsIDB4NDQsCi0gICAgICAgIDB4NDksIDB4NDMsIDB4M2MsIDB4NDgsIDB4MzcsIDB4M2QsIDB4M2UsIDB4M2IsIDB4MDEsIDB4MGEsIDB4MGIsCi0gICAgICAgIDB4MGIsIDB4MGUsIDB4MGQsIDB4MGUsIDB4MWMsIDB4MTAsIDB4MTAsIDB4MWMsIDB4M2IsIDB4MjgsIDB4MjIsCi0gICAgICAgIDB4MjgsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsCi0gICAgICAgIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsCi0gICAgICAgIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsCi0gICAgICAgIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsCi0gICAgICAgIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4ZmYsIDB4YzAsIDB4MDAsIDB4MTEsCi0gICAgICAgIDB4MDgsIDB4MDAsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MDMsIDB4MDEsIDB4MjEsIDB4MDAsIDB4MDIsIDB4MTEsCi0gICAgICAgIDB4MDEsIDB4MDMsIDB4MTEsIDB4MDEsIDB4ZmYsIDB4YzQsIDB4MDEsIDB4YTIsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0gICAgICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDIsCi0gICAgICAgIDB4MDQsIDB4MDMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4N2QsIDB4MDEsCi0gICAgICAgIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MTEsIDB4MDUsIDB4MTIsIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsCi0gICAgICAgIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4YTEsCi0gICAgICAgIDB4MDgsIDB4MjMsIDB4NDIsIDB4YjEsIDB4YzEsIDB4MTUsIDB4NTIsIDB4ZDEsIDB4ZjAsIDB4MjQsIDB4MzMsCi0gICAgICAgIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjUsCi0gICAgICAgIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksCi0gICAgICAgIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsCi0gICAgICAgIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCi0gICAgICAgIDB4NjgsIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsCi0gICAgICAgIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsIDB4OTQsCi0gICAgICAgIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsCi0gICAgICAgIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsCi0gICAgICAgIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsCi0gICAgICAgIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTEsIDB4ZTIsCi0gICAgICAgIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZjEsIDB4ZjIsIDB4ZjMsCi0gICAgICAgIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDEsCi0gICAgICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsCi0gICAgICAgIDB4MDksIDB4MGEsIDB4MGIsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDQsIDB4MDMsCi0gICAgICAgIDB4MDQsIDB4MDcsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NzcsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsCi0gICAgICAgIDB4MDcsIDB4NjEsIDB4NzEsIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsCi0gICAgICAgIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsIDB4MTUsIDB4NjIsIDB4NzIsCi0gICAgICAgIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsIDB4MTgsIDB4MTksCi0gICAgICAgIDB4MWEsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksCi0gICAgICAgIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsCi0gICAgICAgIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCi0gICAgICAgIDB4NjgsIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsCi0gICAgICAgIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsCi0gICAgICAgIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCi0gICAgICAgIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsCi0gICAgICAgIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksCi0gICAgICAgIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTIsCi0gICAgICAgIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsCi0gICAgICAgIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmYsIDB4ZGEsIDB4MDAsIDB4MGMsIDB4MDMsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDIsIDB4MTEsIDB4MDMsIDB4MTEsIDB4MDAsIDB4M2YsIDB4MDAsIDB4OWUsIDB4ZDIsCi0gICAgICAgIDB4MmUsIDB4MDcsIDB4MTUsIDB4YWYsIDB4NmQsIDB4MDgsIDB4ZTIsIDB4YjMsIDB4NDUsIDB4MWEsIDB4ZjYsCi0gICAgICAgIDB4ZDAsIDB4MDAsIDB4MDEsIDB4YzUsIDB4NjgsIDB4NDUsIDB4MTcsIDB4NGEsIDB4YjQsIDB4MjIsIDB4ZTQsCi0gICAgICAgIDB4NzAsIDB4OGMsIDB4NzQsIDB4YTksIDB4M2MsIDB4YTEsIDB4OGUsIDB4OTUsIDB4NDgsIDB4OTYsIDB4MzEsCi0gICAgICAgIDB4ZTIsIDB4MTgsIDB4ZTksIDB4NTUsIDB4YTUsIDB4OGMsIDB4N2EsIDB4NTAsIDB4MDUsIDB4MGIsIDB4ODgsCi0gICAgICAgIDB4ODYsIDB4MGYsIDB4MTUsIDB4OGYsIDB4NzUsIDB4MWYsIDB4MjYsIDB4OTMsIDB4MTksIDB4OTEsIDB4NzcsCi0gICAgICAgIDB4MTgsIDB4YzEsIDB4YWMsIDB4NGIsIDB4YzgsIDB4ZmEsIDB4ZDYsIDB4NjMsIDB4MzcsIDB4NmQsIDB4MzEsCi0gICAgICAgIDB4YjQsIDB4NzMsIDB4NWIsIDB4MzYsIDB4YTAsIDB4MWMsIDB4NTAsIDB4ODAsIDB4ZDcsIDB4ODMsIDB4YTAsCi0gICAgICAgIDB4YWIsIDB4ZDEsIDB4NjIsIDB4YWQsIDB4MDksIDB4OGYsIDB4MTcsIDB4MjksIDB4MDMsIDB4YjIsIDB4Y2MsCi0gICAgICAgIDB4ZTAsIDB4NzcsIDB4MTQsIDB4YTMsIDB4NTYsIDB4YjMsIDB4MjcsIDB4MWUsIDB4NjcsIDB4ZTksIDB4NTIsCi0gICAgICAgIDB4ZWEsIDB4YzYsIDB4M2EsIDB4MzYsIDB4NDgsIDB4ZWYsIDB4M2QsIDB4MjcsIDB4NzAsIDB4MjIsIDB4NjAsCi0gICAgICAgIDB4NDcsIDB4NTIsIDB4NjksIDB4YjIsIDB4ZTIsIDB4YWQsIDB4M2IsIDB4ZWEsIDB4ODAsIDB4YTMsIDB4MzgsCi0gICAgICAgIDB4ZTAsIDB4ZDYsIDB4M2QsIDB4ZDgsIDB4MWMsIDB4ZDAsIDB4Y2EsIDB4NDYsIDB4M2QsIDB4ZDAsIDB4MTgsCi0gICAgICAgIDB4MzUsIDB4ODksIDB4NzgsIDB4YTMsIDB4OWEsIDB4Y2QsIDB4OGMsIDB4ZDIsIDB4YjMsIDB4OTMsIDB4MmEsCi0gICAgICAgIDB4MmIsIDB4NjYsIDB4ZDUsIDB4ZjEsIDB4OGEsIDB4MTAsIDB4MWEsIDB4ZDYsIDB4ZjIsIDB4MDMsIDB4OGEsCi0gICAgICAgIDB4OWUsIDB4ZTYsIDB4ZjQsIDB4NWEsIDB4ZGIsIDB4ZWYsIDB4ZmUsIDB4MjMsIDB4YzAsIDB4YTcsIDB4MjcsCi0gICAgICAgIDB4Y2IsIDB4MTYsIDB4YzQsIDB4Y2MsIDB4ZGQsIDB4ZTIsIDB4NzgsIDB4OWEsIDB4NjksIDB4NjYsIDB4Y2MsCi0gICAgICAgIDB4OTksIDB4ZTEsIDB4NGQsIDB4NDcsIDB4YmEsIDB4YmMsIDB4ZDksIDB4NmEsIDB4ZWUsIDB4MjYsIDB4NTksCi0gICAgICAgIDB4NTksIDB4NGQsIDB4YWMsIDB4NjksIDB4MzQsIDB4NTIsIDB4ZTUsIDB4OGYsIDB4NTUsIDB4YWQsIDB4NTgsCi0gICAgICAgIDB4YWUsIDB4ODUsIDB4YzQsIDB4MjIsIDB4NDEsIDB4ZGYsIDB4YWQsIDB4NzYsIDB4NjEsIDB4ZTUsIDB4NmYsCi0gICAgICAgIDB4NzQsIDB4NDUsIDB4NjksIDB4ZGMsIDB4MDAsIDB4NzksIDB4YWMsIDB4OGIsIDB4YTYsIDB4YzksIDB4MzUsCi0gICAgICAgIDB4ZDQsIDB4MzQsIDB4NjQsIDB4ZGMsIDB4MzcsIDB4MDYsIDB4YjEsIDB4YWUsIDB4ODgsIDB4YzEsIDB4YWMsCi0gICAgICAgIDB4ZDgsIDB4YzksIDB4MmMsIDB4YTYsIDB4ZTAsIDB4NzMsIDB4NWIsIDB4MzYsIDB4ZjMsIDB4NzQsIDB4ZTYsCi0gICAgICAgIDB4ODQsIDB4MDUsIDB4ZTMsIDB4YTksIDB4NDcsIDB4NmEsIDB4MTQsIDB4YjYsIDB4NDksIDB4M2QsIDB4ODUsCi0gICAgICAgIDB4M2EsIDB4ZWUsIDB4ZWUsIDB4MmIsIDB4YTgsIDB4ZTIsIDB4NmYsIDB4MzAsIDB4ODEsIDB4ZTksIDB4OGEsCi0gICAgICAgIDB4Y2EsIDB4YTQsIDB4ZTIsIDB4ZDMsIDB4OGIsIDB4MDEsIDB4YjEsIDB4ZjksIDB4MDQsIDB4N2YsIDB4YWYsCi0gICAgICAgIDB4MjMsIDB4ZjAsIDB4YTksIDB4NTQsIDB4NDEsIDB4OWMsIDB4ZmQsIDB4YTMsIDB4ZjQsIDB4YWUsIDB4NjUsCi0gICAgICAgIDB4MTgsIDB4ZjcsIDB4MjUsIDB4OGEsIDB4ZTIsIDB4MDIsIDB4MzgsIDB4YjgsIDB4ZmQsIDB4MmEsIDB4N2IsCi0gICAgICAgIDB4NWIsIDB4YTgsIDB4NmQsIDB4NmQsIDB4NWQsIDB4OWEsIDB4NWQsIDB4Y2IsIDB4YmIsIDB4ZDIsIDB4YjYsCi0gICAgICAgIDB4YTYsIDB4YTMsIDB4MTksIDB4NWUsIDB4ZTIsIDB4MDMsIDB4N2IsIDB4MWQsIDB4YzIsIDB4MTcsIDB4OGQsCi0gICAgICAgIDB4YjgsIDB4YWMsIDB4ZmIsIDB4ODksIDB4MzksIDB4MzUsIDB4ZDYsIDB4OWEsIDB4NmEsIDB4ZTgsIDB4NjYsCi0gICAgICAgIDB4NTUsIDB4Y2IsIDB4ZjUsIDB4YWMsIDB4N2IsIDB4OTYsIDB4ZWIsIDB4NTAsIDB4YzYsIDB4ODgsIDB4NmQsCi0gICAgICAgIDB4NjYsIDB4ZTksIDB4Y2QsIDB4NmMsIDB4ZGIsIDB4NGYsIDB4ZDMsIDB4OWEsIDB4MDAsIDB4MmYsIDB4ZTYsCi0gICAgICAgIDB4ZjksIDB4YTMsIDB4ZTcsIDB4YjUsIDB4NGEsIDB4OTMsIDB4N2YsIDB4YTIsIDB4YzYsIDB4NzMsIDB4ZGMsCi0gICAgICAgIDB4ZDcsIDB4MTUsIDB4NTUsIDB4ZWYsIDB4NDgsIDB4N2QsIDB4MDksIDB4NTIsIDB4NmUsIDB4M2EsIDB4ZDQsCi0gICAgICAgIDB4YWIsIDB4MmYsIDB4YmQsIDB4NjEsIDB4MTYsIDB4MGMsIDB4NzMsIDB4NDksIDB4YzUsIDB4MjQsIDB4OTIsCi0gICAgICAgIDB4N2YsIDB4YTIsIDB4NjMsIDB4ZmQsIDB4YWEsIDB4ZDYsIDB4MmYsIDB4NzEsIDB4MGUsIDB4YjEsIDB4OTMsCi0gICAgICAgIDB4ZjcsIDB4MmQsIDB4ZjUsIDB4YTQsIDB4OWUsIDB4NGUsIDB4YjUsIDB4ZGQsIDB4NGIsIDB4ZjgsIDB4NjgsCi0gICAgICAgIDB4NGMsIDB4Y2IsIDB4YjksIDB4OTMsIDB4YWQsIDB4NjUsIDB4Y2UsIDB4ZDksIDB4MjYsIDB4YTksIDB4OGQsCi0gICAgICAgIDB4MTksIDB4ZjYsIDB4ZjIsIDB4ZjQsIDB4ZTYsIDB4YjUsIDB4YWQsIDB4ZTcsIDB4YzYsIDB4MzksIDB4YTAsCi0gICAgICAgIDB4MTgsIDB4ZWIsIDB4YzksIDB4NzcsIDB4NmMsIDB4MzUsIDB4MmEsIDB4NGIsIDB4ZmUsIDB4OGEsIDB4OWMsCi0gICAgICAgIDB4ZmYsIDB4MDAsIDB4MTEsIDB4YWUsIDB4M2EsIDB4OGIsIDB4ZGUsIDB4NjEsIDB4ZDAsIDB4OWUsIDB4MzksCi0gICAgICAgIDB4YjgsIDB4ZWIsIDB4NTMsIDB4YWMsIDB4YjksIDB4YWUsIDB4NWIsIDB4MDAsIDB4ZjMsIDB4MjcsIDB4MTQsCi0gICAgICAgIDB4OTIsIDB4YzksIDB4ZmUsIDB4OGEsIDB4M2YsIDB4ZGUsIDB4MzUsIDB4YWMsIDB4M2EsIDB4ODgsIDB4OTIsCi0gICAgICAgIDB4Y2QsIDB4YjEsIDB4NmUsIDB4N2QsIDB4Y2QsIDB4MzIsIDB4NjcsIDB4ZWIsIDB4Y2QsIDB4N2EsIDB4MTQsCi0gICAgICAgIDB4ZmUsIDB4MDQsIDB4MjYsIDB4NjYsIDB4Y2UsIDB4ZjksIDB4MjYsIDB4YjMsIDB4ZTYsIDB4NmUsIDB4YjQsCi0gICAgICAgIDB4ZDksIDB4NDgsIDB4YzgsIDB4ODIsIDB4NGUsIDB4MDcsIDB4MzUsIDB4YTcsIDB4NmYsIDB4MmYsIDB4MDIsCi0gICAgICAgIDB4OWEsIDB4MDYsIDB4NWYsIDB4OGMsIDB4YTQsIDB4ODMsIDB4MGUsIDB4MzIsIDB4MmEsIDB4NjksIDB4ZTMsCi0gICAgICAgIDB4ZGQsIDB4MTIsIDB4MDgsIDB4OTcsIDB4ODUsIDB4ZWMsIDB4MmEsIDB4MmEsIDB4NDIsIDB4ZjEsIDB4NzYsCi0gICAgICAgIDB4MjYsIDB4ZTQsIDB4NmEsIDB4NTksIDB4MGUsIDB4MTgsIDB4MTAsIDB4NmEsIDB4ZDIsIDB4ODksIDB4MDIsCi0gICAgICAgIDB4NmUsIDB4MmEsIDB4NzEsIDB4ZWIsIDB4NWMsIDB4MWMsIDB4OGMsIDB4YTYsIDB4NDgsIDB4YmIsIDB4ZGMsCi0gICAgICAgIDB4NjEsIDB4NDEsIDB4MzUsIDB4NzIsIDB4MjgsIDB4ODcsIDB4ZDksIDB4ZjYsIDB4NGEsIDB4YjksIDB4ZTcsCi0gICAgICAgIDB4MzgsIDB4YWUsIDB4OGMsIDB4M2QsIDB4MzYsIDB4ZGQsIDB4ZGUsIDB4YzQsIDB4YjAsIDB4MjEsIDB4NTEsCi0gICAgICAgIDB4NzYsIDB4YTgsIDB4YzAsIDB4YWEsIDB4OTMsIDB4MzEsIDB4ZTYsIDB4YmIsIDB4MmQsIDB4NjUsIDB4NjEsCi0gICAgICAgIDB4MTksIDB4ZDMsIDB4MWUsIDB4YjUsIDB4NDYsIDB4NWEsIDB4OTYsIDB4NWEsIDB4MzAsIDB4YTAsIDB4N2UsCi0gICAgICAgIDB4MDUsIDB4NjksIDB4NWIsIDB4YzksIDB4YzYsIDB4MjgsIDB4NDAsIDB4Y2QsIDB4MDgsIDB4NjQsIDB4M2MsCi0gICAgICAgIDB4NzMsIDB4NTcsIDB4ZTEsIDB4OTQsIDB4ZjEsIDB4Y2QsIDB4NWEsIDB4MjEsIDB4OGMsIDB4YjksIDB4NjMsCi0gICAgICAgIDB4ZTcsIDB4NjcsIDB4MWQsIDB4YWIsIDB4NDAsIDB4YjEsIDB4ZmIsIDB4MDAsIDB4MWQsIDB4ZjAsIDB4MmIsCi0gICAgICAgIDB4OTksIDB4MmQsIDB4NjYsIDB4M2UsIDB4ODgsIDB4NzUsIDB4ODEsIDB4M2YsIDB4MzEsIDB4ZjYsIDB4YWIsCi0gICAgICAgIDB4NjQsIDB4ZDYsIDB4YjQsIDB4MTcsIDB4ZWUsIDB4ZDAsIDB4OWUsIDB4ZTQsIDB4MzIsIDB4MWEsIDB4YTcsCi0gICAgICAgIDB4MzEsIDB4YWQsIDB4MTgsIDB4MTQsIDB4MjYsIDB4ZWYsIDB4NTQsIDB4YTUsIDB4YTgsIDB4NjUsIDB4YTMsCi0gICAgICAgIDB4OWMsIDB4ODEsIDB4ZmEsIDB4NTYsIDB4OGMsIDB4MmQsIDB4Y2UsIDB4NjgsIDB4NDAsIDB4Y2IsIDB4ZjEsCi0gICAgICAgIDB4MzcsIDB4YmQsIDB4NWUsIDB4ODUsIDB4ZWEsIDB4ZDEsIDB4MGMsIDB4YmIsIDB4MTksIDB4NTYsIDB4MjMsCi0gICAgICAgIDB4MjAsIDB4MWYsIDB4YWQsIDB4NWMsIDB4NDIsIDB4MDgsIDB4MDMsIDB4YjUsIDB4NTUsIDB4OTEsIDB4MDQsCi0gICAgICAgIDB4YzksIDB4ODAsIDB4MzgsIDB4MDAsIDB4MGEsIDB4NzEsIDB4MzQsIDB4NmMsIDB4MzIsIDB4MjcsIDB4ZTksCi0gICAgICAgIDB4NTUsIDB4MjUsIDB4MTUsIDB4MmMsIDB4NjgsIDB4YTMsIDB4MzAsIDB4ZWIsIDB4NTQsIDB4YTUsIDB4MTUsCi0gICAgICAgIDB4MGMsIDB4ZDEsIDB4MDAsIDB4ZmYsIDB4ZDl9OwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgYnl0ZVtdIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzUGhvdG9JbnRBcnJheUZvckNvbXBsaWNhdGVkQ2FzZS5sZW5ndGg7Ci0gICAgICAgIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSA9IG5ldyBieXRlW2xlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZVtpXSA9IChieXRlKXNQaG90b0ludEFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlW2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UxX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9zaW1wbGVfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aG91dFZlcnNpb24oKSAgLy8gbm8gIlZFUlNJT046Mi4xIiBsaW5lLgotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kbztSb2lkOyIsIEFycmF5cy5hc0xpc3QoIkFuZG8iLCAiUm9pZCIsICIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UxX1R5cGVfR2VuZXJpYygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMsIFIucmF3LnYyMV9zaW1wbGVfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiUm9pZCBBbmRvIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UxX1R5cGVfSmFwYW5lc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbmFtZS1yZWxhdGVkIHN0cmluZ3Mgb25seSBjb250YWlucyBwcmludGFibGUgQXNjaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIgaXMgcmVtYWluZWQgdG8gYmUgVVMnczoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJQcmVmaXggR2l2ZW4gTWlkZGxlIEZhbWlseSBTdWZmaXgiCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlJvaWQgQW5kbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBSLnJhdy52MjFfc2ltcGxlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBbmRvIFJvaWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9zaW1wbGVfMyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJGTiIgZmllbGQgc2hvdWxkIGJlIHByZWZlcmVkIHNpbmNlIGl0IHNob3VsZCBjb250YWluIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgaW50ZW5kZWQgYnkgdGhlIGF1dGhvciBvZiB0aGUgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQW5kbyBSb2lkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgJzsnIGlzIHByb3Blcmx5IGhhbmRsZWQgYnkgVkNhcmRQYXJzZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2VfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2JhY2tzbGFzaCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIjtBO0JcXDtDXFw7O0Q7OkU7XFxcXDsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIkE7QlxcIiwgIkNcXDsiLCAiRCIsICI6RSIsICJcXFxcIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkE7QlxcQ1xcO0Q6RVxcXFwiKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgQ29udGFjdFN0cnVjdCBjb3JyZWN0bHkgaWdub3JlcyByZWR1bmRhbnQgZmllbGRzIGluICJOIiBwcm9wZXJ0eSB2YWx1ZXMgYW5kCi0gICAgICogaW5zZXJ0cyBuYW1lIHJlbGF0ZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQmFja3NsYXNoQ2FzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2JhY2tzbGFzaCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGQU1JTFlfTkFNRSBpcyBlbXB0eSBhbmQgcmVtb3ZlZCBpbiB0aGlzIHRlc3QuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkE7QlxcIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJDXFw7IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIjpFIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQTtCXFxDXFw7RDpFXFxcXCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdCZWZvclRpdGxlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfb3JnX2JlZm9yZV90aXRsZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJOb3JtYWwgR3V5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiT3JnYW5pemF0aW9uIERldmlzaW9uIFJvb20gU2hlZXQgTm8uIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIkV4Y2VsbGVudCBKYW5pdG9yIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGl0bGVCZWZvck9yZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3RpdGxlX2JlZm9yZV9vcmcpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiTmljZSBHdXkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIk1hcnZlcm91cyIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIlBlcmZlY3QgR3JlYXQgR29vZCBCYWQgUG9vciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJDb29sIFRpdGxlIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IHZDYXJkIGltcG9ydGVyIGNvcnJlY3RseSBpbnRlcnByZXQgIlBSRUYiIGF0dHJpYnV0ZSB0byBJU19QUklNQVJZLgotICAgICAqIFRoZSBkYXRhIGNvbnRhaW4gdGhyZWUgY2FzZXM6IG9uZSAiUFJFRiIsIG5vICJQUkVGIiBhbmQgbXVsdGlwbGUgIlBSRUYiLCBpbiBlYWNoIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVByZWZUb0lzUHJpbWFyeSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3ByZWZfaGFuZGxpbmcpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJTbWl0aCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9JU0ROKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0ZXN0QGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInRlc3QyQGV4YW1pbmF0aW9uLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJFbmdpbmVlciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJNeXN0ZXJ5IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIkJsb2dnZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiUG9ldHJ5IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlBvZXQiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGFsbCB0aGUgcHJvcGVydGllcyBpbiBhIGNvbXBsaWNhdGVkIHZDYXJkIGFyZSBjb3JyZWN0bHkgcGFyc2VkIGJ5IHRoZSBWQ2FyZFBhcnNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQ29tcGxpY2F0ZWRDYXNlX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9jb21wbGljYXRlZCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIkd1bXA7Rm9ycmVzdDtIb2dlO1BvcztUYW8iLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiR3VtcCIsICJGb3JyZXN0IiwgIkhvZ2UiLCAiUG9zIiwgIlRhbyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkpvZSBEdWUiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiR3VtcCBTaHJpbXAgQ28uO1NhbGVzIERlcHQuO01hbmFnZXI7RmlzaCBrZWVwZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiR3VtcCBTaHJpbXAgQ28uIiwgIlNhbGVzIERlcHQuO01hbmFnZXIiLCAiRmlzaCBrZWVwZXIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJST0xFIiwgIkZpc2ggQ2FrZSBLZWVwZXIhIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJTaHJpbXAgTWFuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIigxMTEpIDU1NS0xMjEyIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiKDQwNCkgNTU1LTEyMTIiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzExMTExMTExIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMyMjIyMjIyMiIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzMzMzMzMzMzIiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI7OzEwMCBXYXRlcnMgRWRnZTtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIjEwMCBXYXRlcnMgRWRnZSIsICJCYXl0b3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBIiwgIjMwMzE0IiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBuZXcgVHlwZVNldCgiV09SSyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkxBQkVMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIxMDAgV2F0ZXJzIEVkZ2VcclxuQmF5dG93biwgTEEgMzAzMTRcclxuVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQLCBuZXcgVHlwZVNldCgiV09SSyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiOzs0MiBQbGFudGF0aW9uIFN0LjtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIjQyIFBsYW50YXRpb24gU3QuIiwgIkJheXRvd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEEiLCAiMzAzMTQiLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiksIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTEFCRUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQyIFBsYW50YXRpb24gU3QuXHJcbkJheXRvd24sIExBIDMwMzE0XHJcblVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRU1BSUwiLCAiZm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlBSRUYiLCAiSU5URVJORVQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJFTUFJTCIsICJjZWxsQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vdydzIHRoZSB0aW1lIGZvciBhbGwgZm9sayB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJQSE9UTyIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UsIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIkpQRUciKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUFUVFJJQlVURSIsICJTb21lIFN0cmluZyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQkRBWSIsICIxOTgwMDEwMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiR0VPIiwgIjM1LjY1NjM4NTQsMTM5LjY5OTQyMzMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlVSTCIsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgwNDI0VDE5NTI0M1oiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgQ29udGFjdFN0cnVjdCBjb3JyZWN0bHkgaW5zZXJ0cyB2YWx1ZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZAotICAgICAqIGludG8gQ29udGVudFJlc29sdmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFDb21wbGljYXRlZENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9jb21wbGljYXRlZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkd1bXAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkZvcnJlc3QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJIb2dlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlBvcyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJUYW8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiSm9lIER1ZSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJHdW1wIFNocmltcCBDby4iKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIEZpc2gga2VlcGVyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlNocmltcCBNYW4iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAvLyBQaG9uZSBudW1iZXIgaXMgZXhwZWN0ZWQgdG8gYmUgZm9ybWF0ZWQgd2l0aCBOQU1QIGZvcm1hdCBpbiBkZWZhdWx0LgotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTU1NS0xMjEyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0MDQtNTU1LTEyMTIiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxLTExMS0xMTExIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMyLTIyMi0yMjIyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVk9JQ0UiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMzLTMzMy0zMzMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjMwMzE0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiTEEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQmF5dG93biIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIjEwMCBXYXRlcnMgRWRnZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjEwMCBXYXRlcnMgRWRnZSBCYXl0b3duIExBIDMwMzE0IFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIzMDMxNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIkxBIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIkJheXRvd24iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICI0MiBQbGFudGF0aW9uIFN0LiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQyIFBsYW50YXRpb24gU3QuIEJheXRvd24gTEEgMzAzMTQgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gIlRZUEU9SU5URVJORVQiIC0+IFRZUEVfQ1VTVE9NICsgdGhlIGxhYmVsICJJTlRFUk5FVCIKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuTEFCRUwsICJJTlRFUk5FVCIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAiZm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJjZWxsQGV4YW1wbGUuY29tIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm93J3MgdGhlIHRpbWUgZm9yIGFsbCBmb2xrIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC8vIE5vIGluZm9ybWF0aW9uIGFib3V0IGl0cyBpbWFnZSBmb3JtYXQgY2FuIGJlIGluc2VydGVkLgotICAgICAgICAgICAgICAgIC5wdXQoUGhvdG8uUEhPVE8sIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMTk4MDAxMDEiKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfSE9NRVBBR0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTXVsdGlwbGVMaW5lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfaW52YWxpZF9tdWx0aXBsZV9saW5lKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJPbWVnYSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJPbWVnYSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5MQUJFTCwgIklOVEVSTkVUIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkFERFJFU1MsICJcIk9tZWdhXCIgPG9tZWdhQGV4YW1wbGUuY29tPiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBTaW1wbGVfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3NpbXBsZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBbmQgUm9pZCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJBbmQ7Um9pZDs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBbmQiLCAiUm9pZCIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJPcGVuO0hhbmRzZXQ7IEFsbGlhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIk9wZW4iLCAiSGFuZHNldCIsICIgQWxsaWFuY2UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1JULVNUUklORyIsICJhbmRyb2lkIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMwMDAwMDAwMCIsIG5ldyBUeXBlU2V0KCJQUkVGIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOTyIsICIwIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOIiwgImdyb3VwMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgxMDMxVDA2NTg1NFoiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjMwU2ltcGxlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfc2ltcGxlKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkFuZCBSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJhbmRyb2lkIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJPcGVuIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiSGFuZHNldCAgQWxsaWFuY2UiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMC0wMDAtMDAwMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1BhcnNpbmcoKSB7Ci0gICAgICAgIC8vIFRob3VnaCBKYXBhbmVzZSBjYXJlZXJzIGFwcGVuZCAiOzs7OyIgYXQgdGhlIGVuZCBvZiB0aGUgdmFsdWUgb2YgIlNPVU5EIiwKLSAgICAgICAgLy8gdkNhcmQgMi4xLzMuMCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgLy8gRG8gbm90IG5lZWQgdG8gaGFuZGxlIGl0IGFzIG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBSLnJhdy52MjFfamFwYW5lc2VfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5IiwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUU7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzAwMDAwMDAwIiwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJWT0lDRSIsICJQUkVGIiksIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKGludCByZXNJZCwgaW50IHZjYXJkVHlwZSwgYm9vbGVhbiBqYXBhbmVzZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QodmNhcmRUeXBlLCByZXNJZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzkiKQotICAgICAgICAgICAgICAgIC8vIFdoaWxlIHZDYXJkIHBhcnNlciBkb2VzIG5vdCBzcGxpdCAiU09VTkQiIHByb3BlcnR5IHZhbHVlcywKLSAgICAgICAgICAgICAgICAvLyBDb250YWN0U3RydWN0IGNhcmUgaXQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC8vIFBob25lIG51bWJlciBmb3JtYXR0aW5nIGlzIGRpZmZlcmVudC4KLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgKGphcGFuZXNlID8gIjAzLTAwMDAtMDAwMCIgOiAiMDMwLTAwMC0wMDAwIikpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVk9JQ0UiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdkNhcmQgd2l0aCBKYXBhbmVzZSBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseSB3aXRoCi0gICAgICoge0BsaW5rIGNvbS5hbmRyb2lkLnZjYXJkLlZDYXJkQ29uZmlnI1ZDQVJEX1RZUEVfVjIxX0dFTkVSSUN9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfVHlwZV9HZW5lcmljX1V0ZjgoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB2Q2FyZCB3aXRoIEphcGFuZXNlIGNhbiBiZSBwYXJzZWQgY29ycmVjdGx5IHdpdGgKLSAgICAgKiB7QGxpbmsgY29tLmFuZHJvaWQudmNhcmQuVkNhcmRDb25maWcjVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0V9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfVHlwZV9KYXBhbmVzZV9TamlzKCkgewotICAgICAgICB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9qYXBhbmVzZV8xLCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdkNhcmQgd2l0aCBKYXBhbmVzZSBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseSB3aXRoCi0gICAgICoge0BsaW5rIGNvbS5hbmRyb2lkLnZjYXJkLlZDYXJkQ29uZmlnI1ZDQVJEX1RZUEVfVjIxX0pBUEFORVNFfS4KLSAgICAgKiBzaW5jZSB2Q2FyZCAyLjEgc3BlY2lmaWVzIHRoZSBjaGFyc2V0IG9mIGVhY2ggbGluZSBpZiBpdCBjb250YWlucyBub24tQXNjaWkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9UeXBlX0phcGFuZXNlX1V0ZjgoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UyX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTQ7XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxOzs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNCIsICJcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzlcdTAwMjBcdTAwMzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzM7XHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMxOzs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiO1x1Njc3MVx1NEVBQ1x1OTBGRFx1NkUwQlx1OEMzN1x1NTMzQVx1Njg1QyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxOFx1NzUzQVx1MDAzMlx1MDAzNlx1MDAyRFx1MDAzMVx1MzBCQiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBFQlx1MzBFQVx1MzBBMlx1MzBGM1x1MzBCRlx1MzBFRlx1MzBGQ1x1MDAzNiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTY4RTs7OzsxNTAtODUxMjsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1NEVBQ1x1OTBGRFx1NkUwQlx1OEMzN1x1NTMzQVx1Njg1QyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDAzNlx1OTY4RSIsICIiLCAiIiwgIiIsICIxNTAtODUxMiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLCBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAiXHUzMEUxXHUzMEUyIiwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UyX1R5cGVfR2VuZXJpY19VdGY4KCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfamFwYW5lc2VfMik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzlcdTAwMjBcdTAwMzEiKQotICAgICAgICAgICAgICAgIC8vIENvbnRhY3RTdHJ1Y3Qgc2hvdWxkIGNvcnJlY3RseSBzcGxpdCAiU09VTkQiIHByb3BlcnR5IGludG8gc2V2ZXJhbCBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCBWQ2FyZFBhcnNlciBzaWRlIGRvZXMgbm90IGNhcmUgaXQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMxIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIxNTAtODUxMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUgMTUwLTg1MTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIlx1MzBFMVx1MzBFMiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFNdWx0aXBsZUVudHJ5Q2FzZV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBSLnJhdy52MjFfbXVsdGlwbGVfZW50cnkpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMyIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiOSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1TRUNSRVQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiWC1ORUMtSE9URUwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTEiLCBuZXcgVHlwZVNldCgiWC1ORUMtU0NIT09MIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEyIiwgbmV3IFR5cGVTZXQoIkZBWCIsICJIT01FIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQ7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTMiLCBuZXcgVHlwZVNldCgiTU9ERU0iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTQiLCBuZXcgVHlwZVNldCgiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTUiLCBuZXcgVHlwZVNldCgiWC1ORUMtRkFNSUxZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE2IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUdJUkwiKSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM1IiwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzU7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxNyIsIG5ldyBUeXBlU2V0KCJYLU5FQy1CT1kiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTgiLCBuZXcgVHlwZVNldCgiWC1ORUMtRlJJRU5EIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE5IiwgbmV3IFR5cGVTZXQoIlgtTkVDLVBIUyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIyMCIsIG5ldyBUeXBlU2V0KCJYLU5FQy1SRVNUQVVSQU5UIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFNdWx0aXBsZUVudHJ5Q2FzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBSLnJhdy52MjFfbXVsdGlwbGVfZW50cnkpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNFQ1JFVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUhPVEVMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEwIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNDSE9PTCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyIik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzQiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNT0RFTSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9QQUdFUikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE0Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZBTUlMWSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1HSVJMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2Iik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtQk9ZIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE3Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZSSUVORCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxOCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1QSFMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtUkVTVEFVUkFOVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yVmFsdWUgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yVmFsdWUucHV0KCJWQUxVRSIsICJEQVRFIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRXhhbXBsZSIsICIiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJFeGFtcGxlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBTk5JVkVSU0FSWSIsICIyMDA5MTAxMCIsIGNvbnRlbnRWYWx1ZXNGb3JWYWx1ZSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBR0VOVCIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtTk8iLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZUFnZW50VjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfd2lubW9fNjUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyKCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkV4YW1wbGUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRXhhbXBsZSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9BTk5JVkVSU0FSWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDA5MTAxMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2xlcmF0ZUludmFsaWRDb21tZW50TGlrZUxpbmVWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9pbnZhbGlkX2NvbW1lbnRfbGluZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQ29uZmVyZW5jZSBDYWxsIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkNvbmZlcmVuY2UgQ2FsbCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJUaGlzIGlzIGFuIChzaGFycCAtPiM8LSBzaGFycCkgZXhhbXBsZS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhpcyBtZXNzYWdlIG11c3QgTk9UIGJlIGlnbm9yZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhZ2VyVjMwX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfcGFnZXIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkYiLCAiRyIsICJNIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIldPUksiLCAiTVNHIiwgIlBBR0VSIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3BhZ2VyKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIk0iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRyBNIEYiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfUEFHRVIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2MTAxMjMxMjM0QHBhZ2Vyc2FtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUJ5dGVQcm9wVjMwX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfbXVsdGlieXRlX3BhcmFtKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCBBcnJheXMuYXNMaXN0KCJGIiwgIkciLCAiTSIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiXHU4RDM5IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUJ5dGVQcm9wVjMwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfbXVsdGlieXRlX3BhcmFtKTsKLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIk0iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRyBNIEYiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJcdThEMzkiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21tYVNlcGFyYXRlZFBhcmFtc1YzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX2NvbW1hX3NlcGFyYXRlZCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRiIsICJHIiwgIk0iLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlBSRUYiLCAiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJDT01NQSxTRVBBUkFURUQ6SU5TSURFLkRRVU9URSIsICJQUkVGIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb3J0QXNWNDBfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWNDAsIFIucmF3LnY0MF9zb3J0X2FzKTsKLQotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXNGb3JTb3J0QXNOID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlc0ZvclNvcnRBc04ucHV0KCJTT1JULUFTIiwKLSAgICAgICAgICAgICAgICAiXHUzMDQyXHUzMDkzXHUzMDY5XHUzMDQ2O1x1MzA4RFx1MzA0NFx1MzA2OSIpOwotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXNGb3JTb3J0QXNPcmcgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yU29ydEFzT3JnLnB1dCgiU09SVC1BUyIsCi0gICAgICAgICAgICAgICAgIlx1MzA1MFx1MzBGQ1x1MzA1MFx1MzA4QjtcdTMwNTFcdTMwOTNcdTMwNTVcdTMwNEZcdTMwNzZcdTMwODJcdTMwOTMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNCIsICJcdTMwRURcdTMwQTRcdTMwQzkiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JTb3J0QXNOKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTMwQjBcdTMwRkNcdTMwQjBcdTMwRUIiLCAiXHU2OTFDXHU3RDIyXHU5MEU4XHU5NTgwIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzRm9yU29ydEFzT3JnLCBuZXcgVHlwZVNldCgiV09SSyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydEFzVjQwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjQwLCBSLnJhdy52NDBfc29ydF9hcyk7Ci0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MDAyMFx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA0Mlx1MzA5M1x1MzA2OVx1MzA0NiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA4RFx1MzA0NFx1MzA2OSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJcdTMwQjBcdTMwRkNcdTMwQjBcdTMwRUIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJcdTY5MUNcdTdEMjJcdTkwRThcdTk1ODAiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlBIT05FVElDX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDUwXHUzMEZDXHUzMDUwXHUzMDhCXHUzMDUxXHUzMDkzXHUzMDU1XHUzMDRGXHUzMDc2XHUzMDgyXHUzMDkzIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElNVjIxX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfaW0pOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9uaWNrbmFtZSIsICJOaWNrIiwgIjEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIikpICAvLyAxMwotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtR09PR0xFLVRBTEsiLCAiaGhoQGdtYWlsLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJTVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2ltKTsKLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNrIikKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLlRZUEUsICIxIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfR09PR0xFX1RBTEspCi0gICAgICAgICAgICAgICAgLnB1dChJbS5UWVBFLCBJbS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiaGhoQGdtYWlsLmNvbSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEphcGFuaXphdGlvblRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTk5NDE5Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEphcGFuaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Db250YWN0RW50cnk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Db250ZW50VmFsdWVzQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW07Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLlR5cGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5WQ2FyZFRlc3RzQmFzZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGNsYXNzIFZDYXJkSmFwYW5pemF0aW9uVGVzdHMgZXh0ZW5kcyBWQ2FyZFRlc3RzQmFzZSB7Ci0gICAgcHJpdmF0ZSB2b2lkIHRlc3ROYW1lVXRmOENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTMwNzVcdTMwOEJcdTMwNjkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzA5MVx1MzA4QVx1MzA0QiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRHIuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIlBoLkQiKTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0KLSAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjggOiBudWxsKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCAiXHUzMDc1XHUzMDhCXHUzMDY5O1x1MzA5MVx1MzA4QVx1MzA0QjtCO0RyLjtQaC5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNzVcdTMwOEJcdTMwNjkiLCAiXHUzMDkxXHUzMDhBXHUzMDRCIiwgIkIiLCAiRHIuIiwgIlBoLkQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVVdGY4VjIxKCkgewotICAgICAgICB0ZXN0TmFtZVV0ZjhDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYzMCgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVNoaWZ0SmlzKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UsICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJcdTMwNzVcdTMwOEJcdTMwNjk7XHUzMDkxXHUzMDhBXHUzMDRCO0I7RHIuO1BoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA3NVx1MzA4Qlx1MzA2OSIsICJcdTMwOTFcdTMwOEFcdTMwNEIiLCAiQiIsICJEci4iLCAiUGguRCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvQ29NbyBwaG9uZXMgcmVxdWlyZSBhbGwgbmFtZSBlbGVtZW50cyBzaG91bGQgYmUgaW4gImZhbWlseSBuYW1lIiBmaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZURvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1MzA3NVx1MzA4Qlx1MzA2OSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMDkxXHUzMDhBXHUzMDRCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEci4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiUGguRCIpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBmdWxsTmFtZSA9ICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsIGZ1bGxOYW1lICsgIjs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChmdWxsTmFtZSwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgZnVsbE5hbWUsIG1Db250ZW50VmFsdWVzRm9yU0ppcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsICI7Ozs7IiwgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZXRpY05hbWVDb21tb24oaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSwgY2hhcnNldCk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA4NFx1MzA3RVx1MzA2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIlx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHUzMDVGXHUzMDhEXHUzMDQ2Iik7Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0KLSAgICAgICAgICAgICgiU0hJRlRfSklTIi5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpID8KLSAgICAgICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMpIDoKLSAgICAgICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCA6IG51bGwpKTsKLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJcdTMwODRcdTMwN0VcdTMwNjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiXHUzMDVGXHUzMDhEXHUzMDQ2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICBpZiAoIVZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICJcdTMwODRcdTMwN0VcdTMwNjAgXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIFx1MzA1Rlx1MzA4RFx1MzA0NiIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICB9Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNCdWlsZGVyIGJ1aWxkZXIgPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgYnVpbGRlci5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDg0XHUzMDdFXHUzMDYwIFx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMjFVdGY4KCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMjFTamlzKCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCAiU2hpZnRfSklTIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjMwVXRmOCgpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjMwU0ppcygpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSwgIlNoaWZ0X0pJUyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JNb2JpbGVWMjFfMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSwgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGODBcdUZGOUJcdUZGNzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpOwotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjgwXHVGRjlCXHVGRjczIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjkwXHVGRjg0XHVGRjlFXHVGRjk5XHVGRjg4XHVGRjcwXHVGRjkxICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY4MFx1RkY5Qlx1RkY3MyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JNb2JpbGVWMjFfMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSwgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpOwotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdUZGODBcdUZGOUJcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY4MFx1RkY5Qlx1RkY3MyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1dpdGhKYXBhbmVzZUNvbW1vbihpbnQgdmNhcmRUeXBlLCBTdHJpbmcgY2hhcnNldCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlLCBjaGFyc2V0KTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIlx1OUU3Rlx1OUFBOFx1NUUwMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlx1MDBEN1x1MDBEN1x1NzcwQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiNDk0LTEzMTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiXHU2NUU1XHU2NzJDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDUzXHUzMDkzXHUzMDZBXHUzMDY4XHUzMDUzXHUzMDhEXHUzMDkyXHU4OThCIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXHUzMDhCXHUzMDZBXHUzMDkzXHUzMDY2XHU2Njg3XHU0RUJBXHUzMDY3XHUzMDU5XHUzMDRCXHVGRjFGIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJcdTMwNEFcdTMwODJcdTMwNjFcdTMwNEJcdTMwNDhcdTMwOEEiKTsKLQotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSAoIlVURi04Ii5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpID8KLSAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEodmNhcmRUeXBlKSA/IG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzIDoKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKSA6Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCA6Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yVXRmOCkpOwotCi0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICAvLyBMQUJFTCBtdXN0IGJlIGlnbm9yZWQgaW4gdkNhcmQgMi4xLiBBcyBmb3IgdkNhcmQgMy4wLCB0aGUgY3VycmVudCBiZWhhdmlvciBpcwotICAgICAgICAvLyBzYW1lIGFzIHRoYXQgaW4gdkNhcmQgMy4wLCB3aGljaCBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLgotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgQXJyYXlzLmFzTGlzdCgiXHU3OUMxXHU2NkY4XHU3QkIxMDciLAotICAgICAgICAgICAgICAgICIiLCAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxIiwgIlx1OUU3Rlx1OUFBOFx1NUUwMiIsICJcdTAwRDdcdTAwRDdcdTc3MEMiLAotICAgICAgICAgICAgICAgICI0OTQtMTMxMyIsICJcdTY1RTVcdTY3MkMiKSwKLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIlx1OUU3Rlx1OUFBOFx1NUUwMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlx1MDBEN1x1MDBEN1x1NzcwQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiNDk0LTEzMTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiXHU2NUU1XHU2NzJDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NUU1XHU2NzJDIDQ5NC0xMzEzIFx1MDBEN1x1MDBEN1x1NzcwQyBcdTlFN0ZcdTlBQThcdTVFMDIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxICIgKyAiXHU3OUMxXHU2NkY4XHU3QkIxMDciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzd2l0aEphcGFuZXNlVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc1dpdGhKYXBhbmVzZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgIlNoaWZ0X0pJUyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHRoYXQgb25seSBvbmUgYWRkcmVzcyBmaWVsZCBpcyBlbWl0dGVkIHRvd2FyZCBEb0NvTW8gcGhvbmVzLgotICAgICAqIFByZWZlcmVkIHR5cGUgbXVzdCAoc2hvdWxkPykgYmU6IEhPTUUgPiBXT1JLID4gT1RIRVIgPiBDVVNUT00KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRycmVzc0ZvckRvQ29Nb18xKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8sICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjQiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjMiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20xIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgImN1c3RvbTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgQXJyYXlzLmFzTGlzdCgiMiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGUgdkNhcmQgZXhwb3J0ZXIgdG9sZXJhdGVzIG51bGwgVFlQRS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRycmVzc0ZvckRvQ29Nb180KCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8sICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI0Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI1Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxMjM0MTIzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDkwMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwMy0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwOTAtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJWMjFfMSgpIHsKLSAgICAgICAgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjMwKCkgewotICAgICAgICB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxMjM0MTIzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDkwMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjAzLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjA5MC0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZURvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUzIik7Ci0KLSAgICAgICAgLy8gTW9yZSB0aGFuIG9uZSBub3RlIGZpZWxkcyBtdXN0IGJlIGFnZ3JlZ2F0ZWQgaW50byBvbmUgbm90ZS4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk5PVEUiLCAibm90ZTFcbm5vdGUyXG5ub3RlMyIsIG1Db250ZW50VmFsdWVzRm9yUVApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRyb2lkQ3VzdG9tVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJcdTMwNERcdTMwODNcdTMwRkNcdTMwQThcdTMwQzNcdTMwQzFcdTMwRkMiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNERcdTMwODNcdTMwRkNcdTMwQThcdTMwQzNcdTMwQzFcdTMwRkMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFRlc3RSdW5uZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFRlc3RSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNDM5My4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVc2FnZTogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgY29tLmFuZHJvaWQudmNhcmQudGVzdHMvLlZDYXJkVGVzdFJ1bm5lclRlc3RSdW5uZXIKLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShWQ2FyZFV0aWxzVGVzdHMuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVkNhcmRUZXN0VXRpbHNUZXN0cy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShWQ2FyZEltcG9ydGVyVGVzdHMuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVkNhcmRFeHBvcnRlclRlc3RzLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFZDYXJkSmFwYW5pemF0aW9uVGVzdHMuY2xhc3MpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkVGVzdFJ1bm5lci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0VXRpbHNUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdFV0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmNWNmNy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0VXRpbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5jb3JldGVzdHMuUjsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuVkNhcmRWZXJpZmllcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBUZXN0cyBjb25maXJtaW5nIHV0aWxpdGllcyBmb3IgdkNhcmQgdGVzdHMgd29yayBmaW5lLgotICoKLSAqIE5vdyB0aGF0IHRoZSBmb3VuZGF0aW9uIGNsYXNzZXMgZm9yIHZDYXJkIHRlc3QgY2FzZXMgYmVjYW1lIHRvbyBjb21wbGljYXRlZCB0bwotICogcmVseSBvbiB3aXRob3V0IHRlc3RpbmcgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRUZXN0VXRpbHNUZXN0cyBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZhaWxBdFByb3BlcnR5Tm9kZVZlcmlmaWNhdGlvbigpIHsKLSAgICAgICAgYm9vbGVhbiBmYWlsdXJlRGV0ZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVkNhcmRWZXJpZmllcih0aGlzKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICAgICAgdmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiO0E7QlxcO0NcXDs7RDs6RTtcXFxcOy0tIiwgIC8vIHdyb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIkE7QlxcIiwgIkNcXDsiLCAiRCIsICI6RSIsICJcXFxcIiwgIiIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBO0JcXENcXDtEOkVcXFxcIik7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotICAgICAgICAgICAgZmFpbHVyZURldGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZhaWx1cmVEZXRlY3RlZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVGVzdCBjYXNlIHRoYXQgc2hvdWxkIGZhaWwgYWN0dWFsbHkgc3VjY2VlZGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZhaWxBdENvbnRlbnRWYWx1ZVZlcmlmaWNhdGlvbigpIHsKLSAgICAgICAgYm9vbGVhbiBmYWlsdXJlRGV0ZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVkNhcmRWZXJpZmllcih0aGlzKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICAgICAgdmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBO0JcXCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkNcXDsiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICI6RSIpOwotICAgICAgICAgICAgLy8gRElTUExBWV9OQU1FIGlzIG1pc3NpbmcuCi0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotICAgICAgICAgICAgZmFpbHVyZURldGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZhaWx1cmVEZXRlY3RlZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVGVzdCBjYXNlIHRoYXQgc2hvdWxkIGZhaWwgYWN0dWFsbHkgc3VjY2VlZGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZhaWxBdExpbmVWZXJpZmljYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gZmFpbHVyZURldGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZDYXJkVmVyaWZpZXIodGhpcyk7Ci0gICAgICAgICAgICB2ZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9HRU5FUklDKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXFwiKQotICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICI7IikKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIiwiKQotICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlxuIikKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJbPHtVbmVzY2FwZWQ6QXNjaWlzfT5dIik7Ci0gICAgICAgICAgICB2ZXJpZmllci5hZGRMaW5lVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJURUw6MSIpICAvLyB3cm9uZwotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIkZOOls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0gICAgICAgICAgICBmYWlsdXJlRGV0ZWN0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZmFpbHVyZURldGVjdGVkKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJUZXN0IGNhc2UgdGhhdCBzaG91bGQgZmFpbCBhY3R1YWxseSBzdWNjZWVkZWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxZmFiMi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVkNhcmRVdGlsc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc09ubHlQcmludGFibGVBc2NpaSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKFN0cmluZ1tdKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChMaXN0PFN0cmluZz4pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDB4MjA7IGkgPCAweDdGOyBpKyspIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKWkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShidWlsZGVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcclxuIikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcdTAwMTkiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIlx1MDA3RiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCkgewotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChTdHJpbmdbXSludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoKExpc3Q8U3RyaW5nPiludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMHgyMDsgaSA8IDB4N0Y7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKGNoYXIpaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShidWlsZGVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlx1MDAxOSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlx1MDA3RiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlxyIikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiXG4iKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKSB7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoU3RyaW5nW10pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoTGlzdDxTdHJpbmc+KW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCIwMTIzNDU2Nzg5LSIpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAweDMwOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID09IDB4MkQpIHsgIC8vIC0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDNBOyBpIDwgMHg0MTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMHg1QjsgaSA8IDB4NjE7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDB4N0I7IGkgPCAweDEwMDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1WYWx1ZSgpIHsKLSAgICAgICAgLy8gU21va2UgdGVzdHMuCi0gICAgICAgIGFzc2VydEVxdWFscygiSE9NRSIsIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIkhPTUUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVEVMIiwgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiVEVMIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlBBR0VSIiwgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiUEFHRVIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShUZXh0VXRpbHMuaXNFbXB0eShWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCIiKSkpOwotICAgICAgICBhc3NlcnRUcnVlKFRleHRVdGlscy5pc0VtcHR5KFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUobnVsbCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShUZXh0VXRpbHMuaXNFbXB0eShWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCIgXHQiKSkpOwotCi0gICAgICAgIC8vIG5vbi1Bc2NpaSBtdXN0IGJlIGFsbG93ZWQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdTRFOEJcdTUyRDlcdTYyNDAiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlx1NEU4Qlx1NTJEOVx1NjI0MCIpKTsKLSAgICAgICAgLy8gUmVwb3J0ZWQgYXMgYnVnIHJlcG9ydC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdThEMzkiLCBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJcdThEMzkiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiXCJjb21tYSxzZXBhcmF0ZWRcIiIsCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiY29tbWEsc2VwYXJhdGVkIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiY29sb246YXdhcmVcIiIsCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiY29sb246YXdhcmUiKSk7Ci0gICAgICAgIC8vIENUTCBjaGFyYWN0ZXJzLgotICAgICAgICBhc3NlcnRFcXVhbHMoIkNUTEV4YW1wbGUiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIkNUTFx1MDAwMUV4YW1wbGUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVGV4dFV0aWxzLmlzRW1wdHkoCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiXHUwMDAxXHUwMDAyXHUwMDAzIikpKTsKLSAgICAgICAgLy8gRFFVT1RFIG11c3QgYmUgcmVtb3ZlZC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJxdW90ZWQiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlwicXVvdGVkXCIiKSk7Ci0gICAgICAgIC8vIERRVU9URSBtdXN0IGJlIHJlbW92ZWQgYmFzaWNhbGx5LCBidXQgd2Ugc2hvdWxkIGRldGVjdCBhIHNwYWNlLCB3aGljaAotICAgICAgICAvLyByZXF1aXJlIHVzIHRvIHVzZSBEUVVPVEUgYWdhaW4uCi0gICAgICAgIC8vIFJpZ2h0LXNpZGUgaGFzIG9uZSBtb3JlIGlsbGVnYWwgZHF1b3RlIHRvIHRlc3QgcXVvdGUtaGFuZGxlIGNvZGUgdGhvcm91Z2hseS4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIkFscmVhZHkgcXVvdGVkXCIiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlwiQWxyZWFkeSBxdW90ZWRcIlwiIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRhY3RFbnRyeS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGFjdEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Mzc1MGUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGFjdEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3MgcmVwcmVzZW50aW5nIG9uZSBjb250YWN0LCB3aGljaCBzaG91bGQgY29udGFpbiBtdWx0aXBsZSBDb250ZW50VmFsdWVzIGxpa2UKLSAqIFN0cnVjdHVyZWROYW1lLCBFbWFpbCwgZXRjLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGFjdEVudHJ5IHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gbUNvbnRlbnRWYWx1ZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzPigpOwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIGFkZENvbnRlbnRWYWx1ZXMoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KERhdGEuTUlNRVRZUEUsIG1pbWVUeXBlKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNMaXN0LmFkZChjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50VmFsdWVzQnVpbGRlcihjb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDb250ZW50VmFsdWVzPiBnZXRMaXN0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRlbnRWYWx1ZXNMaXN0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjY2NmOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLQotLyoqCi0gKiBDb250ZW50VmFsdWVzLWxpa2UgY2xhc3Mgd2hpY2ggZW5hYmxlcyB1c2VycyB0byBjaGFpbiBwdXQoKSBtZXRob2RzIGFuZCByZXN0cmljdHMKLSAqIHRoZSBvdGhlciBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFZhbHVlc0J1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlczsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlcihmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEJ5dGUgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIFNob3J0IHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSovCi0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgTG9uZyB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIERvdWJsZSB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0qLwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0TnVsbChTdHJpbmcga2V5KSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dE51bGwoa2V5KTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2MTNjNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5SGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIENvbnRlbnRWYWx1ZXNWZXJpZmllciBpbXBsZW1lbnRzIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICBwcml2YXRlIExpc3Q8Q29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbT4gbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0ID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtPigpOwotICAgIHByaXZhdGUgaW50IG1JbmRleDsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGFkZEVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbShhbmRyb2lkVGVzdENhc2UpOwotICAgICAgICBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QuYWRkKGVsZW0pOwotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA6IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCkgewotICAgICAgICAgICAgZWxlbS5vblBhcnNpbmdTdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoVkNhcmRFbnRyeSBlbnRyeSkgewotICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LmdldChtSW5kZXgpLm9uRW50cnlDcmVhdGVkKGVudHJ5KTsKLSAgICAgICAgbUluZGV4Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbmQoKSB7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtIDogbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0KSB7Ci0gICAgICAgICAgICBlbGVtLm9uUGFyc2luZ0VuZCgpOwotICAgICAgICAgICAgZWxlbS52ZXJpZnlSZXNvbHZlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2MxOGUxLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29tbWl0dGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlDb25zdHJ1Y3RvcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5SGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFV0aWxzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgSW1wb3J0VGVzdFJlc29sdmVyIG1SZXNvbHZlcjsKLSAgICBwcml2YXRlIGZpbmFsIFZDYXJkRW50cnlIYW5kbGVyIG1IYW5kbGVyOwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtVGVzdENhc2UgPSBhbmRyb2lkVGVzdENhc2U7Ci0gICAgICAgIG1SZXNvbHZlciA9IG5ldyBJbXBvcnRUZXN0UmVzb2x2ZXIoYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgVkNhcmRFbnRyeUNvbW1pdHRlcihtUmVzb2x2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBhZGRFeHBlY3RlZChTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlcy5wdXQoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICBtUmVzb2x2ZXIuYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRWYWx1ZXNCdWlsZGVyKGNvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Y2FyZFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1UZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Y2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlciA9IFZDYXJkVXRpbHMuZ2V0QXBwcm9wcmlhdGVQYXJzZXIodmNhcmRUeXBlKTsKLSAgICAgICAgZmluYWwgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGJ1aWxkZXIgPSBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkRW50cnlIYW5kbGVyKG1IYW5kbGVyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyLnBhcnNlKGlzLCBidWlsZGVyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZlcmlmeVJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5UmVzb2x2ZXIoKSB7Ci0gICAgICAgIG1SZXNvbHZlci52ZXJpZnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblBhcnNpbmdTdGFydCgpIHsKLSAgICAgICAgbUhhbmRsZXIub25TdGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKFZDYXJkRW50cnkgZW50cnkpIHsKLSAgICAgICAgbUhhbmRsZXIub25FbnRyeUNyZWF0ZWQoZW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUGFyc2luZ0VuZCgpIHsKLSAgICAgICAgbUhhbmRsZXIub25FbmQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9FeHBvcnRUZXN0UHJvdmlkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDk1MjU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0N1cnNvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXhwb3J0VGVzdFByb3ZpZGVyIGV4dGVuZHMgTW9ja0NvbnRlbnRQcm92aWRlciB7Ci0gICAgZmluYWwgcHJpdmF0ZSBBcnJheUxpc3Q8Q29udGFjdEVudHJ5PiBtQ29udGFjdEVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGFjdEVudHJ5PigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0VudGl0eUl0ZXJhdG9yIGltcGxlbWVudHMgRW50aXR5SXRlcmF0b3IgewotICAgICAgICBMaXN0PEVudGl0eT4gbUVudGl0eUxpc3Q7Ci0gICAgICAgIEl0ZXJhdG9yPEVudGl0eT4gbUl0ZXJhdG9yOwotCi0gICAgICAgIHB1YmxpYyBNb2NrRW50aXR5SXRlcmF0b3IoTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgbUVudGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PEVudGl0eT4oKTsKLSAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KG5ldyBDb250ZW50VmFsdWVzKCkpOwotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoRGF0YS5DT05URU5UX1VSSSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRW50aXR5TGlzdC5hZGQoZW50aXR5KTsKLSAgICAgICAgICAgIG1JdGVyYXRvciA9IG1FbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1JdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRW50aXR5IG5leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigicmVtb3ZlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICAgICAgbUl0ZXJhdG9yID0gbUVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEV4cG9ydFRlc3RQcm92aWRlcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBidWlsZElucHV0RW50cnkoKSB7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBjb250YWN0RW50cnkgPSBuZXcgQ29udGFjdEVudHJ5KCk7Ci0gICAgICAgIG1Db250YWN0RW50cnlMaXN0LmFkZChjb250YWN0RW50cnkpOwotICAgICAgICByZXR1cm4gY29udGFjdEVudHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFuIG9sZCBtZXRob2Qgd2hpY2ggaGFkIGV4aXN0ZWQgYnV0IHdhcyByZW1vdmVkIGZyb20gQ29udGVudFJlc29sdmVyLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBzdGlsbCBrZWVwIHVzaW5nIHRoaXMgbWV0aG9kIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBwcm9wZWVyIHdheSB0byBrbm93Ci0gICAgICogd2hpY2ggdmFsdWUgaW4gdGhlIENvbnRlbnRWYWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgZW50cnkgaW4gQ29udGFjdHMgZGF0YWJhc2UuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvciBxdWVyeUVudGl0aWVzKFVyaSB1cmksCi0gICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUodXJpICE9IG51bGwpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVC5lcXVhbHModXJpLmdldFNjaGVtZSgpKSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhdXRob3JpdHkgPSB1cmkuZ2V0QXV0aG9yaXR5KCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkuZ2V0QXV0aG9yaXR5KCkuZXF1YWxzKGF1dGhvcml0eSkpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKChEYXRhLkNPTlRBQ1RfSUQgKyAiPT8iKS5lcXVhbHMoc2VsZWN0aW9uKSk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygxLCBzZWxlY3Rpb25BcmdzLmxlbmd0aCk7Ci0gICAgICAgIGZpbmFsIGludCBpZCA9IEludGVnZXIucGFyc2VJbnQoc2VsZWN0aW9uQXJnc1swXSk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoaWQgPj0gMCAmJiBpZCA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2NrRW50aXR5SXRlcmF0b3IobUNvbnRhY3RFbnRyeUxpc3QuZ2V0KGlkKS5nZXRMaXN0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSxTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKFZDYXJkQ29tcG9zZXIuQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSS5lcXVhbHModXJpKSk7Ci0gICAgICAgIC8vIEluIHRoaXMgdGVzdCwgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgbm90IHN1cHBvcnRlZC4KLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb24pOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnROdWxsKHNlbGVjdGlvbkFyZ3MpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnROdWxsKHNvcnRPcmRlcik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2NrQ3Vyc29yKCkgewotICAgICAgICAgICAgaW50IG1DdXJyZW50UG9zaXRpb24gPSAtMTsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbW92ZVRvRmlyc3QoKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbW92ZVRvTmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRQb3NpdGlvbiA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uKys7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCZWZvcmVGaXJzdCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRQb3NpdGlvbiA8IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb24gPj0gbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoU3RyaW5nIGNvbHVtbk5hbWUpIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoQ29udGFjdHMuX0lELCBjb2x1bW5OYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoMCwgY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUobUN1cnJlbnRQb3NpdGlvbiA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFBvc2l0aW9uIDwgbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRQb3NpdGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SW50KGNvbHVtbkluZGV4KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNmQ5MWEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHBvcnRUZXN0UmVzb2x2ZXIgZXh0ZW5kcyBNb2NrQ29udGVudFJlc29sdmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEV4cG9ydFRlc3RQcm92aWRlciBtUHJvdmlkZXI7Ci0gICAgcHVibGljIEV4cG9ydFRlc3RSZXNvbHZlcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1Qcm92aWRlciA9IG5ldyBFeHBvcnRUZXN0UHJvdmlkZXIoYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgYWRkUHJvdmlkZXIoVkNhcmRDb21wb3Nlci5WQ0FSRF9URVNUX0FVVEhPUklUWSwgbVByb3ZpZGVyKTsKLSAgICAgICAgYWRkUHJvdmlkZXIoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkuZ2V0QXV0aG9yaXR5KCksIG1Qcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBhZGRJbnB1dENvbnRhY3RFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5idWlsZElucHV0RW50cnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhwb3J0VGVzdFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVByb3ZpZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0ltcG9ydFRlc3RQcm92aWRlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmODk0OTEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJSZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkdyb3VwTWVtYmVyc2hpcDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotcHVibGljIGNsYXNzIEltcG9ydFRlc3RQcm92aWRlciBleHRlbmRzIE1vY2tDb250ZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNLbm93bk1pbWVUeXBlU2V0ID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBFbWFpbC5DT05URU5UX0lURU1fVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBJbS5DT05URU5UX0lURU1fVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLCBFdmVudC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBHcm91cE1lbWJlcnNoaXAuQ09OVEVOVF9JVEVNX1RZUEUpKTsKLQotICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4+IG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzOwotCi0gICAgcHVibGljIEltcG9ydFRlc3RQcm92aWRlcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPj4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgYWNjZXB0YW5ibGVNaW1lVHlwZSA6IHNLbm93bk1pbWVUeXBlU2V0KSB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgdXNlIEhhc2hTZXQgc2luY2UgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gY2hhbmdlcyB0aGUgY29udGVudCBvZgotICAgICAgICAgICAgLy8gQ29udGVudFZhbHVlcyBhZnRlciB0aGUgaW5zZXJ0aW9uLCB3aGljaCBtYWtlIHRoZSByZXN1bHQgb2YgaGFzaENvZGUoKQotICAgICAgICAgICAgLy8gY2hhbmdlcy4uLgotICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMucHV0KAotICAgICAgICAgICAgICAgICAgICBhY2NlcHRhbmJsZU1pbWVUeXBlLCBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXM+KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGV4cGVjdGVkQ29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgaWYgKCFzS25vd25NaW1lVHlwZVNldC5jb250YWlucyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlVua25vdyBNaW1lVHlwZSAlcyBpbiB0aGUgdGVzdCBjb2RlLiBUZXN0IGNvZGUgc2hvdWxkIGJlIGJyb2tlbi4iLAotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMuZ2V0KG1pbWVUeXBlKTsKLSAgICAgICAgY29udGVudFZhbHVlc0NvbGxlY3Rpb24uYWRkKGV4cGVjdGVkQ29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goCi0gICAgICAgICAgICBBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKSB7Ci0gICAgICAgIGlmIChvcGVyYXRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlRoZXJlIGlzIG5vIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBzaXplID0gb3BlcmF0aW9ucy5zaXplKCk7Ci0gICAgICAgIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGZha2VSZXN1bHRBcnJheSA9IG5ldyBDb250ZW50UHJvdmlkZXJSZXN1bHRbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBVcmkgdXJpID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkksIFN0cmluZy52YWx1ZU9mKGkpKTsKLSAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheVtpXSA9IG5ldyBDb250ZW50UHJvdmlkZXJSZXN1bHQodXJpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gb3BlcmF0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBvcGVyYXRpb24ucmVzb2x2ZVZhbHVlQmFja1JlZmVyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheSwgaSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbiBvcGVyYXRpb24gPSBvcGVyYXRpb25zLmdldChpKTsKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgYWN0dWFsQ29udGVudFZhbHVlcyA9IG9wZXJhdGlvbi5yZXNvbHZlVmFsdWVCYWNrUmVmZXJlbmNlcygKLSAgICAgICAgICAgICAgICAgICAgZmFrZVJlc3VsdEFycmF5LCBpKTsKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBvcGVyYXRpb24uZ2V0VXJpKCk7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyhSYXdDb250YWN0cy5DT05URU5UX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnROdWxsKGFjdHVhbENvbnRlbnRWYWx1ZXMuZ2V0KFJhd0NvbnRhY3RzLkFDQ09VTlRfTkFNRSkpOwotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydE51bGwoYWN0dWFsQ29udGVudFZhbHVlcy5nZXQoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHVyaS5lcXVhbHMoRGF0YS5DT05URU5UX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUgPSBhY3R1YWxDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKERhdGEuTUlNRVRZUEUpOwotICAgICAgICAgICAgICAgIGlmICghc0tub3duTWltZVR5cGVTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBNaW1lVHlwZSAlcy4gUHJvYmFibHkgYWRkZWQgYWZ0ZXIgZGV2ZWxvcGluZyB0aGlzIHRlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBkYXRhIG1lYW5pbmdsZXNzIGluIHRoaXMgdW5pdCB0ZXN0cy4KLSAgICAgICAgICAgICAgICAvLyBTcGVjaWZpY2FsbHksIERhdGEuREFUQTEgLSBEQVRBNyBhcmUgc2V0IHRvIG51bGwgb3IgZW1wdHkgU3RyaW5nCi0gICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQsIGJ1dCBpdCBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiBob3cKLSAgICAgICAgICAgICAgICAvLyByZXNvbHZlci1yZWxhdGVkIGNvZGUgaGFuZGxlcyBpdC4KLSAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBpZ25vcmUgdGhlc2UgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHNwZWNzIGFuZAotICAgICAgICAgICAgICAgIC8vIGp1c3QgY2hlY2sgd2hldGhlciB2Q2FyZCBpbXBvcnRlciBjb3JyZWN0bHkgaW5zZXJ0cyByZWxsZXZlbnQgZGF0YS4KLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBrZXlUb0JlUmVtb3ZlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGFjdHVhbENvbnRlbnRWYWx1ZXMudmFsdWVTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAga2V5VG9CZVJlbW92ZWQuYWRkKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXk6IGtleVRvQmVSZW1vdmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdHVhbENvbnRlbnRWYWx1ZXMucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGZvciB0ZXN0aW5nCi0gICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJNaW1lVHlwZTogJXMsIGRhdGE6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUsIGFjdHVhbENvbnRlbnRWYWx1ZXMudG9TdHJpbmcoKSkpOyAqLwotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBSQVdfQ09OVEFDVF9JRCBlbnRyeSBqdXN0IGZvciBzYWZldHksIHNpbmNlIHdlIGRvIG5vdCBjYXJlCi0gICAgICAgICAgICAgICAgLy8gaG93IHJlc29sdmVyLXJlbGF0ZWQgY29kZSBoYW5kbGVzIHRoZSBlbnRyeSBpbiB0aGlzIHVuaXQgdGVzdCwKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsQ29udGVudFZhbHVlcy5jb250YWluc0tleShEYXRhLlJBV19DT05UQUNUX0lEKSkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzLnJlbW92ZShEYXRhLlJBV19DT05UQUNUX0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLmdldChtaW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJDb250ZW50VmFsdWVzIGZvciBNaW1lVHlwZSAiICsgbWltZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGV4cGVjdGVkIGF0IGFsbCAoIiArIGFjdHVhbENvbnRlbnRWYWx1ZXMgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLypmb3IgdGVzdGluZwotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiQEBAIiwgImV4cGVjdGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsICJhY3R1YWwgIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoYWN0dWFsQ29udGVudFZhbHVlcykpOyovCi0gICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbHNGb3JDb250ZW50VmFsdWVzKGV4cGVjdGVkQ29udGVudFZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5yZW1vdmUoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlVuZXhwZWN0ZWQ6ICIpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhhY3R1YWxDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiRXhwZWN0ZWQgIDogIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBVcmkgaGFzIGNvbWU6ICIgKyB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICByZXR1cm4gZmFrZVJlc3VsdEFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uIDoKLSAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlczogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYWlsTXNnID0KLSAgICAgICAgICAgICAgICAiVGhlcmUgaXMoYXJlKSByZW1haW5pbmcgZXhwZWN0ZWQgQ29udGVudFZhbHVlcyBpbnN0YW5jZShzKTogXG4iCi0gICAgICAgICAgICAgICAgICAgICsgYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgVGVzdENhc2UuZmFpbChmYWlsTXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHByaW50IENvbnRlbnRWYWx1ZXMgd2hvc2UgY29udGVudCBpcyBwcmludGVkIHdpdGggc29ydGVkIGtleXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlVmFsdWUgPSAiIjsKLSAgICAgICAgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBzb3J0ZWRNYXAgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBjb250ZW50VmFsdWVzLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVTdHJpbmcgPSAodmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsKTsKLSAgICAgICAgICAgIGlmIChEYXRhLk1JTUVUWVBFLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgbWltZVR5cGVWYWx1ZSA9IHZhbHVlU3RyaW5nOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGtleSk7Ci0gICAgICAgICAgICAgICAgc29ydGVkTWFwLnB1dChrZXksIHZhbHVlU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoJz0nKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQobWltZVR5cGVWYWx1ZSk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogc29ydGVkTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoa2V5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI9XCIiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsc0ZvckNvbnRlbnRWYWx1ZXMoCi0gICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGV4cGVjdGVkLCBmaW5hbCBDb250ZW50VmFsdWVzIGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZCA9PSBudWxsIHx8IGFjdHVhbCA9PSBudWxsIHx8IGV4cGVjdGVkLnNpemUoKSAhPSBhY3R1YWwuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGV4cGVjdGVkLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWFjdHVhbC5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVHlwZSBtaXNtYXRjaCB1c3VhbGwgaGFwcGVucyBhcyBpbXBvcnRlciBkb2Vzbid0IGNhcmUgdGhlIHR5cGUgb2YgZWFjaCB2YWx1ZS4KLSAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB2YXJpYWJsZSB0eXBlIG1pZ2h0IGJlIEludGVnZXIgd2hlbiBpbXBvcnRpbmcgdGhlIHR5cGUgb2YgVEVMLAotICAgICAgICAgICAgLy8gd2hpbGUgdmFyaWFibGUgdHlwZSB3b3VsZCBiZSBTdHJpbmcgd2hlbiBpbXBvcnRpbmcgdGhlIHR5cGUgb2YgUkVMQVRJT04uCi0gICAgICAgICAgICBmaW5hbCBPYmplY3QgYWN0dWFsVmFsdWUgPSBhY3R1YWwuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoKGJ5dGVbXSl2YWx1ZSwgKGJ5dGVbXSlhY3R1YWxWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGUgPSAoYnl0ZVtdKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICBieXRlW10gYSA9IChieXRlW10pYWN0dWFsVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5lcXVhbHMoYWN0dWFsVmFsdWUpICYmCi0gICAgICAgICAgICAgICAgICAgICF2YWx1ZS50b1N0cmluZygpLmVxdWFscyhhY3R1YWxWYWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9JbXBvcnRUZXN0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyMmFmZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9JbXBvcnRUZXN0UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgSW1wb3J0VGVzdFJlc29sdmVyIGV4dGVuZHMgTW9ja0NvbnRlbnRSZXNvbHZlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbXBvcnRUZXN0UHJvdmlkZXIgbVByb3ZpZGVyOwotCi0gICAgcHVibGljIEltcG9ydFRlc3RSZXNvbHZlcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1Qcm92aWRlciA9IG5ldyBJbXBvcnRUZXN0UHJvdmlkZXIoYW5kcm9pZFRlc3RDYXNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaChTdHJpbmcgYXV0aG9yaXR5LAotICAgICAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykgewotICAgICAgICBlcXVhbHNTdHJpbmcoYXV0aG9yaXR5LCBSYXdDb250YWN0cy5DT05URU5UX1VSSS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5hcHBseUJhdGNoKG9wZXJhdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcykgewotICAgICAgICBtUHJvdmlkZXIuYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKGV4cGVjdGVkQ29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgewotICAgICAgICBtUHJvdmlkZXIudmVyaWZ5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNTdHJpbmcoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0gICAgICAgIGlmIChhID09IG51bGwgfHwgYS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYiA9PSBudWxsIHx8IGIubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhLmVxdWFscyhiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0xpbmVWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTRhYzUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lVmVyaWZpZXIgaW1wbGVtZW50cyBWQ2FyZENvbXBvc2VyLk9uZUVudHJ5SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbUFuZHJvaWRUZXN0Q2FzZTsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxMaW5lVmVyaWZpZXJFbGVtPiBtTGluZVZlcmlmaWVyRWxlbUxpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGludCBpbmRleDsKLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtQW5kcm9pZFRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtTGluZVZlcmlmaWVyRWxlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PExpbmVWZXJpZmllckVsZW0+KCk7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkTGluZVZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgTGluZVZlcmlmaWVyRWxlbSBsaW5lVmVyaWZpZXIgPSBuZXcgTGluZVZlcmlmaWVyRWxlbShtQW5kcm9pZFRlc3RDYXNlLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0LmFkZChsaW5lVmVyaWZpZXIpOwotICAgICAgICByZXR1cm4gbGluZVZlcmlmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgaWYgKGluZGV4ID49IG1MaW5lVmVyaWZpZXJFbGVtTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIkluc3VmZmljaWVudCBudW1iZXIgb2YgTGluZVZlcmlmaWVyICgiICsgaW5kZXggKyAiKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTGluZVZlcmlmaWVyRWxlbSBsaW5lVmVyaWZpZXIgPSBtTGluZVZlcmlmaWVyRWxlbUxpc3QuZ2V0KGluZGV4KTsKLSAgICAgICAgbGluZVZlcmlmaWVyLnZlcmlmeSh2Y2FyZCk7Ci0KLSAgICAgICAgaW5kZXgrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgdmVyaWZ5KHZjYXJkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9MaW5lVmVyaWZpZXJFbGVtLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9MaW5lVmVyaWZpZXJFbGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyM2E5Y2QuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyRWxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lVmVyaWZpZXJFbGVtIHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBtRXhwZWN0ZWRMaW5lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyRWxlbShBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlLCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWQoZmluYWwgU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsaW5lKSkgewotICAgICAgICAgICAgbUV4cGVjdGVkTGluZUxpc3QuYWRkKGxpbmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShmaW5hbCBTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gbGluZUFycmF5ID0gdmNhcmQuc3BsaXQoIlxccj9cXG4iKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxpbmVBcnJheS5sZW5ndGg7Ci0gICAgICAgIGJvb2xlYW4gYmVnaW5FeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBlbmRFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiB2ZXJzaW9uRXhpc3RzID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lQXJyYXlbaV07Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobGluZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCJCRUdJTjpWQ0FSRCIuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmIChiZWdpbkV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBcIkJFR0lOOlZDQVJEXCIgbGluZSBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlZ2luRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgiRU5EOlZDQVJEIi5lcXVhbHNJZ25vcmVDYXNlKGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZEV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBcIkVORDpWQ0FSRFwiIGxpbmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmRFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMShtVkNhcmRUeXBlKSA/ICJWRVJTSU9OOjIuMSIgOgotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSA/ICJWRVJTSU9OOjMuMCIgOgotICAgICAgICAgICAgICAgICAgICAiVkVSU0lPTjo0LjAiKSkuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIk11bHRpcGxlIFZFUlNJT04gbGluZSArIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFiZWdpbkV4aXN0cykgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlByb3BlcnR5IG90aGVyIHRoYW4gQkVHSU4gY2FtZSBiZWZvcmUgQkVHSU4gcHJvcGVydHk6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgb3RoZXIgdGhhbiBFTkQgY2FtZSBhZnRlciBFTkQgcHJvcGVydHk6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbUV4cGVjdGVkTGluZUxpc3QuaW5kZXhPZihsaW5lKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUV4cGVjdGVkTGluZUxpc3QucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBsaW5lOiAiICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1FeHBlY3RlZExpbmVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkTGluZSA6IG1FeHBlY3RlZExpbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChleHBlY3RlZExpbmUpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIkV4cGVjdGVkIGxpbmUocykgbm90IGZvdW5kOiIgKyBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGUuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTdhZDhlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIHJlcHJlc2VudGluZyBvbmUgcHJvcGVydHkgKGUuZy4gIk47RU5DT0RJTkc9VVRGLTg6ZmFtaWx5OmdpdmVuOm1pZGRsZTpwcmVmaXg6c3VmZml4IikuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFByZXZpb3VzbHkgdXNlZCBpbiBtYWluIHZDYXJkIGhhbmRsaW5nIGNvZGUgYnV0IG5vdyBleGlzdHMgb25seSBmb3IgdGVzdGluZy4KLSAqIDwvcD4KLSAqIDxwPgotICogRXNwZWNpYWxseSB1c2VmdWwgZm9yIHRlc3RpbmcgcGFyc2VyIGNvZGUgKFZDYXJkUGFyc2VyKSwgc2luY2UgYWxsIHByb3BlcnRpZXMgY2FuIGJlCi0gKiBjaGVja2VkIHZpYSB0aGlzIGNsYXNzIHVubGlrZSB7QGxpbmsgVkNhcmRFbnRyeX0sIHdoaWNoIG9ubHkgZW1pdHMgdGhlIHJlc3VsdCBvZgotICogaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNvbnRlbnQgb2YgZWFjaCB2Q2FyZC4gV2UgY2Fubm90IGtub3cgd2hldGhlciB2Q2FyZCBwYXJzZXIgb3IKLSAqIHtAbGluayBWQ2FyZEVudHJ5fSBpcyB3cm9uZyB3aXRob3V0IHRoaXMgY2xhc3MuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eU5vZGUgewotICAgIHB1YmxpYyBTdHJpbmcgcHJvcE5hbWU7Ci0gICAgcHVibGljIFN0cmluZyBwcm9wVmFsdWU7Ci0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVfdmVjdG9yOwotCi0gICAgLyoqIFN0b3JlIHZhbHVlIGFzIGJ5dGVbXSxhZnRlciBkZWNvZGUuCi0gICAgICogVXNlZCB3aGVuIHByb3BWYWx1ZSBpcyBlbmNvZGVkIGJ5IHNvbWV0aGluZyBsaWtlIEJBU0U2NCwgUVVPVEVELVBSSU5UQUJMRSwgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gcHJvcFZhbHVlX2J5dGVzOwotCi0gICAgLyoqCi0gICAgICogcGFyYW0gc3RvcmU6IGtleT1wYXJhbVR5cGUsIHZhbHVlPXBhcmFtVmFsdWUKLSAgICAgKiBOb3RlIHRoYXQgY3VycmVudGx5IFByb3BlcnR5Tm9kZSBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHBhcmFtLXZhbHVlcwotICAgICAqIGRlZmluZWQgaW4gdkNhcmQgMy4wIChTZWUgYWxzbyBSRkMgMjQyNikuIG11bHRpcGxlLXZhbHVlcyBhcmUgc3RvcmVkIGFzCi0gICAgICogb25lIFN0cmluZyB2YWx1ZSBsaWtlICJBLEIiLCBub3QgWyJBIiwgIkIiXS4uLgotICAgICAqIFRPRE86IGZpeCB0aGlzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlcyBwYXJhbU1hcDsKLQotICAgIC8qKiBPbmx5IGZvciBUWVBFPT8/PyBwYXJhbSBzdG9yZS4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcGFyYW1NYXBfVFlQRTsKLQotICAgIC8qKiBTdG9yZSBncm91cCB2YWx1ZXMuIFVzZWQgb25seSBpbiBWQ2FyZC4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcHJvcEdyb3VwU2V0OwotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGUoKSB7Ci0gICAgICAgIHByb3BOYW1lID0gIiI7Ci0gICAgICAgIHByb3BWYWx1ZSA9ICIiOwotICAgICAgICBwcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgcGFyYW1NYXBfVFlQRSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgcHJvcEdyb3VwU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlOb2RlKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlX3ZlY3RvciwKLSAgICAgICAgICAgIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFNldDxTdHJpbmc+IHBhcmFtTWFwX1RZUEUsCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSBwcm9wTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZV92ZWN0b3IgPSBwcm9wVmFsdWVfdmVjdG9yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wcm9wVmFsdWVfYnl0ZXMgPSBwcm9wVmFsdWVfYnl0ZXM7Ci0gICAgICAgIGlmIChwYXJhbU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gcGFyYW1NYXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1NYXBfVFlQRSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwX1RZUEUgPSBwYXJhbU1hcF9UWVBFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcF9UWVBFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wR3JvdXBTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wR3JvdXBTZXQgPSBwcm9wR3JvdXBTZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BHcm91cFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAvLyB2Q2FyZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHNhbWUgbGluZSBpbiBvbmUgZW50cnksIHdoaWxlIEhhc2hTZXQgb3IgYW55IG90aGVyCi0gICAgICAgIC8vIGxpYnJhcnkgd2hpY2ggdXRpbGl6ZSBoYXNoQ29kZSgpIGRvZXMgbm90IGhvbm9yIHRoYXQsIHNvIGludGVudGlvbmFsbHkgdGhyb3cgYW4KLSAgICAgICAgLy8gRXhjZXB0aW9uLgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlByb3BlcnR5Tm9kZSBkb2VzIG5vdCBwcm92aWRlIGhhc2hDb2RlKCkgaW1wbGVtZW50YXRpb24gaW50ZW50aW9uYWxseS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9wZXJ0eU5vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFByb3BlcnR5Tm9kZSBub2RlID0gKFByb3BlcnR5Tm9kZSlvYmo7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcE5hbWUgPT0gbnVsbCB8fCAhcHJvcE5hbWUuZXF1YWxzKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBhcmFtTWFwX1RZUEUuZXF1YWxzKG5vZGUucGFyYW1NYXBfVFlQRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghcGFyYW1NYXBfVFlQRS5lcXVhbHMobm9kZS5wYXJhbU1hcF9UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCFwcm9wR3JvdXBTZXQuZXF1YWxzKG5vZGUucHJvcEdyb3VwU2V0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV9ieXRlcyAhPSBudWxsICYmIEFycmF5cy5lcXVhbHMocHJvcFZhbHVlX2J5dGVzLCBub2RlLnByb3BWYWx1ZV9ieXRlcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUuZXF1YWxzKG5vZGUucHJvcFZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGluIHByb3BWYWx1ZV92ZWN0b3IgaXMgbm90IGRlY29kZWQgZXZlbiBpZiBpdCBzaG91bGQgYmUKLSAgICAgICAgICAgIC8vIGRlY29kZWQgYnkgQkFTRTY0IG9yIFFVT1RFRC1QUklOVEFCTEUuIFdoZW4gdGhlIHNpemUgb2YgcHJvcFZhbHVlX3ZlY3RvcgotICAgICAgICAgICAgLy8gaXMgMSwgdGhlIGVuY29kZWQgdmFsdWUgaXMgc3RvcmVkIGluIHByb3BWYWx1ZSwgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAgICAgICAgIC8vIGNoZWNrIGl0LgotICAgICAgICAgICAgcmV0dXJuIChwcm9wVmFsdWVfdmVjdG9yLmVxdWFscyhub2RlLnByb3BWYWx1ZV92ZWN0b3IpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID09IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5wcm9wVmFsdWVfdmVjdG9yLnNpemUoKSA9PSAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgicHJvcE5hbWU6ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wTmFtZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocGFyYW1NYXAudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwX1RZUEU6IFsiKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgaWYgKCFwcm9wR3JvdXBTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wR3JvdXBTZXQ6IFsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsICYmIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcFZhbHVlX3ZlY3RvciBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX2J5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZV9ieXRlcyBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV9ieXRlcy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZTogXCIiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcFZhbHVlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIlwiIik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyOTI4NC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyIGV4dGVuZHMgVk5vZGVCdWlsZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbT4gbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0OwotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1BbmRyb2lkVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBpbnQgbUluZGV4OwotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllcihBbmRyb2lkVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtPigpOwotICAgICAgICBtQW5kcm9pZFRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbmV3IFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0obUFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdC5hZGQoZWxlbSk7Ci0gICAgICAgIHJldHVybiBlbGVtOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Y2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobUFuZHJvaWRUZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdmNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciBwYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1BbmRyb2lkVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksCi0gICAgICAgICAgICAgICAgdmNhcmRUeXBlLCBwYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZjYXJkVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHBhcnNlciA9IFZDYXJkVXRpbHMuZ2V0QXBwcm9wcmlhdGVQYXJzZXIodmNhcmRUeXBlKTsKLSAgICAgICAgdmVyaWZ5KGlzLCB2Y2FyZFR5cGUsIHBhcnNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElucHV0U3RyZWFtIGlzLCBpbnQgdmNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciBwYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShpcywgdGhpcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBzdXBlci5lbmRFbnRyeSgpOwotICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgdk5vZGVMaXN0LnNpemUoKSk7Ci0gICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdC5nZXQobUluZGV4KS52ZXJpZnkodk5vZGVMaXN0LmdldChtSW5kZXgpKTsKLSAgICAgICAgbUluZGV4Kys7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM2YWJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCB2ZXJpZmllcyBpbnB1dCBWTm9kZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGZpcnN0IGNoZWNrcyB3aGV0aGVyIGVhY2ggcHJvcGVydHlOb2RlIGluIHRoZSBWTm9kZSBpcyBpbiB0aGUKLSAqICJvcmRlcmVkIGV4cGVjdGVkIHByb3BlcnR5IGxpc3QiLgotICogSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlICJvcmRlcmVkIGxpc3QiLCB0aGUgY2xhc3MgcmVmZXJzIHRvCi0gKiAidW5vcmRlcmQgZXhwZWN0ZWQgcHJvcGVydHkgc2V0IiBhbmQgY2hlY2tzIHRoZSBub2RlIGlzIGV4cGVjdGVkIHNvbWV3aGVyZS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZVNldCBleHRlbmRzIEhhc2hTZXQ8U3RyaW5nPiB7Ci0gICAgICAgIHB1YmxpYyBUeXBlU2V0KFN0cmluZyAuLi4gYXJyYXkpIHsKLSAgICAgICAgICAgIHN1cGVyKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JvdXBTZXQgZXh0ZW5kcyBIYXNoU2V0PFN0cmluZz4gewotICAgICAgICBwdWJsaWMgR3JvdXBTZXQoU3RyaW5nIC4uLiBhcnJheSkgewotICAgICAgICAgICAgc3VwZXIoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eU5vZGU+PiBtT3JkZXJlZE5vZGVNYXA7Ci0gICAgLy8gSW50ZW50aW9uYWxseSB1c2UgQXJyYXlMaXN0IGluc3RlYWQgb2YgU2V0LCBhc3N1bWluZyB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZQotICAgIC8vIGV4YWN0bHkgc2FtZSBvYmplY3RzLgotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4gbVVub3JkZXJlZE5vZGVMaXN0OwotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtT3JkZXJlZE5vZGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlOb2RlPj4oKTsKLSAgICAgICAgbVVub3JkZXJlZE5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+KCk7Ci0gICAgfQotCi0gICAgLy8gV2l0aE9yZGVyCi0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZS50b1N0cmluZygpLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgbnVsbCwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgcGFyYW1NYXAsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBDb250ZW50VmFsdWVzIHBhcmFtTWFwKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgcGFyYW1NYXAsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBieXRlW10gcHJvcFZhbHVlX2J5dGVzLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFLCBHcm91cFNldCBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsICYmIHByb3BWYWx1ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGUgcHJvcGVydHlOb2RlID0gbmV3IFByb3BlcnR5Tm9kZShwcm9wTmFtZSwKLSAgICAgICAgICAgICAgICBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIHByb3BWYWx1ZV9ieXRlcywKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgcHJvcEdyb3VwU2V0KTsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkTm9kZUxpc3QgPSBtT3JkZXJlZE5vZGVNYXAuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgaWYgKGV4cGVjdGVkTm9kZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgZXhwZWN0ZWROb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgbU9yZGVyZWROb2RlTWFwLnB1dChwcm9wTmFtZSwgZXhwZWN0ZWROb2RlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZXhwZWN0ZWROb2RlTGlzdC5hZGQocHJvcGVydHlOb2RlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLy8gV2l0aG91dE9yZGVyCi0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIG51bGwsCi0gICAgICAgICAgICAgICAgcHJvcFZhbHVlTGlzdCwgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIG51bGwsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wVmFsdWUgPSBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKHByb3BWYWx1ZUxpc3QpOwotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUsIEdyb3VwU2V0IHByb3BHcm91cFNldCkgewotICAgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwgJiYgcHJvcFZhbHVlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wVmFsdWUgPSBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKHByb3BWYWx1ZUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdC5hZGQobmV3IFByb3BlcnR5Tm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLAotICAgICAgICAgICAgICAgIHByb3BWYWx1ZUxpc3QsIHByb3BWYWx1ZV9ieXRlcywgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIHByb3BHcm91cFNldCkpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoVk5vZGUgdm5vZGUpIHsKLSAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSA6IHZub2RlLnByb3BMaXN0KSB7Ci0gICAgICAgICAgICB2ZXJpZnlOb2RlKGFjdHVhbE5vZGUucHJvcE5hbWUsIGFjdHVhbE5vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtT3JkZXJlZE5vZGVNYXAuaXNFbXB0eSgpIHx8ICFtVW5vcmRlcmVkTm9kZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gZXhwZWN0ZWRQcm9wcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChMaXN0PFByb3BlcnR5Tm9kZT4gbm9kZXMgOiBtT3JkZXJlZE5vZGVNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBub2RlIDogbm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZFByb3BzLmNvbnRhaW5zKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFByb3BzLmFkZChub2RlLnByb3BOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlOb2RlIG5vZGUgOiBtVW5vcmRlcmVkTm9kZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkUHJvcHMuY29udGFpbnMobm9kZS5wcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQcm9wcy5hZGQobm9kZS5wcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiRXhwZWN0ZWQgcHJvcGVydHkgIiArIEFycmF5cy50b1N0cmluZyhleHBlY3RlZFByb3BzLnRvQXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBub3QgZm91bmQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Tm9kZShmaW5hbCBTdHJpbmcgcHJvcE5hbWUsIGZpbmFsIFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0ID0gbU9yZGVyZWROb2RlTWFwLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gKGV4cGVjdGVkTm9kZUxpc3QgIT0gbnVsbCA/IGV4cGVjdGVkTm9kZUxpc3Quc2l6ZSgpIDogMCk7Ci0gICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGUgZXhwZWN0ZWROb2RlID0gZXhwZWN0ZWROb2RlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZE5vZGUucHJvcE5hbWUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlLmVxdWFscyhhY3R1YWxOb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROb2RlTGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmRlcmVkTm9kZU1hcC5yZW1vdmUocHJvcE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuYWRkKGV4cGVjdGVkTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyAiYWN0dWFsTm9kZSIgaXMgbm90IGluIG9yZGVyZWQgZXhwZWN0ZWQgbGlzdC4KLSAgICAgICAgICAgICAgICAvLyBUcnkgbG9va2luZyBvdmVyIHVub3JkZXJlZCBleHBlY3RlZCBsaXN0LgotICAgICAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcHJvcE5hbWUgZXhpc3RzIGJ1dCB3aXRoIGRpZmZlcmVudCB2YWx1ZShzKS4KLSAgICAgICAgICAgICAgICAgICAgZmFpbFdpdGhFeHBlY3RlZE5vZGVMaXN0KHByb3BOYW1lLCBhY3R1YWxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGV4cGVjdGVkIG5vZGUgd2l0aCBzYW1lIHByb3BOYW1lLgotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIHByb3BlcnR5IFwiIiArIHByb3BOYW1lICsgIlwiIGV4aXN0cy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgaWYgKHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoYWN0dWFsTm9kZSwgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHByb3BOYW1lIGV4aXN0cyBidXQgd2l0aCBkaWZmZXJlbnQgdmFsdWUocykuCi0gICAgICAgICAgICAgICAgICAgIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChwcm9wTmFtZSwgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBleHBlY3RlZCBub2RlIHdpdGggc2FtZSBwcm9wTmFtZS4KLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBwcm9wZXJ0eSBcIiIgKyBwcm9wTmFtZSArICJcIiBleGlzdHMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihMaXN0PFN0cmluZz4gYXJyYXkpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIHByb3BWYWx1ZUVsZW0gOiBhcnJheSkgewotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChwcm9wVmFsdWVFbGVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5Rm91bmRFeHBlY3RlZE5vZGVGcm9tVW5vcmRlcmVkTGlzdChQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcE5hbWUgPSBhY3R1YWxOb2RlLnByb3BOYW1lOwotICAgICAgICBpbnQgdW5vcmRlcmVkTGlzdFNpemUgPSBtVW5vcmRlcmVkTm9kZUxpc3Quc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVub3JkZXJlZExpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5Tm9kZSB1bm9yZGVyZWRFeHBlY3RlZE5vZGUgPSBtVW5vcmRlcmVkTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHVub3JkZXJlZEV4cGVjdGVkTm9kZS5wcm9wTmFtZS5lcXVhbHMocHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVub3JkZXJlZEV4cGVjdGVkTm9kZS5lcXVhbHMoYWN0dWFsTm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVVub3JkZXJlZE5vZGVMaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmFkZCh1bm9yZGVyZWRFeHBlY3RlZE5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmFpbFdpdGhFeHBlY3RlZE5vZGVMaXN0KFN0cmluZyBwcm9wTmFtZSwgUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBleHBlY3RlZE5vZGUgOiBleHBlY3RlZE5vZGVMaXN0KSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiZXhwZWN0ZWQ6ICIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZXhwZWN0ZWROb2RlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgXCIiICsgcHJvcE5hbWUgKyAiXCIgaGFzIHdyb25nIHZhbHVlLlxuIgotICAgICAgICAgICAgICAgICsgYnVpbGRlci50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiICBhY3R1YWw6ICIgKyBhY3R1YWxOb2RlLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVGVzdHNCYXNlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WQ2FyZFRlc3RzQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQxM2FiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVGVzdHNCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLS8qKgotICogQmFzZUNsYXNzIGZvciB2Q2FyZCB1bml0IHRlc3RzIHdpdGggdXRpbGl0eSBjbGFzc2VzLgotICogUGxlYXNlIGRvIG5vdCBhZGQgZWFjaCB1bml0IHRlc3QgaGVyZS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVGVzdHNCYXNlIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWMjEgPSBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFYzMCA9IFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0dFTkVSSUM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVjQwID0gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WNDBfR0VORVJJQzsKLQotICAgIC8vIERvIG5vdCBtb2RpZnkgdGhlc2UgZHVyaW5nIHRlc3RzLgotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yUVA7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yVXRmODsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmODsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYzMDsKLQotICAgIHByb3RlY3RlZCBWQ2FyZFZlcmlmaWVyIG1WZXJpZmllcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNraXBWZXJpZmljYXRpb247Ci0KLSAgICBwdWJsaWMgVkNhcmRUZXN0c0Jhc2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIC8vIE5vdCB1c2luZyBjb25zdGFudHMgaW4gdkNhcmQgY29kZSBzaW5jZSBpdCBtYXkgYmUgd3JvbmcuCi0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQLnB1dCgiRU5DT0RJTkciLCAiUVVPVEVELVBSSU5UQUJMRSIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMucHV0KCJDSEFSU0VUIiwgIlNISUZUX0pJUyIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclV0ZjggPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclV0ZjgucHV0KCJDSEFSU0VUIiwgIlVURi04Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMucHV0KCJFTkNPRElORyIsICJRVU9URUQtUFJJTlRBQkxFIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLnB1dCgiQ0hBUlNFVCIsICJTSElGVF9KSVMiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjggPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOC5wdXQoIkVOQ09ESU5HIiwgIlFVT1RFRC1QUklOVEFCTEUiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgucHV0KCJDSEFSU0VUIiwgIlVURi04Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjEucHV0KCJFTkNPRElORyIsICJCQVNFNjQiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYzMC5wdXQoIkVOQ09ESU5HIiwgImIiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kcm9pZFRlc3RDYXNlU2V0dXBQcm9wZXJseSgpIHsKLSAgICAgICAgc3VwZXIudGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKTsKLSAgICAgICAgbVNraXBWZXJpZmljYXRpb24gPSB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVZlcmlmaWVyID0gbmV3IFZDYXJkVmVyaWZpZXIodGhpcyk7Ci0gICAgICAgIG1Ta2lwVmVyaWZpY2F0aW9uID0gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaWYgKCFtU2tpcFZlcmlmaWNhdGlvbikgewotICAgICAgICAgICAgbVZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVkNhcmRWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVkNhcmRWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzc5YTViLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHlJdGVyYXRvcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb21wb3NlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29uc3RydWN0b3I7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFV0aWxzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIGxldHMgdXNlcnMgY2hlY2tzIHRoYXQgZ2l2ZW4gZXhwZWN0ZWQgdkNhcmQgZGF0YSBhcmUgc2FtZSBhcyBnaXZlbiBhY3R1YWwgdkNhcmQgZGF0YS4KLSAqIEFibGUgdG8gdmVyaWZ5IGJvdGggdkNhcmQgaW1wb3J0ZXIvZXhwb3J0ZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEZpcnN0IGEgdXNlciBoYXMgdG8gaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IGJ5IGNhbGxpbmcgZWl0aGVyCi0gKiB7QGxpbmsgI2luaXRGb3JJbXBvcnRUZXN0KGludCwgaW50KX0gb3Ige0BsaW5rICNpbml0Rm9yRXhwb3J0VGVzdChpbnQpfS4KLSAqICJSb3VuZCB0cmlwIHRlc3QiIChpbXBvcnQgLT4gZXhwb3J0IC0+IGltcG9ydCwgb3IgZXhwb3J0IC0+IGltcG9ydCAtPiBleHBvcnQpIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFZlcmlmaWVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFZlcmlmaWVyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbU1vY2tDb250ZXh0IGV4dGVuZHMgTW9ja0NvbnRleHQgewotICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOwotICAgICAgICBwdWJsaWMgQ3VzdG9tTW9ja0NvbnRleHQoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVzb2x2ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZDYXJkVmVyaWZpZXJJbnRlcm5hbCBpbXBsZW1lbnRzIFZDYXJkQ29tcG9zZXIuT25lRW50cnlIYW5kbGVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgICAgICB2ZXJpZnlPbmVWQ2FyZEZvckV4cG9ydCh2Y2FyZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1BbmRyb2lkVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFZlcmlmaWVySW50ZXJuYWwgbVZDYXJkVmVyaWZpZXJJbnRlcm5hbDsKLSAgICBwcml2YXRlIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEb0NvTW87Ci0KLSAgICAvLyBPbmx5IG9uZSBvZiB0aGVtIG11c3QgYmUgbm9uLWVtcHR5LgotICAgIHByaXZhdGUgRXhwb3J0VGVzdFJlc29sdmVyIG1FeHBvcnRUZXN0UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtSW5wdXRTdHJlYW07Ci0KLSAgICAvLyBUbyBhbGxvdyBkdXBsaWNhdGlvbiwgdXNlIGxpc3QgaW5zdGVhZCBvZiBzZXQuCi0gICAgLy8gV2hlbiBudWxsLCB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoZSB2ZXJpZmljYXRpb24uCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIgbVByb3BlcnR5Tm9kZXNWZXJpZmllcjsKLSAgICBwcml2YXRlIExpbmVWZXJpZmllciBtTGluZVZlcmlmaWVyOwotICAgIHByaXZhdGUgQ29udGVudFZhbHVlc1ZlcmlmaWVyIG1Db250ZW50VmFsdWVzVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZlcmlmaWVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUNoYXJzZXQ7Ci0KLSAgICAvLyBDYWxsZWQgYnkgVkNhcmRUZXN0c0Jhc2UKLSAgICBwdWJsaWMgVkNhcmRWZXJpZmllcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UgPSBhbmRyb2lkVGVzdENhc2U7Ci0gICAgICAgIG1WQ2FyZFZlcmlmaWVySW50ZXJuYWwgPSBuZXcgVkNhcmRWZXJpZmllckludGVybmFsKCk7Ci0gICAgICAgIG1FeHBvcnRUZXN0UmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBtSW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgbVZlcmlmaWVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggaW1wb3J0IHRlc3QuCi0gICAgcHVibGljIHZvaWQgaW5pdEZvckltcG9ydFRlc3QoaW50IHZjYXJkVHlwZSwgaW50IHJlc0lkKSB7Ci0gICAgICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJBbHJlYWR5IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgc2V0SW5wdXRSZXNvdXJjZUlkKHJlc0lkKTsKLSAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBleHBvcnQgdGVzdC4KLSAgICBwdWJsaWMgdm9pZCBpbml0Rm9yRXhwb3J0VGVzdChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSwgIlVURi04Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdEZvckV4cG9ydFRlc3QoaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtRXhwb3J0VGVzdFJlc29sdmVyID0gbmV3IEV4cG9ydFRlc3RSZXNvbHZlcihtQW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXQpKSB7Ci0gICAgICAgICAgICBtQ2hhcnNldCA9ICJVVEYtOCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hhcnNldCA9IGNoYXJzZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRSZXNvdXJjZUlkKGludCByZXNJZCkgewotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG1BbmRyb2lkVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCk7Ci0gICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiV3JvbmcgcmVzSWQ6ICIgKyByZXNJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0SW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotICAgICAgICBpZiAobUV4cG9ydFRlc3RSZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiYWRkSW5wdXRFbnRyeSgpIGlzIGNhbGxlZC4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIklucHV0U3RyZWFtIGlzIGFscmVhZHkgc2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgbUlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBhZGRJbnB1dEVudHJ5KCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoInNldElucHV0U3RyZWFtIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRXhwb3J0VGVzdFJlc29sdmVyLmFkZElucHV0Q29udGFjdEVudHJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhvdXRWZXJzaW9uKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgPSBuZXcgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyKG1BbmRyb2lkVGVzdENhc2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgZmluYWwgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhvdXRWZXJzaW9uKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uU3RyaW5nOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSAiMi4xIjsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgdmVyc2lvblN0cmluZyA9ICIzLjAiOwotICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gIjQuMCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCB2Y2FyZCB0eXBlIGR1cmluZyBhIHVuaXQgdGVzdCIpOwotICAgICAgICB9Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgdmVyc2lvblN0cmluZyk7Ci0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICIiKTsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiIik7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyRWxlbSBhZGRMaW5lVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTGluZVZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1MaW5lVmVyaWZpZXIgPSBuZXcgTGluZVZlcmlmaWVyKG1BbmRyb2lkVGVzdENhc2UsIG1WQ2FyZFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTGluZVZlcmlmaWVyLmFkZExpbmVWZXJpZmllckVsZW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBhZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ29udGVudFZhbHVlc1ZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbUNvbnRlbnRWYWx1ZXNWZXJpZmllci5hZGRFbGVtKG1BbmRyb2lkVGVzdENhc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgc3ViLXZlcmlmaWVycyBjb3JyZWN0bHkgYW5kIHRyeSBwYXJzZSBnaXZlbiB2Q2FyZCBhcyBJbnB1dFN0cmVhbS4KLSAgICAgKiBFcnJvcnMgYXJvdW5kIElucHV0U3RyZWFtIG11c3QgYmUgaGFuZGxlZCBvdXRzaWRlIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogVXNlZCBib3RoIGZyb20ge0BsaW5rICN2ZXJpZnlGb3JJbXBvcnRUZXN0KCl9IGFuZCBmcm9tIHtAbGluayAjdmVyaWZ5Rm9yRXhwb3J0VGVzdCgpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5V2l0aElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZEludGVycHJldGVyIGludGVycHJldGVyOwotICAgICAgICBpZiAobUNvbnRlbnRWYWx1ZXNWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZEVudHJ5Q29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgY29uc3RydWN0b3IuYWRkRW50cnlIYW5kbGVyKG1Db250ZW50VmFsdWVzVmVyaWZpZXIpOwotICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gbmV3IFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLCBjb25zdHJ1Y3RvcikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IGNvbnN0cnVjdG9yOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gbVByb3BlcnR5Tm9kZXNWZXJpZmllcjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHdlIG11c3Qgbm90IHNwZWNpZnkgY2hhcnNldCB0b3dhcmQgdkNhcmQgcGFyc2Vycy4gVGhpcyBjb2RlIGNoZWNrcyB3aGV0aGVyCi0gICAgICAgICAgICAvLyB0aG9zZSBwYXJzZXJzIGFyZSBhYmxlIHRvIGVuY29kZSBnaXZlbiBiaW5hcnkgd2l0aG91dCBhbnkgZXh0cmEgaW5mb3JtYXRpb24gZm9yCi0gICAgICAgICAgICAvLyBjaGFyc2V0LgotICAgICAgICAgICAgZmluYWwgVkNhcmRQYXJzZXIgcGFyc2VyID0gVkNhcmRVdGlscy5nZXRBcHByb3ByaWF0ZVBhcnNlcihtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShpcywgaW50ZXJwcmV0ZXIpOwotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBWQ2FyZEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlPbmVWQ2FyZEZvckV4cG9ydChmaW5hbCBTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgdmNhcmQpOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2Y2FyZC5nZXRCeXRlcyhtQ2hhcnNldCkpOwotICAgICAgICAgICAgdmVyaWZ5V2l0aElucHV0U3RyZWFtKGlzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WZXJpZmllZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgidmVyaWZ5KCkgd2FzIGNhbGxlZCB0d2ljZS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1FeHBvcnRUZXN0UmVzb2x2ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVGhlcmUgYXJlIHR3byBpbnB1dCBzb3VyY2VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmVyaWZ5Rm9ySW1wb3J0VGVzdCgpOwotICAgICAgICB9IGVsc2UgaWYgKG1FeHBvcnRUZXN0UmVzb2x2ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICB2ZXJpZnlGb3JFeHBvcnRUZXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJObyBpbnB1dCBpcyBkZXRlcm1pbmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZlcmlmaWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9ySW1wb3J0VGVzdCgpIHsKLSAgICAgICAgaWYgKG1MaW5lVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBzdXBwb3J0ZWQgbm93LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZlcmlmeVdpdGhJbnB1dFN0cmVhbShtSW5wdXRTdHJlYW0pOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiSU9FeGNlcHRpb24gd2FzIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCgKLSAgICAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmksIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBmaW5hbCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIGlmIChFeHBvcnRUZXN0UmVzb2x2ZXIuY2xhc3MuZXF1YWxzKHJlc29sdmVyLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFeHBvcnRUZXN0UmVzb2x2ZXIpcmVzb2x2ZXIpLmdldFByb3ZpZGVyKCkucXVlcnlFbnRpdGllcygKLSAgICAgICAgICAgICAgICAgICAgdXJpLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5leHBlY3RlZCBwcm92aWRlciBnaXZlbi4iKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgZ2V0TW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKCkKLSAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoIm1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCIsCi0gICAgICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLmNsYXNzLCBVcmkuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nW10uY2xhc3MsIFN0cmluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUZvckV4cG9ydFRlc3QoKSB7Ci0gICAgICAgZmluYWwgVkNhcmRDb21wb3NlciBjb21wb3NlciA9Ci0gICAgICAgICAgICBuZXcgVkNhcmRDb21wb3NlcihuZXcgQ3VzdG9tTW9ja0NvbnRleHQobUV4cG9ydFRlc3RSZXNvbHZlciksIG1WQ2FyZFR5cGUsIG1DaGFyc2V0KTsKLSAgICAgICAgY29tcG9zZXIuYWRkSGFuZGxlcihtTGluZVZlcmlmaWVyKTsKLSAgICAgICAgY29tcG9zZXIuYWRkSGFuZGxlcihtVkNhcmRWZXJpZmllckludGVybmFsKTsKLSAgICAgICAgaWYgKCFjb21wb3Nlci5pbml0KFZDYXJkQ29tcG9zZXIuQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSSwgbnVsbCwgbnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJpbml0KCkgZmFpbGVkLiBSZWFzb246ICIgKyBjb21wb3Nlci5nZXRFcnJvclJlYXNvbigpKTsKLSAgICAgICAgfQotICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0RmFsc2UoY29tcG9zZXIuaXNBZnRlckxhc3QoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoIWNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kID0gZ2V0TW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5hc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2VyLmNyZWF0ZU9uZUVudHJ5KG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY29tcG9zZXIudGVybWluYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5MGUyYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFByZXZpb3VzbHkgdXNlZCBpbiBtYWluIHZDYXJkIGhhbmRsaW5nIGNvZGUgYnV0IG5vdyBleGlzdHMgb25seSBmb3IgdGVzdGluZy4KLSAqLwotcHVibGljIGNsYXNzIFZOb2RlIHsKLSAgICBwdWJsaWMgU3RyaW5nIFZOYW1lOwotCi0gICAgcHVibGljIEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+IHByb3BMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+KCk7Ci0KLSAgICAvKiogMDpwYXJzZSBvdmVyLiAxOnBhcnNpbmcuICovCi0gICAgcHVibGljIGludCBwYXJzZVN0YXR1cyA9IDE7Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZUJ1aWxkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZOb2RlQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM3MDM0Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZOb2RlQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3Mgc3RvcmluZyB0aGUgcGFyc2UgcmVzdWx0IHRvIGN1c3RvbSBkYXRhc3RydWN0OgotICoge0BsaW5rIFZOb2RlfSwgYW5kIHtAbGluayBQcm9wZXJ0eU5vZGV9LgotICogTWF5YmUgc2V2ZXJhbCB2Y2FyZCBpbnN0YW5jZSwgc28gdXNlIHZOb2RlTGlzdCB0byBzdG9yZS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpcyBjYWxsZWQgVk5vZGUsIG5vdCBWQ2FyZE5vZGUsIHNpbmNlIGl0IHdhcyB1c2VkIGZvciBleHByZXNzaW5nIHZDYWxlbmRhciAoaUNhbCkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWTm9kZUJ1aWxkZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgTE9HX1RBRyA9ICJWTm9kZUJ1aWxkZXIiOyAKLSAgICAKLSAgICBwdWJsaWMgTGlzdDxWTm9kZT4gdk5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxWTm9kZT4oKTsKLSAgICBwcml2YXRlIGludCBtTm9kZUxpc3RQb3MgPSAwOwotICAgIHByaXZhdGUgVk5vZGUgbUN1cnJlbnRWTm9kZTsKLSAgICBwcml2YXRlIFByb3BlcnR5Tm9kZSBtQ3VycmVudFByb3BOb2RlOwotICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50UGFyYW1UeXBlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgdXNpbmcgd2hpY2ggVlBhcnNlciBwYXJzZXMgdGhlIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVNvdXJjZUNoYXJzZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hhcnNldCB3aXRoIHdoaWNoIGJ5dGUgYXJyYXkgaXMgZW5jb2RlZCB0byBTdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhcmdldENoYXJzZXQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgIAotICAgIHB1YmxpYyBWTm9kZUJ1aWxkZXIoKSB7Ci0gICAgICAgIHRoaXMoVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBWTm9kZUJ1aWxkZXIoU3RyaW5nIHRhcmdldENoYXJzZXQsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICBtU291cmNlQ2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfSU5URVJNRURJQVRFX0NIQVJTRVQ7Ci0gICAgICAgIGlmICh0YXJnZXRDaGFyc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UYXJnZXRDaGFyc2V0ID0gdGFyZ2V0Q2hhcnNldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1UYXJnZXRDaGFyc2V0ID0gVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBtU3RyaWN0TGluZUJyZWFrUGFyc2luZyA9IHN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgIH0KLQotICAgIC8vIE5vdGU6IEkgZ3Vlc3MgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyB0aGUgUmVjb3JkIG1heSBuZXN0IGxpa2UgdGhpczoKLSAgICAvLyBTVEFSVDpWUE9TCi0gICAgLy8gLi4uCi0gICAgLy8gU1RBUlQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUwotICAgIC8vCi0gICAgLy8gSG93ZXZlciB0aGUgZm9sbG93aW5nIGNvZGUgaGFzIGEgYnVnLgotICAgIC8vIFdoZW4gZXJyb3Igb2NjdXJzIGFmdGVyIGNhbGxpbmcgc3RhcnRSZWNvcmQoKSwgdGhlIGVudHJ5IHdoaWNoIGlzIHByb2JhYmx5Ci0gICAgLy8gdGhlIGNhdXNlIG9mIHRoZSBlcnJvciByZW1haW5zIHRvIGJlIGluIHZOb2RlTGlzdCwgd2hpbGUgZW5kUmVjb3JkKCkgaXMgbm90IGNhbGxlZC4KLSAgICAvLwotICAgIC8vIEkgbGVhdmUgdGhpcyBjb2RlIGFzIGlzIHNpbmNlIEknbSBub3QgZmFtaWxpYXIgd2l0aCB2Y2FsZW5kYXIgc3BlY2lmaWNhdGlvbi4KLSAgICAvLyBCdXQgSSBiZWxpZXZlIHdlIHNob3VsZCByZWZhY3RvciB0aGlzIGNvZGUgaW4gdGhlIGZ1dHVyZS4KLSAgICAvLyBVbnRpbCB0aGlzLCB0aGUgbGFzdCBlbnRyeSBoYXMgdG8gYmUgcmVtb3ZlZCB3aGVuIHNvbWUgZXJyb3Igb2NjdXJzLgotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIFZOb2RlIHZub2RlID0gbmV3IFZOb2RlKCk7Ci0gICAgICAgIHZub2RlLnBhcnNlU3RhdHVzID0gMTsKLSAgICAgICAgdm5vZGUuVk5hbWUgPSAiVkNBUkQiOwotICAgICAgICAvLyBJIGZlZWwgdGhpcyBzaG91bGQgYmUgZG9uZSBpbiBlbmRSZWNvcmQoKSwgYnV0IGl0IGNhbm5vdCBiZSBkb25lIGJlY2F1c2Ugb2YKLSAgICAgICAgLy8gdGhlIHJlYXNvbiBhYm92ZS4KLSAgICAgICAgdk5vZGVMaXN0LmFkZCh2bm9kZSk7Ci0gICAgICAgIG1Ob2RlTGlzdFBvcyA9IHZOb2RlTGlzdC5zaXplKCkgLSAxOwotICAgICAgICBtQ3VycmVudFZOb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBWTm9kZSBlbmROb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgICAgICBlbmROb2RlLnBhcnNlU3RhdHVzID0gMDsKLSAgICAgICAgd2hpbGUobU5vZGVMaXN0UG9zID4gMCl7Ci0gICAgICAgICAgICBtTm9kZUxpc3RQb3MtLTsKLSAgICAgICAgICAgIGlmKCh2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcykpLnBhcnNlU3RhdHVzID09IDEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWTm9kZSA9IHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlID0gbmV3IFByb3BlcnR5Tm9kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFZOb2RlLnByb3BMaXN0LmFkZChtQ3VycmVudFByb3BOb2RlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcE5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcEdyb3VwU2V0LmFkZChncm91cCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIG1DdXJyZW50UGFyYW1UeXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICghVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKHZhbHVlKSkgewotICAgICAgICAgICAgdmFsdWUgPSBWQ2FyZFV0aWxzLmNvbnZlcnRTdHJpbmdDaGFyc2V0KHZhbHVlLAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VULAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5ERUZBVUxUX0lNUE9SVF9DSEFSU0VUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3VycmVudFBhcmFtVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQYXJhbVR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiVFlQRSIpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwX1RZUEUuYWRkKHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucGFyYW1NYXAucHV0KG1DdXJyZW50UGFyYW1UeXBlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudFBhcmFtVHlwZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlU3RyaW5nKFN0cmluZyBvcmlnaW5hbFN0cmluZywgU3RyaW5nIHRhcmdldENoYXJzZXQpIHsKLSAgICAgICAgaWYgKG1Tb3VyY2VDaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0Q2hhcnNldCkpIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFN0cmluZzsKLSAgICAgICAgfQotICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUobVNvdXJjZUNoYXJzZXQpOwotICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlT25lVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCwgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKCJCQVNFNjQiKSB8fCBlbmNvZGluZy5lcXVhbHMoIkIiKSkgewotICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBCQVNFNjQgaXMgdXNlZCBvbmx5IHdoZW4gdGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgMS4KLSAgICAgICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV9ieXRlcyA9IEJhc2U2NC5kZWNvZGUodmFsdWUuZ2V0Qnl0ZXMoKSwgQmFzZTY0Lk5PX1dSQVApOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRVdGlscy5wYXJzZVF1b3RlZFByaW50YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBtU3RyaWN0TGluZUJyZWFrUGFyc2luZywgbVNvdXJjZUNoYXJzZXQsIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVW5rbm93biBlbmNvZGluZy4gRmFsbCBiYWNrIHRvIGRlZmF1bHQuCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuY29kZVN0cmluZyh2YWx1ZSwgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfYnl0ZXMgPSBudWxsOwotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV92ZWN0b3IuYWRkKCIiKTsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlID0gIiI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAgPSBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHRhcmdldENoYXJzZXQgPSBDaGFyc2V0VXRpbHMubmFtZUZvckRlZmF1bHRWZW5kb3IocGFyYW1NYXAuZ2V0QXNTdHJpbmcoIkNIQVJTRVQiKSk7IAotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBwYXJhbU1hcC5nZXRBc1N0cmluZygiRU5DT0RJTkciKTsgCi0gICAgICAgIAotICAgICAgICBpZiAodGFyZ2V0Q2hhcnNldCA9PSBudWxsIHx8IHRhcmdldENoYXJzZXQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGFyZ2V0Q2hhcnNldCA9IG1UYXJnZXRDaGFyc2V0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25lVmFsdWUodmFsdWUsIHRhcmdldENoYXJzZXQsIGVuY29kaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZSA9IGxpc3RUb1N0cmluZyhtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV92ZWN0b3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCl7Ci0gICAgICAgIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gMSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB0eXBlTGlzdEIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICB0eXBlTGlzdEIuYXBwZW5kKHR5cGUpLmFwcGVuZCgiOyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGxlbiA9IHR5cGVMaXN0Qi5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIHR5cGVMaXN0Qi5jaGFyQXQobGVuIC0gMSkgPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXN0Qi5zdWJzdHJpbmcoMCwgbGVuIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHlwZUxpc3RCLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKXsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YQppbmRleCAzNzBhZTc4Li5iODJlNjk4IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEKQEAgLTE0NCw0ICsxNDQsNTEgQEAKIAogICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgU2V0dGluZ3MuQm9va21hcmtzLmdldEludGVudEZvclNob3J0Y3V0KHIsICcqJykpOwogICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlUHJvdmlkZXJMaXN0KCkgeworICAgICAgICBDb250ZW50UmVzb2x2ZXIgciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZ2V0IG91dCB3aGF0IHdlIHB1dCBpbi4KKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCksCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisKKyAgICAgICAgLy8gVGVzdCBhZGRpbmcgYSB2YWx1ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAiIik7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiK3Rlc3QxIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBhZGRpbmcgYSBzZWNvbmQgdmFsdWUKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICIrdGVzdDIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0MiIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGFkZGluZyBhIHRoaXJkIHZhbHVlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiK3Rlc3QzIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIsdGVzdDMiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBkZWxldGluZyB0aGUgZmlyc3QgdmFsdWUgaW4gYSAzIGl0ZW0gbGlzdAorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIi10ZXN0MSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QyLHRlc3QzIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgZGVsZXRpbmcgdGhlIG1pZGRsZSB2YWx1ZSBpbiBhIDMgaXRlbSBsaXN0CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIi10ZXN0MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QzIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgZGVsZXRpbmcgdGhlIGxhc3QgdmFsdWUgaW4gYSAzIGl0ZW0gbGlzdAorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0MiIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKyAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhCmluZGV4IDhlN2U2M2UuLmZiMGYwYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIC8qKgotICogVGVzdHMgU3RhdGljTGF5b3V0IGJpZGkgaW1wbGVtZW50YXRpb24uCisgKiBRdWljayBjaGVjayBvZiBuYXRpdmUgYmlkaSBpbXBsZW1lbnRhdGlvbi4KICAqLwogcHVibGljIGNsYXNzIFN0YXRpY0xheW91dEJpZGlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIApAQCAtNDEsNzMgKzQxLDQ3IEBACiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsbEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsICJhIHRlc3QiLCAiMDAwMDAwIiwgTCk7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIEwpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0THRyUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMDAwMDExMSIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMDAwMDExMSIsIEwpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSdGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTAwMCIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEyMjIiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJBbGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX1IsICJhIHRlc3QiLCAiMDAwMDAwIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX1IsICJhIHRlc3QiLCAiMjIyMjIyIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSTHRyUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9SLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIwMDAxMTExIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX1IsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjIyMjExMTEiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExBbGxSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0wsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgTCk7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0wsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgTCk7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMUnRsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9MLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMDAwMCIsIEwpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZXhwZWN0QmlkaShpbnQgZGlyLCBTdHJpbmcgdGV4dCwgCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRMZXZlbHMsIGludCBleHBlY3RlZERpcikgewotICAgICAgICBjaGFyW10gY2hzID0gdGV4dC50b0NoYXJBcnJheSgpOwotICAgICAgICBpbnQgbiA9IGNocy5sZW5ndGg7Ci0gICAgICAgIGJ5dGVbXSBjaEluZm8gPSBuZXcgYnl0ZVtuXTsKLSAgICAgICAgCi0gICAgICAgIGludCByZXN1bHREaXIgPSBTdGF0aWNMYXlvdXQuYmlkaShkaXIsIGNocywgY2hJbmZvLCBuLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoImluZm86Iik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpLmFwcGVuZChTdHJpbmcudmFsdWVPZihjaEluZm9baV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5pKCJCSURJIiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNoYXJbXSByZXN1bHRMZXZlbENoYXJzID0gbmV3IGNoYXJbbl07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICByZXN1bHRMZXZlbENoYXJzW2ldID0gKGNoYXIpKCcwJyArIGNoSW5mb1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHJlc3VsdExldmVscyA9IG5ldyBTdHJpbmcocmVzdWx0TGV2ZWxDaGFycyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGlyZWN0aW9uIiwgZXhwZWN0ZWREaXIsIHJlc3VsdERpcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGV2ZWxzIiwgZXhwZWN0ZWRMZXZlbHMsIHJlc3VsdExldmVscyk7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTIyMiIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlQmlkaSgpIHsKLSAgICAgICAgLy8gbmF0aXZlIGJpZGkgcmV0dXJucyBsZXZlbHMsIG5vdCBzaW1wbHkgZGlyZWN0aW9ucwotICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEyMjIiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfTCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTAwMDAiLCBMKTsKICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdE5hdGl2ZUJpZGkoaW50IGRpciwgU3RyaW5nIHRleHQsIApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZGU4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRleHQ7CisKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkRpcmVjdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlN0YXRpY0xheW91dFRlc3QuTGF5b3V0QnVpbGRlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFN0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQUxFRiA9ICdcdTA1ZDAnOworCisgICAgcHJpdmF0ZSBzdGF0aWMgRGlyZWN0aW9ucyBkaXJzKGludCAuLi4gZGlycykgeworICAgICAgICByZXR1cm4gbmV3IERpcmVjdGlvbnMoZGlycyk7CisgICAgfQorCisgICAgLy8gY29uc3RhbnRzIGZyb20gTGF5b3V0IHRoYXQgYXJlIHBhY2thZ2UtcHJvdGVjdGVkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9MRU5HVEhfTUFTSyA9IDB4MDNmZmZmZmY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9TSElGVCA9IDI2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfTUFTSyA9IDB4M2Y7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9SVExfRkxBRyA9IDEgPDwgUlVOX0xFVkVMX1NISUZUOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9MRUZUX1RPX1JJR0hUID0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIH0pOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfUklHSFRfVE9fTEVGVCA9CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB8IFJVTl9SVExfRkxBRyB9KTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVkwxXzEgPSAxIHwgKDEgPDwgUlVOX0xFVkVMX1NISUZUKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFZMMl8xID0gMSB8ICgyIDw8IFJVTl9MRVZFTF9TSElGVCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExWTDJfMiA9IDIgfCAoMiA8PCBSVU5fTEVWRUxfU0hJRlQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGV4dHMgPSB7CisgICAgICAgICIiLAorICAgICAgICAiICIsCisgICAgICAgICJhIiwKKyAgICAgICAgImExIiwKKyAgICAgICAgImFBIiwKKyAgICAgICAgImExYiIsCisgICAgICAgICJhMUEiLAorICAgICAgICAiYUExIiwKKyAgICAgICAgImFBYiIsCisgICAgICAgICJhQTFCIiwKKyAgICAgICAgImFBMUIyIiwKKworICAgICAgICAvLyBydGwKKyAgICAgICAgIkEiLAorICAgICAgICAiQTEiLAorICAgICAgICAiQWEiLAorICAgICAgICAiQTFCIiwKKyAgICAgICAgIkExYSIsCisgICAgICAgICJBYTEiLAorICAgICAgICAiQWFCIgorICAgIH07CisKKyAgICAvLyBFeHBlY3RlZCBkaXJlY3Rpb25zIGFyZSBhbiBhcnJheSBvZiBzdGFydC9sZW5ndGgrbGV2ZWwgcGFpcnMsCisgICAgLy8gaW4gdmlzdWFsIG9yZGVyIGZyb20gdGhlIGxlYWRpbmcgbWFyZ2luLgorICAgIHByaXZhdGUgc3RhdGljIERpcmVjdGlvbnNbXSBleHBlY3RlZCA9IHsKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgZGlycygwLCAxLCAxLCBMVkwxXzEpLAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBkaXJzKDAsIDIsIDIsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgMSwgMiwgTFZMMl8xLCAxLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDEsIExWTDFfMSwgMiwgMSksCisgICAgICAgIGRpcnMoMCwgMSwgMywgTFZMMV8xLCAyLCBMVkwyXzEsIDEsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgMSwgNCwgTFZMMl8xLCAzLCBMVkwxXzEsIDIsIExWTDJfMSwgMSwgTFZMMV8xKSwKKworICAgICAgICAvLyBydGwKKyAgICAgICAgRElSU19BTExfUklHSFRfVE9fTEVGVCwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xLCAyLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8yKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMiksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEsIDIsIExWTDFfMSksCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwc2V1ZG9CaWRpVG9SZWFsKFN0cmluZyBzcmMpIHsKKyAgICAgICAgY2hhcltdIGNoYXJzID0gc3JjLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhcnMubGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IGNoYXJzW2pdOworICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0QnKSB7CisgICAgICAgICAgICAgICAgY2hhcnNbal0gPSAoY2hhcikoQUxFRiArIGMgLSAnQScpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMsIDAsIGNoYXJzLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3Rpb25zKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJcbiIpOworICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoYnVmKTsKKworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwodGV4dHNbaV0pKTsKKyAgICAgICAgICAgIGNoZWNrRGlyZWN0aW9ucyhiLmJ1aWxkKCksIGksIGIudGV4dCwgZXhwZWN0ZWQsIGYpOworICAgICAgICB9CisgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICBmYWlsKGJ1Zi50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhaWxpbmdXaGl0ZXNwYWNlKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwoIkFiICAgYyIpKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSBiLnBhaW50Lm1lYXN1cmVUZXh0KGIudGV4dCwgMCwgNSk7ICAvLyBleGNsdWRlICdjJworICAgICAgICBiLnNldFdpZHRoKE1hdGgucm91bmQod2lkdGgpKTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIGlmIChsLmdldExpbmVDb3VudCgpICE9IDIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJleHBlY3RlZCAyIGxpbmVzLCBnb3Q6ICIgKyBsLmdldExpbmVDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBEaXJlY3Rpb25zIHJlc3VsdCA9IGwuZ2V0TGluZURpcmVjdGlvbnMoMCk7CisgICAgICAgIERpcmVjdGlvbnMgZXhwZWN0ZWQgPSBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xLCAyLCAzIHwgKDEgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkpOworICAgICAgICBleHBlY3REaXJlY3Rpb25zKCJzcGxpdCBsaW5lIiwgZXhwZWN0ZWQsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRUb1JpZ2h0T2YoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCgiYUExQjIiKSk7CisgICAgICAgIC8vIHZpc3VhbCBhMkIxQSBwb3NpdGlvbnMgMDQzMjEKKyAgICAgICAgLy8gMDogfGEyQjFBLCBzdHJvbmcgaXMgc29sLCBhZnRlciAtPiAwCisgICAgICAgIC8vIDE6IGF8MkIxQSwgc3Ryb25nIGlzIGEsIGFmdGVyIC0+LCAxCisgICAgICAgIC8vIDI6IGEyfEIxQSwgc3Ryb25nIGlzIEIsIGFmdGVyIC0+IDQKKyAgICAgICAgLy8gMzogYTJCfDFBLCBzdHJvbmcgaXMgQiwgYmVmb3JlIC0+IDMKKyAgICAgICAgLy8gNDogYTJCMXxBLCBzdHJvbmcgaXMgQSwgYWZ0ZXIgLT4gMgorICAgICAgICAvLyA1OiBhMkIxQXwsIHN0cm9uZyBpcyBlb2wsIGJlZm9yZSAtPiA1CisgICAgICAgIGludFtdIGV4cGVjdGVkID0geyAwLCAxLCA0LCAzLCAyLCA1IH07CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGludCB0ID0gbC5nZXRPZmZzZXRUb1JpZ2h0T2Yobik7CisgICAgICAgICAgICBpZiAodCAhPSBleHBlY3RlZFtpXSkgeworICAgICAgICAgICAgICAgIGZhaWwoIm9mZnNldFsiICsgaSArICJdIHRvIHJpZ2h0IG9mOiAiICsgbiArICIgZXhwZWN0ZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaV0gKyAiIGdvdDogIiArIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dFRvTGVmdE9mKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwoImFBMUIyIikpOworICAgICAgICBpbnRbXSBleHBlY3RlZCA9IHsgMCwgMSwgNCwgMywgMiwgNSB9OworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgaW50IG4gPSA1OworICAgICAgICBmb3IgKGludCBpID0gZXhwZWN0ZWQubGVuZ3RoIC0gMTsgLS1pID49IDA7KSB7CisgICAgICAgICAgICBpbnQgdCA9IGwuZ2V0T2Zmc2V0VG9MZWZ0T2Yobik7CisgICAgICAgICAgICBpZiAodCAhPSBleHBlY3RlZFtpXSkgeworICAgICAgICAgICAgICAgIGZhaWwoIm9mZnNldFsiICsgaSArICJdIHRvIGxlZnQgb2Y6ICIgKyBuICsgIiBleHBlY3RlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFtpXSArICIgZ290OiAiICsgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHV0aWxpdHksIG5vdCByZWFsbHkgYSB0ZXN0CisgICAgLyoKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVhc3VyZVRleHQxKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nIHRleHQgPSAiQUJDIjsgLy8gImFiQUIiCisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKHRleHQpKTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGwuZ2V0TGluZURpcmVjdGlvbnMoMCk7CisKKyAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKworICAgICAgICBpbnQgZGlyID0gLTE7IC8vIExFRlRfVE9fUklHSFQKKyAgICAgICAgYm9vbGVhbiB0cmFpbGluZyA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gYWx0ID0gdHJ1ZTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZGlyID0gLWRpcjsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB0cmFpbGluZyA9ICF0cmFpbGluZzsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBvZmZzZXQgPSAwLCBlbmQgPSBiLnRleHQubGVuZ3RoKCk7IG9mZnNldCA8PSBlbmQ7ICsrb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gTGF5b3V0Lm1lYXN1cmVUZXh0KGIucGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIudGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBvZmZzZXQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIGRpcmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgICAgICAgICBMb2cuaSgiQklESSIsICJkaXI6ICIgKyBkaXIgKyAiIHRyYWlsOiAiICsgdHJhaWxpbmcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb2Zmc2V0OiAiICsgb2Zmc2V0ICsgIiB3aWR0aDogIiArIHdpZHRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICghdHJhaWxpbmcpOworICAgICAgICB9IHdoaWxlIChkaXIgPiAwKTsKKyAgICB9CisgICAgKi8KKworICAgIC8vIHV0aWxpdHkgZm9yIGRpc3BsYXlpbmcgYXJyYXlzIGluIGhleAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBoZXhBcnJheShpbnRbXSBhcnJheSkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCd7Jyk7CisgICAgICAgIGZvciAoaW50IGkgOiBhcnJheSkgeworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGkpKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRGlyZWN0aW9ucyhMYXlvdXQgbCwgaW50IGksIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgRGlyZWN0aW9uc1tdIGV4cGVjdGVkRGlycywgRm9ybWF0dGVyIGYpIHsKKyAgICAgICAgRGlyZWN0aW9ucyBleHBlY3RlZCA9IGV4cGVjdGVkRGlyc1tpXTsKKyAgICAgICAgRGlyZWN0aW9ucyByZXN1bHQgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoZXhwZWN0ZWQubURpcmVjdGlvbnMsIHJlc3VsdC5tRGlyZWN0aW9ucykpIHsKKyAgICAgICAgICAgIGYuZm9ybWF0KCIlblslMmRdICclcycsICVzICE9ICVzIiwgaSwgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgaGV4QXJyYXkoZXhwZWN0ZWQubURpcmVjdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICBoZXhBcnJheShyZXN1bHQubURpcmVjdGlvbnMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3REaXJlY3Rpb25zKFN0cmluZyBtc2csIERpcmVjdGlvbnMgZXhwZWN0ZWQsIERpcmVjdGlvbnMgcmVzdWx0KSB7CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhleHBlY3RlZC5tRGlyZWN0aW9ucywgcmVzdWx0Lm1EaXJlY3Rpb25zKSkgeworICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQ6ICIgKyBoZXhBcnJheShleHBlY3RlZC5tRGlyZWN0aW9ucykgKworICAgICAgICAgICAgICAgICAgICAiIGdvdDogIiArIGhleEFycmF5KHJlc3VsdC5tRGlyZWN0aW9ucykpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dFRlc3QuamF2YQppbmRleCAxZjU4YTJjLi5kNTU0YTUwIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dFRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dFRlc3QuamF2YQpAQCAtMjI4LDExICsyMjgsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIExheW91dEJ1aWxkZXIgYnVpbGRlcigpIHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBMYXlvdXRCdWlsZGVyIGJ1aWxkZXIoKSB7CiAgICAgICAgIHJldHVybiBuZXcgTGF5b3V0QnVpbGRlcigpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExheW91dEJ1aWxkZXIgeworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIExheW91dEJ1aWxkZXIgewogICAgICAgICBTdHJpbmcgdGV4dCA9ICJUaGlzIGlzIGEgdGVzdCI7CiAgICAgICAgIFRleHRQYWludCBwYWludCA9IG5ldyBUZXh0UGFpbnQoKTsgLy8gZGVmYXVsdAogICAgICAgICBpbnQgd2lkdGggPSAxMDA7CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTEyYjBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotLyoqCi0gKiBVdGlsaXR5IGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHZhcmlvdXMgRXhwYW5kYWJsZSBMaXN0IHNjZW5hcmlvcy4KLSAqIDxwPgotICogV0FSTklORzogQSBsb3Qgb2YgdGhlIGZlYXR1cmVzIGFyZSBtaXhlZCBiZXR3ZWVuIExpc3RWaWV3J3MgZXhwZWN0ZWQgcG9zaXRpb24KLSAqIChmbGF0IGxpc3QgcG9zaXRpb24pIGFuZCBhbiBFeHBhbmRhYmxlTGlzdFZpZXcncyBleHBlY3RlZCBwb3NpdGlvbi4gIFlvdSBtdXN0IGFkZC9jaGFuZ2UKLSAqIGZlYXR1cmVzIGFzIHlvdSBuZWVkIHRoZW0uCi0gKiAKLSAqIEBzZWUgTGlzdFNjZW5hcmlvCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIGV4dGVuZHMgTGlzdFNjZW5hcmlvIHsKLSAgICBwcm90ZWN0ZWQgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyOyAKLSAgICBwcm90ZWN0ZWQgTGlzdDxNeUdyb3VwPiBtR3JvdXBzOwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBMaXN0VmlldyBjcmVhdGVMaXN0VmlldygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHBhbmRhYmxlTGlzdFZpZXcodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFBhcmFtcyBjcmVhdGVQYXJhbXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXhwYW5kYWJsZVBhcmFtcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldEFkYXB0ZXIoTGlzdFZpZXcgbGlzdFZpZXcpIHsKLSAgICAgICAgKChFeHBhbmRhYmxlTGlzdFZpZXcpIGxpc3RWaWV3KS5zZXRBZGFwdGVyKG1BZGFwdGVyID0gY3JlYXRlQWRhcHRlcigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEV4cGFuZGFibGVMaXN0QWRhcHRlciBjcmVhdGVBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IE15QWRhcHRlcigpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCByZWFkQW5kVmFsaWRhdGVQYXJhbXMoUGFyYW1zIHBhcmFtcykgewotICAgICAgICBFeHBhbmRhYmxlUGFyYW1zIGV4cGFuZGFibGVQYXJhbXMgPSAoRXhwYW5kYWJsZVBhcmFtcykgcGFyYW1zOwotICAgICAgICAKLSAgICAgICAgaW50W10gbnVtQ2hpbGRyZW4gPSBleHBhbmRhYmxlUGFyYW1zLm1OdW1DaGlsZHJlbjsKLSAgICAgICAgCi0gICAgICAgIG1Hcm91cHMgPSBuZXcgQXJyYXlMaXN0PE15R3JvdXA+KG51bUNoaWxkcmVuLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG1Hcm91cHMuYWRkKG5ldyBNeUdyb3VwKG51bUNoaWxkcmVuW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV4cGFuZGFibGVQYXJhbXMuc3VwZXJTZXROdW1JdGVtcygpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIucmVhZEFuZFZhbGlkYXRlUGFyYW1zKHBhcmFtcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBFeHBhbmRhYmxlTGlzdFZpZXcgd2lkZ2V0LgotICAgICAqIEByZXR1cm4gVGhlIG1haW4gd2lkZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBFeHBhbmRhYmxlTGlzdFZpZXcgZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCkgewotICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVMaXN0Vmlldykgc3VwZXIuZ2V0TGlzdFZpZXcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGFuZGFibGVQYXJhbXMgZXh0ZW5kcyBQYXJhbXMgewotICAgICAgICBwcml2YXRlIGludFtdIG1OdW1DaGlsZHJlbjsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gcGVyIGdyb3VwLgotICAgICAgICAgKiAgCi0gICAgICAgICAqIEBwYXJhbSBudW1DaGlsZHJlblBlckdyb3VwIFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gcGVyIGdyb3VwLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0TnVtQ2hpbGRyZW4oaW50W10gbnVtQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgIG1OdW1DaGlsZHJlbiA9IG51bUNoaWxkcmVuOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9uIHRoZSBzdXBlcmNsYXNzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YKLSAgICAgICAgICogZ3JvdXBzIGFuZCBjaGlsZHJlbiBwZXIgZ3JvdXAuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIEV4cGFuZGFibGVQYXJhbXMgc3VwZXJTZXROdW1JdGVtcygpIHsKLSAgICAgICAgICAgIGludCBudW1JdGVtcyA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtTnVtQ2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtTnVtQ2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtSXRlbXMgKz0gbU51bUNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3VwZXIuc2V0TnVtSXRlbXMobnVtSXRlbXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBQYXJhbXMgc2V0TnVtSXRlbXMoaW50IG51bUl0ZW1zKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVc2Ugc2V0TnVtR3JvdXBzIGFuZCBzZXROdW1DaGlsZHJlbiBpbnN0ZWFkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldEZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKGRvdWJsZSBmYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3RvcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRGYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3RvcihmYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoZG91YmxlIGl0ZW1TY3JlZW5TaXplRmFjdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKGl0ZW1TY3JlZW5TaXplRmFjdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRJdGVtc0ZvY3VzYWJsZShib29sZWFuIGl0ZW1zRm9jdXNhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldEl0ZW1zRm9jdXNhYmxlKGl0ZW1zRm9jdXNhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRNdXN0RmlsbFNjcmVlbihib29sZWFuIGZpbGxTY3JlZW4pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0TXVzdEZpbGxTY3JlZW4oZmlsbFNjcmVlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0UG9zaXRpb25TY3JlZW5TaXplRmFjdG9yT3ZlcnJpZGUoaW50IHBvc2l0aW9uLCBkb3VibGUgaXRlbVNjcmVlblNpemVGYWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0UG9zaXRpb25TY3JlZW5TaXplRmFjdG9yT3ZlcnJpZGUocG9zaXRpb24sIGl0ZW1TY3JlZW5TaXplRmFjdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRQb3NpdGlvblVuc2VsZWN0YWJsZShpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0UG9zaXRpb25VbnNlbGVjdGFibGUocG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFN0YWNrRnJvbUJvdHRvbShib29sZWFuIHN0YWNrRnJvbUJvdHRvbSkgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRTdGFja0Zyb21Cb3R0b20oc3RhY2tGcm9tQm90dG9tKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRTdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKGludCBzdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oc3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0Q29ubmVjdEFkYXB0ZXIoYm9vbGVhbiBjb25uZWN0QWRhcHRlcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRDb25uZWN0QWRhcHRlcihjb25uZWN0QWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgc3RyaW5nIGZvciB0aGUgdmFsdWUgb2Ygc29tZSBpdGVtLgotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0uCi0gICAgICogQHJldHVybiBUaGUgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VmFsdWVBdFBvc2l0aW9uKGxvbmcgcGFja2VkUG9zaXRpb24pIHsKLSAgICAgICAgZmluYWwgaW50IHR5cGUgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25UeXBlKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRCkgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuLmdldChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25DaGlsZChwYWNrZWRQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgICAgIC5uYW1lOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uR3JvdXAocGFja2VkUG9zaXRpb24pKQotICAgICAgICAgICAgICAgICAgICAubmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBhY2tlZFBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHBvc2l0aW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hldGhlciBhIHBhcnRpY3VsYXIgcG9zaXRpb24gaXMgb3V0IG9mIGJvdW5kcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBhY2tlZCBwb3NpdGlvbi4KLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgaXQncyBvdXQgb2YgYm91bmRzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc091dE9mQm91bmRzKGxvbmcgcGFja2VkUG9zaXRpb24pIHsKLSAgICAgICAgZmluYWwgaW50IHR5cGUgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25UeXBlKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9OVUxMKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYWNrZWRQb3NpdGlvbiBpcyBub3QgYSB2YWxpZCBwb3NpdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBncm91cCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKTsgCi0gICAgICAgIGlmIChncm91cCA+PSBtR3JvdXBzLnNpemUoKSB8fCBncm91cCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKTsgCi0gICAgICAgICAgICBpZiAoY2hpbGQgPj0gbUdyb3Vwcy5nZXQoZ3JvdXApLmNoaWxkcmVuLnNpemUoKSB8fCBjaGlsZCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGEgdmlldyBmb3IgdGhlIHBhY2tlZCBwb3NpdGlvbiwgcG9zc2libHkgcmV1c2luZyB0aGUgY29udmVydFZpZXcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBnZXQgYSB2aWV3IGZvci4KLSAgICAgKiBAcGFyYW0gY29udmVydFZpZXcgT3B0aW9uYWwgdmlldyB0byBjb252ZXJ0LgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIGZ1dHVyZSBwYXJlbnQuCi0gICAgICogQHJldHVybiBBIHZpZXcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBWaWV3IGdldFZpZXcobG9uZyBwYWNrZWRQb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICBpZiAoaXNPdXRPZkJvdW5kcyhwYWNrZWRQb3NpdGlvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBvc2l0aW9uIG91dCBvZiByYW5nZSBmb3IgYWRhcHRlciEiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgRXhwYW5kYWJsZUxpc3RWaWV3IGVsdiA9IGdldEV4cGFuZGFibGVMaXN0VmlldygpOwotICAgICAgICBmaW5hbCBpbnQgZmxQb3MgPSBlbHYuZ2V0RmxhdExpc3RQb3NpdGlvbihwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICAKLSAgICAgICAgaWYgKGNvbnZlcnRWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICgoVGV4dFZpZXcpIGNvbnZlcnRWaWV3KS5zZXRUZXh0KGdldFZhbHVlQXRQb3NpdGlvbihwYWNrZWRQb3NpdGlvbikpOwotICAgICAgICAgICAgY29udmVydFZpZXcuc2V0SWQoZmxQb3MpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGRlc2lyZWRIZWlnaHQgPSBnZXRIZWlnaHRGb3JQb3NpdGlvbihmbFBvcyk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVWaWV3KHBhY2tlZFBvc2l0aW9uLCBmbFBvcywgcGFyZW50LCBkZXNpcmVkSGVpZ2h0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdmlldyBmb3IgYSBncm91cCBvciBjaGlsZCBwb3NpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBhY2tlZCBwb3NpdGlvbiAoaGFzIHR5cGUsIGdyb3VwIHBvcywgYW5kIG9wdGlvbmFsbHkgY2hpbGQgcG9zKS4KLSAgICAgKiBAcGFyYW0gZmxQb3MgVGhlIGZsYXQgbGlzdCBwb3NpdGlvbiAodGhlIHBvc2l0aW9uIHRoYXQgdGhlIExpc3RWaWV3IGdvZXMgYnkpLgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB2aWV3LgotICAgICAqIEBwYXJhbSBkZXNpcmVkSGVpZ2h0IFRoZSBkZXNpcmVkIGhlaWdodC4KLSAgICAgKiBAcmV0dXJuIEEgdmlldy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmlldyBjcmVhdGVWaWV3KGxvbmcgcGFja2VkUG9zaXRpb24sIGludCBmbFBvcywgVmlld0dyb3VwIHBhcmVudCwgaW50IGRlc2lyZWRIZWlnaHQpIHsKLSAgICAgICAgVGV4dFZpZXcgcmVzdWx0ID0gbmV3IFRleHRWaWV3KHBhcmVudC5nZXRDb250ZXh0KCkpOwotICAgICAgICByZXN1bHQuc2V0SGVpZ2h0KGRlc2lyZWRIZWlnaHQpOwotICAgICAgICByZXN1bHQuc2V0VGV4dChnZXRWYWx1ZUF0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pKTsKLSAgICAgICAgZmluYWwgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IG5ldyBBYnNMaXN0Vmlldy5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotICAgICAgICByZXN1bHQuc2V0TGF5b3V0UGFyYW1zKGxwKTsKLSAgICAgICAgcmVzdWx0LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwpOwotICAgICAgICByZXN1bHQuc2V0UGFkZGluZygzNiwgMCwgMCwgMCk7Ci0gICAgICAgIHJlc3VsdC5zZXRJZChmbFBvcyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBncm91cCBpbmRleCBjb250YWluaW5nIGVpdGhlciB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9yIGF0Ci0gICAgICogbGVhc3Qgb25lIGNoaWxkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBudW1DaGlsZHJlbiBUaGUgZ3JvdXAgbXVzdCBoYXZlIHRoaXMgYW1vdW50LCBvciAtMSBpZiB1c2luZwotICAgICAqICAgICAgICAgICAgYXRMZWFzdE9uZUNoaWxkLgotICAgICAqIEBwYXJhbSBhdExlYXN0T25lQ2hpbGQgVGhlIGdyb3VwIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY2hpbGQsIG9yIGZhbHNlCi0gICAgICogICAgICAgICAgICBpZiB1c2luZyBudW1DaGlsZHJlbi4KLSAgICAgKiBAcmV0dXJuIEEgZ3JvdXAgaW5kZXggd2l0aCB0aGUgcmVxdWlyZW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZmluZEdyb3VwV2l0aE51bUNoaWxkcmVuKGludCBudW1DaGlsZHJlbiwgYm9vbGVhbiBhdExlYXN0T25lQ2hpbGQpIHsKLSAgICAgICAgZmluYWwgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSBhZGFwdGVyLmdldEdyb3VwQ291bnQoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY3VyTnVtQ2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuQ291bnQoaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChudW1DaGlsZHJlbiA9PSBjdXJOdW1DaGlsZHJlbiB8fCBhdExlYXN0T25lQ2hpbGQgJiYgY3VyTnVtQ2hpbGRyZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8TXlHcm91cD4gZ2V0R3JvdXBzKCkgewotICAgICAgICByZXR1cm4gbUdyb3VwczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0QWRhcHRlciBnZXRBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbUFkYXB0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltcGxlIGV4cGFuZGFibGUgbGlzdCBhZGFwdGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBNeUFkYXB0ZXIgZXh0ZW5kcyBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRDaGlsZChpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUF0UG9zaXRpb24oRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRQb3NpdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0Q2hpbGRJZChpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChncm91cFBvc2l0aW9uKS5jaGlsZHJlbi5nZXQoY2hpbGRQb3NpdGlvbikuaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENoaWxkcmVuQ291bnQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChncm91cFBvc2l0aW9uKS5jaGlsZHJlbi5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRDaGlsZFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uLCBib29sZWFuIGlzTGFzdENoaWxkLAotICAgICAgICAgICAgICAgIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWaWV3KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zaXRpb24pLCBjb252ZXJ0VmlldywgcGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0R3JvdXAoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUF0UG9zaXRpb24oRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yR3JvdXAoZ3JvdXBQb3NpdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRHcm91cENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0R3JvdXBJZChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KGdyb3VwUG9zaXRpb24pLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpZXcgZ2V0R3JvdXBWaWV3KGludCBncm91cFBvc2l0aW9uLCBib29sZWFuIGlzRXhwYW5kZWQsIFZpZXcgY29udmVydFZpZXcsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFZpZXcoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yR3JvdXAoZ3JvdXBQb3NpdGlvbiksCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRWaWV3LCBwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGlsZFNlbGVjdGFibGUoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlHcm91cCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgbU5leHRJZCA9IDEwMDA7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgbG9uZyBpZCA9IG1OZXh0SWQrKzsKLSAgICAgICAgTGlzdDxNeUNoaWxkPiBjaGlsZHJlbjsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBNeUdyb3VwKGludCBudW1DaGlsZHJlbikgewotICAgICAgICAgICAgbmFtZSA9ICJHcm91cCAiICsgaWQ7Ci0gICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8TXlDaGlsZD4obnVtQ2hpbGRyZW4pOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKG5ldyBNeUNoaWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDaGlsZCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgbU5leHRJZCA9IDIwMDA7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgbG9uZyBpZCA9IG1OZXh0SWQrKzsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBNeUNoaWxkKCkgewotICAgICAgICAgICAgbmFtZSA9ICJDaGlsZCAiICsgaWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdChQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIGluaXQoKEV4cGFuZGFibGVQYXJhbXMpIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBMaXN0U2NlbmFyaW8jaW5pdAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXQoRXhwYW5kYWJsZVBhcmFtcyBwYXJhbXMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDkzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25SZWFkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBKc29uUmVhZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLCB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEVtcHR5QXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIltdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRGYWxzZShyZWFkZXIuaGFzTmV4dCgpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigKKyAgICAgICAgICAgICAgICAie1wiYVwiOiBcImFuZHJvaWRcIiwgXCJiXCI6IFwiYmFuYW5hXCJ9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhbmFuYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEVtcHR5T2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7fSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlYWRlci5oYXNOZXh0KCkpOworICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigKKyAgICAgICAgICAgICAgICAie1wiYVwiOiB7IFwiY1wiOiBbXSwgXCJkXCI6IFt0cnVlLCB0cnVlLCB7fV0gfSwgXCJiXCI6IFwiYmFuYW5hXCJ9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICByZWFkZXIuc2tpcFZhbHVlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLnNraXBWYWx1ZSgpOworICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIntcbiIgKworICAgICAgICAgICAgICAgICIgICBcImhlbGxvXCI6IHRydWUsXG4iICsKKyAgICAgICAgICAgICAgICAiICAgXCJmb29cIjogW1wid29ybGRcIl1cbiIgKworICAgICAgICAgICAgICAgICJ9IjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndvcmxkIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCIiKSkuYmVnaW5BcnJheSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCIiKSkuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb1RvcExldmVsT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInRydWUiKSkubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyYWN0ZXJVbmVzY2FwaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiW1wiYVwiLCIKKyAgICAgICAgICAgICAgICArICJcImFcXFwiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIjpcIiwiCisgICAgICAgICAgICAgICAgKyAiXCIsXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxmXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxuXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxyXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx0XCIsIgorICAgICAgICAgICAgICAgICsgIlwiIFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXFxcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJ7XCIsIgorICAgICAgICAgICAgICAgICsgIlwifVwiLCIKKyAgICAgICAgICAgICAgICArICJcIltcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJdXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MDAwMFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMTlcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUyMEFDXCIiCisgICAgICAgICAgICAgICAgKyAiXSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFcIiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlwiIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiOiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiwiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcYiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxmIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXG4iLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcciIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx0IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiICIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxcIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIn0iLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlwwIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHUwMDE5IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHUyMEFDIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludGVnZXJzV2l0aEZyYWN0aW9uYWxQYXJ0U3BlY2lmaWVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbMS4wLDEuMCwxLjBdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIlstMC4wLCIKKyAgICAgICAgICAgICAgICArICIxLjAsIgorICAgICAgICAgICAgICAgICsgIjEuNzk3NjkzMTM0ODYyMzE1N0UzMDgsIgorICAgICAgICAgICAgICAgICsgIjQuOUUtMzI0LCIKKyAgICAgICAgICAgICAgICArICIwLjAsIgorICAgICAgICAgICAgICAgICsgIi0wLjUsIgorICAgICAgICAgICAgICAgICsgIjIuMjI1MDczODU4NTA3MjAxNEUtMzA4LCIKKyAgICAgICAgICAgICAgICArICIzLjE0MTU5MjY1MzU4OTc5MywiCisgICAgICAgICAgICAgICAgKyAiMi43MTgyODE4Mjg0NTkwNDVdIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0wLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuNzk3NjkzMTM0ODYyMzE1N0UzMDgsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNC45RS0zMjQsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0wLjUsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMi4yMjUwNzM4NTg1MDcyMDE0RS0zMDgsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OTMsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMi43MTgyODE4Mjg0NTkwNDUsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25GaW5pdGVEb3VibGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiW05hTl0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHREb3VibGUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbMCwwLDAsIgorICAgICAgICAgICAgICAgICsgIjEsMSwxLCIKKyAgICAgICAgICAgICAgICArICItMSwtMSwtMSwiCisgICAgICAgICAgICAgICAgKyAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIgorICAgICAgICAgICAgICAgICsgIjkyMjMzNzIwMzY4NTQ3NzU4MDddIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIubmV4dEludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVhZGVyLm5leHRJbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTFMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgcmVhZGVyLm5leHRJbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0SW50KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1JTl9WQUxVRSwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcuTUFYX1ZBTFVFLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGZhaWxzIGJlY2F1c2UgdGhlcmUncyBubyBkb3VibGUgZm9yIDkyMjMzNzIwMzY4NTQ3NzU4MDYsIGFuZAorICAgICAqIG91ciBsb25nIHBhcnNpbmcgdXNlcyBEb3VibGUucGFyc2VEb3VibGUoKSBmb3IgZnJhY3Rpb25hbCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhpZ2hQcmVjaXNpb25Mb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiWzkyMjMzNzIwMzY4NTQ3NzU4MDYuMDAwXSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA2TCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyV2l0aE9jdGFsUHJlZml4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiWzAxXSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEludCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRMb25nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dERvdWJsZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIjAxIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSxmYWxzZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZENhc2VMaXRlcmFscygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW1RydWUsVHJ1RSxGYWxzZSxGQUxTRSxOVUxMLG51bExdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1ZhbHVlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6fSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlbWF0dXJlRW5kT2ZJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWUsIikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlbWF0dXJlbHlDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6W119IikpOworICAgICAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjpbXX0iKSk7CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlfSIpKTsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICByZWFkZXIucGVlaygpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dEZhaWx1cmVzRG9Ob3RBZHZhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdOdWxsSXNOb3ROdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbXCJudWxsXCJdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxMaXRlcmFsSXNOb3RBU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIltudWxsXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdE5hbWVWYWx1ZVNlcGFyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPXRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI9PnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudE5hbWVWYWx1ZVNlcGFyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPXRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI9PnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0Q29tbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsvLyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbIyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLyogY29tbWVudCAqLyB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRDb21tZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWy8vIGNvbW1lbnQgXG4gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsjIGNvbW1lbnQgXG4gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsvKiBjb21tZW50ICovIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0VW5xdW90ZWROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie2E6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFVucXVvdGVkTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInthOnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0U2luZ2xlUXVvdGVkTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInsnYSc6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNpbmdsZVF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7J2EnOnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0VW5xdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbYV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRVbnF1b3RlZFN0cmluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlthXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTaW5nbGVRdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbJ2EnXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNpbmdsZVF1b3RlZFN0cmluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsnYSddIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFNlbWljb2xvbkRlbGltaXRlZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZTt0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNlbWljb2xvbkRlbGltaXRlZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZTt0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFNlbWljb2xvbkRlbGltaXRlZE5hbWVWYWx1ZVBhaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlO1wiYlwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50U2VtaWNvbG9uRGVsaW1pdGVkTmFtZVZhbHVlUGFpcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWU7XCJiXCI6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVubmVjZXNzYXJ5QXJyYXlTZXBhcmF0b3JzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSwsdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlssdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlssXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRVbm5lY2Vzc2FyeUFycmF5U2VwYXJhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsLHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlssdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLF0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvbldyaXRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvbldyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTg0MDIzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uV3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvbldyaXRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdUb3BMZXZlbFR5cGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZSgiYSIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUd29OYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVdpdGhvdXRWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZVdpdGhvdXROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZSh0cnVlKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUb3BMZXZlbFZhbHVlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpLmVuZEFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTmVzdGluZ09iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZE5lc3RpbmdBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5uYW1lKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxTdHJpbmdWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUobnVsbCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygie1wiYVwiOm51bGx9Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25GaW5pdGVEb3VibGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLnZhbHVlKERvdWJsZS5OYU4pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoLTAuMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMS4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTUFYX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTUlOX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgwLjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKC0wLjUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKERvdWJsZS5NSU5fTk9STUFMKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShNYXRoLlBJKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShNYXRoLkUpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbLTAuMCwiCisgICAgICAgICAgICAgICAgKyAiMS4wLCIKKyAgICAgICAgICAgICAgICArICIxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCIKKyAgICAgICAgICAgICAgICArICI0LjlFLTMyNCwiCisgICAgICAgICAgICAgICAgKyAiMC4wLCIKKyAgICAgICAgICAgICAgICArICItMC41LCIKKyAgICAgICAgICAgICAgICArICIyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOCwiCisgICAgICAgICAgICAgICAgKyAiMy4xNDE1OTI2NTM1ODk3OTMsIgorICAgICAgICAgICAgICAgICsgIjIuNzE4MjgxODI4NDU5MDQ1XSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgwKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgxKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgtMSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTG9uZy5NSU5fVkFMVUUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzAsIgorICAgICAgICAgICAgICAgICsgIjEsIgorICAgICAgICAgICAgICAgICsgIi0xLCIKKyAgICAgICAgICAgICAgICArICItOTIyMzM3MjAzNjg1NDc3NTgwOCwiCisgICAgICAgICAgICAgICAgKyAiOTIyMzM3MjAzNjg1NDc3NTgwN10iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW3RydWUsZmFsc2VdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxscygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLm51bGxWYWx1ZSgpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW251bGxdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImEiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiYVwiIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlwiIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIjoiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiLCIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcYiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcZiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcbiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcciIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcdCIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCIgIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlxcIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoInsiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgifSIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJbIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIl0iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXDAiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHUwMDE5Iik7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbXCJhXCIsIgorICAgICAgICAgICAgICAgICsgIlwiYVxcXCJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXFwiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiOlwiLCIKKyAgICAgICAgICAgICAgICArICJcIixcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXGJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXGZcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXG5cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHRcIiwiCisgICAgICAgICAgICAgICAgKyAiXCIgXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxcXFwiLCIKKyAgICAgICAgICAgICAgICArICJcIntcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJ9XCIsIgorICAgICAgICAgICAgICAgICsgIlwiW1wiLCIKKyAgICAgICAgICAgICAgICArICJcIl1cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUwMDAwXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MDAxOVwiXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW10iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5T2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInt9Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPYmplY3RzSW5BcnJheXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSg1KTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJiIikudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYyIpLnZhbHVlKDYpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImQiKS52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlt7XCJhXCI6NSxcImJcIjpmYWxzZX0sIgorICAgICAgICAgICAgICAgICsgIntcImNcIjo2LFwiZFwiOnRydWV9XSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlzSW5PYmplY3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg2KTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImFcIjpbNSxmYWxzZV0sIgorICAgICAgICAgICAgICAgICsgIlwiYlwiOls2LHRydWVdfSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVlcE5lc3RpbmdBcnJheXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiW1tbW1tbW1tbW1tbW1tbW1tbW1tdXV1dXV1dXV1dXV1dXV1dXV1dXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVlcE5lc3RpbmdPYmplY3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgfQorICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjoiCisgICAgICAgICAgICAgICAgKyAie1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOnsiCisgICAgICAgICAgICAgICAgKyAifX19fX19fX19fX19fX19fX19fX19Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIC8vIEpzb25Xcml0ZXIgZG9lc24ndCBhdHRlbXB0IHRvIGRldGVjdCBkdXBsaWNhdGUgbmFtZXMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6dHJ1ZSxcImFcIjpmYWxzZX0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZXR0eVByaW50T2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5zZXRJbmRlbnQoIiAgICIpOworCisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJjIikudmFsdWUoNS4wKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJlIikubnVsbFZhbHVlKCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZiIpLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg2LjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDcuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJnIikuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJoIikudmFsdWUoOC4wKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJpIikudmFsdWUoOS4wKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAie1xuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiYVwiOiB0cnVlLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiYlwiOiBmYWxzZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImNcIjogNS4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiZVwiOiBudWxsLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiZlwiOiBbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgNi4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDcuMFxuIgorICAgICAgICAgICAgICAgICsgIiAgIF0sXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJnXCI6IHtcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImhcIjogOC4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIFwiaVwiOiA5LjBcbiIKKyAgICAgICAgICAgICAgICArICIgICB9XG4iCisgICAgICAgICAgICAgICAgKyAifSI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV0dHlQcmludEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5zZXRJbmRlbnQoIiAgICIpOworCisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg1LjApOworICAgICAgICBqc29uV3JpdGVyLm51bGxWYWx1ZSgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKDYuMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpLnZhbHVlKDcuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDguMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoOS4wKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIltcbiIKKyAgICAgICAgICAgICAgICArICIgICB0cnVlLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIGZhbHNlLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIDUuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBudWxsLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIHtcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImFcIjogNi4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIFwiYlwiOiA3LjBcbiIKKyAgICAgICAgICAgICAgICArICIgICB9LFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFtcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICA4LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgOS4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXVxuIgorICAgICAgICAgICAgICAgICsgIl0iOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YQppbmRleCBiOTBjOTdiLi5hYWQzZmUxIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEKQEAgLTY4LDYgKzY4LDEzIEBACiAgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoInhuLS1mc3F1MDBhLnhuLS0wendtNTZkIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKIAorICAgICAgICAvLyBVcmwgZm9yIHRlc3RpbmcgdG9wIGxldmVsIEFyYWJpYyBjb3VudHJ5IGNvZGUgZG9tYWluIGluIFB1bnljb2RlOgorICAgICAgICAvLyAgIGh0dHA6Ly94bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMvYXIvZGVmYXVsdC5hc3B4CisgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoImh0dHA6Ly94bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMvYXIvZGVmYXVsdC5hc3B4IikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKKyAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigieG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweCIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CisKICAgICAgICAgLy8gSW50ZXJuYXRpb25hbGl6ZWQgVVJMLgogICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJodHRwOi8vXHVENjA0XHVBRTA4XHVDNjAxXHVDMjE4XHVDOTlELmtyIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKQEAgLTEwOSw3ICsxMTYsNyBAQAogICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigibWFpbC5leGFtcGxlLmNvbSIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAKLSAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigiZ29vZ2xlLm1lIikubWF0Y2hlcygpOworICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigiZ29vZ2xlLm1lIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBkb21haW4iLCB0KTsKIAogICAgICAgICAvLyBJbnRlcm5hdGlvbmFsaXplZCBkb21haW5zLgpAQCAtMTE4LDYgKzEyNSwxNCBAQAogCiAgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJfXysmNDIueGVyIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRGYWxzZSgiSW52YWxpZCBkb21haW4iLCB0KTsKKworICAgICAgICAvLyBPYnNvbGV0ZSBkb21haW4gLnl1CisgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJ0ZXN0Lnl1IikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRGYWxzZSgiT2Jzb2xldGUgY291bnRyeSBjb2RlIHRvcCBsZXZlbCBkb21haW4iLCB0KTsKKworICAgICAgICAvLyBUZXN0aW5nIHRvcCBsZXZlbCBBcmFiaWMgY291bnRyeSBjb2RlIGRvbWFpbiBpbiBQdW55Y29kZToKKyAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoInhuLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYyIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAgICAgfQogCiAgICAgQFNtYWxsVGVzdApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3RvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5ZDlmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw5NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CisKKy8qKgorICogVGhpcyBpcyBhIHRlc3QgZm9yIHRoZSBiZWhhdmlvciBvZiB0aGUge0BsaW5rIEFjY2Vzc2liaWxpdHlJbmplY3Rvcn0KKyAqIHdoaWNoIGlzIHVzZWQgYnkge0BsaW5rIFdlYlZpZXd9IHRvIHByb3ZpZGUgYmFzaWMgYWNjZXNzaWJpbGl0eSBzdXBwb3J0CisgKiBpbiBjYXNlIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQuCisgKiA8L3A+CisgKiBOb3RlOiBUaGlzIHRlc3Qgd29ya3MgYWdhaW5zdCB0aGUgZ2VuZXJhdGVkIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9cworICogICAgICAgdG8gc28gaXQgYWxzbyBjaGVja3MgaWYgdGhlIHRlc3QgZm9yIGFubm91bmNpbmcgbmF2aWdhdGlvbiBheGlzIGFuZAorICogICAgICAgc3RhdHVzIG1lc3NhZ2VzIGFzIGFwcHJvcHJpYXRlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eUluamVjdG9yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICAvKiogVGhlIHRpbWVvdXQgdG8gd2FpdCBmb3IgdGhlIGV4cGVjdGVkIHNlbGVjdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfV0FJVF9GT1JfU0VMRUNUSU9OX1NUUklORyA9IDEwMDA7CisKKyAgICAvKiogVGhlIHRpbWVvdXQgdG8gd2FpdCBmb3IgYWNjZXNzaWJpbGl0eSBhbmQgdGhlIG1vY2sgc2VydmljZSB0byBiZSBlbmFibGVkLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9FTkFCTEVfQUNDRVNTSUJJTElUWV9BTkRfTU9DS19TRVJWSUNFID0gNTAwOworCisgICAgLyoqIFRoZSBjb3VudCBvZiB0ZXN0cyB0byBkZXRlY3Qgd2hlbiB0byBzaHV0IGRvd24gdGhlIHNlcnZpY2UuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfQ0FTRV9DT1VOVCA9IDg7CisKKyAgICAvKiogVGhlIG1ldGEgc3RhdGUgZm9yIHByZXNzZWQgbGVmdCBBTFQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEFfU1RBVEVfQUxUX0xFRlRfT04gPSBLZXlFdmVudC5NRVRBX0FMVF9PTgorICAgICAgICAgICAgfCBLZXlFdmVudC5NRVRBX0FMVF9MRUZUX09OOworCisgICAgLyoqIFRoZSB2YWx1ZSBmb3Igbm90IHNwZWNpZmllZCBzZWxlY3Rpb24gc3RyaW5nIHNpbmNlIG51bGwgaXMgYSB2YWxpZCB2YWx1ZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OX1NUUklOR19VTktOT1dOID0gIlVua25vd24iOworCisgICAgLyoqIExvY2sgZm9yIGxvY2tpbmcgdGhlIHRlc3QuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNUZXN0TG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIC8qKiBIYW5kbGUgdG8gdGhlIHRlc3QgZm9yIHVzZSBieSB0aGUgbW9jayBzZXJ2aWNlLiAqLworICAgIHByaXZhdGUgc3RhdGljIEFjY2Vzc2liaWxpdHlJbmplY3RvclRlc3Qgc0luc3RhbmNlOworCisgICAgLyoqIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIHJlYWR5IHRvIHJlY2VpdmUgZXZlbnRzLiAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0lzQWNjZXNzaWJpbGl0eVNlcnZpY2VSZWFkeTsKKworICAgIC8qKiBUaGUgY291bnQgb2YgZXhlY3V0ZWQgdGVzdHMgdG8gZGV0ZWN0IHdoZW4gdG8gdG9nZ2xlIGFjY2Vzc2liaWxpdHkgYW5kIHRoZSBzZXJ2aWNlLiAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzRXhlY3V0ZWRUZXN0Q291bnQ7CisKKyAgICAvKiogV29ya2VyIHRocmVhZCB3aXRoIGEgaGFuZGxlciB0byBwZXJmb3JtIG5vbiB0ZXN0IHRocmVhZCBwcm9jZXNzaW5nLiAqLworICAgIHByaXZhdGUgV29ya2VyIG1Xb3JrZXI7CisKKyAgICAvKiogSGFuZGxlIHRvIHRoZSB7QGxpbmsgV2ViVmlld30gdG8gbG9hZCBkYXRhIGluLiAqLworICAgIHByaXZhdGUgV2ViVmlldyBtV2ViVmlldzsKKworICAgIC8qKiBUaGUgcmVjZWl2ZWQgc2VsZWN0aW9uIHN0cmluZyBmb3IgYXNzZXJ0aW9uIGNoZWNraW5nLiAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzUmVjZWl2ZWRTZWxlY3Rpb25TdHJpbmcgPSBTRUxFQ1RJT05fU1RSSU5HX1VOS05PV047CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtV29ya2VyID0gbmV3IFdvcmtlcigpOworICAgICAgICBzSW5zdGFuY2UgPSB0aGlzOworICAgICAgICBpZiAoc0V4ZWN1dGVkVGVzdENvdW50ID09IDApIHsKKyAgICAgICAgICAgIC8vIHVudGlsIEpVbml0NCBjb21lcyB0byBwbGF5IHdpdGggQEJlZm9yZVRlc3QKKyAgICAgICAgICAgIGRpc2FibGVBY2Nlc3NpYmlsaXR5QW5kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCk7CisgICAgICAgICAgICBlbmFibGVBY2Nlc3NpYmlsaXR5QW5kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobVdvcmtlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtV29ya2VyLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc0V4ZWN1dGVkVGVzdENvdW50ID09IFRFU1RfQ0FTRV9DT1VOVCkgeworICAgICAgICAgICAgLy8gdW50aWwgSlVuaXQ0IGNvbWVzIHRvIHBsYXkgd2l0aCBAQWZ0ZXJUZXN0CisgICAgICAgICAgICBkaXNhYmxlQWNjZXNzaWJpbGl0eUFuZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbmF2aWdhdGlvbiBieSBjaGFyYWN0ZXIuCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uQnlDaGFyYWN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYSBiaXQgdWdseSBidXQgaGVscHMgZGV0ZWN0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGFsbCB0ZXN0cyBzbyBhY2Nlc3NpYmlsaXR5CisgICAgICAgIC8vIGFuZCB0aGUgbW9jayBzZXJ2aWNlIGFyZSBub3QgdG9nZ2xlZCBvbiBldmVyeSB0ZXN0IChleHBlbnNpdmUpCisgICAgICAgIHNFeGVjdXRlZFRlc3RDb3VudCsrOworCisgICAgICAgIFN0cmluZyBodG1sID0KKyAgICAgICAgICAgICI8aHRtbD4iICsKKyAgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICAiPGJvZHk+IiArCisgICAgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgICAgICJhIDxiPmI8L2I+IGMiICsKKyAgICAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICAgICJkIiArCisgICAgICAgICAgICAgICAgICAgICAiPGlucHV0PmU8L2lucHV0PiIgKworICAgICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAiPC9ib2R5PiIgKworICAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIxIik7IC8vIGV4cGVjdCB0aGUgd29yZCBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjAiKTsgLy8gZXhwZWN0IHRoZSBjaGFyYWN0ZXIgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImEiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxiPmI8L2I+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImMiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZm91cnRoIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImQiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlmdGggY2hhcmFjdGVyCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiZSIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCBjaGFyYWN0ZXIgKHJldmVyc2UpCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImQiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgY2hhcmFjdGVyCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImMiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Yj5iPC9iPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiYSIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgY2hhcmFjdGVyIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxiPmI8L2I+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbmF2aWdhdGlvbiBieSB3b3JkLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGlvbkJ5V29yZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhIGJpdCB1Z2x5IGJ1dCBoZWxwcyBkZXRlY3QgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHRlc3RzIHNvIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgLy8gYW5kIHRoZSBtb2NrIHNlcnZpY2UgYXJlIG5vdCB0b2dnbGVkIG9uIGV2ZXJ5IHRlc3QgKGV4cGVuc2l2ZSkKKyAgICAgICAgc0V4ZWN1dGVkVGVzdENvdW50Kys7CisKKyAgICAgICAgU3RyaW5nIGh0bWwgPQorICAgICAgICAgICAgIjxodG1sPiIgKworICAgICAgICAgICAgICAgIjxoZWFkPiIgKworICAgICAgICAgICAgICAgIjwvaGVhZD4iICsKKyAgICAgICAgICAgICAgICI8Ym9keT4iICsKKyAgICAgICAgICAgICAgICAgICAiPHA+IiArCisgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgPGI+YTwvYj4gc2VudGVuY2UiICsKKyAgICAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICAgICIgc2NhdHRlcmVkICIgKworICAgICAgICAgICAgICAgICAgICAgIjxpbnB1dD5hbGw8L2lucHV0PiIgKworICAgICAgICAgICAgICAgICAgICAgIiBvdmVyICIgKworICAgICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgICAgIjxkaXY+IiArCisgICAgICAgICAgICAgICAgICAgICAiPGJ1dHRvbj50aGUgcGxhY2UuPC9idXR0b24+IiArCisgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIgKworICAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICAiPC9odG1sPiI7CisKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gY3JlYXRlV2ViVmV3V2l0aEh0bWwoaHRtbCk7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMSIpOyAvLyBleHBlY3QgdGhlIHdvcmQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiaXMiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxiPmE8L2I+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygic2VudGVuY2UiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlmdGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoInNjYXR0ZXJlZCIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzaXh0aCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiYWxsIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNldmVudGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIm92ZXIiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZWlnaHQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoInRoZSIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBuaW50aCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygicGxhY2UiKTsKKworICAgICAgICAvLyBOT1RFOiBXZWJLaXQgc2VsZWN0aW9uIHJldHVybnMgdGhlIGRvdCBhcyBhIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIuIik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIHBhc3QgdGhlIGxhc3Qgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGxhc3Qgd29yZCAocmV2ZXJzZSkKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygicGxhY2UiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZWlnaHQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJ0aGUiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2V2ZW50aCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIm92ZXIiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2l4dGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJhbGwiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlmdGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJzY2F0dGVyZWQiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZm91cnRoIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygic2VudGVuY2UiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Yj5hPC9iPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJpcyIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMiKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gYmVmb3JlIHRoZSBmaXJzdCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCB3b3JkIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImlzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbmF2aWdhdGlvbiBieSBzZW50ZW5jZS4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRpb25CeVNlbnRlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGEgYml0IHVnbHkgYnV0IGhlbHBzIGRldGVjdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhbGwgdGVzdHMgc28gYWNjZXNzaWJpbGl0eQorICAgICAgICAvLyBhbmQgdGhlIG1vY2sgc2VydmljZSBhcmUgbm90IHRvZ2dsZWQgb24gZXZlcnkgdGVzdCAoZXhwZW5zaXZlKQorICAgICAgICBzRXhlY3V0ZWRUZXN0Q291bnQrKzsKKworICAgICAgICBTdHJpbmcgaHRtbCA9CisgICAgICAgICAgICAiPGh0bWw+IiArCisgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgIjwvaGVhZD4iICsKKyAgICAgICAgICAgICAgIjxib2R5PiIgKworICAgICAgICAgICAgICAgICI8ZGl2PiIgKworICAgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyB0aGUgZmlyc3Qgc2VudGVuY2Ugb2YgdGhlIGZpcnN0IHBhcmFncmFwaCBhbmQgaGFzIGFuIDxiPmlubGluZSBib2xkIHRhZzwvYj4uIiArCisgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHRoZSBzZWNvbmQgc2VudGVuY2Ugb2YgdGhlIGZpcnN0IHBhcmFncmFwaC4iICsKKyAgICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgICAiPGgxPlRoaXMgaXMgYSBoZWFkaW5nPC9oMT4iICsKKyAgICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgdGhlIGZpcnN0IHNlbnRlbmNlIG9mIHRoZSBzZWNvbmQgcGFyYWdyYXBoLiIgKworICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyB0aGUgc2Vjb25kIHNlbnRlbmNlIG9mIHRoZSBzZWNvbmQgcGFyYWdyYXBoLiIgKworICAgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPC9kaXY+IiArCisgICAgICAgICAgICAgICI8L2JvZHk+IiArCisgICAgICAgICAgICAiPC9odG1sPiI7CisKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gY3JlYXRlV2ViVmV3V2l0aEh0bWwoaHRtbCk7CisKKyAgICAgICAgLy8gU2VudGVuY2UgYXhpcyBpcyB0aGUgZGVmYXVsdAorCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgdGhlIGZpcnN0IHNlbnRlbmNlIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGggYW5kIGhhcyBhbiAiCisgICAgICAgICAgICAgICAgKyAiPGI+aW5saW5lIGJvbGQgdGFnPC9iPi4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyB0aGUgc2Vjb25kIHNlbnRlbmNlIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGguIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyBhIGhlYWRpbmciKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZm91cnRoIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyB0aGUgZmlyc3Qgc2VudGVuY2Ugb2YgdGhlIHNlY29uZCBwYXJhZ3JhcGguIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpZnRoIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyB0aGUgc2Vjb25kIHNlbnRlbmNlIG9mIHRoZSBzZWNvbmQgcGFyYWdyYXBoLiIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBwYXN0IHRoZSBsYXN0IHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZm91cnRoIHNlbnRlbmNlIChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIGlzIHRoZSBmaXJzdCBzZW50ZW5jZSBvZiB0aGUgc2Vjb25kIHBhcmFncmFwaC4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgc2VudGVuY2UKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyBhIGhlYWRpbmciKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgdGhlIHNlY29uZCBzZW50ZW5jZSBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoLiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIGlzIHRoZSBmaXJzdCBzZW50ZW5jZSBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoIGFuZCBoYXMgYW4gIgorICAgICAgICAgICAgICAgICsgIjxiPmlubGluZSBib2xkIHRhZzwvYj4uIik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIGJlZm9yZSB0aGUgZmlyc3Qgc2VudGVuY2UKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIHNlbnRlbmNlIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgdGhlIHNlY29uZCBzZW50ZW5jZSBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgaGVhZGluZy4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRpb25CeUhlYWRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYSBiaXQgdWdseSBidXQgaGVscHMgZGV0ZWN0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGFsbCB0ZXN0cyBzbyBhY2Nlc3NpYmlsaXR5CisgICAgICAgIC8vIGFuZCB0aGUgbW9jayBzZXJ2aWNlIGFyZSBub3QgdG9nZ2xlZCBvbiBldmVyeSB0ZXN0IChleHBlbnNpdmUpCisgICAgICAgIHNFeGVjdXRlZFRlc3RDb3VudCsrOworCisgICAgICAgIFN0cmluZyBodG1sID0KKyAgICAgICAgICAgICI8IURPQ1RZUEUgaHRtbD4iICsKKyAgICAgICAgICAgICI8aHRtbD4iICsKKyAgICAgICAgICAgICAgIjxoZWFkPiIgKworICAgICAgICAgICAgICAiPC9oZWFkPiIgKworICAgICAgICAgICAgICAiPGJvZHk+IiArCisgICAgICAgICAgICAgICAgIjxoMT5IZWFkaW5nIG9uZTwvaDE+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSB0ZXh0IiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPGgyPkhlYWRpbmcgdHdvPC9oMj4iICsKKyAgICAgICAgICAgICAgICAiPHA+IiArCisgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBzb21lIHRleHQiICsKKyAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICI8aDM+SGVhZGluZyB0aHJlZTwvaDM+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSB0ZXh0IiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPGg0PkhlYWRpbmcgZm91cjwvaDQ+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSB0ZXh0IiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPGg1PkhlYWRpbmcgZml2ZTwvaDU+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSB0ZXh0IiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPGg2PkhlYWRpbmcgc2l4PC9oNj4iICsKKyAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMyIpOyAvLyBleHBlY3QgdGhlIGhlYWRpbmcgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDE+SGVhZGluZyBvbmU8L2gxPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoMj5IZWFkaW5nIHR3bzwvaDI+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDM+SGVhZGluZyB0aHJlZTwvaDM+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGg0PkhlYWRpbmcgZm91cjwvaDQ+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpZnRoIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDU+SGVhZGluZyBmaXZlPC9oNT4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2l4dGggaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoNj5IZWFkaW5nIHNpeDwvaDY+Iik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIHBhc3QgdGhlIGxhc3QgaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpZnRoIGhlYWRpbmcgKHJldmVyc2UpCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoNT5IZWFkaW5nIGZpdmU8L2g1PiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmb3VydGggaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDQ+SGVhZGluZyBmb3VyPC9oND4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDM+SGVhZGluZyB0aHJlZTwvaDM+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoMj5IZWFkaW5nIHR3bzwvaDI+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGgxPkhlYWRpbmcgb25lPC9oMT4iKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gYmVmb3JlIHRoZSBmaXJzdCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCBoZWFkaW5nIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoMj5IZWFkaW5nIHR3bzwvaDI+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbmF2aWdhdGlvbiBieSBzaWJsaW5nLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGlvbkJ5U2liaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGEgYml0IHVnbHkgYnV0IGhlbHBzIGRldGVjdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhbGwgdGVzdHMgc28gYWNjZXNzaWJpbGl0eQorICAgICAgICAvLyBhbmQgdGhlIG1vY2sgc2VydmljZSBhcmUgbm90IHRvZ2dsZWQgb24gZXZlcnkgdGVzdCAoZXhwZW5zaXZlKQorICAgICAgICBzRXhlY3V0ZWRUZXN0Q291bnQrKzsKKworICAgICAgICBTdHJpbmcgaHRtbCA9CisgICAgICAgICAgICAiPCFET0NUWVBFIGh0bWw+IiArCisgICAgICAgICAgICAiPGh0bWw+IiArCisgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgIjwvaGVhZD4iICsKKyAgICAgICAgICAgICAgIjxib2R5PiIgKworICAgICAgICAgICAgICAgICI8aDE+SGVhZGluZyBvbmU8L2gxPiIgKworICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHNvbWUgdGV4dCIgKworICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgIjxkaXY+IiArCisgICAgICAgICAgICAgICAgICAiPGJ1dHRvbj5JbnB1dDwvYnV0dG9uPiIgKworICAgICAgICAgICAgICAgICI8L2Rpdj4iICsKKyAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMyIpOyAvLyBleHBlY3QgdGhlIGhlYWRpbmcgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBzaWJsaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjQiKTsgLy8gZXhwZWN0IHRoZSBzaWJsaW5nIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gcGFyZW50L2ZpcnN0IGNoaWxkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjUiKTsgLy8gZXhwZWN0IHRoZSBwYXJlbnQvZmlyc3QgY2hpbGQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBib2R5CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGgxPkhlYWRpbmcgb25lPC9oMT4iKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIHNpYmxpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI0Iik7IC8vIGV4cGVjdCB0aGUgc2libGluZyBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBnbyB0byB0aGUgbmV4dCBzaWJsaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPHA+VGhpcyBpcyBzb21lIHRleHQ8L3A+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIG5leHQgc2libGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxkaXY+PGJ1dHRvbj5JbnB1dDwvYnV0dG9uPjwvZGl2PiIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBwYXN0IHRoZSBsYXN0IHNpYmxpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBwcmV2aW91cyBzaWJsaW5nIChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8cD5UaGlzIGlzIHNvbWUgdGV4dDwvcD4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgcHJldmlvdXMgc2libGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDE+SGVhZGluZyBvbmU8L2gxPiIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBiZWZvcmUgdGhlIHByZXZpb3VzIHNpYmxpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgbmV4dCBzaWJsaW5nIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxwPlRoaXMgaXMgc29tZSB0ZXh0PC9wPiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgcGFyZW50L2ZpcnN0IGNoaWxkLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGlvbkJ5UGFyZW50Rmlyc3RDaGlsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhIGJpdCB1Z2x5IGJ1dCBoZWxwcyBkZXRlY3QgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHRlc3RzIHNvIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgLy8gYW5kIHRoZSBtb2NrIHNlcnZpY2UgYXJlIG5vdCB0b2dnbGVkIG9uIGV2ZXJ5IHRlc3QgKGV4cGVuc2l2ZSkKKyAgICAgICAgc0V4ZWN1dGVkVGVzdENvdW50Kys7CisKKyAgICAgICAgU3RyaW5nIGh0bWwgPQorICAgICAgICAgICAgIjwhRE9DVFlQRSBodG1sPiIgKworICAgICAgICAgICAgIjxodG1sPiIgKworICAgICAgICAgICAgICAiPGhlYWQ+IiArCisgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICI8Ym9keT4iICsKKyAgICAgICAgICAgICAgICAiPGRpdj4iICsKKyAgICAgICAgICAgICAgICAgICI8YnV0dG9uPklucHV0PC9idXR0b24+IiArCisgICAgICAgICAgICAgICAgIjwvZGl2PiIgKworICAgICAgICAgICAgICAiPC9ib2R5PiIgKworICAgICAgICAgICAgIjwvaHRtbD4iOworCisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IGNyZWF0ZVdlYlZld1dpdGhIdG1sKGh0bWwpOworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gZG9jdW1lbnQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI2Iik7IC8vIGV4cGVjdCB0aGUgZG9jdW1lbnQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBwYXJlbnQvZmlyc3QgY2hpbGQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI1Iik7IC8vIGV4cGVjdCB0aGUgcGFyZW50L2ZpcnN0IGNoaWxkIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBjaGlsZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxkaXY+PGJ1dHRvbj5JbnB1dDwvYnV0dG9uPjwvZGl2PiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBjaGlsZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxidXR0b24+SW5wdXQ8L2J1dHRvbj4iKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gdG8gdGhlIGZpcnN0IGNoaWxkIG9mIGEgbGVhZiBlbGVtZW50CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgcGFyZW50IChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8ZGl2PjxidXR0b24+SW5wdXQ8L2J1dHRvbj48L2Rpdj4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgcGFyZW50CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxib2R5PjxkaXY+PGJ1dHRvbj5JbnB1dDwvYnV0dG9uPjwvZGl2PjwvYm9keT4iKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gdG8gdGhlIGJvZHkgcGFyZW50CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGNoaWxkIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxkaXY+PGJ1dHRvbj5JbnB1dDwvYnV0dG9uPjwvZGl2PiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgZG9jdW1lbnQuCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uQnlEb2N1bWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhIGJpdCB1Z2x5IGJ1dCBoZWxwcyBkZXRlY3QgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHRlc3RzIHNvIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgLy8gYW5kIHRoZSBtb2NrIHNlcnZpY2UgYXJlIG5vdCB0b2dnbGVkIG9uIGV2ZXJ5IHRlc3QgKGV4cGVuc2l2ZSkKKyAgICAgICAgc0V4ZWN1dGVkVGVzdENvdW50Kys7CisKKyAgICAgICAgU3RyaW5nIGh0bWwgPQorICAgICAgICAgICAgIjwhRE9DVFlQRSBodG1sPiIgKworICAgICAgICAgICAgIjxodG1sPiIgKworICAgICAgICAgICAgICAiPGhlYWQ+IiArCisgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICI8Ym9keT4iICsKKyAgICAgICAgICAgICAgICAiPGJ1dHRvbj5DbGljazwvYnV0dG9uPiIgKworICAgICAgICAgICAgICAiPC9ib2R5PiIgKworICAgICAgICAgICAgIjwvaHRtbD4iOworCisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IGNyZWF0ZVdlYlZld1dpdGhIdG1sKGh0bWwpOworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gZG9jdW1lbnQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI2Iik7IC8vIGV4cGVjdCB0aGUgZG9jdW1lbnQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJDbGljayIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50IChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Ym9keT48YnV0dG9uPkNsaWNrPC9idXR0b24+PC9ib2R5PiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50IChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIkNsaWNrIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIHN5bmMgYmV0d2VlbiB0aGUgdGV4dCBuYXZpZ2F0aW9uIGFuZCBuYXZpZ2F0aW9uIGJ5IERPTSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmNCZXR3ZWVuVGV4dEFuZERvbU5vZGVOYXZpZ2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGEgYml0IHVnbHkgYnV0IGhlbHBzIGRldGVjdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhbGwgdGVzdHMgc28gYWNjZXNzaWJpbGl0eQorICAgICAgICAvLyBhbmQgdGhlIG1vY2sgc2VydmljZSBhcmUgbm90IHRvZ2dsZWQgb24gZXZlcnkgdGVzdCAoZXhwZW5zaXZlKQorICAgICAgICBzRXhlY3V0ZWRUZXN0Q291bnQrKzsKKworICAgICAgICBTdHJpbmcgaHRtbCA9CisgICAgICAgICAgICAiPCFET0NUWVBFIGh0bWw+IiArCisgICAgICAgICAgICAiPGh0bWw+IiArCisgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgIjwvaGVhZD4iICsKKyAgICAgICAgICAgICAgIjxib2R5PiIgKworICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICJGaXJzdCIgKworICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgIjxidXR0b24+U2Vjb25kPC9idXR0b24+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXJkIiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIxIik7IC8vIGV4cGVjdCB0aGUgd29yZCBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlyc3Qgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIkZpcnN0Iik7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjMiKTsgLy8gZXhwZWN0IHRoZSBoZWFkaW5nIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gc2libGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI0Iik7IC8vIGV4cGVjdCB0aGUgc2libGluZyBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBnbyB0byB0aGUgbmV4dCBzaWJsaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGJ1dHRvbj5TZWNvbmQ8L2J1dHRvbj4iKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIwIik7IC8vIGV4cGVjdCB0aGUgY2hhcmFjdGVyIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIxIik7IC8vIGV4cGVjdCB0aGUgd29yZCBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBnbyB0byB0aGUgbmV4dCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcmQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYWNjZXNzaWJpbGl0eSBhbmQgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbmFibGVBY2Nlc3NpYmlsaXR5QW5kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG1hbmFnZXIgaXMgaW5zdGFudGlhdGVkIHNvIHRoZSBzeXN0ZW0gaW5pdGlhbGl6ZXMgaXQKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKTsKKworICAgICAgICAvLyBlbmFibGUgYWNjZXNzaWJpbGl0eSBhbmQgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsIDEpOworICAgICAgICBTdHJpbmcgZW5hYmxlZFNlcnZpY2VzID0gbmV3IENvbXBvbmVudE5hbWUoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUywgZW5hYmxlZFNlcnZpY2VzKTsKKworICAgICAgICAvLyBwb2xsIHdpdGhpbiBhIHRpbWVvdXQgYW5kIGxldCBiZSBpbnRlcnJ1cHRlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MKKyAgICAgICAgbG9uZyBpbmNyZW1lbnRTdGVwID0gVElNRU9VVF9FTkFCTEVfQUNDRVNTSUJJTElUWV9BTkRfTU9DS19TRVJWSUNFIC8gNTsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICB3aGlsZSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBzdGFydCA8IFRJTUVPVVRfRU5BQkxFX0FDQ0VTU0lCSUxJVFlfQU5EX01PQ0tfU0VSVklDRSAmJgorICAgICAgICAgICAgICAgICFzSXNBY2Nlc3NpYmlsaXR5U2VydmljZVJlYWR5KSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZXN0TG9jaykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNUZXN0TG9jay53YWl0KGluY3JlbWVudFN0ZXApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghc0lzQWNjZXNzaWJpbGl0eVNlcnZpY2VSZWFkeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIG5vdCByZWFkeS4gRGlkIHlvdSBhZGQgIiArCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0cyBhbmQgZm9yZ290IHRvIHVwZGF0ZSBBY2Nlc3NpYmlsaXR5SW5qZWN0b3JUZXN0I1RFU1RfQ0FTRV9DT1VOVD8iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNjcnViQ2xhc3MoQ2xhc3M8Pz4gdGVzdENhc2VDbGFzcykgeworICAgICAgICAvKiBkbyBub3RoaW5nIC0gYXZvaWQgc3VwZXJjbGFzcyBiZWhhdmlvciAqLworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGVzIGFjY2Vzc2liaWxpdHkgYW5kIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGlzYWJsZUFjY2Vzc2liaWxpdHlBbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UoKSB7CisgICAgICAgIC8vIGRpc2FibGUgYWNjZXNzaWJpbGl0eSBhbmQgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsIDApOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTLCAiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGUgbmV4dCA8Y29kZT5leHBlY3RlZFNlbGVjdGlvblN0cmluZzwvY29kZT4gdG8gYmUgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNlbGVjdGlvblN0cmluZyhTdHJpbmcgZXhwZWN0ZWRTZWxlY3Rpb25TdHJpbmcpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIG5vdCByZWFkeSIsIHNJc0FjY2Vzc2liaWxpdHlTZXJ2aWNlUmVhZHkpOworCisgICAgICAgIGxvbmcgaW5jcmVtZW50U3RlcCA9IFRJTUVPVVRfV0FJVF9GT1JfU0VMRUNUSU9OX1NUUklORyAvIDU7CisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnQgPCBUSU1FT1VUX1dBSVRfRk9SX1NFTEVDVElPTl9TVFJJTkcgJiYKKyAgICAgICAgICAgICAgICBzUmVjZWl2ZWRTZWxlY3Rpb25TdHJpbmcgPT0gU0VMRUNUSU9OX1NUUklOR19VTktOT1dOKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZXN0TG9jaykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNUZXN0TG9jay53YWl0KGluY3JlbWVudFN0ZXApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNSZWNlaXZlZFNlbGVjdGlvblN0cmluZyA9PSBTRUxFQ1RJT05fU1RSSU5HX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJObyBzZWxlY3Rpb24gc3RyaW5nIHJlY2VpdmVkLiBFeHBlY3RlZDogIiArIGV4cGVjdGVkU2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNlbGVjdGlvblN0cmluZywgc1JlY2VpdmVkU2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNSZWNlaXZlZFNlbGVjdGlvblN0cmluZyA9IFNFTEVDVElPTl9TVFJJTkdfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEge0BsaW5rIEtleUV2ZW50fSAodXAgYW5kIGRvd24pIHRvIHRoZSB7QGxpbmsgV2ViVmlld30uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5Q29kZSBUaGUgZXZlbnQga2V5IGNvZGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRLZXlFdmVudChXZWJWaWV3IHdlYlZpZXcsIGludCBrZXlDb2RlLCBpbnQgbWV0YVN0YXRlKSB7CisgICAgICAgIHdlYlZpZXcub25LZXlEb3duKGtleUNvZGUsIG5ldyBLZXlFdmVudCgwLCAwLCBLZXlFdmVudC5BQ1RJT05fRE9XTiwga2V5Q29kZSwgMSwgbWV0YVN0YXRlKSk7CisgICAgICAgIHdlYlZpZXcub25LZXlVcChrZXlDb2RlLCBuZXcgS2V5RXZlbnQoMCwgMCwgS2V5RXZlbnQuQUNUSU9OX1VQLCBrZXlDb2RlLCAxLCBtZXRhU3RhdGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFdlYlZpZXd9IHdpdGggd2l0aCBhIGdpdmVuIEhUTUwgY29udGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBodG1sIFRoZSBIVE1MIGNvbnRlbnQ7CisgICAgICogQHJldHVybiBUaGUgY3JlYXRlZCB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgV2ViVmlldyBjcmVhdGVXZWJWZXdXaXRoSHRtbChmaW5hbCBTdHJpbmcgaHRtbCkgeworICAgICAgICBtV29ya2VyLmdldEhhbmRsZXIoKS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldyA9IG5ldyBXZWJWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcubG9hZERhdGEoaHRtbCwgInRleHQvaHRtbCIsICJ1dGYtOCIpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldFdlYlZpZXdDbGllbnQobmV3IFdlYlZpZXdDbGllbnQoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Xb3JrZXIuZ2V0SGFuZGxlcigpLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVzdExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUZXN0TG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZXN0TG9jaykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzVGVzdExvY2sud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVdlYlZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHdvcmtlciB0aHJlYWQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB7QGxpbmsgV2ViVmlld30uCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBXb3JrZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Xb3JrZXJMb2NrID0gbmV3IE9iamVjdCgpOworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisKKyAgICAgICBwdWJsaWMgV29ya2VyKCkgeworICAgICAgICAgICAgbmV3IFRocmVhZCh0aGlzKS5zdGFydCgpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV29ya2VyTG9jaykgeworICAgICAgICAgICAgICAgIHdoaWxlIChtSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV29ya2VyTG9jay53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdvcmtlckxvY2spIHsKKyAgICAgICAgICAgICAgICBMb29wZXIucHJlcGFyZSgpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya2VyTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvb3Blci5sb29wKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSGFuZGxlciBnZXRIYW5kbGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIHRvIHJlY2VpdmUgdGhlIGFjY2Vzc2liaWxpdHkgZXZlbnRzCisgICAgICogd2l0aCB0aGUgY3VycmVudCB7QGxpbmsgV2ViVmlld30gc2VsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgQWNjZXNzaWJpbGl0eVNlcnZpY2UgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzU2VydmljZUluZm9TZXQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKKyAgICAgICAgICAgIGlmIChtSXNTZXJ2aWNlSW5mb1NldCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOworICAgICAgICAgICAgaW5mby5ldmVudFR5cGVzID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19TRUxFQ1RFRDsKKyAgICAgICAgICAgIGluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0dFTkVSSUM7CisgICAgICAgICAgICBzZXRTZXJ2aWNlSW5mbyhpbmZvKTsKKyAgICAgICAgICAgIG1Jc1NlcnZpY2VJbmZvU2V0ID0gdHJ1ZTsKKworICAgICAgICAgICAgc0lzQWNjZXNzaWJpbGl0eVNlcnZpY2VSZWFkeSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1Rlc3RMb2NrKSB7CisgICAgICAgICAgICAgICAgc1Rlc3RMb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFldmVudC5nZXRUZXh0KCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBldmVudC5nZXRUZXh0KCkuZ2V0KDApOworICAgICAgICAgICAgICAgIHNSZWNlaXZlZFNlbGVjdGlvblN0cmluZyA9ICh0ZXh0ICE9IG51bGwpID8gdGV4dC50b1N0cmluZygpIDogbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1Rlc3RMb2NrKSB7CisgICAgICAgICAgICAgICAgc1Rlc3RMb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgeworICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVW5iaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIHNJc0FjY2Vzc2liaWxpdHlTZXJ2aWNlUmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzlkZWZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgWm9vbU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgWm9vbU1hbmFnZXIgem9vbU1hbmFnZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcy5nZXRDb250ZXh0KCkpOworICAgICAgICBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkgPSBuZXcgQ2FsbGJhY2tQcm94eSh0aGlzLmdldENvbnRleHQoKSwgd2ViVmlldyk7CisgICAgICAgIHpvb21NYW5hZ2VyID0gbmV3IFpvb21NYW5hZ2VyKHdlYlZpZXcsIGNhbGxiYWNrUHJveHkpOworCisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoMS4wMGYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0KCkgeworICAgICAgICB0ZXN0SW5pdCgwLjAxZik7CisgICAgICAgIHRlc3RJbml0KDEuMDBmKTsKKyAgICAgICAgdGVzdEluaXQoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0SW5pdChmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoZGVuc2l0eSk7CisgICAgICAgIGFjdHVhbFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHpvb21NYW5hZ2VyLmdldERlZmF1bHRNYXhab29tU2NhbGUoKSwgem9vbU1hbmFnZXIuZ2V0TWF4Wm9vbVNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpLCB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZW5zaXR5LCB6b29tTWFuYWdlci5nZXRUZXh0V3JhcFNjYWxlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGJhc2ljIGNhc2Ugd2hlcmUgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlIGVxdWFsIHRvIHRoZSBkZWZhdWx0cworICAgICAgICB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KDAuMDFmKTsKKyAgICAgICAgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eSgxLjAwZik7CisgICAgICAgIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGRlbnNpdHkpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KGRlbnNpdHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoU21hbGxNaW5ab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtaW5ab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPCB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWluWm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtaW5WaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1pblZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtaW5ab29tU2NhbGUgLSAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWluVmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aExhcmdlTWluWm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWluWm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlID4gdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1pblpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWluVmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtaW5WaWV3U3RhdGUubU1pblNjYWxlID0gbWluWm9vbVNjYWxlICsgMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1pblZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eVdpdGhTbWFsbE1heFpvb20oKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1heFpvb21TY2FsZSBoYXMgY2hhbmdlZCB0byBiZSA8IHRoZSBkZWZhdWx0CisgICAgICAgIGZsb2F0IG5ld0RlZmF1bHRTY2FsZSA9IDEuNTBmOworICAgICAgICBmbG9hdCBtYXhab29tU2NhbGUgPSBab29tTWFuYWdlci5ERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiAqIG5ld0RlZmF1bHRTY2FsZTsKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIG1heFZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgbWF4Vmlld1N0YXRlLm1NYXhTY2FsZSA9IG1heFpvb21TY2FsZSAtIDAuMWY7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZShtYXhWaWV3U3RhdGUsIDAsIDApOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkobmV3RGVmYXVsdFNjYWxlKTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChuZXdEZWZhdWx0U2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoTGFyZ2VNYXhab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXhab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPiB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWF4Wm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtYXhWaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1heFZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtYXhab29tU2NhbGUgKyAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWF4Vmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZVNjYWxlV2l0aExpbWl0cygpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgbWF4U2NhbGUgPSB6b29tTWFuYWdlci5nZXRNYXhab29tU2NhbGUoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgbWluU2NhbGUgPSB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXhTY2FsZSA+IG1pblNjYWxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1heFNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1heFNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXhTY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtYXhTY2FsZSArIC4wMWYpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pblNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1pblNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW5TY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtaW5TY2FsZSAtIC4wMWYpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWN0dWFsU2NhbGVUZXN0KGZsb2F0IGFjdHVhbFNjYWxlKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWxTY2FsZSwgem9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxIC8gYWN0dWFsU2NhbGUsIHpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWZhdWx0U2NhbGVUZXN0KGZsb2F0IGRlZmF1bHRTY2FsZSkgeworICAgICAgICBmaW5hbCBmbG9hdCBtYXhEZWZhdWx0ID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBkZWZhdWx0U2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IG1pbkRlZmF1bHQgPSBab29tTWFuYWdlci5ERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUiAqIGRlZmF1bHRTY2FsZTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSAvIGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0SW52RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWF4RGVmYXVsdCwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbkRlZmF1bHQsIHpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNiNTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLk15R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFNpbXBsZT4gewotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBtQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0U2ltcGxlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IG1BY3Rpdml0eS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0QWRhcHRlcigpOwotICAgICAgICBtTGlzdFV0aWwgPSBuZXcgTGlzdFV0aWwobUV4cGFuZGFibGVMaXN0VmlldywgZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKG1BY3Rpdml0eSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUV4cGFuZGFibGVMaXN0Vmlldyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGV4cGFuZEdyb3VwKGludCBudW1DaGlsZHJlbiwgYm9vbGVhbiBhdExlYXN0T25lQ2hpbGQpIHsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwUG9zID0gbUFjdGl2aXR5LmZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihudW1DaGlsZHJlbiwgYXRMZWFzdE9uZUNoaWxkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgZ3JvdXAgdG8gZXhwYW5kIiwgZ3JvdXBQb3MgPj0gMCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZ3JvdXBQb3MpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKGdyb3VwUG9zKSk7Ci0KLSAgICAgICAgcmV0dXJuIGdyb3VwUG9zOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZEdyb3VwKCkgewotICAgICAgICBleHBhbmRHcm91cCgtMSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbGxhcHNlR3JvdXAoKSB7Ci0gICAgICAgIGZpbmFsIGludCBncm91cFBvcyA9IGV4cGFuZEdyb3VwKC0xLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGRpZCBub3QgY29sbGFwc2UiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRlZEdyb3VwTW92ZW1lbnQoKSB7Ci0gICAgICAgIC8vIEV4cGFuZCB0aGUgZmlyc3QgZ3JvdXAKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKDApOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIGl0IGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgICAgICAKLSAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGF0J3MgYWxsIGdvb2QKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZXhwYW5kZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBJbnNlcnQgYSBjb2xsYXBzZWQgZ3JvdXAgaW4gZnJvbnQgb2YgdGhlIG9uZSBqdXN0IGV4cGFuZGVkCi0gICAgICAgIExpc3Q8TXlHcm91cD4gZ3JvdXBzID0gbUFjdGl2aXR5LmdldEdyb3VwcygpOwotICAgICAgICBNeUdyb3VwIGluc2VydGVkR3JvdXAgPSBuZXcgTXlHcm91cCgxKTsKLSAgICAgICAgZ3JvdXBzLmFkZCgwLCBpbnNlcnRlZEdyb3VwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGlmeSBkYXRhIGNoYW5nZQotICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBhZGFwdGVyIiwKLSAgICAgICAgICAgICAgICBtQWRhcHRlciBpbnN0YW5jZW9mIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIpOwotICAgICAgICBmaW5hbCBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGFkYXB0ZXIgPSAoQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcikgbUFkYXB0ZXI7Ci0gICAgIAotICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJpZ2h0IGdyb3VwIGlzIGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBleHBhbmRlZCBzdGF0ZSBkaWRuJ3Qgc3RheSB3aXRoIHRoZSBwcm9wZXIgZ3JvdXAiLAotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBleHBhbmRlZCBzdGF0ZSB3YXMgZ2l2ZW4gdG8gdGhlIGluc2VydGVkIGdyb3VwIiwKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udGV4dE1lbnVzKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRiMjhjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RTaW1wbGUgZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOVU1fQ0hJTERSRU4gPSB7NCwgMywgMiwgMSwgMH07Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXROdW1DaGlsZHJlbihOVU1fQ0hJTERSRU4pCi0gICAgICAgICAgICAgICAgLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKDAuMTQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0KLSAgICAgICAgbWVudS5hZGQoIkFkZCBpdGVtIikuc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIobmV3IE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBzLmFkZCgwLCBuZXcgTXlHcm91cCgyKSk7Ci0gICAgICAgICAgICAgICAgKChCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyKSBtQWRhcHRlcikubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjEwZmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0VGVzdGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBtRXhwYW5kYWJsZUxpc3RWaWV3OwotICAgIHByaXZhdGUgZmluYWwgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgZmluYWwgTGlzdFV0aWwgbUxpc3RVdGlsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjw/IGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbz4KLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotCi0gICAgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247Ci0KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RUZXN0ZXIoCi0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3LAotICAgICAgICAgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8PyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8+Ci0gICAgICAgICAgICBhY3Rpdml0eUluc3RydW1lbnRhdGlvbikgewotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZXhwYW5kYWJsZUxpc3RWaWV3OwotICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gYWN0aXZpdHlJbnN0cnVtZW50YXRpb24uZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgIG1MaXN0VXRpbCA9IG5ldyBMaXN0VXRpbChtRXhwYW5kYWJsZUxpc3RWaWV3LCBpbnN0cnVtZW50YXRpb24pOwotICAgICAgICBtQWRhcHRlciA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCk7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbiA9IGFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmRHcm91cChmaW5hbCBpbnQgZ3JvdXBJbmRleCwgaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgLmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihmbGF0UG9zaXRpb24pOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24uc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kICIgKyBncm91cEluZGV4LCAKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICAvLyBBZGQgYSBwb3NpdGlvbiB0ZXN0ZXIgQ29udGV4dE1lbnUgbGlzdGVuZXIgdG8gdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lcigpOwotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGhlYWRlciBlbGVtZW50cyBzaG91bGQgdHJpZ2dlciBhbiBBZGFwdGVyQ29udGV4dE1lbnUKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGdyb3VwIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdEFkYXB0ZXJDb250ZXh0TWVudShpKTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBoZWFkZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGhlYWRlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0KLSAgICAgICAgICAgIC8vIEV4cGFuZCBncm91cAotICAgICAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgaW5kZXgpOwotCi0gICAgICAgICAgICAvLyBDaGVjayBncm91cCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RHcm91cENvbnRleHRNZW51KGdyb3VwSW5kZXgpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBncm91cCBpcyB2aXNpYmxlIHNvIHRoYXQgZ2V0Q2hpbGQgZmluZHMgaXQKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBWaWV3IGdyb3VwQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChncm91cENoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1BZGFwdGVyLmdldENoaWxkcmVuQ291bnQoZ3JvdXBJbmRleCk7Ci0gICAgICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGNoaWxkIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdENoaWxkQ29udGV4dE1lbnUoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0gICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gZm9vdGVyIGVsZW1lbnRzIHNob3VsZCB0cmlnZ2VyIGFuIEFkYXB0ZXJDb250ZXh0TWVudQotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0QWRhcHRlckNvbnRleHRNZW51KGluZGV4KTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBmb290ZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGZvb3RlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHRoZSBsaXN0ZW5lciB3ZSBhZGRlZC4KLSAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZXhwYW5kQUdyb3VwKCkgewotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IDI7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm90IGVub3VnaCBncm91cHMiLCBncm91cEluZGV4IDwgbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpKTsKLSAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgZ3JvdXBJbmRleCArIGhlYWRlckNvdW50KTsKLSAgICAgICAgcmV0dXJuIGdyb3VwSW5kZXg7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxoZWFkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUZXN0IGFsbCAobm9uIGV4cGFuZGVkKSBncm91cHMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGbGF0UG9zaXRpb24gPSBoZWFkZXJDb3VudCArIGdyb3VwSW5kZXg7Ci0gICAgICAgICAgICBsb25nIHBhY2tlZFBvc2l0aW9uRm9yR3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIG5vdCBmb3VuZCBhdCBmbGF0IHBvc2l0aW9uICIgKyBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgcGFja2VkUG9zaXRpb25Gb3JHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGV4cGVjdGVkRmxhdFBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGdyb3VwICIgKyBncm91cEluZGV4LAotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGbGF0TGlzdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uRm9yR3JvdXApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihoZWFkZXJDb3VudCArIGdyb3VwQ291bnQgKyBpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCkgewotICAgICAgICAvLyBUZXN0IHdpdGggYW4gZXhwYW5kZWQgZ3JvdXAKLSAgICAgICAgZmluYWwgaW50IGhlYWRlckNvdW50ID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7Ci0gICAgICAgIGZpbmFsIGludCBncm91cEluZGV4ID0gZXhwYW5kQUdyb3VwKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuQ291bnQgPSBtQWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGdyb3VwSW5kZXgpOwotICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhdFBvc2l0aW9uID0gaGVhZGVyQ291bnQgKyBncm91cEluZGV4ICsgMSArIGNoaWxkSW5kZXg7Ci0gICAgICAgICAgICBsb25nIGNoaWxkUG9zID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGNoaWxkICIsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oZXhwZWN0ZWRGbGF0UG9zaXRpb24pKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV3JvbmcgZmxhdCBwb3NpdGlvbiBmb3IgY2hpbGQgIiwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RmxhdExpc3RQb3NpdGlvbihjaGlsZFBvcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uR3JvdXBzKCkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBoZWFkZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSGVhZGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBzZWxlY3Rpb24gb24gZ3JvdXAgaXRlbXMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR3JvdXAgaXRlbSBpcyBub3Qgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRTZWxlY3RlZFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBmb290ZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRm9vdGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpIHsKLSAgICAgICAgLy8gVGVzdCB3aXRoIGFuIGV4cGFuZGVkIGdyb3VwCi0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IGV4cGFuZEFHcm91cCgpOwotCi0gICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChncm91cEluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgIGludCBjaGlsZEZsYXRQb3NpdGlvbiA9IGhlYWRlckNvdW50ICsgZ3JvdXBJbmRleCArIDEgKyBjaGlsZEluZGV4OwotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGNoaWxkRmxhdFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIGl0ZW0gaXMgbm90IHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCksCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTFjMWQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNOdW1DaGlsZHJlbiA9IHsxLCA0LCAzLCAyLCA2fTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc051bU9mSGVhZGVyc0FuZEZvb3RlcnMgPSAxMjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXRTdGFja0Zyb21Cb3R0b20oZmFsc2UpCi0gICAgICAgICAgICAgICAgLnNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oLTEpCi0gICAgICAgICAgICAgICAgLnNldE51bUNoaWxkcmVuKHNOdW1DaGlsZHJlbikKLSAgICAgICAgICAgICAgICAuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoMC4xNCkKLSAgICAgICAgICAgICAgICAuc2V0Q29ubmVjdEFkYXB0ZXIoZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5zZXRJdGVtc0NhbkZvY3VzKHRydWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGhlYWRlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBoZWFkZXIuc2V0VGV4dCgiSGVhZGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEhlYWRlclZpZXcoaGVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGZvb3RlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBmb290ZXIuc2V0VGV4dCgiRm9vdGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEZvb3RlclZpZXcoZm9vdGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU2V0IGFkYXB0ZXIgaGVyZSBBRlRFUiB3ZSBzZXQgaGVhZGVyIGFuZCBmb290ZXIgdmlld3MKLSAgICAgICAgc2V0QWRhcHRlcihleHBhbmRhYmxlTGlzdFZpZXcpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGVhZGVycyAoYW5kIHRoZSBzYW1lIG51bWJlciBvZiBmb290ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtT2ZIZWFkZXJzQW5kRm9vdGVycygpIHsKLSAgICAgICAgcmV0dXJuIHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRjODUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QgZXh0ZW5kcwotICAgICAgICBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzPiB7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIAotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0QWN0aXZpdHkoKS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUxpc3RVdGlsID0gbmV3IExpc3RVdGlsKG1FeHBhbmRhYmxlTGlzdFZpZXcsIGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtRXhwYW5kYWJsZUxpc3RWaWV3KTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kT25GaXJzdFBvc2l0aW9uKCkgewotICAgICAgICAvLyBTaG91bGQgYmUgYSBoZWFkZXIsIGFuZCBoZW5jZSB0aGUgZmlyc3QgZ3JvdXAgc2hvdWxkIE5PVCBoYXZlIGV4cGFuZGVkCi0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbigwKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRGYWxzZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRPbkZpcnN0R3JvdXAoKSB7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihnZXRBY3Rpdml0eSgpLmdldE51bU9mSGVhZGVyc0FuZEZvb3RlcnMoKSk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0TWVudXMoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb250ZXh0TWVudXMoKTsKLSAgICB9Ci0KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZCgpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uR3JvdXBzKCk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25DaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM5ZDU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotcHVibGljIGNsYXNzIEluZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuaW5mbGF0ZWRfZXhwYW5kYWJsZWxpc3R2aWV3KTsKLSAgICAgICAgCi0gICAgICAgIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSAoRXhwYW5kYWJsZUxpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5lbHYpOwotICAgICAgICBlbHYuc2V0QWRhcHRlcihuZXcgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIC8vIFNhbXBsZSBkYXRhIHNldC4gIGNoaWxkcmVuW2ldIGNvbnRhaW5zIHRoZSBjaGlsZHJlbiAoU3RyaW5nW10pIGZvciBncm91cHNbaV0uCi0gICAgICAgIHByaXZhdGUgU3RyaW5nW10gZ3JvdXBzID0geyAiUGVvcGxlIE5hbWVzIiwgIkRvZyBOYW1lcyIsICJDYXQgTmFtZXMiLCAiRmlzaCBOYW1lcyIgfTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXVtdIGNoaWxkcmVuID0gewotICAgICAgICAgICAgICAgIHsgIkFybm9sZCIsICJCYXJyeSIsICJDaHVjayIsICJEYXZpZCIgfSwKLSAgICAgICAgICAgICAgICB7ICJBY2UiLCAiQmFuZGl0IiwgIkNoYS1DaGEiLCAiRGV1Y2UiIH0sCi0gICAgICAgICAgICAgICAgeyAiRmx1ZmZ5IiwgIlNudWdnbGVzIiB9LAotICAgICAgICAgICAgICAgIHsgIkdvbGR5IiwgIkJ1YmJsZXMiIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bZ3JvdXBQb3NpdGlvbl1bY2hpbGRQb3NpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDaGlsZElkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENoaWxkcmVuQ291bnQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbltncm91cFBvc2l0aW9uXS5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGV4dFZpZXcgZ2V0R2VuZXJpY1ZpZXcoKSB7Ci0gICAgICAgICAgICAvLyBMYXlvdXQgcGFyYW1ldGVycyBmb3IgdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICAgICAgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEFic0xpc3RWaWV3LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDY0KTsKLQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcudGhpcyk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSB0ZXh0IHZlcnRpY2FsbHkKLSAgICAgICAgICAgIHRleHRWaWV3LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgfCBHcmF2aXR5LkxFRlQpOwotICAgICAgICAgICAgLy8gU2V0IHRoZSB0ZXh0IHN0YXJ0aW5nIHBvc2l0aW9uCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRQYWRkaW5nKDM2LCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldENoaWxkKGdyb3VwUG9zaXRpb24sIGNoaWxkUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRHcm91cChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3Vwc1tncm91cFBvc2l0aW9uXTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cHMubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0R3JvdXBJZChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3VwUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRHcm91cFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGJvb2xlYW4gaXNFeHBhbmRlZCwgVmlldyBjb252ZXJ0VmlldywKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldEdyb3VwKGdyb3VwUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGlsZFNlbGVjdGFibGUoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiZGZmOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbzsKLQotcHVibGljIGNsYXNzIFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGludCBncm91cFBvc2l0aW9uLCBjaGlsZFBvc2l0aW9uOwotCi0gICAgLy8gRmFrZSBjb25zdGFudCB0byBzdG9yZSBpbiB0ZXN0VHlwZSBhIHRlc3QgdHlwZSBzcGVjaWZpYyB0byBoZWFkZXJzIGFuZCBmb290ZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJfVFlQRSA9IC0xOwotICAgIHByaXZhdGUgaW50IHRlc3RUeXBlOyAvLyBhcyByZXR1cm5lZCBieSBnZXRQYWNrZWRQb3NpdGlvblR5cGUKLQotICAgIC8vIFdpbGwgYmUgc2V0IHRvIG51bGwgYnkgZWFjaCBjYWxsIHRvIG9uQ3JlYXRlQ29udGV4dE1lbnUsIHVubGVzcyBhbiBlcnJvciBvY2N1cnJlZC4gCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R3JvdXBDb250ZXh0TWVudShpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RDaGlsZENvbnRleHRNZW51KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0aGlzLmNoaWxkUG9zaXRpb24gPSBjaGlsZFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGFwdGVyQ29udGV4dE1lbnUoaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBmbGF0UG9zaXRpb247Ci0gICAgICAgIHRlc3RUeXBlID0gQURBUFRFUl9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKLSAgICAgICAgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKHRlc3RUeXBlID09IEFEQVBURVJfVFlQRSkgewotICAgICAgICAgICAgaWYgKCFpc1RydWUoIk1lbnVJbmZvIGlzIG5vdCBhbiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvIiwKLSAgICAgICAgICAgICAgICAgICAgbWVudUluZm8gaW5zdGFuY2VvZiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkYXB0ZXJDb250ZXh0TWVudUluZm8gYWRhcHRlckNvbnRleHRNZW51SW5mbyA9IChBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSBtZW51SW5mbzsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGZsYXQgcG9zaXRpb24iLCBncm91cFBvc2l0aW9uLCBhZGFwdGVyQ29udGV4dE1lbnVJbmZvLnBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghaXNUcnVlKCJNZW51SW5mbyBpcyBub3QgYW4gRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8iLAotICAgICAgICAgICAgICAgICAgICBtZW51SW5mbyBpbnN0YW5jZW9mIEV4cGFuZGFibGVMaXN0Vmlldy5FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8gZWx2TWVudUluZm8gPQotICAgICAgICAgICAgICAgIChFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOwotICAgICAgICAgICAgbG9uZyBwYWNrZWRQb3NpdGlvbiA9IGVsdk1lbnVJbmZvLnBhY2tlZFBvc2l0aW9uOwotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25UeXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBwYWNrZWQgcG9zaXRpb24gdHlwZSIsIHRlc3RUeXBlLCBwYWNrZWRQb3NpdGlvblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25Hcm91cCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGdyb3VwIHBvc2l0aW9uIiwgZ3JvdXBQb3NpdGlvbiwgcGFja2VkUG9zaXRpb25Hcm91cCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ZXN0VHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25DaGlsZCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBjaGlsZCBwb3NpdGlvbiIsIGNoaWxkUG9zaXRpb24sIHBhY2tlZFBvc2l0aW9uQ2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXJlRXF1YWwoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KG1lc3NhZ2UgKyAiICglZCB2cyAlZCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RydWUoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaWYgKCF2YWx1ZSkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQppbmRleCBlYmUxM2UxLi5jNjk4ZTk5IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCisrKyBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKQEAgLTE1Miw3ICsxNTIsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIENvbGxlY3RpbmdUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lcigpOwotICAgICAgICB0ZXN0UnVubmVyLnJ1bihsaXN0ZW5lcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0UnVubmVyLnJ1bihsaXN0ZW5lcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImVuY291bnRlcmVkIElPRXhjZXB0aW9uICIgKyBpb2UpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBsaXN0ZW5lcjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RhdGEvZXRjL3BsYXRmb3JtLnhtbCBiL2RhdGEvZXRjL3BsYXRmb3JtLnhtbAppbmRleCA2ZjhhZmZmLi40MzlmYzkwIDEwMDY0NAotLS0gYS9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKKysrIGIvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCkBAIC01OCw2ICs1OCwxMCBAQAogICAgICAgICA8Z3JvdXAgZ2lkPSJzZGNhcmRfcnciIC8+CiAgICAgPC9wZXJtaXNzaW9uPgogCisgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19VU0IiID4KKyAgICAgICAgPGdyb3VwIGdpZD0idXNiIiAvPgorICAgIDwvcGVybWlzc2lvbj4KKwogICAgIDwhLS0gVGhlIGdyb3VwIHRoYXQgL2NhY2hlIGJlbG9uZ3MgdG8sIGxpbmtlZCB0byB0aGUgcGVybWlzc2lvbgogICAgICAgICAgc2V0IG9uIHRoZSBhcHBsaWNhdGlvbnMgdGhhdCBjYW4gYWNjZXNzIC9jYWNoZSAtLT4KICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0NBQ0hFX0ZJTEVTWVNURU0iID4KZGlmZiAtLWdpdCBhL2RhdGEvZXRjL3RhYmxldF9jb3JlX2hhcmR3YXJlLnhtbCBiL2RhdGEvZXRjL3RhYmxldF9jb3JlX2hhcmR3YXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTJkMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9ldGMvdGFibGV0X2NvcmVfaGFyZHdhcmUueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoZXNlIGFyZSB0aGUgaGFyZHdhcmUgY29tcG9uZW50cyB0aGF0IGFsbCBoYW5kaGVsZCBkZXZpY2VzCisgICAgIG11c3QgaW5jbHVkZS4gRGV2aWNlcyB3aXRoIG9wdGlvbmFsIGhhcmR3YXJlIG11c3QgYWxzbyBpbmNsdWRlIGV4dHJhCisgICAgIGhhcmR3YXJlIGZpbGVzLCBwZXIgdGhlIGNvbW1lbnRzIGJlbG93LgorCisgICAgIEhhbmRoZWxkIGRldmljZXMgaW5jbHVkZSBwaG9uZXMsIG1vYmlsZSBJbnRlcm5ldCBkZXZpY2VzIChNSURzKSwKKyAgICAgUGVyc29uYWwgTWVkaWEgUGxheWVycyAoUE1QcyksIHNtYWxsIHRhYmxldHMgKDciIG9yIGxlc3MpLCBhbmQgc2ltaWxhcgorICAgICBkZXZpY2VzLgorLS0+Cis8cGVybWlzc2lvbnM+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbiIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLm5ldHdvcmsiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuY29tcGFzcyIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5hY2NlbGVyb21ldGVyIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4iIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbi5tdWx0aXRvdWNoIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4ubXVsdGl0b3VjaC5kaXN0aW5jdCIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLm1pY3JvcGhvbmUiIC8+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggR1BTIG11c3QgaW5jbHVkZSBhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLmdwcy54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYSByZWFyLWZhY2luZyBjYW1lcmEgbXVzdCBpbmNsdWRlIG9uZSBvZiB0aGVzZSBhcyBhcHByb3ByaWF0ZToKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnhtbCBvciAKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmF1dG9mb2N1cy54bWwgb3IgCisgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5hdXRvZm9jdXMtZmxhc2gueG1sIC0tPgorICAgIDwhLS0gZGV2aWNlcyB3aXRoIGEgZnJvbnQgZmFjaW5nIGNhbWVyYSBtdXN0IGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmZyb250LnhtbCAtLT4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBXaUZpIG11c3QgYWxzbyBpbmNsdWRlIGFuZHJvaWQuaGFyZHdhcmUud2lmaS54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYW4gYW1iaWVudCBsaWdodCBzZW5zb3IgbXVzdCBhbHNvIGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmxpZ2h0LnhtbCAtLT4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBhIHByb3hpbWl0eSBzZW5zb3IgbXVzdCBhbHNvIGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLnByb3hpbWl0eS54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYSBiYXJvbWV0ZXIgbXVzdCBhbHNvIGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmJhcm9tZXRlci54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYSBneXJvc2NvcGUgbXVzdCBhbHNvIGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmd5cm9zY29wZS54bWwgLS0+CisgICAgPCEtLSBHU00gcGhvbmVzIG11c3QgYWxzbyBpbmNsdWRlIGFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255LmdzbS54bWwgLS0+CisgICAgPCEtLSBDRE1BIHBob25lcyBtdXN0IGFsc28gaW5jbHVkZSBhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueS5jZG1hLnhtbCAtLT4KKzwvcGVybWlzc2lvbnM+CmRpZmYgLS1naXQgYS9kYXRhL2ZvbnRzL0FoZW0udHRmIGIvZGF0YS9mb250cy9BaGVtLnR0ZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlNmM2MC4uMDAwMDAwMAotLS0gYS9kYXRhL2ZvbnRzL0FoZW0udHRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGF0YS9mb250cy9BbmRyb2lkLm1rIGIvZGF0YS9mb250cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzQwNjQ2Li4wMDAwMDAwCi0tLSBhL2RhdGEvZm9udHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLWNvcHlfZnJvbSA6PSAgICAgICAgICAgICAgICBcCi0gICAgRHJvaWRTYW5zLnR0ZiAgICAgICAgICAgXAotICAgIERyb2lkU2Fucy1Cb2xkLnR0ZiAgICAgIFwKLSAgICBEcm9pZFNhbnNBcmFiaWMudHRmICAgICBcCi0gICAgRHJvaWRTYW5zSGVicmV3LnR0ZiAgICAgXAotICAgIERyb2lkU2Fuc1RoYWkudHRmICAgICAgIFwKLSAgICBEcm9pZFNlcmlmLVJlZ3VsYXIudHRmICBcCi0gICAgRHJvaWRTZXJpZi1Cb2xkLnR0ZiAgICAgXAotICAgIERyb2lkU2VyaWYtSXRhbGljLnR0ZiAgIFwKLSAgICBEcm9pZFNlcmlmLUJvbGRJdGFsaWMudHRmICAgXAotICAgIERyb2lkU2Fuc01vbm8udHRmICAgICAgICBcCi0gICAgQ2xvY2tvcGlhLnR0ZgotCi1pZm5lcSAoJChOT19GQUxMQkFDS19GT05UKSx0cnVlKQotaWZlcSAoJChmaWx0ZXIgJXN5c3RlbS9mb250cy9Ecm9pZFNhbnNGYWxsYmFjay50dGYsJChQUk9EVUNUX0NPUFlfRklMRVMpKSwpCi0gICAgIyBpZiB0aGUgcHJvZHVjdCBtYWtlZmlsZSBoYXMgc2V0IHRoZSB0aGUgZmFsbGJhY2sgZm9udCwgZG9uJ3Qgb3ZlcnJpZGUgaXQuCi0gICAgY29weV9mcm9tICs9IERyb2lkU2Fuc0ZhbGxiYWNrLnR0ZgotZW5kaWYKLWVuZGlmCi0KLWNvcHlfZmlsZV9wYWlycyA6PSAkKGZvcmVhY2ggY2YsJChjb3B5X2Zyb20pLCQoTE9DQUxfUEFUSCkvJChjZik6c3lzdGVtL2ZvbnRzLyQoY2YpKQotUFJPRFVDVF9DT1BZX0ZJTEVTICs9ICQoY29weV9maWxlX3BhaXJzKQpkaWZmIC0tZ2l0IGEvZGF0YS9mb250cy9mb250cy5tayBiL2RhdGEvZm9udHMvZm9udHMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkMDMzMQotLS0gL2Rldi9udWxsCisrKyBiL2RhdGEvZm9udHMvZm9udHMubWsKQEAgLTAsMCArMSwyOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBXYXJuaW5nOiB0aGlzIGlzIGFjdHVhbGx5IGEgcHJvZHVjdCBkZWZpbml0aW9uLCB0byBiZSBpbmhlcml0ZWQgZnJvbQorCitQUk9EVUNUX0NPUFlfRklMRVMgOj0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzL0Ryb2lkU2Fucy50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2Fucy50dGYgXAorICAgIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzL0Ryb2lkU2Fucy1Cb2xkLnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTYW5zLUJvbGQudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnNBcmFiaWMudHRmOnN5c3RlbS9mb250cy9Ecm9pZFNhbnNBcmFiaWMudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnNIZWJyZXcudHRmOnN5c3RlbS9mb250cy9Ecm9pZFNhbnNIZWJyZXcudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnNUaGFpLnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTYW5zVGhhaS50dGYgXAorICAgIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzL0Ryb2lkU2VyaWYtUmVndWxhci50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2VyaWYtUmVndWxhci50dGYgXAorICAgIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzL0Ryb2lkU2VyaWYtQm9sZC50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2VyaWYtQm9sZC50dGYgXAorICAgIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzL0Ryb2lkU2VyaWYtSXRhbGljLnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTZXJpZi1JdGFsaWMudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNlcmlmLUJvbGRJdGFsaWMudHRmOnN5c3RlbS9mb250cy9Ecm9pZFNlcmlmLUJvbGRJdGFsaWMudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnNNb25vLnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTYW5zTW9uby50dGYgXAorICAgIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzL0Nsb2Nrb3BpYS50dGY6c3lzdGVtL2ZvbnRzL0Nsb2Nrb3BpYS50dGYgXAorICAgIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzL0Ryb2lkU2Fuc0ZhbGxiYWNrLnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTYW5zRmFsbGJhY2sudHRmCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL2luZGV4LmpkIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy9pbmRleC5qZAppbmRleCBlYTYxY2MzLi4yMTY0NzA1IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvaW5kZXguamQKQEAgLTEsNiArMSw1IEBACiBwYWdlLnRpdGxlPVRlc3RpbmcgT3ZlcnZpZXcKIEBqZDpib2R5Ci0KIDxwPgogICAgIEFuZHJvaWQgaW5jbHVkZXMgcG93ZXJmdWwgdG9vbHMgZm9yIHNldHRpbmcgdXAgYW5kIHJ1bm5pbmcgdGVzdCBhcHBsaWNhdGlvbnMuCiAgICAgV2hldGhlciB5b3UgYXJlIHdvcmtpbmcgaW4gRWNsaXBzZSB3aXRoIEFEVCBvciB3b3JraW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdGhlc2UgdG9vbHMKQEAgLTksNyArOCw3IEBACiA8L3A+CiA8cD4KICAgICBJZiB5b3UgYXJlbid0IHlldCBmYW1pbGlhciB3aXRoIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLCBwbGVhc2UgcmVhZCB0aGUgdG9waWMKLSAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbjwvYT4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPgogICAgIGJlZm9yZSB5b3UgZ2V0IHN0YXJ0ZWQuCiAgICAgRm9yIGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byBBbmRyb2lkIHRlc3RpbmcsIHRyeSB0aGUgPGEKICAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPkhlbGxvLCBUZXN0aW5nPC9hPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuamQgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5qZAppbmRleCBkYTFjMGYwLi5iYTdlYWJhIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5qZApAQCAtMSwyOCArMSwyMyBAQAogcGFnZS50aXRsZT1UZXN0aW5nIEluIEVjbGlwc2UsIHdpdGggQURUCiBAamQ6Ym9keQotCiA8ZGl2IGlkPSJxdi13cmFwcGVyIj4KLSAgPGRpdiBpZD0icXYiPgotICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+Ci0gIDxvbD4KLSAgICA8bGk+PGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0RWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IFByb2plY3Q8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI0NyZWF0ZVRlc3RBcHBFY2xpcHNlIj5DcmVhdGluZyBhIFRlc3QgQXBwbGljYXRpb248L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI1J1blRlc3RFY2xpcHNlIj5SdW5uaW5nIFRlc3RzPC9hPjwvbGk+Ci0gIDwvb2w+Ci0gIDwvZGl2PgorICAgIDxkaXYgaWQ9InF2Ij4KKyAgICAgICAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgorICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjQ3JlYXRlVGVzdFByb2plY3RFY2xpcHNlIj5DcmVhdGluZyBhIFRlc3QgUHJvamVjdDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjQ3JlYXRlVGVzdEFwcEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBQYWNrYWdlPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNSdW5UZXN0RWNsaXBzZSI+UnVubmluZyBUZXN0czwvYT48L2xpPgorICAgICAgICAgICAgPC9vbD4KKyAgICA8L2Rpdj4KIDwvZGl2PgogPHA+Ci0gIFRoaXMgdG9waWMgZXhwbGFpbnMgaG93IGNyZWF0ZSBhbmQgcnVuIHRlc3RzIG9mIEFuZHJvaWQgYXBwbGljYXRpb25zIGluIEVjbGlwc2Ugd2l0aCBBRFQuCi0KLSAgd2l0aCB0aGUgYmFzaWMgcHJvY2Vzc2VzIGZvciBjcmVhdGluZyBhbmQgcnVubmluZyBhcHBsaWNhdGlvbnMgd2l0aCBBRFQsIGFzIGRlc2NyaWJlZCBpbgotICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy9lY2xpcHNlLWFkdC5odG1sIj5EZXZlbG9waW5nIEluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4KLQotICBCZWZvcmUgeW91IHJlYWQgdGhpcyB0b3BpYywgeW91IHNob3VsZCByZWFkIGFib3V0IGhvdyB0byBjcmVhdGUgYSBBbmRyb2lkIGFwcGxpY2F0aW9uIHdpdGggdGhlCi0gIGJhc2ljIHByb2Nlc3NlcyBmb3IgY3JlYXRpbmcgYW5kIHJ1bm5pbmcgYXBwbGljYXRpb25zIHdpdGggQURULCBhcyBkZXNjcmliZWQgaW4KLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvZWNsaXBzZS1hZHQuaHRtbCI+RGV2ZWxvcGluZyBJbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCi0gIFlvdSBtYXkgYWxzbyB3YW50IHRvIHJlYWQKLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIGFuZCBJbnN0cnVtZW50YXRpb248L2E+LAotICB3aGljaCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yay4KKyAgICBUaGlzIHRvcGljIGV4cGxhaW5zIGhvdyBjcmVhdGUgYW5kIHJ1biB0ZXN0cyBvZiBBbmRyb2lkIGFwcGxpY2F0aW9ucyBpbiBFY2xpcHNlIHdpdGggQURULgorICAgIEJlZm9yZSB5b3UgcmVhZCB0aGlzIHRvcGljLCB5b3Ugc2hvdWxkIHJlYWQgYWJvdXQgaG93IHRvIGNyZWF0ZSBhIEFuZHJvaWQgYXBwbGljYXRpb24gd2l0aCB0aGUKKyAgICBiYXNpYyBwcm9jZXNzZXMgZm9yIGNyZWF0aW5nIGFuZCBydW5uaW5nIGFwcGxpY2F0aW9ucyB3aXRoIEFEVCwgYXMgZGVzY3JpYmVkIGluCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvZWNsaXBzZS1hZHQuaHRtbCI+RGV2ZWxvcGluZyBJbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCisgICAgWW91IG1heSBhbHNvIHdhbnQgdG8gcmVhZAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LAorICAgIHdoaWNoIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLgogPC9wPgogPHA+CiAgICAgQURUIHByb3ZpZGVzIHNldmVyYWwgZmVhdHVyZXMgdGhhdCBoZWxwIHlvdSBzZXQgdXAgYW5kIG1hbmFnZSB5b3VyIHRlc3RpbmcgZW52aXJvbm1lbnQKQEAgLTMyLDIwICsyNywyMCBAQAogICAgICAgICA8bGk+CiAgICAgICAgICAgICBJdCBsZXRzIHlvdSBxdWlja2x5IGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBhbmQgbGluayBpdCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4KICAgICAgICAgICAgIFdoZW4gaXQgY3JlYXRlcyB0aGUgdGVzdCBwcm9qZWN0LCBpdCBhdXRvbWF0aWNhbGx5IGluc2VydHMgdGhlIG5lY2Vzc2FyeQotICAgICAgICAgICAgPGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHRlc3QgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlLgorICAgICAgICAgICAgPGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHRlc3QgcGFja2FnZSdzIG1hbmlmZXN0IGZpbGUuCiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KICAgICAgICAgICAgIEl0IGxldHMgeW91IHF1aWNrbHkgaW1wb3J0IHRoZSBjbGFzc2VzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBzbyB0aGF0IHlvdXIKICAgICAgICAgICAgIHRlc3RzIGNhbiBpbnNwZWN0IHRoZW0uCiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIEl0IGxldHMgeW91IGNyZWF0ZSBydW4gY29uZmlndXJhdGlvbnMgZm9yIHlvdXIgdGVzdCBhcHBsaWNhdGlvbiBhbmQgaW5jbHVkZSBpbgorICAgICAgICAgICAgSXQgbGV0cyB5b3UgY3JlYXRlIHJ1biBjb25maWd1cmF0aW9ucyBmb3IgeW91ciB0ZXN0IHBhY2thZ2UgYW5kIGluY2x1ZGUgaW4KICAgICAgICAgICAgIHRoZW0gZmxhZ3MgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgICBJdCBsZXRzIHlvdSBydW4geW91ciB0ZXN0IGFwcGxpY2F0aW9uIHdpdGhvdXQgbGVhdmluZyBFY2xpcHNlLiBBRFQgYnVpbGRzIGJvdGggdGhlCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCB0aGUgdGVzdCBhcHBsaWNhdGlvbiBhdXRvbWF0aWNhbGx5LCBpbnN0YWxscyB0aGVtIGlmCi0gICAgICAgICAgICBuZWNlc3NhcnkgdG8geW91ciBkZXZpY2Ugb3IgZW11bGF0b3IsIHJ1bnMgdGhlIHRlc3QgYXBwbGljYXRpb24sIGFuZCBkaXNwbGF5cyB0aGUKKyAgICAgICAgICAgIEl0IGxldHMgeW91IHJ1biB5b3VyIHRlc3QgcGFja2FnZSB3aXRob3V0IGxlYXZpbmcgRWNsaXBzZS4gQURUIGJ1aWxkcyBib3RoIHRoZQorICAgICAgICAgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBhbmQgdGhlIHRlc3QgcGFja2FnZSBhdXRvbWF0aWNhbGx5LCBpbnN0YWxscyB0aGVtIGlmCisgICAgICAgICAgICBuZWNlc3NhcnkgdG8geW91ciBkZXZpY2Ugb3IgZW11bGF0b3IsIHJ1bnMgdGhlIHRlc3QgcGFja2FnZSwgYW5kIGRpc3BsYXlzIHRoZQogICAgICAgICAgICAgcmVzdWx0cyBpbiBhIHNlcGFyYXRlIHdpbmRvdyBpbiBFY2xpcHNlLgogICAgICAgICA8L2xpPgogICAgIDwvdWw+CkBAIC01NSwzMDUgKzUwLDQ1MiBAQAogICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgogPC9wPgogPGgyIGlkPSJDcmVhdGVUZXN0UHJvamVjdEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBQcm9qZWN0PC9oMj4KLSAgPHA+Cis8cD4KICAgICBUbyBzZXQgdXAgYSB0ZXN0IGVudmlyb25tZW50IGZvciB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24sIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSBhIHNlcGFyYXRlCi0gICAgYXBwbGljYXRpb24gcHJvamVjdCB0aGF0IGhvbGRzIHRoZSB0ZXN0IGNvZGUuIFRoZSBuZXcgcHJvamVjdCBmb2xsb3dzIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCisgICAgcHJvamVjdCB0aGF0IGhvbGRzIHRoZSB0ZXN0IGNvZGUuIFRoZSBuZXcgcHJvamVjdCBmb2xsb3dzIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCiAgICAgdXNlZCBmb3IgYW55IEFuZHJvaWQgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHRoZSBzYW1lIHR5cGVzIG9mIGNvbnRlbnQgYW5kIGZpbGVzLCBzdWNoIGFzCi0gICAgc291cmNlIGNvZGUsIHJlc291cmNlcywgYSBtYW5pZmVzdCBmaWxlLCBhbmQgc28gZm9ydGguIFRoZSB0ZXN0IGFwcGxpY2F0aW9uIHlvdQorICAgIHNvdXJjZSBjb2RlLCByZXNvdXJjZXMsIGEgbWFuaWZlc3QgZmlsZSwgYW5kIHNvIGZvcnRoLiBUaGUgdGVzdCBwYWNrYWdlIHlvdQogICAgIGNyZWF0ZSBpcyBjb25uZWN0ZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYnkgYW4KICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPgogICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudCBpbiBpdHMgbWFuaWZlc3QgZmlsZS4KLSAgPC9wPgotICA8cD4KLSAgICBUaGUgPHN0cm9uZz5OZXcgQW5kcm9pZCBUZXN0IFByb2plY3Q8L3N0cm9uZz4gZGlhbG9nIG1ha2VzIGl0IGVhc3kgZm9yIHlvdSB0byBnZW5lcmF0ZSBhCi0gICAgbmV3IHRlc3QgcHJvamVjdCB0aGF0IGhhcyB0aGUgcHJvcGVyIHN0cnVjdHVyZSwgaW5jbHVkaW5nIHRoZQotICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBtYW5pZmVzdCBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgTmV3IEFuZHJvaWQKLSAgICBUZXN0IFByb2plY3QgZGlhbG9nIHRvIGdlbmVyYXRlIHRoZSB0ZXN0IHByb2plY3QgYXQgYW55IHRpbWUuIFRoZSBkaWFsb2cgYXBwZWFycyBqdXN0IGFmdGVyIHlvdQotICAgIGNyZWF0ZSBhIG5ldyBBbmRyb2lkIG1haW4gYXBwbGljYXRpb24gcHJvamVjdCwgYnV0IHlvdSBjYW4gYWxzbyBydW4gaXQgdG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0Ci0gICAgZm9yIGEgcHJvamVjdCB0aGF0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHkuCi0gIDwvcD4KKzwvcD4KIDxwPgotICBUbyBjcmVhdGUgYSB0ZXN0IHByb2plY3QgaW4gRWNsaXBzZSB3aXRoIEFEVDoKKyAgICBUaGUgPGVtPk5ldyBBbmRyb2lkIFRlc3QgUHJvamVjdDwvZW0+IGRpYWxvZyBtYWtlcyBpdCBlYXN5IGZvciB5b3UgdG8gZ2VuZXJhdGUgYQorICAgIG5ldyB0ZXN0IHByb2plY3QgdGhhdCBoYXMgdGhlIHByb3BlciBzdHJ1Y3R1cmUsIGluY2x1ZGluZyB0aGUKKyAgICA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgbWFuaWZlc3QgZmlsZS4gWW91IGNhbiB1c2UgdGhlIE5ldworICAgIEFuZHJvaWQgVGVzdCBQcm9qZWN0IGRpYWxvZyB0byBnZW5lcmF0ZSB0aGUgdGVzdCBwcm9qZWN0IGF0IGFueSB0aW1lLiBUaGUgZGlhbG9nIGFwcGVhcnMKKyAgICBqdXN0IGFmdGVyIHlvdSBjcmVhdGUgYSBuZXcgQW5kcm9pZCBtYWluIGFwcGxpY2F0aW9uIHByb2plY3QsIGJ1dCB5b3UgY2FuIGFsc28gcnVuIGl0IHRvCisgICAgY3JlYXRlIGEgdGVzdCBwcm9qZWN0IGZvciBhIHByb2plY3QgdGhhdCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LgorPC9wPgorPHA+CisgICAgVG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aCBBRFQ6CiA8L3A+CiA8b2w+Ci0gIDxsaT4KLSAgICBJbiBFY2xpcHNlLCBzZWxlY3QgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgT3RoZXI8L3N0cm9uZz4uIFRoaXMKLSAgICBvcGVucyB0aGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZy4KLSAgPC9saT4KLSAgPGxpPgotICAgIEluIHRoZSBkaWFsb2csIGluIHRoZSBXaXphcmRzIGRyb3AtZG93biBsaXN0LAotICAgIGZpbmQgdGhlIGVudHJ5IGZvciBBbmRyb2lkLCB0aGVuIGNsaWNrIHRoZSB0b2dnbGUgdG8gdGhlIGxlZnQuIFNlbGVjdAotICAgIEFuZHJvaWQgVGVzdCBQcm9qZWN0LCB0aGVuIGF0IHRoZSBib3R0b20KLSAgICBvZiB0aGUgZGlhbG9nIGNsaWNrIE5leHQuIFRoZSBOZXcgQW5kcm9pZCBUZXN0IFByb2plY3Qgd2l6YXJkIGFwcGVhcnMuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBFbnRlciBhIHByb2plY3QgbmFtZS4gWW91IG1heSB1c2UgYW55IG5hbWUsIGJ1dCB5b3UgbWF5IHdhbnQgdG8KLSAgICBhc3NvY2lhdGUgdGhlIG5hbWUgd2l0aCB0aGUgcHJvamVjdCBuYW1lIGZvciB5b3VyIEFwcGxpY2F0aW9uLiBPbmUKLSAgICB3YXkgdG8gZG8gdGhpcyBpcyB0byB0YWtlIHRoZSBBcHBsaWNhdGlvbidzIHByb2plY3QgbmFtZSwgYXBwZW5kIHRoZQotICAgIHN0cmluZyAiVGVzdCIgdG8gaXQsIGFuZCB0aGVuIHVzZSB0aGlzIGFzIHRoZSB0ZXN0IGNhc2UgcHJvamVjdCBuYW1lLgotICA8L2xpPgotICA8bGk+Ci0gICAgSW4gdGhlIFRlc3QgVGFyZ2V0IHBhbmVsLCBzZXQKLSAgICBBbiBFeGlzdGluZyBBbmRyb2lkIFByb2plY3QsIGNsaWNrCi0gICAgQnJvd3NlLCB0aGVuIHNlbGVjdCB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24gZnJvbQotICAgIHRoZSBsaXN0LiBZb3Ugbm93IHNlZSB0aGF0IHRoZSB3aXphcmQgaGFzIGNvbXBsZXRlZCB0aGUgVGVzdAotICAgIFRhcmdldCBQYWNrYWdlLCBBcHBsaWNhdGlvbiBOYW1lLCBhbmQKLSAgICBQYWNrYWdlIE5hbWUgZmllbGRzIGZvciB5b3UgKHRoZSBsYXR0ZXIgdHdvIGFyZSBpbgotICAgIHRoZSBQcm9wZXJ0aWVzIHBhbmVsKS4KLSAgPC9saT4KLSAgPGxpPgotICAgIEluIHRoZSBCdWlsZCBUYXJnZXQgcGFuZWwsIHNlbGVjdCB0aGUgQW5kcm9pZCBTREsKLSAgICBwbGF0Zm9ybSB0aGF0IHlvdSB3aWxsIHVzZSB0byB0ZXN0IHlvdXIgYXBwbGljYXRpb24uIE1ha2UgdGhpcyB0aGUgc2FtZSBhcyB0aGUKLSAgICBidWlsZCB0YXJnZXQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBDbGljayBGaW5pc2ggdG8gY29tcGxldGUgdGhlIHdpemFyZC4gSWYKLSAgICBGaW5pc2ggaXMgZGlzYWJsZWQsIGxvb2sKLSAgICBmb3IgZXJyb3IgbWVzc2FnZXMgYXQgdGhlIHRvcCBvZiB0aGUgd2l6YXJkIGRpYWxvZywgYW5kIHRoZW4gZml4Ci0gICAgYW55IHByb2JsZW1zLgotICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSW4gRWNsaXBzZSwgc2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zdHJvbmc+LiBUaGlzIG9wZW5zIHRoZSA8ZW0+U2VsZWN0IGEKKyAgICAgICAgV2l6YXJkPC9lbT4gZGlhbG9nLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgZGlhbG9nLCBpbiB0aGUgPGVtPldpemFyZHM8L2VtPiBkcm9wLWRvd24gbGlzdCwgZmluZCB0aGUgZW50cnkgZm9yIEFuZHJvaWQsIHRoZW4KKyAgICAgICAgY2xpY2sgdGhlIHRvZ2dsZSB0byB0aGUgbGVmdC4gU2VsZWN0IDxzdHJvbmc+QW5kcm9pZCBUZXN0IFByb2plY3Q8L3N0cm9uZz4sIHRoZW4gYXQgdGhlCisgICAgICAgIGJvdHRvbSBvZiB0aGUgZGlhbG9nIGNsaWNrIDxzdHJvbmc+TmV4dDwvc3Ryb25nPi4gVGhlIDxlbT5OZXcgQW5kcm9pZCBUZXN0IFByb2plY3Q8L2VtPgorICAgICAgICB3aXphcmQgYXBwZWFycy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTmV4dCB0byA8ZW0+VGVzdCBQcm9qZWN0IE5hbWU8L2VtPiwgZW50ZXIgYSBuYW1lIGZvciB0aGUgcHJvamVjdC4gWW91IG1heSB1c2UgYW55IG5hbWUsCisgICAgICAgIGJ1dCB5b3UgbWF5IHdhbnQgdG8gYXNzb2NpYXRlIHRoZSBuYW1lIHdpdGggdGhlIHByb2plY3QgbmFtZSBmb3IgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgICAgICAgIE9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0byB0YWtlIHRoZSBhcHBsaWNhdGlvbidzIHByb2plY3QgbmFtZSwgYXBwZW5kIHRoZSBzdHJpbmcgIlRlc3QiIHRvCisgICAgICAgIGl0LCBhbmQgdGhlbiB1c2UgdGhpcyBhcyB0aGUgdGVzdCBwYWNrYWdlIHByb2plY3QgbmFtZS4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIHN1Z2dlc3RlZCBwcm9qZWN0IHBhdGgsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0aGlzIGluIHRoZQorICAgICAgICAgICAgbmV4dCBzdGVwLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSA8ZW0+Q29udGVudDwvZW0+IHBhbmVsLCBleGFtaW5lIHRoZSBzdWdnZXN0ZWQgcGF0aCB0byB0aGUgcHJvamVjdC4KKyAgICAgICAgSWYgPGVtPlVzZSBkZWZhdWx0IGxvY2F0aW9uPC9lbT4gaXMgc2V0LCB0aGVuIHRoZSB3aXphcmQgd2lsbCBzdWdnZXN0IGEgcGF0aCB0aGF0IGlzCisgICAgICAgIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgd29ya3NwYWNlIHBhdGggYW5kIHRoZSBwcm9qZWN0IG5hbWUgeW91IGVudGVyZWQuIEZvciBleGFtcGxlLAorICAgICAgICBpZiB5b3VyIHdvcmtzcGFjZSBwYXRoIGlzIDxjb2RlPi91c3IvbG9jYWwvd29ya3NwYWNlPC9jb2RlPiBhbmQgeW91ciBwcm9qZWN0IG5hbWUgaXMKKyAgICAgICAgPGNvZGU+TXlUZXN0QXBwPC9jb2RlPiwgdGhlbiB0aGUgd2l6YXJkIHdpbGwgc3VnZ2VzdAorICAgICAgICA8Y29kZT4vdXNyL2xvY2FsL3dvcmtzcGFjZS9NeVRlc3RBcHA8L2NvZGU+LiBUbyBlbnRlciB5b3VyIG93bgorICAgICAgICBjaG9pY2UgZm9yIGEgcGF0aCwgdW5zZWxlY3QgPGVtPlVzZSBkZWZhdWx0IGxvY2F0aW9uPC9lbT4sIHRoZW4gZW50ZXIgb3IgYnJvd3NlIHRvIHRoZQorICAgICAgICBwYXRoIHdoZXJlIHlvdSB3YW50IHlvdXIgcHJvamVjdC4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUbyBsZWFybiBtb3JlIGFib3V0IGNob29zaW5nIHRoZSBsb2NhdGlvbiBvZiB0ZXN0IHByb2plY3RzLCBwbGVhc2UgcmVhZAorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sI1Rlc3RQcm9qZWN0UGF0aHMiPgorICAgICAgICAgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSBUZXN0IFRhcmdldCBwYW5lbCwgc2V0IEFuIEV4aXN0aW5nIEFuZHJvaWQgUHJvamVjdCwgY2xpY2sgQnJvd3NlLCB0aGVuIHNlbGVjdCB5b3VyCisgICAgICAgIEFuZHJvaWQgYXBwbGljYXRpb24gZnJvbSB0aGUgbGlzdC4gWW91IG5vdyBzZWUgdGhhdCB0aGUgd2l6YXJkIGhhcyBjb21wbGV0ZWQgdGhlIFRlc3QKKyAgICAgICAgVGFyZ2V0IFBhY2thZ2UsIEFwcGxpY2F0aW9uIE5hbWUsIGFuZCBQYWNrYWdlIE5hbWUgZmllbGRzIGZvciB5b3UgKHRoZSBsYXR0ZXIgdHdvIGFyZSBpbgorICAgICAgICB0aGUgUHJvcGVydGllcyBwYW5lbCkuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSBCdWlsZCBUYXJnZXQgcGFuZWwsIHNlbGVjdCB0aGUgQW5kcm9pZCBTREsgcGxhdGZvcm0gdGhhdCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdAorICAgICAgICB1c2VzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBDbGljayBGaW5pc2ggdG8gY29tcGxldGUgdGhlIHdpemFyZC4gSWYgRmluaXNoIGlzIGRpc2FibGVkLCBsb29rIGZvciBlcnJvciBtZXNzYWdlcyBhdCB0aGUKKyAgICAgICAgdG9wIG9mIHRoZSB3aXphcmQgZGlhbG9nLCBhbmQgdGhlbiBmaXggYW55IHByb2JsZW1zLgorICAgIDwvbGk+Cis8L29sPgorPGgyIGlkPSJDcmVhdGVUZXN0QXBwRWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IFBhY2thZ2U8L2gyPgorPHA+CisgICAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgdGVzdCBwcm9qZWN0LCB5b3UgcG9wdWxhdGUgaXQgd2l0aCBhIHRlc3QgcGFja2FnZS4gVGhpcyBwYWNrYWdlIGRvZXMgbm90CisgICAgcmVxdWlyZSBhbiBBY3Rpdml0eSwgYWx0aG91Z2ggeW91IGNhbiBkZWZpbmUgb25lIGlmIHlvdSB3aXNoLiBBbHRob3VnaCB5b3VyIHRlc3QgcGFja2FnZSBjYW4KKyAgICBjb21iaW5lIEFjdGl2aXR5IGNsYXNzZXMsIHRlc3QgY2FzZSBjbGFzc2VzLCBvciBvcmRpbmFyeSBjbGFzc2VzLCB5b3VyIG1haW4gdGVzdCBjYXNlCisgICAgc2hvdWxkIGV4dGVuZCBvbmUgb2YgdGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgb3IgSlVuaXQgY2xhc3NlcywgYmVjYXVzZSB0aGVzZSBwcm92aWRlIHRoZQorICAgIGJlc3QgdGVzdGluZyBmZWF0dXJlcy4KKzwvcD4KKzxwPgorICAgIFRlc3QgcGFja2FnZXMgZG8gbm90IG5lZWQgdG8gaGF2ZSBhbiBBbmRyb2lkIEdVSS4gV2hlbiB5b3UgcnVuIHRoZSBwYWNrYWdlIGluCisgICAgRWNsaXBzZSB3aXRoIEFEVCwgaXRzIHJlc3VsdHMgYXBwZWFyIGluIHRoZSBKVW5pdCB2aWV3LiBSdW5uaW5nIHRlc3RzIGFuZCBzZWVpbmcgdGhlIHJlc3VsdHMgaXMKKyAgICBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gPGEgaHJlZj0iI1J1blRlc3RFY2xpcHNlIj5SdW5uaW5nIFRlc3RzPC9hPi4KKzwvcD4KKworPHA+CisgICAgVG8gY3JlYXRlIGEgdGVzdCBwYWNrYWdlLCBzdGFydCB3aXRoIG9uZSBvZiBBbmRyb2lkJ3MgdGVzdCBjYXNlIGNsYXNzZXMgZGVmaW5lZCBpbgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QgYW5kcm9pZC50ZXN0fS4gVGhlc2UgZXh0ZW5kIHRoZSBKVW5pdAorICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGNsYXNzLiBUaGUgQW5kcm9pZCB0ZXN0IGNsYXNzZXMgZm9yIEFjdGl2aXR5IG9iamVjdHMKKyAgICBhbHNvIHByb3ZpZGUgaW5zdHJ1bWVudGF0aW9uIGZvciB0ZXN0aW5nIGFuIEFjdGl2aXR5LiBUbyBsZWFybiBtb3JlIGFib3V0IHRlc3QgY2FzZQorICAgIGNsYXNzZXMsIHBsZWFzZSByZWFkIHRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPgorICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPi4KKzwvcD4KKzxwPgorICAgIEJlZm9yZSB5b3UgY3JlYXRlIHlvdXIgdGVzdCBwYWNrYWdlLCB5b3UgY2hvb3NlIHRoZSBKYXZhIHBhY2thZ2UgaWRlbnRpZmllciB5b3Ugd2FudCB0byB1c2UKKyAgICBmb3IgeW91ciB0ZXN0IGNhc2UgY2xhc3NlcyBhbmQgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIHlvdSB3YW50IHRvIHVzZS4gVG8gbGVhcm4gbW9yZQorICAgIGFib3V0IHRoaXMsIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sI1BhY2thZ2VOYW1lcyI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPHA+CisgICAgVG8gYWRkIGEgdGVzdCBjYXNlIGNsYXNzIHRvIHlvdXIgcHJvamVjdDoKKzwvcD4KKzxvbD4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSA8ZW0+UHJvamVjdCBFeHBsb3JlcjwvZW0+IHRhYiwgb3BlbiB5b3VyIHRlc3QgcHJvamVjdCwgdGhlbiBvcGVuIHRoZSA8ZW0+c3JjPC9lbT4KKyAgICAgICAgZm9sZGVyLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBGaW5kIHRoZSBKYXZhIHBhY2thZ2UgaWRlbnRpZmllciBzZXQgYnkgdGhlIHByb2plY3Rpb24gY3JlYXRpb24gd2l6YXJkLiBJZiB5b3UgaGF2ZW4ndAorICAgICAgICBhZGRlZCBjbGFzc2VzIHlldCwgdGhpcyBub2RlIHdvbid0IGhhdmUgYW55IGNoaWxkcmVuLCBhbmQgaXRzIGljb24gd2lsbCBub3QgYmUgZmlsbGVkIGluLgorICAgICAgICBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGlkZW50aWZpZXIgdmFsdWUsIHJpZ2h0LWNsaWNrIHRoZSBpZGVudGlmaWVyIGFuZCBzZWxlY3QKKyAgICAgICAgPHN0cm9uZz5SZWZhY3Rvcjwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+UmVuYW1lPC9zdHJvbmc+LCB0aGVuIGVudGVyIHRoZSBuZXcgbmFtZS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgV2hlbiB5b3UgYXJlIHJlYWR5LCByaWdodC1jbGljayB0aGUgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXIgYWdhaW4gYW5kIHNlbGVjdAorICAgICAgICA8c3Ryb25nPk5ldzwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+Q2xhc3M8L3N0cm9uZz4uIFRoaXMgZGlzcGxheXMgdGhlIDxlbT5OZXcgSmF2YSBDbGFzczwvZW0+CisgICAgICAgIGRpYWxvZywgd2l0aCB0aGUgPGVtPlNvdXJjZSBmb2xkZXI8L2VtPiBhbmQgPGVtPlBhY2thZ2U8L2VtPiB2YWx1ZXMgYWxyZWFkeSBzZXQuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSA8ZW0+TmFtZTwvZW0+IGZpZWxkLCBlbnRlciBhIG5hbWUgZm9yIHRoZSB0ZXN0IGNhc2UgY2xhc3MuIE9uZSB3YXkgdG8gY2hvb3NlIGEKKyAgICAgICAgY2xhc3MgbmFtZSBpcyB0byBhcHBlbmQgdGhlIHN0cmluZyAiVGVzdCIgdG8gdGhlIGNsYXNzIG9mIHRoZSBjb21wb25lbnQgeW91IGFyZSB0ZXN0aW5nLgorICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB0ZXN0aW5nIHRoZSBjbGFzcyBNeUFwcEFjdGl2aXR5LCB5b3VyIHRlc3QgY2FzZSBjbGFzcworICAgICAgICBuYW1lIHdvdWxkIGJlIE15QXBwQWN0aXZpdHlUZXN0LiBMZWF2ZSB0aGUgbW9kaWZpZXJzIHNldCB0byA8ZW0+cHVibGljPC9lbT4uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSA8ZW0+U3VwZXJjbGFzczwvZW0+IGZpZWxkLCBlbnRlciB0aGUgbmFtZSBvZiB0aGUgQW5kcm9pZCB0ZXN0IGNhc2UgY2xhc3MgeW91CisgICAgICAgIGFyZSBleHRlbmRpbmcuIFlvdSBjYW4gYWxzbyBicm93c2UgdGhlIGF2YWlsYWJsZSBjbGFzc2VzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiA8ZW0+V2hpY2ggbWV0aG9kIHN0dWJzIHdvdWxkIHlvdSBsaWtlIHRvIGNyZWF0ZT88L2VtPiwgdW5zZXQgYWxsIHRoZSBvcHRpb25zLCB0aGVuCisgICAgICAgIGNsaWNrIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+LiBZb3Ugd2lsbCBzZXQgdXAgdGhlIGNvbnN0cnVjdG9yIG1hbnVhbGx5LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBZb3VyIG5ldyBjbGFzcyBhcHBlYXJzIGluIGEgbmV3IEphdmEgZWRpdG9yIHBhbmUuCisgICAgPC9saT4KIDwvb2w+CiA8cD4KLQotPC9wPgotPGgyIGlkPSJDcmVhdGVUZXN0QXBwRWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IEFwcGxpY2F0aW9uPC9oMj4KLTxwPgotICBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgYSB0ZXN0IHByb2plY3QsIHlvdSBwb3B1bGF0ZSBpdCB3aXRoIGEgdGVzdAotICBBbmRyb2lkIGFwcGxpY2F0aW9uLiBUaGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IEFjdGl2aXR5fSwKLSAgYWx0aG91Z2ggeW91IGNhbiBkZWZpbmUgb25lIGlmIHlvdSB3aXNoLiBBbHRob3VnaCB5b3VyIHRlc3QgYXBwbGljYXRpb24gY2FuCi0gIGNvbWJpbmUgQWN0aXZpdGllcywgQW5kcm9pZCB0ZXN0IGNsYXNzIGV4dGVuc2lvbnMsIEpVbml0IGV4dGVuc2lvbnMsIG9yCi0gIG9yZGluYXJ5IGNsYXNzZXMsIHlvdSBzaG91bGQgZXh0ZW5kIG9uZSBvZiB0aGUgQW5kcm9pZCB0ZXN0IGNsYXNzZXMgb3IgSlVuaXQgY2xhc3NlcywKLSAgYmVjYXVzZSB0aGVzZSBwcm92aWRlIHRoZSBiZXN0IHRlc3RpbmcgZmVhdHVyZXMuCisgICAgWW91IG5vdyBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb25zdHJ1Y3RvciBpcyBzZXQgdXAgY29ycmVjdGx5LiBDcmVhdGUgYSBjb25zdHJ1Y3RvciBmb3IgeW91cgorICAgIGNsYXNzIHRoYXQgaGFzIG5vIGFyZ3VtZW50czsgdGhpcyBpcyByZXF1aXJlZCBieSBKVW5pdC4gQXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGlzCisgICAgY29uc3RydWN0b3IsIGFkZCBhIGNhbGwgdG8gdGhlIGJhc2UgY2xhc3MnIGNvbnN0cnVjdG9yLiBFYWNoIGJhc2UgdGVzdCBjYXNlIGNsYXNzIGhhcyBpdHMKKyAgICBvd24gY29uc3RydWN0b3Igc2lnbmF0dXJlLiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIDwvcD4KIDxwPgotICBUZXN0IGFwcGxpY2F0aW9ucyBkbyBub3QgaGF2ZSBhbiBBbmRyb2lkIEdVSS4gSW5zdGVhZCwgd2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBpbgotICBFY2xpcHNlIHdpdGggQURULCBpdHMgcmVzdWx0cyBhcHBlYXIgaW4gdGhlIEpVbml0IHZpZXcuIElmIHlvdSBydW4KLSAgeW91ciB0ZXN0cyB3aXRoIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSAob3IgYSByZWxhdGVkIHRlc3QgcnVubmVyKSwKLSAgdGhlbiBpdCB3aWxsIHJ1biBhbGwgdGhlIG1ldGhvZHMgaW4gZWFjaCBjbGFzcy4gWW91IGNhbiBtb2RpZnkgdGhpcyBiZWhhdmlvcgotICBieSB1c2luZyB0aGUge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUgVGVzdFN1aXRlfSBjbGFzcy4KLTwvcD4KLQotPHA+Ci0gIFRvIGNyZWF0ZSBhIHRlc3QgYXBwbGljYXRpb24sIHN0YXJ0IHdpdGggb25lIG9mIEFuZHJvaWQncyB0ZXN0IGNsYXNzZXMgaW4gdGhlIEphdmEgcGFja2FnZSB7QGxpbmsgYW5kcm9pZC50ZXN0IGFuZHJvaWQudGVzdH0uCi0gIFRoZXNlIGV4dGVuZCB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MuIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgdGhlIEFuZHJvaWQgdGVzdCBjbGFzc2VzCi0gIGFsc28gcHJvdmlkZSBpbnN0cnVtZW50YXRpb24gZm9yIHRlc3RpbmcuCi08L3A+Ci08cD4KLSAgRm9yIHRlc3QgY2xhc3NlcyB0aGF0IGV4dGVuZCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSwgeW91IHByb2JhYmx5IHdhbnQgdG8gb3ZlcnJpZGUKLSAgdGhlIDxjb2RlPnNldFVwKCk8L2NvZGU+IGFuZCA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiBtZXRob2RzOgorICAgIFRvIGNvbnRyb2wgeW91ciB0ZXN0IGVudmlyb25tZW50LCB5b3Ugd2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQKKyAgICA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiBtZXRob2RzOgogPC9wPgogPHVsPgotICA8bGk+Ci0gICAgPGNvZGU+c2V0VXAoKTwvY29kZT46IFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGFueSBvZiB0aGUgdGVzdCBtZXRob2RzIGluIHRoZSBjbGFzcy4KLSAgICAgIFVzZSBpdCB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdC4gWW91IGNhbiB1c2UgPGNvZGU+c2V0VXAoKTwvY29kZT4KLSAgICAgIHRvIGluc3RhbnRpYXRlIGEgbmV3IDxjb2RlPkludGVudDwvY29kZT4gb2JqZWN0IHdpdGggdGhlIGFjdGlvbiA8Y29kZT5BQ1RJT05fTUFJTjwvY29kZT4uIFlvdSBjYW4KLSAgICAgIHRoZW4gdXNlIHRoaXMgaW50ZW50IHRvIHN0YXJ0IHRoZSBBY3Rpdml0eSB1bmRlciB0ZXN0LgotICAgICAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBjYWxsCi0gICAgICAgIDxjb2RlPnN1cGVyLnNldFVwKCk8L2NvZGU+IGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4geW91ciBjb2RlLgotICAgICAgPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPGNvZGU+dGVhckRvd24oKTwvY29kZT46IFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYWZ0ZXIgYWxsIHRoZSB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzLiBVc2UKLSAgICBpdCB0byBkbyBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHJlLXNldHRpbmcgYmVmb3JlIG1vdmluZyBvbiB0byB0aGUgbmV4dCBzZXQgb2YgdGVzdHMuCi0gICAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCB5b3UgbXVzdCBjYWxsCi0gICAgPGNvZGU+c3VwZXIudGVhckRvd24oKTwvY29kZT4gYXMgdGhlIDxlbT5sYXN0PC9lbT4gc3RhdGVtZW50IGluIHlvdXIgY29kZS48L3A+Ci0gIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8Y29kZT5zZXRVcCgpPC9jb2RlPjogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBiZWZvcmUgYW55IG9mIHRoZSB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzLgorICAgICAgICBVc2UgaXQgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QgKHRoZSB0ZXN0IGZpeHR1cmUuIFlvdSBjYW4gdXNlCisgICAgICAgIDxjb2RlPnNldFVwKCk8L2NvZGU+IHRvIGluc3RhbnRpYXRlIGEgbmV3IEludGVudCB3aXRoIHRoZSBhY3Rpb24gPGNvZGU+QUNUSU9OX01BSU48L2NvZGU+LgorICAgICAgICBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgaW50ZW50IHRvIHN0YXJ0IHRoZSBBY3Rpdml0eSB1bmRlciB0ZXN0LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8Y29kZT50ZWFyRG93bigpPC9jb2RlPjogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBhZnRlciBhbGwgdGhlIHRlc3QgbWV0aG9kcyBpbiB0aGUgY2xhc3MuIFVzZQorICAgICAgICBpdCB0byBkbyBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHRvIHJlc2V0IHRoZSB0ZXN0IGZpeHR1cmUuCisgICAgPC9saT4KIDwvdWw+CiA8cD4KLSAgQW5vdGhlciB1c2VmdWwgY29udmVudGlvbiBpcyB0byBhZGQgdGhlIG1ldGhvZCA8Y29kZT50ZXN0UHJlQ29uZGl0aW9ucygpPC9jb2RlPiB0byB5b3VyIHRlc3QKLSAgY2xhc3MuIFVzZSB0aGlzIG1ldGhvZCB0byB0ZXN0IHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5LiBJZiB0aGlzCi0gIHRlc3QgZmFpbHMsIHlvdSBrbm93IHRoYXQgdGhhdCB0aGUgaW5pdGlhbCBjb25kaXRpb25zIHdlcmUgaW4gZXJyb3IuIFdoZW4gdGhpcyBoYXBwZW5zLCBmdXJ0aGVyIHRlc3QKLSAgcmVzdWx0cyBhcmUgc3VzcGVjdCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgdGVzdHMgc3VjY2VlZGVkLgorICAgIEFub3RoZXIgdXNlZnVsIGNvbnZlbnRpb24gaXMgdG8gYWRkIHRoZSBtZXRob2QgPGNvZGU+dGVzdFByZWNvbmRpdGlvbnMoKTwvY29kZT4gdG8geW91ciB0ZXN0CisgICAgY2xhc3MuIFVzZSB0aGlzIG1ldGhvZCB0byB0ZXN0IHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5LiBJZiB0aGlzCisgICAgdGVzdCBmYWlscywgeW91IGtub3cgdGhhdCB0aGF0IHRoZSBpbml0aWFsIGNvbmRpdGlvbnMgd2VyZSBpbiBlcnJvci4gV2hlbiB0aGlzIGhhcHBlbnMsIGZ1cnRoZXIKKyAgICB0ZXN0IHJlc3VsdHMgYXJlIHN1c3BlY3QsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlIHRlc3RzIHN1Y2NlZWRlZC4KIDwvcD4KIDxwPgotICBUaGUgUmVzb3VyY2VzIHRhYiBjb250YWlucyBhbiA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KLSAgdHV0b3JpYWwgd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNyZWF0aW5nIHRlc3QgY2xhc3NlcyBhbmQgbWV0aG9kcy4KKyAgICBUaGUgUmVzb3VyY2VzIHRhYiBjb250YWlucyBhbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgorICAgIHR1dG9yaWFsIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjcmVhdGluZyB0ZXN0IGNsYXNzZXMgYW5kIG1ldGhvZHMuCiA8L3A+CiA8aDIgaWQ9IlJ1blRlc3RFY2xpcHNlIj5SdW5uaW5nIFRlc3RzPC9oMj4KKyAgICA8ZGl2IGNsYXNzPSJzaWRlYm94LXdyYXBwZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYm94Ij4KKyAgICAgICAgICAgIDxoMj5SdW5uaW5nIHRlc3RzIGZyb20gdGhlIGNvbW1hbmQgbGluZTwvaDI+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIElmIHlvdSd2ZSBjcmVhdGVkIHlvdXIgdGVzdHMgaW4gRWNsaXBzZSwgeW91IGNhbiBzdGlsbCBydW4geW91ciB0ZXN0cyBhbmQgdGVzdAorICAgICAgICAgICAgICAgICAgICBzdWl0ZXMgYnkgdXNpbmcgY29tbWFuZC1saW5lIHRvb2xzIGluY2x1ZGVkIHdpdGggdGhlIEFuZHJvaWQgU0RLLiBZb3UgbWF5IHdhbnQKKyAgICAgICAgICAgICAgICAgICAgdG8gZG8gdGhpcywgZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHRlc3RzIHRvIHJ1biwgaWYgeW91CisgICAgICAgICAgICAgICAgICAgIGhhdmUgYSBsYXJnZSB0ZXN0IGNhc2UsIG9yIGlmIHlvdSB3YW50IGEgZmluZSBsZXZlbCBvZiBjb250cm9sIG92ZXIgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgdGVzdHMgYXJlIHJ1biBhdCBhIHBhcnRpY3VsYXIgdGltZS4KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIFRvIHJ1biB0ZXN0cyBjcmVhdGVkIGluIEVjbGlwc2Ugd2l0aCBBRFQgd2l0aCBjb21tYW5kLWxpbmUgdG9vbHMsIHlvdSBtdXN0IGZpcnN0CisgICAgICAgICAgICAgICAgICAgIGluc3RhbGwgYWRkaXRpb25hbCBmaWxlcyBpbnRvIHRoZSB0ZXN0IHByb2plY3QgdXNpbmcgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+CisgICAgICAgICAgICAgICAgICAgIHRvb2wncyAiY3JlYXRlIHRlc3QtcHJvamVjdCIgb3B0aW9uLiBUbyBzZWUgaG93IHRvIGRvIHRoaXMsIHJlYWQKKyAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCNDcmVhdGVQcm9qZWN0Ij4KKyAgICAgICAgICAgICAgICAgICAgVGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPHA+CisgICAgV2hlbiB5b3UgcnVuIGEgdGVzdCBwYWNrYWdlIGluIEVjbGlwc2Ugd2l0aCBBRFQsIHRoZSBvdXRwdXQgYXBwZWFycyBpbiB0aGUgRWNsaXBzZSBKVW5pdCB2aWV3LgorICAgIFlvdSBjYW4gcnVuIHRoZSBlbnRpcmUgdGVzdCBwYWNrYWdlIG9yIG9uZSB0ZXN0IGNhc2UgY2xhc3MuIFRvIGRvIHJ1biB0ZXN0cywgRWNsaXBzZSBydW5zIHRoZQorICAgIDxjb2RlPmFkYjwvY29kZT4gY29tbWFuZCBmb3IgcnVubmluZyBhIHRlc3QgcGFja2FnZSwgYW5kIGRpc3BsYXlzIHRoZSBvdXRwdXQsIHNvIHRoZXJlIGlzIG5vCisgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHJ1bm5pbmcgdGVzdHMgaW5zaWRlIEVjbGlwc2UgYW5kIHJ1bm5pbmcgdGhlbSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCis8L3A+Cis8cD4KKyAgICBBcyB3aXRoIGFueSBvdGhlciBwYWNrYWdlLCB0byBydW4gYSB0ZXN0IHBhY2thZ2UgaW4gRWNsaXBzZSB3aXRoIEFEVCB5b3UgbXVzdCBlaXRoZXIgYXR0YWNoIGEKKyAgICBkZXZpY2UgdG8geW91ciBjb21wdXRlciBvciB1c2UgdGhlIEFuZHJvaWQgZW11bGF0b3IuIElmIHlvdSB1c2UgdGhlIGVtdWxhdG9yLCB5b3UgbXVzdCBoYXZlIGFuCisgICAgQW5kcm9pZCBWaXJ0dWFsIERldmljZSAoQVZEKSB0aGF0IHVzZXMgdGhlIHNhbWUgdGFyZ2V0IGFzIHRoZSB0ZXN0IHBhY2thZ2UuCis8L3A+Cis8cD4KKyAgICBUbyBydW4gYSB0ZXN0IGluIEVjbGlwc2UsIHlvdSBoYXZlIHR3byBjaG9pY2VzOjwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFJ1biBhIHRlc3QganVzdCBhcyB5b3UgcnVuIGFuIGFwcGxpY2F0aW9uLCBieSBzZWxlY3RpbmcKKyAgICAgICAgPHN0cm9uZz5SdW4gQXMuLi4gJmd0OyBBbmRyb2lkIEpVbml0IFRlc3Q8L3N0cm9uZz4gZnJvbSB0aGUgcHJvamVjdCdzIGNvbnRleHQgbWVudSBvcgorICAgICAgICBmcm9tIHRoZSBtYWluIG1lbnUncyA8c3Ryb25nPlJ1bjwvc3Ryb25nPiBpdGVtLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBDcmVhdGUgYW4gRWNsaXBzZSBydW4gY29uZmlndXJhdGlvbiBmb3IgeW91ciB0ZXN0IHByb2plY3QuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50CisgICAgICAgIG11bHRpcGxlIHRlc3Qgc3VpdGVzLCBlYWNoIGNvbnNpc3Rpbmcgb2Ygc2VsZWN0ZWQgdGVzdHMgZnJvbSB0aGUgcHJvamVjdC4gVG8gcnVuCisgICAgICAgIGEgdGVzdCBzdWl0ZSwgeW91IHJ1biB0aGUgdGVzdCBjb25maWd1cmF0aW9uLgorICAgICAgICA8cD4KKyAgICAgICAgICAgIENyZWF0aW5nIGFuZCBydW5uaW5nIHRlc3QgY29uZmlndXJhdGlvbnMgaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorPC91bD4KKzxwPgorICAgIFRvIGNyZWF0ZSBhbmQgcnVuIGEgdGVzdCBzdWl0ZSB1c2luZyBhIHJ1biBjb25maWd1cmF0aW9uOgorPC9wPgorPG9sPgorICAgIDxsaT4KKyAgICAgICAgSW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIsIHNlbGVjdCB0aGUgdGVzdCBwcm9qZWN0LCB0aGVuIGZyb20gdGhlIG1haW4gbWVudSwgc2VsZWN0CisgICAgICAgIDxzdHJvbmc+UnVuICZndDsgUnVuIENvbmZpZ3VyYXRpb25zLi4uPC9zdHJvbmc+LiBUaGUgUnVuIENvbmZpZ3VyYXRpb25zIGRpYWxvZyBhcHBlYXJzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgbGVmdC1oYW5kIHBhbmUsIGZpbmQgdGhlIEFuZHJvaWQgSlVuaXQgVGVzdCBlbnRyeS4gSW4gdGhlIHJpZ2h0LWhhbmQgcGFuZSwgY2xpY2sgdGhlCisgICAgICAgIFRlc3QgdGFiLiBUaGUgTmFtZTogdGV4dCBib3ggc2hvd3MgdGhlIG5hbWUgb2YgeW91ciBwcm9qZWN0LiBUaGUgVGVzdCBjbGFzczogZHJvcGRvd24gYm94CisgICAgICAgIHNob3dzIG9uZSBvZiB0aGUgdGVzdCBjbGFzc2VzIGluIHlvdXIgcHJvamVjdC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVG8gcnVuIG9uZSB0ZXN0IGNsYXNzLCBjbGljayAgUnVuIGEgc2luZ2xlIHRlc3QsIHRoZW4gZW50ZXIgeW91ciBwcm9qZWN0IG5hbWUgaW4gdGhlCisgICAgICAgIFByb2plY3Q6IHRleHQgYm94IGFuZCB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgVGVzdCBjbGFzczogdGV4dCBib3guCisgICAgICAgIDxwPgorICAgICAgICAgICAgVG8gcnVuIGFsbCB0aGUgdGVzdCBjbGFzc2VzLCBjbGljayBSdW4gYWxsIHRlc3RzIGluIHRoZSBzZWxlY3RlZCBwcm9qZWN0IG9yIHBhY2thZ2UsCisgICAgICAgICAgICB0aGVuIGVudGVyIHRoZSBwcm9qZWN0IG9yIHBhY2thZ2UgbmFtZSBpbiB0aGUgdGV4dCBib3guCisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTm93IGNsaWNrIHRoZSBUYXJnZXQgdGFiLgorICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgT3B0aW9uYWw6IElmIHlvdSBhcmUgdXNpbmcgdGhlIGVtdWxhdG9yLCBjbGljayBBdXRvbWF0aWMsIHRoZW4gaW4gdGhlIEFuZHJvaWQKKyAgICAgICAgICAgICAgICBWaXJ0dWFsIERldmljZSAoQVZEKSBzZWxlY3Rpb24gdGFibGUsIHNlbGVjdCBhbiBleGlzdGluZyBBVkQuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIEluIHRoZSBFbXVsYXRvciBMYXVuY2ggUGFyYW1ldGVycyBwYW5lLCBzZXQgdGhlIEFuZHJvaWQgZW11bGF0b3IgZmxhZ3MgeW91IHdhbnQgdG8KKyAgICAgICAgICAgICAgICB1c2UuIFRoZXNlIGFyZSBkb2N1bWVudGVkIGluIHRoZSB0b3BpYworICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwjc3RhcnR1cC1vcHRpb25zIj4KKyAgICAgICAgICAgICAgICBBbmRyb2lkIEVtdWxhdG9yPC9hPi4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIENsaWNrIHRoZSBDb21tb24gdGFiLiBJbiB0aGUgU2F2ZSBBcyBwYW5lLCBjbGljayBMb2NhbCB0byBzYXZlIHRoaXMgcnVuIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgbG9jYWxseSwgb3IgY2xpY2sgU2hhcmVkIHRvIHNhdmUgaXQgdG8gYW5vdGhlciBwcm9qZWN0LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBPcHRpb25hbDogQWRkIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBSdW4gdG9vbGJhciBhbmQgdGhlIDxzdHJvbmc+RmF2b3JpdGVzPC9zdHJvbmc+CisgICAgICAgIG1lbnU6IGluIHRoZSBEaXNwbGF5IGluIEZhdm9yaXRlcyBwYW5lIGNsaWNrIHRoZSBjaGVja2JveCBuZXh0IHRvIFJ1bi4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgT3B0aW9uYWw6IFRvIGFkZCB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gdGhlIDxzdHJvbmc+RGVidWc8L3N0cm9uZz4gbWVudSBhbmQgdG9vbGJhciwgY2xpY2sKKyAgICAgICAgdGhlIGNoZWNrYm94IG5leHQgdG8gRGVidWcuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRvIHNhdmUgeW91ciBzZXR0aW5ncywgY2xpY2sgQ2xvc2UuPGJyLz4KKyAgICAgICAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4KKyAgICAgICAgICAgIEFsdGhvdWdoIHlvdSBjYW4gcnVuIHRoZSB0ZXN0IGltbWVkaWF0ZWx5IGJ5IGNsaWNraW5nIFJ1biwgeW91IHNob3VsZCBzYXZlIHRoZSB0ZXN0CisgICAgICAgICAgICBmaXJzdCBhbmQgdGhlbiBydW4gaXQgYnkgc2VsZWN0aW5nIGl0IGZyb20gdGhlIEVjbGlwc2Ugc3RhbmRhcmQgdG9vbGJhci4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBPbiB0aGUgRWNsaXBzZSBzdGFuZGFyZCB0b29sYmFyLCBjbGljayB0aGUgZG93biBhcnJvdyBuZXh0IHRvIHRoZSBncmVlbiBSdW4gYXJyb3cuIFRoaXMKKyAgICAgICAgZGlzcGxheXMgYSBtZW51IG9mIHNhdmVkIFJ1biBhbmQgRGVidWcgY29uZmlndXJhdGlvbnMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFNlbGVjdCB0aGUgdGVzdCBydW4gY29uZmlndXJhdGlvbiB5b3UganVzdCBjcmVhdGVkLiBUaGUgdGVzdCBzdGFydHMuCisgICAgPC9saT4KKzwvb2w+Cis8cD4KKyAgICBUaGUgcHJvZ3Jlc3Mgb2YgeW91ciB0ZXN0IGFwcGVhcnMgaW4gdGhlIENvbnNvbGUgdmlldyBhcyBhIHNlcmllcyBvZiBtZXNzYWdlcy4gRWFjaCBtZXNzYWdlIGlzCisgICAgcHJlY2VkZWQgYnkgYSB0aW1lc3RhbXAgYW5kIHRoZSA8Y29kZT4uYXBrPC9jb2RlPiBmaWxlbmFtZSB0byB3aGljaCBpdCBhcHBsaWVzLiBGb3IgZXhhbXBsZSwKKyAgICB0aGlzIG1lc3NhZ2UgYXBwZWFycyB3aGVuIHlvdSBydW4gYSB0ZXN0IHRvIHRoZSBlbXVsYXRvciwgYW5kIHRoZSBlbXVsYXRvciBpcyBub3QgeWV0IHN0YXJ0ZWQ6Cis8L3A+CiA8ZGl2IGNsYXNzPSJzaWRlYm94LXdyYXBwZXIiPgogICAgIDxkaXYgY2xhc3M9InNpZGVib3giPgotICAgICAgICA8aDI+UnVubmluZyB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmU8L2gyPgotICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgSWYgeW91J3ZlIGNyZWF0ZWQgeW91ciB0ZXN0cyBpbiBFY2xpcHNlLCB5b3UgY2FuIHN0aWxsIHJ1biB5b3VyIHRlc3RzIGFuZCB0ZXN0Ci0gICAgICAgICAgICAgICAgc3VpdGVzIGJ5IHVzaW5nIGNvbW1hbmQtbGluZSB0b29scyBpbmNsdWRlZCB3aXRoIHRoZSBBbmRyb2lkIFNESy4gWW91IG1heSB3YW50IHRvCi0gICAgICAgICAgICAgICAgZG8gdGhpcywgZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHRlc3RzIHRvIHJ1biwgaWYgeW91IGhhdmUgYQotICAgICAgICAgICAgICAgIGxhcmdlIHRlc3QgY2FzZSwgb3IgaWYgeW91IHdhbnQgYSBmaW5lIGxldmVsIG9mIGNvbnRyb2wgb3ZlciB3aGljaCB0ZXN0cyBhcmUgcnVuIGF0Ci0gICAgICAgICAgICAgICAgYSBwYXJ0aWN1bGFyIHRpbWUuCi0gICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICBUbyBydW4gdGVzdHMgY3JlYXRlZCBpbiBFY2xpcHNlIHdpdGggQURUIHdpdGggY29tbWFuZC1saW5lIHRvb2xzLCB5b3UgbXVzdCBmaXJzdAotICAgICAgICAgICAgICAgIGluc3RhbGwgYWRkaXRpb25hbCBmaWxlcyBpbnRvIHRoZSB0ZXN0IHByb2plY3QgdXNpbmcgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wncwotICAgICAgICAgICAgICAgICJjcmVhdGUgdGVzdC1wcm9qZWN0IiBvcHRpb24uIFRvIHNlZSBob3cgdG8gZG8gdGhpcywgcmVhZCB0aGUgc2VjdGlvbgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sI0NyZWF0ZVByb2plY3QiPgotICAgICAgICAgICAgICAgIENyZWF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPiBpbiB0aGUgdG9waWMKLSAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlcgotICAgICAgICAgICAgICAgIElERXM8L2E+LgotICAgICAgICAgICAgPC9wPgorICAgICAgICA8aDI+TWVzc2FnZSBFeGFtcGxlczwvaDI+CisgICAgICAgIDxwPgorICAgICAgICAgICAgVGhlIGV4YW1wbGVzIHNob3duIGluIHRoaXMgc2VjdGlvbiBjb21lIGZyb20gdGhlCisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvU3Bpbm5lclRlc3QvaW5kZXguaHRtbCI+U3Bpbm5lclRlc3Q8L2E+CisgICAgICAgICAgICBzYW1wbGUgdGVzdCBwYWNrYWdlLCB3aGljaCB0ZXN0cyB0aGUKKyAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9TcGlubmVyL2luZGV4Lmh0bWwiPlNwaW5uZXI8L2E+CisgICAgICAgICAgICBzYW1wbGUgYXBwbGljYXRpb24uIFRoaXMgdGVzdCBwYWNrYWdlIGlzIGFsc28gZmVhdHVyZWQgaW4gdGhlCisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KKyAgICAgICAgICAgIHR1dG9yaWFsLgorICAgICAgICA8L3A+CiAgICAgPC9kaXY+CiA8L2Rpdj4KKzxwcmU+CisgICAgWzxlbT55eXl5LW1tLWRkIGhoOm1tOnNzPC9lbT4gLSA8ZW0+dGVzdGZpbGU8L2VtPl0gV2FpdGluZyBmb3IgSE9NRSAoJ2FuZHJvaWQucHJvY2Vzcy5hY29yZScpIHRvIGJlIGxhdW5jaGVkLi4uCis8L3ByZT4KIDxwPgotICBXaGVuIHlvdSBydW4gYSB0ZXN0IGFwcGxpY2F0aW9uIGluIEVjbGlwc2Ugd2l0aCBBRFQsIHRoZSBvdXRwdXQgYXBwZWFycyBpbgotICBhbiBFY2xpcHNlIHZpZXcgcGFuZWwuIFlvdSBjYW4gcnVuIHRoZSBlbnRpcmUgdGVzdCBhcHBsaWNhdGlvbiwgb25lIGNsYXNzLCBvciBvbmUKLSAgbWV0aG9kIG9mIGEgY2xhc3MuIFRvIGRvIHRoaXMsIEVjbGlwc2UgcnVucyB0aGUgPGNvZGU+YWRiPC9jb2RlPiBjb21tYW5kIGZvciBydW5uaW5nIGEgdGVzdCBhcHBsaWNhdGlvbiwgYW5kCi0gIGRpc3BsYXlzIHRoZSBvdXRwdXQsIHNvIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBydW5uaW5nIHRlc3RzIGluc2lkZSBFY2xpcHNlIGFuZCBydW5uaW5nIHRoZW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICAgIEluIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24gb2YgdGhlc2UgbWVzc2FnZXMsIDxjb2RlPjxlbT5kZXZpY2VuYW1lPC9lbT48L2NvZGU+IGlzIHRoZSBuYW1lIG9mCisgICAgdGhlIGRldmljZSBvciBlbXVsYXRvciB5b3UgYXJlIHVzaW5nIHRvIHJ1biB0aGUgdGVzdCwgYW5kIDxjb2RlPjxlbT5wb3J0PC9lbT48L2NvZGU+IGlzIHRoZQorICAgIHBvcnQgbnVtYmVyIGZvciB0aGUgZGV2aWNlLiBUaGUgbmFtZSBhbmQgcG9ydCBudW1iZXIgYXJlIGluIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUKKyAgICA8Y29kZT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCNkZXZpY2VzdGF0dXMiPmFkYiBkZXZpY2VzPC9hPjwvY29kZT4KKyAgICBjb21tYW5kLiBBbHNvLCA8Y29kZT48ZW0+dGVzdGZpbGU8L2VtPjwvY29kZT4gaXMgdGhlIDxjb2RlPi5hcGs8L2NvZGU+IGZpbGVuYW1lIG9mIHRoZSB0ZXN0CisgICAgcGFja2FnZSB5b3UgYXJlIHJ1bm5pbmcsIGFuZCA8ZW0+YXBwZmlsZTwvZW0+IGlzIHRoZSBmaWxlbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4KIDwvcD4KLTxwPgotICAgIEFzIHdpdGggYW55IG90aGVyIGFwcGxpY2F0aW9uLCB0byBydW4gYSB0ZXN0IGFwcGxpY2F0aW9uIGluIEVjbGlwc2Ugd2l0aCBBRFQgeW91IG11c3QgZWl0aGVyIGF0dGFjaCBhIGRldmljZSB0byB5b3VyCi0gICAgY29tcHV0ZXIgb3IgdXNlIHRoZSBBbmRyb2lkIGVtdWxhdG9yLiBJZiB5b3UgdXNlIHRoZSBlbXVsYXRvciwgeW91IG11c3QgaGF2ZSBhbiBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIChBVkQpIHRoYXQgdXNlcwotICAgIHRoZSBzYW1lIHRhcmdldAotPC9wPgotPHA+Ci0gIFRvIHJ1biBhIHRlc3QgaW4gRWNsaXBzZSwgeW91IGhhdmUgdHdvIGNob2ljZXM6PC9wPgotPG9sPgotICA8bGk+Ci0gIFJ1biBhIHRlc3QganVzdCBhcyB5b3UgcnVuIGFuIGFwcGxpY2F0aW9uLCBieSBzZWxlY3RpbmcKLSAgPHN0cm9uZz5SdW4gQXMuLi4gJmd0OyBBbmRyb2lkIEpVbml0IFRlc3Q8L3N0cm9uZz4gZnJvbSB0aGUgcHJvamVjdCdzIGNvbnRleHQgbWVudSBvcgotICBmcm9tIHRoZSBtYWluIG1lbnUncyA8c3Ryb25nPlJ1bjwvc3Ryb25nPiBpdGVtLgotICA8L2xpPgotICA8bGk+Ci0gIENyZWF0ZSBhbiBFY2xpcHNlIHJ1biBjb25maWd1cmF0aW9uIGZvciB5b3VyIHRlc3QgcHJvamVjdC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgbXVsdGlwbGUgdGVzdCBzdWl0ZXMsIGVhY2ggY29uc2lzdGluZyBvZiBzZWxlY3RlZCB0ZXN0cyBmcm9tIHRoZSBwcm9qZWN0LiBUbyBydW4KLSAgYSB0ZXN0IHN1aXRlLCB5b3UgcnVuIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb24uCi0gIDxwPgotICAgIENyZWF0aW5nIGFuZCBydW5uaW5nIHRlc3QgY29uZmlndXJhdGlvbnMgaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCi0gIDwvcD4KLSAgPC9saT4KLTwvb2w+Ci08cD5UbyBjcmVhdGUgYW5kIHJ1biBhIHRlc3Qgc3VpdGUgdXNpbmcgYSBydW4gY29uZmlndXJhdGlvbjo8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICBJbiB0aGUgUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IHRoZSB0ZXN0Ci0gICAgcHJvamVjdCwgdGhlbiBmcm9tIHRoZSBtYWluIG1lbnUsIHNlbGVjdAotICAgIDxzdHJvbmc+UnVuICZndDsgUnVuIENvbmZpZ3VyYXRpb25zLi4uPC9zdHJvbmc+LiBUaGUKLSAgICBSdW4gQ29uZmlndXJhdGlvbnMgZGlhbG9nIGFwcGVhcnMuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBJbiB0aGUgbGVmdC1oYW5kIHBhbmUsIGZpbmQgdGhlCi0gICAgQW5kcm9pZCBKVW5pdCBUZXN0IGVudHJ5LgotICAgIEluIHRoZSByaWdodC1oYW5kIHBhbmUsIGNsaWNrIHRoZSBUZXN0IHRhYi4KLSAgICBUaGUgTmFtZTogdGV4dCBib3gKLSAgICBzaG93cyB0aGUgbmFtZSBvZiB5b3VyIHByb2plY3QuIFRoZQotICAgIFRlc3QgY2xhc3M6IGRyb3Bkb3duIGJveCBzaG93cyBvbmUgeW91ciBwcm9qZWN0J3MgY2xhc3NlcwotICAgIHRlc3QgY2xhc3NlcyBpbiB5b3VyIHByb2plY3QuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBUbyBydW4gb25lIHRlc3QgY2xhc3MsIGNsaWNrICBSdW4gYSBzaW5nbGUgdGVzdCwgdGhlbiBlbnRlciB5b3VyIHByb2plY3QKLSAgICBuYW1lIGluIHRoZSBQcm9qZWN0OiB0ZXh0IGJveCBhbmQgdGhlIGNsYXNzIG5hbWUgaW4gdGhlCi0gICAgVGVzdCBjbGFzczogdGV4dCBib3guCi0gICAgPHA+Ci0gICAgICAgIFRvIHJ1biBhbGwgdGhlIHRlc3QgY2xhc3NlcywKLSAgICAgICAgY2xpY2sgUnVuIGFsbCB0ZXN0cyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBvciBwYWNrYWdlLAotICAgICAgICB0aGVuIGVudGVyIHRoZSBwcm9qZWN0IG9yIHBhY2thZ2UgbmFtZSBpbiB0aGUgdGV4dCBib3guCi0gICAgPC9wPgotIDwvbGk+Ci0gIDxsaT4KLSAgICBOb3cgY2xpY2sgdGhlIFRhcmdldCB0YWIuCi0gICAgPHVsPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgICBPcHRpb25hbDogSWYgeW91IGFyZSB1c2luZyB0aGUgZW11bGF0b3IsIGNsaWNrCi0gICAgICAgICAgICBBdXRvbWF0aWMsIHRoZW4gaW4gdGhlIEFuZHJvaWQgVmlydHVhbCBEZXZpY2UgKEFWRCkKLSAgICAgICAgICAgIHNlbGVjdGlvbiB0YWJsZSwgc2VsZWN0IGFuIGV4aXN0aW5nIEFWRC4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgICAgSW4gdGhlIEVtdWxhdG9yIExhdW5jaCBQYXJhbWV0ZXJzIHBhbmUsIHNldCB0aGUKLSAgICAgICAgICAgIEFuZHJvaWQgZW11bGF0b3IgZmxhZ3MgeW91IHdhbnQgdG8gdXNlLiBUaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgdG9waWMKLSAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwjc3RhcnR1cC1vcHRpb25zIj5FbXVsYXRvciBTdGFydHVwIE9wdGlvbnM8L2E+LgotICAgICAgICA8L2xpPgotICAgIDwvdWw+Ci0gIDxsaT4KLSAgICBDbGljayB0aGUgQ29tbW9uIHRhYi4gSW4gdGhlCi0gICAgU2F2ZSBBcyBwYW5lLCBjbGljayBMb2NhbCB0byBzYXZlCi0gICAgdGhpcyBydW4gY29uZmlndXJhdGlvbiBsb2NhbGx5LCBvciBjbGljayBTaGFyZWQgdG8KLSAgICBzYXZlIGl0IHRvIGFub3RoZXIgcHJvamVjdC4KLSAgPC9saT4KLSAgPGxpPgotICAgIE9wdGlvbmFsOiBBZGQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIFJ1biB0b29sYmFyIGFuZCB0aGUgPHN0cm9uZz5GYXZvcml0ZXM8L3N0cm9uZz4KLSAgICBtZW51OiBpbiB0aGUgRGlzcGxheSBpbiBGYXZvcml0ZXMgcGFuZQotICAgIGNsaWNrIHRoZSBjaGVja2JveCBuZXh0IHRvIFJ1bi4KLSAgPC9saT4KLSAgPGxpPgotICAgIE9wdGlvbmFsOiBUbyBhZGQgdGhpcyBjb25maWd1cmF0aW9uIHRvIHRoZSA8c3Ryb25nPkRlYnVnPC9zdHJvbmc+IG1lbnUgYW5kIHRvb2xiYXIsIGNsaWNrCi0gICAgdGhlIGNoZWNrYm94IG5leHQgdG8gRGVidWcuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBUbyBzYXZlIHlvdXIgc2V0dGluZ3MsIGNsaWNrIENsb3NlLjxici8+Ci0gICAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gQWx0aG91Z2ggeW91IGNhbiBydW4gdGhlIHRlc3QgaW1tZWRpYXRlbHkgYnkKLSAgICBjbGlja2luZyBSdW4sIHlvdSBzaG91bGQgc2F2ZSB0aGUgdGVzdCBmaXJzdCBhbmQgdGhlbgotICAgIHJ1biBpdCBieSBzZWxlY3RpbmcgaXQgZnJvbSB0aGUgRWNsaXBzZSBzdGFuZGFyZCB0b29sYmFyLjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIE9uIHRoZSBFY2xpcHNlIHN0YW5kYXJkIHRvb2xiYXIsIGNsaWNrIHRoZSBkb3duIGFycm93IG5leHQgdG8gdGhlCi0gICAgZ3JlZW4gUnVuIGFycm93LiBUaGlzIGRpc3BsYXlzIGEgbWVudSBvZiBzYXZlZCBSdW4gYW5kIERlYnVnCi0gICAgY29uZmlndXJhdGlvbnMuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBTZWxlY3QgdGhlIHRlc3QgcnVuIGNvbmZpZ3VyYXRpb24geW91IGp1c3QgY3JlYXRlZC4KLSAgPC9saT4KLSAgPGxpPgotICAgIFRoZSBwcm9ncmVzcyBvZiB5b3VyIHRlc3QgYXBwZWFycyBpbiB0aGUgQ29uc29sZSB2aWV3LgotICAgIFlvdSBzaG91bGQgc2VlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMsIGFtb25nIG90aGVyczoKLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIDxjb2RlPlBlcmZvcm1pbmcgQW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgSlVuaXQgbGF1bmNoPC9jb2RlPjxicj4KLSAgICAgICAgVGhlIGNsYXNzIG5hbWUgdGhhdCBwcm9jZWVkcyAiSlVuaXQiIGRlcGVuZHMgb24gdGhlIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGNsYXNzIHlvdSBoYXZlIGNob3Nlbi4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIElmIHlvdSBhcmUgdXNpbmcgYW4gZW11bGF0b3IgYW5kIHlvdSBoYXZlIG5vdCB5ZXQgc3RhcnRlZCBpdCwgdGhlbiB5b3Ugd2lsbCBzZWUKKzx1bD4KKyAgICA8bGk+CisgICAgICAgIElmIHlvdSBhcmUgdXNpbmcgYW4gZW11bGF0b3IgYW5kIHlvdSBoYXZlIG5vdCB5ZXQgc3RhcnRlZCBpdCwgdGhlbiBFY2xpcHNlCisgICAgICAgIGZpcnN0IHN0YXJ0cyB0aGUgZW11bGF0b3IuIFdoZW4gdGhpcyBpcyBjb21wbGV0ZSwgeW91IHNlZQogICAgICAgICB0aGUgbWVzc2FnZToKICAgICAgICAgPHA+Ci0gICAgICAgICAgPGNvZGU+QXV0b21hdGljIFRhcmdldCBNb2RlOiBsYXVuY2hpbmcgbmV3IGVtdWxhdG9yIHdpdGggY29tcGF0aWJsZQotICAgICAgICAgIEFWRCA8ZW0+YXZkbmFtZTwvZW0+PC9jb2RlPjxicj4od2hlcmUgPGVtPmF2ZG5hbWU8L2VtPiBpcyB0aGUgbmFtZSBvZgotICAgICAgICAgIHRoZSBBVkQgeW91IGFyZSB1c2luZy4pCisgICAgICAgICAgICA8Y29kZT5IT01FIGlzIHVwIG9uIGRldmljZSAnPGVtPmRldmljZW5hbWU8L2VtPi08ZW0+cG9ydDwvZW0+JzwvY29kZT4KICAgICAgICAgPC9wPgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgSWYgeW91IGhhdmUgbm90IGFscmVhZHkgaW5zdGFsbGVkIHlvdXIgdGVzdCBhcHBsaWNhdGlvbiwgdGhlbiB5b3Ugd2lsbCBzZWUKKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSWYgeW91IGhhdmUgbm90IGFscmVhZHkgaW5zdGFsbGVkIHlvdXIgdGVzdCBwYWNrYWdlLCB0aGVuIHlvdSBzZWUKICAgICAgICAgdGhlIG1lc3NhZ2U6CiAgICAgICAgIDxwPgotICAgICAgICAgIDxjb2RlPlVwbG9hZGluZyA8ZW0+dGVzdGNsYXNzPC9lbT4uYXBrIG9udG8gZGV2aWNlICc8ZW0+ZGV2aWNlLWlkPC9lbT4nPC9jb2RlPjxicj4KLSAgICAgICAgICB3aGVyZSA8ZW0+dGVzdGNsYXNzPC9lbT4gaXMgdGhlIG5hbWUgb2YgeW91ciB1bml0IHRlc3QgY2xhc3MgYW5kIDxlbT5kZXZpY2UtaWQ8L2VtPgotICAgICAgICAgIGlzIHRoZSBuYW1lIGFuZCBwb3J0IGZvciB5b3VyIHRlc3QgZGV2aWNlIG9yIGVtdWxhdG9yLCBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZSA8Y29kZT5JbnN0YWxsaW5nIDxlbT50ZXN0Y2xhc3M8L2VtPi5hcGs8L2NvZGU+CisgICAgICAgICAgICA8Y29kZT5VcGxvYWRpbmcgPGVtPnRlc3RmaWxlPC9lbT4gb250byBkZXZpY2UgJzxlbT5kZXZpY2VuYW1lPC9lbT4tPGVtPnBvcnQ8L2VtPicKKyAgICAgICAgICAgIDwvY29kZT4KICAgICAgICAgPC9wPgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICA8Y29kZT5MYXVuY2hpbmcgaW5zdHJ1bWVudGF0aW9uIEFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIG9uIGRldmljZSA8ZW0+ZGV2aWNlLWlkPC9lbT48L2NvZGU+Ljxicj4KLSAgICAgICBUaGlzIGluZGljYXRlcyB0aGF0IEFuZHJvaWQncyBJbnN0cnVtZW50YXRpb24gc3lzdGVtIGlzIG5vdyB0ZXN0aW5nIHlvdXIgY29kZS4gQWdhaW4sIHRoZQotICAgICAgIGluc3RydW1lbnRhdGlvbiBjbGFzcyBuYW1lIGRlcGVuZHMgb24gdGhlIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIGNsYXNzIHlvdSBoYXZlIGNob3Nlbi4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgPGNvZGU+VGVzdCBydW4gY29tcGxldGU8L2NvZGU+Ljxicj4gV2hlbiB5b3Ugc2VlIHRoaXMsIHlvdXIgdW5pdCB0ZXN0cyBoYXZlIGZpbmlzaGVkLgotICAgICAgPC9saT4KLSAgICA8L3VsPgotPC9vbD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICB0aGVuIHRoZSBtZXNzYWdlIDxjb2RlPkluc3RhbGxpbmcgPGVtPnRlc3RmaWxlPC9lbT48L2NvZGU+LgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgYW5kIGZpbmFsbHkgdGhlIG1lc3NhZ2UgPGNvZGU+U3VjY2VzcyE8L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorPC91bD4KIDxwPgotICAgICAgICBUaGUgdGVzdCByZXN1bHRzIGFwcGVhciBpbiB0aGUgSlVuaXQgdmlldy4gVGhpcyBpcyBkaXZpZGVkIGludG8gYW4gdXBwZXIgc3VtbWFyeSBwYW5lLAotICAgICAgICBhbmQgYSBsb3dlciBzdGFjayB0cmFjZSBwYW5lLgorICAgIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGFuIGV4YW1wbGUgb2YgdGhpcyBtZXNzYWdlIHNlcXVlbmNlOgorPC9wPgorPGNvZGU+CitbMjAxMC0wNy0wMSAxMjo0NDo0MCAtIE15VGVzdF0gSE9NRSBpcyB1cCBvbiBkZXZpY2UgJ2VtdWxhdG9yLTU1NTQnPGJyPgorWzIwMTAtMDctMDEgMTI6NDQ6NDAgLSBNeVRlc3RdIFVwbG9hZGluZyBNeVRlc3QuYXBrIG9udG8gZGV2aWNlICdlbXVsYXRvci01NTU0Jzxicj4KK1syMDEwLTA3LTAxIDEyOjQ0OjQwIC0gTXlUZXN0XSBJbnN0YWxsaW5nIE15VGVzdC5hcGsuLi48YnI+CitbMjAxMC0wNy0wMSAxMjo0NDo0OSAtIE15VGVzdF0gU3VjY2VzcyE8YnI+Cis8L2NvZGU+Cis8YnI+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBOZXh0LCBpZiB5b3UgaGF2ZSBub3QgeWV0IGluc3RhbGxlZCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB0byB0aGUgZGV2aWNlIG9yCisgICAgICAgIGVtdWxhdG9yLCB5b3Ugc2VlIHRoZSBtZXNzYWdlCisgICAgICAgIDxwPgorICAgICAgICA8Y29kZT5Qcm9qZWN0IGRlcGVuZGVuY3kgZm91bmQsIGluc3RhbGxpbmc6IDxlbT5hcHBmaWxlPC9lbT48L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICB0aGVuIHRoZSBtZXNzYWdlIDxjb2RlPlVwbG9hZGluZyA8ZW0+YXBwZmlsZTwvZW0+PC9jb2RlPiBvbnRvIGRldmljZQorICAgICAgICAgICAgJzxlbT5kZXZpY2VuYW1lPC9lbT4tPGVtPnBvcnQ8L2VtPicKKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIHRoZW4gdGhlIG1lc3NhZ2UgPGNvZGU+SW5zdGFsbGluZyA8ZW0+YXBwZmlsZTwvZW0+PC9jb2RlPgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgYW5kIGZpbmFsbHkgdGhlIG1lc3NhZ2UgPGNvZGU+U3VjY2VzcyE8L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorPC91bD4KKzxwPgorICAgIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGFuIGV4YW1wbGUgb2YgdGhpcyBtZXNzYWdlIHNlcXVlbmNlOgorPC9wPgorPGNvZGU+CitbMjAxMC0wNy0wMSAxMjo0NDo0OSAtIE15VGVzdF0gUHJvamVjdCBkZXBlbmRlbmN5IGZvdW5kLCBpbnN0YWxsaW5nOiBNeUFwcDxicj4KK1syMDEwLTA3LTAxIDEyOjQ0OjQ5IC0gTXlBcHBdIFVwbG9hZGluZyBNeUFwcC5hcGsgb250byBkZXZpY2UgJ2VtdWxhdG9yLTU1NTQnPGJyPgorWzIwMTAtMDctMDEgMTI6NDQ6NDkgLSBNeUFwcF0gSW5zdGFsbGluZyBNeUFwcC5hcGsuLi48YnI+CitbMjAxMC0wNy0wMSAxMjo0NDo1NCAtIE15QXBwXSBTdWNjZXNzITxicj4KKzwvY29kZT4KKzxicj4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIE5leHQsIHlvdSBzZWUgdGhlIG1lc3NhZ2UKKyAgICAgICAgPGNvZGU+TGF1bmNoaW5nIGluc3RydW1lbnRhdGlvbiA8ZW0+aW5zdHJ1bWVudGF0aW9uX2NsYXNzPC9lbT4gb24gZGV2aWNlCisgICAgICAgIDxlbT5kZXZpY2VuYW1lPC9lbT4tPGVtPnBvcnQ8L2VtPjwvY29kZT4KKyAgICAgICAgPHA+CisgICAgICAgICAgICA8Y29kZT5pbnN0cnVtZW50YXRpb25fY2xhc3M8L2NvZGU+IGlzIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUKKyAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbiB0ZXN0IHJ1bm5lciB5b3UgaGF2ZSBzcGVjaWZpZWQgKHVzdWFsbHkKKyAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0uCisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTmV4dCwgYXMge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSBidWlsZHMgYSBsaXN0IG9mIHRlc3RzIHRvIHJ1biwKKyAgICAgICAgeW91IHNlZSB0aGUgbWVzc2FnZQorICAgICAgICA8cD4KKyAgICAgICAgICAgIDxjb2RlPkNvbGxlY3RpbmcgdGVzdCBpbmZvcm1hdGlvbjwvY29kZT4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIGZvbGxvd2VkIGJ5CisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICA8Y29kZT5TZW5kaW5nIHRlc3QgaW5mb3JtYXRpb24gdG8gRWNsaXBzZTwvY29kZT4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBGaW5hbGx5LCB5b3Ugc2VlIHRoZSBtZXNzYWdlIDxjb2RlPlJ1bm5pbmcgdGVzdHM8L2NvZGU+LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB5b3VyIHRlc3RzCisgICAgICAgIGFyZSBydW5uaW5nLiBBdCB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIHN0YXJ0IHNlZWluZyB0aGUgdGVzdCByZXN1bHRzIGluIHRoZSBKVW5pdCB2aWV3LgorICAgICAgICBXaGVuIHRoZSB0ZXN0cyBhcmUgZmluaXNoZWQsIHlvdSBzZWUgdGhlIGNvbnNvbGUgbWVzc2FnZSA8Y29kZT5UZXN0IHJ1biBjb21wbGV0ZTwvY29kZT4uCisgICAgICAgIFRoaXMgaW5kaWNhdGVzIHRoYXQgeW91ciB0ZXN0cyBhcmUgZmluaXNoZWQuCisgICAgPC9saT4KKzwvdWw+Cis8cD4KKyAgICBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhbiBleGFtcGxlIG9mIHRoaXMgbWVzc2FnZSBzZXF1ZW5jZToKKzwvcD4KKzxjb2RlPgorWzIwMTAtMDEtMDEgMTI6NDU6MDIgLSBNeVRlc3RdIExhdW5jaGluZyBpbnN0cnVtZW50YXRpb24gYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgb24gZGV2aWNlIGVtdWxhdG9yLTU1NTQ8YnI+CitbMjAxMC0wMS0wMSAxMjo0NTowMiAtIE15VGVzdF0gQ29sbGVjdGluZyB0ZXN0IGluZm9ybWF0aW9uPGJyPgorWzIwMTAtMDEtMDEgMTI6NDU6MDIgLSBNeVRlc3RdIFNlbmRpbmcgdGVzdCBpbmZvcm1hdGlvbiB0byBFY2xpcHNlPGJyPgorWzIwMTAtMDEtMDEgMTI6NDU6MDIgLSBNeVRlc3RdIFJ1bm5pbmcgdGVzdHMuLi48YnI+CitbMjAxMC0wMS0wMSAxMjo0NToyMiAtIE15VGVzdF0gVGVzdCBydW4gY29tcGxldGU8YnI+Cis8L2NvZGU+Cis8YnI+Cis8cD4KKyAgICBUaGUgdGVzdCByZXN1bHRzIGFwcGVhciBpbiB0aGUgSlVuaXQgdmlldy4gVGhpcyBpcyBkaXZpZGVkIGludG8gYW4gdXBwZXIgc3VtbWFyeSBwYW5lLAorICAgIGFuZCBhIGxvd2VyIHN0YWNrIHRyYWNlIHBhbmUuCiA8L3A+CiA8cD4KLSAgICAgICAgVGhlIHVwcGVyIHBhbmUgY29udGFpbnMgdGVzdCBpbmZvcm1hdGlvbi4gSW4gdGhlIHBhbmUncyBoZWFkZXIsIHlvdSBzZWUgdGhlIGZvbGxvd2luZwotICAgICAgICBpbmZvcm1hdGlvbjoKKyAgICBUaGUgdXBwZXIgcGFuZSBjb250YWlucyB0ZXN0IGluZm9ybWF0aW9uLiBJbiB0aGUgcGFuZSdzIGhlYWRlciwgeW91IHNlZSB0aGUgZm9sbG93aW5nCisgICAgaW5mb3JtYXRpb246CiA8L3A+Ci0gICAgPHVsPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgIFRvdGFsIHRpbWUgZWxhcHNlZCBmb3IgdGhlIHRlc3QgYXBwbGljYXRpb24gKGxhYmVsZWQgRmluaXNoZWQgYWZ0ZXIgPGVtPng8L2VtPiBzZWNvbmRzKS4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgICBOdW1iZXIgb2YgcnVucyAoUnVuczopIC0gdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGUgZW50aXJlIHRlc3QgY2xhc3MuCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICAgTnVtYmVyIG9mIGVycm9ycyAoRXJyb3JzOikgLSB0aGUgbnVtYmVyIG9mIHByb2dyYW0gZXJyb3JzIGFuZCBleGNlcHRpb25zIGVuY291bnRlcmVkCi0gICAgICAgICAgIGR1cmluZyB0aGUgdGVzdCBydW4uCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICAgTnVtYmVyIG9mIGZhaWx1cmVzIChGYWlsdXJlczopIC0gdGhlIG51bWJlciBvZiB0ZXN0IGZhaWx1cmVzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgdGVzdAotICAgICAgICAgICBydW4uIFRoaXMgaXMgdGhlIG51bWJlciBvZiBhc3NlcnRpb24gZmFpbHVyZXMuIEEgdGVzdCBjYW4gZmFpbCBldmVuIGlmIHRoZSBwcm9ncmFtIGRvZXMKLSAgICAgICAgICAgbm90IGVuY291bnRlciBhbiBlcnJvci4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgICBBIHByb2dyZXNzIGJhci4gVGhlIHByb2dyZXNzIGJhciBleHRlbmRzIGZyb20gbGVmdCB0byByaWdodCBhcyB0aGUgdGVzdHMgcnVuLiBJZiBhbGwgdGhlCi0gICAgICAgICAgIHRlc3RzIHN1Y2NlZWQsIHRoZSBiYXIgcmVtYWlucyBncmVlbi4gSWYgYSB0ZXN0IGZhaWxzLCB0aGUgYmFyIHR1cm5zIGZyb20gZ3JlZW4gdG8gcmVkLgotICAgICAgICA8L2xpPgotICAgIDwvdWw+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBUb3RhbCB0aW1lIGVsYXBzZWQgZm9yIHRoZSB0ZXN0IHBhY2thZ2UgKGxhYmVsZWQgRmluaXNoZWQgYWZ0ZXIgPGVtPng8L2VtPiBzZWNvbmRzKS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTnVtYmVyIG9mIHJ1bnMgKFJ1bnM6KSAtIHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhlIGVudGlyZSB0ZXN0IGNsYXNzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBOdW1iZXIgb2YgZXJyb3JzIChFcnJvcnM6KSAtIHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBlcnJvcnMgYW5kIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQKKyAgICAgICAgZHVyaW5nIHRoZSB0ZXN0IHJ1bi4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTnVtYmVyIG9mIGZhaWx1cmVzIChGYWlsdXJlczopIC0gdGhlIG51bWJlciBvZiB0ZXN0IGZhaWx1cmVzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgdGVzdAorICAgICAgICBydW4uIFRoaXMgaXMgdGhlIG51bWJlciBvZiBhc3NlcnRpb24gZmFpbHVyZXMuIEEgdGVzdCBjYW4gZmFpbCBldmVuIGlmIHRoZSBwcm9ncmFtIGRvZXMKKyAgICAgICAgbm90IGVuY291bnRlciBhbiBlcnJvci4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgQSBwcm9ncmVzcyBiYXIuIFRoZSBwcm9ncmVzcyBiYXIgZXh0ZW5kcyBmcm9tIGxlZnQgdG8gcmlnaHQgYXMgdGhlIHRlc3RzIHJ1bi4gSWYgYWxsIHRoZQorICAgICAgICB0ZXN0cyBzdWNjZWVkLCB0aGUgYmFyIHJlbWFpbnMgZ3JlZW4uIElmIGEgdGVzdCBmYWlscywgdGhlIGJhciB0dXJucyBmcm9tIGdyZWVuIHRvIHJlZC4KKyAgICA8L2xpPgorPC91bD4KIDxwPgogICAgIFRoZSBib2R5IG9mIHRoZSB1cHBlciBwYW5lIGNvbnRhaW5zIHRoZSBkZXRhaWxzIG9mIHRoZSB0ZXN0IHJ1bi4gRm9yIGVhY2ggdGVzdCBjYXNlIGNsYXNzCiAgICAgdGhhdCB3YXMgcnVuLCB5b3Ugc2VlIGEgbGluZSB3aXRoIHRoZSBjbGFzcyBuYW1lLiBUbyBsb29rIGF0IHRoZSByZXN1bHRzIGZvciB0aGUgaW5kaXZpZHVhbApAQCAtMzYzLDggKzUwNSwzMCBAQAogICAgIHBhbmUgYW5kIG1vdmVzIHRoZSBmb2N1cyB0byB0aGUgZmlyc3QgbGluZSBvZiB0aGUgdGVzdCBtZXRob2QuCiA8L3A+CiA8cD4KKyAgICBUaGUgcmVzdWx0cyBvZiBhIHN1Y2Nlc3NmdWwgdGVzdCBhcmUgc2hvd24gaW4KKyAgICA8YSBocmVmPSIjVGVzdFJlc3VsdHMiPkZpZ3VyZSAxLiBNZXNzYWdlcyBmb3IgYSBzdWNjZXNzZnVsIHRlc3Q8L2E+OgorPC9wPgorPGEgaHJlZj0ie0Bkb2NSb290fWltYWdlcy90ZXN0aW5nL2VjbGlwc2VfdGVzdF9yZXN1bHRzLnBuZyI+CisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvdGVzdGluZy9lY2xpcHNlX3Rlc3RfcmVzdWx0cy5wbmciCisgICAgICAgICBhbHQ9Ik1lc3NhZ2VzIGZvciBhIHN1Y2Nlc3NmdWwgdGVzdCIgaGVpZ2h0PSIzMjdweCIgaWQ9IlRlc3RSZXN1bHRzIi8+Cis8L2E+Cis8cCBjbGFzcz0iaW1nLWNhcHRpb24iPgorICAgIDxzdHJvbmc+RmlndXJlIDEuPC9zdHJvbmc+IE1lc3NhZ2VzIGZvciBhIHN1Y2Nlc3NmdWwgdGVzdAorPC9wPgorPHA+CiAgICAgVGhlIGxvd2VyIHBhbmUgaXMgZm9yIHN0YWNrIHRyYWNlcy4gSWYgeW91IGhpZ2hsaWdodCBhIGZhaWxlZCB0ZXN0IGluIHRoZSB1cHBlciBwYW5lLCB0aGUKICAgICBsb3dlciBwYW5lIGNvbnRhaW5zIGEgc3RhY2sgdHJhY2UgZm9yIHRoZSB0ZXN0LiBJZiBhIGxpbmUgY29ycmVzcG9uZHMgdG8gYSBwb2ludCBpbiB5b3VyCiAgICAgdGVzdCBjb2RlLCB5b3UgY2FuIGRvdWJsZS1jbGljayBpdCB0byBkaXNwbGF5IHRoZSBjb2RlIGluIGFuIGVkaXRvciB2aWV3IHBhbmUsIHdpdGggdGhlCiAgICAgbGluZSBoaWdobGlnaHRlZC4gRm9yIGEgc3VjY2Vzc2Z1bCB0ZXN0LCB0aGUgbG93ZXIgcGFuZSBpcyBlbXB0eS4KIDwvcD4KKzxwPgorICAgIFRoZSByZXN1bHRzIG9mIGEgZmFpbGVkIHRlc3QgYXJlIHNob3duIGluCisgICAgPGEgaHJlZj0iI0ZhaWxlZFRlc3RSZXN1bHRzIj5GaWd1cmUgMi4gTWVzc2FnZXMgZm9yIGEgdGVzdCBmYWlsdXJlPC9hPgorPC9wPgorPGEgaHJlZj0ie0Bkb2NSb290fWltYWdlcy90ZXN0aW5nL2VjbGlwc2VfdGVzdF9ydW5fZmFpbHVyZS5wbmciPgorICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL3Rlc3RpbmcvZWNsaXBzZV90ZXN0X3J1bl9mYWlsdXJlLnBuZyIKKyAgICAgICAgIGFsdD0iTWVzc2FnZXMgZm9yIGEgdGVzdCBmYWlsdXJlIiBoZWlnaHQ9IjM3MnB4IiBpZD0iVGVzdFJ1biIvPgorPC9hPgorPHAgY2xhc3M9ImltZy1jYXB0aW9uIj4KKyAgICA8c3Ryb25nPkZpZ3VyZSAyLjwvc3Ryb25nPiBNZXNzYWdlcyBmb3IgYSB0ZXN0IGZhaWx1cmUKKzwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5qZCBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5qZAppbmRleCAyYmRmNGQwLi41MjNhOGU1IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmpkCkBAIC0yLDEyMiArMiwxMjggQEAKIEBqZDpib2R5CiAKIDxkaXYgaWQ9InF2LXdyYXBwZXIiPgotICA8ZGl2IGlkPSJxdiI+Ci0gIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KLSAgPG9sPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Q29tbWFuZCI+V29ya2luZyB3aXRoIFRlc3QgUHJvamVjdHM8L2E+Ci0gICAgICAgIDxvbD4KLSAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjQ3JlYXRlVGVzdFByb2plY3QiPkNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjVXBkYXRlVGVzdFByb2plY3QiPlVwZGF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgPC9vbD4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RBcHAiPkNyZWF0aW5nIGEgVGVzdCBBcHBsaWNhdGlvbjwvYT4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzQ29tbWFuZCI+UnVubmluZyBUZXN0czwvYT4KLSAgICAgICAgPG9sPgotICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0c0FudCI+UXVpY2sgYnVpbGQgYW5kIHJ1biB3aXRoIEFudDwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzRGV2aWNlIj5SdW5uaW5nIHRlc3RzIG9uIGEgZGV2aWNlIG9yIGVtdWxhdG9yPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgPC9vbD4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI0FNU3ludGF4Ij5Vc2luZyB0aGUgSW5zdHJ1bWVudCBDb21tYW5kPC9hPgotICAgICAgICA8b2w+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI0FNT3B0aW9uc1N5bnRheCI+SW5zdHJ1bWVudCBvcHRpb25zPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdEV4YW1wbGVzIj5JbnN0cnVtZW50IGV4YW1wbGVzPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgPC9vbD4KLSAgICA8L2xpPgotCi0gIDwvb2w+Ci0gIDxoMj5TZWUgQWxzbzwvaDI+Ci0gIDxvbD4KLSAgICA8bGk+Ci0gICAgICAgIDxhCi0gICAgICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBhbmQgSW5zdHJ1bWVudGF0aW9uPC9hPgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcgQnJpZGdlPC9hPgotICAgIDwvbGk+Ci0gIDwvb2w+Ci0gIDwvZGl2PgorICAgIDxkaXYgaWQ9InF2Ij4KKyAgICAgICAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgorICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Q29tbWFuZCI+V29ya2luZyB3aXRoIFRlc3QgUHJvamVjdHM8L2E+CisgICAgICAgICAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjQ3JlYXRlVGVzdFByb2plY3QiPkNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjVXBkYXRlVGVzdFByb2plY3QiPlVwZGF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgPC9vbD4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RBcHAiPkNyZWF0aW5nIGEgVGVzdCBQYWNrYWdlPC9hPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdHNDb21tYW5kIj5SdW5uaW5nIFRlc3RzPC9hPgorICAgICAgICAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzQW50Ij5RdWljayBidWlsZCBhbmQgcnVuIHdpdGggQW50PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdHNEZXZpY2UiPlJ1bm5pbmcgdGVzdHMgb24gYSBkZXZpY2Ugb3IgZW11bGF0b3I8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICA8L29sPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjQU1TeW50YXgiPlVzaW5nIHRoZSBJbnN0cnVtZW50IENvbW1hbmQ8L2E+CisgICAgICAgICAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjQU1PcHRpb25zU3ludGF4Ij5JbnN0cnVtZW50IG9wdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0RXhhbXBsZXMiPkluc3RydW1lbnQgZXhhbXBsZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICA8L29sPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L29sPgorICAgICAgICA8aDI+U2VlIEFsc288L2gyPgorICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCI+QW5kcm9pZCBEZWJ1ZyBCcmlkZ2U8L2E+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvb2w+CisgICAgPC9kaXY+CiA8L2Rpdj4KIDxwPgotICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gY3JlYXRlIGFuZCBydW4gdGVzdHMgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICBZb3UgY2FuIHVzZSB0aGUgdGVjaG5pcXVlcyBkZXNjcmliZWQgaGVyZSBpZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gYW4gSURFIG90aGVyIHRoYW4gRWNsaXBzZQotICBvciBpZiB5b3UgcHJlZmVyIHRvIHdvcmsgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIGRvY3VtZW50IGFzc3VtZXMgdGhhdCB5b3UgYWxyZWFkeSBrbm93IGhvdwotICB0byBjcmVhdGUgYSBBbmRyb2lkIGFwcGxpY2F0aW9uIGluIHlvdXIgcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQuIEJlZm9yZSB5b3Ugc3RhcnQgdGhpcwotICBkb2N1bWVudCwgeW91IHNob3VsZCByZWFkIHRoZSBkb2N1bWVudCA8YQotICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbjwvYT4sCi0gIHdoaWNoIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIEFuZHJvaWQgdGVzdGluZy4KKyAgICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gY3JlYXRlIGFuZCBydW4gdGVzdHMgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICAgIFlvdSBjYW4gdXNlIHRoZSB0ZWNobmlxdWVzIGRlc2NyaWJlZCBoZXJlIGlmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBhbiBJREUgb3RoZXIgdGhhbiBFY2xpcHNlCisgICAgb3IgaWYgeW91IHByZWZlciB0byB3b3JrIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBkb2N1bWVudCBhc3N1bWVzIHRoYXQgeW91IGFscmVhZHkga25vdyBob3cKKyAgICB0byBjcmVhdGUgYSBBbmRyb2lkIGFwcGxpY2F0aW9uIGluIHlvdXIgcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQuIEJlZm9yZSB5b3Ugc3RhcnQgdGhpcworICAgIGRvY3VtZW50LCB5b3Ugc2hvdWxkIHJlYWQgdGhlIHRvcGljCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4sCisgICAgd2hpY2ggcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgQW5kcm9pZCB0ZXN0aW5nLgogPC9wPgogPHA+Ci0gIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlIHdpdGggQURULCB5b3UgY2FuIHNldCB1cCBhbmQgcnVuIHlvdXIgdGVzdHMKLWRpcmVjdGx5IGluIEVjbGlwc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCA8YQotICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nJm5ic3A7aW4mbmJzcDtFY2xpcHNlLCZuYnNwO3dpdGgmbmJzcDtBRFQ8L2E+LgorICAgIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlIHdpdGggQURULCB5b3UgY2FuIHNldCB1cCBhbmQgcnVuIHlvdXIgdGVzdHMKKyAgICBkaXJlY3RseSBpbiBFY2xpcHNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4KIDwvcD4KIDxoMiBpZD0iQ3JlYXRlVGVzdFByb2plY3RDb21tYW5kIj5Xb3JraW5nIHdpdGggVGVzdCBQcm9qZWN0czwvaDI+CiA8cD4KLSAgWW91IHVzZSB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCB0byBjcmVhdGUgdGVzdCBwcm9qZWN0cy4KLSAgWW91IGFsc28gdXNlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvIGNvbnZlcnQgZXhpc3RpbmcgdGVzdCBjb2RlIGludG8gYW4gQW5kcm9pZCB0ZXN0IHByb2plY3QsCi0gIG9yIHRvIGFkZCB0aGUgPGNvZGU+cnVuLXRlc3RzPC9jb2RlPiBBbnQgdGFyZ2V0IHRvIGFuIGV4aXN0aW5nIEFuZHJvaWQgdGVzdCBwcm9qZWN0LgotICBUaGVzZSBvcGVyYXRpb25zIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gPGEKLSAgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij5VcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4uCi0gIFRoZSA8Y29kZT5ydW4tdGVzdHM8L2NvZGU+IHRhcmdldCBpcyBkZXNjcmliZWQgaW4gPGEKLSAgaHJlZj0iI1J1blRlc3RzQW50Ij5RdWljayBidWlsZCBhbmQgcnVuIHdpdGggQW50PC9hPi4KKyAgICBZb3UgdXNlIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0b29sIHRvIGNyZWF0ZSB0ZXN0IHByb2plY3RzLgorICAgIFlvdSBhbHNvIHVzZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0byBjb252ZXJ0IGV4aXN0aW5nIHRlc3QgY29kZSBpbnRvIGFuIEFuZHJvaWQgdGVzdCBwcm9qZWN0LAorICAgIG9yIHRvIGFkZCB0aGUgPGNvZGU+cnVuLXRlc3RzPC9jb2RlPiBBbnQgdGFyZ2V0IHRvIGFuIGV4aXN0aW5nIEFuZHJvaWQgdGVzdCBwcm9qZWN0LgorICAgIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVXBkYXRlVGVzdFByb2plY3QiPgorICAgIFVwZGF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPi4gVGhlIDxjb2RlPnJ1bi10ZXN0czwvY29kZT4gdGFyZ2V0IGlzIGRlc2NyaWJlZCBpbgorICAgIDxhIGhyZWY9IiNSdW5UZXN0c0FudCI+UXVpY2sgYnVpbGQgYW5kIHJ1biB3aXRoIEFudDwvYT4uCiA8L3A+CiA8aDMgaWQ9IkNyZWF0ZVRlc3RQcm9qZWN0Ij5DcmVhdGluZyBhIHRlc3QgcHJvamVjdDwvaDM+CiA8cD4KLSAgVG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0IHdpdGggdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wsIGVudGVyOgotPHByZT5hbmRyb2lkIGNyZWF0ZSB0ZXN0LXByb2plY3QgLW0gJmx0O21haW5fcGF0aCZndDsgLW4gJmx0O3Byb2plY3RfbmFtZSZndDsgLXAgJmx0O3Rlc3RfcGF0aCZndDs8L3ByZT4KKyAgICBUbyBjcmVhdGUgYSB0ZXN0IHByb2plY3Qgd2l0aCB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCwgZW50ZXI6Cis8L3A+Cis8cHJlPgorYW5kcm9pZCBjcmVhdGUgdGVzdC1wcm9qZWN0IC1tICZsdDttYWluX3BhdGgmZ3Q7IC1uICZsdDtwcm9qZWN0X25hbWUmZ3Q7IC1wICZsdDt0ZXN0X3BhdGgmZ3Q7Cis8L3ByZT4KIDxwPgotICBZb3UgbXVzdCBzdXBwbHkgYWxsIHRoZSBmbGFncy4gVGhlIGZvbGxvd2luZyB0YWJsZSBleHBsYWlucyB0aGVtIGluIGRldGFpbDoKKyAgICBZb3UgbXVzdCBzdXBwbHkgYWxsIHRoZSBmbGFncy4gVGhlIGZvbGxvd2luZyB0YWJsZSBleHBsYWlucyB0aGVtIGluIGRldGFpbDoKIDwvcD4KIDx0YWJsZT4KLSAgPHRyPgotICAgIDx0aD5GbGFnPC90aD4KLSAgICA8dGg+VmFsdWU8L3RoPgotICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Ci0gIDx0cj4KLSAgICA8dGQ+PGNvZGU+LW0sIC0tbWFpbjwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUGF0aCB0byB0aGUgcHJvamVjdCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcmVsYXRpdmUgdG8gdGhlIHRlc3QgYXBwbGljYXRpb24KLSAgICAgICAgZGlyZWN0b3J5LgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4sIGFuZCB5b3UKLSAgICAgICAgd2FudCB0byBjcmVhdGUgdGhlIHRlc3QgcHJvamVjdCBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4sIHRoZW4gdGhlIHZhbHVlIG9mCi0gICAgICAgIDxjb2RlPi0tbWFpbjwvY29kZT4gc2hvdWxkIGJlIDxjb2RlPi4uL0hlbGxvQW5kcm9pZDwvY29kZT4uCisgICAgPHRyPgorICAgICAgICA8dGg+RmxhZzwvdGg+CisgICAgICAgIDx0aD5WYWx1ZTwvdGg+CisgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT4tbSwgLS1tYWluPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFBhdGggdG8gdGhlIHByb2plY3Qgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIHJlbGF0aXZlIHRvIHRoZSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgICAgIGRpcmVjdG9yeS4KICAgICAgICAgPC90ZD4KLSAgPHRyPgotICAgIDx0ZD48Y29kZT4tbiwgLS1uYW1lPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPk5hbWUgdGhhdCB5b3Ugd2FudCB0byBnaXZlIHRoZSB0ZXN0IHByb2plY3QuPC90ZD4KLSAgICA8dGQ+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD48Y29kZT4tcCwgLS1wYXRoPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPkRpcmVjdG9yeSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIG5ldyB0ZXN0IHByb2plY3QuPC90ZD4KLSAgICA8dGQ+Ci0gICAgICBUaGUgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCBjcmVhdGVzIHRoZSB0ZXN0IHByb2plY3QgZmlsZXMgYW5kIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaW4gdGhpcwotICAgICAgZGlyZWN0b3J5LiBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LCA8Y29kZT5hbmRyb2lkPC9jb2RlPiBjcmVhdGVzIGl0LgotICAgIDwvdGQ+Ci0gIDwvdHI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkPC9jb2RlPiwgYW5kCisgICAgICAgICAgICB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIHRlc3QgcHJvamVjdCBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4sIHRoZW4gdGhlCisgICAgICAgICAgICB2YWx1ZSBvZiA8Y29kZT4tLW1haW48L2NvZGU+IHNob3VsZCBiZSA8Y29kZT4uLi9IZWxsb0FuZHJvaWQ8L2NvZGU+LgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgY2hvb3NpbmcgdGhlIGxvY2F0aW9uIG9mIHRlc3QgcHJvamVjdHMsIHBsZWFzZSByZWFkCisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwjVGVzdFByb2plY3RzIj4KKyAgICAgICAgICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPi4KKyAgICAgICAgPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+LW4sIC0tbmFtZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+TmFtZSB0aGF0IHlvdSB3YW50IHRvIGdpdmUgdGhlIHRlc3QgcHJvamVjdC48L3RkPgorICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPi1wLCAtLXBhdGg8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPkRpcmVjdG9yeSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIG5ldyB0ZXN0IHByb2plY3QuPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgVGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgY3JlYXRlcyB0aGUgdGVzdCBwcm9qZWN0IGZpbGVzIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlCisgICAgICAgICAgICBpbiB0aGlzIGRpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgPGNvZGU+YW5kcm9pZDwvY29kZT4gY3JlYXRlcyBpdC4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgogPC90YWJsZT4KIDxwPgogICAgIElmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgPGNvZGU+YW5kcm9pZDwvY29kZT4gbGlzdHMgdG8gU1RET1VUIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKQEAgLTEzNSwxMSArMTQxLDEwIEBACiAgICAgYXJlIHRlc3RpbmcgYW5kIGNvbnRyb2wgaXQgd2l0aCBpbnN0cnVtZW50YXRpb24uCiA8L3A+CiA8cD4KLSAgICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgY3JlYXRlIHRoZSA8YQotICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwiPkhlbGxvLCBXb3JsZDwvYT4gdHV0b3JpYWwgYXBwbGljYXRpb24KLSAgICBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPn4vc291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4uIEluIHRoZSB0dXRvcmlhbCwgdGhpcyBhcHBsaWNhdGlvbiB1c2VzIHRoZQotICAgIHBhY2thZ2UgbmFtZSA8Y29kZT5jb20uZXhhbXBsZS5oZWxsb2FuZHJvaWQ8L2NvZGU+IGFuZCB0aGUgYWN0aXZpdHkgbmFtZQotICAgIDxjb2RlPkhlbGxvQW5kcm9pZDwvY29kZT4uIFlvdSBjYW4gdG8gY3JlYXRlIHRoZSB0ZXN0IGZvciB0aGlzIGluCisgICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGNyZWF0ZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvaGVsbG8td29ybGQuaHRtbCI+CisgICAgSGVsbG8sIFdvcmxkPC9hPiB0dXRvcmlhbCBhcHBsaWNhdGlvbiBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPn4vc291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4uCisgICAgSW4gdGhlIHR1dG9yaWFsLCB0aGlzIGFwcGxpY2F0aW9uIHVzZXMgdGhlIHBhY2thZ2UgbmFtZSA8Y29kZT5jb20uZXhhbXBsZS5oZWxsb2FuZHJvaWQ8L2NvZGU+CisgICAgYW5kIHRoZSBhY3Rpdml0eSBuYW1lIDxjb2RlPkhlbGxvQW5kcm9pZDwvY29kZT4uIFlvdSBjYW4gdG8gY3JlYXRlIHRoZSB0ZXN0IGZvciB0aGlzIGluCiAgICAgPGNvZGU+fi9zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4uIFRvIGRvIHNvLCB5b3UgZW50ZXI6CiA8L3A+CiA8cHJlPgpAQCAtMTk2LDcgKzIwMSw3IEBACiA8cCBjbGFzcz0ibm90ZSI+CiAgICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3UgY2hhbmdlIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwKICAgICB5b3UgbXVzdCA8ZW0+bWFudWFsbHk8L2VtPiBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT4mbHQ7YW5kcm9pZDp0YXJnZXRQYWNrYWdlJmd0OzwvY29kZT4KLSAgICBhdHRyaWJ1dGUgd2l0aGluIHRoZSA8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPiBmaWxlIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLgorICAgIGF0dHJpYnV0ZSB3aXRoaW4gdGhlIDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+IGZpbGUgb2YgdGhlIHRlc3QgcGFja2FnZS4KICAgICBSdW5uaW5nIDxjb2RlPmFuZHJvaWQgdXBkYXRlIHRlc3QtcHJvamVjdDwvY29kZT4gZG9lcyBub3QgZG8gdGhpcy4KIDwvcD4KIDxwPgpAQCAtMjA1LDM4ICsyMTAsMzggQEAKIDxwcmU+YW5kcm9pZCB1cGRhdGUtdGVzdC1wcm9qZWN0IC1tICZsdDttYWluX3BhdGgmZ3Q7IC1wICZsdDt0ZXN0X3BhdGgmZ3Q7PC9wcmU+CiAKIDx0YWJsZT4KLTx0cj4KLSAgPHRoPkZsYWc8L3RoPgotICA8dGg+VmFsdWU8L3RoPgotICA8dGg+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTx0cj4KLSAgPHRkPjxjb2RlPi1tLCAtLW1haW48L2NvZGU+PC90ZD4KLSAgPHRkPlRoZSBwYXRoIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCByZWxhdGl2ZSB0byB0aGUgdGVzdCBwcm9qZWN0PC90ZD4KLSAgPHRkPgotICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkPC9jb2RlPiwgYW5kCi0gICAgdGhlIHRlc3QgcHJvamVjdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4sIHRoZW4gdGhlIHZhbHVlIGZvcgotICAgIDxjb2RlPi0tbWFpbjwvY29kZT4gaXMgPGNvZGU+Li4vSGVsbG9BbmRyb2lkPC9jb2RlPi4KLSAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZD48Y29kZT4tcCwgLS1wYXRoPC9jb2RlPjwvdGQ+Ci0gIDx0ZD5UaGUgb2YgdGhlIHRlc3QgcHJvamVjdC48L3RkPgotICA8dGQ+Ci0gICAgRm9yIGV4YW1wbGUsIGlmIHRoZSB0ZXN0IHByb2plY3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZQotICAgIHZhbHVlIGZvciA8Y29kZT4tLXBhdGg8L2NvZGU+IGlzIDxjb2RlPkhlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LgotICA8L3RkPgotPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0aD5GbGFnPC90aD4KKyAgICAgICAgPHRoPlZhbHVlPC90aD4KKyAgICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPi1tLCAtLW1haW48L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPlRoZSBwYXRoIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCByZWxhdGl2ZSB0byB0aGUgdGVzdCBwcm9qZWN0PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWQ8L2NvZGU+LCBhbmQKKyAgICAgICAgICAgIHRoZSB0ZXN0IHByb2plY3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZSB2YWx1ZSBmb3IKKyAgICAgICAgICAgIDxjb2RlPi0tbWFpbjwvY29kZT4gaXMgPGNvZGU+Li4vSGVsbG9BbmRyb2lkPC9jb2RlPi4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPi1wLCAtLXBhdGg8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPlRoZSBvZiB0aGUgdGVzdCBwcm9qZWN0LjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgdGVzdCBwcm9qZWN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPiwgdGhlbiB0aGUKKyAgICAgICAgICAgIHZhbHVlIGZvciA8Y29kZT4tLXBhdGg8L2NvZGU+IGlzIDxjb2RlPkhlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CiA8L3RhYmxlPgogPHA+CiAgICAgSWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCA8Y29kZT5hbmRyb2lkPC9jb2RlPiBsaXN0cyB0byBTVERPVVQgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcwogICAgIGFuZCBkaXJlY3RvcmllcyBpdCBoYXMgY3JlYXRlZC4KIDwvcD4KLTxoMiBpZD0iQ3JlYXRlVGVzdEFwcCI+Q3JlYXRpbmcgYSBUZXN0IEFwcGxpY2F0aW9uPC9oMj4KKzxoMiBpZD0iQ3JlYXRlVGVzdEFwcCI+Q3JlYXRpbmcgYSBUZXN0IFBhY2thZ2U8L2gyPgogPHA+Ci0gICAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgdGVzdCBwcm9qZWN0LCB5b3UgcG9wdWxhdGUgaXQgd2l0aCBhIHRlc3QgYXBwbGljYXRpb24uCisgICAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgdGVzdCBwcm9qZWN0LCB5b3UgcG9wdWxhdGUgaXQgd2l0aCBhIHRlc3QgcGFja2FnZS4KICAgICBUaGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkgQWN0aXZpdHl9LAotICAgIGFsdGhvdWdoIHlvdSBjYW4gZGVmaW5lIG9uZSBpZiB5b3Ugd2lzaC4gQWx0aG91Z2ggeW91ciB0ZXN0IGFwcGxpY2F0aW9uIGNhbgorICAgIGFsdGhvdWdoIHlvdSBjYW4gZGVmaW5lIG9uZSBpZiB5b3Ugd2lzaC4gQWx0aG91Z2ggeW91ciB0ZXN0IHBhY2thZ2UgY2FuCiAgICAgY29tYmluZSBBY3Rpdml0aWVzLCBBbmRyb2lkIHRlc3QgY2xhc3MgZXh0ZW5zaW9ucywgSlVuaXQgZXh0ZW5zaW9ucywgb3IKICAgICBvcmRpbmFyeSBjbGFzc2VzLCB5b3Ugc2hvdWxkIGV4dGVuZCBvbmUgb2YgdGhlIEFuZHJvaWQgdGVzdCBjbGFzc2VzIG9yIEpVbml0IGNsYXNzZXMsCiAgICAgYmVjYXVzZSB0aGVzZSBwcm92aWRlIHRoZSBiZXN0IHRlc3RpbmcgZmVhdHVyZXMuCkBAIC0yNDgsNyArMjUzLDcgQEAKIDwvcD4KIAogPHA+Ci0gICAgVG8gY3JlYXRlIGEgdGVzdCBhcHBsaWNhdGlvbiwgc3RhcnQgd2l0aCBvbmUgb2YgQW5kcm9pZCdzIHRlc3QgY2xhc3NlcyBpbiB0aGUgSmF2YSBwYWNrYWdlCisgICAgVG8gY3JlYXRlIGEgdGVzdCBwYWNrYWdlLCBzdGFydCB3aXRoIG9uZSBvZiBBbmRyb2lkJ3MgdGVzdCBjbGFzc2VzIGluIHRoZSBKYXZhIHBhY2thZ2UKICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0IGFuZHJvaWQudGVzdH0uIFRoZXNlIGV4dGVuZCB0aGUgSlVuaXQKICAgICB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBjbGFzcy4gV2l0aCBhIGZldyBleGNlcHRpb25zLCB0aGUgQW5kcm9pZCB0ZXN0CiAgICAgY2xhc3NlcyBhbHNvIHByb3ZpZGUgaW5zdHJ1bWVudGF0aW9uIGZvciB0ZXN0aW5nLgpAQCAtMjgyLDI0ICsyODcsMTcgQEAKICAgICB0ZXN0IHJlc3VsdHMgYXJlIHN1c3BlY3QsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlIHRlc3RzIHN1Y2NlZWRlZC4KIDwvcD4KIDxwPgotICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgY3JlYXRpbmcgdGVzdCBhcHBsaWNhdGlvbnMsIHNlZSB0aGUgdG9waWMgPGEKLSAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbjwvYT4sCisgICAgVG8gbGVhcm4gbW9yZSBhYm91dCBjcmVhdGluZyB0ZXN0IHBhY2thZ2VzLCBzZWUgdGhlIHRvcGljIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4sCiAgICAgd2hpY2ggcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgQW5kcm9pZCB0ZXN0aW5nLiBJZiB5b3UgcHJlZmVyIHRvIGZvbGxvdyBhIHR1dG9yaWFsLAogICAgIHRyeSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+CiAgICAgdHV0b3JpYWwsIHdoaWNoIGxlYWRzIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBvZiB0ZXN0cyBmb3IgYW4gYWN0dWFsIEFuZHJvaWQgYXBwbGljYXRpb24uCiA8L3A+CiA8aDIgaWQ9IlJ1blRlc3RzQ29tbWFuZCI+UnVubmluZyBUZXN0czwvaDI+CiA8cD4KLSAgICBJZiB5b3UgYXJlIG5vdCBkZXZlbG9waW5nIGluIEVjbGlwc2Ugd2l0aCBBRFQsIHlvdSBuZWVkIHRvIHJ1biB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgWW91IGNhbiBkbyB0aGlzIGVpdGhlciB3aXRoIEFudCBvciB3aXRoIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyIEFjdGl2aXR5TWFuYWdlcn0KLSAgICBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgotPC9wPgotPHA+Ci0gICAgWW91IGNhbiBhbHNvIHJ1biB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgZXZlbiBpZiB5b3UgYXJlIHVzaW5nIEVjbGlwc2Ugd2l0aCBBRFQgdG8gZGV2ZWxvcAotICAgIHRoZW0uIFRvIGRvIHRoaXMsIHlvdSBuZWVkIHRvIGNyZWF0ZSB0aGUgcHJvcGVyIGZpbGVzIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlIGluIHRoZSB0ZXN0Ci0gICAgcHJvamVjdCwgdXNpbmcgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgd2l0aCB0aGUgb3B0aW9uIDxjb2RlPmNyZWF0ZSB0ZXN0LXByb2plY3Q8L2NvZGU+LgotICAgIFRoaXMgaXMgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDxhCi0gICAgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Q29tbWFuZCI+V29ya2luZyB3aXRoIFRlc3QgUHJvamVjdHM8L2E+LgorICAgIFlvdSBydW4gdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBlaXRoZXIgd2l0aCBBbnQgb3Igd2l0aCBhbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1odHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPgorICAgIEFuZHJvaWQgRGVidWcgQnJpZGdlIChhZGIpPC9hPiBzaGVsbC4KIDwvcD4KIDxoMyBpZD0iUnVuVGVzdHNBbnQiPlF1aWNrIGJ1aWxkIGFuZCBydW4gd2l0aCBBbnQ8L2gzPgogPHA+CkBAIC0zMTYsNTcgKzMxNCw2MyBAQAogICAgIFlvdSBjYW4gdXBkYXRlIGFuIGV4aXN0aW5nIHRlc3QgcHJvamVjdCB0byB1c2UgdGhpcyBmZWF0dXJlLiBUbyBkbyB0aGlzLCB1c2UgdGhlCiAgICAgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCB3aXRoIHRoZSA8Y29kZT51cGRhdGUgdGVzdC1wcm9qZWN0PC9jb2RlPiBvcHRpb24uIFRoaXMgaXMgZGVzY3JpYmVkCiAgICAgaW4gdGhlIHNlY3Rpb24gPGEgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij5VcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4uCis8L3A+CiA8aDMgaWQ9IlJ1blRlc3RzRGV2aWNlIj5SdW5uaW5nIHRlc3RzIG9uIGEgZGV2aWNlIG9yIGVtdWxhdG9yPC9oMz4KIDxwPgotICAgIFdoZW4geW91IHJ1biB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aCB0aGUgQWN0aXZpdHlNYW5hZ2VyICg8Y29kZT5hbTwvY29kZT4pCi0gICAgY29tbWFuZC1saW5lIHRvb2wsIHlvdSBnZXQgbW9yZSBvcHRpb25zIGZvciBjaG9vc2luZyB0aGUgdGVzdHMgdG8gcnVuIHRoYW4gd2l0aCBhbnkgb3RoZXIKLSAgICBtZXRob2QuIFlvdSBjYW4gc2VsZWN0IGluZGl2aWR1YWwgdGVzdCBtZXRob2RzLCBmaWx0ZXIgdGVzdHMgYWNjb3JkaW5nIHRvIHRoZWlyIGFubm90YXRpb24sIG9yCi0gICAgc3BlY2lmeSB0ZXN0aW5nIG9wdGlvbnMuIFNpbmNlIHRoZSB0ZXN0IHJ1biBpcyBjb250cm9sbGVkIGVudGlyZWx5IGZyb20gYSBjb21tYW5kIGxpbmUsIHlvdSBjYW4KLSAgICBjdXN0b21pemUgeW91ciB0ZXN0aW5nIHdpdGggc2hlbGwgc2NyaXB0cyBpbiB2YXJpb3VzIHdheXMuCisgICAgV2hlbiB5b3UgcnVuIHRlc3RzIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aXRoCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCI+CisgICAgQW5kcm9pZCBEZWJ1ZyBCcmlkZ2UgKGFkYik8L2E+LCB5b3UgZ2V0IG1vcmUgb3B0aW9ucyBmb3IgY2hvb3NpbmcgdGhlIHRlc3RzCisgICAgdG8gcnVuIHRoYW4gd2l0aCBhbnkgb3RoZXIgbWV0aG9kLiBZb3UgY2FuIHNlbGVjdCBpbmRpdmlkdWFsIHRlc3QgbWV0aG9kcywgZmlsdGVyIHRlc3RzCisgICAgYWNjb3JkaW5nIHRvIHRoZWlyIGFubm90YXRpb24sIG9yIHNwZWNpZnkgdGVzdGluZyBvcHRpb25zLiBTaW5jZSB0aGUgdGVzdCBydW4gaXMgY29udHJvbGxlZAorICAgIGVudGlyZWx5IGZyb20gYSBjb21tYW5kIGxpbmUsIHlvdSBjYW4gY3VzdG9taXplIHlvdXIgdGVzdGluZyB3aXRoIHNoZWxsIHNjcmlwdHMgaW4gdmFyaW91cyB3YXlzLgogPC9wPgogPHA+Ci0gICAgWW91IHJ1biB0aGUgPGNvZGU+YW08L2NvZGU+IHRvb2wgb24gYW4gQW5kcm9pZCBkZXZpY2Ugb3IgZW11bGF0b3IgdXNpbmcgdGhlCi0gICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcgQnJpZGdlPC9hPgotICAgICg8Y29kZT5hZGI8L2NvZGU+KSBzaGVsbC4gV2hlbiB5b3UgZG8gdGhpcywgeW91IHVzZSB0aGUgQWN0aXZpdHlNYW5hZ2VyCi0gICAgPGNvZGU+aW5zdHJ1bWVudDwvY29kZT4gb3B0aW9uIHRvIHJ1biB5b3VyIHRlc3QgYXBwbGljYXRpb24gdXNpbmcgYW4gQW5kcm9pZCB0ZXN0IHJ1bm5lcgotICAgICh1c3VhbGx5IHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0pLiBZb3Ugc2V0IDxjb2RlPmFtPC9jb2RlPgotICAgIG9wdGlvbnMgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3MuCisgICAgVG8gcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBydW4gPGNvZGU+YWRiIHNoZWxsPC9jb2RlPiB0byBzdGFydCBhIGNvbW1hbmQtbGluZQorICAgIHNoZWxsIG9uIHlvdXIgZGV2aWNlIG9yIGVtdWxhdG9yLCBhbmQgdGhlbiBpbiB0aGUgc2hlbGwgcnVuIHRoZSA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPgorICAgIGNvbW1hbmQuIFlvdSBjb250cm9sIDxjb2RlPmFtPC9jb2RlPiBhbmQgeW91ciB0ZXN0cyB3aXRoIGNvbW1hbmQtbGluZSBmbGFncy4KIDwvcD4KIDxwPgotICAgIFRvIHJ1biBhIHRlc3Qgd2l0aCA8Y29kZT5hbTwvY29kZT46CisgICAgQXMgYSBzaG9ydGN1dCwgeW91IGNhbiBzdGFydCBhbiA8Y29kZT5hZGI8L2NvZGU+IHNoZWxsLCBjYWxsIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+LCBhbmQKKyAgICBzcGVjaWZ5IGNvbW1hbmQtbGluZSBmbGFncyBhbGwgb24gb25lIGlucHV0IGxpbmUuIFRoZSBzaGVsbCBvcGVucyBvbiB0aGUgZGV2aWNlIG9yIGVtdWxhdG9yLAorICAgIHJ1bnMgeW91ciB0ZXN0cywgcHJvZHVjZXMgb3V0cHV0LCBhbmQgdGhlbiByZXR1cm5zIHRvIHRoZSBjb21tYW5kIGxpbmUgb24geW91ciBjb21wdXRlci4KKzwvcD4KKzxwPgorICAgIFRvIHJ1biBhIHRlc3Qgd2l0aCA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPjoKIDwvcD4KIDxvbD4KLSAgPGxpPgotICAgIElmIG5lY2Vzc2FyeSwgcmUtYnVpbGQgeW91ciBtYWluIGFwcGxpY2F0aW9uIGFuZCB0ZXN0IGFwcGxpY2F0aW9uLgotICA8L2xpPgotICA8bGk+Ci0gICAgSW5zdGFsbCB5b3VyIHRlc3QgYXBwbGljYXRpb24gYW5kIG1haW4gYXBwbGljYXRpb24gQW5kcm9pZCBwYWNrYWdlIGZpbGVzCi0gICAgKDxjb2RlPi5hcGs8L2NvZGU+IGZpbGVzKSB0byB5b3VyIGN1cnJlbnQgQW5kcm9pZCBkZXZpY2Ugb3IgZW11bGF0b3I8L2xpPgotICA8bGk+Ci0gICAgQXQgdGhlIGNvbW1hbmQgbGluZSwgZW50ZXI6CisgICAgPGxpPgorICAgICAgICBJZiBuZWNlc3NhcnksIHJlYnVpbGQgeW91ciBtYWluIGFwcGxpY2F0aW9uIGFuZCB0ZXN0IHBhY2thZ2UuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluc3RhbGwgeW91ciB0ZXN0IHBhY2thZ2UgYW5kIG1haW4gYXBwbGljYXRpb24gQW5kcm9pZCBwYWNrYWdlIGZpbGVzCisgICAgICAgICg8Y29kZT4uYXBrPC9jb2RlPiBmaWxlcykgdG8geW91ciBjdXJyZW50IEFuZHJvaWQgZGV2aWNlIG9yIGVtdWxhdG9yPC9saT4KKyAgICA8bGk+CisgICAgICAgIEF0IHRoZSBjb21tYW5kIGxpbmUsIGVudGVyOgogPHByZT4KICQgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgJmx0O3Rlc3RfcGFja2FnZV9uYW1lJmd0Oy8mbHQ7cnVubmVyX2NsYXNzJmd0OwogPC9wcmU+Ci08cD4KLSAgICB3aGVyZSA8Y29kZT4mbHQ7dGVzdF9wYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPiBpcyB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgeW91ciB0ZXN0Ci0gICAgYXBwbGljYXRpb24sIGFuZCA8Y29kZT4mbHQ7cnVubmVyX2NsYXNzJmd0OzwvY29kZT4gaXMgdGhlIG5hbWUgb2YgdGhlIEFuZHJvaWQgdGVzdCBydW5uZXIKLSAgICBjbGFzcyB5b3UgYXJlIHVzaW5nLiBUaGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgaXMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5wYWNrYWdlPC9jb2RlPgotICAgIGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+bWFuaWZlc3Q8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIG1hbmlmZXN0IGZpbGUKLSAgICAoPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4pIG9mIHlvdXIgdGVzdCBhcHBsaWNhdGlvbi4gVGhlIEFuZHJvaWQgdGVzdCBydW5uZXIKLSAgICBjbGFzcyBpcyB1c3VhbGx5IDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+LgotPC9wPgotPHA+WW91ciB0ZXN0IHJlc3VsdHMgYXBwZWFyIGluIDxjb2RlPlNURE9VVDwvY29kZT4uPC9wPgotICA8L2xpPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIHdoZXJlIDxjb2RlPiZsdDt0ZXN0X3BhY2thZ2VfbmFtZSZndDs8L2NvZGU+IGlzIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB5b3VyIHRlc3QKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uLCBhbmQgPGNvZGU+Jmx0O3J1bm5lcl9jbGFzcyZndDs8L2NvZGU+IGlzIHRoZSBuYW1lIG9mIHRoZSBBbmRyb2lkIHRlc3QKKyAgICAgICAgICAgIHJ1bm5lciBjbGFzcyB5b3UgYXJlIHVzaW5nLiBUaGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgaXMgdGhlIHZhbHVlIG9mIHRoZQorICAgICAgICAgICAgPGNvZGU+cGFja2FnZTwvY29kZT4gYXR0cmlidXRlIG9mIHRoZSA8Y29kZT5tYW5pZmVzdDwvY29kZT4gZWxlbWVudCBpbiB0aGUgbWFuaWZlc3QgZmlsZQorICAgICAgICAgICAgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBvZiB5b3VyIHRlc3QgcGFja2FnZS4gVGhlIEFuZHJvaWQgdGVzdCBydW5uZXIKKyAgICAgICAgICAgIGNsYXNzIGlzIHVzdWFsbHkge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfS4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFlvdXIgdGVzdCByZXN1bHRzIGFwcGVhciBpbiA8Y29kZT5TVERPVVQ8L2NvZGU+LgorICAgICAgICA8L3A+CisgICAgPC9saT4KIDwvb2w+CiA8cD4KLSAgICBUaGlzIG9wZXJhdGlvbiBzdGFydHMgYW4gPGNvZGU+YWRiPC9jb2RlPiBzaGVsbCwgdGhlbiBydW5zIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+IGluIGl0CisgICAgVGhpcyBvcGVyYXRpb24gc3RhcnRzIGFuIDxjb2RlPmFkYjwvY29kZT4gc2hlbGwsIHRoZW4gcnVucyA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPgogICAgIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBUaGlzIHBhcnRpY3VsYXIgZm9ybSBvZiB0aGUgY29tbWFuZCB3aWxsIHJ1biBhbGwgb2YgdGhlIHRlc3RzCi0gICAgaW4geW91ciB0ZXN0IGFwcGxpY2F0aW9uLiBZb3UgY2FuIGNvbnRyb2wgdGhpcyBiZWhhdmlvciB3aXRoIGZsYWdzIHRoYXQgeW91IHBhc3MgdG8KKyAgICBpbiB5b3VyIHRlc3QgcGFja2FnZS4gWW91IGNhbiBjb250cm9sIHRoaXMgYmVoYXZpb3Igd2l0aCBmbGFncyB0aGF0IHlvdSBwYXNzIHRvCiAgICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4uIFRoZXNlIGZsYWdzIGFyZSBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KIDwvcD4KLTxoMiBpZD0iQU1TeW50YXgiPlVzaW5nIHRoZSBJbnN0cnVtZW50IENvbW1hbmQ8L2gyPgorPGgyIGlkPSJBTVN5bnRheCI+VXNpbmcgdGhlIGFtIGluc3RydW1lbnQgQ29tbWFuZDwvaDI+CiA8cD4KLSAgVGhlIGdlbmVyYWwgc3ludGF4IG9mIHRoZSA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBjb21tYW5kIGlzOgorICAgIFRoZSBnZW5lcmFsIHN5bnRheCBvZiB0aGUgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gY29tbWFuZCBpczoKIDwvcD4KIDxwcmU+CiAgICAgYW0gaW5zdHJ1bWVudCBbZmxhZ3NdICZsdDt0ZXN0X3BhY2thZ2UmZ3Q7LyZsdDtydW5uZXJfY2xhc3MmZ3Q7CkBAIC0zOTEsMTEgKzM5NSwxMSBAQAogICAgICAgICAgICAgPGNvZGU+Jmx0O3Rlc3RfcGFja2FnZSZndDs8L2NvZGU+CiAgICAgICAgIDwvdGQ+CiAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIFRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIFRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB0aGUgdGVzdCBwYWNrYWdlLgogICAgICAgICA8L3RkPgogICAgICAgICA8dGQ+CiAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIDxjb2RlPnBhY2thZ2U8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+bWFuaWZlc3Q8L2NvZGU+Ci0gICAgICAgICAgICBlbGVtZW50IGluIHRoZSB0ZXN0IGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZS4KKyAgICAgICAgICAgIGVsZW1lbnQgaW4gdGhlIHRlc3QgcGFja2FnZSdzIG1hbmlmZXN0IGZpbGUuCiAgICAgICAgIDwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+CkBAIC00MTEsNyArNDE1LDcgQEAKICAgICA8L3RyPgogPC90YWJsZT4KIDxwPgotVGhlIGZsYWdzIGZvciA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisgICAgVGhlIGZsYWdzIGZvciA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CiA8L3A+CiA8dGFibGU+CiAgICAgPHRyPgpAQCAtNDYxLDIwICs0NjUsMjEgQEAKICAgICAgICAgICAgICAmbHQ7dGVzdF9vcHRpb25zJmd0OwogICAgICAgICA8L3RkPgogICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBQcm92aWRlcyB0ZXN0aW5nIG9wdGlvbnMgLCBpbiB0aGUgZm9ybSBvZiBrZXktdmFsdWUgcGFpcnMuIFRoZQorICAgICAgICAgICAgUHJvdmlkZXMgdGVzdGluZyBvcHRpb25zIGFzIGtleS12YWx1ZSBwYWlycy4gVGhlCiAgICAgICAgICAgICA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiB0b29sIHBhc3NlcyB0aGVzZSB0byB0aGUgc3BlY2lmaWVkIGluc3RydW1lbnRhdGlvbiBjbGFzcwogICAgICAgICAgICAgdmlhIGl0cyA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2QuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZgotICAgICAgICAgICAgPGNvZGU+LWUgJmx0O3Rlc3Rfb3B0aW9uczwvY29kZT4uIFRoZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCB0YWJsZS4KKyAgICAgICAgICAgIDxjb2RlPi1lICZsdDt0ZXN0X29wdGlvbnMmZ3Q7PC9jb2RlPi4gVGhlIGtleXMgYW5kIHZhbHVlcyBhcmUgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgc2VjdGlvbiA8YSBocmVmPSIjQU1PcHRpb25zU3ludGF4Ij5hbSBpbnN0cnVtZW50IG9wdGlvbnM8L2E+LgogICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgVGhlIG9ubHkgaW5zdHJ1bWVudGF0aW9uIGNsYXNzIHRoYXQgdW5kZXJzdGFuZHMgdGhlc2Uga2V5LXZhbHVlIHBhaXJzIGlzCi0gICAgICAgICAgICAgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gKG9yIGEgc3ViY2xhc3MpLiBVc2luZyB0aGVtIHdpdGgKKyAgICAgICAgICAgICAgICBUaGUgb25seSBpbnN0cnVtZW50YXRpb24gY2xhc3MgdGhhdCB1c2VzIHRoZXNlIGtleS12YWx1ZSBwYWlycyBpcworICAgICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gKG9yIGEgc3ViY2xhc3MpLiBVc2luZyB0aGVtIHdpdGgKICAgICAgICAgICAgICAgICBhbnkgb3RoZXIgY2xhc3MgaGFzIG5vIGVmZmVjdC4KICAgICAgICAgICAgIDwvcD4KICAgICAgICAgPC90ZD4KICAgICA8L3RyPgogPC90YWJsZT4KIAotPGgzIGlkPSJBTU9wdGlvbnNTeW50YXgiPkluc3RydW1lbnQgb3B0aW9uczwvaDM+Cis8aDMgaWQ9IkFNT3B0aW9uc1N5bnRheCI+YW0gaW5zdHJ1bWVudCBvcHRpb25zPC9oMz4KIDxwPgogICAgIFRoZSA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiB0b29sIHBhc3NlcyB0ZXN0aW5nIG9wdGlvbnMgdG8KICAgICA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiBvciBhIHN1YmNsYXNzIGluIHRoZSBmb3JtIG9mIGtleS12YWx1ZSBwYWlycywKQEAgLTQ4NCwxMjMgKzQ4OSwxMjcgQEAKICAgICAtZSAmbHQ7a2V5Jmd0OyAmbHQ7dmFsdWUmZ3Q7CiA8L3ByZT4KIDxwPgotICAgIFdoZXJlIGFwcGxpY2FibGUsIGEgJmx0O2tleSZndDsgbWF5IGhhdmUgbXVsdGlwbGUgdmFsdWVzIHNlcGFyYXRlZCBieSBhIGNvbW1hICgsKS4KKyAgICBTb21lIGtleXMgYWNjZXB0IG11bHRpcGxlIHZhbHVlcy4gWW91IHNwZWNpZnkgbXVsdGlwbGUgdmFsdWVzIGluIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QuCiAgICAgRm9yIGV4YW1wbGUsIHRoaXMgaW52b2NhdGlvbiBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiBwcm92aWRlcyBtdWx0aXBsZQogICAgIHZhbHVlcyBmb3IgdGhlIDxjb2RlPnBhY2thZ2U8L2NvZGU+IGtleToKKzwvcD4KIDxwcmU+Ci0kIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1lIHBhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5wYWNrYWdlMSxjb20uYW5kcm9pZC50ZXN0LnBhY2thZ2UyIGNvbS5hbmRyb2lkLnRlc3QvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKKyQgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLWUgcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0LnBhY2thZ2UxLGNvbS5hbmRyb2lkLnRlc3QucGFja2FnZTIgXAorJmd0OyBjb20uYW5kcm9pZC50ZXN0L2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiA8L3ByZT4KIDxwPgogICAgIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSBrZXktdmFsdWUgcGFpcnMgYW5kIHRoZWlyIHJlc3VsdC4gUGxlYXNlIHJldmlldyB0aGUKICAgICA8c3Ryb25nPlVzYWdlIE5vdGVzPC9zdHJvbmc+IGZvbGxvd2luZyB0aGUgdGFibGUuCiA8L3A+CiA8dGFibGU+Ci08dHI+Ci0gICAgPHRoPktleTwvdGg+Ci0gICAgPHRoPlZhbHVlPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+Ci0gICAgICAgIDxjb2RlPnBhY2thZ2U8L2NvZGU+Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgICZsdDtKYXZhX3BhY2thZ2VfbmFtZSZndDsKLSAgICA8L3RkPgotICAgIDx0ZD4KLSAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCA8ZW0+SmF2YTwvZW0+IHBhY2thZ2UgbmFtZSBmb3Igb25lIG9mIHRoZSBwYWNrYWdlcyBpbiB0aGUgdGVzdAotICAgICAgICBhcHBsaWNhdGlvbi4gQW55IHRlc3QgY2FzZSBjbGFzcyB0aGF0IHVzZXMgdGhpcyBwYWNrYWdlIG5hbWUgaXMgZXhlY3V0ZWQuIE5vdGljZSB0aGF0IHRoaXMKLSAgICAgICAgaXMgbm90IGFuIDxlbT5BbmRyb2lkPC9lbT4gcGFja2FnZSBuYW1lOyBhIHRlc3QgYXBwbGljYXRpb24gaGFzIGEgc2luZ2xlIEFuZHJvaWQgcGFja2FnZQotICAgICAgICBuYW1lIGJ1dCBtYXkgaGF2ZSBzZXZlcmFsIEphdmEgcGFja2FnZXMgd2l0aGluIGl0LgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZCByb3dzcGFuPSIyIj48Y29kZT5jbGFzczwvY29kZT48L3RkPgotICAgIDx0ZD4mbHQ7Y2xhc3NfbmFtZSZndDs8L3RkPgotICAgIDx0ZD4KLSAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgZm9yIG9uZSBvZiB0aGUgdGVzdCBjYXNlIGNsYXNzZXMuIE9ubHkgdGhpcyB0ZXN0IGNhc2UKLSAgICAgICAgY2xhc3MgaXMgZXhlY3V0ZWQuCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPiZsdDtjbGFzc19uYW1lJmd0OzxzdHJvbmc+Izwvc3Ryb25nPm1ldGhvZCBuYW1lPC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIEEgZnVsbHktcXVhbGlmaWVkIHRlc3QgY2FzZSBjbGFzcyBuYW1lLCBhbmQgb25lIG9mIGl0cyBtZXRob2RzLiBPbmx5IHRoaXMgbWV0aG9kIGlzCi0gICAgICAgIGV4ZWN1dGVkLiBOb3RlIHRoZSBoYXNoIG1hcmsgKCMpIGJldHdlZW4gdGhlIGNsYXNzIG5hbWUgYW5kIHRoZSBtZXRob2QgbmFtZS4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+ZnVuYzwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBSdW5zIGFsbCB0ZXN0IGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPnVuaXQ8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgZG8gPGVtPm5vdDwvZW0+IGV4dGVuZCBlaXRoZXIKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0gb3Ige0BsaW5rIGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlfS4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+c2l6ZTwvY29kZT48L3RkPgotICAgIDx0ZD5bPGNvZGU+c21hbGw8L2NvZGU+IHwgPGNvZGU+bWVkaXVtPC9jb2RlPiB8IDxjb2RlPmxhcmdlPC9jb2RlPl0KLSAgICA8L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyBhIHRlc3QgbWV0aG9kIGFubm90YXRlZCBieSBzaXplLiBUaGUgIGFubm90YXRpb25zIGFyZSA8Y29kZT5AU21hbGxUZXN0PC9jb2RlPiwKLSAgICAgICAgPGNvZGU+QE1lZGl1bVRlc3Q8L2NvZGU+LCBhbmQgPGNvZGU+QExhcmdlVGVzdDwvY29kZT4uCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPnBlcmY8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHtAbGluayBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZX0uCi0gICAgICAgIFdoZW4geW91IHVzZSB0aGlzIG9wdGlvbiwgYWxzbyBzcGVjaWZ5IHRoZSA8Y29kZT4tcjwvY29kZT4gZmxhZyBmb3IKLSAgICAgICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4sIHNvIHRoYXQgdGhlIG91dHB1dCBpcyBrZXB0IGluIHJhdyBmb3JtYXQgYW5kIG5vdAotICAgICAgICByZS1mb3JtYXR0ZWQgYXMgdGVzdCByZXN1bHRzLgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT5kZWJ1ZzwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBSdW5zIHRlc3RzIGluIGRlYnVnIG1vZGUuCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPmxvZzwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBMb2FkcyBhbmQgbG9ncyBhbGwgc3BlY2lmaWVkIHRlc3RzLCBidXQgZG9lcyBub3QgcnVuIHRoZW0uIFRoZSB0ZXN0Ci0gICAgICAgIGluZm9ybWF0aW9uIGFwcGVhcnMgaW4gPGNvZGU+U1RET1VUPC9jb2RlPi4gVXNlIHRoaXMgdG8gdmVyaWZ5IGNvbWJpbmF0aW9ucyBvZiBvdGhlciBmaWx0ZXJzCi0gICAgICAgIGFuZCB0ZXN0IHNwZWNpZmljYXRpb25zLgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT5lbW1hPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFJ1bnMgYW4gRU1NQSBjb2RlIGNvdmVyYWdlIGFuYWx5c2lzIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byA8Y29kZT4vZGF0YS8vY292ZXJhZ2UuZWM8L2NvZGU+Ci0gICAgICAgIG9uIHRoZSBkZXZpY2UuIFRvIG92ZXJyaWRlIHRoZSBmaWxlIGxvY2F0aW9uLCB1c2UgdGhlIDxjb2RlPmNvdmVyYWdlRmlsZTwvY29kZT4ga2V5IHRoYXQKLSAgICAgICAgaXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgZW50cnkuCi0gICAgICAgIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgICAgICAgIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBvcHRpb24gcmVxdWlyZXMgYW4gRU1NQS1pbnN0cnVtZW50ZWQgYnVpbGQgb2YgdGhlIHRlc3QKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uLCB3aGljaCB5b3UgY2FuIGdlbmVyYXRlIHdpdGggdGhlIDxjb2RlPmNvdmVyYWdlPC9jb2RlPiB0YXJnZXQuCi0gICAgICAgIDwvcD4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+Y292ZXJhZ2VGaWxlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPjxjb2RlPiZsdDtmaWxlbmFtZSZndDs8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgRU1NQSBjb3ZlcmFnZSBmaWxlIG9uIHRoZSBkZXZpY2UuIFNwZWNpZnkgdGhpcwotICAgICAgICB2YWx1ZSBhcyBhIHBhdGggYW5kIGZpbGVuYW1lIGluIFVOSVggZm9ybWF0LiBUaGUgZGVmYXVsdCBmaWxlbmFtZSBpcyBkZXNjcmliZWQgaW4gdGhlCi0gICAgICAgIGVudHJ5IGZvciB0aGUgPGNvZGU+ZW1tYTwvY29kZT4ga2V5LgotICAgIDwvdGQ+Ci08L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRoPktleTwvdGg+CisgICAgICAgIDx0aD5WYWx1ZTwvdGg+CisgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDxjb2RlPnBhY2thZ2U8L2NvZGU+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICZsdDtKYXZhX3BhY2thZ2VfbmFtZSZndDsKKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCA8ZW0+SmF2YTwvZW0+IHBhY2thZ2UgbmFtZSBmb3Igb25lIG9mIHRoZSBwYWNrYWdlcyBpbiB0aGUgdGVzdAorICAgICAgICAgICAgYXBwbGljYXRpb24uIEFueSB0ZXN0IGNhc2UgY2xhc3MgdGhhdCB1c2VzIHRoaXMgcGFja2FnZSBuYW1lIGlzIGV4ZWN1dGVkLiBOb3RpY2UgdGhhdAorICAgICAgICAgICAgdGhpcyBpcyBub3QgYW4gPGVtPkFuZHJvaWQ8L2VtPiBwYWNrYWdlIG5hbWU7IGEgdGVzdCBwYWNrYWdlIGhhcyBhIHNpbmdsZQorICAgICAgICAgICAgQW5kcm9pZCBwYWNrYWdlIG5hbWUgYnV0IG1heSBoYXZlIHNldmVyYWwgSmF2YSBwYWNrYWdlcyB3aXRoaW4gaXQuCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCByb3dzcGFuPSIyIj48Y29kZT5jbGFzczwvY29kZT48L3RkPgorICAgICAgICA8dGQ+Jmx0O2NsYXNzX25hbWUmZ3Q7PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgZm9yIG9uZSBvZiB0aGUgdGVzdCBjYXNlIGNsYXNzZXMuIE9ubHkgdGhpcyB0ZXN0CisgICAgICAgICAgICBjYXNlIGNsYXNzIGlzIGV4ZWN1dGVkLgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+Jmx0O2NsYXNzX25hbWUmZ3Q7PHN0cm9uZz4jPC9zdHJvbmc+bWV0aG9kIG5hbWU8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBBIGZ1bGx5LXF1YWxpZmllZCB0ZXN0IGNhc2UgY2xhc3MgbmFtZSwgYW5kIG9uZSBvZiBpdHMgbWV0aG9kcy4gT25seSB0aGlzIG1ldGhvZCBpcworICAgICAgICAgICAgZXhlY3V0ZWQuIE5vdGUgdGhlIGhhc2ggbWFyayAoIykgYmV0d2VlbiB0aGUgY2xhc3MgbmFtZSBhbmQgdGhlIG1ldGhvZCBuYW1lLgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+ZnVuYzwvY29kZT48L3RkPgorICAgICAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBSdW5zIGFsbCB0ZXN0IGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT51bml0PC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgYWxsIHRlc3QgY2xhc3NlcyB0aGF0IGRvIDxlbT5ub3Q8L2VtPiBleHRlbmQgZWl0aGVyCisgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfSBvcgorICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlfS4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPnNpemU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgWzxjb2RlPnNtYWxsPC9jb2RlPiB8IDxjb2RlPm1lZGl1bTwvY29kZT4gfCA8Y29kZT5sYXJnZTwvY29kZT5dCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgYSB0ZXN0IG1ldGhvZCBhbm5vdGF0ZWQgYnkgc2l6ZS4gVGhlICBhbm5vdGF0aW9ucyBhcmUgPGNvZGU+QFNtYWxsVGVzdDwvY29kZT4sCisgICAgICAgICAgICA8Y29kZT5ATWVkaXVtVGVzdDwvY29kZT4sIGFuZCA8Y29kZT5ATGFyZ2VUZXN0PC9jb2RlPi4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPnBlcmY8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHtAbGluayBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZX0uCisgICAgICAgICAgICBXaGVuIHlvdSB1c2UgdGhpcyBvcHRpb24sIGFsc28gc3BlY2lmeSB0aGUgPGNvZGU+LXI8L2NvZGU+IGZsYWcgZm9yCisgICAgICAgICAgICA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiwgc28gdGhhdCB0aGUgb3V0cHV0IGlzIGtlcHQgaW4gcmF3IGZvcm1hdCBhbmQgbm90CisgICAgICAgICAgICByZS1mb3JtYXR0ZWQgYXMgdGVzdCByZXN1bHRzLgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+ZGVidWc8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgUnVucyB0ZXN0cyBpbiBkZWJ1ZyBtb2RlLgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+bG9nPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIExvYWRzIGFuZCBsb2dzIGFsbCBzcGVjaWZpZWQgdGVzdHMsIGJ1dCBkb2VzIG5vdCBydW4gdGhlbS4gVGhlIHRlc3QKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIGFwcGVhcnMgaW4gPGNvZGU+U1RET1VUPC9jb2RlPi4gVXNlIHRoaXMgdG8gdmVyaWZ5IGNvbWJpbmF0aW9ucyBvZiBvdGhlcgorICAgICAgICAgICAgZmlsdGVycyBhbmQgdGVzdCBzcGVjaWZpY2F0aW9ucy4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmVtbWE8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgUnVucyBhbiBFTU1BIGNvZGUgY292ZXJhZ2UgYW5hbHlzaXMgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvCisgICAgICAgICAgICA8Y29kZT4vZGF0YS8vY292ZXJhZ2UuZWM8L2NvZGU+IG9uIHRoZSBkZXZpY2UuIFRvIG92ZXJyaWRlIHRoZSBmaWxlIGxvY2F0aW9uLCB1c2UgdGhlCisgICAgICAgICAgICA8Y29kZT5jb3ZlcmFnZUZpbGU8L2NvZGU+IGtleSB0aGF0IGlzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIGVudHJ5LgorICAgICAgICAgICAgPHAgY2xhc3M9Im5vdGUiPgorICAgICAgICAgICAgICAgIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBvcHRpb24gcmVxdWlyZXMgYW4gRU1NQS1pbnN0cnVtZW50ZWQgYnVpbGQgb2YgdGhlIHRlc3QKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiwgd2hpY2ggeW91IGNhbiBnZW5lcmF0ZSB3aXRoIHRoZSA8Y29kZT5jb3ZlcmFnZTwvY29kZT4gdGFyZ2V0LgorICAgICAgICAgICAgPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+Y292ZXJhZ2VGaWxlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgRU1NQSBjb3ZlcmFnZSBmaWxlIG9uIHRoZSBkZXZpY2UuIFNwZWNpZnkgdGhpcworICAgICAgICAgICAgdmFsdWUgYXMgYSBwYXRoIGFuZCBmaWxlbmFtZSBpbiBVTklYIGZvcm1hdC4gVGhlIGRlZmF1bHQgZmlsZW5hbWUgaXMgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgZW50cnkgZm9yIHRoZSA8Y29kZT5lbW1hPC9jb2RlPiBrZXkuCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KIDwvdGFibGU+CiA8c3Ryb25nPjxjb2RlPi1lPC9jb2RlPiBGbGFnIFVzYWdlIE5vdGVzPC9zdHJvbmc+CiA8dWw+CkBAIC02MTgsMTMgKzYyNywxMyBAQAogICAgICAgICBUaGUgPGNvZGU+ZnVuYzwvY29kZT4ga2V5IGFuZCA8Y29kZT51bml0PC9jb2RlPiBrZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KICAgICA8L2xpPgogPC91bD4KLTxoMyBpZD0iUnVuVGVzdEV4YW1wbGVzIj5JbnN0cnVtZW50IGV4YW1wbGVzPC9oMz4KKzxoMyBpZD0iUnVuVGVzdEV4YW1wbGVzIj5Vc2FnZSBleGFtcGxlczwvaDM+CiA8cD4KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdXNpbmcgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gdG8gcnVuIHRlc3RzLiBUaGV5IGFyZSBiYXNlZCBvbgotdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6PC9wPgorVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBwcm92aWRlIGV4YW1wbGVzIG9mIHVzaW5nIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+IHRvIHJ1biB0ZXN0cy4KK1RoZXkgYXJlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOjwvcD4KIDx1bD4KICAgICA8bGk+Ci0gICAgICAgIFRoZSB0ZXN0IGFwcGxpY2F0aW9uIGhhcyB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgPGNvZGU+Y29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHM8L2NvZGU+CisgICAgICAgIFRoZSB0ZXN0IHBhY2thZ2UgaGFzIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSA8Y29kZT5jb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0czwvY29kZT4KICAgICA8L2xpPgogICAgIDxsaT4KICAgICAgICAgVGhlcmUgYXJlIHRocmVlIHRlc3QgY2xhc3NlczoKQEAgLTY0NywzNSArNjU2LDM1IEBACiAgICAgICAgIFRoZSB0ZXN0IHJ1bm5lciBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LgogICAgIDwvbGk+CiA8L3VsPgotPGg0PlJ1bm5pbmcgdGhlIEVudGlyZSBUZXN0IEFwcGxpY2F0aW9uPC9oND4KKzxoND5SdW5uaW5nIHRoZSBlbnRpcmUgdGVzdCBwYWNrYWdlPC9oND4KIDxwPgotICAgIFRvIHJ1biBhbGwgb2YgdGhlIHRlc3QgY2xhc3NlcyBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgZW50ZXI6CisgICAgVG8gcnVuIGFsbCBvZiB0aGUgdGVzdCBjbGFzc2VzIGluIHRoZSB0ZXN0IHBhY2thZ2UsIGVudGVyOgogPC9wPgogPHByZT4KICQgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKIDwvcHJlPgotPGg0PlJ1bm5pbmcgQWxsIFRlc3RzIGluIGEgVGVzdCBDYXNlIENsYXNzPC9oND4KKzxoND5SdW5uaW5nIGFsbCB0ZXN0cyBpbiBhIHRlc3QgY2FzZSBjbGFzczwvaDQ+CiA8cD4KICAgICBUbyBydW4gYWxsIG9mIHRoZSB0ZXN0cyBpbiB0aGUgY2xhc3MgPGNvZGU+VW5pdFRlc3RzPC9jb2RlPiwgZW50ZXI6CiA8L3A+CiA8cHJlPgogJCBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAgXAotLWUgY2xhc3MgY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMuVW5pdFRlc3RzIFwKLWNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCismZ3Q7IC1lIGNsYXNzIGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLlVuaXRUZXN0cyBcCismZ3Q7IGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiA8L3ByZT4KIDxwPgogICA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBnZXRzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+LWU8L2NvZGU+IGZsYWcsIGRldGVjdHMgdGhlCiAgIDxjb2RlPmNsYXNzPC9jb2RlPiBrZXl3b3JkLCBhbmQgcnVucyBhbGwgdGhlIG1ldGhvZHMgaW4gdGhlIDxjb2RlPlVuaXRUZXN0czwvY29kZT4gY2xhc3MuCiA8L3A+Ci08aDQ+U2VsZWN0aW5nIGEgU3Vic2V0IG9mIFRlc3RzPC9oND4KKzxoND5TZWxlY3RpbmcgYSBzdWJzZXQgb2YgdGVzdHM8L2g0PgogPHA+Ci0gIFRvIHJ1biBhbGwgb2YgdGhlIHRlc3RzIGluIDxjb2RlPlVuaXRUZXN0czwvY29kZT4sIGFuZCB0aGUgPGNvZGU+dGVzdENhbWVyYTwvY29kZT4gbWV0aG9kIGluCi0gIDxjb2RlPkZ1bmN0aW9uVGVzdHM8L2NvZGU+LCBlbnRlcjoKKyAgICBUbyBydW4gYWxsIG9mIHRoZSB0ZXN0cyBpbiA8Y29kZT5Vbml0VGVzdHM8L2NvZGU+LCBhbmQgdGhlIDxjb2RlPnRlc3RDYW1lcmE8L2NvZGU+IG1ldGhvZCBpbgorICAgIDxjb2RlPkZ1bmN0aW9uVGVzdHM8L2NvZGU+LCBlbnRlcjoKIDwvcD4KIDxwcmU+CiAkIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IFwKLS1lIGNsYXNzIGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLlVuaXRUZXN0cyxjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy5GdW5jdGlvblRlc3RzI3Rlc3RDYW1lcmEgXAotY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKKyZndDsgLWUgY2xhc3MgY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMuVW5pdFRlc3RzLGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLkZ1bmN0aW9uVGVzdHMjdGVzdENhbWVyYSBcCismZ3Q7IGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiA8L3ByZT4KIDxwPgogICAgIFlvdSBjYW4gZmluZCBtb3JlIGV4YW1wbGVzIG9mIHRoZSBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcyBiL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MKaW5kZXggNDNhNWU4ZC4uZGE4YzkyNyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcworKysgYi9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzCkBAIC0yNTQsMTIgKzI1NCwzNCBAQAogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdD8+Z3VpZGUvdG9waWNzL3NlYXJjaC9zZWFyY2hhYmxlLWNvbmZpZy5odG1sIj5TZWFyY2hhYmxlIENvbmZpZ3VyYXRpb248L2E+PC9saT4KICAgICAgICAgICA8L3VsPgogICAgICAgPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3Q/Pmd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGVzdGluZyBhbmQgSW5zdHJ1bWVudGF0aW9uPC9zcGFuPjwvYT4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL3RvcGljcy90ZXN0aW5nL2luZGV4Lmh0bWwiPgorICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGVzdGluZzwvc3Bhbj4KKyAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdD8+Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L3NwYW4+PC9hPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290Pz5ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QWN0aXZpdHkgVGVzdGluZzwvc3Bhbj48L2E+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5odG1sIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNvbnRlbnQgUHJvdmlkZXIgVGVzdGluZzwvc3Bhbj48L2E+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TZXJ2aWNlIFRlc3Rpbmc8L3NwYW4+PC9hPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0Lmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2hhdCBUbyBUZXN0PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CiAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3Q/Pmd1aWRlL3RvcGljcy9hZG1pbi9kZXZpY2UtYWRtaW4uaHRtbCI+CiAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkRldmljZSBBZG1pbmlzdHJhdGlvbjwvc3Bhbj48L2E+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPgorICAgIDwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZAppbmRleCBhMDk1MDg3Li44NGMyZWQyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZApAQCAtMjk0LDggKzI5NCw4IEBACiA8bGk+PHA+QSBzZXJ2aWNlIGlzIHN0YXJ0ZWQgKG9yIG5ldyBpbnN0cnVjdGlvbnMgYXJlIGdpdmVuIHRvIGFuIG9uZ29pbmcgCiBzZXJ2aWNlKSBieSBwYXNzaW5nIGFuIEludGVudCBvYmplY3QgdG8gPGNvZGU+e0BsaW5rIAogYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RhcnRTZXJ2aWNlIENvbnRleHQuc3RhcnRTZXJ2aWNlKCl9PC9jb2RlPi4gIAotQW5kcm9pZCBjYWxscyB0aGUgc2VydmljZSdzIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnQgCi1vblN0YXJ0KCl9PC9jb2RlPiBtZXRob2QgYW5kIHBhc3NlcyBpdCB0aGUgSW50ZW50IG9iamVjdC48L3A+CitBbmRyb2lkIGNhbGxzIHRoZSBzZXJ2aWNlJ3MgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydENvbW1hbmQKK29uU3RhcnRDb21tYW5kKCl9PC9jb2RlPiBtZXRob2QgYW5kIHBhc3NlcyBpdCB0aGUgSW50ZW50IG9iamVjdC48L3A+CiAKIDxwPgogU2ltaWxhcmx5LCBhbiBpbnRlbnQgY2FuIGJlIHBhc3NlZCB0byA8Y29kZT57QGxpbmsgCkBAIC0xNTEwLDkgKzE1MTAsOSBAQAogaW4ge0Bjb2RlIG9uQ3JlYXRlKCl9LCBhbmQgdGhlbiBzdG9wIHRoZSB0aHJlYWQgaW4ge0Bjb2RlIG9uRGVzdHJveSgpfS48L2xpPgogCiA8bGk+PHA+VGhlIDxiPmFjdGl2ZSBsaWZldGltZTwvYj4gb2YgYSBzZXJ2aWNlIGJlZ2lucyB3aXRoIGEgY2FsbCB0byAKLTxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnQgb25TdGFydCgpfTwvY29kZT4uICBUaGlzIG1ldGhvZCAKKzxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnRDb21tYW5kIG9uU3RhcnRDb21tYW5kKCl9PC9jb2RlPi4gIFRoaXMgbWV0aG9kCiBpcyBoYW5kZWQgdGhlIEludGVudCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIHRvIHtAY29kZSBzdGFydFNlcnZpY2UoKX0uCi1UaGUgbXVzaWMgc2VydmljZSB3b3VsZCBvcGVuIHRoZSBJbnRlbnQgdG8gZGlzY292ZXIgd2hpY2ggbXVzaWMgdG8gCitUaGUgbXVzaWMgc2VydmljZSB3b3VsZCBvcGVuIHRoZSBJbnRlbnQgdG8gZGlzY292ZXIgd2hpY2ggbXVzaWMgdG8KIHBsYXksIGFuZCBiZWdpbiB0aGUgcGxheWJhY2suPC9wPgogCiA8cD4KQEAgLTE1MjcsNyArMTUyNyw3IEBACiA8Y29kZT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RhcnRTZXJ2aWNlIENvbnRleHQuc3RhcnRTZXJ2aWNlKCl9PC9jb2RlPgogb3IgCiA8Y29kZT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjYmluZFNlcnZpY2UgQ29udGV4dC5iaW5kU2VydmljZSgpfTwvY29kZT4uCi1Ib3dldmVyLCB7QGNvZGUgb25TdGFydCgpfSBpcyBjYWxsZWQgb25seSBmb3Igc2VydmljZXMgc3RhcnRlZCBieSB7QGNvZGUKK0hvd2V2ZXIsIHtAY29kZSBvblN0YXJ0Q29tbWFuZCgpfSBpcyBjYWxsZWQgb25seSBmb3Igc2VydmljZXMgc3RhcnRlZCBieSB7QGNvZGUKIHN0YXJ0U2VydmljZSgpfS4KIDwvcD4KIApAQCAtMTYzMSw3ICsxNjMxLDcgQEAKIAogPGxpPjxwPkl0IGhhcyBhIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlfSBvYmplY3QgdGhhdCdzIGV4ZWN1dGluZwogb25lIG9mIGl0cyBsaWZlY3ljbGUgY2FsbGJhY2tzICg8Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSAKLW9uQ3JlYXRlKCl9PC9jb2RlPiwgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydCBvblN0YXJ0KCl9PC9jb2RlPiwgCitvbkNyZWF0ZSgpfTwvY29kZT4sIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnRDb21tYW5kIG9uU3RhcnRDb21tYW5kKCl9PC9jb2RlPiwKIG9yIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uRGVzdHJveSBvbkRlc3Ryb3koKX08L2NvZGU+KS48L3A+PC9saT4KIAogPGxpPjxwPkl0IGhhcyBhIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9IG9iamVjdCB0aGF0J3MgCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9hY3Rpdml0aWVzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvYWN0aXZpdGllcy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjE2YWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvYWN0aXZpdGllcy5qZApAQCAtMCwwICsxLDc2MiBAQAorcGFnZS50aXRsZT1BY3Rpdml0aWVzCitwYXJlbnQudGl0bGU9QXBwbGljYXRpb24gRnVuZGFtZW50YWxzCitwYXJlbnQubGluaz1pbmRleC5odG1sCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKzxkaXYgaWQ9InF2Ij4KKzxoMj5RdWlja3ZpZXc8L2gyPgorPHVsPgorICA8bGk+QW4gYWN0aXZpdHkgcHJvdmlkZXMgYSB1c2VyIGludGVyZmFjZSBmb3IgYSBzaW5nbGUgc2NyZWVuIGluIHlvdXIgYXBwbGljYXRpb248L2xpPgorICA8bGk+QWN0aXZpdGllcyBjYW4gbW92ZSBpbnRvIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGVuIGJlIHJlc3VtZWQgd2l0aCB0aGVpciBzdGF0ZSByZXN0b3JlZDwvbGk+Cis8L3VsPgorCis8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+Cis8b2w+CisgIDxsaT48YSBocmVmPSIjQ3JlYXRpbmciPkNyZWF0aW5nIGFuIEFjdGl2aXR5PC9hPgorICAgIDxvbD4KKyAgICAgIDxsaT48YSBocmVmPSIjVUkiPkltcGxlbWVudGluZyBhIHVzZXIgaW50ZXJmYWNlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI0RlY2xhcmluZyI+RGVjbGFyaW5nIHRoZSBhY3Rpdml0eSBpbiB0aGUgbWFuaWZlc3Q8L2E+PC9saT4KKyAgICA8L29sPgorICA8L2xpPgorICA8bGk+PGEgaHJlZj0iI1N0YXJ0aW5nQW5BY3Rpdml0eSI+U3RhcnRpbmcgYW4gQWN0aXZpdHk8L2E+CisgICAgPG9sPgorICAgICAgPGxpPjxhIGhyZWY9IiNTdGFydGluZ0FuQWN0aXZpdHlGb3JSZXN1bHQiPlN0YXJ0aW5nIGFuIEFjdGl2aXR5IGZvciBhIFJlc3VsdDwvYT48L2xpPgorICAgIDwvb2w+CisgIDwvbGk+CisgIDxsaT48YSBocmVmPSIjTGlmZWN5Y2xlIj5NYW5hZ2luZyB0aGUgQWN0aXZpdHkgTGlmZWN5Y2xlPC9hPgorICAgIDxvbD4KKyAgICAgIDxsaT48YSBocmVmPSIjSW1wbGVtZW50aW5nTGlmZWN5Y2xlQ2FsbGJhY2tzIj5JbXBsZW1lbnRpbmcgdGhlIGxpZmVjeWNsZSBjYWxsYmFja3M8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjU2F2aW5nQWN0aXZpdHlTdGF0ZSI+U2F2aW5nIGFjdGl2aXR5IHN0YXRlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI0NvbmZpZ3VyYXRpb25DaGFuZ2VzIj5IYW5kbGluZyBjb25maWd1cmF0aW9uIGNoYW5nZXM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjQ29vcmRpbmF0aW5nQWN0aXZpdGllcyI+Q29vcmRpbmF0aW5nIGFjdGl2aXRpZXM8L2E+PC9saT4KKyAgICA8L29sPgorICA8L2xpPgorPC9vbD4KKworPGgyPktleSBjbGFzc2VzPC9oMj4KKzxvbD4KKyAgPGxpPntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX08L2xpPgorPC9vbD4KKworPGgyPlNlZSBhbHNvPC9oMj4KKzxvbD4KKyAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwiPkhlbGxvIFdvcmxkIFR1dG9yaWFsPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjayI+VGFza3MgYW5kIEJhY2sKK1N0YWNrPC9hPjwvbGk+Cis8L29sPgorCis8L2Rpdj4KKzwvZGl2PgorCisKKworPHA+QW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSBpcyBhbiBhcHBsaWNhdGlvbiBjb21wb25lbnQgdGhhdCBwcm92aWRlcyBhIHNjcmVlbiB3aXRoIHdoaWNoCit1c2VycyBjYW4gaW50ZXJhY3QgaW4gb3JkZXIgdG8gZG8gc29tZXRoaW5nLCBzdWNoIGFzIGRpYWwgdGhlIHBob25lLCB0YWtlIGEgcGhvdG8sIHNlbmQgYW4gZW1haWwsIG9yCit2aWV3IGEgbWFwLiBFYWNoIGFjdGl2aXR5IGlzIGdpdmVuIGEgd2luZG93IGluIHdoaWNoIHRvIGRyYXcgaXRzIHVzZXIgaW50ZXJmYWNlLiBUaGUgd2luZG93Cit0eXBpY2FsbHkgZmlsbHMgdGhlIHNjcmVlbiwgYnV0IG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIHNjcmVlbiBhbmQgZmxvYXQgb24gdG9wIG9mIG90aGVyCit3aW5kb3dzLjwvcD4KKworPHA+IEFuIGFwcGxpY2F0aW9uIHVzdWFsbHkgY29uc2lzdHMgb2YgbXVsdGlwbGUgYWN0aXZpdGllcyB0aGF0IGFyZSBsb29zZWx5IGJvdW5kCit0byBlYWNoIG90aGVyLiBUeXBpY2FsbHksIG9uZSBhY3Rpdml0eSBpbiBhbiBhcHBsaWNhdGlvbiBpcyBzcGVjaWZpZWQgYXMgdGhlICJtYWluIiBhY3Rpdml0eSwgd2hpY2gKK2lzIHByZXNlbnRlZCB0byB0aGUgdXNlciB3aGVuIGxhdW5jaGluZyB0aGUgYXBwbGljYXRpb24gZm9yIHRoZSBmaXJzdCB0aW1lLiBFYWNoCithY3Rpdml0eSBjYW4gdGhlbiBzdGFydCBhbm90aGVyIGFjdGl2aXR5IGluIG9yZGVyIHRvIHBlcmZvcm0gZGlmZmVyZW50IGFjdGlvbnMuIEVhY2ggdGltZSBhIG5ldworYWN0aXZpdHkgc3RhcnRzLCB0aGUgcHJldmlvdXMgYWN0aXZpdHkgaXMgc3RvcHBlZCwgYnV0IHRoZSBzeXN0ZW0gcHJlc2VydmVzIHRoZSBhY3Rpdml0eQoraW4gYSBzdGFjayAodGhlICJiYWNrIHN0YWNrIikuIFdoZW4gYSBuZXcgYWN0aXZpdHkgc3RhcnRzLCBpdCBpcyBwdXNoZWQgb250byB0aGUgYmFjayBzdGFjayBhbmQKK3Rha2VzIHVzZXIgZm9jdXMuIFRoZSBiYWNrIHN0YWNrIGFiaWRlcyB0byB0aGUgYmFzaWMgImxhc3QgaW4sIGZpcnN0IG91dCIgcXVldWUgbWVjaGFuaXNtLAorc28sIHdoZW4gdGhlIHVzZXIgaXMgZG9uZSB3aXRoIHRoZSBjdXJyZW50IGFjdGl2aXR5IGFuZCBwcmVzc2VzIHRoZSBCQUNLIGtleSwgaXQKK2lzIHBvcHBlZCBmcm9tIHRoZSBzdGFjayAoYW5kIGRlc3Ryb3llZCkgYW5kIHRoZSBwcmV2aW91cyBhY3Rpdml0eSByZXN1bWVzLiAoVGhlIGJhY2sgc3RhY2sgaXMKK2Rpc2N1c3NlZCBtb3JlIGluIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjay5odG1sIj5UYXNrcworYW5kIEJhY2sgU3RhY2s8L2E+IGRvY3VtZW50Lik8L3A+CisKKzxwPldoZW4gYW4gYWN0aXZpdHkgaXMgc3RvcHBlZCBiZWNhdXNlIGEgbmV3IGFjdGl2aXR5IHN0YXJ0cywgaXQgaXMgbm90aWZpZWQgb2YgdGhpcyBjaGFuZ2UgaW4gc3RhdGUKK3Rocm91Z2ggdGhlIGFjdGl2aXR5J3MgbGlmZWN5Y2xlIGNhbGxiYWNrIG1ldGhvZHMuCitUaGVyZSBhcmUgc2V2ZXJhbCBjYWxsYmFjayBtZXRob2RzIHRoYXQgYW4gYWN0aXZpdHkgbWlnaHQgcmVjZWl2ZSwgZHVlIHRvIGEgY2hhbmdlIGluIGl0cworc3RhdGUmbWRhc2g7d2hldGhlciB0aGUgc3lzdGVtIGlzIGNyZWF0aW5nIGl0LCBzdG9wcGluZyBpdCwgcmVzdW1pbmcgaXQsIG9yIGRlc3Ryb3lpbmcgaXQmbWRhc2g7YW5kCitlYWNoIGNhbGxiYWNrIHByb3ZpZGVzIHlvdSB0aGUgb3Bwb3J0dW5pdHkgdG8gcGVyZm9ybSBzcGVjaWZpYyB3b3JrIHRoYXQncworYXBwcm9wcmlhdGUgdG8gdGhhdCBzdGF0ZSBjaGFuZ2UuIEZvciBpbnN0YW5jZSwgd2hlbiBzdG9wcGVkLCB5b3VyIGFjdGl2aXR5IHNob3VsZCByZWxlYXNlIGFueQorbGFyZ2Ugb2JqZWN0cywgc3VjaCBhcyBuZXR3b3JrIG9yIGRhdGFiYXNlIGNvbm5lY3Rpb25zLiBXaGVuIHRoZSBhY3Rpdml0eSByZXN1bWVzLCB5b3UgY2FuCityZWFjcXVpcmUgdGhlIG5lY2Vzc2FyeSByZXNvdXJjZXMgYW5kIHJlc3VtZSBhY3Rpb25zIHRoYXQgd2VyZSBpbnRlcnJ1cHRlZC4gVGhlc2Ugc3RhdGUgdHJhbnNpdGlvbnMKK2FyZSBhbGwgcGFydCBvZiB0aGUgYWN0aXZpdHkgbGlmZWN5Y2xlLjwvcD4KKworPHA+VGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudCBkaXNjdXNzZXMgdGhlIGJhc2ljcyBvZiBob3cgdG8gYnVpbGQgYW5kIHVzZSBhbiBhY3Rpdml0eSwKK2luY2x1ZGluZyBhIGNvbXBsZXRlIGRpc2N1c3Npb24gb2YgaG93IHRoZSBhY3Rpdml0eSBsaWZlY3ljbGUgd29ya3MsIHNvIHlvdSBjYW4gcHJvcGVybHkgbWFuYWdlCit0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIHZhcmlvdXMgYWN0aXZpdHkgc3RhdGVzLjwvcD4KKworCisKKzxoMiBpZD0iQ3JlYXRpbmciPkNyZWF0aW5nIGFuIEFjdGl2aXR5PC9oMj4KKworPHA+VG8gY3JlYXRlIGFuIGFjdGl2aXR5LCB5b3UgbXVzdCBjcmVhdGUgYSBzdWJjbGFzcyBvZiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9IChvcgorYW4gZXhpc3Rpbmcgc3ViY2xhc3Mgb2YgaXQpLiBJbiB5b3VyIHN1YmNsYXNzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2sgbWV0aG9kcyB0aGF0IHRoZQorc3lzdGVtIGNhbGxzIHdoZW4gdGhlIGFjdGl2aXR5IHRyYW5zaXRpb25zIGJldHdlZW4gdmFyaW91cyBzdGF0ZXMgb2YgaXRzIGxpZmVjeWNsZSwgc3VjaCBhcyB3aGVuCit0aGUgYWN0aXZpdHkgaXMgYmVpbmcgY3JlYXRlZCwgc3RvcHBlZCwgcmVzdW1lZCwgb3IgZGVzdHJveWVkLiBUaGUgdHdvIG1vc3QgaW1wb3J0YW50IGNhbGxiYWNrCittZXRob2RzIGFyZTo8L3A+CisKKzxkbD4KKyAgPGR0PntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfTwvZHQ+CisgIDxkZD5Zb3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuIFRoZSBzeXN0ZW0gY2FsbHMgdGhpcyB3aGVuIGNyZWF0aW5nIHlvdXIKKyAgICBhY3Rpdml0eS4gV2l0aGluIHlvdXIgaW1wbGVtZW50YXRpb24sIHlvdSBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgZXNzZW50aWFsIGNvbXBvbmVudHMgb2YgeW91cgorYWN0aXZpdHkuCisgICAgTW9zdCBpbXBvcnRhbnRseSwgdGhpcyBpcyB3aGVyZSB5b3UgbXVzdCBjYWxsIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzZXRDb250ZW50VmlldworICAgIHNldENvbnRlbnRWaWV3KCl9IHRvIGRlZmluZSB0aGUgbGF5b3V0IGZvciB0aGUgYWN0aXZpdHkncyB1c2VyIGludGVyZmFjZS48L2RkPgorICA8ZHQ+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfTwvZHQ+CisgIDxkZD5UaGUgc3lzdGVtIGNhbGxzIHRoaXMgbWV0aG9kIGFzIHRoZSBmaXJzdCBpbmRpY2F0aW9uIHRoYXQgdGhlIHVzZXIgaXMgbGVhdmluZyB5b3VyCithY3Rpdml0eSAodGhvdWdoIGl0IGRvZXMgbm90IGFsd2F5cyBtZWFuIHRoZSBhY3Rpdml0eSBpcyBiZWluZyBkZXN0cm95ZWQpLiBUaGlzIGlzIHVzdWFsbHkgd2hlcmUgeW91CitzaG91bGQgY29tbWl0IGFueSBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIHBlcnNpc3RlZCBiZXlvbmQgdGhlIGN1cnJlbnQgdXNlciBzZXNzaW9uIChiZWNhdXNlCit0aGUgdXNlciBtaWdodCBub3QgY29tZSBiYWNrKS48L2RkPgorPC9kbD4KKworPHA+VGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgbGlmZWN5Y2xlIGNhbGxiYWNrIG1ldGhvZHMgdGhhdCB5b3Ugc2hvdWxkIHVzZSBpbiBvcmRlciB0byBwcm92aWRlIGEKK2ZsdWlkIHVzZXIgZXhwZXJpZW5jZSBiZXR3ZWVuIGFjdGl2aXRpZXMgYW5kIGhhbmRsZSB1bmV4cGVjdGVkIGludGVydXB0aW9ucyB0aGF0IGNhdXNlIHlvdXIgYWN0aXZpdHkKK3RvIGJlIHN0b3BwZWQgYW5kIGV2ZW4gZGVzdHJveWVkLiBBbGwgb2YgdGhlIGxpZmVjeWNsZSBjYWxsYmFjayBtZXRob2RzIGFyZSBkaXNjdXNzZWQgbGF0ZXIsIGluCit0aGUgc2VjdGlvbiBhYm91dCA8YSBocmVmPSIjTGlmZWN5Y2xlIj5NYW5hZ2luZyB0aGUgQWN0aXZpdHkgTGlmZWN5Y2xlPC9hPi48L3A+CisKKworCis8aDMgaWQ9IlVJIj5JbXBsZW1lbnRpbmcgYSB1c2VyIGludGVyZmFjZTwvaDM+CisKKzxwPiBUaGUgdXNlciBpbnRlcmZhY2UgZm9yIGFuIGFjdGl2aXR5IGlzIHByb3ZpZGVkIGJ5IGEgaGllcmFyY2h5IG9mIHZpZXdzJm1kYXNoO29iamVjdHMgZGVyaXZlZAorZnJvbSB0aGUge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fSBjbGFzcy4gIEVhY2ggdmlldyBjb250cm9scyBhIHBhcnRpY3VsYXIgcmVjdGFuZ3VsYXIgc3BhY2UKK3dpdGhpbiB0aGUgYWN0aXZpdHkncyB3aW5kb3cgYW5kIGNhbiByZXNwb25kIHRvIHVzZXIgaW50ZXJhY3Rpb24uIEZvciBleGFtcGxlLCBhIHZpZXcgbWlnaHQgYmUgYQorYnV0dG9uIHRoYXQgaW5pdGlhdGVzIGFuIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHRvdWNoZXMgaXQuPC9wPgorCis8cD5BbmRyb2lkIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHJlYWR5LW1hZGUgdmlld3MgdGhhdCB5b3UgY2FuIHVzZSB0byBkZXNpZ24gYW5kIG9yZ2FuaXplIHlvdXIKK2xheW91dC4gIldpZGdldHMiIGFyZSB2aWV3cyB0aGF0IHByb3ZpZGUgYSB2aXN1YWwgKGFuZCBpbnRlcmFjdGl2ZSkgZWxlbWVudHMgZm9yIHRoZSBzY3JlZW4sIHN1Y2gKK2FzIGEgYnV0dG9uLCB0ZXh0IGZpZWxkLCBjaGVja2JveCwgb3IganVzdCBhbiBpbWFnZS4gIkxheW91dHMiIGFyZSB2aWV3cyBkZXJpdmVkIGZyb20ge0BsaW5rCithbmRyb2lkLnZpZXcuVmlld0dyb3VwfSB0aGF0IHByb3ZpZGUgYSB1bmlxdWUgbGF5b3V0IG1vZGVsIGZvciBpdHMgY2hpbGQgdmlld3MsIHN1Y2ggYXMgYSBsaW5lYXIKK2xheW91dCwgYSBncmlkIGxheW91dCwgb3IgcmVsYXRpdmUgbGF5b3V0LiBZb3UgY2FuIGFsc28gc3ViY2xhc3MgdGhlIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld30gYW5kCit7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdHcm91cH0gY2xhc3NlcyAob3IgZXhpc3Rpbmcgc3ViY2xhc3NlcykgdG8gY3JlYXRlIHlvdXIgb3duIHdpZGdldHMgYW5kCitsYXlvdXRzIGFuZCBhcHBseSB0aGVtIHRvIHlvdXIgYWN0aXZpdHkgbGF5b3V0LjwvcD4KKworPHA+VGhlIG1vc3QgY29tbW9uIHdheSB0byBkZWZpbmUgYSBsYXlvdXQgdXNpbmcgdmlld3MgaXMgd2l0aCBhbiBYTUwgbGF5b3V0IGZpbGUgc2F2ZWQgaW4geW91cgorYXBwbGljYXRpb24gcmVzb3VyY2VzLiBUaGlzIHdheSwgeW91IGNhbiBtYWludGFpbiB0aGUgZGVzaWduIG9mIHlvdXIgdXNlciBpbnRlcmZhY2Ugc2VwYXJhdGVseSBmcm9tCit0aGUgc291cmNlIGNvZGUgdGhhdCBkZWZpbmVzIHRoZSBhY3Rpdml0eSdzIGJlaGF2aW9yLiBZb3UgY2FuIHNldCB0aGUgbGF5b3V0IGFzIHRoZSBVSSBmb3IgeW91cgorYWN0aXZpdHkgd2l0aCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc2V0Q29udGVudFZpZXcoaW50KSBzZXRDb250ZW50VmlldygpfSwgcGFzc2luZyB0aGUKK3Jlc291cmNlIElEIGZvciB0aGUgbGF5b3V0LiBIb3dldmVyLCB5b3UgY2FuIGFsc28gY3JlYXRlIG5ldyB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXd9cyBpbiB5b3VyCithY3Rpdml0eSBjb2RlIGFuZCBidWlsZCBhIHZpZXcgaGllcmFyY2h5IGJ5IGluc2VydGluZyBuZXcge0BsaW5rCithbmRyb2lkLnZpZXcuVmlld31zIGludG8gYSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdHcm91cH0sIHRoZW4gdXNlIHRoYXQgbGF5b3V0IGJ5IHBhc3NpbmcgdGhlIHJvb3QKK3tAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwfSB0byB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc2V0Q29udGVudFZpZXcoVmlldykKK3NldENvbnRlbnRWaWV3KCl9LjwvcD4KKworPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IGNyZWF0aW5nIGEgdXNlciBpbnRlcmZhY2UsIHNlZSB0aGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdWkvaW5kZXguaHRtbCI+VXNlciBJbnRlcmZhY2U8L2E+IGRvY3VtZW50YXRpb24uPC9wPgorCisKKworPGgzIGlkPSJEZWNsYXJpbmciPkRlY2xhcmluZyB0aGUgYWN0aXZpdHkgaW4gdGhlIG1hbmlmZXN0PC9oMz4KKworPHA+WW91IG11c3QgZGVjbGFyZSB5b3VyIGFjdGl2aXR5IGluIHRoZSBtYW5pZmVzdCBmaWxlIGluIG9yZGVyIGZvciBpdCB0bworYmUgYWNjZXNzaWJsZSB0byB0aGUgc3lzdGVtLiBUbyBkZWNhbGFyZSB5b3VyIGFjdGl2aXR5LCBvcGVuIHlvdXIgbWFuaWZlc3QgZmlsZSBhbmQgYWRkIGFuIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDthY3Rpdml0eSZndDt9PC9hPiBlbGVtZW50CithcyBhIGNoaWxkIG9mIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hcHBsaWNhdGlvbi1lbGVtZW50Lmh0bWwiPntAY29kZSAmbHQ7YXBwbGljYXRpb24mZ3Q7fTwvYT4KK2VsZW1lbnQuIEZvciBleGFtcGxlOjwvcD4KKworPHByZT4KKyZsdDttYW5pZmVzdCAuLi4gJmd0OworICAmbHQ7YXBwbGljYXRpb24gLi4uICZndDsKKyAgICAgICZsdDthY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5FeGFtcGxlQWN0aXZpdHkiIC8mZ3Q7CisgICAgICAuLi4KKyAgJmx0Oy9hcHBsaWNhdGlvbiAuLi4gJmd0OworICAuLi4KKyZsdDsvbWFuaWZlc3QgJmd0OworPC9wcmU+CisKKzxwPlRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGF0dHJpYnV0ZXMgdGhhdCB5b3UgY2FuIGluY2x1ZGUgaW4gdGhpcyBlbGVtZW50LCB0byBkZWZpbmUgcHJvcGVydGllcworc3VjaCBhcyB0aGUgbGFiZWwgZm9yIHRoZSBhY3Rpdml0eSwgYW4gaWNvbiBmb3IgdGhlIGFjdGl2aXR5LCBvciBhIHRoZW1lIHRvIHN0eWxlIHRoZSBhY3Rpdml0eSdzCitVSS4gU2VlIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwiPntAY29kZSAmbHQ7YWN0aXZpdHkmZ3Q7fTwvYT4gZWxlbWVudAorcmVmZXJlbmNlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBhdHRyaWJ1dGVzLjwvcD4KKworCis8aDQ+VXNpbmcgaW50ZW50IGZpbHRlcnM8L2g0PgorCis8cD5BbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlCismbHQ7YWN0aXZpdHkmZ3Q7fTwvYT4gZWxlbWVudCBjYW4gYWxzbyBzcGVjaWZ5IHZhcmlvdXMgaW50ZW50IGZpbHRlcnMmbWRhc2g7dXNpbmcgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2ludGVudC1maWx0ZXItZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDtpbnRlbnQtZmlsdGVyJmd0O308L2E+IGVsZW1lbnQmbWRhc2g7aW4gb3JkZXIgdG8gZGVjbGFyZSBob3cgb3RoZXIgYXBwbGljYXRpb24gY29tcG9uZW50cyBtYXkKK2FjdGl2YXRlIGl0LjwvcD4KKworPHA+V2hlbiB5b3UgY3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBBbmRyb2lkIFNESyB0b29scywgdGhlIHN0dWIgYWN0aXZpdHkKK3RoYXQncyBjcmVhdGVkIGZvciB5b3UgYXV0b21hdGljYWxseSBpbmNsdWRlcyBhbiBpbnRlbnQgZmlsdGVyIHRoYXQgZGVjbGFyZXMgdGhlIGFjdGl2aXR5CityZXNwb25kcyB0byB0aGUgIm1haW4iIGFjdGlvbiBhbmQgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgImxhdW5jaGVyIiBjYXRlZ29yeS4gVGhlIGludGVudCBmaWx0ZXIKK2xvb2tzIGxpa2UgdGhpczo8L3A+CisKKzxwcmU+CismbHQ7YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRXhhbXBsZUFjdGl2aXR5IiBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9hcHBfaWNvbiImZ3Q7CisgICAgJmx0O2ludGVudC1maWx0ZXImZ3Q7CisgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLyZndDsKKyAgICAgICAgJmx0O2NhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8mZ3Q7CisgICAgJmx0Oy9pbnRlbnQtZmlsdGVyJmd0OworJmx0Oy9hY3Rpdml0eSZndDsKKzwvcHJlPgorCis8cD5UaGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpb24tZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDthY3Rpb24mZ3Q7fTwvYT4gZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGlzIGlzIHRoZSAibWFpbiIgZW50cnkgcG9pbnQgdG8gdGhlIGFwcGxpY2F0aW9uLiBUaGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvY2F0ZWdvcnktZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDtjYXRlZ29yeSZndDt9PC9hPiBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoaXMgYWN0aXZpdHkgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGUKK3N5c3RlbSdzIGFwcGxpY2F0aW9uIGxhdW5jaGVyICh0byBhbGxvdyB1c2VycyB0byBsYXVuY2ggdGhpcyBhY3Rpdml0eSkuPC9wPgorCis8cD5JZiB5b3UgaW50ZW5kIGZvciB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlIHNlbGYtY29udGFpbmVkIGFuZCBub3QgYWxsb3cgb3RoZXIgYXBwbGljYXRpb25zIHRvCithY3RpdmF0ZSBpdHMgYWN0aXZpdGllcywgdGhlbiB5b3UgZG9uJ3QgbmVlZCBhbnkgb3RoZXIgaW50ZW50IGZpbHRlcnMuIE9ubHkgb25lIGFjdGl2aXR5IHNob3VsZAoraGF2ZSB0aGUgIm1haW4iIGFjdGlvbiBhbmQgImxhdW5jaGVyIiBjYXRlZ29yeSwgYXMgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUuIEFjdGl2aXRpZXMgdGhhdAoreW91IGRvbid0IHdhbnQgdG8gbWFrZSBhdmFpbGFibGUgdG8gb3RoZXIgYXBwbGljYXRpb25zIHNob3VsZCBoYXZlIG5vIGludGVudCBmaWx0ZXJzIGFuZCB5b3UgY2FuCitzdGFydCB0aGVtIHlvdXJzZWxmIHVzaW5nIGV4cGxpY2l0IGludGVudHMgKGFzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24pLjwvcD4KKworPHA+SG93ZXZlciwgaWYgeW91IHdhbnQgeW91ciBhY3Rpdml0eSB0byByZXNwb25kIHRvIGltcGxpY2l0IGludGVudHMgdGhhdCBhcmUgZGVsaXZlcmVkIGZyb20KK290aGVyIGFwcGxpY2F0aW9ucyAoYW5kIHlvdXIgb3duKSwgdGhlbiB5b3UgbXVzdCBkZWZpbmUgYWRkaXRpb25hbCBpbnRlbnQgZmlsdGVycyBmb3IgeW91cgorYWN0aXZpdHkuIEZvciBlYWNoIHR5cGUgb2YgaW50ZW50IHRvIHdoaWNoIHlvdSB3YW50IHRvIHJlc3BvbmQsIHlvdSBtdXN0IGluY2x1ZGUgYW4gPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvaW50ZW50LWZpbHRlci1lbGVtZW50Lmh0bWwiPntAY29kZQorJmx0O2ludGVudC1maWx0ZXImZ3Q7fTwvYT4gdGhhdCBpbmNsdWRlcyBhbgorPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpb24tZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDthY3Rpb24mZ3Q7fTwvYT4gZWxlbWVudCBhbmQsIG9wdGlvbmFsbHksIGEgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvY2F0ZWdvcnktZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDtjYXRlZ29yeSZndDt9PC9hPiBlbGVtZW50IGFuZC9vciBhIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2RhdGEtZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDtkYXRhJmd0O308L2E+IGVsZW1lbnQuIFRoZXNlIGVsZW1lbnRzIHNwZWNpZnkgdGhlIHR5cGUgb2YgaW50ZW50IHRvIHdoaWNoIHlvdXIgYWN0aXZpdHkgY2FuCityZXNwb25kLjwvcD4KKworPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHlvdXIgYWN0aXZpdGllcyBjYW4gcmVzcG9uZCB0byBpbnRlbnRzLCBzZWUgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2ludGVudHMvaW50ZW50cy1maWx0ZXJzLmh0bWwiPkludGVudHMgYW5kIEludGVudCBGaWx0ZXJzPC9hPgorZG9jdW1lbnQuPC9wPgorCisKKworPGgyIGlkPSJTdGFydGluZ0FuQWN0aXZpdHkiPlN0YXJ0aW5nIGFuIEFjdGl2aXR5PC9oMj4KKworPHA+WW91IGNhbiBzdGFydCBhbm90aGVyIGFjdGl2aXR5IGJ5IGNhbGxpbmcge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkKKyAgc3RhcnRBY3Rpdml0eSgpfSwgcGFzc2luZyBpdCBhbiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gdGhhdCBkZXNjcmliZXMgdGhlIGFjdGl2aXR5IHlvdQorICB3YW50IHRvIHN0YXJ0LiBUaGUgaW50ZW50IHNwZWNpZmllcyBlaXRoZXIgdGhlIGV4YWN0IGFjdGl2aXR5IHlvdSB3YW50IHRvIHN0YXJ0IG9yIGRlc2NyaWJlcyB0aGUKKyAgdHlwZSBvZiBhY3Rpb24geW91IHdhbnQgdG8gcGVyZm9ybSAoYW5kIHRoZSBzeXN0ZW0gc2VsZWN0cyB0aGUgYXBwcm9wcmlhdGUgYWN0aXZpdHkgZm9yIHlvdSwKK3doaWNoCisgIGNhbiBldmVuIGJlIGZyb20gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24pLiBBbiBpbnRlbnQgY2FuIGFsc28gY2Fycnkgc21hbGwgYW1vdW50cyBvZiBkYXRhIHRvIGJlCisgIHVzZWQgYnkgdGhlIGFjdGl2aXR5IHRoYXQgaXMgc3RhcnRlZC48L3A+CisKKzxwPldoZW4gd29ya2luZyB3aXRoaW4geW91ciBvd24gYXBwbGljYXRpb24sIHlvdSdsbCBvZnRlbiBuZWVkIHRvIHNpbXBseSBsYXVuY2ggYSBrbm93biBhY3Rpdml0eS4KKyBZb3UgY2FuIGRvIHNvIGJ5IGNyZWF0aW5nIGFuIGludGVudCB0aGF0IGV4cGxpY2l0bHkgZGVmaW5lcyB0aGUgYWN0aXZpdHkgeW91IHdhbnQgdG8gc3RhcnQsCit1c2luZyB0aGUgY2xhc3MgbmFtZS4gRm9yIGV4YW1wbGUsIGhlcmUncyBob3cgb25lIGFjdGl2aXR5IHN0YXJ0cyBhbm90aGVyIGFjdGl2aXR5IG5hbWVkIHtAY29kZQorU2lnbkluQWN0aXZpdHl9OjwvcD4KKworPHByZT4KK0ludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIFNpZ25JbkFjdGl2aXR5LmNsYXNzKTsKK3N0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKzwvcHJlPgorCis8cD5Ib3dldmVyLCB5b3VyIGFwcGxpY2F0aW9uIG1pZ2h0IGFsc28gd2FudCB0byBwZXJmb3JtIHNvbWUgYWN0aW9uLCBzdWNoIGFzIHNlbmQgYW4gZW1haWwsIHRleHQKKyAgbWVzc2FnZSwgb3Igc3RhdHVzIHVwZGF0ZSwgdXNpbmcgZGF0YSBmcm9tIHlvdXIgYWN0aXZpdHkuIEluIHRoaXMgY2FzZSwgeW91ciBhcHBsaWNhdGlvbiBtaWdodAorIG5vdCBoYXZlIGl0cyBvd24gYWN0aXZpdGllcyB0byBwZXJmb3JtIHN1Y2ggYWN0aW9ucywgc28geW91IGNhbiBpbnN0ZWFkIGxldmVyYWdlIHRoZSBhY3Rpdml0aWVzCisgIHByb3ZpZGVkIGJ5IG90aGVyIGFwcGxpY2F0aW9ucyBvbiB0aGUgZGV2aWNlLCB3aGljaCBjYW4gcGVyZm9ybSB0aGUgYWN0aW9ucyBmb3IgeW91LiBUaGlzIGlzIHdoZXJlCitpbnRlbnRzIGFyZSByZWFsbHkgdmFsdWFibGUmbWRhc2g7eW91IGNhbiBjcmVhdGUgYW4gaW50ZW50IHRoYXQgZGVzY3JpYmVzIGFuIGFjdGlvbiB5b3Ugd2FudCB0bworcGVyZm9ybSBhbmQgdGhlIHN5c3RlbQorICBsYXVuY2hlcyB0aGUgYXBwcm9wcmlhdGUgYWN0aXZpdHkgZnJvbSBhbm90aGVyIGFwcGxpY2F0aW9uLiBJZiB0aGVyZSBhcmUKKyAgbXVsdGlwbGUgYWN0aXZpdGllcyB0aGF0IGNhbiBoYW5kbGUgdGhlIGludGVudCwgdGhlbiB0aGUgdXNlciBjYW4gc2VsZWN0IHdoaWNoIG9uZSB0byB1c2UuIEZvcgorICBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhbGxvdyB0aGUgdXNlciB0byBzZW5kIGFuIGVtYWlsIG1lc3NhZ2UsIHlvdSBjYW4gY3JlYXRlIHRoZQorICBmb2xsb3dpbmcgaW50ZW50OjwvcD4KKworPHByZT4KK0ludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fU0VORCk7CitpbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0VNQUlMLCByZWNpcGllbnRBcnJheSk7CitzdGFydEFjdGl2aXR5KGludGVudCk7Cis8L3ByZT4KKworPHA+VGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0VYVFJBX0VNQUlMfSBleHRyYSBhZGRlZCB0byB0aGUgaW50ZW50IGlzIGEgc3RyaW5nIGFycmF5IG9mCisgIGVtYWlsIGFkZHJlc3NlcyB0byB3aGljaCB0aGUgZW1haWwgc2hvdWxkIGJlIHNlbnQuIFdoZW4gYW4gZW1haWwgYXBwbGljYXRpb24gcmVzcG9uZHMgdG8gdGhpcworICBpbnRlbnQsIGl0IHJlYWRzIHRoZSBzdHJpbmcgYXJyYXkgcHJvdmlkZWQgaW4gdGhlIGV4dHJhIGFuZCBwbGFjZXMgdGhlbSBpbiB0aGUgInRvIiBmaWVsZCBvZiB0aGUKKyAgZW1haWwgY29tcG9zaXRpb24gZm9ybS4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBlbWFpbCBhcHBsaWNhdGlvbidzIGFjdGl2aXR5IHN0YXJ0cyBhbmQgd2hlbiB0aGUKKyAgdXNlciBpcyBkb25lLCB5b3VyIGFjdGl2aXR5IHJlc3VtZXMuPC9wPgorCisKKworCis8aDMgaWQ9IlN0YXJ0aW5nQW5BY3Rpdml0eUZvclJlc3VsdCI+U3RhcnRpbmcgYW4gYWN0aXZpdHkgZm9yIGEgcmVzdWx0PC9oMz4KKworPHA+U29tZXRpbWVzLCB5b3UgbWlnaHQgd2FudCB0byByZWNlaXZlIGEgcmVzdWx0IGZyb20gdGhlIGFjdGl2aXR5IHRoYXQgeW91IHN0YXJ0LiBJbiB0aGF0IGNhc2UsCisgIHN0YXJ0IHRoZSBhY3Rpdml0eSBieSBjYWxsaW5nIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0CisgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoKX0gKGluc3RlYWQgb2Yge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkKKyAgc3RhcnRBY3Rpdml0eSgpfSkuIFRvIHRoZW4gcmVjZWl2ZSB0aGUgcmVzdWx0IGZyb20gdGhlIHN1YnNlcXVlbnQKK2FjdGl2aXR5LCBpbXBsZW1lbnQgdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0IG9uQWN0aXZpdHlSZXN1bHQoKX0gY2FsbGJhY2sKKyAgbWV0aG9kLiBXaGVuIHRoZSBzdWJzZXF1ZW50IGFjdGl2aXR5IGlzIGRvbmUsIGl0IHJldHVybnMgYSByZXN1bHQgaW4gYW4ge0BsaW5rCithbmRyb2lkLmNvbnRlbnQuSW50ZW50fSB0byB5b3VyIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0IG9uQWN0aXZpdHlSZXN1bHQoKX0KK21ldGhvZC48L3A+CisKKzxwPkZvciBleGFtcGxlLCBwZXJoYXBzIHlvdSB3YW50IHRoZSB1c2VyIHRvIHBpY2sgb25lIG9mIHRoZWlyIGNvbnRhY3RzLCBzbyB5b3VyIGFjdGl2aXR5IGNhbgorZG8gc29tZXRoaW5nIHdpdGggdGhlIGluZm9ybWF0aW9uIGluIHRoYXQgY29udGFjdC4gSGVyZSdzIGhvdyB5b3UgY2FuIGNyZWF0ZSBzdWNoIGFuIGludGVudCBhbmQKK2hhbmRsZSB0aGUgcmVzdWx0OjwvcD4KKworPHByZT4KK3ByaXZhdGUgdm9pZCBwaWNrQ29udGFjdCgpIHsKKyAgICAvLyBDcmVhdGUgYW4gaW50ZW50IHRvICJwaWNrIiBhIGNvbnRhY3QsIGFzIGRlZmluZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIgVVJJCisgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9QSUNLLCBDb250YWN0cy5DT05URU5UX1VSSSk7CisgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIFBJQ0tfQ09OVEFDVF9SRVFVRVNUKTsKK30KKworJiM2NDtPdmVycmlkZQorcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgeworICAgIC8vIElmIHRoZSByZXF1ZXN0IHdlbnQgd2VsbCAoT0spIGFuZCB0aGUgcmVxdWVzdCB3YXMgUElDS19DT05UQUNUX1JFUVVFU1QKKyAgICBpZiAocmVzdWx0Q29kZSA9PSBBY3Rpdml0eS5SRVNVTFRfT0sgJmFtcDsmYW1wOyByZXF1ZXN0Q29kZSA9PSBQSUNLX0NPTlRBQ1RfUkVRVUVTVCkgeworICAgICAgICAvLyBQZXJmb3JtIGEgcXVlcnkgdG8gdGhlIGNvbnRhY3QncyBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgY29udGFjdCdzIG5hbWUKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KGRhdGEuZ2V0RGF0YSgpLAorICAgICAgICBuZXcgU3RyaW5nW10ge0NvbnRhY3RzLkRJU1BMQVlfTkFNRX0sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsgLy8gVHJ1ZSBpZiB0aGUgY3Vyc29yIGlzIG5vdCBlbXB0eQorICAgICAgICAgICAgaW50IGNvbHVtbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENvbnRhY3RzLkRJU1BMQVlfTkFNRSk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIHNlbGVjdGVkIGNvbnRhY3QncyBuYW1lLi4uCisgICAgICAgIH0KKyAgICB9Cit9Cis8L3ByZT4KKworPHA+VGhpcyBleGFtcGxlIHNob3dzIHRoZSBiYXNpYyBsb2dpYyB5b3Ugc2hvdWxkIHVzZSBpbiB5b3VyIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25BY3Rpdml0eVJlc3VsdCBvbkFjdGl2aXR5UmVzdWx0KCl9IG1ldGhvZCBpbiBvcmRlciB0byBoYW5kbGUgYW4KK2FjdGl2aXR5IHJlc3VsdC4gVGhlIGZpcnN0IGNvbmRpdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCZtZGFzaDtpZiBpdCB3YXMsIHRoZW4KK3RoZSB7QGNvZGUgcmVzdWx0Q29kZX0gd2lsbCBiZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjUkVTVUxUX09LfSZtZGFzaDthbmQgd2hldGhlciB0aGUgcmVxdWVzdAordG8gd2hpY2ggdGhpcyByZXN1bHQgaXMgcmVzcG9uZGluZyBpcyBrbm93biZtZGFzaDtpbiB0aGlzIGNhc2UsIHRoZSB7QGNvZGUgcmVxdWVzdENvZGV9IG1hdGNoZXMgdGhlCitzZWNvbmQgcGFyYW1ldGVyIHNlbnQgd2l0aCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc3RhcnRBY3Rpdml0eUZvclJlc3VsdAorc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpfS4gRnJvbSB0aGVyZSwgdGhlIGNvZGUgaGFuZGxlcyB0aGUgYWN0aXZpdHkgcmVzdWx0IGJ5IHF1ZXJ5aW5nIHRoZQorZGF0YSByZXR1cm5lZCBpbiBhbiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gKHRoZSB7QGNvZGUgZGF0YX0gcGFyYW1ldGVyKS48L3A+CisKKzxwPldoYXQgaGFwcGVucyBpcywgYSB7QGxpbmsKK2FuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXJ9IHBlcmZvcm1zIGEgcXVlcnkgYWdhaW5zdCBhIGNvbnRlbnQgcHJvdmlkZXIsIHdoaWNoIHJldHVybnMgYQore0BsaW5rIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yfSB0aGF0IGFsbG93cyB0aGUgcXVlcmllZCBkYXRhIHRvIGJlIHJlYWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKK3RoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9wcm92aWRlcnMvY29udGVudC1wcm92aWRlcnMuaHRtbCI+Q29udGVudCBQcm92aWRlcnM8L2E+IGRvY3VtZW50LjwvcD4KKworPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgaW50ZW50cywgc2VlIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9pbnRlbnRzL2ludGVudHMtZmlsdGVycy5odG1sIj5JbnRlbnRzIGFuZCBJbnRlbnQKK0ZpbHRlcnM8L2E+IGRvY3VtZW50LjwvcD4KKworCis8aDIgaWQ9IlNodXR0aW5nRG93biI+U2h1dHRpbmcgRG93biBhbiBBY3Rpdml0eTwvaDI+CisKKzxwPllvdSBjYW4gc2h1dCBkb3duIGFuIGFjdGl2aXR5IGJ5IGNhbGxpbmcgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5pc2gKK2ZpbmlzaCgpfSBtZXRob2QuIFlvdSBjYW4gYWxzbyBzaHV0IGRvd24gYSBzZXBhcmF0ZSBhY3Rpdml0eSB0aGF0IHlvdSBwcmV2aW91c2x5IHN0YXJ0ZWQgYnkgY2FsbGluZwore0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2ZpbmlzaEFjdGl2aXR5IGZpbmlzaEFjdGl2aXR5KCl9LjwvcD4KKworPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSW4gbW9zdCBjYXNlcywgeW91IHNob3VsZCBub3QgZXhwbGljaXRseSBmaW5pc2ggYW4gYWN0aXZpdHkKK3VzaW5nIHRoZXNlIG1ldGhvZHMuIEFzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24gYWJvdXQgdGhlIGFjdGl2aXR5IGxpZmVjeWNsZSwgdGhlCitBbmRyb2lkIHN5c3RlbSBtYW5hZ2VzIHRoZSBsaWZlIG9mIGFuIGFjdGl2aXR5IGZvciB5b3UsIHNvIHlvdSBkbyBub3QgbmVlZCB0byBmaW5pc2ggeW91ciBvd24KK2FjdGl2aXRpZXMuIENhbGxpbmcgdGhlc2UgbWV0aG9kcyBjb3VsZCBhZHZlcnNlbHkgYWZmZWN0IHRoZSBleHBlY3RlZCB1c2VyCitleHBlcmllbmNlIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4geW91IGFic29sdXRlbHkgZG8gbm90IHdhbnQgdGhlIHVzZXIgdG8gcmV0dXJuIHRvIHRoaXMKK2luc3RhbmNlIG9mIHRoZSBhY3Rpdml0eS48L3A+CisKKworPGgyIGlkPSJMaWZlY3ljbGUiPk1hbmFnaW5nIHRoZSBBY3Rpdml0eSBMaWZlY3ljbGU8L2gyPgorCis8cD5NYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIHlvdXIgYWN0aXZpdGllcyBieSBpbXBsZW1lbnRpbmcgY2FsbGJhY2sgbWV0aG9kcyBpcworY3J1Y2lhbCB0byBkZXZlbG9waW5nIGEgc3Ryb25nCithbmQgZmxleGlibGUgYXBwbGljYXRpb24uIFRoZSBsaWZlY3ljbGUgb2YgYW4gYWN0aXZpdHkgaXMgZGlyZWN0bHkgYWZmZWN0ZWQgYnkgaXRzIGFzc29jaWF0aW9uIHdpdGgKK290aGVyIGFjdGl2aXRpZXMsIGl0cyB0YXNrIGFuZCBiYWNrIHN0YWNrLjwvcD4KKworPHA+QW4gYWN0aXZpdHkgY2FuIGV4aXN0IGluIGVzc2VudGlhbGx5IHRocmVlIHN0YXRlczo8L3A+CisKKzxkbD4KKyAgPGR0PjxpPlJlc3VtZWQ8L2k+PC9kdD4KKyAgICA8ZGQ+VGhlIGFjdGl2aXR5IGlzIGluIHRoZSBmb3JlZ3JvdW5kIG9mIHRoZSBzY3JlZW4gYW5kIGhhcyB1c2VyIGZvY3VzLiAoVGhpcyBzdGF0ZSBpcworYWxzbyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgInJ1bm5pbmciLik8L2RkPgorCisgIDxkdD48aT5QYXVzZWQ8L2k+PC9kdD4KKyAgICA8ZGQ+QW5vdGhlciBhY3Rpdml0eSBpcyBpbiB0aGUgZm9yZWdyb3VuZCBhbmQgaGFzIGZvY3VzLCBidXQgdGhpcyBvbmUgaXMgc3RpbGwgdmlzaWJsZS4gVGhhdCBpcywKK2Fub3RoZXIgYWN0aXZpdHkgaXMgdmlzaWJsZSBvbiB0b3Agb2YgdGhpcyBvbmUgYW5kIHRoYXQgYWN0aXZpdHkgaXMgcGFydGlhbGx5IHRyYW5zcGFyZW50IG9yIGRvZXNuJ3QKK2NvdmVyIHRoZSBlbnRpcmUgc2NyZWVuLiBBIHBhdXNlZCBhY3Rpdml0eSBpcyBjb21wbGV0ZWx5IGFsaXZlICh0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fQorb2JqZWN0IGlzIHJldGFpbmVkIGluIG1lbW9yeSwgaXQgbWFpbnRhaW5zIGFsbCBzdGF0ZSBhbmQgbWVtYmVyIGluZm9ybWF0aW9uLCBhbmQgcmVtYWlucyBhdHRhY2hlZCB0bwordGhlIHdpbmRvdyBtYW5hZ2VyKSwgYnV0IGNhbiBiZSBraWxsZWQgYnkgdGhlIHN5c3RlbSBpbiBleHRyZW1lbHkgbG93IG1lbW9yeSBzaXR1YXRpb25zLjwvZGQ+CisKKyAgPGR0PjxpPlN0b3BwZWQ8L2k+PC9kdD4KKyAgICA8ZGQ+VGhlIGFjdGl2aXR5IGlzIGNvbXBsZXRlbHkgb2JzY3VyZWQgYnkgYW5vdGhlciBhY3Rpdml0eSAodGhlIGFjdGl2aXR5IGlzIG5vdyBpbiB0aGUKKyJiYWNrZ3JvdW5kIikuIEEgc3RvcHBlZCBhY3Rpdml0eSBpcyBhbHNvIHN0aWxsIGFsaXZlICh0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fQorb2JqZWN0IGlzIHJldGFpbmVkIGluIG1lbW9yeSwgaXQgbWFpbnRhaW5zIGFsbCBzdGF0ZSBhbmQgbWVtYmVyIGluZm9ybWF0aW9uLCBidXQgaXMgPGVtPm5vdDwvZW0+CithdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIpLiBIb3dldmVyLCBpdCBpcyBubyBsb25nZXIgdmlzaWJsZSB0byB0aGUgdXNlciBhbmQgaXQKK2NhbiBiZSBraWxsZWQgYnkgdGhlIHN5c3RlbSB3aGVuIG1lbW9yeSBpcyBuZWVkZWQgZWxzZXdoZXJlLjwvZGQ+Cis8L2RsPgorCis8cD5JZiBhbiBhY3Rpdml0eSBpcyBwYXVzZWQgb3Igc3RvcHBlZCwgdGhlIHN5c3RlbSBjYW4gZHJvcCBpdCBmcm9tIG1lbW9yeSBlaXRoZXIgYnkgYXNraW5nIGl0IHRvCitmaW5pc2ggKGNhbGxpbmcgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5pc2ggZmluaXNoKCl9IG1ldGhvZCksIG9yIHNpbXBseSBraWxsaW5nIGl0cworcHJvY2Vzcy4gIFdoZW4gdGhlIGFjdGl2aXR5IGlzIG9wZW5lZCBhZ2FpbiAoYWZ0ZXIgYmVpbmcgZmluaXNoZWQgb3Iga2lsbGVkKSwgaXQgbXVzdCBiZSBjcmVhdGVkIGFsbAorb3Zlci48L3A+CisKKworCis8aDMgaWQ9IkltcGxlbWVudGluZ0xpZmVjeWNsZUNhbGxiYWNrcyI+SW1wbGVtZW50aW5nIHRoZSBsaWZlY3ljbGUgY2FsbGJhY2tzPC9oMz4KKworPHA+V2hlbiBhbiBhY3Rpdml0eSB0cmFuc2l0aW9ucyBpbnRvIGFuZCBvdXQgb2YgdGhlIGRpZmZlcmVudCBzdGF0ZXMgZGVzY3JpYmVkIGFib3ZlLCBpdCBpcyBub3RpZmllZAordGhyb3VnaCB2YXJpb3VzIGNhbGxiYWNrIG1ldGhvZHMuIEFsbCBvZiB0aGUgY2FsbGJhY2sgbWV0aG9kcyBhcmUgaG9va3MgdGhhdCB5b3UKK2NhbiBvdmVycmlkZSB0byBkbyBhcHByb3ByaWF0ZSB3b3JrIHdoZW4gdGhlIHN0YXRlIG9mIHlvdXIgYWN0aXZpdHkgY2hhbmdlcy4gVGhlIGZvbGxvd2luZyBza2VsZXRvbgorYWN0aXZpdHkgaW5jbHVkZXMgZWFjaCBvZiB0aGUgZnVuZGFtZW50YWwgbGlmZWN5Y2xlIG1ldGhvZHM6PC9wPgorCisKKzxwcmU+CitwdWJsaWMgY2xhc3MgRXhhbXBsZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgICYjNjQ7T3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25DcmVhdGUgb25DcmVhdGV9KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgLy8gVGhlIGFjdGl2aXR5IGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgfQorICAgICYjNjQ7T3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdGFydCBvblN0YXJ0KCl9IHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICAvLyBUaGUgYWN0aXZpdHkgaXMgYWJvdXQgdG8gYmVjb21lIHZpc2libGUuCisgICAgfQorICAgICYjNjQ7T3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25SZXN1bWUgb25SZXN1bWUoKX0geworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICAvLyBUaGUgYWN0aXZpdHkgaGFzIGJlY29tZSB2aXNpYmxlIChpdCBpcyBub3cgInJlc3VtZWQiKS4KKyAgICB9CisgICAgJiM2NDtPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0geworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIC8vIEFub3RoZXIgYWN0aXZpdHkgaXMgdGFraW5nIGZvY3VzICh0aGlzIGFjdGl2aXR5IGlzIGFib3V0IHRvIGJlICJwYXVzZWQiKS4KKyAgICB9CisgICAgJiM2NDtPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0b3Agb25TdG9wKCl9IHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIC8vIFRoZSBhY3Rpdml0eSBpcyBubyBsb25nZXIgdmlzaWJsZSAoaXQgaXMgbm93ICJzdG9wcGVkIikKKyAgICB9CisgICAgJiM2NDtPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3kgb25EZXN0cm95KCl9IHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIC8vIFRoZSBhY3Rpdml0eSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuCisgICAgfQorfQorPC9wcmU+CisKKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFlvdXIgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbGlmZWN5Y2xlIG1ldGhvZHMgbXVzdAorYWx3YXlzIGNhbGwgdGhlIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24gYmVmb3JlIGRvaW5nIGFueSB3b3JrLCBhcyBzaG93biBpbiB0aGUgZXhhbXBsZXMgYWJvdmUuPC9wPgorCis8cD5UYWtlbiB0b2dldGhlciwgdGhlc2UgbWV0aG9kcyBkZWZpbmUgdGhlIGVudGlyZSBsaWZlY3ljbGUgb2YgYW4gYWN0aXZpdHkuIEJ5IGltcGxlbWVudGluZyB0aGVzZQorbWV0aG9kcywgeW91IGNhbiBtb25pdG9yIHRocmVlIG5lc3RlZCBsb29wcyBpbiB0aGUgYWN0aXZpdHkgbGlmZWN5Y2xlOiA8L3A+CisKKzx1bD4KKzxsaT5UaGUgPGI+ZW50aXJlIGxpZmV0aW1lPC9iPiBvZiBhbiBhY3Rpdml0eSBoYXBwZW5zIGJldHdlZW4gdGhlIGNhbGwgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSBhbmQgdGhlIGNhbGwgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3l9LiBZb3VyIGFjdGl2aXR5IHNob3VsZCBwZXJmb3JtIHNldHVwIG9mCisiZ2xvYmFsIiBzdGF0ZSAoc3VjaCBhcyBkZWZpbmluZyBsYXlvdXQpIGluIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSwgYW5kCityZWxlYXNlIGFsbCByZW1haW5pbmcgcmVzb3VyY2VzIGluIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3l9LiBGb3IgZXhhbXBsZSwgaWYgeW91cgorYWN0aXZpdHkgaGFzIGEgdGhyZWFkIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQgdG8gZG93bmxvYWQgZGF0YSBmcm9tIHRoZSBuZXR3b3JrLCBpdCBtaWdodCBjcmVhdGUKK3RoYXQgdGhyZWFkIGluIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSBhbmQgdGhlbiBzdG9wIHRoZSB0aHJlYWQgaW4ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3l9LjwvbGk+CisKKzxsaT48cD5UaGUgPGI+dmlzaWJsZSBsaWZldGltZTwvYj4gb2YgYW4gYWN0aXZpdHkgaGFwcGVucyBiZXR3ZWVuIHRoZSBjYWxsIHRvIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdGFydCBvblN0YXJ0KCl9IGFuZCB0aGUgY2FsbCB0byB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3AoKX0uIER1cmluZyB0aGlzIHRpbWUsIHRoZSB1c2VyIGNhbiBzZWUgdGhlIGFjdGl2aXR5Citvbi1zY3JlZW4gYW5kIGludGVyYWN0IHdpdGggaXQuIEZvciBleGFtcGxlLCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSBpcyBjYWxsZWQKK3doZW4gYSBuZXcgYWN0aXZpdHkgc3RhcnRzIGFuZCB0aGlzIG9uZSBpcyBubyBsb25nZXIgdmlzaWJsZS4gQmV0d2VlbiB0aGVzZSB0d28gbWV0aG9kcywgeW91IGNhbgorbWFpbnRhaW4gcmVzb3VyY2VzIHRoYXQgYXJlIG5lZWRlZCB0byBzaG93IHRoZSBhY3Rpdml0eSB0byB0aGUgdXNlci4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gcmVnaXN0ZXIgYQore0BsaW5rIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcn0gaW4ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnQoKX0gdG8gbW9uaXRvciBjaGFuZ2VzIHRoYXQgaW1wYWN0IHlvdXIgVUksIGFuZCB1bnJlZ2lzdGVyCitpdCBpbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSB3aGVuIHRoZSB1c2VyIGNhbiBubyBsb25nZXIgc2VlIHdoYXQgeW91IGFyZQorZGlzcGxheWluZy4gVGhlIHN5c3RlbSBtaWdodCBjYWxsIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnQoKX0gYW5kIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgdGhlIGVudGlyZSBsaWZldGltZSBvZiB0aGUgYWN0aXZpdHksIGFzCit0aGUgYWN0aXZpdHkgYWx0ZXJuYXRlcyBiZXR3ZWVuIGJlaW5nIHZpc2libGUgYW5kIGhpZGRlbiB0byB0aGUgdXNlci48L3A+PC9saT4KKworPGxpPjxwPlRoZSA8Yj5mb3JlZ3JvdW5kIGxpZmV0aW1lPC9iPiBvZiBhbiBhY3Rpdml0eSBoYXBwZW5zIGJldHdlZW4gdGhlIGNhbGwgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblJlc3VtZSBvblJlc3VtZSgpfSBhbmQgdGhlIGNhbGwgdG8ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2UKK29uUGF1c2UoKX0uIER1cmluZyB0aGlzIHRpbWUsIHRoZSBhY3Rpdml0eSBpcyBpbiBmcm9udCBvZiBhbGwgb3RoZXIgYWN0aXZpdGllcyBvbiBzY3JlZW4gYW5kIGhhcwordXNlciBpbnB1dCBmb2N1cy4gIEFuIGFjdGl2aXR5IGNhbiBmcmVxdWVudGx5IHRyYW5zaXRpb24gaW4gYW5kIG91dCBvZiB0aGUgZm9yZWdyb3VuZCZtZGFzaDtmb3IKK2V4YW1wbGUsIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0gaXMgY2FsbGVkIHdoZW4gdGhlIGRldmljZSBnb2VzIHRvIHNsZWVwIG9yCit3aGVuIGEgZGlhbG9nIGFwcGVhcnMuIEJlY2F1c2UgdGhpcyBzdGF0ZSBjYW4gdHJhbnNpdGlvbiBvZnRlbiwgdGhlIGNvZGUgaW4gdGhlc2UgdHdvIG1ldGhvZHMgc2hvdWxkCitiZSBmYWlybHkgbGlnaHR3ZWlnaHQgaW4gb3JkZXIgdG8gYXZvaWQgc2xvdyB0cmFuc2l0aW9ucyB0aGF0IG1ha2UgdGhlIHVzZXIgd2FpdC48L3A+PC9saT4KKzwvdWw+CisKKzxwPkZpZ3VyZSAxIGlsbHVzdHJhdGVzIHRoZXNlIGxvb3BzIGFuZCB0aGUgcGF0aHMgYW4gYWN0aXZpdHkgbWlnaHQgdGFrZSBiZXR3ZWVuIHN0YXRlcy4KK1RoZSByZWN0YW5nbGVzIHJlcHJlc2VudCB0aGUgY2FsbGJhY2sgbWV0aG9kcyB5b3UgY2FuIGltcGxlbWVudCB0byBwZXJmb3JtIG9wZXJhdGlvbnMgd2hlbgordGhlIGFjdGl2aXR5IHRyYW5zaXRpb25zIGJldHdlZW4gc3RhdGVzLiA8cD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvYWN0aXZpdHlfbGlmZWN5Y2xlLnBuZyIgYWx0PSIiIC8+Cis8cCBjbGFzcz0iaW1nLWNhcHRpb24iPjxzdHJvbmc+RmlndXJlIDEuPC9zdHJvbmc+IFRoZSBhY3Rpdml0eSBsaWZlY3ljbGUuPC9wPgorCis8cD5UaGUgc2FtZSBsaWZlY3ljbGUgY2FsbGJhY2sgbWV0aG9kcyBhcmUgbGlzdGVkIGluIHRhYmxlIDEsIHdoaWNoIGRlc2NyaWJlcyBlYWNoIG9mIHRoZSBjYWxsYmFjaworbWV0aG9kcyBpbiBtb3JlIGRldGFpbCBhbmQgbG9jYXRlcyBlYWNoIG9uZSB3aXRoaW4gdGhlCithY3Rpdml0eSdzIG92ZXJhbGwgbGlmZWN5Y2xlLCBpbmNsdWRpbmcgd2hldGhlciB0aGUgc3lzdGVtIGNhbiBraWxsIHRoZSBhY3Rpdml0eSBhZnRlciB0aGUKK2NhbGxiYWNrIG1ldGhvZCBjb21wbGV0ZXMuPC9wPgorCis8cCBjbGFzcz0idGFibGUtY2FwdGlvbiI+PHN0cm9uZz5UYWJsZSAxLjwvc3Ryb25nPiBBIHN1bW1hcnkgb2YgdGhlIGFjdGl2aXR5IGxpZmVjeWNsZSdzCitjYWxsYmFjayBtZXRob2RzLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMiIgd2lkdGg9Ijg1JSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9InJvd3MiPgorPGNvbGdyb3VwIGFsaWduPSJsZWZ0IiBzcGFuPSIzIj48L2NvbGdyb3VwPgorPGNvbGdyb3VwIGFsaWduPSJsZWZ0Ij48L2NvbGdyb3VwPgorPGNvbGdyb3VwIGFsaWduPSJjZW50ZXIiPjwvY29sZ3JvdXA+Cis8Y29sZ3JvdXAgYWxpZ249ImNlbnRlciI+PC9jb2xncm91cD4KKworPHRoZWFkPgorPHRyPjx0aCBjb2xzcGFuPSIzIj5NZXRob2Q8L3RoPiA8dGg+RGVzY3JpcHRpb248L3RoPiA8dGg+S2lsbGFibGUgYWZ0ZXI/PC90aD4gPHRoPk5leHQ8L3RoPjwvdHI+Cis8L3RoZWFkPgorCis8dGJvZHk+Cis8dHI+CisgIDx0ZCBjb2xzcGFuPSIzIiBhbGlnbj0ibGVmdCI+PGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQ3JlYXRlIG9uQ3JlYXRlKCl9PC9jb2RlPjwvdGQ+CisgIDx0ZD5DYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4KKyAgICAgIFRoaXMgaXMgd2hlcmUgeW91IHNob3VsZCBkbyBhbGwgb2YgeW91ciBub3JtYWwgc3RhdGljIHNldCB1cCAmbWRhc2g7CisgICAgICBjcmVhdGUgdmlld3MsIGJpbmQgZGF0YSB0byBsaXN0cywgYW5kIHNvIG9uLiAgVGhpcyBtZXRob2QgaXMgcGFzc2VkCisgICAgICBhIEJ1bmRsZSBvYmplY3QgY29udGFpbmluZyB0aGUgYWN0aXZpdHkncyBwcmV2aW91cyBzdGF0ZSwgaWYgdGhhdAorICAgICAgc3RhdGUgd2FzIGNhcHR1cmVkIChzZWUgPGEgaHJlZj0iI2FjdHN0YXRlIj5TYXZpbmcgQWN0aXZpdHkgU3RhdGU8L2E+LAorICAgICAgbGF0ZXIpLgorICAgICAgPHA+QWx3YXlzIGZvbGxvd2VkIGJ5IHtAY29kZSBvblN0YXJ0KCl9LjwvcD48L3RkPgorICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblN0YXJ0KCl9PC90ZD4KKzwvdHI+CisKKzx0cj4KKyAgIDx0ZCByb3dzcGFuPSI1IiBzdHlsZT0iYm9yZGVyLWxlZnQ6IG5vbmU7IGJvcmRlci1yaWdodDogbm9uZTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+CisgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPjxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblJlc3RhcnQKK29uUmVzdGFydCgpfTwvY29kZT48L3RkPgorICAgPHRkPkNhbGxlZCBhZnRlciB0aGUgYWN0aXZpdHkgaGFzIGJlZW4gc3RvcHBlZCwganVzdCBwcmlvciB0byBpdCBiZWluZworICAgICAgIHN0YXJ0ZWQgYWdhaW4uCisgICAgICAgPHA+QWx3YXlzIGZvbGxvd2VkIGJ5IHtAY29kZSBvblN0YXJ0KCl9PC9wPjwvdGQ+CisgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblN0YXJ0KCl9PC90ZD4KKzwvdHI+CisKKzx0cj4KKyAgIDx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+PGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RhcnQgb25TdGFydCgpfTwvY29kZT48L3RkPgorICAgPHRkPkNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYWN0aXZpdHkgYmVjb21lcyB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICAgICAgIDxwPkZvbGxvd2VkIGJ5IHtAY29kZSBvblJlc3VtZSgpfSBpZiB0aGUgYWN0aXZpdHkgY29tZXMKKyAgICAgICB0byB0aGUgZm9yZWdyb3VuZCwgb3Ige0Bjb2RlIG9uU3RvcCgpfSBpZiBpdCBiZWNvbWVzIGhpZGRlbi48L3A+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj57QGNvZGUgb25SZXN1bWUoKX0gPGJyLz5vcjxici8+IHtAY29kZSBvblN0b3AoKX08L3RkPgorPC90cj4KKworPHRyPgorICAgPHRkIHJvd3NwYW49IjIiIHN0eWxlPSJib3JkZXItbGVmdDogbm9uZTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+CisgICA8dGQgYWxpZ249ImxlZnQiPjxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblJlc3VtZSBvblJlc3VtZSgpfTwvY29kZT48L3RkPgorICAgPHRkPkNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYWN0aXZpdHkgc3RhcnRzCisgICAgICAgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlci4gIEF0IHRoaXMgcG9pbnQgdGhlIGFjdGl2aXR5IGlzIGF0CisgICAgICAgdGhlIHRvcCBvZiB0aGUgYWN0aXZpdHkgc3RhY2ssIHdpdGggdXNlciBpbnB1dCBnb2luZyB0byBpdC4KKyAgICAgICA8cD5BbHdheXMgZm9sbG93ZWQgYnkge0Bjb2RlIG9uUGF1c2UoKX0uPC9wPjwvdGQ+CisgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblBhdXNlKCl9PC90ZD4KKzwvdHI+CisKKzx0cj4KKyAgIDx0ZCBhbGlnbj0ibGVmdCI+PGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfTwvY29kZT48L3RkPgorICAgPHRkPkNhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgYWJvdXQgdG8gc3RhcnQgcmVzdW1pbmcgYW5vdGhlcgorICAgICAgIGFjdGl2aXR5LiAgVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgdG8gY29tbWl0IHVuc2F2ZWQgY2hhbmdlcyB0bworICAgICAgIHBlcnNpc3RlbnQgZGF0YSwgc3RvcCBhbmltYXRpb25zIGFuZCBvdGhlciB0aGluZ3MgdGhhdCBtYXkgYmUgY29uc3VtaW5nCisgICAgICAgQ1BVLCBhbmQgc28gb24uICBJdCBzaG91bGQgZG8gd2hhdGV2ZXIgaXQgZG9lcyB2ZXJ5IHF1aWNrbHksIGJlY2F1c2UKKyAgICAgICB0aGUgbmV4dCBhY3Rpdml0eSB3aWxsIG5vdCBiZSByZXN1bWVkIHVudGlsIGl0IHJldHVybnMuCisgICAgICAgPHA+Rm9sbG93ZWQgZWl0aGVyIGJ5IHtAY29kZSBvblJlc3VtZSgpfSBpZiB0aGUgYWN0aXZpdHkKKyAgICAgICByZXR1cm5zIGJhY2sgdG8gdGhlIGZyb250LCBvciBieSB7QGNvZGUgb25TdG9wKCl9IGlmIGl0IGJlY29tZXMKKyAgICAgICBpbnZpc2libGUgdG8gdGhlIHVzZXIuPC90ZD4KKyAgIDx0ZCBhbGlnbj0iY2VudGVyIj48c3Ryb25nIHN0eWxlPSJjb2xvcjojODAwMDAwIj5ZZXM8L3N0cm9uZz48L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblJlc3VtZSgpfSA8YnIvPm9yPGJyLz4ge0Bjb2RlIG9uU3RvcCgpfTwvdGQ+Cis8L3RyPgorCis8dHI+CisgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPjxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0b3Agb25TdG9wKCl9PC9jb2RlPjwvdGQ+CisgICA8dGQ+Q2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIG5vIGxvbmdlciB2aXNpYmxlIHRvIHRoZSB1c2VyLiAgVGhpcworICAgICAgIG1heSBoYXBwZW4gYmVjYXVzZSBpdCBpcyBiZWluZyBkZXN0cm95ZWQsIG9yIGJlY2F1c2UgYW5vdGhlciBhY3Rpdml0eQorICAgICAgIChlaXRoZXIgYW4gZXhpc3Rpbmcgb25lIG9yIGEgbmV3IG9uZSkgaGFzIGJlZW4gcmVzdW1lZCBhbmQgaXMgY292ZXJpbmcgaXQuCisgICAgICAgPHA+Rm9sbG93ZWQgZWl0aGVyIGJ5IHtAY29kZSBvblJlc3RhcnQoKX0gaWYKKyAgICAgICB0aGUgYWN0aXZpdHkgaXMgY29taW5nIGJhY2sgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgdXNlciwgb3IgYnkKKyAgICAgICB7QGNvZGUgb25EZXN0cm95KCl9IGlmIHRoaXMgYWN0aXZpdHkgaXMgZ29pbmcgYXdheS48L3A+PC90ZD4KKyAgIDx0ZCBhbGlnbj0iY2VudGVyIj48c3Ryb25nIHN0eWxlPSJjb2xvcjojODAwMDAwIj5ZZXM8L3N0cm9uZz48L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblJlc3RhcnQoKX0gPGJyLz5vcjxici8+IHtAY29kZSBvbkRlc3Ryb3koKX08L3RkPgorPC90cj4KKworPHRyPgorICAgPHRkIGNvbHNwYW49IjMiIGFsaWduPSJsZWZ0Ij48Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25EZXN0cm95CitvbkRlc3Ryb3koKX08L2NvZGU+PC90ZD4KKyAgIDx0ZD5DYWxsZWQgYmVmb3JlIHRoZSBhY3Rpdml0eSBpcyBkZXN0cm95ZWQuICBUaGlzIGlzIHRoZSBmaW5hbCBjYWxsCisgICAgICAgdGhhdCB0aGUgYWN0aXZpdHkgd2lsbCByZWNlaXZlLiAgSXQgY291bGQgYmUgY2FsbGVkIGVpdGhlciBiZWNhdXNlIHRoZQorICAgICAgIGFjdGl2aXR5IGlzIGZpbmlzaGluZyAoc29tZW9uZSBjYWxsZWQgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2ZpbmlzaAorICAgICAgIGZpbmlzaCgpfTwvY29kZT4gb24gaXQpLCBvciBiZWNhdXNlIHRoZSBzeXN0ZW0gaXMgdGVtcG9yYXJpbHkgZGVzdHJveWluZyB0aGlzCisgICAgICAgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IHRvIHNhdmUgc3BhY2UuICBZb3UgY2FuIGRpc3Rpbmd1aXNoCisgICAgICAgYmV0d2VlbiB0aGVzZSB0d28gc2NlbmFyaW9zIHdpdGggdGhlIDxjb2RlPntAbGluaworICAgICAgIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2lzRmluaXNoaW5nIGlzRmluaXNoaW5nKCl9PC9jb2RlPiBtZXRob2QuPC90ZD4KKyAgIDx0ZCBhbGlnbj0iY2VudGVyIj48c3Ryb25nIHN0eWxlPSJjb2xvcjojODAwMDAwIj5ZZXM8L3N0cm9uZz48L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPjxlbT5ub3RoaW5nPC9lbT48L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5UaGUgY29sdW1uIGxhYmVsZWQgIktpbGxhYmxlIGFmdGVyPyIgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzeXN0ZW0gY2FuCitraWxsIHRoZSBwcm9jZXNzIGhvc3RpbmcgdGhlIGFjdGl2aXR5IGF0IGFueSB0aW1lIDxlbT5hZnRlciB0aGUgbWV0aG9kIHJldHVybnM8L2VtPiwgd2l0aG91dAorZXhlY3V0aW5nIGFub3RoZXIgbGluZSBvZiB0aGUgYWN0aXZpdHkncyBjb2RlLiAgVGhyZWUgbWV0aG9kcyBhcmUgbWFya2VkICJ5ZXMiOiAoe0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlCitvblBhdXNlKCl9LCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSwgYW5kIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3kKK29uRGVzdHJveSgpfSkuIEJlY2F1c2Uge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfSBpcyB0aGUgZmlyc3QKK29mIHRoZSB0aHJlZSwgb25jZSB0aGUgYWN0aXZpdHkgaXMgY3JlYXRlZCwge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfSBpcyB0aGUKK2xhc3QgbWV0aG9kIHRoYXQncyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHByb2Nlc3MgPGVtPmNhbjwvZW0+IGJlIGtpbGxlZCZtZGFzaDtpZgordGhlIHN5c3RlbSBtdXN0IHJlY292ZXIgbWVtb3J5IGluIGFuIGVtZXJnZW5jeSwgdGhlbiB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3AoKX0gYW5kIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3kgb25EZXN0cm95KCl9IG1pZ2h0Citub3QgYmUgY2FsbGVkLiBUaGVyZWZvcmUsIHlvdSBzaG91bGQgdXNlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0gdG8gd3JpdGUKK2NydWNpYWwgcGVyc2lzdGVudCBkYXRhIChzdWNoIGFzIHVzZXIgZWRpdHMpIHRvIHN0b3JhZ2UuIEhvd2V2ZXIsIHlvdSBzaG91bGQgYmUgc2VsZWN0aXZlIGFib3V0Cit3aGF0IGluZm9ybWF0aW9uIG11c3QgYmUgcmV0YWluZWQgZHVyaW5nIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0sIGJlY2F1c2UgYW55CitibG9ja2luZyBwcm9jZWR1cmVzIGluIHRoaXMgbWV0aG9kIGJsb2NrIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IGFjdGl2aXR5IGFuZCBzbG93IHRoZSB1c2VyCitleHBlcmllbmNlLjwvcD4KKworPHA+IE1ldGhvZHMgdGhhdCBhcmUgbWFya2VkICJObyIgaW4gdGhlIDxiPktpbGxhYmxlPC9iPiBjb2x1bW4gcHJvdGVjdCB0aGUgcHJvY2VzcyBob3N0aW5nIHRoZQorYWN0aXZpdHkgZnJvbSBiZWluZyBraWxsZWQgZnJvbSB0aGUgbW9tZW50IHRoZXkgYXJlIGNhbGxlZC4gIFRodXMsIGFuIGFjdGl2aXR5IGlzIGtpbGxhYmxlCitmcm9tIHRoZSB0aW1lIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0gcmV0dXJucyB0byB0aGUgdGltZQore0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUmVzdW1lIG9uUmVzdW1lKCl9IGlzIGNhbGxlZC4gSXQgd2lsbCBub3QgYWdhaW4gYmUga2lsbGFibGUgdW50aWwKK3tAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0gaXMgYWdhaW4gY2FsbGVkIGFuZCByZXR1cm5zLiA8L3A+CisKKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEFuIGFjdGl2aXR5IHRoYXQncyBub3QgdGVjaG5pY2FsbHkgImtpbGxhYmxlIiBieSB0aGlzCitkZWZpbml0aW9uIGluIHRhYmxlIDEgbWlnaHQgc3RpbGwgYmUga2lsbGVkIGJ5IHRoZSBzeXN0ZW0mbWRhc2g7YnV0IHRoYXQgd291bGQgaGFwcGVuIG9ubHkgaW4KK2V4dHJlbWUgY2lyY3Vtc3RhbmNlcyB3aGVuIHRoZXJlIGlzIG5vIG90aGVyIHJlY291cnNlLiBXaGVuIGFuIGFjdGl2aXR5IG1pZ2h0IGJlIGtpbGxlZCBpcworZGlzY3Vzc2VkIG1vcmUgaW4gdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9wcm9jZXNzZXMtYW5kLXRocmVhZGluZy5odG1sIj5Qcm9jZXNzZXMgYW5kCitUaHJlYWRpbmc8L2E+IGRvY3VtZW50LjwvcD4KKworCis8aDMgaWQ9IlNhdmluZ0FjdGl2aXR5U3RhdGUiPlNhdmluZyBhY3Rpdml0eSBzdGF0ZTwvaDM+CisKKzxwPlRoZSBpbnRyb2R1Y3Rpb24gdG8gPGEgaHJlZj0iTGlmZWN5Y2xlIj5NYW5hZ2luZyB0aGUgQWN0aXZpdHkgTGlmZWN5Y2xlPC9hPiBicmllZmx5IG1lbnRpb25zIHRoYXQKK3doZW4gYW4gYWN0aXZpdHkgaXMgcGF1c2VkIG9yIHN0b3BwZWQsIHRoZSBzdGF0ZSBvZiB0aGUgYWN0aXZpdHkgaXMgcmV0YWluZWQuIFRoaXMgaXMgdHJ1ZSBiZWNhdXNlCit0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSBvYmplY3QgaXMgc3RpbGwgaGVsZCBpbiBtZW1vcnkgd2hlbiBpdCBpcyBwYXVzZWQgb3IKK3N0b3BwZWQmbWRhc2g7YWxsIGluZm9ybWF0aW9uIGFib3V0IGl0cyBtZW1iZXJzIGFuZCBjdXJyZW50IHN0YXRlIGlzIHN0aWxsIGFsaXZlLiBUaHVzLCBhbnkgY2hhbmdlcwordGhlIHVzZXIgbWFkZSB3aXRoaW4gdGhlIGFjdGl2aXR5IGFyZSByZXRhaW5lZCBpbiBtZW1vcnksIHNvIHRoYXQgd2hlbiB0aGUgYWN0aXZpdHkgcmV0dXJucyB0byB0aGUKK2ZvcmVncm91bmQgKHdoZW4gaXQgInJlc3VtZXMiKSwgdGhvc2UgY2hhbmdlcyBhcmUgc3RpbGwgdGhlcmUuPC9wPgorCis8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ3aWR0aDo2MTVweCI+Cis8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy9mdW5kYW1lbnRhbHMvcmVzdG9yZV9pbnN0YW5jZS5wbmciIGFsdD0iIiAvPgorPHAgY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAyLjwvc3Ryb25nPiBUaGUgdHdvIHdheXMgaW4gd2hpY2ggYW4gYWN0aXZpdHkgcmV0dXJucyB0byB1c2VyCitmb2N1cyB3aXRoIGl0cyBzdGF0ZSBpbnRhY3Q6IGVpdGhlciB0aGUgYWN0aXZpdHkgaXMgc3RvcHBlZCwgdGhlbiByZXN1bWVkIGFuZCB0aGUgYWN0aXZpdHkgc3RhdGUKK3JlbWFpbnMgaW50YWN0IChsZWZ0KSwgb3IgdGhlIGFjdGl2aXR5IGlzIGRlc3Ryb3llZCwgdGhlbiByZWNyZWF0ZWQgYW5kIHRoZSBhY3Rpdml0eSBtdXN0IHJlc3RvcmUKK3RoZSBwcmV2aW91cyBhY3Rpdml0eSBzdGF0ZSAocmlnaHQpLjwvcD4KKzwvZGl2PgorCis8cD5Ib3dldmVyLCB3aGVuIHRoZSBzeXN0ZW0gZGVzdHJveXMgYW4gYWN0aXZpdHkgaW4gb3JkZXIgdG8gcmVjb3ZlciBtZW1vcnksIHRoZSB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5fSBvYmplY3QgaXMgZGVzdHJveWVkLCBzbyB0aGUgc3lzdGVtIGNhbm5vdCBzaW1wbHkgcmVzdW1lIGl0IHdpdGggaXRzIHN0YXRlCitpbnRhY3QuIEluc3RlYWQsIHRoZSBzeXN0ZW0gbXVzdCByZWNyZWF0ZSB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSBvYmplY3QgaWYgdGhlIHVzZXIKK25hdmlnYXRlcyBiYWNrIHRvIGl0LiBZZXQsIHRoZSB1c2VyIGlzIHVuYXdhcmUKK3RoYXQgdGhlIHN5c3RlbSBkZXN0cm95ZWQgdGhlIGFjdGl2aXR5IGFuZCByZWNyZWF0ZWQgaXQgYW5kLCB0aHVzLCBwcm9iYWJseQorZXhwZWN0cyB0aGUgYWN0aXZpdHkgdG8gYmUgZXhhY3RseSBhcyBpdCB3YXMuIEluIHRoaXMgc2l0dWF0aW9uLCB5b3UgY2FuIGVuc3VyZSB0aGF0CitpbXBvcnRhbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjdGl2aXR5IHN0YXRlIGlzIHByZXNlcnZlZCBieSBpbXBsZW1lbnRpbmcgYW4gYWRkaXRpb25hbAorY2FsbGJhY2sgbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0byBzYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiB5b3VyIGFjdGl2aXR5IGFuZCB0aGVuCityZXN0b3JlIGl0IHdoZW4gdGhlIHRoZSBzeXN0ZW0gcmVjcmVhdGVzIHRoZSBhY3Rpdml0eS48L3A+CisKKzxwPlRoZSBjYWxsYmFjayBtZXRob2QgaW4gd2hpY2ggeW91IGNhbiBzYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHlvdXIgYWN0aXZpdHkgaXMKK3tAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKX0uIFRoZSBzeXN0ZW0gY2FsbHMgdGhpcyBtZXRob2QKK2JlZm9yZSBtYWtpbmcgdGhlIGFjdGl2aXR5IHZ1bG5lcmFibGUgdG8gYmVpbmcgZGVzdHJveWVkIGFuZCBwYXNzZXMgaXQKK2Ege0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvYmplY3QuIFRoZSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IGlzIHdoZXJlIHlvdSBjYW4gc3RvcmUgCitzdGF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWN0aXZpdHkgYXMgbmFtZS12YWx1ZSBwYWlycywgdXNpbmcgbWV0aG9kcyBzdWNoIGFzIHtAbGluaworYW5kcm9pZC5vcy5CdW5kbGUjcHV0U3RyaW5nIHB1dFN0cmluZygpfS4gVGhlbiwgaWYgdGhlIHN5c3RlbSBraWxscyB5b3VyIGFjdGl2aXR5J3MKK3Byb2Nlc3MgYW5kIHRoZSB1c2VyIG5hdmlnYXRlcyBiYWNrIHRvIHlvdXIgYWN0aXZpdHksIHRoZSBzeXN0ZW0gcGFzc2VzIHRoZSB7QGxpbmsKK2FuZHJvaWQub3MuQnVuZGxlfSB0byB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25DcmVhdGUgb25DcmVhdGUoKX0gc28geW91IGNhbiByZXN0b3JlIHRoZQorYWN0aXZpdHkgc3RhdGUgeW91IHNhdmVkIGR1cmluZyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZQorb25TYXZlSW5zdGFuY2VTdGF0ZSgpfS4gSWYgdGhlcmUgaXMgbm8gc3RhdGUgaW5mb3JtYXRpb24gdG8gcmVzdG9yZSwgdGhlbiB0aGUge0BsaW5rCithbmRyb2lkLm9zLkJ1bmRsZX0gcGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSBpcyBudWxsLjwvcD4KKworPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU2F2ZUluc3RhbmNlU3RhdGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpfSB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgeW91cgorYWN0aXZpdHkgaXMgZGVzdHJveWVkLCBiZWNhdXNlIHRoZXJlIGFyZSBjYXNlcyBpbiB3aGljaCBpdCB3b24ndCBiZSBuZWNlc3NhcnkgdG8gc2F2ZSB0aGUgc3RhdGUKKyhzdWNoIGFzIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHlvdXIgYWN0aXZpdHkgdXNpbmcgdGhlIEJBQ0sga2V5LCBiZWNhdXNlIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHkKK2Nsb3NpbmcgdGhlIGFjdGl2aXR5KS4gSWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIGl0IGlzIGFsd2F5cyBjYWxsZWQgYmVmb3JlIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSBhbmQgcG9zc2libHkgYmVmb3JlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlCitvblBhdXNlKCl9LjwvcD4KKworPHA+SG93ZXZlciwgZXZlbiBpZiB5b3UgZG8gbm90aGluZyBhbmQgZG8gbm90IGltcGxlbWVudCB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU2F2ZUluc3RhbmNlU3RhdGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpfSwgc29tZSBvZiB0aGUgYWN0aXZpdHkgc3RhdGUgaXMKK3Jlc3RvcmVkIGJ5IHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9IGNsYXNzJ3MgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU2F2ZUluc3RhbmNlU3RhdGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpfS4gU3BlY2lmaWNhbGx5LCB0aGUgZGVmYXVsdAoraW1wbGVtZW50YXRpb24gY2FsbHMge0BsaW5rCithbmRyb2lkLnZpZXcuVmlldyNvblNhdmVJbnN0YW5jZVN0YXRlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKX0gZm9yIGV2ZXJ5IHtAbGluayBhbmRyb2lkLnZpZXcuVmlld30KK2luIHRoZSBsYXlvdXQsIHdoaWNoIGFsbG93cyBlYWNoIHZpZXcgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBpdHNlbGYKK3RoYXQgc2hvdWxkIGJlIHNhdmVkLiBBbG1vc3QgZXZlcnkgd2lkZ2V0IGluIHRoZSBBbmRyb2lkIGZyYW1ld29yayBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIGFzCithcHByb3ByaWF0ZSwgc3VjaCB0aGF0IGFueSB2aXNpYmxlIGNoYW5nZXMgdG8gdGhlIFVJIGFyZSBhdXRvbWF0aWNhbGx5IHNhdmVkIGFuZCByZXN0b3JlZCB3aGVuIHlvdXIKK2FjdGl2aXR5IGlzIHJlY3JlYXRlZC4gRm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuRWRpdFRleHR9IHdpZGdldCBzYXZlcyBhbnkgdGV4dAorZW50ZXJlZCBieSB0aGUgdXNlciBhbmQgdGhlIHtAbGluayBhbmRyb2lkLndpZGdldC5DaGVja0JveH0gd2lkZ2V0IHNhdmVzIHdoZXRoZXIgaXQncyBjaGVja2VkIG9yCitub3QuIFRoZSBvbmx5IHdvcmsgcmVxdWlyZWQgYnkgeW91IGlzIHRvIHByb3ZpZGUgYSB1bmlxdWUgSUQgKHdpdGggdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9sYXlvdXQtcmVzb3VyY2UuaHRtbCNpZHZhbHVlIj57QGNvZGUgYW5kcm9pZDppZH08L2E+CithdHRyaWJ1dGUpIGZvciBlYWNoIHdpZGdldCB5b3Ugd2FudCB0byBzYXZlIGl0cyBzdGF0ZS4gSWYgYSB3aWRnZXQgZG9lcyBub3QgaGF2ZSBhbiBJRCwgdGhlbiBpdAorY2Fubm90IHNhdmUgaXRzIHN0YXRlLjwvcD4KKworPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIj4KKzxkaXYgY2xhc3M9InNpZGVib3giPgorPHA+WW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgc3RvcCBhIHZpZXcgaW4geW91ciBsYXlvdXQgZnJvbSBzYXZpbmcgaXRzIHN0YXRlIGJ5IHNldHRpbmcgdGhlCit7QGxpbmsgYW5kcm9pZC5SLmF0dHIjc2F2ZUVuYWJsZWQgYW5kcm9pZDpzYXZlRW5hYmxlZH0gYXR0cmlidXRlIHRvIHtAY29kZSAiZmFsc2UifSBvciBieSBjYWxsaW5nCit0aGUge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I3NldFNhdmVFbmFibGVkIHNldFNhdmVFbmFibGVkKCl9IG1ldGhvZC4gVXN1YWxseSwgeW91IHNob3VsZCBub3QKK2Rpc2FibGUgdGhpcywgYnV0IHlvdSBtaWdodCBpZiB5b3Ugd2FudCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgYWN0aXZpdHkgVUkgZGlmZmVyZW50bHkuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKworPHA+QWx0aG91Z2ggdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKX0gc2F2ZXMgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0Cit5b3VyIGFjdGl2aXR5J3MgVUksIHlvdSBzdGlsbCBtaWdodCBuZWVkIHRvIG92ZXJyaWRlIGl0IHRvIHNhdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KK0ZvciBleGFtcGxlLCB5b3UgbWlnaHQgbmVlZCB0byBzYXZlIG1lbWJlciB2YWx1ZXMgdGhhdCBjaGFuZ2VkIGR1cmluZyB0aGUgYWN0aXZpdHkncyBsaWZlICh3aGljaAorbWlnaHQgY29ycmVsYXRlIHRvIHZhbHVlcyByZXN0b3JlZCBpbiB0aGUgVUksIGJ1dCB0aGUgbWVtYmVycyB0aGF0IGhvbGQgdGhvc2UgVUkgdmFsdWVzIGFyZSBub3QKK3Jlc3RvcmVkLCBieSBkZWZhdWx0KS48L3A+CisKKzxwPkJlY2F1c2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKX0gaGVscHMgc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIFVJLCBpZgoreW91IG92ZXJyaWRlIHRoZSBtZXRob2QgaW4gb3JkZXIgdG8gc2F2ZSBhZGRpdGlvbmFsIHN0YXRlIGluZm9ybWF0aW9uLCB5b3Ugc2hvdWxkIGFsd2F5cyBjYWxsIHRoZQorc3VwZXJjbGFzcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZSBvblNhdmVJbnN0YW5jZVN0YXRlKCl9CitiZWZvcmUgZG9pbmcgYW55IHdvcmsuPC9wPgorCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBCZWNhdXNlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlCitvblNhdmVJbnN0YW5jZVN0YXRlKCl9IGlzIG5vdCBndWFyYW50ZWVkCit0byBiZSBjYWxsZWQsIHlvdSBzaG91bGQgdXNlIGl0IG9ubHkgdG8gcmVjb3JkIHRoZSB0cmFuc2llbnQgc3RhdGUgb2YgdGhlIGFjdGl2aXR5ICh0aGUgc3RhdGUgb2YKK3RoZSBVSSkmbWRhc2g7eW91IHNob3VsZCBuZXZlciB1c2UgaXQgdG8gc3RvcmUgcGVyc2lzdGVudCBkYXRhLiAgSW5zdGVhZCwgeW91IHNob3VsZCB1c2UgIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25QYXVzZSBvblBhdXNlKCl9IHRvIHN0b3JlIHBlcnNpc3RlbnQgZGF0YSAoc3VjaCBhcyBkYXRhIHRoYXQgc2hvdWxkIGJlIHNhdmVkCit0byBhIGRhdGFiYXNlKSB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgYWN0aXZpdHkuPC9wPgorCis8cD5BIGdvb2Qgd2F5IHRvIHRlc3QgeW91ciBhcHBsaWNhdGlvbidzIGFiaWxpdHkgdG8gcmVzdG9yZSBpdHMgc3RhdGUgaXMgdG8gc2ltcGx5IHJvdGF0ZSB0aGUKK2RldmljZSBzbyB0aGF0IHRoZSBzY3JlZW4gb3JpZW50YXRpb24gY2hhbmdlcy4gV2hlbiB0aGUgc2NyZWVuIG9yaWVudGF0aW9uIGNoYW5nZXMsIHRoZSBzeXN0ZW0KK2Rlc3Ryb3lzIGFuZCByZWNyZWF0ZXMgdGhlIGFjdGl2aXR5IGluIG9yZGVyIHRvIGFwcGx5IGFsdGVybmF0aXZlIHJlc291cmNlcyB0aGF0IG1pZ2h0IGJlIGF2YWlsYWJsZQorZm9yIHRoZSBuZXcgb3JpZW50YXRpb24uIEZvciB0aGlzIHJlYXNvbiBhbG9uZSwgaXQncyB2ZXJ5IGltcG9ydGFudCB0aGF0IHlvdXIgYWN0aXZpdHkKK2NvbXBsZXRlbHkgcmVzdG9yZXMgaXRzIHN0YXRlIHdoZW4gaXQgaXMgcmVjcmVhdGVkLCBiZWNhdXNlIHVzZXJzIHJlZ3VsYXJseSByb3RhdGUgdGhlIHNjcmVlbiB3aGlsZQordXNpbmcgYXBwbGljYXRpb25zLjwvcD4KKworCis8aDMgaWQ9IkNvbmZpZ3VyYXRpb25DaGFuZ2VzIj5IYW5kbGluZyBjb25maWd1cmF0aW9uIGNoYW5nZXM8L2gzPgorCis8cD5Tb21lIGRldmljZSBjb25maWd1cmF0aW9ucyBjYW4gY2hhbmdlIGR1cmluZyBydW50aW1lIChzdWNoIGFzIHNjcmVlbiBvcmllbnRhdGlvbiwga2V5Ym9hcmQKK2F2YWlsYWJpbGl0eSwgYW5kIGxhbmd1YWdlKS4gV2hlbiBzdWNoIGEgY2hhbmdlIG9jY3VycywgQW5kcm9pZCByZXN0YXJ0cyB0aGUgcnVubmluZyBBY3Rpdml0eQorKHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3l9IGlzIGNhbGxlZCwgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSkuIFRoZSByZXN0YXJ0IGJlaGF2aW9yIGlzCitkZXNpZ25lZCB0byBoZWxwIHlvdXIgYXBwbGljYXRpb24gYWRhcHQgdG8gbmV3IGNvbmZpZ3VyYXRpb25zIGJ5IGF1dG9tYXRpY2FsbHkgcmVsb2FkaW5nIHlvdXIKK2FwcGxpY2F0aW9uIHdpdGggYWx0ZXJuYXRpdmUgcmVzb3VyY2VzIHRoYXQgeW91J3ZlIHByb3ZpZGVkLiBJZiB5b3UgZGVzaWduIHlvdXIgYWN0aXZpdHkgdG8KK3Byb3Blcmx5IGhhbmRsZSB0aGlzIGV2ZW50LCBpdCB3aWxsIGJlIG1vcmUgcmVzaWxpZW50IHRvIHVuZXhwZWN0ZWQgZXZlbnRzIGluIHRoZSBhY3Rpdml0eQorbGlmZWN5Y2xlLjwvcD4KKworPHA+VGhlIGJlc3Qgd2F5IHRvIGhhbmRsZSBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlLCBzdWNoIGFzIGEgY2hhbmdlIGluIHRoZSBzY3JlZW4gb3JpZW50YXRpb24sIGlzCisgIHRvIHNpbXBseSBwcmVzZXJ2ZSB0aGUgc3RhdGUgb2YgeW91ciBhcHBsaWNhdGlvbiB1c2luZyB7QGxpbmsKKyAgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZSBvblNhdmVJbnN0YW5jZVN0YXRlKCl9IGFuZCB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uUmVzdG9yZUluc3RhbmNlU3RhdGUgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZSgpfSAob3Ige0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSksIGFzIGRpc2N1c3NlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi48L3A+CisKKzxwPkZvciBhIGRldGFpbGVkIGRpc2N1c3Npb24gYWJvdXQgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHRoYXQgaGFwcGVuIGF0IHJ1bnRpbWUgYW5kIGhvdyB5b3Ugc2hvdWxkCitoYW5kbGUgdGhlbSwgcmVhZCA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9ydW50aW1lLWNoYW5nZXMuaHRtbCI+SGFuZGxpbmcKK1J1bnRpbWUgQ2hhbmdlczwvYT4uPC9wPgorCisKKworPGgzIGlkPSJDb29yZGluYXRpbmdBY3Rpdml0aWVzIj5Db29yZGluYXRpbmcgYWN0aXZpdGllczwvaDM+CisKKyA8cD5XaGVuIG9uZSBhY3Rpdml0eSBzdGFydHMgYW5vdGhlciwgdGhleSBib3RoIGV4cGVyaWVuY2UgbGlmZWN5Y2xlIHRyYW5zaXRpb25zLiBUaGUgZmlyc3QgYWN0aXZpdHkKK3BhdXNlcyBhbmQgc3RvcHMgKHRob3VnaCwgaXQgd29uJ3Qgc3RvcCBpZiBpdCdzIHN0aWxsIHZpc2libGUgaW4gdGhlIGJhY2tncm91bmQpLCB3aGlsZSB0aGUgb3RoZXIKK2FjdGl2aXR5IGlzIGNyZWF0ZWQuIEluIGNhc2UgdGhlc2UgYWN0aXZpdGllcyBzaGFyZSBkYXRhIHNhdmVkIHRvIGRpc2Mgb3IgZWxzZXdoZXJlLCBpdCdzIGltcG9ydGFudAordG8gdW5kZXJzdGFuZCB0aGF0IHRoZSBmaXJzdCBhY3Rpdml0eSBpcyBub3QgY29tcGxldGVseSBzdG9wcGVkIGJlZm9yZSB0aGUgc2Vjb25kIG9uZSBpcyBjcmVhdGVkLgorUmF0aGVyLCB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB0aGUgc2Vjb25kIG9uZSBvdmVybGFwcyB3aXRoIHRoZSBwcm9jZXNzIG9mIHN0b3BwaW5nIHRoZSBmaXJzdAorb25lLjwvcD4KKworPHA+VGhlIG9yZGVyIG9mIGxpZmVjeWNsZSBjYWxsYmFja3MgaXMgd2VsbCBkZWZpbmVkLCBwYXJ0aWN1bGFybHkgd2hlbiB0aGUgdHdvIGFjdGl2aXRpZXMgYXJlIGluIHRoZQorc2FtZSBwcm9jZXNzIGFuZCBvbmUgaXMgc3RhcnRpbmcgdGhlIG90aGVyLiBIZXJlJ3MgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgdGhhdCBvY2N1ciB3aGVuIEFjdGl2aXR5CitBIHN0YXJ0cyBBY2l2aXR5IEI6IDwvcD4KKworPG9sPgorPGxpPkFjdGl2aXR5IEEncyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25QYXVzZSBvblBhdXNlKCl9IG1ldGhvZCBleGVjdXRlcy48L2xpPgorCis8bGk+QWN0aXZpdHkgQidzIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSwge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnQoKX0sIGFuZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25SZXN1bWUgb25SZXN1bWUoKX0KK21ldGhvZHMgZXhlY3V0ZSBpbiBzZXF1ZW5jZS4gKEFjdGl2aXR5IEIgbm93IGhhcyB1c2VyIGZvY3VzLik8L2xpPgorCis8bGk+VGhlbiwgaWYgQWN0aXZpdHkgQSBpcyBubyBsb25nZXIgdmlzaWJsZSBvbiBzY3JlZW4sIGl0cyB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3AoKX0gbWV0aG9kIGV4ZWN1dGVzLjwvbGk+Cis8L29sPgorCisgPHA+VGhpcyBwcmVkaWN0YWJsZSBzZXF1ZW5jZSBvZiBsaWZlY3ljbGUgY2FsbGJhY2tzIGFsbG93cyB5b3UgdG8gbWFuYWdlIHRoZSB0cmFuc2l0aW9uIG9mCitpbmZvcm1hdGlvbiBmcm9tIG9uZSBhY3Rpdml0eSB0byBhbm90aGVyLiBGb3IgZXhhbXBsZSwgaWYgeW91IG11c3Qgd3JpdGUgdG8gYSBkYXRhYmFzZSB3aGVuIHRoZQorZmlyc3QgYWN0aXZpdHkgc3RvcHMgc28gdGhhdCB0aGUgZm9sbG93aW5nIGFjdGl2aXR5IGNhbiByZWFkIGl0LCB0aGVuIHlvdSBzaG91bGQgd3JpdGUgdG8gdGhlCitkYXRhYmFzZSBkdXJpbmcge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfSBpbnN0ZWFkIG9mIGR1cmluZyB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3AoKX0uPC9wPgorCisKKzxoMj5CZWdpbm5lcidzIFBhdGg8L2gyPgorCis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgQW5kcm9pZCBtYWludGFpbnMgYSBoaXN0b3J5IG9mIGFjdGl2aXRpZXMgYW5kCitlbmFibGVzIHVzZXIgbXVsdGl0YXNraW5nLCBjb250aW51ZSB3aXRoIHRoZSA8Yj48YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvdGFza3MtYW5kLWJhY2stc3RhY2suaHRtbCI+VGFza3MgYW5kIEJhY2sKK1N0YWNrPC9hPjwvYj4gZG9jdW1lbnQuPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvdGFza3MtYW5kLWJhY2stc3RhY2suamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjay5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2RjNTQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL3Rhc2tzLWFuZC1iYWNrLXN0YWNrLmpkCkBAIC0wLDAgKzEsNTY4IEBACitwYWdlLnRpdGxlPVRhc2tzIGFuZCBCYWNrIFN0YWNrCitwYXJlbnQudGl0bGU9QXBwbGljYXRpb24gRnVuZGFtZW50YWxzCitwYXJlbnQubGluaz1pbmRleC5odG1sCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKzxkaXYgaWQ9InF2Ij4KKzxoMj5RdWlja3ZpZXc8L2gyPgorPHVsPgorICA8bGk+QWxsIGFjdGl2aXRpZXMgYmVsb25nIHRvIGEgdGFzazwvbGk+CisgIDxsaT5BIHRhc2sgY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGFjdGl2aXRpZXMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoCit0aGVtPC9saT4KKyAgPGxpPlRhc2tzIGNhbiBtb3ZlIHRvIHRoZSBiYWNrZ3JvdW5kIGFuZCByZXRhaW4gdGhlIHN0YXRlIG9mIGVhY2ggYWN0aXZpdHkgaW4gb3JkZXIgZm9yIHRoZSB1c2VyCit0byBwZXJmb3JtIG90aGVyIHRhc2tzIHdpdGhvdXQgbG9vc2luZyB0aGVpciB3b3JrPC9saT4KKzwvdWw+CisKKzxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKzxvbD4KKzxsaT48YSBocmVmPSIjQWN0aXZpdHlTdGF0ZSI+U2F2aW5nIEFjdGl2aXR5IFN0YXRlPC9hPjwvbGk+PC9saT4KKzxsaT48YSBocmVmPSIjTWFuYWdpbmdUYXNrcyI+TWFuYWdpbmcgVGFza3M8L2E+CisgIDxvbD4KKyAgICA8bGk+PGEgaHJlZj0iI1Rhc2tMYXVuY2hNb2RlcyI+RGVmaW5pbmcgbGF1bmNoIG1vZGVzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNBZmZpbml0aWVzIj5IYW5kbGluZyBhZmZpbml0aWVzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNDbGVhcmluZyI+Q2xlYXJpbmcgdGhlIGJhY2sgc3RhY2s8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iI1N0YXJ0aW5nIj5TdGFydGluZyBhIHRhc2s8L2E+PC9saT4KKyAgPC9vbD4KKzwvbGk+Cis8L29sPgorCis8aDI+U2VlIGFsc288L2gyPgorPG9sPgorICA8bGk+PGE+PGEgaHJlZj0ie0Bkb2NSb290fXZpZGVvcy9pbmRleC5odG1sI3Y9Zkw2Z1NkNHVnU0kiPkFwcGxpY2F0aW9uIExpZmVjeWNsZSB2aWRlbzwvYT48L2xpPgorICA8bGk+PGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sIj57QGNvZGUgJmx0O2FjdGl2aXR5Jmd0O30gbWFuaWZlc3QKK2VsZW1lbnQ8L2E+PC9saT4KKzwvb2w+Cis8L2Rpdj4KKzwvZGl2PgorCisKKzxwPkFuIGFwcGxpY2F0aW9uIHVzdWFsbHkgY29udGFpbnMgbXVsdGlwbGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL2FjdGl2aXRpZXMuaHRtbCI+YWN0aXZpdGllczwvYT4uIEVhY2ggYWN0aXZpdHkKK3Nob3VsZCBiZSBkZXNpZ25lZCBhcm91bmQgYSBzcGVjaWZpYyBraW5kIG9mIGFjdGlvbiB0aGUgdXNlciBjYW4gcGVyZm9ybSBhbmQgY2FuIHN0YXJ0IG90aGVyCithY3Rpdml0aWVzLiBGb3IgZXhhbXBsZSwgYW4gZW1haWwgYXBwbGljYXRpb24gbWlnaHQgaGF2ZSBvbmUgYWN0aXZpdHkgdG8gc2hvdyBhIGxpc3Qgb2YgbmV3IGVtYWlsLgorV2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGVtYWlsLCBhIG5ldyBhY3Rpdml0eSBvcGVucyB0byB2aWV3IHRoYXQgZW1haWwuPC9wPgorCis8cD5BbiBhY3Rpdml0eSBjYW4gZXZlbiBzdGFydCBhY3Rpdml0aWVzIHRoYXQgZXhpc3QgaW4gb3RoZXIgYXBwbGljYXRpb25zIG9uIHRoZSBkZXZpY2UuIEZvcgorZXhhbXBsZSwgaWYgeW91ciBhcHBsaWNhdGlvbiB3YW50cyB0byBzZW5kIGFuIGVtYWlsLCB5b3UgY2FuIGRlZmluZSBhbiBpbnRlbnQgdG8gcGVyZm9ybSBhICJzZW5kIgorYWN0aW9uIGFuZCBpbmNsdWRlIHNvbWUgZGF0YSwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIGFuZCBhIG1lc3NhZ2UuIEFuIGFjdGl2aXR5IGZyb20gYW5vdGhlcgorYXBwbGljYXRpb24gdGhhdCBkZWNsYXJlcyBpdHNlbGYgdG8gaGFuZGxlIHRoaXMga2luZCBvZiBpbnRlbnQgdGhlbiBvcGVucy4gSW4gdGhpcyBjYXNlLCB0aGUgaW50ZW50CitpcyB0byBzZW5kIGFuIGVtYWlsLCBzbyBhbiBlbWFpbCBhcHBsaWNhdGlvbidzICJjb21wb3NlIiBhY3Rpdml0eSBzdGFydHMgKGlmIG11bHRpcGxlIGFjdGl2aXRpZXMKK3N1cHBvcnQgdGhlIHNhbWUgaW50ZW50LCB0aGVuIHRoZSBzeXN0ZW0gbGV0cyB0aGUgdXNlciBzZWxlY3Qgd2hpY2ggb25lIHRvIHVzZSkuIFdoZW4gdGhlIGVtYWlsIGlzCitzZW50LCB5b3VyIGFjdGl2aXR5IHJlc3VtZXMgYW5kIGl0IHNlZW1zIGFzIGlmIHRoZSBlbWFpbCBhY3Rpdml0eSB3YXMgcGFydCBvZiB5b3VyIGFwcGxpY2F0aW9uLiBFdmVuCit0aG91Z2ggdGhlIGFjdGl2aXRpZXMgbWF5IGJlIGZyb20gZGlmZmVyZW50IGFwcGxpY2F0aW9ucywgQW5kcm9pZCBtYWludGFpbnMgdGhpcyBzZWFtbGVzcyB1c2VyCitleHBlcmllbmNlIGJ5IGtlZXBpbmcgYm90aCBhY3Rpdml0aWVzIGluIHRoZSBzYW1lIDxlbT50YXNrPC9lbT4uPC9wPgorCis8cD5BIHRhc2sgaXMgYSBjb2xsZWN0aW9uIG9mIGFjdGl2aXRpZXMgdGhhdCB1c2VycyBpbnRlcmFjdCB3aXRoCit3aGVuIHBlcmZvcm1pbmcgYSBjZXJ0YWluIGpvYi4gVGhlIGFjdGl2aXRpZXMgYXJlIGFycmFuZ2VkIGluIGEgc3RhY2sgKHRoZSAiYmFjayBzdGFjayIpLCBpbiB0aGUKK29yZGVyIGluIHdoaWNoIGVhY2ggYWN0aXZpdHkgaXMgb3BlbmVkLjwvcD4KKworPCEtLSBTQVZFIEZPUiBXSEVOIFRIRSBGUkFHTUVOVCBET0MgSVMgQURERUQKKzxkaXYgY2xhc3M9InNpZGVib3gtd3JhcHBlciI+Cis8ZGl2IGNsYXNzPSJzaWRlYm94Ij4KKzxoMz5BZGRpbmcgZnJhZ21lbnRzIHRvIGEgdGFzaydzIGJhY2sgc3RhY2s8L2gzPgorCis8cD5Zb3VyIGFjdGl2aXR5IGNhbiBhbHNvIGluY2x1ZGUge0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50fXMgdG8gdGhlIGJhY2sgc3RhY2suIEZvciBleGFtcGxlLAorc3VwcG9zZSB5b3UgaGF2ZSBhIHR3by1wYW5lIGxheW91dCB1c2luZyBmcmFnbWVudHMsIG9uZSBvZiB3aGljaCBpcyBhIGxpc3QgdmlldyAoZnJhZ21lbnQgQSkgYW5kIHRoZQorb3RoZXIgYmVpbmcgYSBsYXlvdXQgdG8gZGlzcGxheSBhbiBpdGVtIGZyb20gdGhlIGxpc3QgKGZyYWdtZW50IEIpLiBXaGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbQorZnJvbSB0aGUgbGlzdCwgZnJhZ21lbnQgQiBpcyByZXBsYWNlZCBieSBhIG5ldyBmcmFnbWVudCAoZnJhZ21lbnQgQykuIEluIHRoaXMgY2FzZSwgaXQgbWlnaHQgYmUKK2Rlc2lyZWFibGUgZm9yIHRoZSB1c2VyIHRvIG5hdmlnYXRlIGJhY2sgdG8gcmV2ZWFsIGZyYWdtZW50IEIsIHVzaW5nIHRoZSBCQUNLIGtleS48L3A+Cis8cD5JbiBvcmRlciB0byBhZGQgZnJhZ21lbnQgQiB0byB0aGUgYmFjayBzdGFjayBzbyB0aGF0IHRoaXMgaXMgcG9zc2libGUsIHlvdSBtdXN0IGNhbGwge0BsaW5rCithbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uI2FkZFRvQmFja1N0YWNrIGFkZFRvQmFja1N0YWNrKCl9IGJlZm9yZSB5b3Uge0BsaW5rCithbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uI2NvbW1pdCgpfSB0aGUgdHJhbnNhY3Rpb24gdGhhdCByZXBsYWNlcyBmcmFnbWVudCBCIHdpdGggZnJhZ21lbnQKK0MuPC9wPgorPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgZnJhZ21lbnRzIGFuZCBhZGRpbmcgdGhlbSB0byB0aGUgYmFjayBzdGFjaywgc2VlIHRoZSB7QGxpbmsKK2FuZHJvaWQuYXBwLkZyYWdtZW50fSBjbGFzcyBkb2N1bWVudGF0aW9uLjwvcD4KKworPC9kaXY+Cis8L2Rpdj4KKy0tPgorCis8cD5UaGUgZGV2aWNlIEhvbWUgc2NyZWVuIGlzIHRoZSBzdGFydGluZyBwbGFjZSBmb3IgbW9zdCB0YXNrcy4gV2hlbiB0aGUgdXNlciB0b3VjaGVzIGFuIGljb24gaW4gdGhlCithcHBsaWNhdGlvbgorbGF1bmNoZXIgKG9yIGEgc2hvcnRjdXQgb24gdGhlIEhvbWUgc2NyZWVuKSwgdGhhdCBhcHBsaWNhdGlvbidzIHRhc2sgY29tZXMgdG8gdGhlIGZvcmVncm91bmQuIElmIG5vCit0YXNrIGV4aXN0cyBmb3IgdGhlIGFwcGxpY2F0aW9uICh0aGUgYXBwbGljYXRpb24gaGFzIG5vdCBiZWVuIHVzZWQgcmVjZW50bHkpLCB0aGVuIGEgbmV3IHRhc2sKK2lzIGNyZWF0ZWQgYW5kIHRoZSAibWFpbiIgYWN0aXZpdHkgZm9yIHRoYXQgYXBwbGljYXRpb24gb3BlbnMgYXMgdGhlIHJvb3QgYWN0aXZpdHkgaW4gdGhlIHN0YWNrLjwvcD4KKworPHA+V2hlbiB0aGUgY3VycmVudCBhY3Rpdml0eSBzdGFydHMgYW5vdGhlciwgdGhlIG5ldyBhY3Rpdml0eSBpcyBwdXNoZWQgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kCit0YWtlcyBmb2N1cy4gVGhlIHByZXZpb3VzIGFjdGl2aXR5IHJlbWFpbnMgaW4gdGhlIHN0YWNrLCBidXQgaXMgc3RvcHBlZC4gV2hlbiBhbiBhY3Rpdml0eQorc3RvcHMsIHRoZSBzeXN0ZW0gcmV0YWlucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBpdHMgdXNlciBpbnRlcmZhY2UuIFdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgQkFDSwora2V5LCB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBwb3BwZWQgZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjayAodGhlIGFjdGl2aXR5IGlzIGRlc3Ryb3llZCkgYW5kIHRoZQorcHJldmlvdXMgYWN0aXZpdHkgcmVzdW1lcyAodGhlIHByZXZpb3VzIHN0YXRlIG9mIGl0cyBVSSBpcyByZXN0b3JlZCkuIEFjdGl2aXRpZXMgaW4gdGhlIHN0YWNrIGFyZQorbmV2ZXIgcmVhcnJhbmdlZCwgb25seSBwdXNoZWQgYW5kIHBvcHBlZCBmcm9tIHRoZSBzdGFjayZtZGFzaDtwdXNoZWQgb250byB0aGUgc3RhY2sgd2hlbiBzdGFydGVkIGJ5Cit0aGUgY3VycmVudCBhY3Rpdml0eSBhbmQgcG9wcGVkIG9mZiB3aGVuIHRoZSB1c2VyIGxlYXZlcyBpdCB1c2luZyB0aGUgQkFDSyBrZXkuIEFzIHN1Y2gsIHRoZSBiYWNrCitzdGFjayBvcGVyYXRlcyBhcyBhICJsYXN0IGluLCBmaXJzdCBvdXQiIG9iamVjdCBzdHJ1Y3R1cmUuIEZpZ3VyZSAxIHZpc3VhbGl6ZXMKK3RoaXMgYmVoYXZpb3Igd2l0aCBhIHRpbWVsaW5lIHNob3dpbmcgdGhlIHByb2dyZXNzIGJldHdlZW4gYWN0aXZpdGllcyBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IGJhY2sKK3N0YWNrIGF0IGVhY2ggcG9pbnQgaW4gdGltZS48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX2JhY2tzdGFjay5wbmciIGFsdD0iIiAvPgorPHAgY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAxLjwvc3Ryb25nPiBBIHJlcHJlc2VudGF0aW9uIG9mIGhvdyBlYWNoIG5ldyBhY3Rpdml0eSBpbiBhCit0YXNrIGFkZHMgYW4gaXRlbSB0byB0aGUgYmFjayBzdGFjay4gV2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBCQUNLIGtleSwgdGhlIGN1cnJlbnQgYWN0aXZpdHkgaXMKK2Rlc3Ryb3llZCBhbmQgdGhlIHByZXZpb3VzIGFjdGl2aXR5IHJlc3VtZXMuPC9wPgorCisKKzxwPklmIHRoZSB1c2VyIGNvbnRpbnVlcyB0byBwcmVzcyBCQUNLLCB0aGVuIGVhY2ggYWN0aXZpdHkgaW4gdGhlIHN0YWNrIGlzIHBvcHBlZCBvZmYgdG8gcmV2ZWFsIHRoZQorcHJldmlvdXMgb25lLCB1bnRpbCB0aGUgdXNlciByZXR1cm5zIHRvIHRoZSBIb21lIHNjcmVlbiAob3IgdG8gd2hpY2hldmVyIGFjdGl2aXR5IHdhcyBydW5uaW5nIHdoZW4KK3RoZSB0YXNrIGJlZ2FuKS4gV2hlbiBhbGwgYWN0aXZpdGllcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBzdGFjaywgdGhlIHRhc2sgbm8gbG9uZ2VyIGV4aXN0cy48L3A+CisKKzxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9IndpZHRoOjM2OXB4Ij4KKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX211bHRpdGFza2luZy5wbmciIGFsdD0iIiAvPiA8cAorY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAyLjwvc3Ryb25nPiBUd28gdGFza3M6IFRhc2sgQSBpcyBpbiB0aGUgYmFja2dyb3VuZCwgd2FpdGluZwordG8gYmUgcmVzdW1lZCwgd2hpbGUgVGFzayBCIHJlY2VpdmVzIHVzZXIgaW50ZXJhY3Rpb24gaW4gdGhlIGZvcmVncm91bmQuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ3aWR0aDoxNzhweCI+CisgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX211bHRpcGxlX2luc3RhbmNlcy5wbmciIGFsdD0iIiAvPiA8cAorY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAzLjwvc3Ryb25nPiBBIHNpbmdsZSBhY3Rpdml0eSBpcyBpbnN0YW50aWF0ZWQgbXVsdGlwbGUgdGltZXMuPC9wPgorPC9kaXY+CisKKzxwPkEgdGFzayBpcyBhIGNvaGVzaXZlIHVuaXQgdGhhdCBjYW4gbW92ZSB0byB0aGUgImJhY2tncm91bmQiIHdoZW4gdXNlcnMgYmVnaW4gYSBuZXcgdGFzayBvciBnbwordG8gdGhlIEhvbWUgc2NyZWVuLCB2aWEgdGhlIEhPTUUga2V5LiBXaGlsZSBpbiB0aGUgYmFja2dyb3VuZCwgYWxsIHRoZSBhY3Rpdml0aWVzIGluIHRoZSB0YXNrIGFyZQorc3RvcHBlZCwgYnV0IHRoZSBiYWNrIHN0YWNrIGZvciB0aGUgdGFzayByZW1haW5zIGludGFjdCZtZGFzaDt0aGUgdGFzayBoYXMgc2ltcGx5IGxvc3QgZm9jdXMgd2hpbGUKK2Fub3RoZXIgdGFzayB0YWtlcyBwbGFjZSwgYXMgc2hvd24gaW4gZmlndXJlIDIuIEEgdGFzayBjYW4gdGhlbiByZXR1cm4gdG8gdGhlICJmb3JlZ3JvdW5kIiBzbyB1c2VycworY2FuIHBpY2sgdXAgd2hlcmUgdGhleSBsZWZ0IG9mZi4gU3VwcG9zZSwgZm9yIGV4YW1wbGUsIHRoYXQgdGhlIGN1cnJlbnQgdGFzayAoVGFzayBBKSBoYXMgdGhyZWUKK2FjdGl2aXRpZXMgaW4gaXRzIHN0YWNrJm1kYXNoO3R3byB1bmRlciB0aGUgY3VycmVudCBhY3Rpdml0eS4gVGhlIHVzZXIgcHJlc3NlcyB0aGUgSE9NRSBrZXksIHRoZW4KK3N0YXJ0cyBhIG5ldyBhcHBsaWNhdGlvbiBmcm9tIHRoZSBhcHBsaWNhdGlvbiBsYXVuY2hlci4gV2hlbiB0aGUgSG9tZSBzY3JlZW4gYXBwZWFycywgVGFzayBBIGdvZXMKK2ludG8gdGhlIGJhY2tncm91bmQuIFdoZW4gdGhlIG5ldyBhcHBsaWNhdGlvbiBzdGFydHMsIHRoZSBzeXN0ZW0gc3RhcnRzIGEgdGFzayBmb3IgdGhhdCBhcHBsaWNhdGlvbgorKFRhc2sgQikgd2l0aCBpdHMgb3duIHN0YWNrIG9mIGFjdGl2aXRpZXMuIEFmdGVyIGludGVyYWN0aW5nIHdpdGgKK3RoYXQgYXBwbGljYXRpb24sIHRoZSB1c2VyIHJldHVybnMgSG9tZSBhZ2FpbiBhbmQgc2VsZWN0cyB0aGUgYXBwbGljYXRpb24gdGhhdCBvcmlnaW5hbGx5CitzdGFydGVkIFRhc2sgQS4gTm93LCBUYXNrIEEgY29tZXMgdG8gdGhlCitmb3JlZ3JvdW5kJm1kYXNoO2FsbCB0aHJlZSBhY3Rpdml0aWVzIGluIGl0cyBzdGFjayBhcmUgaW50YWN0IGFuZCB0aGUgYWN0aXZpdHkgYXQgdGhlIHRvcCBvZiB0aGUKK3N0YWNrIHJlc3VtZXMuIEF0Cit0aGlzIHBvaW50LCB0aGUgdXNlciBjYW4gYWxzbyBzd2l0Y2ggYmFjayB0byBUYXNrIEIgYnkgZ29pbmcgSG9tZSBhbmQgc2VsZWN0aW5nIHRoZSBhcHBsaWNhdGlvbiBpY29uCit0aGF0IHN0YXJ0ZWQgdGhhdCB0YXNrIChvciBieSB0b3VjaGluZyBhbmQgaG9sZGluZyB0aGUgSE9NRSBrZXkgdG8gcmV2ZWFsIHJlY2VudCB0YXNrcyBhbmQgc2VsZWN0aW5nCitvbmUpLiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgbXVsdGl0YXNraW5nIG9uIEFuZHJvaWQuPC9wPgorCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBNdWx0aXBsZSB0YXNrcyBjYW4gYmUgaGVsZCBpbiB0aGUgYmFja2dyb3VuZCBhdCBvbmNlLgorSG93ZXZlciwgaWYgdGhlIHVzZXIgaXMgcnVubmluZyBtYW55IGJhY2tncm91bmQgdGFza3MgYXQgdGhlIHNhbWUgdGltZSwgdGhlIHN5c3RlbSBtaWdodCBiZWdpbgorZGVzdHJveWluZyBiYWNrZ3JvdW5kIGFjdGl2aXRpZXMgaW4gb3JkZXIgdG8gcmVjb3ZlciBtZW1vcnksIGNhdXNpbmcgdGhlIGFjdGl2aXR5IHN0YXRlcyB0byBiZSBsb3N0LgorU2VlIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBhYm91dCA8YSBocmVmPSIjQWN0aXZpdHlTdGF0ZSI+QWN0aXZpdHkgc3RhdGU8L2E+LjwvcD4KKworPHA+QmVjYXVzZSB0aGUgYWN0aXZpdGllcyBpbiB0aGUgYmFjayBzdGFjayBhcmUgbmV2ZXIgcmVhcnJhbmdlZCwgaWYgeW91ciBhcHBsaWNhdGlvbiBhbGxvd3MKK3VzZXJzIHRvIHN0YXJ0IGEgcGFydGljdWxhciBhY3Rpdml0eSBmcm9tIG1vcmUgdGhhbiBvbmUgYWN0aXZpdHksIGEgbmV3IGluc3RhbmNlIG9mCit0aGF0IGFjdGl2aXR5IGlzIGNyZWF0ZWQgYW5kIHBvcHBlZCBvbnRvIHRoZSBzdGFjayAocmF0aGVyIHRoYW4gYnJpbmdpbmcgYW55IHByZXZpb3VzIGluc3RhbmNlIG9mCit0aGUgYWN0aXZpdHkgdG8gdGhlIHRvcCkuIEFzIHN1Y2gsIG9uZSBhY3Rpdml0eSBpbiB5b3VyIGFwcGxpY2F0aW9uIG1pZ2h0IGJlIGluc3RhbnRpYXRlZCBtdWx0aXBsZQordGltZXMgKGV2ZW4gZnJvbSBkaWZmZXJlbnQgdGFza3MpLCBhcyBzaG93biBpbiBmaWd1cmUgMy4gQXMgc3VjaCwgaWYgdGhlIHVzZXIgbmF2aWdhdGVzIGJhY2t3YXJkCit1c2luZyB0aGUgQkFDSyBrZXksIGVhY2ggaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IGlzIHJldmVhbGVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgb3BlbmVkIChlYWNoCit3aXRoIHRoZWlyIG93biBVSSBzdGF0ZSkuIEhvd2V2ZXIsIHlvdSBjYW4gbW9kaWZ5IHRoaXMgYmVoYXZpb3IgaWYgeW91IGRvIG5vdCB3YW50IGFuIGFjdGl2aXR5IHRvIGJlCitpbnN0YW50aWF0ZWQgbW9yZSB0aGFuIG9uY2UuIEhvdyB0byBkbyBzbyBpcyBkaXNjdXNzZWQgaW4gdGhlIGxhdGVyIHNlY3Rpb24gYWJvdXQgPGEKK2hyZWY9IiNNYW5hZ2luZ1Rhc2tzIj5NYW5hZ2luZyBUYXNrczwvYT4uPC9wPgorCisKKzxwPlRvIHN1bW1hcml6ZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYWN0aXZpdGllcyBhbmQgdGFza3M6PC9wPgorCis8dWw+CisgIDxsaT5XaGVuIEFjdGl2aXR5IEEgc3RhcnRzIEFjdGl2aXR5IEIsIEFjdGl2aXR5IEEgaXMgc3RvcHBlZCwgYnV0IHRoZSBzeXN0ZW0gcmV0YWlucyBpdHMgc3RhdGUKKyhzdWNoIGFzIHNjcm9sbCBwb3NpdGlvbiBhbmQgdGV4dCBlbnRlcmVkIGludG8gZm9ybXMpLgorSWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgQkFDSyBrZXkgd2hpbGUgaW4gQWN0aXZpdHkgQiwgQWN0aXZpdHkgQSByZXN1bWVzIHdpdGggaXRzIHN0YXRlCityZXN0b3JlZC48L2xpPgorICA8bGk+V2hlbiB0aGUgdXNlciBsZWF2ZXMgYSB0YXNrIGJ5IHByZXNzaW5nIHRoZSBIT01FIGtleSwgdGhlIGN1cnJlbnQgYWN0aXZpdHkgaXMgc3RvcHBlZCBhbmQKK2l0cyB0YXNrIGdvZXMgaW50byB0aGUgYmFja2dyb3VuZC4gVGhlIHN5c3RlbSByZXRhaW5zIHRoZSBzdGF0ZSBvZiBldmVyeSBhY3Rpdml0eSBpbiB0aGUgdGFzay4gSWYKK3RoZSB1c2VyIGxhdGVyIHJlc3VtZXMgdGhlIHRhc2sgYnkgc2VsZWN0aW5nIHRoZSBsYXVuY2hlciBpY29uIHRoYXQgYmVnYW4gdGhlIHRhc2ssIHRoZSB0YXNrIGNvbWVzCit0byB0aGUgZm9yZWdyb3VuZCBhbmQgcmVzdW1lcyB0aGUgYWN0aXZpdHkgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suPC9saT4KKyAgPGxpPklmIHRoZSB1c2VyIHByZXNzZXMgdGhlIEJBQ0sga2V5LCB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBwb3BwZWQgZnJvbSB0aGUgc3RhY2sgYW5kCitkZXN0cm95ZWQuIFRoZSBwcmV2aW91cyBhY3Rpdml0eSBpbiB0aGUgc3RhY2sgaXMgcmVzdW1lZC4gV2hlbiBhbiBhY3Rpdml0eSBpcyBkZXN0cm95ZWQsIHRoZSBzeXN0ZW0KKzxlbT5kb2VzIG5vdDwvZW0+IHJldGFpbiB0aGUgYWN0aXZpdHkncyBzdGF0ZS48L2xpPgorICA8bGk+QWN0aXZpdGllcyBjYW4gYmUgaW5zdGFudGlhdGVkIG11bHRpcGxlIHRpbWVzLCBldmVuIGZyb20gb3RoZXIgdGFza3MuPC9saT4KKzwvdWw+CisKKworPGgyIGlkPSJBY3Rpdml0eVN0YXRlIj5TYXZpbmcgQWN0aXZpdHkgU3RhdGU8L2gyPgorCis8cD5BcyBkaXNjdXNzZWQgYWJvdmUsIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJlaGF2aW9yIHByZXNlcnZlcyB0aGUgc3RhdGUgb2YgYW4gYWN0aXZpdHkgd2hlbiBpdCBpcworc3RvcHBlZC4gVGhpcyB3YXksIHdoZW4gdXNlcnMgbmF2aWdhdGUgYmFjayB0byBhIHByZXZpb3VzIGFjdGl2aXR5LCBpdHMgdXNlciBpbnRlcmZhY2UgYXBwZWFycwordGhlIHdheSB0aGV5IGxlZnQgaXQuIEhvd2V2ZXIsIHlvdSBjYW4mbWRhc2g7YW5kIDxzdHJvbmc+c2hvdWxkPC9zdHJvbmc+Jm1kYXNoO3Byb2FjdGl2ZWx5IHJldGFpbgordGhlIHN0YXRlIG9mIHlvdXIgYWN0aXZpdGllcyB1c2luZyBjYWxsYmFjayBtZXRob2RzLCBpbiBjYXNlIHRoZSBhY3Rpdml0eSBpcyBkZXN0cm95ZWQgYW5kIG11c3QKK2JlIHJlY3JlYXRlZC48L3A+CisKKzxwPldoZW4gdGhlIHN5c3RlbSBzdG9wcyBvbmUgb2YgeW91ciBhY3Rpdml0aWVzIChzdWNoIGFzIHdoZW4gYSBuZXcgYWN0aXZpdHkgc3RhcnRzIG9yIHRoZSB0YXNrCittb3ZlcyB0byB0aGUgYmFja2dyb3VuZCksIHRoZSBzeXN0ZW0gbWlnaHQgZGVzdHJveSB0aGF0IGFjdGl2aXR5IGNvbXBsZXRlbHkgaWYgaXQgbmVlZHMgdG8gcmVjb3Zlcgorc3lzdGVtIG1lbW9yeS4gV2hlbiB0aGlzIGhhcHBlbnMsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3Rpdml0eSBzdGF0ZSBpcyBsb3N0LiBJZiB0aGlzIGhhcHBlbnMsIHRoZQorc3lzdGVtIHN0aWxsCitrbm93cyB0aGF0IHRoZSBhY3Rpdml0eSBoYXMgYSBwbGFjZSBpbiB0aGUgYmFjayBzdGFjaywgYnV0IHdoZW4gdGhlIGFjdGl2aXR5IGlzIGJyb3VnaHQgdG8gdGhlCit0b3Agb2YgdGhlIHN0YWNrIHRoZSBzeXN0ZW0gbXVzdCByZWNyZWF0ZSBpdCAocmF0aGVyIHRoYW4gcmVzdW1lIGl0KS4gSW4gb3JkZXIgdG8KK2F2b2lkIGxvb3NpbmcgdGhlIHVzZXIncyB3b3JrLCB5b3Ugc2hvdWxkIHByb2FjdGl2ZWx5IHJldGFpbiBpdCBieSBpbXBsZW1lbnRpbmcgdGhlIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZSBvblNhdmVJbnN0YW5jZVN0YXRlKCl9IGNhbGxiYWNrCittZXRob2RzIGluIHlvdXIgYWN0aXZpdHkuPC9wPgorCis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gc2F2ZSB5b3VyIGFjdGl2aXR5IHN0YXRlLCBzZWUgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9hY3Rpdml0aWVzLmh0bWwjU2F2aW5nQWN0aXZpdHlTdGF0ZSI+QWN0aXZpdGllczwvYT4KK2RvY3VtZW50LjwvcD4KKworCisKKzxoMiBpZD0iTWFuYWdpbmdUYXNrcyI+TWFuYWdpbmcgVGFza3M8L2gyPgorCis8cD5UaGUgd2F5IEFuZHJvaWQgbWFuYWdlcyB0YXNrcyBhbmQgdGhlIGJhY2sgc3RhY2ssIGFzIGRlc2NyaWJlZCBhYm92ZSZtZGFzaDtieSBwbGFjaW5nIGFsbAorYWN0aXZpdGllcyBzdGFydGVkIGluIHN1Y2Nlc3Npb24gaW4gdGhlIHNhbWUgdGFzayBhbmQgaW4gYSAibGFzdCBpbiwgZmlyc3Qgb3V0IiBzdGFjayZtZGFzaDt3b3JrcworZ3JlYXQgZm9yIG1vc3QgYXBwbGljYXRpb25zIGFuZCB5b3Ugc2hvdWxkbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaG93IHlvdXIgYWN0aXZpdGllcyBhcmUgYXNzb2NpYXRlZAord2l0aCB0YXNrcyBvciBob3cgdGhleSBleGlzdCBpbiB0aGUgYmFjayBzdGFjay4gSG93ZXZlciwgeW91IG1pZ2h0IGRlY2lkZSB0aGF0IHlvdSB3YW50IHRvIGludGVycnVwdAordGhlIG5vcm1hbCBiZWhhdmlvci4gUGVyaGFwcyB5b3Ugd2FudCBhbiBhY3Rpdml0eSBpbiB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlZ2luIGEgbmV3IHRhc2sgd2hlbiBpdCBpcworc3RhcnRlZCAoaW5zdGVhZCBvZiBiZWluZyBwbGFjZWQgd2l0aGluIHRoZSBjdXJyZW50IHRhc2spOyBvciwgd2hlbiB5b3Ugc3RhcnQgYW4gYWN0aXZpdHksIHlvdSB3YW50Cit0byBicmluZyBmb3J3YXJkIGFuIGV4aXN0aW5nIGluc3RhbmNlIG9mIGl0IChpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3CitpbnN0YW5jZSBvbiB0b3Agb2YgdGhlIGJhY2sgc3RhY2spOyBvciwgeW91IHdhbnQgeW91ciBiYWNrIHN0YWNrIHRvIGJlIGNsZWFyZWQgb2YgYWxsCithY3Rpdml0aWVzc3RhcnQgYW4gYWN0aXZpdHkgZXhjZXB0IGZvciB0aGUgcm9vdCBhY3Rpdml0eSB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgdGFzay48L3A+CisKKzxwPllvdSBjYW4gZG8gdGhlc2UgdGhpbmdzIGFuZCBtb3JlLCB3aXRoIGF0dHJpYnV0ZXMgaW4gdGhlCis8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlCismbHQ7YWN0aXZpdHkmZ3Q7fTwvYT4gbWFuaWZlc3QgZWxlbWVudCBhbmQgd2l0aCBmbGFncyBpbiB0aGUgaW50ZW50IHRoYXQgeW91IHBhc3MgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNzdGFydEFjdGl2aXR5IHN0YXJ0QWN0aXZpdHkoKX0uPC9wPgorCis8cD5JbiB0aGlzIHJlZ2FyZCwgdGhlIHRoZSBwcmluY2lwYWwgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sIj57QGNvZGUgJmx0O2FjdGl2aXR5Jmd0O308L2E+CithdHRyaWJ1dGVzIHlvdSBjYW4gdXNlIGFyZTo8L3A+CisKKzx1bCBjbGFzcz0ibm9saXN0Ij4KKyAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2FmZiI+e0Bjb2RlCit0YXNrQWZmaW5pdHl9PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNsbW9kZSI+e0Bjb2RlCitsYXVuY2hNb2RlfTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjcmVwYXJlbnQiPntAY29kZQorYWxsb3dUYXNrUmVwYXJlbnRpbmd9PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNjbGVhciI+e0Bjb2RlCitjbGVhclRhc2tPbkxhdW5jaH08L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2Fsd2F5cyI+e0Bjb2RlCithbHdheXNSZXRhaW5UYXNrU3RhdGV9PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNmaW5pc2giPntAY29kZQorZmluaXNoT25UYXNrTGF1bmNofTwvYT48L2xpPgorPC91bD4KKworPHA+QW5kIHRoZSBwcmluY2lwYWwgaW50ZW50IGZsYWdzIHlvdSBjYW4gdXNlIGFyZTo8L3A+CisKKzx1bCBjbGFzcz0ibm9saXN0Ij4KKyAgPGxpPntAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0ZMQUdfQUNUSVZJVFlfTkVXX1RBU0t9PC9saT4KKyAgPGxpPntAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0ZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QfTwvbGk+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNGTEFHX0FDVElWSVRZX1NJTkdMRV9UT1B9PC9saT4KKzwvdWw+CisKKzxwPkluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMsIHlvdSdsbCBzZWUgaG93IHlvdSBjYW4gdXNlIHRoZXNlIG1hbmlmZXN0IGF0dHJpYnV0ZXMgYW5kIGludGVudAorZmxhZ3MgdG8gZGVmaW5lIGhvdyBhY3Rpdml0aWVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGFza3MgYW5kIGhvdyB0aGUgYmVoYXZlIGluIHRoZSBiYWNrIHN0YWNrLjwvcD4KKworCis8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBNb3N0IGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IGludGVycnVwdCB0aGUgZGVmYXVsdAorYmVoYXZpb3IgZm9yIGFjdGl2aXRpZXMgYW5kIHRhc2tzLiBJZiB5b3UgZGV0ZXJtaW5lIHRoYXQgaXQncyBuZWNlc3NhcnkgZm9yIHlvdXIgYWN0aXZpdHkgdG8gbW9kaWZ5Cit0aGUgZGVmYXVsdCBiZWhhdmlvcnMsIHVzZSBjYXV0aW9uIGFuZCBiZSBzdXJlIHRvIHRlc3QgdGhlIHVzYWJpbGl0eSBvZiB0aGUgYWN0aXZpdHkgZHVyaW5nCitsYXVuY2ggYW5kIHdoZW4gbmF2aWdhdGluZyBiYWNrIHRvIGl0IGZyb20gb3RoZXIgYWN0aXZpdGllcyBhbmQgdGFza3Mgd2l0aCB0aGUgQkFDSyBrZXkuIEJlIHN1cmUgCit0byB0ZXN0IGZvciBuYXZpZ2F0aW9uIGJlaGF2aW9ycyB0aGF0IG1pZ2h0IGNvbmZsaWN0IHdpdGggdGhlIHVzZXIncyBleHBlY3RlZCBiZWhhdmlvci48L3A+CisKKworPGgzIGlkPSJUYXNrTGF1bmNoTW9kZXMiPkRlZmluaW5nIGxhdW5jaCBtb2RlczwvaDM+CisKKzxwPkxhdW5jaCBtb2RlcyBhbGxvdyB5b3UgdG8gZGVmaW5lIGhvdyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBhY3Rpdml0eSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCitjdXJyZW50IHRhc2suIFlvdSBjYW4gZGVmaW5lIGRpZmZlcmVudCBsYXVuY2ggbW9kZXMgaW4gdHdvIHdheXM6PC9wPgorPHVsIGNsYXNzPSJub2xpc3QiPgorICA8bGk+PGEgaHJlZj0iI01hbmlmZXN0Rm9yVGFza3MiPlVzaW5nIHRoZSBtYW5pZmVzdCBmaWxlPC9hPgorICAgIDxwPldoZW4geW91IGRlY2xhcmUgYW4gYWN0aXZpdHkgaW4geW91ciBtYW5pZmVzdCBmaWxlLCB5b3UgY2FuIHNwZWNpZnkgaG93IHRoZSBhY3Rpdml0eQorc2hvdWxkIGFzc29jaWF0ZSB3aXRoIHRhc2tzIHdoZW4gaXQgc3RhcnRzLjwvbGk+CisgIDxsaT48YSBocmVmPSIjSW50ZW50RmxhZ3NGb3JUYXNrcyI+VXNpbmcgSW50ZW50IGZsYWdzPC9hPgorICAgIDxwPldoZW4geW91IGNhbGwge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkgc3RhcnRBY3Rpdml0eSgpfSwKK3lvdSBjYW4gaW5jbHVkZSBhIGZsYWcgaW4gdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50fSB0aGF0IGRlY2xhcmVzIGhvdyAob3IKK3doZXRoZXIpIHRoZSBuZXcgYWN0aXZpdHkgc2hvdWxkIGFzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IHRhc2suPC9wPjwvbGk+Cis8L3VsPgorCis8cD5BcyBzdWNoLCBpZiBBY3Rpdml0eSBBIHN0YXJ0cyBBY3Rpdml0eSBCLCBBY3Rpdml0eSBCIGNhbiBkZWZpbmUgaW4gaXRzIG1hbmlmZXN0IGhvdyBpdAorc2hvdWxkIGFzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IHRhc2sgKGlmIGF0IGFsbCkgYW5kIEFjdGl2aXR5IEEgY2FuIGFsc28gcmVxdWVzdCBob3cgQWN0aXZpdHkKK0Igc2hvdWxkIGFzc29jaWF0ZSB3aXRoIGN1cnJlbnQgdGFzay4gSWYgYm90aCBhY3Rpdml0aWVzIGRlZmluZSBob3cgQWN0aXZpdHkgQgorc2hvdWxkIGFzc29jaWF0ZSB3aXRoIGEgdGFzaywgdGhlbiBBY3Rpdml0eSBBJ3MgcmVxdWVzdCAoYXMgZGVmaW5lZCBpbiB0aGUgaW50ZW50KSBpcyBob25vcmVkCitvdmVyIEFjdGl2aXR5IEIncyByZXF1ZXN0IChhcyBkZWZpbmVkIGluIGl0cyBtYW5pZmVzdCkuPC9wPgorCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBTb21lIHRoZSBsYXVuY2ggbW9kZXMgYXZhaWxhYmxlIGluIHRoZSBtYW5pZmVzdAorYXJlIG5vdCBhdmFpbGFibGUgYXMgZmxhZ3MgZm9yIGFuIGludGVudCBhbmQsIGxpa2V3aXNlLCBzb21lIGxhdW5jaCBtb2RlcyBhdmFpbGFibGUgYXMgZmxhZ3MKK2ZvciBhbiBpbnRlbnQgY2Fubm90IGJlIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0LjwvcD4KKworCis8aDQgaWQ9Ik1hbmlmZXN0Rm9yVGFza3MiPlVzaW5nIHRoZSBtYW5pZmVzdCBmaWxlPC9oND4KKworPHA+V2hlbiBkZWNsYXJpbmcgYW4gYWN0aXZpdHkgaW4geW91ciBtYW5pZmVzdCBmaWxlLCB5b3UgY2FuIHNwZWNpZnkgaG93IHRoZSBhY3Rpdml0eSBzaG91bGQKK2Fzc29jaWF0ZSB3aXRoIGEgdGFzayB1c2luZyB0aGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sIj57QGNvZGUgJmx0O2FjdGl2aXR5Jmd0O308L2E+CitlbGVtZW50J3MgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjbG1vZGUiPntAY29kZQorbGF1bmNoTW9kZX08L2E+IGF0dHJpYnV0ZS48L3A+CisKKzxwPlRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNsbW9kZSI+e0Bjb2RlCitsYXVuY2hNb2RlfTwvYT4gYXR0cmlidXRlIHNwZWNpZmllcyBhbiBpbnN0cnVjdGlvbiBvbiBob3cgdGhlIGFjdGl2aXR5IHNob3VsZCBiZSBsYXVuY2hlZCBpbnRvIGEKK3Rhc2suIFRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCBsYXVuY2ggbW9kZXMgeW91IGNhbiBhc3NpZ24gdG8gdGhlCis8Y29kZT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNsbW9kZSI+bGF1bmNoTW9kZTwvYT48L2NvZGU+CithdHRyaWJ1dGU6PC9wPgorCis8ZGw+Cis8ZHQ+e0Bjb2RlICJzdGFuZGFyZCJ9ICh0aGUgZGVmYXVsdCBtb2RlKTwvZHQ+CisgIDxkZD5EZWZhdWx0LiBUaGUgc3lzdGVtIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IGluIHRoZSB0YXNrIGZyb20KK3doaWNoIGl0IHdhcyBzdGFydGVkIGFuZCByb3V0ZXMgdGhlIGludGVudCB0byBpdC4gVGhlIGFjdGl2aXR5IGNhbiBiZSBpbnN0YW50aWF0ZWQgbXVsdGlwbGUgdGltZXMsCitlYWNoIGluc3RhbmNlIGNhbiBiZWxvbmcgdG8gZGlmZmVyZW50IHRhc2tzLCBhbmQgb25lIHRhc2sgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzLjwvZGQ+Cis8ZHQ+e0Bjb2RlICJzaW5nbGVUb3AifTwvZHQ+CisgIDxkZD5JZiBhbiBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHRvcCBvZiB0aGUgY3VycmVudCB0YXNrLCB0aGUgc3lzdGVtCityb3V0ZXMgdGhlIGludGVudCB0byB0aGF0IGluc3RhbmNlIHRocm91Z2ggYSBjYWxsIHRvIGl0cyB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uTmV3SW50ZW50IG9uTmV3SW50ZW50KCl9IG1ldGhvZCwgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlCithY3Rpdml0eS4gVGhlIGFjdGl2aXR5IGNhbiBiZSBpbnN0YW50aWF0ZWQgbXVsdGlwbGUgdGltZXMsIGVhY2ggaW5zdGFuY2UgY2FuCitiZWxvbmcgdG8gZGlmZmVyZW50IHRhc2tzLCBhbmQgb25lIHRhc2sgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIChidXQgb25seSBpZiB0aGUgdGhlCithY3Rpdml0eSBhdCB0aGUgdG9wIG9mIHRoZSBiYWNrIHN0YWNrIGlzIDxlbT5ub3Q8L2VtPiBhbiBleGlzdGluZyBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkpLgorICA8cD5Gb3IgZXhhbXBsZSwgc3VwcG9zZSBhIHRhc2sncyBiYWNrIHN0YWNrIGNvbnNpc3RzIG9mIHJvb3QgYWN0aXZpdHkgQSB3aXRoIGFjdGl2aXRpZXMgQiwgQywKK2FuZCBEIG9uIHRvcCAodGhlIHN0YWNrIGlzIEEtQi1DLUQ7IEQgaXMgb24gdG9wKS4gQW4gaW50ZW50IGFycml2ZXMgZm9yIGFuIGFjdGl2aXR5IG9mIHR5cGUgRC4KK0lmIEQgaGFzIHRoZSBkZWZhdWx0IHtAY29kZSAic3RhbmRhcmQifSBsYXVuY2ggbW9kZSwgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGlzIGxhdW5jaGVkIGFuZCB0aGUKK3N0YWNrIGJlY29tZXMgQS1CLUMtRC1ELiBIb3dldmVyLCBpZiBEJ3MgbGF1bmNoIG1vZGUgaXMge0Bjb2RlICJzaW5nbGVUb3AifSwgdGhlIGV4aXN0aW5nIGluc3RhbmNlCitvZiBEIGlzIGRlbGl2ZXJkIHRoZSBpbnRlbnQgdGhyb3VnaCB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uTmV3SW50ZW50IG9uTmV3SW50ZW50KCl9LCBiZWNhdXNlIGl0J3MgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2smbWRhc2g7dGhlCitzdGFjayByZW1haW5zIEEtQi1DLUQuIEhvd2V2ZXIsIGlmIGFuIGludGVudCBhcnJpdmVzIGZvciBhbiBhY3Rpdml0eSBvZiB0eXBlIEIsIHRoZW4gYSBuZXcKK2luc3RhbmNlIG9mIEIgaXMgYWRkZWQgdG8gdGhlIHN0YWNrLCBldmVuIGlmIGl0cyBsYXVuY2ggbW9kZSBpcyB7QGNvZGUgInNpbmdsZVRvcCJ9LjwvcD4KKyAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gV2hlbiBhIG5ldyBpbnN0YW5jZSBvZiBhbiBhY3Rpdml0eSBpcyBjcmVhdGVkLAordGhlIHVzZXIgY2FuIHByZXNzIHRoZSBCQUNLIGtleSB0byByZXR1cm4gdG8gdGhlIHByZXZpb3VzIGFjdGl2aXR5LiBCdXQgd2hlbiBhbiBleGlzdGluZyBpbnN0YW5jZSBvZgorYW4gYWN0aXZpdHkgaGFuZGxlcyBhIG5ldyBpbnRlbnQsIHRoZSB1c2VyIGNhbm5vdCBwcmVzcyB0aGUgQkFDSyBrZXkgdG8gcmV0dXJuIHRvIHRoZSBzdGF0ZSBvZgordGhlIGFjdGl2aXR5IGJlZm9yZSB0aGUgbmV3IGludGVudCBhcnJpdmVkIGluIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbk5ld0ludGVudAorb25OZXdJbnRlbnQoKX0uPC9wPgorPC9kZD4KKworPGR0PntAY29kZSAic2luZ2xlVGFzayJ9PC9kdD4KKyAgPGRkPlRoZSBzeXN0ZW0gY3JlYXRlcyBhIG5ldyB0YXNrIGFuZCBpbnN0YW50aWF0ZXMgdGhlIGFjdGl2aXR5IGF0IHRoZSByb290IG9mIHRoZSBuZXcgdGFzay4KK0hvd2V2ZXIsIGlmIGFuIGluc3RhbmNlIG9mIHRoZSBhY3Rpdml0eSBhbHJlYWR5IGV4aXN0cyBpbiBhIHNlcGFyYXRlIHRhc2ssIHRoZSBzeXN0ZW0gcm91dGVzIHRoZQoraW50ZW50IHRvIHRoZSBleGlzdGluZyBpbnN0YW5jZSB0aHJvdWdoIGEgY2FsbCB0byBpdHMge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbk5ld0ludGVudCBvbk5ld0ludGVudCgpfSBtZXRob2QsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlLiBPbmx5CitvbmUgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IGNhbiBleGlzdCBhdCBhIHRpbWUuCisgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEFsdGhvdWdoIHRoZSBhY3Rpdml0eSBzdGFydHMgaW4gYSBuZXcgdGFzaywgdGhlCitCQUNLIGtleSBzdGlsbCByZXR1cm5zIHRoZSB1c2VyIHRvIHRoZSBwcmV2aW91cyBhY3Rpdml0eS48L3A+PC9kZD4KKzxkdD57QGNvZGUgInNpbmdsZUluc3RhbmNlIn0uPC9kdD4KKyAgPGRkPlNhbWUgYXMge0Bjb2RlICJzaW5nbGVUYXNrIn0sIGV4Y2VwdCB0aGF0IHRoZSBzeXN0ZW0gZG9lc24ndCBsYXVuY2ggYW55IG90aGVyIGFjdGl2aXRpZXMgaW50bwordGhlIHRhc2sgaG9sZGluZyB0aGUgaW5zdGFuY2UuIFRoZSBhY3Rpdml0eSBpcyBhbHdheXMgdGhlIHNpbmdsZSBhbmQgb25seSBtZW1iZXIgb2YgaXRzIHRhc2s7CithbnkgYWN0aXZpdGllcyBzdGFydGVkIGJ5IHRoaXMgb25lIG9wZW4gaW4gYSBzZXBhcmF0ZSB0YXNrLjwvZGQ+Cis8L2RsPgorCisKKzxwPkFzIGFub3RoZXIgZXhhbXBsZSwgdGhlIEFuZHJvaWQgQnJvd3NlciBhcHBsaWNhdGlvbiBkZWNsYXJlcyB0aGF0IHRoZSB3ZWIgYnJvd3NlciBhY3Rpdml0eSBzaG91bGQKK2Fsd2F5cyBvcGVuIGluIGl0cyBvd24gdGFzayZtZGFzaDtieSBzcGVjaWZ5aW5nIHRoZSB7QGNvZGUgc2luZ2xlVGFza30gbGF1bmNoIG1vZGUgaW4gdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDthY3Rpdml0eSZndDt9PC9hPiBlbGVtZW50LgorVGhpcyBtZWFucyB0aGF0IGlmIHlvdXIgYXBwbGljYXRpb24gaXNzdWVzIGFuCitpbnRlbnQgdG8gb3BlbiB0aGUgQW5kcm9pZCBCcm93c2VyLCBpdHMgYWN0aXZpdHkgaXMgPGVtPm5vdDwvZW0+IHBsYWNlZCBpbiB0aGUgc2FtZQordGFzayBhcyB5b3VyIGFwcGxpY2F0aW9uLiBJbnN0ZWFkLCBlaXRoZXIgYSBuZXcgdGFzayBzdGFydHMgZm9yIHRoZSBCcm93c2VyIG9yLCBpZiB0aGUgQnJvd3NlcgorYWxyZWFkeSBoYXMgYSB0YXNrIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQsIHRoYXQgdGFzayBpcyBicm91Z2h0IGZvcndhcmQgdG8gaGFuZGxlIHRoZSBuZXcKK2ludGVudC48L3A+CisKKzxwPlJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbiBhY3Rpdml0eSBzdGFydHMgaW4gYSBuZXcgdGFzayBvciBpbiB0aGUgc2FtZSB0YXNrIGFzIHRoZSBhY3Rpdml0eSB0aGF0CitzdGFydGVkIGl0LCB0aGUgQkFDSyBrZXkgYWx3YXlzIHRha2VzIHRoZSB1c2VyIHRvIHRoZSBwcmV2aW91cyBhY3Rpdml0eS4gSG93ZXZlciwgaWYgeW91CitzdGFydCBhbiBhY3Rpdml0eSBmcm9tIHlvdXIgdGFzayAoVGFzayBBKSB0aGF0IHNwZWNpZmllcyB0aGUge0Bjb2RlIHNpbmdsZVRhc2t9IGxhdW5jaCBtb2RlLCB0aGVuCit0aGF0IGFjdGl2aXR5IG1pZ2h0IGhhdmUgYW4gaW5zdGFuY2UgaW4gdGhlIGJhY2tncm91bmQgdGhhdCBiZWxvbmdzIHRvIGEgdGFzayB3aXRoIGl0cyBvd24gYmFjaworc3RhY2sgKFRhc2sgQikuIEluIHRoaXMKK2Nhc2UsIHdoZW4gVGFzayBCIGlzIGJyb3VnaHQgZm9yd2FyZCB0byBoYW5kbGUgYSBuZXcgaW50ZW50LCB0aGUgQkFDSyBrZXkgZmlyc3QgbmF2aWdhdGVzCitiYWNrd2FyZCB0aHJvdWdoIHRoZSBhY3Rpdml0aWVzIGluIFRhc2sgQiBiZWZvcmUgcmV0dXJuaW5nIHRvCit0aGUgdG9wLW1vc3QgYWN0aXZpdHkgaW4gVGFzayBBLiBGaWd1cmUgNCB2aXN1YWxpemVzIHRoaXMgdHlwZSBvZiBzY2VuYXJpby48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX2JhY2tzdGFja19zaW5nbGV0YXNrX211bHRpYWN0aXZpdHkucG5nIiBhbHQ9IiIgLz4KKzxwIGNsYXNzPSJpbWctY2FwdGlvbiI+PHN0cm9uZz5GaWd1cmUgNC48L3N0cm9uZz4gQSByZXByZXNlbnRhdGlvbiBvZiBob3cgYW4gYWN0aXZpdHkgd2l0aAorbGF1bmNoIG1vZGUgInNpbmdsZVRhc2siIGlzIGFkZGVkIHRvIHRoZSBiYWNrIHN0YWNrLiBJZiB0aGUgYWN0aXZpdHkgaXMgYWxyZWFkeSBhIHBhcnQgb2YgYQorYmFja2dyb3VuZCB0YXNrIHdpdGggaXRzIG93biBiYWNrIHN0YWNrIChUYXNrIEIpLCB0aGVuIHRoZSBlbnRpcmUgYmFjayBzdGFjayBhbHNvIGNvbWVzCitmb3J3YXJkLCBvbiB0b3Agb2YgdGhlIGN1cnJlbnQgdGFzayAoVGFzayBBKS48L3A+CisKKzxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIGxhdW5jaCBtb2RlcyBpbiB0aGUgbWFuaWZlc3QgZmlsZSwgc2VlIHRoZQorPGNvZGU+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwiPiZsdDthY3Rpdml0eSZndDs8L2E+PC9jb2RlPgorZWxlbWVudCBkb2N1bWVudGF0aW9uLCB3aGVyZSB0aGUge0Bjb2RlIGxhdW5jaE1vZGV9IGF0dHJpYnV0ZSBhbmQgdGhlIGFjY2VwdGVkIHZhbHVlcyBhcmUKK2Rpc2N1c3NlZCBtb3JlLjwvcD4KKworPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGJlaGF2aW9ycyB0aGF0IHlvdSBzcGVjaWZ5IGZvciB5b3VyIGFjdGl2aXR5IHdpdGggdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNsbW9kZSI+e0Bjb2RlIGxhdW5jaE1vZGV9PC9hPiBhdHRyaWJ1dGUKK2NhbiBiZSBvdmVycmlkZW4gYnkgZmxhZ3MgaW5jbHVkZWQgd2l0aCB0aGUgaW50ZW50IHRoYXQgc3RhcnQgeW91ciBhY3Rpdml0eSwgYXMgZGlzY3Vzc2VkIGluIHRoZQorbmV4dCBzZWN0aW9uLjwvcD4KKworCisKKzxoNCBpZD0iI0ludGVudEZsYWdzRm9yVGFza3MiPlVzaW5nIEludGVudCBmbGFnczwvaDQ+CisKKzxwPldoZW4gc3RhcnRpbmcgYW4gYWN0aXZpdHksIHlvdSBjYW4gbW9kaWZ5IHRoZSBkZWZhdWx0IGFzc29jaWF0aW9uIG9mIGFuIGFjdGl2aXR5IHRvIGl0cyB0YXNrCitieSBpbmNsdWRpbmcgZmxhZ3MgaW4gdGhlIGludGVudCB0aGF0IHlvdSBkZWxpdmVyIHRvIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjc3RhcnRBY3Rpdml0eSBzdGFydEFjdGl2aXR5KCl9LiBUaGUgZmxhZ3MgeW91IGNhbiB1c2UgdG8gbW9kaWZ5IHRoZQorZGVmYXVsdCBiZWhhdmlvciBhcmU6PC9wPgorCis8cD4KKyAgPGR0PntAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0ZMQUdfQUNUSVZJVFlfTkVXX1RBU0t9PC9kdD4KKyAgICA8ZGQ+U3RhcnQgdGhlIGFjdGl2aXR5IGluIGEgbmV3IHRhc2suIElmIGEgdGFzayBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yIHRoZSBhY3Rpdml0eSB5b3UgYXJlIG5vdworc3RhcnRpbmcsIHRoYXQgdGFzayBpcyBicm91Z2h0IHRvIHRoZSBmb3JlZ3JvdW5kIHdpdGggaXRzIGxhc3Qgc3RhdGUgcmVzdG9yZWQgYW5kIHRoZSBhY3Rpdml0eQorcmVjZWl2ZXMgdGhlIG5ldyBpbnRlbnQgaW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uTmV3SW50ZW50IG9uTmV3SW50ZW50KCl9LiAKKyAgICA8cD5UaGlzIHByb2R1Y2VzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSB7QGNvZGUgInNpbmdsZVRhc2sifSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjbG1vZGUiPntAY29kZSBsYXVuY2hNb2RlfTwvYT4gdmFsdWUsCitkaXNjdXNzZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uPC9wPjwvZGQ+CisgIDxkdD57QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNGTEFHX0FDVElWSVRZX1NJTkdMRV9UT1B9PC9kdD4KKyAgICA8ZGQ+SWYgdGhlIGFjdGl2aXR5IGJlaW5nIHN0YXJ0ZWQgaXMgdGhlIGN1cnJlbnQgYWN0aXZpdHkgKGF0IHRoZSB0b3Agb2YgdGhlIGJhY2sgc3RhY2spLCB0aGVuCit0aGUgZXhpc3RpbmcgaW5zdGFuY2UgcmVjZWl2ZXMgYSBjYWxsIHRvIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbk5ld0ludGVudCBvbk5ld0ludGVudCgpfSwKK2luc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5LgorICAgIDxwPlRoaXMgcHJvZHVjZXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHtAY29kZSAic2luZ2xlVG9wIn0gPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2xtb2RlIj57QGNvZGUgbGF1bmNoTW9kZX08L2E+IHZhbHVlLAorZGlzY3Vzc2VkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLjwvcD48L2RkPgorICA8ZHQ+e0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjRkxBR19BQ1RJVklUWV9DTEVBUl9UT1B9PC9kdD4KKyAgICA8ZGQ+SWYgdGhlIGFjdGl2aXR5IGJlaW5nIHN0YXJ0ZWQgaXMgYWxyZWFkeSBydW5uaW5nIGluIHRoZSBjdXJyZW50IHRhc2ssIHRoZW4gaW5zdGVhZAorb2YgbGF1bmNoaW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoYXQgYWN0aXZpdHksIGFsbCBvZiB0aGUgb3RoZXIgYWN0aXZpdGllcyBvbiB0b3Agb2YgaXQgYXJlCitkZXN0cm95ZWQgYW5kIHRoaXMgaW50ZW50IGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVzdW1lZCBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkgKG5vdyBvbiB0b3ApLAordGhyb3VnaCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25OZXdJbnRlbnQgb25OZXdJbnRlbnQoKX0pLgorICAgIDxwPlRoZXJlIGlzIG5vIHZhbHVlIGZvciB0aGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2xtb2RlIj57QGNvZGUgbGF1bmNoTW9kZX08L2E+CithdHRyaWJ1dGUgdGhhdCBwcm9kdWNlcyB0aGlzIGJlaGF2aW9yLjwvcD4KKyAgICA8cD57QGNvZGUgRkxBR19BQ1RJVklUWV9DTEVBUl9UT1B9IGlzIG1vc3Qgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAY29kZQorRkxBR19BQ1RJVklUWV9ORVdfVEFTS30uICBXaGVuIHVzZWQgdG9nZXRoZXIsIHRoZXNlIGZsYWdzIGFyZSBhIHdheSBvZiBsb2NhdGluZyBhbiBleGlzdGluZyBhY3Rpdml0eQoraW4gYW5vdGhlciB0YXNrIGFuZCBwdXR0aW5nIGl0IGluIGEgcG9zaXRpb24gd2hlcmUgaXQgY2FuIHJlc3BvbmQgdG8gdGhlIGludGVudC4gPC9wPgorICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHRoZSBsYXVuY2ggbW9kZSBvZiB0aGUgZGVzaWduYXRlZCBhY3Rpdml0eSBpcyB7QGNvZGUKKyJzdGFuZGFyZCJ9LCBpdCB0b28gaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGFjayBhbmQgYSBuZXcgaW5zdGFuY2UgaXMgbGF1bmNoZWQgaW4gaXRzIHBsYWNlIHRvIGhhbmRsZQordGhlIGluY29taW5nIGludGVudC4gIFRoYXQncyBiZWNhdXNlIGEgbmV3IGluc3RhbmNlIGlzIGFsd2F5cyBjcmVhdGVkIGZvciBhIG5ldyBpbnRlbnQgd2hlbiB0aGUKK2xhdW5jaCBtb2RlIGlzIHtAY29kZSAic3RhbmRhcmQifS4gPC9wPgorPC9kZD4KKzwvZGw+CisKKworCisKKworPGgzIGlkPSJBZmZpbml0aWVzIj5IYW5kbGluZyBhZmZpbml0aWVzPC9oMz4KKworPHA+VGhlIDxlbT5hZmZpbml0eTwvZW0+IGluZGljYXRlcyB3aGljaCB0YXNrIGFuIGFjdGl2aXR5IHByZWZlcnMgdG8gYmVsb25nIHRvLiBCeSBkZWZhdWx0LCBhbGwgdGhlCithY3Rpdml0aWVzIGZyb20gdGhlIHNhbWUgYXBwbGljYXRpb24gaGF2ZSBhbiBhZmZpbml0eSBmb3IgZWFjaCBvdGhlci4gU28sIGJ5IGRlZmF1bHQsIGFsbAorYWN0aXZpdGllcyBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiBwcmVmZXIgdG8gYmUgaW4gdGhlIHNhbWUgdGFzay4gSG93ZXZlciwgeW91IGNhbiBtb2RpZnkKK3RoZSBkZWZhdWx0IGFmZmluaXR5IGZvciBhbiBhY3Rpdml0eS4gQWN0aXZpdGllcyBkZWZpbmVkIGluCitkaWZmZXJlbnQgYXBwbGljYXRpb25zIGNhbiBzaGFyZSBhbiBhZmZpbml0eSwgb3IgYWN0aXZpdGllcyBkZWZpbmVkIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGNhbiBiZQorYXNzaWduZWQgZGlmZmVyZW50IHRhc2sgYWZmaW5pdGllcy48L3A+CisKKzxwPllvdSBjYW4gbW9kaWZ5IHRoZSBhZmZpbml0eSBmb3IgYW55IGdpdmVuIGFjdGl2aXR5IHdpdGggdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNhZmYiPntAY29kZSB0YXNrQWZmaW5pdHl9PC9hPiBhdHRyaWJ1dGUKK29mIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDthY3Rpdml0eSZndDt9PC9hPgorZWxlbWVudC48L3A+CisKKzxwPlRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjYWZmIj57QGNvZGUgdGFza0FmZmluaXR5fTwvYT4KK2F0dHJpYnV0ZSB0YWtlcyBhIHN0cmluZyB2YWx1ZSwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgZnJvbSB0aGUgZGVmYXVsdCBwYWNrYWdlIG5hbWUKK2RlY2xhcmVkIGluIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCI+e0Bjb2RlCismbHQ7bWFuaWZlc3QmZ3Q7fTwvYT4gZWxlbWVudCwgYmVjYXVzZSB0aGUgc3lzdGVtIHVzZXMgdGhhdCBuYW1lIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IHRhc2sKK2FmZmluaXR5IGZvciB0aGUgYXBwbGljYXRpb24uPC9wPgorCis8cD5UaGUgYWZmaW5pdHkgY29tZXMgaW50byBwbGF5IGluIHR3byBjaXJjdW1zdGFuY2VzOjwvcD4KKzx1bD4KKyAgPGxpPldoZW4gdGhlIGludGVudCB0aGF0IGxhdW5jaGVzIGFuIGFjdGl2aXR5IGNvbnRhaW5zIHRoZSB7QGxpbmsKK2FuZHJvaWQuY29udGVudC5JbnRlbnQjRkxBR19BQ1RJVklUWV9ORVdfVEFTS30gZmxhZy4KKworPHA+QSBuZXcgYWN0aXZpdHkgaXMsIGJ5IGRlZmF1bHQsIGxhdW5jaGVkIGludG8gdGhlIHRhc2sgb2YgdGhlIGFjdGl2aXR5Cit0aGF0IGNhbGxlZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc3RhcnRBY3Rpdml0eSBzdGFydEFjdGl2aXR5KCl9LiBJdCdzIHB1c2hlZCBvbnRvIHRoZSBzYW1lCitiYWNrIHN0YWNrIGFzIHRoZSBjYWxsZXIuICBIb3dldmVyLCBpZiB0aGUgaW50ZW50IHBhc3NlZCB0byB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkgc3RhcnRBY3Rpdml0eSgpfSBjb250YWlucyB0aGUge0BsaW5rCithbmRyb2lkLmNvbnRlbnQuSW50ZW50I0ZMQUdfQUNUSVZJVFlfTkVXX1RBU0t9CitmbGFnLCB0aGUgc3lzdGVtIGxvb2tzIGZvciBhIGRpZmZlcmVudCB0YXNrIHRvIGhvdXNlIHRoZSBuZXcgYWN0aXZpdHkuIE9mdGVuLCBpdCdzIGEgbmV3IHRhc2suIAorSG93ZXZlciwgaXQgZG9lc24ndCBoYXZlIHRvIGJlLiAgSWYgdGhlcmUncyBhbHJlYWR5IGFuIGV4aXN0aW5nIHRhc2sgd2l0aCB0aGUgc2FtZSBhZmZpbml0eSBhcyB0aGUKK25ldyBhY3Rpdml0eSwgdGhlIGFjdGl2aXR5IGlzIGxhdW5jaGVkIGludG8gdGhhdCB0YXNrLiAgSWYgbm90LCBpdCBiZWdpbnMgYSBuZXcgdGFzay48L3A+CisKKzxwPklmIHRoaXMgZmxhZyBjYXVzZXMgYW4gYWN0aXZpdHkgdG8gYmVnaW4gYSBuZXcgdGFzayBhbmQgdGhlIHVzZXIgcHJlc3NlcyB0aGUgSE9NRSBrZXkgdG8gbGVhdmUKK2l0LCB0aGVyZSBtdXN0IGJlIHNvbWUgd2F5IGZvciB0aGUgdXNlciB0byBuYXZpZ2F0ZSBiYWNrIHRvIHRoZSB0YXNrLiBTb21lIGVudGl0aWVzIChzdWNoIGFzIHRoZQorbm90aWZpY2F0aW9uIG1hbmFnZXIpIGFsd2F5cyBzdGFydCBhY3Rpdml0aWVzIGluIGFuIGV4dGVybmFsIHRhc2ssIG5ldmVyIGFzIHBhcnQgb2YgdGhlaXIgb3duLCBzbwordGhleSBhbHdheXMgcHV0IHtAY29kZSBGTEFHX0FDVElWSVRZX05FV19UQVNLfSBpbiB0aGUgaW50ZW50cyB0aGV5IHBhc3MgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNzdGFydEFjdGl2aXR5IHN0YXJ0QWN0aXZpdHkoKX0uICBJZiB5b3UgaGF2ZSBhbiBhY3Rpdml0eSB0aGF0IGNhbiBiZSBpbnZva2VkIGJ5CithbiBleHRlcm5hbCBlbnRpdHkgdGhhdCBtaWdodCB1c2UgdGhpcyBmbGFnLCB0YWtlIGNhcmUgdGhhdCB0aGUgdXNlciBoYXMgYSBpbmRlcGVuZGVudCB3YXkgdG8gZ2V0CitiYWNrIHRvIHRoZSB0YXNrIHRoYXQncyBzdGFydGVkLCBzdWNoIGFzIHdpdGggYSBsYXVuY2hlciBpY29uICh0aGUgcm9vdCBhY3Rpdml0eSBvZiB0aGUgdGFzaworaGFzIGEge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjQ0FURUdPUllfTEFVTkNIRVJ9IGludGVudCBmaWx0ZXI7IHNlZSB0aGUgPGEKK2hyZWY9IiNTdGFydGluZyI+U3RhcnRpbmcgYSB0YXNrPC9hPiBzZWN0aW9uIGJlbG93KS48L3A+Cis8L2xpPgorCisgIDxsaT5XaGVuIGFuIGFjdGl2aXR5IGhhcyBpdHMgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI3JlcGFyZW50Ij57QGNvZGUKK2FsbG93VGFza1JlcGFyZW50aW5nfTwvYT4gYXR0cmlidXRlIHNldCB0byB7QGNvZGUgInRydWUifS4KKyAgPHA+SW4gdGhpcyBjYXNlLCB0aGUgYWN0aXZpdHkgY2FuIG1vdmUgZnJvbSB0aGUgdGFzayBpdCBzdGFydHMgdG8gdGhlIHRhc2sgaXQgaGFzIGFuIGFmZmluaXR5Citmb3IsIHdoZW4gdGhhdCB0YXNrIGNvbWVzIHRvIHRoZSBmb3JlZ3JvdW5kLjwvcD4KKyAgPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhhdCBhbiBhY3Rpdml0eSB0aGF0IHJlcG9ydHMgd2VhdGhlciBjb25kaXRpb25zIGluIHNlbGVjdGVkIGNpdGllcyBpcworZGVmaW5lZCBhcyBwYXJ0IG9mIGEgdHJhdmVsIGFwcGxpY2F0aW9uLiAgSXQgaGFzIHRoZSBzYW1lIGFmZmluaXR5IGFzIG90aGVyIGFjdGl2aXRpZXMgaW4gdGhlIHNhbWUKK2FwcGxpY2F0aW9uICh0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBhZmZpbml0eSkgYW5kIGl0IGFsbG93cyByZS1wYXJlbnRpbmcgd2l0aCB0aGlzIGF0dHJpYnV0ZS4KK1doZW4gb25lIG9mIHlvdXIgYWN0aXZpdGllcyBzdGFydHMgdGhlIHdlYXRoZXIgcmVwb3J0ZXIgYWN0aXZpdHksIGl0IGluaXRpYWxseSBiZWxvbmdzIHRvIHRoZSBzYW1lCit0YXNrIGFzIHlvdXIgYWN0aXZpdHkuIEhvd2V2ZXIsIHdoZW4gdGhlIHRyYXZlbCBhcHBsaWNhdGlvbidzIHRhc2sgY29tZXMgdG8gdGhlIGZvcmVncm91bmQsIHRoZQord2VhdGhlciByZXBvcnRlciBhY3Rpdml0eSBpcyByZWFzc2lnbmVkIHRvIHRoYXQgdGFzayBhbmQgZGlzcGxheWVkIHdpdGhpbiBpdC48L3A+Cis8L2xpPgorPC91bD4KKworPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+VGlwOjwvc3Ryb25nPiBJZiBhbiB7QGNvZGUgLmFwa30gZmlsZSBjb250YWlucyBtb3JlIHRoYW4gb25lICJhcHBsaWNhdGlvbiIKK2Zyb20gdGhlIHVzZXIncyBwb2ludCBvZiB2aWV3LCB5b3UgcHJvYmFibHkgd2FudCB0byB1c2UgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNhZmYiPntAY29kZSB0YXNrQWZmaW5pdHl9PC9hPgorYXR0cmlidXRlIHRvIGFzc2lnbiBkaWZmZXJlbnQgYWZmaW5pdGllcyB0byB0aGUgYWN0aXZpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCAiYXBwbGljYXRpb24iLjwvcD4KKworCisKKzxoMyBpZD0iQ2xlYXJpbmciPkNsZWFyaW5nIHRoZSBiYWNrIHN0YWNrPC9oMz4KKworPHA+SWYgdGhlIHVzZXIgbGVhdmVzIGEgdGFzayBmb3IgYSBsb25nIHRpbWUsIHRoZSBzeXN0ZW0gY2xlYXJzIHRoZSB0YXNrIG9mIGFsbCBhY3Rpdml0aWVzIGV4Y2VwdAordGhlIHJvb3QgYWN0aXZpdHkuICBXaGVuIHRoZSB1c2VyIHJldHVybnMgdG8gdGhlIHRhc2sgYWdhaW4sIG9ubHkgdGhlIHJvb3QgYWN0aXZpdHkgaXMgcmVzdG9yZWQuCitUaGUgc3lzdGVtIGJlaGF2ZXMgdGhpcyB3YXksIGJlY2F1c2UsIGFmdGVyIGFuIGV4dGVuZGVkIGFtb3VudCBvZiB0aW1lLCB1c2VycyBsaWtlbHkgaGF2ZSBhYmFuZG9uZWQKK3doYXQgdGhleSB3ZXJlIGRvaW5nIGJlZm9yZSBhbmQgYXJlIHJldHVybmluZyB0byB0aGUgdGFzayB0byBiZWdpbiBzb21ldGhpbmcgbmV3LiA8L3A+CisKKzxwPlRoZXJlIGFyZSBzb21lIGFjdGl2aXR5IGF0dHJpYnV0ZXMgdGhhdCB5b3UgY2FuIHVzZSB0byBtb2RpZnkgdGhpcyBiZWhhdmlvcjogPC9wPgorCis8ZGw+Cis8ZHQ+PGNvZGU+PGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2Fsd2F5cyI+YWx3YXlzUmV0YWluVGFza1N0YXRlPC9hPjwvY29kZT4KKzwvZHQ+Cis8ZGQ+SWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHtAY29kZSAidHJ1ZSJ9IGluIHRoZSByb290IGFjdGl2aXR5IG9mIGEgdGFzaywKK3RoZSBkZWZhdWx0IGJlaGF2aW9yIGp1c3QgZGVzY3JpYmVkIGRvZXMgbm90IGhhcHBlbi4KK1RoZSB0YXNrIHJldGFpbnMgYWxsIGFjdGl2aXRpZXMgaW4gaXRzIHN0YWNrIGV2ZW4gYWZ0ZXIgYSBsb25nIHBlcmlvZC48L2RkPgorCis8ZHQ+PGNvZGU+PGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2NsZWFyIj5jbGVhclRhc2tPbkxhdW5jaDwvYT48L2NvZGU+PC9kdD4KKzxkZD5JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8ge0Bjb2RlICJ0cnVlIn0gaW4gdGhlIHJvb3QgYWN0aXZpdHkgb2YgYSB0YXNrLAordGhlIHN0YWNrIGlzIGNsZWFyZWQgZG93biB0byB0aGUgcm9vdCBhY3Rpdml0eSB3aGVuZXZlciB0aGUgdXNlciBsZWF2ZXMgdGhlIHRhc2sKK2FuZCByZXR1cm5zIHRvIGl0LiAgSW4gb3RoZXIgd29yZHMsIGl0J3MgdGhlIG9wcG9zaXRlIG9mIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNhbHdheXMiPntAY29kZQorYWx3YXlzUmV0YWluVGFza1N0YXRlfTwvYT4uICBUaGUgdXNlciBhbHdheXMgcmV0dXJucyB0byB0aGUgdGFzayBpbiBpdHMKK2luaXRpYWwgc3RhdGUsIGV2ZW4gYWZ0ZXIgYSBsZWF2aW5nIHRoZSB0YXNrIGZvciBvbmx5IGEgbW9tZW50LjwvZGQ+CisKKzxkdD48Y29kZT48YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjZmluaXNoIj5maW5pc2hPblRhc2tMYXVuY2g8L2E+PC9jb2RlPgorPC9kdD4KKzxkZD5UaGlzIGF0dHJpYnV0ZSBpcyBsaWtlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNjbGVhciI+e0Bjb2RlIGNsZWFyVGFza09uTGF1bmNofTwvYT4sCitidXQgaXQgb3BlcmF0ZXMgb24gYQorc2luZ2xlIGFjdGl2aXR5LCBub3QgYW4gZW50aXJlIHRhc2suICBJdCBjYW4gYWxzbyBjYXVzZSBhbnkgYWN0aXZpdHkgdG8gZ28KK2F3YXksIGluY2x1ZGluZyB0aGUgcm9vdCBhY3Rpdml0eS4gIFdoZW4gaXQncyBzZXQgdG8ge0Bjb2RlICJ0cnVlIn0sIHRoZQorYWN0aXZpdHkgcmVtYWlucyBwYXJ0IG9mIHRoZSB0YXNrIG9ubHkgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGUgdXNlcgorbGVhdmVzIGFuZCB0aGVuIHJldHVybnMgdG8gdGhlIHRhc2ssIGl0IGlzIG5vIGxvbmdlciBwcmVzZW50LjwvZGQ+Cis8L2RsPgorCisKKworCis8aDMgaWQ9IlN0YXJ0aW5nIj5TdGFydGluZyBhIHRhc2s8L2gzPgorCis8cD5Zb3UgY2FuIHNldCB1cCBhbiBhY3Rpdml0eSBhcyB0aGUgZW50cnkgcG9pbnQgZm9yIGEgdGFzayBieSBnaXZpbmcgaXQgYW4gaW50ZW50IGZpbHRlciB3aXRoCit7QGNvZGUgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIn0gYXMgdGhlIHNwZWNpZmllZCBhY3Rpb24gYW5kIHtAY29kZQorImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIn0gYXMgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4gRm9yIGV4YW1wbGU6PC9wPgorCis8cHJlPgorJmx0O2FjdGl2aXR5IC4uLiAmZ3Q7CisgICAgJmx0O2ludGVudC1maWx0ZXIgLi4uICZndDsKKyAgICAgICAgJmx0O2FjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvJmd0OworICAgICAgICAmbHQ7Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLyZndDsKKyAgICAmbHQ7L2ludGVudC1maWx0ZXImZ3Q7CisgICAgLi4uCismbHQ7L2FjdGl2aXR5Jmd0OworPC9wcmU+CisKKzxwPkFuIGludGVudCBmaWx0ZXIgb2YgdGhpcyBraW5kIGNhdXNlcyBhbiBpY29uIGFuZCBsYWJlbCBmb3IgdGhlCithY3Rpdml0eSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGxhdW5jaGVyLCBnaXZpbmcgdXNlcnMgYSB3YXkgdG8gbGF1bmNoIHRoZSBhY3Rpdml0eSBhbmQKK3RvIHJldHVybiB0byB0aGUgdGFzayB0aGF0IGl0IGNyZWF0ZXMgYW55IHRpbWUgYWZ0ZXIgaXQgaGFzIGJlZW4gbGF1bmNoZWQuCis8L3A+CisKKzxwPlRoaXMgc2Vjb25kIGFiaWxpdHkgaXMgaW1wb3J0YW50OiBVc2VycyBtdXN0IGJlIGFibGUgdG8gbGVhdmUgYSB0YXNrIGFuZCB0aGVuIGNvbWUgYmFjayB0byBpdAorbGF0ZXIgdXNpbmcgdGhpcyBhY3Rpdml0eSBsYXVuY2hlci4gIEZvciB0aGlzIHJlYXNvbiwgdGhlIHR3byA8YSBocmVmPSIjTGF1bmNoTW9kZXMiPmxhdW5jaAorbW9kZXM8L2E+IHRoYXQgbWFyayBhY3Rpdml0aWVzIGFzIGFsd2F5cyBpbml0aWF0aW5nIGEgdGFzaywge0Bjb2RlICJzaW5nbGVUYXNrIn0gYW5kICJ7QGNvZGUKKyJzaW5nbGVJbnN0YW5jZSJ9LCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIGFjdGl2aXR5IGhhcyBhbiB7QGxpbmsKK2FuZHJvaWQuY29udGVudC5JbnRlbnQjQUNUSU9OX01BSU59CithbmQgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNDQVRFR09SWV9MQVVOQ0hFUn0KK2ZpbHRlci4gSW1hZ2luZSwgZm9yIGV4YW1wbGUsIHdoYXQgY291bGQgaGFwcGVuIGlmIHRoZSBmaWx0ZXIgaXMgbWlzc2luZzogQW4gaW50ZW50IGxhdW5jaGVzIGEKK3tAY29kZSAic2luZ2xlVGFzayJ9IGFjdGl2aXR5LCBpbml0aWF0aW5nIGEgbmV3IHRhc2ssIGFuZCB0aGUgdXNlciBzcGVuZHMgc29tZSB0aW1lIHdvcmtpbmcgaW4KK3RoYXQgdGFzay4gIFRoZSB1c2VyIHRoZW4gcHJlc3NlcyB0aGUgSE9NRSBrZXkuIFRoZSB0YXNrIGlzIG5vdyBzZW50IHRvIHRoZSBiYWNrZ3JvdW5kIGFuZCBub3QKK3Zpc2libGUuIEJlY2F1c2UgaXQgaXMgbm90IHJlcHJlc2VudGVkIGluIHRoZSBhcHBsaWNhdGlvbiBsYXVuY2hlciwgdGhlIHVzZXIgaGFzIG5vIHdheSB0byByZXR1cm4gdG8KK3RoZSB0YXNrLgorPC9wPgorCis8cD5Gb3IgdGhvc2UgY2FzZXMgd2hlcmUgeW91IGRvbid0IHdhbnQgdGhlIHVzZXIgdG8gYmUgYWJsZSB0byByZXR1cm4gdG8gYW4gYWN0aXZpdHksIHNldCB0aGUKKyAgPGNvZGU+PGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sIj4mbHQ7YWN0aXZpdHkmZ3Q7PC9hPjwvY29kZT4gZWxlbWVudCdzCis8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNmaW5pc2giPntAY29kZQorZmluaXNoT25UYXNrTGF1bmNofTwvYT4gdG8ge0Bjb2RlICJ0cnVlIn0gKHNlZSA8YQoraHJlZj0iI0NsZWFyaW5nIj5DbGVhcmluZyB0aGUgc3RhY2s8L2E+KS48L3A+CisKKworCisKKzxoMj5CZWdpbm5lcidzIFBhdGg8L2gyPgorCis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdXNlIGludGVudHMgdG8KK2FjdGl2YXRlIG90aGVyIGFwcGxpY2F0aW9uIGNvbXBvbmVudHMgYW5kIHB1Ymxpc2ggdGhlIGludGVudHMgdG8gd2hpY2ggeW91ciBjb21wb25lbnRzCityZXNwb25kLCBjb250aW51ZSB3aXRoIHRoZSA8Yj48YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9pbnRlbnRzL2ludGVudHMtZmlsdGVycy5odG1sIj5JbnRlbnRzIGFuZCBJbnRlbnQKK0ZpbHRlcnM8L2E+PC9iPiBkb2N1bWVudC48L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQKaW5kZXggODFjNWQ1NS4uMmRiMzhmMSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5qZApAQCAtMTIsOCArMTIsOCBAQAogICAgIDxkZD5YTUwgcmVzb3VyY2UgdGhhdCBwcm92aWRlcyBhIHNpbmdsZSBzdHJpbmcuPC9kZD4KICAgPGR0PjxhIGhyZWY9IiNTdHJpbmdBcnJheSI+U3RyaW5nIEFycmF5PC9hPjwvZHQ+CiAgICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IHByb3ZpZGVzIGFuIGFycmF5IG9mIHN0cmluZ3MuPC9kZD4KLSAgPGR0PjxhIGhyZWY9IiNQbHVyYWxzIj5QbHVyYWxzPC9hPjwvZHQ+Ci0gICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IGNhcnJpZXMgZGlmZmVyZW50IHN0cmluZ3MgZm9yIGRpZmZlcmVudCBwbHVyYWxpemF0aW9ucworICA8ZHQ+PGEgaHJlZj0iI1BsdXJhbHMiPlF1YW50aXR5IFN0cmluZ3MgKFBsdXJhbHMpPC9hPjwvZHQ+CisgICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IGNhcnJpZXMgZGlmZmVyZW50IHN0cmluZ3MgZm9yIGRpZmZlcmVudCBxdWFudGl0aWVzCiAgICAgb2YgdGhlIHNhbWUgd29yZCBvciBwaHJhc2UuPC9kZD4KIDwvZGw+CiAKQEAgLTIxOCwxMyArMjE4LDMwIEBACiAKIAogCi08aDIgaWQ9IlBsdXJhbHMiPlBsdXJhbHM8L2gyPgorPGgyIGlkPSJQbHVyYWxzIj5RdWFudGl0eSBTdHJpbmdzIChQbHVyYWxzKTwvaDI+CiAKLTxwPkEgcGFpciBvZiBzdHJpbmdzIHRoYXQgZWFjaCBwcm92aWRlIGEgZGlmZmVyZW50IHBsdXJhbCBmb3JtIG9mIHRoZSBzYW1lIHdvcmQgb3IgcGhyYXNlLAotd2hpY2ggeW91IGNhbiBjb2xsZWN0aXZlbHkgcmVmZXJlbmNlIGZyb20gdGhlIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSByZXF1ZXN0IHRoZSBwbHVyYWxzCi1yZXNvdXJjZSB1c2luZyBhIG1ldGhvZCBzdWNoIGFzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyNnZXRRdWFudGl0eVN0cmluZyhpbnQsaW50KQotZ2V0UXVhbnRpdHlTdHJpbmcoKX0sIHlvdSBtdXN0IHBhc3MgYSAiY291bnQiLCB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgcGx1cmFsIGZvcm0geW91Ci1yZXF1aXJlIGFuZCByZXR1cm4gdGhhdCBzdHJpbmcgdG8geW91LjwvcD4KKzxwPkRpZmZlcmVudCBsYW5ndWFnZXMgaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGdyYW1tYXRpY2FsIGFncmVlbWVudCB3aXRoIHF1YW50aXR5LiBJbiBFbmdsaXNoLAorZm9yIGV4YW1wbGUsIHRoZSBxdWFudGl0eSAxIGlzIGEgc3BlY2lhbCBjYXNlLiBXZSB3cml0ZSAiMSBib29rIiwgYnV0IGZvciBhbnkgb3RoZXIgcXVhbnRpdHkgd2UnZAord3JpdGUgIjxpPm48L2k+IGJvb2tzIi4gVGhpcyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHNpbmd1bGFyIGFuZCBwbHVyYWwgaXMgdmVyeSBjb21tb24sIGJ1dCBvdGhlcgorbGFuZ3VhZ2VzIG1ha2UgZmluZXIgZGlzdGluY3Rpb25zLiBUaGUgZnVsbCBzZXQgc3VwcG9ydGVkIGJ5IEFuZHJvaWQgaXMgPGNvZGU+emVybzwvY29kZT4sCis8Y29kZT5vbmU8L2NvZGU+LCA8Y29kZT50d288L2NvZGU+LCA8Y29kZT5mZXc8L2NvZGU+LCA8Y29kZT5tYW55PC9jb2RlPiwgYW5kIDxjb2RlPm90aGVyPC9jb2RlPi4KKworPHA+VGhlIHJ1bGVzIGZvciBkZWNpZGluZyB3aGljaCBjYXNlIHRvIHVzZSBmb3IgYSBnaXZlbiBsYW5ndWFnZSBhbmQgcXVhbnRpdHkgY2FuIGJlIHZlcnkgY29tcGxleCwKK3NvIEFuZHJvaWQgcHJvdmlkZXMgeW91IHdpdGggbWV0aG9kcyBzdWNoIGFzCit7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMjZ2V0UXVhbnRpdHlTdHJpbmcoaW50LGludCkgZ2V0UXVhbnRpdHlTdHJpbmcoKX0gdG8gc2VsZWN0Cit0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UgZm9yIHlvdS4KKworPHA+Tm90ZSB0aGF0IHRoZSBzZWxlY3Rpb24gaXMgbWFkZSBiYXNlZCBvbiBncmFtbWF0aWNhbCBuZWNlc3NpdHkuIEEgc3RyaW5nIGZvciA8Y29kZT56ZXJvPC9jb2RlPgoraW4gRW5nbGlzaCB3aWxsIGJlIGlnbm9yZWQgZXZlbiBpZiB0aGUgcXVhbnRpdHkgaXMgMCwgYmVjYXVzZSAwIGlzbid0IGdyYW1tYXRpY2FsbHkgZGlmZmVyZW50Citmcm9tIDIsIG9yIGFueSBvdGhlciBudW1iZXIgZXhjZXB0IDEgKCJ6ZXJvIGJvb2tzIiwgIm9uZSBib29rIiwgInR3byBib29rcyIsIGV0IGNldGVyYSkuCitEb24ndCBiZSBtaXNsZWQgZWl0aGVyIGJ5IHRoZSBmYWN0IHRoYXQsIHNheSwgPGNvZGU+dHdvPC9jb2RlPiBzb3VuZHMgbGlrZSBpdCBjb3VsZCBvbmx5IGFwcGx5IHRvCit0aGUgcXVhbnRpdHkgMjogYSBsYW5ndWFnZSBtYXkgcmVxdWlyZSB0aGF0IDIsIDEyLCAxMDIgKGV0IGNldGVyYSkgYXJlIGFsbCB0cmVhdGVkIGxpa2Ugb25lCithbm90aGVyIGJ1dCBkaWZmZXJlbnRseSB0byBvdGhlciBxdWFudGl0aWVzLiBSZWx5IG9uIHlvdXIgdHJhbnNsYXRvciB0byBrbm93IHdoYXQgZGlzdGluY3Rpb25zCit0aGVpciBsYW5ndWFnZSBhY3R1YWxseSBpbnNpc3RzIHVwb24uCisKKzxwPkl0J3Mgb2Z0ZW4gcG9zc2libGUgdG8gYXZvaWQgcXVhbnRpdHkgc3RyaW5ncyBieSB1c2luZyBxdWFudGl0eS1uZXV0cmFsIGZvcm11bGF0aW9ucyBzdWNoIGFzCisiQm9va3M6IDEiLiBUaGlzIHdpbGwgbWFrZSB5b3VyIGxpZmUgYW5kIHlvdXIgdHJhbnNsYXRvcnMnIGxpdmVzIGVhc2llciwgaWYgaXQncyBhIHN0eWxlIHRoYXQncworaW4ga2VlcGluZyB3aXRoIHlvdXIgYXBwbGljYXRpb24uCiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEEgcGx1cmFscyBjb2xsZWN0aW9uIGlzIGEgc2ltcGxlIHJlc291cmNlIHRoYXQgaXMKIHJlZmVyZW5jZWQgdXNpbmcgdGhlIHZhbHVlIHByb3ZpZGVkIGluIHRoZSB7QGNvZGUgbmFtZX0gYXR0cmlidXRlIChub3QgdGhlIG5hbWUgb2YgdGhlIFhNTApAQCAtMjUxLDcgKzI2OCw3IEBACiAgICAgJmx0OzxhIGhyZWY9IiNwbHVyYWxzLWVsZW1lbnQiPnBsdXJhbHM8L2E+CiAgICAgICAgIG5hbWU9IjxlbT5wbHVyYWxfbmFtZTwvZW0+Ij4KICAgICAgICAgJmx0OzxhIGhyZWY9IiNwbHVyYWxzLWl0ZW0tZWxlbWVudCI+aXRlbTwvYT4KLSAgICAgICAgICAgIHF1YW50aXR5PVsib25lIiB8ICJvdGhlciJdCisgICAgICAgICAgICBxdWFudGl0eT1bInplcm8iIHwgIm9uZSIgfCAidHdvIiB8ICJmZXciIHwgIm1hbnkiIHwgIm90aGVyIl0KICAgICAgICAgICAgICZndDs8ZW0+dGV4dF9zdHJpbmc8L2VtPiZsdDsvaXRlbT4KICAgICAmbHQ7L3BsdXJhbHM+CiAmbHQ7L3Jlc291cmNlcz4KQEAgLTI4NSwxNiArMzAyLDI3IEBACiAgICAgICA8cCBjbGFzcz0iY2FwcyI+YXR0cmlidXRlczo8L3A+CiAgICAgICA8ZGwgY2xhc3M9ImF0bi1saXN0Ij4KICAgICAgICAgPGR0Pjxjb2RlPnF1YW50aXR5PC9jb2RlPjwvZHQ+Ci0gICAgICAgIDxkZD48ZW0+S2V5d29yZDwvZW0+LiBBIHZhbHVlIGluZGljYXRpbmcgdGhlIGNhc2UgaW4gd2hpY2ggdGhpcyBzdHJpbmcgc2hvdWxkIGJlIHVzZWQuIFZhbGlkCi12YWx1ZXM6CisgICAgICAgIDxkZD48ZW0+S2V5d29yZDwvZW0+LiBBIHZhbHVlIGluZGljYXRpbmcgd2hlbiB0aGlzIHN0cmluZyBzaG91bGQgYmUgdXNlZC4gVmFsaWQKK3ZhbHVlcywgd2l0aCBub24tZXhoYXVzdGl2ZSBleGFtcGxlcyBpbiBwYXJlbnRoZXNlczoKICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICA8dHI+PHRoPlZhbHVlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+CiAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD57QGNvZGUgb25lfTwvdGQ+PHRkPldoZW4gdGhlcmUgaXMgb25lIChhIHNpbmd1bGFyIHN0cmluZykuPC90ZD4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSB6ZXJvfTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mIHRoZSBudW1iZXIgMCAoYXMgaW4gQXJhYmljKS48L3RkPgogICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPntAY29kZSBvdGhlcn08L3RkPjx0ZD5XaGVuIHRoZSBxdWFudGl0eSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIG9uZSAoYSBwbHVyYWwKLXN0cmluZywgYnV0IGFsc28gdXNlZCB3aGVuIHRoZSBjb3VudCBpcyB6ZXJvKS48L3RkPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG9uZX08L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiBudW1iZXJzIGxpa2Ugb25lIChhcyB3aXRoIHRoZSBudW1iZXIgMSBpbiBFbmdsaXNoIGFuZCBtb3N0IG90aGVyIGxhbmd1YWdlczsgaW4gUnVzc2lhbiwgYW55IG51bWJlciBlbmRpbmcgaW4gMSBidXQgbm90IGVuZGluZyBpbiAxMSBpcyBpbiB0aGlzIGNsYXNzKS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSB0d299PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgbnVtYmVycyBsaWtlIHR3byAoYXMgaW4gV2Vsc2gpLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIGZld308L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiAic21hbGwiIG51bWJlcnMgKGFzIHdpdGggMiwgMywgYW5kIDQgaW4gQ3plY2g7IG9yIG51bWJlcnMgZW5kaW5nIDIsIDMsIG9yIDQgYnV0IG5vdCAxMiwgMTMsIG9yIDE0IGluIFBvbGlzaCkuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgbWFueX08L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiAibGFyZ2UiIG51bWJlcnMgKGFzIHdpdGggbnVtYmVycyBlbmRpbmcgMTEtOTkgaW4gTWFsdGVzZSkuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgb3RoZXJ9PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgZG9lcyBub3QgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudCBvZiB0aGUgZ2l2ZW4gcXVhbnRpdHkuPC90ZD4KICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgPC9kZD4KQEAgLTMxNSw2ICszNDMsMTcgQEAKICAgICAmbHQ7L3BsdXJhbHM+CiAmbHQ7L3Jlc291cmNlcz4KIDwvcHJlPgorICAgIDxwPlhNTCBmaWxlIHNhdmVkIGF0IHtAY29kZSByZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sfTo8L3A+Cis8cHJlPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyZsdDtyZXNvdXJjZXM+CisgICAgJmx0O3BsdXJhbHMgbmFtZT0ibnVtYmVyT2ZTb25nc0F2YWlsYWJsZSI+CisgICAgICAgICZsdDtpdGVtIHF1YW50aXR5PSJvbmUiPlpuYWxlemlvbm8gamVkbiYjeDAxMDU7IHBpb3NlbmsmI3gwMTE5Oy4mbHQ7L2l0ZW0+CisgICAgICAgICZsdDtpdGVtIHF1YW50aXR5PSJmZXciPlpuYWxlemlvbm8gJWQgcGlvc2Vua2kuJmx0Oy9pdGVtPgorICAgICAgICAmbHQ7aXRlbSBxdWFudGl0eT0ib3RoZXIiPlpuYWxlemlvbm8gJWQgcGlvc2VuZWsuJmx0Oy9pdGVtPgorICAgICZsdDsvcGx1cmFscz4KKyZsdDsvcmVzb3VyY2VzPgorPC9wcmU+CiAgICAgPHA+SmF2YSBjb2RlOjwvcD4KIDxwcmU+CiBpbnQgY291bnQgPSBnZXROdW1iZXJPZnNvbmdzQXZhaWxhYmxlKCk7CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTJhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdGluZy5qZApAQCAtMCwwICsxLDM5MiBAQAorcGFnZS50aXRsZT1BY3Rpdml0eSBUZXN0aW5nCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKyAgPGRpdiBpZD0icXYiPgorICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CisgIDxvbD4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSIjQWN0aXZpdHlUZXN0QVBJIj5UaGUgQWN0aXZpdHkgVGVzdGluZyBBUEk8L2E+CisgICAgICA8b2w+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiI+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNBY3Rpdml0eVVuaXRUZXN0Q2FzZSI+QWN0aXZpdHlVbml0VGVzdENhc2U8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNTaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlIj5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdE5vdGVzIj5Nb2NrIG9iamVjdHMgYW5kIGFjdGl2aXR5IHRlc3Rpbmc8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNBc3NlcnRpb25Ob3RlcyI+QXNzZXJ0aW9ucyBmb3IgYWN0aXZpdHkgdGVzdGluZzwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNXaGF0VG9UZXN0Ij5XaGF0IHRvIFRlc3Q8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSIjVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvYT4KKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjTm90b3VjaE1vZGUiPlR1cm5pbmcgb2ZmIHRvdWNoIG1vZGU8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIEVtdWxhdG9yIG9yIERldmljZTwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9saT4KKyAgICA8L29sPgorPGgyPktleSBDbGFzc2VzPC9oMj4KKyAgICA8b2w+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9PC9saT4KKyAgICA8L29sPgorPGgyPlJlbGF0ZWQgVHV0b3JpYWxzPC9oMj4KKyAgICA8b2w+CisgICAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+CisgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPgorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgorICAgICAgPC9saT4KKyAgICA8L29sPgorPGgyPlNlZSBBbHNvPC9oMj4KKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICA8L2xpPgorICAgICAgPC9vbD4KKyAgPC9kaXY+Cis8L2Rpdj4KKzxwPgorICAgIEFjdGl2aXR5IHRlc3RpbmcgaXMgcGFydGljdWxhcmx5IGRlcGVuZGVudCBvbiB0aGUgdGhlIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4KKyAgICBVbmxpa2Ugb3RoZXIgY29tcG9uZW50cywgYWN0aXZpdGllcyBoYXZlIGEgY29tcGxleCBsaWZlY3ljbGUgYmFzZWQgb24gY2FsbGJhY2sgbWV0aG9kczsgdGhlc2UKKyAgICBjYW4ndCBiZSBpbnZva2VkIGRpcmVjdGx5IGV4Y2VwdCBieSBpbnN0cnVtZW50YXRpb24uIEFsc28sIHRoZSBvbmx5IHdheSB0byBzZW5kIGV2ZW50cyB0byB0aGUKKyAgICB1c2VyIGludGVyZmFjZSBmcm9tIGEgcHJvZ3JhbSBpcyB0aHJvdWdoIGluc3RydW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byB0ZXN0IGFjdGl2aXRpZXMgdXNpbmcgaW5zdHJ1bWVudGF0aW9uIGFuZCBvdGhlciB0ZXN0CisgICAgZmFjaWxpdGllcy4gVGhlIGRvY3VtZW50IGFzc3VtZXMgeW91IGhhdmUgYWxyZWFkeSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4sCisgICAgdGhlIGludHJvZHVjdGlvbiB0byB0aGUgQW5kcm9pZCB0ZXN0aW5nIGFuZCBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLgorPC9wPgorPGgyIGlkPSJBY3Rpdml0eVRlc3RBUEkiPlRoZSBBY3Rpdml0eSBUZXN0aW5nIEFQSTwvaDI+Cis8cD4KKyAgICBUaGUgYWN0aXZpdHkgdGVzdGluZyBBUEkgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfSwKKyAgICB3aGljaCBwcm92aWRlcyBpbnN0cnVtZW50YXRpb24gdG8gdGhlIHRlc3QgY2FzZSBzdWJjbGFzc2VzIHlvdSB1c2UgZm9yIEFjdGl2aXRpZXMuCis8L3A+Cis8cD4KKyAgICBGb3IgYWN0aXZpdHkgdGVzdGluZywgdGhpcyBiYXNlIGNsYXNzIHByb3ZpZGVzIHRoZXNlIGZ1bmN0aW9uczoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIExpZmVjeWNsZSBjb250cm9sOiBXaXRoIGluc3RydW1lbnRhdGlvbiwgeW91IGNhbiBzdGFydCB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGF1c2UgaXQsCisgICAgICAgIGFuZCBkZXN0cm95IGl0LCB1c2luZyBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSB0ZXN0IGNhc2UgY2xhc3Nlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgRGVwZW5kZW5jeSBpbmplY3Rpb246IEluc3RydW1lbnRhdGlvbiBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtb2NrIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMKKyAgICAgICAgQ29udGV4dHMgb3IgQXBwbGljYXRpb25zIGFuZCB1c2UgdGhlbSB0byBydW4gdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QuIFRoaXMKKyAgICAgICAgaGVscHMgeW91IGNvbnRyb2wgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIGlzb2xhdGUgaXQgZnJvbSBwcm9kdWN0aW9uIHN5c3RlbXMuIFlvdSBjYW4KKyAgICAgICAgYWxzbyBzZXQgdXAgY3VzdG9taXplZCBJbnRlbnRzIGFuZCBzdGFydCBhbiBhY3Rpdml0eSB3aXRoIHRoZW0uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFVzZXIgaW50ZXJmYWNlIGludGVyYWN0aW9uOiBZb3UgdXNlIGluc3RydW1lbnRhdGlvbiB0byBzZW5kIGtleXN0cm9rZXMgb3IgdG91Y2ggZXZlbnRzCisgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBVSSBvZiB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdC4KKyAgICA8L2xpPgorPC91bD4KKzxwPgorICAgIFRoZSBhY3Rpdml0eSB0ZXN0aW5nIGNsYXNzZXMgYWxzbyBwcm92aWRlIHRoZSBKVW5pdCBmcmFtZXdvcmsgYnkgZXh0ZW5kaW5nCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZX0gYW5kIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fS4KKzwvcD4KKzxwPgorICAgIFRoZSB0d28gbWFpbiB0ZXN0aW5nIHN1YmNsYXNzZXMgYXJlIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IGFuZAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LiBUbyB0ZXN0IGFuIEFjdGl2aXR5IHRoYXQgaXMgbGF1bmNoZWQgaW4gYSBtb2RlCisgICAgb3RoZXIgdGhhbiA8Y29kZT5zdGFuZGFyZDwvY29kZT4sIHlvdSB1c2Uge0BsaW5rIGFuZHJvaWQudGVzdC5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlfS4KKzwvcD4KKzxoMyBpZD0iQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIiPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9oMz4KKzxwPgorICAgIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0ZXN0IGNhc2UgY2xhc3MgaXMgZGVzaWduZWQgdG8gZG8KKyAgICBmdW5jdGlvbmFsIHRlc3Rpbmcgb2Ygb25lIG9yIG1vcmUgQWN0aXZpdGllcyBpbiBhbiBhcHBsaWNhdGlvbiwgdXNpbmcgYSBub3JtYWwgc3lzdGVtCisgICAgaW5mcmFzdHJ1Y3R1cmUuIEl0IHJ1bnMgdGhlIEFjdGl2aXRpZXMgaW4gYSBub3JtYWwgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsCisgICAgdXNpbmcgYSBzdGFuZGFyZCBzeXN0ZW0gQ29udGV4dC4gSXQgYWxsb3dzIHlvdSB0byBzZW5kIG1vY2sgSW50ZW50cyB0byB0aGUgYWN0aXZpdHkgdW5kZXIKKyAgICB0ZXN0LCBzbyB5b3UgY2FuIHVzZSBpdCB0byB0ZXN0IGFuIGFjdGl2aXR5IHRoYXQgcmVzcG9uZHMgdG8gbXVsdGlwbGUgdHlwZXMgb2YgaW50ZW50cywgb3IKKyAgICBhbiBhY3Rpdml0eSB0aGF0IGV4cGVjdHMgYSBjZXJ0YWluIHR5cGUgb2YgZGF0YSBpbiB0aGUgaW50ZW50LCBvciBib3RoLiBOb3RpY2UsIHRob3VnaCwgdGhhdCBpdAorICAgIGRvZXMgbm90IGFsbG93IG1vY2sgQ29udGV4dHMgb3IgQXBwbGljYXRpb25zLCBzbyB5b3UgY2FuIG5vdCBpc29sYXRlIHRoZSB0ZXN0IGZyb20gdGhlIHJlc3Qgb2YKKyAgICBhIHByb2R1Y3Rpb24gc3lzdGVtLgorPC9wPgorPGgzIGlkPSJBY3Rpdml0eVVuaXRUZXN0Q2FzZSI+QWN0aXZpdHlVbml0VGVzdENhc2U8L2gzPgorPHA+CisgICAgVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9IHRlc3QgY2FzZSBjbGFzcyB0ZXN0cyBhIHNpbmdsZSBhY3Rpdml0eSBpbgorICAgIGlzb2xhdGlvbi4gQmVmb3JlIHlvdSBzdGFydCB0aGUgYWN0aXZpdHksIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yIEFwcGxpY2F0aW9uLCBvciBib3RoLgorICAgIFlvdSB1c2UgaXQgdG8gcnVuIGFjdGl2aXR5IHRlc3RzIGluIGlzb2xhdGlvbiwgYW5kIHRvIGRvIHVuaXQgdGVzdGluZyBvZiBtZXRob2RzCisgICAgdGhhdCBkbyBub3QgaW50ZXJhY3Qgd2l0aCBBbmRyb2lkLiBZb3UgY2FuIG5vdCBzZW5kIG1vY2sgSW50ZW50cyB0byB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwKKyAgICBhbHRob3VnaCB5b3UgY2FuIGNhbGwKKyAgICB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc3RhcnRBY3Rpdml0eShJbnRlbnQpIEFjdGl2aXR5LnN0YXJ0QWN0aXZpdHkoSW50ZW50KX0gYW5kIHRoZW4KKyAgICBsb29rIGF0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcmVjZWl2ZWQuCis8L3A+Cis8aDMgaWQ9IlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2UiPlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2U8L2gzPgorPHA+CisgICAgVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZX0gY2xhc3MgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyBmb3IKKyAgICB0ZXN0aW5nIGEgc2luZ2xlIGFjdGl2aXR5IGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCBjaGFuZ2UgZnJvbSB0ZXN0IHRvIHRlc3QuCisgICAgSXQgaW52b2tlcyB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkgc2V0VXAoKX0gYW5kCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpIHRlYXJEb3duKCl9IG9ubHkgb25jZSwgaW5zdGVhZCBvZiBvbmNlIHBlcgorICAgIG1ldGhvZCBjYWxsLiBJdCBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gaW5qZWN0IGFueSBtb2NrIG9iamVjdHMuCis8L3A+Cis8cD4KKyAgICBUaGlzIHRlc3QgY2FzZSBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgYW4gYWN0aXZpdHkgdGhhdCBydW5zIGluIGEgbW9kZSBvdGhlciB0aGFuCisgICAgPGNvZGU+c3RhbmRhcmQ8L2NvZGU+LiBJdCBlbnN1cmVzIHRoYXQgdGhlIHRlc3QgZml4dHVyZSBpcyBub3QgcmVzZXQgYmV0d2VlbiB0ZXN0cy4gWW91CisgICAgY2FuIHRoZW4gdGVzdCB0aGF0IHRoZSBhY3Rpdml0eSBoYW5kbGVzIG11bHRpcGxlIGNhbGxzIGNvcnJlY3RseS4KKzwvcD4KKzxoMyBpZD0iTW9ja09iamVjdE5vdGVzIj5Nb2NrIG9iamVjdHMgYW5kIGFjdGl2aXR5IHRlc3Rpbmc8L2gzPgorPHA+CisgICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIG5vdGVzIGFib3V0IHRoZSB1c2Ugb2YgdGhlIG1vY2sgb2JqZWN0cyBkZWZpbmVkIGluCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrfSB3aXRoIGFjdGl2aXR5IHRlc3RzLgorPC9wPgorPHA+CisgICAgVGhlIG1vY2sgb2JqZWN0IHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBhY3Rpdml0eQorICAgIHRlc3RpbmcgaWYgeW91IHVzZSB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0gdGVzdCBjYXNlIGNsYXNzLgorICAgIEJ5IGRlZmF1bHQsIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPiwgY3JlYXRlcyBhIGhpZGRlbiA8Y29kZT5Nb2NrQXBwbGljYXRpb248L2NvZGU+CisgICAgb2JqZWN0IHRoYXQgaXMgdXNlZCBhcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gWW91IGNhbiBpbmplY3QgeW91ciBvd24gb2JqZWN0IHVzaW5nCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZSNzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbikgc2V0QXBwbGljYXRpb24oKX0uCis8L3A+Cis8aDMgaWQ9IkFzc2VydGlvbk5vdGVzIj5Bc3NlcnRpb25zIGZvciBhY3Rpdml0eSB0ZXN0aW5nPC9oMz4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9IGRlZmluZXMgYXNzZXJ0aW9ucyBmb3IgVmlld3MuIFlvdSB1c2UgaXQgdG8gdmVyaWZ5IHRoZQorICAgIGFsaWdubWVudCBhbmQgcG9zaXRpb24gb2YgVmlldyBvYmplY3RzLCBhbmQgdG8gbG9vayBhdCB0aGUgc3RhdGUgb2YgVmlld0dyb3VwIG9iamVjdHMuCis8L3A+Cis8aDIgaWQ9IldoYXRUb1Rlc3QiPldoYXQgVG8gVGVzdDwvaDI+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBJbnB1dCB2YWxpZGF0aW9uOiBUZXN0IHRoYXQgYW4gYWN0aXZpdHkgcmVzcG9uZHMgY29ycmVjdGx5IHRvIGlucHV0IHZhbHVlcyBpbiBhbgorICAgICAgICBFZGl0VGV4dCBWaWV3LiBTZXQgdXAgYSBrZXlzdHJva2Ugc2VxdWVuY2UsIHNlbmQgaXQgdG8gdGhlIGFjdGl2aXR5LCBhbmQgdGhlbgorICAgICAgICB1c2Uge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3QnlJZChpbnQpfSB0byBleGFtaW5lIHRoZSBzdGF0ZSBvZiB0aGUgVmlldy4gWW91IGNhbgorICAgICAgICB2ZXJpZnkgdGhhdCBhIHZhbGlkIGtleXN0cm9rZSBzZXF1ZW5jZSBlbmFibGVzIGFuIE9LIGJ1dHRvbiwgd2hpbGUgYW4gaW52YWxpZCBvbmUgbGVhdmVzIHRoZQorICAgICAgICBidXR0b24gZGlzYWJsZWQuIFlvdSBjYW4gYWxzbyB2ZXJpZnkgdGhhdCB0aGUgQWN0aXZpdHkgcmVzcG9uZHMgdG8gaW52YWxpZCBpbnB1dCBieQorICAgICAgICBzZXR0aW5nIGVycm9yIG1lc3NhZ2VzIGluIHRoZSBWaWV3LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBMaWZlY3ljbGUgZXZlbnRzOiBUZXN0IHRoYXQgZWFjaCBvZiB5b3VyIGFwcGxpY2F0aW9uJ3MgYWN0aXZpdGllcyBoYW5kbGVzIGxpZmVjeWNsZSBldmVudHMKKyAgICAgICAgY29ycmVjdGx5LiBJbiBnZW5lcmFsLCBsaWZlY3ljbGUgZXZlbnRzIGFyZSBhY3Rpb25zLCBlaXRoZXIgZnJvbSB0aGUgc3lzdGVtIG9yIGZyb20gdGhlCisgICAgICAgIHVzZXIsIHRoYXQgdHJpZ2dlciBhIGNhbGxiYWNrIG1ldGhvZCBzdWNoIGFzIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG9yCisgICAgICAgIDxjb2RlPm9uQ2xpY2soKTwvY29kZT4uIEZvciBleGFtcGxlLCBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cworICAgICAgICBieSBzYXZpbmcgaXRzIHN0YXRlLiBSZW1lbWJlciB0aGF0IGV2ZW4gYSBjaGFuZ2UgaW4gc2NyZWVuIG9yaWVudGF0aW9uIGNhdXNlcyB0aGUgY3VycmVudAorICAgICAgICBhY3Rpdml0eSB0byBiZSBkZXN0cm95ZWQsIHNvIHlvdSBzaG91bGQgdGVzdCB0aGF0IGFjY2lkZW50YWwgZGV2aWNlIG1vdmVtZW50cyBkb24ndAorICAgICAgICBhY2NpZGVudGFsbHkgbG9zZSB0aGUgYXBwbGljYXRpb24gc3RhdGUuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEludGVudHM6IFRlc3QgdGhhdCBlYWNoIGFjdGl2aXR5IGNvcnJlY3RseSBoYW5kbGVzIHRoZSBpbnRlbnRzIGxpc3RlZCBpbiB0aGUgaW50ZW50CisgICAgICAgIGZpbHRlciBzcGVjaWZpZWQgaW4gaXRzIG1hbmlmZXN0LiBZb3UgY2FuIHVzZQorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0byBzZW5kIG1vY2sgSW50ZW50cyB0byB0aGUKKyAgICAgICAgYWN0aXZpdHkgdW5kZXIgdGVzdC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgUnVudGltZSBjb25maWd1cmF0aW9uIGNoYW5nZXM6IFRlc3QgdGhhdCBlYWNoIGFjdGl2aXR5IHJlc3BvbmRzIGNvcnJlY3RseSB0byB0aGUKKyAgICAgICAgcG9zc2libGUgY2hhbmdlcyBpbiB0aGUgZGV2aWNlJ3MgY29uZmlndXJhdGlvbiB3aGlsZSB5b3VyIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIFRoZXNlCisgICAgICAgIGluY2x1ZGUgYSBjaGFuZ2UgdG8gdGhlIGRldmljZSdzIG9yaWVudGF0aW9uLCBhIGNoYW5nZSB0byB0aGUgY3VycmVudCBsYW5ndWFnZSwgYW5kIHNvCisgICAgICAgIGZvcnRoLiBIYW5kbGluZyB0aGVzZSBjaGFuZ2VzIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gdGhlIHRvcGljCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3J1bnRpbWUtY2hhbmdlcy5odG1sIj5IYW5kbGluZyBSdW50aW1lCisgICAgICAgIENoYW5nZXM8L2E+LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBTY3JlZW4gc2l6ZXMgYW5kIHJlc29sdXRpb25zOiBCZWZvcmUgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgbWFrZSBzdXJlIHRvIHRlc3QgaXQgb24KKyAgICAgICAgYWxsIG9mIHRoZSBzY3JlZW4gc2l6ZXMgYW5kIGRlbnNpdGllcyBvbiB3aGljaCB5b3Ugd2FudCBpdCB0byBydW4uIFlvdSBjYW4gdGVzdCB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gb24gbXVsdGlwbGUgc2l6ZXMgYW5kIGRlbnNpdGllcyB1c2luZyBBVkRzLCBvciB5b3UgY2FuIHRlc3QgeW91ciBhcHBsaWNhdGlvbgorICAgICAgICBkaXJlY3RseSBvbiB0aGUgZGV2aWNlcyB0aGF0IHlvdSBhcmUgdGFyZ2V0aW5nLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSB0b3BpYworICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHJhY3RpY2VzL3NjcmVlbnNfc3VwcG9ydC5odG1sIj5TdXBwb3J0aW5nIE11bHRpcGxlIFNjcmVlbnM8L2E+LgorICAgIDwvbGk+Cis8L3VsPgorPGgyIGlkPSJOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2gyPgorPHA+CisgICAgVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2UsIHBsZWFzZSByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KKyAgICBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIElmIHlvdSdyZSBub3Qgd29ya2luZyBpbiBFY2xpcHNlLCByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyCisgICAgSURFczwvYT4uCis8L3A+Cis8cD4KKyAgICBJZiB5b3Ugd2FudCBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gdGVzdGluZyBhY3Rpdml0aWVzLCB0cnkgb25lIG9mIHRoZQorICAgIHRlc3RpbmcgdHV0b3JpYWxzOgorPC9wPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKKyAgICAgICAgY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5CisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgorICAgICAgICBJdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQorICAgICAgICBtb3JlIHJlYWxpc3RpYyBhY3Rpdml0eS1vcmllbnRlZCBhcHBsaWNhdGlvbi4KKyAgICA8L2xpPgorPC91bD4KKzxoMiBpZD0iVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvaDI+Cis8cD4KKyAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGhhdmUgdGlwcyBmb3IgdGVzdGluZyB0aGUgVUkgb2YgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCBzcGVjaWZpY2FsbHkKKyAgICB0byBoZWxwIHlvdSBoYW5kbGUgYWN0aW9ucyB0aGF0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLCB0b3VjaCBzY3JlZW4gYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGhvbWUKKyAgICBzY3JlZW4gdW5sb2NrIGR1cmluZyB0ZXN0aW5nLgorPC9wPgorPGgzIGlkPSJSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2gzPgorPHA+CisgICAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKKyAgICBVSSBpcyBpbnN0YW50aWF0ZWQsIGZvciBleGFtcGxlIGluIHRoZSBhY3Rpdml0eSdzIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCwgdGhlbiBhbGwKKyAgICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKKyAgICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKzwvcD4KKzxwPgorICAgIFRoaXMgY2hhbmdlcyB3aGVuIHlvdSBydW4gdGVzdHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24uIFdpdGggaW5zdHJ1bWVudGF0aW9uLWJhc2VkIGNsYXNzZXMsCisgICAgeW91IGNhbiBpbnZva2UgbWV0aG9kcyBhZ2FpbnN0IHRoZSBVSSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIG90aGVyIHRlc3QgY2xhc3NlcworICAgIGRvbid0IGFsbG93IHRoaXMuIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkCisgICAgd2l0aCA8Y29kZT5AVUlUaHJlYWRUZXN0PC9jb2RlPi4gTm90aWNlIHRoYXQgdGhpcyB3aWxsIHJ1biA8ZW0+YWxsPC9lbT4gb2YgdGhlIG1ldGhvZCBzdGF0ZW1lbnRzCisgICAgb24gdGhlIFVJIHRocmVhZC4gIE1ldGhvZHMgdGhhdCBkbyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgVUkgYXJlIG5vdCBhbGxvd2VkOyBmb3IgZXhhbXBsZSwgeW91CisgICAgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCis8L3A+Cis8cD4KKyAgICBUbyBydW4gYSBzdWJzZXQgb2YgYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCBjcmVhdGUgYW4gYW5vbnltb3VzIGNsYXNzIG9mIHR5cGUKKyAgICA8Y29kZT5SdW5uYWJsZTwvY29kZT4sIHB1dCB0aGUgc3RhdGVtZW50cyB5b3Ugd2FudCBpbiB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZCwgYW5kCisgICAgaW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QKKyAgICA8Y29kZT48ZW0+YXBwQWN0aXZpdHk8L2VtPi5ydW5PblVpVGhyZWFkKCk8L2NvZGU+LCB3aGVyZSA8Y29kZT48ZW0+YXBwQWN0aXZpdHk8L2VtPjwvY29kZT4gaXMKKyAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHlvdSBhcmUgdGVzdGluZy4KKzwvcD4KKzxwPgorICAgIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgaW5zdGFudGlhdGVzIGFuIGFjdGl2aXR5IHRvIHRlc3QsIHJlcXVlc3RzIGZvY3VzIChhIFVJIGFjdGlvbikgZm9yIHRoZQorICAgIFNwaW5uZXIgZGlzcGxheWVkIGJ5IHRoZSBhY3Rpdml0eSwgYW5kIHRoZW4gc2VuZHMgYSBrZXkgdG8gaXQuIE5vdGljZSB0aGF0IHRoZSBjYWxscyB0bworICAgIDxjb2RlPndhaXRGb3JJZGxlU3luYzwvY29kZT4gYW5kIDxjb2RlPnNlbmRLZXlzPC9jb2RlPiBhcmVuJ3QgYWxsb3dlZCB0byBydW4gb24gdGhlIFVJIHRocmVhZDoKKzwvcD4KKzxwcmU+CisgIHByaXZhdGUgTXlBY3Rpdml0eSBtQWN0aXZpdHk7IC8vIE15QWN0aXZpdHkgaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFwcCB1bmRlciB0ZXN0CisgIHByaXZhdGUgU3Bpbm5lciBtU3Bpbm5lcjsKKworICAuLi4KKworICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKKworICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsgLy8gZ2V0IGEgcmVmZXJlbmNlcyB0byB0aGUgYXBwIHVuZGVyIHRlc3QKKworICAgICAgLyoKKyAgICAgICAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbWFpbiB3aWRnZXQgb2YgdGhlIGFwcCB1bmRlciB0ZXN0LCBhIFNwaW5uZXIKKyAgICAgICAqLworICAgICAgbVNwaW5uZXIgPSAoU3Bpbm5lcikgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5kZW1vLm15YWN0aXZpdHkuUi5pZC5TcGlubmVyMDEpOworCisgIC4uLgorCisgIHB1YmxpYyB2b2lkIGFUZXN0KCkgeworICAgICAgLyoKKyAgICAgICAqIHJlcXVlc3QgZm9jdXMgZm9yIHRoZSBTcGlubmVyLCBzbyB0aGF0IHRoZSB0ZXN0IGNhbiBzZW5kIGtleSBldmVudHMgdG8gaXQKKyAgICAgICAqIFRoaXMgcmVxdWVzdCBtdXN0IGJlIHJ1biBvbiB0aGUgVUkgdGhyZWFkLiBUbyBkbyB0aGlzLCB1c2UgdGhlIHJ1bk9uVWlUaHJlYWQgbWV0aG9kCisgICAgICAgKiBhbmQgcGFzcyBpdCBhIFJ1bm5hYmxlIHRoYXQgY29udGFpbnMgYSBjYWxsIHRvIHJlcXVlc3RGb2N1cyBvbiB0aGUgU3Bpbm5lci4KKyAgICAgICAqLworICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgbVNwaW5uZXIucmVxdWVzdEZvY3VzKCk7CisgICAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgIHRoaXMuc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Cis8L3ByZT4KKworPGgzIGlkPSJOb3RvdWNoTW9kZSI+VHVybmluZyBvZmYgdG91Y2ggbW9kZTwvaDM+Cis8cD4KKyAgICBUbyBjb250cm9sIHRoZSBlbXVsYXRvciBvciBhIGRldmljZSB3aXRoIGtleSBldmVudHMgeW91IHNlbmQgZnJvbSB5b3VyIHRlc3RzLCB5b3UgbXVzdCB0dXJuIG9mZgorICAgIHRvdWNoIG1vZGUuIElmIHlvdSBkbyBub3QgZG8gdGhpcywgdGhlIGtleSBldmVudHMgYXJlIGlnbm9yZWQuCis8L3A+Cis8cD4KKyAgICBUbyB0dXJuIG9mZiB0b3VjaCBtb2RlLCB5b3UgaW52b2tlCisgICAgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIuc2V0QWN0aXZpdHlUb3VjaE1vZGUoZmFsc2UpPC9jb2RlPgorICAgIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUKKyAgICBtZXRob2QgaW4gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIDxlbT5ub3Q8L2VtPiBydW5uaW5nIG9uIHRoZSBVSSB0aHJlYWQuIEZvciB0aGlzIHJlYXNvbiwgeW91CisgICAgY2FuJ3QgaW52b2tlIHRoZSB0b3VjaCBtb2RlIG1ldGhvZCBmcm9tIGEgdGVzdCBtZXRob2QgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aAorICAgIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KKzwvcD4KKzxoMyBpZD0iVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIGVtdWxhdG9yIG9yIGRldmljZTwvaDM+Cis8cD4KKyAgICBZb3UgbWF5IGZpbmQgdGhhdCBVSSB0ZXN0cyBkb24ndCB3b3JrIGlmIHRoZSBlbXVsYXRvcidzIG9yIGRldmljZSdzIGhvbWUgc2NyZWVuIGlzIGRpc2FibGVkIHdpdGgKKyAgICB0aGUga2V5Z3VhcmQgcGF0dGVybi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50CisgICAgYnkgPGNvZGU+c2VuZEtleXMoKTwvY29kZT4uIFRoZSBiZXN0IHdheSB0byBhdm9pZCB0aGlzIGlzIHRvIHN0YXJ0IHlvdXIgZW11bGF0b3Igb3IgZGV2aWNlCisgICAgZmlyc3QgYW5kIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgZm9yIHRoZSBob21lIHNjcmVlbi4KKzwvcD4KKzxwPgorICAgIFlvdSBjYW4gYWxzbyBleHBsaWNpdGx5IGRpc2FibGUgdGhlIGtleWd1YXJkLiBUbyBkbyB0aGlzLAorICAgIHlvdSBuZWVkIHRvIGFkZCBhIHBlcm1pc3Npb24gaW4gdGhlIG1hbmlmZXN0IGZpbGUgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBhbmQKKyAgICB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGluIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gTm90ZSwgdGhvdWdoLCB0aGF0IHlvdSBlaXRoZXIgaGF2ZSB0bworICAgIHJlbW92ZSB0aGlzIGJlZm9yZSB5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uLCBvciB5b3UgaGF2ZSB0byBkaXNhYmxlIGl0IHdpdGggY29kZSBpbgorICAgIHRoZSBwdWJsaXNoZWQgYXBwbGljYXRpb24uCis8L3A+Cis8cD4KKyAgICBUbyBhZGQgdGhlIHRoZSBwZXJtaXNzaW9uLCBhZGQgdGhlIGVsZW1lbnQKKyAgICA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiLyZndDs8L2NvZGU+CisgICAgYXMgYSBjaGlsZCBvZiB0aGUgPGNvZGU+Jmx0O21hbmlmZXN0Jmd0OzwvY29kZT4gZWxlbWVudC4gVG8gZGlzYWJsZSB0aGUgS2V5R3VhcmQsIGFkZCB0aGUKKyAgICBmb2xsb3dpbmcgY29kZSB0byB0aGUgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kIG9mIGFjdGl2aXRpZXMgeW91IGludGVuZCB0byB0ZXN0OgorPC9wPgorPHByZT4KKyAgbUtleUd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSk7CisgIG1Mb2NrID0gbUtleUd1YXJkTWFuYWdlci5uZXdLZXlndWFyZExvY2soIjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPiIpOworICBtTG9jay5kaXNhYmxlS2V5Z3VhcmQoKTsKKzwvcHJlPgorPHA+d2hlcmUgPGNvZGU+PGVtPmFjdGl2aXR5X2NsYXNzbmFtZTwvZW0+PC9jb2RlPiBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZpdHkuPC9wPgorPGgzIGlkPSJVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvaDM+Cis8cD4KKyAgICBUaGlzIHNlY3Rpb24gbGlzdHMgc29tZSBvZiB0aGUgY29tbW9uIHRlc3QgZmFpbHVyZXMgeW91IG1heSBlbmNvdW50ZXIgaW4gVUkgdGVzdGluZywgYW5kIHRoZWlyCisgICAgY2F1c2VzOgorPC9wPgorPGRsPgorICAgIDxkdD48Y29kZT5Xcm9uZ1RocmVhZEV4Y2VwdGlvbjwvY29kZT48L2R0PgorICAgIDxkZD4KKyAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+CisgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgorICAgICAgPGNvZGU+CisgICAgICAgIGFuZHJvaWQudmlldy5WaWV3Um9vdCRDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb246IE9ubHkgdGhlIG9yaWdpbmFsIHRocmVhZCB0aGF0IGNyZWF0ZWQKKyAgICAgICAgYSB2aWV3IGhpZXJhcmNoeSBjYW4gdG91Y2ggaXRzIHZpZXdzLgorICAgICAgPC9jb2RlPgorICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+CisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdSB0cmllZCB0byBzZW5kIFVJIGV2ZW50cyB0byB0aGUgVUkgdGhyZWFkIGZyb20gb3V0c2lkZSB0aGUgVUkKKyAgICAgICAgdGhyZWFkLiBUaGlzIGNvbW1vbmx5IGhhcHBlbnMgaWYgeW91IHNlbmQgVUkgZXZlbnRzIGZyb20gdGhlIHRlc3QgYXBwbGljYXRpb24sIGJ1dCB5b3UgZG9uJ3QKKyAgICAgICAgdXNlIHRoZSA8Y29kZT5AVUlUaHJlYWQ8L2NvZGU+IGFubm90YXRpb24gb3IgdGhlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4gbWV0aG9kLiBUaGUKKyAgICAgICAgdGVzdCBtZXRob2QgdHJpZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgVUkgb3V0c2lkZSB0aGUgVUkgdGhyZWFkLgorICAgICAgPHA+PHN0cm9uZz5TdWdnZXN0ZWQgUmVzb2x1dGlvbjo8L3N0cm9uZz48L3A+CisgICAgICAgIFJ1biB0aGUgaW50ZXJhY3Rpb24gb24gdGhlIFVJIHRocmVhZC4gVXNlIGEgdGVzdCBjbGFzcyB0aGF0IHByb3ZpZGVzIGluc3RydW1lbnRhdGlvbi4gU2VlCisgICAgICAgIHRoZSBwcmV2aW91cyBzZWN0aW9uIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSBUaHJlYWQ8L2E+CisgICAgICAgIGZvciBtb3JlIGRldGFpbHMuCisgICAgPC9kZD4KKyAgICA8ZHQ+PGNvZGU+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+PC9kdD4KKyAgICA8ZGQ+CisgICAgICA8cD48c3Ryb25nPlByb2JsZW06PC9zdHJvbmc+PC9wPgorICAgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgorICAgICAgPGNvZGU+CisgICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZAorICAgICAgPC9jb2RlPgorICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+CisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0CisgICAgICAgIHRoZW4gdHJpZXMgdG8gZG8gc29tZXRoaW5nIG91dHNpZGUgdGhlIFVJIHRocmVhZCBvciB0cmllcyB0byBpbnZva2UKKyAgICAgICAgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPi4KKyAgICAgIDxwPjxzdHJvbmc+U3VnZ2VzdGVkIFJlc29sdXRpb246PC9zdHJvbmc+PC9wPgorICAgICAgICBSZW1vdmUgdGhlIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGFubm90YXRpb24sIHJlbW92ZSB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPgorICAgICAgICBjYWxsLCBvciByZS1mYWN0b3IgeW91ciB0ZXN0cy4KKyAgICA8L2RkPgorPC9kbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTNiNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmpkCkBAIC0wLDAgKzEsMjI0IEBACitwYWdlLnRpdGxlPUNvbnRlbnQgUHJvdmlkZXIgVGVzdGluZworQGpkOmJvZHkKKworPGRpdiBpZD0icXYtd3JhcHBlciI+CisgIDxkaXYgaWQ9InF2Ij4KKyAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgorICA8b2w+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjRGVzaWduQW5kVGVzdCI+Q29udGVudCBQcm92aWRlciBEZXNpZ24gYW5kIFRlc3Rpbmc8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSIjQ29udGVudFByb3ZpZGVyVGVzdEFQSSI+VGhlIENvbnRlbnQgUHJvdmlkZXIgVGVzdGluZyBBUEk8L2E+CisgICAgICA8b2w+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjUHJvdmlkZXJUZXN0Q2FzZTIiPlByb3ZpZGVyVGVzdENhc2UyIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNXaGF0VG9UZXN0Ij5XaGF0IFRvIFRlc3Q8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2E+CisgICAgPC9saT4KKyAgPC9vbD4KKyAgPGgyPktleSBDbGFzc2VzPC9oMj4KKyAgICA8b2w+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9PC9saT4KKyAgICA8L29sPgorICA8aDI+U2VlIEFsc288L2gyPgorICAgICAgPG9sPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEKKyAgICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdG9waWNzL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICA8L2xpPgorICAgICAgPC9vbD4KKyAgPC9kaXY+Cis8L2Rpdj4KKzxwPgorICAgIENvbnRlbnQgcHJvdmlkZXJzLCB3aGljaCBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YSBhbmQgbWFrZSBpdCBhY2Nlc3NpYmxlIGFjcm9zcyBhcHBsaWNhdGlvbnMsCisgICAgYXJlIGEga2V5IHBhcnQgb2YgdGhlIEFuZHJvaWQgQVBJLiBBcyBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgeW91J3JlIGFsbG93ZWQgdG8gcHJvdmlkZSB5b3VyCisgICAgb3duIHB1YmxpYyBwcm92aWRlcnMgZm9yIHVzZSBieSBvdGhlciBhcHBsaWNhdGlvbnMuIElmIHlvdSBkbywgdGhlbiB5b3Ugc2hvdWxkIHRlc3QgdGhlbQorICAgIHVzaW5nIHRoZSBBUEkgeW91IHB1Ymxpc2guCis8L3A+Cis8cD4KKyAgICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gdGVzdCBwdWJsaWMgY29udGVudCBwcm92aWRlcnMsIGFsdGhvdWdoIHRoZSBpbmZvcm1hdGlvbiBpcworICAgIGFsc28gYXBwbGljYWJsZSB0byBwcm92aWRlcnMgdGhhdCB5b3Uga2VlcCBwcml2YXRlIHRvIHlvdXIgb3duIGFwcGxpY2F0aW9uLiBJZiB5b3UgYXJlbid0CisgICAgZmFtaWxpYXIgd2l0aCBjb250ZW50ICBwcm92aWRlcnMgb3IgdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmssIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9wcm92aWRlcnMvY29udGVudC1wcm92aWRlcnMuaHRtbCI+Q29udGVudCBQcm92aWRlcnM8L2E+LAorICAgIHRoZSBndWlkZSB0byBkZXZlbG9waW5nIGNvbnRlbnQgcHJvdmlkZXJzLCBhbmQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPiwKKyAgICB0aGUgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgYW5kIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuCis8L3A+Cis8aDIgaWQ9IkRlc2lnbkFuZFRlc3QiPkNvbnRlbnQgUHJvdmlkZXIgRGVzaWduIGFuZCBUZXN0aW5nPC9oMj4KKzxwPgorICAgIEluIEFuZHJvaWQsIGNvbnRlbnQgcHJvdmlkZXJzIGFyZSB2aWV3ZWQgZXh0ZXJuYWxseSBhcyBkYXRhIEFQSXMgdGhhdCBwcm92aWRlCisgICAgdGFibGVzIG9mIGRhdGEsIHdpdGggdGhlaXIgaW50ZXJuYWxzIGhpZGRlbiBmcm9tIHZpZXcuIEEgY29udGVudCBwcm92aWRlciBtYXkgaGF2ZSBtYW55CisgICAgcHVibGljIGNvbnN0YW50cywgYnV0IGl0IHVzdWFsbHkgaGFzIGZldyBpZiBhbnkgcHVibGljIG1ldGhvZHMgYW5kIG5vIHB1YmxpYyB2YXJpYWJsZXMuCisgICAgVGhpcyBzdWdnZXN0cyB0aGF0IHlvdSBzaG91bGQgd3JpdGUgeW91ciB0ZXN0cyBiYXNlZCBvbmx5IG9uIHRoZSBwcm92aWRlcidzIHB1YmxpYyBtZW1iZXJzLgorICAgIEEgY29udGVudCBwcm92aWRlciB0aGF0IGlzIGRlc2lnbmVkIGxpa2UgdGhpcyBpcyBvZmZlcmluZyBhIGNvbnRyYWN0IGJldHdlZW4gaXRzZWxmIGFuZCBpdHMKKyAgICB1c2Vycy4KKzwvcD4KKzxwPgorICAgIFRoZSBiYXNlIHRlc3QgY2FzZSBjbGFzcyBmb3IgY29udGVudCBwcm92aWRlcnMsCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0sIGFsbG93cyB5b3UgdG8gdGVzdCB5b3VyIGNvbnRlbnQgcHJvdmlkZXIgaW4gYW4KKyAgICBpc29sYXRlZCBlbnZpcm9ubWVudC4gQW5kcm9pZCBtb2NrIG9iamVjdHMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gYW5kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IGFsc28gaGVscCBwcm92aWRlIGFuIGlzb2xhdGVkIHRlc3QgZW52aXJvbm1lbnQuCis8L3A+Cis8cD4KKyAgICBBcyB3aXRoIG90aGVyIEFuZHJvaWQgdGVzdHMsIHByb3ZpZGVyIHRlc3QgcGFja2FnZXMgYXJlIHJ1biB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgdGVzdAorICAgIHJ1bm5lciB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LiBUaGUgc2VjdGlvbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj4KKyAgICBSdW5uaW5nIFRlc3RzIFdpdGggSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvYT4gZGVzY3JpYmVzIHRoZSB0ZXN0IHJ1bm5lciBpbgorICAgIG1vcmUgZGV0YWlsLiBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4gc2hvd3MgeW91IGhvdyB0byBydW4gYSB0ZXN0IHBhY2thZ2UgaW4gRWNsaXBzZSwgYW5kIHRoZQorICAgIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgc2hvd3MgeW91IGhvdyB0byBydW4gYSB0ZXN0IHBhY2thZ2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorPC9wPgorPGgyIGlkPSJDb250ZW50UHJvdmlkZXJUZXN0QVBJIj5Db250ZW50IFByb3ZpZGVyIFRlc3RpbmcgQVBJPC9oMj4KKzxwPgorICAgIFRoZSBtYWluIGZvY3VzIG9mIHRoZSBwcm92aWRlciB0ZXN0aW5nIEFQSSBpcyB0byBwcm92aWRlIGFuIGlzb2xhdGVkIHRlc3RpbmcgZW52aXJvbm1lbnQuIFRoaXMKKyAgICBlbnN1cmVzIHRoYXQgdGVzdHMgYWx3YXlzIHJ1biBhZ2FpbnN0IGRhdGEgZGVwZW5kZW5jaWVzIHNldCBleHBsaWNpdGx5IGluIHRoZSB0ZXN0IGNhc2UuIEl0CisgICAgYWxzbyBwcmV2ZW50cyB0ZXN0cyBmcm9tIG1vZGlmeWluZyBhY3R1YWwgdXNlciBkYXRhLiBGb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gYXZvaWQgd3JpdGluZworICAgIGEgdGVzdCB0aGF0IGZhaWxzIGJlY2F1c2UgdGhlcmUgd2FzIGRhdGEgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyB0ZXN0LCBhbmQgeW91IHdhbnQgdG8KKyAgICBhdm9pZCBhZGRpbmcgb3IgZGVsZXRpbmcgY29udGFjdCBpbmZvcm1hdGlvbiBpbiBhIGFjdHVhbCBwcm92aWRlci4KKzwvcD4KKzxwPgorICAgIFRoZSB0ZXN0IGNhc2UgY2xhc3MgYW5kIG1vY2sgb2JqZWN0IGNsYXNzZXMgZm9yIHByb3ZpZGVyIHRlc3Rpbmcgc2V0IHVwIHRoaXMgaXNvbGF0ZWQgdGVzdGluZworICAgIGVudmlyb25tZW50IGZvciB5b3UuCis8L3A+Cis8aDMgaWQ9IlByb3ZpZGVyVGVzdENhc2UyIj5Qcm92aWRlclRlc3RDYXNlMjwvaDM+Cis8cD4KKyAgICBZb3UgdGVzdCBhIHByb3ZpZGVyIHdpdGggYSBzdWJjbGFzcyBvZiB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfS4gVGhpcyBiYXNlIGNsYXNzCisgICAgZXh0ZW5kcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0sIHNvIGl0IHByb3ZpZGVzIHRoZSBKVW5pdCB0ZXN0aW5nIGZyYW1ld29yayBhcyB3ZWxsCisgICAgYXMgQW5kcm9pZC1zcGVjaWZpYyBtZXRob2RzIGZvciB0ZXN0aW5nIGFwcGxpY2F0aW9uIHBlcm1pc3Npb25zLiBUaGUgbW9zdCBpbXBvcnRhbnQKKyAgICBmZWF0dXJlIG9mIHRoaXMgY2xhc3MgaXMgaXRzIGluaXRpYWxpemF0aW9uLCB3aGljaCBjcmVhdGVzIHRoZSBpc29sYXRlZCB0ZXN0IGVudmlyb25tZW50LgorPC9wPgorPHA+CisgICAgVGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSwgd2hpY2gKKyAgICBzdWJjbGFzc2VzIGNhbGwgaW4gdGhlaXIgb3duIGNvbnN0cnVjdG9ycy4gVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9CisgICAgY29uc3RydWN0b3IgY3JlYXRlcyBhbiB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gb2JqZWN0IHRoYXQgYWxsb3dzIGZpbGUgYW5kCisgICAgZGF0YWJhc2Ugb3BlcmF0aW9ucyBidXQgc3R1YnMgb3V0IG90aGVyIGludGVyYWN0aW9ucyB3aXRoIHRoZSBBbmRyb2lkIHN5c3RlbS4KKyAgICBUaGUgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB0aGVtc2VsdmVzIHRha2UgcGxhY2UgaW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBsb2NhbCB0byB0aGUKKyAgICBkZXZpY2Ugb3IgZW11bGF0b3IgYW5kIGhhcyBhIHNwZWNpYWwgcHJlZml4LgorPC9wPgorPHA+CisgICAgVGhlIGNvbnN0cnVjdG9yIHRoZW4gY3JlYXRlcyBhIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSB0byB1c2UgYXMgdGhlCisgICAgcmVzb2x2ZXIgZm9yIHRoZSB0ZXN0LiBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IGNsYXNzIGlzIGRlc2NyaWJlZCBpbgorICAgIGRldGFpbCBpbiB0aGUgc2VjdGlvbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0X2FuZHJvaWQjTW9ja09iamVjdENsYXNzZXMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+LgorPC9wPgorPHA+CisgICAgTGFzdGx5LCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdC4gVGhpcyBpcyBhIG5vcm1hbAorICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSBvYmplY3QsIGJ1dCBpdCB0YWtlcyBhbGwgb2YgaXRzIGVudmlyb25tZW50IGluZm9ybWF0aW9uCisgICAgZnJvbSB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LCBzbyBpdCBpcyByZXN0cmljdGVkIHRvCisgICAgd29ya2luZyBpbiB0aGUgaXNvbGF0ZWQgdGVzdCBlbnZpcm9ubWVudC4gQWxsIG9mIHRoZSB0ZXN0cyBkb25lIGluIHRoZSB0ZXN0IGNhc2UgY2xhc3MgcnVuCisgICAgYWdhaW5zdCB0aGlzIGlzb2xhdGVkIG9iamVjdC4KKzwvcD4KKzxoMyBpZD0iTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2gzPgorPHA+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0gdXNlcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gYW5kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9LCB3aGljaCBhcmUgc3RhbmRhcmQgbW9jayBvYmplY3QgY2xhc3Nlcy4gVG8KKyAgICBsZWFybiBtb3JlIGFib3V0IHRoZW0sIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RfYW5kcm9pZCNNb2NrT2JqZWN0Q2xhc3NlcyI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPGgyIGlkPSJXaGF0VG9UZXN0Ij5XaGF0IFRvIFRlc3Q8L2gyPgorPHA+CisgICAgVGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy93aGF0X3RvX3Rlc3QuaHRtbCI+V2hhdCBUbyBUZXN0PC9hPgorICAgIGxpc3RzIGdlbmVyYWwgY29uc2lkZXJhdGlvbnMgZm9yIHRlc3RpbmcgQW5kcm9pZCBjb21wb25lbnRzLgorICAgIEhlcmUgYXJlIHNvbWUgc3BlY2lmaWMgZ3VpZGVsaW5lcyBmb3IgdGVzdGluZyBjb250ZW50IHByb3ZpZGVycy4KKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFRlc3Qgd2l0aCByZXNvbHZlciBtZXRob2RzOiBFdmVuIHRob3VnaCB5b3UgY2FuIGluc3RhbnRpYXRlIGEgcHJvdmlkZXIgb2JqZWN0IGluCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9LCB5b3Ugc2hvdWxkIGFsd2F5cyB0ZXN0IHdpdGggYSByZXNvbHZlciBvYmplY3QKKyAgICAgICAgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFVSSS4gVGhpcyBlbnN1cmVzIHRoYXQgeW91IGFyZSB0ZXN0aW5nIHRoZSBwcm92aWRlciB1c2luZyB0aGUgc2FtZQorICAgICAgICBpbnRlcmFjdGlvbiB0aGF0IGEgcmVndWxhciBhcHBsaWNhdGlvbiB3b3VsZCB1c2UuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3QgYSBwdWJsaWMgcHJvdmlkZXIgYXMgYSBjb250cmFjdDogSWYgeW91IGludGVudCB5b3VyIHByb3ZpZGVyIHRvIGJlIHB1YmxpYyBhbmQKKyAgICAgICAgYXZhaWxhYmxlIHRvIG90aGVyIGFwcGxpY2F0aW9ucywgeW91IHNob3VsZCB0ZXN0IGl0IGFzIGEgY29udHJhY3QuIFRoaXMgaW5jbHVkZXMKKyAgICAgICAgdGhlIGZvbGxvd2luZyBpZGVhczoKKyAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRlc3Qgd2l0aCBjb25zdGFudHMgdGhhdCB5b3VyIHByb3ZpZGVyIHB1YmxpY2x5IGV4cG9zZXMuIEZvcgorICAgICAgICAgICAgICAgIGV4YW1wbGUsIGxvb2sgZm9yIGNvbnN0YW50cyB0aGF0IHJlZmVyIHRvIGNvbHVtbiBuYW1lcyBpbiBvbmUgb2YgdGhlIHByb3ZpZGVyJ3MKKyAgICAgICAgICAgICAgICBkYXRhIHRhYmxlcy4gVGhlc2Ugc2hvdWxkIGFsd2F5cyBiZSBjb25zdGFudHMgcHVibGljbHkgZGVmaW5lZCBieSB0aGUgcHJvdmlkZXIuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRlc3QgYWxsIHRoZSBVUklzIG9mZmVyZWQgYnkgeW91ciBwcm92aWRlci4gWW91ciBwcm92aWRlciBtYXkgb2ZmZXIgc2V2ZXJhbCBVUklzLAorICAgICAgICAgICAgICAgIGVhY2ggb25lIHJlZmVycmluZyB0byBhIGRpZmZlcmVudCBhc3BlY3Qgb2YgdGhlIGRhdGEuIFRoZQorICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9Ob3RlUGFkL2luZGV4Lmh0bWwiPk5vdGUgUGFkPC9hPiBzYW1wbGUsCisgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUsIGZlYXR1cmVzIGEgcHJvdmlkZXIgdGhhdCBvZmZlcnMgb25lIFVSSSBmb3IgcmV0cmlldmluZyBhIGxpc3Qgb2Ygbm90ZXMsCisgICAgICAgICAgICAgICAgYW5vdGhlciBmb3IgcmV0cmlldmluZyBhbiBpbmRpdmlkdWFsIG5vdGUgYnkgaXQncyBkYXRhYmFzZSBJRCwgYW5kIGEgdGhpcmQgZm9yCisgICAgICAgICAgICAgICAgZGlzcGxheWluZyBub3RlcyBpbiBhIGxpdmUgZm9sZGVyLiBUaGUgc2FtcGxlIHRlc3QgcGFja2FnZSBmb3IgTm90ZSBQYWQsCisgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWRUZXN0L2luZGV4Lmh0bWwiPiBOb3RlIFBhZCBUZXN0PC9hPiwgaGFzCisgICAgICAgICAgICAgICAgdW5pdCB0ZXN0cyBmb3IgdHdvIG9mIHRoZXNlIFVSSXMuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRlc3QgaW52YWxpZCBVUklzOiBZb3VyIHVuaXQgdGVzdHMgc2hvdWxkIGRlbGliZXJhdGVseSBjYWxsIHRoZSBwcm92aWRlciB3aXRoIGFuCisgICAgICAgICAgICAgICAgaW52YWxpZCBVUkksIGFuZCBsb29rIGZvciBlcnJvcnMuIEdvb2QgcHJvdmlkZXIgZGVzaWduIGlzIHRvIHRocm93IGFuCisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBpbnZhbGlkIFVSSXMuCisKKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3QgdGhlIHN0YW5kYXJkIHByb3ZpZGVyIGludGVyYWN0aW9uczogTW9zdCBwcm92aWRlcnMgb2ZmZXIgc2l4IGFjY2VzcyBtZXRob2RzOgorICAgICAgICBxdWVyeSwgaW5zZXJ0LCBkZWxldGUsIHVwZGF0ZSwgZ2V0VHlwZSwgYW5kIG9uQ3JlYXRlKCkuIFlvdXIgdGVzdHMgc2hvdWxkIHZlcmlmeSB0aGF0IGFsbAorICAgICAgICBvZiB0aGVzZSBtZXRob2RzIHdvcmsuIFRoZXNlIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHRvcGljCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcHJvdmlkZXJzL2NvbnRlbnQtcHJvdmlkZXJzLmh0bWwiPkNvbnRlbnQgUHJvdmlkZXJzPC9hPi4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGVzdCBidXNpbmVzcyBsb2dpYzogRG9uJ3QgZm9yZ2V0IHRvIHRlc3QgdGhlIGJ1c2luZXNzIGxvZ2ljIHRoYXQgeW91ciBwcm92aWRlciBzaG91bGQKKyAgICAgICAgZW5mb3JjZS4gQnVzaW5lc3MgbG9naWMgaW5jbHVkZXMgaGFuZGxpbmcgb2YgaW52YWxpZCB2YWx1ZXMsIGZpbmFuY2lhbCBvciBhcml0aG1ldGljCisgICAgICAgIGNhbGN1bGF0aW9ucywgZWxpbWluYXRpb24gb3IgY29tYmluaW5nIG9mIGR1cGxpY2F0ZXMsIGFuZCBzbyBmb3J0aC4gQSBjb250ZW50IHByb3ZpZGVyCisgICAgICAgIGRvZXMgbm90IGhhdmUgdG8gaGF2ZSBidXNpbmVzcyBsb2dpYywgYmVjYXVzZSBpdCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgYWN0aXZpdGllcyB0aGF0CisgICAgICAgIG1vZGlmeSB0aGUgZGF0YS4gSWYgdGhlIHByb3ZpZGVyIGRvZXMgaW1wbGVtZW50IGJ1c2luZXNzIGxvZ2ljLCB5b3Ugc2hvdWxkIHRlc3QgaXQuCisgICAgPC9saT4KKzwvdWw+Cis8aDIgaWQ9Ik5leHRTdGVwcyI+TmV4dCBTdGVwczwvaDI+Cis8cD4KKyAgICBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSwgcGxlYXNlIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbgorICAgIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKKyAgICBJREVzPC9hPi4KKzwvcD4KKzxwPgorICAgIElmIHlvdSB3YW50IGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byB0ZXN0aW5nIGFjdGl2aXRpZXMsIHRyeSBvbmUgb2YgdGhlCisgICAgdGVzdGluZyB0dXRvcmlhbHM6Cis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj5IZWxsbywKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaW50cm9kdWNlcyBiYXNpYyB0ZXN0aW5nIGNvbmNlcHRzIGFuZCBwcm9jZWR1cmVzIGluIHRoZQorICAgICAgICBjb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaXMgYW4gZXhjZWxsZW50IGZvbGxvdy11cCB0byB0aGUgSGVsbG8sIFRlc3RpbmcgdHV0b3JpYWwuCisgICAgICAgIEl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCisgICAgICAgIG1vcmUgcmVhbGlzdGljIGFjdGl2aXR5LW9yaWVudGVkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2luZGV4LmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2luZGV4LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWQ1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvaW5kZXguamQKQEAgLTAsMCArMSw4MCBAQAorcGFnZS50aXRsZT1UZXN0aW5nCitAamQ6Ym9keQorPHA+CisgICAgVGhlIEFuZHJvaWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgaW5jbHVkZXMgYW4gaW50ZWdyYXRlZCB0ZXN0aW5nIGZyYW1ld29yayB0aGF0IGhlbHBzIHlvdQorICAgIHRlc3QgYWxsIGFzcGVjdHMgb2YgeW91ciBhcHBsaWNhdGlvbi4KKzwvcD4KKzxoND5GdW5kYW1lbnRhbHM8L2g0PgorPHA+CisgICAgVG8gc3RhcnQgbGVhcm5pbmcgaG93IHRvIHVzZSB0aGUgZnJhbWV3b3JrIHRvIGNyZWF0ZSB0ZXN0cyBmb3IgeW91ciBhcHBsaWNhdGlvbnMsIHBsZWFzZQorICAgIHJlYWQgdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPGg0PkNvbmNlcHRzPC9oND4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFRlc3RpbmcgVG9vbHMgZGVzY3JpYmVzIHRoZSBFY2xpcHNlIHdpdGggQURUIGFuZCBjb21tYW5kLWxpbmUgdG9vbHMgeW91IHVzZSB0byB0ZXN0CisgICAgICAgIEFuZHJvaWQgYXBwbGljYXRpb25zLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBXaGF0IHRvIFRlc3QgaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIHR5cGVzIG9mIHRlc3RpbmcgeW91IHNob3VsZCBkby4gSXQgZm9jdXNlcyBvbiB0ZXN0aW5nCisgICAgICAgIHN5c3RlbS13aWRlIGFzcGVjdHMgb2YgQW5kcm9pZCB0aGF0IGNhbiBhZmZlY3QgZXZlcnkgY29tcG9uZW50IGluIHlvdXIgYXBwbGljYXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmh0bWwiPgorICAgICAgICBBY3Rpdml0eSBUZXN0aW5nPC9hPiBmb2N1c2VzIG9uIHRlc3RpbmcgYWN0aXZpdGllcy4gSXQgZGVzY3JpYmVzIGhvdyBpbnN0cnVtZW50YXRpb24gYWxsb3dzCisgICAgICAgIHlvdSB0byBjb250cm9sIGFjdGl2aXRpZXMgb3V0c2lkZSB0aGUgbm9ybWFsIGFwcGxpY2F0aW9uIGxpZmVjeWNsZS4gSXQgYWxzbyBsaXN0cworICAgICAgICBhY3Rpdml0eS1zcGVjaWZpYyBmZWF0dXJlcyB5b3Ugc2hvdWxkIHRlc3QsIGFuZCBpdCBwcm92aWRlcyB0aXBzIGZvciB0ZXN0aW5nIEFuZHJvaWQKKyAgICAgICAgdXNlciBpbnRlcmZhY2VzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvY29udGVudHByb3ZpZGVyX3Rlc3RpbmcuaHRtbCI+CisgICAgICAgIENvbnRlbnQgUHJvdmlkZXIgVGVzdGluZzwvYT4gZm9jdXNlcyBvbiB0ZXN0aW5nIGNvbnRlbnQgcHJvdmlkZXJzLiBJdCBkZXNjcmliZXMgdGhlCisgICAgICAgIG1vY2sgc3lzdGVtIG9iamVjdHMgeW91IGNhbiB1c2UsIHByb3ZpZGVzIHRpcHMgZm9yIGRlc2lnbmluZyBwcm92aWRlcnMgc28gdGhhdCB0aGV5CisgICAgICAgIGNhbiBiZSB0ZXN0ZWQsIGFuZCBsaXN0cyBwcm92aWRlci1zcGVjaWZpYyBmZWF0dXJlcyB5b3Ugc2hvdWxkIHRlc3QuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+CisgICAgICAgIFNlcnZpY2UgVGVzdGluZzwvYT4gZm9jdXNlcyBvbiB0ZXN0aW5nIHNlcnZpY2VzLiBJdCBhbHNvIGxpc3RzIHNlcnZpY2Utc3BlY2lmaWMgZmVhdHVyZXMKKyAgICAgICAgeW91IHNob3VsZCB0ZXN0LgorICAgIDwvbGk+Cis8L3VsPgorPGg0PlByb2NlZHVyZXM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPiBkZXNjcmliZXMgaG93IHRvIGNyZWF0ZSBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2Ugd2l0aCBBRFQuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgICAgIFRlc3RpbmcgaW4gb3RoZXIgSURFczwvYT4gZGVzY3JpYmVzIGhvdyB0byBjcmVhdGUgYW5kIHJ1biB0ZXN0cyB3aXRoIGNvbW1hbmQtbGluZSB0b29scy4KKyAgICA8L2xpPgorPC91bD4KKzxoND5UdXRvcmlhbHM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+CisgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEZvciBhIG1vcmUgYWR2YW5jZWQgdHV0b3JpYWwsIHRyeQorICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4sCisgICAgICAgIHdoaWNoIGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvLgorICAgIDwvbGk+Cis8L3VsPgorPGg0PlNhbXBsZXM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWRUZXN0Lmh0bWwiPk5vdGUgUGFkIFByb3ZpZGVyCisgICAgICAgIFRlc3Q8L2E+IGlzIGEgdGVzdCBwYWNrYWdlIGZvciB0aGUKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWQuaHRtbCI+Tm90ZSBQYWQ8L2E+IHNhbXBsZQorICAgICAgICBhcHBsaWNhdGlvbi4gSXQgcHJvdmlkZXMgYSBzaW1wbGUgZXhhbXBsZSBvZiB1bml0IHRlc3RpbmcKKyAgICAgICAgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvQWxhcm1TZXJ2aWNlVGVzdC5odG1sIj5BbGFybSBTZXJ2aWNlIFRlc3Q8L2E+CisgICAgICAgIGlzIGEgdGVzdCBwYWNrYWdlIGZvciB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL0FsYXJtLmh0bWwiPkFsYXJtPC9hPgorICAgICAgICBzYW1wbGUgYXBwbGljYXRpb24uIEl0IHByb3ZpZGVzIGEgc2ltcGxlIGV4YW1wbGUgb2YgdW5pdAorICAgICAgICB0ZXN0aW5nIGEge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LgorICAgIDwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3NlcnZpY2VfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3OWYzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuamQKQEAgLTAsMCArMSwxNzggQEAKK3BhZ2UudGl0bGU9U2VydmljZSBUZXN0aW5nCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKyAgPGRpdiBpZD0icXYiPgorICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CisgIDxvbD4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNEZXNpZ25BbmRUZXN0Ij5TZXJ2aWNlIERlc2lnbiBhbmQgVGVzdGluZzwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI1NlcnZpY2VUZXN0Q2FzZSI+U2VydmljZVRlc3RDYXNlPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNUZXN0QXJlYXMiPldoYXQgdG8gVGVzdDwvYT4KKyAgICA8L2xpPgorICA8L29sPgorICA8aDI+S2V5IENsYXNzZXM8L2gyPgorICAgIDxvbD4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHR9PC9saT4KKyAgICA8L29sPgorICA8aDI+UmVsYXRlZCBUdXRvcmlhbHM8L2gyPgorICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj4KKyAgICAgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KKyAgICAgICAgPC9saT4KKyAgICA8L29sPgorICA8aDI+U2VlIEFsc288L2gyPgorICAgICAgPG9sPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgICAgIDwvbGk+CisgICAgICA8L29sPgorICA8L2Rpdj4KKzwvZGl2PgorPHA+CisgICAgQW5kcm9pZCBwcm92aWRlcyBhIHRlc3RpbmcgZnJhbWV3b3JrIGZvciBTZXJ2aWNlIG9iamVjdHMgdGhhdCBjYW4gcnVuIHRoZW0gaW4KKyAgICBpc29sYXRpb24gYW5kIHByb3ZpZGVzIG1vY2sgb2JqZWN0cy4gVGhlIHRlc3QgY2FzZSBjbGFzcyBmb3IgU2VydmljZSBvYmplY3RzIGlzCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9LiBTaW5jZSB0aGUgU2VydmljZSBjbGFzcyBhc3N1bWVzIHRoYXQgaXQgaXMgc2VwYXJhdGUKKyAgICBmcm9tIGl0cyBjbGllbnRzLCB5b3UgY2FuIHRlc3QgYSBTZXJ2aWNlIG9iamVjdCB3aXRob3V0IHVzaW5nIGluc3RydW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRlY2huaXF1ZXMgZm9yIHRlc3RpbmcgU2VydmljZSBvYmplY3RzLiBJZiB5b3UgYXJlbid0IGZhbWlsaWFyIHdpdGggdGhlCisgICAgU2VydmljZSBjbGFzcywgcGxlYXNlIHJlYWQgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuaHRtbCI+CisgICAgQXBwbGljYXRpb24gRnVuZGFtZW50YWxzPC9hPi4gSWYgeW91IGFyZW4ndCBmYW1pbGlhciB3aXRoIEFuZHJvaWQgdGVzdGluZywgcGxlYXNlIHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPiwKKyAgICB0aGUgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgYW5kIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuCis8L3A+Cis8aDIgaWQ9IkRlc2lnbkFuZFRlc3QiPlNlcnZpY2UgRGVzaWduIGFuZCBUZXN0aW5nPC9oMj4KKzxwPgorICAgIFdoZW4geW91IGRlc2lnbiBhIFNlcnZpY2UsIHlvdSBzaG91bGQgY29uc2lkZXIgaG93IHlvdXIgdGVzdHMgY2FuIGV4YW1pbmUgdGhlIHZhcmlvdXMgc3RhdGVzCisgICAgb2YgdGhlIFNlcnZpY2UgbGlmZWN5Y2xlLiBJZiB0aGUgbGlmZWN5Y2xlIG1ldGhvZHMgdGhhdCBzdGFydCB1cCB5b3VyIFNlcnZpY2UsIHN1Y2ggYXMKKyAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSgpIG9uQ3JlYXRlKCl9IG9yCisgICAge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydENvbW1hbmQoSW50ZW50LCBpbnQsIGludCkgb25TdGFydENvbW1hbmQoKX0gZG8gbm90IG5vcm1hbGx5CisgICAgc2V0IGEgZ2xvYmFsIHZhcmlhYmxlIHRvIGluZGljYXRlIHRoYXQgdGhleSB3ZXJlIHN1Y2Nlc3NmdWwsIHlvdSBtYXkgd2FudCB0byBwcm92aWRlIHN1Y2ggYQorICAgIHZhcmlhYmxlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorPC9wPgorPHA+CisgICAgTW9zdCBvdGhlciB0ZXN0aW5nIGlzIGZhY2lsaXRhdGVkIGJ5IHRoZSBtZXRob2RzIGluIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0KKyAgICB0ZXN0IGNhc2UgY2xhc3MuIEZvciBleGFtcGxlLCB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2UjZ2V0U2VydmljZSgpfSBtZXRob2QKKyAgICByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBTZXJ2aWNlIHVuZGVyIHRlc3QsIHdoaWNoIHlvdSBjYW4gdGVzdCB0byBjb25maXJtIHRoYXQgdGhlIFNlcnZpY2UgaXMKKyAgICBydW5uaW5nIGV2ZW4gYXQgdGhlIGVuZCBvZiB5b3VyIHRlc3RzLgorPC9wPgorPGgyIGlkPSJTZXJ2aWNlVGVzdENhc2UiPlNlcnZpY2VUZXN0Q2FzZTwvaDI+Cis8cD4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZX0gY2xhc3MKKyAgICB3aXRoIHdpdGggbWV0aG9kcyBmb3IgdGVzdGluZyBhcHBsaWNhdGlvbiBwZXJtaXNzaW9ucyBhbmQgZm9yIGNvbnRyb2xsaW5nIHRoZSBhcHBsaWNhdGlvbiBhbmQKKyAgICBTZXJ2aWNlIHVuZGVyIHRlc3QuIEl0IGFsc28gcHJvdmlkZXMgbW9jayBhcHBsaWNhdGlvbiBhbmQgQ29udGV4dCBvYmplY3RzIHRoYXQgaXNvbGF0ZSB5b3VyCisgICAgdGVzdCBmcm9tIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCis8L3A+Cis8cD4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gZGVmZXJzIGluaXRpYWxpemF0aW9uIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IHVudGlsIHlvdQorICAgIGNhbGwge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc3RhcnRTZXJ2aWNlKEludGVudCkgU2VydmljZVRlc3RDYXNlLnN0YXJ0U2VydmljZSgpfSBvcgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlI2JpbmRTZXJ2aWNlKEludGVudCkgU2VydmljZVRlc3RDYXNlLmJpbmRTZXJ2aWNlKCl9LiBUaGlzCisgICAgYWxsb3dzIHlvdSB0byBzZXQgdXAgeW91ciB0ZXN0IGVudmlyb25tZW50LCBwYXJ0aWN1bGFybHkgeW91ciBtb2NrIG9iamVjdHMsIGJlZm9yZSB0aGUgU2VydmljZQorICAgIGlzIHN0YXJ0ZWQuCis8L3A+Cis8cD4KKyAgICBOb3RpY2UgdGhhdCB0aGUgcGFyYW1ldGVycyB0byA8Y29kZT5TZXJ2aWNlVGVzdENhc2UuYmluZFNlcnZpY2UoKTwvY29kZT5hcmUgZGlmZmVyZW50IGZyb20KKyAgICB0aG9zZSBmb3IgPGNvZGU+U2VydmljZS5iaW5kU2VydmljZSgpPC9jb2RlPi4gRm9yIHRoZSA8Y29kZT5TZXJ2aWNlVGVzdENhc2U8L2NvZGU+IHZlcnNpb24sCisgICAgeW91IG9ubHkgcHJvdmlkZSBhbiBJbnRlbnQuIEluc3RlYWQgb2YgcmV0dXJuaW5nIGEgYm9vbGVhbiwKKyAgICA8Y29kZT5TZXJ2aWNlVGVzdENhc2UuYmluZFNlcnZpY2UoKTwvY29kZT4gcmV0dXJucyBhbiBvYmplY3QgdGhhdCBzdWJjbGFzc2VzCisgICAge0BsaW5rIGFuZHJvaWQub3MuSUJpbmRlcn0uCis8L3A+Cis8cD4KKyAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc2V0VXAoKX0gbWV0aG9kIGZvciB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0KKyAgICBpcyBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdC4gSXQgc2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlIGJ5IG1ha2luZyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3lzdGVtCisgICAgQ29udGV4dCBiZWZvcmUgYW55IHRlc3QgbWV0aG9kcyB0b3VjaCBpdC4gWW91IGNhbiByZXRyaWV2ZSB0aGlzIENvbnRleHQgYnkgY2FsbGluZworICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlI2dldFN5c3RlbUNvbnRleHQoKX0uIElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgeW91IG11c3QKKyAgICBjYWxsIDxjb2RlPnN1cGVyLnNldFVwKCk8L2NvZGU+IGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIG92ZXJyaWRlLgorPC9wPgorPHA+CisgICAgVGhlIG1ldGhvZHMge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24pIHNldEFwcGxpY2F0aW9uKCl9CisgICAgYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlI3NldENvbnRleHQoQ29udGV4dCl9IHNldENvbnRleHQoKX0gYWxsb3cgeW91IHRvIHNldAorICAgIGEgbW9jayBDb250ZXh0IG9yIG1vY2sgQXBwbGljYXRpb24gKG9yIGJvdGgpIGZvciB0aGUgU2VydmljZSwgYmVmb3JlIHlvdSBzdGFydCBpdC4gVGhlc2UgbW9jaworICAgIG9iamVjdHMgYXJlIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+LgorPC9wPgorPHA+CisgICAgQnkgZGVmYXVsdCwge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9IHJ1bnMgdGhlIHRlc3QgbWV0aG9kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2UjdGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKX0sIHdoaWNoIGFzc2VydHMgdGhhdAorICAgIHRoZSBiYXNlIHRlc3QgY2FzZSBjbGFzcyBzdWNjZXNzZnVsbHkgc2V0IHVwIGEgQ29udGV4dCBiZWZvcmUgcnVubmluZy4KKzwvcD4KKzxoMiBpZD0iTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2gyPgorPHA+CisgICAgPGNvZGU+U2VydmljZVRlc3RDYXNlPC9jb2RlPiBhc3N1bWVzIHRoYXQgeW91IHdpbGwgdXNlIGEgbW9jayBDb250ZXh0IG9yIG1vY2sgQXBwbGljYXRpb24KKyAgICAob3IgYm90aCkgZm9yIHRoZSB0ZXN0IGVudmlyb25tZW50LiBUaGVzZSBvYmplY3RzIGlzb2xhdGUgdGhlIHRlc3QgZW52aXJvbm1lbnQgZnJvbSB0aGUKKyAgICByZXN0IG9mIHRoZSBzeXN0ZW0uIElmIHlvdSBkb24ndCBwcm92aWRlIHlvdXIgb3duIGluc3RhbmNlcyBvZiB0aGVzZSBvYmplY3RzIGJlZm9yZSB5b3UKKyAgICBzdGFydCB0aGUgU2VydmljZSwgdGhlbiB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gd2lsbCBjcmVhdGUgaXRzIG93biBpbnRlcm5hbAorICAgIGluc3RhbmNlcyBhbmQgaW5qZWN0IHRoZW0gaW50byB0aGUgU2VydmljZS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGJ5IGNyZWF0aW5nIGFuZAorICAgIGluamVjdGluZyB5b3VyIG93biBpbnN0YW5jZXMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBTZXJ2aWNlCis8L3A+Cis8cD4KKyAgICBUbyBpbmplY3QgYSBtb2NrIEFwcGxpY2F0aW9uIG9iamVjdCBpbnRvIHRoZSBTZXJ2aWNlIHVuZGVyIHRlc3QsIGZpcnN0IGNyZWF0ZSBhIHN1YmNsYXNzIG9mCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0uIDxjb2RlPk1vY2tBcHBsaWNhdGlvbjwvY29kZT4gaXMgYSBzdWJjbGFzcyBvZgorICAgIHtAbGluayBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbn0gaW4gd2hpY2ggYWxsIHRoZSBtZXRob2RzIHRocm93IGFuIEV4Y2VwdGlvbiwgc28gdG8gdXNlIGl0CisgICAgZWZmZWN0aXZlbHkgeW91IHN1YmNsYXNzIGl0IGFuZCBvdmVycmlkZSB0aGUgbWV0aG9kcyB5b3UgbmVlZC4gWW91IHRoZW4gaW5qZWN0IGl0IGludG8gdGhlCisgICAgU2VydmljZSB3aXRoIHRoZQorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlI3NldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uKSBzZXRBcHBsaWNhdGlvbigpfSBtZXRob2QuCisgICAgVGhpcyBtb2NrIG9iamVjdCBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIGFwcGxpY2F0aW9uIHZhbHVlcyB0aGF0IHRoZSBTZXJ2aWNlIHNlZXMsIGFuZAorICAgIGlzb2xhdGVzIGl0IGZyb20gdGhlIHJlYWwgc3lzdGVtLiBJbiBhZGRpdGlvbiwgYW55IGhpZGRlbiBkZXBlbmRlbmNpZXMgeW91ciBTZXJ2aWNlIGhhcyBvbgorICAgIGl0cyBhcHBsaWNhdGlvbiByZXZlYWwgdGhlbXNlbHZlcyBhcyBleGNlcHRpb25zIHdoZW4geW91IHJ1biB0aGUgdGVzdC4KKzwvcD4KKzxwPgorICAgIFlvdSBpbmplY3QgYSBtb2NrIENvbnRleHQgaW50byB0aGUgU2VydmljZSB1bmRlciB0ZXN0IHdpdGggdGhlCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2Ujc2V0Q29udGV4dChDb250ZXh0KSBzZXRDb250ZXh0KCl9IG1ldGhvZC4gVGhlIG1vY2sKKyAgICBDb250ZXh0IGNsYXNzZXMgeW91IGNhbiB1c2UgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNNb2NrT2JqZWN0Q2xhc3NlcyI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPGgyIGlkPSJUZXN0QXJlYXMiPldoYXQgdG8gVGVzdDwvaDI+Cis8cD4KKyAgICBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3doYXRfdG9fdGVzdC5odG1sIj5XaGF0IFRvIFRlc3Q8L2E+CisgICAgbGlzdHMgZ2VuZXJhbCBjb25zaWRlcmF0aW9ucyBmb3IgdGVzdGluZyBBbmRyb2lkIGNvbXBvbmVudHMuCisgICAgSGVyZSBhcmUgc29tZSBzcGVjaWZpYyBndWlkZWxpbmVzIGZvciB0ZXN0aW5nIGEgU2VydmljZToKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSgpfSBpcyBjYWxsZWQgaW4gcmVzcG9uc2UgdG8KKyAgICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0YXJ0U2VydmljZShJbnRlbnQpIENvbnRleHQuc3RhcnRTZXJ2aWNlKCl9IG9yCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2JpbmRTZXJ2aWNlKEludGVudCxTZXJ2aWNlQ29ubmVjdGlvbixpbnQpIENvbnRleHQuYmluZFNlcnZpY2UoKX0uCisgICAgICAgIFNpbWlsYXJseSwgeW91IHNob3VsZCBlbnN1cmUgdGhhdCB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkRlc3Ryb3koKX0gaXMgY2FsbGVkIGluCisgICAgICAgIHJlc3BvbnNlIHRvIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdG9wU2VydmljZShJbnRlbnQpIENvbnRleHQuc3RvcFNlcnZpY2UoKX0sCisgICAgICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCN1bmJpbmRTZXJ2aWNlKFNlcnZpY2VDb25uZWN0aW9uKSBDb250ZXh0LnVuYmluZFNlcnZpY2UoKX0sCisgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI3N0b3BTZWxmKCl9LCBvcgorICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNzdG9wU2VsZlJlc3VsdChpbnQpIHN0b3BTZWxmUmVzdWx0KCl9LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUZXN0IHRoYXQgeW91ciBTZXJ2aWNlIGNvcnJlY3RseSBoYW5kbGVzIG11bHRpcGxlIGNhbGxzIGZyb20KKyAgICAgICAgPGNvZGU+Q29udGV4dC5zdGFydFNlcnZpY2UoKTwvY29kZT4uIE9ubHkgdGhlIGZpcnN0IGNhbGwgdHJpZ2dlcnMKKyAgICAgICAgPGNvZGU+U2VydmljZS5vbkNyZWF0ZSgpPC9jb2RlPiwgYnV0IGFsbCBjYWxscyB0cmlnZ2VyIGEgY2FsbCB0bworICAgICAgICA8Y29kZT5TZXJ2aWNlLm9uU3RhcnRDb21tYW5kKCk8L2NvZGU+LgorICAgICAgICA8cD4KKyAgICAgICAgICAgIEluIGFkZGl0aW9uLCByZW1lbWJlciB0aGF0IDxjb2RlPnN0YXJ0U2VydmljZSgpPC9jb2RlPiBjYWxscyBkb24ndAorICAgICAgICAgICAgbmVzdCwgc28gYSBzaW5nbGUgY2FsbCB0byA8Y29kZT5Db250ZXh0LnN0b3BTZXJ2aWNlKCk8L2NvZGU+IG9yCisgICAgICAgICAgICA8Y29kZT5TZXJ2aWNlLnN0b3BTZWxmKCk8L2NvZGU+IChidXQgbm90IDxjb2RlPnN0b3BTZWxmKGludCk8L2NvZGU+KQorICAgICAgICAgICAgd2lsbCBzdG9wIHRoZSBTZXJ2aWNlLiBZb3Ugc2hvdWxkIHRlc3QgdGhhdCB5b3VyIFNlcnZpY2Ugc3RvcHMgYXQgdGhlIGNvcnJlY3QgcG9pbnQuCisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGVzdCBhbnkgYnVzaW5lc3MgbG9naWMgdGhhdCB5b3VyIFNlcnZpY2UgaW1wbGVtZW50cy4gQnVzaW5lc3MgbG9naWMgaW5jbHVkZXMgY2hlY2tpbmcgZm9yCisgICAgICAgIGludmFsaWQgdmFsdWVzLCBmaW5hbmNpYWwgYW5kIGFyaXRobWV0aWMgY2FsY3VsYXRpb25zLCBhbmQgc28gZm9ydGguCisgICAgPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZAppbmRleCA5MzVhYWY5Li4xZDVmOTExIDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuamQKQEAgLTEsNCArMSw0IEBACi1wYWdlLnRpdGxlPVRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbgorcGFnZS50aXRsZT1UZXN0aW5nIEZ1bmRhbWVudGFscwogQGpkOmJvZHkKIAogPGRpdiBpZD0icXYtd3JhcHBlciI+CkBAIC02LDY1ICs2LDYyIEBACiAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KICAgPG9sPgogICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI092ZXJ2aWV3Ij5PdmVydmlldzwvYT4KKyAgICAgICAgPGEgaHJlZj0iI1Rlc3RTdHJ1Y3R1cmUiPlRlc3QgU3RydWN0dXJlPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjVGVzdFByb2plY3RzIj5UZXN0IFByb2plY3RzPC9hPgogICAgIDwvbGk+CiAgICAgPGxpPgogICAgICAgPGEgaHJlZj0iI1Rlc3RBUEkiPlRoZSBUZXN0aW5nIEFQSTwvYT4KICAgICAgIDxvbD4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNFeHRlbnNpb25zIj5KVW5pdCB0ZXN0IGNhc2UgY2xhc3NlczwvYT4KKyAgICAgICAgICA8YSBocmVmPSIjSlVuaXQiPkpVbml0PC9hPgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvbiI+SW5zdHJ1bWVudGF0aW9uIHRlc3QgY2FzZSBjbGFzc2VzPC9hPgorICAgICAgICAgIDxhIGhyZWY9IiNJbnN0cnVtZW50YXRpb24iPkluc3RydW1lbnRhdGlvbjwvYT4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNBc3NlcnQiPkFzc2VydCBjbGFzc2VzPC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iI1Rlc3RDYXNlQ2xhc3NlcyI+VGVzdCBjYXNlIGNsYXNzZXM8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CisgICAgICAgICAgPGEgaHJlZj0iI0Fzc2VydGlvbkNsYXNzZXMiPkFzc2VydGlvbiBjbGFzc2VzPC9hPgogICAgICAgICA8L2xpPgotICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5JbnN0cnVtZW50YXRpb24gVGVzdCBSdW5uZXI8L2E+Ci0gICAgICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0iI01vY2tPYmplY3RDbGFzc2VzIj5Nb2NrIG9iamVjdCBjbGFzc2VzPC9hPgorICAgICAgICA8L2xpPgogICAgICAgPC9vbD4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgPGEgaHJlZj0iI1Rlc3RFbnZpcm9tZW50Ij5Xb3JraW5nIGluIHRoZSBUZXN0IEVudmlyb25tZW50PC9hPgorICAgICAgICA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+UnVubmluZyBUZXN0czwvYT4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI1Rlc3RBcmVhcyI+V2hhdCB0byBUZXN0PC9hPgorICAgICAgICA8YSBocmVmPSIjVGVzdFJlc3VsdHMiPlNlZWluZyBUZXN0IFJlc3VsdHM8L2E+CiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICA8YSBocmVmPSIjVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvYT4KLSAgICAgIDxvbD4KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2E+Ci0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjTm90b3VjaE1vZGUiPlR1cm5pbmcgb2ZmIHRvdWNoIG1vZGU8L2E+Ci0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIEVtdWxhdG9yIG9yIERldmljZTwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgIDwvb2w+CisgICAgICAgIDxhIGhyZWY9IiNNb25rZXlzIj5Nb25rZXkgYW5kIE1vbmtleVJ1bm5lcjwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICA8YSBocmVmPSIjUGFja2FnZU5hbWVzIj5Xb3JraW5nIFdpdGggUGFja2FnZSBOYW1lczwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI1doYXRUb1Rlc3QiPldoYXQgVG8gVGVzdDwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI05leHRTdGVwcyI+TmV4dCBTdGVwczwvYT4KICAgICA8L2xpPgogICA8L29sPgogICA8aDI+S2V5IGNsYXNzZXM8L2gyPgogICAgIDxvbD4KICAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9PC9saT4KLSAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfTwvbGk+Ci0gICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX08L2xpPgotICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuQXBwbGljYXRpb25UZXN0Q2FzZX08L2xpPgotICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9PC9saT4KLSAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3R9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9PC9saT4KKyAgICAgIDxsaT57QGxpbmsganVuaXQuZnJhbWV3b3JrfTwvbGk+CiAgICAgPC9vbD4KICAgPGgyPlJlbGF0ZWQgdHV0b3JpYWxzPC9oMj4KICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sIFRlc3Rpbmc8L2E+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPgorICAgICAgICAgICAgSGVsbG8sIFRlc3Rpbmc8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgpAQCAtNzMsNDQ1ICs3MCw1OTAgQEAKICAgPGgyPlNlZSBhbHNvPC9oMj4KICAgICAgIDxvbD4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4KICAgICAgICAgPC9saT4KICAgICAgIDwvb2w+CiAgIDwvZGl2PgogPC9kaXY+Ci0KLTxwPkFuZHJvaWQgaW5jbHVkZXMgYSBwb3dlcmZ1bCBzZXQgb2YgdGVzdGluZyB0b29scyB0aGF0IGV4dGVuZCB0aGUKLWluZHVzdHJ5LXN0YW5kYXJkIEpVbml0IHRlc3QgZnJhbWV3b3JrIHdpdGggZmVhdHVyZXMgc3BlY2lmaWMgdG8gdGhlIEFuZHJvaWQKLWVudmlyb25tZW50LiBBbHRob3VnaCB5b3UgY2FuIHRlc3QgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiB3aXRoIEpVbml0LCB0aGUKLUFuZHJvaWQgdG9vbHMgYWxsb3cgeW91IHRvIHdyaXRlIG11Y2ggbW9yZSBzb3BoaXN0aWNhdGVkIHRlc3RzIGZvciBldmVyeSBhc3BlY3QKLW9mIHlvdXIgYXBwbGljYXRpb24sIGJvdGggYXQgdGhlIHVuaXQgYW5kIGZyYW1ld29yayBsZXZlbHMuPC9wPgotCi08cD5LZXkgZmVhdHVyZXMgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudCBpbmNsdWRlOjwvcD4KLQorPHA+CisgICAgVGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmssIGFuIGludGVncmFsIHBhcnQgb2YgdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50LAorICAgIHByb3ZpZGVzIGFuIGFyY2hpdGVjdHVyZSBhbmQgcG93ZXJmdWwgdG9vbHMgdGhhdCBoZWxwIHlvdSB0ZXN0IGV2ZXJ5IGFzcGVjdCBvZiB5b3VyIGFwcGxpY2F0aW9uCisgICAgYXQgZXZlcnkgbGV2ZWwgZnJvbSB1bml0IHRvIGZyYW1ld29yay4KKzwvcD4KKzxwPgorICAgIFRoZSB0ZXN0aW5nIGZyYW1ld29yayBoYXMgdGhlc2Uga2V5IGZlYXR1cmVzOgorPC9wPgogPHVsPgotICA8bGk+QW5kcm9pZCBleHRlbnNpb25zIHRvIHRoZSBKVW5pdCBmcmFtZXdvcmsgdGhhdCBwcm92aWRlIGFjY2VzcyB0byBBbmRyb2lkCi1zeXN0ZW0gb2JqZWN0cy48L2xpPgotICA8bGk+QW4gaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0aGF0IGxldHMgdGVzdHMgY29udHJvbCBhbmQgZXhhbWluZSB0aGUKLWFwcGxpY2F0aW9uLjwvbGk+Ci0gIDxsaT5Nb2NrIHZlcnNpb25zIG9mIGNvbW1vbmx5LXVzZWQgQW5kcm9pZCBzeXN0ZW0gb2JqZWN0cy48L2xpPgotICA8bGk+VG9vbHMgZm9yIHJ1bm5pbmcgc2luZ2xlIHRlc3RzIG9yIHRlc3Qgc3VpdGVzLCB3aXRoIG9yIHdpdGhvdXQKLWluc3RydW1lbnRhdGlvbi48L2xpPgotICA8bGk+U3VwcG9ydCBmb3IgbWFuYWdpbmcgdGVzdHMgYW5kIHRlc3QgcHJvamVjdHMgaW4gdGhlIEFEVCBQbHVnaW4gZm9yIEVjbGlwc2UKLWFuZCBhdCB0aGUgY29tbWFuZCBsaW5lLjwvbGk+CisgICAgPGxpPgorICAgICAgICBBbmRyb2lkIHRlc3Qgc3VpdGVzIGFyZSBiYXNlZCBvbiBKVW5pdC4gWW91IGNhbiB1c2UgcGxhaW4gSlVuaXQgdG8gdGVzdCBhIGNsYXNzIHRoYXQgZG9lc24ndAorICAgICAgICBjYWxsIHRoZSBBbmRyb2lkIEFQSSwgb3IgQW5kcm9pZCdzIEpVbml0IGV4dGVuc2lvbnMgdG8gdGVzdCBBbmRyb2lkIGNvbXBvbmVudHMuIElmIHlvdSdyZQorICAgICAgICBuZXcgdG8gQW5kcm9pZCB0ZXN0aW5nLCB5b3UgY2FuIHN0YXJ0IHdpdGggZ2VuZXJhbC1wdXJwb3NlIHRlc3QgY2FzZSBjbGFzc2VzIHN1Y2ggYXMge0BsaW5rCisgICAgICAgIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9IGFuZCB0aGVuIGdvIG9uIHRvIHVzZSBtb3JlIHNvcGhpc3RpY2F0ZWQgY2xhc3Nlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIEFuZHJvaWQgSlVuaXQgZXh0ZW5zaW9ucyBwcm92aWRlIGNvbXBvbmVudC1zcGVjaWZpYyB0ZXN0IGNhc2UgY2xhc3Nlcy4gVGhlc2UgY2xhc3NlcworICAgICAgICBwcm92aWRlIGhlbHBlciBtZXRob2RzIGZvciBjcmVhdGluZyBtb2NrIG9iamVjdHMgYW5kIG1ldGhvZHMgdGhhdCBoZWxwIHlvdSBjb250cm9sIHRoZQorICAgICAgICBsaWZlY3ljbGUgb2YgYSBjb21wb25lbnQuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3Qgc3VpdGVzIGFyZSBjb250YWluZWQgaW4gdGVzdCBwYWNrYWdlcyB0aGF0IGFyZSBzaW1pbGFyIHRvIG1haW4gYXBwbGljYXRpb24gcGFja2FnZXMsIHNvCisgICAgICAgIHlvdSBkb24ndCBuZWVkIHRvIGxlYXJuIGEgbmV3IHNldCBvZiB0b29scyBvciB0ZWNobmlxdWVzIGZvciBkZXNpZ25pbmcgYW5kIGJ1aWxkaW5nIHRlc3RzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgU0RLIHRvb2xzIGZvciBidWlsZGluZyBhbmQgdGVzdHMgYXJlIGF2YWlsYWJsZSBpbiBFY2xpcHNlIHdpdGggQURULCBhbmQgYWxzbyBpbgorICAgICAgICBjb21tYW5kLWxpbmUgZm9ybSBmb3IgdXNlIHdpdGggb3RoZXIgSURFUy4gVGhlc2UgdG9vbHMgZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIHByb2plY3Qgb2YKKyAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIHRoZSBidWlsZCBmaWxlcywKKyAgICAgICAgbWFuaWZlc3QgZmlsZSwgYW5kIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSBTREsgYWxzbyBwcm92aWRlcworICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvbW9ua2V5cnVubmVyLmh0bWwiPk1vbmtleVJ1bm5lcjwvYT4sIGFuIEFQSSBmb3IKKyAgICAgICAgdGVzdGluZyBkZXZpY2VzIHdpdGggSnl0aG9uIHNjcmlwdHMsIGFuZCA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9tb25rZXkuaHRtbCI+TW9ua2V5PC9hPiwgYSBjb21tYW5kLWxpbmUgdG9vbCBmb3IKKyAgICAgICAgc3RyZXNzLXRlc3RpbmcgVUlzIGJ5IHNlbmRpbmcgcHNldWRvLXJhbmRvbSBldmVudHMgdG8gYSBkZXZpY2UuCisgICAgPC9saT4KIDwvdWw+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudCBhbmQgdGhlIHdheQoteW91IHVzZSBpdC4gVGhlIGRvY3VtZW50IGFzc3VtZXMgeW91IGhhdmUgYSBiYXNpYyBrbm93bGVkZ2Ugb2YgQW5kcm9pZAotYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgYW5kIEpVbml0IHRlc3RpbmcgbWV0aG9kb2xvZ3kuPC9wPgotCi08aDIgaWQ9Ik92ZXJ2aWV3Ij5PdmVydmlldzwvaDI+Ci0KLTxwPiBBdCB0aGUgaGVhcnQgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBhbiBpbnN0cnVtZW50YXRpb24KLWZyYW1ld29yayB0aGF0IHlvdXIgdGVzdCBhcHBsaWNhdGlvbiB1c2VzIHRvIHByZWNpc2VseSBjb250cm9sIHRoZSBhcHBsaWNhdGlvbgotdW5kZXIgdGVzdC4gV2l0aCBpbnN0cnVtZW50YXRpb24sIHlvdSBjYW4gc2V0IHVwIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcwotQ29udGV4dHMgYmVmb3JlIHRoZSBtYWluIGFwcGxpY2F0aW9uIHN0YXJ0cywgY29udHJvbCB5b3VyIGFwcGxpY2F0aW9uIGF0IHZhcmlvdXMKLXBvaW50cyBvZiBpdHMgbGlmZWN5Y2xlLCBzZW5kIFVJIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24sIGFuZCBleGFtaW5lIHRoZQotYXBwbGljYXRpb24ncyBzdGF0ZSBkdXJpbmcgaXRzIGV4ZWN1dGlvbi4gVGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsKLWFjY29tcGxpc2hlcyB0aGlzIGJ5IHJ1bm5pbmcgYm90aCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBhbmQgdGhlIHRlc3QgYXBwbGljYXRpb24KLWluIHRoZSBzYW1lIHByb2Nlc3MuIDwvcD4KLQotPHA+WW91ciB0ZXN0IGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBieSBtZWFucyBvZiBhbgotPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvaW5zdHJ1bWVudGF0aW9uLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+PC9hPgotZWxlbWVudCBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50Ci1zcGVjaWZ5IHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIGFsc28gdGVsbCBBbmRyb2lkIGhvdwotdG8gcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLiBJbnN0cnVtZW50YXRpb24gaXMgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZQotc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QKLVJ1bm5lcjwvYT4uPC9wPgotCi08cD5UaGUgZm9sbG93aW5nIGRpYWdyYW0gc3VtbWFyaXplcyB0aGUgQW5kcm9pZCB0ZXN0aW5nIGVudmlyb25tZW50OjwvcD4KLQotPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZyIvPgotCi08cD5JbiBBbmRyb2lkLCB0ZXN0IGFwcGxpY2F0aW9ucyBhcmUgdGhlbXNlbHZlcyBBbmRyb2lkIGFwcGxpY2F0aW9ucywgc28geW91Ci13cml0ZSB0aGVtIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHRoZSBhcHBsaWNhdGlvbiB5b3UgYXJlIHRlc3RpbmcuIFRoZSBTREsKLXRvb2xzIGhlbHAgeW91IGNyZWF0ZSBhIG1haW4gYXBwbGljYXRpb24gcHJvamVjdCBhbmQgaXRzIHRlc3QgcHJvamVjdCBhdCB0aGUgc2FtZQotdGltZS4gWW91IGNhbiBydW4gQW5kcm9pZCB0ZXN0cyB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCBvciBmcm9tIHRoZSBjb21tYW5kCi1saW5lLiBFY2xpcHNlIHdpdGggQURUIHByb3ZpZGVzIGFuIGV4dGVuc2l2ZSBzZXQgb2YgdG9vbHMgZm9yIGNyZWF0aW5nIHRlc3RzLAotcnVubmluZyB0aGVtLCBhbmQgdmlld2luZyB0aGVpciByZXN1bHRzLiBZb3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT5hZGI8L2NvZGU+Ci10b29sIHRvIHJ1biB0ZXN0cywgb3IgdXNlIGEgYnVpbHQtaW4gQW50IHRhcmdldC48L3A+Ci0KLTxwPlRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYW5kIHJ1biB0ZXN0cyBpbiBFY2xpcHNlLCBwbGVhc2UgcmVmZXIgdG8gPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KLUVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlcgotSURFczwvYT4uPC9wPgotCi08cD5JZiB5b3Ugd2FudCBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gQW5kcm9pZCB0ZXN0aW5nLCB0cnkgb25lIG9mIHRoZQotdGVzdGluZyB0dXRvcmlhbHM6PC9wPgotCi08dWw+Ci0gIDxsaT5UaGUgPGEKLWhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCi1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMgaW4gdGhlCi1jb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uPC9saT4KLSAgPGxpPlRoZSA8YQotaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5Ci1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpcyBhbiBleGNlbGxlbnQgZm9sbG93LXVwIHRvIHRoZSBIZWxsbywgVGVzdGluZyB0dXRvcmlhbC4KLUl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCi1tb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi48L2xpPgotPC91bD4KLQorPHA+CisgICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGZ1bmRhbWVudGFscyBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yaywgaW5jbHVkaW5nIHRoZQorICAgIHN0cnVjdHVyZSBvZiB0ZXN0cywgdGhlIEFQSXMgdGhhdCB5b3UgdXNlIHRvIGRldmVsb3AgdGVzdHMsIGFuZCB0aGUgdG9vbHMgdGhhdCB5b3UgdXNlIHRvIHJ1bgorICAgIHRlc3RzIGFuZCB2aWV3IHJlc3VsdHMuIFRoZSBkb2N1bWVudCBhc3N1bWVzIHlvdSBoYXZlIGEgYmFzaWMga25vd2xlZGdlIG9mIEFuZHJvaWQgYXBwbGljYXRpb24KKyAgICBwcm9ncmFtbWluZyBhbmQgSlVuaXQgdGVzdGluZyBtZXRob2RvbG9neS4KKzwvcD4KKzxwPgorICAgIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzdW1tYXJpemVzIHRoZSB0ZXN0aW5nIGZyYW1ld29yazoKKzwvcD4KKzxkaXYgc3R5bGU9IndpZHRoOiA3MCU7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyI+Cis8YSBocmVmPSJ7QGRvY1Jvb3R9aW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nIj4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZyIKKyAgICAgICAgYWx0PSJUaGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayIvPgorPC9hPgorPC9kaXY+Cis8aDIgaWQ9IlRlc3RTdHJ1Y3R1cmUiPlRlc3QgU3RydWN0dXJlPC9oMj4KKzxwPgorICAgIEFuZHJvaWQncyBidWlsZCBhbmQgdGVzdCB0b29scyBhc3N1bWUgdGhhdCB0ZXN0IHByb2plY3RzIGFyZSBvcmdhbml6ZWQgaW50byBhIHN0YW5kYXJkCisgICAgc3RydWN0dXJlIG9mIHRlc3RzLCB0ZXN0IGNhc2UgY2xhc3NlcywgdGVzdCBwYWNrYWdlcywgYW5kIHRlc3QgcHJvamVjdHMuCis8L3A+Cis8cD4KKyAgICBBbmRyb2lkIHRlc3RpbmcgaXMgYmFzZWQgb24gSlVuaXQuIEluIGdlbmVyYWwsIGEgSlVuaXQgdGVzdCBpcyBhIG1ldGhvZCB3aG9zZQorICAgIHN0YXRlbWVudHMgdGVzdCBhIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFlvdSBvcmdhbml6ZSB0ZXN0IG1ldGhvZHMgaW50byBjbGFzc2VzCisgICAgY2FsbGVkIHRlc3QgY2FzZXMgKG9yIHRlc3Qgc3VpdGVzKS4gRWFjaCB0ZXN0IGlzIGFuIGlzb2xhdGVkIHRlc3Qgb2YgYW4gaW5kaXZpZHVhbCBtb2R1bGUgaW4KKyAgICB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gRWFjaCBjbGFzcyBpcyBhIGNvbnRhaW5lciBmb3IgcmVsYXRlZCB0ZXN0IG1ldGhvZHMsIGFsdGhvdWdoIGl0CisgICAgb2Z0ZW4gcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgYXMgd2VsbC4KKzwvcD4KKzxwPgorICAgIEluIEpVbml0LCB5b3UgYnVpbGQgb25lIG9yIG1vcmUgdGVzdCBzb3VyY2UgZmlsZXMgaW50byBhIGNsYXNzIGZpbGUuIFNpbWlsYXJseSwgaW4gQW5kcm9pZCB5b3UKKyAgICB1c2UgdGhlIFNESydzIGJ1aWxkIHRvb2xzIHRvIGJ1aWxkIG9uZSBvciBtb3JlIHRlc3Qgc291cmNlIGZpbGVzIGludG8gY2xhc3MgZmlsZXMgaW4gYW4KKyAgICBBbmRyb2lkIHRlc3QgcGFja2FnZS4gSW4gSlVuaXQsIHlvdSB1c2UgYSB0ZXN0IHJ1bm5lciB0byBleGVjdXRlIHRlc3QgY2xhc3Nlcy4gSW4gQW5kcm9pZCwgeW91CisgICAgdXNlIHRlc3QgdG9vbHMgdG8gbG9hZCB0aGUgdGVzdCBwYWNrYWdlIGFuZCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgYW5kIHRoZSB0b29scyB0aGVuCisgICAgZXhlY3V0ZSBhbiBBbmRyb2lkLXNwZWNpZmljIHRlc3QgcnVubmVyLgorPC9wPgorPGgyIGlkPSJUZXN0UHJvamVjdHMiPlRlc3QgUHJvamVjdHM8L2gyPgorPHA+CisgICAgVGVzdHMsIGxpa2UgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGFyZSBvcmdhbml6ZWQgaW50byBwcm9qZWN0cy4KKzwvcD4KKzxwPgorICAgIEEgdGVzdCBwcm9qZWN0IGlzIGEgZGlyZWN0b3J5IG9yIEVjbGlwc2UgcHJvamVjdCBpbiB3aGljaCB5b3UgY3JlYXRlIHRoZSBzb3VyY2UgY29kZSwgbWFuaWZlc3QKKyAgICBmaWxlLCBhbmQgb3RoZXIgZmlsZXMgZm9yIGEgdGVzdCBwYWNrYWdlLiBUaGUgQW5kcm9pZCBTREsgY29udGFpbnMgdG9vbHMgZm9yIEVjbGlwc2Ugd2l0aCBBRFQKKyAgICBhbmQgZm9yIHRoZSBjb21tYW5kIGxpbmUgdGhhdCBjcmVhdGUgYW5kIHVwZGF0ZSB0ZXN0IHByb2plY3RzIGZvciB5b3UuIFRoZSB0b29scyBjcmVhdGUgdGhlCisgICAgZGlyZWN0b3JpZXMgeW91IHVzZSBmb3Igc291cmNlIGNvZGUgYW5kIHJlc291cmNlcyBhbmQgdGhlIG1hbmlmZXN0IGZpbGUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuCisgICAgVGhlIGNvbW1hbmQtbGluZSB0b29scyBhbHNvIGNyZWF0ZSB0aGUgQW50IGJ1aWxkIGZpbGVzIHlvdSBuZWVkLgorPC9wPgorPHA+CisgICAgWW91IHNob3VsZCBhbHdheXMgdXNlIEFuZHJvaWQgdG9vbHMgdG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0LiBBbW9uZyBvdGhlciBiZW5lZml0cywKKyAgICB0aGUgdG9vbHM6Cis8L3A+CisgICAgPHVsPgorICAgICAgICA8bGk+CisgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IHNldCB1cCB5b3VyIHRlc3QgcGFja2FnZSB0byB1c2UKKyAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gYXMgdGhlIHRlc3QgY2FzZSBydW5uZXIuIFlvdSBtdXN0IHVzZQorICAgICAgICAgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gKG9yIGEgc3ViY2xhc3MpIHRvIHJ1biBKVW5pdCB0ZXN0cy4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgQ3JlYXRlIGFuIGFwcHJvcHJpYXRlIG5hbWUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuIElmIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgdW5kZXIgdGVzdCBoYXMgYSBwYWNrYWdlIG5hbWUgb2YgPGNvZGU+Y29tLm15ZG9tYWluLm15YXBwPC9jb2RlPiwgdGhlbiB0aGUKKyAgICAgICAgICAgIEFuZHJvaWQgdG9vbHMgc2V0IHRoZSB0ZXN0IHBhY2thZ2UgbmFtZSB0byA8Y29kZT5jb20ubXlkb21haW4ubXlhcHAudGVzdDwvY29kZT4uIFRoaXMKKyAgICAgICAgICAgIGhlbHBzIHlvdSBpZGVudGlmeSB0aGVpciByZWxhdGlvbnNoaXAsIHdoaWxlIHByZXZlbnRpbmcgY29uZmxpY3RzIHdpdGhpbiB0aGUgc3lzdGVtLgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IGNyZWF0ZSB0aGUgcHJvcGVyIGJ1aWxkIGZpbGVzLCBtYW5pZmVzdCBmaWxlLCBhbmQgZGlyZWN0b3J5CisgICAgICAgICAgICBzdHJ1Y3R1cmUgZm9yIHRoZSB0ZXN0IHByb2plY3QuIFRoaXMgaGVscHMgeW91IHRvIGJ1aWxkIHRoZSB0ZXN0IHBhY2thZ2Ugd2l0aG91dAorICAgICAgICAgICAgaGF2aW5nIHRvIG1vZGlmeSBidWlsZCBmaWxlcyBhbmQgc2V0cyB1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIHlvdXIgdGVzdCBwYWNrYWdlIGFuZAorICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgICAgICAgICAgICBUaGUKKyAgICAgICAgPC9saT4KKyAgICA8L3VsPgorPHA+CisgICAgWW91IGNhbiBjcmVhdGUgYSB0ZXN0IHByb2plY3QgYW55d2hlcmUgaW4geW91ciBmaWxlIHN5c3RlbSwgYnV0IHRoZSBiZXN0IGFwcHJvYWNoIGlzIHRvCisgICAgYWRkIHRoZSB0ZXN0IHByb2plY3Qgc28gdGhhdCBpdHMgcm9vdCBkaXJlY3RvcnkgPGNvZGU+dGVzdHMvPC9jb2RlPiBpcyBhdCB0aGUgc2FtZSBsZXZlbAorICAgIGFzIHRoZSA8Y29kZT5zcmMvPC9jb2RlPiBkaXJlY3Rvcnkgb2YgdGhlIG1haW4gYXBwbGljYXRpb24ncyBwcm9qZWN0LiBUaGlzIGhlbHBzIHlvdSBmaW5kIHRoZQorICAgIHRlc3RzIGFzc29jaWF0ZWQgd2l0aCBhbiBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgYXBwbGljYXRpb24gcHJvamVjdCdzIHJvb3QgZGlyZWN0b3J5CisgICAgaXMgPGNvZGU+TXlQcm9qZWN0PC9jb2RlPiwgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmU6Cis8L3A+Cis8cHJlIGNsYXNzPSJjbGFzc2ljIG5vLXByZXR0eS1wcmludCI+CisgIE15UHJvamVjdC8KKyAgICAgIEFuZHJvaWRNYW5pZmVzdC54bWwKKyAgICAgIHJlcy8KKyAgICAgICAgICAuLi4gKHJlc291cmNlcyBmb3IgbWFpbiBhcHBsaWNhdGlvbikKKyAgICAgIHNyYy8KKyAgICAgICAgICAuLi4gKHNvdXJjZSBjb2RlIGZvciBtYWluIGFwcGxpY2F0aW9uKSAuLi4KKyAgICAgIHRlc3RzLworICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC54bWwKKyAgICAgICAgICByZXMvCisgICAgICAgICAgICAgIC4uLiAocmVzb3VyY2VzIGZvciB0ZXN0cykKKyAgICAgICAgICBzcmMvCisgICAgICAgICAgICAgIC4uLiAoc291cmNlIGNvZGUgZm9yIHRlc3RzKQorPC9wcmU+CiA8aDIgaWQ9IlRlc3RBUEkiPlRoZSBUZXN0aW5nIEFQSTwvaDI+CiA8cD4KLSAgICBGb3Igd3JpdGluZyB0ZXN0cyBhbmQgdGVzdCBhcHBsaWNhdGlvbnMgaW4gdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIEFuZHJvaWQgcHJvdmlkZXMgYQotICAgIHRlc3RpbmcgQVBJIHRoYXQgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgSlVuaXQgdGVzdCBmcmFtZXdvcmsuIEFkZGluZyB0byB0aGF0LCBBbmRyb2lkIGluY2x1ZGVzCi0gICAgYSBwb3dlcmZ1bCBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrIHRoYXQgbGV0cyB5b3VyIHRlc3RzIGFjY2VzcyB0aGUgc3RhdGUgYW5kIHJ1bnRpbWUgb2JqZWN0cwotICAgIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0cy4KKyAgICBUaGUgQW5kcm9pZCB0ZXN0aW5nIEFQSSBpcyBiYXNlZCBvbiB0aGUgSlVuaXQgQVBJIGFuZCBleHRlbmRlZCB3aXRoIGEgaW5zdHJ1bWVudGF0aW9uCisgICAgZnJhbWV3b3JrIGFuZCBBbmRyb2lkLXNwZWNpZmljIHRlc3RpbmcgY2xhc3Nlcy4KIDwvcD4KLTxwPlRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSB0aGUgbWFqb3IgY29tcG9uZW50cyBvZiB0aGUgdGVzdGluZyBBUEkgYXZhaWxhYmxlIGluIEFuZHJvaWQuPC9wPgotPGgzIGlkPSJFeHRlbnNpb25zIj5KVW5pdCB0ZXN0IGNhc2UgY2xhc3NlczwvaDM+Cis8aDMgaWQ9IkpVbml0Ij5KVW5pdDwvaDM+CiA8cD4KLSAgU29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgdGVzdGluZyBBUEkgZXh0ZW5kIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBidXQgZG8gbm90IHVzZSB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4gVGhlc2UgY2xhc3NlcwotICBjb250YWluIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBzeXN0ZW0gb2JqZWN0cyBzdWNoIGFzIHRoZSBDb250ZXh0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBXaXRoIHRoaXMgQ29udGV4dCwgeW91IGNhbiBsb29rIGF0IGl0cyByZXNvdXJjZXMsIGZpbGVzLCBkYXRhYmFzZXMsCi0gIGFuZCBzbyBmb3J0aC4gVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LCBidXQgeW91IHVzdWFsbHkgdXNlIGEgc3ViY2xhc3MgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBjb21wb25lbnQuCi08cD4KLSAgVGhlIHN1YmNsYXNzZXMgYXJlOgotPC9wPgotICA8dWw+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSAtIEEgY2xhc3MgZm9yIHRlc3RpbmcgYW4gZW50aXJlIGFwcGxpY2F0aW9uLiBJdCBhbGxvd3MgeW91IHRvIGluamVjdCBhIG1vY2sgQ29udGV4dCBpbnRvIHRoZSBhcHBsaWNhdGlvbiwKLSAgICAgIHNldCB1cCBpbml0aWFsIHRlc3QgcGFyYW1ldGVycyBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cywgYW5kIGV4YW1pbmUgdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGZpbmlzaGVzIGJ1dCBiZWZvcmUgaXQgaXMgZGVzdHJveWVkLgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0gLSBBIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfS4gU2luY2UgaXQgaXMgcmVzdHJpY3RlZCB0byB1c2luZyBhCi0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gZm9yIHRoZSBwcm92aWRlciwgYW5kIGl0IGluamVjdHMgYW4ge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LCB5b3VyIHByb3ZpZGVyIHRlc3RpbmcgaXMgaXNvbGF0ZWQKLSAgICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIE9TLgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9IC0gYSBjbGFzcyBmb3IgaXNvbGF0ZWQgdGVzdGluZyBvZiBhIHNpbmdsZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uIFlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yCi0gICAgICBtb2NrIEFwcGxpY2F0aW9uIChvciBib3RoKSwgb3IgbGV0IEFuZHJvaWQgcHJvdmlkZSB5b3UgYSBmdWxsIENvbnRleHQgYW5kIGEge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0uCi0gICAgPC9saT4KLSAgPC91bD4KLTxoMyBpZD0iSW5zdHJ1bWVudGF0aW9uIj5JbnN0cnVtZW50YXRpb24gdGVzdCBjYXNlIGNsYXNzZXM8L2gzPgotPHA+Ci0gIFRoZSBBUEkgZm9yIHRlc3RpbmcgYWN0aXZpdGllcyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBjbGFzcyBhbmQgYWxzbyB1c2VzIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLiBXaXRoIGluc3RydW1lbnRhdGlvbiwKLSAgQW5kcm9pZCBjYW4gYXV0b21hdGUgVUkgdGVzdGluZyBieSBzZW5kaW5nIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcHJlY2lzZWx5IGNvbnRyb2wgdGhlIHN0YXJ0IG9mIGFuIGFjdGl2aXR5LCBhbmQgbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlCi0gIGFjdGl2aXR5IGR1cmluZyBpdHMgbGlmZSBjeWNsZS4KKyAgICBZb3UgY2FuIHVzZSB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MgdG8gZG8gdW5pdCB0ZXN0aW5nIG9uCisgICAgYSBwbGFpbiBKYXZhIG9iamVjdC4gPGNvZGU+VGVzdENhc2U8L2NvZGU+IGlzIGFsc28gdGhlIGJhc2UgY2xhc3MgZm9yCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LCB3aGljaCB5b3UgY2FuIHVzZSB0byB0ZXN0IEFuZHJvaWQtZGVwZW5kZW50IG9iamVjdHMuCisgICAgQmVzaWRlcyBwcm92aWRpbmcgdGhlIEpVbml0IGZyYW1ld29yaywgQW5kcm9pZFRlc3RDYXNlIG9mZmVycyBBbmRyb2lkLXNwZWNpZmljIHNldHVwLAorICAgIHRlYXJkb3duLCBhbmQgaGVscGVyIG1ldGhvZHMuCiA8L3A+CiA8cD4KLSAgVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uIEFsbCBvZiBpdHMgc3ViY2xhc3NlcyBoYXZlIHRoZSBhYmlsaXR5IHRvIHNlbmQgYSBrZXlzdHJva2Ugb3IgdG91Y2ggZXZlbnQgdG8gdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbgotICB1bmRlciB0ZXN0LiBUaGUgc3ViY2xhc3NlcyBjYW4gYWxzbyBpbmplY3QgYSBtb2NrIEludGVudC4KLSAgVGhlIHN1YmNsYXNzZXMgYXJlOgorICAgIFlvdSB1c2UgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fSBjbGFzcyB0byBkaXNwbGF5IHRlc3QgcmVzdWx0cy4KKyAgICBUaGUgYXNzZXJ0IG1ldGhvZHMgY29tcGFyZSB2YWx1ZXMgeW91IGV4cGVjdCBmcm9tIGEgdGVzdCB0byB0aGUgYWN0dWFsIHJlc3VsdHMgYW5kCisgICAgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21wYXJpc29uIGZhaWxzLiBBbmRyb2lkIGFsc28gcHJvdmlkZXMgYSBjbGFzcyBvZiBhc3NlcnRpb25zIHRoYXQKKyAgICBleHRlbmQgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIGNvbXBhcmlzb25zLCBhbmQgYW5vdGhlciBjbGFzcyBvZiBhc3NlcnRpb25zIGZvciB0ZXN0aW5nIHRoZSBVSS4KKyAgICBUaGVzZSBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNBc3NlcnRpb25DbGFzc2VzIj4KKyAgICBBc3NlcnRpb24gY2xhc3NlczwvYT4KIDwvcD4KLSAgPHVsPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlUZXN0Q2FzZX0gLSBBIGJhc2UgY2xhc3MgZm9yIGFjdGl2aXR5IHRlc3QgY2xhc3Nlcy4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZX0gLSBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciB0ZXN0aW5nIGEgc2luZ2xlIGFjdGl2aXR5LgotICAgICAgSXQgaW52b2tlcyB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkgc2V0VXAoKX0gYW5kIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBvbmx5Ci0gICAgICBvbmNlLCBpbnN0ZWFkIG9mIG9uY2UgcGVyIG1ldGhvZCBjYWxsLiBVc2UgaXQgd2hlbiBhbGwgb2YgeW91ciB0ZXN0IG1ldGhvZHMgcnVuIGFnYWluc3QgdGhlIHNhbWUgYWN0aXZpdHkuCi0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlN5bmNCYXNlSW5zdHJ1bWVudGF0aW9ufSAtIEEgY2xhc3MgdGhhdCB0ZXN0cyBzeW5jaHJvbml6YXRpb24gb2YgYSBjb250ZW50IHByb3ZpZGVyLiBJdCB1c2VzIGluc3RydW1lbnRhdGlvbiB0byBjYW5jZWwgYW5kIGRpc2FibGUKLSAgICAgIGV4aXN0aW5nIHN5bmNocm9uaXphdGlvbnMgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0IHN5bmNocm9uaXphdGlvbi4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9IC0gVGhpcyBjbGFzcyBkb2VzIGFuIGlzb2xhdGVkIHRlc3Qgb2YgYSBzaW5nbGUgYWN0aXZpdHkuIFdpdGggaXQsIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBjb250ZXh0IG9yIGFwcGxpY2F0aW9uLCBvciBib3RoLgotICAgICAgSXQgaXMgaW50ZW5kZWQgZm9yIGRvaW5nIHVuaXQgdGVzdHMgb2YgYW4gYWN0aXZpdHksIGFuZCBpcyB0aGUgYWN0aXZpdHkgZXF1aXZhbGVudCBvZiB0aGUgdGVzdCBjbGFzc2VzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2E+LgotICAgICAgPHA+IFVubGlrZSB0aGUgb3RoZXIgaW5zdHJ1bWVudGF0aW9uIGNsYXNzZXMsIHRoaXMgdGVzdCBjbGFzcyBjYW5ub3QgaW5qZWN0IGEgbW9jayBJbnRlbnQuPC9wPgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gLSBUaGlzIGNsYXNzIHRlc3RzIGEgc2luZ2xlIGFjdGl2aXR5IHdpdGhpbiB0aGUgbm9ybWFsIHN5c3RlbSBlbnZpcm9ubWVudC4KLSAgICAgIFlvdSBjYW5ub3QgaW5qZWN0IGEgbW9jayBDb250ZXh0LCBidXQgeW91IGNhbiBpbmplY3QgbW9jayBJbnRlbnRzLiBBbHNvLCB5b3UgY2FuIHJ1biBhIHRlc3QgbWV0aG9kIG9uIHRoZSBVSSB0aHJlYWQgKHRoZSBtYWluIHRocmVhZCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCksCi0gICAgICB3aGljaCBhbGxvd3MgeW91IHRvIHNlbmQga2V5IGFuZCB0b3VjaCBldmVudHMgdG8gdGhlIGFwcGxpY2F0aW9uIFVJLgotICAgIDwvbGk+Ci0gIDwvdWw+Ci08aDMgaWQ9IkFzc2VydCI+QXNzZXJ0IGNsYXNzZXM8L2gzPgogPHA+Ci0gIEFuZHJvaWQgYWxzbyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0gY2xhc3MgdGhhdCBpcyB0aGUgYmFzaXMgb2YgPGNvZGU+YXNzZXJ0KCk8L2NvZGU+IGNhbGxzIGluIHRlc3RzLgotICBUaGVyZSBhcmUgdHdvIGV4dGVuc2lvbnMgdG8gdGhpcyBjbGFzcywge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9OgorICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgSlVuaXQsIHlvdSBjYW4gcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZyI+anVuaXQub3JnPC9hPiBob21lIHBhZ2UuCisgICAgTm90ZSB0aGF0IHRoZSBBbmRyb2lkIHRlc3RpbmcgQVBJIHN1cHBvcnRzIEpVbml0IDMgY29kZSBzdHlsZSwgYnV0IG5vdCBKVW5pdCA0LiBBbHNvLCB5b3UgbXVzdAorICAgIHVzZSBBbmRyb2lkJ3MgaW5zdHJ1bWVudGVkIHRlc3QgcnVubmVyIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gdG8gcnVuCisgICAgeW91ciB0ZXN0IGNhc2UgY2xhc3Nlcy4gVGhpcyB0ZXN0IHJ1bm5lciBpcyBkZXNjcmliZWQgaW4gdGhlCisgICAgc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+UnVubmluZyBUZXN0czwvYT4uCis8L3A+Cis8aDMgaWQ9Ikluc3RydW1lbnRhdGlvbiI+SW5zdHJ1bWVudGF0aW9uPC9oMz4KKzxwPgorICAgIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIGlzIGEgc2V0IG9mIGNvbnRyb2wgbWV0aG9kcyBvciAiaG9va3MiIGluIHRoZSBBbmRyb2lkIHN5c3RlbS4gVGhlc2UgaG9va3MKKyAgICBjb250cm9sIGFuIEFuZHJvaWQgY29tcG9uZW50IGluZGVwZW5kZW50bHkgb2YgaXRzIG5vcm1hbCBsaWZlY3ljbGUuIFRoZXkgYWxzbyBjb250cm9sIGhvdworICAgIEFuZHJvaWQgbG9hZHMgYXBwbGljYXRpb25zLgorPC9wPgorPHA+CisgICAgTm9ybWFsbHksIGFuIEFuZHJvaWQgY29tcG9uZW50IHJ1bnMgaW4gYSBsaWZlY3ljbGUgZGV0ZXJtaW5lZCBieSB0aGUgc3lzdGVtLiBGb3IgZXhhbXBsZSwgYW4KKyAgICBBY3Rpdml0eSBvYmplY3QncyBsaWZlY3ljbGUgc3RhcnRzIHdoZW4gdGhlIEFjdGl2aXR5IGlzIGFjdGl2YXRlZCBieSBhbiBJbnRlbnQuIFRoZSBvYmplY3QncworICAgIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQsIGZvbGxvd2VkIGJ5IDxjb2RlPm9uUmVzdW1lKCk8L2NvZGU+LiBXaGVuIHRoZSB1c2VyCisgICAgc3RhcnRzIGFub3RoZXIgYXBwbGljYXRpb24sIHRoZSA8Y29kZT5vblBhdXNlKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIElmIHRoZSBBY3Rpdml0eQorICAgIGNvZGUgY2FsbHMgdGhlIDxjb2RlPmZpbmlzaCgpPC9jb2RlPiBtZXRob2QsIHRoZSA8Y29kZT5vbkRlc3Ryb3koKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KKyAgICBUaGUgQW5kcm9pZCBmcmFtZXdvcmsgQVBJIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgZm9yIHlvdXIgY29kZSB0byBpbnZva2UgdGhlc2UgY2FsbGJhY2sKKyAgICBtZXRob2RzIGRpcmVjdGx5LCBidXQgeW91IGNhbiBkbyBzbyB1c2luZyBpbnN0cnVtZW50YXRpb24uCis8L3A+Cis8cD4KKyAgICBBbHNvLCB0aGUgc3lzdGVtIHJ1bnMgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFuIGFwcGxpY2F0aW9uIGludG8gdGhlIHNhbWUKKyAgICBwcm9jZXNzLiBZb3UgY2FuIGFsbG93IHNvbWUgY29tcG9uZW50cywgc3VjaCBhcyBjb250ZW50IHByb3ZpZGVycywgdG8gcnVuIGluIGEgc2VwYXJhdGUgcHJvY2VzcywKKyAgICBidXQgeW91IGNhbid0IGZvcmNlIGFuIGFwcGxpY2F0aW9uIHRvIHJ1biBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIGFub3RoZXIgYXBwbGljYXRpb24gdGhhdCBpcworICAgIGFscmVhZHkgcnVubmluZy4KKzwvcD4KKzxwPgorICAgIFdpdGggQW5kcm9pZCBpbnN0cnVtZW50YXRpb24sIHRob3VnaCwgeW91IGNhbiBpbnZva2UgY2FsbGJhY2sgbWV0aG9kcyBpbiB5b3VyIHRlc3QgY29kZS4KKyAgICBUaGlzIGFsbG93cyB5b3UgdG8gcnVuIHRocm91Z2ggdGhlIGxpZmVjeWNsZSBvZiBhIGNvbXBvbmVudCBzdGVwIGJ5IHN0ZXAsIGFzIGlmIHlvdSB3ZXJlCisgICAgZGVidWdnaW5nIHRoZSBjb21wb25lbnQuIFRoZSBmb2xsb3dpbmcgdGVzdCBjb2RlIHNuaXBwZXQgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdGhpcyB0bworICAgIHRlc3QgdGhhdCBhbiBBY3Rpdml0eSBzYXZlcyBhbmQgcmVzdG9yZXMgaXRzIHN0YXRlOgorPC9wPgorPGEgbmFtZT0iQWN0aXZpdHlTbmlwcGV0Ij48L2E+Cis8cHJlPgorICAgIC8vIFN0YXJ0IHRoZSBtYWluIGFjdGl2aXR5IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0CisgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKworICAgIC8vIEdldCBhIGhhbmRsZSB0byB0aGUgQWN0aXZpdHkgb2JqZWN0J3MgbWFpbiBVSSB3aWRnZXQsIGEgU3Bpbm5lcgorICAgIG1TcGlubmVyID0gKFNwaW5uZXIpbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5leGFtcGxlLnNwaW5uZXIuUi5pZC5TcGlubmVyMDEpOworCisgICAgLy8gU2V0IHRoZSBTcGlubmVyIHRvIGEga25vd24gcG9zaXRpb24KKyAgICBtQWN0aXZpdHkuc2V0U3Bpbm5lclBvc2l0aW9uKFRFU1RfU1RBVEVfREVTVFJPWV9QT1NJVElPTik7CisKKyAgICAvLyBTdG9wIHRoZSBhY3Rpdml0eSAtIFRoZSBvbkRlc3Ryb3koKSBtZXRob2Qgc2hvdWxkIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBTcGlubmVyCisgICAgbUFjdGl2aXR5LmZpbmlzaCgpOworCisgICAgLy8gUmUtc3RhcnQgdGhlIEFjdGl2aXR5IC0gdGhlIG9uUmVzdW1lKCkgbWV0aG9kIHNob3VsZCByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgU3Bpbm5lcgorICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisKKyAgICAvLyBHZXQgdGhlIFNwaW5uZXIncyBjdXJyZW50IHBvc2l0aW9uCisgICAgaW50IGN1cnJlbnRQb3NpdGlvbiA9IG1BY3Rpdml0eS5nZXRTcGlubmVyUG9zaXRpb24oKTsKKworICAgIC8vIEFzc2VydCB0aGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFydGluZyBwb3NpdGlvbgorICAgIGFzc2VydEVxdWFscyhURVNUX1NUQVRFX0RFU1RST1lfUE9TSVRJT04sIGN1cnJlbnRQb3NpdGlvbik7Cis8L3ByZT4KKzxwPgorICAgIFRoZSBrZXkgbWV0aG9kIHVzZWQgaGVyZSBpcworICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIjZ2V0QWN0aXZpdHkoKX0sIHdoaWNoIGlzIGEKKyAgICBwYXJ0IG9mIHRoZSBpbnN0cnVtZW50YXRpb24gQVBJLiBUaGUgQWN0aXZpdHkgdW5kZXIgdGVzdCBpcyBub3Qgc3RhcnRlZCB1bnRpbCB5b3UgY2FsbCB0aGlzCisgICAgbWV0aG9kLiBZb3UgY2FuIHNldCB1cCB0aGUgdGVzdCBmaXh0dXJlIGluIGFkdmFuY2UsIGFuZCB0aGVuIGNhbGwgdGhpcyBtZXRob2QgdG8gc3RhcnQgdGhlCisgICAgQWN0aXZpdHkuCis8L3A+Cis8cD4KKyAgICBBbHNvLCBpbnN0cnVtZW50YXRpb24gY2FuIGxvYWQgYm90aCBhIHRlc3QgcGFja2FnZSBhbmQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUKKyAgICBzYW1lIHByb2Nlc3MuIFNpbmNlIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRzIGFuZCB0aGVpciB0ZXN0cyBhcmUgaW4gdGhlIHNhbWUgcHJvY2VzcywgdGhlCisgICAgdGVzdHMgY2FuIGludm9rZSBtZXRob2RzIGluIHRoZSBjb21wb25lbnRzLCBhbmQgbW9kaWZ5IGFuZCBleGFtaW5lIGZpZWxkcyBpbiB0aGUgY29tcG9uZW50cy4KKzwvcD4KKzxoMyBpZD0iVGVzdENhc2VDbGFzc2VzIj5UZXN0IGNhc2UgY2xhc3NlczwvaDM+Cis8cD4KKyAgICBBbmRyb2lkIHByb3ZpZGVzIHNldmVyYWwgdGVzdCBjYXNlIGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZX0gYW5kCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9IHdpdGggQW5kcm9pZC1zcGVjaWZpYyBzZXR1cCwgdGVhcmRvd24sIGFuZCBoZWxwZXIgbWV0aG9kcy4KKzwvcD4KKzxoNCBpZD0iQW5kcm9pZFRlc3RDYXNlIj5BbmRyb2lkVGVzdENhc2U8L2g0PgorPHA+CisgICAgQSB1c2VmdWwgZ2VuZXJhbCB0ZXN0IGNhc2UgY2xhc3MsIGVzcGVjaWFsbHkgaWYgeW91IGFyZQorICAgIGp1c3Qgc3RhcnRpbmcgb3V0IHdpdGggQW5kcm9pZCB0ZXN0aW5nLCBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0uIEl0IGV4dGVuZHMKKyAgICBib3RoIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2V9IGFuZCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0uIEl0IHByb3ZpZGVzIHRoZQorICAgIEpVbml0LXN0YW5kYXJkIDxjb2RlPnNldFVwKCk8L2NvZGU+IGFuZCA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiBtZXRob2RzLCBhcyB3ZWxsIGFzIHdlbGwgYXMKKyAgICBhbGwgb2YgSlVuaXQncyBBc3NlcnQgbWV0aG9kcy4gSW4gYWRkaXRpb24sIGl0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIHRlc3RpbmcgcGVybWlzc2lvbnMsIGFuZCBhCisgICAgbWV0aG9kIHRoYXQgZ3VhcmRzIGFnYWluc3QgbWVtb3J5IGxlYWtzIGJ5IGNsZWFyaW5nIG91dCBjZXJ0YWluIGNsYXNzIHJlZmVyZW5jZXMuCis8L3A+Cis8aDQgaWQ9IkNvbXBvbmVudFRlc3RDYXNlIj5Db21wb25lbnQtc3BlY2lmaWMgdGVzdCBjYXNlczwvaDQ+Cis8cD4KKyAgICBBIGtleSBmZWF0dXJlIG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrIGlzIGl0cyBjb21wb25lbnQtc3BlY2lmaWMgdGVzdCBjYXNlIGNsYXNzZXMuCisgICAgVGhlc2UgYWRkcmVzcyBzcGVjaWZpYyBjb21wb25lbnQgdGVzdGluZyBuZWVkcyB3aXRoIG1ldGhvZHMgZm9yIGZpeHR1cmUgc2V0dXAgYW5kCisgICAgdGVhcmRvd24gYW5kIGNvbXBvbmVudCBsaWZlY3ljbGUgY29udHJvbC4gVGhleSBhbHNvIHByb3ZpZGUgbWV0aG9kcyBmb3Igc2V0dGluZyB1cCBtb2NrIG9iamVjdHMuCisgICAgVGhlc2UgY2xhc3NlcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBjb21wb25lbnQtc3BlY2lmaWMgdGVzdGluZyB0b3BpY3M6CiA8L3A+CiA8dWw+Ci0gIDxsaT4KLSAgICBUaGUgPGNvZGU+TW9yZUFzc2VydHM8L2NvZGU+IGNsYXNzIGNvbnRhaW5zIG1vcmUgcG93ZXJmdWwgYXNzZXJ0aW9ucyBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHMjYXNzZXJ0Q29udGFpbnNSZWdleH0gdGhhdCBkb2VzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZy4KLSAgPC9saT4KLSAgPGxpPgotICAgIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzfSBjbGFzcyBjb250YWlucyB1c2VmdWwgYXNzZXJ0aW9ucyBhYm91dCBBbmRyb2lkIFZpZXdzLCBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHMjYXNzZXJ0SGFzU2NyZWVuQ29vcmRpbmF0ZXN9IHRoYXQgdGVzdHMgaWYgYSBWaWV3IGhhcyBhIHBhcnRpY3VsYXIgWCBhbmQgWQotICAgIHBvc2l0aW9uIG9uIHRoZSB2aXNpYmxlIHNjcmVlbi4gVGhlc2UgYXNzZXJ0cyBzaW1wbGlmeSB0ZXN0aW5nIG9mIGdlb21ldHJ5IGFuZCBhbGlnbm1lbnQgaW4gdGhlIFVJLgotICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3RpbmcuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmh0bWwiPgorICAgICAgICBDb250ZW50IFByb3ZpZGVyIFRlc3Rpbmc8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+U2VydmljZSBUZXN0aW5nPC9hPgorICAgIDwvbGk+CiA8L3VsPgotPGgzIGlkPSJNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+Ci0gIDxwPgotICAgIEFuZHJvaWQgaGFzIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGNvbnRleHRzLCBjb250ZW50IHJlc29sdmVycywgYW5kIHJlc291cmNlcy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzCi0gICAgbWV0aG9kcyBpbiBzb21lIHRlc3QgY2xhc3NlcyBmb3IgY3JlYXRpbmcgbW9jayBJbnRlbnRzLiBVc2UgdGhlc2UgbW9ja3MgdG8gZmFjaWxpdGF0ZSBkZXBlbmRlbmN5IGluamVjdGlvbiwgc2luY2UgdGhleSBhcmUgZWFzaWVyIHRvIHVzZSB0aGFuIGNyZWF0aW5nIHRoZWlyCi0gICAgcmVhbCBjb3VudGVycGFydHMuIFRoZXNlIGNvbnZlbmllbmNlIGNsYXNzZXMgYXJlIGZvdW5kIGluIHtAbGluayBhbmRyb2lkLnRlc3R9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9LiBUaGV5IGFyZToKLSAgPC9wPgorPHA+CisgICAgQW5kcm9pZCBkb2VzIG5vdCBwcm92aWRlIGEgc2VwYXJhdGUgdGVzdCBjYXNlIGNsYXNzIGZvciBCcm9hZGNhc3RSZWNlaXZlci4gSW5zdGVhZCwgdGVzdCBhCisgICAgQnJvYWRjYXN0UmVjZWl2ZXIgYnkgdGVzdGluZyB0aGUgY29tcG9uZW50IHRoYXQgc2VuZHMgaXQgSW50ZW50IG9iamVjdHMsIHRvIHZlcmlmeSB0aGF0IHRoZQorICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlc3BvbmRzIGNvcnJlY3RseS4KKzwvcD4KKzxoNCBpZD0iQXBwbGljYXRpb25UZXN0Q2FzZSI+QXBwbGljYXRpb25UZXN0Q2FzZTwvaDQ+Cis8cD4KKyAgICBZb3UgdXNlIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LkFwcGxpY2F0aW9uVGVzdENhc2V9IHRlc3QgY2FzZSBjbGFzcyB0byB0ZXN0IHRoZSBzZXR1cCBhbmQKKyAgICB0ZWFyZG93biBvZiB7QGxpbmsgYW5kcm9pZC5hcHAuQXBwbGljYXRpb259IG9iamVjdHMuIFRoZXNlIG9iamVjdHMgbWFpbnRhaW4gdGhlIGdsb2JhbCBzdGF0ZSBvZgorICAgIGluZm9ybWF0aW9uIHRoYXQgYXBwbGllcyB0byBhbGwgdGhlIGNvbXBvbmVudHMgaW4gYW4gYXBwbGljYXRpb24gcGFja2FnZS4gVGhlIHRlc3QgY2FzZSBjYW4KKyAgICBiZSB1c2VmdWwgaW4gdmVyaWZ5aW5nIHRoYXQgdGhlICZsdDthcHBsaWNhdGlvbiZndDsgZWxlbWVudCBpbiB0aGUgbWFuaWZlc3QgZmlsZSBpcyBjb3JyZWN0bHkKKyAgICBzZXQgdXAuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhpcyB0ZXN0IGNhc2UgZG9lcyBub3QgYWxsb3cgeW91IHRvIGNvbnRyb2wgdGVzdGluZyBvZiB0aGUKKyAgICBjb21wb25lbnRzIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIHBhY2thZ2UuCis8L3A+Cis8aDQgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RDYXNlIj5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTwvaDQ+Cis8cD4KKyAgICBJZiB5b3Ugd2FudCB0byB1c2UgaW5zdHJ1bWVudGF0aW9uIG1ldGhvZHMgaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIHlvdSBtdXN0IHVzZQorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9IG9yIG9uZSBvZiBpdHMgc3ViY2xhc3Nlcy4gVGhlCisgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSB0ZXN0IGNhc2VzIGV4dGVuZCB0aGlzIGJhc2UgY2xhc3Mgd2l0aCBvdGhlciBmdW5jdGlvbmFsaXR5IHRoYXQKKyAgICBhc3Npc3RzIGluIEFjdGl2aXR5IHRlc3RpbmcuCis8L3A+CisKKzxoMyBpZD0iQXNzZXJ0aW9uQ2xhc3NlcyI+QXNzZXJ0aW9uIGNsYXNzZXM8L2gzPgorPHA+CisgICAgQmVjYXVzZSBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzc2VzIGV4dGVuZCBKVW5pdCwgeW91IGNhbiB1c2UgYXNzZXJ0aW9uIG1ldGhvZHMgdG8gZGlzcGxheSB0aGUKKyAgICByZXN1bHRzIG9mIHRlc3RzLiBBbiBhc3NlcnRpb24gbWV0aG9kIGNvbXBhcmVzIGFuIGFjdHVhbCB2YWx1ZSByZXR1cm5lZCBieSBhIHRlc3QgdG8gYW4KKyAgICBleHBlY3RlZCB2YWx1ZSwgYW5kIHRocm93cyBhbiBBc3NlcnRpb25FeGNlcHRpb24gaWYgdGhlIGNvbXBhcmlzb24gdGVzdCBmYWlscy4gVXNpbmcgYXNzZXJ0aW9ucworICAgIGlzIG1vcmUgY29udmVuaWVudCB0aGFuIGRvaW5nIGxvZ2dpbmcsIGFuZCBwcm92aWRlcyBiZXR0ZXIgdGVzdCBwZXJmb3JtYW5jZS4KKzwvcD4KKzxwPgorICAgIEJlc2lkZXMgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fSBjbGFzcyBtZXRob2RzLCB0aGUgdGVzdGluZyBBUEkgYWxzbyBwcm92aWRlcworICAgIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzfSBhbmQge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3NlczoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHN9IGNvbnRhaW5zIG1vcmUgcG93ZXJmdWwgYXNzZXJ0aW9ucyBzdWNoIGFzCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHMjYXNzZXJ0Q29udGFpbnNSZWdleH0sIHdoaWNoIGRvZXMgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgIG1hdGNoaW5nLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzfSBjb250YWlucyB1c2VmdWwgYXNzZXJ0aW9ucyBhYm91dCBWaWV3cy4gRm9yIGV4YW1wbGUKKyAgICAgICAgaXQgY29udGFpbnMge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0cyNhc3NlcnRIYXNTY3JlZW5Db29yZGluYXRlc30gdGhhdCB0ZXN0cyBpZiBhIFZpZXcKKyAgICAgICAgaGFzIGEgcGFydGljdWxhciBYIGFuZCBZIHBvc2l0aW9uIG9uIHRoZSB2aXNpYmxlIHNjcmVlbi4gVGhlc2UgYXNzZXJ0cyBzaW1wbGlmeSB0ZXN0aW5nIG9mCisgICAgICAgIGdlb21ldHJ5IGFuZCBhbGlnbm1lbnQgaW4gdGhlIFVJLgorICAgIDwvbGk+Cis8L3VsPgorPGgzIGlkPSJNb2NrT2JqZWN0Q2xhc3NlcyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+Cis8cD4KKyAgICBUbyBmYWNpbGl0YXRlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIHRlc3RpbmcsIEFuZHJvaWQgcHJvdmlkZXMgY2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIHN5c3RlbQorICAgIG9iamVjdHMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IG9iamVjdHMsCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9IG9iamVjdHMsIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyfQorICAgIG9iamVjdHMsIGFuZCB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0gb2JqZWN0cy4gU29tZSB0ZXN0IGNhc2VzIGFsc28gcHJvdmlkZSBtb2NrCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnR9IG9iamVjdHMuIFlvdSB1c2UgdGhlc2UgbW9ja3MgYm90aCB0byBpc29sYXRlIHRlc3RzCisgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtIGFuZCB0byBmYWNpbGl0YXRlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGZvciB0ZXN0aW5nLiBUaGVzZSBjbGFzc2VzCisgICAgYXJlIGZvdW5kIGluIHRoZSBKYXZhIHBhY2thZ2VzIHtAbGluayBhbmRyb2lkLnRlc3R9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9LgorPC9wPgorPHA+CisgICAgTW9jayBvYmplY3RzIGlzb2xhdGUgdGVzdHMgZnJvbSBhIHJ1bm5pbmcgc3lzdGVtIGJ5IHN0dWJiaW5nIG91dCBvciBvdmVycmlkaW5nCisgICAgbm9ybWFsIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCBhIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfQorICAgIHJlcGxhY2VzIHRoZSBub3JtYWwgcmVzb2x2ZXIgZnJhbWV3b3JrIHdpdGggaXRzIG93biBsb2NhbCBmcmFtZXdvcmssIHdoaWNoIGlzIGlzb2xhdGVkCisgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLiBNb2NrQ29udGVudFJlc29sdmVyIGFsc28gYWxzbyBzdHVicyBvdXQgdGhlCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKFVyaSwgQ29udGVudE9ic2VydmVyLCBib29sZWFuKX0gbWV0aG9kCisgICAgc28gdGhhdCBvYnNlcnZlciBvYmplY3RzIG91dHNpZGUgdGhlIHRlc3QgZW52aXJvbm1lbnQgYXJlIG5vdCBhY2NpZGVudGFsbHkgdHJpZ2dlcmVkLgorPC9wPgorPHA+CisgICAgTW9jayBvYmplY3QgY2xhc3NlcyBhbHNvIGZhY2lsaXRhdGUgZGVwZW5kZW5jeSBpbmplY3Rpb24gYnkgcHJvdmlkaW5nIGEgc3ViY2xhc3Mgb2YgdGhlCisgICAgbm9ybWFsIG9iamVjdCB0aGF0IGlzIG5vbi1mdW5jdGlvbmFsIGV4Y2VwdCBmb3Igb3ZlcnJpZGVzIHlvdSBkZWZpbmUuIEZvciBleGFtcGxlLCB0aGUKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1Jlc291cmNlc30gb2JqZWN0IHByb3ZpZGVzIGEgc3ViY2xhc3Mgb2YKKyAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXN9IGluIHdoaWNoIGFsbCB0aGUgbWV0aG9kcyB0aHJvdyBFeGNlcHRpb25zIHdoZW4gY2FsbGVkLgorICAgIFRvIHVzZSBpdCwgeW91IG92ZXJyaWRlIG9ubHkgdGhvc2UgbWV0aG9kcyB0aGF0IG11c3QgcHJvdmlkZSBpbmZvcm1hdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoZXNlIGFyZSB0aGUgbW9jayBvYmplY3QgY2xhc3NlcyBhdmFpbGFibGUgaW4gQW5kcm9pZDoKKzwvcD4KKzxoNCBpZD0iU2ltcGxlTW9ja3MiPlNpbXBsZSBtb2NrIG9iamVjdCBjbGFzc2VzPC9oND4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHR9LAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDdXJzb3J9LAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrRGlhbG9nSW50ZXJmYWNlfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tQYWNrYWdlTWFuYWdlcn0sIGFuZAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrUmVzb3VyY2VzfSBwcm92aWRlIGEgc2ltcGxlIGFuZCB1c2VmdWwgbW9jayBzdHJhdGVneS4gVGhleSBhcmUKKyAgICBzdHViYmVkLW91dCB2ZXJzaW9ucyBvZiB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0gb2JqZWN0IGNsYXNzLCBhbmQgYWxsIG9mIHRoZWlyIG1ldGhvZHMgdGhyb3cgYW4KKyAgICB7QGxpbmsgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBleGNlcHRpb24gaWYgY2FsbGVkLiBUbyB1c2UgdGhlbSwgeW91IG92ZXJyaWRlCisgICAgdGhlIG1ldGhvZHMgeW91IG5lZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBtb2NrIGRlcGVuZGVuY2llcy4KKzwvcD4KKzxwIGNsYXNzPSJOb3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UHJvdmlkZXJ9CisgICAgYW5kIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ3Vyc29yfSBhcmUgbmV3IGFzIG9mIEFQSSBsZXZlbCA4LgorPC9wPgorPGg0IGlkPSJSZXNvbHZlck1vY2tzIj5SZXNvbHZlciBtb2NrIG9iamVjdHM8L2g0PgorPHA+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IHByb3ZpZGVzIGlzb2xhdGVkIHRlc3Rpbmcgb2YgY29udGVudCBwcm92aWRlcnMgYnkKKyAgICBtYXNraW5nIG91dCB0aGUgbm9ybWFsIHN5c3RlbSByZXNvbHZlciBmcmFtZXdvcmsuIEluc3RlYWQgb2YgbG9va2luZyBpbiB0aGUgc3lzdGVtIHRvIGZpbmQgYQorICAgIGNvbnRlbnQgcHJvdmlkZXIgZ2l2ZW4gYW4gYXV0aG9yaXR5IHN0cmluZywgTW9ja0NvbnRlbnRSZXNvbHZlciB1c2VzIGl0cyBvd24gaW50ZXJuYWwgdGFibGUuIFlvdQorICAgIG11c3QgZXhwbGljaXRseSBhZGQgcHJvdmlkZXJzIHRvIHRoaXMgdGFibGUgdXNpbmcKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlciNhZGRQcm92aWRlcihTdHJpbmcsQ29udGVudFByb3ZpZGVyKX0uCis8L3A+Cis8cD4KKyAgICBXaXRoIHRoaXMgZmVhdHVyZSwgeW91IGNhbiBhc3NvY2lhdGUgYSBtb2NrIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBhbiBhdXRob3JpdHkuIFlvdSBjYW4gY3JlYXRlCisgICAgYW4gaW5zdGFuY2Ugb2YgYSByZWFsIHByb3ZpZGVyIGJ1dCB1c2UgdGVzdCBkYXRhIGluIGl0LiBZb3UgY2FuIGV2ZW4gc2V0IHRoZSBwcm92aWRlciBmb3IgYW4KKyAgICBhdXRob3JpdHkgdG8gPGNvZGU+bnVsbDwvY29kZT4uIEluIGVmZmVjdCwgYSBNb2NrQ29udGVudFJlc29sdmVyIG9iamVjdCBpc29sYXRlcyB5b3VyIHRlc3QKKyAgICBmcm9tIHByb3ZpZGVycyB0aGF0IGNvbnRhaW4gcmVhbCBkYXRhLiBZb3UgY2FuIGNvbnRyb2wgdGhlCisgICAgZnVuY3Rpb24gb2YgdGhlIHByb3ZpZGVyLCBhbmQgeW91IGNhbiBwcmV2ZW50IHlvdXIgdGVzdCBmcm9tIGFmZmVjdGluZyByZWFsIGRhdGEuCis8L3A+Cis8aDMgaWQ9IkNvbnRleHRNb2NrcyI+Q29udGV4dHMgZm9yIHRlc3Rpbmc8L2gzPgorPHA+CisgICAgQW5kcm9pZCBwcm92aWRlcyB0d28gQ29udGV4dCBjbGFzc2VzIHRoYXQgYXJlIHVzZWZ1bCBmb3IgdGVzdGluZzoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSBwcm92aWRlcyBhbiBpc29sYXRlZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9LAorICAgICAgICBGaWxlLCBkaXJlY3RvcnksIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIHRoYXQgdXNlIHRoaXMgQ29udGV4dCB0YWtlIHBsYWNlIGluIGEgdGVzdCBhcmVhLgorICAgICAgICBUaG91Z2ggaXRzIGZ1bmN0aW9uYWxpdHkgaXMgbGltaXRlZCwgdGhpcyBDb250ZXh0IGhhcyBlbm91Z2ggc3R1YiBjb2RlIHRvIHJlc3BvbmQgdG8KKyAgICAgICAgc3lzdGVtIGNhbGxzLgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoaXMgY2xhc3MgYWxsb3dzIHlvdSB0byB0ZXN0IGFuIGFwcGxpY2F0aW9uJ3MgZGF0YSBvcGVyYXRpb25zIHdpdGhvdXQgYWZmZWN0aW5nIHJlYWwKKyAgICAgICAgICAgIGRhdGEgdGhhdCBtYXkgYmUgcHJlc2VudCBvbiB0aGUgZGV2aWNlLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gcHJvdmlkZXMgYSBDb250ZXh0IGluIHdoaWNoCisgICAgICAgIG1vc3QgZnVuY3Rpb25zIGFyZSBoYW5kbGVkIGJ5IGFuIGV4aXN0aW5nIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0sIGJ1dAorICAgICAgICBmaWxlIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IGEge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LgorICAgICAgICBUaGUgaXNvbGF0ZWQgcGFydCB1c2VzIGEgdGVzdCBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgc3BlY2lhbCBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMuCisgICAgICAgIFlvdSBjYW4gY29udHJvbCB0aGUgbmFtaW5nIHlvdXJzZWxmLCBvciBsZXQgdGhlIGNvbnN0cnVjdG9yIGRldGVybWluZSBpdCBhdXRvbWF0aWNhbGx5LgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGEgcXVpY2sgd2F5IHRvIHNldCB1cCBhbiBpc29sYXRlZCBhcmVhIGZvciBkYXRhIG9wZXJhdGlvbnMsCisgICAgICAgICAgICB3aGlsZSBrZWVwaW5nIG5vcm1hbCBmdW5jdGlvbmFsaXR5IGZvciBhbGwgb3RoZXIgQ29udGV4dCBvcGVyYXRpb25zLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKzwvdWw+Cis8aDIgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPlJ1bm5pbmcgVGVzdHM8L2gyPgorPHA+CisgICAgVGVzdCBjYXNlcyBhcmUgcnVuIGJ5IGEgdGVzdCBydW5uZXIgY2xhc3MgdGhhdCBsb2FkcyB0aGUgdGVzdCBjYXNlIGNsYXNzLCBzZXQgdXBzLAorICAgIHJ1bnMsIGFuZCB0ZWFycyBkb3duIGVhY2ggdGVzdC4gQW4gQW5kcm9pZCB0ZXN0IHJ1bm5lciBtdXN0IGFsc28gYmUgaW5zdHJ1bWVudGVkLCBzbyB0aGF0CisgICAgdGhlIHN5c3RlbSB1dGlsaXR5IGZvciBzdGFydGluZyBhcHBsaWNhdGlvbnMgY2FuIGNvbnRyb2wgaG93IHRoZSB0ZXN0IHBhY2thZ2UKKyAgICBsb2FkcyB0ZXN0IGNhc2VzIGFuZCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gWW91IHRlbGwgdGhlIEFuZHJvaWQgcGxhdGZvcm0KKyAgICB3aGljaCBpbnN0cnVtZW50ZWQgdGVzdCBydW5uZXIgdG8gdXNlIGJ5IHNldHRpbmcgYSB2YWx1ZSBpbiB0aGUgdGVzdCBwYWNrYWdlJ3MgbWFuaWZlc3QgZmlsZS4KKzwvcD4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gaXMgdGhlIHByaW1hcnkgQW5kcm9pZCB0ZXN0IHJ1bm5lciBjbGFzcy4gSXQKKyAgICBleHRlbmRzIHRoZSBKVW5pdCB0ZXN0IHJ1bm5lciBmcmFtZXdvcmsgYW5kIGlzIGFsc28gaW5zdHJ1bWVudGVkLiBJdCBjYW4gcnVuIGFueSBvZiB0aGUgdGVzdAorICAgIGNhc2UgY2xhc3NlcyBwcm92aWRlZCBieSBBbmRyb2lkIGFuZCBzdXBwb3J0cyBhbGwgcG9zc2libGUgdHlwZXMgb2YgdGVzdGluZy4KKzwvcD4KKzxwPgorICAgIFlvdSBzcGVjaWZ5IDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IG9yIGEgc3ViY2xhc3MgaW4geW91ciB0ZXN0IHBhY2thZ2UncworICAgIG1hbmlmZXN0IGZpbGUsIGluIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPgorICAgIGluc3RydW1lbnRhdGlvbjwvYT4gZWxlbWVudC4gQWxzbywgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gY29kZSByZXNpZGVzCisgICAgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5IDxjb2RlPmFuZHJvaWQudGVzdC5ydW5uZXI8L2NvZGU+LCAgd2hpY2ggaXMgbm90IG5vcm1hbGx5IGxpbmtlZCB0bworICAgIEFuZHJvaWQgY29kZS4gVG8gaW5jbHVkZSBpdCwgeW91IG11c3Qgc3BlY2lmeSBpdCBpbiBhCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWxpYnJhcnktZWxlbWVudC5odG1sIj51c2VzLWxpYnJhcnk8L2E+IGVsZW1lbnQuCisgICAgWW91IGRvIG5vdCBoYXZlIHRvIHNldCB1cCB0aGVzZSBlbGVtZW50cyB5b3Vyc2VsZi4gQm90aCBFY2xpcHNlIHdpdGggQURUIGFuZCB0aGUKKyAgICA8Y29kZT5hbmRyb2lkPC9jb2RlPiBjb21tYW5kLWxpbmUgdG9vbCBjb25zdHJ1Y3QgdGhlbSBhdXRvbWF0aWNhbGx5IGFuZCBhZGQgdGhlbSB0byB5b3VyCisgICAgdGVzdCBwYWNrYWdlJ3MgbWFuaWZlc3QgZmlsZS4KKzwvcD4KKzxwIGNsYXNzPSJOb3RlIj4KKyAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSB1c2UgYSB0ZXN0IHJ1bm5lciBvdGhlciB0aGFuCisgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4sIHlvdSBtdXN0IGNoYW5nZSB0aGUgJmx0O2luc3RydW1lbnRhdGlvbiZndDsKKyAgICBlbGVtZW50IHRvIHBvaW50IHRvIHRoZSBjbGFzcyB5b3Ugd2FudCB0byB1c2UuCis8L3A+Cis8cD4KKyAgICBUbyBydW4ge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSwgeW91IHVzZSBpbnRlcm5hbCBzeXN0ZW0gY2xhc3NlcyBjYWxsZWQgYnkKKyAgICBBbmRyb2lkIHRvb2xzLiBXaGVuIHlvdSBydW4gYSB0ZXN0IGluIEVjbGlwc2Ugd2l0aCBBRFQsIHRoZSBjbGFzc2VzIGFyZSBjYWxsZWQgYXV0b21hdGljYWxseS4KKyAgICBXaGVuIHlvdSBydW4gYSB0ZXN0IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91IHJ1biB0aGVzZSBjbGFzc2VzIHdpdGgKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCI+QW5kcm9pZCBEZWJ1ZyBCcmlkZ2UgKGFkYik8L2E+LgorPC9wPgorPHA+CisgICAgVGhlIHN5c3RlbSBjbGFzc2VzIGxvYWQgYW5kIHN0YXJ0IHRoZSB0ZXN0IHBhY2thZ2UsIGtpbGwgYW55IHByb2Nlc3NlcyB0aGF0CisgICAgYXJlIHJ1bm5pbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGFuZCB0aGVuIGxvYWQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlCisgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhleSB0aGVuIHBhc3MgY29udHJvbCB0bworICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0sIHdoaWNoIHJ1bnMKKyAgICBlYWNoIHRlc3QgY2FzZSBjbGFzcyBpbiB0aGUgdGVzdCBwYWNrYWdlLiBZb3UgY2FuIGFsc28gY29udHJvbCB3aGljaCB0ZXN0IGNhc2VzIGFuZAorICAgIG1ldGhvZHMgYXJlIHJ1biB1c2luZyBzZXR0aW5ncyBpbiBFY2xpcHNlIHdpdGggQURULCBvciB1c2luZyBmbGFncyB3aXRoIHRoZSBjb21tYW5kLWxpbmUgdG9vbHMuCis8L3A+Cis8cD4KKyAgICBOZWl0aGVyIHRoZSBzeXN0ZW0gY2xhc3NlcyBub3Ige0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSBydW4KKyAgICB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gSW5zdGVhZCwgdGhlIHRlc3QgY2FzZSBkb2VzIHRoaXMgZGlyZWN0bHkuIEl0IGVpdGhlciBjYWxscyBtZXRob2RzCisgICAgaW4gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIG9yIGl0IGNhbGxzIGl0cyBvd24gbWV0aG9kcyB0aGF0IHRyaWdnZXIgbGlmZWN5Y2xlIGV2ZW50cyBpbgorICAgIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgYXBwbGljYXRpb24gaXMgdW5kZXIgdGhlIGNvbXBsZXRlIGNvbnRyb2wgb2YgdGhlIHRlc3QgY2FzZSwKKyAgICB3aGljaCBhbGxvd3MgaXQgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50ICh0aGUgdGVzdCBmaXh0dXJlKSBiZWZvcmUgcnVubmluZyBhIHRlc3QuIFRoaXMKKyAgICBpcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIHByZXZpb3VzIDxhIGhyZWY9IiNBY3Rpdml0eVNuaXBwZXQiPmNvZGUgc25pcHBldDwvYT4gdGhhdCB0ZXN0cyBhbgorICAgIEFjdGl2aXR5IHRoYXQgZGlzcGxheXMgYSBTcGlubmVyIHdpZGdldC4KKzwvcD4KKzxwPgorICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgcnVubmluZyB0ZXN0cywgcGxlYXNlIHJlYWQgdGhlIHRvcGljcworICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPiBvcgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIE90aGVyIElEZXM8L2E+LgorPC9wPgorPGgyIGlkPSJUZXN0UmVzdWx0cyI+U2VlaW5nIFRlc3QgUmVzdWx0czwvaDI+Cis8cD4KKyAgICBUaGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayByZXR1cm5zIHRlc3QgcmVzdWx0cyBiYWNrIHRvIHRoZSB0b29sIHRoYXQgc3RhcnRlZCB0aGUgdGVzdC4KKyAgICBJZiB5b3UgcnVuIGEgdGVzdCBpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgcmVzdWx0cyBhcmUgZGlzcGxheWVkIGluIGEgbmV3IEpVbml0IHZpZXcgcGFuZS4gSWYKKyAgICB5b3UgcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZSByZXN1bHRzIGFyZSBkaXNwbGF5ZWQgaW4gPGNvZGU+U1RET1VUPC9jb2RlPi4gSW4KKyAgICBib3RoIGNhc2VzLCB5b3Ugc2VlIGEgdGVzdCBzdW1tYXJ5IHRoYXQgZGlzcGxheXMgdGhlIG5hbWUgb2YgZWFjaCB0ZXN0IGNhc2UgYW5kIG1ldGhvZCB0aGF0CisgICAgd2FzIHJ1bi4gWW91IGFsc28gc2VlIGFsbCB0aGUgYXNzZXJ0aW9uIGZhaWx1cmVzIHRoYXQgb2NjdXJyZWQuIFRoZXNlIGluY2x1ZGUgcG9pbnRlcnMgdG8gdGhlCisgICAgbGluZSBpbiB0aGUgdGVzdCBjb2RlIHdoZXJlIHRoZSBmYWlsdXJlIG9jY3VycmVkLiBBc3NlcnRpb24gZmFpbHVyZXMgYWxzbyBsaXN0IHRoZSBleHBlY3RlZAorICAgIHZhbHVlIGFuZCBhY3R1YWwgdmFsdWUuCis8L3A+Cis8cD4KKyAgICBUaGUgdGVzdCByZXN1bHRzIGhhdmUgYSBmb3JtYXQgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgSURFIHRoYXQgeW91IGFyZSB1c2luZy4gVGhlIHRlc3QKKyAgICByZXN1bHRzIGZvcm1hdCBmb3IgRWNsaXBzZSB3aXRoIEFEVCBpcyBkZXNjcmliZWQgaW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sI1J1blRlc3RFY2xpcHNlIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gVGhlIHRlc3QgcmVzdWx0cyBmb3JtYXQgZm9yIHRlc3RzIHJ1biBmcm9tIHRoZQorICAgIGNvbW1hbmQgbGluZSBpcyBkZXNjcmliZWQgaW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCNSdW5UZXN0c0NvbW1hbmQiPgorICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4uCis8L3A+Cis8aDIgaWQ9Ik1vbmtleXMiPk1vbmtleSBhbmQgTW9ua2V5UnVubmVyPC9oMj4KKzxwPgorICAgIFRoZSBTREsgcHJvdmlkZXMgdHdvIHRvb2xzIGZvciBmdW5jdGlvbmFsLWxldmVsIGFwcGxpY2F0aW9uIHRlc3Rpbmc6Cis8L3A+CiAgICAgPHVsPgotICAgICAgPGxpPgotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gLSBNb2NrcyBhIENvbnRleHQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gdXNpbmcgaXQgcnVucyBpbiBpc29sYXRpb24uCi0gICAgICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGhhcyBlbm91Z2ggc3R1YiBjb2RlIHRvIHNhdGlzZnkgT1MgY29kZSB0aGF0IHRyaWVzIHRvIGNvbW11bmljYXRlIHdpdGggY29udGV4dHMuIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGluIHVuaXQgdGVzdGluZy4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gLSBEZWxlZ2F0ZXMgbW9zdCBjb250ZXh0IGZ1bmN0aW9ucyB0byBhbiBleGlzdGluZywgbm9ybWFsIGNvbnRleHQgd2hpbGUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgZmlsZSBhbmQgZGF0YWJhc2UKLSAgICAgICAgbmFtZXMgaW4gdGhlIGNvbnRleHQuIFVzZSB0aGlzIHRvIHRlc3QgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB3aXRoIGEgbm9ybWFsIHN5c3RlbSBjb250ZXh0LCB1c2luZyB0ZXN0IG5hbWVzLgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0fSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tEaWFsb2dJbnRlcmZhY2V9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyfSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IC0gQ2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIEFuZHJvaWQgc3lzdGVtIG9iamVjdHMgZm9yIHVzZSBpbiB0ZXN0aW5nLiBUaGV5IGV4cG9zZSBvbmx5IHRob3NlIG1ldGhvZHMgdGhhdCBhcmUKLSAgICAgICAgdXNlZnVsIGluIG1hbmFnaW5nIHRoZSBvYmplY3QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBtZXRob2RzIHNpbXBseSB0aHJvdyBhbiBFeGNlcHRpb24uIFlvdSBhcmUgZXhwZWN0ZWQgdG8gZXh0ZW5kIHRoZSBjbGFzc2VzIGFuZAotICAgICAgICBvdmVycmlkZSBhbnkgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCi0gICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9tb25rZXkuaHRtbCI+TW9ua2V5PC9hPiBpcyBhIGNvbW1hbmQtbGluZQorICAgICAgICAgICAgdG9vbCB0aGF0IHNlbmRzIHBzZXVkby1yYW5kb20gc3RyZWFtcyBvZiBrZXlzdHJva2VzLCB0b3VjaGVzLCBhbmQgZ2VzdHVyZXMgdG8gYQorICAgICAgICAgICAgZGV2aWNlLiBZb3UgcnVuIGl0IHdpdGggdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj4KKyAgICAgICAgICAgIEFuZHJvaWQgRGVidWcgQnJpZGdlPC9hPiAoYWRiKSB0b29sLiBZb3UgdXNlIGl0IHRvIHN0cmVzcy10ZXN0IHlvdXIgYXBwbGljYXRpb24gYW5kCisgICAgICAgICAgICByZXBvcnQgYmFjayBlcnJvcnMgdGhhdCBhcmUgZW5jb3VudGVyZWQuIFlvdSBjYW4gcmVwZWF0IGEgc3RyZWFtIG9mIGV2ZW50cyBieQorICAgICAgICAgICAgcnVubmluZyB0aGUgdG9vbCBlYWNoIHRpbWUgd2l0aCB0aGUgc2FtZSByYW5kb20gbnVtYmVyIHNlZWQuCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9tb25rZXlydW5uZXIuaHRtbCI+TW9ua2V5UnVubmVyPC9hPiBpcyBhCisgICAgICAgICAgICBKeXRob24gQVBJIHRoYXQgeW91IHVzZSBpbiB0ZXN0IHByb2dyYW1zIHdyaXR0ZW4gaW4gUHl0aG9uLiBUaGUgQVBJIGluY2x1ZGVzIGZ1bmN0aW9ucworICAgICAgICAgICAgZm9yIGNvbm5lY3RpbmcgdG8gYSBkZXZpY2UsIGluc3RhbGxpbmcgYW5kIHVuaW5zdGFsbGluZyBwYWNrYWdlcywgdGFraW5nIHNjcmVlbnNob3RzLAorICAgICAgICAgICAgY29tcGFyaW5nIHR3byBpbWFnZXMsIGFuZCBydW5uaW5nIGEgdGVzdCBwYWNrYWdlIGFnYWluc3QgYW4gYXBwbGljYXRpb24uIFVzaW5nIHRoZSBBUEkKKyAgICAgICAgICAgIHdpdGggUHl0aG9uLCB5b3UgY2FuIHdyaXRlIGEgd2lkZSByYW5nZSBvZiBsYXJnZSwgcG93ZXJmdWwsIGFuZCBjb21wbGV4IHRlc3RzLgorICAgICAgICA8L2xpPgogICAgIDwvdWw+Ci08aDMgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0IFJ1bm5lcjwvaDM+Cis8aDIgaWQ9IlBhY2thZ2VOYW1lcyI+V29ya2luZyBXaXRoIFBhY2thZ2UgbmFtZXM8L2gyPgogPHA+Ci0gIEFuZHJvaWQgcHJvdmlkZXMgYSBjdXN0b20gY2xhc3MgZm9yIHJ1bm5pbmcgdGVzdHMgd2l0aCBpbnN0cnVtZW50YXRpb24gY2FsbGVkIGNhbGxlZAotICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LiBUaGlzIGNsYXNzCi0gIGNvbnRyb2xzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgcm91dGVzCi0gIHRlc3Qgb3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gVXNpbmcgaW5zdHJ1bWVudGF0aW9uIGlzIGtleSB0byB0aGUgYWJpbGl0eSBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiB0byBjb250cm9sIHRoZSBlbnRpcmUgdGVzdAotICBlbnZpcm9ubWVudCBhdCBydW50aW1lLiBOb3RpY2UgdGhhdCB5b3UgdXNlIHRoaXMgdGVzdCBydW5uZXIgZXZlbiBpZiB5b3VyIHRlc3QgY2xhc3MgZG9lcyBub3QgaXRzZWxmIHVzZSBpbnN0cnVtZW50YXRpb24uCisgICAgSW4gdGhlIHRlc3QgZW52aXJvbm1lbnQsIHlvdSB3b3JrIHdpdGggYm90aCBBbmRyb2lkIGFwcGxpY2F0aW9uIHBhY2thZ2UgbmFtZXMgYW5kCisgICAgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXJzLiBCb3RoIHVzZSB0aGUgc2FtZSBuYW1pbmcgZm9ybWF0LCBidXQgdGhleSByZXByZXNlbnQgc3Vic3RhbnRpYWxseQorICAgIGRpZmZlcmVudCBlbnRpdGllcy4gWW91IG5lZWQgdG8ga25vdyB0aGUgZGlmZmVyZW5jZSB0byBzZXQgdXAgeW91ciB0ZXN0cyBjb3JyZWN0bHkuCiA8L3A+CiA8cD4KLSAgV2hlbiB5b3UgcnVuIGEgdGVzdCBhcHBsaWNhdGlvbiwgeW91IGZpcnN0IHJ1biBhIHN5c3RlbSB1dGlsaXR5IGNhbGxlZCBBY3Rpdml0eSBNYW5hZ2VyLiBBY3Rpdml0eSBNYW5hZ2VyIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsgdG8gc3RhcnQgYW5kIGNvbnRyb2wgdGhlIHRlc3QgcnVubmVyLCB3aGljaCBpbiB0dXJuIHVzZXMgaW5zdHJ1bWVudGF0aW9uIHRvIHNodXQgZG93biBhbnkgcnVubmluZyBpbnN0YW5jZXMKLSAgb2YgdGhlIG1haW4gYXBwbGljYXRpb24sIHN0YXJ0cyB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gc3RhcnRzIHRoZSBtYWluIGFwcGxpY2F0aW9uIGluIHRoZSBzYW1lIHByb2Nlc3MuIFRoaXMgYWxsb3dzIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIG1haW4gYXBwbGljYXRpb24uCisgICAgQW4gQW5kcm9pZCBwYWNrYWdlIG5hbWUgaXMgYSB1bmlxdWUgc3lzdGVtIG5hbWUgZm9yIGEgPGNvZGU+LmFwazwvY29kZT4gZmlsZSwgc2V0IGJ5IHRoZQorICAgICZxdW90O2FuZHJvaWQ6cGFja2FnZSZxdW90OyBhdHRyaWJ1dGUgb2YgdGhlICZsdDttYW5pZmVzdCZndDsgZWxlbWVudCBpbiB0aGUgcGFja2FnZSdzCisgICAgbWFuaWZlc3QuIFRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB5b3VyIHRlc3QgcGFja2FnZSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHRoZQorICAgIEFuZHJvaWQgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBCeSBkZWZhdWx0LCBBbmRyb2lkIHRvb2xzIGNyZWF0ZSB0aGUKKyAgICB0ZXN0IHBhY2thZ2UgbmFtZSBieSBhcHBlbmRpbmcgIi50ZXN0IiB0byB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgogPC9wPgogPHA+Ci0gIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlLCB0aGUgQURUIHBsdWdpbiBhc3Npc3RzIHlvdSBpbiB0aGUgc2V0dXAgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gb3Igb3RoZXIgdGVzdCBydW5uZXJzLgotICBUaGUgcGx1Z2luIFVJIHByb21wdHMgeW91IHRvIHNwZWNpZnkgdGhlIHRlc3QgcnVubmVyIGNsYXNzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgotICBUaGUgcGx1Z2luIHRoZW4gYWRkcyBhbiA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgdG8gdGhlIG1hbmlmZXN0IGZpbGUgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uCi0gIEVjbGlwc2Ugd2l0aCBBRFQgYXV0b21hdGljYWxseSBzdGFydHMgYSB0ZXN0IGFwcGxpY2F0aW9uIHVuZGVyIHRoZSBjb250cm9sIG9mIEFjdGl2aXR5IE1hbmFnZXIgdXNpbmcgaW5zdHJ1bWVudGF0aW9uLAotICBhbmQgcmVkaXJlY3RzIHRoZSB0ZXN0IG91dHB1dCB0byB0aGUgRWNsaXBzZSB3aW5kb3cncyBKVW5pdCB2aWV3LgorICAgIFRoZSB0ZXN0IHBhY2thZ2UgYWxzbyB1c2VzIGFuIEFuZHJvaWQgcGFja2FnZSBuYW1lIHRvIHRhcmdldCB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBpdAorICAgIHRlc3RzLiBUaGlzIGlzIHNldCBpbiB0aGUgJnF1b3Q7YW5kcm9pZDp0YXJnZXRQYWNrYWdlJnF1b3Q7IGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAmbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OyBlbGVtZW50IGluIHRoZSB0ZXN0IHBhY2thZ2UncyBtYW5pZmVzdC4KIDwvcD4KIDxwPgotICBJZiB5b3UgcHJlZmVyIHdvcmtpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3UgY2FuIHVzZSBBbnQgYW5kIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPgotICB0b29sIHRvIGhlbHAgeW91IHNldCB1cCB5b3VyIHRlc3QgcHJvamVjdHMuIFRvIHJ1biB0ZXN0cyB3aXRoIGluc3RydW1lbnRhdGlvbiwgeW91IGNhbiBhY2Nlc3MgdGhlCi0gIEFjdGl2aXR5IE1hbmFnZXIgdGhyb3VnaCB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcKLSAgQnJpZGdlPC9hPiAoPGNvZGU+YWRiPC9jb2RlPikgdG9vbCBhbmQgdGhlIG91dHB1dCBpcyBkaXJlY3RlZCB0byA8Y29kZT5TVERPVVQ8L2NvZGU+LgotPC9wPgotPGgyIGlkPSJUZXN0RW52aXJvbWVudCI+V29ya2luZyBpbiB0aGUgVGVzdCBFbnZpcm9ubWVudDwvaDI+Ci08cD4KLSAgICBUaGUgdGVzdHMgZm9yIGFuIEFuZHJvaWQgYXBwbGljYXRpb24gYXJlIGNvbnRhaW5lZCBpbiBhIHRlc3QgYXBwbGljYXRpb24sIHdoaWNoIGl0c2VsZiBpcyBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uLiBBIHRlc3QgYXBwbGljYXRpb24gcmVzaWRlcyBpbiBhIHNlcGFyYXRlIEFuZHJvaWQgcHJvamVjdCB0aGF0IGhhcyB0aGUKLSAgICBzYW1lIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcyBhIHJlZ3VsYXIgQW5kcm9pZCBhcHBsaWNhdGlvbi4gVGhlIHRlc3QgcHJvamVjdCBpcyBsaW5rZWQgdG8gdGhlIHByb2plY3Qgb2YgdGhlIGFwcGxpY2F0aW9uIGl0IHRlc3RzCi0gICAgKGtub3duIGFzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0KSBieSBpdHMgbWFuaWZlc3QgZmlsZS4KKyAgICBBIEphdmEgcGFja2FnZSBpZGVudGlmaWVyIGFwcGxpZXMgdG8gYSBzb3VyY2UgZmlsZS4gVGhpcyBwYWNrYWdlIG5hbWUgcmVmbGVjdHMgdGhlIGRpcmVjdG9yeQorICAgIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlLiBJdCBhbHNvIGFmZmVjdHMgdGhlIHZpc2liaWxpdHkgb2YgY2xhc3NlcyBhbmQgbWVtYmVycyB0byBlYWNoIG90aGVyLgogPC9wPgogPHA+Ci0gICAgRWFjaCB0ZXN0IGFwcGxpY2F0aW9uIGNvbnRhaW5zIG9uZSBvciBtb3JlIHRlc3QgY2FzZSBjbGFzc2VzIGJhc2VkIG9uIGFuIEFuZHJvaWQgY2xhc3MgZm9yIGEKLSAgICBwYXJ0aWN1bGFyIHR5cGUgb2YgY29tcG9uZW50LiBUaGUgdGVzdCBjYXNlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBkZWZpbmUgdGVzdHMgb24gc29tZSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBXaGVuIHlvdSBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24sIEFuZHJvaWQKLSAgICBzdGFydHMgaXQsIGxvYWRzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgcHJvY2VzcywgYW5kIHRoZW4gaW52b2tlcyBlYWNoIG1ldGhvZCBpbiB0aGUgdGVzdCBjYXNlIGNsYXNzLgorICAgIEFuZHJvaWQgdG9vbHMgdGhhdCBjcmVhdGUgdGVzdCBwcm9qZWN0cyBzZXQgdXAgYW4gQW5kcm9pZCB0ZXN0IHBhY2thZ2UgbmFtZSBmb3IgeW91LgorICAgIEZyb20geW91ciBpbnB1dCwgdGhlIHRvb2xzIHNldCB1cCB0aGUgdGVzdCBwYWNrYWdlIG5hbWUgYW5kIHRoZSB0YXJnZXQgcGFja2FnZSBuYW1lIGZvciB0aGUKKyAgICBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgdGhlc2UgdG9vbHMgdG8gd29yaywgdGhlIGFwcGxpY2F0aW9uIHByb2plY3QgbXVzdCBhbHJlYWR5IGV4aXN0LgogPC9wPgogPHA+Ci0gICAgVGhlIHRvb2xzIGFuZCBwcm9jZWR1cmVzIHlvdSB1c2Ugd2l0aCB0ZXN0aW5nIGRlcGVuZCBvbiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgeW91IGFyZSB1c2luZy4gSWYgeW91IHVzZSBFY2xpcHNlLCB0aGVuIHRoZSBBRFQgcGx1ZyBpbiBmb3IgRWNsaXBzZSBwcm92aWRlcyB0b29scyB0aGF0Ci0gICAgYWxsb3cgeW91IHRvIGRldmVsb3AgYW5kIHJ1biB0ZXN0cyBlbnRpcmVseSB3aXRoaW4gRWNsaXBzZS4gVGhpcyBpcyBkb2N1bWVudGVkIGluIHRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4KLSAgICBJZiB5b3UgdXNlIGFub3RoZXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHRoZW4geW91IHVzZSBBbmRyb2lkJ3MgY29tbWFuZC1saW5lIHRvb2xzLCBhcyBkb2N1bWVudGVkIGluIHRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KKyAgICBCeSBkZWZhdWx0LCB0aGVzZSB0b29scyBzZXQgdGhlIEphdmEgcGFja2FnZSBpZGVudGlmaWVyIGZvciB0aGUgdGVzdCBjbGFzcyB0byBiZSB0aGUgc2FtZQorICAgIGFzIHRoZSBBbmRyb2lkIHBhY2thZ2UgaWRlbnRpZmllci4gWW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGlmIHlvdSB3YW50IHRvIGV4cG9zZQorICAgIG1lbWJlcnMgaW4gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYnkgZ2l2aW5nIHRoZW0gcGFja2FnZSB2aXNpYmlsaXR5LiBJZiB5b3UgZG8gdGhpcywKKyAgICBjaGFuZ2Ugb25seSB0aGUgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXIsIG5vdCB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWVzLCBhbmQgY2hhbmdlIG9ubHkgdGhlCisgICAgdGVzdCBjYXNlIHNvdXJjZSBmaWxlcy4gRG8gbm90IGNoYW5nZSB0aGUgSmF2YSBwYWNrYWdlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZAorICAgIDxjb2RlPlIuamF2YTwvY29kZT4gY2xhc3MgaW4geW91ciB0ZXN0IHBhY2thZ2UsIGJlY2F1c2UgaXQgd2lsbCB0aGVuIGNvbmZsaWN0IHdpdGggdGhlCisgICAgPGNvZGU+Ui5qYXZhPC9jb2RlPiBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gRG8gbm90IGNoYW5nZSB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUKKyAgICBvZiB5b3VyIHRlc3QgcGFja2FnZSB0byBiZSB0aGUgc2FtZSBhcyB0aGUgYXBwbGljYXRpb24gaXQgdGVzdHMsIGJlY2F1c2UgdGhlbiB0aGVpciBuYW1lcworICAgIHdpbGwgbm8gbG9uZ2VyIGJlIHVuaXF1ZSBpbiB0aGUgc3lzdGVtLgogPC9wPgotPGgzIGlkPSJUZXN0UHJvamVjdHMiPldvcmtpbmcgd2l0aCB0ZXN0IHByb2plY3RzPC9oMz4KKzxoMiBpZD0iV2hhdFRvVGVzdCI+V2hhdCB0byBUZXN0PC9oMj4KIDxwPgotICAgIFRvIHN0YXJ0IHRlc3RpbmcgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiwgeW91IGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBmb3IgaXQgdXNpbmcgQW5kcm9pZCB0b29scy4gVGhlIHRvb2xzIGNyZWF0ZSB0aGUgcHJvamVjdCBkaXJlY3RvcnkgYW5kIHRoZSBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgbmVlZGVkLgotICAgIFRoZSB0b29scyBhbHNvIGNyZWF0ZSBhIG1hbmlmZXN0IGZpbGUgdGhhdCBsaW5rcyB0aGUgYXBwbGljYXRpb24gaW4gdGhlIHRlc3QgcHJvamVjdCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIHByb2NlZHVyZSBmb3IgY3JlYXRpbmcgYSB0ZXN0IHByb2plY3QgaW4gRWNsaXBzZSB3aXRoCi0gICAgQURUIGlzIGRvY3VtZW50ZWQgaW4gPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGZvciB1c2Ugd2l0aCBkZXZlbG9wbWVudAotICAgIHRvb2xzIG90aGVyIHRoYW4gRWNsaXBzZSBpcyBkb2N1bWVudGVkIGluIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgotPC9wPgotPGgzIGlkPSJUZXN0Q2xhc3NlcyI+V29ya2luZyB3aXRoIHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KLTxwPgotICAgIEEgdGVzdCBhcHBsaWNhdGlvbiBjb250YWlucyBvbmUgb3IgbW9yZSB0ZXN0IGNhc2UgY2xhc3NlcyB0aGF0IGV4dGVuZCBhbiBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzcy4gWW91IGNob29zZSBhIHRlc3QgY2FzZSBjbGFzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcgYW5kIHRoZQotICAgIHRlc3RzIHlvdSBhcmUgZG9pbmcuIEEgdGVzdCBhcHBsaWNhdGlvbiBjYW4gdGVzdCBkaWZmZXJlbnQgY29tcG9uZW50cywgYnV0IGVhY2ggdGVzdCBjYXNlIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHRlc3QgYSBzaW5nbGUgdHlwZSBvZiBjb21wb25lbnQuCi0gICAgVGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPi4KKyAgICBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3doYXRfdG9fdGVzdC5odG1sIj5XaGF0IFRvIFRlc3Q8L2E+CisgICAgZGVzY3JpYmVzIHRoZSBrZXkgZnVuY3Rpb25hbGl0eSB5b3Ugc2hvdWxkIHRlc3QgaW4gYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiwgYW5kIHRoZSBrZXkKKyAgICBzaXR1YXRpb25zIHRoYXQgbWlnaHQgYWZmZWN0IHRoYXQgZnVuY3Rpb25hbGl0eS4KIDwvcD4KIDxwPgotICAgIFNvbWUgQW5kcm9pZCBjb21wb25lbnRzIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHRlc3QgY2FzZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCB5b3UgY2hvb3NlIGFtb25nIHRoZSBhdmFpbGFibGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0ZXN0cyB5b3Ugd2FudCB0byBkby4gRm9yIGFjdGl2aXRpZXMsCi0gICAgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIHRoZSBjaG9pY2Ugb2YgZWl0aGVyIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IG9yIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LgotPHA+Ci0gICAgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2NvZGU+IGlzIGRlc2lnbmVkIHRvIGRvIGZ1bmN0aW9uYWwgdGVzdGluZywgc28gaXQgdGVzdHMgYWN0aXZpdGllcyBpbiBhIG5vcm1hbCBzeXN0ZW0gaW5mcmFzdHJ1Y3R1cmUuIFlvdSBjYW4gaW5qZWN0IG1vY2tlZCBJbnRlbnRzLCBidXQgbm90Ci0gICAgbW9ja2VkIENvbnRleHRzLiBJbiBnZW5lcmFsLCB5b3UgY2FuJ3QgbW9jayBkZXBlbmRlbmNpZXMgZm9yIHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0LgorICAgIE1vc3QgdW5pdCB0ZXN0aW5nIGlzIHNwZWNpZmljIHRvIHRoZSBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcuCisgICAgVGhlIHRvcGljcyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdGluZy5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPiwKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvY29udGVudHByb3ZpZGVyX3Rlc3RpbmcuaHRtbCI+CisgICAgQ29udGVudCBQcm92aWRlciBUZXN0aW5nPC9hPiwgYW5kIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+CisgICAgU2VydmljZSBUZXN0aW5nPC9hPiBlYWNoIGhhdmUgYSBzZWN0aW9uIGVudGl0bGVkICJXaGF0IFRvIFRlc3QiIHRoYXQgbGlzdHMgcG9zc2libGUgdGVzdGluZworICAgIGFyZWFzLgogPC9wPgogPHA+Ci0gICAgSW4gY29tcGFyaXNvbiwgPGNvZGU+QWN0aXZpdHlVbml0VGVzdENhc2U8L2NvZGU+IGlzIGRlc2lnbmVkIGZvciB1bml0IHRlc3RpbmcsIHNvIGl0IHRlc3RzIGFjdGl2aXRpZXMgaW4gYW4gaXNvbGF0ZWQgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgb3Igd3JhcHBlcmVkIGRlcGVuZGVuY2llcyBmb3IKLSAgICB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGFydGljdWxhcmx5IG1vY2tlZCBDb250ZXh0cy4gT24gdGhlIG90aGVyIGhhbmQsIHdoZW4geW91IHVzZSB0aGlzIHRlc3QgY2FzZSBjbGFzcyB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCBydW5zIGluIGlzb2xhdGlvbiBhbmQgY2FuJ3QgaW50ZXJhY3Qgd2l0aCBvdGhlciBhY3Rpdml0aWVzLgorICAgIFdoZW4gcG9zc2libGUsIHlvdSBzaG91bGQgcnVuIHRoZXNlIHRlc3RzIG9uIGFuIGFjdHVhbCBkZXZpY2UuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCB5b3UgY2FuCisgICAgdXNlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sIj5BbmRyb2lkIEVtdWxhdG9yPC9hPiB3aXRoCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgorICAgIHRoZSBoYXJkd2FyZSwgc2NyZWVucywgYW5kIHZlcnNpb25zIHlvdSB3YW50IHRvIHRlc3QuCis8L3A+Cis8aDIgaWQ9Ik5leHRTdGVwcyI+TmV4dCBTdGVwczwvaDI+Cis8cD4KKyAgICBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSwgcGxlYXNlIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbgorICAgIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKKyAgICBJREVzPC9hPi4KIDwvcD4KIDxwPgotICAgIEFzIGEgcnVsZSBvZiB0aHVtYiwgaWYgeW91IHdhbnRlZCB0byB0ZXN0IGFuIGFjdGl2aXR5J3MgaW50ZXJhY3Rpb24gd2l0aCB0aGUgcmVzdCBvZiBBbmRyb2lkLCB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPi4gSWYgeW91IHdhbnRlZCB0byBkbyByZWdyZXNzaW9uIHRlc3RpbmcKLSAgICBvbiBhbiBhY3Rpdml0eSwgeW91IHdvdWxkIHVzZSA8Y29kZT5BY3Rpdml0eVVuaXRUZXN0Q2FzZTwvY29kZT4uCisgICAgSWYgeW91IHdhbnQgYSBzdGVwLWJ5LXN0ZXAgaW50cm9kdWN0aW9uIHRvIEFuZHJvaWQgdGVzdGluZywgdHJ5IG9uZSBvZiB0aGUKKyAgICB0ZXN0aW5nIHR1dG9yaWFscyBvciBzYW1wbGUgdGVzdCBwYWNrYWdlczoKIDwvcD4KLTxoMyBpZD0iVGVzdHMiPldvcmtpbmcgd2l0aCB0ZXN0IG1ldGhvZHM8L2gzPgotPHA+Ci0gICAgRWFjaCB0ZXN0IGNhc2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IHlvdSB1c2UgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCBjb250cm9sIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgZXhhbXBsZSwgYWxsIHRlc3QgY2FzZSBjbGFzc2VzIHByb3ZpZGUgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfQotICAgIG1ldGhvZCB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgdG8gc2V0IHVwIGZpeHR1cmVzLiBJbiBhZGRpdGlvbiwgeW91IGFkZCBtZXRob2RzIHRvIHRoZSBjbGFzcyB0byBkZWZpbmUgaW5kaXZpZHVhbCB0ZXN0cy4gRWFjaCBtZXRob2QgeW91IGFkZCBpcyBydW4gb25jZSBlYWNoIHRpbWUgeW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSWYgeW91IG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPgotICAgIG1ldGhvZCwgaXQgcnVucyBiZWZvcmUgZWFjaCBvZiB5b3VyIG1ldGhvZHMuIFNpbWlsYXJseSwgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBtZXRob2QgaXMgcnVuIG9uY2UgYWZ0ZXIgZWFjaCBvZiB5b3VyIG1ldGhvZHMuCi08L3A+Ci08cD4KLSAgICBUaGUgdGVzdCBjYXNlIGNsYXNzZXMgZ2l2ZSB5b3Ugc3Vic3RhbnRpYWwgY29udHJvbCBvdmVyIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBjb21wb25lbnRzLiBGb3IgdGhpcyByZWFzb24sIHlvdSBoYXZlIHRvIHNwZWNpZmljYWxseSB0ZWxsIEFuZHJvaWQgdG8gc3RhcnQgYSBjb21wb25lbnQgYmVmb3JlIHlvdSBydW4gdGVzdHMgYWdhaW5zdCBpdC4gRm9yIGV4YW1wbGUsIHlvdSB1c2UgdGhlCi0gICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiNnZXRBY3Rpdml0eSgpfSBtZXRob2QgdG8gc3RhcnQgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QuIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBvbmNlIGR1cmluZyB0aGUgZW50aXJlIHRlc3QgY2FzZSwgb3Igb25jZSBmb3IgZWFjaCB0ZXN0IG1ldGhvZC4gWW91IGNhbiBldmVuIGRlc3Ryb3kgdGhlCi0gICAgYWN0aXZpdHkgdW5kZXIgdGVzdCBieSBjYWxsaW5nIGl0cyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZmluaXNoKCl9IG1ldGhvZCBhbmQgdGhlbiByZXN0YXJ0IGl0IHdpdGggPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gd2l0aGluIGEgc2luZ2xlIHRlc3QgbWV0aG9kLgotPC9wPgotPGgzIGlkPSJSdW5UZXN0cyI+UnVubmluZyB0ZXN0cyBhbmQgc2VlaW5nIHRoZSByZXN1bHRzPC9oMz4KLTxwPgotICAgIFRvIHJ1biB5b3VyIHRlc3RzLCB5b3UgYnVpbGQgeW91ciB0ZXN0IHByb2plY3QgYW5kIHRoZW4gcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBzeXN0ZW0gdXRpbGl0eSBBY3Rpdml0eSBNYW5hZ2VyIHdpdGggaW5zdHJ1bWVudGF0aW9uLiBZb3UgcHJvdmlkZSB0byBBY3Rpdml0eSBNYW5hZ2VyIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHJ1bm5lciAodXN1YWxseQotICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0pIHlvdSBzcGVjaWZpZWQgZm9yIHlvdXIgYXBwbGljYXRpb247IHRoZSBuYW1lIGluY2x1ZGVzIGJvdGggeW91ciB0ZXN0IGFwcGxpY2F0aW9uJ3MgcGFja2FnZSBuYW1lIGFuZCB0aGUgdGVzdCBydW5uZXIgY2xhc3MgbmFtZS4gQWN0aXZpdHkgTWFuYWdlciBsb2FkcyBhbmQgc3RhcnRzIHlvdXIKLSAgICB0ZXN0IGFwcGxpY2F0aW9uLCBraWxscyBhbnkgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBsb2FkcyBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpbnRvIHRoZSBzYW1lIHByb2Nlc3MgYXMgdGhlIHRlc3QgYXBwbGljYXRpb24sIGFuZCB0aGVuIHBhc3NlcyBjb250cm9sIHRvIHRoZSBmaXJzdCB0ZXN0IGNhc2UKLSAgICBjbGFzcyBpbiB5b3VyIHRlc3QgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHJ1bm5lciB0aGVuIHRha2VzIGNvbnRyb2wgb2YgdGhlIHRlc3RzLCBydW5uaW5nIGVhY2ggb2YgeW91ciB0ZXN0IG1ldGhvZHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB1bnRpbCBhbGwgdGhlIG1ldGhvZHMgaW4gYWxsIHRoZSBjbGFzc2VzIGhhdmUgYmVlbiBydW4uCi08L3A+Ci08cD4KLSAgICBJZiB5b3UgcnVuIGEgdGVzdCB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCwgdGhlIG91dHB1dCBhcHBlYXJzIGluIGEgbmV3IEpVbml0IHZpZXcgcGFuZS4gSWYgeW91IHJ1biBhIHRlc3QgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB0aGUgb3V0cHV0IGdvZXMgdG8gU1RET1VULgotPC9wPgotPGgyIGlkPSJUZXN0QXJlYXMiPldoYXQgdG8gVGVzdDwvaDI+Ci08cD4KLSAgSW4gYWRkaXRpb24gdG8gdGhlIGZ1bmN0aW9uYWwgYXJlYXMgeW91IHdvdWxkIG5vcm1hbGx5IHRlc3QsIGhlcmUgYXJlIHNvbWUgYXJlYXMKLSAgb2YgQW5kcm9pZCBhcHBsaWNhdGlvbiB0ZXN0aW5nIHRoYXQgeW91IHNob3VsZCBjb25zaWRlcjoKLTwvcD4KLSAgPHVsPgorPHVsPgogICAgIDxsaT4KLSAgICAgIEFjdGl2aXR5IGxpZmVjeWNsZSBldmVudHM6IFlvdSBzaG91bGQgdGVzdCB0aGF0IHlvdXIgYWN0aXZpdGllcyBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyBjb3JyZWN0bHkuIEZvciBleGFtcGxlCi0gICAgICBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cyBieSBzYXZpbmcgaXRzIHN0YXRlLiBSZW1lbWJlciB0aGF0IGV2ZW4gYSBjaGFuZ2UgaW4gc2NyZWVuIG9yaWVudGF0aW9uCi0gICAgICBjYXVzZXMgdGhlIGN1cnJlbnQgYWN0aXZpdHkgdG8gYmUgZGVzdHJveWVkLCBzbyB5b3Ugc2hvdWxkIHRlc3QgdGhhdCBhY2NpZGVudGFsIGRldmljZSBtb3ZlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5IGxvc2UgdGhlCi0gICAgICBhcHBsaWNhdGlvbiBzdGF0ZS4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKKyAgICAgICAgY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAgRGF0YWJhc2Ugb3BlcmF0aW9uczogWW91IHNob3VsZCBlbnN1cmUgdGhhdCBkYXRhYmFzZSBvcGVyYXRpb25zIGNvcnJlY3RseSBoYW5kbGUgY2hhbmdlcyB0byB0aGUgYXBwbGljYXRpb24ncyBzdGF0ZS4KLSAgICAgIFRvIGRvIHRoaXMsIHVzZSBtb2NrIG9iamVjdHMgZnJvbSB0aGUgcGFja2FnZSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2sgYW5kcm9pZC50ZXN0Lm1vY2t9LgorICAgICAgICBUaGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5CisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgorICAgICAgICBJdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQorICAgICAgICBtb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgICAgU2NyZWVuIHNpemVzIGFuZCByZXNvbHV0aW9uczogQmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG1ha2Ugc3VyZSB0byB0ZXN0IGl0IG9uIGFsbCBvZiB0aGUKLSAgICAgICAgc2NyZWVuIHNpemVzIGFuZCBkZW5zaXRpZXMgb24gd2hpY2ggeW91IHdhbnQgaXQgdG8gcnVuLiBZb3UgY2FuIHRlc3QgdGhlIGFwcGxpY2F0aW9uIG9uIG11bHRpcGxlIHNpemVzIGFuZCBkZW5zaXRpZXMgdXNpbmcKLSAgICAgICAgQVZEcywgb3IgeW91IGNhbiB0ZXN0IHlvdXIgYXBwbGljYXRpb24gZGlyZWN0bHkgb24gdGhlIGRldmljZXMgdGhhdCB5b3UgYXJlIHRhcmdldGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotICAgICAgICB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZSBTY3JlZW5zPC9hPi4KKyAgICAgICAgVGhlIHNhbXBsZSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWRUZXN0Ij5Ob3RlIFBhZCBUZXN0PC9hPiBpcyBhbiBleGFtcGxlIG9mCisgICAgICAgIHRlc3RpbmcgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uIEl0IGNvbnRhaW5zIGEgc2V0IG9mIHVuaXQgdGVzdHMgZm9yIHRoZQorICAgICAgICBOb3RlIFBhZCBzYW1wbGUgYXBwbGljYXRpb24ncyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uCiAgICAgPC9saT4KLSAgPC91bD4KLTxwPgotICBXaGVuIHBvc3NpYmxlLCB5b3Ugc2hvdWxkIHJ1biB0aGVzZSB0ZXN0cyBvbiBhbiBhY3R1YWwgZGV2aWNlLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgeW91IGNhbgotICB1c2UgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwiPkFuZHJvaWQgRW11bGF0b3I8L2E+IHdpdGgKLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgotICB0aGUgaGFyZHdhcmUsIHNjcmVlbnMsIGFuZCB2ZXJzaW9ucyB5b3Ugd2FudCB0byB0ZXN0LgotPC9wPgotPGgyIGlkPSJVSVRlc3RpbmciPkFwcGVuZGl4OiBVSSBUZXN0aW5nIE5vdGVzPC9oMj4KLTxwPgotICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGhhdmUgdGlwcyBmb3IgdGVzdGluZyB0aGUgVUkgb2YgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCBzcGVjaWZpY2FsbHkKLSAgdG8gaGVscCB5b3UgaGFuZGxlIGFjdGlvbnMgdGhhdCBydW4gaW4gdGhlIFVJIHRocmVhZCwgdG91Y2ggc2NyZWVuIGFuZCBrZXlib2FyZCBldmVudHMsIGFuZCBob21lCi0gIHNjcmVlbiB1bmxvY2sgZHVyaW5nIHRlc3RpbmcuCi08L3A+Ci08aDMgaWQ9IlJ1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIHRocmVhZDwvaDM+Ci08cD4KLSAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKLSAgVUkgaXMgaW5zdGFudGlhdGVkLCBmb3IgZXhhbXBsZSBpbiB0aGUgYWN0aXZpdHkncyA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2QsIHRoZW4gYWxsCi0gIGludGVyYWN0aW9ucyB3aXRoIHRoZSBVSSBtdXN0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLiBXaGVuIHlvdSBydW4gdGhlIGFwcGxpY2F0aW9uIG5vcm1hbGx5LCBpdAotICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLTwvcD4KLTxwPgotICBUaGlzIGNoYW5nZXMgd2hlbiB5b3UgcnVuIHRlc3RzIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uLiBXaXRoIGluc3RydW1lbnRhdGlvbi1iYXNlZCBjbGFzc2VzLAotICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzIGRvbid0IGFsbG93IHRoaXMuCi0gIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkIHdpdGggPGNvZGU+QFVJVGhyZWFkVGVzdDwvY29kZT4uCi0gIE5vdGljZSB0aGF0IHRoaXMgd2lsbCBydW4gPGVtPmFsbDwvZW0+IG9mIHRoZSBtZXRob2Qgc3RhdGVtZW50cyBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSQotICBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCi08L3A+Ci08cD4KLSAgVG8gcnVuIGEgc3Vic2V0IG9mIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgY3JlYXRlIGFuIGFub255bW91cyBjbGFzcyBvZiB0eXBlCi0gIDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiwgcHV0IHRoZSBzdGF0ZW1lbnRzIHlvdSB3YW50IGluIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kLCBhbmQgaW5zdGFudGlhdGUgYSBuZXcKLSAgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT4ucnVuT25VaVRocmVhZCgpPC9jb2RlPiwgd2hlcmUKLSAgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT48L2NvZGU+IGlzIHRoZSBpbnN0YW5jZSBvZiB0aGUgYXBwIHlvdSBhcmUgdGVzdGluZy4KLTwvcD4KLTxwPgotICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIGluc3RhbnRpYXRlcyBhbiBhY3Rpdml0eSB0byB0ZXN0LCByZXF1ZXN0cyBmb2N1cyAoYSBVSSBhY3Rpb24pIGZvciB0aGUgU3Bpbm5lciBkaXNwbGF5ZWQKLSAgYnkgdGhlIGFjdGl2aXR5LCBhbmQgdGhlbiBzZW5kcyBhIGtleSB0byBpdC4gTm90aWNlIHRoYXQgdGhlIGNhbGxzIHRvIDxjb2RlPndhaXRGb3JJZGxlU3luYzwvY29kZT4gYW5kIDxjb2RlPnNlbmRLZXlzPC9jb2RlPgotICBhcmVuJ3QgYWxsb3dlZCB0byBydW4gb24gdGhlIFVJIHRocmVhZDo8L3A+Ci08cHJlPgotICBwcml2YXRlIE15QWN0aXZpdHkgbUFjdGl2aXR5OyAvLyBNeUFjdGl2aXR5IGlzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhcHAgdW5kZXIgdGVzdAotICBwcml2YXRlIFNwaW5uZXIgbVNwaW5uZXI7Ci0KLSAgLi4uCi0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICBtSW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0KLSAgICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7IC8vIGdldCBhIHJlZmVyZW5jZXMgdG8gdGhlIGFwcCB1bmRlciB0ZXN0Ci0KLSAgICAgIC8qCi0gICAgICAgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIG1haW4gd2lkZ2V0IG9mIHRoZSBhcHAgdW5kZXIgdGVzdCwgYSBTcGlubmVyCi0gICAgICAgKi8KLSAgICAgIG1TcGlubmVyID0gKFNwaW5uZXIpIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuZGVtby5teWFjdGl2aXR5LlIuaWQuU3Bpbm5lcjAxKTsKLQotICAuLi4KLQotICBwdWJsaWMgdm9pZCBhVGVzdCgpIHsKLSAgICAgIC8qCi0gICAgICAgKiByZXF1ZXN0IGZvY3VzIGZvciB0aGUgU3Bpbm5lciwgc28gdGhhdCB0aGUgdGVzdCBjYW4gc2VuZCBrZXkgZXZlbnRzIHRvIGl0Ci0gICAgICAgKiBUaGlzIHJlcXVlc3QgbXVzdCBiZSBydW4gb24gdGhlIFVJIHRocmVhZC4gVG8gZG8gdGhpcywgdXNlIHRoZSBydW5PblVpVGhyZWFkIG1ldGhvZAotICAgICAgICogYW5kIHBhc3MgaXQgYSBSdW5uYWJsZSB0aGF0IGNvbnRhaW5zIGEgY2FsbCB0byByZXF1ZXN0Rm9jdXMgb24gdGhlIFNwaW5uZXIuCi0gICAgICAgKi8KLSAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgIG1TcGlubmVyLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotCi0gICAgICB0aGlzLnNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotPC9wcmU+Ci0KLTxoMyBpZD0iTm90b3VjaE1vZGUiPlR1cm5pbmcgb2ZmIHRvdWNoIG1vZGU8L2gzPgotPHA+Ci0gIFRvIGNvbnRyb2wgdGhlIGVtdWxhdG9yIG9yIGEgZGV2aWNlIHdpdGgga2V5IGV2ZW50cyB5b3Ugc2VuZCBmcm9tIHlvdXIgdGVzdHMsIHlvdSBtdXN0IHR1cm4gb2ZmCi0gIHRvdWNoIG1vZGUuIElmIHlvdSBkbyBub3QgZG8gdGhpcywgdGhlIGtleSBldmVudHMgYXJlIGlnbm9yZWQuCi08L3A+Ci08cD4KLSAgVG8gdHVybiBvZmYgdG91Y2ggbW9kZSwgeW91IGludm9rZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMi5zZXRBY3Rpdml0eVRvdWNoTW9kZShmYWxzZSk8L2NvZGU+Ci0gIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUgbWV0aG9kIGluIGEgdGVzdCBtZXRob2QKLSAgdGhhdCBpcyA8ZW0+bm90PC9lbT4gcnVubmluZyBvbiB0aGUgVUkgdGhyZWFkLiBGb3IgdGhpcyByZWFzb24sIHlvdSBjYW4ndCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kCi0gIGZyb20gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KLTwvcD4KLTxoMyBpZD0iVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIGVtdWxhdG9yIG9yIGRldmljZTwvaDM+Ci08cD4KLSAgWW91IG1heSBmaW5kIHRoYXQgVUkgdGVzdHMgZG9uJ3Qgd29yayBpZiB0aGUgZW11bGF0b3IncyBvciBkZXZpY2UncyBob21lIHNjcmVlbiBpcyBkaXNhYmxlZCB3aXRoIHRoZSBrZXlndWFyZCBwYXR0ZXJuLgotICBUaGlzIGlzIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgY2FuJ3QgcmVjZWl2ZSBrZXkgZXZlbnRzIHNlbnQgYnkgPGNvZGU+c2VuZEtleXMoKTwvY29kZT4uIFRoZSBiZXN0Ci0gIHdheSB0byBhdm9pZCB0aGlzIGlzIHRvIHN0YXJ0IHlvdXIgZW11bGF0b3Igb3IgZGV2aWNlIGZpcnN0IGFuZCB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGZvciB0aGUgaG9tZSBzY3JlZW4uCi08L3A+Ci08cD4KLSAgWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgZGlzYWJsZSB0aGUga2V5Z3VhcmQuIFRvIGRvIHRoaXMsCi0gIHlvdSBuZWVkIHRvIGFkZCBhIHBlcm1pc3Npb24gaW4gdGhlIG1hbmlmZXN0IGZpbGUgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBhbmQKLSAgdGhlbiBkaXNhYmxlIHRoZSBrZXlndWFyZCBpbiB5b3VyIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIE5vdGUsIHRob3VnaCwgdGhhdCB5b3UgZWl0aGVyIGhhdmUgdG8gcmVtb3ZlIHRoaXMgYmVmb3JlCi0gIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG9yIHlvdSBoYXZlIHRvIGRpc2FibGUgaXQgcHJvZ3JhbW1hdGljYWxseSBpbiB0aGUgcHVibGlzaGVkIGFwcC4KLTwvcD4KLTxwPgotICBUbyBhZGQgdGhlIHRoZSBwZXJtaXNzaW9uLCBhZGQgdGhlIGVsZW1lbnQgPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIi8mZ3Q7PC9jb2RlPgotICBhcyBhIGNoaWxkIG9mIHRoZSA8Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPiBlbGVtZW50LiBUbyBkaXNhYmxlIHRoZSBLZXlHdWFyZCwgYWRkIHRoZSBmb2xsb3dpbmcgY29kZQotICB0byB0aGUgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kIG9mIGFjdGl2aXRpZXMgeW91IGludGVuZCB0byB0ZXN0OgotPC9wPgotPHByZT4KLSAgbUtleUd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSk7Ci0gIG1Mb2NrID0gbUtleUd1YXJkTWFuYWdlci5uZXdLZXlndWFyZExvY2soIjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPiIpOwotICBtTG9jay5kaXNhYmxlS2V5Z3VhcmQoKTsKLTwvcHJlPgotPHA+d2hlcmUgPGNvZGU+PGVtPmFjdGl2aXR5X2NsYXNzbmFtZTwvZW0+PC9jb2RlPiBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZpdHkuPC9wPgotPGgzIGlkPSJVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvaDM+Ci08cD4KLSAgVGhpcyBzZWN0aW9uIGxpc3RzIHNvbWUgb2YgdGhlIGNvbW1vbiB0ZXN0IGZhaWx1cmVzIHlvdSBtYXkgZW5jb3VudGVyIGluIFVJIHRlc3RpbmcsIGFuZCB0aGVpciBjYXVzZXM6Ci08L3A+Ci08ZGw+Ci0gICAgPGR0Pjxjb2RlPldyb25nVGhyZWFkRXhjZXB0aW9uPC9jb2RlPjwvZHQ+Ci0gICAgPGRkPgotICAgICAgPHA+PHN0cm9uZz5Qcm9ibGVtOjwvc3Ryb25nPjwvcD4KLSAgICAgIEZvciBhIGZhaWxlZCB0ZXN0LCB0aGUgRmFpbHVyZSBUcmFjZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGVycm9yIG1lc3NhZ2U6Ci0gICAgICA8Y29kZT4KLSAgICAgICAgYW5kcm9pZC52aWV3LlZpZXdSb290JENhbGxlZEZyb21Xcm9uZ1RocmVhZEV4Y2VwdGlvbjogT25seSB0aGUgb3JpZ2luYWwgdGhyZWFkIHRoYXQgY3JlYXRlZCBhIHZpZXcgaGllcmFyY2h5IGNhbiB0b3VjaCBpdHMgdmlld3MuCi0gICAgICA8L2NvZGU+Ci0gICAgICA8cD48c3Ryb25nPlByb2JhYmxlIENhdXNlOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91IHRyaWVkIHRvIHNlbmQgVUkgZXZlbnRzIHRvIHRoZSBVSSB0aHJlYWQgZnJvbSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuIFRoaXMgY29tbW9ubHkgaGFwcGVucyBpZiB5b3Ugc2VuZCBVSSBldmVudHMKLSAgICAgICAgZnJvbSB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYnV0IHlvdSBkb24ndCB1c2UgdGhlIDxjb2RlPkBVSVRocmVhZDwvY29kZT4gYW5ub3RhdGlvbiBvciB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBtZXRob2QuIFRoZSB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCi0gICAgICA8cD48c3Ryb25nPlN1Z2dlc3RlZCBSZXNvbHV0aW9uOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUgdGhlIHByZXZpb3VzIHNlY3Rpb24gPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIFRocmVhZDwvYT4KLSAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4KLSAgICA8L2RkPgotICAgIDxkdD48Y29kZT5qYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjwvY29kZT48L2R0PgotICAgIDxkZD4KLSAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+Ci0gICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgotICAgICAgPGNvZGU+Ci0gICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZAotICAgICAgPC9jb2RlPgotICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+Ci0gICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0IHRoZW4gdHJpZXMgdG8KLSAgICAgICAgZG8gc29tZXRoaW5nIG91dHNpZGUgdGhlIFVJIHRocmVhZCBvciB0cmllcyB0byBpbnZva2UgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPi4KLSAgICAgIDxwPjxzdHJvbmc+U3VnZ2VzdGVkIFJlc29sdXRpb246PC9zdHJvbmc+PC9wPgotICAgICAgICBSZW1vdmUgdGhlIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGFubm90YXRpb24sIHJlbW92ZSB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBjYWxsLCBvciByZS1mYWN0b3IgeW91ciB0ZXN0cy4KLSAgICA8L2RkPgotPC9kbD4KKyAgICA8bGk+CisgICAgICAgIFRoZSBzYW1wbGUgdGVzdCBwYWNrYWdlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9BbGFybVNlcnZpY2VUZXN0In0+CisgICAgICAgIEFsYXJtIFNlcnZpY2UgVGVzdDwvYT4gaXMgYW4gZXhhbXBsZSBvZiB0ZXN0aW5nIGEge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LiBJdCBjb250YWlucworICAgICAgICBhIHNldCBvZiB1bml0IHRlc3RzIGZvciB0aGUgQWxhcm0gU2VydmljZSBzYW1wbGUgYXBwbGljYXRpb24ncyB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uCisgICAgPC9saT4KKzwvdWw+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy93aGF0X3RvX3Rlc3QuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzUzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0LmpkCkBAIC0wLDAgKzEsODQgQEAKK3BhZ2UudGl0bGU9V2hhdCBUbyBUZXN0CitAamQ6Ym9keQorPHA+CisgICAgQXMgeW91IGRldmVsb3AgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGtub3dpbmcgd2hhdCB0byB0ZXN0IGlzIGFzIGltcG9ydGFudCBhcyBrbm93aW5nIGhvdyB0bworICAgIHRlc3QuIFRoaXMgZG9jdW1lbnQgbGlzdHMgc29tZSBtb3N0IGNvbW1vbiBBbmRyb2lkLXJlbGF0ZWQgc2l0dWF0aW9ucyB0aGF0IHlvdSBzaG91bGQgY29uc2lkZXIKKyAgICB3aGVuIHlvdSB0ZXN0LCBldmVuIGF0IHRoZSB1bml0IHRlc3QgbGV2ZWwuIFRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCwgYW5kIHlvdSBjb25zdWx0IHRoZQorICAgIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmZWF0dXJlcyB0aGF0IHlvdSB1c2UgZm9yIG1vcmUgaWRlYXMuIFRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9hbmRyb2lkLWRldmVsb3BlcnMiPmFuZHJvaWQtZGV2ZWxvcGVyczwvYT4gR29vZ2xlIEdyb3VwcworICAgIHNpdGUgaXMgYW5vdGhlciByZXNvdXJjZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGVzdGluZy4KKzwvcD4KKzxoMiBpZD0iVGVzdHMiPklkZWFzIGZvciBUZXN0aW5nPC9oMj4KKzxwPgorICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgYXJlIG9yZ2FuaXplZCBieSBiZWhhdmlvcnMgb3Igc2l0dWF0aW9ucyB0aGF0IHlvdSBzaG91bGQgdGVzdC4gRWFjaAorICAgIHNlY3Rpb24gY29udGFpbnMgYSBzY2VuYXJpbyB0aGF0IGZ1cnRoZXIgaWxsdXN0cmF0ZXMgdGhlIHNpdHVhdGlvbiBhbmQgdGhlIHRlc3Qgb3IgdGVzdHMgeW91CisgICAgc2hvdWxkIGRvLgorPC9wPgorPGg0PkNoYW5nZSBpbiBvcmllbnRhdGlvbjwvaDQ+Cis8cD4KKyAgICBGb3IgZGV2aWNlcyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgb3JpZW50YXRpb25zLCBBbmRyb2lkIGRldGVjdHMgYSBjaGFuZ2UgaW4gb3JpZW50YXRpb24gd2hlbgorICAgIHRoZSB1c2VyIHR1cm5zIHRoZSBkZXZpY2Ugc28gdGhhdCB0aGUgZGlzcGxheSBpcyAibGFuZHNjYXBlIiAobG9uZyBlZGdlIGlzIGhvcml6b250YWwpIGluc3RlYWQKKyAgICBvZiAicG9ydHJhaXQiIChsb25nIGVkZ2UgaXMgdmVydGljYWwpLgorPC9wPgorPHA+CisgICAgV2hlbiBBbmRyb2lkIGRldGVjdHMgYSBjaGFuZ2UgaW4gb3JpZW50YXRpb24sIGl0cyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlc3Ryb3kgYW5kIHRoZW4KKyAgICByZS1zdGFydCB0aGUgZm9yZWdyb3VuZCBBY3Rpdml0eS4gWW91IHNob3VsZCBjb25zaWRlciB0ZXN0aW5nIHRoZSBmb2xsb3dpbmc6Cis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBJcyB0aGUgc2NyZWVuIHJlLWRyYXduIGNvcnJlY3RseT8gQW55IGN1c3RvbSBVSSBjb2RlIHlvdSBoYXZlIHNob3VsZCBoYW5kbGUgY2hhbmdlcyBpbiB0aGUKKyAgICAgICAgb3JpZW50YXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIERvZXMgdGhlIGFwcGxpY2F0aW9uIG1haW50YWluIGl0cyBzdGF0ZT8gVGhlIEFjdGl2aXR5IHNob3VsZCBub3QgbG9zZSBhbnl0aGluZyB0aGF0IHRoZQorICAgICAgICB1c2VyIGhhcyBhbHJlYWR5IGVudGVyZWQgaW50byB0aGUgVUkuIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90ICJmb3JnZXQiIGl0cyBwbGFjZSBpbiB0aGUKKyAgICAgICAgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICA8L2xpPgorPC91bD4KKzxoND5DaGFuZ2UgaW4gY29uZmlndXJhdGlvbjwvaDQ+Cis8cD4KKyAgICBBIHNpdHVhdGlvbiB0aGF0IGlzIG1vcmUgZ2VuZXJhbCB0aGFuIGEgY2hhbmdlIGluIG9yaWVudGF0aW9uIGlzIGEgY2hhbmdlIGluIHRoZSBkZXZpY2UncworICAgIGNvbmZpZ3VyYXRpb24sIHN1Y2ggYXMgYSBjaGFuZ2UgaW4gdGhlIGF2YWlsYWJpbGl0eSBvZiBhIGtleWJvYXJkIG9yIGEgY2hhbmdlIGluIHN5c3RlbQorICAgIGxhbmd1YWdlLgorPC9wPgorPHA+CisgICAgQSBjaGFuZ2UgaW4gY29uZmlndXJhdGlvbiBhbHNvIHRyaWdnZXJzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGRlc3Ryb3lpbmcgYW5kIHRoZW4gcmVzdGFydGluZworICAgIHRoZSBmb3JlZ3JvdW5kIEFjdGl2aXR5LiBCZXNpZGVzIHRlc3RpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gbWFpbnRhaW5zIHRoZSBVSSBhbmQgaXRzCisgICAgdHJhbnNhY3Rpb24gc3RhdGUsIHlvdSBzaG91bGQgYWxzbyB0ZXN0IHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVwZGF0ZXMgaXRzZWxmIHRvIHJlc3BvbmQKKyAgICBjb3JyZWN0bHkgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uLgorPC9wPgorPGg0PkJhdHRlcnkgbGlmZTwvaDQ+Cis8cD4KKyAgICBNb2JpbGUgZGV2aWNlcyBwcmltYXJpbHkgcnVuIG9uIGJhdHRlcnkgcG93ZXIuIEEgZGV2aWNlIGhhcyBmaW5pdGUgImJhdHRlcnkgYnVkZ2V0IiwgYW5kIHdoZW4gaXQKKyAgICBpcyBnb25lLCB0aGUgZGV2aWNlIGlzIHVzZWxlc3MgdW50aWwgaXQgaXMgcmVjaGFyZ2VkLiBZb3UgbmVlZCB0byB3cml0ZSB5b3VyIGFwcGxpY2F0aW9uIHRvCisgICAgbWluaW1pemUgYmF0dGVyeSB1c2FnZSwgeW91IG5lZWQgdG8gdGVzdCBpdHMgYmF0dGVyeSBwZXJmb3JtYW5jZSwgYW5kIHlvdSBuZWVkIHRvIHRlc3QgdGhlCisgICAgbWV0aG9kcyB0aGF0IG1hbmFnZSBiYXR0ZXJ5IHVzYWdlLgorPC9wPgorPHA+CisgICAgVGVjaG5pcXVlcyBmb3IgbWluaW1pemluZyBiYXR0ZXJ5IHVzYWdlIHdlcmUgcHJlc2VudGVkIGF0IHRoZSAyMDEwIEdvb2dsZSBJL08gY29uZmVyZW5jZSBpbiB0aGUKKyAgICBwcmVzZW50YXRpb24KKyAgICA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL2V2ZW50cy9pby8yMDA5L3Nlc3Npb25zL0NvZGluZ0xpZmVCYXR0ZXJ5TGlmZS5odG1sIj4KKyAgICBDb2RpbmcgZm9yIExpZmUgLS0gQmF0dGVyeSBMaWZlLCBUaGF0IElzPC9hPi4gVGhpcyBwcmVzZW50YXRpb24gZGVzY3JpYmVzIHRoZSBpbXBhY3Qgb24gYmF0dGVyeQorICAgIGxpZmUgb2YgdmFyaW91cyBvcGVyYXRpb25zLCBhbmQgdGhlIHdheXMgeW91IGNhbiBkZXNpZ24geW91ciBhcHBsaWNhdGlvbiB0byBtaW5pbWl6ZSB0aGVzZQorICAgIGltcGFjdHMuIFdoZW4geW91IGNvZGUgeW91ciBhcHBsaWNhdGlvbiB0byByZWR1Y2UgYmF0dGVyeSB1c2FnZSwgeW91IGFsc28gd3JpdGUgdGhlCisgICAgYXBwcm9wcmlhdGUgdW5pdCB0ZXN0cy4KKzwvcD4KKzxoND5EZXBlbmRlbmNlIG9uIGV4dGVybmFsIHJlc291cmNlczwvaDQ+Cis8cD4KKyAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIGRlcGVuZHMgb24gbmV0d29yayBhY2Nlc3MsIFNNUywgQmx1ZXRvb3RoLCBvciBHUFMsIHRoZW4geW91IHNob3VsZAorICAgIHRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHJlc291cmNlIG9yIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZS4KKzwvcD4KKzxwPgorICAgIEZvciBleGFtcGxlLCBpZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgdGhlIG5ldHdvcmssaXQgY2FuIG5vdGlmeSB0aGUgdXNlciBpZiBhY2Nlc3MgaXMKKyAgICB1bmF2YWlsYWJsZSwgb3IgZGlzYWJsZSBuZXR3b3JrLXJlbGF0ZWQgZmVhdHVyZXMsIG9yIGRvIGJvdGguIEZvciBHUFMsIGl0IGNhbiBzd2l0Y2ggdG8KKyAgICBJUC1iYXNlZCBsb2NhdGlvbiBhd2FyZW5lc3MuIEl0IGNhbiBhbHNvIHdhaXQgZm9yIFdpRmkgYWNjZXNzIGJlZm9yZSBkb2luZyBsYXJnZSBkYXRhIHRyYW5zZmVycywKKyAgICBzaW5jZSBXaUZpIHRyYW5zZmVycyBtYXhpbWl6ZSBiYXR0ZXJ5IHVzYWdlIGNvbXBhcmVkIHRvIHRyYW5zZmVycyBvdmVyIDNHIG9yIEVER0UuCis8L3A+Cis8cD4KKyAgICBZb3UgY2FuIHVzZSB0aGUgZW11bGF0b3IgdG8gdGVzdCBuZXR3b3JrIGFjY2VzcyBhbmQgYmFuZHdpZHRoLiBUbyBsZWFybiBtb3JlLCBwbGVhc2Ugc2VlCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvZW11bGF0b3IuaHRtbCNuZXRzcGVlZCI+TmV0d29yayBTcGVlZCBFbXVsYXRpb248L2E+LgorICAgIFRvIHRlc3QgR1BTLCB5b3UgY2FuIHVzZSB0aGUgZW11bGF0b3IgY29uc29sZSBhbmQge0BsaW5rIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyfS4gVG8KKyAgICBsZWFybiBtb3JlIGFib3V0IHRoZSBlbXVsYXRvciBjb25zb2xlLCBwbGVhc2Ugc2VlCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fS9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwjY29uc29sZSI+CisgICAgVXNpbmcgdGhlIEVtdWxhdG9yIENvbnNvbGU8L2E+LgorPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9kaWFsb2dzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9kaWFsb2dzLmpkCmluZGV4IDFhOTk3ZjkuLjg3OWViOGIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvZGlhbG9ncy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VpL2RpYWxvZ3MuamQKQEAgLTQ3MywxOCArNDczLDI1IEBACiAgICAgICAgICAgICBwcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhOb3RpZmljYXRpb25UZXN0LnRoaXMpOwogICAgICAgICAgICAgcHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3NTdHlsZShQcm9ncmVzc0RpYWxvZy5TVFlMRV9IT1JJWk9OVEFMKTsKICAgICAgICAgICAgIHByb2dyZXNzRGlhbG9nLnNldE1lc3NhZ2UoIkxvYWRpbmcuLi4iKTsKLSAgICAgICAgICAgIHByb2dyZXNzVGhyZWFkID0gbmV3IFByb2dyZXNzVGhyZWFkKGhhbmRsZXIpOwotICAgICAgICAgICAgcHJvZ3Jlc3NUaHJlYWQuc3RhcnQoKTsKICAgICAgICAgICAgIHJldHVybiBwcm9ncmVzc0RpYWxvZzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQogCisgICAgJiM2NDtPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlcGFyZURpYWxvZyhpbnQgaWQsIERpYWxvZyBkaWFsb2cpIHsKKyAgICAgICAgc3dpdGNoKGlkKSB7CisgICAgICAgIGNhc2UgUFJPR1JFU1NfRElBTE9HOgorICAgICAgICAgICAgcHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3MoMCk7CisgICAgICAgICAgICBwcm9ncmVzc1RocmVhZCA9IG5ldyBQcm9ncmVzc1RocmVhZChoYW5kbGVyKTsKKyAgICAgICAgICAgIHByb2dyZXNzVGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCiAgICAgLy8gRGVmaW5lIHRoZSBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIGFuZCB1cGRhdGUgdGhlIHByb2dyZXNzCiAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGludCB0b3RhbCA9IG1zZy5nZXREYXRhKCkuZ2V0SW50KCJ0b3RhbCIpOworICAgICAgICAgICAgaW50IHRvdGFsID0gbXNnLmFyZzE7CiAgICAgICAgICAgICBwcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzcyh0b3RhbCk7CiAgICAgICAgICAgICBpZiAodG90YWwgPj0gMTAwKXsKICAgICAgICAgICAgICAgICBkaXNtaXNzRGlhbG9nKFBST0dSRVNTX0RJQUxPRyk7CkBAIC01MTUsOSArNTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgTG9nLmUoIkVSUk9SIiwgIlRocmVhZCBJbnRlcnJ1cHRlZCIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBCdW5kbGUgYiA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICBiLnB1dEludCgidG90YWwiLCB0b3RhbCk7Ci0gICAgICAgICAgICAgICAgbXNnLnNldERhdGEoYik7CisgICAgICAgICAgICAgICAgbXNnLmFyZzEgPSB0b3RhbDsKICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgICAgIHRvdGFsKys7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdHV0b3JpYWxzL25vdGVwYWQvbm90ZXBhZC1leDIuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdHV0b3JpYWxzL25vdGVwYWQvbm90ZXBhZC1leDIuamQKaW5kZXggYTk0NWE2Mi4uODU0NzMxZiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3R1dG9yaWFscy9ub3RlcGFkL25vdGVwYWQtZXgyLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90dXRvcmlhbHMvbm90ZXBhZC9ub3RlcGFkLWV4Mi5qZApAQCAtODcsOCArODcsOCBAQAogICAgIG1lbnUgY2FsbGJhY2sgdXNlZCBmb3IgdGhlIG9wdGlvbnMgbWVudS4gSGVyZSwgd2UgYWRkIGp1c3Qgb25lIGxpbmUsIHdoaWNoIHdpbGwgYWRkIGEgbWVudSBpdGVtCiAgICAgdG8gZGVsZXRlIGEgbm90ZS4gQ2FsbCA8Y29kZT5tZW51LmFkZCgpPC9jb2RlPiBsaWtlIHNvOgogICAgICAgPHByZT4KLXB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQ29udGV4dE1lbnUoTWVudSBtZW51LCBWaWV3IHYKLSAgICAgICAgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CitwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KE1lbnUgbWVudSwgVmlldyB2LAorICAgICAgICBDb250ZXh0TWVudS5Db250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKICAgICBtZW51LmFkZCgwLCBERUxFVEVfSUQsIDAsIFIuc3RyaW5nLm1lbnVfZGVsZXRlKTsKIH08L3ByZT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fYmFja3N0YWNrLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fYmFja3N0YWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZlMzNmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2ltYWdlcy9mdW5kYW1lbnRhbHMvZGlhZ3JhbV9iYWNrc3RhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fYmFja3N0YWNrX3NpbmdsZXRhc2tfbXVsdGlhY3Rpdml0eS5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX2JhY2tzdGFja19zaW5nbGV0YXNrX211bHRpYWN0aXZpdHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTIxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX2JhY2tzdGFja19zaW5nbGV0YXNrX211bHRpYWN0aXZpdHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fbXVsdGlwbGVfaW5zdGFuY2VzLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fbXVsdGlwbGVfaW5zdGFuY2VzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBlNzc4OAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fbXVsdGlwbGVfaW5zdGFuY2VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX211bHRpdGFza2luZy5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX211bHRpdGFza2luZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjN2I0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fbXVsdGl0YXNraW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9yZXN0b3JlX2luc3RhbmNlLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL3Jlc3RvcmVfaW5zdGFuY2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDI4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9yZXN0b3JlX2luc3RhbmNlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmcKaW5kZXggNmY4MDUzMC4uNDU5OTc1YyAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL2FuZHJvaWRfdGVzdF9mcmFtZXdvcmsucG5nCisrKyBiL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvZWNsaXBzZV90ZXN0X3Jlc3VsdHMucG5nIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL2VjbGlwc2VfdGVzdF9yZXN1bHRzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDVlMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL2VjbGlwc2VfdGVzdF9yZXN1bHRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvZWNsaXBzZV90ZXN0X3J1bl9mYWlsdXJlLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy9lY2xpcHNlX3Rlc3RfcnVuX2ZhaWx1cmUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTExMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvZWNsaXBzZV90ZXN0X3J1bl9mYWlsdXJlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM1ZmMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2Jyb3dzZXIuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Jyb3dzZXIuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwODc2OQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZApAQCAtMCwwICsxLDQ5IEBACitwYWdlLnRpdGxlPVRlY2huaWNhbCBSZXNvdXJjZXMKK0BqZDpib2R5CisKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIHtAbGl0ZXJhbCBAaW1wb3J0fSAie0Bkb2NSb290fWFzc2V0cy9hbmRyb2lkLWRldmVsb3Blci1yZXNvdXJjZS1icm93c2VyLmNzcyI7Cis8L3N0eWxlPgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLXJlc291cmNlLWJyb3dzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9taWNyb3RlbXBsYXRlLmpzIj48L3NjcmlwdD4KKworPGRpdj4KKyAgPHAgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGZsb2F0OiByaWdodCI+RmlsdGVyOiA8aW5wdXQgaWQ9InJlc291cmNlLWJyb3dzZXIta2V5d29yZC1maWx0ZXIiLz48L3A+CisgIDxwIGlkPSJyZXNvdXJjZS1icm93c2VyLXNlYXJjaC1wYXJhbXMiPlNob3dpbmcgYWxsIHRlY2huaWNhbCByZXNvdXJjZXM6PC9wPgorPC9kaXY+CisKKzxub3NjcmlwdD4KKyAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+CisgICAgWW91IG11c3QgaGF2ZSBKYXZhU2NyaXB0IGVuYWJsZWQgdG8gdmlldyB0aGlzIHBhZ2UuIFJlc291cmNlcyBhcmUgYWxzbworICAgIGF2YWlsYWJsZSBvZmZsaW5lIGluIHRoZSBTREsuCisgIDwvcD4KKzwvbm9zY3JpcHQ+CisKKzxkaXYgaWQ9InJlc291cmNlLWJyb3dzZXItcmVzdWx0cyI+CisgIDxkaXYgY2xhc3M9Im5vLXJlc3VsdHMiPk5vIHJlc3VsdHMuPC9kaXY+Cis8L2Rpdj4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2h0bWwiIGlkPSJ0bXBsX3Jlc291cmNlX2Jyb3dzZXJfcmVzdWx0Ij4KKzxkaXYgY2xhc3M9InJlc3VsdCI+CisgIDxoMz4KKyAgICA8JSBpZiAoJ2V4dGVybmFsJyBpbiB0YWdzSGFzaCkgeyAlPjxzdHJvbmc+RXh0ZXJuYWw6IDwvc3Ryb25nPiA8JSB9ICU+CisgICAgPGEgaHJlZj0iPCU9IHBhdGggJT4iPjwlPSB0aXRsZS5lbiAlPjwvYT4KKyAgICA8JSBpZiAoJ25ldycgaW4gdGFnc0hhc2gpIHsgJT48c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPiA8JSB9ICU+CisgIDwvaDM+CisgIDxwIGNsYXNzPSJyZXNvdXJjZS1tZXRhIj48JQorICAgIHZhciBfX2cgPSBbJycsICcnXTsKKyAgICBpZiAoJ2FydGljbGUnIGluIHRhZ3NIYXNoKSB7CisgICAgICBfX2cgPSBbJ0FydGljbGUnLCAnYWJvdXQnXTsKKyAgICB9IGVsc2UgaWYgKCd0dXRvcmlhbCcgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnVHV0b3JpYWwnLCAnb24nXTsKKyAgICB9IGVsc2UgaWYgKCdzYW1wbGUnIGluIHRhZ3NIYXNoKSB7CisgICAgICBfX2cgPSBbJ1NhbXBsZScsICdmb3InXTsKKyAgICB9IGVsc2UgaWYgKCd2aWRlbycgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnVmlkZW8nLCAnYWJvdXQnXTsKKyAgICB9CisgICU+CisgIDwlPSBfX2dbMF0gJT48JSBpZiAodG9waWNzSHRtbCkgeyAlPiA8JT0gX19nWzFdICU+PCUgfSAlPiA8JT0gdG9waWNzSHRtbCAlPjwvcD4KKyAgPHA+PCU9IGRlc2NyaXB0aW9uLmVuICU+PC9wPgorPC9kaXY+Cis8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2luZGV4LmpkCmluZGV4IDE2Njg3MjEuLjkwNTU4NjggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZApAQCAtMSwzOCArMSw5MCBAQAogcGFnZS50aXRsZT1EZXZlbG9wZXIgUmVzb3VyY2VzCiBAamQ6Ym9keQogCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAjcmVzb3VyY2UtbGlzdC10YWJsZSB0ZCB7CisgICAgYm9yZGVyOiAwOworICAgIHBhZGRpbmc6IDAgMjRweDsKKyAgICB3aWR0aDogMzMlOworICAgIG1heC13aWR0aDogMjUwcHg7CisgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZDsKKyAgfQorCisgICNyZXNvdXJjZS1saXN0LXRhYmxlIHRkLmxhc3QgeworICAgIGJvcmRlci1yaWdodDogMDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAwOworICB9Cis8L3N0eWxlPgorCiA8cD4KLVRoaXMgc2VjdGlvbiBwcm92aWRlcyB0ZWNobmljYWwgYXJ0aWNsZXMsIHR1dG9yaWFscywgc2FtcGxlIGNvZGUsIGFuZCBvdGhlcgorVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGFydGljbGVzLCB0dXRvcmlhbHMsIHNhbXBsZSBjb2RlLCBhbmQgb3RoZXIKIGluZm9ybWF0aW9uIHRvIGhlbHAgeW91IHF1aWNrbHkgaW1wbGVtZW50IHRoZSBmZWF0dXJlcyB5b3Ugd2FudCBpbiB5b3VyCi1hcHBsaWNhdGlvbi4KK2FwcGxpY2F0aW9uLiBUbyByZXR1cm4gdG8gdGhpcyBwYWdlIGxhdGVyLCBqdXN0IGNsaWNrIHRoZSAiUmVzb3VyY2VzIgordGFiIHdoaWxlIGFueSBSZXNvdXJjZXMgcGFnZSBpcyBsb2FkZWQuCiA8L3A+CiAKKzxoMj5UZWNobmljYWwgUmVzb3VyY2VzPC9oMj4KKworPHRhYmxlIGlkPSJyZXNvdXJjZS1saXN0LXRhYmxlIj4KKzx0cj4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy1zYW1wbGUucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9c2FtcGxlIj4KKyAgICAgIFNhbXBsZSBDb2RlCisgICAgPC9hPjwvaDM+CisgICAgPHA+RnVsbHktZnVuY3Rpb25pbmcgc2FtcGxlIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBjYW4gYnVpbGQgYW5kIHJ1bgorICAgIHRvIGxlYXJuIGFib3V0IGhvdyBBbmRyb2lkIHdvcmtzLiBGZWVsIGZyZWUgdG8gcmV1c2UgYW55IG9mIHRoZSBjb2RlIG9yCisgICAgdGVjaG5pcXVlcyBpbiB0aGUgc2FtcGxlcy48L3A+CisgIDwvdGQ+CisgIDx0ZD4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZSI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLWFydGljbGUucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZSI+CisgICAgICBBcnRpY2xlcworICAgIDwvYT48L2gzPgorICAgIDxwPkZvY3VzZWQgZGlzY3Vzc2lvbnMgYWJvdXQgQW5kcm9pZCBkZXZlbG9wbWVudCBzdWJqZWN0cywgaW5jbHVkaW5nCisgICAgb3B0aW1pemF0aW9ucywgdGlwcywgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb25zLCAiaG93LXRvcyIsCisgICAgYW5kIHNvIG9uLjwvcD4KKyAgPC90ZD4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz10dXRvcmlhbCI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXR1dG9yaWFsLnBuZyIvPgorICAgIDwvYT4KKyAgICA8aDM+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXR1dG9yaWFsIj4KKyAgICAgIFR1dG9yaWFscworICAgIDwvYT48L2gzPgorICAgIDxwPlN0ZXAtYnktc3RlcCBpbnN0cnVjdGlvbnMgZGVtb25zdHJhdGluZyBob3cgdG8gYnVpbGQgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbgorICAgIHRoYXQgaGFzIHRoZSBzcGVjaWZpYyBmZWF0dXJlcyB5b3Ugd2FudC48L3A+CisgIDwvdGQ+CisgIDwhLS0gPHRkIGNsYXNzPSJsYXN0Ij4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dmlkZW8iPgorICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy12aWRlby5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz12aWRlbyI+CisgICAgICBWaWRlb3MgJmFtcDsgU2NyZWVuY2FzdHMKKyAgICA8L2E+PC9oMz4KKyAgICA8cD5WaWRlb3MgYW5kIHByZXNlbnRhdGlvbiBzbGlkZXMgZnJvbSBkZXZlbG9wZXIgZXZlbnRzLCBhbG9uZyB3aXRoCisgICAgc2NyZWVuY2FzdHMgdG8gd2FsayB5b3UgdGhyb3VnaCBjb21tb24gQW5kcm9pZCBkZXZlbG9wbWVudAorICAgIHdvcmtmbG93cy48L3A+CisgIDwvdGQ+IC0tPgorPC90cj4KKzwvdGFibGU+CisKKzxoMj5PdGhlciBSZXNvdXJjZXM8L2gyPgorCiA8ZGw+Ci08ZHQ+PGI+VGVjaG5pY2FsIEFydGljbGVzPC9iPjwvZHQ+Ci08ZGQ+Rm9jdXNlZCBkaXNjdXNzaW9ucyBhYm91dCBBbmRyb2lkIGRldmVsb3BtZW50IHN1YmplY3RzLCBpbmNsdWRpbmcKLW9wdGltaXphdGlvbnMsIHRpcHMsIGludGVyZXN0aW5nIGltcGxlbWVudGF0aW9ucywKLWFuZCBzbyBvbi4gTW9zdCBvZiB0aGUgYXJ0aWNsZXMgcHJvdmlkZSAiaG93LXRvIiBpbnN0cnVjdGlvbnMgZm9yIGFkZGluZwotZmVhdHVyZXMgb3IgZnVuY3Rpb25hbGl0eSB0byB5b3VyIGFwcC4gVGhlIGFydGljbGVzIGFyZSBkcmF3biBmcm9tIHBvc3RzIHRvIHRoZQotQW5kcm9pZCBEZXZlbG9wZXJzIEJsb2cuCi08L2RkPgotCi08ZHQ+PGI+VHV0b3JpYWxzPC9iPjwvZHQ+Ci08ZGQ+U3RlcC1ieS1zdGVwIGluc3RydWN0aW9ucyBkZW1vbnN0cmF0aW5nIGhvdyB0byBidWlsZCBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uCi10aGF0IGhhcyB0aGUgc3BlY2lmaWMgZmVhdHVyZXMgeW91IHdhbnQuIDwvZGQ+Ci0KLTxkdD48Yj5TYW1wbGUgQ29kZTwvYj48L2R0PgotPGRkPkZ1bGx5LWZ1bmN0aW9uaW5nIHNhbXBsZSBhcHBsaWNhdGlvbnMgdGhhdCB5b3UgY2FuIGxvb2sgYXQgb3IgYnVpbGQgYW5kIHJ1biwKLXRvIGxlYXJuIGFib3V0IGhvdyBBbmRyb2lkIHdvcmtzLiBGZWVsIGZyZWUgdG8gcmV1c2UgYW55IG9mIHRoZSBjb2RlIG9yCi10ZWNobmlxdWVzIHRoYXQgeW91IGZpbmQgaW4gdGhlIHNhbXBsZXMhPC9kZD4KLQogPGR0PjxiPkNvbW11bml0eTwvYj48L2R0PgogPGRkPkxpbmtzIHRvIHRoZSBBbmRyb2lkIGRpc2N1c3Npb24gZ3JvdXBzIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciB3YXlzIHRvCiBjb2xsYWJvcmF0ZSB3aXRoIG90aGVyIGRldmVsb3BlcnMuIDwvZGQ+CiAKKzxkdD48Yj5EZXZpY2UgRGFzaGJvYXJkPC9iPjwvZHQ+Cis8ZGQ+RGV2aWNlIGRpc3RyaWJ1dGlvbiBkYXRhLCBncm91cGVkIGJ5IHZhcmlvdXMgZGltZW5zaW9ucyBzdWNoIGFzIHNjcmVlbiBzaXplCithbmQgQW5kcm9pZCBwbGF0Zm9ybSB2ZXJzaW9uLiA8L2RkPgorCiA8ZHQ+PGI+TW9yZTwvYj48L2R0PgogPGRkPlF1aWNrIGRldmVsb3BtZW50IHRpcHMsIHRyb3VibGVzaG9vdGluZyBpbmZvcm1hdGlvbiwgYW5kIGZyZXF1ZW50bHkgYXNrZWQKIHF1ZXN0aW9ucyAoRkFRcykuIDwvZGQ+CiA8L2RsPgotCi08cD5UbyByZXR1cm4gdG8gdGhpcyBwYWdlIGxhdGVyLCBqdXN0IGNsaWNrIHRoZSAiUmVzb3VyY2VzIiB0YWIgd2hpbGUgYW55Ci1SZXNvdXJjZXMgcGFnZSBpcyBsb2FkZWQuIDwvcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDZiNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcwpAQCAtMCwwICsxLDYzMiBAQAordmFyIEFORFJPSURfVEFHUyA9IHsKKyAgdHlwZTogeworICAgICdhcnRpY2xlJzogJ0FydGljbGUnLAorICAgICd0dXRvcmlhbCc6ICdUdXRvcmlhbCcsCisgICAgJ3NhbXBsZSc6ICdTYW1wbGUnLAorICAgICd2aWRlbyc6ICdWaWRlbycsCisgICAgJ2xpYnJhcnknOiAnQ29kZSBMaWJyYXJ5JworICB9LAorICB0b3BpYzogeworICAgICdhY2Nlc3NpYmlsaXR5JzogJ0FjY2Vzc2liaWxpdHknLAorICAgICdhY2NvdW50c3luYyc6ICdBY2NvdW50cyAmYW1wOyBTeW5jJywKKyAgICAnYmVzdHByYWN0aWNlJzogJ0Jlc3QgUHJhY3RpY2VzJywKKyAgICAnY29tbXVuaWNhdGlvbic6ICdDb21tdW5pY2F0aW9uJywKKyAgICAnY29tcGF0aWJpbGl0eSc6ICdDb21wYXRpYmlsaXR5JywKKyAgICAnZGF0YSc6ICdEYXRhIEFjY2VzcycsCisgICAgJ2RyYXdpbmcnOiAnQ2FudmFzIERyYXdpbmcnLAorICAgICdnYW1lZGV2JzogJ0dhbWUgRGV2ZWxvcG1lbnQnLAorICAgICdnbCc6ICdPcGVuR0wgRVMnLAorICAgICdpbnB1dCc6ICdJbnB1dCBNZXRob2RzJywKKyAgICAnaW50ZW50JzogJ0ludGVudHMnLAorICAgICdsYXlvdXQnOiAnTGF5b3V0cy9WaWV3cycsCisgICAgJ21lZGlhJzogJ011bHRpbWVkaWEnLAorICAgICduZXdmZWF0dXJlJzogJ05ldyBGZWF0dXJlcycsCisgICAgJ3BlcmZvcm1hbmNlJzogJ1BlcmZvcm1hbmNlJywKKyAgICAnc2VhcmNoJzogJ1NlYXJjaCcsCisgICAgJ3Rlc3RpbmcnOiAnVGVzdGluZycsCisgICAgJ3VpJzogJ1VzZXIgSW50ZXJmYWNlJywKKyAgICAnd2ViJzogJ1dlYiBDb250ZW50JworICB9LAorICBtaXNjOiB7CisgICAgJ2V4dGVybmFsJzogJ0V4dGVybmFsJywKKyAgICAnbmV3JzogJ05ldycKKyAgfQorfTsKKwordmFyIEFORFJPSURfUkVTT1VSQ0VTID0gWworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vIFRFQ0hOSUNBTCBBUlRJQ0xFUyAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvYXZvaWRpbmctbWVtb3J5LWxlYWtzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0F2b2lkaW5nIE1lbW9yeSBMZWFrcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ01vYmlsZSBkZXZpY2VzIG9mdGVuIGhhdmUgbGltaXRlZCBtZW1vcnksIGFuZCBtZW1vcnkgbGVha3MgY2FuIGNhdXNlIHlvdXIgYXBwbGljYXRpb24gdG8gd2FzdGUgdGhpcyB2YWx1YWJsZSByZXNvdXJjZSB3aXRob3V0IHlvdXIga25vd2xlZGdlLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgdGlwcyB0byBoZWxwIHlvdSBhdm9pZCBjb21tb24gY2F1c2VzIG9mIG1lbW9yeSBsZWFrcyBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2NvbXBhdGliaWxpdHknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvYmFja3dhcmQtY29tcGF0aWJpbGl0eS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCYWNrd2FyZCBDb21wYXRpYmlsaXR5JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIEFuZHJvaWQgcGxhdGZvcm0gc3RyaXZlcyB0byBlbnN1cmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEhvd2V2ZXIsIHNvbWV0aW1lcyB5b3Ugd2FudCB0byB1c2UgbmV3IGZlYXR1cmVzIHdoaWNoIGFyZW5cJ3Qgc3VwcG9ydGVkIG9uIG9sZGVyIHBsYXRmb3Jtcy4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBzdHJhdGVnaWVzIGZvciBzZWxlY3RpdmVseSB1c2luZyB0aGVzZSBmZWF0dXJlcyBiYXNlZCBvbiBhdmFpbGFiaWxpdHksIGFsbG93aW5nIHlvdSB0byBrZWVwIHlvdXIgYXBwbGljYXRpb25zIHBvcnRhYmxlIGFjcm9zcyBhIHdpZGUgcmFuZ2Ugb2YgZGV2aWNlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2ludGVudCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9jYW4taS11c2UtdGhpcy1pbnRlbnQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ2FuIEkgVXNlIHRoaXMgSW50ZW50PycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuZHJvaWQgb2ZmZXJzIGEgdmVyeSBwb3dlcmZ1bCBhbmQgeWV0IGVhc3ktdG8tdXNlIG1lc3NhZ2UgdHlwZSBjYWxsZWQgYW4gaW50ZW50LiBZb3UgY2FuIHVzZSBpbnRlbnRzIHRvIHR1cm4gYXBwbGljYXRpb25zIGludG8gaGlnaC1sZXZlbCBsaWJyYXJpZXMgYW5kIG1ha2UgY29kZSBtb2R1bGFyIGFuZCByZXVzYWJsZS4gV2hpbGUgaXQgaXMgbmljZSB0byBiZSBhYmxlIHRvIG1ha2UgdXNlIG9mIGEgbG9vc2VseSBjb3VwbGVkIEFQSSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGludGVudCB5b3Ugc2VuZCB3aWxsIGJlIHJlY2VpdmVkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgYSB0ZWNobmlxdWUgeW91IGNhbiB1c2UgdG8gZmluZCBvdXQgd2hldGhlciB0aGUgc3lzdGVtIGNvbnRhaW5zIGFueSBhcHBsaWNhdGlvbiBjYXBhYmxlIG9mIHJlc3BvbmRpbmcgdG8gdGhlIGludGVudCB5b3Ugd2FudCB0byB1c2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9jcmVhdGluZy1pbnB1dC1tZXRob2QuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ3JlYXRpbmcgYW4gSW5wdXQgTWV0aG9kJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnSW5wdXQgTWV0aG9kIEVkaXRvcnMgKElNRXMpIHByb3ZpZGUgdGhlIG1lY2hhbmlzbSBmb3IgZW50ZXJpbmcgdGV4dCBpbnRvIHRleHQgZmllbGRzIGFuZCBvdGhlciBWaWV3cy4gQW5kcm9pZCBkZXZpY2VzIGNvbWUgYnVuZGxlZCB3aXRoIGF0IGxlYXN0IG9uZSBJTUUsIGJ1dCB1c2VycyBjYW4gaW5zdGFsbCBhZGRpdGlvbmFsIElNRXMuIFRoaXMgYXJ0aWNsZSBjb3ZlcnMgdGhlIGJhc2ljcyBvZiBkZXZlbG9waW5nIGFuIElNRSBmb3IgdGhlIEFuZHJvaWQgcGxhdGZvcm0uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdkcmF3aW5nJywgJ3VpJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2RyYXdhYmxlLW11dGF0aW9ucy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdEcmF3YWJsZSBNdXRhdGlvbnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdEcmF3YWJsZXMgYXJlIHBsdWdnYWJsZSBkcmF3aW5nIGNvbnRhaW5lcnMgdGhhdCBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZGlzcGxheSBncmFwaGljcy4gVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHNvbWUgY29tbW9uIHBpdGZhbGxzIHdoZW4gdHJ5aW5nIHRvIG1vZGlmeSB0aGUgcHJvcGVydGllcyBvZiBtdWx0aXBsZSBEcmF3YWJsZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdiZXN0cHJhY3RpY2UnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZmFzdGVyLXNjcmVlbi1vcmllbnRhdGlvbi1jaGFuZ2UuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnRmFzdGVyIFNjcmVlbiBPcmllbnRhdGlvbiBDaGFuZ2UnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdXaGVuIGFuIEFuZHJvaWQgZGV2aWNlIGNoYW5nZXMgaXRzIG9yaWVudGF0aW9uLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhdXRvbWF0aWNhbGx5IHJlc3RhcnQgdGhlIGN1cnJlbnQgYWN0aXZpdHkgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLiBIb3dldmVyLCB0aGlzIGNhbiBiZWNvbWUgYSBib3R0bGVuZWNrIGluIGFwcGxpY2F0aW9ucyB0aGF0IGFjY2VzcyBhIGxhcmdlIGFtb3VudCBvZiBleHRlcm5hbCBkYXRhLiBUaGlzIGFydGljbGUgZGlzY3Vzc2VzIGhvdyB0byBncmFjZWZ1bGx5IGhhbmRsZSB0aGlzIHNpdHVhdGlvbiB3aXRob3V0IHJlc29ydGluZyB0byBtYW51YWxseSBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2NvbXBhdGliaWxpdHknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZnV0dXJlLXByb29maW5nLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0Z1dHVyZS1Qcm9vZmluZyBZb3VyIEFwcHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGNvbGxlY3Rpb24gb2YgY29tbW9uIHNlbnNlIGFkdmljZSB0byBoZWxwIHlvdSBlbnN1cmUgdGhhdCB5b3VyIGFwcGxpY2F0aW9ucyBkb25cJ3QgYnJlYWsgd2hlbiBuZXcgdmVyc2lvbnMgb2YgdGhlIEFuZHJvaWQgcGxhdGZvcm0gYXJlIHJlbGVhc2VkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW5wdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZ2VzdHVyZXMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnR2VzdHVyZXMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUb3VjaCBzY3JlZW5zIGFsbG93IHVzZXJzIHRvIHBlcmZvcm0gZ2VzdHVyZXMsIHN1Y2ggYXMgdGFwcGluZywgZHJhZ2dpbmcsIGZsaW5naW5nLCBvciBzbGlkaW5nLCB0byBwZXJmb3JtIHZhcmlvdXMgYWN0aW9ucy4gVGhlIGdlc3R1cmVzIEFQSSBlbmFibGVzIHlvdXIgYXBwbGljYXRpb24gdG8gcmVjb2duaXplIGV2ZW4gY29tcGxpY2F0ZWQgZ2VzdHVyZXMgd2l0aCBlYXNlLiBUaGlzIGFydGljbGUgZXhwbGFpbnMgaG93IHRvIGludGVncmF0ZSB0aGlzIEFQSSBpbnRvIGFuIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnZ2FtZWRldicsICdnbCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9nbHN1cmZhY2V2aWV3Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0ludHJvZHVjaW5nIEdMU3VyZmFjZVZpZXcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgR0xTdXJmYWNlVmlldywgYSBjbGFzcyB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gaW1wbGVtZW50IDJEIG9yIDNEIE9wZW5HTCByZW5kZXJpbmcgaW5zaWRlIG9mIGFuIEFuZHJvaWQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdsYXlvdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1yZXVzZS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMYXlvdXQgVHJpY2tzOiBDcmVhdGluZyBSZXVzYWJsZSBVSSBDb21wb25lbnRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIGNvbWJpbmUgbXVsdGlwbGUgc3RhbmRhcmQgVUkgd2lkZ2V0cyBpbnRvIGEgc2luZ2xlIGhpZ2gtbGV2ZWwgY29tcG9uZW50LCB3aGljaCBjYW4gYmUgcmV1c2VkIHRocm91Z2hvdXQgeW91ciBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2xheW91dCcsICd1aScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1lZmZpY2llbmN5Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IENyZWF0aW5nIEVmZmljaWVudCBMYXlvdXRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIG9wdGltaXplIGFwcGxpY2F0aW9uIGxheW91dHMgYXMgdGhpcyBhcnRpY2xlIHdhbGtzIHlvdSB0aHJvdWdoIGNvbnZlcnRpbmcgYSBMaW5lYXJMYXlvdXQgaW50byBhIFJlbGF0aXZlTGF5b3V0LCBhbmQgYW5hbHl6ZXMgdGhlIHJlc3VsdGluZyBpbXBsaWNhdGlvbnMgb24gcGVyZm9ybWFuY2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdsYXlvdXQnLCAndWknLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xheW91dC10cmlja3Mtc3R1YnMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogVXNpbmcgVmlld1N0dWJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gYWJvdXQgdXNpbmcgVmlld1N0dWJzIGluc2lkZSBhbiBhcHBsaWNhdGlvblwncyBsYXlvdXQgaW4gb3JkZXIgdG8gaW5mbGF0ZSByYXJlbHkgdXNlZCBVSSBlbGVtZW50cywgd2l0aG91dCB0aGUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBjYXVzZWQgYnkgdXNpbmcgdGhlIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gdGFnLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbGF5b3V0JywgJ3VpJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLW1lcmdlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IE1lcmdpbmcgTGF5b3V0cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGhvdyB0byB1c2UgdGhlIDxjb2RlPiZsdDttZXJnZSZndDs8L2NvZGU+IHRhZyBpbiB5b3VyIFhNTCBsYXlvdXRzIGluIG9yZGVyIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGxldmVscyBvZiBoaWVyYXJjaHkgd2l0aGluIGFuIGFwcGxpY2F0aW9uXCdzIHZpZXcgdHJlZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3BlcmZvcm1hbmNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpc3R2aWV3LWJhY2tncm91bmRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xpc3RWaWV3IEJhY2tncm91bmRzOiBBbiBPcHRpbWl6YXRpb24nCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXN0Vmlld3MgYXJlIHZlcnkgcG9wdWxhciB3aWRnZXRzIHdpdGhpbiB0aGUgQW5kcm9pZCBmcmFtZXdvcmsuIFRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgc29tZSBvZiB0aGUgb3B0aW1pemF0aW9ucyB1c2VkIGJ5IHRoZSBMaXN0VmlldyB3aWRnZXQsIGFuZCBob3cgdG8gYXZvaWQgc29tZSBjb21tb24gaXNzdWVzIHRoYXQgdGhpcyBjYXVzZXMgd2hlbiB0cnlpbmcgdG8gdXNlIGEgY3VzdG9tIGJhY2tncm91bmQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpdmUtZm9sZGVycy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIEZvbGRlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXZlIEZvbGRlcnMgYWxsb3cgdXNlcnMgdG8gZGlzcGxheSBhbnkgc291cmNlIG9mIGRhdGEgb24gdGhlaXIgaG9tZSBzY3JlZW4gd2l0aG91dCBsYXVuY2hpbmcgYW4gYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIGV4cG9ydCBhbiBhcHBsaWNhdGlvblwncyBkYXRhIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkaXNwbGF5IGluc2lkZSBvZiBhIGxpdmUgZm9sZGVyLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9saXZlLXdhbGxwYXBlcnMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGl2ZSBXYWxscGFwZXJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGl2ZSB3YWxscGFwZXJzIGFyZSByaWNoZXIsIGFuaW1hdGVkLCBpbnRlcmFjdGl2ZSBiYWNrZ3JvdW5kcyB0aGF0IHVzZXJzIGNhbiBkaXNwbGF5IGluIHRoZWlyIGhvbWUgc2NyZWVucy4gTGVhcm4gaG93IHRvIGNyZWF0ZSBhIGxpdmUgd2FsbHBhcGVyIGFuZCBidW5kbGUgaXQgaW4gYW4gYXBwbGljYXRpb24gdGhhdCB1c2VycyBjYW4gaW5zdGFsbCBvbiB0aGVpciBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW5wdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvb24tc2NyZWVuLWlucHV0cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdPbnNjcmVlbiBJbnB1dCBNZXRob2RzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIElucHV0IE1ldGhvZCBGcmFtZXdvcmsgKElNRikgYWxsb3dzIHVzZXJzIHRvIHRha2UgYWR2YW50YWdlIG9mIG9uLXNjcmVlbiBpbnB1dCBtZXRob2RzLCBzdWNoIGFzIHNvZnR3YXJlIGtleWJvYXJkcy4gVGhpcyBhcnRpY2xlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIElucHV0IE1ldGhvZCBFZGl0b3JzIChJTUVzKSBhbmQgaG93IGFwcGxpY2F0aW9ucyBpbnRlcmFjdCB3aXRoIHRoZW0uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1BhaW5sZXNzIFRocmVhZGluZycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgdGhlIHRocmVhZGluZyBtb2RlbCB1c2VkIGJ5IEFuZHJvaWQgYXBwbGljYXRpb25zIGFuZCBob3cgYXBwbGljYXRpb25zIGNhbiBlbnN1cmUgYmVzdCBVSSBwZXJmb3JtYW5jZSBieSBzcGF3bmluZyB3b3JrZXIgdGhyZWFkcyB0byBoYW5kbGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMsIHJhdGhlciB0aGFuIGhhbmRsaW5nIHRoZW0gaW4gdGhlIG1haW4gdGhyZWFkLiBUaGUgYXJ0aWNsZSBhbHNvIGV4cGxhaW5zIHRoZSBBUEkgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gaW50ZXJhY3Qgd2l0aCBBbmRyb2lkIFVJIHRvb2xraXQgY29tcG9uZW50cyBydW5uaW5nIG9uIHRoZSBtYWluIHRocmVhZCBhbmQgc3Bhd24gbWFuYWdlZCB3b3JrZXIgdGhyZWFkcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3NlYXJjaCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9xc2IuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnUXVpY2sgU2VhcmNoIEJveCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1F1aWNrIFNlYXJjaCBCb3ggKFFTQikgaXMgYSBwb3dlcmZ1bCwgc3lzdGVtLXdpZGUgc2VhcmNoIGZyYW1ld29yay4gUVNCIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB1c2VycyB0byBxdWlja2x5IGFuZCBlYXNpbHkgZmluZCB3aGF0IHRoZXlcJ3JlIGxvb2tpbmcgZm9yLCBib3RoIG9uIHRoZWlyIGRldmljZXMgYW5kIG9uIHRoZSB3ZWIuIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIHdvcmsgd2l0aCB0aGUgUVNCIGZyYW1ld29yayB0byBhZGQgbmV3IHNlYXJjaCByZXN1bHRzIGZvciBhbiBpbnN0YWxsZWQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90b3VjaC1tb2RlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RvdWNoIE1vZGUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIHRvdWNoIG1vZGUsIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgcHJpbmNpcGxlcyBvZiBBbmRyb2lkXCdzIFVJIHRvb2xraXQuIFdoZW5ldmVyIGEgdXNlciBpbnRlcmFjdHMgd2l0aCBhIGRldmljZVwncyB0b3VjaCBzY3JlZW4sIHRoZSBzeXN0ZW0gZW50ZXJzIHRvdWNoIG1vZGUuIFdoaWxlIHNpbXBsZSBpbiBjb25jZXB0LCB0aGVyZSBhcmUgaW1wb3J0YW50IGltcGxpY2F0aW9ucyB0b3VjaCBtb2RlIHRoYXQgYXJlIG9mdGVuIG92ZXJsb29rZWQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdHJhY2stbWVtLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RyYWNraW5nIE1lbW9yeSBBbGxvY2F0aW9ucycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIHVzZSB0aGUgQWxsb2NhdGlvbiBUcmFja2VyIHRvb2wgdG8gb2JzZXJ2ZSBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGF2b2lkIHBlcmZvcm1hbmNlIHByb2JsZW1zIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGNhdXNlZCBieSBpZ25vcmluZyB0aGUgZWZmZWN0IG9mIERhbHZpa1wncyBnYXJiYWdlIGNvbGxlY3Rvci4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdWktMS41Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS41JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRXhwbG9yZSB0aGUgVUkgY2hhbmdlcyB0aGF0IHdlcmUgaW50cm9kdWNlZCBpbiBBbmRyb2lkIDEuNSwgY29tcGFyZWQgd2l0aCB0aGUgVUkgcHJvdmlkZWQgaW4gQW5kcm9pZCAxLjAgYW5kIDEuMS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdWktMS42Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS42JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRXhwbG9yZSB0aGUgVUkgY2hhbmdlcyB0aGF0IHdlcmUgaW50cm9kdWNlZCBpbiBBbmRyb2lkIDEuNiwgY29tcGFyZWQgd2l0aCB0aGUgVUkgcHJvdmlkZWQgaW4gQW5kcm9pZCAxLjUuIEluIHBhcnRpY3VsYXIsIHRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgY2hhbmdlcyB0byBSZWxhdGl2ZUxheW91dHMgYW5kIGNsaWNrIGxpc3RlbmVycy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90aW1lZC11aS11cGRhdGVzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VwZGF0aW5nIHRoZSBVSSBmcm9tIGEgVGltZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBhYm91dCBob3cgdG8gdXNlIEhhbmRsZXJzIGFzIGEgbW9yZSBlZmZpY2llbnQgcmVwbGFjZW1lbnQgZm9yIGphdmEudXRpbC5UaW1lciBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2FjY2Vzc2liaWxpdHknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdHRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VzaW5nIFRleHQtdG8tU3BlZWNoJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIHRleHQtdG8tc3BlZWNoIEFQSSBsZXRzIHlvdXIgYXBwbGljYXRpb24gInNwZWFrIiB0byB1c2VycywgaW4gYW55IG9mIHNldmVyYWwgbGFuZ3VhZ2VzLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIFRUUyBBUEkgYW5kIGhvdyB5b3UgdXNlIHRvIGFkZCBzcGVlY2ggY2FwYWJpbGl0aWVzIHRvIHlvdXIgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICd3ZWInXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdXNpbmctd2Vidmlld3MuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXNpbmcgV2ViVmlld3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdXZWJWaWV3cyBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBkeW5hbWljYWxseSBkaXNwbGF5IEhUTUwgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCwgd2l0aG91dCByZWxpbnF1aXNoaW5nIGNvbnRyb2wgdG8gYSBzZXBhcmF0ZSBicm93c2VyIGFwcGxpY2F0aW9uLiBUaGlzIGFydGljbGUgaW50cm9kdWNlcyB0aGUgV2ViVmlldyBjbGFzc2VzIGFuZCBwcm92aWRlcyBhIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBpdHMgdXNlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvd2lraW5vdGVzLWxpbmtpZnkuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2lraU5vdGVzOiBMaW5raWZ5IHlvdXIgVGV4dCEnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgaW50cm9kdWNlcyBXaWtpTm90ZXMgZm9yIEFuZHJvaWQsIHBhcnQgb2YgdGhlIEFwcHMgZm9yIEFuZHJvaWQgcHJvamVjdC4gSXQgY292ZXJzIHRoZSB1c2Ugb2YgTGlua2lmeSB0byB0dXJuIG9yZGluYXJ5IHRleHQgdmlld3MgaW50byByaWNoZXIsIGxpbmstb3JpZW50ZWQgY29udGVudCB0aGF0IGNhdXNlcyBBbmRyb2lkIGludGVudHMgdG8gZmlyZSB3aGVuIGEgbGluayBpcyBzZWxlY3RlZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2ludGVudCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aWtpbm90ZXMtaW50ZW50cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWtpTm90ZXM6IFJvdXRpbmcgSW50ZW50cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBpbGx1c3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24sIGluIHRoaXMgY2FzZSB0aGUgV2lraU5vdGVzIHNhbXBsZSBhcHAsIGNhbiB1c2UgaW50ZW50cyB0byByb3V0ZSB2YXJpb3VzIHR5cGVzIG9mIGxpbmtlZCB0ZXh0IHRvIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGhhbmRsZXMgdGhhdCB0eXBlIG9mIGRhdGEuIEZvciBleGFtcGxlLCBhbiBhcHAgY2FuIHVzZSBpbnRlbnRzIHRvIHJvdXRlIGEgbGlua2VkIHRlbGVwaG9uZSBudW1iZXIgdG8gYSBkaWFsZXIgYXBwIGFuZCBhIHdlYiBVUkwgdG8gYSBicm93c2VyLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAncGVyZm9ybWFuY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvd2luZG93LWJnLXNwZWVkLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpbmRvdyBCYWNrZ3JvdW5kcyAmIFVJIFNwZWVkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnU29tZSBBbmRyb2lkIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHNxdWVlemUgZXZlcnkgYml0IG9mIHBlcmZvcm1hbmNlIG91dCBvZiB0aGUgVUkgdG9vbGtpdCBhbmQgdGhlcmUgYXJlIG1hbnkgd2F5cyB0byBkbyBzby4gSW4gdGhpcyBhcnRpY2xlLCB5b3Ugd2lsbCBkaXNjb3ZlciBob3cgdG8gc3BlZWQgdXAgdGhlIGRyYXdpbmcgYW5kIHRoZSBwZXJjZWl2ZWQgc3RhcnR1cCB0aW1lIG9mIHlvdXIgYWN0aXZpdGllcy4gQm90aCBvZiB0aGVzZSB0ZWNobmlxdWVzIHJlbHkgb24gYSBzaW5nbGUgZmVhdHVyZSwgdGhlIHdpbmRvd1wncyBiYWNrZ3JvdW5kIGRyYXdhYmxlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3ppcGFsaWduLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1ppcGFsaWduOiBhbiBFYXN5IE9wdGltaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSBBbmRyb2lkIFNESyBpbmNsdWRlcyBhIHRvb2wgY2FsbGVkIHppcGFsaWduIHRoYXQgb3B0aW1pemVzIHRoZSB3YXkgYW4gYXBwbGljYXRpb24gaXMgcGFja2FnZWQuIFJ1bm5pbmcgemlwYWxpZ24gYWdhaW5zdCB5b3VyIGFwcGxpY2F0aW9uIGVuYWJsZXMgQW5kcm9pZCB0byBpbnRlcmFjdCB3aXRoIGl0IG1vcmUgZWZmaWNpZW50bHkgYXQgcnVuIHRpbWUgYW5kIHRodXMgaGFzIHRoZSBwb3RlbnRpYWwgdG8gbWFrZSBpdCBhbmQgdGhlIG92ZXJhbGwgc3lzdGVtIHJ1biBmYXN0ZXIuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgb2YgdGhlIHppcGFsaWduIHRvb2wgYW5kIGl0cyB1c2UuJworICAgIH0KKyAgfSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vIFNBTVBMRSBDT0RFIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdsYXlvdXQnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9BcGlEZW1vcy9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdBUEkgRGVtb3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHZhcmlldHkgb2Ygc21hbGwgYXBwbGljYXRpb25zIHRoYXQgZGVtb25zdHJhdGUgYW4gZXh0ZW5zaXZlIGNvbGxlY3Rpb24gb2YgZnJhbWV3b3JrIHRvcGljcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnZGF0YScsICduZXdmZWF0dXJlJywgJ2FjY291bnRzeW5jJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0JhY2t1cFJlc3RvcmUvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQmFja3VwIGFuZCBSZXN0b3JlJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnSWxsdXN0cmF0ZXMgYSBmZXcgZGlmZmVyZW50IGFwcHJvYWNoZXMgdGhhdCBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgY2FuIHRha2Ugd2hlbiBpbnRlZ3JhdGluZyB3aXRoIHRoZSBBbmRyb2lkIEJhY2t1cCBNYW5hZ2VyIHVzaW5nIHRoZSBCYWNrdXBBZ2VudCBBUEkgaW50cm9kdWNlZCBpbiBBbmRyb2lkIDIuMi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnY29tbXVuaWNhdGlvbiddLAorICAgIHBhdGg6ICdzYW1wbGVzL0JsdWV0b290aENoYXQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQmx1ZXRvb3RoIENoYXQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiBmb3IgdHdvLXdheSB0ZXh0IG1lc3NhZ2luZyBvdmVyIEJsdWV0b290aC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnYWNjb3VudHN5bmMnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9CdXNpbmVzc0NhcmQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQnVzaW5lc3NDYXJkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIGxhdW5jaCB0aGUgYnVpbHQtaW4gY29udGFjdCBwaWNrZXIgZnJvbSB3aXRoaW4gYW4gYWN0aXZpdHkuIFRoaXMgc2FtcGxlIGFsc28gdXNlcyByZWZsZWN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIGNvbnRhY3RzIEFQSSBpcyB1c2VkLCBkZXBlbmRpbmcgb24gd2hpY2ggQVBJIGxldmVsIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIHVuZGVyLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdhY2NvdW50c3luYyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0NvbnRhY3RNYW5hZ2VyL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0NvbnRhY3QgTWFuYWdlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBxdWVyeSB0aGUgc3lzdGVtIGNvbnRhY3RzIHByb3ZpZGVyICB1c2luZyB0aGUgPGNvZGU+Q29udGFjdHNDb250cmFjdDwvY29kZT4gQVBJLCBhcyB3ZWxsIGFzIGluc2VydCBjb250YWN0cyBpbnRvIGEgc3BlY2lmaWMgYWNjb3VudC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9Ib21lL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hvbWUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGhvbWUgc2NyZWVuIHJlcGxhY2VtZW50IGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdnYW1lZGV2JywgJ21lZGlhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvSmV0Qm95L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0pldEJveScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgZ2FtZSB0aGF0IGRlbW9uc3RyYXRlcyB0aGUgU09OaVZPWCBKRVQgaW50ZXJhY3RpdmUgbXVzaWMgdGVjaG5vbG9neSwgd2l0aCA8Y29kZT48YSBocmVmPSIvcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvSmV0UGxheWVyLmh0bWwiPkpldFBsYXllcjwvYT48L2NvZGU+LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQ3ViZUxpdmVXYWxscGFwZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGl2ZSBXYWxscGFwZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGEgbGl2ZSB3YWxscGFwZXIgYW5kICBidW5kbGUgaXQgaW4gYW4gYXBwbGljYXRpb24gdGhhdCB1c2VycyBjYW4gaW5zdGFsbCBvbiB0aGVpciBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdnYW1lZGV2JywgJ21lZGlhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvTHVuYXJMYW5kZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTHVuYXIgTGFuZGVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBjbGFzc2ljIEx1bmFyIExhbmRlciBnYW1lLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aScsICdiZXN0cHJhY3RpY2UnLCAnbGF5b3V0J10sCisgICAgcGF0aDogJ3NhbXBsZXMvTXVsdGlSZXNvbHV0aW9uL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ011bHRpcGxlIFJlc29sdXRpb25zJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzYW1wbGUgYXBwbGljYXRpb24gdGhhdCBzaG93cyBob3cgdG8gdXNlIHJlc291cmNlIGRpcmVjdG9yeSBxdWFsaWZpZXJzIHRvIHByb3ZpZGUgZGlmZmVyZW50IHJlc291cmNlcyBmb3IgZGlmZmVyZW50IHNjcmVlbiBjb25maWd1cmF0aW9ucy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnZGF0YSddLAorICAgIHBhdGg6ICdzYW1wbGVzL05vdGVQYWQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTm90ZSBQYWQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiBmb3Igc2F2aW5nIG5vdGVzLiBTaW1pbGFyIChidXQgbm90IGlkZW50aWNhbCkgdG8gdGhlIDxhIGhyZWY9Ii9yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCI+Tm90ZXBhZCB0dXRvcmlhbDwvYT4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2FjY291bnRzeW5jJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU2FtcGxlU3luY0FkYXB0ZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdEZW1vbnN0cmF0ZXMgaG93IGFuIGFwcGxpY2F0aW9uIGNhbiBjb21tdW5pY2F0ZSB3aXRoIGEgY2xvdWQtYmFzZWQgc2VydmljZSBhbmQgc3luY2hyb25pemUgaXRzIGRhdGEgd2l0aCBkYXRhIHN0b3JlZCBsb2NhbGx5IGluIGEgY29udGVudCBwcm92aWRlci4gVGhlIHNhbXBsZSB1c2VzIHR3byByZWxhdGVkIHBhcnRzIG9mIHRoZSBBbmRyb2lkIGZyYW1ld29yayAmbWRhc2g7IHRoZSBhY2NvdW50IG1hbmFnZXIgYW5kIHRoZSBzeW5jaHJvbml6YXRpb24gbWFuYWdlciAodGhyb3VnaCBhIHN5bmMgYWRhcHRlcikuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ3NlYXJjaCcsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTZWFyY2hhYmxlIERpY3Rpb25hcnkgdjInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBBbmRyb2lkXCdzIHNlYXJjaCBmcmFtZXdvcmssIGluY2x1ZGluZyBob3cgdG8gcHJvdmlkZSBzZWFyY2ggc3VnZ2VzdGlvbnMgZm9yIFF1aWNrIFNlYXJjaCBCb3guJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NuYWtlL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NuYWtlJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsYXNzaWMgZ2FtZSAiU25ha2UuIicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NwaW5uZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU3Bpbm5lcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2ltcGxlIGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIGFuIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZm9yIHRoZSBTcGlubmVyVGVzdCBleGFtcGxlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NwaW5uZXJUZXN0L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NwaW5uZXJUZXN0JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIHRlc3QgYXBwbGljYXRpb24gZm9yIHRoZSBBY3Rpdml0eSBUZXN0aW5nIHR1dG9yaWFsLiBJdCB0ZXN0cyB0aGUgU3Bpbm5lciBleGFtcGxlIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICduZXdmZWF0dXJlJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1RpY1RhY1RvZUxpYi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdUaWNUYWNUb2VMaWInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIGFuIEFuZHJvaWQgbGlicmFyeSBwcm9qZWN0LCBhIHR5cGUgb2YgcHJvamVjdCB0aGF0IGxldHMgeW91IHN0b3JlIGFuZCBtYW5hZ2Ugc2hhcmVkIGNvZGUgYW5kIHJlc291cmNlcyBpbiBvbmUgcGxhY2UsIHRoZW4gbWFrZSB0aGVtIGF2YWlsYWJsZSB0byB5b3VyIG90aGVyIEFuZHJvaWQgYXBwbGljYXRpb25zLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICduZXdmZWF0dXJlJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1RpY1RhY1RvZU1haW4vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVGljVGFjVG9lTWFpbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RlbW9uc3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24gY2FuIG1ha2UgdXNlIG9mIHNoYXJlZCBjb2RlIGFuZCByZXNvdXJjZXMgc3RvcmVkIGluIGFuIEFuZHJvaWQgbGlicmFyeSBwcm9qZWN0LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NvZnRLZXlib2FyZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTb2Z0IEtleWJvYXJkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gZXhhbXBsZSBvZiB3cml0aW5nIGFuIGlucHV0IG1ldGhvZCBmb3IgYSBzb2Z0d2FyZSBrZXlib2FyZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9XaWt0aW9uYXJ5L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa3Rpb25hcnknCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIGNyZWF0aW5nIGludGVyYWN0aXZlIHdpZGdldHMgZm9yIGRpc3BsYXkgb24gdGhlIEFuZHJvaWQgaG9tZSBzY3JlZW4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWt0aW9uYXJ5IChTaW1wbGlmaWVkKScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2ltcGxlIEFuZHJvaWQgaG9tZSBzY3JlZW4gd2lkZ2V0cyBleGFtcGxlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdsYXlvdXQnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvWG1sQWRhcHRlcnMvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnWE1MIEFkYXB0ZXJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQmluZGluZyBkYXRhIHRvIHZpZXdzIHVzaW5nIFhNTCBBZGFwdGVycyBleGFtcGxlcy4nCisgICAgfQorICB9LAorCisvLy8vLy8vLy8vLy8vLy8vLworLy8vIFRVVE9SSUFMUyAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIFdvcmxkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQmVnaW5uaW5nIGJhc2ljIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHdpdGggdGhlIEFuZHJvaWQgU0RLLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3VpJywgJ2xheW91dCddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvdmlld3MvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gVmlld3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHdhbGstdGhyb3VnaCBvZiB0aGUgdmFyaW91cyB0eXBlcyBvZiBsYXlvdXRzIGFuZCB2aWV3cyBhdmFpbGFibGUgaW4gdGhlIEFuZHJvaWQgU0RLLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3VpJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvbG9jYWxpemF0aW9uL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIExvY2FsaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSBiYXNpY3Mgb2YgbG9jYWxpemluZyB5b3VyIGFwcGxpY2F0aW9ucyBmb3IgbXVsdGlwbGUgbGFuZ3VhZ2VzIGFuZCBsb2NhbGVzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ2RhdGEnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTm90ZXBhZCBUdXRvcmlhbCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgbXVsdGktcGFydCB0dXRvcmlhbCBkaXNjdXNzaW5nIGludGVybWVkaWF0ZS1sZXZlbCBjb25jZXB0cyBzdWNoIGFzIGRhdGEgYWNjZXNzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIFRlc3RpbmcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGJhc2ljIGludHJvZHVjdGlvbiB0byB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yay4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0FjdGl2aXR5IFRlc3RpbmcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIG1vcmUgYWR2YW5jZWQgZGVtb25zdHJhdGlvbiBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayBhbmQgdG9vbHMuJworICAgIH0KKyAgfQorXTsKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcwppbmRleCA1MjY4OWI2Li5hMTcxMWI1IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzCkBAIC0xLDUgKzEsNTYgQEAKIDx1bD4KICAgPGxpPgorICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlRlY2huaWNhbCBSZXNvdXJjZXM8L3NwYW4+CisgICAgPC9oMj4KKyAgICA8dWw+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TYW1wbGUgQ29kZTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+QmVpc3BpZWxjb2RlPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5Dw7NkaWdvIGRlIGVqZW1wbG88L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkV4ZW1wbGUgZGUgY29kZTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q29kaWNlIGRpIGVzZW1waW88L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuOCteODs+ODl+ODqyDjgrPjg7zjg4k8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LXNhbXBsZS1saXN0Ij4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvZ2V0Lmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+R2V0dGluZyB0aGUgU2FtcGxlczwvc3Bhbj4KKyAgICAgICAgICAgICAgPC9hPjwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZSI+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkFydGljbGVzPC9zcGFuPgorICAgICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LWFydGljbGUtbGlzdCI+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dHV0b3JpYWwiPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UdXRvcmlhbHM8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkxlcm5wcm9ncmFtbWU8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPlR1dG9yaWFsZXM8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkRpZGFjdGljaWVsczwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXNlcmNpdGF6aW9uaTwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44OB44Ol44O844OI44Oq44Ki44OrPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi10dXRvcmlhbC1saXN0Ij4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdG9waWNzLmh0bWwiPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ub3BpY3M8L3NwYW4+CisgICAgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtdG9waWMtbGlzdCI+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT4KICAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5Db21tdW5pdHk8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iZGUiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJlcyI+Q29tdW5pZGFkPC9zcGFuPgpAQCAtMzQsMjQxICs4NSw2IEBACiAgIDwvbGk+PD9jcwogICAvaWYKID8+Ci0KLSAgPGxpPgotICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlRlY2huaWNhbCBBcnRpY2xlczwvc3Bhbj4KLSAgICA8L2gyPgotICAgIDx1bD4KLSAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgotICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGlzdCBvZiBBcnRpY2xlczwvc3Bhbj4KLSAgICAgICAgICAgICA8L2E+PC9kaXY+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9hdm9pZGluZy1tZW1vcnktbGVha3MuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Bdm9pZGluZyBNZW1vcnkgTGVha3M8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvYmFja3dhcmQtY29tcGF0aWJpbGl0eS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJhY2t3YXJkIENvbXBhdGliaWxpdHk8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvY2FuLWktdXNlLXRoaXMtaW50ZW50Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Q2FuIEkgVXNlIHRoaXMgSW50ZW50Pzwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9jcmVhdGluZy1pbnB1dC1tZXRob2QuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5DcmVhdGluZyBhbiBJbnB1dCBNZXRob2Q8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZHJhd2FibGUtbXV0YXRpb25zLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+RHJhd2FibGUgTXV0YXRpb25zPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2Zhc3Rlci1zY3JlZW4tb3JpZW50YXRpb24tY2hhbmdlLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+RmFzdGVyIFNjcmVlbiBPcmllbnRhdGlvbiBDaGFuZ2U8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZnV0dXJlLXByb29maW5nLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+RnV0dXJlLVByb29maW5nIFlvdXIgQXBwczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9nZXN0dXJlcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkdlc3R1cmVzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2dsc3VyZmFjZXZpZXcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5JbnRyb2R1Y2luZyBHTFN1cmZhY2VWaWV3PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3MtcmV1c2UuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBSZXVzaW5nIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9sYXlvdXQtdHJpY2tzLWVmZmljaWVuY3kuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBFZmZpY2llbmN5PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3Mtc3R1YnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBWaWV3U3R1YnMgPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3MtbWVyZ2UuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBNZXJnaW5nIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9saXN0dmlldy1iYWNrZ3JvdW5kcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpc3RWaWV3IEJhY2tncm91bmRzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xpdmUtZm9sZGVycy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpdmUgRm9sZGVyczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9saXZlLXdhbGxwYXBlcnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXZlIFdhbGxwYXBlcnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvb24tc2NyZWVuLWlucHV0cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk9uc2NyZWVuIElucHV0IE1ldGhvZHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+UGFpbmxlc3MgVGhyZWFkaW5nPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3FzYi5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlF1aWNrIFNlYXJjaCBCb3g8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvc3BlZWNoLWlucHV0Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U3BlZWNoIElucHV0PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3RvdWNoLW1vZGUuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ub3VjaCBNb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3RyYWNrLW1lbS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRyYWNraW5nIE1lbW9yeSBBbGxvY2F0aW9uczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy91aS0xLjUuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5VSSBGcmFtZXdvcmsgQ2hhbmdlcyBpbiBBbmRyb2lkIDEuNTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy91aS0xLjYuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5VSSBGcmFtZXdvcmsgQ2hhbmdlcyBpbiBBbmRyb2lkIDEuNjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90aW1lZC11aS11cGRhdGVzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXBkYXRpbmcgdGhlIFVJIGZyb20gYSBUaW1lcjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90dHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Vc2luZyBUZXh0LXRvLVNwZWVjaDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9jb250YWN0cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVzaW5nIHRoZSBDb250YWN0cyBBUEk8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdXNpbmctd2Vidmlld3MuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Vc2luZyBXZWJWaWV3czwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy93aWtpbm90ZXMtbGlua2lmeS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa2lOb3RlczogTGlua2lmeSB5b3VyIFRleHQhPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3dpa2lub3Rlcy1pbnRlbnRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lraU5vdGVzOiBSb3V0aW5nIEludGVudHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvd2luZG93LWJnLXNwZWVkLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2luZG93IEJhY2tncm91bmRzICZhbXA7IFVJIFNwZWVkPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3ppcGFsaWduLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+WmlwYWxpZ246IEFuIEVhc3kgT3B0aW1pemF0aW9uPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICAgPC9saT4KLQotICA8bGk+Ci0gICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+VHV0b3JpYWxzPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5MZXJucHJvZ3JhbW1lPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5UdXRvcmlhbGVzPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5EaWRhY3RpY2llbHM8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkVzZXJjaXRhemlvbmk8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuODgeODpeODvOODiOODquOCouODqzwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgPC9oMj4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy9oZWxsby13b3JsZC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gV29ybGQ8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy92aWV3cy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gVmlld3M8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy9sb2NhbGl6YXRpb24vaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIExvY2FsaXphdGlvbjwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIFRlc3Rpbmc8L3NwYW4+PC9hPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy9ub3RlcGFkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ob3RlcGFkIFR1dG9yaWFsPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5BY3Rpdml0eSBUZXN0aW5nPC9zcGFuPjwvYT4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci0KLQotICA8bGk+Ci0gICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+U2FtcGxlIENvZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkJlaXNwaWVsY29kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q8OzZGlnbyBkZSBlamVtcGxvPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5FeGVtcGxlIGRlIGNvZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkNvZGljZSBkaSBlc2VtcGlvPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jgrXjg7Pjg5fjg6sg44Kz44O844OJPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICA8L2gyPgotICAgIDx1bD4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9nZXQuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkdldHRpbmcgdGhlIFNhbXBsZXM8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KLSAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGlzdCBvZiBTYW1wbGVzPC9zcGFuPgotICAgICAgICAgICAgIDwvYT48L2Rpdj4KLSAgICAgICAgPHVsPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9BcGlEZW1vcy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkFQSSBEZW1vczwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0JhY2t1cFJlc3RvcmUvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CYWNrdXAgYW5kIFJlc3RvcmU8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9CbHVldG9vdGhDaGF0L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Qmx1ZXRvb3RoIENoYXQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9CdXNpbmVzc0NhcmQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CdXNpbmVzcyBDYXJkPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQ29udGFjdE1hbmFnZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Db250YWN0IE1hbmFnZXI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Ib21lL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SG9tZTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0pldEJveS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkpldEJveTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0N1YmVMaXZlV2FsbHBhcGVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGl2ZSBXYWxscGFwZXI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0x1bmFyTGFuZGVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+THVuYXIgTGFuZGVyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvTXVsdGlSZXNvbHV0aW9uL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TXVsdGlwbGUgUmVzb2x1dGlvbnM8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Ob3RlUGFkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Tm90ZSBQYWQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNhbXBsZSBTeW5jIEFkYXB0ZXI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNlYXJjaGFibGUgRGljdGlvbmFyeSB2Mjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NuYWtlL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U25ha2U8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Tb2Z0S2V5Ym9hcmQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Tb2Z0IEtleWJvYXJkPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU3Bpbm5lci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNwaW5uZXI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NwaW5uZXJUZXN0L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U3Bpbm5lclRlc3Q8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1RpY1RhY1RvZUxpYi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRpY1RhY1RvZUxpYjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvVGljVGFjVG9lTWFpbi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRpY1RhY1RvZU1haW48L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1dpa3Rpb25hcnkvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWt0aW9uYXJ5PC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa3Rpb25hcnkgKFNpbXBsaWZpZWQpPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPC91bD4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgPC9saT4KLQotCi0KICAgPGxpPgogICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPk1vcmU8L3NwYW4+CiAgICAgPC9oMj4KQEAgLTI5Nyw4ICsxMTMsNiBAQAogICAgICA8L2xpPgogICAgIDwvdWw+CiAgIDwvbGk+Ci0KLQogPC91bD4KIAogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxQaG90b3NBZGFwdGVyLnBuZyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUGhvdG9zQWRhcHRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxOGQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUGhvdG9zQWRhcHRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxSc3NSZWFkZXIucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxSc3NSZWFkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjg0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFJzc1JlYWRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9zYW1wbGVfbm90ZXBhZHRlc3RfanVuaXQucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9zYW1wbGVfbm90ZXBhZHRlc3RfanVuaXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZGE1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL3NhbXBsZV9ub3RlcGFkdGVzdF9qdW5pdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy90b3BpY3MuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3RvcGljcy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTk2MGZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy90b3BpY3MuamQKQEAgLTAsMCArMSw3MiBAQAorcGFnZS50aXRsZT1UZWNobmljYWwgUmVzb3VyY2UgVG9waWNzCitAamQ6Ym9keQorCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAjcmVzb3VyY2UtdG9waWMtdGFibGUgdGQgeworICAgIGJvcmRlcjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKKyAgICB3aWR0aDogMThlbTsKKyAgfQorCisgICNyZXNvdXJjZS10b3BpYy10YWJsZSB1bCB7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW46IDA7CisgIH0KKworICAjcmVzb3VyY2UtdG9waWMtdGFibGUgbGkgeworICAgIGxpc3Qtc3R5bGU6IG5vbmU7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgIH0KKzwvc3R5bGU+CisKKzxwPgorWW91IGNhbiBicm93c2UgdGhlIGxpc3Qgb2YgdGVjaG5pY2FsIHJlc291cmNlcyBieSB0b3BpYyBieSBjbGlja2luZyBvbiB0aGUKK2xpbmtzIGJlbG93LiBPdmVyIHRpbWUsIGFzIG1vcmUgdG9waWNzIGFyZSBhZGRlZCwgdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZQorbGlzdCBiZWxvdy4KKzwvcD4KKworPG5vc2NyaXB0PgorICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5FcnJvcjo8L3N0cm9uZz4KKyAgICBZb3UgbXVzdCBoYXZlIEphdmFTY3JpcHQgZW5hYmxlZCB0byB2aWV3IHRoaXMgcGFnZS4gUmVzb3VyY2VzIGFyZSBhbHNvCisgICAgYXZhaWxhYmxlIG9mZmxpbmUgaW4gdGhlIFNESy4KKyAgPC9wPgorPC9ub3NjcmlwdD4KKworPHRhYmxlIGlkPSJyZXNvdXJjZS10b3BpYy10YWJsZSI+CisgIDx0cj48L3RyPgorPC90YWJsZT4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorPCEtLSAKKyhmdW5jdGlvbigpIHsKKyAgdmFyIHRvcGljcyA9IFtdOworICBmb3IgKHZhciB0b3BpYyBpbiBBTkRST0lEX1RBR1NbJ3RvcGljJ10pIHsKKyAgICB0b3BpY3MucHVzaCh7bmFtZTp0b3BpYyx0aXRsZTpBTkRST0lEX1RBR1NbJ3RvcGljJ11bdG9waWNdfSk7CisgIH0KKyAgdG9waWNzLnNvcnQoZnVuY3Rpb24oeCx5KXsgcmV0dXJuICh4LnRpdGxlIDwgeS50aXRsZSkgPyAtMSA6IDE7IH0pOworICB2YXIgdG9waWNQYXJlbnQgPSBudWxsOworICBmb3IgKHZhciBpID0gMDsgaSA8IHRvcGljcy5sZW5ndGg7IGkrKykgeworICAgIGlmICh0b3BpY1BhcmVudCA9PSBudWxsIHx8IGkgJSAxMCA9PSAwKSB7CisgICAgICAvLyBjcmVhdGUgYSBuZXcgY29sdW1uCisgICAgICB0b3BpY1BhcmVudCA9ICQoJ3VsJywgJCgnPHRkPjx1bD4nKS5hcHBlbmRUbygnI3Jlc291cmNlLXRvcGljLXRhYmxlIHRyJykpOworICAgIH0KKworICAgIHRvcGljUGFyZW50LmFwcGVuZCgKKyAgICAgICAgJCgnPGxpPicpLmFwcGVuZCgKKyAgICAgICAgICAkKCc8aDM+JykuYXBwZW5kKAorICAgICAgICAgICAgJCgnPGE+JykKKyAgICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCB0b1Jvb3QgKyAicmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9IiArIHRvcGljc1tpXS5uYW1lKQorICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuPicpCisgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdlbicpCisgICAgICAgICAgICAgICAgLmh0bWwodG9waWNzW2ldLnRpdGxlKQorICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICAgKQorICAgICAgICApOworICB9Cit9KSgpOworLy8tLT4KKzwvc2NyaXB0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvbm90ZXBhZC1leDIuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3R1dG9yaWFscy9ub3RlcGFkL25vdGVwYWQtZXgyLmpkCmluZGV4IDI4OWI1ZmUuLjQ5OWI3OTYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvbm90ZXBhZC1leDIuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy90dXRvcmlhbHMvbm90ZXBhZC9ub3RlcGFkLWV4Mi5qZApAQCAtODcsOCArODcsOCBAQAogICAgIG1lbnUgY2FsbGJhY2sgdXNlZCBmb3IgdGhlIG9wdGlvbnMgbWVudS4gSGVyZSwgd2UgYWRkIGp1c3Qgb25lIGxpbmUsIHdoaWNoIHdpbGwgYWRkIGEgbWVudSBpdGVtCiAgICAgdG8gZGVsZXRlIGEgbm90ZS4gQ2FsbCA8Y29kZT5tZW51LmFkZCgpPC9jb2RlPiBsaWtlIHNvOgogICAgICAgPHByZT4KLXB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQ29udGV4dE1lbnUoTWVudSBtZW51LCBWaWV3IHYKLSAgICAgICAgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CitwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KE1lbnUgbWVudSwgVmlldyB2LAorICAgICAgICBDb250ZXh0TWVudS5Db250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKICAgICBtZW51LmFkZCgwLCBERUxFVEVfSUQsIDAsIFIuc3RyaW5nLm1lbnVfZGVsZXRlKTsKIH08L3ByZT4KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQppbmRleCBkZDgzYzNiLi5kMjgzZGVhMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQpAQCAtMTksMTIgKzE5LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRmluYWxpemVyczsKIAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5TaG9ydEJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGZpbmFsIGNsYXNzIEJpdG1hcCBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewogICAgIC8qKgpAQCAtMzUsOSArMzksMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX05PTkUgPSAwOwogICAgIAotICAgIC8vIE5vdGU6ICBtTmF0aXZlQml0bWFwIGlzIHVzZWQgYnkgRmFjZURldGVjdG9yX2puaS5jcHAKLSAgICAvLyBEb24ndCBjaGFuZ2UvcmVuYW1lIHdpdGhvdXQgdXBkYXRpbmcgRmFjZURldGVjdG9yX2puaS5jcHAKLSAgICBwcml2YXRlIGZpbmFsIGludCBtTmF0aXZlQml0bWFwOworICAgIC8qKgorICAgICAqIE5vdGU6ICBtTmF0aXZlQml0bWFwIGlzIHVzZWQgYnkgRmFjZURldGVjdG9yX2puaS5jcHAKKyAgICAgKiBEb24ndCBjaGFuZ2UvcmVuYW1lIHdpdGhvdXQgdXBkYXRpbmcgRmFjZURldGVjdG9yX2puaS5jcHAKKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgbU5hdGl2ZUJpdG1hcDsKIAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNNdXRhYmxlOwogICAgIHByaXZhdGUgYnl0ZVtdIG1OaW5lUGF0Y2hDaHVuazsgICAvLyBtYXkgYmUgbnVsbApAQCAtNTEsNyArNTksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIE1hdHJpeCBzU2NhbGVNYXRyaXg7CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBpbnQgc0RlZmF1bHREZW5zaXR5ID0gLTE7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGFsbG93cyB0aGUgYXBwIGxheWVyIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgICAqIGRlbnNpdHkgd2hlbiBydW5uaW5nIG9sZCBhcHBzLgpAQCAtNzcsOCArODUsNyBAQAogCiAgICAgICAgIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIEpOSSBjb2RlLgogICAgICovCi0gICAgcHJpdmF0ZSBCaXRtYXAoaW50IG5hdGl2ZUJpdG1hcCwgYm9vbGVhbiBpc011dGFibGUsIGJ5dGVbXSBuaW5lUGF0Y2hDaHVuaywKLSAgICAgICAgICAgIGludCBkZW5zaXR5KSB7CisgICAgcHJpdmF0ZSBCaXRtYXAoaW50IG5hdGl2ZUJpdG1hcCwgYm9vbGVhbiBpc011dGFibGUsIGJ5dGVbXSBuaW5lUGF0Y2hDaHVuaywgaW50IGRlbnNpdHkpIHsKICAgICAgICAgaWYgKG5hdGl2ZUJpdG1hcCA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW50ZXJuYWwgZXJyb3I6IG5hdGl2ZSBiaXRtYXAgaXMgMCIpOwogICAgICAgICB9CkBAIC05MCw2ICs5NywxMyBAQAogICAgICAgICBpZiAoZGVuc2l0eSA+PSAwKSB7CiAgICAgICAgICAgICBtRGVuc2l0eSA9IGRlbnNpdHk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgZmluYWxpemVycyBxdWV1ZSBpcyBudWxsLCB3ZSBhcmUgcnVubmluZyBpbiB6eWdvdGUgYW5kIHRoZQorICAgICAgICAvLyBiaXRtYXAgd2lsbCBuZXZlciBiZSByZWNsYWltZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8gcnVuIG91ciBuYXRpdmUKKyAgICAgICAgLy8gZGVzdHJ1Y3RvcgorICAgICAgICBpZiAoRmluYWxpemVycy5nZXRRdWV1ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5ldyBCaXRtYXBGaW5hbGl6ZXIodGhpcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE3Miw2ICsxODYsMTkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBnZW5lcmF0aW9uIElEIG9mIHRoaXMgYml0bWFwLiBUaGUgZ2VuZXJhdGlvbiBJRCBjaGFuZ2VzCisgICAgICogd2hlbmV2ZXIgdGhlIGJpdG1hcCBpcyBtb2RpZmllZC4gVGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBlZmZpY2llbnQgd2F5IHRvCisgICAgICogY2hlY2sgaWYgYSBiaXRtYXAgaGFzIGNoYW5nZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBnZW5lcmF0aW9uIElEIGZvciB0aGlzIGJpdG1hcC4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0R2VuZXJhdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbmF0aXZlR2VuZXJhdGlvbklkKG1OYXRpdmVCaXRtYXApOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBUaGlzIGlzIGNhbGxlZCBieSBtZXRob2RzIHRoYXQgd2FudCB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGJpdG1hcAogICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gcmVjeWNsZWQuCiAgICAgICovCkBAIC00MjgsMjggKzQ1NSwzMCBAQAogICAgICAgICBSZWN0IHNyY1IgPSBuZXcgUmVjdCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQpOwogICAgICAgICBSZWN0RiBkc3RSID0gbmV3IFJlY3RGKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogCisgICAgICAgIGZpbmFsIENvbmZpZyBuZXdDb25maWcgPSBzb3VyY2UuZ2V0Q29uZmlnKCkgPT0gQ29uZmlnLkFSR0JfODg4OCA/CisgICAgICAgICAgICAgICAgQ29uZmlnLkFSR0JfODg4OCA6IENvbmZpZy5SR0JfNTY1OworCiAgICAgICAgIGlmIChtID09IG51bGwgfHwgbS5pc0lkZW50aXR5KCkpIHsKLSAgICAgICAgICAgIGJpdG1hcCA9IGNyZWF0ZUJpdG1hcChuZXd3LCBuZXdoLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuaGFzQWxwaGEoKSA/IENvbmZpZy5BUkdCXzg4ODggOiBDb25maWcuUkdCXzU2NSk7CisgICAgICAgICAgICBiaXRtYXAgPSBjcmVhdGVCaXRtYXAobmV3dywgbmV3aCwgbmV3Q29uZmlnLCBzb3VyY2UuaGFzQWxwaGEoKSk7CiAgICAgICAgICAgICBwYWludCA9IG51bGw7ICAgLy8gbm90IG5lZWRlZAogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogIHRoZSBkc3Qgc2hvdWxkIGhhdmUgYWxwaGEgaWYgdGhlIHNyYyBkb2VzLCBvciBpZiBvdXIgbWF0cml4Ci0gICAgICAgICAgICAgICAgZG9lc24ndCBwcmVzZXJ2ZSByZWN0bmVzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gaGFzQWxwaGEgPSBzb3VyY2UuaGFzQWxwaGEoKSB8fCAhbS5yZWN0U3RheXNSZWN0KCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRyYW5zZm9ybWVkID0gIW0ucmVjdFN0YXlzUmVjdCgpOworCiAgICAgICAgICAgICBSZWN0RiBkZXZpY2VSID0gbmV3IFJlY3RGKCk7CiAgICAgICAgICAgICBtLm1hcFJlY3QoZGV2aWNlUiwgZHN0Uik7CisKICAgICAgICAgICAgIG5ld3cgPSBNYXRoLnJvdW5kKGRldmljZVIud2lkdGgoKSk7CiAgICAgICAgICAgICBuZXdoID0gTWF0aC5yb3VuZChkZXZpY2VSLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGJpdG1hcCA9IGNyZWF0ZUJpdG1hcChuZXd3LCBuZXdoLCBoYXNBbHBoYSA/IENvbmZpZy5BUkdCXzg4ODggOiBDb25maWcuUkdCXzU2NSk7Ci0gICAgICAgICAgICBpZiAoaGFzQWxwaGEpIHsKLSAgICAgICAgICAgICAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYml0bWFwID0gY3JlYXRlQml0bWFwKG5ld3csIG5ld2gsIHRyYW5zZm9ybWVkID8gQ29uZmlnLkFSR0JfODg4OCA6IG5ld0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgfHwgc291cmNlLmhhc0FscGhhKCkpOworCiAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1kZXZpY2VSLmxlZnQsIC1kZXZpY2VSLnRvcCk7CiAgICAgICAgICAgICBjYW52YXMuY29uY2F0KG0pOworCiAgICAgICAgICAgICBwYWludCA9IG5ldyBQYWludCgpOwogICAgICAgICAgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKGZpbHRlcik7Ci0gICAgICAgICAgICBpZiAoIW0ucmVjdFN0YXlzUmVjdCgpKSB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtZWQpIHsKICAgICAgICAgICAgICAgICBwYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ3NCw4ICs1MDMsMzAgQEAKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgd2lkdGggb3IgaGVpZ2h0IGFyZSA8PSAwCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCaXRtYXAgY3JlYXRlQml0bWFwKGludCB3aWR0aCwgaW50IGhlaWdodCwgQ29uZmlnIGNvbmZpZykgeworICAgICAgICByZXR1cm4gY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIGNvbmZpZywgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG11dGFibGUgYml0bWFwIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LiAgSXRzCisgICAgICogaW5pdGlhbCBkZW5zaXR5IGlzIGFzIHBlciB7QGxpbmsgI2dldERlbnNpdHl9LgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoICAgIFRoZSB3aWR0aCBvZiB0aGUgYml0bWFwCisgICAgICogQHBhcmFtIGhlaWdodCAgIFRoZSBoZWlnaHQgb2YgdGhlIGJpdG1hcAorICAgICAqIEBwYXJhbSBjb25maWcgICBUaGUgYml0bWFwIGNvbmZpZyB0byBjcmVhdGUuCisgICAgICogQHBhcmFtIGhhc0FscGhhIElmIHRoZSBiaXRtYXAgaXMgQVJHQl84ODg4IHRoaXMgZmxhZyBjYW4gYmUgdXNlZCB0byBtYXJrIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBiaXRtYXAgYXMgb3BhcXVlLiBEb2luZyBzbyB3aWxsIGNsZWFyIHRoZSBiaXRtYXAgaW4gYmxhY2sKKyAgICAgKiAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0cmFuc3BhcmVudC4gIAorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB3aWR0aCBvciBoZWlnaHQgYXJlIDw9IDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXAgY3JlYXRlQml0bWFwKGludCB3aWR0aCwgaW50IGhlaWdodCwgQ29uZmlnIGNvbmZpZywgYm9vbGVhbiBoYXNBbHBoYSkgewogICAgICAgICBCaXRtYXAgYm0gPSBuYXRpdmVDcmVhdGUobnVsbCwgMCwgd2lkdGgsIHdpZHRoLCBoZWlnaHQsIGNvbmZpZy5uYXRpdmVJbnQsIHRydWUpOwotICAgICAgICBibS5lcmFzZUNvbG9yKDApOyAgICAvLyBzdGFydCB3aXRoIGJsYWNrL3RyYW5zcGFyZW50IHBpeGVscworICAgICAgICBpZiAoY29uZmlnID09IENvbmZpZy5BUkdCXzg4ODggJiYgIWhhc0FscGhhKSB7CisgICAgICAgICAgICBibS5lcmFzZUNvbG9yKDB4ZmYwMDAwMDApOworICAgICAgICAgICAgbmF0aXZlU2V0SGFzQWxwaGEoYm0ubU5hdGl2ZUJpdG1hcCwgaGFzQWxwaGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm0uZXJhc2VDb2xvcigwKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gYm07CiAgICAgfQogCkBAIC0xMDA4LDEyICsxMDU5LDIyIEBACiAgICAgICAgIG5hdGl2ZVByZXBhcmVUb0RyYXcobU5hdGl2ZUJpdG1hcCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaXRtYXBGaW5hbGl6ZXIgZXh0ZW5kcyBGaW5hbGl6ZXJzLlJlY2xhaW1hYmxlUmVmZXJlbmNlPEJpdG1hcD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Qml0bWFwRmluYWxpemVyPiBzRmluYWxpemVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldCgKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCaXRtYXBGaW5hbGl6ZXI+KCkpOworCisgICAgICAgIHByaXZhdGUgaW50IG1OYXRpdmVCaXRtYXA7CisKKyAgICAgICAgQml0bWFwRmluYWxpemVyKEJpdG1hcCBiKSB7CisgICAgICAgICAgICBzdXBlcihiLCBGaW5hbGl6ZXJzLmdldFF1ZXVlKCkpOworICAgICAgICAgICAgbU5hdGl2ZUJpdG1hcCA9IGIubU5hdGl2ZUJpdG1hcDsKKyAgICAgICAgICAgIHNGaW5hbGl6ZXJzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWNsYWltKCkgewogICAgICAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlQml0bWFwKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgICAgICBzRmluYWxpemVycy5yZW1vdmUodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwNTAsNiArMTExMSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ29weVBpeGVsc1RvQnVmZmVyKGludCBuYXRpdmVCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBkc3QpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNGcm9tQnVmZmVyKGludCBuYiwgQnVmZmVyIHNyYyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZW5lcmF0aW9uSWQoaW50IG5hdGl2ZUJpdG1hcCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZUNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApOwogICAgIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCkBAIC0xMDY1LDcgKzExMjcsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVByZXBhcmVUb0RyYXcoaW50IG5hdGl2ZUJpdG1hcCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0SGFzQWxwaGEoaW50IG5CaXRtYXAsIGJvb2xlYW4gaGFzQWxwaGEpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVNhbWVBcyhpbnQgbmIwLCBpbnQgbmIxKTsKLQorICAgIAogICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgaW50IG5pKCkgewogICAgICAgICByZXR1cm4gbU5hdGl2ZUJpdG1hcDsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQppbmRleCA3YjQ5YmM1Li5lYTVlZDZiIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQub3MuTWVtb3J5RmlsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiAKQEAgLTg0LDcgKzgzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBwaXhlbCBkZW5zaXR5IHRvIHVzZSBmb3IgdGhlIGJpdG1hcC4gIFRoaXMgd2lsbCBhbHdheXMgcmVzdWx0CiAgICAgICAgICAqIGluIHRoZSByZXR1cm5lZCBiaXRtYXAgaGF2aW5nIGEgZGVuc2l0eSBzZXQgZm9yIGl0IChzZWUKLSAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSkuICBJbiBhZGRpdGlvbiwKKyAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KX0pLiAgSW4gYWRkaXRpb24sCiAgICAgICAgICAqIGlmIHtAbGluayAjaW5TY2FsZWR9IGlzIHNldCAod2hpY2ggaXQgaXMgYnkgZGVmYXVsdH0gYW5kIHRoaXMKICAgICAgICAgICogZGVuc2l0eSBkb2VzIG5vdCBtYXRjaCB7QGxpbmsgI2luVGFyZ2V0RGVuc2l0eX0sIHRoZW4gdGhlIGJpdG1hcAogICAgICAgICAgKiB3aWxsIGJlIHNjYWxlZCB0byB0aGUgdGFyZ2V0IGRlbnNpdHkgYmVmb3JlIGJlaW5nIHJldHVybmVkLgpAQCAtNTA3LDkgKzUwNiw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaXMgVGhlIGlucHV0IHN0cmVhbSB0aGF0IGhvbGRzIHRoZSByYXcgZGF0YSB0byBiZSBkZWNvZGVkIGludG8gYQogICAgICAqICAgICAgICAgICBiaXRtYXAuCi0gICAgICogQHJldHVybiBUaGUgZGVjb2RlZCBiaXRtYXAsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBkZWNvZGVkLCBvciwgaWYgb3B0cyBpcyBub24tbnVsbCwgaWYgb3B0cyByZXF1ZXN0ZWQgb25seSB0aGUKLSAgICAgKiAgICAgICAgIHNpemUgYmUgcmV0dXJuZWQgKGluIG9wdHMub3V0V2lkdGggYW5kIG9wdHMub3V0SGVpZ2h0KQorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZSBkZWNvZGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZVN0cmVhbShJbnB1dFN0cmVhbSBpcykgewogICAgICAgICByZXR1cm4gZGVjb2RlU3RyZWFtKGlzLCBudWxsLCBudWxsKTsKQEAgLTUzMCwxOCArNTI3LDYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJpdG1hcCwgb3IgbnVsbAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZUZpbGVEZXNjcmlwdG9yKEZpbGVEZXNjcmlwdG9yIGZkLCBSZWN0IG91dFBhZGRpbmcsIE9wdGlvbnMgb3B0cykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKGZkKSkgewotICAgICAgICAgICAgICAgIGludCBtYXBwZWRsZW5ndGggPSBNZW1vcnlGaWxlLmdldFNpemUoZmQpOwotICAgICAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKGZkLCBtYXBwZWRsZW5ndGgsICJyIik7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBmaWxlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGJtID0gZGVjb2RlU3RyZWFtKGlzLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoRGVjb2RlKGJtLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIGludmFsaWQgZmlsZWRlc2NyaXB0b3IsIG5vIG5lZWQgdG8gY2FsbCBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgICAgICBCaXRtYXAgYm0gPSBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcihmZCwgb3V0UGFkZGluZywgb3B0cyk7CiAgICAgICAgIHJldHVybiBmaW5pc2hEZWNvZGUoYm0sIG91dFBhZGRpbmcsIG9wdHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBSZWdpb25EZWNvZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NGViNGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBCaXRtYXBSZWdpb25EZWNvZGVyIGNhbiBiZSB1c2VkIHRvIGRlY29kZSBhIHJlY3RhbmdsZSByZWdpb24gZnJvbSBhbiBpbWFnZS4KKyAqIEJpdG1hcFJlZ2lvbkRlY29kZXIgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGFuIG9yaWdpbmFsIGltYWdlIGlzIGxhcmdlIGFuZAorICogeW91IG9ubHkgbmVlZCBwYXJ0cyBvZiB0aGUgaW1hZ2UuCisgKgorICogPHA+VG8gY3JlYXRlIGEgQml0bWFwUmVnaW9uRGVjb2RlciwgY2FsbCBuZXdJbnN0YW5jZSguLi4pLgorICogR2l2ZW4gYSBCaXRtYXBSZWdpb25EZWNvZGVyLCB1c2VycyBjYW4gY2FsbCBkZWNvZGVSZWdpb24oKSByZXBlYXRlZGx5CisgKiB0byBnZXQgYSBkZWNvZGVkIEJpdG1hcCBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbi4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaXRtYXBSZWdpb25EZWNvZGVyIHsKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQml0bWFwUmVnaW9uRGVjb2RlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlY3ljbGVkOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQml0bWFwUmVnaW9uRGVjb2RlciBmcm9tIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheS4KKyAgICAgKiBDdXJyZW50bHkgb25seSB0aGUgSnBlZyBmb3JtYXQgaXMgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgYnl0ZSBhcnJheSBvZiBjb21wcmVzc2VkIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW50byBkYXRhIGZvciB3aGVyZSB0aGUgZGVjb2RlciBzaG91bGQgYmVnaW4KKyAgICAgKiAgICAgICAgICAgICAgIHBhcnNpbmcuCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBiZWdpbm5pbmcgYXQgb2Zmc2V0LCB0byBwYXJzZQorICAgICAqIEBwYXJhbSBpc1NoYXJlYWJsZSBJZiB0aGlzIGlzIHRydWUsIHRoZW4gdGhlIEJpdG1hcFJlZ2lvbkRlY29kZXIgbWF5IGtlZXAgYQorICAgICAqICAgICAgICAgICAgICAgICAgICBzaGFsbG93IHJlZmVyZW5jZSB0byB0aGUgaW5wdXQuIElmIHRoaXMgaXMgZmFsc2UsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIEJpdG1hcFJlZ2lvbkRlY29kZXIgd2lsbCBleHBsaWNpdGx5IG1ha2UgYSBjb3B5IG9mIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBpbnB1dCBkYXRhLCBhbmQga2VlcCB0aGF0LiBFdmVuIGlmIHNoYXJpbmcgaXMgYWxsb3dlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIG1heSBzdGlsbCBkZWNpZGUgdG8gbWFrZSBhIGRlZXAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29weSBvZiB0aGUgaW5wdXQgZGF0YS4gSWYgYW4gaW1hZ2UgaXMgcHJvZ3Jlc3NpdmVseSBlbmNvZGVkLAorICAgICAqICAgICAgICAgICAgICAgICAgICBhbGxvd2luZyBzaGFyaW5nIG1heSBkZWdyYWRlIHRoZSBkZWNvZGluZyBzcGVlZC4KKyAgICAgKiBAcmV0dXJuIEJpdG1hcFJlZ2lvbkRlY29kZXIsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlIGRlY29kZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgaW1hZ2UgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgb3IgY2FuIG5vdCBiZSBkZWNvZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwUmVnaW9uRGVjb2RlciBuZXdJbnN0YW5jZShieXRlW10gZGF0YSwKKyAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgob2Zmc2V0IHwgbGVuZ3RoKSA8IDAgfHwgZGF0YS5sZW5ndGggPCBvZmZzZXQgKyBsZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmF0aXZlTmV3SW5zdGFuY2UoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIGlzU2hhcmVhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBCaXRtYXBSZWdpb25EZWNvZGVyIGZyb20gdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKiBUaGUgcG9zaXRpb24gd2l0aGluIHRoZSBkZXNjcmlwdG9yIHdpbGwgbm90IGJlIGNoYW5nZWQgd2hlbgorICAgICAqIHRoaXMgcmV0dXJucywgc28gdGhlIGRlc2NyaXB0b3IgY2FuIGJlIHVzZWQgYWdhaW4gYXMgaXMuCisgICAgICogQ3VycmVudGx5IG9ubHkgdGhlIEpwZWcgZm9ybWF0IGlzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZCBUaGUgZmlsZSBkZXNjcmlwdG9yIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gZGVjb2RlCisgICAgICogQHBhcmFtIGlzU2hhcmVhYmxlIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiB0aGUgQml0bWFwUmVnaW9uRGVjb2RlciBtYXkga2VlcCBhCisgICAgICogICAgICAgICAgICAgICAgICAgIHNoYWxsb3cgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dC4gSWYgdGhpcyBpcyBmYWxzZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgQml0bWFwUmVnaW9uRGVjb2RlciB3aWxsIGV4cGxpY2l0bHkgbWFrZSBhIGNvcHkgb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgIGlucHV0IGRhdGEsIGFuZCBrZWVwIHRoYXQuIEV2ZW4gaWYgc2hhcmluZyBpcyBhbGxvd2VkLAorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gbWF5IHN0aWxsIGRlY2lkZSB0byBtYWtlIGEgZGVlcAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLiBJZiBhbiBpbWFnZSBpcyBwcm9ncmVzc2l2ZWx5IGVuY29kZWQsCisgICAgICogICAgICAgICAgICAgICAgICAgIGFsbG93aW5nIHNoYXJpbmcgbWF5IGRlZ3JhZGUgdGhlIGRlY29kaW5nIHNwZWVkLgorICAgICAqIEByZXR1cm4gQml0bWFwUmVnaW9uRGVjb2Rlciwgb3IgbnVsbCBpZiB0aGUgaW1hZ2UgZGF0YSBjb3VsZCBub3QgYmUgZGVjb2RlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBpbWFnZSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBvciBjYW4gbm90IGJlIGRlY29kZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaXRtYXBSZWdpb25EZWNvZGVyIG5ld0luc3RhbmNlKAorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuYXRpdmVOZXdJbnN0YW5jZShmZCwgaXNTaGFyZWFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEJpdG1hcFJlZ2lvbkRlY29kZXIgZnJvbSBhbiBpbnB1dCBzdHJlYW0uCisgICAgICogVGhlIHN0cmVhbSdzIHBvc2l0aW9uIHdpbGwgYmUgd2hlcmUgZXZlciBpdCB3YXMgYWZ0ZXIgdGhlIGVuY29kZWQgZGF0YQorICAgICAqIHdhcyByZWFkLgorICAgICAqIEN1cnJlbnRseSBvbmx5IHRoZSBKcGVnIGZvcm1hdCBpcyBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXMgVGhlIGlucHV0IHN0cmVhbSB0aGF0IGhvbGRzIHRoZSByYXcgZGF0YSB0byBiZSBkZWNvZGVkIGludG8gYQorICAgICAqICAgICAgICAgICBCaXRtYXBSZWdpb25EZWNvZGVyLgorICAgICAqIEBwYXJhbSBpc1NoYXJlYWJsZSBJZiB0aGlzIGlzIHRydWUsIHRoZW4gdGhlIEJpdG1hcFJlZ2lvbkRlY29kZXIgbWF5IGtlZXAgYQorICAgICAqICAgICAgICAgICAgICAgICAgICBzaGFsbG93IHJlZmVyZW5jZSB0byB0aGUgaW5wdXQuIElmIHRoaXMgaXMgZmFsc2UsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIEJpdG1hcFJlZ2lvbkRlY29kZXIgd2lsbCBleHBsaWNpdGx5IG1ha2UgYSBjb3B5IG9mIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBpbnB1dCBkYXRhLCBhbmQga2VlcCB0aGF0LiBFdmVuIGlmIHNoYXJpbmcgaXMgYWxsb3dlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIG1heSBzdGlsbCBkZWNpZGUgdG8gbWFrZSBhIGRlZXAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29weSBvZiB0aGUgaW5wdXQgZGF0YS4gSWYgYW4gaW1hZ2UgaXMgcHJvZ3Jlc3NpdmVseSBlbmNvZGVkLAorICAgICAqICAgICAgICAgICAgICAgICAgICBhbGxvd2luZyBzaGFyaW5nIG1heSBkZWdyYWRlIHRoZSBkZWNvZGluZyBzcGVlZC4KKyAgICAgKiBAcmV0dXJuIEJpdG1hcFJlZ2lvbkRlY29kZXIsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlIGRlY29kZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgaW1hZ2UgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgb3IgY2FuIG5vdCBiZSBkZWNvZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwUmVnaW9uRGVjb2RlciBuZXdJbnN0YW5jZShJbnB1dFN0cmVhbSBpcywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHdlIG5lZWQgbWFyay9yZXNldCB0byB3b3JrIHByb3Blcmx5IGluIEpOSQorCisgICAgICAgIGlmICghaXMubWFya1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICBpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzLCAxNiAqIDEwMjQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzIGluc3RhbmNlb2YgQXNzZXRNYW5hZ2VyLkFzc2V0SW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVOZXdJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgKChBc3NldE1hbmFnZXIuQXNzZXRJbnB1dFN0cmVhbSkgaXMpLmdldEFzc2V0SW50KCksCisgICAgICAgICAgICAgICAgICAgIGlzU2hhcmVhYmxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHBhc3Mgc29tZSB0ZW1wIHN0b3JhZ2UgZG93biB0byB0aGUgbmF0aXZlIGNvZGUuIDEwMjQgaXMgbWFkZSB1cCwKKyAgICAgICAgICAgIC8vIGJ1dCBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIGF2b2lkIHRvbyBtYW55IHNtYWxsIGNhbGxzIGJhY2sKKyAgICAgICAgICAgIC8vIGludG8gaXMucmVhZCguLi4pLgorICAgICAgICAgICAgYnl0ZSBbXSB0ZW1wU3RvcmFnZSA9IG5ldyBieXRlWzE2ICogMTAyNF07CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlTmV3SW5zdGFuY2UoaXMsIHRlbXBTdG9yYWdlLCBpc1NoYXJlYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBCaXRtYXBSZWdpb25EZWNvZGVyIGZyb20gYSBmaWxlIHBhdGguCisgICAgICogQ3VycmVudGx5IG9ubHkgdGhlIEpwZWcgZm9ybWF0IGlzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoTmFtZSBjb21wbGV0ZSBwYXRoIG5hbWUgZm9yIHRoZSBmaWxlIHRvIGJlIGRlY29kZWQuCisgICAgICogQHBhcmFtIGlzU2hhcmVhYmxlIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiB0aGUgQml0bWFwUmVnaW9uRGVjb2RlciBtYXkga2VlcCBhCisgICAgICogICAgICAgICAgICAgICAgICAgIHNoYWxsb3cgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dC4gSWYgdGhpcyBpcyBmYWxzZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgQml0bWFwUmVnaW9uRGVjb2RlciB3aWxsIGV4cGxpY2l0bHkgbWFrZSBhIGNvcHkgb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgIGlucHV0IGRhdGEsIGFuZCBrZWVwIHRoYXQuIEV2ZW4gaWYgc2hhcmluZyBpcyBhbGxvd2VkLAorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gbWF5IHN0aWxsIGRlY2lkZSB0byBtYWtlIGEgZGVlcAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLiBJZiBhbiBpbWFnZSBpcyBwcm9ncmVzc2l2ZWx5IGVuY29kZWQsCisgICAgICogICAgICAgICAgICAgICAgICAgIGFsbG93aW5nIHNoYXJpbmcgbWF5IGRlZ3JhZGUgdGhlIGRlY29kaW5nIHNwZWVkLgorICAgICAqIEByZXR1cm4gQml0bWFwUmVnaW9uRGVjb2Rlciwgb3IgbnVsbCBpZiB0aGUgaW1hZ2UgZGF0YSBjb3VsZCBub3QgYmUgZGVjb2RlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBpbWFnZSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBvciBjYW4gbm90IGJlIGRlY29kZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaXRtYXBSZWdpb25EZWNvZGVyIG5ld0luc3RhbmNlKFN0cmluZyBwYXRoTmFtZSwKKyAgICAgICAgICAgIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJpdG1hcFJlZ2lvbkRlY29kZXIgZGVjb2RlciA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE5hbWUpOworICAgICAgICAgICAgZGVjb2RlciA9IG5ld0luc3RhbmNlKHN0cmVhbSwgaXNTaGFyZWFibGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIGhlcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlY29kZXI7CisgICAgfQorCisgICAgLyogIFByaXZhdGUgY29uc3RydWN0b3IgdGhhdCBtdXN0IHJlY2VpdmUgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgbmF0aXZlCisgICAgICAgIHJlZ2lvbiBkZWNvZGVyIGludCAocG9pbnRlcikuCisKKyAgICAgICAgVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gSk5JIGNvZGUuCisgICAgKi8KKyAgICBwcml2YXRlIEJpdG1hcFJlZ2lvbkRlY29kZXIoaW50IGRlY29kZXIpIHsKKyAgICAgICAgbU5hdGl2ZUJpdG1hcFJlZ2lvbkRlY29kZXIgPSBkZWNvZGVyOworICAgICAgICBtUmVjeWNsZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIGEgcmVjdGFuZ2xlIHJlZ2lvbiBpbiB0aGUgaW1hZ2Ugc3BlY2lmaWVkIGJ5IHJlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjdCBUaGUgcmVjdGFuZ2xlIHRoYXQgc3BlY2lmaWVkIHRoZSByZWdpb24gdG8gYmUgZGVjb2RlLgorICAgICAqIEBwYXJhbSBvcHRpb25zIG51bGwtb2s7IE9wdGlvbnMgdGhhdCBjb250cm9sIGRvd25zYW1wbGluZy4KKyAgICAgKiAgICAgICAgICAgICBpblB1cmdlYWJsZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZQorICAgICAqICAgICAgICAgZGVjb2RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQml0bWFwIGRlY29kZVJlZ2lvbihSZWN0IHJlY3QsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgIGNoZWNrUmVjeWNsZWQoImRlY29kZVJlZ2lvbiBjYWxsZWQgb24gcmVjeWNsZWQgcmVnaW9uIGRlY29kZXIiKTsKKyAgICAgICAgaWYgKHJlY3QubGVmdCA8IDAgfHwgcmVjdC50b3AgPCAwIHx8IHJlY3QucmlnaHQgPiBnZXRXaWR0aCgpCisgICAgICAgICAgICAgICAgfHwgcmVjdC5ib3R0b20gPiBnZXRIZWlnaHQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlY3RhbmdsZSBpcyBub3QgaW5zaWRlIHRoZSBpbWFnZSIpOworICAgICAgICByZXR1cm4gbmF0aXZlRGVjb2RlUmVnaW9uKG1OYXRpdmVCaXRtYXBSZWdpb25EZWNvZGVyLCByZWN0LmxlZnQsIHJlY3QudG9wLAorICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3AsIG9wdGlvbnMpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBpbWFnZSdzIHdpZHRoICovCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgY2hlY2tSZWN5Y2xlZCgiZ2V0V2lkdGggY2FsbGVkIG9uIHJlY3ljbGVkIHJlZ2lvbiBkZWNvZGVyIik7CisgICAgICAgIHJldHVybiBuYXRpdmVHZXRXaWR0aChtTmF0aXZlQml0bWFwUmVnaW9uRGVjb2Rlcik7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIG9yaWdpbmFsIGltYWdlJ3MgaGVpZ2h0ICovCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIGNoZWNrUmVjeWNsZWQoImdldEhlaWdodCBjYWxsZWQgb24gcmVjeWNsZWQgcmVnaW9uIGRlY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUdldEhlaWdodChtTmF0aXZlQml0bWFwUmVnaW9uRGVjb2Rlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnJlZXMgdXAgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWdpb24gZGVjb2RlciwgYW5kIG1hcmsgdGhlCisgICAgICogcmVnaW9uIGRlY29kZXIgYXMgImRlYWQiLCBtZWFuaW5nIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGRlY29kZVJlZ2lvbigpLAorICAgICAqIGdldFdpZHRoKCkgb3IgZ2V0SGVpZ2h0KCkgaXMgY2FsbGVkLgorICAgICAqCisgICAgICogPHA+VGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHJldmVyc2VkLCBzbyBpdCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgeW91IGFyZQorICAgICAqIHN1cmUgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgdXNlcyBmb3IgdGhlIHJlZ2lvbiBkZWNvZGVyLiBUaGlzIGlzIGFuIGFkdmFuY2VkIGNhbGwsCisgICAgICogYW5kIG5vcm1hbGx5IG5lZWQgbm90IGJlIGNhbGxlZCwgc2luY2UgdGhlIG5vcm1hbCBHQyBwcm9jZXNzIHdpbGwgZnJlZSB1cCB0aGlzCisgICAgICogbWVtb3J5IHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgcmVmZXJlbmNlcyB0byB0aGlzIHJlZ2lvbiBkZWNvZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7CisgICAgICAgIGlmICghbVJlY3ljbGVkKSB7CisgICAgICAgICAgICBuYXRpdmVDbGVhbihtTmF0aXZlQml0bWFwUmVnaW9uRGVjb2Rlcik7CisgICAgICAgICAgICBtUmVjeWNsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVnaW9uIGRlY29kZXIgaGFzIGJlZW4gcmVjeWNsZWQuCisgICAgICogSWYgc28sIHRoZW4gaXQgaXMgYW4gZXJyb3IgdG8gdHJ5IHVzZSBpdHMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWdpb24gZGVjb2RlciBoYXMgYmVlbiByZWN5Y2xlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUmVjeWNsZWQoKSB7CisgICAgICAgIHJldHVybiBtUmVjeWNsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IG1ldGhvZHMgdGhhdCB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgcmVnaW9uIGRlY29kZXIKKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHJlY3ljbGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1JlY3ljbGVkKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKG1SZWN5Y2xlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlY3ljbGUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZURlY29kZVJlZ2lvbihpbnQgbGJtLAorICAgICAgICAgICAgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZXRXaWR0aChpbnQgbGJtKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUdldEhlaWdodChpbnQgbGJtKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVDbGVhbihpbnQgbGJtKTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBCaXRtYXBSZWdpb25EZWNvZGVyIG5hdGl2ZU5ld0luc3RhbmNlKAorICAgICAgICAgICAgYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaXNTaGFyZWFibGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBCaXRtYXBSZWdpb25EZWNvZGVyIG5hdGl2ZU5ld0luc3RhbmNlKAorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsIGJvb2xlYW4gaXNTaGFyZWFibGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBCaXRtYXBSZWdpb25EZWNvZGVyIG5hdGl2ZU5ld0luc3RhbmNlKAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMsIGJ5dGVbXSBzdG9yYWdlLCBib29sZWFuIGlzU2hhcmVhYmxlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwUmVnaW9uRGVjb2RlciBuYXRpdmVOZXdJbnN0YW5jZSgKKyAgICAgICAgICAgIGludCBhc3NldCwgYm9vbGVhbiBpc1NoYXJlYWJsZSk7Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEKaW5kZXggNjEyYjBhYi4uNGJhNjc5YiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBTaGFkZXIuamF2YQpAQCAtMTYsMTAgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAorLyoqCisgKiBTaGFkZXIgdXNlZCB0byBkcmF3IGEgYml0bWFwIGFzIGEgdGV4dHVyZS4gVGhlIGJpdG1hcCBjYW4gYmUgcmVwZWF0ZWQgb3IKKyAqIG1pcnJvcmVkIGJ5IHNldHRpbmcgdGhlIHRpbGluZyBtb2RlLgorICovCiBwdWJsaWMgY2xhc3MgQml0bWFwU2hhZGVyIGV4dGVuZHMgU2hhZGVyIHsKLQotICAgIC8vIHdlIGhvbGQgb24ganVzdCBmb3IgdGhlIEdDLCBzaW5jZSBvdXIgbmF0aXZlIGNvdW50ZXJwYXJ0IGlzIHVzaW5nIGl0Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCIsICJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CiAKICAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgdG8gY3JlYXRlIGEgbmV3IHNoYWRlciB0aGF0IHdpbGwgZHJhdyB3aXRoIGEgYml0bWFwLgpAQCAtMzAsMTIgKzM2LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIEJpdG1hcFNoYWRlcihCaXRtYXAgYml0bWFwLCBUaWxlTW9kZSB0aWxlWCwgVGlsZU1vZGUgdGlsZVkpIHsKICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlKGJpdG1hcC5uaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBmaW5hbCBpbnQgYiA9IGJpdG1hcC5uaSgpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUoYiwgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZShuYXRpdmVfaW5zdGFuY2UsIGIsIHRpbGVYLm5hdGl2ZUludCwgdGlsZVkubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwgaW50IHNoYWRlclRpbGVNb2RlWCwKKyAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZShpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9iaXRtYXAsCisgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLCBpbnQgc2hhZGVyVGlsZU1vZGVZKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCmluZGV4IGE1ODdkMGQxLi45NTJmMmI1IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC0xNiwxMSArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAogaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOwogCkBAIC00MywyMiArNDIsMzkgQEAKICAgICAgICAgZm9yIGJvdGggdG8gYmUgbnVsbC4KICAgICAqLwogICAgIHByaXZhdGUgQml0bWFwICBtQml0bWFwOyAgICAvLyBpZiBub3QgbnVsbCwgbUdMIG11c3QgYmUgbnVsbAotICAgIHByaXZhdGUgR0wgICAgICBtR0w7ICAgICAgICAvLyBpZiBub3QgbnVsbCwgbUJpdG1hcCBtdXN0IGJlIG51bGwKICAgICAKICAgICAvLyBvcHRpb25hbCBmaWVsZCBzZXQgYnkgdGhlIGNhbGxlcgotICAgIHByaXZhdGUgRHJhd0ZpbHRlciAgbURyYXdGaWx0ZXI7CisgICAgcHJpdmF0ZSBEcmF3RmlsdGVyIG1EcmF3RmlsdGVyOwogCi0gICAgLy8gUGFja2FnZS1zY29wZWQgZm9yIHF1aWNrIGFjY2Vzcy4KLSAgICAvKnBhY2thZ2UqLyBpbnQgbURlbnNpdHkgPSBCaXRtYXAuREVOU0lUWV9OT05FOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CiAKLSAgICAvLyBVc2VkIHRvIGRldGVybWluZSB3aGVuIGNvbXBhdGliaWxpdHkgc2NhbGluZyBpcyBpbiBlZmZlY3QuCi0gICAgcHJpdmF0ZSBpbnQgbVNjcmVlbkRlbnNpdHkgPSBCaXRtYXAuREVOU0lUWV9OT05FOworICAgIC8qKgorICAgICAqIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gY29tcGF0aWJpbGl0eSBzY2FsaW5nIGlzIGluIGVmZmVjdC4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbVNjcmVlbkRlbnNpdHkgPSBCaXRtYXAuREVOU0lUWV9OT05FOwogICAgIAogICAgIC8vIFVzZWQgYnkgbmF0aXZlIGNvZGUKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCiAgICAgcHJpdmF0ZSBpbnQgICAgICAgICBtU3VyZmFjZUZvcm1hdDsKIAogICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGRyYXdUZXh0UnVuIGluZGljYXRpbmcgbGVmdC10by1yaWdodCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX0xUUiA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZHJhd1RleHRSdW4gaW5kaWNhdGluZyByaWdodC10by1sZWZ0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fUlRMID0gMTsKKyAgICAKKyAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgcmFzdGVyIGNhbnZhcy4gVXNlIHNldEJpdG1hcCgpIHRvIHNwZWNpZnkgYSBiaXRtYXAgdG8KICAgICAgKiBkcmF3IGludG8uICBUaGUgaW5pdGlhbCB0YXJnZXQgZGVuc2l0eSBpcyB7QGxpbmsgQml0bWFwI0RFTlNJVFlfTk9ORX07CiAgICAgICogdGhpcyB3aWxsIHR5cGljYWxseSBiZSByZXBsYWNlZCB3aGVuIGEgdGFyZ2V0IGJpdG1hcCBpcyBzZXQgZm9yIHRoZQpAQCAtODksNDcgKzEwNSwzNyBAQAogICAgICAgICBtRGVuc2l0eSA9IGJpdG1hcC5tRGVuc2l0eTsKICAgICB9CiAgICAgCi0gICAgLypwYWNrYWdlKi8gQ2FudmFzKGludCBuYXRpdmVDYW52YXMpIHsKKyAgICBDYW52YXMoaW50IG5hdGl2ZUNhbnZhcykgewogICAgICAgICBpZiAobmF0aXZlQ2FudmFzID09IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICBtTmF0aXZlQ2FudmFzID0gbmF0aXZlQ2FudmFzOwogICAgICAgICBtRGVuc2l0eSA9IEJpdG1hcC5nZXREZWZhdWx0RGVuc2l0eSgpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIGNhbnZhcyB3aXRoIHRoZSBzcGVjaWZpZWQgZ2wgY29udGV4dC4gQWxsIGRyYXdpbmcgdGhyb3VnaAotICAgICAqIHRoaXMgY2FudmFzIHdpbGwgYmUgcmVkaXJlY3RlZCB0byBPcGVuR0wuIE5vdGU6IHNvbWUgZmVhdHVyZXMgbWF5IG5vdAotICAgICAqIGJlIHN1cHBvcnRlZCBpbiB0aGlzIG1vZGUgKGUuZy4gc29tZSBHTCBpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBzdXBwb3J0Ci0gICAgICogYW50aWFsaWFzaW5nIG9yIGNlcnRhaW4gZWZmZWN0cyBsaWtlIENvbG9yTWF0cml4IG9yIGNlcnRhaW4gWGZlcm1vZGVzKS4KLSAgICAgKiBIb3dldmVyLCBubyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaW4gdGhvc2UgY2FzZXMuCisgICAgICogUmV0dXJucyBudWxsLgogICAgICAqIAotICAgICAqIDxwPlRoZSBpbml0aWFsIHRhcmdldCBkZW5zaXR5IG9mIHRoZSBjYW52YXMgaXMgdGhlIHNhbWUgYXMgdGhlIGluaXRpYWwKLSAgICAgKiBkZW5zaXR5IG9mIGJpdG1hcHMgYXMgcGVyIHtAbGluayBCaXRtYXAjZ2V0RGVuc2l0eSgpIEJpdG1hcC5nZXREZW5zaXR5KCl9LgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBub3QgYmUgaW52b2tlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgQ2FudmFzKEdMIGdsKSB7Ci0gICAgICAgIG1OYXRpdmVDYW52YXMgPSBpbml0R0woKTsKLSAgICAgICAgbUdMID0gZ2w7Ci0gICAgICAgIG1EZW5zaXR5ID0gQml0bWFwLmdldERlZmF1bHREZW5zaXR5KCk7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwcm90ZWN0ZWQgR0wgZ2V0R0woKSB7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgR0wgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhbnZhcywgb3IgbnVsbCBpZiBpdCBpcyBub3QKLSAgICAgKiBiYWNrZWQgYnkgR0wuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBDYW52YXMgdXNlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb24uCisgICAgICogCisgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlZmluZSB3aGF0IHR5cGUgb2YgaGFyZHdhcmUgYWNjZWxlcmF0aW9uCisgICAgICogbWF5IG9yIG1heSBub3QgYmUgdXNlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgZHJhd2luZyBvcGVyYXRpb25zIGFyZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgR0wgZ2V0R0woKSB7Ci0gICAgICAgIHJldHVybiBtR0w7CisgICAgcHVibGljIGJvb2xlYW4gaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENhbGwgdGhpcyB0byBmcmVlIHVwIE9wZW5HTCByZXNvdXJjZXMgdGhhdCBtYXkgYmUgY2FjaGVkIG9yIGFsbG9jYXRlZAotICAgICAqIG9uIGJlaGFsZiBvZiB0aGUgQ2FudmFzLiBBbnkgc3Vic2VxdWVudCBkcmF3aW5nIHdpdGggYSBHTC1iYWNrZWQgQ2FudmFzCi0gICAgICogd2lsbCBoYXZlIHRvIHJlY3JlYXRlIHRob3NlIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZnJlZUdsQ2FjaGVzKCkgewotICAgICAgICBmcmVlQ2FjaGVzKCk7Ci0gICAgfQotICAgICAgICAKKwogICAgIC8qKgogICAgICAqIFNwZWNpZnkgYSBiaXRtYXAgZm9yIHRoZSBjYW52YXMgdG8gZHJhdyBpbnRvLiAgQXMgYSBzaWRlLWVmZmVjdCwgYWxzbwogICAgICAqIHVwZGF0ZXMgdGhlIGNhbnZhcydzIHRhcmdldCBkZW5zaXR5IHRvIG1hdGNoIHRoYXQgb2YgdGhlIGJpdG1hcC4KQEAgLTE0Myw3ICsxNDksNyBAQAogICAgICAgICBpZiAoIWJpdG1hcC5pc011dGFibGUoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtR0wgIT0gbnVsbCkgeworICAgICAgICBpZiAoaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBzZXQgYSBiaXRtYXAgZGV2aWNlIG9uIGEgR0wgY2FudmFzIik7CiAgICAgICAgIH0KICAgICAgICAgdGhyb3dJZlJlY3ljbGVkKGJpdG1hcCk7CkBAIC0xNTcsMTMgKzE2MywxMiBAQAogICAgICAqIFNldCB0aGUgdmlld3BvcnQgZGltZW5zaW9ucyBpZiB0aGlzIGNhbnZhcyBpcyBHTCBiYXNlZC4gSWYgaXQgaXMgbm90LAogICAgICAqIHRoaXMgbWV0aG9kIGlzIGlnbm9yZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICoKLSAgICAgKiAgQHBhcmFtIHdpZHRoICAgIFRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQKLSAgICAgKiAgQHBhcmFtIGhlaWdodCAgIFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0CisgICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQKKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0CisgICAgICogCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKG1HTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBuYXRpdmVTZXRWaWV3cG9ydChtTmF0aXZlQ2FudmFzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzc3LDggKzM4Miw4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc3ggVGhlIGFtb3VudCB0byBzY2FsZSBpbiBYCiAgICAgICogQHBhcmFtIHN5IFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gWQotICAgICAqIEBwYXJhbSBweCBUaGUgeC1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHJvdGF0aW9uKQotICAgICAqIEBwYXJhbSBweSBUaGUgeS1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHJvdGF0aW9uKQorICAgICAqIEBwYXJhbSBweCBUaGUgeC1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHNjYWxlKQorICAgICAqIEBwYXJhbSBweSBUaGUgeS1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHNjYWxlKQogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgcHgsIGZsb2F0IHB5KSB7CiAgICAgICAgIHRyYW5zbGF0ZShweCwgcHkpOwpAQCAtNjIxLDcgKzYyNiwxMSBAQAogICAgICAgICBFZGdlVHlwZShpbnQgbmF0aXZlSW50KSB7CiAgICAgICAgICAgICB0aGlzLm5hdGl2ZUludCA9IG5hdGl2ZUludDsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgbmF0aXZlSW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuYXRpdmVJbnQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NTgsNiArOTY3LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCBiaXRtYXAgYXMgYW4gTi1wYXRjaCAobW9zdCBvZnRlbiwgYSA5LXBhdGNoZXMuKQorICAgICAqCisgICAgICogTm90ZTogT25seSBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgY2FudmFzIGF0IHRoZSBtb21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYml0bWFwIFRoZSBiaXRtYXAgdG8gZHJhdyBhcyBhbiBOLXBhdGNoCisgICAgICogQHBhcmFtIGNodW5rcyBUaGUgcGF0Y2hlcyBpbmZvcm1hdGlvbiAobWF0Y2hlcyB0aGUgbmF0aXZlIHN0cnVjdCBSZXNfcG5nXzlwYXRjaCkKKyAgICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBkcmF3IHRoZSBiaXRtYXAgd2l0aC4gbWF5IGJlIG51bGwKKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdQYXRjaChCaXRtYXAgYml0bWFwLCBieXRlW10gY2h1bmtzLCBSZWN0RiBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgfSAgICAKKyAgICAKKyAgICAvKioKICAgICAgKiBEcmF3IHRoZSBzcGVjaWZpZWQgYml0bWFwLCB3aXRoIGl0cyB0b3AvbGVmdCBjb3JuZXIgYXQgKHgseSksIHVzaW5nCiAgICAgICogdGhlIHNwZWNpZmllZCBwYWludCwgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgbWF0cml4LgogICAgICAqIApAQCAtMTI0Niw4ICsxMjcwLDggQEAKICAgICAgICAgICAgICh0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpKSA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyNTksNyArMTI4MywxMCBAQAogICAgICAqIEBwYXJhbSB5ICAgICBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBvcmlnaW4gb2YgdGhlIHRleHQgYmVpbmcgZHJhd24KICAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IHVzZWQgZm9yIHRoZSB0ZXh0IChlLmcuIGNvbG9yLCBzaXplLCBzdHlsZSkKICAgICAgKi8KLSAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZHJhd1RleHQoU3RyaW5nIHRleHQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KTsKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBEcmF3IHRoZSB0ZXh0LCB3aXRoIG9yaWdpbiBhdCAoeCx5KSwgdXNpbmcgdGhlIHNwZWNpZmllZCBwYWludC4KQEAgLTEyNzcsOCArMTMwNCw4IEBACiAgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCAoZW5kIC0gc3RhcnQpIHwgKHRleHQubGVuZ3RoKCkgLSBlbmQpKSA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI5OSwxNiArMTMyNiwxMDggQEAKICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKICAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CiAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHQodGhpcywgc3RhcnQsIGVuZCwgeCwgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oZW5kIC0gc3RhcnQpOwogICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgICAgICAgICBkcmF3VGV4dChidWYsIDAsIGVuZCAtIHN0YXJ0LCB4LCB5LCBwYWludCk7CisgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgYnVmLCAwLCBlbmQgLSBzdGFydCwgeCwgeSwgCisgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgcnVuIG9mIGFsbCBMVFIgb3IgYWxsIFJUTCB0ZXh0LCB3aXRoIHNoYXBpbmcuIFRoaXMgZG9lcyBub3QgcnVuCisgICAgICogYmlkaSBvbiB0aGUgcHJvdmlkZWQgdGV4dCwgYnV0IHJlbmRlcnMgaXQgYXMgYSB1bmlmb3JtIHJpZ2h0LXRvLWxlZnQgb3IKKyAgICAgKiBsZWZ0LXRvLXJpZ2h0IHJ1biwgYXMgaW5kaWNhdGVkIGJ5IGRpci4gQWxpZ25tZW50IG9mIHRoZSB0ZXh0IGlzIGFzCisgICAgICogZGV0ZXJtaW5lZCBieSB0aGUgUGFpbnQncyBUZXh0QWxpZ24gdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gY291bnQgdGhlIGNvdW50IG9mIGNoYXJzIHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBjb250ZXh0SW5kZXggdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0IGZvciBzaGFwaW5nLiAgTXVzdCBiZQorICAgICAqICAgICAgICAgbm8gZ3JlYXRlciB0aGFuIGluZGV4LgorICAgICAqIEBwYXJhbSBjb250ZXh0Q291bnQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjb250ZXh0IGZvciBzaGFwaW5nLgorICAgICAqICAgICAgICAgQ29udGV4SW5kZXggKyBjb250ZXh0Q291bnQgbXVzdCBiZSBubyBsZXNzIHRoYW4gaW5kZXgKKyAgICAgKiAgICAgICAgICsgY291bnQuCisgICAgICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBydW4gZGlyZWN0aW9uLCBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fTFRSfSBvcgorICAgICAqICAgICAgICAge0BsaW5rICNESVJFQ1RJT05fUlRMfS4KKyAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRleHQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhaW50IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCB0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlyICE9IERJUkVDVElPTl9MVFIgJiYgZGlyICE9IERJUkVDVElPTl9SVEwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZGlyOiAiICsgZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dFJ1bihtTmF0aXZlQ2FudmFzLCB0ZXh0LCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIHgsIHksIGRpciwgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBydW4gb2YgYWxsIExUUiBvciBhbGwgUlRMIHRleHQsIHdpdGggc2hhcGluZy4gVGhpcyBkb2VzIG5vdCBydW4KKyAgICAgKiBiaWRpIG9uIHRoZSBwcm92aWRlZCB0ZXh0LCBidXQgcmVuZGVycyBpdCBhcyBhIHVuaWZvcm0gcmlnaHQtdG8tbGVmdCBvcgorICAgICAqIGxlZnQtdG8tcmlnaHQgcnVuLCBhcyBpbmRpY2F0ZWQgYnkgZGlyLiBBbGlnbm1lbnQgb2YgdGhlIHRleHQgaXMgYXMKKyAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBQYWludCdzIFRleHRBbGlnbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyLiBEYXRhIGJlZm9yZSB0aGlzIHBvc2l0aW9uCisgICAgICogICAgICAgICAgICBjYW4gYmUgdXNlZCBmb3Igc2hhcGluZyBjb250ZXh0LgorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgdGV4dCB0byByZW5kZXIuIERhdGEgYXQgb3IgYWZ0ZXIgdGhpcworICAgICAqICAgICAgICAgICAgcG9zaXRpb24gY2FuIGJlIHVzZWQgZm9yIHNoYXBpbmcgY29udGV4dC4KKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBkaXIgdGhlIHJ1biBkaXJlY3Rpb24sIGVpdGhlciAwIGZvciBMVFIgb3IgMSBmb3IgUlRMLgorICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGRpciwKKyAgICAgICAgICAgIFBhaW50IHBhaW50KSB7CisKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0ZXh0IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFpbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYWludCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IGVuZCAtIHN0YXJ0IHwgdGV4dC5sZW5ndGgoKSAtIGVuZCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZsYWdzID0gZGlyID09IDAgPyAwIDogMTsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dFJ1bihtTmF0aXZlQ2FudmFzLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZWxzZSBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0UnVuKHRoaXMsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dFJ1bihtTmF0aXZlQ2FudmFzLCBidWYsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgICAgICAgIDAsIGNvbnRleHRMZW4sIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEzNjgsNyArMTQ4Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2RyYXdUZXh0T25QYXRoKG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgubmkoKSwgaE9mZnNldCwgdk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM4OCw3ICsxNTA3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBQYWludCBwYWludCkgewogICAgICAgICBpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dE9uUGF0aChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBwYXRoLm5pKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE9mZnNldCwgdk9mZnNldCwgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LCB2T2Zmc2V0LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0MzEsMjggKzE1NTEsNzQgQEAKICAgICAgICAgZHJhd1BpY3R1cmUocGljdHVyZSk7CiAgICAgICAgIHJlc3RvcmUoKTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiA8cD5BY3F1aXJlcyB0aGUgQ2FudmFzIGNvbnRleHQuIEFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLCB0aGUgQ2FudmFzCisgICAgICogY29udGV4dCAgY2FuIGJlIG1vZGlmaWVkIGJ5IHRoZSBjYWxsZXIuIEZvciBpbnN0YW5jZSwgaWYgeW91IGFjcXVpcmUKKyAgICAgKiB0aGUgY29udGV4dCBvZiBhbiBPcGVuR0wgQ2FudmFzIHlvdSBjYW4gcmVzZXQgdGhlIEdMIHZpZXdwb3J0LCBzY2lzc29yLAorICAgICAqIGV0Yy48L3A+CisgICAgICogCisgICAgICogPHA+QSBjYWxsIHRvIHtAbGluayAjYWNxdWlyZUNvbnRleHQoKX0gc2hvdWxkIGF3YXlzIGJlIGZvbGxvd2VkIGJ5CisgICAgICogYSBjYWxsIHRvIHtAbGluayAjcmVsZWFzZUNvbnRleHQoKX0sIHByZWZlcnJhYmx5IHVzaW5nIGEgdHJ5IGJsb2NrOjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cHJlPgorICAgICAqIHRyeSB7CisgICAgICogICAgIGlmIChjYW52YXMuYWNxdWlyZUNvbnRleHQoKSkgeworICAgICAqICAgICAgICAgLy8gVXNlIHRoZSBjYW52YXMgYW5kL29yIGl0cyBjb250ZXh0CisgICAgICogICAgIH0KKyAgICAgKiB9IGZpbmFsbHkgeworICAgICAqICAgICBjYW52YXMucmVsZWFzZUNvbnRleHQoKTsKKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogPHA+QWNxdWlyaW5nIHRoZSBjb250ZXh0IGNhbiBiZSBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIGFuZCBzaG91bGQgbm90CisgICAgICogYmUgZG9uZSB1bmxlc3MgYWJzb2x1dGVseSBuZWNlc3NhcnkuPC9wPgorICAgICAqIAorICAgICAqIDxwPkFwcGxpY2F0aW9ucyBzaG91bGQgbmV2ZXIgaW52b2tlIHRoaXMgbWV0aG9kIGRpcmVjdGx5LjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRleHQgY291bGQgYmUgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIChpZiB0aGUgY29udGV4dCBpcyBhbHJlYWR5IGFjcXVpcmVkIGZvciBpbnN0YW5jZS4pCisgICAgICogCisgICAgICogQHNlZSAjcmVsZWFzZUNvbnRleHQoKSAKKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFjcXVpcmVDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmVsZWFzZSB0aGUgY29udGV4dCBhY3F1aXJlZCB3aXRoIHtAbGluayAjYWNxdWlyZUNvbnRleHQoKX0uPC9wPgorICAgICAqIAorICAgICAqIEBzZWUgI2FjcXVpcmVDb250ZXh0KCkgCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQ29udGV4dCgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAvLyBJZiB0aGUgY29uc3RydWN0b3IgdGhyZXcgYW4gZXhjZXB0aW9uIGJlZm9yZSBzZXR0aW5nIG1OYXRpdmVDYW52YXMsIHRoZSBuYXRpdmUgZmluYWxpemVyCi0gICAgICAgIC8vIG11c3Qgbm90IGJlIGludm9rZWQuCi0gICAgICAgIGlmIChtTmF0aXZlQ2FudmFzICE9IDApIHsKLSAgICAgICAgICAgIGZpbmFsaXplcihtTmF0aXZlQ2FudmFzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgY29uc3RydWN0b3IgdGhyZXcgYW4gZXhjZXB0aW9uIGJlZm9yZSBzZXR0aW5nIG1OYXRpdmVDYW52YXMsCisgICAgICAgICAgICAvLyB0aGUgbmF0aXZlIGZpbmFsaXplciBtdXN0IG5vdCBiZSBpbnZva2VkLgorICAgICAgICAgICAgaWYgKG1OYXRpdmVDYW52YXMgIT0gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsaXplcihtTmF0aXZlQ2FudmFzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZyZWUgdXAgYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUgZnJvbSBwcml2YXRlIGNhY2hlcyAoZS5nLiBmb250cywKLSAgICAgKiBpbWFnZXMpCisgICAgICogRnJlZSB1cCBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZSBmcm9tIHByaXZhdGUgY2FjaGVzIChlLmcuIGZvbnRzLCBpbWFnZXMpCiAgICAgICoKLSAgICAgKiBAaGlkZSAtIGZvciBub3cKKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZnJlZUNhY2hlcygpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBpbml0UmFzdGVyKGludCBuYXRpdmVCaXRtYXBPclplcm8pOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgaW5pdEdMKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3NldEJpdG1hcChpbnQgbmF0aXZlQ2FudmFzLCBpbnQgYml0bWFwKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRWaWV3cG9ydChpbnQgbkNhbnZhcywgaW50IHcsIGludCBoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9zYXZlTGF5ZXIoaW50IG5hdGl2ZUNhbnZhcywgUmVjdEYgYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFpbnQsIGludCBsYXllckZsYWdzKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9zYXZlTGF5ZXIoaW50IG5hdGl2ZUNhbnZhcywgZmxvYXQgbCwKQEAgLTE1NTUsMTAgKzE3MjEsMTkgQEAKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHQoaW50IG5hdGl2ZUNhbnZhcywgY2hhcltdIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LCBpbnQgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0KGludCBuYXRpdmVDYW52YXMsIFN0cmluZyB0ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dFJ1bihpbnQgbmF0aXZlQ2FudmFzLCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHRSdW4oaW50IG5hdGl2ZUNhbnZhcywgY2hhcltdIHRleHQsCisgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKKwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3UG9zVGV4dChpbnQgbmF0aXZlQ2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGZsb2F0W10gcG9zLApAQCAtMTU3MCwxMSArMTc0NSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBpbnQgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBpbnQgYmlkaUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFpbnQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dE9uUGF0aChpbnQgbmF0aXZlQ2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgcGFpbnQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3UGljdHVyZShpbnQgbmF0aXZlQ2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmF0aXZlUGljdHVyZSk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVDYW52YXMpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuamF2YQppbmRleCA3NmYyYzdmLi5lNWNmODMwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuamF2YQpAQCAtMjMsMTIgKzIzLDIwIEBACiAKIAogcHVibGljIGNsYXNzIENvbG9yRmlsdGVyIHsKKyAgICBpbnQgbmF0aXZlX2luc3RhbmNlOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5hdGl2ZUNvbG9yRmlsdGVyOwogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWxpemVyKG5hdGl2ZV9pbnN0YW5jZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmluYWxpemVyKG5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlQ29sb3JGaWx0ZXIpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVfaW5zdGFuY2UpOwotCi0gICAgaW50IG5hdGl2ZV9pbnN0YW5jZTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZV9pbnN0YW5jZSwgaW50IG5hdGl2ZUNvbG9yRmlsdGVyKTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvck1hdHJpeENvbG9yRmlsdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JNYXRyaXhDb2xvckZpbHRlci5qYXZhCmluZGV4IDVkNzNjZmYuLjI0NWM2MTUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvck1hdHJpeENvbG9yRmlsdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXIuamF2YQpAQCAtMjUsNyArMjUsOSBAQAogICAgICAqICAgICAgICAgICAgICAgaXMgY29uc3RydWN0ZWQgd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoZSBmaWx0ZXIuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yTWF0cml4Q29sb3JGaWx0ZXIoQ29sb3JNYXRyaXggbWF0cml4KSB7Ci0gICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyKG1hdHJpeC5nZXRBcnJheSgpKTsKKyAgICAgICAgZmluYWwgZmxvYXRbXSBjb2xvck1hdHJpeCA9IG1hdHJpeC5nZXRBcnJheSgpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDb2xvck1hdHJpeEZpbHRlcihjb2xvck1hdHJpeCk7CisgICAgICAgIG5hdGl2ZUNvbG9yRmlsdGVyID0gbkNvbG9yTWF0cml4RmlsdGVyKGNvbG9yTWF0cml4KTsKICAgICB9CiAKICAgICAvKioKQEAgLTQwLDcgKzQyLDkgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDb2xvck1hdHJpeEZpbHRlcihhcnJheSk7CisgICAgICAgIG5hdGl2ZUNvbG9yRmlsdGVyID0gbkNvbG9yTWF0cml4RmlsdGVyKGFycmF5KTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyKGZsb2F0W10gYXJyYXkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbkNvbG9yTWF0cml4RmlsdGVyKGZsb2F0W10gYXJyYXkpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbXBvc2VTaGFkZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db21wb3NlU2hhZGVyLmphdmEKaW5kZXggYTA2ZDMwYi4uOGQ1YzkxMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbXBvc2VTaGFkZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29tcG9zZVNoYWRlci5qYXZhCkBAIC0yMCw2ICsyMCwxNCBAQAogICAgIGFuIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLlhmZXJtb2RlfSBzdWJjbGFzcy4KICovCiBwdWJsaWMgY2xhc3MgQ29tcG9zZVNoYWRlciBleHRlbmRzIFNoYWRlciB7CisgICAgLyoqCisgICAgICogSG9sZCBvbnRvIHRoZSBzaGFkZXJzIHRvIGF2b2lkIEdDLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBwcml2YXRlIGZpbmFsIFNoYWRlciBtU2hhZGVyQTsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBTaGFkZXIgbVNoYWRlckI7CisKICAgICAvKiogQ3JlYXRlIGEgbmV3IGNvbXBvc2Ugc2hhZGVyLCBnaXZlbiBzaGFkZXJzIEEsIEIsIGFuZCBhIGNvbWJpbmluZyBtb2RlLgogICAgICAgICBXaGVuIHRoZSBtb2RlIGlzIGFwcGxpZWQsIGl0IHdpbGwgYmUgZ2l2ZW4gdGhlIHJlc3VsdCBmcm9tIHNoYWRlciBBIGFzIGl0cwogICAgICAgICAiZHN0IiwgYW5kIHRoZSByZXN1bHQgb2YgZnJvbSBzaGFkZXIgQiBhcyBpdHMgInNyYyIuCkBAIC0yOSw4ICszNywxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaXMgbnVsbCwgdGhlbiBTUkNfT1ZFUiBpcyBhc3N1bWVkLgogICAgICovCiAgICAgcHVibGljIENvbXBvc2VTaGFkZXIoU2hhZGVyIHNoYWRlckEsIFNoYWRlciBzaGFkZXJCLCBYZmVybW9kZSBtb2RlKSB7CisgICAgICAgIG1TaGFkZXJBID0gc2hhZGVyQTsKKyAgICAgICAgbVNoYWRlckIgPSBzaGFkZXJCOwogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUxKHNoYWRlckEubmF0aXZlX2luc3RhbmNlLCBzaGFkZXJCLm5hdGl2ZV9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZSAhPSBudWxsKSA/IG1vZGUubmF0aXZlX2luc3RhbmNlIDogMCk7CisgICAgICAgICAgICAgICAgKG1vZGUgIT0gbnVsbCkgPyBtb2RlLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICBpZiAobW9kZSBpbnN0YW5jZW9mIFBvcnRlckR1ZmZYZmVybW9kZSkgeworICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlIHBkTW9kZSA9ICgoUG9ydGVyRHVmZlhmZXJtb2RlKSBtb2RlKS5tb2RlOworICAgICAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUyKG5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQS5uYXRpdmVfc2hhZGVyLAorICAgICAgICAgICAgICAgICAgICBzaGFkZXJCLm5hdGl2ZV9zaGFkZXIsIHBkTW9kZSAhPSBudWxsID8gcGRNb2RlLm5hdGl2ZUludCA6IDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUxKG5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQS5uYXRpdmVfc2hhZGVyLAorICAgICAgICAgICAgICAgICAgICBzaGFkZXJCLm5hdGl2ZV9zaGFkZXIsIG1vZGUgIT0gbnVsbCA/IG1vZGUubmF0aXZlX2luc3RhbmNlIDogMCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiogQ3JlYXRlIGEgbmV3IGNvbXBvc2Ugc2hhZGVyLCBnaXZlbiBzaGFkZXJzIEEsIEIsIGFuZCBhIGNvbWJpbmluZyBQb3J0ZXJEdWZmIG1vZGUuCkBAIC00MSwxMSArNTksMjAgQEAKICAgICAgICAgQHBhcmFtIG1vZGUgICAgIFRoZSBQb3J0ZXJEdWZmIG1vZGUgdGhhdCBjb21iaW5lcyB0aGUgY29sb3JzIGZyb20gdGhlIHR3byBzaGFkZXJzLgogICAgICovCiAgICAgcHVibGljIENvbXBvc2VTaGFkZXIoU2hhZGVyIHNoYWRlckEsIFNoYWRlciBzaGFkZXJCLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICBtU2hhZGVyQSA9IHNoYWRlckE7CisgICAgICAgIG1TaGFkZXJCID0gc2hhZGVyQjsKICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMihzaGFkZXJBLm5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQi5uYXRpdmVfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICAgICAgICAgIG1vZGUubmF0aXZlSW50KTsKKyAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUyKG5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQS5uYXRpdmVfc2hhZGVyLAorICAgICAgICAgICAgICAgIHNoYWRlckIubmF0aXZlX3NoYWRlciwgbW9kZS5uYXRpdmVJbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShpbnQgbmF0aXZlX3NoYWRlckEsIGludCBuYXRpdmVfc2hhZGVyQiwgaW50IG5hdGl2ZV9tb2RlKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoaW50IG5hdGl2ZV9zaGFkZXJBLCBpbnQgbmF0aXZlX3NoYWRlckIsIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGludCBuYXRpdmVfc2hhZGVyQSwgaW50IG5hdGl2ZV9zaGFkZXJCLAorICAgICAgICAgICAgaW50IG5hdGl2ZV9tb2RlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoaW50IG5hdGl2ZV9zaGFkZXJBLCBpbnQgbmF0aXZlX3NoYWRlckIsCisgICAgICAgICAgICBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXIsIGludCBuYXRpdmVfc2tpYVNoYWRlckEsCisgICAgICAgICAgICBpbnQgbmF0aXZlX3NraWFTaGFkZXJCLCBpbnQgbmF0aXZlX21vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTIoaW50IG5hdGl2ZV9zaGFkZXIsIGludCBuYXRpdmVfc2tpYVNoYWRlckEsCisgICAgICAgICAgICBpbnQgbmF0aXZlX3NraWFTaGFkZXJCLCBpbnQgcG9ydGVyRHVmZk1vZGUpOwogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGlnaHRpbmdDb2xvckZpbHRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpZ2h0aW5nQ29sb3JGaWx0ZXIuamF2YQppbmRleCA1NTYyMzg5Li43MTVjZTg2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGlnaHRpbmdDb2xvckZpbHRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaWdodGluZ0NvbG9yRmlsdGVyLmphdmEKQEAgLTMwLDcgKzMwLDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTGlnaHRpbmdDb2xvckZpbHRlcihpbnQgbXVsLCBpbnQgYWRkKSB7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlcihtdWwsIGFkZCk7CisgICAgICAgIG5hdGl2ZUNvbG9yRmlsdGVyID0gbkNyZWF0ZUxpZ2h0aW5nRmlsdGVyKG11bCwgYWRkKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlcihpbnQgbXVsLCBpbnQgYWRkKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5DcmVhdGVMaWdodGluZ0ZpbHRlcihpbnQgbXVsLCBpbnQgYWRkKTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaW5lYXJHcmFkaWVudC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpbmVhckdyYWRpZW50LmphdmEKaW5kZXggZTNkYjEwNS4uODJlZDE5OSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpbmVhckdyYWRpZW50LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpbmVhckdyYWRpZW50LmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAogcHVibGljIGNsYXNzIExpbmVhckdyYWRpZW50IGV4dGVuZHMgU2hhZGVyIHsKLQogCS8qKglDcmVhdGUgYSBzaGFkZXIgdGhhdCBkcmF3cyBhIGxpbmVhciBncmFkaWVudCBhbG9uZyBhIGxpbmUuCiAgICAgICAgIEBwYXJhbSB4MCAgICAgICAgICAgVGhlIHgtY29vcmRpbmF0ZSBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBncmFkaWVudCBsaW5lCiAgICAgICAgIEBwYXJhbSB5MCAgICAgICAgICAgVGhlIHktY29vcmRpbmF0ZSBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBncmFkaWVudCBsaW5lCkBAIC0zOCw2ICszNyw4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb2xvciBhbmQgcG9zaXRpb24gYXJyYXlzIG11c3QgYmUgb2YgZXF1YWwgbGVuZ3RoIik7CiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMSh4MCwgeTAsIHgxLCB5MSwgY29sb3JzLCBwb3NpdGlvbnMsIHRpbGUubmF0aXZlSW50KTsKKyAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUxKG5hdGl2ZV9pbnN0YW5jZSwgeDAsIHkwLCB4MSwgeTEsIGNvbG9ycywgcG9zaXRpb25zLAorICAgICAgICAgICAgICAgIHRpbGUubmF0aXZlSW50KTsKICAgICB9CiAKIAkvKioJQ3JlYXRlIGEgc2hhZGVyIHRoYXQgZHJhd3MgYSBsaW5lYXIgZ3JhZGllbnQgYWxvbmcgYSBsaW5lLgpAQCAtNTIsMTIgKzUzLDE2IEBACiAJcHVibGljIExpbmVhckdyYWRpZW50KGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBUaWxlTW9kZSB0aWxlKSB7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTIoeDAsIHkwLCB4MSwgeTEsIGNvbG9yMCwgY29sb3IxLCB0aWxlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMihuYXRpdmVfaW5zdGFuY2UsIHgwLCB5MCwgeDEsIHkxLCBjb2xvcjAsIGNvbG9yMSwKKyAgICAgICAgICAgICAgICB0aWxlLm5hdGl2ZUludCk7CiAgICAgfQogCi0KLQlwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10sIGludCB0aWxlTW9kZSk7Ci0JcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUyKGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpOworCXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgaW50IGNvbG9yc1tdLCBmbG9hdCBwb3NpdGlvbnNbXSwgaW50IHRpbGVNb2RlKTsKKwlwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUxKGludCBuYXRpdmVfc2hhZGVyLCBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10sIGludCB0aWxlTW9kZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyLCBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YQppbmRleCBmNTQ5OTAwLi42NmVkMTA0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhCkBAIC0zNyw3ICszNywxMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1QRVJTUF8xID0gNzsgICAvLyE8IHVzZSB3aXRoIGdldFZhbHVlcy9zZXRWYWx1ZXMKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNUEVSU1BfMiA9IDg7ICAgLy8hPCB1c2Ugd2l0aCBnZXRWYWx1ZXMvc2V0VmFsdWVzCiAKLSAgICAvKiBwYWNrYWdlICovIGludCBuYXRpdmVfaW5zdGFuY2U7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5hdGl2ZV9pbnN0YW5jZTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpZGVudGl0eSBtYXRyaXgKQEAgLTQxOSw2ICs0MjIsMTAgQEAKICAgICAgKiB0aGUgdHJhbnNmb3JtZWQgdmVjdG9ycyBpbnRvIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHNwZWNpZmllZCBieSBkc3QuIFRoZQogICAgICAqIHR3byBhcnJheXMgcmVwcmVzZW50IHRoZWlyICJ2ZWN0b3JzIiBhcyBwYWlycyBvZiBmbG9hdHMgW3gsIHldLgogICAgICAqCisgICAgICogTm90ZTogdGhpcyBtZXRob2QgZG9lcyBub3QgYXBwbHkgdGhlIHRyYW5zbGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF0cml4LiBVc2UKKyAgICAgKiB7QGxpbmsgTWF0cml4I21hcFBvaW50cyhmbG9hdFtdLCBpbnQsIGZsb2F0W10sIGludCwgaW50KX0gaWYgeW91IHdhbnQgdGhlIHRyYW5zbGF0aW9uCisgICAgICogdG8gYmUgYXBwbGllZC4KKyAgICAgKgogICAgICAqIEBwYXJhbSBkc3QgICBUaGUgYXJyYXkgb2YgZHN0IHZlY3RvcnMgKHgseSBwYWlycykKICAgICAgKiBAcGFyYW0gZHN0SW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBbeCx5XSBwYWlyIG9mIGRzdCBmbG9hdHMKICAgICAgKiBAcGFyYW0gc3JjICAgVGhlIGFycmF5IG9mIHNyYyB2ZWN0b3JzICh4LHkgcGFpcnMpCkBAIC00NTIsNiArNDU5LDkgQEAKICAgICAgKiB0aGUgdHJhbnNmb3JtZWQgdmVjdG9ycyBpbnRvIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHNwZWNpZmllZCBieSBkc3QuIFRoZQogICAgICAqIHR3byBhcnJheXMgcmVwcmVzZW50IHRoZWlyICJ2ZWN0b3JzIiBhcyBwYWlycyBvZiBmbG9hdHMgW3gsIHldLgogICAgICAqCisgICAgICogTm90ZTogdGhpcyBtZXRob2QgZG9lcyBub3QgYXBwbHkgdGhlIHRyYW5zbGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF0cml4LiBVc2UKKyAgICAgKiB7QGxpbmsgTWF0cml4I21hcFBvaW50cyhmbG9hdFtdLCBmbG9hdFtdKX0gaWYgeW91IHdhbnQgdGhlIHRyYW5zbGF0aW9uIHRvIGJlIGFwcGxpZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gZHN0ICAgVGhlIGFycmF5IG9mIGRzdCB2ZWN0b3JzICh4LHkgcGFpcnMpCiAgICAgICogQHBhcmFtIHNyYyAgIFRoZSBhcnJheSBvZiBzcmMgdmVjdG9ycyAoeCx5IHBhaXJzKQogICAgICAqLwpAQCAtNDc1LDYgKzQ4NSwxMCBAQAogICAgIC8qKgogICAgICAqIEFwcGx5IHRoaXMgbWF0cml4IHRvIHRoZSBhcnJheSBvZiAyRCB2ZWN0b3JzLCBhbmQgd3JpdGUgdGhlIHRyYW5zZm9ybWVkCiAgICAgICogdmVjdG9ycyBiYWNrIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogTm90ZTogdGhpcyBtZXRob2QgZG9lcyBub3QgYXBwbHkgdGhlIHRyYW5zbGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF0cml4LiBVc2UKKyAgICAgKiB7QGxpbmsgTWF0cml4I21hcFBvaW50cyhmbG9hdFtdKX0gaWYgeW91IHdhbnQgdGhlIHRyYW5zbGF0aW9uIHRvIGJlIGFwcGxpZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gdmVjcyBUaGUgYXJyYXkgW3gwLCB5MCwgeDEsIHkxLCAuLi5dIG9mIHZlY3RvcnMgdG8gdHJhbnNmb3JtLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG1hcFZlY3RvcnMoZmxvYXRbXSB2ZWNzKSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEKaW5kZXggODhkZmQ2Ny4uZGY2ZmViYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9OaW5lUGF0Y2guamF2YQpAQCAtMzUsNiArMzUsMTIgQEAKICAqIDwvcD4KICAqLwogcHVibGljIGNsYXNzIE5pbmVQYXRjaCB7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtQ2h1bms7CisgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVNyY05hbWU7ICAvLyBVc2VmdWwgZm9yIGRlYnVnZ2luZworICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAKICAgICAvKiogCiAgICAgICogQ3JlYXRlIGEgZHJhd2FibGUgcHJvamVjdGlvbiBmcm9tIGEgYml0bWFwIHRvIG5pbmUgcGF0Y2hlcy4KICAgICAgKgpAQCAtNzQsMTAgKzgwLDE0IEBACiAgICAgICogQHBhcmFtIGxvY2F0aW9uICBXaGVyZSB0byBkcmF3IHRoZSBiaXRtYXAuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0RiBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgIG1QYWludCAhPSBudWxsID8gbVBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGNoKG1CaXRtYXAsIG1DaHVuaywgbG9jYXRpb24sIG51bGwpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKiAKQEAgLTg3LDEwICs5NywxNSBAQAogICAgICAqIEBwYXJhbSBsb2NhdGlvbiAgV2hlcmUgdG8gZHJhdyB0aGUgYml0bWFwLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcywgUmVjdCBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRtYXAubmkoKSwgbUNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhaW50ICE9IG51bGwgPyBtUGFpbnQubU5hdGl2ZVBhaW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBudWxsKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKiAKQEAgLTEwMSw5ICsxMTYsMTQgQEAKICAgICAgKiBAcGFyYW0gcGFpbnQgICAgIFRoZSBQYWludCB0byBkcmF3IHRocm91Z2guCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0IGxvY2F0aW9uLCBQYWludCBwYWludCkgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCi0gICAgICAgICAgICAgICAgY2FudmFzLm1EZW5zaXR5LCBtQml0bWFwLm1EZW5zaXR5KTsKKyAgICAgICAgaWYgKCFjYW52YXMuaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkpIHsKKyAgICAgICAgICAgIG5hdGl2ZURyYXcoY2FudmFzLm1OYXRpdmVDYW52YXMsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBwYWludCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTEzMywxMSArMTUzLDYgQEAKICAgICAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGlzTmluZVBhdGNoQ2h1bmsoYnl0ZVtdIGNodW5rKTsKIAotICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbUNodW5rOwotICAgIHByaXZhdGUgUGFpbnQgICAgICAgIG1QYWludDsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICBtU3JjTmFtZTsgIC8vIFVzZWZ1bCBmb3IgZGVidWdnaW5nCi0KICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCB2YWxpZGF0ZU5pbmVQYXRjaENodW5rKGludCBiaXRtYXAsIGJ5dGVbXSBjaHVuayk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRHJhdyhpbnQgY2FudmFzX2luc3RhbmNlLCBSZWN0RiBsb2MsIGludCBiaXRtYXBfaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYywgaW50IHBhaW50X2luc3RhbmNlX29yX251bGwsCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCmluZGV4IDNlM2Y4N2IuLjYyZmJmYjQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiAvKioKICAqIFRoZSBQYWludCBjbGFzcyBob2xkcyB0aGUgc3R5bGUgYW5kIGNvbG9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkcmF3CkBAIC0yNyw3ICsyNywxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFpbnQgewogCi0gICAgLypwYWNrYWdlKi8gaW50ICAgICBtTmF0aXZlUGFpbnQ7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG1OYXRpdmVQYWludDsKKwogICAgIHByaXZhdGUgQ29sb3JGaWx0ZXIgbUNvbG9yRmlsdGVyOwogICAgIHByaXZhdGUgTWFza0ZpbHRlciAgbU1hc2tGaWx0ZXI7CiAgICAgcHJpdmF0ZSBQYXRoRWZmZWN0ICBtUGF0aEVmZmVjdDsKQEAgLTM5LDYgKzQzLDMyIEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICBtSGFzQ29tcGF0U2NhbGluZzsKICAgICBwcml2YXRlIGZsb2F0ICAgICAgIG1Db21wYXRTY2FsaW5nOwogICAgIHByaXZhdGUgZmxvYXQgICAgICAgbUludkNvbXBhdFNjYWxpbmc7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1NoYWRvdzsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBzaGFkb3dEeDsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBzaGFkb3dEeTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBzaGFkb3dSYWRpdXM7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNoYWRvd0NvbG9yOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgIGludCAgICAgICAgIG1CaWRpRmxhZ3MgPSBCSURJX0RFRkFVTFRfTFRSOwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0eWxlW10gc1N0eWxlQXJyYXkgPSB7CiAgICAgICAgIFN0eWxlLkZJTEwsIFN0eWxlLlNUUk9LRSwgU3R5bGUuRklMTF9BTkRfU1RST0tFCkBAIC03Niw4ICsxMDYsMTE2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEFJTlRfRkxBR1MgPSBERVZfS0VSTl9URVhUX0ZMQUc7CiAKICAgICAvKioKLSAgICAgKiBUaGUgU3R5bGUgc3BlY2lmaWVzIGlmIHRoZSBwcmltaXRpdmUgYmVpbmcgZHJhd24gaXMgZmlsbGVkLAotICAgICAqIHN0cm9rZWQsIG9yIGJvdGggKGluIHRoZSBzYW1lIGNvbG9yKS4gVGhlIGRlZmF1bHQgaXMgRklMTC4KKyAgICAgKiBCaWRpIGZsYWcgdG8gc2V0IExUUiBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9MVFIgPSAweDA7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gc2V0IFJUTCBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9SVEwgPSAweDE7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gZGV0ZWN0IHBhcmFncmFwaCBkaXJlY3Rpb24gdmlhIGhldXJpc3RpY3MsIGRlZmF1bHRpbmcgdG8KKyAgICAgKiBMVFIuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0RFRkFVTFRfTFRSID0gMHgyOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIGRldGVjdCBwYXJhZ3JhcGggZGlyZWN0aW9uIHZpYSBoZXVyaXN0aWNzLCBkZWZhdWx0aW5nIHRvCisgICAgICogUlRMLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9ERUZBVUxUX1JUTCA9IDB4MzsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBvdmVycmlkZSBkaXJlY3Rpb24gdG8gYWxsIExUUiAoaWdub3JlIGJpZGkpLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9GT1JDRV9MVFIgPSAweDQ7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gb3ZlcnJpZGUgZGlyZWN0aW9uIHRvIGFsbCBSVEwgKGlnbm9yZSBiaWRpKS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfRk9SQ0VfUlRMID0gMHg1OworCisgICAgLyoqCisgICAgICogTWF4aW11bSBCaWRpIGZsYWcgdmFsdWUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklESV9NQVhfRkxBR19WQUxVRSA9IEJJRElfRk9SQ0VfUlRMOworCisgICAgLyoqCisgICAgICogTWFzayBmb3IgYmlkaSBmbGFncy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSURJX0ZMQUdfTUFTSyA9IDB4NzsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGdldFRleHRSdW5BZHZhbmNlcyBpbmRpY2F0aW5nIGxlZnQtdG8tcmlnaHQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MVFIgPSAwOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZ2V0VGV4dFJ1bkFkdmFuY2VzIGluZGljYXRpbmcgcmlnaHQtdG8tbGVmdCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX1JUTCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGFmdGVyCisgICAgICogb2Zmc2V0IG9yIHRoZSBsaW1pdCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGxlc3MuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQUZURVIgPSAwOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBhdCBvciBhZnRlcgorICAgICAqIHRoZSBvZmZzZXQgb3IgdGhlIGxpbWl0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgbGVzcy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BVF9PUl9BRlRFUiA9IDE7CisKKyAgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBiZWZvcmUKKyAgICAgKiBvZmZzZXQgb3IgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgZ3JlYXRlci4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9CRUZPUkUgPSAyOworCisgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGF0IG9yIGJlZm9yZQorICAgICAqIG9mZnNldCBvciB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBncmVhdGVyLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FUX09SX0JFRk9SRSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gcmV0dXJuIG9mZnNldCBpZiB0aGUgY3Vyc29yIGF0IG9mZnNldAorICAgICAqIGlzIHZhbGlkLCBvciAtMSBpZiBpdCBpc24ndC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BVCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIGN1cnNvciBvcHRpb24gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9PUFRfTUFYX1ZBTFVFID0gQ1VSU09SX0FUOworCisgICAgLyoqCisgICAgICogVGhlIFN0eWxlIHNwZWNpZmllcyBpZiB0aGUgcHJpbWl0aXZlIGJlaW5nIGRyYXduIGlzIGZpbGxlZCwgc3Ryb2tlZCwgb3IKKyAgICAgKiBib3RoIChpbiB0aGUgc2FtZSBjb2xvcikuIFRoZSBkZWZhdWx0IGlzIEZJTEwuCiAgICAgICovCiAgICAgcHVibGljIGVudW0gU3R5bGUgewogICAgICAgICAvKioKQEAgLTkzLDcgKzIzMSw5IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZW9tZXRyeSBhbmQgdGV4dCBkcmF3biB3aXRoIHRoaXMgc3R5bGUgd2lsbCBiZSBib3RoIGZpbGxlZCBhbmQKICAgICAgICAgICogc3Ryb2tlZCBhdCB0aGUgc2FtZSB0aW1lLCByZXNwZWN0aW5nIHRoZSBzdHJva2UtcmVsYXRlZCBmaWVsZHMgb24KLSAgICAgICAgICogdGhlIHBhaW50LgorICAgICAgICAgKiB0aGUgcGFpbnQuIFRoaXMgbW9kZSBjYW4gZ2l2ZSB1bmV4cGVjdGVkIHJlc3VsdHMgaWYgdGhlIGdlb21ldHJ5CisgICAgICAgICAqIGlzIG9yaWVudGVkIGNvdW50ZXItY2xvY2t3aXNlLiBUaGlzIHJlc3RyaWN0aW9uIGRvZXMgbm90IGFwcGx5IHRvCisgICAgICAgICAqIGVpdGhlciBGSUxMIG9yIFNUUk9LRS4KICAgICAgICAgICovCiAgICAgICAgIEZJTExfQU5EX1NUUk9LRSAoMik7CiAgICAgICAgIApAQCAtMjA4LDYgKzM0OCw3IEBACiAgICAgICAgIG1IYXNDb21wYXRTY2FsaW5nID0gcGFpbnQubUhhc0NvbXBhdFNjYWxpbmc7CiAgICAgICAgIG1Db21wYXRTY2FsaW5nID0gcGFpbnQubUNvbXBhdFNjYWxpbmc7CiAgICAgICAgIG1JbnZDb21wYXRTY2FsaW5nID0gcGFpbnQubUludkNvbXBhdFNjYWxpbmc7CisgICAgICAgIG1CaWRpRmxhZ3MgPSBwYWludC5tQmlkaUZsYWdzOwogICAgIH0KIAogICAgIC8qKiBSZXN0b3JlcyB0aGUgcGFpbnQgdG8gaXRzIGRlZmF1bHQgc2V0dGluZ3MuICovCkBAIC0yMTYsNiArMzU3LDcgQEAKICAgICAgICAgc2V0RmxhZ3MoREVGQVVMVF9QQUlOVF9GTEFHUyk7CiAgICAgICAgIG1IYXNDb21wYXRTY2FsaW5nID0gZmFsc2U7CiAgICAgICAgIG1Db21wYXRTY2FsaW5nID0gbUludkNvbXBhdFNjYWxpbmcgPSAxOworICAgICAgICBtQmlkaUZsYWdzID0gQklESV9ERUZBVUxUX0xUUjsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yMzgsNiArMzgwLDcgQEAKICAgICAgICAgICAgIG1IYXNDb21wYXRTY2FsaW5nID0gc3JjLm1IYXNDb21wYXRTY2FsaW5nOwogICAgICAgICAgICAgbUNvbXBhdFNjYWxpbmcgICAgPSBzcmMubUNvbXBhdFNjYWxpbmc7CiAgICAgICAgICAgICBtSW52Q29tcGF0U2NhbGluZyA9IHNyYy5tSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgICAgIG1CaWRpRmxhZ3MgICAgICA9IHNyYy5tQmlkaUZsYWdzOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTIsMTAgKzM5NSwzMyBAQAogICAgICAgICAgICAgbUludkNvbXBhdFNjYWxpbmcgPSAxLjBmL2ZhY3RvcjsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYmlkaSBmbGFncyBvbiB0aGUgcGFpbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYmlkaSBmbGFncyBvbiB0aGUgcGFpbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QmlkaUZsYWdzKCkgeworICAgICAgICByZXR1cm4gbUJpZGlGbGFnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJpZGkgZmxhZ3Mgb24gdGhlIHBhaW50LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmlkaUZsYWdzKGludCBmbGFncykgeworICAgICAgICAvLyBvbmx5IGZsYWcgdmFsdWUgaXMgdGhlIDMtYml0IEJJREkgY29udHJvbCBzZXR0aW5nCisgICAgICAgIGZsYWdzICY9IEJJRElfRkxBR19NQVNLOworICAgICAgICBpZiAoZmxhZ3MgPiBCSURJX01BWF9GTEFHX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGJpZGkgZmxhZzogIiArIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICBtQmlkaUZsYWdzID0gZmxhZ3M7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwYWludCdzIGZsYWdzLiBVc2UgdGhlIEZsYWcgZW51bSB0byB0ZXN0IGZsYWcgdmFsdWVzLgotICAgICAqCisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcGFpbnQncyBmbGFncyAoc2VlIGVudW1zIGVuZGluZyBpbiBfRmxhZyBmb3IgYml0IG1hc2tzKQogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgaW50IGdldEZsYWdzKCk7CkBAIC03ODcsMTggKzk1MywyNyBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBUZW1wb3JhcnkgQVBJIHRvIGV4cG9zZSBsYXllciBkcmF3aW5nLiBUaGlzIGRyYXdzIGEgc2hhZG93IGxheWVyIGJlbG93Ci0gICAgICogdGhlIG1haW4gbGF5ZXIsIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgYW5kIGNvbG9yLCBhbmQgYmx1ciByYWRpdXMuCi0gICAgICogSWYgcmFkaXVzIGlzIDAsIHRoZW4gdGhlIHNoYWRvdyBsYXllciBpcyByZW1vdmVkLgorICAgICAqIFRoaXMgZHJhd3MgYSBzaGFkb3cgbGF5ZXIgYmVsb3cgdGhlIG1haW4gbGF5ZXIsIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG9mZnNldCBhbmQgY29sb3IsIGFuZCBibHVyIHJhZGl1cy4gSWYgcmFkaXVzIGlzIDAsIHRoZW4gdGhlIHNoYWRvdworICAgICAqIGxheWVyIGlzIHJlbW92ZWQuCiAgICAgICovCi0gICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldFNoYWRvd0xheWVyKGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IpOworICAgIHB1YmxpYyB2b2lkIHNldFNoYWRvd0xheWVyKGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpIHsKKyAgICAgICAgaGFzU2hhZG93ID0gcmFkaXVzID4gMC4wZjsKKyAgICAgICAgc2hhZG93UmFkaXVzID0gcmFkaXVzOworICAgICAgICBzaGFkb3dEeCA9IGR4OworICAgICAgICBzaGFkb3dEeSA9IGR5OworICAgICAgICBzaGFkb3dDb2xvciA9IGNvbG9yOworICAgICAgICBuU2V0U2hhZG93TGF5ZXIocmFkaXVzLCBkeCwgZHksIGNvbG9yKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0U2hhZG93TGF5ZXIoZmxvYXQgcmFkaXVzLCBmbG9hdCBkeCwgZmxvYXQgZHksIGludCBjb2xvcik7CiAKICAgICAvKioKLSAgICAgKiBUZW1wb3JhcnkgQVBJIHRvIGNsZWFyIHRoZSBzaGFkb3cgbGF5ZXIuCisgICAgICogQ2xlYXIgdGhlIHNoYWRvdyBsYXllci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhclNoYWRvd0xheWVyKCkgewotICAgICAgICBzZXRTaGFkb3dMYXllcigwLCAwLCAwLCAwKTsKKyAgICAgICAgaGFzU2hhZG93ID0gZmFsc2U7CisgICAgICAgIG5TZXRTaGFkb3dMYXllcigwLCAwLCAwLCAwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMzIsMTAgKzE0MDcsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAJVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgCWludCByZXN1bHQgPSBnZXRUZXh0V2lkdGhzKGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHdpZHRocyk7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0VGV4dFdpZHRocyhidWYsIDAsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOwogICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOwotICAgIAlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI4Miw2ICsxNDU3LDI4NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkIHRoYXQgdGFrZXMgYSBjaGFyIGFycmF5IGluc3RlYWQgb2YgYQorICAgICAqIFN0cmluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFRleHRSdW5BZHZhbmNlcyhTdHJpbmcsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBmbG9hdFtdLCBpbnQpCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGNoYXJbXSBjaGFycywgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsCisgICAgICAgICAgICBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IGNvbnRleHRJbmRleCB8IGNvbnRleHRDb3VudCB8IGFkdmFuY2VzSW5kZXgKKyAgICAgICAgICAgICAgICB8IChpbmRleCAtIGNvbnRleHRJbmRleCkKKyAgICAgICAgICAgICAgICB8ICgoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSAtIChpbmRleCArIGNvdW50KSkKKyAgICAgICAgICAgICAgICB8IChjaGFycy5sZW5ndGggLSAoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSkKKyAgICAgICAgICAgICAgICB8IChhZHZhbmNlcyA9PSBudWxsID8gMCA6CisgICAgICAgICAgICAgICAgICAgIChhZHZhbmNlcy5sZW5ndGggLSAoYWR2YW5jZXNJbmRleCArIGNvdW50KSkpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICE9IERJUkVDVElPTl9MVFIgJiYgZmxhZ3MgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmbGFncyB2YWx1ZTogIiArIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc0NvbXBhdFNjYWxpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKG1OYXRpdmVQYWludCwgY2hhcnMsIGluZGV4LCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgcmVzID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIGNoYXJzLCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUpOworCisgICAgICAgIGlmIChhZHZhbmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gYWR2YW5jZXNJbmRleCwgZSA9IGkgKyBjb3VudDsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXMgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgbm90IHNpZ25pZmljYW50CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugb3ZlcmxvYWQgdGhhdCB0YWtlcyBhIENoYXJTZXF1ZW5jZSBpbnN0ZWFkIG9mIGEKKyAgICAgKiBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgZmxvYXRbXSwgaW50KQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywKKyAgICAgICAgICAgIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQWR2YW5jZXMoKFN0cmluZykgdGV4dCwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIGdldFRleHRSdW5BZHZhbmNlcyh0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5nZXRUZXh0UnVuQWR2YW5jZXMoc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgZmxvYXQgcmVzdWx0ID0gZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIGFkdmFuY2Ugd2lkdGggZm9yIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBydW4KKyAgICAgKiBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQsIGFuZCBpZiBhZHZhbmNlcyBpcyBub3QgbnVsbCwgdGhlIGFkdmFuY2UKKyAgICAgKiBhc3NpZ25lZCB0byBlYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgKGphdmEgY2hhcnMpLgorICAgICAqCisgICAgICogPHA+VGhlIHRyYWlsaW5nIHN1cnJvZ2F0ZSBpbiBhIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyIGlzIGFzc2lnbmVkCisgICAgICogYW4gYWR2YW5jZSBvZiAwLiAgVGh1cyB0aGUgbnVtYmVyIG9mIHJldHVybmVkIGFkdmFuY2VzIGlzCisgICAgICogYWx3YXlzIGVxdWFsIHRvIGNvdW50LCBub3QgdG8gdGhlIG51bWJlciBvZiB1bmljb2RlIGNvZGVwb2ludHMKKyAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgcnVuLgorICAgICAqCisgICAgICogPHA+SW4gdGhlIGNhc2Ugb2YgY29uanVuY3RzIG9yIGNvbWJpbmluZyBtYXJrcywgdGhlIHRvdGFsCisgICAgICogYWR2YW5jZSBpcyBhc3NpZ25lZCB0byB0aGUgZmlyc3QgbG9naWNhbCBjaGFyYWN0ZXIsIGFuZCB0aGUKKyAgICAgKiBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgYXNzaWduZWQgYW4gYWR2YW5jZSBvZiAwLgorICAgICAqCisgICAgICogPHA+VGhpcyBnZW5lcmF0ZXMgdGhlIHN1bSBvZiB0aGUgYWR2YW5jZXMgb2YgZ2x5cGhzIGZvcgorICAgICAqIGNoYXJhY3RlcnMgaW4gYSByZW9yZGVyZWQgY2x1c3RlciBhcyB0aGUgd2lkdGggb2YgdGhlIGZpcnN0CisgICAgICogbG9naWNhbCBjaGFyYWN0ZXIgaW4gdGhlIGNsdXN0ZXIsIGFuZCAwIGZvciB0aGUgd2lkdGhzIG9mIGFsbAorICAgICAqIG90aGVyIGNoYXJhY3RlcnMgaW4gdGhlIGNsdXN0ZXIuICBJbiBlZmZlY3QsIHN1Y2ggY2x1c3RlcnMgYXJlCisgICAgICogdHJlYXRlZCBsaWtlIGNvbmp1bmN0cy4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzaGFwaW5nIGJvdW5kcyBsaW1pdCB0aGUgYW1vdW50IG9mIGNvbnRleHQgYXZhaWxhYmxlCisgICAgICogb3V0c2lkZSBzdGFydCBhbmQgZW5kIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNoYXBpbmcgYW5hbHlzaXMuCisgICAgICogVGhlc2UgYm91bmRzIHR5cGljYWxseSByZWZsZWN0IGNoYW5nZXMgaW4gYmlkaSBsZXZlbCBvciBmb250CisgICAgICogbWV0cmljcyBhY3Jvc3Mgd2hpY2ggc2hhcGluZyBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gbWVhc3VyZQorICAgICAqIEBwYXJhbSBlbmQgdGhlIGluZGV4IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gY29udGV4dFN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHVzZSBmb3Igc2hhcGluZyBjb250ZXh0LAorICAgICAqIG11c3QgYmUgPD0gc3RhcnQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgaW5kZXggcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBzaGFwaW5nIGNvbnRleHQsCisgICAgICogbXVzdCBiZSA+PSBlbmQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIGNvbnRyb2wgdGhlIGFkdmFuY2VzLCBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fTFRSfQorICAgICAqIG9yIHtAbGluayAjRElSRUNUSU9OX1JUTH0KKyAgICAgKiBAcGFyYW0gYWR2YW5jZXMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZXMsIG11c3QgaGF2ZSByb29tIGZvciBhbGwgYWR2YW5jZXMsCisgICAgICogY2FuIGJlIG51bGwgaWYgb25seSB0b3RhbCBhZHZhbmNlIGlzIG5lZWRlZAorICAgICAqIEBwYXJhbSBhZHZhbmNlc0luZGV4IHRoZSBwb3NpdGlvbiBpbiBhZHZhbmNlcyBhdCB3aGljaCB0byBwdXQgdGhlCisgICAgICogYWR2YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaGFyYWN0ZXIgYXQgc3RhcnQKKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBhZHZhbmNlCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBhZHZhbmNlc0luZGV4IHwgKGVuZCAtIHN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKHN0YXJ0IC0gY29udGV4dFN0YXJ0KSB8IChjb250ZXh0RW5kIC0gZW5kKQorICAgICAgICAgICAgICAgIHwgKHRleHQubGVuZ3RoKCkgLSBjb250ZXh0RW5kKQorICAgICAgICAgICAgICAgIHwgKGFkdmFuY2VzID09IG51bGwgPyAwIDoKKyAgICAgICAgICAgICAgICAgICAgKGFkdmFuY2VzLmxlbmd0aCAtIGFkdmFuY2VzSW5kZXggLSAoZW5kIC0gc3RhcnQpKSkpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgIT0gRElSRUNUSU9OX0xUUiAmJiBmbGFncyAhPSBESVJFQ1RJT05fUlRMKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGZsYWdzIHZhbHVlOiAiICsgZmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSGFzQ29tcGF0U2NhbGluZykgeworICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgdG90YWxBZHZhbmNlID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBzZXRUZXh0U2l6ZShvbGRTaXplKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFkdmFuY2VzSW5kZXgsIGUgPSBpICsgKGVuZCAtIHN0YXJ0KTsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2UgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgaW5zaWduaWZpY2FudAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBydW4uICBUaGlzIGF2b2lkcyBwbGFjaW5nIHRoZQorICAgICAqIGN1cnNvciBiZXR3ZWVuIHN1cnJvZ2F0ZXMsIGJldHdlZW4gY2hhcmFjdGVycyB0aGF0IGZvcm0gY29uanVuY3RzLAorICAgICAqIGJldHdlZW4gYmFzZSBjaGFyYWN0ZXJzIGFuZCBjb21iaW5pbmcgbWFya3MsIG9yIHdpdGhpbiBhIHJlb3JkZXJpbmcKKyAgICAgKiBjbHVzdGVyLgorICAgICAqCisgICAgICogPHA+Q29udGV4dFN0YXJ0IGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0ZXh0LgorICAgICAqIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dExlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoY2hhcltdIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0TGVuZ3RoLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGludCBjb250ZXh0RW5kID0gY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aDsKKyAgICAgICAgaWYgKCgoY29udGV4dFN0YXJ0IHwgY29udGV4dEVuZCB8IG9mZnNldCB8IChjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKG9mZnNldCAtIGNvbnRleHRTdGFydCkgfCAoY29udGV4dEVuZCAtIG9mZnNldCkKKyAgICAgICAgICAgICAgICB8ICh0ZXh0Lmxlbmd0aCAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbmd0aCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoQ2hhclNlcXVlbmNlIHRleHQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpIHsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQ3Vyc29yKHRleHQudG9TdHJpbmcoKSwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmdldFRleHRSdW5DdXJzb3IoCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0LCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgIGludCByZXN1bHQgPSBnZXRUZXh0UnVuQ3Vyc29yKGJ1ZiwgMCwgY29udGV4dExlbiwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoU3RyaW5nIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGlmICgoKGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBvZmZzZXQgfCAoY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCkKKyAgICAgICAgICAgICAgICB8IChvZmZzZXQgLSBjb250ZXh0U3RhcnQpIHwgKGNvbnRleHRFbmQgLSBvZmZzZXQpCisgICAgICAgICAgICAgICAgfCAodGV4dC5sZW5ndGgoKSAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHBhdGggKG91dGxpbmUpIGZvciB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICogTm90ZToganVzdCBsaWtlIENhbnZhcy5kcmF3VGV4dCwgdGhpcyB3aWxsIHJlc3BlY3QgdGhlIEFsaWduIHNldHRpbmcgaW4KICAgICAgKiB0aGUgcGFpbnQuCkBAIC0xMjk5LDcgKzE3NTIsOCBAQAogICAgICAgICBpZiAoKGluZGV4IHwgY291bnQpIDwgMCB8fCBpbmRleCArIGNvdW50ID4gdGV4dC5sZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZ2V0VGV4dFBhdGgobU5hdGl2ZVBhaW50LCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksIHBhdGgubmkoKSk7CisgICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIG1CaWRpRmxhZ3MsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgCisgICAgICAgICAgICAgICAgcGF0aC5uaSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMjAsNyArMTc3NCw4IEBACiAgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCAoZW5kIC0gc3RhcnQpIHwgKHRleHQubGVuZ3RoKCkgLSBlbmQpKSA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgcGF0aC5uaSgpKTsKKyAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgbUJpZGlGbGFncywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgCisgICAgICAgICAgICAgICAgcGF0aC5uaSgpKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDA0LDkgKzE4NTksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0W10gd2lkdGhzKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0V2lkdGhzKGludCBuYXRpdmVfb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsCisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmxvYXQgbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhpbnQgbmF0aXZlX29iamVjdCwKKyAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBmbG9hdCBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBuYXRpdmVfb2JqZWN0LAorICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KTsKKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvcihpbnQgbmF0aXZlX29iamVjdCwgY2hhcltdIHRleHQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dExlbmd0aCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldFRleHRSdW5DdXJzb3IoaW50IG5hdGl2ZV9vYmplY3QsIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsIGludCBiaWRpRmxhZ3MsCiAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgcGF0aCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LAorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwgaW50IGJpZGlGbGFncywKICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgcGF0aCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlR2V0U3RyaW5nQm91bmRzKGludCBuYXRpdmVQYWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgUmVjdCBib3VuZHMpOwpAQCAtMTQxNCw0ICsxODgyLDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBSZWN0IGJvdW5kcyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVQYWludCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5qYXZhCmluZGV4IDI4MTgyM2EuLjEzMjQ0MzEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSGFyZHdhcmVSZW5kZXJlcjsKKwogLyoqCiAgKiBUaGUgUGF0aCBjbGFzcyBlbmNhcHN1bGF0ZXMgY29tcG91bmQgKG11bHRpcGxlIGNvbnRvdXIpIGdlb21ldHJpYyBwYXRocwogICogY29uc2lzdGluZyBvZiBzdHJhaWdodCBsaW5lIHNlZ21lbnRzLCBxdWFkcmF0aWMgY3VydmVzLCBhbmQgY3ViaWMgY3VydmVzLgpAQCAtMjQsMTIgKzI2LDI3IEBACiAgKiB0ZXh0IG9uIGEgcGF0aC4KICAqLwogcHVibGljIGNsYXNzIFBhdGggeworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBtTmF0aXZlUGF0aDsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGVQYXRoID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBSZWdpb24gcmVjdHM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZXRlY3RTaW1wbGVQYXRoczsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBlbXB0eSBwYXRoCiAgICAgICovCiAgICAgcHVibGljIFBhdGgoKSB7CiAgICAgICAgIG1OYXRpdmVQYXRoID0gaW5pdDEoKTsKKyAgICAgICAgbURldGVjdFNpbXBsZVBhdGhzID0gSGFyZHdhcmVSZW5kZXJlci5pc0F2YWlsYWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDMsNiArNjAsNyBAQAogICAgICAgICAgICAgdmFsTmF0aXZlID0gc3JjLm1OYXRpdmVQYXRoOwogICAgICAgICB9CiAgICAgICAgIG1OYXRpdmVQYXRoID0gaW5pdDIodmFsTmF0aXZlKTsKKyAgICAgICAgbURldGVjdFNpbXBsZVBhdGhzID0gSGFyZHdhcmVSZW5kZXJlci5pc0F2YWlsYWJsZSgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTUwLDYgKzY4LDEwIEBACiAgICAgICogVGhpcyBkb2VzIE5PVCBjaGFuZ2UgdGhlIGZpbGwtdHlwZSBzZXR0aW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSB0cnVlOworICAgICAgICBpZiAobURldGVjdFNpbXBsZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAocmVjdHMgIT0gbnVsbCkgcmVjdHMuc2V0RW1wdHkoKTsKKyAgICAgICAgfQogICAgICAgICBuYXRpdmVfcmVzZXQobU5hdGl2ZVBhdGgpOwogICAgIH0KIApAQCAtNTgsNiArODAsMTAgQEAKICAgICAgKiBrZWVwcyB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIGZhc3RlciByZXVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXdpbmQoKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IHRydWU7CisgICAgICAgIGlmIChtRGV0ZWN0U2ltcGxlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChyZWN0cyAhPSBudWxsKSByZWN0cy5zZXRFbXB0eSgpOworICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9yZXdpbmQobU5hdGl2ZVBhdGgpOwogICAgIH0KIApAQCAtNjUsNiArOTEsNyBAQAogICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0KFBhdGggc3JjKSB7CiAgICAgICAgIGlmICh0aGlzICE9IHNyYykgeworICAgICAgICAgICAgaXNTaW1wbGVQYXRoID0gc3JjLmlzU2ltcGxlUGF0aDsKICAgICAgICAgICAgIG5hdGl2ZV9zZXQobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjAsNiArMTg3LDcgQEAKICAgICAgKiBAcGFyYW0gYm91bmRzIFJldHVybnMgdGhlIGNvbXB1dGVkIGJvdW5kcyBvZiB0aGUgcGF0aCdzIGNvbnRyb2wgcG9pbnRzLgogICAgICAqIEBwYXJhbSBleGFjdCBUaGlzIHBhcmFtZXRlciBpcyBubyBsb25nZXIgdXNlZC4KICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCiAgICAgcHVibGljIHZvaWQgY29tcHV0ZUJvdW5kcyhSZWN0RiBib3VuZHMsIGJvb2xlYW4gZXhhY3QpIHsKICAgICAgICAgbmF0aXZlX2NvbXB1dGVCb3VuZHMobU5hdGl2ZVBhdGgsIGJvdW5kcyk7CiAgICAgfQpAQCAtMjA4LDYgKzIzNiw3IEBACiAgICAgICogQHBhcmFtIHkgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgZW5kIG9mIGEgbGluZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxpbmVUbyhmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfbGluZVRvKG1OYXRpdmVQYXRoLCB4LCB5KTsKICAgICB9CiAKQEAgLTIyMiw2ICsyNTEsNyBAQAogICAgICAqICAgICAgICAgICB0aGlzIGNvbnRvdXIsIHRvIHNwZWNpZnkgYSBsaW5lCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgckxpbmVUbyhmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9yTGluZVRvKG1OYXRpdmVQYXRoLCBkeCwgZHkpOwogICAgIH0KIApAQCAtMjM2LDYgKzI2Niw3IEBACiAgICAgICogQHBhcmFtIHkyIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvbiBhIHF1YWRyYXRpYyBjdXJ2ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHF1YWRUbyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX3F1YWRUbyhtTmF0aXZlUGF0aCwgeDEsIHkxLCB4MiwgeTIpOwogICAgIH0KIApAQCAtMjU0LDYgKzI4NSw3IEBACiAgICAgICogICAgICAgICAgICB0aGlzIGNvbnRvdXIsIGZvciB0aGUgZW5kIHBvaW50IG9mIGEgcXVhZHJhdGljIGN1cnZlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgclF1YWRUbyhmbG9hdCBkeDEsIGZsb2F0IGR5MSwgZmxvYXQgZHgyLCBmbG9hdCBkeTIpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9yUXVhZFRvKG1OYXRpdmVQYXRoLCBkeDEsIGR5MSwgZHgyLCBkeTIpOwogICAgIH0KIApAQCAtMjcxLDYgKzMwMyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY3ViaWNUbyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2N1YmljVG8obU5hdGl2ZVBhdGgsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpOwogICAgIH0KIApAQCAtMjgxLDYgKzMxNCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgckN1YmljVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfckN1YmljVG8obU5hdGl2ZVBhdGgsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpOwogICAgIH0KIApAQCAtMjk5LDYgKzMzMyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYXJjVG8oUmVjdEYgb3ZhbCwgZmxvYXQgc3RhcnRBbmdsZSwgZmxvYXQgc3dlZXBBbmdsZSwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlTW92ZVRvKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYXJjVG8obU5hdGl2ZVBhdGgsIG92YWwsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUsIGZvcmNlTW92ZVRvKTsKICAgICB9CiAgICAgCkBAIC0zMTQsNiArMzQ5LDcgQEAKICAgICAgKiBAcGFyYW0gc3dlZXBBbmdsZSAgU3dlZXAgYW5nbGUgKGluIGRlZ3JlZXMpIG1lYXN1cmVkIGNsb2Nrd2lzZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFyY1RvKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hcmNUbyhtTmF0aXZlUGF0aCwgb3ZhbCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSwgZmFsc2UpOwogICAgIH0KICAgICAKQEAgLTMyMiw2ICszNTgsNyBAQAogICAgICAqIGZpcnN0IHBvaW50IG9mIHRoZSBjb250b3VyLCBhIGxpbmUgc2VnbWVudCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2Nsb3NlKG1OYXRpdmVQYXRoKTsKICAgICB9CiAKQEAgLTM1MSw2ICszODgsMTEgQEAKICAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZWVkIHJlY3QgcGFyYW1ldGVyIik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1EZXRlY3RTaW1wbGVQYXRocykgeworICAgICAgICAgICAgaWYgKHJlY3RzID09IG51bGwpIHJlY3RzID0gbmV3IFJlZ2lvbigpOworICAgICAgICAgICAgcmVjdHMub3AoKGludCkgcmVjdC5sZWZ0LCAoaW50KSByZWN0LnRvcCwgKGludCkgcmVjdC5yaWdodCwgKGludCkgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgIFJlZ2lvbi5PcC5VTklPTik7CisgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2FkZFJlY3QobU5hdGl2ZVBhdGgsIHJlY3QsIGRpci5uYXRpdmVJbnQpOwogICAgIH0KIApAQCAtMzYzLDggKzQwNSwxMSBAQAogICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBvZiBhIHJlY3RhbmdsZSB0byBhZGQgdG8gdGhlIHBhdGgKICAgICAgKiBAcGFyYW0gZGlyICAgIFRoZSBkaXJlY3Rpb24gdG8gd2luZCB0aGUgcmVjdGFuZ2xlJ3MgY29udG91cgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGRpcikgeworICAgIHB1YmxpYyB2b2lkIGFkZFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBEaXJlY3Rpb24gZGlyKSB7CisgICAgICAgIGlmIChtRGV0ZWN0U2ltcGxlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChyZWN0cyA9PSBudWxsKSByZWN0cyA9IG5ldyBSZWdpb24oKTsKKyAgICAgICAgICAgIHJlY3RzLm9wKChpbnQpIGxlZnQsIChpbnQpIHRvcCwgKGludCkgcmlnaHQsIChpbnQpIGJvdHRvbSwgUmVnaW9uLk9wLlVOSU9OKTsKKyAgICAgICAgfQogICAgICAgICBuYXRpdmVfYWRkUmVjdChtTmF0aXZlUGF0aCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTM3OCw2ICs0MjMsNyBAQAogICAgICAgICBpZiAob3ZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5lZWQgb3ZhbCBwYXJhbWV0ZXIiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZE92YWwobU5hdGl2ZVBhdGgsIG92YWwsIGRpci5uYXRpdmVJbnQpOwogICAgIH0KIApAQCAtMzkwLDYgKzQzNiw3IEBACiAgICAgICogQHBhcmFtIGRpciAgICBUaGUgZGlyZWN0aW9uIHRvIHdpbmQgdGhlIGNpcmNsZSdzIGNvbnRvdXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDaXJjbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBEaXJlY3Rpb24gZGlyKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYWRkQ2lyY2xlKG1OYXRpdmVQYXRoLCB4LCB5LCByYWRpdXMsIGRpci5uYXRpdmVJbnQpOwogICAgIH0KIApAQCAtNDA0LDYgKzQ1MSw3IEBACiAgICAgICAgIGlmIChvdmFsID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmVlZCBvdmFsIHBhcmFtZXRlciIpOwogICAgICAgICB9CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYWRkQXJjKG1OYXRpdmVQYXRoLCBvdmFsLCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsKICAgICB9CiAKQEAgLTQxOSw2ICs0NjcsNyBAQAogICAgICAgICBpZiAocmVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5lZWQgcmVjdCBwYXJhbWV0ZXIiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFJvdW5kUmVjdChtTmF0aXZlUGF0aCwgcmVjdCwgcngsIHJ5LCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAgICAgCkBAIC00MzgsNiArNDg3LDcgQEAKICAgICAgICAgaWYgKHJhZGlpLmxlbmd0aCA8IDgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oInJhZGlpW10gbmVlZHMgOCB2YWx1ZXMiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFJvdW5kUmVjdChtTmF0aXZlUGF0aCwgcmVjdCwgcmFkaWksIGRpci5uYXRpdmVJbnQpOwogICAgIH0KICAgICAKQEAgLTQ0OCw2ICs0OTgsNyBAQAogICAgICAqIEBwYXJhbSBkeCAgVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgdGhlIHBhdGggaW4gWCBhcyBpdCBpcyBhZGRlZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBzcmMsIGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFBhdGgobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCwgZHgsIGR5KTsKICAgICB9CiAKQEAgLTQ1Nyw2ICs1MDgsNyBAQAogICAgICAqIEBwYXJhbSBzcmMgVGhlIHBhdGggdGhhdCBpcyBhcHBlbmRlZCB0byB0aGUgY3VycmVudCBwYXRoCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUGF0aChQYXRoIHNyYykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFBhdGgobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCk7CiAgICAgfQogCkBAIC00NjYsNiArNTE4LDcgQEAKICAgICAgKiBAcGFyYW0gc3JjIFRoZSBwYXRoIHRvIGFkZCBhcyBhIG5ldyBjb250b3VyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUGF0aChQYXRoIHNyYywgTWF0cml4IG1hdHJpeCkgeworICAgICAgICBpZiAoIXNyYy5pc1NpbXBsZVBhdGgpIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYWRkUGF0aChtTmF0aXZlUGF0aCwgc3JjLm1OYXRpdmVQYXRoLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKICAgICB9CiAKQEAgLTUwMiw2ICs1NTUsNyBAQAogICAgICAqIEBwYXJhbSBkeSBUaGUgbmV3IFkgY29vcmRpbmF0ZSBmb3IgdGhlIGxhc3QgcG9pbnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMYXN0UG9pbnQoZmxvYXQgZHgsIGZsb2F0IGR5KSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfc2V0TGFzdFBvaW50KG1OYXRpdmVQYXRoLCBkeCwgZHkpOwogICAgIH0KIApAQCAtNTM3LDggKzU5MSw4IEBACiAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8qcGFja2FnZSovIGZpbmFsIGludCBuaSgpIHsKKworICAgIGZpbmFsIGludCBuaSgpIHsKICAgICAgICAgcmV0dXJuIG1OYXRpdmVQYXRoOwogICAgIH0KIApAQCAtNTkyLDYgKzY0Niw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3BhdGgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV90cmFuc2Zvcm0oaW50IG5QYXRoLCBpbnQgbWF0cml4KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5QYXRoKTsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVQYXRoOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEKaW5kZXggMzkwNDIzNC4uMmVmMTY2MiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5qYXZhCkBAIC01MywxMSArNTMsMTggQEAKICAgICAgICAgLyoqIFtTYSAqIERhLCBTYyAqIERjXSAqLwogICAgICAgICBNVUxUSVBMWSAgICAoMTQpLAogICAgICAgICAvKiogW1NhICsgRGEgLSBTYSAqIERhLCBTYyArIERjIC0gU2MgKiBEY10gKi8KLSAgICAgICAgU0NSRUVOICAgICAgKDE1KTsKKyAgICAgICAgU0NSRUVOICAgICAgKDE1KSwKKyAgICAgICAgLyoqIFNhdHVyYXRlKFMgKyBEKSAqLworICAgICAgICBBREQgICAgICAgICAoMTYpLAorICAgICAgICBPVkVSTEFZICAgICAoMTcpOwogCiAgICAgICAgIE1vZGUoaW50IG5hdGl2ZUludCkgewogICAgICAgICAgICAgdGhpcy5uYXRpdmVJbnQgPSBuYXRpdmVJbnQ7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IG5hdGl2ZUludDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmF0aXZlSW50OwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIuamF2YQppbmRleCAwNjcyNGJkLi5iMDJkYWIxIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZkNvbG9yRmlsdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZDb2xvckZpbHRlci5qYXZhCkBAIC0yNSwxMCArMjUsMTAgQEAKICAgICAgKiBAcGFyYW0gbW9kZSAgICAgICAgICAgVGhlIHBvcnRlci1kdWZmIG1vZGUgdGhhdCBpcyBhcHBsaWVkCiAgICAgICovCiAgICAgcHVibGljIFBvcnRlckR1ZmZDb2xvckZpbHRlcihpbnQgc3JjQ29sb3IsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7Ci0gICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKHNyY0NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKHNyY0NvbG9yLCBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZUNvbG9yRmlsdGVyID0gbkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoc3JjQ29sb3IsIG1vZGUubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKGludCBzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihpbnQgc3JjQ29sb3IsIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihpbnQgc3JjQ29sb3IsIGludCBwb3J0ZXJEdWZmTW9kZSk7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZlhmZXJtb2RlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZlhmZXJtb2RlLmphdmEKaW5kZXggY2IxMjdmZC4uNmJhMDY0YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZYZmVybW9kZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmWGZlcm1vZGUuamF2YQpAQCAtMTgsMTEgKzE4LDE3IEBACiAKIHB1YmxpYyBjbGFzcyBQb3J0ZXJEdWZmWGZlcm1vZGUgZXh0ZW5kcyBYZmVybW9kZSB7CiAgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUG9ydGVyRHVmZi5Nb2RlIG1vZGU7CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYW4geGZlcm1vZGUgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgcG9ydGVyLWR1ZmYgbW9kZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBtb2RlICAgICAgICAgICBUaGUgcG9ydGVyLWR1ZmYgbW9kZSB0aGF0IGlzIGFwcGxpZWQKICAgICAgKi8KICAgICBwdWJsaWMgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgIHRoaXMubW9kZSA9IG1vZGU7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZVhmZXJtb2RlKG1vZGUubmF0aXZlSW50KTsKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmFkaWFsR3JhZGllbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SYWRpYWxHcmFkaWVudC5qYXZhCmluZGV4IGI0ZTkwMmQuLjg5Nzc2MmMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SYWRpYWxHcmFkaWVudC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SYWRpYWxHcmFkaWVudC5qYXZhCkBAIC00MCw2ICs0MCw4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb2xvciBhbmQgcG9zaXRpb24gYXJyYXlzIG11c3QgYmUgb2YgZXF1YWwgbGVuZ3RoIik7CiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMSh4LCB5LCByYWRpdXMsIGNvbG9ycywgcG9zaXRpb25zLCB0aWxlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMShuYXRpdmVfaW5zdGFuY2UsIHgsIHksIHJhZGl1cywgY29sb3JzLCBwb3NpdGlvbnMsCisgICAgICAgICAgICAgICAgdGlsZS5uYXRpdmVJbnQpOwogICAgIH0KIAogCS8qKglDcmVhdGUgYSBzaGFkZXIgdGhhdCBkcmF3cyBhIHJhZGlhbCBncmFkaWVudCBnaXZlbiB0aGUgY2VudGVyIGFuZCByYWRpdXMuCkBAIC01NiwxMSArNTgsMTggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJhZGl1cyBtdXN0IGJlID4gMCIpOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTIoeCwgeSwgcmFkaXVzLCBjb2xvcjAsIGNvbG9yMSwgdGlsZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTIobmF0aXZlX2luc3RhbmNlLCB4LCB5LCByYWRpdXMsIGNvbG9yMCwgY29sb3IxLAorICAgICAgICAgICAgICAgIHRpbGUubmF0aXZlSW50KTsKICAgICB9CiAKIAlwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdLCBpbnQgdGlsZU1vZGUpOworICAgICAgICAgICAgaW50IGNvbG9yc1tdLCBmbG9hdCBwb3NpdGlvbnNbXSwgaW50IHRpbGVNb2RlKTsKIAlwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpOworICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXIsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywKKyAgICAgICAgICAgIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10sIGludCB0aWxlTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlciwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLAorICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhCmluZGV4IDJiMDgwYWEuLmU1NDA4MDYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SZWdpb24uamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmphdmEKQEAgLTIwLDYgKzIwLDEwIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogCiBwdWJsaWMgY2xhc3MgUmVnaW9uIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IG1OYXRpdmVSZWdpb247CiAKICAgICAvLyB0aGUgbmF0aXZlIHZhbHVlcyBmb3IgdGhlc2UgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbnVtIGluIFNrUmVnaW9uLmgKICAgICBwdWJsaWMgZW51bSBPcCB7CkBAIC0zMyw3ICszNywxMSBAQAogICAgICAgICBPcChpbnQgbmF0aXZlSW50KSB7CiAgICAgICAgICAgICB0aGlzLm5hdGl2ZUludCA9IG5hdGl2ZUludDsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgbmF0aXZlSW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuYXRpdmVJbnQ7CiAgICAgfQogCiAgICAgLyoqIENyZWF0ZSBhbiBlbXB0eSByZWdpb24KQEAgLTMyNSwxMCArMzMzLDE0IEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlUmVnaW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5hdGl2ZURlc3RydWN0b3IobU5hdGl2ZVJlZ2lvbik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CiAgICAgfQogICAgIAotICAgIC8qcGFja2FnZSovIFJlZ2lvbihpbnQgbmkpIHsKKyAgICBSZWdpb24oaW50IG5pKSB7CiAgICAgICAgIGlmIChuaSA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwogICAgICAgICB9CkBAIC0zNDEsNyArMzUzLDcgQEAKICAgICAgICAgdGhpcyhuaSk7CiAgICAgfQogCi0gICAgLypwYWNrYWdlKi8gZmluYWwgaW50IG5pKCkgeworICAgIGZpbmFsIGludCBuaSgpIHsKICAgICAgICAgcmV0dXJuIG1OYXRpdmVSZWdpb247CiAgICAgfQogCkBAIC0zNzAsNiArMzgyLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCBwKTsKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUVxdWFscyhpbnQgbmF0aXZlX3IxLCBpbnQgbmF0aXZlX3IyKTsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVSZWdpb247CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEKaW5kZXggYWUwMzA0ZS4uMDQwMGI1YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuamF2YQpAQCAtMjMsOSArMjMsMTYgQEAKICAqIGRyYXduIHdpdGggdGhhdCBwYWludCB3aWxsIGdldCBpdHMgY29sb3IocykgZnJvbSB0aGUgc2hhZGVyLgogICovCiBwdWJsaWMgY2xhc3MgU2hhZGVyIHsKLQotICAgIC8vIHRoaXMgaXMgc2V0IGJ5IHN1YmNsYXNzZXMsIGJ1dCBkb24ndCBtYWtlIGl0IHB1YmxpYwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG5hdGl2ZV9pbnN0YW5jZTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHNldCBieSBzdWJjbGFzc2VzLCBidXQgZG9uJ3QgbWFrZSBpdCBwdWJsaWMuCisgICAgICogCisgICAgICogQGhpZGUgCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVfaW5zdGFuY2U7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5hdGl2ZV9zaGFkZXI7CiAKICAgICBwdWJsaWMgZW51bSBUaWxlTW9kZSB7CiAgICAgICAgIC8qKgpAQCAtNjQsMTcgKzcxLDIxIEBACiAgICAgICogQHBhcmFtIGxvY2FsTSBUaGUgc2hhZGVyJ3MgbmV3IGxvY2FsIG1hdHJpeCwgb3IgbnVsbCB0byBzcGVjaWZ5IGlkZW50aXR5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxNYXRyaXgoTWF0cml4IGxvY2FsTSkgewotICAgICAgICBuYXRpdmVTZXRMb2NhbE1hdHJpeChuYXRpdmVfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTSAhPSBudWxsID8gbG9jYWxNLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICBuYXRpdmVTZXRMb2NhbE1hdHJpeChuYXRpdmVfaW5zdGFuY2UsIG5hdGl2ZV9zaGFkZXIsCisgICAgICAgICAgICAgICAgbG9jYWxNID09IG51bGwgPyAwIDogbG9jYWxNLm5hdGl2ZV9pbnN0YW5jZSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG5hdGl2ZURlc3RydWN0b3IobmF0aXZlX2luc3RhbmNlLCBuYXRpdmVfc2hhZGVyKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3RydWN0b3IoaW50IG5hdGl2ZV9zaGFkZXIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3RydWN0b3IoaW50IG5hdGl2ZV9zaGFkZXIsIGludCBuYXRpdmVfc2tpYVNoYWRlcik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlR2V0TG9jYWxNYXRyaXgoaW50IG5hdGl2ZV9zaGFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeF9pbnN0YW5jZSk7CisgICAgICAgICAgICBpbnQgbWF0cml4X2luc3RhbmNlKTsgCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0TG9jYWxNYXRyaXgoaW50IG5hdGl2ZV9zaGFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeF9pbnN0YW5jZSk7CisgICAgICAgICAgICBpbnQgbmF0aXZlX3NraWFTaGFkZXIsIGludCBtYXRyaXhfaW5zdGFuY2UpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1N3ZWVwR3JhZGllbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Td2VlcEdyYWRpZW50LmphdmEKaW5kZXggNzQ1Njk5My4uMmFmZGQ0ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1N3ZWVwR3JhZGllbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU3dlZXBHcmFkaWVudC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IgYW5kIHBvc2l0aW9uIGFycmF5cyBtdXN0IGJlIG9mIGVxdWFsIGxlbmd0aCIpOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTEoY3gsIGN5LCBjb2xvcnMsIHBvc2l0aW9ucyk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMShuYXRpdmVfaW5zdGFuY2UsIGN4LCBjeSwgY29sb3JzLCBwb3NpdGlvbnMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTQsMTEgKzU1LDE1IEBACiAgICAgICovCiAgICAgcHVibGljIFN3ZWVwR3JhZGllbnQoZmxvYXQgY3gsIGZsb2F0IGN5LCBpbnQgY29sb3IwLCBpbnQgY29sb3IxKSB7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTIoY3gsIGN5LCBjb2xvcjAsIGNvbG9yMSk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMihuYXRpdmVfaW5zdGFuY2UsIGN4LCBjeSwgY29sb3IwLCBjb2xvcjEpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShmbG9hdCB4LCBmbG9hdCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoZmxvYXQgeCwgZmxvYXQgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGZsb2F0IHgsIGZsb2F0IHksIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10pOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihmbG9hdCB4LCBmbG9hdCB5LCBpbnQgY29sb3IwLCBpbnQgY29sb3IxKTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXIsIGZsb2F0IGN4LCBmbG9hdCBjeSwKKyAgICAgICAgICAgIGludFtdIGNvbG9ycywgZmxvYXRbXSBwb3NpdGlvbnMpOyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyLCBmbG9hdCBjeCwgZmxvYXQgY3ksCisgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxKTsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1RlbXBvcmFyeUJ1ZmZlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCmluZGV4IDFkN2ZlMDEuLmM1YjgxNDMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9UZW1wb3JhcnlCdWZmZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvVGVtcG9yYXJ5QnVmZmVyLmphdmEKQEAgLTE4LDkgKzE4LDExIEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKLS8qIHBhY2thZ2UgKi8gY2xhc3MgVGVtcG9yYXJ5QnVmZmVyCi17Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2hhcltdIG9idGFpbihpbnQgbGVuKSB7CisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wb3JhcnlCdWZmZXIgeworICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIG9idGFpbihpbnQgbGVuKSB7CiAgICAgICAgIGNoYXJbXSBidWY7CiAKICAgICAgICAgc3luY2hyb25pemVkIChUZW1wb3JhcnlCdWZmZXIuY2xhc3MpIHsKQEAgLTI4LDE1ICszMCwxNSBAQAogICAgICAgICAgICAgc1RlbXAgPSBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGJ1ZiA9PSBudWxsIHx8IGJ1Zi5sZW5ndGggPCBsZW4pCisgICAgICAgIGlmIChidWYgPT0gbnVsbCB8fCBidWYubGVuZ3RoIDwgbGVuKSB7CiAgICAgICAgICAgICBidWYgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBidWY7CiAgICAgfQogCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgdm9pZCByZWN5Y2xlKGNoYXJbXSB0ZW1wKSB7Ci0gICAgICAgIGlmICh0ZW1wLmxlbmd0aCA+IDEwMDApCi0gICAgICAgICAgICByZXR1cm47CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlY3ljbGUoY2hhcltdIHRlbXApIHsKKyAgICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMTAwMCkgcmV0dXJuOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAoVGVtcG9yYXJ5QnVmZmVyLmNsYXNzKSB7CiAgICAgICAgICAgICBzVGVtcCA9IHRlbXA7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhCmluZGV4IDQyYzQxMGUuLjI0NjdiZGMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhCkBAIC0zMSw3ICszMSwxMSBAQAogcHVibGljIGNsYXNzIFhmZXJtb2RlIHsKIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZpbmFsaXplcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWxpemVyKG5hdGl2ZV9pbnN0YW5jZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVfaW5zdGFuY2UpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NvbG9yRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Db2xvckRyYXdhYmxlLmphdmEKaW5kZXggNjA0YzYwMi4uYTI1ZmFkNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NvbG9yRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ29sb3JEcmF3YWJsZS5qYXZhCkBAIC0yNiwxMCArMjYsOCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogQSBzcGVjaWFsaXplZCBEcmF3YWJsZSB0aGF0IGZpbGxzIHRoZSBDYW52YXMgd2l0aCBhIHNwZWNpZmllZCBjb2xvciwKLSAqIHdpdGggcmVzcGVjdCB0byB0aGUgY2xpcCByZWdpb24uIE5vdGUgdGhhdCBhIENvbG9yRHJhd2FibGUgaWdub3JlcyB0aGUgQ29sb3JGaWx0ZXIuCi0gKiBJdCBhbHNvIGlnbm9yZXMgdGhlIEJvdW5kcywgbWVhbmluZyBpdCB3aWxsIGRyYXcgZXZlcnl3aGVyZSBpbiB0aGUgY3VycmVudCBjbGlwLAotICogZXZlbiBpZiBzZXRCb3VuZHMoLi4uKSB3YXMgY2FsbGVkIHdpdGggYSBzbWFsbGVyIGFyZWEuCisgKiBBIHNwZWNpYWxpemVkIERyYXdhYmxlIHRoYXQgZmlsbHMgdGhlIENhbnZhcyB3aXRoIGEgc3BlY2lmaWVkIGNvbG9yLgorICogTm90ZSB0aGF0IGEgQ29sb3JEcmF3YWJsZSBpZ25vcmVzIHRoZSBDb2xvckZpbHRlci4KICAqCiAgKiA8cD5JdCBjYW4gYmUgZGVmaW5lZCBpbiBhbiBYTUwgZmlsZSB3aXRoIHRoZSA8Y29kZT4mbHQ7Y29sb3I+PC9jb2RlPiBlbGVtZW50LjwvcD4KICAqCkBAIC0zNyw2ICszNSw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBDb2xvckRyYXdhYmxlIGV4dGVuZHMgRHJhd2FibGUgewogICAgIHByaXZhdGUgQ29sb3JTdGF0ZSBtU3RhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgYmxhY2sgQ29sb3JEcmF3YWJsZS4KQEAgLTY2LDcgKzY1LDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgY2FudmFzLmRyYXdDb2xvcihtU3RhdGUubVVzZUNvbG9yKTsKKyAgICAgICAgaWYgKChtU3RhdGUubVVzZUNvbG9yID4+PiAyNCkgIT0gMCkgeworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKG1TdGF0ZS5tVXNlQ29sb3IpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGdldEJvdW5kcygpLCBtUGFpbnQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhCmluZGV4IDMxMjUzMjEuLjdiMmQ5ZDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhCkBAIC0xNiwyMSArMTYsMzAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOwogCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy4qOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTmluZVBhdGNoOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RhdGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIC8qKgogICogQSBEcmF3YWJsZSBpcyBhIGdlbmVyYWwgYWJzdHJhY3Rpb24gZm9yICJzb21ldGhpbmcgdGhhdCBjYW4gYmUgZHJhd24uIiAgTW9zdApAQCAtNjQ1LDYgKzY1NCw4IEBACiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhIG11dGFibGUgRHJhd2FibGUgd2lsbCBoYXZlIG5vIGVmZmVjdC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhpcyBkcmF3YWJsZS4KKyAgICAgKiBAc2VlIENvbnN0YW50U3RhdGUKKyAgICAgKiBAc2VlICNnZXRDb25zdGFudFN0YXRlKCkKICAgICAgKi8KICAgICBwdWJsaWMgRHJhd2FibGUgbXV0YXRlKCkgewogICAgICAgICByZXR1cm4gdGhpczsKQEAgLTc0OSw2ICs3NjAsOCBAQAogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgU3RhdGVMaXN0RHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygibGV2ZWwtbGlzdCIpKSB7CiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBMZXZlbExpc3REcmF3YWJsZSgpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJtaXBtYXAiKSkgeworICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgTWlwbWFwRHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygibGF5ZXItbGlzdCIpKSB7CiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBMYXllckRyYXdhYmxlKCk7CiAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInRyYW5zaXRpb24iKSkgewpAQCAtNzcwLDcgKzc4Myw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImluc2V0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEluc2V0RHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYml0bWFwIikpIHsKLSAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKCk7CisgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZShyKTsKICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICgoQml0bWFwRHJhd2FibGUpIGRyYXdhYmxlKS5zZXRUYXJnZXREZW5zaXR5KHIuZ2V0RGlzcGxheU1ldHJpY3MoKSk7CiAgICAgICAgICAgICB9CkBAIC04MDUsNiArODE4LDkgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW5mbGF0ZSB0aGlzIERyYXdhYmxlIGZyb20gYW4gWE1MIHJlc291cmNlLgorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluZmxhdGUoUmVzb3VyY2VzIHIsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMpCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCkBAIC04MTMsNiArODI5LDEyIEBACiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluZmxhdGUgYSBEcmF3YWJsZSBmcm9tIGFuIFhNTCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KICAgICB2b2lkIGluZmxhdGVXaXRoQXR0cmlidXRlcyhSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsCiAgICAgICAgICAgICBUeXBlZEFycmF5IGF0dHJzLCBpbnQgdmlzaWJsZUF0dHIpCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpAQCAtODIwLDEyICs4NDIsMjcgQEAKICAgICAgICAgbVZpc2libGUgPSBhdHRycy5nZXRCb29sZWFuKHZpc2libGVBdHRyLCBtVmlzaWJsZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyB1c2VkIGJ5IHtAbGluayBEcmF3YWJsZX1zIHRvIHN0b3JlIHNoYXJlZCBjb25zdGFudCBzdGF0ZSBhbmQgZGF0YQorICAgICAqIGJldHdlZW4gRHJhd2FibGVzLiB7QGxpbmsgQml0bWFwRHJhd2FibGV9cyBjcmVhdGVkIGZyb20gdGhlIHNhbWUgcmVzb3VyY2Ugd2lsbCBmb3IgaW5zdGFuY2UKKyAgICAgKiBzaGFyZSBhIHVuaXF1ZSBiaXRtYXAgc3RvcmVkIGluIHRoZWlyIENvbnN0YW50U3RhdGUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgI25ld0RyYXdhYmxlKFJlc291cmNlcyl9IGNhbiBiZSB1c2VkIGFzIGEgZmFjdG9yeSB0byBjcmVhdGUgbmV3IERyYXdhYmxlIGluc3RhbmNlcworICAgICAqIGZyb20gdGhpcyBDb25zdGFudFN0YXRlLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIFVzZSB7QGxpbmsgRHJhd2FibGUjZ2V0Q29uc3RhbnRTdGF0ZSgpfSB0byByZXRyaWV2ZSB0aGUgQ29uc3RhbnRTdGF0ZSBvZiBhIERyYXdhYmxlLiBDYWxsaW5nCisgICAgICoge0BsaW5rIERyYXdhYmxlI211dGF0ZSgpfSBvbiBhIERyYXdhYmxlIHNob3VsZCB0eXBpY2FsbHkgY3JlYXRlIGEgbmV3IENvbnN0YW50U3RhdGUgZm9yIHRoYXQKKyAgICAgKiBEcmF3YWJsZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbnN0YW50U3RhdGUgewogICAgICAgICAvKioKICAgICAgICAgICogQ3JlYXRlIGEgbmV3IGRyYXdhYmxlIHdpdGhvdXQgc3VwcGx5aW5nIHJlc291cmNlcyB0aGUgY2FsbGVyCiAgICAgICAgICAqIGlzIHJ1bm5pbmcgaW4uICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBtZWFucyB0aGUgZGVuc2l0eS1kZXBlbmRlbnQKICAgICAgICAgICogZHJhd2FibGVzIChsaWtlIGJpdG1hcHMpIHdpbGwgbm90IGJlIGFibGUgdG8gdXBkYXRlIHRoZWlyIHRhcmdldAotICAgICAgICAgKiBkZW5zaXR5IGNvcnJlY3RseS4KKyAgICAgICAgICogZGVuc2l0eSBjb3JyZWN0bHkuIE9uZSBzaG91bGQgdXNlIHtAbGluayAjbmV3RHJhd2FibGUoUmVzb3VyY2VzKX0KKyAgICAgICAgICogaW5zdGVhZCB0byBwcm92aWRlIGEgcmVzb3VyY2UuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRHJhd2FibGUgbmV3RHJhd2FibGUoKTsKICAgICAgICAgLyoqCkBAIC04NDQsNiArODgxLDEzIEBACiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIHtAbGluayBDb25zdGFudFN0YXRlfSBpbnN0YW5jZSB0aGF0IGhvbGRzIHRoZSBzaGFyZWQgc3RhdGUgb2YgdGhpcyBEcmF3YWJsZS4KKyAgICAgKnEKKyAgICAgKiBAcmV0dXJuIFRoZSBDb25zdGFudFN0YXRlIGFzc29jaWF0ZWQgdG8gdGhhdCBEcmF3YWJsZS4KKyAgICAgKiBAc2VlIENvbnN0YW50U3RhdGUKKyAgICAgKiBAc2VlIERyYXdhYmxlI211dGF0ZSgpCisgICAgICovCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YQppbmRleCBjNmY1N2Q0Li4xMjRkOTA3IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YQpAQCAtMTcsOCArMTcsMTYgQEAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuKjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIHRoYXQgY29udGFpbnMgc2V2ZXJhbCB7QGxpbmsgRHJhd2FibGV9cyBhbmQgc2VsZWN0cyB3aGljaCBvbmUgdG8gdXNlLgorICoKKyAqIFlvdSBjYW4gc3ViY2xhc3MgaXQgdG8gY3JlYXRlIHlvdXIgb3duIERyYXdhYmxlQ29udGFpbmVycyBvciBkaXJlY3RseSB1c2Ugb25lIGl0cyBjaGlsZCBjbGFzc2VzLgorICovCiBwdWJsaWMgY2xhc3MgRHJhd2FibGVDb250YWluZXIgZXh0ZW5kcyBEcmF3YWJsZSBpbXBsZW1lbnRzIERyYXdhYmxlLkNhbGxiYWNrIHsKIAogICAgIC8qKgpAQCAtMTk2LDggKzIwNCw3IEBACiAgICAgICAgICAgICAgICAgbURyYXdhYmxlQ29udGFpbmVyU3RhdGUuZ2V0T3BhY2l0eSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdERyYXdhYmxlKGludCBpZHgpCi0gICAgeworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdERyYXdhYmxlKGludCBpZHgpIHsKICAgICAgICAgaWYgKGlkeCA9PSBtQ3VySW5kZXgpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMjU1LDYgKzI2MiwxMiBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBIENvbnN0YW50U3RhdGUgdGhhdCBjYW4gY29udGFpbiBzZXZlcmFsIHtAbGluayBEcmF3YWJsZX1zLgorICAgICAqCisgICAgICogVGhpcyBjbGFzcyB3YXMgbWFkZSBwdWJsaWMgdG8gZW5hYmxlIHRlc3RpbmcsIGFuZCBpdHMgdmlzaWJpbGl0eSBtYXkgY2hhbmdlIGluIGEgZnV0dXJlCisgICAgICogcmVsZWFzZS4KKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIERyYXdhYmxlQ29udGFpbmVyU3RhdGUgZXh0ZW5kcyBDb25zdGFudFN0YXRlIHsKICAgICAgICAgZmluYWwgRHJhd2FibGVDb250YWluZXIgbU93bmVyOwogCkBAIC00NDMsMTIgKzQ1NiwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudE1pbmltdW1IZWlnaHQ7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpIHsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpIHsKICAgICAgICAgICAgIG1Db21wdXRlZENvbnN0YW50U2l6ZSA9IHRydWU7CiAKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gZ2V0Q2hpbGRDb3VudCgpOwogICAgICAgICAgICAgZmluYWwgRHJhd2FibGVbXSBkcmF3YWJsZXMgPSBtRHJhd2FibGVzOwotICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBtQ29uc3RhbnRIZWlnaHQgPSAwOworICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBtQ29uc3RhbnRIZWlnaHQgPSAtMTsKICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1XaWR0aCA9IG1Db25zdGFudE1pbmltdW1IZWlnaHQgPSAwOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkciA9IGRyYXdhYmxlc1tpXTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhCmluZGV4IDMzZWNiZWEuLjg4ZjZkNDMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YQpAQCAtMzEzLDE4ICszMTMsMTYgQEAKICAgICAgICAgICAgIGNhc2UgUkVDVEFOR0xFOgogICAgICAgICAgICAgICAgIGlmIChzdC5tUmFkaXVzQXJyYXkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtUGF0aC5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSb3VuZFJlY3QobVJlY3QsIHN0Lm1SYWRpdXNBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGguRGlyZWN0aW9uLkNXKTsKKyAgICAgICAgICAgICAgICAgICAgbVBhdGguYWRkUm91bmRSZWN0KG1SZWN0LCBzdC5tUmFkaXVzQXJyYXksIFBhdGguRGlyZWN0aW9uLkNXKTsKICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtRmlsbFBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVTdHJva2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVN0cm9rZVBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0Lm1SYWRpdXMgPiAwLjBmKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjYWxsZXIgaXMgb25seSBnaXZpbmcgdXMgMSB2YWx1ZSwgd2Ugd2lsbCBmb3JjZQogICAgICAgICAgICAgICAgICAgICAvLyBpdCB0byBiZSBzcXVhcmUgaWYgdGhlIHJlY3QgaXMgdG9vIHNtYWxsIGluIG9uZSBkaW1lbnNpb24KICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2hvdyBpdC4gSWYgd2UgZGlkIG5vdGhpbmcsIFNraWEgd291bGQgY2xhbXAgdGhlIHJhZAotICAgICAgICAgICAgICAgICAgICAvLyBpbmRlcGVuZGVudGx5IGFsb25nIGVhY2ggYXhpcywgZ2l2aW5nIHVzIGEgdGhpbiBlbGxpcHMKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXBlbmRlbnRseSBhbG9uZyBlYWNoIGF4aXMsIGdpdmluZyB1cyBhIHRoaW4gZWxsaXBzZQogICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVjdCB3ZXJlIHZlcnkgd2lkZSBidXQgbm90IHZlcnkgdGFsbAogICAgICAgICAgICAgICAgICAgICBmbG9hdCByYWQgPSBzdC5tUmFkaXVzOwogICAgICAgICAgICAgICAgICAgICBmbG9hdCByID0gTWF0aC5taW4obVJlY3Qud2lkdGgoKSwgbVJlY3QuaGVpZ2h0KCkpICogMC41ZjsKQEAgLTMzNSw2ICszMzMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVTdHJva2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Um91bmRSZWN0KG1SZWN0LCByYWQsIHJhZCwgbVN0cm9rZVBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUmVjdCwgbUZpbGxQYWludCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlU3Ryb2tlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVJlY3QsIG1TdHJva2VQYWludCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE9WQUw6CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQppbmRleCA4MDQ3ZGQ0Li41MDFjY2E5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKQEAgLTI2Niw2ICsyNjYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHNldERyYXdhYmxlQnlMYXllcklkKGludCBpZCwgRHJhd2FibGUgZHJhd2FibGUpIHsKICAgICAgICAgZmluYWwgQ2hpbGREcmF3YWJsZVtdIGxheWVycyA9IG1MYXllclN0YXRlLm1DaGlsZHJlbjsKKyAgICAgICAgZHJhd2FibGUuc2V0Q2FsbGJhY2sodGhpcyk7CiAgICAgICAgIAogICAgICAgICBmb3IgKGludCBpID0gbUxheWVyU3RhdGUubU51bSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICBpZiAobGF5ZXJzW2ldLm1JZCA9PSBpZCkgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL01pcG1hcERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTWlwbWFwRHJhd2FibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWZkZWVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL01pcG1hcERyYXdhYmxlLmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGU7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgcmVzb3VyY2UgdGhhdCBtYW5hZ2VzIGEgbnVtYmVyIG9mIGFsdGVybmF0ZSBEcmF3YWJsZXMsIGFuZCB3aGljaCBhY3R1YWxseSBkcmF3cyB0aGUgb25lIHdoaWNoCisgKiBzaXplIG1hdGNoZXMgdGhlIG1vc3QgY2xvc2VseSB0aGUgZHJhd2luZyBib3VuZHMuIFByb3ZpZGluZyBzZXZlcmFsIHByZS1zY2FsZWQgdmVyc2lvbiBvZiB0aGUKKyAqIGRyYXdhYmxlIGhlbHBzIG1pbmltaXppbmcgdGhlIGFsaWFzaW5nIGFydGlmYWN0cyB0aGF0IGNhbiBiZSBpbnRyb2R1Y2VkIGJ5IHRoZSBzY2FsaW5nLgorICoKKyAqIDxwPgorICogVXNlIHtAbGluayAjYWRkRHJhd2FibGUoRHJhd2FibGUpfSB0byBkZWZpbmUgdGhlIGRpZmZlcmVudCBEcmF3YWJsZXMgdGhhdCB3aWxsIHJlcHJlc2VudCB0aGUKKyAqIG1pcG1hcCBsZXZlbHMgb2YgdGhpcyBNaXBtYXBEcmF3YWJsZS4gVGhlIG1pcG1hcCBEcmF3YWJsZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZCB3aGVuIHRoaXMKKyAqIE1pcG1hcERyYXdhYmxlIGlzIGRyYXduIGlzIHRoZSBvbmUgd2hpY2ggaGFzIHRoZSBzbWFsbGVzdCBpbnRyaW5zaWMgaGVpZ2h0IGdyZWF0ZXIgb3IgZXF1YWwgdGhhbgorICogdGhlIGJvdW5kcycgaGVpZ2h0LiBUaGlzIHNlbGVjdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGJlc3QgYXZhaWxhYmxlIG1pcG1hcCBsZXZlbCBpcyBzY2FsZWQgZG93biB0bworICogZHJhdyB0aGlzIE1pcG1hcERyYXdhYmxlLgorICogPC9wPgorICoKKyAqIElmIHRoZSBib3VuZHMnIGhlaWdodCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBtaXBtYXAsIHRoZSBsYXJnZXN0IG1pcG1hcCB3aWxsIGJlIHNjYWxlZCB1cC4KKyAqIE5vdGUgdGhhdCBEcmF3YWJsZXMgd2l0aG91dCBpbnRyaW5zaWMgaGVpZ2h0IChpLmUuIHdpdGggYSBuZWdhdGl2ZSB2YWx1ZSwgc3VjaCBhcyBDb2xvcikgd2lsbAorICogb25seSBiZSB1c2VkIGlmIG5vIG90aGVyIG1pcG1hcCBEcmF3YWJsZSBhcmUgcHJvdmlkZWQuIFRoZSBEcmF3YWJsZXMnIGludHJpbnNpYyBoZWlnaHRzIHNob3VsZAorICogbm90IGJlIGNoYW5nZWQgYWZ0ZXIgdGhlIERyYXdhYmxlIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgTWlwbWFwRHJhd2FibGUuCisgKgorICogPHA+CisgKiBUaGUgZGlmZmVyZW50IG1pcG1hcHMnIHBhcmFtZXRlcnMgKG9wYWNpdHksIHBhZGRpbmcsIGNvbG9yIGZpbHRlciwgZ3Jhdml0eS4uLikgc2hvdWxkIHR5cGljYWxseQorICogYmUgc2ltaWxhciB0byBlbnN1cmUgYSBjb250aW51b3VzIHZpc3VhbCBhcHBlYXJhbmNlIHdoZW4gdGhlIE1pcG1hcERyYXdhYmxlIGlzIHNjYWxlZC4gVGhlIGFzcGVjdAorICogcmF0aW8gb2YgdGhlIGRpZmZlcmVudCBtaXBtYXBzIHNob3VsZCBlc3BlY2lhbGx5IGJlIGVxdWFsLgorICogPC9wPgorICoKKyAqIEEgdHlwaWNhbCBleGFtcGxlIHVzZSBvZiBhIE1pcG1hcERyYXdhYmxlIHdvdWxkIGJlIGZvciBhbiBpbWFnZSB3aGljaCBpcyBpbnRlbmRlZCB0byBiZSBzY2FsZWQgYXQKKyAqIHZhcmlvdXMgc2l6ZXMsIGFuZCBmb3Igd2hpY2ggb25lIHdhbnRzIHRvIHByb3ZpZGUgcHJlLXNjYWxlZCB2ZXJzaW9ucyB0byBwcmVjaXNlbHkgY29udHJvbCBpdHMKKyAqIGFwcGVhcmFuY2UuCisgKgorICogPHA+CisgKiBUaGUgaW50cmluc2ljIHNpemUgb2YgYSBNaXBtYXBEcmF3YWJsZSBhcmUgaW5mZXJyZWQgZnJvbSB0aG9zZSBvZiB0aGUgbGFyZ2VzdCBtaXBtYXAgKGluIHRlcm1zIG9mCisgKiB7QGxpbmsgRHJhd2FibGUjZ2V0SW50cmluc2ljSGVpZ2h0KCl9KS4gT24gdGhlIG9wcG9zaXRlLCBpdHMgbWluaW11bQorICogc2l6ZSBpcyBkZWZpbmVkIGJ5IHRoZSBzbWFsbGVzdCBwcm92aWRlZCBtaXBtYXAuCisgKiA8L3A+CisKKyAqIEl0IGNhbiBiZSBkZWZpbmVkIGluIGFuIFhNTCBmaWxlIHdpdGggdGhlIDxjb2RlPiZsdDttaXBtYXA+PC9jb2RlPiBlbGVtZW50LgorICogRWFjaCBtaXBtYXAgRHJhd2FibGUgaXMgZGVmaW5lZCBpbiBhIG5lc3RlZCA8Y29kZT4mbHQ7aXRlbT48L2NvZGU+LiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiAmbHQ7bWlwbWFwIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgKiAgJmx0O2l0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL215X2ltYWdlXzgiIC8+CisgKiAgJmx0O2l0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL215X2ltYWdlXzMyIiAvPgorICogICZsdDtpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9teV9pbWFnZV8xMjgiIC8+CisgKiAmbHQ7L21pcG1hcD4KKyAqPC9wcmU+CisgKiA8cD4KKyAqIFdpdGggdGhpcyBYTUwgc2F2ZWQgaW50byB0aGUgcmVzL2RyYXdhYmxlLyBmb2xkZXIgb2YgdGhlIHByb2plY3QsIGl0IGNhbiBiZSByZWZlcmVuY2VkIGFzCisgKiB0aGUgZHJhd2FibGUgZm9yIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9LiBBc3N1bWluZyB0aGF0IHRoZSBoZWlnaHRzIG9mIHRoZSBwcm92aWRlZAorICogZHJhd2FibGVzIGFyZSByZXNwZWN0aXZlbHkgOCwgMzIgYW5kIDEyOCBwaXhlbHMsIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSBzY2FsZWQgZG93biB3aGVuIHRoZQorICogYm91bmRzJyBoZWlnaHQgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiA4IHBpeGVscy4gVGhlIHNlY29uZCBkcmF3YWJsZSB3aWxsIHRoZW4gYmUgdXNlZCB1cCB0byBhCisgKiBoZWlnaHQgb2YgMzIgcGl4ZWxzIGFuZCB0aGUgbGFyZ2VzdCBkcmF3YWJsZSB3aWxsIGJlIHVzZWQgZm9yIGdyZWF0ZXIgaGVpZ2h0cy4KKyAqIDwvcD4KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI01pcG1hcERyYXdhYmxlSXRlbV9kcmF3YWJsZQorICovCitwdWJsaWMgY2xhc3MgTWlwbWFwRHJhd2FibGUgZXh0ZW5kcyBEcmF3YWJsZUNvbnRhaW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBNaXBtYXBDb250YWluZXJTdGF0ZSBtTWlwbWFwQ29udGFpbmVyU3RhdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1NdXRhdGVkOworCisgICAgcHVibGljIE1pcG1hcERyYXdhYmxlKCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBEcmF3YWJsZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbWlwbWFwIERyYXdhYmxlcy4gVGhlIERyYXdhYmxlIGFjdHVhbGx5IHVzZWQgd2hlbgorICAgICAqIHRoaXMgTWlwbWFwRHJhd2FibGUgaXMgZHJhd24gaXMgZGV0ZXJtaW5lZCBmcm9tIGl0cyBib3VuZHMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIGRyYXdhYmxlIGlzIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJhd2FibGUgVGhlIERyYXdhYmxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBsaXN0IG9mIGF2YWlsYWJsZSBtaXBtYXAgRHJhd2FibGVzLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgYWRkRHJhd2FibGUoRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NaXBtYXBDb250YWluZXJTdGF0ZS5hZGREcmF3YWJsZShkcmF3YWJsZSk7CisgICAgICAgICAgICBvbkRyYXdhYmxlQWRkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkRyYXdhYmxlQWRkZWQoKSB7CisgICAgICAgIC8vIHNlbGVjdERyYXdhYmxlIGFzc3VtZXMgdGhhdCB0aGUgY29udGFpbmVyIGNvbnRlbnQgZG9lcyBub3QgY2hhbmdlLgorICAgICAgICAvLyBXaGVuIGEgRHJhd2FibGUgaXMgYWRkZWQsIHRoZSBzYW1lIGluZGV4IGNhbiBjb3JyZXNwb25kIHRvIGEgbmV3IERyYXdhYmxlLCBhbmQgc2luY2UKKyAgICAgICAgLy8gc2VsZWN0RHJhd2FibGUgaGFzIGEgZmFzdCBleGl0IGNhc2Ugd2hlbiBvbGRJbmRleD09bmV3SW5kZXgsIHRoZSBuZXcgZHJhd2FibGUgY291bGQgZW5kCisgICAgICAgIC8vIHVwIG5vdCBiZWluZyB1c2VkIGluIHBsYWNlIG9mIHRoZSBwcmV2aW91cyBvbmUgaWYgdGhleSBoYXBwZW4gdG8gc2hhcmUgdGhlIHNhbWUgaW5kZXguCisgICAgICAgIC8vIFRoaXMgbWFrZSBzdXJlIHRoZSBuZXcgY29tcHV0ZWQgaW5kZXggY2FuIGFjdHVhbGx5IHJlcGxhY2UgdGhlIHByZXZpb3VzIG9uZS4KKyAgICAgICAgc2VsZWN0RHJhd2FibGUoLTEpOworICAgICAgICBvbkJvdW5kc0NoYW5nZShnZXRCb3VuZHMoKSk7CisgICAgfQorCisgICAgLy8gb3ZlcnJpZGVzIGZyb20gRHJhd2FibGUKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQm91bmRzQ2hhbmdlKFJlY3QgYm91bmRzKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG1NaXBtYXBDb250YWluZXJTdGF0ZS5pbmRleEZvckJvdW5kcyhib3VuZHMpOworCisgICAgICAgIC8vIFdpbGwgY2FsbCBpbnZhbGlkYXRlU2VsZigpIGlmIG5lZWRlZAorICAgICAgICBzZWxlY3REcmF3YWJsZShpbmRleCk7CisKKyAgICAgICAgc3VwZXIub25Cb3VuZHNDaGFuZ2UoYm91bmRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbmZsYXRlKFJlc291cmNlcyByLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzKQorICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuaW5mbGF0ZShyLCBwYXJzZXIsIGF0dHJzKTsKKworICAgICAgICBpbnQgdHlwZTsKKworICAgICAgICBmaW5hbCBpbnQgaW5uZXJEZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpICsgMTsKKyAgICAgICAgaW50IGRlcHRoOworICAgICAgICB3aGlsZSAoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICYmICgoZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKSkgPj0gaW5uZXJEZXB0aAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpKSB7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVwdGggPiBpbm5lckRlcHRoIHx8ICFwYXJzZXIuZ2V0TmFtZSgpLmVxdWFscygiaXRlbSIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHIub2J0YWluQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWlwbWFwRHJhd2FibGVJdGVtKTsKKworICAgICAgICAgICAgaW50IGRyYXdhYmxlUmVzID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NaXBtYXBEcmF3YWJsZUl0ZW1fZHJhd2FibGUsIDApOworCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgRHJhd2FibGUgZHI7CisgICAgICAgICAgICBpZiAoZHJhd2FibGVSZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIGRyID0gci5nZXREcmF3YWJsZShkcmF3YWJsZVJlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlICgodHlwZSA9IHBhcnNlci5uZXh0KCkpID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiA8aXRlbT4gdGFnIHJlcXVpcmVzIGEgJ2RyYXdhYmxlJyBhdHRyaWJ1dGUgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNoaWxkIHRhZyBkZWZpbmluZyBhIGRyYXdhYmxlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRyID0gRHJhd2FibGUuY3JlYXRlRnJvbVhtbElubmVyKHIsIHBhcnNlciwgYXR0cnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUuYWRkRHJhd2FibGUoZHIpOworICAgICAgICB9CisKKyAgICAgICAgb25EcmF3YWJsZUFkZGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERyYXdhYmxlIG11dGF0ZSgpIHsKKyAgICAgICAgaWYgKCFtTXV0YXRlZCAmJiBzdXBlci5tdXRhdGUoKSA9PSB0aGlzKSB7CisgICAgICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUubU1pcG1hcEhlaWdodHMgPSBtTWlwbWFwQ29udGFpbmVyU3RhdGUubU1pcG1hcEhlaWdodHMuY2xvbmUoKTsKKyAgICAgICAgICAgIG1NdXRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBNaXBtYXBDb250YWluZXJTdGF0ZSBleHRlbmRzIERyYXdhYmxlQ29udGFpbmVyU3RhdGUgeworICAgICAgICBwcml2YXRlIGludFtdIG1NaXBtYXBIZWlnaHRzOworCisgICAgICAgIE1pcG1hcENvbnRhaW5lclN0YXRlKE1pcG1hcENvbnRhaW5lclN0YXRlIG9yaWcsIE1pcG1hcERyYXdhYmxlIG93bmVyLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgICAgICBzdXBlcihvcmlnLCBvd25lciwgcmVzKTsKKworICAgICAgICAgICAgaWYgKG9yaWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzID0gb3JpZy5tTWlwbWFwSGVpZ2h0czsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHMgPSBuZXcgaW50W2dldENoaWxkcmVuKCkubGVuZ3RoXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICBzZXRDb25zdGFudFNpemUodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIG1pcG1hcCBkcmF3YWJsZSB0aGF0IHdpbGwgYmVzdCBmaXQgdGhlIHByb3ZpZGVkIGJvdW5kcy4KKyAgICAgICAgICogVGhpcyBpbmRleCBpcyBkZXRlcm1pbmVkIGJ5IGNvbXBhcmluZyBib3VuZHMnIGhlaWdodCBhbmQgY2hpbGRyZW4gaW50cmluc2ljIGhlaWdodHMuCisgICAgICAgICAqIFRoZSByZXR1cm5lZCBtaXBtYXAgaW5kZXggaXMgdGhlIHNtYWxsZXN0IG1pcG1hcCB3aGljaCBoZWlnaHQgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuCisgICAgICAgICAqIHRoZSBib3VuZHMnIGhlaWdodC4gSWYgdGhlIGJvdW5kcycgaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IG1pcG1hcCwgdGhlIGxhcmdlc3QKKyAgICAgICAgICogbWlwbWFwIGluZGV4IGlzIHJldHVybmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYm91bmRzIFRoZSBib3VuZHMgb2YgdGhlIE1pcE1hcERyYXdhYmxlLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgRHJhd2FibGUgdGhhdCB3aWxsIGJlc3QgZml0IHRoZXNlIGJvdW5kcywgb3IgLTEgaWYgdGhlcmUKKyAgICAgICAgICogYXJlIG5vIGNoaWxkcmVuIG1pcG1hcHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGluZGV4Rm9yQm91bmRzKFJlY3QgYm91bmRzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYm91bmRzSGVpZ2h0ID0gYm91bmRzLmhlaWdodCgpOworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChib3VuZHNIZWlnaHQgPD0gbU1pcG1hcEhlaWdodHNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBObyBtaXBtYXAgbGFyZ2VyIHRoYW4gYm91bmRzIGZvdW5kLiBVc2UgbGFyZ2VzdCBvbmUgd2hpY2ggd2lsbCBiZSBzY2FsZWQgdXAuCisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTiAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBObyBEcmF3YWJsZSBtaXBtYXAgYXQgYWxsCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIERyYXdhYmxlIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtaXBtYXAgRHJhd2FibGVzLiBUaGlzIGxpc3QgY2FuIGJlIHJldHJpZXZlZAorICAgICAgICAgKiB1c2luZyB7QGxpbmsgRHJhd2FibGVDb250YWluZXIuRHJhd2FibGVDb250YWluZXJTdGF0ZSNnZXRDaGlsZHJlbigpfSBhbmQgdGhpcyBtZXRob2QKKyAgICAgICAgICogZW5zdXJlcyB0aGF0IGl0IGlzIGFsd2F5cyBzb3J0ZWQgYnkgaW5jcmVhc2luZyB7QGxpbmsgRHJhd2FibGUjZ2V0SW50cmluc2ljSGVpZ2h0KCl9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZHJhd2FibGUgVGhlIERyYXdhYmxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBjaGlsZHJlbiBsaXN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGREcmF3YWJsZShEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IGRyYXdhYmxlIGluIGxhc3QgcG9zaXRpb24sIGNvcnJlY3RseSByZXNldHRpbmcgY2FjaGVkIHZhbHVlcyBhbmQKKyAgICAgICAgICAgIC8vIGVzcGVjaWFsbHkgbUNvbXB1dGVkQ29uc3RhbnRTaXplCisgICAgICAgICAgICBpbnQgcG9zID0gYWRkQ2hpbGQoZHJhd2FibGUpOworCisgICAgICAgICAgICAvLyBCdWJibGUgc29ydCB0aGUgbGFzdCBkcmF3YWJsZSB0byByZXN0b3JlIHRoZSBzb3J0IGJ5IGludHJpbnNpYyBoZWlnaHQKKyAgICAgICAgICAgIGZpbmFsIGludCBkcmF3YWJsZUhlaWdodCA9IGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworCisgICAgICAgICAgICB3aGlsZSAocG9zID4gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIHByZXZpb3VzRHJhd2FibGUgPSBtRHJhd2FibGVzW3Bvcy0xXTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHJldmlvdXNJbnRyaW5zaWNIZWlnaHQgPSBwcmV2aW91c0RyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworCisgICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlSGVpZ2h0IDwgcHJldmlvdXNJbnRyaW5zaWNIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlc1twb3NdID0gcHJldmlvdXNEcmF3YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHNbcG9zXSA9IHByZXZpb3VzSW50cmluc2ljSGVpZ2h0OworCisgICAgICAgICAgICAgICAgICAgIG1EcmF3YWJsZXNbcG9zLTFdID0gZHJhd2FibGU7CisgICAgICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzW3Bvcy0xXSA9IGRyYXdhYmxlSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW50cmluc2ljIHNpemVzIGFyZSB0aG9zZSBvZiB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgbWlwbWFwLgorICAgICAgICAgKiBNaW5pbXVtIHNpemVzIGFyZSB0aG9zZSBvZiB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIG1pcG1hcC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgeworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBzbWFsbGVzdERyYXdhYmxlID0gbURyYXdhYmxlc1swXTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtV2lkdGggPSBzbWFsbGVzdERyYXdhYmxlLmdldE1pbmltdW1XaWR0aCgpOworICAgICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1IZWlnaHQgPSBzbWFsbGVzdERyYXdhYmxlLmdldE1pbmltdW1IZWlnaHQoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGxhcmdlc3REcmF3YWJsZSA9IG1EcmF3YWJsZXNbTi0xXTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IGxhcmdlc3REcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpOworICAgICAgICAgICAgICAgIG1Db25zdGFudEhlaWdodCA9IGxhcmdlc3REcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBtQ29uc3RhbnRIZWlnaHQgPSAtMTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtV2lkdGggPSBtQ29uc3RhbnRNaW5pbXVtSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db21wdXRlZENvbnN0YW50U2l6ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIG5ld0RyYXdhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNaXBtYXBEcmF3YWJsZSh0aGlzLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRHJhd2FibGUgbmV3RHJhd2FibGUoUmVzb3VyY2VzIHJlcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNaXBtYXBEcmF3YWJsZSh0aGlzLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGdyb3dBcnJheShpbnQgb2xkU2l6ZSwgaW50IG5ld1NpemUpIHsKKyAgICAgICAgICAgIHN1cGVyLmdyb3dBcnJheShvbGRTaXplLCBuZXdTaXplKTsKKyAgICAgICAgICAgIGludFtdIG5ld0ludHMgPSBuZXcgaW50W25ld1NpemVdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWlwbWFwSGVpZ2h0cywgMCwgbmV3SW50cywgMCwgb2xkU2l6ZSk7CisgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0cyA9IG5ld0ludHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1pcG1hcERyYXdhYmxlKE1pcG1hcENvbnRhaW5lclN0YXRlIHN0YXRlLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIE1pcG1hcENvbnRhaW5lclN0YXRlIGFzID0gbmV3IE1pcG1hcENvbnRhaW5lclN0YXRlKHN0YXRlLCB0aGlzLCByZXMpOworICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUgPSBhczsKKyAgICAgICAgc2V0Q29uc3RhbnRTdGF0ZShhcyk7CisgICAgICAgIG9uRHJhd2FibGVBZGRlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9OaW5lUGF0Y2hEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKaW5kZXggMDA0MTZkOC4uMjNlZmNkMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKQEAgLTE3NywxNiArMTc3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvLyBvdmVycmlkZXMKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIGZsb2F0W10gcHRzID0gbmV3IGZsb2F0WzJdOwotICAgICAgICAgICAgY2FudmFzLmdldE1hdHJpeCgpLm1hcFBvaW50cyhwdHMpOwotICAgICAgICAgICAgTG9nLnYoIjlwYXRjaCIsICJEcmF3aW5nIDktcGF0Y2ggQCAiICsgcHRzWzBdICsgIiwiICsgcHRzWzFdICsgIjogIiArIGdldEJvdW5kcygpKTsKLSAgICAgICAgfQogICAgICAgICBtTmluZVBhdGNoLmRyYXcoY2FudmFzLCBnZXRCb3VuZHMoKSwgbVBhaW50KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvUm91bmRSZWN0U2hhcGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvUm91bmRSZWN0U2hhcGUuamF2YQppbmRleCBmNGNmMTVjLi5iNDY5ZDJhIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL1JvdW5kUmVjdFNoYXBlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9Sb3VuZFJlY3RTaGFwZS5qYXZhCkBAIC01NywxMyArNTcsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUm91bmRSZWN0U2hhcGUoZmxvYXRbXSBvdXRlclJhZGlpLCBSZWN0RiBpbnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSBpbm5lclJhZGlpKSB7Ci0gICAgICAgIGlmIChvdXRlclJhZGlpLmxlbmd0aCA8IDgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dGVyIHJhZGlpIG11c3QgaGF2ZSA+PSA4IHZhbHVlcyIpOworICAgICAgICBpZiAob3V0ZXJSYWRpaSAhPSBudWxsICYmIG91dGVyUmFkaWkubGVuZ3RoIDwgOCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigib3V0ZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlubmVyUmFkaWkgIT0gbnVsbCAmJiBpbm5lclJhZGlpLmxlbmd0aCA8IDgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlubmVyIHJhZGlpIG11c3QgaGF2ZSA+PSA4IHZhbHVlcyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiaW5uZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CiAgICAgICAgIH0KICAgICAgICAgbU91dGVyUmFkaWkgPSBvdXRlclJhZGlpOwogICAgICAgICBtSW5zZXQgPSBpbnNldDsKQEAgLTk3LDggKzk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucmlnaHQgLSBtSW5zZXQucmlnaHQsIHIuYm90dG9tIC0gbUluc2V0LmJvdHRvbSk7CiAgICAgICAgICAgICBpZiAobUlubmVyUmVjdC53aWR0aCgpIDwgdyAmJiBtSW5uZXJSZWN0LmhlaWdodCgpIDwgaCkgewogICAgICAgICAgICAgICAgIGlmIChtSW5uZXJSYWRpaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJvdW5kUmVjdChtSW5uZXJSZWN0LCBtSW5uZXJSYWRpaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGguRGlyZWN0aW9uLkNDVyk7CisgICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJvdW5kUmVjdChtSW5uZXJSZWN0LCBtSW5uZXJSYWRpaSwgUGF0aC5EaXJlY3Rpb24uQ0NXKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSZWN0KG1Jbm5lclJlY3QsIFBhdGguRGlyZWN0aW9uLkNDVyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA5LDggKzEwNiw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFJvdW5kUmVjdFNoYXBlIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKICAgICAgICAgUm91bmRSZWN0U2hhcGUgc2hhcGUgPSAoUm91bmRSZWN0U2hhcGUpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIHNoYXBlLm1PdXRlclJhZGlpID0gbU91dGVyUmFkaWkuY2xvbmUoKTsKLSAgICAgICAgc2hhcGUubUlubmVyUmFkaWkgPSBtSW5uZXJSYWRpaS5jbG9uZSgpOworICAgICAgICBzaGFwZS5tT3V0ZXJSYWRpaSA9IG1PdXRlclJhZGlpICE9IG51bGwgPyBtT3V0ZXJSYWRpaS5jbG9uZSgpIDogbnVsbDsKKyAgICAgICAgc2hhcGUubUlubmVyUmFkaWkgPSBtSW5uZXJSYWRpaSAhPSBudWxsID8gbUlubmVyUmFkaWkuY2xvbmUoKSA6IG51bGw7CiAgICAgICAgIHNoYXBlLm1JbnNldCA9IG5ldyBSZWN0RihtSW5zZXQpOwogICAgICAgICBzaGFwZS5tSW5uZXJSZWN0ID0gbmV3IFJlY3RGKG1Jbm5lclJlY3QpOwogICAgICAgICBzaGFwZS5tUGF0aCA9IG5ldyBQYXRoKG1QYXRoKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKaW5kZXggYjI3YzdmNS4uMmMwNzZiMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKQEAgLTM1LDExICszNSwyNSBAQAogICAgIEJpdG1hcCBtQml0bWFwOwogCiAgICAgQWxsb2NhdGlvbihpbnQgaWQsIFJlbmRlclNjcmlwdCBycywgVHlwZSB0KSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIG1UeXBlID0gdDsKICAgICB9CiAKKyAgICBBbGxvY2F0aW9uKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgbU5hbWUgPSBtUlMubkdldE5hbWUobUlEKTsKKyAgICAgICAgaW50IHR5cGVJRCA9IG1SUy5uQWxsb2NhdGlvbkdldFR5cGUobUlEKTsKKyAgICAgICAgaWYodHlwZUlEICE9IDApIHsKKyAgICAgICAgICAgIG1UeXBlID0gbmV3IFR5cGUodHlwZUlELCBtUlMpOworICAgICAgICAgICAgbVR5cGUudXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIG1UeXBlOwogICAgIH0KQEAgLTc2LDEwICs5MCw1MCBAQAogICAgICAgICBzdWJEYXRhMUQoMCwgbVR5cGUuZ2V0RWxlbWVudENvdW50KCksIGQpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHN1YkRhdGEoaW50IHhvZmYsIEZpZWxkUGFja2VyIGZwKSB7CisgICAgICAgIGludCBlU2l6ZSA9IG1UeXBlLm1FbGVtZW50LmdldFNpemVCeXRlcygpOworICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGZwLmdldERhdGEoKTsKKworICAgICAgICBpbnQgY291bnQgPSBkYXRhLmxlbmd0aCAvIGVTaXplOworICAgICAgICBpZiAoKGVTaXplICogY291bnQpICE9IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBwYWNrZXIgbGVuZ3RoICIgKyBkYXRhLmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbm90IGRpdmlzaWJsZSBieSBlbGVtZW50IHNpemUgIiArIGVTaXplICsgIi4iKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhMURDaGVja3MoeG9mZiwgY291bnQsIGRhdGEubGVuZ3RoLCBkYXRhLmxlbmd0aCk7CisgICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YkRhdGExRChtSUQsIHhvZmYsIGNvdW50LCBkYXRhLCBkYXRhLmxlbmd0aCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzdWJFbGVtZW50RGF0YShpbnQgeG9mZiwgaW50IGNvbXBvbmVudF9udW1iZXIsIEZpZWxkUGFja2VyIGZwKSB7CisgICAgICAgIGlmIChjb21wb25lbnRfbnVtYmVyID49IG1UeXBlLm1FbGVtZW50Lm1FbGVtZW50cy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbXBvbmVudF9udW1iZXIgIiArIGNvbXBvbmVudF9udW1iZXIgKyAiIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgfQorICAgICAgICBpZih4b2ZmIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2Zmc2V0IG11c3QgYmUgPj0gMC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gZnAuZ2V0RGF0YSgpOworICAgICAgICBpbnQgZVNpemUgPSBtVHlwZS5tRWxlbWVudC5tRWxlbWVudHNbY29tcG9uZW50X251bWJlcl0uZ2V0U2l6ZUJ5dGVzKCk7CisKKyAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9IGVTaXplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBwYWNrZXIgc2l6ZWxlbmd0aCAiICsgZGF0YS5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IG1hdGNoIGNvbXBvbmVudCBzaXplICIgKyBlU2l6ZSArICIuIik7CisgICAgICAgIH0KKworICAgICAgICBtUlMubkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKG1JRCwgeG9mZiwgY29tcG9uZW50X251bWJlciwgZGF0YSwgZGF0YS5sZW5ndGgpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBkYXRhMURDaGVja3MoaW50IG9mZiwgaW50IGNvdW50LCBpbnQgbGVuLCBpbnQgZGF0YVNpemUpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIGlmKChvZmYgPCAwKSB8fCAoY291bnQgPCAxKSB8fCAoKG9mZiArIGNvdW50KSA+IG1UeXBlLmdldEVsZW1lbnRDb3VudCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2Zmc2V0IG9yIENvdW50IG91dCBvZiBib3VuZHMuIik7CisgICAgICAgIGlmKG9mZiA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9mZnNldCBtdXN0IGJlID49IDAuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoY291bnQgPCAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb3VudCBtdXN0IGJlID49IDEuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoKG9mZiArIGNvdW50KSA+IG1UeXBlLmdldEVsZW1lbnRDb3VudCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPdmVyZmxvdywgQXZhaWxhYmxlIGNvdW50ICIgKyBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGdvdCAiICsgY291bnQgKyAiIGF0IG9mZnNldCAiICsgb2ZmICsgIi4iKTsKICAgICAgICAgfQogICAgICAgICBpZigobGVuKSA8IGRhdGFTaXplKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSB0b28gc21hbGwgZm9yIGFsbG9jYXRpb24gdHlwZS4iKTsKQEAgLTEwOCw3ICsxNjIsNiBAQAogICAgIH0KIAogCi0KICAgICBwdWJsaWMgdm9pZCBzdWJEYXRhMkQoaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CiAgICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YkRhdGEyRChtSUQsIHhvZmYsIHlvZmYsIHcsIGgsIGQsIGQubGVuZ3RoICogNCk7CkBAIC0xMjksMjUgKzE4MiwyOCBAQAogICAgICAgICBtUlMubkFsbG9jYXRpb25SZWFkKG1JRCwgZCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgZGF0YShPYmplY3QgbykgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QobUlELCBtVHlwZSwgMCwgbyk7CisgICAgcHVibGljIHZvaWQgcmVzaXplKGludCBkaW1YKSB7CisgICAgICAgIGlmICgobVR5cGUuZ2V0WSgpID4gMCl8fCAobVR5cGUuZ2V0WigpID4gMCkgfHwgbVR5cGUuZ2V0RmFjZXMoKSB8fCBtVHlwZS5nZXRMT0QoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVzaXplIG9ubHkgc3VwcG9ydCBmb3IgMUQgYWxsb2NhdGlvbnMgYXQgdGhpcyB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIG1SUy5uQWxsb2NhdGlvblJlc2l6ZTFEKG1JRCwgZGltWCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcmVhZChPYmplY3QgbykgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViUmVhZEZyb21PYmplY3QobUlELCBtVHlwZSwgMCwgbyk7CisgICAgLyoKKyAgICBwdWJsaWMgdm9pZCByZXNpemUoaW50IGRpbVgsIGludCBkaW1ZKSB7CisgICAgICAgIGlmICgobVR5cGUuZ2V0WigpID4gMCkgfHwgbVR5cGUuZ2V0RmFjZXMoKSB8fCBtVHlwZS5nZXRMT0QoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVzaXplIG9ubHkgc3VwcG9ydCBmb3IgMkQgYWxsb2NhdGlvbnMgYXQgdGhpcyB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtVHlwZS5nZXRZKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVzaXplIG9ubHkgc3VwcG9ydCBmb3IgMkQgYWxsb2NhdGlvbnMgYXQgdGhpcyB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIG1SUy5uQWxsb2NhdGlvblJlc2l6ZTJEKG1JRCwgZGltWCwgZGltWSk7CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgc3ViRGF0YShpbnQgb2Zmc2V0LCBPYmplY3QgbykgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QobUlELCBtVHlwZSwgb2Zmc2V0LCBvKTsKLSAgICB9CisgICAgKi8KIAogICAgIHB1YmxpYyBjbGFzcyBBZGFwdGVyMUQgZXh0ZW5kcyBCYXNlT2JqIHsKICAgICAgICAgQWRhcHRlcjFEKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50KERpbWVuc2lvbiBkaW0sIGludCB2YWx1ZSkgewpAQCAtMTg5LDggKzI0NSw3IEBACiAKICAgICBwdWJsaWMgY2xhc3MgQWRhcHRlcjJEIGV4dGVuZHMgQmFzZU9iaiB7CiAgICAgICAgIEFkYXB0ZXIyRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgc3VwZXIocnMpOwotICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludChEaW1lbnNpb24gZGltLCBpbnQgdmFsdWUpIHsKQEAgLTM3Nyw2ICs0MzIsMjEgQEAKICAgICAgICAgQml0bWFwIGIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgaWQsIG1CaXRtYXBPcHRpb25zKTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21CaXRtYXBCb3hlZChycywgYiwgZHN0Rm10LCBnZW5NaXBzKTsKICAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlRnJvbVN0cmluZyhSZW5kZXJTY3JpcHQgcnMsIFN0cmluZyBzdHIpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBieXRlW10gYWxsb2NBcnJheSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbGxvY0FycmF5ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIEVsZW1lbnQuVTgocnMpLCBhbGxvY0FycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBhbGxvYy5kYXRhKGFsbG9jQXJyYXkpOworICAgICAgICAgICAgcmV0dXJuIGFsbG9jOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byB1dGYtOCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Jhc2VPYmouamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCmluZGV4IDAwMmZjNzguLjcxNWUzZmIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCkBAIC0yNCwxNCArMjQsMTcgQEAKICAqKi8KIGNsYXNzIEJhc2VPYmogewogCi0gICAgQmFzZU9iaihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICBCYXNlT2JqKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgIHJzLnZhbGlkYXRlKCk7CiAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICBtSUQgPSAwOworICAgICAgICBtSUQgPSBpZDsKICAgICAgICAgbURlc3Ryb3llZCA9IGZhbHNlOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0SUQoKSB7CisgICAgICAgIGlmIChtRGVzdHJveWVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1c2luZyBhIGRlc3Ryb3llZCBvYmplY3QuIik7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1JRDsKICAgICB9CiAKQEAgLTYyLDcgKzY1LDcgQEAKICAgICB7CiAgICAgICAgIGlmICghbURlc3Ryb3llZCkgewogICAgICAgICAgICAgaWYobUlEICE9IDAgJiYgbVJTLmlzQWxpdmUoKSkgewotICAgICAgICAgICAgICAgIG1SUy5uT2JqRGVzdHJveU9PQihtSUQpOworICAgICAgICAgICAgICAgIG1SUy5uT2JqRGVzdHJveShtSUQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVJTID0gbnVsbDsKICAgICAgICAgICAgIG1JRCA9IDA7CkBAIC04MSw1ICs4NCwxMCBAQAogICAgICAgICBtUlMubk9iakRlc3Ryb3kobUlEKTsKICAgICB9CiAKKyAgICAvLyBJZiBhbiBvYmplY3QgY2FtZSBmcm9tIGFuIGEzZCBmaWxlLCBqYXZhIGZpZWxkcyBuZWVkIHRvIGJlCisgICAgLy8gY3JlYXRlZCB3aXRoIG9iamVjdHMgZnJvbSB0aGUgbmF0aXZlIGxheWVyCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgIH0KKwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjZjg4YwotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCeXRlMiB7CisgICAgcHVibGljIEJ5dGUyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHg7CisgICAgcHVibGljIGJ5dGUgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzBjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgQnl0ZTMgeworICAgIHB1YmxpYyBCeXRlMygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSB4OworICAgIHB1YmxpYyBieXRlIHk7CisgICAgcHVibGljIGJ5dGUgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlNC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YmZjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgQnl0ZTQgeworICAgIHB1YmxpYyBCeXRlNCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSB4OworICAgIHB1YmxpYyBieXRlIHk7CisgICAgcHVibGljIGJ5dGUgejsKKyAgICBwdWJsaWMgYnl0ZSB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9FbGVtZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQppbmRleCAxMGVmMDVhLi45MTgyNGU2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgogICogQGhpZGUKQEAgLTI2LDYgKzI3LDcgQEAKICAgICBpbnQgbVNpemU7CiAgICAgRWxlbWVudFtdIG1FbGVtZW50czsKICAgICBTdHJpbmdbXSBtRWxlbWVudE5hbWVzOworICAgIGludFtdIG1BcnJheVNpemVzOwogCiAgICAgRGF0YVR5cGUgbVR5cGU7CiAgICAgRGF0YUtpbmQgbUtpbmQ7CkBAIC0zNywzMCArMzksMzYgQEAKICAgICBwdWJsaWMgZW51bSBEYXRhVHlwZSB7CiAgICAgICAgIC8vRkxPQVRfMTYgKDEsIDIpLAogICAgICAgICBGTE9BVF8zMiAoMiwgNCksCi0gICAgICAgIC8vRkxPQVRfNjQgKDMsIDgpLAorICAgICAgICBGTE9BVF82NCAoMywgOCksCiAgICAgICAgIFNJR05FRF84ICg0LCAxKSwKICAgICAgICAgU0lHTkVEXzE2ICg1LCAyKSwKICAgICAgICAgU0lHTkVEXzMyICg2LCA0KSwKLSAgICAgICAgLy9TSUdORURfNjQgKDcsIDgpLAorICAgICAgICBTSUdORURfNjQgKDcsIDgpLAogICAgICAgICBVTlNJR05FRF84ICg4LCAxKSwKICAgICAgICAgVU5TSUdORURfMTYgKDksIDIpLAogICAgICAgICBVTlNJR05FRF8zMiAoMTAsIDQpLAogICAgICAgICAvL1VOU0lHTkVEXzY0ICgxMSwgOCksCiAKLSAgICAgICAgVU5TSUdORURfNV82XzUgKDEyLCAyKSwKLSAgICAgICAgVU5TSUdORURfNV81XzVfMSAoMTMsIDIpLAotICAgICAgICBVTlNJR05FRF80XzRfNF80ICgxNCwgMiksCisgICAgICAgIEJPT0xFQU4oMTIsIDEpLAogCi0gICAgICAgIFJTX0VMRU1FTlQgKDE1LCA0KSwKLSAgICAgICAgUlNfVFlQRSAoMTYsIDQpLAotICAgICAgICBSU19BTExPQ0FUSU9OICgxNywgNCksCi0gICAgICAgIFJTX1NBTVBMRVIgKDE4LCA0KSwKLSAgICAgICAgUlNfU0NSSVBUICgxOSwgNCksCi0gICAgICAgIFJTX01FU0ggKDIwLCA0KSwKLSAgICAgICAgUlNfUFJPR1JBTV9GUkFHTUVOVCAoMjEsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1ZFUlRFWCAoMjIsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1JBU1RFUiAoMjMsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1NUT1JFICgyNCwgNCk7CisgICAgICAgIFVOU0lHTkVEXzVfNl81ICgxMywgMiksCisgICAgICAgIFVOU0lHTkVEXzVfNV81XzEgKDE0LCAyKSwKKyAgICAgICAgVU5TSUdORURfNF80XzRfNCAoMTUsIDIpLAorCisgICAgICAgIE1BVFJJWF80WDQgKDE2LCA2NCksCisgICAgICAgIE1BVFJJWF8zWDMgKDE3LCAzNiksCisgICAgICAgIE1BVFJJWF8yWDIgKDE4LCAxNiksCisKKyAgICAgICAgUlNfRUxFTUVOVCAoMTAwMCwgNCksCisgICAgICAgIFJTX1RZUEUgKDEwMDEsIDQpLAorICAgICAgICBSU19BTExPQ0FUSU9OICgxMDAyLCA0KSwKKyAgICAgICAgUlNfU0FNUExFUiAoMTAwMywgNCksCisgICAgICAgIFJTX1NDUklQVCAoMTAwNCwgNCksCisgICAgICAgIFJTX01FU0ggKDEwMDUsIDQpLAorICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgxMDA2LCA0KSwKKyAgICAgICAgUlNfUFJPR1JBTV9WRVJURVggKDEwMDcsIDQpLAorICAgICAgICBSU19QUk9HUkFNX1JBU1RFUiAoMTAwOCwgNCksCisgICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDEwMDksIDQpOwogCiAgICAgICAgIGludCBtSUQ7CiAgICAgICAgIGludCBtU2l6ZTsKQEAgLTcyLDEyICs4MCw2IEBACiAKICAgICBwdWJsaWMgZW51bSBEYXRhS2luZCB7CiAgICAgICAgIFVTRVIgKDApLAotICAgICAgICBDT0xPUiAoMSksCi0gICAgICAgIFBPU0lUSU9OICgyKSwKLSAgICAgICAgVEVYVFVSRSAoMyksCi0gICAgICAgIE5PUk1BTCAoNCksCi0gICAgICAgIElOREVYICg1KSwKLSAgICAgICAgUE9JTlRfU0laRSg2KSwKIAogICAgICAgICBQSVhFTF9MICg3KSwKICAgICAgICAgUElYRUxfQSAoOCksCkBAIC05MSw0MSArOTMsMTQ3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9VOChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9VOCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX1U4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfOCk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEJPT0xFQU4oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0JPT0xFQU4gPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfQk9PTEVBTiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkJPT0xFQU4pOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX1U4OworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQk9PTEVBTjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9JOChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9JOCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0k4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzgpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVOChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9JODsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1U4OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVU0VSX1UzMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9VMzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9VMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF8zMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEk4KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JOCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF84KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9VMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JODsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9JMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfSTMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfSTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzMyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTE2KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VMTYgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTE2ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMTYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX0kzMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1UxNjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9GMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfRjMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfRjMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuRkxPQVRfMzIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJMTYoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0kxNiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JMTYgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMTYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX0YzMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0kxNjsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTMyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VMzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEkzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfSTMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0kzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0kzMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgSTY0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JNjQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTY0ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzY0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSTY0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0YzMiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5GTE9BVF8zMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0YzMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjY0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GNjQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRjY0ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuRkxPQVRfNjQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GNjQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEVMRU1FTlQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0VMRU1FTlQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRUxFTUVOVCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX0VMRU1FTlQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9FTEVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBUWVBFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9UWVBFID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1RZUEUgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19UWVBFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVFlQRTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQUxMT0NBVElPTihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfQUxMT0NBVElPTiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9BTExPQ0FUSU9OID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfQUxMT0NBVElPTik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0FMTE9DQVRJT047CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFNBTVBMRVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1NBTVBMRVIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfU0FNUExFUiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1NBTVBMRVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9TQU1QTEVSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBTQ1JJUFQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1NDUklQVCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9TQ1JJUFQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19TQ1JJUFQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9TQ1JJUFQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IE1FU0goUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X01FU0ggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfTUVTSCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX01FU0gpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NRVNIOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBQUk9HUkFNX0ZSQUdNRU5UKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX0ZSQUdNRU5UID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19QUk9HUkFNX0ZSQUdNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9WRVJURVgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fVkVSVEVYID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fVkVSVEVYID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9WRVJURVgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9SQVNURVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fUkFTVEVSID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fUkFTVEVSID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9SQVNURVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9TVE9SRShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9TVE9SRSA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1NUT1JFID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9TVE9SRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fU1RPUkU7CisgICAgfQorCisKICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQV84KFJlbmRlclNjcmlwdCBycykgewogICAgICAgICBpZihycy5tRWxlbWVudF9BXzggPT0gbnVsbCkgewogICAgICAgICAgICAgcnMubUVsZW1lbnRfQV84ID0gY3JlYXRlUGl4ZWwocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIERhdGFLaW5kLlBJWEVMX0EpOwpAQCAtMTY4LDE2OCArMjc2LDE0MSBAQAogICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUkdCQV84ODg4OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJTkRFWF8xNihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfSU5ERVhfMTYgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfSU5ERVhfMTYgPSBjcmVhdGVJbmRleChycyk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl8yKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF8yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzIgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCAyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSU5ERVhfMTY7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF8yOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfUE9TSVRJT05fMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfUE9TSVRJT05fMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9QT1NJVElPTl8yID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuUE9TSVRJT04sIDIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzJfMyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRkxPQVRfMyA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GTE9BVF8zID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgMyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BPU0lUSU9OXzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF8zOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfUE9TSVRJT05fMyhSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfUE9TSVRJT05fMyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9QT1NJVElPTl8zID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuUE9TSVRJT04sIDMpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzJfNChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRkxPQVRfNCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GTE9BVF80ID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgNCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BPU0lUSU9OXzM7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF80OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfVEVYVFVSRV8yKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9URVhUVVJFXzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVEVYVFVSRV8yID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuVEVYVFVSRSwgMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFU4XzQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1VDSEFSXzQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVUNIQVJfNCA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuVU5TSUdORURfOCwgNCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1RFWFRVUkVfMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VDSEFSXzQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9OT1JNQUxfMyhSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfTk9STUFMXzMgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfTk9STUFMXzMgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5OT1JNQUwsIDMpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVhfNFg0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NQVRSSVhfNFg0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01BVFJJWF80WDQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5NQVRSSVhfNFg0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfTk9STUFMXzM7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfNFg0OworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgTUFUUklYNFg0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICByZXR1cm4gTUFUUklYXzRYNChycyk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9DT0xPUl9VOF80KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9DT0xPUl9VOF80ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIERhdGFLaW5kLkNPTE9SLCA0KTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgTUFUUklYXzNYMyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfTUFUUklYXzNYMyA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9NQVRSSVhfM1gzID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuTUFUUklYXzNYMyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQ7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfNFg0OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfQ09MT1JfRjMyXzQoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X0NPTE9SX0YzMl80ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0NPTE9SX0YzMl80ID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuQ09MT1IsIDQpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVhfMlgyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NQVRSSVhfMlgyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01BVFJJWF8yWDIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5NQVRSSVhfMlgyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQ09MT1JfRjMyXzQ7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfMlgyOwogICAgIH0KIAotICAgIEVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50W10gZSwgU3RyaW5nW10gbikgewotICAgICAgICBzdXBlcihycyk7CisgICAgRWxlbWVudChpbnQgaWQsIFJlbmRlclNjcmlwdCBycywgRWxlbWVudFtdIGUsIFN0cmluZ1tdIG4sIGludFtdIGFzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIG1TaXplID0gMDsKICAgICAgICAgbUVsZW1lbnRzID0gZTsKICAgICAgICAgbUVsZW1lbnROYW1lcyA9IG47Ci0gICAgICAgIGludFtdIGlkcyA9IG5ldyBpbnRbbUVsZW1lbnRzLmxlbmd0aF07CisgICAgICAgIG1BcnJheVNpemVzID0gYXM7CiAgICAgICAgIGZvciAoaW50IGN0ID0gMDsgY3QgPCBtRWxlbWVudHMubGVuZ3RoOyBjdCsrICkgewogICAgICAgICAgICAgbVNpemUgKz0gbUVsZW1lbnRzW2N0XS5tU2l6ZTsKLSAgICAgICAgICAgIGlkc1tjdF0gPSBtRWxlbWVudHNbY3RdLm1JRDsKICAgICAgICAgfQotICAgICAgICBtSUQgPSBycy5uRWxlbWVudENyZWF0ZTIoaWRzLCBtRWxlbWVudE5hbWVzKTsKICAgICB9CiAKLSAgICBFbGVtZW50KFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrLCBib29sZWFuIG5vcm0sIGludCBzaXplKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKKyAgICBFbGVtZW50KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgRGF0YUtpbmQgZGssIGJvb2xlYW4gbm9ybSwgaW50IHNpemUpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgbVNpemUgPSBkdC5tU2l6ZSAqIHNpemU7CiAgICAgICAgIG1UeXBlID0gZHQ7CiAgICAgICAgIG1LaW5kID0gZGs7CiAgICAgICAgIG1Ob3JtYWxpemVkID0gbm9ybTsKICAgICAgICAgbVZlY3RvclNpemUgPSBzaXplOwotICAgICAgICBtSUQgPSBycy5uRWxlbWVudENyZWF0ZShkdC5tSUQsIGRrLm1JRCwgbm9ybSwgc2l6ZSk7CisgICAgfQorCisgICAgRWxlbWVudChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKworICAgICAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgICAgIGludFtdIGRhdGFCdWZmZXIgPSBuZXcgaW50WzVdOworICAgICAgICBtUlMubkVsZW1lbnRHZXROYXRpdmVEYXRhKG1JRCwgZGF0YUJ1ZmZlcik7CisKKyAgICAgICAgbU5vcm1hbGl6ZWQgPSBkYXRhQnVmZmVyWzJdID09IDEgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIG1WZWN0b3JTaXplID0gZGF0YUJ1ZmZlclszXTsKKyAgICAgICAgbVNpemUgPSAwOworICAgICAgICBmb3IgKERhdGFUeXBlIGR0OiBEYXRhVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYoZHQubUlEID09IGRhdGFCdWZmZXJbMF0peworICAgICAgICAgICAgICAgIG1UeXBlID0gZHQ7CisgICAgICAgICAgICAgICAgbVNpemUgPSBtVHlwZS5tU2l6ZSAqIG1WZWN0b3JTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoRGF0YUtpbmQgZGs6IERhdGFLaW5kLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZihkay5tSUQgPT0gZGF0YUJ1ZmZlclsxXSl7CisgICAgICAgICAgICAgICAgbUtpbmQgPSBkazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBudW1TdWJFbGVtZW50cyA9IGRhdGFCdWZmZXJbNF07CisgICAgICAgIGlmKG51bVN1YkVsZW1lbnRzID4gMCkgeworICAgICAgICAgICAgbUVsZW1lbnRzID0gbmV3IEVsZW1lbnRbbnVtU3ViRWxlbWVudHNdOworICAgICAgICAgICAgbUVsZW1lbnROYW1lcyA9IG5ldyBTdHJpbmdbbnVtU3ViRWxlbWVudHNdOworCisgICAgICAgICAgICBpbnRbXSBzdWJFbGVtZW50SWRzID0gbmV3IGludFtudW1TdWJFbGVtZW50c107CisgICAgICAgICAgICBtUlMubkVsZW1lbnRHZXRTdWJFbGVtZW50cyhtSUQsIHN1YkVsZW1lbnRJZHMsIG1FbGVtZW50TmFtZXMpOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bVN1YkVsZW1lbnRzOyBpICsrKSB7CisgICAgICAgICAgICAgICAgbUVsZW1lbnRzW2ldID0gbmV3IEVsZW1lbnQoc3ViRWxlbWVudElkc1tpXSwgbVJTKTsKKyAgICAgICAgICAgICAgICBtRWxlbWVudHNbaV0udXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICAgICAgICAgIG1TaXplICs9IG1FbGVtZW50c1tpXS5tU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBzdXBlci5kZXN0cm95KCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUZyb21DbGFzcyhSZW5kZXJTY3JpcHQgcnMsIENsYXNzIGMpIHsKLSAgICAgICAgcnMudmFsaWRhdGUoKTsKLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldEZpZWxkcygpOwotICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7Ci0KLSAgICAgICAgZm9yKEZpZWxkIGY6IGZpZWxkcykgewotICAgICAgICAgICAgQ2xhc3MgZmMgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgIGlmKGZjID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBzaG9ydC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8xNiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBieXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzgpLCBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gZmxvYXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rb3duIGZpZWxkIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYi5jcmVhdGUoKTsKLSAgICB9Ci0KLQogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZVVzZXIoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCkgewotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBEYXRhS2luZC5VU0VSLCBmYWxzZSwgMSk7CisgICAgICAgIERhdGFLaW5kIGRrID0gRGF0YUtpbmQuVVNFUjsKKyAgICAgICAgYm9vbGVhbiBub3JtID0gZmFsc2U7CisgICAgICAgIGludCB2ZWNTaXplID0gMTsKKyAgICAgICAgaW50IGlkID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHZlY1NpemUpOworICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIHJzLCBkdCwgZGssIG5vcm0sIHZlY1NpemUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVWZWN0b3IoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgaW50IHNpemUpIHsKICAgICAgICAgaWYgKHNpemUgPCAyIHx8IHNpemUgPiA0KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgc2l6ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIERhdGFLaW5kLlVTRVIsIGZhbHNlLCBzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlSW5kZXgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgRGF0YVR5cGUuVU5TSUdORURfMTYsIERhdGFLaW5kLklOREVYLCBmYWxzZSwgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUF0dHJpYihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaywgaW50IHNpemUpIHsKLSAgICAgICAgaWYgKCEoZHQgPT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfOCB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF8xNiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF8zMiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfOCB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfMTYgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuU0lHTkVEXzMyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgRGF0YVR5cGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKGRrID09IERhdGFLaW5kLkNPTE9SIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlBPU0lUSU9OIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlRFWFRVUkUgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuTk9STUFMIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlBPSU5UX1NJWkUgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuVVNFUikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIERhdGFLaW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuQ09MT1IgJiYKLSAgICAgICAgICAgICgoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgJiYgZHQgIT0gRGF0YVR5cGUuVU5TSUdORURfOCkgfHwKLSAgICAgICAgICAgICBzaXplIDwgMyB8fCBzaXplID4gNCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5QT1NJVElPTiAmJiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuVEVYVFVSRSAmJgotICAgICAgICAgICAgKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyIHx8IHNpemUgPCAxIHx8IHNpemUgPiA0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLk5PUk1BTCAmJgotICAgICAgICAgICAgKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyIHx8IHNpemUgIT0gMykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5QT0lOVF9TSVpFICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSAhPSAxKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLQorICAgICAgICBEYXRhS2luZCBkayA9IERhdGFLaW5kLlVTRVI7CiAgICAgICAgIGJvb2xlYW4gbm9ybSA9IGZhbHNlOwotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuQ09MT1IgJiYgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfOCkgewotICAgICAgICAgICAgbm9ybSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBkaywgbm9ybSwgc2l6ZSk7CisgICAgICAgIGludCBpZCA9IHJzLm5FbGVtZW50Q3JlYXRlKGR0Lm1JRCwgZGsubUlELCBub3JtLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGlkLCBycywgZHQsIGRrLCBub3JtLCBzaXplKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlUGl4ZWwoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgRGF0YUtpbmQgZGspIHsKQEAgLTM2NywxMyArNDQ4LDE2IEBACiAgICAgICAgICAgICBzaXplID0gNDsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIGRrLCB0cnVlLCBzaXplKTsKKyAgICAgICAgYm9vbGVhbiBub3JtID0gdHJ1ZTsKKyAgICAgICAgaW50IGlkID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHNpemUpOworICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIHJzLCBkdCwgZGssIG5vcm0sIHNpemUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIEVsZW1lbnRbXSBtRWxlbWVudHM7CiAgICAgICAgIFN0cmluZ1tdIG1FbGVtZW50TmFtZXM7CisgICAgICAgIGludFtdIG1BcnJheVNpemVzOwogICAgICAgICBpbnQgbUNvdW50OwogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewpAQCAtMzgxLDI5ICs0NjUsNDkgQEAKICAgICAgICAgICAgIG1Db3VudCA9IDA7CiAgICAgICAgICAgICBtRWxlbWVudHMgPSBuZXcgRWxlbWVudFs4XTsKICAgICAgICAgICAgIG1FbGVtZW50TmFtZXMgPSBuZXcgU3RyaW5nWzhdOworICAgICAgICAgICAgbUFycmF5U2l6ZXMgPSBuZXcgaW50WzhdOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUsIGludCBhcnJheVNpemUpIHsKKyAgICAgICAgICAgIGlmIChhcnJheVNpemUgPCAxKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJyYXkgc2l6ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIDEuIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihtQ291bnQgPT0gbUVsZW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgIEVsZW1lbnRbXSBlID0gbmV3IEVsZW1lbnRbbUNvdW50ICsgOF07CiAgICAgICAgICAgICAgICAgU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbUNvdW50ICsgOF07CisgICAgICAgICAgICAgICAgaW50W10gYXMgPSBuZXcgaW50W21Db3VudCArIDhdOwogICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnRzLCAwLCBlLCAwLCBtQ291bnQpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnROYW1lcywgMCwgcywgMCwgbUNvdW50KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1BcnJheVNpemVzLCAwLCBhcywgMCwgbUNvdW50KTsKICAgICAgICAgICAgICAgICBtRWxlbWVudHMgPSBlOwogICAgICAgICAgICAgICAgIG1FbGVtZW50TmFtZXMgPSBzOworICAgICAgICAgICAgICAgIG1BcnJheVNpemVzID0gYXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRWxlbWVudHNbbUNvdW50XSA9IGVsZW1lbnQ7CiAgICAgICAgICAgICBtRWxlbWVudE5hbWVzW21Db3VudF0gPSBuYW1lOworICAgICAgICAgICAgbUFycmF5U2l6ZXNbbUNvdW50XSA9IGFycmF5U2l6ZTsKICAgICAgICAgICAgIG1Db3VudCsrOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGFkZChlbGVtZW50LCBuYW1lLCAxKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBFbGVtZW50IGNyZWF0ZSgpIHsKICAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwogICAgICAgICAgICAgRWxlbWVudFtdIGVpbiA9IG5ldyBFbGVtZW50W21Db3VudF07CiAgICAgICAgICAgICBTdHJpbmdbXSBzaW4gPSBuZXcgU3RyaW5nW21Db3VudF07CisgICAgICAgICAgICBpbnRbXSBhc2luID0gbmV3IGludFttQ291bnRdOwogICAgICAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnRzLCAwLCBlaW4sIDAsIG1Db3VudCk7CiAgICAgICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmFycmF5Y29weShtRWxlbWVudE5hbWVzLCAwLCBzaW4sIDAsIG1Db3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQobVJTLCBlaW4sIHNpbik7CisgICAgICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmFycmF5Y29weShtQXJyYXlTaXplcywgMCwgYXNpbiwgMCwgbUNvdW50KTsKKworICAgICAgICAgICAgaW50W10gaWRzID0gbmV3IGludFtlaW4ubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGN0ID0gMDsgY3QgPCBlaW4ubGVuZ3RoOyBjdCsrICkgeworICAgICAgICAgICAgICAgIGlkc1tjdF0gPSBlaW5bY3RdLm1JRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpZCA9IG1SUy5uRWxlbWVudENyZWF0ZTIoaWRzLCBzaW4sIGFzaW4pOworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGlkLCBtUlMsIGVpbiwgc2luLCBhc2luKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCmluZGV4IGIyNmU0N2QuLmZmM2UyMmIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKQEAgLTMzLDIxICszMywyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCByZXNldCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgbVBvcyA9IDA7CiAgICAgfQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KGludCBpKSB7CisgICAgICAgIG1Qb3MgPSBpOworICAgIH0KIAotICAgIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CisgICAgcHVibGljIHZvaWQgc2tpcChpbnQgaSkgeworICAgICAgICBtUG9zICs9IGk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSB2OwogICAgIH0KIAotICAgIHZvaWQgYWRkSTE2KHNob3J0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoc2hvcnQgdikgewogICAgICAgICBhbGlnbigyKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEkzMihpbnQgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEkzMihpbnQgdikgewogICAgICAgICBhbGlnbig0KTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKQEAgLTU1LDcgKzYyLDcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEk2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJNjQobG9uZyB2KSB7CiAgICAgICAgIGFsaWduKDgpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwpAQCAtNjcsMTUgKzc0LDE3IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gNTYpICYgMHhmZik7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVOChzaG9ydCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTgoc2hvcnQgdikgewogICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmYpKSB7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgIkZpZWxkUGFja2VyLmFkZFU4KCAiICsgdiArICIgKSIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSl2OwogICAgIH0KIAotICAgIHZvaWQgYWRkVTE2KGludCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTE2KGludCB2KSB7CiAgICAgICAgIGlmICgodiA8IDApIHx8ICh2ID4gMHhmZmZmKSkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVMTYoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oMik7CkBAIC04Myw4ICs5Miw5IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFUzMihsb25nIHYpIHsKLSAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmKSkgeworICAgIHB1YmxpYyB2b2lkIGFkZFUzMihsb25nIHYpIHsKKyAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmTCkpIHsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAiRmllbGRQYWNrZXIuYWRkVTMyKCAiICsgdiArICIgKSIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CiAgICAgICAgIGFsaWduKDQpOwpAQCAtOTQsOCArMTA0LDkgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFU2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVNjQobG9uZyB2KSB7CiAgICAgICAgIGlmICh2IDwgMCkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVNjQoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oOCk7CkBAIC0xMDksMTUgKzEyMCwxNTcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA1NikgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEYzMihmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjMyKGZsb2F0IHYpIHsKICAgICAgICAgYWRkSTMyKEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKHYpKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEY2NChmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjY0KGRvdWJsZSB2KSB7CiAgICAgICAgIGFkZEk2NChEb3VibGUuZG91YmxlVG9SYXdMb25nQml0cyh2KSk7CiAgICAgfQogCi0gICAgZmluYWwgYnl0ZVtdIGdldERhdGEoKSB7CisgICAgcHVibGljIHZvaWQgYWRkT2JqKEJhc2VPYmogb2JqKSB7CisgICAgICAgIGlmIChvYmogIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkSTMyKG9iai5nZXRJRCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZEkzMigwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEYzMihGbG9hdDIgdikgeworICAgICAgICBhZGRGMzIodi54KTsKKyAgICAgICAgYWRkRjMyKHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEYzMihGbG9hdDMgdikgeworICAgICAgICBhZGRGMzIodi54KTsKKyAgICAgICAgYWRkRjMyKHYueSk7CisgICAgICAgIGFkZEYzMih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQ0IHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgICAgICBhZGRGMzIodi56KTsKKyAgICAgICAgYWRkRjMyKHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTgoQnl0ZTIgdikgeworICAgICAgICBhZGRJOCh2LngpOworICAgICAgICBhZGRJOCh2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJOChCeXRlMyB2KSB7CisgICAgICAgIGFkZEk4KHYueCk7CisgICAgICAgIGFkZEk4KHYueSk7CisgICAgICAgIGFkZEk4KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEk4KEJ5dGU0IHYpIHsKKyAgICAgICAgYWRkSTgodi54KTsKKyAgICAgICAgYWRkSTgodi55KTsKKyAgICAgICAgYWRkSTgodi56KTsKKyAgICAgICAgYWRkSTgodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVOChTaG9ydDIgdikgeworICAgICAgICBhZGRVOCh2LngpOworICAgICAgICBhZGRVOCh2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVOChTaG9ydDMgdikgeworICAgICAgICBhZGRVOCh2LngpOworICAgICAgICBhZGRVOCh2LnkpOworICAgICAgICBhZGRVOCh2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVOChTaG9ydDQgdikgeworICAgICAgICBhZGRVOCh2LngpOworICAgICAgICBhZGRVOCh2LnkpOworICAgICAgICBhZGRVOCh2LnopOworICAgICAgICBhZGRVOCh2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEkxNihTaG9ydDIgdikgeworICAgICAgICBhZGRJMTYodi54KTsKKyAgICAgICAgYWRkSTE2KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkxNihTaG9ydDMgdikgeworICAgICAgICBhZGRJMTYodi54KTsKKyAgICAgICAgYWRkSTE2KHYueSk7CisgICAgICAgIGFkZEkxNih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQ0IHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgICAgICBhZGRJMTYodi56KTsKKyAgICAgICAgYWRkSTE2KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVTE2KEludDIgdikgeworICAgICAgICBhZGRVMTYodi54KTsKKyAgICAgICAgYWRkVTE2KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQzIHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgICAgICBhZGRVMTYodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTE2KEludDQgdikgeworICAgICAgICBhZGRVMTYodi54KTsKKyAgICAgICAgYWRkVTE2KHYueSk7CisgICAgICAgIGFkZFUxNih2LnopOworICAgICAgICBhZGRVMTYodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJMzIoSW50MiB2KSB7CisgICAgICAgIGFkZEkzMih2LngpOworICAgICAgICBhZGRJMzIodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDMgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgICAgIGFkZEkzMih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMzIoSW50NCB2KSB7CisgICAgICAgIGFkZEkzMih2LngpOworICAgICAgICBhZGRJMzIodi55KTsKKyAgICAgICAgYWRkSTMyKHYueik7CisgICAgICAgIGFkZEkzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFUzMihJbnQyIHYpIHsKKyAgICAgICAgYWRkVTMyKHYueCk7CisgICAgICAgIGFkZFUzMih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50MyB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICAgICAgYWRkVTMyKHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUzMihJbnQ0IHYpIHsKKyAgICAgICAgYWRkVTMyKHYueCk7CisgICAgICAgIGFkZFUzMih2LnkpOworICAgICAgICBhZGRVMzIodi56KTsKKyAgICAgICAgYWRkVTMyKHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkT2JqKE1hdHJpeDRmIHYpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdi5tTWF0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRGMzIodi5tTWF0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE9iaihNYXRyaXgzZiB2KSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHYubU1hdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkRjMyKHYubU1hdFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPYmooTWF0cml4MmYgdikgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB2Lm1NYXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEYzMih2Lm1NYXRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQm9vbGVhbihib29sZWFuIHYpIHsKKyAgICAgICAgYWRkSTgoKGJ5dGUpKHYgPyAxIDogMCkpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBieXRlW10gZ2V0RGF0YSgpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpbGVBM0QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE0MDYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRmlsZUEzRCBleHRlbmRzIEJhc2VPYmogeworCisgICAgcHVibGljIGVudW0gQ2xhc3NJRCB7CisKKyAgICAgICAgVU5LTk9XTiwKKyAgICAgICAgTUVTSCwKKyAgICAgICAgVFlQRSwKKyAgICAgICAgRUxFTUVOVCwKKyAgICAgICAgQUxMT0NBVElPTiwKKyAgICAgICAgUFJPR1JBTV9WRVJURVgsCisgICAgICAgIFBST0dSQU1fUkFTVEVSLAorICAgICAgICBQUk9HUkFNX0ZSQUdNRU5ULAorICAgICAgICBQUk9HUkFNX1NUT1JFLAorICAgICAgICBTQU1QTEVSLAorICAgICAgICBBTklNQVRJT04sCisgICAgICAgIExJR0hULAorICAgICAgICBBREFQVEVSXzFELAorICAgICAgICBBREFQVEVSXzJELAorICAgICAgICBTQ1JJUFRfQzsKKworICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzSUQgdG9DbGFzc0lEKGludCBpbnRJRCkgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzSUQudmFsdWVzKClbaW50SURdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVhZCBvbmx5IGNsYXNzIHdpdGggaW5kZXggZW50cmllcworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZXhFbnRyeSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisgICAgICAgIGludCBtSW5kZXg7CisgICAgICAgIGludCBtSUQ7CisgICAgICAgIFN0cmluZyBtTmFtZTsKKyAgICAgICAgQ2xhc3NJRCBtQ2xhc3NJRDsKKyAgICAgICAgQmFzZU9iaiBtTG9hZGVkT2JqOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc0lEIGdldENsYXNzSUQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNsYXNzSUQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmFzZU9iaiBnZXRPYmplY3QoKSB7CisgICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIEJhc2VPYmogb2JqID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIEJhc2VPYmogaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBJbmRleEVudHJ5IGVudHJ5KSB7CisgICAgICAgICAgICBpZihlbnRyeS5tTG9hZGVkT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkubUxvYWRlZE9iajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoZW50cnkubUNsYXNzSUQgPT0gQ2xhc3NJRC5VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBvYmplY3RJRCA9IHJzLm5GaWxlQTNER2V0RW50cnlCeUluZGV4KGVudHJ5Lm1JRCwgZW50cnkubUluZGV4KTsKKyAgICAgICAgICAgIGlmKG9iamVjdElEID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChlbnRyeS5tQ2xhc3NJRCkgeworICAgICAgICAgICAgY2FzZSBNRVNIOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBuZXcgTWVzaChvYmplY3RJRCwgcnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBuZXcgVHlwZShvYmplY3RJRCwgcnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTEVNRU5UOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBudWxsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTExPQ0FUSU9OOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBudWxsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9HUkFNX1ZFUlRFWDoKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbmV3IFByb2dyYW1WZXJ0ZXgob2JqZWN0SUQsIHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9SQVNURVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fRlJBR01FTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fU1RPUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNBTVBMRVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFOSU1BVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTElHSFQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFEQVBURVJfMUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFEQVBURVJfMkQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNDUklQVF9DOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqLnVwZGF0ZUZyb21OYXRpdmUoKTsKKworICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm1Mb2FkZWRPYmo7CisgICAgICAgIH0KKworICAgICAgICBJbmRleEVudHJ5KFJlbmRlclNjcmlwdCBycywgaW50IGluZGV4LCBpbnQgaWQsIFN0cmluZyBuYW1lLCBDbGFzc0lEIGNsYXNzSUQpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbUluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIG1DbGFzc0lEID0gY2xhc3NJRDsKKyAgICAgICAgICAgIG1Mb2FkZWRPYmogPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgSW5kZXhFbnRyeVtdIG1GaWxlRW50cmllczsKKworICAgIEZpbGVBM0QoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEVudHJpZXMoKSB7CisgICAgICAgIGludCBudW1GaWxlRW50cmllcyA9IG1SUy5uRmlsZUEzREdldE51bUluZGV4RW50cmllcyhtSUQpOworICAgICAgICBpZihudW1GaWxlRW50cmllcyA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtRmlsZUVudHJpZXMgPSBuZXcgSW5kZXhFbnRyeVtudW1GaWxlRW50cmllc107CisgICAgICAgIGludFtdIGlkcyA9IG5ldyBpbnRbbnVtRmlsZUVudHJpZXNdOworICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbbnVtRmlsZUVudHJpZXNdOworCisgICAgICAgIG1SUy5uRmlsZUEzREdldEluZGV4RW50cmllcyhtSUQsIG51bUZpbGVFbnRyaWVzLCBpZHMsIG5hbWVzKTsKKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtRmlsZUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgICAgIG1GaWxlRW50cmllc1tpXSA9IG5ldyBJbmRleEVudHJ5KG1SUywgaSwgbUlELCBuYW1lc1tpXSwgQ2xhc3NJRC50b0NsYXNzSUQoaWRzW2ldKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bUluZGV4RW50cmllcygpIHsKKyAgICAgICAgaWYobUZpbGVFbnRyaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmlsZUVudHJpZXMubGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBJbmRleEVudHJ5IGdldEluZGV4RW50cnkoaW50IGluZGV4KSB7CisgICAgICAgIGlmKGdldE51bUluZGV4RW50cmllcygpID09IDAgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IG1GaWxlRW50cmllcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmlsZUVudHJpZXNbaW5kZXhdOworICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgRmlsZUEzRCBjcmVhdGVGcm9tUmVzb3VyY2UoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgaWQpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCisgICAgICAgIHJzLnZhbGlkYXRlKCk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICAgICAgaXMgPSByZXMub3BlblJhd1Jlc291cmNlKGlkLCB2YWx1ZSk7CisKKyAgICAgICAgICAgIGludCBhc3NldCA9ICgoQXNzZXRNYW5hZ2VyLkFzc2V0SW5wdXRTdHJlYW0pIGlzKS5nZXRBc3NldEludCgpOworCisgICAgICAgICAgICBpbnQgZmlsZUlkID0gcnMubkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oYXNzZXQpOworCisgICAgICAgICAgICBpZihmaWxlSWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkxvYWQgZmFpbGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZUEzRCBmYTNkID0gbmV3IEZpbGVBM0QoZmlsZUlkLCBycyk7CisgICAgICAgICAgICBmYTNkLmluaXRFbnRyaWVzKCk7CisgICAgICAgICAgICByZXR1cm4gZmEzZDsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODliZjdiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGbG9hdDIgeworICAgIHB1YmxpYyBGbG9hdDIoKSB7CisgICAgfQorCisgICAgcHVibGljIEZsb2F0MihmbG9hdCBpbml0WCwgZmxvYXQgaW5pdFkpIHsKKyAgICAgICAgeCA9IGluaXRYOworICAgICAgICB5ID0gaW5pdFk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IHg7CisgICAgcHVibGljIGZsb2F0IHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0My5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTE0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0My5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZsb2F0MyB7CisgICAgcHVibGljIEZsb2F0MygpIHsKKyAgICB9CisgICAgcHVibGljIEZsb2F0MyhmbG9hdCBpbml0WCwgZmxvYXQgaW5pdFksIGZsb2F0IGluaXRaKSB7CisgICAgICAgIHggPSBpbml0WDsKKyAgICAgICAgeSA9IGluaXRZOworICAgICAgICB6ID0gaW5pdFo7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IHg7CisgICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGZsb2F0IHo7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQ0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzczMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0NC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZsb2F0NCB7CisgICAgcHVibGljIEZsb2F0NCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRmxvYXQ0KGZsb2F0IGluaXRYLCBmbG9hdCBpbml0WSwgZmxvYXQgaW5pdFosIGZsb2F0IGluaXRXKSB7CisgICAgICAgIHggPSBpbml0WDsKKyAgICAgICAgeSA9IGluaXRZOworICAgICAgICB6ID0gaW5pdFo7CisgICAgICAgIHcgPSBpbml0VzsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgeDsKKyAgICBwdWJsaWMgZmxvYXQgeTsKKyAgICBwdWJsaWMgZmxvYXQgejsKKyAgICBwdWJsaWMgZmxvYXQgdzsKK30KKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRm9udC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Gb250LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyNTAxNAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRm9udC5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGb250IGV4dGVuZHMgQmFzZU9iaiB7CisKKyAgICAvL1RoZXNlIGhlbHAgdXMgY3JlYXRlIGEgZm9udCBieSBmYW1pbHkgbmFtZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNTYW5zTmFtZXMgPSB7CisgICAgICAgICJzYW5zLXNlcmlmIiwgImFyaWFsIiwgImhlbHZldGljYSIsICJ0YWhvbWEiLCAidmVyZGFuYSIKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc1NlcmlmTmFtZXMgPSB7CisgICAgICAgICJzZXJpZiIsICJ0aW1lcyIsICJ0aW1lcyBuZXcgcm9tYW4iLCAicGFsYXRpbm8iLCAiZ2VvcmdpYSIsICJiYXNrZXJ2aWxsZSIsCisgICAgICAgICJnb3VkeSIsICJmYW50YXN5IiwgImN1cnNpdmUiLCAiSVRDIFN0b25lIFNlcmlmIgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzTW9ub05hbWVzID0geworICAgICAgICAibW9ub3NwYWNlIiwgImNvdXJpZXIiLCAiY291cmllciBuZXciLCAibW9uYWNvIgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGb250RmFtaWx5IHsKKyAgICAgICAgU3RyaW5nW10gbU5hbWVzOworICAgICAgICBTdHJpbmcgbU5vcm1hbEZpbGVOYW1lOworICAgICAgICBTdHJpbmcgbUJvbGRGaWxlTmFtZTsKKyAgICAgICAgU3RyaW5nIG1JdGFsaWNGaWxlTmFtZTsKKyAgICAgICAgU3RyaW5nIG1Cb2xkSXRhbGljRmlsZU5hbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgRm9udEZhbWlseT4gc0ZvbnRGYW1pbHlNYXA7CisKKyAgICBwdWJsaWMgZW51bSBTdHlsZSB7CisgICAgICAgIE5PUk1BTCwKKyAgICAgICAgQk9MRCwKKyAgICAgICAgSVRBTElDLAorICAgICAgICBCT0xEX0lUQUxJQzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZhbWlseVRvTWFwKEZvbnRGYW1pbHkgZmFtaWx5KSB7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBmYW1pbHkubU5hbWVzLmxlbmd0aDsgaSArKykgeworICAgICAgICAgICAgc0ZvbnRGYW1pbHlNYXAucHV0KGZhbWlseS5tTmFtZXNbaV0sIGZhbWlseSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRGb250RmFtaWx5TWFwKCkgeworICAgICAgICBzRm9udEZhbWlseU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRm9udEZhbWlseT4oKTsKKworICAgICAgICBGb250RmFtaWx5IHNhbnNGYW1pbHkgPSBuZXcgRm9udEZhbWlseSgpOworICAgICAgICBzYW5zRmFtaWx5Lm1OYW1lcyA9IHNTYW5zTmFtZXM7CisgICAgICAgIHNhbnNGYW1pbHkubU5vcm1hbEZpbGVOYW1lID0gIkRyb2lkU2Fucy50dGYiOworICAgICAgICBzYW5zRmFtaWx5Lm1Cb2xkRmlsZU5hbWUgPSAiRHJvaWRTYW5zLUJvbGQudHRmIjsKKyAgICAgICAgc2Fuc0ZhbWlseS5tSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTYW5zLnR0ZiI7CisgICAgICAgIHNhbnNGYW1pbHkubUJvbGRJdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNhbnMtQm9sZC50dGYiOworICAgICAgICBhZGRGYW1pbHlUb01hcChzYW5zRmFtaWx5KTsKKworICAgICAgICBGb250RmFtaWx5IHNlcmlmRmFtaWx5ID0gbmV3IEZvbnRGYW1pbHkoKTsKKyAgICAgICAgc2VyaWZGYW1pbHkubU5hbWVzID0gc1NlcmlmTmFtZXM7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1Ob3JtYWxGaWxlTmFtZSA9ICJEcm9pZFNlcmlmLVJlZ3VsYXIudHRmIjsKKyAgICAgICAgc2VyaWZGYW1pbHkubUJvbGRGaWxlTmFtZSA9ICJEcm9pZFNlcmlmLUJvbGQudHRmIjsKKyAgICAgICAgc2VyaWZGYW1pbHkubUl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2VyaWYtSXRhbGljLnR0ZiI7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1Cb2xkSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTZXJpZi1Cb2xkSXRhbGljLnR0ZiI7CisgICAgICAgIGFkZEZhbWlseVRvTWFwKHNlcmlmRmFtaWx5KTsKKworICAgICAgICBGb250RmFtaWx5IG1vbm9GYW1pbHkgPSBuZXcgRm9udEZhbWlseSgpOworICAgICAgICBtb25vRmFtaWx5Lm1OYW1lcyA9IHNNb25vTmFtZXM7CisgICAgICAgIG1vbm9GYW1pbHkubU5vcm1hbEZpbGVOYW1lID0gIkRyb2lkU2Fuc01vbm8udHRmIjsKKyAgICAgICAgbW9ub0ZhbWlseS5tQm9sZEZpbGVOYW1lID0gIkRyb2lkU2Fuc01vbm8udHRmIjsKKyAgICAgICAgbW9ub0ZhbWlseS5tSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTYW5zTW9uby50dGYiOworICAgICAgICBtb25vRmFtaWx5Lm1Cb2xkSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTYW5zTW9uby50dGYiOworICAgICAgICBhZGRGYW1pbHlUb01hcChtb25vRmFtaWx5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbml0Rm9udEZhbWlseU1hcCgpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0Rm9udEZpbGVOYW1lKFN0cmluZyBmYW1pbHlOYW1lLCBTdHlsZSBzdHlsZSkgeworICAgICAgICBGb250RmFtaWx5IGZhbWlseSA9IHNGb250RmFtaWx5TWFwLmdldChmYW1pbHlOYW1lKTsKKyAgICAgICAgaWYoZmFtaWx5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaChzdHlsZSkgeworICAgICAgICAgICAgICAgIGNhc2UgTk9STUFMOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFtaWx5Lm1Ob3JtYWxGaWxlTmFtZTsKKyAgICAgICAgICAgICAgICBjYXNlIEJPTEQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHkubUJvbGRGaWxlTmFtZTsKKyAgICAgICAgICAgICAgICBjYXNlIElUQUxJQzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbWlseS5tSXRhbGljRmlsZU5hbWU7CisgICAgICAgICAgICAgICAgY2FzZSBCT0xEX0lUQUxJQzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbWlseS5tQm9sZEl0YWxpY0ZpbGVOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEZhbGxiYWNrIGlmIHdlIGNvdWxkIG5vdCBmaW5kIHRoZSBkZXNpcmVkIGZhbWlseQorICAgICAgICByZXR1cm4gIkRyb2lkU2Fucy50dGYiOworICAgIH0KKworICAgIEZvbnQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyBhIHNwZWNpZmljIGZpbGUgbmFtZSBhcyBhbiBhcmd1bWVudAorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgRm9udCBjcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzLCBTdHJpbmcgZmlsZU5hbWUsIGludCBzaXplKQorICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICBycy52YWxpZGF0ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGRwaSA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CisgICAgICAgICAgICBpbnQgZm9udElkID0gcnMubkZvbnRDcmVhdGVGcm9tRmlsZShmaWxlTmFtZSwgc2l6ZSwgZHBpKTsKKworICAgICAgICAgICAgaWYoZm9udElkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGYWlsZWQgbG9hZGluZyBhIGZvbnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZvbnQgcnNGb250ID0gbmV3IEZvbnQoZm9udElkLCBycyk7CisKKyAgICAgICAgICAgIHJldHVybiByc0ZvbnQ7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXB0cyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmYW1pbHkgbmFtZXMgYXMgYW4gYXJndW1lbnQKKyAgICAgKiBhbmQgd2lsbCBhdHRlbXAgdG8gcHJvZHVjZSB0aGUgYmVzdCBtYXRjaCB3aXRoIGEgc3lzdGVtIGZvbnQKKyAgICAgKiAic2Fucy1zZXJpZiIgImFyaWFsIiAiaGVsdmV0aWNhIiAidGFob21hIiAidmVyZGFuYSIKKyAgICAgKiAic2VyaWYiICJ0aW1lcyIgInRpbWVzIG5ldyByb21hbiIgInBhbGF0aW5vIiAiZ2VvcmdpYSIgImJhc2tlcnZpbGxlIgorICAgICAqICJnb3VkeSIgImZhbnRhc3kiICJjdXJzaXZlIiAiSVRDIFN0b25lIFNlcmlmIgorICAgICAqICJtb25vc3BhY2UiICJjb3VyaWVyIiAiY291cmllciBuZXciICJtb25hY28iCisgICAgICogUmV0dXJucyBkZWZhdWx0IGZvbnQgaWYgbm8gbWF0Y2ggY291bGQgYmUgZm91bmQKKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIEZvbnQgY3JlYXRlRnJvbUZhbWlseShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXMsIFN0cmluZyBmYW1pbHlOYW1lLCBTdHlsZSBmb250U3R5bGUsIGludCBzaXplKQorICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBnZXRGb250RmlsZU5hbWUoZmFtaWx5TmFtZSwgZm9udFN0eWxlKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShycywgcmVzLCBmaWxlTmFtZSwgc2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmUyZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgSW50MiB7CisgICAgcHVibGljIEludDIoKSB7CisgICAgfQorCisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjI3NTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgSW50MyB7CisgICAgcHVibGljIEludDMoKSB7CisgICAgfQorCisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKKyAgICBwdWJsaWMgaW50IHo7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2ZjNmNQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEludDQgeworICAgIHB1YmxpYyBJbnQ0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7CisgICAgcHVibGljIGludCB6OworICAgIHB1YmxpYyBpbnQgdzsKK30KKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTGlnaHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTGlnaHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNjU2Zi4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xpZ2h0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBMaWdodCBleHRlbmRzIEJhc2VPYmogewotICAgIExpZ2h0KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYikgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5MaWdodFNldENvbG9yKG1JRCwgciwgZywgYik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5MaWdodFNldFBvc2l0aW9uKG1JRCwgeCwgeSwgeik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgYm9vbGVhbiBtSXNNb25vOwotICAgICAgICBib29sZWFuIG1Jc0xvY2FsOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtSXNNb25vID0gZmFsc2U7Ci0gICAgICAgICAgICBtSXNMb2NhbCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbGlnaHRTZXRJc01vbm8oYm9vbGVhbiBpc01vbm8pIHsKLSAgICAgICAgICAgIG1Jc01vbm8gPSBpc01vbm87Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBsaWdodFNldElzTG9jYWwoYm9vbGVhbiBpc0xvY2FsKSB7Ci0gICAgICAgICAgICBtSXNMb2NhbCA9IGlzTG9jYWw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIExpZ2h0IGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7Ci0gICAgICAgICAgICBycy5uU2FtcGxlckJlZ2luKCk7Ci0gICAgICAgICAgICBycy5uTGlnaHRTZXRJc01vbm8oYi5tSXNNb25vKTsKLSAgICAgICAgICAgIHJzLm5MaWdodFNldElzTG9jYWwoYi5tSXNMb2NhbCk7Ci0gICAgICAgICAgICBpbnQgaWQgPSBycy5uTGlnaHRDcmVhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTGlnaHQoaWQsIHJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaWdodCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWVhZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIExvbmcyIHsKKyAgICBwdWJsaWMgTG9uZzIoKSB7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmczLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmczLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwNDUzMgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBMb25nMyB7CisgICAgcHVibGljIExvbmczKCkgeworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHg7CisgICAgcHVibGljIGxvbmcgeTsKKyAgICBwdWJsaWMgbG9uZyB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmc0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmc0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkMjc0NwotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBMb25nNCB7CisgICAgcHVibGljIExvbmc0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHg7CisgICAgcHVibGljIGxvbmcgeTsKKyAgICBwdWJsaWMgbG9uZyB6OworICAgIHB1YmxpYyBsb25nIHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDJmLmphdmEKaW5kZXggNGI1ZTYxYi4uOTlkMjNkYiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4MmYuamF2YQpAQCAtNTEsNiArNTEsNTcgQEAKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWF0LCAwLCBzcmMsIDAsIDQpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgcm90KSB7CisgICAgICAgIGZsb2F0IGMsIHM7CisgICAgICAgIHJvdCAqPSAoZmxvYXQpKGphdmEubGFuZy5NYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgYyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5jb3Mocm90KTsKKyAgICAgICAgcyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zaW4ocm90KTsKKyAgICAgICAgbU1hdFswXSA9IGM7CisgICAgICAgIG1NYXRbMV0gPSAtczsKKyAgICAgICAgbU1hdFsyXSA9IHM7CisgICAgICAgIG1NYXRbM10gPSBjOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRTY2FsZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgICAgICBtTWF0WzBdID0geDsKKyAgICAgICAgbU1hdFszXSA9IHk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGxvYWRNdWx0aXBseShNYXRyaXgyZiBsaHMsIE1hdHJpeDJmIHJocykgeworICAgICAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaj0wIDsgajwyIDsgaisrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgcmhzX2lqID0gcmhzLmdldChpLGopOworICAgICAgICAgICAgICAgIHJpMCArPSBsaHMuZ2V0KGosMCkgKiByaHNfaWo7CisgICAgICAgICAgICAgICAgcmkxICs9IGxocy5nZXQoaiwxKSAqIHJoc19pajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldChpLDAsIHJpMCk7CisgICAgICAgICAgICBzZXQoaSwxLCByaTEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbXVsdGlwbHkoTWF0cml4MmYgcmhzKSB7CisgICAgICAgIE1hdHJpeDJmIHRtcCA9IG5ldyBNYXRyaXgyZigpOworICAgICAgICB0bXAubG9hZE11bHRpcGx5KHRoaXMsIHJocyk7CisgICAgICAgIGxvYWQodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgcm90YXRlKGZsb2F0IHJvdCkgeworICAgICAgICBNYXRyaXgyZiB0bXAgPSBuZXcgTWF0cml4MmYoKTsKKyAgICAgICAgdG1wLmxvYWRSb3RhdGUocm90KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBNYXRyaXgyZiB0bXAgPSBuZXcgTWF0cml4MmYoKTsKKyAgICAgICAgdG1wLmxvYWRTY2FsZSh4LCB5KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdHJhbnNwb3NlKCkgeworICAgICAgICBmbG9hdCB0ZW1wID0gbU1hdFsxXTsKKyAgICAgICAgbU1hdFsxXSA9IG1NYXRbMl07CisgICAgICAgIG1NYXRbMl0gPSB0ZW1wOworICAgIH0KKwogICAgIGZpbmFsIGZsb2F0W10gbU1hdDsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgzZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgzZi5qYXZhCmluZGV4IDE5ZDdiNDMuLjk2MWJjNWQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDNmLmphdmEKQEAgLTU3LDYgKzU3LDEyNCBAQAogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1NYXQsIDAsIHNyYywgMCwgOSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgbG9hZFJvdGF0ZShmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgZmxvYXQgYywgczsKKyAgICAgICAgcm90ICo9IChmbG9hdCkoamF2YS5sYW5nLk1hdGguUEkgLyAxODAuMGYpOworICAgICAgICBjID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLmNvcyhyb3QpOworICAgICAgICBzID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNpbihyb3QpOworCisgICAgICAgIGZsb2F0IGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7CisgICAgICAgIGlmICghKGxlbiAhPSAxKSkgeworICAgICAgICAgICAgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBsZW47CisgICAgICAgICAgICB4ICo9IHJlY2lwTGVuOworICAgICAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgICAgIHogKj0gcmVjaXBMZW47CisgICAgICAgIH0KKyAgICAgICAgZmxvYXQgbmMgPSAxLjBmIC0gYzsKKyAgICAgICAgZmxvYXQgeHkgPSB4ICogeTsKKyAgICAgICAgZmxvYXQgeXogPSB5ICogejsKKyAgICAgICAgZmxvYXQgenggPSB6ICogeDsKKyAgICAgICAgZmxvYXQgeHMgPSB4ICogczsKKyAgICAgICAgZmxvYXQgeXMgPSB5ICogczsKKyAgICAgICAgZmxvYXQgenMgPSB6ICogczsKKyAgICAgICAgbU1hdFswXSA9IHgqeCpuYyArICBjOworICAgICAgICBtTWF0WzNdID0gIHh5Km5jIC0genM7CisgICAgICAgIG1NYXRbNl0gPSAgengqbmMgKyB5czsKKyAgICAgICAgbU1hdFsxXSA9ICB4eSpuYyArIHpzOworICAgICAgICBtTWF0WzRdID0geSp5Km5jICsgIGM7CisgICAgICAgIG1NYXRbOV0gPSAgeXoqbmMgLSB4czsKKyAgICAgICAgbU1hdFsyXSA9ICB6eCpuYyAtIHlzOworICAgICAgICBtTWF0WzZdID0gIHl6Km5jICsgeHM7CisgICAgICAgIG1NYXRbOF0gPSB6KnoqbmMgKyAgYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkUm90YXRlKGZsb2F0IHJvdCkgeworICAgICAgICBmbG9hdCBjLCBzOworICAgICAgICByb3QgKj0gKGZsb2F0KShqYXZhLmxhbmcuTWF0aC5QSSAvIDE4MC4wZik7CisgICAgICAgIGMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguY29zKHJvdCk7CisgICAgICAgIHMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc2luKHJvdCk7CisgICAgICAgIG1NYXRbMF0gPSBjOworICAgICAgICBtTWF0WzFdID0gLXM7CisgICAgICAgIG1NYXRbM10gPSBzOworICAgICAgICBtTWF0WzRdID0gYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU2NhbGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFswXSA9IHg7CisgICAgICAgIG1NYXRbNF0gPSB5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRTY2FsZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgICAgICBtTWF0WzBdID0geDsKKyAgICAgICAgbU1hdFs0XSA9IHk7CisgICAgICAgIG1NYXRbOF0gPSB6OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFs2XSA9IHg7CisgICAgICAgIG1NYXRbN10gPSB5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRNdWx0aXBseShNYXRyaXgzZiBsaHMsIE1hdHJpeDNmIHJocykgeworICAgICAgICBmb3IgKGludCBpPTAgOyBpPDMgOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICAgICAgZmxvYXQgcmkyID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MyA7IGorKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHJoc19paiA9IHJocy5nZXQoaSxqKTsKKyAgICAgICAgICAgICAgICByaTAgKz0gbGhzLmdldChqLDApICogcmhzX2lqOworICAgICAgICAgICAgICAgIHJpMSArPSBsaHMuZ2V0KGosMSkgKiByaHNfaWo7CisgICAgICAgICAgICAgICAgcmkyICs9IGxocy5nZXQoaiwyKSAqIHJoc19pajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldChpLDAsIHJpMCk7CisgICAgICAgICAgICBzZXQoaSwxLCByaTEpOworICAgICAgICAgICAgc2V0KGksMiwgcmkyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG11bHRpcGx5KE1hdHJpeDNmIHJocykgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRNdWx0aXBseSh0aGlzLCByaHMpOworICAgICAgICBsb2FkKHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkUm90YXRlKHJvdCwgeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkUm90YXRlKHJvdCk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkU2NhbGUoeCwgeSk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNjYWxlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkU2NhbGUoeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFRyYW5zbGF0ZSh4LCB5KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdHJhbnNwb3NlKCkgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgICAgICBmb3IoaW50IGogPSBpICsgMTsgaiA8IDM7ICsraikgeworICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSBtTWF0W2kqMyArIGpdOworICAgICAgICAgICAgICAgIG1NYXRbaSozICsgal0gPSBtTWF0W2oqMyArIGldOworICAgICAgICAgICAgICAgIG1NYXRbaiozICsgaV0gPSB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgZmluYWwgZmxvYXRbXSBtTWF0OwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDRmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDRmLmphdmEKaW5kZXggZWJkNWJkZS4uNWZmYzIxYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4NGYuamF2YQpAQCAtMTc5LDYgKzE3OSw4NSBAQAogICAgICAgICB0bXAubG9hZFRyYW5zbGF0ZSh4LCB5LCB6KTsKICAgICAgICAgbXVsdGlwbHkodG1wKTsKICAgICB9CisgICAgcHJpdmF0ZSBmbG9hdCBjb21wdXRlQ29mYWN0b3IoaW50IGksIGludCBqKSB7CisgICAgICAgIGludCBjMCA9IChpKzEpICUgNDsKKyAgICAgICAgaW50IGMxID0gKGkrMikgJSA0OworICAgICAgICBpbnQgYzIgPSAoaSszKSAlIDQ7CisgICAgICAgIGludCByMCA9IChqKzEpICUgNDsKKyAgICAgICAgaW50IHIxID0gKGorMikgJSA0OworICAgICAgICBpbnQgcjIgPSAoaiszKSAlIDQ7CisKKyAgICAgICAgZmxvYXQgbWlub3IgPSAobU1hdFtjMCArIDQqcjBdICogKG1NYXRbYzEgKyA0KnIxXSAqIG1NYXRbYzIgKyA0KnIyXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRbYzEgKyA0KnIyXSAqIG1NYXRbYzIgKyA0KnIxXSkpCisgICAgICAgICAgICAgICAgICAgICAtIChtTWF0W2MwICsgNCpyMV0gKiAobU1hdFtjMSArIDQqcjBdICogbU1hdFtjMiArIDQqcjJdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hdFtjMSArIDQqcjJdICogbU1hdFtjMiArIDQqcjBdKSkKKyAgICAgICAgICAgICAgICAgICAgICsgKG1NYXRbYzAgKyA0KnIyXSAqIChtTWF0W2MxICsgNCpyMF0gKiBtTWF0W2MyICsgNCpyMV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF0W2MxICsgNCpyMV0gKiBtTWF0W2MyICsgNCpyMF0pKTsKKworICAgICAgICBmbG9hdCBjb2ZhY3RvciA9ICgoaStqKSAmIDEpICE9IDAgPyAtbWlub3IgOiBtaW5vcjsKKyAgICAgICAgcmV0dXJuIGNvZmFjdG9yOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludmVyc2UoKSB7CisKKyAgICAgICAgTWF0cml4NGYgcmVzdWx0ID0gbmV3IE1hdHJpeDRmKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1NYXRbNCppICsgal0gPSBjb21wdXRlQ29mYWN0b3IoaSwgaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEb3QgcHJvZHVjdCBvZiAwdGggY29sdW1uIG9mIHNvdXJjZSBhbmQgMHRoIHJvdyBvZiByZXN1bHQKKyAgICAgICAgZmxvYXQgZGV0ID0gbU1hdFswXSpyZXN1bHQubU1hdFswXSArIG1NYXRbNF0qcmVzdWx0Lm1NYXRbMV0gKworICAgICAgICAgICAgICAgICAgICAgbU1hdFs4XSpyZXN1bHQubU1hdFsyXSArIG1NYXRbMTJdKnJlc3VsdC5tTWF0WzNdOworCisgICAgICAgIGlmIChNYXRoLmFicyhkZXQpIDwgMWUtNikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZGV0ID0gMS4wZiAvIGRldDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICBtTWF0W2ldID0gcmVzdWx0Lm1NYXRbaV0gKiBkZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZlcnNlVHJhbnNwb3NlKCkgeworCisgICAgICAgIE1hdHJpeDRmIHJlc3VsdCA9IG5ldyBNYXRyaXg0ZigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgICAgIHJlc3VsdC5tTWF0WzQqaiArIGldID0gY29tcHV0ZUNvZmFjdG9yKGksIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZGV0ID0gbU1hdFswXSpyZXN1bHQubU1hdFswXSArIG1NYXRbNF0qcmVzdWx0Lm1NYXRbNF0gKworICAgICAgICAgICAgICAgICAgICAgbU1hdFs4XSpyZXN1bHQubU1hdFs4XSArIG1NYXRbMTJdKnJlc3VsdC5tTWF0WzEyXTsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IDFlLTYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRldCA9IDEuMGYgLyBkZXQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICAgICAgbU1hdFtpXSA9IHJlc3VsdC5tTWF0W2ldICogZGV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdHJhbnNwb3NlKCkgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgICAgICBmb3IoaW50IGogPSBpICsgMTsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSBtTWF0W2kqNCArIGpdOworICAgICAgICAgICAgICAgIG1NYXRbaSo0ICsgal0gPSBtTWF0W2oqNCArIGldOworICAgICAgICAgICAgICAgIG1NYXRbaio0ICsgaV0gPSB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiAgICAgZmluYWwgZmxvYXRbXSBtTWF0OwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NZXNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01lc2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZiMmYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NZXNoLmphdmEKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBNZXNoIGV4dGVuZHMgQmFzZU9iaiB7CisKKyAgICBBbGxvY2F0aW9uW10gbVZlcnRleEJ1ZmZlcnM7CisgICAgQWxsb2NhdGlvbltdIG1JbmRleEJ1ZmZlcnM7CisgICAgUHJpbWl0aXZlW10gbVByaW1pdGl2ZXM7CisKKyAgICBNZXNoKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRWZXJ0ZXhBbGxvY2F0aW9uQ291bnQoKSB7CisgICAgICAgIGlmKG1WZXJ0ZXhCdWZmZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtVmVydGV4QnVmZmVycy5sZW5ndGg7CisgICAgfQorICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldFZlcnRleEFsbG9jYXRpb24oaW50IHNsb3QpIHsKKyAgICAgICAgcmV0dXJuIG1WZXJ0ZXhCdWZmZXJzW3Nsb3RdOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UHJpbWl0aXZlQ291bnQoKSB7CisgICAgICAgIGlmKG1JbmRleEJ1ZmZlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbmRleEJ1ZmZlcnMubGVuZ3RoOworICAgIH0KKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRJbmRleEFsbG9jYXRpb24oaW50IHNsb3QpIHsKKyAgICAgICAgcmV0dXJuIG1JbmRleEJ1ZmZlcnNbc2xvdF07CisgICAgfQorICAgIHB1YmxpYyBQcmltaXRpdmUgZ2V0UHJpbWl0aXZlKGludCBzbG90KSB7CisgICAgICAgIHJldHVybiBtUHJpbWl0aXZlc1tzbG90XTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgICAgIG1OYW1lID0gbVJTLm5HZXROYW1lKG1JRCk7CisgICAgICAgIGludCB2dHhDb3VudCA9IG1SUy5uTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KG1JRCk7CisgICAgICAgIGludCBpZHhDb3VudCA9IG1SUy5uTWVzaEdldEluZGV4Q291bnQobUlEKTsKKworICAgICAgICBpbnRbXSB2dHhJRHMgPSBuZXcgaW50W3Z0eENvdW50XTsKKyAgICAgICAgaW50W10gaWR4SURzID0gbmV3IGludFtpZHhDb3VudF07CisgICAgICAgIGludFtdIHByaW1pdGl2ZXMgPSBuZXcgaW50W2lkeENvdW50XTsKKworICAgICAgICBtUlMubk1lc2hHZXRWZXJ0aWNlcyhtSUQsIHZ0eElEcywgdnR4Q291bnQpOworICAgICAgICBtUlMubk1lc2hHZXRJbmRpY2VzKG1JRCwgaWR4SURzLCBwcmltaXRpdmVzLCBpZHhDb3VudCk7CisKKyAgICAgICAgbVZlcnRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvblt2dHhDb3VudF07CisgICAgICAgIG1JbmRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltpZHhDb3VudF07CisgICAgICAgIG1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZVtpZHhDb3VudF07CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHZ0eENvdW50OyBpICsrKSB7CisgICAgICAgICAgICBpZih2dHhJRHNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2ldID0gbmV3IEFsbG9jYXRpb24odnR4SURzW2ldLCBtUlMpOworICAgICAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2ldLnVwZGF0ZUZyb21OYXRpdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpZHhDb3VudDsgaSArKykgeworICAgICAgICAgICAgaWYoaWR4SURzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXJzW2ldID0gbmV3IEFsbG9jYXRpb24oaWR4SURzW2ldLCBtUlMpOworICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlcnNbaV0udXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByaW1pdGl2ZXNbaV0gPSBQcmltaXRpdmUudmFsdWVzKClbcHJpbWl0aXZlc1tpXV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworCisgICAgICAgIGNsYXNzIEVudHJ5IHsKKyAgICAgICAgICAgIFR5cGUgdDsKKyAgICAgICAgICAgIEVsZW1lbnQgZTsKKyAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgUHJpbWl0aXZlIHByaW07CisgICAgICAgIH0KKworICAgICAgICBpbnQgbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgRW50cnlbXSBtVmVydGV4VHlwZXM7CisgICAgICAgIFZlY3RvciBtSW5kZXhUeXBlczsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCA9IDA7CisgICAgICAgICAgICBtVmVydGV4VHlwZXMgPSBuZXcgRW50cnlbMTZdOworICAgICAgICAgICAgbUluZGV4VHlwZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoVHlwZSB0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS50ID0gdDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5lID0gbnVsbDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnQgPSBudWxsOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLmUgPSBlOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnNpemUgPSBzaXplOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShUeXBlIHQsIFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS50ID0gdDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5lID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5zaXplID0gMDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLnQgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLmUgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLnNpemUgPSAwOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplLCBQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUudCA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuZSA9IGU7CisgICAgICAgICAgICBpbmRleFR5cGUuc2l6ZSA9IHNpemU7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIFR5cGUgbmV3VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB7CisgICAgICAgICAgICBUeXBlLkJ1aWxkZXIgdGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgZSk7CisgICAgICAgICAgICB0Yi5hZGQoRGltZW5zaW9uLlgsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHRiLmNyZWF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBNZXNoIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7CisKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5NZXNoQ3JlYXRlKGIubVZlcnRleFR5cGVDb3VudCwgYi5tSW5kZXhUeXBlcy5zaXplKCkpOworICAgICAgICAgICAgTWVzaCBuZXdNZXNoID0gbmV3IE1lc2goaWQsIHJzKTsKKyAgICAgICAgICAgIG5ld01lc2gubUluZGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubUluZGV4VHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlW2IubUluZGV4VHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG5ld01lc2gubVZlcnRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1WZXJ0ZXhUeXBlQ291bnRdOworCisgICAgICAgICAgICBmb3IoaW50IGN0ID0gMDsgY3QgPCBiLm1JbmRleFR5cGVzLnNpemUoKTsgY3QgKyspIHsKKyAgICAgICAgICAgICAgICBBbGxvY2F0aW9uIGFsbG9jID0gbnVsbDsKKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSliLm1JbmRleFR5cGVzLmVsZW1lbnRBdChjdCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQocnMsIGVudHJ5LnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGVudHJ5LmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIGVudHJ5LmUsIGVudHJ5LnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYWxsb2NJRCA9IChhbGxvYyA9PSBudWxsKSA/IDAgOiBhbGxvYy5nZXRJRCgpOworICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZEluZGV4KGlkLCBhbGxvY0lELCBlbnRyeS5wcmltLm1JRCwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubUluZGV4QnVmZmVyc1tjdF0gPSBhbGxvYzsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzW2N0XSA9IGVudHJ5LnByaW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubVZlcnRleFR5cGVDb3VudDsgY3QgKyspIHsKKyAgICAgICAgICAgICAgICBBbGxvY2F0aW9uIGFsbG9jID0gbnVsbDsKKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IGIubVZlcnRleFR5cGVzW2N0XTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChycywgZW50cnkudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGVudHJ5LmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIGVudHJ5LmUsIGVudHJ5LnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRWZXJ0ZXgoaWQsIGFsbG9jLmdldElEKCksIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzW2N0XSA9IGFsbG9jOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3TWVzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXNoIGNyZWF0ZSgpIHsKKyAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICAgICAgTWVzaCBzbSA9IGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsbG9jYXRpb25CdWlsZGVyIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKworICAgICAgICBjbGFzcyBFbnRyeSB7CisgICAgICAgICAgICBBbGxvY2F0aW9uIGE7CisgICAgICAgICAgICBQcmltaXRpdmUgcHJpbTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtVmVydGV4VHlwZUNvdW50OworICAgICAgICBFbnRyeVtdIG1WZXJ0ZXhUeXBlczsKKworICAgICAgICBWZWN0b3IgbUluZGV4VHlwZXM7CisKKyAgICAgICAgcHVibGljIEFsbG9jYXRpb25CdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50ID0gMDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlcyA9IG5ldyBFbnRyeVsxNl07CisgICAgICAgICAgICBtSW5kZXhUeXBlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4QWxsb2NhdGlvbihBbGxvY2F0aW9uIGEpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLmEgPSBhOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4QWxsb2NhdGlvbihBbGxvY2F0aW9uIGEsIFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5hID0gYTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLmEgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIE1lc2ggaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBBbGxvY2F0aW9uQnVpbGRlciBiKSB7CisKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5NZXNoQ3JlYXRlKGIubVZlcnRleFR5cGVDb3VudCwgYi5tSW5kZXhUeXBlcy5zaXplKCkpOworICAgICAgICAgICAgTWVzaCBuZXdNZXNoID0gbmV3IE1lc2goaWQsIHJzKTsKKyAgICAgICAgICAgIG5ld01lc2gubUluZGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubUluZGV4VHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlW2IubUluZGV4VHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG5ld01lc2gubVZlcnRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1WZXJ0ZXhUeXBlQ291bnRdOworCisgICAgICAgICAgICBmb3IoaW50IGN0ID0gMDsgY3QgPCBiLm1JbmRleFR5cGVzLnNpemUoKTsgY3QgKyspIHsKKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSliLm1JbmRleFR5cGVzLmVsZW1lbnRBdChjdCk7CisgICAgICAgICAgICAgICAgaW50IGFsbG9jSUQgPSAoZW50cnkuYSA9PSBudWxsKSA/IDAgOiBlbnRyeS5hLmdldElEKCk7CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kSW5kZXgoaWQsIGFsbG9jSUQsIGVudHJ5LnByaW0ubUlELCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzW2N0XSA9IGVudHJ5LmE7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlc1tjdF0gPSBlbnRyeS5wcmltOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoaW50IGN0ID0gMDsgY3QgPCBiLm1WZXJ0ZXhUeXBlQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSBiLm1WZXJ0ZXhUeXBlc1tjdF07CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kVmVydGV4KGlkLCBlbnRyeS5hLm1JRCwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubVZlcnRleEJ1ZmZlcnNbY3RdID0gZW50cnkuYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld01lc2g7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVzaCBjcmVhdGUoKSB7CisgICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIE1lc2ggc20gPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyaWFuZ2xlTWVzaEJ1aWxkZXIgeworICAgICAgICBmbG9hdCBtVnR4RGF0YVtdOworICAgICAgICBpbnQgbVZ0eENvdW50OworICAgICAgICBzaG9ydCBtSW5kZXhEYXRhW107CisgICAgICAgIGludCBtSW5kZXhDb3VudDsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKyAgICAgICAgRWxlbWVudCBtRWxlbWVudDsKKworICAgICAgICBmbG9hdCBtTlggPSAwOworICAgICAgICBmbG9hdCBtTlkgPSAwOworICAgICAgICBmbG9hdCBtTlogPSAtMTsKKyAgICAgICAgZmxvYXQgbVMwID0gMDsKKyAgICAgICAgZmxvYXQgbVQwID0gMDsKKyAgICAgICAgZmxvYXQgbVIgPSAxOworICAgICAgICBmbG9hdCBtRyA9IDE7CisgICAgICAgIGZsb2F0IG1CID0gMTsKKyAgICAgICAgZmxvYXQgbUEgPSAxOworCisgICAgICAgIGludCBtVnR4U2l6ZTsKKyAgICAgICAgaW50IG1GbGFnczsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xPUiA9IDB4MDAwMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMID0gMHgwMDAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUVVJFXzAgPSAweDAxMDA7CisKKyAgICAgICAgcHVibGljIFRyaWFuZ2xlTWVzaEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzLCBpbnQgdnR4U2l6ZSwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1WdHhDb3VudCA9IDA7CisgICAgICAgICAgICBtSW5kZXhDb3VudCA9IDA7CisgICAgICAgICAgICBtVnR4RGF0YSA9IG5ldyBmbG9hdFsxMjhdOworICAgICAgICAgICAgbUluZGV4RGF0YSA9IG5ldyBzaG9ydFsxMjhdOworICAgICAgICAgICAgbVZ0eFNpemUgPSB2dHhTaXplOworICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisKKyAgICAgICAgICAgIGlmICh2dHhTaXplIDwgMiB8fCB2dHhTaXplID4gMykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZlcnRleCBzaXplIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBtYWtlU3BhY2UoaW50IGNvdW50KSB7CisgICAgICAgICAgICBpZiAoKG1WdHhDb3VudCArIGNvdW50KSA+PSBtVnR4RGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0W10gPSBuZXcgZmxvYXRbbVZ0eERhdGEubGVuZ3RoICogMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtVnR4RGF0YSwgMCwgdCwgMCwgbVZ0eERhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbGF0Y2goKSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWFrZVNwYWNlKDQpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1SOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1HOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1COworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1BOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMik7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVMwOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1UMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWFrZVNwYWNlKDMpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWDsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5aOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAyKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWtlU3BhY2UoMik7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKKyAgICAgICAgICAgIGxhdGNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gejsKKyAgICAgICAgICAgIGxhdGNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlKGZsb2F0IHMsIGZsb2F0IHQpIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUzAgPSBzOworICAgICAgICAgICAgbVQwID0gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5vcm1hbChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5YID0geDsKKyAgICAgICAgICAgIG1OWSA9IHk7CisgICAgICAgICAgICBtTlogPSB6OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVIgPSByOworICAgICAgICAgICAgbUcgPSBnOworICAgICAgICAgICAgbUIgPSBiOworICAgICAgICAgICAgbUEgPSBhOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVHJpYW5nbGUoaW50IGlkeDEsIGludCBpZHgyLCBpbnQgaWR4MykgeworICAgICAgICAgICAgaWYoKGlkeDEgPj0gbVZ0eENvdW50KSB8fCAoaWR4MSA8IDApIHx8CisgICAgICAgICAgICAgICAoaWR4MiA+PSBtVnR4Q291bnQpIHx8IChpZHgyIDwgMCkgfHwKKyAgICAgICAgICAgICAgIChpZHgzID49IG1WdHhDb3VudCkgfHwgKGlkeDMgPCAwKSkgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5kZXggcHJvdmlkZWQgZ3JlYXRlciB0aGFuIHZlcnRleCBjb3VudC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUluZGV4Q291bnQgKyAzKSA+PSBtSW5kZXhEYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHNob3J0IHRbXSA9IG5ldyBzaG9ydFttSW5kZXhEYXRhLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUluZGV4RGF0YSwgMCwgdCwgMCwgbUluZGV4RGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG1JbmRleERhdGEgPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgxOworICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgyOworICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc2ggY3JlYXRlKGJvb2xlYW4gdXBsb2FkVG9CdWZmZXJPYmplY3QpIHsKKyAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOworICAgICAgICAgICAgaW50IGZsb2F0Q291bnQgPSBtVnR4U2l6ZTsKKyAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlVmVjdG9yKG1SUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVnR4U2l6ZSksICJwb3NpdGlvbiIpOworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgeworICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl80KG1SUyksICJjb2xvciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApICE9IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfMihtUlMpLCAidGV4dHVyZTAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAzOworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzMobVJTKSwgIm5vcm1hbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUVsZW1lbnQgPSBiLmNyZWF0ZSgpOworCisgICAgICAgICAgICBCdWlsZGVyIHNtYiA9IG5ldyBCdWlsZGVyKG1SUyk7CisgICAgICAgICAgICBzbWIuYWRkVmVydGV4VHlwZShtRWxlbWVudCwgbVZ0eENvdW50IC8gZmxvYXRDb3VudCk7CisgICAgICAgICAgICBzbWIuYWRkSW5kZXhUeXBlKEVsZW1lbnQuVTE2KG1SUyksIG1JbmRleENvdW50LCBQcmltaXRpdmUuVFJJQU5HTEUpOworCisgICAgICAgICAgICBNZXNoIHNtID0gc21iLmNyZWF0ZSgpOworCisgICAgICAgICAgICBzbS5nZXRWZXJ0ZXhBbGxvY2F0aW9uKDApLmRhdGEobVZ0eERhdGEpOworICAgICAgICAgICAgaWYodXBsb2FkVG9CdWZmZXJPYmplY3QpIHsKKyAgICAgICAgICAgICAgICBzbS5nZXRWZXJ0ZXhBbGxvY2F0aW9uKDApLnVwbG9hZFRvQnVmZmVyT2JqZWN0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNtLmdldEluZGV4QWxsb2NhdGlvbigwKS5kYXRhKG1JbmRleERhdGEpOworICAgICAgICAgICAgc20uZ2V0SW5kZXhBbGxvY2F0aW9uKDApLnVwbG9hZFRvQnVmZmVyT2JqZWN0KCk7CisKKyAgICAgICAgICAgIHJldHVybiBzbTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW0uamF2YQppbmRleCAxNjE0ZWM1Li5mZmNkYmJjNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiBwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwogCiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC0zOCw4ICs0Myw3IEBACiAgICAgU3RyaW5nIG1TaGFkZXI7CiAKICAgICBQcm9ncmFtKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYmluZENvbnN0YW50cyhBbGxvY2F0aW9uIGEsIGludCBzbG90KSB7CkBAIC05MSw4ICs5NSw0NyBAQAogICAgICAgICAgICAgbVRleHR1cmVDb3VudCA9IDA7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaGFkZXIoU3RyaW5nIHMpIHsKKyAgICAgICAgcHVibGljIEJhc2VQcm9ncmFtQnVpbGRlciBzZXRTaGFkZXIoU3RyaW5nIHMpIHsKICAgICAgICAgICAgIG1TaGFkZXIgPSBzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmFzZVByb2dyYW1CdWlsZGVyIHNldFNoYWRlcihSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICAgICAgYnl0ZVtdIHN0cjsKKyAgICAgICAgICAgIGludCBzdHJMZW5ndGg7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHJlc291cmNlcy5vcGVuUmF3UmVzb3VyY2UocmVzb3VyY2VJRCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0ciA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgICAgICBzdHJMZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gc3RyLmxlbmd0aCAtIHN0ckxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbc3RyLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3RyLCAwLCBidWYyLCAwLCBzdHIubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBidWYyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCA9IHN0ci5sZW5ndGggLSBzdHJMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaXMucmVhZChzdHIsIHN0ckxlbmd0aCwgYnl0ZXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyTGVuZ3RoICs9IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TaGFkZXIgPSBuZXcgU3RyaW5nKHN0ciwgMCwgc3RyTGVuZ3RoLCAiVVRGLTgiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJSZW5kZXJzY3JpcHQgc2hhZGVyIGNyZWF0aW9uIiwgIkNvdWxkIG5vdCBkZWNvZGUgc2hhZGVyIHN0cmluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KEVsZW1lbnQgZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CkBAIC0xMTEsNiArMTU0LDEzIEBACiAgICAgICAgICAgICBtT3V0cHV0c1ttT3V0cHV0Q291bnQrK10gPSBlOwogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCByZXNldENvbnN0YW50KCkgeworICAgICAgICAgICAgbUNvbnN0YW50Q291bnQgPSAwOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IE1BWF9DT05TVEFOVDsgaSArKykgeworICAgICAgICAgICAgICAgIG1Db25zdGFudHNbaV0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcHVibGljIGludCBhZGRDb25zdGFudChUeXBlIHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICAgICAgLy8gU2hvdWxkIGNoZWNrIGZvciBjb25zaXN0YW50IGFuZCBub24tY29uZmxpY3RpbmcgbmFtZXMuLi4KICAgICAgICAgICAgIGlmKG1Db25zdGFudENvdW50ID49IE1BWF9DT05TVEFOVCkgewpAQCAtMTIwLDEyICsxNzAsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnRDb3VudCsrOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZUNvdW50KGludCBjb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBCYXNlUHJvZ3JhbUJ1aWxkZXIgc2V0VGV4dHVyZUNvdW50KGludCBjb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAvLyBTaG91bGQgY2hlY2sgZm9yIGNvbnNpc3RhbnQgYW5kIG5vbi1jb25mbGljdGluZyBuYW1lcy4uLgotICAgICAgICAgICAgaWYoY291bnQgPj0gTUFYX0NPTlNUQU5UKSB7CisgICAgICAgICAgICBpZihjb3VudCA+PSBNQVhfVEVYVFVSRSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1heCB0ZXh0dXJlIGNvdW50IGV4Y2VlZGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVRleHR1cmVDb3VudCA9IGNvdW50OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UHJvZ3JhbShQcm9ncmFtIHApIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1GcmFnbWVudC5qYXZhCmluZGV4IDVlMDRmMGMuLjg4NThiNzQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtRnJhZ21lbnQuamF2YQpAQCAtNTUsMTcgKzU1LDE4IEBACiAgICAgICAgICAgICB0bXBbaWR4KytdID0gMzsKICAgICAgICAgICAgIHRtcFtpZHgrK10gPSBtVGV4dHVyZUNvdW50OwogCi0gICAgICAgICAgICBpbnQgaWQgPSBtUlMublByb2dyYW1GcmFnbWVudENyZWF0ZTIobVNoYWRlciwgdG1wKTsKKyAgICAgICAgICAgIGludCBpZCA9IG1SUy5uUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKG1TaGFkZXIsIHRtcCk7CiAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQgcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KGlkLCBtUlMpOwogICAgICAgICAgICAgaW5pdFByb2dyYW0ocGYpOwogICAgICAgICAgICAgcmV0dXJuIHBmOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBTaGFkZXJCdWlsZGVyIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RFWFRVUkUgPSAyOwotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworICAgICAgICBpbnQgbU51bVRleHR1cmVzOwogICAgICAgICBib29sZWFuIG1Qb2ludFNwcml0ZUVuYWJsZTsKKyAgICAgICAgYm9vbGVhbiBtVmFyeWluZ0NvbG9yRW5hYmxlOwogCiAgICAgICAgIHB1YmxpYyBlbnVtIEVudk1vZGUgewogICAgICAgICAgICAgUkVQTEFDRSAoMSksCkBAIC0xMDAsMzkgKzEwMSwxMjYgQEAKICAgICAgICAgfQogICAgICAgICBTbG90W10gbVNsb3RzOwogCisgICAgICAgIHByaXZhdGUgdm9pZCBidWlsZFNoYWRlclN0cmluZygpIHsKKyAgICAgICAgICAgIG1TaGFkZXIgID0gIi8vcnNfc2hhZGVyX2ludGVybmFsXG4iOworICAgICAgICAgICAgbVNoYWRlciArPSAidmFyeWluZyBsb3dwIHZlYzQgdmFyQ29sb3I7XG4iOworICAgICAgICAgICAgbVNoYWRlciArPSAidmFyeWluZyB2ZWMyIHZhclRleDA7XG4iOworCisgICAgICAgICAgICBtU2hhZGVyICs9ICJ2b2lkIG1haW4oKSB7XG4iOworICAgICAgICAgICAgaWYgKG1WYXJ5aW5nQ29sb3JFbmFibGUpIHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGxvd3AgdmVjNCBjb2wgPSB2YXJDb2xvcjtcbiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgbG93cCB2ZWM0IGNvbCA9IFVOSV9Db2xvcjtcbiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTnVtVGV4dHVyZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtUG9pbnRTcHJpdGVFbmFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICB2ZWMyIHQwID0gZ2xfUG9pbnRDb29yZDtcbiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICB2ZWMyIHQwID0gdmFyVGV4MC54eTtcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbU51bVRleHR1cmVzOyBpICsrKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKG1TbG90c1tpXS5lbnYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUExBQ0U6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobVNsb3RzW2ldLmZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFMUEhBOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wuYSA9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLmE7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFVNSU5BTkNFX0FMUEhBOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiYSA9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYmE7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUkdCOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkucmdiO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJHQkE6CisgICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGNvbC5yZ2JhID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkucmdiYTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1PRFVMQVRFOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1TbG90c1tpXS5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTFBIQToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgY29sLmEgKj0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkuYTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMVU1JTkFOQ0VfQUxQSEE6CisgICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGNvbC5yZ2JhICo9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYmE7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUkdCOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiICo9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYjtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSR0JBOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiYSAqPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5yZ2JhO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgREVDQUw6CisgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgY29sID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCk7XG4iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgZ2xfRnJhZ0NvbG9yID0gY29sO1xuIjsKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gIn1cbiI7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIHN1cGVyKHJzKTsKICAgICAgICAgICAgIG1SUyA9IHJzOwogICAgICAgICAgICAgbVNsb3RzID0gbmV3IFNsb3RbTUFYX1RFWFRVUkVdOwogICAgICAgICAgICAgbVBvaW50U3ByaXRlRW5hYmxlID0gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlKEVudk1vZGUgZW52LCBGb3JtYXQgZm10LCBpbnQgc2xvdCkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VGV4dHVyZShFbnZNb2RlIGVudiwgRm9ybWF0IGZtdCwgaW50IHNsb3QpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgICAgIGlmKChzbG90IDwgMCkgfHwgKHNsb3QgPj0gTUFYX1RFWFRVUkUpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTUFYX1RFWFRVUkUgZXhjZWVkZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU2xvdHNbc2xvdF0gPSBuZXcgU2xvdChlbnYsIGZtdCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U3ByaXRlVGV4Q29vcmRpbmF0ZVJlcGxhY2VtZW50KGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBvaW50U3ByaXRlVGV4Q29vcmRpbmF0ZVJlcGxhY2VtZW50KGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgICAgICBtUG9pbnRTcHJpdGVFbmFibGUgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZhcnlpbmdDb2xvcihib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbVZhcnlpbmdDb2xvckVuYWJsZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBQcm9ncmFtRnJhZ21lbnQgY3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBpbnRbXSB0bXAgPSBuZXcgaW50W01BWF9URVhUVVJFICogMiArIDFdOwotICAgICAgICAgICAgaWYgKG1TbG90c1swXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG1wWzBdID0gbVNsb3RzWzBdLmVudi5tSUQ7Ci0gICAgICAgICAgICAgICAgdG1wWzFdID0gbVNsb3RzWzBdLmZvcm1hdC5tSUQ7CisgICAgICAgICAgICBtTnVtVGV4dHVyZXMgPSAwOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IE1BWF9URVhUVVJFOyBpICsrKSB7CisgICAgICAgICAgICAgICAgaWYobVNsb3RzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU51bVRleHR1cmVzICsrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2xvdHNbMV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRtcFsyXSA9IG1TbG90c1sxXS5lbnYubUlEOwotICAgICAgICAgICAgICAgIHRtcFszXSA9IG1TbG90c1sxXS5mb3JtYXQubUlEOworICAgICAgICAgICAgcmVzZXRDb25zdGFudCgpOworICAgICAgICAgICAgYnVpbGRTaGFkZXJTdHJpbmcoKTsKKyAgICAgICAgICAgIFR5cGUgY29uc3RUeXBlID0gbnVsbDsKKyAgICAgICAgICAgIGlmICghbVZhcnlpbmdDb2xvckVuYWJsZSkgeworICAgICAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzQobVJTKSwgIkNvbG9yIik7CisgICAgICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHR5cGVCdWlsZGVyID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIGIuY3JlYXRlKCkpOworICAgICAgICAgICAgICAgIHR5cGVCdWlsZGVyLmFkZChEaW1lbnNpb24uWCwgMSk7CisgICAgICAgICAgICAgICAgY29uc3RUeXBlID0gdHlwZUJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgYWRkQ29uc3RhbnQoY29uc3RUeXBlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRtcFs0XSA9IG1Qb2ludFNwcml0ZUVuYWJsZSA/IDEgOiAwOwotICAgICAgICAgICAgaW50IGlkID0gbVJTLm5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUodG1wKTsKLSAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudCBwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQoaWQsIG1SUyk7CisgICAgICAgICAgICBzZXRUZXh0dXJlQ291bnQobU51bVRleHR1cmVzKTsKKworICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50IHBmID0gc3VwZXIuY3JlYXRlKCk7CiAgICAgICAgICAgICBwZi5tVGV4dHVyZUNvdW50ID0gTUFYX1RFWFRVUkU7CisgICAgICAgICAgICBpZiAoIW1WYXJ5aW5nQ29sb3JFbmFibGUpIHsKKyAgICAgICAgICAgICAgICBBbGxvY2F0aW9uIGNvbnN0YW50RGF0YSA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLGNvbnN0VHlwZSk7CisgICAgICAgICAgICAgICAgZmxvYXRbXSBkYXRhID0gbmV3IGZsb2F0WzRdOworICAgICAgICAgICAgICAgIGRhdGFbMF0gPSBkYXRhWzFdID0gZGF0YVsyXSA9IGRhdGFbM10gPSAxLjBmOworICAgICAgICAgICAgICAgIGNvbnN0YW50RGF0YS5kYXRhKGRhdGEpOworICAgICAgICAgICAgICAgIHBmLmJpbmRDb25zdGFudHMoY29uc3RhbnREYXRhLCAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBwZjsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKaW5kZXggNTZmOWJmNC4uNzkxZGFjOCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKQEAgLTI2LDc2ICsyNiwxMTMgQEAKICAqCiAgKiovCiBwdWJsaWMgY2xhc3MgUHJvZ3JhbVJhc3RlciBleHRlbmRzIEJhc2VPYmogeworCisgICAgcHVibGljIGVudW0gQ3VsbE1vZGUgeworICAgICAgICBCQUNLICgwKSwKKyAgICAgICAgRlJPTlQgKDEpLAorICAgICAgICBOT05FICgyKTsKKworICAgICAgICBpbnQgbUlEOworICAgICAgICBDdWxsTW9kZShpbnQgaWQpIHsKKyAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICB9CisgICAgfQorCiAgICAgYm9vbGVhbiBtUG9pbnRTbW9vdGg7CiAgICAgYm9vbGVhbiBtTGluZVNtb290aDsKICAgICBib29sZWFuIG1Qb2ludFNwcml0ZTsKLSAgICBmbG9hdCBtUG9pbnRTaXplOwogICAgIGZsb2F0IG1MaW5lV2lkdGg7Ci0gICAgRWxlbWVudCBtSW47Ci0gICAgRWxlbWVudCBtT3V0OworICAgIEN1bGxNb2RlIG1DdWxsTW9kZTsKIAogICAgIFByb2dyYW1SYXN0ZXIoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKIAotICAgICAgICBtUG9pbnRTaXplID0gMS4wZjsKICAgICAgICAgbUxpbmVXaWR0aCA9IDEuMGY7CiAgICAgICAgIG1Qb2ludFNtb290aCA9IGZhbHNlOwogICAgICAgICBtTGluZVNtb290aCA9IGZhbHNlOwogICAgICAgICBtUG9pbnRTcHJpdGUgPSBmYWxzZTsKKworICAgICAgICBtQ3VsbE1vZGUgPSBDdWxsTW9kZS5CQUNLOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KSB7CisgICAgdm9pZCBzZXRMaW5lV2lkdGgoZmxvYXQgdykgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKICAgICAgICAgbUxpbmVXaWR0aCA9IHc7CiAgICAgICAgIG1SUy5uUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChtSUQsIHcpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKSB7CisgICAgdm9pZCBzZXRDdWxsTW9kZShDdWxsTW9kZSBtKSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUG9pbnRTaXplID0gczsKLSAgICAgICAgbVJTLm5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKG1JRCwgcyk7CisgICAgICAgIG1DdWxsTW9kZSA9IG07CisgICAgICAgIG1SUy5uUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKG1JRCwgbS5tSUQpOwogICAgIH0KIAotICAgIHZvaWQgaW50ZXJuYWxJbml0KCkgewotICAgICAgICBpbnQgaW5JRCA9IDA7Ci0gICAgICAgIGludCBvdXRJRCA9IDA7Ci0gICAgICAgIGlmIChtSW4gIT0gbnVsbCkgewotICAgICAgICAgICAgaW5JRCA9IG1Jbi5tSUQ7CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtUmFzdGVyIENVTExfQkFDSyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9CQUNLID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1SYXN0ZXIuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEN1bGxNb2RlKEN1bGxNb2RlLkJBQ0spOworICAgICAgICAgICAgcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9CQUNLID0gYnVpbGRlci5jcmVhdGUoKTsKICAgICAgICAgfQotICAgICAgICBpZiAobU91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRJRCA9IG1PdXQubUlEOwotICAgICAgICB9Ci0gICAgICAgIG1JRCA9IG1SUy5uUHJvZ3JhbVJhc3RlckNyZWF0ZShpbklELCBvdXRJRCwgbVBvaW50U21vb3RoLCBtTGluZVNtb290aCwgbVBvaW50U3ByaXRlKTsKKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSzsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1SYXN0ZXIgQ1VMTF9GUk9OVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9GUk9OVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRDdWxsTW9kZShDdWxsTW9kZS5GUk9OVCk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX0ZST05UID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9GUk9OVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1SYXN0ZXIgQ1VMTF9OT05FKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkUgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q3VsbE1vZGUoQ3VsbE1vZGUuTk9ORSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkUgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkU7CisgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgUHJvZ3JhbVJhc3RlciBtUFI7CisgICAgICAgIGJvb2xlYW4gbVBvaW50U3ByaXRlOworICAgICAgICBib29sZWFuIG1Qb2ludFNtb290aDsKKyAgICAgICAgYm9vbGVhbiBtTGluZVNtb290aDsKKyAgICAgICAgQ3VsbE1vZGUgbUN1bGxNb2RlOwogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgRWxlbWVudCBpbiwgRWxlbWVudCBvdXQpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1QUiA9IG5ldyBQcm9ncmFtUmFzdGVyKDAsIHJzKTsKKyAgICAgICAgICAgIG1Qb2ludFNtb290aCA9IGZhbHNlOworICAgICAgICAgICAgbUxpbmVTbW9vdGggPSBmYWxzZTsKKyAgICAgICAgICAgIG1Qb2ludFNwcml0ZSA9IGZhbHNlOworICAgICAgICAgICAgbUN1bGxNb2RlID0gQ3VsbE1vZGUuQkFDSzsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U3ByaXRlRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtUFIubVBvaW50U3ByaXRlID0gZW5hYmxlOworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQb2ludFNwcml0ZUVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbVBvaW50U3ByaXRlID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1Qb2ludFNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UG9pbnRTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1Qb2ludFNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TGluZVNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1MaW5lU21vb3RoID0gZW5hYmxlOworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRMaW5lU21vb3RoRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICBtTGluZVNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q3VsbE1vZGUoQ3VsbE1vZGUgbSkgeworICAgICAgICAgICAgbUN1bGxNb2RlID0gbTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CiAKICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBQcm9ncmFtUmFzdGVyIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7Ci0gICAgICAgICAgICBiLm1QUi5pbnRlcm5hbEluaXQoKTsKLSAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIgcHIgPSBiLm1QUjsKLSAgICAgICAgICAgIGIubVBSID0gbmV3IFByb2dyYW1SYXN0ZXIoMCwgYi5tUlMpOworICAgICAgICAgICAgaW50IGlkID0gcnMublByb2dyYW1SYXN0ZXJDcmVhdGUoYi5tUG9pbnRTbW9vdGgsIGIubUxpbmVTbW9vdGgsIGIubVBvaW50U3ByaXRlKTsKKyAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIgcHIgPSBuZXcgUHJvZ3JhbVJhc3RlcihpZCwgcnMpOworICAgICAgICAgICAgcHIuc2V0Q3VsbE1vZGUoYi5tQ3VsbE1vZGUpOwogICAgICAgICAgICAgcmV0dXJuIHByOwogICAgICAgICB9CiAKQEAgLTExMSwzICsxNDgsNCBAQAogCiAKIAorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQppbmRleCA2OWJlMjQ1Li4zMmMwZDAxIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEKQEAgLTc2LDExICs3NiwxNDMgQEAKIAogCiAgICAgUHJvZ3JhbVN0b3JlKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfTk9ORV9ERVBUSF9URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuWkVSTyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX05PTkVfREVQVEhfTk9fREVQVEgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5aRVJPKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5aRVJPKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1dSSVRFID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5aRVJPKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURSA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURTsKKyAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BTFBIQV9ERVBUSF9URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwgQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwgQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fREVQVEg7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIEJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BTFBIQV9ERVBUSF9OT19XUklURShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19XUklURSA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLCBCbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19XUklURTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FERF9ERVBUSF9OT19ERVBUSChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fREVQVEggPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fREVQVEg7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FERF9ERVBUSF9OT19URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLk9ORSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUREX0RFUFRIX05PX1dSSVRFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19XUklURSA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5PTkUpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEUgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19XUklURTsKKyAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwpAQCAtMTEwLDMyICsyNDIsNDkgQEAKICAgICAgICAgICAgIG1Db2xvck1hc2tBID0gdHJ1ZTsKICAgICAgICAgICAgIG1CbGVuZFNyYyA9IEJsZW5kU3JjRnVuYy5PTkU7CiAgICAgICAgICAgICBtQmxlbmREc3QgPSBCbGVuZERzdEZ1bmMuWkVSTzsKLQotCiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXREZXB0aEZ1bmMoRGVwdGhGdW5jIGZ1bmMpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1JbiA9IG51bGw7CisgICAgICAgICAgICBtT3V0ID0gbnVsbDsKKyAgICAgICAgICAgIG1EZXB0aEZ1bmMgPSBEZXB0aEZ1bmMuQUxXQVlTOworICAgICAgICAgICAgbURlcHRoTWFzayA9IGZhbHNlOworICAgICAgICAgICAgbUNvbG9yTWFza1IgPSB0cnVlOworICAgICAgICAgICAgbUNvbG9yTWFza0cgPSB0cnVlOworICAgICAgICAgICAgbUNvbG9yTWFza0IgPSB0cnVlOworICAgICAgICAgICAgbUNvbG9yTWFza0EgPSB0cnVlOworICAgICAgICAgICAgbUJsZW5kU3JjID0gQmxlbmRTcmNGdW5jLk9ORTsKKyAgICAgICAgICAgIG1CbGVuZERzdCA9IEJsZW5kRHN0RnVuYy5aRVJPOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGVwdGhGdW5jKERlcHRoRnVuYyBmdW5jKSB7CiAgICAgICAgICAgICBtRGVwdGhGdW5jID0gZnVuYzsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlcHRoTWFzayhib29sZWFuIGVuYWJsZSkgewogICAgICAgICAgICAgbURlcHRoTWFzayA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb2xvck1hc2soYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKSB7CiAgICAgICAgICAgICBtQ29sb3JNYXNrUiA9IHI7CiAgICAgICAgICAgICBtQ29sb3JNYXNrRyA9IGc7CiAgICAgICAgICAgICBtQ29sb3JNYXNrQiA9IGI7CiAgICAgICAgICAgICBtQ29sb3JNYXNrQSA9IGE7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMgc3JjLCBCbGVuZERzdEZ1bmMgZHN0KSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMgc3JjLCBCbGVuZERzdEZ1bmMgZHN0KSB7CiAgICAgICAgICAgICBtQmxlbmRTcmMgPSBzcmM7CiAgICAgICAgICAgICBtQmxlbmREc3QgPSBkc3Q7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERpdGhlckVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREaXRoZXJFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgICAgIG1EaXRoZXIgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJvZ3JhbVN0b3JlIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7CkBAIC0xNDcsMTcgKzI5NiwxNyBAQAogICAgICAgICAgICAgaWYgKGIubU91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgb3V0SUQgPSBiLm1PdXQubUlEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW5JRCwgb3V0SUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKGIubURlcHRoTWFzayk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soYi5tQ29sb3JNYXNrUiwKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCZWdpbihpbklELCBvdXRJRCk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURlcHRoTWFzayhiLm1EZXB0aE1hc2spOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZUNvbG9yTWFzayhiLm1Db2xvck1hc2tSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubUNvbG9yTWFza0csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tQ29sb3JNYXNrQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm1Db2xvck1hc2tBKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhiLm1CbGVuZFNyYy5tSUQsIGIubUJsZW5kRHN0Lm1JRCk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoYi5tRGl0aGVyKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoYi5tQmxlbmRTcmMubUlELCBiLm1CbGVuZERzdC5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURpdGhlcihiLm1EaXRoZXIpOwogCi0gICAgICAgICAgICBpbnQgaWQgPSBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoKTsKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtU3RvcmVDcmVhdGUoKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbVN0b3JlKGlkLCBycyk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtVmVydGV4LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YQppbmRleCAxYjE1NWQ3Li42NWEwYWYyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAogCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC0zOCwyNSArMzksNiBAQAogICAgICAgICBiaW5kQ29uc3RhbnRzKHZhLm1BbGxvYywgMCk7CiAgICAgfQogCi0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBib29sZWFuIG1UZXh0dXJlTWF0cml4RW5hYmxlOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgRWxlbWVudCBpbiwgRWxlbWVudCBvdXQpIHsKLSAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZU1hdHJpeEVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVRleHR1cmVNYXRyaXhFbmFibGUgPSBlbmFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUHJvZ3JhbVZlcnRleCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBpbnQgaWQgPSBtUlMublByb2dyYW1WZXJ0ZXhDcmVhdGUobVRleHR1cmVNYXRyaXhFbmFibGUpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtVmVydGV4KGlkLCBtUlMpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaGFkZXJCdWlsZGVyIGV4dGVuZHMgQmFzZVByb2dyYW1CdWlsZGVyIHsKICAgICAgICAgcHVibGljIFNoYWRlckJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBzdXBlcihycyk7CkBAIC04MiwxMyArNjQsNzUgQEAKICAgICAgICAgICAgIHRtcFtpZHgrK10gPSAzOwogICAgICAgICAgICAgdG1wW2lkeCsrXSA9IG1UZXh0dXJlQ291bnQ7CiAKLSAgICAgICAgICAgIGludCBpZCA9IG1SUy5uUHJvZ3JhbVZlcnRleENyZWF0ZTIobVNoYWRlciwgdG1wKTsKKyAgICAgICAgICAgIGludCBpZCA9IG1SUy5uUHJvZ3JhbVZlcnRleENyZWF0ZShtU2hhZGVyLCB0bXApOwogICAgICAgICAgICAgUHJvZ3JhbVZlcnRleCBwdiA9IG5ldyBQcm9ncmFtVmVydGV4KGlkLCBtUlMpOwogICAgICAgICAgICAgaW5pdFByb2dyYW0ocHYpOwogICAgICAgICAgICAgcmV0dXJuIHB2OwogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU2hhZGVyQnVpbGRlciB7CisgICAgICAgIGJvb2xlYW4gbVRleHR1cmVNYXRyaXhFbmFibGU7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50IGluLCBFbGVtZW50IG91dCkgeworICAgICAgICAgICAgc3VwZXIocnMpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgc3VwZXIocnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VGV4dHVyZU1hdHJpeEVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbVRleHR1cmVNYXRyaXhFbmFibGUgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgVHlwZSBnZXRDb25zdGFudElucHV0VHlwZShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50Lk1BVFJJWDRYNChycyksICJNViIpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5NQVRSSVg0WDQocnMpLCAiUCIpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5NQVRSSVg0WDQocnMpLCAiVGV4TWF0cml4Iik7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50Lk1BVFJJWDRYNChycyksICJNVlAiKTsKKworICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHR5cGVCdWlsZGVyID0gbmV3IFR5cGUuQnVpbGRlcihycywgYi5jcmVhdGUoKSk7CisgICAgICAgICAgICB0eXBlQnVpbGRlci5hZGQoRGltZW5zaW9uLlgsIDEpOworICAgICAgICAgICAgcmV0dXJuIHR5cGVCdWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkU2hhZGVyU3RyaW5nKCkgeworCisgICAgICAgICAgICBtU2hhZGVyICA9ICIvL3JzX3NoYWRlcl9pbnRlcm5hbFxuIjsKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gInZhcnlpbmcgdmVjNCB2YXJDb2xvcjtcbiI7CisgICAgICAgICAgICBtU2hhZGVyICs9ICJ2YXJ5aW5nIHZlYzIgdmFyVGV4MDtcbiI7CisKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gInZvaWQgbWFpbigpIHtcbiI7CisgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGdsX1Bvc2l0aW9uID0gVU5JX01WUCAqIEFUVFJJQl9wb3NpdGlvbjtcbiI7CisgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGdsX1BvaW50U2l6ZSA9IDEuMDtcbiI7CisKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgdmFyQ29sb3IgPSBBVFRSSUJfY29sb3I7XG4iOworICAgICAgICAgICAgaWYgKG1UZXh0dXJlTWF0cml4RW5hYmxlKSB7CisgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICB2YXJUZXgwID0gKFVOSV9UZXhNYXRyaXggKiB2ZWM0KEFUVFJJQl90ZXh0dXJlMCwgMC4wLCAxLjApKS54eTtcbiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgdmFyVGV4MCA9IEFUVFJJQl90ZXh0dXJlMDtcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2hhZGVyICs9ICJ9XG4iOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcm9ncmFtVmVydGV4IGNyZWF0ZSgpIHsKKyAgICAgICAgICAgIGJ1aWxkU2hhZGVyU3RyaW5nKCk7CisKKyAgICAgICAgICAgIGFkZENvbnN0YW50KGdldENvbnN0YW50SW5wdXRUeXBlKG1SUykpOworCisgICAgICAgICAgICBFbGVtZW50LkJ1aWxkZXIgYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzQobVJTKSwgInBvc2l0aW9uIik7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl80KG1SUyksICJjb2xvciIpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfMyhtUlMpLCAibm9ybWFsIik7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8yKG1SUyksICJ0ZXh0dXJlMCIpOworICAgICAgICAgICAgYWRkSW5wdXQoYi5jcmVhdGUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKwogCiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hdHJpeEFsbG9jYXRpb24gewpAQCAtMTAxLDE2ICsxNDUsMTcgQEAKICAgICAgICAgTWF0cml4NGYgbVRleHR1cmU7CiAKICAgICAgICAgcHVibGljIEFsbG9jYXRpb24gbUFsbG9jOworICAgICAgICBwcml2YXRlIEZpZWxkUGFja2VyIG1JT0J1ZmZlcjsKIAogICAgICAgICBwdWJsaWMgTWF0cml4QWxsb2NhdGlvbihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgICAgIG1Nb2RlbCA9IG5ldyBNYXRyaXg0ZigpOwotICAgICAgICAgICAgbVByb2plY3Rpb24gPSBuZXcgTWF0cml4NGYoKTsKLSAgICAgICAgICAgIG1UZXh0dXJlID0gbmV3IE1hdHJpeDRmKCk7Ci0KLSAgICAgICAgICAgIG1BbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIEVsZW1lbnQuY3JlYXRlVXNlcihycywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksIDQ4KTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoTU9ERUxWSUVXX09GRlNFVCwgMTYsIG1Nb2RlbC5tTWF0KTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoUFJPSkVDVElPTl9PRkZTRVQsIDE2LCBtUHJvamVjdGlvbi5tTWF0KTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoVEVYVFVSRV9PRkZTRVQsIDE2LCBtVGV4dHVyZS5tTWF0KTsKKyAgICAgICAgICAgIFR5cGUgY29uc3RJbnB1dFR5cGUgPSBQcm9ncmFtVmVydGV4LkJ1aWxkZXIuZ2V0Q29uc3RhbnRJbnB1dFR5cGUocnMpOworICAgICAgICAgICAgbUFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChycywgY29uc3RJbnB1dFR5cGUpOworICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBjb25zdElucHV0VHlwZS5nZXRFbGVtZW50KCkuZ2V0U2l6ZUJ5dGVzKCkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0SW5wdXRUeXBlLmdldEVsZW1lbnRDb3VudCgpOworICAgICAgICAgICAgbUlPQnVmZmVyID0gbmV3IEZpZWxkUGFja2VyKGJ1ZmZlclNpemUpOworICAgICAgICAgICAgbG9hZE1vZGVsdmlldyhuZXcgTWF0cml4NGYoKSk7CisgICAgICAgICAgICBsb2FkUHJvamVjdGlvbihuZXcgTWF0cml4NGYoKSk7CisgICAgICAgICAgICBsb2FkVGV4dHVyZShuZXcgTWF0cml4NGYoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewpAQCAtMTE4LDI0ICsxNjMsMzIgQEAKICAgICAgICAgICAgIG1BbGxvYyA9IG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIHZvaWQgYWRkVG9CdWZmZXIoaW50IG9mZnNldCwgTWF0cml4NGYgbSkgeworICAgICAgICAgICAgbUlPQnVmZmVyLnJlc2V0KG9mZnNldCk7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBtSU9CdWZmZXIuYWRkRjMyKG0ubU1hdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWxsb2MuZGF0YShtSU9CdWZmZXIuZ2V0RGF0YSgpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIGxvYWRNb2RlbHZpZXcoTWF0cml4NGYgbSkgewogICAgICAgICAgICAgbU1vZGVsID0gbTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoTU9ERUxWSUVXX09GRlNFVCwgMTYsIG0ubU1hdCk7CisgICAgICAgICAgICBhZGRUb0J1ZmZlcihNT0RFTFZJRVdfT0ZGU0VUKjQsIG0pOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgbG9hZFByb2plY3Rpb24oTWF0cml4NGYgbSkgewogICAgICAgICAgICAgbVByb2plY3Rpb24gPSBtOwotICAgICAgICAgICAgbUFsbG9jLnN1YkRhdGExRChQUk9KRUNUSU9OX09GRlNFVCwgMTYsIG0ubU1hdCk7CisgICAgICAgICAgICBhZGRUb0J1ZmZlcihQUk9KRUNUSU9OX09GRlNFVCo0LCBtKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGxvYWRUZXh0dXJlKE1hdHJpeDRmIG0pIHsKICAgICAgICAgICAgIG1UZXh0dXJlID0gbTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoVEVYVFVSRV9PRkZTRVQsIDE2LCBtLm1NYXQpOworICAgICAgICAgICAgYWRkVG9CdWZmZXIoVEVYVFVSRV9PRkZTRVQqNCwgbSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cE9ydGhvV2luZG93KGludCB3LCBpbnQgaCkgewogICAgICAgICAgICAgbVByb2plY3Rpb24ubG9hZE9ydGhvKDAsdywgaCwwLCAtMSwxKTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoUFJPSkVDVElPTl9PRkZTRVQsIDE2LCBtUHJvamVjdGlvbi5tTWF0KTsKKyAgICAgICAgICAgIGFkZFRvQnVmZmVyKFBST0pFQ1RJT05fT0ZGU0VUKjQsIG1Qcm9qZWN0aW9uKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldHVwT3J0aG9Ob3JtYWxpemVkKGludCB3LCBpbnQgaCkgewpAQCAtMTQ3LDcgKzIwMCw3IEBACiAgICAgICAgICAgICAgICAgZmxvYXQgYXNwZWN0ID0gKChmbG9hdCloKSAvIHc7CiAgICAgICAgICAgICAgICAgbVByb2plY3Rpb24ubG9hZE9ydGhvKC0xLDEsIC1hc3BlY3QsYXNwZWN0LCAgLTEsMSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKFBST0pFQ1RJT05fT0ZGU0VULCAxNiwgbVByb2plY3Rpb24ubU1hdCk7CisgICAgICAgICAgICBhZGRUb0J1ZmZlcihQUk9KRUNUSU9OX09GRlNFVCo0LCBtUHJvamVjdGlvbik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cFByb2plY3Rpb25Ob3JtYWxpemVkKGludCB3LCBpbnQgaCkgewpAQCAtMTczLDcgKzIyNiw3IEBACiAgICAgICAgICAgICBtMS5sb2FkTXVsdGlwbHkobTEsIG0yKTsKIAogICAgICAgICAgICAgbVByb2plY3Rpb24gPSBtMTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoUFJPSkVDVElPTl9PRkZTRVQsIDE2LCBtUHJvamVjdGlvbi5tTWF0KTsKKyAgICAgICAgICAgIGFkZFRvQnVmZmVyKFBST0pFQ1RJT05fT0ZGU0VUKjQsIG1Qcm9qZWN0aW9uKTsKICAgICAgICAgfQogCiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKaW5kZXggYTkzNTI0My4uMDA4ODM3MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCkBAIC01NywxNTEgKzU3LDQ3NCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gTm9uLXRocmVhZHNhZmUgZnVuY3Rpb25zLgogICAgIG5hdGl2ZSB2b2lkIG5Jbml0RWxlbWVudHMoaW50IGE4LCBpbnQgcmdiYTQ0NDQsIGludCByZ2JhODg4OCwgaW50IHJnYjU2NSk7Ci0KICAgICBuYXRpdmUgaW50ICBuRGV2aWNlQ3JlYXRlKCk7CiAgICAgbmF0aXZlIHZvaWQgbkRldmljZURlc3Ryb3koaW50IGRldik7CiAgICAgbmF0aXZlIHZvaWQgbkRldmljZVNldENvbmZpZyhpbnQgZGV2LCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIGludCAgbkNvbnRleHRDcmVhdGVHTChpbnQgZGV2LCBpbnQgdmVyLCBib29sZWFuIHVzZURlcHRoKTsKLSAgICBuYXRpdmUgaW50ICBuQ29udGV4dENyZWF0ZShpbnQgZGV2LCBpbnQgdmVyKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlc3Ryb3koaW50IGNvbik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRTZXRTdXJmYWNlKGludCB3LCBpbnQgaCwgU3VyZmFjZSBzdXIpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0U2V0UHJpb3JpdHkoaW50IHApOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0RHVtcChpbnQgYml0cyk7Ci0KLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRSb290U2NyaXB0KGludCBzY3JpcHQpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFNhbXBsZXIoaW50IHNhbXBsZXIsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShpbnQgcGZzKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoaW50IHBmKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KGludCBwZik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihpbnQgcHIpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0UGF1c2UoKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFJlc3VtZSgpOwotICAgIG5hdGl2ZSBpbnQgbkNvbnRleHRHZXRNZXNzYWdlKGludFtdIGRhdGEsIGJvb2xlYW4gd2FpdCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KCk7Ci0KLSAgICBuYXRpdmUgdm9pZCBuQXNzaWduTmFtZShpbnQgb2JqLCBieXRlW10gbmFtZSk7Ci0gICAgbmF0aXZlIHZvaWQgbk9iakRlc3Ryb3koaW50IGlkKTsKLSAgICBuYXRpdmUgdm9pZCBuT2JqRGVzdHJveU9PQihpbnQgaWQpOwotICAgIG5hdGl2ZSBpbnQgIG5GaWxlT3BlbihieXRlW10gbmFtZSk7CisgICAgbmF0aXZlIGludCAgbkNvbnRleHRHZXRNZXNzYWdlKGludCBjb24sIGludFtdIGRhdGEsIGJvb2xlYW4gd2FpdCk7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoaW50IGNvbik7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHREZWluaXRUb0NsaWVudChpbnQgY29uKTsKIAogCi0gICAgbmF0aXZlIGludCAgbkVsZW1lbnRDcmVhdGUoaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKTsKLSAgICBuYXRpdmUgaW50ICBuRWxlbWVudENyZWF0ZTIoaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzKTsKKyAgICAvLyBNZXRob2RzIGJlbG93IGFyZSB3cmFwcGVkIHRvIHByb3RlY3QgdGhlIG5vbi10aHJlYWRzYWZlCisgICAgLy8gbG9ja2xlc3MgZmlmby4KKyAgICBuYXRpdmUgaW50ICByc25Db250ZXh0Q3JlYXRlR0woaW50IGRldiwgaW50IHZlciwgYm9vbGVhbiB1c2VEZXB0aCk7CisgICAgc3luY2hyb25pemVkIGludCBuQ29udGV4dENyZWF0ZUdMKGludCBkZXYsIGludCB2ZXIsIGJvb2xlYW4gdXNlRGVwdGgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkNvbnRleHRDcmVhdGVHTChkZXYsIHZlciwgdXNlRGVwdGgpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Db250ZXh0Q3JlYXRlKGludCBkZXYsIGludCB2ZXIpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkNvbnRleHRDcmVhdGUoaW50IGRldiwgaW50IHZlcikgeworICAgICAgICByZXR1cm4gcnNuQ29udGV4dENyZWF0ZShkZXYsIHZlcik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHREZXN0cm95KGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0RGVzdHJveSgpIHsKKyAgICAgICAgcnNuQ29udGV4dERlc3Ryb3kobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0U2V0U3VyZmFjZShpbnQgY29uLCBpbnQgdywgaW50IGgsIFN1cmZhY2Ugc3VyKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFNldFN1cmZhY2UoaW50IHcsIGludCBoLCBTdXJmYWNlIHN1cikgeworICAgICAgICByc25Db250ZXh0U2V0U3VyZmFjZShtQ29udGV4dCwgdywgaCwgc3VyKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dFNldFByaW9yaXR5KGludCBjb24sIGludCBwKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFNldFByaW9yaXR5KGludCBwKSB7CisgICAgICAgIHJzbkNvbnRleHRTZXRQcmlvcml0eShtQ29udGV4dCwgcCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHREdW1wKGludCBjb24sIGludCBiaXRzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dER1bXAoaW50IGJpdHMpIHsKKyAgICAgICAgcnNuQ29udGV4dER1bXAobUNvbnRleHQsIGJpdHMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0RmluaXNoKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0RmluaXNoKCkgeworICAgICAgICByc25Db250ZXh0RmluaXNoKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuVHlwZUJlZ2luKGludCBlbGVtZW50SUQpOwotICAgIG5hdGl2ZSB2b2lkIG5UeXBlQWRkKGludCBkaW0sIGludCB2YWwpOwotICAgIG5hdGl2ZSBpbnQgIG5UeXBlQ3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgblR5cGVGaW5hbERlc3Ryb3koVHlwZSB0KTsKLSAgICBuYXRpdmUgdm9pZCBuVHlwZVNldHVwRmllbGRzKFR5cGUgdCwgaW50W10gdHlwZXMsIGludFtdIGJpdHMsIEZpZWxkW10gSURzKTsKKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFJvb3RTY3JpcHQoaW50IGNvbiwgaW50IHNjcmlwdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUm9vdFNjcmlwdChpbnQgc2NyaXB0KSB7CisgICAgICAgIHJzbkNvbnRleHRCaW5kUm9vdFNjcmlwdChtQ29udGV4dCwgc2NyaXB0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRTYW1wbGVyKGludCBjb24sIGludCBzYW1wbGVyLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kU2FtcGxlcihpbnQgc2FtcGxlciwgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRTYW1wbGVyKG1Db250ZXh0LCBzYW1wbGVyLCBzbG90KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoaW50IGNvbiwgaW50IHBmcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGludCBwZnMpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUobUNvbnRleHQsIHBmcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBjb24sIGludCBwZik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBwZikgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChtQ29udGV4dCwgcGYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoaW50IGNvbiwgaW50IHB2KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KGludCBwdikgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgobUNvbnRleHQsIHB2KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGludCBjb24sIGludCBwcik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihpbnQgcHIpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKG1Db250ZXh0LCBwcik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRQYXVzZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFBhdXNlKCkgeworICAgICAgICByc25Db250ZXh0UGF1c2UobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0UmVzdW1lKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0UmVzdW1lKCkgeworICAgICAgICByc25Db250ZXh0UmVzdW1lKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKGludCB0eXBlKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihpbnQgdHlwZSwgQml0bWFwIGJtcCk7Ci0gICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSk7CisgICAgbmF0aXZlIHZvaWQgcnNuQXNzaWduTmFtZShpbnQgY29uLCBpbnQgb2JqLCBieXRlW10gbmFtZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFzc2lnbk5hbWUoaW50IG9iaiwgYnl0ZVtdIG5hbWUpIHsKKyAgICAgICAgcnNuQXNzaWduTmFtZShtQ29udGV4dCwgb2JqLCBuYW1lKTsKKyAgICB9CisgICAgbmF0aXZlIFN0cmluZyByc25HZXROYW1lKGludCBjb24sIGludCBvYmopOworICAgIHN5bmNocm9uaXplZCBTdHJpbmcgbkdldE5hbWUoaW50IG9iaikgeworICAgICAgICByZXR1cm4gcnNuR2V0TmFtZShtQ29udGV4dCwgb2JqKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuT2JqRGVzdHJveShpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5PYmpEZXN0cm95KGludCBpZCkgeworICAgICAgICByc25PYmpEZXN0cm95KG1Db250ZXh0LCBpZCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVPcGVuKGludCBjb24sIGJ5dGVbXSBuYW1lKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlT3BlbihieXRlW10gbmFtZSkgeworICAgICAgICByZXR1cm4gcnNuRmlsZU9wZW4obUNvbnRleHQsIG5hbWUpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGludCBhbGxvYywgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYmFzZU1pb0xldmVsKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCBhbGxvYyk7CisgICAgbmF0aXZlIGludCAgcnNuRWxlbWVudENyZWF0ZShpbnQgY29uLCBpbnQgdHlwZSwgaW50IGtpbmQsIGJvb2xlYW4gbm9ybSwgaW50IHZlY1NpemUpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkVsZW1lbnRDcmVhdGUoaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKSB7CisgICAgICAgIHJldHVybiByc25FbGVtZW50Q3JlYXRlKG1Db250ZXh0LCB0eXBlLCBraW5kLCBub3JtLCB2ZWNTaXplKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuRWxlbWVudENyZWF0ZTIoaW50IGNvbiwgaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzLCBpbnRbXSBhcnJheVNpemVzKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5FbGVtZW50Q3JlYXRlMihpbnRbXSBlbGVtZW50cywgU3RyaW5nW10gbmFtZXMsIGludFtdIGFycmF5U2l6ZXMpIHsKKyAgICAgICAgcmV0dXJuIHJzbkVsZW1lbnRDcmVhdGUyKG1Db250ZXh0LCBlbGVtZW50cywgbmFtZXMsIGFycmF5U2l6ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25FbGVtZW50R2V0TmF0aXZlRGF0YShpbnQgY29uLCBpbnQgaWQsIGludFtdIGVsZW1lbnREYXRhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuRWxlbWVudEdldE5hdGl2ZURhdGEoaW50IGlkLCBpbnRbXSBlbGVtZW50RGF0YSkgeworICAgICAgICByc25FbGVtZW50R2V0TmF0aXZlRGF0YShtQ29udGV4dCwgaWQsIGVsZW1lbnREYXRhKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuRWxlbWVudEdldFN1YkVsZW1lbnRzKGludCBjb24sIGludCBpZCwgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkVsZW1lbnRHZXRTdWJFbGVtZW50cyhpbnQgaWQsIGludFtdIElEcywgU3RyaW5nW10gbmFtZXMpIHsKKyAgICAgICAgcnNuRWxlbWVudEdldFN1YkVsZW1lbnRzKG1Db250ZXh0LCBpZCwgSURzLCBuYW1lcyk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBzaG9ydFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuVHlwZUJlZ2luKGludCBjb24sIGludCBlbGVtZW50SUQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5UeXBlQmVnaW4oaW50IGVsZW1lbnRJRCkgeworICAgICAgICByc25UeXBlQmVnaW4obUNvbnRleHQsIGVsZW1lbnRJRCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblR5cGVBZGQoaW50IGNvbiwgaW50IGRpbSwgaW50IHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVBZGQoaW50IGRpbSwgaW50IHZhbCkgeworICAgICAgICByc25UeXBlQWRkKG1Db250ZXh0LCBkaW0sIHZhbCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblR5cGVDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuVHlwZUNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblR5cGVDcmVhdGUobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25UeXBlR2V0TmF0aXZlRGF0YShpbnQgY29uLCBpbnQgaWQsIGludFtdIHR5cGVEYXRhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuVHlwZUdldE5hdGl2ZURhdGEoaW50IGlkLCBpbnRbXSB0eXBlRGF0YSkgeworICAgICAgICByc25UeXBlR2V0TmF0aXZlRGF0YShtQ29udGV4dCwgaWQsIHR5cGVEYXRhKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uUmVhZChpbnQgaWQsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uUmVhZChpbnQgaWQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViUmVhZEZyb21PYmplY3QoaW50IGlkLCBUeXBlIHQsIGludCBvZmZzZXQsIE9iamVjdCBvKTsKKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoaW50IGNvbiwgaW50IHR5cGUpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFsbG9jYXRpb25DcmVhdGVUeXBlZChpbnQgdHlwZSkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKG1Db250ZXh0LCB0eXBlKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoaW50IGNvbiwgaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIEJpdG1hcCBibXApIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKG1Db250ZXh0LCBkc3RGbXQsIGdlbk1pcHMsIGJtcCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoaW50IGNvbiwgaW50IHR5cGUsIEJpdG1hcCBibXApOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoaW50IHR5cGUsIEJpdG1hcCBibXApIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYobUNvbnRleHQsIHR5cGUsIGJtcCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoaW50IGNvbiwgaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXBCb3hlZChtQ29udGV4dCwgZHN0Rm10LCBnZW5NaXBzLCBibXApOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBjb24sIGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGFzc2V0U3RyZWFtKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGFzc2V0U3RyZWFtKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKG1Db250ZXh0LCBkc3RGbXQsIGdlbk1pcHMsIGFzc2V0U3RyZWFtKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24oaW50IGFkLCBpbnQgYWxsb2MpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMURTZXRDb25zdHJhaW50KGludCBhZCwgaW50IGRpbSwgaW50IHZhbHVlKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFERGF0YShpbnQgYWQsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMUREYXRhKGludCBhZCwgZmxvYXRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEU3ViRGF0YShpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIGludCAgbkFkYXB0ZXIxRENyZWF0ZSgpOworICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUoaW50IGNvbiwgaW50IGFsbG9jLCBib29sZWFuIGdlbk1pcHMsIGludCBiYXNlTWlvTGV2ZWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGludCBhbGxvYywgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYmFzZU1pb0xldmVsKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUobUNvbnRleHQsIGFsbG9jLCBnZW5NaXBzLCBiYXNlTWlvTGV2ZWwpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoaW50IGNvbiwgaW50IGFsbG9jKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCBhbGxvYykgeworICAgICAgICByc25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QobUNvbnRleHQsIGFsbG9jKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oaW50IGFkLCBpbnQgYWxsb2MpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMkRTZXRDb25zdHJhaW50KGludCBhZCwgaW50IGRpbSwgaW50IHZhbHVlKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJERGF0YShpbnQgYWQsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMkREYXRhKGludCBhZCwgZmxvYXRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJEU3ViRGF0YShpbnQgYWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJEU3ViRGF0YShpbnQgYWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSBpbnQgIG5BZGFwdGVyMkRDcmVhdGUoKTsKKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTFEKG1Db250ZXh0LCBpZCwgb2ZmLCBjb3VudCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgc2hvcnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgc2hvcnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQobUNvbnRleHQsIGlkLCBvZmYsIGNvdW50LCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGJ5dGVbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQobUNvbnRleHQsIGlkLCBvZmYsIGNvdW50LCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRWxlbWVudERhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCB4b2ZmLCBpbnQgY29tcElkeCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRWxlbWVudERhdGExRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgY29tcElkeCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQobUNvbnRleHQsIGlkLCB4b2ZmLCBjb21wSWR4LCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGExRChtQ29udGV4dCwgaWQsIG9mZiwgY291bnQsIGQsIHNpemVCeXRlcyk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckNvbG9yKGludCBzY3JpcHQsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckRlcHRoKGludCBzY3JpcHQsIGZsb2F0IGRlcHRoKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKGludCBzY3JpcHQsIGludCBzdGVuY2lsKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VGltZVpvbmUoaW50IHNjcmlwdCwgYnl0ZVtdIHRpbWVab25lKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VHlwZShpbnQgdHlwZSwgYm9vbGVhbiB3cml0YWJsZSwgU3RyaW5nIG5hbWUsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Um9vdChib29sZWFuIGlzUm9vdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldEludm9rYWJsZShTdHJpbmcgbmFtZSwgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRJbnZva2UoaW50IGlkLCBpbnQgc2xvdCk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgY29uLCBpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMkQobUNvbnRleHQsIGlkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTJEKGludCBjb24sIGludCBpZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMkQobUNvbnRleHQsIGlkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uUmVhZChpbnQgY29uLCBpbnQgaWQsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uUmVhZChpbnQgaWQsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblJlYWQobUNvbnRleHQsIGlkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblJlYWQoaW50IGNvbiwgaW50IGlkLCBmbG9hdFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uUmVhZChpbnQgaWQsIGZsb2F0W10gZCkgeworICAgICAgICByc25BbGxvY2F0aW9uUmVhZChtQ29udGV4dCwgaWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uR2V0VHlwZShpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFsbG9jYXRpb25HZXRUeXBlKGludCBpZCkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkdldFR5cGUobUNvbnRleHQsIGlkKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q0JlZ2luKCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENTZXRTY3JpcHQoYnl0ZVtdIHNjcmlwdCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7Ci0gICAgbmF0aXZlIGludCAgblNjcmlwdENDcmVhdGUoKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q0FkZERlZmluZUkzMihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q0FkZERlZmluZUYoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKTsKKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uUmVzaXplMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgZGltWCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25SZXNpemUxRChpbnQgaWQsIGludCBkaW1YKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25SZXNpemUxRChtQ29udGV4dCwgaWQsIGRpbVgpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uUmVzaXplMkQoaW50IGNvbiwgaW50IGlkLCBpbnQgZGltWCwgaW50IGRpbVkpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uUmVzaXplMkQoaW50IGlkLCBpbnQgZGltWCwgaW50IGRpbVkpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblJlc2l6ZTJEKG1Db250ZXh0LCBpZCwgZGltWCwgZGltWSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblNhbXBsZXJCZWdpbigpOwotICAgIG5hdGl2ZSB2b2lkIG5TYW1wbGVyU2V0KGludCBwYXJhbSwgaW50IHZhbHVlKTsKLSAgICBuYXRpdmUgaW50ICBuU2FtcGxlckNyZWF0ZSgpOworICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGNvbiwgaW50IGFzc2V0U3RyZWFtKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBhc3NldFN0cmVhbSkgeworICAgICAgICByZXR1cm4gcnNuRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShtQ29udGV4dCwgYXNzZXRTdHJlYW0pOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKGludCBjb24sIGludCBmaWxlQTNEKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKGludCBmaWxlQTNEKSB7CisgICAgICAgIHJldHVybiByc25GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKG1Db250ZXh0LCBmaWxlQTNEKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuRmlsZUEzREdldEluZGV4RW50cmllcyhpbnQgY29uLCBpbnQgZmlsZUEzRCwgaW50IG51bUVudHJpZXMsIGludFtdIElEcywgU3RyaW5nW10gbmFtZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKGludCBmaWxlQTNELCBpbnQgbnVtRW50cmllcywgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcykgeworICAgICAgICByc25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKG1Db250ZXh0LCBmaWxlQTNELCBudW1FbnRyaWVzLCBJRHMsIG5hbWVzKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuRmlsZUEzREdldEVudHJ5QnlJbmRleChpbnQgY29uLCBpbnQgZmlsZUEzRCwgaW50IGluZGV4KTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlQTNER2V0RW50cnlCeUluZGV4KGludCBmaWxlQTNELCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgobUNvbnRleHQsIGZpbGVBM0QsIGluZGV4KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihpbnQgaW4sIGludCBvdXQpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhpbnQgZnVuYyk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKGJvb2xlYW4gZW5hYmxlKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoaW50IHNyYywgaW50IGRzdCk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKGJvb2xlYW4gZW5hYmxlKTsKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoKTsKKyAgICBuYXRpdmUgaW50ICByc25Gb250Q3JlYXRlRnJvbUZpbGUoaW50IGNvbiwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgc2l6ZSwgaW50IGRwaSk7CisgICAgc3luY2hyb25pemVkIGludCBuRm9udENyZWF0ZUZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUsIGludCBkcGkpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZvbnRDcmVhdGVGcm9tRmlsZShtQ29udGV4dCwgZmlsZU5hbWUsIHNpemUsIGRwaSk7CisgICAgfQogCi0gICAgbmF0aXZlIGludCAgblByb2dyYW1SYXN0ZXJDcmVhdGUoaW50IGluLCBpbnQgb3V0LCBib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKGludCBwciwgZmxvYXQgdik7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoaW50IHByLCBmbG9hdCB2KTsKKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihpbnQgY29uLCBpbnQgYWQsIGludCBhbGxvYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKG1Db250ZXh0LCBhZCwgYWxsb2MpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMURTZXRDb25zdHJhaW50KGludCBjb24sIGludCBhZCwgaW50IGRpbSwgaW50IHZhbHVlKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSkgeworICAgICAgICByc25BZGFwdGVyMURTZXRDb25zdHJhaW50KG1Db250ZXh0LCBhZCwgZGltLCB2YWx1ZSk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxRERhdGEoaW50IGNvbiwgaW50IGFkLCBpbnRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFERGF0YShpbnQgYWQsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMUREYXRhKGludCBjb24sIGludCBhZCwgZmxvYXRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFERGF0YShpbnQgYWQsIGZsb2F0W10gZCkgeworICAgICAgICByc25BZGFwdGVyMUREYXRhKG1Db250ZXh0LCBhZCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGNvbiwgaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMURTdWJEYXRhKGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxRFN1YkRhdGEobUNvbnRleHQsIGFkLCBvZmYsIGNvdW50LCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFEU3ViRGF0YShpbnQgY29uLCBpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFEU3ViRGF0YShpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxRFN1YkRhdGEobUNvbnRleHQsIGFkLCBvZmYsIGNvdW50LCBkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWRhcHRlcjFEQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFkYXB0ZXIxRENyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFkYXB0ZXIxRENyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtQmluZFRleHR1cmUoaW50IHZwZiwgaW50IHNsb3QsIGludCBhKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IGFkLCBpbnQgYWxsb2MpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYykgeworICAgICAgICByc25BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihtQ29udGV4dCwgYWQsIGFsbG9jKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChpbnQgY29uLCBpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChtQ29udGV4dCwgYWQsIGRpbSwgdmFsdWUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkREYXRhKGludCBjb24sIGludCBhZCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJERGF0YShpbnQgY29uLCBpbnQgYWQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRTdWJEYXRhKGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU3ViRGF0YShtQ29udGV4dCwgYWQsIHhvZmYsIHlvZmYsIHcsIGgsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRFN1YkRhdGEobUNvbnRleHQsIGFkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWRhcHRlcjJEQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFkYXB0ZXIyRENyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFkYXB0ZXIyRENyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIGludCAgblByb2dyYW1GcmFnbWVudENyZWF0ZShpbnRbXSBwYXJhbXMpOwotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IHNjcmlwdCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24obUNvbnRleHQsIHNjcmlwdCwgYWxsb2MsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRTZXRUaW1lWm9uZShpbnQgY29uLCBpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRUaW1lWm9uZShpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpIHsKKyAgICAgICAgcnNuU2NyaXB0U2V0VGltZVpvbmUobUNvbnRleHQsIHNjcmlwdCwgdGltZVpvbmUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2UoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEludm9rZShpbnQgaWQsIGludCBzbG90KSB7CisgICAgICAgIHJzblNjcmlwdEludm9rZShtQ29udGV4dCwgaWQsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2VWKGludCBjb24sIGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRJbnZva2VWKGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpIHsKKyAgICAgICAgcnNuU2NyaXB0SW52b2tlVihtQ29udGV4dCwgaWQsIHNsb3QsIHBhcmFtcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdFNldFZhckkoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdFNldFZhckkoaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJJKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyRihpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBmbG9hdCB2YWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRWYXJGKGludCBpZCwgaW50IHNsb3QsIGZsb2F0IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJGKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyRChpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBkb3VibGUgdmFsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0U2V0VmFyRChpbnQgaWQsIGludCBzbG90LCBkb3VibGUgdmFsKSB7CisgICAgICAgIHJzblNjcmlwdFNldFZhckQobUNvbnRleHQsIGlkLCBzbG90LCB2YWwpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRTZXRWYXJWKGludCBjb24sIGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSB2YWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRWYXJWKGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSB2YWwpIHsKKyAgICAgICAgcnNuU2NyaXB0U2V0VmFyVihtQ29udGV4dCwgaWQsIHNsb3QsIHZhbCk7CisgICAgfQogCi0gICAgbmF0aXZlIGludCAgblByb2dyYW1WZXJ0ZXhDcmVhdGUoYm9vbGVhbiB0ZXhNYXQpOwotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtVmVydGV4Q3JlYXRlMihTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdENCZWdpbihpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0Q0JlZ2luKCkgeworICAgICAgICByc25TY3JpcHRDQmVnaW4obUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRDU2V0U2NyaXB0KGludCBjb24sIGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRDU2V0U2NyaXB0KGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgcnNuU2NyaXB0Q1NldFNjcmlwdChtQ29udGV4dCwgc2NyaXB0LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblNjcmlwdENDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuU2NyaXB0Q0NyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblNjcmlwdENDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5MaWdodEJlZ2luKCk7Ci0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0SXNNb25vKGJvb2xlYW4gaXNNb25vKTsKLSAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRJc0xvY2FsKGJvb2xlYW4gaXNMb2NhbCk7Ci0gICAgbmF0aXZlIGludCAgbkxpZ2h0Q3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0Q29sb3IoaW50IGwsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpOwotICAgIG5hdGl2ZSB2b2lkIG5MaWdodFNldFBvc2l0aW9uKGludCBsLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICBuYXRpdmUgdm9pZCByc25TYW1wbGVyQmVnaW4oaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJCZWdpbigpIHsKKyAgICAgICAgcnNuU2FtcGxlckJlZ2luKG1Db250ZXh0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2FtcGxlclNldChpbnQgY29uLCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJTZXQoaW50IHBhcmFtLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuU2FtcGxlclNldChtQ29udGV4dCwgcGFyYW0sIHZhbHVlKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2FtcGxlclNldDIoaW50IGNvbiwgaW50IHBhcmFtLCBmbG9hdCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJTZXQyKGludCBwYXJhbSwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgcnNuU2FtcGxlclNldDIobUNvbnRleHQsIHBhcmFtLCB2YWx1ZSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblNhbXBsZXJDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuU2FtcGxlckNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblNhbXBsZXJDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5TaW1wbGVNZXNoQ3JlYXRlKGludCBiYXRjaElELCBpbnQgaWR4SUQsIGludFtdIHZ0eElELCBpbnQgcHJpbSk7Ci0gICAgbmF0aXZlIHZvaWQgblNpbXBsZU1lc2hCaW5kVmVydGV4KGludCBpZCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNpbXBsZU1lc2hCaW5kSW5kZXgoaW50IGlkLCBpbnQgYWxsb2MpOworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZUJlZ2luKGludCBjb24sIGludCBpbiwgaW50IG91dCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJlZ2luKGludCBpbiwgaW50IG91dCkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVCZWdpbihtQ29udGV4dCwgaW4sIG91dCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgY29uLCBpbnQgZnVuYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgZnVuYykgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMobUNvbnRleHQsIGZ1bmMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEZXB0aE1hc2soaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2soaW50IGNvbiwgYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2sobUNvbnRleHQsIHIsIGcsIGIsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoaW50IGNvbiwgaW50IHNyYywgaW50IGRzdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJsZW5kRnVuYyhpbnQgc3JjLCBpbnQgZHN0KSB7CisgICAgICAgIHJzblByb2dyYW1TdG9yZUJsZW5kRnVuYyhtQ29udGV4dCwgc3JjLCBkc3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEaXRoZXIoaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEaXRoZXIoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGl0aGVyKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtU3RvcmVDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVN0b3JlQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbVN0b3JlQ3JlYXRlKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQW5pbWF0aW9uQmVnaW4oaW50IGF0dHJpYkNvdW50LCBpbnQga2V5ZnJhbWVDb3VudCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFuaW1hdGlvbkFkZChmbG9hdCB0aW1lLCBmbG9hdFtdIGF0dHJpYnMpOwotICAgIG5hdGl2ZSBpbnQgIG5BbmltYXRpb25DcmVhdGUoKTsKKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtUmFzdGVyQ3JlYXRlKGludCBjb24sIGJvb2xlYW4gcG9pbnRTbW9vdGgsIGJvb2xlYW4gbGluZVNtb290aCwgYm9vbGVhbiBwb2ludFNwcml0ZSk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVJhc3RlckNyZWF0ZShib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1SYXN0ZXJDcmVhdGUobUNvbnRleHQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoaW50IGNvbiwgaW50IHByLCBmbG9hdCB2KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChpbnQgcHIsIGZsb2F0IHYpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChtQ29udGV4dCwgcHIsIHYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoaW50IGNvbiwgaW50IHByLCBpbnQgbW9kZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShpbnQgcHIsIGludCBtb2RlKSB7CisgICAgICAgIHJzblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShtQ29udGV4dCwgcHIsIG1vZGUpOworICAgIH0KKworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBjb24sIGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtQmluZENvbnN0YW50cyhpbnQgcHYsIGludCBzbG90LCBpbnQgbUlEKSB7CisgICAgICAgIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKG1Db250ZXh0LCBwdiwgc2xvdCwgbUlEKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKGludCBjb24sIGludCB2cGYsIGludCBzbG90LCBpbnQgYSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1CaW5kVGV4dHVyZShpbnQgdnBmLCBpbnQgc2xvdCwgaW50IGEpIHsKKyAgICAgICAgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKG1Db250ZXh0LCB2cGYsIHNsb3QsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtQmluZFNhbXBsZXIoaW50IGNvbiwgaW50IHZwZiwgaW50IHNsb3QsIGludCBzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcykgeworICAgICAgICByc25Qcm9ncmFtQmluZFNhbXBsZXIobUNvbnRleHQsIHZwZiwgc2xvdCwgcyk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblByb2dyYW1GcmFnbWVudENyZWF0ZShpbnQgY29uLCBTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCBpbnQgblByb2dyYW1GcmFnbWVudENyZWF0ZShTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1GcmFnbWVudENyZWF0ZShtQ29udGV4dCwgc2hhZGVyLCBwYXJhbXMpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtVmVydGV4Q3JlYXRlKGludCBjb24sIFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcyk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVZlcnRleENyZWF0ZShTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1WZXJ0ZXhDcmVhdGUobUNvbnRleHQsIHNoYWRlciwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBuYXRpdmUgaW50ICByc25NZXNoQ3JlYXRlKGludCBjb24sIGludCB2dHhDb3VudCwgaW50IGluZGV4Q291bnQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbk1lc2hDcmVhdGUoaW50IHZ0eENvdW50LCBpbnQgaW5kZXhDb3VudCkgeworICAgICAgICByZXR1cm4gcnNuTWVzaENyZWF0ZShtQ29udGV4dCwgdnR4Q291bnQsIGluZGV4Q291bnQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25NZXNoQmluZFZlcnRleChpbnQgY29uLCBpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5NZXNoQmluZFZlcnRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuTWVzaEJpbmRWZXJ0ZXgobUNvbnRleHQsIGlkLCBhbGxvYywgc2xvdCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hCaW5kSW5kZXgoaW50IGNvbiwgaW50IGlkLCBpbnQgYWxsb2MsIGludCBwcmltLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hCaW5kSW5kZXgoaW50IGlkLCBpbnQgYWxsb2MsIGludCBwcmltLCBpbnQgc2xvdCkgeworICAgICAgICByc25NZXNoQmluZEluZGV4KG1Db250ZXh0LCBpZCwgYWxsb2MsIHByaW0sIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoaW50IGlkKSB7CisgICAgICAgIHJldHVybiByc25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQobUNvbnRleHQsIGlkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuTWVzaEdldEluZGV4Q291bnQoaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5NZXNoR2V0SW5kZXhDb3VudChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHJzbk1lc2hHZXRJbmRleENvdW50KG1Db250ZXh0LCBpZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hHZXRWZXJ0aWNlcyhpbnQgY29uLCBpbnQgaWQsIGludFtdIHZ0eElkcywgaW50IHZ0eElkQ291bnQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5NZXNoR2V0VmVydGljZXMoaW50IGlkLCBpbnRbXSB2dHhJZHMsIGludCB2dHhJZENvdW50KSB7CisgICAgICAgIHJzbk1lc2hHZXRWZXJ0aWNlcyhtQ29udGV4dCwgaWQsIHZ0eElkcywgdnR4SWRDb3VudCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hHZXRJbmRpY2VzKGludCBjb24sIGludCBpZCwgaW50W10gaWR4SWRzLCBpbnRbXSBwcmltaXRpdmVzLCBpbnQgdnR4SWRDb3VudCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hHZXRJbmRpY2VzKGludCBpZCwgaW50W10gaWR4SWRzLCBpbnRbXSBwcmltaXRpdmVzLCBpbnQgdnR4SWRDb3VudCkgeworICAgICAgICByc25NZXNoR2V0SW5kaWNlcyhtQ29udGV4dCwgaWQsIGlkeElkcywgcHJpbWl0aXZlcywgdnR4SWRDb3VudCk7CisgICAgfQorCiAKICAgICBwcm90ZWN0ZWQgaW50ICAgICBtRGV2OwogICAgIHByb3RlY3RlZCBpbnQgICAgIG1Db250ZXh0OwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJvdGVjdGVkIE1lc3NhZ2VUaHJlYWQgbU1lc3NhZ2VUaHJlYWQ7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTg7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0k4OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VMTY7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0kxNjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTMyOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9JMzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0YzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1U4OworICAgIEVsZW1lbnQgbUVsZW1lbnRfSTg7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9JNjQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9GMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GNjQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9CT09MRUFOOworCisgICAgRWxlbWVudCBtRWxlbWVudF9FTEVNRU5UOworICAgIEVsZW1lbnQgbUVsZW1lbnRfVFlQRTsKKyAgICBFbGVtZW50IG1FbGVtZW50X0FMTE9DQVRJT047CisgICAgRWxlbWVudCBtRWxlbWVudF9TQU1QTEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfU0NSSVBUOworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUVTSDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9QUk9HUkFNX1ZFUlRFWDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fUkFTVEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9TVE9SRTsKIAogICAgIEVsZW1lbnQgbUVsZW1lbnRfQV84OwogICAgIEVsZW1lbnQgbUVsZW1lbnRfUkdCXzU2NTsKQEAgLTIxMCwxMyArNTMzLDM4IEBACiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzQ0NDQ7CiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzg4ODg7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X0lOREVYXzE2OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfUE9TSVRJT05fMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1BPU0lUSU9OXzM7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9URVhUVVJFXzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9OT1JNQUxfMzsKLSAgICBFbGVtZW50IG1FbGVtZW50X0NPTE9SX1U4XzQ7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9DT0xPUl9GMzJfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X0ZMT0FUXzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GTE9BVF8zOworICAgIEVsZW1lbnQgbUVsZW1lbnRfRkxPQVRfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1VDSEFSXzQ7CisKKyAgICBFbGVtZW50IG1FbGVtZW50X01BVFJJWF80WDQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9NQVRSSVhfM1gzOworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUFUUklYXzJYMjsKKworICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9ORUFSRVNUOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSOworCisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEg7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEU7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fVEVTVDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEU7CisKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSzsKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQ7CisgICAgUHJvZ3JhbVJhc3RlciBtUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkU7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vCkBAIC0yNjQsMjUgKzYxMiwzMiBAQAogICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbi4gIFRoZSBmaW5hbCBzb2x1dGlvbiB3aWxsCiAgICAgICAgICAgICAvLyB1c2VkIHR5cGVkIGFsbG9jYXRpb25zIHdoZXJlIHRoZSBtZXNzYWdlIGlkIGlzIHRoZSB0eXBlIGluZGljYXRvci4KICAgICAgICAgICAgIGludFtdIHJidWYgPSBuZXcgaW50WzE2XTsKLSAgICAgICAgICAgIG1SUy5uQ29udGV4dEluaXRUb0NsaWVudCgpOworICAgICAgICAgICAgbVJTLm5Db250ZXh0SW5pdFRvQ2xpZW50KG1SUy5tQ29udGV4dCk7CiAgICAgICAgICAgICB3aGlsZShtUnVuKSB7Ci0gICAgICAgICAgICAgICAgaW50IG1zZyA9IG1SUy5uQ29udGV4dEdldE1lc3NhZ2UocmJ1ZiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1zZyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBvbmx5IGhhcHBlbiBkdXJpbmcgdGVhcmRvd24uCi0gICAgICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSB3YW50IHRvIGF2b2lkIHN0YXJ2aW5nIG90aGVyIHRocmVhZHMgZHVyaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHRlYXJkb3duIGJ5IHlpZWxkaW5nIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGRlc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGV4ZWN1dGUgdG8gc2V0IG1SdW4gPSBmYWxzZQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJidWZbMF0gPSAwOworICAgICAgICAgICAgICAgIGludCBtc2cgPSBtUlMubkNvbnRleHRHZXRNZXNzYWdlKG1SUy5tQ29udGV4dCwgcmJ1ZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKChtc2cgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGhhcHBlbiBmb3IgdHdvIHJlYXNvbnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJidWZbMF0gPiAwICYmIG1SdW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE6IEJ1ZmZlciBuZWVkcyB0byBiZSBlbmxhcmdlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJidWYgPSBuZXcgaW50W3JidWZbMF0gKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI6IHRlYXJkb3duLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnV0IHdlIHdhbnQgdG8gYXZvaWQgc3RhcnZpbmcgb3RoZXIgdGhyZWFkcyBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlYXJkb3duIGJ5IHlpZWxkaW5nIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGRlc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBleGVjdXRlIHRvIHNldCBtUnVuID0gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYobVJTLm1NZXNzYWdlQ2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjay5tRGF0YSA9IHJidWY7CiAgICAgICAgICAgICAgICAgICAgIG1SUy5tTWVzc2FnZUNhbGxiYWNrLm1JRCA9IG1zZzsKICAgICAgICAgICAgICAgICAgICAgbVJTLm1NZXNzYWdlQ2FsbGJhY2sucnVuKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vTG9nLmQoTE9HX1RBRywgIk1lc3NhZ2VUaHJlYWQgbXNnICIgKyBtc2cgKyAiIHYxICIgKyByYnVmWzBdICsgIiB2MiAiICsgcmJ1ZlsxXSArICIgdjMgIiArcmJ1ZlsyXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiTWVzc2FnZVRocmVhZCBleGl0aW5nLiIpOwogICAgICAgICB9CkBAIC0zMDcsMTIgKzY2MiwyMCBAQAogICAgICAgICBuQ29udGV4dER1bXAoYml0cyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBuQ29udGV4dEZpbmlzaCgpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIG5Db250ZXh0RGVpbml0VG9DbGllbnQoKTsKKyAgICAgICAgbkNvbnRleHREZWluaXRUb0NsaWVudChtQ29udGV4dCk7CiAgICAgICAgIG1NZXNzYWdlVGhyZWFkLm1SdW4gPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1NZXNzYWdlVGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotICAgICAgICBuQ29udGV4dERlc3Ryb3kobUNvbnRleHQpOworICAgICAgICBuQ29udGV4dERlc3Ryb3koKTsKICAgICAgICAgbUNvbnRleHQgPSAwOwogCiAgICAgICAgIG5EZXZpY2VEZXN0cm95KG1EZXYpOwpAQCAtMzM1LDMgKzY5OCw0IEBACiB9CiAKIAorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEKaW5kZXggZDFkZjIzZC4uNjFlY2M4ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YQpAQCAtNzQsOSArNzQsOSBAQAogICAgICAgICBuQ29udGV4dEJpbmRSb290U2NyaXB0KHNhZmVJRChzKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgcCkgeworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKFByb2dyYW1TdG9yZSBwKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKHNhZmVJRChwKSk7CisgICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1TdG9yZShzYWZlSUQocCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KFByb2dyYW1GcmFnbWVudCBwKSB7CkBAIC0xMDIsOCArMTAyLDcgQEAKIAogICAgIHB1YmxpYyBjbGFzcyBGaWxlIGV4dGVuZHMgQmFzZU9iaiB7CiAgICAgICAgIEZpbGUoaW50IGlkKSB7Ci0gICAgICAgICAgICBzdXBlcihSZW5kZXJTY3JpcHRHTC50aGlzKTsKLSAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgc3VwZXIoaWQsIFJlbmRlclNjcmlwdEdMLnRoaXMpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NhbXBsZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCmluZGV4IDQwYmE3MjIuLmI2MjcyMDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCkBAIC00NywxMCArNDcsODIgQEAKICAgICB9CiAKICAgICBTYW1wbGVyKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIENMQU1QX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX0NMQU1QX05FQVJFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9ORUFSRVNUID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgQ0xBTVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBDTEFNUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfQ0xBTVBfTElORUFSX01JUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBXUkFQX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX1dSQVBfTkVBUkVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1QgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIFdSQVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9XUkFQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLldSQVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfV1JBUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUjsKKyAgICB9CisKKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIFZhbHVlIG1NaW47CkBAIC01OCw2ICsxMzAsNyBAQAogICAgICAgICBWYWx1ZSBtV3JhcFM7CiAgICAgICAgIFZhbHVlIG1XcmFwVDsKICAgICAgICAgVmFsdWUgbVdyYXBSOworICAgICAgICBmbG9hdCBtQW5pc287CiAKICAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBtUlMgPSByczsKQEAgLTY2LDYgKzEzOSw3IEBACiAgICAgICAgICAgICBtV3JhcFMgPSBWYWx1ZS5XUkFQOwogICAgICAgICAgICAgbVdyYXBUID0gVmFsdWUuV1JBUDsKICAgICAgICAgICAgIG1XcmFwUiA9IFZhbHVlLldSQVA7CisgICAgICAgICAgICBtQW5pc28gPSAxLjBmOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0TWluKFZhbHVlIHYpIHsKQEAgLTExMCw2ICsxODQsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFuaXNvdHJvcHkoZmxvYXQgdikgeworICAgICAgICAgICAgaWYodiA+PSAwLjBmKSB7CisgICAgICAgICAgICAgICAgbUFuaXNvID0gdjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB2YWx1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBTYW1wbGVyIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7CiAgICAgICAgICAgICBycy5uU2FtcGxlckJlZ2luKCk7CiAgICAgICAgICAgICBycy5uU2FtcGxlclNldCgwLCBiLm1NaW4ubUlEKTsKQEAgLTExNyw2ICsxOTksNyBAQAogICAgICAgICAgICAgcnMublNhbXBsZXJTZXQoMiwgYi5tV3JhcFMubUlEKTsKICAgICAgICAgICAgIHJzLm5TYW1wbGVyU2V0KDMsIGIubVdyYXBULm1JRCk7CiAgICAgICAgICAgICBycy5uU2FtcGxlclNldCg0LCBiLm1XcmFwUi5tSUQpOworICAgICAgICAgICAgcnMublNhbXBsZXJTZXQyKDUsIGIubUFuaXNvKTsKICAgICAgICAgICAgIGludCBpZCA9IHJzLm5TYW1wbGVyQ3JlYXRlKCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFNhbXBsZXIoaWQsIHJzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKaW5kZXggNTdjY2ZhMy4uODc3MmM0YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCkBAIC00MiwyOSArNDIsNTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCkgeworICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCwgRmllbGRQYWNrZXIgdikgeworICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZVYobUlELCBzbG90LCB2LmdldERhdGEoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgICAgICB9CisgICAgfQorCisKICAgICBTY3JpcHQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBiaW5kQWxsb2NhdGlvbihBbGxvY2F0aW9uIHZhLCBpbnQgc2xvdCkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRCaW5kQWxsb2NhdGlvbihtSUQsIHZhLm1JRCwgc2xvdCk7CisgICAgICAgIGlmICh2YSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEJpbmRBbGxvY2F0aW9uKG1JRCwgdmEubUlELCBzbG90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0QmluZEFsbG9jYXRpb24obUlELCAwLCBzbG90KTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldENsZWFyQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRTZXRDbGVhckNvbG9yKG1JRCwgciwgZywgYiwgYSk7CisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgZmxvYXQgdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhckYobUlELCBpbmRleCwgdik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2xlYXJEZXB0aChmbG9hdCBkKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdFNldENsZWFyRGVwdGgobUlELCBkKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBkb3VibGUgdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhckQobUlELCBpbmRleCwgdik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2xlYXJTdGVuY2lsKGludCBzdGVuY2lsKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdFNldENsZWFyU3RlbmNpbChtSUQsIHN0ZW5jaWwpOworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIGludCB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFySShtSUQsIGluZGV4LCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBib29sZWFuIHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJJKG1JRCwgaW5kZXgsIHYgPyAxIDogMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgRmllbGRQYWNrZXIgdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhclYobUlELCBpbmRleCwgdi5nZXREYXRhKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVab25lKFN0cmluZyB0aW1lWm9uZSkgewpAQCAtNzgsNzIgKzk5LDU0IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBib29sZWFuIG1Jc1Jvb3QgPSBmYWxzZTsKLSAgICAgICAgVHlwZVtdIG1UeXBlczsKLSAgICAgICAgU3RyaW5nW10gbU5hbWVzOwotICAgICAgICBib29sZWFuW10gbVdyaXRhYmxlOwotICAgICAgICBpbnQgbUludm9rYWJsZUNvdW50ID0gMDsKLSAgICAgICAgSW52b2thYmxlW10gbUludm9rYWJsZXM7CiAKICAgICAgICAgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVR5cGVzID0gbmV3IFR5cGVbTUFYX1NMT1RdOwotICAgICAgICAgICAgbU5hbWVzID0gbmV3IFN0cmluZ1tNQVhfU0xPVF07Ci0gICAgICAgICAgICBtV3JpdGFibGUgPSBuZXcgYm9vbGVhbltNQVhfU0xPVF07Ci0gICAgICAgICAgICBtSW52b2thYmxlcyA9IG5ldyBJbnZva2FibGVbTUFYX1NMT1RdOwogICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHQsIGludCBzbG90KSB7Ci0gICAgICAgICAgICBtVHlwZXNbc2xvdF0gPSB0OwotICAgICAgICAgICAgbU5hbWVzW3Nsb3RdID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0LCBTdHJpbmcgbmFtZSwgaW50IHNsb3QpIHsKLSAgICAgICAgICAgIG1UeXBlc1tzbG90XSA9IHQ7Ci0gICAgICAgICAgICBtTmFtZXNbc2xvdF0gPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEludm9rYWJsZSBhZGRJbnZva2FibGUoU3RyaW5nIGZ1bmMpIHsKLSAgICAgICAgICAgIEludm9rYWJsZSBpID0gbmV3IEludm9rYWJsZSgpOwotICAgICAgICAgICAgaS5tTmFtZSA9IGZ1bmM7Ci0gICAgICAgICAgICBpLm1SUyA9IG1SUzsKLSAgICAgICAgICAgIGkubVNsb3QgPSBtSW52b2thYmxlQ291bnQ7Ci0gICAgICAgICAgICBtSW52b2thYmxlc1ttSW52b2thYmxlQ291bnQrK10gPSBpOwotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGJvb2xlYW4gd3JpdGFibGUsIGludCBzbG90KSB7Ci0gICAgICAgICAgICBtV3JpdGFibGVbc2xvdF0gPSB3cml0YWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdHJhbnNmZXJDcmVhdGUoKSB7Ci0gICAgICAgICAgICBtUlMublNjcmlwdFNldFJvb3QobUlzUm9vdCk7Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbVR5cGVzLmxlbmd0aDsgY3QrKykgewotICAgICAgICAgICAgICAgIGlmKG1UeXBlc1tjdF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUlMublNjcmlwdFNldFR5cGUobVR5cGVzW2N0XS5tSUQsIG1Xcml0YWJsZVtjdF0sIG1OYW1lc1tjdF0sIGN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUludm9rYWJsZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgbVJTLm5TY3JpcHRTZXRJbnZva2FibGUobUludm9rYWJsZXNbY3RdLm1OYW1lLCBjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRyYW5zZmVyT2JqZWN0KFNjcmlwdCBzKSB7Ci0gICAgICAgICAgICBzLm1Jc1Jvb3QgPSBtSXNSb290OwotICAgICAgICAgICAgcy5tVHlwZXMgPSBtVHlwZXM7Ci0gICAgICAgICAgICBzLm1JbnZva2FibGVzID0gbmV3IEludm9rYWJsZVttSW52b2thYmxlQ291bnRdOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1JbnZva2FibGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIHMubUludm9rYWJsZXNbY3RdID0gbUludm9rYWJsZXNbY3RdOwotICAgICAgICAgICAgICAgIHMubUludm9rYWJsZXNbY3RdLm1TY3JpcHQgPSBzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy5tSW52b2thYmxlcyA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb290KGJvb2xlYW4gcikgewotICAgICAgICAgICAgbUlzUm9vdCA9IHI7Ci0gICAgICAgIH0KLQogICAgIH0KIAorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZEJhc2UgeworICAgICAgICBwcm90ZWN0ZWQgRWxlbWVudCBtRWxlbWVudDsKKyAgICAgICAgcHJvdGVjdGVkIFR5cGUgbVR5cGU7CisgICAgICAgIHByb3RlY3RlZCBBbGxvY2F0aW9uIG1BbGxvY2F0aW9uOworCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoUmVuZGVyU2NyaXB0IHJzLCBpbnQgZGlteCkgeworICAgICAgICAgICAgbUFsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBtRWxlbWVudCwgZGlteCk7CisgICAgICAgICAgICBtVHlwZSA9IG1BbGxvY2F0aW9uLmdldFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBGaWVsZEJhc2UoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1FbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldEFsbG9jYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUFsbG9jYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvL0BPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBbGxvY2F0aW9uKCkgeworICAgICAgICB9CisKKworICAgICAgICAvLworICAgICAgICAvKgorICAgICAgICBwdWJsaWMgY2xhc3MgU2NyaXB0RmllbGRfVXNlckZpZWxkCisgICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdC5GaWVsZEJhc2UgeworCisgICAgICAgICAgICBwcm90ZWN0ZWQKKworICAgICAgICB9CisKKyAgICAgICAgKi8KKworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YQppbmRleCBiYjk5ZTIzLi41OTU5YmU0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YQpAQCAtMzcsMTEgKzM3LDQ5IEBACiAgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIFNjcmlwdEMoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgcmVzb3VyY2VJRCwgYm9vbGVhbiBpc1Jvb3QpIHsKKyAgICAgICAgc3VwZXIoMCwgcnMpOworICAgICAgICBtSUQgPSBpbnRlcm5hbENyZWF0ZShycywgcmVzb3VyY2VzLCByZXNvdXJjZUlEKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBpbnQgaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICBieXRlW10gcGdtOworICAgICAgICBpbnQgcGdtTGVuZ3RoOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHJlc291cmNlcy5vcGVuUmF3UmVzb3VyY2UocmVzb3VyY2VJRCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBnbSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgIHBnbUxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gcGdtLmxlbmd0aCAtIHBnbUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlW3BnbS5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGdtLCAwLCBidWYyLCAwLCBwZ20ubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBnbSA9IGJ1ZjI7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0xlZnQgPSBwZ20ubGVuZ3RoIC0gcGdtTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSBpcy5yZWFkKHBnbSwgcGdtTGVuZ3RoLCBieXRlc0xlZnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBnbUxlbmd0aCArPSBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJzLm5TY3JpcHRDQmVnaW4oKTsKKyAgICAgICAgcnMublNjcmlwdENTZXRTY3JpcHQocGdtLCAwLCBwZ21MZW5ndGgpOworICAgICAgICByZXR1cm4gcnMublNjcmlwdENDcmVhdGUoKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBTY3JpcHQuQnVpbGRlciB7CiAgICAgICAgIGJ5dGVbXSBtUHJvZ3JhbTsKICAgICAgICAgaW50IG1Qcm9ncmFtTGVuZ3RoOwotICAgICAgICBIYXNoTWFwPFN0cmluZyxJbnRlZ2VyPiBtSW50RGVmaW5lcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLEZsb2F0PiBtRmxvYXREZWZpbmVzID0gbmV3IEhhc2hNYXAoKTsKIAogICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgICAgIHN1cGVyKHJzKTsKQEAgLTkyLDY2ICsxMzAsMjAgQEAKIAogICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIFNjcmlwdEMgaW50ZXJuYWxDcmVhdGUoQnVpbGRlciBiKSB7CiAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q0JlZ2luKCk7Ci0gICAgICAgICAgICBiLnRyYW5zZmVyQ3JlYXRlKCk7CiAKLSAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLEludGVnZXI+IGU6IGIubUludERlZmluZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDQWRkRGVmaW5lSTMyKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLEZsb2F0PiBlOiBiLm1GbG9hdERlZmluZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDQWRkRGVmaW5lRihlLmdldEtleSgpLCBlLmdldFZhbHVlKCkuZmxvYXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJsZW4gPSAiICsgYi5tUHJvZ3JhbUxlbmd0aCk7CiAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q1NldFNjcmlwdChiLm1Qcm9ncmFtLCAwLCBiLm1Qcm9ncmFtTGVuZ3RoKTsKIAogICAgICAgICAgICAgaW50IGlkID0gYi5tUlMublNjcmlwdENDcmVhdGUoKTsKICAgICAgICAgICAgIFNjcmlwdEMgb2JqID0gbmV3IFNjcmlwdEMoaWQsIGIubVJTKTsKLSAgICAgICAgICAgIGIudHJhbnNmZXJPYmplY3Qob2JqKTsKLQogICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0gICAgICAgICAgICBtSW50RGVmaW5lcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotICAgICAgICAgICAgbUZsb2F0RGVmaW5lcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRha2VzIHRoZSBhbGwgcHVibGljIHN0YXRpYyBmaW5hbCBmaWVsZHMgZm9yIGEgY2xhc3MsIGFuZCBhZGRzIGRlZmluZXMKLSAgICAgICAgICogZm9yIHRoZW0sIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhcyB0aGUgbmFtZSBvZiB0aGUgZGVmaW5lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhDbGFzcyBjbCkgewotICAgICAgICAgICAgYWRkRGVmaW5lcyhjbC5nZXRGaWVsZHMoKSwgKE1vZGlmaWVyLlNUQVRJQyB8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuUFVCTElDKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGFrZXMgdGhlIGFsbCBwdWJsaWMgZmllbGRzIGZvciBhbiBvYmplY3QsIGFuZCBhZGRzIGRlZmluZXMKLSAgICAgICAgICogZm9yIHRoZW0sIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhcyB0aGUgbmFtZSBvZiB0aGUgZGVmaW5lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhPYmplY3QgbykgewotICAgICAgICAgICAgYWRkRGVmaW5lcyhvLmdldENsYXNzKCkuZ2V0RmllbGRzKCksIE1vZGlmaWVyLlBVQkxJQywgbyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZERlZmluZXMoRmllbGRbXSBmaWVsZHMsIGludCBtYXNrLCBPYmplY3QgbykgewotICAgICAgICAgICAgZm9yIChGaWVsZCBmOiBmaWVsZHMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGYuZ2V0TW9kaWZpZXJzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyB0ID0gZi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50RGVmaW5lcy5wdXQoZi5nZXROYW1lKCksIGYuZ2V0SW50KG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHQgPT0gZmxvYXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxvYXREZWZpbmVzLnB1dChmLmdldE5hbWUoKSwgZi5nZXRGbG9hdChvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IERvIHdlIHdhbnQgdGhpcyBsb2c/Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZERlZmluZXMgc2tpcHBpbmcgZmllbGQgIiArIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoQ2xhc3MgY2wpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoT2JqZWN0IG8pIHt9CisgICAgICAgIHZvaWQgYWRkRGVmaW5lcyhGaWVsZFtdIGZpZWxkcywgaW50IG1hc2ssIE9iamVjdCBvKSB7fQogCiAgICAgICAgIHB1YmxpYyBTY3JpcHRDIGNyZWF0ZSgpIHsKICAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbENyZWF0ZSh0aGlzKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjgwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0Mi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIFNob3J0MiB7CisgICAgcHVibGljIFNob3J0MigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgeDsKKyAgICBwdWJsaWMgc2hvcnQgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5YzMwNQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgU2hvcnQzIHsKKyAgICBwdWJsaWMgU2hvcnQzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCB4OworICAgIHB1YmxpYyBzaG9ydCB5OworICAgIHB1YmxpYyBzaG9ydCB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0NC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ3NGUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBTaG9ydDQgeworICAgIHB1YmxpYyBTaG9ydDQoKSB7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CisgICAgcHVibGljIHNob3J0IHo7CisgICAgcHVibGljIHNob3J0IHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NpbXBsZU1lc2guamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTIxN2E5Li4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFNpbXBsZU1lc2ggZXh0ZW5kcyBCYXNlT2JqIHsKLSAgICBUeXBlW10gbVZlcnRleFR5cGVzOwotICAgIFR5cGUgbUluZGV4VHlwZTsKLSAgICAvL1R5cGUgbUJhdGNoZVR5cGU7Ci0gICAgUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0KLSAgICBTaW1wbGVNZXNoKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmluZFZlcnRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhLCBpbnQgc2xvdCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TaW1wbGVNZXNoQmluZFZlcnRleChtSUQsIGEubUlELCBzbG90KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiaW5kSW5kZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TaW1wbGVNZXNoQmluZEluZGV4KG1JRCwgYS5tSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvY2F0aW9uIGNyZWF0ZVZlcnRleEFsbG9jYXRpb24oaW50IHNsb3QpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVZlcnRleFR5cGVzW3Nsb3RdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb2NhdGlvbiBjcmVhdGVJbmRleEFsbG9jYXRpb24oKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1JbmRleFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldFZlcnRleFR5cGUoaW50IHNsb3QpIHsKLSAgICAgICAgcmV0dXJuIG1WZXJ0ZXhUeXBlc1tzbG90XTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZSBnZXRJbmRleFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtSW5kZXhUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0KLSAgICAgICAgY2xhc3MgRW50cnkgewotICAgICAgICAgICAgVHlwZSB0OwotICAgICAgICAgICAgRWxlbWVudCBlOwotICAgICAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbVZlcnRleFR5cGVDb3VudDsKLSAgICAgICAgRW50cnlbXSBtVmVydGV4VHlwZXM7Ci0gICAgICAgIEVudHJ5IG1JbmRleFR5cGU7Ci0gICAgICAgIC8vRW50cnkgbUJhdGNoVHlwZTsKLSAgICAgICAgUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCA9IDA7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXMgPSBuZXcgRW50cnlbMTZdOwotICAgICAgICAgICAgbUluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKFR5cGUgdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0udCA9IHQ7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7Ci0gICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5lID0gZTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5zaXplID0gc2l6ZTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKLSAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW5kZXhUeXBlKFR5cGUgdCkgewotICAgICAgICAgICAgbUluZGV4VHlwZS50ID0gdDsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuZSA9IG51bGw7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnNpemUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW5kZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHsKLSAgICAgICAgICAgIG1JbmRleFR5cGUudCA9IG51bGw7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLmUgPSBlOwotICAgICAgICAgICAgbUluZGV4VHlwZS5zaXplID0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByaW1pdGl2ZShQcmltaXRpdmUgcCkgewotICAgICAgICAgICAgbVByaW1pdGl2ZSA9IHA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFR5cGUgbmV3VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB7Ci0gICAgICAgICAgICBUeXBlLkJ1aWxkZXIgdGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgZSk7Ci0gICAgICAgICAgICB0Yi5hZGQoRGltZW5zaW9uLlgsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIHRiLmNyZWF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBTaW1wbGVNZXNoIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7Ci0gICAgICAgICAgICBUeXBlW10gdG9EZXN0cm95ID0gbmV3IFR5cGVbMThdOwotICAgICAgICAgICAgaW50IHRvRGVzdHJveUNvdW50ID0gMDsKLQotICAgICAgICAgICAgaW50IGluZGV4SUQgPSAwOwotICAgICAgICAgICAgaWYgKGIubUluZGV4VHlwZS50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbmRleElEID0gYi5tSW5kZXhUeXBlLnQubUlEOwotICAgICAgICAgICAgfSBlbHNlIGlmIChiLm1JbmRleFR5cGUuc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYi5tSW5kZXhUeXBlLnQgPSBiLm5ld1R5cGUoYi5tSW5kZXhUeXBlLmUsIGIubUluZGV4VHlwZS5zaXplKTsKLSAgICAgICAgICAgICAgICBpbmRleElEID0gYi5tSW5kZXhUeXBlLnQubUlEOwotICAgICAgICAgICAgICAgIHRvRGVzdHJveVt0b0Rlc3Ryb3lDb3VudCsrXSA9IGIubUluZGV4VHlwZS50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnRbXSBJRHMgPSBuZXcgaW50W2IubVZlcnRleFR5cGVDb3VudF07Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgYi5tVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGIubVZlcnRleFR5cGVzW2N0XS50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSURzW2N0XSA9IGIubVZlcnRleFR5cGVzW2N0XS50Lm1JRDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiLm1WZXJ0ZXhUeXBlc1tjdF0udCA9IGIubmV3VHlwZShiLm1WZXJ0ZXhUeXBlc1tjdF0uZSwgYi5tVmVydGV4VHlwZXNbY3RdLnNpemUpOwotICAgICAgICAgICAgICAgICAgICBJRHNbY3RdID0gYi5tVmVydGV4VHlwZXNbY3RdLnQubUlEOwotICAgICAgICAgICAgICAgICAgICB0b0Rlc3Ryb3lbdG9EZXN0cm95Q291bnQrK10gPSBiLm1WZXJ0ZXhUeXBlc1tjdF0udDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpZCA9IHJzLm5TaW1wbGVNZXNoQ3JlYXRlKDAsIGluZGV4SUQsIElEcywgYi5tUHJpbWl0aXZlLm1JRCk7Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgdG9EZXN0cm95Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICB0b0Rlc3Ryb3lbY3RdLmRlc3Ryb3koKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVNZXNoKGlkLCBycyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2ltcGxlTWVzaCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIFNpbXBsZU1lc2ggc20gPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOwotICAgICAgICAgICAgc20ubVZlcnRleFR5cGVzID0gbmV3IFR5cGVbbVZlcnRleFR5cGVDb3VudF07Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIHNtLm1WZXJ0ZXhUeXBlc1tjdF0gPSBtVmVydGV4VHlwZXNbY3RdLnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbS5tSW5kZXhUeXBlID0gbUluZGV4VHlwZS50OwotICAgICAgICAgICAgc20ubVByaW1pdGl2ZSA9IG1QcmltaXRpdmU7Ci0gICAgICAgICAgICByZXR1cm4gc207Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyaWFuZ2xlTWVzaEJ1aWxkZXIgewotICAgICAgICBmbG9hdCBtVnR4RGF0YVtdOwotICAgICAgICBpbnQgbVZ0eENvdW50OwotICAgICAgICBzaG9ydCBtSW5kZXhEYXRhW107Ci0gICAgICAgIGludCBtSW5kZXhDb3VudDsKLSAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgRWxlbWVudCBtRWxlbWVudDsKLQotICAgICAgICBmbG9hdCBtTlggPSAwOwotICAgICAgICBmbG9hdCBtTlkgPSAwOwotICAgICAgICBmbG9hdCBtTlogPSAtMTsKLSAgICAgICAgZmxvYXQgbVMwID0gMDsKLSAgICAgICAgZmxvYXQgbVQwID0gMDsKLSAgICAgICAgZmxvYXQgbVIgPSAxOwotICAgICAgICBmbG9hdCBtRyA9IDE7Ci0gICAgICAgIGZsb2F0IG1CID0gMTsKLSAgICAgICAgZmxvYXQgbUEgPSAxOwotCi0gICAgICAgIGludCBtVnR4U2l6ZTsKLSAgICAgICAgaW50IG1GbGFnczsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xPUiA9IDB4MDAwMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMID0gMHgwMDAyOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUVVJFXzAgPSAweDAxMDA7Ci0KLSAgICAgICAgcHVibGljIFRyaWFuZ2xlTWVzaEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzLCBpbnQgdnR4U2l6ZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1WdHhDb3VudCA9IDA7Ci0gICAgICAgICAgICBtSW5kZXhDb3VudCA9IDA7Ci0gICAgICAgICAgICBtVnR4RGF0YSA9IG5ldyBmbG9hdFsxMjhdOwotICAgICAgICAgICAgbUluZGV4RGF0YSA9IG5ldyBzaG9ydFsxMjhdOwotICAgICAgICAgICAgbVZ0eFNpemUgPSB2dHhTaXplOwotICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0KLSAgICAgICAgICAgIGlmICh2dHhTaXplIDwgMiB8fCB2dHhTaXplID4gMykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZlcnRleCBzaXplIG91dCBvZiByYW5nZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtYWtlU3BhY2UoaW50IGNvdW50KSB7Ci0gICAgICAgICAgICBpZiAoKG1WdHhDb3VudCArIGNvdW50KSA+PSBtVnR4RGF0YS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB0W10gPSBuZXcgZmxvYXRbbVZ0eERhdGEubGVuZ3RoICogMl07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtVnR4RGF0YSwgMCwgdCwgMCwgbVZ0eERhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YSA9IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbGF0Y2goKSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwYWNlKDQpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1SOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1HOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1COwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1BOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApICE9IDApIHsKLSAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMik7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVMwOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1UMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwYWNlKDMpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWDsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5aOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHkpIHsKLSAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWtlU3BhY2UoMik7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKLSAgICAgICAgICAgIGxhdGNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgewotICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gejsKLSAgICAgICAgICAgIGxhdGNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlKGZsb2F0IHMsIGZsb2F0IHQpIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUzAgPSBzOwotICAgICAgICAgICAgbVQwID0gdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5vcm1hbChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5YID0geDsKLSAgICAgICAgICAgIG1OWSA9IHk7Ci0gICAgICAgICAgICBtTlogPSB6OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVIgPSByOwotICAgICAgICAgICAgbUcgPSBnOwotICAgICAgICAgICAgbUIgPSBiOwotICAgICAgICAgICAgbUEgPSBhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVHJpYW5nbGUoaW50IGlkeDEsIGludCBpZHgyLCBpbnQgaWR4MykgewotICAgICAgICAgICAgaWYoKGlkeDEgPj0gbVZ0eENvdW50KSB8fCAoaWR4MSA8IDApIHx8Ci0gICAgICAgICAgICAgICAoaWR4MiA+PSBtVnR4Q291bnQpIHx8IChpZHgyIDwgMCkgfHwKLSAgICAgICAgICAgICAgIChpZHgzID49IG1WdHhDb3VudCkgfHwgKGlkeDMgPCAwKSkgewotICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5kZXggcHJvdmlkZWQgZ3JlYXRlciB0aGFuIHZlcnRleCBjb3VudC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUluZGV4Q291bnQgKyAzKSA+PSBtSW5kZXhEYXRhLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHNob3J0IHRbXSA9IG5ldyBzaG9ydFttSW5kZXhEYXRhLmxlbmd0aCAqIDJdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUluZGV4RGF0YSwgMCwgdCwgMCwgbUluZGV4RGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG1JbmRleERhdGEgPSB0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgxOwotICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgyOwotICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpbXBsZU1lc2ggY3JlYXRlKCkgewotICAgICAgICAgICAgRWxlbWVudC5CdWlsZGVyIGIgPSBuZXcgRWxlbWVudC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgICAgICBpbnQgZmxvYXRDb3VudCA9IG1WdHhTaXplOwotICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVnR4U2l6ZSksICJwb3NpdGlvbiIpOwotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gNDsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLkNPTE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpLCAiY29sb3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAyOwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuVEVYVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSwgInRleHR1cmUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAzOwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpLCAibm9ybWFsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRWxlbWVudCA9IGIuY3JlYXRlKCk7Ci0KLSAgICAgICAgICAgIEJ1aWxkZXIgc21iID0gbmV3IEJ1aWxkZXIobVJTKTsKLSAgICAgICAgICAgIHNtYi5hZGRWZXJ0ZXhUeXBlKG1FbGVtZW50LCBtVnR4Q291bnQgLyBmbG9hdENvdW50KTsKLSAgICAgICAgICAgIHNtYi5zZXRJbmRleFR5cGUoRWxlbWVudC5jcmVhdGVJbmRleChtUlMpLCBtSW5kZXhDb3VudCk7Ci0gICAgICAgICAgICBzbWIuc2V0UHJpbWl0aXZlKFByaW1pdGl2ZS5UUklBTkdMRSk7Ci0gICAgICAgICAgICBTaW1wbGVNZXNoIHNtID0gc21iLmNyZWF0ZSgpOwotCi0gICAgICAgICAgICBBbGxvY2F0aW9uIHZlcnRleEFsbG9jID0gc20uY3JlYXRlVmVydGV4QWxsb2NhdGlvbigwKTsKLSAgICAgICAgICAgIEFsbG9jYXRpb24gaW5kZXhBbGxvYyA9IHNtLmNyZWF0ZUluZGV4QWxsb2NhdGlvbigpOwotICAgICAgICAgICAgc20uYmluZFZlcnRleEFsbG9jYXRpb24odmVydGV4QWxsb2MsIDApOwotICAgICAgICAgICAgc20uYmluZEluZGV4QWxsb2NhdGlvbihpbmRleEFsbG9jKTsKLQotICAgICAgICAgICAgdmVydGV4QWxsb2MuZGF0YShtVnR4RGF0YSk7Ci0gICAgICAgICAgICB2ZXJ0ZXhBbGxvYy51cGxvYWRUb0J1ZmZlck9iamVjdCgpOwotCi0gICAgICAgICAgICBpbmRleEFsbG9jLmRhdGEobUluZGV4RGF0YSk7Ci0gICAgICAgICAgICBpbmRleEFsbG9jLnVwbG9hZFRvQnVmZmVyT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzbTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQppbmRleCA2MmQzODY3Li4wYjNkYjY5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQpAQCAtMTYsNyArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwogCisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKICAqIEBoaWRlCkBAIC0zMSw3ICszMyw2IEBACiAgICAgaW50IG1FbGVtZW50Q291bnQ7CiAgICAgRWxlbWVudCBtRWxlbWVudDsKIAotICAgIHByaXZhdGUgaW50IG1OYXRpdmVDYWNoZTsKICAgICBDbGFzcyBtSmF2YUNsYXNzOwogCiAgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKQEAgLTk1LDYxICs5NiwzNyBAQAogCiAKICAgICBUeXBlKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7Ci0gICAgICAgIG1OYXRpdmVDYWNoZSA9IDA7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaWYobU5hdGl2ZUNhY2hlICE9IDApIHsKLSAgICAgICAgICAgIG1SUy5uVHlwZUZpbmFsRGVzdHJveSh0aGlzKTsKLSAgICAgICAgICAgIG1OYXRpdmVDYWNoZSA9IDA7Ci0gICAgICAgIH0KICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFR5cGUgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYywgaW50IHNpemUpIHsKLSAgICAgICAgRWxlbWVudCBlID0gRWxlbWVudC5jcmVhdGVGcm9tQ2xhc3MocnMsIGMpOwotICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycywgZSk7Ci0gICAgICAgIGIuYWRkKERpbWVuc2lvbi5YLCBzaXplKTsKLSAgICAgICAgVHlwZSB0ID0gYi5jcmVhdGUoKTsKLSAgICAgICAgZS5kZXN0cm95KCk7CisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgICAgICAvLyBXZSBoYXZlIDYgaW50ZWdlciB0byBvYnRhaW4gbURpbVg7IG1EaW1ZOyBtRGltWjsKKyAgICAgICAgLy8gbURpbUxPRDsgbURpbUZhY2VzOyBtRWxlbWVudDsKKyAgICAgICAgaW50W10gZGF0YUJ1ZmZlciA9IG5ldyBpbnRbNl07CisgICAgICAgIG1SUy5uVHlwZUdldE5hdGl2ZURhdGEobUlELCBkYXRhQnVmZmVyKTsKIAotICAgICAgICAvLyBuYXRpdmUgZmllbGRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gYy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGludFtdIGFyVHlwZXMgPSBuZXcgaW50W2ZpZWxkcy5sZW5ndGhdOwotICAgICAgICAgICAgaW50W10gYXJCaXRzID0gbmV3IGludFtmaWVsZHMubGVuZ3RoXTsKKyAgICAgICAgbURpbVggPSBkYXRhQnVmZmVyWzBdOworICAgICAgICBtRGltWSA9IGRhdGFCdWZmZXJbMV07CisgICAgICAgIG1EaW1aID0gZGF0YUJ1ZmZlclsyXTsKKyAgICAgICAgbURpbUxPRCA9IGRhdGFCdWZmZXJbM10gPT0gMSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgbURpbUZhY2VzID0gZGF0YUJ1ZmZlcls0XSA9PSAxID8gdHJ1ZSA6IGZhbHNlOwogCi0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgZmllbGRzLmxlbmd0aDsgY3QrKykgewotICAgICAgICAgICAgICAgIEZpZWxkIGYgPSBmaWVsZHNbY3RdOwotICAgICAgICAgICAgICAgIENsYXNzIGZjID0gZi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYoZmMgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMzI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IHNob3J0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMTYubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMTY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJUeXBlc1tjdF0gPSBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF84Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMi5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSAzMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtvd24gZmllbGQgdHlwZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJzLm5UeXBlU2V0dXBGaWVsZHModCwgYXJUeXBlcywgYXJCaXRzLCBmaWVsZHMpOworICAgICAgICBpbnQgZWxlbWVudElEID0gZGF0YUJ1ZmZlcls1XTsKKyAgICAgICAgaWYoZWxlbWVudElEICE9IDApIHsKKyAgICAgICAgICAgIG1FbGVtZW50ID0gbmV3IEVsZW1lbnQoZWxlbWVudElELCBtUlMpOworICAgICAgICAgICAgbUVsZW1lbnQudXBkYXRlRnJvbU5hdGl2ZSgpOwogICAgICAgICB9Ci0gICAgICAgIHQubUphdmFDbGFzcyA9IGM7Ci0gICAgICAgIHJldHVybiB0OworICAgICAgICBjYWxjRWxlbWVudENvdW50KCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBUeXBlIGNyZWF0ZUZyb21DbGFzcyhSZW5kZXJTY3JpcHQgcnMsIENsYXNzIGMsIGludCBzaXplLCBTdHJpbmcgc2NyaXB0TmFtZSkgewotICAgICAgICBUeXBlIHQgPSBjcmVhdGVGcm9tQ2xhc3MocnMsIGMsIHNpemUpOwotICAgICAgICB0LnNldE5hbWUoc2NyaXB0TmFtZSk7Ci0gICAgICAgIHJldHVybiB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoIlJlbmRlclNjcmlwdCIsICJDYWxsaW5nIGRlcHJpY2F0ZWQgY3JlYXRlRnJvbUNsYXNzIik7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2Q1N2ZhLi4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4NDJmMy4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IzZiB7Ci0gICAgcHVibGljIFZlY3RvcjNmKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotICAgIHB1YmxpYyBmbG9hdCB6OwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmQ5NTkuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yNGYgewotICAgIHB1YmxpYyBWZWN0b3I0ZigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKLSAgICBwdWJsaWMgZmxvYXQgejsKLSAgICBwdWJsaWMgZmxvYXQgdzsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2puaS9BbmRyb2lkLm1rIGIvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsKaW5kZXggODQ3NmJlMS4uNGM0YTEyOCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsKKysrIGIvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsKQEAgLTEzLDE0ICsxMywxMyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYW5kcm9pZF9ydW50aW1lIFwKLSAgICAgICAgbGliYWNjIFwKICAgICAgICAgbGlibmF0aXZlaGVscGVyIFwKICAgICAgICAgbGliUlMgXAogICAgICAgICBsaWJjdXRpbHMgXAogICAgICAgICBsaWJza2lhIFwKICAgICAgICAgbGlidXRpbHMgXAogICAgICAgICBsaWJ1aSBcCi0gICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCAKKyAgICAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAgYi9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcAppbmRleCA0NWNjNzJlLi44ZjFlOTNjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcAorKysgYi9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImpuaS5oIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKICNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF92aWV3X1N1cmZhY2UuaCIKIAogI2luY2x1ZGUgPFJlbmRlclNjcmlwdC5oPgogI2luY2x1ZGUgPFJlbmRlclNjcmlwdEVudi5oPgpAQCAtNjksOSArNzAsNiBAQAogCiAgICAgamNsYXNzIGJpdG1hcENsYXNzID0gX2Vudi0+RmluZENsYXNzKCJhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcCIpOwogICAgIGdOYXRpdmVCaXRtYXBJRCA9IF9lbnYtPkdldEZpZWxkSUQoYml0bWFwQ2xhc3MsICJtTmF0aXZlQml0bWFwIiwgIkkiKTsKLQotICAgIGpjbGFzcyB0eXBlQ2xhc3MgPSBfZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUiKTsKLSAgICBnVHlwZU5hdGl2ZUNhY2hlID0gX2Vudi0+R2V0RmllbGRJRCh0eXBlQ2xhc3MsICJtTmF0aXZlQ2FjaGUiLCAiSSIpOwogfQogCiBzdGF0aWMgdm9pZCBuSW5pdEVsZW1lbnRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhOCwgamludCByZ2JhNDQ0NCwgamludCByZ2JhODg4OCwgamludCByZ2I1NjUpCkBAIC04NSw0MSArODMsNDMgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFzc2lnbk5hbWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaiwgamJ5dGVBcnJheSBzdHIpCituQ29udGV4dEZpbmlzaChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkFzc2lnbk5hbWUsIGNvbiglcCksIG9iaiglcCkiLCBjb24sICh2b2lkICopb2JqKTsKKyAgICBMT0dfQVBJKCJuQ29udGV4dEZpbmlzaCwgY29uKCVwKSIsIGNvbik7CisgICAgcnNDb250ZXh0RmluaXNoKGNvbik7Cit9CiAKK3N0YXRpYyB2b2lkCituQXNzaWduTmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgb2JqLCBqYnl0ZUFycmF5IHN0cikKK3sKKyAgICBMT0dfQVBJKCJuQXNzaWduTmFtZSwgY29uKCVwKSwgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoc3RyKTsKICAgICBqYnl0ZSAqIGNwdHIgPSAoamJ5dGUgKikgX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChzdHIsIDApOwogICAgIHJzQXNzaWduTmFtZShjb24sICh2b2lkICopb2JqLCAoY29uc3QgY2hhciAqKWNwdHIsIGxlbik7CiAgICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoc3RyLCBjcHRyLCBKTklfQUJPUlQpOwogfQogCi1zdGF0aWMgdm9pZAotbk9iakRlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaikKK3N0YXRpYyBqc3RyaW5nCituR2V0TmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgb2JqKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5HZXROYW1lLCBjb24oJXApLCBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgcnNHZXROYW1lKGNvbiwgKHZvaWQgKilvYmosICZuYW1lKTsKKyAgICByZXR1cm4gX2Vudi0+TmV3U3RyaW5nVVRGKG5hbWUpOworfQorCitzdGF0aWMgdm9pZAorbk9iakRlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaikKK3sKICAgICBMT0dfQVBJKCJuT2JqRGVzdHJveSwgY29uKCVwKSBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CiAgICAgcnNPYmpEZXN0cm95KGNvbiwgKHZvaWQgKilvYmopOwogfQogCi1zdGF0aWMgdm9pZAotbk9iakRlc3Ryb3lPT0IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaikKLXsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgZGlmZmVycyBmcm9tIG5PYmpEZXN0cm95IGluIHRoYXQgaXQgY2FsbHMgdGhlCi0gICAgLy8gc3BlY2lhbCBPdXQgT2YgQmFuZCB2ZXJzaW9uIG9mIE9iakRlc3Ryb3kgd2hpY2ggaXMgdGhyZWFkIHNhZmUuCi0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibk9iakRlc3Ryb3lPT0IsIGNvbiglcCkgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwotICAgIHJzT2JqRGVzdHJveU9PQihjb24sICh2b2lkICopb2JqKTsKLX0KIAogc3RhdGljIGppbnQKLW5GaWxlT3BlbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpieXRlQXJyYXkgc3RyKQorbkZpbGVPcGVuKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJ5dGVBcnJheSBzdHIpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkZpbGVPcGVuLCBjb24oJXApIiwgY29uKTsKLQogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoc3RyKTsKICAgICBqYnl0ZSAqIGNwdHIgPSAoamJ5dGUgKikgX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChzdHIsIDApOwogICAgIGppbnQgcmV0ID0gKGppbnQpcnNGaWxlT3Blbihjb24sIChjb25zdCBjaGFyICopY3B0ciwgbGVuKTsKQEAgLTE2NSw5ICsxNjUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRTZXRQcmlvcml0eShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcCkKK25Db250ZXh0U2V0UHJpb3JpdHkoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHApCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiQ29udGV4dFNldFByaW9yaXR5LCBjb24oJXApLCBwcmlvcml0eSglaSkiLCBjb24sIHApOwogICAgIHJzQ29udGV4dFNldFByaW9yaXR5KGNvbiwgcCk7CiB9CkBAIC0xNzUsMTAxICsxNzQsOTIgQEAKIAogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRTZXRTdXJmYWNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB3aWR0aCwgamludCBoZWlnaHQsIGpvYmplY3Qgd25kKQorbkNvbnRleHRTZXRTdXJmYWNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB3aWR0aCwgamludCBoZWlnaHQsIGpvYmplY3Qgd25kKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0U2V0U3VyZmFjZSwgY29uKCVwKSwgd2lkdGgoJWkpLCBoZWlnaHQoJWkpLCBzdXJmYWNlKCVwKSIsIGNvbiwgd2lkdGgsIGhlaWdodCwgKFN1cmZhY2UgKil3bmQpOwogCiAgICAgU3VyZmFjZSAqIHdpbmRvdyA9IE5VTEw7CiAgICAgaWYgKHduZCA9PSBOVUxMKSB7CiAKICAgICB9IGVsc2UgewotICAgICAgICBqY2xhc3Mgc3VyZmFjZV9jbGFzcyA9IF9lbnYtPkZpbmRDbGFzcygiYW5kcm9pZC92aWV3L1N1cmZhY2UiKTsKLSAgICAgICAgamZpZWxkSUQgc3VyZmFjZUZpZWxkSUQgPSBfZW52LT5HZXRGaWVsZElEKHN1cmZhY2VfY2xhc3MsIEFORFJPSURfVklFV19TVVJGQUNFX0pOSV9JRCwgIkkiKTsKLSAgICAgICAgd2luZG93ID0gKFN1cmZhY2UqKV9lbnYtPkdldEludEZpZWxkKHduZCwgc3VyZmFjZUZpZWxkSUQpOworICAgICAgICB3aW5kb3cgPSAoU3VyZmFjZSopIGFuZHJvaWRfU3VyZmFjZV9nZXROYXRpdmVXaW5kb3coX2Vudiwgd25kKS5nZXQoKTsKICAgICB9CiAKICAgICByc0NvbnRleHRTZXRTdXJmYWNlKGNvbiwgd2lkdGgsIGhlaWdodCwgd2luZG93KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0RGVzdHJveShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgY29uKQorbkNvbnRleHREZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBMT0dfQVBJKCJuQ29udGV4dERlc3Ryb3ksIGNvbiglcCkiLCAoUnNDb250ZXh0KWNvbik7Ci0gICAgcnNDb250ZXh0RGVzdHJveSgoUnNDb250ZXh0KWNvbik7CisgICAgTE9HX0FQSSgibkNvbnRleHREZXN0cm95LCBjb24oJXApIiwgY29uKTsKKyAgICByc0NvbnRleHREZXN0cm95KGNvbik7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dER1bXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGJpdHMpCituQ29udGV4dER1bXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGJpdHMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHREdW1wLCBjb24oJXApICBiaXRzKCVpKSIsIChSc0NvbnRleHQpY29uLCBiaXRzKTsKICAgICByc0NvbnRleHREdW1wKChSc0NvbnRleHQpY29uLCBiaXRzKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0UGF1c2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorbkNvbnRleHRQYXVzZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRQYXVzZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNDb250ZXh0UGF1c2UoY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0UmVzdW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25Db250ZXh0UmVzdW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dFJlc3VtZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNDb250ZXh0UmVzdW1lKGNvbik7CiB9CiAKIHN0YXRpYyBqaW50Ci1uQ29udGV4dEdldE1lc3NhZ2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50QXJyYXkgZGF0YSwgamJvb2xlYW4gd2FpdCkKK25Db250ZXh0R2V0TWVzc2FnZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnRBcnJheSBkYXRhLCBqYm9vbGVhbiB3YWl0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRHZXRNZXNzYWdlLCBjb24oJXApLCBsZW4oJWkpIiwgY29uLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CiAgICAgc2l6ZV90IHJlY2VpdmVMZW47CiAgICAgaW50IGlkID0gcnNDb250ZXh0R2V0TWVzc2FnZShjb24sIHB0ciwgJnJlY2VpdmVMZW4sIGxlbiAqIDQsIHdhaXQpOwogICAgIGlmICghaWQgJiYgcmVjZWl2ZUxlbikgewotICAgICAgICBMT0dFKCJtZXNzYWdlIHJlY2VpdmUgYnVmZmVyIHRvbyBzbWFsbC4gICVpIiwgcmVjZWl2ZUxlbik7CisgICAgICAgIExPR1YoIm1lc3NhZ2UgcmVjZWl2ZSBidWZmZXIgdG9vIHNtYWxsLiAgJWkiLCByZWNlaXZlTGVuKTsKKyAgICAgICAgKnB0ciA9IChqaW50KXJlY2VpdmVMZW47CiAgICAgfQogICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgMCk7CiAgICAgcmV0dXJuIGlkOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCitzdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRJbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dEluaXRUb0NsaWVudChjb24pOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK3N0YXRpYyB2b2lkIG5Db250ZXh0RGVpbml0VG9DbGllbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0RGVpbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dERlaW5pdFRvQ2xpZW50KGNvbik7CiB9CiAKIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKK25FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuRWxlbWVudENyZWF0ZSwgY29uKCVwKSwgdHlwZSglaSksIGtpbmQoJWkpLCBub3JtKCVpKSwgc2l6ZSglaSkiLCBjb24sIHR5cGUsIGtpbmQsIG5vcm0sIHNpemUpOwogICAgIHJldHVybiAoamludClyc0VsZW1lbnRDcmVhdGUoY29uLCAoUnNEYXRhVHlwZSl0eXBlLCAoUnNEYXRhS2luZClraW5kLCBub3JtLCBzaXplKTsKIH0KIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX25hbWVzKQorbkVsZW1lbnRDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludEFycmF5IF9pZHMsIGpvYmplY3RBcnJheSBfbmFtZXMsIGppbnRBcnJheSBfYXJyYXlTaXplcykKIHsKICAgICBpbnQgZmllbGRDb3VudCA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF9pZHMpOwotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5FbGVtZW50Q3JlYXRlMiwgY29uKCVwKSIsIGNvbik7CiAKICAgICBqaW50ICppZHMgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKF9pZHMsIE5VTEwpOworICAgIGppbnQgKmFycmF5U2l6ZXMgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKF9hcnJheVNpemVzLCBOVUxMKTsKICAgICBjb25zdCBjaGFyICoqIG5hbWVBcnJheSA9IChjb25zdCBjaGFyICoqKWNhbGxvYyhmaWVsZENvdW50LCBzaXplb2YoY2hhciAqKSk7CiAgICAgc2l6ZV90KiBzaXplQXJyYXkgPSAoc2l6ZV90KiljYWxsb2MoZmllbGRDb3VudCwgc2l6ZW9mKHNpemVfdCkpOwogCkBAIC0yNzgsMTgzICsyNjgsMTE2IEBACiAgICAgICAgIG5hbWVBcnJheVtjdF0gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzLCBOVUxMKTsKICAgICAgICAgc2l6ZUFycmF5W2N0XSA9IF9lbnYtPkdldFN0cmluZ1VURkxlbmd0aChzKTsKICAgICB9Ci0gICAgamludCBpZCA9IChqaW50KXJzRWxlbWVudENyZWF0ZTIoY29uLCBmaWVsZENvdW50LCAoUnNFbGVtZW50ICopaWRzLCBuYW1lQXJyYXksIHNpemVBcnJheSk7CisgICAgamludCBpZCA9IChqaW50KXJzRWxlbWVudENyZWF0ZTIoY29uLCBmaWVsZENvdW50LCAoUnNFbGVtZW50ICopaWRzLCBuYW1lQXJyYXksIHNpemVBcnJheSwgKGNvbnN0IHVpbnQzMl90ICopYXJyYXlTaXplcyk7CiAgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBmaWVsZENvdW50OyBjdCsrKSB7CiAgICAgICAgIGpzdHJpbmcgcyA9IChqc3RyaW5nKV9lbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChfbmFtZXMsIGN0KTsKICAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHMsIG5hbWVBcnJheVtjdF0pOwogICAgIH0KICAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhfaWRzLCBpZHMsIEpOSV9BQk9SVCk7CisgICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoX2FycmF5U2l6ZXMsIGFycmF5U2l6ZXMsIEpOSV9BQk9SVCk7CiAgICAgZnJlZShuYW1lQXJyYXkpOwogICAgIGZyZWUoc2l6ZUFycmF5KTsKICAgICByZXR1cm4gKGppbnQpaWQ7CiB9CiAKK3N0YXRpYyB2b2lkCituRWxlbWVudEdldE5hdGl2ZURhdGEoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGlkLCBqaW50QXJyYXkgX2VsZW1lbnREYXRhKQoreworICAgIGludCBkYXRhU2l6ZSA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF9lbGVtZW50RGF0YSk7CisgICAgTE9HX0FQSSgibkVsZW1lbnRHZXROYXRpdmVEYXRhLCBjb24oJXApIiwgY29uKTsKKworICAgIC8vIHdlIHdpbGwgcGFjayBtVHlwZTsgbUtpbmQ7IG1Ob3JtYWxpemVkOyBtVmVjdG9yU2l6ZTsgTnVtU3ViRWxlbWVudHMKKyAgICBhc3NlcnQoZGF0YVNpemUgPT0gNSk7CisKKyAgICB1aW50MzJfdCBlbGVtZW50RGF0YVs1XTsKKyAgICByc0VsZW1lbnRHZXROYXRpdmVEYXRhKGNvbiwgKFJzRWxlbWVudClpZCwgZWxlbWVudERhdGEsIGRhdGFTaXplKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2VsZW1lbnREYXRhLCBpLCAxLCAoY29uc3QgamludCopJmVsZW1lbnREYXRhW2ldKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK25FbGVtZW50R2V0U3ViRWxlbWVudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGlkLCBqaW50QXJyYXkgX0lEcywgam9iamVjdEFycmF5IF9uYW1lcykKK3sKKyAgICBpbnQgZGF0YVNpemUgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfSURzKTsKKyAgICBMT0dfQVBJKCJuRWxlbWVudEdldFN1YkVsZW1lbnRzLCBjb24oJXApIiwgY29uKTsKKworICAgIHVpbnQzMl90ICppZHMgPSAodWludDMyX3QgKiltYWxsb2MoKHVpbnQzMl90KWRhdGFTaXplICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgY29uc3QgY2hhciAqKm5hbWVzID0gKGNvbnN0IGNoYXIgKiopbWFsbG9jKCh1aW50MzJfdClkYXRhU2l6ZSAqIHNpemVvZihjb25zdCBjaGFyICopKTsKKworICAgIHJzRWxlbWVudEdldFN1YkVsZW1lbnRzKGNvbiwgKFJzRWxlbWVudClpZCwgaWRzLCBuYW1lcywgKHVpbnQzMl90KWRhdGFTaXplKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KF9uYW1lcywgaSwgX2Vudi0+TmV3U3RyaW5nVVRGKG5hbWVzW2ldKSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9JRHMsIGksIDEsIChjb25zdCBqaW50KikmaWRzW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGlkcyk7CisgICAgZnJlZShuYW1lcyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uVHlwZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBlSUQpCituVHlwZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBlSUQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblR5cGVCZWdpbiwgY29uKCVwKSBlKCVwKSIsIGNvbiwgKFJzRWxlbWVudCllSUQpOwogICAgIHJzVHlwZUJlZ2luKGNvbiwgKFJzRWxlbWVudCllSUQpOwogfQogCiBzdGF0aWMgdm9pZAotblR5cGVBZGQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGRpbSwgamludCB2YWwpCituVHlwZUFkZChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZGltLCBqaW50IHZhbCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuVHlwZUFkZCwgY29uKCVwKSBkaW0oJWkpLCB2YWwoJWkpIiwgY29uLCBkaW0sIHZhbCk7CiAgICAgcnNUeXBlQWRkKGNvbiwgKFJzRGltZW5zaW9uKWRpbSwgdmFsKTsKIH0KIAogc3RhdGljIGppbnQKLW5UeXBlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25UeXBlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuVHlwZUNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzVHlwZUNyZWF0ZShjb24pOwogfQogCi1zdGF0aWMgdm9pZCAqIFNGX0xvYWRJbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgICgoaW50MzJfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRJbnRGaWVsZChfb2JqLCBfZmllbGQpOwotICAgIHJldHVybiAoKHVpbnQ4X3QgKilidWZmZXIpICsgNDsKLX0KLQotc3RhdGljIHZvaWQgKiBTRl9Mb2FkU2hvcnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgICgoaW50MTZfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRTaG9ydEZpZWxkKF9vYmosIF9maWVsZCk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyAyOwotfQotCi1zdGF0aWMgdm9pZCAqIFNGX0xvYWRCeXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICAoKGludDhfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRCeXRlRmllbGQoX29iaiwgX2ZpZWxkKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDE7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfTG9hZEZsb2F0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICAoKGZsb2F0ICopYnVmZmVyKVswXSA9IF9lbnYtPkdldEZsb2F0RmllbGQoX29iaiwgX2ZpZWxkKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfU2F2ZUludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX29iaiwgamZpZWxkSUQgX2ZpZWxkLCB2b2lkICpidWZmZXIpCi17Ci0gICAgX2Vudi0+U2V0SW50RmllbGQoX29iaiwgX2ZpZWxkLCAoKGludDMyX3QgKilidWZmZXIpWzBdKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfU2F2ZVNob3J0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICBfZW52LT5TZXRTaG9ydEZpZWxkKF9vYmosIF9maWVsZCwgKChpbnQxNl90ICopYnVmZmVyKVswXSk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyAyOwotfQotCi1zdGF0aWMgdm9pZCAqIFNGX1NhdmVCeXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICBfZW52LT5TZXRCeXRlRmllbGQoX29iaiwgX2ZpZWxkLCAoKGludDhfdCAqKWJ1ZmZlcilbMF0pOwotICAgIHJldHVybiAoKHVpbnQ4X3QgKilidWZmZXIpICsgMTsKLX0KLQotc3RhdGljIHZvaWQgKiBTRl9TYXZlRmxvYXQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgIF9lbnYtPlNldEZsb2F0RmllbGQoX29iaiwgX2ZpZWxkLCAoKGZsb2F0ICopYnVmZmVyKVswXSk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyA0OwotfQotCi1zdHJ1Y3QgVHlwZUZpZWxkQ2FjaGUgewotICAgIGpmaWVsZElEIGZpZWxkOwotICAgIGludCBiaXRzOwotICAgIHZvaWQgKiAoKnB0cikoSk5JRW52ICosIGpvYmplY3QsIGpmaWVsZElELCB2b2lkICpidWZmZXIpOwotICAgIHZvaWQgKiAoKnJlYWRQdHIpKEpOSUVudiAqLCBqb2JqZWN0LCBqZmllbGRJRCwgdm9pZCAqYnVmZmVyKTsKLX07Ci0KLXN0cnVjdCBUeXBlQ2FjaGUgewotICAgIGludCBmaWVsZENvdW50OwotICAgIGludCBzaXplOwotICAgIFR5cGVGaWVsZENhY2hlIGZpZWxkc1sxXTsKLX07Ci0KLS8veyJuVHlwZUZpbmFsRGVzdHJveSIsICAgICAgICAgICAgICAiKExhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlOylWIiwgICAgICAgKHZvaWQqKW5UeXBlRmluYWxEZXN0cm95IH0sCiBzdGF0aWMgdm9pZAotblR5cGVGaW5hbERlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqb2JqZWN0IF90eXBlKQorblR5cGVHZXROYXRpdmVEYXRhKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpZCwgamludEFycmF5IF90eXBlRGF0YSkKIHsKLSAgICBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKLSAgICBmcmVlKHRjKTsKLX0KKyAgICAvLyBXZSBhcmUgcGFja2luZyA2IGl0ZW1zOiBtRGltWDsgbURpbVk7IG1EaW1aOworICAgIC8vIG1EaW1MT0Q7IG1EaW1GYWNlczsgbUVsZW1lbnQ7IGludG8gdHlwZURhdGEKKyAgICBpbnQgZWxlbWVudENvdW50ID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX3R5cGVEYXRhKTsKIAotLy8gbmF0aXZlIHZvaWQgblR5cGVTZXR1cEZpZWxkcyhUeXBlIHQsIGludFtdIHR5cGVzLCBpbnRbXSBiaXRzLCBGaWVsZFtdIElEcyk7Ci1zdGF0aWMgdm9pZAotblR5cGVTZXR1cEZpZWxkcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpvYmplY3QgX3R5cGUsIGppbnRBcnJheSBfdHlwZXMsIGppbnRBcnJheSBfYml0cywgam9iamVjdEFycmF5IF9JRHMpCi17Ci0gICAgaW50IGZpZWxkQ291bnQgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfdHlwZXMpOwotICAgIHNpemVfdCBzdHJ1Y3RTaXplID0gc2l6ZW9mKFR5cGVDYWNoZSkgKyAoc2l6ZW9mKFR5cGVGaWVsZENhY2hlKSAqIChmaWVsZENvdW50LTEpKTsKLSAgICBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKW1hbGxvYyhzdHJ1Y3RTaXplKTsKLSAgICBtZW1zZXQodGMsIDAsIHN0cnVjdFNpemUpOworICAgIGFzc2VydChlbGVtZW50Q291bnQgPT0gNik7CisgICAgTE9HX0FQSSgiblR5cGVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwogCi0gICAgVHlwZUZpZWxkQ2FjaGUgKnRmYyA9ICZ0Yy0+ZmllbGRzWzBdOwotICAgIHRjLT5maWVsZENvdW50ID0gZmllbGRDb3VudDsKLSAgICBfZW52LT5TZXRJbnRGaWVsZChfdHlwZSwgZ1R5cGVOYXRpdmVDYWNoZSwgKGppbnQpdGMpOworICAgIHVpbnQzMl90IHR5cGVEYXRhWzZdOworICAgIHJzVHlwZUdldE5hdGl2ZURhdGEoY29uLCAoUnNUeXBlKWlkLCB0eXBlRGF0YSwgNik7CiAKLSAgICBqaW50ICpmVHlwZSA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoX3R5cGVzLCBOVUxMKTsKLSAgICBqaW50ICpmQml0cyA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoX2JpdHMsIE5VTEwpOwotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgZmllbGRDb3VudDsgY3QrKykgewotICAgICAgICBqb2JqZWN0IGZpZWxkID0gX2Vudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KF9JRHMsIGN0KTsKLSAgICAgICAgdGZjW2N0XS5maWVsZCA9IF9lbnYtPkZyb21SZWZsZWN0ZWRGaWVsZChmaWVsZCk7Ci0gICAgICAgIHRmY1tjdF0uYml0cyA9IGZCaXRzW2N0XTsKLQotICAgICAgICBzd2l0Y2goZlR5cGVbY3RdKSB7Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9GTE9BVF8zMjoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZEZsb2F0OwotICAgICAgICAgICAgdGZjW2N0XS5yZWFkUHRyID0gU0ZfU2F2ZUZsb2F0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF8zMjoKLSAgICAgICAgY2FzZSBSU19UWVBFX1NJR05FRF8zMjoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZEludDsKLSAgICAgICAgICAgIHRmY1tjdF0ucmVhZFB0ciA9IFNGX1NhdmVJbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzE2OgotICAgICAgICBjYXNlIFJTX1RZUEVfU0lHTkVEXzE2OgotICAgICAgICAgICAgdGZjW2N0XS5wdHIgPSBTRl9Mb2FkU2hvcnQ7Ci0gICAgICAgICAgICB0ZmNbY3RdLnJlYWRQdHIgPSBTRl9TYXZlU2hvcnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzg6Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9TSUdORURfODoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZEJ5dGU7Ci0gICAgICAgICAgICB0ZmNbY3RdLnJlYWRQdHIgPSBTRl9TYXZlQnl0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHRjLT5zaXplICs9IDQ7CisgICAgZm9yKGppbnQgaSA9IDA7IGkgPCBlbGVtZW50Q291bnQ7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX3R5cGVEYXRhLCBpLCAxLCAoY29uc3QgamludCopJnR5cGVEYXRhW2ldKTsKICAgICB9Ci0KLSAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhfdHlwZXMsIGZUeXBlLCBKTklfQUJPUlQpOwotICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKF9iaXRzLCBmQml0cywgSk5JX0FCT1JUKTsKIH0KIAotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgamludAotbkFsbG9jYXRpb25DcmVhdGVUeXBlZChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZSkKK25BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25DcmVhdGVUeXBlZCwgY29uKCVwKSwgZSglcCkiLCBjb24sIChSc0VsZW1lbnQpZSk7CiAgICAgcmV0dXJuIChqaW50KSByc0FsbG9jYXRpb25DcmVhdGVUeXBlZChjb24sIChSc0VsZW1lbnQpZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYSwgamJvb2xlYW4gZ2VuTWlwLCBqaW50IG1pcCkKK25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhLCBqYm9vbGVhbiBnZW5NaXAsIGppbnQgbWlwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlLCBjb24oJXApLCBhKCVwKSwgZ2VuTWlwKCVpKSwgbWlwKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhLCBnZW5NaXAsIG1pcCk7CiAgICAgcnNBbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGNvbiwgKFJzQWxsb2NhdGlvbilhLCBnZW5NaXAsIG1pcCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhKQorbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0LCBjb24oJXApLCBhKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhKTsKICAgICByc0FsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChjb24sIChSc0FsbG9jYXRpb24pYSk7CiB9CkBAIC00ODAsOSArNDAzLDggQEAKIH0KIAogc3RhdGljIGludAotbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGpvYmplY3QgamJpdG1hcCkKK25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZHN0Rm10LCBqYm9vbGVhbiBnZW5NaXBzLCBqb2JqZWN0IGpiaXRtYXApCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgU2tCaXRtYXAgY29uc3QgKiBuYXRpdmVCaXRtYXAgPQogICAgICAgICAgICAgKFNrQml0bWFwIGNvbnN0ICopX2Vudi0+R2V0SW50RmllbGQoamJpdG1hcCwgZ05hdGl2ZUJpdG1hcElEKTsKICAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFwKCpuYXRpdmVCaXRtYXApOwpAQCAtNTA4LDkgKzQzMCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqb2JqZWN0IGpiaXRtYXApCituQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdHlwZSwgam9iamVjdCBqYml0bWFwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIFNrQml0bWFwICogbmF0aXZlQml0bWFwID0KICAgICAgICAgICAgIChTa0JpdG1hcCAqKV9lbnYtPkdldEludEZpZWxkKGpiaXRtYXAsIGdOYXRpdmVCaXRtYXBJRCk7CiAKQEAgLTUyMiwxMCArNDQzLDggQEAKIH0KIAogc3RhdGljIGludAotbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgamludCBuYXRpdmVfYXNzZXQpCituQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZHN0Rm10LCBqYm9vbGVhbiBnZW5NaXBzLCBqaW50IG5hdGl2ZV9hc3NldCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLQogICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOwogICAgIFNrQml0bWFwIGJpdG1hcDsKICAgICBTa0ltYWdlRGVjb2Rlcjo6RGVjb2RlTWVtb3J5KGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCksCkBAIC01NDgsOSArNDY3LDggQEAKIH0KIAogc3RhdGljIGludAotbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgam9iamVjdCBqYml0bWFwKQorbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgam9iamVjdCBqYml0bWFwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIFNrQml0bWFwIGNvbnN0ICogbmF0aXZlQml0bWFwID0KICAgICAgICAgICAgIChTa0JpdG1hcCBjb25zdCAqKV9lbnYtPkdldEludEZpZWxkKGpiaXRtYXAsIGdOYXRpdmVCaXRtYXBJRCk7CiAgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCgqbmF0aXZlQml0bWFwKTsKQEAgLTU3Miw5ICs0OTAsOCBAQAogCiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uMURTdWJEYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCBvZmZzZXQoJWkpLCBjb3VudCglaSksIGxlbiglaSksIHNpemVCeXRlcyglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgY291bnQsIGxlbiwgc2l6ZUJ5dGVzKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNTgzLDkgKzUwMCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9zKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpzaG9ydEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGExRF9zKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpzaG9ydEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9zLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAganNob3J0ICpwdHIgPSBfZW52LT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC01OTQsOSArNTEwLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uU3ViRGF0YTFEX2IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamJ5dGVBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfYihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqYnl0ZUFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9iLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAgamJ5dGUgKnB0ciA9IF9lbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjA1LDkgKzUyMCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGExRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAgamZsb2F0ICpwdHIgPSBfZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02MTYsOSArNTMwLDE5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGEyRF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKKy8vICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IHhvZmYsIGludCBjb21wSWR4LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7CituQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb21wSWR4LCBqYnl0ZUFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQsIGNvbiglcCksIGFsbG9jKCVwKSwgb2Zmc2V0KCVpKSwgY29tcCglaSksIGxlbiglaSksIHNpemVCeXRlcyglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgY29tcElkeCwgbGVuLCBzaXplQnl0ZXMpOworICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKKyAgICByc0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhKGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBwdHIsIGNvbXBJZHgsIHNpemVCeXRlcyk7CisgICAgX2Vudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgSk5JX0FCT1JUKTsKK30KKworc3RhdGljIHZvaWQKK25BbGxvY2F0aW9uU3ViRGF0YTJEX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGppbnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorewogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24yRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02MjcsOSArNTUxLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uU3ViRGF0YTJEX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGEyRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24yRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjM4LDkgKzU2MSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblJlYWRfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnRBcnJheSBkYXRhKQorbkFsbG9jYXRpb25SZWFkX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVhZF9pLCBjb24oJXApLCBhbGxvYyglcCksIGxlbiglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTY0OSw5ICs1NzEsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25SZWFkX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqZmxvYXRBcnJheSBkYXRhKQorbkFsbG9jYXRpb25SZWFkX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25SZWFkX2YsIGNvbiglcCksIGFsbG9jKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTY1OSw3MCArNTgwLDEwMyBAQAogICAgIF9lbnYtPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgcHRyLCAwKTsKIH0KIAotCi0vL3sibkFsbG9jYXRpb25EYXRhRnJvbU9iamVjdCIsICAgICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7TGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvbkRhdGFGcm9tT2JqZWN0IH0sCi1zdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGpvYmplY3QgX3R5cGUsIGppbnQgb2Zmc2V0LCBqb2JqZWN0IF9vKQorc3RhdGljIGppbnQKK25BbGxvY2F0aW9uR2V0VHlwZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbkRhdGFGcm9tT2JqZWN0IGNvbiglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYyk7Ci0KLSAgICBjb25zdCBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKLQotICAgIHZvaWQgKiBidWZBbGxvYyA9IG1hbGxvYyh0Yy0+c2l6ZSk7Ci0gICAgdm9pZCAqIGJ1ZiA9IGJ1ZkFsbG9jOwotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgdGMtPmZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgY29uc3QgVHlwZUZpZWxkQ2FjaGUgKnRmYyA9ICZ0Yy0+ZmllbGRzW2N0XTsKLSAgICAgICAgYnVmID0gdGZjLT5wdHIoX2VudiwgX28sIHRmYy0+ZmllbGQsIGJ1Zik7Ci0gICAgfQotICAgIHJzQWxsb2NhdGlvbjFEU3ViRGF0YShjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgMSwgYnVmQWxsb2MsIHRjLT5zaXplKTsKLSAgICBmcmVlKGJ1ZkFsbG9jKTsKKyAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbkdldFR5cGUsIGNvbiglcCksIGEoJXApIiwgY29uLCAoUnNBbGxvY2F0aW9uKWEpOworICAgIHJldHVybiAoamludCkgcnNBbGxvY2F0aW9uR2V0VHlwZShjb24sIChSc0FsbG9jYXRpb24pYSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgam9iamVjdCBfdHlwZSwgamludCBvZmZzZXQsIGpvYmplY3QgX28pCituQWxsb2NhdGlvblJlc2l6ZTFEKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBkaW1YKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVhZEZyb21PYmplY3QgY29uKCVwKSwgYWxsb2MoJXApIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblJlc2l6ZTFELCBjb24oJXApLCBhbGxvYyglcCksIHNpemVYKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgZGltWCk7CisgICAgcnNBbGxvY2F0aW9uUmVzaXplMUQoY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBkaW1YKTsKK30KIAotICAgIGFzc2VydChvZmZzZXQgPT0gMCk7CitzdGF0aWMgdm9pZAorbkFsbG9jYXRpb25SZXNpemUyRChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgZGltWCwgamludCBkaW1ZKQoreworICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVzaXplMUQsIGNvbiglcCksIGFsbG9jKCVwKSwgc2l6ZVgoJWkpLCBzaXplWSglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIGRpbVgsIGRpbVkpOworICAgIHJzQWxsb2NhdGlvblJlc2l6ZTJEKGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgZGltWCwgZGltWSk7Cit9CiAKLSAgICBjb25zdCBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICB2b2lkICogYnVmQWxsb2MgPSBtYWxsb2ModGMtPnNpemUpOwotICAgIHZvaWQgKiBidWYgPSBidWZBbGxvYzsKLSAgICByc0FsbG9jYXRpb25SZWFkKGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgYnVmQWxsb2MpOworc3RhdGljIGludAorbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG5hdGl2ZV9hc3NldCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgbmF0aXZlX2Fzc2V0KTsKIAotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgdGMtPmZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgY29uc3QgVHlwZUZpZWxkQ2FjaGUgKnRmYyA9ICZ0Yy0+ZmllbGRzW2N0XTsKLSAgICAgICAgYnVmID0gdGZjLT5yZWFkUHRyKF9lbnYsIF9vLCB0ZmMtPmZpZWxkLCBidWYpOworICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOworCisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShjb24sIGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCkpOworICAgIHJldHVybiBpZDsKK30KKworc3RhdGljIGludAorbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGZpbGVBM0QpCit7CisgICAgaW50MzJfdCBudW1FbnRyaWVzID0gMDsKKyAgICByc0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoY29uLCAmbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICByZXR1cm4gbnVtRW50cmllczsKK30KKworc3RhdGljIHZvaWQKK25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBmaWxlQTNELCBqaW50IG51bUVudHJpZXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX2VudHJpZXMpCit7CisgICAgTE9HVigiX19fX19fbkZpbGVBM0QgJXUiLCAodWludDMyX3QpIGZpbGVBM0QpOworICAgIFJzRmlsZUluZGV4RW50cnkgKmZpbGVFbnRyaWVzID0gKFJzRmlsZUluZGV4RW50cnkqKW1hbGxvYygodWludDMyX3QpbnVtRW50cmllcyAqIHNpemVvZihSc0ZpbGVJbmRleEVudHJ5KSk7CisKKyAgICByc0ZpbGVBM0RHZXRJbmRleEVudHJpZXMoY29uLCBmaWxlRW50cmllcywgKHVpbnQzMl90KW51bUVudHJpZXMsIChSc0ZpbGUpZmlsZUEzRCk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KF9lbnRyaWVzLCBpLCBfZW52LT5OZXdTdHJpbmdVVEYoZmlsZUVudHJpZXNbaV0ub2JqZWN0TmFtZSkpOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWRzLCBpLCAxLCAoY29uc3QgamludCopJmZpbGVFbnRyaWVzW2ldLmNsYXNzSUQpOwogICAgIH0KLSAgICBmcmVlKGJ1ZkFsbG9jKTsKKworICAgIGZyZWUoZmlsZUVudHJpZXMpOworfQorCitzdGF0aWMgaW50CituRmlsZUEzREdldEVudHJ5QnlJbmRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZmlsZUEzRCwgamludCBpbmRleCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgZmlsZUEzRCk7CisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzREdldEVudHJ5QnlJbmRleChjb24sICh1aW50MzJfdClpbmRleCwgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQKK25Gb250Q3JlYXRlRnJvbUZpbGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIGZpbGVOYW1lLCBqaW50IGZvbnRTaXplLCBqaW50IGRwaSkKK3sKKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZVVURiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKGZpbGVOYW1lLCBOVUxMKTsKKworICAgIGppbnQgaWQgPSAoamludClyc0ZvbnRDcmVhdGVGcm9tRmlsZShjb24sIGZpbGVOYW1lVVRGLCBmb250U2l6ZSwgZHBpKTsKKyAgICByZXR1cm4gaWQ7CiB9CiAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBhbGxvYykKK25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBhbGxvYykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24sIGNvbiglcCksIGFkYXB0ZXIoJXApLCBhbGxvYyglcCkiLCBjb24sIChSc0FkYXB0ZXIxRClhZGFwdGVyLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKICAgICByc0FkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgZGltLCBqaW50IHZhbHVlKQorbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgZGltLCBqaW50IHZhbHVlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURTZXRDb25zdHJhaW50LCBjb24oJXApLCBhZGFwdGVyKCVwKSwgZGltKCVpKSwgdmFsdWUoJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgZGltLCB2YWx1ZSk7CiAgICAgcnNBZGFwdGVyMURTZXRDb25zdHJhaW50KGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0RpbWVuc2lvbilkaW0sIHZhbHVlKTsKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMUREYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFERGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTczMSw5ICs2ODUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIxRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIG9mZnNldCwgY291bnQsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc0Miw5ICs2OTUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKK25BZGFwdGVyMUREYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFERGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIGxlbik7CiAgICAgamZsb2F0ICpwdHIgPSBfZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC03NTMsOSArNzA1LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMURTdWJEYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEU3ViRGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgb2Zmc2V0LCBjb3VudCwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc2NCw5ICs3MTUsOCBAQAogfQogCiBzdGF0aWMgamludAotbkFkYXB0ZXIxRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituQWRhcHRlcjFEQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNBZGFwdGVyMURDcmVhdGUoY29uKTsKIH0KQEAgLTc3NCwyNSArNzI0LDIyIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQorbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgYWRhcHRlciglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogICAgIHJzQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCituQWRhcHRlcjJEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRFNldENvbnN0cmFpbnQsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBkaW0oJWkpLCB2YWx1ZSglaSkiLCBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCBkaW0sIHZhbHVlKTsKICAgICByc0FkYXB0ZXIyRFNldENvbnN0cmFpbnQoY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzRGltZW5zaW9uKWRpbSwgdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCituQWRhcHRlcjJERGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkREYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtODAxLDkgKzc0OCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJERGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkREYXRhX2YsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTgxMiw5ICs3NTgsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSkKK25BZGFwdGVyMkRTdWJEYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgeG9mZiwgamludCB5b2ZmLCBqaW50IHcsIGppbnQgaCwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEU3ViRGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgeG9mZiglaSksIHlvZmYoJWkpLCB3KCVpKSwgaCglaSksIGxlbiglaSkiLAogICAgICAgICAgICAgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKQEAgLTgyNCw5ICs3NjksOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRFN1YkRhdGFfZiwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwKICAgICAgICAgICAgIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIHhvZmYsIHlvZmYsIHcsIGgsIGxlbik7CkBAIC04MzYsOSArNzgwLDggQEAKIH0KIAogc3RhdGljIGppbnQKLW5BZGFwdGVyMkRDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorbkFkYXB0ZXIyRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRENyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzQWRhcHRlcjJEQ3JlYXRlKGNvbik7CiB9CkBAIC04NDYsNDEgKzc4OSw0NyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCituU2NyaXB0QmluZEFsbG9jYXRpb24oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCwgamludCBhbGxvYywgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgc2NyaXB0KCVwKSwgYWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CiAgICAgcnNTY3JpcHRCaW5kQWxsb2NhdGlvbihjb24sIChSc1NjcmlwdClzY3JpcHQsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyQ29sb3IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamZsb2F0IHIsIGpmbG9hdCBnLCBqZmxvYXQgYiwgamZsb2F0IGEpCituU2NyaXB0U2V0VmFySShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGppbnQgdmFsKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRTZXRDbGVhckNvbG9yLCBjb24oJXApLCBzKCVwKSwgciglZiksIGcoJWYpLCBiKCVmKSwgYSglZikiLCBjb24sICh2b2lkICopc2NyaXB0LCByLCBnLCBiLCBhKTsKLSAgICByc1NjcmlwdFNldENsZWFyQ29sb3IoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCByLCBnLCBiLCBhKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFySSwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpLCB2YWwoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckkoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyRGVwdGgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamZsb2F0IGQpCituU2NyaXB0U2V0VmFyRihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGZsb2F0IHZhbCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldENsZWFyRGVwdGgsIGNvbiglcCksIHMoJXApLCBkZXB0aCglZikiLCBjb24sICh2b2lkICopc2NyaXB0LCBkKTsKLSAgICByc1NjcmlwdFNldENsZWFyRGVwdGgoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBkKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFyRiwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpLCB2YWwoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyU3RlbmNpbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHN0ZW5jaWwpCituU2NyaXB0U2V0VmFyRChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGRvdWJsZSB2YWwpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRDbGVhclN0ZW5jaWwsIGNvbiglcCksIHMoJXApLCBzdGVuY2lsKCVpKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHN0ZW5jaWwpOwotICAgIHJzU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc3RlbmNpbCk7CisgICAgTE9HX0FQSSgiblNjcmlwdFNldFZhckQsIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSwgdmFsKCVsZikiLCBjb24sICh2b2lkICopc2NyaXB0LCBzbG90LCB2YWwpOworICAgIHJzU2NyaXB0U2V0VmFyRChjb24sIChSc1NjcmlwdClzY3JpcHQsIHNsb3QsIHZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0VGltZVpvbmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamJ5dGVBcnJheSB0aW1lWm9uZSkKK25TY3JpcHRTZXRWYXJWKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGppbnQgc2xvdCwgamJ5dGVBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5TY3JpcHRTZXRWYXJWLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSkiLCBjb24sICh2b2lkICopc2NyaXB0LCBzbG90KTsKKyAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOworICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKKyAgICByc1NjcmlwdFNldFZhclYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCBwdHIsIGxlbik7CisgICAgX2Vudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgSk5JX0FCT1JUKTsKK30KKworCitzdGF0aWMgdm9pZAorblNjcmlwdFNldFRpbWVab25lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGpieXRlQXJyYXkgdGltZVpvbmUpCit7CiAgICAgTE9HX0FQSSgiblNjcmlwdENTZXRUaW1lWm9uZSwgY29uKCVwKSwgcyglcCksIHRpbWVab25lKCVzKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIChjb25zdCBjaGFyICopdGltZVpvbmUpOwogCiAgICAgamludCBsZW5ndGggPSBfZW52LT5HZXRBcnJheUxlbmd0aCh0aW1lWm9uZSk7CkBAIC04OTUsNjYgKzg0NCwzNiBAQAogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFR5cGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHR5cGUsIGpib29sZWFuIHdyaXRhYmxlLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKK25TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaiwgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkVHlwZSwgY29uKCVwKSwgdHlwZSglcCksIHdyaXRhYmxlKCVpKSwgc2xvdCglaSkiLCBjb24sIChSc1R5cGUpdHlwZSwgd3JpdGFibGUsIHNsb3QpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBOVUxMOwotICAgIGlmIChfc3RyKSB7Ci0gICAgICAgIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhfc3RyLCBOVUxMKTsKLSAgICB9Ci0gICAgcnNTY3JpcHRTZXRUeXBlKGNvbiwgKFJzVHlwZSl0eXBlLCBzbG90LCB3cml0YWJsZSwgbik7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0U2V0SW52b2tlLCBjb24oJXApIiwgY29uKTsKLSAgICBjb25zdCBjaGFyKiBuID0gTlVMTDsKLSAgICBpZiAoX3N0cikgewotICAgICAgICBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoX3N0ciwgTlVMTCk7Ci0gICAgfQotICAgIHJzU2NyaXB0U2V0SW52b2tlKGNvbiwgbiwgc2xvdCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaiwgamludCBzbG90KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRJbnZva2UsIGNvbiglcCksIHNjcmlwdCglcCkiLCBjb24sICh2b2lkICopb2JqKTsKICAgICByc1NjcmlwdEludm9rZShjb24sIChSc1NjcmlwdClvYmosIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFJvb3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc1Jvb3QpCituU2NyaXB0SW52b2tlVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldFJvb3QsIGNvbiglcCksIGlzUm9vdCglaSkiLCBjb24sIGlzUm9vdCk7Ci0gICAgcnNTY3JpcHRTZXRSb290KGNvbiwgaXNSb290KTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0SW52b2tlViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRJbnZva2VWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNjcmlwdENCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdENCZWdpbiwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNTY3JpcHRDQmVnaW4oY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDU2V0U2NyaXB0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJ5dGVBcnJheSBzY3JpcHRSZWYsCituU2NyaXB0Q1NldFNjcmlwdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpieXRlQXJyYXkgc2NyaXB0UmVmLAogICAgICAgICAgICAgICAgICAgamludCBvZmZzZXQsIGppbnQgbGVuZ3RoKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIiEhISBuU2NyaXB0Q1NldFNjcmlwdCwgY29uKCVwKSIsIGNvbik7CiAgICAgamludCBfZXhjZXB0aW9uID0gMDsKICAgICBqaW50IHJlbWFpbmluZzsKQEAgLTk5NSwxMTQgKzkxNCw4MiBAQAogfQogCiBzdGF0aWMgamludAotblNjcmlwdENDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNjcmlwdENDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRDQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNTY3JpcHRDQ3JlYXRlKGNvbik7CiB9CiAKLXN0YXRpYyB2b2lkCi1uU2NyaXB0Q0FkZERlZmluZUkzMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgbmFtZSwgamludCB2YWx1ZSkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBjb25zdCBjaGFyKiBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMobmFtZSwgTlVMTCk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENBZGREZWZpbmVJMzIsIGNvbiglcCkgbmFtZSglcykgdmFsdWUoJWQpIiwgY29uLCBuLCB2YWx1ZSk7Ci0gICAgcnNTY3JpcHRDU2V0RGVmaW5lSTMyKGNvbiwgbiwgdmFsdWUpOwotICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBuKTsKLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRDQWRkRGVmaW5lRihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgbmFtZSwgamZsb2F0IHZhbHVlKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZERlZmluZUYsIGNvbiglcCkgbmFtZSglcykgdmFsdWUoJWYpIiwgY29uLCBuLCB2YWx1ZSk7Ci0gICAgcnNTY3JpcHRDU2V0RGVmaW5lRihjb24sIG4sIHZhbHVlKTsKLSAgICBfZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobmFtZSwgbik7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGluLCBqaW50IG91dCkKK25Qcm9ncmFtU3RvcmVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgaW4sIGppbnQgb3V0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luLCBjb24oJXApLCBpbiglcCksIG91dCglcCkiLCBjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUJlZ2luLCBjb24oJXApLCBpbiglcCksIG91dCglcCkiLCBjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKKyAgICByc1Byb2dyYW1TdG9yZUJlZ2luKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmdW5jKQorblByb2dyYW1TdG9yZURlcHRoRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZnVuYykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMsIGNvbiglcCksIGZ1bmMoJWkpIiwgY29uLCBmdW5jKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGNvbiwgKFJzRGVwdGhGdW5jKWZ1bmMpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMsIGNvbiglcCksIGZ1bmMoJWkpIiwgY29uLCBmdW5jKTsKKyAgICByc1Byb2dyYW1TdG9yZURlcHRoRnVuYyhjb24sIChSc0RlcHRoRnVuYylmdW5jKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKK25Qcm9ncmFtU3RvcmVEZXB0aE1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiBlbmFibGUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soY29uLCBlbmFibGUpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEZXB0aE1hc2ssIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7CisgICAgcnNQcm9ncmFtU3RvcmVEZXB0aE1hc2soY29uLCBlbmFibGUpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gciwgamJvb2xlYW4gZywgamJvb2xlYW4gYiwgamJvb2xlYW4gYSkKK25Qcm9ncmFtU3RvcmVDb2xvck1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiByLCBqYm9vbGVhbiBnLCBqYm9vbGVhbiBiLCBqYm9vbGVhbiBhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzaywgY29uKCVwKSwgciglaSksIGcoJWkpLCBiKCVpKSwgYSglaSkiLCBjb24sIHIsIGcsIGIsIGEpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soY29uLCByLCBnLCBiLCBhKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrLCBjb24oJXApLCByKCVpKSwgZyglaSksIGIoJWkpLCBhKCVpKSIsIGNvbiwgciwgZywgYiwgYSk7CisgICAgcnNQcm9ncmFtU3RvcmVDb2xvck1hc2soY29uLCByLCBnLCBiLCBhKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGludCBzcmMsIGludCBkc3QpCituUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgaW50IHNyYywgaW50IGRzdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMsIGNvbiglcCksIHNyYyglaSksIGRzdCglaSkiLCBjb24sIHNyYywgZHN0KTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGNvbiwgKFJzQmxlbmRTcmNGdW5jKXNyYywgKFJzQmxlbmREc3RGdW5jKWRzdCk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUJsZW5kRnVuYywgY29uKCVwKSwgc3JjKCVpKSwgZHN0KCVpKSIsIGNvbiwgc3JjLCBkc3QpOworICAgIHJzUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKGNvbiwgKFJzQmxlbmRTcmNGdW5jKXNyYywgKFJzQmxlbmREc3RGdW5jKWRzdCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBlbmFibGUpCituUHJvZ3JhbVN0b3JlRGl0aGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJvb2xlYW4gZW5hYmxlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciwgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKGNvbiwgZW5hYmxlKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlRGl0aGVyLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOworICAgIHJzUHJvZ3JhbVN0b3JlRGl0aGVyKGNvbiwgZW5hYmxlKTsKIH0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituUHJvZ3JhbVN0b3JlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwotCi0gICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoY29uKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKKyAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtU3RvcmVDcmVhdGUoY29uKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUJpbmRDb25zdGFudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZwdiwgamludCBzbG90LCBqaW50IGEpCituUHJvZ3JhbUJpbmRDb25zdGFudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHZwdiwgamludCBzbG90LCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1CaW5kQ29uc3RhbnRzLCBjb24oJXApLCB2cGYoJXApLCBzbG9hdCglaSksIGEoJXApIiwgY29uLCAoUnNQcm9ncmFtVmVydGV4KXZwdiwgc2xvdCwgKFJzQWxsb2NhdGlvbilhKTsKICAgICByc1Byb2dyYW1CaW5kQ29uc3RhbnRzKGNvbiwgKFJzUHJvZ3JhbSl2cHYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUJpbmRUZXh0dXJlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cGYsIGppbnQgc2xvdCwgamludCBhKQorblByb2dyYW1CaW5kVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuUHJvZ3JhbUJpbmRUZXh0dXJlLCBjb24oJXApLCB2cGYoJXApLCBzbG90KCVpKSwgYSglcCkiLCBjb24sIChSc1Byb2dyYW1GcmFnbWVudCl2cGYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiAgICAgcnNQcm9ncmFtQmluZFRleHR1cmUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNBbGxvY2F0aW9uKWEpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1CaW5kU2FtcGxlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKK25Qcm9ncmFtQmluZFNhbXBsZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHZwZiwgamludCBzbG90LCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1CaW5kU2FtcGxlciwgY29uKCVwKSwgdnBmKCVwKSwgc2xvdCglaSksIGEoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNTYW1wbGVyKWEpOwogICAgIHJzUHJvZ3JhbUJpbmRTYW1wbGVyKGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXZwZiwgc2xvdCwgKFJzU2FtcGxlcilhKTsKIH0KQEAgLTExMTAsMzEgKzk5NywxNiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludEFycmF5IHBhcmFtcykKK25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBqaW50ICpwYXJhbVB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMocGFyYW1zLCBOVUxMKTsKLSAgICBqaW50IHBhcmFtTGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgocGFyYW1zKTsKLQotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUsIGNvbiglcCksIHBhcmFtTGVuKCVpKSIsIGNvbiwgcGFyYW1MZW4pOwotCi0gICAgamludCByZXQgPSAoamludClyc1Byb2dyYW1GcmFnbWVudENyZWF0ZShjb24sICh1aW50MzJfdCAqKXBhcmFtUHRyLCBwYXJhbUxlbik7Ci0gICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMocGFyYW1zLCBwYXJhbVB0ciwgSk5JX0FCT1JUKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudENyZWF0ZTIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBjb25zdCBjaGFyKiBzaGFkZXJVVEYgPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzaGFkZXIsIE5VTEwpOwogICAgIGppbnQgc2hhZGVyTGVuID0gX2Vudi0+R2V0U3RyaW5nVVRGTGVuZ3RoKHNoYWRlcik7CiAgICAgamludCAqcGFyYW1QdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHBhcmFtcywgTlVMTCk7CiAgICAgamludCBwYXJhbUxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHBhcmFtcyk7CiAKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiwgY29uKCVwKSwgc2hhZGVyTGVuKCVpKSwgcGFyYW1MZW4oJWkpIiwgY29uLCBzaGFkZXJMZW4sIHBhcmFtTGVuKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlLCBjb24oJXApLCBzaGFkZXJMZW4oJWkpLCBwYXJhbUxlbiglaSkiLCBjb24sIHNoYWRlckxlbiwgcGFyYW1MZW4pOwogCi0gICAgamludCByZXQgPSAoamludClyc1Byb2dyYW1GcmFnbWVudENyZWF0ZTIoY29uLCBzaGFkZXJVVEYsIHNoYWRlckxlbiwgKHVpbnQzMl90ICopcGFyYW1QdHIsIHBhcmFtTGVuKTsKKyAgICBqaW50IHJldCA9IChqaW50KXJzUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKGNvbiwgc2hhZGVyVVRGLCBzaGFkZXJMZW4sICh1aW50MzJfdCAqKXBhcmFtUHRyLCBwYXJhbUxlbik7CiAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNoYWRlciwgc2hhZGVyVVRGKTsKICAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhwYXJhbXMsIHBhcmFtUHRyLCBKTklfQUJPUlQpOwogICAgIHJldHVybiByZXQ7CkBAIC0xMTQ0LDI1ICsxMDE2LDE2IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtVmVydGV4Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gdGV4TWF0KQorblByb2dyYW1WZXJ0ZXhDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbVZlcnRleENyZWF0ZSwgY29uKCVwKSwgdGV4TWF0KCVpKSIsIGNvbiwgdGV4TWF0KTsKLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtVmVydGV4Q3JlYXRlKGNvbiwgdGV4TWF0KTsKLX0KLQotc3RhdGljIGppbnQKLW5Qcm9ncmFtVmVydGV4Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgc2hhZGVyLCBqaW50QXJyYXkgcGFyYW1zKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGNvbnN0IGNoYXIqIHNoYWRlclVURiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKHNoYWRlciwgTlVMTCk7CiAgICAgamludCBzaGFkZXJMZW4gPSBfZW52LT5HZXRTdHJpbmdVVEZMZW5ndGgoc2hhZGVyKTsKICAgICBqaW50ICpwYXJhbVB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMocGFyYW1zLCBOVUxMKTsKICAgICBqaW50IHBhcmFtTGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgocGFyYW1zKTsKIAotICAgIExPR19BUEkoIm5Qcm9ncmFtVmVydGV4Q3JlYXRlMiwgY29uKCVwKSwgc2hhZGVyTGVuKCVpKSwgcGFyYW1MZW4oJWkpIiwgY29uLCBzaGFkZXJMZW4sIHBhcmFtTGVuKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVZlcnRleENyZWF0ZSwgY29uKCVwKSwgc2hhZGVyTGVuKCVpKSwgcGFyYW1MZW4oJWkpIiwgY29uLCBzaGFkZXJMZW4sIHBhcmFtTGVuKTsKIAotICAgIGppbnQgcmV0ID0gKGppbnQpcnNQcm9ncmFtVmVydGV4Q3JlYXRlMihjb24sIHNoYWRlclVURiwgc2hhZGVyTGVuLCAodWludDMyX3QgKilwYXJhbVB0ciwgcGFyYW1MZW4pOworICAgIGppbnQgcmV0ID0gKGppbnQpcnNQcm9ncmFtVmVydGV4Q3JlYXRlKGNvbiwgc2hhZGVyVVRGLCBzaGFkZXJMZW4sICh1aW50MzJfdCAqKXBhcmFtUHRyLCBwYXJhbUxlbik7CiAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNoYWRlciwgc2hhZGVyVVRGKTsKICAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhwYXJhbXMsIHBhcmFtUHRyLCBKTklfQUJPUlQpOwogICAgIHJldHVybiByZXQ7CkBAIC0xMTcxLDcwICsxMDM0LDYxIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtUmFzdGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpbiwgamludCBvdXQsCi0gICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBwb2ludFNtb290aCwgamJvb2xlYW4gbGluZVNtb290aCwgamJvb2xlYW4gcG9pbnRTcHJpdGUpCituUHJvZ3JhbVJhc3RlckNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpib29sZWFuIHBvaW50U21vb3RoLCBqYm9vbGVhbiBsaW5lU21vb3RoLCBqYm9vbGVhbiBwb2ludFNwcml0ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlckNyZWF0ZSwgY29uKCVwKSwgaW4oJXApLCBvdXQoJXApLCBwb2ludFNtb290aCglaSksIGxpbmVTbW9vdGgoJWkpLCBwb2ludFNwcml0ZSglaSkiLAotICAgICAgICAgICAgY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCwgcG9pbnRTbW9vdGgsIGxpbmVTbW9vdGgsIHBvaW50U3ByaXRlKTsKLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtUmFzdGVyQ3JlYXRlKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJDcmVhdGUsIGNvbiglcCksIHBvaW50U21vb3RoKCVpKSwgbGluZVNtb290aCglaSksIHBvaW50U3ByaXRlKCVpKSIsCisgICAgICAgICAgICBjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbVJhc3RlckNyZWF0ZShjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnByLCBqZmxvYXQgdikKK25Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGpmbG9hdCB2KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKLX0KLQotc3RhdGljIHZvaWQKLW5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cHIsIGpmbG9hdCB2KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgdik7Cit9CisKK3N0YXRpYyB2b2lkCituUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGppbnQgdikKK3sKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglaSkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCAoUnNDdWxsTW9kZSl2KTsKIH0KIAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCkKK25Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRSb290U2NyaXB0LCBjb24oJXApLCBzY3JpcHQoJXApIiwgY29uLCAoUnNTY3JpcHQpc2NyaXB0KTsKICAgICByc0NvbnRleHRCaW5kUm9vdFNjcmlwdChjb24sIChSc1NjcmlwdClzY3JpcHQpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmcykKK25Db250ZXh0QmluZFByb2dyYW1TdG9yZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGZzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSlwZnMpOwotICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShjb24sIChSc1Byb2dyYW1GcmFnbWVudFN0b3JlKXBmcyk7CisgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtU3RvcmUpcGZzKTsKKyAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGNvbiwgKFJzUHJvZ3JhbVN0b3JlKXBmcyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQsIGNvbiglcCksIHBmKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCwgY29uKCVwKSwgcGYoJXApIiwgY29uLCAoUnNQcm9ncmFtVmVydGV4KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChjb24sIChSc1Byb2dyYW1WZXJ0ZXgpcGYpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcGYpCituQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyLCBjb24oJXApLCBwZiglcCkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpcGYpOwogICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGNvbiwgKFJzUHJvZ3JhbVJhc3RlcilwZik7CiB9CkBAIC0xMjQzLDEwOCArMTA5NywxMDcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituU2FtcGxlckJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuU2FtcGxlckJlZ2luLCBjb24oJXApIiwgY29uKTsKICAgICByc1NhbXBsZXJCZWdpbihjb24pOwogfQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJTZXQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHAsIGppbnQgdikKK25TYW1wbGVyU2V0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwLCBqaW50IHYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNhbXBsZXJTZXQsIGNvbiglcCksIHBhcmFtKCVpKSwgdmFsdWUoJWkpIiwgY29uLCBwLCB2KTsKICAgICByc1NhbXBsZXJTZXQoY29uLCAoUnNTYW1wbGVyUGFyYW0pcCwgKFJzU2FtcGxlclZhbHVlKXYpOwogfQogCi1zdGF0aWMgamludAotblNhbXBsZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorc3RhdGljIHZvaWQKK25TYW1wbGVyU2V0MihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcCwgamZsb2F0IHYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgTE9HX0FQSSgiblNhbXBsZXJTZXQyLCBjb24oJXApLCBwYXJhbSglaSksIHZhbHVlKCVmKSIsIGNvbiwgcCwgdik7CisgICAgcnNTYW1wbGVyU2V0Mihjb24sIChSc1NhbXBsZXJQYXJhbSlwLCB2KTsKK30KKworc3RhdGljIGppbnQKK25TYW1wbGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKK3sKICAgICBMT0dfQVBJKCJuU2FtcGxlckNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzU2FtcGxlckNyZWF0ZShjb24pOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIHZvaWQKLW5MaWdodEJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRCZWdpbiwgY29uKCVwKSIsIGNvbik7Ci0gICAgcnNMaWdodEJlZ2luKGNvbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uTGlnaHRTZXRJc01vbm8oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc01vbm8pCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0SXNNb25vLCBjb24oJXApLCBpc01vbm8oJWkpIiwgY29uLCBpc01vbm8pOwotICAgIHJzTGlnaHRTZXRNb25vY2hyb21hdGljKGNvbiwgaXNNb25vKTsKLX0KLQotc3RhdGljIHZvaWQKLW5MaWdodFNldElzTG9jYWwoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc0xvY2FsKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5MaWdodFNldElzTG9jYWwsIGNvbiglcCksIGlzTG9jYWwoJWkpIiwgY29uLCBpc0xvY2FsKTsKLSAgICByc0xpZ2h0U2V0TG9jYWwoY29uLCBpc0xvY2FsKTsKLX0KLQogc3RhdGljIGppbnQKLW5MaWdodENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituTWVzaENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnR4Q291bnQsIGppbnQgaWR4Q291bnQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0Q3JlYXRlLCBjb24oJXApIiwgY29uKTsKLSAgICByZXR1cm4gKGppbnQpcnNMaWdodENyZWF0ZShjb24pOwotfQotCi1zdGF0aWMgdm9pZAotbkxpZ2h0U2V0Q29sb3IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGxpZ2h0LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5MaWdodFNldENvbG9yLCBjb24oJXApLCBsaWdodCglcCksIHIoJWYpLCBnKCVmKSwgYiglZikiLCBjb24sIChSc0xpZ2h0KWxpZ2h0LCByLCBnLCBiKTsKLSAgICByc0xpZ2h0U2V0Q29sb3IoY29uLCAoUnNMaWdodClsaWdodCwgciwgZywgYik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uTGlnaHRTZXRQb3NpdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbGlnaHQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0UG9zaXRpb24sIGNvbiglcCksIGxpZ2h0KCVwKSwgeCglZiksIHkoJWYpLCB6KCVmKSIsIGNvbiwgKFJzTGlnaHQpbGlnaHQsIHgsIHksIHopOwotICAgIHJzTGlnaHRTZXRQb3NpdGlvbihjb24sIChSc0xpZ2h0KWxpZ2h0LCB4LCB5LCB6KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBqaW50Ci1uU2ltcGxlTWVzaENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYmF0Y2hJRCwgamludCBpbmRleElELCBqaW50QXJyYXkgdnR4SURzLCBqaW50IHByaW1JRCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHZ0eElEcyk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hDcmVhdGUsIGNvbiglcCksIGJhdGNoSUQoJWkpLCBpbmRleElEKCVpKSwgdnR4SURzLmxlbiglaSksIHByaW1JRCglaSkiLAotICAgICAgICAgICAgY29uLCBiYXRjaElELCBpbmRleElELCBsZW4sIHByaW1JRCk7Ci0gICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyh2dHhJRHMsIE5VTEwpOwotICAgIGludCBpZCA9IChpbnQpcnNTaW1wbGVNZXNoQ3JlYXRlKGNvbiwgKHZvaWQgKiliYXRjaElELCAodm9pZCAqKWluZGV4SUQsICh2b2lkICoqKXB0ciwgbGVuLCBwcmltSUQpOwotICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKHZ0eElEcywgcHRyLCAwLypKTklfQUJPUlQqLyk7CisgICAgTE9HX0FQSSgibk1lc2hDcmVhdGUsIGNvbiglcCksIHZ0eENvdW50KCVpKSwgaWR4Q291bnQoJWkpIiwgY29uLCB2dHhDb3VudCwgaWR4Q291bnQpOworICAgIGludCBpZCA9IChpbnQpcnNNZXNoQ3JlYXRlKGNvbiwgdnR4Q291bnQsIGlkeENvdW50KTsKICAgICByZXR1cm4gaWQ7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2ltcGxlTWVzaEJpbmRWZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHMsIGppbnQgYWxsb2MsIGppbnQgc2xvdCkKK25NZXNoQmluZFZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludCBhbGxvYywgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TaW1wbGVNZXNoQmluZFZlcnRleCwgY29uKCVwKSwgU2ltcGxlTWVzaCglcCksIEFsbG9jKCVwKSwgc2xvdCglaSkiLCBjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7Ci0gICAgcnNTaW1wbGVNZXNoQmluZFZlcnRleChjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CisgICAgTE9HX0FQSSgibk1lc2hCaW5kVmVydGV4LCBjb24oJXApLCBNZXNoKCVwKSwgQWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKKyAgICByc01lc2hCaW5kVmVydGV4KGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKIH0KIAogc3RhdGljIHZvaWQKLW5TaW1wbGVNZXNoQmluZEluZGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzLCBqaW50IGFsbG9jKQorbk1lc2hCaW5kSW5kZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG1lc2gsIGppbnQgYWxsb2MsIGppbnQgcHJpbUlELCBqaW50IHNsb3QpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hCaW5kSW5kZXgsIGNvbiglcCksIFNpbXBsZU1lc2goJXApLCBBbGxvYyglcCkiLCBjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYyk7Ci0gICAgcnNTaW1wbGVNZXNoQmluZEluZGV4KGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICBMT0dfQVBJKCJuTWVzaEJpbmRJbmRleCwgY29uKCVwKSwgTWVzaCglcCksIEFsbG9jKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICByc01lc2hCaW5kSW5kZXgoY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHByaW1JRCwgc2xvdCk7Cit9CisKK3N0YXRpYyBqaW50CituTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoKQoreworICAgIExPR19BUEkoIm5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQsIGNvbiglcCksIE1lc2goJXApIiwgY29uLCAoUnNNZXNoKW1lc2gpOworICAgIGppbnQgdnR4Q291bnQgPSAwOworICAgIHJzTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KGNvbiwgKFJzTWVzaCltZXNoLCAmdnR4Q291bnQpOworICAgIHJldHVybiB2dHhDb3VudDsKK30KKworc3RhdGljIGppbnQKK25NZXNoR2V0SW5kZXhDb3VudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCkKK3sKKyAgICBMT0dfQVBJKCJuTWVzaEdldEluZGV4Q291bnQsIGNvbiglcCksIE1lc2goJXApIiwgY29uLCAoUnNNZXNoKW1lc2gpOworICAgIGppbnQgaWR4Q291bnQgPSAwOworICAgIHJzTWVzaEdldEluZGV4Q291bnQoY29uLCAoUnNNZXNoKW1lc2gsICZpZHhDb3VudCk7CisgICAgcmV0dXJuIGlkeENvdW50OworfQorCitzdGF0aWMgdm9pZAorbk1lc2hHZXRWZXJ0aWNlcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludEFycmF5IF9pZHMsIGludCBudW1WdHhJRHMpCit7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0aWNlcywgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisKKyAgICBSc0FsbG9jYXRpb24gKmFsbG9jcyA9IChSc0FsbG9jYXRpb24qKW1hbGxvYygodWludDMyX3QpbnVtVnR4SURzICogc2l6ZW9mKFJzQWxsb2NhdGlvbikpOworICAgIHJzTWVzaEdldFZlcnRpY2VzKGNvbiwgKFJzTWVzaCltZXNoLCBhbGxvY3MsICh1aW50MzJfdCludW1WdHhJRHMpOworCisgICAgZm9yKGppbnQgaSA9IDA7IGkgPCBudW1WdHhJRHM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2lkcywgaSwgMSwgKGNvbnN0IGppbnQqKSZhbGxvY3NbaV0pOworICAgIH0KKworICAgIGZyZWUoYWxsb2NzKTsKK30KKworc3RhdGljIHZvaWQKK25NZXNoR2V0SW5kaWNlcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludEFycmF5IF9pZHhJZHMsIGppbnRBcnJheSBfcHJpbWl0aXZlcywgaW50IG51bUluZGljZXMpCit7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0aWNlcywgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisKKyAgICBSc0FsbG9jYXRpb24gKmFsbG9jcyA9IChSc0FsbG9jYXRpb24qKW1hbGxvYygodWludDMyX3QpbnVtSW5kaWNlcyAqIHNpemVvZihSc0FsbG9jYXRpb24pKTsKKyAgICB1aW50MzJfdCAqcHJpbXM9ICh1aW50MzJfdCopbWFsbG9jKCh1aW50MzJfdCludW1JbmRpY2VzICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICByc01lc2hHZXRJbmRpY2VzKGNvbiwgKFJzTWVzaCltZXNoLCBhbGxvY3MsIHByaW1zLCAodWludDMyX3QpbnVtSW5kaWNlcyk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bUluZGljZXM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2lkeElkcywgaSwgMSwgKGNvbnN0IGppbnQqKSZhbGxvY3NbaV0pOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfcHJpbWl0aXZlcywgaSwgMSwgKGNvbnN0IGppbnQqKSZwcmltc1tpXSk7CisgICAgfQorCisgICAgZnJlZShhbGxvY3MpOworICAgIGZyZWUocHJpbXMpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzNTksMTI0ICsxMjEyLDEzMSBAQAogeyJuRGV2aWNlQ3JlYXRlIiwgICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5EZXZpY2VDcmVhdGUgfSwKIHsibkRldmljZURlc3Ryb3kiLCAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRGV2aWNlRGVzdHJveSB9LAogeyJuRGV2aWNlU2V0Q29uZmlnIiwgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5EZXZpY2VTZXRDb25maWcgfSwKLXsibkNvbnRleHRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dENyZWF0ZSB9LAoteyJuQ29udGV4dENyZWF0ZUdMIiwgICAgICAgICAgICAgICAiKElJWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlR0wgfSwKLXsibkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFNldFByaW9yaXR5IH0sCi17Im5Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlMYW5kcm9pZC92aWV3L1N1cmZhY2U7KVYiLCAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRTdXJmYWNlIH0sCi17Im5Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREZXN0cm95IH0sCi17Im5Db250ZXh0RHVtcCIsICAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREdW1wIH0sCi17Im5Db250ZXh0UGF1c2UiLCAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRQYXVzZSB9LAoteyJuQ29udGV4dFJlc3VtZSIsICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0UmVzdW1lIH0sCi17Im5Bc3NpZ25OYW1lIiwgICAgICAgICAgICAgICAgICAgICIoSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFzc2lnbk5hbWUgfSwKLXsibk9iakRlc3Ryb3kiLCAgICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluT2JqRGVzdHJveSB9LAoteyJuT2JqRGVzdHJveU9PQiIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5PYmpEZXN0cm95T09CIH0sCi17Im5Db250ZXh0R2V0TWVzc2FnZSIsICAgICAgICAgICAgICIoW0laKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRHZXRNZXNzYWdlIH0sCi17Im5Db250ZXh0SW5pdFRvQ2xpZW50IiwgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRJbml0VG9DbGllbnQgfSwKLXsibkNvbnRleHREZWluaXRUb0NsaWVudCIsICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlaW5pdFRvQ2xpZW50IH0sCit7Im5Db250ZXh0R2V0TWVzc2FnZSIsICAgICAgICAgICAgICIoSVtJWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0R2V0TWVzc2FnZSB9LAoreyJuQ29udGV4dEluaXRUb0NsaWVudCIsICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEluaXRUb0NsaWVudCB9LAoreyJuQ29udGV4dERlaW5pdFRvQ2xpZW50IiwgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlaW5pdFRvQ2xpZW50IH0sCiAKLXsibkZpbGVPcGVuIiwgICAgICAgICAgICAgICAgICAgICAgIihbQilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZU9wZW4gfSwKIAoteyJuRWxlbWVudENyZWF0ZSIsICAgICAgICAgICAgICAgICAiKElJWkkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50Q3JlYXRlIH0sCi17Im5FbGVtZW50Q3JlYXRlMiIsICAgICAgICAgICAgICAgICIoW0lbTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUyIH0sCisvLyBBbGwgbWV0aG9kcyBiZWxvdyBhcmUgdGhyZWFkIHByb3RlY3RlZCBpbiBqYXZhLgoreyJyc25Db250ZXh0Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlIH0sCit7InJzbkNvbnRleHRDcmVhdGVHTCIsICAgICAgICAgICAgICAgIihJSVopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGVHTCB9LAoreyJyc25Db250ZXh0RmluaXNoIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RmluaXNoIH0sCit7InJzbkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRQcmlvcml0eSB9LAoreyJyc25Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlJTGFuZHJvaWQvdmlldy9TdXJmYWNlOylWIiwgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0U3VyZmFjZSB9LAoreyJyc25Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVzdHJveSB9LAoreyJyc25Db250ZXh0RHVtcCIsICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RHVtcCB9LAoreyJyc25Db250ZXh0UGF1c2UiLCAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0UGF1c2UgfSwKK3sicnNuQ29udGV4dFJlc3VtZSIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFJlc3VtZSB9LAoreyJyc25Bc3NpZ25OYW1lIiwgICAgICAgICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Bc3NpZ25OYW1lIH0sCit7InJzbkdldE5hbWUiLCAgICAgICAgICAgICAgICAgICAgICAgIihJSSlMamF2YS9sYW5nL1N0cmluZzsiLCAgICAgICAgICAgICAgICAodm9pZCopbkdldE5hbWUgfSwKK3sicnNuT2JqRGVzdHJveSIsICAgICAgICAgICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluT2JqRGVzdHJveSB9LAogCi17Im5UeXBlQmVnaW4iLCAgICAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVCZWdpbiB9LAoteyJuVHlwZUFkZCIsICAgICAgICAgICAgICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQWRkIH0sCi17Im5UeXBlQ3JlYXRlIiwgICAgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVDcmVhdGUgfSwKLXsiblR5cGVGaW5hbERlc3Ryb3kiLCAgICAgICAgICAgICAgIihMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTspViIsICAgICAgICh2b2lkKiluVHlwZUZpbmFsRGVzdHJveSB9LAoteyJuVHlwZVNldHVwRmllbGRzIiwgICAgICAgICAgICAgICAiKExhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlO1tJW0lbTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOylWIiwgKHZvaWQqKW5UeXBlU2V0dXBGaWVsZHMgfSwKK3sicnNuRmlsZU9wZW4iLCAgICAgICAgICAgICAgICAgICAgICAiKElbQilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZU9wZW4gfSwKK3sicnNuRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbSIsICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoreyJyc25GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIiwgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIH0sCit7InJzbkZpbGVBM0RHZXRJbmRleEVudHJpZXMiLCAgICAgICAgIihJSUlbSVtMamF2YS9sYW5nL1N0cmluZzspViIsICAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXRJbmRleEVudHJpZXMgfSwKK3sicnNuRmlsZUEzREdldEVudHJ5QnlJbmRleCIsICAgICAgICAiKElJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzREdldEVudHJ5QnlJbmRleCB9LAogCi17Im5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQiLCAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVUeXBlZCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAiLCAgICAiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiIsICAgICAiKElMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7KUkiLCAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIH0sCi17Im5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIiwiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQgfSwKLXsibkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCIoSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoteyJuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSIsICAgICAiKElaSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIH0sCi17Im5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2kgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlbU0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9zIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfYiB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtGSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGEyRF9pIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTJEIiwgICAgICAgICAgICIoSUlJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfZiB9LAoteyJuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9pIH0sCi17Im5BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCIsICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7SUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IiwgICAiKElMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtJTGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IH0sCit7InJzbkZvbnRDcmVhdGVGcm9tRmlsZSIsICAgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUkpSSIsICAgICAgICAgICAgICAodm9pZCopbkZvbnRDcmVhdGVGcm9tRmlsZSB9LAogCi17Im5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uIH0sCi17Im5BZGFwdGVyMURTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQgfSwKLXsibkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFERGF0YV9pIH0sCi17Im5BZGFwdGVyMUREYXRhIiwgICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRERhdGFfZiB9LAoteyJuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTdWJEYXRhX2kgfSwKLXsibkFkYXB0ZXIxRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU3ViRGF0YV9mIH0sCi17Im5BZGFwdGVyMURDcmVhdGUiLCAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRENyZWF0ZSB9LAoreyJyc25FbGVtZW50Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUlJWkkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50Q3JlYXRlIH0sCit7InJzbkVsZW1lbnRDcmVhdGUyIiwgICAgICAgICAgICAgICAgIihJW0lbTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUyIH0sCit7InJzbkVsZW1lbnRHZXROYXRpdmVEYXRhIiwgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRHZXROYXRpdmVEYXRhIH0sCit7InJzbkVsZW1lbnRHZXRTdWJFbGVtZW50cyIsICAgICAgICAgIihJSVtJW0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRHZXRTdWJFbGVtZW50cyB9LAogCi17Im5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIH0sCi17Im5BZGFwdGVyMkRTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQgfSwKLXsibkFkYXB0ZXIyRERhdGEiLCAgICAgICAgICAgICAgICAgIihJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJERGF0YV9pIH0sCi17Im5BZGFwdGVyMkREYXRhIiwgICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfZiB9LAoteyJuQWRhcHRlcjJEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTdWJEYXRhX2kgfSwKLXsibkFkYXB0ZXIyRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9mIH0sCi17Im5BZGFwdGVyMkRDcmVhdGUiLCAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRENyZWF0ZSB9LAoreyJyc25UeXBlQmVnaW4iLCAgICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQmVnaW4gfSwKK3sicnNuVHlwZUFkZCIsICAgICAgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUFkZCB9LAoreyJyc25UeXBlQ3JlYXRlIiwgICAgICAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQ3JlYXRlIH0sCit7InJzblR5cGVHZXROYXRpdmVEYXRhIiwgICAgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVHZXROYXRpdmVEYXRhIH0sCiAKLXsiblNjcmlwdEJpbmRBbGxvY2F0aW9uIiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0QmluZEFsbG9jYXRpb24gfSwKLXsiblNjcmlwdFNldENsZWFyQ29sb3IiLCAgICAgICAgICAgIihJRkZGRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Q2xlYXJDb2xvciB9LAoteyJuU2NyaXB0U2V0Q2xlYXJEZXB0aCIsICAgICAgICAgICAiKElGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRDbGVhckRlcHRoIH0sCi17Im5TY3JpcHRTZXRDbGVhclN0ZW5jaWwiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldENsZWFyU3RlbmNpbCB9LAoteyJuU2NyaXB0U2V0VGltZVpvbmUiLCAgICAgICAgICAgICAiKElbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRUaW1lWm9uZSB9LAoteyJuU2NyaXB0U2V0VHlwZSIsICAgICAgICAgICAgICAgICAiKElaTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRUeXBlIH0sCi17Im5TY3JpcHRTZXRSb290IiwgICAgICAgICAgICAgICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFJvb3QgfSwKLXsiblNjcmlwdFNldEludm9rYWJsZSIsICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0SW52b2tlIH0sCi17Im5TY3JpcHRJbnZva2UiLCAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZSB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlVHlwZWQiLCAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQgfSwKK3sicnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAiLCAgICAiKElJWkxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDspSSIsICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAgfSwKK3sicnNuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiIsICAgICAiKElJTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIiwiKElJWkxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDspSSIsICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIH0sCit7InJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCIoSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0gfSwKK3sicnNuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSIsICAgICAiKElJWkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSB9LAoreyJyc25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QiLCIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSUlbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9pIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlJW1NJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfcyB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJSVtCSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2IgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9mIH0sCit7InJzbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEIiwgICAgIihJSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSUlbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfaSB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTJEIiwgICAgICAgICAgICIoSUlJSUlJW0ZJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTJEX2YgfSwKK3sicnNuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblJlYWRfaSB9LAoreyJyc25BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9mIH0sCit7InJzbkFsbG9jYXRpb25HZXRUeXBlIiwgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25HZXRUeXBlfSwKK3sicnNuQWxsb2NhdGlvblJlc2l6ZTFEIiwgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblJlc2l6ZTFEIH0sCit7InJzbkFsbG9jYXRpb25SZXNpemUyRCIsICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZXNpemUyRCB9LAogCi17Im5TY3JpcHRDQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENCZWdpbiB9LAoteyJuU2NyaXB0Q1NldFNjcmlwdCIsICAgICAgICAgICAgICAiKFtCSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDU2V0U2NyaXB0IH0sCi17Im5TY3JpcHRDQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENDcmVhdGUgfSwKLXsiblNjcmlwdENBZGREZWZpbmVJMzIiLCAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0FkZERlZmluZUkzMiB9LAoteyJuU2NyaXB0Q0FkZERlZmluZUYiLCAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0YpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQWRkRGVmaW5lRiB9LAoreyJyc25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiB9LAoreyJyc25BZGFwdGVyMURTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTZXRDb25zdHJhaW50IH0sCit7InJzbkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRERhdGFfaSB9LAoreyJyc25BZGFwdGVyMUREYXRhIiwgICAgICAgICAgICAgICAgICIoSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMUREYXRhX2YgfSwKK3sicnNuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU3ViRGF0YV9pIH0sCit7InJzbkFkYXB0ZXIxRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFN1YkRhdGFfZiB9LAoreyJyc25BZGFwdGVyMURDcmVhdGUiLCAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiIsICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyIsICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayIsICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayIsICIoWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyIsICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciIsICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSIsICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIH0sCit7InJzbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIH0sCit7InJzbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQgfSwKK3sicnNuQWRhcHRlcjJERGF0YSIsICAgICAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJERGF0YV9pIH0sCit7InJzbkFkYXB0ZXIyRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfZiB9LAoreyJyc25BZGFwdGVyMkRTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTdWJEYXRhX2kgfSwKK3sicnNuQWRhcHRlcjJEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9mIH0sCit7InJzbkFkYXB0ZXIyRENyZWF0ZSIsICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRENyZWF0ZSB9LAogCi17Im5Qcm9ncmFtQmluZENvbnN0YW50cyIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kQ29uc3RhbnRzIH0sCi17Im5Qcm9ncmFtQmluZFRleHR1cmUiLCAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kVGV4dHVyZSB9LAoteyJuUHJvZ3JhbUJpbmRTYW1wbGVyIiwgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZFNhbXBsZXIgfSwKK3sicnNuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0QmluZEFsbG9jYXRpb24gfSwKK3sicnNuU2NyaXB0U2V0VGltZVpvbmUiLCAgICAgICAgICAgICAiKElJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VGltZVpvbmUgfSwKK3sicnNuU2NyaXB0SW52b2tlIiwgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7InJzblNjcmlwdEludm9rZVYiLCAgICAgICAgICAgICAgICAgIihJSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZVYgfSwKK3sicnNuU2NyaXB0U2V0VmFySSIsICAgICAgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFySSB9LAoreyJyc25TY3JpcHRTZXRWYXJGIiwgICAgICAgICAgICAgICAgICIoSUlJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRWYXJGIH0sCit7InJzblNjcmlwdFNldFZhckQiLCAgICAgICAgICAgICAgICAgIihJSUlEKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFZhckQgfSwKK3sicnNuU2NyaXB0U2V0VmFyViIsICAgICAgICAgICAgICAgICAiKElJSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFyViB9LAogCi17Im5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUiLCAgICAgICAgICIoW0kpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudENyZWF0ZSB9LAoteyJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiIsICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1tJKUkiLCAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyIH0sCit7InJzblNjcmlwdENCZWdpbiIsICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENCZWdpbiB9LAoreyJyc25TY3JpcHRDU2V0U2NyaXB0IiwgICAgICAgICAgICAgICIoSVtCSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDU2V0U2NyaXB0IH0sCit7InJzblNjcmlwdENDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbVJhc3RlckNyZWF0ZSIsICAgICAgICAgICAiKElJWlpaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyQ3JlYXRlIH0sCi17Im5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplIiwgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUgfSwKLXsiblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgiLCAgICAgIihJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCB9LAoreyJyc25Qcm9ncmFtU3RvcmVCZWdpbiIsICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVCZWdpbiB9LAoreyJyc25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMgfSwKK3sicnNuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIiwgICAgICAgICAiKElaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIH0sCit7InJzblByb2dyYW1TdG9yZUNvbG9yTWFzayIsICAgICAgICAgIihJWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUNvbG9yTWFzayB9LAoreyJyc25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMiLCAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMgfSwKK3sicnNuUHJvZ3JhbVN0b3JlRGl0aGVyIiwgICAgICAgICAgICAiKElaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlRGl0aGVyIH0sCit7InJzblByb2dyYW1TdG9yZUNyZWF0ZSIsICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUNyZWF0ZSB9LAogCi17Im5Qcm9ncmFtVmVydGV4Q3JlYXRlIiwgICAgICAgICAgICIoWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUgfSwKLXsiblByb2dyYW1WZXJ0ZXhDcmVhdGUyIiwgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVZlcnRleENyZWF0ZTIgfSwKK3sicnNuUHJvZ3JhbUJpbmRDb25zdGFudHMiLCAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRDb25zdGFudHMgfSwKK3sicnNuUHJvZ3JhbUJpbmRUZXh0dXJlIiwgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRUZXh0dXJlIH0sCit7InJzblByb2dyYW1CaW5kU2FtcGxlciIsICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kU2FtcGxlciB9LAogCi17Im5MaWdodEJlZ2luIiwgICAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0QmVnaW4gfSwKLXsibkxpZ2h0U2V0SXNNb25vIiwgICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRJc01vbm8gfSwKLXsibkxpZ2h0U2V0SXNMb2NhbCIsICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRJc0xvY2FsIH0sCi17Im5MaWdodENyZWF0ZSIsICAgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0Q3JlYXRlIH0sCi17Im5MaWdodFNldENvbG9yIiwgICAgICAgICAgICAgICAgICIoSUZGRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0Q29sb3IgfSwKLXsibkxpZ2h0U2V0UG9zaXRpb24iLCAgICAgICAgICAgICAgIihJRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRQb3NpdGlvbiB9LAoreyJyc25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUiLCAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUgfSwKIAoteyJuQ29udGV4dEJpbmRSb290U2NyaXB0IiwgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFJvb3RTY3JpcHQgfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQiLCAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4IiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXggfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciIsICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIH0sCit7InJzblByb2dyYW1SYXN0ZXJDcmVhdGUiLCAgICAgICAgICAgIihJWlpaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJDcmVhdGUgfSwKK3sicnNuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCIsICAgICAiKElJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCB9LAoreyJyc25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUiLCAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUgfSwKIAoteyJuU2FtcGxlckJlZ2luIiwgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQmVnaW4gfSwKLXsiblNhbXBsZXJTZXQiLCAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlclNldCB9LAoteyJuU2FtcGxlckNyZWF0ZSIsICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQ3JlYXRlIH0sCit7InJzblByb2dyYW1WZXJ0ZXhDcmVhdGUiLCAgICAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUgfSwKIAoteyJuU2ltcGxlTWVzaENyZWF0ZSIsICAgICAgICAgICAgICAiKElJW0lJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQ3JlYXRlIH0sCi17Im5TaW1wbGVNZXNoQmluZFZlcnRleCIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNpbXBsZU1lc2hCaW5kVmVydGV4IH0sCi17Im5TaW1wbGVNZXNoQmluZEluZGV4IiwgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNpbXBsZU1lc2hCaW5kSW5kZXggfSwKK3sicnNuQ29udGV4dEJpbmRSb290U2NyaXB0IiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRSb290U2NyaXB0IH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IiwgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCIsICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCB9LAoreyJyc25Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIiLCAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIgfSwKKworeyJyc25TYW1wbGVyQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQmVnaW4gfSwKK3sicnNuU2FtcGxlclNldCIsICAgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlclNldCB9LAoreyJyc25TYW1wbGVyU2V0MiIsICAgICAgICAgICAgICAgICAgICIoSUlGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyU2V0MiB9LAoreyJyc25TYW1wbGVyQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQ3JlYXRlIH0sCisKK3sicnNuTWVzaENyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKElJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaENyZWF0ZSB9LAoreyJyc25NZXNoQmluZFZlcnRleCIsICAgICAgICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZFZlcnRleCB9LAoreyJyc25NZXNoQmluZEluZGV4IiwgICAgICAgICAgICAgICAgICIoSUlJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZEluZGV4IH0sCisKK3sicnNuTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IiwgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IH0sCit7InJzbk1lc2hHZXRJbmRleENvdW50IiwgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRJbmRleENvdW50IH0sCit7InJzbk1lc2hHZXRWZXJ0aWNlcyIsICAgICAgICAgICAgICAgIihJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRWZXJ0aWNlcyB9LAoreyJyc25NZXNoR2V0SW5kaWNlcyIsICAgICAgICAgICAgICAgICIoSUlbSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoR2V0SW5kaWNlcyB9LAogCiB9OwogCkBAIC0xNTEwLDMgKzEzNzAsNCBAQAogYmFpbDoKICAgICByZXR1cm4gcmVzdWx0OwogfQorCmRpZmYgLS1naXQgYS9ncmFwaGljcy90ZXN0cy9ncmFwaGljc3Rlc3RzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnlUZXN0LmphdmEgYi9ncmFwaGljcy90ZXN0cy9ncmFwaGljc3Rlc3RzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4MjBlZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL3Rlc3RzL2dyYXBoaWNzdGVzdHMvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCitwdWJsaWMgY2xhc3MgQml0bWFwRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvLyB0ZXN0cyB0aGF0IHdlIGNhbiBkZWNvZGUgYml0bWFwcyBmcm9tIE1lbW9yeUZpbGVzCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaXRtYXBQYXJjZWxGaWxlRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCaXRtYXAgYml0bWFwMSA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoCisgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgQ29sb3IuQkxVRSB9LCAxLCAxLCBCaXRtYXAuQ29uZmlnLlJHQl81NjUpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBiaXRtYXAxLmNvbXByZXNzKEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5QTkcsIDEwMCwgb3V0KTsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuZnJvbURhdGEob3V0LnRvQnl0ZUFycmF5KCksIG51bGwpOworICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IHBmZC5nZXRGaWxlRGVzY3JpcHRvcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJHb3QgbnVsbCBGaWxlRGVzY3JpcHRvciIsIGZkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiR290IGludmFsaWQgRmlsZURlc2NyaXB0b3IiLCBmZC52YWxpZCgpKTsKKyAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlRmlsZURlc2NyaXB0b3IoZmQpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJCaXRtYXBGYWN0b3J5IHJldHVybmVkIG51bGwiLCBiaXRtYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJpdG1hcCB3aWR0aCIsIDEsIGJpdG1hcC5nZXRXaWR0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCaXRtYXAgaGVpZ2h0IiwgMSwgYml0bWFwLmdldEhlaWdodCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEgYi9pY3U0ai9qYXZhL2FuZHJvaWQvaWN1L3RleHQvQXJhYmljU2hhcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTIxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9pY3U0ai9qYXZhL2FuZHJvaWQvaWN1L3RleHQvQXJhYmljU2hhcGluZy5qYXZhCkBAIC0wLDAgKzEsMTk0NyBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyoKKyAqIFBvcnRlZCB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMgZnJvbSBJQ1U0SiA0LjIncworICogY29tLmlibS5pY3UudGV4dC5BcmFiaWNTaGFwaW5nIGNsYXNzLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5pY3UudGV4dDsKKworCisvKioKKyAqIFNoYXBlIEFyYWJpYyB0ZXh0IG9uIGEgY2hhcmFjdGVyIGJhc2lzLgorICoKKyAqIDxwPkFyYWJpY1NoYXBpbmcgcGVyZm9ybXMgYmFzaWMgb3BlcmF0aW9ucyBmb3IgInNoYXBpbmciIEFyYWJpYyB0ZXh0LiBJdCBpcyBtb3N0CisgKiB1c2VmdWwgZm9yIHVzZSB3aXRoIGxlZ2FjeSBkYXRhIGZvcm1hdHMgYW5kIGxlZ2FjeSBkaXNwbGF5IHRlY2hub2xvZ3kKKyAqIChzaW1wbGUgdGVybWluYWxzKS4gQWxsIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiBVbmljb2RlIGNoYXJhY3RlcnMuPC9wPgorICoKKyAqIDxwPlRleHQtYmFzZWQgc2hhcGluZyBtZWFucyB0aGF0IHNvbWUgY2hhcmFjdGVyIGNvZGUgcG9pbnRzIGluIHRoZSB0ZXh0IGFyZQorICogcmVwbGFjZWQgYnkgb3RoZXJzIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4gSXQgdHJhbnNmb3JtcyBvbmUga2luZCBvZiB0ZXh0CisgKiBpbnRvIGFub3RoZXIuIEluIGNvbXBhcmlzb24sIG1vZGVybiBkaXNwbGF5cyBmb3IgQXJhYmljIHRleHQgc2VsZWN0CisgKiBhcHByb3ByaWF0ZSwgY29udGV4dC1kZXBlbmRlbnQgZm9udCBnbHlwaHMgZm9yIGVhY2ggdGV4dCBlbGVtZW50LCB3aGljaCBtZWFucworICogdGhhdCB0aGV5IHRyYW5zZm9ybSB0ZXh0IGludG8gYSBnbHlwaCB2ZWN0b3IuPC9wPgorICoKKyAqIDxwPlRleHQgdHJhbnNmb3JtYXRpb25zIGFyZSBuZWNlc3Nhcnkgd2hlbiBtb2Rlcm4gZGlzcGxheSB0ZWNobm9sb2d5IGlzIG5vdAorICogYXZhaWxhYmxlIG9yIHdoZW4gdGV4dCBuZWVkcyB0byBiZSB0cmFuc2Zvcm1lZCB0byBvciBmcm9tIGxlZ2FjeSBmb3JtYXRzIHRoYXQKKyAqIHVzZSAic2hhcGVkIiBjaGFyYWN0ZXJzLiBTaW5jZSB0aGUgQXJhYmljIHNjcmlwdCBpcyBjdXJzaXZlLCBjb25uZWN0aW5nCisgKiBhZGphY2VudCBsZXR0ZXJzIHRvIGVhY2ggb3RoZXIsIGNvbXB1dGVycyBzZWxlY3QgaW1hZ2VzIGZvciBlYWNoIGxldHRlciBiYXNlZAorICogb24gdGhlIHN1cnJvdW5kaW5nIGxldHRlcnMuIFRoaXMgdXN1YWxseSByZXN1bHRzIGluIGZvdXIgaW1hZ2VzIHBlciBBcmFiaWMKKyAqIGxldHRlcjogaW5pdGlhbCwgbWlkZGxlLCBmaW5hbCwgYW5kIGlzb2xhdGVkIGZvcm1zLiBJbiBVbmljb2RlLCBvbiB0aGUgb3RoZXIKKyAqIGhhbmQsIGxldHRlcnMgYXJlIG5vcm1hbGx5IHN0b3JlZCBhYnN0cmFjdCwgYW5kIGEgZGlzcGxheSBzeXN0ZW0gaXMgZXhwZWN0ZWQKKyAqIHRvIHNlbGVjdCB0aGUgbmVjZXNzYXJ5IGdseXBocy4gKFRoaXMgbWFrZXMgc2VhcmNoaW5nIGFuZCBvdGhlciB0ZXh0CisgKiBwcm9jZXNzaW5nIGVhc2llciBiZWNhdXNlIHRoZSBzYW1lIGxldHRlciBoYXMgb25seSBvbmUgY29kZS4pIEl0IGlzIHBvc3NpYmxlCisgKiB0byBtaW1pYyB0aGlzIHdpdGggdGV4dCB0cmFuc2Zvcm1hdGlvbnMgYmVjYXVzZSB0aGVyZSBhcmUgY2hhcmFjdGVycyBpbgorICogVW5pY29kZSB0aGF0IGFyZSByZW5kZXJlZCBhcyBsZXR0ZXJzIHdpdGggYSBzcGVjaWZpYyBzaGFwZQorICogKG9yIGN1cnNpdmUgY29ubmVjdGl2aXR5KS4gVGhleSB3ZXJlIGluY2x1ZGVkIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGgKKyAqIGxlZ2FjeSBzeXN0ZW1zIGFuZCBjb2RlcGFnZXMsIGFuZCBmb3IgdW5zb3BoaXN0aWNhdGVkIGRpc3BsYXkgc3lzdGVtcy48L3A+CisgKgorICogPHA+QSBzZWNvbmQga2luZCBvZiB0ZXh0IHRyYW5zZm9ybWF0aW9ucyBpcyBzdXBwb3J0ZWQgZm9yIEFyYWJpYyBkaWdpdHM6CisgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBjb2RlcGFnZXMgdGhhdCBvbmx5IGluY2x1ZGUgRXVyb3BlYW4gZGlnaXRzLAorICogaXQgaXMgcG9zc2libGUgdG8gcmVwbGFjZSBvbmUgc2V0IG9mIGRpZ2l0cyBieSBhbm90aGVyLCBjaGFuZ2luZyB0aGUKKyAqIGNoYXJhY3RlciBjb2RlIHBvaW50cy4gVGhlc2Ugb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIGZvciBlaXRoZXIKKyAqIEFyYWJpYy1JbmRpYyBEaWdpdHMgKFUrMDY2MC4uLlUrMDY2OSkgb3IgRWFzdGVybiAoRXh0ZW5kZWQpIEFyYWJpYy1JbmRpYworICogZGlnaXRzIChVKzA2ZjAuLi5VKzA2ZjkpLjwvcD4KKyAqCisgKiA8cD5Tb21lIHJlcGxhY2VtZW50cyBtYXkgcmVzdWx0IGluIG1vcmUgb3IgZmV3ZXIgY2hhcmFjdGVycyAoY29kZSBwb2ludHMpLgorICogQnkgZGVmYXVsdCwgdGhpcyBtZWFucyB0aGF0IHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgbWF5IHJlY2VpdmUgdGV4dCB3aXRoIGEKKyAqIGxlbmd0aCBkaWZmZXJlbnQgZnJvbSB0aGUgc291cmNlIGxlbmd0aC4gU29tZSBsZWdhY3kgc3lzdGVtcyByZWx5IG9uIHRoZQorICogbGVuZ3RoIG9mIHRoZSB0ZXh0IHRvIGJlIGNvbnN0YW50LiBUaGV5IGV4cGVjdCBleHRyYSBzcGFjZXMgdG8gYmUgYWRkZWQKKyAqIG9yIGNvbnN1bWVkIGVpdGhlciBuZXh0IHRvIHRoZSBhZmZlY3RlZCBjaGFyYWN0ZXIgb3IgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIHRleHQuPC9wPgorICogQHN0YWJsZSBJQ1UgMi4wCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFyYWJpY1NoYXBpbmcgeworICAgIHByaXZhdGUgZmluYWwgaW50IG9wdGlvbnM7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzTG9naWNhbDsgLy8gY29udmVuaWVuY2UKKyAgICBwcml2YXRlIGJvb2xlYW4gc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZDsKKyAgICBwcml2YXRlIGNoYXIgdGFpbENoYXI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFyYWJpY1NoYXBpbmcgU0hBUEVSID0gbmV3IEFyYWJpY1NoYXBpbmcoCisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLlRFWFRfRElSRUNUSU9OX0xPR0lDQUwgfAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5MRVRURVJTX1NIQVBFIHwKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuRElHSVRTX05PT1ApOworCisgICAgLyoqCisgICAgICogQ29udmVydCBhIHJhbmdlIG9mIHRleHQgaW4gdGhlIHNvdXJjZSBhcnJheSwgcHV0dGluZyB0aGUgcmVzdWx0CisgICAgICogaW50byBhIHJhbmdlIG9mIHRleHQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5LCBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKyAgICAgKiBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlucHV0IHRleHQKKyAgICAgKiBAcGFyYW0gc291cmNlU3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBhcnJheSB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgcmVzdWx0LgorICAgICAqICAgSXQgbWF5IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9ubHkgaWYgIDxjb2RlPmRlc3RTaXplPC9jb2RlPiBpcyAwLgorICAgICAqIEBwYXJhbSBkZXN0U3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gZGVzdFNpemUgVGhlIHNpemUgKGNhcGFjaXR5KSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorICAgICAqICAgSWYgPGNvZGU+ZGVzdFNpemU8L2NvZGU+IGlzIDAsIHRoZW4gbm8gb3V0cHV0IGlzIHByb2R1Y2VkLAorICAgICAqICAgYnV0IHRoZSBuZWNlc3NhcnkgYnVmZmVyIHNpemUgaXMgcmV0dXJuZWQgKCJwcmVmbGlnaHRpbmciKS4gIFRoaXMKKyAgICAgKiAgIGRvZXMgbm90IHZhbGlkYXRlIHRoZSB0ZXh0IGFnYWluc3QgdGhlIG9wdGlvbnMsIGZvciBleGFtcGxlLAorICAgICAqICAgaWYgbGV0dGVycyBhcmUgYmVpbmcgdW5zaGFwZWQsIGFuZCBzcGFjZXMgYXJlIGJlaW5nIGNvbnN1bWVkCisgICAgICogICBmb2xsb3dpbmcgbGFtYWxlZiwgdGhpcyB3aWxsIG5vdCBkZXRlY3QgYSBsYW1hbGVmIHdpdGhvdXQgYQorICAgICAqICAgY29ycmVzcG9uZGluZyBzcGFjZS4gIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIHdoZW4gdGhlIGFjdHVhbAorICAgICAqICAgY29udmVyc2lvbiBpcyBhdHRlbXB0ZWQuCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGNoYXJzIHdyaXR0ZW4gdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAgICAgKiAgIElmIGFuIGVycm9yIG9jY3VycywgdGhlbiBubyBvdXRwdXQgd2FzIHdyaXR0ZW4sIG9yIGl0IG1heSBiZQorICAgICAqICAgaW5jb21wbGV0ZS4KKyAgICAgKiBAdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gaWYgdGhlIHRleHQgY2Fubm90IGJlIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIGludCBzaGFwZShjaGFyW10gc291cmNlLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICBjaGFyW10gZGVzdCwgaW50IGRlc3RTdGFydCwgaW50IGRlc3RTaXplKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic291cmNlIGNhbiBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChzb3VyY2VTdGFydCA8IDAgfHwgc291cmNlTGVuZ3RoIDwgMCB8fCBzb3VyY2VTdGFydCArIHNvdXJjZUxlbmd0aCA+IHNvdXJjZS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJhZCBzb3VyY2Ugc3RhcnQgKCIgKyBzb3VyY2VTdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIG9yIGxlbmd0aCAoIiArIHNvdXJjZUxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGZvciBidWZmZXIgb2YgbGVuZ3RoICIgKyBzb3VyY2UubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdCA9PSBudWxsICYmIGRlc3RTaXplICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwgZGVzdCByZXF1aXJlcyBkZXN0U2l6ZSA9PSAwIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXN0U2l6ZSAhPSAwKSAmJgorICAgICAgICAgICAgKGRlc3RTdGFydCA8IDAgfHwgZGVzdFNpemUgPCAwIHx8IGRlc3RTdGFydCArIGRlc3RTaXplID4gZGVzdC5sZW5ndGgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgZGVzdCBzdGFydCAoIiArIGRlc3RTdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIG9yIHNpemUgKCIgKyBkZXN0U2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGZvciBidWZmZXIgb2YgbGVuZ3RoICIgKyBkZXN0Lmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgLyogVmFsaWRhdGUgaW5wdXQgb3B0aW9ucyAqLworICAgICAgICBpZiAoICgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSA+IDApICYmCisgICAgICAgICAgICAgISgoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfQkVHSU4pICB8fAorICAgICAgICAgICAgICAgKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX0VORCApICAgfHwKKyAgICAgICAgICAgICAgICgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9SRVNJWkUgKXx8CisgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMKSkgKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldyb25nIFRhc2hrZWVsIGFyZ3VtZW50Iik7CisgICAgICAgIH0KKworICAgICAgIC8vL0NMT1ZFUjpPRkYKKyAgICAgICAvL0FjY29yZGluZyB0byBTdGV2ZW4gTG9vbWlzLCB0aGUgY29kZSBpcyB1bnJlYWNoYWJsZSB3aGVuIHlvdSBPUiBhbGwgdGhlIGNvbnN0YW50cyB3aXRoaW4gdGhlIGlmIHN0YXRlbWVudHMKKyAgICAgICBpZigoKG9wdGlvbnMmTEFNQUxFRl9NQVNLKSA+IDApJiYKKyAgICAgICAgICAgICAgISgoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX0JFR0lOKSAgfHwKKyAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX0VORCApICAgfHwKKyAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX1JFU0laRSApfHwKKyAgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9BVVRPKSAgfHwKKyAgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9ORUFSKSkpeworICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXcm9uZyBMYW0gQWxlZiBhcmd1bWVudCIpOworICAgICAgIH0KKyAgICAgICAvLy9DTE9WRVI6T04KKworICAgICAgIC8qIFZhbGlkYXRlIFRhc2hrZWVsIChUYXNoa2VlbCByZXBsYWNlbWVudCBvcHRpb25zIHNob3VsZCBiZSBlbmFibGVkIGluIHNoYXBpbmcgbW9kZSBvbmx5KSovCisgICAgICAgaWYoKChvcHRpb25zJlRBU0hLRUVMX01BU0spID4gMCkgJiYgKG9wdGlvbnMmTEVUVEVSU19NQVNLKSA9PSBMRVRURVJTX1VOU0hBUEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRhc2hrZWVsIHJlcGxhY2VtZW50IHNob3VsZCBub3QgYmUgZW5hYmxlZCBpbiBkZXNoYXBpbmcgbW9kZSAiKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIGludGVybmFsU2hhcGUoc291cmNlLCBzb3VyY2VTdGFydCwgc291cmNlTGVuZ3RoLCBkZXN0LCBkZXN0U3RhcnQsIGRlc3RTaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgcmFuZ2Ugb2YgdGV4dCBpbiBwbGFjZS4gIFRoaXMgbWF5IG9ubHkgYmUgdXNlZCBpZiB0aGUgTGVuZ3RoIG9wdGlvbgorICAgICAqIGRvZXMgbm90IGdyb3cgb3Igc2hyaW5rIHRoZSB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBpbnB1dCB0ZXh0CisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gaWYgdGhlIHRleHQgY2Fubm90IGJlIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hhcGUoY2hhcltdIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgPT0gTEFNQUxFRl9SRVNJWkUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJDYW5ub3Qgc2hhcGUgaW4gcGxhY2Ugd2l0aCBsZW5ndGggb3B0aW9uIHJlc2l6ZS4iKTsKKyAgICAgICAgfQorICAgICAgICBzaGFwZShzb3VyY2UsIHN0YXJ0LCBsZW5ndGgsIHNvdXJjZSwgc3RhcnQsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIHN0cmluZywgcmV0dXJuaW5nIHRoZSBuZXcgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBjb252ZXJ0CisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIHN0cmluZworICAgICAqIEB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc2hhcGUoU3RyaW5nIHRleHQpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhcltdIHNyYyA9IHRleHQudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgY2hhcltdIGRlc3QgPSBzcmM7CisgICAgICAgIGlmICgoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spID09IExBTUFMRUZfUkVTSVpFKSAmJgorICAgICAgICAgICAgKChvcHRpb25zICYgTEVUVEVSU19NQVNLKSA9PSBMRVRURVJTX1VOU0hBUEUpKSB7CisKKyAgICAgICAgICAgIGRlc3QgPSBuZXcgY2hhcltzcmMubGVuZ3RoICogMl07IC8vIG1heAorICAgICAgICB9CisgICAgICAgIGludCBsZW4gPSBzaGFwZShzcmMsIDAsIHNyYy5sZW5ndGgsIGRlc3QsIDAsIGRlc3QubGVuZ3RoKTsKKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkZXN0LCAwLCBsZW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBBcmFiaWNTaGFwaW5nIHVzaW5nIHRoZSBvcHRpb25zIGZsYWdzLgorICAgICAqIFRoZSBmbGFncyBhcmUgYXMgZm9sbG93czo8YnI+CisgICAgICogJ0xFTkdUSCcgZmxhZ3MgY29udHJvbCB3aGV0aGVyIHRoZSB0ZXh0IGNhbiBjaGFuZ2Ugc2l6ZSwgYW5kIGlmIG5vdCwKKyAgICAgKiBob3cgdG8gbWFpbnRhaW4gdGhlIHNpemUgb2YgdGhlIHRleHQgd2hlbiBMYW1BbGVmIGxpZ2F0dXJlcyBhcmUKKyAgICAgKiBmb3JtZWQgb3IgYnJva2VuLjxicj4KKyAgICAgKiAnVEVYVF9ESVJFQ1RJT04nIGZsYWdzIGNvbnRyb2wgd2hldGhlciB0aGUgdGV4dCBpcyByZWFkIGFuZCB3cml0dGVuCisgICAgICogaW4gdmlzdWFsIG9yZGVyIG9yIGluIGxvZ2ljYWwgb3JkZXIuPGJyPgorICAgICAqICdMRVRURVJTX1NIQVBFJyBmbGFncyBjb250cm9sIHdoZXRoZXIgY29udmVyc2lvbiBpcyB0byBvciBmcm9tCisgICAgICogcHJlc2VudGF0aW9uIGZvcm1zLjxicj4KKyAgICAgKiAnRElHSVRTJyBmbGFncyBjb250cm9sIHdoZXRoZXIgZGlnaXRzIGFyZSBzaGFwZWQsIGFuZCB3aGV0aGVyIGZyb20KKyAgICAgKiBFdXJvcGVhbiB0byBBcmFiaWMtSW5kaWMgb3IgdmljZS12ZXJzYS48YnI+CisgICAgICogJ0RJR0lUX1RZUEUnIGZsYWdzIGNvbnRyb2wgd2hldGhlciBzdGFuZGFyZCBvciBleHRlbmRlZCBBcmFiaWMtSW5kaWMKKyAgICAgKiBkaWdpdHMgYXJlIHVzZWQgd2hlbiBwZXJmb3JtaW5nIGRpZ2l0IGNvbnZlcnNpb24uCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIEFyYWJpY1NoYXBpbmcoaW50IG9wdGlvbnMpIHsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgaWYgKChvcHRpb25zICYgRElHSVRTX01BU0spID4gMHg4MCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIERJR0lUUyBvcHRpb25zIik7CisgICAgICAgIH0KKworICAgICAgICBpc0xvZ2ljYWwgPSAoIChvcHRpb25zICYgVEVYVF9ESVJFQ1RJT05fTUFTSykgPT0gVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCApOworICAgICAgICAvKiBWYWxpZGF0ZSBvcHRpb25zICovCisgICAgICAgIHNwYWNlc1JlbGF0aXZlVG9UZXh0QmVnaW5FbmQgPSAoIChvcHRpb25zICYgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfTUFTSykgPT0gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EICk7CisgICAgICAgIGlmICggKG9wdGlvbnMmU0hBUEVfVEFJTF9UWVBFX01BU0spID09IFNIQVBFX1RBSUxfTkVXX1VOSUNPREUpeworICAgICAgICAgICAgdGFpbENoYXIgPSBORVdfVEFJTF9DSEFSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFpbENoYXIgPSBPTERfVEFJTF9DSEFSOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2VlbiBUYWlsIG9wdGlvbnMgKi8KKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRoZSBTRUVOIGZhbWlseSBjaGFyYWN0ZXIgd2lsbCBleHBhbmQgaW50byB0d28gY2hhcmFjdGVycyB1c2luZyBzcGFjZSBuZWFyCisgICAgICogICAgICAgICAgICAgICB0aGUgU0VFTiBmYW1pbHkgY2hhcmFjdGVyKGkuZS4gdGhlIHNwYWNlIGFmdGVyIHRoZSBjaGFyYWN0ZXIpLgorICAgICAqICAgICAgICAgICAgICAgaWYgdGhlcmUgYXJlIG5vIHNwYWNlcyBmb3VuZCwgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBBbnkgU2VlbiBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgVGFpbCBjaGFyYWN0ZXIgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgYnkgb25lIGNlbGwgU2VlbiBhbmQgYSBzcGFjZSB3aWxsIHJlcGxhY2UgdGhlIFRhaWwuCisgICAgICogQWZmZWN0czogU2VlbiBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VFTl9UV09DRUxMX05FQVIgPSAweDIwMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgU2VlbiBtZW1vcnkgb3B0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUVOX01BU0sgPSAweDcwMDAwMDsKKworICAgIC8qIFllaEhhbXphIG9wdGlvbnMgKi8KKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRoZSBZRUhIQU1aQSBjaGFyYWN0ZXIgd2lsbCBleHBhbmQgaW50byB0d28gY2hhcmFjdGVycyB1c2luZyBzcGFjZSBuZWFyIGl0CisgICAgICogICAgICAgICAgICAgIChpLmUuIHRoZSBzcGFjZSBhZnRlciB0aGUgY2hhcmFjdGVyKQorICAgICAqICAgICAgICAgICAgICAgaWYgdGhlcmUgYXJlIG5vIHNwYWNlcyBmb3VuZCwgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBBbnkgWWVoIChmaW5hbCBvciBpc29sYXRlZCkgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IEhhbXphIGNoYXJhY3RlciB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICByZXBsYWNlZCBieSBvbmUgY2VsbCBZZWhIYW16YSBhbmQgc3BhY2Ugd2lsbCByZXBsYWNlIHRoZSBIYW16YS4KKyAgICAgKiBBZmZlY3RzOiBZZWhIYW16YSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVISEFNWkFfVFdPQ0VMTF9ORUFSICA9IDB4MTAwMDAwMDsKKworCisgICAgLyoqIEJpdCBtYXNrIGZvciBZZWhIYW16YSBtZW1vcnkgb3B0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRUhIQU1aQV9NQVNLID0gMHgzODAwMDAwOworCisgICAgLyogTmV3IFRhc2hrZWVsIG9wdGlvbnMgKi8KKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCBieSBzcGFjZXMuCisgICAgICogICAgICAgICAgICAgICBTcGFjZXMgd2lsbCBiZSBwbGFjZWQgYXQgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICogQWZmZWN0czogVGFzaGtlZWwgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX0JFR0lOID0gMHg0MDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHNwYWNlcy4KKyAgICAgKiAgICAgICAgICAgICAgIFNwYWNlcyB3aWxsIGJlIHBsYWNlZCBhdCBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKiBBZmZlY3RzOiBUYXNoa2VlbCBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfRU5EID0gMHg2MDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IGFsbG93IHRoZSByZXN1bHQgdG8gaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggdGhhbiB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlbW92ZWQsIGJ1ZmZlciBsZW5ndGggd2lsbCBzaHJpbmsuCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKgorICAgICAqIEFmZmVjdHM6IFRhc2hrZWVsIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9SRVNJWkUgPSAweDgwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgVGF0d2VlbCBpZiBpdCBpcyBjb25uZWN0ZWQgdG8gYWRqYWNlbnQKKyAgICAgKiAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgKGkuZS4gc2hhcGVkIG9uIFRhdHdlZWwpIG9yIHJlcGxhY2VkIGJ5IHNwYWNlIGlmIGl0IGlzIG5vdCBjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqIEFmZmVjdHM6IFllaEhhbXphIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwgPSAweEMwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBUYXNoa2VlbCByZXBsYWNlbWVudCB3aXRoIFNwYWNlIG9yIFRhdHdlZWwgbWVtb3J5IG9wdGlvbnMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfTUFTSyAgPSAweEUwMDAwOworCisgICAgLyogU3BhY2UgbG9jYXRpb24gQ29udHJvbCBvcHRpb25zICovCisgICAgLyoqCisgICAgICogVGhpcyBvcHRpb24gZWZmZWN0cyB0aGUgbWVhbmluZyBvZiBCRUdJTiBhbmQgRU5EIG9wdGlvbnMuIGlmIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkIHRoZSBkZWZhdWx0CisgICAgICogZm9yIEJFR0lOIGFuZCBFTkQgd2lsbCBiZSBhcyBmb2xsb3dpbmc6CisgICAgICogVGhlIERlZmF1bHQgKGZvciBib3RoIFZpc3VhbCBMVFIsIFZpc3VhbCBSVEwgYW5kIExvZ2ljYWwgVGV4dCkKKyAgICAgKiAgICAgICAgICAgMS4gQkVHSU4gYWx3YXlzIHJlZmVycyB0byB0aGUgc3RhcnQgYWRkcmVzcyBvZiBwaHlzaWNhbCBtZW1vcnkuCisgICAgICogICAgICAgICAgIDIuIEVORCBhbHdheXMgcmVmZXJzIHRvIHRoZSBlbmQgYWRkcmVzcyBvZiBwaHlzaWNhbCBtZW1vcnkuCisgICAgICoKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyB1c2VkIGl0IHdpbGwgc3dhcCB0aGUgbWVhbmluZyBvZiBCRUdJTiBhbmQgRU5EIG9ubHkgZm9yIFZpc3VhbCBMVFIgdGV4dC4KKyAgICAgKgorICAgICAqIFRoZSBhZmZlY3Qgb24gQkVHSU4gYW5kIEVORCBNZW1vcnkgT3B0aW9ucyB3aWxsIGJlIGFzIGZvbGxvd2luZzoKKyAgICAgKiAgICBBLiBCRUdJTiBGb3IgVmlzdWFsIExUUiB0ZXh0OiBUaGlzIHdpbGwgYmUgdGhlIGJlZ2lubmluZyAocmlnaHQgc2lkZSkgb2YgdGhlIHZpc3VhbCB0ZXh0CisgICAgICogICAgICAgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIGVuZCwgc2FtZSBhcyBFTkQgaW4gZGVmYXVsdCBiZWhhdmlvcikKKyAgICAgKiAgICBCLiBCRUdJTiBGb3IgTG9naWNhbCB0ZXh0OiBTYW1lIGFzIEJFR0lOIGluIGRlZmF1bHQgYmVoYXZpb3IuCisgICAgICogICAgQy4gRU5EIEZvciBWaXN1YWwgTFRSIHRleHQ6IFRoaXMgd2lsbCBiZSB0aGUgZW5kIChsZWZ0IHNpZGUpIG9mIHRoZSB2aXN1YWwgdGV4dC4gKGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiAgICAgIHRoZSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyBiZWdpbm5pbmcsIHNhbWUgYXMgQkVHSU4gaW4gZGVmYXVsdCBiZWhhdmlvcikKKyAgICAgKiAgICBELiBFTkQgRm9yIExvZ2ljYWwgdGV4dDogU2FtZSBhcyBFTkQgaW4gZGVmYXVsdCBiZWhhdmlvci4KKyAgICAgKiBBZmZlY3RzOiBBbGwgTGFtQWxlZiBCRUdJTiwgRU5EIGFuZCBBVVRPIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EID0gMHg0MDAwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBzd2FwcGluZyBCRUdJTiBhbmQgRU5EIGZvciBWaXN1YWwgTFRSIHRleHQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9NQVNLID0gMHg0MDAwMDAwOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgdXNlZCwgc2hhcGluZyB3aWxsIHVzZSB0aGUgbmV3IFVuaWNvZGUgY29kZSBwb2ludCBmb3IgVEFJTCAoaS5lLiAweEZFNzMpLgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQgKERlZmF1bHQpLCBvbGQgdW5vZmZpY2lhbCBVbmljb2RlIFRBSUwgY29kZSBwb2ludCBpcyB1c2VkIChpLmUuIDB4MjAwQikKKyAgICAgKiBEZS1zaGFwaW5nIHdpbGwgbm90IHVzZSB0aGlzIG9wdGlvbiBhcyBpdCB3aWxsIGFsd2F5cyBzZWFyY2ggZm9yIGJvdGggdGhlIG5ldyBVbmljb2RlIGNvZGUgcG9pbnQgZm9yIHRoZQorICAgICAqIFRBSUwgKGkuZS4gMHhGRTczKSBvciB0aGUgb2xkIHVub2ZmaWNpYWwgVW5pY29kZSBUQUlMIGNvZGUgcG9pbnQgKGkuZS4gMHgyMDBCKSBhbmQgZGUtc2hhcGUgdGhlCisgICAgICogU2Vlbi1GYW1pbHkgbGV0dGVyIGFjY29yZGluZ2x5LgorICAgICAqCisgICAgICogU2hhcGluZyBNb2RlOiBPbmx5IHNoYXBpbmcuCisgICAgICogRGUtc2hhcGluZyBNb2RlOiBOL0EuCisgICAgICogQWZmZWN0czogQWxsIFNlZW4gb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVBFX1RBSUxfTkVXX1VOSUNPREUgPSAweDgwMDAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIG5ldyBVbmljb2RlIFRhaWwgb3B0aW9uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBUEVfVEFJTF9UWVBFX01BU0sgPSAweDgwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiBhbGxvdyB0aGUgcmVzdWx0IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIHNvdXJjZS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfR1JPV19TSFJJTksgPSAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogYWxsb3cgdGhlIHJlc3VsdCB0byBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBzb3VyY2UuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0dST1dfU0hSSU5LCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9SRVNJWkUgICA9IDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBuZXh0IHRvIG1vZGlmaWVkIGNoYXJhY3RlcnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSID0gMTsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIG5leHQgdG8gbW9kaWZpZWQgY2hhcmFjdGVycy4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfRklYRURfU1BBQ0VTX05FQVIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX05FQVIgPSAxIDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9FTkQgPSAyOworCisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfRU5ECisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9FTkQgPSAyOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0JFR0lOTklORyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfQkVHSU5OSU5HCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9CRUdJTiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIE1vZGU6IEZvciBlYWNoIExBTUFMRUYgY2hhcmFjdGVyIGZvdW5kLCBleHBhbmQgTEFNQUxFRiB1c2luZyBzcGFjZSBhdCBlbmQuCisgICAgICogICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBzcGFjZSBhdCBlbmQsIHVzZSBzcGFjZXMgYXQgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuIElmIHRoZXJlCisgICAgICogICAgICAgICAgICAgICBpcyBubyBzcGFjZSBhdCBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciwgdXNlIHNwYWNlcyBhdCB0aGUgbmVhciAoaS5lLiB0aGUgc3BhY2UKKyAgICAgKiAgICAgICAgICAgICAgIGFmdGVyIHRoZSBMQU1BTEVGIGNoYXJhY3RlcikuCisgICAgICoKKyAgICAgKiBEZXNoYXBpbmcgTW9kZTogUGVyZm9ybSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgZmxhZyBlcXVhbHMgTEFNQUxFRl9FTkQuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9BVVRPICA9IDB4MTAwMDA7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgbWVtb3J5IG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX01BU0sgPSAweDEwMDAzOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBMYW1BbGVmIG1lbW9yeSBvcHRpb25zLiAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9NQVNLICA9IDB4MTAwMDM7CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3Rpb24gaW5kaWNhdG9yOiB0aGUgc291cmNlIGlzIGluIGxvZ2ljYWwgKGtleWJvYXJkKSBvcmRlci4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9MT0dJQ0FMID0gMDsKKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBpbmRpY2F0b3I6dGhlIHNvdXJjZSBpcyBpbiB2aXN1YWwgUlRMIG9yZGVyLAorICAgICAqIHRoZSByaWdodG1vc3QgZGlzcGxheWVkIGNoYXJhY3RlciBzdG9yZWQgZmlyc3QuCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fVklTVUFMX1JUTCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3Rpb24gaW5kaWNhdG9yOiB0aGUgc291cmNlIGlzIGluIHZpc3VhbCAoZGlzcGxheSkgb3JkZXIsIHRoYXQgaXMsCisgICAgICogdGhlIGxlZnRtb3N0IGRpc3BsYXllZCBjaGFyYWN0ZXIgaXMgc3RvcmVkIGZpcnN0LgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX1ZJU1VBTF9MVFIgPSA0OworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGRpcmVjdGlvbiBpbmRpY2F0b3JzLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX01BU0sgPSA0OworCisKKyAgICAvKioKKyAgICAgKiBMZXR0ZXIgc2hhcGluZyBvcHRpb246IGRvIG5vdCBwZXJmb3JtIGxldHRlciBzaGFwaW5nLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfTk9PUCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBMZXR0ZXIgc2hhcGluZyBvcHRpb246IHJlcGxhY2Ugbm9ybWF0aXZlIGxldHRlciBjaGFyYWN0ZXJzIGluIHRoZSBVKzA2MDAgKEFyYWJpYykgYmxvY2ssCisgICAgICogYnkgc2hhcGVkIG9uZXMgaW4gdGhlIFUrRkU3MCAoUHJlc2VudGF0aW9uIEZvcm1zIEIpIGJsb2NrLiBQZXJmb3JtcyBMYW0tQWxlZiBsaWdhdHVyZQorICAgICAqIHN1YnN0aXR1dGlvbi4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX1NIQVBFID0gODsKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogcmVwbGFjZSBzaGFwZWQgbGV0dGVyIGNoYXJhY3RlcnMgaW4gdGhlIFUrRkU3MCAoUHJlc2VudGF0aW9uIEZvcm1zIEIpIGJsb2NrCisgICAgICogYnkgbm9ybWF0aXZlIG9uZXMgaW4gdGhlIFUrMDYwMCAoQXJhYmljKSBibG9jay4gIENvbnZlcnRzIExhbS1BbGVmIGxpZ2F0dXJlcyB0byBwYWlycyBvZiBMYW0gYW5kCisgICAgICogQWxlZiBjaGFyYWN0ZXJzLCBjb25zdW1pbmcgc3BhY2VzIGlmIHJlcXVpcmVkLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfVU5TSEFQRSA9IDB4MTA7CisKKyAgICAvKioKKyAgICAgKiBMZXR0ZXIgc2hhcGluZyBvcHRpb246IHJlcGxhY2Ugbm9ybWF0aXZlIGxldHRlciBjaGFyYWN0ZXJzIGluIHRoZSBVKzA2MDAgKEFyYWJpYykgYmxvY2ssCisgICAgICogZXhjZXB0IGZvciB0aGUgVEFTSEtFRUwgY2hhcmFjdGVycyBhdCBVKzA2NEIuLi5VKzA2NTIsIGJ5IHNoYXBlZCBvbmVzIGluIHRoZSBVK0ZlNzAKKyAgICAgKiAoUHJlc2VudGF0aW9uIEZvcm1zIEIpIGJsb2NrLiAgVGhlIFRBU0hLRUVMIGNoYXJhY3RlcnMgd2lsbCBhbHdheXMgYmUgY29udmVydGVkIHRvCisgICAgICogdGhlIGlzb2xhdGVkIGZvcm1zIHJhdGhlciB0aGFuIHRvIHRoZWlyIGNvcnJlY3Qgc2hhcGUuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRCA9IDB4MTg7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgbGV0dGVyIHNoYXBpbmcgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX01BU0sgPSAweDE4OworCisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjogZG8gbm90IHBlcmZvcm0gZGlnaXQgc2hhcGluZy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfTk9PUCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjogUmVwbGFjZSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkgYnkgQXJhYmljLUluZGljIGRpZ2l0cy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfRU4yQU4gPSAweDIwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246IFJlcGxhY2UgQXJhYmljLUluZGljIGRpZ2l0cyBieSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0FOMkVOID0gMHg0MDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOgorICAgICAqIFJlcGxhY2UgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpIGJ5IEFyYWJpYy1JbmRpYyBkaWdpdHMKKyAgICAgKiBpZiB0aGUgbW9zdCByZWNlbnQgc3Ryb25nbHkgZGlyZWN0aW9uYWwgY2hhcmFjdGVyCisgICAgICogaXMgYW4gQXJhYmljIGxldHRlciAoaXRzIEJpZGkgZGlyZWN0aW9uIHZhbHVlIGlzIFJJR0hUX1RPX0xFRlRfQVJBQklDKS4KKyAgICAgKiBUaGUgaW5pdGlhbCBzdGF0ZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgaXMgYXNzdW1lZCB0byBiZSBub3QgYW4gQXJhYmljLAorICAgICAqIGxldHRlciwgc28gRXVyb3BlYW4gZGlnaXRzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB3aWxsIG5vdCBjaGFuZ2UuCisgICAgICogQ29tcGFyZSB0byBESUdJVFNfQUxFTjJBTl9JTklUX0FMLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19FTjJBTl9JTklUX0xSID0gMHg2MDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOgorICAgICAqIFJlcGxhY2UgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpIGJ5IEFyYWJpYy1JbmRpYyBkaWdpdHMKKyAgICAgKiBpZiB0aGUgbW9zdCByZWNlbnQgc3Ryb25nbHkgZGlyZWN0aW9uYWwgY2hhcmFjdGVyCisgICAgICogaXMgYW4gQXJhYmljIGxldHRlciAoaXRzIEJpZGkgZGlyZWN0aW9uIHZhbHVlIGlzIFJJR0hUX1RPX0xFRlRfQVJBQklDKS4KKyAgICAgKiBUaGUgaW5pdGlhbCBzdGF0ZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgaXMgYXNzdW1lZCB0byBiZSBhbiBBcmFiaWMsCisgICAgICogbGV0dGVyLCBzbyBFdXJvcGVhbiBkaWdpdHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHdpbGwgY2hhbmdlLgorICAgICAqIENvbXBhcmUgdG8gRElHSVRTX0FMRU4yQU5fSU5UX0xSLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19FTjJBTl9JTklUX0FMID0gMHg4MDsKKworICAgIC8qKiBOb3QgYSB2YWxpZCBvcHRpb24gdmFsdWUuICovCisgICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX1JFU0VSVkVEID0gMHhhMDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBkaWdpdCBzaGFwaW5nIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX01BU0sgPSAweGUwOworCisgICAgLyoqCisgICAgICogRGlnaXQgdHlwZSBvcHRpb246IFVzZSBBcmFiaWMtSW5kaWMgZGlnaXRzIChVKzA2NjAuLi5VKzA2NjkpLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUX1RZUEVfQU4gPSAwOworCisgICAgLyoqCisgICAgICogRGlnaXQgdHlwZSBvcHRpb246IFVzZSBFYXN0ZXJuIChFeHRlbmRlZCkgQXJhYmljLUluZGljIGRpZ2l0cyAoVSswNmYwLi4uVSswNmY5KS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVF9UWVBFX0FOX0VYVEVOREVEID0gMHgxMDA7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgZGlnaXQgdHlwZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUX1RZUEVfTUFTSyA9IDB4MDEwMDsgLy8gMHgzZjAwPworCisgICAgLyoqCisgICAgICogc29tZSBjb25zdGFudHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEhBTVpBRkVfQ0hBUiAgICAgICA9ICdcdWZlODAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgSEFNWkEwNl9DSEFSICAgICAgID0gJ1x1MDYyMSc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBZRUhfSEFNWkFfQ0hBUiAgICAgPSAnXHUwNjI2JzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFlFSF9IQU1aQUZFX0NIQVIgICA9ICdcdUZFODknOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTEFNQUxFRl9TUEFDRV9TVUIgID0gJ1x1ZmZmZic7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBUQVNIS0VFTF9TUEFDRV9TVUIgPSAnXHVmZmZlJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExBTV9DSEFSICAgICAgPSAnXHUwNjQ0JzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNQQUNFX0NIQVIgICAgPSAnXHUwMDIwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNQQUNFX0NIQVJfRk9SX0xBTUFMRUYgPSAnXHVmZWZmJzsgLy8gWFhYOiB0d2VhayBmb3IgVGV4dExpbmUgdXNlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTSEFEREFfQ0hBUiAgID0gJ1x1RkU3Qyc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBUQVRXRUVMX0NIQVIgID0gJ1x1MDY0MCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTSEFEREFfVEFUV0VFTF9DSEFSID0gJ1x1RkU3RCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBORVdfVEFJTF9DSEFSID0gJ1x1RkU3Myc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBPTERfVEFJTF9DSEFSID0gJ1x1MjAwQic7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIQVBFX01PREUgICAgICA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFU0hBUEVfTU9ERSAgICA9IDE7CisKKyAgICAvKioKKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHJocykgeworICAgICAgICByZXR1cm4gcmhzICE9IG51bGwgJiYKKyAgICAgICAgICAgIHJocy5nZXRDbGFzcygpID09IEFyYWJpY1NoYXBpbmcuY2xhc3MgJiYKKyAgICAgICAgICAgIG9wdGlvbnMgPT0gKChBcmFiaWNTaGFwaW5nKXJocykub3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICAgLy8vQ0xPVkVSOk9GRgorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworICAgICAgICBidWYuYXBwZW5kKCdbJyk7CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSB7CisgICAgICAgIGNhc2UgTEFNQUxFRl9SRVNJWkU6IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgcmVzaXplIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfTkVBUjogYnVmLmFwcGVuZCgiTGFtQWxlZiBzcGFjZXMgYXQgbmVhciIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX0JFR0lOOiBidWYuYXBwZW5kKCJMYW1BbGVmIHNwYWNlcyBhdCBiZWdpbiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX0VORDogYnVmLmFwcGVuZCgiTGFtQWxlZiBzcGFjZXMgYXQgZW5kIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfQVVUTzogYnVmLmFwcGVuZCgibGFtQWxlZiBhdXRvIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFRFWFRfRElSRUNUSU9OX01BU0spIHsKKyAgICAgICAgY2FzZSBURVhUX0RJUkVDVElPTl9MT0dJQ0FMOiBidWYuYXBwZW5kKCIsIGxvZ2ljYWwiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgVEVYVF9ESVJFQ1RJT05fVklTVUFMX0xUUjogYnVmLmFwcGVuZCgiLCB2aXN1YWwiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEVUVEVSU19NQVNLKSB7CisgICAgICAgIGNhc2UgTEVUVEVSU19OT09QOiBidWYuYXBwZW5kKCIsIG5vIGxldHRlciBzaGFwaW5nIik7IGJyZWFrOworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEU6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgbGV0dGVycyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEOiBidWYuYXBwZW5kKCIsIHNoYXBlIGxldHRlcnMgdGFzaGtlZWwgaXNvbGF0ZWQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEVUVEVSU19VTlNIQVBFOiBidWYuYXBwZW5kKCIsIHVuc2hhcGUgbGV0dGVycyIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBTRUVOX01BU0spIHsKKyAgICAgICAgY2FzZSBTRUVOX1RXT0NFTExfTkVBUjogYnVmLmFwcGVuZCgiLCBTZWVuIGF0IG5lYXIiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgWUVISEFNWkFfTUFTSykgeworICAgICAgICBjYXNlIFlFSEhBTVpBX1RXT0NFTExfTkVBUjogYnVmLmFwcGVuZCgiLCBZZWggSGFtemEgYXQgbmVhciIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKSB7CisgICAgICAgIGNhc2UgVEFTSEtFRUxfQkVHSU46IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgYXQgYmVnaW4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgVEFTSEtFRUxfRU5EOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIGF0IGVuZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUw6IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgcmVwbGFjZSB3aXRoIHRhdHdlZWwiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgVEFTSEtFRUxfUkVTSVpFOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIHJlc2l6ZSIpOyBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUU19NQVNLKSB7CisgICAgICAgIGNhc2UgRElHSVRTX05PT1A6IGJ1Zi5hcHBlbmQoIiwgbm8gZGlnaXQgc2hhcGluZyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfRU4yQU46IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEFOIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19BTjJFTjogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gRU4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfTFI6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEFOIGNvbnRleHR1YWxseTogZGVmYXVsdCBFTiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9BTDogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gQU4gY29udGV4dHVhbGx5OiBkZWZhdWx0IEFMIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUX1RZUEVfTUFTSykgeworICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU46IGJ1Zi5hcHBlbmQoIiwgc3RhbmRhcmQgQXJhYmljLUluZGljIGRpZ2l0cyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOX0VYVEVOREVEOiBidWYuYXBwZW5kKCIsIGV4dGVuZGVkIEFyYWJpYy1JbmRpYyBkaWdpdHMiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisgICAgLy8vQ0xPVkVSOk9OCisKKyAgICAvLworICAgIC8vIHBvcnRlZCBhcGkKKyAgICAvLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElSUkVMRVZBTlQgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQU1UWVBFID0gMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMRUZUWVBFID0gMzI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS1IgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LTCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfTUFTSyA9IDM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgaXJyZWxldmFudFBvc1tdID0geworICAgICAgICAweDAsIDB4MiwgMHg0LCAweDYsIDB4OCwgMHhBLCAweEMsIDB4RQorICAgIH07CisKKy8qCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBjb252ZXJ0TGFtQWxlZltdID0gIHsKKyAgICAgICAgJ1x1MDYyMicsIC8vIEZFRjUKKyAgICAgICAgJ1x1MDYyMicsIC8vIEZFRjYKKyAgICAgICAgJ1x1MDYyMycsIC8vIEZFRjcKKyAgICAgICAgJ1x1MDYyMycsIC8vIEZFRjgKKyAgICAgICAgJ1x1MDYyNScsIC8vIEZFRjkKKyAgICAgICAgJ1x1MDYyNScsIC8vIEZFRkEKKyAgICAgICAgJ1x1MDYyNycsIC8vIEZFRkIKKyAgICAgICAgJ1x1MDYyNycgIC8vIEZFRkMKKyAgICB9OworKi8KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCB0YWlsRmFtaWx5SXNvbGF0ZWRGaW5hbFtdID0geworICAgICAgICAvKiBGRUIxICovIDEsCisgICAgICAgIC8qIEZFQjIgKi8gMSwKKyAgICAgICAgLyogRkVCMyAqLyAwLAorICAgICAgICAvKiBGRUI0ICovIDAsCisgICAgICAgIC8qIEZFQjUgKi8gMSwKKyAgICAgICAgLyogRkVCNiAqLyAxLAorICAgICAgICAvKiBGRUI3ICovIDAsCisgICAgICAgIC8qIEZFQjggKi8gMCwKKyAgICAgICAgLyogRkVCOSAqLyAxLAorICAgICAgICAvKiBGRUJBICovIDEsCisgICAgICAgIC8qIEZFQkIgKi8gMCwKKyAgICAgICAgLyogRkVCQyAqLyAwLAorICAgICAgICAvKiBGRUJEICovIDEsCisgICAgICAgIC8qIEZFQkUgKi8gMQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdGFzaGtlZWxNZWRpYWxbXSA9IHsKKyAgICAgICAgLyogRkU3MCAqLyAwLAorICAgICAgICAvKiBGRTcxICovIDEsCisgICAgICAgIC8qIEZFNzIgKi8gMCwKKyAgICAgICAgLyogRkU3MyAqLyAwLAorICAgICAgICAvKiBGRTc0ICovIDAsCisgICAgICAgIC8qIEZFNzUgKi8gMCwKKyAgICAgICAgLyogRkU3NiAqLyAwLAorICAgICAgICAvKiBGRTc3ICovIDEsCisgICAgICAgIC8qIEZFNzggKi8gMCwKKyAgICAgICAgLyogRkU3OSAqLyAxLAorICAgICAgICAvKiBGRTdBICovIDAsCisgICAgICAgIC8qIEZFN0IgKi8gMSwKKyAgICAgICAgLyogRkU3QyAqLyAwLAorICAgICAgICAvKiBGRTdEICovIDEsCisgICAgICAgIC8qIEZFN0UgKi8gMCwKKyAgICAgICAgLyogRkU3RiAqLyAxCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgeWVoSGFtemFUb1llaFtdID0KKyAgICB7CisgICAgLyogaXNvbGF0ZWQqLyAweEZFRUYsCisgICAgLyogZmluYWwgICAqLyAweEZFRjAKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbXSA9IHsKKyAgICAgICAgJ1x1MDYyMicsIC8vIDA2NUMKKyAgICAgICAgJ1x1MDYyMycsIC8vIDA2NUQKKyAgICAgICAgJ1x1MDYyNScsIC8vIDA2NUUKKyAgICAgICAgJ1x1MDYyNycsIC8vIDA2NUYKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gYXJhTGluayA9IHsKKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MTEsICAvKjB4MDYyMiovCisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDEzLCAgLyoweDA2MjMqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgxNSwgIC8qMHgwNjI0Ki8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MTcsICAvKjB4MDYyNSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDE5LCAgLyoweDA2MjYqLworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxRCwgIC8qMHgwNjI3Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MUYsICAvKjB4MDYyOCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDIzLCAgLyoweDA2MjkqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgyNSwgIC8qMHgwNjJBKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MjksICAvKjB4MDYyQiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDJELCAgLyoweDA2MkMqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgzMSwgIC8qMHgwNjJEKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MzUsICAvKjB4MDYyRSovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDM5LCAgLyoweDA2MkYqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzQiwgIC8qMHgwNjMwKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4M0QsICAvKjB4MDYzMSovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDNGLCAgLyoweDA2MzIqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0MSwgIC8qMHgwNjMzKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NDUsICAvKjB4MDYzNCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDQ5LCAgLyoweDA2MzUqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0RCwgIC8qMHgwNjM2Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NTEsICAvKjB4MDYzNyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDU1LCAgLyoweDA2MzgqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1OSwgIC8qMHgwNjM5Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NUQsICAvKjB4MDYzQSovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2M0ItMHgwNjNGKi8KKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY0MCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDYxLCAgLyoweDA2NDEqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg2NSwgIC8qMHgwNjQyKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NjksICAvKjB4MDY0MyovCisgICAgICAgIDEgKyAyICAgICAgICsgMTYgKyAyNTYgKiAweDZELCAgLyoweDA2NDQqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg3MSwgIC8qMHgwNjQ1Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NzUsICAvKjB4MDY0NiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDc5LCAgLyoweDA2NDcqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg3RCwgIC8qMHgwNjQ4Ki8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4N0YsICAvKjB4MDY0OSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDgxLCAgLyoweDA2NEEqLworICAgICAgICA0LCA0LCA0LCA0LCAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjRCLTB4MDY0RSovCisgICAgICAgIDQsIDQsIDQsIDQsICAgICAgICAgICAgICAgICAgICAgLyoweDA2NEYtMHgwNjUyKi8KKyAgICAgICAgNCwgNCwgNCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDY1My0weDA2NTcqLworICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjU4LTB4MDY1QiovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDg1LCAgLyoweDA2NUMqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4NywgIC8qMHgwNjVEKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4ODksICAvKjB4MDY1RSovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDhCLCAgLyoweDA2NUYqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjYwLTB4MDY2NCovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2NjUtMHgwNjY5Ki8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKjB4MDY2QS0weDA2NkYqLworICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjcwKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3MSovCisgICAgICAgIDEgICAgICAgICAgICsgMzIsICAgICAgICAgICAgICAgLyoweDA2NzIqLworICAgICAgICAxICAgICAgICAgICArIDMyLCAgICAgICAgICAgICAgIC8qMHgwNjczKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3NCovCisgICAgICAgIDEgICAgICAgICAgICsgMzIsICAgICAgICAgICAgICAgLyoweDA2NzUqLworICAgICAgICAxLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjc2LTB4MDY3NyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2NzgtMHgwNjdEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDY3RS0weDA2ODMqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNjg0LTB4MDY4NyovCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAgLyoweDA2ODgtMHgwNjkxKi8KKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgICAgICAgICAvKjB4MDY5Mi0weDA2OTkqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNjlBLTB4MDZBMyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2OUEtMHgwNkEzKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDZBNC0weDA2QUQqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNkE0LTB4MDZBRCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2QUUtMHgwNkI3Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDZBRS0weDA2QjcqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNkI4LTB4MDZCRiovCisgICAgICAgIDErMiwgMSsyLCAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2QjgtMHgwNkJGKi8KKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDMCovCisgICAgICAgIDErMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2QzEqLworICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgIC8qMHgwNkMyLTB4MDZDQiovCisgICAgICAgIDErMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2Q0MqLworICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkNEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDZDRS0weDA2RDEqLworICAgICAgICAxLCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkQyLTB4MDZEMyovCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHByZXNMaW5rID0geworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAvKjB4RkU3MCovCisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qMHhGRTcxKi8KKyAgICAgICAgMSArIDIsIDAsIDErIDIsIDAsIDErIDIsICAgICAgLyoweEZFNzItMHhGRTc2Ki8KKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyoweEZFNzcqLworICAgICAgICAxKyAyLCAxICsgMiwgMSsyLCAxICsgMiwgICAgICAvKjB4RkU3OC0weEZFODEqLworICAgICAgICAxKyAyLCAxICsgMiwgMSsyLCAxICsgMiwgICAgICAvKjB4RkU4Mi0weEZFODUqLworICAgICAgICAwLCAwICsgMzIsIDEgKyAzMiwgMCArIDMyLCAgICAvKjB4RkU4Ni0weEZFODkqLworICAgICAgICAxICsgMzIsIDAsIDEsICAwICsgMzIsICAgICAgICAvKjB4RkU4QS0weEZFOEQqLworICAgICAgICAxICsgMzIsIDAsIDIsICAxICsgMiwgICAgICAgICAvKjB4RkU4RS0weEZFOTEqLworICAgICAgICAxLCAwICsgMzIsIDEgKyAzMiwgMCwgICAgICAgICAvKjB4RkU5Mi0weEZFOTUqLworICAgICAgICAyLCAxICsgMiwgMSwgMCwgICAgICAgICAgICAgICAvKjB4RkU5Ni0weEZFOTkqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkU5QS0weEZFOUQqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkU5RS0weEZFQTEqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkVBMi0weEZFQTUqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkVBNi0weEZFQTkqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkVBQS0weEZFQUQqLworICAgICAgICAxLCAwLCAxLCAwLCAgICAgICAgICAgICAgICAgICAvKjB4RkVBRS0weEZFQjEqLworICAgICAgICAxLCAwLCAxLCAwLCAgICAgICAgICAgICAgICAgICAvKjB4RkVCMi0weEZFQjUqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVCNi0weEZFQjkqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVCQS0weEZFQkQqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVCRS0weEZFQzEqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVDMi0weEZFQzUqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVDNi0weEZFQzkqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVDQS0weEZFQ0QqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVDRS0weEZFRDEqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVEMi0weEZFRDUqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVENi0weEZFRDkqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVEQS0weEZFREQqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVERS0weEZFRTEqLworICAgICAgICAxLCAwICsgMTYsIDIgKyAxNiwgMSArIDIgKzE2LCAvKjB4RkVFMi0weEZFRTUqLworICAgICAgICAxICsgMTYsIDAsIDIsIDErMiwgICAgICAgICAgICAvKjB4RkVFNi0weEZFRTkqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVFQS0weEZFRUQqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVFRS0weEZFRjEqLworICAgICAgICAxLCAwLCAxLCAwLCAgICAgICAgICAgICAgICAgICAvKjB4RkVGMi0weEZFRjUqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVGNi0weEZFRjkqLworICAgICAgICAxLCAwLCAxLCAwLCAgICAgICAgICAgICAgICAgICAvKjB4RkVGQS0weEZFRkQqLworICAgICAgICAxLCAwLCAxLCAwLAorICAgICAgICAxCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGludFtdIGNvbnZlcnRGRXRvMDYgPSB7CisgICAgICAgIC8qKioqKioqKioqKjAqKioqKioxKioqKioqMioqKioqKjMqKioqKio0KioqKioqNSoqKioqKjYqKioqKio3KioqKioqOCoqKioqKjkqKioqKipBKioqKioqQioqKioqKkMqKioqKipEKioqKioqRSoqKioqKkYqKiovCisgICAgICAgIC8qRkU3Ki8gICAweDY0QiwgMHg2NEIsIDB4NjRDLCAweDY0QywgMHg2NEQsIDB4NjRELCAweDY0RSwgMHg2NEUsIDB4NjRGLCAweDY0RiwgMHg2NTAsIDB4NjUwLCAweDY1MSwgMHg2NTEsIDB4NjUyLCAweDY1MiwKKyAgICAgICAgLypGRTgqLyAgIDB4NjIxLCAweDYyMiwgMHg2MjIsIDB4NjIzLCAweDYyMywgMHg2MjQsIDB4NjI0LCAweDYyNSwgMHg2MjUsIDB4NjI2LCAweDYyNiwgMHg2MjYsIDB4NjI2LCAweDYyNywgMHg2MjcsIDB4NjI4LAorICAgICAgICAvKkZFOSovICAgMHg2MjgsIDB4NjI4LCAweDYyOCwgMHg2MjksIDB4NjI5LCAweDYyQSwgMHg2MkEsIDB4NjJBLCAweDYyQSwgMHg2MkIsIDB4NjJCLCAweDYyQiwgMHg2MkIsIDB4NjJDLCAweDYyQywgMHg2MkMsCisgICAgICAgIC8qRkVBKi8gICAweDYyQywgMHg2MkQsIDB4NjJELCAweDYyRCwgMHg2MkQsIDB4NjJFLCAweDYyRSwgMHg2MkUsIDB4NjJFLCAweDYyRiwgMHg2MkYsIDB4NjMwLCAweDYzMCwgMHg2MzEsIDB4NjMxLCAweDYzMiwKKyAgICAgICAgLypGRUIqLyAgIDB4NjMyLCAweDYzMywgMHg2MzMsIDB4NjMzLCAweDYzMywgMHg2MzQsIDB4NjM0LCAweDYzNCwgMHg2MzQsIDB4NjM1LCAweDYzNSwgMHg2MzUsIDB4NjM1LCAweDYzNiwgMHg2MzYsIDB4NjM2LAorICAgICAgICAvKkZFQyovICAgMHg2MzYsIDB4NjM3LCAweDYzNywgMHg2MzcsIDB4NjM3LCAweDYzOCwgMHg2MzgsIDB4NjM4LCAweDYzOCwgMHg2MzksIDB4NjM5LCAweDYzOSwgMHg2MzksIDB4NjNBLCAweDYzQSwgMHg2M0EsCisgICAgICAgIC8qRkVEKi8gICAweDYzQSwgMHg2NDEsIDB4NjQxLCAweDY0MSwgMHg2NDEsIDB4NjQyLCAweDY0MiwgMHg2NDIsIDB4NjQyLCAweDY0MywgMHg2NDMsIDB4NjQzLCAweDY0MywgMHg2NDQsIDB4NjQ0LCAweDY0NCwKKyAgICAgICAgLypGRUUqLyAgIDB4NjQ0LCAweDY0NSwgMHg2NDUsIDB4NjQ1LCAweDY0NSwgMHg2NDYsIDB4NjQ2LCAweDY0NiwgMHg2NDYsIDB4NjQ3LCAweDY0NywgMHg2NDcsIDB4NjQ3LCAweDY0OCwgMHg2NDgsIDB4NjQ5LAorICAgICAgICAvKkZFRiovICAgMHg2NDksIDB4NjRBLCAweDY0QSwgMHg2NEEsIDB4NjRBLCAweDY1QywgMHg2NUMsIDB4NjVELCAweDY1RCwgMHg2NUUsIDB4NjVFLCAweDY1RiwgMHg2NUYKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNoYXBlVGFibGVbXVtdW10gPSB7CisgICAgICAgIHsgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDEsMCwzfSwgezAsMSwwLDF9IH0sCisgICAgICAgIHsgezAsMCwyLDJ9LCB7MCwwLDEsMn0sIHswLDEsMSwyfSwgezAsMSwxLDN9IH0sCisgICAgICAgIHsgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDEsMCwzfSwgezAsMSwwLDN9IH0sCisgICAgICAgIHsgezAsMCwxLDJ9LCB7MCwwLDEsMn0sIHswLDEsMSwyfSwgezAsMSwxLDN9IH0KKyAgICB9OworCisgICAgLyoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHNoYXBlcyBFdXJvcGVhbiBkaWdpdHMgdG8gQXJhYmljLUluZGljIGRpZ2l0cworICAgICAqIGluLXBsYWNlLCB3cml0aW5nIG92ZXIgdGhlIGlucHV0IGNoYXJhY3RlcnMuICBEYXRhIGlzIGluIHZpc3VhbAorICAgICAqIG9yZGVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzaGFwZVRvQXJhYmljRGlnaXRzV2l0aENvbnRleHQoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWdpdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGxhc3RTdHJvbmdXYXNBTCkgeworICAgICAgICBkaWdpdEJhc2UgLT0gJzAnOyAvLyBtb3ZlIGNvbW1vbiBhZGp1c3RtZW50IG91dCBvZiBsb29wCisKKyAgICAgICAgZm9yKGludCBpID0gc3RhcnQgKyBsZW5ndGg7IC0taSA+PSBzdGFydDspIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworICAgICAgICAgICAgc3dpdGNoIChDaGFyYWN0ZXIuZ2V0RGlyZWN0aW9uYWxpdHkoY2gpKSB7CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUOgorICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDoKKyAgICAgICAgICAgICAgICBsYXN0U3Ryb25nV2FzQUwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDOgorICAgICAgICAgICAgICAgIGxhc3RTdHJvbmdXYXNBTCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI6CisgICAgICAgICAgICAgICAgaWYgKGxhc3RTdHJvbmdXYXNBTCAmJiBjaCA8PSAnXHUwMDM5JykgeworICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpKGNoICsgZGlnaXRCYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaW52ZXJ0QnVmZmVyCisgICAgICogRnVuY3Rpb246IFRoaXMgZnVuY3Rpb24gaW52ZXJ0cyB0aGUgYnVmZmVyLCBpdCdzIHVzZWQKKyAgICAgKiAgICAgICAgICAgaW4gY2FzZSB0aGUgdXNlciBzcGVjaWZpZXMgdGhlIGJ1ZmZlciB0byBiZQorICAgICAqICAgICAgICAgICBURVhUX0RJUkVDVElPTl9MT0dJQ0FMCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZlcnRCdWZmZXIoY2hhcltdIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgeworCisgICAgICAgIGZvcihpbnQgaSA9IHN0YXJ0LCBqID0gc3RhcnQgKyBsZW5ndGggLSAxOyBpIDwgajsgaSsrLCAtLWopIHsKKyAgICAgICAgICAgIGNoYXIgdGVtcCA9IGJ1ZmZlcltpXTsKKyAgICAgICAgICAgIGJ1ZmZlcltpXSA9IGJ1ZmZlcltqXTsKKyAgICAgICAgICAgIGJ1ZmZlcltqXSA9IHRlbXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjaGFuZ2VMYW1BbGVmCisgICAgICogRnVuY3Rpb246IENvbnZlcnRzIHRoZSBBbGVmIGNoYXJhY3RlcnMgaW50byBhbiBlcXVpdmFsZW50CisgICAgICogICAgICAgICAgIExhbUFsZWYgbG9jYXRpb24gaW4gdGhlIDB4MDZ4eCBSYW5nZSwgdGhpcyBpcyBhbgorICAgICAqICAgICAgICAgICBpbnRlcm1lZGlhdGUgc3RhZ2UgaW4gdGhlIG9wZXJhdGlvbiBvZiB0aGUgcHJvZ3JhbQorICAgICAqICAgICAgICAgICBsYXRlciBpdCdsbCBiZSBjb252ZXJ0ZWQgaW50byB0aGUgMHhGRXh4IExhbUFsZWZzCisgICAgICogICAgICAgICAgIGluIHRoZSBzaGFwaW5nIGZ1bmN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNoYXIgY2hhbmdlTGFtQWxlZihjaGFyIGNoKSB7CisgICAgICAgIHN3aXRjaChjaCkgeworICAgICAgICBjYXNlICdcdTA2MjInOiByZXR1cm4gJ1x1MDY1Qyc7CisgICAgICAgIGNhc2UgJ1x1MDYyMyc6IHJldHVybiAnXHUwNjVEJzsKKyAgICAgICAgY2FzZSAnXHUwNjI1JzogcmV0dXJuICdcdTA2NUUnOworICAgICAgICBjYXNlICdcdTA2MjcnOiByZXR1cm4gJ1x1MDY1Ric7CisgICAgICAgIGRlZmF1bHQ6ICByZXR1cm4gJ1x1MDAwMCc7IC8vIG5vdCBhIGxhbWFsZWYKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IHNwZWNpYWxDaGFyCisgICAgICogRnVuY3Rpb246IFNwZWNpYWwgQXJhYmljIGNoYXJhY3RlcnMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGluIHRoZSBzaGFwZVVuaWNvZGUKKyAgICAgKiAgICAgICAgICAgZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIG9yIDIgZm9yIHRoZXNlIHNwZWNpYWwgY2hhcmFjdGVycworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzcGVjaWFsQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIGlmICgoY2ggPiAnXHUwNjIxJyAmJiBjaCA8ICdcdTA2MjYnKSB8fAorICAgICAgICAgICAgKGNoID09ICdcdTA2MjcnKSB8fAorICAgICAgICAgICAgKGNoID4gJ1x1MDYyRScgJiYgY2ggPCAnXHUwNjMzJykgfHwKKyAgICAgICAgICAgIChjaCA+ICdcdTA2NDcnICYmIGNoIDwgJ1x1MDY0QScpIHx8CisgICAgICAgICAgICAoY2ggPT0gJ1x1MDYyOScpKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnXHUwNjRCJyAmJiBjaDw9ICdcdTA2NTInKSB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAweDA2NTMgJiYgY2ggPD0gMHgwNjU1IHx8CisgICAgICAgICAgICAgICAgICAgY2ggPT0gMHgwNjcwIHx8CisgICAgICAgICAgICAgICAgICAgY2ggPj0gMHhGRTcwICYmIGNoIDw9IDB4RkU3RikgeworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGdldExpbmsKKyAgICAgKiBGdW5jdGlvbjogUmVzb2x2ZXMgdGhlIGxpbmsgYmV0d2VlbiB0aGUgY2hhcmFjdGVycyBhcworICAgICAqICAgICAgICAgICBBcmFiaWMgY2hhcmFjdGVycyBoYXZlIGZvdXIgZm9ybXMgOgorICAgICAqICAgICAgICAgICBJc29sYXRlZCwgSW5pdGlhbCwgTWlkZGxlIGFuZCBGaW5hbCBGb3JtCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExpbmsoY2hhciBjaCkgeworICAgICAgICBpZiAoY2ggPj0gJ1x1MDYyMicgJiYgY2ggPD0gJ1x1MDZEMycpIHsKKyAgICAgICAgICAgIHJldHVybiBhcmFMaW5rW2NoIC0gJ1x1MDYyMiddOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcdTIwMEQnKSB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnXHUyMDZEJyAmJiBjaCA8PSAnXHUyMDZGJykgeworICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ1x1RkU3MCcgJiYgY2ggPD0gJ1x1RkVGQycpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmVzTGlua1tjaCAtICdcdUZFNzAnXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY291bnRTcGFjZXMKKyAgICAgKiBGdW5jdGlvbjogQ291bnRzIHRoZSBudW1iZXIgb2Ygc3BhY2VzCisgICAgICogICAgICAgICAgIGF0IGVhY2ggZW5kIG9mIHRoZSBsb2dpY2FsIGJ1ZmZlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudFNwYWNlc0xlZnQoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gc3RhcnQgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKGRlc3RbaV0gIT0gU1BBQ0VfQ0hBUikgeworICAgICAgICAgICAgICAgIHJldHVybiBpIC0gc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudFNwYWNlc1JpZ2h0KGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyBjb3VudDsgLS1pID49IHN0YXJ0OykgeworICAgICAgICAgICAgaWYgKGRlc3RbaV0gIT0gU1BBQ0VfQ0hBUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCArIGNvdW50IC0gMSAtIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGlzVGFzaGtlZWxDaGFyCisgICAgICogRnVuY3Rpb246IFJldHVybnMgdHJ1ZSBmb3IgVGFzaGtlZWwgY2hhcmFjdGVycyBlbHNlIHJldHVybiBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYXNoa2VlbENoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gKCBjaCA+PSdcdTA2NEInICYmIGNoIDw9ICdcdTA2NTInICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaXNTZWVuVGFpbEZhbWlseUNoYXIKKyAgICAgKkZ1bmN0aW9uIDogcmV0dXJucyAxIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzZWVuIGZhbWlseSBpc29sYXRlZCBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgaW4gdGhlIEZFIHJhbmdlIG90aGVyd2lzZSByZXR1cm5zIDAKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGludCBpc1NlZW5UYWlsRmFtaWx5Q2hhcihjaGFyIGNoKSB7CisgICAgICAgIGlmIChjaCA+PSAweGZlYjEgJiYgY2ggPCAweGZlYmYpeworICAgICAgICAgICAgIHJldHVybiB0YWlsRmFtaWx5SXNvbGF0ZWRGaW5hbCBbY2ggLSAweEZFQjFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgIC8qIE5hbWUgICAgIDogaXNTZWVuRmFtaWx5Q2hhcgorICAgICAgKiBGdW5jdGlvbiA6IHJldHVybnMgMSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgc2VlbiBmYW1pbHkgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlCisgICAgICAqICAgICAgICAgICAgMDYgcmFuZ2Ugb3RoZXJ3aXNlIHJldHVybnMgMAorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzU2VlbkZhbWlseUNoYXIoY2hhciAgY2gpeworICAgICAgICBpZiAoY2ggPj0gMHg2MzMgJiYgY2ggPD0gMHg2MzYpeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaXNUYWlsQ2hhcgorICAgICAqRnVuY3Rpb24gOiByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBtYXRjaGVzIG9uZSBvZiB0aGUgdGFpbCBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICgweGZlNzMgb3IgMHgyMDBiKSBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhaWxDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYoY2ggPT0gT0xEX1RBSUxfQ0hBUiB8fCBjaCA9PSBORVdfVEFJTF9DSEFSKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaXNBbGVmTWFrc291cmFDaGFyCisgICAgICpGdW5jdGlvbiA6IHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgQWxlZiBNYWtzb3VyYSBGaW5hbCBvciBpc29sYXRlZAorICAgICAqICAgICAgICAgICBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBbGVmTWFrc291cmFDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuICggKGNoID09IDB4RkVFRikgfHwgKCBjaCA9PSAweEZFRjApIHx8IChjaCA9PSAweDA2NDkpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgIDogaXNZZWhIYW16YUNoYXIKKyAgICAgKiBGdW5jdGlvbiA6IHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgeWVoSGFtemEgaXNvbGF0ZWQgb3IgeWVoaGFtemEKKyAgICAgKiAgICAgICAgICAgIGZpbmFsIGlzIGZvdW5kIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1llaEhhbXphQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIGlmKChjaD09MHhGRTg5KXx8KGNoPT0weEZFOEEpKXsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzVGFzaGtlZWxDaGFyRkUKKyAgICAgKkZ1bmN0aW9uIDogUmV0dXJucyB0cnVlIGZvciBUYXNoa2VlbCBjaGFyYWN0ZXJzIGluIEZFIHJhbmdlIGVsc2UgcmV0dXJuIGZhbHNlCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFzaGtlZWxDaGFyRkUoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gKCBjaCE9MHhGRTc1ICYmKGNoPj0weEZFNzAgJiYgY2g8PSAweEZFN0YpICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lOiBpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBDaGVja3MgaWYgdGhlIFRhc2hrZWVsIENoYXJhY3RlciBpcyBvbiBUYXR3ZWVsIG9yIG5vdCxpZiB0aGUKKyAgICAgKiAgICAgICAgICAgVGFzaGtlZWwgb24gdGF0d2VlbCAoRkUgcmFuZ2UpLCBpdCByZXR1cm5zIDEgZWxzZSBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgVGFzaGtlZWwgd2l0aCBzaGFkZGEgb24gdGF0d2VlbCAoRkMgcmFuZ2UpcmV0dXJuIDIgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgIHJldHVybnMgMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcihjaGFyIGNoKXsKKyAgICAgICAgaWYgKGNoID49IDB4ZmU3MCAmJiBjaCA8PSAweGZlN2YgJiYgY2ggIT0gTkVXX1RBSUxfQ0hBUiAmJiBjaCAhPSAweEZFNzUgJiYgY2ggIT0gU0hBRERBX1RBVFdFRUxfQ0hBUikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRhc2hrZWVsTWVkaWFsIFtjaCAtIDB4RkU3MF07CisgICAgICAgIH0gZWxzZSBpZiggKGNoID49IDB4ZmNmMiAmJiBjaCA8PSAweGZjZjQpIHx8IChjaCA9PSBTSEFEREFfVEFUV0VFTF9DSEFSKSkgeworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZTogaXNJc29sYXRlZFRhc2hrZWVsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBDaGVja3MgaWYgdGhlIFRhc2hrZWVsIENoYXJhY3RlciBpcyBpbiB0aGUgaXNvbGF0ZWQgZm9ybQorICAgICAqICAgICAgICAgICAoaS5lLiBVbmljb2RlIEZFIHJhbmdlKSByZXR1cm5zIDEgZWxzZSBpZiB0aGUgVGFzaGtlZWwKKyAgICAgKiAgICAgICAgICAgd2l0aCBzaGFkZGEgaXMgaW4gdGhlIGlzb2xhdGVkIGZvcm0gKGkuZS4gVW5pY29kZSBGQyByYW5nZSkKKyAgICAgKiAgICAgICAgICAgcmV0dXJucyAxIG90aGVyd2lzZSByZXR1cm5zIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNJc29sYXRlZFRhc2hrZWVsQ2hhcihjaGFyIGNoKXsKKyAgICAgICAgaWYgKGNoID49IDB4ZmU3MCAmJiBjaCA8PSAweGZlN2YgJiYgY2ggIT0gTkVXX1RBSUxfQ0hBUiAmJiBjaCAhPSAweEZFNzUpeworICAgICAgICAgICAgcmV0dXJuICgxIC0gdGFzaGtlZWxNZWRpYWwgW2NoIC0gMHhGRTcwXSk7CisgICAgICAgIH0gZWxzZSBpZihjaCA+PSAweGZjNWUgJiYgY2ggPD0gMHhmYzYzKXsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGlzQWxlZkNoYXIKKyAgICAgKiBGdW5jdGlvbjogUmV0dXJucyAxIGZvciBBbGVmIGNoYXJhY3RlcnMgZWxzZSByZXR1cm4gMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBbGVmQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiBjaCA9PSAnXHUwNjIyJyB8fCBjaCA9PSAnXHUwNjIzJyB8fCBjaCA9PSAnXHUwNjI1JyB8fCBjaCA9PSAnXHUwNjI3JzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpc0xhbUFsZWZDaGFyCisgICAgICogRnVuY3Rpb246IFJldHVybnMgdHJ1ZSBmb3IgTGFtQWxlZiBjaGFyYWN0ZXJzIGVsc2UgcmV0dXJuIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xhbUFsZWZDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuIGNoID49ICdcdUZFRjUnICYmIGNoIDw9ICdcdUZFRkMnOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gY2ggPj0gJ1x1MDY1QycgJiYgY2ggPD0gJ1x1MDY1Ric7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY2FsY3VsYXRlU2l6ZQorICAgICAqIEZ1bmN0aW9uOiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGRlc3RTaXplIHRvIGJlIHVzZWQgaW4gcHJlZmxpZ2h0aW5nCisgICAgICogICAgICAgICAgIHdoZW4gdGhlIGRlc3RTaXplIGlzIGVxdWFsIHRvIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjYWxjdWxhdGVTaXplKGNoYXJbXSBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlTGVuZ3RoKSB7CisKKyAgICAgICAgaW50IGRlc3RTaXplID0gc291cmNlTGVuZ3RoOworCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgeworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEU6CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRDoKKyAgICAgICAgICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc291cmNlU3RhcnQsIGUgPSBzb3VyY2VTdGFydCArIHNvdXJjZUxlbmd0aCAtIDE7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzb3VyY2VbaV0gPT0gTEFNX0NIQVIgJiYgaXNBbGVmQ2hhcihzb3VyY2VbaSsxXSkpIHx8IGlzVGFzaGtlZWxDaGFyRkUoc291cmNlW2ldKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAtLWRlc3RTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gdmlzdWFsCisgICAgICAgICAgICAgICAgZm9yKGludCBpID0gc291cmNlU3RhcnQgKyAxLCBlID0gc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzb3VyY2VbaV0gPT0gTEFNX0NIQVIgJiYgaXNBbGVmQ2hhcihzb3VyY2VbaS0xXSkpIHx8IGlzVGFzaGtlZWxDaGFyRkUoc291cmNlW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1kZXN0U2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEVUVEVSU19VTlNIQVBFOgorICAgICAgICAgICAgZm9yKGludCBpID0gc291cmNlU3RhcnQsIGUgPSBzb3VyY2VTdGFydCArIHNvdXJjZUxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChpc0xhbUFsZWZDaGFyKHNvdXJjZVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFNpemUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVzdFNpemU7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjb3VudFNwYWNlU3ViCisgICAgICogRnVuY3Rpb246IENvdW50cyBudW1iZXIgb2YgdGltZXMgdGhlIHN1YkNoYXIgYXBwZWFycyBpbiB0aGUgYXJyYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjb3VudFNwYWNlU3ViKGNoYXIgW10gZGVzdCxpbnQgbGVuZ3RoLCBjaGFyIHN1YkNoYXIpeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CisgICAgICAgICAgaWYgKGRlc3RbaV0gPT0gc3ViQ2hhcikgeworICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBzaGlmdEFycmF5CisgICAgICogRnVuY3Rpb246IFNoaWZ0cyBjaGFyYWN0ZXJzIHRvIHJlcGxhY2Ugc3BhY2Ugc3ViIGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hpZnRBcnJheShjaGFyIFtdIGRlc3QsaW50IHN0YXJ0LCBpbnQgZSwgY2hhciBzdWJDaGFyKXsKKyAgICAgICAgaW50IHcgPSBlOworICAgICAgICBpbnQgciA9IGU7CisgICAgICAgIHdoaWxlICgtLXIgPj0gc3RhcnQpIHsKKyAgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgICBpZiAoY2ggIT0gc3ViQ2hhcikgeworICAgICAgICAgICAgLS13OworICAgICAgICAgICAgaWYgKHcgIT0gcikgeworICAgICAgICAgICAgICBkZXN0W3ddID0gY2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBmbGlwQXJyYXkKKyAgICAgKiBGdW5jdGlvbjogaW52ZXJ0cyBhcnJheSwgc28gdGhhdCBzdGFydCBiZWNvbWVzIGVuZCBhbmQgdmljZSB2ZXJzYQorICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBpbnQgZmxpcEFycmF5KGNoYXIgW10gZGVzdCwgaW50IHN0YXJ0LCBpbnQgZSwgaW50IHcpeworICAgICAgICBpbnQgcjsKKyAgICAgICAgaWYgKHcgPiBzdGFydCkgeworICAgICAgICAvLyBzaGlmdCwgYXNzdW1lIHNtYWxsIGJ1ZmZlciBzaXplIHNvIGRvbid0IHVzZSBhcnJheWNvcHkKKyAgICAgICAgICByID0gdzsKKyAgICAgICAgICB3ID0gc3RhcnQ7CisgICAgICAgICAgd2hpbGUgKHIgPCBlKSB7CisgICAgICAgICAgICBkZXN0W3crK10gPSBkZXN0W3IrK107CisgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgdyA9IGU7CisgICAgICAgICB9CisgICAgICAgIHJldHVybiB3OworICAgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgICA6IGhhbmRsZVRhc2hrZWVsV2l0aFRhdHdlZWwKKyAgICAgKiBGdW5jdGlvbiA6IFJlcGxhY2VzIFRhc2hrZWVsIGFzIGZvbGxvd2luZzoKKyAgICAgKiAgICAgICAgICAgIENhc2UgMSA6aWYgdGhlIFRhc2hrZWVsIG9uIHRhdHdlZWwsIHJlcGxhY2UgaXQgd2l0aCBUYXR3ZWVsLgorICAgICAqICAgICAgICAgICAgQ2FzZSAyIDppZiB0aGUgVGFzaGtlZWwgYWdncmVnYXRlZCB3aXRoIFNoYWRkYSBvbiBUYXR3ZWVsLCByZXBsYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgaXQgd2l0aCBTaGFkZGEgb24gVGF0d2VlbC4KKyAgICAgKiAgICAgICAgICAgIENhc2UgMzogaWYgdGhlIFRhc2hrZWVsIGlzIGlzb2xhdGVkIHJlcGxhY2UgaXQgd2l0aCBTcGFjZS4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBoYW5kbGVUYXNoa2VlbFdpdGhUYXR3ZWVsKGNoYXJbXSBkZXN0LCBpbnQgc291cmNlTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZigoaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIoZGVzdFtpXSkgPT0gMSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gVEFUV0VFTF9DSEFSOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoKGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyKGRlc3RbaV0pID09IDIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNIQUREQV9UQVRXRUVMX0NIQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigoaXNJc29sYXRlZFRhc2hrZWVsQ2hhcihkZXN0W2ldKT09MSkgJiYgZGVzdFtpXSAhPSBTSEFEREFfQ0hBUil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUxlbmd0aDsKKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMKKyAgICAgKkZ1bmN0aW9uIDogVGhlIHNoYXBlVW5pY29kZSBmdW5jdGlvbiBjb252ZXJ0cyBMYW0gKyBBbGVmIGludG8gTGFtQWxlZiArIHNwYWNlLAorICAgICAqICAgICAgICAgICBhbmQgVGFzaGtlZWwgdG8gc3BhY2UuCisgICAgICogICAgICAgICAgIGhhbmRsZUdlbmVyYXRlZFNwYWNlcyBmdW5jdGlvbiBwdXRzIHRoZXNlIGdlbmVyYXRlZCBzcGFjZXMKKyAgICAgKiAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zIHRoZSB1c2VyIHNwZWNpZmllcy4gTGFtQWxlZiBhbmQgVGFzaGtlZWwKKyAgICAgKiAgICAgICAgICAgc3BhY2VzIGNhbiBiZSByZXBsYWNlZCBhdCBiZWdpbiwgYXQgZW5kLCBhdCBuZWFyIG9yIGRlY3JlYXNlIHRoZQorICAgICAqICAgICAgICAgICBidWZmZXIgc2l6ZS4KKyAgICAgKgorICAgICAqICAgICAgICAgICBUaGVyZSBpcyBhbHNvIEF1dG8gb3B0aW9uIGZvciBMYW1BbGVmIGFuZCB0YXNoa2VlbCwgd2hpY2ggd2lsbCBwdXQKKyAgICAgKiAgICAgICAgICAgdGhlIHNwYWNlcyBhdCBlbmQgb2YgdGhlIGJ1ZmZlciAob3IgZW5kIG9mIHRleHQgaWYgdGhlIHVzZXIgdXNlZAorICAgICAqICAgICAgICAgICB0aGUgb3B0aW9uIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCkuCisgICAgICoKKyAgICAgKiAgICAgICAgICAgSWYgdGhlIHRleHQgdHlwZSB3YXMgdmlzdWFsX0xUUiBhbmQgdGhlIG9wdGlvbgorICAgICAqICAgICAgICAgICBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgd2FzIHNlbGVjdGVkIHRoZSBFTkQKKyAgICAgKiAgICAgICAgICAgb3B0aW9uIHdpbGwgcGxhY2UgdGhlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBhbmQKKyAgICAgKiAgICAgICAgICAgQkVHSU4gd2lsbCBwbGFjZSB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICAgICAqLworICBwcml2YXRlIGludCBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMoY2hhcltdIGRlc3QsCisgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisKKyAgICAgIGludCBsZW5PcHRpb25zTGFtQWxlZiA9IG9wdGlvbnMgJiBMQU1BTEVGX01BU0s7CisgICAgICBpbnQgbGVuT3B0aW9uc1Rhc2hrZWVsID0gb3B0aW9ucyAmIFRBU0hLRUVMX01BU0s7CisgICAgICBib29sZWFuIGxhbUFsZWZPbiA9IGZhbHNlOworICAgICAgYm9vbGVhbiB0YXNoa2VlbE9uID0gZmFsc2U7CisKKyAgICAgIGlmICghaXNMb2dpY2FsICYgIXNwYWNlc1JlbGF0aXZlVG9UZXh0QmVnaW5FbmQpIHsKKyAgICAgICAgICBzd2l0Y2ggKGxlbk9wdGlvbnNMYW1BbGVmKSB7CisgICAgICAgICAgY2FzZSBMQU1BTEVGX0JFR0lOOiBsZW5PcHRpb25zTGFtQWxlZiA9IExBTUFMRUZfRU5EOyBicmVhazsKKyAgICAgICAgICBjYXNlIExBTUFMRUZfRU5EOiBsZW5PcHRpb25zTGFtQWxlZiA9IExBTUFMRUZfQkVHSU47IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaCAobGVuT3B0aW9uc1Rhc2hrZWVsKXsKKyAgICAgICAgICBjYXNlIFRBU0hLRUVMX0JFR0lOOiBsZW5PcHRpb25zVGFzaGtlZWwgPSBUQVNIS0VFTF9FTkQ7IGJyZWFrOworICAgICAgICAgIGNhc2UgVEFTSEtFRUxfRU5EOiBsZW5PcHRpb25zVGFzaGtlZWwgPSBUQVNIS0VFTF9CRUdJTjsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgaWYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfTkVBUikgeworICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBsZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgaWYgKGRlc3RbaV0gPT0gTEFNQUxFRl9TUEFDRV9TVUIpIHsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTUEFDRV9DSEFSX0ZPUl9MQU1BTEVGOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICB9IGVsc2UgeworCisgICAgICAgICAgZmluYWwgaW50IGUgPSBzdGFydCArIGxlbmd0aDsKKyAgICAgICAgICBpbnQgd0wgPSBjb3VudFNwYWNlU3ViKGRlc3QsIGxlbmd0aCwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgIGludCB3VCA9IGNvdW50U3BhY2VTdWIoZGVzdCwgbGVuZ3RoLCBUQVNIS0VFTF9TUEFDRV9TVUIpOworCisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfRU5EKXsKKyAgICAgICAgICAgIGxhbUFsZWZPbiA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfRU5EKXsKKyAgICAgICAgICAgIHRhc2hrZWVsT24gPSB0cnVlOworICAgICAgICAgIH0KKworCisgICAgICAgICAgaWYgKGxhbUFsZWZPbiAmJiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9FTkQpKSB7CisgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgICB3aGlsZSAod0wgPiBzdGFydCkgeworICAgICAgICAgICAgICAgIGRlc3RbLS13TF0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0YXNoa2VlbE9uICYmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfRU5EKSl7CisgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBUQVNIS0VFTF9TUEFDRV9TVUIpOworICAgICAgICAgICAgd2hpbGUgKHdUID4gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgZGVzdFstLXdUXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgbGFtQWxlZk9uID0gZmFsc2U7CisgICAgICAgICAgdGFzaGtlZWxPbiA9IGZhbHNlOworCisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfUkVTSVpFKXsKKyAgICAgICAgICAgIGxhbUFsZWZPbiA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfUkVTSVpFKXsKKyAgICAgICAgICAgIHRhc2hrZWVsT24gPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYW1BbGVmT24gJiYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfUkVTSVpFKSl7CisgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgICAgd0wgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3TCk7CisgICAgICAgICAgICAgIGxlbmd0aCA9IHdMIC0gc3RhcnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh0YXNoa2VlbE9uICYmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfUkVTSVpFKSkgeworICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBUQVNIS0VFTF9TUEFDRV9TVUIpOworICAgICAgICAgICAgICB3VCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdUKTsKKyAgICAgICAgICAgICAgbGVuZ3RoID0gd1QgLSBzdGFydDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBsYW1BbGVmT24gPSBmYWxzZTsKKyAgICAgICAgICB0YXNoa2VlbE9uID0gZmFsc2U7CisKKyAgICAgICAgICBpZiAoKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQkVHSU4pIHx8CisgICAgICAgICAgICAgIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0FVVE8pKXsKKyAgICAgICAgICAgICAgICBsYW1BbGVmT24gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0JFR0lOKXsKKyAgICAgICAgICAgICAgICB0YXNoa2VlbE9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobGFtQWxlZk9uICYmICgobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9CRUdJTil8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0FVVE8pKSkgeyAvLyBzcGFjZXMgYXQgYmVnaW5uaW5nCisgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgICAgIHdMID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd0wpOworICAgICAgICAgICAgICAgICAgd2hpbGUgKHdMIDwgZSkgeworICAgICAgICAgICAgICAgICAgICAgIGRlc3Rbd0wrK10gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmKHRhc2hrZWVsT24gJiYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9CRUdJTikpeworICAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgICAgIHdUID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd1QpOworICAgICAgICAgICAgICAgICAgd2hpbGUgKHdUIDwgZSkgeworICAgICAgICAgICAgICAgICAgICAgIGRlc3Rbd1QrK10gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKworICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgfQorCisKKyAgLyoKKyAgICpOYW1lICAgICA6ZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbgorICAgKkZ1bmN0aW9uIDpFeHBhbmRzIHRoZSBMYW1BbGVmIGNoYXJhY3RlciB0byBMYW0gYW5kIEFsZWYgY29uc3VtaW5nIHRoZSByZXF1aXJlZAorICAgKiAgICAgICAgIHNwYWNlIGZyb20gYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuIElmIHRoZSB0ZXh0IHR5cGUgd2FzIHZpc3VhbF9MVFIKKyAgICogICAgICAgICBhbmQgdGhlIG9wdGlvbiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgd2FzIHNlbGVjdGVkCisgICAqICAgICAgICAgdGhlIHNwYWNlcyB3aWxsIGJlIGxvY2F0ZWQgYXQgZW5kIG9mIGJ1ZmZlci4KKyAgICogICAgICAgICBJZiB0aGVyZSBhcmUgbm8gc3BhY2VzIHRvIGV4cGFuZCB0aGUgTGFtQWxlZiwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyovCisgcHJpdmF0ZSBib29sZWFuIGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oY2hhcltdIGRlc3QsaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWNvdW50KSB7CisgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisgICAgIGlmIChsYWNvdW50ID4gY291bnRTcGFjZXNSaWdodChkZXN0LCBzdGFydCwgbGVuZ3RoKSkgeworICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgfQorICAgICBmb3IgKGludCByID0gc3RhcnQgKyBsZW5ndGggLSBsYWNvdW50LCB3ID0gc3RhcnQgKyBsZW5ndGg7IC0tciA+PSBzdGFydDspIHsKKyAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgaWYgKGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgIGRlc3RbLS13XSA9IExBTV9DSEFSOworICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgZGVzdFstLXddID0gY2g7CisgICAgICAgICB9CisgICAgIH0KKyAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisKKyAgfQorCisgIC8qCisgICAqTmFtZSAgICAgOiBleHBhbmRDb21wb3NpdENoYXJBdEVuZAorICAgKkZ1bmN0aW9uIDogRXhwYW5kcyB0aGUgTGFtQWxlZiBjaGFyYWN0ZXIgdG8gTGFtIGFuZCBBbGVmIGNvbnN1bWluZyB0aGUKKyAgICogICAgICAgICAgIHJlcXVpcmVkIHNwYWNlIGZyb20gZW5kIG9mIHRoZSBidWZmZXIuIElmIHRoZSB0ZXh0IHR5cGUgd2FzCisgICAqICAgICAgICAgICBWaXN1YWwgTFRSIGFuZCB0aGUgb3B0aW9uIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORAorICAgKiAgICAgICAgICAgd2FzIHVzZWQsIHRoZSBzcGFjZXMgd2lsbCBiZSBjb25zdW1lZCBmcm9tIGJlZ2luIG9mIGJ1ZmZlci4gSWYKKyAgICogICAgICAgICAgIHRoZXJlIGFyZSBubyBzcGFjZXMgdG8gZXhwYW5kIHRoZSBMYW1BbGVmLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKi8KKworICBwcml2YXRlIGJvb2xlYW4gIGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kKGNoYXJbXSBkZXN0LGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhY291bnQpeworICAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKyAgICAgIGlmIChsYWNvdW50ID4gY291bnRTcGFjZXNMZWZ0KGRlc3QsIHN0YXJ0LCBsZW5ndGgpKSB7CisgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICB9CisgICAgICBmb3IgKGludCByID0gc3RhcnQgKyBsYWNvdW50LCB3ID0gc3RhcnQsIGUgPSBzdGFydCArIGxlbmd0aDsgciA8IGU7ICsrcikgeworICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgZGVzdFt3KytdID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgICAgICBkZXN0W3crK10gPSBMQU1fQ0hBUjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBkZXN0W3crK10gPSBjaDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgfQorCisgIC8qCisgICAqTmFtZSAgICAgOiBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIKKyAgICpGdW5jdGlvbiA6IEV4cGFuZHMgdGhlIExhbUFsZWYgY2hhcmFjdGVyIGludG8gTGFtICsgQWxlZiwgWWVoSGFtemEgY2hhcmFjdGVyCisgICAqICAgICAgICAgICBpbnRvIFllaCArIEhhbXphLCBTZWVuRmFtaWx5IGNoYXJhY3RlciBpbnRvIFNlZW5GYW1pbHkgY2hhcmFjdGVyCisgICAqICAgICAgICAgICArIFRhaWwsIHdoaWxlIGNvbnN1bWluZyB0aGUgc3BhY2UgbmV4dCB0byB0aGUgY2hhcmFjdGVyLgorICAgKi8KKworICBwcml2YXRlIGJvb2xlYW4gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGNoYXJbXSBkZXN0LGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ZWhIYW16YU9wdGlvbiwgaW50IHNlZW5UYWlsT3B0aW9uLCBpbnQgbGFtQWxlZk9wdGlvbil7CisKKyAgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisKKworICAgICAgaWYgKGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGRlc3Rbc3RhcnRdKSkgeworICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgbGVuZ3RoOyAtLWkgPj1zdGFydDspIHsKKyAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKyAgICAgICAgICBpZiAobGFtQWxlZk9wdGlvbiA9PSAxICYmIGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICBpZiAoaT5zdGFydCAmJmRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKSB7CisgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gTEFNX0NIQVI7CisgICAgICAgICAgICAgICAgICBkZXN0Wy0taV0gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfWVsc2UgaWYoc2VlblRhaWxPcHRpb24gPT0gMSAmJiBpc1NlZW5UYWlsRmFtaWx5Q2hhcihjaCkgPT0gMSl7CisgICAgICAgICAgICAgIGlmKGk+c3RhcnQgJiZkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUil7CisgICAgICAgICAgICAgICAgICBkZXN0W2ktMV0gPSB0YWlsQ2hhcjsKKyAgICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH1lbHNlIGlmKHllaEhhbXphT3B0aW9uID09IDEgJiYgaXNZZWhIYW16YUNoYXIoY2gpKXsKKworICAgICAgICAgICAgICAgaWYoaT5zdGFydCAmJmRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKXsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSB5ZWhIYW16YVRvWWVoW2NoIC0gWUVIX0hBTVpBRkVfQ0hBUl07CisgICAgICAgICAgICAgICAgICBkZXN0W2ktMV0gPSBIQU1aQUZFX0NIQVI7CisgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKworICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBleHBhbmRDb21wb3NpdENoYXIKKyAgICAgKiBGdW5jdGlvbjogTGFtQWxlZiBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nIGFzIHRoZSBMYW1BbGVmIGlzCisgICAgICogICAgICAgICAgIG9uZSBjaGFyYWN0ZXIgd2hpbGUgZXhwYW5kaW5nIGl0IHdpbGwgZ2l2ZSB0d28KKyAgICAgKiAgICAgICAgICAgY2hhcmFjdGVycyBMYW0gKyBBbGVmLCBzbyB3ZSBuZWVkIHRvIGV4cGFuZCB0aGUgTGFtQWxlZgorICAgICAqICAgICAgICAgICBpbiBuZWFyIG9yIGZhciBzcGFjZXMgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zIHRoZSB1c2VyCisgICAgICogICAgICAgICAgIHNwZWNpZmllcyBvciBpbmNyZWFzZSB0aGUgYnVmZmVyIHNpemUuCisgICAgICogICAgICAgICAgIERlc3QgaGFzIGVub3VnaCByb29tIGZvciB0aGUgZXhwYW5zaW9uIGlmIHdlIGFyZSBncm93aW5nLgorICAgICAqICAgICAgICAgICBsYW1hbGVmIGFyZSBub3JtYWxpemVkIHRvIHRoZSAnc3BlY2lhbCBjaGFyYWN0ZXJzJworICAgICAqLworICAgIHByaXZhdGUgaW50IGV4cGFuZENvbXBvc2l0Q2hhcihjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFwaW5nTW9kZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGludCBsZW5PcHRpb25zTGFtQWxlZiA9IG9wdGlvbnMgJiBMQU1BTEVGX01BU0s7CisgICAgICAgIGludCBsZW5PcHRpb25zU2VlbiA9IG9wdGlvbnMgJiBTRUVOX01BU0s7CisgICAgICAgIGludCBsZW5PcHRpb25zWWVoSGFtemEgPSBvcHRpb25zICYgWUVISEFNWkFfTUFTSzsKKyAgICAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgaWYgKCFpc0xvZ2ljYWwgJiYgIXNwYWNlc1JlbGF0aXZlVG9UZXh0QmVnaW5FbmQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobGVuT3B0aW9uc0xhbUFsZWYpIHsKKyAgICAgICAgICAgIGNhc2UgTEFNQUxFRl9CRUdJTjogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0VORDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExBTUFMRUZfRU5EOiBsZW5PcHRpb25zTGFtQWxlZiA9IExBTUFMRUZfQkVHSU47IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihzaGFwaW5nTW9kZSA9PSAxKXsKKyAgICAgICAgICAgIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQVVUTyl7CisgICAgICAgICAgICAgICAgaWYoaXNMb2dpY2FsKXsKKyAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDAsMCwxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDAsMCwxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0VORCl7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQkVHSU4peworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfTkVBUil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDAsMCwxKTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfUkVTSVpFKXsKKyAgICAgICAgICAgICAgICBmb3IgKGludCByID0gc3RhcnQgKyBsZW5ndGgsIHcgPSByICsgbGFjb3VudDsgLS1yID49IHN0YXJ0OykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFstLXddID0gJ1x1MDY0NCc7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Wy0td10gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Wy0td10gPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gbGFjb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKGxlbk9wdGlvbnNTZWVuID09IFNFRU5fVFdPQ0VMTF9ORUFSKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwxLDApOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2UgZm9yIFNlZW4gdGFpbCBleHBhbnNpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihsZW5PcHRpb25zWWVoSGFtemEgPT0gWUVISEFNWkFfVFdPQ0VMTF9ORUFSKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMSwwLDApOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2UgZm9yIFllaEhhbXphIGV4cGFuc2lvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICB9CisKKworICAgIC8qIENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBmcm9tIEZFeHggUmFuZ2UgaW50byAwNnh4IFJhbmdlCisgICAgICogdG8gcHV0IGFsbCBjaGFyYWN0ZXJzIGludG8gdGhlIDA2eHggcmFuZ2UKKyAgICAgKiBldmVuIHRoZSBsYW1hbGVmIGlzIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lhbCByZWdpb24gaW4KKyAgICAgKiB0aGUgMDZ4eCByYW5nZS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGxhbWFsZWYgY2hhcnMgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbm9ybWFsaXplKGNoYXJbXSBkZXN0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaW50IGxhY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKyAgICAgICAgICAgIGlmIChjaCA+PSAnXHVGRTcwJyAmJiBjaCA8PSAnXHVGRUZDJykgeworICAgICAgICAgICAgICAgIGlmIChpc0xhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICAgICAgICArK2xhY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhciljb252ZXJ0RkV0bzA2W2NoIC0gJ1x1RkU3MCddOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsYWNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGRlc2hhcGVOb3JtYWxpemUKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydCB0aGUgaW5wdXQgYnVmZmVyIGZyb20gRkV4eCBSYW5nZSBpbnRvIDA2eHggUmFuZ2UKKyAgICAgKiAgICAgICAgICAgZXZlbiB0aGUgbGFtYWxlZiBpcyBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpYWwgcmVnaW9uIGluIHRoZSAwNnh4IHJhbmdlLgorICAgICAqICAgICAgICAgICBBY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgdGhlIHVzZXIgZW50ZXJzLCBhbGwgc2VlbiBmYW1pbHkgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICBmb2xsb3dlZCBieSBhIHRhaWwgY2hhcmFjdGVyIGFyZSBtZXJnZWQgdG8gc2VlbiB0YWlsIGZhbWlseSBjaGFyYWN0ZXIgYW5kCisgICAgICogICAgICAgICAgIGFueSB5ZWggZm9sbG93ZWQgYnkgYSBoYW16YSBjaGFyYWN0ZXIgYXJlIG1lcmdlZCB0byB5ZWhoYW16YSBjaGFyYWN0ZXIuCisgICAgICogICAgICAgICAgIE1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGFtYWxlZiBjaGFycyBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBkZXNoYXBlTm9ybWFsaXplKGNoYXJbXSBkZXN0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaW50IGxhY291bnQgPSAwOworICAgICAgICBpbnQgeWVoSGFtemFDb21wb3NlRW5hYmxlZCA9IDA7CisgICAgICAgIGludCBzZWVuQ29tcG9zZUVuYWJsZWQgPSAwOworCisgICAgICAgIHllaEhhbXphQ29tcG9zZUVuYWJsZWQgPSAoKG9wdGlvbnMmWUVISEFNWkFfTUFTSykgPT0gWUVISEFNWkFfVFdPQ0VMTF9ORUFSKSA/IDEgOiAwOworICAgICAgICBzZWVuQ29tcG9zZUVuYWJsZWQgPSAoKG9wdGlvbnMmU0VFTl9NQVNLKSA9PSBTRUVOX1RXT0NFTExfTkVBUik/IDEgOiAwOworCisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBsZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworCisgICAgICAgIGlmKCAoeWVoSGFtemFDb21wb3NlRW5hYmxlZCA9PSAxKSAmJiAoKGNoID09IEhBTVpBMDZfQ0hBUikgfHwgKGNoID09IEhBTVpBRkVfQ0hBUikpCisgICAgICAgICAgICAgICAmJiAoaSA8IChsZW5ndGggLSAxKSkgJiYgaXNBbGVmTWFrc291cmFDaGFyKGRlc3RbaSsxXSApKSB7CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgZGVzdFtpKzFdID0gWUVIX0hBTVpBX0NIQVI7CisgICAgICAgfSBlbHNlIGlmICggKHNlZW5Db21wb3NlRW5hYmxlZCA9PSAxKSAmJiAoaXNUYWlsQ2hhcihjaCkpICYmIChpPCAobGVuZ3RoIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICYmIChpc1NlZW5UYWlsRmFtaWx5Q2hhcihkZXN0W2krMV0pPT0xKSApIHsKKyAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTUEFDRV9DSEFSOworICAgICAgIH0KKyAgICAgICBlbHNlIGlmIChjaCA+PSAnXHVGRTcwJyAmJiBjaCA8PSAnXHVGRUZDJykgeworICAgICAgICAgICAgICAgIGlmIChpc0xhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICAgICAgICArK2xhY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhciljb252ZXJ0RkV0bzA2W2NoIC0gJ1x1RkU3MCddOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsYWNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IHNoYXBlVW5pY29kZQorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0cyBhbiBBcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gMDZ4eCBSYW5nZSBpbnRvIGEgc2hhcGVkCisgICAgICogICAgICAgICAgIGFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiBGRXh4IFJhbmdlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2hhcGVVbmljb2RlKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhc2hrZWVsRmxhZyl0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGxhbWFsZWZfY291bnQgPSBub3JtYWxpemUoZGVzdCwgc3RhcnQsIGxlbmd0aCk7CisKKyAgICAgICAgLy8gcmVzb2x2ZSB0aGUgbGluayBiZXR3ZWVuIHRoZSBjaGFyYWN0ZXJzLgorICAgICAgICAvLyBBcmFiaWMgY2hhcmFjdGVycyBoYXZlIGZvdXIgZm9ybXM6IElzb2xhdGVkLCBJbml0aWFsLCBNZWRpYWwgYW5kIEZpbmFsLgorICAgICAgICAvLyBUYXNoa2VlbCBjaGFyYWN0ZXJzIGhhdmUgdHdvLCBpc29sYXRlZCBvciBtZWRpYWwsIGFuZCBzb21ldGltZXMgb25seSBpc29sYXRlZC4KKyAgICAgICAgLy8gdGFzaGtlZWxGbGFnID09IDA6IHNoYXBlIG5vcm1hbGx5LCAxOiBzaGFwZSBpc29sYXRlZCwgMjogZG9uJ3Qgc2hhcGUKKworICAgICAgICBib29sZWFuIGxhbWFsZWZfZm91bmQgPSBmYWxzZSwgc2VlbmZhbV9mb3VuZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHllaGhhbXphX2ZvdW5kID0gZmFsc2UsIHRhc2hrZWVsX2ZvdW5kID0gZmFsc2U7CisgICAgICAgIGludCBpID0gc3RhcnQgKyBsZW5ndGggLSAxOworICAgICAgICBpbnQgY3VyckxpbmsgPSBnZXRMaW5rKGRlc3RbaV0pOworICAgICAgICBpbnQgbmV4dExpbmsgPSAwOworICAgICAgICBpbnQgcHJldkxpbmsgPSAwOworICAgICAgICBpbnQgbGFzdExpbmsgPSAwOworICAgICAgICAvL2ludCBwcmV2UG9zID0gaTsKKyAgICAgICAgaW50IGxhc3RQb3MgPSBpOworICAgICAgICBpbnQgbnggPSAtMjsKKyAgICAgICAgaW50IG53ID0gMDsKKworICAgICAgICB3aGlsZSAoaSA+PSAwKSB7CisgICAgICAgICAgICAvLyBJZiBoaWdoIGJ5dGUgb2YgY3VyckxpbmsgPiAwIHRoZW4gdGhlcmUgbWlnaHQgYmUgbW9yZSB0aGFuIG9uZSBzaGFwZQorICAgICAgICAgICAgaWYgKChjdXJyTGluayAmICdcdUZGMDAnKSA+IDAgfHwgaXNUYXNoa2VlbENoYXIoZGVzdFtpXSkpIHsKKyAgICAgICAgICAgICAgICBudyA9IGkgLSAxOworICAgICAgICAgICAgICAgIG54ID0gLTI7CisgICAgICAgICAgICAgICAgd2hpbGUgKG54IDwgMCkgeyAvLyB3ZSBuZWVkIHRvIGtub3cgYWJvdXQgbmV4dCBjaGFyCisgICAgICAgICAgICAgICAgICAgIGlmIChudyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExpbmsgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbnggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaW5rID0gZ2V0TGluayhkZXN0W253XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5leHRMaW5rICYgSVJSRUxFVkFOVCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG54ID0gbnc7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbnc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKChjdXJyTGluayAmIEFMRUZUWVBFKSA+IDApICYmICgobGFzdExpbmsgJiBMQU1UWVBFKSA+IDApKSB7CisgICAgICAgICAgICAgICAgICAgIGxhbWFsZWZfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjaGFyIHdMYW1hbGVmID0gY2hhbmdlTGFtQWxlZihkZXN0W2ldKTsgLy8gZ2V0IGZyb20gMHgwNjVDLTB4MDY1ZgorICAgICAgICAgICAgICAgICAgICBpZiAod0xhbWFsZWYgIT0gJ1x1MDAwMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYWxlZiBieSBtYXJrZXIsIGl0IHdpbGwgYmUgcmVtb3ZlZCBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9ICdcdWZmZmYnOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtsYXN0UG9zXSA9IHdMYW1hbGVmOworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGxhc3RQb3M7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsYXN0TGluayA9IHByZXZMaW5rOworICAgICAgICAgICAgICAgICAgICBjdXJyTGluayA9IGdldExpbmsod0xhbWFsZWYpOyAvLyByZXF1aXJlcyAnXHUwMDAwJywgdW5mb3J0dW5hdGVseQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGkgPiAwKSAmJiAoZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1NlZW5GYW1pbHlDaGFyKGRlc3RbaV0pID09IDEpeworICAgICAgICAgICAgICAgICAgICAgICAgc2VlbmZhbV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdFtpXSA9PSBZRUhfSEFNWkFfQ0hBUikgeworICAgICAgICAgICAgICAgICAgICAgICAgeWVoaGFtemFfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoaT09MCl7CisgICAgICAgICAgICAgICAgICAgIGlmICggaXNTZWVuRmFtaWx5Q2hhcihkZXN0W2ldKSA9PSAxKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5mYW1fZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RbaV0gPT0gWUVIX0hBTVpBX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHllaGhhbXphX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXIgc2hhcGUgYWNjb3JkaW5nIHRvIGxpbmsgYWJpbGl0eSBvZiBuZWlnaGJvcnMKKyAgICAgICAgICAgICAgICAvLyBhbmQgb2YgY2hhcmFjdGVyOyBkZXBlbmRzIG9uIHRoZSBvcmRlciBvZiB0aGUgc2hhcGVzCisgICAgICAgICAgICAgICAgLy8gKGlzb2xhdGVkLCBpbml0aWFsLCBtaWRkbGUsIGZpbmFsKSBpbiB0aGUgY29tcGF0aWJpbGl0eSBhcmVhCisKKyAgICAgICAgICAgICAgICBpbnQgZmxhZyA9IHNwZWNpYWxDaGFyKGRlc3RbaV0pOworCisgICAgICAgICAgICAgICAgaW50IHNoYXBlID0gc2hhcGVUYWJsZVtuZXh0TGluayAmIExJTktfTUFTS10KKyAgICAgICAgICAgICAgICAgICAgW2xhc3RMaW5rICYgTElOS19NQVNLXQorICAgICAgICAgICAgICAgICAgICBbY3VyckxpbmsgJiBMSU5LX01BU0tdOworCisgICAgICAgICAgICAgICAgaWYgKGZsYWcgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBzaGFwZSAmPSAweDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2hrZWVsRmxhZyA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKGxhc3RMaW5rICYgTElOS0wpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKG5leHRMaW5rICYgTElOS1IpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldICE9ICdcdTA2NEMnICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldICE9ICdcdTA2NEQnICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhKChuZXh0TGluayAmIEFMRUZUWVBFKSA9PSBBTEVGVFlQRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdExpbmsgJiBMQU1UWVBFKSA9PSBMQU1UWVBFKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFzaGtlZWxGbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBUQVNIS0VFTF9TUEFDRV9TVUI7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXNoa2VlbF9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhcikoJ1x1RkU3MCcgKyBpcnJlbGV2YW50UG9zW2Rlc3RbaV0gLSAnXHUwNjRCJ10gKyBzaGFwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBsZWF2ZSB0YXNoa2VlbCBhbG9uZQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhcikoJ1x1RkU3MCcgKyAoY3VyckxpbmsgPj4gOCkgKyBzaGFwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtb3ZlIG9uZSBub3RjaCBmb3J3YXJkCisgICAgICAgICAgICBpZiAoKGN1cnJMaW5rICYgSVJSRUxFVkFOVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHByZXZMaW5rID0gbGFzdExpbms7CisgICAgICAgICAgICAgICAgbGFzdExpbmsgPSBjdXJyTGluazsKKyAgICAgICAgICAgICAgICAvL3ByZXZQb3MgPSBsYXN0UG9zOworICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBpZiAoaSA9PSBueCkgeworICAgICAgICAgICAgICAgIGN1cnJMaW5rID0gbmV4dExpbms7CisgICAgICAgICAgICAgICAgbnggPSAtMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGN1cnJMaW5rID0gZ2V0TGluayhkZXN0W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgbGFtL2FsZWYgcGFpciBpbiB0aGUgYnVmZmVyCisgICAgICAgIC8vIGNhbGwgaGFuZGxlR2VuZXJhdGVkU3BhY2VzIHRvIHJlbW92ZSB0aGUgc3BhY2VzIHRoYXQgd2VyZSBhZGRlZAorCisgICAgICAgIGRlc3RTaXplID0gbGVuZ3RoOworICAgICAgICBpZiAobGFtYWxlZl9mb3VuZCB8fCB0YXNoa2VlbF9mb3VuZCkgeworICAgICAgICAgICAgZGVzdFNpemUgPSBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMoZGVzdCwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlZW5mYW1fZm91bmQgfHwgeWVoaGFtemFfZm91bmQpeworICAgICAgICAgICAgZGVzdFNpemUgPSBleHBhbmRDb21wb3NpdENoYXIoZGVzdCwgc3RhcnQsIGRlc3RTaXplLCBsYW1hbGVmX2NvdW50LCBTSEFQRV9NT0RFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVzdFNpemU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZGVTaGFwZVVuaWNvZGUKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydHMgYW4gQXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIEZFeHggUmFuZ2UgaW50byB1bnNoYXBlZAorICAgICAqICAgICAgICAgICBhcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gMDZ4eCBSYW5nZQorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlU2hhcGVVbmljb2RlKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0U2l6ZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGludCBsYW1hbGVmX2NvdW50ID0gZGVzaGFwZU5vcm1hbGl6ZShkZXN0LCBzdGFydCwgbGVuZ3RoKTsKKworICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBsYW1hbGVmIGluIHRoZSBidWZmZXIgY2FsbCBleHBhbmRMYW1BbGVmCisgICAgICAgIGlmIChsYW1hbGVmX2NvdW50ICE9IDApIHsKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRqdXN0IGRlc3QgdG8gZml0IGV4cGFuZGVkIGJ1ZmZlci4uLiAhISEKKyAgICAgICAgICAgIGRlc3RTaXplID0gZXhwYW5kQ29tcG9zaXRDaGFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhbWFsZWZfY291bnQsREVTSEFQRV9NT0RFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3RTaXplID0gbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlc3RTaXplOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGludGVybmFsU2hhcGUoY2hhcltdIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFNpemUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoc291cmNlTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3RTaXplID09IDApIHsKKyAgICAgICAgICAgIGlmICgoKG9wdGlvbnMgJiBMRVRURVJTX01BU0spICE9IExFVFRFUlNfTk9PUCkgJiYKKyAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spID09IExBTUFMRUZfUkVTSVpFKSkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZVNpemUoc291cmNlLCBzb3VyY2VTdGFydCwgc291cmNlTGVuZ3RoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUxlbmd0aDsgLy8gYnkgZGVmaW5pdGlvbgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWx3YXlzIHVzZSB0ZW1wIGJ1ZmZlcgorICAgICAgICBjaGFyW10gdGVtcCA9IG5ldyBjaGFyW3NvdXJjZUxlbmd0aCAqIDJdOyAvLyBhbGwgbGFtYWxlZnMgcmVxdWlyaW5nIGV4cGFuc2lvbgorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgc291cmNlU3RhcnQsIHRlbXAsIDAsIHNvdXJjZUxlbmd0aCk7CisKKyAgICAgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICAgICAgaW52ZXJ0QnVmZmVyKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgb3V0cHV0U2l6ZSA9IHNvdXJjZUxlbmd0aDsKKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMRVRURVJTX01BU0spIHsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEOgorICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IHNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRToKKyAgICAgICAgICAgIGlmKCAoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSyk+IDApICYmCisgICAgICAgICAgICAgICAgKChvcHRpb25zJlRBU0hLRUVMX01BU0spICE9VEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMKSkgeworICAgICAgICAgICAgICAgICAgIC8qIENhbGwgdGhlIHNoYXBpbmcgZnVuY3Rpb24gd2l0aCB0YXNoa2VlbCBmbGFnID09IDIgZm9yIHJlbW92YWwgb2YgdGFzaGtlZWwgKi8KKyAgICAgICAgICAgICAgICBvdXRwdXRTaXplID0gc2hhcGVVbmljb2RlKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCwgZGVzdFNpemUsIDIpOworICAgICAgICAgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgICAgICAgICAvL2RlZmF1bHQgQ2FsbCB0aGUgc2hhcGluZyBmdW5jdGlvbiB3aXRoIHRhc2hrZWVsIGZsYWcgPT0gMSAqLworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTaXplID0gc2hhcGVVbmljb2RlKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCwgZGVzdFNpemUsIDApOworCisgICAgICAgICAgICAgICAgICAgLypBZnRlciBzaGFwaW5nIHRleHQgY2hlY2sgaWYgdXNlciB3YW50cyB0byByZW1vdmUgdGFzaGtlZWwgYW5kIHJlcGxhY2UgaXQgd2l0aCB0YXR3ZWVsKi8KKyAgICAgICAgICAgICAgICAgICBpZiggKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgPT0gVEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMKXsKKyAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IGhhbmRsZVRhc2hrZWVsV2l0aFRhdHdlZWwodGVtcCxzb3VyY2VMZW5ndGgpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEVUVEVSU19VTlNIQVBFOgorICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IGRlU2hhcGVVbmljb2RlKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCwgZGVzdFNpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dFNpemUgPiBkZXN0U2l6ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIm5vdCBlbm91Z2ggcm9vbSBmb3IgcmVzdWx0IGRhdGEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgob3B0aW9ucyAmIERJR0lUU19NQVNLKSAhPSBESUdJVFNfTk9PUCkgeworICAgICAgICAgICAgY2hhciBkaWdpdEJhc2UgPSAnXHUwMDMwJzsgLy8gRXVyb3BlYW4gZGlnaXRzCisgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVF9UWVBFX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTjoKKyAgICAgICAgICAgICAgICBkaWdpdEJhc2UgPSAnXHUwNjYwJzsgIC8vIEFyYWJpYy1JbmRpYyBkaWdpdHMKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOX0VYVEVOREVEOgorICAgICAgICAgICAgICAgIGRpZ2l0QmFzZSA9ICdcdTA2ZjAnOyAgLy8gRWFzdGVybiBBcmFiaWMtSW5kaWMgZGlnaXRzIChQZXJzaWFuIGFuZCBVcmR1KQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgeworICAgICAgICAgICAgY2FzZSBESUdJVFNfRU4yQU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGlnaXREZWx0YSA9IGRpZ2l0QmFzZSAtICdcdTAwMzAnOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dFNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHRlbXBbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPD0gJ1x1MDAzOScgJiYgY2ggPj0gJ1x1MDAzMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldICs9IGRpZ2l0RGVsdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0FOMkVOOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBkaWdpdFRvcCA9IChjaGFyKShkaWdpdEJhc2UgKyA5KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpZ2l0RGVsdGEgPSAnXHUwMDMwJyAtIGRpZ2l0QmFzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0ZW1wW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDw9IGRpZ2l0VG9wICYmIGNoID49IGRpZ2l0QmFzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbaV0gKz0gZGlnaXREZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9MUjoKKyAgICAgICAgICAgICAgICBzaGFwZVRvQXJhYmljRGlnaXRzV2l0aENvbnRleHQodGVtcCwgMCwgb3V0cHV0U2l6ZSwgZGlnaXRCYXNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfQUw6CisgICAgICAgICAgICAgICAgc2hhcGVUb0FyYWJpY0RpZ2l0c1dpdGhDb250ZXh0KHRlbXAsIDAsIG91dHB1dFNpemUsIGRpZ2l0QmFzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNMb2dpY2FsKSB7CisgICAgICAgICAgICBpbnZlcnRCdWZmZXIodGVtcCwgMCwgb3V0cHV0U2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGRlc3QsIGRlc3RTdGFydCwgb3V0cHV0U2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dFNpemU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pY3U0ai9saWNlbnNlLmh0bWwgYi9pY3U0ai9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwNWRkZgotLS0gL2Rldi9udWxsCisrKyBiL2ljdTRqL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDUxIEBACis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSI+PC9tZXRhPgorPHRpdGxlPklDVSBMaWNlbnNlIC0gSUNVIDEuOC4xIGFuZCBsYXRlcjwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IEJHQ09MT1I9IiNmZmZmZmYiPgorPGgyPklDVSBMaWNlbnNlIC0gSUNVIDEuOC4xIGFuZCBsYXRlcjwvaDI+CisKKzxwPkNPUFlSSUdIVCBBTkQgUEVSTUlTU0lPTiBOT1RJQ0U8L3A+CisKKzxwPgorQ29weXJpZ2h0IChjKSAxOTk1LTIwMDYgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzCis8L3A+Cis8cD4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCis8L3A+Cis8cD4KK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAordG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgordGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMKK3RvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSBhbmQgdGhhdCBib3RoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzCitwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorPC9wPgorPHA+CitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCAKK0lOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMCitUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBIT0xERVJTIElOQ0xVREVEIElOIFRISVMgTk9USUNFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCitSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKK05FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKzwvcD4KKzxwPgorRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluCit0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgorPC9wPgorCis8aHI+Cis8cD48c21hbGw+CitBbGwgdHJhZGVtYXJrcyBhbmQgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG1lbnRpb25lZCBoZXJlaW4gYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKzwvc21hbGw+PC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCBiL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgKaW5kZXggMDlmMGRlMS4uMjJjOWI3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaAorKysgYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oCkBAIC0zMCw3ICszMCw5IEBACiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotICAgIAorCitjbGFzcyBDdXJzb3JXaW5kb3c7CisKIGNsYXNzIEFuZHJvaWRSdW50aW1lCiB7CiBwdWJsaWM6CkBAIC0xMjIsNiArMTI0LDggQEAKIC8vIFJldHVybnMgdGhlIFVuaXggZmlsZSBkZXNjcmlwdG9yIGZvciBhIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9iamVjdAogZXh0ZXJuIGludCBnZXRQYXJjZWxGaWxlRGVzY3JpcHRvckZEKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCk7CiAKK2V4dGVybiBDdXJzb3JXaW5kb3cgKiBnZXRfd2luZG93X2Zyb21fb2JqZWN0KEpOSUVudiAqIGVudiwgam9iamVjdCBqYXZhV2luZG93KTsKKwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL0N1cnNvcldpbmRvdy5oIGIvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiZmYyYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYmluZGVyL0N1cnNvcldpbmRvdy5oCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKKyNkZWZpbmUgX0FORFJPSURfX0RBVEFCQVNFX1dJTkRPV19ICisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2RlZmluZSBERUZBVUxUX1dJTkRPV19TSVpFIDQwOTYKKyNkZWZpbmUgTUFYX1dJTkRPV19TSVpFICgxMDI0ICogMTAyNCkKKyNkZWZpbmUgV0lORE9XX0FMTE9DQVRJT05fU0laRSA0MDk2CisKKyNkZWZpbmUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgMTYKKworLy8gUm93IHNsb3RzIGFyZSBhbGxvY2F0ZWQgaW4gY2h1bmtzIG9mIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTLAorLy8gd2l0aCBhbiBvZmZzZXQgYWZ0ZXIgdGhlIHJvd3MgdGhhdCBwb2ludHMgdG8gdGhlIG5leHQgY2h1bmsKKyNkZWZpbmUgUk9XX1NMT1RfQ0hVTktfU0laRSAoKFJPV19TTE9UX0NIVU5LX05VTV9ST1dTICogc2l6ZW9mKHJvd19zbG90X3QpKSArIHNpemVvZih1aW50MzJfdCkpCisKKworI2lmIExPR19OREVCVUcKKworI2RlZmluZSBJRl9MT0dfV0lORE9XKCkgaWYgKGZhbHNlKQorI2RlZmluZSBMT0dfV0lORE9XKC4uLikKKworI2Vsc2UKKworI2RlZmluZSBJRl9MT0dfV0lORE9XKCkgSUZfTE9HKExPR19ERUJVRywgIkN1cnNvcldpbmRvdyIpCisjZGVmaW5lIExPR19XSU5ET1coLi4uKSBMT0coTE9HX0RFQlVHLCAiQ3Vyc29yV2luZG93IiwgX19WQV9BUkdTX18pCisKKyNlbmRpZgorCisKKy8vIFdoZW4gZGVmaW5lZCB0byB0cnVlIHN0cmluZ3MgYXJlIHN0b3JlZCBhcyBVVEY4LCBvdGhlcndpc2UgdGhleSdyZSBVVEYxNgorI2RlZmluZSBXSU5ET1dfU1RPUkFHRV9VVEY4IDEKKworLy8gV2hlbiBkZWZpbmVkIHRvIHRydWUgbnVtYmVyaWMgdmFsdWVzIGFyZSBzdG9yZWQgaW5saW5lIGluIHRoZSBmaWVsZF9zbG90X3QsIG90aGVyd2lzZSB0aGV5J3JlIGFsbG9jYXRlZCBpbiB0aGUgd2luZG93CisjZGVmaW5lIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUyAxCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCBudW1Sb3dzOworICAgIHVpbnQzMl90IG51bUNvbHVtbnM7Cit9IHdpbmRvd19oZWFkZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCBvZmZzZXQ7Cit9IHJvd19zbG90X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCB0eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICAgIGludDY0X3QgbDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgICAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICAgIH0gYnVmZmVyOworICAgIH0gZGF0YTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZmllbGRfc2xvdF90OworCisjZGVmaW5lIEZJRUxEX1RZUEVfTlVMTCAwCisjZGVmaW5lIEZJRUxEX1RZUEVfSU5URUdFUiAxCisjZGVmaW5lIEZJRUxEX1RZUEVfRkxPQVQgMgorI2RlZmluZSBGSUVMRF9UWVBFX1NUUklORyAzCisjZGVmaW5lIEZJRUxEX1RZUEVfQkxPQiA0CisKKy8qKgorICogVGhpcyBjbGFzcyBzdG9yZXMgYSBzZXQgb2Ygcm93cyBmcm9tIGEgZGF0YWJhc2UgaW4gYSBidWZmZXIuIFRoZSBiZWdpbmluZyBvZiB0aGUKKyAqIHdpbmRvdyBoYXMgZmlyc3QgY2h1bmsgb2Ygcm93X3Nsb3RfdHMsIHdoaWNoIGFyZSBvZmZzZXRzIHRvIHRoZSByb3cgZGlyZWN0b3J5LCBmb2xsb3dlZCBieQorICogYW4gb2Zmc2V0IHRvIHRoZSBuZXh0IGNodW5rIGluIGEgbGlua2VkLWxpc3Qgb2YgYWRkaXRpb25hbCBjaHVuayBvZiByb3dfc2xvdF90cyBpbiBjYXNlCisgKiB0aGUgcHJlLWFsbG9jYXRlZCBjaHVuayBpc24ndCBiaWcgZW5vdWdoIHRvIHJlZmVyIHRvIGFsbCByb3dzLiBFYWNoIHJvdyBkaXJlY3RvcnkgaGFzIGEKKyAqIGZpZWxkX3Nsb3RfdCBwZXIgY29sdW1uLCB3aGljaCBoYXMgdGhlIHNpemUsIG9mZnNldCwgYW5kIHR5cGUgb2YgdGhlIGRhdGEgZm9yIHRoYXQgZmllbGQuCisgKiBOb3RlIHRoYXQgdGhlIGRhdGEgdHlwZXMgY29tZSBmcm9tIHNxbGl0ZTMuaC4KKyAqLworY2xhc3MgQ3Vyc29yV2luZG93Cit7CitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBDdXJzb3JXaW5kb3coc2l6ZV90IG1heFNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yV2luZG93KCl7fQorICAgIGJvb2wgICAgICAgICAgICAgICAgc2V0TWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+Jik7CisgICAgICAgICAgICAgICAgICAgICAgICB+Q3Vyc29yV2luZG93KCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgIGluaXRCdWZmZXIoYm9vbCBsb2NhbE9ubHkpOworICAgIHNwPElNZW1vcnk+ICAgICAgICAgZ2V0TWVtb3J5KCkge3JldHVybiBtTWVtb3J5O30KKworICAgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZSgpIHtyZXR1cm4gbVNpemU7fQorICAgIHVpbnQ4X3QgKiAgICAgICAgICAgZGF0YSgpIHtyZXR1cm4gbURhdGE7fQorICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0TnVtUm93cygpIHtyZXR1cm4gbUhlYWRlci0+bnVtUm93czt9CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXROdW1Db2x1bW5zKCkge3JldHVybiBtSGVhZGVyLT5udW1Db2x1bW5zO30KKyAgICB2b2lkICAgICAgICAgICAgICAgIGZyZWVMYXN0Um93KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSGVhZGVyLT5udW1Sb3dzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1Sb3dzLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGJvb2wgICAgICAgICAgICAgICAgc2V0TnVtQ29sdW1ucyh1aW50MzJfdCBudW1Db2x1bW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY3VyID0gbUhlYWRlci0+bnVtQ29sdW1uczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciA+IDAgJiYgY3VyICE9IG51bUNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlRyeWluZyB0byBnbyBmcm9tICVkIGNvbHVtbnMgdG8gJWQiLCBjdXIsIG51bUNvbHVtbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICBpbnQzMl90ICAgICAgICAgICAgIGZyZWVTcGFjZSgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBjbGVhcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGEgcm93IHNsb3QgYW5kIGl0cyBkaXJlY3RvcnkuIFRoZSByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICogcG9pbnRlciBwb2ludHMgdG8gdGhlIGJlZ2luaW5nIG9mIHRoZSByb3cncyBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yIE5VTEwgaWYgdGhlcmUgd2Fzbid0IHJvb20uIFRoZSBkaXJlY3RvcnkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGluaXRpYWxpZWQgd2l0aCBOVUxMIGVudHJpZXMgZm9yIGVhY2ggZmllbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGFsbG9jUm93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYSBwb3J0aW9uIG9mIHRoZSB3aW5kb3cuIFJldHVybnMgdGhlIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIGFsbG9jYXRpb24sIG9yIDAgaWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgYWxpZ25lZCBpcyB0cnVlLCB0aGUgYWxsb2NhdGlvbiBnZXRzIDQgYnl0ZSBhbGlnbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGFsbG9jKHNpemVfdCBzaXplLCBib29sIGFsaWduZWQgPSBmYWxzZSk7CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJlYWRfZmllbGRfc2xvdChpbnQgcm93LCBpbnQgY29sdW1uLCBmaWVsZF9zbG90X3QgKiBzbG90KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGRhdGEgaW50byB0aGUgd2luZG93IGF0IHRoZSBnaXZlbiBvZmZzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgY29uc3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBpbnQ2NF90IGRhdGEpOworICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgZG91YmxlIGRhdGEpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5T3V0KHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgIGNvcHlPdXRMb25nKHVpbnQzMl90IG9mZnNldCk7CisgICAgZG91YmxlICAgICAgICAgICAgICBjb3B5T3V0RG91YmxlKHVpbnQzMl90IG9mZnNldCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgIHB1dExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCB2YWx1ZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICBwdXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlIHZhbHVlKTsKKyAgICBib29sICAgICAgICAgICAgICAgIHB1dE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgIGdldExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCAqIHZhbHVlT3V0KTsKKyAgICBib29sICAgICAgICAgICAgICAgIGdldERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgKiB2YWx1ZU91dCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICBnZXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGJvb2wgKiB2YWx1ZU91dCk7CisKKyAgICB1aW50OF90ICogICAgICAgICAgIG9mZnNldFRvUHRyKHVpbnQzMl90IG9mZnNldCkge3JldHVybiBtRGF0YSArIG9mZnNldDt9CisKKyAgICByb3dfc2xvdF90ICogICAgICAgIGFsbG9jUm93U2xvdCgpOworCisgICAgcm93X3Nsb3RfdCAqICAgICAgICBnZXRSb3dTbG90KGludCByb3cpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMIGlmIEZhaWxlZCB0byBmaW5kIHJvd1Nsb3Qgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEludmFsaWQgcm93U2xvdAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbik7CisgICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3QoaW50IHJvdywgaW50IGNvbHVtbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZERpck9mZnNldCA9IGdldFJvd1Nsb3Qocm93KS0+b2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCkpICsgY29sdW1uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50OF90ICogbURhdGE7CisgICAgc2l6ZV90IG1TaXplOworICAgIHNpemVfdCBtTWF4U2l6ZTsKKyAgICB3aW5kb3dfaGVhZGVyX3QgKiBtSGVhZGVyOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisKKyAgICAvKioKKyAgICAgKiBPZmZzZXQgb2YgdGhlIGxvd2VzdCB1bnVzZWQgZGF0YSBieXRlIGluIHRoZSBhcnJheS4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBtRnJlZU9mZnNldDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAppbmRleCA5NjQ3MDBiLi5mN2IzYjQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaApAQCAtMjIsOCArMjIsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlOwotCiAvKgogICogQSBzZXQgb2YgYml0IG1hc2tzIGZvciBzcGVjaWZ5aW5nIGhvdyB0aGUgcmVjZWl2ZWQgcHJldmlldyBmcmFtZXMgYXJlCiAgKiBoYW5kbGVkIGJlZm9yZSB0aGUgcHJldmlld0NhbGxiYWNrKCkgY2FsbC4KQEAgLTg0LDYgKzgyLDE0IEBACiAgICAgQ0FNRVJBX0NNRF9TVEFSVF9TTU9PVEhfWk9PTSAgICAgPSAxLAogICAgIENBTUVSQV9DTURfU1RPUF9TTU9PVEhfWk9PTSAgICAgID0gMiwKICAgICBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OID0gMywKKworICAgIC8vIGNtZFR5cGUgdG8gZGlzYWJsZS9lbmFibGUgc2h1dHRlciBzb3VuZC4KKyAgICAvLyBJbiBzZW5kQ29tbWFuZCBwYXNzaW5nIGFyZzEgPSAwIHdpbGwgZGlzYWJsZSwKKyAgICAvLyB3aGlsZSBwYXNzaW5nIGFyZzEgPSAxIHdpbGwgZW5hYmxlIHRoZSBzaHV0dGVyIHNvdW5kLgorICAgIENBTUVSQV9DTURfRU5BQkxFX1NIVVRURVJfU09VTkQgPSA0LAorCisgICAgLy8gY21kVHlwZSB0byBwbGF5IHJlY29yZGluZyBzb3VuZC4KKyAgICBDQU1FUkFfQ01EX1BMQVlfUkVDT1JESU5HX1NPVU5EID0gNSwKIH07CiAKIC8vIGNhbWVyYSBmYXRhbCBlcnJvcnMKQEAgLTE1Miw5ICsxNTgsOCBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRTdGF0dXMoKSB7IHJldHVybiBtU3RhdHVzOyB9CiAKLSAgICAgICAgICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQorICAgICAgICAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CiAKICAgICAgICAgICAgIC8vIHN0YXJ0IHByZXZpZXcgbW9kZSwgbXVzdCBjYWxsIHNldFByZXZpZXdEaXNwbGF5IGZpcnN0CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydFByZXZpZXcoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCmluZGV4IDZhNjZlM2MuLjU2MWE0NmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApAQCAtMTgsOCArMTgsMTEgQEAKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkFfSEFSRFdBUkVfSU5URVJGQUNFX0gKIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8dWkvZWdsL2FuZHJvaWRfbmF0aXZlcy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHVpL2FuZHJvaWRfbmF0aXZlX2J1ZmZlci5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KIApAQCAtNDYsNiArNDksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7CiAKKyNpZmRlZiBVU0VfR1JBUEhJQ19WSURFT19CVUZGRVJTCisvKioKKyAqIFJlcGxhY2UgZGF0YV9jYWxsYmFja190aW1lc3RhbXAuIE9uY2Ugd2UgYXJlIGRvbmUsIHRoaXMKKyAqIHNob3VsZCBiZSByZW5hbWVkIGFzIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wLCBhbmQgdGhlIGV4aXN0aW5nCisgKiBkYXRhX2NhbGxiYWNrX3RpbWVzdGFtcCBzaG91bGQgYmUgZGVsZXRlZC4KKyAqLwordHlwZWRlZiB2b2lkICgqdmlkZW9idWZmZXJfY2FsbGJhY2tfdGltZXN0YW1wKShuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8YW5kcm9pZF9uYXRpdmVfYnVmZmVyX3Q+JiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7CisjZW5kaWYKIHR5cGVkZWYgdm9pZCAoKmRhdGFfY2FsbGJhY2tfdGltZXN0YW1wKShuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsCkBAIC04Niw4ICsxMDAsNDggQEAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5DYW1lcmFIYXJkd2FyZUludGVyZmFjZSgpIHsgfQogCi0gICAgLyoqIFJldHVybiB0aGUgSU1lbW9yeUhlYXAgZm9yIHRoZSBwcmV2aWV3IGltYWdlIGhlYXAgKi8KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiAgICAgICAgIGdldFByZXZpZXdIZWFwKCkgY29uc3QgPSAwOworI2lmZGVmIFVTRV9HUkFQSElDX1ZJREVPX0JVRkZFUlMKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIGV4aXN0aW5nIHNldENhbGxiYWNrcygpIG1ldGhvZC4gT25jZSB3ZSBhcmUgZG9uZSwgdGhlCisgICAgICogdmlkZW9idWZmZXJfY2FsbGJhY2tfdGltZXN0YW1wIHBhcmFtZXRlciB3aWxsIGJlIHJlbmFtZWQgdG8KKyAgICAgKiBkYXRhX2NhbGxiYWNrX3RpbWVzdGFtcCwgYnV0IGl0cyBzaWduYXR1cmUgd2lsbCBiZSB0aGUgc2FtZQorICAgICAqIGFzIHZpZGVvYnVmZmVyX2NhbGxiYWNrX3RpbWVzdGFtcCwgd2hpY2ggd2lsbCBiZSByZW5hbWVkCisgICAgICogdG8gZGF0YV9jYWxsYmFja190aW1lc3RhbXAgYW5kIHRoZSBleGl0aW5nIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wCisgICAgICogd2lsbCBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc2V0Q2FsbGJhY2tzKG5vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY2FsbGJhY2sgZGF0YV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9idWZmZXJfY2FsbGJhY2tfdGltZXN0YW1wIGRhdGFfY2JfdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpLiByZWxlYXNlUmVjb3JkaW5nRnJhbWUoKSBzaG91bGQgYmUKKyAgICAgKiBjaGFuZ2VkIHNvIHRoYXQgaXQgaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBvZiByZWxlYXNlVmlkZW9CdWZmZXIoKSwKKyAgICAgKiBvbmNlIHdlIGFyZSBkb25lLCBhbmQgcmVsZWFzZVZpZGVvQnVmZmVyKCkgd2lsbCBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZVZpZGVvQnVmZmVyKGNvbnN0IHNwPGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90PiYgYnVmKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN0YXJ0UmVjb3JkaW5nKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbkJ1ZmZlcnMgdGhlIHRvdGFsIG51bWJlciBvZiB2aWRlbyBidWZmZXJzIGFsbG9jYXRlZCBieSB0aGUgY2FtZXJhCisgICAgICogIGhhbAorICAgICAqIEBwYXJhbSBidWZmZXJzIGFuIGFycmF5IGFsbG9jYXRlZCBieSB0aGUgY2FtZXJhIGhhbCB0byBob2xkIHRoZSBwb2ludGVycworICAgICAqICB0byB0aGUgaW5kaXZpZHVhbCB2aWRlbyBidWZmZXJzLiBUaGUgdmlkZW8gYnVmZmVycyBhbmQgdGhlIGJ1ZmZlcnMgYXJyYXkKKyAgICAgKiAgc2hvdWxkIE5PVCBiZSBtb2RpZmllZC9yZWxlYXNlZCBieSBjYW1lcmEgaGFsIHVudGlsIHN0b3BSZWNvcmRpbmcoKSBpcworICAgICAqICBjYWxsZWQgYW5kIGFsbCBvdXRzdGFuZGluZyB2aWRlbyBidWZmZXJzIHByZXZpb3VzbHkgc2VudCBvdXQgdmlhCisgICAgICogIENBTUVSQV9NU0dfVklERU9fRlJBTUUgaGF2ZSBiZWVuIHJlbGVhc2VkIHZpYSByZWxlYXNlVmlkZW9CdWZmZXIoKS4KKyAgICAgKiAgQ2FtZXJhIGhhbCBjbGllbnQgbXVzdCBub3QgcmVsZWFzZSB0aGUgaW5kaXZpZHVhbCBidWZmZXJzIGFuZCB0aGUgYnVmZmVycworICAgICAqICBhcnJheS4KKyAgICAgKiBAcmV0dXJuIG5vIGVycm9yIGlmIE9LLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VmlkZW9CdWZmZXJJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90PioqIGJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpuQnVmZmVycykgPSAwOworI2VuZGlmCisKKyAgICAvKiogU2V0IHRoZSBBTmF0aXZlV2luZG93IHRvIHdoaWNoIHByZXZpZXcgZnJhbWVzIGFyZSBzZW50ICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpID0gMDsKIAogICAgIC8qKiBSZXR1cm4gdGhlIElNZW1vcnlIZWFwIGZvciB0aGUgcmF3IGltYWdlIGhlYXAgKi8KICAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiAgICAgICAgIGdldFJhd0hlYXAoKSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKaW5kZXggNTMwMzlhMC4uNjAwMzFhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaApAQCAtNTksNiArNTksMjcgQEAKICAgICB2b2lkIHNldFByZXZpZXdTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgdm9pZCBnZXRQcmV2aWV3U2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3Q7CiAgICAgdm9pZCBnZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3Q7CisKKyAgICAvLyBTZXQgdGhlIGRpbWVuc2lvbnMgaW4gcGl4ZWxzIHRvIHRoZSBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0CisgICAgLy8gZm9yIHZpZGVvIGZyYW1lcy4gVGhlIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBvbmUKKyAgICAvLyBvZiB0aGUgc3VwcG9ydGVkIGRpbWVuc2lvbnMgcmV0dXJuZWQgZnJvbQorICAgIC8vIGdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKS4gTXVzdCBub3QgYmUgY2FsbGVkIGlmCisgICAgLy8gZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygpIHJldHVybnMgYW4gZW1wdHkgVmVjdG9yIG9mIFNpemUuCisgICAgdm9pZCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCBkaW1lbnNpb25zICh3aWR0aCBhbmQgaGVpZ2h0KQorICAgIC8vIGluIHBpeGVscyBmb3IgdmlkZW8gZnJhbWVzLCB3aGljaCBtdXN0IGJlIG9uZSBvZiB0aGUKKyAgICAvLyBzdXBwb3J0ZWQgZGltZW5zaW9ucyByZXR1cm5lZCBmcm9tIGdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKS4KKyAgICAvLyBNdXN0IG5vdCBiZSBjYWxsZWQgaWYgZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygpIHJldHVybnMgYW4KKyAgICAvLyBlbXB0eSBWZWN0b3Igb2YgU2l6ZS4KKyAgICB2b2lkIGdldFZpZGVvU2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3Q7CisgICAgLy8gUmV0cmlldmUgYSBWZWN0b3Igb2Ygc3VwcG9ydGVkIGRpbWVuc2lvbnMgKHdpZHRoIGFuZCBoZWlnaHQpCisgICAgLy8gaW4gcGl4ZWxzIGZvciB2aWRlbyBmcmFtZXMuIElmIHNpemVzIHJldHVybmVkIGZyb20gdGhlIG1ldGhvZAorICAgIC8vIGlzIGVtcHR5LCB0aGUgY2FtZXJhIGRvZXMgbm90IHN1cHBvcnQgY2FsbHMgdG8gc2V0VmlkZW9TaXplKCkKKyAgICAvLyBvciBnZXRWaWRlb1NpemUoKS4gSW4gYWRkZGl0aW9uLCBpdCBhbHNvIGluZGljYXRlcyB0aGF0CisgICAgLy8gdGhlIGNhbWVyYSBvbmx5IGhhcyBhIHNpbmdsZSBvdXRwdXQsIGFuZCBkb2VzIG5vdCBoYXZlCisgICAgLy8gc2VwYXJhdGUgb3V0cHV0IGZvciB2aWRlbyBmcmFtZXMgYW5kIHByZXZpZXcgZnJhbWUuCisgICAgdm9pZCBnZXRTdXBwb3J0ZWRWaWRlb1NpemVzKFZlY3RvcjxTaXplPiAmc2l6ZXMpIGNvbnN0OworCiAgICAgdm9pZCBzZXRQcmV2aWV3RnJhbWVSYXRlKGludCBmcHMpOwogICAgIGludCBnZXRQcmV2aWV3RnJhbWVSYXRlKCkgY29uc3Q7CiAgICAgdm9pZCBnZXRQcmV2aWV3RnBzUmFuZ2UoaW50ICptaW5fZnBzLCBpbnQgKm1heF9mcHMpIGNvbnN0OwpAQCAtMjgxLDYgKzMwMiwxNiBAQAogICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIwLjk1LDEuOSxJbmZpbml0eSIgb3IgIjAuMDQ5LDAuMDUsMC4wNTEiLiBSZWFkIG9ubHkuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0ZPQ1VTX0RJU1RBTkNFU1tdOwogCisgICAgLy8gVGhlIGN1cnJlbnQgZGltZW5zaW9ucyBpbiBwaXhlbHMgKHdpZHRoIHggaGVpZ2h0KSBmb3IgdmlkZW8gZnJhbWVzLgorICAgIC8vIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgb25lIG9mIHRoZSBzdXBwb3J0ZWQgc2l6ZXMgcmV0cmlldmVkCisgICAgLy8gdmlhIEtFWV9TVVBQT1JURURfVklERU9fU0laRVMuCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjEyODB4NzIwIi4gUmVhZC93cml0ZS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfVklERU9fU0laRVtdOworICAgIC8vIEEgbGlzdCBvZiB0aGUgc3VwcG9ydGVkIGRpbWVuc2lvbnMgaW4gcGl4ZWxzICh3aWR0aCB4IGhlaWdodCkKKyAgICAvLyBmb3IgdmlkZW8gZnJhbWVzLiBTZWUgQ0FNRVJBX01TR19WSURFT19GUkFNRSBmb3IgZGV0YWlscyBpbgorICAgIC8vIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaC4KKyAgICAvLyBFeGFtcGxlOiAiMTc2eDE0NCwxMjgweDcyMCIuIFJlYWQgb25seS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX1ZJREVPX1NJWkVTW107CiAgICAgLy8gVGhlIGltYWdlIGZvcm1hdCBmb3IgdmlkZW8gZnJhbWVzLiBTZWUgQ0FNRVJBX01TR19WSURFT19GUkFNRSBpbgogICAgIC8vIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaC4KICAgICAvLyBFeGFtcGxlIHZhbHVlOiAieXV2NDIwc3AiIG9yIFBJWEVMX0ZPUk1BVF9YWFggY29uc3RhbnRzLiBSZWFkIG9ubHkuCkBAIC0zNTQsNyArMzg1LDEwIEBACiAgICAgLy8gZm9yIGJhcmNvZGUgcmVhZGluZy4KICAgICBzdGF0aWMgY29uc3QgY2hhciBTQ0VORV9NT0RFX0JBUkNPREVbXTsKIAotICAgIC8vIEZvcm1hdHMgZm9yIHNldFByZXZpZXdGb3JtYXQgYW5kIHNldFBpY3R1cmVGb3JtYXQuCisgICAgLy8gUGl4ZWwgY29sb3IgZm9ybWF0cyBmb3IgS0VZX1BSRVZJRVdfRk9STUFULCBLRVlfUElDVFVSRV9GT1JNQVQsCisgICAgLy8gYW5kIEtFWV9WSURFT19GUkFNRV9GT1JNQVQKKyAgICAvLyBQbGFuYXIgdmFyaWFudCBvZiB0aGUgWVVWNDIwIGNvbG9yIGZvcm1hdAorICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9ZVVY0MjBQW107CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lVVjQyMlNQW107CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lVVjQyMFNQW107IC8vIE5WMjEKICAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfWVVWNDIySVtdOyAvLyBZVVkyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmgKaW5kZXggNmZjZjllNS4uOGJjZWVhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmEuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CkBAIC00NSw4ICs0NSw4IEBACiAgICAgLy8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzIHRvIHVzZSB0aGlzIElDYW1lcmEgaW50ZXJmYWNlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdW5sb2NrKCkgPSAwOwogCi0gICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogCiAgICAgLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KICAgICAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggYWY5YTdlZC4uYTFjZTExMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC0yNSw2ICsyNSw3IEBACiAKIGNsYXNzIFBhcmNlbDsKIGNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIAogY2xhc3MgSU1lZGlhUGxheWVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtMzMsNyArMzQsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdG9wKCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDU0YWRjYTguLjI4YmU3YzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiBjbGFzcyBJQ2FtZXJhOwogY2xhc3MgSU1lZGlhUmVjb3JkZXJDbGllbnQ7CiAKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIpOwogCiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvU291cmNlKGludCB2cykgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldEF1ZGlvU291cmNlKGludCBhcykgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZvcm1hdChpbnQgb2YpID0gMDsKQEAgLTQwLDYgKzQwLDcgQEAKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRBdWRpb0VuY29kZXIoaW50IGFlKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCkgPSAwOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSA9IDA7CkBAIC02OCw0ICs2OSwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9JTUVESUFSRUNPUkRFUl9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggMmY2MWNiZS4uMWY4Y2U3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9JT01YX0hfCiAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCkBAIC03OCwxMCArNzksMTcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOREVYVFlQRSBpbmRleCwKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKSA9IDA7CisKICAgICAvLyBUaGlzIEFQSSBjbGVhcmx5IG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlIGNhbGxlciBsaXZlcyBpbiB0aGUKICAgICAvLyBzYW1lIHByb2Nlc3MgYXMgdGhlIGNhbGxlZSwgaS5lLiBpcyB0aGUgbWVkaWFfc2VydmVyLCBhcyB0aGUKICAgICAvLyByZXR1cm5lZCAiYnVmZmVyX2RhdGEiIHBvaW50ZXIgaXMganVzdCB0aGF0LCBhIHBvaW50ZXIgaW50byBsb2NhbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDM2NjI5ODMuLjEzYzczYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAogY2xhc3MgUGFyY2VsOwogY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTb3J0ZWRWZWN0b3I7CiAKQEAgLTEwNCw3ICsxMDUsOCBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlQXN5bmMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggYzNjZDM2MS4uYWE5Nzg3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTI1LDcgKzI1LDIwIEBACiAKIGVudW0gY2FtY29yZGVyX3F1YWxpdHkgewogICAgIENBTUNPUkRFUl9RVUFMSVRZX0xPVyAgPSAwLAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0ggPSAxCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSCA9IDEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfUUNJRiA9IDIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfQ0lGID0gMywKKyAgICBDQU1DT1JERVJfUVVBTElUWV80ODBQID0gNCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV83MjBQID0gNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV8xMDgwUCA9IDYsCisKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPVyAgPSAxMDAwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfSElHSCA9IDEwMDEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RQ0lGID0gMTAwMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0NJRiA9IDEwMDMsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV80ODBQID0gMTAwNCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzcyMFAgPSAxMDA1LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAgPSAxMDA2CiB9OwogCiBlbnVtIHZpZGVvX2RlY29kZXIgewpAQCAtNjgsNiArODEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGEgcHJvZmlsZSBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdCB0aGUgZ2l2ZW4gcXVhbGl0eSBleGlzdHMsCisgICAgICogb3IgZmFsc2UgaWYgbm90LgorICAgICAqLworICAgIGJvb2wgaGFzQ2FtY29yZGVyUHJvZmlsZShpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0cyBzdXBwb3J0ZWQuCiAgICAgICovCiAgICAgVmVjdG9yPG91dHB1dF9mb3JtYXQ+IGdldE91dHB1dEZpbGVGb3JtYXRzKCkgY29uc3Q7CkBAIC0yNTIsNiArMjcxLDggQEAKICAgICAgICAgVmVjdG9yPGludD4gbUxldmVsczsKICAgICB9OwogCisgICAgaW50IGdldENhbWNvcmRlclByb2ZpbGVJbmRleChpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OworCiAgICAgLy8gRGVidWcKICAgICBzdGF0aWMgdm9pZCBsb2dWaWRlb0NvZGVjKGNvbnN0IFZpZGVvQ29kZWMmIGNvZGVjKTsKICAgICBzdGF0aWMgdm9pZCBsb2dBdWRpb0NvZGVjKGNvbnN0IEF1ZGlvQ29kZWMmIGNvZGVjKTsKQEAgLTI4MSw4ICszMDIsMjUgQEAKIAogICAgIC8vIElmIHRoZSB4bWwgY29uZmlndXJhdGlvbiBmaWxlIGRvZXMgbm90IGV4aXN0LCB1c2UgaGFyZC1jb2RlZCB2YWx1ZXMKICAgICBzdGF0aWMgTWVkaWFQcm9maWxlcyogY3JlYXRlRGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJMb3dQcm9maWxlKCk7Ci0gICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJIaWdoUHJvZmlsZSgpOworCisgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJRY2lmUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KTsKKyAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSAqY3JlYXRlRGVmYXVsdENhbWNvcmRlckNpZlByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSk7CisgICAgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdENhbWNvcmRlckxvd1Byb2ZpbGVzKAorICAgICAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmxvd1Byb2ZpbGUsCisgICAgICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqbG93U3BlY2lmaWNQcm9maWxlKTsKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVEZWZhdWx0Q2FtY29yZGVySGlnaFByb2ZpbGVzKAorICAgICAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmhpZ2hQcm9maWxlLAorICAgICAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmhpZ2hTcGVjaWZpY1Byb2ZpbGUpOworCisgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VRY2lmUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KTsKKyAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSAqY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZTQ4MHBQcm9maWxlKGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpOworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VMb3dQcm9maWxlcygKKyAgICAgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipsb3dUaW1lTGFwc2VQcm9maWxlLAorICAgICAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmxvd1NwZWNpZmljVGltZUxhcHNlUHJvZmlsZSk7CisgICAgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZUhpZ2hQcm9maWxlcygKKyAgICAgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipoaWdoVGltZUxhcHNlUHJvZmlsZSwKKyAgICAgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipoaWdoU3BlY2lmaWNUaW1lTGFwc2VQcm9maWxlKTsKKwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJQcm9maWxlcyhNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7CiAgICAgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdFZpZGVvRW5jb2RlcnMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRBdWRpb0VuY29kZXJzKE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA1ZTllMzY4Li5jNDIzNDZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC0yMiw3ICsyMiw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogCiBzdHJ1Y3QgTWVkaWFSZWNvcmRlckJhc2UgewogICAgIE1lZGlhUmVjb3JkZXJCYXNlKCkge30KQEAgLTM3LDkgKzM3LDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSB7cmV0dXJuIElOVkFMSURfT1BFUkFUSU9OO30KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmgKaW5kZXggYzA5MWMzOS4uNGI0NGNjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1BWTWVkaWFSZWNvcmRlci5oCkBAIC0yMyw3ICsyMyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogY2xhc3MgSUNhbWVyYTsKIGNsYXNzIEF1dGhvckRyaXZlcldyYXBwZXI7CiAKQEAgLTQxLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CkBAIC02Niw0ICs2NiwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9QVk1FRElBUkVDT1JERVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmgKaW5kZXggZGY1MDk4MS4uNjU3ZTdhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVlBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvUFZQbGF5ZXIuaApAQCAtNDMsNyArNDMsOCBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCAyOTFiMThhLi5hNjAwZjZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtMTcwLDYgKzE3MCw3IEBACiAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9FbmNvZGVyKGludCBhZSk7CiAgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKTsKICAgICBzdGF0dXNfdCAgICBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICBzdGF0dXNfdCAgICBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCk7CiAgICAgc3RhdHVzX3QgICAgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgc3RhdHVzX3QgICAgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CkBAIC0xOTYsNiArMTk3LDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW9FbmNvZGVyU2V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNWaWRlb0VuY29kZXJTZXQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc091dHB1dEZpbGVTZXQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1eGlsaWFyeU91dHB1dEZpbGVTZXQ7CiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TG9jazsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaAppbmRleCAwZDM5N2FjLi43NGM5ZDVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKQEAgLTM4LDggKzM4LDcgQEAKIAogICAgIHR5cGVkZWYgYm9vbCAoKkV4Y2VwdGlvbkNoZWNrKSh2b2lkKiBlbnYpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnMsCi0gICAgICAgICAgICBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAogICAgICAgICAgICAgRXhjZXB0aW9uQ2hlY2sgZXhjZXB0aW9uQ2hlY2ssIHZvaWQgKmV4Y2VwdGlvbkVudik7CiAKICAgICB2b2lkIHNldExvY2FsZShjb25zdCBjaGFyICpsb2NhbGUpOwpAQCAtNTUsOSArNTQsOCBAQAogICAgIGNoYXIgKm1Mb2NhbGU7CiAKICAgICBzdGF0dXNfdCBkb1Byb2Nlc3NEaXJlY3RvcnkoCi0gICAgICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgY29uc3QgY2hhciAqZXh0ZW5zaW9ucywKLSAgICAgICAgICAgIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LCBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywKLSAgICAgICAgICAgIHZvaWQgKmV4Y2VwdGlvbkVudik7CisgICAgICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsCisgICAgICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KTsKIAogICAgIE1lZGlhU2Nhbm5lcihjb25zdCBNZWRpYVNjYW5uZXIgJik7CiAgICAgTWVkaWFTY2FubmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFTY2FubmVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggMzE5MmQwMy4uMzU5MmFlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0yMCwyNiArMjAsNzEgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSUNhbWVyYTsKIGNsYXNzIElNZW1vcnk7CiBjbGFzcyBDYW1lcmE7CitjbGFzcyBTdXJmYWNlOwogCiBjbGFzcyBDYW1lcmFTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgQ2FtZXJhU291cmNlIHVzaW5nIHRoZSBjdXJyZW50CisgICAgICogc2V0dGluZ3MgKHN1Y2ggYXMgdmlkZW8gc2l6ZSwgZnJhbWUgcmF0ZSwgY29sb3IgZm9ybWF0LCBldGMpCisgICAgICogZnJvbSB0aGUgZGVmYXVsdCBjYW1lcmEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5VTEwgb24gZXJyb3IuCisgICAgICovCiAgICAgc3RhdGljIENhbWVyYVNvdXJjZSAqQ3JlYXRlKCk7Ci0gICAgc3RhdGljIENhbWVyYVNvdXJjZSAqQ3JlYXRlRnJvbUNhbWVyYShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IENhbWVyYVNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYW1lcmEgdGhlIHZpZGVvIGlucHV0IGZyYW1lIGRhdGEgc291cmNlLiBJZiBpdCBpcyBOVUxMLAorICAgICAqICAgICAgICAgIHdlIHdpbGwgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGNhbWVyYSB3aXRoIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgIGNhbWVyYUlkLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbWVyYUlkIHRoZSBpZCBvZiB0aGUgY2FtZXJhIHRoYXQgdGhlIHNvdXJjZSB3aWxsIGNvbm5lY3QKKyAgICAgKiAgICAgICAgICB0byBpZiBjYW1lcmEgaXMgTlVMTDsgb3RoZXJ3aXNlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlkZW9TaXplIHRoZSBkaW1lbnNpb24gKGluIHBpeGVscykgb2YgdGhlIHZpZGVvIGZyYW1lCisgICAgICogQHBhcmFtIGZyYW1lUmF0ZSB0aGUgdGFyZ2V0IGZyYW1lcyBwZXIgc2Vjb25kCisgICAgICogQHBhcmFtIHN1cmZhY2UgdGhlIHByZXZpZXcgc3VyZmFjZSBmb3IgZGlzcGxheSB3aGVyZSBwcmV2aWV3CisgICAgICogICAgICAgICAgZnJhbWVzIGFyZSBzZW50IHRvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5VTEwgb24gZXJyb3IuCisgICAgICovCisgICAgc3RhdGljIENhbWVyYVNvdXJjZSAqQ3JlYXRlRnJvbUNhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiAmY2FtZXJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgdmlkZW9TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmFTb3VyY2UoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwogCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciBhIENhbWVyYVNvdXJjZSBvYmplY3QgaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisgICAgICogTXVzdCBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSBzdG9wKCkuCisgICAgICogQHJldHVybiBPSyBpZiBpbml0aWFsaXphdGlvbiBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgTWV0YURhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBDYW1lcmFTb3VyY2UsCisgICAgICogaW5jbHVkaW5nOgorICAgICAqIGtLZXlDb2xvckZvcm1hdDogWVVWIGNvbG9yIGZvcm1hdCBvZiB0aGUgdmlkZW8gZnJhbWVzCisgICAgICoga0tleVdpZHRoLCBrS2V5SGVpZ2h0OiBkaW1lbnNpb24gKGluIHBpeGVscykgb2YgdGhlIHZpZGVvIGZyYW1lcworICAgICAqIGtLZXlTYW1wbGVSYXRlOiBmcmFtZSByYXRlIGluIGZyYW1lcyBwZXIgc2Vjb25kCisgICAgICoga0tleU1JTUVUeXBlOiBhbHdheXMgZml4ZWQgdG8gYmUgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXCisgICAgICovCiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCkBAIC00NywxMiArOTIsNDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKIAorcHJvdGVjdGVkOgorICAgIGVudW0gQ2FtZXJhRmxhZ3MgeworICAgICAgICBGTEFHU19TRVRfQ0FNRVJBID0gMUwgPDwgMCwKKyAgICAgICAgRkxBR1NfSE9UX0NBTUVSQSA9IDFMIDw8IDEsCisgICAgfTsKKworICAgIGludDMyX3QgIG1DYW1lcmFGbGFnczsKKyAgICBTaXplICAgICBtVmlkZW9TaXplOworICAgIGludDMyX3QgIG1WaWRlb0ZyYW1lUmF0ZTsKKyAgICBpbnQzMl90ICBtQ29sb3JGb3JtYXQ7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIHNwPENhbWVyYT4gICBtQ2FtZXJhOworICAgIHNwPFN1cmZhY2U+ICBtU3VyZmFjZTsKKyAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisKKyAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNSZWNlaXZlZDsKKyAgICBpbnQ2NF90IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKKyAgICBib29sIG1TdGFydGVkOworCisgICAgQ2FtZXJhU291cmNlKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsIGludDMyX3QgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgIFNpemUgdmlkZW9TaXplLCBpbnQzMl90IGZyYW1lUmF0ZSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisgICAgdmlydHVhbCB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGZyYW1lLgorICAgIC8vIENhbGxlZCBmcm9tIGRhdGFDYWxsYmFja1RpbWVzdGFtcC4KKyAgICB2aXJ0dWFsIGJvb2wgc2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKSB7cmV0dXJuIGZhbHNlO30KKworICAgIC8vIENhbGxiYWNrIGNhbGxlZCB3aGVuIHN0aWxsIGNhbWVyYSByYXcgZGF0YSBpcyBhdmFpbGFibGUuCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNvdXJjZUxpc3RlbmVyOwogCi0gICAgc3A8Q2FtZXJhPiBtQ2FtZXJhOwotICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLQogICAgIE11dGV4IG1Mb2NrOwogICAgIENvbmRpdGlvbiBtRnJhbWVBdmFpbGFibGVDb25kaXRpb247CiAgICAgQ29uZGl0aW9uIG1GcmFtZUNvbXBsZXRlQ29uZGl0aW9uOwpAQCAtNjAsMjUgKzE0MSwzMSBAQAogICAgIExpc3Q8c3A8SU1lbW9yeT4gPiBtRnJhbWVzQmVpbmdFbmNvZGVkOwogICAgIExpc3Q8aW50NjRfdD4gbUZyYW1lVGltZXM7CiAKLSAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKICAgICBpbnQ2NF90IG1GaXJzdEZyYW1lVGltZVVzOwotICAgIGludDY0X3QgbUxhc3RGcmFtZVRpbWVzdGFtcFVzOwotICAgIGludDMyX3QgbU51bUZyYW1lc1JlY2VpdmVkOwogICAgIGludDMyX3QgbU51bUZyYW1lc0VuY29kZWQ7CiAgICAgaW50MzJfdCBtTnVtRnJhbWVzRHJvcHBlZDsKICAgICBpbnQzMl90IG1OdW1HbGl0Y2hlczsKICAgICBpbnQ2NF90IG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzOwogICAgIGJvb2wgbUNvbGxlY3RTdGF0czsKLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgQ2FtZXJhU291cmNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSk7Ci0KLSAgICB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgKLSAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOwogCiAgICAgdm9pZCByZWxlYXNlUXVldWVkRnJhbWVzKCk7CiAgICAgdm9pZCByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKTsKIAorCisgICAgc3RhdHVzX3QgaW5pdChjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLCBpbnQzMl90IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgIFNpemUgdmlkZW9TaXplLCBpbnQzMl90IGZyYW1lUmF0ZSk7CisgICAgc3RhdHVzX3QgaXNDYW1lcmFBdmFpbGFibGUoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwgaW50MzJfdCBjYW1lcmFJZCk7CisgICAgc3RhdHVzX3QgaXNDYW1lcmFDb2xvckZvcm1hdFN1cHBvcnRlZChjb25zdCBDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpOworICAgIHN0YXR1c190IGNvbmZpZ3VyZUNhbWVyYShDYW1lcmFQYXJhbWV0ZXJzKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSk7CisKKyAgICBzdGF0dXNfdCBjaGVja1ZpZGVvU2l6ZShjb25zdCBDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIHN0YXR1c190IGNoZWNrRnJhbWVSYXRlKGNvbnN0IENhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUpOworCiAgICAgQ2FtZXJhU291cmNlKGNvbnN0IENhbWVyYVNvdXJjZSAmKTsKICAgICBDYW1lcmFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBDYW1lcmFTb3VyY2UgJik7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlNzI4NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmgKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENBTUVSQV9TT1VSQ0VfVElNRV9MQVBTRV9IXworCisjZGVmaW5lIENBTUVSQV9TT1VSQ0VfVElNRV9MQVBTRV9IXworCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJQ2FtZXJhOworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIENhbWVyYTsKKworY2xhc3MgQ2FtZXJhU291cmNlVGltZUxhcHNlIDogcHVibGljIENhbWVyYVNvdXJjZSB7CitwdWJsaWM6CisgICAgc3RhdGljIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqQ3JlYXRlRnJvbUNhbWVyYSgKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwKKyAgICAgICAgU2l6ZSB2aWRlb1NpemUsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworCisgICAgdmlydHVhbCB+Q2FtZXJhU291cmNlVGltZUxhcHNlKCk7CisKKyAgICAvLyBJZiB0aGUgZnJhbWUgY2FwdHVyZSBpbnRlcnZhbCBpcyBsYXJnZSwgcmVhZCB3aWxsIGJsb2NrIGZvciBhIGxvbmcgdGltZS4KKyAgICAvLyBEdWUgdG8gdGhlIHdheSB0aGUgbWVkaWFSZWNvcmRlciBmcmFtZXdvcmsgd29ya3MsIGEgc3RvcCgpIGNhbGwgZnJvbQorICAgIC8vIG1lZGlhUmVjb3JkZXIgd2FpdHMgdW50aWwgdGhlIHJlYWQgcmV0dXJucywgY2F1c2luZyBhIGxvbmcgd2FpdCBmb3IKKyAgICAvLyBzdG9wKCkgdG8gcmV0dXJuLiBUbyBhdm9pZCB0aGlzLCB3ZSBjYW4gbWFrZSByZWFkKCkgcmV0dXJuIGEgY29weSBvZiB0aGUKKyAgICAvLyBsYXN0IHJlYWQgZnJhbWUgd2l0aCB0aGUgc2FtZSB0aW1lIHN0YW1wIGZyZXF1ZW50bHkuIFRoaXMga2VlcHMgdGhlCisgICAgLy8gcmVhZCgpIGNhbGwgZnJvbSBibG9ja2luZyB0b28gbG9uZy4gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHF1aWNrbHkKKyAgICAvLyBjYXB0dXJlcyBhbm90aGVyIGZyYW1lLCBrZWVwcyBpdHMgY29weSwgYW5kIGVuYWJsZXMgdGhpcyBtb2RlIG9mIHJlYWQoKQorICAgIC8vIHJldHVybmluZyBxdWlja2x5LgorICAgIHZvaWQgc3RhcnRRdWlja1JlYWRSZXR1cm5zKCk7CisKK3ByaXZhdGU6CisgICAgLy8gSWYgdHJ1ZSwgd2lsbCB1c2Ugc3RpbGwgY2FtZXJhIHRha2VQaWN0dXJlKCkgZm9yIHRpbWUgbGFwc2UgZnJhbWVzCisgICAgLy8gSWYgZmFsc2UsIHdpbGwgdXNlIHRoZSB2aWRlb2NhbWVyYSBmcmFtZXMgaW5zdGVhZC4KKyAgICBib29sIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZTsKKworICAgIC8vIFNpemUgb2YgcGljdHVyZSB0YWtlbiBmcm9tIHN0aWxsIGNhbWVyYS4gVGhpcyBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUKKyAgICAvLyBvZiB0aGUgdmlkZW8sIGFzIHN0aWxsIGNhbWVyYSBtYXkgbm90IHN1cHBvcnQgdGhlIGV4YWN0IHZpZGVvIHJlc29sdXRpb24KKyAgICAvLyBkZW1hbmRlZC4gU2VlIHNldFBpY3R1cmVTaXplVG9DbG9zZXN0U3VwcG9ydGVkKCkuCisgICAgaW50MzJfdCBtUGljdHVyZVdpZHRoOworICAgIGludDMyX3QgbVBpY3R1cmVIZWlnaHQ7CisKKyAgICAvLyBzaXplIG9mIHRoZSBlbmNvZGVkIHZpZGVvLgorICAgIGludDMyX3QgbVZpZGVvV2lkdGg7CisgICAgaW50MzJfdCBtVmlkZW9IZWlnaHQ7CisKKyAgICAvLyBUcnVlIGlmIHdlIG5lZWQgdG8gY3JvcCB0aGUgc3RpbGwgY2FtZXJhIGltYWdlIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCisgICAgYm9vbCBtTmVlZENyb3BwaW5nOworCisgICAgLy8gU3RhcnQgbG9jYXRpb24gb2YgdGhlIGNyb3BwaW5nIHJlY3RhbmdsZS4KKyAgICBpbnQzMl90IG1Dcm9wUmVjdFN0YXJ0WDsKKyAgICBpbnQzMl90IG1Dcm9wUmVjdFN0YXJ0WTsKKworICAgIC8vIFRpbWUgYmV0d2VlbiBjYXB0dXJlIG9mIHR3byBmcmFtZXMgZHVyaW5nIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgLy8gTmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGltZWxhcHNlIGlzIGRpc2FibGVkLgorICAgIGludDY0X3QgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXM7CisKKyAgICAvLyBUaW1lIGJldHdlZW4gdHdvIGZyYW1lcyBpbiBmaW5hbCB2aWRlbyAoMS9mcmFtZVJhdGUpCisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOworCisgICAgLy8gUmVhbCB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZW5jb2RlZCB0aW1lIGxhcHNlIGZyYW1lCisgICAgaW50NjRfdCBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzOworCisgICAgLy8gVGhyZWFkIGlkIG9mIHRocmVhZCB3aGljaCB0YWtlcyBzdGlsbCBwaWN0dXJlIGFuZCBzbGVlcHMgaW4gYSBsb29wLgorICAgIHB0aHJlYWRfdCBtVGhyZWFkVGltZUxhcHNlOworCisgICAgLy8gVmFyaWFibGUgc2V0IGluIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIHRvIGhlbHAgc2tpcEN1cnJlbnRGcmFtZSgpCisgICAgLy8gdG8ga25vdyBpZiBjdXJyZW50IGZyYW1lIG5lZWRzIHRvIGJlIHNraXBwZWQuCisgICAgYm9vbCBtU2tpcEN1cnJlbnRGcmFtZTsKKworICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBtQ2FtZXJhSWRsZQorICAgIE11dGV4IG1DYW1lcmFJZGxlTG9jazsKKworICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSB0byB3YWl0IG9uIGlmIGNhbWVyYSBpcyBpcyBub3QgeWV0IGlkbGUuIE9uY2UgdGhlCisgICAgLy8gY2FtZXJhIGdldHMgaWRsZSwgdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHNpZ25hbGxlZC4KKyAgICBDb25kaXRpb24gbUNhbWVyYUlkbGVDb25kaXRpb247CisKKyAgICAvLyBUcnVlIGlmIGNhbWVyYSBpcyBpbiBwcmV2aWV3IG1vZGUgYW5kIHJlYWR5IGZvciB0YWtlUGljdHVyZSgpLgorICAgIC8vIEZhbHNlIGFmdGVyIGEgY2FsbCB0byB0YWtlUGljdHVyZSgpIGJ1dCBiZWZvcmUgdGhlIGZpbmFsIGNvbXByZXNzZWQKKyAgICAvLyBkYXRhIGNhbGxiYWNrIGhhcyBiZWVuIGNhbGxlZCBhbmQgcHJldmlldyBoYXMgYmVlbiByZXN0YXJ0ZWQuCisgICAgdm9sYXRpbGUgYm9vbCBtQ2FtZXJhSWRsZTsKKworICAgIC8vIFRydWUgaWYgc3RvcCgpIGlzIHdhaXRpbmcgZm9yIGNhbWVyYSB0byBnZXQgaWRsZSwgaS5lLiBmb3IgdGhlIGxhc3QKKyAgICAvLyB0YWtlUGljdHVyZSgpIHRvIGNvbXBsZXRlLiBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpCisgICAgLy8gY2FuIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICB2b2xhdGlsZSBib29sIG1TdG9wV2FpdGluZ0ZvcklkbGVDYW1lcmE7CisKKyAgICAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgcXVpY2sgc3RvcCB2YXJpYWJsZXMuCisgICAgTXV0ZXggbVF1aWNrU3RvcExvY2s7CisKKyAgICAvLyBDb25kaXRpb24gdmFyaWFibGUgdG8gd2FrZSB1cCBzdGlsbCBwaWN0dXJlIHRocmVhZC4KKyAgICBDb25kaXRpb24gbVRha2VQaWN0dXJlQ29uZGl0aW9uOworCisgICAgLy8gbVF1aWNrU3RvcCBpcyBzZXQgdG8gdHJ1ZSBpZiB3ZSB1c2UgcXVpY2sgcmVhZCgpIHJldHVybnMsIG90aGVyd2lzZSBpdCBpcyBzZXQKKyAgICAvLyB0byBmYWxzZS4gT25jZSBpbiB0aGlzIG1vZGUgcmVhZCgpIHJldHVybiBhIGNvcHkgb2YgdGhlIGxhc3QgcmVhZCBmcmFtZQorICAgIC8vIHdpdGggdGhlIHNhbWUgdGltZSBzdGFtcC4gU2VlIHN0YXJ0UXVpY2tSZWFkUmV0dXJucygpLgorICAgIHZvbGF0aWxlIGJvb2wgbVF1aWNrU3RvcDsKKworICAgIC8vIEZvcmNlcyB0aGUgbmV4dCBmcmFtZSBwYXNzZWQgdG8gZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgdG8gYmUgcmVhZAorICAgIC8vIGFzIGEgdGltZSBsYXBzZSBmcmFtZS4gVXNlZCBieSBzdGFydFF1aWNrUmVhZFJldHVybnMoKSBzbyB0aGF0IHRoZSBuZXh0CisgICAgLy8gZnJhbWUgd2FrZXMgdXAgYW55IGJsb2NraW5nIHJlYWQuCisgICAgdm9sYXRpbGUgYm9vbCBtRm9yY2VSZWFkOworCisgICAgLy8gU3RvcmVzIGEgY29weSBvZiB0aGUgTWVkaWFCdWZmZXIgcmVhZCBpbiB0aGUgbGFzdCByZWFkKCkgY2FsbCBhZnRlcgorICAgIC8vIG1RdWlja1N0b3Agd2FzIHRydWUuCisgICAgTWVkaWFCdWZmZXIqIG1MYXN0UmVhZEJ1ZmZlckNvcHk7CisKKyAgICAvLyBTdGF0dXMgY29kZSBmb3IgbGFzdCByZWFkLgorICAgIHN0YXR1c190IG1MYXN0UmVhZFN0YXR1czsKKworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSgKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwKKyAgICAgICAgU2l6ZSB2aWRlb1NpemUsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworCisgICAgLy8gV3JhcHBlciBvdmVyIENhbWVyYVNvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoKSB0byBpbXBsZW1lbnQgcXVpY2sgc3RvcC4KKyAgICAvLyBJdCBvbmx5IGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBtTGFzdFJlYWRCdWZmZXJDb3B5IGlzIHNpZ25hbGxlZC4gT3RoZXJ3aXNlCisgICAgLy8gaXQgY2FsbHMgdGhlIGJhc2UgY2xhc3MnIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKKworICAgIC8vIFdyYXBwZXIgb3ZlciBDYW1lcmFTb3VyY2U6OnJlYWQoKSB0byBpbXBsZW1lbnQgcXVpY2sgc3RvcC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICAvLyBGb3Igc3RpbGwgY2FtZXJhIGNhc2Ugc3RhcnRzIGEgdGhyZWFkIHdoaWNoIGNhbGxzIGNhbWVyYSdzIHRha2VQaWN0dXJlKCkKKyAgICAvLyBpbiBhIGxvb3AuIEZvciB2aWRlbyBjYW1lcmEgY2FzZSwganVzdCBzdGFydHMgdGhlIGNhbWVyYSdzIHZpZGVvIHJlY29yZGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKKworICAgIC8vIEZvciBzdGlsbCBjYW1lcmEgY2FzZSBqb2lucyB0aGUgdGhyZWFkIGNyZWF0ZWQgaW4gc3RhcnRDYW1lcmFSZWNvcmRpbmcoKS4KKyAgICAvLyBGb3IgdmlkZW8gY2FtZXJhIGNhc2UsIGp1c3Qgc3RvcHMgdGhlIGNhbWVyYSdzIHZpZGVvIHJlY29yZGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgc3RvcENhbWVyYVJlY29yZGluZygpOworCisgICAgLy8gRm9yIHN0aWxsIGNhbWVyYSBjYXNlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbWVtb3J5IGlzIGxvY2FsbHkKKyAgICAvLyBhbGxvY2F0ZWQgd2l0aCByZWZjb3VudGluZy4KKyAgICAvLyBGb3IgdmlkZW8gY2FtZXJhIGNhc2UganVzdCB0ZWxsIHRoZSBjYW1lcmEgdG8gcmVsZWFzZSB0aGUgZnJhbWUuCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpOworCisgICAgLy8gbVNraXBDdXJyZW50RnJhbWUgaXMgc2V0IHRvIHRydWUgaW4gZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgaWYgdGhlIGN1cnJlbnQKKyAgICAvLyBmcmFtZSBuZWVkcyB0byBiZSBza2lwcGVkIGFuZCB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyB0aGUgdmFsdWUgb2YgbVNraXBDdXJyZW50RnJhbWUuCisgICAgdmlydHVhbCBib29sIHNraXBDdXJyZW50RnJhbWUoaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICAvLyBIYW5kbGVzIHRoZSBjYWxsYmFjayB0byBoYW5kbGUgcmF3IGZyYW1lIGRhdGEgZnJvbSB0aGUgc3RpbGwgY2FtZXJhLgorICAgIC8vIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBmcmFtZSBkYXRhIGFzIHRoZSBjYW1lcmEgY2FuIHJldXNlIHRoZSBmcmFtZSBtZW1vcnkKKyAgICAvLyBvbmNlIHRoaXMgY2FsbGJhY2sgcmV0dXJucy4gVGhlIGZ1bmN0aW9uIGFsc28gc2V0cyBhIG5ldyB0aW1zdGFtcCBjb3JyZXNwb25kaW5nCisgICAgLy8gdG8gb25lIGZyYW1lIHRpbWUgYWhlYWQgb2YgdGhlIGxhc3QgZW5jb2RlZCBmcmFtZSdzIHRpbWUgc3RhbXAuIEl0IHRoZW4KKyAgICAvLyBjYWxscyBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSBvZiB0aGUgYmFzZSBjbGFzcyB3aXRoIHRoZSBjb3BpZWQgZGF0YSBhbmQgdGhlCisgICAgLy8gbW9kaWZpZWQgdGltZXN0YW1wLCB3aGljaCB3aWxsIHRoaW5rIHRoYXQgaXQgcmVjaWV2ZWQgdGhlIGZyYW1lIGZyb20gYSB2aWRlbworICAgIC8vIGNhbWVyYSBhbmQgcHJvY2VlZCBhcyB1c3VhbC4KKyAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOworCisgICAgLy8gSW4gdGhlIHZpZGVvIGNhbWVyYSBjYXNlIGNhbGxzIHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgpIHRvIG1vZGlmeQorICAgIC8vIHRpbWVzdGFtcCBhbmQgc2V0IG1Ta2lwQ3VycmVudEZyYW1lLgorICAgIC8vIFRoZW4gaXQgY2FsbHMgdGhlIGJhc2UgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKQorICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOworCisgICAgLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZmlsbCBtTGFzdFJlYWRCdWZmZXJDb3B5IGZyb20gdGhlIGp1c3QgcmVhZAorICAgIC8vIGJ1ZmZlci4KKyAgICB2b2lkIGZpbGxMYXN0UmVhZEJ1ZmZlckNvcHkoTWVkaWFCdWZmZXImIHNvdXJjZUJ1ZmZlcik7CisKKyAgICAvLyBJZiB0aGUgcGFzc2VkIGluIHNpemUgKHdpZHRoIHggaGVpZ2h0KSBpcyBhIHN1cHBvcnRlZCBwcmV2aWV3IHNpemUsCisgICAgLy8gdGhlIGZ1bmN0aW9uIHNldHMgdGhlIGNhbWVyYSdzIHByZXZpZXcgc2l6ZSB0byBpdCBhbmQgcmV0dXJucyB0cnVlLgorICAgIC8vIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgdHJ5U2V0dGluZ1ByZXZpZXdTaXplKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIC8vIFRoZSBzdGlsbCBjYW1lcmEgbWF5IG5vdCBzdXBwb3J0IHRoZSBkZW1hbmRlZCB2aWRlbyB3aWR0aCBhbmQgaGVpZ2h0LgorICAgIC8vIFdlIGxvb2sgZm9yIHRoZSBzdXBwb3J0ZWQgcGljdHVyZSBzaXplcyBmcm9tIHRoZSBzdGlsbCBjYW1lcmEgYW5kCisgICAgLy8gY2hvb3NlIHRoZSBzbWFsbGVzdCBvbmUgd2l0aCBlaXRoZXIgZGltZW5zaW9ucyBoaWdoZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZworICAgIC8vIHZpZGVvIGRpbWVuc2lvbnMuIFRoZSBzdGlsbCBwaWN0dXJlIHdpbGwgYmUgY3JvcHBlZCB0byBnZXQgdGhlIHZpZGVvIGZyYW1lLgorICAgIC8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGNhbWVyYSBzdXBwb3J0cyBwaWN0dXJlIHNpemVzIGdyZWF0ZXIgdGhhbgorICAgIC8vIG9yIGVxdWFsIHRvIHRoZSBwYXNzZWQgaW4gd2lkdGggYW5kIGhlaWdodCwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHNldFBpY3R1cmVTaXplVG9DbG9zZXN0U3VwcG9ydGVkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIC8vIENvbXB1dGVzIHRoZSBvZmZzZXQgb2YgdGhlIHJlY3RhbmdsZSBmcm9tIHdoZXJlIHRvIHN0YXJ0IGNyb3BwaW5nIHRoZQorICAgIC8vIHN0aWxsIGltYWdlIGludG8gdGhlIHZpZGVvIGZyYW1lLiBXZSBjaG9vc2UgdGhlIGNlbnRlciBvZiB0aGUgaW1hZ2UgdG8gYmUKKyAgICAvLyBjcm9wcGVkLiBUaGUgb2Zmc2V0IGlzIHN0b3JlZCBpbiAobUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFkpLgorICAgIGJvb2wgY29tcHV0ZUNyb3BSZWN0YW5nbGVPZmZzZXQoKTsKKworICAgIC8vIENyb3BzIHRoZSBzb3VyY2UgZGF0YSBpbnRvIGEgc21hbGxlciBpbWFnZSBzdGFydGluZyBhdAorICAgIC8vIChtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSkgYW5kIG9mIHRoZSBzaXplIG9mIHRoZSB2aWRlbyBmcmFtZS4KKyAgICAvLyBUaGUgZGF0YSBpcyByZXR1cm5lZCBpbnRvIGEgbmV3bHkgYWxsb2NhdGVkIElNZW1vcnkuCisgICAgc3A8SU1lbW9yeT4gY3JvcFlVVkltYWdlKGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2VfZGF0YSk7CisKKyAgICAvLyBXaGVuIHZpZGVvIGNhbWVyYSBpcyB1c2VkIGZvciB0aW1lIGxhcHNlIGNhcHR1cmUsIHJldHVybnMgdHJ1ZQorICAgIC8vIHVudGlsIGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgZm9yIHRoZSBuZXh0IHRpbWUgbGFwc2UgZnJhbWUuIFdoZW4KKyAgICAvLyB0aGUgZnJhbWUgbmVlZHMgdG8gYmUgZW5jb2RlZCwgaXQgcmV0dXJucyBmYWxzZSBhbmQgYWxzbyBtb2RpZmllcworICAgIC8vIHRoZSB0aW1lIHN0YW1wIHRvIGJlIG9uZSBmcmFtZSB0aW1lIGFoZWFkIG9mIHRoZSBsYXN0IGVuY29kZWQKKyAgICAvLyBmcmFtZSdzIHRpbWUgc3RhbXAuCisgICAgYm9vbCBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgLy8gV3JhcHBlciB0byBlbnRlciB0aHJlYWRUaW1lTGFwc2VFbnRyeSgpCisgICAgc3RhdGljIHZvaWQgKlRocmVhZFRpbWVMYXBzZVdyYXBwZXIodm9pZCAqbWUpOworCisgICAgLy8gUnVucyBhIGxvb3Agd2hpY2ggc2xlZXBzIHVudGlsIGEgc3RpbGwgcGljdHVyZSBpcyByZXF1aXJlZAorICAgIC8vIGFuZCB0aGVuIGNhbGxzIG1DYW1lcmEtPnRha2VQaWN0dXJlKCkgdG8gdGFrZSB0aGUgc3RpbGwgcGljdHVyZS4KKyAgICAvLyBVc2VkIG9ubHkgaW4gdGhlIGNhc2UgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlID0gdHJ1ZS4KKyAgICB2b2lkIHRocmVhZFRpbWVMYXBzZUVudHJ5KCk7CisKKyAgICAvLyBXcmFwcGVyIHRvIGVudGVyIHRocmVhZFN0YXJ0UHJldmlldygpCisgICAgc3RhdGljIHZvaWQgKlRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIodm9pZCAqbWUpOworCisgICAgLy8gU3RhcnRzIHRoZSBjYW1lcmEncyBwcmV2aWV3LgorICAgIHZvaWQgdGhyZWFkU3RhcnRQcmV2aWV3KCk7CisKKyAgICAvLyBTdGFydHMgdGhyZWFkIFRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIoKSBmb3IgcmVzdGFydGluZyBwcmV2aWV3LgorICAgIC8vIE5lZWRzIHRvIGJlIGRvbmUgaW4gYSB0aHJlYWQgc28gdGhhdCBkYXRhQ2FsbGJhY2soKSB3aGljaCBjYWxscyB0aGlzIGZ1bmN0aW9uCisgICAgLy8gY2FuIHJldHVybiwgYW5kIHRoZSBjYW1lcmEgY2FuIGtub3cgdGhhdCB0YWtlUGljdHVyZSgpIGlzIGRvbmUuCisgICAgdm9pZCByZXN0YXJ0UHJldmlldygpOworCisgICAgLy8gQ3JlYXRlcyBhIGNvcHkgb2Ygc291cmNlX2RhdGEgaW50byBhIG5ldyBtZW1vcnkgb2YgZmluYWwgdHlwZSBNZW1vcnlCYXNlLgorICAgIHNwPElNZW1vcnk+IGNyZWF0ZUlNZW1vcnlDb3B5KGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2VfZGF0YSk7CisKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY29uc3QgQ2FtZXJhU291cmNlVGltZUxhcHNlICYpOworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAmb3BlcmF0b3I9KGNvbnN0IENhbWVyYVNvdXJjZVRpbWVMYXBzZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0FNRVJBX1NPVVJDRV9USU1FX0xBUFNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmgKaW5kZXggMjIxYzY3OS4uNGRlZDVlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaApAQCAtMjEsMTAgKzIxLDYwIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YUGx1Z2luQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvUmVuZGVyZXIuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHVpL2FuZHJvaWRfbmF0aXZlX2J1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIHRoZSBPTVhfU2V0UGFyYW1ldGVyIHdoZW4gdGhlIGV4dGVuc2lvbgorLy8gaW5kZXggZm9yIHRoZSAnT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzJyBleHRlbnNpb24KKy8vIGlzIGdpdmVuLgorLy8KKy8vIFdoZW4gQW5kcm9pZCBuYXRpdmUgYnVmZmVyIHVzZSBpcyBkaXNhYmxlZCBmb3IgYSBwb3J0ICh0aGUgZGVmYXVsdCBzdGF0ZSksCisvLyB0aGUgT01YIG5vZGUgc2hvdWxkIG9wZXJhdGUgYXMgbm9ybWFsLCBhbmQgZXhwZWN0IFVzZUJ1ZmZlciBjYWxscyB0byBzZXQgaXRzCisvLyBidWZmZXJzLiAgVGhpcyBpcyB0aGUgbW9kZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIENQVSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlciBpcworLy8gcmVxdWlyZWQuCisvLworLy8gV2hlbiBBbmRyb2lkIG5hdGl2ZSBidWZmZXIgdXNlIGhhcyBiZWVuIGVuYWJsZWQsIHRoZSBPTVggbm9kZSBtdXN0IHN1cHBvcnQKKy8vIG9ubHkgY29sb3IgZm9ybWF0cyBpbiB0aGUgcmFuZ2UgW09NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZVN0YXJ0LAorLy8gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlRW5kKS4gIFRoZSBub2RlIHNob3VsZCB0aGVuIGV4cGVjdCB0byByZWNlaXZlCisvLyBVc2VBbmRyb2lkTmF0aXZlQnVmZmVyIGNhbGxzICh2aWEgT01YX1NldFBhcmFtZXRlcikgcmF0aGVyIHRoYW4gVXNlQnVmZmVyCisvLyBjYWxscy4KK3N0cnVjdCBFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyc1BhcmFtcyB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGVuYWJsZTsKK307CisKKy8vIENvbG9yIGZvcm1hdHMgaW4gdGhlIHJhbmdlIFtPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZFByaXZhdGVTdGFydCwKKy8vIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZUVuZCkgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBncmFsbG9jIHBpeGVsCisvLyBmb3JtYXQgd2hlbiB1c2VkIHRvIGFsbG9jYXRlIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlcnMgdmlhIGdyYWxsb2MuICBUaGUKKy8vIGNvbnZlcnNpb24gaXMgZG9uZSBieSBzdWJ0cmFjdGluZyBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZFByaXZhdGVTdGFydCBmcm9tCisvLyB0aGUgY29sb3IgZm9ybWF0IHJlcG9ydGVkIGJ5IHRoZSBjb2RlYy4KK2VudW0geworICAgIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZVN0YXJ0ID0gMHhBMDAwMDAwMCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZFByaXZhdGVFbmQgPSAweEIwMDAwMDAwLAorfTsKKworLy8gQSBwb2ludGVyIHRvIHRoaXMgc3RydWN0IGlzIHBhc3NlZCB0byBPTVhfU2V0UGFyYW1ldGVyIHdoZW4gdGhlIGV4dGVuc2lvbgorLy8gaW5kZXggZm9yIHRoZSAnT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnVzZUFuZHJvaWROYXRpdmVCdWZmZXInIGV4dGVuc2lvbiBpcworLy8gZ2l2ZW4uICBUaGlzIGNhbGwgd2lsbCBvbmx5IGJlIHBlcmZvcm1lZCBpZiBhIHByaW9yIGNhbGwgd2FzIG1hZGUgd2l0aCB0aGUKKy8vICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMnIGV4dGVuc2lvbiBpbmRleCwKKy8vIGVuYWJsaW5nIHVzZSBvZiBBbmRyb2lkIG5hdGl2ZSBidWZmZXJzLgorc3RydWN0IFVzZUFuZHJvaWROYXRpdmVCdWZmZXJQYXJhbXMgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUFRSIHBBcHBQcml2YXRlOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVySGVhZGVyOworICAgIGNvbnN0IHNwPGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90PiYgbmF0aXZlQnVmZmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwogZXh0ZXJuIGFuZHJvaWQ6OlZpZGVvUmVuZGVyZXIgKmNyZWF0ZVJlbmRlcmVyKAogICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJU3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCkBAIC0zNSw0ICs4NSwzIEBACiBleHRlcm4gYW5kcm9pZDo6T01YUGx1Z2luQmFzZSAqY3JlYXRlT01YUGx1Z2luKCk7CiAKICNlbmRpZiAgLy8gSEFSRFdBUkVfQVBJX0hfCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2VTcGxpdHRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4ZjRjMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2VTcGxpdHRlci5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdheSB0byBzcGxpdCBhIHNpbmdsZSBtZWRpYSBzb3VyY2UgaW50byBtdWx0aXBsZSBzb3VyY2VzLgorLy8gVGhlIGNvbnN0cnVjdG9yIHRha2VzIGluIHRoZSByZWFsIG1lZGlhU291cmNlIGFuZCBjcmVhdGVDbGllbnQoKSBjYW4gdGhlbiBiZQorLy8gdXNlZCB0byBjcmVhdGUgbXVsdGlwbGUgc291cmNlcyBzZXJ2ZWQgZnJvbSB0aGlzIHJlYWwgbWVkaWFTb3VyY2UuCisvLworLy8gVXNhZ2U6CisvLyAtIENyZWF0ZSBNZWRpYVNvdXJjZVNwbGl0dGVyIGJ5IHBhc3NpbmcgaW4gYSByZWFsIG1lZGlhU291cmNlIGZyb20gd2hpY2gKKy8vIG11bHRpcGxlIGR1cGxpY2F0ZSBjaGFubmVscyBhcmUgbmVlZGVkLgorLy8gLSBDcmVhdGUgYSBjbGllbnQgdXNpbmcgY3JlYXRlQ2xpZW50KCkgYW5kIHVzZSBpdCBhcyBhbnkgb3RoZXIgbWVkaWFTb3VyY2UuCisvLworLy8gTm90ZSB0aGF0IG11bHRpcGxlIGNsaWVudHMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgY3JlYXRlQ2xpZW50KCkgYW5kCisvLyBzdGFydGVkL3N0b3BwZWQgaW4gYW55IG9yZGVyLiBNZWRpYVNvdXJjZVNwbGl0dGVyIHN0b3BzIHRoZSByZWFsIHNvdXJjZSBvbmx5CisvLyB3aGVuIGFsbCBjbGllbnRzIGhhdmUgYmVlbiBzdG9wcGVkLgorLy8KKy8vIElmIGEgbmV3IGNsaWVudCBpcyBjcmVhdGVkL3N0YXJ0ZWQgYWZ0ZXIgc29tZSBleGlzdGluZyBjbGllbnRzIGhhdmUgYWxyZWFkeQorLy8gc3RhcnRlZCwgdGhlIG5ldyBjbGllbnQgd2lsbCBzdGFydCBnZXR0aW5nIGl0cyByZWFkIGZyYW1lcyBmcm9tIHRoZSBjdXJyZW50CisvLyB0aW1lLgorCisjaWZuZGVmIE1FRElBX1NPVVJDRV9TUExJVFRFUl9IXworCisjZGVmaW5lIE1FRElBX1NPVVJDRV9TUExJVFRFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWV0YURhdGE7CisKK2NsYXNzIE1lZGlhU291cmNlU3BsaXR0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IKKyAgICAvLyBtZWRpYVNvdXJjZTogVGhlIHJlYWwgbWVkaWFTb3VyY2UuIFRoZSBjbGFzcyBrZWVwcyBhIHJlZmVyZW5jZSB0byBpdCB0bworICAgIC8vIGltcGxlbWVudCB0aGUgdmFyaW91cyBjbGllbnRzLgorICAgIE1lZGlhU291cmNlU3BsaXR0ZXIoc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlKTsKKworICAgIH5NZWRpYVNvdXJjZVNwbGl0dGVyKCk7CisKKyAgICAvLyBDcmVhdGVzIGEgbmV3IGNsaWVudCBvZiBiYXNlIHR5cGUgTWVkaWFTb3VyY2UuIE11bHRpcGxlIGNsaWVudHMgY2FuIGJlCisgICAgLy8gY3JlYXRlZCB3aGljaCBnZXQgdGhlaXIgZGF0YSB0aHJvdWdoIHRoZSBzYW1lIHJlYWwgbWVkaWFTb3VyY2UuIFRoZXNlCisgICAgLy8gY2xpZW50cyBjYW4gdGhlbiBiZSB1c2VkIGxpa2UgYW55IG90aGVyIE1lZGlhU291cmNlLCBhbGwgb2Ygd2hpY2ggcHJvdmlkZQorICAgIC8vIGRhdGEgZnJvbSB0aGUgc2FtZSByZWFsIHNvdXJjZS4KKyAgICBzcDxNZWRpYVNvdXJjZT4gY3JlYXRlQ2xpZW50KCk7CisKK3ByaXZhdGU6CisgICAgLy8gVG90YWwgbnVtYmVyIG9mIGNsaWVudHMgY3JlYXRlZCB0aHJvdWdoIGNyZWF0ZUNsaWVudCgpLgorICAgIGludDMyX3QgbU51bWJlck9mQ2xpZW50czsKKworICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgcmVhbCBNZWRpYVNvdXJjZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworCisgICAgLy8gU3RvcmVzIHBvaW50ZXIgdG8gdGhlIE1lZGlhQnVmZmVyIHJlYWQgZnJvbSB0aGUgcmVhbCBNZWRpYVNvdXJjZS4KKyAgICAvLyBBbGwgY2xpZW50cyB1c2UgdGhpcyB0byBpbXBsZW1lbnQgdGhlIHJlYWQoKSBjYWxsLgorICAgIE1lZGlhQnVmZmVyICptTGFzdFJlYWRNZWRpYUJ1ZmZlcjsKKworICAgIC8vIFN0YXR1cyBjb2RlIGZvciByZWFkIGZyb20gdGhlIHJlYWwgTWVkaWFTb3VyY2UuIEFsbCBjbGllbnRzIHJldHVybgorICAgIC8vIHRoaXMgZm9yIHRoZWlyIHJlYWQoKS4KKyAgICBzdGF0dXNfdCBtTGFzdFJlYWRTdGF0dXM7CisKKyAgICAvLyBCb29sZWFuIHRlbGxpbmcgd2hldGhlciB0aGUgcmVhbCBNZWRpYVNvdXJjZSBoYXMgc3RhcnRlZC4KKyAgICBib29sIG1Tb3VyY2VTdGFydGVkOworCisgICAgLy8gTGlzdCBvZiBib29sZWFucywgb25lIGZvciBlYWNoIGNsaWVudCwgc3RvcmluZyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gY2xpZW50J3Mgc3RhcnQoKSBoYXMgYmVlbiBjYWxsZWQuCisgICAgVmVjdG9yPGJvb2w+IG1DbGllbnRzU3RhcnRlZDsKKworICAgIC8vIFN0b3JlcyB0aGUgbnVtYmVyIG9mIGNsaWVudHMgd2hpY2ggYXJlIGN1cnJlbnRseSBzdGFydGVkLgorICAgIGludDMyX3QgbU51bWJlck9mQ2xpZW50c1N0YXJ0ZWQ7CisKKyAgICAvLyBTaW5jZSBkaWZmZXJlbnQgY2xpZW50cyBjYWxsIHJlYWQoKSBhc3luY2hyb25vdXNseSwgd2UgbmVlZCB0byBrZWVwIHRyYWNrCisgICAgLy8gb2Ygd2hhdCBkYXRhIGlzIGN1cnJlbnRseSByZWFkIGludG8gdGhlIG1MYXN0UmVhZE1lZGlhQnVmZmVyLgorICAgIC8vIG1DdXJyZW50UmVhZEJpdCBzdG9yZXMgdGhlIGJpdCBmb3IgdGhlIGN1cnJlbnQgcmVhZCBidWZmZXIuIFRoaXMgYml0CisgICAgLy8gZmxpcHMgZWFjaCB0aW1lIGEgbmV3IGJ1ZmZlciBpcyByZWFkIGZyb20gdGhlIHNvdXJjZS4KKyAgICAvLyBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0IHN0b3JlcyB0aGUgYml0IGZvciB0aGUgbmV4dCBkZXNpcmVkIHJlYWQgYnVmZmVyCisgICAgLy8gZm9yIGVhY2ggY2xpZW50LiBUaGlzIGJpdCBmbGlwcyBlYWNoIHRpbWUgcmVhZCgpIGlzIGNvbXBsZXRlZCBmb3IgdGhpcworICAgIC8vIGNsaWVudC4KKyAgICBib29sIG1DdXJyZW50UmVhZEJpdDsKKyAgICBWZWN0b3I8Ym9vbD4gbUNsaWVudHNEZXNpcmVkUmVhZEJpdDsKKworICAgIC8vIE51bWJlciBvZiBjbGllbnRzIHdob3NlIGN1cnJlbnQgcmVhZCBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgaW50MzJfdCBtTnVtYmVyT2ZDdXJyZW50UmVhZHM7CisKKyAgICAvLyBCb29sZWFuIHRlbGxpbmcgd2hldGhlciB0aGUgbGFzdCByZWFkIGhhcyBiZWVuIGNvbXBsZXRlZCBmb3IgYWxsIGNsaWVudHMuCisgICAgLy8gVGhlIHZhcmlhYmxlIGlzIHJlc2V0IHRvIGZhbHNlIGVhY2ggdGltZSBidWZmZXIgaXMgcmVhZCBmcm9tIHRoZSByZWFsCisgICAgLy8gc291cmNlLgorICAgIGJvb2wgbUxhc3RSZWFkQ29tcGxldGVkOworCisgICAgLy8gQSBnbG9iYWwgbXV0ZXggZm9yIGFjY2VzcyB0byBjcml0aWNhbCBzZWN0aW9ucy4KKyAgICBNdXRleCBtTG9jazsKKworICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSBmb3Igd2FpdGluZyBvbiByZWFkIGZyb20gc291cmNlIHRvIGNvbXBsZXRlLgorICAgIENvbmRpdGlvbiBtUmVhZEZyb21Tb3VyY2VDb25kaXRpb247CisKKyAgICAvLyBDb25kaXRpb24gdmFyaWFibGUgZm9yIHdhaXRpbmcgb24gYWxsIGNsaWVudCdzIGxhc3QgcmVhZCB0byBjb21wbGV0ZS4KKyAgICBDb25kaXRpb24gbUFsbFJlYWRzQ29tcGxldGVDb25kaXRpb247CisKKyAgICAvLyBGdW5jdGlvbnMgdXNlZCBieSBDbGllbnQgdG8gaW1wbGVtZW50IHRoZSBNZWRpYVNvdXJjZSBpbnRlcmZhY2UuCisKKyAgICAvLyBJZiB0aGUgcmVhbCBzb3VyY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0IGJ5IGFueSBjbGllbnQsIHN0YXJ0cyBpdC4KKyAgICBzdGF0dXNfdCBzdGFydChpbnQgY2xpZW50SWQsIE1ldGFEYXRhICpwYXJhbXMpOworCisgICAgLy8gU3RvcHMgdGhlIHJlYWwgc291cmNlIGFmdGVyIGFsbCBjbGllbnRzIGhhdmUgY2FsbGVkIHN0b3AoKS4KKyAgICBzdGF0dXNfdCBzdG9wKGludCBjbGllbnRJZCk7CisKKyAgICAvLyByZXR1cm5zIHRoZSByZWFsIHNvdXJjZSdzIGdldEZvcm1hdCgpLgorICAgIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoaW50IGNsaWVudElkKTsKKworICAgIC8vIElmIHRoZSBjbGllbnQncyBkZXNpcmVkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgaW50bworICAgIC8vIG1MYXN0UmVhZE1lZGlhQnVmZmVyLCBwb2ludHMgdGhlIGJ1ZmZlciB0byB0aGF0LiBPdGhlcndpc2UgaWYgaXQgaXMgdGhlCisgICAgLy8gbWFzdGVyIGNsaWVudCwgcmVhZHMgdGhlIGJ1ZmZlciBmcm9tIHNvdXJjZSBvciBlbHNlIHdhaXRzIGZvciB0aGUgbWFzdGVyCisgICAgLy8gY2xpZW50IHRvIHJlYWQgdGhlIGJ1ZmZlciBhbmQgdXNlcyB0aGF0LgorICAgIHN0YXR1c190IHJlYWQoaW50IGNsaWVudElkLAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgLy8gTm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdy4KKyAgICBzdGF0dXNfdCBwYXVzZShpbnQgY2xpZW50SWQpOworCisgICAgLy8gRnVuY3Rpb24gd2hpY2ggcmVhZHMgYSBidWZmZXIgZnJvbSB0aGUgcmVhbCBzb3VyY2UgaW50bworICAgIC8vIG1MYXN0UmVhZE1lZGlhQnVmZmVyCisgICAgdm9pZCByZWFkRnJvbVNvdXJjZV9sb2NrKGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisKKyAgICAvLyBXYWl0cyB1bnRpbCByZWFkIGZyb20gdGhlIHJlYWwgc291cmNlIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAgICAvLyBfbG9jayBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHRocmVhZCBoYXMgYWxyZWFkeQorICAgIC8vIG9idGFpbmVkIHRoZSBsb2NrIGZvciB0aGUgbXV0ZXggbUxvY2suCisgICAgdm9pZCB3YWl0Rm9yUmVhZEZyb21Tb3VyY2VfbG9jayhpbnQzMl90IGNsaWVudElkKTsKKworICAgIC8vIFdhaXRzIHVudGlsIGFsbCBjbGllbnRzIGhhdmUgcmVhZCB0aGUgY3VycmVudCBidWZmZXIgaW4KKyAgICAvLyBtTGFzdFJlYWRDb21wbGV0ZWQuCisgICAgdm9pZCB3YWl0Rm9yQWxsQ2xpZW50c0xhc3RSZWFkX2xvY2soaW50MzJfdCBjbGllbnRJZCk7CisKKyAgICAvLyBFYWNoIGNsaWVudCBjYWxscyB0aGlzIGFmdGVyIGl0IGNvbXBsZXRlcyBpdHMgcmVhZCgpLiBPbmNlIGFsbCBjbGllbnRzCisgICAgLy8gaGF2ZSBjYWxsZWQgdGhpcyBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLCB0aGUgZnVuY3Rpb24gY2FsbHMKKyAgICAvLyBtQWxsUmVhZHNDb21wbGV0ZUNvbmRpdGlvbi5icm9hZGNhc3QoKSB0byBzaWduYWwgdGhlIHdhaXRpbmcgY2xpZW50cy4KKyAgICB2b2lkIHNpZ25hbFJlYWRDb21wbGV0ZV9sb2NrKGJvb2wgcmVhZEFib3J0ZWQpOworCisgICAgLy8gTWFrZSB0aGVzZSBjb25zdHJ1Y3RvcnMgcHJpdmF0ZS4KKyAgICBNZWRpYVNvdXJjZVNwbGl0dGVyKCk7CisgICAgTWVkaWFTb3VyY2VTcGxpdHRlcihjb25zdCBNZWRpYVNvdXJjZVNwbGl0dGVyICYpOworICAgIE1lZGlhU291cmNlU3BsaXR0ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYVNvdXJjZVNwbGl0dGVyICYpOworCisgICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBNZWRpYVNvdXJjZSBpbnRlcmZhY2UuIEVhY2ggY2xpZW50IHN0b3JlcyBhCisgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgTWVkaWFTb3VyY2VTcGxpdHRlciBhbmQgdXNlcyBpdCB0byBjb21wbGV0ZSB0aGUKKyAgICAvLyB2YXJpb3VzIGNhbGxzLgorICAgIGNsYXNzIENsaWVudCA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CisgICAgcHVibGljOgorICAgICAgICAvLyBDb25zdHJ1Y3RvciBzdG9yZXMgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgTWVkaWFTb3VyY2VTcGxpdHRlciBhbmQgaXQKKyAgICAgICAgLy8gY2xpZW50IGlkLgorICAgICAgICBDbGllbnQoc3A8TWVkaWFTb3VyY2VTcGxpdHRlcj4gc3BsaXR0ZXIsIGludDMyX3QgY2xpZW50SWQpOworCisgICAgICAgIC8vIE1lZGlhU291cmNlIGludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gUmVmZXJuY2UgdG8gdGhlIHBhcmVudCBNZWRpYVNvdXJjZVNwbGl0dGVyCisgICAgICAgIHNwPE1lZGlhU291cmNlU3BsaXR0ZXI+IG1TcGxpdHRlcjsKKworICAgICAgICAvLyBJZCBvZiB0aGlzIGNsaWVudC4KKyAgICAgICAgaW50MzJfdCBtQ2xpZW50SWQ7CisgICAgfTsKKworICAgIGZyaWVuZCBjbGFzcyBDbGllbnQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX1NPVVJDRV9TUExJVFRFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk5MThjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFZpZGVvU291cmNlRG93blNhbXBsZXIgaW1wbGVtZW50cyB0aGUgTWVkaWFTb3VyY2UgaW50ZXJmYWNlLAorLy8gZG93bnNhbXBsaW5nIGZyYW1lcyBwcm92aWRlZCBmcm9tIGEgcmVhbCB2aWRlbyBzb3VyY2UuCisKKyNpZm5kZWYgVklERU9fU09VUkNFX0RPV05fU0FNUExFUl9IXworCisjZGVmaW5lIFZJREVPX1NPVVJDRV9ET1dOX1NBTVBMRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElNZW1vcnk7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKK2NsYXNzIE1ldGFEYXRhOworCitjbGFzcyBWaWRlb1NvdXJjZURvd25TYW1wbGVyIDogcHVibGljIE1lZGlhU291cmNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5WaWRlb1NvdXJjZURvd25TYW1wbGVyKCk7CisKKyAgICAvLyBDb25zdHJ1Y3RvcjoKKyAgICAvLyB2aWRlb1NvdXJjZTogVGhlIHJlYWwgdmlkZW8gc291cmNlIHdoaWNoIHByb3ZpZGVzIHRoZSBvcmlnaW5hbCBmcmFtZXMuCisgICAgLy8gd2lkdGgsIGhlaWdodDogVGhlIGRlc2lyZWQgd2lkdGgsIGhlaWdodC4gVGhlc2Ugc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbAorICAgIC8vIHRvIHRob3NlIG9mIHRoZSByZWFsIHZpZGVvIHNvdXJjZS4gV2UgdGhlbiBkb3duc2FtcGxlIHRoZSBvcmlnaW5hbCBmcmFtZXMgdG8KKyAgICAvLyB0aGlzIHNpemUuCisgICAgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnZpZGVvU291cmNlLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAvLyBNZWRpYVNvdXJjZSBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworcHJpdmF0ZToKKyAgICAvLyBSZWZlcmVuY2UgdG8gdGhlIHJlYWwgdmlkZW8gc291cmNlLgorICAgIHNwPE1lZGlhU291cmNlPiBtUmVhbFZpZGVvU291cmNlOworCisgICAgLy8gU2l6ZSBvZiBmcmFtZXMgdG8gYmUgcHJvdmlkZWQgYnkgdGhpcyBzb3VyY2UuCisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworCisgICAgLy8gU2l6ZSBvZiBmcmFtZXMgcHJvdmlkZWQgYnkgdGhlIHJlYWwgc291cmNlLgorICAgIGludDMyX3QgbVJlYWxTb3VyY2VXaWR0aDsKKyAgICBpbnQzMl90IG1SZWFsU291cmNlSGVpZ2h0OworCisgICAgLy8gRG93biBzYW1wbGluZyBwYXJhbXRlcnMuCisgICAgaW50MzJfdCBtRG93blNhbXBsZU9mZnNldFg7CisgICAgaW50MzJfdCBtRG93blNhbXBsZU9mZnNldFk7CisgICAgaW50MzJfdCBtRG93blNhbXBsZVNraXBYOworICAgIGludDMyX3QgbURvd25TYW1wbGVTa2lwWTsKKworICAgIC8vIFRydWUgaWYgd2UgbmVlZCB0byBjcm9wIHRoZSBzdGlsbCB2aWRlbyBpbWFnZSB0byBnZXQgdGhlIHZpZGVvIGZyYW1lLgorICAgIGJvb2wgbU5lZWREb3duU2FtcGxpbmc7CisKKyAgICAvLyBNZXRhIGRhdGEuIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSByZWFsIHNvdXJjZSBleGNlcHQgZm9yIHRoZSB3aWR0aCBhbmQKKyAgICAvLyBoZWlnaHQgcGFyYW1ldGVycy4KKyAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisKKyAgICAvLyBDb21wdXRlcyB0aGUgb2Zmc2V0LCBza2lwIHBhcmFtZXRlcnMgZm9yIGRvd25zYW1wbGluZyB0aGUgb3JpZ2luYWwgZnJhbWUKKyAgICAvLyB0byB0aGUgZGVzaXJlZCBzaXplLgorICAgIHZvaWQgY29tcHV0ZURvd25TYW1wbGluZ1BhcmFtZXRlcnMoKTsKKworICAgIC8vIERvd25zYW1wbGVzIHRoZSBmcmFtZSBpbiBzb3VyY2VCdWZmZXIgdG8gc2l6ZSAobVdpZHRoIHggbUhlaWdodCkuIEEgbmV3CisgICAgLy8gYnVmZmVyIGlzIGNyZWF0ZWQgd2hpY2ggc3RvcmVzIHRoZSBkb3duc2FtcGxlZCBpbWFnZS4KKyAgICB2b2lkIGRvd25TYW1wbGVZVVZJbWFnZShjb25zdCBNZWRpYUJ1ZmZlciAmc291cmNlQnVmZmVyLCBNZWRpYUJ1ZmZlciAqKmJ1ZmZlcikgY29uc3Q7CisKKyAgICAvLyBEaXNhbGxvdyB0aGVzZS4KKyAgICBWaWRlb1NvdXJjZURvd25TYW1wbGVyKGNvbnN0IFZpZGVvU291cmNlRG93blNhbXBsZXIgJik7CisgICAgVmlkZW9Tb3VyY2VEb3duU2FtcGxlciAmb3BlcmF0b3I9KGNvbnN0IFZpZGVvU291cmNlRG93blNhbXBsZXIgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX1NPVVJDRV9ET1dOX1NBTVBMRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzA5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBZVVZDYW52YXMgaG9sZHMgYSByZWZlcmVuY2UgdG8gYSBZVVZJbWFnZSBvbiB3aGljaCBpdCBjYW4gZG8gdmFyaW91cworLy8gZHJhd2luZyBvcGVyYXRpb25zLiBJdCBwcm92aWRlcyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBmaWxsaW5nLAorLy8gY3JvcHBpbmcsIGV0Yy4KKworCisjaWZuZGVmIFlVVl9DQU5WQVNfSF8KKworI2RlZmluZSBZVVZfQ0FOVkFTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBZVVZJbWFnZTsKK2NsYXNzIFJlY3Q7CisKK2NsYXNzIFlVVkNhbnZhcyB7CitwdWJsaWM6CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtlcyBpbiByZWZlcmVuY2UgdG8gYSB5dXZJbWFnZSBvbiB3aGljaCBpdCBjYW4gZG8KKyAgICAvLyB2YXJpb3VzIGRyYXdpbmcgb3ByZWF0aW9ucy4KKyAgICBZVVZDYW52YXMoWVVWSW1hZ2UgJnl1dkltYWdlKTsKKyAgICB+WVVWQ2FudmFzKCk7CisKKyAgICAvLyBGaWxscyB0aGUgZW50aXJlIGltYWdlIHdpdGggdGhlIGdpdmVuIFlVViB2YWx1ZXMuCisgICAgdm9pZCBGaWxsWVVWKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpOworCisgICAgLy8gRmlsbHMgdGhlIHJlY3Rhbmd1bGFyIHJlZ2lvbiBbc3RhcnRYLGVuZFhdeFtzdGFydFksZW5kWV0gd2l0aCB0aGUgZ2l2ZW4gWVVWIHZhbHVlcy4KKyAgICB2b2lkIEZpbGxZVVZSZWN0YW5nbGUoY29uc3QgUmVjdCYgcmVjdCwKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpOworCisgICAgLy8gQ29waWVzIHRoZSByZWdpb24gW3N0YXJ0WCxlbmRYXXhbc3RhcnRZLGVuZFldIGZyb20gc3JjSW1hZ2UgaW50byB0aGUKKyAgICAvLyBjYW52YXMnIHRhcmdldCBpbWFnZSAobVlVVkltYWdlKSBzdGFydGluZyBhdAorICAgIC8vIChkZXN0aW5hdGlvblN0YXJ0WCxkZXN0aW5hdGlvblN0YXJ0WSkuCisgICAgLy8gTm90ZSB0aGF0IHVuZGVmaW5lZCBiZWhhdmlvciBtYXkgb2NjdXIgaWYgc3JjSW1hZ2UgaXMgc2FtZSBhcyB0aGUgY2FudmFzJworICAgIC8vIHRhcmdldCBpbWFnZS4KKyAgICB2b2lkIENvcHlJbWFnZVJlY3QoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UpOworCisgICAgLy8gRG93bnNhbXBsZXMgdGhlIHNyY0ltYWdlIGludG8gdGhlIGNhbnZhcycgdGFyZ2V0IGltYWdlIChtWVVWSW1hZ2UpCisgICAgLy8gVGhlIGRvd25zYW1wbGluZyBjb3BpZXMgcGl4ZWxzIGZyb20gdGhlIHNvdXJjZSBpbWFnZSBzdGFydGluZyBhdAorICAgIC8vIChzcmNPZmZzZXRYLCBzcmNPZmZzZXRZKSB0byB0aGUgdGFyZ2V0IGltYWdlLCBzdGFydGluZyBhdCAoMCwgMCkuCisgICAgLy8gRm9yIGVhY2ggWCBpbmNyZW1lbnQgaW4gdGhlIHRhcmdldCBpbWFnZSwgc2tpcFggcGl4ZWxzIGFyZSBza2lwcGVkCisgICAgLy8gaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAvLyBTaW1pbGFybHkgZm9yIGVhY2ggWSBpbmNyZW1lbnQgaW4gdGhlIHRhcmdldCBpbWFnZSwgc2tpcFkgcGl4ZWxzCisgICAgLy8gYXJlIHNraXBwZWQgaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICB2b2lkIGRvd25zYW1wbGUoCisgICAgICAgICAgICBpbnQzMl90IHNyY09mZnNldFgsIGludDMyX3Qgc3JjT2Zmc2V0WSwKKyAgICAgICAgICAgIGludDMyX3Qgc2tpcFgsIGludDMyX3Qgc2tpcFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UpOworCitwcml2YXRlOgorICAgIFlVVkltYWdlJiBtWVVWSW1hZ2U7CisKKyAgICBZVVZDYW52YXMoY29uc3QgWVVWQ2FudmFzICYpOworICAgIFlVVkNhbnZhcyAmb3BlcmF0b3I9KGNvbnN0IFlVVkNhbnZhcyAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gWVVWX0NBTlZBU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTg2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBBIGNvbnRhaW5lciBjbGFzcyB0byBob2xkIFlVViBkYXRhIGFuZCBwcm92aWRlIHZhcmlvdXMgdXRpbGl0aWVzLAorLy8gZS5nLiB0byBzZXQvZ2V0IHBpeGVsIHZhbHVlcy4KKy8vIFN1cHBvcnRlZCBmb3JtYXRzOgorLy8gIC0gWVVWNDIwIFBsYW5hcgorLy8gIC0gWVVWNDIwIFNlbWkgUGxhbmFyCisvLworLy8gIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IHZhcmlhYmxlIHN0cmlkZXMuCisvLworLy8gIEltcGxlbWVudGF0aW9uOiBUd28gc2ltcGxlIGFic3RyYWN0aW9ucyBhcmUgZG9uZSB0byBzaW1wbGlmeSBhY2Nlc3MKKy8vICB0byBZVVYgY2hhbm5lbHMgZm9yIGRpZmZlcmVudCBmb3JtYXRzOgorLy8gIC0gaW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCkgc2V0cyB1cCBwb2ludGVycyAobVlkYXRhLCBtVWRhdGEsIG1WZGF0YSkgdG8KKy8vICBwb2ludCB0byB0aGUgcmlnaHQgc3RhcnQgbG9jYXRpb25zIG9mIHRoZSBkaWZmZXJlbnQgY2hhbm5lbCBkYXRhIGRlcGVuZGluZworLy8gIG9uIHRoZSBmb3JtYXQuCisvLyAgLSBnZXRPZmZzZXRzKCkgcmV0dXJucyB0aGUgY29ycmVjdCBvZmZzZXQgZm9yIHRoZSBkaWZmZXJlbnQgY2hhbm5lbHMKKy8vICBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdC4KKy8vICBMb2NhdGlvbiBvZiBhbnkgcGl4ZWwncyBZVVYgY2hhbm5lbHMgY2FuIHRoZW4gYmUgZWFzaWx5IGNvbXB1dGVkIHVzaW5nIHRoZXNlLgorLy8KKworI2lmbmRlZiBZVVZfSU1BR0VfSF8KKworI2RlZmluZSBZVVZfSU1BR0VfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUmVjdDsKKworY2xhc3MgWVVWSW1hZ2UgeworcHVibGljOgorICAgIC8vIFN1cHBvcnRlZCBZVVYgZm9ybWF0cworICAgIGVudW0gWVVWRm9ybWF0IHsKKyAgICAgICAgWVVWNDIwUGxhbmFyLAorICAgICAgICBZVVY0MjBTZW1pUGxhbmFyCisgICAgfTsKKworICAgIC8vIENvbnN0cnVjdHMgYW4gaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gc2l6ZSwgZm9ybWF0LiBBbHNvIGFsbG9jYXRlcyBhbmQgb3ducworICAgIC8vIHRoZSByZXF1aXJlZCBtZW1vcnkuCisgICAgWVVWSW1hZ2UoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gQ29uc3RydWN0cyBhbiBpbWFnZSB3aXRoIHRoZSBnaXZlbiBzaXplLCBmb3JtYXQuIFRoZSBtZW1vcnkgaXMgcHJvdmlkZWQKKyAgICAvLyBieSB0aGUgY2FsbGVyIGFuZCB3ZSBkb24ndCBvd24gaXQuCisgICAgWVVWSW1hZ2UoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgKmJ1ZmZlcik7CisKKyAgICAvLyBEZXN0cnVjdG9yIHRvIGRlbGV0ZSB0aGUgbWVtb3J5IGlmIGl0IG93bnMgaXQuCisgICAgfllVVkltYWdlKCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIFlVViBkYXRhIGZvciB0aGUgZ2l2ZW4KKyAgICAvLyBmb3JtYXQgYW5kIGdlb21ldHJ5LiBVc2VmdWwgd2hlbiB0aGUgY2FsbGVyIHdhbnRzIHRvIGFsbG9jYXRlIHRoZSByZXF1aXNpdGUKKyAgICAvLyBtZW1vcnkuCisgICAgc3RhdGljIHNpemVfdCBidWZmZXJTaXplKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIGludDMyX3Qgd2lkdGgoKSBjb25zdCB7cmV0dXJuIG1XaWR0aDt9CisgICAgaW50MzJfdCBoZWlnaHQoKSBjb25zdCB7cmV0dXJuIG1IZWlnaHQ7fQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHBpeGVsIGlzIHRoZSByYW5nZSBbMCwgd2lkdGgtMV0geCBbMCwgaGVpZ2h0LTFdCisgICAgLy8gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHZhbGlkUGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0OworCisgICAgLy8gR2V0IHRoZSBwaXhlbCBZVVYgdmFsdWUgYXQgcGl4ZWwgKHgseSkuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZ2V0IHdhcyBzdWNjZXNzZnVsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBnZXRQaXhlbFZhbHVlKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICAgICAgdWludDhfdCAqeVB0ciwgdWludDhfdCAqdVB0ciwgdWludDhfdCAqdlB0cikgY29uc3Q7CisKKyAgICAvLyBTZXQgdGhlIHBpeGVsIFlVViB2YWx1ZSBhdCBwaXhlbCAoeCx5KS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBzZXQgd2FzIHN1Y2Nlc3NmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHNldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKTsKKworICAgIC8vIFVzZXMgbWVtY3B5IHRvIGNvcHkgYW4gZW50aXJlIHJvdyBvZiBkYXRhCisgICAgc3RhdGljIHZvaWQgZmFzdENvcHlSZWN0YW5nbGU0MjBQbGFuYXIoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gVXNlcyBtZW1jcHkgdG8gY29weSBhbiBlbnRpcmUgcm93IG9mIGRhdGEKKyAgICBzdGF0aWMgdm9pZCBmYXN0Q29weVJlY3RhbmdsZTQyMFNlbWlQbGFuYXIoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gVHJpZXMgdG8gdXNlIG1lbWNvcHkgdG8gY29weSBlbnRpcmUgcm93cyBvZiBkYXRhLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFzdCBjb3B5IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIHBhc3NlZCBpbWFnZSBmb3JtYXRzLgorICAgIHN0YXRpYyBib29sIGZhc3RDb3B5UmVjdGFuZ2xlKAorICAgICAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlLCBZVVZJbWFnZSAmZGVzdEltYWdlKTsKKworICAgIC8vIENvbnZlcnQgdGhlIGdpdmVuIFlVViB2YWx1ZSB0byBSR0IuCisgICAgdm9pZCB5dXYycmdiKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUsCisgICAgICAgIHVpbnQ4X3QgKnIsIHVpbnQ4X3QgKmcsIHVpbnQ4X3QgKmIpIGNvbnN0OworCisgICAgLy8gV3JpdGUgdGhlIGltYWdlIHRvIGEgaHVtYW4gcmVhZGFibGUgUFBNIGZpbGUuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHdyaXRlIHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHdyaXRlVG9QUE0oY29uc3QgY2hhciAqZmlsZW5hbWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIFlVViBGb3JtYXQgb2YgdGhlIGltYWdlLgorICAgIFlVVkZvcm1hdCBtWVVWRm9ybWF0OworCisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworCisgICAgLy8gUG9pbnRlciB0byB0aGUgbWVtb3J5IGJ1ZmZlci4KKyAgICB1aW50OF90ICptQnVmZmVyOworCisgICAgLy8gQm9vbGVhbiB0ZWxsaW5nIHdoZXRoZXIgd2Ugb3duIHRoZSBtZW1vcnkgYnVmZmVyLgorICAgIGJvb2wgbU93bkJ1ZmZlcjsKKworICAgIC8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFkgZGF0YSBwbGFuZS4KKyAgICB1aW50OF90ICptWWRhdGE7CisKKyAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBVIGRhdGEgcGxhbmUuIE5vdGUgdGhhdCBpbiBjYXNlIG9mIGludGVybGVhdmVkIGZvcm1hdHMgbGlrZQorICAgIC8vIFlVVjQyMCBzZW1pcGxhbmFyLCBtVWRhdGEgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgVSBkYXRhIGluIHRoZSBVViBwbGFuZS4KKyAgICB1aW50OF90ICptVWRhdGE7CisKKyAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBWIGRhdGEgcGxhbmUuIE5vdGUgdGhhdCBpbiBjYXNlIG9mIGludGVybGVhdmVkIGZvcm1hdHMgbGlrZQorICAgIC8vIFlVVjQyMCBzZW1pcGxhbmFyLCBtVmRhdGEgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgViBkYXRhIGluIHRoZSBVViBwbGFuZS4KKyAgICB1aW50OF90ICptVmRhdGE7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBwb2ludGVycyBtWWRhdGEsIG1VZGF0YSwgbVZkYXRhIHRvIHBvaW50IHRvIHRoZSByaWdodCBsb2NhdGlvbnMgZm9yCisgICAgLy8gdGhlIGdpdmVuIGZvcm1hdCBhbmQgZ2VvbWV0cnkuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGluaXRpYWxpemUgd2FzIHN1Y2Nlc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgaW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCk7CisKKyAgICAvLyBGb3IgdGhlIGdpdmVuIHBpeGVsIGxvY2F0aW9uLCB0aGlzIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gb2YgeSwgdSBhbmQgdgorICAgIC8vIGRhdGEgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBiYXNlIHBvaW50ZXJzIC0tIG1ZZGF0YSwgbVVkYXRhLCBtVmRhdGEuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZ2V0dGluZyBvZmZzZXRzIHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGdldE9mZnNldHMoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIGludDMyX3QgKnlPZmZzZXQsIGludDMyX3QgKnVPZmZzZXQsIGludDMyX3QgKnZPZmZzZXQpIGNvbnN0OworCisgICAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IGluY3JlbWVudHMgaW5jdXJyZWQgaW4gZ29pbmcgZnJvbSBvbmUgZGF0YSByb3cgdG8gdGhlIG5leHQgZGF0YSByb3cKKyAgICAvLyBmb3IgdGhlIFlVViBjaGFubmVscy4gTm90ZSB0aGF0IHRoaXMgY29ycmVzcG9uZHMgdG8gZGF0YSByb3dzIGFuZCBub3QgcGl4ZWwgcm93cy4KKyAgICAvLyBFLmcuIGRlcGVuZGluZyBvbiBmb3JtYXRzLCBVL1YgY2hhbm5lbHMgbWF5IGhhdmUgb25seSBvbmUgZGF0YSByb3cgY29ycmVzcG9uZGluZworICAgIC8vIHRvIHR3byBwaXhlbCByb3dzLgorICAgIGJvb2wgZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgIGludDMyX3QgKnlEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp1RGF0YU9mZnNldEluY3JlbWVudCwKKyAgICAgICAgaW50MzJfdCAqdkRhdGFPZmZzZXRJbmNyZW1lbnQpIGNvbnN0OworCisgICAgLy8gR2l2ZW4gdGhlIG9mZnNldCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCdzIGRhdGEuCisgICAgdWludDhfdCogZ2V0WUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0OworICAgIHVpbnQ4X3QqIGdldFVBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKyAgICB1aW50OF90KiBnZXRWQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3Q7CisKKyAgICAvLyBHaXZlbiB0aGUgcGl4ZWwgbG9jYXRpb24sIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCdzIGRhdGEuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICBib29sIGdldFlVVkFkZHJlc3NlcyhpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgdWludDhfdCAqKnlBZGRyLCB1aW50OF90ICoqdUFkZHIsIHVpbnQ4X3QgKip2QWRkcikgY29uc3Q7CisKKyAgICAvLyBEaXNhbGxvdyBpbXBsaWNpdCBjYXN0aW5nIGFuZCBjb3B5aW5nLgorICAgIFlVVkltYWdlKGNvbnN0IFlVVkltYWdlICYpOworICAgIFlVVkltYWdlICZvcGVyYXRvcj0oY29uc3QgWVVWSW1hZ2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFlVVl9JTUFHRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9TdXJmYWNlLmggYi9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaAppbmRleCAyMjY4NGRiLi5jZWY0MzljIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaAorKysgYi9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaApAQCAtOTQsNyArOTQsNyBAQAogICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CiAKICAgICAvLyBjYW1lcmEgYW5kIGNhbWNvcmRlciBuZWVkIGFjY2VzcyB0byB0aGUgSVN1cmZhY2UgYmluZGVyIGludGVyZmFjZSBmb3IgcHJldmlldwotICAgIGZyaWVuZCBjbGFzcyBDYW1lcmE7CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNlcnZpY2U7CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUmVjb3JkZXI7CiAgICAgLy8gbWVkaWFwbGF5ZXIgbmVlZHMgYWNjZXNzIHRvIElTdXJmYWNlIGZvciBkaXNwbGF5CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyOwpAQCAtMTczLDExICsxNzMsMTIgQEAKICAgICAgKiAoZXZlbnR1YWxseSB0aGlzIHNob3VsZCBnbyBhd2F5IGFuZCBiZSByZXBsYWNlZCBieSBwcm9wZXIgQVBJcykKICAgICAgKi8KICAgICAvLyBjYW1lcmEgYW5kIGNhbWNvcmRlciBuZWVkIGFjY2VzcyB0byB0aGUgSVN1cmZhY2UgYmluZGVyIGludGVyZmFjZSBmb3IgcHJldmlldwotICAgIGZyaWVuZCBjbGFzcyBDYW1lcmE7CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNlcnZpY2U7CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUmVjb3JkZXI7CiAgICAgLy8gTWVkaWFQbGF5ZXIgbmVlZHMgYWNjZXNzIHRvIElTdXJmYWNlIGZvciBkaXNwbGF5CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyOwogICAgIGZyaWVuZCBjbGFzcyBJT01YOworICAgIGZyaWVuZCBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyOwogICAgIC8vIHRoaXMgaXMganVzdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWUgdW5pdCB0ZXN0cwogICAgIGZyaWVuZCBjbGFzcyBUZXN0OwogCkBAIC0zMTQsNCArMzE1LDMgQEAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX1NGX1NVUkZBQ0VfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0dyYXBoaWNCdWZmZXIuaCBiL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlci5oCmluZGV4IGEzZTg1YTkuLmM0NDY2MzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlci5oCisrKyBiL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlci5oCkBAIC03Miw2ICs3Miw5IEBACiAgICAgR3JhcGhpY0J1ZmZlcih1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlLAogICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlLCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSwgYm9vbCBrZWVwT3duZXJzaGlwKTsKIAorICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBmcm9tIGFuIGV4aXN0aW5nIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90CisgICAgR3JhcGhpY0J1ZmZlcihhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmZmVyLCBib29sIGtlZXBPd25lcnNoaXApOworCiAgICAgLy8gcmV0dXJuIHN0YXR1cwogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwogCkBAIC0xMzcsNiArMTQwLDEwIEBACiAgICAgR3JhcGhpY0J1ZmZlck1hcHBlciYgbUJ1ZmZlck1hcHBlcjsKICAgICBzc2l6ZV90IG1Jbml0Q2hlY2s7CiAgICAgaW50IG1JbmRleDsKKworICAgIC8vIElmIHdlJ3JlIHdyYXBwaW5nIGFub3RoZXIgYnVmZmVyIHRoZW4gdGhpcyByZWZlcmVuY2Ugd2lsbCBtYWtlIHN1cmUgaXQKKyAgICAvLyBkb2Vzbid0IGdldCBmcmVlZC4KKyAgICBzcDxhbmRyb2lkX25hdGl2ZV9idWZmZXJfdD4gbVdyYXBwZWRCdWZmZXI7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9JbnB1dERpc3BhdGNoZXIuaCBiL2luY2x1ZGUvdWkvSW5wdXREaXNwYXRjaGVyLmgKaW5kZXggNDdjNTMyNi4uMjQ2ZGY4ZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvSW5wdXREaXNwYXRjaGVyLmgKKysrIGIvaW5jbHVkZS91aS9JbnB1dERpc3BhdGNoZXIuaApAQCAtMzYyLDYgKzM2MiwxNCBAQAogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1dERpc3BhdGNoTW9kZShib29sIGVuYWJsZWQsIGJvb2wgZnJvemVuKSA9IDA7CiAKKyAgICAvKiBUcmFuc2ZlcnMgdG91Y2ggZm9jdXMgZnJvbSB0aGUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCBvbmUgY2hhbm5lbCB0byB0aGUKKyAgICAgKiB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdGhlciBjaGFubmVsLgorICAgICAqCisgICAgICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuICBGYWxzZSBpZiB0aGUgd2luZG93IGRpZCBub3QgYWN0dWFsbHkgaGF2ZSB0b3VjaCBmb2N1cy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgdHJhbnNmZXJUb3VjaEZvY3VzKGNvbnN0IHNwPElucHV0Q2hhbm5lbD4mIGZyb21DaGFubmVsLAorICAgICAgICAgICAgY29uc3Qgc3A8SW5wdXRDaGFubmVsPiYgdG9DaGFubmVsKSA9IDA7CisKICAgICAvKiBSZWdpc3RlcnMgb3IgdW5yZWdpc3RlciBpbnB1dCBjaGFubmVscyB0aGF0IG1heSBiZSB1c2VkIGFzIHRhcmdldHMgZm9yIGlucHV0IGV2ZW50cy4KICAgICAgKiBJZiBtb25pdG9yIGlzIHRydWUsIHRoZSBjaGFubmVsIHdpbGwgcmVjZWl2ZSBhIGNvcHkgb2YgYWxsIGlucHV0IGV2ZW50cy4KICAgICAgKgpAQCAtNDE2LDYgKzQyNCw5IEBACiAgICAgdmlydHVhbCB2b2lkIHNldEZvY3VzZWRBcHBsaWNhdGlvbihjb25zdCBJbnB1dEFwcGxpY2F0aW9uKiBpbnB1dEFwcGxpY2F0aW9uKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXREaXNwYXRjaE1vZGUoYm9vbCBlbmFibGVkLCBib29sIGZyb3plbik7CiAKKyAgICB2aXJ0dWFsIGJvb2wgdHJhbnNmZXJUb3VjaEZvY3VzKGNvbnN0IHNwPElucHV0Q2hhbm5lbD4mIGZyb21DaGFubmVsLAorICAgICAgICAgICAgY29uc3Qgc3A8SW5wdXRDaGFubmVsPiYgdG9DaGFubmVsKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJJbnB1dENoYW5uZWwoY29uc3Qgc3A8SW5wdXRDaGFubmVsPiYgaW5wdXRDaGFubmVsLCBib29sIG1vbml0b3IpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlcklucHV0Q2hhbm5lbChjb25zdCBzcDxJbnB1dENoYW5uZWw+JiBpbnB1dENoYW5uZWwpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1NpbmdsZXRvbi5oIGIvaW5jbHVkZS91dGlscy9TaW5nbGV0b24uaAppbmRleCAzYjk3NWI0Li5lMWVlOGViIDEwMDY0NAotLS0gYS9pbmNsdWRlL3V0aWxzL1NpbmdsZXRvbi5oCisrKyBiL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmgKQEAgLTM3LDYgKzM3LDExIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuICppbnN0YW5jZTsKICAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBoYXNJbnN0YW5jZSgpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNMb2NrKTsKKyAgICAgICAgcmV0dXJuIHNJbnN0YW5jZSAhPSAwOworICAgIH0KICAgICAKIHByb3RlY3RlZDoKICAgICB+U2luZ2xldG9uKCkgeyB9OwpkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQW5kcm9pZC5tayBiL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKaW5kZXggMTNkYzUwMC4uZjlkOWYyNSAxMDA2NDQKLS0tIGEvbGlicy9iaW5kZXIvQW5kcm9pZC5taworKysgYi9saWJzL2JpbmRlci9BbmRyb2lkLm1rCkBAIC0xNiw2ICsxNiw3IEBACiBzb3VyY2VzIDo9IFwKICAgICBCaW5kZXIuY3BwIFwKICAgICBCcEJpbmRlci5jcHAgXAorICAgIEN1cnNvcldpbmRvdy5jcHAgXAogICAgIElJbnRlcmZhY2UuY3BwIFwKICAgICBJTWVtb3J5LmNwcCBcCiAgICAgSVBDVGhyZWFkU3RhdGUuY3BwIFwKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAgYi9saWJzL2JpbmRlci9DdXJzb3JXaW5kb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDRkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2JpbmRlci9DdXJzb3JXaW5kb3cuY3BwCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkN1cnNvcldpbmRvdyIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9DdXJzb3JXaW5kb3cuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ3Vyc29yV2luZG93OjpDdXJzb3JXaW5kb3coc2l6ZV90IG1heFNpemUpIDoKKyAgICBtTWF4U2l6ZShtYXhTaXplKQoreworfQorCitib29sIEN1cnNvcldpbmRvdzo6c2V0TWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBtZW1vcnkpCit7CisgICAgbU1lbW9yeSA9IG1lbW9yeTsKKyAgICBtRGF0YSA9ICh1aW50OF90ICopIG1lbW9yeS0+cG9pbnRlcigpOworICAgIGlmIChtRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUhlYWRlciA9ICh3aW5kb3dfaGVhZGVyX3QgKikgbURhdGE7CisKKyAgICAvLyBNYWtlIHRoZSB3aW5kb3cgcmVhZC1vbmx5CisgICAgc3NpemVfdCBzaXplID0gbWVtb3J5LT5zaXplKCk7CisgICAgbVNpemUgPSBzaXplOworICAgIG1NYXhTaXplID0gc2l6ZTsKKyAgICBtRnJlZU9mZnNldCA9IHNpemU7CitMT0dfV0lORE9XKCJDcmVhdGVkIEN1cnNvcldpbmRvdyBmcm9tIGV4aXN0aW5nIElNZW1vcnk6IG1GcmVlT2Zmc2V0ID0gJWQsIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkLCBtU2l6ZSA9ICVkLCBtTWF4U2l6ZSA9ICVkLCBtRGF0YSA9ICVwIiwgbUZyZWVPZmZzZXQsIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMsIG1TaXplLCBtTWF4U2l6ZSwgbURhdGEpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6aW5pdEJ1ZmZlcihib29sIGxvY2FsT25seSkKK3sKKyAgICAvL1RPRE8gVXNlIGEgbm9uLW1lbW9yeSBkZWFsZXIgbW1hcCByZWdpb24gZm9yIGxvY2FsT25seQorCisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXA7CisgICAgaGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShtTWF4U2l6ZSwgMCwgIkN1cnNvcldpbmRvdyIpOworICAgIGlmIChoZWFwICE9IE5VTEwpIHsKKyAgICAgICAgbU1lbW9yeSA9IG5ldyBNZW1vcnlCYXNlKGhlYXAsIDAsIG1NYXhTaXplKTsKKyAgICAgICAgaWYgKG1NZW1vcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgbURhdGEgPSAodWludDhfdCAqKSBtTWVtb3J5LT5wb2ludGVyKCk7CisgICAgICAgICAgICBpZiAobURhdGEpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyID0gKHdpbmRvd19oZWFkZXJfdCAqKSBtRGF0YTsKKyAgICAgICAgICAgICAgICBtU2l6ZSA9IG1NYXhTaXplOworCisgICAgICAgICAgICAgICAgLy8gUHV0IHRoZSB3aW5kb3cgaW50byBhIGNsZWFuIHN0YXRlCisgICAgICAgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgICAgIExPR19XSU5ET1coIkNyZWF0ZWQgQ3Vyc29yV2luZG93IHdpdGggbmV3IE1lbW9yeURlYWxlcjogbUZyZWVPZmZzZXQgPSAlZCwgbVNpemUgPSAlZCwgbU1heFNpemUgPSAlZCwgbURhdGEgPSAlcCIsIG1GcmVlT2Zmc2V0LCBtU2l6ZSwgbU1heFNpemUsIG1EYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgICAgIExPR0UoIkN1cnNvcldpbmRvdyBoZWFwIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIHRoZSBDdXJzb3JXaW5kb3cgaGVhcCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitDdXJzb3JXaW5kb3c6On5DdXJzb3JXaW5kb3coKQoreworICAgIC8vIEV2ZXJ5dGhpbmcgdGhhdCBtYXR0ZXJzIGlzIGEgc21hcnQgcG9pbnRlcgorfQorCit2b2lkIEN1cnNvcldpbmRvdzo6Y2xlYXIoKQoreworICAgIG1IZWFkZXItPm51bVJvd3MgPSAwOworICAgIG1IZWFkZXItPm51bUNvbHVtbnMgPSAwOworICAgIG1GcmVlT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFOworICAgIC8vIE1hcmsgdGhlIGZpcnN0IGNodW5rJ3MgbmV4dCAncG9pbnRlcicgYXMgbnVsbAorICAgICooKHVpbnQzMl90ICopKG1EYXRhICsgbUZyZWVPZmZzZXQgLSBzaXplb2YodWludDMyX3QpKSkgPSAwOworfQorCitpbnQzMl90IEN1cnNvcldpbmRvdzo6ZnJlZVNwYWNlKCkKK3sKKyAgICBpbnQzMl90IGZyZWVTcGFjZSA9IG1TaXplIC0gbUZyZWVPZmZzZXQ7CisgICAgaWYgKGZyZWVTcGFjZSA8IDApIHsKKyAgICAgICAgZnJlZVNwYWNlID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGZyZWVTcGFjZTsKK30KKworZmllbGRfc2xvdF90ICogQ3Vyc29yV2luZG93OjphbGxvY1JvdygpCit7CisgICAgLy8gRmlsbCBpbiB0aGUgcm93IHNsb3QKKyAgICByb3dfc2xvdF90ICogcm93U2xvdCA9IGFsbG9jUm93U2xvdCgpOworICAgIGlmIChyb3dTbG90ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgdGhlIHNsb3RzIGZvciB0aGUgZmllbGQgZGlyZWN0b3J5CisgICAgc2l6ZV90IGZpZWxkRGlyU2l6ZSA9IG1IZWFkZXItPm51bUNvbHVtbnMgKiBzaXplb2YoZmllbGRfc2xvdF90KTsKKyAgICB1aW50MzJfdCBmaWVsZERpck9mZnNldCA9IGFsbG9jKGZpZWxkRGlyU2l6ZSk7CisgICAgaWYgKCFmaWVsZERpck9mZnNldCkgeworICAgICAgICBtSGVhZGVyLT5udW1Sb3dzLS07CisgICAgICAgIExPR0UoIlRoZSByb3cgZmFpbGVkLCBzbyBiYWNrIG91dCB0aGUgbmV3IHJvdyBhY2NvdW50aW5nIGZyb20gYWxsb2NSb3dTbG90ICVkIiwgbUhlYWRlci0+bnVtUm93cyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZERpciA9IChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCk7CisgICAgbWVtc2V0KGZpZWxkRGlyLCAweDAsIGZpZWxkRGlyU2l6ZSk7CisKK0xPR19XSU5ET1coIkFsbG9jYXRlZCByb3cgJXUsIHJvd1Nsb3QgaXMgYXQgb2Zmc2V0ICV1LCBmaWVsZERpciBpcyAlZCBieXRlcyBhdCBvZmZzZXQgJXVcbiIsIChtSGVhZGVyLT5udW1Sb3dzIC0gMSksICgodWludDhfdCAqKXJvd1Nsb3QpIC0gbURhdGEsIGZpZWxkRGlyU2l6ZSwgZmllbGREaXJPZmZzZXQpOworICAgIHJvd1Nsb3QtPm9mZnNldCA9IGZpZWxkRGlyT2Zmc2V0OworCisgICAgcmV0dXJuIGZpZWxkRGlyOworfQorCit1aW50MzJfdCBDdXJzb3JXaW5kb3c6OmFsbG9jKHNpemVfdCByZXF1ZXN0ZWRTaXplLCBib29sIGFsaWduZWQpCit7CisgICAgaW50MzJfdCBzaXplOworICAgIHVpbnQzMl90IHBhZGRpbmc7CisgICAgaWYgKGFsaWduZWQpIHsKKyAgICAgICAgLy8gNCBieXRlIGFsaWdubWVudAorICAgICAgICBwYWRkaW5nID0gNCAtIChtRnJlZU9mZnNldCAmIDB4Myk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFkZGluZyA9IDA7CisgICAgfQorCisgICAgc2l6ZSA9IHJlcXVlc3RlZFNpemUgKyBwYWRkaW5nOworCisgICAgaWYgKHNpemUgPiBmcmVlU3BhY2UoKSkgeworICAgICAgICBMT0dWKCJuZWVkIHRvIGdyb3c6IG1TaXplID0gJWQsIHNpemUgPSAlZCwgZnJlZVNwYWNlKCkgPSAlZCwgbnVtUm93cyA9ICVkIiwgbVNpemUsIHNpemUsCisgICAgICAgICAgICAgICAgZnJlZVNwYWNlKCksIG1IZWFkZXItPm51bVJvd3MpOworICAgICAgICAvLyBPbmx5IGdyb3cgdGhlIHdpbmRvdyBpZiB0aGUgZmlyc3Qgcm93IGRvZXNuJ3QgZml0CisgICAgICAgIGlmIChtSGVhZGVyLT5udW1Sb3dzID4gMSkgeworICAgICAgICAgICAgTE9HVigibm90IGdyb3dpbmcgc2luY2UgdGhlcmUgYXJlIGFscmVhZHkgJWQgcm93KHMpLCBtYXggc2l6ZSAlZCIsIG1IZWFkZXItPm51bVJvd3MsCisgICAgICAgICAgICAgICAgICAgIG1NYXhTaXplKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCBhIG5ldyBzaXplIHRoYXQgd2lsbCBmaXQgdGhlIGFsbG9jYXRpb24KKyAgICAgICAgaW50IGFsbG9jYXRlZCA9IG1TaXplIC0gZnJlZVNwYWNlKCk7CisgICAgICAgIGludCBuZXdTaXplID0gbVNpemUgKyBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOworICAgICAgICB3aGlsZSAoc2l6ZSA+IChuZXdTaXplIC0gYWxsb2NhdGVkKSkgeworICAgICAgICAgICAgbmV3U2l6ZSArPSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOworICAgICAgICAgICAgaWYgKG5ld1NpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gZ3JvdyB3aW5kb3cgYmV5b25kIG1heCBzaXplICglZCkiLCBtTWF4U2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK0xPR19XSU5ET1coImZvdW5kIHNpemUgJWQiLCBuZXdTaXplKTsKKyAgICAgICAgbVNpemUgPSBuZXdTaXplOworICAgIH0KKworICAgIHVpbnQzMl90IG9mZnNldCA9IG1GcmVlT2Zmc2V0ICsgcGFkZGluZzsKKyAgICBtRnJlZU9mZnNldCArPSBzaXplOworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3Jvd19zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmdldFJvd1Nsb3QoaW50IHJvdykKK3sKKyAgICBMT0dfV0lORE9XKCJlbnRlciBnZXRSb3dTbG90IGN1cnJlbnQgcm93IG51bSAlZCwgdGhpcyByb3cgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCByb3cpOworICAgIGludCBjaHVua051bSA9IHJvdyAvIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOworICAgIGludCBjaHVua1BvcyA9IHJvdyAlIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOworICAgIGludCBjaHVua1B0ck9mZnNldCA9IHNpemVvZih3aW5kb3dfaGVhZGVyX3QpICsgUk9XX1NMT1RfQ0hVTktfU0laRSAtIHNpemVvZih1aW50MzJfdCk7CisgICAgdWludDhfdCAqIHJvd0NodW5rID0gbURhdGEgKyBzaXplb2Yod2luZG93X2hlYWRlcl90KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKKyAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cigqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkpOworICAgICAgICBjaHVua1B0ck9mZnNldCA9IHJvd0NodW5rIC0gbURhdGEgKyAoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpOworICAgIH0KKyAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKKyAgICBMT0dfV0lORE9XKCJleGl0IGdldFJvd1Nsb3QgY3VycmVudCByb3cgbnVtICVkLCB0aGlzIHJvdyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIHJvdyk7ICAgIAorfQorCityb3dfc2xvdF90ICogQ3Vyc29yV2luZG93OjphbGxvY1Jvd1Nsb3QoKQoreworICAgIGludCBjaHVua051bSA9IG1IZWFkZXItPm51bVJvd3MgLyBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKKyAgICBpbnQgY2h1bmtQb3MgPSBtSGVhZGVyLT5udW1Sb3dzICUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7CisgICAgaW50IGNodW5rUHRyT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICB1aW50OF90ICogcm93Q2h1bmsgPSBtRGF0YSArIHNpemVvZih3aW5kb3dfaGVhZGVyX3QpOworTE9HX1dJTkRPVygiQWxsb2NhdGluZyByb3cgc2xvdCwgbUhlYWRlci0+bnVtUm93cyBpcyAlZCwgY2h1bmtOdW0gaXMgJWQsIGNodW5rUG9zIGlzICVkIiwgbUhlYWRlci0+bnVtUm93cywgY2h1bmtOdW0sIGNodW5rUG9zKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgbmV4dENodW5rT2Zmc2V0ID0gKigodWludDMyX3QgKikobURhdGEgKyBjaHVua1B0ck9mZnNldCkpOworTE9HX1dJTkRPVygibmV4dENodW5rT2Zmc2V0IGlzICVkIiwgbmV4dENodW5rT2Zmc2V0KTsKKyAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyByb3cgY2h1bmsKKyAgICAgICAgICAgIG5leHRDaHVua09mZnNldCA9IGFsbG9jKFJPV19TTE9UX0NIVU5LX1NJWkUsIHRydWUpOworICAgICAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKG5leHRDaHVua09mZnNldCk7CitMT0dfV0lORE9XKCJhbGxvY2F0ZWQgbmV3IGNodW5rIGF0ICVkLCByb3dDaHVuayA9ICVwIiwgbmV4dENodW5rT2Zmc2V0LCByb3dDaHVuayk7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkgPSByb3dDaHVuayAtIG1EYXRhOworICAgICAgICAgICAgLy8gTWFyayB0aGUgbmV3IGNodW5rJ3MgbmV4dCAncG9pbnRlcicgYXMgbnVsbAorICAgICAgICAgICAgKigodWludDMyX3QgKikocm93Q2h1bmsgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KSkpID0gMDsKKyAgICAgICAgfSBlbHNlIHsKK0xPR19XSU5ET1coImZvbGx3aW5nICdwb2ludGVyJyB0byBuZXh0IGNodW5rLCBvZmZzZXQgb2YgbmV4dCBwb2ludGVyIGlzICVkIiwgY2h1bmtQdHJPZmZzZXQpOworICAgICAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cihuZXh0Q2h1bmtPZmZzZXQpOworICAgICAgICAgICAgY2h1bmtQdHJPZmZzZXQgPSByb3dDaHVuayAtIG1EYXRhICsgKFJPV19TTE9UX0NIVU5LX05VTV9ST1dTICogc2l6ZW9mKHJvd19zbG90X3QpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSGVhZGVyLT5udW1Sb3dzKys7CisKKyAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKK30KKworZmllbGRfc2xvdF90ICogQ3Vyc29yV2luZG93OjpnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbikKK3sKKyAgaWYgKHJvdyA8IDAgfHwgcm93ID49IG1IZWFkZXItPm51bVJvd3MgfHwgY29sdW1uIDwgMCB8fCBjb2x1bW4gPj0gbUhlYWRlci0+bnVtQ29sdW1ucykgeworICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0gICAgICAgIAorICByb3dfc2xvdF90ICogcm93U2xvdCA9IGdldFJvd1Nsb3Qocm93KTsKKyAgaWYgKCFyb3dTbG90KSB7CisgICAgICBMT0dFKCJGYWlsZWQgdG8gZmluZCByb3dTbG90IGZvciByb3cgJWQiLCByb3cpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgeworICAgICAgTE9HRSgiSW52YWxpZCByb3dTbG90LCBvZmZzZXQgPSAlZCIsIHJvd1Nsb3QtPm9mZnNldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfSAgCisgIGludCBmaWVsZERpck9mZnNldCA9IHJvd1Nsb3QtPm9mZnNldDsKKyAgcmV0dXJuICgoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIoZmllbGREaXJPZmZzZXQpKSArIGNvbHVtbjsgIAorfQorCit1aW50MzJfdCBDdXJzb3JXaW5kb3c6OnJlYWRfZmllbGRfc2xvdChpbnQgcm93LCBpbnQgY29sdW1uLCBmaWVsZF9zbG90X3QgKiBzbG90T3V0KQoreworICAgIGlmIChyb3cgPCAwIHx8IHJvdyA+PSBtSGVhZGVyLT5udW1Sb3dzIHx8IGNvbHVtbiA8IDAgfHwgY29sdW1uID49IG1IZWFkZXItPm51bUNvbHVtbnMpIHsKKyAgICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSAgICAgICAgCisgICAgcm93X3Nsb3RfdCAqIHJvd1Nsb3QgPSBnZXRSb3dTbG90KHJvdyk7CisgICAgaWYgKCFyb3dTbG90KSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBmaW5kIHJvd1Nsb3QgZm9yIHJvdyAlZCIsIHJvdyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHJvd1Nsb3QsIG9mZnNldCA9ICVkIiwgcm93U2xvdC0+b2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK0xPR19XSU5ET1coIkZvdW5kIGZpZWxkIGRpcmVjdG9yeSBmb3IgJWQsJWQgYXQgcm93U2xvdCAlZCwgb2Zmc2V0ICVkIiwgcm93LCBjb2x1bW4sICh1aW50OF90ICopcm93U2xvdCAtIG1EYXRhLCByb3dTbG90LT5vZmZzZXQpOworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKHJvd1Nsb3QtPm9mZnNldCk7CitMT0dfV0lORE9XKCJSZWFkIGZpZWxkX3Nsb3RfdCAlZCwlZDogb2Zmc2V0ID0gJWQsIHNpemUgPSAlZCwgdHlwZSA9ICVkIiwgcm93LCBjb2x1bW4sIGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIub2Zmc2V0LCBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLnNpemUsIGZpZWxkRGlyW2NvbHVtbl0udHlwZSk7CisKKyAgICAvLyBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXQgcGFyYW0KKyAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLm9mZnNldDsKKyAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5zaXplID0gZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5zaXplOworICAgIHNsb3RPdXQtPnR5cGUgPSBmaWVsZERpcltjb2x1bW5dLnR5cGU7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gbVNpemUpOyAgICAKKyAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsIGRhdGEsIHNpemUpOworfQorCit2b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoaW50NjRfdCkgPD0gbVNpemUpOworICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgKHVpbnQ4X3QgKikmZGF0YSwgc2l6ZW9mKGludDY0X3QpKTsKK30KKwordm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoZG91YmxlKSA8PSBtU2l6ZSk7CisgICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCAodWludDhfdCAqKSZkYXRhLCBzaXplb2YoZG91YmxlKSk7Cit9CisKK3ZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5T3V0KHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqIGRhdGEsIHNpemVfdCBzaXplKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplIDw9IG1TaXplKTsKKyAgICBtZW1jcHkoZGF0YSwgbURhdGEgKyBvZmZzZXQsIHNpemUpOworfQorCitpbnQ2NF90IEN1cnNvcldpbmRvdzo6Y29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KQoreworICAgIGludDY0X3QgdmFsdWU7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihpbnQ2NF90KSA8PSBtU2l6ZSk7CisgICAgbWVtY3B5KCZ2YWx1ZSwgbURhdGEgKyBvZmZzZXQsIHNpemVvZihpbnQ2NF90KSk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitkb3VibGUgQ3Vyc29yV2luZG93Ojpjb3B5T3V0RG91YmxlKHVpbnQzMl90IG9mZnNldCkKK3sKKyAgICBkb3VibGUgdmFsdWU7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihkb3VibGUpIDw9IG1TaXplKTsKKyAgICBtZW1jcHkoJnZhbHVlLCBtRGF0YSArIG9mZnNldCwgc2l6ZW9mKGRvdWJsZSkpOworICAgIHJldHVybiB2YWx1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OnB1dExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICBmaWVsZFNsb3QtPmRhdGEubCA9IHZhbHVlOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29weUluKG9mZnNldCwgdmFsdWUpOworCisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGludDY0X3QpOworI2VuZGlmCisgICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9JTlRFR0VSOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6cHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICBmaWVsZFNsb3QtPmRhdGEuZCA9IHZhbHVlOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29weUluKG9mZnNldCwgdmFsdWUpOworCisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGRvdWJsZSk7CisjZW5kaWYKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0ZMT0FUOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6cHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfTlVMTDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IDA7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OmdldExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCAqIHZhbHVlT3V0KQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QgfHwgZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfSU5URUdFUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUworICAgICp2YWx1ZU91dCA9IGZpZWxkU2xvdC0+ZGF0YS5sOworI2Vsc2UKKyAgICAqdmFsdWVPdXQgPSBjb3B5T3V0TG9uZyhmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OmdldERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgKiB2YWx1ZU91dCkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90IHx8IGZpZWxkU2xvdC0+dHlwZSAhPSBGSUVMRF9UWVBFX0ZMT0FUKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICAqdmFsdWVPdXQgPSBmaWVsZFNsb3QtPmRhdGEuZDsKKyNlbHNlCisgICAgKnZhbHVlT3V0ID0gY29weU91dERvdWJsZShmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OmdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBpZiAoZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfTlVMTCkgeworICAgICAgICAqdmFsdWVPdXQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqdmFsdWVPdXQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvY2FtZXJhL0NhbWVyYS5jcHAgYi9saWJzL2NhbWVyYS9DYW1lcmEuY3BwCmluZGV4IDdlZmM2ZDcuLmI1Zjc4ZTggMTAwNjQ0Ci0tLSBhL2xpYnMvY2FtZXJhL0NhbWVyYS5jcHAKKysrIGIvbGlicy9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtMTY3LDMyICsxNjcsMjAgQEAKICAgICByZXR1cm4gYy0+dW5sb2NrKCk7CiB9CiAKLS8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQorLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKIHN0YXR1c190IENhbWVyYTo6c2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiB7Ci0gICAgTE9HVigic2V0UHJldmlld0Rpc3BsYXkiKTsKKyAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSglcCkiLCBzdXJmYWNlLmdldCgpKTsKICAgICBzcCA8SUNhbWVyYT4gYyA9IG1DYW1lcmE7CiAgICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaWYgKHN1cmZhY2UgIT0gMCkgewotICAgICAgICByZXR1cm4gYy0+c2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKSk7CisgICAgICAgIHJldHVybiBjLT5zZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dEKCJhcHAgcGFzc2VkIE5VTEwgc3VyZmFjZSIpOwogICAgICAgICByZXR1cm4gYy0+c2V0UHJldmlld0Rpc3BsYXkoMCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBDYW1lcmE6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKLXsKLSAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSIpOwotICAgIGlmIChzdXJmYWNlID09IDApIHsKLSAgICAgICAgTE9HRCgiYXBwIHBhc3NlZCBOVUxMIHN1cmZhY2UiKTsKLSAgICB9Ci0gICAgc3AgPElDYW1lcmE+IGMgPSBtQ2FtZXJhOwotICAgIGlmIChjID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBjLT5zZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlKTsKLX0KLQotCiAvLyBzdGFydCBwcmV2aWV3IG1vZGUKIHN0YXR1c190IENhbWVyYTo6c3RhcnRQcmV2aWV3KCkKIHsKQEAgLTM3NSw0ICszNjMsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9saWJzL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2xpYnMvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCmluZGV4IDgzZTVlNTdmLi40NWIxYjlhIDEwMDY0NAotLS0gYS9saWJzL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAorKysgYi9saWJzL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcApAQCAtNzMsNiArNzMsOCBAQAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU01PT1RIX1pPT01fU1VQUE9SVEVEW10gPSAic21vb3RoLXpvb20tc3VwcG9ydGVkIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0RJU1RBTkNFU1tdID0gImZvY3VzLWRpc3RhbmNlcyI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9WSURFT19GUkFNRV9GT1JNQVRbXSA9ICJ2aWRlby1mcmFtZS1mb3JtYXQiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVklERU9fU0laRVtdID0gInZpZGVvLXNpemUiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1ZJREVPX1NJWkVTW10gPSAidmlkZW8tc2l6ZS12YWx1ZXMiOwogCiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlRSVUVbXSA9ICJ0cnVlIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfRElTVEFOQ0VfSU5GSU5JVFlbXSA9ICJJbmZpbml0eSI7CkBAIC0xMjksNyArMTMxLDcgQEAKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9DQU5ETEVMSUdIVFtdID0gImNhbmRsZWxpZ2h0IjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9CQVJDT0RFW10gPSAiYmFyY29kZSI7CiAKLS8vIEZvcm1hdHMgZm9yIHNldFByZXZpZXdGb3JtYXQgYW5kIHNldFBpY3R1cmVGb3JtYXQuCitjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBQW10gID0gInl1djQyMHAiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIyU1BbXSA9ICJ5dXY0MjJzcCI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBTUFtdID0gInl1djQyMHNwIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMklbXSA9ICJ5dXY0MjJpLXl1eXYiOwpAQCAtMzM3LDYgKzMzOSwyNyBAQAogICAgIHBhcnNlU2l6ZXNMaXN0KHByZXZpZXdTaXplc1N0ciwgc2l6ZXMpOwogfQogCit2b2lkIENhbWVyYVBhcmFtZXRlcnM6OnNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgY2hhciBzdHJbMzJdOworICAgIHNwcmludGYoc3RyLCAiJWR4JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBzZXQoS0VZX1ZJREVPX1NJWkUsIHN0cik7Cit9CisKK3ZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0VmlkZW9TaXplKGludCAqd2lkdGgsIGludCAqaGVpZ2h0KSBjb25zdAoreworICAgICp3aWR0aCA9ICpoZWlnaHQgPSAtMTsKKyAgICBjb25zdCBjaGFyICpwID0gZ2V0KEtFWV9WSURFT19TSVpFKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm47CisgICAgcGFyc2VfcGFpcihwLCB3aWR0aCwgaGVpZ2h0LCAneCcpOworfQorCit2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3QKK3sKKyAgICBjb25zdCBjaGFyICp2aWRlb1NpemVzU3RyID0gZ2V0KEtFWV9TVVBQT1JURURfVklERU9fU0laRVMpOworICAgIHBhcnNlU2l6ZXNMaXN0KHZpZGVvU2l6ZXNTdHIsIHNpemVzKTsKK30KKwogdm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQcmV2aWV3RnJhbWVSYXRlKGludCBmcHMpCiB7CiAgICAgc2V0KEtFWV9QUkVWSUVXX0ZSQU1FX1JBVEUsIGZwcyk7CmRpZmYgLS1naXQgYS9saWJzL2NhbWVyYS9JQ2FtZXJhLmNwcCBiL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwCmluZGV4IDEzNjczYjUuLjk0ZGM1YzEgMTAwNjQ0Ci0tLSBhL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwCisrKyBiL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwCkBAIC02NCwxMyArNjQsMTMgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIFN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCisgICAgc3RhdHVzX3Qgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiAgICAgewogICAgICAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UtPmFzQmluZGVyKCkpOworICAgICAgICBTdXJmYWNlOjp3cml0ZVRvUGFyY2VsKHN1cmZhY2UsICZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUkVWSUVXX0RJU1BMQVksIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0yNTgsNyArMjU4LDcgQEAKICAgICAgICAgY2FzZSBTRVRfUFJFVklFV19ESVNQTEFZOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfUFJFVklFV19ESVNQTEFZIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SVN1cmZhY2U+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IFN1cmZhY2U6OnJlYWRGcm9tUGFyY2VsKGRhdGEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMzc2LDQgKzM3NiwzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9BbmRyb2lkLm1rIGIvbGlicy9od3VpL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3YTllZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgT25seSBidWlsZCBsaWJod3VpIHdoZW4gVVNFX09QRU5HTF9SRU5ERVJFUiBpcworIyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGRldmljZS9ib2FyZCBjb25maWd1cmF0aW9uCitpZmVxICgkKFVTRV9PUEVOR0xfUkVOREVSRVIpLHRydWUpCisJTE9DQUxfU1JDX0ZJTEVTOj0gXAorCQl1dGlscy9Tb3J0ZWRMaXN0SW1wbC5jcHAgXAorCQlEaXNwbGF5TGlzdFJlbmRlcmVyLmNwcCBcCisJCUZib0NhY2hlLmNwcCBcCisJCUZvbnRSZW5kZXJlci5jcHAgXAorCQlHYW1tYUZvbnRSZW5kZXJlci5jcHAgXAorCQlHcmFkaWVudENhY2hlLmNwcCBcCisJCUxheWVyQ2FjaGUuY3BwIFwKKwkJTWF0cml4LmNwcCBcCisJCU9wZW5HTERlYnVnUmVuZGVyZXIuY3BwIFwKKwkJT3BlbkdMUmVuZGVyZXIuY3BwIFwKKwkJUGF0Y2guY3BwIFwKKwkJUGF0Y2hDYWNoZS5jcHAgXAorCQlQYXRoQ2FjaGUuY3BwIFwKKwkJUHJvZ3JhbS5jcHAgXAorCQlQcm9ncmFtQ2FjaGUuY3BwIFwKKwkJU2tpYUNvbG9yRmlsdGVyLmNwcCBcCisJCVNraWFTaGFkZXIuY3BwIFwKKwkJVGV4dHVyZUNhY2hlLmNwcCBcCisJCVRleHREcm9wU2hhZG93Q2FjaGUuY3BwCisJCisJTE9DQUxfQ19JTkNMVURFUyArPSBcCisJCSQoSk5JX0hfSU5DTFVERSkgXAorCQkkKExPQ0FMX1BBVEgpLy4uLy4uL2luY2x1ZGUvdXRpbHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvY29yZSBcCisJCWV4dGVybmFsL3NraWEvaW5jbHVkZS9lZmZlY3RzIFwKKwkJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2ltYWdlcyBcCisJCWV4dGVybmFsL3NraWEvc3JjL3BvcnRzIFwKKwkJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL3V0aWxzCisKKwlMT0NBTF9DRkxBR1MgKz0gLURVU0VfT1BFTkdMX1JFTkRFUkVSCisJTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNIQVJFRF9MSUJSQVJJRVMKKwlMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJHTEVTdjIgbGlic2tpYQorCUxPQ0FMX01PRFVMRSA6PSBsaWJod3VpCisJTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKwlMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCQorCWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworICAgIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvQ2FjaGVzLmggYi9saWJzL2h3dWkvQ2FjaGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1MmE2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9DYWNoZXMuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0NBQ0hFU19ICisjZGVmaW5lIEFORFJPSURfVUlfQ0FDSEVTX0gKKworI2lmbmRlZiBMT0dfVEFHCisgICAgI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKyNlbmRpZgorCisjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGUuaCIKKyNpbmNsdWRlICJMYXllckNhY2hlLmgiCisjaW5jbHVkZSAiR3JhZGllbnRDYWNoZS5oIgorI2luY2x1ZGUgIlBhdGNoQ2FjaGUuaCIKKyNpbmNsdWRlICJHYW1tYUZvbnRSZW5kZXJlci5oIgorI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorI2luY2x1ZGUgIlBhdGhDYWNoZS5oIgorI2luY2x1ZGUgIlRleHREcm9wU2hhZG93Q2FjaGUuaCIKKyNpbmNsdWRlICJGYm9DYWNoZS5oIgorI2luY2x1ZGUgIkxpbmUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitzdHJ1Y3QgQ2FjaGVMb2dnZXIgeworICAgIENhY2hlTG9nZ2VyKCkgeworICAgICAgICBMT0dEKCJDcmVhdGluZyBjYWNoZXMiKTsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgQ2FjaGVMb2dnZXIKKworY2xhc3MgQ2FjaGVzOiBwdWJsaWMgU2luZ2xldG9uPENhY2hlcz4geworICAgIENhY2hlcygpOiBTaW5nbGV0b248Q2FjaGVzPigpLCBibGVuZChmYWxzZSksIGxhc3RTcmNNb2RlKEdMX1pFUk8pLAorICAgICAgICAgICAgbGFzdERzdE1vZGUoR0xfWkVSTyksIGN1cnJlbnRQcm9ncmFtKE5VTEwpIHsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPENhY2hlcz47CisKKyAgICBDYWNoZUxvZ2dlciBsb2dnZXI7CisKK3B1YmxpYzoKKyAgICBib29sIGJsZW5kOworICAgIEdMZW51bSBsYXN0U3JjTW9kZTsKKyAgICBHTGVudW0gbGFzdERzdE1vZGU7CisgICAgUHJvZ3JhbSogY3VycmVudFByb2dyYW07CisKKyAgICBUZXh0dXJlQ2FjaGUgdGV4dHVyZUNhY2hlOworICAgIExheWVyQ2FjaGUgbGF5ZXJDYWNoZTsKKyAgICBHcmFkaWVudENhY2hlIGdyYWRpZW50Q2FjaGU7CisgICAgUHJvZ3JhbUNhY2hlIHByb2dyYW1DYWNoZTsKKyAgICBQYXRoQ2FjaGUgcGF0aENhY2hlOworICAgIFBhdGNoQ2FjaGUgcGF0Y2hDYWNoZTsKKyAgICBUZXh0RHJvcFNoYWRvd0NhY2hlIGRyb3BTaGFkb3dDYWNoZTsKKyAgICBGYm9DYWNoZSBmYm9DYWNoZTsKKyAgICBHYW1tYUZvbnRSZW5kZXJlciBmb250UmVuZGVyZXI7CisKKyAgICBMaW5lIGxpbmU7Cit9OyAvLyBjbGFzcyBDYWNoZXMKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKKworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKK3VzaW5nIG5hbWVzcGFjZSB1aXJlbmRlcmVyOworQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKENhY2hlcyk7CisjZW5kaWYKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfQ0FDSEVTX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9EaXNwbGF5TGlzdFJlbmRlcmVyLmNwcCBiL2xpYnMvaHd1aS9EaXNwbGF5TGlzdFJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWU1NDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwCkBAIC0wLDAgKzEsNTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgIkRpc3BsYXlMaXN0UmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgUEFUSF9IRUFQX1NJWkUgNjQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSGVscGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYXRoSGVhcDo6UGF0aEhlYXAoKTogbUhlYXAoUEFUSF9IRUFQX1NJWkUgKiBzaXplb2YoU2tQYXRoKSkgeworfQorCitQYXRoSGVhcDo6UGF0aEhlYXAoU2tGbGF0dGVuYWJsZVJlYWRCdWZmZXImIGJ1ZmZlcik6IG1IZWFwKFBBVEhfSEVBUF9TSVpFICogc2l6ZW9mKFNrUGF0aCkpIHsKKyAgICBpbnQgY291bnQgPSBidWZmZXIucmVhZFMzMigpOworCisgICAgbVBhdGhzLnNldENvdW50KGNvdW50KTsKKyAgICBTa1BhdGgqKiBwdHIgPSBtUGF0aHMuYmVnaW4oKTsKKyAgICBTa1BhdGgqIHAgPSAoU2tQYXRoKikgbUhlYXAuYWxsb2NUaHJvdyhjb3VudCAqIHNpemVvZihTa1BhdGgpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBuZXcgKHApIFNrUGF0aDsKKyAgICAgICAgcC0+dW5mbGF0dGVuKGJ1ZmZlcik7CisgICAgICAgICpwdHIrKyA9IHA7CisgICAgICAgIHArKzsKKyAgICB9Cit9CisKK1BhdGhIZWFwOjp+UGF0aEhlYXAoKSB7CisgICAgU2tQYXRoKiogaXRlciA9IG1QYXRocy5iZWdpbigpOworICAgIFNrUGF0aCoqIHN0b3AgPSBtUGF0aHMuZW5kKCk7CisgICAgd2hpbGUgKGl0ZXIgPCBzdG9wKSB7CisgICAgICAgICgqaXRlciktPn5Ta1BhdGgoKTsKKyAgICAgICAgaXRlcisrOworICAgIH0KK30KKworaW50IFBhdGhIZWFwOjphcHBlbmQoY29uc3QgU2tQYXRoJiBwYXRoKSB7CisgICAgU2tQYXRoKiBwID0gKFNrUGF0aCopIG1IZWFwLmFsbG9jVGhyb3coc2l6ZW9mKFNrUGF0aCkpOworICAgIG5ldyAocCkgU2tQYXRoKHBhdGgpOworICAgICptUGF0aHMuYXBwZW5kKCkgPSBwOworICAgIHJldHVybiBtUGF0aHMuY291bnQoKTsKK30KKwordm9pZCBQYXRoSGVhcDo6ZmxhdHRlbihTa0ZsYXR0ZW5hYmxlV3JpdGVCdWZmZXImIGJ1ZmZlcikgY29uc3QgeworICAgIGludCBjb3VudCA9IG1QYXRocy5jb3VudCgpOworCisgICAgYnVmZmVyLndyaXRlMzIoY291bnQpOworICAgIFNrUGF0aCoqIGl0ZXIgPSBtUGF0aHMuYmVnaW4oKTsKKyAgICBTa1BhdGgqKiBzdG9wID0gbVBhdGhzLmVuZCgpOworICAgIHdoaWxlIChpdGVyIDwgc3RvcCkgeworICAgICAgICAoKml0ZXIpLT5mbGF0dGVuKGJ1ZmZlcik7CisgICAgICAgIGl0ZXIrKzsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERpc3BsYXkgbGlzdAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitEaXNwbGF5TGlzdDo6RGlzcGxheUxpc3QoY29uc3QgRGlzcGxheUxpc3RSZW5kZXJlciYgcmVjb3JkZXIpIHsKKyAgICBjb25zdCBTa1dyaXRlcjMyJiB3cml0ZXIgPSByZWNvcmRlci53cml0ZVN0cmVhbSgpOworICAgIGluaXQoKTsKKworICAgIGlmICh3cml0ZXIuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gd3JpdGVyLnNpemUoKTsKKyAgICB2b2lkKiBidWZmZXIgPSBza19tYWxsb2NfdGhyb3coc2l6ZSk7CisgICAgd3JpdGVyLmZsYXR0ZW4oYnVmZmVyKTsKKyAgICBtUmVhZGVyLnNldE1lbW9yeShidWZmZXIsIHNpemUpOworCisgICAgbVJDUGxheWJhY2sucmVzZXQoJnJlY29yZGVyLm1SQ1JlY29yZGVyKTsKKyAgICBtUkNQbGF5YmFjay5zZXR1cEJ1ZmZlcihtUmVhZGVyKTsKKworICAgIG1URlBsYXliYWNrLnJlc2V0KCZyZWNvcmRlci5tVEZSZWNvcmRlcik7CisgICAgbVRGUGxheWJhY2suc2V0dXBCdWZmZXIobVJlYWRlcik7CisKKyAgICBjb25zdCBTa1REQXJyYXk8Y29uc3QgU2tGbGF0Qml0bWFwKj4mIGJpdG1hcHMgPSByZWNvcmRlci5nZXRCaXRtYXBzKCk7CisgICAgbUJpdG1hcENvdW50ID0gYml0bWFwcy5jb3VudCgpOworICAgIGlmIChtQml0bWFwQ291bnQgPiAwKSB7CisgICAgICAgIG1CaXRtYXBzID0gbmV3IFNrQml0bWFwW21CaXRtYXBDb3VudF07CisgICAgICAgIGZvciAoY29uc3QgU2tGbGF0Qml0bWFwKiogZmxhdEJpdG1hcFB0ciA9IGJpdG1hcHMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBmbGF0Qml0bWFwUHRyICE9IGJpdG1hcHMuZW5kKCk7IGZsYXRCaXRtYXBQdHIrKykgeworICAgICAgICAgICAgY29uc3QgU2tGbGF0Qml0bWFwKiBmbGF0Qml0bWFwID0gKmZsYXRCaXRtYXBQdHI7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmbGF0Qml0bWFwLT5pbmRleCgpIC0gMTsKKyAgICAgICAgICAgIGZsYXRCaXRtYXAtPnVuZmxhdHRlbigmbUJpdG1hcHNbaW5kZXhdLCAmbVJDUGxheWJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgU2tUREFycmF5PGNvbnN0IFNrRmxhdE1hdHJpeCo+JiBtYXRyaWNlcyA9IHJlY29yZGVyLmdldE1hdHJpY2VzKCk7CisgICAgbU1hdHJpeENvdW50ID0gbWF0cmljZXMuY291bnQoKTsKKyAgICBpZiAobU1hdHJpeENvdW50ID4gMCkgeworICAgICAgICBtTWF0cmljZXMgPSBuZXcgU2tNYXRyaXhbbU1hdHJpeENvdW50XTsKKyAgICAgICAgZm9yIChjb25zdCBTa0ZsYXRNYXRyaXgqKiBtYXRyaXhQdHIgPSBtYXRyaWNlcy5iZWdpbigpOworICAgICAgICAgICAgICAgIG1hdHJpeFB0ciAhPSBtYXRyaWNlcy5lbmQoKTsgbWF0cml4UHRyKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFNrRmxhdE1hdHJpeCogZmxhdE1hdHJpeCA9ICptYXRyaXhQdHI7CisgICAgICAgICAgICBmbGF0TWF0cml4LT51bmZsYXR0ZW4oJm1NYXRyaWNlc1tmbGF0TWF0cml4LT5pbmRleCgpIC0gMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgU2tUREFycmF5PGNvbnN0IFNrRmxhdFBhaW50Kj4mIHBhaW50cyA9IHJlY29yZGVyLmdldFBhaW50cygpOworICAgIG1QYWludENvdW50ID0gcGFpbnRzLmNvdW50KCk7CisgICAgaWYgKG1QYWludENvdW50ID4gMCkgeworICAgICAgICBtUGFpbnRzID0gbmV3IFNrUGFpbnRbbVBhaW50Q291bnRdOworICAgICAgICBmb3IgKGNvbnN0IFNrRmxhdFBhaW50KiogZmxhdFBhaW50UHRyID0gcGFpbnRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgZmxhdFBhaW50UHRyICE9IHBhaW50cy5lbmQoKTsgZmxhdFBhaW50UHRyKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFNrRmxhdFBhaW50KiBmbGF0UGFpbnQgPSAqZmxhdFBhaW50UHRyOworICAgICAgICAgICAgaW50IGluZGV4ID0gZmxhdFBhaW50LT5pbmRleCgpIC0gMTsKKyAgICAgICAgICAgIGZsYXRQYWludC0+dW5mbGF0dGVuKCZtUGFpbnRzW2luZGV4XSwgJm1SQ1BsYXliYWNrLCAmbVRGUGxheWJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgbVBhdGhIZWFwID0gcmVjb3JkZXIubVBhdGhIZWFwOworICAgIG1QYXRoSGVhcC0+c2FmZVJlZigpOworfQorCitEaXNwbGF5TGlzdDo6fkRpc3BsYXlMaXN0KCkgeworICAgIHNrX2ZyZWUoKHZvaWQqKSBtUmVhZGVyLmJhc2UoKSk7CisKKyAgICBDYWNoZXMmIGNhY2hlcyA9IENhY2hlczo6Z2V0SW5zdGFuY2UoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1CaXRtYXBDb3VudDsgaSsrKSB7CisgICAgICAgIGNhY2hlcy50ZXh0dXJlQ2FjaGUucmVtb3ZlKCZtQml0bWFwc1tpXSk7CisgICAgfQorCisgICAgZGVsZXRlW10gbUJpdG1hcHM7CisgICAgZGVsZXRlW10gbU1hdHJpY2VzOworICAgIGRlbGV0ZVtdIG1QYWludHM7CisKKyAgICBtUGF0aEhlYXAtPnNhZmVVbnJlZigpOworfQorCit2b2lkIERpc3BsYXlMaXN0Ojppbml0KCkgeworICAgIG1CaXRtYXBzID0gTlVMTDsKKyAgICBtTWF0cmljZXMgPSBOVUxMOworICAgIG1QYWludHMgPSBOVUxMOworICAgIG1QYXRoSGVhcCA9IE5VTEw7CisgICAgbUJpdG1hcENvdW50ID0gbU1hdHJpeENvdW50ID0gbVBhaW50Q291bnQgPSAwOworfQorCit2b2lkIERpc3BsYXlMaXN0OjpyZXBsYXkoT3BlbkdMUmVuZGVyZXImIHJlbmRlcmVyKSB7CisgICAgVGV4dENvbnRhaW5lciB0ZXh0OworICAgIG1SZWFkZXIucmV3aW5kKCk7CisKKyAgICBpbnQgc2F2ZUNvdW50ID0gcmVuZGVyZXIuZ2V0U2F2ZUNvdW50KCkgLSAxOworCisgICAgd2hpbGUgKCFtUmVhZGVyLmVvZigpKSB7CisgICAgICAgIHN3aXRjaCAobVJlYWRlci5yZWFkSW50KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQWNxdWlyZUNvbnRleHQ6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5hY3F1aXJlQ29udGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJlbGVhc2VDb250ZXh0OiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIucmVsZWFzZUNvbnRleHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTYXZlOiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2F2ZShnZXRJbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUmVzdG9yZTogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSZXN0b3JlVG9Db3VudDogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCArIGdldEludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTYXZlTGF5ZXI6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5zYXZlTGF5ZXIoZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhaW50KCksIGdldEludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUcmFuc2xhdGU6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci50cmFuc2xhdGUoZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUm90YXRlOiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIucm90YXRlKGdldEZsb2F0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNjYWxlOiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2NhbGUoZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2V0TWF0cml4OiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0TWF0cml4KGdldE1hdHJpeCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDb25jYXRNYXRyaXg6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5jb25jYXRNYXRyaXgoZ2V0TWF0cml4KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENsaXBSZWN0OiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuY2xpcFJlY3QoZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChTa1JlZ2lvbjo6T3ApIGdldEludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcmF3Qml0bWFwOiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd0JpdG1hcChnZXRCaXRtYXAoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0UGFpbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRHJhd0JpdG1hcE1hdHJpeDogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLmRyYXdCaXRtYXAoZ2V0Qml0bWFwKCksIGdldE1hdHJpeCgpLCBnZXRQYWludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcmF3Qml0bWFwUmVjdDogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLmRyYXdCaXRtYXAoZ2V0Qml0bWFwKCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLCBnZXRQYWludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcmF3UGF0Y2g6IHsKKyAgICAgICAgICAgICAgICBpbnQzMl90KiB4RGl2cyA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW50MzJfdCogeURpdnMgPSBOVUxMOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHhEaXZzQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHlEaXZzQ291bnQgPSAwOworCisgICAgICAgICAgICAgICAgU2tCaXRtYXAqIGJpdG1hcCA9IGdldEJpdG1hcCgpOworCisgICAgICAgICAgICAgICAgeERpdnMgPSBnZXRJbnRzKHhEaXZzQ291bnQpOworICAgICAgICAgICAgICAgIHlEaXZzID0gZ2V0SW50cyh5RGl2c0NvdW50KTsKKworICAgICAgICAgICAgICAgIHJlbmRlcmVyLmRyYXdQYXRjaChiaXRtYXAsIHhEaXZzLCB5RGl2cywgeERpdnNDb3VudCwgeURpdnNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldFBhaW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERyYXdDb2xvcjogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLmRyYXdDb2xvcihnZXRJbnQoKSwgKFNrWGZlcm1vZGU6Ok1vZGUpIGdldEludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcmF3UmVjdDogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLmRyYXdSZWN0KGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldFBhaW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERyYXdQYXRoOiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd1BhdGgoZ2V0UGF0aCgpLCBnZXRQYWludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcmF3TGluZXM6IHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgICAgIGZsb2F0KiBwb2ludHMgPSBnZXRGbG9hdHMoY291bnQpOworICAgICAgICAgICAgICAgIHJlbmRlcmVyLmRyYXdMaW5lcyhwb2ludHMsIGNvdW50LCBnZXRQYWludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcmF3VGV4dDogeworICAgICAgICAgICAgICAgIGdldFRleHQoJnRleHQpOworICAgICAgICAgICAgICAgIHJlbmRlcmVyLmRyYXdUZXh0KHRleHQudGV4dCgpLCB0ZXh0Lmxlbmd0aCgpLCBnZXRJbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldFBhaW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJlc2V0U2hhZGVyOiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIucmVzZXRTaGFkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTZXR1cFNoYWRlcjogeworICAgICAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJlc2V0Q29sb3JGaWx0ZXI6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5yZXNldENvbG9yRmlsdGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2V0dXBDb2xvckZpbHRlcjogeworICAgICAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJlc2V0U2hhZG93OiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIucmVzZXRTaGFkb3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTZXR1cFNoYWRvdzogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHVwU2hhZG93KGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIHN0cnVjdHVyZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitEaXNwbGF5TGlzdFJlbmRlcmVyOjpEaXNwbGF5TGlzdFJlbmRlcmVyKCk6CisgICAgICAgIG1IZWFwKEhFQVBfQkxPQ0tfU0laRSksIG1Xcml0ZXIoTUlOX1dSSVRFUl9TSVpFKSB7CisgICAgbUJpdG1hcEluZGV4ID0gbU1hdHJpeEluZGV4ID0gbVBhaW50SW5kZXggPSAxOworICAgIG1QYXRoSGVhcCA9IE5VTEw7Cit9CisKK0Rpc3BsYXlMaXN0UmVuZGVyZXI6On5EaXNwbGF5TGlzdFJlbmRlcmVyKCkgeworICAgIHJlc2V0KCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6cmVzZXQoKSB7CisgICAgaWYgKG1QYXRoSGVhcCkgeworICAgICAgICBtUGF0aEhlYXAtPnVucmVmKCk7CisgICAgICAgIG1QYXRoSGVhcCA9IE5VTEw7CisgICAgfQorCisgICAgbUJpdG1hcHMucmVzZXQoKTsKKyAgICBtTWF0cmljZXMucmVzZXQoKTsKKyAgICBtUGFpbnRzLnJlc2V0KCk7CisKKyAgICBtV3JpdGVyLnJlc2V0KCk7CisgICAgbUhlYXAucmVzZXQoKTsKKworICAgIG1SQ1JlY29yZGVyLnJlc2V0KCk7CisgICAgbVRGUmVjb3JkZXIucmVzZXQoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gT3BlcmF0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgIG1PcnRob01hdHJpeC5sb2FkT3J0aG8oMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEpOworCisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpwcmVwYXJlKGJvb2wgb3BhcXVlKSB7CisgICAgbVNuYXBzaG90ID0gbmV3IFNuYXBzaG90KG1GaXJzdFNuYXBzaG90LAorICAgICAgICAgICAgU2tDYW52YXM6OmtNYXRyaXhfU2F2ZUZsYWcgfCBTa0NhbnZhczo6a0NsaXBfU2F2ZUZsYWcpOworICAgIG1TYXZlQ291bnQgPSAxOworICAgIG1TbmFwc2hvdC0+c2V0Q2xpcCgwLjBmLCAwLjBmLCBtV2lkdGgsIG1IZWlnaHQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmFjcXVpcmVDb250ZXh0KCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpBY3F1aXJlQ29udGV4dCk7CisgICAgT3BlbkdMUmVuZGVyZXI6OmFjcXVpcmVDb250ZXh0KCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6cmVsZWFzZUNvbnRleHQoKSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlJlbGVhc2VDb250ZXh0KTsKKyAgICBPcGVuR0xSZW5kZXJlcjo6cmVsZWFzZUNvbnRleHQoKTsKK30KKworaW50IERpc3BsYXlMaXN0UmVuZGVyZXI6OnNhdmUoaW50IGZsYWdzKSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlNhdmUpOworICAgIGFkZEludChmbGFncyk7CisgICAgcmV0dXJuIE9wZW5HTFJlbmRlcmVyOjpzYXZlKGZsYWdzKTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpyZXN0b3JlKCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpSZXN0b3JlKTsKKyAgICBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZSgpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnJlc3RvcmVUb0NvdW50KGludCBzYXZlQ291bnQpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6UmVzdG9yZVRvQ291bnQpOworICAgIGFkZEludChzYXZlQ291bnQpOworICAgIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworfQorCitpbnQgRGlzcGxheUxpc3RSZW5kZXJlcjo6c2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgY29uc3QgU2tQYWludCogcCwgaW50IGZsYWdzKSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlNhdmVMYXllcik7CisgICAgYWRkQm91bmRzKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgYWRkUGFpbnQocCk7CisgICAgYWRkSW50KGZsYWdzKTsKKyAgICByZXR1cm4gT3BlbkdMUmVuZGVyZXI6OnNhdmUoZmxhZ3MpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6VHJhbnNsYXRlKTsKKyAgICBhZGRQb2ludChkeCwgZHkpOworICAgIE9wZW5HTFJlbmRlcmVyOjp0cmFuc2xhdGUoZHgsIGR5KTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpyb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpSb3RhdGUpOworICAgIGFkZEZsb2F0KGRlZ3JlZXMpOworICAgIE9wZW5HTFJlbmRlcmVyOjpyb3RhdGUoZGVncmVlcyk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6c2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlNjYWxlKTsKKyAgICBhZGRQb2ludChzeCwgc3kpOworICAgIE9wZW5HTFJlbmRlcmVyOjpzY2FsZShzeCwgc3kpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlNldE1hdHJpeCk7CisgICAgYWRkTWF0cml4KG1hdHJpeCk7CisgICAgT3BlbkdMUmVuZGVyZXI6OnNldE1hdHJpeChtYXRyaXgpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmNvbmNhdE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkNvbmNhdE1hdHJpeCk7CisgICAgYWRkTWF0cml4KG1hdHJpeCk7CisgICAgT3BlbkdMUmVuZGVyZXI6OmNvbmNhdE1hdHJpeChtYXRyaXgpOworfQorCitib29sIERpc3BsYXlMaXN0UmVuZGVyZXI6OmNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkNsaXBSZWN0KTsKKyAgICBhZGRCb3VuZHMobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBhZGRJbnQob3ApOworICAgIHJldHVybiBPcGVuR0xSZW5kZXJlcjo6Y2xpcFJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkRyYXdCaXRtYXApOworICAgIGFkZEJpdG1hcChiaXRtYXApOworICAgIGFkZFBvaW50KGxlZnQsIHRvcCk7CisgICAgYWRkUGFpbnQocGFpbnQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6RHJhd0JpdG1hcE1hdHJpeCk7CisgICAgYWRkQml0bWFwKGJpdG1hcCk7CisgICAgYWRkTWF0cml4KG1hdHJpeCk7CisgICAgYWRkUGFpbnQocGFpbnQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLAorICAgICAgICBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLCBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsCisgICAgICAgIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkRyYXdCaXRtYXBSZWN0KTsKKyAgICBhZGRCaXRtYXAoYml0bWFwKTsKKyAgICBhZGRCb3VuZHMoc3JjTGVmdCwgc3JjVG9wLCBzcmNSaWdodCwgc3JjQm90dG9tKTsKKyAgICBhZGRCb3VuZHMoZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKTsKKyAgICBhZGRQYWludChwYWludCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IGludDMyX3QqIHhEaXZzLCBjb25zdCBpbnQzMl90KiB5RGl2cywKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpEcmF3UGF0Y2gpOworICAgIGFkZEJpdG1hcChiaXRtYXApOworICAgIGFkZEludHMoeERpdnMsIHdpZHRoKTsKKyAgICBhZGRJbnRzKHlEaXZzLCBoZWlnaHQpOworICAgIGFkZEJvdW5kcyhsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIGFkZFBhaW50KHBhaW50KTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6RHJhd0NvbG9yKTsKKyAgICBhZGRJbnQoY29sb3IpOworICAgIGFkZEludChtb2RlKTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkRyYXdSZWN0KTsKKyAgICBhZGRCb3VuZHMobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBhZGRQYWludChwYWludCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd1BhdGgoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpEcmF3UGF0aCk7CisgICAgYWRkUGF0aChwYXRoKTsKKyAgICBhZGRQYWludChwYWludCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd0xpbmVzKGZsb2F0KiBwb2ludHMsIGludCBjb3VudCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6RHJhd0xpbmVzKTsKKyAgICBhZGRGbG9hdHMocG9pbnRzLCBjb3VudCk7CisgICAgYWRkUGFpbnQocGFpbnQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkRyYXdUZXh0KTsKKyAgICBhZGRUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgIGFkZEludChjb3VudCk7CisgICAgYWRkUG9pbnQoeCwgeSk7CisgICAgYWRkUGFpbnQocGFpbnQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnJlc2V0U2hhZGVyKCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpSZXNldFNoYWRlcik7CisgICAgT3BlbkdMUmVuZGVyZXI6OnJlc2V0U2hhZGVyKCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6c2V0dXBTaGFkZXIoU2tpYVNoYWRlciogc2hhZGVyKSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgT3BlbkdMUmVuZGVyZXI6OnNldHVwU2hhZGVyKHNoYWRlcik7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6cmVzZXRDb2xvckZpbHRlcigpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6UmVzZXRDb2xvckZpbHRlcik7CisgICAgT3BlbkdMUmVuZGVyZXI6OnJlc2V0Q29sb3JGaWx0ZXIoKTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpzZXR1cENvbG9yRmlsdGVyKFNraWFDb2xvckZpbHRlciogZmlsdGVyKSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgT3BlbkdMUmVuZGVyZXI6OnNldHVwQ29sb3JGaWx0ZXIoZmlsdGVyKTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpyZXNldFNoYWRvdygpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6UmVzZXRTaGFkb3cpOworICAgIE9wZW5HTFJlbmRlcmVyOjpyZXNldFNoYWRvdygpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnNldHVwU2hhZG93KGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6U2V0dXBTaGFkb3cpOworICAgIGFkZEZsb2F0KHJhZGl1cyk7CisgICAgYWRkUG9pbnQoZHgsIGR5KTsKKyAgICBhZGRJbnQoY29sb3IpOworICAgIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRvdyhyYWRpdXMsIGR4LCBkeSwgY29sb3IpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZWNvcmRpbmcgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZmluZChTa1REQXJyYXk8Y29uc3QgU2tGbGF0UGFpbnQqPiYgcGFpbnRzLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChwYWludCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFNrRmxhdFBhaW50KiBmbGF0ID0gU2tGbGF0UGFpbnQ6OkZsYXR0ZW4oJm1IZWFwLCAqcGFpbnQsIG1QYWludEluZGV4LAorICAgICAgICAgICAgJm1SQ1JlY29yZGVyLCAmbVRGUmVjb3JkZXIpOworICAgIGludCBpbmRleCA9IFNrVFNlYXJjaDxTa0ZsYXREYXRhPigoY29uc3QgU2tGbGF0RGF0YSoqKSBwYWludHMuYmVnaW4oKSwKKyAgICAgICAgICAgIHBhaW50cy5jb3VudCgpLCAoU2tGbGF0RGF0YSopIGZsYXQsIHNpemVvZihmbGF0KSwgJlNrRmxhdERhdGE6OkNvbXBhcmUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICh2b2lkKSBtSGVhcC51bmFsbG9jKGZsYXQpOworICAgICAgICByZXR1cm4gcGFpbnRzW2luZGV4XS0+aW5kZXgoKTsKKyAgICB9CisKKyAgICBpbmRleCA9IH5pbmRleDsKKyAgICAqcGFpbnRzLmluc2VydChpbmRleCkgPSBmbGF0OworICAgIHJldHVybiBtUGFpbnRJbmRleCsrOworfQorCitpbnQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZmluZChTa1REQXJyYXk8Y29uc3QgU2tGbGF0TWF0cml4Kj4mIG1hdHJpY2VzLCBjb25zdCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFNrRmxhdE1hdHJpeCogZmxhdCA9IFNrRmxhdE1hdHJpeDo6RmxhdHRlbigmbUhlYXAsICptYXRyaXgsIG1NYXRyaXhJbmRleCk7CisgICAgaW50IGluZGV4ID0gU2tUU2VhcmNoPFNrRmxhdERhdGE+KChjb25zdCBTa0ZsYXREYXRhKiopIG1hdHJpY2VzLmJlZ2luKCksCisgICAgICAgICAgICBtYXRyaWNlcy5jb3VudCgpLCAoU2tGbGF0RGF0YSopIGZsYXQsIHNpemVvZihmbGF0KSwgJlNrRmxhdERhdGE6OkNvbXBhcmUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICh2b2lkKSBtSGVhcC51bmFsbG9jKGZsYXQpOworICAgICAgICByZXR1cm4gbWF0cmljZXNbaW5kZXhdLT5pbmRleCgpOworICAgIH0KKyAgICBpbmRleCA9IH5pbmRleDsKKyAgICAqbWF0cmljZXMuaW5zZXJ0KGluZGV4KSA9IGZsYXQ7CisgICAgcmV0dXJuIG1NYXRyaXhJbmRleCsrOworfQorCitpbnQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZmluZChTa1REQXJyYXk8Y29uc3QgU2tGbGF0Qml0bWFwKj4mIGJpdG1hcHMsIGNvbnN0IFNrQml0bWFwJiBiaXRtYXApIHsKKyAgICBTa0ZsYXRCaXRtYXAqIGZsYXQgPSBTa0ZsYXRCaXRtYXA6OkZsYXR0ZW4oJm1IZWFwLCBiaXRtYXAsIG1CaXRtYXBJbmRleCwgJm1SQ1JlY29yZGVyKTsKKyAgICBpbnQgaW5kZXggPSBTa1RTZWFyY2g8U2tGbGF0RGF0YT4oKGNvbnN0IFNrRmxhdERhdGEqKikgYml0bWFwcy5iZWdpbigpLAorICAgICAgICAgICAgYml0bWFwcy5jb3VudCgpLCAoU2tGbGF0RGF0YSopIGZsYXQsIHNpemVvZihmbGF0KSwgJlNrRmxhdERhdGE6OkNvbXBhcmUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICh2b2lkKSBtSGVhcC51bmFsbG9jKGZsYXQpOworICAgICAgICByZXR1cm4gYml0bWFwc1tpbmRleF0tPmluZGV4KCk7CisgICAgfQorICAgIGluZGV4ID0gfmluZGV4OworICAgICpiaXRtYXBzLmluc2VydChpbmRleCkgPSBmbGF0OworICAgIHJldHVybiBtQml0bWFwSW5kZXgrKzsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5oIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmJmY2UxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuaApAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9ESVNQTEFZX0xJU1RfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX0RJU1BMQVlfTElTVF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDxTa0NodW5rQWxsb2MuaD4KKyNpbmNsdWRlIDxTa0ZsYXR0ZW5hYmxlLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tQYXRoLmg+CisjaW5jbHVkZSA8U2tQaWN0dXJlRmxhdC5oPgorI2luY2x1ZGUgPFNrUmVmQ250Lmg+CisjaW5jbHVkZSA8U2tUREFycmF5Lmg+CisjaW5jbHVkZSA8U2tUU2VhcmNoLmg+CisKKyNpbmNsdWRlICJPcGVuR0xSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBNSU5fV1JJVEVSX1NJWkUgMTYzODQKKyNkZWZpbmUgSEVBUF9CTE9DS19TSVpFIDQwOTYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSGVscGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBQYXRoSGVhcDogcHVibGljIFNrUmVmQ250IHsKK3B1YmxpYzoKKyAgICBQYXRoSGVhcCgpOworICAgIFBhdGhIZWFwKFNrRmxhdHRlbmFibGVSZWFkQnVmZmVyJiBidWZmZXIpOworICAgIH5QYXRoSGVhcCgpOworCisgICAgaW50IGFwcGVuZChjb25zdCBTa1BhdGgmIHBhdGgpOworCisgICAgaW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4gbVBhdGhzLmNvdW50KCk7IH0KKworICAgIFNrUGF0aCYgb3BlcmF0b3JbXShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICptUGF0aHNbaW5kZXhdOworICAgIH0KKworICAgIHZvaWQgZmxhdHRlbihTa0ZsYXR0ZW5hYmxlV3JpdGVCdWZmZXImIGJ1ZmZlcikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgU2tDaHVua0FsbG9jIG1IZWFwOworICAgIFNrVERBcnJheTxTa1BhdGgqPiBtUGF0aHM7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEaXNwbGF5IGxpc3QKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRGlzcGxheUxpc3RSZW5kZXJlcjsKKworLyoqCisgKiBSZXBsYXlzIHJlY29yZGVkIGRyYXdpbmcgY29tbWFuZHMuCisgKi8KK2NsYXNzIERpc3BsYXlMaXN0IHsKK3B1YmxpYzoKKyAgICBEaXNwbGF5TGlzdChjb25zdCBEaXNwbGF5TGlzdFJlbmRlcmVyJiByZWNvcmRlcik7CisgICAgfkRpc3BsYXlMaXN0KCk7CisKKyAgICBlbnVtIE9wIHsKKyAgICAgICAgQWNxdWlyZUNvbnRleHQsCisgICAgICAgIFJlbGVhc2VDb250ZXh0LAorICAgICAgICBTYXZlLAorICAgICAgICBSZXN0b3JlLAorICAgICAgICBSZXN0b3JlVG9Db3VudCwKKyAgICAgICAgU2F2ZUxheWVyLAorICAgICAgICBUcmFuc2xhdGUsCisgICAgICAgIFJvdGF0ZSwKKyAgICAgICAgU2NhbGUsCisgICAgICAgIFNldE1hdHJpeCwKKyAgICAgICAgQ29uY2F0TWF0cml4LAorICAgICAgICBDbGlwUmVjdCwKKyAgICAgICAgRHJhd0JpdG1hcCwKKyAgICAgICAgRHJhd0JpdG1hcE1hdHJpeCwKKyAgICAgICAgRHJhd0JpdG1hcFJlY3QsCisgICAgICAgIERyYXdQYXRjaCwKKyAgICAgICAgRHJhd0NvbG9yLAorICAgICAgICBEcmF3UmVjdCwKKyAgICAgICAgRHJhd1BhdGgsCisgICAgICAgIERyYXdMaW5lcywKKyAgICAgICAgRHJhd1RleHQsCisgICAgICAgIFJlc2V0U2hhZGVyLAorICAgICAgICBTZXR1cFNoYWRlciwKKyAgICAgICAgUmVzZXRDb2xvckZpbHRlciwKKyAgICAgICAgU2V0dXBDb2xvckZpbHRlciwKKyAgICAgICAgUmVzZXRTaGFkb3csCisgICAgICAgIFNldHVwU2hhZG93CisgICAgfTsKKworICAgIHZvaWQgcmVwbGF5KE9wZW5HTFJlbmRlcmVyJiByZW5kZXJlcik7CisKK3ByaXZhdGU6CisgICAgdm9pZCBpbml0KCk7CisKKyAgICBjbGFzcyBUZXh0Q29udGFpbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUJ5dGVMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyKiB0ZXh0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChjb25zdCBjaGFyKikgbVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbUJ5dGVMZW5ndGg7CisgICAgICAgIGNvbnN0IGNoYXIqIG1UZXh0OworICAgIH07CisKKyAgICBTa0JpdG1hcCogZ2V0Qml0bWFwKCkgeworICAgICAgICBpbnQgaW5kZXggPSBnZXRJbnQoKTsKKyAgICAgICAgcmV0dXJuICZtQml0bWFwc1tpbmRleCAtIDFdOworICAgIH0KKworICAgIGlubGluZSBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBtUmVhZGVyLnJlYWRJbnQoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgaW50IGdldEludCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZWFkZXIucmVhZEludCgpOworICAgIH0KKworICAgIFNrTWF0cml4KiBnZXRNYXRyaXgoKSB7CisgICAgICAgIGludCBpbmRleCA9IGdldEludCgpOworICAgICAgICBpZiAoaW5kZXggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICZtTWF0cmljZXNbaW5kZXggLSAxXTsKKyAgICB9CisKKyAgICBTa1BhdGgqIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAmKCptUGF0aEhlYXApW2dldEludCgpIC0gMV07CisgICAgfQorCisgICAgU2tQYWludCogZ2V0UGFpbnQoKSB7CisgICAgICAgIGludCBpbmRleCA9IGdldEludCgpOworICAgICAgICBpZiAoaW5kZXggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICZtUGFpbnRzW2luZGV4IC0gMV07CisgICAgfQorCisgICAgaW5saW5lIGZsb2F0IGdldEZsb2F0KCkgeworICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkU2NhbGFyKCk7CisgICAgfQorCisgICAgaW50MzJfdCogZ2V0SW50cyh1aW50MzJfdCYgY291bnQpIHsKKyAgICAgICAgY291bnQgPSBnZXRJbnQoKTsKKyAgICAgICAgcmV0dXJuIChpbnQzMl90KikgbVJlYWRlci5za2lwKGNvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICB9CisKKyAgICBmbG9hdCogZ2V0RmxvYXRzKGludCYgY291bnQpIHsKKyAgICAgICAgY291bnQgPSBnZXRJbnQoKTsKKyAgICAgICAgcmV0dXJuIChmbG9hdCopIG1SZWFkZXIuc2tpcChjb3VudCAqIHNpemVvZihmbG9hdCkpOworICAgIH0KKworICAgIHZvaWQgZ2V0VGV4dChUZXh0Q29udGFpbmVyKiB0ZXh0KSB7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSB0ZXh0LT5tQnl0ZUxlbmd0aCA9IGdldEludCgpOworICAgICAgICB0ZXh0LT5tVGV4dCA9IChjb25zdCBjaGFyKikgbVJlYWRlci5za2lwKGxlbmd0aCk7CisgICAgfQorCisgICAgUGF0aEhlYXAqIG1QYXRoSGVhcDsKKworICAgIFNrQml0bWFwKiBtQml0bWFwczsKKyAgICBpbnQgbUJpdG1hcENvdW50OworCisgICAgU2tNYXRyaXgqIG1NYXRyaWNlczsKKyAgICBpbnQgbU1hdHJpeENvdW50OworCisgICAgU2tQYWludCogbVBhaW50czsKKyAgICBpbnQgbVBhaW50Q291bnQ7CisKKyAgICBtdXRhYmxlIFNrRmxhdHRlbmFibGVSZWFkQnVmZmVyIG1SZWFkZXI7CisKKyAgICBTa1JlZkNudFBsYXliYWNrIG1SQ1BsYXliYWNrOworICAgIFNrVHlwZWZhY2VQbGF5YmFjayBtVEZQbGF5YmFjazsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlbmRlcmVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogUmVjb3JkcyBkcmF3aW5nIGNvbW1hbmRzIGluIGEgZGlzcGxheSBsaXN0IGZvciBsYXR0ZXIgcGxheWJhY2suCisgKi8KK2NsYXNzIERpc3BsYXlMaXN0UmVuZGVyZXI6IHB1YmxpYyBPcGVuR0xSZW5kZXJlciB7CitwdWJsaWM6CisgICAgRGlzcGxheUxpc3RSZW5kZXJlcigpOworICAgIH5EaXNwbGF5TGlzdFJlbmRlcmVyKCk7CisKKyAgICB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgdm9pZCBwcmVwYXJlKGJvb2wgb3BhcXVlKTsKKworICAgIHZvaWQgYWNxdWlyZUNvbnRleHQoKTsKKyAgICB2b2lkIHJlbGVhc2VDb250ZXh0KCk7CisKKyAgICBpbnQgc2F2ZShpbnQgZmxhZ3MpOworICAgIHZvaWQgcmVzdG9yZSgpOworICAgIHZvaWQgcmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCk7CisKKyAgICBpbnQgc2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGNvbnN0IFNrUGFpbnQqIHAsIGludCBmbGFncyk7CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpOworICAgIHZvaWQgcm90YXRlKGZsb2F0IGRlZ3JlZXMpOworICAgIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIHZvaWQgc2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworICAgIHZvaWQgY29uY2F0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworCisgICAgYm9vbCBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFNrUmVnaW9uOjpPcCBvcCk7CisKKyAgICB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLAorICAgICAgICAgICAgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLAorICAgICAgICAgICAgZmxvYXQgZHN0UmlnaHQsIGZsb2F0IGRzdEJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IGludDMyX3QqIHhEaXZzLCBjb25zdCBpbnQzMl90KiB5RGl2cywKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdDb2xvcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisgICAgdm9pZCBkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdQYXRoKFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0xpbmVzKGZsb2F0KiBwb2ludHMsIGludCBjb3VudCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpOworCisgICAgdm9pZCByZXNldFNoYWRlcigpOworICAgIHZvaWQgc2V0dXBTaGFkZXIoU2tpYVNoYWRlciogc2hhZGVyKTsKKworICAgIHZvaWQgcmVzZXRDb2xvckZpbHRlcigpOworICAgIHZvaWQgc2V0dXBDb2xvckZpbHRlcihTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcik7CisKKyAgICB2b2lkIHJlc2V0U2hhZG93KCk7CisgICAgdm9pZCBzZXR1cFNoYWRvdyhmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIERpc3BsYXlMaXN0KiBnZXREaXNwbGF5TGlzdCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXNwbGF5TGlzdCgqdGhpcyk7CisgICAgfQorCisgICAgY29uc3QgU2tXcml0ZXIzMiYgd3JpdGVTdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV3JpdGVyOworICAgIH0KKworICAgIGNvbnN0IFNrVERBcnJheTxjb25zdCBTa0ZsYXRCaXRtYXAqPiYgZ2V0Qml0bWFwcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CaXRtYXBzOworICAgIH0KKworICAgIGNvbnN0IFNrVERBcnJheTxjb25zdCBTa0ZsYXRNYXRyaXgqPiYgZ2V0TWF0cmljZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWF0cmljZXM7CisgICAgfQorCisgICAgY29uc3QgU2tUREFycmF5PGNvbnN0IFNrRmxhdFBhaW50Kj4mIGdldFBhaW50cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QYWludHM7CisgICAgfQorCitwcml2YXRlOgorICAgIGlubGluZSB2b2lkIGFkZE9wKERpc3BsYXlMaXN0OjpPcCBkcmF3T3ApIHsKKyAgICAgICAgbVdyaXRlci53cml0ZUludChkcmF3T3ApOworICAgIH0KKworICAgIGlubGluZSB2b2lkIGFkZEludChpbnQgdmFsdWUpIHsKKyAgICAgICAgbVdyaXRlci53cml0ZUludCh2YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCBhZGRJbnRzKGNvbnN0IGludDMyX3QqIHZhbHVlcywgdWludDMyX3QgY291bnQpIHsKKyAgICAgICAgbVdyaXRlci53cml0ZUludChjb3VudCk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtV3JpdGVyLndyaXRlSW50KHZhbHVlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBhZGRGbG9hdChmbG9hdCB2YWx1ZSkgeworICAgICAgICBtV3JpdGVyLndyaXRlU2NhbGFyKHZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEZsb2F0cyhjb25zdCBmbG9hdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICAgICAgbVdyaXRlci53cml0ZUludChjb3VudCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgbVdyaXRlci53cml0ZVNjYWxhcih2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgYWRkUG9pbnQoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtV3JpdGVyLndyaXRlU2NhbGFyKHgpOworICAgICAgICBtV3JpdGVyLndyaXRlU2NhbGFyKHkpOworICAgIH0KKworICAgIGlubGluZSB2b2lkIGFkZEJvdW5kcyhmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgbVdyaXRlci53cml0ZVNjYWxhcihsZWZ0KTsKKyAgICAgICAgbVdyaXRlci53cml0ZVNjYWxhcih0b3ApOworICAgICAgICBtV3JpdGVyLndyaXRlU2NhbGFyKHJpZ2h0KTsKKyAgICAgICAgbVdyaXRlci53cml0ZVNjYWxhcihib3R0b20pOworICAgIH0KKworICAgIGlubGluZSB2b2lkIGFkZFRleHQoY29uc3Qgdm9pZCogdGV4dCwgc2l6ZV90IGJ5dGVMZW5ndGgpIHsKKyAgICAgICAgbVdyaXRlci53cml0ZUludChieXRlTGVuZ3RoKTsKKyAgICAgICAgbVdyaXRlci53cml0ZVBhZCh0ZXh0LCBieXRlTGVuZ3RoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBhZGRQYXRoKGNvbnN0IFNrUGF0aCogcGF0aCkgeworICAgICAgICBpZiAobVBhdGhIZWFwID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1QYXRoSGVhcCA9IG5ldyBQYXRoSGVhcCgpOworICAgICAgICB9CisgICAgICAgIGFkZEludChtUGF0aEhlYXAtPmFwcGVuZCgqcGF0aCkpOworICAgIH0KKworICAgIGludCBmaW5kKFNrVERBcnJheTxjb25zdCBTa0ZsYXRQYWludCo+JiBwYWludHMsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKworICAgIGlubGluZSB2b2lkIGFkZFBhaW50KGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgIGFkZEludChmaW5kKG1QYWludHMsIHBhaW50KSk7CisgICAgfQorCisgICAgaW50IGZpbmQoU2tUREFycmF5PGNvbnN0IFNrRmxhdE1hdHJpeCo+JiBtYXRyaWNlcywgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCk7CisKKyAgICBpbmxpbmUgdm9pZCBhZGRNYXRyaXgoY29uc3QgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgICAgICBhZGRJbnQoZmluZChtTWF0cmljZXMsIG1hdHJpeCkpOworICAgIH0KKworICAgIGludCBmaW5kKFNrVERBcnJheTxjb25zdCBTa0ZsYXRCaXRtYXAqPiYgYml0bWFwcywgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCk7CisKKyAgICBpbmxpbmUgdm9pZCBhZGRCaXRtYXAoY29uc3QgU2tCaXRtYXAqIGJpdG1hcCkgeworICAgICAgICBhZGRJbnQoZmluZChtQml0bWFwcywgKmJpdG1hcCkpOworICAgIH0KKworICAgIFNrQ2h1bmtBbGxvYyBtSGVhcDsKKworICAgIGludCBtQml0bWFwSW5kZXg7CisgICAgU2tUREFycmF5PGNvbnN0IFNrRmxhdEJpdG1hcCo+IG1CaXRtYXBzOworCisgICAgaW50IG1NYXRyaXhJbmRleDsKKyAgICBTa1REQXJyYXk8Y29uc3QgU2tGbGF0TWF0cml4Kj4gbU1hdHJpY2VzOworCisgICAgaW50IG1QYWludEluZGV4OworICAgIFNrVERBcnJheTxjb25zdCBTa0ZsYXRQYWludCo+IG1QYWludHM7CisKKyAgICBQYXRoSGVhcCogbVBhdGhIZWFwOworICAgIFNrV3JpdGVyMzIgbVdyaXRlcjsKKworICAgIFNrUmVmQ250UmVjb3JkZXIgbVJDUmVjb3JkZXI7CisgICAgU2tSZWZDbnRSZWNvcmRlciBtVEZSZWNvcmRlcjsKKworICAgIGZyaWVuZCBjbGFzcyBEaXNwbGF5TGlzdDsKKworfTsgLy8gY2xhc3MgRGlzcGxheUxpc3RSZW5kZXJlcgorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfRElTUExBWV9MSVNUX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9FeHRlbnNpb25zLmggYi9saWJzL2h3dWkvRXh0ZW5zaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MGQzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvRXh0ZW5zaW9ucy5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfRVhURU5TSU9OU19ICisjZGVmaW5lIEFORFJPSURfVUlfRVhURU5TSU9OU19ICisKKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX0VYVEVOU0lPTlMgMAorCisvLyBEZWJ1ZworI2lmIERFQlVHX0VYVEVOU0lPTlMKKyAgICAjZGVmaW5lIEVYVF9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBFWFRfTE9HRCguLi4pCisjZW5kaWYKKworY2xhc3MgRXh0ZW5zaW9ucyB7CitwdWJsaWM6CisgICAgRXh0ZW5zaW9ucygpIHsKKyAgICAgICAgY29uc3QgY2hhciogYnVmZmVyID0gKGNvbnN0IGNoYXIqKSBnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKTsKKyAgICAgICAgY29uc3QgY2hhciogY3VycmVudCA9IGJ1ZmZlcjsKKyAgICAgICAgY29uc3QgY2hhciogaGVhZCA9IGN1cnJlbnQ7CisgICAgICAgIEVYVF9MT0dEKCJBdmFpbGFibGUgR0wgZXh0ZW5zaW9uczoiKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaGVhZCA9IHN0cmNocihjdXJyZW50LCAnICcpOworICAgICAgICAgICAgU3RyaW5nOCBzKGN1cnJlbnQsIGhlYWQgPyBoZWFkIC0gY3VycmVudCA6IHN0cmxlbihjdXJyZW50KSk7CisgICAgICAgICAgICBpZiAocy5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIG1FeHRlbnNpb25MaXN0LmFkZChzKTsKKyAgICAgICAgICAgICAgICBFWFRfTE9HRCgiICAlcyIsIHMuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudCA9IGhlYWQgKyAxOworICAgICAgICB9IHdoaWxlIChoZWFkKTsKKworICAgICAgICBtSGFzTlBvdCA9IGhhc0V4dGVuc2lvbigiR0xfT0VTX3RleHR1cmVfbnBvdCIpOworICAgICAgICBtSGFzRHJhd1BhdGggPSBoYXNFeHRlbnNpb24oIkdMX05WX2RyYXdfcGF0aCIpOworICAgICAgICBtSGFzQ292ZXJhZ2VTYW1wbGUgPSBoYXNFeHRlbnNpb24oIkdMX05WX2NvdmVyYWdlX3NhbXBsZSIpOworICAgICAgICBtSGFzRnJhbWVidWZmZXJGZXRjaCA9IGhhc0V4dGVuc2lvbigiR0xfTlZfc2hhZGVyX2ZyYW1lYnVmZmVyX2ZldGNoIik7CisKKyAgICAgICAgbUV4dGVuc2lvbnMgPSBidWZmZXI7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgaGFzTlBvdCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNOUG90OyB9CisgICAgaW5saW5lIGJvb2wgaGFzRHJhd1BhdGgoKSBjb25zdCB7IHJldHVybiBtSGFzRHJhd1BhdGg7IH0KKyAgICBpbmxpbmUgYm9vbCBoYXNDb3ZlcmFnZVNhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNDb3ZlcmFnZVNhbXBsZTsgfQorICAgIGlubGluZSBib29sIGhhc0ZyYW1lYnVmZmVyRmV0Y2goKSBjb25zdCB7IHJldHVybiBtSGFzRnJhbWVidWZmZXJGZXRjaDsgfQorCisgICAgYm9vbCBoYXNFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdCB7CisgICAgICAgIGNvbnN0IFN0cmluZzggcyhleHRlbnNpb24pOworICAgICAgICByZXR1cm4gbUV4dGVuc2lvbkxpc3QuaW5kZXhPZihzKSA+PSAwOworICAgIH0KKworICAgIHZvaWQgZHVtcCgpIHsKKyAgICAgICAgTE9HRCgiU3VwcG9ydGVkIGV4dGVuc2lvbnM6XG4lcyIsIG1FeHRlbnNpb25zKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IG1FeHRlbnNpb25MaXN0OworCisgICAgY29uc3QgY2hhciogbUV4dGVuc2lvbnM7CisKKyAgICBib29sIG1IYXNOUG90OworICAgIGJvb2wgbUhhc0RyYXdQYXRoOworICAgIGJvb2wgbUhhc0NvdmVyYWdlU2FtcGxlOworICAgIGJvb2wgbUhhc0ZyYW1lYnVmZmVyRmV0Y2g7Cit9OyAvLyBjbGFzcyBFeHRlbnNpb25zCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9FWFRFTlNJT05TX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9GYm9DYWNoZS5jcHAgYi9saWJzL2h3dWkvRmJvQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjcxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvRmJvQ2FjaGUuY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJGYm9DYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitGYm9DYWNoZTo6RmJvQ2FjaGUoKTogbU1heFNpemUoREVGQVVMVF9GQk9fQ0FDSEVfU0laRSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0ZCT19DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyBmYm8gY2FjaGUgc2l6ZSB0byAlcyIsIHByb3BlcnR5KTsKKyAgICAgICAgbU1heFNpemUgPSBhdG9pKHByb3BlcnR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgZmJvIGNhY2hlIHNpemUgb2YgJWQiLCBERUZBVUxUX0ZCT19DQUNIRV9TSVpFKTsKKyAgICB9Cit9CisKK0Zib0NhY2hlOjp+RmJvQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IEZib0NhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtQ2FjaGUuc2l6ZSgpOworfQorCit1aW50MzJfdCBGYm9DYWNoZTo6Z2V0TWF4U2l6ZSgpIHsKKyAgICByZXR1cm4gbU1heFNpemU7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBGYm9DYWNoZTo6Y2xlYXIoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2FjaGUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgR0x1aW50IGZibyA9IG1DYWNoZS5pdGVtQXQoaSk7CisgICAgICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZmYm8pOworICAgIH0KKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKworR0x1aW50IEZib0NhY2hlOjpnZXQoKSB7CisgICAgR0x1aW50IGZibzsKKyAgICBpZiAobUNhY2hlLnNpemUoKSA+IDApIHsKKyAgICAgICAgZmJvID0gbUNhY2hlLml0ZW1BdChtQ2FjaGUuc2l6ZSgpIC0gMSk7CisgICAgICAgIG1DYWNoZS5yZW1vdmVBdChtQ2FjaGUuc2l6ZSgpIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xHZW5GcmFtZWJ1ZmZlcnMoMSwgJmZibyk7CisgICAgfQorICAgIHJldHVybiBmYm87Cit9CisKK2Jvb2wgRmJvQ2FjaGU6OnB1dChHTHVpbnQgZmJvKSB7CisgICAgaWYgKG1DYWNoZS5zaXplKCkgPCBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUuYWRkKGZibyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZmYm8pOworICAgIHJldHVybiBmYWxzZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRmJvQ2FjaGUuaCBiL2xpYnMvaHd1aS9GYm9DYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNGFmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvRmJvQ2FjaGUuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0ZCT19DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfRkJPX0NBQ0hFX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRmJvQ2FjaGUgeworcHVibGljOgorICAgIEZib0NhY2hlKCk7CisgICAgfkZib0NhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIEZCTyBmcm9tIHRoZSBjYWNoZS4gSWYgbm8gRkJPIGlzIGF2YWlsYWJsZSwgYSBuZXcgb25lCisgICAgICogaXMgY3JlYXRlZC4gSWYgY3JlYXRpbmcgYSBuZXcgRkJPIGZhaWxzLCAwIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogV2hlbiBhbiBGQk8gaXMgb2J0YWluZWQgZnJvbSB0aGUgY2FjaGUsIGl0IGlzIHJlbW92ZWQgYW5kIHRoZQorICAgICAqIHRvdGFsIG51bWJlciBvZiBGQk9zIGF2YWlsYWJsZSBpbiB0aGUgY2FjaGUgZGVjcmVhc2VzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgRkJPLCBvciAwIGlmIG5vIEZCTyBjYW4gYmUgb2J0YWluZWQuCisgICAgICovCisgICAgR0x1aW50IGdldCgpOworCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIEZCTyB0byB0aGUgY2FjaGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmJvIFRoZSBGQk8gdG8gYWRkIHRvIHRoZSBjYWNoZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgRkJPIHdhcyBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcHV0KEdMdWludCBmYm8pOworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIEZCT3MgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIEZCT3MgdGhhdCB0aGUgY2FjaGUgY2FuIGhvbGQuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworCitwcml2YXRlOgorICAgIFNvcnRlZFZlY3RvcjxHTHVpbnQ+IG1DYWNoZTsKKyAgICB1aW50MzJfdCBtTWF4U2l6ZTsKK307IC8vIGNsYXNzIEZib0NhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9GQk9fQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg5ZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAKQEAgLTAsMCArMSw4MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8U2tVdGlscy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRm9udFJlbmRlcmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIERFRkFVTFRfVEVYVF9DQUNIRV9XSURUSCAxMDI0CisjZGVmaW5lIERFRkFVTFRfVEVYVF9DQUNIRV9IRUlHSFQgMjU2CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZvbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRm9udDo6Rm9udChGb250UmVuZGVyZXIqIHN0YXRlLCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKSA6CisgICAgbVN0YXRlKHN0YXRlKSwgbUZvbnRJZChmb250SWQpLCBtRm9udFNpemUoZm9udFNpemUpIHsKK30KKworCitGb250Ojp+Rm9udCgpIHsKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtU3RhdGUtPm1BY3RpdmVGb250cy5zaXplKCk7IGN0KyspIHsKKyAgICAgICAgaWYgKG1TdGF0ZS0+bUFjdGl2ZUZvbnRzW2N0XSA9PSB0aGlzKSB7CisgICAgICAgICAgICBtU3RhdGUtPm1BY3RpdmVGb250cy5yZW1vdmVBdChjdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVkR2x5cGhzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIENhY2hlZEdseXBoSW5mbyogZ2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSk7CisgICAgICAgIGRlbGV0ZSBnbHlwaDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6aW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkrKykgeworICAgICAgICBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSktPm1Jc1ZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZvbnQ6Om1lYXN1cmVDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHksIFJlY3QgKmJvdW5kcykgeworICAgIGludCBuUGVuWCA9IHggKyBnbHlwaC0+bUJpdG1hcExlZnQ7CisgICAgaW50IG5QZW5ZID0geSArIGdseXBoLT5tQml0bWFwVG9wOworCisgICAgaW50IHdpZHRoID0gKGludCkgZ2x5cGgtPm1CaXRtYXBXaWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gKGludCkgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBpZiAoYm91bmRzLT5ib3R0b20gPiBuUGVuWSkgeworICAgICAgICBib3VuZHMtPmJvdHRvbSA9IG5QZW5ZOworICAgIH0KKyAgICBpZiAoYm91bmRzLT5sZWZ0ID4gblBlblgpIHsKKyAgICAgICAgYm91bmRzLT5sZWZ0ID0gblBlblg7CisgICAgfQorICAgIGlmIChib3VuZHMtPnJpZ2h0IDwgblBlblggKyB3aWR0aCkgeworICAgICAgICBib3VuZHMtPnJpZ2h0ID0gblBlblggKyB3aWR0aDsKKyAgICB9CisgICAgaWYgKGJvdW5kcy0+dG9wIDwgblBlblkgKyBoZWlnaHQpIHsKKyAgICAgICAgYm91bmRzLT50b3AgPSBuUGVuWSArIGhlaWdodDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6ZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyogZ2x5cGgsIGludCB4LCBpbnQgeSkgeworICAgIGludCBuUGVuWCA9IHggKyBnbHlwaC0+bUJpdG1hcExlZnQ7CisgICAgaW50IG5QZW5ZID0geSArIGdseXBoLT5tQml0bWFwVG9wICsgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBmbG9hdCB1MSA9IGdseXBoLT5tQml0bWFwTWluVTsKKyAgICBmbG9hdCB1MiA9IGdseXBoLT5tQml0bWFwTWF4VTsKKyAgICBmbG9hdCB2MSA9IGdseXBoLT5tQml0bWFwTWluVjsKKyAgICBmbG9hdCB2MiA9IGdseXBoLT5tQml0bWFwTWF4VjsKKworICAgIGludCB3aWR0aCA9IChpbnQpIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgaW50IGhlaWdodCA9IChpbnQpIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgbVN0YXRlLT5hcHBlbmRNZXNoUXVhZChuUGVuWCwgblBlblksIDAsIHUxLCB2MiwKKyAgICAgICAgICAgIG5QZW5YICsgd2lkdGgsIG5QZW5ZLCAwLCB1MiwgdjIsCisgICAgICAgICAgICBuUGVuWCArIHdpZHRoLCBuUGVuWSAtIGhlaWdodCwgMCwgdTIsIHYxLAorICAgICAgICAgICAgblBlblgsIG5QZW5ZIC0gaGVpZ2h0LCAwLCB1MSwgdjEpOworfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8qIGdseXBoLCBpbnQgeCwgaW50IHksCisgICAgICAgIHVpbnQ4X3QqIGJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCkgeworICAgIGludCBuUGVuWCA9IHggKyBnbHlwaC0+bUJpdG1hcExlZnQ7CisgICAgaW50IG5QZW5ZID0geSArIGdseXBoLT5tQml0bWFwVG9wOworCisgICAgdWludDMyX3QgZW5kWCA9IGdseXBoLT5tU3RhcnRYICsgZ2x5cGgtPm1CaXRtYXBXaWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gZ2x5cGgtPm1TdGFydFkgKyBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBtU3RhdGUtPmdldENhY2hlV2lkdGgoKTsKKyAgICBjb25zdCB1aW50OF90KiBjYWNoZUJ1ZmZlciA9IG1TdGF0ZS0+Z2V0VGV4dFRleHR1cmVEYXRhKCk7CisKKyAgICB1aW50MzJfdCBjYWNoZVggPSAwLCBjYWNoZVkgPSAwOworICAgIGludDMyX3QgYlggPSAwLCBiWSA9IDA7CisgICAgZm9yIChjYWNoZVggPSBnbHlwaC0+bVN0YXJ0WCwgYlggPSBuUGVuWDsgY2FjaGVYIDwgZW5kWDsgY2FjaGVYKyssIGJYKyspIHsKKyAgICAgICAgZm9yIChjYWNoZVkgPSBnbHlwaC0+bVN0YXJ0WSwgYlkgPSBuUGVuWTsgY2FjaGVZIDwgZW5kWTsgY2FjaGVZKyssIGJZKyspIHsKKyAgICAgICAgICAgIGlmIChiWCA8IDAgfHwgYlkgPCAwIHx8IGJYID49IChpbnQzMl90KSBiaXRtYXBXIHx8IGJZID49IChpbnQzMl90KSBiaXRtYXBIKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiU2tpcHBpbmcgaW52YWxpZCBpbmRleCIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCB0ZW1wQ29sID0gY2FjaGVCdWZmZXJbY2FjaGVZICogY2FjaGVXaWR0aCArIGNhY2hlWF07CisgICAgICAgICAgICBiaXRtYXBbYlkgKiBiaXRtYXBXICsgYlhdID0gdGVtcENvbDsKKyAgICAgICAgfQorICAgIH0KKworfQorCitGb250OjpDYWNoZWRHbHlwaEluZm8qIEZvbnQ6OmdldENhY2hlZFVURkNoYXIoU2tQYWludCogcGFpbnQsIGludDMyX3QgdXRmQ2hhcikgeworICAgIENhY2hlZEdseXBoSW5mbyogY2FjaGVkR2x5cGggPSBOVUxMOworICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGVkR2x5cGhzLmluZGV4T2ZLZXkodXRmQ2hhcik7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgY2FjaGVkR2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhY2hlZEdseXBoID0gY2FjaGVHbHlwaChwYWludCwgdXRmQ2hhcik7CisgICAgfQorCisgICAgLy8gSXMgdGhlIGdseXBoIHN0aWxsIGluIHRleHR1cmUgY2FjaGU/CisgICAgaWYgKCFjYWNoZWRHbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoID0gcGFpbnQtPmdldFVuaWNoYXJNZXRyaWNzKHV0ZkNoYXIpOworICAgICAgICB1cGRhdGVHbHlwaENhY2hlKHBhaW50LCBza2lhR2x5cGgsIGNhY2hlZEdseXBoKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2FjaGVkR2x5cGg7Cit9CisKK3ZvaWQgRm9udDo6cmVuZGVyVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAorICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCkgeworICAgIGlmIChiaXRtYXAgIT0gTlVMTCAmJiBiaXRtYXBXID4gMCAmJiBiaXRtYXBIID4gMCkgeworICAgICAgICByZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgeCwgeSwgQklUTUFQLCBiaXRtYXAsCisgICAgICAgICAgICAgICAgYml0bWFwVywgYml0bWFwSCwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydCwgbGVuLCBudW1HbHlwaHMsIHgsIHksIEZSQU1FQlVGRkVSLCBOVUxMLCAwLCAwLCBOVUxMKTsKKyAgICB9CisKK30KKwordm9pZCBGb250OjptZWFzdXJlVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAorICAgICAgICBpbnQgbnVtR2x5cGhzLCBSZWN0ICpib3VuZHMpIHsKKyAgICBpZiAoYm91bmRzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTm8gcmV0dXJuIHJlY3RhbmdsZSBwcm92aWRlZCB0byBtZWFzdXJlIHRleHQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib3VuZHMtPnNldCgxZTYsIC0xZTYsIC0xZTYsIDFlNik7CisgICAgcmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydCwgbGVuLCBudW1HbHlwaHMsIDAsIDAsIE1FQVNVUkUsIE5VTEwsIDAsIDAsIGJvdW5kcyk7Cit9CisKKyNkZWZpbmUgU2tBdXRvS2Vybl9BZGp1c3RGKHByZXYsIG5leHQpICgoKG5leHQpIC0gKHByZXYpICsgMzIpID4+IDYgPDwgMTYpCisKK3ZvaWQgRm9udDo6cmVuZGVyVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAorICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwgdWludDhfdCAqYml0bWFwLAorICAgICAgICB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBILFJlY3QgKmJvdW5kcykgeworICAgIGlmIChudW1HbHlwaHMgPT0gMCB8fCB0ZXh0ID09IE5VTEwgfHwgbGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNrRml4ZWQgcGVuWCA9IFNrSW50VG9GaXhlZCh4KTsKKyAgICBpbnQgcGVuWSA9IHk7CisgICAgaW50IGdseXBoc0xlZnQgPSAxOworICAgIGlmIChudW1HbHlwaHMgPiAwKSB7CisgICAgICAgIGdseXBoc0xlZnQgPSBudW1HbHlwaHM7CisgICAgfQorCisgICAgU2tGaXhlZCBwcmV2UnNiRGVsdGEgPSAwOworICAgIHBlblggKz0gU0tfRml4ZWQxIC8gMjsKKworICAgIHRleHQgKz0gc3RhcnQ7CisKKyAgICB3aGlsZSAoZ2x5cGhzTGVmdCA+IDApIHsKKyAgICAgICAgaW50MzJfdCB1dGZDaGFyID0gU2tVVEYxNl9OZXh0VW5pY2hhcigoY29uc3QgdWludDE2X3QqKikgJnRleHQpOworCisgICAgICAgIC8vIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICAgIGlmICh1dGZDaGFyIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBDYWNoZWRHbHlwaEluZm8qIGNhY2hlZEdseXBoID0gZ2V0Q2FjaGVkVVRGQ2hhcihwYWludCwgdXRmQ2hhcik7CisgICAgICAgIHBlblggKz0gU2tBdXRvS2Vybl9BZGp1c3RGKHByZXZSc2JEZWx0YSwgY2FjaGVkR2x5cGgtPm1Mc2JEZWx0YSk7CisgICAgICAgIHByZXZSc2JEZWx0YSA9IGNhY2hlZEdseXBoLT5tUnNiRGVsdGE7CisKKyAgICAgICAgLy8gSWYgaXQncyBzdGlsbCBub3QgdmFsaWQsIHdlIGNvdWxkbid0IGNhY2hlIGl0LCBzbyB3ZSBzaG91bGRuJ3QgZHJhdyBnYXJiYWdlCisgICAgICAgIGlmIChjYWNoZWRHbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgICAgIHN3aXRjaChtb2RlKSB7CisgICAgICAgICAgICBjYXNlIEZSQU1FQlVGRkVSOgorICAgICAgICAgICAgICAgIGRyYXdDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgU2tGaXhlZEZsb29yKHBlblgpLCBwZW5ZKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQklUTUFQOgorICAgICAgICAgICAgICAgIGRyYXdDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgU2tGaXhlZEZsb29yKHBlblgpLCBwZW5ZLCBiaXRtYXAsIGJpdG1hcFcsIGJpdG1hcEgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNRUFTVVJFOgorICAgICAgICAgICAgICAgIG1lYXN1cmVDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgU2tGaXhlZEZsb29yKHBlblgpLCBwZW5ZLCBib3VuZHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGVuWCArPSBjYWNoZWRHbHlwaC0+bUFkdmFuY2VYOworCisgICAgICAgIC8vIElmIHdlIHdlcmUgZ2l2ZW4gYSBzcGVjaWZpYyBudW1iZXIgb2YgZ2x5cGhzLCBkZWNyZW1lbnQKKyAgICAgICAgaWYgKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgICAgIGdseXBoc0xlZnQtLTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGb250Ojp1cGRhdGVHbHlwaENhY2hlKFNrUGFpbnQqIHBhaW50LCBjb25zdCBTa0dseXBoJiBza2lhR2x5cGgsIENhY2hlZEdseXBoSW5mbyogZ2x5cGgpIHsKKyAgICBnbHlwaC0+bUFkdmFuY2VYID0gc2tpYUdseXBoLmZBZHZhbmNlWDsKKyAgICBnbHlwaC0+bUFkdmFuY2VZID0gc2tpYUdseXBoLmZBZHZhbmNlWTsKKyAgICBnbHlwaC0+bUJpdG1hcExlZnQgPSBza2lhR2x5cGguZkxlZnQ7CisgICAgZ2x5cGgtPm1CaXRtYXBUb3AgPSBza2lhR2x5cGguZlRvcDsKKyAgICBnbHlwaC0+bUxzYkRlbHRhID0gc2tpYUdseXBoLmZMc2JEZWx0YTsKKyAgICBnbHlwaC0+bVJzYkRlbHRhID0gc2tpYUdseXBoLmZSc2JEZWx0YTsKKworICAgIHVpbnQzMl90IHN0YXJ0WCA9IDA7CisgICAgdWludDMyX3Qgc3RhcnRZID0gMDsKKworICAgIC8vIEdldCB0aGUgYml0bWFwIGZvciB0aGUgZ2x5cGgKKyAgICBwYWludC0+ZmluZEltYWdlKHNraWFHbHlwaCk7CisgICAgZ2x5cGgtPm1Jc1ZhbGlkID0gbVN0YXRlLT5jYWNoZUJpdG1hcChza2lhR2x5cGgsICZzdGFydFgsICZzdGFydFkpOworCisgICAgaWYgKCFnbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IGVuZFggPSBzdGFydFggKyBza2lhR2x5cGguZldpZHRoOworICAgIHVpbnQzMl90IGVuZFkgPSBzdGFydFkgKyBza2lhR2x5cGguZkhlaWdodDsKKworICAgIGdseXBoLT5tU3RhcnRYID0gc3RhcnRYOworICAgIGdseXBoLT5tU3RhcnRZID0gc3RhcnRZOworICAgIGdseXBoLT5tQml0bWFwV2lkdGggPSBza2lhR2x5cGguZldpZHRoOworICAgIGdseXBoLT5tQml0bWFwSGVpZ2h0ID0gc2tpYUdseXBoLmZIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbVN0YXRlLT5nZXRDYWNoZVdpZHRoKCk7CisgICAgdWludDMyX3QgY2FjaGVIZWlnaHQgPSBtU3RhdGUtPmdldENhY2hlSGVpZ2h0KCk7CisKKyAgICBnbHlwaC0+bUJpdG1hcE1pblUgPSAoZmxvYXQpIHN0YXJ0WCAvIChmbG9hdCkgY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1pblYgPSAoZmxvYXQpIHN0YXJ0WSAvIChmbG9hdCkgY2FjaGVIZWlnaHQ7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhVID0gKGZsb2F0KSBlbmRYIC8gKGZsb2F0KSBjYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWF4ViA9IChmbG9hdCkgZW5kWSAvIChmbG9hdCkgY2FjaGVIZWlnaHQ7CisKKyAgICBtU3RhdGUtPm1VcGxvYWRUZXh0dXJlID0gdHJ1ZTsKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpjYWNoZUdseXBoKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IGdseXBoKSB7CisgICAgQ2FjaGVkR2x5cGhJbmZvKiBuZXdHbHlwaCA9IG5ldyBDYWNoZWRHbHlwaEluZm8oKTsKKyAgICBtQ2FjaGVkR2x5cGhzLmFkZChnbHlwaCwgbmV3R2x5cGgpOworCisgICAgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoID0gcGFpbnQtPmdldFVuaWNoYXJNZXRyaWNzKGdseXBoKTsKKyAgICBuZXdHbHlwaC0+bUdseXBoSW5kZXggPSBza2lhR2x5cGguZklEOworICAgIG5ld0dseXBoLT5tSXNWYWxpZCA9IGZhbHNlOworCisgICAgdXBkYXRlR2x5cGhDYWNoZShwYWludCwgc2tpYUdseXBoLCBuZXdHbHlwaCk7CisKKyAgICByZXR1cm4gbmV3R2x5cGg7Cit9CisKK0ZvbnQqIEZvbnQ6OmNyZWF0ZShGb250UmVuZGVyZXIqIHN0YXRlLCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKSB7CisgICAgVmVjdG9yPEZvbnQqPiAmYWN0aXZlRm9udHMgPSBzdGF0ZS0+bUFjdGl2ZUZvbnRzOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGFjdGl2ZUZvbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEZvbnQqIGZvbnQgPSBhY3RpdmVGb250c1tpXTsKKyAgICAgICAgaWYgKGZvbnQtPm1Gb250SWQgPT0gZm9udElkICYmIGZvbnQtPm1Gb250U2l6ZSA9PSBmb250U2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGZvbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGb250KiBuZXdGb250ID0gbmV3IEZvbnQoc3RhdGUsIGZvbnRJZCwgZm9udFNpemUpOworICAgIGFjdGl2ZUZvbnRzLnB1c2gobmV3Rm9udCk7CisgICAgcmV0dXJuIG5ld0ZvbnQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZvbnRSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitGb250UmVuZGVyZXI6OkZvbnRSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJDcmVhdGluZyBGb250UmVuZGVyZXIiKTsKKworICAgIG1HYW1tYVRhYmxlID0gTlVMTDsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtTWF4TnVtYmVyT2ZRdWFkcyA9IDEwMjQ7CisgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIG1UZXh0dXJlSWQgPSAwOworCisgICAgbVRleHRNZXNoUHRyID0gTlVMTDsKKyAgICBtVGV4dFRleHR1cmUgPSBOVUxMOworCisgICAgbUluZGV4QnVmZmVySUQgPSAwOworCisgICAgbUNhY2hlV2lkdGggPSBERUZBVUxUX1RFWFRfQ0FDSEVfV0lEVEg7CisgICAgbUNhY2hlSGVpZ2h0ID0gREVGQVVMVF9URVhUX0NBQ0hFX0hFSUdIVDsKKworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfQ0FDSEVfV0lEVEgsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHRleHQgY2FjaGUgd2lkdGggdG8gJXMgcGl4ZWxzIiwgcHJvcGVydHkpOworICAgICAgICBtQ2FjaGVXaWR0aCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGNhY2hlIHdpZHRoIG9mICVpIHBpeGVscyIsIG1DYWNoZVdpZHRoKTsKKyAgICB9CisKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfQ0FDSEVfSEVJR0hULCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGNhY2hlIHdpZHRoIHRvICVzIHBpeGVscyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUNhY2hlSGVpZ2h0ID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHQgY2FjaGUgaGVpZ2h0IG9mICVpIHBpeGVscyIsIG1DYWNoZUhlaWdodCk7CisgICAgfQorfQorCitGb250UmVuZGVyZXI6On5Gb250UmVuZGVyZXIoKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGVMaW5lc1tpXTsKKyAgICB9CisgICAgbUNhY2hlTGluZXMuY2xlYXIoKTsKKworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgZGVsZXRlW10gbVRleHRNZXNoUHRyOworICAgICAgICBkZWxldGVbXSBtVGV4dFRleHR1cmU7CisgICAgfQorCisgICAgaWYgKG1UZXh0dXJlSWQpIHsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbVRleHR1cmVJZCk7CisgICAgfQorCisgICAgVmVjdG9yPEZvbnQqPiBmb250c1RvRGVyZWZlcmVuY2UgPSBtQWN0aXZlRm9udHM7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGZvbnRzVG9EZXJlZmVyZW5jZS5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgZm9udHNUb0RlcmVmZXJlbmNlW2ldOworICAgIH0KK30KKwordm9pZCBGb250UmVuZGVyZXI6OmZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpIHsKKyAgICBpZiAobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1BY3RpdmVGb250cy5zaXplKCk7IGkrKykgeworICAgICAgICBtQWN0aXZlRm9udHNbaV0tPmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCA9IDA7CisgICAgfQorfQorCitib29sIEZvbnRSZW5kZXJlcjo6Y2FjaGVCaXRtYXAoY29uc3QgU2tHbHlwaCYgZ2x5cGgsIHVpbnQzMl90KiByZXRPcmlnaW5YLCB1aW50MzJfdCogcmV0T3JpZ2luWSkgeworICAgIC8vIElmIHRoZSBnbHlwaCBpcyB0b28gdGFsbCwgZG9uJ3QgY2FjaGUgaXQKKyAgICBpZiAoZ2x5cGguZkhlaWdodCA+IG1DYWNoZUxpbmVzW21DYWNoZUxpbmVzLnNpemUoKSAtIDFdLT5tTWF4SGVpZ2h0KSB7CisgICAgICAgIExPR0UoIkZvbnQgc2l6ZSB0byBsYXJnZSB0byBmaXQgaW4gY2FjaGUuIHdpZHRoLCBoZWlnaHQgPSAlaSwgJWkiLAorICAgICAgICAgICAgICAgIChpbnQpIGdseXBoLmZXaWR0aCwgKGludCkgZ2x5cGguZkhlaWdodCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb3cgY29weSB0aGUgYml0bWFwIGludG8gdGhlIGNhY2hlIHRleHR1cmUKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICBib29sIGJpdG1hcEZpdCA9IGZhbHNlOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGdseXBoLCAmc3RhcnRYLCAmc3RhcnRZKTsKKyAgICAgICAgaWYgKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgbmV3IGdseXBoIGRpZG4ndCBmaXQsIGZsdXNoIHRoZSBzdGF0ZSBzbyBmYXIgYW5kIGludmFsaWRhdGUgZXZlcnl0aGluZworICAgIGlmICghYml0bWFwRml0KSB7CisgICAgICAgIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgICAgIC8vIFRyeSB0byBmaXQgaXQgYWdhaW4KKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGdseXBoLCAmc3RhcnRYLCAmc3RhcnRZKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGZpdCwgc29tZXRoaW5nIGlzIHdyb25nIGFuZCB3ZSBzaG91bGRuJ3QgZHJhdworICAgICAgICBpZiAoIWJpdG1hcEZpdCkgeworICAgICAgICAgICAgTE9HRSgiQml0bWFwIGRvZXNuJ3QgZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgZ2x5cGguZldpZHRoLCAoaW50KSBnbHlwaC5mSGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpyZXRPcmlnaW5YID0gc3RhcnRYOworICAgICpyZXRPcmlnaW5ZID0gc3RhcnRZOworCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIGdseXBoLmZXaWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgZ2x5cGguZkhlaWdodDsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBtQ2FjaGVXaWR0aDsKKworICAgIHVpbnQ4X3QqIGNhY2hlQnVmZmVyID0gbVRleHRUZXh0dXJlOworICAgIHVpbnQ4X3QqIGJpdG1hcEJ1ZmZlciA9ICh1aW50OF90KikgZ2x5cGguZkltYWdlOworICAgIHVuc2lnbmVkIGludCBzdHJpZGUgPSBnbHlwaC5yb3dCeXRlcygpOworCisgICAgdWludDMyX3QgY2FjaGVYID0gMCwgYlggPSAwLCBjYWNoZVkgPSAwLCBiWSA9IDA7CisgICAgZm9yIChjYWNoZVggPSBzdGFydFgsIGJYID0gMDsgY2FjaGVYIDwgZW5kWDsgY2FjaGVYKyssIGJYKyspIHsKKyAgICAgICAgZm9yIChjYWNoZVkgPSBzdGFydFksIGJZID0gMDsgY2FjaGVZIDwgZW5kWTsgY2FjaGVZKyssIGJZKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdGVtcENvbCA9IGJpdG1hcEJ1ZmZlcltiWSAqIHN0cmlkZSArIGJYXTsKKyAgICAgICAgICAgIGNhY2hlQnVmZmVyW2NhY2hlWSAqIGNhY2hlV2lkdGggKyBjYWNoZVhdID0gbUdhbW1hVGFibGVbdGVtcENvbF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OmluaXRUZXh0VGV4dHVyZSgpIHsKKyAgICBtVGV4dFRleHR1cmUgPSBuZXcgdWludDhfdFttQ2FjaGVXaWR0aCAqIG1DYWNoZUhlaWdodF07CisgICAgbWVtc2V0KG1UZXh0VGV4dHVyZSwgMCwgbUNhY2hlV2lkdGggKiBtQ2FjaGVIZWlnaHQgKiBzaXplb2YodWludDhfdCkpOworCisgICAgbVVwbG9hZFRleHR1cmUgPSBmYWxzZTsKKworICAgIGdsR2VuVGV4dHVyZXMoMSwgJm1UZXh0dXJlSWQpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVJZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKyAgICAvLyBJbml0aWFsaXplIHRleHR1cmUgZGltZW50aW9ucworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgbUNhY2hlV2lkdGgsIG1DYWNoZUhlaWdodCwgMCwKKyAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCAwKTsKKworICAgIG1MaW5lYXJGaWx0ZXJpbmcgPSBmYWxzZTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKworICAgIC8vIFNwbGl0IHVwIG91ciBjYWNoZSB0ZXh0dXJlIGludG8gbGluZXMgb2YgY2VydGFpbiB3aWR0aHMKKyAgICBpbnQgbmV4dExpbmUgPSAwOworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDE4LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDI2LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDI2LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDM0LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDM0LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDQyLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIG1DYWNoZUhlaWdodCAtIG5leHRMaW5lLCBuZXh0TGluZSwgMCkpOworfQorCisvLyBBdm9pZCBoYXZpbmcgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgYW5kIHJlbmRlciBxdWFkIGJ5IHF1YWQKK3ZvaWQgRm9udFJlbmRlcmVyOjppbml0VmVydGV4QXJyYXlCdWZmZXJzKCkgeworICAgIHVpbnQzMl90IG51bUluZGljaWVzID0gbU1heE51bWJlck9mUXVhZHMgKiA2OworICAgIHVpbnQzMl90IGluZGV4QnVmZmVyU2l6ZUJ5dGVzID0gbnVtSW5kaWNpZXMgKiBzaXplb2YodWludDE2X3QpOworICAgIHVpbnQxNl90KiBpbmRleEJ1ZmZlckRhdGEgPSAodWludDE2X3QqKSBtYWxsb2MoaW5kZXhCdWZmZXJTaXplQnl0ZXMpOworCisgICAgLy8gRm91ciB2ZXJ0cywgdHdvIHRyaWFuZ2xlcyAsIHNpeCBpbmRpY2VzIHBlciBxdWFkCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1NYXhOdW1iZXJPZlF1YWRzOyBpKyspIHsKKyAgICAgICAgaW50IGk2ID0gaSAqIDY7CisgICAgICAgIGludCBpNCA9IGkgKiA0OworCisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDBdID0gaTQgKyAwOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyAxXSA9IGk0ICsgMTsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgMl0gPSBpNCArIDI7CisKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgM10gPSBpNCArIDA7CisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDRdID0gaTQgKyAyOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyA1XSA9IGk0ICsgMzsKKyAgICB9CisKKyAgICBnbEdlbkJ1ZmZlcnMoMSwgJm1JbmRleEJ1ZmZlcklEKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXJJRCk7CisgICAgZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgaW5kZXhCdWZmZXJTaXplQnl0ZXMsIGluZGV4QnVmZmVyRGF0YSwgR0xfRFlOQU1JQ19EUkFXKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCAwKTsKKworICAgIGZyZWUoaW5kZXhCdWZmZXJEYXRhKTsKKworICAgIHVpbnQzMl90IGNvb3JkU2l6ZSA9IDM7CisgICAgdWludDMyX3QgdXZTaXplID0gMjsKKyAgICB1aW50MzJfdCB2ZXJ0c1BlclF1YWQgPSA0OworICAgIHVpbnQzMl90IHZlcnRleEJ1ZmZlclNpemUgPSBtTWF4TnVtYmVyT2ZRdWFkcyAqIHZlcnRzUGVyUXVhZCAqIGNvb3JkU2l6ZSAqIHV2U2l6ZTsKKyAgICBtVGV4dE1lc2hQdHIgPSBuZXcgZmxvYXRbdmVydGV4QnVmZmVyU2l6ZV07Cit9CisKKy8vIFdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgYW55dGhpbmcgdW5sZXNzIHdlIGFjdHVhbGx5IGRyYXcgdGV4dAordm9pZCBGb250UmVuZGVyZXI6OmNoZWNrSW5pdCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbml0VGV4dFRleHR1cmUoKTsKKyAgICBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICAvLyBXZSBzdG9yZSBhIHN0cmluZyB3aXRoIGxldHRlcnMgaW4gYSByb3VnaCBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZQorICAgIG1MYXRpblByZWNhY2hlID0gU3RyaW5nMTYoImVpc2FybnRvbGNkdWdwbWhieWZ2a3d6eGpxICIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzE2KCJFSVNBUk5UT0xDRFVHUE1IQllGVktXWlhKUSIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzE2KCIsLj8hKCktK0A7OmAnIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nMTYoIjAxMjM0NTY3ODkiKTsKKworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpjaGVja1RleHR1cmVVcGRhdGUoKSB7CisgICAgaWYgKCFtVXBsb2FkVGV4dHVyZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZUlkKTsKKworICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGNhY2hlIGxpbmVzIGFuZCBzZWUgd2hpY2ggb25lcyBuZWVkIHRvIGJlIHVwZGF0ZWQKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQ2FjaGVUZXh0dXJlTGluZSogY2wgPSBtQ2FjaGVMaW5lc1tpXTsKKyAgICAgICAgaWYoY2wtPm1EaXJ0eSkgeworICAgICAgICAgICAgdWludDMyX3QgeE9mZnNldCA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCB5T2Zmc2V0ID0gY2wtPm1DdXJyZW50Um93OworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggICA9IG1DYWNoZVdpZHRoOworICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ICA9IGNsLT5tTWF4SGVpZ2h0OworICAgICAgICAgICAgdm9pZCogdGV4dHVyZURhdGEgPSBtVGV4dFRleHR1cmUgKyB5T2Zmc2V0KndpZHRoOworCisgICAgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgeE9mZnNldCwgeU9mZnNldCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIHRleHR1cmVEYXRhKTsKKworICAgICAgICAgICAgY2wtPm1EaXJ0eSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgbVVwbG9hZFRleHR1cmUgPSBmYWxzZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6Omlzc3VlRHJhd0NvbW1hbmQoKSB7CisgICAgY2hlY2tUZXh0dXJlVXBkYXRlKCk7CisKKyAgICBmbG9hdCogdnR4ID0gbVRleHRNZXNoUHRyOworICAgIGZsb2F0KiB0ZXggPSB2dHggKyAzOworCisgICAgLy8gcG9zaXRpb24gaXMgc2xvdCAwCisgICAgdWludDMyX3Qgc2xvdCA9IDA7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHNsb3QsIDMsIEdMX0ZMT0FULCBmYWxzZSwgMjAsIHZ0eCk7CisKKyAgICAvLyB0ZXh0dXJlMCBpcyBzbG90IDEKKyAgICBzbG90ID0gMTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoc2xvdCwgMiwgR0xfRkxPQVQsIGZhbHNlLCAyMCwgdGV4KTsKKworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVySUQpOworICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbUN1cnJlbnRRdWFkSW5kZXggKiA2LCBHTF9VTlNJR05FRF9TSE9SVCwgTlVMTCk7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjphcHBlbmRNZXNoUXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLAorICAgICAgICBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpIHsKKyAgICBpZiAoeDEgPiBtQ2xpcC0+cmlnaHQgfHwgeTEgPCBtQ2xpcC0+dG9wIHx8IHgyIDwgbUNsaXAtPmxlZnQgfHwgeTQgPiBtQ2xpcC0+Ym90dG9tKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50MzJfdCB2ZXJ0c1BlclF1YWQgPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGZsb2F0c1BlclZlcnQgPSA1OworICAgIGZsb2F0KiBjdXJyZW50UG9zID0gbVRleHRNZXNoUHRyICsgbUN1cnJlbnRRdWFkSW5kZXggKiB2ZXJ0c1BlclF1YWQgKiBmbG9hdHNQZXJWZXJ0OworCisgICAgKCpjdXJyZW50UG9zKyspID0geDE7CisgICAgKCpjdXJyZW50UG9zKyspID0geTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gejE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjE7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MjsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgzOworICAgICgqY3VycmVudFBvcysrKSA9IHkzOworICAgICgqY3VycmVudFBvcysrKSA9IHozOworICAgICgqY3VycmVudFBvcysrKSA9IHUzOworICAgICgqY3VycmVudFBvcysrKSA9IHYzOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDQ7CisgICAgKCpjdXJyZW50UG9zKyspID0geTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gejQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjQ7CisKKyAgICBtQ3VycmVudFF1YWRJbmRleCsrOworCisgICAgaWYgKG1DdXJyZW50UXVhZEluZGV4ID09IG1NYXhOdW1iZXJPZlF1YWRzKSB7CisgICAgICAgIGlzc3VlRHJhd0NvbW1hbmQoKTsKKyAgICAgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIH0KK30KKwordWludDMyX3QgRm9udFJlbmRlcmVyOjpnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCkgeworICAgIHVpbnQzMl90IHJlbWFpbmluZ0NhcGFjaXR5ID0gMDsKKyAgICBmbG9hdCB0b3RhbFBpeGVscyA9IDA7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICByZW1haW5pbmdDYXBhY2l0eSArPSAobUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aCAtIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCk7CisgICAgICAgICB0b3RhbFBpeGVscyArPSBtQ2FjaGVMaW5lc1tpXS0+bU1heFdpZHRoOworICAgIH0KKyAgICByZW1haW5pbmdDYXBhY2l0eSA9IChyZW1haW5pbmdDYXBhY2l0eSAqIDEwMCkgLyB0b3RhbFBpeGVsczsKKyAgICByZXR1cm4gcmVtYWluaW5nQ2FwYWNpdHk7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpwcmVjYWNoZUxhdGluKFNrUGFpbnQqIHBhaW50KSB7CisgICAgLy8gUmVtYWluaW5nIGNhcGFjaXR5IGlzIG1lYXN1cmVkIGluICUKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICB1aW50MzJfdCBwcmVjYWNoZUlkeCA9IDA7CisgICAgd2hpbGUocmVtYWluaW5nQ2FwYWNpdHkgPiAyNSAmJiBwcmVjYWNoZUlkeCA8IG1MYXRpblByZWNhY2hlLnNpemUoKSkgeworICAgICAgICBtQ3VycmVudEZvbnQtPmdldENhY2hlZFVURkNoYXIocGFpbnQsIChpbnQzMl90KW1MYXRpblByZWNhY2hlW3ByZWNhY2hlSWR4XSk7CisgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOworICAgICAgICBwcmVjYWNoZUlkeCArKzsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpzZXRGb250KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKSB7CisgICAgdWludDMyX3QgY3VycmVudE51bUZvbnRzID0gbUFjdGl2ZUZvbnRzLnNpemUoKTsKKyAgICBtQ3VycmVudEZvbnQgPSBGb250OjpjcmVhdGUodGhpcywgZm9udElkLCBmb250U2l6ZSk7CisKKyAgICBjb25zdCBmbG9hdCBtYXhQcmVjYWNoZUZvbnRTaXplID0gNDAuMGY7CisgICAgYm9vbCBpc05ld0ZvbnQgPSBjdXJyZW50TnVtRm9udHMgIT0gbUFjdGl2ZUZvbnRzLnNpemUoKTsKKworICAgIGlmIChpc05ld0ZvbnQgJiYgZm9udFNpemUgPD0gbWF4UHJlY2FjaGVGb250U2l6ZSkgeworICAgICAgICBwcmVjYWNoZUxhdGluKHBhaW50KTsKKyAgICB9Cit9CisKK0ZvbnRSZW5kZXJlcjo6RHJvcFNoYWRvdyBGb250UmVuZGVyZXI6OnJlbmRlckRyb3BTaGFkb3coU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgIHVpbnQzMl90IHN0YXJ0SW5kZXgsIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgdWludDMyX3QgcmFkaXVzKSB7CisgICAgY2hlY2tJbml0KCk7CisKKyAgICBpZiAoIW1DdXJyZW50Rm9udCkgeworICAgICAgICBEcm9wU2hhZG93IGltYWdlOworICAgICAgICBpbWFnZS53aWR0aCA9IDA7CisgICAgICAgIGltYWdlLmhlaWdodCA9IDA7CisgICAgICAgIGltYWdlLmltYWdlID0gTlVMTDsKKyAgICAgICAgaW1hZ2UucGVuWCA9IDA7CisgICAgICAgIGltYWdlLnBlblkgPSAwOworICAgICAgICByZXR1cm4gaW1hZ2U7CisgICAgfQorCisgICAgUmVjdCBib3VuZHM7CisgICAgbUN1cnJlbnRGb250LT5tZWFzdXJlVVRGKHBhaW50LCB0ZXh0LCBzdGFydEluZGV4LCBsZW4sIG51bUdseXBocywgJmJvdW5kcyk7CisgICAgdWludDMyX3QgcGFkZGVkV2lkdGggPSAodWludDMyX3QpIChib3VuZHMucmlnaHQgLSBib3VuZHMubGVmdCkgKyAyICogcmFkaXVzOworICAgIHVpbnQzMl90IHBhZGRlZEhlaWdodCA9ICh1aW50MzJfdCkgKGJvdW5kcy50b3AgLSBib3VuZHMuYm90dG9tKSArIDIgKiByYWRpdXM7CisgICAgdWludDhfdCogZGF0YUJ1ZmZlciA9IG5ldyB1aW50OF90W3BhZGRlZFdpZHRoICogcGFkZGVkSGVpZ2h0XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcGFkZGVkV2lkdGggKiBwYWRkZWRIZWlnaHQ7IGkrKykgeworICAgICAgICBkYXRhQnVmZmVyW2ldID0gMDsKKyAgICB9CisKKyAgICBpbnQgcGVuWCA9IHJhZGl1cyAtIGJvdW5kcy5sZWZ0OworICAgIGludCBwZW5ZID0gcmFkaXVzIC0gYm91bmRzLmJvdHRvbTsKKworICAgIG1DdXJyZW50Rm9udC0+cmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydEluZGV4LCBsZW4sIG51bUdseXBocywgcGVuWCwgcGVuWSwKKyAgICAgICAgICAgIGRhdGFCdWZmZXIsIHBhZGRlZFdpZHRoLCBwYWRkZWRIZWlnaHQpOworICAgIGJsdXJJbWFnZShkYXRhQnVmZmVyLCBwYWRkZWRXaWR0aCwgcGFkZGVkSGVpZ2h0LCByYWRpdXMpOworCisgICAgRHJvcFNoYWRvdyBpbWFnZTsKKyAgICBpbWFnZS53aWR0aCA9IHBhZGRlZFdpZHRoOworICAgIGltYWdlLmhlaWdodCA9IHBhZGRlZEhlaWdodDsKKyAgICBpbWFnZS5pbWFnZSA9IGRhdGFCdWZmZXI7CisgICAgaW1hZ2UucGVuWCA9IHBlblg7CisgICAgaW1hZ2UucGVuWSA9IHBlblk7CisgICAgcmV0dXJuIGltYWdlOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6cmVuZGVyVGV4dChTa1BhaW50KiBwYWludCwgY29uc3QgUmVjdCogY2xpcCwgY29uc3QgY2hhciAqdGV4dCwKKyAgICAgICAgdWludDMyX3Qgc3RhcnRJbmRleCwgdWludDMyX3QgbGVuLCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpIHsKKyAgICBjaGVja0luaXQoKTsKKworICAgIGlmICghbUN1cnJlbnRGb250KSB7CisgICAgICAgIExPR0UoIk5vIGZvbnQgc2V0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2xpcCA9IGNsaXA7CisgICAgbUN1cnJlbnRGb250LT5yZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCB4LCB5KTsKKworICAgIGlmIChtQ3VycmVudFF1YWRJbmRleCAhPSAwKSB7CisgICAgICAgIGlzc3VlRHJhd0NvbW1hbmQoKTsKKyAgICAgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIH0KK30KKwordm9pZCBGb250UmVuZGVyZXI6OmNvbXB1dGVHYXVzc2lhbldlaWdodHMoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzKSB7CisgICAgLy8gQ29tcHV0ZSBnYXVzc2lhbiB3ZWlnaHRzIGZvciB0aGUgYmx1cgorICAgIC8vIGUgaXMgdGhlIGV1bGVyJ3MgbnVtYmVyCisgICAgZmxvYXQgZSA9IDIuNzE4MjgxODI4NDU5MDQ1ZjsKKyAgICBmbG9hdCBwaSA9IDMuMTQxNTkyNjUzNTg5NzkzMmY7CisgICAgLy8gZyh4KSA9ICggMSAvIHNxcnQoIDIgKiBwaSApICogc2lnbWEpICogZSBeICggLXheMiAvIDIgKiBzaWdtYV4yICkKKyAgICAvLyB4IGlzIG9mIHRoZSBmb3JtIFstcmFkaXVzIC4uIDAgLi4gcmFkaXVzXQorICAgIC8vIGFuZCBzaWdtYSB2YXJpZXMgd2l0aCByYWRpdXMuCisgICAgLy8gQmFzZWQgb24gc29tZSBleHBlcmltZW50YWwgcmFkaXVzIHZhbHVlcyBhbmQgc2lnbWEncworICAgIC8vIHdlIGFwcHJveGltYXRlbHkgZml0IHNpZ21hID0gZihyYWRpdXMpIGFzCisgICAgLy8gc2lnbWEgPSByYWRpdXMgKiAwLjMgICsgMC42CisgICAgLy8gVGhlIGxhcmdlciB0aGUgcmFkaXVzIGdldHMsIHRoZSBtb3JlIG91ciBnYXVzc2lhbiBibHVyCisgICAgLy8gd2lsbCByZXNlbWJsZSBhIGJveCBibHVyIHNpbmNlIHdpdGggbGFyZ2Ugc2lnbWEKKyAgICAvLyB0aGUgZ2F1c3NpYW4gY3VydmUgYmVnaW5zIHRvIGxvc2UgaXRzIHNoYXBlCisgICAgZmxvYXQgc2lnbWEgPSAwLjNmICogKGZsb2F0KXJhZGl1cyArIDAuNmY7CisKKyAgICAvLyBOb3cgY29tcHV0ZSB0aGUgY29lZmZpY2ludHMKKyAgICAvLyBXZSB3aWxsIHN0b3JlIHNvbWUgcmVkdW5kYW50IHZhbHVlcyB0byBzYXZlIHNvbWUgbWF0aCBkdXJpbmcKKyAgICAvLyB0aGUgYmx1ciBjYWxjdWxhdGlvbnMKKyAgICAvLyBwcmVjb21wdXRlIHNvbWUgdmFsdWVzCisgICAgZmxvYXQgY29lZmYxID0gMS4wZiAvIChzcXJ0KCAyLjBmICogcGkgKSAqIHNpZ21hKTsKKyAgICBmbG9hdCBjb2VmZjIgPSAtIDEuMGYgLyAoMi4wZiAqIHNpZ21hICogc2lnbWEpOworCisgICAgZmxvYXQgbm9ybWFsaXplRmFjdG9yID0gMC4wZjsKKyAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgZmxvYXQgZmxvYXRSID0gKGZsb2F0KSByOworICAgICAgICB3ZWlnaHRzW3IgKyByYWRpdXNdID0gY29lZmYxICogcG93KGUsIGZsb2F0UiAqIGZsb2F0UiAqIGNvZWZmMik7CisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSB3ZWlnaHRzW3IgKyByYWRpdXNdOworICAgIH0KKworICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgd2VpZ2h0c1tyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6aG9yaXpvbnRhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3QsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHkgKiB3aWR0aDsKKyAgICAgICAgdWludDhfdCogb3V0cHV0ID0gZGVzdCArIHkgKiB3aWR0aDsKKworICAgICAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQqIGdQdHIgPSB3ZWlnaHRzOworICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIGZvciBub24tYm9yZGVyIHBpeGVscworICAgICAgICAgICAgaWYgKCh4ID4gcmFkaXVzKSAmJiAoeCA8ICh3aWR0aCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKHggLSByYWRpdXMpOworICAgICAgICAgICAgICAgIGZvcihpbnQgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkgKCppKTsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGN1cnJlbnRQaXhlbCAqIGdQdHJbMF07CisgICAgICAgICAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkVyA9IHggKyByOworICAgICAgICAgICAgICAgICAgICBpZih2YWxpZFcgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA+IHdpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsID0gKGZsb2F0KShpbnB1dFt2YWxpZFddKTsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGN1cnJlbnRQaXhlbCAqIGdQdHJbMF07CisgICAgICAgICAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb3V0cHV0ID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsOworICAgICAgICAgICAgb3V0cHV0ICsrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6dmVydGljYWxCbHVyKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cywKKyAgICAgICAgY29uc3QgdWludDhfdCogc291cmNlLCB1aW50OF90KiBkZXN0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGZsb2F0IGJsdXJyZWRQaXhlbCA9IDAuMGY7CisgICAgZmxvYXQgY3VycmVudFBpeGVsID0gMC4wZjsKKworICAgIGZvcihpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICsrKSB7CisKKyAgICAgICAgdWludDhfdCogb3V0cHV0ID0gZGVzdCArIHkgKiB3aWR0aDsKKworICAgICAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQqIGdQdHIgPSB3ZWlnaHRzOworICAgICAgICAgICAgY29uc3QgdWludDhfdCogaW5wdXQgPSBzb3VyY2UgKyB4OworICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIGZvciBub24tYm9yZGVyIHBpeGVscworICAgICAgICAgICAgaWYgKCh5ID4gcmFkaXVzKSAmJiAoeSA8IChoZWlnaHQgLSByYWRpdXMpKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmkgPSBpbnB1dCArICgoeSAtIHJhZGl1cykgKiB3aWR0aCk7CisgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoKmkpOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgICAgICBpICs9IHdpZHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZEggPSB5ICsgcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPiBoZWlnaHQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSBoZWlnaHQgLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgdmFsaWRIICogd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoKmkpOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRwdXQgPSAodWludDhfdClibHVycmVkUGl4ZWw7CisgICAgICAgICAgICBvdXRwdXQgKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBGb250UmVuZGVyZXI6OmJsdXJJbWFnZSh1aW50OF90ICppbWFnZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgcmFkaXVzKSB7CisgICAgZmxvYXQgKmdhdXNzaWFuID0gbmV3IGZsb2F0WzIgKiByYWRpdXMgKyAxXTsKKyAgICBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGdhdXNzaWFuLCByYWRpdXMpOworICAgIHVpbnQ4X3QqIHNjcmF0Y2ggPSBuZXcgdWludDhfdFt3aWR0aCAqIGhlaWdodF07CisgICAgaG9yaXpvbnRhbEJsdXIoZ2F1c3NpYW4sIHJhZGl1cywgaW1hZ2UsIHNjcmF0Y2gsIHdpZHRoLCBoZWlnaHQpOworICAgIHZlcnRpY2FsQmx1cihnYXVzc2lhbiwgcmFkaXVzLCBzY3JhdGNoLCBpbWFnZSwgd2lkdGgsIGhlaWdodCk7CisgICAgZGVsZXRlW10gZ2F1c3NpYW47CisgICAgZGVsZXRlW10gc2NyYXRjaDsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmggYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwZWZhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaApAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9GT05UX1JFTkRFUkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9GT05UX1JFTkRFUkVSX0gKKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxTa1NjYWxlckNvbnRleHQuaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworY2xhc3MgRm9udFJlbmRlcmVyOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBmb250LCBkZWZpbmVkIGJ5IGEgU2tpYSBmb250IGlkIGFuZCBhIGZvbnQgc2l6ZS4gQSBmb250IGlzIHVzZWQKKyAqIHRvIGdlbmVyYXRlIGdseXBocyBhbmQgY2FjaGUgdGhlbSBpbiB0aGUgRm9udFN0YXRlLgorICovCitjbGFzcyBGb250IHsKK3B1YmxpYzoKKyAgICB+Rm9udCgpOworCisgICAgLyoqCisgICAgICogUmVuZGVycyB0aGUgc3BlY2lmaWVkIHN0cmluZyBvZiB0ZXh0LgorICAgICAqIElmIGJpdG1hcCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcmVuZGVyIHRhcmdldAorICAgICAqLworICAgIHZvaWQgcmVuZGVyVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwID0gTlVMTCwgdWludDMyX3QgYml0bWFwVyA9IDAsIHVpbnQzMl90IGJpdG1hcEggPSAwKTsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZvbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZm9udCBzdGF0ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgRm9udCogY3JlYXRlKEZvbnRSZW5kZXJlciogc3RhdGUsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUpOworCitwcm90ZWN0ZWQ6CisgICAgZnJpZW5kIGNsYXNzIEZvbnRSZW5kZXJlcjsKKworICAgIGVudW0gUmVuZGVyTW9kZSB7CisgICAgICAgIEZSQU1FQlVGRkVSLAorICAgICAgICBCSVRNQVAsCisgICAgICAgIE1FQVNVUkUsCisgICAgfTsKKworICAgIHZvaWQgcmVuZGVyVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCBSZW5kZXJNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgsCisgICAgICAgICAgICAgICAgICAgICBSZWN0ICpib3VuZHMpOworCisgICAgdm9pZCBtZWFzdXJlVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGludCBudW1HbHlwaHMsIFJlY3QgKmJvdW5kcyk7CisKKyAgICBzdHJ1Y3QgQ2FjaGVkR2x5cGhJbmZvIHsKKyAgICAgICAgLy8gSGFzIHRoZSBjYWNoZSBiZWVuIGludmFsaWRhdGVkPworICAgICAgICBib29sIG1Jc1ZhbGlkOworICAgICAgICAvLyBMb2NhdGlvbiBvZiB0aGUgY2FjaGVkIGdseXBoIGluIHRoZSBiaXRtYXAKKyAgICAgICAgLy8gaW4gY2FzZSB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgdGV4dHVyZSBvcgorICAgICAgICAvLyByZW5kZXIgdG8gYml0bWFwCisgICAgICAgIHVpbnQzMl90IG1TdGFydFg7CisgICAgICAgIHVpbnQzMl90IG1TdGFydFk7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcEhlaWdodDsKKyAgICAgICAgLy8gQWxzbyBjYWNoZSB0ZXh0dXJlIGNvb3JkcyBmb3IgdGhlIHF1YWQKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5WOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFY7CisgICAgICAgIC8vIE1pbmltaXplIGhvdyBtdWNoIHdlIGNhbGwgZnJlZXR5cGUKKyAgICAgICAgdWludDMyX3QgbUdseXBoSW5kZXg7CisgICAgICAgIHVpbnQzMl90IG1BZHZhbmNlWDsKKyAgICAgICAgdWludDMyX3QgbUFkdmFuY2VZOworICAgICAgICAvLyBWYWx1ZXMgYmVsb3cgY29udGFpbiBhIGdseXBoJ3Mgb3JpZ2luIGluIHRoZSBiaXRtYXAKKyAgICAgICAgaW50MzJfdCBtQml0bWFwTGVmdDsKKyAgICAgICAgaW50MzJfdCBtQml0bWFwVG9wOworICAgICAgICAvLyBBdXRvLWtlcm5pbmcKKyAgICAgICAgU2tGaXhlZCBtTHNiRGVsdGE7CisgICAgICAgIFNrRml4ZWQgbVJzYkRlbHRhOworICAgIH07CisKKyAgICBGb250KEZvbnRSZW5kZXJlciogc3RhdGUsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUpOworCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPGludDMyX3QsIENhY2hlZEdseXBoSW5mbyo+IG1DYWNoZWRHbHlwaHM7CisKKyAgICB2b2lkIGludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKworICAgIENhY2hlZEdseXBoSW5mbyogY2FjaGVHbHlwaChTa1BhaW50KiBwYWludCwgaW50MzJfdCBnbHlwaCk7CisgICAgdm9pZCB1cGRhdGVHbHlwaENhY2hlKFNrUGFpbnQqIHBhaW50LCBjb25zdCBTa0dseXBoJiBza2lhR2x5cGgsIENhY2hlZEdseXBoSW5mbyAqZ2x5cGgpOworICAgIHZvaWQgbWVhc3VyZUNhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSwgUmVjdCAqYm91bmRzKTsKKyAgICB2b2lkIGRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKTsKKworICAgIENhY2hlZEdseXBoSW5mbyogZ2V0Q2FjaGVkVVRGQ2hhcihTa1BhaW50KiBwYWludCwgaW50MzJfdCB1dGZDaGFyKTsKKworICAgIEZvbnRSZW5kZXJlciogbVN0YXRlOworICAgIHVpbnQzMl90IG1Gb250SWQ7CisgICAgZmxvYXQgbUZvbnRTaXplOworfTsKKworY2xhc3MgRm9udFJlbmRlcmVyIHsKK3B1YmxpYzoKKyAgICBGb250UmVuZGVyZXIoKTsKKyAgICB+Rm9udFJlbmRlcmVyKCk7CisKKyAgICB2b2lkIGluaXQoKTsKKyAgICB2b2lkIGRlaW5pdCgpOworCisgICAgdm9pZCBzZXRHYW1tYVRhYmxlKGNvbnN0IHVpbnQ4X3QqIGdhbW1hVGFibGUpIHsKKyAgICAgICAgbUdhbW1hVGFibGUgPSBnYW1tYVRhYmxlOworICAgIH0KKworICAgIHZvaWQgc2V0Rm9udChTa1BhaW50KiBwYWludCwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSk7CisgICAgdm9pZCByZW5kZXJUZXh0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBSZWN0KiBjbGlwLCBjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBzdGFydEluZGV4LAorICAgICAgICAgICAgdWludDMyX3QgbGVuLCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpOworCisgICAgc3RydWN0IERyb3BTaGFkb3cgeworICAgICAgICBEcm9wU2hhZG93KCkgeyB9OworCisgICAgICAgIERyb3BTaGFkb3coY29uc3QgRHJvcFNoYWRvdyYgZHJvcFNoYWRvdyk6CisgICAgICAgICAgICB3aWR0aChkcm9wU2hhZG93LndpZHRoKSwgaGVpZ2h0KGRyb3BTaGFkb3cuaGVpZ2h0KSwKKyAgICAgICAgICAgIGltYWdlKGRyb3BTaGFkb3cuaW1hZ2UpLCBwZW5YKGRyb3BTaGFkb3cucGVuWCksCisgICAgICAgICAgICBwZW5ZKGRyb3BTaGFkb3cucGVuWSkgeworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDhfdCogaW1hZ2U7CisgICAgICAgIGludDMyX3QgcGVuWDsKKyAgICAgICAgaW50MzJfdCBwZW5ZOworICAgIH07CisKKyAgICAvLyBBZnRlciByZW5kZXJEcm9wU2hhZG93IHJldHVybnMsIHRoZSBjYWxsZWQgb3ducyB0aGUgbWVtb3J5IGluIERyb3BTaGFkb3cuaW1hZ2UKKyAgICAvLyBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdCB3aGVuIGl0J3MgZG9uZSB3aXRoIGl0CisgICAgRHJvcFNoYWRvdyByZW5kZXJEcm9wU2hhZG93KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBzdGFydEluZGV4LAorICAgICAgICAgICAgdWludDMyX3QgbGVuLCBpbnQgbnVtR2x5cGhzLCB1aW50MzJfdCByYWRpdXMpOworCisgICAgR0x1aW50IGdldFRleHR1cmUoYm9vbCBsaW5lYXJGaWx0ZXJpbmcgPSBmYWxzZSkgeworICAgICAgICBjaGVja0luaXQoKTsKKyAgICAgICAgaWYgKGxpbmVhckZpbHRlcmluZyAhPSBtTGluZWFyRmlsdGVyaW5nKSB7CisgICAgICAgICAgICBtTGluZWFyRmlsdGVyaW5nID0gbGluZWFyRmlsdGVyaW5nOworICAgICAgICAgICAgY29uc3QgR0xlbnVtIGZpbHRlcmluZyA9IGxpbmVhckZpbHRlcmluZyA/IEdMX0xJTkVBUiA6IEdMX05FQVJFU1Q7CisKKyAgICAgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVJZCk7CisgICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXJpbmcpOworICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgZmlsdGVyaW5nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVRleHR1cmVJZDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgY2xhc3MgRm9udDsKKworICAgIGNvbnN0IHVpbnQ4X3QqIG1HYW1tYVRhYmxlOworCisgICAgc3RydWN0IENhY2hlVGV4dHVyZUxpbmUgeworICAgICAgICB1aW50MTZfdCBtTWF4SGVpZ2h0OworICAgICAgICB1aW50MTZfdCBtTWF4V2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Um93OworICAgICAgICB1aW50MzJfdCBtQ3VycmVudENvbDsKKyAgICAgICAgYm9vbCBtRGlydHk7CisKKyAgICAgICAgQ2FjaGVUZXh0dXJlTGluZSh1aW50MTZfdCBtYXhXaWR0aCwgdWludDE2X3QgbWF4SGVpZ2h0LCB1aW50MzJfdCBjdXJyZW50Um93LAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRDb2wpOgorICAgICAgICAgICAgICAgICAgICBtTWF4SGVpZ2h0KG1heEhlaWdodCksCisgICAgICAgICAgICAgICAgICAgIG1NYXhXaWR0aChtYXhXaWR0aCksCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Um93KGN1cnJlbnRSb3cpLAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudENvbChjdXJyZW50Q29sKSwKKyAgICAgICAgICAgICAgICAgICAgbURpcnR5KGZhbHNlKSB7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZpdEJpdG1hcChjb25zdCBTa0dseXBoJiBnbHlwaCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKSB7CisgICAgICAgICAgICBpZiAoZ2x5cGguZkhlaWdodCArIDIgPiBtTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUN1cnJlbnRDb2wgKyBnbHlwaC5mV2lkdGggKyAyIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAgKnJldE9yaWdpblggPSBtQ3VycmVudENvbCArIDE7CisgICAgICAgICAgICAgICAgKnJldE9yaWdpblkgPSBtQ3VycmVudFJvdyArIDE7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRDb2wgKz0gZ2x5cGguZldpZHRoICsgMjsKKyAgICAgICAgICAgICAgICBtRGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdWludDMyX3QgZ2V0Q2FjaGVXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DYWNoZVdpZHRoOworICAgIH0KKworICAgIHVpbnQzMl90IGdldENhY2hlSGVpZ2h0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNhY2hlSGVpZ2h0OworICAgIH0KKworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgYm9vbCBjYWNoZUJpdG1hcChjb25zdCBTa0dseXBoJiBnbHlwaCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKTsKKworICAgIHZvaWQgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisgICAgdm9pZCBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICB2b2lkIGNoZWNrSW5pdCgpOworCisgICAgU3RyaW5nMTYgbUxhdGluUHJlY2FjaGU7CisgICAgdm9pZCBwcmVjYWNoZUxhdGluKFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCisgICAgICAgICAgICBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOworCisgICAgdWludDMyX3QgbUNhY2hlV2lkdGg7CisgICAgdWludDMyX3QgbUNhY2hlSGVpZ2h0OworCisgICAgVmVjdG9yPENhY2hlVGV4dHVyZUxpbmUqPiBtQ2FjaGVMaW5lczsKKyAgICB1aW50MzJfdCBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisKKyAgICBGb250KiBtQ3VycmVudEZvbnQ7CisgICAgVmVjdG9yPEZvbnQqPiBtQWN0aXZlRm9udHM7CisKKyAgICAvLyBUZXh0dXJlIHRvIGNhY2hlIGdseXBoIGJpdG1hcHMKKyAgICB1aW50OF90KiBtVGV4dFRleHR1cmU7CisgICAgY29uc3QgdWludDhfdCogZ2V0VGV4dFRleHR1cmVEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRleHRUZXh0dXJlOworICAgIH0KKyAgICBHTHVpbnQgbVRleHR1cmVJZDsKKyAgICB2b2lkIGNoZWNrVGV4dHVyZVVwZGF0ZSgpOworICAgIGJvb2wgbVVwbG9hZFRleHR1cmU7CisKKyAgICAvLyBQb2ludGVyIHRvIHZlcnRleCBkYXRhIHRvIHNwZWVkIHVwIGZyYW1lIHRvIGZyYW1lIHdvcmsKKyAgICBmbG9hdCAqbVRleHRNZXNoUHRyOworICAgIHVpbnQzMl90IG1DdXJyZW50UXVhZEluZGV4OworICAgIHVpbnQzMl90IG1NYXhOdW1iZXJPZlF1YWRzOworCisgICAgdWludDMyX3QgbUluZGV4QnVmZmVySUQ7CisKKyAgICBjb25zdCBSZWN0KiBtQ2xpcDsKKworICAgIGJvb2wgbUluaXRpYWxpemVkOworCisgICAgYm9vbCBtTGluZWFyRmlsdGVyaW5nOworCisgICAgdm9pZCBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cyk7CisgICAgdm9pZCBob3Jpem9udGFsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIHZlcnRpY2FsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGJsdXJJbWFnZSh1aW50OF90KiBpbWFnZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgcmFkaXVzKTsKK307CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9GT05UX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMDg3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgIkdhbW1hRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dhbW1hRm9udFJlbmRlcmVyOjpHYW1tYUZvbnRSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJDcmVhdGluZyBnYW1tYSBmb250IHJlbmRlcmVyIik7CisKKyAgICAvLyBHZXQgdGhlIHJlbmRlcmVyIHByb3BlcnRpZXMKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICAvLyBHZXQgdGhlIGdhbW1hCisgICAgZmxvYXQgZ2FtbWEgPSBERUZBVUxUX1RFWFRfR0FNTUE7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0dBTU1BLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGdhbW1hIHRvICVzIiwgcHJvcGVydHkpOworICAgICAgICBnYW1tYSA9IGF0b2YocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGdhbW1hIG9mICUuMmYiLCBERUZBVUxUX1RFWFRfR0FNTUEpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgYmxhY2sgZ2FtbWEgdGhyZXNob2xkCisgICAgbUJsYWNrVGhyZXNob2xkID0gREVGQVVMVF9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRDsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xELCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGJsYWNrIGdhbW1hIHRocmVzaG9sZCB0byAlcyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUJsYWNrVGhyZXNob2xkID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHQgYmxhY2sgZ2FtbWEgdGhyZXNob2xkIG9mICVkIiwKKyAgICAgICAgICAgICAgICBERUZBVUxUX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIHdoaXRlIGdhbW1hIHRocmVzaG9sZAorICAgIG1XaGl0ZVRocmVzaG9sZCA9IERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQ7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCB3aGl0ZSBnYW1tYSB0aHJlc2hvbGQgdG8gJXMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1XaGl0ZVRocmVzaG9sZCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB3aGl0ZSBibGFjayBnYW1tYSB0aHJlc2hvbGQgb2YgJWQiLAorICAgICAgICAgICAgICAgIERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQpOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIGdhbW1hIHRhYmxlcworICAgIGNvbnN0IGZsb2F0IGJsYWNrR2FtbWEgPSBnYW1tYTsKKyAgICBjb25zdCBmbG9hdCB3aGl0ZUdhbW1hID0gMS4wZiAvIGdhbW1hOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSAyNTU7IGkrKykgeworICAgICAgICBtRGVmYXVsdFtpXSA9IGk7CisKKyAgICAgICAgY29uc3QgZmxvYXQgdiA9IGkgLyAyNTUuMGY7CisgICAgICAgIGNvbnN0IGZsb2F0IGJsYWNrID0gcG93KHYsIGJsYWNrR2FtbWEpOworICAgICAgICBjb25zdCBmbG9hdCB3aGl0ZSA9IHBvdyh2LCB3aGl0ZUdhbW1hKTsKKworICAgICAgICBtQmxhY2tHYW1tYVtpXSA9IHVpbnQ4X3QoKGZsb2F0KTo6Zmxvb3IoYmxhY2sgKiAyNTUuMGYgKyAwLjVmKSk7CisgICAgICAgIG1XaGl0ZUdhbW1hW2ldID0gdWludDhfdCgoZmxvYXQpOjpmbG9vcih3aGl0ZSAqIDI1NS4wZiArIDAuNWYpKTsKKyAgICB9CisKKyAgICAvLyBDb25maWd1cmUgdGhlIGZvbnQgcmVuZGVyZXJzCisgICAgbURlZmF1bHRSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtRGVmYXVsdFswXSk7CisgICAgbUJsYWNrR2FtbWFSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtQmxhY2tHYW1tYVswXSk7CisgICAgbVdoaXRlR2FtbWFSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtV2hpdGVHYW1tYVswXSk7Cit9CisKK0ZvbnRSZW5kZXJlciYgR2FtbWFGb250UmVuZGVyZXI6OmdldEZvbnRSZW5kZXJlcihjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChwYWludC0+Z2V0U2hhZGVyKCkgPT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBjID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgICAgIGNvbnN0IGludCByID0gKGMgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgY29uc3QgaW50IGcgPSAoYyA+PiAgOCkgJiAweEZGOworICAgICAgICBjb25zdCBpbnQgYiA9IChjICAgICAgKSAmIDB4RkY7CisgICAgICAgIGNvbnN0IGludCBsdW1pbmFuY2UgPSAociAqIDIgKyBnICogNSArIGIpID4+IDM7CisKKyAgICAgICAgaWYgKGx1bWluYW5jZSA8PSBtQmxhY2tUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBtQmxhY2tHYW1tYVJlbmRlcmVyOworICAgICAgICB9IGVsc2UgaWYgKGx1bWluYW5jZSA+PSBtV2hpdGVUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBtV2hpdGVHYW1tYVJlbmRlcmVyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtRGVmYXVsdFJlbmRlcmVyOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5oIGIvbGlicy9od3VpL0dhbW1hRm9udFJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhNDVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfR0FNTUFfRk9OVF9SRU5ERVJFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfR0FNTUFfRk9OVF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisKKyNpbmNsdWRlICJGb250UmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitzdHJ1Y3QgR2FtbWFGb250UmVuZGVyZXIgeworICAgIEdhbW1hRm9udFJlbmRlcmVyKCk7CisKKyAgICBGb250UmVuZGVyZXImIGdldEZvbnRSZW5kZXJlcihjb25zdCBTa1BhaW50KiBwYWludCk7CisKK3ByaXZhdGU6CisgICAgRm9udFJlbmRlcmVyIG1EZWZhdWx0UmVuZGVyZXI7CisgICAgRm9udFJlbmRlcmVyIG1CbGFja0dhbW1hUmVuZGVyZXI7CisgICAgRm9udFJlbmRlcmVyIG1XaGl0ZUdhbW1hUmVuZGVyZXI7CisKKyAgICBpbnQgbUJsYWNrVGhyZXNob2xkOworICAgIGludCBtV2hpdGVUaHJlc2hvbGQ7CisKKyAgICB1aW50OF90IG1EZWZhdWx0WzI1Nl07CisgICAgdWludDhfdCBtQmxhY2tHYW1tYVsyNTZdOworICAgIHVpbnQ4X3QgbVdoaXRlR2FtbWFbMjU2XTsKK307CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HQU1NQV9GT05UX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmNwcCBiL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y0Y2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa0dyYWRpZW50U2hhZGVyLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJHcmFkaWVudENhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dyYWRpZW50Q2FjaGU6OkdyYWRpZW50Q2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa1NoYWRlciosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSkpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9HUkFESUVOVF9DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyBncmFkaWVudCBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgZ3JhZGllbnQgY2FjaGUgc2l6ZSBvZiAlLjJmTUIiLCBERUZBVUxUX0dSQURJRU5UX0NBQ0hFX1NJWkUpOworICAgIH0KKworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworfQorCitHcmFkaWVudENhY2hlOjpHcmFkaWVudENhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa1NoYWRlciosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK0dyYWRpZW50Q2FjaGU6On5HcmFkaWVudENhY2hlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEdyYWRpZW50Q2FjaGU6Om9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgLy8gQWxyZWFkeSBsb2NrZWQgaGVyZQorICAgIGlmIChzaGFkZXIpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHRleHR1cmUtPndpZHRoICogdGV4dHVyZS0+aGVpZ2h0ICogNDsKKyAgICAgICAgbVNpemUgLT0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBHcmFkaWVudENhY2hlOjpnZXQoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1DYWNoZS5nZXQoc2hhZGVyKTsKK30KKwordm9pZCBHcmFkaWVudENhY2hlOjpyZW1vdmUoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLnJlbW92ZShzaGFkZXIpOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OmNsZWFyKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1RleHR1cmUqIEdyYWRpZW50Q2FjaGU6OmFkZExpbmVhckdyYWRpZW50KFNrU2hhZGVyKiBzaGFkZXIsIHVpbnQzMl90KiBjb2xvcnMsCisgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKSB7CisgICAgU2tCaXRtYXAgYml0bWFwOworICAgIGJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnLCAxMDI0LCAxKTsKKyAgICBiaXRtYXAuYWxsb2NQaXhlbHMoKTsKKyAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKKworICAgIFNrQ2FudmFzIGNhbnZhcyhiaXRtYXApOworCisgICAgU2tQb2ludCBwb2ludHNbMl07CisgICAgcG9pbnRzWzBdLnNldCgwLjBmLCAwLjBmKTsKKyAgICBwb2ludHNbMV0uc2V0KGJpdG1hcC53aWR0aCgpLCAwLjBmKTsKKworICAgIFNrU2hhZGVyKiBsb2NhbFNoYWRlciA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwb2ludHMsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFNrQ29sb3IqPihjb2xvcnMpLCBwb3NpdGlvbnMsIGNvdW50LCB0aWxlTW9kZSk7CisKKyAgICBTa1BhaW50IHA7CisgICAgcC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tlQW5kRmlsbF9TdHlsZSk7CisgICAgcC5zZXRTaGFkZXIobG9jYWxTaGFkZXIpLT51bnJlZigpOworCisgICAgY2FudmFzLmRyYXdSZWN0Q29vcmRzKDAuMGYsIDAuMGYsIGJpdG1hcC53aWR0aCgpLCAxLjBmLCBwKTsKKworICAgIG1Mb2NrLmxvY2soKTsKKyAgICAvLyBBc3VtZSB0aGUgY2FjaGUgaXMgYWx3YXlzIGJpZyBlbm91Z2gKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gYml0bWFwLnJvd0J5dGVzKCkgKiBiaXRtYXAuaGVpZ2h0KCk7CisgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBUZXh0dXJlKiB0ZXh0dXJlID0gbmV3IFRleHR1cmU7CisgICAgZ2VuZXJhdGVUZXh0dXJlKCZiaXRtYXAsIHRleHR1cmUpOworCisgICAgbUxvY2subG9jaygpOworICAgIG1TaXplICs9IHNpemU7CisgICAgbUNhY2hlLnB1dChzaGFkZXIsIHRleHR1cmUpOworICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGF1dG9Mb2NrKCpiaXRtYXApOworICAgIGlmICghYml0bWFwLT5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gc2hhZGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsKKyAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBiaXRtYXAtPmhlaWdodCgpOworCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICB0ZXh0dXJlLT5ibGVuZCA9ICFiaXRtYXAtPmlzT3BhcXVlKCk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR3JhZGllbnRDYWNoZS5oIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODg3N2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dSQURJRU5UX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICisKKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgInV0aWxzL0dlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzaW1wbGUgTFJVIGdyYWRpZW50IGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgR3JhZGllbnRDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFNrU2hhZGVyKiwgVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBHcmFkaWVudENhY2hlKCk7CisgICAgR3JhZGllbnRDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkdyYWRpZW50Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgbGluZWFyIGdyYWRpZW50IHRvIHRoZSBjYWNoZS4gVGhlIGdlbmVyYXRlZCB0ZXh0dXJlIGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgVGV4dHVyZSogYWRkTGluZWFyR3JhZGllbnQoU2tTaGFkZXIqIHNoYWRlciwgdWludDMyX3QqIGNvbG9ycywgZmxvYXQqIHBvc2l0aW9ucywKKyAgICAgICAgICAgIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlID0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzaGFkZXIuCisgICAgICovCisgICAgVGV4dHVyZSogZ2V0KFNrU2hhZGVyKiBzaGFkZXIpOworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgc2hhZGVyLiBSZXR1cm5zIE5VTEwKKyAgICAgKiBpZiB0aGUgdGV4dHVyZSBjYW5ub3QgYmUgZm91bmQuIFVwb24gcmVtb3ZlIHRoZSB0ZXh0dXJlIGlzIGZyZWVkLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKFNrU2hhZGVyKiBzaGFkZXIpOworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCB0ZXh0dXJlcyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIHZvaWQgZ2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpOworCisgICAgR2VuZXJhdGlvbkNhY2hlPFNrU2hhZGVyKiwgVGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBhY2Nlc3MgbUNhY2hlIGFuZCBtU2l6ZS4gQWxsIG1ldGhvZHMgYXJlIGFjY2Vzc2VkIGZyb20gYSBzaW5nbGUKKyAgICAgKiB0aHJlYWQgZXhjZXB0IGZvciByZW1vdmUoKS4KKyAgICAgKi8KKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworfTsgLy8gY2xhc3MgR3JhZGllbnRDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfR1JBRElFTlRfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0xheWVyLmggYi9saWJzL2h3dWkvTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZlMmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0xheWVyLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9MQVlFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfTEFZRVJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMYXllcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBBIGxheWVyIGhhcyBkaW1lbnNpb25zIGFuZCBpcyBiYWNrZWQgYnkgYW4gT3BlbkdMIHRleHR1cmUgb3IgRkJPLgorICovCitzdHJ1Y3QgTGF5ZXIgeworICAgIExheWVyKGNvbnN0IHVpbnQzMl90IGxheWVyV2lkdGgsIGNvbnN0IHVpbnQzMl90IGxheWVySGVpZ2h0KToKKyAgICAgICAgICAgIHdpZHRoKGxheWVyV2lkdGgpLCBoZWlnaHQobGF5ZXJIZWlnaHQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCb3VuZHMgb2YgdGhlIGxheWVyLgorICAgICAqLworICAgIFJlY3QgbGF5ZXI7CisgICAgLyoqCisgICAgICogVGV4dHVyZSBjb29yZGluYXRlcyBvZiB0aGUgbGF5ZXIuCisgICAgICovCisgICAgUmVjdCB0ZXhDb29yZHM7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBGQk8gdXNlZCB0byByZW5kZXIgdGhlIGxheWVyLiBJZiB0aGUgbmFtZSBpcyAwCisgICAgICogdGhpcyBsYXllciBpcyBub3QgYmFja2VkIGJ5IGFuIEZCTywgYnV0IGEgc2ltcGxlIHRleHR1cmUuCisgICAgICovCisgICAgR0x1aW50IGZibzsKKworICAgIC8qKgorICAgICAqIE9wYWNpdHkgb2YgdGhlIGxheWVyLgorICAgICAqLworICAgIGludCBhbHBoYTsKKyAgICAvKioKKyAgICAgKiBCbGVuZGluZyBtb2RlIG9mIHRoZSBsYXllci4KKyAgICAgKi8KKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYXllciBzaG91bGQgYmUgYmxlbmRlZC4KKyAgICAgKi8KKyAgICBib29sIGJsZW5kOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYXllciBoYXMgYmVlbiB1c2VkIGFscmVhZHkuCisgICAgICovCisgICAgYm9vbCBlbXB0eTsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUgdXNlZCB0byByZW5kZXIgdGhlIGxheWVyLgorICAgICAqLworICAgIEdMdWludCB0ZXh0dXJlOworICAgIC8qKgorICAgICAqIFdpZHRoIG9mIHRoZSBsYXllciB0ZXh0dXJlLgorICAgICAqLworICAgIHVpbnQzMl90IHdpZHRoOworICAgIC8qKgorICAgICAqIEhlaWdodCBvZiB0aGUgbGF5ZXIgdGV4dHVyZS4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBoZWlnaHQ7Cit9OyAvLyBzdHJ1Y3QgTGF5ZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0xBWUVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcCBiL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWRhOTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0xheWVyQ2FjaGUuY3BwCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJMYXllckNhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0xheWVyQ2FjaGU6OkxheWVyQ2FjaGUoKTogbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfTEFZRVJfQ0FDSEVfU0laRSkpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9MQVlFUl9DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyBsYXllciBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgbGF5ZXIgY2FjaGUgc2l6ZSBvZiAlLjJmTUIiLCBERUZBVUxUX0xBWUVSX0NBQ0hFX1NJWkUpOworICAgIH0KK30KKworTGF5ZXJDYWNoZTo6fkxheWVyQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IExheWVyQ2FjaGU6OmdldFNpemUoKSB7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBMYXllckNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBMYXllckNhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBjbGVhcigpOworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIExheWVyQ2FjaGU6OmRlbGV0ZUxheWVyKExheWVyKiBsYXllcikgeworICAgIGlmIChsYXllcikgeworICAgICAgICBtU2l6ZSAtPSBsYXllci0+d2lkdGggKiBsYXllci0+aGVpZ2h0ICogNDsKKworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisgICAgICAgIGRlbGV0ZSBsYXllcjsKKyAgICB9Cit9CisKK3ZvaWQgTGF5ZXJDYWNoZTo6Y2xlYXIoKSB7CisgICAgc2l6ZV90IGNvdW50ID0gbUNhY2hlLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgZGVsZXRlTGF5ZXIobUNhY2hlLml0ZW1BdChpKS5tTGF5ZXIpOworICAgIH0KKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKworTGF5ZXIqIExheWVyQ2FjaGU6OmdldChjb25zdCB1aW50MzJfdCB3aWR0aCwgY29uc3QgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgTGF5ZXIqIGxheWVyID0gTlVMTDsKKworICAgIExheWVyRW50cnkgZW50cnkod2lkdGgsIGhlaWdodCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mKGVudHJ5KTsKKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIGVudHJ5ID0gbUNhY2hlLml0ZW1BdChpbmRleCk7CisgICAgICAgIG1DYWNoZS5yZW1vdmVBdChpbmRleCk7CisKKyAgICAgICAgbGF5ZXIgPSBlbnRyeS5tTGF5ZXI7CisgICAgICAgIG1TaXplIC09IGxheWVyLT53aWR0aCAqIGxheWVyLT5oZWlnaHQgKiA0OworCisgICAgICAgIExBWUVSX0xPR0QoIlJldXNpbmcgbGF5ZXIgJWR4JWQiLCBsYXllci0+d2lkdGgsIGxheWVyLT5oZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIExBWUVSX0xPR0QoIkNyZWF0aW5nIG5ldyBsYXllciAlZHglZCIsIGVudHJ5Lm1XaWR0aCwgZW50cnkubUhlaWdodCk7CisKKyAgICAgICAgbGF5ZXIgPSBuZXcgTGF5ZXIoZW50cnkubVdpZHRoLCBlbnRyeS5tSGVpZ2h0KTsKKyAgICAgICAgbGF5ZXItPmJsZW5kID0gdHJ1ZTsKKyAgICAgICAgbGF5ZXItPmVtcHR5ID0gdHJ1ZTsKKyAgICAgICAgbGF5ZXItPmZibyA9IDA7CisKKyAgICAgICAgZ2xHZW5UZXh0dXJlcygxLCAmbGF5ZXItPnRleHR1cmUpOworICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGxheWVyLT50ZXh0dXJlKTsKKworICAgICAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDQpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKworI2lmIERFQlVHX0xBWUVSUworICAgICAgICBzaXplX3Qgc2l6ZSA9IG1DYWNoZS5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBMYXllckVudHJ5JiBlbnRyeSA9IG1DYWNoZS5pdGVtQXQoaSk7CisgICAgICAgICAgICBMQVlFUl9MT0dEKCIgIExheWVyIHNpemUgJWR4JWQiLCBlbnRyeS5tV2lkdGgsIGVudHJ5Lm1IZWlnaHQpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gbGF5ZXI7Cit9CisKK2Jvb2wgTGF5ZXJDYWNoZTo6cHV0KExheWVyKiBsYXllcikgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBsYXllci0+d2lkdGggKiBsYXllci0+aGVpZ2h0ICogNDsKKyAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGxheWVyIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIC8vIFRPRE86IFVzZSBhbiBMUlUKKyAgICAgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgICAgICBMYXllciogYmlnZ2VzdCA9IG1DYWNoZS50b3AoKS5tTGF5ZXI7CisgICAgICAgICAgICBkZWxldGVMYXllcihiaWdnZXN0KTsKKyAgICAgICAgICAgIG1DYWNoZS5yZW1vdmVBdChtQ2FjaGUuc2l6ZSgpIC0gMSk7CisKKyAgICAgICAgICAgIExBWUVSX0xPR0QoIiAgRGVsZXRpbmcgbGF5ZXIgJS4yZnglLjJmIiwgYmlnZ2VzdC0+bGF5ZXIuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgYmlnZ2VzdC0+bGF5ZXIuZ2V0SGVpZ2h0KCkpOworICAgICAgICB9CisKKyAgICAgICAgTGF5ZXJFbnRyeSBlbnRyeShsYXllcik7CisKKyAgICAgICAgbUNhY2hlLmFkZChlbnRyeSk7CisgICAgICAgIG1TaXplICs9IHNpemU7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oIGIvbGlicy9od3VpL0xheWVyQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQzNjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0xheWVyQ2FjaGUuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfTEFZRVJfQ0FDSEVfSAorCisjaW5jbHVkZSAiTGF5ZXIuaCIKKyNpbmNsdWRlICJ1dGlscy9Tb3J0ZWRMaXN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBEZWJ1ZworI2RlZmluZSBERUJVR19MQVlFUlMgMAorCisvLyBUZXh0dXJlcyB1c2VkIGJ5IGxheWVycyBtdXN0IGhhdmUgZGltZW5zaW9ucyBtdWx0aXBsZXMgb2YgdGhpcyBudW1iZXIKKyNkZWZpbmUgTEFZRVJfU0laRSA2NAorCisvLyBEZWJ1ZworI2lmIERFQlVHX0xBWUVSUworICAgICNkZWZpbmUgTEFZRVJfTE9HRCguLi4pIExPR0QoX19WQV9BUkdTX18pCisjZWxzZQorICAgICNkZWZpbmUgTEFZRVJfTE9HRCguLi4pCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgTGF5ZXJDYWNoZSB7CitwdWJsaWM6CisgICAgTGF5ZXJDYWNoZSgpOworICAgIH5MYXllckNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGF5ZXIgbGFyZ2UgZW5vdWdoIGZvciB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMuIElmIG5vIHN1aXRhYmxlCisgICAgICogbGF5ZXIgY2FuIGJlIGZvdW5kLCBhIG5ldyBvbmUgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuIElmIGNyZWF0aW5nIGEgbmV3CisgICAgICogbGF5ZXIgZmFpbHMsIE5VTEwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBXaGVuIGEgbGF5ZXIgaXMgb2J0YWluZWQgZnJvbSB0aGUgY2FjaGUsIGl0IGlzIHJlbW92ZWQgYW5kIHRoZSB0b3RhbAorICAgICAqIHNpemUgb2YgdGhlIGNhY2hlIGdvZXMgZG93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgZGVzaXJlZCB3aWR0aCBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIGRlc2lyZWQgaGVpZ2h0IG9mIHRoZSBsYXllcgorICAgICAqLworICAgIExheWVyKiBnZXQoY29uc3QgdWludDMyX3Qgd2lkdGgsIGNvbnN0IHVpbnQzMl90IGhlaWdodCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBsYXllciB0byB0aGUgY2FjaGUuIFRoZSBsYXllciB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGVyZSBpcworICAgICAqIG5vdCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlLiBBZGRpbmcgYSBsYXllciBjYW4gY2F1c2Ugb3RoZXIgbGF5ZXJzIHRvCisgICAgICogYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYXllciBUaGUgbGF5ZXIgdG8gYWRkIHRvIHRoZSBjYWNoZQorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsYXllciB3YXMgYWRkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHB1dChMYXllciogbGF5ZXIpOworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCBsYXllcnMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGRlbGV0ZUxheWVyKExheWVyKiBsYXllcik7CisKKyAgICBzdHJ1Y3QgTGF5ZXJFbnRyeSB7CisgICAgICAgIExheWVyRW50cnkoKToKKyAgICAgICAgICAgIG1MYXllcihOVUxMKSwgbVdpZHRoKDApLCBtSGVpZ2h0KDApIHsKKyAgICAgICAgfQorCisgICAgICAgIExheWVyRW50cnkoY29uc3QgdWludDMyX3QgbGF5ZXJXaWR0aCwgY29uc3QgdWludDMyX3QgbGF5ZXJIZWlnaHQpOiBtTGF5ZXIoTlVMTCkgeworICAgICAgICAgICAgbVdpZHRoID0gdWludDMyX3QoY2VpbGYobGF5ZXJXaWR0aCAvIGZsb2F0KExBWUVSX1NJWkUpKSAqIExBWUVSX1NJWkUpOworICAgICAgICAgICAgbUhlaWdodCA9IHVpbnQzMl90KGNlaWxmKGxheWVySGVpZ2h0IC8gZmxvYXQoTEFZRVJfU0laRSkpICogTEFZRVJfU0laRSk7CisgICAgICAgIH0KKworICAgICAgICBMYXllckVudHJ5KGNvbnN0IExheWVyRW50cnkmIGVudHJ5KToKKyAgICAgICAgICAgIG1MYXllcihlbnRyeS5tTGF5ZXIpLCBtV2lkdGgoZW50cnkubVdpZHRoKSwgbUhlaWdodChlbnRyeS5tSGVpZ2h0KSB7CisgICAgICAgIH0KKworICAgICAgICBMYXllckVudHJ5KExheWVyKiBsYXllcik6CisgICAgICAgICAgICBtTGF5ZXIobGF5ZXIpLCBtV2lkdGgobGF5ZXItPndpZHRoKSwgbUhlaWdodChsYXllci0+aGVpZ2h0KSB7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBMYXllckVudHJ5JiByaHMpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmIChtV2lkdGggPT0gcmhzLm1XaWR0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtSGVpZ2h0IDwgcmhzLm1IZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbVdpZHRoIDwgcmhzLm1XaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMYXllckVudHJ5JiByaHMpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtV2lkdGggPT0gcmhzLm1XaWR0aCAmJiBtSGVpZ2h0ID09IHJocy5tSGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgTGF5ZXIqIG1MYXllcjsKKyAgICAgICAgdWludDMyX3QgbVdpZHRoOworICAgICAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIH07IC8vIHN0cnVjdCBMYXllckVudHJ5CisKKyAgICBTb3J0ZWRMaXN0PExheWVyRW50cnk+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworfTsgLy8gY2xhc3MgTGF5ZXJDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfTEFZRVJfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0xpbmUuaCBiL2xpYnMvaHd1aS9MaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiZGQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9MaW5lLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfTElORV9ICisjZGVmaW5lIEFORFJPSURfVUlfTElORV9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJQYXRjaC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdsb2JhbHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gQWxwaGE4IHRleHR1cmUgdXNlZCB0byBwZXJmb3JtIHRleHR1cmUgYW50aS1hbGlhc2luZworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ0xpbmVUZXh0dXJlW10gPSB7CisgICAgICAgIDAsICAgMCwgICAwLCAgIDAsIDAsCisgICAgICAgIDAsIDI1NSwgMjU1LCAyNTUsIDAsCisgICAgICAgIDAsIDI1NSwgMjU1LCAyNTUsIDAsCisgICAgICAgIDAsIDI1NSwgMjU1LCAyNTUsIDAsCisgICAgICAgIDAsICAgMCwgICAwLCAgIDAsIDAKK307CitzdGF0aWMgY29uc3QgR0xzaXplaSBnTGluZVRleHR1cmVXaWR0aCA9IDU7CitzdGF0aWMgY29uc3QgR0xzaXplaSBnTGluZVRleHR1cmVIZWlnaHQgPSA1Oworc3RhdGljIGNvbnN0IGZsb2F0IGdMaW5lQUFCaWFzID0gMS4wZjsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTGluZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBMaW5lIHsKK3B1YmxpYzoKKyAgICBMaW5lKCk6IG1YRGl2c0NvdW50KDIpLCBtWURpdnNDb3VudCgyKSB7CisgICAgICAgIG1QYXRjaCA9IG5ldyBQYXRjaChtWERpdnNDb3VudCwgbVlEaXZzQ291bnQpOworICAgICAgICBtWERpdnMgPSBuZXcgaW50MzJfdFttWERpdnNDb3VudF07CisgICAgICAgIG1ZRGl2cyA9IG5ldyBpbnQzMl90W21ZRGl2c0NvdW50XTsKKworICAgICAgICBtWERpdnNbMF0gPSBtWURpdnNbMF0gPSAyOworICAgICAgICBtWERpdnNbMV0gPSBtWURpdnNbMV0gPSAzOworCisgICAgICAgIGdsR2VuVGV4dHVyZXMoMSwgJm1UZXh0dXJlKTsKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZSk7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgZ0xpbmVUZXh0dXJlV2lkdGgsIGdMaW5lVGV4dHVyZUhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgZ0xpbmVUZXh0dXJlKTsKKyAgICB9CisKKyAgICB+TGluZSgpIHsKKyAgICAgICAgZGVsZXRlIG1QYXRjaDsKKyAgICAgICAgZGVsZXRlW10gbVhEaXZzOworICAgICAgICBkZWxldGVbXSBtWURpdnM7CisKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbVRleHR1cmUpOworICAgIH0KKworICAgIGlubGluZSBmbG9hdCBnZXRMZW5ndGgoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpIHsKKyAgICAgICAgcmV0dXJuIHNxcnRmKCh4MiAtIHgxKSAqICh4MiAtIHgxKSArICh5MiAtIHkxKSAqICh5MiAtIHkxKSk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IGxpbmVXaWR0aCwgZmxvYXQmIHR4LCBmbG9hdCYgdHkpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgbGVuZ3RoID0gZ2V0TGVuZ3RoKHgxLCB5MSwgeDIsIHkyKTsKKyAgICAgICAgY29uc3QgZmxvYXQgaGFsZiA9IGxpbmVXaWR0aCAqIDAuNWY7CisKKyAgICAgICAgbVBhdGNoLT51cGRhdGVWZXJ0aWNlcyhnTGluZVRleHR1cmVXaWR0aCwgZ0xpbmVUZXh0dXJlSGVpZ2h0LAorICAgICAgICAgICAgICAgIC1nTGluZUFBQmlhcywgLWhhbGYgLSBnTGluZUFBQmlhcywgbGVuZ3RoICsgZ0xpbmVBQUJpYXMsIGhhbGYgKyBnTGluZUFBQmlhcywKKyAgICAgICAgICAgICAgICBtWERpdnMsIG1ZRGl2cywgbVhEaXZzQ291bnQsIG1ZRGl2c0NvdW50KTsKKworICAgICAgICB0eCA9IC1nTGluZUFBQmlhczsKKyAgICAgICAgdHkgPSBsaW5lV2lkdGggPD0gMS4wZiA/IC1nTGluZUFBQmlhcyA6IC1oYWxmIC0gZ0xpbmVBQUJpYXM7CisgICAgfQorCisgICAgaW5saW5lIEdMdm9pZCogZ2V0VmVydGljZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAmbVBhdGNoLT52ZXJ0aWNlc1swXS5wb3NpdGlvblswXTsKKyAgICB9CisKKyAgICBpbmxpbmUgR0x2b2lkKiBnZXRUZXhDb29yZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAmbVBhdGNoLT52ZXJ0aWNlc1swXS50ZXh0dXJlWzBdOworICAgIH0KKworICAgIGlubGluZSBHTHNpemVpIGdldEVsZW1lbnRzQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGF0Y2gtPnZlcnRpY2VzQ291bnQ7CisgICAgfQorCisgICAgaW5saW5lIEdMdWludCBnZXRUZXh0dXJlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRleHR1cmU7CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1YRGl2c0NvdW50OworICAgIHVpbnQzMl90IG1ZRGl2c0NvdW50OworCisgICAgaW50MzJfdCogbVhEaXZzOworICAgIGludDMyX3QqIG1ZRGl2czsKKworICAgIFBhdGNoKiBtUGF0Y2g7CisKKyAgICBHTHVpbnQgbVRleHR1cmU7Cit9OyAvLyBjbGFzcyBMaW5lCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9MSU5FX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlicy9od3VpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTWF0cml4LmNwcCBiL2xpYnMvaHd1aS9NYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOWZkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTWF0cml4LmNwcApAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisKKyNpbmNsdWRlICJNYXRyaXguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCit2b2lkIE1hdHJpeDQ6OmxvYWRJZGVudGl0eSgpIHsKKyAgICBkYXRhW2tTY2FsZVhdICAgICAgID0gMS4wZjsKKyAgICBkYXRhW2tTa2V3WV0gICAgICAgID0gMC4wZjsKKyAgICBkYXRhWzJdICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTBdID0gMC4wZjsKKworICAgIGRhdGFba1NrZXdYXSAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1NjYWxlWV0gICAgICAgPSAxLjBmOworICAgIGRhdGFbNl0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1BlcnNwZWN0aXZlMV0gPSAwLjBmOworCisgICAgZGF0YVs4XSAgICAgICAgICAgICA9IDAuMGY7CisgICAgZGF0YVs5XSAgICAgICAgICAgICA9IDAuMGY7CisgICAgZGF0YVtrU2NhbGVaXSAgICAgICA9IDEuMGY7CisgICAgZGF0YVsxMV0gICAgICAgICAgICA9IDAuMGY7CisKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSAgID0gMC4wZjsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSAgID0gMC4wZjsKKyAgICBkYXRhW2tUcmFuc2xhdGVaXSAgID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTJdID0gMS4wZjsKKworICAgIG1TaW1wbGVNYXRyaXggPSB0cnVlOworfQorCisjZGVmaW5lIEVQU0lMT04gMC4wMDAwMWYKKyNkZWZpbmUgYWxtb3N0KHUsIHYpIChmYWJzKCh1KSAtICh2KSkgPCBFUFNJTE9OKQorCitib29sIE1hdHJpeDQ6OmNoYW5nZXNCb3VuZHMoKSB7CisgICAgcmV0dXJuICEoYWxtb3N0KGRhdGFbMF0sIDEuMGYpICYmIGFsbW9zdChkYXRhWzFdLCAwLjBmKSAmJiBhbG1vc3QoZGF0YVsyXSwgMC4wZikgJiYKKyAgICAgICAgICAgICBhbG1vc3QoZGF0YVs0XSwgMC4wZikgJiYgYWxtb3N0KGRhdGFbNV0sIDEuMGYpICYmIGFsbW9zdChkYXRhWzZdLCAwLjBmKSAmJgorICAgICAgICAgICAgIGFsbW9zdChkYXRhWzhdLCAwLjBmKSAmJiBhbG1vc3QoZGF0YVs5XSwgMC4wZikgJiYgYWxtb3N0KGRhdGFbMTBdLCAxLjBmKSk7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBmbG9hdCogdikgeworICAgIG1lbWNweShkYXRhLCB2LCBzaXplb2YoZGF0YSkpOworICAgIG1TaW1wbGVNYXRyaXggPSBmYWxzZTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICBtZW1jcHkoZGF0YSwgdi5kYXRhLCBzaXplb2YoZGF0YSkpOworICAgIG1TaW1wbGVNYXRyaXggPSB2Lm1TaW1wbGVNYXRyaXg7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBTa01hdHJpeCYgdikgeworICAgIG1lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCisgICAgZGF0YVtrU2NhbGVYXSAgICAgPSB2W1NrTWF0cml4OjprTVNjYWxlWF07CisgICAgZGF0YVtrU2tld1hdICAgICAgPSB2W1NrTWF0cml4OjprTVNrZXdYXTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9IHZbU2tNYXRyaXg6OmtNVHJhbnNYXTsKKworICAgIGRhdGFba1NrZXdZXSAgICAgID0gdltTa01hdHJpeDo6a01Ta2V3WV07CisgICAgZGF0YVtrU2NhbGVZXSAgICAgPSB2W1NrTWF0cml4OjprTVNjYWxlWV07CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gPSB2W1NrTWF0cml4OjprTVRyYW5zWV07CisKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTBdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AwXTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AxXTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTJdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AyXTsKKworICAgIGRhdGFba1NjYWxlWl0gPSAxLjBmOworCisgICAgbVNpbXBsZU1hdHJpeCA9ICh2LmdldFR5cGUoKSA8PSBTa01hdHJpeDo6a1NjYWxlX01hc2spOworfQorCit2b2lkIE1hdHJpeDQ6OmNvcHlUbyhTa01hdHJpeCYgdikgY29uc3QgeworICAgIHYucmVzZXQoKTsKKworICAgIHYuc2V0KFNrTWF0cml4OjprTVNjYWxlWCwgZGF0YVtrU2NhbGVYXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2tld1gsICBkYXRhW2tTa2V3WF0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVRyYW5zWCwgZGF0YVtrVHJhbnNsYXRlWF0pOworCisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2tld1ksICBkYXRhW2tTa2V3WV0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVNjYWxlWSwgZGF0YVtrU2NhbGVZXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNVHJhbnNZLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisKKyAgICB2LnNldChTa01hdHJpeDo6a01QZXJzcDAsIGRhdGFba1BlcnNwZWN0aXZlMF0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVBlcnNwMSwgZGF0YVtrUGVyc3BlY3RpdmUxXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNUGVyc3AyLCBkYXRhW2tQZXJzcGVjdGl2ZTJdKTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkSW52ZXJzZShjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgZG91YmxlIHNjYWxlID0gMS4wIC8KKyAgICAgICAgICAgICh2LmRhdGFba1NjYWxlWF0gKiAoKGRvdWJsZSkgdi5kYXRhW2tTY2FsZVldICAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSAtCisgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHYuZGF0YVtrVHJhbnNsYXRlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0pICsKKyAgICAgICAgICAgICB2LmRhdGFba1NrZXdYXSAqICgoZG91YmxlKSB2LmRhdGFba1RyYW5zbGF0ZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdIC0KKyAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHYuZGF0YVtrU2tld1ldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdKSArCisgICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVYXSAqICgoZG91YmxlKSB2LmRhdGFba1NrZXdZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSAtCisgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSB2LmRhdGFba1NjYWxlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0pKTsKKworICAgIGRhdGFba1NjYWxlWF0gPSAodi5kYXRhW2tTY2FsZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrVHJhbnNsYXRlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0pICAqIHNjYWxlOworICAgIGRhdGFba1NrZXdYXSA9ICh2LmRhdGFba1RyYW5zbGF0ZVhdICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2tld1hdICAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSkgKiBzY2FsZTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9ICh2LmRhdGFba1NrZXdYXSAqIHYuZGF0YVtrVHJhbnNsYXRlWV0gLQorICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrU2NhbGVZXSkgICogc2NhbGU7CisKKyAgICBkYXRhW2tTa2V3WV0gPSAodi5kYXRhW2tUcmFuc2xhdGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSAtCisgICAgICAgICAgICB2LmRhdGFba1NrZXdZXSAgKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0pICogc2NhbGU7CisgICAgZGF0YVtrU2NhbGVZXSA9ICh2LmRhdGFba1NjYWxlWF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0gLQorICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSkgICogc2NhbGU7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gPSAodi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrU2tld1ldIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2NhbGVYXSAgKiB2LmRhdGFba1RyYW5zbGF0ZVldKSAqIHNjYWxlOworCisgICAgZGF0YVtrUGVyc3BlY3RpdmUwXSA9ICh2LmRhdGFba1NrZXdZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSAtCisgICAgICAgICAgICB2LmRhdGFba1NjYWxlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0pICogc2NhbGU7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUxXSA9ICh2LmRhdGFba1NrZXdYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSAtCisgICAgICAgICAgICB2LmRhdGFba1NjYWxlWF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0pICogc2NhbGU7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUyXSA9ICh2LmRhdGFba1NjYWxlWF0gKiB2LmRhdGFba1NjYWxlWV0gLQorICAgICAgICAgICAgdi5kYXRhW2tTa2V3WF0gKiB2LmRhdGFba1NrZXdZXSkgKiBzY2FsZTsKKworICAgIG1TaW1wbGVNYXRyaXggPSB2Lm1TaW1wbGVNYXRyaXg7Cit9CisKK3ZvaWQgTWF0cml4NDo6Y29weVRvKGZsb2F0KiB2KSBjb25zdCB7CisgICAgbWVtY3B5KHYsIGRhdGEsIHNpemVvZihkYXRhKSk7Cit9CisKK2Zsb2F0IE1hdHJpeDQ6OmdldFRyYW5zbGF0ZVgoKSB7CisgICAgcmV0dXJuIGRhdGFba1RyYW5zbGF0ZVhdOworfQorCitmbG9hdCBNYXRyaXg0OjpnZXRUcmFuc2xhdGVZKCkgeworICAgIHJldHVybiBkYXRhW2tUcmFuc2xhdGVZXTsKK30KKwordm9pZCBNYXRyaXg0OjptdWx0aXBseShmbG9hdCB2KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGRhdGFbaV0gKj0gdjsKKyAgICB9Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVtrVHJhbnNsYXRlWF0gPSB4OworICAgIGRhdGFba1RyYW5zbGF0ZVldID0geTsKKyAgICBkYXRhW2tUcmFuc2xhdGVaXSA9IHo7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgc3opIHsKKyAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICBkYXRhW2tTY2FsZVhdID0gc3g7CisgICAgZGF0YVtrU2NhbGVZXSA9IHN5OworICAgIGRhdGFba1NjYWxlWl0gPSBzejsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkUm90YXRlKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUwXSAgPSAwLjBmOworICAgIGRhdGFba1BlcnNwZWN0aXZlMV0gID0gMC4wZjsKKyAgICBkYXRhWzExXSAgICAgICAgICAgICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWF0gICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVldICAgID0gMC4wZjsKKyAgICBkYXRhW2tUcmFuc2xhdGVaXSAgICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUyXSAgPSAxLjBmOworCisgICAgYW5nbGUgKj0gZmxvYXQoTV9QSSAvIDE4MC4wZik7CisgICAgZmxvYXQgYyA9IGNvc2YoYW5nbGUpOworICAgIGZsb2F0IHMgPSBzaW5mKGFuZ2xlKTsKKworICAgIGNvbnN0IGZsb2F0IGxlbmd0aCA9IHNxcnRmKHggKiB4ICsgeSAqIHkgKyB6ICogeik7CisgICAgZmxvYXQgcmVjaXBMZW4gPSAxLjBmIC8gbGVuZ3RoOworICAgIHggKj0gcmVjaXBMZW47CisgICAgeSAqPSByZWNpcExlbjsKKyAgICB6ICo9IHJlY2lwTGVuOworCisgICAgY29uc3QgZmxvYXQgbmMgPSAxLjBmIC0gYzsKKyAgICBjb25zdCBmbG9hdCB4eSA9IHggKiB5OworICAgIGNvbnN0IGZsb2F0IHl6ID0geSAqIHo7CisgICAgY29uc3QgZmxvYXQgenggPSB6ICogeDsKKyAgICBjb25zdCBmbG9hdCB4cyA9IHggKiBzOworICAgIGNvbnN0IGZsb2F0IHlzID0geSAqIHM7CisgICAgY29uc3QgZmxvYXQgenMgPSB6ICogczsKKworICAgIGRhdGFba1NjYWxlWF0gPSB4ICogeCAqIG5jICsgIGM7CisgICAgZGF0YVtrU2tld1hdICA9ICAgIHh5ICogbmMgLSB6czsKKyAgICBkYXRhWzhdICAgICAgID0gICAgenggKiBuYyArIHlzOworICAgIGRhdGFba1NrZXdZXSAgPSAgICB4eSAqIG5jICsgenM7CisgICAgZGF0YVtrU2NhbGVZXSA9IHkgKiB5ICogbmMgKyAgYzsKKyAgICBkYXRhWzldICAgICAgID0gICAgeXogKiBuYyAtIHhzOworICAgIGRhdGFbMl0gICAgICAgPSAgICB6eCAqIG5jIC0geXM7CisgICAgZGF0YVs2XSAgICAgICA9ICAgIHl6ICogbmMgKyB4czsKKyAgICBkYXRhW2tTY2FsZVpdID0geiAqIHogKiBuYyArICBjOworCisgICAgbVNpbXBsZU1hdHJpeCA9IGZhbHNlOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRNdWx0aXBseShjb25zdCBNYXRyaXg0JiB1LCBjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgNCA7IGkrKykgeworICAgICAgICBmbG9hdCB4ID0gMDsKKyAgICAgICAgZmxvYXQgeSA9IDA7CisgICAgICAgIGZsb2F0IHogPSAwOworICAgICAgICBmbG9hdCB3ID0gMDsKKworICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCA0IDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBlID0gdi5nZXQoaSwgaik7CisgICAgICAgICAgICB4ICs9IHUuZ2V0KGosIDApICogZTsKKyAgICAgICAgICAgIHkgKz0gdS5nZXQoaiwgMSkgKiBlOworICAgICAgICAgICAgeiArPSB1LmdldChqLCAyKSAqIGU7CisgICAgICAgICAgICB3ICs9IHUuZ2V0KGosIDMpICogZTsKKyAgICAgICAgfQorCisgICAgICAgIHNldChpLCAwLCB4KTsKKyAgICAgICAgc2V0KGksIDEsIHkpOworICAgICAgICBzZXQoaSwgMiwgeik7CisgICAgICAgIHNldChpLCAzLCB3KTsKKyAgICB9CisKKyAgICBtU2ltcGxlTWF0cml4ID0gdS5tU2ltcGxlTWF0cml4ICYmIHYubVNpbXBsZU1hdHJpeDsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkT3J0aG8oZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICBkYXRhW2tTY2FsZVhdID0gMi4wZiAvIChyaWdodCAtIGxlZnQpOworICAgIGRhdGFba1NjYWxlWV0gPSAyLjBmIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgZGF0YVtrU2NhbGVaXSA9IC0yLjBmIC8gKGZhciAtIG5lYXIpOworICAgIGRhdGFba1RyYW5zbGF0ZVhdID0gLShyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gPSAtKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKTsKKyAgICBkYXRhW2tUcmFuc2xhdGVaXSA9IC0oZmFyICsgbmVhcikgLyAoZmFyIC0gbmVhcik7Cit9CisKKyNkZWZpbmUgTVVMX0FERF9TVE9SRShhLCBiLCBjKSBhID0gKGEpICogKGIpICsgKGMpCisKK3ZvaWQgTWF0cml4NDo6bWFwUG9pbnQoZmxvYXQmIHgsIGZsb2F0JiB5KSBjb25zdCB7CisgICAgaWYgKG1TaW1wbGVNYXRyaXgpIHsKKyAgICAgICAgTVVMX0FERF9TVE9SRSh4LCBkYXRhW2tTY2FsZVhdLCBkYXRhW2tUcmFuc2xhdGVYXSk7CisgICAgICAgIE1VTF9BRERfU1RPUkUoeSwgZGF0YVtrU2NhbGVZXSwgZGF0YVtrVHJhbnNsYXRlWV0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgZHggPSB4ICogZGF0YVtrU2NhbGVYXSArIHkgKiBkYXRhW2tTa2V3WF0gKyBkYXRhW2tUcmFuc2xhdGVYXTsKKyAgICBmbG9hdCBkeSA9IHggKiBkYXRhW2tTa2V3WV0gKyB5ICogZGF0YVtrU2NhbGVZXSArIGRhdGFba1RyYW5zbGF0ZVldOworICAgIGZsb2F0IGR6ID0geCAqIGRhdGFba1BlcnNwZWN0aXZlMF0gKyB5ICogZGF0YVtrUGVyc3BlY3RpdmUxXSArIGRhdGFba1BlcnNwZWN0aXZlMl07CisgICAgaWYgKGR6KSBkeiA9IDEuMGYgLyBkejsKKworICAgIHggPSBkeCAqIGR6OworICAgIHkgPSBkeSAqIGR6OworfQorCit2b2lkIE1hdHJpeDQ6Om1hcFJlY3QoUmVjdCYgcikgY29uc3QgeworICAgIGlmIChtU2ltcGxlTWF0cml4KSB7CisgICAgICAgIE1VTF9BRERfU1RPUkUoci5sZWZ0LCBkYXRhW2tTY2FsZVhdLCBkYXRhW2tUcmFuc2xhdGVYXSk7CisgICAgICAgIE1VTF9BRERfU1RPUkUoci5yaWdodCwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrVHJhbnNsYXRlWF0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHIudG9wLCBkYXRhW2tTY2FsZVldLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisgICAgICAgIE1VTF9BRERfU1RPUkUoci5ib3R0b20sIGRhdGFba1NjYWxlWV0sIGRhdGFba1RyYW5zbGF0ZVldKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0IHZlcnRpY2VzW10gPSB7CisgICAgICAgIHIubGVmdCwgci50b3AsCisgICAgICAgIHIucmlnaHQsIHIudG9wLAorICAgICAgICByLnJpZ2h0LCByLmJvdHRvbSwKKyAgICAgICAgci5sZWZ0LCByLmJvdHRvbQorICAgIH07CisKKyAgICBmbG9hdCB4LCB5LCB6OworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKz0gMikgeworICAgICAgICBmbG9hdCBweCA9IHZlcnRpY2VzW2ldOworICAgICAgICBmbG9hdCBweSA9IHZlcnRpY2VzW2kgKyAxXTsKKworICAgICAgICB4ID0gcHggKiBkYXRhW2tTY2FsZVhdICsgcHkgKiBkYXRhW2tTa2V3WF0gKyBkYXRhW2tUcmFuc2xhdGVYXTsKKyAgICAgICAgeSA9IHB4ICogZGF0YVtrU2tld1ldICsgcHkgKiBkYXRhW2tTY2FsZVldICsgZGF0YVtrVHJhbnNsYXRlWV07CisgICAgICAgIHogPSBweCAqIGRhdGFba1BlcnNwZWN0aXZlMF0gKyBweSAqIGRhdGFba1BlcnNwZWN0aXZlMV0gKyBkYXRhW2tQZXJzcGVjdGl2ZTJdOworICAgICAgICBpZiAoeikgeiA9IDEuMGYgLyB6OworCisgICAgICAgIHZlcnRpY2VzW2ldID0geCAqIHo7CisgICAgICAgIHZlcnRpY2VzW2kgKyAxXSA9IHkgKiB6OworICAgIH0KKworICAgIHIubGVmdCA9IHIucmlnaHQgPSB2ZXJ0aWNlc1swXTsKKyAgICByLnRvcCA9IHIuYm90dG9tID0gdmVydGljZXNbMV07CisKKyAgICBmb3IgKGludCBpID0gMjsgaSA8IDg7IGkgKz0gMikgeworICAgICAgICB4ID0gdmVydGljZXNbaV07CisgICAgICAgIHkgPSB2ZXJ0aWNlc1tpICsgMV07CisKKyAgICAgICAgaWYgKHggPCByLmxlZnQpIHIubGVmdCA9IHg7CisgICAgICAgIGVsc2UgaWYgKHggPiByLnJpZ2h0KSByLnJpZ2h0ID0geDsKKyAgICAgICAgaWYgKHkgPCByLnRvcCkgci50b3AgPSB5OworICAgICAgICBlbHNlIGlmICh5ID4gci5ib3R0b20pIHIuYm90dG9tID0geTsKKyAgICB9Cit9CisKK3ZvaWQgTWF0cml4NDo6ZHVtcCgpIGNvbnN0IHsKKyAgICBMT0dEKCJNYXRyaXg0W3NpbXBsZT0lZCIsIG1TaW1wbGVNYXRyaXgpOworICAgIExPR0QoIiAgJWYgJWYgJWYgJWYiLCBkYXRhW2tTY2FsZVhdLCBkYXRhW2tTa2V3WF0sIGRhdGFbOF0sIGRhdGFba1RyYW5zbGF0ZVhdKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVtrU2tld1ldLCBkYXRhW2tTY2FsZVldLCBkYXRhWzldLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFbMl0sIGRhdGFbNl0sIGRhdGFba1NjYWxlWl0sIGRhdGFba1RyYW5zbGF0ZVpdKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVtrUGVyc3BlY3RpdmUwXSwgZGF0YVtrUGVyc3BlY3RpdmUxXSwgZGF0YVsxMV0sIGRhdGFba1BlcnNwZWN0aXZlMl0pOworICAgIExPR0QoIl0iKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTWF0cml4LmggYi9saWJzL2h3dWkvTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4MTE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9NYXRyaXguaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9NQVRSSVhfSAorI2RlZmluZSBBTkRST0lEX1VJX01BVFJJWF9ICisKKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsYXNzZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgTWF0cml4NCB7CitwdWJsaWM6CisgICAgZmxvYXQgZGF0YVsxNl07CisKKyAgICBlbnVtIEVudHJ5IHsKKyAgICAgICAga1NjYWxlWCA9IDAsCisgICAgICAgIGtTa2V3WSA9IDEsCisgICAgICAgIGtQZXJzcGVjdGl2ZTAgPSAzLAorICAgICAgICBrU2tld1ggPSA0LAorICAgICAgICBrU2NhbGVZID0gNSwKKyAgICAgICAga1BlcnNwZWN0aXZlMSA9IDcsCisgICAgICAgIGtTY2FsZVogPSAxMCwKKyAgICAgICAga1RyYW5zbGF0ZVggPSAxMiwKKyAgICAgICAga1RyYW5zbGF0ZVkgPSAxMywKKyAgICAgICAga1RyYW5zbGF0ZVogPSAxNCwKKyAgICAgICAga1BlcnNwZWN0aXZlMiA9IDE1CisgICAgfTsKKworICAgIE1hdHJpeDQoKSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgZmxvYXQqIHYpIHsKKyAgICAgICAgbG9hZCh2KTsKKyAgICB9CisKKyAgICBNYXRyaXg0KGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICAgICAgbG9hZCh2KTsKKyAgICB9CisKKyAgICBNYXRyaXg0KGNvbnN0IFNrTWF0cml4JiB2KSB7CisgICAgICAgIGxvYWQodik7CisgICAgfQorCisgICAgdm9pZCBsb2FkSWRlbnRpdHkoKTsKKworICAgIHZvaWQgbG9hZChjb25zdCBmbG9hdCogdik7CisgICAgdm9pZCBsb2FkKGNvbnN0IE1hdHJpeDQmIHYpOworICAgIHZvaWQgbG9hZChjb25zdCBTa01hdHJpeCYgdik7CisKKyAgICB2b2lkIGxvYWRJbnZlcnNlKGNvbnN0IE1hdHJpeDQmIHYpOworCisgICAgdm9pZCBsb2FkVHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworICAgIHZvaWQgbG9hZFNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgc3opOworICAgIHZvaWQgbG9hZFJvdGF0ZShmbG9hdCBhbmdsZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CisgICAgdm9pZCBsb2FkTXVsdGlwbHkoY29uc3QgTWF0cml4NCYgdSwgY29uc3QgTWF0cml4NCYgdik7CisKKyAgICB2b2lkIGxvYWRPcnRobyhmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcik7CisKKyAgICB2b2lkIG11bHRpcGx5KGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRNdWx0aXBseSgqdGhpcywgdik7CisgICAgICAgIGxvYWQodSk7CisgICAgfQorCisgICAgdm9pZCBtdWx0aXBseShmbG9hdCB2KTsKKworICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRUcmFuc2xhdGUoeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHUpOworICAgIH0KKworICAgIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZFNjYWxlKHN4LCBzeSwgc3opOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBhbmdsZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZFJvdGF0ZShhbmdsZSwgeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHUpOworICAgIH0KKworICAgIGJvb2wgY2hhbmdlc0JvdW5kcygpOworCisgICAgdm9pZCBjb3B5VG8oZmxvYXQqIHYpIGNvbnN0OworICAgIHZvaWQgY29weVRvKFNrTWF0cml4JiB2KSBjb25zdDsKKworICAgIHZvaWQgbWFwUmVjdChSZWN0JiByKSBjb25zdDsKKyAgICB2b2lkIG1hcFBvaW50KGZsb2F0JiB4LCBmbG9hdCYgeSkgY29uc3Q7CisKKyAgICBmbG9hdCBnZXRUcmFuc2xhdGVYKCk7CisgICAgZmxvYXQgZ2V0VHJhbnNsYXRlWSgpOworCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgYm9vbCBtU2ltcGxlTWF0cml4OworCisgICAgaW5saW5lIGZsb2F0IGdldChpbnQgaSwgaW50IGopIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGRhdGFbaSAqIDQgKyBqXTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBzZXQoaW50IGksIGludCBqLCBmbG9hdCB2KSB7CisgICAgICAgIGRhdGFbaSAqIDQgKyBqXSA9IHY7CisgICAgfQorfTsgLy8gY2xhc3MgTWF0cml4NAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUeXBlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0eXBlZGVmIE1hdHJpeDQgbWF0NDsKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX01BVFJJWF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTk9USUNFIGIvbGlicy9od3VpL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9PcGVuR0xEZWJ1Z1JlbmRlcmVyLmNwcCBiL2xpYnMvaHd1aS9PcGVuR0xEZWJ1Z1JlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTU4M2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL09wZW5HTERlYnVnUmVuZGVyZXIuY3BwCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHV0aWxzL1N0b3BXYXRjaC5oPgorCisjaW5jbHVkZSAiT3BlbkdMRGVidWdSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3ZvaWQgT3BlbkdMRGVidWdSZW5kZXJlcjo6cHJlcGFyZShib29sIG9wYXF1ZSkgeworICAgIG1QcmltaXRpdmVzQ291bnQgPSAwOworICAgIExPR0QoIj09PT09PT09PSBGcmFtZSBzdGFydCA9PT09PT09PT0iKTsKKyAgICBPcGVuR0xSZW5kZXJlcjo6cHJlcGFyZShvcGFxdWUpOworfQorCit2b2lkIE9wZW5HTERlYnVnUmVuZGVyZXI6OmZpbmlzaCgpIHsKKyAgICBMT0dEKCI9PT09PT09PT0gRnJhbWUgZW5kID09PT09PT09PSIpOworICAgIExPR0QoIlByaW1pdGl2ZXMgZHJhdyBjb3VudCA9ICVkIiwgbVByaW1pdGl2ZXNDb3VudCk7CisgICAgT3BlbkdMUmVuZGVyZXI6OmZpbmlzaCgpOworfQorCit2b2lkIE9wZW5HTERlYnVnUmVuZGVyZXI6OmNvbXBvc2VMYXllcihzcDxTbmFwc2hvdD4gY3VycmVudCwgc3A8U25hcHNob3Q+IHByZXZpb3VzKSB7CisgICAgbVByaW1pdGl2ZXNDb3VudCsrOworICAgIFN0b3BXYXRjaCB3KCJjb21wb3NlTGF5ZXIiKTsKKyAgICByZXR1cm4gT3BlbkdMUmVuZGVyZXI6OmNvbXBvc2VMYXllcihjdXJyZW50LCBwcmV2aW91cyk7Cit9CisKK2ludCBPcGVuR0xEZWJ1Z1JlbmRlcmVyOjpzYXZlTGF5ZXIoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpIHsKKyAgICBtUHJpbWl0aXZlc0NvdW50Kys7CisgICAgU3RvcFdhdGNoIHcoInNhdmVMYXllciIpOworICAgIHJldHVybiBPcGVuR0xSZW5kZXJlcjo6c2F2ZUxheWVyKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcCwgZmxhZ3MpOworfQorCit2b2lkIE9wZW5HTERlYnVnUmVuZGVyZXI6OmRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIG1QcmltaXRpdmVzQ291bnQrKzsKKyAgICBTdG9wV2F0Y2ggdygiZHJhd0JpdG1hcCIpOworICAgIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKGJpdG1hcCwgbGVmdCwgdG9wLCBwYWludCk7Cit9CisKK3ZvaWQgT3BlbkdMRGVidWdSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LAorICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIG1QcmltaXRpdmVzQ291bnQrKzsKKyAgICBTdG9wV2F0Y2ggdygiZHJhd0JpdG1hcE1hdHJpeCIpOworICAgIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKGJpdG1hcCwgbWF0cml4LCBwYWludCk7Cit9CisKK3ZvaWQgT3BlbkdMRGVidWdSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsCisgICAgICAgIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sIGZsb2F0IGRzdExlZnQsIGZsb2F0IGRzdFRvcCwKKyAgICAgICAgZmxvYXQgZHN0UmlnaHQsIGZsb2F0IGRzdEJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBtUHJpbWl0aXZlc0NvdW50Kys7CisgICAgU3RvcFdhdGNoIHcoImRyYXdCaXRtYXBSZWN0Iik7CisgICAgT3BlbkdMUmVuZGVyZXI6OmRyYXdCaXRtYXAoYml0bWFwLCBzcmNMZWZ0LCBzcmNUb3AsIHNyY1JpZ2h0LCBzcmNCb3R0b20sCisgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20sIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xEZWJ1Z1JlbmRlcmVyOjpkcmF3UGF0Y2goU2tCaXRtYXAqIGJpdG1hcCwgY29uc3QgaW50MzJfdCogeERpdnMsIGNvbnN0IGludDMyX3QqIHlEaXZzLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgbVByaW1pdGl2ZXNDb3VudCsrOworICAgIFN0b3BXYXRjaCB3KCJkcmF3UGF0Y2giKTsKKyAgICBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGNoKGJpdG1hcCwgeERpdnMsIHlEaXZzLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCk7Cit9CisKK3ZvaWQgT3BlbkdMRGVidWdSZW5kZXJlcjo6ZHJhd0NvbG9yKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKSB7CisgICAgbVByaW1pdGl2ZXNDb3VudCsrOworICAgIFN0b3BXYXRjaCB3KCJkcmF3Q29sb3IiKTsKKyAgICBPcGVuR0xSZW5kZXJlcjo6ZHJhd0NvbG9yKGNvbG9yLCBtb2RlKTsKK30KKwordm9pZCBPcGVuR0xEZWJ1Z1JlbmRlcmVyOjpkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgbVByaW1pdGl2ZXNDb3VudCsrOworICAgIFN0b3BXYXRjaCB3KCJkcmF3UmVjdCIpOworICAgIE9wZW5HTFJlbmRlcmVyOjpkcmF3UmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xEZWJ1Z1JlbmRlcmVyOjpkcmF3UGF0aChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgbVByaW1pdGl2ZXNDb3VudCsrOworICAgIFN0b3BXYXRjaCB3KCJkcmF3UGF0aCIpOworICAgIE9wZW5HTFJlbmRlcmVyOjpkcmF3UGF0aChwYXRoLCBwYWludCk7Cit9CisKK3ZvaWQgT3BlbkdMRGVidWdSZW5kZXJlcjo6ZHJhd0xpbmVzKGZsb2F0KiBwb2ludHMsIGludCBjb3VudCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBtUHJpbWl0aXZlc0NvdW50Kys7CisgICAgU3RvcFdhdGNoIHcoImRyYXdMaW5lcyIpOworICAgIE9wZW5HTFJlbmRlcmVyOjpkcmF3TGluZXMocG9pbnRzLCBjb3VudCwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTERlYnVnUmVuZGVyZXI6OmRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CisgICAgbVByaW1pdGl2ZXNDb3VudCsrOworICAgIFN0b3BXYXRjaCB3KCJkcmF3VGV4dCIpOworICAgIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dCh0ZXh0LCBieXRlc0NvdW50LCBjb3VudCwgeCwgeSwgcGFpbnQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9PcGVuR0xEZWJ1Z1JlbmRlcmVyLmggYi9saWJzL2h3dWkvT3BlbkdMRGVidWdSZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYzE5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvT3BlbkdMRGVidWdSZW5kZXJlci5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfT1BFTkdMX0RFQlVHX1JFTkRFUkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9PUEVOR0xfREVCVUdfUkVOREVSRVJfSAorCisjaW5jbHVkZSAiT3BlbkdMUmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBPcGVuR0xEZWJ1Z1JlbmRlcmVyOiBwdWJsaWMgT3BlbkdMUmVuZGVyZXIgeworcHVibGljOgorICAgIE9wZW5HTERlYnVnUmVuZGVyZXIoKTogbVByaW1pdGl2ZXNDb3VudCgwKSB7CisgICAgfQorCisgICAgfk9wZW5HTERlYnVnUmVuZGVyZXIoKSB7CisgICAgfQorCisgICAgdm9pZCBwcmVwYXJlKGJvb2wgb3BhcXVlKTsKKyAgICB2b2lkIGZpbmlzaCgpOworCisgICAgaW50IHNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpOworCisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwKKyAgICAgICAgICAgIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sIGZsb2F0IGRzdExlZnQsIGZsb2F0IGRzdFRvcCwKKyAgICAgICAgICAgIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdQYXRjaChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBpbnQzMl90KiB4RGl2cywgY29uc3QgaW50MzJfdCogeURpdnMsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOworICAgIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3UGF0aChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdMaW5lcyhmbG9hdCogcG9pbnRzLCBpbnQgY291bnQsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICBTa1BhaW50KiBwYWludCk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGNvbXBvc2VMYXllcihzcDxTbmFwc2hvdD4gY3VycmVudCwgc3A8U25hcHNob3Q+IHByZXZpb3VzKTsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtUHJpbWl0aXZlc0NvdW50OworCit9OyAvLyBjbGFzcyBPcGVuR0xEZWJ1Z1JlbmRlcmVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9PUEVOR0xfREVCVUdfUkVOREVSRVJfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyMjZiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKQEAgLTAsMCArMSwxMzI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa1R5cGVmYWNlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KKworI2luY2x1ZGUgIk9wZW5HTFJlbmRlcmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFJFUVVJUkVEX1RFWFRVUkVfVU5JVFNfQ09VTlQgMworCisvLyBHZW5lcmF0ZXMgc2ltcGxlIGFuZCB0ZXh0dXJlZCB2ZXJ0aWNlcworI2RlZmluZSBGVih4LCB5LCB1LCB2KSB7IHsgeCwgeSB9LCB7IHUsIHYgfSB9CisKKyNkZWZpbmUgUkFEX1RPX0RFRyAoMTgwLjBmIC8gMy4xNDE1OTI2NWYpCisjZGVmaW5lIE1JTl9BTkdMRSAwLjAwMWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR2xvYmFscworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBUaGlzIGFycmF5IGlzIG5ldmVyIHVzZWQgZGlyZWN0bHkgYnV0IHVzZWQgYXMgYSBtZW1jcHkgc291cmNlIGluIHRoZQorLy8gT3BlbkdMUmVuZGVyZXIgY29uc3RydWN0b3IKK3N0YXRpYyBjb25zdCBUZXh0dXJlVmVydGV4IGdNZXNoVmVydGljZXNbXSA9IHsKKyAgICAgICAgRlYoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiksCisgICAgICAgIEZWKDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYpLAorICAgICAgICBGVigwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKSwKKyAgICAgICAgRlYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikKK307CitzdGF0aWMgY29uc3QgR0xzaXplaSBnTWVzaFN0cmlkZSA9IHNpemVvZihUZXh0dXJlVmVydGV4KTsKK3N0YXRpYyBjb25zdCBHTHNpemVpIGdNZXNoQ291bnQgPSA0OworCisvKioKKyAqIFN0cnVjdHVyZSBtYXBwaW5nIFNraWEgeGZlcm1vZGVzIHRvIE9wZW5HTCBibGVuZGluZyBmYWN0b3JzLgorICovCitzdHJ1Y3QgQmxlbmRlciB7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIEdMZW51bSBzcmM7CisgICAgR0xlbnVtIGRzdDsKK307IC8vIHN0cnVjdCBCbGVuZGVyCisKKy8vIEluIHRoaXMgYXJyYXksIHRoZSBpbmRleCBvZiBlYWNoIEJsZW5kZXIgZXF1YWxzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QKKy8vIGVudHJ5LiBGb3IgaW5zdGFuY2UsIGdCbGVuZHNbMV0gPT0gZ0JsZW5kc1tTa1hmZXJtb2RlOjprU3JjX01vZGVdCitzdGF0aWMgY29uc3QgQmxlbmRlciBnQmxlbmRzW10gPSB7CisgICAgICAgIHsgU2tYZmVybW9kZTo6a0NsZWFyX01vZGUsICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjX01vZGUsICAgICBHTF9PTkUsICAgICAgICAgICAgICAgICAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RfTW9kZSwgICAgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9PTkUgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlLCBHTF9PTkUsICAgICAgICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdmVyX01vZGUsIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9PTkUgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjSW5fTW9kZSwgICBHTF9EU1RfQUxQSEEsICAgICAgICAgICAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RJbl9Nb2RlLCAgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3V0X01vZGUsICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdXRfTW9kZSwgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY0FUb3BfTW9kZSwgR0xfRFNUX0FMUEhBLCAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0QVRvcF9Nb2RlLCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1hvcl9Nb2RlLCAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfQorfTsKKworLy8gVGhpcyBhcnJheSBjb250YWlucyB0aGUgc3dhcHBlZCB2ZXJzaW9uIG9mIGVhY2ggU2tYZmVybW9kZS4gRm9yIGluc3RhbmNlCisvLyB0aGlzIGFycmF5J3MgU3JjT3ZlciBibGVuZGluZyBtb2RlIGlzIGFjdHVhbGx5IERzdE92ZXIuIFlvdSBjYW4gcmVmZXIgdG8KKy8vIGNyZWF0ZUxheWVyKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnJheS4KK3N0YXRpYyBjb25zdCBCbGVuZGVyIGdCbGVuZHNTd2FwW10gPSB7CisgICAgICAgIHsgU2tYZmVybW9kZTo6a0NsZWFyX01vZGUsICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjX01vZGUsICAgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdF9Nb2RlLCAgICAgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlLCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdE92ZXJfTW9kZSwgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjSW5fTW9kZSwgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdEluX01vZGUsICAgR0xfRFNUX0FMUEhBLCAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3V0X01vZGUsICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdXRfTW9kZSwgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY0FUb3BfTW9kZSwgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RBVG9wX01vZGUsIEdMX0RTVF9BTFBIQSwgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1hvcl9Nb2RlLCAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfQorfTsKKworc3RhdGljIGNvbnN0IEdMZW51bSBnVGV4dHVyZVVuaXRzW10gPSB7CisgICAgICAgIEdMX1RFWFRVUkUwLAorICAgICAgICBHTF9URVhUVVJFMSwKKyAgICAgICAgR0xfVEVYVFVSRTIKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK09wZW5HTFJlbmRlcmVyOjpPcGVuR0xSZW5kZXJlcigpOiBtQ2FjaGVzKENhY2hlczo6Z2V0SW5zdGFuY2UoKSkgeworICAgIG1TaGFkZXIgPSBOVUxMOworICAgIG1Db2xvckZpbHRlciA9IE5VTEw7CisgICAgbUhhc1NoYWRvdyA9IGZhbHNlOworCisgICAgbWVtY3B5KG1NZXNoVmVydGljZXMsIGdNZXNoVmVydGljZXMsIHNpemVvZihnTWVzaFZlcnRpY2VzKSk7CisKKyAgICBtRmlyc3RTbmFwc2hvdCA9IG5ldyBTbmFwc2hvdDsKKworICAgIEdMaW50IG1heFRleHR1cmVVbml0czsKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmbWF4VGV4dHVyZVVuaXRzKTsKKyAgICBpZiAobWF4VGV4dHVyZVVuaXRzIDwgUkVRVUlSRURfVEVYVFVSRV9VTklUU19DT1VOVCkgeworICAgICAgICBMT0dXKCJBdCBsZWFzdCAlZCB0ZXh0dXJlIHVuaXRzIGFyZSByZXF1aXJlZCEiLCBSRVFVSVJFRF9URVhUVVJFX1VOSVRTX0NPVU5UKTsKKyAgICB9CisKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX1NJWkUsICZtTWF4VGV4dHVyZVNpemUpOworfQorCitPcGVuR0xSZW5kZXJlcjo6fk9wZW5HTFJlbmRlcmVyKCkgeworICAgIC8vIFRoZSBjb250ZXh0IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIGF0IHRoaXMgcG9pbnQsIGRvIG5vdCBjYWxsCisgICAgLy8gR0wgQVBJcy4gQWxsIEdMIHN0YXRlIHNob3VsZCBiZSBrZXB0IGluIENhY2hlcy5oCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldHVwCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgbU9ydGhvTWF0cml4LmxvYWRPcnRobygwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7CisKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgbUZpcnN0U25hcHNob3QtPmhlaWdodCA9IGhlaWdodDsKKyAgICBtRmlyc3RTbmFwc2hvdC0+dmlld3BvcnQuc2V0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpwcmVwYXJlKGJvb2wgb3BhcXVlKSB7CisgICAgbVNuYXBzaG90ID0gbmV3IFNuYXBzaG90KG1GaXJzdFNuYXBzaG90LAorICAgICAgICAgICAgU2tDYW52YXM6OmtNYXRyaXhfU2F2ZUZsYWcgfCBTa0NhbnZhczo6a0NsaXBfU2F2ZUZsYWcpOworICAgIG1TYXZlQ291bnQgPSAxOworCisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisKKyAgICBpZiAoIW9wYXF1ZSkgeworICAgICAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgfQorCisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBnbFNjaXNzb3IoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgIG1TbmFwc2hvdC0+c2V0Q2xpcCgwLjBmLCAwLjBmLCBtV2lkdGgsIG1IZWlnaHQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpmaW5pc2goKSB7CisjaWYgREVCVUdfT1BFTkdMCisgICAgR0xlbnVtIHN0YXR1cyA9IEdMX05PX0VSUk9SOworICAgIHdoaWxlICgoc3RhdHVzID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgeworICAgICAgICBMT0dEKCJHTCBlcnJvciBmcm9tIE9wZW5HTFJlbmRlcmVyOiAweCV4Iiwgc3RhdHVzKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6YWNxdWlyZUNvbnRleHQoKSB7CisgICAgaWYgKG1DYWNoZXMuY3VycmVudFByb2dyYW0pIHsKKyAgICAgICAgaWYgKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmlzSW5Vc2UoKSkgeworICAgICAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cmVtb3ZlKCk7CisgICAgICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVsZWFzZUNvbnRleHQoKSB7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtU25hcHNob3QtPnZpZXdwb3J0LmdldFdpZHRoKCksIG1TbmFwc2hvdC0+dmlld3BvcnQuZ2V0SGVpZ2h0KCkpOworCisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKworICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworCisgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApOworCisgICAgaWYgKG1DYWNoZXMuYmxlbmQpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhtQ2FjaGVzLmxhc3RTcmNNb2RlLCBtQ2FjaGVzLmxhc3REc3RNb2RlKTsKKyAgICAgICAgZ2xCbGVuZEVxdWF0aW9uKEdMX0ZVTkNfQUREKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3RhdGUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgT3BlbkdMUmVuZGVyZXI6OmdldFNhdmVDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNhdmVDb3VudDsKK30KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlKGludCBmbGFncykgeworICAgIHJldHVybiBzYXZlU25hcHNob3QoZmxhZ3MpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlKCkgeworICAgIGlmIChtU2F2ZUNvdW50ID4gMSkgeworICAgICAgICByZXN0b3JlU25hcHNob3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc3RvcmVUb0NvdW50KGludCBzYXZlQ291bnQpIHsKKyAgICBpZiAoc2F2ZUNvdW50IDwgMSkgc2F2ZUNvdW50ID0gMTsKKworICAgIHdoaWxlIChtU2F2ZUNvdW50ID4gc2F2ZUNvdW50KSB7CisgICAgICAgIHJlc3RvcmVTbmFwc2hvdCgpOworICAgIH0KK30KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlU25hcHNob3QoaW50IGZsYWdzKSB7CisgICAgbVNuYXBzaG90ID0gbmV3IFNuYXBzaG90KG1TbmFwc2hvdCwgZmxhZ3MpOworICAgIHJldHVybiBtU2F2ZUNvdW50Kys7Cit9CisKK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OnJlc3RvcmVTbmFwc2hvdCgpIHsKKyAgICBib29sIHJlc3RvcmVDbGlwID0gbVNuYXBzaG90LT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0NsaXBTZXQ7CisgICAgYm9vbCByZXN0b3JlTGF5ZXIgPSBtU25hcHNob3QtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnSXNMYXllcjsKKyAgICBib29sIHJlc3RvcmVPcnRobyA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdEaXJ0eU9ydGhvOworCisgICAgc3A8U25hcHNob3Q+IGN1cnJlbnQgPSBtU25hcHNob3Q7CisgICAgc3A8U25hcHNob3Q+IHByZXZpb3VzID0gbVNuYXBzaG90LT5wcmV2aW91czsKKworICAgIGlmIChyZXN0b3JlT3J0aG8pIHsKKyAgICAgICAgUmVjdCYgciA9IHByZXZpb3VzLT52aWV3cG9ydDsKKyAgICAgICAgZ2xWaWV3cG9ydChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgICAgIG1PcnRob01hdHJpeC5sb2FkKGN1cnJlbnQtPm9ydGhvTWF0cml4KTsKKyAgICB9CisKKyAgICBtU2F2ZUNvdW50LS07CisgICAgbVNuYXBzaG90ID0gcHJldmlvdXM7CisKKyAgICBpZiAocmVzdG9yZUxheWVyKSB7CisgICAgICAgIGNvbXBvc2VMYXllcihjdXJyZW50LCBwcmV2aW91cyk7CisgICAgfQorCisgICAgaWYgKHJlc3RvcmVDbGlwKSB7CisgICAgICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworICAgIH0KKworICAgIHJldHVybiByZXN0b3JlQ2xpcDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTGF5ZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBPcGVuR0xSZW5kZXJlcjo6c2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgY29uc3QgU2tQYWludCogcCwgaW50IGZsYWdzKSB7CisgICAgY29uc3QgR0x1aW50IHByZXZpb3VzRmJvID0gbVNuYXBzaG90LT5mYm87CisgICAgY29uc3QgaW50IGNvdW50ID0gc2F2ZVNuYXBzaG90KGZsYWdzKTsKKworICAgIGludCBhbHBoYSA9IDI1NTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisKKyAgICBpZiAocCkgeworICAgICAgICBhbHBoYSA9IHAtPmdldEFscGhhKCk7CisgICAgICAgIGlmICghbUV4dGVuc2lvbnMuaGFzRnJhbWVidWZmZXJGZXRjaCgpKSB7CisgICAgICAgICAgICBjb25zdCBib29sIGlzTW9kZSA9IFNrWGZlcm1vZGU6OklzTW9kZShwLT5nZXRYZmVybW9kZSgpLCAmbW9kZSk7CisgICAgICAgICAgICBpZiAoIWlzTW9kZSkgeworICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBTUkNfT1ZFUgorICAgICAgICAgICAgICAgIG1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbW9kZSA9IGdldFhmZXJtb2RlKHAtPmdldFhmZXJtb2RlKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgfQorCisgICAgY3JlYXRlTGF5ZXIobVNuYXBzaG90LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGFscGhhLCBtb2RlLCBmbGFncywgcHJldmlvdXNGYm8pOworCisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgaW50IGFscGhhLCBpbnQgZmxhZ3MpIHsKKyAgICBpZiAoYWxwaGEgPT0gMHhmZikgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgTlVMTCwgZmxhZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgICAgIHBhaW50LnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgcmV0dXJuIHNhdmVMYXllcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sICZwYWludCwgZmxhZ3MpOworICAgIH0KK30KKworLyoqCisgKiBMYXllcnMgYXJlIHZpZXdlZCBieSBTa2lhIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiBsYXllcnMgaW4gaW1hZ2UgZWRpdGluZworICogcHJvZ3JhbXMgKGZvciBpbnN0YW5jZS4pIFdoZW4gYSBsYXllciBpcyBjcmVhdGVkLCBwcmV2aW91c2x5IGNyZWF0ZWQgbGF5ZXJzCisgKiBhbmQgdGhlIGZyYW1lIGJ1ZmZlciBzdGlsbCByZWNlaXZlIGV2ZXJ5IGRyYXdpbmcgY29tbWFuZC4gRm9yIGluc3RhbmNlLCBpZiBhCisgKiBsYXllciBpcyBjcmVhdGVkIGFuZCBhIHNoYXBlIGludGVyc2VjdGluZyB0aGUgYm91bmRzIG9mIHRoZSBsYXllcnMgYW5kIHRoZQorICogZnJhbWVidWZmZXIgaXMgZHJhdywgdGhlIHNoYXBlIHdpbGwgYmUgZHJhd24gb24gYm90aCAodW5sZXNzIHRoZSBsYXllciB3YXMKKyAqIGNyZWF0ZWQgd2l0aCB0aGUgU2tDYW52YXM6OmtDbGlwVG9MYXllcl9TYXZlRmxhZyBmbGFnLikKKyAqCisgKiBBIHdheSB0byBpbXBsZW1lbnQgbGF5ZXJzIGlzIHRvIGNyZWF0ZSBhbiBGQk8gZm9yIGVhY2ggbGF5ZXIsIGJhY2tlZCBieSBhbiBSR0JBCisgKiB0ZXh0dXJlLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIGluZWZmaWNpZW50IGFzIGl0IHJlcXVpcmVzIGV2ZXJ5IHByaW1pdGl2ZSB0bworICogYmUgZHJhd24gbiArIDEgdGltZXMsIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiBhY3RpdmUgbGF5ZXJzLiBJbiBwcmFjdGljZSB0aGlzCisgKiBtZWFucywgZm9yIGV2ZXJ5IHByaW1pdGl2ZToKKyAqICAgLSBTd2l0Y2ggYWN0aXZlIGZyYW1lIGJ1ZmZlcgorICogICAtIENoYW5nZSB2aWV3cG9ydCwgY2xpcCBhbmQgcHJvamVjdGlvbiBtYXRyaXgKKyAqICAgLSBJc3N1ZSB0aGUgZHJhd2luZworICoKKyAqIFN3aXRjaGluZyByZW5kZXJpbmcgdGFyZ2V0IG4gKyAxIHRpbWVzIHBlciBkcmF3biBwcmltaXRpdmUgaXMgZXh0cmVtZWx5IGNvc3RseS4KKyAqIFRvIGF2b2lkIHRoaXMsIGxheWVycyBhcmUgaW1wbGVtZW50ZWQgaW4gYSBkaWZmZXJlbnQgd2F5IGhlcmUsIGF0IGxlYXN0IGluIHRoZQorICogZ2VuZXJhbCBjYXNlLiBGQk9zIGFyZSB1c2VkLCBhcyBhbiBvcHRpbWl6YXRpb24sIHdoZW4gdGhlICJjbGlwIHRvIGxheWVyIiBmbGFnCisgKiBpcyBzZXQuIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB3ZSBjYW4gcmVkaXJlY3QgYWxsIGRyYXdpbmcgb3BlcmF0aW9ucyBpbnRvIGEKKyAqIHNpbmdsZSBGQk8uCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlIGZyYW1lIGJ1ZmZlciBiZWluZyBhdCBsZWFzdCBSR0JBIDg4ODguIFdoZW4KKyAqIGEgbGF5ZXIgaXMgY3JlYXRlZCwgb25seSBhIHRleHR1cmUgaXMgY3JlYXRlZCwgbm90IGFuIEZCTy4gVGhlIGNvbnRlbnQgb2YgdGhlCisgKiBmcmFtZSBidWZmZXIgY29udGFpbmVkIHdpdGhpbiB0aGUgbGF5ZXIncyBib3VuZHMgaXMgY29waWVkIGludG8gdGhpcyB0ZXh0dXJlCisgKiB1c2luZyBnbENvcHlUZXhJbWFnZTJEKCkuIFRoZSBsYXllcidzIHJlZ2lvbiBpcyB0aGVuIGNsZWFyZWQoMSkgaW4gdGhlIGZyYW1lCisgKiBidWZmZXIgYW5kIGRyYXdpbmcgY29udGludWVzIGFzIG5vcm1hbC4gVGhpcyB0ZWNobmlxdWUgdGhlcmVmb3JlIHRyZWF0cyB0aGUKKyAqIGZyYW1lIGJ1ZmZlciBhcyBhIHNjcmF0Y2ggYnVmZmVyIGZvciB0aGUgbGF5ZXJzLgorICoKKyAqIFRvIGNvbXBvc2UgdGhlIGxheWVycyBiYWNrIG9udG8gdGhlIGZyYW1lIGJ1ZmZlciwgZWFjaCBsYXllciB0ZXh0dXJlCisgKiAoY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZnJhbWUgYnVmZmVyIGRhdGEpIGlzIGRyYXduIGFzIGEgc2ltcGxlIHF1YWQgb3ZlcgorICogdGhlIGZyYW1lIGJ1ZmZlci4gVGhlIHRyaWNrIGlzIHRoYXQgdGhlIHF1YWQgaXMgc2V0IGFzIHRoZSBjb21wb3NpdGlvbgorICogZGVzdGluYXRpb24gaW4gdGhlIGJsZW5kaW5nIGVxdWF0aW9uLCBhbmQgdGhlIGZyYW1lIGJ1ZmZlciBiZWNvbWVzIHRoZSBzb3VyY2UKKyAqIG9mIHRoZSBjb21wb3NpdGlvbi4KKyAqCisgKiBEcmF3aW5nIGxheWVycyB3aXRoIGFuIGFscGhhIHZhbHVlIHJlcXVpcmVzIGFuIGV4dHJhIHN0ZXAgYmVmb3JlIGNvbXBvc2l0aW9uLgorICogQW4gZW1wdHkgcXVhZCBpcyBkcmF3biBvdmVyIHRoZSBsYXllcidzIHJlZ2lvbiBpbiB0aGUgZnJhbWUgYnVmZmVyLiBUaGlzIHF1YWQKKyAqIGlzIGRyYXduIHdpdGggdGhlIHJnYmEgY29sb3IgKDAsMCwwLGFscGhhKS4gVGhlIGFscGhhIHZhbHVlIG9mZmVyZWQgYnkgdGhlCisgKiBxdWFkIGlzIHVzZWQgdG8gbXVsdGlwbHkgdGhlIGNvbG9ycyBpbiB0aGUgZnJhbWUgYnVmZmVyLiBUaGlzIGlzIGFjaGlldmVkIGJ5CisgKiBjaGFuZ2luZyB0aGUgR0wgYmxlbmQgZnVuY3Rpb25zIGZvciB0aGUgR0xfRlVOQ19BREQgYmxlbmQgZXF1YXRpb24gdG8KKyAqIEdMX1pFUk8sIEdMX1NSQ19BTFBIQS4KKyAqCisgKiBCZWNhdXNlIGdsQ29weVRleEltYWdlMkQoKSBjYW4gYmUgc2xvdywgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gbWlnaHQKKyAqIGJlIHVzZSB0byBkcmF3IGEgc2luZ2xlIGNsaXBwZWQgbGF5ZXIuIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXNjcmliZWQgYWJvdmUKKyAqIGlzIGNvcnJlY3QgaW4gZXZlcnkgY2FzZS4KKyAqCisgKiAoMSkgVGhlIGZyYW1lIGJ1ZmZlciBpcyBhY3R1YWxseSBub3QgY2xlYXJlZCByaWdodCBhd2F5LiBUbyBhbGxvdyB0aGUgR1BVCisgKiAgICAgdG8gcG90ZW50aWFsbHkgb3B0aW1pemUgc2VyaWVzIG9mIGNhbGxzIHRvIGdsQ29weVRleEltYWdlMkQsIHRoZSBmcmFtZQorICogICAgIGJ1ZmZlciBpcyBsZWZ0IHVudG91Y2hlZCB1bnRpbCB0aGUgZmlyc3QgZHJhd2luZyBvcGVyYXRpb24uIE9ubHkgd2hlbgorICogICAgIHNvbWV0aGluZyBhY3R1YWxseSBnZXRzIGRyYXduIGFyZSB0aGUgbGF5ZXJzIHJlZ2lvbnMgY2xlYXJlZC4KKyAqLworYm9vbCBPcGVuR0xSZW5kZXJlcjo6Y3JlYXRlTGF5ZXIoc3A8U25hcHNob3Q+IHNuYXBzaG90LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLAorICAgICAgICBpbnQgZmxhZ3MsIEdMdWludCBwcmV2aW91c0ZibykgeworICAgIExBWUVSX0xPR0QoIlJlcXVlc3RpbmcgbGF5ZXIgJS4yZnglLjJmIiwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworICAgIExBWUVSX0xPR0QoIkxheWVyIGNhY2hlIHNpemUgPSAlZCIsIG1DYWNoZXMubGF5ZXJDYWNoZS5nZXRTaXplKCkpOworCisgICAgY29uc3QgYm9vbCBmYm9MYXllciA9IGZsYWdzICYgU2tDYW52YXM6OmtDbGlwVG9MYXllcl9TYXZlRmxhZzsKKworICAgIC8vIFdpbmRvdyBjb29yZGluYXRlcyBvZiB0aGUgbGF5ZXIKKyAgICBSZWN0IGJvdW5kcyhsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIGlmICghZmJvTGF5ZXIpIHsKKyAgICAgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPm1hcFJlY3QoYm91bmRzKTsKKyAgICAgICAgLy8gTGF5ZXJzIG9ubHkgbWFrZSBzZW5zZSBpZiB0aGV5IGFyZSBpbiB0aGUgZnJhbWVidWZmZXIncyBib3VuZHMKKyAgICAgICAgYm91bmRzLmludGVyc2VjdCgqbVNuYXBzaG90LT5jbGlwUmVjdCk7CisgICAgICAgIGJvdW5kcy5zbmFwVG9QaXhlbEJvdW5kYXJpZXMoKTsKKyAgICB9CisKKyAgICBpZiAoYm91bmRzLmlzRW1wdHkoKSB8fCBib3VuZHMuZ2V0V2lkdGgoKSA+IG1NYXhUZXh0dXJlU2l6ZSB8fAorICAgICAgICAgICAgYm91bmRzLmdldEhlaWdodCgpID4gbU1heFRleHR1cmVTaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworCisgICAgTGF5ZXIqIGxheWVyID0gbUNhY2hlcy5sYXllckNhY2hlLmdldChib3VuZHMuZ2V0V2lkdGgoKSwgYm91bmRzLmdldEhlaWdodCgpKTsKKyAgICBpZiAoIWxheWVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBsYXllci0+bW9kZSA9IG1vZGU7CisgICAgbGF5ZXItPmFscGhhID0gYWxwaGE7CisgICAgbGF5ZXItPmxheWVyLnNldChib3VuZHMpOworICAgIGxheWVyLT50ZXhDb29yZHMuc2V0KDAuMGYsIGJvdW5kcy5nZXRIZWlnaHQoKSAvIGZsb2F0KGxheWVyLT5oZWlnaHQpLAorICAgICAgICAgICAgYm91bmRzLmdldFdpZHRoKCkgLyBmbG9hdChsYXllci0+d2lkdGgpLCAwLjBmKTsKKworICAgIC8vIFNhdmUgdGhlIGxheWVyIGluIHRoZSBzbmFwc2hvdAorICAgIHNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdJc0xheWVyOworICAgIHNuYXBzaG90LT5sYXllciA9IGxheWVyOworCisgICAgaWYgKGZib0xheWVyKSB7CisgICAgICAgIGxheWVyLT5mYm8gPSBtQ2FjaGVzLmZib0NhY2hlLmdldCgpOworCisgICAgICAgIHNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdJc0Zib0xheWVyOworICAgICAgICBzbmFwc2hvdC0+ZmJvID0gbGF5ZXItPmZibzsKKyAgICAgICAgc25hcHNob3QtPnJlc2V0VHJhbnNmb3JtKC1ib3VuZHMubGVmdCwgLWJvdW5kcy50b3AsIDAuMGYpOworICAgICAgICBzbmFwc2hvdC0+cmVzZXRDbGlwKDAuMGYsIDAuMGYsIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpOworICAgICAgICBzbmFwc2hvdC0+dmlld3BvcnQuc2V0KDAuMGYsIDAuMGYsIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpOworICAgICAgICBzbmFwc2hvdC0+aGVpZ2h0ID0gYm91bmRzLmdldEhlaWdodCgpOworICAgICAgICBzbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnRGlydHlPcnRobzsKKyAgICAgICAgc25hcHNob3QtPm9ydGhvTWF0cml4LmxvYWQobU9ydGhvTWF0cml4KTsKKworICAgICAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKworICAgICAgICAvLyBCaW5kIHRleHR1cmUgdG8gRkJPCisgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBsYXllci0+ZmJvKTsKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBsYXllci0+dGV4dHVyZSk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdGV4dHVyZSBpZiBuZWVkZWQKKyAgICAgICAgaWYgKGxheWVyLT5lbXB0eSkgeworICAgICAgICAgICAgbGF5ZXItPmVtcHR5ID0gZmFsc2U7CisgICAgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgbGF5ZXItPndpZHRoLCBsYXllci0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwLCBHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgIGxheWVyLT50ZXh0dXJlLCAwKTsKKworICAgICAgICBHTGVudW0gc3RhdHVzID0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkgeworICAgICAgICAgICAgTE9HRSgiRnJhbWVidWZmZXIgaW5jb21wbGV0ZSAoR0wgZXJyb3IgY29kZSAweCV4KSIsIHN0YXR1cyk7CisKKyAgICAgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBwcmV2aW91c0Zibyk7CisgICAgICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisgICAgICAgICAgICBtQ2FjaGVzLmZib0NhY2hlLnB1dChsYXllci0+ZmJvKTsKKworICAgICAgICAgICAgZGVsZXRlIGxheWVyOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDbGVhciB0aGUgRkJPCisgICAgICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgICAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisKKyAgICAgICAgLy8gQ2hhbmdlIHRoZSBvcnRobyBwcm9qZWN0aW9uCisgICAgICAgIGdsVmlld3BvcnQoMCwgMCwgYm91bmRzLmdldFdpZHRoKCksIGJvdW5kcy5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1PcnRob01hdHJpeC5sb2FkT3J0aG8oMC4wZiwgYm91bmRzLmdldFdpZHRoKCksIGJvdW5kcy5nZXRIZWlnaHQoKSwgMC4wZiwgLTEuMGYsIDEuMGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENvcHkgdGhlIGZyYW1lYnVmZmVyIGludG8gdGhlIGxheWVyCisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbGF5ZXItPnRleHR1cmUpOworCisgICAgICAgIC8vIFRPRE86IFdvcmthcm91bmQgZm9yIGIvMzA1NDIwNAorICAgICAgICBnbENvcHlUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJvdW5kcy5sZWZ0LCBtSGVpZ2h0IC0gYm91bmRzLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBsYXllci0+d2lkdGgsIGxheWVyLT5oZWlnaHQsIDApOworCisgICAgICAgIC8vIFRPRE86IFdhaXRpbmcgZm9yIGIvMzA1NDIwNCB0byBiZSBmaXhlZAorICAgICAgICAvLyBpZiAobGF5ZXItPmVtcHR5KSB7CisgICAgICAgIC8vICAgICBnbENvcHlUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJvdW5kcy5sZWZ0LCBtSGVpZ2h0IC0gYm91bmRzLmJvdHRvbSwKKyAgICAgICAgLy8gICAgICAgICAgICAgbGF5ZXItPndpZHRoLCBsYXllci0+aGVpZ2h0LCAwKTsKKyAgICAgICAgLy8gICAgIGxheWVyLT5lbXB0eSA9IGZhbHNlOworICAgICAgICAvLyB9IGVsc2UgeworICAgICAgICAvLyAgICAgZ2xDb3B5VGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCBib3VuZHMubGVmdCwgbUhlaWdodCAtIGJvdW5kcy5ib3R0b20sCisgICAgICAgIC8vICAgICAgICAgICAgIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpOworICAgICAgICAvLyAgfQorCisgICAgICAgIC8vIEVucXVldWUgdGhlIGJ1ZmZlciBjb29yZGluYXRlcyB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyByZWdpb24gbGF0ZXIKKyAgICAgICAgbUxheWVycy5wdXNoKG5ldyBSZWN0KGJvdW5kcykpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFJlYWQgdGhlIGRvY3VtZW50YXRpb24gb2YgY3JlYXRlTGF5ZXIoKSBiZWZvcmUgZG9pbmcgYW55dGhpbmcgaW4gdGhpcyBtZXRob2QuCisgKi8KK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmNvbXBvc2VMYXllcihzcDxTbmFwc2hvdD4gY3VycmVudCwgc3A8U25hcHNob3Q+IHByZXZpb3VzKSB7CisgICAgaWYgKCFjdXJyZW50LT5sYXllcikgeworICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIGNvbXBvc2UgYSBsYXllciB0aGF0IGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGZib0xheWVyID0gY3VycmVudC0+ZmxhZ3MgJiBTa0NhbnZhczo6a0NsaXBUb0xheWVyX1NhdmVGbGFnOworCisgICAgaWYgKGZib0xheWVyKSB7CisgICAgICAgIC8vIFVuYmluZCBjdXJyZW50IEZCTyBhbmQgcmVzdG9yZSBwcmV2aW91cyBvbmUKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIHByZXZpb3VzLT5mYm8pOworICAgIH0KKworICAgIC8vIFJlc3RvcmUgdGhlIGNsaXAgZnJvbSB0aGUgcHJldmlvdXMgc25hcHNob3QKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gKnByZXZpb3VzLT5jbGlwUmVjdDsKKyAgICBnbFNjaXNzb3IoY2xpcC5sZWZ0LCBwcmV2aW91cy0+aGVpZ2h0IC0gY2xpcC5ib3R0b20sIGNsaXAuZ2V0V2lkdGgoKSwgY2xpcC5nZXRIZWlnaHQoKSk7CisKKyAgICBMYXllciogbGF5ZXIgPSBjdXJyZW50LT5sYXllcjsKKyAgICBjb25zdCBSZWN0JiByZWN0ID0gbGF5ZXItPmxheWVyOworCisgICAgaWYgKCFmYm9MYXllciAmJiBsYXllci0+YWxwaGEgPCAyNTUpIHsKKyAgICAgICAgZHJhd0NvbG9yUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwKKyAgICAgICAgICAgICAgICBsYXllci0+YWxwaGEgPDwgMjQsIFNrWGZlcm1vZGU6OmtEc3RJbl9Nb2RlLCB0cnVlKTsKKyAgICB9CisKKyAgICBjb25zdCBSZWN0JiB0ZXhDb29yZHMgPSBsYXllci0+dGV4Q29vcmRzOworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHModGV4Q29vcmRzLmxlZnQsIHRleENvb3Jkcy50b3AsIHRleENvb3Jkcy5yaWdodCwgdGV4Q29vcmRzLmJvdHRvbSk7CisKKyAgICBpZiAoZmJvTGF5ZXIpIHsKKyAgICAgICAgZHJhd1RleHR1cmVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgIGxheWVyLT50ZXh0dXJlLCBsYXllci0+YWxwaGEgLyAyNTUuMGYsIGxheWVyLT5tb2RlLCBsYXllci0+YmxlbmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRyYXdUZXh0dXJlTWVzaChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgbGF5ZXItPnRleHR1cmUsCisgICAgICAgICAgICAgICAgMS4wZiwgbGF5ZXItPm1vZGUsIGxheWVyLT5ibGVuZCwgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0sCisgICAgICAgICAgICAgICAgJm1NZXNoVmVydGljZXNbMF0udGV4dHVyZVswXSwgR0xfVFJJQU5HTEVfU1RSSVAsIGdNZXNoQ291bnQsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZik7CisKKyAgICBpZiAoZmJvTGF5ZXIpIHsKKyAgICAgICAgLy8gRGV0YWNoIHRoZSB0ZXh0dXJlIGZyb20gdGhlIEZCTworICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgY3VycmVudC0+ZmJvKTsKKyAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsIDAsIDApOworICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgcHJldmlvdXMtPmZibyk7CisKKyAgICAgICAgLy8gUHV0IHRoZSBGQk8gbmFtZSBiYWNrIGluIHRoZSBjYWNoZSwgaWYgaXQgZG9lc24ndCBmaXQsIGl0IHdpbGwgYmUgZGVzdHJveWVkCisgICAgICAgIG1DYWNoZXMuZmJvQ2FjaGUucHV0KGN1cnJlbnQtPmZibyk7CisgICAgfQorCisgICAgLy8gRmFpbGluZyB0byBhZGQgdGhlIGxheWVyIHRvIHRoZSBjYWNoZSBzaG91bGQgaGFwcGVuIG9ubHkgaWYgdGhlIGxheWVyIGlzIHRvbyBsYXJnZQorICAgIGlmICghbUNhY2hlcy5sYXllckNhY2hlLnB1dChsYXllcikpIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiRGVsZXRpbmcgbGF5ZXIiKTsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbGF5ZXItPnRleHR1cmUpOworICAgICAgICBkZWxldGUgbGF5ZXI7CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjbGVhckxheWVyUmVnaW9ucygpIHsKKyAgICBpZiAobUxheWVycy5zaXplKCkgPT0gMCkgcmV0dXJuOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1MYXllcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgUmVjdCogYm91bmRzID0gbUxheWVycy5pdGVtQXQoaSk7CisKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGZyYW1lYnVmZmVyIHdoZXJlIHRoZSBsYXllciB3aWxsIGRyYXcKKyAgICAgICAgZ2xTY2lzc29yKGJvdW5kcy0+bGVmdCwgbUhlaWdodCAtIGJvdW5kcy0+Ym90dG9tLAorICAgICAgICAgICAgICAgIGJvdW5kcy0+Z2V0V2lkdGgoKSwgYm91bmRzLT5nZXRIZWlnaHQoKSk7CisgICAgICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKyAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgICAgICBkZWxldGUgYm91bmRzOworICAgIH0KKyAgICBtTGF5ZXJzLmNsZWFyKCk7CisKKyAgICAvLyBSZXN0b3JlIHRoZSBjbGlwCisgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRyYW5zZm9ybXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6dHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLT50cmFuc2xhdGUoZHgsIGR5LCAwLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cm90YXRlKGZsb2F0IGRlZ3JlZXMpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+cm90YXRlKGRlZ3JlZXMsIDAuMGYsIDAuMGYsIDEuMGYpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+c2NhbGUoc3gsIHN5LCAxLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+bG9hZCgqbWF0cml4KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Z2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+Y29weVRvKCptYXRyaXgpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjb25jYXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIG1hdDQgbSgqbWF0cml4KTsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+bXVsdGlwbHkobSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsaXBwaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldFNjaXNzb3JGcm9tQ2xpcCgpIHsKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gKm1TbmFwc2hvdC0+Y2xpcFJlY3Q7CisgICAgZ2xTY2lzc29yKGNsaXAubGVmdCwgbVNuYXBzaG90LT5oZWlnaHQgLSBjbGlwLmJvdHRvbSwgY2xpcC5nZXRXaWR0aCgpLCBjbGlwLmdldEhlaWdodCgpKTsKK30KKworY29uc3QgUmVjdCYgT3BlbkdMUmVuZGVyZXI6OmdldENsaXBCb3VuZHMoKSB7CisgICAgcmV0dXJuIG1TbmFwc2hvdC0+Z2V0TG9jYWxDbGlwKCk7Cit9CisKK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OnF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgIFJlY3QgcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLT5tYXBSZWN0KHIpOworICAgIHJldHVybiAhbVNuYXBzaG90LT5jbGlwUmVjdC0+aW50ZXJzZWN0cyhyKTsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6Y2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1JlZ2lvbjo6T3Agb3ApIHsKKyAgICBib29sIGNsaXBwZWQgPSBtU25hcHNob3QtPmNsaXAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcCk7CisgICAgaWYgKGNsaXBwZWQpIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorICAgIHJldHVybiAhbVNuYXBzaG90LT5jbGlwUmVjdC0+aXNFbXB0eSgpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEcmF3aW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGZsb2F0IHJpZ2h0ID0gbGVmdCArIGJpdG1hcC0+d2lkdGgoKTsKKyAgICBjb25zdCBmbG9hdCBib3R0b20gPSB0b3AgKyBiaXRtYXAtPmhlaWdodCgpOworCisgICAgaWYgKHF1aWNrUmVqZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZXMudGV4dHVyZUNhY2hlLmdldChiaXRtYXApOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgZHJhd1RleHR1cmVSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgUmVjdCByKDAuMGYsIDAuMGYsIGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSk7CisgICAgY29uc3QgbWF0NCB0cmFuc2Zvcm0oKm1hdHJpeCk7CisgICAgdHJhbnNmb3JtLm1hcFJlY3Qocik7CisKKyAgICBpZiAocXVpY2tSZWplY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGRyYXdUZXh0dXJlUmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsCisgICAgICAgICBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sCisgICAgICAgICBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sCisgICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChxdWlja1JlamVjdChkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGNvbnN0IGZsb2F0IHdpZHRoID0gdGV4dHVyZS0+d2lkdGg7CisgICAgY29uc3QgZmxvYXQgaGVpZ2h0ID0gdGV4dHVyZS0+aGVpZ2h0OworCisgICAgY29uc3QgZmxvYXQgdTEgPSBzcmNMZWZ0IC8gd2lkdGg7CisgICAgY29uc3QgZmxvYXQgdjEgPSBzcmNUb3AgLyBoZWlnaHQ7CisgICAgY29uc3QgZmxvYXQgdTIgPSBzcmNSaWdodCAvIHdpZHRoOworICAgIGNvbnN0IGZsb2F0IHYyID0gc3JjQm90dG9tIC8gaGVpZ2h0OworCisgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3Jkcyh1MSwgdjEsIHUyLCB2Mik7CisKKyAgICBkcmF3VGV4dHVyZVJlY3QoZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tLCB0ZXh0dXJlLCBwYWludCk7CisKKyAgICByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UGF0Y2goU2tCaXRtYXAqIGJpdG1hcCwgY29uc3QgaW50MzJfdCogeERpdnMsIGNvbnN0IGludDMyX3QqIHlEaXZzLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgaWYgKHF1aWNrUmVqZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZXMudGV4dHVyZUNhY2hlLmdldChiaXRtYXApOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgY29uc3QgUGF0Y2gqIG1lc2ggPSBtQ2FjaGVzLnBhdGNoQ2FjaGUuZ2V0KGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSwKKyAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCB4RGl2cywgeURpdnMsIHdpZHRoLCBoZWlnaHQpOworCisgICAgLy8gU3BlY2lmeSByaWdodCBhbmQgYm90dG9tIGFzICsxLjBmIGZyb20gbGVmdC90b3AgdG8gcHJldmVudCBzY2FsaW5nIHNpbmNlIHRoZQorICAgIC8vIHBhdGNoIG1lc2ggYWxyZWFkeSBkZWZpbmVzIHRoZSBmaW5hbCBzaXplCisgICAgZHJhd1RleHR1cmVNZXNoKGxlZnQsIHRvcCwgbGVmdCArIDEuMGYsIHRvcCArIDEuMGYsIHRleHR1cmUtPmlkLCBhbHBoYSAvIDI1NS4wZiwKKyAgICAgICAgICAgIG1vZGUsIHRleHR1cmUtPmJsZW5kLCAmbWVzaC0+dmVydGljZXNbMF0ucG9zaXRpb25bMF0sCisgICAgICAgICAgICAmbWVzaC0+dmVydGljZXNbMF0udGV4dHVyZVswXSwgR0xfVFJJQU5HTEVTLCBtZXNoLT52ZXJ0aWNlc0NvdW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0xpbmVzKGZsb2F0KiBwb2ludHMsIGludCBjb3VudCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpbnQgYWxwaGE7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGdldEFscGhhQW5kTW9kZShwYWludCwgJmFscGhhLCAmbW9kZSk7CisKKyAgICB1aW50MzJfdCBjb2xvciA9IHBhaW50LT5nZXRDb2xvcigpOworICAgIGNvbnN0IEdMZmxvYXQgYSA9IGFscGhhIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgciA9IGEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgYiA9IGEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgY29uc3QgYm9vbCBpc0FBID0gcGFpbnQtPmlzQW50aUFsaWFzKCk7CisgICAgaWYgKGlzQUEpIHsKKyAgICAgICAgR0x1aW50IHRleHR1cmVVbml0ID0gMDsKKyAgICAgICAgc2V0dXBUZXh0dXJlQWxwaGE4KG1DYWNoZXMubGluZS5nZXRUZXh0dXJlKCksIDAsIDAsIHRleHR1cmVVbml0LCAwLjBmLCAwLjBmLCByLCBnLCBiLCBhLAorICAgICAgICAgICAgICAgIG1vZGUsIGZhbHNlLCB0cnVlLCBtQ2FjaGVzLmxpbmUuZ2V0VmVydGljZXMoKSwgbUNhY2hlcy5saW5lLmdldFRleENvb3JkcygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXR1cENvbG9yUmVjdCgwLjBmLCAwLjBmLCAxLjBmLCAxLjBmLCByLCBnLCBiLCBhLCBtb2RlLCBmYWxzZSk7CisgICAgfQorCisgICAgY29uc3QgZmxvYXQgc3Ryb2tlV2lkdGggPSBwYWludC0+Z2V0U3Ryb2tlV2lkdGgoKTsKKyAgICBjb25zdCBHTHNpemVpIGVsZW1lbnRzQ291bnQgPSBpc0FBID8gbUNhY2hlcy5saW5lLmdldEVsZW1lbnRzQ291bnQoKSA6IGdNZXNoQ291bnQ7CisgICAgY29uc3QgR0xlbnVtIGRyYXdNb2RlID0gaXNBQSA/IEdMX1RSSUFOR0xFUyA6IEdMX1RSSUFOR0xFX1NUUklQOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArPSA0KSB7CisgICAgICAgIGZsb2F0IHR4ID0gMC4wZjsKKyAgICAgICAgZmxvYXQgdHkgPSAwLjBmOworCisgICAgICAgIGlmIChpc0FBKSB7CisgICAgICAgICAgICBtQ2FjaGVzLmxpbmUudXBkYXRlKHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSwgcG9pbnRzW2kgKyAyXSwgcG9pbnRzW2kgKyAzXSwKKyAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGgsIHR4LCB0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0eSA9IHN0cm9rZVdpZHRoIDw9IDEuMGYgPyAwLjBmIDogLXN0cm9rZVdpZHRoICogMC41ZjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGZsb2F0IGR4ID0gcG9pbnRzW2kgKyAyXSAtIHBvaW50c1tpXTsKKyAgICAgICAgY29uc3QgZmxvYXQgZHkgPSBwb2ludHNbaSArIDNdIC0gcG9pbnRzW2kgKyAxXTsKKyAgICAgICAgY29uc3QgZmxvYXQgbWFnID0gc3FydGYoZHggKiBkeCArIGR5ICogZHkpOworICAgICAgICBjb25zdCBmbG9hdCBhbmdsZSA9IGFjb3MoZHggLyBtYWcpOworCisgICAgICAgIG1Nb2RlbFZpZXcubG9hZFRyYW5zbGF0ZShwb2ludHNbaV0sIHBvaW50c1tpICsgMV0sIDAuMGYpOworICAgICAgICBpZiAoYW5nbGUgPiBNSU5fQU5HTEUgfHwgYW5nbGUgPCAtTUlOX0FOR0xFKSB7CisgICAgICAgICAgICBtTW9kZWxWaWV3LnJvdGF0ZShhbmdsZSAqIFJBRF9UT19ERUcsIDAuMGYsIDAuMGYsIDEuMGYpOworICAgICAgICB9CisgICAgICAgIG1Nb2RlbFZpZXcudHJhbnNsYXRlKHR4LCB0eSwgMC4wZik7CisgICAgICAgIGlmICghaXNBQSkgeworICAgICAgICAgICAgZmxvYXQgbGVuZ3RoID0gbUNhY2hlcy5saW5lLmdldExlbmd0aChwb2ludHNbaV0sIHBvaW50c1tpICsgMV0sCisgICAgICAgICAgICAgICAgICAgIHBvaW50c1tpICsgMl0sIHBvaW50c1tpICsgM10pOworICAgICAgICAgICAgbU1vZGVsVmlldy5zY2FsZShsZW5ndGgsIHN0cm9rZVdpZHRoLCAxLjBmKTsKKyAgICAgICAgfQorICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LT50cmFuc2Zvcm0pOworCisgICAgICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgICAgICBtU2hhZGVyLT51cGRhdGVUcmFuc2Zvcm1zKG1DYWNoZXMuY3VycmVudFByb2dyYW0sIG1Nb2RlbFZpZXcsICptU25hcHNob3QpOworICAgICAgICB9CisKKyAgICAgICAgZ2xEcmF3QXJyYXlzKGRyYXdNb2RlLCAwLCBlbGVtZW50c0NvdW50KTsKKyAgICB9CisKKyAgICBpZiAoaXNBQSkgeworICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRBdHRyaWIoInRleENvb3JkcyIpKTsKKyAgICB9Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdDb2xvcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSkgeworICAgIGNvbnN0IFJlY3QmIGNsaXAgPSAqbVNuYXBzaG90LT5jbGlwUmVjdDsKKyAgICBkcmF3Q29sb3JSZWN0KGNsaXAubGVmdCwgY2xpcC50b3AsIGNsaXAucmlnaHQsIGNsaXAuYm90dG9tLCBjb2xvciwgbW9kZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcCkgeworICAgIGlmIChxdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgaWYgKCFtRXh0ZW5zaW9ucy5oYXNGcmFtZWJ1ZmZlckZldGNoKCkpIHsKKyAgICAgICAgY29uc3QgYm9vbCBpc01vZGUgPSBTa1hmZXJtb2RlOjpJc01vZGUocC0+Z2V0WGZlcm1vZGUoKSwgJm1vZGUpOworICAgICAgICBpZiAoIWlzTW9kZSkgeworICAgICAgICAgICAgLy8gQXNzdW1lIFNSQ19PVkVSCisgICAgICAgICAgICBtb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1vZGUgPSBnZXRYZmVybW9kZShwLT5nZXRYZmVybW9kZSgpKTsKKyAgICB9CisKKyAgICAvLyBTa2lhIGRyYXdzIHVzaW5nIHRoZSBjb2xvcidzIGFscGhhIGNoYW5uZWwgaWYgPCAyNTUKKyAgICAvLyBPdGhlcndpc2UsIGl0IHVzZXMgdGhlIHBhaW50J3MgYWxwaGEKKyAgICBpbnQgY29sb3IgPSBwLT5nZXRDb2xvcigpOworICAgIGlmICgoKGNvbG9yID4+IDI0KSAmIDB4ZmYpID09IDI1NSkgeworICAgICAgICBjb2xvciB8PSBwLT5nZXRBbHBoYSgpIDw8IDI0OworICAgIH0KKworICAgIGRyYXdDb2xvclJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBjb2xvciwgbW9kZSk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgaWYgKHRleHQgPT0gTlVMTCB8fCBjb3VudCA9PSAwIHx8IChwYWludC0+Z2V0QWxwaGEoKSA9PSAwICYmIHBhaW50LT5nZXRYZmVybW9kZSgpID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYWludC0+c2V0QW50aUFsaWFzKHRydWUpOworCisgICAgZmxvYXQgbGVuZ3RoID0gLTEuMGY7CisgICAgc3dpdGNoIChwYWludC0+Z2V0VGV4dEFsaWduKCkpIHsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprQ2VudGVyX0FsaWduOgorICAgICAgICAgICAgbGVuZ3RoID0gcGFpbnQtPm1lYXN1cmVUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgICAgICAgICAgeCAtPSBsZW5ndGggLyAyLjBmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOgorICAgICAgICAgICAgbGVuZ3RoID0gcGFpbnQtPm1lYXN1cmVUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgICAgICAgICAgeCAtPSBsZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGludCBhbHBoYTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgZ2V0QWxwaGFBbmRNb2RlKHBhaW50LCAmYWxwaGEsICZtb2RlKTsKKworICAgIHVpbnQzMl90IGNvbG9yID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgY29uc3QgR0xmbG9hdCBhID0gYWxwaGEgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCByID0gYSAqICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBnID0gYSAqICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBiID0gYSAqICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBGb250UmVuZGVyZXImIGZvbnRSZW5kZXJlciA9IG1DYWNoZXMuZm9udFJlbmRlcmVyLmdldEZvbnRSZW5kZXJlcihwYWludCk7CisgICAgZm9udFJlbmRlcmVyLnNldEZvbnQocGFpbnQsIFNrVHlwZWZhY2U6OlVuaXF1ZUlEKHBhaW50LT5nZXRUeXBlZmFjZSgpKSwKKyAgICAgICAgICAgIHBhaW50LT5nZXRUZXh0U2l6ZSgpKTsKKworICAgIGlmIChtSGFzU2hhZG93KSB7CisgICAgICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzWzBdKTsKKyAgICAgICAgbUNhY2hlcy5kcm9wU2hhZG93Q2FjaGUuc2V0Rm9udFJlbmRlcmVyKGZvbnRSZW5kZXJlcik7CisgICAgICAgIGNvbnN0IFNoYWRvd1RleHR1cmUqIHNoYWRvdyA9IG1DYWNoZXMuZHJvcFNoYWRvd0NhY2hlLmdldChwYWludCwgdGV4dCwgYnl0ZXNDb3VudCwKKyAgICAgICAgICAgICAgICBjb3VudCwgbVNoYWRvd1JhZGl1cyk7CisgICAgICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHNoYWRvdyk7CisKKyAgICAgICAgc2V0dXBTaGFkb3coc2hhZG93LCB4LCB5LCBtb2RlLCBhKTsKKworICAgICAgICAvLyBEcmF3IHRoZSBtZXNoCisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIikpOworICAgIH0KKworICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKworICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBtb2RlbFZpZXcgbWF0cml4IGRvZXMgbm90IGZvcmNlIHNjYWxlcywgcm90YXRlcywgZXRjLgorICAgIGNvbnN0IGJvb2wgbGluZWFyRmlsdGVyID0gbVNuYXBzaG90LT50cmFuc2Zvcm0tPmNoYW5nZXNCb3VuZHMoKTsKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgoZm9udFJlbmRlcmVyLmdldFRleHR1cmUobGluZWFyRmlsdGVyKSwgMCwgMCwgdGV4dHVyZVVuaXQsCisgICAgICAgICAgICB4LCB5LCByLCBnLCBiLCBhLCBtb2RlLCBmYWxzZSwgdHJ1ZSk7CisKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gbVNuYXBzaG90LT5nZXRMb2NhbENsaXAoKTsKKyAgICBjbGVhckxheWVyUmVnaW9ucygpOworICAgIGZvbnRSZW5kZXJlci5yZW5kZXJUZXh0KHBhaW50LCAmY2xpcCwgdGV4dCwgMCwgYnl0ZXNDb3VudCwgY291bnQsIHgsIHkpOworCisgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRBdHRyaWIoInRleENvb3JkcyIpKTsKKworICAgIGRyYXdUZXh0RGVjb3JhdGlvbnModGV4dCwgYnl0ZXNDb3VudCwgbGVuZ3RoLCB4LCB5LCBwYWludCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdQYXRoKFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzW3RleHR1cmVVbml0XSk7CisKKyAgICBjb25zdCBQYXRoVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZXMucGF0aENhY2hlLmdldChwYXRoLCBwYWludCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBjb25zdCBmbG9hdCB4ID0gdGV4dHVyZS0+bGVmdCAtIHRleHR1cmUtPm9mZnNldDsKKyAgICBjb25zdCBmbG9hdCB5ID0gdGV4dHVyZS0+dG9wIC0gdGV4dHVyZS0+b2Zmc2V0OworCisgICAgaWYgKHF1aWNrUmVqZWN0KHgsIHksIHggKyB0ZXh0dXJlLT53aWR0aCwgeSArIHRleHR1cmUtPmhlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBhbHBoYTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgZ2V0QWxwaGFBbmRNb2RlKHBhaW50LCAmYWxwaGEsICZtb2RlKTsKKworICAgIHVpbnQzMl90IGNvbG9yID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgY29uc3QgR0xmbG9hdCBhID0gYWxwaGEgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCByID0gYSAqICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBnID0gYSAqICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBiID0gYSAqICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgodGV4dHVyZSwgdGV4dHVyZVVuaXQsIHgsIHksIHIsIGcsIGIsIGEsIG1vZGUsIHRydWUsIHRydWUpOworCisgICAgY2xlYXJMYXllclJlZ2lvbnMoKTsKKworICAgIC8vIERyYXcgdGhlIG1lc2gKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIGdNZXNoQ291bnQpOworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIikpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaGFkZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0U2hhZGVyKCkgeworICAgIG1TaGFkZXIgPSBOVUxMOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRlcihTa2lhU2hhZGVyKiBzaGFkZXIpIHsKKyAgICBtU2hhZGVyID0gc2hhZGVyOworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPnNldCgmbUNhY2hlcy50ZXh0dXJlQ2FjaGUsICZtQ2FjaGVzLmdyYWRpZW50Q2FjaGUpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29sb3IgZmlsdGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXNldENvbG9yRmlsdGVyKCkgeworICAgIG1Db2xvckZpbHRlciA9IE5VTEw7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwQ29sb3JGaWx0ZXIoU2tpYUNvbG9yRmlsdGVyKiBmaWx0ZXIpIHsKKyAgICBtQ29sb3JGaWx0ZXIgPSBmaWx0ZXI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyb3Agc2hhZG93CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0U2hhZG93KCkgeworICAgIG1IYXNTaGFkb3cgPSBmYWxzZTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBTaGFkb3coZmxvYXQgcmFkaXVzLCBmbG9hdCBkeCwgZmxvYXQgZHksIGludCBjb2xvcikgeworICAgIG1IYXNTaGFkb3cgPSB0cnVlOworICAgIG1TaGFkb3dSYWRpdXMgPSByYWRpdXM7CisgICAgbVNoYWRvd0R4ID0gZHg7CisgICAgbVNoYWRvd0R5ID0gZHk7CisgICAgbVNoYWRvd0NvbG9yID0gY29sb3I7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyYXdpbmcgaW1wbGVtZW50YXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBTaGFkb3coY29uc3QgU2hhZG93VGV4dHVyZSogdGV4dHVyZSwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBmbG9hdCBhbHBoYSkgeworICAgIGNvbnN0IGZsb2F0IHN4ID0geCAtIHRleHR1cmUtPmxlZnQgKyBtU2hhZG93RHg7CisgICAgY29uc3QgZmxvYXQgc3kgPSB5IC0gdGV4dHVyZS0+dG9wICsgbVNoYWRvd0R5OworCisgICAgY29uc3QgaW50IHNoYWRvd0FscGhhID0gKChtU2hhZG93Q29sb3IgPj4gMjQpICYgMHhGRik7CisgICAgY29uc3QgR0xmbG9hdCBhID0gc2hhZG93QWxwaGEgPCAyNTUgPyBzaGFkb3dBbHBoYSAvIDI1NS4wZiA6IGFscGhhOworICAgIGNvbnN0IEdMZmxvYXQgciA9IGEgKiAoKG1TaGFkb3dDb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChtU2hhZG93Q29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBiID0gYSAqICgobVNoYWRvd0NvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgR0x1aW50IHRleHR1cmVVbml0ID0gMDsKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgodGV4dHVyZSwgdGV4dHVyZVVuaXQsIHN4LCBzeSwgciwgZywgYiwgYSwgbW9kZSwgdHJ1ZSwgZmFsc2UpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFRleHR1cmVBbHBoYTgoY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgR0x1aW50JiB0ZXh0dXJlVW5pdCwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLAorICAgICAgICBib29sIHRyYW5zZm9ybXMsIGJvb2wgYXBwbHlGaWx0ZXJzKSB7CisgICAgc2V0dXBUZXh0dXJlQWxwaGE4KHRleHR1cmUtPmlkLCB0ZXh0dXJlLT53aWR0aCwgdGV4dHVyZS0+aGVpZ2h0LCB0ZXh0dXJlVW5pdCwKKyAgICAgICAgICAgIHgsIHksIHIsIGcsIGIsIGEsIG1vZGUsIHRyYW5zZm9ybXMsIGFwcGx5RmlsdGVycywKKyAgICAgICAgICAgICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBUZXh0dXJlQWxwaGE4KEdMdWludCB0ZXh0dXJlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLAorICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgdHJhbnNmb3JtcywgYm9vbCBhcHBseUZpbHRlcnMpIHsKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgodGV4dHVyZSwgd2lkdGgsIGhlaWdodCwgdGV4dHVyZVVuaXQsCisgICAgICAgICAgICB4LCB5LCByLCBnLCBiLCBhLCBtb2RlLCB0cmFuc2Zvcm1zLCBhcHBseUZpbHRlcnMsCisgICAgICAgICAgICAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSwgJm1NZXNoVmVydGljZXNbMF0udGV4dHVyZVswXSk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwVGV4dHVyZUFscGhhOChHTHVpbnQgdGV4dHVyZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgR0x1aW50JiB0ZXh0dXJlVW5pdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSwKKyAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHRyYW5zZm9ybXMsIGJvb2wgYXBwbHlGaWx0ZXJzLAorICAgICAgICBHTHZvaWQqIHZlcnRpY2VzLCBHTHZvaWQqIHRleENvb3JkcykgeworICAgICAvLyBEZXNjcmliZSB0aGUgcmVxdWlyZWQgc2hhZGVycworICAgICBQcm9ncmFtRGVzY3JpcHRpb24gZGVzY3JpcHRpb247CisgICAgIGRlc2NyaXB0aW9uLmhhc1RleHR1cmUgPSB0cnVlOworICAgICBkZXNjcmlwdGlvbi5oYXNBbHBoYThUZXh0dXJlID0gdHJ1ZTsKKworICAgICBpZiAoYXBwbHlGaWx0ZXJzKSB7CisgICAgICAgICBpZiAobVNoYWRlcikgeworICAgICAgICAgICAgIG1TaGFkZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgICAgICB9CisgICAgICAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgICAgICAgbUNvbG9yRmlsdGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgICAgICAgfQorICAgICB9CisKKyAgICAgLy8gU2V0dXAgdGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgY2hvb3NlQmxlbmRpbmcodHJ1ZSwgbW9kZSwgZGVzY3JpcHRpb24pOworCisgICAgIC8vIEJ1aWxkIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYWRlcgorICAgICB1c2VQcm9ncmFtKG1DYWNoZXMucHJvZ3JhbUNhY2hlLmdldChkZXNjcmlwdGlvbikpOworCisgICAgIGJpbmRUZXh0dXJlKHRleHR1cmUsIEdMX0NMQU1QX1RPX0VER0UsIEdMX0NMQU1QX1RPX0VER0UsIHRleHR1cmVVbml0KTsKKyAgICAgZ2xVbmlmb3JtMWkobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2FtcGxlciIpLCB0ZXh0dXJlVW5pdCk7CisKKyAgICAgaW50IHRleENvb3Jkc1Nsb3QgPSBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRBdHRyaWIoInRleENvb3JkcyIpOworICAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworCisgICAgIC8vIFNldHVwIGF0dHJpYnV0ZXMKKyAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnBvc2l0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgZ01lc2hTdHJpZGUsIHZlcnRpY2VzKTsKKyAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3Jkc1Nsb3QsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgICBnTWVzaFN0cmlkZSwgdGV4Q29vcmRzKTsKKworICAgICAvLyBTZXR1cCB1bmlmb3JtcworICAgICBpZiAodHJhbnNmb3JtcykgeworICAgICAgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKHgsIHksIDAuMGYpOworICAgICAgICAgbU1vZGVsVmlldy5zY2FsZSh3aWR0aCwgaGVpZ2h0LCAxLjBmKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIG1Nb2RlbFZpZXcubG9hZElkZW50aXR5KCk7CisgICAgIH0KKyAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgKm1TbmFwc2hvdC0+dHJhbnNmb3JtKTsKKyAgICAgZ2xVbmlmb3JtNGYobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Y29sb3IsIHIsIGcsIGIsIGEpOworCisgICAgIHRleHR1cmVVbml0Kys7CisgICAgIGlmIChhcHBseUZpbHRlcnMpIHsKKyAgICAgICAgIC8vIFNldHVwIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zIHJlcXVpcmVkIGJ5IHRoZSBzaGFkZXJzCisgICAgICAgICBpZiAobVNoYWRlcikgeworICAgICAgICAgICAgIG1TaGFkZXItPnNldHVwUHJvZ3JhbShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LCAmdGV4dHVyZVVuaXQpOworICAgICAgICAgfQorICAgICAgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICAgICAgIG1Db2xvckZpbHRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0pOworICAgICAgICAgfQorICAgICB9Cit9CisKKy8vIFNhbWUgdmFsdWVzIHVzZWQgYnkgU2tpYQorI2RlZmluZSBrU3RkU3RyaWtlVGhydV9PZmZzZXQgICAoLTYuMGYgLyAyMS4wZikKKyNkZWZpbmUga1N0ZFVuZGVybGluZV9PZmZzZXQgICAgKDEuMGYgLyA5LjBmKQorI2RlZmluZSBrU3RkVW5kZXJsaW5lX1RoaWNrbmVzcyAoMS4wZiAvIDE4LjBmKQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dERlY29yYXRpb25zKGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBmbG9hdCBsZW5ndGgsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgLy8gSGFuZGxlIHVuZGVybGluZSBhbmQgc3RyaWtlLXRocm91Z2gKKyAgICB1aW50MzJfdCBmbGFncyA9IHBhaW50LT5nZXRGbGFncygpOworICAgIGlmIChmbGFncyAmIChTa1BhaW50OjprVW5kZXJsaW5lVGV4dF9GbGFnIHwgU2tQYWludDo6a1N0cmlrZVRocnVUZXh0X0ZsYWcpKSB7CisgICAgICAgIGZsb2F0IHVuZGVybGluZVdpZHRoID0gbGVuZ3RoOworICAgICAgICAvLyBJZiBsZW5ndGggaXMgPiAwLjBmLCB3ZSBhbHJlYWR5IG1lYXN1cmVkIHRoZSB0ZXh0IGZvciB0aGUgdGV4dCBhbGlnbm1lbnQKKyAgICAgICAgaWYgKGxlbmd0aCA8PSAwLjBmKSB7CisgICAgICAgICAgICB1bmRlcmxpbmVXaWR0aCA9IHBhaW50LT5tZWFzdXJlVGV4dCh0ZXh0LCBieXRlc0NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IG9mZnNldFggPSAwOworICAgICAgICBzd2l0Y2ggKHBhaW50LT5nZXRUZXh0QWxpZ24oKSkgeworICAgICAgICAgICAgY2FzZSBTa1BhaW50OjprQ2VudGVyX0FsaWduOgorICAgICAgICAgICAgICAgIG9mZnNldFggPSB1bmRlcmxpbmVXaWR0aCAqIDAuNWY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUGFpbnQ6OmtSaWdodF9BbGlnbjoKKyAgICAgICAgICAgICAgICBvZmZzZXRYID0gdW5kZXJsaW5lV2lkdGg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVuZGVybGluZVdpZHRoID4gMC4wZikgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgdGV4dFNpemUgPSBwYWludC0+Z2V0VGV4dFNpemUoKTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHN0cm9rZVdpZHRoID0gdGV4dFNpemUgKiBrU3RkVW5kZXJsaW5lX1RoaWNrbmVzczsKKworICAgICAgICAgICAgY29uc3QgZmxvYXQgbGVmdCA9IHggLSBvZmZzZXRYOworICAgICAgICAgICAgZmxvYXQgdG9wID0gMC4wZjsKKworICAgICAgICAgICAgY29uc3QgaW50IHBvaW50c0NvdW50ID0gNCAqIChmbGFncyAmIFNrUGFpbnQ6OmtTdHJpa2VUaHJ1VGV4dF9GbGFnID8gMiA6IDEpOworICAgICAgICAgICAgZmxvYXQgcG9pbnRzW3BvaW50c0NvdW50XTsKKyAgICAgICAgICAgIGludCBjdXJyZW50UG9pbnQgPSAwOworCisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBTa1BhaW50OjprVW5kZXJsaW5lVGV4dF9GbGFnKSB7CisgICAgICAgICAgICAgICAgdG9wID0geSArIHRleHRTaXplICoga1N0ZFVuZGVybGluZV9PZmZzZXQ7CisgICAgICAgICAgICAgICAgcG9pbnRzW2N1cnJlbnRQb2ludCsrXSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgcG9pbnRzW2N1cnJlbnRQb2ludCsrXSA9IHRvcDsKKyAgICAgICAgICAgICAgICBwb2ludHNbY3VycmVudFBvaW50KytdID0gbGVmdCArIHVuZGVybGluZVdpZHRoOworICAgICAgICAgICAgICAgIHBvaW50c1tjdXJyZW50UG9pbnQrK10gPSB0b3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNrUGFpbnQ6OmtTdHJpa2VUaHJ1VGV4dF9GbGFnKSB7CisgICAgICAgICAgICAgICAgdG9wID0geSArIHRleHRTaXplICoga1N0ZFN0cmlrZVRocnVfT2Zmc2V0OworICAgICAgICAgICAgICAgIHBvaW50c1tjdXJyZW50UG9pbnQrK10gPSBsZWZ0OworICAgICAgICAgICAgICAgIHBvaW50c1tjdXJyZW50UG9pbnQrK10gPSB0b3A7CisgICAgICAgICAgICAgICAgcG9pbnRzW2N1cnJlbnRQb2ludCsrXSA9IGxlZnQgKyB1bmRlcmxpbmVXaWR0aDsKKyAgICAgICAgICAgICAgICBwb2ludHNbY3VycmVudFBvaW50KytdID0gdG9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTa1BhaW50IGxpbmVzUGFpbnQoKnBhaW50KTsKKyAgICAgICAgICAgIGxpbmVzUGFpbnQuc2V0U3Ryb2tlV2lkdGgoc3Ryb2tlV2lkdGgpOworCisgICAgICAgICAgICBkcmF3TGluZXMoJnBvaW50c1swXSwgcG9pbnRzQ291bnQsICZsaW5lc1BhaW50KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0NvbG9yUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlnbm9yZVRyYW5zZm9ybSkgeworICAgIGNsZWFyTGF5ZXJSZWdpb25zKCk7CisKKyAgICAvLyBJZiBhIHNoYWRlciBpcyBzZXQsIHByZXNlcnZlIG9ubHkgdGhlIGFscGhhCisgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgY29sb3IgfD0gMHgwMGZmZmZmZjsKKyAgICB9CisKKyAgICAvLyBSZW5kZXIgdXNpbmcgcHJlLW11bHRpcGxpZWQgYWxwaGEKKyAgICBjb25zdCBpbnQgYWxwaGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRjsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIHNldHVwQ29sb3JSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgciwgZywgYiwgYSwgbW9kZSwgaWdub3JlVHJhbnNmb3JtKTsKKworICAgIC8vIERyYXcgdGhlIG1lc2gKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIGdNZXNoQ291bnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cENvbG9yUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBpZ25vcmVUcmFuc2Zvcm0pIHsKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworCisgICAgLy8gRGVzY3JpYmUgdGhlIHJlcXVpcmVkIHNoYWRlcnMKKyAgICBQcm9ncmFtRGVzY3JpcHRpb24gZGVzY3JpcHRpb247CisgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgbVNoYWRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICB9CisgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICBtQ29sb3JGaWx0ZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorCisgICAgLy8gU2V0dXAgdGhlIGJsZW5kaW5nIG1vZGUKKyAgICBjaG9vc2VCbGVuZGluZyhhIDwgMS4wZiB8fCAobVNoYWRlciAmJiBtU2hhZGVyLT5ibGVuZCgpKSwgbW9kZSwgZGVzY3JpcHRpb24pOworCisgICAgLy8gQnVpbGQgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUgc2hhZGVyCisgICAgdXNlUHJvZ3JhbShtQ2FjaGVzLnByb2dyYW1DYWNoZS5nZXQoZGVzY3JpcHRpb24pKTsKKworICAgIC8vIFNldHVwIGF0dHJpYnV0ZXMKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgIGdNZXNoU3RyaWRlLCAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSk7CisKKyAgICAvLyBTZXR1cCB1bmlmb3JtcworICAgIG1Nb2RlbFZpZXcubG9hZFRyYW5zbGF0ZShsZWZ0LCB0b3AsIDAuMGYpOworICAgIG1Nb2RlbFZpZXcuc2NhbGUocmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AsIDEuMGYpOworICAgIGlmICghaWdub3JlVHJhbnNmb3JtKSB7CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsICptU25hcHNob3QtPnRyYW5zZm9ybSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0NCBpZGVudGl0eTsKKyAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgaWRlbnRpdHkpOworICAgIH0KKyAgICBnbFVuaWZvcm00ZihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5jb2xvciwgciwgZywgYiwgYSk7CisKKyAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzIGFuZCB1bmlmb3JtcyByZXF1aXJlZCBieSB0aGUgc2hhZGVycworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPnNldHVwUHJvZ3JhbShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LCAmdGV4dHVyZVVuaXQpOworICAgIH0KKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0pOworICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpbnQgYWxwaGE7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGdldEFscGhhQW5kTW9kZShwYWludCwgJmFscGhhLCAmbW9kZSk7CisKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0ZXh0dXJlLT5pZCwgYWxwaGEgLyAyNTUuMGYsIG1vZGUsCisgICAgICAgICAgICB0ZXh0dXJlLT5ibGVuZCwgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0sICZtTWVzaFZlcnRpY2VzWzBdLnRleHR1cmVbMF0sCisgICAgICAgICAgICBHTF9UUklBTkdMRV9TVFJJUCwgZ01lc2hDb3VudCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIEdMdWludCB0ZXh0dXJlLCBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kKSB7CisgICAgZHJhd1RleHR1cmVNZXNoKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdGV4dHVyZSwgYWxwaGEsIG1vZGUsIGJsZW5kLAorICAgICAgICAgICAgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0sICZtTWVzaFZlcnRpY2VzWzBdLnRleHR1cmVbMF0sCisgICAgICAgICAgICBHTF9UUklBTkdMRV9TVFJJUCwgZ01lc2hDb3VudCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlTWVzaChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIEdMdWludCB0ZXh0dXJlLCBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kLAorICAgICAgICBHTHZvaWQqIHZlcnRpY2VzLCBHTHZvaWQqIHRleENvb3JkcywgR0xlbnVtIGRyYXdNb2RlLCBHTHNpemVpIGVsZW1lbnRzQ291bnQsCisgICAgICAgIGJvb2wgc3dhcFNyY0RzdCwgYm9vbCBpZ25vcmVUcmFuc2Zvcm0pIHsKKyAgICBjbGVhckxheWVyUmVnaW9ucygpOworCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIGRlc2NyaXB0aW9uLmhhc1RleHR1cmUgPSB0cnVlOworICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworICAgIG1Nb2RlbFZpZXcubG9hZFRyYW5zbGF0ZShsZWZ0LCB0b3AsIDAuMGYpOworICAgIG1Nb2RlbFZpZXcuc2NhbGUocmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AsIDEuMGYpOworCisgICAgY2hvb3NlQmxlbmRpbmcoYmxlbmQgfHwgYWxwaGEgPCAxLjBmLCBtb2RlLCBkZXNjcmlwdGlvbiwgc3dhcFNyY0RzdCk7CisKKyAgICB1c2VQcm9ncmFtKG1DYWNoZXMucHJvZ3JhbUNhY2hlLmdldChkZXNjcmlwdGlvbikpOworICAgIGlmICghaWdub3JlVHJhbnNmb3JtKSB7CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsICptU25hcHNob3QtPnRyYW5zZm9ybSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0NCBtOworICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCBtKTsKKyAgICB9CisKKyAgICAvLyBUZXh0dXJlCisgICAgYmluZFRleHR1cmUodGV4dHVyZSwgR0xfQ0xBTVBfVE9fRURHRSwgR0xfQ0xBTVBfVE9fRURHRSwgMCk7CisgICAgZ2xVbmlmb3JtMWkobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2FtcGxlciIpLCAwKTsKKworICAgIC8vIEFsd2F5cyBwcmVtdWx0aXBsaWVkCisgICAgZ2xVbmlmb3JtNGYobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Y29sb3IsIGFscGhhLCBhbHBoYSwgYWxwaGEsIGFscGhhKTsKKworICAgIC8vIE1lc2gKKyAgICBpbnQgdGV4Q29vcmRzU2xvdCA9IG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIik7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgIGdNZXNoU3RyaWRlLCB2ZXJ0aWNlcyk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3Jkc1Nsb3QsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgZ01lc2hTdHJpZGUsIHRleENvb3Jkcyk7CisKKyAgICAvLyBDb2xvciBmaWx0ZXIKKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0pOworICAgIH0KKworICAgIGdsRHJhd0FycmF5cyhkcmF3TW9kZSwgMCwgZWxlbWVudHNDb3VudCk7CisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkodGV4Q29vcmRzU2xvdCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmNob29zZUJsZW5kaW5nKGJvb2wgYmxlbmQsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwKKyAgICAgICAgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgYm9vbCBzd2FwU3JjRHN0KSB7CisgICAgYmxlbmQgPSBibGVuZCB8fCBtb2RlICE9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgaWYgKGJsZW5kKSB7CisgICAgICAgIGlmIChtb2RlIDwgU2tYZmVybW9kZTo6a1BsdXNfTW9kZSkgeworICAgICAgICAgICAgaWYgKCFtQ2FjaGVzLmJsZW5kKSB7CisgICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBHTGVudW0gc291cmNlTW9kZSA9IHN3YXBTcmNEc3QgPyBnQmxlbmRzU3dhcFttb2RlXS5zcmMgOiBnQmxlbmRzW21vZGVdLnNyYzsKKyAgICAgICAgICAgIEdMZW51bSBkZXN0TW9kZSA9IHN3YXBTcmNEc3QgPyBnQmxlbmRzU3dhcFttb2RlXS5kc3QgOiBnQmxlbmRzW21vZGVdLmRzdDsKKworICAgICAgICAgICAgaWYgKHNvdXJjZU1vZGUgIT0gbUNhY2hlcy5sYXN0U3JjTW9kZSB8fCBkZXN0TW9kZSAhPSBtQ2FjaGVzLmxhc3REc3RNb2RlKSB7CisgICAgICAgICAgICAgICAgZ2xCbGVuZEZ1bmMoc291cmNlTW9kZSwgZGVzdE1vZGUpOworICAgICAgICAgICAgICAgIG1DYWNoZXMubGFzdFNyY01vZGUgPSBzb3VyY2VNb2RlOworICAgICAgICAgICAgICAgIG1DYWNoZXMubGFzdERzdE1vZGUgPSBkZXN0TW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZXNlIGJsZW5kIG1vZGVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IE9wZW5HTCBkaXJlY3RseSBhbmQgaGF2ZQorICAgICAgICAgICAgLy8gdG8gYmUgaW1wbGVtZW50ZWQgdXNpbmcgc2hhZGVycy4gU2luY2UgdGhlIHNoYWRlciB3aWxsIHBlcmZvcm0KKyAgICAgICAgICAgIC8vIHRoZSBibGVuZGluZywgdHVybiBibGVuZGluZyBvZmYgaGVyZQorICAgICAgICAgICAgaWYgKG1FeHRlbnNpb25zLmhhc0ZyYW1lYnVmZmVyRmV0Y2goKSkgeworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmZyYW1lYnVmZmVyTW9kZSA9IG1vZGU7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uc3dhcFNyY0RzdCA9IHN3YXBTcmNEc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ2FjaGVzLmJsZW5kKSB7CisgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJsZW5kID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1DYWNoZXMuYmxlbmQpIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICB9CisgICAgbUNhY2hlcy5ibGVuZCA9IGJsZW5kOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjp1c2VQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pIHsKKyAgICBpZiAoIXByb2dyYW0tPmlzSW5Vc2UoKSkgeworICAgICAgICBpZiAobUNhY2hlcy5jdXJyZW50UHJvZ3JhbSAhPSBOVUxMKSBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5yZW1vdmUoKTsKKyAgICAgICAgcHJvZ3JhbS0+dXNlKCk7CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0gPSBwcm9ncmFtOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgdTIsIGZsb2F0IHYyKSB7CisgICAgVGV4dHVyZVZlcnRleCogdiA9ICZtTWVzaFZlcnRpY2VzWzBdOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTEsIHYxKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUyLCB2MSk7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MSwgdjIpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTIsIHYyKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Z2V0QWxwaGFBbmRNb2RlKGNvbnN0IFNrUGFpbnQqIHBhaW50LCBpbnQqIGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlKiBtb2RlKSB7CisgICAgaWYgKHBhaW50KSB7CisgICAgICAgIGlmICghbUV4dGVuc2lvbnMuaGFzRnJhbWVidWZmZXJGZXRjaCgpKSB7CisgICAgICAgICAgICBjb25zdCBib29sIGlzTW9kZSA9IFNrWGZlcm1vZGU6OklzTW9kZShwYWludC0+Z2V0WGZlcm1vZGUoKSwgbW9kZSk7CisgICAgICAgICAgICBpZiAoIWlzTW9kZSkgeworICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBTUkNfT1ZFUgorICAgICAgICAgICAgICAgICptb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICptb2RlID0gZ2V0WGZlcm1vZGUocGFpbnQtPmdldFhmZXJtb2RlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2tpYSBkcmF3cyB1c2luZyB0aGUgY29sb3IncyBhbHBoYSBjaGFubmVsIGlmIDwgMjU1CisgICAgICAgIC8vIE90aGVyd2lzZSwgaXQgdXNlcyB0aGUgcGFpbnQncyBhbHBoYQorICAgICAgICBpbnQgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICAgICAgKmFscGhhID0gKGNvbG9yID4+IDI0KSAmIDB4RkY7CisgICAgICAgIGlmICgqYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgICAqYWxwaGEgPSBwYWludC0+Z2V0QWxwaGEoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICptb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICAgICAgKmFscGhhID0gMjU1OworICAgIH0KK30KKworU2tYZmVybW9kZTo6TW9kZSBPcGVuR0xSZW5kZXJlcjo6Z2V0WGZlcm1vZGUoU2tYZmVybW9kZSogbW9kZSkgeworICAgIGlmIChtb2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgfQorICAgIHJldHVybiBtb2RlLT5mTW9kZTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6YmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQpIHsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c1t0ZXh0dXJlVW5pdF0pOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCB3cmFwUyk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCB3cmFwVCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmggYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2FhOGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmgKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9PUEVOR0xfUkVOREVSRVJfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisjaW5jbHVkZSA8U2tQYWludC5oPgorI2luY2x1ZGUgPFNrUmVnaW9uLmg+CisjaW5jbHVkZSA8U2tTaGFkZXIuaD4KKyNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorI2luY2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJTbmFwc2hvdC5oIgorI2luY2x1ZGUgIlZlcnRleC5oIgorI2luY2x1ZGUgIlNraWFTaGFkZXIuaCIKKyNpbmNsdWRlICJTa2lhQ29sb3JGaWx0ZXIuaCIKKyNpbmNsdWRlICJDYWNoZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX09QRU5HTCAxCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlbmRlcmVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIERpc3BsYXlMaXN0UmVuZGVyZXI7CisKKy8qKgorICogT3BlbkdMIHJlbmRlcmVyIHVzZWQgdG8gZHJhdyBhY2NlbGVyYXRlZCAyRCBncmFwaGljcy4gVGhlIEFQSSBpcyBhCisgKiBzaW1wbGlmaWVkIHZlcnNpb24gb2YgU2tpYSdzIENhbnZhcyBBUEkuCisgKi8KK2NsYXNzIE9wZW5HTFJlbmRlcmVyIHsKK3B1YmxpYzoKKyAgICBPcGVuR0xSZW5kZXJlcigpOworICAgIHZpcnR1YWwgfk9wZW5HTFJlbmRlcmVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlKGJvb2wgb3BhcXVlKTsKKyAgICB2aXJ0dWFsIHZvaWQgZmluaXNoKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUNvbnRleHQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUNvbnRleHQoKTsKKworICAgIGludCBnZXRTYXZlQ291bnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBzYXZlKGludCBmbGFncyk7CisgICAgdmlydHVhbCB2b2lkIHJlc3RvcmUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCk7CisKKyAgICB2aXJ0dWFsIGludCBzYXZlTGF5ZXIoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgY29uc3QgU2tQYWludCogcCwgaW50IGZsYWdzKTsKKyAgICB2aXJ0dWFsIGludCBzYXZlTGF5ZXJBbHBoYShmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgYWxwaGEsIGludCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSk7CisgICAgdmlydHVhbCB2b2lkIHJvdGF0ZShmbG9hdCBkZWdyZWVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIHZvaWQgZ2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCk7CisgICAgdmlydHVhbCB2b2lkIGNvbmNhdE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKworICAgIGNvbnN0IFJlY3QmIGdldENsaXBCb3VuZHMoKTsKKyAgICBib29sIHF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSk7CisgICAgdmlydHVhbCBib29sIGNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgU2tSZWdpb246Ok9wIG9wKTsKKworICAgIHZpcnR1YWwgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZpcnR1YWwgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsCisgICAgICAgICAgICBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLCBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsCisgICAgICAgICAgICBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdmlydHVhbCB2b2lkIGRyYXdQYXRjaChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBpbnQzMl90KiB4RGl2cywgY29uc3QgaW50MzJfdCogeURpdnMsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdmlydHVhbCB2b2lkIGRyYXdDb2xvcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisgICAgdmlydHVhbCB2b2lkIGRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZpcnR1YWwgdm9pZCBkcmF3UGF0aChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd0xpbmVzKGZsb2F0KiBwb2ludHMsIGludCBjb3VudCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZpcnR1YWwgdm9pZCBkcmF3VGV4dChjb25zdCBjaGFyKiB0ZXh0LCBpbnQgYnl0ZXNDb3VudCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgU2tQYWludCogcGFpbnQpOworCisgICAgdmlydHVhbCB2b2lkIHJlc2V0U2hhZGVyKCk7CisgICAgdmlydHVhbCB2b2lkIHNldHVwU2hhZGVyKFNraWFTaGFkZXIqIHNoYWRlcik7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXRDb2xvckZpbHRlcigpOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cENvbG9yRmlsdGVyKFNraWFDb2xvckZpbHRlciogZmlsdGVyKTsKKworICAgIHZpcnR1YWwgdm9pZCByZXNldFNoYWRvdygpOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFNoYWRvdyhmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKTsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIENvbXBvc2UgdGhlIGxheWVyIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc25hcHNob3Qgd2l0aCB0aGUgbGF5ZXIKKyAgICAgKiBkZWZpbmVkIGJ5IHRoZSBwcmV2aW91cyBzbmFwc2hvdC4KKyAgICAgKgorICAgICAqIFRoZSBjdXJyZW50IHNuYXBzaG90ICptdXN0KiBiZSBhIGxheWVyIChmbGFnIGtGbGFnSXNMYXllciBzZXQuKQorICAgICAqCisgICAgICogQHBhcmFtIGN1cmVudCBUaGUgY3VycmVudCBzbmFwc2hvdCBjb250YWluaW5nIHRoZSBsYXllciB0byBjb21wb3NlCisgICAgICogQHBhcmFtIHByZXZpb3VzIFRoZSBwcmV2aW91cyBzbmFwc2hvdCB0byBjb21wb3NlIHRoZSBjdXJyZW50IGxheWVyIHdpdGgKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgY29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZW5kZXJlciBhcyBhIG5ldyBzbmFwc2hvdC4KKyAgICAgKiBUaGUgbmV3IHNuYXBzaG90IGlzIHNhdmVkIGluIG1TbmFwc2hvdCBhbmQgdGhlIHByZXZpb3VzIHNuYXBzaG90CisgICAgICogaXMgbGlua2VkIGZyb20gbVNuYXBzaG90LT5wcmV2aW91cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFncyBUaGUgc2F2ZSBmbGFnczsgc2VlIFNrQ2FudmFzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuZXcgc2F2ZSBjb3VudC4gVGhpcyB2YWx1ZSBjYW4gYmUgcGFzc2VkIHRvICNyZXN0b3JlVG9Db3VudCgpCisgICAgICovCisgICAgaW50IHNhdmVTbmFwc2hvdChpbnQgZmxhZ3MpOworCisgICAgLyoqCisgICAgICogUmVzdG9yZXMgdGhlIGN1cnJlbnQgc25hcHNob3Q7IG1TbmFwc2hvdCBiZWNvbWVzIG1TbmFwc2hvdC0+cHJldmlvdXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsaXAgd2FzIG1vZGlmaWVkLgorICAgICAqLworICAgIGJvb2wgcmVzdG9yZVNuYXBzaG90KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGlwcGluZyByZWN0YW5nbGUgdXNpbmcgZ2xTY2lzc29yLiBUaGUgY2xpcCBpcyBkZWZpbmVkIGJ5CisgICAgICogdGhlIGN1cnJlbnQgc25hcHNob3QncyBjbGlwUmVjdCBtZW1iZXIuCisgICAgICovCisgICAgdm9pZCBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgbGF5ZXIgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgc25hcHNob3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc25hcHNob3QgVGhlIHNuYXBzaG90IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IGxheWVyCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIGFscGhhIFRoZSB0cmFuc2x1Y2VuY3kgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIGZsYWdzIFRoZSBsYXllciBzYXZlIGZsYWdzCisgICAgICogQHBhcmFtIHByZXZpb3VzRmJvIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZyYW1lYnVmZmVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxheWVyIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBjcmVhdGVMYXllcihzcDxTbmFwc2hvdD4gc25hcHNob3QsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGludCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBpbnQgZmxhZ3MsIEdMdWludCBwcmV2aW91c0Zibyk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgYWxsIHRoZSByZWdpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBsYXllcnMuCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBpbnZva2VkIGJlZm9yZSBhbnkgZHJhd2luZyBvcGVyYXRpb24uCisgICAgICovCisgICAgdm9pZCBjbGVhckxheWVyUmVnaW9ucygpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSBjb2xvcmVkIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IuIFRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgc25hcHNob3QncyB0cmFuc2Zvcm0gbWF0cml4LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBjb2xvciBUaGUgcmVjdGFuZ2xlJ3MgQVJHQiBjb2xvciwgZGVmaW5lZCBhcyBhIHBhY2tlZCAzMiBiaXRzIHdvcmQKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgU2tpYSB4ZmVybW9kZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gaWdub3JlVHJhbnNmb3JtIFRydWUgaWYgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHNob3VsZCBiZSBpZ25vcmVkCisgICAgICogQHBhcmFuIGlnbm9yZUJsZW5kaW5nIFRydWUgaWYgdGhlIGJsZW5kaW5nIGlzIHNldCBieSB0aGUgY2FsbGVyCisgICAgICovCisgICAgdm9pZCBkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlnbm9yZVRyYW5zZm9ybSA9IGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIFNldHVwcyBzaGFkZXJzIHRvIGRyYXcgYSBjb2xvcmVkIHJlY3QuCisgICAgICovCisgICAgdm9pZCBzZXR1cENvbG9yUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaWdub3JlVHJhbnNmb3JtKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBUaGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzCisgICAgICogYXJlIHRyYW5zZm9ybWVkIGJ5IHRoZSBjdXJyZW50IHNuYXBzaG90J3MgdHJhbnNmb3JtIG1hdHJpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSBuYW1lIHRvIG1hcCBvbnRvIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYWxwaGEgQW4gYWRkaXRpb25hbCB0cmFuc2x1Y2VuY3kgcGFyYW1ldGVyLCBiZXR3ZWVuIDAuMGYgYW5kIDEuMGYKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSBibGVuZCBUcnVlIGlmIHRoZSB0ZXh0dXJlIGNvbnRhaW5zIGFuIGFscGhhIGNoYW5uZWwKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIEdMdWludCB0ZXh0dXJlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIHRleHR1cmVkIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dHVyZS4gVGhlIHNwZWNpZmllZCBjb29yZGluYXRlcworICAgICAqIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBzbmFwc2hvdCdzIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgdG8gdXNlCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCBjb250YWluaW5nIHRoZSBhbHBoYSwgYmxlbmRpbmcgbW9kZSwgZXRjLgorICAgICAqLworICAgIHZvaWQgZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgbWVzaCB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dHVyZS4gSWYgdGhlIGluZGljZXMgYXJlIG9taXR0ZWQsIHRoZQorICAgICAqIG1lc2ggaXMgZHJhd24gYXMgYSBzaW1wbGUgcXVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSBuYW1lIHRvIG1hcCBvbnRvIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYWxwaGEgQW4gYWRkaXRpb25hbCB0cmFuc2x1Y2VuY3kgcGFyYW1ldGVyLCBiZXR3ZWVuIDAuMGYgYW5kIDEuMGYKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSBibGVuZCBUcnVlIGlmIHRoZSB0ZXh0dXJlIGNvbnRhaW5zIGFuIGFscGhhIGNoYW5uZWwKKyAgICAgKiBAcGFyYW0gdmVydGljZXMgVGhlIHZlcnRpY2VzIHRoYXQgZGVmaW5lIHRoZSBtZXNoCisgICAgICogQHBhcmFtIHRleENvb3JkcyBUaGUgdGV4dHVyZSBjb29yZGluYXRlcyBvZiBlYWNoIHZlcnRleAorICAgICAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSB2ZXJ0aWNlcywgY2FuIGJlIE5VTEwKKyAgICAgKiBAcGFyYW0gZWxlbWVudHNDb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtZXNoLCByZXF1aXJlZCBieSBpbmRpY2VzCisgICAgICogQHBhcmFtIHN3YXBTcmNEc3QgV2hldGhlciBvciBub3QgdGhlIHNyYyBhbmQgZHN0IGJsZW5kaW5nIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHN3YXBwZWQKKyAgICAgKiBAcGFyYW0gaWdub3JlVHJhbnNmb3JtIFRydWUgaWYgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHNob3VsZCBiZSBpZ25vcmVkCisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dHVyZU1lc2goZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBHTHVpbnQgdGV4dHVyZSwKKyAgICAgICAgICAgIGZsb2F0IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgYmxlbmQsCisgICAgICAgICAgICBHTHZvaWQqIHZlcnRpY2VzLCBHTHZvaWQqIHRleENvb3JkcywgR0xlbnVtIGRyYXdNb2RlLCBHTHNpemVpIGVsZW1lbnRzQ291bnQsCisgICAgICAgICAgICBib29sIHN3YXBTcmNEc3QgPSBmYWxzZSwgYm9vbCBpZ25vcmVUcmFuc2Zvcm0gPSBmYWxzZSk7CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlcyB0aGUgcmVuZGVyZXIgdG8gZHJhdyB0aGUgc3BlY2lmaWVkIHNoYWRvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSBzaGFkb3cgdGV4dHVyZQorICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNoYWRvdworICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNoYWRvdworICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGFscGhhIFRoZSBhbHBoYSB2YWx1ZQorICAgICAqLworICAgIHZvaWQgc2V0dXBTaGFkb3coY29uc3QgU2hhZG93VGV4dHVyZSogdGV4dHVyZSwgZmxvYXQgeCwgZmxvYXQgeSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgdGhlIHJlbmRlcmVyIHRvIGRyYXcgdGhlIHNwZWNpZmllZCBBbHBoYTggdGV4dHVyZSBhcyBhIHJlY3RhbmdsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIHRvIHJlbmRlciB3aXRoCisgICAgICogQHBhcmFtIHRleHR1cmVVbml0IFRoZSB0ZXh0dXJlIHVuaXQgdG8gdXNlLCBtYXkgYmUgbW9kaWZpZWQKKyAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSB0byBkcmF3CisgICAgICogQHBhcmFtIHIgVGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGcgVGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gYiBUaGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGEgVGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1zIFRydWUgaWYgdGhlIG1hdHJpeCBwYXNzZWQgdG8gdGhlIHNoYWRlciBzaG91bGQgYmUgbXVsdGlwbGllZAorICAgICAqICAgICAgICBieSB0aGUgbW9kZWwtdmlldyBtYXRyaXgKKyAgICAgKiBAcGFyYW0gYXBwbHlGaWx0ZXJzIFdoZXRoZXIgb3Igbm90IHRvIHRha2UgY29sb3IgZmlsdGVycyBhbmQKKyAgICAgKiAgICAgICAgc2hhZGVycyBpbnRvIGFjY291bnQKKyAgICAgKi8KKyAgICB2b2lkIHNldHVwVGV4dHVyZUFscGhhOChjb25zdCBUZXh0dXJlKiB0ZXh0dXJlLCBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHRyYW5zZm9ybXMsCisgICAgICAgICAgICBib29sIGFwcGx5RmlsdGVycyk7CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlcyB0aGUgcmVuZGVyZXIgdG8gZHJhdyB0aGUgc3BlY2lmaWVkIEFscGhhOCB0ZXh0dXJlIGFzIGEgcmVjdGFuZ2xlLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgdG8gcmVuZGVyIHdpdGgKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHRleHR1cmVVbml0IFRoZSB0ZXh0dXJlIHVuaXQgdG8gdXNlLCBtYXkgYmUgbW9kaWZpZWQKKyAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSB0byBkcmF3CisgICAgICogQHBhcmFtIHIgVGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGcgVGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gYiBUaGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGEgVGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1zIFRydWUgaWYgdGhlIG1hdHJpeCBwYXNzZWQgdG8gdGhlIHNoYWRlciBzaG91bGQgYmUgbXVsdGlwbGllZAorICAgICAqICAgICAgICBieSB0aGUgbW9kZWwtdmlldyBtYXRyaXgKKyAgICAgKiBAcGFyYW0gYXBwbHlGaWx0ZXJzIFdoZXRoZXIgb3Igbm90IHRvIHRha2UgY29sb3IgZmlsdGVycyBhbmQKKyAgICAgKiAgICAgICAgc2hhZGVycyBpbnRvIGFjY291bnQKKyAgICAgKi8KKyAgICB2b2lkIHNldHVwVGV4dHVyZUFscGhhOChHTHVpbnQgdGV4dHVyZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIEdMdWludCYgdGV4dHVyZVVuaXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEsCisgICAgICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgdHJhbnNmb3JtcywgYm9vbCBhcHBseUZpbHRlcnMpOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyBhYm92ZSBzZXR1cFRleHR1cmVBbHBoYTgoKSBidXQgc3BlY2lmaWVzIHRoZSBtZXNoJ3MgdmVydGljZXMKKyAgICAgKiBhbmQgdGV4Q29vcmRzIHBvaW50ZXJzLgorICAgICAqLworICAgIHZvaWQgc2V0dXBUZXh0dXJlQWxwaGE4KEdMdWludCB0ZXh0dXJlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgR0x1aW50JiB0ZXh0dXJlVW5pdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSwKKyAgICAgICAgICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCB0cmFuc2Zvcm1zLCBib29sIGFwcGx5RmlsdGVycywKKyAgICAgICAgICAgIEdMdm9pZCogdmVydGljZXMsIEdMdm9pZCogdGV4Q29vcmRzKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIHRleHQgdW5kZXJsaW5lIGFuZCBzdHJpa2UtdGhyb3VnaCBpZiBuZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBkZWNvcgorICAgICAqIEBwYXJhbSBieXRlc0NvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggaW4gcGl4ZWxzIG9mIHRoZSB0ZXh0LCBjYW4gYmUgPD0gMC4wZiB0byBmb3JjZSBhIG1lYXN1cmVtZW50CisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBkcmF3IHRoZSB0ZXh0IHdpdGgKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0RGVjb3JhdGlvbnMoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGZsb2F0IGxlbmd0aCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KTsKKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBzdG9yZWQgaW4gbU1lc2hWZXJ0aWNlcy4gU2V0dGluZyB0aGUgdmFsdWVzCisgICAgICogYmFjayB0byBkZWZhdWx0IGlzIGFjaGlldmVkIGJ5IGNhbGxpbmc6CisgICAgICoKKyAgICAgKiByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworICAgICAqCisgICAgICogQHBhcmFtIHUxIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdjEgVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHUyIFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHYyIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgdGV4dHVyZQorICAgICAqLworICAgIHZvaWQgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2Mik7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbHBoYSBhbmQgeGZlcm1vZGUgb3V0IG9mIGEgcGFpbnQgb2JqZWN0LiBJZiB0aGUgcGFpbnQgaXMgbnVsbAorICAgICAqIGFscGhhIHdpbGwgYmUgMjU1IGFuZCB0aGUgeGZlcm1vZGUgd2lsbCBiZSBTUkNfT1ZFUi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbQorICAgICAqIEBwYXJhbSBhbHBoYSBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIGFscGhhCisgICAgICogQHBhcmFtIG1vZGUgV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyB4ZmVybW9kZQorICAgICAqLworICAgIGlubGluZSB2b2lkIGdldEFscGhhQW5kTW9kZShjb25zdCBTa1BhaW50KiBwYWludCwgaW50KiBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSogbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGUgc3BlY2lmaWVkIHRleHR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXAgbW9kZXMuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgYmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGJsZW5kaW5nIGFzIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBhcHByb3ByaWF0ZQorICAgICAqIGJsZW5kIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgeGZlcm1vZGUuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2hvb3NlQmxlbmRpbmcoYm9vbCBibGVuZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgYm9vbCBzd2FwU3JjRHN0ID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogU2FmZWx5IHJldHJpZXZlcyB0aGUgbW9kZSBmcm9tIHRoZSBzcGVjaWZpZWQgeGZlcm1vZGUuIElmIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB4ZmVybW9kZSBpcyBudWxsLCB0aGUgbW9kZSBpcyBhc3N1bWVkIHRvIGJlIFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGUuCisgICAgICovCisgICAgaW5saW5lIFNrWGZlcm1vZGU6Ok1vZGUgZ2V0WGZlcm1vZGUoU2tYZmVybW9kZSogbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIHNwZWNpZmllZCBwcm9ncmFtIHdpdGggdGhlIGN1cnJlbnQgR0wgY29udGV4dC4gSWYgdGhlIHByb2dyYW0gaXMgYWxyZWFkeQorICAgICAqIGluIHVzZSwgaXQgd2lsbCBub3QgYmUgYm91bmQgYWdhaW4uIElmIGl0IGlzIG5vdCBpbiB1c2UsIHRoZSBjdXJyZW50IHByb2dyYW0gaXMKKyAgICAgKiBtYXJrZWQgdW51c2VkIGFuZCB0aGUgc3BlY2lmaWVkIHByb2dyYW0gYmVjb21lcyB1c2VkIGFuZCBiZWNvbWVzIHRoZSBuZXcKKyAgICAgKiBjdXJyZW50IHByb2dyYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byB1c2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBJZiB0aGUgc3BlY2lmaWVkIHByb2dyYW0gd2FzIGFscmVhZHkgaW4gdXNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgdXNlUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworICAgIC8vIERpbWVuc2lvbnMgb2YgdGhlIGRyYXdpbmcgc3VyZmFjZQorICAgIGludCBtV2lkdGgsIG1IZWlnaHQ7CisKKyAgICAvLyBNYXRyaXggdXNlZCBmb3Igb3J0aG8gcHJvamVjdGlvbiBpbiBzaGFkZXJzCisgICAgbWF0NCBtT3J0aG9NYXRyaXg7CisKKyAgICAvLyBNb2RlbC12aWV3IG1hdHJpeCB1c2VkIHRvIHBvc2l0aW9uL3NpemUgb2JqZWN0cworICAgIG1hdDQgbU1vZGVsVmlldzsKKworICAgIC8vIE51bWJlciBvZiBzYXZlZCBzdGF0ZXMKKyAgICBpbnQgbVNhdmVDb3VudDsKKyAgICAvLyBCYXNlIHN0YXRlCisgICAgc3A8U25hcHNob3Q+IG1GaXJzdFNuYXBzaG90OworICAgIC8vIEN1cnJlbnQgc3RhdGUKKyAgICBzcDxTbmFwc2hvdD4gbVNuYXBzaG90OworCisgICAgLy8gU2hhZGVycworICAgIFNraWFTaGFkZXIqIG1TaGFkZXI7CisKKyAgICAvLyBDb2xvciBmaWx0ZXJzCisgICAgU2tpYUNvbG9yRmlsdGVyKiBtQ29sb3JGaWx0ZXI7CisKKyAgICAvLyBVc2VkIHRvIGRyYXcgdGV4dHVyZWQgcXVhZHMKKyAgICBUZXh0dXJlVmVydGV4IG1NZXNoVmVydGljZXNbNF07CisKKyAgICAvLyBHTCBleHRlbnNpb25zCisgICAgRXh0ZW5zaW9ucyBtRXh0ZW5zaW9uczsKKworICAgIC8vIERyb3Agc2hhZG93CisgICAgYm9vbCBtSGFzU2hhZG93OworICAgIGZsb2F0IG1TaGFkb3dSYWRpdXM7CisgICAgZmxvYXQgbVNoYWRvd0R4OworICAgIGZsb2F0IG1TaGFkb3dEeTsKKyAgICBpbnQgbVNoYWRvd0NvbG9yOworCisgICAgLy8gVmFyaW91cyBjYWNoZXMKKyAgICBDYWNoZXMmIG1DYWNoZXM7CisKKyAgICAvLyBMaXN0IG9mIHJlY3RhbmdsZXMgdG8gY2xlYXIgZHVlIHRvIGNhbGxzIHRvIHNhdmVMYXllcigpCisgICAgVmVjdG9yPFJlY3QqPiBtTGF5ZXJzOworCisgICAgLy8gTWlzYworICAgIEdMaW50IG1NYXhUZXh0dXJlU2l6ZTsKKworICAgIGZyaWVuZCBjbGFzcyBEaXNwbGF5TGlzdFJlbmRlcmVyOworCit9OyAvLyBjbGFzcyBPcGVuR0xSZW5kZXJlcgorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaC5jcHAgYi9saWJzL2h3dWkvUGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGEwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2guY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSAiUGF0Y2guaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYXRjaDo6UGF0Y2goY29uc3QgdWludDMyX3QgeENvdW50LCBjb25zdCB1aW50MzJfdCB5Q291bnQpIHsKKyAgICAvLyAyIHRyaWFuZ2xlcyBwZXIgcGF0Y2gsIDMgdmVydGljZXMgcGVyIHRyaWFuZ2xlCisgICAgdmVydGljZXNDb3VudCA9ICh4Q291bnQgKyAxKSAqICh5Q291bnQgKyAxKSAqIDIgKiAzOworICAgIHZlcnRpY2VzID0gbmV3IFRleHR1cmVWZXJ0ZXhbdmVydGljZXNDb3VudF07Cit9CisKK1BhdGNoOjp+UGF0Y2goKSB7CisgICAgZGVsZXRlW10gdmVydGljZXM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZlcnRpY2VzIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaDo6dXBkYXRlVmVydGljZXMoY29uc3QgZmxvYXQgYml0bWFwV2lkdGgsIGNvbnN0IGZsb2F0IGJpdG1hcEhlaWdodCwKKyAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBjb25zdCBpbnQzMl90KiB4RGl2cywgY29uc3QgaW50MzJfdCogeURpdnMsIGNvbnN0IHVpbnQzMl90IHdpZHRoLCBjb25zdCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBjb25zdCB1aW50MzJfdCB4U3RyZXRjaENvdW50ID0gKHdpZHRoICsgMSkgPj4gMTsKKyAgICBjb25zdCB1aW50MzJfdCB5U3RyZXRjaENvdW50ID0gKGhlaWdodCArIDEpID4+IDE7CisKKyAgICBmbG9hdCBzdHJldGNoWCA9IDAuMGY7CisgICAgZmxvYXQgc3RyZXRjaFkgPSAwLjA7CisKKyAgICBjb25zdCBmbG9hdCBtZXNoV2lkdGggPSByaWdodCAtIGxlZnQ7CisKKyAgICBpZiAoeFN0cmV0Y2hDb3VudCA+IDApIHsKKyAgICAgICAgdWludDMyX3Qgc3RyZXRjaFNpemUgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgd2lkdGg7IGkgKz0gMikgeworICAgICAgICAgICAgc3RyZXRjaFNpemUgKz0geERpdnNbaV0gLSB4RGl2c1tpIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgeFN0cmV0Y2hUZXggPSBzdHJldGNoU2l6ZTsKKyAgICAgICAgY29uc3QgZmxvYXQgZml4ZWQgPSBiaXRtYXBXaWR0aCAtIHN0cmV0Y2hTaXplOworICAgICAgICBjb25zdCBmbG9hdCB4U3RyZXRjaCA9IHJpZ2h0IC0gbGVmdCAtIGZpeGVkOworICAgICAgICBzdHJldGNoWCA9IHhTdHJldGNoIC8geFN0cmV0Y2hUZXg7CisgICAgfQorCisgICAgaWYgKHlTdHJldGNoQ291bnQgPiAwKSB7CisgICAgICAgIHVpbnQzMl90IHN0cmV0Y2hTaXplID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IGhlaWdodDsgaSArPSAyKSB7CisgICAgICAgICAgICBzdHJldGNoU2l6ZSArPSB5RGl2c1tpXSAtIHlEaXZzW2kgLSAxXTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCB5U3RyZXRjaFRleCA9IHN0cmV0Y2hTaXplOworICAgICAgICBjb25zdCBmbG9hdCBmaXhlZCA9IGJpdG1hcEhlaWdodCAtIHN0cmV0Y2hTaXplOworICAgICAgICBjb25zdCBmbG9hdCB5U3RyZXRjaCA9IGJvdHRvbSAtIHRvcCAtIGZpeGVkOworICAgICAgICBzdHJldGNoWSA9IHlTdHJldGNoIC8geVN0cmV0Y2hUZXg7CisgICAgfQorCisgICAgVGV4dHVyZVZlcnRleCogdmVydGV4ID0gdmVydGljZXM7CisKKyAgICBmbG9hdCBwcmV2aW91c1N0ZXBZID0gMC4wZjsKKworICAgIGZsb2F0IHkxID0gMC4wZjsKKyAgICBmbG9hdCB2MSA9IDAuMGY7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZmxvYXQgc3RlcFkgPSB5RGl2c1tpXTsKKworICAgICAgICBmbG9hdCB5MiA9IDAuMGY7CisgICAgICAgIGlmIChpICYgMSkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgc2VnbWVudCA9IHN0ZXBZIC0gcHJldmlvdXNTdGVwWTsKKyAgICAgICAgICAgIHkyID0geTEgKyBzZWdtZW50ICogc3RyZXRjaFk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB5MiA9IHkxICsgc3RlcFkgLSBwcmV2aW91c1N0ZXBZOworICAgICAgICB9CisgICAgICAgIGZsb2F0IHYyID0gZm1heCgwLjBmLCBzdGVwWSAtIDAuNWYpIC8gYml0bWFwSGVpZ2h0OworCisgICAgICAgIGdlbmVyYXRlUm93KHZlcnRleCwgeTEsIHkyLCB2MSwgdjIsIHhEaXZzLCB3aWR0aCwgc3RyZXRjaFgsCisgICAgICAgICAgICAgICAgcmlnaHQgLSBsZWZ0LCBiaXRtYXBXaWR0aCk7CisKKyAgICAgICAgeTEgPSB5MjsKKyAgICAgICAgdjEgPSAoc3RlcFkgKyAwLjVmKSAvIGJpdG1hcEhlaWdodDsKKworICAgICAgICBwcmV2aW91c1N0ZXBZID0gc3RlcFk7CisgICAgfQorCisgICAgZ2VuZXJhdGVSb3codmVydGV4LCB5MSwgYm90dG9tIC0gdG9wLCB2MSwgMS4wZiwgeERpdnMsIHdpZHRoLCBzdHJldGNoWCwKKyAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCwgYml0bWFwV2lkdGgpOworfQorCitpbmxpbmUgdm9pZCBQYXRjaDo6Z2VuZXJhdGVSb3coVGV4dHVyZVZlcnRleComIHZlcnRleCwgZmxvYXQgeTEsIGZsb2F0IHkyLCBmbG9hdCB2MSwgZmxvYXQgdjIsCisgICAgICAgIGNvbnN0IGludDMyX3QgeERpdnNbXSwgdWludDMyX3QgeENvdW50LCBmbG9hdCBzdHJldGNoWCwgZmxvYXQgd2lkdGgsIGZsb2F0IGJpdG1hcFdpZHRoKSB7CisgICAgZmxvYXQgcHJldmlvdXNTdGVwWCA9IDAuMGY7CisKKyAgICBmbG9hdCB4MSA9IDAuMGY7CisgICAgZmxvYXQgdTEgPSAwLjBmOworCisgICAgLy8gR2VuZXJhdGUgdGhlIHJvdyBxdWFkIGJ5IHF1YWQKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgeENvdW50OyBpKyspIHsKKyAgICAgICAgZmxvYXQgc3RlcFggPSB4RGl2c1tpXTsKKworICAgICAgICBmbG9hdCB4MiA9IDAuMGY7CisgICAgICAgIGlmIChpICYgMSkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgc2VnbWVudCA9IHN0ZXBYIC0gcHJldmlvdXNTdGVwWDsKKyAgICAgICAgICAgIHgyID0geDEgKyBzZWdtZW50ICogc3RyZXRjaFg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4MiA9IHgxICsgc3RlcFggLSBwcmV2aW91c1N0ZXBYOworICAgICAgICB9CisgICAgICAgIGZsb2F0IHUyID0gZm1heCgwLjBmLCBzdGVwWCAtIDAuNWYpIC8gYml0bWFwV2lkdGg7CisKKyAgICAgICAgZ2VuZXJhdGVRdWFkKHZlcnRleCwgeDEsIHkxLCB4MiwgeTIsIHUxLCB2MSwgdTIsIHYyKTsKKworICAgICAgICB4MSA9IHgyOworICAgICAgICB1MSA9IChzdGVwWCArIDAuNWYpIC8gYml0bWFwV2lkdGg7CisKKyAgICAgICAgcHJldmlvdXNTdGVwWCA9IHN0ZXBYOworICAgIH0KKworICAgIGdlbmVyYXRlUXVhZCh2ZXJ0ZXgsIHgxLCB5MSwgd2lkdGgsIHkyLCB1MSwgdjEsIDEuMGYsIHYyKTsKK30KKworaW5saW5lIHZvaWQgUGF0Y2g6OmdlbmVyYXRlUXVhZChUZXh0dXJlVmVydGV4KiYgdmVydGV4LCBmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwKKyAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgdTIsIGZsb2F0IHYyKSB7CisgICAgLy8gTGVmdCB0cmlhbmdsZQorICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgrKywgeDEsIHkxLCB1MSwgdjEpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgrKywgeDIsIHkxLCB1MiwgdjEpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgrKywgeDEsIHkyLCB1MSwgdjIpOworCisgICAgLy8gUmlnaHQgdHJpYW5nbGUKKyAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4KyssIHgxLCB5MiwgdTEsIHYyKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4KyssIHgyLCB5MSwgdTIsIHYxKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4KyssIHgyLCB5MiwgdTIsIHYyKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0Y2guaCBiL2xpYnMvaHd1aS9QYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTA5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2guaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BBVENIX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QQVRDSF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaW5jbHVkZSAiVmVydGV4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBhIHBhdGNoLgorICovCitzdHJ1Y3QgUGF0Y2hEZXNjcmlwdGlvbiB7CisgICAgUGF0Y2hEZXNjcmlwdGlvbigpOiBiaXRtYXBXaWR0aCgwKSwgYml0bWFwSGVpZ2h0KDApLAorICAgICAgICAgICAgcGl4ZWxXaWR0aCgwKSwgcGl4ZWxIZWlnaHQoMCksIHhDb3VudCgwKSwgeUNvdW50KDApIHsgfQorICAgIFBhdGNoRGVzY3JpcHRpb24oY29uc3QgZmxvYXQgYml0bWFwV2lkdGgsIGNvbnN0IGZsb2F0IGJpdG1hcEhlaWdodCwKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHBpeGVsV2lkdGgsIGNvbnN0IGZsb2F0IHBpeGVsSGVpZ2h0LAorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgeENvdW50LCBjb25zdCB1aW50MzJfdCB5Q291bnQpOgorICAgICAgICAgICAgYml0bWFwV2lkdGgoYml0bWFwV2lkdGgpLCBiaXRtYXBIZWlnaHQoYml0bWFwSGVpZ2h0KSwKKyAgICAgICAgICAgIHBpeGVsV2lkdGgocGl4ZWxXaWR0aCksIHBpeGVsSGVpZ2h0KHBpeGVsSGVpZ2h0KSwKKyAgICAgICAgICAgIHhDb3VudCh4Q291bnQpLCB5Q291bnQoeUNvdW50KSB7IH0KKyAgICBQYXRjaERlc2NyaXB0aW9uKGNvbnN0IFBhdGNoRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKToKKyAgICAgICAgICAgIGJpdG1hcFdpZHRoKGRlc2NyaXB0aW9uLmJpdG1hcFdpZHRoKSwgYml0bWFwSGVpZ2h0KGRlc2NyaXB0aW9uLmJpdG1hcEhlaWdodCksCisgICAgICAgICAgICBwaXhlbFdpZHRoKGRlc2NyaXB0aW9uLnBpeGVsV2lkdGgpLCBwaXhlbEhlaWdodChkZXNjcmlwdGlvbi5waXhlbEhlaWdodCksCisgICAgICAgICAgICB4Q291bnQoZGVzY3JpcHRpb24ueENvdW50KSwgeUNvdW50KGRlc2NyaXB0aW9uLnlDb3VudCkgeyB9CisKKyAgICBmbG9hdCBiaXRtYXBXaWR0aDsKKyAgICBmbG9hdCBiaXRtYXBIZWlnaHQ7CisgICAgZmxvYXQgcGl4ZWxXaWR0aDsKKyAgICBmbG9hdCBwaXhlbEhlaWdodDsKKyAgICB1aW50MzJfdCB4Q291bnQ7CisgICAgdWludDMyX3QgeUNvdW50OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiYgcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtZW1jbXAodGhpcywgJnJocywgc2l6ZW9mKFBhdGNoRGVzY3JpcHRpb24pKSA8IDA7CisgICAgfQorfTsgLy8gc3RydWN0IFBhdGNoRGVzY3JpcHRpb24KKworLyoqCisgKiBBbiBPcGVuR0wgcGF0Y2guIFRoaXMgY29udGFpbnMgYW4gYXJyYXkgb2YgdmVydGljZXMgYW5kIGFuIGFycmF5IG9mCisgKiBpbmRpY2VzIHRvIHJlbmRlciB0aGUgdmVydGljZXMuCisgKi8KK3N0cnVjdCBQYXRjaCB7CisgICAgUGF0Y2goY29uc3QgdWludDMyX3QgeENvdW50LCBjb25zdCB1aW50MzJfdCB5Q291bnQpOworICAgIH5QYXRjaCgpOworCisgICAgdm9pZCB1cGRhdGVWZXJ0aWNlcyhjb25zdCBmbG9hdCBiaXRtYXBXaWR0aCwgY29uc3QgZmxvYXQgYml0bWFwSGVpZ2h0LAorICAgICAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgY29uc3QgaW50MzJfdCogeERpdnMsIGNvbnN0IGludDMyX3QqIHlEaXZzLAorICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgd2lkdGgsIGNvbnN0IHVpbnQzMl90IGhlaWdodCk7CisKKyAgICBUZXh0dXJlVmVydGV4KiB2ZXJ0aWNlczsKKyAgICB1aW50MzJfdCB2ZXJ0aWNlc0NvdW50OworCitwcml2YXRlOgorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBnZW5lcmF0ZVJvdyhUZXh0dXJlVmVydGV4KiYgdmVydGV4LCBmbG9hdCB5MSwgZmxvYXQgeTIsCisgICAgICAgICAgICBmbG9hdCB2MSwgZmxvYXQgdjIsIGNvbnN0IGludDMyX3QgeERpdnNbXSwgdWludDMyX3QgeENvdW50LAorICAgICAgICAgICAgZmxvYXQgc3RyZXRjaFgsIGZsb2F0IHdpZHRoLCBmbG9hdCBiaXRtYXBXaWR0aCk7CisgICAgc3RhdGljIGlubGluZSB2b2lkIGdlbmVyYXRlUXVhZChUZXh0dXJlVmVydGV4KiYgdmVydGV4LAorICAgICAgICAgICAgZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCisgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2Mik7Cit9OyAvLyBzdHJ1Y3QgUGF0Y2gKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BBVENIX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaENhY2hlLmNwcCBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2E1ZTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVzb3VyY2VUeXBlcy5oPgorCisjaW5jbHVkZSAiUGF0Y2hDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYXRjaENhY2hlOjpQYXRjaENhY2hlKCk6IG1NYXhFbnRyaWVzKERFRkFVTFRfUEFUQ0hfQ0FDSEVfU0laRSkgeworfQorCitQYXRjaENhY2hlOjpQYXRjaENhY2hlKHVpbnQzMl90IG1heEVudHJpZXMpOiBtTWF4RW50cmllcyhtYXhFbnRyaWVzKSB7Cit9CisKK1BhdGNoQ2FjaGU6On5QYXRjaENhY2hlKCkgeworICAgIGNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaENhY2hlOjpjbGVhcigpIHsKKyAgICBzaXplX3QgY291bnQgPSBtQ2FjaGUuc2l6ZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBkZWxldGUgbUNhY2hlLnZhbHVlQXQoaSk7CisgICAgfQorICAgIG1DYWNoZS5jbGVhcigpOworfQorCitQYXRjaCogUGF0Y2hDYWNoZTo6Z2V0KGNvbnN0IGZsb2F0IGJpdG1hcFdpZHRoLCBjb25zdCBmbG9hdCBiaXRtYXBIZWlnaHQsCisgICAgICAgIGNvbnN0IGZsb2F0IHBpeGVsV2lkdGgsIGNvbnN0IGZsb2F0IHBpeGVsSGVpZ2h0LAorICAgICAgICBjb25zdCBpbnQzMl90KiB4RGl2cywgY29uc3QgaW50MzJfdCogeURpdnMsCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoLCBjb25zdCB1aW50MzJfdCBoZWlnaHQpIHsKKworICAgIGNvbnN0IFBhdGNoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24oYml0bWFwV2lkdGgsIGJpdG1hcEhlaWdodCwKKyAgICAgICAgICAgIHBpeGVsV2lkdGgsIHBpeGVsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShkZXNjcmlwdGlvbik7CisgICAgUGF0Y2gqIG1lc2ggPSBOVUxMOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIG1lc2ggPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgaWYgKCFtZXNoKSB7CisgICAgICAgIFBBVENIX0xPR0QoIkNyZWF0aW5nIG5ldyBwYXRjaCBtZXNoLCB3PSVkIGg9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICBtZXNoID0gbmV3IFBhdGNoKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBtZXNoLT51cGRhdGVWZXJ0aWNlcyhiaXRtYXBXaWR0aCwgYml0bWFwSGVpZ2h0LCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgIHBpeGVsV2lkdGgsIHBpeGVsSGVpZ2h0LCB4RGl2cywgeURpdnMsIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgIGlmIChtQ2FjaGUuc2l6ZSgpID49IG1NYXhFbnRyaWVzKSB7CisgICAgICAgICAgICBkZWxldGUgbUNhY2hlLnZhbHVlQXQobUNhY2hlLnNpemUoKSAtIDEpOworICAgICAgICAgICAgbUNhY2hlLnJlbW92ZUl0ZW1zQXQobUNhY2hlLnNpemUoKSAtIDEsIDEpOworICAgICAgICB9CisKKyAgICAgICAgbUNhY2hlLmFkZChkZXNjcmlwdGlvbiwgbWVzaCk7CisgICAgfQorCisgICAgcmV0dXJuIG1lc2g7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoQ2FjaGUuaCBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmNzhhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QQVRDSF9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgIlBhdGNoLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBEZWJ1ZworI2RlZmluZSBERUJVR19QQVRDSEVTIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19QQVRDSEVTCisgICAgI2RlZmluZSBQQVRDSF9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBQQVRDSF9MT0dEKC4uLikKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBQYXRjaENhY2hlIHsKK3B1YmxpYzoKKyAgICBQYXRjaENhY2hlKCk7CisgICAgUGF0Y2hDYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk7CisgICAgflBhdGNoQ2FjaGUoKTsKKworICAgIFBhdGNoKiBnZXQoY29uc3QgZmxvYXQgYml0bWFwV2lkdGgsIGNvbnN0IGZsb2F0IGJpdG1hcEhlaWdodCwKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHBpeGVsV2lkdGgsIGNvbnN0IGZsb2F0IHBpeGVsSGVpZ2h0LAorICAgICAgICAgICAgY29uc3QgaW50MzJfdCogeERpdnMsIGNvbnN0IGludDMyX3QqIHlEaXZzLAorICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgd2lkdGgsIGNvbnN0IHVpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1NYXhFbnRyaWVzOworICAgIEtleWVkVmVjdG9yPFBhdGNoRGVzY3JpcHRpb24sIFBhdGNoKj4gbUNhY2hlOworfTsgLy8gY2xhc3MgUGF0Y2hDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGhDYWNoZS5jcHAgYi9saWJzL2h3dWkvUGF0aENhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzc3MjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGhDYWNoZS5jcHAKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrUmVjdC5oPgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCisjaW5jbHVkZSAiUGF0aENhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGhDYWNoZTo6UGF0aENhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8UGF0aENhY2hlRW50cnksIFBhdGhUZXh0dXJlKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShNQihERUZBVUxUX1BBVEhfQ0FDSEVfU0laRSkpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9QQVRIX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHBhdGggY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBzZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHBhdGggY2FjaGUgc2l6ZSBvZiAlLjJmTUIiLCBERUZBVUxUX1BBVEhfQ0FDSEVfU0laRSk7CisgICAgfQorICAgIGluaXQoKTsKK30KKworUGF0aENhY2hlOjpQYXRoQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKKyAgICBpbml0KCk7Cit9CisKK1BhdGhDYWNoZTo6flBhdGhDYWNoZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFBhdGhDYWNoZTo6aW5pdCgpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKworICAgIEdMaW50IG1heFRleHR1cmVTaXplOworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJm1heFRleHR1cmVTaXplKTsKKyAgICBtTWF4VGV4dHVyZVNpemUgPSBtYXhUZXh0dXJlU2l6ZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IFBhdGhDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIFBhdGhDYWNoZTo6c2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FsbGJhY2tzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0aENhY2hlOjpvcGVyYXRvcigpKFBhdGhDYWNoZUVudHJ5JiBwYXRoLCBQYXRoVGV4dHVyZSomIHRleHR1cmUpIHsKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gdGV4dHVyZS0+d2lkdGggKiB0ZXh0dXJlLT5oZWlnaHQ7CisgICAgbVNpemUgLT0gc2l6ZTsKKworICAgIGlmICh0ZXh0dXJlKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICAgICAgZGVsZXRlIHRleHR1cmU7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0aENhY2hlOjpyZW1vdmUoU2tQYXRoKiBwYXRoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBUT0RPOiBMaW5lYXIgc2VhcmNoLi4uCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUNhY2hlLmdldEtleUF0KGkpLnBhdGggPT0gcGF0aCkgeworICAgICAgICAgICAgbUNhY2hlLnJlbW92ZUF0KGkpOworICAgICAgICB9CisgICAgfQorfQorCitQYXRoVGV4dHVyZSogUGF0aENhY2hlOjpnZXQoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgIFBhdGhDYWNoZUVudHJ5IGVudHJ5KHBhdGgsIHBhaW50KTsKKworICAgIG1Mb2NrLmxvY2soKTsKKyAgICBQYXRoVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZS5nZXQoZW50cnkpOworICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIHRleHR1cmUgPSBhZGRUZXh0dXJlKGVudHJ5LCBwYXRoLCBwYWludCk7CisgICAgfSBlbHNlIGlmIChwYXRoLT5nZXRHZW5lcmF0aW9uSUQoKSAhPSB0ZXh0dXJlLT5nZW5lcmF0aW9uKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbUNhY2hlLnJlbW92ZShlbnRyeSk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB0ZXh0dXJlID0gYWRkVGV4dHVyZShlbnRyeSwgcGF0aCwgcGFpbnQpOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCitQYXRoVGV4dHVyZSogUGF0aENhY2hlOjphZGRUZXh0dXJlKGNvbnN0IFBhdGhDYWNoZUVudHJ5JiBlbnRyeSwKKyAgICAgICAgY29uc3QgU2tQYXRoICpwYXRoLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IFNrUmVjdCYgYm91bmRzID0gcGF0aC0+Z2V0Qm91bmRzKCk7CisKKyAgICBjb25zdCBmbG9hdCBwYXRoV2lkdGggPSBmbWF4KGJvdW5kcy53aWR0aCgpLCAxLjBmKTsKKyAgICBjb25zdCBmbG9hdCBwYXRoSGVpZ2h0ID0gZm1heChib3VuZHMuaGVpZ2h0KCksIDEuMGYpOworCisgICAgaWYgKHBhdGhXaWR0aCA+IG1NYXhUZXh0dXJlU2l6ZSB8fCBwYXRoSGVpZ2h0ID4gbU1heFRleHR1cmVTaXplKSB7CisgICAgICAgIExPR1coIlBhdGggdG9vIGxhcmdlIHRvIGJlIHJlbmRlcmVkIGludG8gYSB0ZXh0dXJlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IGZsb2F0IG9mZnNldCA9IGVudHJ5LnN0cm9rZVdpZHRoICogMS41ZjsKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IHVpbnQzMl90KHBhdGhXaWR0aCArIG9mZnNldCAqIDIuMCArIDAuNSk7CisgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gdWludDMyX3QocGF0aEhlaWdodCArIG9mZnNldCAqIDIuMCArIDAuNSk7CisKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgLy8gRG9uJ3QgZXZlbiB0cnkgdG8gY2FjaGUgYSBiaXRtYXAgdGhhdCdzIGJpZ2dlciB0aGFuIHRoZSBjYWNoZQorICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB3aGlsZSAobVNpemUgKyBzaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgfQorICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICBQYXRoVGV4dHVyZSogdGV4dHVyZSA9IG5ldyBQYXRoVGV4dHVyZTsKKyAgICB0ZXh0dXJlLT5sZWZ0ID0gYm91bmRzLmZMZWZ0OworICAgIHRleHR1cmUtPnRvcCA9IGJvdW5kcy5mVG9wOworICAgIHRleHR1cmUtPm9mZnNldCA9IG9mZnNldDsKKyAgICB0ZXh0dXJlLT53aWR0aCA9IHdpZHRoOworICAgIHRleHR1cmUtPmhlaWdodCA9IGhlaWdodDsKKyAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gcGF0aC0+Z2V0R2VuZXJhdGlvbklEKCk7CisKKyAgICBTa0JpdG1hcCBiaXRtYXA7CisgICAgYml0bWFwLnNldENvbmZpZyhTa0JpdG1hcDo6a0E4X0NvbmZpZywgd2lkdGgsIGhlaWdodCk7CisgICAgYml0bWFwLmFsbG9jUGl4ZWxzKCk7CisgICAgYml0bWFwLmVyYXNlQ29sb3IoMCk7CisKKyAgICBTa0NhbnZhcyBjYW52YXMoYml0bWFwKTsKKyAgICBjYW52YXMudHJhbnNsYXRlKC1ib3VuZHMuZkxlZnQgKyBvZmZzZXQsIC1ib3VuZHMuZlRvcCArIG9mZnNldCk7CisgICAgY2FudmFzLmRyYXdQYXRoKCpwYXRoLCAqcGFpbnQpOworCisgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSk7CisKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbVNpemUgKz0gc2l6ZTsKKyAgICAgICAgbUNhY2hlLnB1dChlbnRyeSwgdGV4dHVyZSk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRleHR1cmUtPmNsZWFudXAgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCit2b2lkIFBhdGhDYWNoZTo6Y2xlYXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBQYXRoQ2FjaGU6OmdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCYgYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlKSB7CisgICAgU2tBdXRvTG9ja1BpeGVscyBhbHAoYml0bWFwKTsKKyAgICBpZiAoIWJpdG1hcC5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gYml0bWFwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUtPmlkKTsKKyAgICAvLyBUZXh0dXJlcyBhcmUgQWxwaGE4CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKworICAgIHRleHR1cmUtPmJsZW5kID0gdHJ1ZTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQUxQSEEsIHRleHR1cmUtPndpZHRoLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgYml0bWFwLmdldFBpeGVscygpKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0aENhY2hlLmggYi9saWJzL2h3dWkvUGF0aENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2ZGZhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QQVRIX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QQVRIX0NBQ0hFX0gKKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisjaW5jbHVkZSA8U2tQYWludC5oPgorI2luY2x1ZGUgPFNrUGF0aC5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgInV0aWxzL0dlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGVzY3JpYmUgYSBwYXRoIGluIHRoZSBwYXRoIGNhY2hlLgorICovCitzdHJ1Y3QgUGF0aENhY2hlRW50cnkgeworICAgIFBhdGhDYWNoZUVudHJ5KCkgeworICAgICAgICBwYXRoID0gTlVMTDsKKyAgICAgICAgam9pbiA9IFNrUGFpbnQ6OmtEZWZhdWx0X0pvaW47CisgICAgICAgIGNhcCA9IFNrUGFpbnQ6OmtEZWZhdWx0X0NhcDsKKyAgICAgICAgc3R5bGUgPSBTa1BhaW50OjprRmlsbF9TdHlsZTsKKyAgICAgICAgbWl0ZXIgPSA0LjBmOworICAgICAgICBzdHJva2VXaWR0aCA9IDEuMGY7CisgICAgfQorCisgICAgUGF0aENhY2hlRW50cnkoY29uc3QgUGF0aENhY2hlRW50cnkmIGVudHJ5KToKKyAgICAgICAgcGF0aChlbnRyeS5wYXRoKSwgam9pbihlbnRyeS5qb2luKSwgY2FwKGVudHJ5LmNhcCksCisgICAgICAgIHN0eWxlKGVudHJ5LnN0eWxlKSwgbWl0ZXIoZW50cnkubWl0ZXIpLAorICAgICAgICBzdHJva2VXaWR0aChlbnRyeS5zdHJva2VXaWR0aCkgeworICAgIH0KKworICAgIFBhdGhDYWNoZUVudHJ5KFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgdGhpcy0+cGF0aCA9IHBhdGg7CisgICAgICAgIGpvaW4gPSBwYWludC0+Z2V0U3Ryb2tlSm9pbigpOworICAgICAgICBjYXAgPSBwYWludC0+Z2V0U3Ryb2tlQ2FwKCk7CisgICAgICAgIG1pdGVyID0gcGFpbnQtPmdldFN0cm9rZU1pdGVyKCk7CisgICAgICAgIHN0cm9rZVdpZHRoID0gcGFpbnQtPmdldFN0cm9rZVdpZHRoKCk7CisgICAgICAgIHN0eWxlID0gcGFpbnQtPmdldFN0eWxlKCk7CisgICAgfQorCisgICAgU2tQYXRoKiBwYXRoOworICAgIFNrUGFpbnQ6OkpvaW4gam9pbjsKKyAgICBTa1BhaW50OjpDYXAgY2FwOworICAgIFNrUGFpbnQ6OlN0eWxlIHN0eWxlOworICAgIGZsb2F0IG1pdGVyOworICAgIGZsb2F0IHN0cm9rZVdpZHRoOworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUGF0aENhY2hlRW50cnkmIHJocykgY29uc3QgeworICAgICAgICByZXR1cm4gbWVtY21wKHRoaXMsICZyaHMsIHNpemVvZihQYXRoQ2FjaGVFbnRyeSkpIDwgMDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgUGF0aENhY2hlRW50cnkKKworLyoqCisgKiBBbHBoYSB0ZXh0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcGF0aC4KKyAqLworc3RydWN0IFBhdGhUZXh0dXJlOiBwdWJsaWMgVGV4dHVyZSB7CisgICAgUGF0aFRleHR1cmUoKTogVGV4dHVyZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHBhdGggYm91bmRzLgorICAgICAqLworICAgIGZsb2F0IGxlZnQ7CisgICAgLyoqCisgICAgICogVG9wIGNvb3JkaW5hdGUgb2YgdGhlIHBhdGggYm91bmRzLgorICAgICAqLworICAgIGZsb2F0IHRvcDsKKyAgICAvKioKKyAgICAgKiBPZmZzZXQgdG8gZHJhdyB0aGUgcGF0aCBhdCB0aGUgY29ycmVjdCBvcmlnaW4uCisgICAgICovCisgICAgZmxvYXQgb2Zmc2V0OworfTsgLy8gc3RydWN0IFBhdGhUZXh0dXJlCisKKy8qKgorICogQSBzaW1wbGUgTFJVIHBhdGggY2FjaGUuIFRoZSBjYWNoZSBoYXMgYSBtYXhpbXVtIHNpemUgZXhwcmVzc2VkIGluIGJ5dGVzLgorICogQW55IHRleHR1cmUgYWRkZWQgdG8gdGhlIGNhY2hlIGNhdXNpbmcgdGhlIGNhY2hlIHRvIGdyb3cgYmV5b25kIHRoZSBtYXhpbXVtCisgKiBhbGxvd2VkIHNpemUgd2lsbCBhbHNvIGNhdXNlIHRoZSBvbGRlc3QgdGV4dHVyZSB0byBiZSBraWNrZWQgb3V0LgorICovCitjbGFzcyBQYXRoQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxQYXRoQ2FjaGVFbnRyeSwgUGF0aFRleHR1cmUqPiB7CitwdWJsaWM6CisgICAgUGF0aENhY2hlKCk7CisgICAgUGF0aENhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKTsKKyAgICB+UGF0aENhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIERvIG5vdCBpbnZva2UgZGlyZWN0bHkuCisgICAgICovCisgICAgdm9pZCBvcGVyYXRvcigpKFBhdGhDYWNoZUVudHJ5JiBwYXRoLCBQYXRoVGV4dHVyZSomIHRleHR1cmUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoLiBJZiB0aGUgdGV4dHVyZQorICAgICAqIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY2FjaGUsIGEgbmV3IHRleHR1cmUgaXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIFBhdGhUZXh0dXJlKiBnZXQoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCk7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYW4gZW50cnkuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tQYXRoKiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgdGV4dHVyZSBmcm9tIGEgYml0bWFwIGludG8gdGhlIHNwZWNpZmllZCB0ZXh0dXJlIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICB2b2lkIGdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCYgYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlKTsKKworICAgIFBhdGhUZXh0dXJlKiBhZGRUZXh0dXJlKGNvbnN0IFBhdGhDYWNoZUVudHJ5JiBlbnRyeSwgY29uc3QgU2tQYXRoICpwYXRoLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisKKyAgICB2b2lkIGluaXQoKTsKKworICAgIEdlbmVyYXRpb25DYWNoZTxQYXRoQ2FjaGVFbnRyeSwgUGF0aFRleHR1cmUqPiBtQ2FjaGU7CisKKyAgICB1aW50MzJfdCBtU2l6ZTsKKyAgICB1aW50MzJfdCBtTWF4U2l6ZTsKKyAgICBHTHVpbnQgbU1heFRleHR1cmVTaXplOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBhY2Nlc3MgbUNhY2hlIGFuZCBtU2l6ZS4gQWxsIG1ldGhvZHMgYXJlIGFjY2Vzc2VkIGZyb20gYSBzaW5nbGUKKyAgICAgKiB0aHJlYWQgZXhjZXB0IGZvciByZW1vdmUoKS4KKyAgICAgKi8KKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworfTsgLy8gY2xhc3MgUGF0aENhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QQVRIX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcCBiL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTFiOWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb2dyYW0uY3BwCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgIlByb2dyYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaGFkZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgU0hBREVSX1NPVVJDRShuYW1lLCBzb3VyY2UpIGNvbnN0IGNoYXIqIG5hbWUgPSAjc291cmNlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2UgcHJvZ3JhbQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtOjpQcm9ncmFtKGNvbnN0IGNoYXIqIHZlcnRleCwgY29uc3QgY2hhciogZnJhZ21lbnQpIHsKKyAgICB2ZXJ0ZXhTaGFkZXIgPSBidWlsZFNoYWRlcih2ZXJ0ZXgsIEdMX1ZFUlRFWF9TSEFERVIpOworICAgIGZyYWdtZW50U2hhZGVyID0gYnVpbGRTaGFkZXIoZnJhZ21lbnQsIEdMX0ZSQUdNRU5UX1NIQURFUik7CisKKyAgICBpZCA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIGdsQXR0YWNoU2hhZGVyKGlkLCB2ZXJ0ZXhTaGFkZXIpOworICAgIGdsQXR0YWNoU2hhZGVyKGlkLCBmcmFnbWVudFNoYWRlcik7CisgICAgZ2xMaW5rUHJvZ3JhbShpZCk7CisKKyAgICBHTGludCBzdGF0dXM7CisgICAgZ2xHZXRQcm9ncmFtaXYoaWQsIEdMX0xJTktfU1RBVFVTLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IEdMX1RSVUUpIHsKKyAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7CisgICAgICAgIGdsR2V0UHJvZ3JhbWl2KGlkLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKKyAgICAgICAgaWYgKGluZm9MZW4gPiAxKSB7CisgICAgICAgICAgICBHTGNoYXIgbG9nW2luZm9MZW5dOworICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhpZCwgaW5mb0xlbiwgMCwgJmxvZ1swXSk7CisgICAgICAgICAgICBMT0dFKCJFcnJvciB3aGlsZSBsaW5raW5nIHNoYWRlcnM6ICVzIiwgbG9nKTsKKyAgICAgICAgfQorICAgICAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgICAgICBnbERlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CisgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShpZCk7CisgICAgfQorCisgICAgbVVzZSA9IGZhbHNlOworCisgICAgcG9zaXRpb24gPSBhZGRBdHRyaWIoInBvc2l0aW9uIik7CisgICAgY29sb3IgPSBhZGRVbmlmb3JtKCJjb2xvciIpOworICAgIHRyYW5zZm9ybSA9IGFkZFVuaWZvcm0oInRyYW5zZm9ybSIpOworfQorCitQcm9ncmFtOjp+UHJvZ3JhbSgpIHsKKyAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICBnbERlbGV0ZVByb2dyYW0oaWQpOworfQorCitpbnQgUHJvZ3JhbTo6YWRkQXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgc2xvdCA9IGdsR2V0QXR0cmliTG9jYXRpb24oaWQsIG5hbWUpOworICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWUsIHNsb3QpOworICAgIHJldHVybiBzbG90OworfQorCitpbnQgUHJvZ3JhbTo6Z2V0QXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gYXR0cmlidXRlcy5pbmRleE9mS2V5KG5hbWUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gYWRkQXR0cmliKG5hbWUpOworfQorCitpbnQgUHJvZ3JhbTo6YWRkVW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgaW50IHNsb3QgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihpZCwgbmFtZSk7CisgICAgdW5pZm9ybXMuYWRkKG5hbWUsIHNsb3QpOworICAgIHJldHVybiBzbG90OworfQorCitpbnQgUHJvZ3JhbTo6Z2V0VW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgc3NpemVfdCBpbmRleCA9IHVuaWZvcm1zLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIHVuaWZvcm1zLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gYWRkVW5pZm9ybShuYW1lKTsKK30KKworR0x1aW50IFByb2dyYW06OmJ1aWxkU2hhZGVyKGNvbnN0IGNoYXIqIHNvdXJjZSwgR0xlbnVtIHR5cGUpIHsKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmc291cmNlLCAwKTsKKyAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKworICAgIEdMaW50IHN0YXR1czsKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICAvLyBTb21lIGRyaXZlcnMgcmV0dXJuIHdyb25nIHZhbHVlcyBmb3IgR0xfSU5GT19MT0dfTEVOR1RICisgICAgICAgIC8vIHVzZSBhIGZpeGVkIHNpemUgaW5zdGVhZAorICAgICAgICBHTGNoYXIgbG9nWzUxMl07CisgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIHNpemVvZihsb2cpLCAwLCAmbG9nWzBdKTsKKyAgICAgICAgTE9HRSgiRXJyb3Igd2hpbGUgY29tcGlsaW5nIHNoYWRlcjogJXMiLCBsb2cpOworICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgIH0KKworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6c2V0KGNvbnN0IG1hdDQmIHByb2plY3Rpb25NYXRyaXgsIGNvbnN0IG1hdDQmIG1vZGVsVmlld01hdHJpeCwKKyAgICAgICAgY29uc3QgbWF0NCYgdHJhbnNmb3JtTWF0cml4KSB7CisgICAgbWF0NCB0KHByb2plY3Rpb25NYXRyaXgpOworICAgIHQubXVsdGlwbHkodHJhbnNmb3JtTWF0cml4KTsKKyAgICB0Lm11bHRpcGx5KG1vZGVsVmlld01hdHJpeCk7CisKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYodHJhbnNmb3JtLCAxLCBHTF9GQUxTRSwgJnQuZGF0YVswXSk7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6dXNlKCkgeworICAgIGdsVXNlUHJvZ3JhbShpZCk7CisgICAgbVVzZSA9IHRydWU7CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKTsKK30KKwordm9pZCBQcm9ncmFtOjpyZW1vdmUoKSB7CisgICAgbVVzZSA9IGZhbHNlOworCisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtLmggYi9saWJzL2h3dWkvUHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzFjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BST0dSQU1fSAorI2RlZmluZSBBTkRST0lEX1VJX1BST0dSQU1fSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBBIHByb2dyYW0gaG9sZHMgYSB2ZXJ0ZXggYW5kIGEgZnJhZ21lbnQgc2hhZGVyLiBJdCBvZmZlcnMgc2V2ZXJhbCB1dGlsaXR5CisgKiBtZXRob2RzIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zLgorICovCitjbGFzcyBQcm9ncmFtIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIHZlcnRleCBhbmQgZnJhZ21lbnQKKyAgICAgKiBzaGFkZXJzIHNvdXJjZXMuCisgICAgICovCisgICAgUHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KTsKKyAgICB2aXJ0dWFsIH5Qcm9ncmFtKCk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGlzIHByb2dyYW0gdG8gdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHVzZSgpOworCisgICAgLyoqCisgICAgICogTWFya3MgdGhpcyBwcm9ncmFtIGFzIHVudXNlZC4gVGhpcyB3aWxsIG5vdCB1bmJpbmQKKyAgICAgKiB0aGUgcHJvZ3JhbSBmcm9tIHRoZSBHTCBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCByZW1vdmUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgorICAgICAqLworICAgIGludCBnZXRBdHRyaWIoY29uc3QgY2hhciogbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIHVuaWZvcm0uCisgICAgICovCisgICAgaW50IGdldFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHByb2dyYW0gaXMgY3VycmVudGx5IGluIHVzZSB3aXRoCisgICAgICogdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNJblVzZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Vc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgdGhlIHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIHByb2plY3Rpb24sIG1vZGVsVmlldyBhbmQKKyAgICAgKiB0cmFuc2Zvcm0gbWF0cmljZXMuCisgICAgICovCisgICAgdm9pZCBzZXQoY29uc3QgbWF0NCYgcHJvamVjdGlvbk1hdHJpeCwgY29uc3QgbWF0NCYgbW9kZWxWaWV3TWF0cml4LAorICAgICAgICAgICAgIGNvbnN0IG1hdDQmIHRyYW5zZm9ybU1hdHJpeCk7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBwb3NpdGlvbiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IHBvc2l0aW9uOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgY29sb3IgdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgY29sb3I7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB0cmFuc2Zvcm0gdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgdHJhbnNmb3JtOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogQWRkcyBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIGludCBhZGRBdHRyaWIoY29uc3QgY2hhciogbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgdW5pZm9ybSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIE9wZW5HTCBuYW1lIG9mIHRoZSB1bmlmb3JtLgorICAgICAqLworICAgIGludCBhZGRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbXBpbGVzIHRoZSBzcGVjaWZpZWQgc2hhZGVyIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVkIHNoYWRlci4KKyAgICAgKi8KKyAgICBHTHVpbnQgYnVpbGRTaGFkZXIoY29uc3QgY2hhciogc291cmNlLCBHTGVudW0gdHlwZSk7CisKKyAgICAvLyBOYW1lIG9mIHRoZSBPcGVuR0wgcHJvZ3JhbQorICAgIEdMdWludCBpZDsKKworICAgIC8vIE5hbWUgb2YgdGhlIHNoYWRlcnMKKyAgICBHTHVpbnQgdmVydGV4U2hhZGVyOworICAgIEdMdWludCBmcmFnbWVudFNoYWRlcjsKKworICAgIC8vIEtlZXBzIHRyYWNrIG9mIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zIHNsb3RzCisgICAgS2V5ZWRWZWN0b3I8Y29uc3QgY2hhciosIGludD4gYXR0cmlidXRlczsKKyAgICBLZXllZFZlY3Rvcjxjb25zdCBjaGFyKiwgaW50PiB1bmlmb3JtczsKKworICAgIGJvb2wgbVVzZTsKK307IC8vIGNsYXNzIFByb2dyYW0KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BST0dSQU1fSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5jcHAgYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzllNmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5jcHAKQEAgLTAsMCArMSw0ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmVydGV4IHNoYWRlcnMgc25pcHBldHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzID0KKyAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IHBvc2l0aW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfQXR0cmlidXRlc19UZXhDb29yZHMgPQorICAgICAgICAiYXR0cmlidXRlIHZlYzIgdGV4Q29vcmRzO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXMgPQorICAgICAgICAidW5pZm9ybSBtYXQ0IHRyYW5zZm9ybTtcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0dyYWRpZW50WzNdID0geworICAgICAgICAvLyBMaW5lYXIKKyAgICAgICAgInVuaWZvcm0gbWF0NCBzY3JlZW5TcGFjZTtcbiIsCisgICAgICAgIC8vIENpcmN1bGFyCisgICAgICAgICJ1bmlmb3JtIG1hdDQgc2NyZWVuU3BhY2U7XG4iLAorICAgICAgICAvLyBTd2VlcAorICAgICAgICAidW5pZm9ybSBtYXQ0IHNjcmVlblNwYWNlO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzQml0bWFwID0KKyAgICAgICAgInVuaWZvcm0gbWF0NCB0ZXh0dXJlVHJhbnNmb3JtO1xuIgorICAgICAgICAidW5pZm9ybSB2ZWMyIHRleHR1cmVEaW1lbnNpb247XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNUZXh0dXJlID0KKyAgICAgICAgInZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNCaXRtYXAgPQorICAgICAgICAidmFyeWluZyB2ZWMyIG91dEJpdG1hcFRleENvb3JkcztcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50WzNdID0geworICAgICAgICAvLyBMaW5lYXIKKyAgICAgICAgInZhcnlpbmcgZmxvYXQgaW5kZXg7XG4iLAorICAgICAgICAvLyBDaXJjdWxhcgorICAgICAgICAidmFyeWluZyB2ZWMyIGNpcmN1bGFyO1xuIiwKKyAgICAgICAgLy8gU3dlZXAKKyAgICAgICAgInZhcnlpbmcgdmVjMiBzd2VlcDtcbiIKK307Citjb25zdCBjaGFyKiBnVlNfTWFpbiA9CisgICAgICAgICJcbnZvaWQgbWFpbih2b2lkKSB7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fT3V0VGV4Q29vcmRzID0KKyAgICAgICAgIiAgICBvdXRUZXhDb29yZHMgPSB0ZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fT3V0R3JhZGllbnRbM10gPSB7CisgICAgICAgIC8vIExpbmVhcgorICAgICAgICAiICAgIGluZGV4ID0gKHNjcmVlblNwYWNlICogcG9zaXRpb24pLng7XG4iLAorICAgICAgICAvLyBDaXJjdWxhcgorICAgICAgICAiICAgIGNpcmN1bGFyID0gKHNjcmVlblNwYWNlICogcG9zaXRpb24pLnh5O1xuIiwKKyAgICAgICAgLy8gU3dlZXAKKyAgICAgICAgIiAgICBzd2VlcCA9IChzY3JlZW5TcGFjZSAqIHBvc2l0aW9uKS54eTtcbiIKK307Citjb25zdCBjaGFyKiBnVlNfTWFpbl9PdXRCaXRtYXBUZXhDb29yZHMgPQorICAgICAgICAiICAgIHZlYzQgYml0bWFwQ29vcmRzID0gdGV4dHVyZVRyYW5zZm9ybSAqIHBvc2l0aW9uO1xuIgorICAgICAgICAiICAgIG91dEJpdG1hcFRleENvb3JkcyA9IGJpdG1hcENvb3Jkcy54eSAqIHRleHR1cmVEaW1lbnNpb247XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fUG9zaXRpb24gPQorICAgICAgICAiICAgIGdsX1Bvc2l0aW9uID0gdHJhbnNmb3JtICogcG9zaXRpb247XG4iOworY29uc3QgY2hhciogZ1ZTX0Zvb3RlciA9CisgICAgICAgICJ9XG5cbiI7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZyYWdtZW50IHNoYWRlcnMgc25pcHBldHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY29uc3QgY2hhciogZ0ZTX0hlYWRlcl9FeHRlbnNpb25fRnJhbWVidWZmZXJGZXRjaCA9CisgICAgICAgICIjZXh0ZW5zaW9uIEdMX05WX3NoYWRlcl9mcmFtZWJ1ZmZlcl9mZXRjaCA6IGVuYWJsZVxuXG4iOworY29uc3QgY2hhciogZ0ZTX0hlYWRlciA9CisgICAgICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19Db2xvciA9CisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3I7XG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX1RleHR1cmVTYW1wbGVyID0KKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIHNhbXBsZXI7XG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX0dyYWRpZW50U2FtcGxlclszXSA9IHsKKyAgICAgICAgLy8gTGluZWFyCisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudFNhbXBsZXI7XG4iLAorICAgICAgICAvLyBDaXJjdWxhcgorICAgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRTYW1wbGVyO1xuIiwKKyAgICAgICAgLy8gU3dlZXAKKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50U2FtcGxlcjtcbiIKK307Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfQml0bWFwU2FtcGxlciA9CisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBiaXRtYXBTYW1wbGVyO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19Db2xvck9wWzRdID0geworICAgICAgICAvLyBOb25lCisgICAgICAgICIiLAorICAgICAgICAvLyBNYXRyaXgKKyAgICAgICAgInVuaWZvcm0gbWF0NCBjb2xvck1hdHJpeDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvck1hdHJpeFZlY3RvcjtcbiIsCisgICAgICAgIC8vIExpZ2h0aW5nCisgICAgICAgICJ1bmlmb3JtIHZlYzQgbGlnaHRpbmdNdWw7XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzQgbGlnaHRpbmdBZGQ7XG4iLAorICAgICAgICAvLyBQb3J0ZXJEdWZmCisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3JCbGVuZDtcbiIKK307Citjb25zdCBjaGFyKiBnRlNfTWFpbiA9CisgICAgICAgICJcbnZvaWQgbWFpbih2b2lkKSB7XG4iCisgICAgICAgICIgICAgbG93cCB2ZWM0IGZyYWdDb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaENvbG9yID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBjb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaFRleHR1cmUgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGNvbG9yICogdGV4dHVyZTJEKHNhbXBsZXIsIG91dFRleENvb3Jkcyk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hBOFRleHR1cmUgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGNvbG9yICogdGV4dHVyZTJEKHNhbXBsZXIsIG91dFRleENvb3JkcykuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEdyYWRpZW50WzNdID0geworICAgICAgICAvLyBMaW5lYXIKKyAgICAgICAgIiAgICB2ZWM0IGdyYWRpZW50Q29sb3IgPSB0ZXh0dXJlMkQoZ3JhZGllbnRTYW1wbGVyLCB2ZWMyKGluZGV4LCAwLjUpKTtcbiIsCisgICAgICAgIC8vIENpcmN1bGFyCisgICAgICAgICIgICAgZmxvYXQgaW5kZXggPSBsZW5ndGgoY2lyY3VsYXIpO1xuIgorICAgICAgICAiICAgIHZlYzQgZ3JhZGllbnRDb2xvciA9IHRleHR1cmUyRChncmFkaWVudFNhbXBsZXIsIHZlYzIoaW5kZXgsIDAuNSkpO1xuIiwKKyAgICAgICAgLy8gU3dlZXAKKyAgICAgICAgIiAgICBmbG9hdCBpbmRleCA9IGF0YW4oc3dlZXAueSwgc3dlZXAueCkgKiAwLjE1OTE1NDk0MzA5OyAvLyBpbnYoMiAqIFBJKVxuIgorICAgICAgICAiICAgIHZlYzQgZ3JhZGllbnRDb2xvciA9IHRleHR1cmUyRChncmFkaWVudFNhbXBsZXIsIHZlYzIoaW5kZXggLSBmbG9vcihpbmRleCksIDAuNSkpO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQml0bWFwID0KKyAgICAgICAgIiAgICB2ZWM0IGJpdG1hcENvbG9yID0gdGV4dHVyZTJEKGJpdG1hcFNhbXBsZXIsIG91dEJpdG1hcFRleENvb3Jkcyk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hCaXRtYXBOcG90ID0KKyAgICAgICAgIiAgICB2ZWM0IGJpdG1hcENvbG9yID0gdGV4dHVyZTJEKGJpdG1hcFNhbXBsZXIsIHdyYXAob3V0Qml0bWFwVGV4Q29vcmRzKSk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fQmxlbmRTaGFkZXJzQkcgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGJsZW5kU2hhZGVycyhncmFkaWVudENvbG9yLCBiaXRtYXBDb2xvcikiOworY29uc3QgY2hhciogZ0ZTX01haW5fQmxlbmRTaGFkZXJzR0IgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGJsZW5kU2hhZGVycyhiaXRtYXBDb2xvciwgZ3JhZGllbnRDb2xvcikiOworY29uc3QgY2hhciogZ0ZTX01haW5fQmxlbmRTaGFkZXJzX01vZHVsYXRlID0KKyAgICAgICAgIiAqIGZyYWdDb2xvci5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0dyYWRpZW50U2hhZGVyX01vZHVsYXRlID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBncmFkaWVudENvbG9yICogZnJhZ0NvbG9yLmE7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fQml0bWFwU2hhZGVyX01vZHVsYXRlID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBiaXRtYXBDb2xvciAqIGZyYWdDb2xvci5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZyYWdDb2xvciA9CisgICAgICAgICIgICAgZ2xfRnJhZ0NvbG9yID0gZnJhZ0NvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZyYWdDb2xvcl9CbGVuZCA9CisgICAgICAgICIgICAgZ2xfRnJhZ0NvbG9yID0gYmxlbmRGcmFtZWJ1ZmZlcihmcmFnQ29sb3IsIGdsX0xhc3RGcmFnQ29sb3IpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZyYWdDb2xvcl9CbGVuZF9Td2FwID0KKyAgICAgICAgIiAgICBnbF9GcmFnQ29sb3IgPSBibGVuZEZyYW1lYnVmZmVyKGdsX0xhc3RGcmFnQ29sb3IsIGZyYWdDb2xvcik7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fQXBwbHlDb2xvck9wWzRdID0geworICAgICAgICAvLyBOb25lCisgICAgICAgICIiLAorICAgICAgICAvLyBNYXRyaXgKKyAgICAgICAgLy8gVE9ETzogRml4IHByZW11bHRpcGxpZWQgYWxwaGEgY29tcHV0YXRpb25zIGZvciBjb2xvciBtYXRyaXgKKyAgICAgICAgIiAgICBmcmFnQ29sb3IgKj0gY29sb3JNYXRyaXg7XG4iCisgICAgICAgICIgICAgZnJhZ0NvbG9yICs9IGNvbG9yTWF0cml4VmVjdG9yO1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvci5yZ2IgKj0gZnJhZ0NvbG9yLmE7XG4iLAorICAgICAgICAvLyBMaWdodGluZworICAgICAgICAiICAgIGZsb2F0IGxpZ2h0aW5nQWxwaGEgPSBmcmFnQ29sb3IuYTtcbiIKKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBtaW4oZnJhZ0NvbG9yICogbGlnaHRpbmdNdWwgKyAobGlnaHRpbmdBZGQgKiBsaWdodGluZ0FscGhhKSwgbGlnaHRpbmdBbHBoYSk7XG4iCisgICAgICAgICIgICAgZnJhZ0NvbG9yLmEgPSBsaWdodGluZ0FscGhhO1xuIiwKKyAgICAgICAgLy8gUG9ydGVyRHVmZgorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGJsZW5kQ29sb3JzKGNvbG9yQmxlbmQsIGZyYWdDb2xvcik7XG4iCit9OworY29uc3QgY2hhciogZ0ZTX0Zvb3RlciA9CisgICAgICAgICJ9XG5cbiI7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBvcnRlckR1ZmYgc25pcHBldHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY29uc3QgY2hhciogZ0JsZW5kT3BzWzE4XSA9IHsKKyAgICAgICAgLy8gQ2xlYXIKKyAgICAgICAgInJldHVybiB2ZWM0KDAuMCwgMC4wLCAwLjAsIDAuMCk7XG4iLAorICAgICAgICAvLyBTcmMKKyAgICAgICAgInJldHVybiBzcmM7XG4iLAorICAgICAgICAvLyBEc3QKKyAgICAgICAgInJldHVybiBkc3Q7XG4iLAorICAgICAgICAvLyBTcmNPdmVyCisgICAgICAgICJyZXR1cm4gc3JjICsgZHN0ICogKDEuMCAtIHNyYy5hKTtcbiIsCisgICAgICAgIC8vIERzdE92ZXIKKyAgICAgICAgInJldHVybiBkc3QgKyBzcmMgKiAoMS4wIC0gZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gU3JjSW4KKyAgICAgICAgInJldHVybiBzcmMgKiBkc3QuYTtcbiIsCisgICAgICAgIC8vIERzdEluCisgICAgICAgICJyZXR1cm4gZHN0ICogc3JjLmE7XG4iLAorICAgICAgICAvLyBTcmNPdXQKKyAgICAgICAgInJldHVybiBzcmMgKiAoMS4wIC0gZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gRHN0T3V0CisgICAgICAgICJyZXR1cm4gZHN0ICogKDEuMCAtIHNyYy5hKTtcbiIsCisgICAgICAgIC8vIFNyY0F0b3AKKyAgICAgICAgInJldHVybiB2ZWM0KHNyYy5yZ2IgKiBkc3QuYSArICgxLjAgLSBzcmMuYSkgKiBkc3QucmdiLCBkc3QuYSk7XG4iLAorICAgICAgICAvLyBEc3RBdG9wCisgICAgICAgICJyZXR1cm4gdmVjNChkc3QucmdiICogc3JjLmEgKyAoMS4wIC0gZHN0LmEpICogc3JjLnJnYiwgc3JjLmEpO1xuIiwKKyAgICAgICAgLy8gWG9yCisgICAgICAgICJyZXR1cm4gdmVjNChzcmMucmdiICogKDEuMCAtIGRzdC5hKSArICgxLjAgLSBzcmMuYSkgKiBkc3QucmdiLCAiCisgICAgICAgICAgICAgICAgInNyYy5hICsgZHN0LmEgLSAyLjAgKiBzcmMuYSAqIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIEFkZAorICAgICAgICAicmV0dXJuIG1pbihzcmMgKyBkc3QsIDEuMCk7XG4iLAorICAgICAgICAvLyBNdWx0aXBseQorICAgICAgICAicmV0dXJuIHNyYyAqIGRzdDtcbiIsCisgICAgICAgIC8vIFNjcmVlbgorICAgICAgICAicmV0dXJuIHNyYyArIGRzdCAtIHNyYyAqIGRzdDtcbiIsCisgICAgICAgIC8vIE92ZXJsYXkKKyAgICAgICAgInJldHVybiBjbGFtcCh2ZWM0KG1peCgiCisgICAgICAgICAgICAgICAgIjIuMCAqIHNyYy5yZ2IgKiBkc3QucmdiICsgc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyBkc3QucmdiICogKDEuMCAtIHNyYy5hKSwgIgorICAgICAgICAgICAgICAgICJzcmMuYSAqIGRzdC5hIC0gMi4wICogKGRzdC5hIC0gZHN0LnJnYikgKiAoc3JjLmEgLSBzcmMucmdiKSArIHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgZHN0LnJnYiAqICgxLjAgLSBzcmMuYSksICIKKyAgICAgICAgICAgICAgICAic3RlcChkc3QuYSwgMi4wICogZHN0LnJnYikpLCAiCisgICAgICAgICAgICAgICAgInNyYy5hICsgZHN0LmEgLSBzcmMuYSAqIGRzdC5hKSwgMC4wLCAxLjApO1xuIiwKKyAgICAgICAgLy8gRGFya2VuCisgICAgICAgICJyZXR1cm4gdmVjNChzcmMucmdiICogKDEuMCAtIGRzdC5hKSArICgxLjAgLSBzcmMuYSkgKiBkc3QucmdiICsgIgorICAgICAgICAgICAgICAgICJtaW4oc3JjLnJnYiAqIGRzdC5hLCBkc3QucmdiICogc3JjLmEpLCBzcmMuYSArIGRzdC5hIC0gc3JjLmEgKiBkc3QuYSk7XG4iLAorICAgICAgICAvLyBMaWdodGVuCisgICAgICAgICJyZXR1cm4gdmVjNChzcmMucmdiICogKDEuMCAtIGRzdC5hKSArICgxLjAgLSBzcmMuYSkgKiBkc3QucmdiICsgIgorICAgICAgICAgICAgICAgICJtYXgoc3JjLnJnYiAqIGRzdC5hLCBkc3QucmdiICogc3JjLmEpLCBzcmMuYSArIGRzdC5hIC0gc3JjLmEgKiBkc3QuYSk7XG4iLAorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3JzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1Byb2dyYW1DYWNoZTo6UHJvZ3JhbUNhY2hlKCkgeworfQorCitQcm9ncmFtQ2FjaGU6On5Qcm9ncmFtQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFByb2dyYW1DYWNoZTo6Y2xlYXIoKSB7CisgICAgc2l6ZV90IGNvdW50ID0gbUNhY2hlLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1DYWNoZS52YWx1ZUF0KGkpOworICAgIH0KKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKworUHJvZ3JhbSogUHJvZ3JhbUNhY2hlOjpnZXQoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIHByb2dyYW1pZCBrZXkgPSBkZXNjcmlwdGlvbi5rZXkoKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKKyAgICBQcm9ncmFtKiBwcm9ncmFtID0gTlVMTDsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGRlc2NyaXB0aW9uLmxvZygiQ291bGQgbm90IGZpbmQgcHJvZ3JhbSIpOworICAgICAgICBwcm9ncmFtID0gZ2VuZXJhdGVQcm9ncmFtKGRlc2NyaXB0aW9uLCBrZXkpOworICAgICAgICBtQ2FjaGUuYWRkKGtleSwgcHJvZ3JhbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvZ3JhbSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFByb2dyYW0gZ2VuZXJhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtKiBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlUHJvZ3JhbShjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBwcm9ncmFtaWQga2V5KSB7CisgICAgU3RyaW5nOCB2ZXJ0ZXhTaGFkZXIgPSBnZW5lcmF0ZVZlcnRleFNoYWRlcihkZXNjcmlwdGlvbik7CisgICAgU3RyaW5nOCBmcmFnbWVudFNoYWRlciA9IGdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoZGVzY3JpcHRpb24pOworCisgICAgUHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyBQcm9ncmFtKHZlcnRleFNoYWRlci5zdHJpbmcoKSwgZnJhZ21lbnRTaGFkZXIuc3RyaW5nKCkpOworICAgIHJldHVybiBwcm9ncmFtOworfQorCitTdHJpbmc4IFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIC8vIEFkZCBhdHRyaWJ1dGVzCisgICAgU3RyaW5nOCBzaGFkZXIoZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzKTsKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfQXR0cmlidXRlc19UZXhDb29yZHMpOworICAgIH0KKyAgICAvLyBVbmlmb3JtcworICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9Vbmlmb3Jtcyk7CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9Vbmlmb3Jtc19IYXNHcmFkaWVudFtkZXNjcmlwdGlvbi5ncmFkaWVudFR5cGVdKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzQml0bWFwKTsKKyAgICB9CisgICAgLy8gVmFyeWluZ3MKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzVGV4dHVyZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzR3JhZGllbnRbZGVzY3JpcHRpb24uZ3JhZGllbnRUeXBlXSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0JpdG1hcCk7CisgICAgfQorCisgICAgLy8gQmVnaW4gdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW4pOyB7CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluX091dFRleENvb3Jkcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluX091dEdyYWRpZW50W2Rlc2NyaXB0aW9uLmdyYWRpZW50VHlwZV0pOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW5fT3V0Qml0bWFwVGV4Q29vcmRzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBPdXRwdXQgdHJhbnNmb3JtZWQgcG9zaXRpb24KKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9Qb3NpdGlvbik7CisgICAgfQorICAgIC8vIEVuZCB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnVlNfRm9vdGVyKTsKKworICAgIFBST0dSQU1fTE9HRCgiKioqIEdlbmVyYXRlZCB2ZXJ0ZXggc2hhZGVyOlxuXG4lcyIsIHNoYWRlci5zdHJpbmcoKSk7CisKKyAgICByZXR1cm4gc2hhZGVyOworfQorCitTdHJpbmc4IFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVGcmFnbWVudFNoYWRlcihjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbgorICAgIFN0cmluZzggc2hhZGVyOworCisgICAgYm9vbCBibGVuZEZyYW1lYnVmZmVyID0gZGVzY3JpcHRpb24uZnJhbWVidWZmZXJNb2RlID49IFNrWGZlcm1vZGU6OmtQbHVzX01vZGU7CisgICAgaWYgKGJsZW5kRnJhbWVidWZmZXIpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfSGVhZGVyX0V4dGVuc2lvbl9GcmFtZWJ1ZmZlckZldGNoKTsKKyAgICB9CisKKyAgICBzaGFkZXIuYXBwZW5kKGdGU19IZWFkZXIpOworCisgICAgLy8gVmFyeWluZ3MKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzVGV4dHVyZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzR3JhZGllbnRbZGVzY3JpcHRpb24uZ3JhZGllbnRUeXBlXSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0JpdG1hcCk7CisgICAgfQorCisKKyAgICAvLyBVbmlmb3JtcworICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0NvbG9yKTsKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19UZXh0dXJlU2FtcGxlcik7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19HcmFkaWVudFNhbXBsZXJbZGVzY3JpcHRpb24uZ3JhZGllbnRUeXBlXSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfVW5pZm9ybXNfQml0bWFwU2FtcGxlcik7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0NvbG9yT3BbZGVzY3JpcHRpb24uY29sb3JPcF0pOworCisgICAgLy8gR2VuZXJhdGUgcmVxdWlyZWQgZnVuY3Rpb25zCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50ICYmIGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBnZW5lcmF0ZUJsZW5kKHNoYWRlciwgImJsZW5kU2hhZGVycyIsIGRlc2NyaXB0aW9uLnNoYWRlcnNNb2RlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmNvbG9yT3AgPT0gUHJvZ3JhbURlc2NyaXB0aW9uOjprQ29sb3JCbGVuZCkgeworICAgICAgICBnZW5lcmF0ZUJsZW5kKHNoYWRlciwgImJsZW5kQ29sb3JzIiwgZGVzY3JpcHRpb24uY29sb3JNb2RlKTsKKyAgICB9CisgICAgaWYgKGJsZW5kRnJhbWVidWZmZXIpIHsKKyAgICAgICAgZ2VuZXJhdGVCbGVuZChzaGFkZXIsICJibGVuZEZyYW1lYnVmZmVyIiwgZGVzY3JpcHRpb24uZnJhbWVidWZmZXJNb2RlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmlzQml0bWFwTnBvdCkgeworICAgICAgICBnZW5lcmF0ZVRleHR1cmVXcmFwKHNoYWRlciwgZGVzY3JpcHRpb24uYml0bWFwV3JhcFMsIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBUKTsKKyAgICB9CisKKyAgICAvLyBCZWdpbiB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbik7IHsKKyAgICAgICAgLy8gU3RvcmVzIHRoZSByZXN1bHQgaW4gZnJhZ0NvbG9yIGRpcmVjdGx5CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQWxwaGE4VGV4dHVyZSkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hBOFRleHR1cmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoVGV4dHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQ29sb3IpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaEdyYWRpZW50W2Rlc2NyaXB0aW9uLmdyYWRpZW50VHlwZV0pOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgICAgIGlmICghZGVzY3JpcHRpb24uaXNCaXRtYXBOcG90KSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaEJpdG1hcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hCaXRtYXBOcG90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDYXNlIHdoZW4gd2UgaGF2ZSB0d28gc2hhZGVycyBzZXQKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50ICYmIGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmlzQml0bWFwRmlyc3QpIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0JsZW5kU2hhZGVyc0JHKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CbGVuZFNoYWRlcnNHQik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0JsZW5kU2hhZGVyc19Nb2R1bGF0ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0dyYWRpZW50U2hhZGVyX01vZHVsYXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CaXRtYXBTaGFkZXJfTW9kdWxhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEFwcGx5IHRoZSBjb2xvciBvcCBpZiBuZWVkZWQKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9BcHBseUNvbG9yT3BbZGVzY3JpcHRpb24uY29sb3JPcF0pOworICAgICAgICAvLyBPdXRwdXQgdGhlIGZyYWdtZW50CisgICAgICAgIGlmICghYmxlbmRGcmFtZWJ1ZmZlcikgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GcmFnQ29sb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCghZGVzY3JpcHRpb24uc3dhcFNyY0RzdCA/CisgICAgICAgICAgICAgICAgICAgIGdGU19NYWluX0ZyYWdDb2xvcl9CbGVuZCA6IGdGU19NYWluX0ZyYWdDb2xvcl9CbGVuZF9Td2FwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBFbmQgdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ0ZTX0Zvb3Rlcik7CisKKyAgICBpZiAoREVCVUdfUFJPR1JBTV9DQUNIRSkgeworICAgICAgICBQUk9HUkFNX0xPR0QoIioqKiBHZW5lcmF0ZWQgZnJhZ21lbnQgc2hhZGVyOlxuXG4iKTsKKyAgICAgICAgcHJpbnRMb25nU3RyaW5nKHNoYWRlcik7CisgICAgfQorCisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlQmxlbmQoU3RyaW5nOCYgc2hhZGVyLCBjb25zdCBjaGFyKiBuYW1lLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICBzaGFkZXIuYXBwZW5kKCJcbnZlYzQgIik7CisgICAgc2hhZGVyLmFwcGVuZChuYW1lKTsKKyAgICBzaGFkZXIuYXBwZW5kKCIodmVjNCBzcmMsIHZlYzQgZHN0KSB7XG4iKTsKKyAgICBzaGFkZXIuYXBwZW5kKCIgICAgIik7CisgICAgc2hhZGVyLmFwcGVuZChnQmxlbmRPcHNbbW9kZV0pOworICAgIHNoYWRlci5hcHBlbmQoIn1cbiIpOworfQorCit2b2lkIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVUZXh0dXJlV3JhcChTdHJpbmc4JiBzaGFkZXIsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBUKSB7CisgICAgc2hhZGVyLmFwcGVuZCgiXG52ZWMyIHdyYXAodmVjMiB0ZXhDb29yZHMpIHtcbiIpOworICAgIGlmICh3cmFwUyA9PSBHTF9NSVJST1JFRF9SRVBFQVQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZCgiICAgIGZsb2F0IHhNb2QyID0gbW9kKHRleENvb3Jkcy54LCAyLjApO1xuIik7CisgICAgICAgIHNoYWRlci5hcHBlbmQoIiAgICBpZiAoeE1vZDIgPiAxLjApIHhNb2QyID0gMi4wIC0geE1vZDI7XG4iKTsKKyAgICB9CisgICAgaWYgKHdyYXBUID09IEdMX01JUlJPUkVEX1JFUEVBVCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgZmxvYXQgeU1vZDIgPSBtb2QodGV4Q29vcmRzLnksIDIuMCk7XG4iKTsKKyAgICAgICAgc2hhZGVyLmFwcGVuZCgiICAgIGlmICh5TW9kMiA+IDEuMCkgeU1vZDIgPSAyLjAgLSB5TW9kMjtcbiIpOworICAgIH0KKyAgICBzaGFkZXIuYXBwZW5kKCIgICAgcmV0dXJuIHZlYzIoIik7CisgICAgc3dpdGNoICh3cmFwUykgeworICAgICAgICBjYXNlIEdMX0NMQU1QX1RPX0VER0U6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJ0ZXhDb29yZHMueCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfUkVQRUFUOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgibW9kKHRleENvb3Jkcy54LCAxLjApIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJ4TW9kMiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoIiwgIik7CisgICAgc3dpdGNoICh3cmFwVCkgeworICAgICAgICBjYXNlIEdMX0NMQU1QX1RPX0VER0U6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJ0ZXhDb29yZHMueSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfUkVQRUFUOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgibW9kKHRleENvb3Jkcy55LCAxLjApIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJ5TW9kMiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoIik7XG4iKTsKKyAgICBzaGFkZXIuYXBwZW5kKCJ9XG4iKTsKK30KKwordm9pZCBQcm9ncmFtQ2FjaGU6OnByaW50TG9uZ1N0cmluZyhjb25zdCBTdHJpbmc4JiBzaGFkZXIpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gMDsKKyAgICBzc2l6ZV90IGxhc3RJbmRleCA9IDA7CisgICAgY29uc3QgY2hhciogc3RyID0gc2hhZGVyLnN0cmluZygpOworICAgIHdoaWxlICgoaW5kZXggPSBzaGFkZXIuZmluZCgiXG4iLCBpbmRleCkpID4gLTEpIHsKKyAgICAgICAgU3RyaW5nOCBsaW5lKHN0ciwgaW5kZXggLSBsYXN0SW5kZXgpOworICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSBsaW5lLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgUFJPR1JBTV9MT0dEKCIlcyIsIGxpbmUuc3RyaW5nKCkpOworICAgICAgICBpbmRleCsrOworICAgICAgICBzdHIgKz0gKGluZGV4IC0gbGFzdEluZGV4KTsKKyAgICAgICAgbGFzdEluZGV4ID0gaW5kZXg7CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuaCBiL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE4MDExCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5oCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BST0dSQU1fQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1BST0dSQU1fQ0FDSEVfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgIlByb2dyYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX1BST0dSQU1fQ0FDSEUgMAorCisvLyBEZWJ1ZworI2lmIERFQlVHX1BST0dSQU1fQ0FDSEUKKyAgICAjZGVmaW5lIFBST0dSQU1fTE9HRCguLi4pIExPR0QoX19WQV9BUkdTX18pCisjZWxzZQorICAgICNkZWZpbmUgUFJPR1JBTV9MT0dEKC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFBST0dSQU1fS0VZX1RFWFRVUkUgMHgxCisjZGVmaW5lIFBST0dSQU1fS0VZX0E4X1RFWFRVUkUgMHgyCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUCAweDQKKyNkZWZpbmUgUFJPR1JBTV9LRVlfR1JBRElFTlQgMHg4CisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9GSVJTVCAweDEwCisjZGVmaW5lIFBST0dSQU1fS0VZX0NPTE9SX01BVFJJWCAweDIwCisjZGVmaW5lIFBST0dSQU1fS0VZX0NPTE9SX0xJR0hUSU5HIDB4NDAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQ09MT1JfQkxFTkQgMHg4MAorI2RlZmluZSBQUk9HUkFNX0tFWV9CSVRNQVBfTlBPVCAweDEwMAorI2RlZmluZSBQUk9HUkFNX0tFWV9TV0FQX1NSQ19EU1QgMHgyMDAwCisKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX1dSQVBTX01BU0sgMHg2MDAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX1dSQVBUX01BU0sgMHgxODAwCisKKy8vIEVuY29kZSB0aGUgeGZlcm1vZGVzIG9uIDYgYml0cworI2RlZmluZSBQUk9HUkFNX01BWF9YRkVSTU9ERSAweDFmCisjZGVmaW5lIFBST0dSQU1fWEZFUk1PREVfU0hBREVSX1NISUZUIDI2CisjZGVmaW5lIFBST0dSQU1fWEZFUk1PREVfQ09MT1JfT1BfU0hJRlQgMjAKKyNkZWZpbmUgUFJPR1JBTV9YRkVSTU9ERV9GUkFNRUJVRkZFUl9TSElGVCAxNAorCisjZGVmaW5lIFBST0dSQU1fQklUTUFQX1dSQVBTX1NISUZUIDkKKyNkZWZpbmUgUFJPR1JBTV9CSVRNQVBfV1JBUFRfU0hJRlQgMTEKKworI2RlZmluZSBQUk9HUkFNX0dSQURJRU5UX1RZUEVfU0hJRlQgMzMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiB1aW50NjRfdCBwcm9ncmFtaWQ7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogRGVzY3JpYmUgdGhlIGZlYXR1cmVzIHJlcXVpcmVkIGZvciBhIGdpdmVuIHByb2dyYW0uIFRoZSBmZWF0dXJlcworICogZGV0ZXJtaW5lIHRoZSBnZW5lcmF0aW9uIG9mIGJvdGggdGhlIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycy4KKyAqIEEgUHJvZ3JhbURlc2NyaXB0aW9uIG11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgUHJvZ3JhbUNhY2hlLgorICovCitzdHJ1Y3QgUHJvZ3JhbURlc2NyaXB0aW9uIHsKKyAgICBlbnVtIENvbG9yTW9kaWZpZXIgeworICAgICAgICBrQ29sb3JOb25lLAorICAgICAgICBrQ29sb3JNYXRyaXgsCisgICAgICAgIGtDb2xvckxpZ2h0aW5nLAorICAgICAgICBrQ29sb3JCbGVuZAorICAgIH07CisKKyAgICBlbnVtIEdyYWRpZW50IHsKKyAgICAgICAga0dyYWRpZW50TGluZWFyLAorICAgICAgICBrR3JhZGllbnRDaXJjdWxhciwKKyAgICAgICAga0dyYWRpZW50U3dlZXAKKyAgICB9OworCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uKCk6CisgICAgICAgIGhhc1RleHR1cmUoZmFsc2UpLCBoYXNBbHBoYThUZXh0dXJlKGZhbHNlKSwKKyAgICAgICAgaGFzQml0bWFwKGZhbHNlKSwgaXNCaXRtYXBOcG90KGZhbHNlKSwgaGFzR3JhZGllbnQoZmFsc2UpLAorICAgICAgICBncmFkaWVudFR5cGUoa0dyYWRpZW50TGluZWFyKSwKKyAgICAgICAgc2hhZGVyc01vZGUoU2tYZmVybW9kZTo6a0NsZWFyX01vZGUpLCBpc0JpdG1hcEZpcnN0KGZhbHNlKSwKKyAgICAgICAgYml0bWFwV3JhcFMoR0xfQ0xBTVBfVE9fRURHRSksIGJpdG1hcFdyYXBUKEdMX0NMQU1QX1RPX0VER0UpLAorICAgICAgICBjb2xvck9wKGtDb2xvck5vbmUpLCBjb2xvck1vZGUoU2tYZmVybW9kZTo6a0NsZWFyX01vZGUpLAorICAgICAgICBmcmFtZWJ1ZmZlck1vZGUoU2tYZmVybW9kZTo6a0NsZWFyX01vZGUpLCBzd2FwU3JjRHN0KGZhbHNlKSB7CisgICAgfQorCisgICAgLy8gVGV4dHVyaW5nCisgICAgYm9vbCBoYXNUZXh0dXJlOworICAgIGJvb2wgaGFzQWxwaGE4VGV4dHVyZTsKKworICAgIC8vIFNoYWRlcnMKKyAgICBib29sIGhhc0JpdG1hcDsKKyAgICBib29sIGlzQml0bWFwTnBvdDsKKworICAgIGJvb2wgaGFzR3JhZGllbnQ7CisgICAgR3JhZGllbnQgZ3JhZGllbnRUeXBlOworCisgICAgU2tYZmVybW9kZTo6TW9kZSBzaGFkZXJzTW9kZTsKKworICAgIGJvb2wgaXNCaXRtYXBGaXJzdDsKKyAgICBHTGVudW0gYml0bWFwV3JhcFM7CisgICAgR0xlbnVtIGJpdG1hcFdyYXBUOworCisgICAgLy8gQ29sb3Igb3BlcmF0aW9ucworICAgIGludCBjb2xvck9wOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgY29sb3JNb2RlOworCisgICAgLy8gRnJhbWVidWZmZXIgYmxlbmRpbmcgKHJlcXVpcmVzIEV4dGVuc2lvbnMuaGFzRnJhbWVidWZmZXJGZXRjaCgpKQorICAgIC8vIElnbm9yZWQgZm9yIGFsbCB2YWx1ZXMgPCBTa1hmZXJtb2RlOjprUGx1c19Nb2RlCisgICAgU2tYZmVybW9kZTo6TW9kZSBmcmFtZWJ1ZmZlck1vZGU7CisgICAgYm9vbCBzd2FwU3JjRHN0OworCisgICAgaW5saW5lIHVpbnQzMl90IGdldEVudW1Gb3JXcmFwKEdMZW51bSB3cmFwKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAod3JhcCkgeworICAgICAgICAgICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcm9ncmFtaWQga2V5KCkgY29uc3QgeworICAgICAgICBwcm9ncmFtaWQga2V5ID0gMDsKKyAgICAgICAgaWYgKGhhc1RleHR1cmUpIGtleSB8PSBQUk9HUkFNX0tFWV9URVhUVVJFOworICAgICAgICBpZiAoaGFzQWxwaGE4VGV4dHVyZSkga2V5IHw9IFBST0dSQU1fS0VZX0E4X1RFWFRVUkU7CisgICAgICAgIGlmIChoYXNCaXRtYXApIHsKKyAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9CSVRNQVA7CisgICAgICAgICAgICBpZiAoaXNCaXRtYXBOcG90KSB7CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0JJVE1BUF9OUE9UOworICAgICAgICAgICAgICAgIGtleSB8PSBnZXRFbnVtRm9yV3JhcChiaXRtYXBXcmFwUykgPDwgUFJPR1JBTV9CSVRNQVBfV1JBUFNfU0hJRlQ7CisgICAgICAgICAgICAgICAga2V5IHw9IGdldEVudW1Gb3JXcmFwKGJpdG1hcFdyYXBUKSA8PCBQUk9HUkFNX0JJVE1BUF9XUkFQVF9TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGFzR3JhZGllbnQpIGtleSB8PSBQUk9HUkFNX0tFWV9HUkFESUVOVDsKKyAgICAgICAga2V5IHw9IHByb2dyYW1pZChncmFkaWVudFR5cGUpIDw8IFBST0dSQU1fR1JBRElFTlRfVFlQRV9TSElGVDsKKyAgICAgICAgaWYgKGlzQml0bWFwRmlyc3QpIGtleSB8PSBQUk9HUkFNX0tFWV9CSVRNQVBfRklSU1Q7CisgICAgICAgIGlmIChoYXNCaXRtYXAgJiYgaGFzR3JhZGllbnQpIHsKKyAgICAgICAgICAgIGtleSB8PSAoc2hhZGVyc01vZGUgJiBQUk9HUkFNX01BWF9YRkVSTU9ERSkgPDwgUFJPR1JBTV9YRkVSTU9ERV9TSEFERVJfU0hJRlQ7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb2xvck9wKSB7CisgICAgICAgICAgICBjYXNlIGtDb2xvck1hdHJpeDoKKyAgICAgICAgICAgICAgICBrZXkgfD0gUFJPR1JBTV9LRVlfQ09MT1JfTUFUUklYOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrQ29sb3JMaWdodGluZzoKKyAgICAgICAgICAgICAgICBrZXkgfD0gUFJPR1JBTV9LRVlfQ09MT1JfTElHSFRJTkc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtDb2xvckJsZW5kOgorICAgICAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9DT0xPUl9CTEVORDsKKyAgICAgICAgICAgICAgICBrZXkgfD0gKGNvbG9yTW9kZSAmIFBST0dSQU1fTUFYX1hGRVJNT0RFKSA8PCBQUk9HUkFNX1hGRVJNT0RFX0NPTE9SX09QX1NISUZUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrQ29sb3JOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGtleSB8PSAoZnJhbWVidWZmZXJNb2RlICYgUFJPR1JBTV9NQVhfWEZFUk1PREUpIDw8IFBST0dSQU1fWEZFUk1PREVfRlJBTUVCVUZGRVJfU0hJRlQ7CisgICAgICAgIGlmIChzd2FwU3JjRHN0KSBrZXkgfD0gUFJPR1JBTV9LRVlfU1dBUF9TUkNfRFNUOworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgICAgICAgcHJvZ3JhbWlkIGsgPSBrZXkoKTsKKyAgICAgICAgUFJPR1JBTV9MT0dEKCIlcyAoa2V5ID0gMHglLjh4JS44eCkiLCBtZXNzYWdlLCB1aW50MzJfdChrID4+IDMyKSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdChrICYgMHhmZmZmZmZmZikpOworICAgIH0KK307IC8vIHN0cnVjdCBQcm9ncmFtRGVzY3JpcHRpb24KKworLyoqCisgKiBHZW5lcmF0ZXMgYW5kIGNhY2hlcyBwcm9ncmFtLiBQcm9ncmFtcyBhcmUgZ2VuZXJhdGVkIGJhc2VkIG9uCisgKiBQcm9ncmFtRGVzY3JpcHRpb25zLgorICovCitjbGFzcyBQcm9ncmFtQ2FjaGUgeworcHVibGljOgorICAgIFByb2dyYW1DYWNoZSgpOworICAgIH5Qcm9ncmFtQ2FjaGUoKTsKKworICAgIFByb2dyYW0qIGdldChjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworICAgIHZvaWQgY2xlYXIoKTsKKworcHJpdmF0ZToKKyAgICBQcm9ncmFtKiBnZW5lcmF0ZVByb2dyYW0oY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgcHJvZ3JhbWlkIGtleSk7CisgICAgU3RyaW5nOCBnZW5lcmF0ZVZlcnRleFNoYWRlcihjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKyAgICBTdHJpbmc4IGdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisgICAgdm9pZCBnZW5lcmF0ZUJsZW5kKFN0cmluZzgmIHNoYWRlciwgY29uc3QgY2hhciogbmFtZSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKTsKKyAgICB2b2lkIGdlbmVyYXRlVGV4dHVyZVdyYXAoU3RyaW5nOCYgc2hhZGVyLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCk7CisKKyAgICB2b2lkIHByaW50TG9uZ1N0cmluZyhjb25zdCBTdHJpbmc4JiBzaGFkZXIpIGNvbnN0OworCisgICAgS2V5ZWRWZWN0b3I8cHJvZ3JhbWlkLCBQcm9ncmFtKj4gbUNhY2hlOworfTsgLy8gY2xhc3MgUHJvZ3JhbUNhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QUk9HUkFNX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmggYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMWE4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPUEVSVElFU19ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPUEVSVElFU19ICisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbGlzdCBvZiBzeXN0ZW0gcHJvcGVydGllcyB1c2VkIHRvIGNvbmZpZ3VyZQorICogdGhlIE9wZW5HTFJlbmRlcmVyLgorICovCisKKy8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaW4gbWVnYS1ieXRlcworI2RlZmluZSBQUk9QRVJUWV9URVhUVVJFX0NBQ0hFX1NJWkUgInJvLmh3dWkudGV4dHVyZV9jYWNoZV9zaXplIgorI2RlZmluZSBQUk9QRVJUWV9MQVlFUl9DQUNIRV9TSVpFICJyby5od3VpLmxheWVyX2NhY2hlX3NpemUiCisjZGVmaW5lIFBST1BFUlRZX0dSQURJRU5UX0NBQ0hFX1NJWkUgInJvLmh3dWkuZ3JhZGllbnRfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfUEFUSF9DQUNIRV9TSVpFICJyby5od3VpLnBhdGhfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSAicm8uaHd1aS5kcm9wX3NoYWRvd19jYWNoZV9zaXplIgorI2RlZmluZSBQUk9QRVJUWV9GQk9fQ0FDSEVfU0laRSAicm8uaHd1aS5mYm9fY2FjaGVfc2l6ZSIKKworLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBpbiBwaXhlbHMKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9DQUNIRV9XSURUSCAicm8uaHd1aS50ZXh0X2NhY2hlX3dpZHRoIgorI2RlZmluZSBQUk9QRVJUWV9URVhUX0NBQ0hFX0hFSUdIVCAicm8uaHd1aS50ZXh0X2NhY2hlX2hlaWdodCIKKworLy8gR2FtbWEgKD49IDEuMCwgPD0gMTAuMCkKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9HQU1NQSAicm8udGV4dF9nYW1tYSIKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9CTEFDS19HQU1NQV9USFJFU0hPTEQgInJvLnRleHRfZ2FtbWEuYmxhY2tfdGhyZXNob2xkIgorI2RlZmluZSBQUk9QRVJUWV9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCAicm8udGV4dF9nYW1tYS53aGl0ZV90aHJlc2hvbGQiCisKKy8vIENvbnZlcnRzIGEgbnVtYmVyIG9mIG1lZ2EtYnl0ZXMgaW50byBieXRlcworI2RlZmluZSBNQihzKSBzICogMTAyNCAqIDEwMjQKKworI2RlZmluZSBERUZBVUxUX1RFWFRVUkVfQ0FDSEVfU0laRSAyMi4wZgorI2RlZmluZSBERUZBVUxUX0xBWUVSX0NBQ0hFX1NJWkUgNC4wZgorI2RlZmluZSBERUZBVUxUX1BBVEhfQ0FDSEVfU0laRSA0LjBmCisjZGVmaW5lIERFRkFVTFRfUEFUQ0hfQ0FDSEVfU0laRSA1MTIKKyNkZWZpbmUgREVGQVVMVF9HUkFESUVOVF9DQUNIRV9TSVpFIDAuNWYKKyNkZWZpbmUgREVGQVVMVF9EUk9QX1NIQURPV19DQUNIRV9TSVpFIDIuMGYKKyNkZWZpbmUgREVGQVVMVF9GQk9fQ0FDSEVfU0laRSAyNQorCisjZGVmaW5lIERFRkFVTFRfVEVYVF9HQU1NQSAxLjRmCisjZGVmaW5lIERFRkFVTFRfVEVYVF9CTEFDS19HQU1NQV9USFJFU0hPTEQgNjQKKyNkZWZpbmUgREVGQVVMVF9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCAxOTIKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUFJPUEVSVElFU19ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUmVjdC5oIGIvbGlicy9od3VpL1JlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDNhNjAyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1JlY3QuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9SRUNUX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9SRUNUX0gKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN0cnVjdHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IFJlY3QgeworICAgIGZsb2F0IGxlZnQ7CisgICAgZmxvYXQgdG9wOworICAgIGZsb2F0IHJpZ2h0OworICAgIGZsb2F0IGJvdHRvbTsKKworICAgIFJlY3QoKToKKyAgICAgICAgICAgIGxlZnQoMCksCisgICAgICAgICAgICB0b3AoMCksCisgICAgICAgICAgICByaWdodCgwKSwKKyAgICAgICAgICAgIGJvdHRvbSgwKSB7CisgICAgfQorCisgICAgUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pOgorICAgICAgICAgICAgbGVmdChsZWZ0KSwKKyAgICAgICAgICAgIHRvcCh0b3ApLAorICAgICAgICAgICAgcmlnaHQocmlnaHQpLAorICAgICAgICAgICAgYm90dG9tKGJvdHRvbSkgeworICAgIH0KKworICAgIFJlY3QoY29uc3QgUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgfQorCisgICAgUmVjdChSZWN0JiByKSB7CisgICAgICAgIHNldChyKTsKKyAgICB9CisKKyAgICBSZWN0JiBvcGVyYXRvcj0oY29uc3QgUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZWN0JiBvcGVyYXRvcj0oUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBmcmllbmQgaW50IG9wZXJhdG9yPT0oY29uc3QgUmVjdCYgYSwgY29uc3QgUmVjdCYgYikgeworICAgICAgICByZXR1cm4gIW1lbWNtcCgmYSwgJmIsIHNpemVvZihhKSk7CisgICAgfQorCisgICAgZnJpZW5kIGludCBvcGVyYXRvciE9KGNvbnN0IFJlY3QmIGEsIGNvbnN0IFJlY3QmIGIpIHsKKyAgICAgICAgcmV0dXJuIG1lbWNtcCgmYSwgJmIsIHNpemVvZihhKSk7CisgICAgfQorCisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA+PSByaWdodCB8fCB0b3AgPj0gYm90dG9tOworICAgIH0KKworICAgIHZvaWQgc2V0RW1wdHkoKSB7CisgICAgICAgIG1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgdGhpcy0+bGVmdCA9IGxlZnQ7CisgICAgICAgIHRoaXMtPnJpZ2h0ID0gcmlnaHQ7CisgICAgICAgIHRoaXMtPnRvcCA9IHRvcDsKKyAgICAgICAgdGhpcy0+Ym90dG9tID0gYm90dG9tOworICAgIH0KKworICAgIHZvaWQgc2V0KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICB9CisKKyAgICBpbmxpbmUgZmxvYXQgZ2V0V2lkdGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiByaWdodCAtIGxlZnQ7CisgICAgfQorCisgICAgaW5saW5lIGZsb2F0IGdldEhlaWdodCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGJvdHRvbSAtIHRvcDsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdHMoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgJiYgdG9wIDwgYm90dG9tICYmCisgICAgICAgICAgICAgICAgdGhpcy0+bGVmdCA8IHRoaXMtPnJpZ2h0ICYmIHRoaXMtPnRvcCA8IHRoaXMtPmJvdHRvbSAmJgorICAgICAgICAgICAgICAgIHRoaXMtPmxlZnQgPCByaWdodCAmJiBsZWZ0IDwgdGhpcy0+cmlnaHQgJiYKKyAgICAgICAgICAgICAgICB0aGlzLT50b3AgPCBib3R0b20gJiYgdG9wIDwgdGhpcy0+Ym90dG9tOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBSZWN0JiByKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpbnRlcnNlY3RzKHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgaWYgKGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20gJiYgIXRoaXMtPmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIHRoaXMtPmxlZnQgPCByaWdodCAmJiBsZWZ0IDwgdGhpcy0+cmlnaHQgJiYKKyAgICAgICAgICAgICAgICB0aGlzLT50b3AgPCBib3R0b20gJiYgdG9wIDwgdGhpcy0+Ym90dG9tKSB7CisKKyAgICAgICAgICAgIGlmICh0aGlzLT5sZWZ0IDwgbGVmdCkgdGhpcy0+bGVmdCA9IGxlZnQ7CisgICAgICAgICAgICBpZiAodGhpcy0+dG9wIDwgdG9wKSB0aGlzLT50b3AgPSB0b3A7CisgICAgICAgICAgICBpZiAodGhpcy0+cmlnaHQgPiByaWdodCkgdGhpcy0+cmlnaHQgPSByaWdodDsKKyAgICAgICAgICAgIGlmICh0aGlzLT5ib3R0b20gPiBib3R0b20pIHRoaXMtPmJvdHRvbSA9IGJvdHRvbTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgcmV0dXJuIGludGVyc2VjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgYm9vbCB1bmlvbldpdGgoY29uc3QgUmVjdCYgcikgeworICAgICAgICBpZiAoci5sZWZ0IDwgci5yaWdodCAmJiByLnRvcCA8IHIuYm90dG9tKSB7CisgICAgICAgICAgICBpZiAobGVmdCA8IHJpZ2h0ICYmIHRvcCA8IGJvdHRvbSkgeworICAgICAgICAgICAgICAgIGlmIChsZWZ0ID4gci5sZWZ0KSBsZWZ0ID0gci5sZWZ0OworICAgICAgICAgICAgICAgIGlmICh0b3AgPiByLnRvcCkgdG9wID0gci50b3A7CisgICAgICAgICAgICAgICAgaWYgKHJpZ2h0IDwgci5yaWdodCkgcmlnaHQgPSByLnJpZ2h0OworICAgICAgICAgICAgICAgIGlmIChib3R0b20gPCByLmJvdHRvbSkgYm90dG9tID0gci5ib3R0b207CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxlZnQgPSByLmxlZnQ7CisgICAgICAgICAgICAgICAgdG9wID0gci50b3A7CisgICAgICAgICAgICAgICAgcmlnaHQgPSByLnJpZ2h0OworICAgICAgICAgICAgICAgIGJvdHRvbSA9IHIuYm90dG9tOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIHNuYXBUb1BpeGVsQm91bmRhcmllcygpIHsKKyAgICAgICAgbGVmdCA9IGZsb29yKGxlZnQpOworICAgICAgICB0b3AgPSBmbG9vcih0b3ApOworICAgICAgICByaWdodCA9IGNlaWwocmlnaHQpOworICAgICAgICBib3R0b20gPSBjZWlsKGJvdHRvbSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wKCkgY29uc3QgeworICAgICAgICBMT0dEKCJSZWN0W2w9JWYgdD0lZiByPSVmIGI9JWZdIiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICB9CisKK307IC8vIHN0cnVjdCBSZWN0CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9SRUNUX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuY3BwIGIvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1N2FlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNraWFDb2xvckZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2UgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFDb2xvckZpbHRlcjo6U2tpYUNvbG9yRmlsdGVyKFR5cGUgdHlwZSwgYm9vbCBibGVuZCk6IG1UeXBlKHR5cGUpLCBtQmxlbmQoYmxlbmQpIHsKK30KKworU2tpYUNvbG9yRmlsdGVyOjp+U2tpYUNvbG9yRmlsdGVyKCkgeworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb2xvciBtYXRyaXggZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFDb2xvck1hdHJpeEZpbHRlcjo6U2tpYUNvbG9yTWF0cml4RmlsdGVyKGZsb2F0KiBtYXRyaXgsIGZsb2F0KiB2ZWN0b3IpOgorICAgICAgICBTa2lhQ29sb3JGaWx0ZXIoa0NvbG9yTWF0cml4LCB0cnVlKSwgbU1hdHJpeChtYXRyaXgpLCBtVmVjdG9yKHZlY3RvcikgeworfQorCitTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6On5Ta2lhQ29sb3JNYXRyaXhGaWx0ZXIoKSB7CisgICAgZGVsZXRlW10gbU1hdHJpeDsKKyAgICBkZWxldGVbXSBtVmVjdG9yOworfQorCit2b2lkIFNraWFDb2xvck1hdHJpeEZpbHRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwKKyAgICAgICAgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmNvbG9yT3AgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtDb2xvck1hdHJpeDsKK30KKwordm9pZCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oImNvbG9yTWF0cml4IiksIDEsIEdMX0ZBTFNFLCAmbU1hdHJpeFswXSk7CisgICAgZ2xVbmlmb3JtNGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oImNvbG9yTWF0cml4VmVjdG9yIiksIDEsIG1WZWN0b3IpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMaWdodGluZyBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUxpZ2h0aW5nRmlsdGVyOjpTa2lhTGlnaHRpbmdGaWx0ZXIoaW50IG11bHRpcGx5LCBpbnQgYWRkKToKKyAgICAgICAgU2tpYUNvbG9yRmlsdGVyKGtMaWdodGluZywgdHJ1ZSkgeworICAgIG1NdWxSID0gKChtdWx0aXBseSA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtTXVsRyA9ICgobXVsdGlwbHkgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbU11bEIgPSAoKG11bHRpcGx5ICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgbUFkZFIgPSAoKGFkZCA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtQWRkRyA9ICgoYWRkID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1BZGRCID0gKChhZGQgICAgICApICYgMHhGRikgLyAyNTUuMGY7Cit9CisKK3ZvaWQgU2tpYUxpZ2h0aW5nRmlsdGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uY29sb3JPcCA9IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yTGlnaHRpbmc7Cit9CisKK3ZvaWQgU2tpYUxpZ2h0aW5nRmlsdGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGdsVW5pZm9ybTRmKHByb2dyYW0tPmdldFVuaWZvcm0oImxpZ2h0aW5nTXVsIiksIG1NdWxSLCBtTXVsRywgbU11bEIsIDEuMGYpOworICAgIGdsVW5pZm9ybTRmKHByb2dyYW0tPmdldFVuaWZvcm0oImxpZ2h0aW5nQWRkIiksIG1BZGRSLCBtQWRkRywgbUFkZEIsIDAuMGYpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCbGVuZCBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUJsZW5kRmlsdGVyOjpTa2lhQmxlbmRGaWx0ZXIoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOgorICAgICAgICBTa2lhQ29sb3JGaWx0ZXIoa0JsZW5kLCB0cnVlKSwgbU1vZGUobW9kZSkgeworICAgIGNvbnN0IGludCBhbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgIG1BID0gYWxwaGEgLyAyNTUuMGY7CisgICAgbVIgPSBtQSAqICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUcgPSBtQSAqICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUIgPSBtQSAqICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7Cit9CisKK3ZvaWQgU2tpYUJsZW5kRmlsdGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uY29sb3JPcCA9IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yQmxlbmQ7CisgICAgZGVzY3JpcHRpb24uY29sb3JNb2RlID0gbU1vZGU7Cit9CisKK3ZvaWQgU2tpYUJsZW5kRmlsdGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGdsVW5pZm9ybTRmKHByb2dyYW0tPmdldFVuaWZvcm0oImNvbG9yQmxlbmQiKSwgbVIsIG1HLCBtQiwgbUEpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuaCBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjViNmYwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NLSUFfQ09MT1JfRklMVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TS0lBX0NPTE9SX0ZJTFRFUl9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorI2luY2x1ZGUgIkV4dGVuc2lvbnMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIGNvbG9yIGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFJlcHJlc2VudHMgYSBTa2lhIGNvbG9yIGZpbHRlci4gQSBjb2xvciBmaWx0ZXIgbW9kaWZpZXMgYSBQcm9ncmFtRGVzY3JpcHRpb24KKyAqIGFuZCBzZXRzIHVuaWZvcm1zIG9uIHRoZSByZXN1bHRpbmcgc2hhZGVycy4KKyAqLworc3RydWN0IFNraWFDb2xvckZpbHRlciB7CisgICAgLyoqCisgICAgICogVHlwZSBvZiBTa2lhIGNvbG9yIGZpbHRlciBpbiB1c2UuCisgICAgICovCisgICAgZW51bSBUeXBlIHsKKyAgICAgICAga05vbmUsCisgICAgICAgIGtDb2xvck1hdHJpeCwKKyAgICAgICAga0xpZ2h0aW5nLAorICAgICAgICBrQmxlbmQsCisgICAgfTsKKworICAgIFNraWFDb2xvckZpbHRlcihUeXBlIHR5cGUsIGJvb2wgYmxlbmQpOworICAgIHZpcnR1YWwgflNraWFDb2xvckZpbHRlcigpOworCisgICAgdmlydHVhbCB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pID0gMDsKKworICAgIGlubGluZSBib29sIGJsZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsZW5kOworICAgIH0KKworICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UeXBlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIFR5cGUgbVR5cGU7CisgICAgYm9vbCBtQmxlbmQ7Cit9OyAvLyBzdHJ1Y3QgU2tpYUNvbG9yRmlsdGVyCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEltcGxlbWVudGF0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEEgY29sb3IgZmlsdGVyIHRoYXQgbXVsdGlwbGllcyB0aGUgc291cmNlIGNvbG9yIHdpdGggYSBtYXRyaXggYW5kIGFkZHMgYSB2ZWN0b3IuCisgKi8KK3N0cnVjdCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6IHB1YmxpYyBTa2lhQ29sb3JGaWx0ZXIgeworICAgIFNraWFDb2xvck1hdHJpeEZpbHRlcihmbG9hdCogbWF0cml4LCBmbG9hdCogdmVjdG9yKTsKKyAgICB+U2tpYUNvbG9yTWF0cml4RmlsdGVyKCk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pOworCitwcml2YXRlOgorICAgIGZsb2F0KiBtTWF0cml4OworICAgIGZsb2F0KiBtVmVjdG9yOworfTsgLy8gc3RydWN0IFNraWFDb2xvck1hdHJpeEZpbHRlcgorCisvKioKKyAqIEEgY29sb3IgZmlsdGVycyB0aGF0IG11bHRpcGxpZXMgdGhlIHNvdXJjZSBjb2xvciB3aXRoIGEgZml4ZWQgdmFsdWUgYW5kIGFkZHMKKyAqIGFub3RoZXIgZml4ZWQgdmFsdWUuIElnbm9yZXMgdGhlIGFscGhhIGNoYW5uZWwgb2YgYm90aCBhcmd1bWVudHMuCisgKi8KK3N0cnVjdCBTa2lhTGlnaHRpbmdGaWx0ZXI6IHB1YmxpYyBTa2lhQ29sb3JGaWx0ZXIgeworICAgIFNraWFMaWdodGluZ0ZpbHRlcihpbnQgbXVsdGlwbHksIGludCBhZGQpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworcHJpdmF0ZToKKyAgICBHTGZsb2F0IG1NdWxSLCBtTXVsRywgbU11bEI7CisgICAgR0xmbG9hdCBtQWRkUiwgbUFkZEcsIG1BZGRCOworfTsgLy8gc3RydWN0IFNraWFMaWdodGluZ0ZpbHRlcgorCisvKioKKyAqIEEgY29sb3IgZmlsdGVycyB0aGF0IGJsZW5kcyB0aGUgc291cmNlIGNvbG9yIHdpdGggYSBzcGVjaWZpZWQgZGVzdGluYXRpb24gY29sb3IKKyAqIGFuZCBQb3J0ZXJEdWZmIGJsZW5kaW5nIG1vZGUuCisgKi8KK3N0cnVjdCBTa2lhQmxlbmRGaWx0ZXI6IHB1YmxpYyBTa2lhQ29sb3JGaWx0ZXIgeworICAgIFNraWFCbGVuZEZpbHRlcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pOworCitwcml2YXRlOgorICAgIFNrWGZlcm1vZGU6Ok1vZGUgbU1vZGU7CisgICAgR0xmbG9hdCBtUiwgbUcsIG1CLCBtQTsKK307IC8vIHN0cnVjdCBTa2lhQmxlbmRGaWx0ZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NLSUFfQ09MT1JfRklMVEVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmNwcCBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTg1ZDIwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NraWFTaGFkZXIuY3BwCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIlNraWFTaGFkZXIuaCIKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3VwcG9ydAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3QgR0xlbnVtIGdUZXh0dXJlVW5pdHNNYXBbXSA9IHsKKyAgICAgICAgR0xfVEVYVFVSRTAsCisgICAgICAgIEdMX1RFWFRVUkUxLAorICAgICAgICBHTF9URVhUVVJFMgorfTsKKworc3RhdGljIGNvbnN0IEdMaW50IGdUaWxlTW9kZXNbXSA9IHsKKyAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSwgICAvLyA9PSBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlCisgICAgICAgIEdMX1JFUEVBVCwgICAgICAgICAgLy8gPT0gU2tTaGFkZXI6OmtSZXBlYXRfTW9kZQorICAgICAgICBHTF9NSVJST1JFRF9SRVBFQVQgIC8vID09IFNrU2hhZGVyOjprTWlycm9yX1RpbGVNb2RlCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhU2hhZGVyOjpTa2lhU2hhZGVyKFR5cGUgdHlwZSwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLAorICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBtVHlwZSh0eXBlKSwgbUtleShrZXkpLCBtVGlsZVgodGlsZVgpLCBtVGlsZVkodGlsZVkpLCBtQmxlbmQoYmxlbmQpIHsKKyAgICBzZXRNYXRyaXgobWF0cml4KTsKK30KKworU2tpYVNoYWRlcjo6flNraWFTaGFkZXIoKSB7Cit9CisKK3ZvaWQgU2tpYVNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworfQorCit2b2lkIFNraWFTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworfQorCit2b2lkIFNraWFTaGFkZXI6OmJpbmRUZXh0dXJlKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCwgR0x1aW50IHRleHR1cmVVbml0KSB7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNNYXBbdGV4dHVyZVVuaXRdKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgd3JhcFMpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgd3JhcFQpOworfQorCit2b2lkIFNraWFTaGFkZXI6OmNvbXB1dGVTY3JlZW5TcGFjZU1hdHJpeChtYXQ0JiBzY3JlZW5TcGFjZSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3KSB7CisgICAgc2NyZWVuU3BhY2UubG9hZE11bHRpcGx5KG1Vbml0TWF0cml4LCBtU2hhZGVyTWF0cml4KTsKKyAgICBzY3JlZW5TcGFjZS5tdWx0aXBseShtb2RlbFZpZXcpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCaXRtYXAgc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFCaXRtYXBTaGFkZXI6OlNraWFCaXRtYXBTaGFkZXIoU2tCaXRtYXAqIGJpdG1hcCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLAorICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBTa2lhU2hhZGVyKGtCaXRtYXAsIGtleSwgdGlsZVgsIHRpbGVZLCBtYXRyaXgsIGJsZW5kKSwgbUJpdG1hcChiaXRtYXApLCBtVGV4dHVyZShOVUxMKSB7CisgICAgdXBkYXRlTG9jYWxNYXRyaXgobWF0cml4KTsKK30KKwordm9pZCBTa2lhQml0bWFwU2hhZGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1UZXh0dXJlQ2FjaGUtPmdldChtQml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBtVGV4dHVyZSA9IHRleHR1cmU7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIGRlc2NyaXB0aW9uLmhhc0JpdG1hcCA9IHRydWU7CisgICAgLy8gVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IG5vbi1wb3dlciBvZiB0d28gbWlycm9yZWQvcmVwZWF0ZWQKKyAgICAvLyB0ZXh0dXJlcywgc28gZG8gaXQgb3Vyc2VsdmVzCisgICAgaWYgKCFleHRlbnNpb25zLmhhc05Qb3QoKSAmJiAoIWlzUG93ZXJPZlR3byh3aWR0aCkgfHwgIWlzUG93ZXJPZlR3byhoZWlnaHQpKSAmJgorICAgICAgICAgICAgKG1UaWxlWCAhPSBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlIHx8IG1UaWxlWSAhPSBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlKSkgeworICAgICAgICBkZXNjcmlwdGlvbi5pc0JpdG1hcE5wb3QgPSB0cnVlOworICAgICAgICBkZXNjcmlwdGlvbi5iaXRtYXBXcmFwUyA9IGdUaWxlTW9kZXNbbVRpbGVYXTsKKyAgICAgICAgZGVzY3JpcHRpb24uYml0bWFwV3JhcFQgPSBnVGlsZU1vZGVzW21UaWxlWV07CisgICAgICAgIG1XcmFwUyA9IEdMX0NMQU1QX1RPX0VER0U7CisgICAgICAgIG1XcmFwVCA9IEdMX0NMQU1QX1RPX0VER0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVdyYXBTID0gZ1RpbGVNb2Rlc1ttVGlsZVhdOworICAgICAgICBtV3JhcFQgPSBnVGlsZU1vZGVzW21UaWxlWV07CisgICAgfQorfQorCit2b2lkIFNraWFCaXRtYXBTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworICAgIEdMdWludCB0ZXh0dXJlU2xvdCA9ICgqdGV4dHVyZVVuaXQpKys7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNNYXBbdGV4dHVyZVNsb3RdKTsKKworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtVGV4dHVyZTsKKyAgICBtVGV4dHVyZSA9IE5VTEw7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIG1hdDQgdGV4dHVyZVRyYW5zZm9ybTsKKyAgICBjb21wdXRlU2NyZWVuU3BhY2VNYXRyaXgodGV4dHVyZVRyYW5zZm9ybSwgbW9kZWxWaWV3KTsKKworICAgIC8vIFVuaWZvcm1zCisgICAgYmluZFRleHR1cmUodGV4dHVyZS0+aWQsIG1XcmFwUywgbVdyYXBULCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtMWkocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiYml0bWFwU2FtcGxlciIpLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oInRleHR1cmVUcmFuc2Zvcm0iKSwgMSwKKyAgICAgICAgICAgIEdMX0ZBTFNFLCAmdGV4dHVyZVRyYW5zZm9ybS5kYXRhWzBdKTsKKyAgICBnbFVuaWZvcm0yZihwcm9ncmFtLT5nZXRVbmlmb3JtKCJ0ZXh0dXJlRGltZW5zaW9uIiksIDEuMGYgLyB3aWR0aCwgMS4wZiAvIGhlaWdodCk7Cit9CisKK3ZvaWQgU2tpYUJpdG1hcFNoYWRlcjo6dXBkYXRlVHJhbnNmb3JtcyhQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCkgeworICAgIG1hdDQgdGV4dHVyZVRyYW5zZm9ybTsKKyAgICBjb21wdXRlU2NyZWVuU3BhY2VNYXRyaXgodGV4dHVyZVRyYW5zZm9ybSwgbW9kZWxWaWV3KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgidGV4dHVyZVRyYW5zZm9ybSIpLCAxLAorICAgICAgICAgICAgR0xfRkFMU0UsICZ0ZXh0dXJlVHJhbnNmb3JtLmRhdGFbMF0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMaW5lYXIgZ3JhZGllbnQgc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIHRvVW5pdE1hdHJpeChjb25zdCBTa1BvaW50IHB0c1syXSwgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIFNrVmVjdG9yIHZlYyA9IHB0c1sxXSAtIHB0c1swXTsKKyAgICBjb25zdCBmbG9hdCBtYWcgPSB2ZWMubGVuZ3RoKCk7CisgICAgY29uc3QgZmxvYXQgaW52ID0gbWFnID8gMS4wZiAvIG1hZyA6IDA7CisKKyAgICB2ZWMuc2NhbGUoaW52KTsKKyAgICBtYXRyaXgtPnNldFNpbkNvcygtdmVjLmZZLCB2ZWMuZlgsIHB0c1swXS5mWCwgcHRzWzBdLmZZKTsKKyAgICBtYXRyaXgtPnBvc3RUcmFuc2xhdGUoLXB0c1swXS5mWCwgLXB0c1swXS5mWSk7CisgICAgbWF0cml4LT5wb3N0U2NhbGUoaW52LCBpbnYpOworfQorCitTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6OlNraWFMaW5lYXJHcmFkaWVudFNoYWRlcihmbG9hdCogYm91bmRzLCB1aW50MzJfdCogY29sb3JzLAorICAgICAgICBmbG9hdCogcG9zaXRpb25zLCBpbnQgY291bnQsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlTW9kZSwKKyAgICAgICAgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk6CisgICAgICAgIFNraWFTaGFkZXIoa0xpbmVhckdyYWRpZW50LCBrZXksIHRpbGVNb2RlLCB0aWxlTW9kZSwgbWF0cml4LCBibGVuZCksCisgICAgICAgIG1Cb3VuZHMoYm91bmRzKSwgbUNvbG9ycyhjb2xvcnMpLCBtUG9zaXRpb25zKHBvc2l0aW9ucyksIG1Db3VudChjb3VudCkgeworICAgIFNrUG9pbnQgcG9pbnRzWzJdOworICAgIHBvaW50c1swXS5zZXQoYm91bmRzWzBdLCBib3VuZHNbMV0pOworICAgIHBvaW50c1sxXS5zZXQoYm91bmRzWzJdLCBib3VuZHNbM10pOworCisgICAgU2tNYXRyaXggdW5pdE1hdHJpeDsKKyAgICB0b1VuaXRNYXRyaXgocG9pbnRzLCAmdW5pdE1hdHJpeCk7CisgICAgbVVuaXRNYXRyaXgubG9hZCh1bml0TWF0cml4KTsKKworICAgIHVwZGF0ZUxvY2FsTWF0cml4KG1hdHJpeCk7Cit9CisKK1NraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6flNraWFMaW5lYXJHcmFkaWVudFNoYWRlcigpIHsKKyAgICBkZWxldGVbXSBtQm91bmRzOworICAgIGRlbGV0ZVtdIG1Db2xvcnM7CisgICAgZGVsZXRlW10gbVBvc2l0aW9uczsKK30KKwordm9pZCBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCA9IHRydWU7CisgICAgZGVzY3JpcHRpb24uZ3JhZGllbnRUeXBlID0gUHJvZ3JhbURlc2NyaXB0aW9uOjprR3JhZGllbnRMaW5lYXI7Cit9CisKK3ZvaWQgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LAorICAgICAgICBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsIEdMdWludCogdGV4dHVyZVVuaXQpIHsKKyAgICBHTHVpbnQgdGV4dHVyZVNsb3QgPSAoKnRleHR1cmVVbml0KSsrOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzTWFwW3RleHR1cmVTbG90XSk7CisKKyAgICBUZXh0dXJlKiB0ZXh0dXJlID0gbUdyYWRpZW50Q2FjaGUtPmdldChtS2V5KTsKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgdGV4dHVyZSA9IG1HcmFkaWVudENhY2hlLT5hZGRMaW5lYXJHcmFkaWVudChtS2V5LCBtQ29sb3JzLCBtUG9zaXRpb25zLCBtQ291bnQsIG1UaWxlWCk7CisgICAgfQorCisgICAgbWF0NCBzY3JlZW5TcGFjZTsKKyAgICBjb21wdXRlU2NyZWVuU3BhY2VNYXRyaXgoc2NyZWVuU3BhY2UsIG1vZGVsVmlldyk7CisKKyAgICAvLyBVbmlmb3JtcworICAgIGJpbmRUZXh0dXJlKHRleHR1cmUtPmlkLCBnVGlsZU1vZGVzW21UaWxlWF0sIGdUaWxlTW9kZXNbbVRpbGVZXSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybTFpKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50U2FtcGxlciIpLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oInNjcmVlblNwYWNlIiksIDEsIEdMX0ZBTFNFLCAmc2NyZWVuU3BhY2UuZGF0YVswXSk7Cit9CisKK3ZvaWQgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOjp1cGRhdGVUcmFuc2Zvcm1zKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90KSB7CisgICAgbWF0NCBzY3JlZW5TcGFjZTsKKyAgICBjb21wdXRlU2NyZWVuU3BhY2VNYXRyaXgoc2NyZWVuU3BhY2UsIG1vZGVsVmlldyk7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oInNjcmVlblNwYWNlIiksIDEsIEdMX0ZBTFNFLCAmc2NyZWVuU3BhY2UuZGF0YVswXSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENpcmN1bGFyIGdyYWRpZW50IHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCB0b0NpcmN1bGFyVW5pdE1hdHJpeChjb25zdCBmbG9hdCB4LCBjb25zdCBmbG9hdCB5LCBjb25zdCBmbG9hdCByYWRpdXMsCisgICAgICAgIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBjb25zdCBmbG9hdCBpbnYgPSAxLjBmIC8gcmFkaXVzOworICAgIG1hdHJpeC0+c2V0VHJhbnNsYXRlKC14LCAteSk7CisgICAgbWF0cml4LT5wb3N0U2NhbGUoaW52LCBpbnYpOworfQorCitTa2lhQ2lyY3VsYXJHcmFkaWVudFNoYWRlcjo6U2tpYUNpcmN1bGFyR3JhZGllbnRTaGFkZXIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLAorICAgICAgICB1aW50MzJfdCogY29sb3JzLCBmbG9hdCogcG9zaXRpb25zLCBpbnQgY291bnQsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlTW9kZSwKKyAgICAgICAgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk6CisgICAgICAgIFNraWFTd2VlcEdyYWRpZW50U2hhZGVyKGtDaXJjdWxhckdyYWRpZW50LCB4LCB5LCBjb2xvcnMsIHBvc2l0aW9ucywgY291bnQsIGtleSwKKyAgICAgICAgICAgICAgICB0aWxlTW9kZSwgbWF0cml4LCBibGVuZCkgeworICAgIFNrTWF0cml4IHVuaXRNYXRyaXg7CisgICAgdG9DaXJjdWxhclVuaXRNYXRyaXgoeCwgeSwgcmFkaXVzLCAmdW5pdE1hdHJpeCk7CisgICAgbVVuaXRNYXRyaXgubG9hZCh1bml0TWF0cml4KTsKKworICAgIHVwZGF0ZUxvY2FsTWF0cml4KG1hdHJpeCk7Cit9CisKK3ZvaWQgU2tpYUNpcmN1bGFyR3JhZGllbnRTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCA9IHRydWU7CisgICAgZGVzY3JpcHRpb24uZ3JhZGllbnRUeXBlID0gUHJvZ3JhbURlc2NyaXB0aW9uOjprR3JhZGllbnRDaXJjdWxhcjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3dlZXAgZ3JhZGllbnQgc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIHRvU3dlZXBVbml0TWF0cml4KGNvbnN0IGZsb2F0IHgsIGNvbnN0IGZsb2F0IHksIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtYXRyaXgtPnNldFRyYW5zbGF0ZSgteCwgLXkpOworfQorCitTa2lhU3dlZXBHcmFkaWVudFNoYWRlcjo6U2tpYVN3ZWVwR3JhZGllbnRTaGFkZXIoZmxvYXQgeCwgZmxvYXQgeSwgdWludDMyX3QqIGNvbG9ycywKKyAgICAgICAgZmxvYXQqIHBvc2l0aW9ucywgaW50IGNvdW50LCBTa1NoYWRlcioga2V5LCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKToKKyAgICAgICAgU2tpYVNoYWRlcihrU3dlZXBHcmFkaWVudCwga2V5LCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlLAorICAgICAgICAgICAgICAgIFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1vZGUsIG1hdHJpeCwgYmxlbmQpLAorICAgICAgICBtQ29sb3JzKGNvbG9ycyksIG1Qb3NpdGlvbnMocG9zaXRpb25zKSwgbUNvdW50KGNvdW50KSB7CisgICAgU2tNYXRyaXggdW5pdE1hdHJpeDsKKyAgICB0b1N3ZWVwVW5pdE1hdHJpeCh4LCB5LCAmdW5pdE1hdHJpeCk7CisgICAgbVVuaXRNYXRyaXgubG9hZCh1bml0TWF0cml4KTsKKworICAgIHVwZGF0ZUxvY2FsTWF0cml4KG1hdHJpeCk7Cit9CisKK1NraWFTd2VlcEdyYWRpZW50U2hhZGVyOjpTa2lhU3dlZXBHcmFkaWVudFNoYWRlcihUeXBlIHR5cGUsIGZsb2F0IHgsIGZsb2F0IHksIHVpbnQzMl90KiBjb2xvcnMsCisgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlLAorICAgICAgICBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKToKKyAgICAgICAgU2tpYVNoYWRlcih0eXBlLCBrZXksIHRpbGVNb2RlLCB0aWxlTW9kZSwgbWF0cml4LCBibGVuZCksCisgICAgICAgIG1Db2xvcnMoY29sb3JzKSwgbVBvc2l0aW9ucyhwb3NpdGlvbnMpLCBtQ291bnQoY291bnQpIHsKK30KKworU2tpYVN3ZWVwR3JhZGllbnRTaGFkZXI6On5Ta2lhU3dlZXBHcmFkaWVudFNoYWRlcigpIHsKKyAgICBkZWxldGVbXSBtQ29sb3JzOworICAgIGRlbGV0ZVtdIG1Qb3NpdGlvbnM7Cit9CisKK3ZvaWQgU2tpYVN3ZWVwR3JhZGllbnRTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCA9IHRydWU7CisgICAgZGVzY3JpcHRpb24uZ3JhZGllbnRUeXBlID0gUHJvZ3JhbURlc2NyaXB0aW9uOjprR3JhZGllbnRTd2VlcDsKK30KKwordm9pZCBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LCBHTHVpbnQqIHRleHR1cmVVbml0KSB7CisgICAgR0x1aW50IHRleHR1cmVTbG90ID0gKCp0ZXh0dXJlVW5pdCkrKzsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c01hcFt0ZXh0dXJlU2xvdF0pOworCisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG1HcmFkaWVudENhY2hlLT5nZXQobUtleSk7CisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIHRleHR1cmUgPSBtR3JhZGllbnRDYWNoZS0+YWRkTGluZWFyR3JhZGllbnQobUtleSwgbUNvbG9ycywgbVBvc2l0aW9ucywgbUNvdW50KTsKKyAgICB9CisKKyAgICBtYXQ0IHNjcmVlblNwYWNlOworICAgIGNvbXB1dGVTY3JlZW5TcGFjZU1hdHJpeChzY3JlZW5TcGFjZSwgbW9kZWxWaWV3KTsKKworICAgIC8vIFVuaWZvcm1zCisgICAgYmluZFRleHR1cmUodGV4dHVyZS0+aWQsIGdUaWxlTW9kZXNbbVRpbGVYXSwgZ1RpbGVNb2Rlc1ttVGlsZVldLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtMWkocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnRTYW1wbGVyIiksIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2NyZWVuU3BhY2UiKSwgMSwgR0xfRkFMU0UsICZzY3JlZW5TcGFjZS5kYXRhWzBdKTsKK30KKwordm9pZCBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcjo6dXBkYXRlVHJhbnNmb3JtcyhQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCkgeworICAgIG1hdDQgc2NyZWVuU3BhY2U7CisgICAgY29tcHV0ZVNjcmVlblNwYWNlTWF0cml4KHNjcmVlblNwYWNlLCBtb2RlbFZpZXcpOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJzY3JlZW5TcGFjZSIpLCAxLCBHTF9GQUxTRSwgJnNjcmVlblNwYWNlLmRhdGFbMF0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb21wb3NlIHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQ29tcG9zZVNoYWRlcjo6U2tpYUNvbXBvc2VTaGFkZXIoU2tpYVNoYWRlciogZmlyc3QsIFNraWFTaGFkZXIqIHNlY29uZCwKKyAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBTa1NoYWRlcioga2V5KToKKyAgICAgICAgU2tpYVNoYWRlcihrQ29tcG9zZSwga2V5LCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlLCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlLAorICAgICAgICBOVUxMLCBmaXJzdC0+YmxlbmQoKSB8fCBzZWNvbmQtPmJsZW5kKCkpLCBtRmlyc3QoZmlyc3QpLCBtU2Vjb25kKHNlY29uZCksIG1Nb2RlKG1vZGUpIHsKK30KKwordm9pZCBTa2lhQ29tcG9zZVNoYWRlcjo6c2V0KFRleHR1cmVDYWNoZSogdGV4dHVyZUNhY2hlLCBHcmFkaWVudENhY2hlKiBncmFkaWVudENhY2hlKSB7CisgICAgU2tpYVNoYWRlcjo6c2V0KHRleHR1cmVDYWNoZSwgZ3JhZGllbnRDYWNoZSk7CisgICAgbUZpcnN0LT5zZXQodGV4dHVyZUNhY2hlLCBncmFkaWVudENhY2hlKTsKKyAgICBtU2Vjb25kLT5zZXQodGV4dHVyZUNhY2hlLCBncmFkaWVudENhY2hlKTsKK30KKwordm9pZCBTa2lhQ29tcG9zZVNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIG1GaXJzdC0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIGV4dGVuc2lvbnMpOworICAgIG1TZWNvbmQtPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBleHRlbnNpb25zKTsKKyAgICBpZiAobUZpcnN0LT50eXBlKCkgPT0ga0JpdG1hcCkgeworICAgICAgICBkZXNjcmlwdGlvbi5pc0JpdG1hcEZpcnN0ID0gdHJ1ZTsKKyAgICB9CisgICAgZGVzY3JpcHRpb24uc2hhZGVyc01vZGUgPSBtTW9kZTsKK30KKwordm9pZCBTa2lhQ29tcG9zZVNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LCBHTHVpbnQqIHRleHR1cmVVbml0KSB7CisgICAgbUZpcnN0LT5zZXR1cFByb2dyYW0ocHJvZ3JhbSwgbW9kZWxWaWV3LCBzbmFwc2hvdCwgdGV4dHVyZVVuaXQpOworICAgIG1TZWNvbmQtPnNldHVwUHJvZ3JhbShwcm9ncmFtLCBtb2RlbFZpZXcsIHNuYXBzaG90LCB0ZXh0dXJlVW5pdCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1NraWFTaGFkZXIuaCBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2NWU2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfU0tJQV9TSEFERVJfSAorI2RlZmluZSBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKKworI2luY2x1ZGUgPFNrU2hhZGVyLmg+CisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hlLmgiCisjaW5jbHVkZSAiR3JhZGllbnRDYWNoZS5oIgorI2luY2x1ZGUgIlNuYXBzaG90LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBSZXByZXNlbnRzIGEgU2tpYSBzaGFkZXIuIEEgc2hhZGVyIHdpbGwgbW9kaWZ5IHRoZSBHTCBjb250ZXh0IGFuZCBhY3RpdmUKKyAqIHByb2dyYW0gdG8gcmVjcmVhdGUgdGhlIG9yaWdpbmFsIGVmZmVjdC4KKyAqLworc3RydWN0IFNraWFTaGFkZXIgeworICAgIC8qKgorICAgICAqIFR5cGUgb2YgU2tpYSBzaGFkZXIgaW4gdXNlLgorICAgICAqLworICAgIGVudW0gVHlwZSB7CisgICAgICAgIGtOb25lLAorICAgICAgICBrQml0bWFwLAorICAgICAgICBrTGluZWFyR3JhZGllbnQsCisgICAgICAgIGtDaXJjdWxhckdyYWRpZW50LAorICAgICAgICBrU3dlZXBHcmFkaWVudCwKKyAgICAgICAga0NvbXBvc2UKKyAgICB9OworCisgICAgU2tpYVNoYWRlcihUeXBlIHR5cGUsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVZLAorICAgICAgICAgICAgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk7CisgICAgdmlydHVhbCB+U2tpYVNoYWRlcigpOworCisgICAgdmlydHVhbCB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKworICAgIGlubGluZSBib29sIGJsZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsZW5kOworICAgIH0KKworICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UeXBlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXQoVGV4dHVyZUNhY2hlKiB0ZXh0dXJlQ2FjaGUsIEdyYWRpZW50Q2FjaGUqIGdyYWRpZW50Q2FjaGUpIHsKKyAgICAgICAgbVRleHR1cmVDYWNoZSA9IHRleHR1cmVDYWNoZTsKKyAgICAgICAgbUdyYWRpZW50Q2FjaGUgPSBncmFkaWVudENhY2hlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVUcmFuc2Zvcm1zKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCkgeworICAgIH0KKworICAgIHZvaWQgc2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICAgICAgdXBkYXRlTG9jYWxNYXRyaXgobWF0cml4KTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUxvY2FsTWF0cml4KGNvbnN0IFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICAgICAgaWYgKG1hdHJpeCkgeworICAgICAgICAgICAgbWF0NCBsb2NhbE1hdHJpeCgqbWF0cml4KTsKKyAgICAgICAgICAgIG1TaGFkZXJNYXRyaXgubG9hZEludmVyc2UobG9jYWxNYXRyaXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNoYWRlck1hdHJpeC5sb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY29tcHV0ZVNjcmVlblNwYWNlTWF0cml4KG1hdDQmIHNjcmVlblNwYWNlLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcpOworCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIHZvaWQgYmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQpOworCisgICAgVHlwZSBtVHlwZTsKKyAgICBTa1NoYWRlciogbUtleTsKKyAgICBTa1NoYWRlcjo6VGlsZU1vZGUgbVRpbGVYOworICAgIFNrU2hhZGVyOjpUaWxlTW9kZSBtVGlsZVk7CisgICAgYm9vbCBtQmxlbmQ7CisKKyAgICBUZXh0dXJlQ2FjaGUqIG1UZXh0dXJlQ2FjaGU7CisgICAgR3JhZGllbnRDYWNoZSogbUdyYWRpZW50Q2FjaGU7CisKKyAgICBtYXQ0IG1Vbml0TWF0cml4OworICAgIG1hdDQgbVNoYWRlck1hdHJpeDsKK307IC8vIHN0cnVjdCBTa2lhU2hhZGVyCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW1wbGVtZW50YXRpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogQSBzaGFkZXIgdGhhdCBkcmF3cyBhIGJpdG1hcC4KKyAqLworc3RydWN0IFNraWFCaXRtYXBTaGFkZXI6IHB1YmxpYyBTa2lhU2hhZGVyIHsKKyAgICBTa2lhQml0bWFwU2hhZGVyKFNrQml0bWFwKiBiaXRtYXAsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWCwKKyAgICAgICAgICAgIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWSwgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCk7CisgICAgdm9pZCB1cGRhdGVUcmFuc2Zvcm1zKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90KTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGZvciBuID09IDAuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNQb3dlck9mVHdvKHVuc2lnbmVkIGludCBuKSB7CisgICAgICAgIHJldHVybiAhKG4gJiAobiAtIDEpKTsKKyAgICB9CisKKyAgICBTa0JpdG1hcCogbUJpdG1hcDsKKyAgICBjb25zdCBUZXh0dXJlKiBtVGV4dHVyZTsKKyAgICBHTGVudW0gbVdyYXBTOworICAgIEdMZW51bSBtV3JhcFQ7Cit9OyAvLyBzdHJ1Y3QgU2tpYUJpdG1hcFNoYWRlcgorCisvKioKKyAqIEEgc2hhZGVyIHRoYXQgZHJhd3MgYSBsaW5lYXIgZ3JhZGllbnQuCisgKi8KK3N0cnVjdCBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6IHB1YmxpYyBTa2lhU2hhZGVyIHsKKyAgICBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIoZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywgZmxvYXQqIHBvc2l0aW9ucywgaW50IGNvdW50LAorICAgICAgICAgICAgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlLCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKTsKKyAgICB+U2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKCk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCk7CisgICAgdm9pZCB1cGRhdGVUcmFuc2Zvcm1zKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90KTsKKworcHJpdmF0ZToKKyAgICBmbG9hdCogbUJvdW5kczsKKyAgICB1aW50MzJfdCogbUNvbG9yczsKKyAgICBmbG9hdCogbVBvc2l0aW9uczsKKyAgICBpbnQgbUNvdW50OworfTsgLy8gc3RydWN0IFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcgorCisvKioKKyAqIEEgc2hhZGVyIHRoYXQgZHJhd3MgYSBzd2VlcCBncmFkaWVudC4KKyAqLworc3RydWN0IFNraWFTd2VlcEdyYWRpZW50U2hhZGVyOiBwdWJsaWMgU2tpYVNoYWRlciB7CisgICAgU2tpYVN3ZWVwR3JhZGllbnRTaGFkZXIoZmxvYXQgeCwgZmxvYXQgeSwgdWludDMyX3QqIGNvbG9ycywgZmxvYXQqIHBvc2l0aW9ucywgaW50IGNvdW50LAorICAgICAgICAgICAgU2tTaGFkZXIqIGtleSwgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk7CisgICAgflNraWFTd2VlcEdyYWRpZW50U2hhZGVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKyAgICB2b2lkIHVwZGF0ZVRyYW5zZm9ybXMoUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QpOworCitwcm90ZWN0ZWQ6CisgICAgU2tpYVN3ZWVwR3JhZGllbnRTaGFkZXIoVHlwZSB0eXBlLCBmbG9hdCB4LCBmbG9hdCB5LCB1aW50MzJfdCogY29sb3JzLCBmbG9hdCogcG9zaXRpb25zLAorICAgICAgICAgICAgaW50IGNvdW50LCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZU1vZGUsIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworCisgICAgdWludDMyX3QqIG1Db2xvcnM7CisgICAgZmxvYXQqIG1Qb3NpdGlvbnM7CisgICAgaW50IG1Db3VudDsKK307IC8vIHN0cnVjdCBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcgorCisvKioKKyAqIEEgc2hhZGVyIHRoYXQgZHJhd3MgYSBjaXJjdWxhciBncmFkaWVudC4KKyAqLworc3RydWN0IFNraWFDaXJjdWxhckdyYWRpZW50U2hhZGVyOiBwdWJsaWMgU2tpYVN3ZWVwR3JhZGllbnRTaGFkZXIgeworICAgIFNraWFDaXJjdWxhckdyYWRpZW50U2hhZGVyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywgdWludDMyX3QqIGNvbG9ycywgZmxvYXQqIHBvc2l0aW9ucywKKyAgICAgICAgICAgIGludCBjb3VudCwgU2tTaGFkZXIqIGtleSxTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZU1vZGUsIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKK307IC8vIHN0cnVjdCBTa2lhQ2lyY3VsYXJHcmFkaWVudFNoYWRlcgorCisvKioKKyAqIEEgc2hhZGVyIHRoYXQgZHJhd3MgdHdvIHNoYWRlcnMsIGNvbXBvc2l0ZWQgd2l0aCBhbiB4ZmVybW9kZS4KKyAqLworc3RydWN0IFNraWFDb21wb3NlU2hhZGVyOiBwdWJsaWMgU2tpYVNoYWRlciB7CisgICAgU2tpYUNvbXBvc2VTaGFkZXIoU2tpYVNoYWRlciogZmlyc3QsIFNraWFTaGFkZXIqIHNlY29uZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBTa1NoYWRlcioga2V5KTsKKworICAgIHZvaWQgc2V0KFRleHR1cmVDYWNoZSogdGV4dHVyZUNhY2hlLCBHcmFkaWVudENhY2hlKiBncmFkaWVudENhY2hlKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKworcHJpdmF0ZToKKyAgICBTa2lhU2hhZGVyKiBtRmlyc3Q7CisgICAgU2tpYVNoYWRlciogbVNlY29uZDsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1Nb2RlOworfTsgLy8gc3RydWN0IFNraWFDb21wb3NlU2hhZGVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9TS0lBX1NIQURFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU25hcHNob3QuaCBiL2xpYnMvaHd1aS9TbmFwc2hvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzRiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU25hcHNob3QuaApAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9TTkFQU0hPVF9ICisjZGVmaW5lIEFORFJPSURfVUlfU05BUFNIT1RfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrUmVnaW9uLmg+CisKKyNpbmNsdWRlICJMYXllci5oIgorI2luY2x1ZGUgIk1hdHJpeC5oIgorI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgc25hcHNob3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbmRlcmluZworICogc3VyZmFjZS4gQSBzbmFwc2hvdCBpcyB1c3VhbGx5IGNyZWF0ZWQgd2hlbmV2ZXIgdGhlIHVzZXIgY2FsbHMgc2F2ZSgpCisgKiBhbmQgZGlzY2FyZGVkIHdoZW4gdGhlIHVzZXIgY2FsbHMgcmVzdG9yZSgpLiBPbmNlIGEgc25hcHNob3QgaXMgY3JlYXRlZCwKKyAqIGl0IGNhbiBob2xkIGluZm9ybWF0aW9uIGZvciBkZWZlcnJlZCByZW5kZXJpbmcuCisgKgorICogRWFjaCBzbmFwc2hvdCBoYXMgYSBsaW5rIHRvIGEgcHJldmlvdXMgc25hcHNob3QsIGluZGljYXRpbmcgdGhlIHByZXZpb3VzCisgKiBzdGF0ZSBvZiB0aGUgcmVuZGVyZXIuCisgKi8KK2NsYXNzIFNuYXBzaG90OiBwdWJsaWMgTGlnaHRSZWZCYXNlPFNuYXBzaG90PiB7CitwdWJsaWM6CisgICAgU25hcHNob3QoKTogZmxhZ3MoMCksIHByZXZpb3VzKE5VTEwpLCBsYXllcihOVUxMKSwgZmJvKDApIHsKKyAgICAgICAgdHJhbnNmb3JtID0gJm1UcmFuc2Zvcm1Sb290OworICAgICAgICBjbGlwUmVjdCA9ICZtQ2xpcFJlY3RSb290OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllcyB0aGUgc3BlY2lmaWVkIHNuYXBzaG90LyBUaGUgc3BlY2lmaWVkIHNuYXBzaG90IGlzIHN0b3JlZCBhcworICAgICAqIHRoZSBwcmV2aW91cyBzbmFwc2hvdC4KKyAgICAgKi8KKyAgICBTbmFwc2hvdChjb25zdCBzcDxTbmFwc2hvdD4mIHMsIGludCBzYXZlRmxhZ3MpOgorICAgICAgICAgICAgZmxhZ3MoMCksIHByZXZpb3VzKHMpLCBsYXllcihOVUxMKSwKKyAgICAgICAgICAgIGZibyhzLT5mYm8pLCB2aWV3cG9ydChzLT52aWV3cG9ydCksIGhlaWdodChzLT5oZWlnaHQpIHsKKyAgICAgICAgaWYgKHNhdmVGbGFncyAmIFNrQ2FudmFzOjprTWF0cml4X1NhdmVGbGFnKSB7CisgICAgICAgICAgICBtVHJhbnNmb3JtUm9vdC5sb2FkKCpzLT50cmFuc2Zvcm0pOworICAgICAgICAgICAgdHJhbnNmb3JtID0gJm1UcmFuc2Zvcm1Sb290OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhbnNmb3JtID0gcy0+dHJhbnNmb3JtOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNhdmVGbGFncyAmIFNrQ2FudmFzOjprQ2xpcF9TYXZlRmxhZykgeworICAgICAgICAgICAgbUNsaXBSZWN0Um9vdC5zZXQoKnMtPmNsaXBSZWN0KTsKKyAgICAgICAgICAgIGNsaXBSZWN0ID0gJm1DbGlwUmVjdFJvb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGlwUmVjdCA9IHMtPmNsaXBSZWN0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzLT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0NsaXBTZXQpICYmCisgICAgICAgICAgICAgICAgIShzLT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwKSkgeworICAgICAgICAgICAgbUxvY2FsQ2xpcC5zZXQocy0+bUxvY2FsQ2xpcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZhcmlvdXMgZmxhZ3Mgc2V0IG9uICNmbGFncy4KKyAgICAgKi8KKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBjbGlwIHJlZ2lvbiB3YXMgbW9kaWZpZWQuIFdoZW4gdGhpcworICAgICAgICAgKiBzbmFwc2hvdCBpcyByZXN0b3JlZCBzbyBtdXN0IHRoZSBjbGlwLgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdDbGlwU2V0ID0gMHgxLAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhpcyBzbmFwc2hvdCB3YXMgY3JlYXRlZCB3aGVuIHNhdmluZworICAgICAgICAgKiBhIG5ldyBsYXllci4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnSXNMYXllciA9IDB4MiwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoaXMgc25hcHNob3QgaXMgYSBzcGVjaWFsIHR5cGUgb2YgbGF5ZXIKKyAgICAgICAgICogYmFja2VkIGJ5IGFuIEZCTy4gVGhpcyBmbGFnIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiB0aGUKKyAgICAgICAgICogZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgYWxzbyBzZXQuCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0lzRmJvTGF5ZXIgPSAweDQsCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbG9jYWwgY2xpcCBzaG91bGQgYmUgcmVjb21wdXRlZC4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnRGlydHlMb2NhbENsaXAgPSAweDgsCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIHNuYXBzaG90IGhhcyBjaGFuZ2VkIHRoZSBvcnRobyBtYXRyaXguCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0RpcnR5T3J0aG8gPSAweDEwLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgY3VycmVudCBjbGlwIHdpdGggdGhlIG5ldyBjbGlwIHJlY3RhbmdsZSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbi4gVGhlIHNwZWNpZmllZCByZWN0YW5nbGUgaXMgdHJhbnNmb3JtZWQKKyAgICAgKiBieSB0aGlzIHNuYXBzaG90J3MgdHJhc25mb3JtYXRpb24uCisgICAgICovCisgICAgYm9vbCBjbGlwKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIFNrUmVnaW9uOjpPcCBvcCA9IFNrUmVnaW9uOjprSW50ZXJzZWN0X09wKSB7CisgICAgICAgIFJlY3QgcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICB0cmFuc2Zvcm0tPm1hcFJlY3Qocik7CisgICAgICAgIHJldHVybiBjbGlwVHJhbnNmb3JtZWQociwgb3ApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBjdXJyZW50IGNsaXAgd2l0aCB0aGUgbmV3IGNsaXAgcmVjdGFuZ2xlIGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLiBUaGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpcyBjb25zaWRlcmVkCisgICAgICogYWxyZWFkeSB0cmFuc2Zvcm1lZC4KKyAgICAgKi8KKyAgICBib29sIGNsaXBUcmFuc2Zvcm1lZChjb25zdCBSZWN0JiByLCBTa1JlZ2lvbjo6T3Agb3AgPSBTa1JlZ2lvbjo6a0ludGVyc2VjdF9PcCkgeworICAgICAgICBib29sIGNsaXBwZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBOT1RFOiBUaGUgdW5pbXBsZW1lbnRlZCBvcGVyYXRpb25zIHJlcXVpcmUgc3VwcG9ydCBmb3IgcmVnaW9ucworICAgICAgICAvLyBTdXBwb3J0aW5nIHJlZ2lvbnMgd291bGQgcmVxdWlyZSB1c2luZyBhIHN0ZW5jaWwgYnVmZmVyIGluc3RlYWQKKyAgICAgICAgLy8gb2YgdGhlIHNjaXNzb3IuIFRoZSBzdGVuY2lsIGJ1ZmZlciBpdHNlbGYgaXMgbm90IHRvbyBleHBlbnNpdmUKKyAgICAgICAgLy8gKG1lbW9yeSBjb3N0IGV4Y2x1ZGVkKSBidXQgb24gZmlsbHJhdGUgbGltaXRlZCBkZXZpY2VzLCBtYW5hZ2luZworICAgICAgICAvLyB0aGUgc3RlbmNpbCBtaWdodCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIHRoZSBmcmFtZXJhdGUuCisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtEaWZmZXJlbmNlX09wOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a0ludGVyc2VjdF9PcDoKKyAgICAgICAgICAgICAgICBjbGlwcGVkID0gY2xpcFJlY3QtPmludGVyc2VjdChyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtVbmlvbl9PcDoKKyAgICAgICAgICAgICAgICBjbGlwcGVkID0gY2xpcFJlY3QtPnVuaW9uV2l0aChyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtYT1JfT3A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprUmV2ZXJzZURpZmZlcmVuY2VfT3A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprUmVwbGFjZV9PcDoKKyAgICAgICAgICAgICAgICBjbGlwUmVjdC0+c2V0KHIpOworICAgICAgICAgICAgICAgIGNsaXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsaXBwZWQpIHsKKyAgICAgICAgICAgIGNsaXBSZWN0LT5zbmFwVG9QaXhlbEJvdW5kYXJpZXMoKTsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0NsaXBTZXQgfCBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjbGlwcGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgY2xpcC4KKyAgICAgKi8KKyAgICB2b2lkIHNldENsaXAoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIGNsaXBSZWN0LT5zZXQobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnQ2xpcFNldCB8IFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgIH0KKworICAgIGNvbnN0IFJlY3QmIGdldExvY2FsQ2xpcCgpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXApIHsKKyAgICAgICAgICAgIG1hdDQgaW52ZXJzZTsKKyAgICAgICAgICAgIGludmVyc2UubG9hZEludmVyc2UoKnRyYW5zZm9ybSk7CisKKyAgICAgICAgICAgIG1Mb2NhbENsaXAuc2V0KCpjbGlwUmVjdCk7CisgICAgICAgICAgICBpbnZlcnNlLm1hcFJlY3QobUxvY2FsQ2xpcCk7CisKKyAgICAgICAgICAgIGZsYWdzICY9IH5TbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUxvY2FsQ2xpcDsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0VHJhbnNmb3JtKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgdHJhbnNmb3JtID0gJm1UcmFuc2Zvcm1Sb290OworICAgICAgICB0cmFuc2Zvcm0tPmxvYWRUcmFuc2xhdGUoeCwgeSwgeik7CisgICAgfQorCisgICAgdm9pZCByZXNldENsaXAoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIGNsaXBSZWN0ID0gJm1DbGlwUmVjdFJvb3Q7CisgICAgICAgIGNsaXBSZWN0LT5zZXQobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnQ2xpcFNldCB8IFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpcnR5IGZsYWdzLgorICAgICAqLworICAgIGludCBmbGFnczsKKworICAgIC8qKgorICAgICAqIFByZXZpb3VzIHNuYXBzaG90LgorICAgICAqLworICAgIHNwPFNuYXBzaG90PiBwcmV2aW91czsKKworICAgIC8qKgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBMYXllciogbGF5ZXI7CisKKyAgICAvKioKKyAgICAgKiBPbmx5IHNldCB3aGVuIHRoZSBmbGFnIGtGbGFnSXNGYm9MYXllciBpcyBzZXQuCisgICAgICovCisgICAgR0x1aW50IGZibzsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgdmlld3BvcnQuCisgICAgICovCisgICAgUmVjdCB2aWV3cG9ydDsKKworICAgIC8qKgorICAgICAqIEhlaWdodCBvZiB0aGUgZnJhbWVidWZmZXIgdGhlIHNuYXBzaG90IGlzIHJlbmRlcmluZyBpbnRvLgorICAgICAqLworICAgIGludCBoZWlnaHQ7CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyB0aGUgcHJldmlvdXMgb3J0aG8gbWF0cml4LgorICAgICAqLworICAgIG1hdDQgb3J0aG9NYXRyaXg7CisKKyAgICAvKioKKyAgICAgKiBMb2NhbCB0cmFuc2Zvcm1hdGlvbi4gSG9sZHMgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24sIHNjYWxlIGFuZAorICAgICAqIHJvdGF0aW9uIHZhbHVlcy4KKyAgICAgKi8KKyAgICBtYXQ0KiB0cmFuc2Zvcm07CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGNsaXAgcmVnaW9uLiBUaGUgY2xpcCBpcyBzdG9yZWQgaW4gY2FudmFzLXNwYWNlIGNvb3JkaW5hdGVzLAorICAgICAqIChzY3JlZW4tc3BhY2UgY29vcmRpbmF0ZXMgaW4gdGhlIHJlZ3VsYXIgY2FzZS4pCisgICAgICovCisgICAgUmVjdCogY2xpcFJlY3Q7CisKK3ByaXZhdGU6CisgICAgbWF0NCBtVHJhbnNmb3JtUm9vdDsKKyAgICBSZWN0IG1DbGlwUmVjdFJvb3Q7CisgICAgUmVjdCBtTG9jYWxDbGlwOworCit9OyAvLyBjbGFzcyBTbmFwc2hvdAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfU05BUFNIT1RfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuY3BwIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTQyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiVGV4dERyb3BTaGFkb3dDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0RHJvcFNoYWRvd0NhY2hlOjpUZXh0RHJvcFNoYWRvd0NhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9EUk9QX1NIQURPV19DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0RST1BfU0hBRE9XX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIGRyb3Agc2hhZG93IGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBkcm9wIHNoYWRvdyBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSk7CisgICAgfQorCisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK1RleHREcm9wU2hhZG93Q2FjaGU6OlRleHREcm9wU2hhZG93Q2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNoYWRvd1RleHQsIFNoYWRvd1RleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK1RleHREcm9wU2hhZG93Q2FjaGU6On5UZXh0RHJvcFNoYWRvd0NhY2hlKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgVGV4dERyb3BTaGFkb3dDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3VpbnQzMl90IFRleHREcm9wU2hhZG93Q2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBUZXh0RHJvcFNoYWRvd0NhY2hlOjpvcGVyYXRvcigpKFNoYWRvd1RleHQmIHRleHQsIFNoYWRvd1RleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHRleHR1cmUtPndpZHRoICogdGV4dHVyZS0+aGVpZ2h0OworICAgIG1TaXplIC09IHNpemU7CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6OmNsZWFyKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCitTaGFkb3dUZXh0dXJlKiBUZXh0RHJvcFNoYWRvd0NhY2hlOjpnZXQoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgdWludDMyX3QgcmFkaXVzKSB7CisgICAgU2hhZG93VGV4dCBlbnRyeShwYWludCwgcmFkaXVzLCBsZW4sIHRleHQpOworICAgIFNoYWRvd1RleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGUuZ2V0KGVudHJ5KTsKKworICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICBGb250UmVuZGVyZXI6OkRyb3BTaGFkb3cgc2hhZG93ID0gbVJlbmRlcmVyLT5yZW5kZXJEcm9wU2hhZG93KHBhaW50LCB0ZXh0LCAwLAorICAgICAgICAgICAgICAgIGxlbiwgbnVtR2x5cGhzLCByYWRpdXMpOworCisgICAgICAgIHRleHR1cmUgPSBuZXcgU2hhZG93VGV4dHVyZTsKKyAgICAgICAgdGV4dHVyZS0+bGVmdCA9IHNoYWRvdy5wZW5YOworICAgICAgICB0ZXh0dXJlLT50b3AgPSBzaGFkb3cucGVuWTsKKyAgICAgICAgdGV4dHVyZS0+d2lkdGggPSBzaGFkb3cud2lkdGg7CisgICAgICAgIHRleHR1cmUtPmhlaWdodCA9IHNoYWRvdy5oZWlnaHQ7CisgICAgICAgIHRleHR1cmUtPmdlbmVyYXRpb24gPSAwOworICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IHRydWU7CisKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHNoYWRvdy53aWR0aCAqIHNoYWRvdy5oZWlnaHQ7CisgICAgICAgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGEgYml0bWFwIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICAgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICAgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgICAgICAvLyBUZXh0dXJlcyBhcmUgQWxwaGE4CisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0FMUEhBLCB0ZXh0dXJlLT53aWR0aCwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBzaGFkb3cuaW1hZ2UpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKworICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICAgICAgbUNhY2hlLnB1dChlbnRyeSwgdGV4dHVyZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsZWFudXAgc2hhZG93CisgICAgICAgIGRlbGV0ZVtdIHNoYWRvdy5pbWFnZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmUyODE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tQYWludC5oPgorCisjaW5jbHVkZSAidXRpbHMvR2VuZXJhdGlvbkNhY2hlLmgiCisjaW5jbHVkZSAiRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3N0cnVjdCBTaGFkb3dUZXh0IHsKKyAgICBTaGFkb3dUZXh0KCkgeworICAgICAgICB0ZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBTaGFkb3dUZXh0KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCByYWRpdXMsIHVpbnQzMl90IGxlbiwgY29uc3QgY2hhciogc3JjVGV4dCk6CisgICAgICAgICAgICByYWRpdXMocmFkaXVzKSwgbGVuKGxlbikgeworICAgICAgICB0ZXh0ID0gbmV3IGNoYXJbbGVuXTsKKyAgICAgICAgbWVtY3B5KHRleHQsIHNyY1RleHQsIGxlbik7CisKKyAgICAgICAgdGV4dFNpemUgPSBwYWludC0+Z2V0VGV4dFNpemUoKTsKKyAgICAgICAgdHlwZWZhY2UgPSBwYWludC0+Z2V0VHlwZWZhY2UoKTsKKworICAgICAgICBoYXNoID0gMDsKKyAgICAgICAgdWludDMyX3QgbXVsdGlwbGllciA9IDE7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaGFzaCArPSB0ZXh0W2ldICogbXVsdGlwbGllcjsKKyAgICAgICAgICAgIHVpbnQzMl90IHNoaWZ0ZWQgPSBtdWx0aXBsaWVyIDw8IDU7CisgICAgICAgICAgICBtdWx0aXBsaWVyID0gc2hpZnRlZCAtIG11bHRpcGxpZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTaGFkb3dUZXh0KGNvbnN0IFNoYWRvd1RleHQmIHNoYWRvdyk6CisgICAgICAgICAgICByYWRpdXMoc2hhZG93LnJhZGl1cyksIGxlbihzaGFkb3cubGVuKSwgaGFzaChzaGFkb3cuaGFzaCksCisgICAgICAgICAgICB0ZXh0U2l6ZShzaGFkb3cudGV4dFNpemUpLCB0eXBlZmFjZShzaGFkb3cudHlwZWZhY2UpIHsKKyAgICAgICAgdGV4dCA9IG5ldyBjaGFyW3NoYWRvdy5sZW5dOworICAgICAgICBtZW1jcHkodGV4dCwgc2hhZG93LnRleHQsIHNoYWRvdy5sZW4pOworICAgIH0KKworICAgIH5TaGFkb3dUZXh0KCkgeworICAgICAgICBkZWxldGVbXSB0ZXh0OworICAgIH0KKworICAgIHVpbnQzMl90IHJhZGl1czsKKyAgICB1aW50MzJfdCBsZW47CisgICAgdWludDMyX3QgaGFzaDsKKyAgICBmbG9hdCB0ZXh0U2l6ZTsKKyAgICBTa1R5cGVmYWNlKiB0eXBlZmFjZTsKKyAgICBjaGFyICp0ZXh0OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2hhZG93VGV4dCYgcmhzKSBjb25zdCB7CisgICAgICAgIGlmIChoYXNoIDwgcmhzLmhhc2gpIHJldHVybiB0cnVlOworICAgICAgICBlbHNlIGlmIChoYXNoID09IHJocy5oYXNoKSB7CisgICAgICAgICAgICBpZiAobGVuIDwgcmhzLmxlbikgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gcmhzLmxlbikgeworICAgICAgICAgICAgICAgIGlmIChyYWRpdXMgPCByaHMucmFkaXVzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYWRpdXMgPT0gcmhzLnJhZGl1cykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGV4dFNpemUgPCByaHMudGV4dFNpemUpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2l6ZSA9PSByaHMudGV4dFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZmFjZSA8IHJocy50eXBlZmFjZSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlZmFjZSA9PSByaHMudHlwZWZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RybmNtcCh0ZXh0LCByaHMudGV4dCwgbGVuKSA8IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307IC8vIHN0cnVjdCBTaGFkb3dUZXh0CisKKy8qKgorICogQWxwaGEgdGV4dHVyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHNoYWRvdy4KKyAqLworc3RydWN0IFNoYWRvd1RleHR1cmU6IHB1YmxpYyBUZXh0dXJlIHsKKyAgICBTaGFkb3dUZXh0dXJlKCk6IFRleHR1cmUoKSB7CisgICAgfQorCisgICAgZmxvYXQgbGVmdDsKKyAgICBmbG9hdCB0b3A7Cit9OyAvLyBzdHJ1Y3QgU2hhZG93VGV4dHVyZQorCitjbGFzcyBUZXh0RHJvcFNoYWRvd0NhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBUZXh0RHJvcFNoYWRvd0NhY2hlKCk7CisgICAgVGV4dERyb3BTaGFkb3dDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgflRleHREcm9wU2hhZG93Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2hhZG93VGV4dCYgdGV4dCwgU2hhZG93VGV4dHVyZSomIHRleHR1cmUpOworCisgICAgU2hhZG93VGV4dHVyZSogZ2V0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCB1aW50MzJfdCByYWRpdXMpOworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzZXRGb250UmVuZGVyZXIoRm9udFJlbmRlcmVyJiBmb250UmVuZGVyZXIpIHsKKyAgICAgICAgbVJlbmRlcmVyID0gJmZvbnRSZW5kZXJlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworICAgIEZvbnRSZW5kZXJlciogbVJlbmRlcmVyOworfTsgLy8gY2xhc3MgVGV4dERyb3BTaGFkb3dDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVEVYVF9EUk9QX1NIQURPV19DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZS5oIGIvbGlicy9od3VpL1RleHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTdmMTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHR1cmUuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1RFWFRVUkVfSAorI2RlZmluZSBBTkRST0lEX1VJX1RFWFRVUkVfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIE9wZW5HTCB0ZXh0dXJlLgorICovCitzdHJ1Y3QgVGV4dHVyZSB7CisgICAgVGV4dHVyZSgpIHsKKyAgICAgICAgY2xlYW51cCA9IGZhbHNlOworICAgICAgICBiaXRtYXBTaXplID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB0ZXh0dXJlLgorICAgICAqLworICAgIEdMdWludCBpZDsKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0aW9uIG9mIHRoZSBiYWNraW5nIGJpdG1hcCwKKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0ZXh0dXJlIHJlcXVpcmVzIGJsZW5kaW5nLgorICAgICAqLworICAgIGJvb2wgYmxlbmQ7CisgICAgLyoqCisgICAgICogV2lkdGggb2YgdGhlIGJhY2tpbmcgYml0bWFwLgorICAgICAqLworICAgIHVpbnQzMl90IHdpZHRoOworICAgIC8qKgorICAgICAqIEhlaWdodCBvZiB0aGUgYmFja2luZyBiaXRtYXAuCisgICAgICovCisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGV4dHVyZSBzaG91bGQgYmUgY2xlYW5lZCB1cCBhZnRlciB1c2UuCisgICAgICovCisgICAgYm9vbCBjbGVhbnVwOworICAgIC8qKgorICAgICAqIE9wdGlvbmFsLCBzaXplIG9mIHRoZSBvcmlnaW5hbCBiaXRtYXAuCisgICAgICovCisgICAgdWludDMyX3QgYml0bWFwU2l6ZTsKK307IC8vIHN0cnVjdCBUZXh0dXJlCisKK2NsYXNzIEF1dG9UZXh0dXJlIHsKK3B1YmxpYzoKKyAgICBBdXRvVGV4dHVyZShjb25zdCBUZXh0dXJlKiB0ZXh0dXJlKTogbVRleHR1cmUodGV4dHVyZSkgeyB9CisgICAgfkF1dG9UZXh0dXJlKCkgeworICAgICAgICBpZiAobVRleHR1cmUgJiYgbVRleHR1cmUtPmNsZWFudXApIHsKKyAgICAgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UZXh0dXJlLT5pZCk7CisgICAgICAgICAgICBkZWxldGUgbVRleHR1cmU7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgVGV4dHVyZSogbVRleHR1cmU7Cit9OyAvLyBjbGFzcyBBdXRvVGV4dHVyZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcCBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMWRmODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcApAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVGV4dHVyZUNhY2hlOjpUZXh0dXJlQ2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa0JpdG1hcCosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRVUkVfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dHVyZSBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dHVyZSBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFKTsKKyAgICB9CisKKyAgICBpbml0KCk7Cit9CisKK1RleHR1cmVDYWNoZTo6VGV4dHVyZUNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa0JpdG1hcCosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgaW5pdCgpOworfQorCitUZXh0dXJlQ2FjaGU6On5UZXh0dXJlQ2FjaGUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OmluaXQoKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7CisKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX1NJWkUsICZtTWF4VGV4dHVyZVNpemUpOworICAgIExPR0QoIiAgICBNYXhpbXVtIHRleHR1cmUgZGltZW5zaW9uIGlzICVkIHBpeGVscyIsIG1NYXhUZXh0dXJlU2l6ZSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBUZXh0dXJlQ2FjaGU6OmdldFNpemUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3VpbnQzMl90IFRleHR1cmVDYWNoZTo6Z2V0TWF4U2l6ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRleHR1cmVDYWNoZTo6b3BlcmF0b3IoKShTa0JpdG1hcComIGJpdG1hcCwgVGV4dHVyZSomIHRleHR1cmUpIHsKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGFscmVhZHkgbG9ja2VkCisgICAgaWYgKHRleHR1cmUpIHsKKyAgICAgICAgbVNpemUgLT0gdGV4dHVyZS0+Yml0bWFwU2l6ZTsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworICAgICAgICBkZWxldGUgdGV4dHVyZTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVGV4dHVyZSogVGV4dHVyZUNhY2hlOjpnZXQoU2tCaXRtYXAqIGJpdG1hcCkgeworICAgIG1Mb2NrLmxvY2soKTsKKyAgICBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlLmdldChiaXRtYXApOworICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIGlmIChiaXRtYXAtPndpZHRoKCkgPiBtTWF4VGV4dHVyZVNpemUgfHwgYml0bWFwLT5oZWlnaHQoKSA+IG1NYXhUZXh0dXJlU2l6ZSkgeworICAgICAgICAgICAgTE9HVygiQml0bWFwIHRvbyBsYXJnZSB0byBiZSB1cGxvYWRlZCBpbnRvIGEgdGV4dHVyZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gYml0bWFwLT5yb3dCeXRlcygpICogYml0bWFwLT5oZWlnaHQoKTsKKyAgICAgICAgLy8gRG9uJ3QgZXZlbiB0cnkgdG8gY2FjaGUgYSBiaXRtYXAgdGhhdCdzIGJpZ2dlciB0aGFuIHRoZSBjYWNoZQorICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICB3aGlsZSAobVNpemUgKyBzaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHRleHR1cmUgPSBuZXcgVGV4dHVyZTsKKyAgICAgICAgdGV4dHVyZS0+Yml0bWFwU2l6ZSA9IHNpemU7CisgICAgICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUsIGZhbHNlKTsKKworICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICAgICAgbUNhY2hlLnB1dChiaXRtYXAsIHRleHR1cmUpOworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKSAhPSB0ZXh0dXJlLT5nZW5lcmF0aW9uKSB7CisgICAgICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUsIHRydWUpOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6cmVtb3ZlKFNrQml0bWFwKiBiaXRtYXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWNoZS5yZW1vdmUoYml0bWFwKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OmNsZWFyKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSwgYm9vbCByZWdlbmVyYXRlKSB7CisgICAgU2tBdXRvTG9ja1BpeGVscyBhbHAoKmJpdG1hcCk7CisKKyAgICBpZiAoIWJpdG1hcC0+cmVhZHlUb0RyYXcoKSkgeworICAgICAgICBMT0dFKCJDYW5ub3QgZ2VuZXJhdGUgdGV4dHVyZSBmcm9tIGJpdG1hcCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYm9vbCByZXNpemUgPSAhcmVnZW5lcmF0ZSB8fCBiaXRtYXAtPndpZHRoKCkgIT0gaW50KHRleHR1cmUtPndpZHRoKSB8fAorICAgICAgICAgICAgYml0bWFwLT5oZWlnaHQoKSAhPSBpbnQodGV4dHVyZS0+aGVpZ2h0KTsKKworICAgIGlmICghcmVnZW5lcmF0ZSkgeworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgfQorCisgICAgdGV4dHVyZS0+Z2VuZXJhdGlvbiA9IGJpdG1hcC0+Z2V0R2VuZXJhdGlvbklEKCk7CisgICAgdGV4dHVyZS0+d2lkdGggPSBiaXRtYXAtPndpZHRoKCk7CisgICAgdGV4dHVyZS0+aGVpZ2h0ID0gYml0bWFwLT5oZWlnaHQoKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgYml0bWFwLT5ieXRlc1BlclBpeGVsKCkpOworCisgICAgc3dpdGNoIChiaXRtYXAtPmdldENvbmZpZygpKSB7CisgICAgY2FzZSBTa0JpdG1hcDo6a0E4X0NvbmZpZzoKKyAgICAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKyAgICAgICAgdXBsb2FkVG9UZXh0dXJlKHJlc2l6ZSwgR0xfQUxQSEEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfQllURSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisgICAgICAgIHRleHR1cmUtPmJsZW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTa0JpdG1hcDo6a1JHQl81NjVfQ29uZmlnOgorICAgICAgICB1cGxvYWRUb1RleHR1cmUocmVzaXplLCBHTF9SR0IsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIGJpdG1hcC0+Z2V0UGl4ZWxzKCkpOworICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZzoKKyAgICAgICAgdXBsb2FkVG9UZXh0dXJlKHJlc2l6ZSwgR0xfUkdCQSwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwKKyAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKyAgICAgICAgLy8gRG8gdGhpcyBhZnRlciBjYWxsaW5nIGdldFBpeGVscygpIHRvIG1ha2Ugc3VyZSBTa2lhJ3MgZGVmZXJyZWQKKyAgICAgICAgLy8gZGVjb2RpbmcgaGFwcGVuZWQKKyAgICAgICAgdGV4dHVyZS0+YmxlbmQgPSAhYml0bWFwLT5pc09wYXF1ZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNrQml0bWFwOjprSW5kZXg4X0NvbmZpZzoKKyAgICAgICAgdXBsb2FkUGFsZXR0ZWRUZXh0dXJlKHJlc2l6ZSwgYml0bWFwLCB0ZXh0dXJlLT53aWR0aCwgdGV4dHVyZS0+aGVpZ2h0KTsKKyAgICAgICAgdGV4dHVyZS0+YmxlbmQgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVygiVW5zdXBwb3J0ZWQgYml0bWFwIGNvbmZpZzogJWQiLCBiaXRtYXAtPmdldENvbmZpZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6dXBsb2FkUGFsZXR0ZWRUZXh0dXJlKGJvb2wgcmVzaXplLCBTa0JpdG1hcCogYml0bWFwLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgU2tCaXRtYXAgcmdiYUJpdG1hcDsKKyAgICByZ2JhQml0bWFwLnNldENvbmZpZyhTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcsIHdpZHRoLCBoZWlnaHQpOworICAgIHJnYmFCaXRtYXAuYWxsb2NQaXhlbHMoKTsKKyAgICByZ2JhQml0bWFwLmVyYXNlQ29sb3IoMCk7CisKKyAgICBTa0NhbnZhcyBjYW52YXMocmdiYUJpdG1hcCk7CisgICAgY2FudmFzLmRyYXdCaXRtYXAoKmJpdG1hcCwgMC4wZiwgMC4wZiwgTlVMTCk7CisKKyAgICB1cGxvYWRUb1RleHR1cmUocmVzaXplLCBHTF9SR0JBLCByZ2JhQml0bWFwLnJvd0J5dGVzQXNQaXhlbHMoKSwgaGVpZ2h0LAorICAgICAgICAgICAgR0xfVU5TSUdORURfQllURSwgcmdiYUJpdG1hcC5nZXRQaXhlbHMoKSk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjp1cGxvYWRUb1RleHR1cmUoYm9vbCByZXNpemUsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICogZGF0YSkgeworICAgIGlmIChyZXNpemUpIHsKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgZm9ybWF0LCB0eXBlLCBkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBkYXRhKTsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHR1cmVDYWNoZS5oIGIvbGlicy9od3VpL1RleHR1cmVDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2U4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfVEVYVFVSRV9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfVEVYVFVSRV9DQUNIRV9ICisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgInV0aWxzL0dlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzaW1wbGUgTFJVIHRleHR1cmUgY2FjaGUuIFRoZSBjYWNoZSBoYXMgYSBtYXhpbXVtIHNpemUgZXhwcmVzc2VkIGluIGJ5dGVzLgorICogQW55IHRleHR1cmUgYWRkZWQgdG8gdGhlIGNhY2hlIGNhdXNpbmcgdGhlIGNhY2hlIHRvIGdyb3cgYmV5b25kIHRoZSBtYXhpbXVtCisgKiBhbGxvd2VkIHNpemUgd2lsbCBhbHNvIGNhdXNlIHRoZSBvbGRlc3QgdGV4dHVyZSB0byBiZSBraWNrZWQgb3V0LgorICovCitjbGFzcyBUZXh0dXJlQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxTa0JpdG1hcCosIFRleHR1cmUqPiB7CitwdWJsaWM6CisgICAgVGV4dHVyZUNhY2hlKCk7CisgICAgVGV4dHVyZUNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKTsKKyAgICB+VGV4dHVyZUNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIERvIG5vdCBpbnZva2UgZGlyZWN0bHkuCisgICAgICovCisgICAgdm9pZCBvcGVyYXRvcigpKFNrQml0bWFwKiYgYml0bWFwLCBUZXh0dXJlKiYgdGV4dHVyZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdG1hcC4gSWYgdGhlIHRleHR1cmUKKyAgICAgKiBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGNhY2hlLCBhIG5ldyB0ZXh0dXJlIGlzIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBUZXh0dXJlKiBnZXQoU2tCaXRtYXAqIGJpdG1hcCk7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBiaXRtYXAuIFJldHVybnMgTlVMTAorICAgICAqIGlmIHRoZSB0ZXh0dXJlIGNhbm5vdCBiZSBmb3VuZC4gVXBvbiByZW1vdmUgdGhlIHRleHR1cmUgaXMgZnJlZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tCaXRtYXAqIGJpdG1hcCk7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSB0ZXh0dXJlIGZyb20gYSBiaXRtYXAgaW50byB0aGUgc3BlY2lmaWVkIHRleHR1cmUgc3RydWN0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZ2VuZXJhdGUgSWYgdHJ1ZSwgdGhlIGJpdG1hcCBkYXRhIGlzIHJldXBsb2FkZWQgaW50byB0aGUgdGV4dHVyZSwgYnV0CisgICAgICogICAgICAgIG5vIG5ldyB0ZXh0dXJlIGlzIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCogYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlLCBib29sIHJlZ2VuZXJhdGUgPSBmYWxzZSk7CisKKyAgICB2b2lkIHVwbG9hZFBhbGV0dGVkVGV4dHVyZShib29sIHJlc2l6ZSwgU2tCaXRtYXAqIGJpdG1hcCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCB1cGxvYWRUb1RleHR1cmUoYm9vbCByZXNpemUsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqIGRhdGEpOworCisgICAgdm9pZCBpbml0KCk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2tCaXRtYXAqLCBUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisgICAgR0xpbnQgbU1heFRleHR1cmVTaXplOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBhY2Nlc3MgbUNhY2hlIGFuZCBtU2l6ZS4gQWxsIG1ldGhvZHMgYXJlIGFjY2Vzc2VkIGZyb20gYSBzaW5nbGUKKyAgICAgKiB0aHJlYWQgZXhjZXB0IGZvciByZW1vdmUoKS4KKyAgICAgKi8KKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworfTsgLy8gY2xhc3MgVGV4dHVyZUNhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9URVhUVVJFX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9WZXJ0ZXguaCBiL2xpYnMvaHd1aS9WZXJ0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjU0MDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1ZlcnRleC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfVkVSVEVYX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9WRVJURVhfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogU2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZlcnRleCB3aXRoIGEgcG9zaXRpb24gYW5kIGEgdGV4dHVyZS4KKyAqLworc3RydWN0IFRleHR1cmVWZXJ0ZXggeworICAgIGZsb2F0IHBvc2l0aW9uWzJdOworICAgIGZsb2F0IHRleHR1cmVbMl07CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgc2V0KFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgdSwgZmxvYXQgdikgeworICAgICAgICB2ZXJ0ZXhbMF0ucG9zaXRpb25bMF0gPSB4OworICAgICAgICB2ZXJ0ZXhbMF0ucG9zaXRpb25bMV0gPSB5OworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVswXSA9IHU7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzFdID0gdjsKKyAgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgc2V0VVYoVGV4dHVyZVZlcnRleCogdmVydGV4LCBmbG9hdCB1LCBmbG9hdCB2KSB7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzBdID0gdTsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMV0gPSB2OworICAgIH0KK307IC8vIHN0cnVjdCBUZXh0dXJlVmVydGV4CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9WRVJURVhfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL3V0aWxzL0dlbmVyYXRpb25DYWNoZS5oIGIvbGlicy9od3VpL3V0aWxzL0dlbmVyYXRpb25DYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZWEzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvdXRpbHMvR2VuZXJhdGlvbkNhY2hlLmgKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfR0VORVJBVElPTl9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfR0VORVJBVElPTl9DQUNIRV9ICisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbnRyeUtleSwgdHlwZW5hbWUgRW50cnlWYWx1ZT4KK2NsYXNzIE9uRW50cnlSZW1vdmVkIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5PbkVudHJ5UmVtb3ZlZCgpIHsgfTsKKyAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKShFbnRyeUtleSYga2V5LCBFbnRyeVZhbHVlJiB2YWx1ZSkgPSAwOworfTsgLy8gY2xhc3MgT25FbnRyeVJlbW92ZWQKKwordGVtcGxhdGU8dHlwZW5hbWUgRW50cnlLZXksIHR5cGVuYW1lIEVudHJ5VmFsdWU+CitzdHJ1Y3QgRW50cnk6IHB1YmxpYyBMaWdodFJlZkJhc2U8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4geworICAgIEVudHJ5KCkgeyB9CisgICAgRW50cnkoY29uc3QgRW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+JiBlKToKKyAgICAgICAgICAgIGtleShlLmtleSksIHZhbHVlKGUudmFsdWUpLCBwYXJlbnQoZS5wYXJlbnQpLCBjaGlsZChlLmNoaWxkKSB7IH0KKyAgICBFbnRyeShzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBlKToKKyAgICAgICAgICAgIGtleShlLT5rZXkpLCB2YWx1ZShlLT52YWx1ZSksIHBhcmVudChlLT5wYXJlbnQpLCBjaGlsZChlLT5jaGlsZCkgeyB9CisKKyAgICBFbnRyeUtleSBrZXk7CisgICAgRW50cnlWYWx1ZSB2YWx1ZTsKKworICAgIHNwPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHBhcmVudDsKKyAgICBzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBjaGlsZDsKK307IC8vIHN0cnVjdCBFbnRyeQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorY2xhc3MgR2VuZXJhdGlvbkNhY2hlIHsKK3B1YmxpYzoKKyAgICBHZW5lcmF0aW9uQ2FjaGUodWludDMyX3QgbWF4Q2FwYWNpdHkpOworICAgIHZpcnR1YWwgfkdlbmVyYXRpb25DYWNoZSgpOworCisgICAgZW51bSBDYXBhY2l0eSB7CisgICAgICAgIGtVbmxpbWl0ZWRDYXBhY2l0eSwKKyAgICB9OworCisgICAgdm9pZCBzZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKE9uRW50cnlSZW1vdmVkPEssIFY+KiBsaXN0ZW5lcik7CisKKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICBib29sIGNvbnRhaW5zKEsga2V5KSBjb25zdDsKKyAgICBWIGdldChLIGtleSk7CisgICAgSyBnZXRLZXlBdCh1aW50MzJfdCBpbmRleCkgY29uc3Q7CisgICAgYm9vbCBwdXQoSyBrZXksIFYgdmFsdWUpOworICAgIFYgcmVtb3ZlKEsga2V5KTsKKyAgICBWIHJlbW92ZU9sZGVzdCgpOworICAgIFYgZ2V0VmFsdWVBdCh1aW50MzJfdCBpbmRleCkgY29uc3Q7CisKKyAgICB1aW50MzJfdCBzaXplKCkgY29uc3Q7CisKKyAgICB2b2lkIGFkZFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSwgSyBrZXksIFYgdmFsdWUpOworICAgIHZvaWQgYXR0YWNoVG9DYWNoZShzcDxFbnRyeTxLLCBWPiA+IGVudHJ5KTsKKyAgICB2b2lkIGRldGFjaEZyb21DYWNoZShzcDxFbnRyeTxLLCBWPiA+IGVudHJ5KTsKKworICAgIFYgcmVtb3ZlQXQoc3NpemVfdCBpbmRleCk7CisKKyAgICBLZXllZFZlY3RvcjxLLCBzcDxFbnRyeTxLLCBWPiA+ID4gbUNhY2hlOworICAgIHVpbnQzMl90IG1NYXhDYXBhY2l0eTsKKworICAgIE9uRW50cnlSZW1vdmVkPEssIFY+KiBtTGlzdGVuZXI7CisKKyAgICBzcDxFbnRyeTxLLCBWPiA+IG1PbGRlc3Q7CisgICAgc3A8RW50cnk8SywgVj4gPiBtWW91bmdlc3Q7Cit9OyAvLyBjbGFzcyBHZW5lcmF0aW9uQ2FjaGUKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK0dlbmVyYXRpb25DYWNoZTxLLCBWPjo6R2VuZXJhdGlvbkNhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTogbU1heENhcGFjaXR5KG1heENhcGFjaXR5KSwgbUxpc3RlbmVyKE5VTEwpIHsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitHZW5lcmF0aW9uQ2FjaGU8SywgVj46On5HZW5lcmF0aW9uQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit1aW50MzJfdCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1DYWNoZS5zaXplKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit2b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6c2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbGlzdGVuZXIpIHsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpjbGVhcigpIHsKKyAgICBpZiAobUxpc3RlbmVyKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAoKm1MaXN0ZW5lcikoZW50cnktPmtleSwgZW50cnktPnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtWW91bmdlc3QuY2xlYXIoKTsKKyAgICBtT2xkZXN0LmNsZWFyKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Citib29sIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Y29udGFpbnMoSyBrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KSA+PSAwOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorSyBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmdldEtleUF0KHVpbnQzMl90IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1DYWNoZS5rZXlBdChpbmRleCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0VmFsdWVBdCh1aW50MzJfdCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBtQ2FjaGUudmFsdWVBdChpbmRleCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0KEsga2V5KSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKGVudHJ5LmdldCgpKSB7CisgICAgICAgICAgICBkZXRhY2hGcm9tQ2FjaGUoZW50cnkpOworICAgICAgICAgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7CisgICAgICAgICAgICByZXR1cm4gZW50cnktPnZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Citib29sIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgaWYgKG1NYXhDYXBhY2l0eSAhPSBrVW5saW1pdGVkQ2FwYWNpdHkgJiYgbUNhY2hlLnNpemUoKSA+PSBtTWF4Q2FwYWNpdHkpIHsKKyAgICAgICAgcmVtb3ZlT2xkZXN0KCk7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBzcDxFbnRyeTxLLCBWPiA+IGVudHJ5ID0gbmV3IEVudHJ5PEssIFY+OworICAgICAgICBhZGRUb0NhY2hlKGVudHJ5LCBrZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmFkZFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSwgSyBrZXksIFYgdmFsdWUpIHsKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworICAgIG1DYWNoZS5hZGQoa2V5LCBlbnRyeSk7CisgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlKEsga2V5KSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK1YgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpyZW1vdmVBdChzc2l6ZV90IGluZGV4KSB7CisgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICBpZiAobUxpc3RlbmVyKSB7CisgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOworICAgIH0KKyAgICBtQ2FjaGUucmVtb3ZlSXRlbXNBdChpbmRleCwgMSk7CisgICAgZGV0YWNoRnJvbUNhY2hlKGVudHJ5KTsKKworICAgIHJldHVybiBlbnRyeS0+dmFsdWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlT2xkZXN0KCkgeworICAgIGlmIChtT2xkZXN0LmdldCgpKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShtT2xkZXN0LT5rZXkpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUF0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmF0dGFjaFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSkgeworICAgIGlmICghbVlvdW5nZXN0LmdldCgpKSB7CisgICAgICAgIG1Zb3VuZ2VzdCA9IG1PbGRlc3QgPSBlbnRyeTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnRyeS0+cGFyZW50ID0gbVlvdW5nZXN0OworICAgICAgICBtWW91bmdlc3QtPmNoaWxkID0gZW50cnk7CisgICAgICAgIG1Zb3VuZ2VzdCA9IGVudHJ5OworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpkZXRhY2hGcm9tQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSkgeworICAgIGlmIChlbnRyeS0+cGFyZW50LmdldCgpKSB7CisgICAgICAgIGVudHJ5LT5wYXJlbnQtPmNoaWxkID0gZW50cnktPmNoaWxkOworICAgIH0KKworICAgIGlmIChlbnRyeS0+Y2hpbGQuZ2V0KCkpIHsKKyAgICAgICAgZW50cnktPmNoaWxkLT5wYXJlbnQgPSBlbnRyeS0+cGFyZW50OworICAgIH0KKworICAgIGlmIChtT2xkZXN0ID09IGVudHJ5KSB7CisgICAgICAgIG1PbGRlc3QgPSBlbnRyeS0+Y2hpbGQ7CisgICAgfQorCisgICAgaWYgKG1Zb3VuZ2VzdCA9PSBlbnRyeSkgeworICAgICAgICBtWW91bmdlc3QgPSBlbnRyeS0+cGFyZW50OworICAgIH0KKworICAgIGVudHJ5LT5wYXJlbnQuY2xlYXIoKTsKKyAgICBlbnRyeS0+Y2hpbGQuY2xlYXIoKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL3V0aWxzL1NvcnRlZExpc3QuaCBiL2xpYnMvaHd1aS91dGlscy9Tb3J0ZWRMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmNWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS91dGlscy9Tb3J0ZWRMaXN0LmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfU09SVEVEX0xJU1RfSAorI2RlZmluZSBBTkRST0lEX1VJX1NPUlRFRF9MSVNUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVHlwZUhlbHBlcnMuaD4KKworI2luY2x1ZGUgIlNvcnRlZExpc3RJbXBsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU29ydGVkIGxpc3QKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordGVtcGxhdGU8Y2xhc3MgVFlQRT4KK2NsYXNzIFNvcnRlZExpc3Q6IHByaXZhdGUgU29ydGVkTGlzdEltcGwgeworcHVibGljOgorICAgIHR5cGVkZWYgVFlQRSB2YWx1ZV90eXBlOworCisgICAgU29ydGVkTGlzdCgpOworICAgIFNvcnRlZExpc3QoY29uc3QgU29ydGVkTGlzdDxUWVBFPiYgcmhzKTsKKyAgICB2aXJ0dWFsIH5Tb3J0ZWRMaXN0KCk7CisKKyAgICBjb25zdCBTb3J0ZWRMaXN0PFRZUEU+JiBvcGVyYXRvciA9KGNvbnN0IFNvcnRlZExpc3Q8VFlQRT4mIHJocykgY29uc3Q7CisgICAgU29ydGVkTGlzdDxUWVBFPiYgb3BlcmF0b3IgPShjb25zdCBTb3J0ZWRMaXN0PFRZUEU+JiByaHMpOworCisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIFZlY3RvckltcGw6OmNsZWFyKCk7CisgICAgfQorCisgICAgaW5saW5lIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gVmVjdG9ySW1wbDo6c2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBWZWN0b3JJbXBsOjppc0VtcHR5KCk7CisgICAgfQorCisgICAgaW5saW5lIHNpemVfdCBjYXBhY2l0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFZlY3RvckltcGw6OmNhcGFjaXR5KCk7CisgICAgfQorCisgICAgaW5saW5lIHNzaXplX3Qgc2V0Q2FwYWNpdHkoc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIFZlY3RvckltcGw6OnNldENhcGFjaXR5KHNpemUpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBUWVBFKiBhcnJheSgpIGNvbnN0OworCisgICAgVFlQRSogZWRpdEFycmF5KCk7CisKKyAgICBzc2l6ZV90IGluZGV4T2YoY29uc3QgVFlQRSYgaXRlbSkgY29uc3Q7CisgICAgc2l6ZV90IG9yZGVyT2YoY29uc3QgVFlQRSYgaXRlbSkgY29uc3Q7CisKKyAgICBpbmxpbmUgY29uc3QgVFlQRSYgb3BlcmF0b3IgW10oc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICBpbmxpbmUgY29uc3QgVFlQRSYgaXRlbUF0KHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgY29uc3QgVFlQRSYgdG9wKCkgY29uc3Q7CisgICAgY29uc3QgVFlQRSYgbWlycm9ySXRlbUF0KHNzaXplX3QgaW5kZXgpIGNvbnN0OworCisgICAgc3NpemVfdCBhZGQoY29uc3QgVFlQRSYgaXRlbSk7CisKKyAgICBUWVBFJiBlZGl0SXRlbUF0KHNpemVfdCBpbmRleCkgeworICAgICAgICByZXR1cm4gKihzdGF0aWNfY2FzdDxUWVBFICo+IChWZWN0b3JJbXBsOjplZGl0SXRlbUxvY2F0aW9uKGluZGV4KSkpOworICAgIH0KKworICAgIHNzaXplX3QgbWVyZ2UoY29uc3QgVmVjdG9yPFRZUEU+JiB2ZWN0b3IpOworICAgIHNzaXplX3QgbWVyZ2UoY29uc3QgU29ydGVkTGlzdDxUWVBFPiYgdmVjdG9yKTsKKworICAgIHNzaXplX3QgcmVtb3ZlKGNvbnN0IFRZUEUmKTsKKworICAgIGlubGluZSBzc2l6ZV90IHJlbW92ZUl0ZW1zQXQoc2l6ZV90IGluZGV4LCBzaXplX3QgY291bnQgPSAxKTsKKyAgICBpbmxpbmUgc3NpemVfdCByZW1vdmVBdChzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBkb19jb25zdHJ1Y3Qodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRvX2Rlc3Ryb3kodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRvX2NvcHkodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRvX3NwbGF0KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCBudW0pIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBkb19tb3ZlX2ZvcndhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRvX21vdmVfYmFja3dhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocykgY29uc3Q7Cit9OyAvLyBjbGFzcyBTb3J0ZWRMaXN0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+CitpbmxpbmUgU29ydGVkTGlzdDxUWVBFPjo6U29ydGVkTGlzdCgpOgorICAgICAgICBTb3J0ZWRMaXN0SW1wbChzaXplb2YoVFlQRSksICgodHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9jdG9yID8gSEFTX1RSSVZJQUxfQ1RPUiA6IDApCisgICAgICAgICAgICB8ICh0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2R0b3IgPyBIQVNfVFJJVklBTF9EVE9SIDogMCkKKyAgICAgICAgICAgIHwgKHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSA/IEhBU19UUklWSUFMX0NPUFkgOiAwKSkpIHsKK30KKwordGVtcGxhdGU8Y2xhc3MgVFlQRT4KK2lubGluZSBTb3J0ZWRMaXN0PFRZUEU+OjpTb3J0ZWRMaXN0KGNvbnN0IFNvcnRlZExpc3Q8VFlQRT4mIHJocyk6IFNvcnRlZExpc3RJbXBsKHJocykgeworfQorCit0ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUgU29ydGVkTGlzdDxUWVBFPjo6flNvcnRlZExpc3QoKSB7CisgICAgZmluaXNoX3ZlY3RvcigpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUWVBFPgoraW5saW5lIFNvcnRlZExpc3Q8VFlQRT4mIFNvcnRlZExpc3Q8VFlQRT46Om9wZXJhdG9yID0oY29uc3QgU29ydGVkTGlzdDxUWVBFPiYgcmhzKSB7CisgICAgU29ydGVkTGlzdEltcGw6Om9wZXJhdG9yID0ocmhzKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+CitpbmxpbmUgY29uc3QgU29ydGVkTGlzdDxUWVBFPiYgU29ydGVkTGlzdDxUWVBFPjo6b3BlcmF0b3IgPSgKKyAgICAgICAgY29uc3QgU29ydGVkTGlzdDxUWVBFPiYgcmhzKSBjb25zdCB7CisgICAgU29ydGVkTGlzdEltcGw6Om9wZXJhdG9yID0ocmhzKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+CitpbmxpbmUgY29uc3QgVFlQRSogU29ydGVkTGlzdDxUWVBFPjo6YXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFRZUEUgKj4gKGFycmF5SW1wbCgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVFlQRT4KK2lubGluZSBUWVBFKiBTb3J0ZWRMaXN0PFRZUEU+OjplZGl0QXJyYXkoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRZUEUgKj4gKGVkaXRBcnJheUltcGwoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+CitpbmxpbmUgY29uc3QgVFlQRSYgU29ydGVkTGlzdDxUWVBFPjo6b3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIGluZGV4PHNpemUoKSApOworICAgIHJldHVybiAqKGFycmF5KCkgKyBpbmRleCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+CitpbmxpbmUgY29uc3QgVFlQRSYgU29ydGVkTGlzdDxUWVBFPjo6aXRlbUF0KHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBvcGVyYXRvcltdKGluZGV4KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVFlQRT4KK2lubGluZSBjb25zdCBUWVBFJiBTb3J0ZWRMaXN0PFRZUEU+OjptaXJyb3JJdGVtQXQoc3NpemVfdCBpbmRleCkgY29uc3QgeworICAgIGFzc2VydCggKGluZGV4PjAgPyBpbmRleCA6IC1pbmRleCk8c2l6ZSgpICk7CisgICAgcmV0dXJuICooYXJyYXkoKSArICgoaW5kZXggPCAwKSA/IChzaXplKCkgLSBpbmRleCkgOiBpbmRleCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUWVBFPgoraW5saW5lIGNvbnN0IFRZUEUmIFNvcnRlZExpc3Q8VFlQRT46OnRvcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKihhcnJheSgpICsgc2l6ZSgpIC0gMSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+CitpbmxpbmUgc3NpemVfdCBTb3J0ZWRMaXN0PFRZUEU+OjphZGQoY29uc3QgVFlQRSYgaXRlbSkgeworICAgIHJldHVybiBTb3J0ZWRMaXN0SW1wbDo6YWRkKCZpdGVtKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVFlQRT4KK2lubGluZSBzc2l6ZV90IFNvcnRlZExpc3Q8VFlQRT46OmluZGV4T2YoY29uc3QgVFlQRSYgaXRlbSkgY29uc3QgeworICAgIHJldHVybiBTb3J0ZWRMaXN0SW1wbDo6aW5kZXhPZigmaXRlbSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+CitpbmxpbmUgc2l6ZV90IFNvcnRlZExpc3Q8VFlQRT46Om9yZGVyT2YoY29uc3QgVFlQRSYgaXRlbSkgY29uc3QgeworICAgIHJldHVybiBTb3J0ZWRMaXN0SW1wbDo6b3JkZXJPZigmaXRlbSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+CitpbmxpbmUgc3NpemVfdCBTb3J0ZWRMaXN0PFRZUEU+OjptZXJnZShjb25zdCBWZWN0b3I8VFlQRT4mIHZlY3RvcikgeworICAgIHJldHVybiBTb3J0ZWRMaXN0SW1wbDo6bWVyZ2UocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4gKHZlY3RvcikpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUWVBFPgoraW5saW5lIHNzaXplX3QgU29ydGVkTGlzdDxUWVBFPjo6bWVyZ2UoY29uc3QgU29ydGVkTGlzdDxUWVBFPiYgdmVjdG9yKSB7CisgICAgcmV0dXJuIFNvcnRlZExpc3RJbXBsOjptZXJnZShyZWludGVycHJldF9jYXN0PGNvbnN0IFNvcnRlZExpc3RJbXBsJj4gKHZlY3RvcikpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUWVBFPgoraW5saW5lIHNzaXplX3QgU29ydGVkTGlzdDxUWVBFPjo6cmVtb3ZlKGNvbnN0IFRZUEUmIGl0ZW0pIHsKKyAgICByZXR1cm4gU29ydGVkTGlzdEltcGw6OnJlbW92ZSgmaXRlbSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+CitpbmxpbmUgc3NpemVfdCBTb3J0ZWRMaXN0PFRZUEU+OjpyZW1vdmVJdGVtc0F0KHNpemVfdCBpbmRleCwgc2l6ZV90IGNvdW50KSB7CisgICAgcmV0dXJuIFZlY3RvckltcGw6OnJlbW92ZUl0ZW1zQXQoaW5kZXgsIGNvdW50KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVFlQRT4KK3ZvaWQgU29ydGVkTGlzdDxUWVBFPjo6ZG9fY29uc3RydWN0KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0IHsKKyAgICBjb25zdHJ1Y3RfdHlwZShyZWludGVycHJldF9jYXN0PFRZUEUqPiAoc3RvcmFnZSksIG51bSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+Cit2b2lkIFNvcnRlZExpc3Q8VFlQRT46OmRvX2Rlc3Ryb3kodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3QgeworICAgIGRlc3Ryb3lfdHlwZShyZWludGVycHJldF9jYXN0PFRZUEUqPiAoc3RvcmFnZSksIG51bSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+Cit2b2lkIFNvcnRlZExpc3Q8VFlQRT46OmRvX2NvcHkodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgeworICAgIGNvcHlfdHlwZShyZWludGVycHJldF9jYXN0PFRZUEUqPiAoZGVzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+IChmcm9tKSwgbnVtKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVFlQRT4KK3ZvaWQgU29ydGVkTGlzdDxUWVBFPjo6ZG9fc3BsYXQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90IG51bSkgY29uc3QgeworICAgIHNwbGF0X3R5cGUocmVpbnRlcnByZXRfY2FzdDxUWVBFKj4gKGRlc3QpLCByZWludGVycHJldF9jYXN0PGNvbnN0IFRZUEUqPiAoaXRlbSksIG51bSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+Cit2b2lkIFNvcnRlZExpc3Q8VFlQRT46OmRvX21vdmVfZm9yd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCB7CisgICAgbW92ZV9mb3J3YXJkX3R5cGUocmVpbnRlcnByZXRfY2FzdDxUWVBFKj4gKGRlc3QpLCByZWludGVycHJldF9jYXN0PGNvbnN0IFRZUEUqPiAoZnJvbSksIG51bSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFRZUEU+Cit2b2lkIFNvcnRlZExpc3Q8VFlQRT46OmRvX21vdmVfYmFja3dhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgeworICAgIG1vdmVfYmFja3dhcmRfdHlwZShyZWludGVycHJldF9jYXN0PFRZUEUqPiAoZGVzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+IChmcm9tKSwgbnVtKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVFlQRT4KK2ludCBTb3J0ZWRMaXN0PFRZUEU+Ojpkb19jb21wYXJlKGNvbnN0IHZvaWQqIGxocywgY29uc3Qgdm9pZCogcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmVfdHlwZSgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4gKGxocyksICpyZWludGVycHJldF9jYXN0PGNvbnN0IFRZUEUqPiAocmhzKSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9TT1JURURfTElTVF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvdXRpbHMvU29ydGVkTGlzdEltcGwuY3BwIGIvbGlicy9od3VpL3V0aWxzL1NvcnRlZExpc3RJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE3MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL3V0aWxzL1NvcnRlZExpc3RJbXBsLmNwcApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTb3J0ZWRMaXN0SW1wbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNvcnRlZCBsaXN0IGltcGxlbWVudGF0aW9uLCBub3QgZm9yIGRpcmVjdCB1c2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU29ydGVkTGlzdEltcGw6OlNvcnRlZExpc3RJbXBsKHNpemVfdCBpdGVtU2l6ZSwgdWludDMyX3QgZmxhZ3MpOiBWZWN0b3JJbXBsKGl0ZW1TaXplLCBmbGFncykgeworfQorCitTb3J0ZWRMaXN0SW1wbDo6U29ydGVkTGlzdEltcGwoY29uc3QgVmVjdG9ySW1wbCYgcmhzKTogVmVjdG9ySW1wbChyaHMpIHsKK30KKworU29ydGVkTGlzdEltcGw6On5Tb3J0ZWRMaXN0SW1wbCgpIHsKK30KKworU29ydGVkTGlzdEltcGwmIFNvcnRlZExpc3RJbXBsOjpvcGVyYXRvciA9KGNvbnN0IFNvcnRlZExpc3RJbXBsJiByaHMpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U29ydGVkTGlzdEltcGwmPgorICAgICAgICAgICAgKFZlY3RvckltcGw6Om9wZXJhdG9yID0oc3RhdGljX2Nhc3Q8Y29uc3QgVmVjdG9ySW1wbCY+IChyaHMpKSk7Cit9CisKK3NzaXplX3QgU29ydGVkTGlzdEltcGw6OmluZGV4T2YoY29uc3Qgdm9pZCogaXRlbSkgY29uc3QgeworICAgIHJldHVybiBfaW5kZXhPcmRlck9mKGl0ZW0pOworfQorCitzaXplX3QgU29ydGVkTGlzdEltcGw6Om9yZGVyT2YoY29uc3Qgdm9pZCogaXRlbSkgY29uc3QgeworICAgIHNpemVfdCBvOworICAgIF9pbmRleE9yZGVyT2YoaXRlbSwgJm8pOworICAgIHJldHVybiBvOworfQorCitzc2l6ZV90IFNvcnRlZExpc3RJbXBsOjpfaW5kZXhPcmRlck9mKGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCogb3JkZXIpIGNvbnN0IHsKKyAgICAvLyBiaW5hcnkgc2VhcmNoCisgICAgc3NpemVfdCBlcnIgPSBOQU1FX05PVF9GT1VORDsKKyAgICBzc2l6ZV90IGwgPSAwOworICAgIHNzaXplX3QgaCA9IHNpemUoKSAtIDE7CisgICAgc3NpemVfdCBtaWQ7CisgICAgY29uc3Qgdm9pZCogYSA9IGFycmF5SW1wbCgpOworICAgIGNvbnN0IHNpemVfdCBzID0gaXRlbVNpemUoKTsKKyAgICB3aGlsZSAobCA8PSBoKSB7CisgICAgICAgIG1pZCA9IGwgKyAoaCAtIGwpIC8gMjsKKyAgICAgICAgY29uc3Qgdm9pZCogY29uc3QgY3VyciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPiAoYSkgKyAobWlkICogcyk7CisgICAgICAgIGNvbnN0IGludCBjID0gZG9fY29tcGFyZShjdXJyLCBpdGVtKTsKKyAgICAgICAgaWYgKGMgPT0gMCkgeworICAgICAgICAgICAgZXJyID0gbCA9IG1pZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGMgPCAwKSB7CisgICAgICAgICAgICBsID0gbWlkICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGggPSBtaWQgLSAxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvcmRlcikgeworICAgICAgICAqb3JkZXIgPSBsOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzc2l6ZV90IFNvcnRlZExpc3RJbXBsOjphZGQoY29uc3Qgdm9pZCogaXRlbSkgeworICAgIHNpemVfdCBvcmRlcjsKKyAgICBzc2l6ZV90IGluZGV4ID0gX2luZGV4T3JkZXJPZihpdGVtLCAmb3JkZXIpOworICAgIGluZGV4ID0gVmVjdG9ySW1wbDo6aW5zZXJ0QXQoaXRlbSwgb3JkZXIsIDEpOworICAgIHJldHVybiBpbmRleDsKK30KKworc3NpemVfdCBTb3J0ZWRMaXN0SW1wbDo6bWVyZ2UoY29uc3QgVmVjdG9ySW1wbCYgdmVjdG9yKSB7CisgICAgLy8gbmFpdmUgbWVyZ2UuLi4KKyAgICBpZiAoIXZlY3Rvci5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyID0gdmVjdG9yLmFycmF5SW1wbCgpOworICAgICAgICBjb25zdCBzaXplX3QgaXMgPSBpdGVtU2l6ZSgpOworICAgICAgICBzaXplX3QgcyA9IHZlY3Rvci5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgczsgaSsrKSB7CisgICAgICAgICAgICBzc2l6ZV90IGVyciA9IGFkZChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoYnVmZmVyKSArIGkgKiBpcyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzc2l6ZV90IFNvcnRlZExpc3RJbXBsOjptZXJnZShjb25zdCBTb3J0ZWRMaXN0SW1wbCYgdmVjdG9yKSB7CisgICAgLy8gd2UndmUgbWVyZ2luZyBhIHNvcnRlZCB2ZWN0b3IuLi4gbmljZSEKKyAgICBzc2l6ZV90IGVyciA9IE5PX0VSUk9SOworICAgIGlmICghdmVjdG9yLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBmaXJzdCB0YWtlIGNhcmUgb2YgdGhlIGNhc2Ugd2hlcmUgdGhlIHZlY3RvcnMgYXJlIHNvcnRlZCB0b2dldGhlcgorICAgICAgICBpZiAoZG9fY29tcGFyZSh2ZWN0b3IuaXRlbUxvY2F0aW9uKHZlY3Rvci5zaXplKCkgLSAxKSwgYXJyYXlJbXBsKCkpIDw9IDApIHsKKyAgICAgICAgICAgIGVyciA9IFZlY3RvckltcGw6Omluc2VydFZlY3RvckF0KHN0YXRpY19jYXN0PGNvbnN0IFZlY3RvckltcGwmPiAodmVjdG9yKSwgMCk7CisgICAgICAgIH0gZWxzZSBpZiAoZG9fY29tcGFyZSh2ZWN0b3IuYXJyYXlJbXBsKCksIGl0ZW1Mb2NhdGlvbihzaXplKCkgLSAxKSkgPj0gMCkgeworICAgICAgICAgICAgZXJyID0gVmVjdG9ySW1wbDo6YXBwZW5kVmVjdG9yKHN0YXRpY19jYXN0PGNvbnN0IFZlY3RvckltcGwmPiAodmVjdG9yKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIG1hZGUgYSBsaXR0bGUgYmV0dGVyCisgICAgICAgICAgICBlcnIgPSBtZXJnZShzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4gKHZlY3RvcikpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3NzaXplX3QgU29ydGVkTGlzdEltcGw6OnJlbW92ZShjb25zdCB2b2lkKiBpdGVtKSB7CisgICAgc3NpemVfdCBpID0gaW5kZXhPZihpdGVtKTsKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgIFZlY3RvckltcGw6OnJlbW92ZUl0ZW1zQXQoaSwgMSk7CisgICAgfQorICAgIHJldHVybiBpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS91dGlscy9Tb3J0ZWRMaXN0SW1wbC5oIGIvbGlicy9od3VpL3V0aWxzL1NvcnRlZExpc3RJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMDllZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS91dGlscy9Tb3J0ZWRMaXN0SW1wbC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfU09SVEVEX0xJU1RfSU1QTF9ICisjZGVmaW5lIEFORFJPSURfVUlfU09SVEVEX0xJU1RfSU1QTF9ICisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3JJbXBsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworY2xhc3MgU29ydGVkTGlzdEltcGw6IHB1YmxpYyBWZWN0b3JJbXBsIHsKK3B1YmxpYzoKKyAgICBTb3J0ZWRMaXN0SW1wbChzaXplX3QgaXRlbVNpemUsIHVpbnQzMl90IGZsYWdzKTsKKyAgICBTb3J0ZWRMaXN0SW1wbChjb25zdCBWZWN0b3JJbXBsJiByaHMpOworICAgIHZpcnR1YWwgflNvcnRlZExpc3RJbXBsKCk7CisKKyAgICBTb3J0ZWRMaXN0SW1wbCYgb3BlcmF0b3IgPShjb25zdCBTb3J0ZWRMaXN0SW1wbCYgcmhzKTsKKworICAgIHNzaXplX3QgaW5kZXhPZihjb25zdCB2b2lkKiBpdGVtKSBjb25zdDsKKyAgICBzaXplX3Qgb3JkZXJPZihjb25zdCB2b2lkKiBpdGVtKSBjb25zdDsKKyAgICBzc2l6ZV90IGFkZChjb25zdCB2b2lkKiBpdGVtKTsKKyAgICBzc2l6ZV90IG1lcmdlKGNvbnN0IFZlY3RvckltcGwmIHZlY3Rvcik7CisgICAgc3NpemVfdCBtZXJnZShjb25zdCBTb3J0ZWRMaXN0SW1wbCYgdmVjdG9yKTsKKyAgICBzc2l6ZV90IHJlbW92ZShjb25zdCB2b2lkKiBpdGVtKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgaW50IGRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0ID0gMDsKKworcHJpdmF0ZToKKyAgICBzc2l6ZV90IF9pbmRleE9yZGVyT2YoY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90KiBvcmRlciA9IDApIGNvbnN0OworCisgICAgLy8gdGhlc2UgYXJlIG1hZGUgcHJpdmF0ZSwgYmVjYXVzZSB0aGV5IGNhbid0IGJlIHVzZWQgb24gYSBTb3J0ZWRWZWN0b3IKKyAgICAvLyAodGhleSBkb24ndCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIGVpdGhlcikKKyAgICBzc2l6ZV90IGFkZCgpOworICAgIHZvaWQgcG9wKCk7CisgICAgdm9pZCBwdXNoKCk7CisgICAgdm9pZCBwdXNoKGNvbnN0IHZvaWQqIGl0ZW0pOworICAgIHNzaXplX3QgaW5zZXJ0VmVjdG9yQXQoY29uc3QgVmVjdG9ySW1wbCYgdmVjdG9yLCBzaXplX3QgaW5kZXgpOworICAgIHNzaXplX3QgYXBwZW5kVmVjdG9yKGNvbnN0IFZlY3RvckltcGwmIHZlY3Rvcik7CisgICAgc3NpemVfdCBpbnNlcnRBcnJheUF0KGNvbnN0IHZvaWQqIGFycmF5LCBzaXplX3QgaW5kZXgsIHNpemVfdCBsZW5ndGgpOworICAgIHNzaXplX3QgYXBwZW5kQXJyYXkoY29uc3Qgdm9pZCogYXJyYXksIHNpemVfdCBsZW5ndGgpOworICAgIHNzaXplX3QgaW5zZXJ0QXQoc2l6ZV90IHdoZXJlLCBzaXplX3QgbnVtSXRlbXMgPSAxKTsKKyAgICBzc2l6ZV90IGluc2VydEF0KGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCB3aGVyZSwgc2l6ZV90IG51bUl0ZW1zID0gMSk7CisgICAgc3NpemVfdCByZXBsYWNlQXQoc2l6ZV90IGluZGV4KTsKKyAgICBzc2l6ZV90IHJlcGxhY2VBdChjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QgaW5kZXgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NPUlRFRF9MSVNUX0lNUExfSApkaWZmIC0tZ2l0IGEvbGlicy9ycy9BbmRyb2lkLm1rIGIvbGlicy9ycy9BbmRyb2lkLm1rCmluZGV4IDk4NDY0YTAuLjA1YzFhNDggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvQW5kcm9pZC5taworKysgYi9saWJzL3JzL0FuZHJvaWQubWsKQEAgLTc2LDM0ICs3Niw0MyBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCXJzQWRhcHRlci5jcHAgXAogCXJzQWxsb2NhdGlvbi5jcHAgXAorCXJzQW5pbWF0aW9uLmNwcCBcCiAJcnNDb21wb25lbnQuY3BwIFwKIAlyc0NvbnRleHQuY3BwIFwKIAlyc0RldmljZS5jcHAgXAogCXJzRWxlbWVudC5jcHAgXAotICAgICAgICByc0ZpbGVBM0QuY3BwIFwKLQlyc0xpZ2h0LmNwcCBcCisJcnNGaWxlQTNELmNwcCBcCisJcnNGb250LmNwcCBcCiAJcnNMb2NrbGVzc0ZpZm8uY3BwIFwKIAlyc09iamVjdEJhc2UuY3BwIFwKIAlyc01hdHJpeC5jcHAgXAotICAgICAgICByc01lc2guY3BwIFwKLQlyc05vaXNlLmNwcCBcCisJcnNNZXNoLmNwcCBcCisJcnNNdXRleC5jcHAgXAogCXJzUHJvZ3JhbS5jcHAgXAogCXJzUHJvZ3JhbUZyYWdtZW50LmNwcCBcCi0JcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAgXAorCXJzUHJvZ3JhbVN0b3JlLmNwcCBcCiAJcnNQcm9ncmFtUmFzdGVyLmNwcCBcCiAJcnNQcm9ncmFtVmVydGV4LmNwcCBcCiAJcnNTYW1wbGVyLmNwcCBcCiAJcnNTY3JpcHQuY3BwIFwKIAlyc1NjcmlwdEMuY3BwIFwKIAlyc1NjcmlwdENfTGliLmNwcCBcCi0gICAgICAgIHJzU2hhZGVyQ2FjaGUuY3BwIFwKLQlyc1NpbXBsZU1lc2guY3BwIFwKKwlyc1NjcmlwdENfTGliQ0wuY3BwIFwKKwlyc1NjcmlwdENfTGliR0wuY3BwIFwKKwlyc1NoYWRlckNhY2hlLmNwcCBcCisJcnNTaWduYWwuY3BwIFwKKwlyc1N0cmVhbS5jcHAgXAogCXJzVGhyZWFkSU8uY3BwIFwKIAlyc1R5cGUuY3BwIFwKIAlyc1ZlcnRleEFycmF5LmNwcAogCiAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkVHTCBsaWJHTEVTdjFfQ00gbGliR0xFU3YyIGxpYnVpIGxpYmFjYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJHTEVTdjIgbGlidWkgbGliYmNjCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZnQyCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZQorCiBMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKIExPQ0FMX01PRFVMRTo9IGxpYlJTCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbApkaWZmIC0tZ2l0IGEvbGlicy9ycy9SZW5kZXJTY3JpcHQuaCBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKaW5kZXggZDI4MGY1MC4uNjZlMjdmMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9SZW5kZXJTY3JpcHQuaAorKysgYi9saWJzL3JzL1JlbmRlclNjcmlwdC5oCkBAIC0zMCwyMCArMzAsMjIgQEAKIHR5cGVkZWYgdm9pZCAqIFJzQWRhcHRlcjFEOwogdHlwZWRlZiB2b2lkICogUnNBZGFwdGVyMkQ7CiB0eXBlZGVmIHZvaWQgKiBSc0FsbG9jYXRpb247Cit0eXBlZGVmIHZvaWQgKiBSc0FuaW1hdGlvbjsKIHR5cGVkZWYgdm9pZCAqIFJzQ29udGV4dDsKIHR5cGVkZWYgdm9pZCAqIFJzRGV2aWNlOwogdHlwZWRlZiB2b2lkICogUnNFbGVtZW50OwogdHlwZWRlZiB2b2lkICogUnNGaWxlOwordHlwZWRlZiB2b2lkICogUnNGb250OwogdHlwZWRlZiB2b2lkICogUnNTYW1wbGVyOwogdHlwZWRlZiB2b2lkICogUnNTY3JpcHQ7Ci10eXBlZGVmIHZvaWQgKiBSc1NpbXBsZU1lc2g7Cit0eXBlZGVmIHZvaWQgKiBSc01lc2g7CiB0eXBlZGVmIHZvaWQgKiBSc1R5cGU7Ci10eXBlZGVmIHZvaWQgKiBSc0xpZ2h0OwordHlwZWRlZiB2b2lkICogUnNPYmplY3RCYXNlOwogCiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW07CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1WZXJ0ZXg7CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudDsKLXR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmU7Cit0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1TdG9yZTsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVJhc3RlcjsKIAogdHlwZWRlZiB2b2lkICgqIFJzQml0bWFwQ2FsbGJhY2tfdCkodm9pZCAqKTsKQEAgLTYwLDcgKzYyLDYgQEAKIFJzQ29udGV4dCByc0NvbnRleHRDcmVhdGUoUnNEZXZpY2UsIHVpbnQzMl90IHZlcnNpb24pOwogUnNDb250ZXh0IHJzQ29udGV4dENyZWF0ZUdMKFJzRGV2aWNlLCB1aW50MzJfdCB2ZXJzaW9uLCBib29sIHVzZURlcHRoKTsKIHZvaWQgcnNDb250ZXh0RGVzdHJveShSc0NvbnRleHQpOwotdm9pZCByc09iakRlc3Ryb3lPT0IoUnNDb250ZXh0LCB2b2lkICopOwogCiB1aW50MzJfdCByc0NvbnRleHRHZXRNZXNzYWdlKFJzQ29udGV4dCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpOwogdm9pZCByc0NvbnRleHRJbml0VG9DbGllbnQoUnNDb250ZXh0KTsKQEAgLTgzLDExICs4NCwxNyBAQAogICAgIFJTX1RZUEVfVU5TSUdORURfMzIsCiAgICAgUlNfVFlQRV9VTlNJR05FRF82NCwKIAorICAgIFJTX1RZUEVfQk9PTEVBTiwKKwogICAgIFJTX1RZUEVfVU5TSUdORURfNV82XzUsCiAgICAgUlNfVFlQRV9VTlNJR05FRF81XzVfNV8xLAogICAgIFJTX1RZUEVfVU5TSUdORURfNF80XzRfNCwKIAotICAgIFJTX1RZUEVfRUxFTUVOVCwKKyAgICBSU19UWVBFX01BVFJJWF80WDQsCisgICAgUlNfVFlQRV9NQVRSSVhfM1gzLAorICAgIFJTX1RZUEVfTUFUUklYXzJYMiwKKworICAgIFJTX1RZUEVfRUxFTUVOVCA9IDEwMDAsCiAgICAgUlNfVFlQRV9UWVBFLAogICAgIFJTX1RZUEVfQUxMT0NBVElPTiwKICAgICBSU19UWVBFX1NBTVBMRVIsCkBAIC05NiwyNCArMTAzLDE3IEBACiAgICAgUlNfVFlQRV9QUk9HUkFNX0ZSQUdNRU5ULAogICAgIFJTX1RZUEVfUFJPR1JBTV9WRVJURVgsCiAgICAgUlNfVFlQRV9QUk9HUkFNX1JBU1RFUiwKLSAgICBSU19UWVBFX1BST0dSQU1fU1RPUkUKKyAgICBSU19UWVBFX1BST0dSQU1fU1RPUkUsCiB9OwogCiBlbnVtIFJzRGF0YUtpbmQgewogICAgIFJTX0tJTkRfVVNFUiwKLSAgICBSU19LSU5EX0NPTE9SLAotICAgIFJTX0tJTkRfUE9TSVRJT04sCi0gICAgUlNfS0lORF9URVhUVVJFLAotICAgIFJTX0tJTkRfTk9STUFMLAotICAgIFJTX0tJTkRfSU5ERVgsCi0gICAgUlNfS0lORF9QT0lOVF9TSVpFLAogCi0gICAgUlNfS0lORF9QSVhFTF9MLAorICAgIFJTX0tJTkRfUElYRUxfTCA9IDcsCiAgICAgUlNfS0lORF9QSVhFTF9BLAogICAgIFJTX0tJTkRfUElYRUxfTEEsCiAgICAgUlNfS0lORF9QSVhFTF9SR0IsCiAgICAgUlNfS0lORF9QSVhFTF9SR0JBLAotCiB9OwogCiBlbnVtIFJzU2FtcGxlclBhcmFtIHsKQEAgLTEyMSw3ICsxMjEsOCBAQAogICAgIFJTX1NBTVBMRVJfTUFHX0ZJTFRFUiwKICAgICBSU19TQU1QTEVSX1dSQVBfUywKICAgICBSU19TQU1QTEVSX1dSQVBfVCwKLSAgICBSU19TQU1QTEVSX1dSQVBfUgorICAgIFJTX1NBTVBMRVJfV1JBUF9SLAorICAgIFJTX1NBTVBMRVJfQU5JU08KIH07CiAKIGVudW0gUnNTYW1wbGVyVmFsdWUgewpAQCAtMjA1LDkgKzIwNiw3MCBAQAogZW51bSBSc0Vycm9yIHsKICAgICBSU19FUlJPUl9OT05FLAogICAgIFJTX0VSUk9SX0JBRF9TSEFERVIsCi0gICAgUlNfRVJST1JfQkFEX1NDUklQVAorICAgIFJTX0VSUk9SX0JBRF9TQ1JJUFQsCisgICAgUlNfRVJST1JfQkFEX1ZBTFVFLAorICAgIFJTX0VSUk9SX09VVF9PRl9NRU1PUlkKIH07CiAKK2VudW0gUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIHsKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0xJTkVBUiwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9CRVpJRVIsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fQ0FSRElOQUwsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fSEVSTUlURSwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9CU1BMSU5FCit9OworCitlbnVtIFJzQW5pbWF0aW9uRWRnZSB7CisgICAgUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVELAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NPTlNUQU5ULAorICAgIFJTX0FOSU1BVElPTl9FREdFX0dSQURJRU5ULAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NZQ0xFLAorICAgIFJTX0FOSU1BVElPTl9FREdFX09TQ0lMTEFURSwKKyAgICBSU19BTklNQVRJT05fRURHRV9DWUxFX1JFTEFUSVZFCit9OworCitlbnVtIFJzQTNEQ2xhc3NJRCB7CisgICAgUlNfQTNEX0NMQVNTX0lEX1VOS05PV04sCisgICAgUlNfQTNEX0NMQVNTX0lEX01FU0gsCisgICAgUlNfQTNEX0NMQVNTX0lEX1RZUEUsCisgICAgUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FMTE9DQVRJT04sCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fVkVSVEVYLAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1JBU1RFUiwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9GUkFHTUVOVCwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9TVE9SRSwKKyAgICBSU19BM0RfQ0xBU1NfSURfU0FNUExFUiwKKyAgICBSU19BM0RfQ0xBU1NfSURfQU5JTUFUSU9OLAorICAgIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzFELAorICAgIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzJELAorICAgIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQworfTsKKworZW51bSBSc0N1bGxNb2RlIHsKKyAgICBSU19DVUxMX0JBQ0ssCisgICAgUlNfQ1VMTF9GUk9OVCwKKyAgICBSU19DVUxMX05PTkUKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRDsKKyAgICBjb25zdCBjaGFyKiBvYmplY3ROYW1lOworfSBSc0ZpbGVJbmRleEVudHJ5OworCisvLyBTY3JpcHQgdG8gU2NyaXB0Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgeFN0YXJ0OworICAgIHVpbnQzMl90IHhFbmQ7CisgICAgdWludDMyX3QgeVN0YXJ0OworICAgIHVpbnQzMl90IHlFbmQ7CisgICAgdWludDMyX3QgelN0YXJ0OworICAgIHVpbnQzMl90IHpFbmQ7CisgICAgdWludDMyX3QgYXJyYXlTdGFydDsKKyAgICB1aW50MzJfdCBhcnJheUVuZDsKKworfSBSc1NjcmlwdENhbGw7CisKICNpZm5kZWYgTk9fUlNfRlVOQ1MKICNpbmNsdWRlICJyc2dBcGlGdW5jRGVjbC5oIgogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oIGIvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaAppbmRleCA5OWI4YzA0Li5iODJlYWYxIDEwMDY0NAotLS0gYS9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCisrKyBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKQEAgLTksMTIgKzksMTAgQEAKIHR5cGVkZWYgdm9pZCAqIFJzRWxlbWVudDsKIHR5cGVkZWYgdm9pZCAqIFJzU2FtcGxlcjsKIHR5cGVkZWYgdm9pZCAqIFJzU2NyaXB0OwotdHlwZWRlZiB2b2lkICogUnNTaW1wbGVNZXNoOwordHlwZWRlZiB2b2lkICogUnNNZXNoOwogdHlwZWRlZiB2b2lkICogUnNUeXBlOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnQ7Ci10eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudFN0b3JlOwotdHlwZWRlZiB2b2lkICogUnNMaWdodDsKLQordHlwZWRlZiB2b2lkICogUnNQcm9ncmFtU3RvcmU7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBmbG9hdCBtWzE2XTsKQEAgLTI4LDQgKzI2LDQgQEAKICNkZWZpbmUgUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVCAwCiAjZGVmaW5lIFJTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VUIDE2CiAjZGVmaW5lIFJTX1BST0dSQU1fVkVSVEVYX1RFWFRVUkVfT0ZGU0VUIDMyCi0KKyNkZWZpbmUgUlNfUFJPR1JBTV9WRVJURVhfTVZQX09GRlNFVCA0OApkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNmVkN2UuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0jTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0Ci0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGaWxtCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2U4YTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZpbG0iPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJGaWxtIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iRmlsbSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI5YmRiLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2MmM4Mi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTI2YzAuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWVlNjAzLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjNTI0OC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTEyNjEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGJkOTM4Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxNzVlOC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjM4NzQuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg4MjdkLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4OWY3MS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWYxNmEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEzLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDhiY2JlLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtaW1hZ2UuYyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbWltYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTRjNjguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtaW1hZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAotCi0jcHJhZ21hIHZlcnNpb24oMSkKLSNwcmFnbWEgc3RhdGVWZXJ0ZXgob3J0aG9XaW5kb3cpCi0jcHJhZ21hIHN0YXRlUmFzdGVyKGZsYXQpCi0jcHJhZ21hIHN0YXRlRnJhZ21lbnQoUGdtRnJhZ0JhY2tncm91bmQpCi0jcHJhZ21hIHN0YXRlU3RvcmUoTXlCbGVuZCkKLQotCi1pbnQgbWFpbih2b2lkKiBjb24sIGludCBmdCwgaW50IGxhdW5jaElEKSB7Ci0gICAgaW50IGNvdW50LCB0b3VjaCwgeCwgeSwgcmF0ZSwgbWF4TGlmZSwgbGlmZVNoaWZ0OwotICAgIGludCBsaWZlOwotICAgIGludCBjdCwgY3QyOwotICAgIGludCBuZXdQYXJ0OwotICAgIGludCBkcmF3Q291bnQ7Ci0gICAgaW50IGR4LCBkeSwgaWR4OwotICAgIGludCBwb3N4LHBvc3k7Ci0gICAgaW50IGM7Ci0gICAgaW50IHNyY0lkeDsKLSAgICBpbnQgZHN0SWR4OwotCi0gICAgY291bnQgPSBsb2FkSTMyKGNvbiwgMCwgMSk7Ci0gICAgdG91Y2ggPSBsb2FkSTMyKGNvbiwgMCwgMik7Ci0gICAgeCA9IGxvYWRJMzIoY29uLCAwLCAzKTsKLSAgICB5ID0gbG9hZEkzMihjb24sIDAsIDQpOwotCi0gICAgcmF0ZSA9IDQ7Ci0gICAgbWF4TGlmZSA9IChjb3VudCAvIHJhdGUpIC0gMTsKLSAgICBsaWZlU2hpZnQgPSAwOwotICAgIHsKLSAgICAgICAgbGlmZSA9IG1heExpZmU7Ci0gICAgICAgIHdoaWxlIChsaWZlID4gMjU1KSB7Ci0gICAgICAgICAgICBsaWZlID0gbGlmZSA+PiAxOwotICAgICAgICAgICAgbGlmZVNoaWZ0ICsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHJhd1JlY3QoY29uLCAwLCAyNTYsIDAsIDUxMik7Ci0gICAgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoY29uLCBOQU1FRF9QZ21GcmFnUGFydHMpOwotCi0gICAgaWYgKHRvdWNoKSB7Ci0gICAgICAgIG5ld1BhcnQgPSBsb2FkSTMyKGNvbiwgMiwgMCk7Ci0gICAgICAgIGZvciAoY3QyPTA7IGN0MjxyYXRlOyBjdDIrKykgewotICAgICAgICAgICAgZHggPSBzY3JpcHRSYW5kKGNvbiwgMHgxMDAwMCkgLSAweDgwMDA7Ci0gICAgICAgICAgICBkeSA9IHNjcmlwdFJhbmQoY29uLCAweDEwMDAwKSAtIDB4ODAwMDsKLQotICAgICAgICAgICAgaWR4ID0gbmV3UGFydCAqIDUgKyAxOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHgsIGR4KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgMSwgZHkpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAyLCBtYXhMaWZlKTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgMywgeCA8PCAxNik7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCArIDQsIHkgPDwgMTYpOwotCi0gICAgICAgICAgICBuZXdQYXJ0Kys7Ci0gICAgICAgICAgICBpZiAobmV3UGFydCA+PSBjb3VudCkgewotICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgMCwgbmV3UGFydCk7Ci0gICAgfQotCi0gICAgZHJhd0NvdW50ID0gMDsKLSAgICBmb3IgKGN0PTA7IGN0IDwgY291bnQ7IGN0KyspIHsKLSAgICAgICAgc3JjSWR4ID0gY3QgKiA1ICsgMTsKLQotICAgICAgICBkeCA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHgpOwotICAgICAgICBkeSA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHggKyAxKTsKLSAgICAgICAgbGlmZSA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHggKyAyKTsKLSAgICAgICAgcG9zeCA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHggKyAzKTsKLSAgICAgICAgcG9zeSA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHggKyA0KTsKLQotICAgICAgICBpZiAobGlmZSkgewotICAgICAgICAgICAgaWYgKHBvc3kgPCAoNDgwIDw8IDE2KSkgewotICAgICAgICAgICAgICAgIGRzdElkeCA9IGRyYXdDb3VudCAqIDk7Ci0gICAgICAgICAgICAgICAgYyA9IDB4ZmZhZmNmIHwgKChsaWZlID4+IGxpZmVTaGlmdCkgPDwgMjQpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHgsIGMpOwotICAgICAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMSwgZHN0SWR4ICsgMSwgcG9zeCk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyAyLCBwb3N5KTsKLQotICAgICAgICAgICAgICAgIHN0b3JlVTMyKGNvbiwgMSwgZHN0SWR4ICsgMywgYyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyA0LCBwb3N4ICsgMHgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyA1LCBwb3N5ICsgZHkgKiA0KTsKLQotICAgICAgICAgICAgICAgIHN0b3JlVTMyKGNvbiwgMSwgZHN0SWR4ICsgNiwgYyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyA3LCBwb3N4IC0gMHgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyA4LCBwb3N5ICsgZHkgKiA0KTsKLSAgICAgICAgICAgICAgICBkcmF3Q291bnQgKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkeSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZHkgPSAoLWR5KSA+PiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG9zeCA9IHBvc3ggKyBkeDsKLSAgICAgICAgICAgIHBvc3kgPSBwb3N5ICsgZHk7Ci0gICAgICAgICAgICBkeSA9IGR5ICsgMHg0MDA7Ci0gICAgICAgICAgICBsaWZlIC0tOwotCi0gICAgICAgICAgICAvL3N0b3JlSTMyKGNvbiwgMiwgc3JjSWR4LCBkeCk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDEsIGR5KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMiwgbGlmZSk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDMsIHBvc3gpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBzcmNJZHggKyA0LCBwb3N5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRyYXdUcmlhbmdsZUFycmF5KGNvbiwgTkFNRURfUGFydEJ1ZmZlciwgZHJhd0NvdW50KTsKLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbXN0cmlwLmMgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1zdHJpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjc1Njc1Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAotCi0jcHJhZ21hIHZlcnNpb24oMSkKLSNwcmFnbWEgc3RhdGVWZXJ0ZXgoUFZCYWNrZ3JvdW5kKQotI3ByYWdtYSBzdGF0ZUZyYWdtZW50KFBGQmFja2dyb3VuZCkKLSNwcmFnbWEgc3RhdGVTdG9yZShQU0JhY2tncm91bmQpCi0KLSNkZWZpbmUgU1RBVEVfVFJJQU5HTEVfT0ZGU0VUX0NPVU5UIDAKLSNkZWZpbmUgU1RBVEVfTEFTVF9GT0NVUyAxCi0KLQotLy8gVGhlIHNjcmlwdCBlbnZpcm9tZW50IGhhcyAzIGVudiBhbGxvY2F0aW9ucy4KLS8vIGJhbmswOiAocikgVGhlIGVudmlyb21lbnQgc3RydWN0dXJlCi0vLyBiYW5rMTogKHIpIFRoZSBwb3NpdGlvbiBpbmZvcm1hdGlvbgotLy8gYmFuazI6IChydykgVGhlIHRlbXBvcmFyeSB0ZXh0dXJlIHN0YXRlCi0KLWludCBsYXN0Rm9jdXM7Ci0KLWludCBtYWluKGludCBpbmRleCkKLXsKLSAgICBmbG9hdCBtYXQxWzE2XTsKLQotICAgIGZsb2F0IHRyYW5zID0gUG9zLT50cmFuc2xhdGU7Ci0gICAgZmxvYXQgcm90ID0gUG9zLT5yb3RhdGU7Ci0KLSAgICBtYXRyaXhMb2FkU2NhbGUobWF0MSwgMi5mLCAyLmYsIDIuZik7Ci0gICAgbWF0cml4VHJhbnNsYXRlKG1hdDEsIDAuZiwgMC5mLCB0cmFucyk7Ci0gICAgbWF0cml4Um90YXRlKG1hdDEsIDkwLmYsIDAuZiwgMC5mLCAxLmYpOwotICAgIG1hdHJpeFJvdGF0ZShtYXQxLCByb3QsIDEuZiwgMC5mLCAwLmYpOwotICAgIHZwTG9hZE1vZGVsTWF0cml4KG1hdDEpOwotCi0gICAgLy8gRHJhdyB0aGUgbGlnaHRpbmcgZWZmZWN0IGluIHRoZSBzdHJpcCBhbmQgZmlsbCB0aGUgWiBidWZmZXIuCi0gICAgZHJhd1NpbXBsZU1lc2goTkFNRURfbWVzaCk7Ci0KLSAgICAvLyBTdGFydCBvZiBpbWFnZXMuCi0gICAgYmluZFByb2dyYW1TdG9yZShOQU1FRF9QU0ltYWdlcyk7Ci0gICAgYmluZFByb2dyYW1GcmFnbWVudChOQU1FRF9QRkltYWdlcyk7Ci0gICAgYmluZFByb2dyYW1WZXJ0ZXgoTkFNRURfUFZJbWFnZXMpOwotCi0gICAgZmxvYXQgZm9jdXNQb3MgPSBQb3MtPmZvY3VzOwotICAgIGludCBmb2N1c0lEID0gMDsKLSAgICBpbnQgbGFzdEZvY3VzSUQgPSBsb2FkSTMyKDIsIFNUQVRFX0xBU1RfRk9DVVMpOwotICAgIGludCBpbWdDb3VudCA9IDEzOwotCi0gICAgaWYgKHRyYW5zID4gKC0uM2YpKSB7Ci0gICAgICAgIGZvY3VzSUQgPSAtMS4wZiAtIGZvY3VzUG9zOwotICAgICAgICBpZiAoZm9jdXNJRCA+PSBpbWdDb3VudCkgewotICAgICAgICAgICAgZm9jdXNJRCA9IC0xOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9jdXNJRCA9IC0xOwotICAgIH0KLQotICAgIC8qCi0gICAgaWYgKGZvY3VzSUQgIT0gbGFzdEZvY3VzSUQpIHsKLSAgICAgICAgaWYgKGxhc3RGb2N1c0lEID49IDApIHsKLSAgICAgICAgICAgIHVwbG9hZFRvVGV4dHVyZShjb24sIGVudi0+dGV4W2xhc3RGb2N1c0lEXSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZvY3VzSUQgPj0gMCkgewotICAgICAgICAgICAgdXBsb2FkVG9UZXh0dXJlKGNvbiwgZW52LT50ZXhbZm9jdXNJRF0sIDApOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi0gICAgbGFzdEZvY3VzID0gZm9jdXNJRDsKLQotICAgIGludCB0cmlhbmdsZU9mZnNldHNDb3VudCA9IFBvcy0+dHJpYW5nbGVPZmZzZXRDb3VudDsKLQotICAgIGludCBpbWdJZCA9IDA7Ci0gICAgZm9yIChpbWdJZD0xOyBpbWdJZCA8PSBpbWdDb3VudDsgaW1nSWQrKykgewotICAgICAgICBmbG9hdCBwb3MgPSBmb2N1c1BvcyArIGltZ0lkICsgMC40ZjsKLSAgICAgICAgaW50IG9mZnNldCA9IChpbnQpZmxvb3JmKHBvcyAqIDIuZik7Ci0gICAgICAgIHBvcyA9IHBvcyAtIDAuNzVmOwotCi0gICAgICAgIG9mZnNldCA9IG9mZnNldCArIHRyaWFuZ2xlT2Zmc2V0c0NvdW50IC8gMjsKLSAgICAgICAgaWYgKCEoKG9mZnNldCA8IDApIHx8IChvZmZzZXQgPj0gdHJpYW5nbGVPZmZzZXRzQ291bnQpKSkgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gb2Zmc2V0IC0yOwotICAgICAgICAgICAgaW50IGVuZCA9IG9mZnNldCArIDI7Ci0KLSAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHsKLSAgICAgICAgICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kID49IHRyaWFuZ2xlT2Zmc2V0c0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgZW5kID0gdHJpYW5nbGVPZmZzZXRzQ291bnQtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYmluZFRleHR1cmUoTkFNRURfUEZJbWFnZXMsIDAsIGxvYWRJMzIoMCwgaW1nSWQgLSAxKSk7Ci0gICAgICAgICAgICBtYXRyaXhMb2FkVHJhbnNsYXRlKG1hdDEsIC1wb3MgLSBsb2FkRig1LCB0cmlhbmdsZU9mZnNldHNDb3VudCAvIDIpLCAwLCAwKTsKLSAgICAgICAgICAgIHZwTG9hZFRleHR1cmVNYXRyaXgobWF0MSk7Ci0gICAgICAgICAgICBkcmF3U2ltcGxlTWVzaFJhbmdlKE5BTUVEX21lc2gsIGxvYWRJMzIoNCwgc3RhcnQpLCAobG9hZEkzMig0LCBlbmQpIC0gbG9hZEkzMig0LCBzdGFydCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTk5ODE2Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKLQotcHVibGljIGNsYXNzIEZpbG0gZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgLy9FdmVudExpc3RlbmVyIG1MaXN0ZW5lciA9IG5ldyBFdmVudExpc3RlbmVyKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJsaWJSU19qbmkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dfRU5BQkxFRCA9IERFQlVHID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKLQotICAgIHByaXZhdGUgRmlsbVZpZXcgbVZpZXc7Ci0KLSAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9vcGVyIChmcm9tIHlvdXIgQWN0aXZpdHkgVUkgdGhyZWFkIGZvciBpbnN0YW5jZQotCi0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgotICAgICAgICAvLyBBY3Rpdml0eQotICAgICAgICBtVmlldyA9IG5ldyBGaWxtVmlldyh0aGlzKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQotICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQotICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtVmlldy5vblBhdXNlKCk7Ci0KLSAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZXhpdCgwKTsKLSAgICB9Ci0KLQotICAgIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAoTE9HX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIExvZy52KExPR19UQUcsIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVJTLmphdmEgYi9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtUlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNDUwMi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtUlMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5maWxtOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKLQotcHVibGljIGNsYXNzIEZpbG1SUyB7Ci0gICAgY2xhc3MgU3RyaXBQb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCB0cmFuc2xhdGU7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCByb3RhdGU7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBmb2N1czsKLSAgICAgICAgcHVibGljIGludCB0cmlhbmdsZU9mZnNldENvdW50OwotICAgIH0KLSAgICBTdHJpcFBvc2l0aW9uIG1Qb3MgPSBuZXcgU3RyaXBQb3NpdGlvbigpOwotCi0KLSAgICBwcml2YXRlIGZpbmFsIGludCBTVEFURV9MQVNUX0ZPQ1VTID0gMTsKLQotICAgIHB1YmxpYyBGaWxtUlMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIG1SUyA9IHJzOwotICAgICAgICBtUmVzID0gcmVzOwotICAgICAgICBpbml0UlMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxtU3RyaXBQb3NpdGlvbihpbnQgeCwgaW50IHkpCi0gICAgewotICAgICAgICBpZiAoeCA8IDUwKSB7Ci0gICAgICAgICAgICB4ID0gNTA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHggPiAyNzApIHsKLSAgICAgICAgICAgIHggPSAyNzA7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBhbmltID0gKChmbG9hdCl4LTUwKSAvIDI3MC5mOwotICAgICAgICBtUG9zLnRyYW5zbGF0ZSA9IDJmICogYW5pbSArIDAuNWY7ICAgLy8gdHJhbnNsYXRpb24KLSAgICAgICAgbVBvcy5yb3RhdGUgPSAoYW5pbSAqIDQwKTsgIC8vIHJvdGF0aW9uCi0gICAgICAgIG1Qb3MuZm9jdXMgPSAoKGZsb2F0KXkpIC8gMTYuZiAtIDEwLmY7ICAvLyBmb2N1c1BvcwotICAgICAgICBtUG9zLnRyaWFuZ2xlT2Zmc2V0Q291bnQgPSBtRlNNLm1UcmlhbmdsZU9mZnNldHNDb3VudDsKLSAgICAgICAgbUFsbG9jUG9zLmRhdGEobVBvcyk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOwotICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOwotICAgIHByaXZhdGUgU2NyaXB0IG1TY3JpcHRTdHJpcDsKLSAgICBwcml2YXRlIFNjcmlwdCBtU2NyaXB0SW1hZ2U7Ci0gICAgcHJpdmF0ZSBTYW1wbGVyIG1TYW1wbGVyOwotICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1QU0JhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTSW1hZ2VzOwotICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1QRkJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGSW1hZ2VzOwotICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOwotICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQTsKLSAgICBwcml2YXRlIFR5cGUgbVN0cmlwUG9zaXRpb25UeXBlOwotCi0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1JbWFnZXNbXTsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jSURzOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQb3M7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1N0YXRlOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jT2Zmc2V0c1RleDsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jT2Zmc2V0czsKLQotICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtTWVzaDsKLSAgICBwcml2YXRlIExpZ2h0IG1MaWdodDsKLQotICAgIHByaXZhdGUgRmlsbVN0cmlwTWVzaCBtRlNNOwotCi0gICAgcHJpdmF0ZSBpbnRbXSBtQnVmZmVySURzOwotICAgIHByaXZhdGUgZmxvYXRbXSBtQnVmZmVyUG9zID0gbmV3IGZsb2F0WzNdOwotICAgIHByaXZhdGUgaW50W10gbUJ1ZmZlclN0YXRlOwotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7Ci0gICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKLQotICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOwotICAgICAgICBiLnNldERpdGhlckVuYWJsZSh0cnVlKTsKLSAgICAgICAgYi5zZXREZXB0aE1hc2sodHJ1ZSk7Ci0gICAgICAgIG1QU0JhY2tncm91bmQgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUFNCYWNrZ3JvdW5kLnNldE5hbWUoIlBTQmFja2dyb3VuZCIpOwotCi0gICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuRVFVQUwpOwotICAgICAgICBiLnNldERpdGhlckVuYWJsZShmYWxzZSk7Ci0gICAgICAgIGIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKLSAgICAgICAgYi5zZXRCbGVuZEZ1bmMoUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYy5PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMuT05FKTsKLSAgICAgICAgbVBTSW1hZ2VzID0gYi5jcmVhdGUoKTsKLSAgICAgICAgbVBTSW1hZ2VzLnNldE5hbWUoIlBTSW1hZ2VzIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQRigpIHsKLSAgICAgICAgU2FtcGxlci5CdWlsZGVyIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOwotICAgICAgICBicy5zZXRNaW4oU2FtcGxlci5WYWx1ZS5MSU5FQVIpOy8vX01JUF9MSU5FQVIpOwotICAgICAgICBicy5zZXRNYWcoU2FtcGxlci5WYWx1ZS5MSU5FQVIpOwotICAgICAgICBicy5zZXRXcmFwUyhTYW1wbGVyLlZhbHVlLkNMQU1QKTsKLSAgICAgICAgYnMuc2V0V3JhcFQoU2FtcGxlci5WYWx1ZS5XUkFQKTsKLSAgICAgICAgbVNhbXBsZXIgPSBicy5jcmVhdGUoKTsKLQotICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIG1QRkJhY2tncm91bmQgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUEZCYWNrZ3JvdW5kLnNldE5hbWUoIlBGQmFja2dyb3VuZCIpOwotCi0gICAgICAgIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKLSAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKLSAgICAgICAgbVBGSW1hZ2VzID0gYi5jcmVhdGUoKTsKLSAgICAgICAgbVBGSW1hZ2VzLmJpbmRTYW1wbGVyKG1TYW1wbGVyLCAwKTsKLSAgICAgICAgbVBGSW1hZ2VzLnNldE5hbWUoIlBGSW1hZ2VzIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKLSAgICAgICAgbUxpZ2h0ID0gKG5ldyBMaWdodC5CdWlsZGVyKG1SUykpLmNyZWF0ZSgpOwotICAgICAgICBtTGlnaHQuc2V0UG9zaXRpb24oMCwgLTAuNWYsIC0xLjBmKTsKLQotICAgICAgICBQcm9ncmFtVmVydGV4LkJ1aWxkZXIgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotICAgICAgICAvL3B2Yi5hZGRMaWdodChtTGlnaHQpOwotICAgICAgICBtUFZCYWNrZ3JvdW5kID0gcHZiLmNyZWF0ZSgpOwotICAgICAgICBtUFZCYWNrZ3JvdW5kLnNldE5hbWUoIlBWQmFja2dyb3VuZCIpOwotCi0gICAgICAgIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKLSAgICAgICAgcHZiLnNldFRleHR1cmVNYXRyaXhFbmFibGUodHJ1ZSk7Ci0gICAgICAgIG1QVkltYWdlcyA9IHB2Yi5jcmVhdGUoKTsKLSAgICAgICAgbVBWSW1hZ2VzLnNldE5hbWUoIlBWSW1hZ2VzIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRJbWFnZXMoKSB7Ci0gICAgICAgIG1CdWZmZXJJRHMgPSBuZXcgaW50WzEzXTsKLSAgICAgICAgbUltYWdlcyA9IG5ldyBBbGxvY2F0aW9uWzEzXTsKLSAgICAgICAgbUFsbG9jSURzID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyKSwKLSAgICAgICAgICAgIG1CdWZmZXJJRHMubGVuZ3RoKTsKLQotICAgICAgICBFbGVtZW50IGllID0gRWxlbWVudC5jcmVhdGVQaXhlbChtUlMsIEVsZW1lbnQuRGF0YVR5cGUuVU5TSUdORURfNV82XzUsIEVsZW1lbnQuRGF0YUtpbmQuUElYRUxfUkdCKTsKLSAgICAgICAgbUltYWdlc1swXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwMSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzFdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDAyLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMl0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDMsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1szXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNCwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzRdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA1LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbNV0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDYsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s2XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNywgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzddID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA4LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbOF0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDksIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s5XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAxMCwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzEwXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAxMSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzExXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAxMiwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzEyXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAxMywgaWUsIHRydWUpOwotCi0gICAgICAgIGludCBibGFja1tdID0gbmV3IGludFsxMDI0XTsKLSAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1JbWFnZXMubGVuZ3RoOyBjdCsrKSB7Ci0gICAgICAgICAgICBBbGxvY2F0aW9uLkFkYXB0ZXIyRCBhID0gbUltYWdlc1tjdF0uY3JlYXRlQWRhcHRlcjJEKCk7Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gNTEyOwotICAgICAgICAgICAgaW50IG1pcCA9IDA7Ci0gICAgICAgICAgICB3aGlsZShzaXplID49IDIpIHsKLSAgICAgICAgICAgICAgICBhLnN1YkRhdGEoMCwgMCwgMiwgc2l6ZSwgYmxhY2spOwotICAgICAgICAgICAgICAgIGEuc3ViRGF0YShzaXplLTIsIDAsIDIsIHNpemUsIGJsYWNrKTsKLSAgICAgICAgICAgICAgICBhLnN1YkRhdGEoMCwgMCwgc2l6ZSwgMiwgYmxhY2spOwotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCBzaXplLTIsIHNpemUsIDIsIGJsYWNrKTsKLSAgICAgICAgICAgICAgICBzaXplID4+PSAxOwotICAgICAgICAgICAgICAgIG1pcCsrOwotICAgICAgICAgICAgICAgIGEuc2V0Q29uc3RyYWludChEaW1lbnNpb24uTE9ELCBtaXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtSW1hZ2VzW2N0XS51cGxvYWRUb1RleHR1cmUoMSk7Ci0gICAgICAgICAgICBtQnVmZmVySURzW2N0XSA9IG1JbWFnZXNbY3RdLmdldElEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFsbG9jSURzLmRhdGEobUJ1ZmZlcklEcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0ZSgpCi0gICAgewotICAgICAgICBtQnVmZmVyU3RhdGUgPSBuZXcgaW50WzEwXTsKLSAgICAgICAgbUFsbG9jU3RhdGUgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLAotICAgICAgICAgICAgbUJ1ZmZlclN0YXRlLmxlbmd0aCk7Ci0gICAgICAgIG1CdWZmZXJTdGF0ZVtTVEFURV9MQVNUX0ZPQ1VTXSA9IC0xOwotICAgICAgICBtQWxsb2NTdGF0ZS5kYXRhKG1CdWZmZXJTdGF0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRSUygpIHsKLSAgICAgICAgbUZTTSA9IG5ldyBGaWxtU3RyaXBNZXNoKCk7Ci0gICAgICAgIG1NZXNoID0gbUZTTS5pbml0KG1SUyk7Ci0gICAgICAgIG1NZXNoLnNldE5hbWUoIm1lc2giKTsKLQotICAgICAgICBpbml0UEZTKCk7Ci0gICAgICAgIGluaXRQRigpOwotICAgICAgICBpbml0UFYoKTsKLQotICAgICAgICBMb2cuZSgicnMiLCAiRG9uZSBsb2FkaW5nIG5hbWVkIik7Ci0KLSAgICAgICAgbVN0cmlwUG9zaXRpb25UeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBTdHJpcFBvc2l0aW9uLmNsYXNzLCAxKTsKLQotICAgICAgICBTY3JpcHRDLkJ1aWxkZXIgc2IgPSBuZXcgU2NyaXB0Qy5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIHNiLnNldFNjcmlwdChtUmVzLCBSLnJhdy5maWxtc3RyaXApOwotICAgICAgICBzYi5zZXRSb290KHRydWUpOwotICAgICAgICBzYi5zZXRUeXBlKG1TdHJpcFBvc2l0aW9uVHlwZSwgIlBvcyIsIDEpOwotICAgICAgICBtU2NyaXB0U3RyaXAgPSBzYi5jcmVhdGUoKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLnNldENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMS4wZik7Ci0KLSAgICAgICAgbUFsbG9jUG9zID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1TdHJpcFBvc2l0aW9uVHlwZSk7Ci0KLSAgICAgICAgbG9hZEltYWdlcygpOwotICAgICAgICBpbml0U3RhdGUoKTsKLQotICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOwotICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOwotICAgICAgICBtUFZJbWFnZXMuYmluZEFsbG9jYXRpb24obVBWQSk7Ci0gICAgICAgIG1QVkEuc2V0dXBQcm9qZWN0aW9uTm9ybWFsaXplZCgzMjAsIDQ4MCk7Ci0KLQotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jSURzLCAwKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY1BvcywgMSk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NTdGF0ZSwgMik7Ci0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtUFZBLm1BbGxvYywgMyk7Ci0KLQotICAgICAgICBtQWxsb2NPZmZzZXRzID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksIG1GU00ubVRyaWFuZ2xlT2Zmc2V0cy5sZW5ndGgpOwotICAgICAgICBtQWxsb2NPZmZzZXRzLmRhdGEobUZTTS5tVHJpYW5nbGVPZmZzZXRzKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY09mZnNldHMsIDQpOwotCi0gICAgICAgIG1BbGxvY09mZnNldHNUZXggPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLCBtRlNNLm1UcmlhbmdsZU9mZnNldHNUZXgubGVuZ3RoKTsKLSAgICAgICAgbUFsbG9jT2Zmc2V0c1RleC5kYXRhKG1GU00ubVRyaWFuZ2xlT2Zmc2V0c1RleCk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NPZmZzZXRzVGV4LCA1KTsKLQotICAgICAgICBzZXRGaWxtU3RyaXBQb3NpdGlvbigwLCAwKTsKLSAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0U3RyaXApOwotICAgIH0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1TdHJpcE1lc2guamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1TdHJpcE1lc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4Y2NlMC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtU3RyaXBNZXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5maWxtOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TaW1wbGVNZXNoOwotCi0KLWNsYXNzIEZpbG1TdHJpcE1lc2ggewotCi0gICAgY2xhc3MgVmVydGV4IHsKLSAgICAgICAgZmxvYXQgbng7Ci0gICAgICAgIGZsb2F0IG55OwotICAgICAgICBmbG9hdCBuejsKLSAgICAgICAgZmxvYXQgczsKLSAgICAgICAgZmxvYXQgdDsKLSAgICAgICAgZmxvYXQgeDsKLSAgICAgICAgZmxvYXQgeTsKLSAgICAgICAgZmxvYXQgejsKLQotICAgICAgICBWZXJ0ZXgoKSB7Ci0gICAgICAgICAgICBueCA9IDA7Ci0gICAgICAgICAgICBueSA9IDA7Ci0gICAgICAgICAgICBueiA9IDA7Ci0gICAgICAgICAgICBzID0gMDsKLSAgICAgICAgICAgIHQgPSAwOwotICAgICAgICAgICAgeCA9IDA7Ci0gICAgICAgICAgICB5ID0gMDsKLSAgICAgICAgICAgIHogPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB4eXooZmxvYXQgX3gsIGZsb2F0IF95LCBmbG9hdCBfeikgewotICAgICAgICAgICAgeCA9IF94OwotICAgICAgICAgICAgeSA9IF95OwotICAgICAgICAgICAgeiA9IF96OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBueHl6KGZsb2F0IF94LCBmbG9hdCBfeSwgZmxvYXQgX3opIHsKLSAgICAgICAgICAgIG54ID0gX3g7Ci0gICAgICAgICAgICBueSA9IF95OwotICAgICAgICAgICAgbnogPSBfejsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc3QoZmxvYXQgX3MsIGZsb2F0IF90KSB7Ci0gICAgICAgICAgICBzID0gX3M7Ci0gICAgICAgICAgICB0ID0gX3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNvbXB1dGVOb3JtKFZlcnRleCB2MSwgVmVydGV4IHYyKSB7Ci0gICAgICAgICAgICBmbG9hdCBkeCA9IHYxLnggLSB2Mi54OwotICAgICAgICAgICAgZmxvYXQgZHkgPSB2MS55IC0gdjIueTsKLSAgICAgICAgICAgIGZsb2F0IGR6ID0gdjEueiAtIHYyLno7Ci0gICAgICAgICAgICBmbG9hdCBsZW4gPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc3FydChkeCpkeCArIGR5KmR5ICsgZHoqZHopOwotICAgICAgICAgICAgZHggLz0gbGVuOwotICAgICAgICAgICAgZHkgLz0gbGVuOwotICAgICAgICAgICAgZHogLz0gbGVuOwotCi0gICAgICAgICAgICBueCA9IGR4ICogZHo7Ci0gICAgICAgICAgICBueSA9IGR5ICogZHo7Ci0gICAgICAgICAgICBueiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KGR4KmR4ICsgZHkqZHkpOwotCi0gICAgICAgICAgICBsZW4gPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc3FydChueCpueCArIG55Km55ICsgbnoqbnopOwotICAgICAgICAgICAgbnggLz0gbGVuOwotICAgICAgICAgICAgbnkgLz0gbGVuOwotICAgICAgICAgICAgbnogLz0gbGVuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50W10gbVRyaWFuZ2xlT2Zmc2V0czsKLSAgICBmbG9hdFtdIG1UcmlhbmdsZU9mZnNldHNUZXg7Ci0gICAgaW50IG1UcmlhbmdsZU9mZnNldHNDb3VudDsKLQotICAgIFNpbXBsZU1lc2ggaW5pdChSZW5kZXJTY3JpcHQgcnMpCi0gICAgewotICAgICAgICBmbG9hdCB2dHhbXSA9IG5ldyBmbG9hdFtdIHsKLSAgICAgICAgICAgIDYwLjQzMTAwM2YsIDEyNC40ODIwNTBmLAotICAgICAgICAgICAgNjAuODYyMDc0ZiwgMTIwLjg3MjYwNGYsCi0gICAgICAgICAgICA2MS43MDUzMDNmLCAxMTcuMzM2NjYyZiwKLSAgICAgICAgICAgIDYyLjk0OTUwNWYsIDExMy45MjExMjdmLAotICAgICAgICAgICAgNjQuNTc4MTc3ZiwgMTEwLjY3MTMwNGYsCi0gICAgICAgICAgICA2Ni41Njk3MTZmLCAxMDcuNjMwMzAyZiwKLSAgICAgICAgICAgIDY4Ljg5NzcwM2YsIDEwNC44Mzg0NTdmLAotICAgICAgICAgICAgNzEuNTMxMjU5ZiwgMTAyLjMzMjgwM2YsCi0gICAgICAgICAgICA3NC40MzU0NTJmLCAxMDAuMTQ2NTc3ZiwKLSAgICAgICAgICAgIDc3LjU3MTc1N2YsIDk4LjMwODc3N2YsCi0gICAgICAgICAgICA4MC44OTg1NzRmLCA5Ni44NDM3ODFmLAotICAgICAgICAgICAgODQuMzcxNzczZiwgOTUuNzcxMDIzZiwKLSAgICAgICAgICAgIDg3Ljk0NTI4M2YsIDk1LjEwNDczMWYsCi0gICAgICAgICAgICA5OC45NTg5OTRmLCA5NS4yNjcwOThmLAotICAgICAgICAgICAgMTA5LjQ4OTUyM2YsIDk4LjQ5NzU5NmYsCi0gICAgICAgICAgICAxMTguNjk5NTgyZiwgMTA0LjUzOTM2NmYsCi0gICAgICAgICAgICAxMjUuODU2ODcyZiwgMTEyLjkxMjAyMmYsCi0gICAgICAgICAgICAxMzAuMzkyMzExZiwgMTIyLjk0OTg0OWYsCi0gICAgICAgICAgICAxMzEuOTQ1MjgzZiwgMTMzLjg1NDczMWYsCi0gICAgICAgICAgICAxMzAuMzkyMzExZiwgMTQ0Ljc1OTYxM2YsCi0gICAgICAgICAgICAxMjUuODU2ODcyZiwgMTU0Ljc5NzQzOWYsCi0gICAgICAgICAgICAxMTguNjk5NTgyZiwgMTYzLjE3MDA5NmYsCi0gICAgICAgICAgICAxMDkuNDg5NTIzZiwgMTY5LjIxMTg2NmYsCi0gICAgICAgICAgICA5OC45NTg5OTRmLCAxNzIuNDQyMzY0ZiwKLSAgICAgICAgICAgIDg3Ljk0NTI4M2YsIDE3Mi42MDQ3MzFmLAotICAgICAgICAgICAgNzIuNTA3MzEzZiwgMTcyLjY3MjkyN2YsCi0gICAgICAgICAgICA1Ny42Nzg5MjBmLCAxNjguMzc3MDcxZiwKLSAgICAgICAgICAgIDQ0LjY2ODEzNWYsIDE2MC4wNjcxMzRmLAotICAgICAgICAgICAgMzQuNTM0OTA4ZiwgMTQ4LjQyMDEwNGYsCi0gICAgICAgICAgICAyOC4xMDQ3NjdmLCAxMzQuMzg0ODMxZiwKLSAgICAgICAgICAgIDI1LjkwMTU1N2YsIDExOS4xMDQ3MzFmLAotICAgICAgICAgICAgMjguMTA0NzY3ZiwgMTAzLjgyNDYzMWYsCi0gICAgICAgICAgICAzNC41MzQ5MDhmLCA4OS43ODkzNThmLAotICAgICAgICAgICAgNDQuNjY4MTM1ZiwgNzguMTQyMzI3ZiwKLSAgICAgICAgICAgIDU3LjY3ODkyMGYsIDY5LjgzMjM5MGYsCi0gICAgICAgICAgICA3Mi41MDczMTNmLCA2NS41MzY1MzRmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgNjUuNjA0NzMxZiwKLSAgICAgICAgICAgIDEwNi45MTgxMTdmLCA2NS42ODg1NDJmLAotICAgICAgICAgICAgMTI1LjE0MTc5NWYsIDYwLjQwOTA1NmYsCi0gICAgICAgICAgICAxNDEuMTMxNjg2ZiwgNTAuMTk2Mzc2ZiwKLSAgICAgICAgICAgIDE1My41ODUxMzdmLCAzNS44ODI1MDJmLAotICAgICAgICAgICAgMTYxLjQ4NzYwMGYsIDE4LjYzMzU0NWYsCi0gICAgICAgICAgICAxNjQuMTk1MjgzZiwgLTAuMTQ1MjY5ZiwKLSAgICAgICAgICAgIDE2MS40ODc2MDBmLCAtMTguOTI0MDg0ZiwKLSAgICAgICAgICAgIDE1My41ODUxMzdmLCAtMzYuMTczMDQwZiwKLSAgICAgICAgICAgIDE0MS4xMzE2ODZmLCAtNTAuNDg2OTE0ZiwKLSAgICAgICAgICAgIDEyNS4xNDE3OTVmLCAtNjAuNjk5NTk0ZiwKLSAgICAgICAgICAgIDEwNi45MTgxMTdmLCAtNjUuOTc5MDgxZiwKLSAgICAgICAgICAgIDg3Ljk0NTI4M2YsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgODBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDYwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICA0MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgMjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC0yMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTQwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtNjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC04MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTEwNi45MTgxMTdmLCAtNjUuOTc5MDgxZiwKLSAgICAgICAgICAgIC0xMjUuMTQxNzk1ZiwgLTYwLjY5OTU5NGYsCi0gICAgICAgICAgICAtMTQxLjEzMTY4NmYsIC01MC40ODY5MTRmLAotICAgICAgICAgICAgLTE1My41ODUxMzdmLCAtMzYuMTczMDQwZiwKLSAgICAgICAgICAgIC0xNjEuNDg3NjAwZiwgLTE4LjkyNDA4NGYsCi0gICAgICAgICAgICAtMTY0LjE5NTI4M2YsIC0wLjE0NTI2OWYsCi0gICAgICAgICAgICAtMTYxLjQ4NzYwMGYsIDE4LjYzMzU0NWYsCi0gICAgICAgICAgICAgLTE1My41ODUxMzdmLCAzNS44ODI1MDJmLAotICAgICAgICAgICAgIC0xNDEuMTMxNjg2ZiwgNTAuMTk2Mzc2ZiwKLSAgICAgICAgICAgICAtMTI1LjE0MTc5NWYsIDYwLjQwOTA1NmYsCi0gICAgICAgICAgICAgLTEwNi45MTgxMTdmLCA2NS42ODg1NDJmLAotICAgICAgICAgICAgIC04Ny45NDUyODNmLCA2NS42MDQ3MzFmLAotICAgICAgICAgICAgIC03Mi41MDczMTNmLCA2NS41MzY1MzRmLAotICAgICAgICAgICAgIC01Ny42Nzg5MjBmLCA2OS44MzIzOTBmLAotICAgICAgICAgICAgIC00NC42NjgxMzVmLCA3OC4xNDIzMjdmLAotICAgICAgICAgICAgIC0zNC41MzQ5MDhmLCA4OS43ODkzNThmLAotICAgICAgICAgICAgIC0yOC4xMDQ3NjdmLCAxMDMuODI0NjMxZiwKLSAgICAgICAgICAgICAtMjUuOTAxNTU3ZiwgMTE5LjEwNDczMWYsCi0gICAgICAgICAgICAgLTI4LjEwNDc2N2YsIDEzNC4zODQ4MzFmLAotICAgICAgICAgICAgIC0zNC41MzQ5MDhmLCAxNDguNDIwMTA0ZiwKLSAgICAgICAgICAgICAtNDQuNjY4MTM1ZiwgMTYwLjA2NzEzNGYsCi0gICAgICAgICAgICAgLTU3LjY3ODkyMGYsIDE2OC4zNzcwNzFmLAotICAgICAgICAgICAgIC03Mi41MDczMTNmLCAxNzIuNjcyOTI3ZiwKLSAgICAgICAgICAgICAtODcuOTQ1MjgzZiwgMTcyLjYwNDczMWYsCi0gICAgICAgICAgICAgLTk4Ljk1ODk5NGYsIDE3Mi40NDIzNjRmLAotICAgICAgICAgICAgIC0xMDkuNDg5NTIzZiwgMTY5LjIxMTg2NmYsCi0gICAgICAgICAgICAgLTExOC42OTk1ODJmLCAxNjMuMTcwMDk2ZiwKLSAgICAgICAgICAgICAtMTI1Ljg1Njg3MmYsIDE1NC43OTc0MzlmLAotICAgICAgICAgICAgIC0xMzAuMzkyMzExZiwgMTQ0Ljc1OTYxM2YsCi0gICAgICAgICAgICAgLTEzMS45NDUyODNmLCAxMzMuODU0NzMxZiwKLSAgICAgICAgICAgICAtMTMwLjM5MjMxMWYsIDEyMi45NDk4NDlmLAotICAgICAgICAgICAgIC0xMjUuODU2ODcyZiwgMTEyLjkxMjAyMmYsCi0gICAgICAgICAgICAgLTExOC42OTk1ODJmLCAxMDQuNTM5MzY2ZiwKLSAgICAgICAgICAgICAtMTA5LjQ4OTUyM2YsIDk4LjQ5NzU5NmYsCi0gICAgICAgICAgICAgLTk4Ljk1ODk5NGYsIDk1LjI2NzA5OGYsCi0gICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIDk1LjEwNDczMWYsCi0gICAgICAgICAgICAgLTg0LjM3MTc3M2YsIDk1Ljc3MTAyM2YsCi0gICAgICAgICAgICAgLTgwLjg5ODU3NGYsIDk2Ljg0Mzc4MWYsCi0gICAgICAgICAgICAgLTc3LjU3MTc1N2YsIDk4LjMwODc3N2YsCi0gICAgICAgICAgICAgLTc0LjQzNTQ1MmYsIDEwMC4xNDY1NzdmLAotICAgICAgICAgICAgIC03MS41MzEyNTlmLCAxMDIuMzMyODAzZiwKLSAgICAgICAgICAgICAtNjguODk3NzAzZiwgMTA0LjgzODQ1N2YsCi0gICAgICAgICAgICAgLTY2LjU2OTcxNmYsIDEwNy42MzAzMDJmLAotICAgICAgICAgICAgIC02NC41NzgxNzdmLCAxMTAuNjcxMzA0ZiwKLSAgICAgICAgICAgICAtNjIuOTQ5NTA1ZiwgMTEzLjkyMTEyN2YsCi0gICAgICAgICAgICAgLTYxLjcwNTMwM2YsIDExNy4zMzY2NjJmLAotICAgICAgICAgICAgIC02MC44NjIwNzRmLCAxMjAuODcyNjA0ZiwKLSAgICAgICAgICAgICAtNjAuNDMxMDAzZiwgMTI0LjQ4MjA1MGYKLSAgICAgICAgfTsKLQotCi0gICAgICAgIG1UcmlhbmdsZU9mZnNldHMgPSBuZXcgaW50WzY0XTsKLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c1RleCA9IG5ldyBmbG9hdFs2NF07Ci0KLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c1swXSA9IDA7Ci0gICAgICAgIG1UcmlhbmdsZU9mZnNldHNDb3VudCA9IDE7Ci0KLSAgICAgICAgVmVydGV4IHQgPSBuZXcgVmVydGV4KCk7Ci0gICAgICAgIHQubnh5eigxLCAwLCAwKTsKLSAgICAgICAgaW50IGNvdW50ID0gdnR4Lmxlbmd0aCAvIDI7Ci0KLSAgICAgICAgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyIHRtID0gbmV3IFNpbXBsZU1lc2guVHJpYW5nbGVNZXNoQnVpbGRlcigKLSAgICAgICAgICAgIHJzLCAzLAotICAgICAgICAgICAgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyLk5PUk1BTCB8IFNpbXBsZU1lc2guVHJpYW5nbGVNZXNoQnVpbGRlci5URVhUVVJFXzApOwotCi0gICAgICAgIGZsb2F0IHJ1bm5pbmdTID0gMDsKLSAgICAgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAoY291bnQtMSk7IGN0KyspIHsKLSAgICAgICAgICAgIHQueCA9IC12dHhbY3QqMl0gLyAxMDAuZjsKLSAgICAgICAgICAgIHQueiA9IHZ0eFtjdCoyKzFdIC8gMTAwLmY7Ci0gICAgICAgICAgICB0LnMgPSBydW5uaW5nUzsKLSAgICAgICAgICAgIHQubnggPSAgKHZ0eFtjdCoyKzNdIC0gdnR4W2N0KjIgKzFdKTsKLSAgICAgICAgICAgIHQubnkgPSAgKHZ0eFtjdCoyKzJdIC0gdnR4W2N0KjIgICBdKTsKLSAgICAgICAgICAgIGZsb2F0IGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KHQubnggKiB0Lm54ICsgdC5ueSAqIHQubnkpOwotICAgICAgICAgICAgcnVubmluZ1MgKz0gbGVuIC8gMTAwOwotICAgICAgICAgICAgdC5ueCAvPSBsZW47Ci0gICAgICAgICAgICB0Lm55IC89IGxlbjsKLSAgICAgICAgICAgIHQueSA9IC0wLjVmOwotICAgICAgICAgICAgdC50ID0gMDsKLSAgICAgICAgICAgIHRtLnNldE5vcm1hbCh0Lm54LCB0Lm55LCB0Lm56KTsKLSAgICAgICAgICAgIHRtLnNldFRleHR1cmUodC5zLCB0LnQpOwotICAgICAgICAgICAgdG0uYWRkVmVydGV4KHQueCwgdC55LCB0LnopOwotICAgICAgICAgICAgLy9hbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgInZ0eCB4PSIrdC54KyIgeT0iK3QueSsiIHo9Iit0LnorIiBzPSIrdC5zKyIgdD0iK3QudCk7Ci0gICAgICAgICAgICB0LnkgPSAuNWY7Ci0gICAgICAgICAgICB0LnQgPSAxOwotICAgICAgICAgICAgdG0uc2V0VGV4dHVyZSh0LnMsIHQudCk7Ci0gICAgICAgICAgICB0bS5hZGRWZXJ0ZXgodC54LCB0LnksIHQueik7Ci0gICAgICAgICAgICAvL2FuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAidnR4IHg9Iit0LngrIiB5PSIrdC55KyIgej0iK3QueisiIHM9Iit0LnMrIiB0PSIrdC50KTsKLQotICAgICAgICAgICAgaWYoKHJ1bm5pbmdTKjIpID4gbVRyaWFuZ2xlT2Zmc2V0c0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c1ttVHJpYW5nbGVPZmZzZXRzQ291bnRdID0gY3QqMiAqIDM7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c1RleFttVHJpYW5nbGVPZmZzZXRzQ291bnRdID0gdC5zOwotICAgICAgICAgICAgICAgIG1UcmlhbmdsZU9mZnNldHNDb3VudCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvdW50ID0gKGNvdW50ICogMiAtIDIpOwotICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IChjb3VudC0yKTsgY3QrPSAyKSB7Ci0gICAgICAgICAgICB0bS5hZGRUcmlhbmdsZShjdCwgY3QrMSwgY3QrMik7Ci0gICAgICAgICAgICB0bS5hZGRUcmlhbmdsZShjdCsxLCBjdCszLCBjdCsyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG0uY3JlYXRlKCk7Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1WaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzI4MTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKLQotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRmlsbVZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKLQotICAgIHB1YmxpYyBGaWxtVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOwotICAgIHByaXZhdGUgRmlsbVJTIG1SZW5kZXI7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKLSAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOwotICAgICAgICBpZiAobVJTID09IG51bGwpIHsKLSAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKLSAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKLSAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgRmlsbVJTKCk7Ci0gICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgaWYobVJTICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SUyA9IG51bGw7Ci0gICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgLy8gYnJlYWsgcG9pbnQgYXQgaGVyZQotICAgICAgICAvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IHdvcmsgd2hlbiAnZXh0ZW5kcyBWaWV3JyBpbmNsdWRlICdleHRlbmRzIFNjcm9sbFZpZXcnLgotICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLSAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOwotICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgewotICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlbmRlci5zZXRGaWxtU3RyaXBQb3NpdGlvbigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkgLyA1KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vQW5kcm9pZC5tawppbmRleCBmN2U1M2E4Li43MTk0NGIyIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vQW5kcm9pZC5taworKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vQW5kcm9pZC5tawpAQCAtMTQsMTQgKzE0LDE4IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQogI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gRm91bnRhaW4KIAogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL2RyYXdhYmxlL2dhZGdldHNfY2xvY2tfbXAzLnBuZyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvZHJhd2FibGUvZ2FkZ2V0c19jbG9ja19tcDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTFiZmI0Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvZHJhd2FibGUvZ2FkZ2V0c19jbG9ja19tcDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4uYyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYjgxOWIuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0jcHJhZ21hIHZlcnNpb24oMSkKLQotaW50IG5ld1BhcnQgPSAwOwotCi1pbnQgbWFpbihpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY3Q7Ci0gICAgaW50IGNvdW50ID0gQ29udHJvbC0+Y291bnQ7Ci0gICAgaW50IHJhdGUgPSBDb250cm9sLT5yYXRlOwotICAgIGZsb2F0IGhlaWdodCA9IGdldEhlaWdodCgpOwotICAgIHN0cnVjdCBwb2ludF9zICogcCA9IChzdHJ1Y3QgcG9pbnRfcyAqKXBvaW50OwotCi0gICAgaWYgKHJhdGUpIHsKLSAgICAgICAgZmxvYXQgck1heCA9ICgoZmxvYXQpcmF0ZSkgKiAwLjAwNWY7Ci0gICAgICAgIGludCB4ID0gQ29udHJvbC0+eDsKLSAgICAgICAgaW50IHkgPSBDb250cm9sLT55OwotICAgICAgICBpbnQgY29sb3IgPSAoKGludCkoQ29udHJvbC0+ciAqIDI1NS5mKSkgfAotICAgICAgICAgICAgICAgICAgICAoKGludCkoQ29udHJvbC0+ZyAqIDI1NS5mKSkgPDwgOCB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5iICogMjU1LmYpKSA8PCAxNiB8Ci0gICAgICAgICAgICAgICAgICAgICgweGYwIDw8IDI0KTsKLSAgICAgICAgc3RydWN0IHBvaW50X3MgKiBucCA9ICZwW25ld1BhcnRdOwotCi0gICAgICAgIHdoaWxlIChyYXRlLS0pIHsKLSAgICAgICAgICAgIHZlYzJSYW5kKChmbG9hdCAqKSZucC0+ZGVsdGEueCwgck1heCk7Ci0gICAgICAgICAgICBucC0+cG9zaXRpb24ueCA9IHg7Ci0gICAgICAgICAgICBucC0+cG9zaXRpb24ueSA9IHk7Ci0gICAgICAgICAgICBucC0+Y29sb3IgPSBjb2xvcjsKLSAgICAgICAgICAgIG5ld1BhcnQrKzsKLSAgICAgICAgICAgIG5wKys7Ci0gICAgICAgICAgICBpZiAobmV3UGFydCA+PSBjb3VudCkgewotICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAwOwotICAgICAgICAgICAgICAgIG5wID0gJnBbbmV3UGFydF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGN0PTA7IGN0IDwgY291bnQ7IGN0KyspIHsKLSAgICAgICAgZmxvYXQgZHkgPSBwLT5kZWx0YS55ICsgMC4xNWY7Ci0gICAgICAgIGZsb2F0IHBvc3kgPSBwLT5wb3NpdGlvbi55ICsgZHk7Ci0gICAgICAgIGlmICgocG9zeSA+IGhlaWdodCkgJiYgKGR5ID4gMCkpIHsKLSAgICAgICAgICAgIGR5ICo9IC0wLjNmOwotICAgICAgICB9Ci0gICAgICAgIHAtPmRlbHRhLnkgPSBkeTsKLSAgICAgICAgcC0+cG9zaXRpb24ueCArPSBwLT5kZWx0YS54OwotICAgICAgICBwLT5wb3NpdGlvbi55ID0gcG9zeTsKLSAgICAgICAgcCsrOwotICAgIH0KLQotICAgIHVwbG9hZFRvQnVmZmVyT2JqZWN0KE5BTUVEX1BhcnRCdWZmZXIpOwotICAgIGRyYXdTaW1wbGVNZXNoKE5BTUVEX1BhcnRNZXNoKTsKLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluMi5ycyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluMi5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMTE0MC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbjIucnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAotI3ByYWdtYSB2ZXJzaW9uKDEpCi0KLSNpbmNsdWRlICJyc190eXBlcy5yc2giCi0jaW5jbHVkZSAicnNfbWF0aC5yc2giCi0jaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgotCi1zdGF0aWMgaW50IG5ld1BhcnQgPSAwOwotCi10eXBlZGVmIHN0cnVjdCBDb250cm9sX3MgewotICAgIGludCB4LCB5OwotICAgIGludCByYXRlOwotICAgIGludCBjb3VudDsKLSAgICBmbG9hdCByLCBnLCBiOwotICAgIHJzX2FsbG9jYXRpb24gcGFydEJ1ZmZlcjsKLSAgICByc19tZXNoIHBhcnRNZXNoOwotfSBDb250cm9sX3Q7Ci1Db250cm9sX3QgKkNvbnRyb2w7Ci0KLXR5cGVkZWYgc3RydWN0IFBvaW50X3N7Ci0gICAgZmxvYXQyIGRlbHRhOwotICAgIGZsb2F0MiBwb3NpdGlvbjsKLSAgICB1bnNpZ25lZCBpbnQgY29sb3I7Ci19IFBvaW50X3Q7Ci1Qb2ludF90ICpwb2ludDsKLQotaW50IG1haW4oaW50IGxhdW5jaElEKSB7Ci0gICAgaW50IGN0OwotICAgIGludCBjb3VudCA9IENvbnRyb2wtPmNvdW50OwotICAgIGludCByYXRlID0gQ29udHJvbC0+cmF0ZTsKLSAgICBmbG9hdCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLSAgICBQb2ludF90ICogcCA9IHBvaW50OwotCi0gICAgaWYgKHJhdGUpIHsKLSAgICAgICAgZmxvYXQgck1heCA9ICgoZmxvYXQpcmF0ZSkgKiAwLjAwNWY7Ci0gICAgICAgIGludCB4ID0gQ29udHJvbC0+eDsKLSAgICAgICAgaW50IHkgPSBDb250cm9sLT55OwotICAgICAgICBpbnQgY29sb3IgPSAoKGludCkoQ29udHJvbC0+ciAqIDI1NS5mKSkgfAotICAgICAgICAgICAgICAgICAgICAoKGludCkoQ29udHJvbC0+ZyAqIDI1NS5mKSkgPDwgOCB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5iICogMjU1LmYpKSA8PCAxNiB8Ci0gICAgICAgICAgICAgICAgICAgICgweGYwIDw8IDI0KTsKLSAgICAgICAgUG9pbnRfdCAqIG5wID0gJnBbbmV3UGFydF07Ci0KLSAgICAgICAgd2hpbGUgKHJhdGUtLSkgewotICAgICAgICAgICAgbnAtPmRlbHRhID0gdmVjMlJhbmQock1heCk7Ci0gICAgICAgICAgICBucC0+cG9zaXRpb24ueCA9IHg7Ci0gICAgICAgICAgICBucC0+cG9zaXRpb24ueSA9IHk7Ci0gICAgICAgICAgICBucC0+Y29sb3IgPSBjb2xvcjsKLSAgICAgICAgICAgIG5ld1BhcnQrKzsKLSAgICAgICAgICAgIG5wKys7Ci0gICAgICAgICAgICBpZiAobmV3UGFydCA+PSBjb3VudCkgewotICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAwOwotICAgICAgICAgICAgICAgIG5wID0gJnBbbmV3UGFydF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGN0PTA7IGN0IDwgY291bnQ7IGN0KyspIHsKLSAgICAgICAgZmxvYXQgZHkgPSBwLT5kZWx0YS55ICsgMC4xNWY7Ci0gICAgICAgIGZsb2F0IHBvc3kgPSBwLT5wb3NpdGlvbi55ICsgZHk7Ci0gICAgICAgIGlmICgocG9zeSA+IGhlaWdodCkgJiYgKGR5ID4gMCkpIHsKLSAgICAgICAgICAgIGR5ICo9IC0wLjNmOwotICAgICAgICB9Ci0gICAgICAgIHAtPmRlbHRhLnkgPSBkeTsKLSAgICAgICAgcC0+cG9zaXRpb24ueCArPSBwLT5kZWx0YS54OwotICAgICAgICBwLT5wb3NpdGlvbi55ID0gcG9zeTsKLSAgICAgICAgcCsrOwotICAgIH0KLQotICAgIHVwbG9hZFRvQnVmZmVyT2JqZWN0KENvbnRyb2wtPnBhcnRCdWZmZXIpOwotICAgIGRyYXdTaW1wbGVNZXNoKENvbnRyb2wtPnBhcnRNZXNoKTsKLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEKaW5kZXggOTM1NjU3OS4uMGIyNmNmZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEKQEAgLTIyLDk0ICsyMiw1MCBAQAogCiAKIHB1YmxpYyBjbGFzcyBGb3VudGFpblJTIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUX0NPVU5UID0gMjAwMDA7Ci0KLSAgICBzdGF0aWMgY2xhc3MgU29tZURhdGEgewotICAgICAgICBwdWJsaWMgaW50IHg7Ci0gICAgICAgIHB1YmxpYyBpbnQgeTsKLSAgICAgICAgcHVibGljIGludCByYXRlOwotICAgICAgICBwdWJsaWMgaW50IGNvdW50OwotICAgICAgICBwdWJsaWMgZmxvYXQgcjsKLSAgICAgICAgcHVibGljIGZsb2F0IGc7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBiOwotICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUX0NPVU5UID0gNTAwMDA7CiAKICAgICBwdWJsaWMgRm91bnRhaW5SUygpIHsKICAgICB9CiAKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2NyaXB0Q19mb3VudGFpbiBtU2NyaXB0OwogICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBtUlMgPSByczsKICAgICAgICAgbVJlcyA9IHJlczsKLSAgICAgICAgaW5pdFJTKCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgcGZiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKHJzKTsKKyAgICAgICAgcGZiLnNldFZhcnlpbmdDb2xvcih0cnVlKTsKKyAgICAgICAgcnMuY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQocGZiLmNyZWF0ZSgpKTsKKworICAgICAgICBTY3JpcHRGaWVsZF9Qb2ludCBwb2ludHMgPSBuZXcgU2NyaXB0RmllbGRfUG9pbnQobVJTLCBQQVJUX0NPVU5UKTsKKworICAgICAgICBNZXNoLkFsbG9jYXRpb25CdWlsZGVyIHNtYiA9IG5ldyBNZXNoLkFsbG9jYXRpb25CdWlsZGVyKG1SUyk7CisgICAgICAgIHNtYi5hZGRWZXJ0ZXhBbGxvY2F0aW9uKHBvaW50cy5nZXRBbGxvY2F0aW9uKCkpOworICAgICAgICBzbWIuYWRkSW5kZXhUeXBlKFByaW1pdGl2ZS5QT0lOVCk7CisgICAgICAgIE1lc2ggc20gPSBzbWIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX2ZvdW50YWluKG1SUywgbVJlcywgUi5yYXcuZm91bnRhaW4sIHRydWUpOworICAgICAgICBtU2NyaXB0LnNldF9wYXJ0TWVzaChzbSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9wb2ludChwb2ludHMpOworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5ld1RvdWNoUG9zaXRpb24oaW50IHgsIGludCB5LCBpbnQgcmF0ZSkgewotICAgICAgICBpZiAobVNELnJhdGUgPT0gMCkgewotICAgICAgICAgICAgbVNELnIgPSAoKHggJiAweDEpICE9IDApID8gMC5mIDogMS5mOwotICAgICAgICAgICAgbVNELmcgPSAoKHggJiAweDIpICE9IDApID8gMC5mIDogMS5mOwotICAgICAgICAgICAgbVNELmIgPSAoKHggJiAweDQpICE9IDApID8gMC5mIDogMS5mOwotICAgICAgICAgICAgaWYgKChtU0QuciArIG1TRC5nICsgbVNELmIpIDwgMC45ZikgewotICAgICAgICAgICAgICAgIG1TRC5yID0gMC44ZjsKLSAgICAgICAgICAgICAgICBtU0QuZyA9IDAuNWY7Ci0gICAgICAgICAgICAgICAgbVNELmIgPSAxLmY7Ci0gICAgICAgICAgICB9CisgICAgYm9vbGVhbiBob2xkaW5nQ29sb3JbXSA9IG5ldyBib29sZWFuWzEwXTsKKyAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHByZXNzdXJlLCBpbnQgaWQpIHsKKyAgICAgICAgaWYgKGlkID4gaG9sZGluZ0NvbG9yLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1TRC5yYXRlID0gcmF0ZTsKLSAgICAgICAgbVNELnggPSB4OwotICAgICAgICBtU0QueSA9IHk7Ci0gICAgICAgIG1JbnRBbGxvYy5kYXRhKG1TRCk7CisgICAgICAgIGludCByYXRlID0gKGludCkocHJlc3N1cmUgKiBwcmVzc3VyZSAqIDUwMC5mKTsKKyAgICAgICAgaWYocmF0ZSA+IDUwMCkgeworICAgICAgICAgICAgcmF0ZSA9IDUwMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmF0ZSA+IDApIHsKKyAgICAgICAgICAgIG1TY3JpcHQuaW52b2tlX2FkZFBhcnRpY2xlcyhyYXRlLCB4LCB5LCBpZCwgIWhvbGRpbmdDb2xvcltpZF0pOworICAgICAgICAgICAgaG9sZGluZ0NvbG9yW2lkXSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBob2xkaW5nQ29sb3JbaWRdID0gZmFsc2U7CisgICAgICAgIH0KKwogICAgIH0KLQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7Ci0KLSAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUludEFsbG9jOwotICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtU007Ci0gICAgcHJpdmF0ZSBTb21lRGF0YSBtU0Q7Ci0gICAgcHJpdmF0ZSBUeXBlIG1TRFR5cGU7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgICAgICBtU0QgPSBuZXcgU29tZURhdGEoKTsKLSAgICAgICAgbVNEVHlwZSA9IFR5cGUuY3JlYXRlRnJvbUNsYXNzKG1SUywgU29tZURhdGEuY2xhc3MsIDEsICJTb21lRGF0YSIpOwotICAgICAgICBtSW50QWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVNEVHlwZSk7Ci0gICAgICAgIG1TRC5jb3VudCA9IFBBUlRfQ09VTlQ7Ci0gICAgICAgIG1JbnRBbGxvYy5kYXRhKG1TRCk7Ci0KLSAgICAgICAgRWxlbWVudC5CdWlsZGVyIGViID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVWZWN0b3IobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLCAyKSwgImRlbHRhIik7Ci0gICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsIEVsZW1lbnQuRGF0YUtpbmQuUE9TSVRJT04sIDIpLCAicG9zaXRpb24iKTsKLSAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywgRWxlbWVudC5EYXRhVHlwZS5VTlNJR05FRF84LCBFbGVtZW50LkRhdGFLaW5kLkNPTE9SLCA0KSwgImNvbG9yIik7Ci0gICAgICAgIEVsZW1lbnQgcHJpbUVsZW1lbnQgPSBlYi5jcmVhdGUoKTsKLQotCi0gICAgICAgIFNpbXBsZU1lc2guQnVpbGRlciBzbWIgPSBuZXcgU2ltcGxlTWVzaC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGludCB2dHhTbG90ID0gc21iLmFkZFZlcnRleFR5cGUocHJpbUVsZW1lbnQsIFBBUlRfQ09VTlQpOwotICAgICAgICBzbWIuc2V0UHJpbWl0aXZlKFByaW1pdGl2ZS5QT0lOVCk7Ci0gICAgICAgIG1TTSA9IHNtYi5jcmVhdGUoKTsKLSAgICAgICAgbVNNLnNldE5hbWUoIlBhcnRNZXNoIik7Ci0KLSAgICAgICAgQWxsb2NhdGlvbiBwYXJ0QWxsb2MgPSBtU00uY3JlYXRlVmVydGV4QWxsb2NhdGlvbih2dHhTbG90KTsKLSAgICAgICAgcGFydEFsbG9jLnNldE5hbWUoIlBhcnRCdWZmZXIiKTsKLSAgICAgICAgbVNNLmJpbmRWZXJ0ZXhBbGxvY2F0aW9uKHBhcnRBbGxvYywgMCk7Ci0KLSAgICAgICAgLy8gQWxsIHNldHVwIG9mIG5hbWVkIG9iamVjdHMgc2hvdWxkIGJlIGRvbmUgYnkgdGhpcyBwb2ludAotICAgICAgICAvLyBiZWNhdXNlIHdlIGFyZSBhYm91dCB0byBjb21waWxlIHRoZSBzY3JpcHQuCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KG1SZXMsIFIucmF3LmZvdW50YWluKTsKLSAgICAgICAgc2Iuc2V0Um9vdCh0cnVlKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtU0RUeXBlLCAiQ29udHJvbCIsIDApOwotICAgICAgICBzYi5zZXRUeXBlKG1TTS5nZXRWZXJ0ZXhUeXBlKDApLCAicG9pbnQiLCAxKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IHNiLmNyZWF0ZSgpOwotICAgICAgICBzY3JpcHQuc2V0Q2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKLQotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24obUludEFsbG9jLCAwKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKHBhcnRBbGxvYywgMSk7Ci0gICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQoc2NyaXB0KTsKLSAgICB9Ci0KIH0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQppbmRleCBkZmQ2YTQ5Li5jMTQxMTY1NmIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQpAQCAtNzEsMTcgKzcxLDMzIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQogICAgIHsKLSAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CiAgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgZXYuZ2V0UG9pbnRlcklkKDApKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3QgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgIC8vIG9ubHkgb25lIHBvaW50ZXIgZ29pbmcgdXAsIHdlIGNhbiBnZXQgdGhlIGluZGV4IGxpa2UgdGhpcworICAgICAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmdldEFjdGlvbkluZGV4KCk7CisgICAgICAgICAgICBpbnQgcG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKHBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgcG9pbnRlcklkKTsKICAgICAgICAgfQotICAgICAgICBmbG9hdCByYXRlID0gKGV2LmdldFByZXNzdXJlKCkgKiA1MC5mKTsKLSAgICAgICAgcmF0ZSAqPSByYXRlOwotICAgICAgICBpZihyYXRlID4gMjAwMC5mKSB7Ci0gICAgICAgICAgICByYXRlID0gMjAwMC5mOworICAgICAgICBpbnQgY291bnQgPSBldi5nZXRIaXN0b3J5U2l6ZSgpOworICAgICAgICBpbnQgcGNvdW50ID0gZXYuZ2V0UG9pbnRlckNvdW50KCk7CisKKyAgICAgICAgZm9yIChpbnQgcD0wOyBwIDwgcGNvdW50OyBwKyspIHsKKyAgICAgICAgICAgIGludCBpZCA9IGV2LmdldFBvaW50ZXJJZChwKTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRYKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFkocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0UHJlc3N1cmUocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKGV2LmdldEhpc3RvcmljYWxYKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRIaXN0b3JpY2FsWShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFByZXNzdXJlKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSwgKGludClyYXRlKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9mb3VudGFpbi5ycyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vZm91bnRhaW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0NTc0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vZm91bnRhaW4ucnMKQEAgLTAsMCArMSw3MSBAQAorLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLmZvdW50YWluKQorCisjcHJhZ21hIHN0YXRlRnJhZ21lbnQocGFyZW50KQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCitzdGF0aWMgaW50IG5ld1BhcnQgPSAwOworcnNfbWVzaCBwYXJ0TWVzaDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgUG9pbnQgeworICAgIGZsb2F0MiBkZWx0YTsKKyAgICBmbG9hdDIgcG9zaXRpb247CisgICAgdWNoYXI0IGNvbG9yOworfSBQb2ludF90OworUG9pbnRfdCAqcG9pbnQ7CisKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoYWRkUGFydGljbGVzKQorCitpbnQgcm9vdCgpIHsKKyAgICBmbG9hdCBkdCA9IG1pbihyc0dldER0KCksIDAuMWYpOworICAgIHJzZ0NsZWFyQ29sb3IoMC5mLCAwLmYsIDAuZiwgMS5mKTsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgZmxvYXQgZHkyID0gZHQgKiAoMTAuZik7CisgICAgUG9pbnRfdCAqIHAgPSBwb2ludDsKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IHNpemU7IGN0KyspIHsKKyAgICAgICAgcC0+ZGVsdGEueSArPSBkeTI7CisgICAgICAgIHAtPnBvc2l0aW9uICs9IHAtPmRlbHRhOworICAgICAgICBpZiAoKHAtPnBvc2l0aW9uLnkgPiBoZWlnaHQpICYmIChwLT5kZWx0YS55ID4gMCkpIHsKKyAgICAgICAgICAgIHAtPmRlbHRhLnkgKj0gLTAuM2Y7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgIH0KKworICAgIHJzZ0RyYXdNZXNoKHBhcnRNZXNoKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGZsb2F0NCBwYXJ0Q29sb3JbMTBdOwordm9pZCBhZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGludCBpbmRleCwgYm9vbCBuZXdDb2xvcikKK3sKKyAgICBpZiAobmV3Q29sb3IpIHsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS54ID0gcnNSYW5kKDAuNWYsIDEuMGYpOworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnkgPSByc1JhbmQoMS4wZik7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueiA9IHJzUmFuZCgxLjBmKTsKKyAgICB9CisgICAgZmxvYXQgck1heCA9ICgoZmxvYXQpcmF0ZSkgKiAwLjAyZjsKKyAgICBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgdWNoYXI0IGMgPSByc1BhY2tDb2xvclRvODg4OChwYXJ0Q29sb3JbaW5kZXhdKTsKKworICAgIFBvaW50X3QgKiBucCA9ICZwb2ludFtuZXdQYXJ0XTsKKyAgICBmbG9hdDIgcCA9IHt4LCB5fTsKKyAgICB3aGlsZSAocmF0ZS0tKSB7CisgICAgICAgIGZsb2F0IGFuZ2xlID0gcnNSYW5kKDMuMTRmICogMi5mKTsKKyAgICAgICAgZmxvYXQgbGVuID0gcnNSYW5kKHJNYXgpOworICAgICAgICBucC0+ZGVsdGEueCA9IGxlbiAqIHNpbihhbmdsZSk7CisgICAgICAgIG5wLT5kZWx0YS55ID0gbGVuICogY29zKGFuZ2xlKTsKKyAgICAgICAgbnAtPnBvc2l0aW9uID0gcDsKKyAgICAgICAgbnAtPmNvbG9yID0gYzsKKyAgICAgICAgbmV3UGFydCsrOworICAgICAgICBucCsrOworICAgICAgICBpZiAobmV3UGFydCA+PSBzaXplKSB7CisgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKKyAgICAgICAgICAgIG5wID0gJnBvaW50W25ld1BhcnRdOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWQubWsKaW5kZXggODMzNDI3Yi4uN2ZhMzBkMCAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZC5tawpAQCAtMTQsMTQgKzE0LDE5IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgICAgICAgICAgICAgICAgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKICNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEltYWdlUHJvY2Vzc2luZwogCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiNDhkMjA4Li5kNmEyZGI0IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC02LDcgKzYsOCBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJJbWFnZSBQcm9jZXNzaW5nIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2RyYXdhYmxlL2RhdGEuanBnIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvZHJhd2FibGUvZGF0YS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhODdiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2RyYXdhYmxlL2RhdGEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbAppbmRleCA2NzcwYzE4Li5jNmVjNzI5IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9sYXlvdXQvbWFpbi54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0yNSw5ICsyNSwxNDcgQEAKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaXNwbGF5IgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzIwZGlwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2NmRpcCIgLz4KLSAgICAKKworICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9iZW5jaG1hcmsiCisgICAgICAgIGFuZHJvaWQ6b25DbGljaz0iYmVuY2htYXJrIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JlbmNobWFya1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTc1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYXR1cmF0aW9uIi8+CisKKyAgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pblNhdHVyYXRpb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTQwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5TYXR1cmF0aW9uVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE0MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhdHVyYXRpb24iLz4KKwogICAgIDxTZWVrQmFyCi0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGhyZXNob2xkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luR2FtbWEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5HYW1tYVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9nYW1tYSIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9vdXRfd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5XaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbldoaXRlVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5fd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2tUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjUyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvb3V0X2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luQmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5CbGFja1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luX2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JhZGl1cyIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKQEAgLTM1LDQgKzE3MywxNSBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgogCisgICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JsdXJUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ibHVyX2Rlc2NyaXB0aW9uIi8+CisKIDwvbWVyZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3Jhdy90aHJlc2hvbGQucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OGYwY2QuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0vLyBibG9jayBvZiBkZWZpbmVzIG1hdGNoaW5nIHdoYXQgUlMgd2lsbCBpbnNlcnQgYXQgcnVudGltZS4KLXN0cnVjdCBQYXJhbXNfc3sKLSAgICBpbnQgaW5IZWlnaHQ7Ci0gICAgaW50IGluV2lkdGg7Ci0gICAgaW50IG91dEhlaWdodDsKLSAgICBpbnQgb3V0V2lkdGg7Ci0gICAgZmxvYXQgdGhyZXNob2xkOwotfTsKLXN0cnVjdCBQYXJhbXNfcyAqIFBhcmFtczsKLXN0cnVjdCBJblBpeGVsX3N7Ci0gICAgY2hhciBhOwotICAgIGNoYXIgYjsKLSAgICBjaGFyIGc7Ci0gICAgY2hhciByOwotfTsKLXN0cnVjdCBJblBpeGVsX3MgKiBJblBpeGVsOwotc3RydWN0IE91dFBpeGVsX3N7Ci0gICAgY2hhciBhOwotICAgIGNoYXIgYjsKLSAgICBjaGFyIGc7Ci0gICAgY2hhciByOwotfTsKLXN0cnVjdCBPdXRQaXhlbF9zICogT3V0UGl4ZWw7Ci0qLwotCi1zdHJ1Y3QgY29sb3JfcyB7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci0gICAgY2hhciBhOwotfTsKLQotdm9pZCBtYWluKCkgewotICAgIGludCB0ID0gdXB0aW1lTWlsbGlzKCk7Ci0KLSAgICBzdHJ1Y3QgY29sb3JfcyAqaW4gPSAoc3RydWN0IGNvbG9yX3MgKikgSW5QaXhlbDsKLSAgICBzdHJ1Y3QgY29sb3JfcyAqb3V0ID0gKHN0cnVjdCBjb2xvcl9zICopIE91dFBpeGVsOwotCi0gICAgaW50IGNvdW50ID0gUGFyYW1zLT5pbldpZHRoICogUGFyYW1zLT5pbkhlaWdodDsKLSAgICBpbnQgaTsKLSAgICBmbG9hdCB0aHJlc2hvbGQgPSAoUGFyYW1zLT50aHJlc2hvbGQgKiAyNTUuZik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBmbG9hdCBsdW1pbmFuY2UgPSAwLjIxMjVmICogaW4tPnIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcxNTRmICogaW4tPmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA3MjFmICogaW4tPmI7Ci0gICAgICAgIGlmIChsdW1pbmFuY2UgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICpvdXQgPSAqaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqKChpbnQgKilvdXQpID0gKigoaW50ICopaW4pICYgMHhmZjAwMDAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIGluKys7Ci0gICAgICAgIG91dCsrOwotICAgIH0KLQotICAgIHQ9IHVwdGltZU1pbGxpcygpIC0gdDsKLSAgICBkZWJ1Z0kzMigiRmlsdGVyIHRpbWUiLCB0KTsKLQotICAgIHNlbmRUb0NsaWVudCgmY291bnQsIDEsIDQsIDApOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNWNjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIEdlbmVyYWwgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tc2xpZGVyIGxhYmVsIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYmx1cl9kZXNjcmlwdGlvbiI+Qmx1ciBSYWRpdXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImluX3doaXRlIj5JbiBXaGl0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib3V0X3doaXRlIj5PdXQgV2hpdGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImluX2JsYWNrIj5JbiBCbGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib3V0X2JsYWNrIj5PdXQgQmxhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImdhbW1hIj5HYW1tYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2F0dXJhdGlvbiI+U2F0dXJhdGlvbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmVuY2htYXJrIj5CZW5jaG1hcms8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YQppbmRleCA5Y2U1M2Q4Li5lODA2OTY5IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEKQEAgLTMxLDUzICszMSw1NiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGphdmEubGFuZy5NYXRoOwogCi1wdWJsaWMgY2xhc3MgSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgewotICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXA7Ci0gICAgcHJpdmF0ZSBQYXJhbXMgbVBhcmFtczsKLSAgICBwcml2YXRlIFNjcmlwdC5JbnZva2FibGUgbUludm9rYWJsZTsKLSAgICBwcml2YXRlIGludFtdIG1JbkRhdGE7Ci0gICAgcHJpdmF0ZSBpbnRbXSBtT3V0RGF0YTsKK3B1YmxpYyBjbGFzcyBJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwSW47CisgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcE91dDsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwU2NyYXRjaDsKKyAgICBwcml2YXRlIFNjcmlwdENfdGhyZXNob2xkIG1TY3JpcHQ7CisgICAgcHJpdmF0ZSBTY3JpcHRDX3ZlcnRpY2FsX2JsdXIgbVNjcmlwdFZCbHVyOworICAgIHByaXZhdGUgU2NyaXB0Q19ob3Jpem9udGFsX2JsdXIgbVNjcmlwdEhCbHVyOworICAgIHByaXZhdGUgaW50IG1SYWRpdXMgPSAwOworICAgIHByaXZhdGUgU2Vla0JhciBtUmFkaXVzU2Vla0JhcjsKKworICAgIHByaXZhdGUgZmxvYXQgbUluQmxhY2sgPSAwLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtSW5CbGFja1NlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtT3V0QmxhY2sgPSAwLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtT3V0QmxhY2tTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbUluV2hpdGUgPSAyNTUuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1JbldoaXRlU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1PdXRXaGl0ZSA9IDI1NS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbU91dFdoaXRlU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1HYW1tYSA9IDEuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1HYW1tYVNlZWtCYXI7CisKKyAgICBwcml2YXRlIGZsb2F0IG1TYXR1cmF0aW9uID0gMS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbVNhdHVyYXRpb25TZWVrQmFyOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQmVuY2htYXJrUmVzdWx0OwogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKLSAgICBwcml2YXRlIFR5cGUgbVBhcmFtc1R5cGU7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbVBhcmFtc0FsbG9jYXRpb247Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIFR5cGUgbVBpeGVsVHlwZTsKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtSW5QaXhlbHNBbGxvY2F0aW9uOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1PdXRQaXhlbHNBbGxvY2F0aW9uOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjE7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjI7CiAKICAgICBwcml2YXRlIFN1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKICAgICBwcml2YXRlIEltYWdlVmlldyBtRGlzcGxheVZpZXc7CiAKLSAgICBzdGF0aWMgY2xhc3MgUGFyYW1zIHsKLSAgICAgICAgcHVibGljIGludCBpbldpZHRoOwotICAgICAgICBwdWJsaWMgaW50IG91dFdpZHRoOwotICAgICAgICBwdWJsaWMgaW50IGluSGVpZ2h0OwotICAgICAgICBwdWJsaWMgaW50IG91dEhlaWdodDsKLQotICAgICAgICBwdWJsaWMgZmxvYXQgdGhyZXNob2xkOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBQaXhlbCB7Ci0gICAgICAgIHB1YmxpYyBieXRlIGE7Ci0gICAgICAgIHB1YmxpYyBieXRlIHI7Ci0gICAgICAgIHB1YmxpYyBieXRlIGc7Ci0gICAgICAgIHB1YmxpYyBieXRlIGI7Ci0gICAgfQotCiAgICAgY2xhc3MgRmlsdGVyQ2FsbGJhY2sgZXh0ZW5kcyBSZW5kZXJTY3JpcHQuUlNNZXNzYWdlIHsKICAgICAgICAgcHJpdmF0ZSBSdW5uYWJsZSBtQWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLnJlYWREYXRhKG1PdXREYXRhKTsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldFBpeGVscyhtT3V0RGF0YSwgMCwgbVBhcmFtcy5vdXRXaWR0aCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMub3V0V2lkdGgsIG1QYXJhbXMub3V0SGVpZ2h0KTsKICAgICAgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwpAQCAtODksMjkgKzkyLDIxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGphdmFGaWx0ZXIoKSB7CisgICAgaW50IGluW107CisgICAgaW50IGludGVybVtdOworICAgIGludCBvdXRbXTsKKyAgICBpbnQgTUFYX1JBRElVUyA9IDI1OworICAgIC8vIFN0b3JlIG91ciBjb2VmZmljaWVudHMgaGVyZQorICAgIGZsb2F0IGdhdXNzaWFuW107CisKKyAgICBwcml2YXRlIGxvbmcgamF2YUZpbHRlcigpIHsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gbUJpdG1hcEluLmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBtQml0bWFwSW4uZ2V0SGVpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHdpZHRoICogaGVpZ2h0OworCisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpbiA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgaW50ZXJtID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICBvdXQgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIGdhdXNzaWFuID0gbmV3IGZsb2F0W01BWF9SQURJVVMgKiAyICsgMV07CisgICAgICAgICAgICBtQml0bWFwSW4uZ2V0UGl4ZWxzKGluLCAwLCB3aWR0aCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKwogICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGludCBjb3VudCA9IG1QYXJhbXMuaW5XaWR0aCAqIG1QYXJhbXMuaW5IZWlnaHQ7Ci0gICAgICAgIGZsb2F0IHRocmVzaG9sZCA9IG1QYXJhbXMudGhyZXNob2xkICogMjU1LmY7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCByID0gKGZsb2F0KSgobUluRGF0YVtpXSA+PiAwKSAmIDB4ZmYpOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZyA9IChmbG9hdCkoKG1JbkRhdGFbaV0gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGIgPSAoZmxvYXQpKChtSW5EYXRhW2ldID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBpbnQgdywgaCwgcjsKIAotICAgICAgICAgICAgZmluYWwgZmxvYXQgbHVtaW5hbmNlID0gMC4yMTI1ZiAqIHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MTU0ZiAqIGcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNzIxZiAqIGI7Ci0gICAgICAgICAgICBpZiAobHVtaW5hbmNlID4gdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgbU91dERhdGFbaV0gPSBtSW5EYXRhW2ldOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtT3V0RGF0YVtpXSA9IG1JbkRhdGFbaV0gJiAweGZmMDAwMDAwOworICAgICAgICBmbG9hdCBmUmFkaXVzID0gKGZsb2F0KW1SYWRpdXM7CisgICAgICAgIGludCByYWRpdXMgPSAoaW50KW1SYWRpdXM7CisKKyAgICAgICAgLy8gQ29tcHV0ZSBnYXVzc2lhbiB3ZWlnaHRzIGZvciB0aGUgYmx1cgorICAgICAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgICAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgICAgICBmbG9hdCBwaSA9IDMuMTQxNTkyNjUzNTg5NzkzMmY7CisgICAgICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgICAgIC8vIGFuZCBzaWdtYSB2YXJpZXMgd2l0aCByYWRpdXMuCisgICAgICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAgICAgLy8gc2lnbWEgPSByYWRpdXMgKiAwLjQgICsgMC42CisgICAgICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgICAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgICAgICAvLyB0aGUgZ2F1c3NpYW4gY3VydmUgYmVnaW5zIHRvIGxvc2UgaXRzIHNoYXBlCisgICAgICAgIGZsb2F0IHNpZ21hID0gMC40ZiAqIGZSYWRpdXMgKyAwLjZmOworICAgICAgICAvLyBOb3cgY29tcHV0ZSB0aGUgY29lZmZpY2ludHMKKyAgICAgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgICAgICAvLyBwcmVjb21wdXRlIHNvbWUgdmFsdWVzCisgICAgICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoZmxvYXQpKE1hdGguc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gPSBjb2VmZjEgKiAoZmxvYXQpTWF0aC5wb3coZSwgZmxvYXRSICogZmxvYXRSICogY29lZmYyKTsKKyAgICAgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciA9IDEuMGYgLyBub3JtYWxpemVGYWN0b3I7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbEcgPSAwLjBmOworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgZm9yKGggPSAwOyBoIDwgaGVpZ2h0OyBoICsrKSB7CisgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkVyA9IHcgKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aCBtYXgoKSBpc24ndCBleHBvc2VkIGZvciBpbnRzIHlldAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZFcgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA+IHdpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW5baCp3aWR0aCArIHZhbGlkV107CisKKyAgICAgICAgICAgICAgICAgICAgaW50IFIgPSAoKGlucHV0ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgRyA9ICgoaW5wdXQgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBCID0gKChpbnB1dCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnB1dCAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworCisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgKz0gKGZsb2F0KShSKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgKz0gKGZsb2F0KShHKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgKz0gKGZsb2F0KShCKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgKz0gKGZsb2F0KShBKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IFIgPSAoaW50KWJsdXJyZWRQaXhlbFI7CisgICAgICAgICAgICAgICAgaW50IEcgPSAoaW50KWJsdXJyZWRQaXhlbEc7CisgICAgICAgICAgICAgICAgaW50IEIgPSAoaW50KWJsdXJyZWRQaXhlbEI7CisgICAgICAgICAgICAgICAgaW50IEEgPSAoaW50KWJsdXJyZWRQaXhlbEE7CisKKyAgICAgICAgICAgICAgICBpbnRlcm1baCp3aWR0aCArIHddID0gKFIgPDwgMjQpIHwgKEcgPDwgMTYpIHwgKEIgPDwgOCkgfCAoQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IHdpZHRoOyB3ICsrKSB7CisKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBID0gMC4wZjsKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZEggPSBoICsgcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPiBoZWlnaHQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSBoZWlnaHQgLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW50ZXJtW3ZhbGlkSCp3aWR0aCArIHddOworCisgICAgICAgICAgICAgICAgICAgIGludCBSID0gKChpbnB1dCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEcgPSAoKGlucHV0ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQiA9ICgoaW5wdXQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEEgPSAoaW5wdXQgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSICs9IChmbG9hdCkoUikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHICs9IChmbG9hdCkoRykqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCICs9IChmbG9hdCkoQikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBICs9IChmbG9hdCkoQSkqd2VpZ2h0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBSID0gKGludClibHVycmVkUGl4ZWxSOworICAgICAgICAgICAgICAgIGludCBHID0gKGludClibHVycmVkUGl4ZWxHOworICAgICAgICAgICAgICAgIGludCBCID0gKGludClibHVycmVkUGl4ZWxCOworICAgICAgICAgICAgICAgIGludCBBID0gKGludClibHVycmVkUGl4ZWxBOworCisgICAgICAgICAgICAgICAgb3V0W2gqd2lkdGggKyB3XSA9IChSIDw8IDI0KSB8IChHIDw8IDE2KSB8IChCIDw8IDgpIHwgKEEpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIkphdmEgZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgICAgIG1CaXRtYXBPdXQuc2V0UGl4ZWxzKG91dCwgMCwgd2lkdGgsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CiAKLSAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgaWYgKGZyb21Vc2VyKSB7CisKKyAgICAgICAgICAgIGlmKHNlZWtCYXIgPT0gbVJhZGl1c1NlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmUmFkaXVzID0gcHJvZ3Jlc3MgLyAxMDAuMGY7CisgICAgICAgICAgICAgICAgZlJhZGl1cyAqPSAoZmxvYXQpKE1BWF9SQURJVVMpOworICAgICAgICAgICAgICAgIG1SYWRpdXMgPSAoaW50KWZSYWRpdXM7CisKKyAgICAgICAgICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbUluQmxhY2tTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUluQmxhY2sgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbU91dEJsYWNrU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1PdXRCbGFjayA9IChmbG9hdClwcm9ncmVzczsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtSW5XaGl0ZVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtSW5XaGl0ZSA9IChmbG9hdClwcm9ncmVzcyArIDEyNy4wZjsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtT3V0V2hpdGVTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbU91dFdoaXRlID0gKGZsb2F0KXByb2dyZXNzICsgMTI3LjBmOworICAgICAgICAgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1HYW1tYVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtR2FtbWEgPSAoZmxvYXQpcHJvZ3Jlc3MvMTAwLjBmOworICAgICAgICAgICAgICAgIG1HYW1tYSA9IE1hdGgubWF4KG1HYW1tYSwgMC4xZik7CisgICAgICAgICAgICAgICAgbUdhbW1hID0gMS4wZiAvIG1HYW1tYTsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldEdhbW1hKG1HYW1tYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbVNhdHVyYXRpb25TZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbVNhdHVyYXRpb24gPSAoZmxvYXQpcHJvZ3Jlc3MgLyA1MC4wZjsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldFNhdHVyYXRpb24obVNhdHVyYXRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAodHJ1ZSkgeworICAgICAgICAgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICAgICAgICAgIG1SUy5maW5pc2goKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamF2YUZpbHRlcigpOworICAgICAgICAgICAgICAgIG1EaXNwbGF5Vmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiUmVuZGVyc2NyaXB0IGZyYW1lIHRpbWUgY29yZSBtcyAiICsgdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTE5LDQ1ICszMTEsNTQgQEAKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CiAKLSAgICAgICAgbUJpdG1hcCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcEluID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtQml0bWFwT3V0ID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtQml0bWFwU2NyYXRjaCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKIAogICAgICAgICBtU3VyZmFjZVZpZXcgPSAoU3VyZmFjZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN1cmZhY2UpOwogICAgICAgICBtU3VyZmFjZVZpZXcuZ2V0SG9sZGVyKCkuYWRkQ2FsbGJhY2sodGhpcyk7CiAKICAgICAgICAgbURpc3BsYXlWaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQuZGlzcGxheSk7Ci0gICAgICAgIG1EaXNwbGF5Vmlldy5zZXRJbWFnZUJpdG1hcChtQml0bWFwKTsKKyAgICAgICAgbURpc3BsYXlWaWV3LnNldEltYWdlQml0bWFwKG1CaXRtYXBPdXQpOwogCi0gICAgICAgICgoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQudGhyZXNob2xkKSkuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgICAgIGlmIChmcm9tVXNlcikgewotICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLnRocmVzaG9sZCA9IHByb2dyZXNzIC8gMTAwLjBmOwotICAgICAgICAgICAgICAgICAgICBtUGFyYW1zQWxsb2NhdGlvbi5kYXRhKG1QYXJhbXMpOworICAgICAgICBtUmFkaXVzU2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5yYWRpdXMpOworICAgICAgICBtUmFkaXVzU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUludm9rYWJsZS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhRmlsdGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQml0bWFwLnNldFBpeGVscyhtT3V0RGF0YSwgMCwgbVBhcmFtcy5vdXRXaWR0aCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5vdXRXaWR0aCwgbVBhcmFtcy5vdXRIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlWaWV3LmludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgbUluQmxhY2tTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5CbGFjayk7CisgICAgICAgIG1JbkJsYWNrU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUluQmxhY2tTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtSW5CbGFja1NlZWtCYXIuc2V0UHJvZ3Jlc3MoMCk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5vdXRCbGFjayk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIuc2V0UHJvZ3Jlc3MoMCk7CiAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgfQorICAgICAgICBtSW5XaGl0ZVNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pbldoaXRlKTsKKyAgICAgICAgbUluV2hpdGVTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtSW5XaGl0ZVNlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1JbldoaXRlU2Vla0Jhci5zZXRQcm9ncmVzcygxMjgpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQub3V0V2hpdGUpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyLnNldFByb2dyZXNzKDEyOCk7CiAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICBtR2FtbWFTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5HYW1tYSk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIuc2V0TWF4KDE1MCk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTAwKTsKKworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pblNhdHVyYXRpb24pOworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1TYXR1cmF0aW9uU2Vla0Jhci5zZXRQcm9ncmVzcyg1MCk7CisKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuYmVuY2htYXJrVGV4dCk7CisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiQmVuY2htYXJrIG5vdCB5ZXQgcnVuIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgbVBhcmFtcyA9IGNyZWF0ZVBhcmFtcygpOwotICAgICAgICBtSW52b2thYmxlID0gY3JlYXRlU2NyaXB0KCk7Ci0KLSAgICAgICAgbUludm9rYWJsZS5leGVjdXRlKCk7CisgICAgICAgIGNyZWF0ZVNjcmlwdCgpOworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKQEAgLTE2Niw1NCArMzY3LDM4IEBACiAgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewogICAgIH0KIAotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBjcmVhdGVTY3JpcHQoKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNjcmlwdCgpIHsKICAgICAgICAgbVJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZSgpOwogICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjayA9IG5ldyBGaWx0ZXJDYWxsYmFjaygpOwogCi0gICAgICAgIG1QYXJhbXNUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQYXJhbXMuY2xhc3MsIDEsICJQYXJhbWV0ZXJzIik7Ci0gICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1QYXJhbXNUeXBlKTsKLSAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlQml0bWFwUmVmKG1SUywgbUJpdG1hcEluKTsKKyAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBPdXQpOwogCi0gICAgICAgIGZpbmFsIGludCBwaXhlbENvdW50ID0gbVBhcmFtcy5pbldpZHRoICogbVBhcmFtcy5pbkhlaWdodDsKKyAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIEVsZW1lbnQuRjMyXzQobVJTKSk7CisgICAgICAgIHRiLmFkZChhbmRyb2lkLnJlbmRlcnNjcmlwdC5EaW1lbnNpb24uWCwgbUJpdG1hcEluLmdldFdpZHRoKCkpOworICAgICAgICB0Yi5hZGQoYW5kcm9pZC5yZW5kZXJzY3JpcHQuRGltZW5zaW9uLlksIG1CaXRtYXBJbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjEgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgdGIuY3JlYXRlKCkpOworICAgICAgICBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24yID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIHRiLmNyZWF0ZSgpKTsKIAotICAgICAgICBtUGl4ZWxUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQaXhlbC5jbGFzcywgMSwgIlBpeGVsIik7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksCi0gICAgICAgICAgICAgICAgcGl4ZWxDb3VudCk7Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIpLAotICAgICAgICAgICAgICAgIHBpeGVsQ291bnQpOworICAgICAgICBtU2NyaXB0VkJsdXIgPSBuZXcgU2NyaXB0Q192ZXJ0aWNhbF9ibHVyKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3LnZlcnRpY2FsX2JsdXIsIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdEhCbHVyID0gbmV3IFNjcmlwdENfaG9yaXpvbnRhbF9ibHVyKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3Lmhvcml6b250YWxfYmx1ciwgZmFsc2UpOwogCi0gICAgICAgIG1JbkRhdGEgPSBuZXcgaW50W3BpeGVsQ291bnRdOwotICAgICAgICBtQml0bWFwLmdldFBpeGVscyhtSW5EYXRhLCAwLCBtUGFyYW1zLmluV2lkdGgsIDAsIDAsIG1QYXJhbXMuaW5XaWR0aCwgbVBhcmFtcy5pbkhlaWdodCk7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZGF0YShtSW5EYXRhKTsKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3RocmVzaG9sZChtUlMsIGdldFJlc291cmNlcygpLCBSLnJhdy50aHJlc2hvbGQsIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfd2lkdGgobUJpdG1hcEluLmdldFdpZHRoKCkpOworICAgICAgICBtU2NyaXB0LnNldF9oZWlnaHQobUJpdG1hcEluLmdldEhlaWdodCgpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOwogCi0gICAgICAgIG1PdXREYXRhID0gbmV3IGludFtwaXhlbENvdW50XTsKLSAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24uZGF0YShtT3V0RGF0YSk7CisgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldEdhbW1hKG1HYW1tYSk7CisgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0U2F0dXJhdGlvbihtU2F0dXJhdGlvbik7CiAKLSAgICAgICAgU2NyaXB0Qy5CdWlsZGVyIHNiID0gbmV3IFNjcmlwdEMuQnVpbGRlcihtUlMpOwotICAgICAgICBzYi5zZXRUeXBlKG1QYXJhbXNUeXBlLCAiUGFyYW1zIiwgMCk7Ci0gICAgICAgIHNiLnNldFR5cGUobVBpeGVsVHlwZSwgIkluUGl4ZWwiLCAxKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtUGl4ZWxUeXBlLCAiT3V0UGl4ZWwiLCAyKTsKLSAgICAgICAgc2Iuc2V0VHlwZSh0cnVlLCAyKTsKLSAgICAgICAgU2NyaXB0Lkludm9rYWJsZSBpbnZva2FibGUgPSBzYi5hZGRJbnZva2FibGUoIm1haW4iKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KGdldFJlc291cmNlcygpLCBSLnJhdy50aHJlc2hvbGQpOwotICAgICAgICAvL3NiLnNldFJvb3QodHJ1ZSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9JblBpeGVsKG1JblBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICBtU2NyaXB0LmJpbmRfT3V0UGl4ZWwobU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICBtU2NyaXB0LmJpbmRfU2NyYXRjaFBpeGVsMShtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX1NjcmF0Y2hQaXhlbDIobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMik7CiAKLSAgICAgICAgU2NyaXB0QyBzY3JpcHQgPSBzYi5jcmVhdGUoKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1QYXJhbXNBbGxvY2F0aW9uLCAwKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1JblBpeGVsc0FsbG9jYXRpb24sIDEpOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24obU91dFBpeGVsc0FsbG9jYXRpb24sIDIpOwotCi0gICAgICAgIHJldHVybiBpbnZva2FibGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQYXJhbXMgY3JlYXRlUGFyYW1zKCkgewotICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW1zID0gbmV3IFBhcmFtcygpOwotICAgICAgICBwYXJhbXMuaW5XaWR0aCA9IHBhcmFtcy5vdXRXaWR0aCA9IG1CaXRtYXAuZ2V0V2lkdGgoKTsKLSAgICAgICAgcGFyYW1zLmluSGVpZ2h0ID0gcGFyYW1zLm91dEhlaWdodCA9IG1CaXRtYXAuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIHBhcmFtcy50aHJlc2hvbGQgPSAwLjVmOwotICAgICAgICByZXR1cm4gcGFyYW1zOworICAgICAgICBtU2NyaXB0LnNldF92Qmx1clNjcmlwdChtU2NyaXB0VkJsdXIpOworICAgICAgICBtU2NyaXB0LnNldF9oQmx1clNjcmlwdChtU2NyaXB0SEJsdXIpOwogICAgIH0KIAogICAgIHByaXZhdGUgQml0bWFwIGxvYWRCaXRtYXAoaW50IHJlc291cmNlKSB7CkBAIC0yMjksNCArNDE0LDMwIEBACiAgICAgICAgIHNvdXJjZS5yZWN5Y2xlKCk7CiAgICAgICAgIHJldHVybiBiOwogICAgIH0KKworICAgIC8vIGJ1dHRvbiBob29rCisgICAgcHVibGljIHZvaWQgYmVuY2htYXJrKFZpZXcgdikgeworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJCZW5jaG1hcmtpbmciKTsKKyAgICAgICAgaW50IG9sZFJhZGl1cyA9IG1SYWRpdXM7CisgICAgICAgIG1SYWRpdXMgPSBNQVhfUkFESVVTOworICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisKKyAgICAgICAgbG9uZyB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICBtUlMuZmluaXNoKCk7CisKKyAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIlJlbmRlcnNjcmlwdCBmcmFtZSB0aW1lIGNvcmUgbXMgIiArIHQpOworCisgICAgICAgIC8vbG9uZyBqYXZhVGltZSA9IGphdmFGaWx0ZXIoKTsKKyAgICAgICAgLy9tQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIlJTOiAiICsgdCArICIgbXMgIEphdmE6ICIgKyBqYXZhVGltZSArICIgbXMiKTsKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdC5zZXRUZXh0KCJSUzogIiArIHQgKyAiIG1zIik7CisKKyAgICAgICAgbVJhZGl1cyA9IG9sZFJhZGl1czsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworCisgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICBtUlMuZmluaXNoKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaG9yaXpvbnRhbF9ibHVyLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaG9yaXpvbnRhbF9ibHVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZmZhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9ob3Jpem9udGFsX2JsdXIucnMKQEAgLTAsMCArMSwzMCBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIGZsb2F0NCAqb3V0cHV0ID0gKGZsb2F0NCAqKXZfb3V0OworICAgIGNvbnN0IEZpbHRlclN0cnVjdCAqZnMgPSAoY29uc3QgRmlsdGVyU3RydWN0ICopdXNyRGF0YTsKKyAgICBjb25zdCBmbG9hdDQgKmlucHV0ID0gKGNvbnN0IGZsb2F0NCAqKXJzR2V0RWxlbWVudEF0KGZzLT5haW4sIDAsIHkpOworCisgICAgZmxvYXQzIGJsdXJyZWRQaXhlbCA9IDA7CisgICAgY29uc3QgZmxvYXQgKmdQdHIgPSBmcy0+Z2F1c3NpYW47CisgICAgaWYgKCh4ID4gZnMtPnJhZGl1cykgJiYgKHggPCAoZnMtPndpZHRoIC0gZnMtPnJhZGl1cykpKSB7CisgICAgICAgIGNvbnN0IGZsb2F0NCAqaSA9IGlucHV0ICsgKHggLSBmcy0+cmFkaXVzKTsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGktPnh5eiAqIGdQdHJbMF07CisgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAvLyBTdGVwcGluZyBsZWZ0IGFuZCByaWdodCBhd2F5IGZyb20gdGhlIHBpeGVsCisgICAgICAgICAgICBpbnQgdmFsaWRXID0gcnNDbGFtcCh4ICsgciwgKHVpbnQpMCwgKHVpbnQpKGZzLT53aWR0aCAtIDEpKTsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpbnB1dFt2YWxpZFddLnh5eiAqIGdQdHJbMF07CisgICAgICAgICAgICBnUHRyKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRwdXQtPnh5eiA9IGJsdXJyZWRQaXhlbDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaXAucnNoIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaXAucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkN2E3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9pcC5yc2gKQEAgLTAsMCArMSwxNSBAQAorI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy5pbWFnZSkKKworI2RlZmluZSBNQVhfUkFESVVTIDI1CisKK3R5cGVkZWYgc3RydWN0IEZpbHRlclN0cnVjdF9zIHsKKyAgICByc19hbGxvY2F0aW9uIGFpbjsKKworICAgIGZsb2F0ICpnYXVzc2lhbjsgLy9bTUFYX1JBRElVUyAqIDIgKyAxXTsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCB3aWR0aDsKKyAgICBpbnQgcmFkaXVzOworCit9IEZpbHRlclN0cnVjdDsKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS90aHJlc2hvbGQucnMgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS90aHJlc2hvbGQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NjgxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3RocmVzaG9sZC5ycwpAQCAtMCwwICsxLDk0IEBACisjcHJhZ21hIHZlcnNpb24oMSkKKworI2luY2x1ZGUgImlwLnJzaCIKKworaW50IGhlaWdodDsKK2ludCB3aWR0aDsKK2ludCByYWRpdXM7CisKK3VjaGFyNCAqIEluUGl4ZWw7Cit1Y2hhcjQgKiBPdXRQaXhlbDsKK2Zsb2F0NCAqIFNjcmF0Y2hQaXhlbDE7CitmbG9hdDQgKiBTY3JhdGNoUGl4ZWwyOworCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGZpbHRlcik7CisKK3JzX3NjcmlwdCB2Qmx1clNjcmlwdDsKK3JzX3NjcmlwdCBoQmx1clNjcmlwdDsKKworY29uc3QgaW50IENNRF9GSU5JU0hFRCA9IDE7CisKKy8vIFN0b3JlIG91ciBjb2VmZmljaWVudHMgaGVyZQorc3RhdGljIGZsb2F0IGdhdXNzaWFuW01BWF9SQURJVVMgKiAyICsgMV07CisKKworc3RhdGljIHZvaWQgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cygpIHsKKyAgICAvLyBDb21wdXRlIGdhdXNzaWFuIHdlaWdodHMgZm9yIHRoZSBibHVyCisgICAgLy8gZSBpcyB0aGUgZXVsZXIncyBudW1iZXIKKyAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgIGZsb2F0IHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyZjsKKyAgICAvLyBnKHgpID0gKCAxIC8gc3FydCggMiAqIHBpICkgKiBzaWdtYSkgKiBlIF4gKCAteF4yIC8gMiAqIHNpZ21hXjIgKQorICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgLy8gYW5kIHNpZ21hIHZhcmllcyB3aXRoIHJhZGl1cy4KKyAgICAvLyBCYXNlZCBvbiBzb21lIGV4cGVyaW1lbnRhbCByYWRpdXMgdmFsdWVzIGFuZCBzaWdtYSdzCisgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAvLyBzaWdtYSA9IHJhZGl1cyAqIDAuNCAgKyAwLjYKKyAgICAvLyBUaGUgbGFyZ2VyIHRoZSByYWRpdXMgZ2V0cywgdGhlIG1vcmUgb3VyIGdhdXNzaWFuIGJsdXIKKyAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgIC8vIHRoZSBnYXVzc2lhbiBjdXJ2ZSBiZWdpbnMgdG8gbG9zZSBpdHMgc2hhcGUKKyAgICBmbG9hdCBzaWdtYSA9IDAuNGYgKiAoZmxvYXQpcmFkaXVzICsgMC42ZjsKKworICAgIC8vIE5vdyBjb21wdXRlIHRoZSBjb2VmZmljaW50cworICAgIC8vIFdlIHdpbGwgc3RvcmUgc29tZSByZWR1bmRhbnQgdmFsdWVzIHRvIHNhdmUgc29tZSBtYXRoIGR1cmluZworICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgIC8vIHByZWNvbXB1dGUgc29tZSB2YWx1ZXMKKyAgICBmbG9hdCBjb2VmZjEgPSAxLjBmIC8gKHNxcnQoIDIuMGYgKiBwaSApICogc2lnbWEpOworICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisKKyAgICBmbG9hdCBub3JtYWxpemVGYWN0b3IgPSAwLjBmOworICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgaW50IHI7CisgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gPSBjb2VmZjEgKiBwb3coZSwgZmxvYXRSICogZmxvYXRSICogY29lZmYyKTsKKyAgICAgICAgbm9ybWFsaXplRmFjdG9yICs9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworICAgIH0KKworICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNvcHlJbnB1dCgpIHsKKyAgICByc19hbGxvY2F0aW9uIGFpbiA9IHJzR2V0QWxsb2NhdGlvbihJblBpeGVsKTsKKyAgICB1aW50MzJfdCBkaW14ID0gcnNBbGxvY2F0aW9uR2V0RGltWChhaW4pOworICAgIHVpbnQzMl90IGRpbXkgPSByc0FsbG9jYXRpb25HZXREaW1ZKGFpbik7CisgICAgZm9yKHVpbnQzMl90IHkgPSAwOyB5IDwgZGlteTsgeSsrKSB7CisgICAgICAgIGZvcih1aW50MzJfdCB4ID0gMDsgeCA8IGRpbXg7IHgrKykgeworICAgICAgICAgICAgU2NyYXRjaFBpeGVsMVt4ICsgeSAqIGRpbXhdID0gY29udmVydF9mbG9hdDQoSW5QaXhlbFt4ICsgeSAqIGRpbXhdKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmaWx0ZXIoKSB7CisgICAgY29weUlucHV0KCk7CisgICAgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cygpOworCisgICAgRmlsdGVyU3RydWN0IGZzOworICAgIGZzLmdhdXNzaWFuID0gZ2F1c3NpYW47CisgICAgZnMud2lkdGggPSB3aWR0aDsKKyAgICBmcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZnMucmFkaXVzID0gcmFkaXVzOworCisgICAgZnMuYWluID0gcnNHZXRBbGxvY2F0aW9uKFNjcmF0Y2hQaXhlbDEpOworICAgIHJzRm9yRWFjaChoQmx1clNjcmlwdCwgZnMuYWluLCByc0dldEFsbG9jYXRpb24oU2NyYXRjaFBpeGVsMiksICZmcyk7CisKKyAgICBmcy5haW4gPSByc0dldEFsbG9jYXRpb24oU2NyYXRjaFBpeGVsMik7CisgICAgcnNGb3JFYWNoKHZCbHVyU2NyaXB0LCBmcy5haW4sIHJzR2V0QWxsb2NhdGlvbihPdXRQaXhlbCksICZmcyk7CisgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhDTURfRklOSVNIRUQpOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS92ZXJ0aWNhbF9ibHVyLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdmVydGljYWxfYmx1ci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTAxZDJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdmVydGljYWxfYmx1ci5ycwpAQCAtMCwwICsxLDkyIEBACisjcHJhZ21hIHZlcnNpb24oMSkKKworI2luY2x1ZGUgImlwLnJzaCIKKworc3RhdGljIGZsb2F0IGluQmxhY2s7CitzdGF0aWMgZmxvYXQgb3V0QmxhY2s7CitzdGF0aWMgZmxvYXQgaW5XaGl0ZTsKK3N0YXRpYyBmbG9hdCBvdXRXaGl0ZTsKK3N0YXRpYyBmbG9hdDMgZ2FtbWE7CitzdGF0aWMgZmxvYXQgc2F0dXJhdGlvbjsKKworc3RhdGljIGZsb2F0IGluV01pbkluQjsKK3N0YXRpYyBmbG9hdCBvdXRXTWluT3V0QjsKK3N0YXRpYyBmbG9hdCBvdmVySW5XTWluSW5COworc3RhdGljIHJzX21hdHJpeDN4MyBjb2xvck1hdDsKKworI3ByYWdtYSBycyBleHBvcnRfZnVuYyhzZXRMZXZlbHMsIHNldFNhdHVyYXRpb24sIHNldEdhbW1hKTsKKwordm9pZCBzZXRMZXZlbHMoZmxvYXQgaUJsaywgZmxvYXQgb0JsaywgZmxvYXQgaVdodCwgZmxvYXQgb1dodCkgeworICAgIGluQmxhY2sgPSBpQmxrOworICAgIG91dEJsYWNrID0gb0JsazsKKyAgICBpbldoaXRlID0gaVdodDsKKyAgICBvdXRXaGl0ZSA9IG9XaHQ7CisKKyAgICBpbldNaW5JbkIgPSBpbldoaXRlIC0gaW5CbGFjazsKKyAgICBvdXRXTWluT3V0QiA9IG91dFdoaXRlIC0gb3V0QmxhY2s7CisgICAgb3ZlckluV01pbkluQiA9IDEuZiAvIGluV01pbkluQjsKK30KKwordm9pZCBzZXRTYXR1cmF0aW9uKGZsb2F0IHNhdCkgeworICAgIHNhdHVyYXRpb24gPSBzYXQ7CisKKyAgICAvLyBTYXR1cmF0aW9uCisgICAgLy8gTGluZWFyIHdlaWdodHMKKyAgICAvL2Zsb2F0IHJXZWlnaHQgPSAwLjMwODZmOworICAgIC8vZmxvYXQgZ1dlaWdodCA9IDAuNjA5NGY7CisgICAgLy9mbG9hdCBiV2VpZ2h0ID0gMC4wODIwZjsKKworICAgIC8vIEdhbW1hIDIuMiB3ZWlnaHRzICh3ZSBoYXZlbid0IGNvbnZlcnRlZCBvdXIgaW1hZ2UgdG8gbGluZWFyIHNwYWNlIHlldCBmb3IgcGVyZiByZWFzb25zKQorICAgIGZsb2F0IHJXZWlnaHQgPSAwLjI5OWY7CisgICAgZmxvYXQgZ1dlaWdodCA9IDAuNTg3ZjsKKyAgICBmbG9hdCBiV2VpZ2h0ID0gMC4xMTRmOworCisgICAgZmxvYXQgb25lTWludXNTID0gMS4wZiAtIHNhdHVyYXRpb247CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAwLCBvbmVNaW51c1MgKiByV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAxLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDAsIDIsIG9uZU1pbnVzUyAqIHJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMCwgb25lTWludXNTICogZ1dlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAxLCBvbmVNaW51c1MgKiBnV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAyLCBvbmVNaW51c1MgKiBnV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDIsIDAsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMiwgMSwgb25lTWludXNTICogYldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAyLCAyLCBvbmVNaW51c1MgKiBiV2VpZ2h0ICsgc2F0dXJhdGlvbik7Cit9CisKK3ZvaWQgc2V0R2FtbWEoZmxvYXQgZykgeworICAgIGdhbW1hID0gKGZsb2F0MylnOworfQorCit2b2lkIHJvb3QoY29uc3Qgdm9pZCAqdl9pbiwgdm9pZCAqdl9vdXQsIGNvbnN0IHZvaWQgKnVzckRhdGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICB1Y2hhcjQgKm91dHB1dCA9ICh1Y2hhcjQgKil2X291dDsKKyAgICBjb25zdCBGaWx0ZXJTdHJ1Y3QgKmZzID0gKGNvbnN0IEZpbHRlclN0cnVjdCAqKXVzckRhdGE7CisgICAgY29uc3QgZmxvYXQ0ICppbnB1dCA9IChjb25zdCBmbG9hdDQgKilyc0dldEVsZW1lbnRBdChmcy0+YWluLCB4LCAwKTsKKworICAgIGZsb2F0MyBibHVycmVkUGl4ZWwgPSAwOworICAgIGNvbnN0IGZsb2F0ICpnUHRyID0gZnMtPmdhdXNzaWFuOworICAgIGlmICgoeSA+IGZzLT5yYWRpdXMpICYmICh5IDwgKGZzLT5oZWlnaHQgLSBmcy0+cmFkaXVzKSkpIHsKKyAgICAgICAgY29uc3QgZmxvYXQ0ICppID0gaW5wdXQgKyAoKHkgLSBmcy0+cmFkaXVzKSAqIGZzLT53aWR0aCk7CisgICAgICAgIGZvcihpbnQgciA9IC1mcy0+cmFkaXVzOyByIDw9IGZzLT5yYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpLT54eXogKiBnUHRyWzBdOworICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgaSArPSBmcy0+d2lkdGg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBpbnQgdmFsaWRIID0gcnNDbGFtcCh5ICsgciwgKHVpbnQpMCwgKHVpbnQpKGZzLT5oZWlnaHQgLSAxKSk7CisgICAgICAgICAgICBjb25zdCBmbG9hdDQgKmkgPSBpbnB1dCArIHZhbGlkSCAqIGZzLT53aWR0aDsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpLT54eXogKiBnUHRyWzBdOworICAgICAgICAgICAgZ1B0cisrOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQzIHRlbXAgPSByc01hdHJpeE11bHRpcGx5KCZjb2xvck1hdCwgYmx1cnJlZFBpeGVsKTsKKyAgICB0ZW1wID0gKGNsYW1wKHRlbXAsIDAuZiwgMjU1LmYpIC0gaW5CbGFjaykgKiBvdmVySW5XTWluSW5COworICAgIGlmIChnYW1tYS54ICE9IDEuMGYpCisgICAgICAgIHRlbXAgPSBwb3codGVtcCwgKGZsb2F0MylnYW1tYSk7CisgICAgdGVtcCA9IGNsYW1wKHRlbXAgKiBvdXRXTWluT3V0QiArIG91dEJsYWNrLCAwLmYsIDI1NS5mKTsKKworICAgIG91dHB1dC0+eHl6ID0gY29udmVydF91Y2hhcjModGVtcCk7CisgICAgLy9vdXRwdXQtPncgPSBpbnB1dC0+dzsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmU3N2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKyNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1vZGVsVmlld2VyCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTlmZTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJNb2RlbFZpZXdlciI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlNpbXBsZU1vZGVsIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iU2ltcGxlTW9kZWwiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJTY2VuZUdyYXBoIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iU2NlbmVHcmFwaCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9kcmF3YWJsZS9yb2JvdC5wbmcgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM1M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9kcmF3YWJsZS9yb2JvdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9yYXcvcm9ib3QuYTNkIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9yYXcvcm9ib3QuYTNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODg5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTdlMGNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFNjZW5lR3JhcGggZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFNjZW5lR3JhcGhWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFNjZW5lR3JhcGhWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFJTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1OTJmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFJTLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBTY2VuZUdyYXBoUlMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfTEFTVF9GT0NVUyA9IDE7CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworICAgIGludCBtUm90YXRpb247CisKKyAgICBwdWJsaWMgU2NlbmVHcmFwaFJTKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1Sb3RhdGlvbiA9IDA7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1TYW1wbGVyOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1QU0JhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVBWQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOworCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1HcmlkSW1hZ2U7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOworCisgICAgcHJpdmF0ZSBNZXNoIG1NZXNoOworCisgICAgcHJpdmF0ZSBGb250IG1JdGFsaWM7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXh0QWxsb2M7CisKKyAgICBwcml2YXRlIFNjcmlwdENfc2NlbmVncmFwaCBtU2NyaXB0OworICAgIHByaXZhdGUgU2NyaXB0Q190cmFuc2Zvcm0gbVRyYW5zZm9ybVNjcmlwdDsKKworICAgIGludCBtTGFzdFg7CisgICAgaW50IG1MYXN0WTsKKworICAgIHB1YmxpYyB2b2lkIHRvdWNoRXZlbnQoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBkeCA9IG1MYXN0WCAtIHg7CisgICAgICAgIGlmKE1hdGguYWJzKGR4KSA+IDUwIHx8IE1hdGguYWJzKGR4KSA8IDMpIHsKKyAgICAgICAgICAgIGR4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1Sb3RhdGlvbiAtPSBkeDsKKyAgICAgICAgaWYobVJvdGF0aW9uID4gMzYwKSB7CisgICAgICAgICAgICBtUm90YXRpb24gLT0gMzYwOworICAgICAgICB9CisgICAgICAgIGlmKG1Sb3RhdGlvbiA8IDApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiArPSAzNjA7CisgICAgICAgIH0KKworICAgICAgICBtU2NyaXB0LnNldF9nUm90YXRlKC0oZmxvYXQpbVJvdGF0aW9uKTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UEZTKCkgeworICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBiID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKG1SUyk7CisKKyAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgYi5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICBiLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGU0JhY2tncm91bmQobVBTQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRigpIHsKKyAgICAgICAgU2FtcGxlci5CdWlsZGVyIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOworICAgICAgICBicy5zZXRNaW4oU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRNYWcoU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRXcmFwUyhTYW1wbGVyLlZhbHVlLkNMQU1QKTsKKyAgICAgICAgYnMuc2V0V3JhcFQoU2FtcGxlci5WYWx1ZS5DTEFNUCk7CisgICAgICAgIG1TYW1wbGVyID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOworICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAorICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOworICAgICAgICBtUEZCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZC5iaW5kU2FtcGxlcihtU2FtcGxlciwgMCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGQmFja2dyb3VuZChtUEZCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBWKCkgeworICAgICAgICBQcm9ncmFtVmVydGV4LkJ1aWxkZXIgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kID0gcHZiLmNyZWF0ZSgpOworCisgICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7CisgICAgICAgIG1QVkJhY2tncm91bmQuYmluZEFsbG9jYXRpb24obVBWQSk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BWQmFja2dyb3VuZChtUFZCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlKCkgeworICAgICAgICBtR3JpZEltYWdlID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucm9ib3QsIEVsZW1lbnQuUkdCXzU2NShtUlMpLCB0cnVlKTsKKyAgICAgICAgbUdyaWRJbWFnZS51cGxvYWRUb1RleHR1cmUoMCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RHcmlkKG1HcmlkSW1hZ2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0VGV4dEFsbG9jYXRpb24oKSB7CisgICAgICAgIFN0cmluZyBhbGxvY1N0cmluZyA9ICJEaXNwbGF5aW5nIGZpbGU6IFIucmF3LnJvYm90IjsKKyAgICAgICAgbVRleHRBbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIGFsbG9jU3RyaW5nKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleHRBbGxvYyhtVGV4dEFsbG9jKTsKKyAgICB9CisKKyAgICBTZ1RyYW5zZm9ybSBtUm9vdFRyYW5zZm9ybTsKKyAgICBTZ1RyYW5zZm9ybSBtR3JvdXAxOworCisgICAgU2dUcmFuc2Zvcm0gbVJvYm90MTsKKyAgICBTZ1RyYW5zZm9ybSBtUm9ib3QyOworCisgICAgdm9pZCBpbml0VHJhbnNmb3JtSGllcmFyY2h5KCkgeworICAgICAgICBtUm9vdFRyYW5zZm9ybSA9IG5ldyBTZ1RyYW5zZm9ybShtUlMpOworCisgICAgICAgIG1Hcm91cDEgPSBuZXcgU2dUcmFuc2Zvcm0obVJTKTsKKyAgICAgICAgbVJvb3RUcmFuc2Zvcm0uYWRkQ2hpbGQobUdyb3VwMSk7CisKKyAgICAgICAgbVJvYm90MSA9IG5ldyBTZ1RyYW5zZm9ybShtUlMpOworICAgICAgICBtUm9ib3QyID0gbmV3IFNnVHJhbnNmb3JtKG1SUyk7CisKKyAgICAgICAgbUdyb3VwMS5hZGRDaGlsZChtUm9ib3QxKTsKKyAgICAgICAgbUdyb3VwMS5hZGRDaGlsZChtUm9ib3QyKTsKKworICAgICAgICBtR3JvdXAxLnNldFRyYW5zZm9ybSgwLCBuZXcgRmxvYXQ0KDAuMGYsIDAuMGYsIC0xNS4wZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuVFJBTlNMQVRFKTsKKyAgICAgICAgbUdyb3VwMS5zZXRUcmFuc2Zvcm0oMSwgbmV3IEZsb2F0NCgwLjBmLCAxLjBmLCAwLjBmLCAxNS4wZiksIFRyYW5zZm9ybVR5cGUuUk9UQVRFKTsKKworICAgICAgICBtUm9ib3QxLnNldFRyYW5zZm9ybSgwLCBuZXcgRmxvYXQ0KC0zLjBmLCAtMC41ZiwgMC4wZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuVFJBTlNMQVRFKTsKKyAgICAgICAgbVJvYm90MS5zZXRUcmFuc2Zvcm0oMSwgbmV3IEZsb2F0NCgwLjBmLCAxLjBmLCAwLjBmLCAyMC4wZiksIFRyYW5zZm9ybVR5cGUuUk9UQVRFKTsKKyAgICAgICAgbVJvYm90MS5zZXRUcmFuc2Zvcm0oMiwgbmV3IEZsb2F0NCgwLjJmLCAwLjJmLCAwLjJmLCAwLjBmKSwgVHJhbnNmb3JtVHlwZS5TQ0FMRSk7CisKKyAgICAgICAgbVJvYm90Mi5zZXRUcmFuc2Zvcm0oMCwgbmV3IEZsb2F0NCgzLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSwgVHJhbnNmb3JtVHlwZS5UUkFOU0xBVEUpOworICAgICAgICBtUm9ib3QyLnNldFRyYW5zZm9ybSgxLCBuZXcgRmxvYXQ0KDAuMGYsIDEuMGYsIDAuMGYsIC0yMC4wZiksIFRyYW5zZm9ybVR5cGUuUk9UQVRFKTsKKyAgICAgICAgbVJvYm90Mi5zZXRUcmFuc2Zvcm0oMiwgbmV3IEZsb2F0NCgwLjNmLCAwLjNmLCAwLjNmLCAwLjBmKSwgVHJhbnNmb3JtVHlwZS5TQ0FMRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRSUygpIHsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfc2NlbmVncmFwaChtUlMsIG1SZXMsIFIucmF3LnNjZW5lZ3JhcGgsIHRydWUpOworICAgICAgICBtVHJhbnNmb3JtU2NyaXB0ID0gbmV3IFNjcmlwdENfdHJhbnNmb3JtKG1SUywgbVJlcywgUi5yYXcudHJhbnNmb3JtLCBmYWxzZSk7CisgICAgICAgIG1UcmFuc2Zvcm1TY3JpcHQuc2V0X3RyYW5zZm9ybVNjcmlwdChtVHJhbnNmb3JtU2NyaXB0KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVHJhbnNmb3JtUlMobVRyYW5zZm9ybVNjcmlwdCk7CisKKyAgICAgICAgaW5pdFBGUygpOworICAgICAgICBpbml0UEYoKTsKKyAgICAgICAgaW5pdFBWKCk7CisKKyAgICAgICAgbG9hZEltYWdlKCk7CisKKyAgICAgICAgRmlsZUEzRCBtb2RlbCA9IEZpbGVBM0QuY3JlYXRlRnJvbVJlc291cmNlKG1SUywgbVJlcywgUi5yYXcucm9ib3QpOworICAgICAgICBGaWxlQTNELkluZGV4RW50cnkgZW50cnkgPSBtb2RlbC5nZXRJbmRleEVudHJ5KDApOworICAgICAgICBpZihlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmdldENsYXNzSUQoKSAhPSBGaWxlQTNELkNsYXNzSUQuTUVTSCkgeworICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBsb2FkIG1vZGVsIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtTWVzaCA9IChNZXNoKWVudHJ5LmdldE9iamVjdCgpOworICAgICAgICAgICAgbVNjcmlwdC5zZXRfZ1Rlc3RNZXNoKG1NZXNoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1JdGFsaWMgPSBGb250LmNyZWF0ZShtUlMsIG1SZXMsICJEcm9pZFNlcmlmLUl0YWxpYy50dGYiLCA4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0l0YWxpYyhtSXRhbGljKTsKKworICAgICAgICBpbml0VGV4dEFsbG9jYXRpb24oKTsKKworICAgICAgICBpbml0VHJhbnNmb3JtSGllcmFyY2h5KCk7CisKKyAgICAgICAgTG9nLnYoIj09PT09PT09U2NlbmVHcmFwaD09PT09PT09IiwgInRyYW5zZm9ybSBoaWVyYXJjaHkgaW5pdGlhbGl6ZWQiKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ1Jvb3ROb2RlKG1Sb290VHJhbnNmb3JtLmdldEZpZWxkKCkpOworCisgICAgICAgIG1TY3JpcHQuYmluZF9nR3JvdXAobUdyb3VwMS5tUGFyZW50Lm1DaGlsZEZpZWxkKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dSb2JvdDEobVJvYm90MS5tUGFyZW50Lm1DaGlsZEZpZWxkKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1JvYm90MUluZGV4KG1Sb2JvdDEubUluZGV4SW5QYXJlbnRHcm91cCk7CisgICAgICAgIG1TY3JpcHQuYmluZF9nUm9ib3QyKG1Sb2JvdDIubVBhcmVudC5tQ2hpbGRGaWVsZCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dSb2JvdDJJbmRleChtUm9ib3QyLm1JbmRleEluUGFyZW50R3JvdXApOworCisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YTU5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhWaWV3LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgU2NlbmVHcmFwaFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBTY2VuZUdyYXBoVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2NlbmVHcmFwaFJTIG1SZW5kZXI7CisKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgU2NlbmVHcmFwaFJTKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgLy8gYnJlYWsgcG9pbnQgYXQgaGVyZQorICAgICAgICAvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IHdvcmsgd2hlbiAnZXh0ZW5kcyBWaWV3JyBpbmNsdWRlICdleHRlbmRzIFNjcm9sbFZpZXcnLgorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtUmVuZGVyLnRvdWNoRXZlbnQoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TZ1RyYW5zZm9ybS5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TZ1RyYW5zZm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MGU4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NnVHJhbnNmb3JtLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitlbnVtIFRyYW5zZm9ybVR5cGUgeworCisgICAgTk9ORSgwKSwKKyAgICBUUkFOU0xBVEUoMSksCisgICAgUk9UQVRFKDIpLAorICAgIFNDQUxFKDMpOworCisgICAgaW50IG1JRDsKKyAgICBUcmFuc2Zvcm1UeXBlKGludCBpZCkgeworICAgICAgICBtSUQgPSBpZDsKKyAgICB9Cit9CisKK3B1YmxpYyBjbGFzcyBTZ1RyYW5zZm9ybSB7CisKKworICAgIFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtIG1UcmFuc2Zvcm1GaWVsZDsKKyAgICBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybSBtQ2hpbGRGaWVsZDsKKyAgICBwdWJsaWMgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0uSXRlbSBtVHJhbnNmb3JtRGF0YTsKKworICAgIEZsb2F0NFtdIG1UcmFuc2Zvcm1zOworICAgIFRyYW5zZm9ybVR5cGVbXSBtVHJhbnNmb3JtVHlwZXM7CisKKyAgICBSZW5kZXJTY3JpcHQgbVJTOworCisgICAgVmVjdG9yIG1DaGlsZHJlbjsKKyAgICBTZ1RyYW5zZm9ybSBtUGFyZW50OworICAgIGludCBtSW5kZXhJblBhcmVudEdyb3VwOworCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFNnVHJhbnNmb3JtIHBhcmVudCwgaW50IHBhcmVudEluZGV4KSB7CisgICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIG1JbmRleEluUGFyZW50R3JvdXAgPSBwYXJlbnRJbmRleDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChTZ1RyYW5zZm9ybSBjaGlsZCkgeworICAgICAgICBtQ2hpbGRyZW4uYWRkKGNoaWxkKTsKKyAgICAgICAgY2hpbGQuc2V0UGFyZW50KHRoaXMsIG1DaGlsZHJlbi5zaXplKCkgLSAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm0oaW50IGluZGV4LCBGbG9hdDQgdmFsdWUsIFRyYW5zZm9ybVR5cGUgdHlwZSkgeworICAgICAgICBtVHJhbnNmb3Jtc1tpbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgbVRyYW5zZm9ybVR5cGVzW2luZGV4XSA9IHR5cGU7CisgICAgfQorCisgICAgdm9pZCBpbml0RGF0YSgpIHsKKyAgICAgICAgaW50IG51bVRyYW5zZm9ybXMgPSAxNjsKKyAgICAgICAgbVRyYW5zZm9ybXMgPSBuZXcgRmxvYXQ0W251bVRyYW5zZm9ybXNdOworICAgICAgICBtVHJhbnNmb3JtVHlwZXMgPSBuZXcgVHJhbnNmb3JtVHlwZVtudW1UcmFuc2Zvcm1zXTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bVRyYW5zZm9ybXM7IGkgKyspIHsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1zW2ldID0gbmV3IEZsb2F0NCgwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1UeXBlc1tpXSA9IFRyYW5zZm9ybVR5cGUuTk9ORTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2V0RGF0YSgpIHsKKworICAgICAgICBtVHJhbnNmb3JtRGF0YS5nbG9iYWxNYXQgPSBuZXcgTWF0cml4NGYoKTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEubG9jYWxNYXQgPSBuZXcgTWF0cml4NGYoKTsKKworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMCA9IG1UcmFuc2Zvcm1zWzBdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMSA9IG1UcmFuc2Zvcm1zWzFdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMiA9IG1UcmFuc2Zvcm1zWzJdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMyA9IG1UcmFuc2Zvcm1zWzNdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zNCA9IG1UcmFuc2Zvcm1zWzRdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zNSA9IG1UcmFuc2Zvcm1zWzVdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zNiA9IG1UcmFuc2Zvcm1zWzZdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zNyA9IG1UcmFuc2Zvcm1zWzddOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zOCA9IG1UcmFuc2Zvcm1zWzhdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zOSA9IG1UcmFuc2Zvcm1zWzldOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTAgPSBtVHJhbnNmb3Jtc1sxMF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxMSA9IG1UcmFuc2Zvcm1zWzExXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczEyID0gbVRyYW5zZm9ybXNbMTJdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTMgPSBtVHJhbnNmb3Jtc1sxM107CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxNCA9IG1UcmFuc2Zvcm1zWzE0XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczE1ID0gbVRyYW5zZm9ybXNbMTVdOworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUwID0gbVRyYW5zZm9ybVR5cGVzWzBdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTEgPSBtVHJhbnNmb3JtVHlwZXNbMV0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMiA9IG1UcmFuc2Zvcm1UeXBlc1syXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUzID0gbVRyYW5zZm9ybVR5cGVzWzNdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTQgPSBtVHJhbnNmb3JtVHlwZXNbNF0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlNSA9IG1UcmFuc2Zvcm1UeXBlc1s1XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU2ID0gbVRyYW5zZm9ybVR5cGVzWzZdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTcgPSBtVHJhbnNmb3JtVHlwZXNbN10ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlOCA9IG1UcmFuc2Zvcm1UeXBlc1s4XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU5ID0gbVRyYW5zZm9ybVR5cGVzWzldLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTEwID0gbVRyYW5zZm9ybVR5cGVzWzEwXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxMSA9IG1UcmFuc2Zvcm1UeXBlc1sxMV0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTIgPSBtVHJhbnNmb3JtVHlwZXNbMTJdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTEzID0gbVRyYW5zZm9ybVR5cGVzWzEzXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxNCA9IG1UcmFuc2Zvcm1UeXBlc1sxNF0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTUgPSBtVHJhbnNmb3JtVHlwZXNbMTVdLm1JRDsKKworICAgICAgICBtVHJhbnNmb3JtRGF0YS5pc0RpcnR5ID0gMTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEuY2hpbGRyZW4gPSBudWxsOworCisgICAgfQorCisgICAgcHVibGljIFNnVHJhbnNmb3JtKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEgPSBuZXcgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0uSXRlbSgpOworICAgICAgICBtQ2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGluaXREYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtLkl0ZW0gZ2V0RGF0YSgpIHsKKyAgICAgICAgc2V0RGF0YSgpOworICAgICAgICBpZihtQ2hpbGRyZW4uc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIG1DaGlsZEZpZWxkID0gbmV3IFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtKG1SUywgbUNoaWxkcmVuLnNpemUoKSk7CisgICAgICAgICAgICBtVHJhbnNmb3JtRGF0YS5jaGlsZHJlbiA9IG1DaGlsZEZpZWxkLmdldEFsbG9jYXRpb24oKTsKKworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1DaGlsZHJlbi5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBTZ1RyYW5zZm9ybSBjaGlsZCA9IChTZ1RyYW5zZm9ybSltQ2hpbGRyZW4uZ2V0KGkpOworICAgICAgICAgICAgICAgIG1DaGlsZEZpZWxkLnNldChjaGlsZC5nZXREYXRhKCksIGksIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGlsZEZpZWxkLmNvcHlBbGwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtVHJhbnNmb3JtRGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0gZ2V0RmllbGQoKSB7CisgICAgICAgIG1UcmFuc2Zvcm1GaWVsZCA9IG5ldyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybShtUlMsIDEpOworICAgICAgICBtVHJhbnNmb3JtRmllbGQuc2V0KGdldERhdGEoKSwgMCwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtVHJhbnNmb3JtRmllbGQ7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbC5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiN2MzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFNpbXBsZU1vZGVsIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBTaW1wbGVNb2RlbFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgU2ltcGxlTW9kZWxWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFJTLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsUlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmJmMzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFJTLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgU2ltcGxlTW9kZWxSUyB7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBTVEFURV9MQVNUX0ZPQ1VTID0gMTsKKworICAgIGludCBtV2lkdGg7CisgICAgaW50IG1IZWlnaHQ7CisgICAgaW50IG1Sb3RhdGlvbjsKKworICAgIHB1YmxpYyBTaW1wbGVNb2RlbFJTKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1Sb3RhdGlvbiA9IDA7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1TYW1wbGVyOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1QU0JhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVBWQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOworCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1HcmlkSW1hZ2U7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOworCisgICAgcHJpdmF0ZSBNZXNoIG1NZXNoOworCisgICAgcHJpdmF0ZSBGb250IG1JdGFsaWM7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXh0QWxsb2M7CisKKyAgICBwcml2YXRlIFNjcmlwdENfc2ltcGxlbW9kZWwgbVNjcmlwdDsKKworICAgIGludCBtTGFzdFg7CisgICAgaW50IG1MYXN0WTsKKworICAgIHB1YmxpYyB2b2lkIHRvdWNoRXZlbnQoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBkeCA9IG1MYXN0WCAtIHg7CisgICAgICAgIGlmKE1hdGguYWJzKGR4KSA+IDUwIHx8IE1hdGguYWJzKGR4KSA8IDMpIHsKKyAgICAgICAgICAgIGR4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1Sb3RhdGlvbiAtPSBkeDsKKyAgICAgICAgaWYobVJvdGF0aW9uID4gMzYwKSB7CisgICAgICAgICAgICBtUm90YXRpb24gLT0gMzYwOworICAgICAgICB9CisgICAgICAgIGlmKG1Sb3RhdGlvbiA8IDApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiArPSAzNjA7CisgICAgICAgIH0KKworICAgICAgICBtU2NyaXB0LnNldF9nUm90YXRlKChmbG9hdCltUm90YXRpb24pOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7CisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTKTsKKworICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICBiLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgIGIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICBtUFNCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZTQmFja2dyb3VuZChtUFNCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLkNMQU1QKTsKKyAgICAgICAgbVNhbXBsZXIgPSBicy5jcmVhdGUoKTsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIGIuc2V0VGV4dHVyZShQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5FbnZNb2RlLlJFUExBQ0UsCisgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIG1QRkJhY2tncm91bmQgPSBiLmNyZWF0ZSgpOworICAgICAgICBtUEZCYWNrZ3JvdW5kLmJpbmRTYW1wbGVyKG1TYW1wbGVyLCAwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZCYWNrZ3JvdW5kKG1QRkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UFYoKSB7CisgICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUyk7CisgICAgICAgIG1QVkJhY2tncm91bmQgPSBwdmIuY3JlYXRlKCk7CisKKyAgICAgICAgbVBWQSA9IG5ldyBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24obVJTKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZC5iaW5kQWxsb2NhdGlvbihtUFZBKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUFZCYWNrZ3JvdW5kKG1QVkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2UoKSB7CisgICAgICAgIG1HcmlkSW1hZ2UgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5yb2JvdCwgRWxlbWVudC5SR0JfNTY1KG1SUyksIHRydWUpOworICAgICAgICBtR3JpZEltYWdlLnVwbG9hZFRvVGV4dHVyZSgwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVEdyaWQobUdyaWRJbWFnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUZXh0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGFsbG9jU3RyaW5nID0gIkRpc3BsYXlpbmcgZmlsZTogUi5yYXcucm9ib3QiOworICAgICAgICBtVGV4dEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgYWxsb2NTdHJpbmcpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4dEFsbG9jKG1UZXh0QWxsb2MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3NpbXBsZW1vZGVsKG1SUywgbVJlcywgUi5yYXcuc2ltcGxlbW9kZWwsIHRydWUpOworCisgICAgICAgIGluaXRQRlMoKTsKKyAgICAgICAgaW5pdFBGKCk7CisgICAgICAgIGluaXRQVigpOworCisgICAgICAgIGxvYWRJbWFnZSgpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnJvYm90KTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbU1lc2ggPSAoTWVzaCllbnRyeS5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dUZXN0TWVzaChtTWVzaCk7CisgICAgICAgIH0KKworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIiwgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgaW5pdFRleHRBbGxvY2F0aW9uKCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTc0ZmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBTaW1wbGVNb2RlbFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNpbXBsZU1vZGVsUlMgbVJlbmRlcjsKKworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBTaW1wbGVNb2RlbFJTKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgLy8gYnJlYWsgcG9pbnQgYXQgaGVyZQorICAgICAgICAvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IHdvcmsgd2hlbiAnZXh0ZW5kcyBWaWV3JyBpbmNsdWRlICdleHRlbmRzIFNjcm9sbFZpZXcnLgorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtUmVuZGVyLnRvdWNoRXZlbnQoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zY2VuZWdyYXBoLnJzIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zY2VuZWdyYXBoLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MzE1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NjZW5lZ3JhcGgucnMKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorI2luY2x1ZGUgInRyYW5zZm9ybV9kZWYucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUFZCYWNrZ3JvdW5kOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZCYWNrZ3JvdW5kOworCityc19hbGxvY2F0aW9uIGdUR3JpZDsKK3JzX21lc2ggZ1Rlc3RNZXNoOworCityc19wcm9ncmFtX3N0b3JlIGdQRlNCYWNrZ3JvdW5kOworCitmbG9hdCBnUm90YXRlOworCityc19mb250IGdJdGFsaWM7Cityc19hbGxvY2F0aW9uIGdUZXh0QWxsb2M7CisKK3JzX3NjcmlwdCBnVHJhbnNmb3JtUlM7CisKK1NnVHJhbnNmb3JtICpnR3JvdXA7CitTZ1RyYW5zZm9ybSAqZ1JvYm90MTsKK2ludCBnUm9ib3QxSW5kZXg7CitTZ1RyYW5zZm9ybSAqZ1JvYm90MjsKK2ludCBnUm9ib3QySW5kZXg7CisKK1NnVHJhbnNmb3JtICpnUm9vdE5vZGU7CisKK3ZvaWQgaW5pdCgpIHsKKyAgICBnUm90YXRlID0gMC4wZjsKK30KKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICBnR3JvdXAtPnRyYW5zZm9ybXMxLncgKz0gMC41ZjsKKyAgICBnR3JvdXAtPmlzRGlydHkgPSAxOworCisgICAgU2dUcmFuc2Zvcm0gKnJvYm90MVB0ciA9IGdSb2JvdDEgKyBnUm9ib3QxSW5kZXg7CisKKyAgICByb2JvdDFQdHItPnRyYW5zZm9ybXMxLncgLT0gMS41ZjsKKyAgICByb2JvdDFQdHItPmlzRGlydHkgPSAxOworCisgICAgU2dUcmFuc2Zvcm0gKnJvYm90MlB0ciA9IGdSb2JvdDIgKyBnUm9ib3QySW5kZXg7CisgICAgcm9ib3QyUHRyLT50cmFuc2Zvcm1zMS53ICs9IDIuNWY7CisgICAgcm9ib3QyUHRyLT5pc0RpcnR5ID0gMTsKKworICAgIHJzRm9yRWFjaChnVHJhbnNmb3JtUlMsIGdSb290Tm9kZS0+Y2hpbGRyZW4sIGdSb290Tm9kZS0+Y2hpbGRyZW4sIDApOworCisgICAgcnNnQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1BWQmFja2dyb3VuZCk7CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1BGQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUEZTQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1BGQmFja2dyb3VuZCwgMCwgZ1RHcmlkKTsKKworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJnJvYm90MVB0ci0+Z2xvYmFsTWF0KTsKKyAgICByc2dEcmF3TWVzaChnVGVzdE1lc2gpOworCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmcm9ib3QyUHRyLT5nbG9iYWxNYXQpOworICAgIHJzZ0RyYXdNZXNoKGdUZXN0TWVzaCk7CisKKyAgICBjb2xvcigwLjNmLCAwLjNmLCAwLjNmLCAxLjBmKTsKKyAgICByc2dEcmF3VGV4dCgiUmVuZGVyc2NyaXB0IHRyYW5zZm9ybSB0ZXN0IiwgMzAsIDY5NSk7CisKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAzMCwgNzMwKTsKKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2ltcGxlbW9kZWwucnMgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWRlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1BWQmFja2dyb3VuZDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1BGQmFja2dyb3VuZDsKKworcnNfYWxsb2NhdGlvbiBnVEdyaWQ7Cityc19tZXNoIGdUZXN0TWVzaDsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUEZTQmFja2dyb3VuZDsKKworZmxvYXQgZ1JvdGF0ZTsKKworcnNfZm9udCBnSXRhbGljOworcnNfYWxsb2NhdGlvbiBnVGV4dEFsbG9jOworCit2b2lkIGluaXQoKSB7CisgICAgZ1JvdGF0ZSA9IDAuMGY7Cit9CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1BWQmFja2dyb3VuZCk7CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1BGQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUEZTQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1BGQmFja2dyb3VuZCwgMCwgZ1RHcmlkKTsKKworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJm1hdHJpeCk7CisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeFRyYW5zbGF0ZSgmbWF0cml4LCAwLjBmLCAtMC4zZiwgLTEwLjBmKTsKKyAgICByc01hdHJpeFNjYWxlKCZtYXRyaXgsIDAuMmYsIDAuMmYsIDAuMmYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIDI1LjBmLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCBnUm90YXRlLCAwLjBmLCAxLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgcnNnRHJhd01lc2goZ1Rlc3RNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigwLjNmLCAwLjNmLCAwLjNmLCAxLjBmKTsKKyAgICByc2dEcmF3VGV4dCgiUmVuZGVyc2NyaXB0IG1vZGVsIHRlc3QiLCAzMCwgNjk1KTsKKworICAgIHJzZ0JpbmRGb250KGdJdGFsaWMpOworICAgIHJzZ0RyYXdUZXh0KGdUZXh0QWxsb2MsIDMwLCA3MzApOworCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm0ucnMgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Y1ZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm0ucnMKQEAgLTAsMCArMSwxMDAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2luY2x1ZGUgInRyYW5zZm9ybV9kZWYucnNoIgorCityc19zY3JpcHQgdHJhbnNmb3JtU2NyaXB0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNoYW5nZWQ7CisgICAgcnNfbWF0cml4NHg0ICptYXQ7Cit9IFBhcmVudERhdGE7CisKK3ZvaWQgYXBwZW5kVHJhbnNmb3JtYXRpb24oaW50IHR5cGUsIGZsb2F0NCBkYXRhLCByc19tYXRyaXg0eDQgKm1hdCkgeworICAgIHJzX21hdHJpeDR4NCB0ZW1wOworCisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIFRSQU5TRk9STV9UUkFOU0xBVEU6CisgICAgICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmdGVtcCwgZGF0YS54LCBkYXRhLnksIGRhdGEueik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBTlNGT1JNX1JPVEFURToKKyAgICAgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZ0ZW1wLCBkYXRhLncsIGRhdGEueCwgZGF0YS55LCBkYXRhLnopOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRk9STV9TQ0FMRToKKyAgICAgICAgcnNNYXRyaXhMb2FkU2NhbGUoJnRlbXAsIGRhdGEueCwgZGF0YS55LCBkYXRhLnopOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcnNNYXRyaXhNdWx0aXBseShtYXQsICZ0ZW1wKTsKK30KKwordm9pZCByb290KGNvbnN0IHZvaWQgKnZfaW4sIHZvaWQgKnZfb3V0LCBjb25zdCB2b2lkICp1c3JEYXRhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisKKyAgICBTZ1RyYW5zZm9ybSAqZGF0YSA9IChTZ1RyYW5zZm9ybSAqKXZfb3V0OworICAgIGNvbnN0IFBhcmVudERhdGEgKnBhcmVudCA9IChjb25zdCBQYXJlbnREYXRhICopdXNyRGF0YTsKKworICAgIC8vcnNEZWJ1ZygiVHJhbnNmb3JtIGRhdGEiLCAoaW50KWRhdGEpOworICAgIC8vcnNEZWJ1ZygiRW50ZXJpbmcgcGFyZW50IiwgKGludClwYXJlbnQpOworCisgICAgcnNfbWF0cml4NHg0ICpsb2NhbE1hdCA9ICZkYXRhLT5sb2NhbE1hdDsKKyAgICByc19tYXRyaXg0eDQgKmdsb2JhbE1hdCA9ICZkYXRhLT5nbG9iYWxNYXQ7CisKKyAgICBQYXJlbnREYXRhIHRvQ2hpbGQ7CisgICAgdG9DaGlsZC5jaGFuZ2VkID0gMDsKKyAgICB0b0NoaWxkLm1hdCA9IGdsb2JhbE1hdDsKKworICAgIC8vcnNEZWJ1ZygiVHJhbnNmb3JtIGlzIGRpcnR5IiwgZGF0YS0+aXNEaXJ0eSk7CisKKyAgICAvLyBSZWZyZXNoIG1hdHJpY2VzIGlmIGRpcnR5CisgICAgaWYoZGF0YS0+aXNEaXJ0eSkgeworICAgICAgICBkYXRhLT5pc0RpcnR5ID0gMDsKKyAgICAgICAgdG9DaGlsZC5jaGFuZ2VkID0gMTsKKworICAgICAgICAvLyBSZXNldCBvdXIgbG9jYWwgbWF0cml4CisgICAgICAgIHJzTWF0cml4TG9hZElkZW50aXR5KGxvY2FsTWF0KTsKKworICAgICAgICBmbG9hdDQgKnRyYW5zZm9ybVNvdXJjZSA9ICZkYXRhLT50cmFuc2Zvcm1zMDsKKyAgICAgICAgaW50ICp0cmFuc2Zvcm1UeXBlcyA9ICZkYXRhLT50cmFuc2Zvcm1UeXBlMDsKKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkgKyspIHsKKyAgICAgICAgICAgIGlmKHRyYW5zZm9ybVR5cGVzW2ldID09IFRSQU5TRk9STV9OT05FKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBhZGRpbmcgdHJhbnNmb3JtYXRpb24iLCB0cmFuc2Zvcm1UeXBlc1tpXSk7CisgICAgICAgICAgICBhcHBlbmRUcmFuc2Zvcm1hdGlvbih0cmFuc2Zvcm1UeXBlc1tpXSwgdHJhbnNmb3JtU291cmNlW2ldLCBsb2NhbE1hdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBjaGVja2luZyBwYXJlbnQiLCAoaW50KTApOworCisgICAgaWYocGFyZW50KSB7CisgICAgICAgIGlmKHBhcmVudC0+Y2hhbmdlZCkgeworICAgICAgICAgICAgdG9DaGlsZC5jaGFuZ2VkID0gMTsKKworICAgICAgICAgICAgcnNNYXRyaXhMb2FkKGdsb2JhbE1hdCwgcGFyZW50LT5tYXQpOworICAgICAgICAgICAgcnNNYXRyaXhNdWx0aXBseShnbG9iYWxNYXQsIGxvY2FsTWF0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNNYXRyaXhMb2FkKGdsb2JhbE1hdCwgbG9jYWxNYXQpOworICAgIH0KKworICAgIC8vcnNEZWJ1ZygiVHJhbnNmb3JtIGNhbGxpbmcgc2VsZiB3aXRoIGNoaWxkICIsIChpbnQpZGF0YS0+Y2hpbGRyZW4ucCk7CisgICAgaWYoZGF0YS0+Y2hpbGRyZW4ucCkgeworICAgICAgICByc0ZvckVhY2godHJhbnNmb3JtU2NyaXB0LCBkYXRhLT5jaGlsZHJlbiwgZGF0YS0+Y2hpbGRyZW4sICh2b2lkKikmdG9DaGlsZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm1fZGVmLnJzaCBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtX2RlZi5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4NzJhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtX2RlZi5yc2gKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyKQorCisjZGVmaW5lIFRSQU5TRk9STV9OT05FIDAKKyNkZWZpbmUgVFJBTlNGT1JNX1RSQU5TTEFURSAxCisjZGVmaW5lIFRSQU5TRk9STV9ST1RBVEUgMgorI2RlZmluZSBUUkFOU0ZPUk1fU0NBTEUgMworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgcnNfbWF0cml4NHg0IGdsb2JhbE1hdDsKKyAgICByc19tYXRyaXg0eDQgbG9jYWxNYXQ7CisKKyAgICBmbG9hdDQgdHJhbnNmb3JtczA7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMjsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczM7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM0OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zNTsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczY7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM3OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zODsKKyAgICBmbG9hdDQgdHJhbnNmb3Jtczk7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxMDsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczExOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTI7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxMzsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczE0OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTU7CisKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTA7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxOworICAgIGludCB0cmFuc2Zvcm1UeXBlMjsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTM7CisgICAgaW50IHRyYW5zZm9ybVR5cGU0OworICAgIGludCB0cmFuc2Zvcm1UeXBlNTsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTY7CisgICAgaW50IHRyYW5zZm9ybVR5cGU3OworICAgIGludCB0cmFuc2Zvcm1UeXBlODsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTk7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxMDsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTExOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTI7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxMzsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTE0OworICAgIGludCB0cmFuc2Zvcm1UeXBlMTU7CisKKyAgICBpbnQgaXNEaXJ0eTsKKworICAgIHJzX2FsbG9jYXRpb24gY2hpbGRyZW47CisKK30gU2dUcmFuc2Zvcm07CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkLm1rIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWFlNzM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gU2FtcGxlcworCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMTkxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnNhbXBsZXMiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJTYW1wbGVzIgorICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Rlc3RfcGF0dGVybiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlJzTGlzdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlJzTGlzdCIgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUnNSZW5kZXJTdGF0ZXMiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJSc1N0YXRlcyIgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2NoZWNrZXIucG5nIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2NoZWNrZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzFlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvY2hlY2tlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2RhdGEucG5nIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2RhdGEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzQ3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvZGF0YS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2xlYWYucG5nIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2xlYWYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDM3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvbGVhZi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QxNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3RvcnVzbWFwLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90b3J1c21hcC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwOGYzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90b3J1c21hcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9tdWx0aXRleGYuZ2xzbCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvbXVsdGl0ZXhmLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxZmY5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvbXVsdGl0ZXhmLmdsc2wKQEAgLTAsMCArMSwxMiBAQAordmFyeWluZyB2ZWMyIHZhclRleDA7CisKK3ZvaWQgbWFpbigpIHsKKyAgIHZlYzIgdDAgPSB2YXJUZXgwLnh5OworICAgbG93cCB2ZWM0IGNvbDAgPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5yZ2JhOworICAgbG93cCB2ZWM0IGNvbDEgPSB0ZXh0dXJlMkQoVU5JX1RleDEsIHQwKjQuMCkucmdiYTsKKyAgIGxvd3AgdmVjNCBjb2wyID0gdGV4dHVyZTJEKFVOSV9UZXgyLCB0MCkucmdiYTsKKyAgIGNvbDAueHl6ID0gY29sMC54eXoqY29sMS54eXoqMS41OworICAgY29sMC54eXogPSBtaXgoY29sMC54eXosIGNvbDIueHl6LCBjb2wyLncpOworICAgZ2xfRnJhZ0NvbG9yID0gY29sMDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJmLmdsc2wgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3NoYWRlcmYuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2JlN2VlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJmLmdsc2wKQEAgLTAsMCArMSwxNiBAQAorCit2YXJ5aW5nIGxvd3AgZmxvYXQgbGlnaHQwX0RpZmZ1c2U7Cit2YXJ5aW5nIGxvd3AgZmxvYXQgbGlnaHQwX1NwZWN1bGFyOwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MV9EaWZmdXNlOwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MV9TcGVjdWxhcjsKK3ZhcnlpbmcgdmVjMiB2YXJUZXgwOworCit2b2lkIG1haW4oKSB7CisgICB2ZWMyIHQwID0gdmFyVGV4MC54eTsKKyAgIGxvd3AgdmVjNCBjb2wgPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5yZ2JhOworICAgY29sLnh5eiA9IGNvbC54eXogKiAobGlnaHQwX0RpZmZ1c2UgKiBVTklfbGlnaHQwX0RpZmZ1c2VDb2xvciArIGxpZ2h0MV9EaWZmdXNlICogVU5JX2xpZ2h0MV9EaWZmdXNlQ29sb3IpOworICAgY29sLnh5eiArPSBsaWdodDBfU3BlY3VsYXIgKiBVTklfbGlnaHQwX1NwZWN1bGFyQ29sb3I7CisgICBjb2wueHl6ICs9IGxpZ2h0MV9TcGVjdWxhciAqIFVOSV9saWdodDFfU3BlY3VsYXJDb2xvcjsKKyAgIGdsX0ZyYWdDb2xvciA9IGNvbDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJ2Lmdsc2wgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3NoYWRlcnYuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc1ODljZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVydi5nbHNsCkBAIC0wLDAgKzEsMzAgQEAKK3ZhcnlpbmcgZmxvYXQgbGlnaHQwX0RpZmZ1c2U7Cit2YXJ5aW5nIGZsb2F0IGxpZ2h0MF9TcGVjdWxhcjsKK3ZhcnlpbmcgZmxvYXQgbGlnaHQxX0RpZmZ1c2U7Cit2YXJ5aW5nIGZsb2F0IGxpZ2h0MV9TcGVjdWxhcjsKK3ZhcnlpbmcgdmVjMiB2YXJUZXgwOworCisvLyBUaGlzIGlzIHdoZXJlIGFjdHVhbCBzaGFkZXIgY29kZSBiZWdpbnMKK3ZvaWQgbWFpbigpIHsKKyAgIHZlYzQgd29ybGRQb3MgPSBVTklfbW9kZWwgKiBBVFRSSUJfcG9zaXRpb247CisgICBnbF9Qb3NpdGlvbiA9IFVOSV9wcm9qICogd29ybGRQb3M7CisKKyAgIG1hdDMgbW9kZWwzID0gbWF0MyhVTklfbW9kZWxbMF0ueHl6LCBVTklfbW9kZWxbMV0ueHl6LCBVTklfbW9kZWxbMl0ueHl6KTsKKyAgIHZlYzMgd29ybGROb3JtID0gbW9kZWwzICogQVRUUklCX25vcm1hbDsKKyAgIHZlYzMgViA9IG5vcm1hbGl6ZSgtd29ybGRQb3MueHl6KTsKKworICAgdmVjMyBsaWdodDBWZWMgPSBub3JtYWxpemUoVU5JX2xpZ2h0MF9Qb3Npc2lvbiAtIHdvcmxkUG9zLnh5eik7CisgICB2ZWMzIGxpZ2h0MFIgPSByZWZsZWN0KGxpZ2h0MFZlYywgd29ybGROb3JtKTsKKyAgIGxpZ2h0MF9EaWZmdXNlID0gY2xhbXAoZG90KHdvcmxkTm9ybSwgbGlnaHQwVmVjKSwgMC4wLCAxLjApICogVU5JX2xpZ2h0MF9EaWZmdXNlOworICAgZmxvYXQgbGlnaHQwU3BlYyA9IGNsYW1wKGRvdChsaWdodDBSLCBWKSwgMC4wMDEsIDEuMCk7CisgICBsaWdodDBfU3BlY3VsYXIgPSBwb3cobGlnaHQwU3BlYywgVU5JX2xpZ2h0MF9Db3NpbmVQb3dlcikgKiBVTklfbGlnaHQwX1NwZWN1bGFyOworCisgICB2ZWMzIGxpZ2h0MVZlYyA9IG5vcm1hbGl6ZShVTklfbGlnaHQxX1Bvc2lzaW9uIC0gd29ybGRQb3MueHl6KTsKKyAgIHZlYzMgbGlnaHQxUiA9IHJlZmxlY3QobGlnaHQxVmVjLCB3b3JsZE5vcm0pOworICAgbGlnaHQxX0RpZmZ1c2UgPSBjbGFtcChkb3Qod29ybGROb3JtLCBsaWdodDFWZWMpLCAwLjAsIDEuMCkgKiBVTklfbGlnaHQxX0RpZmZ1c2U7CisgICBmbG9hdCBsaWdodDFTcGVjID0gY2xhbXAoZG90KGxpZ2h0MVIsIFYpLCAwLjAwMSwgMS4wKTsKKyAgIGxpZ2h0MV9TcGVjdWxhciA9IHBvdyhsaWdodDFTcGVjLCBVTklfbGlnaHQxX0Nvc2luZVBvd2VyKSAqIFVOSV9saWdodDFfU3BlY3VsYXI7CisKKyAgIGdsX1BvaW50U2l6ZSA9IDEuMDsKKyAgIHZhclRleDAgPSBBVFRSSUJfdGV4dHVyZTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvdG9ydXMuYTNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjJiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3QuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNmIxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBSc0xpc3QgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFJzTGlzdFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgUnNMaXN0Vmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RSUy5qYXZhIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0UlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWVlYTg3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFJTLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworcHVibGljIGNsYXNzIFJzTGlzdFJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQV9MSVNUID0geworICAgICJBZmdoYW5pc3RhbiIsICJBbGJhbmlhIiwgIkFsZ2VyaWEiLCAiQW1lcmljYW4gU2Ftb2EiLCAiQW5kb3JyYSIsCisgICAgIkFuZ29sYSIsICJBbmd1aWxsYSIsICJBbnRhcmN0aWNhIiwgIkFudGlndWEgYW5kIEJhcmJ1ZGEiLCAiQXJnZW50aW5hIiwKKyAgICAiQXJtZW5pYSIsICJBcnViYSIsICJBdXN0cmFsaWEiLCAiQXVzdHJpYSIsICJBemVyYmFpamFuIiwKKyAgICAiQmFocmFpbiIsICJCYW5nbGFkZXNoIiwgIkJhcmJhZG9zIiwgIkJlbGFydXMiLCAiQmVsZ2l1bSIsCisgICAgIkJlbGl6ZSIsICJCZW5pbiIsICJCZXJtdWRhIiwgIkJodXRhbiIsICJCb2xpdmlhIiwKKyAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsICJCb3Rzd2FuYSIsICJCb3V2ZXQgSXNsYW5kIiwgIkJyYXppbCIsCisgICAgIkJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeSIsICJCcml0aXNoIFZpcmdpbiBJc2xhbmRzIiwgIkJydW5laSIsICJCdWxnYXJpYSIsCisgICAgIkJ1cmtpbmEgRmFzbyIsICJCdXJ1bmRpIiwgIkNvdGUgZCdJdm9pcmUiLCAiQ2FtYm9kaWEiLCAiQ2FtZXJvb24iLCAiQ2FuYWRhIiwgIkNhcGUgVmVyZGUiLAorICAgICJDYXltYW4gSXNsYW5kcyIsICJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLCAiQ2hhZCIsICJDaGlsZSIsICJDaGluYSIsCisgICAgIkNocmlzdG1hcyBJc2xhbmQiLCAiQ29jb3MgKEtlZWxpbmcpIElzbGFuZHMiLCAiQ29sb21iaWEiLCAiQ29tb3JvcyIsICJDb25nbyIsCisgICAgIkNvb2sgSXNsYW5kcyIsICJDb3N0YSBSaWNhIiwgIkNyb2F0aWEiLCAiQ3ViYSIsICJDeXBydXMiLCAiQ3plY2ggUmVwdWJsaWMiLAorICAgICJEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbyIsICJEZW5tYXJrIiwgIkRqaWJvdXRpIiwgIkRvbWluaWNhIiwgIkRvbWluaWNhbiBSZXB1YmxpYyIsCisgICAgIkVhc3QgVGltb3IiLCAiRWN1YWRvciIsICJFZ3lwdCIsICJFbCBTYWx2YWRvciIsICJFcXVhdG9yaWFsIEd1aW5lYSIsICJFcml0cmVhIiwKKyAgICAiRXN0b25pYSIsICJFdGhpb3BpYSIsICJGYWVyb2UgSXNsYW5kcyIsICJGYWxrbGFuZCBJc2xhbmRzIiwgIkZpamkiLCAiRmlubGFuZCIsCisgICAgIkZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEiLCAiRnJhbmNlIiwgIkZyZW5jaCBHdWlhbmEiLCAiRnJlbmNoIFBvbHluZXNpYSIsCisgICAgIkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsICJHYWJvbiIsICJHZW9yZ2lhIiwgIkdlcm1hbnkiLCAiR2hhbmEiLCAiR2licmFsdGFyIiwKKyAgICAiR3JlZWNlIiwgIkdyZWVubGFuZCIsICJHcmVuYWRhIiwgIkd1YWRlbG91cGUiLCAiR3VhbSIsICJHdWF0ZW1hbGEiLCAiR3VpbmVhIiwgIkd1aW5lYS1CaXNzYXUiLAorICAgICJHdXlhbmEiLCAiSGFpdGkiLCAiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwgIkhvbmR1cmFzIiwgIkhvbmcgS29uZyIsICJIdW5nYXJ5IiwKKyAgICAiSWNlbGFuZCIsICJJbmRpYSIsICJJbmRvbmVzaWEiLCAiSXJhbiIsICJJcmFxIiwgIklyZWxhbmQiLCAiSXNyYWVsIiwgIkl0YWx5IiwgIkphbWFpY2EiLAorICAgICJKYXBhbiIsICJKb3JkYW4iLCAiS2F6YWtoc3RhbiIsICJLZW55YSIsICJLaXJpYmF0aSIsICJLdXdhaXQiLCAiS3lyZ3l6c3RhbiIsICJMYW9zIiwKKyAgICAiTGF0dmlhIiwgIkxlYmFub24iLCAiTGVzb3RobyIsICJMaWJlcmlhIiwgIkxpYnlhIiwgIkxpZWNodGVuc3RlaW4iLCAiTGl0aHVhbmlhIiwgIkx1eGVtYm91cmciLAorICAgICJNYWNhdSIsICJNYWRhZ2FzY2FyIiwgIk1hbGF3aSIsICJNYWxheXNpYSIsICJNYWxkaXZlcyIsICJNYWxpIiwgIk1hbHRhIiwgIk1hcnNoYWxsIElzbGFuZHMiLAorICAgICJNYXJ0aW5pcXVlIiwgIk1hdXJpdGFuaWEiLCAiTWF1cml0aXVzIiwgIk1heW90dGUiLCAiTWV4aWNvIiwgIk1pY3JvbmVzaWEiLCAiTW9sZG92YSIsCisgICAgIk1vbmFjbyIsICJNb25nb2xpYSIsICJNb250c2VycmF0IiwgIk1vcm9jY28iLCAiTW96YW1iaXF1ZSIsICJNeWFubWFyIiwgIk5hbWliaWEiLAorICAgICJOYXVydSIsICJOZXBhbCIsICJOZXRoZXJsYW5kcyIsICJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsICJOZXcgQ2FsZWRvbmlhIiwgIk5ldyBaZWFsYW5kIiwKKyAgICAiTmljYXJhZ3VhIiwgIk5pZ2VyIiwgIk5pZ2VyaWEiLCAiTml1ZSIsICJOb3Jmb2xrIElzbGFuZCIsICJOb3J0aCBLb3JlYSIsICJOb3J0aGVybiBNYXJpYW5hcyIsCisgICAgIk5vcndheSIsICJPbWFuIiwgIlBha2lzdGFuIiwgIlBhbGF1IiwgIlBhbmFtYSIsICJQYXB1YSBOZXcgR3VpbmVhIiwgIlBhcmFndWF5IiwgIlBlcnUiLAorICAgICJQaGlsaXBwaW5lcyIsICJQaXRjYWlybiBJc2xhbmRzIiwgIlBvbGFuZCIsICJQb3J0dWdhbCIsICJQdWVydG8gUmljbyIsICJRYXRhciIsCisgICAgIlJldW5pb24iLCAiUm9tYW5pYSIsICJSdXNzaWEiLCAiUndhbmRhIiwgIlNxbyBUb21lIGFuZCBQcmluY2lwZSIsICJTYWludCBIZWxlbmEiLAorICAgICJTYWludCBLaXR0cyBhbmQgTmV2aXMiLCAiU2FpbnQgTHVjaWEiLCAiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCisgICAgIlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwgIlNhbW9hIiwgIlNhbiBNYXJpbm8iLCAiU2F1ZGkgQXJhYmlhIiwgIlNlbmVnYWwiLAorICAgICJTZXljaGVsbGVzIiwgIlNpZXJyYSBMZW9uZSIsICJTaW5nYXBvcmUiLCAiU2xvdmFraWEiLCAiU2xvdmVuaWEiLCAiU29sb21vbiBJc2xhbmRzIiwKKyAgICAiU29tYWxpYSIsICJTb3V0aCBBZnJpY2EiLCAiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLCAiU291dGggS29yZWEiLAorICAgICJTcGFpbiIsICJTcmkgTGFua2EiLCAiU3VkYW4iLCAiU3VyaW5hbWUiLCAiU3ZhbGJhcmQgYW5kIEphbiBNYXllbiIsICJTd2F6aWxhbmQiLCAiU3dlZGVuIiwKKyAgICAiU3dpdHplcmxhbmQiLCAiU3lyaWEiLCAiVGFpd2FuIiwgIlRhamlraXN0YW4iLCAiVGFuemFuaWEiLCAiVGhhaWxhbmQiLCAiVGhlIEJhaGFtYXMiLAorICAgICJUaGUgR2FtYmlhIiwgIlRvZ28iLCAiVG9rZWxhdSIsICJUb25nYSIsICJUcmluaWRhZCBhbmQgVG9iYWdvIiwgIlR1bmlzaWEiLCAiVHVya2V5IiwKKyAgICAiVHVya21lbmlzdGFuIiwgIlR1cmtzIGFuZCBDYWljb3MgSXNsYW5kcyIsICJUdXZhbHUiLCAiVmlyZ2luIElzbGFuZHMiLCAiVWdhbmRhIiwKKyAgICAiVWtyYWluZSIsICJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsICJVbml0ZWQgS2luZ2RvbSIsCisgICAgIlVuaXRlZCBTdGF0ZXMiLCAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwgIlVydWd1YXkiLCAiVXpiZWtpc3RhbiIsCisgICAgIlZhbnVhdHUiLCAiVmF0aWNhbiBDaXR5IiwgIlZlbmV6dWVsYSIsICJWaWV0bmFtIiwgIldhbGxpcyBhbmQgRnV0dW5hIiwgIldlc3Rlcm4gU2FoYXJhIiwKKyAgICAiWWVtZW4iLCAiWXVnb3NsYXZpYSIsICJaYW1iaWEiLCAiWmltYmFid2UiCisgICAgfTsKKworICAgIGludCBtV2lkdGg7CisgICAgaW50IG1IZWlnaHQ7CisKKyAgICBwdWJsaWMgUnNMaXN0UlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIEZvbnQgbUl0YWxpYzsKKworICAgIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyBtTGlzdEFsbG9jczsKKworICAgIHByaXZhdGUgU2NyaXB0Q19yc2xpc3QgbVNjcmlwdDsKKworICAgIGludCBtTGFzdFg7CisgICAgaW50IG1MYXN0WTsKKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uRG93bihpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKDAuMGYpOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Nb3ZlKGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpbnQgZHkgPSBtTGFzdFkgLSB5OworCisgICAgICAgIGlmKE1hdGguYWJzKGR5KSA8PSAyKSB7CisgICAgICAgICAgICBkeSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtU2NyaXB0LnNldF9nRFkoZHkpOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRSUygpIHsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfcnNsaXN0KG1SUywgbVJlcywgUi5yYXcucnNsaXN0LCB0cnVlKTsKKworICAgICAgICBtTGlzdEFsbG9jcyA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MobVJTLCBEQVRBX0xJU1QubGVuZ3RoKTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IERBVEFfTElTVC5sZW5ndGg7IGkgKyspIHsKKyAgICAgICAgICAgIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtIGxpc3RFbGVtID0gbmV3IFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtKCk7CisgICAgICAgICAgICBsaXN0RWxlbS50ZXh0ID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgREFUQV9MSVNUW2ldKTsKKyAgICAgICAgICAgIG1MaXN0QWxsb2NzLnNldChsaXN0RWxlbSwgaSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgbUxpc3RBbGxvY3MuY29weUFsbCgpOworCisgICAgICAgIG1TY3JpcHQuYmluZF9nTGlzdChtTGlzdEFsbG9jcyk7CisKKyAgICAgICAgbUl0YWxpYyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuQk9MRF9JVEFMSUMsIDgpOworICAgICAgICBtU2NyaXB0LnNldF9nSXRhbGljKG1JdGFsaWMpOworCisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0Vmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OGVhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RWaWV3LmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBSc0xpc3RWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgUnNMaXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgUnNMaXN0UlMgbVJlbmRlcjsKKworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBSc0xpc3RSUygpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKKyAgICB7CisgICAgICAgIC8vIGJyZWFrIHBvaW50IGF0IGhlcmUKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCB3b3JrIHdoZW4gJ2V4dGVuZHMgVmlldycgaW5jbHVkZSAnZXh0ZW5kcyBTY3JvbGxWaWV3Jy4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Eb3duKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFjdCA9PSBldi5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbk1vdmUoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlcy5qYXZhIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTEwMDdlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXMuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBSc1JlbmRlclN0YXRlcyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgUnNSZW5kZXJTdGF0ZXNWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFJzUmVuZGVyU3RhdGVzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzUlMuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzUlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTkwZGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNSUy5qYXZhCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgUnNSZW5kZXJTdGF0ZXNSUyB7CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworCisgICAgcHVibGljIFJzUmVuZGVyU3RhdGVzUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbU9wdGlvbnNBUkdCLmluU2NhbGVkID0gZmFsc2U7CisgICAgICAgIG1PcHRpb25zQVJHQi5pblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuQVJHQl84ODg4OworICAgICAgICBtTW9kZSA9IDA7CisgICAgICAgIG1NYXhNb2RlcyA9IDk7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisKKyAgICBwcml2YXRlIFNhbXBsZXIgbUxpbmVhckNsYW1wOworICAgIHByaXZhdGUgU2FtcGxlciBtTGluZWFyV3JhcDsKKyAgICBwcml2YXRlIFNhbXBsZXIgbU1pcExpbmVhcldyYXA7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1OZWFyZXN0Q2xhbXA7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1NaXBMaW5lYXJBbmlzbzg7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1NaXBMaW5lYXJBbmlzbzE1OworCisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVByb2dTdG9yZUJsZW5kTm9uZURlcHRoOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZE5vbmU7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVByb2dTdG9yZUJsZW5kQWxwaGE7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVByb2dTdG9yZUJsZW5kQWRkOworCisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVByb2dGcmFnbWVudFRleHR1cmU7CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVByb2dGcmFnbWVudENvbG9yOworCisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1Qcm9nVmVydGV4OworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkE7CisKKyAgICAvLyBDdXN0b20gc2hhZGVycworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUHJvZ1ZlcnRleEN1c3RvbTsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUHJvZ0ZyYWdtZW50Q3VzdG9tOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRNdWx0aXRleDsKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlckNvbnN0YW50c19zIG1WU0NvbnN0OworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfRnJhZ2VudFNoYWRlckNvbnN0YW50c19zIG1GU0NvbnN0OworCisgICAgcHJpdmF0ZSBQcm9ncmFtUmFzdGVyIG1DdWxsQmFjazsKKyAgICBwcml2YXRlIFByb2dyYW1SYXN0ZXIgbUN1bGxGcm9udDsKKyAgICBwcml2YXRlIFByb2dyYW1SYXN0ZXIgbUN1bGxOb25lOworCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhUb3J1czsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleE9wYXF1ZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleFRyYW5zcGFyZW50OworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4Q2hlY2tlcjsKKworICAgIHByaXZhdGUgTWVzaCBtTWJ5Tk1lc2g7CisgICAgcHJpdmF0ZSBNZXNoIG1Ub3J1czsKKworICAgIEZvbnQgbUZvbnRTYW5zOworICAgIEZvbnQgbUZvbnRTZXJpZjsKKyAgICBGb250IG1Gb250U2VyaWZCb2xkOworICAgIEZvbnQgbUZvbnRTZXJpZkl0YWxpYzsKKyAgICBGb250IG1Gb250U2VyaWZCb2xkSXRhbGljOworICAgIEZvbnQgbUZvbnRNb25vOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4dEFsbG9jOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX3JzcmVuZGVyc3RhdGVzIG1TY3JpcHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBtT3B0aW9uc0FSR0IgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CisKKyAgICBpbnQgbU1vZGU7CisgICAgaW50IG1NYXhNb2RlczsKKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uRG93bihpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbU1vZGUgKys7CisgICAgICAgIG1Nb2RlID0gbU1vZGUgJSBtTWF4TW9kZXM7CisgICAgICAgIG1TY3JpcHQuc2V0X2dEaXNwbGF5TW9kZShtTW9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXNoIGdldE1ieU5NZXNoKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGludCB3UmVzb2x1dGlvbiwgaW50IGhSZXNvbHV0aW9uKSB7CisKKyAgICAgICAgTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyIHRtYiA9IG5ldyBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIobVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlci5URVhUVVJFXzApOworCisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDw9IGhSZXNvbHV0aW9uOyB5KyspIHsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IG5vcm1hbGl6ZWRZID0gKGZsb2F0KXkgLyBoUmVzb2x1dGlvbjsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHlPZmZzZXQgPSAobm9ybWFsaXplZFkgLSAwLjVmKSAqIGhlaWdodDsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDw9IHdSZXNvbHV0aW9uOyB4KyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBub3JtYWxpemVkWCA9IChmbG9hdCl4IC8gd1Jlc29sdXRpb247CisgICAgICAgICAgICAgICAgZmxvYXQgeE9mZnNldCA9IChub3JtYWxpemVkWCAtIDAuNWYpICogd2lkdGg7CisgICAgICAgICAgICAgICAgdG1iLnNldFRleHR1cmUobm9ybWFsaXplZFgsIG5vcm1hbGl6ZWRZKTsKKyAgICAgICAgICAgICAgICB0bWIuYWRkVmVydGV4KHhPZmZzZXQsIHlPZmZzZXQpOworICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaFJlc29sdXRpb247IHkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGN1clkgPSB5ICogKHdSZXNvbHV0aW9uICsgMSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgYmVsb3dZID0gKHkgKyAxKSAqICh3UmVzb2x1dGlvbiArIDEpOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3UmVzb2x1dGlvbjsgeCsrKSB7CisgICAgICAgICAgICAgICAgaW50IGN1clYgPSBjdXJZICsgeDsKKyAgICAgICAgICAgICAgICBpbnQgYmVsb3dWID0gYmVsb3dZICsgeDsKKyAgICAgICAgICAgICAgICB0bWIuYWRkVHJpYW5nbGUoY3VyViwgYmVsb3dWLCBjdXJWICsgMSk7CisgICAgICAgICAgICAgICAgdG1iLmFkZFRyaWFuZ2xlKGJlbG93ViwgYmVsb3dWICsgMSwgY3VyViArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRtYi5jcmVhdGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtU3RvcmUoKSB7CisgICAgICAgIC8vIFVzZSBzdG9jayB0aGUgc3RvY2sgcHJvZ3JhbSBzdG9yZSBvYmplY3QKKyAgICAgICAgbVByb2dTdG9yZUJsZW5kTm9uZURlcHRoID0gUHJvZ3JhbVN0b3JlLkJMRU5EX05PTkVfREVQVEhfVEVTVChtUlMpOworICAgICAgICBtUHJvZ1N0b3JlQmxlbmROb25lID0gUHJvZ3JhbVN0b3JlLkJMRU5EX05PTkVfREVQVEhfTk9fREVQVEgobVJTKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBjdXN0b20gcHJvZ3JhbSBzdG9yZQorICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICBtUHJvZ1N0b3JlQmxlbmRBbHBoYSA9IGJ1aWxkZXIuY3JlYXRlKCk7CisKKyAgICAgICAgbVByb2dTdG9yZUJsZW5kQWRkID0gUHJvZ3JhbVN0b3JlLkJMRU5EX0FERF9ERVBUSF9OT19ERVBUSChtUlMpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aChtUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmROb25lKG1Qcm9nU3RvcmVCbGVuZE5vbmUpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmRBbHBoYShtUHJvZ1N0b3JlQmxlbmRBbHBoYSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZEFkZChtUHJvZ1N0b3JlQmxlbmRBZGQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbUZyYWdtZW50KCkgeworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIHRleEJ1aWxkZXIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgdGV4QnVpbGRlci5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVByb2dGcmFnbWVudFRleHR1cmUgPSB0ZXhCdWlsZGVyLmNyZWF0ZSgpOworICAgICAgICBtUHJvZ0ZyYWdtZW50VGV4dHVyZS5iaW5kU2FtcGxlcihtTGluZWFyQ2xhbXAsIDApOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGNvbEJ1aWxkZXIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgY29sQnVpbGRlci5zZXRWYXJ5aW5nQ29sb3IoZmFsc2UpOworICAgICAgICBtUHJvZ0ZyYWdtZW50Q29sb3IgPSBjb2xCdWlsZGVyLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRDb2xvcihtUHJvZ0ZyYWdtZW50Q29sb3IpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ0ZyYWdtZW50VGV4dHVyZShtUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtVmVydGV4KCkgeworICAgICAgICBQcm9ncmFtVmVydGV4LkJ1aWxkZXIgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMpOworICAgICAgICBtUHJvZ1ZlcnRleCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUHJvZ1ZlcnRleC5iaW5kQWxsb2NhdGlvbihtUFZBKTsKKyAgICAgICAgbVBWQS5zZXR1cE9ydGhvV2luZG93KG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dWZXJ0ZXgobVByb2dWZXJ0ZXgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0Q3VzdG9tU2hhZGVycygpIHsKKyAgICAgICAgbVZTQ29uc3QgPSBuZXcgU2NyaXB0RmllbGRfVmVydGV4U2hhZGVyQ29uc3RhbnRzX3MobVJTLCAxKTsKKyAgICAgICAgbUZTQ29uc3QgPSBuZXcgU2NyaXB0RmllbGRfRnJhZ2VudFNoYWRlckNvbnN0YW50c19zKG1SUywgMSk7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dWU0NvbnN0YW50cyhtVlNDb25zdCk7CisgICAgICAgIG1TY3JpcHQuYmluZF9nRlNDb25zdGFudHMobUZTQ29uc3QpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHNoYWRlciBidWlsZGVyCisgICAgICAgIFByb2dyYW1WZXJ0ZXguU2hhZGVyQnVpbGRlciBwdmJDdXN0b20gPSBuZXcgUHJvZ3JhbVZlcnRleC5TaGFkZXJCdWlsZGVyKG1SUyk7CisgICAgICAgIC8vIFNwZWNpZnkgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHNoYWRlciBzdHJpbmcKKyAgICAgICAgcHZiQ3VzdG9tLnNldFNoYWRlcihtUmVzLCBSLnJhdy5zaGFkZXJ2KTsKKyAgICAgICAgLy8gVXNlIGEgc2NyaXB0IGZpZWxkIHRvIHNwY2lmeSB0aGUgaW5wdXQgbGF5b3V0CisgICAgICAgIHB2YkN1c3RvbS5hZGRJbnB1dChTY3JpcHRGaWVsZF9WZXJ0ZXhTaGFkZXJJbnB1dHNfcy5jcmVhdGVFbGVtZW50KG1SUykpOworICAgICAgICAvLyBEZWZpbmUgdGhlIGNvbnN0YW50IGlucHV0IGxheW91dAorICAgICAgICBwdmJDdXN0b20uYWRkQ29uc3RhbnQobVZTQ29uc3QuZ2V0QWxsb2NhdGlvbigpLmdldFR5cGUoKSk7CisgICAgICAgIG1Qcm9nVmVydGV4Q3VzdG9tID0gcHZiQ3VzdG9tLmNyZWF0ZSgpOworICAgICAgICAvLyBCaW5kIHRoZSBzb3VyY2Ugb2YgY29uc3RhbnQgZGF0YQorICAgICAgICBtUHJvZ1ZlcnRleEN1c3RvbS5iaW5kQ29uc3RhbnRzKG1WU0NvbnN0LmdldEFsbG9jYXRpb24oKSwgMCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LlNoYWRlckJ1aWxkZXIgcGZiQ3VzdG9tID0gbmV3IFByb2dyYW1GcmFnbWVudC5TaGFkZXJCdWlsZGVyKG1SUyk7CisgICAgICAgIC8vIFNwZWNpZnkgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHNoYWRlciBzdHJpbmcKKyAgICAgICAgcGZiQ3VzdG9tLnNldFNoYWRlcihtUmVzLCBSLnJhdy5zaGFkZXJmKTsKKyAgICAgICAgLy9UZWxsIHRoZSBidWlsZGVyIGhvdyBtYW55IHRleHR1cmVzIHdlIGhhdmUKKyAgICAgICAgcGZiQ3VzdG9tLnNldFRleHR1cmVDb3VudCgxKTsKKyAgICAgICAgLy8gRGVmaW5lIHRoZSBjb25zdGFudCBpbnB1dCBsYXlvdXQKKyAgICAgICAgcGZiQ3VzdG9tLmFkZENvbnN0YW50KG1GU0NvbnN0LmdldEFsbG9jYXRpb24oKS5nZXRUeXBlKCkpOworICAgICAgICBtUHJvZ0ZyYWdtZW50Q3VzdG9tID0gcGZiQ3VzdG9tLmNyZWF0ZSgpOworICAgICAgICAvLyBCaW5kIHRoZSBzb3VyY2Ugb2YgY29uc3RhbnQgZGF0YQorICAgICAgICBtUHJvZ0ZyYWdtZW50Q3VzdG9tLmJpbmRDb25zdGFudHMobUZTQ29uc3QuZ2V0QWxsb2NhdGlvbigpLCAwKTsKKworICAgICAgICBwZmJDdXN0b20gPSBuZXcgUHJvZ3JhbUZyYWdtZW50LlNoYWRlckJ1aWxkZXIobVJTKTsKKyAgICAgICAgcGZiQ3VzdG9tLnNldFNoYWRlcihtUmVzLCBSLnJhdy5tdWx0aXRleGYpOworICAgICAgICBwZmJDdXN0b20uc2V0VGV4dHVyZUNvdW50KDMpOworICAgICAgICBtUHJvZ0ZyYWdtZW50TXVsdGl0ZXggPSBwZmJDdXN0b20uY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dWZXJ0ZXhDdXN0b20obVByb2dWZXJ0ZXhDdXN0b20pOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ0ZyYWdtZW50Q3VzdG9tKG1Qcm9nRnJhZ21lbnRDdXN0b20pOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ0ZyYWdtZW50TXVsdGl0ZXgobVByb2dGcmFnbWVudE11bHRpdGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbG9hZFRleHR1cmVSR0IoaW50IGlkKSB7CisgICAgICAgIGZpbmFsIEFsbG9jYXRpb24gYWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlKG1SUywgbVJlcywKKyAgICAgICAgICAgICAgICBpZCwgRWxlbWVudC5SR0JfNTY1KG1SUyksIHRydWUpOworICAgICAgICBhbGxvY2F0aW9uLnVwbG9hZFRvVGV4dHVyZSgwKTsKKyAgICAgICAgcmV0dXJuIGFsbG9jYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIGxvYWRUZXh0dXJlQVJHQihpbnQgaWQpIHsKKyAgICAgICAgQml0bWFwIGIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1SZXMsIGlkLCBtT3B0aW9uc0FSR0IpOworICAgICAgICBmaW5hbCBBbGxvY2F0aW9uIGFsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXAobVJTLCBiLCBFbGVtZW50LlJHQkFfODg4OChtUlMpLCB0cnVlKTsKKyAgICAgICAgYWxsb2NhdGlvbi51cGxvYWRUb1RleHR1cmUoMCk7CisgICAgICAgIHJldHVybiBhbGxvY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2VzKCkgeworICAgICAgICBtVGV4VG9ydXMgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLnRvcnVzbWFwKTsKKyAgICAgICAgbVRleE9wYXF1ZSA9IGxvYWRUZXh0dXJlUkdCKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1UZXhUcmFuc3BhcmVudCA9IGxvYWRUZXh0dXJlQVJHQihSLmRyYXdhYmxlLmxlYWYpOworICAgICAgICBtVGV4Q2hlY2tlciA9IGxvYWRUZXh0dXJlUkdCKFIuZHJhd2FibGUuY2hlY2tlcik7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleFRvcnVzKG1UZXhUb3J1cyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXhPcGFxdWUobVRleE9wYXF1ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXhUcmFuc3BhcmVudChtVGV4VHJhbnNwYXJlbnQpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4Q2hlY2tlcihtVGV4Q2hlY2tlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRGb250cygpIHsKKyAgICAgICAgLy8gU2FucyBmb250IGJ5IGZhbWlseSBuYW1lCisgICAgICAgIG1Gb250U2FucyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzYW5zLXNlcmlmIiwgRm9udC5TdHlsZS5OT1JNQUwsIDgpOworICAgICAgICAvLyBDcmVhdGUgZm9udCBieSBmaWxlIG5hbWUKKyAgICAgICAgbUZvbnRTZXJpZiA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtUmVndWxhci50dGYiLCA4KTsKKyAgICAgICAgLy8gQ3JlYXRlIGZvbnRzIGJ5IGZhbWlseSBhbmQgc3R5bGUKKyAgICAgICAgbUZvbnRTZXJpZkJvbGQgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTEQsIDgpOworICAgICAgICBtRm9udFNlcmlmSXRhbGljID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5JVEFMSUMsIDgpOworICAgICAgICBtRm9udFNlcmlmQm9sZEl0YWxpYyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuQk9MRF9JVEFMSUMsIDgpOworICAgICAgICBtRm9udE1vbm8gPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAibW9ubyIsIEZvbnQuU3R5bGUuTk9STUFMLCA4KTsKKworICAgICAgICBtVGV4dEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgIlN0cmluZyBmcm9tIGFsbG9jYXRpb24iKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNhbnMobUZvbnRTYW5zKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZihtRm9udFNlcmlmKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZkJvbGQobUZvbnRTZXJpZkJvbGQpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmSXRhbGljKG1Gb250U2VyaWZJdGFsaWMpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmQm9sZEl0YWxpYyhtRm9udFNlcmlmQm9sZEl0YWxpYyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250TW9ubyhtRm9udE1vbm8pOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4dEFsbG9jKG1UZXh0QWxsb2MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0TWVzaCgpIHsKKyAgICAgICAgbU1ieU5NZXNoID0gZ2V0TWJ5Tk1lc2goMjU2LCAyNTYsIDEwLCAxMCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dNYnlOTWVzaChtTWJ5Tk1lc2gpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnRvcnVzKTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbVRvcnVzID0gKE1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVG9ydXNNZXNoKG1Ub3J1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFNhbXBsZXJzKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIG1MaW5lYXJXcmFwID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgbUxpbmVhckNsYW1wID0gU2FtcGxlci5DTEFNUF9MSU5FQVIobVJTKTsKKyAgICAgICAgbU5lYXJlc3RDbGFtcCA9IFNhbXBsZXIuQ0xBTVBfTkVBUkVTVChtUlMpOworICAgICAgICBtTWlwTGluZWFyV3JhcCA9IFNhbXBsZXIuV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihtUlMpOworCisgICAgICAgIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOworICAgICAgICBicy5zZXRNaW4oU2FtcGxlci5WYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIGJzLnNldEFuaXNvdHJvcHkoOC4wZik7CisgICAgICAgIG1NaXBMaW5lYXJBbmlzbzggPSBicy5jcmVhdGUoKTsKKyAgICAgICAgYnMuc2V0QW5pc290cm9weSgxNS4wZik7CisgICAgICAgIG1NaXBMaW5lYXJBbmlzbzE1ID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0xpbmVhckNsYW1wKG1MaW5lYXJDbGFtcCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dMaW5lYXJXcmFwKG1MaW5lYXJXcmFwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ01pcExpbmVhcldyYXAobU1pcExpbmVhcldyYXApOworICAgICAgICBtU2NyaXB0LnNldF9nTWlwTGluZWFyQW5pc284KG1NaXBMaW5lYXJBbmlzbzgpOworICAgICAgICBtU2NyaXB0LnNldF9nTWlwTGluZWFyQW5pc28xNShtTWlwTGluZWFyQW5pc28xNSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dOZWFyZXN0Q2xhbXAobU5lYXJlc3RDbGFtcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtUmFzdGVyKCkgeworICAgICAgICBtQ3VsbEJhY2sgPSBQcm9ncmFtUmFzdGVyLkNVTExfQkFDSyhtUlMpOworICAgICAgICBtQ3VsbEZyb250ID0gUHJvZ3JhbVJhc3Rlci5DVUxMX0ZST05UKG1SUyk7CisgICAgICAgIG1DdWxsTm9uZSA9IFByb2dyYW1SYXN0ZXIuQ1VMTF9OT05FKG1SUyk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0N1bGxCYWNrKG1DdWxsQmFjayk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dDdWxsRnJvbnQobUN1bGxGcm9udCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dDdWxsTm9uZShtQ3VsbE5vbmUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3JzcmVuZGVyc3RhdGVzKG1SUywgbVJlcywgUi5yYXcucnNyZW5kZXJzdGF0ZXMsIHRydWUpOworCisgICAgICAgIGluaXRTYW1wbGVycygpOworICAgICAgICBpbml0UHJvZ3JhbVN0b3JlKCk7CisgICAgICAgIGluaXRQcm9ncmFtRnJhZ21lbnQoKTsKKyAgICAgICAgaW5pdFByb2dyYW1WZXJ0ZXgoKTsKKyAgICAgICAgaW5pdEZvbnRzKCk7CisgICAgICAgIGxvYWRJbWFnZXMoKTsKKyAgICAgICAgaW5pdE1lc2goKTsKKyAgICAgICAgaW5pdFByb2dyYW1SYXN0ZXIoKTsKKyAgICAgICAgaW5pdEN1c3RvbVNoYWRlcnMoKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0OGRlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzVmlldy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgUnNSZW5kZXJTdGF0ZXNWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgUnNSZW5kZXJTdGF0ZXNWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBSc1JlbmRlclN0YXRlc1JTIG1SZW5kZXI7CisKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgUnNSZW5kZXJTdGF0ZXNSUygpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKKyAgICB7CisgICAgICAgIC8vIGJyZWFrIHBvaW50IGF0IGhlcmUKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCB3b3JrIHdoZW4gJ2V4dGVuZHMgVmlldycgaW5jbHVkZSAnZXh0ZW5kcyBTY3JvbGxWaWV3Jy4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Eb3duKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNsaXN0LnJzIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNsaXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjBhZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9yc2xpc3QucnMKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnNhbXBsZXMpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK2Zsb2F0IGdEWTsKKworcnNfZm9udCBnSXRhbGljOworCit0eXBlZGVmIHN0cnVjdCBMaXN0QWxsb2NzX3MgeworICAgIHJzX2FsbG9jYXRpb24gdGV4dDsKK30gTGlzdEFsbG9jczsKKworTGlzdEFsbG9jcyAqZ0xpc3Q7CisKK3ZvaWQgaW5pdCgpIHsKKyAgICBnRFkgPSAwLjBmOworfQorCitpbnQgdGV4dFBvcyA9IDA7CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgdGV4dFBvcyAtPSAoaW50KWdEWSoyOworICAgIGdEWSAqPSAwLjk1OworCisgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuOWYsIDAuOWYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdJdGFsaWMpOworICAgIGNvbG9yKDAuMiwgMC4yLCAwLjIsIDApOworCisgICAgcnNfYWxsb2NhdGlvbiBsaXN0QWxsb2MgPSByc0dldEFsbG9jYXRpb24oZ0xpc3QpOworICAgIGludCBhbGxvY1NpemUgPSByc0FsbG9jYXRpb25HZXREaW1YKGxpc3RBbGxvYyk7CisKKyAgICBpbnQgd2lkdGggPSByc2dHZXRXaWR0aCgpOworICAgIGludCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKworICAgIGludCBpdGVtSGVpZ2h0ID0gODA7CisgICAgaW50IGN1cnJlbnRZUG9zID0gaXRlbUhlaWdodCArIHRleHRQb3M7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgYWxsb2NTaXplOyBpICsrKSB7CisgICAgICAgIGlmKGN1cnJlbnRZUG9zIC0gaXRlbUhlaWdodCA+IGhlaWdodCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZihjdXJyZW50WVBvcyA+IDApIHsKKyAgICAgICAgICAgIHJzZ0RyYXdSZWN0KDAsIGN1cnJlbnRZUG9zIC0gMSwgd2lkdGgsIGN1cnJlbnRZUG9zLCAwKTsKKyAgICAgICAgICAgIHJzZ0RyYXdUZXh0KGdMaXN0W2ldLnRleHQsIDMwLCBjdXJyZW50WVBvcyAtIDMyKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50WVBvcyArPSBpdGVtSGVpZ2h0OworICAgIH0KKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzcmVuZGVyc3RhdGVzLnJzIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNyZW5kZXJzdGF0ZXMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlMzVmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzcmVuZGVyc3RhdGVzLnJzCkBAIC0wLDAgKzEsNTgzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQuc2FtcGxlcykKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKyNpbmNsdWRlICJzaGFkZXJfZGVmLnJzaCIKKworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1Byb2dWZXJ0ZXg7Cityc19wcm9ncmFtX2ZyYWdtZW50IGdQcm9nRnJhZ21lbnRDb2xvcjsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1Byb2dGcmFnbWVudFRleHR1cmU7CisKK3JzX3Byb2dyYW1fc3RvcmUgZ1Byb2dTdG9yZUJsZW5kTm9uZURlcHRoOworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmROb25lOworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmRBbHBoYTsKK3JzX3Byb2dyYW1fc3RvcmUgZ1Byb2dTdG9yZUJsZW5kQWRkOworCityc19hbGxvY2F0aW9uIGdUZXhPcGFxdWU7Cityc19hbGxvY2F0aW9uIGdUZXhUb3J1czsKK3JzX2FsbG9jYXRpb24gZ1RleFRyYW5zcGFyZW50OworcnNfYWxsb2NhdGlvbiBnVGV4Q2hlY2tlcjsKKworcnNfbWVzaCBnTWJ5Tk1lc2g7Cityc19tZXNoIGdUb3J1c01lc2g7CisKK3JzX2ZvbnQgZ0ZvbnRTYW5zOworcnNfZm9udCBnRm9udFNlcmlmOworcnNfZm9udCBnRm9udFNlcmlmQm9sZDsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZkl0YWxpYzsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZkJvbGRJdGFsaWM7Cityc19mb250IGdGb250TW9ubzsKK3JzX2FsbG9jYXRpb24gZ1RleHRBbGxvYzsKKworaW50IGdEaXNwbGF5TW9kZTsKKworcnNfc2FtcGxlciBnTGluZWFyQ2xhbXA7Cityc19zYW1wbGVyIGdMaW5lYXJXcmFwOworcnNfc2FtcGxlciBnTWlwTGluZWFyV3JhcDsKK3JzX3NhbXBsZXIgZ01pcExpbmVhckFuaXNvODsKK3JzX3NhbXBsZXIgZ01pcExpbmVhckFuaXNvMTU7Cityc19zYW1wbGVyIGdOZWFyZXN0Q2xhbXA7CisKK3JzX3Byb2dyYW1fcmFzdGVyIGdDdWxsQmFjazsKK3JzX3Byb2dyYW1fcmFzdGVyIGdDdWxsRnJvbnQ7Cityc19wcm9ncmFtX3Jhc3RlciBnQ3VsbE5vbmU7CisKKy8vIEN1c3RvbSB2ZXJ0ZXggc2hhZGVyIGNvbXB1bmVudHMKK1ZlcnRleFNoYWRlckNvbnN0YW50cyAqZ1ZTQ29uc3RhbnRzOworRnJhZ2VudFNoYWRlckNvbnN0YW50cyAqZ0ZTQ29uc3RhbnRzOworLy8gRXhwb3J0IHRoZXNlIG91dCB0byBlYXNpbHkgc2V0IHRoZSBpbnB1dHMgdG8gc2hhZGVyCitWZXJ0ZXhTaGFkZXJJbnB1dHMgKmdWU0lucHV0czsKKy8vIEN1c3RvbSBzaGFkZXJzIHdlIHVzZSBmb3IgbGlnaHRpbmcKK3JzX3Byb2dyYW1fdmVydGV4IGdQcm9nVmVydGV4Q3VzdG9tOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50Q3VzdG9tOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50TXVsdGl0ZXg7CisKK2Zsb2F0IGdEdCA9IDA7CisKK3ZvaWQgaW5pdCgpIHsKK30KKwordm9pZCBkaXNwbGF5Rm9udFNhbXBsZXMoKSB7CisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIGludCB5UG9zID0gMTAwOworICAgIHJzZ0JpbmRGb250KGdGb250U2Fucyk7CisgICAgcnNnRHJhd1RleHQoIlNhbnMgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMC41ZiwgMC45ZiwgMC41ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZik7CisgICAgcnNnRHJhd1RleHQoIlNlcmlmIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDAuN2YsIDAuN2YsIDAuN2YsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZCb2xkKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgQm9sZCBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0ZvbnRDb2xvcigwLjVmLCAwLjVmLCAwLjlmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNlcmlmSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgSXRhbGljIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZCb2xkSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgQm9sZCBJdGFsaWMgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJNb25vc3BhY2UgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSA1MDsKKworICAgIC8vIE5vdyB1c2UgdGV4dCBtZXRyaWNzIHRvIGNlbnRlciB0aGUgdGV4dAorICAgIHVpbnQgd2lkdGggPSByc2dHZXRXaWR0aCgpOworICAgIHVpbnQgaGVpZ2h0ID0gcnNnR2V0SGVpZ2h0KCk7CisgICAgaW50IGxlZnQgPSAwLCByaWdodCA9IDAsIHRvcCA9IDAsIGJvdHRvbSA9IDA7CisKKyAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45NWYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZCb2xkSXRhbGljKTsKKworICAgIHJzZ01lYXN1cmVUZXh0KGdUZXh0QWxsb2MsICZsZWZ0LCAmcmlnaHQsICZ0b3AsICZib3R0b20pOworICAgIGludCBjZW50ZXJlZFBvcyA9IHdpZHRoIC8gMiAtIChyaWdodCAtIGxlZnQpIC8gMjsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCBjZW50ZXJlZFBvcywgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKworICAgIGNvbnN0IGNoYXIqIHRleHQgPSAiQ2VudGVyZWQgVGV4dCBTYW1wbGUiOworICAgIHJzZ01lYXN1cmVUZXh0KHRleHQsICZsZWZ0LCAmcmlnaHQsICZ0b3AsICZib3R0b20pOworICAgIGNlbnRlcmVkUG9zID0gd2lkdGggLyAyIC0gKHJpZ2h0IC0gbGVmdCkgLyAyOworICAgIHJzZ0RyYXdUZXh0KHRleHQsIGNlbnRlcmVkUG9zLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworCisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTYW5zKTsKKyAgICB0ZXh0ID0gIk1vcmUgQ2VudGVyZWQgVGV4dCBTYW1wbGVzIjsKKyAgICByc2dNZWFzdXJlVGV4dCh0ZXh0LCAmbGVmdCwgJnJpZ2h0LCAmdG9wLCAmYm90dG9tKTsKKyAgICBjZW50ZXJlZFBvcyA9IHdpZHRoIC8gMiAtIChyaWdodCAtIGxlZnQpIC8gMjsKKyAgICByc2dEcmF3VGV4dCh0ZXh0LCBjZW50ZXJlZFBvcywgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKworICAgIC8vIE5vdyBkcmF3IGJvdHRvbSBhbmQgdG9wIHJpZ2h0IGFsaWduZWQgdGV4dAorICAgIHRleHQgPSAiVG9wLXJpZ2h0IGFsaWduZWQgdGV4dCI7CisgICAgcnNnTWVhc3VyZVRleHQodGV4dCwgJmxlZnQsICZyaWdodCwgJnRvcCwgJmJvdHRvbSk7CisgICAgcnNnRHJhd1RleHQodGV4dCwgd2lkdGggLSByaWdodCwgdG9wKTsKKworICAgIHRleHQgPSAiVG9wLWxlZnQiOworICAgIHJzZ01lYXN1cmVUZXh0KHRleHQsICZsZWZ0LCAmcmlnaHQsICZ0b3AsICZib3R0b20pOworICAgIHJzZ0RyYXdUZXh0KHRleHQsIC1sZWZ0LCB0b3ApOworCisgICAgdGV4dCA9ICJCb3R0b20tcmlnaHQgYWxpZ25lZCB0ZXh0IjsKKyAgICByc2dNZWFzdXJlVGV4dCh0ZXh0LCAmbGVmdCwgJnJpZ2h0LCAmdG9wLCAmYm90dG9tKTsKKyAgICByc2dEcmF3VGV4dCh0ZXh0LCB3aWR0aCAtIHJpZ2h0LCBoZWlnaHQgKyBib3R0b20pOworCit9CisKK3ZvaWQgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpIHsKKyAgICAvLyBEZWZhdWx0IHZlcnRleCBzYWhkZXIKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgLy8gU2V0dXAgdGhlIHByb2plY3Rpb25pIG1hdHJpeAorICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIHJzTWF0cml4TG9hZE9ydGhvKCZwcm9qLCAwLCByc2dHZXRXaWR0aCgpLCByc2dHZXRIZWlnaHQoKSwgMCwgLTUwMCwgNTAwKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoJnByb2opOworfQorCit2b2lkIGRpc3BsYXlTaGFkZXJTYW1wbGVzKCkgeworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleE9wYXF1ZSk7CisKKyAgICBmbG9hdCBzdGFydFggPSAwLCBzdGFydFkgPSAwOworICAgIGZsb2F0IHdpZHRoID0gMjU2LCBoZWlnaHQgPSAyNTY7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLCAwKTsKKworICAgIHN0YXJ0WCA9IDIwMDsgc3RhcnRZID0gMDsKKyAgICB3aWR0aCA9IDEyODsgaGVpZ2h0ID0gMTI4OworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMSwgMCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZEFscGhhKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleFRyYW5zcGFyZW50KTsKKyAgICBzdGFydFggPSAwOyBzdGFydFkgPSAyMDA7CisgICAgd2lkdGggPSAxMjg7IGhlaWdodCA9IDEyODsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEsIDApOworCisgICAgLy8gRnJhZ21lbnQgcHJvZ3JhbSB3aXRoIHNpbXBsZSBjb2xvcgorICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudENvbG9yKTsKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwgMC45LCAwLjMsIDAuMywgMSk7CisgICAgcnNnRHJhd1JlY3QoMjAwLCAzMDAsIDM1MCwgNDUwLCAwKTsKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwgMC4zLCAwLjksIDAuMywgMSk7CisgICAgcnNnRHJhd1JlY3QoNTAsIDQwMCwgNDAwLCA2MDAsIDApOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIlRleHR1cmUgc2hhZGVyIiwgMTAsIDUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWxwaGEtYmxlbmRlZCB0ZXh0dXJlIHNoYWRlciIsIDEwLCAyODApOworICAgIHJzZ0RyYXdUZXh0KCJGbGF0IGNvbG9yIHNoYWRlciIsIDEwMCwgNDUwKTsKK30KKwordm9pZCBkaXNwbGF5QmxlbmRpbmdTYW1wbGVzKCkgeworICAgIGludCBpOworCisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJm1hdHJpeCk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudENvbG9yKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSArKykgeworICAgICAgICBmbG9hdCBpUGx1c09uZSA9IChmbG9hdCkoaSArIDEpOworICAgICAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjFmKmlQbHVzT25lLCAwLjJmKmlQbHVzT25lLCAwLjNmKmlQbHVzT25lLCAxKTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgwLCB5UG9zLCAyMDAsIHlQb3MgKyAyMDAsIDApOworICAgIH0KKworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kQWxwaGEpOworICAgIGZvcihpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgZmxvYXQgaVBsdXNPbmUgPSAoZmxvYXQpKGkgKyAxKTsKKyAgICAgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yZippUGx1c09uZSwgMC4zZippUGx1c09uZSwgMC4xZippUGx1c09uZSwgMC41KTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgxNTAsIHlQb3MsIDM1MCwgeVBvcyArIDIwMCwgMCk7CisgICAgfQorCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmRBZGQpOworICAgIGZvcihpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgZmxvYXQgaVBsdXNPbmUgPSAoZmxvYXQpKGkgKyAxKTsKKyAgICAgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zZippUGx1c09uZSwgMC4xZippUGx1c09uZSwgMC4yZippUGx1c09uZSwgMC41KTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgzMDAsIHlQb3MsIDUwMCwgeVBvcyArIDIwMCwgMCk7CisgICAgfQorCisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiTm8gQmxlbmRpbmciLCAxMCwgNTApOworICAgIHJzZ0RyYXdUZXh0KCJBbHBoYSBCbGVuZGluZyIsIDE2MCwgMTUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWRkaXRpdmUgQmxlbmRpbmciLCAzMjAsIDI1MCk7CisKK30KKwordm9pZCBkaXNwbGF5TWVzaFNhbXBsZXMoKSB7CisKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm1hdHJpeCwgMTI4LCAxMjgsIDApOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleE9wYXF1ZSk7CisKKyAgICByc2dEcmF3TWVzaChnTWJ5Tk1lc2gpOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIlVzZXIgZ2VuIDEwIGJ5IDEwIGdyaWQgbWVzaCIsIDEwLCAyNTApOworfQorCit2b2lkIGRpc3BsYXlUZXh0dXJlU2FtcGxlcnMoKSB7CisKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhPcGFxdWUpOworCisgICAgLy8gTGluZWFyIGNsYW1wCisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgZmxvYXQgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKKyAgICBmbG9hdCB3aWR0aCA9IDMwMCwgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS4xLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS4xLCAwKTsKKworICAgIC8vIExpbmVhciBXcmFwCisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJXcmFwKTsKKyAgICBzdGFydFggPSAwOyBzdGFydFkgPSAzMDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuMSwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuMSwgMCk7CisKKyAgICAvLyBOZWFyZXN0CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdOZWFyZXN0Q2xhbXApOworICAgIHN0YXJ0WCA9IDMwMDsgc3RhcnRZID0gMDsKKyAgICB3aWR0aCA9IDMwMDsgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS4xLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS4xLCAwKTsKKworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTWlwTGluZWFyV3JhcCk7CisgICAgc3RhcnRYID0gMzAwOyBzdGFydFkgPSAzMDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS41LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuNSwgMS41LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuNSwgMCk7CisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBsaW5lYXIgY2xhbXAiLCAxMCwgMjkwKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBsaW5lYXIgd3JhcCIsIDEwLCA1OTApOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IG5lYXJlc3QgY2xhbXAiLCAzMTAsIDI5MCk7CisgICAgcnNnRHJhd1RleHQoIkZpbHRlcmluZzogbWlwbGluZWFyIHdyYXAiLCAzMTAsIDU5MCk7Cit9CisKK2Zsb2F0IGdUb3J1c1JvdGF0aW9uID0gMDsKKwordm9pZCBkaXNwbGF5Q3VsbGluZ1NhbXBsZXMoKSB7CisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1Byb2dWZXJ0ZXgpOworICAgIC8vIFNldHVwIHRoZSBwcm9qZWN0aW9uaSBtYXRyaXggd2l0aCA2MCBkZWdyZWUgZmllbGQgb2YgdmlldworICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIGZsb2F0IGFzcGVjdCA9IChmbG9hdClyc2dHZXRXaWR0aCgpIC8gKGZsb2F0KXJzZ0dldEhlaWdodCgpOworICAgIHJzTWF0cml4TG9hZFBlcnNwZWN0aXZlKCZwcm9qLCAzMC4wZiwgYXNwZWN0LCAwLjFmLCAxMDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeCgmcHJvaik7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudFRleHR1cmUpOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTGluZWFyQ2xhbXApOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnVGV4VG9ydXMpOworCisgICAgLy8gQXBsbHkgYSByb3RhdGlvbiB0byBvdXIgbWVzaAorICAgIGdUb3J1c1JvdGF0aW9uICs9IDUwLjBmICogZ0R0OworICAgIGlmKGdUb3J1c1JvdGF0aW9uID4gMzYwLjBmKSB7CisgICAgICAgIGdUb3J1c1JvdGF0aW9uIC09IDM2MC4wZjsKKyAgICB9CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIC0yLjBmLCAwLjBmLCAtMTAuMGYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworICAgIC8vIFVzZSBmcm9udCBmYWNlIGN1bGxpbmcKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3RlcihnQ3VsbEZyb250KTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmbWF0cml4LCAyLjBmLCAwLjBmLCAtMTAuMGYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworICAgIC8vIFVzZSBiYWNrIGZhY2UgY3VsbGluZworICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKGdDdWxsQmFjayk7CisgICAgcnNnRHJhd01lc2goZ1RvcnVzTWVzaCk7CisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiRGlzcGxheWluZyBtZXNoIGZyb250L2JhY2sgZmFjZSBjdWxsaW5nIiwgMTAsIHJzZ0dldEhlaWdodCgpIC0gMTApOworfQorCitmbG9hdCBnTGlnaHQwUm90YXRpb24gPSAwOworZmxvYXQgZ0xpZ2h0MVJvdGF0aW9uID0gMDsKKwordm9pZCBzZXR1cEN1c3RvbVNoYWRlckxpZ2h0cygpIHsKKyAgICBmbG9hdDQgbGlnaHQwUG9zID0gey01LjBmLCA1LjBmLCAtMTAuMGYsIDEuMGZ9OworICAgIGZsb2F0NCBsaWdodDFQb3MgPSB7Mi4wZiwgNS4wZiwgMTUuMGYsIDEuMGZ9OworICAgIGZsb2F0MyBsaWdodDBEaWZmQ29sID0gezAuOWYsIDAuN2YsIDAuN2Z9OworICAgIGZsb2F0MyBsaWdodDBTcGVjQ29sID0gezAuOWYsIDAuNmYsIDAuNmZ9OworICAgIGZsb2F0MyBsaWdodDFEaWZmQ29sID0gezAuNWYsIDAuNWYsIDAuOWZ9OworICAgIGZsb2F0MyBsaWdodDFTcGVjQ29sID0gezAuNWYsIDAuNWYsIDAuOWZ9OworCisgICAgZ0xpZ2h0MFJvdGF0aW9uICs9IDUwLjBmICogZ0R0OworICAgIGlmKGdMaWdodDBSb3RhdGlvbiA+IDM2MC4wZikgeworICAgICAgICBnTGlnaHQwUm90YXRpb24gLT0gMzYwLjBmOworICAgIH0KKyAgICBnTGlnaHQxUm90YXRpb24gLT0gNTAuMGYgKiBnRHQ7CisgICAgaWYoZ0xpZ2h0MVJvdGF0aW9uID4gMzYwLjBmKSB7CisgICAgICAgIGdMaWdodDFSb3RhdGlvbiAtPSAzNjAuMGY7CisgICAgfQorCisgICAgcnNfbWF0cml4NHg0IGwwTWF0OworICAgIHJzTWF0cml4TG9hZFJvdGF0ZSgmbDBNYXQsIGdMaWdodDBSb3RhdGlvbiwgMS4wZiwgMC4wZiwgMC4wZik7CisgICAgbGlnaHQwUG9zID0gcnNNYXRyaXhNdWx0aXBseSgmbDBNYXQsIGxpZ2h0MFBvcyk7CisgICAgcnNfbWF0cml4NHg0IGwxTWF0OworICAgIHJzTWF0cml4TG9hZFJvdGF0ZSgmbDFNYXQsIGdMaWdodDFSb3RhdGlvbiwgMC4wZiwgMC4wZiwgMS4wZik7CisgICAgbGlnaHQxUG9zID0gcnNNYXRyaXhNdWx0aXBseSgmbDFNYXQsIGxpZ2h0MVBvcyk7CisKKyAgICAvLyBTZXQgbGlnaHQgMCBwcm9wZXJ0aWVzCisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfUG9zaXNpb24ueCA9IGxpZ2h0MFBvcy54OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQwX1Bvc2lzaW9uLnkgPSBsaWdodDBQb3MueTsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9Qb3Npc2lvbi56ID0gbGlnaHQwUG9zLno7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfRGlmZnVzZSA9IDEuMGY7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfU3BlY3VsYXIgPSAwLjVmOworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQwX0Nvc2luZVBvd2VyID0gNDAuMGY7CisgICAgLy8gU2V0IGxpZ2h0IDEgcHJvcGVydGllcworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX1Bvc2lzaW9uLnggPSBsaWdodDFQb3MueDsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MV9Qb3Npc2lvbi55ID0gbGlnaHQxUG9zLnk7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfUG9zaXNpb24ueiA9IGxpZ2h0MVBvcy56OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX0RpZmZ1c2UgPSAxLjBmOworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX1NwZWN1bGFyID0gMC43ZjsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MV9Db3NpbmVQb3dlciA9IDUwLjBmOworICAgIHJzQWxsb2NhdGlvbk1hcmtEaXJ0eShyc0dldEFsbG9jYXRpb24oZ1ZTQ29uc3RhbnRzKSk7CisKKyAgICAvLyBVcGRhdGUgZnJhZ21ldG4gc2hhZGVyIGNvbnN0YW50cworICAgIC8vIFNldCBsaWdodCAwIGNvbG9ycworICAgIGdGU0NvbnN0YW50cy0+bGlnaHQwX0RpZmZ1c2VDb2xvciA9IGxpZ2h0MERpZmZDb2w7CisgICAgZ0ZTQ29uc3RhbnRzLT5saWdodDBfU3BlY3VsYXJDb2xvciA9IGxpZ2h0MFNwZWNDb2w7CisgICAgLy8gU2V0IGxpZ2h0IDEgY29sb3JzCisgICAgZ0ZTQ29uc3RhbnRzLT5saWdodDFfRGlmZnVzZUNvbG9yID0gbGlnaHQxRGlmZkNvbDsKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MV9TcGVjdWxhckNvbG9yID0gbGlnaHQxU3BlY0NvbDsKKyAgICByc0FsbG9jYXRpb25NYXJrRGlydHkocnNHZXRBbGxvY2F0aW9uKGdGU0NvbnN0YW50cykpOworfQorCit2b2lkIGRpc3BsYXlDdXN0b21TaGFkZXJTYW1wbGVzKCkgeworCisgICAgLy8gVXBkYXRlIHZlcnRleCBzaGFkZXIgY29uc3RhbnRzCisgICAgLy8gTG9hZCBtb2RlbCBtYXRyaXgKKyAgICAvLyBBcGxseSBhIHJvdGF0aW9uIHRvIG91ciBtZXNoCisgICAgZ1RvcnVzUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYoZ1RvcnVzUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ1RvcnVzUm90YXRpb24gLT0gMzYwLjBmOworICAgIH0KKworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZnVlNDb25zdGFudHMtPm1vZGVsLCAwLjBmLCAwLjBmLCAtMTAuMGYpOworICAgIHJzTWF0cml4Um90YXRlKCZnVlNDb25zdGFudHMtPm1vZGVsLCBnVG9ydXNSb3RhdGlvbiwgMS4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIGdUb3J1c1JvdGF0aW9uLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICAvLyBTZXR1cCB0aGUgcHJvamVjdGlvbmkgbWF0cml4CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJmdWU0NvbnN0YW50cy0+cHJvaiwgMzAuMGYsIGFzcGVjdCwgMC4xZiwgMTAwLjBmKTsKKyAgICBzZXR1cEN1c3RvbVNoYWRlckxpZ2h0cygpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1Byb2dWZXJ0ZXhDdXN0b20pOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZURlcHRoKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRDdXN0b20pOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRDdXN0b20sIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudEN1c3RvbSwgMCwgZ1RleFRvcnVzKTsKKworICAgIC8vIFVzZSBiYWNrIGZhY2UgY3VsbGluZworICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKGdDdWxsQmFjayk7CisgICAgcnNnRHJhd01lc2goZ1RvcnVzTWVzaCk7CisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiQ3VzdG9tIHNoYWRlciBzYW1wbGUiLCAxMCwgcnNnR2V0SGVpZ2h0KCkgLSAxMCk7Cit9CisKK3ZvaWQgZGlzcGxheU11bHRpdGV4dHVyZVNhbXBsZSgpIHsKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50TXVsdGl0ZXgpOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRNdWx0aXRleCwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50TXVsdGl0ZXgsIDEsIGdMaW5lYXJXcmFwKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50TXVsdGl0ZXgsIDIsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudE11bHRpdGV4LCAwLCBnVGV4Q2hlY2tlcik7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudE11bHRpdGV4LCAxLCBnVGV4VG9ydXMpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRNdWx0aXRleCwgMiwgZ1RleFRyYW5zcGFyZW50KTsKKworICAgIGZsb2F0IHN0YXJ0WCA9IDAsIHN0YXJ0WSA9IDA7CisgICAgZmxvYXQgd2lkdGggPSAyNTYsIGhlaWdodCA9IDI1NjsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEsIDApOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIkN1c3RvbSBzaGFkZXIgd2l0aCBtdWx0aXRleHR1cmluZyIsIDEwLCAyODApOworfQorCitmbG9hdCBnQW5pc29UaW1lID0gMC4wZjsKK3VpbnQgYW5pc29Nb2RlID0gMDsKK3ZvaWQgZGlzcGxheUFuaXNvU2FtcGxlKCkgeworCisgICAgZ0FuaXNvVGltZSArPSBnRHQ7CisKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIDAuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgLTgwLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxOb25lKTsKKworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnVGV4Q2hlY2tlcik7CisKKyAgICBpZihnQW5pc29UaW1lID49IDUuMGYpIHsKKyAgICAgICAgZ0FuaXNvVGltZSA9IDAuMGY7CisgICAgICAgIGFuaXNvTW9kZSArKzsKKyAgICAgICAgYW5pc29Nb2RlID0gYW5pc29Nb2RlICUgMzsKKyAgICB9CisKKyAgICBpZihhbmlzb01vZGUgPT0gMCkgeworICAgICAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ01pcExpbmVhckFuaXNvOCk7CisgICAgfQorICAgIGVsc2UgaWYoYW5pc29Nb2RlID09IDEpIHsKKyAgICAgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdNaXBMaW5lYXJBbmlzbzE1KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTWlwTGluZWFyV3JhcCk7CisgICAgfQorCisgICAgZmxvYXQgc3RhcnRYID0gLTE1OworICAgIGZsb2F0IHN0YXJ0WSA9IC0xNTsKKyAgICBmbG9hdCB3aWR0aCA9IDMwOworICAgIGZsb2F0IGhlaWdodCA9IDMwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxMCwgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMTAsIDApOworCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIGlmKGFuaXNvTW9kZSA9PSAwKSB7CisgICAgICAgIHJzZ0RyYXdUZXh0KCJBbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgOCIsIDEwLCA0MCk7CisgICAgfQorICAgIGVsc2UgaWYoYW5pc29Nb2RlID09IDEpIHsKKyAgICAgICAgcnNnRHJhd1RleHQoIkFuaXNvdHJvcGljIGZpbHRlcmluZyAxNSIsIDEwLCA0MCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc2dEcmF3VGV4dCgiTWlwbGluZWFyIGZpbHRlcmluZyIsIDEwLCA0MCk7CisgICAgfQorfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIGdEdCA9IHJzR2V0RHQoKTsKKworICAgIHJzZ0NsZWFyQ29sb3IoMC4yZiwgMC4yZiwgMC4yZiwgMC4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHN3aXRjaChnRGlzcGxheU1vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRpc3BsYXlGb250U2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRpc3BsYXlTaGFkZXJTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGlzcGxheUJsZW5kaW5nU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGRpc3BsYXlNZXNoU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGRpc3BsYXlUZXh0dXJlU2FtcGxlcnMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBkaXNwbGF5Q3VsbGluZ1NhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBkaXNwbGF5Q3VzdG9tU2hhZGVyU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIGRpc3BsYXlNdWx0aXRleHR1cmVTYW1wbGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICBkaXNwbGF5QW5pc29TYW1wbGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvc2hhZGVyX2RlZi5yc2ggYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9zaGFkZXJfZGVmLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Y2MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvc2hhZGVyX2RlZi5yc2gKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnNhbXBsZXMpCisKK3R5cGVkZWYgc3RydWN0IFZlcnRleFNoYWRlckNvbnN0YW50c19zIHsKKyAgICByc19tYXRyaXg0eDQgbW9kZWw7CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQzIGxpZ2h0MF9Qb3Npc2lvbjsKKyAgICBmbG9hdCBsaWdodDBfRGlmZnVzZTsKKyAgICBmbG9hdCBsaWdodDBfU3BlY3VsYXI7CisgICAgZmxvYXQgbGlnaHQwX0Nvc2luZVBvd2VyOworCisgICAgZmxvYXQzIGxpZ2h0MV9Qb3Npc2lvbjsKKyAgICBmbG9hdCBsaWdodDFfRGlmZnVzZTsKKyAgICBmbG9hdCBsaWdodDFfU3BlY3VsYXI7CisgICAgZmxvYXQgbGlnaHQxX0Nvc2luZVBvd2VyOworfSBWZXJ0ZXhTaGFkZXJDb25zdGFudHM7CisKK3R5cGVkZWYgc3RydWN0IEZyYWdlbnRTaGFkZXJDb25zdGFudHNfcyB7CisgICAgZmxvYXQzIGxpZ2h0MF9EaWZmdXNlQ29sb3I7CisgICAgZmxvYXQzIGxpZ2h0MF9TcGVjdWxhckNvbG9yOworCisgICAgZmxvYXQzIGxpZ2h0MV9EaWZmdXNlQ29sb3I7CisgICAgZmxvYXQzIGxpZ2h0MV9TcGVjdWxhckNvbG9yOworCit9IEZyYWdlbnRTaGFkZXJDb25zdGFudHM7CisKK3R5cGVkZWYgc3RydWN0IFZlcnRleFNoYWRlcklucHV0c19zIHsKKyAgICBmbG9hdDQgcG9zaXRpb247CisgICAgZmxvYXQzIG5vcm1hbDsKKyAgICBmbG9hdDIgdGV4dHVyZTA7Cit9IFZlcnRleFNoYWRlcklucHV0czsKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk5MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFJTVGVzdAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2MDM5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnJzLnRlc3QiPgorICAgIDxhcHBsaWNhdGlvbiAKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1JTX1Rlc3QiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Rlc3RfcGF0dGVybiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlJTVGVzdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZyBiL2xpYnMvcnMvamF2YS90ZXN0cy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QxNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3QuamF2YSBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY0NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFJTVGVzdCBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOworCisgICAgcHJpdmF0ZSBSU1Rlc3RWaWV3IG1WaWV3OworCisgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGxvb3BlciAoZnJvbSB5b3VyIEFjdGl2aXR5IFVJIHRocmVhZCBmb3IgaW5zdGFuY2UKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBSU1Rlc3RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGlmIChMT0dfRU5BQkxFRCkgeworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YSBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1ZGVhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCisKK3B1YmxpYyBjbGFzcyBSU1Rlc3RDb3JlIHsKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworCisgICAgcHVibGljIFJTVGVzdENvcmUoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKworICAgIHByaXZhdGUgRm9udCBtRm9udDsKKyAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MgbUxpc3RBbGxvY3M7CisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworICAgIHByaXZhdGUgU2NyaXB0Q19yc2xpc3QgbVNjcmlwdDsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0PFVuaXRUZXN0PiB1bml0VGVzdHM7CisgICAgcHJpdmF0ZSBMaXN0SXRlcmF0b3I8VW5pdFRlc3Q+IHRlc3RfaXRlcjsKKyAgICBwcml2YXRlIFVuaXRUZXN0IGFjdGl2ZVRlc3Q7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0b3BUZXN0aW5nOworCisgICAgLyogUGVyaW9kaWMgdGltZXIgZm9yIGVuc3VyaW5nIGZ1dHVyZSB0ZXN0cyBnZXQgc2NoZWR1bGVkICovCisgICAgcHJpdmF0ZSBUaW1lciBtVGltZXI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlNfVElNRVJfUEVSSU9EID0gMTAwOworCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgc3RvcFRlc3RpbmcgPSBmYWxzZTsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfcnNsaXN0KG1SUywgbVJlcywgUi5yYXcucnNsaXN0LCB0cnVlKTsKKworICAgICAgICB1bml0VGVzdHMgPSBuZXcgQXJyYXlMaXN0PFVuaXRUZXN0PigpOworCisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX3ByaW1pdGl2ZXModGhpcywgbVJlcykpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9mcF9tYWQodGhpcywgbVJlcykpOworICAgICAgICAvKgorICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVbml0VGVzdChudWxsLCAiPFBhc3M+IiwgMSkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVbml0VGVzdCgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVW5pdFRlc3QobnVsbCwgIjxGYWlsPiIsIC0xKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVbml0VGVzdChudWxsLCAiPFBhc3M+IiwgMSkpOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgVW5pdFRlc3QgW10gdXRhID0gbmV3IFVuaXRUZXN0W3VuaXRUZXN0cy5zaXplKCldOworICAgICAgICB1dGEgPSB1bml0VGVzdHMudG9BcnJheSh1dGEpOworCisgICAgICAgIG1MaXN0QWxsb2NzID0gbmV3IFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyhtUlMsIHV0YS5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHV0YS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gbGlzdEVsZW0gPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0oKTsKKyAgICAgICAgICAgIGxpc3RFbGVtLnRleHQgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21TdHJpbmcobVJTLCB1dGFbaV0ubmFtZSk7CisgICAgICAgICAgICBsaXN0RWxlbS5yZXN1bHQgPSB1dGFbaV0ucmVzdWx0OworICAgICAgICAgICAgbUxpc3RBbGxvY3Muc2V0KGxpc3RFbGVtLCBpLCBmYWxzZSk7CisgICAgICAgICAgICB1dGFbaV0uc2V0SXRlbShsaXN0RWxlbSk7CisgICAgICAgIH0KKworICAgICAgICBtTGlzdEFsbG9jcy5jb3B5QWxsKCk7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dMaXN0KG1MaXN0QWxsb2NzKTsKKworICAgICAgICBtRm9udCA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuQk9MRCwgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250KG1Gb250KTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworCisgICAgICAgIHRlc3RfaXRlciA9IHVuaXRUZXN0cy5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgcmVmcmVzaFRlc3RSZXN1bHRzKCk7IC8qIEtpY2sgb2ZmIHRoZSBmaXJzdCB0ZXN0ICovCisKKyAgICAgICAgVGltZXJUYXNrIHBUYXNrID0gbmV3IFRpbWVyVGFzaygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgbVRpbWVyLnNjaGVkdWxlKHBUYXNrLCBSU19USU1FUl9QRVJJT0QsIFJTX1RJTUVSX1BFUklPRCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tBbmRSdW5OZXh0VGVzdCgpIHsKKyAgICAgICAgaWYgKGFjdGl2ZVRlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFhY3RpdmVUZXN0LmlzQWxpdmUoKSkgeworICAgICAgICAgICAgICAgIC8qIFByb3Blcmx5IGNsZWFuIHVwIG9uIG91ciBsYXN0IHRlc3QgKi8KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUZXN0LmpvaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWN0aXZlVGVzdCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0b3BUZXN0aW5nICYmIGFjdGl2ZVRlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRlc3RfaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVUZXN0ID0gdGVzdF9pdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBhY3RpdmVUZXN0LnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgLyogVGhpcyByb3V0aW5lIHdpbGwgb25seSBnZXQgY2FsbGVkIG9uY2Ugd2hlbiBhIG5ldyB0ZXN0CisgICAgICAgICAgICAgICAgICogc2hvdWxkIHN0YXJ0IHJ1bm5pbmcuIFRoZSBtZXNzYWdlIGhhbmRsZXIgaW4gVW5pdFRlc3QuamF2YQorICAgICAgICAgICAgICAgICAqIGVuc3VyZXMgdGhpcy4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtVGltZXIuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lci5wdXJnZSgpOworICAgICAgICAgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hUZXN0UmVzdWx0cygpIHsKKyAgICAgICAgY2hlY2tBbmRSdW5OZXh0VGVzdCgpOworCisgICAgICAgIGlmIChtTGlzdEFsbG9jcyAhPSBudWxsICYmIG1TY3JpcHQgIT0gbnVsbCAmJiBtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RBbGxvY3MuY29weUFsbCgpOworCisgICAgICAgICAgICBtU2NyaXB0LmJpbmRfZ0xpc3QobUxpc3RBbGxvY3MpOworICAgICAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7CisgICAgICAgIHN0b3BUZXN0aW5nID0gdHJ1ZTsKKyAgICAgICAgVW5pdFRlc3QgdCA9IGFjdGl2ZVRlc3Q7CisKKyAgICAgICAgLyogU3RvcCBwZXJpb2RpYyByZWZyZXNoIG9mIHRlc3RpbmcgKi8KKyAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZXIuY2FuY2VsKCk7CisgICAgICAgICAgICBtVGltZXIucHVyZ2UoKTsKKyAgICAgICAgICAgIG1UaW1lciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiBXYWl0IHRvIGV4aXQgdW50aWwgd2UgZmluaXNoIHRoZSBjdXJyZW50IHRlc3QgKi8KKyAgICAgICAgaWYgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBwcmVzc3VyZSwgaW50IGlkKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Eb3duKGludCB4LCBpbnQgeSkgeworICAgICAgICBtU2NyaXB0LnNldF9nRFkoMC4wZik7CisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgICAgIHJlZnJlc2hUZXN0UmVzdWx0cygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uTW92ZShpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaW50IGR5ID0gbUxhc3RZIC0geTsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZHkpIDw9IDIpIHsKKyAgICAgICAgICAgIGR5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dEWShkeSk7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICAgICAgcmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxMWQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RWaWV3LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdDsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBSU1Rlc3RWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgUlNUZXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgUlNUZXN0Q29yZSBtUmVuZGVyOworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KGZhbHNlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgUlNUZXN0Q29yZSgpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVuZGVyLmNsZWFudXAoKTsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhY3QgPT0gZXYuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Nb3ZlKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2ZwX21hZC5qYXZhIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2ZwX21hZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTdlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZnBfbWFkLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CisKK3B1YmxpYyBjbGFzcyBVVF9mcF9tYWQgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9mcF9tYWQoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJGcF9NYWQiKTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKCk7CisgICAgICAgIFNjcmlwdENfZnBfbWFkIHMgPSBuZXcgU2NyaXB0Q19mcF9tYWQocFJTLCBtUmVzLCBSLnJhdy5mcF9tYWQsIHRydWUpOworICAgICAgICBwUlMubU1lc3NhZ2VDYWxsYmFjayA9IG1Sc01lc3NhZ2U7CisgICAgICAgIHMuaW52b2tlX2ZwX21hZF90ZXN0KDAsIDApOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcHJpbWl0aXZlcy5qYXZhIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3ByaW1pdGl2ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjM1NWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3ByaW1pdGl2ZXMuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX3ByaW1pdGl2ZXMgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9wcmltaXRpdmVzKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcykgeworICAgICAgICBzdXBlcihyc3RjLCAiUHJpbWl0aXZlcyIpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUoKTsKKyAgICAgICAgU2NyaXB0Q19wcmltaXRpdmVzIHMgPSBuZXcgU2NyaXB0Q19wcmltaXRpdmVzKHBSUywgbVJlcywgUi5yYXcucHJpbWl0aXZlcywgdHJ1ZSk7CisgICAgICAgIHBSUy5tTWVzc2FnZUNhbGxiYWNrID0gbVJzTWVzc2FnZTsKKyAgICAgICAgcy5pbnZva2VfcHJpbWl0aXZlc190ZXN0KDAsIDApOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVW5pdFRlc3QuamF2YSBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9Vbml0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZDg4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVW5pdFRlc3QuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUlNNZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBVbml0VGVzdCBleHRlbmRzIFRocmVhZCB7CisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBpbnQgcmVzdWx0OworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gbUl0ZW07CisgICAgcHJpdmF0ZSBSU1Rlc3RDb3JlIG1SU1RDOworICAgIHByaXZhdGUgYm9vbGVhbiBtc2dIYW5kbGVkOworCisgICAgLyogVGhlc2UgY29uc3RhbnRzIG11c3QgbWF0Y2ggdGhvc2UgaW4gc2hhcmVkLnJzaCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJTX01TR19URVNUX1BBU1NFRCA9IDEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSU19NU0dfVEVTVF9GQUlMRUQgPSAxMDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbnVtVGVzdHMgPSAwOworICAgIHB1YmxpYyBpbnQgdGVzdElEOworCisgICAgcHJvdGVjdGVkIFVuaXRUZXN0KFJTVGVzdENvcmUgcnN0YywgU3RyaW5nIG4sIGludCBpbml0UmVzdWx0KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIG1SU1RDID0gcnN0YzsKKyAgICAgICAgbmFtZSA9IG47CisgICAgICAgIG1zZ0hhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgcmVzdWx0ID0gaW5pdFJlc3VsdDsKKyAgICAgICAgdGVzdElEID0gbnVtVGVzdHMrKzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVW5pdFRlc3QoUlNUZXN0Q29yZSByc3RjLCBTdHJpbmcgbikgeworICAgICAgICB0aGlzKHJzdGMsIG4sIDApOworICAgIH0KKworICAgIHByb3RlY3RlZCBVbml0VGVzdChSU1Rlc3RDb3JlIHJzdGMpIHsKKyAgICAgICAgdGhpcyAocnN0YywgIjxVbmtub3duPiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBVbml0VGVzdCgpIHsKKyAgICAgICAgdGhpcyAobnVsbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJTTWVzc2FnZSBtUnNNZXNzYWdlID0gbmV3IFJTTWVzc2FnZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgc3dpdGNoIChtSUQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJTX01TR19URVNUX1BBU1NFRDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSU19NU0dfVEVTVF9GQUlMRUQ6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIlJlbmRlclNjcmlwdCIsICJVbml0IHRlc3QgZ290IHVuZXhwZWN0ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUl0ZW0ucmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgICAgIG1zZ0hhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1SU1RDLnJlZnJlc2hUZXN0UmVzdWx0cygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlIHRoZSBjYXNlIHdoZXJlIG91ciBtZXNzYWdlIHJlY2VpdmVyIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgbGVhdmUgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBpdCBmaW5pc2hlcyBydW5uaW5nIGFsbCBvZiB0aGUgdW5pdCB0ZXN0cy4gKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHZvaWQgd2FpdEZvck1lc3NhZ2UoKSB7CisgICAgICAgIHdoaWxlICghbXNnSGFuZGxlZCkgeworICAgICAgICAgICAgeWllbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEl0ZW0oU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gaXRlbSkgeworICAgICAgICBtSXRlbSA9IGl0ZW07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAvKiBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBmb3IgZWFjaCBzdWJjbGFzcyAqLworICAgICAgICBpZiAobVJTVEMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTVEMucmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NmZhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzCkBAIC0wLDAgKzEsMTc1IEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworY29uc3QgaW50IFRFU1RfQ09VTlQgPSAxOworCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGZwX21hZF90ZXN0KQorCitzdGF0aWMgZmxvYXQgZGF0YV9mMVsxMDI1XTsKK3N0YXRpYyBmbG9hdDQgZGF0YV9mNFsxMDI1XTsKKworc3RhdGljIHZvaWQgdGVzdF9tYWQ0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MSBiaWxsaW9uIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqICgxMDAwIC8gODApOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gKGRhdGFfZjRbaV0gKiAwLjAyZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSsxXSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzJdICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krM10gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzRdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs1XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNl0gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzddICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krOF0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs5XSAqIDAuMDJmICsgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX21hZDQgTSBvcHMiLCAxMDAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9tYWQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xIGJpbGxpb24gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogKDEwMDAgLyAyMCk7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSAoZGF0YV9mMVtpXSAqIDAuMDJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzFdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krMl0gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSszXSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNF0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzVdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs2XSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krN10gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs4XSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzldICogMC4wMmYgKyAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbWFkIE0gb3BzIiwgMTAwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfbm9ybSh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBub3JtYWxpemUoZGF0YV9mNFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9ub3JtIE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NpbmNvczQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwIC8gNDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IHNpbihkYXRhX2Y0W2ldKSAqIGNvcyhkYXRhX2Y0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvczQgTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2luY29zKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IHNpbihkYXRhX2YxW2ldKSAqIGNvcyhkYXRhX2YxW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvcyBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jbGFtcCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gY2xhbXAoZGF0YV9mMVtpXSwgLTEuZiwgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wIE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKKworICAgIHN0YXJ0KCk7CisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoY3Q9MDsgY3QgPCAxMDAwICogMTAwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YV9mMVtpXSA8IC0xLmYpIGRhdGFfZjFbaV0gPSAtMS5mOworICAgICAgICAgICAgaWYgKGRhdGFfZjFbaV0gPiAtMS5mKSBkYXRhX2YxW2ldID0gMS5mOworICAgICAgICB9CisgICAgfQorCisgICAgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXAgcmVmIE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jbGFtcDQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMDAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDAgLzQ7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBjbGFtcChkYXRhX2Y0W2ldLCAtMS5mLCAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXA0IE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKK30KKwordm9pZCBmcF9tYWRfdGVzdCh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgZm9yIChpbnQgeD0wOyB4IDwgMTAyNTsgeCsrKSB7CisgICAgICAgIGRhdGFfZjFbeF0gPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnggPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnkgPSAoeCAmIDB4ZjApICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS56ID0gKHggJiAweDMzKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0udyA9ICh4ICYgMHg3NykgKiAwLjFmOworICAgIH0KKworICAgIHRlc3RfbWFkNChpbmRleCk7CisgICAgdGVzdF9tYWQoaW5kZXgpOworCisgICAgZm9yICh4PTA7IHggPCAxMDI1OyB4KyspIHsKKyAgICAgICAgZGF0YV9mMVt4XSA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueCA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueSA9ICh4ICYgMHhmMCkgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLnogPSAoeCAmIDB4MzMpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS53ID0gKHggJiAweDc3KSAqIDAuMWYgKyAxLmY7CisgICAgfQorCisgICAgdGVzdF9ub3JtKGluZGV4KTsKKyAgICB0ZXN0X3NpbmNvczQoaW5kZXgpOworICAgIHRlc3Rfc2luY29zKGluZGV4KTsKKyAgICB0ZXN0X2NsYW1wNChpbmRleCk7CisgICAgdGVzdF9jbGFtcChpbmRleCk7CisKKyAgICAvLyBUT0RPIEFjdHVhbGx5IHZlcmlmeSB0ZXN0IHJlc3VsdCBhY2N1cmFjeQorICAgIHJzRGVidWcoImZwX21hZF90ZXN0IFBBU1NFRCIsIDApOworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcHJpbWl0aXZlcy5ycyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9wcmltaXRpdmVzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGRjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcHJpbWl0aXZlcy5ycwpAQCAtMCwwICsxLDU5IEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworI3ByYWdtYSBycyBleHBvcnRfZnVuYyhwcmltaXRpdmVzX3Rlc3QpCisKKy8vIFRlc3RpbmcgcHJpbWl0aXZlIHR5cGVzCitmbG9hdCBmbG9hdFRlc3QgPSAxLjk5ZjsKK2RvdWJsZSBkb3VibGVUZXN0ID0gMi4wNTsKK2NoYXIgY2hhclRlc3QgPSAtODsKK3Nob3J0IHNob3J0VGVzdCA9IC0xNjsKK2ludCBpbnRUZXN0ID0gLTMyOworbG9uZyBsb25nVGVzdCA9IDE3MTc5ODY5MTg0bDsgLy8gMSA8PCAzNAorbG9uZyBsb25nIGxvbmdsb25nVGVzdCA9IDY4NzE5NDc2NzM2bDsgLy8gMSA8PCAzNgorCit1Y2hhciB1Y2hhclRlc3QgPSA4OwordXNob3J0IHVzaG9ydFRlc3QgPSAxNjsKK3VpbnQgdWludFRlc3QgPSAzMjsKK2ludDY0X3QgaW50NjRfdFRlc3QgPSAtMTcxNzk4NjkxODRsOyAvLyAtIDEgPDwgMzQKKworc3RhdGljIGJvb2wgdGVzdF9wcmltaXRpdmVfdHlwZXModWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIHN0YXJ0KCk7CisKKyAgICBfUlNfQVNTRVJUKGZsb2F0VGVzdCA9PSAxLjk5Zik7CisgICAgX1JTX0FTU0VSVChkb3VibGVUZXN0ID09IDIuMDUpOworICAgIF9SU19BU1NFUlQoY2hhclRlc3QgPT0gLTgpOworICAgIF9SU19BU1NFUlQoc2hvcnRUZXN0ID09IC0xNik7CisgICAgX1JTX0FTU0VSVChpbnRUZXN0ID09IC0zMik7CisgICAgX1JTX0FTU0VSVChsb25nVGVzdCA9PSAxNzE3OTg2OTE4NGwpOworICAgIF9SU19BU1NFUlQobG9uZ2xvbmdUZXN0ID09IDY4NzE5NDc2NzM2bCk7CisKKyAgICBfUlNfQVNTRVJUKHVjaGFyVGVzdCA9PSA4KTsKKyAgICBfUlNfQVNTRVJUKHVzaG9ydFRlc3QgPT0gMTYpOworICAgIF9SU19BU1NFUlQodWludFRlc3QgPT0gMzIpOworICAgIF9SU19BU1NFUlQoaW50NjRfdFRlc3QgPT0gLTE3MTc5ODY5MTg0bCk7CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9wcmltaXRpdmVzIEZBSUxFRCIsIHRpbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9wcmltaXRpdmVzIFBBU1NFRCIsIHRpbWUpOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3ZvaWQgcHJpbWl0aXZlc190ZXN0KHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGZhaWxlZCB8PSB0ZXN0X3ByaW1pdGl2ZV90eXBlcyhpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2xpc3QucnMgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnNsaXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZDA2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnNsaXN0LnJzCkBAIC0wLDAgKzEsMTA3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworZmxvYXQgZ0RZOworCityc19mb250IGdGb250OworCit0eXBlZGVmIHN0cnVjdCBMaXN0QWxsb2NzX3MgeworICAgIHJzX2FsbG9jYXRpb24gdGV4dDsKKyAgICBpbnQgcmVzdWx0OworfSBMaXN0QWxsb2NzOworCitMaXN0QWxsb2NzICpnTGlzdDsKKwordm9pZCBpbml0KCkgeworICAgIGdEWSA9IDAuMGY7Cit9CisKK2ludCB0ZXh0UG9zID0gMDsKKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICByc2dDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICB0ZXh0UG9zIC09IChpbnQpZ0RZKjI7CisgICAgZ0RZICo9IDAuOTU7CisKKyAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnQpOworICAgIGNvbG9yKDAuMiwgMC4yLCAwLjIsIDApOworCisgICAgcnNfYWxsb2NhdGlvbiBsaXN0QWxsb2MgPSByc0dldEFsbG9jYXRpb24oZ0xpc3QpOworICAgIGludCBhbGxvY1NpemUgPSByc0FsbG9jYXRpb25HZXREaW1YKGxpc3RBbGxvYyk7CisKKyAgICBpbnQgd2lkdGggPSByc2dHZXRXaWR0aCgpOworICAgIGludCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKworICAgIGludCBpdGVtSGVpZ2h0ID0gODA7CisgICAgaW50IHRvdGFsSXRlbUhlaWdodCA9IGl0ZW1IZWlnaHQgKiBhbGxvY1NpemU7CisKKyAgICAvKiBQcmV2ZW50IHNjcm9sbGluZyBhYm92ZSB0aGUgdG9wIG9mIHRoZSBsaXN0ICovCisgICAgaW50IGZpcnN0SXRlbSA9IGhlaWdodCAtIHRvdGFsSXRlbUhlaWdodDsKKyAgICBpZiAoZmlyc3RJdGVtIDwgMCkgeworICAgICAgICBmaXJzdEl0ZW0gPSAwOworICAgIH0KKworICAgIC8qIFByZXZlbnQgc2Nyb2xsaW5nIHBhc3QgdGhlIGxhc3QgbGluZSBvZiB0aGUgbGlzdCAqLworICAgIGludCBsYXN0SXRlbSA9IC0xICogKHRvdGFsSXRlbUhlaWdodCAtIGhlaWdodCk7CisgICAgaWYgKGxhc3RJdGVtID4gMCkgeworICAgICAgICBsYXN0SXRlbSA9IDA7CisgICAgfQorCisgICAgaWYgKHRleHRQb3MgPiBmaXJzdEl0ZW0pIHsKKyAgICAgICAgdGV4dFBvcyA9IGZpcnN0SXRlbTsKKyAgICB9CisgICAgZWxzZSBpZiAodGV4dFBvcyA8IGxhc3RJdGVtKSB7CisgICAgICAgIHRleHRQb3MgPSBsYXN0SXRlbTsKKyAgICB9CisKKyAgICBpbnQgY3VycmVudFlQb3MgPSBpdGVtSGVpZ2h0ICsgdGV4dFBvczsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhbGxvY1NpemU7IGkgKyspIHsKKyAgICAgICAgaWYoY3VycmVudFlQb3MgLSBpdGVtSGVpZ2h0ID4gaGVpZ2h0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGN1cnJlbnRZUG9zID4gMCkgeworICAgICAgICAgICAgc3dpdGNoKGdMaXN0W2ldLnJlc3VsdCkgeworICAgICAgICAgICAgICAgIGNhc2UgMTogLyogUGFzc2VkICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjVmLCAwLjlmLCAwLjVmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLyogRmFpbGVkICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjVmLCAwLjVmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBTdGlsbCBUZXN0aW5nICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjlmLCAwLjVmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogVW5rbm93biAqLworICAgICAgICAgICAgICAgICAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnNnRHJhd1JlY3QoMCwgY3VycmVudFlQb3MgLSAxLCB3aWR0aCwgY3VycmVudFlQb3MsIDApOworICAgICAgICAgICAgcnNnRHJhd1RleHQoZ0xpc3RbaV0udGV4dCwgMzAsIGN1cnJlbnRZUG9zIC0gMzIpOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRZUG9zICs9IGl0ZW1IZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2ggYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3Qvc2hhcmVkLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJlOWFmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2gKQEAgLTAsMCArMSwzOCBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdCkKKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFJlc3VsdF9zIHsKKyAgICByc19hbGxvY2F0aW9uIG5hbWU7CisgICAgYm9vbCBwYXNzOworICAgIGZsb2F0IHNjb3JlOworICAgIGludDY0X3QgdGltZTsKK30gVGVzdFJlc3VsdDsKKy8vVGVzdFJlc3VsdCAqZ19yZXN1bHRzOworCitzdGF0aWMgaW50NjRfdCBnX3RpbWU7CisKK3N0YXRpYyB2b2lkIHN0YXJ0KHZvaWQpIHsKKyAgICBnX3RpbWUgPSByc1VwdGltZU1pbGxpcygpOworfQorCitzdGF0aWMgZmxvYXQgZW5kKHVpbnQzMl90IGlkeCkgeworICAgIGludDY0X3QgdCA9IHJzVXB0aW1lTWlsbGlzKCkgLSBnX3RpbWU7CisgICAgLy9nX3Jlc3VsdHNbaWR4XS50aW1lID0gdDsKKyAgICAvL3JzRGVidWcoInRlc3QgdGltZSIsIChpbnQpdCk7CisgICAgcmV0dXJuICgoZmxvYXQpdCkgLyAxMDAwLmY7Cit9CisKKyNkZWZpbmUgX1JTX0FTU0VSVChiKSBcCitkbyB7IFwKKyAgICBpZiAoIShiKSkgeyBcCisgICAgICAgIGZhaWxlZCA9IHRydWU7IFwKKyAgICAgICAgcnNEZWJ1ZygjYiAiIEZBSUxFRCIsIDApOyBcCisgICAgfSBcCitcCit9IHdoaWxlICgwKQorCisvKiBUaGVzZSBjb25zdGFudHMgbXVzdCBtYXRjaCB0aG9zZSBpbiBVbml0VGVzdC5qYXZhICovCitzdGF0aWMgY29uc3QgaW50IFJTX01TR19URVNUX1BBU1NFRCA9IDEwMDsKK3N0YXRpYyBjb25zdCBpbnQgUlNfTVNHX1RFU1RfRkFJTEVEID0gMTAxOworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM4M2JhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycwpAQCAtMCwwICsxLDIzIEBACisvLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdCkKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0IHsKKyAgICByc19hbGxvY2F0aW9uIG5hbWU7CisgICAgYm9vbCBwYXNzOworICAgIGZsb2F0IHNjb3JlOworfSBUZXN0UmVzdWx0X3Q7CitUZXN0UmVzdWx0X3QgKnJlc3VsdHM7CisKK2ludCByb290KCkgeworCisgICAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9ycy5zcGVjIGIvbGlicy9ycy9ycy5zcGVjCmluZGV4IDVhZThkMDEuLjBkYTYzN2UgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnMuc3BlYworKysgYi9saWJzL3JzL3JzLnNwZWMKQEAgLTEsMTEgKzEsMTQgQEAKIAorQ29udGV4dEZpbmlzaCB7CisJaGFuZGNvZGVBcGkKKwl9CiAKIENvbnRleHRCaW5kUm9vdFNjcmlwdCB7CiAJcGFyYW0gUnNTY3JpcHQgc2FtcGxlcgogCX0KIAotQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB7Ci0JcGFyYW0gUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSBwZ20KK0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIHsKKwlwYXJhbSBSc1Byb2dyYW1TdG9yZSBwZ20KIAl9CiAKIENvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IHsKQEAgLTIwLDYgKzIzLDEwIEBACiAJcGFyYW0gUnNQcm9ncmFtUmFzdGVyIHBnbQogCX0KIAorQ29udGV4dEJpbmRGb250IHsKKwlwYXJhbSBSc0ZvbnQgcGdtCisJfQorCiBDb250ZXh0UGF1c2UgewogCX0KIApAQCAtNTEsNiArNTgsMTEgQEAKIAlwYXJhbSBzaXplX3QgbGVuCiAJfQogCitHZXROYW1lIHsKKwlwYXJhbSB2b2lkICpvYmoKKwlwYXJhbSBjb25zdCBjaGFyICoqbmFtZQorCX0KKwogT2JqRGVzdHJveSB7CiAJcGFyYW0gdm9pZCAqb2JqCiAJfQpAQCAtNjgsOSArODAsMjMgQEAKIAlwYXJhbSBjb25zdCBSc0VsZW1lbnQgKiBlbGVtZW50cwogCXBhcmFtIGNvbnN0IGNoYXIgKiogbmFtZXMKIAlwYXJhbSBjb25zdCBzaXplX3QgKiBuYW1lTGVuZ3RocworCXBhcmFtIGNvbnN0IHVpbnQzMl90ICogYXJyYXlTaXplCiAJcmV0IFJzRWxlbWVudAogCX0KIAorRWxlbWVudEdldE5hdGl2ZURhdGEgeworCXBhcmFtIFJzRWxlbWVudCBlbGVtCisJcGFyYW0gdWludDMyX3QgKmVsZW1EYXRhCisJcGFyYW0gdWludDMyX3QgZWxlbURhdGFTaXplCisJfQorCitFbGVtZW50R2V0U3ViRWxlbWVudHMgeworCXBhcmFtIFJzRWxlbWVudCBlbGVtCisJcGFyYW0gdWludDMyX3QgKmlkcworCXBhcmFtIGNvbnN0IGNoYXIgKipuYW1lcworCXBhcmFtIHVpbnQzMl90IGRhdGFTaXplCisJfQorCiBUeXBlQmVnaW4gewogCXBhcmFtIFJzRWxlbWVudCB0eXBlCiAJfQpAQCAtODQsNiArMTEwLDEyIEBACiAJcmV0IFJzVHlwZQogCX0KIAorVHlwZUdldE5hdGl2ZURhdGEgeworCXBhcmFtIFJzVHlwZSB0eXBlCisJcGFyYW0gdWludDMyX3QgKiB0eXBlRGF0YQorCXBhcmFtIHVpbnQzMl90IHR5cGVEYXRhU2l6ZQorCX0KKwogQWxsb2NhdGlvbkNyZWF0ZVR5cGVkIHsKIAlwYXJhbSBSc1R5cGUgdHlwZQogCXJldCBSc0FsbG9jYXRpb24KQEAgLTE1Myw2ICsxODUsMTYgQEAKIAl0b2dnbGVQbGF5CiAJfQogCitBbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSB7CisJcGFyYW0gUnNBbGxvY2F0aW9uIHZhCisJcGFyYW0gdWludDMyX3QgeAorCXBhcmFtIGNvbnN0IHZvaWQgKmRhdGEKKwlwYXJhbSB1aW50MzJfdCBjb21wX29mZnNldAorCXBhcmFtIHVpbnQzMl90IGJ5dGVzCisJaGFuZGNvZGVBcGkKKwl0b2dnbGVQbGF5CisJfQorCiBBbGxvY2F0aW9uMkRTdWJEYXRhIHsKIAlwYXJhbSBSc0FsbG9jYXRpb24gdmEKIAlwYXJhbSB1aW50MzJfdCB4b2ZmCkBAIC0xNjMsNiArMjA1LDE1IEBACiAJcGFyYW0gdWludDMyX3QgYnl0ZXMKIAl9CiAKK0FsbG9jYXRpb24yRFN1YkVsZW1lbnREYXRhIHsKKwlwYXJhbSBSc0FsbG9jYXRpb24gdmEKKwlwYXJhbSB1aW50MzJfdCB4CisJcGFyYW0gdWludDMyX3QgeQorCXBhcmFtIGNvbnN0IHZvaWQgKmRhdGEKKwlwYXJhbSB1aW50MzJfdCBlbGVtZW50X29mZnNldAorCXBhcmFtIHVpbnQzMl90IGJ5dGVzCisJfQorCiBBbGxvY2F0aW9uUmVhZCB7CiAJcGFyYW0gUnNBbGxvY2F0aW9uIHZhCiAJcGFyYW0gdm9pZCAqIGRhdGEKQEAgLTIyNCw2ICsyNzUsMjIgQEAKIAlwYXJhbSBjb25zdCB2b2lkICpkYXRhCiAJfQogCitBbGxvY2F0aW9uR2V0VHlwZSB7CisJcGFyYW0gUnNBbGxvY2F0aW9uIHZhCisJcmV0IGNvbnN0IHZvaWQqCisJfQorCitBbGxvY2F0aW9uUmVzaXplMUQgeworCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQorCXBhcmFtIHVpbnQzMl90IGRpbVgKKwl9CisKK0FsbG9jYXRpb25SZXNpemUyRCB7CisJcGFyYW0gUnNBbGxvY2F0aW9uIHZhCisJcGFyYW0gdWludDMyX3QgZGltWAorCXBhcmFtIHVpbnQzMl90IGRpbVkKKwl9CisKIFNhbXBsZXJCZWdpbiB7CiAJfQogCkBAIC0yMzIsNiArMjk5LDExIEBACiAJcGFyYW0gUnNTYW1wbGVyVmFsdWUgdmFsdWUKIAl9CiAKK1NhbXBsZXJTZXQyIHsKKwlwYXJhbSBSc1NhbXBsZXJQYXJhbSBwCisJcGFyYW0gZmxvYXQgdmFsdWUKKwl9CisKIFNhbXBsZXJDcmVhdGUgewogCXJldCBSc1NhbXBsZXIKIAl9CkBAIC0yNDgsMTMgKzMyMCw2IEBACiBTY3JpcHRDQmVnaW4gewogCX0KIAotU2NyaXB0U2V0Q2xlYXJDb2xvciB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIGZsb2F0IHIKLQlwYXJhbSBmbG9hdCBnCi0JcGFyYW0gZmxvYXQgYgotCXBhcmFtIGZsb2F0IGEKLQl9CiAKIFNjcmlwdFNldFRpbWVab25lIHsKIAlwYXJhbSBSc1NjcmlwdCBzCkBAIC0yNjIsNDMgKzMyNyw0OSBAQAogCXBhcmFtIHVpbnQzMl90IGxlbmd0aAogCX0KIAotU2NyaXB0U2V0Q2xlYXJEZXB0aCB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIGZsb2F0IGRlcHRoCi0JfQotCi1TY3JpcHRTZXRDbGVhclN0ZW5jaWwgewotCXBhcmFtIFJzU2NyaXB0IHMKLQlwYXJhbSB1aW50MzJfdCBzdGVuY2lsCi0JfQotCi1TY3JpcHRTZXRUeXBlIHsKLQlwYXJhbSBSc1R5cGUgdHlwZQotCXBhcmFtIHVpbnQzMl90IHNsb3QKLQlwYXJhbSBib29sIGlzV3JpdGFibGUKLQlwYXJhbSBjb25zdCBjaGFyICogbmFtZQotCX0KLQotU2NyaXB0U2V0SW52b2tlIHsKLQlwYXJhbSBjb25zdCBjaGFyICogbmFtZQotCXBhcmFtIHVpbnQzMl90IHNsb3QKLQl9CiAKIFNjcmlwdEludm9rZSB7CiAJcGFyYW0gUnNTY3JpcHQgcwogCXBhcmFtIHVpbnQzMl90IHNsb3QKIAl9CiAKLVNjcmlwdFNldFJvb3QgewotCXBhcmFtIGJvb2wgaXNSb290CitTY3JpcHRJbnZva2VWIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGNvbnN0IHZvaWQgKiBkYXRhCisJcGFyYW0gdWludDMyX3QgZGF0YUxlbgorCWhhbmRjb2RlQXBpCisJdG9nZ2xlUGxheQogCX0KIAotCi0KLVNjcmlwdENTZXRTY3JpcHQgewotCXBhcmFtIHZvaWQgKiBjb2RlUHRyCitTY3JpcHRTZXRWYXJJIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGludCB2YWx1ZQogCX0KIAorU2NyaXB0U2V0VmFyRiB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBmbG9hdCB2YWx1ZQorCX0KKworU2NyaXB0U2V0VmFyRCB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBkb3VibGUgdmFsdWUKKwl9CisKK1NjcmlwdFNldFZhclYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gY29uc3Qgdm9pZCAqIGRhdGEKKwlwYXJhbSB1aW50MzJfdCBkYXRhTGVuCisJaGFuZGNvZGVBcGkKKwl0b2dnbGVQbGF5CisJfQorCisKIFNjcmlwdENTZXRUZXh0IHsKIAlwYXJhbSBjb25zdCBjaGFyICogdGV4dAogCXBhcmFtIHVpbnQzMl90IGxlbmd0aApAQCAtMzA4LDUyICszNzksNDEgQEAKIAlyZXQgUnNTY3JpcHQKIAl9CiAKLVNjcmlwdENTZXREZWZpbmVGIHsKLSAgICBwYXJhbSBjb25zdCBjaGFyKiBuYW1lCi0gICAgcGFyYW0gZmxvYXQgdmFsdWUKLSAgICB9CiAKLVNjcmlwdENTZXREZWZpbmVJMzIgewotICAgIHBhcmFtIGNvbnN0IGNoYXIqIG5hbWUKLSAgICBwYXJhbSBpbnQzMl90IHZhbHVlCi0gICAgfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIHsKK1Byb2dyYW1TdG9yZUJlZ2luIHsKIAlwYXJhbSBSc0VsZW1lbnQgaW4KIAlwYXJhbSBSc0VsZW1lbnQgb3V0CiAJfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayB7CitQcm9ncmFtU3RvcmVDb2xvck1hc2sgewogCXBhcmFtIGJvb2wgcgogCXBhcmFtIGJvb2wgZwogCXBhcmFtIGJvb2wgYgogCXBhcmFtIGJvb2wgYQogCX0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMgeworUHJvZ3JhbVN0b3JlQmxlbmRGdW5jIHsKIAlwYXJhbSBSc0JsZW5kU3JjRnVuYyBzcmNGdW5jCiAJcGFyYW0gUnNCbGVuZERzdEZ1bmMgZGVzdEZ1bmMKIAl9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIHsKK1Byb2dyYW1TdG9yZURlcHRoTWFzayB7CiAJcGFyYW0gYm9vbCBlbmFibGUKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIgeworUHJvZ3JhbVN0b3JlRGl0aGVyIHsKIAlwYXJhbSBib29sIGVuYWJsZQogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyB7CitQcm9ncmFtU3RvcmVEZXB0aEZ1bmMgewogCXBhcmFtIFJzRGVwdGhGdW5jIGZ1bmMKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUgewotCXJldCBSc1Byb2dyYW1GcmFnbWVudFN0b3JlCitQcm9ncmFtU3RvcmVDcmVhdGUgeworCXJldCBSc1Byb2dyYW1TdG9yZQogCX0KIAogUHJvZ3JhbVJhc3RlckNyZWF0ZSB7Ci0JcGFyYW0gUnNFbGVtZW50IGluCi0JcGFyYW0gUnNFbGVtZW50IG91dAogCXBhcmFtIGJvb2wgcG9pbnRTbW9vdGgKIAlwYXJhbSBib29sIGxpbmVTbW9vdGgKIAlwYXJhbSBib29sIHBvaW50U3ByaXRlCkBAIC0zNjUsMTIgKzQyNSwxMSBAQAogCXBhcmFtIGZsb2F0IGx3CiB9CiAKLVByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemV7CitQcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUgewogCXBhcmFtIFJzUHJvZ3JhbVJhc3RlciBwcgotCXBhcmFtIGZsb2F0IHBzCisJcGFyYW0gUnNDdWxsTW9kZSBtb2RlCiB9CiAKLQogUHJvZ3JhbUJpbmRDb25zdGFudHMgewogCXBhcmFtIFJzUHJvZ3JhbSB2cAogCXBhcmFtIHVpbnQzMl90IHNsb3QKQEAgLTM5MSwxMiArNDUwLDYgQEAKIAl9CiAKIFByb2dyYW1GcmFnbWVudENyZWF0ZSB7Ci0JcGFyYW0gY29uc3QgdWludDMyX3QgKiBwYXJhbXMKLQlwYXJhbSB1aW50MzJfdCBwYXJhbUxlbmd0aAotCXJldCBSc1Byb2dyYW1GcmFnbWVudAotCX0KLQotUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiB7CiAJcGFyYW0gY29uc3QgY2hhciAqIHNoYWRlclRleHQKIAlwYXJhbSB1aW50MzJfdCBzaGFkZXJMZW5ndGgKIAlwYXJhbSBjb25zdCB1aW50MzJfdCAqIHBhcmFtcwpAQCAtNDA1LDExICs0NTgsNiBAQAogCX0KIAogUHJvZ3JhbVZlcnRleENyZWF0ZSB7Ci0JcGFyYW0gYm9vbCB0ZXhNYXQKLQlyZXQgUnNQcm9ncmFtVmVydGV4Ci0JfQotCi1Qcm9ncmFtVmVydGV4Q3JlYXRlMiB7CiAJcGFyYW0gY29uc3QgY2hhciAqIHNoYWRlclRleHQKIAlwYXJhbSB1aW50MzJfdCBzaGFkZXJMZW5ndGgKIAlwYXJhbSBjb25zdCB1aW50MzJfdCAqIHBhcmFtcwpAQCAtNDE3LDM0ICs0NjUsMTAgQEAKIAlyZXQgUnNQcm9ncmFtVmVydGV4CiAJfQogCi1MaWdodEJlZ2luIHsKLQl9Ci0KLUxpZ2h0U2V0TG9jYWwgewotCXBhcmFtIGJvb2wgaXNMb2NhbAotCX0KLQotTGlnaHRTZXRNb25vY2hyb21hdGljIHsKLQlwYXJhbSBib29sIGlzTW9ubwotCX0KLQotTGlnaHRDcmVhdGUgewotCXJldCBSc0xpZ2h0IGxpZ2h0Ci0JfQotCi0KLUxpZ2h0U2V0UG9zaXRpb24gewotCXBhcmFtIFJzTGlnaHQgbGlnaHQKLQlwYXJhbSBmbG9hdCB4Ci0JcGFyYW0gZmxvYXQgeQotCXBhcmFtIGZsb2F0IHoKLQl9Ci0KLUxpZ2h0U2V0Q29sb3IgewotCXBhcmFtIFJzTGlnaHQgbGlnaHQKLQlwYXJhbSBmbG9hdCByCi0JcGFyYW0gZmxvYXQgZwotCXBhcmFtIGZsb2F0IGIKK0ZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0geworCXBhcmFtIGNvbnN0IHZvaWQgKiBkYXRhCisJcGFyYW0gc2l6ZV90IGxlbgorCXJldCBSc0ZpbGUKIAl9CiAKIEZpbGVPcGVuIHsKQEAgLTQ1MywzMCArNDc3LDc5IEBACiAJcGFyYW0gc2l6ZV90IGxlbgogCX0KIAorRmlsZUEzREdldE51bUluZGV4RW50cmllcyB7CisJcGFyYW0gaW50MzJfdCAqIG51bUVudHJpZXMKKwlwYXJhbSBSc0ZpbGUgZmlsZQorCX0KIAotU2ltcGxlTWVzaENyZWF0ZSB7Ci0JcmV0IFJzU2ltcGxlTWVzaAotCXBhcmFtIFJzQWxsb2NhdGlvbiBwcmltCi0JcGFyYW0gUnNBbGxvY2F0aW9uIGluZGV4Ci0JcGFyYW0gUnNBbGxvY2F0aW9uICp2dHgKK0ZpbGVBM0RHZXRJbmRleEVudHJpZXMgeworCXBhcmFtIFJzRmlsZUluZGV4RW50cnkgKiBmaWxlRW50cmllcworCXBhcmFtIHVpbnQzMl90IG51bUVudHJpZXMKKwlwYXJhbSBSc0ZpbGUgZmlsZUEzRAorCX0KKworRmlsZUEzREdldEVudHJ5QnlJbmRleCB7CisJcGFyYW0gdWludDMyX3QgaW5kZXgKKwlwYXJhbSBSc0ZpbGUgZmlsZQorCXJldCBSc09iamVjdEJhc2UKKwl9CisKK0ZvbnRDcmVhdGVGcm9tRmlsZSB7CisJcGFyYW0gY29uc3QgY2hhciAqbmFtZQorCXBhcmFtIHVpbnQzMl90IGZvbnRTaXplCisJcGFyYW0gdWludDMyX3QgZHBpCisJcmV0IFJzRm9udAorCX0KKworTWVzaENyZWF0ZSB7CisJcmV0IFJzTWVzaAogCXBhcmFtIHVpbnQzMl90IHZ0eENvdW50Ci0JcGFyYW0gdWludDMyX3QgcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBpZHhDb3VudAogCX0KIAotCi1TaW1wbGVNZXNoQmluZEluZGV4IHsKLQlwYXJhbSBSc1NpbXBsZU1lc2ggbWVzaAorTWVzaEJpbmRJbmRleCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKIAlwYXJhbSBSc0FsbG9jYXRpb24gaWR4CisJcGFyYW0gdWludDMyX3QgcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCi1TaW1wbGVNZXNoQmluZFByaW1pdGl2ZSB7Ci0JcGFyYW0gUnNTaW1wbGVNZXNoIG1lc2gKLQlwYXJhbSBSc0FsbG9jYXRpb24gcHJpbQotCX0KLQotU2ltcGxlTWVzaEJpbmRWZXJ0ZXggewotCXBhcmFtIFJzU2ltcGxlTWVzaCBtZXNoCitNZXNoQmluZFZlcnRleCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKIAlwYXJhbSBSc0FsbG9jYXRpb24gdnR4CiAJcGFyYW0gdWludDMyX3Qgc2xvdAogCX0KIAorTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IHsKKwlwYXJhbSBSc01lc2ggbWVzaAorCXBhcmFtIGludDMyX3QgKm51bVZ0eAorCX0KKworTWVzaEdldEluZGV4Q291bnQgeworCXBhcmFtIFJzTWVzaCBtZXNoCisJcGFyYW0gaW50MzJfdCAqbnVtSWR4CisJfQorCitNZXNoR2V0VmVydGljZXMgeworCXBhcmFtIFJzTWVzaCBtdgorCXBhcmFtIFJzQWxsb2NhdGlvbiAqdnR4RGF0YQorCXBhcmFtIHVpbnQzMl90IHZ0eERhdGFDb3VudAorCX0KKworTWVzaEdldEluZGljZXMgeworCXBhcmFtIFJzTWVzaCBtdgorCXBhcmFtIFJzQWxsb2NhdGlvbiAqdmEKKwlwYXJhbSB1aW50MzJfdCAqcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBpZHhEYXRhQ291bnQKKwl9CisKK0FuaW1hdGlvbkNyZWF0ZSB7CisJcGFyYW0gY29uc3QgZmxvYXQgKmluVmFsdWVzCisJcGFyYW0gY29uc3QgZmxvYXQgKm91dFZhbHVlcworCXBhcmFtIHVpbnQzMl90IHZhbHVlQ291bnQKKwlwYXJhbSBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwCisJcGFyYW0gUnNBbmltYXRpb25FZGdlIHByZQorCXBhcmFtIFJzQW5pbWF0aW9uRWRnZSBwb3N0CisJcmV0IFJzQW5pbWF0aW9uCisJfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWRhcHRlci5jcHAgYi9saWJzL3JzL3JzQWRhcHRlci5jcHAKaW5kZXggMGQzMWZhYy4uZWY2OWI3NSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FkYXB0ZXIuY3BwCisrKyBiL2xpYnMvcnMvcnNBZGFwdGVyLmNwcApAQCAtMTUsNyArMTUsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTcwLDYgKzc0LDE2IEBACiAgICAgICAgICAgIG1BbGxvY2F0aW9uLmdldCgpLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpKTsKIH0KIAordm9pZCBBZGFwdGVyMUQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0FkYXB0ZXIxRCAqQWRhcHRlcjFEOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIApAQCAtMTY5LDcgKzE4Myw2IEBACiAKICAgICB1aW50MzJfdCBlU2l6ZSA9IG1BbGxvY2F0aW9uLmdldCgpLT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKICAgICB1aW50MzJfdCBsaW5lU2l6ZSA9IGVTaXplICogdzsKLSAgICB1aW50MzJfdCBkZXN0VyA9IGdldERpbVgoKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oZGF0YSk7CiAgICAgZm9yICh1aW50MzJfdCBsaW5lPXlvZmY7IGxpbmUgPCAoeW9mZitoKTsgbGluZSsrKSB7CkBAIC0xODUsNiArMTk4LDE1IEBACiAgICAgICAgICAgIG1BbGxvY2F0aW9uLmdldCgpLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpKTsKIH0KIAordm9pZCBBZGFwdGVyMkQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0FkYXB0ZXIyRCAqQWRhcHRlcjJEOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQogCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBZGFwdGVyLmggYi9saWJzL3JzL3JzQWRhcHRlci5oCmluZGV4IGNiMjg3MmUuLjQ0OWU3YWQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBZGFwdGVyLmgKKysrIGIvbGlicy9ycy9yc0FkYXB0ZXIuaApAQCAtNTAsNiArNTAsMTAgQEAKICAgICB2b2lkIHN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEpOwogICAgIHZvaWQgZGF0YShjb25zdCB2b2lkICpkYXRhKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMUQ7IH0KKyAgICBzdGF0aWMgQWRhcHRlcjFEICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CiAgICAgdWludDMyX3QgbVk7CkBAIC04Miw2ICs4NiwxMCBAQAogICAgIHZvaWQgZGF0YShjb25zdCB2b2lkICpkYXRhKTsKICAgICB2b2lkIHN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwgdWludDMyX3QgdywgdWludDMyX3QgaCwgY29uc3Qgdm9pZCAqZGF0YSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzJEOyB9CisgICAgc3RhdGljIEFkYXB0ZXIyRCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKIHByb3RlY3RlZDoKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOwogICAgIHVpbnQzMl90IG1aOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCmluZGV4IDRlODI3OGQuLjJlOWUwYjMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcAorKysgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKQEAgLTEzLDEyICsxMywxOCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAKICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdsL2dsZXh0Lmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMjgsNiArMzQsOSBAQAogICAgIGluaXQocnNjLCB0eXBlKTsKIAogICAgIG1QdHIgPSBtYWxsb2MobVR5cGUtPmdldFNpemVCeXRlcygpKTsKKyAgICBpZiAobVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIG1lbXNldChtUHRyLCAwLCBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgIH0KICAgICBpZiAoIW1QdHIpIHsKICAgICAgICAgTE9HRSgiQWxsb2NhdGlvbjo6QWxsb2NhdGlvbiwgYWxsb2MgZmFpbHVyZSIpOwogICAgIH0KQEAgLTE2Nyw5ICsxNzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgIDAsIGZvcm1hdCwgdHlwZSwgcHRyKTsKICAgICB9CiAgICAgaWYgKG1UZXh0dXJlR2VuTWlwbWFwKSB7CisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICAgICAgZ2xHZW5lcmF0ZU1pcG1hcChHTF9URVhUVVJFXzJEKTsKKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICB9CiAKKyAgICByc2MtPmNoZWNrRXJyb3IoIkFsbG9jYXRpb246OnVwbG9hZFRvVGV4dHVyZSIpOwogfQogCiB2b2lkIEFsbG9jYXRpb246OmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChjb25zdCBDb250ZXh0ICpyc2MpCkBAIC0yMDEsNiArMjEzLDcgQEAKICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQnVmZmVySUQpOwogICAgIGdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsIG1UeXBlLT5nZXRTaXplQnl0ZXMoKSwgZ2V0UHRyKCksIEdMX0RZTkFNSUNfRFJBVyk7CiAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgcnNjLT5jaGVja0Vycm9yKCJBbGxvY2F0aW9uOjp1cGxvYWRUb0J1ZmZlck9iamVjdCIpOwogfQogCiB2b2lkIEFsbG9jYXRpb246OnVwbG9hZENoZWNrKGNvbnN0IENvbnRleHQgKnJzYykKQEAgLTIxNywxMyArMjMwLDE5IEBACiB9CiAKIAotdm9pZCBBbGxvY2F0aW9uOjpkYXRhKGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3ZvaWQgQWxsb2NhdGlvbjo6ZGF0YShDb250ZXh0ICpyc2MsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICB1aW50MzJfdCBzaXplID0gbVR5cGUtPmdldFNpemVCeXRlcygpOwogICAgIGlmIChzaXplICE9IHNpemVCeXRlcykgewogICAgICAgICBMT0dFKCJBbGxvY2F0aW9uOjpkYXRhIGNhbGxlZCB3aXRoIG1pc21hdGNoZWQgc2l6ZSBleHBlY3RlZCAlaSwgZ290ICVpIiwgc2l6ZSwgc2l6ZUJ5dGVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgaW5jUmVmcyhkYXRhLCBzaXplQnl0ZXMgLyBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgICAgIGRlY1JlZnMobVB0ciwgc2l6ZUJ5dGVzIC8gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgIH0KKwogICAgIG1lbWNweShtUHRyLCBkYXRhLCBzaXplKTsKICAgICBzZW5kRGlydHkoKTsKICAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7CkBAIC0yMzQsNyArMjUzLDcgQEAKICAgICBtZW1jcHkoZGF0YSwgbVB0ciwgbVR5cGUtPmdldFNpemVCeXRlcygpKTsKIH0KIAotdm9pZCBBbGxvY2F0aW9uOjpzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCit2b2lkIEFsbG9jYXRpb246OnN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIHVpbnQzMl90IGVTaXplID0gbVR5cGUtPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKICAgICB1aW50OF90ICogcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtUHRyKTsKQEAgLTI0NiwxMiArMjY1LDE4IEBACiAgICAgICAgIG1UeXBlLT5kdW1wTE9HVigidHlwZSBpbmZvIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBpZiAobVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIGluY1JlZnMoZGF0YSwgY291bnQpOworICAgICAgICBkZWNSZWZzKHB0ciwgY291bnQpOworICAgIH0KKwogICAgIG1lbWNweShwdHIsIGRhdGEsIHNpemUpOwogICAgIHNlbmREaXJ0eSgpOwogICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKIH0KIAotdm9pZCBBbGxvY2F0aW9uOjpzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsCit2b2lkIEFsbG9jYXRpb246OnN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLAogICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICB1aW50MzJfdCBlU2l6ZSA9IG1UeXBlLT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCk7CkBAIC0yNjgsNyArMjkzLDEwIEBACiAgICAgfQogCiAgICAgZm9yICh1aW50MzJfdCBsaW5lPXlvZmY7IGxpbmUgPCAoeW9mZitoKTsgbGluZSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgKiBwdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1QdHIpOworICAgICAgICBpZiAobVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgICAgICBpbmNSZWZzKHNyYywgdyk7CisgICAgICAgICAgICBkZWNSZWZzKGRzdCwgdyk7CisgICAgICAgIH0KICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBsaW5lU2l6ZSk7CiAgICAgICAgIHNyYyArPSBsaW5lU2l6ZTsKICAgICAgICAgZHN0ICs9IGRlc3RXICogZVNpemU7CkBAIC0yNzcsMTQgKzMwNSw5NiBAQAogICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKIH0KIAotdm9pZCBBbGxvY2F0aW9uOjpzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHpvZmYsCit2b2lkIEFsbG9jYXRpb246OnN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB6b2ZmLAogICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKIH0KIAordm9pZCBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHgsIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNJZHgsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICB1aW50MzJfdCBlU2l6ZSA9IG1UeXBlLT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCk7CisgICAgdWludDhfdCAqIHB0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obVB0cik7CisgICAgcHRyICs9IGVTaXplICogeDsKKworICAgIGlmIChjSWR4ID49IG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEZpZWxkQ291bnQoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBjb21wb25lbnQgJWkgb3V0IG9mIHJhbmdlLiIsIGNJZHgpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIGNvbXBvbmVudCBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoeCA+PSBtVHlwZS0+Z2V0RGltWCgpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIFggb2Zmc2V0ICVpIG91dCBvZiByYW5nZS4iLCB4KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBYIG9mZnNldCBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBFbGVtZW50ICogZSA9IG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEZpZWxkKGNJZHgpOworICAgIHB0ciArPSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZE9mZnNldEJ5dGVzKGNJZHgpOworCisgICAgaWYgKHNpemVCeXRlcyAhPSBlLT5nZXRTaXplQnl0ZXMoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBkYXRhIHNpemUgJWkgZG9lcyBub3QgbWF0Y2ggZmllbGQgc2l6ZSAlaS4iLCBzaXplQnl0ZXMsIGUtPmdldFNpemVCeXRlcygpKTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBiYWQgc2l6ZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgZS0+aW5jUmVmcyhkYXRhKTsKKyAgICAgICAgZS0+ZGVjUmVmcyhwdHIpOworICAgIH0KKworICAgIG1lbWNweShwdHIsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgc2VuZERpcnR5KCk7CisgICAgbVVwbG9hZERlZmVyZWQgPSB0cnVlOworfQorCit2b2lkIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeCwgdWludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgY0lkeCwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIHVpbnQzMl90IGVTaXplID0gbVR5cGUtPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB1aW50OF90ICogcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtUHRyKTsKKyAgICBwdHIgKz0gZVNpemUgKiAoeCArIHkgKiBtVHlwZS0+Z2V0RGltWCgpKTsKKworICAgIGlmICh4ID49IG1UeXBlLT5nZXREaW1YKCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgWCBvZmZzZXQgJWkgb3V0IG9mIHJhbmdlLiIsIHgpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIFggb2Zmc2V0IG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh5ID49IG1UeXBlLT5nZXREaW1ZKCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgWCBvZmZzZXQgJWkgb3V0IG9mIHJhbmdlLiIsIHgpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIFggb2Zmc2V0IG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjSWR4ID49IG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEZpZWxkQ291bnQoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBjb21wb25lbnQgJWkgb3V0IG9mIHJhbmdlLiIsIGNJZHgpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIGNvbXBvbmVudCBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBFbGVtZW50ICogZSA9IG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEZpZWxkKGNJZHgpOworICAgIHB0ciArPSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZE9mZnNldEJ5dGVzKGNJZHgpOworCisgICAgaWYgKHNpemVCeXRlcyAhPSBlLT5nZXRTaXplQnl0ZXMoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBkYXRhIHNpemUgJWkgZG9lcyBub3QgbWF0Y2ggZmllbGQgc2l6ZSAlaS4iLCBzaXplQnl0ZXMsIGUtPmdldFNpemVCeXRlcygpKTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBiYWQgc2l6ZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgZS0+aW5jUmVmcyhkYXRhKTsKKyAgICAgICAgZS0+ZGVjUmVmcyhwdHIpOworICAgIH0KKworICAgIG1lbWNweShwdHIsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgc2VuZERpcnR5KCk7CisgICAgbVVwbG9hZERlZmVyZWQgPSB0cnVlOworfQorCiB2b2lkIEFsbG9jYXRpb246OmFkZFByb2dyYW1Ub0RpcnR5KGNvbnN0IFByb2dyYW0gKnApCiB7Ci0gICAgbVRvRGlydHlMaXN0LmFkZChwKTsKKyAgICBtVG9EaXJ0eUxpc3QucHVzaChwKTsKIH0KIAogdm9pZCBBbGxvY2F0aW9uOjpyZW1vdmVQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICpwKQpAQCAtMzE2LDYgKzQyNiw2MSBAQAogCiB9CiAKK3ZvaWQgQWxsb2NhdGlvbjo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgLy8gRmlyc3QgdGhpbmcgd2UgbmVlZCB0byBzZXJpYWxpemUgaXMgdGhlIHR5cGUgb2JqZWN0IHNpbmNlIGl0IHdpbGwgYmUgbmVlZGVkCisgICAgLy8gdG8gaW5pdGlhbGl6ZSB0aGUgY2xhc3MKKyAgICBtVHlwZS0+c2VyaWFsaXplKHN0cmVhbSk7CisKKyAgICB1aW50MzJfdCBkYXRhU2l6ZSA9IG1UeXBlLT5nZXRTaXplQnl0ZXMoKTsKKyAgICAvLyBXcml0ZSBob3cgbXVjaCBkYXRhIHdlIGFyZSBzdG9yaW5nCisgICAgc3RyZWFtLT5hZGRVMzIoZGF0YVNpemUpOworICAgIC8vIE5vdyB3cml0ZSB0aGUgZGF0YQorICAgIHN0cmVhbS0+YWRkQnl0ZUFycmF5KG1QdHIsIGRhdGFTaXplKTsKK30KKworQWxsb2NhdGlvbiAqQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX0FMTE9DQVRJT04pIHsKKyAgICAgICAgTE9HRSgiYWxsb2NhdGlvbiBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIFR5cGUgKnR5cGUgPSBUeXBlOjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICBpZighdHlwZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdHlwZS0+Y29tcHV0ZSgpOworCisgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHdlIHdyb3RlIG91dCBmb3IgdGhpcyBhbGxvY2F0aW9uCisgICAgdWludDMyX3QgZGF0YVNpemUgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihkYXRhU2l6ZSAhPSB0eXBlLT5nZXRTaXplQnl0ZXMoKSkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gcmVhZCBhbGxvY2F0aW9uIGJlY2F1c2UgbnVtYnl0ZXMgd3JpdHRlbiBpcyBub3QgdGhlIHNhbWUgbG9hZGVkIHR5cGUgd2FudHNcbiIpOworICAgICAgICBkZWxldGUgdHlwZTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBuZXcgQWxsb2NhdGlvbihyc2MsIHR5cGUpOworICAgIGFsbG9jLT5zZXROYW1lKG5hbWUuc3RyaW5nKCksIG5hbWUuc2l6ZSgpKTsKKworICAgIC8vIFJlYWQgaW4gYWxsIG9mIG91ciBhbGxvY2F0aW9uIGRhdGEKKyAgICBhbGxvYy0+ZGF0YShyc2MsIHN0cmVhbS0+Z2V0UHRyKCkgKyBzdHJlYW0tPmdldFBvcygpLCBkYXRhU2l6ZSk7CisgICAgc3RyZWFtLT5yZXNldChzdHJlYW0tPmdldFBvcygpICsgZGF0YVNpemUpOworCisgICAgcmV0dXJuIGFsbG9jOworfQorCiB2b2lkIEFsbG9jYXRpb246OnNlbmREaXJ0eSgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtVG9EaXJ0eUxpc3Quc2l6ZSgpOyBjdCsrKSB7CkBAIC0zMjMsNiArNDg4LDY1IEBACiAgICAgfQogfQogCit2b2lkIEFsbG9jYXRpb246OmluY1JlZnMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgY3QsIHNpemVfdCBzdGFydE9mZikgY29uc3QKK3sKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtVHlwZS0+Z2V0RWxlbWVudCgpOworICAgIHVpbnQzMl90IHN0cmlkZSA9IGUtPmdldFNpemVCeXRlcygpOworCisgICAgcCArPSBzdHJpZGUgKiBzdGFydE9mZjsKKyAgICB3aGlsZSAoY3QgPiAwKSB7CisgICAgICAgIGUtPmluY1JlZnMocCk7CisgICAgICAgIGN0IC0tOworICAgICAgICBwICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgQWxsb2NhdGlvbjo6ZGVjUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCwgc2l6ZV90IHN0YXJ0T2ZmKSBjb25zdAoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHB0cik7CisgICAgY29uc3QgRWxlbWVudCAqZSA9IG1UeXBlLT5nZXRFbGVtZW50KCk7CisgICAgdWludDMyX3Qgc3RyaWRlID0gZS0+Z2V0U2l6ZUJ5dGVzKCk7CisKKyAgICBwICs9IHN0cmlkZSAqIHN0YXJ0T2ZmOworICAgIHdoaWxlIChjdCA+IDApIHsKKyAgICAgICAgZS0+ZGVjUmVmcyhwKTsKKyAgICAgICAgY3QgLS07CisgICAgICAgIHAgKz0gc3RyaWRlOworICAgIH0KK30KKwordm9pZCBBbGxvY2F0aW9uOjpjb3B5UmFuZ2UxRChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKnNyYywgaW50MzJfdCBzcmNPZmYsIGludDMyX3QgZGVzdE9mZiwgaW50MzJfdCBsZW4pCit7Cit9CisKK3ZvaWQgQWxsb2NhdGlvbjo6cmVzaXplMUQoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBkaW1YKQoreworICAgIFR5cGUgKnQgPSBtVHlwZS0+Y2xvbmVBbmRSZXNpemUxRChyc2MsIGRpbVgpOworCisgICAgdWludDMyX3Qgb2xkRGltWCA9IG1UeXBlLT5nZXREaW1YKCk7CisgICAgaWYgKGRpbVggPT0gb2xkRGltWCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGRpbVggPCBvbGREaW1YKSB7CisgICAgICAgIGRlY1JlZnMobVB0ciwgb2xkRGltWCAtIGRpbVgsIGRpbVgpOworICAgIH0KKyAgICBtUHRyID0gcmVhbGxvYyhtUHRyLCB0LT5nZXRTaXplQnl0ZXMoKSk7CisKKyAgICBpZiAoZGltWCA+IG9sZERpbVgpIHsKKyAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1UeXBlLT5nZXRFbGVtZW50KCk7CisgICAgICAgIHVpbnQzMl90IHN0cmlkZSA9IGUtPmdldFNpemVCeXRlcygpOworICAgICAgICBtZW1zZXQoKCh1aW50OF90ICopbVB0cikgKyBzdHJpZGUgKiBvbGREaW1YLCAwLCBzdHJpZGUgKiAoZGltWCAtIG9sZERpbVgpKTsKKyAgICB9CisgICAgbVR5cGUuc2V0KHQpOworfQorCit2b2lkIEFsbG9jYXRpb246OnJlc2l6ZTJEKENvbnRleHQgKnJzYywgdWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSkKK3sKKyAgICBMT0dFKCJub3QgaW1wbGVtZW50ZWQiKTsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8KIC8vCiAKQEAgLTQ5NSw3ICs3MTksNyBAQAogICAgIGlmIChzcmNHTFR5cGUgPT0gR0xfVU5TSUdORURfQllURSAmJgogICAgICAgICBzcmNHTEZtdCA9PSBHTF9SR0IgJiYKICAgICAgICAgZHN0R0xUeXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICYmCi0gICAgICAgIGRzdEdMVHlwZSA9PSBHTF9SR0IpIHsKKyAgICAgICAgZHN0R0xGbXQgPT0gR0xfUkdCKSB7CiAKICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb252ZXJ0ZXJfODg4X3RvXzU2NTsKICAgICB9CkBAIC01MDMsMTUgKzcyNywyMSBAQAogICAgIGlmIChzcmNHTFR5cGUgPT0gR0xfVU5TSUdORURfQllURSAmJgogICAgICAgICBzcmNHTEZtdCA9PSBHTF9SR0JBICYmCiAgICAgICAgIGRzdEdMVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAmJgotICAgICAgICBkc3RHTFR5cGUgPT0gR0xfUkdCKSB7CisgICAgICAgIGRzdEdMRm10ID09IEdMX1JHQikgewogCiAgICAgICAgIHJldHVybiBlbGVtZW50Q29udmVydGVyXzg4ODhfdG9fNTY1OwogICAgIH0KIAogICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIHVuc3Vwb3J0ZWQgY29tYm8sIHNyYyAlcCwgIGRzdCAlcCIsIHNyYywgZHN0KTsKKyAgICBMT0dFKCJwaWNrQ29udmVydGVyLCBzcmNHTFR5cGUgPSAleCwgIHNyY0dMRm10ID0gJXgiLCBzcmNHTFR5cGUsIHNyY0dMRm10KTsKKyAgICBMT0dFKCJwaWNrQ29udmVydGVyLCBkc3RHTFR5cGUgPSAleCwgIGRzdEdMRm10ID0gJXgiLCBkc3RHTFR5cGUsIGRzdEdMRm10KTsKKyAgICBzcmMtPmR1bXBMT0dWKCJTUkMgIik7CisgICAgZHN0LT5kdW1wTE9HVigiRFNUICIpOwogICAgIHJldHVybiAwOwogfQogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKwogUnNBbGxvY2F0aW9uIHJzaV9BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKENvbnRleHQgKnJzYywgUnNUeXBlIHZ0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJtcCwgdm9pZCAqY2FsbGJhY2tEYXRhLCBSc0JpdG1hcENhbGxiYWNrX3QgY2FsbGJhY2spCiB7CkBAIC01MjYsMTAgKzc1Niw3IEBACiAgICAgY29uc3QgRWxlbWVudCAqc3JjID0gc3RhdGljX2Nhc3Q8Y29uc3QgRWxlbWVudCAqPihfc3JjKTsKICAgICBjb25zdCBFbGVtZW50ICpkc3QgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGVtZW50ICo+KF9kc3QpOwogCi0gICAgLy8gQ2hlY2sgZm9yIHBvdzIgb24gcHJlIGVzIDIuMCB2ZXJzaW9ucy4KLSAgICByc0Fzc2VydChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpIHx8ICghKHcgJiAody0xKSkgJiYgIShoICYgKGgtMSkpKSk7Ci0KLSAgICAvL0xPR0UoInJzaV9BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCAlaSAlaSAlaSAlaSAlaSIsIHcsIGgsIGRzdEZtdCwgc3JjRm10LCBnZW5NaXBzKTsKKyAgICAvL0xPR0UoIiVwIHJzaV9BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCAlaSAlaSAlaSIsIHJzYywgdywgaCwgZ2VuTWlwcyk7CiAgICAgcnNpX1R5cGVCZWdpbihyc2MsIF9kc3QpOwogICAgIHJzaV9UeXBlQWRkKHJzYywgUlNfRElNRU5TSU9OX1gsIHcpOwogICAgIHJzaV9UeXBlQWRkKHJzYywgUlNfRElNRU5TSU9OX1ksIGgpOwpAQCAtNTQ2LDE2ICs3NzMsMTkgQEAKICAgICB9CiAKICAgICBFbGVtZW50Q29udmVydGVyX3QgY3Z0ID0gcGlja0NvbnZlcnRlcihkc3QsIHNyYyk7Ci0gICAgY3Z0KHRleEFsbG9jLT5nZXRQdHIoKSwgZGF0YSwgdyAqIGgpOwotCi0gICAgaWYgKGdlbk1pcHMpIHsKLSAgICAgICAgQWRhcHRlcjJEIGFkYXB0KHJzYywgdGV4QWxsb2MpOwotICAgICAgICBBZGFwdGVyMkQgYWRhcHQyKHJzYywgdGV4QWxsb2MpOwotICAgICAgICBmb3IodWludDMyX3QgbG9kPTA7IGxvZCA8ICh0ZXhBbGxvYy0+Z2V0VHlwZSgpLT5nZXRMT0RDb3VudCgpIC0xKTsgbG9kKyspIHsKLSAgICAgICAgICAgIGFkYXB0LnNldExPRChsb2QpOwotICAgICAgICAgICAgYWRhcHQyLnNldExPRChsb2QgKyAxKTsKLSAgICAgICAgICAgIG1pcChhZGFwdDIsIGFkYXB0KTsKKyAgICBpZiAoY3Z0KSB7CisgICAgICAgIGN2dCh0ZXhBbGxvYy0+Z2V0UHRyKCksIGRhdGEsIHcgKiBoKTsKKyAgICAgICAgaWYgKGdlbk1pcHMpIHsKKyAgICAgICAgICAgIEFkYXB0ZXIyRCBhZGFwdChyc2MsIHRleEFsbG9jKTsKKyAgICAgICAgICAgIEFkYXB0ZXIyRCBhZGFwdDIocnNjLCB0ZXhBbGxvYyk7CisgICAgICAgICAgICBmb3IodWludDMyX3QgbG9kPTA7IGxvZCA8ICh0ZXhBbGxvYy0+Z2V0VHlwZSgpLT5nZXRMT0RDb3VudCgpIC0xKTsgbG9kKyspIHsKKyAgICAgICAgICAgICAgICBhZGFwdC5zZXRMT0QobG9kKTsKKyAgICAgICAgICAgICAgICBhZGFwdDIuc2V0TE9EKGxvZCArIDEpOworICAgICAgICAgICAgICAgIG1pcChhZGFwdDIsIGFkYXB0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAiVW5zdXBwb3J0ZWQgYml0bWFwIGZvcm1hdCIpOwogICAgIH0KIAogICAgIHJldHVybiB0ZXhBbGxvYzsKQEAgLTU5MiwxOSArODIyLDMxIEBACiB2b2lkIHJzaV9BbGxvY2F0aW9uRGF0YShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKLSAgICBhLT5kYXRhKGRhdGEsIHNpemVCeXRlcyk7CisgICAgYS0+ZGF0YShyc2MsIGRhdGEsIHNpemVCeXRlcyk7CiB9CiAKIHZvaWQgcnNpX0FsbG9jYXRpb24xRFN1YkRhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOwotICAgIGEtPnN1YkRhdGEoeG9mZiwgY291bnQsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgYS0+c3ViRGF0YShyc2MsIHhvZmYsIGNvdW50LCBkYXRhLCBzaXplQnl0ZXMpOworfQorCit2b2lkIHJzaV9BbGxvY2F0aW9uMkRTdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgZW9mZiwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBhLT5zdWJFbGVtZW50RGF0YShyc2MsIHgsIHksIGRhdGEsIGVvZmYsIHNpemVCeXRlcyk7Cit9CisKK3ZvaWQgcnNpX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBlb2ZmLCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIGEtPnN1YkVsZW1lbnREYXRhKHJzYywgeCwgZGF0YSwgZW9mZiwgc2l6ZUJ5dGVzKTsKIH0KIAogdm9pZCByc2lfQWxsb2NhdGlvbjJEU3ViRGF0YShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwgdWludDMyX3QgdywgdWludDMyX3QgaCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKLSAgICBhLT5zdWJEYXRhKHhvZmYsIHlvZmYsIHcsIGgsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgYS0+c3ViRGF0YShyc2MsIHhvZmYsIHlvZmYsIHcsIGgsIGRhdGEsIHNpemVCeXRlcyk7CiB9CiAKIHZvaWQgcnNpX0FsbG9jYXRpb25SZWFkKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB2b2lkICpkYXRhKQpAQCAtNjEzLDYgKzg1NSwyNyBAQAogICAgIGEtPnJlYWQoZGF0YSk7CiB9CiAKK3ZvaWQgcnNpX0FsbG9jYXRpb25SZXNpemUxRChDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgZGltWCkKK3sKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgYS0+cmVzaXplMUQocnNjLCBkaW1YKTsKK30KKwordm9pZCByc2lfQWxsb2NhdGlvblJlc2l6ZTJEKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKQoreworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBhLT5yZXNpemUyRChyc2MsIGRpbVgsIGRpbVkpOworfQorCitjb25zdCB2b2lkKiByc2lfQWxsb2NhdGlvbkdldFR5cGUoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEpCit7CisgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIGEtPmdldFR5cGUoKS0+aW5jVXNlclJlZigpOworCisgICAgcmV0dXJuIGEtPmdldFR5cGUoKTsKK30KKworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uaAppbmRleCA1MTZmOGI3Li4yNGUyNDVmIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKQEAgLTU1LDE0ICs1NSwyMyBAQAogICAgIHZvaWQgdXBsb2FkVG9CdWZmZXJPYmplY3QoY29uc3QgQ29udGV4dCAqcnNjKTsKICAgICB1aW50MzJfdCBnZXRCdWZmZXJPYmplY3RJRCgpIGNvbnN0IHtyZXR1cm4gbUJ1ZmZlcklEO30KIAorICAgIHZvaWQgY29weVJhbmdlMUQoQ29udGV4dCAqcnNjLCBjb25zdCBBbGxvY2F0aW9uICpzcmMsIGludDMyX3Qgc3JjT2ZmLCBpbnQzMl90IGRlc3RPZmYsIGludDMyX3QgbGVuKTsKIAotICAgIHZvaWQgZGF0YShjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpOwotICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKLSAgICB2b2lkIHN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwKKyAgICB2b2lkIHJlc2l6ZTFEKENvbnRleHQgKnJzYywgdWludDMyX3QgZGltWCk7CisgICAgdm9pZCByZXNpemUyRChDb250ZXh0ICpyc2MsIHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpOworCisgICAgdm9pZCBkYXRhKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKKyAgICB2b2lkIHN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKKyAgICB2b2lkIHN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpOwotICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB6b2ZmLAorICAgIHZvaWQgc3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHpvZmYsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7CiAKKyAgICB2b2lkIHN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGVsZW1lbnRPZmYsIHVpbnQzMl90IHNpemVCeXRlcyk7CisgICAgdm9pZCBzdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBlbGVtZW50T2ZmLCB1aW50MzJfdCBzaXplQnl0ZXMpOworCiAgICAgdm9pZCByZWFkKHZvaWQgKmRhdGEpOwogCiAgICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcnMoKSBjb25zdDsKQEAgLTcyLDEyICs4MSwyMiBAQAogICAgIHZvaWQgcmVtb3ZlUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FMTE9DQVRJT047IH0KKyAgICBzdGF0aWMgQWxsb2NhdGlvbiAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBsb2FkQ2hlY2soY29uc3QgQ29udGV4dCAqcnNjKTsKIAotcHJvdGVjdGVkOgotICAgIHZvaWQgc2VuZERpcnR5KCkgY29uc3Q7CisgICAgYm9vbCBnZXRJc1RleHR1cmUoKSBjb25zdCB7cmV0dXJuIG1Jc1RleHR1cmU7fQorICAgIGJvb2wgZ2V0SXNCdWZmZXJPYmplY3QoKSBjb25zdCB7cmV0dXJuIG1Jc1ZlcnRleEJ1ZmZlcjt9CiAKKyAgICB2b2lkIGluY1JlZnMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgY3QsIHNpemVfdCBzdGFydE9mZiA9IDApIGNvbnN0OworICAgIHZvaWQgZGVjUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCwgc2l6ZV90IHN0YXJ0T2ZmID0gMCkgY29uc3Q7CisKKyAgICB2b2lkIHNlbmREaXJ0eSgpIGNvbnN0OworICAgIGJvb2wgZ2V0SGFzR3JhcGhpY3NNaXBtYXBzKCkgY29uc3Qge3JldHVybiBtVGV4dHVyZUdlbk1pcG1hcDt9CisKK3Byb3RlY3RlZDoKICAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1UeXBlOwogICAgIHZvaWQgKiBtUHRyOwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcCBiL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNBbmltYXRpb24uaCIKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKK3ZvaWQgQW5pbWF0aW9uOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBbmltYXRpb24gKkFuaW1hdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKK0FuaW1hdGlvbjo6QW5pbWF0aW9uKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworCisgICAgbVZhbHVlc0lucHV0ID0gTlVMTDsKKyAgICBtVmFsdWVzT3V0cHV0ID0gTlVMTDsKKyAgICBtVmFsdWVDb3VudCA9IDA7CisgICAgbUludGVycG9sYXRpb24gPSBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQOworICAgIG1FZGdlUHJlID0gUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVEOworICAgIG1FZGdlUG9zdCA9IFJTX0FOSU1BVElPTl9FREdFX1VOREVGSU5FRDsKKyAgICBtSW5wdXRNaW4gPSAwOworICAgIG1JbnB1dE1heCA9IDA7Cit9CisKK0FuaW1hdGlvbiAqIEFuaW1hdGlvbjo6Y3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppblZhbHVlcywgY29uc3QgZmxvYXQgKm91dFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICBpZiAodmFsdWVDb3VudCA8IDIpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJBbmltYXRpb25zIHJlcXVpcmUgbW9yZSB0aGFuIDIgdmFsdWVzLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQW5pbWF0aW9uICphID0gbmV3IEFuaW1hdGlvbihyc2MpOworICAgIGlmICghYSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbG9hdCAqdmluID0gKGZsb2F0ICopbWFsbG9jKHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBmbG9hdCAqdm91dCA9IChmbG9hdCAqKW1hbGxvYyh2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bVZhbHVlc0lucHV0ID0gdmluOworICAgIGEtPm1WYWx1ZXNPdXRwdXQgPSB2b3V0OworICAgIGlmIChhLT5tVmFsdWVzSW5wdXQgPT0gTlVMTCB8fCBhLT5tVmFsdWVzT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIGE7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGEtPm1FZGdlUHJlID0gcHJlOworICAgIGEtPm1FZGdlUG9zdCA9IHBvc3Q7CisgICAgYS0+bUludGVycG9sYXRpb24gPSBpbnRlcnA7CisgICAgYS0+bVZhbHVlQ291bnQgPSB2YWx1ZUNvdW50OworCisgICAgbWVtY3B5KHZpbiwgaW5WYWx1ZXMsIHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1jcHkodm91dCwgb3V0VmFsdWVzLCB2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bUlucHV0TWluID0gaW5WYWx1ZXNbMF07CisgICAgYS0+bUlucHV0TWF4ID0gaW5WYWx1ZXNbMF07CisKKyAgICBib29sIG5lZWRTb3J0ID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKGEtPm1JbnB1dE1pbiA+IHZpbltjdF0pIHsKKyAgICAgICAgICAgIG5lZWRTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1pbiA9IHZpbltjdF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEtPm1JbnB1dE1heCA8IHZpbltjdF0pIHsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1heCA9IHZpbltjdF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZWVkU29ydCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIGlmICh2aW5bY3QtMV0gPiB2aW5bY3RdKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdCA9IHZpbltjdC0xXTsKKyAgICAgICAgICAgICAgICB2aW5bY3QtMV0gPSB2aW5bY3RdOworICAgICAgICAgICAgICAgIHZpbltjdF0gPSB0OworICAgICAgICAgICAgICAgIHQgPSB2b3V0W2N0LTFdOworICAgICAgICAgICAgICAgIHZvdXRbY3QtMV0gPSB2b3V0W2N0XTsKKyAgICAgICAgICAgICAgICB2b3V0W2N0XSA9IHQ7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VkKSBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gYTsKK30KKyovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0FuaW1hdGlvbiByc2lfQW5pbWF0aW9uQ3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqb3V0VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICAvL0xPR0UoInJzaV9FbGVtZW50Q3JlYXRlICVpICVpICVpICVpIiwgZHQsIGRrLCBub3JtLCB2ZWNTaXplKTsKKyAgICBBbmltYXRpb24gKmEgPSBOVUxMOy8vQW5pbWF0aW9uOjpjcmVhdGUocnNjLCBpblZhbHVlcywgb3V0VmFsdWVzLCB2YWx1ZUNvdW50LCBpbnRlcnAsIHByZSwgcG9zdCk7CisgICAgaWYgKGEgIT0gTlVMTCkgeworICAgICAgICBhLT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiAoUnNBbmltYXRpb24pYTsKK30KKworCit9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbmltYXRpb24uaCBiL2xpYnMvcnMvcnNBbmltYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDAzMTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQU5JTUFUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19BTklNQVRJT05fSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCisKK2NsYXNzIEFuaW1hdGlvbiA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgfkFuaW1hdGlvbigpOworCisgICAgc3RhdGljIEFuaW1hdGlvbiAqIGNyZWF0ZShDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW5WYWx1ZXMsIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LCBSc0FuaW1hdGlvbkludGVycG9sYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCk7CisKKyAgICBmbG9hdCBldmFsKGZsb2F0KSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTjsgfQorICAgIHN0YXRpYyBBbmltYXRpb24gKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCitwcm90ZWN0ZWQ6CisgICAgQW5pbWF0aW9uKENvbnRleHQgKnJzYyk7CisKKworCisgICAgZmxvYXQgZXZhbEluUmFuZ2UoZmxvYXQpIGNvbnN0OworCisKKworICAgIGNvbnN0IGZsb2F0ICptVmFsdWVzSW5wdXQ7CisgICAgY29uc3QgZmxvYXQgKm1WYWx1ZXNPdXRwdXQ7CisgICAgdWludDMyX3QgbVZhbHVlQ291bnQ7CisgICAgUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIG1JbnRlcnBvbGF0aW9uOworICAgIFJzQW5pbWF0aW9uRWRnZSBtRWRnZVByZTsKKyAgICBSc0FuaW1hdGlvbkVkZ2UgbUVkZ2VQb3N0OworCisgICAgLy8gZGVyaXZlZAorICAgIGZsb2F0IG1JbnB1dE1pbjsKKyAgICBmbG9hdCBtSW5wdXRNYXg7Cit9OworCisKKworCit9Cit9CisjZW5kaWYgLy9BTkRST0lEX1NUUlVDVFVSRURfRUxFTUVOVF9ICisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb21wb25lbnQuY3BwIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKaW5kZXggMTVhNTZmNy4uZjUxYjIzZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKKysrIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKQEAgLTE2LDcgKzE2LDExIEBACiAKICNpbmNsdWRlICJyc0NvbXBvbmVudC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTkxLDYgKzk1LDI2IEBACiAgICAgICAgIG1Ob3JtYWxpemVkID0gdHJ1ZTsKICAgICAgICAgcnNBc3NlcnQobUtpbmQgPT0gUlNfS0lORF9QSVhFTF9SR0JBKTsKICAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBSU19UWVBFX01BVFJJWF80WDQ6CisgICAgICAgIG1UeXBlQml0cyA9IDE2ICogMzI7CisgICAgICAgIHJzQXNzZXJ0KG1WZWN0b3JTaXplID09IDEpOworICAgICAgICByc0Fzc2VydChtTm9ybWFsaXplZCA9PSBmYWxzZSk7CisgICAgICAgIHJzQXNzZXJ0KG1LaW5kID09IFJTX0tJTkRfVVNFUik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfVFlQRV9NQVRSSVhfM1gzOgorICAgICAgICBtVHlwZUJpdHMgPSA5ICogMzI7CisgICAgICAgIHJzQXNzZXJ0KG1WZWN0b3JTaXplID09IDEpOworICAgICAgICByc0Fzc2VydChtTm9ybWFsaXplZCA9PSBmYWxzZSk7CisgICAgICAgIHJzQXNzZXJ0KG1LaW5kID09IFJTX0tJTkRfVVNFUik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfVFlQRV9NQVRSSVhfMlgyOgorICAgICAgICBtVHlwZUJpdHMgPSA0ICogMzI7CisgICAgICAgIHJzQXNzZXJ0KG1WZWN0b3JTaXplID09IDEpOworICAgICAgICByc0Fzc2VydChtTm9ybWFsaXplZCA9PSBmYWxzZSk7CisgICAgICAgIHJzQXNzZXJ0KG1LaW5kID09IFJTX0tJTkRfVVNFUik7CisgICAgICAgIGJyZWFrOworCiAgICAgY2FzZSBSU19UWVBFX0VMRU1FTlQ6CiAgICAgY2FzZSBSU19UWVBFX1RZUEU6CiAgICAgY2FzZSBSU19UWVBFX0FMTE9DQVRJT046CkBAIC0xNDgsMTEgKzE3MiwxOSBAQAogICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF82NDoKICAgICAgICAgbVR5cGVCaXRzID0gNjQ7CiAgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBSU19UWVBFX0JPT0xFQU46CisgICAgICAgIG1UeXBlQml0cyA9IDg7CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIG1CaXRzID0gbVR5cGVCaXRzICogbVZlY3RvclNpemU7CiB9CiAKK2Jvb2wgQ29tcG9uZW50Ojppc1JlZmVyZW5jZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtVHlwZSA+PSBSU19UWVBFX0VMRU1FTlQpOworfQogCiAKIApAQCAtMTg4LDgyICsyMjAsNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGdDVHlwZVN0cmluZ3NbXSA9IHsKLSAgICAwLAotICAgIDAsLy8iRjE2IiwKLSAgICAiZmxvYXQiLAotICAgICJkb3VibGUiLAotICAgICJjaGFyIiwKLSAgICAic2hvcnQiLAotICAgICJpbnQiLAotICAgIDAsLy8iUzY0IiwKLSAgICAiY2hhciIsLy9VOCIsCi0gICAgInNob3J0IiwvL1UxNiIsCi0gICAgImludCIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBnQ1ZlY1R5cGVTdHJpbmdzW10gPSB7Ci0gICAgMCwKLSAgICAwLC8vIkYxNiIsCi0gICAgInZlY0YzMiIsCi0gICAgInZlY0Y2NCIsCi0gICAgInZlY0k4IiwKLSAgICAidmVjSTE2IiwKLSAgICAidmVjSTMyIiwKLSAgICAwLC8vIlM2NCIsCi0gICAgInZlY1U4IiwvL1U4IiwKLSAgICAidmVjVTE2IiwvL1UxNiIsCi0gICAgInZlY1UzMiIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotU3RyaW5nOCBDb21wb25lbnQ6OmdldENUeXBlKCkgY29uc3QKLXsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKG1WZWN0b3JTaXplID09IDEpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoZ0NUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIH0KLQotICAgIC8vIFl1Y2ssIGFjYyBXQVIKLSAgICAvLyBBcHBlYXJzIHRvIGhhdmUgcHJvYmxlbXMgcGFja2luZyBjaGFycwotICAgIGlmIChtVmVjdG9yU2l6ZSA9PSA0ICYmIG1UeXBlID09IFJTX1RZUEVfVU5TSUdORURfOCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiaW50Iik7Ci0gICAgfQotCi0KLSAgICBTdHJpbmc4IHMoZ0NWZWNUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIHNwcmludGYoYnVmLCAiXyVpX3QiLCBtVmVjdG9yU2l6ZSk7Ci0gICAgcy5hcHBlbmQoYnVmKTsKLSAgICByZXR1cm4gczsKLX0KLQogU3RyaW5nOCBDb21wb25lbnQ6OmdldEdMU0xUeXBlKCkgY29uc3QKIHsKICAgICBpZiAobVR5cGUgPT0gUlNfVFlQRV9TSUdORURfMzIpIHsKQEAgLTI4MiwxMCArMjM4LDE5IEBACiAgICAgICAgIGNhc2UgNDogcmV0dXJuIFN0cmluZzgoInZlYzQiKTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoKG1UeXBlID09IFJTX1RZUEVfTUFUUklYXzRYNCkgJiYgKG1WZWN0b3JTaXplID09IDEpKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJtYXQ0Iik7CisgICAgfQorICAgIGlmICgobVR5cGUgPT0gUlNfVFlQRV9NQVRSSVhfM1gzKSAmJiAobVZlY3RvclNpemUgPT0gMSkpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIm1hdDMiKTsKKyAgICB9CisgICAgaWYgKChtVHlwZSA9PSBSU19UWVBFX01BVFJJWF8yWDIpICYmIChtVmVjdG9yU2l6ZSA9PSAxKSkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgibWF0MiIpOworICAgIH0KICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGdUeXBlU3RyaW5nc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBnVHlwZUJhc2ljU3RyaW5nc1tdID0gewogICAgICJOT05FIiwKICAgICAiRjE2IiwKICAgICAiRjMyIiwKQEAgLTI5OCw5ICsyNjMsMTYgQEAKICAgICAiVTE2IiwKICAgICAiVTMyIiwKICAgICAiVTY0IiwKKyAgICAiQk9PTEVBTiIsCiAgICAgIlVQXzU2NSIsCiAgICAgIlVQXzU1NTEiLAogICAgICJVUF80NDQ0IiwKKyAgICAiTUFUUklYXzRYNCIsCisgICAgIk1BVFJJWF8zWDMiLAorICAgICJNQVRSSVhfMlgyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogZ1R5cGVPYmpTdHJpbmdzW10gPSB7CiAgICAgIkVMRU1FTlQiLAogICAgICJUWVBFIiwKICAgICAiQUxMT0NBVElPTiIsCkBAIC0zMzAsOCArMzAyLDM0IEBACiAKIHZvaWQgQ29tcG9uZW50OjpkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0CiB7Ci0gICAgTE9HVigiJXMgICBDb21wb25lbnQ6ICVzLCAlcywgdmVjdG9yU2l6ZT0laSwgYml0cz0laSIsCi0gICAgICAgICBwcmVmaXgsIGdUeXBlU3RyaW5nc1ttVHlwZV0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CisgICAgaWYgKG1UeXBlID49IFJTX1RZUEVfRUxFTUVOVCkgeworICAgICAgICBMT0dWKCIlcyAgIENvbXBvbmVudDogJXMsICVzLCB2ZWN0b3JTaXplPSVpLCBiaXRzPSVpIiwKKyAgICAgICAgICAgICBwcmVmaXgsIGdUeXBlT2JqU3RyaW5nc1ttVHlwZSAtIFJTX1RZUEVfRUxFTUVOVF0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigiJXMgICBDb21wb25lbnQ6ICVzLCAlcywgdmVjdG9yU2l6ZT0laSwgYml0cz0laSIsCisgICAgICAgICAgICAgcHJlZml4LCBnVHlwZUJhc2ljU3RyaW5nc1ttVHlwZV0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CisgICAgfQogfQogCit2b2lkIENvbXBvbmVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1UeXBlKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1LaW5kKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtTm9ybWFsaXplZCA/IDEgOiAwKSk7CisgICAgc3RyZWFtLT5hZGRVMzIobVZlY3RvclNpemUpOworfQorCit2b2lkIENvbXBvbmVudDo6bG9hZEZyb21TdHJlYW0oSVN0cmVhbSAqc3RyZWFtKQoreworICAgIG1UeXBlID0gKFJzRGF0YVR5cGUpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtS2luZCA9IChSc0RhdGFLaW5kKXN0cmVhbS0+bG9hZFU4KCk7CisgICAgdWludDhfdCB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtTm9ybWFsaXplZCA9IHRlbXAgIT0gMDsKKyAgICBtVmVjdG9yU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgc2V0KG1UeXBlLCBtS2luZCwgbU5vcm1hbGl6ZWQsIG1WZWN0b3JTaXplKTsKK30KKworCisKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbXBvbmVudC5oIGIvbGlicy9ycy9yc0NvbXBvbmVudC5oCmluZGV4IDcxZGUzMjQuLmE3NzUwNTEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb21wb25lbnQuaAorKysgYi9saWJzL3JzL3JzQ29tcG9uZW50LmgKQEAgLTM1LDcgKzM1LDYgQEAKIAogICAgIHVpbnQzMl90IGdldEdMVHlwZSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldEdMRm9ybWF0KCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBnZXRDVHlwZSgpIGNvbnN0OwogICAgIFN0cmluZzggZ2V0R0xTTFR5cGUoKSBjb25zdDsKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CiAKQEAgLTQ4LDYgKzQ3LDEyIEBACiAgICAgYm9vbCBnZXRJc1NpZ25lZCgpIGNvbnN0IHtyZXR1cm4gbUlzU2lnbmVkO30KICAgICB1aW50MzJfdCBnZXRCaXRzKCkgY29uc3Qge3JldHVybiBtQml0czt9CiAKKyAgICAvLyBIZWxwZXJzIGZvciByZWFkaW5nIC8gd3JpdGluZyB0aGlzIGNsYXNzIG91dAorICAgIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdm9pZCBsb2FkRnJvbVN0cmVhbShJU3RyZWFtICpzdHJlYW0pOworCisgICAgYm9vbCBpc1JlZmVyZW5jZSgpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgUnNEYXRhVHlwZSBtVHlwZTsKICAgICBSc0RhdGFLaW5kIG1LaW5kOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHQuY3BwIGIvbGlicy9ycy9yc0NvbnRleHQuY3BwCmluZGV4IDU5NmY1MzMuLjMwYWRkNjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb250ZXh0LmNwcAorKysgYi9saWJzL3JzL3JzQ29udGV4dC5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCkBAIC0zMiw2ICszMyw4IEBACiAjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvc2NoZWRfcG9saWN5Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtODcsNyArOTAsNyBAQAogICAgIGNvbmZpZ0F0dHJpYnNQdHJbMF0gPSBFR0xfTk9ORTsKICAgICByc0Fzc2VydChjb25maWdBdHRyaWJzUHRyIDwgKGNvbmZpZ0F0dHJpYnMgKyAoc2l6ZW9mKGNvbmZpZ0F0dHJpYnMpIC8gc2l6ZW9mKEVHTGludCkpKSk7CiAKLSAgICBMT0dWKCJpbml0RUdMIHN0YXJ0Iik7CisgICAgTE9HVigiJXAgaW5pdEVHTCBzdGFydCIsIHRoaXMpOwogICAgIG1FR0wubURpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwogICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldERpc3BsYXkiKTsKIApAQCAtOTYsNyArOTksNyBAQAogCiAgICAgc3RhdHVzX3QgZXJyID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyhtRUdMLm1EaXNwbGF5LCBjb25maWdBdHRyaWJzLCBtV25kU3VyZmFjZSwgJm1FR0wubUNvbmZpZyk7CiAgICAgaWYgKGVycikgewotICAgICAgIExPR0UoImNvdWxkbid0IGZpbmQgYW4gRUdMQ29uZmlnIG1hdGNoaW5nIHRoZSBzY3JlZW4gZm9ybWF0XG4iKTsKKyAgICAgICBMT0dFKCIlcCwgY291bGRuJ3QgZmluZCBhbiBFR0xDb25maWcgbWF0Y2hpbmcgdGhlIHNjcmVlbiBmb3JtYXRcbiIsIHRoaXMpOwogICAgIH0KICAgICAvL2VnbENob29zZUNvbmZpZyhtRUdMLm1EaXNwbGF5LCBjb25maWdBdHRyaWJzLCAmbUVHTC5tQ29uZmlnLCAxLCAmbUVHTC5tTnVtQ29uZmlncyk7CiAKQEAgLTEwOCwxNCArMTExLDE0IEBACiAgICAgfQogICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKICAgICBpZiAobUVHTC5tQ29udGV4dCA9PSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICBMT0dFKCJlZ2xDcmVhdGVDb250ZXh0IHJldHVybmVkIEVHTF9OT19DT05URVhUIik7CisgICAgICAgIExPR0UoIiVwLCBlZ2xDcmVhdGVDb250ZXh0IHJldHVybmVkIEVHTF9OT19DT05URVhUIiwgdGhpcyk7CiAgICAgfQogICAgIGdHTENvbnRleHRDb3VudCsrOwogfQogCiB2b2lkIENvbnRleHQ6OmRlaW5pdEVHTCgpCiB7Ci0gICAgTE9HVigiZGVpbml0RUdMIik7CisgICAgTE9HVigiJXAsIGRlaW5pdEVHTCIsIHRoaXMpOwogICAgIHNldFN1cmZhY2UoMCwgMCwgTlVMTCk7CiAgICAgZWdsRGVzdHJveUNvbnRleHQobUVHTC5tRGlzcGxheSwgbUVHTC5tQ29udGV4dCk7CiAgICAgY2hlY2tFZ2xFcnJvcigiZWdsRGVzdHJveUNvbnRleHQiKTsKQEAgLTEyNywxOSArMTMwLDIxIEBACiB9CiAKIAotdWludDMyX3QgQ29udGV4dDo6cnVuU2NyaXB0KFNjcmlwdCAqcywgdWludDMyX3QgbGF1bmNoSUQpCit1aW50MzJfdCBDb250ZXh0OjpydW5TY3JpcHQoU2NyaXB0ICpzKQogewogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBmcmFnKG1GcmFnbWVudCk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiB2dHgobVZlcnRleCk7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gc3RvcmUobUZyYWdtZW50U3RvcmUpOworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBzdG9yZShtRnJhZ21lbnRTdG9yZSk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiByYXN0ZXIobVJhc3Rlcik7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBmb250KG1Gb250KTsKIAotICAgIHVpbnQzMl90IHJldCA9IHMtPnJ1bih0aGlzLCBsYXVuY2hJRCk7CisgICAgdWludDMyX3QgcmV0ID0gcy0+cnVuKHRoaXMpOwogCiAgICAgbUZyYWdtZW50LnNldChmcmFnKTsKICAgICBtVmVydGV4LnNldCh2dHgpOwogICAgIG1GcmFnbWVudFN0b3JlLnNldChzdG9yZSk7CiAgICAgbVJhc3Rlci5zZXQocmFzdGVyKTsKKyAgICBtRm9udC5zZXQoZm9udCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ3LDQyICsxNTIsMTkgQEAKIHsKICAgICBHTGVudW0gZXJyID0gZ2xHZXRFcnJvcigpOwogICAgIGlmIChlcnIgIT0gR0xfTk9fRVJST1IpIHsKLSAgICAgICAgTE9HRSgiR0wgRXJyb3IsIDB4JXgsIGZyb20gJXMiLCBlcnIsIG1zZyk7CisgICAgICAgIExPR0UoIiVwLCBHTCBFcnJvciwgMHgleCwgZnJvbSAlcyIsIHRoaXMsIGVyciwgbXNnKTsKICAgICB9CiB9CiAKIHVpbnQzMl90IENvbnRleHQ6OnJ1blJvb3RTY3JpcHQoKQogewotICAgIHRpbWVyU2V0KFJTX1RJTUVSX0NMRUFSX1NXQVApOwotICAgIHJzQXNzZXJ0KG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tSXNSb290KTsKLQotICAgIGVnbFF1ZXJ5U3VyZmFjZShtRUdMLm1EaXNwbGF5LCBtRUdMLm1TdXJmYWNlLCBFR0xfV0lEVEgsICZtRUdMLm1XaWR0aCk7Ci0gICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9IRUlHSFQsICZtRUdMLm1IZWlnaHQpOwotICAgIGdsVmlld3BvcnQoMCwgMCwgbUVHTC5tV2lkdGgsIG1FR0wubUhlaWdodCk7Ci0gICAgZ2xDb2xvck1hc2soR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSk7Ci0KLSAgICBnbENsZWFyQ29sb3IobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdLAotICAgICAgICAgICAgICAgICBtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMV0sCi0gICAgICAgICAgICAgICAgIG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSwKLSAgICAgICAgICAgICAgICAgbVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdKTsKLSAgICBpZiAobVVzZURlcHRoKSB7Ci0gICAgICAgIGdsRGVwdGhNYXNrKEdMX1RSVUUpOwotICAgICAgICBnbENsZWFyRGVwdGhmKG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJEZXB0aCk7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgfQorICAgIGdsVmlld3BvcnQoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKIAogICAgIHRpbWVyU2V0KFJTX1RJTUVSX1NDUklQVCk7CiAgICAgbVN0YXRlRnJhZ21lbnRTdG9yZS5tTGFzdC5jbGVhcigpOwotICAgIHVpbnQzMl90IHJldCA9IHJ1blNjcmlwdChtUm9vdFNjcmlwdC5nZXQoKSwgMCk7CisgICAgdWludDMyX3QgcmV0ID0gcnVuU2NyaXB0KG1Sb290U2NyaXB0LmdldCgpKTsKIAogICAgIGNoZWNrRXJyb3IoInJ1blJvb3RTY3JpcHQiKTsKLSAgICBpZiAobUVycm9yICE9IFJTX0VSUk9SX05PTkUpIHsKLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBlcnJvciBjb25kaXRpb24gd2Ugc3RvcCByZW5kZXJpbmcgdW50aWwKLSAgICAgICAgLy8gc29tdGhpbmcgY2hhbmdlcyB0aGF0IG1pZ2h0IGZpeCBpdC4KLSAgICAgICAgcmV0ID0gMDsKLSAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMjA2LDYgKzE4OCw5IEBACiAgICAgbVRpbWVGcmFtZSA9IG1UaW1lTGFzdDsKICAgICBtVGltZUxhc3RGcmFtZSA9IG1UaW1lTGFzdDsKICAgICBtVGltZXJBY3RpdmUgPSBSU19USU1FUl9JTlRFUk5BTDsKKyAgICBtQXZlcmFnZUZQU0ZyYW1lQ291bnQgPSAwOworICAgIG1BdmVyYWdlRlBTU3RhcnRUaW1lID0gbVRpbWVMYXN0OworICAgIG1BdmVyYWdlRlBTID0gMDsKICAgICB0aW1lclJlc2V0KCk7CiB9CiAKQEAgLTIxMyw2ICsxOTgsMTYgQEAKIHsKICAgICBtVGltZUxhc3RGcmFtZSA9IG1UaW1lRnJhbWU7CiAgICAgbVRpbWVGcmFtZSA9IGdldFRpbWUoKTsKKyAgICAvLyBVcGRhdGUgYXZlcmFnZSBmcHMKKyAgICBjb25zdCB1aW50NjRfdCBhdmVyYWdlRnJhbWVyYXRlSW50ZXJ2YWwgPSAxMDAwICogMTAwMDAwMDsKKyAgICBtQXZlcmFnZUZQU0ZyYW1lQ291bnQgKys7CisgICAgdWludDY0X3QgaW52ZXJ2YWwgPSBtVGltZUZyYW1lIC0gbUF2ZXJhZ2VGUFNTdGFydFRpbWU7CisgICAgaWYoaW52ZXJ2YWwgPj0gYXZlcmFnZUZyYW1lcmF0ZUludGVydmFsKSB7CisgICAgICAgIGludmVydmFsID0gaW52ZXJ2YWwgLyAxMDAwMDAwOworICAgICAgICBtQXZlcmFnZUZQUyA9IChtQXZlcmFnZUZQU0ZyYW1lQ291bnQgKiAxMDAwKSAvIGludmVydmFsOworICAgICAgICBtQXZlcmFnZUZQU0ZyYW1lQ291bnQgPSAwOworICAgICAgICBtQXZlcmFnZUZQU1N0YXJ0VGltZSA9IG1UaW1lRnJhbWU7CisgICAgfQogfQogCiB2b2lkIENvbnRleHQ6OnRpbWVyU2V0KFRpbWVycyB0bSkKQEAgLTIzNiwzNyArMjMxLDM0IEBACiAKIAogICAgIGlmIChwcm9wcy5tTG9nVGltZXMpIHsKLSAgICAgICAgTE9HVigiUlM6IEZyYW1lICglaSksICAgU2NyaXB0ICUyLjFmICglaSksICBDbGVhciAmIFN3YXAgJTIuMWYgKCVpKSwgIElkbGUgJTIuMWYgKCVsbGkpLCAgSW50ZXJuYWwgJTIuMWYgKCVsbGkpIiwKKyAgICAgICAgTE9HVigiUlM6IEZyYW1lICglaSksICAgU2NyaXB0ICUyLjFmICglaSksICBDbGVhciAmIFN3YXAgJTIuMWYgKCVpKSwgIElkbGUgJTIuMWYgKCVsbGkpLCAgSW50ZXJuYWwgJTIuMWYgKCVsbGkpLCBBdmcgZnBzOiAldSIsCiAgICAgICAgICAgICAgbVRpbWVNU0xhc3RGcmFtZSwKICAgICAgICAgICAgICAxMDAuMCAqIG1UaW1lcnNbUlNfVElNRVJfU0NSSVBUXSAvIHRvdGFsLCBtVGltZU1TTGFzdFNjcmlwdCwKICAgICAgICAgICAgICAxMDAuMCAqIG1UaW1lcnNbUlNfVElNRVJfQ0xFQVJfU1dBUF0gLyB0b3RhbCwgbVRpbWVNU0xhc3RTd2FwLAogICAgICAgICAgICAgIDEwMC4wICogbVRpbWVyc1tSU19USU1FUl9JRExFXSAvIHRvdGFsLCBtVGltZXJzW1JTX1RJTUVSX0lETEVdIC8gMTAwMDAwMCwKLSAgICAgICAgICAgICAxMDAuMCAqIG1UaW1lcnNbUlNfVElNRVJfSU5URVJOQUxdIC8gdG90YWwsIG1UaW1lcnNbUlNfVElNRVJfSU5URVJOQUxdIC8gMTAwMDAwMCk7CisgICAgICAgICAgICAgMTAwLjAgKiBtVGltZXJzW1JTX1RJTUVSX0lOVEVSTkFMXSAvIHRvdGFsLCBtVGltZXJzW1JTX1RJTUVSX0lOVEVSTkFMXSAvIDEwMDAwMDAsCisgICAgICAgICAgICAgbUF2ZXJhZ2VGUFMpOwogICAgIH0KIH0KIAogYm9vbCBDb250ZXh0OjpzZXR1cENoZWNrKCkKIHsKLSAgICBpZiAoY2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgaWYgKCFtU2hhZGVyQ2FjaGUubG9va3VwKHRoaXMsIG1WZXJ0ZXguZ2V0KCksIG1GcmFnbWVudC5nZXQoKSkpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6OnNldHVwQ2hlY2soKSAxIGZhaWwiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1GcmFnbWVudFN0b3JlLT5zZXR1cEdMMih0aGlzLCAmbVN0YXRlRnJhZ21lbnRTdG9yZSk7Ci0gICAgICAgIG1GcmFnbWVudC0+c2V0dXBHTDIodGhpcywgJm1TdGF0ZUZyYWdtZW50LCAmbVNoYWRlckNhY2hlKTsKLSAgICAgICAgbVJhc3Rlci0+c2V0dXBHTDIodGhpcywgJm1TdGF0ZVJhc3Rlcik7Ci0gICAgICAgIG1WZXJ0ZXgtPnNldHVwR0wyKHRoaXMsICZtU3RhdGVWZXJ0ZXgsICZtU2hhZGVyQ2FjaGUpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgbUZyYWdtZW50U3RvcmUtPnNldHVwR0wodGhpcywgJm1TdGF0ZUZyYWdtZW50U3RvcmUpOwotICAgICAgICBtRnJhZ21lbnQtPnNldHVwR0wodGhpcywgJm1TdGF0ZUZyYWdtZW50KTsKLSAgICAgICAgbVJhc3Rlci0+c2V0dXBHTCh0aGlzLCAmbVN0YXRlUmFzdGVyKTsKLSAgICAgICAgbVZlcnRleC0+c2V0dXBHTCh0aGlzLCAmbVN0YXRlVmVydGV4KTsKKyAgICBpZiAoIW1TaGFkZXJDYWNoZS5sb29rdXAodGhpcywgbVZlcnRleC5nZXQoKSwgbUZyYWdtZW50LmdldCgpKSkgeworICAgICAgICBMT0dFKCJDb250ZXh0OjpzZXR1cENoZWNrKCkgMSBmYWlsIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisKKyAgICBtRnJhZ21lbnRTdG9yZS0+c2V0dXBHTDIodGhpcywgJm1TdGF0ZUZyYWdtZW50U3RvcmUpOworICAgIG1GcmFnbWVudC0+c2V0dXBHTDIodGhpcywgJm1TdGF0ZUZyYWdtZW50LCAmbVNoYWRlckNhY2hlKTsKKyAgICBtUmFzdGVyLT5zZXR1cEdMMih0aGlzLCAmbVN0YXRlUmFzdGVyKTsKKyAgICBtVmVydGV4LT5zZXR1cEdMMih0aGlzLCAmbVN0YXRlVmVydGV4LCAmbVNoYWRlckNhY2hlKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCBDb250ZXh0OjpzZXR1cFByb2dyYW1TdG9yZSgpIHsKKyAgICBtRnJhZ21lbnRTdG9yZS0+c2V0dXBHTDIodGhpcywgJm1TdGF0ZUZyYWdtZW50U3RvcmUpOworfQorCiBzdGF0aWMgYm9vbCBnZXRQcm9wKGNvbnN0IGNoYXIgKnN0cikKIHsKICAgICBjaGFyIGJ1ZltQUk9QRVJUWV9WQUxVRV9NQVhdOwpAQCAtMjc0LDYgKzI2NiwyNCBAQAogICAgIHJldHVybiAwICE9IHN0cmNtcChidWYsICIwIik7CiB9CiAKK3ZvaWQgQ29udGV4dDo6ZGlzcGxheURlYnVnU3RhdHMoKQoreworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgc3ByaW50ZihidWZmZXIsICJBdmcgZnBzICV1LCBGcmFtZSAlaSBtcywgU2NyaXB0ICVpIG1zIiwgbUF2ZXJhZ2VGUFMsIG1UaW1lTVNMYXN0RnJhbWUsIG1UaW1lTVNMYXN0U2NyaXB0KTsKKyAgICBmbG9hdCBvbGRSLCBvbGRHLCBvbGRCLCBvbGRBOworICAgIG1TdGF0ZUZvbnQuZ2V0Rm9udENvbG9yKCZvbGRSLCAmb2xkRywgJm9sZEIsICZvbGRBKTsKKyAgICB1aW50MzJfdCBidWZmZXJMZW4gPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIGZsb2F0IHNoYWRvd0NvbCA9IDAuMWY7CisgICAgbVN0YXRlRm9udC5zZXRGb250Q29sb3Ioc2hhZG93Q29sLCBzaGFkb3dDb2wsIHNoYWRvd0NvbCwgMS4wZik7CisgICAgbVN0YXRlRm9udC5yZW5kZXJUZXh0KGJ1ZmZlciwgYnVmZmVyTGVuLCA1LCBnZXRIZWlnaHQoKSAtIDYpOworCisgICAgbVN0YXRlRm9udC5zZXRGb250Q29sb3IoMS4wZiwgMC43ZiwgMC4wZiwgMS4wZik7CisgICAgbVN0YXRlRm9udC5yZW5kZXJUZXh0KGJ1ZmZlciwgYnVmZmVyTGVuLCA0LCBnZXRIZWlnaHQoKSAtIDcpOworCisgICAgbVN0YXRlRm9udC5zZXRGb250Q29sb3Iob2xkUiwgb2xkRywgb2xkQiwgb2xkQSk7Cit9CisKIHZvaWQgKiBDb250ZXh0Ojp0aHJlYWRQcm9jKHZvaWQgKnZyc2MpCiB7CiAgICAgIENvbnRleHQgKnJzYyA9IHN0YXRpY19jYXN0PENvbnRleHQgKj4odnJzYyk7CkBAIC0yODYsMjggKzI5NiwzNCBAQAogICAgICByc2MtPnByb3BzLm1Mb2dTY3JpcHRzID0gZ2V0UHJvcCgiZGVidWcucnMuc2NyaXB0Iik7CiAgICAgIHJzYy0+cHJvcHMubUxvZ09iamVjdHMgPSBnZXRQcm9wKCJkZWJ1Zy5ycy5vYmplY3QiKTsKICAgICAgcnNjLT5wcm9wcy5tTG9nU2hhZGVycyA9IGdldFByb3AoImRlYnVnLnJzLnNoYWRlciIpOworICAgICByc2MtPnByb3BzLm1Mb2dTaGFkZXJzQXR0ciA9IGdldFByb3AoImRlYnVnLnJzLnNoYWRlci5hdHRyaWJ1dGVzIik7CisgICAgIHJzYy0+cHJvcHMubUxvZ1NoYWRlcnNVbmlmb3JtcyA9IGdldFByb3AoImRlYnVnLnJzLnNoYWRlci51bmlmb3JtcyIpOworICAgICByc2MtPnByb3BzLm1Mb2dWaXN1YWwgPSBnZXRQcm9wKCJkZWJ1Zy5ycy52aXN1YWwiKTsKIAotICAgICBTY3JpcHRUTFNTdHJ1Y3QgKnRsc1N0cnVjdCA9IG5ldyBTY3JpcHRUTFNTdHJ1Y3Q7Ci0gICAgIGlmICghdGxzU3RydWN0KSB7CisgICAgIHJzYy0+bVRsc1N0cnVjdCA9IG5ldyBTY3JpcHRUTFNTdHJ1Y3Q7CisgICAgIGlmICghcnNjLT5tVGxzU3RydWN0KSB7CiAgICAgICAgICBMT0dFKCJFcnJvciBhbGxvY2F0aW5nIHRscyBzdG9yYWdlIik7CiAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQotICAgICB0bHNTdHJ1Y3QtPm1Db250ZXh0ID0gcnNjOwotICAgICB0bHNTdHJ1Y3QtPm1TY3JpcHQgPSBOVUxMOwotICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9zZXRzcGVjaWZpYyhyc2MtPmdUaHJlYWRUTFNLZXksIHRsc1N0cnVjdCk7CisgICAgIHJzYy0+bVRsc1N0cnVjdC0+bUNvbnRleHQgPSByc2M7CisgICAgIHJzYy0+bVRsc1N0cnVjdC0+bVNjcmlwdCA9IE5VTEw7CisgICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX3NldHNwZWNpZmljKHJzYy0+Z1RocmVhZFRMU0tleSwgcnNjLT5tVGxzU3RydWN0KTsKICAgICAgaWYgKHN0YXR1cykgewogICAgICAgICAgTE9HRSgicHRocmVhZF9zZXRzcGVjaWZpYyAlaSIsIHN0YXR1cyk7CiAgICAgIH0KIAorICAgICByc2MtPm1TY3JpcHRDLmluaXQocnNjKTsKICAgICAgaWYgKHJzYy0+bUlzR3JhcGhpY3NDb250ZXh0KSB7Ci0gICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVSYXN0ZXIuaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRSYXN0ZXIoTlVMTCk7Ci0gICAgICAgICByc2MtPm1TdGF0ZVZlcnRleC5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVWZXJ0ZXguaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRWZXJ0ZXgoTlVMTCk7Ci0gICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50LmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50LmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0RnJhZ21lbnQoTlVMTCk7Ci0gICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUuaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldEZyYWdtZW50U3RvcmUoTlVMTCk7CisgICAgICAgICByc2MtPm1TdGF0ZUZvbnQuaW5pdChyc2MpOworICAgICAgICAgcnNjLT5zZXRGb250KE5VTEwpOwogICAgICAgICAgcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheS5pbml0KHJzYyk7CiAgICAgIH0KIApAQCAtMzIxLDYgKzMzNywxMSBAQAogICAgICAgICAgdWludDMyX3QgdGFyZ2V0VGltZSA9IDA7CiAgICAgICAgICBpZiAobURyYXcgJiYgcnNjLT5tSXNHcmFwaGljc0NvbnRleHQpIHsKICAgICAgICAgICAgICB0YXJnZXRUaW1lID0gcnNjLT5ydW5Sb290U2NyaXB0KCk7CisKKyAgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dWaXN1YWwpIHsKKyAgICAgICAgICAgICAgICAgcnNjLT5kaXNwbGF5RGVidWdTdGF0cygpOworICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgIG1EcmF3ID0gdGFyZ2V0VGltZSAmJiAhcnNjLT5tUGF1c2VkOwogICAgICAgICAgICAgIHJzYy0+dGltZXJTZXQoUlNfVElNRVJfQ0xFQVJfU1dBUCk7CiAgICAgICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMocnNjLT5tRUdMLm1EaXNwbGF5LCByc2MtPm1FR0wubVN1cmZhY2UpOwpAQCAtMzI5LDkgKzM1MCw2IEBACiAgICAgICAgICAgICAgcnNjLT50aW1lclByaW50KCk7CiAgICAgICAgICAgICAgcnNjLT50aW1lclJlc2V0KCk7CiAgICAgICAgICB9Ci0gICAgICAgICBpZiAocnNjLT5tT2JqRGVzdHJveS5tTmVlZFRvRW1wdHkpIHsKLSAgICAgICAgICAgICByc2MtPm9iakRlc3Ryb3lPT0JSdW4oKTsKLSAgICAgICAgIH0KICAgICAgICAgIGlmIChyc2MtPm1UaHJlYWRQcmlvcml0eSA+IDAgJiYgdGFyZ2V0VGltZSkgewogICAgICAgICAgICAgIGludDMyX3QgdCA9ICh0YXJnZXRUaW1lIC0gKGludDMyX3QpKHJzYy0+bVRpbWVNU0xhc3RTY3JpcHQgKyByc2MtPm1UaW1lTVNMYXN0U3dhcCkpICogMTAwMDsKICAgICAgICAgICAgICBpZiAodCA+IDApIHsKQEAgLTM0MCwzMyArMzU4LDg1IEBACiAgICAgICAgICB9CiAgICAgIH0KIAotICAgICBMT0dWKCJSUyBUaHJlYWQgZXhpdGluZyIpOworICAgICBMT0dWKCIlcCwgUlMgVGhyZWFkIGV4aXRpbmciLCByc2MpOwogICAgICBpZiAocnNjLT5tSXNHcmFwaGljc0NvbnRleHQpIHsKICAgICAgICAgIHJzYy0+bVJhc3Rlci5jbGVhcigpOwogICAgICAgICAgcnNjLT5tRnJhZ21lbnQuY2xlYXIoKTsKICAgICAgICAgIHJzYy0+bVZlcnRleC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tRnJhZ21lbnRTdG9yZS5jbGVhcigpOworICAgICAgICAgcnNjLT5tRm9udC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tUm9vdFNjcmlwdC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tU3RhdGVSYXN0ZXIuZGVpbml0KHJzYyk7CiAgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleC5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuZGVpbml0KHJzYyk7CiAgICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUuZGVpbml0KHJzYyk7CisgICAgICAgICByc2MtPm1TdGF0ZUZvbnQuZGVpbml0KHJzYyk7CiAgICAgIH0KICAgICAgT2JqZWN0QmFzZTo6emVyb0FsbFVzZXJSZWYocnNjKTsKIAotICAgICByc2MtPm1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IHRydWU7Ci0gICAgIHJzYy0+b2JqRGVzdHJveU9PQlJ1bigpOwotCiAgICAgIGlmIChyc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewogICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnSW5pdE11dGV4KTsKICAgICAgICAgIHJzYy0+ZGVpbml0RUdMKCk7CiAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0luaXRNdXRleCk7CiAgICAgIH0KKyAgICAgZGVsZXRlIHJzYy0+bVRsc1N0cnVjdDsKIAotICAgICBMT0dWKCJSUyBUaHJlYWQgZXhpdGVkIik7CisgICAgIExPR1YoIiVwLCBSUyBUaHJlYWQgZXhpdGVkIiwgcnNjKTsKICAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3ZvaWQgKiBDb250ZXh0OjpoZWxwZXJUaHJlYWRQcm9jKHZvaWQgKnZyc2MpCit7CisgICAgIENvbnRleHQgKnJzYyA9IHN0YXRpY19jYXN0PENvbnRleHQgKj4odnJzYyk7CisgICAgIHVpbnQzMl90IGlkeCA9ICh1aW50MzJfdClhbmRyb2lkX2F0b21pY19pbmMoJnJzYy0+bVdvcmtlcnMubUxhdW5jaENvdW50KTsKKworICAgICBMT0dWKCJSUyBoZWxwZXJUaHJlYWQgc3RhcnRpbmcgJXAgaWR4PSVpIiwgcnNjLCBpZHgpOworCisgICAgIHJzYy0+bVdvcmtlcnMubUxhdW5jaFNpZ25hbHNbaWR4XS5pbml0KCk7CisgICAgIHJzYy0+bVdvcmtlcnMubU5hdGl2ZVRocmVhZElkW2lkeF0gPSBnZXR0aWQoKTsKKworI2lmIDAKKyAgICAgdHlwZWRlZiBzdHJ1Y3Qge3VpbnQ2NF90IGJpdHNbMTAyNCAvIDY0XTsgfSBjcHVfc2V0X3Q7CisgICAgIGNwdV9zZXRfdCBjcHVzZXQ7CisgICAgIG1lbXNldCgmY3B1c2V0LCAwLCBzaXplb2YoY3B1c2V0KSk7CisgICAgIGNwdXNldC5iaXRzW2lkeCAvIDY0XSB8PSAxVUxMIDw8IChpZHggJSA2NCk7CisgICAgIGludCByZXQgPSBzeXNjYWxsKDI0MSwgcnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSwKKyAgICAgICAgICAgICAgIHNpemVvZihjcHVzZXQpLCAmY3B1c2V0KTsKKyAgICAgTE9HRSgiU0VUQUZGSU5JVFkgcmV0ID0gJWkgJXMiLCByZXQsIEVHTFV0aWxzOjpzdHJlcnJvcihyZXQpKTsKKyNlbmRpZgorCisgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgcnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSwgcnNjLT5tVGhyZWFkUHJpb3JpdHkpOworICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9zZXRzcGVjaWZpYyhyc2MtPmdUaHJlYWRUTFNLZXksIHJzYy0+bVRsc1N0cnVjdCk7CisgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgIExPR0UoInB0aHJlYWRfc2V0c3BlY2lmaWMgJWkiLCBzdGF0dXMpOworICAgICB9CisKKyAgICAgd2hpbGUocnNjLT5tUnVubmluZykgeworICAgICAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tpZHhdLndhaXQoKTsKKyAgICAgICAgIGlmIChyc2MtPm1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjaykgeworICAgICAgICAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2socnNjLT5tV29ya2Vycy5tTGF1bmNoRGF0YSwgaWR4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGFuZHJvaWRfYXRvbWljX2RlYygmcnNjLT5tV29ya2Vycy5tUnVubmluZ0NvdW50KTsKKyAgICAgICAgIHJzYy0+bVdvcmtlcnMubUNvbXBsZXRlU2lnbmFsLnNldCgpOworICAgICB9CisKKyAgICAgTE9HVigiUlMgaGVscGVyVGhyZWFkIGV4aXRpbmcgJXAgaWR4PSVpIiwgcnNjLCBpZHgpOworICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDb250ZXh0OjpsYXVuY2hUaHJlYWRzKFdvcmtlckNhbGxiYWNrX3QgY2JrLCB2b2lkICpkYXRhKQoreworICAgIG1Xb3JrZXJzLm1MYXVuY2hEYXRhID0gZGF0YTsKKyAgICBtV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2sgPSBjYms7CisgICAgbVdvcmtlcnMubVJ1bm5pbmdDb3VudCA9IChpbnQpbVdvcmtlcnMubUNvdW50OworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBtV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tjdF0uc2V0KCk7CisgICAgfQorICAgIHdoaWxlKG1Xb3JrZXJzLm1SdW5uaW5nQ291bnQpIHsKKyAgICAgICAgbVdvcmtlcnMubUNvbXBsZXRlU2lnbmFsLndhaXQoKTsKKyAgICB9Cit9CisKIHZvaWQgQ29udGV4dDo6c2V0UHJpb3JpdHkoaW50MzJfdCBwKQogewogICAgIC8vIE5vdGU6IElmIHdlIHB1dCB0aGlzIGluIHRoZSBwcm9wZXIgImJhY2tncm91bmQiIHBvbGljeQpAQCAtMzgzLDcgKzQ1MywxMCBAQAogICAgICAgICAvLyBzdWNjZXNzOyByZXNldCB0aGUgcHJpb3JpdHkgYXMgd2VsbAogICAgIH0KICNlbHNlCi0gICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgbU5hdGl2ZVRocmVhZElkLCBwKTsKKyAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1OYXRpdmVUaHJlYWRJZCwgcCk7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZFtjdF0sIHApOworICAgIH0KICNlbmRpZgogfQogCkBAIC00MjksMjAgKzUwMiw0MCBAQAogCiAgICAgbVduZFN1cmZhY2UgPSBOVUxMOwogCi0gICAgb2JqRGVzdHJveU9PQkluaXQoKTsKICAgICB0aW1lckluaXQoKTsKICAgICB0aW1lclNldChSU19USU1FUl9JTlRFUk5BTCk7CiAKLSAgICBMT0dWKCJSUyBMYXVuY2hpbmcgdGhyZWFkIik7CisgICAgaW50IGNwdSA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworICAgIExPR1YoIlJTIExhdW5jaGluZyB0aHJlYWQocyksIHJlcG9ydGVkIENQVSBjb3VudCAlaSIsIGNwdSk7CisgICAgaWYgKGNwdSA8IDIpIGNwdSA9IDA7CisKKyAgICBtV29ya2Vycy5tQ291bnQgPSAodWludDMyX3QpY3B1OworICAgIG1Xb3JrZXJzLm1UaHJlYWRJZCA9IChwdGhyZWFkX3QgKikgY2FsbG9jKG1Xb3JrZXJzLm1Db3VudCwgc2l6ZW9mKHB0aHJlYWRfdCkpOworICAgIG1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZCA9IChwaWRfdCAqKSBjYWxsb2MobVdvcmtlcnMubUNvdW50LCBzaXplb2YocGlkX3QpKTsKKyAgICBtV29ya2Vycy5tTGF1bmNoU2lnbmFscyA9IG5ldyBTaWduYWxbbVdvcmtlcnMubUNvdW50XTsKKyAgICBtV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2sgPSBOVUxMOwogICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkSWQsICZ0aHJlYWRBdHRyLCB0aHJlYWRQcm9jLCB0aGlzKTsKICAgICBpZiAoc3RhdHVzKSB7CiAgICAgICAgIExPR0UoIkZhaWxlZCB0byBzdGFydCBycyBjb250ZXh0IHRocmVhZC4iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLQogICAgIHdoaWxlKCFtUnVubmluZykgewogICAgICAgICB1c2xlZXAoMTAwKTsKICAgICB9CiAKKyAgICBtV29ya2Vycy5tQ29tcGxldGVTaWduYWwuaW5pdCgpOworICAgIG1Xb3JrZXJzLm1SdW5uaW5nQ291bnQgPSAwOworICAgIG1Xb3JrZXJzLm1MYXVuY2hDb3VudCA9IDA7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmbVdvcmtlcnMubVRocmVhZElkW2N0XSwgJnRocmVhZEF0dHIsIGhlbHBlclRocmVhZFByb2MsIHRoaXMpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBtV29ya2Vycy5tQ291bnQgPSBjdDsKKyAgICAgICAgICAgIExPR0UoIkNyZWF0ZWQgZmV3ZXIgdGhhbiBleHBlY3RlZCBudW1iZXIgb2YgUlMgdGhyZWFkcy4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisKICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkQXR0cik7CiB9CiAKQEAgLTQ1NSw4ICs1NDgsNiBAQAogCiAgICAgbUlPLnNodXRkb3duKCk7CiAgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfam9pbihtVGhyZWFkSWQsICZyZXMpOwotICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IHRydWU7Ci0gICAgb2JqRGVzdHJveU9PQlJ1bigpOwogCiAgICAgLy8gR2xvYmFsIHN0cnVjdHVyZSBjbGVhbnVwLgogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7CkBAIC00NjksOCArNTYwLDYgQEAKICAgICAgICAgbURldiA9IE5VTEw7CiAgICAgfQogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKLQotICAgIG9iakRlc3Ryb3lPT0JEZXN0cm95KCk7CiB9CiAKIHZvaWQgQ29udGV4dDo6c2V0U3VyZmFjZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBBTmF0aXZlV2luZG93ICpzdXIpCkBAIC00ODYsMTQgKzU3NSwxNCBAQAogICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xEZXN0cm95U3VyZmFjZSIsIHJldCk7CiAKICAgICAgICAgbUVHTC5tU3VyZmFjZSA9IE5VTEw7Ci0gICAgICAgIG1FR0wubVdpZHRoID0gMDsKLSAgICAgICAgbUVHTC5tSGVpZ2h0ID0gMDsKICAgICAgICAgbVdpZHRoID0gMDsKICAgICAgICAgbUhlaWdodCA9IDA7CiAgICAgfQogCiAgICAgbVduZFN1cmZhY2UgPSBzdXI7CiAgICAgaWYgKG1XbmRTdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgbVdpZHRoID0gdzsKKyAgICAgICAgbUhlaWdodCA9IGg7CiAgICAgICAgIGJvb2wgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgaWYgKCFtRUdMLm1Db250ZXh0KSB7CiAgICAgICAgICAgICBmaXJzdCA9IHRydWU7CkBAIC01MTEsMTUgKzYwMCw3IEBACiAgICAgICAgIHJldCA9IGVnbE1ha2VDdXJyZW50KG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIG1FR0wubVN1cmZhY2UsIG1FR0wubUNvbnRleHQpOwogICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xNYWtlQ3VycmVudCIsIHJldCk7CiAKLSAgICAgICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICAgICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9IRUlHSFQsICZtRUdMLm1IZWlnaHQpOwotICAgICAgICBtV2lkdGggPSB3OwotICAgICAgICBtSGVpZ2h0ID0gaDsKLSAgICAgICAgbVN0YXRlVmVydGV4LnVwZGF0ZVNpemUodGhpcywgdywgaCk7Ci0KLSAgICAgICAgaWYgKChpbnQpbVdpZHRoICE9IG1FR0wubVdpZHRoIHx8IChpbnQpbUhlaWdodCAhPSBtRUdMLm1IZWlnaHQpIHsKLSAgICAgICAgICAgIExPR0UoIkVHTC9TdXJmYWNlIG1pc21hdGNoICBFR0wgKCVpIHggJWkpICBTRiAoJWkgeCAlaSkiLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0LCBtV2lkdGgsIG1IZWlnaHQpOwotICAgICAgICB9CisgICAgICAgIG1TdGF0ZVZlcnRleC51cGRhdGVTaXplKHRoaXMpOwogCiAgICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICAgICAgbUdMLm1WZXJzaW9uID0gZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTik7CkBAIC01NjAsNiArNjQxLDExIEBACiAgICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMsICZtR0wubU1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMpOwogCiAgICAgICAgICAgICBtR0wuT0VTX3RleHR1cmVfbnBvdCA9IE5VTEwgIT0gc3Ryc3RyKChjb25zdCBjaGFyICopbUdMLm1FeHRlbnNpb25zLCAiR0xfT0VTX3RleHR1cmVfbnBvdCIpOworICAgICAgICAgICAgbUdMLkVYVF90ZXh0dXJlX21heF9hbmlzbyA9IDEuMGY7CisgICAgICAgICAgICBib29sIGhhc0FuaXNvID0gTlVMTCAhPSBzdHJzdHIoKGNvbnN0IGNoYXIgKiltR0wubUV4dGVuc2lvbnMsICJHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTsKKyAgICAgICAgICAgIGlmKGhhc0FuaXNvKSB7CisgICAgICAgICAgICAgICAgZ2xHZXRGbG9hdHYoR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCAmbUdMLkVYVF90ZXh0dXJlX21heF9hbmlzbyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgIH0KQEAgLTU4Myw3ICs2NjksNyBAQAogICAgIG1Sb290U2NyaXB0LnNldChzKTsKIH0KIAotdm9pZCBDb250ZXh0OjpzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMpCit2b2lkIENvbnRleHQ6OnNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbVN0b3JlICpwZnMpCiB7CiAgICAgcnNBc3NlcnQobUlzR3JhcGhpY3NDb250ZXh0KTsKICAgICBpZiAocGZzID09IE5VTEwpIHsKQEAgLTYyMyw2ICs3MDksMTYgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ29udGV4dDo6c2V0Rm9udChGb250ICpmKQoreworICAgIHJzQXNzZXJ0KG1Jc0dyYXBoaWNzQ29udGV4dCk7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBtRm9udC5zZXQobVN0YXRlRm9udC5tRGVmYXVsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZvbnQuc2V0KGYpOworICAgIH0KK30KKwogdm9pZCBDb250ZXh0Ojphc3NpZ25OYW1lKE9iamVjdEJhc2UgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKQogewogICAgIHJzQXNzZXJ0KCFvYmotPmdldE5hbWUoKSk7CkBAIC02NDAsOTAgKzczNiwxMyBAQAogICAgIH0KIH0KIAotT2JqZWN0QmFzZSAqIENvbnRleHQ6Omxvb2t1cE5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKLXsKLSAgICBmb3Ioc2l6ZV90IGN0PTA7IGN0IDwgbU5hbWVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBtTmFtZXNbY3RdLT5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWVzW2N0XTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBDb250ZXh0OjphcHBlbmROYW1lRGVmaW5lcyhTdHJpbmc4ICpzdHIpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1OYW1lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgTkFNRURfIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1OYW1lc1tjdF0tPmdldE5hbWUoKSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbU5hbWVzW2N0XSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotfQotCi1ib29sIENvbnRleHQ6Om9iakRlc3Ryb3lPT0JJbml0KCkKLXsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtT2JqRGVzdHJveS5tTXV0ZXgsIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiQ29udGV4dDo6T2JqRGVzdHJveU9PQkluaXQgbXV0ZXggaW5pdCBmYWlsdXJlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ29udGV4dDo6b2JqRGVzdHJveU9PQlJ1bigpCi17Ci0gICAgaWYgKG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSkgewotICAgICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSBsb2NraW5nIGZvciBPT0JSdW4uIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoc2l6ZV90IGN0ID0gMDsgY3QgPCBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3Quc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgICAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3RbY3RdLT5kZWNVc2VyUmVmKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbU9iakRlc3Ryb3kubURlc3Ryb3lMaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IGZhbHNlOwotCi0gICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95T09CRGVzdHJveSgpCi17Ci0gICAgcnNBc3NlcnQoIW1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotfQotCi12b2lkIENvbnRleHQ6Om9iakRlc3Ryb3lBZGQoT2JqZWN0QmFzZSAqb2JqKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSBsb2NraW5nIGZvciBPT0JSdW4uIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IHRydWU7Ci0gICAgbU9iakRlc3Ryb3kubURlc3Ryb3lMaXN0LmFkZChvYmopOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci19Ci0KIHVpbnQzMl90IENvbnRleHQ6OmdldE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCkKIHsKICAgICAvL0xPR0UoImdldE1lc3NhZ2VUb0NsaWVudCAlaSAlaSIsIGJ1ZmZlckxlbiwgd2FpdCk7CisgICAgKnJlY2VpdmVMZW4gPSAwOwogICAgIGlmICghd2FpdCkgewogICAgICAgICBpZiAobUlPLm1Ub0NsaWVudC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIC8vIE5vIG1lc3NhZ2UgdG8gZ2V0IGFuZCBub3QgZ29pbmcgdG8gd2FpdCBmb3Igb25lLgotICAgICAgICAgICAgcmVjZWl2ZUxlbiA9IDA7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgIH0KQEAgLTc1MSwxNSArNzcwLDE5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCF3YWl0Rm9yU3BhY2UpIHsKLSAgICAgICAgaWYgKG1JTy5tVG9DbGllbnQuZ2V0RnJlZVNwYWNlKCkgPCBsZW4pIHsKKyAgICAgICAgaWYgKCFtSU8ubVRvQ2xpZW50Lm1ha2VTcGFjZU5vbkJsb2NraW5nKGxlbiArIDgpKSB7CiAgICAgICAgICAgICAvLyBOb3QgZW5vdWdoIHJvb20sIGFuZCBub3Qgd2FpdGluZy4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICAvL0xPR0UoInNlbmRNZXNzYWdlVG9DbGllbnQgMiIpOwotICAgIHZvaWQgKnAgPSBtSU8ubVRvQ2xpZW50LnJlc2VydmUobGVuKTsKLSAgICBtZW1jcHkocCwgZGF0YSwgbGVuKTsKLSAgICBtSU8ubVRvQ2xpZW50LmNvbW1pdChjbWRJRCwgbGVuKTsKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICB2b2lkICpwID0gbUlPLm1Ub0NsaWVudC5yZXNlcnZlKGxlbik7CisgICAgICAgIG1lbWNweShwLCBkYXRhLCBsZW4pOworICAgICAgICBtSU8ubVRvQ2xpZW50LmNvbW1pdChjbWRJRCwgbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSU8ubVRvQ2xpZW50LmNvbW1pdChjbWRJRCwgMCk7CisgICAgfQogICAgIC8vTE9HRSgic2VuZE1lc3NhZ2VUb0NsaWVudCAzIik7CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC03OTksOCArODIyLDcgQEAKICAgICBMT0dFKCJSUyBDb250ZXh0IGRlYnVnIik7CiAKICAgICBMT0dFKCIgRUdMIHZlciAlaSAlaSIsIG1FR0wubU1ham9yVmVyc2lvbiwgbUVHTC5tTWlub3JWZXJzaW9uKTsKLSAgICBMT0dFKCIgRUdMIGNvbnRleHQgJXAgIHN1cmZhY2UgJXAsICB3PSVpIGg9JWkgIERpc3BsYXk9JXAiLCBtRUdMLm1Db250ZXh0LAotICAgICAgICAgbUVHTC5tU3VyZmFjZSwgbUVHTC5tV2lkdGgsIG1FR0wubUhlaWdodCwgbUVHTC5tRGlzcGxheSk7CisgICAgTE9HRSgiIEVHTCBjb250ZXh0ICVwICBzdXJmYWNlICVwLCAgRGlzcGxheT0lcCIsIG1FR0wubUNvbnRleHQsIG1FR0wubVN1cmZhY2UsIG1FR0wubURpc3BsYXkpOwogICAgIExPR0UoIiBHTCB2ZW5kb3I6ICVzIiwgbUdMLm1WZW5kb3IpOwogICAgIExPR0UoIiBHTCByZW5kZXJlcjogJXMiLCBtR0wubVJlbmRlcmVyKTsKICAgICBMT0dFKCIgR0wgVmVyc2lvbjogJXMiLCBtR0wubVZlcnNpb24pOwpAQCAtODIyLDYgKzg0NCw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAordm9pZCByc2lfQ29udGV4dEZpbmlzaChDb250ZXh0ICpyc2MpCit7Cit9CiAKIHZvaWQgcnNpX0NvbnRleHRCaW5kUm9vdFNjcmlwdChDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzKQogewpAQCAtODQxLDkgKzg2Niw5IEBACiAgICAgcy0+YmluZFRvQ29udGV4dCgmcnNjLT5tU3RhdGVTYW1wbGVyLCBzbG90KTsKIH0KIAotdm9pZCByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShDb250ZXh0ICpyc2MsIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUgdnBmcykKK3ZvaWQgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKENvbnRleHQgKnJzYywgUnNQcm9ncmFtU3RvcmUgdnBmcykKIHsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50U3RvcmUgKj4odnBmcyk7CisgICAgUHJvZ3JhbVN0b3JlICpwZnMgPSBzdGF0aWNfY2FzdDxQcm9ncmFtU3RvcmUgKj4odnBmcyk7CiAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKHBmcyk7CiB9CiAKQEAgLTg2NSwxMiArODkwLDI0IEBACiAgICAgcnNjLT5zZXRWZXJ0ZXgocHYpOwogfQogCit2b2lkIHJzaV9Db250ZXh0QmluZEZvbnQoQ29udGV4dCAqcnNjLCBSc0ZvbnQgdmZvbnQpCit7CisgICAgRm9udCAqZm9udCA9IHN0YXRpY19jYXN0PEZvbnQgKj4odmZvbnQpOworICAgIHJzYy0+c2V0Rm9udChmb250KTsKK30KKwogdm9pZCByc2lfQXNzaWduTmFtZShDb250ZXh0ICpyc2MsIHZvaWQgKiBvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKICAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKICAgICByc2MtPmFzc2lnbk5hbWUob2IsIG5hbWUsIGxlbik7CiB9CiAKK3ZvaWQgcnNpX0dldE5hbWUoQ29udGV4dCAqcnNjLCB2b2lkICogb2JqLCBjb25zdCBjaGFyICoqbmFtZSkKK3sKKyAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKKyAgICAoKm5hbWUpID0gb2ItPmdldE5hbWUoKTsKK30KKwogdm9pZCByc2lfT2JqRGVzdHJveShDb250ZXh0ICpyc2MsIHZvaWQgKm9iaikKIHsKICAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKQEAgLTkyOSw2ICs5NjYsNyBAQAogICAgIExPR1YoInJzQ29udGV4dENyZWF0ZUdMICVwLCAlaSIsIHZkZXYsIHVzZURlcHRoKTsKICAgICBEZXZpY2UgKiBkZXYgPSBzdGF0aWNfY2FzdDxEZXZpY2UgKj4odmRldik7CiAgICAgQ29udGV4dCAqcnNjID0gbmV3IENvbnRleHQoZGV2LCB0cnVlLCB1c2VEZXB0aCk7CisgICAgTE9HVigicnNDb250ZXh0Q3JlYXRlR0wgcmV0ICVwICIsIHJzYyk7CiAgICAgcmV0dXJuIHJzYzsKIH0KIApAQCAtOTM4LDEyICs5NzYsNiBAQAogICAgIGRlbGV0ZSByc2M7CiB9CiAKLXZvaWQgcnNPYmpEZXN0cm95T09CKFJzQ29udGV4dCB2cnNjLCB2b2lkICpvYmopCi17Ci0gICAgQ29udGV4dCAqIHJzYyA9IHN0YXRpY19jYXN0PENvbnRleHQgKj4odnJzYyk7Ci0gICAgcnNjLT5vYmpEZXN0cm95QWRkKHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKSk7Ci19Ci0KIHVpbnQzMl90IHJzQ29udGV4dEdldE1lc3NhZ2UoUnNDb250ZXh0IHZyc2MsIHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KQogewogICAgIENvbnRleHQgKiByc2MgPSBzdGF0aWNfY2FzdDxDb250ZXh0ICo+KHZyc2MpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHQuaCBiL2xpYnMvcnMvcnNDb250ZXh0LmgKaW5kZXggNzA5NzMwZS4uOGE4YjhhOCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbnRleHQuaAorKysgYi9saWJzL3JzL3JzQ29udGV4dC5oCkBAIC0xOCwyMSArMTgsMjEgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19DT05URVhUX0gKIAogI2luY2x1ZGUgInJzVXRpbHMuaCIKKyNpbmNsdWRlICJyc011dGV4LmgiCiAKICNpbmNsdWRlICJyc1RocmVhZElPLmgiCiAjaW5jbHVkZSAicnNUeXBlLmgiCiAjaW5jbHVkZSAicnNNYXRyaXguaCIKICNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKLSNpbmNsdWRlICJyc1NpbXBsZU1lc2guaCIKICNpbmNsdWRlICJyc01lc2guaCIKICNpbmNsdWRlICJyc0RldmljZS5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgogI2luY2x1ZGUgInJzQWxsb2NhdGlvbi5oIgogI2luY2x1ZGUgInJzQWRhcHRlci5oIgogI2luY2x1ZGUgInJzU2FtcGxlci5oIgotI2luY2x1ZGUgInJzTGlnaHQuaCIKKyNpbmNsdWRlICJyc0ZvbnQuaCIKICNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1TdG9yZS5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbVZlcnRleC5oIgogI2luY2x1ZGUgInJzU2hhZGVyQ2FjaGUuaCIKQEAgLTQ4LDYgKzQ4LDI0IEBACiAKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCisjaWYgMAorI2RlZmluZSBDSEVDS19PQkoobykgeyBcCisgICAgR0VUX1RMUygpOyBcCisgICAgaWYoIU9iamVjdEJhc2U6OmlzVmFsaWQocnNjLCAoY29uc3QgT2JqZWN0QmFzZSAqKW8pKSB7ICBcCisgICAgICAgIExPR0UoIkJhZCBvYmplY3QgJXAgYXQgJXMsICVpIiwgbywgX19GSUxFX18sIF9fTElORV9fKTsgIFwKKyAgICB9IFwKK30KKyNkZWZpbmUgQ0hFQ0tfT0JKX09SX05VTEwobykgeyBcCisgICAgR0VUX1RMUygpOyBcCisgICAgaWYobyAmJiAhT2JqZWN0QmFzZTo6aXNWYWxpZChyc2MsIChjb25zdCBPYmplY3RCYXNlICopbykpIHsgIFwKKyAgICAgICAgTE9HRSgiQmFkIG9iamVjdCAlcCBhdCAlcywgJWkiLCBvLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgXAorICAgIH0gXAorfQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0tfT0JKKG8pCisjZGVmaW5lIENIRUNLX09CSl9PUl9OVUxMKG8pCisjZW5kaWYKKwogY2xhc3MgQ29udGV4dAogewogcHVibGljOgpAQCAtNjMsMTggKzgxLDIwIEBACiAgICAgICAgIENvbnRleHQgKiBtQ29udGV4dDsKICAgICAgICAgU2NyaXB0ICogbVNjcmlwdDsKICAgICB9OworICAgIFNjcmlwdFRMU1N0cnVjdCAqbVRsc1N0cnVjdDsKIAorICAgIHR5cGVkZWYgdm9pZCAoKldvcmtlckNhbGxiYWNrX3QpKHZvaWQgKnVzciwgdWludDMyX3QgaWR4KTsKIAogICAgIC8vU3RydWN0dXJlZEFsbG9jYXRpb25Db250ZXh0IG1TdGF0ZUFsbG9jYXRpb247CiAgICAgRWxlbWVudFN0YXRlIG1TdGF0ZUVsZW1lbnQ7CiAgICAgVHlwZVN0YXRlIG1TdGF0ZVR5cGU7CiAgICAgU2FtcGxlclN0YXRlIG1TdGF0ZVNhbXBsZXI7CiAgICAgUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSBtU3RhdGVGcmFnbWVudFN0b3JlOworICAgIFByb2dyYW1TdG9yZVN0YXRlIG1TdGF0ZUZyYWdtZW50U3RvcmU7CiAgICAgUHJvZ3JhbVJhc3RlclN0YXRlIG1TdGF0ZVJhc3RlcjsKICAgICBQcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OwotICAgIExpZ2h0U3RhdGUgbVN0YXRlTGlnaHQ7CiAgICAgVmVydGV4QXJyYXlTdGF0ZSBtU3RhdGVWZXJ0ZXhBcnJheTsKKyAgICBGb250U3RhdGUgbVN0YXRlRm9udDsKIAogICAgIFNjcmlwdENTdGF0ZSBtU2NyaXB0QzsKICAgICBTaGFkZXJDYWNoZSBtU2hhZGVyQ2FjaGU7CkBAIC04NCwxNiArMTA0LDE5IEBACiAgICAgdm9pZCBzZXRSYXN0ZXIoUHJvZ3JhbVJhc3RlciAqKTsKICAgICB2b2lkIHNldFZlcnRleChQcm9ncmFtVmVydGV4ICopOwogICAgIHZvaWQgc2V0RnJhZ21lbnQoUHJvZ3JhbUZyYWdtZW50ICopOwotICAgIHZvaWQgc2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtRnJhZ21lbnRTdG9yZSAqKTsKKyAgICB2b2lkIHNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbVN0b3JlICopOworICAgIHZvaWQgc2V0Rm9udChGb250ICopOwogCiAgICAgdm9pZCB1cGRhdGVTdXJmYWNlKHZvaWQgKnN1cik7CiAKICAgICBjb25zdCBQcm9ncmFtRnJhZ21lbnQgKiBnZXRGcmFnbWVudCgpIHtyZXR1cm4gbUZyYWdtZW50LmdldCgpO30KLSAgICBjb25zdCBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqIGdldEZyYWdtZW50U3RvcmUoKSB7cmV0dXJuIG1GcmFnbWVudFN0b3JlLmdldCgpO30KKyAgICBjb25zdCBQcm9ncmFtU3RvcmUgKiBnZXRGcmFnbWVudFN0b3JlKCkge3JldHVybiBtRnJhZ21lbnRTdG9yZS5nZXQoKTt9CiAgICAgY29uc3QgUHJvZ3JhbVJhc3RlciAqIGdldFJhc3RlcigpIHtyZXR1cm4gbVJhc3Rlci5nZXQoKTt9CiAgICAgY29uc3QgUHJvZ3JhbVZlcnRleCAqIGdldFZlcnRleCgpIHtyZXR1cm4gbVZlcnRleC5nZXQoKTt9CisgICAgRm9udCAqIGdldEZvbnQoKSB7cmV0dXJuIG1Gb250LmdldCgpO30KIAogICAgIGJvb2wgc2V0dXBDaGVjaygpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtU3RvcmUoKTsKICAgICBib29sIGNoZWNrRHJpdmVyKCkgY29uc3Qge3JldHVybiBtRUdMLm1TdXJmYWNlICE9IDA7fQogCiAgICAgdm9pZCBwYXVzZSgpOwpAQCAtMTAzLDEyICsxMjYsMTAgQEAKIAogICAgIHZvaWQgYXNzaWduTmFtZShPYmplY3RCYXNlICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbik7CiAgICAgdm9pZCByZW1vdmVOYW1lKE9iamVjdEJhc2UgKm9iaik7Ci0gICAgT2JqZWN0QmFzZSAqIGxvb2t1cE5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7Ci0gICAgdm9pZCBhcHBlbmROYW1lRGVmaW5lcyhTdHJpbmc4ICpzdHIpIGNvbnN0OwogCiAgICAgdWludDMyX3QgZ2V0TWVzc2FnZVRvQ2xpZW50KHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KTsKICAgICBib29sIHNlbmRNZXNzYWdlVG9DbGllbnQodm9pZCAqZGF0YSwgdWludDMyX3QgY21kSUQsIHNpemVfdCBsZW4sIGJvb2wgd2FpdEZvclNwYWNlKTsKLSAgICB1aW50MzJfdCBydW5TY3JpcHQoU2NyaXB0ICpzLCB1aW50MzJfdCBsYXVuY2hJRCk7CisgICAgdWludDMyX3QgcnVuU2NyaXB0KFNjcmlwdCAqcyk7CiAKICAgICB2b2lkIGluaXRUb0NsaWVudCgpOwogICAgIHZvaWQgZGVpbml0VG9DbGllbnQoKTsKQEAgLTExOSwxOSArMTQwLDIxIEBACiAgICAgUHJvZ3JhbVZlcnRleCAqIGdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlVmVydGV4Lm1EZWZhdWx0LmdldCgpOwogICAgIH0KLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqIGdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnRTdG9yZSgpIGNvbnN0IHsKKyAgICBQcm9ncmFtU3RvcmUgKiBnZXREZWZhdWx0UHJvZ3JhbVN0b3JlKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlRnJhZ21lbnRTdG9yZS5tRGVmYXVsdC5nZXQoKTsKICAgICB9CiAgICAgUHJvZ3JhbVJhc3RlciAqIGdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlUmFzdGVyLm1EZWZhdWx0LmdldCgpOwogICAgIH0KKyAgICBGb250KiBnZXREZWZhdWx0Rm9udCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZUZvbnQubURlZmF1bHQuZ2V0KCk7CisgICAgfQogCi0gICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIG1FR0wubVdpZHRoO30KLSAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCB7cmV0dXJuIG1FR0wubUhlaWdodDt9CisgICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIG1XaWR0aDt9CisgICAgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3Qge3JldHVybiBtSGVpZ2h0O30KIAogCiAgICAgVGhyZWFkSU8gbUlPOwotICAgIHZvaWQgb2JqRGVzdHJveUFkZChPYmplY3RCYXNlICopOwogCiAgICAgLy8gVGltZXJzCiAgICAgZW51bSBUaW1lcnMgewpAQCAtMTQ4LDI0ICsxNzEsMzEgQEAKICAgICB2b2lkIHRpbWVyUHJpbnQoKTsKICAgICB2b2lkIHRpbWVyRnJhbWUoKTsKIAotICAgIGJvb2wgY2hlY2tWZXJzaW9uMV8xKCkgY29uc3Qge3JldHVybiAobUdMLm1NYWpvclZlcnNpb24gPiAxKSB8fCAobUdMLm1NaW5vclZlcnNpb24gPj0gMSk7IH0KLSAgICBib29sIGNoZWNrVmVyc2lvbjJfMCgpIGNvbnN0IHtyZXR1cm4gbUdMLm1NYWpvclZlcnNpb24gPj0gMjsgfQotCiAgICAgc3RydWN0IHsKICAgICAgICAgYm9vbCBtTG9nVGltZXM7CiAgICAgICAgIGJvb2wgbUxvZ1NjcmlwdHM7CiAgICAgICAgIGJvb2wgbUxvZ09iamVjdHM7CiAgICAgICAgIGJvb2wgbUxvZ1NoYWRlcnM7CisgICAgICAgIGJvb2wgbUxvZ1NoYWRlcnNBdHRyOworICAgICAgICBib29sIG1Mb2dTaGFkZXJzVW5pZm9ybXM7CisgICAgICAgIGJvb2wgbUxvZ1Zpc3VhbDsKICAgICB9IHByb3BzOwogCiAgICAgdm9pZCBkdW1wRGVidWcoKSBjb25zdDsKICAgICB2b2lkIGNoZWNrRXJyb3IoY29uc3QgY2hhciAqKSBjb25zdDsKICAgICBjb25zdCBjaGFyICogZ2V0RXJyb3IoUnNFcnJvciAqKTsKLSAgICB2b2lkIHNldEVycm9yKFJzRXJyb3IgZSwgY29uc3QgY2hhciAqbXNnKTsKKyAgICB2b2lkIHNldEVycm9yKFJzRXJyb3IgZSwgY29uc3QgY2hhciAqbXNnID0gTlVMTCk7CiAKICAgICBtdXRhYmxlIGNvbnN0IE9iamVjdEJhc2UgKiBtT2JqSGVhZDsKIAogICAgIGJvb2wgZXh0X09FU190ZXh0dXJlX25wb3QoKSBjb25zdCB7cmV0dXJuIG1HTC5PRVNfdGV4dHVyZV9ucG90O30KKyAgICBmbG9hdCBleHRfdGV4dHVyZV9tYXhfYW5pc28oKSBjb25zdCB7cmV0dXJuIG1HTC5FWFRfdGV4dHVyZV9tYXhfYW5pc287IH0KKyAgICB1aW50MzJfdCBnZXRNYXhGcmFnbWVudFRleHR1cmVzKCkgY29uc3Qge3JldHVybiBtR0wubU1heEZyYWdtZW50VGV4dHVyZUltYWdlVW5pdHM7fQorICAgIHVpbnQzMl90IGdldE1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMoKSBjb25zdCB7cmV0dXJuIG1HTC5tTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9yczt9CisgICAgdWludDMyX3QgZ2V0TWF4VmVydGV4VW5pZm9ybVZlY3RvcnMoKSBjb25zdCB7cmV0dXJuIG1HTC5tTWF4VmVydGV4VW5pZm9ybVZlY3RvcnM7fQorCisgICAgdm9pZCBsYXVuY2hUaHJlYWRzKFdvcmtlckNhbGxiYWNrX3QgY2JrLCB2b2lkICpkYXRhKTsKKyAgICB1aW50MzJfdCBnZXRXb3JrZXJQb29sU2l6ZSgpIGNvbnN0IHtyZXR1cm4gKHVpbnQzMl90KW1Xb3JrZXJzLm1Db3VudDt9CiAKIHByb3RlY3RlZDoKICAgICBEZXZpY2UgKm1EZXY7CkBAIC0xNzcsOCArMjA3LDYgQEAKICAgICAgICAgRUdMQ29uZmlnIG1Db25maWc7CiAgICAgICAgIEVHTENvbnRleHQgbUNvbnRleHQ7CiAgICAgICAgIEVHTFN1cmZhY2UgbVN1cmZhY2U7Ci0gICAgICAgIEVHTGludCBtV2lkdGg7Ci0gICAgICAgIEVHTGludCBtSGVpZ2h0OwogICAgICAgICBFR0xEaXNwbGF5IG1EaXNwbGF5OwogICAgIH0gbUVHTDsKIApAQCAtMjAyLDYgKzIzMCw3IEBACiAgICAgICAgIGludDMyX3QgbU1heFZlcnRleFRleHR1cmVVbml0czsKIAogICAgICAgICBib29sIE9FU190ZXh0dXJlX25wb3Q7CisgICAgICAgIGZsb2F0IEVYVF90ZXh0dXJlX21heF9hbmlzbzsKICAgICB9IG1HTDsKIAogICAgIHVpbnQzMl90IG1XaWR0aDsKQEAgLTIxOSwyMiArMjQ4LDI4IEBACiAgICAgcHRocmVhZF90IG1UaHJlYWRJZDsKICAgICBwaWRfdCBtTmF0aXZlVGhyZWFkSWQ7CiAKKyAgICBzdHJ1Y3QgV29ya2VycyB7CisgICAgICAgIHZvbGF0aWxlIGludCBtUnVubmluZ0NvdW50OworICAgICAgICB2b2xhdGlsZSBpbnQgbUxhdW5jaENvdW50OworICAgICAgICB1aW50MzJfdCBtQ291bnQ7CisgICAgICAgIHB0aHJlYWRfdCAqbVRocmVhZElkOworICAgICAgICBwaWRfdCAqbU5hdGl2ZVRocmVhZElkOworICAgICAgICBTaWduYWwgbUNvbXBsZXRlU2lnbmFsOworCisgICAgICAgIFNpZ25hbCAqbUxhdW5jaFNpZ25hbHM7CisgICAgICAgIFdvcmtlckNhbGxiYWNrX3QgbUxhdW5jaENhbGxiYWNrOworICAgICAgICB2b2lkICptTGF1bmNoRGF0YTsKKyAgICB9OworICAgIFdvcmtlcnMgbVdvcmtlcnM7CisKICAgICBPYmplY3RCYXNlUmVmPFNjcmlwdD4gbVJvb3RTY3JpcHQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1GcmFnbWVudDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1WZXJ0ZXg7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUZyYWdtZW50U3RvcmU7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1GcmFnbWVudFN0b3JlOwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gbVJhc3RlcjsKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IG1Gb250OwogCi0KLSAgICBzdHJ1Y3QgT2JqRGVzdHJveU9PQiB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7Ci0gICAgICAgIFZlY3RvcjxPYmplY3RCYXNlICo+IG1EZXN0cm95TGlzdDsKLSAgICAgICAgYm9vbCBtTmVlZFRvRW1wdHk7Ci0gICAgfTsKLSAgICBPYmpEZXN0cm95T09CIG1PYmpEZXN0cm95OwotICAgIGJvb2wgb2JqRGVzdHJveU9PQkluaXQoKTsKLSAgICB2b2lkIG9iakRlc3Ryb3lPT0JSdW4oKTsKLSAgICB2b2lkIG9iakRlc3Ryb3lPT0JEZXN0cm95KCk7CisgICAgdm9pZCBkaXNwbGF5RGVidWdTdGF0cygpOwogCiBwcml2YXRlOgogICAgIENvbnRleHQoKTsKQEAgLTI0NSw2ICsyODAsNyBAQAogICAgIHVpbnQzMl90IHJ1blJvb3RTY3JpcHQoKTsKIAogICAgIHN0YXRpYyB2b2lkICogdGhyZWFkUHJvYyh2b2lkICopOworICAgIHN0YXRpYyB2b2lkICogaGVscGVyVGhyZWFkUHJvYyh2b2lkICopOwogCiAgICAgQU5hdGl2ZVdpbmRvdyAqbVduZFN1cmZhY2U7CiAKQEAgLTI1OCw2ICsyOTQsOSBAQAogICAgIHVpbnQzMl90IG1UaW1lTVNMYXN0RnJhbWU7CiAgICAgdWludDMyX3QgbVRpbWVNU0xhc3RTY3JpcHQ7CiAgICAgdWludDMyX3QgbVRpbWVNU0xhc3RTd2FwOworICAgIHVpbnQzMl90IG1BdmVyYWdlRlBTRnJhbWVDb3VudDsKKyAgICB1aW50NjRfdCBtQXZlcmFnZUZQU1N0YXJ0VGltZTsKKyAgICB1aW50MzJfdCBtQXZlcmFnZUZQUzsKIH07CiAKIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaCBiL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTAyMDVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0NvbnRleHRIb3N0U3R1Yi5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0NPTlRFWFRfSE9TVF9TVFVCX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19DT05URVhUX0hPU1RfU1RVQl9ICisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisvLyNpbmNsdWRlICJyc011dGV4LmgiCisKKy8vI2luY2x1ZGUgInJzVGhyZWFkSU8uaCIKKyNpbmNsdWRlICJyc1R5cGUuaCIKKyNpbmNsdWRlICJyc01hdHJpeC5oIgorI2luY2x1ZGUgInJzQWxsb2NhdGlvbi5oIgorI2luY2x1ZGUgInJzTWVzaC5oIgorLy8jaW5jbHVkZSAicnNEZXZpY2UuaCIKKyNpbmNsdWRlICJyc1NjcmlwdEMuaCIKKyNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKKyNpbmNsdWRlICJyc0FkYXB0ZXIuaCIKKyNpbmNsdWRlICJyc1NhbXBsZXIuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCisjaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCisjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCisjaW5jbHVkZSAicnNTaGFkZXJDYWNoZS5oIgorI2luY2x1ZGUgInJzVmVydGV4QXJyYXkuaCIKKworLy8jaW5jbHVkZSAicnNnQXBpU3RydWN0cy5oIgorLy8jaW5jbHVkZSAicnNMb2NrbGVzc0ZpZm8uaCIKKworLy8jaW5jbHVkZSA8dWkvZWdsL2FuZHJvaWRfbmF0aXZlcy5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIERldmljZTsKKworY2xhc3MgQ29udGV4dAoreworcHVibGljOgorICAgIENvbnRleHQoRGV2aWNlICosIGJvb2wgaXNHcmFwaGljcywgYm9vbCB1c2VEZXB0aCkgeworICAgICAgICBtT2JqSGVhZCA9IE5VTEw7CisgICAgfQorICAgIH5Db250ZXh0KCkgeworICAgIH0KKworCisgICAgLy9TdHJ1Y3R1cmVkQWxsb2NhdGlvbkNvbnRleHQgbVN0YXRlQWxsb2NhdGlvbjsKKyAgICBFbGVtZW50U3RhdGUgbVN0YXRlRWxlbWVudDsKKyAgICBUeXBlU3RhdGUgbVN0YXRlVHlwZTsKKyAgICBTYW1wbGVyU3RhdGUgbVN0YXRlU2FtcGxlcjsKKyAgICAvL1Byb2dyYW1GcmFnbWVudFN0YXRlIG1TdGF0ZUZyYWdtZW50OworICAgIFByb2dyYW1TdG9yZVN0YXRlIG1TdGF0ZUZyYWdtZW50U3RvcmU7CisgICAgLy9Qcm9ncmFtUmFzdGVyU3RhdGUgbVN0YXRlUmFzdGVyOworICAgIC8vUHJvZ3JhbVZlcnRleFN0YXRlIG1TdGF0ZVZlcnRleDsKKyAgICBWZXJ0ZXhBcnJheVN0YXRlIG1TdGF0ZVZlcnRleEFycmF5OworCisgICAgLy9TY3JpcHRDU3RhdGUgbVNjcmlwdEM7CisgICAgU2hhZGVyQ2FjaGUgbVNoYWRlckNhY2hlOworCisKKyAgICAvL2Jvb2wgc2V0dXBDaGVjaygpOworICAgIGJvb2wgY2hlY2tEcml2ZXIoKSBjb25zdCB7cmV0dXJuIGZhbHNlO30KKworICAgIFByb2dyYW1GcmFnbWVudCAqIGdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQcm9ncmFtVmVydGV4ICogZ2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQcm9ncmFtU3RvcmUgKiBnZXREZWZhdWx0UHJvZ3JhbVN0b3JlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVJhc3RlciAqIGdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0IHtyZXR1cm4gMDt9CisgICAgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3Qge3JldHVybiAwO30KKworICAgIC8vIFRpbWVycworICAgIGVudW0gVGltZXJzIHsKKyAgICAgICAgUlNfVElNRVJfSURMRSwKKyAgICAgICAgUlNfVElNRVJfSU5URVJOQUwsCisgICAgICAgIFJTX1RJTUVSX1NDUklQVCwKKyAgICAgICAgUlNfVElNRVJfQ0xFQVJfU1dBUCwKKyAgICAgICAgX1JTX1RJTUVSX1RPVEFMCisgICAgfTsKKworICAgIGJvb2wgY2hlY2tWZXJzaW9uMV8xKCkgY29uc3Qge3JldHVybiBmYWxzZTsgfQorICAgIGJvb2wgY2hlY2tWZXJzaW9uMl8wKCkgY29uc3Qge3JldHVybiBmYWxzZTsgfQorCisgICAgc3RydWN0IHsKKyAgICAgICAgYm9vbCBtTG9nVGltZXM7CisgICAgICAgIGJvb2wgbUxvZ1NjcmlwdHM7CisgICAgICAgIGJvb2wgbUxvZ09iamVjdHM7CisgICAgICAgIGJvb2wgbUxvZ1NoYWRlcnM7CisgICAgICAgIGJvb2wgbUxvZ1NoYWRlcnNBdHRyOworICAgICAgICBib29sIG1Mb2dTaGFkZXJzVW5pZm9ybXM7CisgICAgICAgIGJvb2wgbUxvZ1Zpc3VhbDsKKyAgICB9IHByb3BzOworCisgICAgdm9pZCBkdW1wRGVidWcoKSBjb25zdCB7ICAgIH0KKyAgICB2b2lkIGNoZWNrRXJyb3IoY29uc3QgY2hhciAqKSBjb25zdCB7ICB9OworICAgIHZvaWQgc2V0RXJyb3IoUnNFcnJvciBlLCBjb25zdCBjaGFyICptc2cgPSBOVUxMKSB7ICB9CisKKyAgICBtdXRhYmxlIGNvbnN0IE9iamVjdEJhc2UgKiBtT2JqSGVhZDsKKworICAgIGJvb2wgZXh0X09FU190ZXh0dXJlX25wb3QoKSBjb25zdCB7cmV0dXJuIG1HTC5PRVNfdGV4dHVyZV9ucG90O30KKyAgICBmbG9hdCBleHRfdGV4dHVyZV9tYXhfYW5pc28oKSBjb25zdCB7cmV0dXJuIDEuMGY7fQorICAgIHVpbnQzMl90IGdldE1heEZyYWdtZW50VGV4dHVyZXMoKSBjb25zdCB7cmV0dXJuIG1HTC5tTWF4RnJhZ21lbnRUZXh0dXJlSW1hZ2VVbml0czt9CisgICAgdWludDMyX3QgZ2V0TWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycygpIGNvbnN0IHtyZXR1cm4gbUdMLm1NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzO30KKyAgICB1aW50MzJfdCBnZXRNYXhWZXJ0ZXhVbmlmb3JtVmVjdG9ycygpIGNvbnN0IHtyZXR1cm4gbUdMLm1NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9yczt9CisKK3Byb3RlY3RlZDoKKworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtVmVuZG9yOworICAgICAgICBjb25zdCB1aW50OF90ICogbVJlbmRlcmVyOworICAgICAgICBjb25zdCB1aW50OF90ICogbVZlcnNpb247CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtRXh0ZW5zaW9uczsKKworICAgICAgICB1aW50MzJfdCBtTWFqb3JWZXJzaW9uOworICAgICAgICB1aW50MzJfdCBtTWlub3JWZXJzaW9uOworCisgICAgICAgIGludDMyX3QgbU1heFZhcnlpbmdWZWN0b3JzOworICAgICAgICBpbnQzMl90IG1NYXhUZXh0dXJlSW1hZ2VVbml0czsKKworICAgICAgICBpbnQzMl90IG1NYXhGcmFnbWVudFRleHR1cmVJbWFnZVVuaXRzOworICAgICAgICBpbnQzMl90IG1NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzOworCisgICAgICAgIGludDMyX3QgbU1heFZlcnRleEF0dHJpYnM7CisgICAgICAgIGludDMyX3QgbU1heFZlcnRleFVuaWZvcm1WZWN0b3JzOworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhUZXh0dXJlVW5pdHM7CisKKyAgICAgICAgYm9vbCBPRVNfdGV4dHVyZV9ucG90OworICAgIH0gbUdMOworCit9OworCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNEZXZpY2UuY3BwIGIvbGlicy9ycy9yc0RldmljZS5jcHAKaW5kZXggYjY3MGFkNC4uYTk2YjExNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0RldmljZS5jcHAKKysrIGIvbGlicy9ycy9yc0RldmljZS5jcHAKQEAgLTE1LDcgKzE1LDExIEBACiAgKi8KIAogI2luY2x1ZGUgInJzRGV2aWNlLmgiCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0zMyw3ICszNyw3IEBACiAKIHZvaWQgRGV2aWNlOjphZGRDb250ZXh0KENvbnRleHQgKnJzYykKIHsKLSAgICBtQ29udGV4dHMuYWRkKHJzYyk7CisgICAgbUNvbnRleHRzLnB1c2gocnNjKTsKIH0KIAogdm9pZCBEZXZpY2U6OnJlbW92ZUNvbnRleHQoQ29udGV4dCAqcnNjKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0VsZW1lbnQuY3BwIGIvbGlicy9ycy9yc0VsZW1lbnQuY3BwCmluZGV4IDYyODhiYzQuLjBiOWUyOGMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNFbGVtZW50LmNwcAorKysgYi9saWJzL3JzL3JzRWxlbWVudC5jcHAKQEAgLTE0LDkgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAicnNDb250ZXh0LmgiCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yOSw2ICszNCw3IEBACiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogICAgIG1GaWVsZHMgPSBOVUxMOwogICAgIG1GaWVsZENvdW50ID0gMDsKKyAgICBtSGFzUmVmZXJlbmNlID0gZmFsc2U7CiB9CiAKIApAQCAtNDgsNiArNTQsNyBAQAogICAgIGRlbGV0ZSBbXSBtRmllbGRzOwogICAgIG1GaWVsZHMgPSBOVUxMOwogICAgIG1GaWVsZENvdW50ID0gMDsKKyAgICBtSGFzUmVmZXJlbmNlID0gZmFsc2U7CiB9CiAKIHNpemVfdCBFbGVtZW50OjpnZXRTaXplQml0cygpIGNvbnN0CkBAIC01OCwyMCArNjUsMTEgQEAKIAogICAgIHNpemVfdCB0b3RhbCA9IDA7CiAgICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtRmllbGRDb3VudDsgY3QrKykgewotICAgICAgICB0b3RhbCArPSBtRmllbGRzW2N0XS5lLT5tQml0czsKKyAgICAgICAgdG90YWwgKz0gbUZpZWxkc1tjdF0uZS0+bUJpdHMgKiBtRmllbGRzW2N0XS5hcnJheVNpemU7OwogICAgIH0KICAgICByZXR1cm4gdG90YWw7CiB9CiAKLXNpemVfdCBFbGVtZW50OjpnZXRGaWVsZE9mZnNldEJpdHModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdAotewotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IGNvbXBvbmVudE51bWJlcjsgY3QrKykgewotICAgICAgICBvZmZzZXQgKz0gbUZpZWxkc1tjdF0uZS0+bUJpdHM7Ci0gICAgfQotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KIHZvaWQgRWxlbWVudDo6ZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdAogewogICAgIE9iamVjdEJhc2U6OmR1bXBMT0dWKHByZWZpeCk7CkBAIC04Myw2ICs4MSwxMDAgQEAKICAgICB9CiB9CiAKK3ZvaWQgRWxlbWVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgbUNvbXBvbmVudC5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIC8vIE5vdyBzZXJpYWxpemUgYWxsIHRoZSBmaWVsZHMKKyAgICBzdHJlYW0tPmFkZFUzMihtRmllbGRDb3VudCk7CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBzdHJlYW0tPmFkZFN0cmluZygmbUZpZWxkc1tjdF0ubmFtZSk7CisgICAgICAgIHN0cmVhbS0+YWRkVTMyKG1GaWVsZHNbY3RdLmFycmF5U2l6ZSk7CisgICAgICAgIG1GaWVsZHNbY3RdLmUtPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KK30KKworRWxlbWVudCAqRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQpIHsKKyAgICAgICAgTE9HRSgiZWxlbWVudCBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIEVsZW1lbnQgKmVsZW0gPSBuZXcgRWxlbWVudChyc2MpOworICAgIGVsZW0tPm1Db21wb25lbnQubG9hZEZyb21TdHJlYW0oc3RyZWFtKTsKKyAgICBlbGVtLT5tQml0cyA9IGVsZW0tPm1Db21wb25lbnQuZ2V0Qml0cygpOworICAgIGVsZW0tPm1IYXNSZWZlcmVuY2UgPSBlbGVtLT5tQ29tcG9uZW50LmlzUmVmZXJlbmNlKCk7CisKKyAgICBlbGVtLT5tRmllbGRDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGVsZW0tPm1GaWVsZENvdW50KSB7CisgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IDA7CisgICAgICAgIGVsZW0tPm1GaWVsZHMgPSBuZXcgRWxlbWVudEZpZWxkX3QgW2VsZW0tPm1GaWVsZENvdW50XTsKKyAgICAgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBlbGVtLT5tRmllbGRDb3VudDsgY3QgKyspIHsKKyAgICAgICAgICAgIHN0cmVhbS0+bG9hZFN0cmluZygmZWxlbS0+bUZpZWxkc1tjdF0ubmFtZSk7CisgICAgICAgICAgICBlbGVtLT5tRmllbGRzW2N0XS5hcnJheVNpemUgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgICAgIEVsZW1lbnQgKmZpZWxkRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgICAgICAgICAgZWxlbS0+bUZpZWxkc1tjdF0uZS5zZXQoZmllbGRFbGVtKTsKKyAgICAgICAgICAgIGVsZW0tPm1GaWVsZHNbY3RdLm9mZnNldEJpdHMgPSBvZmZzZXQ7CisgICAgICAgICAgICBvZmZzZXQgKz0gZmllbGRFbGVtLT5nZXRTaXplQml0cygpOworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb3VyIHN1Yi1lbGVtZW50cyBoYXZlIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIGlmKGZpZWxkRWxlbS0+bUhhc1JlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgIGVsZW0tPm1IYXNSZWZlcmVuY2UgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGFscmVhZHkgZXhpc3RzCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIEVsZW1lbnQgKmVlID0gcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50c1tjdF07CisgICAgICAgIGlmKGVlLT5pc0VxdWFsKGVsZW0pKSB7CisgICAgICAgICAgICBkZWxldGUgZWxlbTsKKyAgICAgICAgICAgIGVlLT5pbmNVc2VyUmVmKCk7CisgICAgICAgICAgICByZXR1cm4gZWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnB1c2goZWxlbSk7CisgICAgcmV0dXJuIGVsZW07Cit9CisKK2Jvb2wgRWxlbWVudDo6aXNFcXVhbChjb25zdCBFbGVtZW50ICpvdGhlcikgY29uc3QgeworICAgIGlmKG90aGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW90aGVyLT5nZXRGaWVsZENvdW50KCkgJiYgIW1GaWVsZENvdW50KSB7CisgICAgICAgIGlmKChvdGhlci0+Z2V0VHlwZSgpID09IGdldFR5cGUoKSkgJiYKKyAgICAgICAgICAgKG90aGVyLT5nZXRLaW5kKCkgPT0gZ2V0S2luZCgpKSAmJgorICAgICAgICAgICAob3RoZXItPmdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpID09IGdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpKSAmJgorICAgICAgICAgICAob3RoZXItPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSA9PSBnZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChvdGhlci0+Z2V0RmllbGRDb3VudCgpID09IG1GaWVsZENvdW50KSB7CisgICAgICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgbUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKCghb3RoZXItPm1GaWVsZHNbaV0uZS0+aXNFcXVhbChtRmllbGRzW2ldLmUuZ2V0KCkpKSB8fAorICAgICAgICAgICAgICAgIChvdGhlci0+bUZpZWxkc1tpXS5uYW1lLmxlbmd0aCgpICE9IG1GaWVsZHNbaV0ubmFtZS5sZW5ndGgoKSkgfHwKKyAgICAgICAgICAgICAgICAob3RoZXItPm1GaWVsZHNbaV0ubmFtZSAhPSBtRmllbGRzW2ldLm5hbWUpIHx8CisgICAgICAgICAgICAgICAgKG90aGVyLT5tRmllbGRzW2ldLmFycmF5U2l6ZSAhPSBtRmllbGRzW2ldLmFycmF5U2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KIAogY29uc3QgRWxlbWVudCAqIEVsZW1lbnQ6OmNyZWF0ZShDb250ZXh0ICpyc2MsIFJzRGF0YVR5cGUgZHQsIFJzRGF0YUtpbmQgZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc05vcm0sIHVpbnQzMl90IHZlY1NpemUpCkBAIC0xMDQsMTIgKzE5NiwxMyBAQAogICAgIEVsZW1lbnQgKmUgPSBuZXcgRWxlbWVudChyc2MpOwogICAgIGUtPm1Db21wb25lbnQuc2V0KGR0LCBkaywgaXNOb3JtLCB2ZWNTaXplKTsKICAgICBlLT5tQml0cyA9IGUtPm1Db21wb25lbnQuZ2V0Qml0cygpOworICAgIGUtPm1IYXNSZWZlcmVuY2UgPSBlLT5tQ29tcG9uZW50LmlzUmVmZXJlbmNlKCk7CiAgICAgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5wdXNoKGUpOwogICAgIHJldHVybiBlOwogfQogCiBjb25zdCBFbGVtZW50ICogRWxlbWVudDo6Y3JlYXRlKENvbnRleHQgKnJzYywgc2l6ZV90IGNvdW50LCBjb25zdCBFbGVtZW50ICoqZWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuaW4sIGNvbnN0IHNpemVfdCAqIGxlbmd0aHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5pbiwgY29uc3Qgc2l6ZV90ICogbGVuZ3RocywgY29uc3QgdWludDMyX3QgKmFzaW4pCiB7CiAgICAgLy8gTG9vayBmb3IgYW4gZXhpc3RpbmcgbWF0Y2guCiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMuc2l6ZSgpOyBjdCsrKSB7CkBAIC0xMTksNyArMjEyLDggQEAKICAgICAgICAgICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgIGlmICgoZWUtPm1GaWVsZHNbaV0uZS5nZXQoKSAhPSBlaW5baV0pIHx8CiAgICAgICAgICAgICAgICAgICAgIChlZS0+bUZpZWxkc1tpXS5uYW1lLmxlbmd0aCgpICE9IGxlbmd0aHNbaV0pIHx8Ci0gICAgICAgICAgICAgICAgICAgIChlZS0+bUZpZWxkc1tpXS5uYW1lICE9IG5pbltpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLm5hbWUgIT0gbmluW2ldKSB8fAorICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0uYXJyYXlTaXplICE9IGFzaW5baV0pKSB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTEzNCw1NCArMjI4LDIzIEBACiAgICAgRWxlbWVudCAqZSA9IG5ldyBFbGVtZW50KHJzYyk7CiAgICAgZS0+bUZpZWxkcyA9IG5ldyBFbGVtZW50RmllbGRfdCBbY291bnRdOwogICAgIGUtPm1GaWVsZENvdW50ID0gY291bnQ7CisgICAgc2l6ZV90IGJpdHMgPSAwOwogICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgY291bnQ7IGN0KyspIHsKICAgICAgICAgZS0+bUZpZWxkc1tjdF0uZS5zZXQoZWluW2N0XSk7CiAgICAgICAgIGUtPm1GaWVsZHNbY3RdLm5hbWUuc2V0VG8obmluW2N0XSwgbGVuZ3Roc1tjdF0pOworICAgICAgICBlLT5tRmllbGRzW2N0XS5vZmZzZXRCaXRzID0gYml0czsKKyAgICAgICAgZS0+bUZpZWxkc1tjdF0uYXJyYXlTaXplID0gYXNpbltjdF07CisgICAgICAgIGJpdHMgKz0gZWluW2N0XS0+Z2V0U2l6ZUJpdHMoKTsKKworICAgICAgICBpZiAoZWluW2N0XS0+bUhhc1JlZmVyZW5jZSkgeworICAgICAgICAgICAgZS0+bUhhc1JlZmVyZW5jZSA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnB1c2goZSk7CiAgICAgcmV0dXJuIGU7CiB9CiAKLVN0cmluZzggRWxlbWVudDo6Z2V0Q1N0cnVjdEJvZHkodWludDMyX3QgaW5kZW50KSBjb25zdAotewotICAgIFN0cmluZzggc2k7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGluZGVudDsgY3QrKykgewotICAgICAgICBzaS5hcHBlbmQoIiAiKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IHMoc2kpOwotICAgIHMuYXBwZW5kKCJ7XG4iKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtRmllbGRDb3VudDsgY3QrKykgewotICAgICAgICBzLmFwcGVuZChzaSk7Ci0gICAgICAgIHMuYXBwZW5kKG1GaWVsZHNbY3RdLmUtPmdldENUeXBlKGluZGVudCs0KSk7Ci0gICAgICAgIHMuYXBwZW5kKCIgIik7Ci0gICAgICAgIHMuYXBwZW5kKG1GaWVsZHNbY3RdLm5hbWUpOwotICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgfQotICAgIHMuYXBwZW5kKHNpKTsKLSAgICBzLmFwcGVuZCgifSIpOwotICAgIHJldHVybiBzOwotfQotCi1TdHJpbmc4IEVsZW1lbnQ6OmdldENUeXBlKHVpbnQzMl90IGluZGVudCkgY29uc3QKLXsKLSAgICBTdHJpbmc4IHM7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGluZGVudDsgY3QrKykgewotICAgICAgICBzLmFwcGVuZCgiICIpOwotICAgIH0KLQotICAgIGlmICghbUZpZWxkQ291bnQpIHsKLSAgICAgICAgLy8gQmFzaWMgY29tcG9uZW50LgotICAgICAgICBzLmFwcGVuZChtQ29tcG9uZW50LmdldENUeXBlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMuYXBwZW5kKCJzdHJ1Y3QgIik7Ci0gICAgICAgIHMuYXBwZW5kKGdldENTdHJ1Y3RCb2R5KGluZGVudCkpOwotICAgIH0KLQotICAgIHJldHVybiBzOwotfQotCiBTdHJpbmc4IEVsZW1lbnQ6OmdldEdMU0xUeXBlKHVpbnQzMl90IGluZGVudCkgY29uc3QKIHsKICAgICBTdHJpbmc4IHM7CkBAIC0yMDEsMTAgKzI2NCw2MCBAQAogICAgIHJldHVybiBzOwogfQogCit2b2lkIEVsZW1lbnQ6OmluY1JlZnMoY29uc3Qgdm9pZCAqcHRyKSBjb25zdAoreworICAgIGlmICghbUZpZWxkQ291bnQpIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQuaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgT2JqZWN0QmFzZSAqY29uc3Qqb2JwID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqY29uc3QqPihwdHIpOworICAgICAgICAgICAgT2JqZWN0QmFzZSAqb2IgPSBvYnBbMF07CisgICAgICAgICAgICBpZiAob2IpIG9iLT5pbmNTeXNSZWYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocHRyKTsKKyAgICBmb3IgKHVpbnQzMl90IGk9MDsgaSA8IG1GaWVsZENvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKG1GaWVsZHNbaV0uZS0+bUhhc1JlZmVyZW5jZSkgeworICAgICAgICAgICAgcCA9ICZwW21GaWVsZHNbaV0ub2Zmc2V0Qml0cyA+PiAzXTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRmllbGRzW2ldLmFycmF5U2l6ZTsgY3QrKykgeworICAgICAgICAgICAgICAgIG1GaWVsZHNbaV0uZS0+aW5jUmVmcyhwKTsKKyAgICAgICAgICAgICAgICBwICs9IG1GaWVsZHNbaV0uZS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRWxlbWVudDo6ZGVjUmVmcyhjb25zdCB2b2lkICpwdHIpIGNvbnN0Cit7CisgICAgaWYgKCFtRmllbGRDb3VudCkgeworICAgICAgICBpZiAobUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICBPYmplY3RCYXNlICpjb25zdCpvYnAgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICpjb25zdCo+KHB0cik7CisgICAgICAgICAgICBPYmplY3RCYXNlICpvYiA9IG9icFswXTsKKyAgICAgICAgICAgIGlmIChvYikgb2ItPmRlY1N5c1JlZigpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgbUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICBpZiAobUZpZWxkc1tpXS5lLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBwID0gJnBbbUZpZWxkc1tpXS5vZmZzZXRCaXRzID4+IDNdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1GaWVsZHNbaV0uYXJyYXlTaXplOyBjdCsrKSB7CisgICAgICAgICAgICAgICAgbUZpZWxkc1tpXS5lLT5kZWNSZWZzKHApOworICAgICAgICAgICAgICAgIHAgKz0gbUZpZWxkc1tpXS5lLT5nZXRTaXplQnl0ZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KIAogCiBFbGVtZW50U3RhdGU6OkVsZW1lbnRTdGF0ZSgpCiB7CisgICAgY29uc3QgdWludDMyX3QgaW5pdGlhbENhcGFjaXR5ID0gMzI7CisgICAgbUJ1aWxkZXJFbGVtZW50cy5zZXRDYXBhY2l0eShpbml0aWFsQ2FwYWNpdHkpOworICAgIG1CdWlsZGVyTmFtZVN0cmluZ3Muc2V0Q2FwYWNpdHkoaW5pdGlhbENhcGFjaXR5KTsKKyAgICBtQnVpbGRlck5hbWVMZW5ndGhzLnNldENhcGFjaXR5KGluaXRpYWxDYXBhY2l0eSk7CisgICAgbUJ1aWxkZXJBcnJheXMuc2V0Q2FwYWNpdHkoaW5pdGlhbENhcGFjaXR5KTsKIH0KIAogRWxlbWVudFN0YXRlOjp+RWxlbWVudFN0YXRlKCkKQEAgLTIxMiw2ICszMjUsMjkgQEAKICAgICByc0Fzc2VydCghbUVsZW1lbnRzLnNpemUoKSk7CiB9CiAKK3ZvaWQgRWxlbWVudFN0YXRlOjplbGVtZW50QnVpbGRlckJlZ2luKCkgeworICAgIG1CdWlsZGVyRWxlbWVudHMuY2xlYXIoKTsKKyAgICBtQnVpbGRlck5hbWVTdHJpbmdzLmNsZWFyKCk7CisgICAgbUJ1aWxkZXJOYW1lTGVuZ3Rocy5jbGVhcigpOworICAgIG1CdWlsZGVyQXJyYXlzLmNsZWFyKCk7Cit9CisKK3ZvaWQgRWxlbWVudFN0YXRlOjplbGVtZW50QnVpbGRlckFkZChjb25zdCBFbGVtZW50ICplLCBjb25zdCBjaGFyICpuYW1lU3RyLCB1aW50MzJfdCBhcnJheVNpemUpIHsKKyAgICBtQnVpbGRlckVsZW1lbnRzLnB1c2goZSk7CisgICAgbUJ1aWxkZXJOYW1lU3RyaW5ncy5wdXNoKG5hbWVTdHIpOworICAgIG1CdWlsZGVyTmFtZUxlbmd0aHMucHVzaChzdHJsZW4obmFtZVN0cikpOworICAgIG1CdWlsZGVyQXJyYXlzLnB1c2goYXJyYXlTaXplKTsKKworfQorCitjb25zdCBFbGVtZW50ICpFbGVtZW50U3RhdGU6OmVsZW1lbnRCdWlsZGVyQ3JlYXRlKENvbnRleHQgKnJzYykgeworICAgIHJldHVybiBFbGVtZW50OjpjcmVhdGUocnNjLCBtQnVpbGRlckVsZW1lbnRzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihtQnVpbGRlckVsZW1lbnRzLmVkaXRBcnJheSgpWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihtQnVpbGRlck5hbWVTdHJpbmdzLmVkaXRBcnJheSgpWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXJOYW1lTGVuZ3Rocy5lZGl0QXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXJBcnJheXMuZWRpdEFycmF5KCkpOworfQorCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLwpAQCAtMjM1LDE0ICszNzEsNDEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSc0VsZW1lbnQgKiBlaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiogbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqIG5hbWVMZW5ndGhzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiBuYW1lTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKiBhcnJheVNpemVzKQogewogICAgIC8vTE9HRSgicnNpX0VsZW1lbnRDcmVhdGUyICVpIiwgY291bnQpOwotICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBFbGVtZW50OjpjcmVhdGUocnNjLCBjb3VudCwgKGNvbnN0IEVsZW1lbnQgKiopZWluLCBuYW1lcywgbmFtZUxlbmd0aHMpOworICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBFbGVtZW50OjpjcmVhdGUocnNjLCBjb3VudCwgKGNvbnN0IEVsZW1lbnQgKiopZWluLCBuYW1lcywgbmFtZUxlbmd0aHMsIGFycmF5U2l6ZXMpOwogICAgIGUtPmluY1VzZXJSZWYoKTsKICAgICByZXR1cm4gKFJzRWxlbWVudCllOwogfQogCit2b2lkIHJzaV9FbGVtZW50R2V0TmF0aXZlRGF0YShDb250ZXh0ICpyc2MsIFJzRWxlbWVudCBlbGVtLCB1aW50MzJfdCAqZWxlbURhdGEsIHVpbnQzMl90IGVsZW1EYXRhU2l6ZSkKK3sKKyAgICByc0Fzc2VydChlbGVtRGF0YVNpemUgPT0gNSk7CisgICAgLy8gd2Ugd2lsbCBwYWNrIG1UeXBlOyBtS2luZDsgbU5vcm1hbGl6ZWQ7IG1WZWN0b3JTaXplOyBOdW1TdWJFbGVtZW50cworICAgIEVsZW1lbnQgKmUgPSBzdGF0aWNfY2FzdDxFbGVtZW50ICo+KGVsZW0pOworCisgICAgKCplbGVtRGF0YSsrKSA9ICh1aW50MzJfdCllLT5nZXRUeXBlKCk7CisgICAgKCplbGVtRGF0YSsrKSA9ICh1aW50MzJfdCllLT5nZXRLaW5kKCk7CisgICAgKCplbGVtRGF0YSsrKSA9IGUtPmdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpID8gMSA6IDA7CisgICAgKCplbGVtRGF0YSsrKSA9IGUtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKTsKKyAgICAoKmVsZW1EYXRhKyspID0gZS0+Z2V0RmllbGRDb3VudCgpOworCit9CisKK3ZvaWQgcnNpX0VsZW1lbnRHZXRTdWJFbGVtZW50cyhDb250ZXh0ICpyc2MsIFJzRWxlbWVudCBlbGVtLCB1aW50MzJfdCAqaWRzLCBjb25zdCBjaGFyICoqbmFtZXMsIHVpbnQzMl90IGRhdGFTaXplKQoreworICAgIEVsZW1lbnQgKmUgPSBzdGF0aWNfY2FzdDxFbGVtZW50ICo+KGVsZW0pOworICAgIHJzQXNzZXJ0KGUtPmdldEZpZWxkQ291bnQoKSA9PSBkYXRhU2l6ZSk7CisKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBkYXRhU2l6ZTsgaSArKykgeworICAgICAgICBpZHNbaV0gPSAodWludDMyX3QpZS0+Z2V0RmllbGQoaSk7CisgICAgICAgIG5hbWVzW2ldID0gZS0+Z2V0RmllbGROYW1lKGkpOworICAgIH0KKworfQorCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNFbGVtZW50LmggYi9saWJzL3JzL3JzRWxlbWVudC5oCmluZGV4IDAyYTFjYTIuLjUwYmNhODUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNFbGVtZW50LmgKKysrIGIvbGlicy9ycy9yc0VsZW1lbnQuaApAQCAtNDAsOSArNDAsMTEgQEAKICAgICAgICAgcmV0dXJuIChnZXRTaXplQml0cygpICsgNykgPj4gMzsKICAgICB9CiAKLSAgICBzaXplX3QgZ2V0RmllbGRPZmZzZXRCaXRzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3Q7CisgICAgc2l6ZV90IGdldEZpZWxkT2Zmc2V0Qml0cyh1aW50MzJfdCBjb21wb25lbnROdW1iZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1GaWVsZHNbY29tcG9uZW50TnVtYmVyXS5vZmZzZXRCaXRzOworICAgIH0KICAgICBzaXplX3QgZ2V0RmllbGRPZmZzZXRCeXRlcyh1aW50MzJfdCBjb21wb25lbnROdW1iZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChnZXRGaWVsZE9mZnNldEJpdHMoY29tcG9uZW50TnVtYmVyKSArIDcpID4+IDM7CisgICAgICAgIHJldHVybiBtRmllbGRzW2NvbXBvbmVudE51bWJlcl0ub2Zmc2V0Qml0cyA+PiAzOwogICAgIH0KIAogICAgIHVpbnQzMl90IGdldEZpZWxkQ291bnQoKSBjb25zdCB7cmV0dXJuIG1GaWVsZENvdW50O30KQEAgLTU0LDE2ICs1NiwyMyBAQAogICAgIFJzRGF0YUtpbmQgZ2V0S2luZCgpIGNvbnN0IHtyZXR1cm4gbUNvbXBvbmVudC5nZXRLaW5kKCk7fQogICAgIHVpbnQzMl90IGdldEJpdHMoKSBjb25zdCB7cmV0dXJuIG1CaXRzO30KIAotICAgIFN0cmluZzggZ2V0Q1R5cGUodWludDMyX3QgaW5kZW50PTApIGNvbnN0OwotICAgIFN0cmluZzggZ2V0Q1N0cnVjdEJvZHkodWludDMyX3QgaW5kZW50PTApIGNvbnN0OwogICAgIFN0cmluZzggZ2V0R0xTTFR5cGUodWludDMyX3QgaW5kZW50PTApIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQ7IH0KKyAgICBzdGF0aWMgRWxlbWVudCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICBzdGF0aWMgY29uc3QgRWxlbWVudCAqIGNyZWF0ZShDb250ZXh0ICpyc2MsIFJzRGF0YVR5cGUgZHQsIFJzRGF0YUtpbmQgZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc05vcm0sIHVpbnQzMl90IHZlY1NpemUpOwogICAgIHN0YXRpYyBjb25zdCBFbGVtZW50ICogY3JlYXRlKENvbnRleHQgKnJzYywgc2l6ZV90IGNvdW50LCBjb25zdCBFbGVtZW50ICoqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiosIGNvbnN0IHNpemVfdCAqIGxlbmd0aHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiosIGNvbnN0IHNpemVfdCAqIGxlbmd0aHMsIGNvbnN0IHVpbnQzMl90ICphc2luKTsKKworICAgIHZvaWQgaW5jUmVmcyhjb25zdCB2b2lkICopIGNvbnN0OworICAgIHZvaWQgZGVjUmVmcyhjb25zdCB2b2lkICopIGNvbnN0OworICAgIGJvb2wgZ2V0SGFzUmVmZXJlbmNlcygpIGNvbnN0IHtyZXR1cm4gbUhhc1JlZmVyZW5jZTt9CisKKyAgICBib29sIGlzRXF1YWwoY29uc3QgRWxlbWVudCAqb3RoZXIpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZGVhbGxvY2F0ZSBhbnkgY29tcG9uZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgZWxlbWVudC4KQEAgLTcyLDkgKzgxLDEyIEBACiAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICBTdHJpbmc4IG5hbWU7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgRWxlbWVudD4gZTsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0Qml0czsKKyAgICAgICAgdWludDMyX3QgYXJyYXlTaXplOwogICAgIH0gRWxlbWVudEZpZWxkX3Q7CiAgICAgRWxlbWVudEZpZWxkX3QgKm1GaWVsZHM7CiAgICAgc2l6ZV90IG1GaWVsZENvdW50OworICAgIGJvb2wgbUhhc1JlZmVyZW5jZTsKIAogCiAgICAgRWxlbWVudChDb250ZXh0ICopOwpAQCAtODksOCArMTAxLDE3IEBACiAgICAgRWxlbWVudFN0YXRlKCk7CiAgICAgfkVsZW1lbnRTdGF0ZSgpOwogCisgICAgdm9pZCBlbGVtZW50QnVpbGRlckJlZ2luKCk7CisgICAgdm9pZCBlbGVtZW50QnVpbGRlckFkZChjb25zdCBFbGVtZW50ICplLCBjb25zdCBjaGFyICpuYW1lU3RyLCB1aW50MzJfdCBhcnJheVNpemUpOworICAgIGNvbnN0IEVsZW1lbnQgKmVsZW1lbnRCdWlsZGVyQ3JlYXRlKENvbnRleHQgKnJzYyk7CisKICAgICAvLyBDYWNoZSBvZiBhbGwgZXhpc3RpbmcgZWxlbWVudHMuCi0gICAgVmVjdG9yPGNvbnN0IEVsZW1lbnQgKj4gbUVsZW1lbnRzOworICAgIFZlY3RvcjxFbGVtZW50ICo+IG1FbGVtZW50czsKK3ByaXZhdGU6CisgICAgVmVjdG9yPGNvbnN0IEVsZW1lbnQgKj4gbUJ1aWxkZXJFbGVtZW50czsKKyAgICBWZWN0b3I8Y29uc3QgY2hhcio+IG1CdWlsZGVyTmFtZVN0cmluZ3M7CisgICAgVmVjdG9yPHNpemVfdD4gbUJ1aWxkZXJOYW1lTGVuZ3RoczsKKyAgICBWZWN0b3I8dWludDMyX3Q+IG1CdWlsZGVyQXJyYXlzOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRmlsZUEzRC5jcHAgYi9saWJzL3JzL3JzRmlsZUEzRC5jcHAKaW5kZXggZTMyNzJjNS4uYzkwZWRjMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0QuY3BwCisrKyBiL2xpYnMvcnMvcnNGaWxlQTNELmNwcApAQCAtMTUsODEgKzE1LDE5MyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgInJzRmlsZUEzRC5oIgogCiAjaW5jbHVkZSAicnNNZXNoLmgiCisjaW5jbHVkZSAicnNBbmltYXRpb24uaCIKKwogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKLQotCi1GaWxlQTNEOjpGaWxlQTNEKCkKK0ZpbGVBM0Q6OkZpbGVBM0QoQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewotICAgIG1Sc2MgPSBOVUxMOworICAgIG1BbGxvYyA9IE5VTEw7CisgICAgbURhdGEgPSBOVUxMOworICAgIG1Xcml0ZVN0cmVhbSA9IE5VTEw7CisgICAgbVJlYWRTdHJlYW0gPSBOVUxMOworCisgICAgbU1ham9yVmVyc2lvbiA9IDA7CisgICAgbU1pbm9yVmVyc2lvbiA9IDE7CisgICAgbURhdGFTaXplID0gMDsKIH0KIAogRmlsZUEzRDo6fkZpbGVBM0QoKQogeworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtSW5kZXguc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtSW5kZXhbaV07CisgICAgfQorICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtV3JpdGVJbmRleC5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1Xcml0ZUluZGV4W2ldOworICAgIH0KKyAgICBpZihtV3JpdGVTdHJlYW0pIHsKKyAgICAgICAgZGVsZXRlIG1Xcml0ZVN0cmVhbTsKKyAgICB9CisgICAgaWYobVJlYWRTdHJlYW0pIHsKKyAgICAgICAgZGVsZXRlIG1Xcml0ZVN0cmVhbTsKKyAgICB9CisgICAgaWYobUFsbG9jKSB7CisgICAgICAgIGZyZWUobUFsbG9jKTsKKyAgICB9CiB9CiAKLWJvb2wgRmlsZUEzRDo6bG9hZChDb250ZXh0ICpyc2MsIEZJTEUgKmYpCit2b2lkIEZpbGVBM0Q6OnBhcnNlSGVhZGVyKElTdHJlYW0gKmhlYWRlclN0cmVhbSkKK3sKKyAgICBtTWFqb3JWZXJzaW9uID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgbU1pbm9yVmVyc2lvbiA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgIHVpbnQzMl90IGZsYWdzID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgbVVzZTY0Qml0T2Zmc2V0cyA9IChmbGFncyAmIDEpICE9IDA7CisKKyAgICB1aW50MzJfdCBudW1JbmRleEVudHJpZXMgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBudW1JbmRleEVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgQTNESW5kZXhFbnRyeSAqZW50cnkgPSBuZXcgQTNESW5kZXhFbnRyeSgpOworICAgICAgICBoZWFkZXJTdHJlYW0tPmxvYWRTdHJpbmcoJmVudHJ5LT5tT2JqZWN0TmFtZSk7CisgICAgICAgIExPR1YoIkhlYWRlciBkYXRhLCBlbnRyeSBuYW1lID0gJXMiLCBlbnRyeS0+bU9iamVjdE5hbWUuc3RyaW5nKCkpOworICAgICAgICBlbnRyeS0+bVR5cGUgPSAoUnNBM0RDbGFzc0lEKWhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICBpZihtVXNlNjRCaXRPZmZzZXRzKXsKKyAgICAgICAgICAgIGVudHJ5LT5tT2Zmc2V0ID0gaGVhZGVyU3RyZWFtLT5sb2FkT2Zmc2V0KCk7CisgICAgICAgICAgICBlbnRyeS0+bUxlbmd0aCA9IGhlYWRlclN0cmVhbS0+bG9hZE9mZnNldCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZW50cnktPm1PZmZzZXQgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgICAgIGVudHJ5LT5tTGVuZ3RoID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIH0KKyAgICAgICAgZW50cnktPm1Sc09iaiA9IE5VTEw7CisgICAgICAgIG1JbmRleC5wdXNoKGVudHJ5KTsKKyAgICB9Cit9CisKK2Jvb2wgRmlsZUEzRDo6bG9hZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmxvY2FsRGF0YSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgIHNpemVfdCBsZW5ndGhSZW1haW5pbmcgPSBsZW5ndGg7CisgICAgc2l6ZV90IG1hZ2ljU3RyTGVuID0gMTI7CisgICAgaWYgKChsZW5ndGggPCBtYWdpY1N0ckxlbikgfHwKKyAgICAgICAgbWVtY21wKGRhdGEsICJBbmRyb2lkM0RfZmYiLCBtYWdpY1N0ckxlbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxvY2FsRGF0YSArPSBtYWdpY1N0ckxlbjsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gbWFnaWNTdHJMZW47CisKKyAgICAvLyBOZXh0IHdlIGdldCBvdXIgaGVhZGVyIHNpemUKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gMDsKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBzaXplb2YoaGVhZGVyU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lbWNweSgmaGVhZGVyU2l6ZSwgbG9jYWxEYXRhLCBzaXplb2YoaGVhZGVyU2l6ZSkpOworICAgIGxvY2FsRGF0YSArPSBzaXplb2YoaGVhZGVyU2l6ZSk7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IHNpemVvZihoZWFkZXJTaXplKTsKKworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IGhlYWRlclNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgKmhlYWRlckRhdGEgPSAodWludDhfdCAqKW1hbGxvYyhoZWFkZXJTaXplKTsKKyAgICBpZighaGVhZGVyRGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWVtY3B5KGhlYWRlckRhdGEsIGxvY2FsRGF0YSwgaGVhZGVyU2l6ZSk7CisKKyAgICAvLyBOb3cgb3BlbiB0aGUgc3RyZWFtIHRvIHBhcnNlIHRoZSBoZWFkZXIKKyAgICBJU3RyZWFtIGhlYWRlclN0cmVhbShoZWFkZXJEYXRhLCBmYWxzZSk7CisgICAgcGFyc2VIZWFkZXIoJmhlYWRlclN0cmVhbSk7CisKKyAgICBmcmVlKGhlYWRlckRhdGEpOworCisgICAgbG9jYWxEYXRhICs9IGhlYWRlclNpemU7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IGhlYWRlclNpemU7CisKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBzaXplb2YobURhdGFTaXplKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICAgIG1lbWNweSgmbURhdGFTaXplLCBsb2NhbERhdGEsIHNpemVvZihtRGF0YVNpemUpKTsKKyAgICBsb2NhbERhdGEgKz0gc2l6ZW9mKG1EYXRhU2l6ZSk7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IHNpemVvZihtRGF0YVNpemUpOworCisgICAgaWYobGVuZ3RoUmVtYWluaW5nIDwgbURhdGFTaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBXZSBzaG91bGQga25vdyBlbm91Z2ggdG8gcmVhZCB0aGUgZmlsZSBpbiBhdCB0aGlzIHBvaW50LgorICAgIG1BbGxvYyA9IG1hbGxvYyhtRGF0YVNpemUpOworICAgIGlmICghbUFsbG9jKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbURhdGEgPSAodWludDhfdCAqKW1BbGxvYzsKKyAgICBtZW1jcHkobUFsbG9jLCBsb2NhbERhdGEsIG1EYXRhU2l6ZSk7CisKKyAgICBtUmVhZFN0cmVhbSA9IG5ldyBJU3RyZWFtKG1EYXRhLCBtVXNlNjRCaXRPZmZzZXRzKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZpbGVBM0Q6OmxvYWQoRklMRSAqZikKIHsKICAgICBjaGFyIG1hZ2ljU3RyaW5nWzEyXTsKICAgICBzaXplX3QgbGVuOwogCi0gICAgTE9HRSgiZmlsZSBvcGVuIDEiKTsKKyAgICBMT0dWKCJmaWxlIG9wZW4gMSIpOwogICAgIGxlbiA9IGZyZWFkKG1hZ2ljU3RyaW5nLCAxLCAxMiwgZik7CiAgICAgaWYgKChsZW4gIT0gMTIpIHx8CiAgICAgICAgIG1lbWNtcChtYWdpY1N0cmluZywgIkFuZHJvaWQzRF9mZiIsIDEyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgTE9HRSgiZmlsZSBvcGVuIDIiKTsKLSAgICBsZW4gPSBmcmVhZCgmbU1ham9yVmVyc2lvbiwgMSwgc2l6ZW9mKG1NYWpvclZlcnNpb24pLCBmKTsKLSAgICBpZiAobGVuICE9IHNpemVvZihtTWFqb3JWZXJzaW9uKSkgeworICAgIC8vIE5leHQgdGhpbmcgaXMgdGhlIHNpemUgb2YgdGhlIGhlYWRlcgorICAgIHVpbnQ2NF90IGhlYWRlclNpemUgPSAwOworICAgIGxlbiA9IGZyZWFkKCZoZWFkZXJTaXplLCAxLCBzaXplb2YoaGVhZGVyU2l6ZSksIGYpOworICAgIGlmIChsZW4gIT0gc2l6ZW9mKGhlYWRlclNpemUpIHx8IGhlYWRlclNpemUgPT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgTE9HRSgiZmlsZSBvcGVuIDMiKTsKLSAgICBsZW4gPSBmcmVhZCgmbU1pbm9yVmVyc2lvbiwgMSwgc2l6ZW9mKG1NaW5vclZlcnNpb24pLCBmKTsKLSAgICBpZiAobGVuICE9IHNpemVvZihtTWlub3JWZXJzaW9uKSkgeworICAgIHVpbnQ4X3QgKmhlYWRlckRhdGEgPSAodWludDhfdCAqKW1hbGxvYyhoZWFkZXJTaXplKTsKKyAgICBpZighaGVhZGVyRGF0YSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgTE9HRSgiZmlsZSBvcGVuIDQiKTsKLSAgICB1aW50MzJfdCBmbGFnczsKLSAgICBsZW4gPSBmcmVhZCgmZmxhZ3MsIDEsIHNpemVvZihmbGFncyksIGYpOwotICAgIGlmIChsZW4gIT0gc2l6ZW9mKGZsYWdzKSkgeworICAgIGxlbiA9IGZyZWFkKGhlYWRlckRhdGEsIDEsIGhlYWRlclNpemUsIGYpOworICAgIGlmIChsZW4gIT0gaGVhZGVyU2l6ZSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIG1Vc2U2NEJpdE9mZnNldHMgPSAoZmxhZ3MgJiAxKSAhPSAwOwogCi0gICAgTE9HRSgiZmlsZSBvcGVuIDY0Yml0ID0gJWkiLCBtVXNlNjRCaXRPZmZzZXRzKTsKKyAgICAvLyBOb3cgb3BlbiB0aGUgc3RyZWFtIHRvIHBhcnNlIHRoZSBoZWFkZXIKKyAgICBJU3RyZWFtIGhlYWRlclN0cmVhbShoZWFkZXJEYXRhLCBmYWxzZSk7CisgICAgcGFyc2VIZWFkZXIoJmhlYWRlclN0cmVhbSk7CiAKLSAgICBpZiAobVVzZTY0Qml0T2Zmc2V0cykgewotICAgICAgICBsZW4gPSBmcmVhZCgmbURhdGFTaXplLCAxLCBzaXplb2YobURhdGFTaXplKSwgZik7Ci0gICAgICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1EYXRhU2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQzMl90IHRtcDsKLSAgICAgICAgbGVuID0gZnJlYWQoJnRtcCwgMSwgc2l6ZW9mKHRtcCksIGYpOwotICAgICAgICBpZiAobGVuICE9IHNpemVvZih0bXApKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbURhdGFTaXplID0gdG1wOworICAgIGZyZWUoaGVhZGVyRGF0YSk7CisKKyAgICAvLyBOZXh0IHRoaW5nIGlzIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIKKyAgICBsZW4gPSBmcmVhZCgmbURhdGFTaXplLCAxLCBzaXplb2YobURhdGFTaXplKSwgZik7CisgICAgaWYgKGxlbiAhPSBzaXplb2YobURhdGFTaXplKSB8fCBtRGF0YVNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgTE9HRSgiZmlsZSBvcGVuIHNpemUgPSAlbGxpIiwgbURhdGFTaXplKTsKKyAgICBMT0dWKCJmaWxlIG9wZW4gc2l6ZSA9ICVsbGkiLCBtRGF0YVNpemUpOwogCiAgICAgLy8gV2Ugc2hvdWxkIGtub3cgZW5vdWdoIHRvIHJlYWQgdGhlIGZpbGUgaW4gYXQgdGhpcyBwb2ludC4KLSAgICBmc2VlayhmLCBTRUVLX1NFVCwgMCk7Ci0gICAgbUFsbG9jPSBtYWxsb2MobURhdGFTaXplKTsKKyAgICBtQWxsb2MgPSBtYWxsb2MobURhdGFTaXplKTsKICAgICBpZiAoIW1BbGxvYykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtOTksMjgyICsyMTEsMjUyIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIHN0YXJ0IHByb2Nlc3NpbmciKTsKLSAgICByZXR1cm4gcHJvY2Vzcyhyc2MpOworICAgIG1SZWFkU3RyZWFtID0gbmV3IElTdHJlYW0obURhdGEsIG1Vc2U2NEJpdE9mZnNldHMpOworCisgICAgTE9HVigiSGVhZGVyIGlzIHJlYWQgYW4gc3RyZWFtIGluaXRpYWxpemVkIik7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgRmlsZUEzRDo6cHJvY2Vzc0luZGV4KENvbnRleHQgKnJzYywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgYm9vbCByZXQgPSBmYWxzZTsKLSAgICBJTyBpbyhtRGF0YSArIGllLT5tT2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKK3NpemVfdCBGaWxlQTNEOjpnZXROdW1JbmRleEVudHJpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbmRleC5zaXplKCk7Cit9CiAKLSAgICBMT0dFKCJwcm9jZXNzIGluZGV4LCB0eXBlICVpIiwgaWUtPm1UeXBlKTsKLQotICAgIHN3aXRjaChpZS0+bVR5cGUpIHsKLSAgICBjYXNlIENIVU5LX0VMRU1FTlQ6Ci0gICAgICAgIHByb2Nlc3NDaHVua19FbGVtZW50KHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfRUxFTUVOVF9TT1VSQ0U6Ci0gICAgICAgIHByb2Nlc3NDaHVua19FbGVtZW50U291cmNlKHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfVkVSVElDSUVTOgotICAgICAgICBwcm9jZXNzQ2h1bmtfVmVydGljaWVzKHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfTUVTSDoKLSAgICAgICAgcHJvY2Vzc0NodW5rX01lc2gocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19QUklNSVRJVkU6Ci0gICAgICAgIHByb2Nlc3NDaHVua19QcmltaXRpdmUocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HRSgiRmlsZUEzRCBVbmtub3duIGNodW5rIHR5cGUiKTsKLSAgICAgICAgYnJlYWs7Citjb25zdCBGaWxlQTNEOjpBM0RJbmRleEVudHJ5ICpGaWxlQTNEOjpnZXRJbmRleEVudHJ5KHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmKGluZGV4IDwgbUluZGV4LnNpemUoKSkgeworICAgICAgICByZXR1cm4gbUluZGV4W2luZGV4XTsKICAgICB9Ci0gICAgcmV0dXJuIChpZS0+bVJzT2JqICE9IE5VTEwpOworICAgIHJldHVybiBOVUxMOwogfQogCi1ib29sIEZpbGVBM0Q6OnByb2Nlc3MoQ29udGV4dCAqcnNjKQotewotICAgIExPR0UoInByb2Nlc3MiKTsKLSAgICBJTyBpbyhtRGF0YSArIDEyLCBtVXNlNjRCaXRPZmZzZXRzKTsKLSAgICBib29sIHJldCA9IHRydWU7Ci0KLSAgICAvLyBCdWlsZCB0aGUgaW5kZXggZmlyc3QKLSAgICBMT0dFKCJwcm9jZXNzIDEiKTsKLSAgICBpby5sb2FkVTMyKCk7IC8vIG1ham9yIHZlcnNpb24sIGFscmVhZHkgbG9hZGVkCi0gICAgaW8ubG9hZFUzMigpOyAvLyBtaW5vciB2ZXJzaW9uLCBhbHJlYWR5IGxvYWRlZAotICAgIExPR0UoInByb2Nlc3MgMiIpOwotCi0gICAgaW8ubG9hZFUzMigpOyAgLy8gZmxhZ3MKLSAgICBpby5sb2FkT2Zmc2V0KCk7IC8vIGZpbGVzaXplLCBhbHJlYWR5IGxvYWRlZC4KLSAgICBMT0dFKCJwcm9jZXNzIDQiKTsKLSAgICB1aW50NjRfdCBtSW5kZXhPZmZzZXQgPSBpby5sb2FkT2Zmc2V0KCk7Ci0gICAgdWludDY0X3QgbVN0cmluZ09mZnNldCA9IGlvLmxvYWRPZmZzZXQoKTsKLQotICAgIExPR0UoInByb2Nlc3MgbUluZGV4T2Zmc2V0PSAweCUwMTZsbHgiLCBtSW5kZXhPZmZzZXQpOwotICAgIExPR0UoInByb2Nlc3MgbVN0cmluZ09mZnNldD0gMHglMDE2bGx4IiwgbVN0cmluZ09mZnNldCk7Ci0KLSAgICBJTyBpbmRleChtRGF0YSArIG1JbmRleE9mZnNldCwgbVVzZTY0Qml0T2Zmc2V0cyk7Ci0gICAgSU8gc3RyaW5nVGFibGUobURhdGEgKyBtU3RyaW5nT2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKLQotICAgIHVpbnQzMl90IHN0cmluZ0VudHJ5Q291bnQgPSBzdHJpbmdUYWJsZS5sb2FkVTMyKCk7Ci0gICAgTE9HRSgic3RyaW5nRW50cnlDb3VudCAlaSIsIHN0cmluZ0VudHJ5Q291bnQpOwotICAgIG1TdHJpbmdzLnNldENhcGFjaXR5KHN0cmluZ0VudHJ5Q291bnQpOwotICAgIG1TdHJpbmdJbmRleFZhbHVlcy5zZXRDYXBhY2l0eShzdHJpbmdFbnRyeUNvdW50KTsKLSAgICBpZiAoc3RyaW5nRW50cnlDb3VudCkgewotICAgICAgICB1aW50MzJfdCBzdHJpbmdUeXBlID0gc3RyaW5nVGFibGUubG9hZFUzMigpOwotICAgICAgICBMT0dFKCJzdHJpbmdUeXBlICVpIiwgc3RyaW5nVHlwZSk7Ci0gICAgICAgIHJzQXNzZXJ0KHN0cmluZ1R5cGU9PTApOwotICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBzdHJpbmdFbnRyeUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQgPSBzdHJpbmdUYWJsZS5sb2FkT2Zmc2V0KCk7Ci0gICAgICAgICAgICBMT0dFKCJzdHJpbmcgb2Zmc2V0IDB4JTAxNmxseCIsIG9mZnNldCk7Ci0gICAgICAgICAgICBJTyB0bXAobURhdGEgKyBvZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOwotICAgICAgICAgICAgU3RyaW5nOCBzOwotICAgICAgICAgICAgdG1wLmxvYWRTdHJpbmcoJnMpOwotICAgICAgICAgICAgTE9HRSgic3RyaW5nICVzIiwgcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBtU3RyaW5ncy5wdXNoKHMpOwotICAgICAgICB9CitPYmplY3RCYXNlICpGaWxlQTNEOjppbml0aWFsaXplRnJvbUVudHJ5KHNpemVfdCBpbmRleCkgeworICAgIGlmKGluZGV4ID49IG1JbmRleC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTE9HRSgic3RyaW5ncyBkb25lIik7Ci0gICAgdWludDMyX3QgaW5kZXhFbnRyeUNvdW50ID0gaW5kZXgubG9hZFUzMigpOwotICAgIExPR0UoImluZGV4IGNvdW50ICVpIiwgaW5kZXhFbnRyeUNvdW50KTsKLSAgICBtSW5kZXguc2V0Q2FwYWNpdHkoaW5kZXhFbnRyeUNvdW50KTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpbmRleEVudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgQTNESW5kZXhFbnRyeSBlOwotICAgICAgICB1aW50MzJfdCBzdHJpbmdJbmRleCA9IGluZGV4LmxvYWRVMzIoKTsKLSAgICAgICAgTE9HRSgiaW5kZXggJWkiLCBjdCk7Ci0gICAgICAgIExPR0UoIiAgc3RyaW5nIGluZGV4ICVpIiwgc3RyaW5nSW5kZXgpOwotICAgICAgICBlLm1UeXBlID0gKEEzRENodW5rVHlwZSlpbmRleC5sb2FkVTMyKCk7Ci0gICAgICAgIExPR0UoIiAgdHlwZSAlaSIsIGUubVR5cGUpOwotICAgICAgICBlLm1PZmZzZXQgPSBpbmRleC5sb2FkT2Zmc2V0KCk7Ci0gICAgICAgIExPR0UoIiAgb2Zmc2V0IDB4JTAxNmxseCIsIGUubU9mZnNldCk7Ci0KLSAgICAgICAgaWYgKHN0cmluZ0luZGV4ICYmIChzdHJpbmdJbmRleCA8IG1TdHJpbmdzLnNpemUoKSkpIHsKLSAgICAgICAgICAgIGUubUlEID0gbVN0cmluZ3Nbc3RyaW5nSW5kZXhdOwotICAgICAgICAgICAgbVN0cmluZ0luZGV4VmFsdWVzLmVkaXRJdGVtQXQoc3RyaW5nSW5kZXgpID0gY3Q7Ci0gICAgICAgICAgICBMT0dFKCIgIGlkICVzIiwgZS5tSUQuc3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUluZGV4LnB1c2goZSk7Ci0gICAgfQotICAgIExPR0UoImluZGV4IGRvbmUiKTsKLQotICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIGluZGV4IHNob3VsZCBiZSBmdWxseSBwb3B1bGF0ZWQuCi0gICAgLy8gV2UgY2FuIG5vdyB3YWxrIHRob3VnaCBpdCBhbmQgbG9hZCBhbGwgdGhlIG9iamVjdHMuCi0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgaW5kZXhFbnRyeUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIExPR0UoInByb2Nlc3NpbmcgaW5kZXggZW50cnkgJWkiLCBjdCk7Ci0gICAgICAgIHByb2Nlc3NJbmRleChyc2MsICZtSW5kZXguZWRpdEl0ZW1BdChjdCkpOworICAgIEZpbGVBM0Q6OkEzREluZGV4RW50cnkgKmVudHJ5ID0gbUluZGV4W2luZGV4XTsKKyAgICBpZighZW50cnkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgcmV0dXJuIHJldDsKLX0KLQotCi1GaWxlQTNEOjpJTzo6SU8oY29uc3QgdWludDhfdCAqYnVmLCBib29sIHVzZTY0KQotewotICAgIG1EYXRhID0gYnVmOwotICAgIG1Qb3MgPSAwOwotICAgIG1Vc2U2NCA9IHVzZTY0OwotfQotCi11aW50NjRfdCBGaWxlQTNEOjpJTzo6bG9hZE9mZnNldCgpCi17Ci0gICAgdWludDY0X3QgdG1wOwotICAgIGlmIChtVXNlNjQpIHsKLSAgICAgICAgbVBvcyA9IChtUG9zICsgNykgJiAofjcpOwotICAgICAgICB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKLSAgICAgICAgcmV0dXJuIHRtcDsKKyAgICBpZihlbnRyeS0+bVJzT2JqKSB7CisgICAgICAgIGVudHJ5LT5tUnNPYmotPmluY1VzZXJSZWYoKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5LT5tUnNPYmo7CiAgICAgfQotICAgIHJldHVybiBsb2FkVTMyKCk7Ci19CiAKLXZvaWQgRmlsZUEzRDo6SU86OmxvYWRTdHJpbmcoU3RyaW5nOCAqcykKLXsKLSAgICBMT0dFKCJsb2FkU3RyaW5nIik7Ci0gICAgdWludDMyX3QgbGVuID0gbG9hZFUzMigpOwotICAgIExPR0UoImxvYWRTdHJpbmcgbGVuICVpIiwgbGVuKTsKLSAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKSZtRGF0YVttUG9zXSwgbGVuKTsKLSAgICBtUG9zICs9IGxlbjsKLX0KLQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19NZXNoKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBNZXNoICogbSA9IG5ldyBNZXNoKHJzYyk7Ci0KLSAgICBtLT5tUHJpbWl0aXZlc0NvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBtLT5tUHJpbWl0aXZlcyA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdCAqW20tPm1QcmltaXRpdmVzQ291bnRdOwotCi0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbS0+bVByaW1pdGl2ZXNDb3VudDsgY3QrKykgewotICAgICAgICB1aW50MzJfdCBpbmRleCA9IGlvLT5sb2FkVTMyKCk7Ci0KLSAgICAgICAgbS0+bVByaW1pdGl2ZXNbY3RdID0gKE1lc2g6OlByaW1pdGl2ZV90ICopbUluZGV4W2luZGV4XS5tUnNPYmo7Ci0gICAgfQotICAgIGllLT5tUnNPYmogPSBtOwotfQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19QcmltaXRpdmUoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2g6OlByaW1pdGl2ZV90ICogcCA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdDsKLQotICAgIHAtPm1JbmRleENvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICB1aW50MzJfdCB2ZXJ0SWR4ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBwLT5tUmVzdGFydENvdW50cyA9IGlvLT5sb2FkVTE2KCk7Ci0gICAgdWludDMyX3QgYml0cyA9IGlvLT5sb2FkVTgoKTsKLSAgICBwLT5tVHlwZSA9IChSc1ByaW1pdGl2ZSlpby0+bG9hZFU4KCk7Ci0KLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfUHJpbWl0aXZlIGNvdW50ICVpLCBiaXRzICVpIiwgcC0+bUluZGV4Q291bnQsIGJpdHMpOwotCi0gICAgcC0+bVZlcnRpY2llcyA9IChNZXNoOjpWZXJ0aWNpZXNfdCAqKW1JbmRleFt2ZXJ0SWR4XS5tUnNPYmo7Ci0KLSAgICBwLT5tSW5kaWNpZXMgPSBuZXcgdWludDE2X3RbcC0+bUluZGV4Q291bnRdOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHAtPm1JbmRleENvdW50OyBjdCsrKSB7Ci0gICAgICAgIHN3aXRjaChiaXRzKSB7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFU4KCk7CisgICAgLy8gU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIG9iamVjdAorICAgIG1SZWFkU3RyZWFtLT5yZXNldChlbnRyeS0+bU9mZnNldCk7CisgICAgc3dpdGNoIChlbnRyeS0+bVR5cGUpIHsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9NRVNIOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IE1lc2g6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICBwLT5tSW5kaWNpZXNbY3RdID0gaW8tPmxvYWRVMTYoKTsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfVFlQRToKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBUeXBlOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgcC0+bUluZGljaWVzW2N0XSA9IGlvLT5sb2FkVTMyKCk7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtVmVydGV4OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1JBU1RFUjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtUmFzdGVyOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5UOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1GcmFnbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9TVE9SRToKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtU3RvcmU6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVI6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gU2FtcGxlcjo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQU5JTUFUSU9OOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFuaW1hdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBZGFwdGVyMUQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQWRhcHRlcjJEOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQzoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZihlbnRyeS0+bVJzT2JqKSB7CisgICAgICAgIGVudHJ5LT5tUnNPYmotPmluY1VzZXJSZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5LT5tUnNPYmo7Cit9CisKK2Jvb2wgRmlsZUEzRDo6d3JpdGVGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGlmKCFtV3JpdGVTdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiTm8gb2JqZWN0cyB0byB3cml0ZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYobVdyaXRlU3RyZWFtLT5nZXRQb3MoKSA9PSAwKSB7CisgICAgICAgIExPR0UoIk5vIG9iamVjdHMgdG8gd3JpdGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRklMRSAqd3JpdGVIYW5kbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgaWYoIXdyaXRlSGFuZGxlKSB7CisgICAgICAgIExPR0UoIkNvdWxkbid0IG9wZW4gdGhlIGZpbGUgZm9yIHdyaXRpbmdcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gT3BlbiBhIG5ldyBzdHJlYW0gdG8gbWFrZSB3cml0aW5nIHRoZSBoZWFkZXIgZWFzaWVyCisgICAgT1N0cmVhbSBoZWFkZXJTdHJlYW0oNSoxMDI0LCBmYWxzZSk7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihtTWFqb3JWZXJzaW9uKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG1NaW5vclZlcnNpb24pOworICAgIHVpbnQzMl90IGlzNjRCaXQgPSAwOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIoaXM2NEJpdCk7CisKKyAgICB1aW50MzJfdCB3cml0ZUluZGV4U2l6ZSA9IG1Xcml0ZUluZGV4LnNpemUoKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKHdyaXRlSW5kZXhTaXplKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZUluZGV4U2l6ZTsgaSArKykgeworICAgICAgICBoZWFkZXJTdHJlYW0uYWRkU3RyaW5nKCZtV3JpdGVJbmRleFtpXS0+bU9iamVjdE5hbWUpOworICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKCh1aW50MzJfdCltV3JpdGVJbmRleFtpXS0+bVR5cGUpOworICAgICAgICBpZihtVXNlNjRCaXRPZmZzZXRzKXsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRPZmZzZXQobVdyaXRlSW5kZXhbaV0tPm1PZmZzZXQpOworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZE9mZnNldChtV3JpdGVJbmRleFtpXS0+bUxlbmd0aCk7CiAgICAgICAgIH0KLSAgICAgICAgTE9HRSgiICBpZHggJWkiLCBwLT5tSW5kaWNpZXNbY3RdKTsKLSAgICB9Ci0KLSAgICBpZiAocC0+bVJlc3RhcnRDb3VudHMpIHsKLSAgICAgICAgcC0+bVJlc3RhcnRzID0gbmV3IHVpbnQxNl90W3AtPm1SZXN0YXJ0Q291bnRzXTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcC0+bVJlc3RhcnRDb3VudHM7IGN0KyspIHsKLSAgICAgICAgICAgIHN3aXRjaChiaXRzKSB7Ci0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTgoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTE2KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgIHAtPm1SZXN0YXJ0c1tjdF0gPSBpby0+bG9hZFUzMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HRSgiICBpZHggJWkiLCBwLT5tUmVzdGFydHNbY3RdKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1PZmZzZXQ7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgPSAodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1MZW5ndGg7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG9mZnNldCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBwLT5tUmVzdGFydHMgPSBOVUxMOwogICAgIH0KIAotICAgIGllLT5tUnNPYmogPSBwOworICAgIC8vIFdyaXRlIG91ciBtYWdpYyBzdHJpbmcgc28gd2Uga25vdyB3ZSBhcmUgcmVhZGluZyB0aGUgcmlnaHQgZmlsZQorICAgIFN0cmluZzggbWFnaWNTdHJpbmcoQTNEX01BR0lDX0tFWSk7CisgICAgZndyaXRlKG1hZ2ljU3RyaW5nLnN0cmluZygpLCBzaXplb2YoY2hhciksIG1hZ2ljU3RyaW5nLnNpemUoKSwgd3JpdGVIYW5kbGUpOworCisgICAgLy8gU3RvcmUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciB0byBtYWtlIGl0IGVhc2llciB0byBwYXJzZSB3aGVuIHdlIHJlYWQgaXQKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gaGVhZGVyU3RyZWFtLmdldFBvcygpOworICAgIGZ3cml0ZSgmaGVhZGVyU2l6ZSwgc2l6ZW9mKGhlYWRlclNpemUpLCAxLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBOb3cgd3JpdGUgb3VyIGhlYWRlcgorICAgIGZ3cml0ZShoZWFkZXJTdHJlYW0uZ2V0UHRyKCksIHNpemVvZih1aW50OF90KSwgaGVhZGVyU3RyZWFtLmdldFBvcygpLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBOb3cgd3JpdGUgdGhlIHNpemUgb2YgdGhlIGRhdGEgcGFydCBvZiB0aGUgZmlsZSBmb3IgZWFzaWVyIHBhcnNpbmcgbGF0ZXIKKyAgICB1aW50NjRfdCBmaWxlRGF0YVNpemUgPSBtV3JpdGVTdHJlYW0tPmdldFBvcygpOworICAgIGZ3cml0ZSgmZmlsZURhdGFTaXplLCBzaXplb2YoZmlsZURhdGFTaXplKSwgMSwgd3JpdGVIYW5kbGUpOworCisgICAgZndyaXRlKG1Xcml0ZVN0cmVhbS0+Z2V0UHRyKCksIHNpemVvZih1aW50OF90KSwgbVdyaXRlU3RyZWFtLT5nZXRQb3MoKSwgd3JpdGVIYW5kbGUpOworCisgICAgaW50IHN0YXR1cyA9IGZjbG9zZSh3cml0ZUhhbmRsZSk7CisKKyAgICBpZihzdGF0dXMgIT0gMCkgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBjbG9zZSBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19WZXJ0aWNpZXMoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2g6OlZlcnRpY2llc190ICpjdiA9IG5ldyBNZXNoOjpWZXJ0aWNpZXNfdDsKLSAgICBjdi0+bUFsbG9jYXRpb25Db3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgY3YtPm1BbGxvY2F0aW9ucyA9IG5ldyBBbGxvY2F0aW9uICpbY3YtPm1BbGxvY2F0aW9uQ291bnRdOwotICAgIExPR0UoInByb2Nlc3NDaHVua19WZXJ0aWNpZXMgY291bnQgJWkiLCBjdi0+bUFsbG9jYXRpb25Db3VudCk7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgY3YtPm1BbGxvY2F0aW9uQ291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3QgaSA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgICAgIGN2LT5tQWxsb2NhdGlvbnNbY3RdID0gKEFsbG9jYXRpb24gKiltSW5kZXhbaV0ubVJzT2JqOwotICAgICAgICBMT0dFKCIgIGlkeCAlaSIsIGkpOwordm9pZCBGaWxlQTNEOjphcHBlbmRUb0ZpbGUoT2JqZWN0QmFzZSAqb2JqKSB7CisgICAgaWYoIW9iaikgeworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGllLT5tUnNPYmogPSBjdjsKLX0KLQotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfRWxlbWVudChDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgLyoKLSAgICByc2lfRWxlbWVudEJlZ2luKHJzYyk7Ci0KLSAgICB1aW50MzJfdCBjb3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnQgY291bnQgJWkiLCBjb3VudCk7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLSAgICAgICAgUnNEYXRhS2luZCBkayA9IChSc0RhdGFLaW5kKWlvLT5sb2FkVTgoKTsKLSAgICAgICAgUnNEYXRhVHlwZSBkdCA9IChSc0RhdGFUeXBlKWlvLT5sb2FkVTgoKTsKLSAgICAgICAgdWludDMyX3QgYml0cyA9IGlvLT5sb2FkVTgoKTsKLSAgICAgICAgYm9vbCBpc05vcm0gPSBpby0+bG9hZFU4KCkgIT0gMDsKLSAgICAgICAgTE9HRSgiICAlaSAlaSAlaSAlaSIsIGRrLCBkdCwgYml0cywgaXNOb3JtKTsKLSAgICAgICAgcnNpX0VsZW1lbnRBZGQocnNjLCBkaywgZHQsIGlzTm9ybSwgYml0cywgMCk7CisgICAgaWYoIW1Xcml0ZVN0cmVhbSkgeworICAgICAgICBjb25zdCB1aW50NjRfdCBpbml0aWFsU3RyZWFtU2l6ZSA9IDI1NioxMDI0OworICAgICAgICBtV3JpdGVTdHJlYW0gPSBuZXcgT1N0cmVhbShpbml0aWFsU3RyZWFtU2l6ZSwgZmFsc2UpOwogICAgIH0KLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfRWxlbWVudCBjcmVhdGUiKTsKLSAgICBpZS0+bVJzT2JqID0gcnNpX0VsZW1lbnRDcmVhdGUocnNjKTsKLSAgICAqLwotfQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19FbGVtZW50U291cmNlKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICB1aW50MzJfdCBpbmRleCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgdWludDMyX3QgY291bnQgPSBpby0+bG9hZFUzMigpOwotCi0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UgY291bnQgJWksIGluZGV4ICVpIiwgY291bnQsIGluZGV4KTsKLQotICAgIFJzRWxlbWVudCBlID0gKFJzRWxlbWVudCltSW5kZXhbaW5kZXhdLm1Sc09iajsKLQotICAgIFJzQWxsb2NhdGlvbiBhID0gcnNpX0FsbG9jYXRpb25DcmVhdGVTaXplZChyc2MsIGUsIGNvdW50KTsKLSAgICBBbGxvY2F0aW9uICogYWxsb2MgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KGEpOwotCi0gICAgZmxvYXQgKiBkYXRhID0gKGZsb2F0ICopYWxsb2MtPmdldFB0cigpOwotICAgIHdoaWxlKGNvdW50LS0pIHsKLSAgICAgICAgKmRhdGEgPSBpby0+bG9hZEYoKTsKLSAgICAgICAgTE9HRSgiICAlZiIsICpkYXRhKTsKLSAgICAgICAgZGF0YSsrOwotICAgIH0KLSAgICBpZS0+bVJzT2JqID0gYWxsb2M7CisgICAgQTNESW5kZXhFbnRyeSAqaW5kZXhFbnRyeSA9IG5ldyBBM0RJbmRleEVudHJ5KCk7CisgICAgaW5kZXhFbnRyeS0+bU9iamVjdE5hbWUuc2V0VG8ob2JqLT5nZXROYW1lKCkpOworICAgIGluZGV4RW50cnktPm1UeXBlID0gb2JqLT5nZXRDbGFzc0lkKCk7CisgICAgaW5kZXhFbnRyeS0+bU9mZnNldCA9IG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCk7CisgICAgaW5kZXhFbnRyeS0+bVJzT2JqID0gb2JqOworICAgIG1Xcml0ZUluZGV4LnB1c2goaW5kZXhFbnRyeSk7CisgICAgb2JqLT5zZXJpYWxpemUobVdyaXRlU3RyZWFtKTsKKyAgICBpbmRleEVudHJ5LT5tTGVuZ3RoID0gbVdyaXRlU3RyZWFtLT5nZXRQb3MoKSAtIGluZGV4RW50cnktPm1PZmZzZXQ7CisgICAgbVdyaXRlU3RyZWFtLT5hbGlnbig0KTsKIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKK3ZvaWQgcnNpX0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoQ29udGV4dCAqcnNjLCBpbnQzMl90ICpudW1FbnRyaWVzLCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKworICAgIGlmKGZhM2QpIHsKKyAgICAgICAgKm51bUVudHJpZXMgPSBmYTNkLT5nZXROdW1JbmRleEVudHJpZXMoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpudW1FbnRyaWVzID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgcnNpX0ZpbGVBM0RHZXRJbmRleEVudHJpZXMoQ29udGV4dCAqcnNjLCBSc0ZpbGVJbmRleEVudHJ5ICpmaWxlRW50cmllcywgdWludDMyX3QgbnVtRW50cmllcywgUnNGaWxlIGZpbGUpCit7CisgICAgRmlsZUEzRCAqZmEzZCA9IHN0YXRpY19jYXN0PEZpbGVBM0QgKj4oZmlsZSk7CisKKyAgICBpZighZmEzZCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGluZGV4IGVudHJpZXMuIE5vIHZhbGlkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IG51bUZpbGVFbnRyaWVzID0gZmEzZC0+Z2V0TnVtSW5kZXhFbnRyaWVzKCk7CisgICAgaWYobnVtRmlsZUVudHJpZXMgIT0gbnVtRW50cmllcyB8fCBudW1FbnRyaWVzID09IDAgfHwgZmlsZUVudHJpZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGluZGV4IGVudHJpZXMuIEludmFsaWQgbnVtYmVyIHJlcXVlc3RlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRmlsZUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgY29uc3QgRmlsZUEzRDo6QTNESW5kZXhFbnRyeSAqZW50cnkgPSBmYTNkLT5nZXRJbmRleEVudHJ5KGkpOworICAgICAgICBmaWxlRW50cmllc1tpXS5jbGFzc0lEID0gZW50cnktPmdldFR5cGUoKTsKKyAgICAgICAgZmlsZUVudHJpZXNbaV0ub2JqZWN0TmFtZSA9IGVudHJ5LT5nZXRPYmplY3ROYW1lKCkuc3RyaW5nKCk7CisgICAgfQorCit9CisKK1JzT2JqZWN0QmFzZSByc2lfRmlsZUEzREdldEVudHJ5QnlJbmRleChDb250ZXh0ICpyc2MsIHVpbnQzMl90IGluZGV4LCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKyAgICBpZighZmEzZCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGVudHJ5LiBObyB2YWxpZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE9iamVjdEJhc2UgKm9iaiA9IGZhM2QtPmluaXRpYWxpemVGcm9tRW50cnkoaW5kZXgpOworICAgIExPR1YoIlJldHVybmluZyBvYmplY3Qgd2l0aCBuYW1lICVzIiwgb2JqLT5nZXROYW1lKCkpOworCisgICAgcmV0dXJuIG9iajsKK30KKworUnNGaWxlIHJzaV9GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiRmlsZSBsb2FkIGZhaWxlZC4gQXNzZXQgc3RyZWFtIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEKHJzYyk7CisKKyAgICBmYTNkLT5sb2FkKGRhdGEsIGxlbik7CisgICAgZmEzZC0+aW5jVXNlclJlZigpOworCisgICAgcmV0dXJuIGZhM2Q7Cit9CisKIAogUnNGaWxlIHJzaV9GaWxlT3BlbihDb250ZXh0ICpyc2MsIGNoYXIgY29uc3QgKnBhdGgsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0gICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEOworICAgIEZpbGVBM0QgKmZhM2QgPSBuZXcgRmlsZUEzRChyc2MpOwogCiAgICAgRklMRSAqZiA9IGZvcGVuKCIvc2RjYXJkL3Rlc3QuYTNkIiwgInJiIik7CiAgICAgaWYgKGYpIHsKLSAgICAgICAgZmEzZC0+bG9hZChyc2MsIGYpOworICAgICAgICBmYTNkLT5sb2FkKGYpOwogICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIGZhM2QtPmluY1VzZXJSZWYoKTsKICAgICAgICAgcmV0dXJuIGZhM2Q7CiAgICAgfQogICAgIGRlbGV0ZSBmYTNkOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZpbGVBM0QuaCBiL2xpYnMvcnMvcnNGaWxlQTNELmgKaW5kZXggOWVlMDhlYy4uYjk4NTkwNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0QuaAorKysgYi9saWJzL3JzL3JzRmlsZUEzRC5oCkBAIC0xOCwyMCArMTgsMjMgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19GSUxFX0EzRF9ICiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKLSNpbmNsdWRlICJyc0ZpbGVBM0REZWNscy5oIgogI2luY2x1ZGUgInJzTWVzaC5oIgogCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgeworCiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAotY2xhc3MgRmlsZUEzRAorY2xhc3MgRmlsZUEzRCA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CiBwdWJsaWM6Ci0gICAgRmlsZUEzRCgpOworICAgIEZpbGVBM0QoQ29udGV4dCAqcnNjKTsKICAgICB+RmlsZUEzRCgpOwogCiAgICAgdWludDMyX3QgbU1ham9yVmVyc2lvbjsKQEAgLTQwLDc4ICs0Myw1MyBAQAogICAgIHVpbnQ2NF90IG1TdHJpbmdUYWJsZU9mZnNldDsKICAgICBib29sIG1Vc2U2NEJpdE9mZnNldHM7CiAKLSAgICBzdHJ1Y3QgQTNESW5kZXhFbnRyeSB7Ci0gICAgICAgIFN0cmluZzggbUlEOwotICAgICAgICBBM0RDaHVua1R5cGUgbVR5cGU7CisgICAgY2xhc3MgQTNESW5kZXhFbnRyeSB7CisgICAgICAgIFN0cmluZzggbU9iamVjdE5hbWU7CisgICAgICAgIFJzQTNEQ2xhc3NJRCBtVHlwZTsKICAgICAgICAgdWludDY0X3QgbU9mZnNldDsKLSAgICAgICAgdm9pZCAqIG1Sc09iajsKKyAgICAgICAgdWludDY0X3QgbUxlbmd0aDsKKyAgICAgICAgT2JqZWN0QmFzZSAqbVJzT2JqOworICAgIHB1YmxpYzoKKyAgICAgICAgZnJpZW5kIGNsYXNzIEZpbGVBM0Q7CisgICAgICAgIGNvbnN0IFN0cmluZzggJmdldE9iamVjdE5hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU9iamVjdE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgUnNBM0RDbGFzc0lEIGdldFR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgICAgIH0KICAgICB9OwogCi0gICAgYm9vbCBsb2FkKENvbnRleHQgKnJzYywgRklMRSAqZik7CisgICAgYm9vbCBsb2FkKEZJTEUgKmYpOworICAgIGJvb2wgbG9hZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHNpemVfdCBnZXROdW1JbmRleEVudHJpZXMoKSBjb25zdDsKKyAgICBjb25zdCBBM0RJbmRleEVudHJ5KiBnZXRJbmRleEVudHJ5KHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgT2JqZWN0QmFzZSAqaW5pdGlhbGl6ZUZyb21FbnRyeShzaXplX3QgaW5kZXgpOworCisgICAgdm9pZCBhcHBlbmRUb0ZpbGUoT2JqZWN0QmFzZSAqb2JqKTsKKyAgICBib29sIHdyaXRlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyAgICAvLyBDdXJyZW50bHkgZmlsZXMgZG8gbm90IGdldCBzZXJpYWxpemVkLAorICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGluaGVyaXQgZnJvbSBPYmplY3RCYXNlIGZvciByZWYgdHJhY2tpbmcKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeworICAgIH0KKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1VOS05PV047CisgICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgY2xhc3MgSU8KLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBJTyhjb25zdCB1aW50OF90ICosIGJvb2wgdXNlNjQpOwotICAgIAotICAgICAgICBmbG9hdCBsb2FkRigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKLSAgICAgICAgICAgIGZsb2F0IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGZsb2F0KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBsb2FkSTMyKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgaW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGludDMyX3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBsb2FkVTMyKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgdWludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDMyX3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50MTZfdCBsb2FkVTE2KCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOwotICAgICAgICAgICAgdWludDE2X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDE2X3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGxvYWRVOCgpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZih1aW50OF90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDY0X3QgbG9hZE9mZnNldCgpOwotICAgICAgICB2b2lkIGxvYWRTdHJpbmcoU3RyaW5nOCAqcyk7Ci0gICAgICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHtyZXR1cm4gbVBvczt9Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBnZXRQdHIoKSBjb25zdDsKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKLSAgICAgICAgdWludDY0X3QgbVBvczsKLSAgICAgICAgYm9vbCBtVXNlNjQ7Ci0gICAgfTsKIAotCi0gICAgYm9vbCBwcm9jZXNzKENvbnRleHQgKnJzYyk7Ci0gICAgYm9vbCBwcm9jZXNzSW5kZXgoQ29udGV4dCAqcnNjLCBBM0RJbmRleEVudHJ5ICopOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX01lc2goQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19QcmltaXRpdmUoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19WZXJ0aWNpZXMoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19FbGVtZW50KENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfRWxlbWVudFNvdXJjZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOworICAgIHZvaWQgcGFyc2VIZWFkZXIoSVN0cmVhbSAqaGVhZGVyU3RyZWFtKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKICAgICB2b2lkICogbUFsbG9jOwogICAgIHVpbnQ2NF90IG1EYXRhU2l6ZTsKLSAgICBDb250ZXh0ICogbVJzYzsKIAotICAgIFZlY3RvcjxBM0RJbmRleEVudHJ5PiBtSW5kZXg7Ci0gICAgVmVjdG9yPFN0cmluZzg+IG1TdHJpbmdzOwotICAgIFZlY3Rvcjx1aW50MzJfdD4gbVN0cmluZ0luZGV4VmFsdWVzOworICAgIE9TdHJlYW0gKm1Xcml0ZVN0cmVhbTsKKyAgICBWZWN0b3I8QTNESW5kZXhFbnRyeSo+IG1Xcml0ZUluZGV4OwogCisgICAgSVN0cmVhbSAqbVJlYWRTdHJlYW07CisgICAgVmVjdG9yPEEzREluZGV4RW50cnkqPiBtSW5kZXg7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaCBiL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwOGJkMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRERlY2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX0ZJTEVfQTNEX0RFQ0xTX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19GSUxFX0EzRF9ERUNMU19ICi0KLQotI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0gICAgZW51bSBBM0RDaHVua1R5cGUgewotICAgICAgICBDSFVOS19FTVBUWSwKLQotICAgICAgICBDSFVOS19FTEVNRU5ULAotICAgICAgICBDSFVOS19FTEVNRU5UX1NPVVJDRSwKLSAgICAgICAgQ0hVTktfVkVSVElDSUVTLAotICAgICAgICBDSFVOS19NRVNILAotICAgICAgICBDSFVOS19QUklNSVRJVkUsCi0KLSAgICAgICAgQ0hVTktfTEFTVAotICAgIH07Ci0KLQotfQotfQotI2VuZGlmIC8vQU5EUk9JRF9SU19GSUxFX0EzRF9ICi0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5jcHAgYi9saWJzL3JzL3JzRm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1MTAwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmNwcApAQCAtMCwwICsxLDg4OSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzRm9udC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIEZUX0JJVE1BUF9ICisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKK0ZvbnQ6OkZvbnQoQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKSwgbUNhY2hlZEdseXBocyhOVUxMKQoreworICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKKyAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgbUhhc0tlcm5pbmcgPSBmYWxzZTsKKyAgICBtRmFjZSA9IE5VTEw7Cit9CisKK2Jvb2wgRm9udDo6aW5pdChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKQoreworICAgIGlmKG1Jbml0aWFsaXplZCkgeworICAgICAgICBMT0dFKCJSZWluaXRpYWxpemF0aW9uIG9mIGZvbnRzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZzggZm9udHNEaXIoIi9mb250cy8iKTsKKyAgICBTdHJpbmc4IGZ1bGxQYXRoKGdldGVudigiQU5EUk9JRF9ST09UIikpOworICAgIGZ1bGxQYXRoICs9IGZvbnRzRGlyOworICAgIGZ1bGxQYXRoICs9IG5hbWU7CisKKyAgICBGVF9FcnJvciBlcnJvciA9IEZUX05ld19GYWNlKG1SU0MtPm1TdGF0ZUZvbnQuZ2V0TGliKCksIGZ1bGxQYXRoLnN0cmluZygpLCAwLCAmbUZhY2UpOworICAgIGlmKGVycm9yKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGZvbnQgJXMiLCBmdWxsUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtRm9udE5hbWUgPSBuYW1lOworICAgIG1Gb250U2l6ZSA9IGZvbnRTaXplOworICAgIG1EcGkgPSBkcGk7CisKKyAgICBlcnJvciA9IEZUX1NldF9DaGFyX1NpemUobUZhY2UsIGZvbnRTaXplICogNjQsIDAsIGRwaSwgMCk7CisgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIHNldCBmb250IHNpemUgb24gJXMiLCBmdWxsUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtSGFzS2VybmluZyA9IEZUX0hBU19LRVJOSU5HKG1GYWNlKTsKKworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRm9udDo6aW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpCit7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpLT5tSXNWYWxpZCA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBGb250OjpkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50MzJfdCB4LCBpbnQzMl90IHkpCit7CisgICAgRm9udFN0YXRlICpzdGF0ZSA9ICZtUlNDLT5tU3RhdGVGb250OworCisgICAgaW50MzJfdCBuUGVuWCA9IHggKyBnbHlwaC0+bUJpdG1hcExlZnQ7CisgICAgaW50MzJfdCBuUGVuWSA9IHkgLSBnbHlwaC0+bUJpdG1hcFRvcCArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgZmxvYXQgdTEgPSBnbHlwaC0+bUJpdG1hcE1pblU7CisgICAgZmxvYXQgdTIgPSBnbHlwaC0+bUJpdG1hcE1heFU7CisgICAgZmxvYXQgdjEgPSBnbHlwaC0+bUJpdG1hcE1pblY7CisgICAgZmxvYXQgdjIgPSBnbHlwaC0+bUJpdG1hcE1heFY7CisKKyAgICBpbnQzMl90IHdpZHRoID0gKGludDMyX3QpIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQgPSAoaW50MzJfdCkgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBzdGF0ZS0+YXBwZW5kTWVzaFF1YWQoblBlblgsIG5QZW5ZLCAwLCB1MSwgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5QZW5YICsgd2lkdGgsIG5QZW5ZLCAwLCB1MiwgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5QZW5YICsgd2lkdGgsIG5QZW5ZIC0gaGVpZ2h0LCAwLCB1MiwgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5QZW5YLCBuUGVuWSAtIGhlaWdodCwgMCwgdTEsIHYxKTsKK30KKwordm9pZCBGb250OjpkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvKiBnbHlwaCwgaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpIHsKKyAgICBpbnQzMl90IG5QZW5YID0geCArIGdseXBoLT5tQml0bWFwTGVmdDsKKyAgICBpbnQzMl90IG5QZW5ZID0geSArIGdseXBoLT5tQml0bWFwVG9wOworCisgICAgdWludDMyX3QgZW5kWCA9IGdseXBoLT5tQml0bWFwTWluWCArIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IGdseXBoLT5tQml0bWFwTWluWSArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgRm9udFN0YXRlICpzdGF0ZSA9ICZtUlNDLT5tU3RhdGVGb250OworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBzdGF0ZS0+Z2V0Q2FjaGVUZXh0dXJlVHlwZSgpLT5nZXREaW1YKCk7CisgICAgY29uc3QgdWludDhfdCogY2FjaGVCdWZmZXIgPSBzdGF0ZS0+Z2V0VGV4dFRleHR1cmVEYXRhKCk7CisKKyAgICB1aW50MzJfdCBjYWNoZVggPSAwLCBjYWNoZVkgPSAwOworICAgIGludDMyX3QgYlggPSAwLCBiWSA9IDA7CisgICAgZm9yIChjYWNoZVggPSBnbHlwaC0+bUJpdG1hcE1pblgsIGJYID0gblBlblg7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCsrLCBiWCsrKSB7CisgICAgICAgIGZvciAoY2FjaGVZID0gZ2x5cGgtPm1CaXRtYXBNaW5ZLCBiWSA9IG5QZW5ZOyBjYWNoZVkgPCBlbmRZOyBjYWNoZVkrKywgYlkrKykgeworICAgICAgICAgICAgaWYgKGJYIDwgMCB8fCBiWSA8IDAgfHwgYlggPj0gKGludDMyX3QpIGJpdG1hcFcgfHwgYlkgPj0gKGludDMyX3QpIGJpdG1hcEgpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJTa2lwcGluZyBpbnZhbGlkIGluZGV4Iik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50OF90IHRlbXBDb2wgPSBjYWNoZUJ1ZmZlcltjYWNoZVkgKiBjYWNoZVdpZHRoICsgY2FjaGVYXTsKKyAgICAgICAgICAgIGJpdG1hcFtiWSAqIGJpdG1hcFcgKyBiWF0gPSB0ZW1wQ29sOworICAgICAgICB9CisgICAgfQorCit9CisKK3ZvaWQgRm9udDo6bWVhc3VyZUNhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludDMyX3QgeCwgaW50MzJfdCB5LCBSZWN0ICpib3VuZHMpIHsKKyAgICBpbnQzMl90IG5QZW5YID0geCArIGdseXBoLT5tQml0bWFwTGVmdDsKKyAgICBpbnQzMl90IG5QZW5ZID0geSAtIGdseXBoLT5tQml0bWFwVG9wICsgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBpbnQzMl90IHdpZHRoID0gKGludDMyX3QpIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQgPSAoaW50MzJfdCkgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBpZiAoYm91bmRzLT5ib3R0b20gPiBuUGVuWSkgeworICAgICAgICBib3VuZHMtPmJvdHRvbSA9IG5QZW5ZOworICAgIH0KKyAgICBpZiAoYm91bmRzLT5sZWZ0ID4gblBlblgpIHsKKyAgICAgICAgYm91bmRzLT5sZWZ0ID0gblBlblg7CisgICAgfQorICAgIGlmIChib3VuZHMtPnJpZ2h0IDwgblBlblggKyB3aWR0aCkgeworICAgICAgICBib3VuZHMtPnJpZ2h0ID0gblBlblggKyB3aWR0aDsKKyAgICB9CisgICAgaWYgKGJvdW5kcy0+dG9wIDwgblBlblkgKyBoZWlnaHQpIHsKKyAgICAgICAgYm91bmRzLT50b3AgPSBuUGVuWSArIGhlaWdodDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6cmVuZGVyVVRGKGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFydCwgaW50MzJfdCBudW1HbHlwaHMsCisgICAgICAgICAgICAgICAgICAgICBSZW5kZXJNb2RlIG1vZGUsIFJlY3QgKmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCkKK3sKKyAgICBpZighbUluaXRpYWxpemVkIHx8IG51bUdseXBocyA9PSAwIHx8IHRleHQgPT0gTlVMTCB8fCBsZW4gPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYobW9kZSA9PSBGb250OjpNRUFTVVJFKSB7CisgICAgICAgIGlmIChib3VuZHMgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiTm8gcmV0dXJuIHJlY3RhbmdsZSBwcm92aWRlZCB0byBtZWFzdXJlIHRleHQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBSZXNldCBtaW4gYW5kIG1heCBvZiB0aGUgYm91bmRpbmcgYm94IHRvIHNvbWV0aGluZyBsYXJnZQorICAgICAgICBib3VuZHMtPnNldCgxZTYsIC0xZTYsIC0xZTYsIDFlNik7CisgICAgfQorCisgICAgaW50MzJfdCBwZW5YID0geCwgcGVuWSA9IHk7CisgICAgaW50MzJfdCBnbHlwaHNMZWZ0ID0gMTsKKyAgICBpZihudW1HbHlwaHMgPiAwKSB7CisgICAgICAgIGdseXBoc0xlZnQgPSBudW1HbHlwaHM7CisgICAgfQorCisgICAgc2l6ZV90IGluZGV4ID0gc3RhcnQ7CisgICAgc2l6ZV90IG5leHRJbmRleCA9IDA7CisKKyAgICB3aGlsZSAoZ2x5cGhzTGVmdCA+IDApIHsKKworICAgICAgICBpbnQzMl90IHV0ZkNoYXIgPSB1dGYzMl9hdCh0ZXh0LCBsZW4sIGluZGV4LCAmbmV4dEluZGV4KTsKKworICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciBlbmNvdW50ZXJlZAorICAgICAgICBpZih1dGZDaGFyIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgYXJyYXkKKyAgICAgICAgaW5kZXggPSBuZXh0SW5kZXg7CisKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZWRHbHlwaCA9IGdldENhY2hlZFVURkNoYXIodXRmQ2hhcik7CisKKyAgICAgICAgLy8gSWYgaXQncyBzdGlsbCBub3QgdmFsaWQsIHdlIGNvdWxkbid0IGNhY2hlIGl0LCBzbyB3ZSBzaG91bGRuJ3QgZHJhdyBnYXJiYWdlCisgICAgICAgIGlmKGNhY2hlZEdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICAgICAgc3dpdGNoKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgRlJBTUVCVUZGRVI6CisgICAgICAgICAgICAgICAgZHJhd0NhY2hlZEdseXBoKGNhY2hlZEdseXBoLCBwZW5YLCBwZW5ZKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQklUTUFQOgorICAgICAgICAgICAgICAgIGRyYXdDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgcGVuWCwgcGVuWSwgYml0bWFwLCBiaXRtYXBXLCBiaXRtYXBIKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUVBU1VSRToKKyAgICAgICAgICAgICAgICBtZWFzdXJlQ2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIHBlblgsIHBlblksIGJvdW5kcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwZW5YICs9IChjYWNoZWRHbHlwaC0+bUFkdmFuY2UueCA+PiA2KTsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGdpdmVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGdseXBocywgZGVjcmVtZW50CisgICAgICAgIGlmKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgICAgIGdseXBoc0xlZnQgLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyogRm9udDo6Z2V0Q2FjaGVkVVRGQ2hhcihpbnQzMl90IHV0ZkNoYXIpIHsKKworICAgIENhY2hlZEdseXBoSW5mbyAqY2FjaGVkR2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlRm9yKCh1aW50MzJfdCl1dGZDaGFyKTsKKyAgICBpZihjYWNoZWRHbHlwaCA9PSBOVUxMKSB7CisgICAgICAgIGNhY2hlZEdseXBoID0gY2FjaGVHbHlwaCgodWludDMyX3QpdXRmQ2hhcik7CisgICAgfQorICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPworICAgIGlmKCFjYWNoZWRHbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgdXBkYXRlR2x5cGhDYWNoZShjYWNoZWRHbHlwaCk7CisgICAgfQorCisgICAgcmV0dXJuIGNhY2hlZEdseXBoOworfQorCit2b2lkIEZvbnQ6OnVwZGF0ZUdseXBoQ2FjaGUoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCkKK3sKKyAgICBGVF9FcnJvciBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIG1GYWNlLCBnbHlwaC0+bUdseXBoSW5kZXgsIEZUX0xPQURfUkVOREVSICk7CisgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgTE9HRSgiQ291bGRuJ3QgbG9hZCBnbHlwaC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdseXBoLT5tQWR2YW5jZSA9IG1GYWNlLT5nbHlwaC0+YWR2YW5jZTsKKyAgICBnbHlwaC0+bUJpdG1hcExlZnQgPSBtRmFjZS0+Z2x5cGgtPmJpdG1hcF9sZWZ0OworICAgIGdseXBoLT5tQml0bWFwVG9wID0gbUZhY2UtPmdseXBoLT5iaXRtYXBfdG9wOworCisgICAgRlRfQml0bWFwICpiaXRtYXAgPSAmbUZhY2UtPmdseXBoLT5iaXRtYXA7CisKKyAgICAvLyBOb3cgY29weSB0aGUgYml0bWFwIGludG8gdGhlIGNhY2hlIHRleHR1cmUKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICAvLyBMZXQgdGhlIGZvbnQgc3RhdGUgZmlndXJlIG91dCB3aGVyZSB0byBwdXQgdGhlIGJpdG1hcAorICAgIEZvbnRTdGF0ZSAqc3RhdGUgPSAmbVJTQy0+bVN0YXRlRm9udDsKKyAgICBnbHlwaC0+bUlzVmFsaWQgPSBzdGF0ZS0+Y2FjaGVCaXRtYXAoYml0bWFwLCAmc3RhcnRYLCAmc3RhcnRZKTsKKworICAgIGlmKCFnbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IGVuZFggPSBzdGFydFggKyBiaXRtYXAtPndpZHRoOworICAgIHVpbnQzMl90IGVuZFkgPSBzdGFydFkgKyBiaXRtYXAtPnJvd3M7CisKKyAgICBnbHlwaC0+bUJpdG1hcE1pblggPSBzdGFydFg7CisgICAgZ2x5cGgtPm1CaXRtYXBNaW5ZID0gc3RhcnRZOworICAgIGdseXBoLT5tQml0bWFwV2lkdGggPSBiaXRtYXAtPndpZHRoOworICAgIGdseXBoLT5tQml0bWFwSGVpZ2h0ID0gYml0bWFwLT5yb3dzOworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IHN0YXRlLT5nZXRDYWNoZVRleHR1cmVUeXBlKCktPmdldERpbVgoKTsKKyAgICB1aW50MzJfdCBjYWNoZUhlaWdodCA9IHN0YXRlLT5nZXRDYWNoZVRleHR1cmVUeXBlKCktPmdldERpbVkoKTsKKworICAgIGdseXBoLT5tQml0bWFwTWluVSA9IChmbG9hdClzdGFydFggLyAoZmxvYXQpY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1pblYgPSAoZmxvYXQpc3RhcnRZIC8gKGZsb2F0KWNhY2hlSGVpZ2h0OworICAgIGdseXBoLT5tQml0bWFwTWF4VSA9IChmbG9hdCllbmRYIC8gKGZsb2F0KWNhY2hlV2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhWID0gKGZsb2F0KWVuZFkgLyAoZmxvYXQpY2FjaGVIZWlnaHQ7Cit9CisKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyAqRm9udDo6Y2FjaGVHbHlwaCh1aW50MzJfdCBnbHlwaCkKK3sKKyAgICBDYWNoZWRHbHlwaEluZm8gKm5ld0dseXBoID0gbmV3IENhY2hlZEdseXBoSW5mbygpOworICAgIG1DYWNoZWRHbHlwaHMuYWRkKGdseXBoLCBuZXdHbHlwaCk7CisKKyAgICBuZXdHbHlwaC0+bUdseXBoSW5kZXggPSBGVF9HZXRfQ2hhcl9JbmRleChtRmFjZSwgZ2x5cGgpOworICAgIG5ld0dseXBoLT5tSXNWYWxpZCA9IGZhbHNlOworCisgICAgdXBkYXRlR2x5cGhDYWNoZShuZXdHbHlwaCk7CisKKyAgICByZXR1cm4gbmV3R2x5cGg7Cit9CisKK0ZvbnQgKiBGb250OjpjcmVhdGUoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKQoreworICAgIHJzYy0+bVN0YXRlRm9udC5jaGVja0luaXQoKTsKKyAgICBWZWN0b3I8Rm9udCo+ICZhY3RpdmVGb250cyA9IHJzYy0+bVN0YXRlRm9udC5tQWN0aXZlRm9udHM7CisKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBhY3RpdmVGb250cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgRm9udCAqaXRoRm9udCA9IGFjdGl2ZUZvbnRzW2ldOworICAgICAgICBpZihpdGhGb250LT5tRm9udE5hbWUgPT0gbmFtZSAmJiBpdGhGb250LT5tRm9udFNpemUgPT0gZm9udFNpemUgJiYgaXRoRm9udC0+bURwaSA9PSBkcGkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGhGb250OworICAgICAgICB9CisgICAgfQorCisgICAgRm9udCAqbmV3Rm9udCA9IG5ldyBGb250KHJzYyk7CisgICAgYm9vbCBpc0luaXRpYWxpemVkID0gbmV3Rm9udC0+aW5pdChuYW1lLCBmb250U2l6ZSwgZHBpKTsKKyAgICBpZihpc0luaXRpYWxpemVkKSB7CisgICAgICAgIGFjdGl2ZUZvbnRzLnB1c2gobmV3Rm9udCk7CisgICAgICAgIHJzYy0+bVN0YXRlRm9udC5wcmVjYWNoZUxhdGluKG5ld0ZvbnQpOworICAgICAgICByZXR1cm4gbmV3Rm9udDsKKyAgICB9CisKKyAgICBkZWxldGUgbmV3Rm9udDsKKyAgICByZXR1cm4gTlVMTDsKKworfQorCitGb250Ojp+Rm9udCgpCit7CisgICAgaWYobUZhY2UpIHsKKyAgICAgICAgRlRfRG9uZV9GYWNlKG1GYWNlKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUlNDLT5tU3RhdGVGb250Lm1BY3RpdmVGb250cy5zaXplKCk7IGN0KyspIHsKKyAgICAgICAgaWYgKG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzW2N0XSA9PSB0aGlzKSB7CisgICAgICAgICAgICBtUlNDLT5tU3RhdGVGb250Lm1BY3RpdmVGb250cy5yZW1vdmVBdChjdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIENhY2hlZEdseXBoSW5mbyAqZ2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSk7CisgICAgICAgIGRlbGV0ZSBnbHlwaDsKKyAgICB9Cit9CisKK0ZvbnRTdGF0ZTo6Rm9udFN0YXRlKCkKK3sKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtTWF4TnVtYmVyT2ZRdWFkcyA9IDEwMjQ7CisgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIG1SU0MgPSBOVUxMOworICAgIG1MaWJyYXJ5ID0gTlVMTDsKKyAgICBzZXRGb250Q29sb3IoMC4xZiwgMC4xZiwgMC4xZiwgMS4wZik7CisKKyAgICAvLyBHZXQgdGhlIHJlbmRlcmVyIHByb3BlcnRpZXMKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICAvLyBHZXQgdGhlIGdhbW1hCisgICAgZmxvYXQgZ2FtbWEgPSBERUZBVUxUX1RFWFRfR0FNTUE7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0dBTU1BLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGdhbW1hIHRvICVzIiwgcHJvcGVydHkpOworICAgICAgICBnYW1tYSA9IGF0b2YocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGdhbW1hIG9mICUuMmYiLCBERUZBVUxUX1RFWFRfR0FNTUEpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgYmxhY2sgZ2FtbWEgdGhyZXNob2xkCisgICAgaW50MzJfdCBibGFja1RocmVzaG9sZCA9IERFRkFVTFRfVEVYVF9CTEFDS19HQU1NQV9USFJFU0hPTEQ7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCBibGFjayBnYW1tYSB0aHJlc2hvbGQgdG8gJXMiLCBwcm9wZXJ0eSk7CisgICAgICAgIGJsYWNrVGhyZXNob2xkID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHQgYmxhY2sgZ2FtbWEgdGhyZXNob2xkIG9mICVkIiwKKyAgICAgICAgICAgICAgICBERUZBVUxUX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEKTsKKyAgICB9CisgICAgbUJsYWNrVGhyZXNob2xkID0gKGZsb2F0KShibGFja1RocmVzaG9sZCkgLyAyNTUuMGY7CisKKyAgICAvLyBHZXQgdGhlIHdoaXRlIGdhbW1hIHRocmVzaG9sZAorICAgIGludDMyX3Qgd2hpdGVUaHJlc2hvbGQgPSBERUZBVUxUX1RFWFRfV0hJVEVfR0FNTUFfVEhSRVNIT0xEOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHRleHQgd2hpdGUgZ2FtbWEgdGhyZXNob2xkIHRvICVzIiwgcHJvcGVydHkpOworICAgICAgICB3aGl0ZVRocmVzaG9sZCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB3aGl0ZSBibGFjayBnYW1tYSB0aHJlc2hvbGQgb2YgJWQiLAorICAgICAgICAgICAgICAgIERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQpOworICAgIH0KKyAgICBtV2hpdGVUaHJlc2hvbGQgPSAoZmxvYXQpKHdoaXRlVGhyZXNob2xkKSAvIDI1NS4wZjsKKworICAgIC8vIENvbXB1dGUgdGhlIGdhbW1hIHRhYmxlcworICAgIG1CbGFja0dhbW1hID0gZ2FtbWE7CisgICAgbVdoaXRlR2FtbWEgPSAxLjBmIC8gZ2FtbWE7Cit9CisKK0ZvbnRTdGF0ZTo6fkZvbnRTdGF0ZSgpCit7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGVMaW5lc1tpXTsKKyAgICB9CisKKyAgICByc0Fzc2VydCghbUFjdGl2ZUZvbnRzLnNpemUoKSk7Cit9CisKK0ZUX0xpYnJhcnkgRm9udFN0YXRlOjpnZXRMaWIoKQoreworICAgIGlmKCFtTGlicmFyeSkgeworICAgICAgICBGVF9FcnJvciBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoJm1MaWJyYXJ5KTsKKyAgICAgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGZyZWV0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtTGlicmFyeTsKK30KKwordm9pZCBGb250U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1SU0MgPSByc2M7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpmbHVzaEFsbEFuZEludmFsaWRhdGUoKQoreworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1BY3RpdmVGb250cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgbUFjdGl2ZUZvbnRzW2ldLT5pbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgfQorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wgPSAwOworICAgIH0KK30KKworYm9vbCBGb250U3RhdGU6OmNhY2hlQml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpCit7CisgICAgLy8gSWYgdGhlIGdseXBoIGlzIHRvbyB0YWxsLCBkb24ndCBjYWNoZSBpdAorICAgIGlmKCh1aW50MzJfdCliaXRtYXAtPnJvd3MgPiBtQ2FjaGVMaW5lc1ttQ2FjaGVMaW5lcy5zaXplKCktMV0tPm1NYXhIZWlnaHQpIHsKKyAgICAgICAgTE9HRSgiRm9udCBzaXplIHRvIGxhcmdlIHRvIGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsIChpbnQpYml0bWFwLT53aWR0aCwgKGludCliaXRtYXAtPnJvd3MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgYm9vbCBiaXRtYXBGaXQgPSBmYWxzZTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChiaXRtYXAsICZzdGFydFgsICZzdGFydFkpOworICAgICAgICBpZihiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIG5ldyBnbHlwaCBkaWRuJ3QgZml0LCBmbHVzaCB0aGUgc3RhdGUgc28gZmFyIGFuZCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcKKyAgICBpZighYml0bWFwRml0KSB7CisgICAgICAgIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgICAgIC8vIFRyeSB0byBmaXQgaXQgYWdhaW4KKyAgICAgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgICAgICBpZihiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGZpdCwgc29tZXRoaW5nIGlzIHdyb25nIGFuZCB3ZSBzaG91bGRuJ3QgZHJhdworICAgICAgICBpZighYml0bWFwRml0KSB7CisgICAgICAgICAgICBMT0dFKCJCaXRtYXAgZG9lc24ndCBmaXQgaW4gY2FjaGUuIHdpZHRoLCBoZWlnaHQgPSAlaSwgJWkiLCAoaW50KWJpdG1hcC0+d2lkdGgsIChpbnQpYml0bWFwLT5yb3dzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpyZXRPcmlnaW5YID0gc3RhcnRYOworICAgICpyZXRPcmlnaW5ZID0gc3RhcnRZOworCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIGJpdG1hcC0+d2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGJpdG1hcC0+cm93czsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBnZXRDYWNoZVRleHR1cmVUeXBlKCktPmdldERpbVgoKTsKKworICAgIHVpbnQ4X3QgKmNhY2hlQnVmZmVyID0gKHVpbnQ4X3QqKW1UZXh0VGV4dHVyZS0+Z2V0UHRyKCk7CisgICAgdWludDhfdCAqYml0bWFwQnVmZmVyID0gYml0bWFwLT5idWZmZXI7CisKKyAgICB1aW50MzJfdCBjYWNoZVggPSAwLCBiWCA9IDAsIGNhY2hlWSA9IDAsIGJZID0gMDsKKyAgICBmb3IoY2FjaGVYID0gc3RhcnRYLCBiWCA9IDA7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCArKywgYlggKyspIHsKKyAgICAgICAgZm9yKGNhY2hlWSA9IHN0YXJ0WSwgYlkgPSAwOyBjYWNoZVkgPCBlbmRZOyBjYWNoZVkgKyssIGJZICsrKSB7CisgICAgICAgICAgICB1aW50OF90IHRlbXBDb2wgPSBiaXRtYXBCdWZmZXJbYlkgKiBiaXRtYXAtPndpZHRoICsgYlhdOworICAgICAgICAgICAgY2FjaGVCdWZmZXJbY2FjaGVZKmNhY2hlV2lkdGggKyBjYWNoZVhdID0gdGVtcENvbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgd2lsbCBkaXJ0eSB0aGUgdGV4dHVyZSBhbmQgdGhlIHNoYWRlciBzbyBuZXh0IHRpbWUKKyAgICAvLyB3ZSBkcmF3IGl0IHdpbGwgdXBsb2FkIHRoZSBkYXRhCisgICAgbVRleHRUZXh0dXJlLT5kZWZlcmVkVXBsb2FkVG9UZXh0dXJlKG1SU0MsIGZhbHNlLCAwKTsKKyAgICBtRm9udFNoYWRlckYtPmJpbmRUZXh0dXJlKG1SU0MsIDAsIG1UZXh0VGV4dHVyZS5nZXQoKSk7CisKKyAgICAvLyBTb21lIGRlYnVnIGNvZGUKKyAgICAvKmZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBMT0dFKCJDYWNoZSBMaW5lOiBIOiAldSBFbXB0eSBTcGFjZTogJWYiLAorICAgICAgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tTWF4SGVpZ2h0LAorICAgICAgICAgICAgICAoMS4wZiAtIChmbG9hdCltQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wvKGZsb2F0KW1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGgpKjEwMC4wZik7CisKKyAgICB9Ki8KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnRTdGF0ZTo6aW5pdFJlbmRlclN0YXRlKCkKK3sKKyAgICBTdHJpbmc4IHNoYWRlclN0cmluZygidmFyeWluZyB2ZWMyIHZhclRleDA7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCIgIGxvd3AgdmVjNCBjb2wgPSBVTklfQ29sb3I7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCIgIGNvbC5hID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB2YXJUZXgwLnh5KS5hO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICBjb2wuYSA9IHBvdyhjb2wuYSwgVU5JX0dhbW1hKTtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgZ2xfRnJhZ0NvbG9yID0gY29sO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgifVxuIik7CisKKyAgICBjb25zdCBFbGVtZW50ICpjb2xvckVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgNCk7CisgICAgY29uc3QgRWxlbWVudCAqZ2FtbWFFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDEpOworICAgIG1SU0MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJCZWdpbigpOworICAgIG1SU0MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQoY29sb3JFbGVtLCAiQ29sb3IiLCAxKTsKKyAgICBtUlNDLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKGdhbW1hRWxlbSwgIkdhbW1hIiwgMSk7CisgICAgY29uc3QgRWxlbWVudCAqY29uc3RJbnB1dCA9IG1SU0MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJDcmVhdGUobVJTQyk7CisKKyAgICBUeXBlICppbnB1dFR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICBpbnB1dFR5cGUtPnNldEVsZW1lbnQoY29uc3RJbnB1dCk7CisgICAgaW5wdXRUeXBlLT5zZXREaW1YKDEpOworICAgIGlucHV0VHlwZS0+Y29tcHV0ZSgpOworCisgICAgdWludDMyX3QgdG1wWzRdOworICAgIHRtcFswXSA9IFJTX1BST0dSQU1fUEFSQU1fQ09OU1RBTlQ7CisgICAgdG1wWzFdID0gKHVpbnQzMl90KWlucHV0VHlwZTsKKyAgICB0bXBbMl0gPSBSU19QUk9HUkFNX1BBUkFNX1RFWFRVUkVfQ09VTlQ7CisgICAgdG1wWzNdID0gMTsKKworICAgIG1Gb250U2hhZGVyRkNvbnN0YW50LnNldChuZXcgQWxsb2NhdGlvbihtUlNDLCBpbnB1dFR5cGUpKTsKKyAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChtUlNDLCBzaGFkZXJTdHJpbmcuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyU3RyaW5nLmxlbmd0aCgpLCB0bXAsIDQpOworICAgIG1Gb250U2hhZGVyRi5zZXQocGYpOworICAgIG1Gb250U2hhZGVyRi0+YmluZEFsbG9jYXRpb24obVJTQywgbUZvbnRTaGFkZXJGQ29uc3RhbnQuZ2V0KCksIDApOworCisgICAgU2FtcGxlciAqc2FtcGxlciA9IG5ldyBTYW1wbGVyKG1SU0MsIFJTX1NBTVBMRVJfTkVBUkVTVCwgUlNfU0FNUExFUl9ORUFSRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU19TQU1QTEVSX0NMQU1QLCBSU19TQU1QTEVSX0NMQU1QLCBSU19TQU1QTEVSX0NMQU1QKTsKKyAgICBtRm9udFNhbXBsZXIuc2V0KHNhbXBsZXIpOworICAgIG1Gb250U2hhZGVyRi0+YmluZFNhbXBsZXIobVJTQywgMCwgc2FtcGxlcik7CisKKyAgICBQcm9ncmFtU3RvcmUgKmZvbnRTdG9yZSA9IG5ldyBQcm9ncmFtU3RvcmUobVJTQyk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUuc2V0KGZvbnRTdG9yZSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERlcHRoRnVuYyhSU19ERVBUSF9GVU5DX0FMV0FZUyk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldEJsZW5kRnVuYyhSU19CTEVORF9TUkNfU1JDX0FMUEhBLCBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERlcHRoTWFzayhmYWxzZSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0VGV4dFRleHR1cmUoKQoreworICAgIGNvbnN0IEVsZW1lbnQgKmFscGhhRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX1VOU0lHTkVEXzgsIFJTX0tJTkRfUElYRUxfQSwgdHJ1ZSwgMSk7CisKKyAgICAvLyBXZSB3aWxsIGFsbG9jYXRlIGEgdGV4dHVyZSB0byBpbml0aWFsbHkgaG9sZCAzMiBjaGFyYWN0ZXIgYml0bWFwcworICAgIFR5cGUgKnRleFR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB0ZXhUeXBlLT5zZXRFbGVtZW50KGFscGhhRWxlbSk7CisgICAgdGV4VHlwZS0+c2V0RGltWCgxMDI0KTsKKyAgICB0ZXhUeXBlLT5zZXREaW1ZKDI1Nik7CisgICAgdGV4VHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqY2FjaGVBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIHRleFR5cGUpOworICAgIG1UZXh0VGV4dHVyZS5zZXQoY2FjaGVBbGxvYyk7CisgICAgbVRleHRUZXh0dXJlLT5kZWZlcmVkVXBsb2FkVG9UZXh0dXJlKG1SU0MsIGZhbHNlLCAwKTsKKworICAgIC8vIFNwbGl0IHVwIG91ciBjYWNoZSB0ZXh0dXJlIGludG8gbGluZXMgb2YgY2VydGFpbiB3aWR0aHMKKyAgICBpbnQzMl90IG5leHRMaW5lID0gMDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDE2LCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgyNCwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMjQsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDMyLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgzMiwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoNDAsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKHRleFR5cGUtPmdldERpbVkoKSAtIG5leHRMaW5lLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7Cit9CisKKy8vIEF2b2lkIGhhdmluZyB0byByZWFsbG9jYXRlIG1lbW9yeSBhbmQgcmVuZGVyIHF1YWQgYnkgcXVhZAordm9pZCBGb250U3RhdGU6OmluaXRWZXJ0ZXhBcnJheUJ1ZmZlcnMoKQoreworICAgIC8vIE5vdyBsZXRzIHdyaXRlIGluZGV4IGRhdGEKKyAgICBjb25zdCBFbGVtZW50ICppbmRleEVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9VTlNJR05FRF8xNiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CisgICAgVHlwZSAqaW5kZXhUeXBlID0gbmV3IFR5cGUobVJTQyk7CisgICAgdWludDMyX3QgbnVtSW5kaWNpZXMgPSBtTWF4TnVtYmVyT2ZRdWFkcyAqIDY7CisgICAgaW5kZXhUeXBlLT5zZXREaW1YKG51bUluZGljaWVzKTsKKyAgICBpbmRleFR5cGUtPnNldEVsZW1lbnQoaW5kZXhFbGVtKTsKKyAgICBpbmRleFR5cGUtPmNvbXB1dGUoKTsKKworICAgIEFsbG9jYXRpb24gKmluZGV4QWxsb2MgPSBuZXcgQWxsb2NhdGlvbihtUlNDLCBpbmRleFR5cGUpOworICAgIHVpbnQxNl90ICppbmRleFB0ciA9ICh1aW50MTZfdCopaW5kZXhBbGxvYy0+Z2V0UHRyKCk7CisKKyAgICAvLyBGb3VyIHZlcnRzLCB0d28gdHJpYW5nbGVzICwgc2l4IGluZGljZXMgcGVyIHF1YWQKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtTWF4TnVtYmVyT2ZRdWFkczsgaSArKykgeworICAgICAgICBpbnQzMl90IGk2ID0gaSAqIDY7CisgICAgICAgIGludDMyX3QgaTQgPSBpICogNDsKKworICAgICAgICBpbmRleFB0cltpNiArIDBdID0gaTQgKyAwOworICAgICAgICBpbmRleFB0cltpNiArIDFdID0gaTQgKyAxOworICAgICAgICBpbmRleFB0cltpNiArIDJdID0gaTQgKyAyOworCisgICAgICAgIGluZGV4UHRyW2k2ICsgM10gPSBpNCArIDA7CisgICAgICAgIGluZGV4UHRyW2k2ICsgNF0gPSBpNCArIDI7CisgICAgICAgIGluZGV4UHRyW2k2ICsgNV0gPSBpNCArIDM7CisgICAgfQorCisgICAgaW5kZXhBbGxvYy0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KG1SU0MpOworICAgIG1JbmRleEJ1ZmZlci5zZXQoaW5kZXhBbGxvYyk7CisKKyAgICBjb25zdCBFbGVtZW50ICpwb3NFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDMpOworICAgIGNvbnN0IEVsZW1lbnQgKnRleEVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMik7CisKKyAgICBjb25zdCBFbGVtZW50ICplbGVtQXJyYXlbMl07CisgICAgZWxlbUFycmF5WzBdID0gcG9zRWxlbTsKKyAgICBlbGVtQXJyYXlbMV0gPSB0ZXhFbGVtOworCisgICAgU3RyaW5nOCBwb3NOYW1lKCJwb3NpdGlvbiIpOworICAgIFN0cmluZzggdGV4TmFtZSgidGV4dHVyZTAiKTsKKworICAgIGNvbnN0IGNoYXIgKm5hbWVBcnJheVsyXTsKKyAgICBuYW1lQXJyYXlbMF0gPSBwb3NOYW1lLnN0cmluZygpOworICAgIG5hbWVBcnJheVsxXSA9IHRleE5hbWUuc3RyaW5nKCk7CisgICAgc2l6ZV90IGxlbmd0aHNbMl07CisgICAgbGVuZ3Roc1swXSA9IHBvc05hbWUuc2l6ZSgpOworICAgIGxlbmd0aHNbMV0gPSB0ZXhOYW1lLnNpemUoKTsKKyAgICB1aW50MzJfdCBhcnJheVNpemVzWzJdID0gezEsIDF9OworCisgICAgY29uc3QgRWxlbWVudCAqdmVydGV4RGF0YUVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgMiwgZWxlbUFycmF5LCBuYW1lQXJyYXksIGxlbmd0aHMsIGFycmF5U2l6ZXMpOworCisgICAgVHlwZSAqdmVydGV4RGF0YVR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB2ZXJ0ZXhEYXRhVHlwZS0+c2V0RGltWChtTWF4TnVtYmVyT2ZRdWFkcyAqIDQpOworICAgIHZlcnRleERhdGFUeXBlLT5zZXRFbGVtZW50KHZlcnRleERhdGFFbGVtKTsKKyAgICB2ZXJ0ZXhEYXRhVHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqdmVydGV4QWxsb2MgPSBuZXcgQWxsb2NhdGlvbihtUlNDLCB2ZXJ0ZXhEYXRhVHlwZSk7CisgICAgbVRleHRNZXNoUHRyID0gKGZsb2F0Kil2ZXJ0ZXhBbGxvYy0+Z2V0UHRyKCk7CisKKyAgICBtVmVydGV4QXJyYXkuc2V0KHZlcnRleEFsbG9jKTsKK30KKworLy8gV2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhbnl0aGluZyB1bmxlc3Mgd2UgYWN0dWFsbHkgZHJhdyB0ZXh0Cit2b2lkIEZvbnRTdGF0ZTo6Y2hlY2tJbml0KCkKK3sKKyAgICBpZihtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGluaXRUZXh0VGV4dHVyZSgpOworICAgIGluaXRSZW5kZXJTdGF0ZSgpOworCisgICAgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworCisgICAgLy8gV2Ugc3RvcmUgYSBzdHJpbmcgd2l0aCBsZXR0ZXJzIGluIGEgcm91Z2ggZnJlcXVlbmN5IG9mIG9jY3VycmVuY2UKKyAgICBtTGF0aW5QcmVjYWNoZSA9IFN0cmluZzgoIiBlaXNhcm50b2xjZHVncG1oYnlmdmt3enhqcSIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzgoIkVJU0FSTlRPTENEVUdQTUhCWUZWS1daWEpRIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nOCgiLC4/ISgpLStAOzpgJyIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzgoIjAxMjM0NTY3ODkiKTsKKworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppc3N1ZURyYXdDb21tYW5kKCkgeworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXBWKG1SU0MtPmdldFZlcnRleCgpKTsKKyAgICBtUlNDLT5zZXRWZXJ0ZXgobVJTQy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1SYXN0ZXI+IHRtcFIobVJTQy0+Z2V0UmFzdGVyKCkpOworICAgIG1SU0MtPnNldFJhc3RlcihtUlNDLT5nZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbUZyYWdtZW50PiB0bXBGKG1SU0MtPmdldEZyYWdtZW50KCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50KG1Gb250U2hhZGVyRi5nZXQoKSk7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1TdG9yZT4gdG1wUFMobVJTQy0+Z2V0RnJhZ21lbnRTdG9yZSgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudFN0b3JlKG1Gb250UHJvZ3JhbVN0b3JlLmdldCgpKTsKKworICAgIGlmKG1Db25zdGFudHNEaXJ0eSkgeworICAgICAgICBtRm9udFNoYWRlckZDb25zdGFudC0+ZGF0YShtUlNDLCAmbUNvbnN0YW50cywgc2l6ZW9mKG1Db25zdGFudHMpKTsKKyAgICAgICAgbUNvbnN0YW50c0RpcnR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtUlNDLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgbVJTQy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wVi5nZXQoKSk7CisgICAgICAgIG1SU0MtPnNldFJhc3RlcigoUHJvZ3JhbVJhc3RlciAqKXRtcFIuZ2V0KCkpOworICAgICAgICBtUlNDLT5zZXRGcmFnbWVudCgoUHJvZ3JhbUZyYWdtZW50ICopdG1wRi5nZXQoKSk7CisgICAgICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUoKFByb2dyYW1TdG9yZSAqKXRtcFBTLmdldCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0ICp2dHggPSAoZmxvYXQqKW1WZXJ0ZXhBcnJheS0+Z2V0UHRyKCk7CisgICAgZmxvYXQgKnRleCA9IHZ0eCArIDM7CisKKyAgICBWZXJ0ZXhBcnJheSB2YTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDMsIDIwLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCwgIkFUVFJJQl9wb3NpdGlvbiIpOworICAgIHZhLmFkZChHTF9GTE9BVCwgMiwgMjAsIGZhbHNlLCAodWludDMyX3QpdGV4LCAiQVRUUklCX3RleHR1cmUwIik7CisgICAgdmEuc2V0dXBHTDIobVJTQywgJm1SU0MtPm1TdGF0ZVZlcnRleEFycmF5LCAmbVJTQy0+bVNoYWRlckNhY2hlKTsKKworICAgIG1JbmRleEJ1ZmZlci0+dXBsb2FkQ2hlY2sobVJTQyk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXItPmdldEJ1ZmZlck9iamVjdElEKCkpOworICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbUN1cnJlbnRRdWFkSW5kZXggKiA2LCBHTF9VTlNJR05FRF9TSE9SVCwgKHVpbnQxNl90ICopKDApKTsKKworICAgIC8vIFJlc2V0IHRoZSBzdGF0ZQorICAgIG1SU0MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcFYuZ2V0KCkpOworICAgIG1SU0MtPnNldFJhc3RlcigoUHJvZ3JhbVJhc3RlciAqKXRtcFIuZ2V0KCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50KChQcm9ncmFtRnJhZ21lbnQgKil0bXBGLmdldCgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudFN0b3JlKChQcm9ncmFtU3RvcmUgKil0bXBQUy5nZXQoKSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjphcHBlbmRNZXNoUXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHU0LCBmbG9hdCB2NCkKK3sKKyAgICBjb25zdCB1aW50MzJfdCB2ZXJ0c1BlclF1YWQgPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGZsb2F0c1BlclZlcnQgPSA1OworICAgIGZsb2F0ICpjdXJyZW50UG9zID0gbVRleHRNZXNoUHRyICsgbUN1cnJlbnRRdWFkSW5kZXggKiB2ZXJ0c1BlclF1YWQgKiBmbG9hdHNQZXJWZXJ0OworCisgICAgLy8gQ3VsbCB0aGluZ3MgdGhhdCBhcmUgb2ZmIHRoZSBzY3JlZW4KKyAgICBmbG9hdCB3aWR0aCA9IChmbG9hdCltUlNDLT5nZXRXaWR0aCgpOworICAgIGZsb2F0IGhlaWdodCA9IChmbG9hdCltUlNDLT5nZXRIZWlnaHQoKTsKKworICAgIGlmKHgxID4gd2lkdGggfHwgeTEgPCAwLjBmIHx8IHgyIDwgMCB8fCB5NCA+IGhlaWdodCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLypMT0dFKCJWMCB4OiAlZiB5OiAlZiB6OiAlZiIsIHgxLCB5MSwgejEpOworICAgIExPR0UoIlYxIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDIsIHkyLCB6Mik7CisgICAgTE9HRSgiVjIgeDogJWYgeTogJWYgejogJWYiLCB4MywgeTMsIHozKTsKKyAgICBMT0dFKCJWMyB4OiAlZiB5OiAlZiB6OiAlZiIsIHg0LCB5NCwgejQpOyovCisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MTsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgyOworICAgICgqY3VycmVudFBvcysrKSA9IHkyOworICAgICgqY3VycmVudFBvcysrKSA9IHoyOworICAgICgqY3VycmVudFBvcysrKSA9IHUyOworICAgICgqY3VycmVudFBvcysrKSA9IHYyOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDM7CisgICAgKCpjdXJyZW50UG9zKyspID0geTM7CisgICAgKCpjdXJyZW50UG9zKyspID0gejM7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTM7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjM7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2NDsKKworICAgIG1DdXJyZW50UXVhZEluZGV4ICsrOworCisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggPT0gbU1heE51bWJlck9mUXVhZHMpIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit1aW50MzJfdCBGb250U3RhdGU6OmdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKSB7CisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSAwOworICAgIHVpbnQzMl90IHRvdGFsUGl4ZWxzID0gMDsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ICs9IChtQ2FjaGVMaW5lc1tpXS0+bU1heFdpZHRoIC0gbUNhY2hlTGluZXNbaV0tPm1DdXJyZW50Q29sKTsKKyAgICAgICAgIHRvdGFsUGl4ZWxzICs9IG1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGg7CisgICAgfQorICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gKHJlbWFpbmluZ0NhcGFjaXR5ICogMTAwKSAvIHRvdGFsUGl4ZWxzOworICAgIHJldHVybiByZW1haW5pbmdDYXBhY2l0eTsKK30KKwordm9pZCBGb250U3RhdGU6OnByZWNhY2hlTGF0aW4oRm9udCAqZm9udCkgeworICAgIC8vIFJlbWFpbmluZyBjYXBhY2l0eSBpcyBtZWFzdXJlZCBpbiAlCisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisgICAgdWludDMyX3QgcHJlY2FjaGVJZHggPSAwOworICAgIHdoaWxlKHJlbWFpbmluZ0NhcGFjaXR5ID4gMjUgJiYgcHJlY2FjaGVJZHggPCBtTGF0aW5QcmVjYWNoZS5zaXplKCkpIHsKKyAgICAgICAgZm9udC0+Z2V0Q2FjaGVkVVRGQ2hhcigoaW50MzJfdCltTGF0aW5QcmVjYWNoZVtwcmVjYWNoZUlkeF0pOworICAgICAgICByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICAgICAgcHJlY2FjaGVJZHggKys7CisgICAgfQorfQorCisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4LCBpbnQzMl90IG51bUdseXBocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnQ6OlJlbmRlck1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnQ6OlJlY3QgKmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCkKK3sKKyAgICBjaGVja0luaXQoKTsKKworICAgIC8vIFJlbmRlciBjb2RlIGhlcmUKKyAgICBGb250ICpjdXJyZW50Rm9udCA9IG1SU0MtPmdldEZvbnQoKTsKKyAgICBpZighY3VycmVudEZvbnQpIHsKKyAgICAgICAgaWYoIW1EZWZhdWx0LmdldCgpKSB7CisgICAgICAgICAgICBtRGVmYXVsdC5zZXQoRm9udDo6Y3JlYXRlKG1SU0MsICJEcm9pZFNhbnMudHRmIiwgMTYsIDk2KSk7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudEZvbnQgPSBtRGVmYXVsdC5nZXQoKTsKKyAgICB9CisgICAgaWYoIWN1cnJlbnRGb250KSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGFueSBmb250cyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY3VycmVudEZvbnQtPnJlbmRlclVURih0ZXh0LCBsZW4sIHgsIHksIHN0YXJ0SW5kZXgsIG51bUdseXBocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsIGJvdW5kcywgYml0bWFwLCBiaXRtYXBXLCBiaXRtYXBIKTsKKworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit2b2lkIEZvbnRTdGF0ZTo6bWVhc3VyZVRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCBGb250OjpSZWN0ICpib3VuZHMpIHsKKyAgICByZW5kZXJUZXh0KHRleHQsIGxlbiwgMCwgMCwgMCwgLTEsIEZvbnQ6Ok1FQVNVUkUsIGJvdW5kcyk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpzZXRGb250Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgeworICAgIG1Db25zdGFudHMubUZvbnRDb2xvclswXSA9IHI7CisgICAgbUNvbnN0YW50cy5tRm9udENvbG9yWzFdID0gZzsKKyAgICBtQ29uc3RhbnRzLm1Gb250Q29sb3JbMl0gPSBiOworICAgIG1Db25zdGFudHMubUZvbnRDb2xvclszXSA9IGE7CisKKyAgICBtQ29uc3RhbnRzLm1HYW1tYSA9IDEuMGY7CisgICAgY29uc3QgZmxvYXQgbHVtaW5hbmNlID0gKHIgKiAyLjBmICsgZyAqIDUuMGYgKyBiKSAvIDguMGY7CisgICAgaWYgKGx1bWluYW5jZSA8PSBtQmxhY2tUaHJlc2hvbGQpIHsKKyAgICAgICAgbUNvbnN0YW50cy5tR2FtbWEgPSBtQmxhY2tHYW1tYTsKKyAgICB9IGVsc2UgaWYgKGx1bWluYW5jZSA+PSBtV2hpdGVUaHJlc2hvbGQpIHsKKyAgICAgICAgbUNvbnN0YW50cy5tR2FtbWEgPSBtV2hpdGVHYW1tYTsKKyAgICB9CisgICAgbUNvbnN0YW50c0RpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBGb250U3RhdGU6OmdldEZvbnRDb2xvcihmbG9hdCAqciwgZmxvYXQgKmcsIGZsb2F0ICpiLCBmbG9hdCAqYSkgY29uc3QgeworICAgICpyID0gbUNvbnN0YW50cy5tRm9udENvbG9yWzBdOworICAgICpnID0gbUNvbnN0YW50cy5tRm9udENvbG9yWzFdOworICAgICpiID0gbUNvbnN0YW50cy5tRm9udENvbG9yWzJdOworICAgICphID0gbUNvbnN0YW50cy5tRm9udENvbG9yWzNdOworfQorCit2b2lkIEZvbnRTdGF0ZTo6ZGVpbml0KENvbnRleHQgKnJzYykKK3sKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIG1Gb250U2hhZGVyRkNvbnN0YW50LmNsZWFyKCk7CisKKyAgICBtSW5kZXhCdWZmZXIuY2xlYXIoKTsKKyAgICBtVmVydGV4QXJyYXkuY2xlYXIoKTsKKworICAgIG1Gb250U2hhZGVyRi5jbGVhcigpOworICAgIG1Gb250U2FtcGxlci5jbGVhcigpOworICAgIG1Gb250UHJvZ3JhbVN0b3JlLmNsZWFyKCk7CisKKyAgICBtVGV4dFRleHR1cmUuY2xlYXIoKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1DYWNoZUxpbmVzW2ldOworICAgIH0KKyAgICBtQ2FjaGVMaW5lcy5jbGVhcigpOworCisgICAgbURlZmF1bHQuY2xlYXIoKTsKKworICAgIFZlY3RvcjxGb250Kj4gZm9udHNUb0RlcmVmZXJlbmNlID0gbUFjdGl2ZUZvbnRzOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGZvbnRzVG9EZXJlZmVyZW5jZS5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZm9udHNUb0RlcmVmZXJlbmNlW2ldLT56ZXJvVXNlclJlZigpOworICAgIH0KKworICAgIGlmKG1MaWJyYXJ5KSB7CisgICAgICAgIEZUX0RvbmVfRnJlZVR5cGUoIG1MaWJyYXJ5ICk7CisgICAgICAgIG1MaWJyYXJ5ID0gTlVMTDsKKyAgICB9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0ZvbnQgcnNpX0ZvbnRDcmVhdGVGcm9tRmlsZShDb250ZXh0ICpyc2MsIGNoYXIgY29uc3QgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgRm9udCAqbmV3Rm9udCA9IEZvbnQ6OmNyZWF0ZShyc2MsIG5hbWUsIGZvbnRTaXplLCBkcGkpOworICAgIGlmKG5ld0ZvbnQpIHsKKyAgICAgICAgbmV3Rm9udC0+aW5jVXNlclJlZigpOworICAgIH0KKyAgICByZXR1cm4gbmV3Rm9udDsKK30KKworfSAvLyByZW5kZXJzY3JpcHQKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZvbnQuaCBiL2xpYnMvcnMvcnNGb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxMmI4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfRk9OVF9ICisjZGVmaW5lIEFORFJPSURfUlNfRk9OVF9ICisKKyNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKKyNpbmNsdWRlICJyc1N0cmVhbS5oIgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCisvLyBHYW1tYSAoPj0gMS4wLCA8PSAxMC4wKQorI2RlZmluZSBQUk9QRVJUWV9URVhUX0dBTU1BICJyby50ZXh0X2dhbW1hIgorI2RlZmluZSBQUk9QRVJUWV9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRCAicm8udGV4dF9nYW1tYS5ibGFja190aHJlc2hvbGQiCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfV0hJVEVfR0FNTUFfVEhSRVNIT0xEICJyby50ZXh0X2dhbW1hLndoaXRlX3RocmVzaG9sZCIKKworI2RlZmluZSBERUZBVUxUX1RFWFRfR0FNTUEgMS40ZgorI2RlZmluZSBERUZBVUxUX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEIDY0CisjZGVmaW5lIERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQgMTkyCisKK2NsYXNzIEZvbnRTdGF0ZTsKKworY2xhc3MgRm9udCA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgZW51bSBSZW5kZXJNb2RlIHsKKyAgICAgICAgRlJBTUVCVUZGRVIsCisgICAgICAgIEJJVE1BUCwKKyAgICAgICAgTUVBU1VSRSwKKyAgICB9OworCisgICAgc3RydWN0IFJlY3QgeworICAgICAgICBpbnQzMl90IGxlZnQ7CisgICAgICAgIGludDMyX3QgdG9wOworICAgICAgICBpbnQzMl90IHJpZ2h0OworICAgICAgICBpbnQzMl90IGJvdHRvbTsKKyAgICAgICAgdm9pZCBzZXQoaW50MzJfdCBsLCBpbnQzMl90IHIsIGludDMyX3QgdCwgaW50MzJfdCBiKSB7CisgICAgICAgICAgICBsZWZ0ID0gbDsKKyAgICAgICAgICAgIHJpZ2h0ID0gcjsKKyAgICAgICAgICAgIHRvcCA9IHQ7CisgICAgICAgICAgICBib3R0b20gPSBiOworICAgICAgICB9CisgICAgfTsKKworICAgIH5Gb250KCk7CisKKyAgICAvLyBDdXJyZW50bHkgZmlsZXMgZG8gbm90IGdldCBzZXJpYWxpemVkLAorICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGluaGVyaXQgZnJvbSBPYmplY3RCYXNlIGZvciByZWYgdHJhY2tpbmcKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeworICAgIH0KKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1VOS05PV047CisgICAgfQorCisgICAgc3RhdGljIEZvbnQgKiBjcmVhdGUoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKTsKKworcHJvdGVjdGVkOgorCisgICAgZnJpZW5kIGNsYXNzIEZvbnRTdGF0ZTsKKworICAgIC8vIFBvaW50ZXIgdG8gdGhlIHV0ZiBkYXRhLCBsZW5ndGggb2YgZGF0YSwgd2hlcmUgdG8gc3RhcnQsIG51bWJlciBvZiBnbHlwaHMgb3QgcmVhZAorICAgIC8vIChlYWNoIGdseXBoIG1heSBiZSBsb25nZXIgdGhhbiBhIGNoYXIgYmVjYXVzZSB3ZSBhcmUgZGVhbGluZyB3aXRoIHV0ZiBkYXRhKQorICAgIC8vIExhc3QgdHdvIHZhcmlhYmxlcyBhcmUgdGhlIGluaXRpYWwgcGVuIHBvc2l0aW9uCisgICAgdm9pZCByZW5kZXJVVEYoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCBpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFydCwgaW50MzJfdCBudW1HbHlwaHMsCisgICAgICAgICAgICAgICAgICAgUmVuZGVyTW9kZSBtb2RlID0gRlJBTUVCVUZGRVIsIFJlY3QgKmJvdW5kcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwID0gTlVMTCwgdWludDMyX3QgYml0bWFwVyA9IDAsIHVpbnQzMl90IGJpdG1hcEggPSAwKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpOworICAgIHN0cnVjdCBDYWNoZWRHbHlwaEluZm8KKyAgICB7CisgICAgICAgIC8vIEhhcyB0aGUgY2FjaGUgYmVlbiBpbnZhbGlkYXRlZD8KKyAgICAgICAgYm9vbCBtSXNWYWxpZDsKKyAgICAgICAgLy8gTG9jYXRpb24gb2YgdGhlIGNhY2hlZCBnbHlwaCBpbiB0aGUgYml0bWFwCisgICAgICAgIC8vIGluIGNhc2Ugd2UgbmVlZCB0byByZXNpemUgdGhlIHRleHR1cmUKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcE1pblg7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBNaW5ZOworICAgICAgICB1aW50MzJfdCBtQml0bWFwV2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBIZWlnaHQ7CisgICAgICAgIC8vIEFsc28gY2FjaGUgdGV4dHVyZSBjb29yZHMgZm9yIHRoZSBxdWFkCisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5VOworICAgICAgICBmbG9hdCBtQml0bWFwTWluVjsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhWOworICAgICAgICAvLyBNaW5pbWl6ZSBob3cgbXVjaCB3ZSBjYWxsIGZyZWV0eXBlCisgICAgICAgIEZUX1VJbnQgbUdseXBoSW5kZXg7CisgICAgICAgIEZUX1ZlY3RvciBtQWR2YW5jZTsKKyAgICAgICAgLy8gVmFsdWVzIGJlbG93IGNvbnRhaW4gYSBnbHlwaCdzIG9yaWdpbiBpbiB0aGUgYml0bWFwCisgICAgICAgIEZUX0ludCBtQml0bWFwTGVmdDsKKyAgICAgICAgRlRfSW50IG1CaXRtYXBUb3A7CisgICAgfTsKKworICAgIFN0cmluZzggbUZvbnROYW1lOworICAgIHVpbnQzMl90IG1Gb250U2l6ZTsKKyAgICB1aW50MzJfdCBtRHBpOworCisgICAgRm9udChDb250ZXh0ICpyc2MpOworICAgIGJvb2wgaW5pdChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKTsKKworICAgIEZUX0ZhY2UgbUZhY2U7CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtSGFzS2VybmluZzsKKworICAgIERlZmF1bHRLZXllZFZlY3Rvcjx1aW50MzJfdCwgQ2FjaGVkR2x5cGhJbmZvKiA+IG1DYWNoZWRHbHlwaHM7CisgICAgQ2FjaGVkR2x5cGhJbmZvKiBnZXRDYWNoZWRVVEZDaGFyKGludDMyX3QgdXRmQ2hhcik7CisKKyAgICBDYWNoZWRHbHlwaEluZm8gKmNhY2hlR2x5cGgodWludDMyX3QgZ2x5cGgpOworICAgIHZvaWQgdXBkYXRlR2x5cGhDYWNoZShDYWNoZWRHbHlwaEluZm8gKmdseXBoKTsKKyAgICB2b2lkIG1lYXN1cmVDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQzMl90IHgsIGludDMyX3QgeSwgUmVjdCAqYm91bmRzKTsKKyAgICB2b2lkIGRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQzMl90IHgsIGludDMyX3QgeSk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKTsKK307CisKK2NsYXNzIEZvbnRTdGF0ZQoreworcHVibGljOgorICAgIEZvbnRTdGF0ZSgpOworICAgIH5Gb250U3RhdGUoKTsKKworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IG1EZWZhdWx0OworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbUxhc3Q7CisKKyAgICB2b2lkIHJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCBpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRJbmRleCA9IDAsIGludCBudW1HbHlwaHMgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgRm9udDo6UmVuZGVyTW9kZSBtb2RlID0gRm9udDo6RlJBTUVCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgIEZvbnQ6OlJlY3QgKmJvdW5kcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCA9IE5VTEwsIHVpbnQzMl90IGJpdG1hcFcgPSAwLCB1aW50MzJfdCBiaXRtYXBIID0gMCk7CisKKyAgICB2b2lkIG1lYXN1cmVUZXh0KGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgRm9udDo6UmVjdCAqYm91bmRzKTsKKworICAgIHZvaWQgc2V0Rm9udENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOworICAgIHZvaWQgZ2V0Rm9udENvbG9yKGZsb2F0ICpyLCBmbG9hdCAqZywgZmxvYXQgKmIsIGZsb2F0ICphKSBjb25zdDsKKworcHJvdGVjdGVkOgorCisgICAgZnJpZW5kIGNsYXNzIEZvbnQ7CisKKyAgICBzdHJ1Y3QgQ2FjaGVUZXh0dXJlTGluZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgbU1heEhlaWdodDsKKyAgICAgICAgdWludDMyX3QgbU1heFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQ3VycmVudFJvdzsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRDb2w7CisgICAgICAgIGJvb2wgbURpcnR5OworCisgICAgICAgIENhY2hlVGV4dHVyZUxpbmUodWludDMyX3QgbWF4SGVpZ2h0LCB1aW50MzJfdCBtYXhXaWR0aCwgdWludDMyX3QgY3VycmVudFJvdywgdWludDMyX3QgY3VycmVudENvbCkgOgorICAgICAgICAgICAgbU1heEhlaWdodChtYXhIZWlnaHQpLCBtTWF4V2lkdGgobWF4V2lkdGgpLCBtQ3VycmVudFJvdyhjdXJyZW50Um93KSwgbUN1cnJlbnRDb2woY3VycmVudENvbCksCisgICAgICAgICAgICBtRGlydHkoZmFsc2UpICB7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZpdEJpdG1hcChGVF9CaXRtYXAgKmJpdG1hcCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKSB7CisgICAgICAgICAgICBpZigodWludDMyX3QpYml0bWFwLT5yb3dzID4gbU1heEhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYobUN1cnJlbnRDb2wgKyAodWludDMyX3QpYml0bWFwLT53aWR0aCA8IG1NYXhXaWR0aCkgeworICAgICAgICAgICAgICAgKnJldE9yaWdpblggPSBtQ3VycmVudENvbDsKKyAgICAgICAgICAgICAgICpyZXRPcmlnaW5ZID0gbUN1cnJlbnRSb3c7CisgICAgICAgICAgICAgICBtQ3VycmVudENvbCArPSBiaXRtYXAtPndpZHRoOworICAgICAgICAgICAgICAgbURpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgVmVjdG9yPENhY2hlVGV4dHVyZUxpbmUqPiBtQ2FjaGVMaW5lczsKKyAgICB1aW50MzJfdCBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisKKyAgICB2b2lkIHByZWNhY2hlTGF0aW4oRm9udCAqZm9udCk7CisgICAgU3RyaW5nOCBtTGF0aW5QcmVjYWNoZTsKKworICAgIENvbnRleHQgKm1SU0M7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBmbG9hdCBtRm9udENvbG9yWzRdOworICAgICAgICBmbG9hdCBtR2FtbWE7CisgICAgfSBtQ29uc3RhbnRzOworICAgIGJvb2wgbUNvbnN0YW50c0RpcnR5OworCisgICAgZmxvYXQgbUJsYWNrR2FtbWE7CisgICAgZmxvYXQgbVdoaXRlR2FtbWE7CisKKyAgICBmbG9hdCBtQmxhY2tUaHJlc2hvbGQ7CisgICAgZmxvYXQgbVdoaXRlVGhyZXNob2xkOworCisgICAgLy8gRnJlZSB0eXBlIGxpYnJhcnksIHdlIG9ubHkgbmVlZCBvbmUgY29weQorICAgIEZUX0xpYnJhcnkgbUxpYnJhcnk7CisgICAgRlRfTGlicmFyeSBnZXRMaWIoKTsKKyAgICBWZWN0b3I8Rm9udCo+IG1BY3RpdmVGb250czsKKworICAgIC8vIFJlbmRlciBzdGF0ZSBmb3IgdGhlIGZvbnQKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1Gb250U2hhZGVyRkNvbnN0YW50OworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRm9udFNoYWRlckY7CisgICAgT2JqZWN0QmFzZVJlZjxTYW1wbGVyPiBtRm9udFNhbXBsZXI7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1Gb250UHJvZ3JhbVN0b3JlOworICAgIHZvaWQgaW5pdFJlbmRlclN0YXRlKCk7CisKKyAgICAvLyBUZXh0dXJlIHRvIGNhY2hlIGdseXBoIGJpdG1hcHMKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1UZXh0VGV4dHVyZTsKKyAgICB2b2lkIGluaXRUZXh0VGV4dHVyZSgpOworICAgIGNvbnN0IHVpbnQ4X3QqIGdldFRleHRUZXh0dXJlRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1aW50OF90KiltVGV4dFRleHR1cmUtPmdldFB0cigpOworICAgIH0KKworICAgIGJvb2wgY2FjaGVCaXRtYXAoRlRfQml0bWFwICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSk7CisgICAgY29uc3QgVHlwZSogZ2V0Q2FjaGVUZXh0dXJlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0VGV4dHVyZS0+Z2V0VHlwZSgpOworICAgIH0KKworICAgIHZvaWQgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisKKyAgICAvLyBQb2ludGVyIHRvIHZlcnRleCBkYXRhIHRvIHNwZWVkIHVwIGZyYW1lIHRvIGZyYW1lIHdvcmsKKyAgICBmbG9hdCAqbVRleHRNZXNoUHRyOworICAgIHVpbnQzMl90IG1DdXJyZW50UXVhZEluZGV4OworICAgIHVpbnQzMl90IG1NYXhOdW1iZXJPZlF1YWRzOworCisgICAgdm9pZCBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtSW5kZXhCdWZmZXI7CisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtVmVydGV4QXJyYXk7CisKKworICAgIGJvb2wgbUluaXRpYWxpemVkOworCisgICAgdm9pZCBjaGVja0luaXQoKTsKKworICAgIHZvaWQgaXNzdWVEcmF3Q29tbWFuZCgpOworCisgICAgdm9pZCBhcHBlbmRNZXNoUXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpOworCit9OworCisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzSGFuZGNvZGUuaCBiL2xpYnMvcnMvcnNIYW5kY29kZS5oCmluZGV4IDgwMGVkZGQuLmMwMmZkNDIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNIYW5kY29kZS5oCisrKyBiL2xpYnMvcnMvcnNIYW5kY29kZS5oCkBAIC0xLDYgKzEsNTcgQEAKIAogI2RlZmluZSBEQVRBX1NZTkNfU0laRSAxMDI0CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX0NvbnRleHRGaW5pc2ggKFJzQ29udGV4dCByc2MpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9Db250ZXh0RmluaXNoKTsKKyAgICBSU19DTURfQ29udGV4dEZpbmlzaCAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX0NvbnRleHRGaW5pc2ggKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfQ29udGV4dEZpbmlzaCwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX1NjcmlwdEludm9rZVYgKFJzQ29udGV4dCByc2MsIFJzU2NyaXB0IHZhLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfU2NyaXB0SW52b2tlVik7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIHNpemUgKz0gKHNpemVCeXRlcyArIDMpICYgfjM7CisgICAgfQorICAgIFJTX0NNRF9TY3JpcHRJbnZva2VWICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfU2NyaXB0SW52b2tlViAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBjbWQtPnMgPSB2YTsKKyAgICBjbWQtPnNsb3QgPSBzbG90OworICAgIGNtZC0+ZGF0YUxlbiA9IHNpemVCeXRlczsKKyAgICBjbWQtPmRhdGEgPSBkYXRhOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBjbWQtPmRhdGEgPSAodm9pZCAqKShjbWQrMSk7CisgICAgICAgIG1lbWNweShjbWQrMSwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0KFJTX0NNRF9JRF9TY3JpcHRJbnZva2VWLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9TY3JpcHRJbnZva2VWLCBzaXplKTsKKyAgICB9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfU2NyaXB0U2V0VmFyViAoUnNDb250ZXh0IHJzYywgUnNTY3JpcHQgdmEsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9TY3JpcHRTZXRWYXJWKTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgc2l6ZSArPSAoc2l6ZUJ5dGVzICsgMykgJiB+MzsKKyAgICB9CisgICAgUlNfQ01EX1NjcmlwdFNldFZhclYgKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9TY3JpcHRTZXRWYXJWICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGNtZC0+cyA9IHZhOworICAgIGNtZC0+c2xvdCA9IHNsb3Q7CisgICAgY21kLT5kYXRhTGVuID0gc2l6ZUJ5dGVzOworICAgIGNtZC0+ZGF0YSA9IGRhdGE7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIGNtZC0+ZGF0YSA9ICh2b2lkICopKGNtZCsxKTsKKyAgICAgICAgbWVtY3B5KGNtZCsxLCBkYXRhLCBzaXplQnl0ZXMpOworICAgICAgICBpby0+bVRvQ29yZS5jb21taXQoUlNfQ01EX0lEX1NjcmlwdFNldFZhclYsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX1NjcmlwdFNldFZhclYsIHNpemUpOworICAgIH0KK30KKwogc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfQWxsb2NhdGlvbkRhdGEgKFJzQ29udGV4dCByc2MsIFJzQWxsb2NhdGlvbiB2YSwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOwpAQCAtNDUsMyArOTYsMjYgQEAKIAogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSAoUnNDb250ZXh0IHJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4LCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3QgY29tcF9vZmZzZXQsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoUlNfQ01EX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhKTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgc2l6ZSArPSAoc2l6ZUJ5dGVzICsgMykgJiB+MzsKKyAgICB9CisgICAgUlNfQ01EX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEgKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgY21kLT52YSA9IHZhOworICAgIGNtZC0+eCA9IHg7CisgICAgY21kLT5kYXRhID0gZGF0YTsKKyAgICBjbWQtPmNvbXBfb2Zmc2V0ID0gY29tcF9vZmZzZXQ7CisgICAgY21kLT5ieXRlcyA9IHNpemVCeXRlczsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgY21kLT5kYXRhID0gKHZvaWQgKikoY21kKzEpOworICAgICAgICBtZW1jcHkoY21kKzEsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdChSU19DTURfSURfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhLCBzaXplKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xpZ2h0LmNwcCBiL2xpYnMvcnMvcnNMaWdodC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMmNmM2UuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc0xpZ2h0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7Ci0KLQotTGlnaHQ6OkxpZ2h0KENvbnRleHQgKnJzYywgYm9vbCBpc0xvY2FsLCBib29sIGlzTW9ubykgOiBPYmplY3RCYXNlKHJzYykKLXsKLSAgICBtQWxsb2NGaWxlID0gX19GSUxFX187Ci0gICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIG1Jc0xvY2FsID0gaXNMb2NhbDsKLSAgICBtSXNNb25vID0gaXNNb25vOwotCi0gICAgbVBvc2l0aW9uWzBdID0gMDsKLSAgICBtUG9zaXRpb25bMV0gPSAwOwotICAgIG1Qb3NpdGlvblsyXSA9IDE7Ci0gICAgbVBvc2l0aW9uWzNdID0gMDsKLQotICAgIG1Db2xvclswXSA9IDEuZjsKLSAgICBtQ29sb3JbMV0gPSAxLmY7Ci0gICAgbUNvbG9yWzJdID0gMS5mOwotICAgIG1Db2xvclszXSA9IDEuZjsKLX0KLQotTGlnaHQ6On5MaWdodCgpCi17Ci19Ci0KLXZvaWQgTGlnaHQ6OnNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgbVBvc2l0aW9uWzBdID0geDsKLSAgICBtUG9zaXRpb25bMV0gPSB5OwotICAgIG1Qb3NpdGlvblsyXSA9IHo7Ci19Ci0KLXZvaWQgTGlnaHQ6OnNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCi17Ci0gICAgbUNvbG9yWzBdID0gcjsKLSAgICBtQ29sb3JbMV0gPSBnOwotICAgIG1Db2xvclsyXSA9IGI7Ci19Ci0KLXZvaWQgTGlnaHQ6OnNldHVwR0wodWludDMyX3QgbnVtKSBjb25zdAotewotICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBudW0sIEdMX0RJRkZVU0UsIG1Db2xvcik7Ci0gICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIG51bSwgR0xfU1BFQ1VMQVIsIG1Db2xvcik7Ci0gICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIG51bSwgR0xfUE9TSVRJT04sIG1Qb3NpdGlvbik7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUxpZ2h0U3RhdGU6OkxpZ2h0U3RhdGUoKQotewotICAgIGNsZWFyKCk7Ci19Ci0KLUxpZ2h0U3RhdGU6On5MaWdodFN0YXRlKCkKLXsKLX0KLQotdm9pZCBMaWdodFN0YXRlOjpjbGVhcigpCi17Ci0gICAgbUlzTG9jYWwgPSBmYWxzZTsKLSAgICBtSXNNb25vID0gZmFsc2U7Ci19Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLXZvaWQgcnNpX0xpZ2h0QmVnaW4oQ29udGV4dCAqcnNjKQotewotICAgIHJzYy0+bVN0YXRlTGlnaHQuY2xlYXIoKTsKLX0KLQotdm9pZCByc2lfTGlnaHRTZXRMb2NhbChDb250ZXh0ICpyc2MsIGJvb2wgaXNMb2NhbCkKLXsKLSAgICByc2MtPm1TdGF0ZUxpZ2h0Lm1Jc0xvY2FsID0gaXNMb2NhbDsKLX0KLQotdm9pZCByc2lfTGlnaHRTZXRNb25vY2hyb21hdGljKENvbnRleHQgKnJzYywgYm9vbCBpc01vbm8pCi17Ci0gICAgcnNjLT5tU3RhdGVMaWdodC5tSXNNb25vID0gaXNNb25vOwotfQotCi1Sc0xpZ2h0IHJzaV9MaWdodENyZWF0ZShDb250ZXh0ICpyc2MpCi17Ci0gICAgTGlnaHQgKmwgPSBuZXcgTGlnaHQocnNjLCByc2MtPm1TdGF0ZUxpZ2h0Lm1Jc0xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJzYy0+bVN0YXRlTGlnaHQubUlzTW9ubyk7Ci0gICAgbC0+aW5jVXNlclJlZigpOwotICAgIHJldHVybiBsOwotfQotCi12b2lkIHJzaV9MaWdodFNldENvbG9yKENvbnRleHQgKnJzYywgUnNMaWdodCB2bCwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYikKLXsKLSAgICBMaWdodCAqbCA9IHN0YXRpY19jYXN0PExpZ2h0ICo+KHZsKTsKLSAgICBsLT5zZXRDb2xvcihyLCBnLCBiKTsKLX0KLQotdm9pZCByc2lfTGlnaHRTZXRQb3NpdGlvbihDb250ZXh0ICpyc2MsIFJzTGlnaHQgdmwsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTGlnaHQgKmwgPSBzdGF0aWNfY2FzdDxMaWdodCAqPih2bCk7Ci0gICAgbC0+c2V0UG9zaXRpb24oeCwgeSwgeik7Ci19Ci0KLQotCi19Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTGlnaHQuaCBiL2xpYnMvcnMvcnNMaWdodC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc5NmU2Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNMaWdodC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9MSUdIVF9ICi0jZGVmaW5lIEFORFJPSURfTElHSFRfSAotCi0KLSNpbmNsdWRlICJyc09iamVjdEJhc2UuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCi0vLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgotY2xhc3MgTGlnaHQgOiBwdWJsaWMgT2JqZWN0QmFzZQotewotcHVibGljOgotICAgIExpZ2h0KENvbnRleHQgKiwgYm9vbCBpc0xvY2FsLCBib29sIGlzTW9ubyk7Ci0gICAgdmlydHVhbCB+TGlnaHQoKTsKLQotICAgIC8vIFZhbHVlcywgbXV0YWJsZSBhZnRlciBjcmVhdGlvbi4KLSAgICB2b2lkIHNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOwotICAgIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7Ci0KLSAgICB2b2lkIHNldHVwR0wodWludDMyX3QgbnVtKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIGZsb2F0IG1Db2xvcls0XTsKLSAgICBmbG9hdCBtUG9zaXRpb25bNF07Ci0gICAgYm9vbCBtSXNMb2NhbDsKLSAgICBib29sIG1Jc01vbm87Ci19OwotCi0KLWNsYXNzIExpZ2h0U3RhdGUgewotcHVibGljOgotICAgIExpZ2h0U3RhdGUoKTsKLSAgICB+TGlnaHRTdGF0ZSgpOwotCi0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgYm9vbCBtSXNNb25vOwotICAgIGJvb2wgbUlzTG9jYWw7Ci19OwotCi0KLX0KLX0KLSNlbmRpZiAvL0FORFJPSURfTElHSFRfSAotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmNwcCBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCmluZGV4IGM3OTY1MjAuLjAxOWVhNzIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCisrKyBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAicnNMb2NrbGVzc0ZpZm8uaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKIExvY2tsZXNzQ29tbWFuZEZpZm86OkxvY2tsZXNzQ29tbWFuZEZpZm8oKQogewpAQCAtMTI4LDE1ICsxMjgsMTkgQEAKICAgICAvL2R1bXBTdGF0ZSgiZmx1c2ggMiIpOwogfQogCit2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OndhaXQoKQoreworICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKKyAgICAgICAgbVNpZ25hbFRvQ29udHJvbC5zZXQoKTsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLndhaXQoKTsKKyAgICB9Cit9CisKIGNvbnN0IHZvaWQgKiBMb2NrbGVzc0NvbW1hbmRGaWZvOjpnZXQodWludDMyX3QgKmNvbW1hbmQsIHVpbnQzMl90ICpieXRlc0RhdGEpCiB7CiAgICAgd2hpbGUoMSkgewogICAgICAgICAvL2R1bXBTdGF0ZSgiZ2V0Iik7Ci0gICAgICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKLSAgICAgICAgICAgIG1TaWduYWxUb0NvbnRyb2wuc2V0KCk7Ci0gICAgICAgICAgICBtU2lnbmFsVG9Xb3JrZXIud2FpdCgpOwotICAgICAgICB9Ci0KKyAgICAgICAgd2FpdCgpOwogICAgICAgICBpZiAobUluU2h1dGRvd24pIHsKICAgICAgICAgICAgICpjb21tYW5kID0gMDsKICAgICAgICAgICAgICpieXRlc0RhdGEgPSAwOwpAQCAtMTY1LDYgKzE2OSwzMCBAQAogICAgIC8vZHVtcFN0YXRlKCJuZXh0Iik7CiB9CiAKK2Jvb2wgTG9ja2xlc3NDb21tYW5kRmlmbzo6bWFrZVNwYWNlTm9uQmxvY2tpbmcodWludDMyX3QgYnl0ZXMpCit7CisgICAgLy9kdW1wU3RhdGUoIm1ha2Ugc3BhY2Ugbm9uLWJsb2NraW5nIik7CisgICAgaWYgKChtUHV0K2J5dGVzKSA+IG1FbmQpIHsKKyAgICAgICAgLy8gTmVlZCB0byBsb29wIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgZ2V0IGlzLgorICAgICAgICBpZigobUdldCA+IG1QdXQpICYmIChtQnVmZmVyKzQgPj0gbUdldCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRvc3MgaW4gYSByZXNldCB0aGVuIHRoZSBub3JtYWwgd2FpdCBmb3Igc3BhY2Ugd2lsbCBkbyB0aGUgcmVzdC4KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCAqPihtUHV0KVswXSA9IDA7CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4obVB1dClbMV0gPSAwOworICAgICAgICBtUHV0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLnNldCgpOworICAgIH0KKworICAgIC8vIGl0IHdpbGwgZml0IGhlcmUgc28gd2UganVzdCBuZWVkIHRvIHdhaXQgZm9yIHNwYWNlLgorICAgIGlmKGdldEZyZWVTcGFjZSgpIDwgYnl0ZXMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86Om1ha2VTcGFjZSh1aW50MzJfdCBieXRlcykKIHsKICAgICAvL2R1bXBTdGF0ZSgibWFrZSBzcGFjZSIpOwpAQCAtMTc4LDYgKzIwNiw3IEBACiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4obVB1dClbMF0gPSAwOwogICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQxNl90ICo+KG1QdXQpWzFdID0gMDsKICAgICAgICAgbVB1dCA9IG1CdWZmZXI7CisgICAgICAgIG1TaWduYWxUb1dvcmtlci5zZXQoKTsKICAgICB9CiAKICAgICAvLyBpdCB3aWxsIGZpdCBoZXJlIHNvIHdlIGp1c3QgbmVlZCB0byB3YWl0IGZvciBzcGFjZS4KQEAgLTE4OSw4MiArMjE4LDYgQEAKIAogdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpkdW1wU3RhdGUoY29uc3QgY2hhciAqcykgY29uc3QKIHsKLSAgICBMT0dWKCIlcyAgcHV0ICVwLCBnZXQgJXAsICBidWYgJXAsICBlbmQgJXAiLCBzLCBtUHV0LCBtR2V0LCBtQnVmZmVyLCBtRW5kKTsKLX0KLQotTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjpTaWduYWwoKQotewotICAgIG1TZXQgPSB0cnVlOwotfQotCi1Mb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6On5TaWduYWwoKQotewotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKLSAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmRpdGlvbik7Ci19Ci0KLWJvb2wgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjppbml0KCkKLXsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIG11dGV4IGluaXQgZmFpbHVyZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJm1Db25kaXRpb24sIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIGNvbmRpdGlvbiBpbml0IGZhaWx1cmUiKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjpzZXQoKQotewotICAgIGludCBzdGF0dXM7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtU2V0ID0gdHJ1ZTsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJm1Db25kaXRpb24pOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgb24gc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQotfQotCi12b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6d2FpdCgpCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFtU2V0KSB7Ci0gICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZtQ29uZGl0aW9uLCAmbU11dGV4KTsKLSAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgd2FpdGluZyBvbiBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtU2V0ID0gZmFsc2U7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQorICAgIExPR1YoIiVzICVwICBwdXQgJXAsIGdldCAlcCwgIGJ1ZiAlcCwgIGVuZCAlcCIsIHMsIHRoaXMsIG1QdXQsIG1HZXQsIG1CdWZmZXIsIG1FbmQpOwogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmggYi9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmgKaW5kZXggZDBhNDM1Ni4uYjhjZWVlZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oCisrKyBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaApAQCAtMTksOCArMTksMTAgQEAKIAogCiAjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzU2lnbmFsLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCiAKIC8vIEEgc2ltcGxlIEZJRk8gdG8gYmUgdXNlZCBhcyBhIHByb2R1Y2VyIC8gY29uc3VtZXIgYmV0d2VlbiB0d28KQEAgLTM3LDI0ICszOSw3IEBACiAgICAgTG9ja2xlc3NDb21tYW5kRmlmbygpOwogICAgIH5Mb2NrbGVzc0NvbW1hbmRGaWZvKCk7CiAKLQogcHJvdGVjdGVkOgotICAgIGNsYXNzIFNpZ25hbCB7Ci0gICAgcHVibGljOgotICAgICAgICBTaWduYWwoKTsKLSAgICAgICAgflNpZ25hbCgpOwotCi0gICAgICAgIGJvb2wgaW5pdCgpOwotCi0gICAgICAgIHZvaWQgc2V0KCk7Ci0gICAgICAgIHZvaWQgd2FpdCgpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICBib29sIG1TZXQ7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7Ci0gICAgICAgIHB0aHJlYWRfY29uZF90IG1Db25kaXRpb247Ci0gICAgfTsKLQogICAgIHVpbnQ4X3QgKiB2b2xhdGlsZSBtUHV0OwogICAgIHVpbnQ4X3QgKiB2b2xhdGlsZSBtR2V0OwogICAgIHVpbnQ4X3QgKiBtQnVmZmVyOwpAQCAtNjUsMTggKzUwLDE5IEBACiAgICAgU2lnbmFsIG1TaWduYWxUb1dvcmtlcjsKICAgICBTaWduYWwgbVNpZ25hbFRvQ29udHJvbDsKIAotCi0KIHB1YmxpYzoKICAgICB2b2lkICogcmVzZXJ2ZSh1aW50MzJfdCBieXRlcyk7CiAgICAgdm9pZCBjb21taXQodWludDMyX3QgY29tbWFuZCwgdWludDMyX3QgYnl0ZXMpOwogICAgIHZvaWQgY29tbWl0U3luYyh1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCBieXRlcyk7CiAKICAgICB2b2lkIGZsdXNoKCk7CisgICAgdm9pZCB3YWl0KCk7CisKICAgICBjb25zdCB2b2lkICogZ2V0KHVpbnQzMl90ICpjb21tYW5kLCB1aW50MzJfdCAqYnl0ZXNEYXRhKTsKICAgICB2b2lkIG5leHQoKTsKIAogICAgIHZvaWQgbWFrZVNwYWNlKHVpbnQzMl90IGJ5dGVzKTsKKyAgICBib29sIG1ha2VTcGFjZU5vbkJsb2NraW5nKHVpbnQzMl90IGJ5dGVzKTsKIAogICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldEZyZWVTcGFjZSgpIGNvbnN0OwpAQCAtODgsNCArNzQsNSBAQAogCiAKIH0KK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc01hdHJpeC5jcHAgYi9saWJzL3JzL3JzTWF0cml4LmNwcAppbmRleCAyZjIxNDA1Li45NGVlZjEzIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWF0cml4LmNwcAorKysgYi9saWJzL3JzL3JzTWF0cml4LmNwcApAQCAtNzMsNyArNzMsNyBAQAogICAgIHMgPSBzaW5mKHJvdCk7CiAKICAgICBjb25zdCBmbG9hdCBsZW4gPSBzcXJ0Zih4KnggKyB5KnkgKyB6KnopOwotICAgIGlmICghKGxlbiAhPSAxKSkgeworICAgIGlmIChsZW4gIT0gMSkgewogICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIGxlbjsKICAgICAgICAgeCAqPSByZWNpcExlbjsKICAgICAgICAgeSAqPSByZWNpcExlbjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNZXNoLmNwcCBiL2xpYnMvcnMvcnNNZXNoLmNwcAppbmRleCBkNTk1YjRlLi44ZTQzZjI0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWVzaC5jcHAKKysrIGIvbGlicy9ycy9yc01lc2guY3BwCkBAIC0xNCwyOCArMTQsMjU2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgorCisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KIE1lc2g6Ok1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbVZlcnRpY2llcyA9IE5VTEw7Ci0gICAgbVZlcnRpY2llc0NvdW50ID0gMDsKICAgICBtUHJpbWl0aXZlcyA9IE5VTEw7CiAgICAgbVByaW1pdGl2ZXNDb3VudCA9IDA7CisgICAgbVZlcnRleEJ1ZmZlcnMgPSBOVUxMOworICAgIG1WZXJ0ZXhCdWZmZXJDb3VudCA9IDA7CiB9CiAKIE1lc2g6On5NZXNoKCkKIHsKKyAgICBpZihtVmVydGV4QnVmZmVycykgeworICAgICAgICBkZWxldGVbXSBtVmVydGV4QnVmZmVyczsKKyAgICB9CisKKyAgICBpZihtUHJpbWl0aXZlcykgeworICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtUHJpbWl0aXZlc0NvdW50OyBpICsrKSB7CisgICAgICAgICAgICBkZWxldGUgbVByaW1pdGl2ZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlW10gbVByaW1pdGl2ZXM7CisgICAgfQogfQogCit2b2lkIE1lc2g6OnJlbmRlcihDb250ZXh0ICpyc2MpIGNvbnN0Cit7CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUHJpbWl0aXZlc0NvdW50OyBjdCArKykgeworICAgICAgICByZW5kZXJQcmltaXRpdmUocnNjLCBjdCk7CisgICAgfQorfQorCit2b2lkIE1lc2g6OnJlbmRlclByaW1pdGl2ZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHByaW1JbmRleCkgY29uc3QgeworICAgIGlmIChwcmltSW5kZXggPj0gbVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHByaW1pdGl2ZSBpbmRleCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUHJpbWl0aXZlX3QgKnByaW0gPSBtUHJpbWl0aXZlc1twcmltSW5kZXhdOworCisgICAgaWYgKHByaW0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICByZW5kZXJQcmltaXRpdmVSYW5nZShyc2MsIHByaW1JbmRleCwgMCwgcHJpbS0+bUluZGV4QnVmZmVyLT5nZXRUeXBlKCktPmdldERpbVgoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZW5kZXJQcmltaXRpdmVSYW5nZShyc2MsIHByaW1JbmRleCwgMCwgbVZlcnRleEJ1ZmZlcnNbMF0tPmdldFR5cGUoKS0+Z2V0RGltWCgpKTsKK30KKwordm9pZCBNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHByaW1JbmRleCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikgY29uc3QKK3sKKyAgICBpZiAobGVuIDwgMSB8fCBwcmltSW5kZXggPj0gbVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZSAxIik7CisgICAgVmVydGV4QXJyYXkgdmE7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhCdWZmZXJDb3VudDsgY3QrKykgeworICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7CisgICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0tPmdldElzQnVmZmVyT2JqZWN0KCkpIHsKKyAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0UHRyKCkpOworICAgICAgICB9CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0VHlwZSgpLT5lbmFibGVHTFZlcnRleEJ1ZmZlcigmdmEpOworICAgIH0KKyAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOworCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZSAyIik7CisgICAgUHJpbWl0aXZlX3QgKnByaW0gPSBtUHJpbWl0aXZlc1twcmltSW5kZXhdOworICAgIGlmIChwcmltLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhyc2MpOworICAgICAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHByaW0tPm1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKHByaW0tPm1HTFByaW1pdGl2ZSwgbGVuLCBHTF9VTlNJR05FRF9TSE9SVCwgKHVpbnQxNl90ICopKHN0YXJ0ICogMikpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRHJhd0FycmF5cyhwcmltLT5tR0xQcmltaXRpdmUsIHN0YXJ0LCBsZW4pOworICAgIH0KKworICAgIHJzYy0+Y2hlY2tFcnJvcigiTWVzaDo6cmVuZGVyUHJpbWl0aXZlUmFuZ2UiKTsKK30KKworCit2b2lkIE1lc2g6OnVwbG9hZEFsbChDb250ZXh0ICpyc2MpCit7CisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVZlcnRleEJ1ZmZlckNvdW50OyBjdCArKykgeworICAgICAgICBpZiAobVZlcnRleEJ1ZmZlcnNbY3RdLmdldCgpKSB7CisgICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVByaW1pdGl2ZXNDb3VudDsgY3QgKyspIHsKKyAgICAgICAgaWYgKG1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICBtUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVzaDo6dXBkYXRlR0xQcmltaXRpdmVzKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtUHJpbWl0aXZlc0NvdW50OyBpICsrKSB7CisgICAgICAgIHN3aXRjaChtUHJpbWl0aXZlc1tpXS0+bVByaW1pdGl2ZSkgeworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfUE9JTlQ6ICAgICAgICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9QT0lOVFM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORTogICAgICAgICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FUzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FX1NUUklQOiAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVfU1RSSVA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEU6ICAgICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRVM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVA6IG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9TVFJJUDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9GQU46ICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX0ZBTjsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVzaDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgLy8gU3RvcmUgbnVtYmVyIG9mIHZlcnRleCBzdHJlYW1zCisgICAgc3RyZWFtLT5hZGRVMzIobVZlcnRleEJ1ZmZlckNvdW50KTsKKyAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbVZlcnRleEJ1ZmZlckNvdW50OyB2Q291bnQgKyspIHsKKyAgICAgICAgbVZlcnRleEJ1ZmZlcnNbdkNvdW50XS0+c2VyaWFsaXplKHN0cmVhbSk7CisgICAgfQorCisgICAgc3RyZWFtLT5hZGRVMzIobVByaW1pdGl2ZXNDb3VudCk7CisgICAgLy8gU3RvcmUgdGhlIHByaW1pdGl2ZXMKKyAgICBmb3IgKHVpbnQzMl90IHBDb3VudCA9IDA7IHBDb3VudCA8IG1QcmltaXRpdmVzQ291bnQ7IHBDb3VudCArKykgeworICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBtUHJpbWl0aXZlc1twQ291bnRdOworCisgICAgICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpcHJpbS0+bVByaW1pdGl2ZSk7CisKKyAgICAgICAgaWYocHJpbS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICBzdHJlYW0tPmFkZFUzMigxKTsKKyAgICAgICAgICAgIHByaW0tPm1JbmRleEJ1ZmZlci0+c2VyaWFsaXplKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHJlYW0tPmFkZFUzMigwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworTWVzaCAqTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX01FU0gpIHsKKyAgICAgICAgTE9HRSgibWVzaCBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgTWVzaCAqIG1lc2ggPSBuZXcgTWVzaChyc2MpOworCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisgICAgbWVzaC0+c2V0TmFtZShuYW1lLnN0cmluZygpLCBuYW1lLnNpemUoKSk7CisKKyAgICBtZXNoLT5tVmVydGV4QnVmZmVyQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihtZXNoLT5tVmVydGV4QnVmZmVyQ291bnQpIHsKKyAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnMgPSBuZXcgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPlttZXNoLT5tVmVydGV4QnVmZmVyQ291bnRdOworCisgICAgICAgIGZvcih1aW50MzJfdCB2Q291bnQgPSAwOyB2Q291bnQgPCBtZXNoLT5tVmVydGV4QnVmZmVyQ291bnQ7IHZDb3VudCArKykgeworICAgICAgICAgICAgQWxsb2NhdGlvbiAqdmVydGV4QWxsb2MgPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICAgICAgICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJzW3ZDb3VudF0uc2V0KHZlcnRleEFsbG9jKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1lc2gtPm1QcmltaXRpdmVzQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihtZXNoLT5tUHJpbWl0aXZlc0NvdW50KSB7CisgICAgICAgIG1lc2gtPm1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZV90ICpbbWVzaC0+bVByaW1pdGl2ZXNDb3VudF07CisKKyAgICAgICAgLy8gbG9hZCBhbGwgcHJpbWl0aXZlcworICAgICAgICBmb3IgKHVpbnQzMl90IHBDb3VudCA9IDA7IHBDb3VudCA8IG1lc2gtPm1QcmltaXRpdmVzQ291bnQ7IHBDb3VudCArKykgeworICAgICAgICAgICAgUHJpbWl0aXZlX3QgKiBwcmltID0gbmV3IFByaW1pdGl2ZV90OworICAgICAgICAgICAgbWVzaC0+bVByaW1pdGl2ZXNbcENvdW50XSA9IHByaW07CisKKyAgICAgICAgICAgIHByaW0tPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpc3RyZWFtLT5sb2FkVTgoKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpbmRleCBidWZmZXIgd2FzIHN0b3JlZAorICAgICAgICAgICAgdWludDMyX3QgaXNJbmRleFByZXNlbnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgICAgIGlmKGlzSW5kZXhQcmVzZW50KSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqaW5kZXhBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgICAgICAgICAgICAgIHByaW0tPm1JbmRleEJ1ZmZlci5zZXQoaW5kZXhBbGxvYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZXNoLT51cGRhdGVHTFByaW1pdGl2ZXMoKTsKKyAgICBtZXNoLT51cGxvYWRBbGwocnNjKTsKKworICAgIHJldHVybiBtZXNoOworfQorCit2b2lkIE1lc2g6OmNvbXB1dGVCQm94KCkgeworICAgIGZsb2F0ICpwb3NQdHIgPSBOVUxMOworICAgIHVpbnQzMl90IHZlY3RvclNpemUgPSAwOworICAgIHVpbnQzMl90IHN0cmlkZSA9IDA7CisgICAgdWludDMyX3QgbnVtVmVydHMgPSAwOworICAgIC8vIEZpcnN0IHdlIG5lZWQgdG8gZmluZCB0aGUgcG9zaXRpb24gcHRyIGFuZCBzdHJpZGUKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleEJ1ZmZlckNvdW50OyBjdCsrKSB7CisgICAgICAgIGNvbnN0IFR5cGUgKmJ1ZmZlclR5cGUgPSBtVmVydGV4QnVmZmVyc1tjdF0tPmdldFR5cGUoKTsKKyAgICAgICAgY29uc3QgRWxlbWVudCAqYnVmZmVyRWxlbSA9IGJ1ZmZlclR5cGUtPmdldEVsZW1lbnQoKTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgYnVmZmVyRWxlbS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7CisgICAgICAgICAgICBpZihzdHJjbXAoYnVmZmVyRWxlbS0+Z2V0RmllbGROYW1lKGN0KSwgInBvc2l0aW9uIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHZlY3RvclNpemUgPSBidWZmZXJFbGVtLT5nZXRGaWVsZChjdCktPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKTsKKyAgICAgICAgICAgICAgICBzdHJpZGUgPSBidWZmZXJFbGVtLT5nZXRTaXplQnl0ZXMoKSAvIHNpemVvZihmbG9hdCk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gYnVmZmVyRWxlbS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7CisgICAgICAgICAgICAgICAgcG9zUHRyID0gKGZsb2F0KikoKHVpbnQ4X3QqKW1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0UHRyKCkgKyBvZmZzZXQpOworICAgICAgICAgICAgICAgIG51bVZlcnRzID0gYnVmZmVyVHlwZS0+Z2V0RGltWCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKHBvc1B0cikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtQkJveE1pblswXSA9IG1CQm94TWluWzFdID0gbUJCb3hNaW5bMl0gPSAxZTY7CisgICAgbUJCb3hNYXhbMF0gPSBtQkJveE1heFsxXSA9IG1CQm94TWF4WzJdID0gLTFlNjsKKyAgICBpZighcG9zUHRyKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBjb21wdXRlIGJvdW5kaW5nIGJveCIpOworICAgICAgICBtQkJveE1pblswXSA9IG1CQm94TWluWzFdID0gbUJCb3hNaW5bMl0gPSAwLjBmOworICAgICAgICBtQkJveE1heFswXSA9IG1CQm94TWF4WzFdID0gbUJCb3hNYXhbMl0gPSAwLjBmOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtVmVydHM7IGkgKyspIHsKKyAgICAgICAgZm9yKHVpbnQzMl90IHYgPSAwOyB2IDwgdmVjdG9yU2l6ZTsgdiArKykgeworICAgICAgICAgICAgbUJCb3hNaW5bdl0gPSByc01pbihtQkJveE1pblt2XSwgcG9zUHRyW3ZdKTsKKyAgICAgICAgICAgIG1CQm94TWF4W3ZdID0gcnNNYXgobUJCb3hNYXhbdl0sIHBvc1B0clt2XSk7CisgICAgICAgIH0KKyAgICAgICAgcG9zUHRyICs9IHN0cmlkZTsKKyAgICB9Cit9CiAKIAogTWVzaENvbnRleHQ6Ok1lc2hDb250ZXh0KCkKQEAgLTQ2LDMgKzI3NCw4MyBAQAogewogfQogCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworUnNNZXNoIHJzaV9NZXNoQ3JlYXRlKENvbnRleHQgKnJzYywgdWludDMyX3QgdnR4Q291bnQsIHVpbnQzMl90IGlkeENvdW50KQoreworICAgIE1lc2ggKnNtID0gbmV3IE1lc2gocnNjKTsKKyAgICBzbS0+aW5jVXNlclJlZigpOworCisgICAgc20tPm1QcmltaXRpdmVzQ291bnQgPSBpZHhDb3VudDsKKyAgICBzbS0+bVByaW1pdGl2ZXMgPSBuZXcgTWVzaDo6UHJpbWl0aXZlX3QgKltzbS0+bVByaW1pdGl2ZXNDb3VudF07CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpZHhDb3VudDsgY3QgKyspIHsKKyAgICAgICAgc20tPm1QcmltaXRpdmVzW2N0XSA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdDsKKyAgICB9CisKKyAgICBzbS0+bVZlcnRleEJ1ZmZlckNvdW50ID0gdnR4Q291bnQ7CisgICAgc20tPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bdnR4Q291bnRdOworCisgICAgcmV0dXJuIHNtOworfQorCit2b2lkIHJzaV9NZXNoQmluZFZlcnRleChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBzbG90KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgcnNBc3NlcnQoc2xvdCA8IHNtLT5tVmVydGV4QnVmZmVyQ291bnQpOworCisgICAgc20tPm1WZXJ0ZXhCdWZmZXJzW3Nsb3RdLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKK30KKwordm9pZCByc2lfTWVzaEJpbmRJbmRleChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBwcmltVHlwZSwgdWludDMyX3Qgc2xvdCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KHNsb3QgPCBzbS0+bVByaW1pdGl2ZXNDb3VudCk7CisKKyAgICBzbS0+bVByaW1pdGl2ZXNbc2xvdF0tPm1JbmRleEJ1ZmZlci5zZXQoKEFsbG9jYXRpb24gKil2YSk7CisgICAgc20tPm1QcmltaXRpdmVzW3Nsb3RdLT5tUHJpbWl0aXZlID0gKFJzUHJpbWl0aXZlKXByaW1UeXBlOworICAgIHNtLT51cGRhdGVHTFByaW1pdGl2ZXMoKTsKK30KKwordm9pZCByc2lfTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBpbnQzMl90ICpudW1WdHgpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICAqbnVtVnR4ID0gc20tPm1WZXJ0ZXhCdWZmZXJDb3VudDsKK30KKwordm9pZCByc2lfTWVzaEdldEluZGV4Q291bnQoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIGludDMyX3QgKm51bUlkeCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgICpudW1JZHggPSBzbS0+bVByaW1pdGl2ZXNDb3VudDsKK30KKwordm9pZCByc2lfTWVzaEdldFZlcnRpY2VzKENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gKnZ0eERhdGEsIHVpbnQzMl90IHZ0eERhdGFDb3VudCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KHZ0eERhdGFDb3VudCA9PSBzbS0+bVZlcnRleEJ1ZmZlckNvdW50KTsKKworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgdnR4RGF0YUNvdW50OyBjdCArKykgeworICAgICAgICB2dHhEYXRhW2N0XSA9IHNtLT5tVmVydGV4QnVmZmVyc1tjdF0uZ2V0KCk7CisgICAgICAgIHNtLT5tVmVydGV4QnVmZmVyc1tjdF0tPmluY1VzZXJSZWYoKTsKKyAgICB9Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRJbmRpY2VzKENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gKnZhLCB1aW50MzJfdCAqcHJpbVR5cGUsIHVpbnQzMl90IGlkeERhdGFDb3VudCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KGlkeERhdGFDb3VudCA9PSBzbS0+bVByaW1pdGl2ZXNDb3VudCk7CisKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IGlkeERhdGFDb3VudDsgY3QgKyspIHsKKyAgICAgICAgdmFbY3RdID0gc20tPm1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLmdldCgpOworICAgICAgICBwcmltVHlwZVtjdF0gPSBzbS0+bVByaW1pdGl2ZXNbY3RdLT5tUHJpbWl0aXZlOworICAgICAgICBpZihzbS0+bVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci0+aW5jVXNlclJlZigpOworICAgICAgICB9CisgICAgfQorCit9CisKKworCisKK319CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5oIGIvbGlicy9ycy9yc01lc2guaAppbmRleCA1MjAxYWJkLi5lZDAxYzM4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWVzaC5oCisrKyBiL2xpYnMvcnMvcnNNZXNoLmgKQEAgLTMyLDQ1ICszMiw0MCBAQAogICAgIE1lc2goQ29udGV4dCAqKTsKICAgICB+TWVzaCgpOwogCi0gICAgc3RydWN0IFZlcnRpY2llc190Ci0gICAgewotICAgICAgICBBbGxvY2F0aW9uICoqIG1BbGxvY2F0aW9uczsKLSAgICAgICAgdWludDMyX3QgbUFsbG9jYXRpb25Db3VudDsKKyAgICAvLyBDb250YWlucyB2ZXJ0ZXggZGF0YQorICAgIC8vIFBvc2l0aW9uLCBub3JtYWwsIHRleGNvb3JkLCBldGMgY291bGQgZWl0aGVyIGJlIHN0cmlkZWQgaW4gb25lIGFsbG9jYXRpb24KKyAgICAvLyBvZiBwcm92aWRlZCBzZXBhcmV0ZWx5IGluIG11bHRpcGxlIG9uZXMKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+ICptVmVydGV4QnVmZmVyczsKKyAgICB1aW50MzJfdCBtVmVydGV4QnVmZmVyQ291bnQ7CiAKLSAgICAgICAgc2l6ZV90IG1WZXJ0ZXhEYXRhU2l6ZTsKLQotICAgICAgICBzaXplX3QgbU9mZnNldENvb3JkOwotICAgICAgICBzaXplX3QgbU9mZnNldFRleDsKLSAgICAgICAgc2l6ZV90IG1PZmZzZXROb3JtOwotCi0gICAgICAgIHNpemVfdCBtU2l6ZUNvb3JkOwotICAgICAgICBzaXplX3QgbVNpemVUZXg7Ci0gICAgICAgIHNpemVfdCBtU2l6ZU5vcm07Ci0KLSAgICAgICAgdWludDMyX3QgbUJ1ZmZlck9iamVjdDsKLSAgICB9OwotCisgICAgLy8gRWl0aGVyIG1JbmRleEJ1ZmZlciwgbVByaW1pdGl2ZUJ1ZmZlciBvciBib3RoIGNvdWxkIGhhdmUgYSBOVUxMIHJlZmVyZW5jZQorICAgIC8vIElmIGJvdGggYXJlIG51bGwsIG1QcmltaXRpdmUgb25seSB3b3VsZCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgbWVzaAogICAgIHN0cnVjdCBQcmltaXRpdmVfdAogICAgIHsKLSAgICAgICAgUnNQcmltaXRpdmUgbVR5cGU7Ci0gICAgICAgIFZlcnRpY2llc190ICptVmVydGljaWVzOworICAgICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1JbmRleEJ1ZmZlcjsKIAotICAgICAgICB1aW50MzJfdCBtSW5kZXhDb3VudDsKLSAgICAgICAgdWludDE2X3QgKm1JbmRpY2llczsKLQotICAgICAgICB1aW50MzJfdCBtUmVzdGFydENvdW50czsKLSAgICAgICAgdWludDE2X3QgKm1SZXN0YXJ0czsKKyAgICAgICAgUnNQcmltaXRpdmUgbVByaW1pdGl2ZTsKKyAgICAgICAgdWludDMyX3QgbUdMUHJpbWl0aXZlOwogICAgIH07CiAKLSAgICBWZXJ0aWNpZXNfdCAqIG1WZXJ0aWNpZXM7Ci0gICAgdWludDMyX3QgbVZlcnRpY2llc0NvdW50OwotCiAgICAgUHJpbWl0aXZlX3QgKiogbVByaW1pdGl2ZXM7CiAgICAgdWludDMyX3QgbVByaW1pdGl2ZXNDb3VudDsKIAorICAgIHZvaWQgcmVuZGVyKENvbnRleHQgKikgY29uc3Q7CisgICAgdm9pZCByZW5kZXJQcmltaXRpdmUoQ29udGV4dCAqLCB1aW50MzJfdCBwcmltSW5kZXgpIGNvbnN0OworICAgIHZvaWQgcmVuZGVyUHJpbWl0aXZlUmFuZ2UoQ29udGV4dCAqLCB1aW50MzJfdCBwcmltSW5kZXgsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0OworICAgIHZvaWQgdXBsb2FkQWxsKENvbnRleHQgKik7CisgICAgdm9pZCB1cGRhdGVHTFByaW1pdGl2ZXMoKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX01FU0g7IH0KKyAgICBzdGF0aWMgTWVzaCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKLSAgICB2b2lkIGFuYWx5emVFbGVtZW50KCk7CisgICAgLy8gQm91bmRpbmcgdm9sdW1lcworICAgIGZsb2F0IG1CQm94TWluWzNdOworICAgIGZsb2F0IG1CQm94TWF4WzNdOworICAgIHZvaWQgY29tcHV0ZUJCb3goKTsKKwogcHJvdGVjdGVkOgogfTsKIApAQCAtODgsMyArODMsNCBAQAogI2VuZGlmIC8vQU5EUk9JRF9SU19UUklBTkdMRV9NRVNIX0gKIAogCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNdXRleC5jcHAgYi9saWJzL3JzL3JzTXV0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NzUyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzTXV0ZXguY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNNdXRleC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworTXV0ZXg6Ok11dGV4KCkKK3sKK30KKworTXV0ZXg6On5NdXRleCgpCit7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworfQorCitib29sIE11dGV4Ojppbml0KCkKK3sKKyAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTXV0ZXg6Ok11dGV4IGluaXQgZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE11dGV4Ojpsb2NrKCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIk11dGV4OiBlcnJvciAlaSBsb2NraW5nLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXV0ZXg6OnVubG9jaygpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIk11dGV4IGVycm9yICVpIHVubG9ja2luZy4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNdXRleC5oIGIvbGlicy9ycy9yc011dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3MjVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNNdXRleC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfTVVURVhfSAorI2RlZmluZSBBTkRST0lEX1JTX01VVEVYX0gKKworCisjaW5jbHVkZSAicnNVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgTXV0ZXggeworcHVibGljOgorICAgIE11dGV4KCk7CisgICAgfk11dGV4KCk7CisKKyAgICBib29sIGluaXQoKTsKKyAgICBib29sIGxvY2soKTsKKyAgICBib29sIHVubG9jaygpOworCitwcm90ZWN0ZWQ6CisgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKK307CisKK30KK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNOb2lzZS5jcHAgYi9saWJzL3JzL3JzTm9pc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY3NTg2Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNOb2lzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIG5vaXNlIGZ1bmN0aW9ucyB3YXMgcG9ydGVkIGZyb20gdGhlIEphdmEKLSAqIGltcGxlbWVudGF0aW9uIGJ5IEplcnJ5IEh1eHRhYmxlIChodHRwOi8vd3d3LmpobGFicy5jb20pIHVuZGVyCi0gKiBBcGFjaGUgTGljZW5zZSAyLjAgKHNlZSBodHRwOi8vamhsYWJzLmNvbS9pcC9maWx0ZXJzL2Rvd25sb2FkLmh0bWwpCi0gKgotICogT3JpZ2luYWwgaGVhZGVyOgotICoKLSAqIENvcHlyaWdodCAyMDA2IEplcnJ5IEh1eHRhYmxlCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJyc05vaXNlLmgiCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotI2RlZmluZSBCIDB4MTAwCi0jZGVmaW5lIEJNIDB4ZmYKLSNkZWZpbmUgTiAweDEwMDAKLQotc3RhdGljIGludCBwW0IgKyBCICsgMl07Ci1zdGF0aWMgZmxvYXQgZzNbQiArIEIgKyAyXVszXTsKLXN0YXRpYyBmbG9hdCBnMltCICsgQiArIDJdWzJdOwotc3RhdGljIGZsb2F0IGcxW0IgKyBCICsgMl07Ci1zdGF0aWMgYm9vbCBub2lzZV9zdGFydCA9IHRydWU7Ci0KLSNkZWZpbmUgbGVycGYoc3RhcnQsIHN0b3AsIGFtb3VudCkgc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudAotCi1zdGF0aWMgaW5saW5lIGZsb2F0IG5vaXNlX3NDdXJ2ZShmbG9hdCB0KQotewotICAgIHJldHVybiB0ICogdCAqICgzLjBmIC0gMi4wZiAqIHQpOwotfQotCi1pbmxpbmUgdm9pZCBTQ19ub3JtYWxpemVmMihmbG9hdCB2W10pCi17Ci0gICAgZmxvYXQgcyA9IChmbG9hdClzcXJ0Zih2WzBdICogdlswXSArIHZbMV0gKiB2WzFdKTsKLSAgICB2WzBdID0gdlswXSAvIHM7Ci0gICAgdlsxXSA9IHZbMV0gLyBzOwotfQotCi1pbmxpbmUgdm9pZCBTQ19ub3JtYWxpemVmMyhmbG9hdCB2W10pCi17Ci0gICAgZmxvYXQgcyA9IChmbG9hdClzcXJ0Zih2WzBdICogdlswXSArIHZbMV0gKiB2WzFdICsgdlsyXSAqIHZbMl0pOwotICAgIHZbMF0gPSB2WzBdIC8gczsKLSAgICB2WzFdID0gdlsxXSAvIHM7Ci0gICAgdlsyXSA9IHZbMl0gLyBzOwotfQotCi1zdGF0aWMgdm9pZCBub2lzZV9pbml0KCkKLXsKLSAgICBpbnQgaSwgaiwgazsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgQjsgaSsrKSB7Ci0gICAgICAgIHBbaV0gPSBpOwotICAgICAgICAKLSAgICAgICAgZzFbaV0gPSAoZmxvYXQpKChyYW5kKCkgJSAoQiArIEIpKSAtIEIpIC8gQjsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgICAgICBnMltpXVtqXSA9IChmbG9hdCkoKHJhbmQoKSAlIChCICsgQikpIC0gQikgLyBCOwotICAgICAgICBTQ19ub3JtYWxpemVmMihnMltpXSk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgZzNbaV1bal0gPSAoZmxvYXQpKChyYW5kKCkgJSAoQiArIEIpKSAtIEIpIC8gQjsKLSAgICAgICAgU0Nfbm9ybWFsaXplZjMoZzNbaV0pOwotICAgIH0KLSAgICAKLSAgICBmb3IgKGkgPSBCLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGsgPSBwW2ldOwotICAgICAgICBwW2ldID0gcFtqID0gcmFuZCgpICUgQl07Ci0gICAgICAgIHBbal0gPSBrOwotICAgIH0KLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgQiArIDI7IGkrKykgewotICAgICAgICBwW0IgKyBpXSA9IHBbaV07Ci0gICAgICAgIGcxW0IgKyBpXSA9IGcxW2ldOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgICAgICAgICAgZzJbQiArIGldW2pdID0gZzJbaV1bal07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCi0gICAgICAgICAgICBnM1tCICsgaV1bal0gPSBnM1tpXVtqXTsKLSAgICB9Ci19Ci0KLWZsb2F0IFNDX25vaXNlZihmbG9hdCB4KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MTsKLSAgICBmbG9hdCByeDAsIHJ4MSwgc3gsIHQsIHUsIHY7Ci0gICAgCi0gICAgaWYgKG5vaXNlX3N0YXJ0KSB7Ci0gICAgICAgIG5vaXNlX3N0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIG5vaXNlX2luaXQoKTsKLSAgICB9Ci0gICAgCi0gICAgdCA9IHggKyBOOwotICAgIGJ4MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYngxID0gKGJ4MCsxKSAmIEJNOwotICAgIHJ4MCA9IHQgLSAoaW50KXQ7Ci0gICAgcngxID0gcngwIC0gMS4wZjsKLSAgICAKLSAgICBzeCA9IG5vaXNlX3NDdXJ2ZShyeDApOwotICAgIAotICAgIHUgPSByeDAgKiBnMVtwW2J4MF1dOwotICAgIHYgPSByeDEgKiBnMVtwW2J4MV1dOwotICAgIHJldHVybiAyLjNmICogbGVycGYodSwgdiwgc3gpOwotfQotCi1mbG9hdCBTQ19ub2lzZWYyKGZsb2F0IHgsIGZsb2F0IHkpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgaW50IGJ4MCwgYngxLCBieTAsIGJ5MSwgYjAwLCBiMTAsIGIwMSwgYjExOwotICAgIGZsb2F0IHJ4MCwgcngxLCByeTAsIHJ5MSwgc3gsIHN5LCBhLCBiLCB0LCB1LCB2OwotICAgIGZsb2F0ICpxOwotICAgIGludCBpLCBqOwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0JCi0gICAgdCA9IHkgKyBOOwotICAgIGJ5MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYnkxID0gKGJ5MCsxKSAmIEJNOwotICAgIHJ5MCA9IHQgLSAoaW50KXQ7Ci0gICAgcnkxID0gcnkwIC0gMS4wZjsKLQkKLSAgICBpID0gcFtieDBdOwotICAgIGogPSBwW2J4MV07Ci0gICAgCi0gICAgYjAwID0gcFtpICsgYnkwXTsKLSAgICBiMTAgPSBwW2ogKyBieTBdOwotICAgIGIwMSA9IHBbaSArIGJ5MV07Ci0gICAgYjExID0gcFtqICsgYnkxXTsKLSAgICAKLSAgICBzeCA9IG5vaXNlX3NDdXJ2ZShyeDApOwotICAgIHN5ID0gbm9pc2Vfc0N1cnZlKHJ5MCk7Ci0gICAgCi0gICAgcSA9IGcyW2IwMF07IHUgPSByeDAgKiBxWzBdICsgcnkwICogcVsxXTsKLSAgICBxID0gZzJbYjEwXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTAgKiBxWzFdOwotICAgIGEgPSBsZXJwZih1LCB2LCBzeCk7Ci0gICAgCi0gICAgcSA9IGcyW2IwMV07IHUgPSByeDAgKiBxWzBdICsgcnkxICogcVsxXTsKLSAgICBxID0gZzJbYjExXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTEgKiBxWzFdOwotICAgIGIgPSBsZXJwZih1LCB2LCBzeCk7Ci0gICAgCi0gICAgcmV0dXJuIDEuNWYqbGVycGYoYSwgYiwgc3kpOwotfQotCi1mbG9hdCBTQ19ub2lzZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgaW50IGJ4MCwgYngxLCBieTAsIGJ5MSwgYnowLCBiejEsIGIwMCwgYjEwLCBiMDEsIGIxMTsKLSAgICBmbG9hdCByeDAsIHJ4MSwgcnkwLCByeTEsIHJ6MCwgcnoxLCBzeSwgc3osIGEsIGIsIGMsIGQsIHQsIHUsIHY7Ci0gICAgZmxvYXQgKnE7Ci0gICAgaW50IGksIGo7Ci0gICAgCi0gICAgaWYgKG5vaXNlX3N0YXJ0KSB7Ci0gICAgICAgIG5vaXNlX3N0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIG5vaXNlX2luaXQoKTsKLSAgICB9Ci0gICAgCi0gICAgdCA9IHggKyBOOwotICAgIGJ4MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYngxID0gKGJ4MCsxKSAmIEJNOwotICAgIHJ4MCA9IHQgLSAoaW50KXQ7Ci0gICAgcngxID0gcngwIC0gMS4wZjsKLSAgICAKLSAgICB0ID0geSArIE47Ci0gICAgYnkwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieTEgPSAoYnkwKzEpICYgQk07Ci0gICAgcnkwID0gdCAtIChpbnQpdDsKLSAgICByeTEgPSByeTAgLSAxLjBmOwotCQotICAgIHQgPSB6ICsgTjsKLSAgICBiejAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ6MSA9IChiejArMSkgJiBCTTsKLSAgICByejAgPSB0IC0gKGludCl0OwotICAgIHJ6MSA9IHJ6MCAtIDEuMGY7Ci0JCi0gICAgaSA9IHBbYngwXTsKLSAgICBqID0gcFtieDFdOwotICAgIAotICAgIGIwMCA9IHBbaSArIGJ5MF07Ci0gICAgYjEwID0gcFtqICsgYnkwXTsKLSAgICBiMDEgPSBwW2kgKyBieTFdOwotICAgIGIxMSA9IHBbaiArIGJ5MV07Ci0gICAgCi0gICAgdCAgPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICBzeSA9IG5vaXNlX3NDdXJ2ZShyeTApOwotICAgIHN6ID0gbm9pc2Vfc0N1cnZlKHJ6MCk7Ci0gICAgCi0gICAgcSA9IGczW2IwMCArIGJ6MF07IHUgPSByeDAgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgcSA9IGczW2IxMCArIGJ6MF07IHYgPSByeDEgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgYSA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIHEgPSBnM1tiMDEgKyBiejBdOyB1ID0gcngwICogcVswXSArIHJ5MSAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIHEgPSBnM1tiMTEgKyBiejBdOyB2ID0gcngxICogcVswXSArIHJ5MSAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIGIgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBjID0gbGVycGYoYSwgYiwgc3kpOwotICAgIAotICAgIHEgPSBnM1tiMDAgKyBiejFdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIHEgPSBnM1tiMTAgKyBiejFdOyB2ID0gcngxICogcVswXSArIHJ5MCAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIGEgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBxID0gZzNbYjAxICsgYnoxXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBxID0gZzNbYjExICsgYnoxXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBiID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgZCA9IGxlcnBmKGEsIGIsIHN5KTsKLSAgICAKLSAgICByZXR1cm4gMS41ZipsZXJwZihjLCBkLCBzeik7Ci19Ci0KLWZsb2F0IFNDX3R1cmJ1bGVuY2VmMihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBvY3RhdmVzKQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGZsb2F0IHQgPSAwLjBmOwotICAgIAotICAgIGZvciAoZmxvYXQgZiA9IDEuMGY7IGYgPD0gb2N0YXZlczsgZiAqPSAyKQotICAgICAgICB0ICs9IGZhYnMoU0Nfbm9pc2VmMihmICogeCwgZiAqIHkpKSAvIGY7Ci0gICAgcmV0dXJuIHQ7Ci19Ci0KLWZsb2F0IFNDX3R1cmJ1bGVuY2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCBvY3RhdmVzKQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGZsb2F0IHQgPSAwLjBmOwotICAgIAotICAgIGZvciAoZmxvYXQgZiA9IDEuMGY7IGYgPD0gb2N0YXZlczsgZiAqPSAyKQotICAgICAgICB0ICs9IGZhYnMoU0Nfbm9pc2VmMyhmICogeCwgZiAqIHksIGYgKiB6KSkgLyBmOwotICAgIHJldHVybiB0OwotfQotCi19Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTm9pc2UuaCBiL2xpYnMvcnMvcnNOb2lzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQwNzUxLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNOb2lzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9SU19OT0lTRV9ICi0jZGVmaW5lIEFORFJPSURfUlNfTk9JU0VfSAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi12b2lkIFNDX25vcm1hbGl6ZWYyKGZsb2F0IHZbXSk7Ci12b2lkIFNDX25vcm1hbGl6ZWYzKGZsb2F0IHZbXSk7Ci1mbG9hdCBTQ19ub2lzZWYoZmxvYXQgeCk7Ci1mbG9hdCBTQ19ub2lzZWYyKGZsb2F0IHgsIGZsb2F0IHkpOwotZmxvYXQgU0Nfbm9pc2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLWZsb2F0IFNDX3R1cmJ1bGVuY2VmMihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBvY3RhdmVzKTsKLWZsb2F0IFNDX3R1cmJ1bGVuY2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCBvY3RhdmVzKTsKLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcCBiL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcAppbmRleCA2Nzc0MTNlLi5mNjljYjE1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAKKysrIGIvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwCkBAIC0xNSw3ICsxNSwxMiBAQAogICovCiAKICNpbmNsdWRlICJyc09iamVjdEJhc2UuaCIKKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMjQsNyArMjksNiBAQAogewogICAgIG1Vc2VyUmVmQ291bnQgPSAwOwogICAgIG1TeXNSZWZDb3VudCA9IDA7Ci0gICAgbU5hbWUgPSBOVUxMOwogICAgIG1SU0MgPSBOVUxMOwogICAgIG1OZXh0ID0gTlVMTDsKICAgICBtUHJldiA9IE5VTEw7CkBAIC0zOSwxNCArNDMsMTMgQEAKICAgICByc0Fzc2VydCghbVVzZXJSZWZDb3VudCk7CiAgICAgcnNBc3NlcnQoIW1TeXNSZWZDb3VudCk7CiAgICAgcmVtb3ZlKCk7Ci0gICAgZGVsZXRlW10gbU5hbWU7CiB9CiAKIHZvaWQgT2JqZWN0QmFzZTo6ZHVtcExPR1YoY29uc3QgY2hhciAqb3ApIGNvbnN0CiB7Ci0gICAgaWYgKG1OYW1lKSB7CisgICAgaWYgKG1OYW1lLnNpemUoKSkgewogICAgICAgICBMT0dWKCIlcyBSU29iaiAlcCwgbmFtZSAlcywgcmVmcyAlaSwlaSAgZnJvbSAlcywlaSBsaW5rcyAlcCwlcCwlcCIsCi0gICAgICAgICAgICAgb3AsIHRoaXMsIG1OYW1lLCBtVXNlclJlZkNvdW50LCBtU3lzUmVmQ291bnQsIG1BbGxvY0ZpbGUsIG1BbGxvY0xpbmUsIG1OZXh0LCBtUHJldiwgbVJTQyk7CisgICAgICAgICAgICAgb3AsIHRoaXMsIG1OYW1lLnN0cmluZygpLCBtVXNlclJlZkNvdW50LCBtU3lzUmVmQ291bnQsIG1BbGxvY0ZpbGUsIG1BbGxvY0xpbmUsIG1OZXh0LCBtUHJldiwgbVJTQyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HVigiJXMgUlNvYmogJXAsIG5vLW5hbWUsIHJlZnMgJWksJWkgIGZyb20gJXMsJWkgbGlua3MgJXAsJXAsJXAiLAogICAgICAgICAgICAgIG9wLCB0aGlzLCBtVXNlclJlZkNvdW50LCBtU3lzUmVmQ291bnQsIG1BbGxvY0ZpbGUsIG1BbGxvY0xpbmUsIG1OZXh0LCBtUHJldiwgbVJTQyk7CkBAIC01OCw2ICs2MSw3IEBACiAgICAgaWYgKG1SU0MpIHsKICAgICAgICAgcmVtb3ZlKCk7CiAgICAgfQorICAgIHJzQXNzZXJ0KHJzYyk7CiAgICAgbVJTQyA9IHJzYzsKICAgICBpZiAocnNjKSB7CiAgICAgICAgIGFkZCgpOwpAQCAtMTEzLDE4ICsxMTcsMTIgQEAKIAogdm9pZCBPYmplY3RCYXNlOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgc2V0TmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOworICAgIG1OYW1lLnNldFRvKG5hbWUpOwogfQogCiB2b2lkIE9iamVjdEJhc2U6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKQogewotICAgIGRlbGV0ZSBtTmFtZTsKLSAgICBtTmFtZSA9IE5VTEw7Ci0gICAgaWYgKG5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBuZXcgY2hhcltsZW4gKyAxXTsKLSAgICAgICAgbWVtY3B5KG1OYW1lLCBuYW1lLCBsZW4pOwotICAgICAgICBtTmFtZVtsZW5dID0gMDsKLSAgICB9CisgICAgbU5hbWUuc2V0VG8obmFtZSwgbGVuKTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjphZGQoKSBjb25zdApAQCAtMTk3LDMgKzE5NSwxNSBAQAogICAgIH0KIH0KIAorYm9vbCBPYmplY3RCYXNlOjppc1ZhbGlkKGNvbnN0IENvbnRleHQgKnJzYywgY29uc3QgT2JqZWN0QmFzZSAqb2JqKQoreworICAgIGNvbnN0IE9iamVjdEJhc2UgKiBvID0gcnNjLT5tT2JqSGVhZDsKKyAgICB3aGlsZSAobykgeworICAgICAgICBpZiAobyA9PSBvYmopIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIG8gPSBvLT5tTmV4dDsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzT2JqZWN0QmFzZS5oIGIvbGlicy9ycy9yc09iamVjdEJhc2UuaAppbmRleCBiYjAzYjg3Li41OWZiNGE2IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzT2JqZWN0QmFzZS5oCisrKyBiL2xpYnMvcnMvcnNPYmplY3RCYXNlLmgKQEAgLTI0LDYgKzI0LDcgQEAKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCiBjbGFzcyBDb250ZXh0OworY2xhc3MgT1N0cmVhbTsKIAogLy8gQW4gZWxlbWVudCBpcyBhIGdyb3VwIG9mIENvbXBvbmVudHMgdGhhdCBvY2N1cGllcyBvbmUgY2VsbCBpbiBhIHN0cnVjdHVyZS4KIGNsYXNzIE9iamVjdEJhc2UKQEAgLTQwLDcgKzQxLDcgQEAKICAgICBib29sIHplcm9Vc2VyUmVmKCkgY29uc3Q7CiAKICAgICBjb25zdCBjaGFyICogZ2V0TmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOworICAgICAgICByZXR1cm4gbU5hbWUuc3RyaW5nKCk7CiAgICAgfQogICAgIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyICopOwogICAgIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyICosIHVpbnQzMl90IGxlbik7CkBAIC01Miw2ICs1MywxMCBAQAogICAgIHN0YXRpYyB2b2lkIGR1bXBBbGwoQ29udGV4dCAqcnNjKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0ID0gMDsKKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQ29udGV4dCAqcnNjLCBjb25zdCBPYmplY3RCYXNlICpvYmopOwogCiBwcm90ZWN0ZWQ6CiAgICAgY29uc3QgY2hhciAqbUFsbG9jRmlsZTsKQEAgLTY0LDcgKzY5LDcgQEAKIAogICAgIGJvb2wgY2hlY2tEZWxldGUoKSBjb25zdDsKIAotICAgIGNoYXIgKiBtTmFtZTsKKyAgICBTdHJpbmc4IG1OYW1lOwogICAgIG11dGFibGUgaW50MzJfdCBtU3lzUmVmQ291bnQ7CiAgICAgbXV0YWJsZSBpbnQzMl90IG1Vc2VyUmVmQ291bnQ7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtLmNwcAppbmRleCA3MGUyODY4Li4xMGUwMGU2IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbS5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW0uY3BwCkBAIC0xNCwxNiArMTQsMjEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgotCiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsZXh0Lmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKKyNpbmNsdWRlICJyc1Byb2dyYW0uaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwogCi0KIFByb2dyYW06OlByb2dyYW0oQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKQEAgLTMyLDcgKzM3LDEwIEBACiAgICAgbVNoYWRlcklEID0gMDsKICAgICBtQXR0cmliQ291bnQgPSAwOwogICAgIG1Vbmlmb3JtQ291bnQgPSAwOworICAgIG1UZXh0dXJlQ291bnQgPSAwOwogCisgICAgbVRleHR1cmVzID0gTlVMTDsKKyAgICBtU2FtcGxlcnMgPSBOVUxMOwogICAgIG1JbnB1dEVsZW1lbnRzID0gTlVMTDsKICAgICBtT3V0cHV0RWxlbWVudHMgPSBOVUxMOwogICAgIG1Db25zdGFudFR5cGVzID0gTlVMTDsKQEAgLTQwLDYgKzQ4LDcgQEAKICAgICBtT3V0cHV0Q291bnQgPSAwOwogICAgIG1Db25zdGFudENvdW50ID0gMDsKICAgICBtSXNWYWxpZCA9IGZhbHNlOworICAgIG1Jc0ludGVybmFsID0gZmFsc2U7CiB9CiAKIFByb2dyYW06OlByb2dyYW0oQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwgdWludDMyX3Qgc2hhZGVyTGVuZ3RoLApAQCAtNzMsNiArODIsOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgbVRleHR1cmVzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bbVRleHR1cmVDb3VudF07CisgICAgbVNhbXBsZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8U2FtcGxlcj5bbVRleHR1cmVDb3VudF07CiAgICAgbUlucHV0RWxlbWVudHMgPSBuZXcgT2JqZWN0QmFzZVJlZjxFbGVtZW50PlttSW5wdXRDb3VudF07CiAgICAgbU91dHB1dEVsZW1lbnRzID0gbmV3IE9iamVjdEJhc2VSZWY8RWxlbWVudD5bbU91dHB1dENvdW50XTsKICAgICBtQ29uc3RhbnRUeXBlcyA9IG5ldyBPYmplY3RCYXNlUmVmPFR5cGU+W21Db25zdGFudENvdW50XTsKQEAgLTkxLDE1ICsxMDIsMzcgQEAKICAgICAgICAgICAgIG1Db25zdGFudFR5cGVzW2NvbnN0YW50KytdLnNldChyZWludGVycHJldF9jYXN0PFR5cGUgKj4ocGFyYW1zW2N0KzFdKSk7CiAgICAgICAgIH0KICAgICB9CisgICAgbUlzSW50ZXJuYWwgPSBmYWxzZTsKKyAgICB1aW50MzJfdCBpbnRlcm5hbFRva2VuTGVuID0gc3RybGVuKFJTX1NIQURFUl9JTlRFUk5BTCk7CisgICAgaWYoc2hhZGVyTGVuZ3RoID4gaW50ZXJuYWxUb2tlbkxlbiAmJgorICAgICAgIHN0cm5jbXAoUlNfU0hBREVSX0lOVEVSTkFMLCBzaGFkZXJUZXh0LCBpbnRlcm5hbFRva2VuTGVuKSA9PSAwKSB7CisgICAgICAgIG1Jc0ludGVybmFsID0gdHJ1ZTsKKyAgICAgICAgc2hhZGVyVGV4dCArPSBpbnRlcm5hbFRva2VuTGVuOworICAgICAgICBzaGFkZXJMZW5ndGggLT0gaW50ZXJuYWxUb2tlbkxlbjsKKyAgICB9CiAgICAgbVVzZXJTaGFkZXIuc2V0VG8oc2hhZGVyVGV4dCwgc2hhZGVyTGVuZ3RoKTsKIH0KIAogUHJvZ3JhbTo6flByb2dyYW0oKQogewotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBNQVhfVU5JRk9STVM7IGN0KyspIHsKLSAgICAgICAgYmluZEFsbG9jYXRpb24oTlVMTCwgY3QpOworICAgIGlmKG1SU0MtPnByb3BzLm1Mb2dTaGFkZXJzKSB7CisgICAgICAgIExPR1YoIlByb2dyYW06On5Qcm9ncmFtIHdpdGggc2hhZGVyIGlkICV1IiwgbVNoYWRlcklEKTsKICAgICB9CiAKKyAgICBpZihtU2hhZGVySUQpIHsKKyAgICAgICAgZ2xEZWxldGVTaGFkZXIobVNoYWRlcklEKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1VOSUZPUk1TOyBjdCsrKSB7CisgICAgICAgIGJpbmRBbGxvY2F0aW9uKE5VTEwsIE5VTEwsIGN0KTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVRleHR1cmVDb3VudDsgY3QrKykgeworICAgICAgICBiaW5kVGV4dHVyZShOVUxMLCBjdCwgTlVMTCk7CisgICAgICAgIGJpbmRTYW1wbGVyKE5VTEwsIGN0LCBOVUxMKTsKKyAgICB9CisgICAgZGVsZXRlW10gbVRleHR1cmVzOworICAgIGRlbGV0ZVtdIG1TYW1wbGVyczsKICAgICBkZWxldGVbXSBtSW5wdXRFbGVtZW50czsKICAgICBkZWxldGVbXSBtT3V0cHV0RWxlbWVudHM7CiAgICAgZGVsZXRlW10gbUNvbnN0YW50VHlwZXM7CkBAIC0xMDksOCArMTQyLDIyIEBACiB9CiAKIAotdm9pZCBQcm9ncmFtOjpiaW5kQWxsb2NhdGlvbihBbGxvY2F0aW9uICphbGxvYywgdWludDMyX3Qgc2xvdCkKK3ZvaWQgUHJvZ3JhbTo6YmluZEFsbG9jYXRpb24oQ29udGV4dCAqcnNjLCBBbGxvY2F0aW9uICphbGxvYywgdWludDMyX3Qgc2xvdCkKIHsKKyAgICBpZiAoYWxsb2MgIT0gTlVMTCkgeworICAgICAgICBpZiAoc2xvdCA+PSBtQ29uc3RhbnRDb3VudCkgeworICAgICAgICAgICAgTE9HRSgiQXR0ZW1wdCB0byBiaW5kIGFsbG9jIGF0IHNsb3QgJXUsIG9uIHNoYWRlciBpZCAldSwgYnV0IGNvbnN0IGNvdW50IGlzICV1IiwKKyAgICAgICAgICAgICAgICAgc2xvdCwgKHVpbnQzMl90KXRoaXMsIG1Db25zdGFudENvdW50KTsKKyAgICAgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NIQURFUiwgIkNhbm5vdCBiaW5kIGFsbG9jYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFsbG9jLT5nZXRUeXBlKCktPmlzRXF1YWwobUNvbnN0YW50VHlwZXNbc2xvdF0uZ2V0KCkpKSB7CisgICAgICAgICAgICBMT0dFKCJBdHRlbXB0IHRvIGJpbmQgYWxsb2MgYXQgc2xvdCAldSwgb24gc2hhZGVyIGlkICV1LCBidXQgdHlwZXMgbWlzbWF0Y2giLAorICAgICAgICAgICAgICAgICBzbG90LCAodWludDMyX3QpdGhpcyk7CisgICAgICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJDYW5ub3QgYmluZCBhbGxvY2F0aW9uIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CiAgICAgaWYgKG1Db25zdGFudHNbc2xvdF0uZ2V0KCkgPT0gYWxsb2MpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEyNCwxMCArMTcxLDExIEBACiAgICAgbURpcnR5ID0gdHJ1ZTsKIH0KIAotdm9pZCBQcm9ncmFtOjpiaW5kVGV4dHVyZSh1aW50MzJfdCBzbG90LCBBbGxvY2F0aW9uICphKQordm9pZCBQcm9ncmFtOjpiaW5kVGV4dHVyZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHNsb3QsIEFsbG9jYXRpb24gKmEpCiB7Ci0gICAgaWYgKHNsb3QgPj0gTUFYX1RFWFRVUkUpIHsKLSAgICAgICAgTE9HRSgiQXR0ZW1wdCB0byBiaW5kIGEgdGV4dHVyZSB0byBhIHNsb3QgPiBNQVhfVEVYVFVSRSIpOworICAgIGlmIChzbG90ID49IG1UZXh0dXJlQ291bnQpIHsKKyAgICAgICAgTE9HRSgiQXR0ZW1wdCB0byBiaW5kIHRleHR1cmUgdG8gc2xvdCAldSBidXQgdGV4IGNvdW50IGlzICV1Iiwgc2xvdCwgbVRleHR1cmVDb3VudCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NIQURFUiwgIkNhbm5vdCBiaW5kIHRleHR1cmUiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTM2LDEwICsxODQsMTEgQEAKICAgICBtRGlydHkgPSB0cnVlOwogfQogCi12b2lkIFByb2dyYW06OmJpbmRTYW1wbGVyKHVpbnQzMl90IHNsb3QsIFNhbXBsZXIgKnMpCit2b2lkIFByb2dyYW06OmJpbmRTYW1wbGVyKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgU2FtcGxlciAqcykKIHsKLSAgICBpZiAoc2xvdCA+PSBNQVhfVEVYVFVSRSkgewotICAgICAgICBMT0dFKCJBdHRlbXB0IHRvIGJpbmQgYSBTYW1wbGVyIHRvIGEgc2xvdCA+IE1BWF9URVhUVVJFIik7CisgICAgaWYgKHNsb3QgPj0gbVRleHR1cmVDb3VudCkgeworICAgICAgICBMT0dFKCJBdHRlbXB0IHRvIGJpbmQgc2FtcGxlciB0byBzbG90ICV1IGJ1dCB0ZXggY291bnQgaXMgJXUiLCBzbG90LCBtVGV4dHVyZUNvdW50KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiQ2Fubm90IGJpbmQgc2FtcGxlciIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yMzUsNyArMjg0LDE1OSBAQAogICAgIG1Vc2VyU2hhZGVyLnNldFRvKHR4dCwgbGVuKTsKIH0KIAordm9pZCBQcm9ncmFtOjphcHBlbmRVc2VyQ29uc3RhbnRzKCkgeworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgeworICAgICAgICBjb25zdCBFbGVtZW50ICplID0gbUNvbnN0YW50VHlwZXNbY3RdLT5nZXRFbGVtZW50KCk7CisgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmYgPSBlLT5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmbiA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CiAKKyAgICAgICAgICAgIGlmIChmblswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2Fubm90IGJlIGNvbXBsZXgKKyAgICAgICAgICAgIHJzQXNzZXJ0KCFmLT5nZXRGaWVsZENvdW50KCkpOworICAgICAgICAgICAgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzRYNCkgeworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIG1hdDQgVU5JXyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihmLT5nZXRUeXBlKCkgPT0gUlNfVFlQRV9NQVRSSVhfM1gzKSB7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gbWF0MyBVTklfIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGYtPmdldFR5cGUoKSA9PSBSU19UWVBFX01BVFJJWF8yWDIpIHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQyIFVOSV8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaChmLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIGZsb2F0IFVOSV8iKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMyIFVOSV8iKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMzIFVOSV8iKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWM0IFVOSV8iKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChmbik7CisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbTo6c2V0dXBVc2VyQ29uc3RhbnRzKENvbnRleHQgKnJzYywgU2hhZGVyQ2FjaGUgKnNjLCBib29sIGlzRnJhZ21lbnQpIHsKKyAgICB1aW50MzJfdCB1aWR4ID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKKyAgICAgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBtQ29uc3RhbnRzW2N0XS5nZXQoKTsKKyAgICAgICAgaWYgKCFhbGxvYykgeworICAgICAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBzZXQgY29uc3RhbnRzIG9uIHNoYWRlciBpZCAldSwgYnV0IGFsbG9jIGF0IHNsb3QgJXUgaXMgbm90IHNldCIsICh1aW50MzJfdCl0aGlzLCBjdCk7CisgICAgICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJObyBjb25zdGFudCBhbGxvY2F0aW9uIGJvdW5kIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KGFsbG9jLT5nZXRQdHIoKSk7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgeworICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpZWxkTmFtZSA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGZpZWxkIGlzIHBhZGRpbmcsIHNraXAgaXQKKyAgICAgICAgICAgIGlmKGZpZWxkTmFtZVswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gZS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhmaWVsZCk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqZmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZkYXRhW29mZnNldF0pOworCisgICAgICAgICAgICBpbnQzMl90IHNsb3QgPSAtMTsKKyAgICAgICAgICAgIGlmKCFpc0ZyYWdtZW50KSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IHNjLT52dHhVbmlmb3JtU2xvdCh1aWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHNsb3QgPSBzYy0+ZnJhZ1VuaWZvcm1TbG90KHVpZHgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dTaGFkZXJzVW5pZm9ybXMpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJVbmlmb3JtICBzbG90PSVpLCBvZmZzZXQ9JWksIGNvbnN0YW50PSVpLCBmaWVsZD0laSwgdWlkeD0laSwgbmFtZT0lcyIsIHNsb3QsIG9mZnNldCwgY3QsIGZpZWxkLCB1aWR4LCBmaWVsZE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNsb3QgPj0gMCkgeworICAgICAgICAgICAgICAgIGlmKGYtPmdldFR5cGUoKSA9PSBSU19UWVBFX01BVFJJWF80WDQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocnNjLT5wcm9wcy5tTG9nU2hhZGVyc1VuaWZvcm1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJNYXRyaXg0eDQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoInslZiwgJWYsICVmLCAlZiIsICBmZFswXSwgZmRbNF0sIGZkWzhdLCBmZFsxMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiICVmLCAlZiwgJWYsICVmIiwgIGZkWzFdLCBmZFs1XSwgZmRbOV0sIGZkWzEzXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCIgJWYsICVmLCAlZiwgJWYiLCAgZmRbMl0sIGZkWzZdLCBmZFsxMF0sIGZkWzE0XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCIgJWYsICVmLCAlZiwgJWZ9IiwgZmRbM10sIGZkWzddLCBmZFsxMV0sIGZkWzE1XSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHNsb3QsIDEsIEdMX0ZBTFNFLCBmZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzNYMykgeworICAgICAgICAgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dTaGFkZXJzVW5pZm9ybXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIk1hdHJpeDN4MyIpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigieyVmLCAlZiwgJWYiLCAgZmRbMF0sIGZkWzNdLCBmZFs2XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCIgJWYsICVmLCAlZiIsICBmZFsxXSwgZmRbNF0sIGZkWzddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIiAlZiwgJWYsICVmfSIsIGZkWzJdLCBmZFs1XSwgZmRbOF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybU1hdHJpeDNmdihzbG90LCAxLCBHTF9GQUxTRSwgZmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGYtPmdldFR5cGUoKSA9PSBSU19UWVBFX01BVFJJWF8yWDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocnNjLT5wcm9wcy5tTG9nU2hhZGVyc1VuaWZvcm1zKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIk1hdHJpeDJ4MiIpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigieyVmLCAlZiIsICBmZFswXSwgZmRbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiICVmLCAlZn0iLCBmZFsxXSwgZmRbM10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybU1hdHJpeDJmdihzbG90LCAxLCBHTF9GQUxTRSwgZmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGYtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dTaGFkZXJzVW5pZm9ybXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJVbmlmb3JtIDEgPSAlZiIsIGZkWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTFmdihzbG90LCAxLCBmZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYocnNjLT5wcm9wcy5tTG9nU2hhZGVyc1VuaWZvcm1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiVW5pZm9ybSAyID0gJWYgJWYiLCBmZFswXSwgZmRbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMmZ2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dTaGFkZXJzVW5pZm9ybXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJVbmlmb3JtIDMgPSAlZiAlZiAlZiIsIGZkWzBdLCBmZFsxXSwgZmRbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtM2Z2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dTaGFkZXJzVW5pZm9ybXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJVbmlmb3JtIDQgPSAlZiAlZiAlZiAlZiIsIGZkWzBdLCBmZFsxXSwgZmRbMl0sIGZkWzNdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTRmdihzbG90LCAxLCBmZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdWlkeCArKzsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBQcm9ncmFtOjppbml0QWRkVXNlckVsZW1lbnQoY29uc3QgRWxlbWVudCAqZSwgU3RyaW5nOCAqbmFtZXMsIHVpbnQzMl90ICpjb3VudCwgY29uc3QgY2hhciAqcHJlZml4KQoreworICAgIHJzQXNzZXJ0KGUtPmdldEZpZWxkQ291bnQoKSk7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGUtPmdldEZpZWxkQ291bnQoKTsgY3QrKykgeworICAgICAgICBjb25zdCBFbGVtZW50ICpjZSA9IGUtPmdldEZpZWxkKGN0KTsKKyAgICAgICAgaWYgKGNlLT5nZXRGaWVsZENvdW50KCkpIHsKKyAgICAgICAgICAgIGluaXRBZGRVc2VyRWxlbWVudChjZSwgbmFtZXMsIGNvdW50LCBwcmVmaXgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoZS0+Z2V0RmllbGROYW1lKGN0KVswXSAhPSAnIycpIHsKKyAgICAgICAgICAgIFN0cmluZzggdG1wKHByZWZpeCk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShjdCkpOworICAgICAgICAgICAgbmFtZXNbKmNvdW50XS5zZXRUbyh0bXAuc3RyaW5nKCkpOworICAgICAgICAgICAgKCpjb3VudCkrKzsKKyAgICAgICAgfQorICAgIH0KK30KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CkBAIC0yNDQsMTkgKzQ0NSwxOSBAQAogdm9pZCByc2lfUHJvZ3JhbUJpbmRDb25zdGFudHMoQ29udGV4dCAqcnNjLCBSc1Byb2dyYW0gdnAsIHVpbnQzMl90IHNsb3QsIFJzQWxsb2NhdGlvbiBjb25zdGFudHMpCiB7CiAgICAgUHJvZ3JhbSAqcCA9IHN0YXRpY19jYXN0PFByb2dyYW0gKj4odnApOwotICAgIHAtPmJpbmRBbGxvY2F0aW9uKHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4oY29uc3RhbnRzKSwgc2xvdCk7CisgICAgcC0+YmluZEFsbG9jYXRpb24ocnNjLCBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KGNvbnN0YW50cyksIHNsb3QpOwogfQogCiB2b2lkIHJzaV9Qcm9ncmFtQmluZFRleHR1cmUoQ29udGV4dCAqcnNjLCBSc1Byb2dyYW0gdnBmLCB1aW50MzJfdCBzbG90LCBSc0FsbG9jYXRpb24gYSkKIHsKICAgICBQcm9ncmFtICpwID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbSAqPih2cGYpOwotICAgIHAtPmJpbmRUZXh0dXJlKHNsb3QsIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4oYSkpOworICAgIHAtPmJpbmRUZXh0dXJlKHJzYywgc2xvdCwgc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPihhKSk7CiB9CiAKIHZvaWQgcnNpX1Byb2dyYW1CaW5kU2FtcGxlcihDb250ZXh0ICpyc2MsIFJzUHJvZ3JhbSB2cGYsIHVpbnQzMl90IHNsb3QsIFJzU2FtcGxlciBzKQogewogICAgIFByb2dyYW0gKnAgPSBzdGF0aWNfY2FzdDxQcm9ncmFtICo+KHZwZik7Ci0gICAgcC0+YmluZFNhbXBsZXIoc2xvdCwgc3RhdGljX2Nhc3Q8U2FtcGxlciAqPihzKSk7CisgICAgcC0+YmluZFNhbXBsZXIocnNjLCBzbG90LCBzdGF0aWNfY2FzdDxTYW1wbGVyICo+KHMpKTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW0uaCBiL2xpYnMvcnMvcnNQcm9ncmFtLmgKaW5kZXggODZmODVmYi4uYzkzMDMzYiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW0uaAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbS5oCkBAIC0yMywyOSArMjMsMzAgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLQogY2xhc3MgU2hhZGVyQ2FjaGU7CiAKKyNkZWZpbmUgUlNfU0hBREVSX0lOVEVSTkFMICIvL3JzX3NoYWRlcl9pbnRlcm5hbFxuIgorI2RlZmluZSBSU19TSEFERVJfQVRUUiAiQVRUUklCXyIKKyNkZWZpbmUgUlNfU0hBREVSX1VOSSAiVU5JXyIKKwogY2xhc3MgUHJvZ3JhbSA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CiBwdWJsaWM6CiAgICAgY29uc3Qgc3RhdGljIHVpbnQzMl90IE1BWF9BVFRSSUJTID0gODsKICAgICBjb25zdCBzdGF0aWMgdWludDMyX3QgTUFYX1VOSUZPUk1TID0gMTY7Ci0gICAgY29uc3Qgc3RhdGljIHVpbnQzMl90IE1BWF9URVhUVVJFID0gMjsKIAogICAgIFByb2dyYW0oQ29udGV4dCAqKTsKICAgICBQcm9ncmFtKENvbnRleHQgKiwgY29uc3QgY2hhciAqIHNoYWRlclRleHQsIHVpbnQzMl90IHNoYWRlckxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKiBwYXJhbXMsIHVpbnQzMl90IHBhcmFtTGVuZ3RoKTsKICAgICB2aXJ0dWFsIH5Qcm9ncmFtKCk7CiAKLSAgICB2b2lkIGJpbmRBbGxvY2F0aW9uKEFsbG9jYXRpb24gKiwgdWludDMyX3Qgc2xvdCk7CisgICAgdm9pZCBiaW5kQWxsb2NhdGlvbihDb250ZXh0ICosIEFsbG9jYXRpb24gKiwgdWludDMyX3Qgc2xvdCk7CiAgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVNoYWRlcigpOwogCi0gICAgYm9vbCBpc1VzZXJQcm9ncmFtKCkgY29uc3Qge3JldHVybiBtVXNlclNoYWRlci5zaXplKCkgPiAwO30KKyAgICBib29sIGlzVXNlclByb2dyYW0oKSBjb25zdCB7cmV0dXJuICFtSXNJbnRlcm5hbDt9CiAKLSAgICB2b2lkIGJpbmRUZXh0dXJlKHVpbnQzMl90IHNsb3QsIEFsbG9jYXRpb24gKik7Ci0gICAgdm9pZCBiaW5kU2FtcGxlcih1aW50MzJfdCBzbG90LCBTYW1wbGVyICopOworICAgIHZvaWQgYmluZFRleHR1cmUoQ29udGV4dCAqLCB1aW50MzJfdCBzbG90LCBBbGxvY2F0aW9uICopOworICAgIHZvaWQgYmluZFNhbXBsZXIoQ29udGV4dCAqLCB1aW50MzJfdCBzbG90LCBTYW1wbGVyICopOwogCiAgICAgdWludDMyX3QgZ2V0U2hhZGVySUQoKSBjb25zdCB7cmV0dXJuIG1TaGFkZXJJRDt9CiAgICAgdm9pZCBzZXRTaGFkZXIoY29uc3QgY2hhciAqLCB1aW50MzJfdCBsZW4pOwpAQCAtNzEsNiArNzIsMTIgQEAKICAgICB1aW50MzJfdCBtT3V0cHV0Q291bnQ7CiAgICAgdWludDMyX3QgbUNvbnN0YW50Q291bnQ7CiAgICAgYm9vbCBtSXNWYWxpZDsKKyAgICBib29sIG1Jc0ludGVybmFsOworCisgICAgLy8gQXBwbGllcyB0byB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMgb25seQorICAgIHZvaWQgYXBwZW5kVXNlckNvbnN0YW50cygpOworICAgIHZvaWQgc2V0dXBVc2VyQ29uc3RhbnRzKENvbnRleHQgKnJzYywgU2hhZGVyQ2FjaGUgKnNjLCBib29sIGlzRnJhZ21lbnQpOworICAgIHZvaWQgaW5pdEFkZFVzZXJFbGVtZW50KGNvbnN0IEVsZW1lbnQgKmUsIFN0cmluZzggKm5hbWVzLCB1aW50MzJfdCAqY291bnQsIGNvbnN0IGNoYXIgKnByZWZpeCk7CiAKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1Db25zdGFudHNbTUFYX1VOSUZPUk1TXTsKIApAQCAtOTEsOCArOTgsOCBAQAogICAgIC8vIGFuZCBmaWx0ZXJlZC4KICAgICAvLwogICAgIC8vIENvbnN0YW50cyBhcmUgc3RyaWN0bHkgYWNjZXNzZWQgYnkgcHJvZ3JhbWV0aWMgbG9hZHMuCi0gICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtVGV4dHVyZXNbTUFYX1RFWFRVUkVdOwotICAgIE9iamVjdEJhc2VSZWY8U2FtcGxlcj4gbVNhbXBsZXJzW01BWF9URVhUVVJFXTsKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+ICptVGV4dHVyZXM7CisgICAgT2JqZWN0QmFzZVJlZjxTYW1wbGVyPiAqbVNhbXBsZXJzOwogCiAgICAgYm9vbCBsb2FkU2hhZGVyKENvbnRleHQgKiwgdWludDMyX3QgdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5jcHAKaW5kZXggYzE3Yjk0Yy4uODFiNGZhNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5jcHAKQEAgLTE0LDQyICsxNCwyMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKLQogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsZXh0Lmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKKyNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKLQotUHJvZ3JhbUZyYWdtZW50OjpQcm9ncmFtRnJhZ21lbnQoQ29udGV4dCAqcnNjLCBjb25zdCB1aW50MzJfdCAqIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtTGVuZ3RoKSA6Ci0gICAgUHJvZ3JhbShyc2MpCi17Ci0gICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwotICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICByc0Fzc2VydChwYXJhbUxlbmd0aCA9IDUpOwotCi0gICAgbUVudk1vZGVzWzBdID0gKFJzVGV4RW52TW9kZSlwYXJhbXNbMF07Ci0gICAgbVRleHR1cmVGb3JtYXRzWzBdID0gcGFyYW1zWzFdOwotICAgIG1FbnZNb2Rlc1sxXSA9IChSc1RleEVudk1vZGUpcGFyYW1zWzJdOwotICAgIG1UZXh0dXJlRm9ybWF0c1sxXSA9IHBhcmFtc1szXTsKLSAgICBtUG9pbnRTcHJpdGVFbmFibGUgPSBwYXJhbXNbNF0gIT0gMDsKLQotICAgIG1UZXh0dXJlRW5hYmxlTWFzayA9IDA7Ci0gICAgaWYgKG1FbnZNb2Rlc1swXSkgewotICAgICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgfD0gMTsKLSAgICB9Ci0gICAgaWYgKG1FbnZNb2Rlc1sxXSkgewotICAgICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgfD0gMjsKLSAgICB9Ci0gICAgaW5pdChyc2MpOwotfQotCiBQcm9ncmFtRnJhZ21lbnQ6OlByb2dyYW1GcmFnbWVudChDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKiBzaGFkZXJUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2hhZGVyTGVuZ3RoLCBjb25zdCB1aW50MzJfdCAqIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtTGVuZ3RoKSA6CkBAIC01OCwxMDAgKzM5LDY4IEBACiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKIAotICAgIGluaXQocnNjKTsKLSAgICBtVGV4dHVyZUVuYWJsZU1hc2sgPSAoMSA8PCBtVGV4dHVyZUNvdW50KSAtMTsKLX0KKyAgICBtQ29uc3RhbnRDb2xvclswXSA9IDEuZjsKKyAgICBtQ29uc3RhbnRDb2xvclsxXSA9IDEuZjsKKyAgICBtQ29uc3RhbnRDb2xvclsyXSA9IDEuZjsKKyAgICBtQ29uc3RhbnRDb2xvclszXSA9IDEuZjsKIAorICAgIGluaXQocnNjKTsKK30KIAogUHJvZ3JhbUZyYWdtZW50Ojp+UHJvZ3JhbUZyYWdtZW50KCkKIHsKKyAgICBpZihtU2hhZGVySUQpIHsKKyAgICAgICAgbVJTQy0+bVNoYWRlckNhY2hlLmNsZWFudXBGcmFnbWVudChtU2hhZGVySUQpOworICAgIH0KIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdGF0ZSAqc3RhdGUpCit2b2lkIFByb2dyYW1GcmFnbWVudDo6c2V0Q29uc3RhbnRDb2xvcihDb250ZXh0ICpyc2MsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCiB7CisgICAgaWYoaXNVc2VyUHJvZ3JhbSgpKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gc2V0IGZpeGVkIGZ1bmN0aW9uIGVtdWxhdGlvbiBjb2xvciBvbiB1c2VyIHByb2dyYW0iKTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiQ2Fubm90ICBzZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIGNvbG9yIG9uIHVzZXIgcHJvZ3JhbSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKG1Db25zdGFudHNbMF0uZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gc2V0IGZpeGVkIGZ1bmN0aW9uIGVtdWxhdGlvbiBjb2xvciBiZWNhdXNlIGFsbG9jYXRpb24gaXMgbWlzc2luZyIpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJVbmFibGUgdG8gc2V0IGZpeGVkIGZ1bmN0aW9uIGVtdWxhdGlvbiBjb2xvciBiZWNhdXNlIGFsbG9jYXRpb24gaXMgbWlzc2luZyIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Db25zdGFudENvbG9yWzBdID0gcjsKKyAgICBtQ29uc3RhbnRDb2xvclsxXSA9IGc7CisgICAgbUNvbnN0YW50Q29sb3JbMl0gPSBiOworICAgIG1Db25zdGFudENvbG9yWzNdID0gYTsKKyAgICBtZW1jcHkobUNvbnN0YW50c1swXS0+Z2V0UHRyKCksIG1Db25zdGFudENvbG9yLCA0KnNpemVvZihmbG9hdCkpOworICAgIG1EaXJ0eSA9IHRydWU7Cit9CisKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMihDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0YXRlICpzdGF0ZSwgU2hhZGVyQ2FjaGUgKnNjKQoreworICAgIC8vTE9HRSgic2dsMiBmcmFnMSAleCIsIGdsR2V0RXJyb3IoKSk7CiAgICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CiAKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1RFWFRVUkU7IGN0KyspIHsKLSAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwICsgY3QpOwotICAgICAgICBpZiAoIShtVGV4dHVyZUVuYWJsZU1hc2sgJiAoMSA8PCBjdCkpIHx8ICFtVGV4dHVyZXNbY3RdLmdldCgpKSB7Ci0gICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24xXzEoKSkgewotICAgICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZUVuYWJsZSkgewotICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfUE9JTlRfU1BSSVRFX09FUywgR0xfQ09PUkRfUkVQTEFDRV9PRVMsIG1Qb2ludFNwcml0ZUVuYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRleHR1cmVzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZXNbY3RdLT5nZXRUZXh0dXJlSUQoKSk7Ci0KLSAgICAgICAgc3dpdGNoKG1FbnZNb2Rlc1tjdF0pIHsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfTk9ORToKLSAgICAgICAgICAgIHJzQXNzZXJ0KDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX1JFUExBQ0U6Ci0gICAgICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX01PRFVMQVRFOgotICAgICAgICAgICAgZ2xUZXhFbnZmKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9NT0RVTEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfREVDQUw6Ci0gICAgICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0RFQ0FMKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TYW1wbGVyc1tjdF0uZ2V0KCkpIHsKLSAgICAgICAgICAgIG1TYW1wbGVyc1tjdF0tPnNldHVwR0wocnNjLCBtVGV4dHVyZXNbY3RdLT5nZXRUeXBlKCktPmdldElzTnAyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdyb3NzIGhhY2suCi0gICAgICAgIGlmIChjdCA9PSAyKSB7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0NPTUJJTkUpOwotCi0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX0NPTUJJTkVfUkdCLCBHTF9BREQpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMwX1JHQiwgR0xfUFJFVklPVVMpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMxX1JHQiwgR0xfVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQwX1JHQiwgR0xfU1JDX0NPTE9SKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDFfUkdCLCBHTF9TUkNfQ09MT1IpOwotCi0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX0NPTUJJTkVfQUxQSEEsIEdMX0FERCk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NSQzBfQUxQSEEsIEdMX1BSRVZJT1VTKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfU1JDMV9BTFBIQSwgR0xfVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQwX0FMUEhBLCBHTF9TUkNfQUxQSEEpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMV9BTFBIQSwgR0xfU1JDX0FMUEhBKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotICAgIG1EaXJ0eSA9IGZhbHNlOwotICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMIik7Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0YXRlICpzdGF0ZSwgU2hhZGVyQ2FjaGUgKnNjKQotewotCi0gICAgLy9MT0dFKCJzZ2wyIGZyYWcxICV4IiwgZ2xHZXRFcnJvcigpKTsKLSAgICBpZiAoKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSAmJiAhbURpcnR5KSB7Ci0gICAgICAgIC8vcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCiAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyIHN0YXJ0Iik7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IE1BWF9URVhUVVJFOyBjdCsrKSB7CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1GcmFnbWVudDo6c2V0dXBHTDIgYmVnaW4gdW5pZm9ybXMiKTsKKyAgICBzZXR1cFVzZXJDb25zdGFudHMocnNjLCBzYywgdHJ1ZSk7CisKKyAgICB1aW50MzJfdCBudW1UZXh0dXJlc1RvQmluZCA9IG1UZXh0dXJlQ291bnQ7CisgICAgdWludDMyX3QgbnVtVGV4dHVyZXNBdmFpbGFibGUgPSByc2MtPmdldE1heEZyYWdtZW50VGV4dHVyZXMoKTsKKyAgICBpZihudW1UZXh0dXJlc1RvQmluZCA+PSBudW1UZXh0dXJlc0F2YWlsYWJsZSkgeworICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIGJpbmQgJXUgdGV4dHVyZXMgb24gc2hhZGVyIGlkICV1LCBidXQgb25seSAldSBhcmUgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICBtVGV4dHVyZUNvdW50LCAodWludDMyX3QpdGhpcywgbnVtVGV4dHVyZXNBdmFpbGFibGUpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJDYW5ub3QgYmluZCBtb3JlIHRleHR1ZXJzIHRoYW4gYXZhaWxhYmxlIik7CisgICAgICAgIG51bVRleHR1cmVzVG9CaW5kID0gbnVtVGV4dHVyZXNBdmFpbGFibGU7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG51bVRleHR1cmVzVG9CaW5kOyBjdCsrKSB7CiAgICAgICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCArIGN0KTsKLSAgICAgICAgaWYgKCEobVRleHR1cmVFbmFibGVNYXNrICYgKDEgPDwgY3QpKSB8fCAhbVRleHR1cmVzW2N0XS5nZXQoKSkgeworICAgICAgICBpZiAoIW1UZXh0dXJlc1tjdF0uZ2V0KCkpIHsKKyAgICAgICAgICAgIExPR0UoIk5vIHRleHR1cmUgYm91bmQgZm9yIHNoYWRlciBpZCAldSwgdGV4dHVyZSB1bml0ICV1IiwgKHVpbnQpdGhpcywgY3QpOworICAgICAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiTm8gdGV4dHVyZSBib3VuZCIpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIApAQCAtMTU5LDE2ICsxMDgsMTYgQEAKICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZXNbY3RdLT5nZXRUZXh0dXJlSUQoKSk7CiAgICAgICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiB0ZXggYmluZCIpOwogICAgICAgICBpZiAobVNhbXBsZXJzW2N0XS5nZXQoKSkgewotICAgICAgICAgICAgbVNhbXBsZXJzW2N0XS0+c2V0dXBHTChyc2MsIG1UZXh0dXJlc1tjdF0tPmdldFR5cGUoKS0+Z2V0SXNOcDIoKSk7CisgICAgICAgICAgICBtU2FtcGxlcnNbY3RdLT5zZXR1cEdMKHJzYywgbVRleHR1cmVzW2N0XS5nZXQoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKICAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOwotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOwotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOworICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CiAgICAgICAgICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1GcmFnbWVudDo6c2V0dXBHTDIgdGV4IGVudiIpOwogICAgICAgICB9CiAKLSAgICAgICAgZ2xVbmlmb3JtMWkoc2MtPmZyYWdVbmlmb3JtU2xvdChjdCksIGN0KTsKKyAgICAgICAgZ2xVbmlmb3JtMWkoc2MtPmZyYWdVbmlmb3JtU2xvdChtVGV4dHVyZVVuaWZvcm1JbmRleFN0YXJ0ICsgY3QpLCBjdCk7CiAgICAgICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiB1bmlmb3JtcyIpOwogICAgIH0KIApAQCAtMTgzLDExMiArMTMyLDQ5IEBACiAKIHZvaWQgUHJvZ3JhbUZyYWdtZW50OjpjcmVhdGVTaGFkZXIoKQogewotICAgIG1TaGFkZXIuc2V0VG8oInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIik7Ci0gICAgbVNoYWRlci5hcHBlbmQoInZhcnlpbmcgdmVjNCB2YXJDb2xvcjtcbiIpOwotICAgIG1TaGFkZXIuYXBwZW5kKCJ2YXJ5aW5nIHZlYzQgdmFyVGV4MDtcbiIpOwotCiAgICAgaWYgKG1Vc2VyU2hhZGVyLmxlbmd0aCgpID4gMSkgeworICAgICAgICBtU2hhZGVyLmFwcGVuZCgicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iKTsKKyAgICAgICAgYXBwZW5kVXNlckNvbnN0YW50cygpOworICAgICAgICBjaGFyIGJ1ZlsyNTZdOwogICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVRleHR1cmVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKLSAgICAgICAgICAgIHNwcmludGYoYnVmLCAidW5pZm9ybSBzYW1wbGVyMkQgdW5pX1RleCVpO1xuIiwgY3QpOworICAgICAgICAgICAgc3ByaW50ZihidWYsICJ1bmlmb3JtIHNhbXBsZXIyRCBVTklfVGV4JWk7XG4iLCBjdCk7CiAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChidWYpOwogICAgICAgICB9Ci0KICAgICAgICAgbVNoYWRlci5hcHBlbmQobVVzZXJTaGFkZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQzMl90IG1hc2sgPSBtVGV4dHVyZUVuYWJsZU1hc2s7Ci0gICAgICAgIHVpbnQzMl90IHRleE51bSA9IDA7Ci0gICAgICAgIHdoaWxlIChtYXNrKSB7Ci0gICAgICAgICAgICBpZiAobWFzayAmIDEpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGJ1Zls2NF07Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gc2FtcGxlcjJEIHVuaV9UZXgiKTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVpIiwgdGV4TnVtKTsKLSAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChidWYpOwotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hc2sgPj49IDE7Ci0gICAgICAgICAgICB0ZXhOdW0rKzsKLSAgICAgICAgfQotCi0KLSAgICAgICAgbVNoYWRlci5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2ZWM0IGNvbCA9IHZhckNvbG9yO1xuIik7Ci0KLSAgICAgICAgaWYgKG1UZXh0dXJlRW5hYmxlTWFzaykgewotICAgICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZUVuYWJsZSkgewotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZlYzIgdDAgPSBnbF9Qb2ludENvb3JkO1xuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZlYzIgdDAgPSB2YXJUZXgwLnh5O1xuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtYXNrID0gbVRleHR1cmVFbmFibGVNYXNrOwotICAgICAgICB0ZXhOdW0gPSAwOwotICAgICAgICB3aGlsZSAobWFzaykgewotICAgICAgICAgICAgaWYgKG1hc2sgJiAxKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKG1FbnZNb2Rlc1t0ZXhOdW1dKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChtVGV4dHVyZUZvcm1hdHNbdGV4TnVtXSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wuYSA9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLmE7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wucmdiYSA9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYmE7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wucmdiID0gdGV4dHVyZTJEKHVuaV9UZXgwLCB0MCkucmdiO1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgY29sLnJnYmEgPSB0ZXh0dXJlMkQodW5pX1RleDAsIHQwKS5yZ2JhO1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9NT0RVTEFURToKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1UZXh0dXJlRm9ybWF0c1t0ZXhOdW1dKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5hICo9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLmE7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wucmdiYSAqPSB0ZXh0dXJlMkQodW5pX1RleDAsIHQwKS5yZ2JhO1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgY29sLnJnYiAqPSB0ZXh0dXJlMkQodW5pX1RleDAsIHQwKS5yZ2I7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wucmdiYSAqPSB0ZXh0dXJlMkQodW5pX1RleDAsIHQwKS5yZ2JhO1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9ERUNBTDoKLSAgICAgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgY29sID0gdGV4dHVyZTJEKHVuaV9UZXgwLCB0MCk7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXNrID4+PSAxOwotICAgICAgICAgICAgdGV4TnVtKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvL21TaGFkZXIuYXBwZW5kKCIgIGNvbC5hID0gMS4wO1xuIik7Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgY29sLnIgPSAwLjU7XG4iKTsKLQotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9GcmFnQ29sb3IgPSBjb2w7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIn1cbiIpOworICAgICAgICBMT0dFKCJQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZVNoYWRlciBjYW5ub3QgY3JlYXRlIHByb2dyYW0sIHNoYWRlciBjb2RlIG5vdCBkZWZpbmVkIik7CisgICAgICAgIHJzQXNzZXJ0KDApOwogICAgIH0KIH0KIAogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIG1Vbmlmb3JtQ291bnQgPSAyOwotICAgIG1Vbmlmb3JtTmFtZXNbMF0uc2V0VG8oInVuaV9UZXgwIik7Ci0gICAgbVVuaWZvcm1OYW1lc1sxXS5zZXRUbygidW5pX1RleDEiKTsKKyAgICBtVW5pZm9ybUNvdW50ID0gMDsKKyAgICBpZiAobVVzZXJTaGFkZXIuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIGluaXRBZGRVc2VyRWxlbWVudChtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKSwgbVVuaWZvcm1OYW1lcywgJm1Vbmlmb3JtQ291bnQsIFJTX1NIQURFUl9VTkkpOworICAgICAgICB9CisgICAgfQorICAgIG1UZXh0dXJlVW5pZm9ybUluZGV4U3RhcnQgPSBtVW5pZm9ybUNvdW50OworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1UZXh0dXJlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgc3ByaW50ZihidWYsICJVTklfVGV4JWkiLCBjdCk7CisgICAgICAgIG1Vbmlmb3JtTmFtZXNbbVVuaWZvcm1Db3VudCsrXS5zZXRUbyhidWYpOworICAgIH0KIAogICAgIGNyZWF0ZVNoYWRlcigpOwogfQogCit2b2lkIFByb2dyYW1GcmFnbWVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKworfQorCitQcm9ncmFtRnJhZ21lbnQgKlByb2dyYW1GcmFnbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogUHJvZ3JhbUZyYWdtZW50U3RhdGU6OlByb2dyYW1GcmFnbWVudFN0YXRlKCkKIHsKICAgICBtUEYgPSBOVUxMOwpAQCAtMzAwLDE2ICsxODYsMzkgQEAKIAogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1GcmFnbWVudFN0YXRlOjppbml0KENvbnRleHQgKnJzYykKIHsKLSAgICB1aW50MzJfdCB0bXBbNV0gPSB7Ci0gICAgICAgIFJTX1RFWF9FTlZfTU9ERV9OT05FLCAwLAotICAgICAgICBSU19URVhfRU5WX01PREVfTk9ORSwgMCwKLSAgICAgICAgMAotICAgIH07Ci0gICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCB0bXAsIDUpOworICAgIFN0cmluZzggc2hhZGVyU3RyaW5nKFJTX1NIQURFUl9JTlRFUk5BTCk7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgidmFyeWluZyBsb3dwIHZlYzQgdmFyQ29sb3I7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ2YXJ5aW5nIHZlYzIgdmFyVGV4MDtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgbG93cCB2ZWM0IGNvbCA9IFVOSV9Db2xvcjtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgZ2xfRnJhZ0NvbG9yID0gY29sO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgifVxuIik7CisKKyAgICBjb25zdCBFbGVtZW50ICpjb2xvckVsZW0gPSBFbGVtZW50OjpjcmVhdGUocnNjLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCA0KTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJCZWdpbigpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChjb2xvckVsZW0sICJDb2xvciIsIDEpOworICAgIGNvbnN0IEVsZW1lbnQgKmNvbnN0SW5wdXQgPSByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJDcmVhdGUocnNjKTsKKworICAgIFR5cGUgKmlucHV0VHlwZSA9IG5ldyBUeXBlKHJzYyk7CisgICAgaW5wdXRUeXBlLT5zZXRFbGVtZW50KGNvbnN0SW5wdXQpOworICAgIGlucHV0VHlwZS0+c2V0RGltWCgxKTsKKyAgICBpbnB1dFR5cGUtPmNvbXB1dGUoKTsKKworICAgIHVpbnQzMl90IHRtcFs0XTsKKyAgICB0bXBbMF0gPSBSU19QUk9HUkFNX1BBUkFNX0NPTlNUQU5UOworICAgIHRtcFsxXSA9ICh1aW50MzJfdClpbnB1dFR5cGU7CisgICAgdG1wWzJdID0gUlNfUFJPR1JBTV9QQVJBTV9URVhUVVJFX0NPVU5UOworICAgIHRtcFszXSA9IDA7CisKKyAgICBBbGxvY2F0aW9uICpjb25zdEFsbG9jID0gbmV3IEFsbG9jYXRpb24ocnNjLCBpbnB1dFR5cGUpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KHJzYywgc2hhZGVyU3RyaW5nLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclN0cmluZy5sZW5ndGgoKSwgdG1wLCA0KTsKKyAgICBwZi0+YmluZEFsbG9jYXRpb24ocnNjLCBjb25zdEFsbG9jLCAwKTsKKyAgICBwZi0+c2V0Q29uc3RhbnRDb2xvcihyc2MsIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworCiAgICAgbURlZmF1bHQuc2V0KHBmKTsKLSAgICBwZi0+aW5pdChyc2MpOwogfQogCiB2b2lkIFByb2dyYW1GcmFnbWVudFN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQpAQCAtMzIyLDIxICsyMzEsMTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCi1Sc1Byb2dyYW1GcmFnbWVudCByc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKENvbnRleHQgKnJzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtTGVuZ3RoKQotewotICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KHJzYywgcGFyYW1zLCBwYXJhbUxlbmd0aCk7Ci0gICAgcGYtPmluY1VzZXJSZWYoKTsKLSAgICByZXR1cm4gcGY7Ci19Ci0KLVJzUHJvZ3JhbUZyYWdtZW50IHJzaV9Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqIHNoYWRlclRleHQsCitSc1Byb2dyYW1GcmFnbWVudCByc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqIHNoYWRlclRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNoYWRlckxlbmd0aCwgY29uc3QgdWludDMyX3QgKiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtTGVuZ3RoKQogewogICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KHJzYywgc2hhZGVyVGV4dCwgc2hhZGVyTGVuZ3RoLCBwYXJhbXMsIHBhcmFtTGVuZ3RoKTsKICAgICBwZi0+aW5jVXNlclJlZigpOworICAgIC8vTE9HRSgicnNpX1Byb2dyYW1GcmFnbWVudENyZWF0ZSAlcCIsIHBmKTsKICAgICByZXR1cm4gcGY7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaAppbmRleCA5ZmE1NjVkLi4xY2Y5Y2E3IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oCkBAIC0yOCwyNiArMjgsMjUgQEAKIGNsYXNzIFByb2dyYW1GcmFnbWVudCA6IHB1YmxpYyBQcm9ncmFtCiB7CiBwdWJsaWM6Ci0gICAgUHJvZ3JhbUZyYWdtZW50KENvbnRleHQgKiwgY29uc3QgdWludDMyX3QgKiBwYXJhbXMsIHVpbnQzMl90IHBhcmFtTGVuZ3RoKTsKICAgICBQcm9ncmFtRnJhZ21lbnQoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2hhZGVyTGVuZ3RoLCBjb25zdCB1aW50MzJfdCAqIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1MZW5ndGgpOwogICAgIHZpcnR1YWwgflByb2dyYW1GcmFnbWVudCgpOwogCi0gICAgdmlydHVhbCB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtRnJhZ21lbnRTdGF0ZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtRnJhZ21lbnRTdGF0ZSAqLCBTaGFkZXJDYWNoZSAqc2MpOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihDb250ZXh0ICosIFByb2dyYW1GcmFnbWVudFN0YXRlICosIFNoYWRlckNhY2hlICpzYyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlU2hhZGVyKCk7CiAgICAgdmlydHVhbCB2b2lkIGxvYWRTaGFkZXIoQ29udGV4dCAqcnNjKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQ7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbUZyYWdtZW50ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKworICAgIHZvaWQgc2V0Q29uc3RhbnRDb2xvcihDb250ZXh0ICosIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAogcHJvdGVjdGVkOgotICAgIC8vIEhhY2tzIHRvIGNyZWF0ZSBhIHByb2dyYW0gZm9yIG5vdwotICAgIHVpbnQzMl90IG1UZXh0dXJlRm9ybWF0c1tNQVhfVEVYVFVSRV07Ci0gICAgdWludDMyX3QgbVRleHR1cmVEaW1lbnNpb25zW01BWF9URVhUVVJFXTsKLSAgICBSc1RleEVudk1vZGUgbUVudk1vZGVzW01BWF9URVhUVVJFXTsKLSAgICB1aW50MzJfdCBtVGV4dHVyZUVuYWJsZU1hc2s7Ci0gICAgYm9vbCBtUG9pbnRTcHJpdGVFbmFibGU7CisgICAgZmxvYXQgbUNvbnN0YW50Q29sb3JbNF07CisgICAgaW50MzJfdCBtVGV4dHVyZVVuaWZvcm1JbmRleFN0YXJ0OwogfTsKIAogY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RhdGUKQEAgLTU3LDEwICs1Niw5IEBACiAgICAgflByb2dyYW1GcmFnbWVudFN0YXRlKCk7CiAKICAgICBQcm9ncmFtRnJhZ21lbnQgKm1QRjsKLSAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCk7CisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CiAgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKIAotICAgIE9iamVjdEJhc2VSZWY8VHlwZT4gbVRleHR1cmVUeXBlc1tQcm9ncmFtRnJhZ21lbnQ6Ok1BWF9URVhUVVJFXTsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudD4gbURlZmF1bHQ7CiAgICAgVmVjdG9yPFByb2dyYW1GcmFnbWVudCAqPiBtUHJvZ3JhbXM7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIxNTdmLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgiCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7Ci0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmU6OlByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKnJzYykgOgotICAgIFByb2dyYW0ocnNjKQotewotICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKLSAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbURpdGhlckVuYWJsZSA9IHRydWU7Ci0gICAgbUJsZW5kRW5hYmxlID0gZmFsc2U7Ci0gICAgbUNvbG9yUldyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQ29sb3JHV3JpdGVFbmFibGUgPSB0cnVlOwotICAgIG1Db2xvckJXcml0ZUVuYWJsZSA9IHRydWU7Ci0gICAgbUNvbG9yQVdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLQotCi0gICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtRGVwdGhGdW5jID0gR0xfTEVTUzsKLQotCi19Ci0KLVByb2dyYW1GcmFnbWVudFN0b3JlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKQotewotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqc3RhdGUpCi17Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKLQotICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7Ci0gICAgaWYgKG1CbGVuZEVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIH0KLQotICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOwotCi0gICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOwotICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICB9Ci0KLSAgICBpZiAobURpdGhlckVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICpzdGF0ZSkKLXsKLSAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCi0gICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKLSAgICBpZiAobUJsZW5kRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgfQotCi0gICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7Ci0KLSAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7Ci0gICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgIH0KLQotICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgfQotfQotCi0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERpdGhlckVuYWJsZShib29sIGVuYWJsZSkKLXsKLSAgICBtRGl0aGVyRW5hYmxlID0gZW5hYmxlOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKLXsKLSAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKLQotICAgIHN3aXRjaChmdW5jKSB7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKLSAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERlcHRoTWFzayhib29sIG1hc2spCi17Ci0gICAgbURlcHRoV3JpdGVFbmFibGUgPSBtYXNrOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCi17Ci0gICAgbUJsZW5kRW5hYmxlID0gdHJ1ZTsKLSAgICBpZiAoKHNyYyA9PSBSU19CTEVORF9TUkNfT05FKSAmJgotICAgICAgICAoZHN0ID09IFJTX0JMRU5EX0RTVF9aRVJPKSkgewotICAgICAgICBtQmxlbmRFbmFibGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2goc3JjKSB7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfWkVSTzoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX0RTVF9DT0xPUjoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfRFNUX0NPTE9SOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQV9TQVRVUkFURToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBX1NBVFVSQVRFOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goZHN0KSB7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfWkVSTzoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19DT0xPUjoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0NPTE9SOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKLXsKLSAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOwotICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7Ci0gICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKLSAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOwotfQotCi0KLVByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OlByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKQotewotICAgIG1QRlMgPSBOVUxMOwotfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCi17Ci0gICAgZGVsZXRlIG1QRlM7Ci0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCi17Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcyA9IG5ldyBQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MpOwotICAgIG1EZWZhdWx0LnNldChwZnMpOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCi17Ci0gICAgbURlZmF1bHQuY2xlYXIoKTsKLSAgICBtTGFzdC5jbGVhcigpOwotfQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKENvbnRleHQgKiByc2MsIFJzRWxlbWVudCBpbiwgUnNFbGVtZW50IG91dCkKLXsKLSAgICBkZWxldGUgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSBuZXcgUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjKTsKLQotfQotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhDb250ZXh0ICpyc2MsIFJzRGVwdGhGdW5jIGZ1bmMpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoRnVuYyhmdW5jKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoTWFzayhtYXNrKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoQ29udGV4dCAqcnNjLCBSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0QmxlbmRGdW5jKHNyYywgZHN0KTsKLX0KLQotUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQotewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKLSAgICBwZnMtPmluY1VzZXJSZWYoKTsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IDA7Ci0gICAgcmV0dXJuIHBmczsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoQ29udGV4dCAqcnNjLCBib29sIGVuYWJsZSkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGl0aGVyRW5hYmxlKGVuYWJsZSk7Ci19Ci0KLQotfQotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxMmM5OS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0jZGVmaW5lIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0KLSNpbmNsdWRlICJyc1Byb2dyYW0uaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmUgOiBwdWJsaWMgUHJvZ3JhbQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKik7Ci0gICAgdmlydHVhbCB+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICopOwotCi0gICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOwotICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOwotCi0gICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOwotICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOwotCi0gICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIG1EaXRoZXJFbmFibGU7Ci0KLSAgICBib29sIG1CbGVuZEVuYWJsZTsKLSAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKLSAgICBpbnQzMl90IG1CbGVuZFNyYzsKLSAgICBpbnQzMl90IG1CbGVuZERzdDsKLQotICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKLSAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOwotICAgIGludDMyX3QgbURlcHRoRnVuYzsKLQotICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOwotfTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKTsKLSAgICB+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKLSAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotCi0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbURlZmF1bHQ7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUxhc3Q7Ci0KLQotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICptUEZTOwotfTsKLQotCi19Ci19Ci0jZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcAppbmRleCAxMzg4N2QxLi42MmQwNjBkIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCkBAIC0xNCwxMSArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0zNSw5ICs0MSw4IEBACiAgICAgbVBvaW50U21vb3RoID0gcG9pbnRTbW9vdGg7CiAgICAgbUxpbmVTbW9vdGggPSBsaW5lU21vb3RoOwogICAgIG1Qb2ludFNwcml0ZSA9IHBvaW50U3ByaXRlOwotCi0gICAgbVBvaW50U2l6ZSA9IDEuMGY7CiAgICAgbUxpbmVXaWR0aCA9IDEuMGY7CisgICAgbUN1bGwgPSBSU19DVUxMX0JBQ0s7CiB9CiAKIFByb2dyYW1SYXN0ZXI6On5Qcm9ncmFtUmFzdGVyKCkKQEAgLTQ3LDUyICs1Miw0NyBAQAogdm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRMaW5lV2lkdGgoZmxvYXQgcykKIHsKICAgICBtTGluZVdpZHRoID0gczsKKyAgICBtRGlydHkgPSB0cnVlOwogfQogCi12b2lkIFByb2dyYW1SYXN0ZXI6OnNldFBvaW50U2l6ZShmbG9hdCBzKQordm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRDdWxsTW9kZShSc0N1bGxNb2RlIG1vZGUpCiB7Ci0gICAgbVBvaW50U2l6ZSA9IHM7Ci19Ci0KLXZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1SYXN0ZXJTdGF0ZSAqc3RhdGUpCi17Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKLQotICAgIGdsUG9pbnRTaXplKG1Qb2ludFNpemUpOwotICAgIGlmIChtUG9pbnRTbW9vdGgpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfUE9JTlRfU01PT1RIKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU01PT1RIKTsKLSAgICB9Ci0KLSAgICBnbExpbmVXaWR0aChtTGluZVdpZHRoKTsKLSAgICBpZiAobUxpbmVTbW9vdGgpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfTElORV9TTU9PVEgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9MSU5FX1NNT09USCk7Ci0gICAgfQotCi0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMV8xKCkpIHsKLSAgICAgICAgaWYgKG1Qb2ludFNwcml0ZSkgewotICAgICAgICAgICAgZ2xFbmFibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgbUN1bGwgPSBtb2RlOworICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtUmFzdGVyU3RhdGUgKnN0YXRlKQogewotICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgeworICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcyAmJiAhbURpcnR5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKyAgICBtRGlydHkgPSBmYWxzZTsKKworICAgIHN3aXRjaChtQ3VsbCkgeworICAgICAgICBjYXNlIFJTX0NVTExfQkFDSzoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9GUk9OVDoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0ZST05UKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0NVTExfTk9ORToKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQogfQogCit2b2lkIFByb2dyYW1SYXN0ZXI6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CiAKK30KKworUHJvZ3JhbVJhc3RlciAqUHJvZ3JhbVJhc3Rlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogUHJvZ3JhbVJhc3RlclN0YXRlOjpQcm9ncmFtUmFzdGVyU3RhdGUoKQogewpAQCAtMTAyLDcgKzEwMiw3IEBACiB7CiB9CiAKLXZvaWQgUHJvZ3JhbVJhc3RlclN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1SYXN0ZXJTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7CiAgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBuZXcgUHJvZ3JhbVJhc3Rlcihyc2MsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgIG1EZWZhdWx0LnNldChwcik7CkBAIC0xMTgsNyArMTE4LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCi1Sc1Byb2dyYW1SYXN0ZXIgcnNpX1Byb2dyYW1SYXN0ZXJDcmVhdGUoQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0LAorUnNQcm9ncmFtUmFzdGVyIHJzaV9Qcm9ncmFtUmFzdGVyQ3JlYXRlKENvbnRleHQgKiByc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRTbW9vdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGluZVNtb290aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludFNwcml0ZSkKQEAgLTEzMSwxOCArMTMxLDE4IEBACiAgICAgcmV0dXJuIHByOwogfQogCi12b2lkIHJzaV9Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKENvbnRleHQgKiByc2MsIFJzUHJvZ3JhbVJhc3RlciB2cHIsIGZsb2F0IHMpCi17Ci0gICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7Ci0gICAgcHItPnNldFBvaW50U2l6ZShzKTsKLX0KLQogdm9pZCByc2lfUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBmbG9hdCBzKQogewogICAgIFByb2dyYW1SYXN0ZXIgKnByID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbVJhc3RlciAqPih2cHIpOwogICAgIHByLT5zZXRMaW5lV2lkdGgocyk7CiB9CiAKK3ZvaWQgcnNpX1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBSc0N1bGxNb2RlIG1vZGUpCit7CisgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7CisgICAgcHItPnNldEN1bGxNb2RlKG1vZGUpOworfQorCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmggYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oCmluZGV4IGMzYTljOTAuLmQ1ZWQ2ODYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaApAQCAtMzQsMjEgKzM0LDIwIEBACiAgICAgICAgICAgICAgICAgICBib29sIHBvaW50U3ByaXRlKTsKICAgICB2aXJ0dWFsIH5Qcm9ncmFtUmFzdGVyKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1SYXN0ZXJTdGF0ZSAqKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtUmFzdGVyU3RhdGUgKik7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVI7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVJhc3RlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KTsKLSAgICB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKTsKKyAgICB2b2lkIHNldEN1bGxNb2RlKFJzQ3VsbE1vZGUgbW9kZSk7CiAKIHByb3RlY3RlZDoKICAgICBib29sIG1Qb2ludFNtb290aDsKICAgICBib29sIG1MaW5lU21vb3RoOwogICAgIGJvb2wgbVBvaW50U3ByaXRlOwotCi0gICAgZmxvYXQgbVBvaW50U2l6ZTsKICAgICBmbG9hdCBtTGluZVdpZHRoOwotCi0KKyAgICBSc0N1bGxNb2RlIG1DdWxsOwogfTsKIAogY2xhc3MgUHJvZ3JhbVJhc3RlclN0YXRlCkBAIC01Niw3ICs1NSw3IEBACiBwdWJsaWM6CiAgICAgUHJvZ3JhbVJhc3RlclN0YXRlKCk7CiAgICAgflByb2dyYW1SYXN0ZXJTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtRGVmYXVsdDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5MGQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitQcm9ncmFtU3RvcmU6OlByb2dyYW1TdG9yZShDb250ZXh0ICpyc2MpIDoKKyAgICBQcm9ncmFtKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworICAgIG1EaXRoZXJFbmFibGUgPSB0cnVlOworICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gdHJ1ZTsKKyAgICBtQ29sb3JCV3JpdGVFbmFibGUgPSB0cnVlOworICAgIG1Db2xvckFXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUJsZW5kU3JjID0gR0xfT05FOworICAgIG1CbGVuZERzdCA9IEdMX1pFUk87CisKKworICAgIG1EZXB0aFRlc3RFbmFibGUgPSBmYWxzZTsKKyAgICBtRGVwdGhXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisKKworfQorCitQcm9ncmFtU3RvcmU6On5Qcm9ncmFtU3RvcmUoKQoreworfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtU3RvcmVTdGF0ZSAqc3RhdGUpCit7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKworICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7CisgICAgaWYgKG1CbGVuZEVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KKworICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOworCisgICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOworICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9CisKKyAgICBpZiAobURpdGhlckVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIH0KK30KKworCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0RGl0aGVyRW5hYmxlKGJvb2wgZW5hYmxlKQoreworICAgIG1EaXRoZXJFbmFibGUgPSBlbmFibGU7Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1TdG9yZSAqUHJvZ3JhbVN0b3JlOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKK3sKKyAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKKworICAgIHN3aXRjaChmdW5jKSB7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKKyAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOworICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aE1hc2soYm9vbCBtYXNrKQoreworICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gbWFzazsKK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldEJsZW5kRnVuYyhSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKK3sKKyAgICBtQmxlbmRFbmFibGUgPSB0cnVlOworICAgIGlmICgoc3JjID09IFJTX0JMRU5EX1NSQ19PTkUpICYmCisgICAgICAgIChkc3QgPT0gUlNfQkxFTkRfRFNUX1pFUk8pKSB7CisgICAgICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaChzcmMpIHsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19aRVJPOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkU6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0NPTE9SOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfU1JDX0FMUEhBX1NBVFVSQVRFOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaChkc3QpIHsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9aRVJPOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkU6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfU1JDX0NPTE9SOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19TUkNfQ09MT1I6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKK3sKKyAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOworICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7CisgICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKKyAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOworfQorCisKK1Byb2dyYW1TdG9yZVN0YXRlOjpQcm9ncmFtU3RvcmVTdGF0ZSgpCit7CisgICAgbVBGUyA9IE5VTEw7Cit9CisKK1Byb2dyYW1TdG9yZVN0YXRlOjp+UHJvZ3JhbVN0b3JlU3RhdGUoKQoreworICAgIGRlbGV0ZSBtUEZTOworCit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gbmV3IFByb2dyYW1TdG9yZShyc2MpOworICAgIG1EZWZhdWx0LnNldChwZnMpOworfQorCit2b2lkIFByb2dyYW1TdG9yZVN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1EZWZhdWx0LmNsZWFyKCk7CisgICAgbUxhc3QuY2xlYXIoKTsKK30KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQoreworICAgIGRlbGV0ZSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IG5ldyBQcm9ncmFtU3RvcmUocnNjKTsKKworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoQ29udGV4dCAqcnNjLCBSc0RlcHRoRnVuYyBmdW5jKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREZXB0aEZ1bmMoZnVuYyk7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURlcHRoTWFzayhDb250ZXh0ICpyc2MsIGJvb2wgbWFzaykKK3sKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGVwdGhNYXNrKG1hc2spOworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKK30KKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKENvbnRleHQgKnJzYywgUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldEJsZW5kRnVuYyhzcmMsIGRzdCk7Cit9CisKK1JzUHJvZ3JhbVN0b3JlIHJzaV9Qcm9ncmFtU3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7CisgICAgcGZzLT5pbmNVc2VyUmVmKCk7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSAwOworICAgIHJldHVybiBwZnM7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURpdGhlcihDb250ZXh0ICpyc2MsIGJvb2wgZW5hYmxlKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREaXRoZXJFbmFibGUoZW5hYmxlKTsKK30KKworCit9Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViY2YzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorI2RlZmluZSBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorCisjaW5jbHVkZSAicnNQcm9ncmFtLmgiCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGU7CisKK2NsYXNzIFByb2dyYW1TdG9yZSA6IHB1YmxpYyBQcm9ncmFtCit7CitwdWJsaWM6CisgICAgUHJvZ3JhbVN0b3JlKENvbnRleHQgKik7CisgICAgdmlydHVhbCB+UHJvZ3JhbVN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtU3RvcmVTdGF0ZSAqKTsKKworICAgIHZvaWQgc2V0RGVwdGhGdW5jKFJzRGVwdGhGdW5jKTsKKyAgICB2b2lkIHNldERlcHRoTWFzayhib29sKTsKKworICAgIHZvaWQgc2V0QmxlbmRGdW5jKFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KTsKKyAgICB2b2lkIHNldENvbG9yTWFzayhib29sLCBib29sLCBib29sLCBib29sKTsKKworICAgIHZvaWQgc2V0RGl0aGVyRW5hYmxlKGJvb2wpOworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9TVE9SRTsgfQorICAgIHN0YXRpYyBQcm9ncmFtU3RvcmUgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBtRGl0aGVyRW5hYmxlOworCisgICAgYm9vbCBtQmxlbmRFbmFibGU7CisgICAgYm9vbCBtQ29sb3JSV3JpdGVFbmFibGU7CisgICAgYm9vbCBtQ29sb3JHV3JpdGVFbmFibGU7CisgICAgYm9vbCBtQ29sb3JCV3JpdGVFbmFibGU7CisgICAgYm9vbCBtQ29sb3JBV3JpdGVFbmFibGU7CisgICAgaW50MzJfdCBtQmxlbmRTcmM7CisgICAgaW50MzJfdCBtQmxlbmREc3Q7CisKKyAgICBib29sIG1EZXB0aFRlc3RFbmFibGU7CisgICAgYm9vbCBtRGVwdGhXcml0ZUVuYWJsZTsKKyAgICBpbnQzMl90IG1EZXB0aEZ1bmM7CisKKyAgICBib29sIG1TdGVuY2lsVGVzdEVuYWJsZTsKK307CisKK2NsYXNzIFByb2dyYW1TdG9yZVN0YXRlCit7CitwdWJsaWM6CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUoKTsKKyAgICB+UHJvZ3JhbVN0b3JlU3RhdGUoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKKyAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOworCisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1EZWZhdWx0OworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBtTGFzdDsKKworCisgICAgUHJvZ3JhbVN0b3JlICptUEZTOworfTsKKworCit9Cit9CisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAppbmRleCBhMmIyZGY0Li5hNzg1MjYyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCkBAIC0xNCwyOCArMTQsMjQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbVZlcnRleC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVZlcnRleC5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKIAotUHJvZ3JhbVZlcnRleDo6UHJvZ3JhbVZlcnRleChDb250ZXh0ICpyc2MsIGJvb2wgdGV4TWF0KSA6Ci0gICAgUHJvZ3JhbShyc2MpCi17Ci0gICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwotICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICBtVGV4dHVyZU1hdHJpeEVuYWJsZSA9IHRleE1hdDsKLSAgICBtTGlnaHRDb3VudCA9IDA7Ci0gICAgaW5pdChyc2MpOwotfQotCiBQcm9ncmFtVmVydGV4OjpQcm9ncmFtVmVydGV4KENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqIHNoYWRlclRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNoYWRlckxlbmd0aCwgY29uc3QgdWludDMyX3QgKiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtTGVuZ3RoKSA6CkBAIC00Myw2OSArMzksMTUgQEAKIHsKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIG1UZXh0dXJlTWF0cml4RW5hYmxlID0gZmFsc2U7Ci0gICAgbUxpZ2h0Q291bnQgPSAwOwogCiAgICAgaW5pdChyc2MpOwogfQogCiBQcm9ncmFtVmVydGV4Ojp+UHJvZ3JhbVZlcnRleCgpCiB7Ci19Ci0KLXN0YXRpYyB2b2lkIGxvZ01hdHJpeChjb25zdCBjaGFyICp0eHQsIGNvbnN0IGZsb2F0ICpmKQotewotICAgIExPR1YoIk1hdHJpeCAlcywgJXAiLCB0eHQsIGYpOwotICAgIExPR1YoIiU2LjRmLCAlNi40ZiwgJTYuNGYsICU2LjRmIiwgZlswXSwgZls0XSwgZls4XSwgZlsxMl0pOwotICAgIExPR1YoIiU2LjRmLCAlNi40ZiwgJTYuNGYsICU2LjRmIiwgZlsxXSwgZls1XSwgZls5XSwgZlsxM10pOwotICAgIExPR1YoIiU2LjRmLCAlNi40ZiwgJTYuNGYsICU2LjRmIiwgZlsyXSwgZls2XSwgZlsxMF0sIGZbMTRdKTsKLSAgICBMT0dWKCIlNi40ZiwgJTYuNGYsICU2LjRmLCAlNi40ZiIsIGZbM10sIGZbN10sIGZbMTFdLCBmWzE1XSk7Ci19Ci0KLXZvaWQgUHJvZ3JhbVZlcnRleDo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1WZXJ0ZXhTdGF0ZSAqc3RhdGUpCi17Ci0gICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICByZXR1cm47CisgICAgaWYobVNoYWRlcklEKSB7CisgICAgICAgIG1SU0MtPm1TaGFkZXJDYWNoZS5jbGVhbnVwVmVydGV4KG1TaGFkZXJJRCk7CiAgICAgfQotICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7Ci0KLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKLQotICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKLSAgICBpZiAobVRleHR1cmVNYXRyaXhFbmFibGUpIHsKLSAgICAgICAgZ2xMb2FkTWF0cml4ZigmZltSU19QUk9HUkFNX1ZFUlRFWF9URVhUVVJFX09GRlNFVF0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgfQotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBpZiAobUxpZ2h0Q291bnQpIHsKLSAgICAgICAgaW50IHYgPSAwOwotICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7Ci0gICAgICAgIGdsTGlnaHRNb2RlbHh2KEdMX0xJR0hUX01PREVMX1RXT19TSURFLCAmdik7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1MaWdodENvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBMaWdodCAqbCA9IG1MaWdodHNbY3RdLmdldCgpOwotICAgICAgICAgICAgZ2xFbmFibGUoR0xfTElHSFQwICsgY3QpOwotICAgICAgICAgICAgbC0+c2V0dXBHTChjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IG1MaWdodENvdW50OyBjdCA8IE1BWF9MSUdIVFM7IGN0KyspIHsKLSAgICAgICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVDAgKyBjdCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOwotICAgIH0KLQotICAgIGlmICghZikgewotICAgICAgICBMT0dFKCJNdXN0IGJpbmQgY29uc3RhbnRzIHRvIHZlcnRleCBwcm9ncmFtIik7Ci0gICAgfQotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgIGdsTG9hZE1hdHJpeGYoJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdKTsKLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLSAgICBnbExvYWRNYXRyaXhmKCZmW1JTX1BST0dSQU1fVkVSVEVYX01PREVMVklFV19PRkZTRVRdKTsKLQotICAgIG1EaXJ0eSA9IGZhbHNlOwogfQogCiB2b2lkIFByb2dyYW1WZXJ0ZXg6OmxvYWRTaGFkZXIoQ29udGV4dCAqcnNjKSB7CkBAIC0xMTQsNDIgKzU2LDE5IEBACiAKIHZvaWQgUHJvZ3JhbVZlcnRleDo6Y3JlYXRlU2hhZGVyKCkKIHsKLSAgICBtU2hhZGVyLnNldFRvKCIiKTsKLQotICAgIG1TaGFkZXIuYXBwZW5kKCJ2YXJ5aW5nIHZlYzQgdmFyQ29sb3I7XG4iKTsKLSAgICBtU2hhZGVyLmFwcGVuZCgidmFyeWluZyB2ZWM0IHZhclRleDA7XG4iKTsKLQogICAgIGlmIChtVXNlclNoYWRlci5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gbWF0NCAiKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQobVVuaWZvcm1OYW1lc1swXSk7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKIAotICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOwotCi0gICAgICAgICAgICAgICAgLy8gQ2Fubm90IGJlIGNvbXBsZXgKLSAgICAgICAgICAgICAgICByc0Fzc2VydCghZi0+Z2V0RmllbGRDb3VudCgpKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2goZi0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBmbG9hdCBVTklfIik7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjogbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gdmVjMiBVTklfIik7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzogbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gdmVjMyBVTklfIik7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDogbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gdmVjNCBVTklfIik7IGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShmaWVsZCkpOwotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCisgICAgICAgIGFwcGVuZFVzZXJDb25zdGFudHMoKTsKIAogICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUlucHV0Q291bnQ7IGN0KyspIHsKICAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtSW5wdXRFbGVtZW50c1tjdF0uZ2V0KCk7CiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbiA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZm5bMF0gPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIENhbm5vdCBiZSBjb21wbGV4CiAgICAgICAgICAgICAgICAgcnNBc3NlcnQoIWYtPmdldEZpZWxkQ291bnQoKSk7CkBAIC0xNjIsMTQ5ICs4MSwxMjEgQEAKICAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZm4pOwogICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtU2hhZGVyLmFwcGVuZChtVXNlclNoYWRlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lQb3NpdGlvbjtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX0xlZ2FjeUNvbG9yO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjMyBBVFRSSUJfTGVnYWN5Tm9ybWFsO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgZmxvYXQgQVRUUklCX0xlZ2FjeVBvaW50U2l6ZTtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX0xlZ2FjeVRleHR1cmU7XG4iKTsKLQotICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVVuaWZvcm1Db3VudDsgY3QrKykgewotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gbWF0NCAiKTsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKG1Vbmlmb3JtTmFtZXNbY3RdKTsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX0xlZ2FjeVBvc2l0aW9uO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX1BvaW50U2l6ZSA9IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKLQotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJDb2xvciA9IEFUVFJJQl9MZWdhY3lDb2xvcjtcbiIpOwotICAgICAgICBpZiAobVRleHR1cmVNYXRyaXhFbmFibGUpIHsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBVTklfVGV4TWF0cml4ICogQVRUUklCX0xlZ2FjeVRleHR1cmU7XG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBBVFRSSUJfTGVnYWN5VGV4dHVyZTtcbiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgcG9zLnggPSBwb3MueCAvIDQ4MC4wO1xuIik7Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgcG9zLnkgPSBwb3MueSAvIDgwMC4wO1xuIik7Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBwb3M7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIn1cbiIpOworICAgICAgICBMT0dFKCJQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZVNoYWRlciBjYW5ub3QgY3JlYXRlIHByb2dyYW0sIHNoYWRlciBjb2RlIG5vdCBkZWZpbmVkIik7CisgICAgICAgIHJzQXNzZXJ0KDApOwogICAgIH0KIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4OjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1WZXJ0ZXhTdGF0ZSAqc3RhdGUsIFNoYWRlckNhY2hlICpzYykKK3ZvaWQgUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIoQ29udGV4dCAqcnNjLCBQcm9ncmFtVmVydGV4U3RhdGUgKnN0YXRlLCBTaGFkZXJDYWNoZSAqc2MpCiB7CiAgICAgLy9MT0dFKCJzZ2wyIHZ0eDEgJXgiLCBnbEdldEVycm9yKCkpOwogICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKLSAgICAgICAgLy9yZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1WZXJ0ZXg6OnNldHVwR0wyIHN0YXJ0Iik7Ci0gICAgZ2xWZXJ0ZXhBdHRyaWI0ZigxLCBzdGF0ZS0+Y29sb3JbMF0sIHN0YXRlLT5jb2xvclsxXSwgc3RhdGUtPmNvbG9yWzJdLCBzdGF0ZS0+Y29sb3JbM10pOwogCi0gICAgY29uc3QgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPihtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSk7Ci0KLSAgICBNYXRyaXggbXZwOwotICAgIG12cC5sb2FkKCZmW1JTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VUXSk7Ci0gICAgTWF0cml4IHQ7Ci0gICAgdC5sb2FkKCZmW1JTX1BST0dSQU1fVkVSVEVYX01PREVMVklFV19PRkZTRVRdKTsKLSAgICBtdnAubXVsdGlwbHkoJnQpOwotCi0gICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHNjLT52dHhVbmlmb3JtU2xvdCgwKSwgMSwgR0xfRkFMU0UsIG12cC5tKTsKLSAgICBpZiAobVRleHR1cmVNYXRyaXhFbmFibGUpIHsKLSAgICAgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHNjLT52dHhVbmlmb3JtU2xvdCgxKSwgMSwgR0xfRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmZltSU19QUk9HUkFNX1ZFUlRFWF9URVhUVVJFX09GRlNFVF0pOworICAgIGlmKCFpc1VzZXJQcm9ncmFtKCkpIHsKKyAgICAgICAgaWYobUNvbnN0YW50c1swXS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJVbmFibGUgdG8gc2V0IGZpeGVkIGZ1bmN0aW9uIGVtdWxhdGlvbiBtYXRyaWNlcyBiZWNhdXNlIGFsbG9jYXRpb24gaXMgbWlzc2luZyIpOworICAgICAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiRml4ZWQgZnVuY3Rpb24gYWxsb2NhdGlvbiBtaXNzaW5nIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPihtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSk7CisgICAgICAgIE1hdHJpeCBtdnA7CisgICAgICAgIG12cC5sb2FkKCZmW1JTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VUXSk7CisgICAgICAgIE1hdHJpeCB0OworICAgICAgICB0LmxvYWQoJmZbUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVF0pOworICAgICAgICBtdnAubXVsdGlwbHkoJnQpOworICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSArKykgeworICAgICAgICAgICAgZltSU19QUk9HUkFNX1ZFUlRFWF9NVlBfT0ZGU0VUICsgaV0gPSBtdnAubVtpXTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIgYmVnaW4gdW5pZm9ybXMiKTsKLSAgICB1aW50MzJfdCB1aWR4ID0gMTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKLSAgICAgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBtQ29uc3RhbnRzW2N0KzFdLmdldCgpOwotICAgICAgICBpZiAoIWFsbG9jKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KGFsbG9jLT5nZXRQdHIoKSk7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgewotICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IGUtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoZmllbGQpOwotICAgICAgICAgICAgaW50MzJfdCBzbG90ID0gc2MtPnZ0eFVuaWZvcm1TbG90KHVpZHgpOwotCi0gICAgICAgICAgICBjb25zdCBmbG9hdCAqZmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZkYXRhW29mZnNldF0pOwotCi0gICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gIHNsb3Q9JWksIG9mZnNldD0laSwgY29uc3RhbnQ9JWksIGZpZWxkPSVpLCB1aWR4PSVpIiwgc2xvdCwgb2Zmc2V0LCBjdCwgZmllbGQsIHVpZHgpOwotICAgICAgICAgICAgaWYgKHNsb3QgPj0gMCkgewotICAgICAgICAgICAgICAgIHN3aXRjaChmLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSAxID0gJWYiLCBmZFswXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTFmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDIgPSAlZiAlZiIsIGZkWzBdLCBmZFsxXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTJmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDMgPSAlZiAlZiAlZiIsIGZkWzBdLCBmZFsxXSwgZmRbMl0pOwotICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm0zZnYoc2xvdCwgMSwgZmQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSA0ID0gJWYgJWYgJWYgJWYiLCBmZFswXSwgZmRbMV0sIGZkWzJdLCBmZFszXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTRmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpZHggKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3QgZ2xTbG90ID0gc2MtPnZ0eFVuaWZvcm1TbG90KGN0ICsgMSk7Ci0KLSAgICB9CisgICAgc2V0dXBVc2VyQ29uc3RhbnRzKHJzYywgc2MsIGZhbHNlKTsKIAogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CiAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtVmVydGV4OjpzZXR1cEdMMiIpOwogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXg6OmFkZExpZ2h0KGNvbnN0IExpZ2h0ICpsKQordm9pZCBQcm9ncmFtVmVydGV4OjpzZXRQcm9qZWN0aW9uTWF0cml4KENvbnRleHQgKnJzYywgY29uc3QgcnNjX01hdHJpeCAqbSkgY29uc3QKIHsKLSAgICBpZiAobUxpZ2h0Q291bnQgPCBNQVhfTElHSFRTKSB7Ci0gICAgICAgIG1MaWdodHNbbUxpZ2h0Q291bnRdLnNldChsKTsKLSAgICAgICAgbUxpZ2h0Q291bnQrKzsKKyAgICBpZihpc1VzZXJQcm9ncmFtKCkpIHsKKyAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBzZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIG1hdHJpeCBwcm9qZWN0aW9uIG9uIHVzZXIgcHJvZ3JhbSIpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJDYW5ub3Qgc2V0IGVtdWxhdGlvbiBtYXRyaXggb24gdXNlciBzaGFkZXIiKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtVmVydGV4OjpzZXRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pIGNvbnN0Ci17CisgICAgaWYobUNvbnN0YW50c1swXS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBzZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIG1hdHJpeCBwcm9qZWN0aW9uIGJlY2F1c2UgYWxsb2NhdGlvbiBpcyBtaXNzaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPihtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSk7CiAgICAgbWVtY3B5KCZmW1JTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VUXSwgbSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKICAgICBtRGlydHkgPSB0cnVlOwogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXg6OnNldE1vZGVsdmlld01hdHJpeChjb25zdCByc2NfTWF0cml4ICptKSBjb25zdAordm9pZCBQcm9ncmFtVmVydGV4OjpzZXRNb2RlbHZpZXdNYXRyaXgoQ29udGV4dCAqcnNjLCBjb25zdCByc2NfTWF0cml4ICptKSBjb25zdAogeworICAgIGlmKGlzVXNlclByb2dyYW0oKSkgeworICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIHNldCBmaXhlZCBmdW5jdGlvbiBlbXVsYXRpb24gbWF0cml4IG1vZGVsdmlldyBvbiB1c2VyIHByb2dyYW0iKTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiQ2Fubm90IHNldCBlbXVsYXRpb24gbWF0cml4IG9uIHVzZXIgc2hhZGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYobUNvbnN0YW50c1swXS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBzZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIG1hdHJpeCBtb2RlbHZpZXcgYmVjYXVzZSBhbGxvY2F0aW9uIGlzIG1pc3NpbmciKTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiRml4ZWQgZnVuY3Rpb24gYWxsb2NhdGlvbiBtaXNzaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPihtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSk7CiAgICAgbWVtY3B5KCZmW1JTX1BST0dSQU1fVkVSVEVYX01PREVMVklFV19PRkZTRVRdLCBtLCBzaXplb2YocnNjX01hdHJpeCkpOwogICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleDo6c2V0VGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKSBjb25zdAordm9pZCBQcm9ncmFtVmVydGV4OjpzZXRUZXh0dXJlTWF0cml4KENvbnRleHQgKnJzYywgY29uc3QgcnNjX01hdHJpeCAqbSkgY29uc3QKIHsKKyAgICBpZihpc1VzZXJQcm9ncmFtKCkpIHsKKyAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBzZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIG1hdHJpeCB0ZXh0dXJlIG9uIHVzZXIgcHJvZ3JhbSIpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJDYW5ub3Qgc2V0IGVtdWxhdGlvbiBtYXRyaXggb24gdXNlciBzaGFkZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihtQ29uc3RhbnRzWzBdLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIHNldCBmaXhlZCBmdW5jdGlvbiBlbXVsYXRpb24gbWF0cml4IHRleHR1cmUgYmVjYXVzZSBhbGxvY2F0aW9uIGlzIG1pc3NpbmciKTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiRml4ZWQgZnVuY3Rpb24gYWxsb2NhdGlvbiBtaXNzaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPihtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSk7CiAgICAgbWVtY3B5KCZmW1JTX1BST0dSQU1fVkVSVEVYX1RFWFRVUkVfT0ZGU0VUXSwgbSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKICAgICBtRGlydHkgPSB0cnVlOwogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXg6OnRyYW5zZm9ybVRvU2NyZWVuKGNvbnN0IENvbnRleHQgKnJzYywgZmxvYXQgKnY0b3V0LCBjb25zdCBmbG9hdCAqdjNpbikgY29uc3QKK3ZvaWQgUHJvZ3JhbVZlcnRleDo6Z2V0UHJvamVjdGlvbk1hdHJpeChDb250ZXh0ICpyc2MsIHJzY19NYXRyaXggKm0pIGNvbnN0CiB7CisgICAgaWYoaXNVc2VyUHJvZ3JhbSgpKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gZ2V0IGZpeGVkIGZ1bmN0aW9uIGVtdWxhdGlvbiBtYXRyaXggcHJvamVjdGlvbiBvbiB1c2VyIHByb2dyYW0iKTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiQ2Fubm90IGdldCBlbXVsYXRpb24gbWF0cml4IG9uIHVzZXIgc2hhZGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYobUNvbnN0YW50c1swXS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBnZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIG1hdHJpeCBwcm9qZWN0aW9uIGJlY2F1c2UgYWxsb2NhdGlvbiBpcyBtaXNzaW5nIik7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NIQURFUiwgIkZpeGVkIGZ1bmN0aW9uIGFsbG9jYXRpb24gbWlzc2luZyIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4obUNvbnN0YW50c1swXS0+Z2V0UHRyKCkpOworICAgIG1lbWNweShtLCAmZltSU19QUk9HUkFNX1ZFUlRFWF9QUk9KRUNUSU9OX09GRlNFVF0sIHNpemVvZihyc2NfTWF0cml4KSk7Cit9CisKK3ZvaWQgUHJvZ3JhbVZlcnRleDo6dHJhbnNmb3JtVG9TY3JlZW4oQ29udGV4dCAqcnNjLCBmbG9hdCAqdjRvdXQsIGNvbnN0IGZsb2F0ICp2M2luKSBjb25zdAoreworICAgIGlmKGlzVXNlclByb2dyYW0oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4obUNvbnN0YW50c1swXS0+Z2V0UHRyKCkpOwogICAgIE1hdHJpeCBtdnA7CiAgICAgbXZwLmxvYWRNdWx0aXBseSgoTWF0cml4ICopJmZbUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVF0sCkBAIC0zMTIsNDUgKzIwMywzMSBAQAogICAgIG12cC52ZWN0b3JNdWx0aXBseSh2NG91dCwgdjNpbik7CiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleDo6aW5pdEFkZFVzZXJFbGVtZW50KGNvbnN0IEVsZW1lbnQgKmUsIFN0cmluZzggKm5hbWVzLCB1aW50MzJfdCAqY291bnQsIGNvbnN0IGNoYXIgKnByZWZpeCkKLXsKLSAgICByc0Fzc2VydChlLT5nZXRGaWVsZENvdW50KCkpOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBlLT5nZXRGaWVsZENvdW50KCk7IGN0KyspIHsKLSAgICAgICAgY29uc3QgRWxlbWVudCAqY2UgPSBlLT5nZXRGaWVsZChjdCk7Ci0gICAgICAgIGlmIChjZS0+Z2V0RmllbGRDb3VudCgpKSB7Ci0gICAgICAgICAgICBpbml0QWRkVXNlckVsZW1lbnQoY2UsIG5hbWVzLCBjb3VudCwgcHJlZml4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZzggdG1wKHByZWZpeCk7Ci0gICAgICAgICAgICB0bXAuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShjdCkpOwotICAgICAgICAgICAgbmFtZXNbKmNvdW50XS5zZXRUbyh0bXAuc3RyaW5nKCkpOwotICAgICAgICAgICAgKCpjb3VudCkrKzsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCiB2b2lkIFByb2dyYW1WZXJ0ZXg6OmluaXQoQ29udGV4dCAqcnNjKQogewogICAgIG1BdHRyaWJDb3VudCA9IDA7CiAgICAgaWYgKG1Vc2VyU2hhZGVyLnNpemUoKSA+IDApIHsKICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1JbnB1dENvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBpbml0QWRkVXNlckVsZW1lbnQobUlucHV0RWxlbWVudHNbY3RdLmdldCgpLCBtQXR0cmliTmFtZXMsICZtQXR0cmliQ291bnQsICJBVFRSSUJfIik7CisgICAgICAgICAgICBpbml0QWRkVXNlckVsZW1lbnQobUlucHV0RWxlbWVudHNbY3RdLmdldCgpLCBtQXR0cmliTmFtZXMsICZtQXR0cmliQ291bnQsIFJTX1NIQURFUl9BVFRSKTsKICAgICAgICAgfQotCi0gICAgICAgIG1Vbmlmb3JtQ291bnQgPSAxOwotICAgICAgICBtVW5pZm9ybU5hbWVzWzBdLnNldFRvKCJVTklfTVZQIik7CisgICAgICAgIG1Vbmlmb3JtQ291bnQgPSAwOwogICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIGluaXRBZGRVc2VyRWxlbWVudChtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKSwgbVVuaWZvcm1OYW1lcywgJm1Vbmlmb3JtQ291bnQsICJVTklfIik7CisgICAgICAgICAgICBpbml0QWRkVXNlckVsZW1lbnQobUNvbnN0YW50VHlwZXNbY3RdLT5nZXRFbGVtZW50KCksIG1Vbmlmb3JtTmFtZXMsICZtVW5pZm9ybUNvdW50LCBSU19TSEFERVJfVU5JKTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Vbmlmb3JtQ291bnQgPSAyOwotICAgICAgICBtVW5pZm9ybU5hbWVzWzBdLnNldFRvKCJVTklfTVZQIik7Ci0gICAgICAgIG1Vbmlmb3JtTmFtZXNbMV0uc2V0VG8oIlVOSV9UZXhNYXRyaXgiKTsKICAgICB9Ci0KICAgICBjcmVhdGVTaGFkZXIoKTsKIH0KIAordm9pZCBQcm9ncmFtVmVydGV4OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1WZXJ0ZXggKlByb2dyYW1WZXJ0ZXg6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIApAQCAtMzYyLDQ0ICsyMzksODAgQEAKIHsKIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjppbml0KENvbnRleHQgKnJzYykKIHsKLSAgICBSc0VsZW1lbnQgZSA9IChSc0VsZW1lbnQpIEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDEpOworICAgIGNvbnN0IEVsZW1lbnQgKm1hdHJpeEVsZW0gPSBFbGVtZW50OjpjcmVhdGUocnNjLCBSU19UWVBFX01BVFJJWF80WDQsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDEpOworICAgIGNvbnN0IEVsZW1lbnQgKmYyRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDIpOworICAgIGNvbnN0IEVsZW1lbnQgKmYzRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDMpOworICAgIGNvbnN0IEVsZW1lbnQgKmY0RWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDQpOwogCi0gICAgcnNpX1R5cGVCZWdpbihyc2MsIGUpOwotICAgIHJzaV9UeXBlQWRkKHJzYywgUlNfRElNRU5TSU9OX1gsIDQ4KTsKLSAgICBtQWxsb2NUeXBlLnNldCgoVHlwZSAqKXJzaV9UeXBlQ3JlYXRlKHJzYykpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckJlZ2luKCk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKG1hdHJpeEVsZW0sICJNViIsIDEpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChtYXRyaXhFbGVtLCAiUCIsIDEpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChtYXRyaXhFbGVtLCAiVGV4TWF0cml4IiwgMSk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKG1hdHJpeEVsZW0sICJNVlAiLCAxKTsKKyAgICBjb25zdCBFbGVtZW50ICpjb25zdElucHV0ID0gcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQ3JlYXRlKHJzYyk7CiAKLSAgICBQcm9ncmFtVmVydGV4ICpwdiA9IG5ldyBQcm9ncmFtVmVydGV4KHJzYywgZmFsc2UpOwotICAgIEFsbG9jYXRpb24gKmFsbG9jID0gKEFsbG9jYXRpb24gKilyc2lfQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKHJzYywgbUFsbG9jVHlwZS5nZXQoKSk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQmVnaW4oKTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQoZjRFbGVtLCAicG9zaXRpb24iLCAxKTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQoZjRFbGVtLCAiY29sb3IiLCAxKTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQoZjNFbGVtLCAibm9ybWFsIiwgMSk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKGYyRWxlbSwgInRleHR1cmUwIiwgMSk7CisgICAgY29uc3QgRWxlbWVudCAqYXR0ckVsZW0gPSByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJDcmVhdGUocnNjKTsKKworICAgIFR5cGUgKmlucHV0VHlwZSA9IG5ldyBUeXBlKHJzYyk7CisgICAgaW5wdXRUeXBlLT5zZXRFbGVtZW50KGNvbnN0SW5wdXQpOworICAgIGlucHV0VHlwZS0+c2V0RGltWCgxKTsKKyAgICBpbnB1dFR5cGUtPmNvbXB1dGUoKTsKKworICAgIFN0cmluZzggc2hhZGVyU3RyaW5nKFJTX1NIQURFUl9JTlRFUk5BTCk7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgidmFyeWluZyB2ZWM0IHZhckNvbG9yO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgidmFyeWluZyB2ZWMyIHZhclRleDA7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCIgIGdsX1Bvc2l0aW9uID0gVU5JX01WUCAqIEFUVFJJQl9wb3NpdGlvbjtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgZ2xfUG9pbnRTaXplID0gMS4wO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICB2YXJDb2xvciA9IEFUVFJJQl9jb2xvcjtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgdmFyVGV4MCA9IEFUVFJJQl90ZXh0dXJlMDtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIn1cbiIpOworCisgICAgdWludDMyX3QgdG1wWzZdOworICAgIHRtcFswXSA9IFJTX1BST0dSQU1fUEFSQU1fQ09OU1RBTlQ7CisgICAgdG1wWzFdID0gKHVpbnQzMl90KWlucHV0VHlwZTsKKyAgICB0bXBbMl0gPSBSU19QUk9HUkFNX1BBUkFNX0lOUFVUOworICAgIHRtcFszXSA9ICh1aW50MzJfdClhdHRyRWxlbTsKKyAgICB0bXBbNF0gPSBSU19QUk9HUkFNX1BBUkFNX1RFWFRVUkVfQ09VTlQ7CisgICAgdG1wWzVdID0gMDsKKworICAgIFByb2dyYW1WZXJ0ZXggKnB2ID0gbmV3IFByb2dyYW1WZXJ0ZXgocnNjLCBzaGFkZXJTdHJpbmcuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTdHJpbmcubGVuZ3RoKCksIHRtcCwgNik7CisgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBuZXcgQWxsb2NhdGlvbihyc2MsIGlucHV0VHlwZSk7CisgICAgcHYtPmJpbmRBbGxvY2F0aW9uKHJzYywgYWxsb2MsIDApOworCiAgICAgbURlZmF1bHRBbGxvYy5zZXQoYWxsb2MpOwogICAgIG1EZWZhdWx0LnNldChwdik7Ci0gICAgcHYtPmluaXQocnNjKTsKLSAgICBwdi0+YmluZEFsbG9jYXRpb24oYWxsb2MsIDApOwogCi0gICAgY29sb3JbMF0gPSAxLmY7Ci0gICAgY29sb3JbMV0gPSAxLmY7Ci0gICAgY29sb3JbMl0gPSAxLmY7Ci0gICAgY29sb3JbM10gPSAxLmY7CisgICAgdXBkYXRlU2l6ZShyc2MpOwogCi0gICAgdXBkYXRlU2l6ZShyc2MsIHcsIGgpOwogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6dXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OnVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKQogeworICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4obURlZmF1bHRBbGxvYy0+Z2V0UHRyKCkpOworCiAgICAgTWF0cml4IG07Ci0gICAgbS5sb2FkT3J0aG8oMCx3LCBoLDAsIC0xLDEpOwotICAgIG1EZWZhdWx0QWxsb2MtPnN1YkRhdGEoUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVQsIDE2LCAmbS5tWzBdLCAxNio0KTsKKyAgICBtLmxvYWRPcnRobygwLHJzYy0+Z2V0V2lkdGgoKSwgcnNjLT5nZXRIZWlnaHQoKSwwLCAtMSwxKTsKKyAgICBtZW1jcHkoJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdLCBtLm0sIHNpemVvZihtKSk7CisgICAgbWVtY3B5KCZmW1JTX1BST0dSQU1fVkVSVEVYX01WUF9PRkZTRVRdLCBtLm0sIHNpemVvZihtKSk7CiAKICAgICBtLmxvYWRJZGVudGl0eSgpOwotICAgIG1EZWZhdWx0QWxsb2MtPnN1YkRhdGEoUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVCwgMTYsICZtLm1bMF0sIDE2KjQpOworICAgIG1lbWNweSgmZltSU19QUk9HUkFNX1ZFUlRFWF9NT0RFTFZJRVdfT0ZGU0VUXSwgbS5tLCBzaXplb2YobSkpOworICAgIG1lbWNweSgmZltSU19QUk9HUkFNX1ZFUlRFWF9URVhUVVJFX09GRlNFVF0sIG0ubSwgc2l6ZW9mKG0pKTsKIH0KIAogdm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCiB7CiAgICAgbURlZmF1bHRBbGxvYy5jbGVhcigpOwogICAgIG1EZWZhdWx0LmNsZWFyKCk7Ci0gICAgbUFsbG9jVHlwZS5jbGVhcigpOwogICAgIG1MYXN0LmNsZWFyKCk7CiB9CiAKQEAgLTQwNywxNSArMzIwLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCi0KLVJzUHJvZ3JhbVZlcnRleCByc2lfUHJvZ3JhbVZlcnRleENyZWF0ZShDb250ZXh0ICpyc2MsIGJvb2wgdGV4TWF0KQotewotICAgIFByb2dyYW1WZXJ0ZXggKnB2ID0gbmV3IFByb2dyYW1WZXJ0ZXgocnNjLCB0ZXhNYXQpOwotICAgIHB2LT5pbmNVc2VyUmVmKCk7Ci0gICAgcmV0dXJuIHB2OwotfQotCi1Sc1Byb2dyYW1WZXJ0ZXggcnNpX1Byb2dyYW1WZXJ0ZXhDcmVhdGUyKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqIHNoYWRlclRleHQsCitSc1Byb2dyYW1WZXJ0ZXggcnNpX1Byb2dyYW1WZXJ0ZXhDcmVhdGUoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2hhZGVyTGVuZ3RoLCBjb25zdCB1aW50MzJfdCAqIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1MZW5ndGgpCiB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaAppbmRleCAyODU1NGNjLi4zNTVkZjJiIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKQEAgLTI4LDQwICsyOCwyNiBAQAogY2xhc3MgUHJvZ3JhbVZlcnRleCA6IHB1YmxpYyBQcm9ncmFtCiB7CiBwdWJsaWM6Ci0gICAgY29uc3Qgc3RhdGljIHVpbnQzMl90IE1BWF9MSUdIVFMgPSA4OwotCiAgICAgUHJvZ3JhbVZlcnRleChDb250ZXh0ICosY29uc3QgY2hhciAqIHNoYWRlclRleHQsIHVpbnQzMl90IHNoYWRlckxlbmd0aCwKICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICogcGFyYW1zLCB1aW50MzJfdCBwYXJhbUxlbmd0aCk7Ci0gICAgUHJvZ3JhbVZlcnRleChDb250ZXh0ICosIGJvb2wgdGV4TWF0KTsKICAgICB2aXJ0dWFsIH5Qcm9ncmFtVmVydGV4KCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1WZXJ0ZXhTdGF0ZSAqc3RhdGUpOwotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1WZXJ0ZXhTdGF0ZSAqc3RhdGUsIFNoYWRlckNhY2hlICpzYyk7CisgICAgdmlydHVhbCB2b2lkIHNldHVwR0wyKENvbnRleHQgKnJzYywgUHJvZ3JhbVZlcnRleFN0YXRlICpzdGF0ZSwgU2hhZGVyQ2FjaGUgKnNjKTsKIAorICAgIHZvaWQgc2V0UHJvamVjdGlvbk1hdHJpeChDb250ZXh0ICosIGNvbnN0IHJzY19NYXRyaXggKikgY29uc3Q7CisgICAgdm9pZCBnZXRQcm9qZWN0aW9uTWF0cml4KENvbnRleHQgKiwgcnNjX01hdHJpeCAqKSBjb25zdDsKKyAgICB2b2lkIHNldE1vZGVsdmlld01hdHJpeChDb250ZXh0ICosIGNvbnN0IHJzY19NYXRyaXggKikgY29uc3Q7CisgICAgdm9pZCBzZXRUZXh0dXJlTWF0cml4KENvbnRleHQgKiwgY29uc3QgcnNjX01hdHJpeCAqKSBjb25zdDsKIAotICAgIHZvaWQgc2V0VGV4dHVyZU1hdHJpeEVuYWJsZShib29sIGUpIHttVGV4dHVyZU1hdHJpeEVuYWJsZSA9IGU7fQotICAgIHZvaWQgYWRkTGlnaHQoY29uc3QgTGlnaHQgKik7Ci0KLSAgICB2b2lkIHNldFByb2plY3Rpb25NYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqKSBjb25zdDsKLSAgICB2b2lkIHNldE1vZGVsdmlld01hdHJpeChjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwotICAgIHZvaWQgc2V0VGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwotCi0gICAgdm9pZCB0cmFuc2Zvcm1Ub1NjcmVlbihjb25zdCBDb250ZXh0ICosIGZsb2F0ICp2NG91dCwgY29uc3QgZmxvYXQgKnYzaW4pIGNvbnN0OworICAgIHZvaWQgdHJhbnNmb3JtVG9TY3JlZW4oQ29udGV4dCAqLCBmbG9hdCAqdjRvdXQsIGNvbnN0IGZsb2F0ICp2M2luKSBjb25zdDsKIAogICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVTaGFkZXIoKTsKICAgICB2aXJ0dWFsIHZvaWQgbG9hZFNoYWRlcihDb250ZXh0ICopOwogICAgIHZpcnR1YWwgdm9pZCBpbml0KENvbnRleHQgKik7CiAKLQotcHJvdGVjdGVkOgotICAgIHVpbnQzMl90IG1MaWdodENvdW50OwotICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgTGlnaHQ+IG1MaWdodHNbTUFYX0xJR0hUU107Ci0KLSAgICAvLyBIYWNrcyB0byBjcmVhdGUgYSBwcm9ncmFtIGZvciBub3cKLSAgICBib29sIG1UZXh0dXJlTWF0cml4RW5hYmxlOwotCi1wcml2YXRlOgotICAgIHZvaWQgaW5pdEFkZFVzZXJFbGVtZW50KGNvbnN0IEVsZW1lbnQgKmUsIFN0cmluZzggKm5hbWVzLCB1aW50MzJfdCAqY291bnQsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9WRVJURVg7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVZlcnRleCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiB9OwogCiAKQEAgLTcxLDE4ICs1NywxMyBAQAogICAgIFByb2dyYW1WZXJ0ZXhTdGF0ZSgpOwogICAgIH5Qcm9ncmFtVmVydGV4U3RhdGUoKTsKIAotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotICAgIHZvaWQgdXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIHVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbURlZmF1bHQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtTGFzdDsKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1EZWZhdWx0QWxsb2M7Ci0KLSAgICBPYmplY3RCYXNlUmVmPFR5cGU+IG1BbGxvY1R5cGU7Ci0KLQotICAgIGZsb2F0IGNvbG9yWzRdOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2FtcGxlci5jcHAgYi9saWJzL3JzL3JzU2FtcGxlci5jcHAKaW5kZXggNzFmNTA4Zi4uMTgwZDc4ZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NhbXBsZXIuY3BwCisrKyBiL2xpYnMvcnMvcnNTYW1wbGVyLmNwcApAQCAtMTQsMTAgKzE0LDE2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsZXh0Lmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKICNpbmNsdWRlICJyc1NhbXBsZXIuaCIKIAogCkBAIC0zOCw3ICs0NCw4IEBACiAgICAgICAgICAgICAgICAgIFJzU2FtcGxlclZhbHVlIG1pbkZpbHRlciwKICAgICAgICAgICAgICAgICAgUnNTYW1wbGVyVmFsdWUgd3JhcFMsCiAgICAgICAgICAgICAgICAgIFJzU2FtcGxlclZhbHVlIHdyYXBULAotICAgICAgICAgICAgICAgICBSc1NhbXBsZXJWYWx1ZSB3cmFwUikgOiBPYmplY3RCYXNlKHJzYykKKyAgICAgICAgICAgICAgICAgUnNTYW1wbGVyVmFsdWUgd3JhcFIsCisgICAgICAgICAgICAgICAgIGZsb2F0IGFuaXNvKSA6IE9iamVjdEJhc2UocnNjKQogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CkBAIC00NywxMyArNTQsMTQgQEAKICAgICBtV3JhcFMgPSB3cmFwUzsKICAgICBtV3JhcFQgPSB3cmFwVDsKICAgICBtV3JhcFIgPSB3cmFwUjsKKyAgICBtQW5pc28gPSBhbmlzbzsKIH0KIAogU2FtcGxlcjo6flNhbXBsZXIoKQogewogfQogCi12b2lkIFNhbXBsZXI6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBib29sIG5wb3QpCit2b2lkIFNhbXBsZXI6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBjb25zdCBBbGxvY2F0aW9uICp0ZXgpCiB7CiAgICAgR0xlbnVtIHRyYW5zW10gPSB7CiAgICAgICAgIEdMX05FQVJFU1QsIC8vUlNfU0FNUExFUl9ORUFSRVNULApAQCAtNjEsMjUgKzY5LDM4IEBACiAgICAgICAgIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSLCAvL1JTX1NBTVBMRVJfTElORUFSX01JUF9MSU5FQVIsCiAgICAgICAgIEdMX1JFUEVBVCwgLy9SU19TQU1QTEVSX1dSQVAsCiAgICAgICAgIEdMX0NMQU1QX1RPX0VER0UsIC8vUlNfU0FNUExFUl9DTEFNUAotCiAgICAgfTsKIAotICAgIGJvb2wgZm9yY2VOb25NaXAgPSBmYWxzZTsKLSAgICBpZiAoIXJzYy0+ZXh0X09FU190ZXh0dXJlX25wb3QoKSAmJiBucG90KSB7Ci0gICAgICAgIGZvcmNlTm9uTWlwID0gdHJ1ZTsKLSAgICB9CisgICAgR0xlbnVtIHRyYW5zTlBbXSA9IHsKKyAgICAgICAgR0xfTkVBUkVTVCwgLy9SU19TQU1QTEVSX05FQVJFU1QsCisgICAgICAgIEdMX0xJTkVBUiwgLy9SU19TQU1QTEVSX0xJTkVBUiwKKyAgICAgICAgR0xfTElORUFSLCAvL1JTX1NBTVBMRVJfTElORUFSX01JUF9MSU5FQVIsCisgICAgICAgIEdMX0NMQU1QX1RPX0VER0UsIC8vUlNfU0FNUExFUl9XUkFQLAorICAgICAgICBHTF9DTEFNUF9UT19FREdFLCAvL1JTX1NBTVBMRVJfQ0xBTVAKKyAgICB9OwogCi0gICAgaWYgKChtTWluRmlsdGVyID09IFJTX1NBTVBMRVJfTElORUFSX01JUF9MSU5FQVIpICYmIGZvcmNlTm9uTWlwKSB7Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgaWYgKCFyc2MtPmV4dF9PRVNfdGV4dHVyZV9ucG90KCkgJiYgdGV4LT5nZXRUeXBlKCktPmdldElzTnAyKCkpIHsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgdHJhbnNOUFttTWluRmlsdGVyXSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIHRyYW5zTlBbbU1hZ0ZpbHRlcl0pOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIHRyYW5zTlBbbVdyYXBTXSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgdHJhbnNOUFttV3JhcFRdKTsKICAgICB9IGVsc2UgewotICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCB0cmFuc1ttTWluRmlsdGVyXSk7CisgICAgICAgIGlmICh0ZXgtPmdldEhhc0dyYXBoaWNzTWlwbWFwcygpKSB7CisgICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCB0cmFuc1ttTWluRmlsdGVyXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCB0cmFuc05QW21NaW5GaWx0ZXJdKTsKKyAgICAgICAgfQorICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCB0cmFuc1ttTWFnRmlsdGVyXSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgdHJhbnNbbVdyYXBTXSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgdHJhbnNbbVdyYXBUXSk7CiAgICAgfQotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIHRyYW5zW21NYWdGaWx0ZXJdKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIHRyYW5zW21XcmFwU10pOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgdHJhbnNbbVdyYXBUXSk7CiAKKyAgICBmbG9hdCBhbmlzb1ZhbHVlID0gcnNNaW4ocnNjLT5leHRfdGV4dHVyZV9tYXhfYW5pc28oKSwgbUFuaXNvKTsKKyAgICBpZihyc2MtPmV4dF90ZXh0dXJlX21heF9hbmlzbygpID4gMS4wZikgeworICAgICAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIGFuaXNvVmFsdWUpOworICAgIH0KIAotICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiB0ZXggZW52Iik7CisgICAgcnNjLT5jaGVja0Vycm9yKCJTYW1wbGVyOjpzZXR1cEdMMiB0ZXggZW52Iik7CiB9CiAKIHZvaWQgU2FtcGxlcjo6YmluZFRvQ29udGV4dChTYW1wbGVyU3RhdGUgKnNzLCB1aW50MzJfdCBzbG90KQpAQCAtOTQsNiArMTE1LDE3IEBACiAgICAgbUJvdW5kU2xvdCA9IC0xOwogICAgIHNzLT5tU2FtcGxlcnNbc2xvdF0uY2xlYXIoKTsKIH0KKwordm9pZCBTYW1wbGVyOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1NhbXBsZXIgKlNhbXBsZXI6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIC8qCiB2b2lkIFNhbXBsZXJTdGF0ZTo6c2V0dXBHTCgpCiB7CkBAIC0xMjIsNiArMTU0LDcgQEAKICAgICBzcy0+bVdyYXBTID0gUlNfU0FNUExFUl9XUkFQOwogICAgIHNzLT5tV3JhcFQgPSBSU19TQU1QTEVSX1dSQVA7CiAgICAgc3MtPm1XcmFwUiA9IFJTX1NBTVBMRVJfV1JBUDsKKyAgICBzcy0+bUFuaXNvID0gMS4wZjsKIH0KIAogdm9pZCByc2lfU2FtcGxlclNldChDb250ZXh0ICpyc2MsIFJzU2FtcGxlclBhcmFtIHBhcmFtLCBSc1NhbXBsZXJWYWx1ZSB2YWx1ZSkKQEAgLTE0NCwyMSArMTc3LDM3IEBACiAgICAgY2FzZSBSU19TQU1QTEVSX1dSQVBfUjoKICAgICAgICAgc3MtPm1XcmFwUiA9IHZhbHVlOwogICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIHNldCBpbnZhbGlkIHZhbHVlIG9uIHNhbXBsZXIiKTsKKyAgICAgICAgYnJlYWs7CiAgICAgfQorfQogCit2b2lkIHJzaV9TYW1wbGVyU2V0MihDb250ZXh0ICpyc2MsIFJzU2FtcGxlclBhcmFtIHBhcmFtLCBmbG9hdCB2YWx1ZSkKK3sKKyAgICBTYW1wbGVyU3RhdGUgKiBzcyA9ICZyc2MtPm1TdGF0ZVNhbXBsZXI7CisKKyAgICBzd2l0Y2gocGFyYW0pIHsKKyAgICBjYXNlIFJTX1NBTVBMRVJfQU5JU086CisgICAgICAgIHNzLT5tQW5pc28gPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBzZXQgaW52YWxpZCB2YWx1ZSBvbiBzYW1wbGVyIik7CisgICAgICAgIGJyZWFrOworICAgIH0KIH0KIAogUnNTYW1wbGVyIHJzaV9TYW1wbGVyQ3JlYXRlKENvbnRleHQgKnJzYykKIHsKICAgICBTYW1wbGVyU3RhdGUgKiBzcyA9ICZyc2MtPm1TdGF0ZVNhbXBsZXI7CiAKLQogICAgIFNhbXBsZXIgKiBzID0gbmV3IFNhbXBsZXIocnNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3MtPm1NYWdGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcy0+bU1pbkZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzLT5tV3JhcFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcy0+bVdyYXBULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3MtPm1XcmFwUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcy0+bVdyYXBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3MtPm1Bbmlzbyk7CiAgICAgcy0+aW5jVXNlclJlZigpOwogICAgIHJldHVybiBzOwogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NhbXBsZXIuaCBiL2xpYnMvcnMvcnNTYW1wbGVyLmgKaW5kZXggMDUwNjA4MS4uNDk0NjM1NSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NhbXBsZXIuaAorKysgYi9saWJzL3JzL3JzU2FtcGxlci5oCkBAIC0zNiwyMiArMzYsMjggQEAKICAgICAgICAgICAgIFJzU2FtcGxlclZhbHVlIG1pbkZpbHRlciwKICAgICAgICAgICAgIFJzU2FtcGxlclZhbHVlIHdyYXBTLAogICAgICAgICAgICAgUnNTYW1wbGVyVmFsdWUgd3JhcFQsCi0gICAgICAgICAgICBSc1NhbXBsZXJWYWx1ZSB3cmFwUik7CisgICAgICAgICAgICBSc1NhbXBsZXJWYWx1ZSB3cmFwUiwKKyAgICAgICAgICAgIGZsb2F0IGFuaXNvID0gMS4wZik7CiAKICAgICB2aXJ0dWFsIH5TYW1wbGVyKCk7CiAKICAgICB2b2lkIGJpbmQoQWxsb2NhdGlvbiAqKTsKLSAgICB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqLCBib29sIG5wb3QpOworICAgIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIGNvbnN0IEFsbG9jYXRpb24gKik7CiAKICAgICB2b2lkIGJpbmRUb0NvbnRleHQoU2FtcGxlclN0YXRlICosIHVpbnQzMl90IHNsb3QpOwogICAgIHZvaWQgdW5iaW5kRnJvbUNvbnRleHQoU2FtcGxlclN0YXRlICopOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0FNUExFUjsgfQorICAgIHN0YXRpYyBTYW1wbGVyICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIFJzU2FtcGxlclZhbHVlIG1NYWdGaWx0ZXI7CiAgICAgUnNTYW1wbGVyVmFsdWUgbU1pbkZpbHRlcjsKICAgICBSc1NhbXBsZXJWYWx1ZSBtV3JhcFM7CiAgICAgUnNTYW1wbGVyVmFsdWUgbVdyYXBUOwogICAgIFJzU2FtcGxlclZhbHVlIG1XcmFwUjsKKyAgICBmbG9hdCBtQW5pc287CiAKICAgICBpbnQzMl90IG1Cb3VuZFNsb3Q7CiAKQEAgLTcwLDYgKzc2LDcgQEAKICAgICBSc1NhbXBsZXJWYWx1ZSBtV3JhcFM7CiAgICAgUnNTYW1wbGVyVmFsdWUgbVdyYXBUOwogICAgIFJzU2FtcGxlclZhbHVlIG1XcmFwUjsKKyAgICBmbG9hdCBtQW5pc287CiAKIAogICAgIE9iamVjdEJhc2VSZWY8U2FtcGxlcj4gbVNhbXBsZXJzW1JTX01BWF9TQU1QTEVSX1NMT1RdOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdC5jcHAgYi9saWJzL3JzL3JzU2NyaXB0LmNwcAppbmRleCBhMzM5MzNiLi4wZTc2ZGFlIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0LmNwcAorKysgYi9saWJzL3JzL3JzU2NyaXB0LmNwcApAQCAtMjQsMTcgKzI0LDUwIEBACiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKICAgICBtZW1zZXQoJm1FbnZpcm9tZW50LCAwLCBzaXplb2YobUVudmlyb21lbnQpKTsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclswXSA9IDA7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbMV0gPSAwOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdID0gMDsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclszXSA9IDE7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyRGVwdGggPSAxOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhclN0ZW5jaWwgPSAwOwotICAgIG1FbnZpcm9tZW50Lm1Jc1Jvb3QgPSBmYWxzZTsKKworICAgIG1TbG90cyA9IE5VTEw7CisgICAgbVR5cGVzID0gTlVMTDsKIH0KIAogU2NyaXB0Ojp+U2NyaXB0KCkKIHsKKyAgICBpZihtU2xvdHMpIHsKKyAgICAgICAgZGVsZXRlIFtdIG1TbG90czsKKyAgICAgICAgbVNsb3RzID0gTlVMTDsKKyAgICB9CisgICAgaWYobVR5cGVzKSB7CisgICAgICAgIGRlbGV0ZSBbXSBtVHlwZXM7CisgICAgICAgIG1UeXBlcyA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIFNjcmlwdDo6aW5pdFNsb3RzKCkgeworICAgIGlmKG1FbnZpcm9tZW50Lm1GaWVsZENvdW50ID4gMCkgeworICAgICAgICBtU2xvdHMgPSBuZXcgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPlttRW52aXJvbWVudC5tRmllbGRDb3VudF07CisgICAgICAgIG1UeXBlcyA9IG5ldyBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+W21FbnZpcm9tZW50Lm1GaWVsZENvdW50XTsKKyAgICB9Cit9CisKK3ZvaWQgU2NyaXB0OjpzZXRTbG90KHVpbnQzMl90IHNsb3QsIEFsbG9jYXRpb24gKmEpIHsKKyAgICBpZihzbG90ID49IG1FbnZpcm9tZW50Lm1GaWVsZENvdW50KSB7CisgICAgICAgIExPR0UoIlNjcmlwdDo6c2V0U2xvdCB1bmFibGUgdG8gc2V0IGFsbG9jYXRpb24sIGludmFsaWQgc2xvdCBpbmRleCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVNsb3RzW3Nsb3RdLnNldChhKTsKK30KKwordm9pZCBTY3JpcHQ6OnNldFZhcih1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICp2YWwsIHVpbnQzMl90IGxlbikKK3sKKyAgICBpbnQzMl90ICpkZXN0UHRyID0gKChpbnQzMl90ICoqKW1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MpW3Nsb3RdOworICAgIGlmIChkZXN0UHRyKSB7CisgICAgICAgIC8vTE9HRSgic2V0VmFyIGYxICAlZiIsICgoY29uc3QgZmxvYXQgKilkZXN0UHRyKVswXSk7CisgICAgICAgIC8vTE9HRSgic2V0VmFyICVwICVpIiwgZGVzdFB0ciwgbGVuKTsKKyAgICAgICAgbWVtY3B5KGRlc3RQdHIsIHZhbCwgbGVuKTsKKyAgICAgICAgLy9MT0dFKCJzZXRWYXIgZjIgICVmIiwgKChjb25zdCBmbG9hdCAqKWRlc3RQdHIpWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJDYWxsaW5nIHNldFZhciBvbiBzbG90ID0gJWkgd2hpY2ggaXMgbnVsbCIsIHNsb3QpOworICAgIH0KIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDQsMTYgKzc3LDkgQEAKIHZvaWQgcnNpX1NjcmlwdEJpbmRBbGxvY2F0aW9uKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCiB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBzLT5tU2xvdHNbc2xvdF0uc2V0KHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJDb2xvcihDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gcjsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IGc7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSBiOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gYTsKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgcy0+c2V0U2xvdChzbG90LCBhKTsKKyAgICAvL0xPR0UoInJzaV9TY3JpcHRCaW5kQWxsb2NhdGlvbiAlaSAgJXAgICVwIiwgc2xvdCwgYSwgYS0+Z2V0UHRyKCkpOwogfQogCiB2b2lkIHJzaV9TY3JpcHRTZXRUaW1lWm9uZShDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgY29uc3QgY2hhciAqIHRpbWVab25lLCB1aW50MzJfdCBsZW5ndGgpCkBAIC02Miw1MyArODgsNDggQEAKICAgICBzLT5tRW52aXJvbWVudC5tVGltZVpvbmUgPSB0aW1lWm9uZTsKIH0KIAotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJEZXB0aChDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgdikKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoID0gdjsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCB2KQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyU3RlbmNpbCA9IHY7Ci19Ci0KLXZvaWQgcnNpX1NjcmlwdFNldFR5cGUoQ29udGV4dCAqIHJzYywgUnNUeXBlIHZ0LCB1aW50MzJfdCBzbG90LCBib29sIHdyaXRhYmxlLCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBjb25zdCBUeXBlICp0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSAqPih2dCk7Ci0gICAgc3MtPm1Db25zdGFudEJ1ZmZlclR5cGVzW3Nsb3RdLnNldCh0KTsKLSAgICBzcy0+bVNsb3RXcml0YWJsZVtzbG90XSA9IHdyaXRhYmxlOwotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKCIiKTsKLSAgICB9Ci19Ci0KLXZvaWQgcnNpX1NjcmlwdFNldEludm9rZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHNsb3QpCi17Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tSW52b2thYmxlTmFtZXNbc2xvdF0gPSBuYW1lOwotfQotCiB2b2lkIHJzaV9TY3JpcHRJbnZva2UoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCkKIHsKICAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIGlmIChzLT5tRW52aXJvbWVudC5tSW52b2thYmxlc1tzbG90XSA9PSBOVUxMKSB7Ci0gICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgIkNhbGxpbmcgaW52b2tlIG9uIGJhZCBzY3JpcHQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzLT5zZXR1cFNjcmlwdCgpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1JbnZva2FibGVzW3Nsb3RdKCk7CisgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgTlVMTCwgMCk7CiB9CiAKIAotdm9pZCByc2lfU2NyaXB0U2V0Um9vdChDb250ZXh0ICogcnNjLCBib29sIGlzUm9vdCkKK3ZvaWQgcnNpX1NjcmlwdEludm9rZURhdGEoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgdm9pZCAqZGF0YSkKIHsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1TY3JpcHQtPm1FbnZpcm9tZW50Lm1Jc1Jvb3QgPSBpc1Jvb3Q7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5JbnZva2UocnNjLCBzbG90LCBOVUxMLCAwKTsKK30KKwordm9pZCByc2lfU2NyaXB0SW52b2tlVihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5JbnZva2UocnNjLCBzbG90LCBkYXRhLCBsZW4pOworfQorCit2b2lkIHJzaV9TY3JpcHRTZXRWYXJJKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGludCB2YWx1ZSkKK3sKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnNldFZhcihzbG90LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworfQorCit2b2lkIHJzaV9TY3JpcHRTZXRWYXJGKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGZsb2F0IHZhbHVlKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhckQoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgZG91YmxlIHZhbHVlKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhclYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIGNvbnN0IGZsb2F0ICpmcCA9IChjb25zdCBmbG9hdCAqKWRhdGE7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgZGF0YSwgbGVuKTsKIH0KIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0LmggYi9saWJzL3JzL3JzU2NyaXB0LmgKaW5kZXggNWY0YTUzNi4uYzczYmI1ZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdC5oCisrKyBiL2xpYnMvcnMvcnNTY3JpcHQuaApAQCAtMjcsOSArMjcsNyBAQAogY2xhc3MgUHJvZ3JhbVZlcnRleDsKIGNsYXNzIFByb2dyYW1GcmFnbWVudDsKIGNsYXNzIFByb2dyYW1SYXN0ZXI7Ci1jbGFzcyBQcm9ncmFtRnJhZ21lbnRTdG9yZTsKLQotI2RlZmluZSBNQVhfU0NSSVBUX0JBTktTIDE2CitjbGFzcyBQcm9ncmFtU3RvcmU7CiAKIGNsYXNzIFNjcmlwdCA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CkBAIC0zOSwzOCArMzcsNDUgQEAKICAgICBTY3JpcHQoQ29udGV4dCAqKTsKICAgICB2aXJ0dWFsIH5TY3JpcHQoKTsKIAotCiAgICAgc3RydWN0IEVudmlyb21lbnRfdCB7Ci0gICAgICAgIGJvb2wgbUlzUm9vdDsKLSAgICAgICAgZmxvYXQgbUNsZWFyQ29sb3JbNF07Ci0gICAgICAgIGZsb2F0IG1DbGVhckRlcHRoOwotICAgICAgICB1aW50MzJfdCBtQ2xlYXJTdGVuY2lsOwotCi0gICAgICAgIHVpbnQzMl90IG1TdGFydFRpbWVNaWxsaXM7CisgICAgICAgIGludDY0X3QgbVN0YXJ0VGltZU1pbGxpczsKKyAgICAgICAgaW50NjRfdCBtTGFzdER0VGltZTsKICAgICAgICAgY29uc3QgY2hhciogbVRpbWVab25lOwogCiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbVZlcnRleDsKICAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1GcmFnbWVudDsKICAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtUmFzdGVyOwotICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKLSAgICAgICAgSW52b2tlRnVuY190IG1JbnZva2FibGVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZyYWdtZW50U3RvcmU7CisKKyAgICAgICAgdWludDMyX3QgbUludm9rZUZ1bmN0aW9uQ291bnQ7CisgICAgICAgIEludm9rZUZ1bmNfdCAqbUludm9rZUZ1bmN0aW9uczsKKyAgICAgICAgdWludDMyX3QgbUZpZWxkQ291bnQ7CisgICAgICAgIHZvaWQgKiogbUZpZWxkQWRkcmVzczsKKwogICAgICAgICBjaGFyICogbVNjcmlwdFRleHQ7CiAgICAgICAgIHVpbnQzMl90IG1TY3JpcHRUZXh0TGVuZ3RoOworCisgICAgICAgIGJvb2wgbUlzVGhyZWFkYWJsZTsKICAgICB9OwogICAgIEVudmlyb21lbnRfdCBtRW52aXJvbWVudDsKIAotICAgIHVpbnQzMl90IG1Db3Vuc3RhbnRCdWZmZXJDb3VudDsKKyAgICB2b2lkIGluaXRTbG90cygpOworICAgIHZvaWQgc2V0U2xvdCh1aW50MzJfdCBzbG90LCBBbGxvY2F0aW9uICphKTsKKyAgICB2b2lkIHNldFZhcih1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICp2YWwsIHVpbnQzMl90IGxlbik7CiAKKyAgICB2aXJ0dWFsIHZvaWQgcnVuRm9yRWFjaChDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdGlvbiAqIGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICogYW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogdXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqc2MgPSBOVUxMKSA9IDA7CiAKLSAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1TbG90c1tNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1UeXBlc1tNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBTdHJpbmc4IG1TbG90TmFtZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgYm9vbCBtU2xvdFdyaXRhYmxlW01BWF9TQ1JJUFRfQkFOS1NdOworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoQ29udGV4dCAqcnNjKSA9IDA7CisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKSA9IDA7Citwcm90ZWN0ZWQ6CisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiAqbVNsb3RzOworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gKm1UeXBlczsKIAotCi0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoKSA9IDA7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Qy5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKaW5kZXggZjRkMjQ1MS4uZDk2MWZlZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdEMuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDLmNwcApAQCAtMTcsOSArMTcsOSBAQAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCi0KLSNpbmNsdWRlICJhY2MvYWNjLmgiCisjaW5jbHVkZSAiLi4vLi4vY29tcGlsZS9saWJiY2MvaW5jbHVkZS9iY2MvYmNjLmgiCiAjaW5jbHVkZSAidXRpbHMvVGltZXJzLmgiCisjaW5jbHVkZSAidXRpbHMvU3RvcFdhdGNoLmgiCiAKICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgpAQCAtMzcsNDAgKzM3LDg0IEBACiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICBtQWNjU2NyaXB0ID0gTlVMTDsKKyAgICBtQmNjU2NyaXB0ID0gTlVMTDsKICAgICBtZW1zZXQoJm1Qcm9ncmFtLCAwLCBzaXplb2YobVByb2dyYW0pKTsKIH0KIAogU2NyaXB0Qzo6flNjcmlwdEMoKQogewotICAgIGlmIChtQWNjU2NyaXB0KSB7Ci0gICAgICAgIGFjY0RlbGV0ZVNjcmlwdChtQWNjU2NyaXB0KTsKKyAgICBpZiAobUJjY1NjcmlwdCkgeworICAgICAgICBiY2NEZWxldGVTY3JpcHQobUJjY1NjcmlwdCk7CiAgICAgfQogICAgIGZyZWUobUVudmlyb21lbnQubVNjcmlwdFRleHQpOwogICAgIG1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0ID0gTlVMTDsKIH0KIAotdm9pZCBTY3JpcHRDOjpzZXR1cFNjcmlwdCgpCit2b2lkIFNjcmlwdEM6OnNldHVwU2NyaXB0KENvbnRleHQgKnJzYykKIHsKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdKSB7Ci0gICAgICAgICAgICAqbVByb2dyYW0ubVNsb3RQb2ludGVyc1tjdF0gPSBtU2xvdHNbY3RdLT5nZXRQdHIoKTsKKyAgICBzZXR1cEdMU3RhdGUocnNjKTsKKyAgICBtRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzCisgICAgICAgICAgICAgICAgPSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKKworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRW52aXJvbWVudC5tRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBpZiAobVNsb3RzW2N0XS5nZXQoKSAmJiAhbVR5cGVzW2N0XS5nZXQoKSkgeworICAgICAgICAgICAgbVR5cGVzW2N0XS5zZXQobVNsb3RzW2N0XS0+Z2V0VHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbVR5cGVzW2N0XS5nZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB2b2lkICpwdHIgPSBOVUxMOworICAgICAgICBpZiAobVNsb3RzW2N0XS5nZXQoKSkgeworICAgICAgICAgICAgcHRyID0gbVNsb3RzW2N0XS0+Z2V0UHRyKCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCAqKmRlc3QgPSAoKHZvaWQgKioqKW1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MpW2N0XTsKKworICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgeworICAgICAgICAgICAgTE9HVigiJXAgU2NyaXB0Qzo6c2V0dXBTY3JpcHQgc2xvdD0laSAgZHN0PSVwICBzcmM9JXAgIHR5cGU9JXAiLCByc2MsIGN0LCBkZXN0LCBwdHIsIG1TbG90c1tjdF0tPmdldFR5cGUoKSk7CisKKyAgICAgICAgICAgIC8vY29uc3QgdWludDMyX3QgKnAzMiA9IChjb25zdCB1aW50MzJfdCAqKXB0cjsKKyAgICAgICAgICAgIC8vZm9yICh1aW50MzJfdCBjdDI9MDsgY3QyIDwgbVNsb3RzW2N0XS0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7IGN0MisrKSB7CisgICAgICAgICAgICAgICAgLy9MT0dFKCIgICVpID0gMHglMDh4ICIsIGN0MiwgcDMyW2N0Ml0pOworICAgICAgICAgICAgLy99CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdCkgeworICAgICAgICAgICAgKmRlc3QgPSBwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJTY3JpcHRDOjpzZXR1cFNjcmlwdCwgTlVMTCB2YXIgYmluZGluZyBhZGRyZXNzLiIpOwogICAgICAgICB9CiAgICAgfQogfQogCi0KLXVpbnQzMl90IFNjcmlwdEM6OnJ1bihDb250ZXh0ICpyc2MsIHVpbnQzMl90IGxhdW5jaEluZGV4KQorY29uc3QgQWxsb2NhdGlvbiAqU2NyaXB0Qzo6cHRyVG9BbGxvY2F0aW9uKGNvbnN0IHZvaWQgKnB0cikgY29uc3QKIHsKLSAgICBpZiAobVByb2dyYW0ubVNjcmlwdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgIkF0dGVtcHRlZCB0byBydW4gYmFkIHNjcmlwdCIpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXB0cikgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1FbnZpcm9tZW50Lm1GaWVsZENvdW50OyBjdCsrKSB7CisgICAgICAgIGlmICghbVNsb3RzW2N0XS5nZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAobVNsb3RzW2N0XS0+Z2V0UHRyKCkgPT0gcHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbVNsb3RzW2N0XS5nZXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJTY3JpcHRDOjpwdHJUb0FsbG9jYXRpb24sIGZhaWxlZCB0byBmaW5kICVwIiwgcHRyKTsKKyAgICByZXR1cm4gTlVMTDsKK30KIAotICAgIENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqIHRscyA9Ci0gICAgKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7CitTY3JpcHQgKiBTY3JpcHRDOjpzZXRUTFMoU2NyaXB0ICpzYykKK3sKKyAgICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPSAoQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9nZXRzcGVjaWZpYyhDb250ZXh0OjpnVGhyZWFkVExTS2V5KTsKICAgICByc0Fzc2VydCh0bHMpOworICAgIFNjcmlwdCAqb2xkID0gdGxzLT5tU2NyaXB0OworICAgIHRscy0+bVNjcmlwdCA9IHNjOworICAgIHJldHVybiBvbGQ7Cit9CiAKKwordm9pZCBTY3JpcHRDOjpzZXR1cEdMU3RhdGUoQ29udGV4dCAqcnNjKQorewogICAgIGlmIChtRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5nZXQoKSkgewogICAgICAgICByc2MtPnNldEZyYWdtZW50U3RvcmUobUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuZ2V0KCkpOwogICAgIH0KQEAgLTgzLDUxICsxMjcsMjYyIEBACiAgICAgaWYgKG1FbnZpcm9tZW50Lm1SYXN0ZXIuZ2V0KCkpIHsKICAgICAgICAgcnNjLT5zZXRSYXN0ZXIobUVudmlyb21lbnQubVJhc3Rlci5nZXQoKSk7CiAgICAgfQorfQogCi0gICAgaWYgKGxhdW5jaEluZGV4ID09IDApIHsKLSAgICAgICAgbUVudmlyb21lbnQubVN0YXJ0VGltZU1pbGxpcwotICAgICAgICAgICAgICAgID0gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSk7Cit1aW50MzJfdCBTY3JpcHRDOjpydW4oQ29udGV4dCAqcnNjKQoreworICAgIGlmIChtUHJvZ3JhbS5tUm9vdCA9PSBOVUxMKSB7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgIkF0dGVtcHRlZCB0byBydW4gYmFkIHNjcmlwdCIpOworICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgc2V0dXBTY3JpcHQoKTsKKworICAgIHNldHVwU2NyaXB0KHJzYyk7CiAKICAgICB1aW50MzJfdCByZXQgPSAwOwotICAgIHRscy0+bVNjcmlwdCA9IHRoaXM7Ci0gICAgcmV0ID0gbVByb2dyYW0ubVNjcmlwdChsYXVuY2hJbmRleCk7Ci0gICAgdGxzLT5tU2NyaXB0ID0gTlVMTDsKKyAgICBTY3JpcHQgKiBvbGRUTFMgPSBzZXRUTFModGhpcyk7CisKKyAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgeworICAgICAgICBMT0dWKCIlcCBTY3JpcHRDOjpydW4gaW52b2tpbmcgcm9vdCwgIHB0ciAlcCIsIHJzYywgbVByb2dyYW0ubVJvb3QpOworICAgIH0KKworICAgIHJldCA9IG1Qcm9ncmFtLm1Sb290KCk7CisKKyAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgeworICAgICAgICBMT0dWKCIlcCBTY3JpcHRDOjpydW4gaW52b2tpbmcgY29tcGxldGUsIHJldD0laSIsIHJzYywgcmV0KTsKKyAgICB9CisKKyAgICBzZXRUTFMob2xkVExTKTsKICAgICByZXR1cm4gcmV0OwogfQogCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDb250ZXh0ICpyc2M7CisgICAgU2NyaXB0QyAqc2NyaXB0OworICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW47CisgICAgQWxsb2NhdGlvbiAqIGFvdXQ7CisgICAgY29uc3Qgdm9pZCAqIHVzcjsKKworICAgIHVpbnQzMl90IG1TbGljZVNpemU7CisgICAgdm9sYXRpbGUgaW50IG1TbGljZU51bTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ckluOworICAgIHVpbnQzMl90IGVTdHJpZGVJbjsKKyAgICB1aW50OF90ICpwdHJPdXQ7CisgICAgdWludDMyX3QgZVN0cmlkZU91dDsKKworICAgIHVpbnQzMl90IHhTdGFydDsKKyAgICB1aW50MzJfdCB4RW5kOworICAgIHVpbnQzMl90IHlTdGFydDsKKyAgICB1aW50MzJfdCB5RW5kOworICAgIHVpbnQzMl90IHpTdGFydDsKKyAgICB1aW50MzJfdCB6RW5kOworICAgIHVpbnQzMl90IGFycmF5U3RhcnQ7CisgICAgdWludDMyX3QgYXJyYXlFbmQ7CisKKyAgICB1aW50MzJfdCBkaW1YOworICAgIHVpbnQzMl90IGRpbVk7CisgICAgdWludDMyX3QgZGltWjsKKyAgICB1aW50MzJfdCBkaW1BcnJheTsKK30gTVRMYXVuY2hTdHJ1Y3Q7Cit0eXBlZGVmIGludCAoKnJzX3QpKGNvbnN0IHZvaWQgKiwgdm9pZCAqLCBjb25zdCB2b2lkICosIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90KTsKKworc3RhdGljIHZvaWQgd2NfeHkodm9pZCAqdXNyLCB1aW50MzJfdCBpZHgpCit7CisgICAgTVRMYXVuY2hTdHJ1Y3QgKm10bHMgPSAoTVRMYXVuY2hTdHJ1Y3QgKil1c3I7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB1aW50MzJfdCBzbGljZSA9ICh1aW50MzJfdClhbmRyb2lkX2F0b21pY19pbmMoJm10bHMtPm1TbGljZU51bSk7CisgICAgICAgIHVpbnQzMl90IHlTdGFydCA9IG10bHMtPnlTdGFydCArIHNsaWNlICogbXRscy0+bVNsaWNlU2l6ZTsKKyAgICAgICAgdWludDMyX3QgeUVuZCA9IHlTdGFydCArIG10bHMtPm1TbGljZVNpemU7CisgICAgICAgIHlFbmQgPSByc01pbih5RW5kLCBtdGxzLT55RW5kKTsKKyAgICAgICAgaWYgKHlFbmQgPD0geVN0YXJ0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvL0xPR0UoInVzciBpZHggJWksIHggJWksJWkgIHkgJWksJWkiLCBpZHgsIG10bHMtPnhTdGFydCwgbXRscy0+eEVuZCwgeVN0YXJ0LCB5RW5kKTsKKyAgICAgICAgLy9MT0dFKCJ1c3IgcHRyIGluICVwLCAgb3V0ICVwIiwgbXRscy0+cHRySW4sIG10bHMtPnB0ck91dCk7CisgICAgICAgIGZvciAodWludDMyX3QgeSA9IHlTdGFydDsgeSA8IHlFbmQ7IHkrKykgeworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gbXRscy0+ZGltWCAqIHk7CisgICAgICAgICAgICB1aW50OF90ICp4UHRyT3V0ID0gbXRscy0+cHRyT3V0ICsgKG10bHMtPmVTdHJpZGVPdXQgKiBvZmZzZXQpOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqeFB0ckluID0gbXRscy0+cHRySW4gKyAobXRscy0+ZVN0cmlkZUluICogb2Zmc2V0KTsKKworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gbXRscy0+eFN0YXJ0OyB4IDwgbXRscy0+eEVuZDsgeCsrKSB7CisgICAgICAgICAgICAgICAgKChyc190KW10bHMtPnNjcmlwdC0+bVByb2dyYW0ubVJvb3QpICh4UHRySW4sIHhQdHJPdXQsIG10bHMtPnVzciwgeCwgeSwgMCwgMCk7CisgICAgICAgICAgICAgICAgeFB0ckluICs9IG10bHMtPmVTdHJpZGVJbjsKKyAgICAgICAgICAgICAgICB4UHRyT3V0ICs9IG10bHMtPmVTdHJpZGVPdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKwordm9pZCBTY3JpcHRDOjpydW5Gb3JFYWNoKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uICogYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKiBhb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB1c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpzYykKK3sKKyAgICBNVExhdW5jaFN0cnVjdCBtdGxzOworICAgIG1lbXNldCgmbXRscywgMCwgc2l6ZW9mKG10bHMpKTsKKworICAgIGlmIChhaW4pIHsKKyAgICAgICAgbXRscy5kaW1YID0gYWluLT5nZXRUeXBlKCktPmdldERpbVgoKTsKKyAgICAgICAgbXRscy5kaW1ZID0gYWluLT5nZXRUeXBlKCktPmdldERpbVkoKTsKKyAgICAgICAgbXRscy5kaW1aID0gYWluLT5nZXRUeXBlKCktPmdldERpbVooKTsKKyAgICAgICAgLy9tdGxzLmRpbUFycmF5ID0gYWluLT5nZXRUeXBlKCktPmdldERpbUFycmF5KCk7CisgICAgfSBlbHNlIGlmIChhb3V0KSB7CisgICAgICAgIG10bHMuZGltWCA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RGltWCgpOworICAgICAgICBtdGxzLmRpbVkgPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbVkoKTsKKyAgICAgICAgbXRscy5kaW1aID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1aKCk7CisgICAgICAgIC8vbXRscy5kaW1BcnJheSA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RGltQXJyYXkoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJyc0ZvckVhY2ggY2FsbGVkIHdpdGggbnVsbCBhbGxvY2F0aW9ucyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFzYyB8fCAoc2MtPnhFbmQgPT0gMCkpIHsKKyAgICAgICAgbXRscy54RW5kID0gbXRscy5kaW1YOworICAgIH0gZWxzZSB7CisgICAgICAgIHJzQXNzZXJ0KHNjLT54U3RhcnQgPCBtdGxzLmRpbVgpOworICAgICAgICByc0Fzc2VydChzYy0+eEVuZCA8PSBtdGxzLmRpbVgpOworICAgICAgICByc0Fzc2VydChzYy0+eFN0YXJ0IDwgc2MtPnhFbmQpOworICAgICAgICBtdGxzLnhTdGFydCA9IHJzTWluKG10bHMuZGltWCwgc2MtPnhTdGFydCk7CisgICAgICAgIG10bHMueEVuZCA9IHJzTWluKG10bHMuZGltWCwgc2MtPnhFbmQpOworICAgICAgICBpZiAobXRscy54U3RhcnQgPj0gbXRscy54RW5kKSByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFzYyB8fCAoc2MtPnlFbmQgPT0gMCkpIHsKKyAgICAgICAgbXRscy55RW5kID0gbXRscy5kaW1ZOworICAgIH0gZWxzZSB7CisgICAgICAgIHJzQXNzZXJ0KHNjLT55U3RhcnQgPCBtdGxzLmRpbVkpOworICAgICAgICByc0Fzc2VydChzYy0+eUVuZCA8PSBtdGxzLmRpbVkpOworICAgICAgICByc0Fzc2VydChzYy0+eVN0YXJ0IDwgc2MtPnlFbmQpOworICAgICAgICBtdGxzLnlTdGFydCA9IHJzTWluKG10bHMuZGltWSwgc2MtPnlTdGFydCk7CisgICAgICAgIG10bHMueUVuZCA9IHJzTWluKG10bHMuZGltWSwgc2MtPnlFbmQpOworICAgICAgICBpZiAobXRscy55U3RhcnQgPj0gbXRscy55RW5kKSByZXR1cm47CisgICAgfQorCisgICAgbXRscy54RW5kID0gcnNNYXgoKHVpbnQzMl90KTEsIG10bHMueEVuZCk7CisgICAgbXRscy55RW5kID0gcnNNYXgoKHVpbnQzMl90KTEsIG10bHMueUVuZCk7CisgICAgbXRscy56RW5kID0gcnNNYXgoKHVpbnQzMl90KTEsIG10bHMuekVuZCk7CisgICAgbXRscy5hcnJheUVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLmFycmF5RW5kKTsKKworICAgIHJzQXNzZXJ0KGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1aKCkgPT0gMCk7CisKKyAgICBzZXR1cFNjcmlwdChyc2MpOworICAgIFNjcmlwdCAqIG9sZFRMUyA9IHNldFRMUyh0aGlzKTsKKworCisgICAgbXRscy5yc2MgPSByc2M7CisgICAgbXRscy5haW4gPSBhaW47CisgICAgbXRscy5hb3V0ID0gYW91dDsKKyAgICBtdGxzLnNjcmlwdCA9IHRoaXM7CisgICAgbXRscy51c3IgPSB1c3I7CisgICAgbXRscy5tU2xpY2VTaXplID0gMTA7CisgICAgbXRscy5tU2xpY2VOdW0gPSAwOworCisgICAgbXRscy5wdHJJbiA9IE5VTEw7CisgICAgbXRscy5lU3RyaWRlSW4gPSAwOworICAgIGlmIChhaW4pIHsKKyAgICAgICAgbXRscy5wdHJJbiA9IChjb25zdCB1aW50OF90ICopYWluLT5nZXRQdHIoKTsKKyAgICAgICAgbXRscy5lU3RyaWRlSW4gPSBhaW4tPmdldFR5cGUoKS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOworICAgIH0KKworICAgIG10bHMucHRyT3V0ID0gTlVMTDsKKyAgICBtdGxzLmVTdHJpZGVPdXQgPSAwOworICAgIGlmIChhb3V0KSB7CisgICAgICAgIG10bHMucHRyT3V0ID0gKHVpbnQ4X3QgKilhb3V0LT5nZXRQdHIoKTsKKyAgICAgICAgbXRscy5lU3RyaWRlT3V0ID0gYW91dC0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCk7CisgICAgfQorCisgICAgaWYgKChyc2MtPmdldFdvcmtlclBvb2xTaXplKCkgPiAxKSAmJiBtRW52aXJvbWVudC5tSXNUaHJlYWRhYmxlICYmIChtdGxzLmRpbVkgPiAxKSkgeworCisgICAgICAgIC8vTE9HRSgibGF1bmNoIDEiKTsKKyAgICAgICAgcnNjLT5sYXVuY2hUaHJlYWRzKHdjX3h5LCAmbXRscyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy9MT0dFKCJsYXVuY2ggMyIpOworICAgICAgICBmb3IgKHVpbnQzMl90IGFyID0gbXRscy5hcnJheVN0YXJ0OyBhciA8IG10bHMuYXJyYXlFbmQ7IGFyKyspIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgeiA9IG10bHMuelN0YXJ0OyB6IDwgbXRscy56RW5kOyB6KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHkgPSBtdGxzLnlTdGFydDsgeSA8IG10bHMueUVuZDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IG10bHMuZGltWCAqIG10bHMuZGltWSAqIG10bHMuZGltWiAqIGFyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRscy5kaW1YICogbXRscy5kaW1ZICogeiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10bHMuZGltWCAqIHk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnhQdHJPdXQgPSBtdGxzLnB0ck91dCArIChtdGxzLmVTdHJpZGVPdXQgKiBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp4UHRySW4gPSBtdGxzLnB0ckluICsgKG10bHMuZVN0cmlkZUluICogb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHggPSBtdGxzLnhTdGFydDsgeCA8IG10bHMueEVuZDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKHJzX3QpbVByb2dyYW0ubVJvb3QpICh4UHRySW4sIHhQdHJPdXQsIHVzciwgeCwgeSwgeiwgYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgeFB0ckluICs9IG10bHMuZVN0cmlkZUluOworICAgICAgICAgICAgICAgICAgICAgICAgeFB0ck91dCArPSBtdGxzLmVTdHJpZGVPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZXRUTFMob2xkVExTKTsKK30KKwordm9pZCBTY3JpcHRDOjpJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgLy9MT0dFKCJyc2lfU2NyaXB0SW52b2tlICVpIiwgc2xvdCk7CisgICAgaWYgKChzbG90ID49IG1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50KSB8fAorICAgICAgICAobUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSA9PSBOVUxMKSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJDYWxsaW5nIGludm9rZSBvbiBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0dXBTY3JpcHQocnNjKTsKKyAgICBTY3JpcHQgKiBvbGRUTFMgPSBzZXRUTFModGhpcyk7CisKKyAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgeworICAgICAgICBMT0dWKCIlcCBTY3JpcHRDOjpJbnZva2UgaW52b2tpbmcgc2xvdCAlaSwgIHB0ciAlcCIsIHJzYywgc2xvdCwgbUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSk7CisgICAgfQorICAgICgodm9pZCAoKikoY29uc3Qgdm9pZCAqLCB1aW50MzJfdCkpCisgICAgICAgIG1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnNbc2xvdF0pKGRhdGEsIGxlbik7CisgICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKKyAgICAgICAgTE9HVigiJXAgU2NyaXB0Qzo6SW52b2tlIGNvbXBsZXRlIiwgcnNjKTsKKyAgICB9CisKKyAgICBzZXRUTFMob2xkVExTKTsKK30KKwogU2NyaXB0Q1N0YXRlOjpTY3JpcHRDU3RhdGUoKQogewotICAgIG1TY3JpcHQgPSBOVUxMOwotICAgIGNsZWFyKCk7CisgICAgbVNjcmlwdC5jbGVhcigpOwogfQogCiBTY3JpcHRDU3RhdGU6On5TY3JpcHRDU3RhdGUoKQogewotICAgIGRlbGV0ZSBtU2NyaXB0OwotICAgIG1TY3JpcHQgPSBOVUxMOworICAgIG1TY3JpcHQuY2xlYXIoKTsKIH0KIAotdm9pZCBTY3JpcHRDU3RhdGU6OmNsZWFyKCkKK3ZvaWQgU2NyaXB0Q1N0YXRlOjppbml0KENvbnRleHQgKnJzYykKIHsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBtQ29uc3RhbnRCdWZmZXJUeXBlc1tjdF0uY2xlYXIoKTsKLSAgICAgICAgbVNsb3ROYW1lc1tjdF0uc2V0VG8oIiIpOwotICAgICAgICBtSW52b2thYmxlTmFtZXNbY3RdLnNldFRvKCIiKTsKLSAgICAgICAgbVNsb3RXcml0YWJsZVtjdF0gPSBmYWxzZTsKKyAgICBjbGVhcihyc2MpOworfQorCit2b2lkIFNjcmlwdENTdGF0ZTo6Y2xlYXIoQ29udGV4dCAqcnNjKQoreworICAgIHJzQXNzZXJ0KHJzYyk7CisgICAgbVNjcmlwdC5jbGVhcigpOworICAgIG1TY3JpcHQuc2V0KG5ldyBTY3JpcHRDKHJzYykpOworfQorCitzdGF0aWMgQkNDdm9pZCogc3ltYm9sTG9va3VwKEJDQ3ZvaWQqIHBDb250ZXh0LCBjb25zdCBCQ0NjaGFyKiBuYW1lKQoreworICAgIGNvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltOworICAgIFNjcmlwdEMgKnMgPSAoU2NyaXB0QyAqKXBDb250ZXh0OworICAgIHN5bSA9IFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sKG5hbWUpOworICAgIGlmIChzeW0pIHsKKyAgICAgICAgcmV0dXJuIHN5bS0+bVB0cjsKICAgICB9Ci0KLSAgICBkZWxldGUgbVNjcmlwdDsKLSAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdEMoTlVMTCk7Ci0KLSAgICBtSW50MzJEZWZpbmVzLmNsZWFyKCk7Ci0gICAgbUZsb2F0RGVmaW5lcy5jbGVhcigpOwotfQotCi1zdGF0aWMgQUNDdm9pZCogc3ltYm9sTG9va3VwKEFDQ3ZvaWQqIHBDb250ZXh0LCBjb25zdCBBQ0NjaGFyKiBuYW1lKQotewotICAgIGNvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2wobmFtZSk7CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xDTChuYW1lKTsKKyAgICBpZiAoc3ltKSB7CisgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CisgICAgfQorICAgIHMtPm1FbnZpcm9tZW50Lm1Jc1RocmVhZGFibGUgPSBmYWxzZTsKKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbEdMKG5hbWUpOwogICAgIGlmIChzeW0pIHsKICAgICAgICAgcmV0dXJuIHN5bS0+bVB0cjsKICAgICB9CkBAIC0xMzcsNjUgKzM5Miw1MyBAQAogCiB2b2lkIFNjcmlwdENTdGF0ZTo6cnVuQ29tcGlsZXIoQ29udGV4dCAqcnNjLCBTY3JpcHRDICpzKQogewotICAgIHMtPm1BY2NTY3JpcHQgPSBhY2NDcmVhdGVTY3JpcHQoKTsKLSAgICBTdHJpbmc4IHRtcDsKLQotICAgIHJzYy0+YXBwZW5kTmFtZURlZmluZXMoJnRtcCk7Ci0gICAgYXBwZW5kRGVjbHMoJnRtcCk7Ci0gICAgYXBwZW5kVmFyRGVmaW5lcyhyc2MsICZ0bXApOwotICAgIGFwcGVuZFR5cGVzKHJzYywgJnRtcCk7Ci0gICAgdG1wLmFwcGVuZCgiI2xpbmUgMVxuIik7Ci0KLSAgICBjb25zdCBjaGFyKiBzY3JpcHRTb3VyY2VbXSA9IHt0bXAuc3RyaW5nKCksIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0fTsKLSAgICBpbnQgc2NyaXB0TGVuZ3RoW10gPSB7dG1wLmxlbmd0aCgpLCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dExlbmd0aH0gOwotICAgIGFjY1NjcmlwdFNvdXJjZShzLT5tQWNjU2NyaXB0LCBzaXplb2Yoc2NyaXB0TGVuZ3RoKSAvIHNpemVvZihpbnQpLCBzY3JpcHRTb3VyY2UsIHNjcmlwdExlbmd0aCk7Ci0gICAgYWNjUmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhzLT5tQWNjU2NyaXB0LCBzeW1ib2xMb29rdXAsIE5VTEwpOwotICAgIGFjY0NvbXBpbGVTY3JpcHQocy0+bUFjY1NjcmlwdCk7Ci0gICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwgIm1haW4iLCAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVNjcmlwdCk7Ci0gICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwgImluaXQiLCAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubUluaXQpOwotICAgIHJzQXNzZXJ0KHMtPm1Qcm9ncmFtLm1TY3JpcHQpOwotCi0gICAgaWYgKCFzLT5tUHJvZ3JhbS5tU2NyaXB0KSB7Ci0gICAgICAgIEFDQ2NoYXIgYnVmWzQwOTZdOwotICAgICAgICBBQ0NzaXplaSBsZW47Ci0gICAgICAgIGFjY0dldFNjcmlwdEluZm9Mb2cocy0+bUFjY1NjcmlwdCwgc2l6ZW9mKGJ1ZiksICZsZW4sIGJ1Zik7Ci0gICAgICAgIExPR0UoIiVzIiwgYnVmKTsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiRXJyb3IgY29tcGlsaW5nIHVzZXIgc2NyaXB0LiIpOwotICAgICAgICByZXR1cm47CisgICAgTE9HVigiJXAgU2NyaXB0Q1N0YXRlOjpydW5Db21waWxlciAiLCByc2MpOworICAgIHsKKyAgICAgICAgU3RvcFdhdGNoIGNvbXBpbGVUaW1lcigiUmVuZGVyU2NyaXB0IGNvbXBpbGUgdGltZSIpOworICAgICAgICBzLT5tQmNjU2NyaXB0ID0gYmNjQ3JlYXRlU2NyaXB0KCk7CisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1Jc1RocmVhZGFibGUgPSB0cnVlOworICAgICAgICBiY2NTY3JpcHRCaXRjb2RlKHMtPm1CY2NTY3JpcHQsIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0LCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dExlbmd0aCk7CisgICAgICAgIGJjY1JlZ2lzdGVyU3ltYm9sQ2FsbGJhY2socy0+bUJjY1NjcmlwdCwgc3ltYm9sTG9va3VwLCBzKTsKKyAgICAgICAgYmNjQ29tcGlsZVNjcmlwdChzLT5tQmNjU2NyaXB0KTsKKyAgICAgICAgYmNjR2V0U2NyaXB0TGFiZWwocy0+bUJjY1NjcmlwdCwgInJvb3QiLCAoQkNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVJvb3QpOworICAgICAgICBiY2NHZXRTY3JpcHRMYWJlbChzLT5tQmNjU2NyaXB0LCAiaW5pdCIsIChCQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tSW5pdCk7CiAgICAgfQorICAgIExPR1YoIiVwIFNjcmlwdENTdGF0ZTo6cnVuQ29tcGlsZXIgcm9vdCAlcCwgIGluaXQgJXAiLCByc2MsIHMtPm1Qcm9ncmFtLm1Sb290LCBzLT5tUHJvZ3JhbS5tSW5pdCk7CiAKICAgICBpZiAocy0+bVByb2dyYW0ubUluaXQpIHsKICAgICAgICAgcy0+bVByb2dyYW0ubUluaXQoKTsKICAgICB9CiAKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1TbG90TmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbG90TmFtZXNbY3RdLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdKTsKLSAgICAgICAgfQorICAgIGJjY0dldEV4cG9ydEZ1bmNzKHMtPm1CY2NTY3JpcHQsIChCQ0NzaXplaSopICZzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgMCwgTlVMTCk7CisgICAgaWYocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQgPD0gMCkKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMgPSAoU2NyaXB0OjpJbnZva2VGdW5jX3QqKSBjYWxsb2Mocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIHNpemVvZihTY3JpcHQ6Okludm9rZUZ1bmNfdCkpOworICAgICAgICBiY2NHZXRFeHBvcnRGdW5jcyhzLT5tQmNjU2NyaXB0LCBOVUxMLCBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgKEJDQ3ZvaWQgKiopIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMpOwogICAgIH0KIAotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBpZiAobUludm9rYWJsZU5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW52b2thYmxlTmFtZXNbY3RdLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFDQ3ZvaWQqKikgJnMtPm1FbnZpcm9tZW50Lm1JbnZva2FibGVzW2N0XSk7Ci0gICAgICAgIH0KKyAgICBiY2NHZXRFeHBvcnRWYXJzKHMtPm1CY2NTY3JpcHQsIChCQ0NzaXplaSopICZzLT5tRW52aXJvbWVudC5tRmllbGRDb3VudCwgMCwgTlVMTCk7CisgICAgaWYocy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQgPD0gMCkKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUZpZWxkQWRkcmVzcyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MgPSAodm9pZCAqKikgY2FsbG9jKHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50LCBzaXplb2Yodm9pZCAqKSk7CisgICAgICAgIGJjY0dldEV4cG9ydFZhcnMocy0+bUJjY1NjcmlwdCwgTlVMTCwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQsIChCQ0N2b2lkICoqKSBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKTsKKyAgICAgICAgcy0+aW5pdFNsb3RzKCk7CiAgICAgfQogCiAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnQoKSk7CiAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKLSAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50U3RvcmUoKSk7CisgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpKTsKICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkpOwogCi0gICAgaWYgKHMtPm1Qcm9ncmFtLm1TY3JpcHQpIHsKKyAgICBpZiAocy0+bVByb2dyYW0ubVJvb3QpIHsKICAgICAgICAgY29uc3Qgc3RhdGljIGludCBwcmFnbWFNYXggPSAxNjsKLSAgICAgICAgQUNDc2l6ZWkgcHJhZ21hQ291bnQ7Ci0gICAgICAgIEFDQ2NoYXIgKiBzdHJbcHJhZ21hTWF4XTsKLSAgICAgICAgYWNjR2V0UHJhZ21hcyhzLT5tQWNjU2NyaXB0LCAmcHJhZ21hQ291bnQsIHByYWdtYU1heCwgJnN0clswXSk7CisgICAgICAgIEJDQ3NpemVpIHByYWdtYUNvdW50OworICAgICAgICBCQ0NjaGFyICogc3RyW3ByYWdtYU1heF07CisgICAgICAgIGJjY0dldFByYWdtYXMocy0+bUJjY1NjcmlwdCwgJnByYWdtYUNvdW50LCBwcmFnbWFNYXgsICZzdHJbMF0pOwogCiAgICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgcHJhZ21hQ291bnQ7IGN0Kz0yKSB7CisgICAgICAgICAgICAvL0xPR0UoInByYWdtZSAlcyAlcyIsIHN0cltjdF0sIHN0cltjdCsxXSk7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChzdHJbY3RdLCAidmVyc2lvbiIpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0yMDgsMTEgKzQ1MSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb2dyYW1WZXJ0ZXggKiBwdiA9IChQcm9ncmFtVmVydGV4ICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHB2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocHYpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTE9HRSgiVW5yZWNvbml6ZWQgdmFsdWUgJXMgcGFzc2VkIHRvIHN0YXRlVmVydGV4Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjI0LDExICs0NjIsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtUmFzdGVyICogcHIgPSAoUHJvZ3JhbVJhc3RlciAqKXJzYy0+bG9va3VwTmFtZShzdHJbY3QrMV0pOwotICAgICAgICAgICAgICAgIGlmIChwciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1SYXN0ZXIuc2V0KHByKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZVJhc3RlciIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI0MCwxMSArNDczLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQgKiBwZiA9IChQcm9ncmFtRnJhZ21lbnQgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnQuc2V0KHBmKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZUZyYWdtZW50Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjU2LDEyICs0ODQsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBwZnMgPQotICAgICAgICAgICAgICAgICAgICAoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGZzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHBmcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVTdG9yZSIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI3MywxMTEgKzQ5NSw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhcHBlbmRFbGVtZW50Qm9keShTdHJpbmc4ICpzLCBjb25zdCBFbGVtZW50ICplKQotewotICAgIHMtPmFwcGVuZCgiIHtcbiIpOwotICAgIGZvciAoc2l6ZV90IGN0Mj0wOyBjdDIgPCBlLT5nZXRGaWVsZENvdW50KCk7IGN0MisrKSB7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmMgPSBlLT5nZXRGaWVsZChjdDIpOwotICAgICAgICBzLT5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGMtPmdldENUeXBlKCkpOwotICAgICAgICBzLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGUtPmdldEZpZWxkTmFtZShjdDIpKTsKLSAgICAgICAgcy0+YXBwZW5kKCI7XG4iKTsKLSAgICB9Ci0gICAgcy0+YXBwZW5kKCJ9Iik7Ci19Ci0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRWYXJEZWZpbmVzKGNvbnN0IENvbnRleHQgKnJzYywgU3RyaW5nOCAqc3RyKQotewotICAgIGNoYXIgYnVmWzI1Nl07Ci0gICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKLSAgICAgICAgTE9HRCgiYXBwZW5kVmFyRGVmaW5lcyBtSW50MzJEZWZpbmVzLnNpemUoKT0lZCBtRmxvYXREZWZpbmVzLnNpemUoKT0lZFxuIiwKLSAgICAgICAgICAgICAgICBtSW50MzJEZWZpbmVzLnNpemUoKSwgbUZsb2F0RGVmaW5lcy5zaXplKCkpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1JbnQzMkRlZmluZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICBzdHItPmFwcGVuZChtSW50MzJEZWZpbmVzLmtleUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbUludDMyRGVmaW5lcy52YWx1ZUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbUZsb2F0RGVmaW5lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1GbG9hdERlZmluZXMua2V5QXQoY3QpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlZmZcbiIsIG1GbG9hdERlZmluZXMudmFsdWVBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZChidWYpOwotICAgIH0KLX0KLQotCi0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRUeXBlcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cikKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIFN0cmluZzggdG1wOwotCi0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNGMzJfMl9zIHtmbG9hdCB4OyBmbG9hdCB5O307XG4iKTsKLSAgICBzdHItPmFwcGVuZCgic3RydWN0IHZlY0YzMl8zX3Mge2Zsb2F0IHg7IGZsb2F0IHk7IGZsb2F0IHo7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjRjMyXzRfcyB7ZmxvYXQgeDsgZmxvYXQgeTsgZmxvYXQgejsgZmxvYXQgdzt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNVOF80X3Mge2NoYXIgcjsgY2hhciBnOyBjaGFyIGI7IGNoYXIgYTt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzJfdCBzdHJ1Y3QgdmVjRjMyXzJfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzNfdCBzdHJ1Y3QgdmVjRjMyXzNfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzRfdCBzdHJ1Y3QgdmVjRjMyXzRfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjVThfNF90IHN0cnVjdCB2ZWNVOF80X3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0k4XzRfdCBzdHJ1Y3QgdmVjVThfNF9zXG4iKTsKLQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBjb25zdCBUeXBlICp0ID0gbUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpOwotICAgICAgICBpZiAoIXQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSB0LT5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlLT5nZXROYW1lKCkgJiYgKGUtPmdldEZpZWxkQ291bnQoKSA+IDEpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHMoInN0cnVjdCBzdHJ1Y3RfIik7Ci0gICAgICAgICAgICBzLmFwcGVuZChlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0Q1N0cnVjdEJvZHkoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJfdCBzdHJ1Y3Qgc3RydWN0XyIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJcblxuIik7Ci0gICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgewotICAgICAgICAgICAgICAgIExPR1YoIiVzIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci0+YXBwZW5kKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TbG90TmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nOCBzOwotICAgICAgICAgICAgaWYgKGUtPmdldE5hbWUoKSkgewotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgbmFtZWQgc3RydWN0Ci0gICAgICAgICAgICAgICAgcy5zZXRUbyhlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gc3RydWN0IG5hbWVkIGZyb20gdGhlIHNsb3QuCi0gICAgICAgICAgICAgICAgcy5zZXRUbygic3RydWN0ICIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiX3MiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChlLT5nZXRDU3RydWN0Qm9keSgpKTsKLSAgICAgICAgICAgICAgICAvL2FwcGVuZEVsZW1lbnRCb2R5KCZzLCBlKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoInN0cnVjdCAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIl9zIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIgKiAiKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCI7XG4iKTsKLSAgICAgICAgICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiJXMiLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4ocykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyLT5hcHBlbmQocyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzg2LDE0ICs1MDMsNyBAQAogdm9pZCByc2lfU2NyaXB0Q0JlZ2luKENvbnRleHQgKiByc2MpCiB7CiAgICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5jbGVhcigpOwotfQotCi12b2lkIHJzaV9TY3JpcHRDU2V0U2NyaXB0KENvbnRleHQgKiByc2MsIHZvaWQgKnZwKQotewotICAgIHJzQXNzZXJ0KDApOwotICAgIC8vU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIC8vc3MtPm1Qcm9ncmFtLm1TY3JpcHQgPSByZWludGVycHJldF9jYXN0PFNjcmlwdEM6OlJ1blNjcmlwdF90Pih2cCk7CisgICAgc3MtPmNsZWFyKHJzYyk7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdENTZXRUZXh0KENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuKQpAQCAtNDEyLDMyICs1MjIsMTUgQEAKIHsKICAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7CiAKLSAgICBTY3JpcHRDICpzID0gc3MtPm1TY3JpcHQ7Ci0gICAgc3MtPm1TY3JpcHQgPSBOVUxMOworICAgIE9iamVjdEJhc2VSZWY8U2NyaXB0Qz4gcyA9IHNzLT5tU2NyaXB0LmdldCgpOworICAgIHNzLT5tU2NyaXB0LmNsZWFyKCk7CiAKLSAgICBzcy0+cnVuQ29tcGlsZXIocnNjLCBzKTsKKyAgICBzcy0+cnVuQ29tcGlsZXIocnNjLCBzLmdldCgpKTsKICAgICBzLT5pbmNVc2VyUmVmKCk7CiAgICAgcy0+c2V0Q29udGV4dChyc2MpOwotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBzLT5tVHlwZXNbY3RdLnNldChzcy0+bUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpKTsKLSAgICAgICAgcy0+bVNsb3ROYW1lc1tjdF0gPSBzcy0+bVNsb3ROYW1lc1tjdF07Ci0gICAgICAgIHMtPm1TbG90V3JpdGFibGVbY3RdID0gc3MtPm1TbG90V3JpdGFibGVbY3RdOwotICAgIH0KIAotICAgIHNzLT5jbGVhcigpOwotICAgIHJldHVybiBzOwotfQotCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lRihDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKQotewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBzcy0+bUZsb2F0RGVmaW5lcy5hZGQoU3RyaW5nOChuYW1lKSwgdmFsdWUpOwotfQotCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lSTMyKENvbnRleHQgKnJzYywgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1JbnQzMkRlZmluZXMuYWRkKFN0cmluZzgobmFtZSksIHZhbHVlKTsKKyAgICBzcy0+Y2xlYXIocnNjKTsKKyAgICByZXR1cm4gcy5nZXQoKTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdEMuaCBiL2xpYnMvcnMvcnNTY3JpcHRDLmgKaW5kZXggMzVhYmFkZi4uZTViNWJhOSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdEMuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0Qy5oCkBAIC0yMSw5ICsyMSw3IEBACiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHRFbnYuaCIKIAotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLXN0cnVjdCBBQ0NzY3JpcHQ7CitzdHJ1Y3QgQkNDc2NyaXB0OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM0LDcgKzMyLDcgQEAKIGNsYXNzIFNjcmlwdEMgOiBwdWJsaWMgU2NyaXB0CiB7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnQgKCpSdW5TY3JpcHRfdCkodWludDMyX3QgbGF1bmNoSW5kZXgpOworICAgIHR5cGVkZWYgaW50ICgqUnVuU2NyaXB0X3QpKCk7CiAgICAgdHlwZWRlZiB2b2lkICgqVm9pZEZ1bmNfdCkoKTsKIAogICAgIFNjcmlwdEMoQ29udGV4dCAqKTsKQEAgLTQ0LDE4ICs0MiwzNSBAQAogICAgICAgICBpbnQgbVZlcnNpb25NYWpvcjsKICAgICAgICAgaW50IG1WZXJzaW9uTWlub3I7CiAKLSAgICAgICAgUnVuU2NyaXB0X3QgbVNjcmlwdDsKKyAgICAgICAgUnVuU2NyaXB0X3QgbVJvb3Q7CiAgICAgICAgIFZvaWRGdW5jX3QgbUluaXQ7Ci0KLSAgICAgICAgdm9pZCAqKiBtU2xvdFBvaW50ZXJzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIH07CiAKICAgICBQcm9ncmFtX3QgbVByb2dyYW07CiAKLSAgICBBQ0NzY3JpcHQqICAgIG1BY2NTY3JpcHQ7CisgICAgQkNDc2NyaXB0KiAgICBtQmNjU2NyaXB0OwogCi0gICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KCk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqcHRyVG9BbGxvY2F0aW9uKGNvbnN0IHZvaWQgKikgY29uc3Q7CisKKworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pOworCisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKTsKKworICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uICogYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKiBhb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB1c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpzYyA9IE5VTEwpOworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0NSSVBUX0M7IH0KKyAgICBzdGF0aWMgVHlwZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkgeyByZXR1cm4gTlVMTDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICopOworICAgIHZvaWQgc2V0dXBHTFN0YXRlKENvbnRleHQgKik7CisgICAgU2NyaXB0ICogc2V0VExTKFNjcmlwdCAqKTsKIH07CiAKIGNsYXNzIFNjcmlwdENTdGF0ZQpAQCAtNjQsMzAgKzc5LDIxIEBACiAgICAgU2NyaXB0Q1N0YXRlKCk7CiAgICAgflNjcmlwdENTdGF0ZSgpOwogCi0gICAgU2NyaXB0QyAqbVNjcmlwdDsKKyAgICBPYmplY3RCYXNlUmVmPFNjcmlwdEM+IG1TY3JpcHQ7CiAKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1Db25zdGFudEJ1ZmZlclR5cGVzW01BWF9TQ1JJUFRfQkFOS1NdOwotICAgIFN0cmluZzggbVNsb3ROYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBib29sIG1TbG90V3JpdGFibGVbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtSW52b2thYmxlTmFtZXNbTUFYX1NDUklQVF9CQU5LU107CisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CiAKLSAgICB2b2lkIGNsZWFyKCk7CisgICAgdm9pZCBjbGVhcihDb250ZXh0ICpyc2MpOwogICAgIHZvaWQgcnVuQ29tcGlsZXIoQ29udGV4dCAqcnNjLCBTY3JpcHRDICpzKTsKLSAgICB2b2lkIGFwcGVuZFZhckRlZmluZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwotICAgIHZvaWQgYXBwZW5kVHlwZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwogCiAgICAgc3RydWN0IFN5bWJvbFRhYmxlX3QgewogICAgICAgICBjb25zdCBjaGFyICogbU5hbWU7CiAgICAgICAgIHZvaWQgKiBtUHRyOwotICAgICAgICBjb25zdCBjaGFyICogbVJldDsKLSAgICAgICAgY29uc3QgY2hhciAqIG1QYXJhbTsKICAgICB9OwotICAgIHN0YXRpYyBTeW1ib2xUYWJsZV90IGdTeW1zW107CisgICAgLy9zdGF0aWMgU3ltYm9sVGFibGVfdCBnU3ltc1tdOwogICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sKGNvbnN0IGNoYXIgKik7Ci0gICAgc3RhdGljIHZvaWQgYXBwZW5kRGVjbHMoU3RyaW5nOCAqc3RyKTsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsaW50PiBtSW50MzJEZWZpbmVzOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsZmxvYXQ+IG1GbG9hdERlZmluZXM7CisgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2xDTChjb25zdCBjaGFyICopOworICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sR0woY29uc3QgY2hhciAqKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKaW5kZXggMjAyY2EzZC4uZTBkZTg2NyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCkBAIC0xNywxOCArMTcsOSBAQAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCi0jaW5jbHVkZSAicnNOb2lzZS5oIgogCi0jaW5jbHVkZSAiYWNjL2FjYy5oIgogI2luY2x1ZGUgInV0aWxzL1RpbWVycy5oIgogCi0jZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KICNpbmNsdWRlIDx0aW1lLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpAQCAtMzksMjUyICszMCwxMSBAQAogICAgIENvbnRleHQgKiByc2MgPSB0bHMtPm1Db250ZXh0OyBcCiAgICAgU2NyaXB0QyAqIHNjID0gKFNjcmlwdEMgKikgdGxzLT5tU2NyaXB0CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBmbG9hdCB4OwotICAgIGZsb2F0IHk7Ci0gICAgZmxvYXQgejsKLX0gdmVjM190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotICAgIGZsb2F0IHo7Ci0gICAgZmxvYXQgdzsKLX0gdmVjNF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotfSB2ZWMyX3Q7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSU8gcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgZmxvYXQgU0NfbG9hZEYodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4odnApOwotICAgIC8vTE9HRSgibG9hZEYgJWkgJWkgPSAlZiAleCIsIGJhbmssIG9mZnNldCwgZiwgKChpbnQgKikmZilbMF0pOwotICAgIHJldHVybiBmW29mZnNldF07Ci19Ci0KLXN0YXRpYyBpbnQzMl90IFNDX2xvYWRJMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQzMl90ICo+KHZwKTsKLSAgICAvL0xPR0UoImxvYWRJMzIgJWkgJWkgPSAlaSIsIGJhbmssIG9mZnNldCwgdCk7Ci0gICAgcmV0dXJuIGlbb2Zmc2V0XTsKLX0KLQotc3RhdGljIGZsb2F0KiBTQ19sb2FkQXJyYXlGKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLSAgICByZXR1cm4gZiArIG9mZnNldDsKLX0KLQotc3RhdGljIGludDMyX3QqIFNDX2xvYWRBcnJheUkzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgaW50MzJfdCAqaSA9IHN0YXRpY19jYXN0PGludDMyX3QgKj4odnApOwotICAgIHJldHVybiBpICsgb2Zmc2V0OwotfQotCi1zdGF0aWMgZmxvYXQqIFNDX2xvYWRTaW1wbGVNZXNoVmVydGljZXNGKFJzU2ltcGxlTWVzaCBtZXNoLCB1aW50MzJfdCBpZHgpCi17Ci0gICAgU2ltcGxlTWVzaCAqdG0gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG1lc2gpOwotICAgIHZvaWQgKnZwID0gdG0tPm1WZXJ0ZXhCdWZmZXJzW2lkeF0tPmdldFB0cigpOzsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotfQotCi1zdGF0aWMgdm9pZCBTQ191cGRhdGVTaW1wbGVNZXNoKFJzU2ltcGxlTWVzaCBtZXNoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obWVzaCk7Ci0gICAgc20tPnVwbG9hZEFsbChyc2MpOwotfQotCi1zdGF0aWMgdWludDMyX3QgU0NfbG9hZFUzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGNvbnN0IHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgY29uc3QgdWludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50MzJfdCAqPih2cCk7Ci0gICAgcmV0dXJuIGlbb2Zmc2V0XTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbG9hZFZlYzQodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCByc2NfVmVjdG9yNCAqdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICBtZW1jcHkodiwgJmZbb2Zmc2V0XSwgc2l6ZW9mKHJzY19WZWN0b3I0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2xvYWRNYXRyaXgodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4odnApOwotICAgIG1lbWNweShtLCAmZltvZmZzZXRdLCBzaXplb2YocnNjX01hdHJpeCkpOwotfQotCi0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlRih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGZsb2F0IHYpCi17Ci0gICAgLy9MT0dFKCJzdG9yZUYgJWkgJWkgJWYiLCBiYW5rLCBvZmZzZXQsIHYpOwotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIGZbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlSTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgaW50MzJfdCB2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGludDMyX3QgKmYgPSBzdGF0aWNfY2FzdDxpbnQzMl90ICo+KHZwKTsKLSAgICBzdGF0aWNfY2FzdDxpbnQzMl90ICo+KHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpKVtvZmZzZXRdID0gdjsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVVMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCB2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIHVpbnQzMl90ICpmID0gc3RhdGljX2Nhc3Q8dWludDMyX3QgKj4odnApOwotICAgIHN0YXRpY19jYXN0PHVpbnQzMl90ICo+KHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpKVtvZmZzZXRdID0gdjsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVWZWM0KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgY29uc3QgcnNjX1ZlY3RvcjQgKnYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci0gICAgbWVtY3B5KCZmW29mZnNldF0sIHYsIHNpemVvZihyc2NfVmVjdG9yNCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZU1hdHJpeCh1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGNvbnN0IHJzY19NYXRyaXggKm0pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci0gICAgbWVtY3B5KCZmW29mZnNldF0sIG0sIHNpemVvZihyc2NfTWF0cml4KSk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmVjMyByb3V0aW5lcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNOb3JtKHZlYzNfdCAqdikKLXsKLSAgICBmbG9hdCBsZW4gPSBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnopOwotICAgIGxlbiA9IDEgLyBsZW47Ci0gICAgdi0+eCAqPSBsZW47Ci0gICAgdi0+eSAqPSBsZW47Ci0gICAgdi0+eiAqPSBsZW47Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ192ZWMzTGVuZ3RoKGNvbnN0IHZlYzNfdCAqdikKLXsKLSAgICByZXR1cm4gc3FydGYodi0+eCAqIHYtPnggKyB2LT55ICogdi0+eSArIHYtPnogKiB2LT56KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjM0FkZCh2ZWMzX3QgKmRlc3QsIGNvbnN0IHZlYzNfdCAqbGhzLCBjb25zdCB2ZWMzX3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54ICsgcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgKyByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiArIHJocy0+ejsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjM1N1Yih2ZWMzX3QgKmRlc3QsIGNvbnN0IHZlYzNfdCAqbGhzLCBjb25zdCB2ZWMzX3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54IC0gcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgLSByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiAtIHJocy0+ejsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjM0Nyb3NzKHZlYzNfdCAqZGVzdCwgY29uc3QgdmVjM190ICpsaHMsIGNvbnN0IHZlYzNfdCAqcmhzKQotewotICAgIGZsb2F0IHggPSBsaHMtPnkgKiByaHMtPnogIC0gbGhzLT56ICogcmhzLT55OwotICAgIGZsb2F0IHkgPSBsaHMtPnogKiByaHMtPnggIC0gbGhzLT54ICogcmhzLT56OwotICAgIGZsb2F0IHogPSBsaHMtPnggKiByaHMtPnkgIC0gbGhzLT55ICogcmhzLT54OwotICAgIGRlc3QtPnggPSB4OwotICAgIGRlc3QtPnkgPSB5OwotICAgIGRlc3QtPnogPSB6OwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjM0RvdChjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgcmV0dXJuIGxocy0+eCAqIHJocy0+eCArIGxocy0+eSAqIHJocy0+eSArIGxocy0+eiAqIHJocy0+ejsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjM1NjYWxlKHZlYzNfdCAqbGhzLCBmbG9hdCBzY2FsZSkKLXsKLSAgICBsaHMtPnggKj0gc2NhbGU7Ci0gICAgbGhzLT55ICo9IHNjYWxlOwotICAgIGxocy0+eiAqPSBzY2FsZTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBWZWM0IHJvdXRpbmVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfdmVjNE5vcm0odmVjNF90ICp2KQotewotICAgIGZsb2F0IGxlbiA9IHNxcnRmKHYtPnggKiB2LT54ICsgdi0+eSAqIHYtPnkgKyB2LT56ICogdi0+eiArIHYtPncgKiB2LT53KTsKLSAgICBsZW4gPSAxIC8gbGVuOwotICAgIHYtPnggKj0gbGVuOwotICAgIHYtPnkgKj0gbGVuOwotICAgIHYtPnogKj0gbGVuOwotICAgIHYtPncgKj0gbGVuOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjNExlbmd0aChjb25zdCB2ZWM0X3QgKnYpCi17Ci0gICAgcmV0dXJuIHNxcnRmKHYtPnggKiB2LT54ICsgdi0+eSAqIHYtPnkgKyB2LT56ICogdi0+eiArIHYtPncgKiB2LT53KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNEFkZCh2ZWM0X3QgKmRlc3QsIGNvbnN0IHZlYzRfdCAqbGhzLCBjb25zdCB2ZWM0X3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54ICsgcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgKyByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiArIHJocy0+ejsKLSAgICBkZXN0LT53ID0gbGhzLT53ICsgcmhzLT53OwotfQotCi1zdGF0aWMgdm9pZCBTQ192ZWM0U3ViKHZlYzRfdCAqZGVzdCwgY29uc3QgdmVjNF90ICpsaHMsIGNvbnN0IHZlYzRfdCAqcmhzKQotewotICAgIGRlc3QtPnggPSBsaHMtPnggLSByaHMtPng7Ci0gICAgZGVzdC0+eSA9IGxocy0+eSAtIHJocy0+eTsKLSAgICBkZXN0LT56ID0gbGhzLT56IC0gcmhzLT56OwotICAgIGRlc3QtPncgPSBsaHMtPncgLSByaHMtPnc7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ192ZWM0RG90KGNvbnN0IHZlYzRfdCAqbGhzLCBjb25zdCB2ZWM0X3QgKnJocykKLXsKLSAgICByZXR1cm4gbGhzLT54ICogcmhzLT54ICsgbGhzLT55ICogcmhzLT55ICsgbGhzLT56ICogcmhzLT56ICsgbGhzLT53ICogcmhzLT53OwotfQotCi1zdGF0aWMgdm9pZCBTQ192ZWM0U2NhbGUodmVjNF90ICpsaHMsIGZsb2F0IHNjYWxlKQotewotICAgIGxocy0+eCAqPSBzY2FsZTsKLSAgICBsaHMtPnkgKj0gc2NhbGU7Ci0gICAgbGhzLT56ICo9IHNjYWxlOwotICAgIGxocy0+dyAqPSBzY2FsZTsKLX0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBNYXRoIHJvdXRpbmVzCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotI2RlZmluZSBQSSAzLjE0MTU5MjZmCi0jZGVmaW5lIERFR19UT19SQUQgUEkgLyAxODAuMGYKLSNkZWZpbmUgUkFEX1RPX0RFRyAxODAuMGYgLyBQSQotCiBzdGF0aWMgZmxvYXQgU0Nfc2luZl9mYXN0KGZsb2F0IHgpCiB7CiAgICAgY29uc3QgZmxvYXQgQSA9ICAgMS4wZiAvICgyLjBmICogTV9QSSk7CkBAIC0zMjMsNiArNzMsNyBAQAogICAgIHJldHVybiAwLjIyMTVmICogKHkgKiBmYWJzZih5KSAtIHkpICsgeTsKIH0KIAorCiBzdGF0aWMgZmxvYXQgU0NfcmFuZGYoZmxvYXQgbWF4KQogewogICAgIGZsb2F0IHIgPSAoZmxvYXQpcmFuZCgpOwpAQCAtMzM1LDEwNCArODYsMjAgQEAKICAgICByZXR1cm4gciAvIFJBTkRfTUFYICogKG1heCAtIG1pbikgKyBtaW47CiB9CiAKLXN0YXRpYyBpbnQgU0Nfc2lnbihpbnQgdmFsdWUpCitzdGF0aWMgaW50IFNDX3JhbmRpKGludCBtYXgpCiB7Ci0gICAgcmV0dXJuICh2YWx1ZSA+IDApIC0gKHZhbHVlIDwgMCk7CisgICAgcmV0dXJuIChpbnQpU0NfcmFuZGYobWF4KTsKIH0KIAotc3RhdGljIGZsb2F0IFNDX3NpZ25mKGZsb2F0IHZhbHVlKQorc3RhdGljIGludCBTQ19yYW5kaTIoaW50IG1pbiwgaW50IG1heCkKIHsKLSAgICByZXR1cm4gKHZhbHVlID4gMCkgLSAodmFsdWUgPCAwKTsKKyAgICByZXR1cm4gKGludClTQ19yYW5kZjIobWluLCBtYXgpOwogfQogCi1zdGF0aWMgZmxvYXQgU0NfY2xhbXBmKGZsb2F0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKQorc3RhdGljIGZsb2F0IFNDX2ZyYWMoZmxvYXQgdikKIHsKLSAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKLX0KLQotc3RhdGljIGludCBTQ19jbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCkKLXsKLSAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21heGYoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gYSA+IGIgPyBhIDogYjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21pbmYoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3NxcmYoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gdiAqIHY7Ci19Ci0KLXN0YXRpYyBpbnQgU0Nfc3FyKGludCB2KQotewotICAgIHJldHVybiB2ICogdjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2ZyYWNmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIHYgLSBmbG9vcmYodik7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19yb3VuZGYoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gZmxvb3JmKHYgKyAwLjQ5OTk5OTk5OTkpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfZGlzdGYyKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKQotewotICAgIGZsb2F0IHggPSB4MiAtIHgxOwotICAgIGZsb2F0IHkgPSB5MiAtIHkxOwotICAgIHJldHVybiBzcXJ0Zih4ICogeCArIHkgKiB5KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2Rpc3RmMyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyKQotewotICAgIGZsb2F0IHggPSB4MiAtIHgxOwotICAgIGZsb2F0IHkgPSB5MiAtIHkxOwotICAgIGZsb2F0IHogPSB6MiAtIHoxOwotICAgIHJldHVybiBzcXJ0Zih4ICogeCArIHkgKiB5ICsgeiAqIHopOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWFnZjIoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gc3FydGYoYSAqIGEgKyBiICogYik7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYWdmMyhmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKQotewotICAgIHJldHVybiBzcXJ0ZihhICogYSArIGIgKiBiICsgYyAqIGMpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfcmFkZihmbG9hdCBkZWdyZWVzKQotewotICAgIHJldHVybiBkZWdyZWVzICogREVHX1RPX1JBRDsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2RlZ2YoZmxvYXQgcmFkaWFucykKLXsKLSAgICByZXR1cm4gcmFkaWFucyAqIFJBRF9UT19ERUc7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19sZXJwZihmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KQotewotICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OwotfQotCi1zdGF0aWMgZmxvYXQgU0Nfbm9ybWYoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IHZhbHVlKQotewotICAgIHJldHVybiAodmFsdWUgLSBzdGFydCkgLyAoc3RvcCAtIHN0YXJ0KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21hcGYoZmxvYXQgbWluU3RhcnQsIGZsb2F0IG1pblN0b3AsIGZsb2F0IG1heFN0YXJ0LCBmbG9hdCBtYXhTdG9wLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gbWF4U3RhcnQgKyAobWF4U3RhcnQgLSBtYXhTdG9wKSAqICgodmFsdWUgLSBtaW5TdGFydCkgLyAobWluU3RvcCAtIG1pblN0YXJ0KSk7CisgICAgaW50IGkgPSAoaW50KWZsb29yKHYpOworICAgIHJldHVybiBmbWluKHYgLSBpLCAweDEuZmZmZmZlcC0xZik7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTExLDM0OCArMTc4LDIyIEBACiAgICAgcmV0dXJuIHRpbWVpbmZvLT50bV95ZWFyOwogfQogCi1zdGF0aWMgaW50MzJfdCBTQ191cHRpbWVNaWxsaXMoKQorc3RhdGljIGludDY0X3QgU0NfdXB0aW1lTWlsbGlzKCkKIHsKICAgICByZXR1cm4gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSk7CiB9CiAKLXN0YXRpYyBpbnQzMl90IFNDX3N0YXJ0VGltZU1pbGxpcygpCitzdGF0aWMgaW50NjRfdCBTQ191cHRpbWVOYW5vcygpCit7CisgICAgcmV0dXJuIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKK30KKworc3RhdGljIGZsb2F0IFNDX2dldER0KCkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHNjLT5tRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzOwotfQotCi1zdGF0aWMgaW50MzJfdCBTQ19lbGFwc2VkVGltZU1pbGxpcygpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKQotICAgICAgICAgICAgLSBzYy0+bUVudmlyb21lbnQubVN0YXJ0VGltZU1pbGxpczsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBNYXRyaXggcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRJZGVudGl0eShyc2NfTWF0cml4ICptYXQpCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkSWRlbnRpdHkoKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZEZsb2F0KHJzY19NYXRyaXggKm1hdCwgY29uc3QgZmxvYXQgKmYpCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkKGYpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkTWF0KHJzY19NYXRyaXggKm1hdCwgY29uc3QgcnNjX01hdHJpeCAqbmV3bWF0KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZChyZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeCAqPihuZXdtYXQpKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZFJvdGF0ZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWRSb3RhdGUocm90LCB4LCB5LCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZFNjYWxlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWRTY2FsZSh4LCB5LCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZFRyYW5zbGF0ZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkVHJhbnNsYXRlKHgsIHksIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkTXVsdGlwbHkocnNjX01hdHJpeCAqbWF0LCBjb25zdCByc2NfTWF0cml4ICpsaHMsIGNvbnN0IHJzY19NYXRyaXggKnJocykKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWRNdWx0aXBseShyZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeCAqPihsaHMpLAotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeCAqPihyaHMpKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TXVsdGlwbHkocnNjX01hdHJpeCAqbWF0LCBjb25zdCByc2NfTWF0cml4ICpyaHMpCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5tdWx0aXBseShyZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeCAqPihyaHMpKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4Um90YXRlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+cm90YXRlKHJvdCwgeCwgeSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeFNjYWxlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPnNjYWxlKHgsIHksIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhUcmFuc2xhdGUocnNjX01hdHJpeCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+dHJhbnNsYXRlKHgsIHksIHopOwotfQotCi0KLXN0YXRpYyB2b2lkIFNDX3ZlYzJSYW5kKGZsb2F0ICp2ZWMsIGZsb2F0IG1heExlbikKLXsKLSAgICBmbG9hdCBhbmdsZSA9IFNDX3JhbmRmKFBJICogMik7Ci0gICAgZmxvYXQgbGVuID0gU0NfcmFuZGYobWF4TGVuKTsKLSAgICB2ZWNbMF0gPSBsZW4gKiBzaW5mKGFuZ2xlKTsKLSAgICB2ZWNbMV0gPSBsZW4gKiBjb3NmKGFuZ2xlKTsKLX0KLQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ29udGV4dAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX2JpbmRUZXh0dXJlKFJzUHJvZ3JhbUZyYWdtZW50IHZwZiwgdWludDMyX3Qgc2xvdCwgUnNBbGxvY2F0aW9uIHZhKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2lfUHJvZ3JhbUJpbmRUZXh0dXJlKHJzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKLQotfQotCi1zdGF0aWMgdm9pZCBTQ19iaW5kU2FtcGxlcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzU2FtcGxlciB2cykKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX1Byb2dyYW1CaW5kU2FtcGxlcihyc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTYW1wbGVyICo+KHZzKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlKFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUgcGZzKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MsIHBmcyk7Ci0KLX0KLQotc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1GcmFnbWVudChSc1Byb2dyYW1GcmFnbWVudCBwZikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KHJzYywgcGYpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtVmVydGV4KFJzUHJvZ3JhbVZlcnRleCBwdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChyc2MsIHB2KTsKLQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFZQCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfdnBMb2FkTW9kZWxNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNjLT5nZXRWZXJ0ZXgoKS0+c2V0TW9kZWx2aWV3TWF0cml4KG0pOwotfQotCi1zdGF0aWMgdm9pZCBTQ192cExvYWRUZXh0dXJlTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldFRleHR1cmVNYXRyaXgobSk7Ci19Ci0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERyYXdpbmcKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ19kcmF3TGluZShmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgdnR4W10gPSB7IHgxLCB5MSwgejEsIHgyLCB5MiwgejIgfTsKLSAgICBWZXJ0ZXhBcnJheSB2YTsKLSAgICB2YS5hZGRMZWdhY3koR0xfRkxPQVQsIDMsIDEyLCBSU19LSU5EX1BPU0lUSU9OLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCk7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YS5zZXR1cEdMKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXkpOwotICAgIH0KLQotICAgIGdsRHJhd0FycmF5cyhHTF9MSU5FUywgMCwgMik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdQb2ludChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmbG9hdCB2dHhbXSA9IHsgeCwgeSwgeiB9OwotCi0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgdmEuYWRkTGVnYWN5KEdMX0ZMT0FULCAzLCAxMiwgUlNfS0lORF9QT1NJVElPTiwgZmFsc2UsICh1aW50MzJfdCl2dHgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfUE9JTlRTLCAwLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1F1YWRUZXhDb29yZHMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHU0LCBmbG9hdCB2NCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy9MT0dFKCJRdWFkIik7Ci0gICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDEsIHkxLCB6MSk7Ci0gICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDIsIHkyLCB6Mik7Ci0gICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDMsIHkzLCB6Myk7Ci0gICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDQsIHk0LCB6NCk7Ci0KLSAgICBmbG9hdCB2dHhbXSA9IHt4MSx5MSx6MSwgeDIseTIsejIsIHgzLHkzLHozLCB4NCx5NCx6NH07Ci0gICAgY29uc3QgZmxvYXQgdGV4W10gPSB7dTEsdjEsIHUyLHYyLCB1Myx2MywgdTQsdjR9OwotCi0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgdmEuYWRkTGVnYWN5KEdMX0ZMT0FULCAzLCAxMiwgUlNfS0lORF9QT1NJVElPTiwgZmFsc2UsICh1aW50MzJfdCl2dHgpOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMiwgOCwgUlNfS0lORF9URVhUVVJFLCBmYWxzZSwgKHVpbnQzMl90KXRleCk7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YS5zZXR1cEdMKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXkpOwotICAgIH0KLQotCi0gICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpCi17Ci0gICAgU0NfZHJhd1F1YWRUZXhDb29yZHMoeDEsIHkxLCB6MSwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4MiwgeTIsIHoyLCAxLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHgzLCB5MywgejMsIDEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeDQsIHk0LCB6NCwgMCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcChyc2MtPmdldFZlcnRleCgpKTsKLSAgICByc2MtPnNldFZlcnRleChyc2MtPmdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkpOwotICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7Ci0KLSAgICAvL0dMaW50IGNyb3BbNF0gPSB7MCwgaCwgdywgLWh9OwotCi0gICAgZmxvYXQgc2ggPSByc2MtPmdldEhlaWdodCgpOwotCi0gICAgU0NfZHJhd1F1YWQoeCwgICBzaCAtIHksICAgICB6LAotICAgICAgICAgICAgICAgIHgrdywgc2ggLSB5LCAgICAgeiwKLSAgICAgICAgICAgICAgICB4K3csIHNoIC0gKHkraCksIHosCi0gICAgICAgICAgICAgICAgeCwgICBzaCAtICh5K2gpLCB6KTsKLSAgICByc2MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcC5nZXQoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZUNyb3BwZWQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCwKLSAgICAgICAgZmxvYXQgY3gwLCBmbG9hdCBjeTAsIGZsb2F0IGN4MSwgZmxvYXQgY3kxKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBHTGludCBjcm9wWzRdID0ge2N4MCwgY3kwLCBjeDEsIGN5MX07Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOwotICAgIGdsRHJhd1RleGZPRVMoeCwgeSwgeiwgdywgaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgZmxvYXQgdmluWzNdID0ge3gsIHksIHp9OwotICAgIGZsb2F0IHZvdXRbNF07Ci0KLSAgICAvL0xPR0UoImRzICBpbiAlZiAlZiAlZiIsIHgsIHksIHopOwotICAgIHJzYy0+Z2V0VmVydGV4KCktPnRyYW5zZm9ybVRvU2NyZWVuKHJzYywgdm91dCwgdmluKTsKLSAgICAvL0xPR0UoImRzICBvdXQgJWYgJWYgJWYgJWYiLCB2b3V0WzBdLCB2b3V0WzFdLCB2b3V0WzJdLCB2b3V0WzNdKTsKLSAgICB2b3V0WzBdIC89IHZvdXRbM107Ci0gICAgdm91dFsxXSAvPSB2b3V0WzNdOwotICAgIHZvdXRbMl0gLz0gdm91dFszXTsKLQotICAgIHZvdXRbMF0gKj0gcnNjLT5nZXRXaWR0aCgpIC8gMjsKLSAgICB2b3V0WzFdICo9IHJzYy0+Z2V0SGVpZ2h0KCkgLyAyOwotICAgIHZvdXRbMF0gKz0gcnNjLT5nZXRXaWR0aCgpIC8gMjsKLSAgICB2b3V0WzFdICs9IHJzYy0+Z2V0SGVpZ2h0KCkgLyAyOwotCi0gICAgdm91dFswXSAtPSB3LzI7Ci0gICAgdm91dFsxXSAtPSBoLzI7Ci0KLSAgICAvL0xPR0UoImRzICBvdXQyICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSk7Ci0KLSAgICAvLyBVLCBWLCBXLCBICi0gICAgU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKHZvdXRbMF0sIHZvdXRbMV0sIHosIGgsIHcpOwotICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KQotewotICAgIFNDX2RyYXdRdWFkKHgxLCB5MiwgeiwKLSAgICAgICAgICAgICAgICB4MiwgeTIsIHosCi0gICAgICAgICAgICAgICAgeDIsIHkxLCB6LAotICAgICAgICAgICAgICAgIHgxLCB5MSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTaW1wbGVNZXNoKFJzU2ltcGxlTWVzaCB2c20pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPih2c20pOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzbS0+cmVuZGVyKHJzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTaW1wbGVNZXNoUmFuZ2UoUnNTaW1wbGVNZXNoIHZzbSwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KHZzbSk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNtLT5yZW5kZXJSYW5nZShyc2MsIHN0YXJ0LCBsZW4pOworICAgIGludDY0X3QgbCA9IHNjLT5tRW52aXJvbWVudC5tTGFzdER0VGltZTsKKyAgICBzYy0+bUVudmlyb21lbnQubUxhc3REdFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgcmV0dXJuICgoZmxvYXQpKHNjLT5tRW52aXJvbWVudC5tTGFzdER0VGltZSAtIGwpKSAvIDEuMGU5OwogfQogCiAKQEAgLTg2MCw1MzEgKzIwMSwzMzggQEAKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVgoUnNBbGxvY2F0aW9uIHZhKQogewotICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclswXSA9IHI7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMV0gPSBnOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzJdID0gYjsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclszXSA9IGE7Ci0gICAgaWYgKCFyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGdsQ29sb3I0ZihyLCBnLCBiLCBhKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgQ0hFQ0tfT0JKKGEpOworICAgIC8vTE9HRSgiU0NfYWxsb2NHZXREaW1YIGE9JXAgIHR5cGU9JXAiLCBhLCBhLT5nZXRUeXBlKCkpOworICAgIHJldHVybiBhLT5nZXRUeXBlKCktPmdldERpbVgoKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltWShSc0FsbG9jYXRpb24gdmEpCit7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIENIRUNLX09CSihhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVooUnNBbGxvY2F0aW9uIHZhKQoreworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBDSEVDS19PQkooYSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltWigpOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1MT0QoUnNBbGxvY2F0aW9uIHZhKQoreworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBDSEVDS19PQkooYSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltTE9EKCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbUZhY2VzKFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgQ0hFQ0tfT0JKKGEpOworICAgIHJldHVybiBhLT5nZXRUeXBlKCktPmdldERpbUZhY2VzKCk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkICogU0NfZ2V0RWxlbWVudEF0WChSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgpCit7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIENIRUNLX09CSihhKTsKKyAgICBjb25zdCBUeXBlICp0ID0gYS0+Z2V0VHlwZSgpOworICAgIENIRUNLX09CSih0KTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilhLT5nZXRQdHIoKTsKKyAgICByZXR1cm4gJnBbdC0+Z2V0RWxlbWVudFNpemVCeXRlcygpICogeF07Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkICogU0NfZ2V0RWxlbWVudEF0WFkoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KQoreworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBDSEVDS19PQkooYSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBDSEVDS19PQkoodCk7CisgICAgY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopYS0+Z2V0UHRyKCk7CisgICAgcmV0dXJuICZwW3QtPmdldEVsZW1lbnRTaXplQnl0ZXMoKSAqICh4ICsgeSp0LT5nZXREaW1YKCkpXTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQgKiBTQ19nZXRFbGVtZW50QXRYWVooUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KQoreworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBDSEVDS19PQkooYSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBDSEVDS19PQkoodCk7CisgICAgY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopYS0+Z2V0UHRyKCk7CisgICAgcmV0dXJuICZwW3QtPmdldEVsZW1lbnRTaXplQnl0ZXMoKSAqICh4ICsgeSp0LT5nZXREaW1YKCkpXTsKK30KKworc3RhdGljIHZvaWQgU0Nfc2V0T2JqZWN0KHZvaWQgKip2ZHN0LCB2b2lkICogdnNyYykgeworICAgIC8vTE9HRSgiU0Nfc2V0T2JqZWN0ICAlcCwlcCAgJXAiLCB2ZHN0LCAqdmRzdCwgdnNyYyk7CisgICAgaWYgKHZzcmMpIHsKKyAgICAgICAgQ0hFQ0tfT0JKKHZzcmMpOworICAgICAgICBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KHZzcmMpLT5pbmNTeXNSZWYoKTsKICAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2FtYmllbnQoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kaWZmdXNlKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRElGRlVTRSwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3BlY3VsYXIoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZW1pc3Npb24oZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9FTUlTU0lPTiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc2hpbmluZXNzKGZsb2F0IHMpCi17Ci0gICAgZ2xNYXRlcmlhbGYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3BvaW50QXR0ZW51YXRpb24oZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyBhLCBiLCBjIH07Ci0gICAgZ2xQb2ludFBhcmFtZXRlcmZ2KEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19oc2JUb1JnYihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCogcmdiKQotewotICAgIGZsb2F0IHJlZCA9IDAuMGY7Ci0gICAgZmxvYXQgZ3JlZW4gPSAwLjBmOwotICAgIGZsb2F0IGJsdWUgPSAwLjBmOwotCi0gICAgZmxvYXQgeCA9IGg7Ci0gICAgZmxvYXQgeSA9IHM7Ci0gICAgZmxvYXQgeiA9IGI7Ci0KLSAgICBmbG9hdCBoZiA9ICh4IC0gKGludCkgeCkgKiA2LjBmOwotICAgIGludCBpaGYgPSAoaW50KSBoZjsKLSAgICBmbG9hdCBmID0gaGYgLSBpaGY7Ci0gICAgZmxvYXQgcHYgPSB6ICogKDEuMGYgLSB5KTsKLSAgICBmbG9hdCBxdiA9IHogKiAoMS4wZiAtIHkgKiBmKTsKLSAgICBmbG9hdCB0diA9IHogKiAoMS4wZiAtIHkgKiAoMS4wZiAtIGYpKTsKLQotICAgIHN3aXRjaCAoaWhmKSB7Ci0gICAgICAgIGNhc2UgMDogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSB0djsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6ICAgICAgICAgLy8gR3JlZW4gaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSBxdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZWQgPSBwdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSB0djsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6ICAgICAgICAgLy8gQmx1ZSBpcyB0aGUgZG9taW5hbnQgY29sb3IKLSAgICAgICAgICAgIHJlZCA9IHB2OwotICAgICAgICAgICAgZ3JlZW4gPSBxdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJlZCA9IHR2OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSBxdjsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmICh2ZHN0WzBdKSB7CisgICAgICAgIENIRUNLX09CSih2ZHN0WzBdKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPih2ZHN0WzBdKS0+ZGVjU3lzUmVmKCk7CiAgICAgfQotCi0gICAgcmdiWzBdID0gcmVkOwotICAgIHJnYlsxXSA9IGdyZWVuOwotICAgIHJnYlsyXSA9IGJsdWU7CisgICAgKnZkc3QgPSB2c3JjOworICAgIC8vTE9HRSgiU0Nfc2V0T2JqZWN0ICoiKTsKIH0KLQotc3RhdGljIGludCBTQ19oc2JUb0FiZ3IoZmxvYXQgaCwgZmxvYXQgcywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBmbG9hdCByZ2JbM107Ci0gICAgU0NfaHNiVG9SZ2IoaCwgcywgYiwgcmdiKTsKLSAgICByZXR1cm4gaW50KGEgICAgICAqIDI1NS4wZikgPDwgMjQgfAotICAgICAgICAgICBpbnQocmdiWzJdICogMjU1LjBmKSA8PCAxNiB8Ci0gICAgICAgICAgIGludChyZ2JbMV0gKiAyNTUuMGYpIDw8ICA4IHwKLSAgICAgICAgICAgaW50KHJnYlswXSAqIDI1NS4wZik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2hzYihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBmbG9hdCByZ2JbM107Ci0gICAgU0NfaHNiVG9SZ2IoaCwgcywgYiwgcmdiKTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICBnbFZlcnRleEF0dHJpYjRmKDEsIHJnYlswXSwgcmdiWzFdLCByZ2JbMl0sIGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsQ29sb3I0ZihyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBhKTsKK3N0YXRpYyB2b2lkIFNDX2NsZWFyT2JqZWN0KHZvaWQgKip2ZHN0KSB7CisgICAgLy9MT0dFKCJTQ19jbGVhck9iamVjdCAgJXAsJXAiLCB2ZHN0LCAqdmRzdCk7CisgICAgaWYgKHZkc3RbMF0pIHsKKyAgICAgICAgQ0hFQ0tfT0JKKHZkc3RbMF0pOworICAgICAgICBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KHZkc3RbMF0pLT5kZWNTeXNSZWYoKTsKICAgICB9CisgICAgKnZkc3QgPSBOVUxMOworICAgIC8vTE9HRSgiU0NfY2xlYXJPYmplY3QgKiIpOworfQorc3RhdGljIGJvb2wgU0NfaXNPYmplY3QoUnNBbGxvY2F0aW9uIHZzcmMpIHsKKyAgICByZXR1cm4gdnNyYyAhPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBTQ191cGxvYWRUb1RleHR1cmUoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBiYXNlTWlwTGV2ZWwpCisKKworc3RhdGljIHZvaWQgU0NfZGVidWdGKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYpIHsKKyAgICBMT0dFKCIlcyAlZiwgMHglMDh4IiwgcywgZiwgKigoaW50ICopICgmZikpKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnYyKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYxLCBmbG9hdCBmMikgeworICAgIExPR0UoIiVzIHslZiwgJWZ9IiwgcywgZjEsIGYyKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnYzKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYxLCBmbG9hdCBmMiwgZmxvYXQgZjMpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZn0iLCBzLCBmMSwgZjIsIGYzKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnY0KGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYxLCBmbG9hdCBmMiwgZmxvYXQgZjMsIGZsb2F0IGY0KSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYsICVmfSIsIHMsIGYxLCBmMiwgZjMsIGY0KTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRk00djQoY29uc3QgY2hhciAqcywgY29uc3QgZmxvYXQgKmYpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZiwgJWYiLCBzLCBmWzBdLCBmWzRdLCBmWzhdLCBmWzEyXSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYsICVmIiwgcywgZlsxXSwgZls1XSwgZls5XSwgZlsxM10pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmLCAlZiIsIHMsIGZbMl0sIGZbNl0sIGZbMTBdLCBmWzE0XSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYsICVmfSIsIHMsIGZbM10sIGZbN10sIGZbMTFdLCBmWzE1XSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0ZNM3YzKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGZsb2F0ICpmKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYiLCBzLCBmWzBdLCBmWzNdLCBmWzZdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZiIsIHMsIGZbMV0sIGZbNF0sIGZbN10pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmfSIscywgZlsyXSwgZls1XSwgZls4XSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0ZNMnYyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGZsb2F0ICpmKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiIsIHMsIGZbMF0sIGZbMl0pOworICAgIExPR0UoIiVzICAlZiwgJWZ9IixzLCBmWzFdLCBmWzNdKTsKK30KKworc3RhdGljIHZvaWQgU0NfZGVidWdJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKSB7CisgICAgTE9HRSgiJXMgJWkgIDB4JXgiLCBzLCBpLCBpKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnVTMyKGNvbnN0IGNoYXIgKnMsIHVpbnQzMl90IGkpIHsKKyAgICBMT0dFKCIlcyAlaSAgMHgleCIsIHMsIGksIGkpOworfQorCitzdGF0aWMgdm9pZCBTQ19kZWJ1Z1AoY29uc3QgY2hhciAqcywgY29uc3Qgdm9pZCAqcCkgeworICAgIExPR0UoIiVzICVwIiwgcywgcCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudDIoaW50IGNtZElELCB2b2lkICpkYXRhLCBpbnQgbGVuKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50ICVpICVpICVpIiwgY21kSUQsIGxlbik7CisgICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChkYXRhLCBjbWRJRCwgbGVuLCBmYWxzZSk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0KFJzQWxsb2NhdGlvbiB2YSkKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudChpbnQgY21kSUQpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjLCB2YSk7CisgICAgLy9MT0dFKCJTQ190b0NsaWVudCAlaSIsIGNtZElEKTsKKyAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KE5VTEwsIGNtZElELCAwLCBmYWxzZSk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3N5bmNUb0dMKFJzQWxsb2NhdGlvbiB2YSkKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudEJsb2NraW5nMihpbnQgY21kSUQsIHZvaWQgKmRhdGEsIGludCBsZW4pCiB7CiAgICAgR0VUX1RMUygpOwotICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKLQorICAgIC8vTE9HRSgiU0NfdG9DbGllbnRCbG9ja2luZyAlaSAlaSIsIGNtZElELCBsZW4pOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoZGF0YSwgY21kSUQsIGxlbiwgdHJ1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX0NsZWFyQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICAvL0xPR0UoImMgJWYgJWYgJWYgJWYiLCByLCBnLCBiLCBhKTsKLSAgICBHRVRfVExTKCk7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gcjsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMV0gPSBnOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IGI7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gYTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZGVidWdGKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYpCi17Ci0gICAgTE9HRSgiJXMgJWYiLCBzLCBmKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZGVidWdIZXhGKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYpCi17Ci0gICAgTE9HRSgiJXMgMHgleCIsIHMsICooKGludCAqKSAoJmYpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RlYnVnSTMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgaSkKLXsKLSAgICBMT0dFKCIlcyAlaSIsIHMsIGkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0hleEkzMihjb25zdCBjaGFyICpzLCBpbnQzMl90IGkpCi17Ci0gICAgTE9HRSgiJXMgMHgleCIsIHMsIGkpOwotfQotCi1zdGF0aWMgdWludDMyX3QgU0NfZ2V0V2lkdGgoKQorc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50QmxvY2tpbmcoaW50IGNtZElEKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gcnNjLT5nZXRXaWR0aCgpOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnRCbG9ja2luZyAlaSIsIGNtZElEKTsKKyAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KE5VTEwsIGNtZElELCAwLCB0cnVlKTsKIH0KIAotc3RhdGljIHVpbnQzMl90IFNDX2dldEhlaWdodCgpCitpbnQgU0NfZGl2c2kzKGludCBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSAvIGI7Cit9CisKK2ludCBTQ19nZXRBbGxvY2F0aW9uKGNvbnN0IHZvaWQgKnB0cikKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHJzYy0+Z2V0SGVpZ2h0KCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYWxsb2MgPSBzYy0+cHRyVG9BbGxvY2F0aW9uKHB0cik7CisgICAgcmV0dXJuIChpbnQpYWxsb2M7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCBTQ19jb2xvckZsb2F0UkdCQXRvVU5vcm04KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit2b2lkIFNDX2FsbG9jYXRpb25NYXJrRGlydHkoUnNBbGxvY2F0aW9uIGEpCiB7Ci0gICAgdWludDMyX3QgYyA9IDA7Ci0gICAgYyB8PSAodWludDMyX3QpKHIgKiAyNTUuZiArIDAuNWYpOwotICAgIGMgfD0gKCh1aW50MzJfdCkoZyAqIDI1NS5mICsgMC41ZikpIDw8IDg7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShiICogMjU1LmYgKyAwLjVmKSkgPDwgMTY7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShhICogMjU1LmYgKyAwLjVmKSkgPDwgMjQ7Ci0gICAgcmV0dXJuIGM7CisgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KGEpOworICAgIGFsbG9jLT5zZW5kRGlydHkoKTsKIH0KIAotc3RhdGljIHVpbnQzMl90IFNDX2NvbG9yRmxvYXRSR0JBdG81NjUoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYikKLXsKLSAgICB1aW50MzJfdCBpciA9ICh1aW50MzJfdCkociAqIDI1NS5mICsgMC41Zik7Ci0gICAgdWludDMyX3QgaWcgPSAodWludDMyX3QpKGcgKiAyNTUuZiArIDAuNWYpOwotICAgIHVpbnQzMl90IGliID0gKHVpbnQzMl90KShiICogMjU1LmYgKyAwLjVmKTsKLSAgICByZXR1cm4gcnM4ODh0bzU2NShpciwgaWcsIGliKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50KHZvaWQgKmRhdGEsIGludCBjbWRJRCwgaW50IGxlbiwgaW50IHdhaXRGb3JTcGFjZSkKK3ZvaWQgU0NfRm9yRWFjaChSc1NjcmlwdCB2cywKKyAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdmluLAorICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiB2b3V0LAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnVzcikKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChkYXRhLCBjbWRJRCwgbGVuLCB3YWl0Rm9yU3BhY2UgIT0gMCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYWluID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2aW4pOworICAgIEFsbG9jYXRpb24gKmFvdXQgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZvdXQpOworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+cnVuRm9yRWFjaChyc2MsIGFpbiwgYW91dCwgdXNyKTsKIH0KIAotc3RhdGljIHZvaWQgU0Nfc2NyaXB0Q2FsbChpbnQgc2NyaXB0SUQpCit2b2lkIFNDX0ZvckVhY2gyKFJzU2NyaXB0IHZzLAorICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiB2aW4sCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZvdXQsCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdXNyLAorICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqY2FsbCkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcnNjLT5ydW5TY3JpcHQoKFNjcmlwdCAqKXNjcmlwdElELCAwKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZpbik7CisgICAgQWxsb2NhdGlvbiAqYW91dCA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odm91dCk7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCB1c3IsIGNhbGwpOwogfQogCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1TY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgU2NyaXB0Q1N0YXRlOjpnU3ltc1tdID0gewotICAgIC8vIElPCi0gICAgeyAibG9hZEkzMiIsICh2b2lkICopJlNDX2xvYWRJMzIsCi0gICAgICAgICJpbnQiLCAiKGludCwgaW50KSIgfSwKLSAgICAvL3sgImxvYWRVMzIiLCAodm9pZCAqKSZTQ19sb2FkVTMyLCAidW5zaWduZWQgaW50IiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEYiLCAodm9pZCAqKSZTQ19sb2FkRiwKLSAgICAgICAgImZsb2F0IiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEFycmF5RiIsICh2b2lkICopJlNDX2xvYWRBcnJheUYsCi0gICAgICAgICJmbG9hdCoiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkQXJyYXlJMzIiLCAodm9pZCAqKSZTQ19sb2FkQXJyYXlJMzIsCi0gICAgICAgICJpbnQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZFZlYzQiLCAodm9pZCAqKSZTQ19sb2FkVmVjNCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJsb2FkTWF0cml4IiwgKHZvaWQgKikmU0NfbG9hZE1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJzdG9yZUkzMiIsICh2b2lkICopJlNDX3N0b3JlSTMyLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgLy97ICJzdG9yZVUzMiIsICh2b2lkICopJlNDX3N0b3JlVTMyLCAidm9pZCIsICIoaW50LCBpbnQsIHVuc2lnbmVkIGludCkiIH0sCi0gICAgeyAic3RvcmVGIiwgKHZvaWQgKikmU0Nfc3RvcmVGLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0KSIgfSwKLSAgICB7ICJzdG9yZVZlYzQiLCAodm9pZCAqKSZTQ19zdG9yZVZlYzQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAic3RvcmVNYXRyaXgiLCAodm9pZCAqKSZTQ19zdG9yZU1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJsb2FkU2ltcGxlTWVzaFZlcnRpY2VzRiIsICh2b2lkICopJlNDX2xvYWRTaW1wbGVNZXNoVmVydGljZXNGLAotICAgICAgICAiZmxvYXQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAidXBkYXRlU2ltcGxlTWVzaCIsICh2b2lkICopJlNDX3VwZGF0ZVNpbXBsZU1lc2gsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAorLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCiAKLSAgICAvLyBtYXRoCi0gICAgeyAibW9kZiIsICh2b2lkICopJmZtb2QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJhYnMiLCAodm9pZCAqKSZhYnMsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAiYWJzZiIsICh2b2lkICopJmZhYnNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzaW5mX2Zhc3QiLCAodm9pZCAqKSZTQ19zaW5mX2Zhc3QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNvc2ZfZmFzdCIsICh2b2lkICopJlNDX2Nvc2ZfZmFzdCwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic2luZiIsICh2b2lkICopJnNpbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNvc2YiLCAodm9pZCAqKSZjb3NmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhc2luZiIsICh2b2lkICopJmFzaW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhY29zZiIsICh2b2lkICopJmFjb3NmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhdGFuZiIsICh2b2lkICopJmF0YW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhdGFuMmYiLCAodm9pZCAqKSZhdGFuMmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJmYWJzZiIsICh2b2lkICopJmZhYnNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyYW5kZiIsICh2b2lkICopJlNDX3JhbmRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyYW5kZjIiLCAodm9pZCAqKSZTQ19yYW5kZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJmbG9vcmYiLCAodm9pZCAqKSZmbG9vcmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImZyYWNmIiwgKHZvaWQgKikmU0NfZnJhY2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNlaWxmIiwgKHZvaWQgKikmY2VpbGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInJvdW5kZiIsICh2b2lkICopJlNDX3JvdW5kZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZXhwZiIsICh2b2lkICopJmV4cGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImxvZ2YiLCAodm9pZCAqKSZsb2dmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJwb3dmIiwgKHZvaWQgKikmcG93ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1heGYiLCAodm9pZCAqKSZTQ19tYXhmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWluZiIsICh2b2lkICopJlNDX21pbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzcXJ0IiwgKHZvaWQgKikmc3FydCwKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJzcXJ0ZiIsICh2b2lkICopJnNxcnRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzcXIiLCAodm9pZCAqKSZTQ19zcXIsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAic3FyZiIsICh2b2lkICopJlNDX3NxcmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNpZ24iLCAodm9pZCAqKSZTQ19zaWduLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgInNpZ25mIiwgKHZvaWQgKikmU0Nfc2lnbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNsYW1wIiwgKHZvaWQgKikmU0NfY2xhbXAsCi0gICAgICAgICJpbnQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIHsgImNsYW1wZiIsICh2b2lkICopJlNDX2NsYW1wZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJkaXN0ZjIiLCAodm9pZCAqKSZTQ19kaXN0ZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpc3RmMyIsICh2b2lkICopJlNDX2Rpc3RmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYWdmMiIsICh2b2lkICopJlNDX21hZ2YyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFnZjMiLCAodm9pZCAqKSZTQ19tYWdmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJyYWRmIiwgKHZvaWQgKikmU0NfcmFkZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZGVnZiIsICh2b2lkICopJlNDX2RlZ2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImxlcnBmIiwgKHZvaWQgKikmU0NfbGVycGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibm9ybWYiLCAodm9pZCAqKSZTQ19ub3JtZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYXBmIiwgKHZvaWQgKikmU0NfbWFwZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm5vaXNlZiIsICh2b2lkICopJlNDX25vaXNlZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAibm9pc2VmMiIsICh2b2lkICopJlNDX25vaXNlZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJub2lzZWYzIiwgKHZvaWQgKikmU0Nfbm9pc2VmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJ0dXJidWxlbmNlZjIiLCAodm9pZCAqKSZTQ190dXJidWxlbmNlZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAidHVyYnVsZW5jZWYzIiwgKHZvaWQgKikmU0NfdHVyYnVsZW5jZWYzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICB7ICJfX2RpdnNpMyIsICh2b2lkICopJlNDX2RpdnNpMyB9LAorCisgICAgLy8gYWxsb2NhdGlvbgorICAgIHsgIl9aMTlyc0FsbG9jYXRpb25HZXREaW1YMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1YIH0sCisgICAgeyAiX1oxOXJzQWxsb2NhdGlvbkdldERpbVkxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbVkgfSwKKyAgICB7ICJfWjE5cnNBbGxvY2F0aW9uR2V0RGltWjEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltWiB9LAorICAgIHsgIl9aMjFyc0FsbG9jYXRpb25HZXREaW1MT0QxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbUxPRCB9LAorICAgIHsgIl9aMjNyc0FsbG9jYXRpb25HZXREaW1GYWNlczEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltRmFjZXMgfSwKKyAgICB7ICJfWjE1cnNHZXRBbGxvY2F0aW9uUEt2IiwgKHZvaWQgKikmU0NfZ2V0QWxsb2NhdGlvbiB9LAorCisgICAgeyAiX1oxNHJzR2V0RWxlbWVudEF0MTNyc19hbGxvY2F0aW9uaiIsICh2b2lkICopJlNDX2dldEVsZW1lbnRBdFggfSwKKyAgICB7ICJfWjE0cnNHZXRFbGVtZW50QXQxM3JzX2FsbG9jYXRpb25qaiIsICh2b2lkICopJlNDX2dldEVsZW1lbnRBdFhZIH0sCisgICAgeyAiX1oxNHJzR2V0RWxlbWVudEF0MTNyc19hbGxvY2F0aW9uampqIiwgKHZvaWQgKikmU0NfZ2V0RWxlbWVudEF0WFlaIH0sCisKKyAgICB7ICJfWjExcnNTZXRPYmplY3RQMTByc19lbGVtZW50U18iLCAodm9pZCAqKSZTQ19zZXRPYmplY3QgfSwKKyAgICB7ICJfWjEzcnNDbGVhck9iamVjdFAxMHJzX2VsZW1lbnQiLCAodm9pZCAqKSZTQ19jbGVhck9iamVjdCB9LAorICAgIHsgIl9aMTByc0lzT2JqZWN0MTByc19lbGVtZW50IiwgKHZvaWQgKikmU0NfaXNPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc1NldE9iamVjdFA3cnNfdHlwZVNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQN3JzX3R5cGUiLCAodm9pZCAqKSZTQ19jbGVhck9iamVjdCB9LAorICAgIHsgIl9aMTByc0lzT2JqZWN0N3JzX3R5cGUiLCAodm9pZCAqKSZTQ19pc09iamVjdCB9LAorCisgICAgeyAiX1oxMXJzU2V0T2JqZWN0UDEzcnNfYWxsb2NhdGlvblNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2lzT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNTZXRPYmplY3RQMTByc19zYW1wbGVyU18iLCAodm9pZCAqKSZTQ19zZXRPYmplY3QgfSwKKyAgICB7ICJfWjEzcnNDbGVhck9iamVjdFAxMHJzX3NhbXBsZXIiLCAodm9pZCAqKSZTQ19jbGVhck9iamVjdCB9LAorICAgIHsgIl9aMTByc0lzT2JqZWN0MTByc19zYW1wbGVyIiwgKHZvaWQgKikmU0NfaXNPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc1NldE9iamVjdFA5cnNfc2NyaXB0U18iLCAodm9pZCAqKSZTQ19zZXRPYmplY3QgfSwKKyAgICB7ICJfWjEzcnNDbGVhck9iamVjdFA5cnNfc2NyaXB0IiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDlyc19zY3JpcHQiLCAodm9pZCAqKSZTQ19pc09iamVjdCB9LAorCisgICAgeyAiX1oxMXJzU2V0T2JqZWN0UDdyc19tZXNoU18iLCAodm9pZCAqKSZTQ19zZXRPYmplY3QgfSwKKyAgICB7ICJfWjEzcnNDbGVhck9iamVjdFA3cnNfbWVzaCIsICh2b2lkICopJlNDX2NsZWFyT2JqZWN0IH0sCisgICAgeyAiX1oxMHJzSXNPYmplY3Q3cnNfbWVzaCIsICh2b2lkICopJlNDX2lzT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNTZXRPYmplY3RQMTlyc19wcm9ncmFtX2ZyYWdtZW50U18iLCAodm9pZCAqKSZTQ19zZXRPYmplY3QgfSwKKyAgICB7ICJfWjEzcnNDbGVhck9iamVjdFAxOXJzX3Byb2dyYW1fZnJhZ21lbnQiLCAodm9pZCAqKSZTQ19jbGVhck9iamVjdCB9LAorICAgIHsgIl9aMTByc0lzT2JqZWN0MTlyc19wcm9ncmFtX2ZyYWdtZW50IiwgKHZvaWQgKikmU0NfaXNPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc1NldE9iamVjdFAxN3JzX3Byb2dyYW1fdmVydGV4U18iLCAodm9pZCAqKSZTQ19zZXRPYmplY3QgfSwKKyAgICB7ICJfWjEzcnNDbGVhck9iamVjdFAxN3JzX3Byb2dyYW1fdmVydGV4IiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDE3cnNfcHJvZ3JhbV92ZXJ0ZXgiLCAodm9pZCAqKSZTQ19pc09iamVjdCB9LAorCisgICAgeyAiX1oxMXJzU2V0T2JqZWN0UDE3cnNfcHJvZ3JhbV9yYXN0ZXJTXyIsICh2b2lkICopJlNDX3NldE9iamVjdCB9LAorICAgIHsgIl9aMTNyc0NsZWFyT2JqZWN0UDE3cnNfcHJvZ3JhbV9yYXN0ZXIiLCAodm9pZCAqKSZTQ19jbGVhck9iamVjdCB9LAorICAgIHsgIl9aMTByc0lzT2JqZWN0MTdyc19wcm9ncmFtX3Jhc3RlciIsICh2b2lkICopJlNDX2lzT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNTZXRPYmplY3RQMTZyc19wcm9ncmFtX3N0b3JlU18iLCAodm9pZCAqKSZTQ19zZXRPYmplY3QgfSwKKyAgICB7ICJfWjEzcnNDbGVhck9iamVjdFAxNnJzX3Byb2dyYW1fc3RvcmUiLCAodm9pZCAqKSZTQ19jbGVhck9iamVjdCB9LAorICAgIHsgIl9aMTByc0lzT2JqZWN0MTZyc19wcm9ncmFtX3N0b3JlIiwgKHZvaWQgKikmU0NfaXNPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc1NldE9iamVjdFA3cnNfZm9udFNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQN3JzX2ZvbnQiLCAodm9pZCAqKSZTQ19jbGVhck9iamVjdCB9LAorICAgIHsgIl9aMTByc0lzT2JqZWN0N3JzX2ZvbnQiLCAodm9pZCAqKSZTQ19pc09iamVjdCB9LAorCisKKyAgICB7ICJfWjIxcnNBbGxvY2F0aW9uTWFya0RpcnR5MTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NhdGlvbk1hcmtEaXJ0eSB9LAorCisKKyAgICAvLyBEZWJ1ZworICAgIHsgIl9aN3JzRGVidWdQS2NmIiwgKHZvaWQgKikmU0NfZGVidWdGIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2ZmIiwgKHZvaWQgKikmU0NfZGVidWdGdjIgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjZmZmIiwgKHZvaWQgKikmU0NfZGVidWdGdjMgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjZmZmZiIsICh2b2lkICopJlNDX2RlYnVnRnY0IH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY1BLMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ19kZWJ1Z0ZNNHY0IH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY1BLMTJyc19tYXRyaXgzeDMiLCAodm9pZCAqKSZTQ19kZWJ1Z0ZNM3YzIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY1BLMTJyc19tYXRyaXgyeDIiLCAodm9pZCAqKSZTQ19kZWJ1Z0ZNMnYyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2kiLCAodm9pZCAqKSZTQ19kZWJ1Z0kzMiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NqIiwgKHZvaWQgKikmU0NfZGVidWdVMzIgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEt2IiwgKHZvaWQgKikmU0NfZGVidWdQIH0sCisKKyAgICAvLyBSUyBNYXRoCisgICAgeyAiX1o2cnNSYW5kaSIsICh2b2lkICopJlNDX3JhbmRpIH0sCisgICAgeyAiX1o2cnNSYW5kaWkiLCAodm9pZCAqKSZTQ19yYW5kaTIgfSwKKyAgICB7ICJfWjZyc1JhbmRmIiwgKHZvaWQgKikmU0NfcmFuZGYgfSwKKyAgICB7ICJfWjZyc1JhbmRmZiIsICh2b2lkICopJlNDX3JhbmRmMiB9LAorICAgIHsgIl9aNnJzRnJhY2YiLCAodm9pZCAqKSZTQ19mcmFjIH0sCiAKICAgICAvLyB0aW1lCi0gICAgeyAic2Vjb25kIiwgKHZvaWQgKikmU0Nfc2Vjb25kLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgIm1pbnV0ZSIsICh2b2lkICopJlNDX21pbnV0ZSwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJob3VyIiwgKHZvaWQgKikmU0NfaG91ciwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJkYXkiLCAodm9pZCAqKSZTQ19kYXksCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAibW9udGgiLCAodm9pZCAqKSZTQ19tb250aCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJ5ZWFyIiwgKHZvaWQgKikmU0NfeWVhciwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJ1cHRpbWVNaWxsaXMiLCAodm9pZCopJlNDX3VwdGltZU1pbGxpcywKLSAgICAgICAgImludCIsICIoKSIgfSwgICAgICAvLyBUT0RPOiB1c2UgbG9uZyBpbnN0ZWFkCi0gICAgeyAic3RhcnRUaW1lTWlsbGlzIiwgKHZvaWQqKSZTQ19zdGFydFRpbWVNaWxsaXMsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sICAgICAgLy8gVE9ETzogdXNlIGxvbmcgaW5zdGVhZAotICAgIHsgImVsYXBzZWRUaW1lTWlsbGlzIiwgKHZvaWQqKSZTQ19lbGFwc2VkVGltZU1pbGxpcywKLSAgICAgICAgImludCIsICIoKSIgfSwgICAgICAvLyBUT0RPOiB1c2UgbG9uZyBpbnN0ZWFkCisgICAgeyAiX1o4cnNTZWNvbmR2IiwgKHZvaWQgKikmU0Nfc2Vjb25kIH0sCisgICAgeyAiX1o4cnNNaW51dGV2IiwgKHZvaWQgKikmU0NfbWludXRlIH0sCisgICAgeyAiX1o2cnNIb3VydiIsICh2b2lkICopJlNDX2hvdXIgfSwKKyAgICB7ICJfWjVyc0RheXYiLCAodm9pZCAqKSZTQ19kYXkgfSwKKyAgICB7ICJfWjdyc01vbnRodiIsICh2b2lkICopJlNDX21vbnRoIH0sCisgICAgeyAiX1o2cnNZZWFydiIsICh2b2lkICopJlNDX3llYXIgfSwKKyAgICB7ICJfWjE0cnNVcHRpbWVNaWxsaXN2IiwgKHZvaWQqKSZTQ191cHRpbWVNaWxsaXMgfSwKKyAgICB7ICJfWjEzcnNVcHRpbWVOYW5vc3YiLCAodm9pZCopJlNDX3VwdGltZU5hbm9zIH0sCisgICAgeyAiX1o3cnNHZXREdHYiLCAodm9pZCopJlNDX2dldER0IH0sCiAKLSAgICAvLyBtYXRyaXgKLSAgICB7ICJtYXRyaXhMb2FkSWRlbnRpdHkiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkSWRlbnRpdHksCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkRmxvYXQiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkRmxvYXQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqZikiIH0sCi0gICAgeyAibWF0cml4TG9hZE1hdCIsICh2b2lkICopJlNDX21hdHJpeExvYWRNYXQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqbmV3bWF0KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkUm90YXRlIiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZFJvdGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4TG9hZFNjYWxlIiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZFNjYWxlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4TG9hZFRyYW5zbGF0ZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRUcmFuc2xhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkTXVsdGlwbHkiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkTXVsdGlwbHksCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqbGhzLCBmbG9hdCAqcmhzKSIgfSwKLSAgICB7ICJtYXRyaXhNdWx0aXBseSIsICh2b2lkICopJlNDX21hdHJpeE11bHRpcGx5LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgKnJocykiIH0sCi0gICAgeyAibWF0cml4Um90YXRlIiwgKHZvaWQgKikmU0NfbWF0cml4Um90YXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhTY2FsZSIsICh2b2lkICopJlNDX21hdHJpeFNjYWxlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4VHJhbnNsYXRlIiwgKHZvaWQgKikmU0NfbWF0cml4VHJhbnNsYXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCisgICAgeyAiX1oxNHJzU2VuZFRvQ2xpZW50aSIsICh2b2lkICopJlNDX3RvQ2xpZW50IH0sCisgICAgeyAiX1oxNHJzU2VuZFRvQ2xpZW50aVBLdmoiLCAodm9pZCAqKSZTQ190b0NsaWVudDIgfSwKKyAgICB7ICJfWjIycnNTZW5kVG9DbGllbnRCbG9ja2luZ2kiLCAodm9pZCAqKSZTQ190b0NsaWVudEJsb2NraW5nIH0sCisgICAgeyAiX1oyMnJzU2VuZFRvQ2xpZW50QmxvY2tpbmdpUEt2aiIsICh2b2lkICopJlNDX3RvQ2xpZW50QmxvY2tpbmcyIH0sCiAKLSAgICAvLyB2ZWN0b3IKLSAgICB7ICJ2ZWMyUmFuZCIsICh2b2lkICopJlNDX3ZlYzJSYW5kLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKnZlYywgZmxvYXQgbWF4TGVuKSIgfSwKKyAgICB7ICJfWjlyc0ZvckVhY2g5cnNfc2NyaXB0MTNyc19hbGxvY2F0aW9uUzBfUEt2IiwgKHZvaWQgKikmU0NfRm9yRWFjaCB9LAorICAgIC8veyAiX1o5cnNGb3JFYWNoOXJzX3NjcmlwdDEzcnNfYWxsb2NhdGlvblMwX1BLdiIsICh2b2lkICopJlNDX0ZvckVhY2gyIH0sCiAKLSAgICAvLyB2ZWMzCi0gICAgeyAidmVjM05vcm0iLCAodm9pZCAqKSZTQ192ZWMzTm9ybSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICopIiB9LAotICAgIHsgInZlYzNMZW5ndGgiLCAodm9pZCAqKSZTQ192ZWMzTGVuZ3RoLAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICopIiB9LAotICAgIHsgInZlYzNBZGQiLCAodm9pZCAqKSZTQ192ZWMzQWRkLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNTdWIiLCAodm9pZCAqKSZTQ192ZWMzU3ViLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNDcm9zcyIsICh2b2lkICopJlNDX3ZlYzNDcm9zcywKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzRG90IiwgKHZvaWQgKikmU0NfdmVjM0RvdCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzU2NhbGUiLCAodm9pZCAqKSZTQ192ZWMzU2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBmbG9hdCBzY2FsZSkiIH0sCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi0gICAgLy8gdmVjNAotICAgIHsgInZlYzROb3JtIiwgKHZvaWQgKikmU0NfdmVjNE5vcm0sCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqKSIgfSwKLSAgICB7ICJ2ZWM0TGVuZ3RoIiwgKHZvaWQgKikmU0NfdmVjNExlbmd0aCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqKSIgfSwKLSAgICB7ICJ2ZWM0QWRkIiwgKHZvaWQgKikmU0NfdmVjNEFkZCwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzRfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzRfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWM0U3ViIiwgKHZvaWQgKikmU0NfdmVjNFN1YiwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzRfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzRfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWM0RG90IiwgKHZvaWQgKikmU0NfdmVjNERvdCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzRfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWM0U2NhbGUiLCAodm9pZCAqKSZTQ192ZWM0U2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqbGhzLCBmbG9hdCBzY2FsZSkiIH0sCisgICAgLy97ICJzaW5mX2Zhc3QiLCAodm9pZCAqKSZTQ19zaW5mX2Zhc3QgfSwKKyAgICAvL3sgImNvc2ZfZmFzdCIsICh2b2lkICopJlNDX2Nvc2ZfZmFzdCB9LAogCi0gICAgLy8gY29udGV4dAotICAgIHsgImJpbmRQcm9ncmFtRnJhZ21lbnQiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbUZyYWdtZW50LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotICAgIHsgImJpbmRQcm9ncmFtU3RvcmUiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotICAgIHsgImJpbmRQcm9ncmFtVmVydGV4IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1WZXJ0ZXgsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotICAgIHsgImJpbmRTYW1wbGVyIiwgKHZvaWQgKikmU0NfYmluZFNhbXBsZXIsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgaW50KSIgfSwKLSAgICB7ICJiaW5kVGV4dHVyZSIsICh2b2lkICopJlNDX2JpbmRUZXh0dXJlLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0KLSAgICAvLyB2cAotICAgIHsgInZwTG9hZE1vZGVsTWF0cml4IiwgKHZvaWQgKikmU0NfdnBMb2FkTW9kZWxNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICopIiB9LAotICAgIHsgInZwTG9hZFRleHR1cmVNYXRyaXgiLCAodm9pZCAqKSZTQ192cExvYWRUZXh0dXJlTWF0cml4LAotICAgICAgICAidm9pZCIsICIodm9pZCAqKSIgfSwKLQotCi0KLSAgICAvLyBkcmF3aW5nCi0gICAgeyAiZHJhd1JlY3QiLCAodm9pZCAqKSZTQ19kcmF3UmVjdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KSIgfSwKLSAgICB7ICJkcmF3UXVhZCIsICh2b2lkICopJlNDX2RyYXdRdWFkLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCkiIH0sCi0gICAgeyAiZHJhd1F1YWRUZXhDb29yZHMiLCAodm9pZCAqKSZTQ19kcmF3UXVhZFRleENvb3JkcywKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCkiIH0sCi0gICAgeyAiZHJhd1Nwcml0ZSIsICh2b2lkICopJlNDX2RyYXdTcHJpdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlU2NyZWVuc3BhY2UiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlQ3JvcHBlZCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgsIGZsb2F0IGN4MCwgZmxvYXQgY3kwLCBmbG9hdCBjeDEsIGZsb2F0IGN5MSkiIH0sCi0gICAgeyAiZHJhd0xpbmUiLCAodm9pZCAqKSZTQ19kcmF3TGluZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpIiB9LAotICAgIHsgImRyYXdQb2ludCIsICh2b2lkICopJlNDX2RyYXdQb2ludCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEpIiB9LAotICAgIHsgImRyYXdTaW1wbGVNZXNoIiwgKHZvaWQgKikmU0NfZHJhd1NpbXBsZU1lc2gsCi0gICAgICAgICJ2b2lkIiwgIihpbnQgaXNtKSIgfSwKLSAgICB7ICJkcmF3U2ltcGxlTWVzaFJhbmdlIiwgKHZvaWQgKikmU0NfZHJhd1NpbXBsZU1lc2hSYW5nZSwKLSAgICAgICAgInZvaWQiLCAiKGludCBpc20sIGludCBzdGFydCwgaW50IGxlbikiIH0sCi0KLQotICAgIC8vIG1pc2MKLSAgICB7ICJwZkNsZWFyQ29sb3IiLCAodm9pZCAqKSZTQ19DbGVhckNvbG9yLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImNvbG9yIiwgKHZvaWQgKikmU0NfY29sb3IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiaHNiIiwgKHZvaWQgKikmU0NfaHNiLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImhzYlRvUmdiIiwgKHZvaWQgKikmU0NfaHNiVG9SZ2IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCopIiB9LAotICAgIHsgImhzYlRvQWJnciIsICh2b2lkICopJlNDX2hzYlRvQWJnciwKLSAgICAgICAgImludCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImFtYmllbnQiLCAodm9pZCAqKSZTQ19hbWJpZW50LAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpZmZ1c2UiLCAodm9pZCAqKSZTQ19kaWZmdXNlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInNwZWN1bGFyIiwgKHZvaWQgKikmU0Nfc3BlY3VsYXIsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZW1pc3Npb24iLCAodm9pZCAqKSZTQ19lbWlzc2lvbiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzaGluaW5lc3MiLCAodm9pZCAqKSZTQ19zaGluaW5lc3MsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCkiIH0sCi0gICAgeyAicG9pbnRBdHRlbnVhdGlvbiIsICh2b2lkICopJlNDX3BvaW50QXR0ZW51YXRpb24sCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLQotICAgIHsgInVwbG9hZFRvVGV4dHVyZSIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZSwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJ1cGxvYWRUb0J1ZmZlck9iamVjdCIsICh2b2lkICopJlNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLQotICAgIHsgInN5bmNUb0dMIiwgKHZvaWQgKikmU0Nfc3luY1RvR0wsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0gICAgeyAiY29sb3JGbG9hdFJHQkF0b1VOb3JtOCIsICh2b2lkICopJlNDX2NvbG9yRmxvYXRSR0JBdG9VTm9ybTgsCi0gICAgICAgICJpbnQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJjb2xvckZsb2F0UkdCdG81NjUiLCAodm9pZCAqKSZTQ19jb2xvckZsb2F0UkdCQXRvNTY1LAotICAgICAgICAiaW50IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLQotCi0gICAgeyAiZ2V0V2lkdGgiLCAodm9pZCAqKSZTQ19nZXRXaWR0aCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJnZXRIZWlnaHQiLCAodm9pZCAqKSZTQ19nZXRIZWlnaHQsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0KLSAgICB7ICJzZW5kVG9DbGllbnQiLCAodm9pZCAqKSZTQ190b0NsaWVudCwKLSAgICAgICAgImludCIsICIodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKSIgfSwKLQotCi0gICAgeyAiZGVidWdGIiwgKHZvaWQgKikmU0NfZGVidWdGLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBmbG9hdCkiIH0sCi0gICAgeyAiZGVidWdJMzIiLCAodm9pZCAqKSZTQ19kZWJ1Z0kzMiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgaW50KSIgfSwKLSAgICB7ICJkZWJ1Z0hleEYiLCAodm9pZCAqKSZTQ19kZWJ1Z0hleEYsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGZsb2F0KSIgfSwKLSAgICB7ICJkZWJ1Z0hleEkzMiIsICh2b2lkICopJlNDX2RlYnVnSGV4STMyLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBpbnQpIiB9LAotCi0gICAgeyAic2NyaXB0Q2FsbCIsICh2b2lkICopJlNDX3NjcmlwdENhbGwsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0KLSAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiBjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChjb25zdCBjaGFyICpzeW0pCkBAIC0xNDAwLDE3ICs1NDgsMyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kRGVjbHMoU3RyaW5nOCAqc3RyKQotewotICAgIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltcyA9IGdTeW1zOwotICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1SZXQpOwotICAgICAgICBzdHItPmFwcGVuZCgiICIpOwotICAgICAgICBzdHItPmFwcGVuZChzeW1zLT5tTmFtZSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1QYXJhbSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCI7XG4iKTsKLSAgICAgICAgc3ltcysrOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4ZTdiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNpbmNsdWRlICJyc1NjcmlwdEMuaCIKKworLy8gSW1wbGVtZW50cyByc19jbC5yc2gKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworc3RhdGljIGZsb2F0IFNDX2Fjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFjb3NmKHYpLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXNpbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXNpbmYodikgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXRhbmYodikgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KSB7CisgICAgcmV0dXJuIGF0YW4yZih5LCB4KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19jb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGNvc2YodiAqIE1fUEkpOworfQorCitzdGF0aWMgZmxvYXQgU0NfZXhwMTAoZmxvYXQgdikgeworICAgIHJldHVybiBwb3coMTAuZiwgdik7CisKK30KKworc3RhdGljIGZsb2F0IFNDX2ZyYWN0KGZsb2F0IHYsIGludCAqaXB0cikgeworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICBpcHRyWzBdID0gaTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbG9nMihmbG9hdCB2KSB7CisgICAgcmV0dXJuIGxvZzEwKHYpIC8gbG9nMTAoMi5mKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3Bvd24oZmxvYXQgdiwgaW50IHApIHsKKyAgICByZXR1cm4gcG93Zih2LCAoZmxvYXQpcCk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19wb3dyKGZsb2F0IHYsIGZsb2F0IHApIHsKKyAgICByZXR1cm4gcG93Zih2LCBwKTsKK30KKworZmxvYXQgU0Nfcm9vdG4oZmxvYXQgdiwgaW50IHIpIHsKKyAgICByZXR1cm4gcG93KHYsIDEuZiAvIHIpOworfQorCitmbG9hdCBTQ19yc3FydChmbG9hdCB2KSB7CisgICAgcmV0dXJuIDEuZiAvIHNxcnRmKHYpOworfQorCitmbG9hdCBTQ19zaW5jb3MoZmxvYXQgdiwgZmxvYXQgKmNvc3B0cikgeworICAgICpjb3NwdHIgPSBjb3NmKHYpOworICAgIHJldHVybiBzaW5mKHYpOworfQorCitzdGF0aWMgZmxvYXQgU0Nfc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBzaW5mKHYgKiBNX1BJKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3RhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdGFuZih2ICogTV9QSSk7Cit9CisKKyAgICAvL3sgImxvZ2IiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm1hZCIsICh2b2lkICopJiB9LAorICAgIC8veyAibmFuIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJ0Z2FtbWEiLCAodm9pZCAqKSYgfSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbnRlZ2VyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitzdGF0aWMgdWludDMyX3QgU0NfYWJzX2kzMihpbnQzMl90IHYpIHtyZXR1cm4gYWJzKHYpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19hYnNfaTE2KGludDE2X3Qgdikge3JldHVybiAodWludDE2X3QpYWJzKHYpO30KK3N0YXRpYyB1aW50OF90IFNDX2Fic19pOChpbnQ4X3Qgdikge3JldHVybiAodWludDhfdClhYnModik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfY2x6X3UzMih1aW50MzJfdCB2KSB7cmV0dXJuIF9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIHVpbnQxNl90IFNDX2Nsel91MTYodWludDE2X3Qgdikge3JldHVybiAodWludDE2X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgdWludDhfdCBTQ19jbHpfdTgodWludDhfdCB2KSB7cmV0dXJuICh1aW50OF90KV9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIGludDMyX3QgU0NfY2x6X2kzMihpbnQzMl90IHYpIHtyZXR1cm4gKGludDMyX3QpX19idWlsdGluX2NseigodWludDMyX3Qpdik7fQorc3RhdGljIGludDE2X3QgU0NfY2x6X2kxNihpbnQxNl90IHYpIHtyZXR1cm4gKGludDE2X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgaW50OF90IFNDX2Nsel9pOChpbnQ4X3Qgdikge3JldHVybiAoaW50OF90KV9fYnVpbHRpbl9jbHoodik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfbWF4X3UzMih1aW50MzJfdCB2LCB1aW50MzJfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIHVpbnQxNl90IFNDX21heF91MTYodWludDE2X3QgdiwgdWludDE2X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyB1aW50OF90IFNDX21heF91OCh1aW50OF90IHYsIHVpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyBpbnQzMl90IFNDX21heF9pMzIoaW50MzJfdCB2LCBpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgaW50MTZfdCBTQ19tYXhfaTE2KGludDE2X3QgdiwgaW50MTZfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIGludDhfdCBTQ19tYXhfaTgoaW50OF90IHYsIGludDhfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfbWluX3UzMih1aW50MzJfdCB2LCB1aW50MzJfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIHVpbnQxNl90IFNDX21pbl91MTYodWludDE2X3QgdiwgdWludDE2X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyB1aW50OF90IFNDX21pbl91OCh1aW50OF90IHYsIHVpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyBpbnQzMl90IFNDX21pbl9pMzIoaW50MzJfdCB2LCBpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgaW50MTZfdCBTQ19taW5faTE2KGludDE2X3QgdiwgaW50MTZfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIGludDhfdCBTQ19taW5faTgoaW50OF90IHYsIGludDhfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZsb2F0IHV0aWwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgZmxvYXQgU0NfY2xhbXBfZjMyKGZsb2F0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKQoreworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorCitzdGF0aWMgZmxvYXQgU0NfZGVncmVlcyhmbG9hdCByYWRpYW5zKQoreworICAgIHJldHVybiByYWRpYW5zICogKDE4MC5mIC8gTV9QSSk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19tYXhfZjMyKGZsb2F0IHYsIGZsb2F0IHYyKQoreworICAgIHJldHVybiByc01heCh2LCB2Mik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19taW5fZjMyKGZsb2F0IHYsIGZsb2F0IHYyKQoreworICAgIHJldHVybiByc01pbih2LCB2Mik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19taXhfZjMyKGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCBhbW91bnQpCit7CisgICAgLy9MT0dFKCJsZXJwZiAlZiAgJWYgICVmIiwgc3RhcnQsIHN0b3AsIGFtb3VudCk7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19yYWRpYW5zKGZsb2F0IGRlZ3JlZXMpCit7CisgICAgcmV0dXJuIGRlZ3JlZXMgKiAoTV9QSSAvIDE4MC5mKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3N0ZXBfZjMyKGZsb2F0IGVkZ2UsIGZsb2F0IHYpCit7CisgICAgaWYgKHYgPCBlZGdlKSByZXR1cm4gMC5mOworICAgIHJldHVybiAxLmY7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19zaWduX2YzMihmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPiAwKSByZXR1cm4gMS5mOworICAgIGlmICh2YWx1ZSA8IDApIHJldHVybiAtMS5mOworICAgIHJldHVybiB2YWx1ZTsKK30KKworCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsYXNzIGltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCisKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICAvLyBPcGVuQ0wgbWF0aAorICAgIHsgIl9aNGFjb3NmIiwgKHZvaWQgKikmYWNvc2YgfSwKKyAgICB7ICJfWjVhY29zaGYiLCAodm9pZCAqKSZhY29zaGYgfSwKKyAgICB7ICJfWjZhY29zcGlmIiwgKHZvaWQgKikmU0NfYWNvc3BpIH0sCisgICAgeyAiX1o0YXNpbmYiLCAodm9pZCAqKSZhc2luZiB9LAorICAgIHsgIl9aNWFzaW5oZiIsICh2b2lkICopJmFzaW5oZiB9LAorICAgIHsgIl9aNmFzaW5waWYiLCAodm9pZCAqKSZTQ19hc2lucGkgfSwKKyAgICB7ICJfWjRhdGFuZiIsICh2b2lkICopJmF0YW5mIH0sCisgICAgeyAiX1o1YXRhbjJmIiwgKHZvaWQgKikmYXRhbjJmIH0sCisgICAgeyAiX1o2YXRhbnBpZiIsICh2b2lkICopJlNDX2F0YW5waSB9LAorICAgIHsgIl9aN2F0YW4ycGlmIiwgKHZvaWQgKikmU0NfYXRhbjJwaSB9LAorICAgIHsgIl9aNGNicnRmIiwgKHZvaWQgKikmY2JydGYgfSwKKyAgICB7ICJfWjRjZWlsZiIsICh2b2lkICopJmNlaWxmIH0sCisgICAgeyAiX1o4Y29weXNpZ25mZiIsICh2b2lkICopJmNvcHlzaWduZiB9LAorICAgIHsgIl9aM2Nvc2YiLCAodm9pZCAqKSZjb3NmIH0sCisgICAgeyAiX1o0Y29zaGYiLCAodm9pZCAqKSZjb3NoZiB9LAorICAgIHsgIl9aNWNvc3BpZiIsICh2b2lkICopJlNDX2Nvc3BpIH0sCisgICAgeyAiX1o0ZXJmY2YiLCAodm9pZCAqKSZlcmZjZiB9LAorICAgIHsgIl9aM2VyZmYiLCAodm9pZCAqKSZlcmZmIH0sCisgICAgeyAiX1ozZXhwZiIsICh2b2lkICopJmV4cGYgfSwKKyAgICB7ICJfWjRleHAyZiIsICh2b2lkICopJmV4cDJmIH0sCisgICAgeyAiX1o1ZXhwMTBmIiwgKHZvaWQgKikmU0NfZXhwMTAgfSwKKyAgICB7ICJfWjVleHBtMWYiLCAodm9pZCAqKSZleHBtMWYgfSwKKyAgICB7ICJfWjRmYWJzZiIsICh2b2lkICopJmZhYnNmIH0sCisgICAgeyAiX1o0ZmRpbWZmIiwgKHZvaWQgKikmZmRpbWYgfSwKKyAgICB7ICJfWjVmbG9vcmYiLCAodm9pZCAqKSZmbG9vcmYgfSwKKyAgICB7ICJfWjNmbWFmZmYiLCAodm9pZCAqKSZmbWFmIH0sCisgICAgeyAiX1o0Zm1heGZmIiwgKHZvaWQgKikmZm1heGYgfSwKKyAgICB7ICJfWjRmbWluZmYiLCAodm9pZCAqKSZmbWluZiB9LCAgLy8gZmxvYXQgZm1pbihmbG9hdCwgZmxvYXQpCisgICAgeyAiX1o0Zm1vZGZmIiwgKHZvaWQgKikmZm1vZGYgfSwKKyAgICB7ICJfWjVmcmFjdGZQZiIsICh2b2lkICopJlNDX2ZyYWN0IH0sCisgICAgeyAiX1o1ZnJleHBmUGkiLCAodm9pZCAqKSZmcmV4cGYgfSwKKyAgICB7ICJfWjVoeXBvdGZmIiwgKHZvaWQgKikmaHlwb3RmIH0sCisgICAgeyAiX1o1aWxvZ2JmIiwgKHZvaWQgKikmaWxvZ2JmIH0sCisgICAgeyAiX1o1bGRleHBmaSIsICh2b2lkICopJmxkZXhwZiB9LAorICAgIHsgIl9aNmxnYW1tYWYiLCAodm9pZCAqKSZsZ2FtbWFmIH0sCisgICAgeyAiX1ozbG9nZiIsICh2b2lkICopJmxvZ2YgfSwKKyAgICB7ICJfWjRsb2cyZiIsICh2b2lkICopJlNDX2xvZzIgfSwKKyAgICB7ICJfWjVsb2cxMGYiLCAodm9pZCAqKSZsb2cxMGYgfSwKKyAgICB7ICJfWjVsb2cxcGYiLCAodm9pZCAqKSZsb2cxcGYgfSwKKyAgICAvL3sgImxvZ2IiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm1hZCIsICh2b2lkICopJiB9LAorICAgIHsgIm1vZGYiLCAodm9pZCAqKSZtb2RmZiB9LAorICAgIC8veyAibmFuIiwgKHZvaWQgKikmIH0sCisgICAgeyAiX1o5bmV4dGFmdGVyZmYiLCAodm9pZCAqKSZuZXh0YWZ0ZXJmIH0sCisgICAgeyAiX1ozcG93ZmYiLCAodm9pZCAqKSZwb3dmIH0sCisgICAgeyAiX1o0cG93bmZpIiwgKHZvaWQgKikmU0NfcG93biB9LAorICAgIHsgIl9aNHBvd3JmZiIsICh2b2lkICopJlNDX3Bvd3IgfSwKKyAgICB7ICJfWjlyZW1haW5kZXJmZiIsICh2b2lkICopJnJlbWFpbmRlcmYgfSwKKyAgICB7ICJyZW1xdW8iLCAodm9pZCAqKSZyZW1xdW9mIH0sCisgICAgeyAiX1o0cmludGYiLCAodm9pZCAqKSZyaW50ZiB9LAorICAgIHsgIl9aNXJvb3RuZmkiLCAodm9pZCAqKSZTQ19yb290biB9LAorICAgIHsgIl9aNXJvdW5kZiIsICh2b2lkICopJnJvdW5kZiB9LAorICAgIHsgIl9aNXJzcXJ0ZiIsICh2b2lkICopJlNDX3JzcXJ0IH0sCisgICAgeyAiX1ozc2luZiIsICh2b2lkICopJnNpbmYgfSwKKyAgICB7ICJzaW5jb3MiLCAodm9pZCAqKSZTQ19zaW5jb3MgfSwKKyAgICB7ICJfWjRzaW5oZiIsICh2b2lkICopJnNpbmhmIH0sCisgICAgeyAiX1o1c2lucGlmIiwgKHZvaWQgKikmU0Nfc2lucGkgfSwKKyAgICB7ICJfWjRzcXJ0ZiIsICh2b2lkICopJnNxcnRmIH0sCisgICAgeyAiX1ozdGFuZiIsICh2b2lkICopJnRhbmYgfSwKKyAgICB7ICJfWjR0YW5oZiIsICh2b2lkICopJnRhbmhmIH0sCisgICAgeyAiX1o1dGFucGlmIiwgKHZvaWQgKikmU0NfdGFucGkgfSwKKyAgICAvL3sgInRnYW1tYSIsICh2b2lkICopJiB9LAorICAgIHsgIl9aNXRydW5jZiIsICh2b2lkICopJnRydW5jZiB9LAorCisgICAgLy8gT3BlbkNMIEludAorICAgIHsgIl9aM2Fic2kiLCAodm9pZCAqKSZTQ19hYnNfaTMyIH0sCisgICAgeyAiX1ozYWJzcyIsICh2b2lkICopJlNDX2Fic19pMTYgfSwKKyAgICB7ICJfWjNhYnNjIiwgKHZvaWQgKikmU0NfYWJzX2k4IH0sCisgICAgeyAiX1ozY2x6aiIsICh2b2lkICopJlNDX2Nsel91MzIgfSwKKyAgICB7ICJfWjNjbHp0IiwgKHZvaWQgKikmU0NfY2x6X3UxNiB9LAorICAgIHsgIl9aM2NsemgiLCAodm9pZCAqKSZTQ19jbHpfdTggfSwKKyAgICB7ICJfWjNjbHppIiwgKHZvaWQgKikmU0NfY2x6X2kzMiB9LAorICAgIHsgIl9aM2NsenMiLCAodm9pZCAqKSZTQ19jbHpfaTE2IH0sCisgICAgeyAiX1ozY2x6YyIsICh2b2lkICopJlNDX2Nsel9pOCB9LAorICAgIHsgIl9aM21heGpqIiwgKHZvaWQgKikmU0NfbWF4X3UzMiB9LAorICAgIHsgIl9aM21heHR0IiwgKHZvaWQgKikmU0NfbWF4X3UxNiB9LAorICAgIHsgIl9aM21heGhoIiwgKHZvaWQgKikmU0NfbWF4X3U4IH0sCisgICAgeyAiX1ozbWF4aWkiLCAodm9pZCAqKSZTQ19tYXhfaTMyIH0sCisgICAgeyAiX1ozbWF4c3MiLCAodm9pZCAqKSZTQ19tYXhfaTE2IH0sCisgICAgeyAiX1ozbWF4Y2MiLCAodm9pZCAqKSZTQ19tYXhfaTggfSwKKyAgICB7ICJfWjNtaW5qaiIsICh2b2lkICopJlNDX21pbl91MzIgfSwKKyAgICB7ICJfWjNtaW50dCIsICh2b2lkICopJlNDX21pbl91MTYgfSwKKyAgICB7ICJfWjNtaW5oaCIsICh2b2lkICopJlNDX21pbl91OCB9LAorICAgIHsgIl9aM21pbmlpIiwgKHZvaWQgKikmU0NfbWluX2kzMiB9LAorICAgIHsgIl9aM21pbnNzIiwgKHZvaWQgKikmU0NfbWluX2kxNiB9LAorICAgIHsgIl9aM21pbmNjIiwgKHZvaWQgKikmU0NfbWluX2k4IH0sCisKKyAgICAvLyBPcGVuQ0wgNi4xMS40CisgICAgeyAiX1o1Y2xhbXBmZmYiLCAodm9pZCAqKSZTQ19jbGFtcF9mMzIgfSwKKyAgICB7ICJfWjdkZWdyZWVzZiIsICh2b2lkICopJlNDX2RlZ3JlZXMgfSwKKyAgICB7ICJfWjNtYXhmZiIsICh2b2lkICopJlNDX21heF9mMzIgfSwKKyAgICB7ICJfWjNtaW5mZiIsICh2b2lkICopJlNDX21pbl9mMzIgfSwKKyAgICB7ICJfWjNtaXhmZmYiLCAodm9pZCAqKSZTQ19taXhfZjMyIH0sCisgICAgeyAiX1o3cmFkaWFuc2YiLCAodm9pZCAqKSZTQ19yYWRpYW5zIH0sCisgICAgeyAiX1o0c3RlcGZmIiwgKHZvaWQgKikmU0Nfc3RlcF9mMzIgfSwKKyAgICAvL3sgInNtb290aHN0ZXAiLCAodm9pZCAqKSYgfSwKKyAgICB7ICJfWjRzaWduZiIsICh2b2lkICopJlNDX3NpZ25fZjMyIH0sCisKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKworY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICogU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xDTChjb25zdCBjaGFyICpzeW0pCit7CisgICAgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW1zID0gZ1N5bXM7CisKKyAgICB3aGlsZSAoc3ltcy0+bVB0cikgeworICAgICAgICBpZiAoIXN0cmNtcChzeW1zLT5tTmFtZSwgc3ltKSkgeworICAgICAgICAgICAgcmV0dXJuIHN5bXM7CisgICAgICAgIH0KKyAgICAgICAgc3ltcysrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTFjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAKQEAgLTAsMCArMSw1MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKworI2luY2x1ZGUgInV0aWxzL1RpbWVycy5oIgorCisjZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDx0aW1lLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworI2RlZmluZSBHRVRfVExTKCkgIENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqIHRscyA9IFwKKyAgICAoQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICopcHRocmVhZF9nZXRzcGVjaWZpYyhDb250ZXh0OjpnVGhyZWFkVExTS2V5KTsgXAorICAgIENvbnRleHQgKiByc2MgPSB0bHMtPm1Db250ZXh0OyBcCisgICAgU2NyaXB0QyAqIHNjID0gKFNjcmlwdEMgKikgdGxzLT5tU2NyaXB0CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb250ZXh0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgU0NfYmluZFRleHR1cmUoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCB1aW50MzJfdCBzbG90LCBSc0FsbG9jYXRpb24gdmEpCit7CisgICAgQ0hFQ0tfT0JKX09SX05VTEwodmEpOworICAgIENIRUNLX09CSih2cGYpOworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfUHJvZ3JhbUJpbmRUZXh0dXJlKHJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKKworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kU2FtcGxlcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzU2FtcGxlciB2cykKK3sKKyAgICBDSEVDS19PQkpfT1JfTlVMTCh2cyk7CisgICAgQ0hFQ0tfT0JKKHZwZik7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Qcm9ncmFtQmluZFNhbXBsZXIocnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50ICo+KHZwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2FtcGxlciAqPih2cykpOworCit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtU3RvcmUoUnNQcm9ncmFtU3RvcmUgcGZzKQoreworICAgIENIRUNLX09CSl9PUl9OVUxMKHBmcyk7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1TdG9yZShyc2MsIHBmcyk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCit7CisgICAgQ0hFQ0tfT0JKX09SX05VTEwocGYpOworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQocnNjLCBwZik7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtVmVydGV4KFJzUHJvZ3JhbVZlcnRleCBwdikKK3sKKyAgICBDSEVDS19PQkpfT1JfTlVMTChwdik7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgocnNjLCBwdik7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtUmFzdGVyKFJzUHJvZ3JhbVJhc3RlciBwdikKK3sKKyAgICBDSEVDS19PQkpfT1JfTlVMTChwdik7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIocnNjLCBwdik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVlAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ192cExvYWRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldFByb2plY3Rpb25NYXRyaXgocnNjLCBtKTsKK30KKworc3RhdGljIHZvaWQgU0NfdnBMb2FkTW9kZWxNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+c2V0TW9kZWx2aWV3TWF0cml4KHJzYywgbSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3ZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+c2V0VGV4dHVyZU1hdHJpeChyc2MsIG0pOworfQorCisKK3N0YXRpYyB2b2lkIFNDX3BmQ29uc3RhbnRDb2xvcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIENIRUNLX09CSih2cGYpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKTsKKyAgICBwZi0+c2V0Q29uc3RhbnRDb2xvcihyc2MsIHIsIGcsIGIsIGEpOworfQorCitzdGF0aWMgdm9pZCBTQ192cEdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+Z2V0UHJvamVjdGlvbk1hdHJpeChyc2MsIG0pOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vTE9HRSgiUXVhZCIpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgxLCB5MSwgejEpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgyLCB5MiwgejIpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgzLCB5MywgejMpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHg0LCB5NCwgejQpOworCisgICAgZmxvYXQgdnR4W10gPSB7eDEseTEsejEsIHgyLHkyLHoyLCB4Myx5Myx6MywgeDQseTQsejR9OworICAgIGNvbnN0IGZsb2F0IHRleFtdID0ge3UxLHYxLCB1Mix2MiwgdTMsdjMsIHU0LHY0fTsKKworICAgIFZlcnRleEFycmF5IHZhOworICAgIHZhLmFkZChHTF9GTE9BVCwgMywgMTIsIGZhbHNlLCAodWludDMyX3QpdnR4LCAiQVRUUklCX3Bvc2l0aW9uIik7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAyLCA4LCBmYWxzZSwgKHVpbnQzMl90KXRleCwgIkFUVFJJQl90ZXh0dXJlMCIpOworICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7CisKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCkKK3sKKyAgICBTQ19kcmF3UXVhZFRleENvb3Jkcyh4MSwgeTEsIHoxLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgyLCB5MiwgejIsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDMsIHkzLCB6MywgMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4NCwgeTQsIHo0LCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCit7CisgICAgR0VUX1RMUygpOworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVZlcnRleD4gdG1wKHJzYy0+Z2V0VmVydGV4KCkpOworICAgIHJzYy0+c2V0VmVydGV4KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7CisgICAgLy9yc2MtPnNldHVwQ2hlY2soKTsKKworICAgIC8vR0xpbnQgY3JvcFs0XSA9IHswLCBoLCB3LCAtaH07CisKKyAgICBmbG9hdCBzaCA9IHJzYy0+Z2V0SGVpZ2h0KCk7CisKKyAgICBTQ19kcmF3UXVhZCh4LCAgIHNoIC0geSwgICAgIHosCisgICAgICAgICAgICAgICAgeCt3LCBzaCAtIHksICAgICB6LAorICAgICAgICAgICAgICAgIHgrdywgc2ggLSAoeStoKSwgeiwKKyAgICAgICAgICAgICAgICB4LCAgIHNoIC0gKHkraCksIHopOworICAgIHJzYy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wLmdldCgpKTsKK30KKy8qCitzdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCit7CisgICAgR0VUX1RMUygpOworICAgIGZsb2F0IHZpblszXSA9IHt4LCB5LCB6fTsKKyAgICBmbG9hdCB2b3V0WzRdOworCisgICAgLy9MT0dFKCJkcyAgaW4gJWYgJWYgJWYiLCB4LCB5LCB6KTsKKyAgICByc2MtPmdldFZlcnRleCgpLT50cmFuc2Zvcm1Ub1NjcmVlbihyc2MsIHZvdXQsIHZpbik7CisgICAgLy9MT0dFKCJkcyAgb3V0ICVmICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSwgdm91dFszXSk7CisgICAgdm91dFswXSAvPSB2b3V0WzNdOworICAgIHZvdXRbMV0gLz0gdm91dFszXTsKKyAgICB2b3V0WzJdIC89IHZvdXRbM107CisKKyAgICB2b3V0WzBdICo9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7CisgICAgdm91dFsxXSAqPSByc2MtPmdldEhlaWdodCgpIC8gMjsKKyAgICB2b3V0WzBdICs9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7CisgICAgdm91dFsxXSArPSByc2MtPmdldEhlaWdodCgpIC8gMjsKKworICAgIHZvdXRbMF0gLT0gdy8yOworICAgIHZvdXRbMV0gLT0gaC8yOworCisgICAgLy9MT0dFKCJkcyAgb3V0MiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0pOworCisgICAgLy8gVSwgViwgVywgSAorICAgIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSh2b3V0WzBdLCB2b3V0WzFdLCB6LCBoLCB3KTsKKyAgICAvL3JzYy0+c2V0dXBDaGVjaygpOworfQorKi8KKworc3RhdGljIHZvaWQgU0NfZHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KQoreworICAgIC8vTE9HRSgiU0NfZHJhd1JlY3QgJWYsJWYgICVmLCVmICAlZiIsIHgxLCB5MSwgeDIsIHkyLCB6KTsKKyAgICBTQ19kcmF3UXVhZCh4MSwgeTIsIHosCisgICAgICAgICAgICAgICAgeDIsIHkyLCB6LAorICAgICAgICAgICAgICAgIHgyLCB5MSwgeiwKKyAgICAgICAgICAgICAgICB4MSwgeTEsIHopOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3TWVzaChSc01lc2ggdnNtKQoreworICAgIENIRUNLX09CSih2c20pOworICAgIEdFVF9UTFMoKTsKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4odnNtKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc20tPnJlbmRlcihyc2MpOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3TWVzaFByaW1pdGl2ZShSc01lc2ggdnNtLCB1aW50MzJfdCBwcmltSW5kZXgpCit7CisgICAgQ0hFQ0tfT0JKKHZzbSk7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbS0+cmVuZGVyUHJpbWl0aXZlKHJzYywgcHJpbUluZGV4KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd01lc2hQcmltaXRpdmVSYW5nZShSc01lc2ggdnNtLCB1aW50MzJfdCBwcmltSW5kZXgsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pCit7CisgICAgQ0hFQ0tfT0JKKHZzbSk7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbS0+cmVuZGVyUHJpbWl0aXZlUmFuZ2UocnNjLCBwcmltSW5kZXgsIHN0YXJ0LCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBTQ19tZXNoQ29tcHV0ZUJvdW5kaW5nQm94KFJzTWVzaCB2c20sIGZsb2F0ICptaW5YLCBmbG9hdCAqbWluWSwgZmxvYXQgKm1pblosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICptYXhYLCBmbG9hdCAqbWF4WSwgZmxvYXQgKm1heFopCit7CisgICAgQ0hFQ0tfT0JKKHZzbSk7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIHNtLT5jb21wdXRlQkJveCgpOworICAgICptaW5YID0gc20tPm1CQm94TWluWzBdOworICAgICptaW5ZID0gc20tPm1CQm94TWluWzFdOworICAgICptaW5aID0gc20tPm1CQm94TWluWzJdOworICAgICptYXhYID0gc20tPm1CQm94TWF4WzBdOworICAgICptYXhZID0gc20tPm1CQm94TWF4WzFdOworICAgICptYXhaID0gc20tPm1CQm94TWF4WzJdOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3N0YXRpYyB2b2lkIFNDX2NvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSAoUHJvZ3JhbUZyYWdtZW50ICopcnNjLT5nZXRGcmFnbWVudCgpOworICAgIHBmLT5zZXRDb25zdGFudENvbG9yKHJzYywgciwgZywgYiwgYSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZTIoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBiYXNlTWlwTGV2ZWwpCit7CisgICAgQ0hFQ0tfT0JKKHZhKTsKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0FsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUocnNjLCB2YSwgZmFsc2UsIGJhc2VNaXBMZXZlbCk7Cit9CitzdGF0aWMgdm9pZCBTQ191cGxvYWRUb1RleHR1cmUoUnNBbGxvY2F0aW9uIHZhKQoreworICAgIENIRUNLX09CSih2YSk7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKHJzYywgdmEsIGZhbHNlLCAwKTsKK30KKworc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QoUnNBbGxvY2F0aW9uIHZhKQoreworICAgIENIRUNLX09CSih2YSk7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjLCB2YSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0NsZWFyQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5zZXR1cFByb2dyYW1TdG9yZSgpOworCisgICAgZ2xDbGVhckNvbG9yKHIsIGcsIGIsIGEpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0NsZWFyRGVwdGgoZmxvYXQgdikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5zZXR1cFByb2dyYW1TdG9yZSgpOworCisgICAgZ2xDbGVhckRlcHRoZih2KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQpOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfZ2V0V2lkdGgoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByZXR1cm4gcnNjLT5nZXRXaWR0aCgpOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfZ2V0SGVpZ2h0KCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIHJzYy0+Z2V0SGVpZ2h0KCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0RyYXdUZXh0QWxsb2MoUnNBbGxvY2F0aW9uIHZhLCBpbnQgeCwgaW50IHkpCit7CisgICAgQ0hFQ0tfT0JKKHZhKTsKKyAgICBHRVRfVExTKCk7CisgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gKGNvbnN0IGNoYXIgKilhbGxvYy0+Z2V0UHRyKCk7CisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IGFsbG9jLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpOworICAgIHJzYy0+bVN0YXRlRm9udC5yZW5kZXJUZXh0KHRleHQsIGFsbG9jU2l6ZSwgeCwgeSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0RyYXdUZXh0KGNvbnN0IGNoYXIgKnRleHQsIGludCB4LCBpbnQgeSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgc2l6ZV90IHRleHRMZW4gPSBzdHJsZW4odGV4dCk7CisgICAgcnNjLT5tU3RhdGVGb250LnJlbmRlclRleHQodGV4dCwgdGV4dExlbiwgeCwgeSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3NldE1ldHJpY3MoRm9udDo6UmVjdCAqbWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnRvcCwgaW50MzJfdCAqYm90dG9tKQoreworICAgIGlmKGxlZnQpIHsKKyAgICAgICAgKmxlZnQgPSBtZXRyaWNzLT5sZWZ0OworICAgIH0KKyAgICBpZihyaWdodCkgeworICAgICAgICAqcmlnaHQgPSBtZXRyaWNzLT5yaWdodDsKKyAgICB9CisgICAgaWYodG9wKSB7CisgICAgICAgICp0b3AgPSBtZXRyaWNzLT50b3A7CisgICAgfQorICAgIGlmKGJvdHRvbSkgeworICAgICAgICAqYm90dG9tID0gbWV0cmljcy0+Ym90dG9tOworICAgIH0KK30KKworc3RhdGljIHZvaWQgU0NfTWVhc3VyZVRleHRBbGxvYyhSc0FsbG9jYXRpb24gdmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICp0b3AsIGludDMyX3QgKmJvdHRvbSkKK3sKKyAgICBDSEVDS19PQkoodmEpOworICAgIEdFVF9UTFMoKTsKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIGNvbnN0IGNoYXIgKnRleHQgPSAoY29uc3QgY2hhciAqKWFsbG9jLT5nZXRQdHIoKTsKKyAgICBzaXplX3QgdGV4dExlbiA9IGFsbG9jLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpOworICAgIEZvbnQ6OlJlY3QgbWV0cmljczsKKyAgICByc2MtPm1TdGF0ZUZvbnQubWVhc3VyZVRleHQodGV4dCwgdGV4dExlbiwgJm1ldHJpY3MpOworICAgIFNDX3NldE1ldHJpY3MoJm1ldHJpY3MsIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX01lYXN1cmVUZXh0KGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICpyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnRvcCwgaW50MzJfdCAqYm90dG9tKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBzaXplX3QgdGV4dExlbiA9IHN0cmxlbih0ZXh0KTsKKyAgICBGb250OjpSZWN0IG1ldHJpY3M7CisgICAgcnNjLT5tU3RhdGVGb250Lm1lYXN1cmVUZXh0KHRleHQsIHRleHRMZW4sICZtZXRyaWNzKTsKKyAgICBTQ19zZXRNZXRyaWNzKCZtZXRyaWNzLCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pOworfQorCitzdGF0aWMgdm9pZCBTQ19CaW5kRm9udChSc0ZvbnQgZm9udCkKK3sKKyAgICBDSEVDS19PQkooZm9udCk7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZEZvbnQocnNjLCBmb250KTsKK30KKworc3RhdGljIHZvaWQgU0NfRm9udENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+bVN0YXRlRm9udC5zZXRGb250Q29sb3IociwgZywgYiwgYSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBsbHZtIG5hbWUgbWFuZ2xpbmcgcmVmCisvLyAgPGJ1aWx0aW4tdHlwZT4gOjo9IHYgICMgdm9pZAorLy8gICAgICAgICAgICAgICAgIDo6PSBiICAjIGJvb2wKKy8vICAgICAgICAgICAgICAgICA6Oj0gYyAgIyBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGEgICMgc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gaCAgIyB1bnNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IHMgICMgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gdCAgIyB1bnNpZ25lZCBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSBpICAjIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBqICAjIHVuc2lnbmVkIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBsICAjIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0gbSAgIyB1bnNpZ25lZCBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IHggICMgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IHkgICMgdW5zaWduZWQgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IGYgICMgZmxvYXQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZCAgIyBkb3VibGUKKworc3RhdGljIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBnU3ltc1tdID0geworICAgIHsgIl9aMjJyc2dCaW5kUHJvZ3JhbUZyYWdtZW50MTlyc19wcm9ncmFtX2ZyYWdtZW50IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudCB9LAorICAgIHsgIl9aMTlyc2dCaW5kUHJvZ3JhbVN0b3JlMTZyc19wcm9ncmFtX3N0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1TdG9yZSB9LAorICAgIHsgIl9aMjByc2dCaW5kUHJvZ3JhbVZlcnRleDE3cnNfcHJvZ3JhbV92ZXJ0ZXgiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVZlcnRleCB9LAorICAgIHsgIl9aMjByc2dCaW5kUHJvZ3JhbVJhc3RlcjE3cnNfcHJvZ3JhbV9yYXN0ZXIiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVJhc3RlciB9LAorICAgIHsgIl9aMTRyc2dCaW5kU2FtcGxlcjE5cnNfcHJvZ3JhbV9mcmFnbWVudGoxMHJzX3NhbXBsZXIiLCAodm9pZCAqKSZTQ19iaW5kU2FtcGxlciB9LAorICAgIHsgIl9aMTRyc2dCaW5kVGV4dHVyZTE5cnNfcHJvZ3JhbV9mcmFnbWVudGoxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19iaW5kVGV4dHVyZSB9LAorCisgICAgeyAiX1ozNnJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeFBLMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ192cExvYWRQcm9qZWN0aW9uTWF0cml4IH0sCisgICAgeyAiX1ozMXJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXhQSzEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfdnBMb2FkTW9kZWxNYXRyaXggfSwKKyAgICB7ICJfWjMzcnNnUHJvZ3JhbVZlcnRleExvYWRUZXh0dXJlTWF0cml4UEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwTG9hZFRleHR1cmVNYXRyaXggfSwKKworICAgIHsgIl9aMzVyc2dQcm9ncmFtVmVydGV4R2V0UHJvamVjdGlvbk1hdHJpeFAxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwR2V0UHJvamVjdGlvbk1hdHJpeCB9LAorCisgICAgeyAiX1ozMXJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IxOXJzX3Byb2dyYW1fZnJhZ21lbnRmZmZmIiwgKHZvaWQgKikmU0NfcGZDb25zdGFudENvbG9yIH0sCisKKyAgICB7ICJfWjExcnNnR2V0V2lkdGh2IiwgKHZvaWQgKikmU0NfZ2V0V2lkdGggfSwKKyAgICB7ICJfWjEycnNnR2V0SGVpZ2h0diIsICh2b2lkICopJlNDX2dldEhlaWdodCB9LAorCisgICAgeyAiX1oxOHJzZ1VwbG9hZFRvVGV4dHVyZTEzcnNfYWxsb2NhdGlvbmoiLCAodm9pZCAqKSZTQ191cGxvYWRUb1RleHR1cmUyIH0sCisgICAgeyAiX1oxOHJzZ1VwbG9hZFRvVGV4dHVyZTEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZSB9LAorICAgIHsgIl9aMjNyc2dVcGxvYWRUb0J1ZmZlck9iamVjdDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNnRHJhd1JlY3RmZmZmZiIsICh2b2lkICopJlNDX2RyYXdSZWN0IH0sCisgICAgeyAiX1oxMXJzZ0RyYXdRdWFkZmZmZmZmZmZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1F1YWQgfSwKKyAgICB7ICJfWjIwcnNnRHJhd1F1YWRUZXhDb29yZHNmZmZmZmZmZmZmZmZmZmZmZmZmZiIsICh2b2lkICopJlNDX2RyYXdRdWFkVGV4Q29vcmRzIH0sCisgICAgeyAiX1oyNHJzZ0RyYXdTcHJpdGVTY3JlZW5zcGFjZWZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlIH0sCisKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaCIsICh2b2lkICopJlNDX2RyYXdNZXNoIH0sCisgICAgeyAiX1oxMXJzZ0RyYXdNZXNoN3JzX21lc2hqIiwgKHZvaWQgKikmU0NfZHJhd01lc2hQcmltaXRpdmUgfSwKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaGpqaiIsICh2b2lkICopJlNDX2RyYXdNZXNoUHJpbWl0aXZlUmFuZ2UgfSwKKyAgICB7ICJfWjI1cnNnTWVzaENvbXB1dGVCb3VuZGluZ0JveDdyc19tZXNoUGZTMF9TMF9TMF9TMF9TMF8iLCAodm9pZCAqKSZTQ19tZXNoQ29tcHV0ZUJvdW5kaW5nQm94IH0sCisKKyAgICB7ICJfWjEzcnNnQ2xlYXJDb2xvcmZmZmYiLCAodm9pZCAqKSZTQ19DbGVhckNvbG9yIH0sCisgICAgeyAiX1oxM3JzZ0NsZWFyRGVwdGhmIiwgKHZvaWQgKikmU0NfQ2xlYXJEZXB0aCB9LAorCisgICAgeyAiX1oxMXJzZ0RyYXdUZXh0UEtjaWkiLCAodm9pZCAqKSZTQ19EcmF3VGV4dCB9LAorICAgIHsgIl9aMTFyc2dEcmF3VGV4dDEzcnNfYWxsb2NhdGlvbmlpIiwgKHZvaWQgKikmU0NfRHJhd1RleHRBbGxvYyB9LAorICAgIHsgIl9aMTRyc2dNZWFzdXJlVGV4dFBLY1BpUzFfUzFfUzFfIiwgKHZvaWQgKikmU0NfTWVhc3VyZVRleHQgfSwKKyAgICB7ICJfWjE0cnNnTWVhc3VyZVRleHQxM3JzX2FsbG9jYXRpb25QaVMwX1MwX1MwXyIsICh2b2lkICopJlNDX01lYXN1cmVUZXh0QWxsb2MgfSwKKworICAgIHsgIl9aMTFyc2dCaW5kRm9udDdyc19mb250IiwgKHZvaWQgKikmU0NfQmluZEZvbnQgfSwKKyAgICB7ICJfWjEycnNnRm9udENvbG9yZmZmZiIsICh2b2lkICopJlNDX0ZvbnRDb2xvciB9LAorCisgICAgLy8gbWlzYworICAgIHsgIl9aNWNvbG9yZmZmZiIsICh2b2lkICopJlNDX2NvbG9yIH0sCisKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKworY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICogU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xHTChjb25zdCBjaGFyICpzeW0pCit7CisgICAgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW1zID0gZ1N5bXM7CisKKyAgICB3aGlsZSAoc3ltcy0+bVB0cikgeworICAgICAgICBpZiAoIXN0cmNtcChzeW1zLT5tTmFtZSwgc3ltKSkgeworICAgICAgICAgICAgcmV0dXJuIHN5bXM7CisgICAgICAgIH0KKyAgICAgICAgc3ltcysrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcCBiL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKaW5kZXggNDcxMWQxYi4uNDVmNjIwNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcAorKysgYi9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCkBAIC0xNCwxMCArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yNSwyMCArMjksMTUgQEAKIAogU2hhZGVyQ2FjaGU6OlNoYWRlckNhY2hlKCkKIHsKLSAgICBtRW50cnlDb3VudCA9IDA7Ci0gICAgbUVudHJ5QWxsb2NhdGlvbkNvdW50ID0gMTY7Ci0gICAgbUVudHJpZXMgPSAoZW50cnlfdCAqKWNhbGxvYyhtRW50cnlBbGxvY2F0aW9uQ291bnQsIHNpemVvZihlbnRyeV90KSk7CisgICAgbUVudHJpZXMuc2V0Q2FwYWNpdHkoMTYpOwogfQogCiBTaGFkZXJDYWNoZTo6flNoYWRlckNhY2hlKCkKIHsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUVudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1FbnRyaWVzW2N0XS5wcm9ncmFtKTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUVudHJpZXMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShtRW50cmllc1tjdF0tPnByb2dyYW0pOworICAgICAgICBmcmVlKG1FbnRyaWVzW2N0XSk7CiAgICAgfQotCi0gICAgbUVudHJ5Q291bnQgPSAwOwotICAgIG1FbnRyeUFsbG9jYXRpb25Db3VudCA9IDA7Ci0gICAgZnJlZShtRW50cmllcyk7CiB9CiAKIGJvb2wgU2hhZGVyQ2FjaGU6Omxvb2t1cChDb250ZXh0ICpyc2MsIFByb2dyYW1WZXJ0ZXggKnZ0eCwgUHJvZ3JhbUZyYWdtZW50ICpmcmFnKQpAQCAtNDksNjEgKzQ4LDQ2IEBACiAgICAgaWYgKCFmcmFnLT5nZXRTaGFkZXJJRCgpKSB7CiAgICAgICAgIGZyYWctPmxvYWRTaGFkZXIocnNjKTsKICAgICB9CisKKyAgICAvLyBEb24ndCB0cnkgdG8gY2FjaGUgaWYgc2hhZGVycyBmYWlsZWQgdG8gbG9hZAorICAgIGlmKCF2dHgtPmdldFNoYWRlcklEKCkgfHwgIWZyYWctPmdldFNoYWRlcklEKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICAvL0xPR1YoIlNoYWRlckNhY2hlIGxvb2t1cCAgdnR4ICVpLCBmcmFnICVpIiwgdnR4LT5nZXRTaGFkZXJJRCgpLCBmcmFnLT5nZXRTaGFkZXJJRCgpKTsKKyAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gbUVudHJpZXMuc2l6ZSgpOworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgZW50cnlDb3VudDsgY3QgKyspIHsKKyAgICAgICAgaWYgKChtRW50cmllc1tjdF0tPnZ0eCA9PSB2dHgtPmdldFNoYWRlcklEKCkpICYmCisgICAgICAgICAgICAobUVudHJpZXNbY3RdLT5mcmFnID09IGZyYWctPmdldFNoYWRlcklEKCkpKSB7CiAKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUVudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgaWYgKChtRW50cmllc1tjdF0udnR4ID09IHZ0eC0+Z2V0U2hhZGVySUQoKSkgJiYKLSAgICAgICAgICAgIChtRW50cmllc1tjdF0uZnJhZyA9PSBmcmFnLT5nZXRTaGFkZXJJRCgpKSkgewotCi0gICAgICAgICAgICAvL0xPR1YoIlNDIHVzaW5nIHByb2dyYW0gJWkiLCBtRW50cmllc1tjdF0ucHJvZ3JhbSk7Ci0gICAgICAgICAgICBnbFVzZVByb2dyYW0obUVudHJpZXNbY3RdLnByb2dyYW0pOwotICAgICAgICAgICAgbUN1cnJlbnQgPSAmbUVudHJpZXNbY3RdOworICAgICAgICAgICAgLy9MT0dWKCJTQyB1c2luZyBwcm9ncmFtICVpIiwgbUVudHJpZXNbY3RdLT5wcm9ncmFtKTsKKyAgICAgICAgICAgIGdsVXNlUHJvZ3JhbShtRW50cmllc1tjdF0tPnByb2dyYW0pOworICAgICAgICAgICAgbUN1cnJlbnQgPSBtRW50cmllc1tjdF07CiAgICAgICAgICAgICAvL0xPR1YoIlNoYWRlckNhY2hlIGhpdCwgdXNpbmcgJWkiLCBjdCk7CiAgICAgICAgICAgICByc2MtPmNoZWNrRXJyb3IoIlNoYWRlckNhY2hlOjpsb29rdXAgKGhpdCkiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIE5vdCBpbiBjYWNoZSwgYWRkIGl0LgogCi0gICAgaWYgKG1FbnRyeUFsbG9jYXRpb25Db3VudCA9PSBtRW50cnlDb3VudCkgewotICAgICAgICAvLyBPdXQgb2Ygc3BhY2UsIG1ha2Ugc29tZS4KLSAgICAgICAgbUVudHJ5QWxsb2NhdGlvbkNvdW50ICo9IDI7Ci0gICAgICAgIGVudHJ5X3QgKmUgPSAoZW50cnlfdCAqKWNhbGxvYyhtRW50cnlBbGxvY2F0aW9uQ291bnQsIHNpemVvZihlbnRyeV90KSk7Ci0gICAgICAgIGlmICghZSkgewotICAgICAgICAgICAgTE9HRSgiT3V0IG9mIG1lbW9yeSBmb3IgU2hhZGVyQ2FjaGU6Omxvb2t1cCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShlLCBtRW50cmllcywgc2l6ZW9mKGVudHJ5X3QpICogbUVudHJ5Q291bnQpOwotICAgICAgICBmcmVlKG1FbnRyaWVzKTsKLSAgICAgICAgbUVudHJpZXMgPSBlOwotICAgIH0KLQotICAgIC8vTE9HVigiU2hhZGVyQ2FjaGUgbWlzcywgdXNpbmcgJWkiLCBtRW50cnlDb3VudCk7CisgICAgLy9MT0dWKCJTaGFkZXJDYWNoZSBtaXNzIik7CiAgICAgLy9MT0dFKCJlMCAleCIsIGdsR2V0RXJyb3IoKSk7Ci0KLSAgICBlbnRyeV90ICplID0gJm1FbnRyaWVzW21FbnRyeUNvdW50XTsKKyAgICBlbnRyeV90ICplID0gKGVudHJ5X3QgKiltYWxsb2Moc2l6ZW9mKGVudHJ5X3QpKTsKKyAgICBtRW50cmllcy5wdXNoKGUpOwogICAgIG1DdXJyZW50ID0gZTsKICAgICBlLT52dHggPSB2dHgtPmdldFNoYWRlcklEKCk7CiAgICAgZS0+ZnJhZyA9IGZyYWctPmdldFNoYWRlcklEKCk7CiAgICAgZS0+cHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgIGUtPm1Vc2VyVmVydGV4UHJvZ3JhbSA9IHZ0eC0+aXNVc2VyUHJvZ3JhbSgpOwotICAgIGlmIChtRW50cmllc1ttRW50cnlDb3VudF0ucHJvZ3JhbSkgeworICAgIGUtPnZ0eEF0dHJDb3VudCA9IHZ0eC0+Z2V0QXR0cmliQ291bnQoKTsKKyAgICBpZiAoZS0+cHJvZ3JhbSkgewogICAgICAgICBHTHVpbnQgcGdtID0gZS0+cHJvZ3JhbTsKICAgICAgICAgZ2xBdHRhY2hTaGFkZXIocGdtLCB2dHgtPmdldFNoYWRlcklEKCkpOwogICAgICAgICAvL0xPR0UoImUxICV4IiwgZ2xHZXRFcnJvcigpKTsKICAgICAgICAgZ2xBdHRhY2hTaGFkZXIocGdtLCBmcmFnLT5nZXRTaGFkZXJJRCgpKTsKIAogICAgICAgICBpZiAoIXZ0eC0+aXNVc2VyUHJvZ3JhbSgpKSB7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDAsICJBVFRSSUJfTGVnYWN5UG9zaXRpb24iKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMSwgIkFUVFJJQl9MZWdhY3lDb2xvciIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAyLCAiQVRUUklCX0xlZ2FjeU5vcm1hbCIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAzLCAiQVRUUklCX0xlZ2FjeVBvaW50U2l6ZSIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCA0LCAiQVRUUklCX0xlZ2FjeVRleHR1cmUiKTsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1BPU0lUSU9OXSA9IDA7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9DT0xPUl0gPSAxOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfTk9STUFMXSA9IDI7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9QT0lOVF9TSVpFXSA9IDM7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9URVhUVVJFXSA9IDQ7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDAsICJBVFRSSUJfcG9zaXRpb24iKTsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMSwgIkFUVFJJQl9jb2xvciIpOworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAyLCAiQVRUUklCX25vcm1hbCIpOworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAzLCAiQVRUUklCX3RleHR1cmUwIik7CiAgICAgICAgIH0KIAogICAgICAgICAvL0xPR0UoImUyICV4IiwgZ2xHZXRFcnJvcigpKTsKQEAgLTEyNiwxNCArMTEwLDE1IEBACiAgICAgICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJFcnJvciBsaW5raW5nIEdMIFByb2dyYW1zIik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHZ0eC0+aXNVc2VyUHJvZ3JhbSgpKSB7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgdnR4LT5nZXRBdHRyaWJDb3VudCgpOyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW2N0XSA9IGdsR2V0QXR0cmliTG9jYXRpb24ocGdtLCB2dHgtPmdldEF0dHJpYk5hbWUoY3QpKTsKLSAgICAgICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2hhZGVycykgewotICAgICAgICAgICAgICAgICAgICBMT0dWKCJ2dHggQSAlaSwgJXMgPSAlZFxuIiwgY3QsIHZ0eC0+Z2V0QXR0cmliTmFtZShjdCkuc3RyaW5nKCksIGUtPm1WdHhBdHRyaWJTbG90c1tjdF0pOwotICAgICAgICAgICAgICAgIH0KKworICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgZS0+dnR4QXR0ckNvdW50OyBjdCsrKSB7CisgICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbY3RdID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihwZ20sIHZ0eC0+Z2V0QXR0cmliTmFtZShjdCkpOworICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYk5hbWVzW2N0XSA9IHZ0eC0+Z2V0QXR0cmliTmFtZShjdCkuc3RyaW5nKCk7CisgICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2hhZGVycykgeworICAgICAgICAgICAgICAgIExPR1YoInZ0eCBBICVpLCAlcyA9ICVkXG4iLCBjdCwgdnR4LT5nZXRBdHRyaWJOYW1lKGN0KS5zdHJpbmcoKSwgZS0+bVZ0eEF0dHJpYlNsb3RzW2N0XSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKwogICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgdnR4LT5nZXRVbmlmb3JtQ291bnQoKTsgY3QrKykgewogICAgICAgICAgICAgZS0+bVZ0eFVuaWZvcm1TbG90c1tjdF0gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sIHZ0eC0+Z2V0VW5pZm9ybU5hbWUoY3QpKTsKICAgICAgICAgICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTaGFkZXJzKSB7CkBAIC0xNTEsMTcgKzEzNiw0NyBAQAogICAgIGUtPm1Jc1ZhbGlkID0gdHJ1ZTsKICAgICAvL0xPR1YoIlNDIG1hZGUgcHJvZ3JhbSAlaSIsIGUtPnByb2dyYW0pOwogICAgIGdsVXNlUHJvZ3JhbShlLT5wcm9ncmFtKTsKLSAgICBtRW50cnlDb3VudCsrOwogICAgIHJzYy0+Y2hlY2tFcnJvcigiU2hhZGVyQ2FjaGU6Omxvb2t1cCAobWlzcykiKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAoraW50MzJfdCBTaGFkZXJDYWNoZTo6dnR4QXR0cmliU2xvdChjb25zdCBTdHJpbmc4ICZhdHRyTmFtZSkgY29uc3QgeworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ3VycmVudC0+dnR4QXR0ckNvdW50OyBjdCsrKSB7CisgICAgICAgIGlmKGF0dHJOYW1lID09IG1DdXJyZW50LT5tVnR4QXR0cmliTmFtZXNbY3RdKSB7CisgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnQtPm1WdHhBdHRyaWJTbG90c1tjdF07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCiB2b2lkIFNoYWRlckNhY2hlOjpjbGVhbnVwVmVydGV4KHVpbnQzMl90IGlkKQogeworICAgIGludDMyX3QgbnVtRW50cmllcyA9IChpbnQzMl90KW1FbnRyaWVzLnNpemUoKTsKKyAgICBmb3IoaW50MzJfdCBjdCA9IDA7IGN0IDwgbnVtRW50cmllczsgY3QgKyspIHsKKyAgICAgICAgaWYgKG1FbnRyaWVzW2N0XS0+dnR4ID09IGlkKSB7CisgICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0obUVudHJpZXNbY3RdLT5wcm9ncmFtKTsKKworICAgICAgICAgICAgZnJlZShtRW50cmllc1tjdF0pOworICAgICAgICAgICAgbUVudHJpZXMucmVtb3ZlQXQoY3QpOworICAgICAgICAgICAgbnVtRW50cmllcyA9IChpbnQzMl90KW1FbnRyaWVzLnNpemUoKTsKKyAgICAgICAgICAgIGN0IC0tOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIFNoYWRlckNhY2hlOjpjbGVhbnVwRnJhZ21lbnQodWludDMyX3QgaWQpCiB7CisgICAgaW50MzJfdCBudW1FbnRyaWVzID0gKGludDMyX3QpbUVudHJpZXMuc2l6ZSgpOworICAgIGZvcihpbnQzMl90IGN0ID0gMDsgY3QgPCBudW1FbnRyaWVzOyBjdCArKykgeworICAgICAgICBpZiAobUVudHJpZXNbY3RdLT5mcmFnID09IGlkKSB7CisgICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0obUVudHJpZXNbY3RdLT5wcm9ncmFtKTsKKworICAgICAgICAgICAgZnJlZShtRW50cmllc1tjdF0pOworICAgICAgICAgICAgbUVudHJpZXMucmVtb3ZlQXQoY3QpOworICAgICAgICAgICAgbnVtRW50cmllcyA9IChpbnQzMl90KW1FbnRyaWVzLnNpemUoKTsKKyAgICAgICAgICAgIGN0IC0tOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIFNoYWRlckNhY2hlOjpjbGVhbnVwQWxsKCkKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5oIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmgKaW5kZXggZGY5OWNjYy4uMzVmZjk1YiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NoYWRlckNhY2hlLmgKKysrIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmgKQEAgLTQwLDI5ICs0MCwzMCBAQAogCiAgICAgdm9pZCBjbGVhbnVwQWxsKCk7CiAKLSAgICBpbnQzMl90IHZ0eEF0dHJpYlNsb3QodWludDMyX3QgYSkgY29uc3Qge3JldHVybiBtQ3VycmVudC0+bVZ0eEF0dHJpYlNsb3RzW2FdO30KKyAgICBpbnQzMl90IHZ0eEF0dHJpYlNsb3QoY29uc3QgU3RyaW5nOCAmYXR0ck5hbWUpIGNvbnN0OwogICAgIGludDMyX3QgdnR4VW5pZm9ybVNsb3QodWludDMyX3QgYSkgY29uc3Qge3JldHVybiBtQ3VycmVudC0+bVZ0eFVuaWZvcm1TbG90c1thXTt9CiAgICAgaW50MzJfdCBmcmFnQXR0cmliU2xvdCh1aW50MzJfdCBhKSBjb25zdCB7cmV0dXJuIG1DdXJyZW50LT5tRnJhZ0F0dHJpYlNsb3RzW2FdO30KICAgICBpbnQzMl90IGZyYWdVbmlmb3JtU2xvdCh1aW50MzJfdCBhKSBjb25zdCB7cmV0dXJuIG1DdXJyZW50LT5tRnJhZ1VuaWZvcm1TbG90c1thXTt9Ci0gICAgYm9vbCBpc1VzZXJWZXJ0ZXhQcm9ncmFtKCkgY29uc3Qge3JldHVybiBtQ3VycmVudC0+bVVzZXJWZXJ0ZXhQcm9ncmFtO30KIAogcHJvdGVjdGVkOgogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgdWludDMyX3QgdnR4OwogICAgICAgICB1aW50MzJfdCBmcmFnOwogICAgICAgICB1aW50MzJfdCBwcm9ncmFtOworICAgICAgICB1aW50MzJfdCB2dHhBdHRyQ291bnQ7CisgICAgICAgIGNvbnN0IGNoYXIqIG1WdHhBdHRyaWJOYW1lc1tQcm9ncmFtOjpNQVhfQVRUUklCU107CiAgICAgICAgIGludDMyX3QgbVZ0eEF0dHJpYlNsb3RzW1Byb2dyYW06Ok1BWF9BVFRSSUJTXTsKICAgICAgICAgaW50MzJfdCBtVnR4VW5pZm9ybVNsb3RzW1Byb2dyYW06Ok1BWF9VTklGT1JNU107CiAgICAgICAgIGludDMyX3QgbUZyYWdBdHRyaWJTbG90c1tQcm9ncmFtOjpNQVhfQVRUUklCU107CiAgICAgICAgIGludDMyX3QgbUZyYWdVbmlmb3JtU2xvdHNbUHJvZ3JhbTo6TUFYX1VOSUZPUk1TXTsKLSAgICAgICAgYm9vbCBtVXNlclZlcnRleFByb2dyYW07CiAgICAgICAgIGJvb2wgbUlzVmFsaWQ7CiAgICAgfSBlbnRyeV90OwotICAgIGVudHJ5X3QgKm1FbnRyaWVzOworICAgIC8vZW50cnlfdCAqbUVudHJpZXM7CisgICAgVmVjdG9yPGVudHJ5X3QqPiBtRW50cmllczsKICAgICBlbnRyeV90ICptQ3VycmVudDsKIAotICAgIHVpbnQzMl90IG1FbnRyeUNvdW50OwotICAgIHVpbnQzMl90IG1FbnRyeUFsbG9jYXRpb25Db3VudDsKKyAgICAvKnVpbnQzMl90IG1FbnRyeUNvdW50OworICAgIHVpbnQzMl90IG1FbnRyeUFsbG9jYXRpb25Db3VudDsqLwogCiB9OwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2lnbmFsLmNwcCBiL2xpYnMvcnMvcnNTaWduYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzliZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2lnbmFsLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzU2lnbmFsLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitTaWduYWw6OlNpZ25hbCgpCit7CisgICAgbVNldCA9IHRydWU7Cit9CisKK1NpZ25hbDo6flNpZ25hbCgpCit7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtQ29uZGl0aW9uKTsKK30KKworYm9vbCBTaWduYWw6OmluaXQoKQoreworICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gbXV0ZXggaW5pdCBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbUNvbmRpdGlvbiwgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gY29uZGl0aW9uIGluaXQgZmFpbHVyZSIpOworICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaWduYWw6OnNldCgpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TZXQgPSB0cnVlOworCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCgmbUNvbmRpdGlvbik7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBvbiBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICB9Cit9CisKK3ZvaWQgU2lnbmFsOjp3YWl0KCkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1TZXQpIHsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoJm1Db25kaXRpb24sICZtTXV0ZXgpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB3YWl0aW5nIG9uIGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorICAgIG1TZXQgPSBmYWxzZTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaWduYWwuaCBiL2xpYnMvcnMvcnNTaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc2MGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NpZ25hbC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfU0lHTkFMX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19TSUdOQUxfSAorCisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBTaWduYWwgeworcHVibGljOgorICAgIFNpZ25hbCgpOworICAgIH5TaWduYWwoKTsKKworICAgIGJvb2wgaW5pdCgpOworCisgICAgdm9pZCBzZXQoKTsKKyAgICB2b2lkIHdhaXQoKTsKKworcHJvdGVjdGVkOgorICAgIGJvb2wgbVNldDsKKyAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OworICAgIHB0aHJlYWRfY29uZF90IG1Db25kaXRpb247Cit9OworCit9Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAgYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2U1Y2QuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLVNpbXBsZU1lc2g6OlNpbXBsZU1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQotewotICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKLSAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci19Ci0KLVNpbXBsZU1lc2g6On5TaW1wbGVNZXNoKCkKLXsKLSAgICBkZWxldGVbXSBtVmVydGV4VHlwZXM7Ci0gICAgZGVsZXRlW10gbVZlcnRleEJ1ZmZlcnM7Ci19Ci0KLXZvaWQgU2ltcGxlTWVzaDo6cmVuZGVyKENvbnRleHQgKnJzYykgY29uc3QKLXsKLSAgICBpZiAobVByaW1pdGl2ZVR5cGUuZ2V0KCkpIHsKLSAgICAgICAgcmVuZGVyUmFuZ2UocnNjLCAwLCBtUHJpbWl0aXZlVHlwZS0+Z2V0RGltWCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSW5kZXhUeXBlLmdldCgpKSB7Ci0gICAgICAgIHJlbmRlclJhbmdlKHJzYywgMCwgbUluZGV4VHlwZS0+Z2V0RGltWCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlbmRlclJhbmdlKHJzYywgMCwgbVZlcnRleFR5cGVzWzBdLT5nZXREaW1YKCkpOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnJlbmRlclJhbmdlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikgY29uc3QKLXsKLSAgICBpZiAobGVuIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSAxIik7Ci0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW2N0XS0+ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIyKCZ2YSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT51cGxvYWRDaGVjayhyc2MpOwotICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbY3RdLT5lbmFibGVHTFZlcnRleEJ1ZmZlcigmdmEpOwotICAgICAgICB9Ci0gICAgICAgIHZhLnNldHVwR0wocnNjLCAwKTsKLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnJlbmRlclJhbmdlIDIiKTsKLSAgICBpZiAobUluZGV4VHlwZS5nZXQoKSkgewotICAgICAgICBtSW5kZXhCdWZmZXItPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgZ2xEcmF3RWxlbWVudHMobUdMUHJpbWl0aXZlLCBsZW4sIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoc3RhcnQgKiAyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKG1HTFByaW1pdGl2ZSwgc3RhcnQsIGxlbik7Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSIpOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnVwbG9hZEFsbChDb250ZXh0ICpyc2MpCi17Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS5nZXQoKSkgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobUluZGV4QnVmZmVyLmdldCgpKSB7Ci0gICAgICAgIG1JbmRleEJ1ZmZlci0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7Ci0gICAgfQotICAgIGlmIChtUHJpbWl0aXZlQnVmZmVyLmdldCgpKSB7Ci0gICAgICAgIG1QcmltaXRpdmVCdWZmZXItPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOwotICAgIH0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnVwbG9hZEFsbCIpOwotfQotCi0KLVNpbXBsZU1lc2hDb250ZXh0OjpTaW1wbGVNZXNoQ29udGV4dCgpCi17Ci19Ci0KLVNpbXBsZU1lc2hDb250ZXh0Ojp+U2ltcGxlTWVzaENvbnRleHQoKQotewotfQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0KLVJzU2ltcGxlTWVzaCByc2lfU2ltcGxlTWVzaENyZWF0ZShDb250ZXh0ICpyc2MsIFJzVHlwZSBwcmltLCBSc1R5cGUgaWR4LCBSc1R5cGUgKnZ0eCwgdWludDMyX3QgdnR4Q291bnQsIHVpbnQzMl90IHByaW1UeXBlKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gbmV3IFNpbXBsZU1lc2gocnNjKTsKLSAgICBzbS0+aW5jVXNlclJlZigpOwotCi0gICAgc20tPm1JbmRleFR5cGUuc2V0KChjb25zdCBUeXBlICopaWR4KTsKLSAgICBzbS0+bVByaW1pdGl2ZVR5cGUuc2V0KChjb25zdCBUeXBlICopcHJpbSk7Ci0KLSAgICBzbS0+bVZlcnRleFR5cGVDb3VudCA9IHZ0eENvdW50OwotICAgIHNtLT5tVmVydGV4VHlwZXMgPSBuZXcgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPlt2dHhDb3VudF07Ci0gICAgc20tPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bdnR4Q291bnRdOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCB2dHhDb3VudDsgY3QrKykgewotICAgICAgICBzbS0+bVZlcnRleFR5cGVzW2N0XS5zZXQoKGNvbnN0IFR5cGUgKil2dHhbY3RdKTsKLSAgICB9Ci0KLSAgICBzbS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlwcmltVHlwZTsKLSAgICBzd2l0Y2goc20tPm1QcmltaXRpdmUpIHsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9QT0lOVDogICAgICAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX1BPSU5UUzsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfTElORTogICAgICAgICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FUzsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfTElORV9TVFJJUDogICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FX1NUUklQOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRTogICAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFUzsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVA6IHNtLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9TVFJJUDsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfRkFOOiAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9GQU47IGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc207Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kVmVydGV4KENvbnRleHQgKnJzYywgUnNTaW1wbGVNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCi17Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG12KTsKLSAgICByc0Fzc2VydChzbG90IDwgc20tPm1WZXJ0ZXhUeXBlQ291bnQpOwotCi0gICAgc20tPm1WZXJ0ZXhCdWZmZXJzW3Nsb3RdLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKLX0KLQotdm9pZCByc2lfU2ltcGxlTWVzaEJpbmRJbmRleChDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgc20tPm1JbmRleEJ1ZmZlci5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kUHJpbWl0aXZlKENvbnRleHQgKnJzYywgUnNTaW1wbGVNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEpCi17Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG12KTsKLSAgICBzbS0+bVByaW1pdGl2ZUJ1ZmZlci5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLQotCi0KLX19Ci0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmggYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVmYmRhLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX1NJTVBMRV9NRVNIX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0KLQotI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0KLS8vIEFuIGVsZW1lbnQgaXMgYSBncm91cCBvZiBDb21wb25lbnRzIHRoYXQgb2NjdXBpZXMgb25lIGNlbGwgaW4gYSBzdHJ1Y3R1cmUuCi1jbGFzcyBTaW1wbGVNZXNoIDogcHVibGljIE9iamVjdEJhc2UKLXsKLXB1YmxpYzoKLSAgICBTaW1wbGVNZXNoKENvbnRleHQgKik7Ci0gICAgflNpbXBsZU1lc2goKTsKLQotICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbUluZGV4VHlwZTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1QcmltaXRpdmVUeXBlOwotICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gKm1WZXJ0ZXhUeXBlczsKLSAgICB1aW50MzJfdCBtVmVydGV4VHlwZUNvdW50OwotCi0gICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtSW5kZXhCdWZmZXI7Ci0gICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtUHJpbWl0aXZlQnVmZmVyOwotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gKm1WZXJ0ZXhCdWZmZXJzOwotCi0gICAgUnNQcmltaXRpdmUgbVByaW1pdGl2ZTsKLSAgICB1aW50MzJfdCBtR0xQcmltaXRpdmU7Ci0KLQotICAgIHZvaWQgcmVuZGVyKENvbnRleHQgKikgY29uc3Q7Ci0gICAgdm9pZCByZW5kZXJSYW5nZShDb250ZXh0ICosIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0OwotICAgIHZvaWQgdXBsb2FkQWxsKENvbnRleHQgKik7Ci0KLQotcHJvdGVjdGVkOgotfTsKLQotY2xhc3MgU2ltcGxlTWVzaENvbnRleHQKLXsKLXB1YmxpYzoKLSAgICBTaW1wbGVNZXNoQ29udGV4dCgpOwotICAgIH5TaW1wbGVNZXNoQ29udGV4dCgpOwotCi0KLX07Ci0KLQotfQotfQotI2VuZGlmIC8vQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTdHJlYW0uY3BwIGIvbGlicy9ycy9yc1N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyNDFmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTMxIEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitJU3RyZWFtOjpJU3RyZWFtKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgYm9vbCB1c2U2NCkKK3sKKyAgICBtRGF0YSA9IGJ1ZjsKKyAgICBtUG9zID0gMDsKKyAgICBtVXNlNjQgPSB1c2U2NDsKK30KKwordm9pZCBJU3RyZWFtOjpsb2FkQnl0ZUFycmF5KHZvaWQgKmRlc3QsIHNpemVfdCBudW1CeXRlcykKK3sKKyAgICBtZW1jcHkoZGVzdCwgbURhdGEgKyBtUG9zLCBudW1CeXRlcyk7CisgICAgbVBvcyArPSBudW1CeXRlczsKK30KKwordWludDY0X3QgSVN0cmVhbTo6bG9hZE9mZnNldCgpCit7CisgICAgdWludDY0X3QgdG1wOworICAgIGlmIChtVXNlNjQpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgNykgJiAofjcpOworICAgICAgICB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgcmV0dXJuIGxvYWRVMzIoKTsKK30KKwordm9pZCBJU3RyZWFtOjpsb2FkU3RyaW5nKFN0cmluZzggKnMpCit7CisgICAgdWludDMyX3QgbGVuID0gbG9hZFUzMigpOworICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopJm1EYXRhW21Qb3NdLCBsZW4pOworICAgIG1Qb3MgKz0gbGVuOworfQorCisKKy8vIE91dHB1dCBzdHJlYW0gaW1wbGVtZW50YXRpb24KKworT1N0cmVhbTo6T1N0cmVhbSh1aW50NjRfdCBsZW4sIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSAodWludDhfdCopbWFsbG9jKGxlbik7CisgICAgbUxlbmd0aCA9IGxlbjsKKyAgICBtUG9zID0gMDsKKyAgICBtVXNlNjQgPSB1c2U2NDsKK30KKworT1N0cmVhbTo6fk9TdHJlYW0oKQoreworICAgIGZyZWUobURhdGEpOworfQorCit2b2lkIE9TdHJlYW06OmFkZEJ5dGVBcnJheShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBudW1CeXRlcykKK3sKKyAgICAvLyBXZSBuZWVkIHRvIHBvdGVudGlhbGx5IGdyb3cgbW9yZSB0aGFuIG9uY2UgaWYgdGhlIG51bWJlciBvZiBieWVzIHdlIHdyaXRlIGlzIHN1YnN0YW50aWFsCisgICAgd2hpbGUobVBvcyArIG51bUJ5dGVzID49IG1MZW5ndGgpIHsKKyAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICB9CisgICAgbWVtY3B5KG1EYXRhICsgbVBvcywgc3JjLCBudW1CeXRlcyk7CisgICAgbVBvcyArPSBudW1CeXRlczsKK30KKwordm9pZCBPU3RyZWFtOjphZGRPZmZzZXQodWludDY0X3QgdikKK3sKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMzIpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDApICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNTYpICYgMHhmZik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhZGRVMzIodik7CisgICAgfQorfQorCit2b2lkIE9TdHJlYW06OmFkZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IHMtPnNpemUoKTsKKyAgICBhZGRVMzIobGVuKTsKKyAgICBpZihtUG9zICsgbGVuKnNpemVvZihjaGFyKSA+PSBtTGVuZ3RoKSB7CisgICAgICAgIGdyb3dTaXplKCk7CisgICAgfQorICAgIGNoYXIgKnN0cmluZ0RhdGEgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4oJm1EYXRhW21Qb3NdKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKKyAgICAgICAgc3RyaW5nRGF0YVtpXSA9IHMtPnN0cmluZygpW2ldOworICAgIH0KKyAgICBtUG9zICs9IGxlbipzaXplb2YoY2hhcik7Cit9CisKK3ZvaWQgT1N0cmVhbTo6Z3Jvd1NpemUoKQoreworICAgIHVpbnQ4X3QgKm5ld0RhdGEgPSAodWludDhfdCopbWFsbG9jKG1MZW5ndGgqMik7CisgICAgbWVtY3B5KG5ld0RhdGEsIG1EYXRhLCBtTGVuZ3RoKnNpemVvZih1aW50OF90KSk7CisgICAgbUxlbmd0aCA9IG1MZW5ndGggKiAyOworICAgIGZyZWUobURhdGEpOworICAgIG1EYXRhID0gbmV3RGF0YTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmggYi9saWJzL3JzL3JzU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwMWNkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19TVFJFQU1fSAorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIElTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBJU3RyZWFtKGNvbnN0IHVpbnQ4X3QgKiwgYm9vbCB1c2U2NCk7CisKKyAgICBmbG9hdCBsb2FkRigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBmbG9hdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgaW50MzJfdCBsb2FkSTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MzJfdCBsb2FkVTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MTZfdCBsb2FkVTE2KCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIHVpbnQxNl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICBpbmxpbmUgdWludDhfdCBsb2FkVTgoKSB7CisgICAgICAgIHVpbnQ4X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB2b2lkIGxvYWRCeXRlQXJyYXkodm9pZCAqZGVzdCwgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB1aW50NjRfdCBsb2FkT2Zmc2V0KCk7CisgICAgdm9pZCBsb2FkU3RyaW5nKFN0cmluZzggKnMpOworICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQodWludDY0X3QgcG9zKSB7CisgICAgICAgIG1Qb3MgPSBwb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1Qb3MgPSAwOworICAgIH0KKyAgICAKKyAgICBjb25zdCB1aW50OF90ICogZ2V0UHRyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorcHJvdGVjdGVkOgorICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKKyAgICB1aW50NjRfdCBtUG9zOworICAgIGJvb2wgbVVzZTY0OworfTsKKworY2xhc3MgT1N0cmVhbQoreworcHVibGljOgorICAgIE9TdHJlYW0odWludDY0X3QgbGVuZ3RoLCBib29sIHVzZTY0KTsKKyAgICB+T1N0cmVhbSgpOworICAgIAorICAgIHZvaWQgYWxpZ24odWludDMyX3QgYnl0ZXMpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgKGJ5dGVzIC0gMSkpICYgKH4oYnl0ZXMgLSAxKSk7CisgICAgICAgIGlmKG1Qb3MgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGFkZEYoZmxvYXQgdikgeworICAgICAgICB1aW50MzJfdCB1aW50ViA9ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4gKCZ2KTsKKyAgICAgICAgYWRkVTMyKHVpbnRWKTsKKyAgICB9CisgICAgdm9pZCBhZGRJMzIoaW50MzJfdCB2KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgfQorICAgIHZvaWQgYWRkVTMyKHVpbnQzMl90IHYpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAyNCkgJiAweGZmKTsKKyAgICB9CisgICAgdm9pZCBhZGRVMTYodWludDE2X3QgdikgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ID4+IDgpOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZGRVOCh1aW50OF90IHYpIHsKKyAgICAgICAgaWYobVBvcyArIDEgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJm1EYXRhW21Qb3NdKVswXSA9IHY7CisgICAgICAgIG1Qb3MgKys7CisgICAgfQorICAgIHZvaWQgYWRkQnl0ZUFycmF5KGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB2b2lkIGFkZE9mZnNldCh1aW50NjRfdCB2KTsKKyAgICB2b2lkIGFkZFN0cmluZyhTdHJpbmc4ICpzKTsKKyAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KHVpbnQ2NF90IHBvcykgeworICAgICAgICBtUG9zID0gcG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUG9zID0gMDsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICB2b2lkIGdyb3dTaXplKCk7CisgICAgdWludDhfdCAqIG1EYXRhOworICAgIHVpbnQ2NF90IG1MZW5ndGg7CisgICAgdWludDY0X3QgbVBvczsKKyAgICBib29sIG1Vc2U2NDsKK307CisgICAgCisKK30gLy8gcmVuZGVyc2NyaXB0Cit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvL0FORFJPSURfUlNfU1RSRUFNX0gKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVHlwZS5jcHAgYi9saWJzL3JzL3JzVHlwZS5jcHAKaW5kZXggYzA5ZTk3OS4uMzM3NzZjMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1R5cGUuY3BwCisrKyBiL2xpYnMvcnMvcnNUeXBlLmNwcApAQCAtMTQsOCArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yNiw2ICszMSw4IEBACiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogICAgIG1MT0RzID0gMDsKICAgICBtTE9EQ291bnQgPSAwOworICAgIG1BdHRyaWJzID0gTlVMTDsKKyAgICBtQXR0cmlic1NpemUgPSAwOwogICAgIGNsZWFyKCk7CiB9CiAKQEAgLTM5LDYgKzQ2LDExIEBACiAgICAgfQogICAgIGlmIChtTE9EcykgewogICAgICAgICBkZWxldGUgW10gbUxPRHM7CisgICAgICAgIG1MT0RzID0gTlVMTDsKKyAgICB9CisgICAgaWYobUF0dHJpYnMpIHsKKyAgICAgICAgZGVsZXRlIFtdIG1BdHRyaWJzOworICAgICAgICBtQXR0cmlicyA9IE5VTEw7CiAgICAgfQogfQogCkBAIC04NCw3ICs5Niw5IEBACiAgICAgICAgIG1MT0RDb3VudCA9IDE7CiAgICAgfQogICAgIGlmIChtTE9EQ291bnQgIT0gb2xkTE9EQ291bnQpIHsKLSAgICAgICAgZGVsZXRlIFtdIG1MT0RzOworICAgICAgICBpZihtTE9Ecyl7CisgICAgICAgICAgICBkZWxldGUgW10gbUxPRHM7CisgICAgICAgIH0KICAgICAgICAgbUxPRHMgPSBuZXcgTE9EW21MT0RDb3VudF07CiAgICAgfQogCkBAIC0xMzgsMTM2ICsxNTIsNTQgQEAKIAogdm9pZCBUeXBlOjptYWtlR0xDb21wb25lbnRzKCkKIHsKLSAgICB1aW50MzJfdCB1c2VyTnVtID0gMDsKKyAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGdsIGF0dHJzIHRvIGluaXRpYWxpemUKKyAgICBtQXR0cmlic1NpemUgPSAwOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBnZXRFbGVtZW50KCktPmdldEZpZWxkQ291bnQoKTsgY3QrKykgeworICAgICAgICBpZihnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdClbMF0gIT0gJyMnKSB7CisgICAgICAgICAgICBtQXR0cmlic1NpemUgKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYobUF0dHJpYnMpIHsKKyAgICAgICAgZGVsZXRlIFtdIG1BdHRyaWJzOworICAgICAgICBtQXR0cmlicyA9IE5VTEw7CisgICAgfQorICAgIGlmKG1BdHRyaWJzU2l6ZSkgeworICAgICAgICBtQXR0cmlicyA9IG5ldyBWZXJ0ZXhBcnJheTo6QXR0cmliW21BdHRyaWJzU2l6ZV07CisgICAgfQogCisgICAgdWludDMyX3QgdXNlck51bSA9IDA7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGdldEVsZW1lbnQoKS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7CiAgICAgICAgIGNvbnN0IENvbXBvbmVudCAmYyA9IGdldEVsZW1lbnQoKS0+Z2V0RmllbGQoY3QpLT5nZXRDb21wb25lbnQoKTsKIAotICAgICAgICBzd2l0Y2goYy5nZXRLaW5kKCkpIHsKLSAgICAgICAgY2FzZSBSU19LSU5EX1VTRVI6Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsvL2MuZ2V0SXNOb3JtYWxpemVkKCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0ubmFtZS5zZXRUbyhnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdCkpOwotICAgICAgICAgICAgdXNlck51bSArKzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT1NJVElPTjoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tVnR4LnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm5hbWUuc2V0VG8oIlBvc2l0aW9uIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfQ09MT1I6Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubUNvbG9yLnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3Iub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Db2xvci50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3Iubm9ybWFsaXplZCA9IGMuZ2V0VHlwZSgpICE9IFJTX1RZUEVfRkxPQVRfMzI7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm5hbWUuc2V0VG8oIkNvbG9yIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfTk9STUFMOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1Ob3JtLnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Ob3JtLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubU5vcm0ubmFtZS5zZXRUbygiTm9ybWFsIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfVEVYVFVSRToKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tVGV4LnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubVRleC5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVRleC5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVRleC50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVGV4Lm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tVGV4Lm5hbWUuc2V0VG8oIlRleHR1cmUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT0lOVF9TSVpFOgotICAgICAgICAgICAgcnNBc3NlcnQoIW1HTC5tUG9pbnRTaXplLnNpemUpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUuc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5uYW1lLnNldFRvKCJQb2ludFNpemUiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZihnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdClbMF0gPT0gJyMnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorCisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS50eXBlID0gYy5nZXRHTFR5cGUoKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ubm9ybWFsaXplZCA9IGMuZ2V0VHlwZSgpICE9IFJTX1RZUEVfRkxPQVRfMzI7Ly9jLmdldElzTm9ybWFsaXplZCgpOworICAgICAgICBTdHJpbmc4IHRtcChSU19TSEFERVJfQVRUUik7CisgICAgICAgIHRtcC5hcHBlbmQoZ2V0RWxlbWVudCgpLT5nZXRGaWVsZE5hbWUoY3QpKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ubmFtZS5zZXRUbyh0bXAuc3RyaW5nKCkpOworCisgICAgICAgIHVzZXJOdW0gKys7CiAgICAgfQogfQogCisKIHZvaWQgVHlwZTo6ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoVmVydGV4QXJyYXkgKnZhKSBjb25zdAogewotICAgIC8vIE5vdGU6IFdlIGFyZSBvbmx5IGdvaW5nIHRvIGVuYWJsZSBidWZmZXJzIGFuZCBuZXZlciBkaXNhYmxlIHRoZW0KLSAgICAvLyBoZXJlLiAgVGhlIHJlYXNvbiBpcyBtb3JlIHRoYW4gb25lIEFsbG9jYXRpb24gbWF5IGJlIHVzZWQgYXMgYSB2ZXJ0ZXgKLSAgICAvLyBzb3VyY2UuICBTbyB3ZSBjYW5ub3QgZGlzYWJsZSBhcnJheXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGluIHVzZSBieQotICAgIC8vIGFub3RoZXIgYWxsb2NhdGlvbi4KLQogICAgIHVpbnQzMl90IHN0cmlkZSA9IG1FbGVtZW50LT5nZXRTaXplQnl0ZXMoKTsKLSAgICBpZiAobUdMLm1WdHguc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tVnR4LnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgbUdMLm1WdHguc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9QT1NJVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICBtR0wubVZ0eC5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubU5vcm0uc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tTm9ybS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgMywKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubU5vcm0ub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Db2xvci5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1Db2xvci50eXBlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Db2xvci5zaXplLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9DT0xPUiwKLSAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubUNvbG9yLm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tVGV4LnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVRleC50eXBlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1UZXguc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfVEVYVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1UZXgub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Qb2ludFNpemUuc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tUG9pbnRTaXplLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9QT0lOVF9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5vZmZzZXQpOwotICAgIH0KLQotfQotCi12b2lkIFR5cGU6OmVuYWJsZUdMVmVydGV4QnVmZmVyMihWZXJ0ZXhBcnJheSAqdmEpIGNvbnN0Ci17Ci0gICAgLy8gRG8gbGVnYWN5IGJ1ZmZlcnMKLSAgICBlbmFibGVHTFZlcnRleEJ1ZmZlcih2YSk7Ci0KLSAgICB1aW50MzJfdCBzdHJpZGUgPSBtRWxlbWVudC0+Z2V0U2l6ZUJ5dGVzKCk7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IFJTX01BWF9BVFRSSUJTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtR0wubVVzZXJbY3RdLnNpemUpIHsKLSAgICAgICAgICAgIHZhLT5hZGRVc2VyKG1HTC5tVXNlcltjdF0sIHN0cmlkZSk7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1BdHRyaWJzU2l6ZTsgY3QrKykgeworICAgICAgICAvLyBMb2FkIHVwIHRvIFJTX01BWF9BVFRSSUJTIGlucHV0cworICAgICAgICAvLyBUT0RPOiBncm93IHZlcnRleGFycmF5IGR5bmFtaWNhbGx5CisgICAgICAgIGlmKGN0ID49IFJTX01BWF9BVFRSSUJTKSB7CisgICAgICAgICAgICBMT0dFKCJNb3JlIEdMIGF0dHJpYnV0ZXMgdGhhbiB3ZSBjYW4gaGFuZGxlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobUF0dHJpYnNbY3RdLnNpemUpIHsKKyAgICAgICAgICAgIHZhLT5hZGQobUF0dHJpYnNbY3RdLCBzdHJpZGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjgzLDYgKzIxNSw1NyBAQAogICAgIG1FbGVtZW50LT5kdW1wTE9HVihidWYpOwogfQogCit2b2lkIFR5cGU6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIG1FbGVtZW50LT5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIHN0cmVhbS0+YWRkVTMyKG1EaW1YKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtRGltWSk7CisgICAgc3RyZWFtLT5hZGRVMzIobURpbVopOworCisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCkobURpbUxPRCA/IDEgOiAwKSk7CisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCkobUZhY2VzID8gMSA6IDApKTsKK30KKworVHlwZSAqVHlwZTo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX1RZUEUpIHsKKyAgICAgICAgTE9HRSgidHlwZSBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIEVsZW1lbnQgKmVsZW0gPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICBpZighZWxlbSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUeXBlICp0eXBlID0gbmV3IFR5cGUocnNjKTsKKyAgICB0eXBlLT5tRGltWCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIHR5cGUtPm1EaW1ZID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdHlwZS0+bURpbVogPSBzdHJlYW0tPmxvYWRVMzIoKTsKKworICAgIHVpbnQ4X3QgdGVtcCA9IHN0cmVhbS0+bG9hZFU4KCk7CisgICAgdHlwZS0+bURpbUxPRCA9IHRlbXAgIT0gMDsKKworICAgIHRlbXAgPSBzdHJlYW0tPmxvYWRVOCgpOworICAgIHR5cGUtPm1GYWNlcyA9IHRlbXAgIT0gMDsKKworICAgIHR5cGUtPnNldEVsZW1lbnQoZWxlbSk7CisKKyAgICByZXR1cm4gdHlwZTsKK30KKwogYm9vbCBUeXBlOjpnZXRJc05wMigpIGNvbnN0CiB7CiAgICAgdWludDMyX3QgeCA9IGdldERpbVgoKTsKQEAgLTMwMSw2ICsyODQsNzMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgVHlwZTo6aXNFcXVhbChjb25zdCBUeXBlICpvdGhlcikgY29uc3QgeworICAgIGlmKG90aGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAob3RoZXItPmdldEVsZW1lbnQoKS0+aXNFcXVhbChnZXRFbGVtZW50KCkpICYmCisgICAgICAgIG90aGVyLT5nZXREaW1YKCkgPT0gbURpbVggJiYKKyAgICAgICAgb3RoZXItPmdldERpbVkoKSA9PSBtRGltWSAmJgorICAgICAgICBvdGhlci0+Z2V0RGltWigpID09IG1EaW1aICYmCisgICAgICAgIG90aGVyLT5nZXREaW1MT0QoKSA9PSBtRGltTE9EICYmCisgICAgICAgIG90aGVyLT5nZXREaW1GYWNlcygpID09IG1GYWNlcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitUeXBlICogVHlwZTo6Y2xvbmVBbmRSZXNpemUxRChDb250ZXh0ICpyc2MsIHVpbnQzMl90IGRpbVgpIGNvbnN0Cit7CisgICAgVHlwZVN0YXRlICogc3RjID0gJnJzYy0+bVN0YXRlVHlwZTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgc3RjLT5tVHlwZXMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIFR5cGUgKnQgPSBzdGMtPm1UeXBlc1tjdF07CisgICAgICAgIGlmICh0LT5nZXRFbGVtZW50KCkgIT0gbUVsZW1lbnQuZ2V0KCkpIGNvbnRpbnVlOworICAgICAgICBpZiAodC0+Z2V0RGltWCgpICE9IGRpbVgpIGNvbnRpbnVlOworICAgICAgICBpZiAodC0+Z2V0RGltWSgpICE9IG1EaW1ZKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHQtPmdldERpbVooKSAhPSBtRGltWikgY29udGludWU7CisgICAgICAgIGlmICh0LT5nZXREaW1MT0QoKSAhPSBtRGltTE9EKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHQtPmdldERpbUZhY2VzKCkgIT0gbUZhY2VzKSBjb250aW51ZTsKKyAgICAgICAgdC0+aW5jVXNlclJlZigpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBUeXBlICpudCA9IG5ldyBUeXBlKHJzYyk7CisgICAgbnQtPm1FbGVtZW50LnNldChtRWxlbWVudCk7CisgICAgbnQtPm1EaW1YID0gZGltWDsKKyAgICBudC0+bURpbVkgPSBtRGltWTsKKyAgICBudC0+bURpbVogPSBtRGltWjsKKyAgICBudC0+bURpbUxPRCA9IG1EaW1MT0Q7CisgICAgbnQtPm1GYWNlcyA9IG1GYWNlczsKKyAgICBudC0+Y29tcHV0ZSgpOworICAgIHJldHVybiBudDsKK30KKworVHlwZSAqIFR5cGU6OmNsb25lQW5kUmVzaXplMkQoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSBjb25zdAoreworICAgIFR5cGVTdGF0ZSAqIHN0YyA9ICZyc2MtPm1TdGF0ZVR5cGU7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHN0Yy0+bVR5cGVzLnNpemUoKTsgY3QrKykgeworICAgICAgICBUeXBlICp0ID0gc3RjLT5tVHlwZXNbY3RdOworICAgICAgICBpZiAodC0+Z2V0RWxlbWVudCgpICE9IG1FbGVtZW50LmdldCgpKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHQtPmdldERpbVgoKSAhPSBkaW1YKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHQtPmdldERpbVkoKSAhPSBkaW1ZKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHQtPmdldERpbVooKSAhPSBtRGltWikgY29udGludWU7CisgICAgICAgIGlmICh0LT5nZXREaW1MT0QoKSAhPSBtRGltTE9EKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHQtPmdldERpbUZhY2VzKCkgIT0gbUZhY2VzKSBjb250aW51ZTsKKyAgICAgICAgdC0+aW5jVXNlclJlZigpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBUeXBlICpudCA9IG5ldyBUeXBlKHJzYyk7CisgICAgbnQtPm1FbGVtZW50LnNldChtRWxlbWVudCk7CisgICAgbnQtPm1EaW1YID0gZGltWDsKKyAgICBudC0+bURpbVkgPSBkaW1ZOworICAgIG50LT5tRGltWiA9IG1EaW1aOworICAgIG50LT5tRGltTE9EID0gbURpbUxPRDsKKyAgICBudC0+bUZhY2VzID0gbUZhY2VzOworICAgIG50LT5jb21wdXRlKCk7CisgICAgcmV0dXJuIG50OworfQorCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLwpAQCAtMzQ5LDggKzM5OSw2IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotCi0gICAgaW50MzJfdCBhcnJheU51bSA9IGRpbSAtIFJTX0RJTUVOU0lPTl9BUlJBWV8wOwogICAgIGlmICgoZGltIDwgMCkgfHwgKGRpbSA+IFJTX0RJTUVOU0lPTl9NQVgpKSB7CiAgICAgICAgIExPR0UoInJzVHlwZUFkZDogQmFkIGRpbWVuc2lvbiIpOwogICAgICAgICAvL2Vycm9yCkBAIC0zOTEsNiArNDM5LDIyIEBACiAgICAgcmV0dXJuIHN0OwogfQogCit2b2lkIHJzaV9UeXBlR2V0TmF0aXZlRGF0YShDb250ZXh0ICpyc2MsIFJzVHlwZSB0eXBlLCB1aW50MzJfdCAqdHlwZURhdGEsIHVpbnQzMl90IHR5cGVEYXRhU2l6ZSkKK3sKKyAgICByc0Fzc2VydCh0eXBlRGF0YVNpemUgPT0gNik7CisgICAgLy8gUGFjayB0aGUgZGF0YSBpbiB0aGUgZm9sbG9maW5nIHdheSBtRGltWDsgbURpbVk7IG1EaW1aOworICAgIC8vIG1EaW1MT0Q7IG1EaW1GYWNlczsgbUVsZW1lbnQ7IGludG8gdHlwZURhdGEKKyAgICBUeXBlICp0ID0gc3RhdGljX2Nhc3Q8VHlwZSAqPih0eXBlKTsKKworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1YKCk7CisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbVkoKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltWigpOworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1MT0QoKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltRmFjZXMoKSA/IDEgOiAwOworICAgICgqdHlwZURhdGErKykgPSAodWludDMyX3QpdC0+Z2V0RWxlbWVudCgpOworCit9CisKIAogfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1R5cGUuaCBiL2xpYnMvcnMvcnNUeXBlLmgKaW5kZXggYzI1NTc3Yy4uOTA5OWJmMSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1R5cGUuaAorKysgYi9saWJzL3JzL3JzVHlwZS5oCkBAIC03MSw5ICs3MSwxNiBAQAogICAgIHZvaWQgY29tcHV0ZSgpOwogCiAgICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcihjbGFzcyBWZXJ0ZXhBcnJheSAqKSBjb25zdDsKLSAgICB2b2lkIGVuYWJsZUdMVmVydGV4QnVmZmVyMihjbGFzcyBWZXJ0ZXhBcnJheSAqKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9UWVBFOyB9CisgICAgc3RhdGljIFR5cGUgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCisgICAgYm9vbCBpc0VxdWFsKGNvbnN0IFR5cGUgKm90aGVyKSBjb25zdDsKKworICAgIFR5cGUgKiBjbG9uZUFuZFJlc2l6ZTFEKENvbnRleHQgKnJzYywgdWludDMyX3QgZGltWCkgY29uc3Q7CisgICAgVHlwZSAqIGNsb25lQW5kUmVzaXplMkQoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIHN0cnVjdCBMT0QgewpAQCAtMTEyLDE1ICsxMTksOCBAQAogICAgIExPRCAqbUxPRHM7CiAgICAgdWludDMyX3QgbUxPRENvdW50OwogCi0gICAgc3RydWN0IEdMU3RhdGVfdCB7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVVzZXJbUlNfTUFYX0FUVFJJQlNdOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1WdHg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbU5vcm07Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbUNvbG9yOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1UZXg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVBvaW50U2l6ZTsKLSAgICB9OwotICAgIEdMU3RhdGVfdCBtR0w7CisgICAgVmVydGV4QXJyYXk6OkF0dHJpYiAqbUF0dHJpYnM7CisgICAgdWludDMyX3QgbUF0dHJpYnNTaXplOwogICAgIHZvaWQgbWFrZUdMQ29tcG9uZW50cygpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1V0aWxzLmggYi9saWJzL3JzL3JzVXRpbHMuaAppbmRleCAwN2Y4OTMzLi4xN2ZlYjIyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzVXRpbHMuaAorKysgYi9saWJzL3JzL3JzVXRpbHMuaApAQCAtMTksMTUgKzE5LDIzIEBACiAKICNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlJlbmRlclNjcmlwdCIKKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlICJyc1N0cmVhbS5oIgorCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8bWF0aC5oPgogCiAjaW5jbHVkZSAiUmVuZGVyU2NyaXB0LmgiCkBAIC00MSw2ICs0OSwyNiBAQAogI2RlZmluZSByc0Fzc2VydCh2KSB3aGlsZSgwKQogI2VuZGlmCiAKK3R5cGVkZWYgZmxvYXQgcnN2Rl8yIF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoOCkpKTsKK3R5cGVkZWYgZmxvYXQgcnN2Rl80IF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoMTYpKSk7Cit0eXBlZGVmIHVpbnQ4X3QgcnN2VThfNCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDQpKSk7CisKK3VuaW9uIGZsb2F0MiB7CisgICAgcnN2Rl8yIHY7CisgICAgZmxvYXQgZlsyXTsKK307CisKK3VuaW9uIGZsb2F0NCB7CisgICAgcnN2Rl80IHY7CisgICAgZmxvYXQgZls0XTsKK307CisKK3VuaW9uIHVjaGFyNCB7CisgICAgcnN2VThfNCB2OworICAgIHVpbnQ4X3QgZls0XTsKKyAgICB1aW50MzJfdCBwYWNrZWQ7Cit9OworCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogVCByc01pbihUIGluMSwgVCBpbjIpCiB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcAppbmRleCA2YzIwMDJkLi40ZDUwMTI0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCisrKyBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKQEAgLTE0LDEwICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKKwogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0zOSw2ICs0NCw3IEBACiAgICAgICAgIG1BdHRyaWJzW2N0XS5jbGVhcigpOwogICAgIH0KICAgICBtQWN0aXZlQnVmZmVyID0gMDsKKyAgICBtQWN0aXZlUG9pbnRlciA9IE5VTEw7CiAgICAgbUNvdW50ID0gMDsKIH0KIApAQCAtNTAsMTIgKzU2LDEyIEBACiB2b2lkIFZlcnRleEFycmF5OjpBdHRyaWI6OnNldChjb25zdCBBdHRyaWIgJmEpCiB7CiAgICAgYnVmZmVyID0gYS5idWZmZXI7CisgICAgcHRyID0gYS5wdHI7CiAgICAgb2Zmc2V0ID0gYS5vZmZzZXQ7CiAgICAgdHlwZSA9IGEudHlwZTsKICAgICBzaXplID0gYS5zaXplOwogICAgIHN0cmlkZSA9IGEuc3RyaWRlOwogICAgIG5vcm1hbGl6ZWQgPSBhLm5vcm1hbGl6ZWQ7Ci0gICAga2luZCA9IFJTX0tJTkRfVVNFUjsKICAgICBuYW1lLnNldFRvKGEubmFtZSk7CiB9CiAKQEAgLTY2LDYgKzcyLDcgQEAKICAgICB0eXBlID0gMDsKICAgICBzaXplID0gMDsKICAgICBzdHJpZGUgPSAwOworICAgIHB0ciA9IE5VTEw7CiAgICAgbm9ybWFsaXplZCA9IGZhbHNlOwogICAgIG5hbWUuc2V0VG8oIiIpOwogfQpAQCAtNzUsMTM4ICs4Miw3MiBAQAogICAgIG1BdHRyaWJzW25dLmNsZWFyKCk7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OmFkZFVzZXIoY29uc3QgQXR0cmliICZhLCB1aW50MzJfdCBzdHJpZGUpCit2b2lkIFZlcnRleEFycmF5OjphZGQoY29uc3QgQXR0cmliICZhLCB1aW50MzJfdCBzdHJpZGUpCiB7Ci0gICAgYXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKKyAgICByc0Fzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zZXQoYSk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOworICAgIG1BdHRyaWJzW21Db3VudF0ucHRyID0gbUFjdGl2ZVBvaW50ZXI7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5raW5kID0gUlNfS0lORF9VU0VSOwogICAgIG1Db3VudCArKzsKIH0KIAotdm9pZCBWZXJ0ZXhBcnJheTo6YWRkTGVnYWN5KHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHN0cmlkZSwgUnNEYXRhS2luZCBraW5kLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCkKK3ZvaWQgVmVydGV4QXJyYXk6OmFkZCh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGFzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CisgICAgcnNBc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOwogICAgIG1BdHRyaWJzW21Db3VudF0uY2xlYXIoKTsKICAgICBtQXR0cmlic1ttQ291bnRdLnR5cGUgPSB0eXBlOwogICAgIG1BdHRyaWJzW21Db3VudF0uc2l6ZSA9IHNpemU7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5ub3JtYWxpemVkID0gbm9ybWFsaXplZDsKLSAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5raW5kID0ga2luZDsKKyAgICBtQXR0cmlic1ttQ291bnRdLm5hbWUuc2V0VG8obmFtZSk7CisKKyAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CisgICAgbUF0dHJpYnNbbUNvdW50XS5wdHIgPSBtQWN0aXZlUG9pbnRlcjsKICAgICBtQ291bnQgKys7CiB9CiAKIHZvaWQgVmVydGV4QXJyYXk6OmxvZ0F0dHJpYih1aW50MzJfdCBpZHgsIHVpbnQzMl90IHNsb3QpIGNvbnN0IHsKLSAgICBMT0dFKCJ2YSAlaTogc2xvdD0laSBuYW1lPSVzIGJ1Zj0laSAgc2l6ZT0laSAgdHlwZT0weCV4ICBraW5kPSVpICBzdHJpZGU9MHgleCAgbm9ybT0laSAgb2Zmc2V0PTB4JXgiLCBpZHgsIHNsb3QsCisgICAgaWYoaWR4ID09IDApIHsKKyAgICAgICAgTE9HVigiU3RhcnRpbmcgdmVydGV4IGF0dHJpYnV0ZSBiaW5kaW5nIik7CisgICAgfQorICAgIExPR1YoInZhICVpOiBzbG90PSVpIG5hbWU9JXMgYnVmPSVpIHB0cj0lcCBzaXplPSVpICB0eXBlPTB4JXggIHN0cmlkZT0weCV4ICBub3JtPSVpICBvZmZzZXQ9MHgleCIsCisgICAgICAgICBpZHgsIHNsb3QsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLm5hbWUuc3RyaW5nKCksCiAgICAgICAgICBtQXR0cmlic1tpZHhdLmJ1ZmZlciwKKyAgICAgICAgIG1BdHRyaWJzW2lkeF0ucHRyLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5zaXplLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS50eXBlLAotICAgICAgICAgbUF0dHJpYnNbaWR4XS5raW5kLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5zdHJpZGUsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLm5vcm1hbGl6ZWQsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLm9mZnNldCk7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICpzdGF0ZSkgY29uc3QKLXsKLSAgICBnbENsaWVudEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTKTsKLQotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ291bnQ7IGN0KyspIHsKLSAgICAgICAgc3dpdGNoKG1BdHRyaWJzW2N0XS5raW5kKSB7Ci0gICAgICAgIGNhc2UgUlNfS0lORF9QT1NJVElPTjoKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKFBPU0lUSU9OKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9OT1JNQUw6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihOT1JNQUwpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwotICAgICAgICAgICAgcnNBc3NlcnQobUF0dHJpYnNbY3RdLnNpemUgPT0gMyk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsTm9ybWFsUG9pbnRlcihtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfQ09MT1I6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihDT0xPUik7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xDb2xvclBvaW50ZXIobUF0dHJpYnNbY3RdLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1RFWFRVUkU6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihURVhUVVJFKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsVGV4Q29vcmRQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT0lOVF9TSVpFOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoUE9JTlRfU0laRSk7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xQb2ludFNpemVQb2ludGVyT0VTKG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByc0Fzc2VydCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wiKTsKLX0KLQogdm9pZCBWZXJ0ZXhBcnJheTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICpzdGF0ZSwgU2hhZGVyQ2FjaGUgKnNjKSBjb25zdAogewogICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wyIHN0YXJ0Iik7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8PSBzdGF0ZS0+bUxhc3RFbmFibGVDb3VudDsgY3QrKykgeworICAgIGZvciAodWludDMyX3QgY3Q9MTsgY3QgPD0gMHhmLypzdGF0ZS0+bUxhc3RFbmFibGVDb3VudCovOyBjdCsrKSB7CiAgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGN0KTsKICAgICB9CiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBkaXNhYmxlZCIpOwogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3Qgc2xvdCA9IDA7Ci0gICAgICAgIGlmIChzYy0+aXNVc2VyVmVydGV4UHJvZ3JhbSgpKSB7Ci0gICAgICAgICAgICBzbG90ID0gc2MtPnZ0eEF0dHJpYlNsb3QoY3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1BdHRyaWJzW2N0XS5raW5kID09IFJTX0tJTkRfVVNFUikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xvdCA9IHNjLT52dHhBdHRyaWJTbG90KG1BdHRyaWJzW2N0XS5raW5kKTsKKyAgICAgICAgaW50MzJfdCBzbG90ID0gc2MtPnZ0eEF0dHJpYlNsb3QobUF0dHJpYnNbY3RdLm5hbWUpOworICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dTaGFkZXJzQXR0cikgeworICAgICAgICAgICAgbG9nQXR0cmliKGN0LCBzbG90KTsKICAgICAgICAgfQotCi0gICAgICAgIC8vbG9nQXR0cmliKGN0LCBzbG90KTsKKyAgICAgICAgaWYoc2xvdCA8IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoc2xvdCk7CiAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotCiAgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihzbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5ub3JtYWxpemVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0ucHRyICsgbUF0dHJpYnNbY3RdLm9mZnNldCk7CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdEVuYWJsZUNvdW50ID0gbUNvdW50OwogICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wyIGRvbmUiKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmgKaW5kZXggMzkwNGNiNi4uZGVhN2Q0MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmgKKysrIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmgKQEAgLTM3LDEzICszNywxMyBAQAogICAgIGNsYXNzIEF0dHJpYiB7CiAgICAgcHVibGljOgogICAgICAgICB1aW50MzJfdCBidWZmZXI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBwdHI7CiAgICAgICAgIHVpbnQzMl90IG9mZnNldDsKICAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgdWludDMyX3Qgc2l6ZTsKICAgICAgICAgdWludDMyX3Qgc3RyaWRlOwogICAgICAgICBib29sIG5vcm1hbGl6ZWQ7CiAgICAgICAgIFN0cmluZzggbmFtZTsKLSAgICAgICAgUnNEYXRhS2luZCBraW5kOwogCiAgICAgICAgIEF0dHJpYigpOwogICAgICAgICB2b2lkIHNldChjb25zdCBBdHRyaWIgJik7CkBAIC01MiwxNyArNTIsMjUgQEAKIAogCiAgICAgdm9pZCBjbGVhckFsbCgpOwotICAgIHZvaWQgc2V0QWN0aXZlQnVmZmVyKHVpbnQzMl90IGlkKSB7bUFjdGl2ZUJ1ZmZlciA9IGlkO30KLSAgICB2b2lkIGFkZFVzZXIoY29uc3QgQXR0cmliICYsIHVpbnQzMl90IHN0cmlkZSk7Ci0gICAgdm9pZCBhZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBSc0RhdGFLaW5kIGtpbmQsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0KTsKKyAgICB2b2lkIHNldEFjdGl2ZUJ1ZmZlcih1aW50MzJfdCBpZCkgeworICAgICAgICBtQWN0aXZlQnVmZmVyID0gaWQ7CisgICAgICAgIG1BY3RpdmVQb2ludGVyID0gTlVMTDsKKyAgICB9CisgICAgdm9pZCBzZXRBY3RpdmVCdWZmZXIoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIG1BY3RpdmVCdWZmZXIgPSAwOworICAgICAgICBtQWN0aXZlUG9pbnRlciA9IChjb25zdCB1aW50OF90ICopcHRyOworICAgIH0KIAotICAgIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKikgY29uc3Q7CisgICAgdm9pZCBhZGQoY29uc3QgQXR0cmliICYsIHVpbnQzMl90IHN0cmlkZSk7CisgICAgdm9pZCBhZGQodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CisKICAgICB2b2lkIHNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgY2xhc3MgVmVydGV4QXJyYXlTdGF0ZSAqLCBTaGFkZXJDYWNoZSAqKSBjb25zdDsKICAgICB2b2lkIGxvZ0F0dHJpYih1aW50MzJfdCBpZHgsIHVpbnQzMl90IHNsb3QpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBjbGVhcih1aW50MzJfdCBpbmRleCk7CiAgICAgdWludDMyX3QgbUFjdGl2ZUJ1ZmZlcjsKKyAgICBjb25zdCB1aW50OF90ICogbUFjdGl2ZVBvaW50ZXI7CiAgICAgdWludDMyX3QgbUNvdW50OwogCiAgICAgQXR0cmliIG1BdHRyaWJzW1JTX01BWF9BVFRSSUJTXTsKQEAgLTgwLDcgKzg4LDcgQEAKIAogfQogfQotI2VuZGlmIC8vQU5EUk9JRF9MSUdIVF9ICisjZW5kaWYgLy9BTkRST0lEX1ZFUlRFWF9BUlJBWV9ICiAKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwIGIvbGlicy9ycy9yc2dfU2NyaXB0SmF2YUNsYXNzLmNwcAppbmRleCBjZWU5ZjUyLi4wMTY5Yjk4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwCisrKyBiL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAKQEAgLTcsOCArNywxMiBAQAogc3RydWN0IEVsZW1lbnQ7CiAKIHN0cnVjdCBFbGVtZW50RmllbGQgeworICAgIC8vIEFuIEVsZW1lbnQgRmllbGQgaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBFbGVtZW50IHdpdGggYSBuYW1lIGFzc2lnbmVkLgorCiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBFbGVtZW50ICplOworCisKICAgICBFbGVtZW50RmllbGQoY29uc3QgY2hhciAqbiwgRWxlbWVudCAqX2UpIHsKICAgICAgICAgbmFtZSA9IG47CiAgICAgICAgIGUgPSBfZTsKQEAgLTIwLDEyICsyNCwyMSBAQAogfTsKIAogc3RydWN0IEVsZW1lbnQgeworICAgIC8vIEFuIEVsZW1lbnQgY2FuIHRha2Ugb25lIG9mIHR3byBmb3Jtcy4KKyAgICAvLyAxOiBCYXNpYy4gIEl0IGNvbnRhaW5zIGEgc2luZ2xlIGJhc2ljIHR5cGUgYW5kIHZlY3RvciBzaXplLgorICAgIC8vIDI6IENvbXBsZXguICBJdCBjb250YWlucyBhIGxpc3Qgb2YgZmllbGRzIHdpdGggbmFtZXMuICBFYWNoIGZpZWxkCisgICAgLy8gd2lsbCBpbiB0dXJuIGJlIGFub3RoZXIgZWxlbWVudC4KKwogICAgIEVsZW1lbnRGaWVsZCAqZmllbGRzOwotICAgIHNpemVfdCBmaWVsZENvdW50OworICAgIHNpemVfdCBmaWVsZENvdW50OyAgLy8gSWYgZmllbGQgY291bnQgaXMgMCwgdGhlIGVsZW1lbnQgaXMgYSBCYXNpYyB0eXBlLgogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgYm9vbCBnZW5lcmF0ZWQ7CiAKKyAgICAvLyBUaGUgYmFzaWMgZGF0YSB0eXBlIGZyb20gUmVuZGVyU2NyaXB0LmgKICAgICBSc0RhdGFUeXBlIGNvbXBUeXBlOworCisgICAgLy8gVGhlIHZlY3RvciBzaXplIG9mIHRoZSBkYXRhIHR5cGUgZm9yIGZsb2F0MiwgZmxvYXQzLCAuLi4uCisgICAgLy8gQWxsb3dlZCBzaXplcyBhcmUgMiwzLDQsOCwxNgogICAgIHVpbnQzMl90IGNvbXBWZWN0b3JTaXplOwogCiAgICAgRWxlbWVudCgpIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19jbC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODQ0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCkBAIC0wLDAgKzEsNzg1IEBACisjaWZuZGVmIF9fUlNfQ0xfUlNIX18KKyNkZWZpbmUgX19SU19DTF9SU0hfXworCisjZGVmaW5lIE1fUEkgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODhmICAgLyogcGkgKi8KKworCisvLyBDb252ZXJzaW9ucworI2RlZmluZSBDVlRfRlVOQ18yKHR5cGVvdXQsIHR5cGVpbikgXAorc3RhdGljIHR5cGVvdXQjIzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzIodHlwZWluIyMyIHYpIHsgXAorICAgIHR5cGVvdXQjIzIgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueX07IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgdHlwZW91dCMjMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb252ZXJ0XyMjdHlwZW91dCMjMyh0eXBlaW4jIzMgdikgeyBcCisgICAgdHlwZW91dCMjMyByID0geyh0eXBlb3V0KXYueCwgKHR5cGVvdXQpdi55LCAodHlwZW91dCl2Lnp9OyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIHR5cGVvdXQjIzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzQodHlwZWluIyM0IHYpIHsgXAorICAgIHR5cGVvdXQjIzQgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueSwgKHR5cGVvdXQpdi56LCAodHlwZW91dCl2Lnd9OyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBDVlRfRlVOQyh0eXBlKSAgICAgIENWVF9GVU5DXzIodHlwZSwgdWNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIHVzaG9ydCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgc2hvcnQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgdWludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgZmxvYXQpCisKK0NWVF9GVU5DKGNoYXIpCitDVlRfRlVOQyh1Y2hhcikKK0NWVF9GVU5DKHNob3J0KQorQ1ZUX0ZVTkModXNob3J0KQorQ1ZUX0ZVTkMoaW50KQorQ1ZUX0ZVTkModWludCkKK0NWVF9GVU5DKGZsb2F0KQorCisKKworLy8gRmxvYXQgb3BzLCA2LjExLjIKKworI2RlZmluZSBERUZfRlVOQ18xKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYueCk7IFwKKyAgICByLnkgPSBmbmModi55KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MyB2KSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2KSB7IFwKKyAgICBmbG9hdDQgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHIudyA9IGZuYyh2LncpOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsgXAorICAgIGZsb2F0MyByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yRihmbmMpIFwKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDMgdjEsIGZsb2F0IHYyKSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mik7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIpOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9CisKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQpOworREVGX0ZVTkNfMShhY29zKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvc2goZmxvYXQpOworREVGX0ZVTkNfMShhY29zaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFjb3ModikgLyBNX1BJOworfQorREVGX0ZVTkNfMShhY29zcGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhc2luKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXNpbnBpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7CitERUZfRlVOQ18xKGF0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihhdGFuMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXRhbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhdGFuKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXRhbnBpKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KSB7CisgICAgcmV0dXJuIGF0YW4yKHksIHgpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzIoYXRhbjJwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNicnQoZmxvYXQpOworREVGX0ZVTkNfMShjYnJ0KQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdCk7CitERUZfRlVOQ18xKGNlaWwpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihjb3B5c2lnbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7CitERUZfRlVOQ18xKGNvcykKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvc2goZmxvYXQpOworREVGX0ZVTkNfMShjb3NoKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBjb3ModiAqIE1fUEkpOworfQorREVGX0ZVTkNfMShjb3NwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGVyZmMoZmxvYXQpOworREVGX0ZVTkNfMShlcmZjKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXJmKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXJmKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXhwKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdCk7CitERUZfRlVOQ18xKGV4cDIpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQsIGZsb2F0KTsKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHBvdygxMC5mLCB2KTsKK30KK0RFRl9GVU5DXzEoZXhwMTApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHBtMShmbG9hdCk7CitERUZfRlVOQ18xKGV4cG0xKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdCk7CitERUZfRlVOQ18xKGZhYnMpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmZGltKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZkaW0pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdCk7CitERUZfRlVOQ18xKGZsb29yKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYShmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWF4KTsKK0RFRl9GVU5DXzJGKGZtYXgpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWluKTsKK0RFRl9GVU5DXzJGKGZtaW4pOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbW9kKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQgdiwgZmxvYXQgKmlwdHIpIHsKKyAgICBpbnQgaSA9IChpbnQpZmxvb3Iodik7CisgICAgaXB0clswXSA9IGk7CisgICAgcmV0dXJuIGZtaW4odiAtIGksIDB4MS5mZmZmZmVwLTFmKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQyIHYsIGZsb2F0MiAqaXB0cikgeworICAgIGZsb2F0IHRbMl07CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gZnJhY3Qodi54LCAmdFswXSk7CisgICAgci55ID0gZnJhY3Qodi55LCAmdFsxXSk7CisgICAgaXB0clswXSA9IHRbMF07CisgICAgaXB0clsxXSA9IHRbMV07CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyYWN0KGZsb2F0MyB2LCBmbG9hdDMgKmlwdHIpIHsKKyAgICBmbG9hdCB0WzNdOworICAgIGZsb2F0MyByOworICAgIHIueCA9IGZyYWN0KHYueCwgJnRbMF0pOworICAgIHIueSA9IGZyYWN0KHYueSwgJnRbMV0pOworICAgIHIueiA9IGZyYWN0KHYueiwgJnRbMl0pOworICAgIGlwdHJbMF0gPSB0WzBdOworICAgIGlwdHJbMV0gPSB0WzFdOworICAgIGlwdHJbMl0gPSB0WzJdOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdDQgdiwgZmxvYXQ0ICppcHRyKSB7CisgICAgZmxvYXQgdFs0XTsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSBmcmFjdCh2LngsICZ0WzBdKTsKKyAgICByLnkgPSBmcmFjdCh2LnksICZ0WzFdKTsKKyAgICByLnogPSBmcmFjdCh2LnosICZ0WzJdKTsKKyAgICByLncgPSBmcmFjdCh2LncsICZ0WzNdKTsKKyAgICBpcHRyWzBdID0gdFswXTsKKyAgICBpcHRyWzFdID0gdFsxXTsKKyAgICBpcHRyWzJdID0gdFsyXTsKKyAgICBpcHRyWzNdID0gdFszXTsKKyAgICByZXR1cm4gcjsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0LCBmbG9hdCAqKTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmV4cChmbG9hdDQsIGZsb2F0NCAqKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGh5cG90KGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGh5cG90KQorCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGlsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEoaWxvZ2IpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdCwgaW50KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQzLCBpbnQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQ0LCBpbnQ0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDMsIGludCk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0NCwgaW50KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdCk7CitERUZfRlVOQ18xKGxnYW1tYSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0NCwgZmxvYXQ0ICopOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nKQorCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7CitERUZfRlVOQ18xKGxvZzEwKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCB2KSB7CisgICAgcmV0dXJuIGxvZzEwKHYpIC8gbG9nMTAoMi5mKTsKK30KK0RFRl9GVU5DXzEobG9nMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzFwKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nMXApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nYikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYWQoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdDQsIGZsb2F0NCwgZmxvYXQ0KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0NCwgZmxvYXQ0ICopOworCisvL2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuYW4odWludCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuZXh0YWZ0ZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIobmV4dGFmdGVyKQorCitERUZfRlVOQ18yKHBvdykKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQgdiwgaW50IHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdClwKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdDIgdiwgaW50MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCAoZmxvYXQyKXApOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3duKGZsb2F0MyB2LCBpbnQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdDMpcCk7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQ0IHYsIGludDQgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0NClwKTsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQgdiwgZmxvYXQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQyIHYsIGZsb2F0MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdDMgdiwgZmxvYXQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIHApOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3dyKGZsb2F0NCB2LCBmbG9hdDQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1haW5kZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIocmVtYWluZGVyKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0LCBmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbXF1byhmbG9hdDIsIGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQzLCBmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQgKik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKK0RFRl9GVU5DXzEocmludCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvb3RuKGZsb2F0IHYsIGludCByKSB7CisgICAgcmV0dXJuIHBvdyh2LCAxLmYgLyByKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQyIHYsIGludDIgcikgeworICAgIGZsb2F0MiB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55fTsKKyAgICByZXR1cm4gcG93KHYsIHQpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdDMgdiwgaW50MyByKSB7CisgICAgZmxvYXQzIHQgPSB7MS5mIC8gci54LCAxLmYgLyByLnksIDEuZiAvIHIuen07CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQ0IHYsIGludDQgcikgeworICAgIGZsb2F0NCB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55LCAxLmYgLyByLnosIDEuZiAvIHIud307CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKK0RFRl9GVU5DXzEocm91bmQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0KTsKKy8qc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0IHYpIHsKKyAgICByZXR1cm4gMS5mIC8gc3FydCh2KTsKK30KK0RFRl9GVU5DXzEocnNxcnQpKi8KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7CitERUZfRlVOQ18xKHNpbikKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdCB2LCBmbG9hdCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQyIHYsIGZsb2F0MiAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQzIHYsIGZsb2F0MyAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQ0IHYsIGZsb2F0NCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luaChmbG9hdCk7CitERUZfRlVOQ18xKHNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHNpbih2ICogTV9QSSk7Cit9CitERUZfRlVOQ18xKHNpbnBpKQorCitERUZfRlVOQ18xKHNxcnQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOworREVGX0ZVTkNfMSh0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEodGFuaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdGFuKHYgKiBNX1BJKTsKK30KK0RFRl9GVU5DXzEodGFucGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0Z2FtbWEoZmxvYXQpOworREVGX0ZVTkNfMSh0Z2FtbWEpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdCk7CitERUZfRlVOQ18xKHRydW5jKQorCisvLyBJbnQgb3BzIChwYXJ0aWFsKSwgNi4xMS4zCitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50KTsKK2V4dGVybiB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKHNob3J0KTsKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoY2hhcik7CisKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1aW50KTsKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KGludCk7CitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1c2hvcnQpOworZXh0ZXJuIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihzaG9ydCk7CitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHVjaGFyKTsKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihjaGFyKTsKKworc3RhdGljIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVpbnQgdjEsIHVpbnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihpbnQgdjEsIGludCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVzaG9ydCB2MSwgdXNob3J0IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihzaG9ydCB2MSwgc2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVjaGFyIHYxLCB1Y2hhciB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihjaGFyIHYxLCBjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorCitzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodWludCB2MSwgdWludCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGludCB2MSwgaW50IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodXNob3J0IHYxLCB1c2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KHNob3J0IHYxLCBzaG9ydCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodWNoYXIgdjEsIHVjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGNoYXIgdjEsIGNoYXIgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CisKKworCisKKy8vIDYuMTEuNAorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQyIGFtb3VudCwgZmxvYXQyIGxvdywgZmxvYXQyIGhpZ2gpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdy54ID8gbG93LnggOiAoYW1vdW50LnggPiBoaWdoLnggPyBoaWdoLnggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cueSA/IGxvdy55IDogKGFtb3VudC55ID4gaGlnaC55ID8gaGlnaC55IDogYW1vdW50LnkpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMgYW1vdW50LCBmbG9hdDMgbG93LCBmbG9hdDMgaGlnaCkgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cueiA/IGxvdy56IDogKGFtb3VudC56ID4gaGlnaC56ID8gaGlnaC56IDogYW1vdW50LnopOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQgYW1vdW50LCBmbG9hdDQgbG93LCBmbG9hdDQgaGlnaCkgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cueiA/IGxvdy56IDogKGFtb3VudC56ID4gaGlnaC56ID8gaGlnaC56IDogYW1vdW50LnopOworICAgIHIudyA9IGFtb3VudC53IDwgbG93LncgPyBsb3cudyA6IChhbW91bnQudyA+IGhpZ2gudyA/IGhpZ2gudyA6IGFtb3VudC53KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQyIGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cgPyBsb3cgOiAoYW1vdW50LnggPiBoaWdoID8gaGlnaCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdyA/IGxvdyA6IChhbW91bnQueSA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnkpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdyA/IGxvdyA6IChhbW91bnQueCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93ID8gbG93IDogKGFtb3VudC55ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cgPyBsb3cgOiAoYW1vdW50LnogPiBoaWdoID8gaGlnaCA6IGFtb3VudC56KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cgPyBsb3cgOiAoYW1vdW50LnggPiBoaWdoID8gaGlnaCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdyA/IGxvdyA6IChhbW91bnQueSA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnkpOworICAgIHIueiA9IGFtb3VudC56IDwgbG93ID8gbG93IDogKGFtb3VudC56ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueik7CisgICAgci53ID0gYW1vdW50LncgPCBsb3cgPyBsb3cgOiAoYW1vdW50LncgPiBoaWdoID8gaGlnaCA6IGFtb3VudC53KTsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQgcmFkaWFucykgeworICAgIHJldHVybiByYWRpYW5zICogKDE4MC5mIC8gTV9QSSk7Cit9CitERUZfRlVOQ18xKGRlZ3JlZXMpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQgdjEsIGZsb2F0IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54ID4gdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPiB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDMgdjEsIGZsb2F0MyB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPiB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA+IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByLnogPSB2MS56ID4gdjIueiA/IHYxLnogOiB2Mi56OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSB2MS54ID4gdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPiB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA+IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByLncgPSB2MS53ID4gdjIudyA/IHYxLncgOiB2Mi53OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IHYxLnggPiB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55ID4gdjIgPyB2MS55IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDMgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56ID4gdjIgPyB2MS56IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDQgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56ID4gdjIgPyB2MS56IDogdjI7CisgICAgci53ID0gdjEudyA+IHYyID8gdjEudyA6IHYyOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0IHYxLCBmbG9hdCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MiB2MSwgZmxvYXQyIHYyKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gdjEueCA8IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55IDwgdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSB2MS54IDwgdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPCB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA8IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0NCB2MSwgZmxvYXQ0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA8IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55IDwgdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHIueiA9IHYxLnogPCB2Mi56ID8gdjEueiA6IHYyLno7CisgICAgci53ID0gdjEudyA8IHYyLncgPyB2MS53IDogdjIudzsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54IDwgdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA8IHYyID8gdjEueSA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA8IHYyID8gdjEueiA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ0IHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA8IHYyID8gdjEueiA6IHYyOworICAgIHIudyA9IHYxLncgPCB2MiA/IHYxLncgOiB2MjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIgc3RhcnQsIGZsb2F0MiBzdG9wLCBmbG9hdDIgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDMgc3RhcnQsIGZsb2F0MyBzdG9wLCBmbG9hdDMgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDQgc3RhcnQsIGZsb2F0NCBzdG9wLCBmbG9hdDQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIgc3RhcnQsIGZsb2F0MiBzdG9wLCBmbG9hdCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MyBzdGFydCwgZmxvYXQzIHN0b3AsIGZsb2F0IGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0IHN0YXJ0LCBmbG9hdDQgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0IGRlZ3JlZXMpIHsKKyAgICByZXR1cm4gZGVncmVlcyAqIChNX1BJIC8gMTgwLmYpOworfQorREVGX0ZVTkNfMShyYWRpYW5zKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdCBlZGdlLCBmbG9hdCB2KSB7CisgICAgcmV0dXJuICh2IDwgZWRnZSkgPyAwLmYgOiAxLmY7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQyIGVkZ2UsIGZsb2F0MiB2KSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQzIGVkZ2UsIGZsb2F0MyB2KSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYueiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQ0IGVkZ2UsIGZsb2F0NCB2KSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYueiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgci53ID0gKHYudyA8IGVkZ2UudykgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQyIGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0MyBlZGdlLCBmbG9hdCB2KSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gKHYgPCBlZGdlLngpID8gMC5mIDogMS5mOworICAgIHIueSA9ICh2IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByLnogPSAodiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQ0IGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHIueiA9ICh2IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByLncgPSAodiA8IGVkZ2UudykgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdCwgZmxvYXQsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdDQpOworCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdCB2KSB7CisgICAgaWYgKHYgPiAwKSByZXR1cm4gMS5mOworICAgIGlmICh2IDwgMCkgcmV0dXJuIC0xLmY7CisgICAgcmV0dXJuIHY7Cit9CitERUZfRlVOQ18xKHNpZ24pCisKKy8vIDYuMTEuNQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjcm9zcyhmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gbGhzLnkgKiByaHMueiAgLSBsaHMueiAqIHJocy55OworICAgIHIueSA9IGxocy56ICogcmhzLnggIC0gbGhzLnggKiByaHMuejsKKyAgICByLnogPSBsaHMueCAqIHJocy55ICAtIGxocy55ICogcmhzLng7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY3Jvc3MoZmxvYXQ0IGxocywgZmxvYXQ0IHJocykgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGxocy55ICogcmhzLnogIC0gbGhzLnogKiByaHMueTsKKyAgICByLnkgPSBsaHMueiAqIHJocy54ICAtIGxocy54ICogcmhzLno7CisgICAgci56ID0gbGhzLnggKiByaHMueSAgLSBsaHMueSAqIHJocy54OworICAgIHIudyA9IDAuZjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRvdChmbG9hdCBsaHMsIGZsb2F0IHJocykgeworICAgIHJldHVybiBsaHMgKiByaHM7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0MiBsaHMsIGZsb2F0MiByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQzIGxocywgZmxvYXQzIHJocykgeworICAgIHJldHVybiBsaHMueCpyaHMueCArIGxocy55KnJocy55ICsgbGhzLnoqcmhzLno7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueSArIGxocy56KnJocy56ICsgbGhzLncqcmhzLnc7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQgdikgeworICAgIHJldHVybiB2OworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDIgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55KTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gc3FydCh2Lngqdi54ICsgdi55KnYueSArIHYueip2LnopOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDQgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55ICsgdi56KnYueiArIHYudyp2LncpOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQgbGhzLCBmbG9hdCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQyIGxocywgZmxvYXQyIHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgcmV0dXJuIGxlbmd0aChsaHMgLSByaHMpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRpc3RhbmNlKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQgdikgeworICAgIHJldHVybiAxLmY7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdDIgdikgeworICAgIHJldHVybiB2IC8gbGVuZ3RoKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gdiAvIGxlbmd0aCh2KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbm9ybWFsaXplKGZsb2F0NCB2KSB7CisgICAgcmV0dXJuIHYgLyBsZW5ndGgodik7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1MDE4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jb3JlLnJzaApAQCAtMCwwICsxLDkxNiBAQAorI2lmbmRlZiBfX1JTX0NPUkVfUlNIX18KKyNkZWZpbmUgX19SU19DT1JFX1JTSF9fCisKKy8vIERlYnVnZ2luZywgcHJpbnQgdG8gdGhlIExPRyBhIGRlc2NyaXB0aW9uIHN0cmluZyBhbmQgYSB2YWx1ZS4KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDR4NCAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDN4MyAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDJ4MiAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCB1aW50KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKik7CisjZGVmaW5lIFJTX0RFQlVHKGEpIHJzRGVidWcoI2EsIGEpCisjZGVmaW5lIFJTX0RFQlVHX01BUktFUiByc0RlYnVnKF9fRklMRV9fLCBfX0xJTkVfXykKKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNEZWJ1Zyhjb25zdCBjaGFyICpzLCBmbG9hdDIgdikgeworICAgIHJzRGVidWcocywgdi54LCB2LnkpOworfQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNEZWJ1Zyhjb25zdCBjaGFyICpzLCBmbG9hdDMgdikgeworICAgIHJzRGVidWcocywgdi54LCB2LnksIHYueik7Cit9CitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc0RlYnVnKGNvbnN0IGNoYXIgKnMsIGZsb2F0NCB2KSB7CisgICAgcnNEZWJ1ZyhzLCB2LngsIHYueSwgdi56LCB2LncpOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCit7CisgICAgdWNoYXI0IGM7CisgICAgYy54ID0gKHVjaGFyKShyICogMjU1LmYpOworICAgIGMueSA9ICh1Y2hhcikoZyAqIDI1NS5mKTsKKyAgICBjLnogPSAodWNoYXIpKGIgKiAyNTUuZik7CisgICAgYy53ID0gMjU1OworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgdWNoYXI0IGM7CisgICAgYy54ID0gKHVjaGFyKShyICogMjU1LmYpOworICAgIGMueSA9ICh1Y2hhcikoZyAqIDI1NS5mKTsKKyAgICBjLnogPSAodWNoYXIpKGIgKiAyNTUuZik7CisgICAgYy53ID0gKHVjaGFyKShhICogMjU1LmYpOworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0MyBjb2xvcikKK3sKKyAgICBjb2xvciAqPSAyNTUuZjsKKyAgICB1Y2hhcjQgYyA9IHtjb2xvci54LCBjb2xvci55LCBjb2xvci56LCAyNTV9OworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0NCBjb2xvcikKK3sKKyAgICBjb2xvciAqPSAyNTUuZjsKKyAgICB1Y2hhcjQgYyA9IHtjb2xvci54LCBjb2xvci55LCBjb2xvci56LCBjb2xvci53fTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIGZsb2F0NCByc1VucGFja0NvbG9yODg4OCh1Y2hhcjQgYykKK3sKKyAgICBmbG9hdDQgcmV0ID0gKGZsb2F0NCkwLjAwMzkxNTY4NjI3NDVmOworICAgIHJldCAqPSBjb252ZXJ0X2Zsb2F0NChjKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvL2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzU2NShmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKTsKKy8vZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvNTY1KGZsb2F0Myk7CisvL2V4dGVybiBmbG9hdDQgcnNVbnBhY2tDb2xvcjU2NSh1Y2hhcjQpOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNYXRyaXggb3BzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTZXQocnNfbWF0cml4NHg0ICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCwgZmxvYXQgdikgeworICAgIG0tPm1bcm93ICogNCArIGNvbF0gPSB2OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4R2V0KGNvbnN0IHJzX21hdHJpeDR4NCAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wpIHsKKyAgICByZXR1cm4gbS0+bVtyb3cgKiA0ICsgY29sXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2V0KHJzX21hdHJpeDN4MyAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wsIGZsb2F0IHYpIHsKKyAgICBtLT5tW3JvdyAqIDMgKyBjb2xdID0gdjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEdldChjb25zdCByc19tYXRyaXgzeDMgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sKSB7CisgICAgcmV0dXJuIG0tPm1bcm93ICogMyArIGNvbF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFNldChyc19tYXRyaXgyeDIgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sLCBmbG9hdCB2KSB7CisgICAgbS0+bVtyb3cgKiAyICsgY29sXSA9IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhHZXQoY29uc3QgcnNfbWF0cml4MngyICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCkgeworICAgIHJldHVybiBtLT5tW3JvdyAqIDIgKyBjb2xdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkSWRlbnRpdHkocnNfbWF0cml4NHg0ICptKSB7CisgICAgbS0+bVswXSA9IDEuZjsKKyAgICBtLT5tWzFdID0gMC5mOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gMC5mOworICAgIG0tPm1bNV0gPSAxLmY7CisgICAgbS0+bVs2XSA9IDAuZjsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSAwLmY7CisgICAgbS0+bVs5XSA9IDAuZjsKKyAgICBtLT5tWzEwXSA9IDEuZjsKKyAgICBtLT5tWzExXSA9IDAuZjsKKyAgICBtLT5tWzEyXSA9IDAuZjsKKyAgICBtLT5tWzEzXSA9IDAuZjsKKyAgICBtLT5tWzE0XSA9IDAuZjsKKyAgICBtLT5tWzE1XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDN4MyAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IDEuZjsKKyAgICBtLT5tWzVdID0gMC5mOworICAgIG0tPm1bNl0gPSAwLmY7CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkSWRlbnRpdHkocnNfbWF0cml4MngyICptKSB7CisgICAgbS0+bVswXSA9IDEuZjsKKyAgICBtLT5tWzFdID0gMC5mOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IGZsb2F0ICp2KSB7CisgICAgbS0+bVswXSA9IHZbMF07CisgICAgbS0+bVsxXSA9IHZbMV07CisgICAgbS0+bVsyXSA9IHZbMl07CisgICAgbS0+bVszXSA9IHZbM107CisgICAgbS0+bVs0XSA9IHZbNF07CisgICAgbS0+bVs1XSA9IHZbNV07CisgICAgbS0+bVs2XSA9IHZbNl07CisgICAgbS0+bVs3XSA9IHZbN107CisgICAgbS0+bVs4XSA9IHZbOF07CisgICAgbS0+bVs5XSA9IHZbOV07CisgICAgbS0+bVsxMF0gPSB2WzEwXTsKKyAgICBtLT5tWzExXSA9IHZbMTFdOworICAgIG0tPm1bMTJdID0gdlsxMl07CisgICAgbS0+bVsxM10gPSB2WzEzXTsKKyAgICBtLT5tWzE0XSA9IHZbMTRdOworICAgIG0tPm1bMTVdID0gdlsxNV07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4M3gzICptLCBjb25zdCBmbG9hdCAqdikgeworICAgIG0tPm1bMF0gPSB2WzBdOworICAgIG0tPm1bMV0gPSB2WzFdOworICAgIG0tPm1bMl0gPSB2WzJdOworICAgIG0tPm1bM10gPSB2WzNdOworICAgIG0tPm1bNF0gPSB2WzRdOworICAgIG0tPm1bNV0gPSB2WzVdOworICAgIG0tPm1bNl0gPSB2WzZdOworICAgIG0tPm1bN10gPSB2WzddOworICAgIG0tPm1bOF0gPSB2WzhdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDJ4MiAqbSwgY29uc3QgZmxvYXQgKnYpIHsKKyAgICBtLT5tWzBdID0gdlswXTsKKyAgICBtLT5tWzFdID0gdlsxXTsKKyAgICBtLT5tWzJdID0gdlsyXTsKKyAgICBtLT5tWzNdID0gdlszXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSB2LT5tWzNdOworICAgIG0tPm1bNF0gPSB2LT5tWzRdOworICAgIG0tPm1bNV0gPSB2LT5tWzVdOworICAgIG0tPm1bNl0gPSB2LT5tWzZdOworICAgIG0tPm1bN10gPSB2LT5tWzddOworICAgIG0tPm1bOF0gPSB2LT5tWzhdOworICAgIG0tPm1bOV0gPSB2LT5tWzldOworICAgIG0tPm1bMTBdID0gdi0+bVsxMF07CisgICAgbS0+bVsxMV0gPSB2LT5tWzExXTsKKyAgICBtLT5tWzEyXSA9IHYtPm1bMTJdOworICAgIG0tPm1bMTNdID0gdi0+bVsxM107CisgICAgbS0+bVsxNF0gPSB2LT5tWzE0XTsKKyAgICBtLT5tWzE1XSA9IHYtPm1bMTVdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4M3gzICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IHYtPm1bMl07CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gdi0+bVszXTsKKyAgICBtLT5tWzVdID0gdi0+bVs0XTsKKyAgICBtLT5tWzZdID0gdi0+bVs1XTsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSB2LT5tWzZdOworICAgIG0tPm1bOV0gPSB2LT5tWzddOworICAgIG0tPm1bMTBdID0gdi0+bVs4XTsKKyAgICBtLT5tWzExXSA9IDAuZjsKKyAgICBtLT5tWzEyXSA9IDAuZjsKKyAgICBtLT5tWzEzXSA9IDAuZjsKKyAgICBtLT5tWzE0XSA9IDAuZjsKKyAgICBtLT5tWzE1XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gdi0+bVszXTsKKyAgICBtLT5tWzVdID0gdi0+bVs0XTsKKyAgICBtLT5tWzZdID0gMC5mOworICAgIG0tPm1bN10gPSAwLmY7CisgICAgbS0+bVs4XSA9IHYtPm1bNl07CisgICAgbS0+bVs5XSA9IHYtPm1bN107CisgICAgbS0+bVsxMF0gPSAxLmY7CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4M3gzICptLCBjb25zdCByc19tYXRyaXgzeDMgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKKyAgICBtLT5tWzRdID0gdi0+bVs0XTsKKyAgICBtLT5tWzVdID0gdi0+bVs1XTsKKyAgICBtLT5tWzZdID0gdi0+bVs2XTsKKyAgICBtLT5tWzddID0gdi0+bVs3XTsKKyAgICBtLT5tWzhdID0gdi0+bVs4XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXgyeDIgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSB2LT5tWzNdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkUm90YXRlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgZmxvYXQgYywgczsKKyAgICBtLT5tWzNdID0gMDsKKyAgICBtLT5tWzddID0gMDsKKyAgICBtLT5tWzExXT0gMDsKKyAgICBtLT5tWzEyXT0gMDsKKyAgICBtLT5tWzEzXT0gMDsKKyAgICBtLT5tWzE0XT0gMDsKKyAgICBtLT5tWzE1XT0gMTsKKyAgICByb3QgKj0gKGZsb2F0KShNX1BJIC8gMTgwLjBmKTsKKyAgICBjID0gY29zKHJvdCk7CisgICAgcyA9IHNpbihyb3QpOworCisgICAgY29uc3QgZmxvYXQgbGVuID0geCp4ICsgeSp5ICsgeip6OworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICB9CisgICAgY29uc3QgZmxvYXQgbmMgPSAxLjBmIC0gYzsKKyAgICBjb25zdCBmbG9hdCB4eSA9IHggKiB5OworICAgIGNvbnN0IGZsb2F0IHl6ID0geSAqIHo7CisgICAgY29uc3QgZmxvYXQgenggPSB6ICogeDsKKyAgICBjb25zdCBmbG9hdCB4cyA9IHggKiBzOworICAgIGNvbnN0IGZsb2F0IHlzID0geSAqIHM7CisgICAgY29uc3QgZmxvYXQgenMgPSB6ICogczsKKyAgICBtLT5tWyAwXSA9IHgqeCpuYyArICBjOworICAgIG0tPm1bIDRdID0gIHh5Km5jIC0genM7CisgICAgbS0+bVsgOF0gPSAgengqbmMgKyB5czsKKyAgICBtLT5tWyAxXSA9ICB4eSpuYyArIHpzOworICAgIG0tPm1bIDVdID0geSp5Km5jICsgIGM7CisgICAgbS0+bVsgOV0gPSAgeXoqbmMgLSB4czsKKyAgICBtLT5tWyAyXSA9ICB6eCpuYyAtIHlzOworICAgIG0tPm1bIDZdID0gIHl6Km5jICsgeHM7CisgICAgbS0+bVsxMF0gPSB6KnoqbmMgKyAgYzsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFNjYWxlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMF0gPSB4OworICAgIG0tPm1bNV0gPSB5OworICAgIG0tPm1bMTBdID0gejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFRyYW5zbGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzEyXSA9IHg7CisgICAgbS0+bVsxM10gPSB5OworICAgIG0tPm1bMTRdID0gejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4NHg0ICpsaHMsIGNvbnN0IHJzX21hdHJpeDR4NCAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgIGZsb2F0IHJpMyA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8NCA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMiArPSByc01hdHJpeEdldChsaHMsIGosIDIpICogcmhzX2lqOworICAgICAgICAgICAgcmkzICs9IHJzTWF0cml4R2V0KGxocywgaiwgMykgKiByaHNfaWo7CisgICAgICAgIH0KKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMCwgcmkwKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMSwgcmkxKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMiwgcmkyKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMywgcmkzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4NHg0ICpyaHMpIHsKKyAgICByc19tYXRyaXg0eDQgbXQ7CisgICAgcnNNYXRyaXhMb2FkTXVsdGlwbHkoJm10LCBtLCByaHMpOworICAgIHJzTWF0cml4TG9hZChtLCAmbXQpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkTXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBjb25zdCByc19tYXRyaXgzeDMgKmxocywgY29uc3QgcnNfbWF0cml4M3gzICpyaHMpIHsKKyAgICBmb3IgKGludCBpPTAgOyBpPDMgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgZmxvYXQgcmkyID0gMDsKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajwzIDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByaHNfaWogPSByc01hdHJpeEdldChyaHMsIGksaik7CisgICAgICAgICAgICByaTAgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAwKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMSArPSByc01hdHJpeEdldChsaHMsIGosIDEpICogcmhzX2lqOworICAgICAgICAgICAgcmkyICs9IHJzTWF0cml4R2V0KGxocywgaiwgMikgKiByaHNfaWo7CisgICAgICAgIH0KKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMCwgcmkwKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMSwgcmkxKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMiwgcmkyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICpyaHMpIHsKKyAgICByc19tYXRyaXgzeDMgbXQ7CisgICAgcnNNYXRyaXhMb2FkTXVsdGlwbHkoJm10LCBtLCByaHMpOworICAgIHJzTWF0cml4TG9hZChtLCAmbXQpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkTXVsdGlwbHkocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKmxocywgY29uc3QgcnNfbWF0cml4MngyICpyaHMpIHsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajwyIDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByaHNfaWogPSByc01hdHJpeEdldChyaHMsIGksaik7CisgICAgICAgICAgICByaTAgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAwKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMSArPSByc01hdHJpeEdldChsaHMsIGosIDEpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgyeDIgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqcmhzKSB7CisgICAgcnNfbWF0cml4MngyIG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4Um90YXRlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFJvdGF0ZSgmbTEsIHJvdCwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTY2FsZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc19tYXRyaXg0eDQgbTE7CisgICAgcnNNYXRyaXhMb2FkU2NhbGUoJm0xLCB4LCB5LCB6KTsKKyAgICByc01hdHJpeE11bHRpcGx5KG0sICZtMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFRyYW5zbGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc19tYXRyaXg0eDQgbTE7CisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtMSwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkT3J0aG8ocnNfbWF0cml4NHg0ICptLCBmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMF0gPSAyLmYgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzVdID0gMi5mIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxMF09IC0yLmYgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxMl09IC0ocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpOworICAgIG0tPm1bMTNdPSAtKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzE0XT0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZEZydXN0dW0ocnNfbWF0cml4NHg0ICptLCBmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMF0gPSAyLmYgKiBuZWFyIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs1XSA9IDIuZiAqIG5lYXIgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzhdID0gKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzldID0gKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzEwXT0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKKyAgICBtLT5tWzExXT0gLTEuZjsKKyAgICBtLT5tWzE0XT0gLTIuZiAqIGZhciAqIG5lYXIgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxNV09IDAuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFBlcnNwZWN0aXZlKHJzX21hdHJpeDR4NCogbSwgZmxvYXQgZm92eSwgZmxvYXQgYXNwZWN0LCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICBmbG9hdCB0b3AgPSBuZWFyICogdGFuKChmbG9hdCkgKGZvdnkgKiBNX1BJIC8gMzYwLjBmKSk7CisgICAgZmxvYXQgYm90dG9tID0gLXRvcDsKKyAgICBmbG9hdCBsZWZ0ID0gYm90dG9tICogYXNwZWN0OworICAgIGZsb2F0IHJpZ2h0ID0gdG9wICogYXNwZWN0OworICAgIHJzTWF0cml4TG9hZEZydXN0dW0obSwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpOworfQorCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgZmxvYXQ0IGluKSB7CisgICAgZmxvYXQ0IHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KSArIChtLT5tWzEyXSAqIGluLncpOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs5XSAqIGluLnopICsgKG0tPm1bMTNdICogaW4udyk7CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIChtLT5tWzEwXSAqIGluLnopICsgKG0tPm1bMTRdICogaW4udyk7CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIChtLT5tWzExXSAqIGluLnopICsgKG0tPm1bMTVdICogaW4udyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGZsb2F0MyBpbikgeworICAgIGZsb2F0NCByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KSArIChtLT5tWzhdICogaW4ueikgKyBtLT5tWzEyXTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgKG0tPm1bOV0gKiBpbi56KSArIG0tPm1bMTNdOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzZdICogaW4ueSkgKyAobS0+bVsxMF0gKiBpbi56KSArIG0tPm1bMTRdOworICAgIHJldC53ID0gKG0tPm1bM10gKiBpbi54KSArIChtLT5tWzddICogaW4ueSkgKyAobS0+bVsxMV0gKiBpbi56KSArIG0tPm1bMTVdOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDQgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyBtLT5tWzEyXTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgbS0+bVsxM107CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIG0tPm1bMTRdOworICAgIHJldC53ID0gKG0tPm1bM10gKiBpbi54KSArIChtLT5tWzddICogaW4ueSkgKyBtLT5tWzE1XTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgZmxvYXQzIGluKSB7CisgICAgZmxvYXQzIHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVszXSAqIGluLnkpICsgKG0tPm1bNl0gKiBpbi56KTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bN10gKiBpbi56KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgZmxvYXQyIGluKSB7CisgICAgZmxvYXQzIHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVszXSAqIGluLnkpOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSk7CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDJ4MiAqbSwgZmxvYXQyIGluKSB7CisgICAgZmxvYXQyIHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVsyXSAqIGluLnkpOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSk7CisgICAgcmV0dXJuIHJldDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggd2FzIHN1Y2Nlc3NmdWxseSBpbnZlcnNlZAorc3RhdGljIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4SW52ZXJzZShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICByc19tYXRyaXg0eDQgcmVzdWx0OworCisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlQ29mYWN0b3IgZm9yIGludCBpLCBpbnQgagorICAgICAgICAgICAgaW50IGMwID0gKGkrMSkgJSA0OworICAgICAgICAgICAgaW50IGMxID0gKGkrMikgJSA0OworICAgICAgICAgICAgaW50IGMyID0gKGkrMykgJSA0OworICAgICAgICAgICAgaW50IHIwID0gKGorMSkgJSA0OworICAgICAgICAgICAgaW50IHIxID0gKGorMikgJSA0OworICAgICAgICAgICAgaW50IHIyID0gKGorMykgJSA0OworCisgICAgICAgICAgICBmbG9hdCBtaW5vciA9IChtLT5tW2MwICsgNCpyMF0gKiAobS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIChtLT5tW2MwICsgNCpyMV0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIChtLT5tW2MwICsgNCpyMl0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjFdIC0gbS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjBdKSk7CisKKyAgICAgICAgICAgIGZsb2F0IGNvZmFjdG9yID0gKGkraikgJiAxID8gLW1pbm9yIDogbWlub3I7CisKKyAgICAgICAgICAgIHJlc3VsdC5tWzQqaSArIGpdID0gY29mYWN0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEb3QgcHJvZHVjdCBvZiAwdGggY29sdW1uIG9mIHNvdXJjZSBhbmQgMHRoIHJvdyBvZiByZXN1bHQKKyAgICBmbG9hdCBkZXQgPSBtLT5tWzBdKnJlc3VsdC5tWzBdICsgbS0+bVs0XSpyZXN1bHQubVsxXSArCisgICAgICAgICAgICAgICAgIG0tPm1bOF0qcmVzdWx0Lm1bMl0gKyBtLT5tWzEyXSpyZXN1bHQubVszXTsKKworICAgIGlmIChmYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgIG0tPm1baV0gPSByZXN1bHQubVtpXSAqIGRldDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggd2FzIHN1Y2Nlc3NmdWxseSBpbnZlcnNlZAorc3RhdGljIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4SW52ZXJzZVRyYW5zcG9zZShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICByc19tYXRyaXg0eDQgcmVzdWx0OworCisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlQ29mYWN0b3IgZm9yIGludCBpLCBpbnQgagorICAgICAgICAgICAgaW50IGMwID0gKGkrMSkgJSA0OworICAgICAgICAgICAgaW50IGMxID0gKGkrMikgJSA0OworICAgICAgICAgICAgaW50IGMyID0gKGkrMykgJSA0OworICAgICAgICAgICAgaW50IHIwID0gKGorMSkgJSA0OworICAgICAgICAgICAgaW50IHIxID0gKGorMikgJSA0OworICAgICAgICAgICAgaW50IHIyID0gKGorMykgJSA0OworCisgICAgICAgICAgICBmbG9hdCBtaW5vciA9IChtLT5tW2MwICsgNCpyMF0gKiAobS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIChtLT5tW2MwICsgNCpyMV0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIChtLT5tW2MwICsgNCpyMl0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjFdIC0gbS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjBdKSk7CisKKyAgICAgICAgICAgIGZsb2F0IGNvZmFjdG9yID0gKGkraikgJiAxID8gLW1pbm9yIDogbWlub3I7CisKKyAgICAgICAgICAgIHJlc3VsdC5tWzQqaiArIGldID0gY29mYWN0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEb3QgcHJvZHVjdCBvZiAwdGggY29sdW1uIG9mIHNvdXJjZSBhbmQgMHRoIGNvbHVtbiBvZiByZXN1bHQKKyAgICBmbG9hdCBkZXQgPSBtLT5tWzBdKnJlc3VsdC5tWzBdICsgbS0+bVs0XSpyZXN1bHQubVs0XSArCisgICAgICAgICAgICAgICAgIG0tPm1bOF0qcmVzdWx0Lm1bOF0gKyBtLT5tWzEyXSpyZXN1bHQubVsxMl07CisKKyAgICBpZiAoZmFicyhkZXQpIDwgMWUtNikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGV0ID0gMS4wZiAvIGRldDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICBtLT5tW2ldID0gcmVzdWx0Lm1baV0gKiBkZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFRyYW5zcG9zZShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCB0ZW1wOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgIHRlbXAgPSBtLT5tW2kqNCArIGpdOworICAgICAgICAgICAgbS0+bVtpKjQgKyBqXSA9IG0tPm1baio0ICsgaV07CisgICAgICAgICAgICBtLT5tW2oqNCArIGldID0gdGVtcDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4VHJhbnNwb3NlKHJzX21hdHJpeDN4MyAqbSkgeworICAgIGludCBpLCBqOworICAgIGZsb2F0IHRlbXA7CisgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IDM7ICsraikgeworICAgICAgICAgICAgdGVtcCA9IG0tPm1baSozICsgal07CisgICAgICAgICAgICBtLT5tW2kqMyArIGpdID0gbS0+bVtqKjQgKyBpXTsKKyAgICAgICAgICAgIG0tPm1baiozICsgaV0gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc3Bvc2UocnNfbWF0cml4MngyICptKSB7CisgICAgZmxvYXQgdGVtcCA9IG0tPm1bMV07CisgICAgbS0+bVsxXSA9IG0tPm1bMl07CisgICAgbS0+bVsyXSA9IHRlbXA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBxdWF0ZXJuaW9uIG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvblNldChyc19xdWF0ZXJuaW9uICpxLCBmbG9hdCB3LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcS0+dyA9IHc7CisgICAgcS0+eCA9IHg7CisgICAgcS0+eSA9IHk7CisgICAgcS0+eiA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc1F1YXRlcm5pb25TZXQocnNfcXVhdGVybmlvbiAqcSwgY29uc3QgcnNfcXVhdGVybmlvbiAqcmhzKSB7CisgICAgcS0+dyA9IHJocy0+dzsKKyAgICBxLT54ID0gcmhzLT54OworICAgIHEtPnkgPSByaHMtPnk7CisgICAgcS0+eiA9IHJocy0+ejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvbk11bHRpcGx5KHJzX3F1YXRlcm5pb24gKnEsIGZsb2F0IHMpIHsKKyAgICBxLT53ICo9IHM7CisgICAgcS0+eCAqPSBzOworICAgIHEtPnkgKj0gczsKKyAgICBxLT56ICo9IHM7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc1F1YXRlcm5pb25NdWx0aXBseShyc19xdWF0ZXJuaW9uICpxLCBjb25zdCByc19xdWF0ZXJuaW9uICpyaHMpIHsKKyAgICBxLT53ID0gLXEtPngqcmhzLT54IC0gcS0+eSpyaHMtPnkgLSBxLT56KnJocy0+eiArIHEtPncqcmhzLT53OworICAgIHEtPnggPSAgcS0+eCpyaHMtPncgKyBxLT55KnJocy0+eiAtIHEtPnoqcmhzLT55ICsgcS0+dypyaHMtPng7CisgICAgcS0+eSA9IC1xLT54KnJocy0+eiArIHEtPnkqcmhzLT53ICsgcS0+eipyaHMtPnogKyBxLT53KnJocy0+eTsKKyAgICBxLT56ID0gIHEtPngqcmhzLT55IC0gcS0+eSpyaHMtPnggKyBxLT56KnJocy0+dyArIHEtPncqcmhzLT56OworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uQWRkKHJzX3F1YXRlcm5pb24gKnEsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnJocykgeworICAgIHEtPncgKj0gcmhzLT53OworICAgIHEtPnggKj0gcmhzLT54OworICAgIHEtPnkgKj0gcmhzLT55OworICAgIHEtPnogKj0gcmhzLT56OworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZVVuaXQocnNfcXVhdGVybmlvbiAqcSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcm90ICo9IChmbG9hdCkoTV9QSSAvIDE4MC4wZikgKiAwLjVmOworICAgIGZsb2F0IGMgPSBjb3Mocm90KTsKKyAgICBmbG9hdCBzID0gc2luKHJvdCk7CisKKyAgICBxLT53ID0gYzsKKyAgICBxLT54ID0geCAqIHM7CisgICAgcS0+eSA9IHkgKiBzOworICAgIHEtPnogPSB6ICogczsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbkxvYWRSb3RhdGUocnNfcXVhdGVybmlvbiAqcSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgY29uc3QgZmxvYXQgbGVuID0geCp4ICsgeSp5ICsgeip6OworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICB9CisgICAgcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZVVuaXQocSwgcm90LCB4LCB5LCB6KTsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbkNvbmp1Z2F0ZShyc19xdWF0ZXJuaW9uICpxKSB7CisgICAgcS0+eCA9IC1xLT54OworICAgIHEtPnkgPSAtcS0+eTsKKyAgICBxLT56ID0gLXEtPno7Cit9CisKK3N0YXRpYyBmbG9hdAorcnNRdWF0ZXJuaW9uRG90KGNvbnN0IHJzX3F1YXRlcm5pb24gKnEwLCBjb25zdCByc19xdWF0ZXJuaW9uICpxMSkgeworICAgIHJldHVybiBxMC0+dypxMS0+dyArIHEwLT54KnExLT54ICsgcTAtPnkqcTEtPnkgKyBxMC0+eipxMS0+ejsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbk5vcm1hbGl6ZShyc19xdWF0ZXJuaW9uICpxKSB7CisgICAgY29uc3QgZmxvYXQgbGVuID0gcnNRdWF0ZXJuaW9uRG90KHEsIHEpOworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgcnNRdWF0ZXJuaW9uTXVsdGlwbHkocSwgcmVjaXBMZW4pOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvblNsZXJwKHJzX3F1YXRlcm5pb24gKnEsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnEwLCBjb25zdCByc19xdWF0ZXJuaW9uICpxMSwgZmxvYXQgdCkgeworICAgIGlmKHQgPD0gMC4wZikgeworICAgICAgICByc1F1YXRlcm5pb25TZXQocSwgcTApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHQgPj0gMS4wZikgeworICAgICAgICByc1F1YXRlcm5pb25TZXQocSwgcTEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcnNfcXVhdGVybmlvbiB0ZW1wcTAsIHRlbXBxMTsKKyAgICByc1F1YXRlcm5pb25TZXQoJnRlbXBxMCwgcTApOworICAgIHJzUXVhdGVybmlvblNldCgmdGVtcHExLCBxMSk7CisKKyAgICBmbG9hdCBhbmdsZSA9IHJzUXVhdGVybmlvbkRvdChxMCwgcTEpOworICAgIGlmKGFuZ2xlIDwgMCkgeworICAgICAgICByc1F1YXRlcm5pb25NdWx0aXBseSgmdGVtcHEwLCAtMS4wZik7CisgICAgICAgIGFuZ2xlICo9IC0xLjBmOworICAgIH0KKworICAgIGZsb2F0IHNjYWxlLCBpbnZTY2FsZTsKKyAgICBpZiAoYW5nbGUgKyAxLjBmID4gMC4wNWYpIHsKKyAgICAgICAgaWYgKDEuMGYgLSBhbmdsZSA+PSAwLjA1ZikgeworICAgICAgICAgICAgZmxvYXQgdGhldGEgPSBhY29zKGFuZ2xlKTsKKyAgICAgICAgICAgIGZsb2F0IGludlNpblRoZXRhID0gMS4wZiAvIHNpbih0aGV0YSk7CisgICAgICAgICAgICBzY2FsZSA9IHNpbih0aGV0YSAqICgxLjBmIC0gdCkpICogaW52U2luVGhldGE7CisgICAgICAgICAgICBpbnZTY2FsZSA9IHNpbih0aGV0YSAqIHQpICogaW52U2luVGhldGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzY2FsZSA9IDEuMGYgLSB0OworICAgICAgICAgICAgaW52U2NhbGUgPSB0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1F1YXRlcm5pb25TZXQoJnRlbXBxMSwgdGVtcHEwLnosIC10ZW1wcTAueSwgdGVtcHEwLngsIC10ZW1wcTAudyk7CisgICAgICAgIHNjYWxlID0gc2luKE1fUEkgKiAoMC41ZiAtIHQpKTsKKyAgICAgICAgaW52U2NhbGUgPSBzaW4oTV9QSSAqIHQpOworICAgIH0KKworICAgIHJzUXVhdGVybmlvblNldChxLCB0ZW1wcTAudypzY2FsZSArIHRlbXBxMS53KmludlNjYWxlLCB0ZW1wcTAueCpzY2FsZSArIHRlbXBxMS54KmludlNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHEwLnkqc2NhbGUgKyB0ZW1wcTEueSppbnZTY2FsZSwgdGVtcHEwLnoqc2NhbGUgKyB0ZW1wcTEueippbnZTY2FsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJzUXVhdGVybmlvbkdldE1hdHJpeFVuaXQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19xdWF0ZXJuaW9uICpxKSB7CisgICAgZmxvYXQgeDIgPSAyLjBmICogcS0+eCAqIHEtPng7CisgICAgZmxvYXQgeTIgPSAyLjBmICogcS0+eSAqIHEtPnk7CisgICAgZmxvYXQgejIgPSAyLjBmICogcS0+eiAqIHEtPno7CisgICAgZmxvYXQgeHkgPSAyLjBmICogcS0+eCAqIHEtPnk7CisgICAgZmxvYXQgd3ogPSAyLjBmICogcS0+dyAqIHEtPno7CisgICAgZmxvYXQgeHogPSAyLjBmICogcS0+eCAqIHEtPno7CisgICAgZmxvYXQgd3kgPSAyLjBmICogcS0+dyAqIHEtPnk7CisgICAgZmxvYXQgd3ggPSAyLjBmICogcS0+dyAqIHEtPng7CisgICAgZmxvYXQgeXogPSAyLjBmICogcS0+eSAqIHEtPno7CisKKyAgICBtLT5tWzBdID0gMS4wZiAtIHkyIC0gejI7CisgICAgbS0+bVsxXSA9IHh5IC0gd3o7CisgICAgbS0+bVsyXSA9IHh6ICsgd3k7CisgICAgbS0+bVszXSA9IDAuMGY7CisKKyAgICBtLT5tWzRdID0geHkgKyB3ejsKKyAgICBtLT5tWzVdID0gMS4wZiAtIHgyIC0gejI7CisgICAgbS0+bVs2XSA9IHl6IC0gd3g7CisgICAgbS0+bVs3XSA9IDAuMGY7CisKKyAgICBtLT5tWzhdID0geHogLSB3eTsKKyAgICBtLT5tWzldID0geXogLSB3eDsKKyAgICBtLT5tWzEwXSA9IDEuMGYgLSB4MiAtIHkyOworICAgIG0tPm1bMTFdID0gMC4wZjsKKworICAgIG0tPm1bMTJdID0gMC4wZjsKKyAgICBtLT5tWzEzXSA9IDAuMGY7CisgICAgbS0+bVsxNF0gPSAwLjBmOworICAgIG0tPm1bMTVdID0gMS4wZjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHV0aWxpdHkgZnVuY3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc0V4dHJhY3RGcnVzdHVtUGxhbmVzKGNvbnN0IHJzX21hdHJpeDR4NCAqbW9kZWxWaWV3UHJvaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKmxlZnQsIGZsb2F0NCAqcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICp0b3AsIGZsb2F0NCAqYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqbmVhciwgZmxvYXQ0ICpmYXIpIHsKKyAgICAvLyB4IHkgeiB3ID0gYSBiIGMgZCBpbiB0aGUgcGxhbmUgZXF1YXRpb24KKyAgICBsZWZ0LT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSArIG1vZGVsVmlld1Byb2otPm1bMF07CisgICAgbGVmdC0+eSA9IG1vZGVsVmlld1Byb2otPm1bN10gKyBtb2RlbFZpZXdQcm9qLT5tWzRdOworICAgIGxlZnQtPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSArIG1vZGVsVmlld1Byb2otPm1bOF07CisgICAgbGVmdC0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdICsgbW9kZWxWaWV3UHJvai0+bVsxMl07CisKKyAgICByaWdodC0+eCA9IG1vZGVsVmlld1Byb2otPm1bM10gLSBtb2RlbFZpZXdQcm9qLT5tWzBdOworICAgIHJpZ2h0LT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSAtIG1vZGVsVmlld1Byb2otPm1bNF07CisgICAgcmlnaHQtPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSAtIG1vZGVsVmlld1Byb2otPm1bOF07CisgICAgcmlnaHQtPncgPSBtb2RlbFZpZXdQcm9qLT5tWzE1XSAtIG1vZGVsVmlld1Byb2otPm1bMTJdOworCisgICAgdG9wLT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSAtIG1vZGVsVmlld1Byb2otPm1bMV07CisgICAgdG9wLT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSAtIG1vZGVsVmlld1Byb2otPm1bNV07CisgICAgdG9wLT56ID0gbW9kZWxWaWV3UHJvai0+bVsxMV0gLSBtb2RlbFZpZXdQcm9qLT5tWzldOworICAgIHRvcC0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdIC0gbW9kZWxWaWV3UHJvai0+bVsxM107CisKKyAgICBib3R0b20tPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdICsgbW9kZWxWaWV3UHJvai0+bVsxXTsKKyAgICBib3R0b20tPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddICsgbW9kZWxWaWV3UHJvai0+bVs1XTsKKyAgICBib3R0b20tPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSArIG1vZGVsVmlld1Byb2otPm1bOV07CisgICAgYm90dG9tLT53ID0gbW9kZWxWaWV3UHJvai0+bVsxNV0gKyBtb2RlbFZpZXdQcm9qLT5tWzEzXTsKKworICAgIG5lYXItPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdICsgbW9kZWxWaWV3UHJvai0+bVsyXTsKKyAgICBuZWFyLT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSArIG1vZGVsVmlld1Byb2otPm1bNl07CisgICAgbmVhci0+eiA9IG1vZGVsVmlld1Byb2otPm1bMTFdICsgbW9kZWxWaWV3UHJvai0+bVsxMF07CisgICAgbmVhci0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdICsgbW9kZWxWaWV3UHJvai0+bVsxNF07CisKKyAgICBmYXItPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdIC0gbW9kZWxWaWV3UHJvai0+bVsyXTsKKyAgICBmYXItPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddIC0gbW9kZWxWaWV3UHJvai0+bVs2XTsKKyAgICBmYXItPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSAtIG1vZGVsVmlld1Byb2otPm1bMTBdOworICAgIGZhci0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdIC0gbW9kZWxWaWV3UHJvai0+bVsxNF07CisKKyAgICBmbG9hdCBsZW4gPSBsZW5ndGgobGVmdC0+eHl6KTsKKyAgICAqbGVmdCAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKHJpZ2h0LT54eXopOworICAgICpyaWdodCAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKHRvcC0+eHl6KTsKKyAgICAqdG9wIC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgoYm90dG9tLT54eXopOworICAgICpib3R0b20gLz0gbGVuOworICAgIGxlbiA9IGxlbmd0aChuZWFyLT54eXopOworICAgICpuZWFyIC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgoZmFyLT54eXopOworICAgICpmYXIgLz0gbGVuOworfQorCitib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc0lzU3BoZXJlSW5GcnVzdHVtKGZsb2F0NCAqc3BoZXJlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqbGVmdCwgZmxvYXQ0ICpyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKnRvcCwgZmxvYXQ0ICpib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICpuZWFyLCBmbG9hdDQgKmZhcikgeworCisgICAgZmxvYXQgZGlzdFRvQ2VudGVyID0gZG90KGxlZnQtPnh5eiwgc3BoZXJlLT54eXopICsgbGVmdC0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KHJpZ2h0LT54eXosIHNwaGVyZS0+eHl6KSArIHJpZ2h0LT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkaXN0VG9DZW50ZXIgPSBkb3QodG9wLT54eXosIHNwaGVyZS0+eHl6KSArIHRvcC0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KGJvdHRvbS0+eHl6LCBzcGhlcmUtPnh5eikgKyBib3R0b20tPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChuZWFyLT54eXosIHNwaGVyZS0+eHl6KSArIG5lYXItPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChmYXItPnh5eiwgc3BoZXJlLT54eXopICsgZmFyLT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gaW50IG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworX19pbmxpbmVfXyBzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKHVpbnQgYW1vdW50LCB1aW50IGxvdywgdWludCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodXNob3J0IGFtb3VudCwgdXNob3J0IGxvdywgdXNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAoc2hvcnQgYW1vdW50LCBzaG9ydCBsb3csIHNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodWNoYXIgYW1vdW50LCB1Y2hhciBsb3csIHVjaGFyIGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChjaGFyIGFtb3VudCwgY2hhciBsb3csIGNoYXIgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCmluZGV4IDcwY2Q1NjIuLmFjNmY4Y2MgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaApAQCAtMSw2NSArMSwxMTIgQEAKKyNpZm5kZWYgX19SU19HUkFQSElDU19SU0hfXworI2RlZmluZSBfX1JTX0dSQVBISUNTX1JTSF9fCisKKyNpbmNsdWRlICJyc19tYXRoLnJzaCIKIAogCi1leHRlcm4gZmxvYXQyIHZlYzJSYW5kKGZsb2F0IGxlbik7CisvLyBCaW5kIGEgUHJvZ3JhbUZyYWdtZW50IHRvIHRoZSBSUyBjb250ZXh0LgorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KHJzX3Byb2dyYW1fZnJhZ21lbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKHJzX3Byb2dyYW1fc3RvcmUpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChyc19wcm9ncmFtX3ZlcnRleCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKHJzX3Byb2dyYW1fcmFzdGVyKTsKIAotZXh0ZXJuIGZsb2F0MyBmbG9hdDNOb3JtKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQgZmxvYXQzTGVuZ3RoKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M0FkZChmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzU3ViKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNDcm9zcyhmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdCBmbG9hdDNEb3QoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M1NjYWxlKGZsb2F0MyB2LCBmbG9hdCBzY2FsZSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRTYW1wbGVyKHJzX3Byb2dyYW1fZnJhZ21lbnQsIHVpbnQgc2xvdCwgcnNfc2FtcGxlcik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRUZXh0dXJlKHJzX3Byb2dyYW1fZnJhZ21lbnQsIHVpbnQgc2xvdCwgcnNfYWxsb2NhdGlvbik7CiAKLWV4dGVybiBmbG9hdDQgZmxvYXQ0QWRkKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0NCBmbG9hdDRTdWIoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQ0IGZsb2F0NENyb3NzKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0IGZsb2F0NERvdChmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdDQgZmxvYXQ0U2NhbGUoZmxvYXQ0IHYsIGZsb2F0IHNjYWxlKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IHJzX21hdHJpeDR4NCAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CiAKLSAgICAvLyBjb250ZXh0Ci1leHRlcm4gdm9pZCBiaW5kUHJvZ3JhbUZyYWdtZW50KHJzX3Byb2dyYW1fZnJhZ21lbnQpOwotZXh0ZXJuIHZvaWQgYmluZFByb2dyYW1TdG9yZShyc19wcm9ncmFtX3N0b3JlKTsKLWV4dGVybiB2b2lkIGJpbmRQcm9ncmFtVmVydGV4KHJzX3Byb2dyYW1fdmVydGV4KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleEdldFByb2plY3Rpb25NYXRyaXgocnNfbWF0cml4NHg0ICopOwogCi1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfc2FtcGxlcik7Ci1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfYWxsb2NhdGlvbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IocnNfcHJvZ3JhbV9mcmFnbWVudCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwogCi1leHRlcm4gdm9pZCB2cExvYWRNb2RlbE1hdHJpeChjb25zdCBmbG9hdCAqKTsKLWV4dGVybiB2b2lkIHZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgZmxvYXQgKik7CitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0dldFdpZHRoKHZvaWQpOworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dHZXRIZWlnaHQodm9pZCk7CiAKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnVXBsb2FkVG9UZXh0dXJlKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dVcGxvYWRUb1RleHR1cmUocnNfYWxsb2NhdGlvbiwgdWludCBtaXBMZXZlbCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1VwbG9hZFRvQnVmZmVyT2JqZWN0KHJzX2FsbG9jYXRpb24pOwogCi0vLyBkcmF3aW5nCi1leHRlcm4gdm9pZCBkcmF3UmVjdChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeik7Ci1leHRlcm4gdm9pZCBkcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KTsKLWV4dGVybiB2b2lkIGRyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCk7Ci1leHRlcm4gdm9pZCBkcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwotZXh0ZXJuIHZvaWQgZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwotZXh0ZXJuIHZvaWQgZHJhd0xpbmUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6Mik7Ci1leHRlcm4gdm9pZCBkcmF3UG9pbnQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSk7Ci1leHRlcm4gdm9pZCBkcmF3U2ltcGxlTWVzaChpbnQgaXNtKTsKLWV4dGVybiB2b2lkIGRyYXdTaW1wbGVNZXNoUmFuZ2UoaW50IGlzbSwgaW50IHN0YXJ0LCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwogCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdNZXNoKHJzX21lc2ggaXNtKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd01lc2gocnNfbWVzaCBpc20sIHVpbnQgcHJpbWl0aXZlSW5kZXgpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3TWVzaChyc19tZXNoIGlzbSwgdWludCBwcmltaXRpdmVJbmRleCwgdWludCBzdGFydCwgdWludCBsZW4pOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0NsZWFyQ29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dDbGVhckRlcHRoKGZsb2F0KTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3VGV4dChjb25zdCBjaGFyICosIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdUZXh0KHJzX2FsbG9jYXRpb24sIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRGb250KHJzX2ZvbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dGb250Q29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworLy8gUmV0dXJucyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSB0ZXh0IHJlbGF0aXZlIHRvICgwLCAwKQorLy8gQW55IG9mIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSBjb3VsZCBiZSBOVUxMCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ01lYXN1cmVUZXh0KGNvbnN0IGNoYXIgKiwgaW50ICpsZWZ0LCBpbnQgKnJpZ2h0LCBpbnQgKnRvcCwgaW50ICpib3R0b20pOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dNZWFzdXJlVGV4dChyc19hbGxvY2F0aW9uLCBpbnQgKmxlZnQsIGludCAqcmlnaHQsIGludCAqdG9wLCBpbnQgKmJvdHRvbSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnTWVzaENvbXB1dGVCb3VuZGluZ0JveChyc19tZXNoIG1lc2gsIGZsb2F0ICptaW5YLCBmbG9hdCAqbWluWSwgZmxvYXQgKm1pblosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbWF4WCwgZmxvYXQgKm1heFksIGZsb2F0ICptYXhaKTsKK3ZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzZ01lc2hDb21wdXRlQm91bmRpbmdCb3gocnNfbWVzaCBtZXNoLCBmbG9hdDMgKmJCb3hNaW4sIGZsb2F0MyAqYkJveE1heCkgeworICAgIGZsb2F0IHgxLCB5MSwgejEsIHgyLCB5MiwgejI7CisgICAgcnNnTWVzaENvbXB1dGVCb3VuZGluZ0JveChtZXNoLCAmeDEsICZ5MSwgJnoxLCAmeDIsICZ5MiwgJnoyKTsKKyAgICBiQm94TWluLT54ID0geDE7CisgICAgYkJveE1pbi0+eSA9IHkxOworICAgIGJCb3hNaW4tPnogPSB6MTsKKyAgICBiQm94TWF4LT54ID0geDI7CisgICAgYkJveE1heC0+eSA9IHkyOworICAgIGJCb3hNYXgtPnogPSB6MjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gbWlzYwotZXh0ZXJuIHZvaWQgcGZDbGVhckNvbG9yKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiB2b2lkIGNvbG9yKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiB2b2lkIGhzYihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBoc2JUb1JnYihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCopOwotZXh0ZXJuIGludCBoc2JUb0FiZ3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwogCi1leHRlcm4gdm9pZCB1cGxvYWRUb1RleHR1cmUoaW50LCBpbnQpOwotZXh0ZXJuIHZvaWQgdXBsb2FkVG9CdWZmZXJPYmplY3QoaW50KTsKKy8vIERlcHJpY2F0ZWQKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgY29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwogCi1leHRlcm4gaW50IGNvbG9yRmxvYXRSR0JBdG9VTm9ybTgoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGludCBjb2xvckZsb2F0UkdCdG81NjUoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0KLWV4dGVybiBpbnQgZ2V0V2lkdGgoKTsKLWV4dGVybiBpbnQgZ2V0SGVpZ2h0KCk7Ci0KLWV4dGVybiBpbnQgc2VuZFRvQ2xpZW50KHZvaWQgKmRhdGEsIGludCBjbWRJRCwgaW50IGxlbiwgaW50IHdhaXRGb3JTcGFjZSk7Ci0KLWV4dGVybiB2b2lkIGRlYnVnRihjb25zdCBjaGFyICosIGZsb2F0KTsKLWV4dGVybiB2b2lkIGRlYnVnSTMyKGNvbnN0IGNoYXIgKiwgaW50KTsKLWV4dGVybiB2b2lkIGRlYnVnSGV4STMyKGNvbnN0IGNoYXIgKiwgaW50KTsKLQotCisjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCmluZGV4IDYxM2M3Y2EuLmQwNTk5OTcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKQEAgLTEsMjg3ICsxLDE5NCBAQAotLy8gRmxvYXQgb3BzCisjaWZuZGVmIF9fUlNfTUFUSF9SU0hfXworI2RlZmluZSBfX1JTX01BVEhfUlNIX18KIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0MTYpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19lbGVtZW50ICpkc3QsIHJzX2VsZW1lbnQgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfdHlwZSAqZHN0LCByc190eXBlIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX2FsbG9jYXRpb24gKmRzdCwgcnNfYWxsb2NhdGlvbiBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19zYW1wbGVyICpkc3QsIHJzX3NhbXBsZXIgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfc2NyaXB0ICpkc3QsIHJzX3NjcmlwdCBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19tZXNoICpkc3QsIHJzX21lc2ggc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCAqZHN0LCByc19wcm9ncmFtX2ZyYWdtZW50IHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4ICpkc3QsIHJzX3Byb2dyYW1fdmVydGV4IHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyICpkc3QsIHJzX3Byb2dyYW1fcmFzdGVyIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fc3RvcmUgKmRzdCwgcnNfcHJvZ3JhbV9zdG9yZSBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19mb250ICpkc3QsIHJzX2ZvbnQgc3JjKTsKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0MTYpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2VsZW1lbnQgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfdHlwZSAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19hbGxvY2F0aW9uICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3NhbXBsZXIgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfc2NyaXB0ICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX21lc2ggKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3ZlcnRleCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3Jhc3RlciAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3N0b3JlICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2ZvbnQgKmRzdCk7CiAKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDgsIGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MTYsIGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MywgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDgsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDE2LCBmbG9hdCwgZmxvYXQpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDEwKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDEwKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MywgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDE2LCBmbG9hdDE2KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDIsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDMsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDgsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQxNiwgZmxvYXQpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMTAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMTAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ4LCBmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQxNiwgZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQyLCBmbG9hdDIsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MywgZmxvYXQzLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDQsIGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ4LCBmbG9hdDgsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDE2LCBmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb3VuZChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb3VuZChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdDE2KTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19lbGVtZW50KTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc190eXBlKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19zYW1wbGVyKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19zY3JpcHQpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX21lc2gpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fZnJhZ21lbnQpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4KTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19wcm9ncmFtX3Jhc3Rlcik7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV9zdG9yZSk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfZm9udCk7CiAKIAogCisvLyBBbGxvY2F0aW9ucworCisvLyBSZXR1cm4gdGhlIHJzX2FsbG9jYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm91bmQgZGF0YQorLy8gcG9pbnRlci4KK2V4dGVybiByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRBbGxvY2F0aW9uKGNvbnN0IHZvaWQgKik7CisKKy8vIE1hcmsgdGhlIGFsbG9jYXRpb24gZGlydHkgYW5kIG5vdGlmeSB0aG9zZSB1c2luZyBpdAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25NYXJrRGlydHkocnNfYWxsb2NhdGlvbik7CisKKy8vIFJldHVybiB0aGUgZGltZW5zaW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGlvbi4KK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbVgocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25HZXREaW1ZKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltWihyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbUxPRChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbUZhY2VzKHJzX2FsbG9jYXRpb24pOworCisvLyBFeHRyYWN0IGEgc2luZ2xlIGVsZW1lbnQgZnJvbSBhbiBhbGxvY2F0aW9uLgorZXh0ZXJuIGNvbnN0IHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24sIHVpbnQzMl90IHgpOworZXh0ZXJuIGNvbnN0IHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24sIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworZXh0ZXJuIGNvbnN0IHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24sIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworCisvLyBSZXR1cm4gYSByYW5kb20gdmFsdWUgYmV0d2VlbiAwIChvciBtaW5fdmFsdWUpIGFuZCBtYXhfbWFsdWUuCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGludCBtYXhfdmFsdWUpOworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUmFuZChpbnQgbWluX3ZhbHVlLCBpbnQgbWF4X3ZhbHVlKTsKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUmFuZChmbG9hdCBtYXhfdmFsdWUpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGZsb2F0IG1pbl92YWx1ZSwgZmxvYXQgbWF4X3ZhbHVlKTsKKworLy8gcmV0dXJuIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgYSBmbG9hdAorLy8gbWluKHYgLSAoKGludClmbG9vcih2KSksIDB4MS5mZmZmZmVwLTFmKTsKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRnJhYyhmbG9hdCk7CisKKy8vIHRpbWUKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZWNvbmQodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWludXRlKHZvaWQpOworZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0hvdXIodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGF5KHZvaWQpOworZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01vbnRoKHZvaWQpOworZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1llYXIodm9pZCk7CisKKy8vIFJldHVybiB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgaW4gbWlsbGlzZWNvbmRzCitleHRlcm4gaW50NjRfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzVXB0aW1lTWlsbGlzKHZvaWQpOworCisvLyBSZXR1cm4gdGhlIGN1cnJlbnQgc3lzdGVtIGNsb2NrIGluIG5hbm9zZWNvbmRzCitleHRlcm4gaW50NjRfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzVXB0aW1lTmFub3Modm9pZCk7CisKKy8vIFJldHVybiB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlIGZ1bmN0aW9uIHdhcyBsYXN0IGNhbGxlZCBpbiB0aGlzIHNjcmlwdC4KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RHQodm9pZCk7CisKKy8vIFNlbmQgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudC4gIFdpbGwgbm90IGJsb2NrIGFuZCByZXR1cm5zIHRydWUKKy8vIGlmIHRoZSBtZXNzYWdlIHdhcyBzZW5kYWJsZSBhbmQgZmFsc2UgaWYgdGhlIGZpZm8gd2FzIGZ1bGwuCisvLyBBIG1lc3NhZ2UgSUQgaXMgcmVxdWlyZWQuICBEYXRhIHBheWxvYWQgaXMgb3B0aW9uYWwuCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50KGludCBjbWRJRCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50KGludCBjbWRJRCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludCBsZW4pOworCisvLyBTZW5kIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSBjbGllbnQsIGJsb2NraW5nIHVudGlsIHRoZSBtZXNzYWdlIGlzIHF1ZXVlZC4KKy8vIEEgbWVzc2FnZSBJRCBpcyByZXF1aXJlZC4gIERhdGEgcGF5bG9hZCBpcyBvcHRpb25hbC4KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhpbnQgY21kSUQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKGludCBjbWRJRCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludCBsZW4pOwogCiAKKy8vIFNjcmlwdCB0byBTY3JpcHQKK2VudW0gcnNfZm9yX2VhY2hfc3RyYXRlZ3kgeworICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1NFUklBTCwKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9ET05UX0NBUkUsCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfRFNUX0xJTkVBUiwKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9USUxFX1NNQUxMLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfTUVESVVNLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfTEFSR0UKK307CiAKLS8vIEludCBvcHMKK3R5cGVkZWYgc3RydWN0IHJzX3NjcmlwdF9jYWxsIHsKKyAgICBlbnVtIHJzX2Zvcl9lYWNoX3N0cmF0ZWd5IHN0cmF0ZWd5OworICAgIHVpbnQzMl90IHhTdGFydDsKKyAgICB1aW50MzJfdCB4RW5kOworICAgIHVpbnQzMl90IHlTdGFydDsKKyAgICB1aW50MzJfdCB5RW5kOworICAgIHVpbnQzMl90IHpTdGFydDsKKyAgICB1aW50MzJfdCB6RW5kOworICAgIHVpbnQzMl90IGFycmF5U3RhcnQ7CisgICAgdWludDMyX3QgYXJyYXlFbmQ7Cit9IHJzX3NjcmlwdF9jYWxsX3Q7CiAKLWV4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludCk7Ci1leHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Mik7Ci1leHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Myk7Ci1leHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50NCk7Ci1leHRlcm4gaW50OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50OCk7Ci1leHRlcm4gaW50MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludDE2KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsCisgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkICogdXNyRGF0YSk7CiAKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsCisgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkICogdXNyRGF0YSwKKyAgICAgICAgICAgICAgY29uc3QgcnNfc2NyaXB0X2NhbGxfdCAqKTsKIAotCi0vKgotZXh0ZXJuIGZsb2F0IG1vZGYoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdCByYW5kZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgcmFuZGYyKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgZnJhY2YoZmxvYXQpOwotZXh0ZXJuIGZsb2F0IGxlcnBmKGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IG1hcGYoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLSovCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKaW5kZXggNDE5OGE3NC4uMjEyZWI4MyAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCkBAIC0xLDcxICsxLDc3IEBACisjaWZuZGVmIF9fUlNfVFlQRVNfUlNIX18KKyNkZWZpbmUgX19SU19UWVBFU19SU0hfXwogCiB0eXBlZGVmIGNoYXIgaW50OF90OwogdHlwZWRlZiBzaG9ydCBpbnQxNl90OwogdHlwZWRlZiBpbnQgaW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIGludDY0X3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIHVpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CiAKIHR5cGVkZWYgdWludDhfdCB1Y2hhcjsKIHR5cGVkZWYgdWludDE2X3QgdXNob3J0OwogdHlwZWRlZiB1aW50MzJfdCB1aW50OwotLy90eXBlZGVmIHVpbnQ2NF90IHVsb25nOwordHlwZWRlZiB1aW50NjRfdCB1bG9uZzsKIAotdHlwZWRlZiBpbnQgcnNfZWxlbWVudDsKLXR5cGVkZWYgaW50IHJzX3R5cGU7Ci10eXBlZGVmIGludCByc19hbGxvY2F0aW9uOwotdHlwZWRlZiBpbnQgcnNfc2FtcGxlcjsKLXR5cGVkZWYgaW50IHJzX3NjcmlwdDsKLXR5cGVkZWYgaW50IHJzX21lc2g7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX2ZyYWdtZW50OwotdHlwZWRlZiBpbnQgcnNfcHJvZ3JhbV92ZXJ0ZXg7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX3Jhc3RlcjsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fc3RvcmU7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19lbGVtZW50OwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfdHlwZTsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2FsbG9jYXRpb247Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19zYW1wbGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfc2NyaXB0OwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfbWVzaDsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fZnJhZ21lbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19wcm9ncmFtX3ZlcnRleDsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fcmFzdGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9zdG9yZTsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2ZvbnQ7CisKIAogdHlwZWRlZiBmbG9hdCBmbG9hdDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGZsb2F0IGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgZmxvYXQgZmxvYXQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBmbG9hdCBmbG9hdDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGZsb2F0IGZsb2F0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHVjaGFyIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdWNoYXIgdWNoYXIzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1Y2hhciB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHVjaGFyIHVjaGFyOCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdWNoYXIgdWNoYXIxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdXNob3J0IHVzaG9ydDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHVzaG9ydCB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1c2hvcnQgdXNob3J0NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdXNob3J0IHVzaG9ydDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHVzaG9ydCB1c2hvcnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdWludCB1aW50MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdWludCB1aW50MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgdWludCB1aW50NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdWludCB1aW50OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdWludCB1aW50MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIGNoYXIgY2hhcjIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGNoYXIgY2hhcjMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIGNoYXIgY2hhcjQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGNoYXIgY2hhcjggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGNoYXIgY2hhcjE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiBzaG9ydCBzaG9ydDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHNob3J0IHNob3J0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgc2hvcnQgc2hvcnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBzaG9ydCBzaG9ydDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHNob3J0IHNob3J0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIGludCBpbnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBpbnQgaW50MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgaW50IGludDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGludCBpbnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBpbnQgaW50MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzE2XTsKK30gcnNfbWF0cml4NHg0OwogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVs5XTsKK30gcnNfbWF0cml4M3gzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVs0XTsKK30gcnNfbWF0cml4MngyOworCit0eXBlZGVmIGZsb2F0NCByc19xdWF0ZXJuaW9uOworCisjZGVmaW5lIFJTX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcAppbmRleCA0YmM1ZDllLi44ZjU4M2YwNiAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU2hhcmVkQnVmZmVyU3RhY2suY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcApAQCAtMzgwLDExICszODAsNiBAQAogewogICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwogCi0gICAgaWYgKHN0YWNrLmhlYWQgPT0gdGFpbCAmJiBzdGFjay5hdmFpbGFibGUgPT0gbU51bUJ1ZmZlcnMpIHsKLSAgICAgICAgTE9HVygiZGVxdWV1ZTogdGFpbD0lZCwgaGVhZD0lZCwgYXZhaWw9JWQsIHF1ZXVlZD0lZCIsCi0gICAgICAgICAgICAgICAgdGFpbCwgc3RhY2suaGVhZCwgc3RhY2suYXZhaWxhYmxlLCBzdGFjay5xdWV1ZWQpOwotICAgIH0KLQogICAgIFJXTG9jazo6QXV0b1JMb2NrIF9yZChtTG9jayk7CiAKICAgICBjb25zdCBuc2Vjc190IGRlcXVldWVUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU3VyZmFjZS5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcAppbmRleCBkNDRhYWI5Li4wOTk0OTgwIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcApAQCAtMzY0LDYgKzM2NCwxMyBAQAogICAgICAgICBoZWlnaHQgICA9IHN1cmZhY2UtPm1IZWlnaHQ7CiAgICAgICAgIGZvcm1hdCAgID0gc3VyZmFjZS0+bUZvcm1hdDsKICAgICAgICAgZmxhZ3MgICAgPSBzdXJmYWNlLT5tRmxhZ3M7CisgICAgfSBlbHNlIGlmIChzdXJmYWNlICE9IDAgJiYgc3VyZmFjZS0+bVN1cmZhY2UgIT0gMCkgeworICAgICAgICBMT0dXKCJQYXJjZWxpbmcgaW52YWxpZCBzdXJmYWNlIHdpdGggbm9uLU5VTEwgSVN1cmZhY2UgYXMgTlVMTDogIgorICAgICAgICAgICAgICJtU3VyZmFjZSA9ICVwLCBtSWRlbnRpdHkgPSAlZCwgbVdpZHRoID0gJWQsIG1IZWlnaHQgPSAlZCwgIgorICAgICAgICAgICAgICJtRm9ybWF0ID0gJWQsIG1GbGFncyA9IDB4JTA4eCwgbUluaXRDaGVjayA9ICVkIiwKKyAgICAgICAgICAgICBzdXJmYWNlLT5tU3VyZmFjZS5nZXQoKSwgc3VyZmFjZS0+bUlkZW50aXR5LCBzdXJmYWNlLT5tV2lkdGgsCisgICAgICAgICAgICAgc3VyZmFjZS0+bUhlaWdodCwgc3VyZmFjZS0+bUZvcm1hdCwgc3VyZmFjZS0+bUZsYWdzLAorICAgICAgICAgICAgIHN1cmZhY2UtPm1Jbml0Q2hlY2spOwogICAgIH0KICAgICBwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKHN1ciE9MCA/IHN1ci0+YXNCaW5kZXIoKSA6IE5VTEwpOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihpZGVudGl0eSk7CkBAIC00MzgsMjEgKzQ0NSwxNSBAQAogICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlckNsaWVudCA9IG5ldyBTaGFyZWRCdWZmZXJDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQuZ2V0U2hhcmVkQ2xpZW50KCksIHRva2VuLCAyLCBtSWRlbnRpdHkpOwogICAgICAgICAgICAgbUluaXRDaGVjayA9IG1DbGllbnQuZ2V0U2hhcmVkQ2xpZW50KCktPnZhbGlkYXRlKHRva2VuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1coIk5vdCBpbml0aWFsaXppbmcgdGhlIHNoYXJlZCBidWZmZXIgY2xpZW50IGJlY2F1c2UgdG9rZW4gPSAlZCIsCisgICAgICAgICAgICAgICAgICAgIHRva2VuKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogU3VyZmFjZTo6flN1cmZhY2UoKQogewotICAgIC8vIHRoaXMgaXMgYSBjbGllbnQtc2lkZSBvcGVyYXRpb24sIHRoZSBzdXJmYWNlIGlzIGRlc3Ryb3llZCwgdW5tYXAKLSAgICAvLyBpdHMgYnVmZmVycyBpbiB0aGlzIHByb2Nlc3MuCi0gICAgc2l6ZV90IHNpemUgPSBtQnVmZmVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxzaXplIDsgaSsrKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyc1tpXSAhPSAwICYmIG1CdWZmZXJzW2ldLT5oYW5kbGUgIT0gMCkgewotICAgICAgICAgICAgZ2V0QnVmZmVyTWFwcGVyKCkudW5yZWdpc3RlckJ1ZmZlcihtQnVmZmVyc1tpXS0+aGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIGNsZWFyIGFsbCByZWZlcmVuY2VzIGFuZCB0cmlnZ2VyIGFuIElQQyBub3csIHRvIG1ha2Ugc3VyZSB0aGluZ3MKICAgICAvLyBoYXBwZW4gd2l0aG91dCBkZWxheSwgc2luY2UgdGhlc2UgcmVzb3VyY2VzIGFyZSBxdWl0ZSBoZWF2eS4KICAgICBtQnVmZmVycy5jbGVhcigpOwpAQCAtMTAxMSw3ICsxMDEyLDIwIEBACiAKIGludCBTdXJmYWNlOjpnZXRCdWZmZXJJbmRleChjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSBjb25zdAogewotICAgIHJldHVybiBidWZmZXItPmdldEluZGV4KCk7CisgICAgaW50IGlkeCA9IGJ1ZmZlci0+Z2V0SW5kZXgoKTsKKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICAvLyBUaGUgYnVmZmVyIGRvZXNuJ3QgaGF2ZSBhbiBpbmRleCBzZXQuICBTZWUgaWYgdGhlIGhhbmRsZSB0aGUgc2FtZSBhcworICAgICAgICAvLyBvbmUgb2YgdGhlIGJ1ZmZlcnMgZm9yIHdoaWNoIHdlIGRvIGtub3cgdGhlIGluZGV4LiAgVGhpcyBjYW4gaGFwcGVuCisgICAgICAgIC8vIGUuZy4gaWYgR3JhcGhpY0J1ZmZlciBpcyB1c2VkIHRvIHdyYXAgYW4gYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgdGhhdAorICAgICAgICAvLyB3YXMgZGVxdWV1ZWQgZnJvbSBhbiBBTmF0aXZlV2luZG93LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5oYW5kbGUgPT0gbUJ1ZmZlcnNbaV0tPmhhbmRsZSkgeworICAgICAgICAgICAgICAgIGlkeCA9IG1CdWZmZXJzW2ldLT5nZXRJbmRleCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpZHg7CiB9CiAKIHN0YXR1c190IFN1cmZhY2U6OmdldEJ1ZmZlckxvY2tlZChpbnQgaW5kZXgsCkBAIC0xMDI1LDcgKzEwMzksNiBAQAogICAgIC8vIGZyZWUgdGhlIGN1cnJlbnQgYnVmZmVyCiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4mIGN1cnJlbnRCdWZmZXIobUJ1ZmZlcnMuZWRpdEl0ZW1BdChpbmRleCkpOwogICAgIGlmIChjdXJyZW50QnVmZmVyICE9IDApIHsKLSAgICAgICAgZ2V0QnVmZmVyTWFwcGVyKCkudW5yZWdpc3RlckJ1ZmZlcihjdXJyZW50QnVmZmVyLT5oYW5kbGUpOwogICAgICAgICBjdXJyZW50QnVmZmVyLmNsZWFyKCk7CiAgICAgfQogCkBAIC0xMDMzLDcgKzEwNDYsNyBAQAogICAgIExPR0VfSUYoYnVmZmVyPT0wLAogICAgICAgICAgICAgIklTdXJmYWNlOjpnZXRCdWZmZXIoJWQsICUwOHgpIHJldHVybmVkIE5VTEwiLAogICAgICAgICAgICAgaW5kZXgsIHVzYWdlKTsKLSAgICBpZiAoYnVmZmVyICE9IDApIHsgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJ5IGNvbnN0cnVjdGlvbgorICAgIGlmIChidWZmZXIgIT0gMCkgeyAvLyB0aGlzIHNob3VsZCBhbHdheXMgaGFwcGVuIGJ5IGNvbnN0cnVjdGlvbgogICAgICAgICBMT0dFX0lGKGJ1ZmZlci0+aGFuZGxlID09IE5VTEwsIAogICAgICAgICAgICAgICAgICJTdXJmYWNlIChpZGVudGl0eT0lZCkgcmVxdWVzdEJ1ZmZlciglZCwgJXUsICV1LCAldSwgJTA4eCkgIgogICAgICAgICAgICAgICAgICJyZXR1cm5lZCBhIGJ1ZmZlciB3aXRoIGEgbnVsbCBoYW5kbGUiLApAQCAtMTA0MSwxMyArMTA1NCw4IEBACiAgICAgICAgIGVyciA9IG1TaGFyZWRCdWZmZXJDbGllbnQtPmdldFN0YXR1cygpOwogICAgICAgICBMT0dFX0lGKGVyciwgICJTdXJmYWNlIChpZGVudGl0eT0lZCkgc3RhdGUgPSAlZCIsIG1JZGVudGl0eSwgZXJyKTsKICAgICAgICAgaWYgKCFlcnIgJiYgYnVmZmVyLT5oYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgZXJyID0gZ2V0QnVmZmVyTWFwcGVyKCkucmVnaXN0ZXJCdWZmZXIoYnVmZmVyLT5oYW5kbGUpOwotICAgICAgICAgICAgTE9HV19JRihlcnIsICJyZWdpc3RlckJ1ZmZlciguLi4pIGZhaWxlZCAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBjdXJyZW50QnVmZmVyLT5zZXRJbmRleChpbmRleCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50QnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgY3VycmVudEJ1ZmZlci0+c2V0SW5kZXgoaW5kZXgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXJyID0gZXJyPDAgPyBlcnIgOiBzdGF0dXNfdChOT19NRU1PUlkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJzL3VpL0dyYXBoaWNCdWZmZXIuY3BwIGIvbGlicy91aS9HcmFwaGljQnVmZmVyLmNwcAppbmRleCA1MTljMjc3Li40MzZlMDY0IDEwMDY0NAotLS0gYS9saWJzL3VpL0dyYXBoaWNCdWZmZXIuY3BwCisrKyBiL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHAKQEAgLTc3LDYgKzc3LDE5IEBACiAgICAgaGFuZGxlID0gaW5IYW5kbGU7CiB9CiAKK0dyYXBoaWNCdWZmZXI6OkdyYXBoaWNCdWZmZXIoYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZmZlciwgYm9vbCBrZWVwT3duZXJzaGlwKQorICAgIDogQkFTRSgpLCBtT3duZXIoa2VlcE93bmVyc2hpcCA/IG93bkhhbmRsZSA6IG93bk5vbmUpLAorICAgICAgbUJ1ZmZlck1hcHBlcihHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKSksCisgICAgICBtSW5pdENoZWNrKE5PX0VSUk9SKSwgbUluZGV4KC0xKSwgbVdyYXBwZWRCdWZmZXIoYnVmZmVyKQoreworICAgIHdpZHRoICA9IGJ1ZmZlci0+d2lkdGg7CisgICAgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgICAgc3RyaWRlID0gYnVmZmVyLT5zdHJpZGU7CisgICAgZm9ybWF0ID0gYnVmZmVyLT5mb3JtYXQ7CisgICAgdXNhZ2UgID0gYnVmZmVyLT51c2FnZTsKKyAgICBoYW5kbGUgPSBidWZmZXItPmhhbmRsZTsKK30KKwogR3JhcGhpY0J1ZmZlcjo6fkdyYXBoaWNCdWZmZXIoKQogewogICAgIGlmIChoYW5kbGUpIHsKQEAgLTg3LDEyICsxMDAsMTQgQEAKIHZvaWQgR3JhcGhpY0J1ZmZlcjo6ZnJlZV9oYW5kbGUoKQogewogICAgIGlmIChtT3duZXIgPT0gb3duSGFuZGxlKSB7CisgICAgICAgIG1CdWZmZXJNYXBwZXIudW5yZWdpc3RlckJ1ZmZlcihoYW5kbGUpOwogICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CiAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZSo+KGhhbmRsZSkpOwogICAgIH0gZWxzZSBpZiAobU93bmVyID09IG93bkRhdGEpIHsKICAgICAgICAgR3JhcGhpY0J1ZmZlckFsbG9jYXRvciYgYWxsb2NhdG9yKEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmdldCgpKTsKICAgICAgICAgYWxsb2NhdG9yLmZyZWUoaGFuZGxlKTsKICAgICB9CisgICAgbVdyYXBwZWRCdWZmZXIgPSAwOwogfQogCiBzdGF0dXNfdCBHcmFwaGljQnVmZmVyOjppbml0Q2hlY2soKSBjb25zdCB7CkBAIC0yNTMsNiArMjY4LDExIEBACiAgICAgfQogCiAgICAgbU93bmVyID0gb3duSGFuZGxlOworCisgICAgaWYgKGhhbmRsZSAhPSAwKSB7CisgICAgICAgIG1CdWZmZXJNYXBwZXIucmVnaXN0ZXJCdWZmZXIoaGFuZGxlKTsKKyAgICB9CisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvdWkvSW5wdXREaXNwYXRjaGVyLmNwcCBiL2xpYnMvdWkvSW5wdXREaXNwYXRjaGVyLmNwcAppbmRleCBmZTg1NTVkLi43NWIyMjk0IDEwMDY0NAotLS0gYS9saWJzL3VpL0lucHV0RGlzcGF0Y2hlci5jcHAKKysrIGIvbGlicy91aS9JbnB1dERpc3BhdGNoZXIuY3BwCkBAIC0yNDc5LDYgKzI0NzksNzAgQEAKICAgICB9CiB9CiAKK2Jvb2wgSW5wdXREaXNwYXRjaGVyOjp0cmFuc2ZlclRvdWNoRm9jdXMoY29uc3Qgc3A8SW5wdXRDaGFubmVsPiYgZnJvbUNoYW5uZWwsCisgICAgICAgIGNvbnN0IHNwPElucHV0Q2hhbm5lbD4mIHRvQ2hhbm5lbCkgeworI2lmIERFQlVHX0ZPQ1VTCisgICAgTE9HRCgidHJhbnNmZXJUb3VjaEZvY3VzOiBmcm9tQ2hhbm5lbD0lcywgdG9DaGFubmVsPSVzIiwKKyAgICAgICAgICAgIGZyb21DaGFubmVsLT5nZXROYW1lKCkuc3RyaW5nKCksIHRvQ2hhbm5lbC0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyNlbmRpZgorICAgIHsgLy8gYWNxdWlyZSBsb2NrCisgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisKKyAgICAgICAgY29uc3QgSW5wdXRXaW5kb3cqIGZyb21XaW5kb3cgPSBnZXRXaW5kb3dMb2NrZWQoZnJvbUNoYW5uZWwpOworICAgICAgICBjb25zdCBJbnB1dFdpbmRvdyogdG9XaW5kb3cgPSBnZXRXaW5kb3dMb2NrZWQodG9DaGFubmVsKTsKKyAgICAgICAgaWYgKCEgZnJvbVdpbmRvdyB8fCAhIHRvV2luZG93KSB7CisjaWYgREVCVUdfRk9DVVMKKyAgICAgICAgICAgIExPR0QoIkNhbm5vdCB0cmFuc2ZlciBmb2N1cyBiZWNhdXNlIGZyb20gb3IgdG8gd2luZG93IG5vdCBmb3VuZC4iKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChmcm9tV2luZG93ID09IHRvV2luZG93KSB7CisjaWYgREVCVUdfRk9DVVMKKyAgICAgICAgICAgIExPR0QoIlRyaXZpYWwgdHJhbnNmZXIgdG8gc2FtZSB3aW5kb3cuIik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ub3VjaFN0YXRlLndpbmRvd3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFRvdWNoZWRXaW5kb3cmIHRvdWNoZWRXaW5kb3cgPSBtVG91Y2hTdGF0ZS53aW5kb3dzW2ldOworICAgICAgICAgICAgaWYgKHRvdWNoZWRXaW5kb3cud2luZG93ID09IGZyb21XaW5kb3cpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG9sZFRhcmdldEZsYWdzID0gdG91Y2hlZFdpbmRvdy50YXJnZXRGbGFnczsKKyAgICAgICAgICAgICAgICBCaXRTZXQzMiBwb2ludGVySWRzID0gdG91Y2hlZFdpbmRvdy5wb2ludGVySWRzOworCisgICAgICAgICAgICAgICAgbVRvdWNoU3RhdGUud2luZG93cy5yZW1vdmVBdChpKTsKKworICAgICAgICAgICAgICAgIGludDMyX3QgbmV3VGFyZ2V0RmxhZ3MgPSAwOworICAgICAgICAgICAgICAgIGlmIChvbGRUYXJnZXRGbGFncyAmIElucHV0VGFyZ2V0OjpGTEFHX0ZPUkVHUk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3VGFyZ2V0RmxhZ3MgfD0gSW5wdXRUYXJnZXQ6OkZMQUdfRk9SRUdST1VORDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvV2luZG93LT5sYXlvdXRQYXJhbXNGbGFncyAmIElucHV0V2luZG93OjpGTEFHX1NQTElUX1RPVUNIKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYXJnZXRGbGFncyB8PSBJbnB1dFRhcmdldDo6RkxBR19TUExJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVG91Y2hTdGF0ZS5hZGRPclVwZGF0ZVdpbmRvdyh0b1dpbmRvdywgbmV3VGFyZ2V0RmxhZ3MsIHBvaW50ZXJJZHMpOworCisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCEgZm91bmQpIHsKKyNpZiBERUJVR19GT0NVUworICAgICAgICAgICAgTE9HRCgiRm9jdXMgdHJhbnNmZXIgZmFpbGVkIGJlY2F1c2UgZnJvbSB3aW5kb3cgZGlkIG5vdCBoYXZlIGZvY3VzLiIpOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworI2lmIERFQlVHX0ZPQ1VTCisgICAgICAgIGxvZ0Rpc3BhdGNoU3RhdGVMb2NrZWQoKTsKKyNlbmRpZgorICAgIH0gLy8gcmVsZWFzZSBsb2NrCisKKyAgICAvLyBXYWtlIHVwIHBvbGwgbG9vcCBzaW5jZSBpdCBtYXkgbmVlZCB0byBtYWtlIG5ldyBpbnB1dCBkaXNwYXRjaGluZyBjaG9pY2VzLgorICAgIG1Mb29wZXItPndha2UoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBJbnB1dERpc3BhdGNoZXI6OmxvZ0Rpc3BhdGNoU3RhdGVMb2NrZWQoKSB7CiAgICAgU3RyaW5nOCBkdW1wOwogICAgIGR1bXBEaXNwYXRjaFN0YXRlTG9ja2VkKGR1bXApOwpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcCBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKaW5kZXggODM0NWNjMy4uOTFlN2RmMyAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAorKysgYi9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCkBAIC0zMTcsNiArMzE3LDEyIEBACiAgICAgICAgICAgICBtU3RyaW5nUG9vbFNpemUgPQogICAgICAgICAgICAgICAgIChtSGVhZGVyLT5oZWFkZXIuc2l6ZS1tSGVhZGVyLT5zdHJpbmdzU3RhcnQpL2NoYXJTaXplOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY2hlY2sgaW52YXJpYW50OiBzdHlsZXMgc3RhcnRzIGJlZm9yZSBlbmQgb2YgZGF0YQorICAgICAgICAgICAgaWYgKG1IZWFkZXItPnN0eWxlc1N0YXJ0ID49IChtSGVhZGVyLT5oZWFkZXIuc2l6ZS1zaXplb2YodWludDE2X3QpKSkgeworICAgICAgICAgICAgICAgIExPR1coIkJhZCBzdHlsZSBibG9jazogc3R5bGUgYmxvY2sgc3RhcnRzIGF0ICVkIHBhc3QgZGF0YSBzaXplIG9mICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAoaW50KW1IZWFkZXItPnN0eWxlc1N0YXJ0LCAoaW50KW1IZWFkZXItPmhlYWRlci5zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG1FcnJvcj1CQURfVFlQRSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaGVjayBpbnZhcmlhbnQ6IHN0eWxlcyBmb2xsb3cgdGhlIHN0cmluZ3MKICAgICAgICAgICAgIGlmIChtSGVhZGVyLT5zdHlsZXNTdGFydCA8PSBtSGVhZGVyLT5zdHJpbmdzU3RhcnQpIHsKICAgICAgICAgICAgICAgICBMT0dXKCJCYWQgc3R5bGUgYmxvY2s6IHN0eWxlIGJsb2NrIHN0YXJ0cyBhdCAlZCwgYmVmb3JlIHN0cmluZ3MgYXQgJWRcbiIsCkBAIC0xODc4LDYgKzE4ODQsMTIgQEAKICAgICAgICAgb3V0TmFtZS0+dHlwZSA9IGdycC0+YmFzZVBhY2thZ2UtPnR5cGVTdHJpbmdzLnN0cmluZ0F0KHQsICZvdXROYW1lLT50eXBlTGVuKTsKICAgICAgICAgb3V0TmFtZS0+bmFtZSA9IGdycC0+YmFzZVBhY2thZ2UtPmtleVN0cmluZ3Muc3RyaW5nQXQoCiAgICAgICAgICAgICBkdG9obChlbnRyeS0+a2V5LmluZGV4KSwgJm91dE5hbWUtPm5hbWVMZW4pOworCisgICAgICAgIC8vIElmIHdlIGhhdmUgYSBiYWQgaW5kZXggZm9yIHNvbWUgcmVhc29uLCB3ZSBzaG91bGQgYWJvcnQuCisgICAgICAgIGlmIChvdXROYW1lLT50eXBlID09IE5VTEwgfHwgb3V0TmFtZS0+bmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTI2MDksNiArMjYyMSwyNCBAQAogICAgICAgICAqb3V0VHlwZSA9ICpkZWZUeXBlOwogICAgIH0KICAgICAqb3V0TmFtZSA9IFN0cmluZzE2KHAsIGVuZC1wKTsKKyAgICBpZigqKm91dFBhY2thZ2UgPT0gMCkgeworICAgICAgICBpZihvdXRFcnJvck1zZykgeworICAgICAgICAgICAgKm91dEVycm9yTXNnID0gIlJlc291cmNlIHBhY2thZ2UgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZigqKm91dFR5cGUgPT0gMCkgeworICAgICAgICBpZihvdXRFcnJvck1zZykgeworICAgICAgICAgICAgKm91dEVycm9yTXNnID0gIlJlc291cmNlIHR5cGUgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZigqKm91dE5hbWUgPT0gMCkgeworICAgICAgICBpZihvdXRFcnJvck1zZykgeworICAgICAgICAgICAgKm91dEVycm9yTXNnID0gIlJlc291cmNlIGlkIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmciOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTQxMjcsMTMgKzQxNTcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4MDBmZjAwMDAgJiAoKHR5cGVJbmRleCsxKTw8MTYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMDAwZmZmZiAmIChlbnRyeUluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9uYW1lIHJlc05hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5nZXRSZXNvdXJjZU5hbWUocmVzSUQsICZyZXNOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgc3BlYyByZXNvdXJjZSAweCUwOHggJXM6JXMvJXM6IGZsYWdzPTB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUubmFtZSwgcmVzTmFtZS5uYW1lTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obCh0eXBlQ29uZmlncy0+dHlwZVNwZWNGbGFnc1tlbnRyeUluZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBzcGVjIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogZmxhZ3M9MHglMDh4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5wYWNrYWdlLCByZXNOYW1lLnBhY2thZ2VMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUubmFtZSwgcmVzTmFtZS5uYW1lTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRvaGwodHlwZUNvbmZpZ3MtPnR5cGVTcGVjRmxhZ3NbZW50cnlJbmRleF0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBJTlZBTElEIFRZUEUgQ09ORklHIEZPUiBSRVNPVVJDRSAweCUwOHhcbiIsIHJlc0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBjb25maWdJbmRleD0wOyBjb25maWdJbmRleDxOVEM7IGNvbmZpZ0luZGV4KyspIHsKQEAgLTQzNDAsMTEgKzQzNzMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4MDBmZjAwMDAgJiAoKHR5cGVJbmRleCsxKTw8MTYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMDAwZmZmZiAmIChlbnRyeUluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9uYW1lIHJlc05hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5nZXRSZXNvdXJjZU5hbWUocmVzSUQsICZyZXNOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICByZXNvdXJjZSAweCUwOHggJXM6JXMvJXM6ICIsIHJlc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLT5nZXRSZXNvdXJjZU5hbWUocmVzSUQsICZyZXNOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICByZXNvdXJjZSAweCUwOHggJXM6JXMvJXM6ICIsIHJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5wYWNrYWdlLCByZXNOYW1lLnBhY2thZ2VMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIElOVkFMSUQgUkVTT1VSQ0UgMHglMDh4OiAiLCByZXNJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXNPZmZzZXQmMHgzKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJOT04tSU5URUdFUiBPRkZTRVQ6ICVwXG4iLCAodm9pZCopdGhpc09mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC00NDAyLDE4ICs0NDM4LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3ZhbHVlKHBrZywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFnUHRyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IE4gPSBkdG9obChiYWdQdHItPmNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzVGFibGVfbWFwKiBtYXBQdHIgPSAoY29uc3QgUmVzVGFibGVfbWFwKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChjb25zdCB1aW50OF90KillbnQpICsgZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBiYXNlTWFwUHRyID0gKGNvbnN0IHVpbnQ4X3QqKWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1hcE9mZnNldCA9IGVzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNUYWJsZV9tYXAqIG1hcFB0ciA9IChSZXNUYWJsZV9tYXAqKShiYXNlTWFwUHRyK21hcE9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICAgIFBhcmVudD0weCUwOHgsIENvdW50PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRvaGwoYmFnUHRyLT5wYXJlbnQuaWRlbnQpLCBOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TiAmJiBtYXBPZmZzZXQgPCAodHlwZVNpemUtc2l6ZW9mKFJlc1RhYmxlX21hcCkpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICAgICMlaSAoS2V5PTB4JTA4eCk6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZHRvaGwobWFwUHRyLT5uYW1lLmlkZW50KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5jb3B5RnJvbV9kdG9oKG1hcFB0ci0+dmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdmFsdWUocGtnLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGR0b2hzKG1hcFB0ci0+dmFsdWUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQdHIgPSAoUmVzVGFibGVfbWFwKikoKChjb25zdCB1aW50OF90KiltYXBQdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZSArIHNpemVvZigqbWFwUHRyKS1zaXplb2YobWFwUHRyLT52YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT2Zmc2V0ICs9IHNpemUgKyBzaXplb2YoKm1hcFB0ciktc2l6ZW9mKG1hcFB0ci0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwUHRyID0gKFJlc1RhYmxlX21hcCopKGJhc2VNYXBQdHIrbWFwT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4M2Q2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK3BhcmNlbGFibGUgQ291bnRyeTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYzA1NDAzCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3Mgd3JhcHMgdGhlIGNvdW50cnkgaW5mb3JtYXRpb24uCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIENvdW50cnkgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbSB0aGUgbW9iaWxlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9ORVRXT1JLID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBsb2NhdGlvbiBzZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04gPSAxOworCisgICAgLyoqCisgICAgICogVGhlIGNvdW50cnkgY29kZSB3YXMgcmVhZCBmcm9tIHRoZSBTSU0gY2FyZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPVU5UUllfU09VUkNFX1NJTSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbSB0aGUgc3lzdGVtIGxvY2FsZSBzZXR0aW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9TT1VSQ0VfTE9DQUxFID0gMzsKKworICAgIC8qKgorICAgICAqIFRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ291bnRyeUlzbzsKKworICAgIC8qKgorICAgICAqIFdoZXJlIHRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1Tb3VyY2U7CisKKyAgICBwcml2YXRlIGludCBtSGFzaENvZGU7CisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gY291bnRyeUlzbyB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUuCisgICAgICogQHBhcmFtIHNvdXJjZSB3aGVyZSB0aGUgY291bnRyeUlzbyBjYW1lIGZyb20sIGNvdWxkIGJlIG9uZSBvZiBiZWxvdworICAgICAqICAgICAgICB2YWx1ZXMKKyAgICAgKiAgICAgICAgPHA+CisgICAgICogICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTkVUV09SS308L2xpPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBVElPTn08L2xpPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9TSU19PC9saT4KKyAgICAgKiAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTE9DQUxFfTwvbGk+CisgICAgICogICAgICAgIDwvdWw+CisgICAgICovCisgICAgcHVibGljIENvdW50cnkoZmluYWwgU3RyaW5nIGNvdW50cnlJc28sIGZpbmFsIGludCBzb3VyY2UpIHsKKyAgICAgICAgaWYgKGNvdW50cnlJc28gPT0gbnVsbCB8fCBzb3VyY2UgPCBDT1VOVFJZX1NPVVJDRV9ORVRXT1JLCisgICAgICAgICAgICAgICAgfHwgc291cmNlID4gQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvdW50cnlJc28gPSBjb3VudHJ5SXNvLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIENvdW50cnkoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgIG1Db3VudHJ5SXNvID0gY291bnRyeS5tQ291bnRyeUlzbzsKKyAgICAgICAgbVNvdXJjZSA9IGNvdW50cnkubVNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q291bnRyeUlzbygpIHsKKyAgICAgICAgcmV0dXJuIG1Db3VudHJ5SXNvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gd2hlcmUgdGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20sIGNvdWxkIGJlIG9uZSBvZiBiZWxvdyB2YWx1ZXMKKyAgICAgKiAgICAgICAgIDxwPgorICAgICAqICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTkVUV09SS308L2xpPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT059PC9saT4KKyAgICAgKiAgICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX1NJTX08L2xpPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTE9DQUxFfTwvbGk+CisgICAgICogICAgICAgICA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U291cmNlKCkgeworICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxDb3VudHJ5PiBDUkVBVE9SID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxDb3VudHJ5PigpIHsKKyAgICAgICAgcHVibGljIENvdW50cnkgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeShpbi5yZWFkU3RyaW5nKCksIGluLnJlYWRJbnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ291bnRyeVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnlbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBwYXJjZWwsIGludCBmbGFncykgeworICAgICAgICBwYXJjZWwud3JpdGVTdHJpbmcobUNvdW50cnlJc28pOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobVNvdXJjZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ291bnRyeSkgeworICAgICAgICAgICAgQ291bnRyeSBjID0gKENvdW50cnkpIG9iamVjdDsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeUlzby5lcXVhbHMoYy5nZXRDb3VudHJ5SXNvKCkpICYmIG1Tb3VyY2UgPT0gYy5nZXRTb3VyY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSBtSGFzaENvZGU7CisgICAgICAgIGlmIChoYXNoID09IDApIHsKKyAgICAgICAgICAgIGhhc2ggPSAxNzsKKyAgICAgICAgICAgIGhhc2ggPSBoYXNoICogMTMgKyBtQ291bnRyeUlzby5oYXNoQ29kZSgpOworICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiAxMyArIG1Tb3VyY2U7CisgICAgICAgICAgICBtSGFzaENvZGUgPSBoYXNoOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSGFzaENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0aGUgc3BlY2lmaWVkIGNvdW50cnkgdG8gdGhpcyBjb3VudHJ5IG9iamVjdCBpZ25vcmluZyB0aGUgbVNvdXJjZQorICAgICAqIGZpZWxkLCByZXR1cm4gdHJ1ZSBpZiB0aGUgY291bnRyeUlzbyBmaWVsZHMgYXJlIGVxdWFsCisgICAgICoKKyAgICAgKiBAcGFyYW0gY291bnRyeSB0aGUgY291bnRyeSB0byBjb21wYXJlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY291bnRyeSdzIGNvdW50cnlJc28gZmllbGQgaXMgZXF1YWwgdG8gdGhpcworICAgICAqICAgICAgICAgY291bnRyeSdzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzSWdub3JlU291cmNlKENvdW50cnkgY291bnRyeSkgeworICAgICAgICByZXR1cm4gY291bnRyeSAhPSBudWxsICYmIG1Db3VudHJ5SXNvLmVxdWFscyhjb3VudHJ5LmdldENvdW50cnlJc28oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlEZXRlY3Rvci5qYXZhIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlEZXRlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzgwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc3lzdGVtIGNvdW50cnkgZGV0ZWN0b3Igc2VydmljZS4gVGhpcworICogc2VydmljZSBhbGxvd3MgYXBwbGljYXRpb25zIHRvIG9idGFpbiB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluLgorICogPHA+CisgKiBUaGUgY291bnRyeSB3aWxsIGJlIGRldGVjdGVkIGluIG9yZGVyIG9mIHJlbGlhYmlsaXR5LCBsaWtlCisgKiA8dWw+CisgKiA8bGk+TW9iaWxlIG5ldHdvcms8L2xpPgorICogPGxpPkxvY2F0aW9uPC9saT4KKyAqIDxsaT5TSU0ncyBjb3VudHJ5PC9saT4KKyAqIDxsaT5QaG9uZSdzIGxvY2FsZTwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBDYWxsIHRoZSB7QGxpbmsgI2RldGVjdENvdW50cnkoKX0gdG8gZ2V0IHRoZSBhdmFpbGFibGUgY291bnRyeSBpbW1lZGlhdGVseS4KKyAqIDxwPgorICogVG8gYmUgbm90aWZpZWQgb2YgdGhlIGZ1dHVyZSBjb3VudHJ5IGNoYW5nZSwgdXNlIHRoZQorICoge0BsaW5rICNhZGRDb3VudHJ5TGlzdGVuZXJ9CisgKiA8cD4KKyAqIDxwPgorICogWW91IGRvIG5vdCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5OyBpbnN0ZWFkLCByZXRyaWV2ZSBpdCB0aHJvdWdoCisgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZQorICogQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09VTlRSWV9ERVRFQ1RPUil9LgorICogPHA+CisgKiBCb3RoIEFDQ0VTU19GSU5FX0xPQ0FUSU9OIGFuZCBBQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OIHBlcm1pc3Npb25zIGFyZSBuZWVkZWQuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIENvdW50cnlEZXRlY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgdG8gd3JhcCB0aGUgSUNvdW50cnlMaXN0ZW5lci5TdHViIGFuZCBDb3VudHJ5TGlzdGVuZXIgb2JqZWN0cworICAgICAqIHRvZ2V0aGVyLiBUaGUgQ291bnRyeUxpc3RlbmVyIHdpbGwgYmUgbm90aWZpZWQgdGhyb3VnaCB0aGUgc3BlY2lmaWMKKyAgICAgKiBsb29wZXIgb25jZSB0aGUgY291bnRyeSBjaGFuZ2VkIGFuZCBkZXRlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBMaXN0ZW5lclRyYW5zcG9ydCBleHRlbmRzIElDb3VudHJ5TGlzdGVuZXIuU3R1YiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb3VudHJ5TGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKworICAgICAgICBwdWJsaWMgTGlzdGVuZXJUcmFuc3BvcnQoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyLCBMb29wZXIgbG9vcGVyKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChsb29wZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIobG9vcGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoZmluYWwgQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNvdW50cnlEZXRlY3RlZChjb3VudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQ291bnRyeURldGVjdG9yIjsKKyAgICBwcml2YXRlIGZpbmFsIElDb3VudHJ5RGV0ZWN0b3IgbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPENvdW50cnlMaXN0ZW5lciwgTGlzdGVuZXJUcmFuc3BvcnQ+IG1MaXN0ZW5lcnM7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSAtIGhpZGUgdGhpcyBjb25zdHJ1Y3RvciBiZWNhdXNlIGl0IGhhcyBhIHBhcmFtZXRlciBvZiB0eXBlCisgICAgICogICAgICAgSUNvdW50cnlEZXRlY3Rvciwgd2hpY2ggaXMgYSBzeXN0ZW0gcHJpdmF0ZSBjbGFzcy4gVGhlIHJpZ2h0IHdheSB0bworICAgICAqICAgICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIHVzaW5nIHRoZSBmYWN0b3J5CisgICAgICogICAgICAgQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBDb3VudHJ5RGV0ZWN0b3IoSUNvdW50cnlEZXRlY3RvciBzZXJ2aWNlKSB7CisgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKKyAgICAgICAgbUxpc3RlbmVycyA9IG5ldyBIYXNoTWFwPENvdW50cnlMaXN0ZW5lciwgTGlzdGVuZXJUcmFuc3BvcnQ+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGlmIGl0IGlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIG51bGwgd2lsbAorICAgICAqICAgICAgICAgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvdW50cnkgZGV0ZWN0Q291bnRyeSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJkZXRlY3RDb3VudHJ5OiBSZW1vdGVFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQKKyAgICAgKiBvciBjaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gbG9vcGVyIGEgTG9vcGVyIG9iamVjdCB3aG9zZSBtZXNzYWdlIHF1ZXVlIHdpbGwgYmUgdXNlZCB0bworICAgICAqICAgICAgICBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrIG1lY2hhbmlzbS4gSWYgbG9vcGVyIGlzIG51bGwgdGhlbiB0aGUKKyAgICAgKiAgICAgICAgY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyLCBMb29wZXIgbG9vcGVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVycykgeworICAgICAgICAgICAgaWYgKCFtTGlzdGVuZXJzLmNvbnRhaW5zS2V5KGxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIExpc3RlbmVyVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBMaXN0ZW5lclRyYW5zcG9ydChsaXN0ZW5lciwgbG9vcGVyKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5hZGRDb3VudHJ5TGlzdGVuZXIodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVycy5wdXQobGlzdGVuZXIsIHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYWRkQ291bnRyeUxpc3RlbmVyOiBSZW1vdGVFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIExpc3RlbmVyVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG1MaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UucmVtb3ZlQ291bnRyeUxpc3RlbmVyKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAicmVtb3ZlQ291bnRyeUxpc3RlbmVyOiBSZW1vdGVFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeUxpc3RlbmVyLmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2ZGI0MQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKKy8qKgorICogVGhlIGxpc3RlbmVyIGZvciByZWNlaXZpbmcgdGhlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBjb3VudHJ5IGlzIGRldGVjdGVkIG9yCisgKiBjaGFuZ2VkCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGludGVyZmFjZSBDb3VudHJ5TGlzdGVuZXIgeworICAgIC8qKgorICAgICAqIEBwYXJhbSBjb3VudHJ5IHRoZSBjaGFuZ2VkIG9yIGRldGVjdGVkIGNvdW50cnkuCisgICAgICovCisgICAgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpOworfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbCBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeURldGVjdG9yLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhZjA3YwotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeURldGVjdG9yLmFpZGwKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CisKKy8qKgorICogVGhlIEFQSSBmb3IgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5IHdoZXJlIHRoZSB1c2VyIGlzLgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElDb3VudHJ5RGV0ZWN0b3IKK3sKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGlmIGl0IGlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBDb3VudHJ5IGRldGVjdENvdW50cnkoKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpc3RlbmVyIHRvIHJlY2VpdmUgdGhlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBjb3VudHJ5IGlzIGRldGVjdGVkIG9yIGNoYW5nZWQuCisgICAgICovCisgICAgdm9pZCBhZGRDb3VudHJ5TGlzdGVuZXIoaW4gSUNvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGxpc3RlbmVyCisgICAgICovCisgICAgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoaW4gSUNvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcik7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbCBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeUxpc3RlbmVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlY2IxMwotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeUxpc3RlbmVyLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKKy8qKgorICoge0BoaWRlfQorICovCitvbmV3YXkgaW50ZXJmYWNlIElDb3VudHJ5TGlzdGVuZXIKK3sKKyAgICB2b2lkIG9uQ291bnRyeURldGVjdGVkKGluIENvdW50cnkgY291bnRyeSk7Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi90ZXN0cy9sb2NhdGlvbnRlc3RzL3NyYy9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlUZXN0ZXIuamF2YSBiL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MDJkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi90ZXN0cy9sb2NhdGlvbnRlc3RzL3NyYy9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIENvdW50cnlUZXN0ZXIgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3VudHJ5RXF1YWxzKCkgeworICAgICAgICBDb3VudHJ5IGNvdW50cnlBID0gbmV3IENvdW50cnkoIlVTIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5QiA9IG5ldyBDb3VudHJ5KCJVUyIsIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5QyA9IG5ldyBDb3VudHJ5KCJDTiIsIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5RCA9IG5ldyBDb3VudHJ5KCJ1cyIsIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUEuZXF1YWxzSWdub3JlU291cmNlKGNvdW50cnlCKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlBLmVxdWFsc0lnbm9yZVNvdXJjZShjb3VudHJ5QykpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5QS5lcXVhbHMoY291bnRyeUMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5QS5lcXVhbHMoY291bnRyeUQpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5QS5oYXNoQ29kZSgpID09IGNvdW50cnlELmhhc2hDb2RlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEKaW5kZXggZjFmYTFlOC4uMzFlNDYzMSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEKQEAgLTMxLDkgKzMxLDkgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19JTlZBTElEID0gMDsKICAgICAvKiogRGVmYXVsdCBhdWRpbyBkYXRhIGZvcm1hdCAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX0RFRkFVTFQgPSAxOwotICAgIC8qKiBBdWRpbyBkYXRhIGZvcm1hdDogUENNIDE2IGJpdCBwZXIgc2FtcGxlICovCisgICAgLyoqIEF1ZGlvIGRhdGEgZm9ybWF0OiBQQ00gMTYgYml0IHBlciBzYW1wbGUuIEd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGRldmljZXMuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfUENNXzE2QklUID0gMjsgLy8gYWNjZXNzZWQgYnkgbmF0aXZlIGNvZGUKLSAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSA4IGJpdCBwZXIgc2FtcGxlICovCisgICAgLyoqIEF1ZGlvIGRhdGEgZm9ybWF0OiBQQ00gOCBiaXQgcGVyIHNhbXBsZS4gTm90IGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGRldmljZXMuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfUENNXzhCSVQgPSAzOyAgLy8gYWNjZXNzZWQgYnkgbmF0aXZlIGNvZGUKIAogICAgIC8qKiBJbnZhbGlkIGF1ZGlvIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhCmluZGV4IGJiYmJhNzQuLmIyM2RjZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEKQEAgLTE1MjUsNCArMTUyNSwyMiBAQAogICAgICAgKiB7QGhpZGV9CiAgICAgICAqLwogICAgICBwcml2YXRlIElCaW5kZXIgbUlDYWxsQmFjayA9IG5ldyBCaW5kZXIoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwaG9uZSBpcyBpbiBzaWxlbnQgbW9kZSwgd2l0aCBvciB3aXRob3V0IHZpYnJhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGhvbmUgaXMgaW4gc2lsZW50IG1vZGUsIHdpdGggb3Igd2l0aG91dCB2aWJyYXRlLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UmluZ2VyTW9kZSgpCisgICAgICoKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBDb3VuY2lsIGFwcHJvdmFsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaWxlbnRNb2RlKCkgeworICAgICAgICBpbnQgcmluZ2VyTW9kZSA9IGdldFJpbmdlck1vZGUoKTsKKyAgICAgICAgYm9vbGVhbiBzaWxlbnRNb2RlID0KKyAgICAgICAgICAgIChyaW5nZXJNb2RlID09IFJJTkdFUl9NT0RFX1NJTEVOVCkgfHwKKyAgICAgICAgICAgIChyaW5nZXJNb2RlID09IFJJTkdFUl9NT0RFX1ZJQlJBVEUpOworICAgICAgICByZXR1cm4gc2lsZW50TW9kZTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKaW5kZXggYzQ4ZWFhZC4uYzU2N2E2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKQEAgLTE5NCwxMSArMTk0LDEzIEBACiAgICAgICogQ2xhc3MgY29uc3RydWN0b3IuCiAgICAgICogQHBhcmFtIGF1ZGlvU291cmNlIHRoZSByZWNvcmRpbmcgc291cmNlLiBTZWUge0BsaW5rIE1lZGlhUmVjb3JkZXIuQXVkaW9Tb3VyY2V9IGZvcgogICAgICAqICAgIHJlY29yZGluZyBzb3VyY2UgZGVmaW5pdGlvbnMuCi0gICAgICogQHBhcmFtIHNhbXBsZVJhdGVJbkh6IHRoZSBzYW1wbGUgcmF0ZSBleHByZXNzZWQgaW4gSGVydHouIEV4YW1wbGVzIG9mIHJhdGVzIGFyZSAoYnV0Ci0gICAgICogICBub3QgbGltaXRlZCB0bykgNDQxMDAsIDIyMDUwIGFuZCAxMTAyNS4KKyAgICAgKiBAcGFyYW0gc2FtcGxlUmF0ZUluSHogdGhlIHNhbXBsZSByYXRlIGV4cHJlc3NlZCBpbiBIZXJ0ei4gNDQxMDBIeiBpcyBjdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgKiAgIHJhdGUgdGhhdCBpcyBndWFyYW50ZWVkIHRvIHdvcmsgb24gYWxsIGRldmljZXMsIGJ1dCBvdGhlciByYXRlcyBzdWNoIGFzIDIyMDUwLAorICAgICAqICAgMTYwMDAsIGFuZCAxMTAyNSBtYXkgd29yayBvbiBzb21lIGRldmljZXMuCiAgICAgICogQHBhcmFtIGNoYW5uZWxDb25maWcgZGVzY3JpYmVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBhdWRpbyBjaGFubmVscy4gCiAgICAgICogICBTZWUge0BsaW5rIEF1ZGlvRm9ybWF0I0NIQU5ORUxfSU5fTU9OT30gYW5kCi0gICAgICogICB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9TVEVSRU99CisgICAgICogICB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9TVEVSRU99LiAge0BsaW5rIEF1ZGlvRm9ybWF0I0NIQU5ORUxfSU5fTU9OT30gaXMgZ3VhcmFudGVlZAorICAgICAqICAgdG8gd29yayBvbiBhbGwgZGV2aWNlcy4KICAgICAgKiBAcGFyYW0gYXVkaW9Gb3JtYXQgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgYXVkaW8gZGF0YSBpcyByZXByZXNlbnRlZC4gCiAgICAgICogICBTZWUge0BsaW5rIEF1ZGlvRm9ybWF0I0VOQ09ESU5HX1BDTV8xNkJJVH0gYW5kIAogICAgICAqICAge0BsaW5rIEF1ZGlvRm9ybWF0I0VOQ09ESU5HX1BDTV84QklUfQpAQCAtNDQ0LDYgKzQ0Niw4IEBACiAgICAgICogIG9yIHtAbGluayAjRVJST1J9IGlmIHRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgdW5hYmxlIHRvIHF1ZXJ5IHRoZSBoYXJkd2FyZSBmb3IgaXRzIAogICAgICAqICBvdXRwdXQgcHJvcGVydGllcywgCiAgICAgICogICBvciB0aGUgbWluaW11bSBidWZmZXIgc2l6ZSBleHByZXNzZWQgaW4gYnl0ZXMuCisgICAgICogQHNlZSAjQXVkaW9SZWNvcmQoaW50LCBpbnQsIGludCwgaW50LCBpbnQpIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHZhbGlkCisgICAgICogICBjb25maWd1cmF0aW9uIHZhbHVlcy4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIGludCBnZXRNaW5CdWZmZXJTaXplKGludCBzYW1wbGVSYXRlSW5IeiwgaW50IGNoYW5uZWxDb25maWcsIGludCBhdWRpb0Zvcm1hdCkgewogICAgICAgICBpbnQgY2hhbm5lbENvdW50ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UuamF2YQppbmRleCA0MWQyY2M1Li42YWExYWU2IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TZXJ2aWNlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZS5qYXZhCkBAIC0xNiwxOCArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDbGFzczsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENsYXNzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyOwpAQCAtNDAsNiArNDEsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKQEAgLTQ3LDcgKzQ5LDYgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVm9sdW1lUGFuZWw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnk7CiAKQEAgLTU4LDYgKzU5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIApAQCAtMjU4LDggKzI2MCw4IEBACiAgICAgLy8gQmx1ZXRvb3RoSGVhZHNldCBBUEkgdG8gY29udHJvbCBTQ08gY29ubmVjdGlvbgogICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtQmx1ZXRvb3RoSGVhZHNldDsKIAotICAgIC8vIEJsdWV0b290aCBoZWFkc2V0IGNvbm5lY3Rpb24gc3RhdGUKLSAgICBwcml2YXRlIGJvb2xlYW4gbUJsdWV0b290aEhlYWRzZXRDb25uZWN0ZWQ7CisgICAgLy8gQmx1ZXRvb3RoIGhlYWRzZXQgZGV2aWNlCisgICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbUJsdWV0b290aEhlYWRzZXREZXZpY2U7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBDb25zdHJ1Y3Rpb24KQEAgLTI5NCwxNyArMjk2LDIwIEBACiAgICAgICAgIEF1ZGlvU3lzdGVtLnNldEVycm9yQ2FsbGJhY2sobUF1ZGlvU3lzdGVtQ2FsbGJhY2spOwogICAgICAgICBsb2FkU291bmRFZmZlY3RzKCk7CiAKLSAgICAgICAgbUJsdWV0b290aEhlYWRzZXRDb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgbUJsdWV0b290aEhlYWRzZXQgPSBuZXcgQmx1ZXRvb3RoSGVhZHNldChjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0U2VydmljZUxpc3RlbmVyKTsKKyAgICAgICAgbUJsdWV0b290aEhlYWRzZXREZXZpY2UgPSBudWxsOworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIuZ2V0UHJvZmlsZVByb3h5KG1Db250ZXh0LCBtQmx1ZXRvb3RoUHJvZmlsZVNlcnZpY2VMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBSZWdpc3RlciBmb3IgZGV2aWNlIGNvbm5lY3Rpb24gaW50ZW50IGJyb2FkY2FzdHMuCiAgICAgICAgIEludGVudEZpbHRlciBpbnRlbnRGaWx0ZXIgPQogICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9IRUFEU0VUX1BMVUcpOwotICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9ET0NLX0VWRU5UKTsKKyAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0FVRElPX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9ET0NLX0VWRU5UKTsKICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgaW50ZW50RmlsdGVyKTsKIAogICAgICAgICAvLyBSZWdpc3RlciBmb3IgbWVkaWEgYnV0dG9uIGludGVudCBicm9hZGNhc3RzLgpAQCAtMTAwMCw3ICsxMDA1LDcgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBpbmNDb3VudCgpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZChtU2NvQ2xpZW50cykgewotICAgICAgICAgICAgICAgIHJlcXVlc3RTY29TdGF0ZShCbHVldG9vdGhIZWFkc2V0LkFVRElPX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdFNjb1N0YXRlKEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fQ09OTkVDVEVEKTsKICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0Y291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUNiLmxpbmtUb0RlYXRoKHRoaXMsIDApOwpAQCAtMTAyNiw3ICsxMDMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJkZWNDb3VudCgpIGdvaW5nIHRvIDAgYnV0IG5vdCByZWdpc3RlcmVkIHRvIGJpbmRlciIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTY29TdGF0ZShCbHVldG9vdGhIZWFkc2V0LkFVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTY29TdGF0ZShCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0FVRElPX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMDQyLDcgKzEwNDcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU3RhcnRjb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKHN0b3BTY28pIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNjb1N0YXRlKEJsdWV0b290aEhlYWRzZXQuQVVESU9fU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNjb1N0YXRlKEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwNjgsMTIgKzEwNzMsMTIgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFNjb1N0YXRlKGludCBzdGF0ZSkgewogICAgICAgICAgICAgaWYgKHRvdGFsQ291bnQoKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXRDb25uZWN0ZWQgJiYKKyAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldERldmljZSAhPSBudWxsICYmCiAgICAgICAgICAgICAgICAgQXVkaW9TZXJ2aWNlLnRoaXMubU1vZGUgPT0gQXVkaW9TeXN0ZW0uTU9ERV9OT1JNQUwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5BVURJT19TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQuc3RhcnRWb2ljZVJlY29nbml0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0LnN0YXJ0Vm9pY2VSZWNvZ25pdGlvbihtQmx1ZXRvb3RoSGVhZHNldERldmljZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQuc3RvcFZvaWNlUmVjb2duaXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQuc3RvcFZvaWNlUmVjb2duaXRpb24obUJsdWV0b290aEhlYWRzZXREZXZpY2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTEwMywyMyArMTEwOCwyNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0LlNlcnZpY2VMaXN0ZW5lciBtQmx1ZXRvb3RoSGVhZHNldFNlcnZpY2VMaXN0ZW5lciA9Ci0gICAgICAgIG5ldyBCbHVldG9vdGhIZWFkc2V0LlNlcnZpY2VMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgewotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhIZWFkc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUJsdWV0b290aEhlYWRzZXQuZ2V0Q3VycmVudEhlYWRzZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldENvbm5lY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgIHByaXZhdGUgQmx1ZXRvb3RoUHJvZmlsZS5TZXJ2aWNlTGlzdGVuZXIgbUJsdWV0b290aFByb2ZpbGVTZXJ2aWNlTGlzdGVuZXIgPQorICAgICAgICBuZXcgQmx1ZXRvb3RoUHJvZmlsZS5TZXJ2aWNlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChpbnQgcHJvZmlsZSwgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSkgeworICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQgPSAoQmx1ZXRvb3RoSGVhZHNldCkgcHJveHk7CisgICAgICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VTZXQgPSBtQmx1ZXRvb3RoSGVhZHNldC5nZXRDb25uZWN0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlU2V0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2VbXSBkZXZpY2VzID0KKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2V0LnRvQXJyYXkobmV3IEJsdWV0b290aERldmljZVtkZXZpY2VTZXQuc2l6ZSgpXSk7CisgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXREZXZpY2UgPSBkZXZpY2VzWzBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldERldmljZSA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoaW50IHByb2ZpbGUpIHsKICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoSGVhZHNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1CbHVldG9vdGhIZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhIZWFkc2V0LmdldFN0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXRDb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gbUJsdWV0b290aEhlYWRzZXQuZ2V0Q29ubmVjdGVkRGV2aWNlcygpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0RGV2aWNlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgY2xlYXJBbGxTY29DbGllbnRzKCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC0xODEzLDE4ICsxODIyLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBBdWRpb1N5c3RlbS5GT1JDRV9OT05FOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbS5zZXRGb3JjZVVzZShBdWRpb1N5c3RlbS5GT1JfRE9DSywgY29uZmlnKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aEEyZHAuRVhUUkFfU0lOS19TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEEyZHAuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpOwogICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBidERldmljZSA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBidERldmljZS5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Nvbm5lY3RlZCA9IChtQ29ubmVjdGVkRGV2aWNlcy5jb250YWluc0tleShBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpbUNvbm5lY3RlZERldmljZXMuZ2V0KEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApKS5lcXVhbHMoYWRkcmVzcykpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDb25uZWN0ZWQgPQorICAgICAgICAgICAgICAgICAgICAobUNvbm5lY3RlZERldmljZXMuY29udGFpbnNLZXkoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWREZXZpY2VzLmdldChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKS5lcXVhbHMoYWRkcmVzcykpOwogCi0gICAgICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkICYmCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlICE9IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEICYmIHN0YXRlICE9IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgeworICAgICAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCAmJiBzdGF0ZSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnREZXZpY2UuaXNCbHVldG9vdGhEb2NrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm9kdWN0aW9uIG9mIGEgZGVsYXkgZm9yIHRyYW5zaWVudCBkaXNjb25uZWN0aW9ucyBvZiBkb2NrcyB3aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG93ZXIgaXMgcmFwaWRseSB0dXJuZWQgb2ZmL29uLCB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBjYW5jZWxlZCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlY29ubmVjdCB0aGUgZG9jayB1bmRlciBhIHByZXNldCBkZWxheQpAQCAtMTgzNCw5ICsxODQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VBMmRwRGV2aWNlVW5hdmFpbGFibGVOb3coYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nvbm5lY3RlZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nvbm5lY3RlZCAmJiBzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnREZXZpY2UuaXNCbHVldG9vdGhEb2NrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgYSByZWNvbm5lY3Rpb24gYWZ0ZXIgYSB0cmFuc2llbnQgZGlzY29ubmVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQTJkcERldmljZVRpbWVvdXQoKTsKQEAgLTE4NTEsOSArMTg1OCw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbWFrZUEyZHBEZXZpY2VBdmFpbGFibGUoYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aEhlYWRzZXQuRVhUUkFfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1IpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpOwogICAgICAgICAgICAgICAgIGludCBkZXZpY2UgPSBBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ087CiAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGJ0RGV2aWNlID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG51bGw7CkBAIC0xODc0LDIxICsxODgxLDIxIEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Nvbm5lY3RlZCA9IChtQ29ubmVjdGVkRGV2aWNlcy5jb250YWluc0tleShkZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZyltQ29ubmVjdGVkRGV2aWNlcy5nZXQoZGV2aWNlKSkuZXF1YWxzKGFkZHJlc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWREZXZpY2VzLmdldChkZXZpY2UpLmVxdWFscyhhZGRyZXNzKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQgJiYgc3RhdGUgIT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQgJiYgc3RhdGUgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW0uc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtLkRFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkRGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXRDb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXREZXZpY2UgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBjbGVhckFsbFNjb0NsaWVudHMoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nvbm5lY3RlZCAmJiBzdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQ29ubmVjdGVkICYmIHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtLnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbS5ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWREZXZpY2VzLnB1dChuZXcgSW50ZWdlcihkZXZpY2UpLCBhZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXRDb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldERldmljZSA9IGJ0RGV2aWNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX0hFQURTRVRfUExVRykpIHsKICAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoInN0YXRlIiwgMCk7CkBAIC0xOTIyLDE1ICsxOTI5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fQVVESU9fU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSGVhZHNldC5FWFRSQV9BVURJT19TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9FUlJPUik7CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIC0xKTsKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TY29DbGllbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVNjb0NsaWVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuQVVESU9fU1RBVEVfQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0FVRElPX0NPTk5FQ1RFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEF1ZGlvTWFuYWdlci5TQ09fQVVESU9fU1RBVEVfQ09OTkVDVEVEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LkFVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19ESVNDT05ORUNURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBBdWRpb01hbmFnZXIuU0NPX0FVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuamF2YQppbmRleCBhMjdkZjU3Li4zZTk0MjlkIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEKQEAgLTM5LDIyICszOSw4MCBAQAogICovCiBwdWJsaWMgY2xhc3MgQ2FtY29yZGVyUHJvZmlsZQogeworICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzL29yZGluYWxzIHdpdGhvdXQgdXBkYXRpbmcgdGhlaXIgY291bnRlcnBhcnQKKyAgICAvLyBpbiBpbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCEKKwogICAgIC8qKgotICAgICAqIFRoZSBvdXRwdXQgZnJvbSBjYW1jb3JkZXIgcmVjb3JkaW5nIHNlc3Npb25zIGNhbiBoYXZlIGRpZmZlcmVudCBxdWFsaXR5IGxldmVscy4KLSAgICAgKgotICAgICAqIEN1cnJlbnRseSwgd2UgZGVmaW5lIHR3byBxdWFsaXR5IGxldmVsczogaGlnaCBxdWFsaXR5IGFuZCBsb3cgcXVhbGl0eS4KLSAgICAgKiBBIGNhbWNvcmRlciByZWNvcmRpbmcgc2Vzc2lvbiB3aXRoIGhpZ2ggcXVhbGl0eSBsZXZlbCB1c3VhbGx5IGhhcyBoaWdoZXIgb3V0cHV0IGJpdAotICAgICAqIHJhdGUsIGJldHRlciB2aWRlbyBhbmQvb3IgYXVkaW8gcmVjb3JkaW5nIHF1YWxpdHksIGxhcmdlciB2aWRlbyBmcmFtZQotICAgICAqIHJlc29sdXRpb24gYW5kIGhpZ2hlciBhdWRpbyBzYW1wbGluZyByYXRlLCBldGMsIHRoYW4gdGhvc2Ugd2l0aCBsb3cgcXVhbGl0eQotICAgICAqIGxldmVsLgotICAgICAqCi0gICAgICogRG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXMvb3JkaW5hbHMgd2l0aG91dCB1cGRhdGluZyB0aGVpciBjb3VudGVycGFydAotICAgICAqIGluIGluY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIQorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgbG93ZXN0IGF2YWlsYWJsZSByZXNvbHV0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfTE9XICA9IDA7CisKKyAgICAvKioKKyAgICAgKiBRdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHJlc29sdXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9ISUdIID0gMTsKIAogICAgIC8qKgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgcWNpZiAoMTc2IHggMTQ0KSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfUUNJRiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBRdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNpZiAoMzUyIHggMjg4KSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfQ0lGID0gMzsKKworICAgIC8qKgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgNDgwcCAoNzIwIHggNDgwKSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfNDgwUCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBRdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDcyMHAgKDEyODAgeCA3MjApIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV83MjBQID0gNTsKKworICAgIC8qKgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgMTA4MHAgKDE5MjAgeCAxMDg4KSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfMTA4MFAgPSA2OworCisgICAgLyoqCisgICAgICogVGltZSBsYXBzZSBxdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvd2VzdCBhdmFpbGFibGUgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1RJTUVfTEFQU0VfTE9XICA9IDEwMDA7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgaGlnaGVzdCBhdmFpbGFibGUgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1RJTUVfTEFQU0VfSElHSCA9IDEwMDE7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgcWNpZiAoMTc2IHggMTQ0KSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV9RQ0lGID0gMTAwMjsKKworICAgIC8qKgorICAgICAqIFRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaWYgKDM1MiB4IDI4OCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1RJTUVfTEFQU0VfQ0lGID0gMTAwMzsKKworICAgIC8qKgorICAgICAqIFRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSA0ODBwICg3MjAgeCA0ODApIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9USU1FX0xBUFNFXzQ4MFAgPSAxMDA0OworCisgICAgLyoqCisgICAgICogVGltZSBsYXBzZSBxdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDcyMHAgKDEyODAgeCA3MjApIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9USU1FX0xBUFNFXzcyMFAgPSAxMDA1OworCisgICAgLyoqCisgICAgICogVGltZSBsYXBzZSBxdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDEwODBwICgxOTIwIHggMTA4OCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAgPSAxMDA2OworCisgICAgLyoqCiAgICAgICogRGVmYXVsdCByZWNvcmRpbmcgZHVyYXRpb24gaW4gc2Vjb25kcyBiZWZvcmUgdGhlIHNlc3Npb24gaXMgdGVybWluYXRlZC4KICAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIGxpa2UgTU1TIGhhcyBsaW1pdGVkIGZpbGUgc2l6ZSByZXF1aXJlbWVudC4KICAgICAgKi8KQEAgLTEyMiwyNSArMTgwLDc5IEBACiAgICAgICogUmV0dXJucyB0aGUgY2FtY29yZGVyIHByb2ZpbGUgZm9yIHRoZSBkZWZhdWx0IGNhbWVyYSBhdCB0aGUgZ2l2ZW4KICAgICAgKiBxdWFsaXR5IGxldmVsLgogICAgICAqIEBwYXJhbSBxdWFsaXR5IHRoZSB0YXJnZXQgcXVhbGl0eSBsZXZlbCBmb3IgdGhlIGNhbWNvcmRlciBwcm9maWxlCisgICAgICogQHNlZSAjZ2V0KGludCwgaW50KQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSBnZXQoaW50IHF1YWxpdHkpIHsKLSAgICAgICAgcmV0dXJuIGdldCgwLCBxdWFsaXR5KTsKKyAgICAgICAgcmV0dXJuIGdldChhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5DQU1FUkFfSURfREVGQVVMVCwgcXVhbGl0eSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2FtY29yZGVyIHByb2ZpbGUgZm9yIHRoZSBnaXZlbiBjYW1lcmEgYXQgdGhlIGdpdmVuCiAgICAgICogcXVhbGl0eSBsZXZlbC4KKyAgICAgKgorICAgICAqIFF1YWxpdHkgbGV2ZWxzIFFVQUxJVFlfTE9XLCBRVUFMSVRZX0hJR0ggYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkLCB3aGlsZQorICAgICAqIG90aGVyIGxldmVscyBtYXkgb3IgbWF5IG5vdCBiZSBzdXBwb3J0ZWQuIFRoZSBzdXBwb3J0ZWQgbGV2ZWxzIGNhbiBiZSBjaGVja2VkIHVzaW5nCisgICAgICoge0BsaW5rICNoYXNQcm9maWxlKGludCwgaW50KX0uCisgICAgICogUVVBTElUWV9MT1cgcmVmZXJzIHRvIHRoZSBsb3dlc3QgcXVhbGl0eSBhdmFpbGFibGUsIHdoaWxlIFFVQUxJVFlfSElHSCByZWZlcnMgdG8KKyAgICAgKiB0aGUgaGlnaGVzdCBxdWFsaXR5IGF2YWlsYWJsZS4KKyAgICAgKiBRVUFMSVRZX0xPVy9RVUFMSVRZX0hJR0ggaGF2ZSB0byBtYXRjaCBvbmUgb2YgcWNpZiwgY2lmLCA0ODBwLCA3MjBwLCBvciAxMDgwcC4KKyAgICAgKiBFLmcuIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgNDgwcCwgNzIwcCwgYW5kIDEwODBwLCB0aGVuIGxvdyBpcyA0ODBwIGFuZCBoaWdoIGlzCisgICAgICogMTA4MHAuCisgICAgICoKKyAgICAgKiBUaGUgc2FtZSBpcyB0cnVlIGZvciB0aW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWxzLCBpLmUuIFFVQUxJVFlfVElNRV9MQVBTRV9MT1csCisgICAgICogUVVBTElUWV9USU1FX0xBUFNFX0hJR0ggYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkIGFuZCBoYXZlIHRvIG1hdGNoIG9uZSBvZgorICAgICAqIHFjaWYsIGNpZiwgNDgwcCwgNzIwcCwgb3IgMTA4MHAuCisgICAgICoKKyAgICAgKiBBIGNhbWNvcmRlciByZWNvcmRpbmcgc2Vzc2lvbiB3aXRoIGhpZ2hlciBxdWFsaXR5IGxldmVsIHVzdWFsbHkgaGFzIGhpZ2hlciBvdXRwdXQKKyAgICAgKiBiaXQgcmF0ZSwgYmV0dGVyIHZpZGVvIGFuZC9vciBhdWRpbyByZWNvcmRpbmcgcXVhbGl0eSwgbGFyZ2VyIHZpZGVvIGZyYW1lCisgICAgICogcmVzb2x1dGlvbiBhbmQgaGlnaGVyIGF1ZGlvIHNhbXBsaW5nIHJhdGUsIGV0YywgdGhhbiB0aG9zZSB3aXRoIGxvd2VyIHF1YWxpdHkKKyAgICAgKiBsZXZlbC4KKyAgICAgKgogICAgICAqIEBwYXJhbSBjYW1lcmFJZCB0aGUgaWQgZm9yIHRoZSBjYW1lcmEKLSAgICAgKiBAcGFyYW0gcXVhbGl0eSB0aGUgdGFyZ2V0IHF1YWxpdHkgbGV2ZWwgZm9yIHRoZSBjYW1jb3JkZXIgcHJvZmlsZQorICAgICAqIEBwYXJhbSBxdWFsaXR5IHRoZSB0YXJnZXQgcXVhbGl0eSBsZXZlbCBmb3IgdGhlIGNhbWNvcmRlciBwcm9maWxlLgorICAgICAqIEBzZWUgI1FVQUxJVFlfTE9XCisgICAgICogQHNlZSAjUVVBTElUWV9ISUdICisgICAgICogQHNlZSAjUVVBTElUWV9RQ0lGCisgICAgICogQHNlZSAjUVVBTElUWV9DSUYKKyAgICAgKiBAc2VlICNRVUFMSVRZXzQ4MFAKKyAgICAgKiBAc2VlICNRVUFMSVRZXzcyMFAKKyAgICAgKiBAc2VlICNRVUFMSVRZXzEwODBQCisgICAgICogQHNlZSAjUVVBTElUWV9USU1FX0xBUFNFX0xPVworICAgICAqIEBzZWUgI1FVQUxJVFlfVElNRV9MQVBTRV9ISUdICisgICAgICogQHNlZSAjUVVBTElUWV9USU1FX0xBUFNFX1FDSUYKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfQ0lGCisgICAgICogQHNlZSAjUVVBTElUWV9USU1FX0xBUFNFXzQ4MFAKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfNzIwUAorICAgICAqIEBzZWUgI1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSBnZXQoaW50IGNhbWVyYUlkLCBpbnQgcXVhbGl0eSkgewotICAgICAgICBpZiAocXVhbGl0eSA8IFFVQUxJVFlfTE9XIHx8IHF1YWxpdHkgPiBRVUFMSVRZX0hJR0gpIHsKKyAgICAgICAgaWYgKCEoKHF1YWxpdHkgPj0gUVVBTElUWV9MT1cgJiYgcXVhbGl0eSA8PSBRVUFMSVRZXzEwODBQKSB8fAorICAgICAgICAgICAgICAgIChxdWFsaXR5ID49IFFVQUxJVFlfVElNRV9MQVBTRV9MT1cgJiYgcXVhbGl0eSA8PSBRVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFApKSkgewogICAgICAgICAgICAgU3RyaW5nIGVyck1lc3NhZ2UgPSAiVW5zdXBwb3J0ZWQgcXVhbGl0eSBsZXZlbDogIiArIHF1YWxpdHk7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVyck1lc3NhZ2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlKGNhbWVyYUlkLCBxdWFsaXR5KTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgY2FtY29yZGVyIHByb2ZpbGUgZXhpc3RzIGZvciB0aGUgZGVmYXVsdCBjYW1lcmEgYXQKKyAgICAgKiB0aGUgZ2l2ZW4gcXVhbGl0eSBsZXZlbC4KKyAgICAgKiBAcGFyYW0gcXVhbGl0eSB0aGUgdGFyZ2V0IHF1YWxpdHkgbGV2ZWwgZm9yIHRoZSBjYW1jb3JkZXIgcHJvZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcm9maWxlKGludCBxdWFsaXR5KSB7CisgICAgICAgIHJldHVybiBoYXNQcm9maWxlKGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLkNBTUVSQV9JRF9ERUZBVUxULCBxdWFsaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgY2FtY29yZGVyIHByb2ZpbGUgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gY2FtZXJhIGF0CisgICAgICogdGhlIGdpdmVuIHF1YWxpdHkgbGV2ZWwuCisgICAgICogQHBhcmFtIGNhbWVyYUlkIHRoZSBpZCBmb3IgdGhlIGNhbWVyYQorICAgICAqIEBwYXJhbSBxdWFsaXR5IHRoZSB0YXJnZXQgcXVhbGl0eSBsZXZlbCBmb3IgdGhlIGNhbWNvcmRlciBwcm9maWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1Byb2ZpbGUoaW50IGNhbWVyYUlkLCBpbnQgcXVhbGl0eSkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2hhc19jYW1jb3JkZXJfcHJvZmlsZShjYW1lcmFJZCwgcXVhbGl0eSk7CisgICAgfQorCiAgICAgc3RhdGljIHsKICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKICAgICAgICAgbmF0aXZlX2luaXQoKTsKQEAgLTE3OCw0ICsyOTAsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9pbml0KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIENhbWNvcmRlclByb2ZpbGUgbmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZSgKICAgICAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IHF1YWxpdHkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBmaW5hbCBib29sZWFuIG5hdGl2ZV9oYXNfY2FtY29yZGVyX3Byb2ZpbGUoCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBxdWFsaXR5KTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YQppbmRleCA2ZTUyN2Q5Li42NmE5M2YwNCAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YQpAQCAtMzQsOCArMzQsNiBAQAogICoge0BoaWRlfQogICovCiBwdWJsaWMgY2xhc3MgTWVkaWFGaWxlIHsKLSAgICAvLyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBhbGwgZmlsZSBleHRlbnNpb25zIHN1cHBvcnRlZCBieSB0aGUgbWVkaWEgc2Nhbm5lcgotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIHNGaWxlRXh0ZW5zaW9uczsKIAogICAgIC8vIEF1ZGlvIGZpbGUgdHlwZXMKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfTVAzICAgICA9IDE7CkBAIC04NCw2ICs4MiwxNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9XUEwgICAgID0gNDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1BMQVlMSVNUX0ZJTEVfVFlQRSA9IEZJTEVfVFlQRV9NM1U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfUExBWUxJU1RfRklMRV9UWVBFID0gRklMRV9UWVBFX1dQTDsKKworICAgIC8vIE90aGVyIHBvcHVsYXIgZmlsZSB0eXBlcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9URVhUICAgICAgICAgID0gMTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9IVE1MICAgICAgICAgID0gMTAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9QREYgICAgICAgICAgID0gMTAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9YTUwgICAgICAgICAgID0gMTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9NU19XT1JEICAgICAgID0gMTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9NU19FWENFTCAgICAgID0gMTA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9NU19QT1dFUlBPSU5UID0gMTA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9GTEFDICAgICAgICAgID0gMTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9aSVAgICAgICAgICAgID0gMTA4OwogICAgIAogICAgIHN0YXRpYyBjbGFzcyBNZWRpYUZpbGVUeXBlIHsKICAgICAKQEAgLTk2LDE1ICsxMDUsMzIgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgTWVkaWFGaWxlVHlwZT4gc0ZpbGVUeXBlTWFwIAorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBNZWRpYUZpbGVUeXBlPiBzRmlsZVR5cGVNYXAKICAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZWRpYUZpbGVUeXBlPigpOwotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzTWltZVR5cGVNYXAgCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsgICAgICAgICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc01pbWVUeXBlTWFwCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAvLyBtYXBzIGZpbGUgZXh0ZW5zaW9uIHRvIE1UUCBmb3JtYXQgY29kZQorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzRmlsZVR5cGVUb0Zvcm1hdE1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgLy8gbWFwcyBtaW1lIHR5cGUgdG8gTVRQIGZvcm1hdCBjb2RlCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNNaW1lVHlwZVRvRm9ybWF0TWFwCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAvLyBtYXBzIE1UUCBmb3JtYXQgY29kZSB0byBtaW1lIHR5cGUKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4gc0Zvcm1hdFRvTWltZVR5cGVNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworCiAgICAgc3RhdGljIHZvaWQgYWRkRmlsZVR5cGUoU3RyaW5nIGV4dGVuc2lvbiwgaW50IGZpbGVUeXBlLCBTdHJpbmcgbWltZVR5cGUpIHsKICAgICAgICAgc0ZpbGVUeXBlTWFwLnB1dChleHRlbnNpb24sIG5ldyBNZWRpYUZpbGVUeXBlKGZpbGVUeXBlLCBtaW1lVHlwZSkpOwogICAgICAgICBzTWltZVR5cGVNYXAucHV0KG1pbWVUeXBlLCBJbnRlZ2VyLnZhbHVlT2YoZmlsZVR5cGUpKTsKICAgICB9CiAKKyAgICBzdGF0aWMgdm9pZCBhZGRGaWxlVHlwZShTdHJpbmcgZXh0ZW5zaW9uLCBpbnQgZmlsZVR5cGUsIFN0cmluZyBtaW1lVHlwZSwgaW50IG10cEZvcm1hdENvZGUpIHsKKyAgICAgICAgYWRkRmlsZVR5cGUoZXh0ZW5zaW9uLCBmaWxlVHlwZSwgbWltZVR5cGUpOworICAgICAgICBzRmlsZVR5cGVUb0Zvcm1hdE1hcC5wdXQoZXh0ZW5zaW9uLCBJbnRlZ2VyLnZhbHVlT2YobXRwRm9ybWF0Q29kZSkpOworICAgICAgICBzTWltZVR5cGVUb0Zvcm1hdE1hcC5wdXQobWltZVR5cGUsIEludGVnZXIudmFsdWVPZihtdHBGb3JtYXRDb2RlKSk7CisgICAgICAgIHNGb3JtYXRUb01pbWVUeXBlTWFwLnB1dChtdHBGb3JtYXRDb2RlLCBtaW1lVHlwZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dNQUVuYWJsZWQoKSB7CiAgICAgICAgIExpc3Q8QXVkaW9EZWNvZGVyPiBkZWNvZGVycyA9IERlY29kZXJDYXBhYmlsaXRpZXMuZ2V0QXVkaW9EZWNvZGVycygpOwogICAgICAgICBmb3IgKEF1ZGlvRGVjb2RlciBkZWNvZGVyOiBkZWNvZGVycykgewpAQCAtMTE1LDI4ICsxNDEsMTggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXTVZFbmFibGVkKCkgewotICAgICAgICBMaXN0PFZpZGVvRGVjb2Rlcj4gZGVjb2RlcnMgPSBEZWNvZGVyQ2FwYWJpbGl0aWVzLmdldFZpZGVvRGVjb2RlcnMoKTsKLSAgICAgICAgZm9yIChWaWRlb0RlY29kZXIgZGVjb2RlcjogZGVjb2RlcnMpIHsKLSAgICAgICAgICAgIGlmIChkZWNvZGVyID09IFZpZGVvRGVjb2Rlci5WSURFT19ERUNPREVSX1dNVikgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICBzdGF0aWMgewotICAgICAgICBhZGRGaWxlVHlwZSgiTVAzIiwgRklMRV9UWVBFX01QMywgImF1ZGlvL21wZWciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk00QSIsIEZJTEVfVFlQRV9NNEEsICJhdWRpby9tcDQiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIldBViIsIEZJTEVfVFlQRV9XQVYsICJhdWRpby94LXdhdiIpOworICAgICAgICBhZGRGaWxlVHlwZSgiTVAzIiwgRklMRV9UWVBFX01QMywgImF1ZGlvL21wZWciLCBNdHBDb25zdGFudHMuRk9STUFUX01QMyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNNEEiLCBGSUxFX1RZUEVfTTRBLCAiYXVkaW8vbXA0IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIldBViIsIEZJTEVfVFlQRV9XQVYsICJhdWRpby94LXdhdiIsIE10cENvbnN0YW50cy5GT1JNQVRfV0FWKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIkFNUiIsIEZJTEVfVFlQRV9BTVIsICJhdWRpby9hbXIiKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIkFXQiIsIEZJTEVfVFlQRV9BV0IsICJhdWRpby9hbXItd2IiKTsKICAgICAgICAgaWYgKGlzV01BRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBhZGRGaWxlVHlwZSgiV01BIiwgRklMRV9UWVBFX1dNQSwgImF1ZGlvL3gtbXMtd21hIik7CisgICAgICAgICAgICBhZGRGaWxlVHlwZSgiV01BIiwgRklMRV9UWVBFX1dNQSwgImF1ZGlvL3gtbXMtd21hIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9XTUEpOwogICAgICAgICB9Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJPR0ciLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJPR0EiLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJBQUMiLCBGSUxFX1RZUEVfQUFDLCAiYXVkaW8vYWFjIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJPR0ciLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9PR0cpOworICAgICAgICBhZGRGaWxlVHlwZSgiT0dBIiwgRklMRV9UWVBFX09HRywgImFwcGxpY2F0aW9uL29nZyIsIE10cENvbnN0YW50cy5GT1JNQVRfT0dHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkFBQyIsIEZJTEVfVFlQRV9BQUMsICJhdWRpby9hYWMiLCBNdHBDb25zdGFudHMuRk9STUFUX0FBQyk7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJNS0EiLCBGSUxFX1RZUEVfTUtBLCAiYXVkaW8veC1tYXRyb3NrYSIpOwogIAogICAgICAgICBhZGRGaWxlVHlwZSgiTUlEIiwgRklMRV9UWVBFX01JRCwgImF1ZGlvL21pZGkiKTsKQEAgLTE0OCw3OCArMTY0LDExOCBAQAogICAgICAgICBhZGRGaWxlVHlwZSgiUlRYIiwgRklMRV9UWVBFX01JRCwgImF1ZGlvL21pZGkiKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIk9UQSIsIEZJTEVfVFlQRV9NSUQsICJhdWRpby9taWRpIik7CiAgICAgICAgIAotICAgICAgICBhZGRGaWxlVHlwZSgiTVBFRyIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcGVnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJNUDQiLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXA0Iik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJNNFYiLCBGSUxFX1RZUEVfTTRWLCAidmlkZW8vbXA0Iik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCIzR1AiLCBGSUxFX1RZUEVfM0dQUCwgInZpZGVvLzNncHAiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAiLCBGSUxFX1RZUEVfM0dQUCwgInZpZGVvLzNncHAiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHMiIsIEZJTEVfVFlQRV8zR1BQMiwgInZpZGVvLzNncHAyIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCIzR1BQMiIsIEZJTEVfVFlQRV8zR1BQMiwgInZpZGVvLzNncHAyIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNUEVHIiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wZWciLCBNdHBDb25zdGFudHMuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiTVA0IiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wNCIsIE10cENvbnN0YW50cy5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNNFYiLCBGSUxFX1RZUEVfTTRWLCAidmlkZW8vbXA0IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIjNHUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIsICBNdHBDb25zdGFudHMuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIsIE10cENvbnN0YW50cy5GT1JNQVRfM0dQX0NPTlRBSU5FUik7CisgICAgICAgIGFkZEZpbGVUeXBlKCIzRzIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIsIE10cENvbnN0YW50cy5GT1JNQVRfM0dQX0NPTlRBSU5FUik7CisgICAgICAgIGFkZEZpbGVUeXBlKCIzR1BQMiIsIEZJTEVfVFlQRV8zR1BQMiwgInZpZGVvLzNncHAyIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIk1LViIsIEZJTEVfVFlQRV9NS1YsICJ2aWRlby94LW1hdHJvc2thIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJXRUJNIiwgRklMRV9UWVBFX01LViwgInZpZGVvL3gtbWF0cm9za2EiKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIlRTIiwgRklMRV9UWVBFX01QMlRTLCAidmlkZW8vbXAydHMiKTsKIAotICAgICAgICBpZiAoaXNXTVZFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTVYiLCBGSUxFX1RZUEVfV01WLCAidmlkZW8veC1tcy13bXYiKTsKLSAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJBU0YiLCBGSUxFX1RZUEVfQVNGLCAidmlkZW8veC1tcy1hc2YiKTsKLSAgICAgICAgfQorICAgICAgICBhZGRGaWxlVHlwZSgiV01WIiwgRklMRV9UWVBFX1dNViwgInZpZGVvL3gtbXMtd212IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9XTVYpOworICAgICAgICBhZGRGaWxlVHlwZSgiQVNGIiwgRklMRV9UWVBFX0FTRiwgInZpZGVvL3gtbXMtYXNmIik7CiAKLSAgICAgICAgYWRkRmlsZVR5cGUoIkpQRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiSlBFRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiR0lGIiwgRklMRV9UWVBFX0dJRiwgImltYWdlL2dpZiIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiUE5HIiwgRklMRV9UWVBFX1BORywgImltYWdlL3BuZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiQk1QIiwgRklMRV9UWVBFX0JNUCwgImltYWdlL3gtbXMtYm1wIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJKUEciLCBGSUxFX1RZUEVfSlBFRywgImltYWdlL2pwZWciLCBNdHBDb25zdGFudHMuRk9STUFUX0VYSUZfSlBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJKUEVHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9FWElGX0pQRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiR0lGIiwgRklMRV9UWVBFX0dJRiwgImltYWdlL2dpZiIsIE10cENvbnN0YW50cy5GT1JNQVRfR0lGKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBORyIsIEZJTEVfVFlQRV9QTkcsICJpbWFnZS9wbmciLCBNdHBDb25zdGFudHMuRk9STUFUX1BORyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJCTVAiLCBGSUxFX1RZUEVfQk1QLCAiaW1hZ2UveC1tcy1ibXAiLCBNdHBDb25zdGFudHMuRk9STUFUX0JNUCk7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJXQk1QIiwgRklMRV9UWVBFX1dCTVAsICJpbWFnZS92bmQud2FwLndibXAiKTsKICAKLSAgICAgICAgYWRkRmlsZVR5cGUoIk0zVSIsIEZJTEVfVFlQRV9NM1UsICJhdWRpby94LW1wZWd1cmwiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIlBMUyIsIEZJTEVfVFlQRV9QTFMsICJhdWRpby94LXNjcGxzIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJXUEwiLCBGSUxFX1RZUEVfV1BMLCAiYXBwbGljYXRpb24vdm5kLm1zLXdwbCIpOworICAgICAgICBhZGRGaWxlVHlwZSgiTTNVIiwgRklMRV9UWVBFX00zVSwgImF1ZGlvL3gtbXBlZ3VybCIsIE10cENvbnN0YW50cy5GT1JNQVRfTTNVX1BMQVlMSVNUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBMUyIsIEZJTEVfVFlQRV9QTFMsICJhdWRpby94LXNjcGxzIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9QTFNfUExBWUxJU1QpOworICAgICAgICBhZGRGaWxlVHlwZSgiV1BMIiwgRklMRV9UWVBFX1dQTCwgImFwcGxpY2F0aW9uL3ZuZC5tcy13cGwiLCBNdHBDb25zdGFudHMuRk9STUFUX1dQTF9QTEFZTElTVCk7CiAKLSAgICAgICAgLy8gY29tcHV0ZSBmaWxlIGV4dGVuc2lvbnMgbGlzdCBmb3IgbmF0aXZlIE1lZGlhIFNjYW5uZXIKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHNGaWxlVHlwZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgIH0gCi0gICAgICAgIHNGaWxlRXh0ZW5zaW9ucyA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlRYVCIsIEZJTEVfVFlQRV9URVhULCAidGV4dC9wbGFpbiIsIE10cENvbnN0YW50cy5GT1JNQVRfVEVYVCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJIVE0iLCBGSUxFX1RZUEVfSFRNTCwgInRleHQvaHRtbCIsIE10cENvbnN0YW50cy5GT1JNQVRfSFRNTCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJIVE1MIiwgRklMRV9UWVBFX0hUTUwsICJ0ZXh0L2h0bWwiLCBNdHBDb25zdGFudHMuRk9STUFUX0hUTUwpOworICAgICAgICBhZGRGaWxlVHlwZSgiUERGIiwgRklMRV9UWVBFX1BERiwgImFwcGxpY2F0aW9uL3BkZiIpOworICAgICAgICBhZGRGaWxlVHlwZSgiRE9DIiwgRklMRV9UWVBFX01TX1dPUkQsICJhcHBsaWNhdGlvbi9tc3dvcmQiLCBNdHBDb25zdGFudHMuRk9STUFUX01TX1dPUkRfRE9DVU1FTlQpOworICAgICAgICBhZGRGaWxlVHlwZSgiWExTIiwgRklMRV9UWVBFX01TX0VYQ0VMLCAiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJQUFQiLCBGSUxFX1RZUEVfTVNfUE9XRVJQT0lOVCwgImFwcGxpY2F0aW9uL21zcG93ZXJwb2ludCIsIE10cENvbnN0YW50cy5GT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04pOworICAgICAgICBhZGRGaWxlVHlwZSgiRkxBQyIsIEZJTEVfVFlQRV9GTEFDLCAiYXVkaW8vZmxhYyIsIE10cENvbnN0YW50cy5GT1JNQVRfRkxBQyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJaSVAiLCBGSUxFX1RZUEVfWklQLCAiYXBwbGljYXRpb24vemlwIik7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXVkaW9GaWxlVHlwZShpbnQgZmlsZVR5cGUpIHsKICAgICAgICAgcmV0dXJuICgoZmlsZVR5cGUgPj0gRklSU1RfQVVESU9fRklMRV9UWVBFICYmCiAgICAgICAgICAgICAgICAgZmlsZVR5cGUgPD0gTEFTVF9BVURJT19GSUxFX1RZUEUpIHx8CiAgICAgICAgICAgICAgICAgKGZpbGVUeXBlID49IEZJUlNUX01JRElfRklMRV9UWVBFICYmCiAgICAgICAgICAgICAgICAgZmlsZVR5cGUgPD0gTEFTVF9NSURJX0ZJTEVfVFlQRSkpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZpZGVvRmlsZVR5cGUoaW50IGZpbGVUeXBlKSB7CiAgICAgICAgIHJldHVybiAoZmlsZVR5cGUgPj0gRklSU1RfVklERU9fRklMRV9UWVBFICYmCiAgICAgICAgICAgICAgICAgZmlsZVR5cGUgPD0gTEFTVF9WSURFT19GSUxFX1RZUEUpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ltYWdlRmlsZVR5cGUoaW50IGZpbGVUeXBlKSB7CiAgICAgICAgIHJldHVybiAoZmlsZVR5cGUgPj0gRklSU1RfSU1BR0VfRklMRV9UWVBFICYmCiAgICAgICAgICAgICAgICAgZmlsZVR5cGUgPD0gTEFTVF9JTUFHRV9GSUxFX1RZUEUpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXlMaXN0RmlsZVR5cGUoaW50IGZpbGVUeXBlKSB7CiAgICAgICAgIHJldHVybiAoZmlsZVR5cGUgPj0gRklSU1RfUExBWUxJU1RfRklMRV9UWVBFICYmCiAgICAgICAgICAgICAgICAgZmlsZVR5cGUgPD0gTEFTVF9QTEFZTElTVF9GSUxFX1RZUEUpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFGaWxlVHlwZSBnZXRGaWxlVHlwZShTdHJpbmcgcGF0aCkgewogICAgICAgICBpbnQgbGFzdERvdCA9IHBhdGgubGFzdEluZGV4T2YoIi4iKTsKICAgICAgICAgaWYgKGxhc3REb3QgPCAwKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIHJldHVybiBzRmlsZVR5cGVNYXAuZ2V0KHBhdGguc3Vic3RyaW5nKGxhc3REb3QgKyAxKS50b1VwcGVyQ2FzZSgpKTsKICAgICB9Ci0gICAgCisKKyAgICAvLyBnZW5lcmF0ZXMgYSB0aXRsZSBiYXNlZCBvbiBmaWxlIG5hbWUKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlVGl0bGUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgLy8gZXh0cmFjdCBmaWxlIG5hbWUgYWZ0ZXIgbGFzdCBzbGFzaAorICAgICAgICBpbnQgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICBpZiAobGFzdFNsYXNoID49IDApIHsKKyAgICAgICAgICAgIGxhc3RTbGFzaCsrOworICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA8IHBhdGgubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcobGFzdFNsYXNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB0cnVuY2F0ZSB0aGUgZmlsZSBleHRlbnNpb24gKGlmIGFueSkKKyAgICAgICAgaW50IGxhc3REb3QgPSBwYXRoLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChsYXN0RG90ID4gMCkgeworICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGxhc3REb3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEZpbGVUeXBlRm9yTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CiAgICAgICAgIEludGVnZXIgdmFsdWUgPSBzTWltZVR5cGVNYXAuZ2V0KG1pbWVUeXBlKTsKICAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmludFZhbHVlKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1pbWVUeXBlRm9yRmlsZShTdHJpbmcgcGF0aCkgeworICAgICAgICBNZWRpYUZpbGVUeXBlIG1lZGlhRmlsZVR5cGUgPSBnZXRGaWxlVHlwZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIChtZWRpYUZpbGVUeXBlID09IG51bGwgPyBudWxsIDogbWVkaWFGaWxlVHlwZS5taW1lVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9ybWF0Q29kZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IHNNaW1lVHlwZVRvRm9ybWF0TWFwLmdldChtaW1lVHlwZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBsYXN0RG90ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGxhc3REb3QgPiAwKSB7CisgICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTsKKyAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSBzRmlsZVR5cGVUb0Zvcm1hdE1hcC5nZXQoZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5GT1JNQVRfVU5ERUZJTkVEOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1pbWVUeXBlRm9yRm9ybWF0Q29kZShpbnQgZm9ybWF0Q29kZSkgeworICAgICAgICByZXR1cm4gc0Zvcm1hdFRvTWltZVR5cGVNYXAuZ2V0KGZvcm1hdENvZGUpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCmluZGV4IDM0YTg2ZWMuLmRkMTk0NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQpAQCAtNzIsNiArNzIsOSBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhdGg7CiAgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvciBtRmQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QcmVwYXJlQXV4aWxpYXJ5RmlsZSA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoQXV4OworICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3IgbUZkQXV4OwogICAgIHByaXZhdGUgRXZlbnRIYW5kbGVyIG1FdmVudEhhbmRsZXI7CiAgICAgcHJpdmF0ZSBPbkVycm9yTGlzdGVuZXIgbU9uRXJyb3JMaXN0ZW5lcjsKICAgICBwcml2YXRlIE9uSW5mb0xpc3RlbmVyIG1PbkluZm9MaXN0ZW5lcjsKQEAgLTI3NCwxMSArMjc3LDM3IEBACiAgICAgICAgIHNldFZpZGVvRnJhbWVSYXRlKHByb2ZpbGUudmlkZW9GcmFtZVJhdGUpOwogICAgICAgICBzZXRWaWRlb1NpemUocHJvZmlsZS52aWRlb0ZyYW1lV2lkdGgsIHByb2ZpbGUudmlkZW9GcmFtZUhlaWdodCk7CiAgICAgICAgIHNldFZpZGVvRW5jb2RpbmdCaXRSYXRlKHByb2ZpbGUudmlkZW9CaXRSYXRlKTsKLSAgICAgICAgc2V0QXVkaW9FbmNvZGluZ0JpdFJhdGUocHJvZmlsZS5hdWRpb0JpdFJhdGUpOwotICAgICAgICBzZXRBdWRpb0NoYW5uZWxzKHByb2ZpbGUuYXVkaW9DaGFubmVscyk7Ci0gICAgICAgIHNldEF1ZGlvU2FtcGxpbmdSYXRlKHByb2ZpbGUuYXVkaW9TYW1wbGVSYXRlKTsKICAgICAgICAgc2V0VmlkZW9FbmNvZGVyKHByb2ZpbGUudmlkZW9Db2RlYyk7Ci0gICAgICAgIHNldEF1ZGlvRW5jb2Rlcihwcm9maWxlLmF1ZGlvQ29kZWMpOworICAgICAgICBpZiAocHJvZmlsZS5xdWFsaXR5ID49IENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9USU1FX0xBUFNFX0xPVyAmJgorICAgICAgICAgICAgIHByb2ZpbGUucXVhbGl0eSA8PSBDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCkgeworICAgICAgICAgICAgLy8gRW5hYmxlIHRpbWUgbGFwc2UuIEFsc28gZG9uJ3Qgc2V0IGF1ZGlvIGZvciB0aW1lIGxhcHNlLgorICAgICAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInRpbWUtbGFwc2UtZW5hYmxlPTEiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRBdWRpb0VuY29kaW5nQml0UmF0ZShwcm9maWxlLmF1ZGlvQml0UmF0ZSk7CisgICAgICAgICAgICBzZXRBdWRpb0NoYW5uZWxzKHByb2ZpbGUuYXVkaW9DaGFubmVscyk7CisgICAgICAgICAgICBzZXRBdWRpb1NhbXBsaW5nUmF0ZShwcm9maWxlLmF1ZGlvU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBzZXRBdWRpb0VuY29kZXIocHJvZmlsZS5hdWRpb0NvZGVjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB2aWRlbyBmcmFtZSBjYXB0dXJlIHJhdGUuIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2V0IGEgZGlmZmVyZW50IHZpZGVvIGZyYW1lIGNhcHR1cmUKKyAgICAgKiByYXRlIHRoYW4gdGhlIHJlY29yZGVkIHZpZGVvJ3MgcGxheWJhY2sgcmF0ZS4gQ3VycmVudGx5IHRoaXMgd29ya3Mgb25seSBmb3IgdGltZSBsYXBzZSBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGZwcyBSYXRlIGF0IHdoaWNoIGZyYW1lcyBzaG91bGQgYmUgY2FwdHVyZWQgaW4gZnJhbWVzIHBlciBzZWNvbmQuCisgICAgICogVGhlIGZwcyBjYW4gZ28gYXMgbG93IGFzIGRlc2lyZWQuIEhvd2V2ZXIgdGhlIGZhc3Rlc3QgZnBzIHdpbGwgYmUgbGltaXRlZCBieSB0aGUgaGFyZHdhcmUuCisgICAgICogRm9yIHJlc29sdXRpb25zIHRoYXQgY2FuIGJlIGNhcHR1cmVkIGJ5IHRoZSB2aWRlbyBjYW1lcmEsIHRoZSBmYXN0ZXN0IGZwcyBjYW4gYmUgY29tcHV0ZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuUGFyYW1ldGVycyNnZXRQcmV2aWV3RnBzUmFuZ2UoaW50W10pfS4gRm9yIGhpZ2hlcgorICAgICAqIHJlc29sdXRpb25zIHRoZSBmYXN0ZXN0IGZwcyBtYXkgYmUgbW9yZSByZXN0cmljdGl2ZS4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHJlY29yZGVyIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBmcmFtZXMgd2lsbCBiZSBjYXB0dXJlZCBhdCB0aGUKKyAgICAgKiBnaXZlbiByYXRlIGR1ZSB0byBjYW1lcmEvZW5jb2RlciBsaW1pdGF0aW9ucy4gSG93ZXZlciBpdCB0cmllcyB0byBiZSBhcyBjbG9zZSBhcworICAgICAqIHBvc3NpYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhcHR1cmVSYXRlKGRvdWJsZSBmcHMpIHsKKyAgICAgICAgZG91YmxlIHRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlID0gMSAvIGZwczsKKyAgICAgICAgaW50IHRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlTXMgPSAoaW50KSAoMTAwMCAqIHRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInRpbWUtYmV0d2Vlbi10aW1lLWxhcHNlLWZyYW1lLWNhcHR1cmU9JWQiLAorICAgICAgICAgICAgICAgICAgICB0aW1lQmV0d2VlbkZyYW1lQ2FwdHVyZU1zKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NDgsNiArNDc3LDk3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGV2ZWwgb2YgdGhlIGVuY29kZXIuIENhbGwgdGhpcyBiZWZvcmUgcHJlcGFyZSgpLgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kZXJMZXZlbCB0aGUgdmlkZW8gZW5jb2RlciBsZXZlbC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZpZGVvRW5jb2RlckxldmVsKGludCBlbmNvZGVyTGV2ZWwpIHsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLXBhcmFtLWVuY29kZXItbGV2ZWw9JWQiLCBlbmNvZGVyTGV2ZWwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhdXhpbGlhcnkgdGltZSBsYXBzZSB2aWRlbydzIHJlc29sdXRpb24gYW5kIGJpdHJhdGUuCisgICAgICoKKyAgICAgKiBUaGUgYXV4aWxpYXJ5IHZpZGVvJ3MgcmVzb2x1dGlvbiBhbmQgYml0cmF0ZSBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgQ2FtY29yZGVyUHJvZmlsZQorICAgICAqIHF1YWxpdHkgbGV2ZWwge0BsaW5rIGFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZSNRVUFMSVRZX0hJR0h9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRBdXhWaWRlb1BhcmFtZXRlcnMoKSB7CisgICAgICAgIENhbWNvcmRlclByb2ZpbGUgcHJvZmlsZSA9IENhbWNvcmRlclByb2ZpbGUuZ2V0KENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9ISUdIKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLWF1eC1wYXJhbS13aWR0aD0lZCIsIHByb2ZpbGUudmlkZW9GcmFtZVdpZHRoKSk7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ2aWRlby1hdXgtcGFyYW0taGVpZ2h0PSVkIiwgcHJvZmlsZS52aWRlb0ZyYW1lSGVpZ2h0KSk7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ2aWRlby1hdXgtcGFyYW0tZW5jb2RpbmctYml0cmF0ZT0lZCIsIHByb2ZpbGUudmlkZW9CaXRSYXRlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzcyBpbiB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgYXV4aWxpYXJ5IHRpbWUgbGFwc2UgdmlkZW8uIENhbGwgdGhpcyBiZWZvcmUKKyAgICAgKiBwcmVwYXJlKCkuCisgICAgICoKKyAgICAgKiBTZXRzIGZpbGUgZGVzY3JpcHRvciBhbmQgcGFyYW1ldGVycyBmb3IgYXV4aWxpYXJ5IHRpbWUgbGFwc2UgdmlkZW8uIFRpbWUgbGFwc2UgbW9kZQorICAgICAqIGNhbiBjYXB0dXJlIHZpZGVvICh1c2luZyB0aGUgc3RpbGwgY2FtZXJhKSBhdCByZXNvbHV0aW9ucyBoaWdoZXIgdGhhbiB0aGF0IGNhbiBiZQorICAgICAqIHBsYXllZCBiYWNrIG9uIHRoZSBkZXZpY2UuIFRoaXMgZnVuY3Rpb24gb3IKKyAgICAgKiB7QGxpbmsgI3NldEF1eGlsaWFyeU91dHB1dEZpbGUoU3RyaW5nKX0gZW5hYmxlIGNhcHR1cmUgb2YgYSBzbWFsbGVyIHZpZGVvIGluCisgICAgICogcGFyYWxsZWwgd2l0aCB0aGUgbWFpbiB0aW1lIGxhcHNlIHZpZGVvLCB3aGljaCBjYW4gYmUgdXNlZCB0byBwbGF5IGJhY2sgb24gdGhlCisgICAgICogZGV2aWNlLiBUaGUgc21hbGxlciB2aWRlbyBpcyBjcmVhdGVkIGJ5IGRvd25zYW1wbGluZyB0aGUgbWFpbiB2aWRlby4gVGhpcyBjYWxsIGlzCisgICAgICogb3B0aW9uYWwgYW5kIGRvZXMgbm90IGhhdmUgdG8gYmUgY2FsbGVkIGlmIHBhcmFsbGVsIGNhcHR1cmUgb2YgYSBkb3duc2FtcGxlZCB2aWRlbworICAgICAqIGlzIG5vdCBkZXNpcmVkLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHdoaWxlIHRoZSBtYWluIHZpZGVvIHJlc29sdXRpb24gYW5kIGJpdHJhdGUgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZQorICAgICAqIENhbWNvcmRlclByb2ZpbGUgaW4ge0BsaW5rICNzZXRQcm9maWxlKENhbWNvcmRlclByb2ZpbGUpfSwgdGhlIGF1eGlsaWFyeSB2aWRlbydzCisgICAgICogcmVzb2x1dGlvbiBhbmQgYml0cmF0ZSBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgQ2FtY29yZGVyUHJvZmlsZSBxdWFsaXR5IGxldmVsCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZSNRVUFMSVRZX0hJR0h9LiBBbGwgb3RoZXIgZW5jb2RpbmcgcGFyYW1ldGVycworICAgICAqIHJlbWFpbiB0aGUgc2FtZSBmb3IgdGhlIG1haW4gdmlkZW8gYW5kIHRoZSBhdXhpbGlhcnkgdmlkZW8uCisgICAgICoKKyAgICAgKiBFLmcuIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHRpbWUgbGFwc2UgcHJvZmlsZSBxdWFsaXR5IGxldmVsCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZSNRVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFB9IGJ1dCBjYW4gcGxheWJhY2sgYXQKKyAgICAgKiBtb3N0IDQ4MHAsIHRoZSBhcHBsaWNhdGlvbiBtaWdodCB3YW50IHRvIGNhcHR1cmUgYW4gYXV4aWxpYXJ5IHZpZGVvIG9mIHJlc29sdXRpb24KKyAgICAgKiA0ODBwIHVzaW5nIHRoaXMgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZCBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciB0byBiZSB3cml0dGVuIGludG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV4aWxpYXJ5T3V0cHV0RmlsZShGaWxlRGVzY3JpcHRvciBmZCkKKyAgICB7CisgICAgICAgIG1QcmVwYXJlQXV4aWxpYXJ5RmlsZSA9IHRydWU7CisgICAgICAgIG1QYXRoQXV4ID0gbnVsbDsKKyAgICAgICAgbUZkQXV4ID0gZmQ7CisgICAgICAgIHNldEF1eFZpZGVvUGFyYW1ldGVycygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3MgaW4gdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGF1eGlsaWFyeSB0aW1lIGxhcHNlIHZpZGVvLiBDYWxsIHRoaXMgYmVmb3JlCisgICAgICogcHJlcGFyZSgpLgorICAgICAqCisgICAgICogU2V0cyBmaWxlIHBhdGggYW5kIHBhcmFtZXRlcnMgZm9yIGF1eGlsaWFyeSB0aW1lIGxhcHNlIHZpZGVvLiBUaW1lIGxhcHNlIG1vZGUgY2FuCisgICAgICogY2FwdHVyZSB2aWRlbyAodXNpbmcgdGhlIHN0aWxsIGNhbWVyYSkgYXQgcmVzb2x1dGlvbnMgaGlnaGVyIHRoYW4gdGhhdCBjYW4gYmUKKyAgICAgKiBwbGF5ZWQgYmFjayBvbiB0aGUgZGV2aWNlLiBUaGlzIGZ1bmN0aW9uIG9yCisgICAgICoge0BsaW5rICNzZXRBdXhpbGlhcnlPdXRwdXRGaWxlKEZpbGVEZXNjcmlwdG9yKX0gZW5hYmxlIGNhcHR1cmUgb2YgYSBzbWFsbGVyCisgICAgICogdmlkZW8gaW4gcGFyYWxsZWwgd2l0aCB0aGUgbWFpbiB0aW1lIGxhcHNlIHZpZGVvLCB3aGljaCBjYW4gYmUgdXNlZCB0byBwbGF5IGJhY2sgb24KKyAgICAgKiB0aGUgZGV2aWNlLiBUaGUgc21hbGxlciB2aWRlbyBpcyBjcmVhdGVkIGJ5IGRvd25zYW1wbGluZyB0aGUgbWFpbiB2aWRlby4gVGhpcyBjYWxsCisgICAgICogaXMgb3B0aW9uYWwgYW5kIGRvZXMgbm90IGhhdmUgdG8gYmUgY2FsbGVkIGlmIHBhcmFsbGVsIGNhcHR1cmUgb2YgYSBkb3duc2FtcGxlZAorICAgICAqIHZpZGVvIGlzIG5vdCBkZXNpcmVkLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHdoaWxlIHRoZSBtYWluIHZpZGVvIHJlc29sdXRpb24gYW5kIGJpdHJhdGUgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZQorICAgICAqIENhbWNvcmRlclByb2ZpbGUgaW4ge0BsaW5rICNzZXRQcm9maWxlKENhbWNvcmRlclByb2ZpbGUpfSwgdGhlIGF1eGlsaWFyeSB2aWRlbydzCisgICAgICogcmVzb2x1dGlvbiBhbmQgYml0cmF0ZSBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgQ2FtY29yZGVyUHJvZmlsZSBxdWFsaXR5IGxldmVsCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZSNRVUFMSVRZX0hJR0h9LiBBbGwgb3RoZXIgZW5jb2RpbmcgcGFyYW1ldGVycworICAgICAqIHJlbWFpbiB0aGUgc2FtZSBmb3IgdGhlIG1haW4gdmlkZW8gYW5kIHRoZSBhdXhpbGlhcnkgdmlkZW8uCisgICAgICoKKyAgICAgKiBFLmcuIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHRpbWUgbGFwc2UgcHJvZmlsZSBxdWFsaXR5IGxldmVsCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZSNRVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFB9IGJ1dCBjYW4gcGxheWJhY2sgYXQKKyAgICAgKiBtb3N0IDQ4MHAsIHRoZSBhcHBsaWNhdGlvbiBtaWdodCB3YW50IHRvIGNhcHR1cmUgYW4gYXV4aWxpYXJ5IHZpZGVvIG9mIHJlc29sdXRpb24KKyAgICAgKiA0ODBwIHVzaW5nIHRoaXMgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRobmFtZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV4aWxpYXJ5T3V0cHV0RmlsZShTdHJpbmcgcGF0aCkKKyAgICB7CisgICAgICAgIG1QcmVwYXJlQXV4aWxpYXJ5RmlsZSA9IHRydWU7CisgICAgICAgIG1GZEF1eCA9IG51bGw7CisgICAgICAgIG1QYXRoQXV4ID0gcGF0aDsKKyAgICAgICAgc2V0QXV4VmlkZW9QYXJhbWV0ZXJzKCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUGFzcyBpbiB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWxlIHRvIGJlIHdyaXR0ZW4uIENhbGwgdGhpcyBhZnRlcgogICAgICAqIHNldE91dHB1dEZvcm1hdCgpIGJ1dCBiZWZvcmUgcHJlcGFyZSgpLgogICAgICAqCkBAIC00NzgsNiArNTk4LDggQEAKICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIF9zZXRPdXRwdXRGaWxlKEZpbGVEZXNjcmlwdG9yIGZkLCBsb25nIG9mZnNldCwgbG9uZyBsZW5ndGgpCiAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX3NldE91dHB1dEZpbGVBdXgoRmlsZURlc2NyaXB0b3IgZmQpCisgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX3ByZXBhcmUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgpAQCAtNTAzLDYgKzYyNSwyMiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJObyB2YWxpZCBvdXRwdXQgZmlsZSIpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QcmVwYXJlQXV4aWxpYXJ5RmlsZSkgeworICAgICAgICAgICAgaWYgKG1QYXRoQXV4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1QYXRoQXV4KTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBfc2V0T3V0cHV0RmlsZUF1eChmb3MuZ2V0RkQoKSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtRmRBdXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9zZXRPdXRwdXRGaWxlQXV4KG1GZEF1eCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm8gdmFsaWQgb3V0cHV0IGZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIF9wcmVwYXJlKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKaW5kZXggMzMzMzI2OC4uZTVmYTBmOCAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5BdWRpbzsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuRmlsZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkltYWdlczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuVmlkZW87CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkF1ZGlvLkdlbnJlczsKQEAgLTEwOSw0MSArMTEwLDMyIEBACiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIk1lZGlhU2Nhbm5lciI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBVURJT19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIEF1ZGlvLk1lZGlhLl9JRCwgLy8gMAotICAgICAgICAgICAgQXVkaW8uTWVkaWEuREFUQSwgLy8gMQotICAgICAgICAgICAgQXVkaW8uTWVkaWEuREFURV9NT0RJRklFRCwgLy8gMgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZJTEVTX1BSRVNDQU5fUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEsIC8vIDEKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLkZPUk1BVCwgLy8gMgorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuREFURV9NT0RJRklFRCwgLy8gMwogICAgIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVESU9fQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFUSF9BVURJT19DT0xVTU5fSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRFX01PRElGSUVEX0FVRElPX0NPTFVNTl9JTkRFWCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWSURFT19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIFZpZGVvLk1lZGlhLl9JRCwgLy8gMAotICAgICAgICAgICAgVmlkZW8uTWVkaWEuREFUQSwgLy8gMQotICAgICAgICAgICAgVmlkZW8uTWVkaWEuREFURV9NT0RJRklFRCwgLy8gMgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElEX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuX0lELAogICAgIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfVklERU9fQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFUSF9WSURFT19DT0xVTU5fSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRFX01PRElGSUVEX1ZJREVPX0NPTFVNTl9JTkRFWCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVTX1BSRVNDQU5fSURfQ09MVU1OX0lOREVYID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRVNfUFJFU0NBTl9QQVRIX0NPTFVNTl9JTkRFWCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVTX1BSRVNDQU5fRk9STUFUX0NPTFVNTl9JTkRFWCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVTX1BSRVNDQU5fREFURV9NT0RJRklFRF9DT0xVTU5fSU5ERVggPSAzOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSU1BR0VTX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgSW1hZ2VzLk1lZGlhLl9JRCwgLy8gMAotICAgICAgICAgICAgSW1hZ2VzLk1lZGlhLkRBVEEsIC8vIDEKLSAgICAgICAgICAgIEltYWdlcy5NZWRpYS5EQVRFX01PRElGSUVELCAvLyAyCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUVESUFfUFJFU0NBTl9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQSwgLy8gMQorICAgICAgICAgICAgTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFURV9NT0RJRklFRCwgLy8gMgogICAgIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVEhfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEVfTU9ESUZJRURfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1BSRVNDQU5fSURfQ09MVU1OX0lOREVYID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfUFJFU0NBTl9QQVRIX0NPTFVNTl9JTkRFWCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1BSRVNDQU5fREFURV9NT0RJRklFRF9DT0xVTU5fSU5ERVggPSAyOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUExBWUxJU1RTX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgQXVkaW8uUGxheWxpc3RzLl9JRCwgLy8gMAotICAgICAgICAgICAgQXVkaW8uUGxheWxpc3RzLkRBVEEsIC8vIDEKLSAgICAgICAgICAgIEF1ZGlvLlBsYXlsaXN0cy5EQVRFX01PRElGSUVELCAvLyAyCi0gICAgfTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBMQVlMSVNUX01FTUJFUlNfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICBBdWRpby5QbGF5bGlzdHMuTWVtYmVycy5QTEFZTElTVF9JRCwgLy8gMApAQCAtMzA0LDcgKzI5Niw5IEBACiAgICAgcHJpdmF0ZSBVcmkgbVRodW1ic1VyaTsKICAgICBwcml2YXRlIFVyaSBtR2VucmVzVXJpOwogICAgIHByaXZhdGUgVXJpIG1QbGF5bGlzdHNVcmk7CisgICAgcHJpdmF0ZSBVcmkgbUZpbGVzVXJpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUHJvY2Vzc1BsYXlsaXN0cywgbVByb2Nlc3NHZW5yZXM7CisgICAgcHJpdmF0ZSBpbnQgbU10cE9iamVjdEhhbmRsZTsKIAogICAgIC8vIHVzZWQgd2hlbiBzY2FubmluZyB0aGUgaW1hZ2UgZGF0YWJhc2Ugc28gd2Uga25vdyB3aGV0aGVyIHdlIGhhdmUgdG8gcHJ1bmUKICAgICAvLyBvbGQgdGh1bWJuYWlsIGZpbGVzCkBAIC0zMzksMjEgKzMzMywyMyBAQAogICAgICAgICBsb25nIG1Sb3dJZDsKICAgICAgICAgU3RyaW5nIG1QYXRoOwogICAgICAgICBsb25nIG1MYXN0TW9kaWZpZWQ7CisgICAgICAgIGludCBtRm9ybWF0OwogICAgICAgICBib29sZWFuIG1TZWVuSW5GaWxlU3lzdGVtOwogICAgICAgICBib29sZWFuIG1MYXN0TW9kaWZpZWRDaGFuZ2VkOwogCi0gICAgICAgIEZpbGVDYWNoZUVudHJ5KFVyaSB0YWJsZVVyaSwgbG9uZyByb3dJZCwgU3RyaW5nIHBhdGgsIGxvbmcgbGFzdE1vZGlmaWVkKSB7CisgICAgICAgIEZpbGVDYWNoZUVudHJ5KFVyaSB0YWJsZVVyaSwgbG9uZyByb3dJZCwgU3RyaW5nIHBhdGgsIGxvbmcgbGFzdE1vZGlmaWVkLCBpbnQgZm9ybWF0KSB7CiAgICAgICAgICAgICBtVGFibGVVcmkgPSB0YWJsZVVyaTsKICAgICAgICAgICAgIG1Sb3dJZCA9IHJvd0lkOwogICAgICAgICAgICAgbVBhdGggPSBwYXRoOwogICAgICAgICAgICAgbUxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKKyAgICAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgICAgICBtU2VlbkluRmlsZVN5c3RlbSA9IGZhbHNlOwogICAgICAgICAgICAgbUxhc3RNb2RpZmllZENoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QYXRoOworICAgICAgICAgICAgcmV0dXJuIG1QYXRoICsgIiBtVGFibGVVcmk6ICIgKyBtVGFibGVVcmkgKyAiIG1Sb3dJZDogIiArIG1Sb3dJZDsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDMxLDYgKzQyNyw5IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1NaW1lVHlwZSA9IG51bGw7CisgICAgICAgICAgICBtRmlsZVR5cGUgPSAwOworICAgICAgICAgICAgbUZpbGVTaXplID0gZmlsZVNpemU7CisKICAgICAgICAgICAgIC8vIHRyeSBtaW1lVHlwZSBmaXJzdCwgaWYgaXQgaXMgc3BlY2lmaWVkCiAgICAgICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1GaWxlVHlwZSA9IE1lZGlhRmlsZS5nZXRGaWxlVHlwZUZvck1pbWVUeXBlKG1pbWVUeXBlKTsKQEAgLTQzOCw3ICs0MzcsNiBAQAogICAgICAgICAgICAgICAgICAgICBtTWltZVR5cGUgPSBtaW1lVHlwZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmlsZVNpemUgPSBmaWxlU2l6ZTsKIAogICAgICAgICAgICAgLy8gaWYgbWltZVR5cGUgd2FzIG5vdCBzcGVjaWZpZWQsIGNvbXB1dGUgZmlsZSB0eXBlIGJhc2VkIG9uIGZpbGUgZXh0ZW5zaW9uLgogICAgICAgICAgICAgaWYgKG1NaW1lVHlwZSA9PSBudWxsKSB7CkBAIC00NTUsNyArNDUzLDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBGaWxlQ2FjaGVFbnRyeSBlbnRyeSA9IG1GaWxlQ2FjaGUuZ2V0KGtleSk7CiAgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IEZpbGVDYWNoZUVudHJ5KG51bGwsIDAsIHBhdGgsIDApOworICAgICAgICAgICAgICAgIFVyaSB0YWJsZVVyaTsKKyAgICAgICAgICAgICAgICBpZiAoTWVkaWFGaWxlLmlzVmlkZW9GaWxlVHlwZShtRmlsZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlVXJpID0gbVZpZGVvVXJpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFGaWxlLmlzSW1hZ2VGaWxlVHlwZShtRmlsZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlVXJpID0gbUltYWdlc1VyaTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lZGlhRmlsZS5pc0F1ZGlvRmlsZVR5cGUobUZpbGVUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZVVyaSA9IG1BdWRpb1VyaTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0YWJsZVVyaSA9IG1GaWxlc1VyaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgRmlsZUNhY2hlRW50cnkodGFibGVVcmksIDAsIHBhdGgsIDAsIDApOwogICAgICAgICAgICAgICAgIG1GaWxlQ2FjaGUucHV0KGtleSwgZW50cnkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZW50cnkubVNlZW5JbkZpbGVTeXN0ZW0gPSB0cnVlOwpAQCAtNTAwLDcgKzUwOCw4IEBACiAgICAgICAgICAgICBkb1NjYW5GaWxlKHBhdGgsIG1pbWVUeXBlLCBsYXN0TW9kaWZpZWQsIGZpbGVTaXplLCBmYWxzZSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVXJpIGRvU2NhbkZpbGUoU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSwgbG9uZyBsYXN0TW9kaWZpZWQsIGxvbmcgZmlsZVNpemUsIGJvb2xlYW4gc2NhbkFsd2F5cykgeworICAgICAgICBwdWJsaWMgVXJpIGRvU2NhbkZpbGUoU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSwgbG9uZyBsYXN0TW9kaWZpZWQsCisgICAgICAgICAgICAgICAgbG9uZyBmaWxlU2l6ZSwgYm9vbGVhbiBzY2FuQWx3YXlzKSB7CiAgICAgICAgICAgICBVcmkgcmVzdWx0ID0gbnVsbDsKIC8vICAgICAgICAgICAgbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTUxNSw3ICs1MjQsOSBAQAogICAgICAgICAgICAgICAgICAgICBib29sZWFuIG11c2ljID0gKGxvd3BhdGguaW5kZXhPZihNVVNJQ19ESVIpID4gMCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICghcmluZ3RvbmVzICYmICFub3RpZmljYXRpb25zICYmICFhbGFybXMgJiYgIXBvZGNhc3RzKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIU1lZGlhRmlsZS5pc0ltYWdlRmlsZVR5cGUobUZpbGVUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGV4dHJhY3QgbWV0YWRhdGEgZm9yIGF1ZGlvIGFuZCB2aWRlbyBmaWxlcworICAgICAgICAgICAgICAgICAgICBpZiAoTWVkaWFGaWxlLmlzQXVkaW9GaWxlVHlwZShtRmlsZVR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgTWVkaWFGaWxlLmlzVmlkZW9GaWxlVHlwZShtRmlsZVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShwYXRoLCBtaW1lVHlwZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNTU1LDcgKzU2Niw4IEBACiAgICAgICAgICAgICAgICAgbVRpdGxlID0gdmFsdWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYXJ0aXN0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJhcnRpc3Q7IikpIHsKICAgICAgICAgICAgICAgICBtQXJ0aXN0ID0gdmFsdWUudHJpbSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImFsYnVtYXJ0aXN0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJhbGJ1bWFydGlzdDsiKSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImFsYnVtYXJ0aXN0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJhbGJ1bWFydGlzdDsiKQorICAgICAgICAgICAgICAgICAgICB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJhbmQiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImJhbmQ7IikpIHsKICAgICAgICAgICAgICAgICBtQWxidW1BcnRpc3QgPSB2YWx1ZS50cmltKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYWxidW0iKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImFsYnVtOyIpKSB7CiAgICAgICAgICAgICAgICAgbUFsYnVtID0gdmFsdWUudHJpbSgpOwpAQCAtNjU0LDIxICs2NjYsNiBAQAogICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxhcm1zLCBib29sZWFuIG11c2ljLCBib29sZWFuIHBvZGNhc3RzKQogICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAgICAgLy8gdXBkYXRlIGRhdGFiYXNlCi0gICAgICAgICAgICBVcmkgdGFibGVVcmk7Ci0gICAgICAgICAgICBib29sZWFuIGlzQXVkaW8gPSBNZWRpYUZpbGUuaXNBdWRpb0ZpbGVUeXBlKG1GaWxlVHlwZSk7Ci0gICAgICAgICAgICBib29sZWFuIGlzVmlkZW8gPSBNZWRpYUZpbGUuaXNWaWRlb0ZpbGVUeXBlKG1GaWxlVHlwZSk7Ci0gICAgICAgICAgICBib29sZWFuIGlzSW1hZ2UgPSBNZWRpYUZpbGUuaXNJbWFnZUZpbGVUeXBlKG1GaWxlVHlwZSk7Ci0gICAgICAgICAgICBpZiAoaXNWaWRlbykgewotICAgICAgICAgICAgICAgIHRhYmxlVXJpID0gbVZpZGVvVXJpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0ltYWdlKSB7Ci0gICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtSW1hZ2VzVXJpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0F1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtQXVkaW9Vcmk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCBmaWxlIHRvIGRhdGFiYXNlIGlmIG5vdCBhdWRpbywgdmlkZW8gb3IgaW1hZ2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudHJ5Lm1UYWJsZVVyaSA9IHRhYmxlVXJpOwogCiAgICAgICAgICAgICAgLy8gdXNlIGFsYnVtIGFydGlzdCBpZiBhcnRpc3QgaXMgbWlzc2luZwogICAgICAgICAgICAgaWYgKG1BcnRpc3QgPT0gbnVsbCB8fCBtQXJ0aXN0Lmxlbmd0aCgpID09IDApIHsKQEAgLTY3OCwyMCArNjc1LDcgQEAKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gdG9WYWx1ZXMoKTsKICAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IHZhbHVlcy5nZXRBc1N0cmluZyhNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5USVRMRSk7CiAgICAgICAgICAgICBpZiAodGl0bGUgPT0gbnVsbCB8fCBUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZS50cmltKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGl0bGUgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQSk7Ci0gICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBmaWxlIG5hbWUgYWZ0ZXIgbGFzdCBzbGFzaAotICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSB0aXRsZS5sYXN0SW5kZXhPZignLycpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBsYXN0U2xhc2grKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA8IHRpdGxlLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnN1YnN0cmluZyhsYXN0U2xhc2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHRydW5jYXRlIHRoZSBmaWxlIGV4dGVuc2lvbiAoaWYgYW55KQotICAgICAgICAgICAgICAgIGludCBsYXN0RG90ID0gdGl0bGUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgICAgICBpZiAobGFzdERvdCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5zdWJzdHJpbmcoMCwgbGFzdERvdCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRpdGxlID0gTWVkaWFGaWxlLmdldEZpbGVUaXRsZSh2YWx1ZXMuZ2V0QXNTdHJpbmcoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQSkpOwogICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuVElUTEUsIHRpdGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN0cmluZyBhbGJ1bSA9IHZhbHVlcy5nZXRBc1N0cmluZyhBdWRpby5NZWRpYS5BTEJVTSk7CkBAIC03MTUsNyArNjk5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsb25nIHJvd0lkID0gZW50cnkubVJvd0lkOwotICAgICAgICAgICAgaWYgKGlzQXVkaW8gJiYgcm93SWQgPT0gMCkgeworICAgICAgICAgICAgaWYgKE1lZGlhRmlsZS5pc0F1ZGlvRmlsZVR5cGUobUZpbGVUeXBlKSAmJiAocm93SWQgPT0gMCB8fCBtTXRwT2JqZWN0SGFuZGxlICE9IDApKSB7CiAgICAgICAgICAgICAgICAgLy8gT25seSBzZXQgdGhlc2UgZm9yIG5ldyBlbnRyaWVzLiBGb3IgZXhpc3RpbmcgZW50cmllcywgdGhleQogICAgICAgICAgICAgICAgIC8vIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgbGF0ZXIsIGFuZCB3ZSB3YW50IHRvIGtlZXAgdGhlIGN1cnJlbnQKICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgc28gdGhhdCBjdXN0b20gcmluZ3RvbmVzIHN0aWxsIHNob3cgdXAgaW4gdGhlIHJpbmd0b25lCkBAIC03NjgsOCArNzUyLDE1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBVcmkgdGFibGVVcmkgPSBlbnRyeS5tVGFibGVVcmk7CiAgICAgICAgICAgICBVcmkgcmVzdWx0ID0gbnVsbDsKICAgICAgICAgICAgIGlmIChyb3dJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1NdHBPYmplY3RIYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLk1FRElBX1NDQU5ORVJfTkVXX09CSkVDVF9JRCwgbU10cE9iamVjdEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0YWJsZVVyaSA9PSBtRmlsZXNVcmkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChGaWxlcy5GaWxlQ29sdW1ucy5GT1JNQVQsIE1lZGlhRmlsZS5nZXRGb3JtYXRDb2RlKGVudHJ5Lm1QYXRoLCBtTWltZVR5cGUpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gbmV3IGZpbGUsIGluc2VydCBpdAogICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1NZWRpYVByb3ZpZGVyLmluc2VydCh0YWJsZVVyaSwgdmFsdWVzKTsKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKQEAgLTg4NSw3ICs4NzYsNyBAQAogCiAgICAgfTsgLy8gZW5kIG9mIGFub255bW91cyBNZWRpYVNjYW5uZXJDbGllbnQgaW5zdGFuY2UKIAotICAgIHByaXZhdGUgdm9pZCBwcmVzY2FuKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHByZXNjYW4oU3RyaW5nIGZpbGVQYXRoLCBib29sZWFuIHByZXNjYW5GaWxlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIEN1cnNvciBjID0gbnVsbDsKICAgICAgICAgU3RyaW5nIHdoZXJlID0gbnVsbDsKICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG51bGw7CkBAIC05MDEsMTM4ICs4OTIsNDMgQEAKICAgICAgICAgICAgIG1QbGF5TGlzdHMuY2xlYXIoKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChmaWxlUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBxdWVyeSBmb3Igb25seSBvbmUgZmlsZQorICAgICAgICAgICAgd2hlcmUgPSBGaWxlcy5GaWxlQ29sdW1ucy5EQVRBICsgIj0/IjsKKyAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW10geyBmaWxlUGF0aCB9OworICAgICAgICB9CisKICAgICAgICAgLy8gQnVpbGQgdGhlIGxpc3Qgb2YgZmlsZXMgZnJvbSB0aGUgY29udGVudCBwcm92aWRlcgogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gUmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSBhdWRpbyB0YWJsZQotICAgICAgICAgICAgaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9IE1lZGlhU3RvcmUuQXVkaW8uTWVkaWEuREFUQSArICI9PyI7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbXSB7IGZpbGVQYXRoIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobUF1ZGlvVXJpLCBBVURJT19QUk9KRUNUSU9OLCB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7CisgICAgICAgICAgICBpZiAocHJlc2NhbkZpbGVzKSB7CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgcmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSBmaWxlcyB0YWJsZQogCi0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKElEX0FVRElPX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKFBBVEhfQVVESU9fQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKERBVEVfTU9ESUZJRURfQVVESU9fQ09MVU1OX0lOREVYKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBlbnRyaWVzIHdpdGggYWJzb2x1dGUgcGF0aCBuYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHN0b3JpbmcgVVJJcyBpbiB0aGUgZGF0YWJhc2Ugd2l0aG91dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lZGlhIHNjYW5uZXIgcmVtb3ZpbmcgdGhlbS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FzZUluc2Vuc2l0aXZlUGF0aHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZUNhY2hlLnB1dChrZXksIG5ldyBGaWxlQ2FjaGVFbnRyeShtQXVkaW9VcmksIHJvd0lkLCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSB2aWRlbyB0YWJsZQotICAgICAgICAgICAgaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9IE1lZGlhU3RvcmUuVmlkZW8uTWVkaWEuREFUQSArICI9PyI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdoZXJlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtVmlkZW9VcmksIFZJREVPX1BST0pFQ1RJT04sIHdoZXJlLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhJRF9WSURFT19DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZyhQQVRIX1ZJREVPX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhEQVRFX01PRElGSUVEX1ZJREVPX0NPTFVNTl9JTkRFWCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgZW50cmllcyB3aXRoIGFic29sdXRlIHBhdGggbmFtZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBzdG9yaW5nIFVSSXMgaW4gdGhlIGRhdGFiYXNlIHdpdGhvdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWRpYSBzY2FubmVyIHJlbW92aW5nIHRoZW0uCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhc2VJbnNlbnNpdGl2ZVBhdGhzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBuZXcgRmlsZUNhY2hlRW50cnkobVZpZGVvVXJpLCByb3dJZCwgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlYWQgZXhpc3RpbmcgZmlsZXMgZnJvbSB0aGUgaW1hZ2VzIHRhYmxlCi0gICAgICAgICAgICBpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdoZXJlID0gTWVkaWFTdG9yZS5JbWFnZXMuTWVkaWEuREFUQSArICI9PyI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdoZXJlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1PcmlnaW5hbENvdW50ID0gMDsKLSAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtSW1hZ2VzVXJpLCBJTUFHRVNfUFJPSkVDVElPTiwgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbU9yaWdpbmFsQ291bnQgPSBjLmdldENvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhJRF9JTUFHRVNfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoUEFUSF9JTUFHRVNfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjLmdldExvbmcoREFURV9NT0RJRklFRF9JTUFHRVNfQ09MVU1OX0lOREVYKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGVudHJpZXMgd2l0aCBhYnNvbHV0ZSBwYXRoIG5hbWVzLgotICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBzdG9yaW5nIFVSSXMgaW4gdGhlIGRhdGFiYXNlIHdpdGhvdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIG1lZGlhIHNjYW5uZXIgcmVtb3ZpbmcgdGhlbS4KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FzZUluc2Vuc2l0aXZlUGF0aHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZUNhY2hlLnB1dChrZXksIG5ldyBGaWxlQ2FjaGVFbnRyeShtSW1hZ2VzVXJpLCByb3dJZCwgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVByb2Nlc3NQbGF5bGlzdHMpIHsKLSAgICAgICAgICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIHBsYXlsaXN0cyB0YWJsZQotICAgICAgICAgICAgICAgIGlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoZXJlID0gTWVkaWFTdG9yZS5BdWRpby5QbGF5bGlzdHMuREFUQSArICI9PyI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd2hlcmUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobVBsYXlsaXN0c1VyaSwgUExBWUxJU1RTX1BST0pFQ1RJT04sIHdoZXJlLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobUZpbGVzVXJpLCBGSUxFU19QUkVTQ0FOX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7CiAKICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKFBBVEhfUExBWUxJU1RTX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhGSUxFU19QUkVTQ0FOX0lEX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKEZJTEVTX1BSRVNDQU5fUEFUSF9DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCA9IGMuZ2V0SW50KEZJTEVTX1BSRVNDQU5fRk9STUFUX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhGSUxFU19QUkVTQ0FOX0RBVEVfTU9ESUZJRURfQ09MVU1OX0lOREVYKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhJRF9QTEFZTElTVFNfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjLmdldExvbmcoREFURV9NT0RJRklFRF9QTEFZTElTVFNfQ09MVU1OX0lOREVYKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYXNlSW5zZW5zaXRpdmVQYXRocykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlQ2FjaGUucHV0KGtleSwgbmV3IEZpbGVDYWNoZUVudHJ5KG1QbGF5bGlzdHNVcmksIHJvd0lkLCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBlbnRyaWVzIHdpdGggYWJzb2x1dGUgcGF0aCBuYW1lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHN0b3JpbmcgVVJJcyBpbiB0aGUgZGF0YWJhc2Ugd2l0aG91dCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lZGlhIHNjYW5uZXIgcmVtb3ZpbmcgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FzZUluc2Vuc2l0aXZlUGF0aHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVDYWNoZUVudHJ5IGVudHJ5ID0gbmV3IEZpbGVDYWNoZUVudHJ5KG1GaWxlc1VyaSwgcm93SWQsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTA0MSw2ICs5MzcsMTQgQEAKICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyBjb21wdXRlIG9yaWdpbmFsIHNpemUgb2YgaW1hZ2VzCisgICAgICAgIG1PcmlnaW5hbENvdW50ID0gMDsKKyAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1JbWFnZXNVcmksIElEX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBtT3JpZ2luYWxDb3VudCA9IGMuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBpblNjYW5EaXJlY3RvcnkoU3RyaW5nIHBhdGgsIFN0cmluZ1tdIGRpcmVjdG9yaWVzKSB7CkBAIC0xMTA3LDEyICsxMDExLDE0IEBACiAgICAgICAgICAgICAvLyByZW1vdmUgZGF0YWJhc2UgZW50cmllcyBmb3IgZmlsZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCiAgICAgICAgICAgICBib29sZWFuIGZpbGVNaXNzaW5nID0gZmFsc2U7CiAKLSAgICAgICAgICAgIGlmICghZW50cnkubVNlZW5JbkZpbGVTeXN0ZW0pIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5TY2FuRGlyZWN0b3J5KHBhdGgsIGRpcmVjdG9yaWVzKSkgeworICAgICAgICAgICAgaWYgKCFlbnRyeS5tU2VlbkluRmlsZVN5c3RlbSAmJiAhTXRwQ29uc3RhbnRzLmlzQWJzdHJhY3RPYmplY3QoZW50cnkubUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkubUZvcm1hdCAhPSBNdHBDb25zdGFudHMuRk9STUFUX0FTU09DSUFUSU9OICYmCisgICAgICAgICAgICAgICAgICAgICAgICBpblNjYW5EaXJlY3RvcnkocGF0aCwgZGlyZWN0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRpZG4ndCBzZWUgdGhpcyBmaWxlIGluIHRoZSBzY2FuIGRpcmVjdG9yeS4KICAgICAgICAgICAgICAgICAgICAgZmlsZU1pc3NpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlIGlzIG91dHNpZGUgb2Ygb3VyIHNjYW4gZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmlsZSBhY3R1YWxseSBhIGRpcmVjdG9yeSBvciBvdGhlciBhYnN0cmFjdCBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgLy8gb3IgaXMgb3V0c2lkZSBvZiBvdXIgc2NhbiBkaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIGhlcmUuCiAgICAgICAgICAgICAgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXN0RmlsZS5leGlzdHMoKSkgewpAQCAtMTEzMiw5ICsxMDM4LDExIEBACiAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNZWRpYVN0b3JlLkF1ZGlvLlBsYXlsaXN0cy5EQVRBLCAiIik7CiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWVkaWFTdG9yZS5BdWRpby5QbGF5bGlzdHMuREFURV9NT0RJRklFRCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVByb3ZpZGVyLnVwZGF0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChtUGxheWxpc3RzVXJpLCBlbnRyeS5tUm93SWQpLCB2YWx1ZXMsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBtTWVkaWFQcm92aWRlci51cGRhdGUoQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQobVBsYXlsaXN0c1VyaSwgZW50cnkubVJvd0lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVByb3ZpZGVyLmRlbGV0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChlbnRyeS5tVGFibGVVcmksIGVudHJ5Lm1Sb3dJZCksIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBtTWVkaWFQcm92aWRlci5kZWxldGUoQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQobUZpbGVzVXJpLCBlbnRyeS5tUm93SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMTYyLDYgKzEwNzAsNyBAQAogICAgICAgICBtVmlkZW9VcmkgPSBWaWRlby5NZWRpYS5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOwogICAgICAgICBtSW1hZ2VzVXJpID0gSW1hZ2VzLk1lZGlhLmdldENvbnRlbnRVcmkodm9sdW1lTmFtZSk7CiAgICAgICAgIG1UaHVtYnNVcmkgPSBJbWFnZXMuVGh1bWJuYWlscy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOworICAgICAgICBtRmlsZXNVcmkgPSBGaWxlcy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOwogCiAgICAgICAgIGlmICghdm9sdW1lTmFtZS5lcXVhbHMoImludGVybmFsIikpIHsKICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBwbGF5bGlzdHMgb24gZXh0ZXJuYWwgbWVkaWEKQEAgLTExNzAsOSArMTA3OSwxMiBAQAogICAgICAgICAgICAgbUdlbnJlQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFVyaT4oKTsKICAgICAgICAgICAgIG1HZW5yZXNVcmkgPSBHZW5yZXMuZ2V0Q29udGVudFVyaSh2b2x1bWVOYW1lKTsKICAgICAgICAgICAgIG1QbGF5bGlzdHNVcmkgPSBQbGF5bGlzdHMuZ2V0Q29udGVudFVyaSh2b2x1bWVOYW1lKTsKLSAgICAgICAgICAgIC8vIGFzc3VtaW5nIGV4dGVybmFsIHN0b3JhZ2UgaXMgRkFUIChjYXNlIGluc2Vuc2l0aXZlKSwgZXhjZXB0IG9uIHRoZSBzaW11bGF0b3IuCi0gICAgICAgICAgICBpZiAoIFByb2Nlc3Muc3VwcG9ydHNQcm9jZXNzZXMoKSkgewotICAgICAgICAgICAgICAgIG1DYXNlSW5zZW5zaXRpdmVQYXRocyA9IHRydWU7CisKKyAgICAgICAgICAgIG1DYXNlSW5zZW5zaXRpdmVQYXRocyA9ICFtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfY2FzZVNlbnNpdGl2ZUV4dGVybmFsU3RvcmFnZSk7CisgICAgICAgICAgICBpZiAoIVByb2Nlc3Muc3VwcG9ydHNQcm9jZXNzZXMoKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRvciB1c2VzIGhvc3QgZmlsZSBzeXN0ZW0sIHNvIGl0IHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgICAgICAgICAgICBtQ2FzZUluc2Vuc2l0aXZlUGF0aHMgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTExODEsMTEgKzEwOTMsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIGluaXRpYWxpemUodm9sdW1lTmFtZSk7Ci0gICAgICAgICAgICBwcmVzY2FuKG51bGwpOworICAgICAgICAgICAgcHJlc2NhbihudWxsLCB0cnVlKTsKICAgICAgICAgICAgIGxvbmcgcHJlc2NhbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0RpcmVjdG9yeShkaXJlY3Rvcmllc1tpXSwgTWVkaWFGaWxlLnNGaWxlRXh0ZW5zaW9ucywgbUNsaWVudCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0RpcmVjdG9yeShkaXJlY3Rvcmllc1tpXSwgbUNsaWVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsb25nIHNjYW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIHBvc3RzY2FuKGRpcmVjdG9yaWVzKTsKQEAgLTEyMTIsNyArMTEyNCw3IEBACiAgICAgcHVibGljIFVyaSBzY2FuU2luZ2xlRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIHZvbHVtZU5hbWUsIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW5pdGlhbGl6ZSh2b2x1bWVOYW1lKTsKLSAgICAgICAgICAgIHByZXNjYW4ocGF0aCk7CisgICAgICAgICAgICBwcmVzY2FuKHBhdGgsIHRydWUpOwogCiAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKIApAQCAtMTIyNyw2ICsxMTM5LDM2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzY2FuTXRwRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIHZvbHVtZU5hbWUsIGludCBvYmplY3RIYW5kbGUsIGludCBmb3JtYXQpIHsKKyAgICAgICAgTWVkaWFGaWxlLk1lZGlhRmlsZVR5cGUgbWVkaWFGaWxlVHlwZSA9IE1lZGlhRmlsZS5nZXRGaWxlVHlwZShwYXRoKTsKKyAgICAgICAgaW50IGZpbGVUeXBlID0gKG1lZGlhRmlsZVR5cGUgPT0gbnVsbCA/IDAgOiBtZWRpYUZpbGVUeXBlLmZpbGVUeXBlKTsKKworICAgICAgICBpZiAoIU1lZGlhRmlsZS5pc0F1ZGlvRmlsZVR5cGUoZmlsZVR5cGUpICYmICFNZWRpYUZpbGUuaXNWaWRlb0ZpbGVUeXBlKGZpbGVUeXBlKSAmJgorICAgICAgICAgICAgIU1lZGlhRmlsZS5pc0ltYWdlRmlsZVR5cGUoZmlsZVR5cGUpICYmICFNZWRpYUZpbGUuaXNQbGF5TGlzdEZpbGVUeXBlKGZpbGVUeXBlKSkgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbU10cE9iamVjdEhhbmRsZSA9IG9iamVjdEhhbmRsZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluaXRpYWxpemUodm9sdW1lTmFtZSk7CisgICAgICAgICAgICAvLyBNVFAgd2lsbCBjcmVhdGUgYSBmaWxlIGVudHJ5IGZvciB1cyBzbyB3ZSBkb24ndCB3YW50IHRvIGRvIGl0IGluIHByZXNjYW4KKyAgICAgICAgICAgIHByZXNjYW4ocGF0aCwgZmFsc2UpOworCisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKworICAgICAgICAgICAgLy8gbGFzdE1vZGlmaWVkIGlzIGluIG1pbGxpc2Vjb25kcyBvbiBGaWxlcy4KKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkU2Vjb25kcyA9IGZpbGUubGFzdE1vZGlmaWVkKCkgLyAxMDAwOworCisgICAgICAgICAgICAvLyBhbHdheXMgc2NhbiB0aGUgZmlsZSwgc28gd2UgY2FuIHJldHVybiB0aGUgY29udGVudDovL21lZGlhIFVyaSBmb3IgZXhpc3RpbmcgZmlsZXMKKyAgICAgICAgICAgIG1DbGllbnQuZG9TY2FuRmlsZShwYXRoLCBtZWRpYUZpbGVUeXBlLm1pbWVUeXBlLCBsYXN0TW9kaWZpZWRTZWNvbmRzLCBmaWxlLmxlbmd0aCgpLCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBNZWRpYVNjYW5uZXIuc2NhbkZpbGUoKSIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbU10cE9iamVjdEhhbmRsZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgZmlsZS9kaXJlY3RvcnkgbmFtZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHJpZ2h0CiAgICAgcHJpdmF0ZSBpbnQgbWF0Y2hQYXRocyhTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgICAgICBpbnQgcmVzdWx0ID0gMDsKQEAgLTE1MDYsNyArMTQ0OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIFN0cmluZyBleHRlbnNpb25zLCBNZWRpYVNjYW5uZXJDbGllbnQgY2xpZW50KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCBjbGllbnQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgcHJvY2Vzc0ZpbGUoU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSwgTWVkaWFTY2FubmVyQ2xpZW50IGNsaWVudCk7CiAgICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldExvY2FsZShTdHJpbmcgbG9jYWxlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZGExZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ2xpZW50LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgTXRwQ2xpZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwQ2xpZW50IjsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXRwQ2xpZW50KExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG5hdGl2ZV9zZXR1cCgpOworICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJNdHBDbGllbnQ6IGxpc3RlbmVyIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBuYXRpdmVfc3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZU9iamVjdChpbnQgZGV2aWNlSUQsIGxvbmcgb2JqZWN0SUQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9kZWxldGVfb2JqZWN0KGRldmljZUlELCBvYmplY3RJRCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0UGFyZW50KGludCBkZXZpY2VJRCwgbG9uZyBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9wYXJlbnQoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTdG9yYWdlSUQoaW50IGRldmljZUlELCBsb25nIG9iamVjdElEKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdCBvdmVyIE1UUAorICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZShpbnQgZGV2aWNlSUQsIGxvbmcgb2JqZWN0SUQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9vcGVuX2ZpbGUoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKKyAgICAgICAgLy8gY2FsbGVkIHdoZW4gYSBuZXcgTVRQIGRldmljZSBoYXMgYmVlbiBkaXNjb3ZlcmVkCisgICAgICAgIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKTsKKworICAgICAgICAvLyBjYWxsZWQgd2hlbiBhbiBNVFAgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgdm9pZCBkZXZpY2VSZW1vdmVkKGludCBpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKSB7CisgICAgICAgIExvZy5kKFRBRywgImRldmljZUFkZGVkICIgKyBpZCk7CisgICAgICAgIG1MaXN0ZW5lci5kZXZpY2VBZGRlZChpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlUmVtb3ZlZChpbnQgaWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGV2aWNlUmVtb3ZlZCAiICsgaWQpOworICAgICAgICBtTGlzdGVuZXIuZGV2aWNlUmVtb3ZlZChpZCk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9zdGFydCgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3N0b3AoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9kZWxldGVfb2JqZWN0KGludCBkZXZpY2VJRCwgbG9uZyBvYmplY3RJRCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgbG9uZyBuYXRpdmVfZ2V0X3BhcmVudChpbnQgZGV2aWNlSUQsIGxvbmcgb2JqZWN0SUQpOworICAgIHByaXZhdGUgbmF0aXZlIGxvbmcgbmF0aXZlX2dldF9zdG9yYWdlX2lkKGludCBkZXZpY2VJRCwgbG9uZyBvYmplY3RJRCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmF0aXZlX29wZW5fZmlsZShpbnQgZGV2aWNlSUQsIGxvbmcgb2JqZWN0SUQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENvbnN0YW50cy5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZDMzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTXRwQ29uc3RhbnRzIHsKKworLy8gTVRQIFJlc3BvbnNlIENvZGVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfVU5ERUZJTkVEID0gMHgyMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09LID0gMHgyMDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0dFTkVSQUxfRVJST1IgPSAweDIwMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTiA9IDB4MjAwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1RSQU5TQUNUSU9OX0lEID0gMHgyMDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEID0gMHgyMDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1BBUkFNRVRFUl9OT1RfU1VQUE9SVEVEID0gMHgyMDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOQ09NUExFVEVfVFJBTlNGRVIgPSAweDIwMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEID0gMHgyMDA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRSA9IDB4MjAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEID0gMHgyMDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0ZPUk1BVF9DT0RFID0gMHgyMDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUT1JBR0VfRlVMTCA9IDB4MjAwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9PQkpFQ1RfV1JJVEVfUFJPVEVDVEVEID0gMHgyMDBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUT1JFX1JFQURfT05MWSA9IDB4MjAwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9BQ0NFU1NfREVOSUVEID0gMHgyMDBGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX05PX1RIVU1CTkFJTF9QUkVTRU5UID0gMHgyMDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NFTEZfVEVTVF9GQUlMRUQgPSAweDIwMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfUEFSVElBTF9ERUxFVElPTiA9IDB4MjAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVE9SRV9OT1RfQVZBSUxBQkxFID0gMHgyMDEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfRk9STUFUX1VOU1VQUE9SVEVEID0gMHgyMDE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX05PX1ZBTElEX09CSkVDVF9JTkZPID0gMHgyMDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfQ09ERV9GT1JNQVQgPSAweDIwMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfVU5LTk9XTl9WRU5ET1JfQ09ERSA9IDB4MjAxNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9DQVBUVVJFX0FMUkVBRFlfVEVSTUlOQVRFRCA9IDB4MjAxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9ERVZJQ0VfQlVTWSA9IDB4MjAxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1QgPSAweDIwMUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9GT1JNQVQgPSAweDIwMUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9WQUxVRSA9IDB4MjAxQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUiA9IDB4MjAxRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTiA9IDB4MjAxRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQgPSAweDIwMUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9PRl9ERVNUSU5BVElPTl9VTlNVUFBPUlRFRCA9IDB4MjAyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREUgPSAweEE4MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9GT1JNQVQgPSAweEE4MDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9WQUxVRSA9IDB4QTgwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9SRUZFUkVOQ0UgPSAweEE4MDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfR1JPVVBfTk9UX1NVUFBPUlRFRCA9IDB4QTgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX0RBVEFTRVQgPSAweEE4MDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9HUk9VUF9VTlNVUFBPUlRFRCA9IDB4QTgwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0RFUFRIX1VOU1VQUE9SVEVEID0gMHhBODA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09CSkVDVF9UT09fTEFSR0UgPSAweEE4MDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRCA9IDB4QTgwQTsKKworICAgIC8vIE1UUCBmb3JtYXQgY29kZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEID0gMHgzMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1NPQ0lBVElPTiA9IDB4MzAwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfU0NSSVBUID0gMHgzMDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FWEVDVVRBQkxFID0gMHgzMDAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9URVhUID0gMHgzMDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9IVE1MID0gMHgzMDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9EUE9GID0gMHgzMDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BSUZGID0gMHgzMDA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XQVYgPSAweDMwMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QMyA9IDB4MzAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQVZJID0gMHgzMDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUEVHID0gMHgzMDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU0YgPSAweDMwMEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RFRklORUQgPSAweDM4MDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VYSUZfSlBFRyA9IDB4MzgwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVElGRl9FUCA9IDB4MzgwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBU0hQSVggPSAweDM4MDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0JNUCA9IDB4MzgwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ0lGRiA9IDB4MzgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfR0lGID0gMHgzODA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KRklGID0gMHgzODA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DRCA9IDB4MzgwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUElDVCA9IDB4MzgwQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUE5HID0gMHgzODBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGID0gMHgzODBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0lUID0gMHgzODBFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KUDIgPSAweDM4MEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0pQWCA9IDB4MzgxMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFID0gMHhCODAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCA9IDB4Qjg4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0FVRElPID0gMHhCOTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XTUEgPSAweEI5MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX09HRyA9IDB4QjkwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUFDID0gMHhCOTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BVURJQkxFID0gMHhCOTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GTEFDID0gMHhCOTA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfVklERU8gPSAweEI5ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dNViA9IDB4Qjk4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVA0X0NPTlRBSU5FUiA9IDB4Qjk4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVAyID0gMHhCOTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF8zR1BfQ09OVEFJTkVSID0gMHhCOTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQ09MTEVDVElPTiA9IDB4QkEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfTVVMVElNRURJQV9BTEJVTSA9IDB4QkEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gPSAweEJBMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNID0gMHhCQTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9WSURFT19BTEJVTSA9IDB4QkEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgPSAweEJBMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAgPSAweEJBMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FU1NBR0VfRk9MREVSID0gMHhCQTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiA9IDB4QkEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QgPSAweEJBMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUID0gMHhCQTBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgPSAweEJBMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dQTF9QTEFZTElTVCA9IDB4QkExMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTTNVX1BMQVlMSVNUID0gMHhCQTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUExfUExBWUxJU1QgPSAweEJBMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTWF9QTEFZTElTVCA9IDB4QkExMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUExTX1BMQVlMSVNUID0gMHhCQTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQgPSAweEJBODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UID0gMHhCQTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9YTUxfRE9DVU1FTlQgPSAweEJBODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgPSAweEJBODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UID0gMHhCQTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCA9IDB4QkE4NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gPSAweEJBODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFID0gMHhCQjAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRVNTU0FHRSA9IDB4QkIwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgPSAweEJCODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QgPSAweEJCODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1ZDQVJEXzIgPSAweEJCODI7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYnN0cmFjdE9iamVjdChpbnQgZm9ybWF0KSB7CisgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU06CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9BVURJT19BTEJVTToKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1Q6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9DT05UQUNUX0dST1VQOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVI6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTjoKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1Q6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1Q6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVDoKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTVRQIG9iamVjdCBwcm9wZXJ0aWVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1RPUkFHRV9JRCA9IDB4REMwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PQkpFQ1RfRk9STUFUID0gMHhEQzAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTID0gMHhEQzAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9TSVpFID0gMHhEQzA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FTU09DSUFUSU9OX1RZUEUgPSAweERDMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVNTT0NJQVRJT05fREVTQyA9IDB4REMwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FID0gMHhEQzA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfQ1JFQVRFRCA9IDB4REMwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9EQVRFX01PRElGSUVEID0gMHhEQzA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0tFWVdPUkRTID0gMHhEQzBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BBUkVOVF9PQkpFQ1QgPSAweERDMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUxMT1dFRF9GT0xERVJfQ09OVEVOVFMgPSAweERDMEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSElEREVOID0gMHhEQzBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NZU1RFTV9PQkpFQ1QgPSAweERDMEU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQgPSAweERDNDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1lOQ19JRCA9IDB4REM0MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUk9QRVJUWV9CQUcgPSAweERDNDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTkFNRSA9IDB4REM0NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DUkVBVEVEX0JZID0gMHhEQzQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FSVElTVCA9IDB4REM0NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9EQVRFX0FVVEhPUkVEID0gMHhEQzQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RFU0NSSVBUSU9OID0gMHhEQzQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1VSTF9SRUZFUkVOQ0UgPSAweERDNDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTEFOR1VBR0VfTE9DQUxFID0gMHhEQzRBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NPUFlSSUdIVF9JTkZPUk1BVElPTiA9IDB4REM0QjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TT1VSQ0UgPSAweERDNEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT1JJR0lOX0xPQ0FUSU9OID0gMHhEQzREOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfQURERUQgPSAweERDNEU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTk9OX0NPTlNVTUFCTEUgPSAweERDNEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQ09SUlVQVF9VTlBMQVlBQkxFID0gMHhEQzUwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST0RVQ0VSX1NFUklBTF9OVU1CRVIgPSAweERDNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0ZPUk1BVCA9IDB4REM4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfU0laRSA9IDB4REM4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfSEVJR0hUID0gMHhEQzgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9XSURUSCA9IDB4REM4NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRFVSQVRJT04gPSAweERDODU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RBVEEgPSAweERDODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfV0lEVEggPSAweERDODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSEVJR0hUID0gMHhEQzg4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RVUkFUSU9OID0gMHhEQzg5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JBVElORyA9IDB4REM4QTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9UUkFDSyA9IDB4REM4QjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9HRU5SRSA9IDB4REM4QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DUkVESVRTID0gMHhEQzhEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0xZUklDUyA9IDB4REM4RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJTQ1JJUFRJT05fQ09OVEVOVF9JRCA9IDB4REM4RjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUk9EVUNFRF9CWSA9IDB4REM5MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9VU0VfQ09VTlQgPSAweERDOTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0tJUF9DT1VOVCA9IDB4REM5MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9MQVNUX0FDQ0VTU0VEID0gMHhEQzkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BBUkVOVEFMX1JBVElORyA9IDB4REM5NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVRBX0dFTlJFID0gMHhEQzk1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NPTVBPU0VSID0gMHhEQzk2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VGRkVDVElWRV9SQVRJTkcgPSAweERDOTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1VCVElUTEUgPSAweERDOTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFID0gMHhEQzk5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FMQlVNX05BTUUgPSAweERDOUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUxCVU1fQVJUSVNUID0gMHhEQzlCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01PT0QgPSAweERDOUM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRFJNX1NUQVRVUyA9IDB4REM5RDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJfREVTQ1JJUFRJT04gPSAweERDOUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSVNfQ1JPUFBFRCA9IDB4RENEMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JU19DT0xPVVJfQ09SUkVDVEVEID0gMHhEQ0QyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0lNQUdFX0JJVF9ERVBUSCA9IDB4RENEMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GX05VTUJFUiA9IDB4RENENDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FWFBPU1VSRV9USU1FID0gMHhEQ0Q1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VYUE9TVVJFX0lOREVYID0gMHhEQ0Q2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1RPVEFMX0JJVFJBVEUgPSAweERFOTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQklUUkFURV9UWVBFID0gMHhERTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NBTVBMRV9SQVRFID0gMHhERTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX05VTUJFUl9PRl9DSEFOTkVMUyA9IDB4REU5NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BVURJT19CSVRfREVQVEggPSAweERFOTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0NBTl9UWVBFID0gMHhERTk3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FVRElPX1dBVkVfQ09ERUMgPSAweERFOTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVVESU9fQklUUkFURSA9IDB4REU5QTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9WSURFT19GT1VSQ0NfQ09ERUMgPSAweERFOUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVklERU9fQklUUkFURSA9IDB4REU5QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GUkFNRVNfUEVSX1RIT1VTQU5EX1NFQ09ORFMgPSAweERFOUQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfS0VZRlJBTUVfRElTVEFOQ0UgPSAweERFOUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQlVGRkVSX1NJWkUgPSAweERFOUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU5DT0RJTkdfUVVBTElUWSA9IDB4REVBMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTkNPRElOR19QUk9GSUxFID0gMHhERUExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RJU1BMQVlfTkFNRSA9IDB4RENFMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CT0RZX1RFWFQgPSAweERDRTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1VCSkVDVCA9IDB4RENFMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUklPUklUWSA9IDB4RENFMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9HSVZFTl9OQU1FID0gMHhERDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01JRERMRV9OQU1FUyA9IDB4REQwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GQU1JTFlfTkFNRSA9IDB4REQwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUkVGSVggPSAweEREMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1VGRklYID0gMHhERDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FVElDX0dJVkVOX05BTUUgPSAweEREMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVUSUNfRkFNSUxZX05BTUUgPSAweEREMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfUFJJTUFSWSA9IDB4REQwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8xID0gMHhERDA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzIgPSAweEREMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMSA9IDB4REQwQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18yID0gMHhERDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX09USEVSUyA9IDB4REQwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfUFJJTUFSWSA9IDB4REQwRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUwgPSAweEREMEU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMXzIgPSAweEREMEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTID0gMHhERDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTU18yID0gMHhERDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEU9IDB4REQxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFXzIgPSAweEREMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRkFYX05VTUJFUl9QUklNQVJZID0gMHhERDE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZBWF9OVU1CRVJfUEVSU09OQUw9IDB4REQxNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GQVhfTlVNQkVSX0JVU0lORVNTPSAweEREMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEFHRVJfTlVNQkVSID0gMHhERDE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9PVEhFUlM9IDB4REQxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUklNQVJZX1dFQl9BRERSRVNTPSAweEREMTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEVSU09OQUxfV0VCX0FERFJFU1MgPSAweEREMUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQlVTSU5FU1NfV0VCX0FERFJFU1MgPSAweEREMUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTUyA9IDB4REQxQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzIgPSAweEREMUQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18zID0gMHhERDFFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0ZVTEwgPSAweEREMUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8xID0gMHhERDIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMiA9IDB4REQyMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DSVRZID0gMHhERDIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1JFR0lPTiA9IDB4REQyMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9QT1NUQUxfQ09ERSA9IDB4REQyNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DT1VOVFJZID0gMHhERDI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0ZVTEwgPSAweEREMjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8xID0gMHhERDI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMiA9IDB4REQyODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DSVRZID0gMHhERDI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1JFR0lPTiA9IDB4REQyQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19QT1NUQUxfQ09ERSA9IDB4REQyQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DT1VOVFJZID0gMHhERDJDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0ZVTEwgPSAweEREMkQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8xID0gMHhERDJFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMiA9IDB4REQyRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DSVRZID0gMHhERDMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1JFR0lPTiA9IDB4REQzMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9QT1NUQUxfQ09ERSA9IDB4REQzMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DT1VOVFJZID0gMHhERDMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09SR0FOSVpBVElPTl9OQU1FID0gMHhERDM0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FVElDX09SR0FOSVpBVElPTl9OQU1FID0gMHhERDM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JPTEUgPSAweEREMzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQklSVEhEQVRFID0gMHhERDM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfVE8gPSAweERENDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9DQyA9IDB4REQ0MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX0JDQyA9IDB4REQ0MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX1JFQUQgPSAweERENDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9SRUNFSVZFRF9USU1FID0gMHhERDQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfU0VOREVSID0gMHhERDQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX0JFR0lOX1RJTUUgPSAweERENTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfRU5EX1RJTUUgPSAweERENTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfTE9DQVRJT04gPSAweERENTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfUkVRVUlSRURfQVRURU5ERUVTID0gMHhERDU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX09QVElPTkFMX0FUVEVOREVFUyA9IDB4REQ1NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9SRVNPVVJDRVMgPSAweERENTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfQUNDRVBURUQgPSAweERENTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfVEVOVEFUSVZFID0gMHhERDU4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX0RFQ0xJTkVEID0gMHhERDU5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX1JFTUFJTkRFUl9USU1FID0gMHhERDVBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX09XTkVSID0gMHhERDVCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX1NUQVRVUyA9IDB4REQ1QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PV05FUiA9IDB4REQ1RDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FRElUT1IgPSAweERENUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfV0VCTUFTVEVSID0gMHhERDVGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1VSTF9TT1VSQ0UgPSAweERENjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVVJMX0RFU1RJTkFUSU9OID0gMHhERDYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1RJTUVfQk9PS01BUksgPSAweERENjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT0JKRUNUX0JPT0tNQVJLID0gMHhERDYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0JZVEVfQk9PS01BUksgPSAweERENjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTEFTVF9CVUlMRF9EQVRFID0gMHhERDcwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1RJTUVfVE9fTElWRSA9IDB4REQ3MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRURJQV9HVUlEID0gMHhERDcyOworCisgICAgLy8gTVRQIGRldmljZSBwcm9wZXJ0aWVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1VOREVGSU5FRCA9IDB4NTAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfQkFUVEVSWV9MRVZFTCA9IDB4NTAwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRlVOQ1RJT05BTF9NT0RFID0gMHg1MDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9JTUFHRV9TSVpFID0gMHg1MDAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9DT01QUkVTU0lPTl9TRVRUSU5HID0gMHg1MDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9XSElURV9CQUxBTkNFID0gMHg1MDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9SR0JfR0FJTiA9IDB4NTAwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRl9OVU1CRVIgPSAweDUwMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0ZPQ0FMX0xFTkdUSCA9IDB4NTAwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DVVNfRElTVEFOQ0UgPSAweDUwMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01PREUgPSAweDUwMEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX01FVEVSSU5HX01PREUgPSAweDUwMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0ZMQVNIX01PREUgPSAweDUwMEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUgPSAweDUwMEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1BST0dSQU1fTU9ERSA9IDB4NTAwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVggPSAweDUwMEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0JJQVNfQ09NUEVOU0FUSU9OID0gMHg1MDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9EQVRFVElNRSA9IDB4NTAxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfQ0FQVFVSRV9ERUxBWSA9IDB4NTAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU1RJTExfQ0FQVFVSRV9NT0RFID0gMHg1MDEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9DT05UUkFTVCA9IDB4NTAxNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU0hBUlBORVNTID0gMHg1MDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9ESUdJVEFMX1pPT00gPSAweDUwMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VGRkVDVF9NT0RFID0gMHg1MDE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9CVVJTVF9OVU1CRVI9IDB4NTAxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfQlVSU1RfSU5URVJWQUwgPSAweDUwMTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9OVU1CRVIgPSAweDUwMUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9JTlRFUlZBTCA9IDB4NTAxQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTUVURVJJTkdfTU9ERSA9IDB4NTAxQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVVBMT0FEX1VSTCA9IDB4NTAxRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfQVJUSVNUID0gMHg1MDFFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9DT1BZUklHSFRfSU5GTyA9IDB4NTAxRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVIgPSAweEQ0MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FID0gMHhENDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9WT0xVTUUgPSAweEQ0MDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1NVUFBPUlRFRF9GT1JNQVRTX09SREVSRUQgPSAweEQ0MDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RFVklDRV9JQ09OID0gMHhENDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19SQVRFID0gMHhENDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19PQkpFQ1QgPSAweEQ0MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX0NPTlRBSU5FUl9JTkRFWCA9IDB4RDQxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU0VTU0lPTl9JTklUSUFUT1JfVkVSU0lPTl9JTkZPID0gMHhENDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9QRVJDRUlWRURfREVWSUNFX1RZUEUgPSAweEQ0MDc7CisKKworICAgIC8qKgorICAgICAqIE9iamVjdCBpcyBub3QgcHJvdGVjdGVkLiBJdCBtYXkgYmUgbW9kaWZpZWQgYW5kIGRlbGV0ZWQsIGFuZCBpdHMgcHJvcGVydGllcworICAgICAqIG1heSBiZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19OT05FID0gMDsKKworICAgIC8qKgorICAgICAqIE9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkIG9yIGRlbGV0ZWQgYW5kIGl0cyBwcm9wZXJ0aWVzIGNhbiBub3QgYmUgbW9kaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfUkVBRF9PTkxZID0gMHg4MDAxOworCisgICAgLyoqCisgICAgICogT2JqZWN0IGNhbiBub3QgYmUgbW9kaWZpZWQgb3IgZGVsZXRlZCBidXQgaXRzIHByb3BlcnRpZXMgYXJlIG1vZGlmaWFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfUkVBRF9PTkxZX0RBVEEgPSAweDgwMDI7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QncyBjb250ZW50cyBjYW4gbm90IGJlIHRyYW5zZmVyZWQgZnJvbSB0aGUgZGV2aWNlLCBidXQgdGhlIG9iamVjdAorICAgICAqIG1heSBiZSBtb3ZlZCBvciBkZWxldGVkIGFuZCBpdHMgcHJvcGVydGllcyBtYXkgYmUgbW9kaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfTk9OX1RSQU5TRkVSQUJMRV9EQVRBID0gMHg4MDAzOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiA9IDB4MDAwMTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjVhYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cEN1cnNvci5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93OworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgICogQ3Vyc29yIGNsYXNzIGZvciBNVFAgY29udGVudCBwcm92aWRlcgorICAqIEBoaWRlCisgICovCitwdWJsaWMgZmluYWwgY2xhc3MgTXRwQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwQ3Vyc29yIjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE5PX0NPVU5UID0gLTE7CisKKyAgICAvKiBjb25zdGFudHMgZm9yIHF1ZXJ5VHlwZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRSAgICAgICAgICAgICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9JRCAgICAgICAgICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0UgICAgICAgICAgICAgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfSUQgICAgICAgICAgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVCAgICAgICAgICAgICAgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JRCAgICAgICAgICAgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfQ0hJTERSRU4gICAgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9DSElMRFJFTiAgICAgPSA4OworCisgICAgLyoqIFRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBpbiB0aGUgcHJvamVjdGlvbiAqLworICAgIHByaXZhdGUgU3RyaW5nW10gbUNvbHVtbnM7CisKKyAgICAvKiogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBjdXJzb3IgKi8KKyAgICBwcml2YXRlIGludCBtQ291bnQgPSBOT19DT1VOVDsKKworCisgICAgcHVibGljIE10cEN1cnNvcihNdHBDbGllbnQgY2xpZW50LCBpbnQgcXVlcnlUeXBlLCBpbnQgZGV2aWNlSUQsIGxvbmcgc3RvcmFnZUlELCBsb25nIG9iamVjdElELAorICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbikgeworICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY2xpZW50IG51bGwgaW4gTXRwQ3Vyc29yIGNvbnN0cnVjdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgbUNvbHVtbnMgPSBwcm9qZWN0aW9uOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtYXA7CisgICAgICAgIHN3aXRjaCAocXVlcnlUeXBlKSB7CisgICAgICAgICAgICBjYXNlIERFVklDRToKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX0lEOgorICAgICAgICAgICAgICAgIG1hcCA9IHNEZXZpY2VQcm9qZWN0aW9uTWFwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFOgorICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0lEOgorICAgICAgICAgICAgICAgIG1hcCA9IHNTdG9yYWdlUHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUOgorICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSUQ6CisgICAgICAgICAgICBjYXNlIFNUT1JBR0VfQ0hJTERSRU46CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9DSElMRFJFTjoKKyAgICAgICAgICAgICAgICBtYXAgPSBzT2JqZWN0UHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBxdWVyeSB0eXBlICIgICsgcXVlcnlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIGNvbHVtbnMgPSBuZXcgaW50W3Byb2plY3Rpb24ubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0aW9uLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBJbnRlZ2VyIGlkID0gbWFwLmdldChwcm9qZWN0aW9uW2ldKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjb2x1bW4gIiAgKyBwcm9qZWN0aW9uW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbHVtbnNbaV0gPSBpZC5pbnRWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9zZXR1cChjbGllbnQsIHF1ZXJ5VHlwZSwgZGV2aWNlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SUQsIGNvbHVtbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgaWYgKG1Db3VudCA9PSBOT19DT1VOVCkgeworICAgICAgICAgICAgZmlsbFdpbmRvdygwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlcnkoKSB7CisgICAgICAgIExvZy5kKFRBRywgInJlcXVlcnkiKTsKKyAgICAgICAgbUNvdW50ID0gTk9fQ09VTlQ7CisgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsV2luZG93KGludCBzdGFydFBvcykgeworICAgICAgICBpZiAobVdpbmRvdyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpc24ndCBhIHdpbmRvdyBzZXQgYWxyZWFkeSBpdCB3aWxsIG9ubHkgYmUgYWNjZXNzZWQgbG9jYWxseQorICAgICAgICAgICAgbVdpbmRvdyA9IG5ldyBDdXJzb3JXaW5kb3codHJ1ZSAvKiB0aGUgd2luZG93IGlzIGxvY2FsIG9ubHkgKi8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtV2luZG93LnNldFN0YXJ0UG9zaXRpb24oc3RhcnRQb3MpOworICAgICAgICBtQ291bnQgPSBuYXRpdmVfZmlsbF93aW5kb3cobVdpbmRvdywgc3RhcnRQb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0Q29sdW1uTmFtZXMgcmV0dXJuaW5nICIgKyBtQ29sdW1ucyk7CisgICAgICAgIHJldHVybiBtQ29sdW1uczsKKyAgICB9CisKKyAgICAvKiBEZXZpY2UgQ29sdW1uIElEcyAqLworICAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9ST1dfSUQgICAgICAgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfTUFOVUZBQ1RVUkVSICAgID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX01PREVMICAgICAgICAgICA9IDM7CisKKyAgICAvKiBTdG9yYWdlIENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX1JPV19JRCAgICAgICAgID0gMTAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0lERU5USUZJRVIgICAgID0gMTAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0RFU0NSSVBUSU9OICAgID0gMTAzOworCisgICAgLyogT2JqZWN0IENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUk9XX0lEICAgICAgICAgICAgICA9IDIwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NUT1JBR0VfSUQgICAgICAgICAgPSAyMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9GT1JNQVQgICAgICAgICAgICAgID0gMjAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMgICA9IDIwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgPSAyMDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9GT1JNQVQgICAgICAgID0gMjA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfU0laRSAgICAgICAgICA9IDIwNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX1dJRFRIICAgICAgICAgPSAyMDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9IRUlHSFQgICAgICAgID0gMjA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSU1BR0VfV0lEVEggICAgICAgICA9IDIxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lNQUdFX0hFSUdIVCAgICAgICAgPSAyMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JTUFHRV9ERVBUSCAgICAgICAgID0gMjEyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUEFSRU5UICAgICAgICAgICAgICA9IDIxMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEUgICAgPSAyMTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDICAgID0gMjE1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU0VRVUVOQ0VfTlVNQkVSICAgICA9IDIxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX05BTUUgICAgICAgICAgICAgICAgPSAyMTc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9EQVRFX0NSRUFURUQgICAgICAgID0gMjE4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfREFURV9NT0RJRklFRCAgICAgICA9IDIxOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0tFWVdPUkRTICAgICAgICAgICAgPSAyMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQiAgICAgICAgICAgICAgID0gMjIxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNEZXZpY2VQcm9qZWN0aW9uTWFwOworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzU3RvcmFnZVByb2plY3Rpb25NYXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNPYmplY3RQcm9qZWN0aW9uTWFwOworCisgICAgc3RhdGljIHsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuRGV2aWNlLl9JRCwgbmV3IEludGVnZXIoREVWSUNFX1JPV19JRCkpOworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcC5wdXQoTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIG5ldyBJbnRlZ2VyKERFVklDRV9NQU5VRkFDVFVSRVIpKTsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAucHV0KE10cC5EZXZpY2UuTU9ERUwsIG5ldyBJbnRlZ2VyKERFVklDRV9NT0RFTCkpOworCisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5fSUQsIG5ldyBJbnRlZ2VyKFNUT1JBR0VfUk9XX0lEKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuSURFTlRJRklFUiwgbmV3IEludGVnZXIoU1RPUkFHRV9JREVOVElGSUVSKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04sIG5ldyBJbnRlZ2VyKFNUT1JBR0VfREVTQ1JJUFRJT04pKTsKKworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuX0lELCBuZXcgSW50ZWdlcihPQkpFQ1RfUk9XX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNUT1JBR0VfSUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TVE9SQUdFX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5QUk9URUNUSU9OX1NUQVRVUywgbmV3IEludGVnZXIoT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNJWkUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TSVpFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0ZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9TSVpFLCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfU0laRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9ERVBUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0RFUFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlBBUkVOVCwgbmV3IEludGVnZXIoT0JKRUNUX1BBUkVOVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9UWVBFLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fVFlQRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9ERVNDLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fREVTQykpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5TRVFVRU5DRV9OVU1CRVIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuTkFNRSwgbmV3IEludGVnZXIoT0JKRUNUX05BTUUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuREFURV9DUkVBVEVELCBuZXcgSW50ZWdlcihPQkpFQ1RfREFURV9DUkVBVEVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkRBVEVfTU9ESUZJRUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9EQVRFX01PRElGSUVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LktFWVdPUkRTLCBuZXcgSW50ZWdlcihPQkpFQ1RfS0VZV09SRFMpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQikpOworCisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0Lk5BTUUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9OQU1FKSk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKE10cENsaWVudCBjbGllbnQsIGludCBxdWVyeVR5cGUsCisgICAgICAgICAgICBpbnQgZGV2aWNlSUQsIGxvbmcgc3RvcmFnZUlELCBsb25nIG9iamVjdElELCBpbnRbXSBjb2x1bW5zKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3dhaXRfZm9yX2V2ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9maWxsX3dpbmRvdyhDdXJzb3JXaW5kb3cgd2luZG93LCBpbnQgc3RhcnRQb3MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBkNzExMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UuamF2YQpAQCAtMCwwICsxLDgyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JQ29udGVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5BdWRpbzsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuRmlsZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkltYWdlczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgTXRwRGF0YWJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBEYXRhYmFzZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBJQ29udGVudFByb3ZpZGVyIG1NZWRpYVByb3ZpZGVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Wb2x1bWVOYW1lOworICAgIHByaXZhdGUgZmluYWwgVXJpIG1PYmplY3RzVXJpOworCisgICAgLy8gdHJ1ZSBpZiB0aGUgZGF0YWJhc2UgaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIGN1cnJlbnQgTVRQIHNlc3Npb24KKyAgICBwcml2YXRlIGJvb2xlYW4gbURhdGFiYXNlTW9kaWZpZWQ7CisKKyAgICAvLyBkYXRhYmFzZSBmb3Igd3JpdGFibGUgTVRQIGRldmljZSBwcm9wZXJ0aWVzCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGV2aWNlUHJvcERiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVElFU19EQVRBQkFTRV9WRVJTSU9OID0gMTsKKworICAgIC8vIEZJWE1FIC0gdGhpcyBzaG91bGQgYmUgcGFzc2VkIGluIHZpYSB0aGUgY29uc3RydWN0b3IKKyAgICBwcml2YXRlIGZpbmFsIGludCBtU3RvcmFnZUlEID0gMHgwMDAxMDAwMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElEX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuX0lELCAvLyAwCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIX1NJWkVfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEsIC8vIDEKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLlNJWkUsIC8vIDIKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9CSkVDVF9JTkZPX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5EQVRBLCAvLyAxCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5GT1JNQVQsIC8vIDIKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLlBBUkVOVCwgLy8gMworICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuU0laRSwgLy8gNAorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuREFURV9NT0RJRklFRCwgLy8gNQorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1dIRVJFID0gRmlsZXMuRmlsZUNvbHVtbnMuX0lEICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9XSEVSRSA9IEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfV0hFUkUgPSBGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfRk9STUFUX1dIRVJFID0gUEFSRU5UX1dIRVJFICsgIiBBTkQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGVzLkZpbGVDb2x1bW5zLkZPUk1BVCArICI9PyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVZJQ0VfUFJPUEVSVFlfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7ICJfaWQiLCAidmFsdWUiIH07CisgICAgcHJpdmF0ZSAgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfUFJPUEVSVFlfV0hFUkUgPSAiY29kZT0/IjsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFTY2FubmVyIG1NZWRpYVNjYW5uZXI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBEYXRhYmFzZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyB2b2x1bWVOYW1lKSB7CisgICAgICAgIG5hdGl2ZV9zZXR1cCgpOworCisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lZGlhUHJvdmlkZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLmFjcXVpcmVQcm92aWRlcigibWVkaWEiKTsKKyAgICAgICAgbVZvbHVtZU5hbWUgPSB2b2x1bWVOYW1lOworICAgICAgICBtT2JqZWN0c1VyaSA9IEZpbGVzLmdldE10cE9iamVjdHNVcmkodm9sdW1lTmFtZSk7CisgICAgICAgIG1NZWRpYVNjYW5uZXIgPSBuZXcgTWVkaWFTY2FubmVyKGNvbnRleHQpOworICAgICAgICBvcGVuRGV2aWNlUHJvcGVydGllc0RhdGFiYXNlKGNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb3BlbkRldmljZVByb3BlcnRpZXNEYXRhYmFzZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbURldmljZVByb3BEYiA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoImRldmljZS1wcm9wZXJ0aWVzIiwgQ29udGV4dC5NT0RFX1BSSVZBVEUsIG51bGwpOworICAgICAgICBpbnQgdmVyc2lvbiA9IG1EZXZpY2VQcm9wRGIuZ2V0VmVyc2lvbigpOworCisgICAgICAgIC8vIGluaXRpYWxpemUgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmICh2ZXJzaW9uICE9IERFVklDRV9QUk9QRVJUSUVTX0RBVEFCQVNFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIG1EZXZpY2VQcm9wRGIuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHByb3BlcnRpZXMgKCIgKworICAgICAgICAgICAgICAgICAgICAiX2lkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwiICsKKyAgICAgICAgICAgICAgICAgICAgImNvZGUgSU5URUdFUiBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwiICsKKyAgICAgICAgICAgICAgICAgICAgInZhbHVlIFRFWFQiICsKKyAgICAgICAgICAgICAgICAgICAgIik7Iik7CisgICAgICAgICAgICBtRGV2aWNlUHJvcERiLmV4ZWNTUUwoIkNSRUFURSBJTkRFWCBwcm9wZXJ0eV9pbmRleCBPTiBwcm9wZXJ0aWVzIChjb2RlKTsiKTsKKyAgICAgICAgICAgIG1EZXZpY2VQcm9wRGIuc2V0VmVyc2lvbihERVZJQ0VfUFJPUEVSVElFU19EQVRBQkFTRV9WRVJTSU9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGJlZ2luU2VuZE9iamVjdChTdHJpbmcgcGF0aCwgaW50IGZvcm1hdCwgaW50IHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcmFnZSwgbG9uZyBzaXplLCBsb25nIG1vZGlmaWVkKSB7CisgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEsIHBhdGgpOworICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLkZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgdmFsdWVzLnB1dChGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQsIHBhcmVudCk7CisgICAgICAgIC8vIHN0b3JhZ2UgaXMgaWdub3JlZCBmb3Igbm93CisgICAgICAgIHZhbHVlcy5wdXQoRmlsZXMuRmlsZUNvbHVtbnMuU0laRSwgc2l6ZSk7CisgICAgICAgIHZhbHVlcy5wdXQoRmlsZXMuRmlsZUNvbHVtbnMuREFURV9NT0RJRklFRCwgbW9kaWZpZWQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmkgdXJpID0gbU1lZGlhUHJvdmlkZXIuaW5zZXJ0KG1PYmplY3RzVXJpLCB2YWx1ZXMpOworICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBiZWdpblNlbmRPYmplY3QiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmRTZW5kT2JqZWN0KFN0cmluZyBwYXRoLCBpbnQgaGFuZGxlLCBpbnQgZm9ybWF0LCBib29sZWFuIHN1Y2NlZWRlZCkgeworICAgICAgICBpZiAoc3VjY2VlZGVkKSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgYWJzdHJhY3QgcGxheWxpc3RzIHNlcGFyYXRlbHkKKyAgICAgICAgICAgIC8vIHRoZXkgZG8gbm90IGV4aXN0IGluIHRoZSBmaWxlIHN5c3RlbSBzbyBkb24ndCB1c2UgdGhlIG1lZGlhIHNjYW5uZXIgaGVyZQorICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBNdHBDb25zdGFudHMuRk9STUFUX0FCU1RSQUNUX0FWX1BMQVlMSVNUKSB7CisgICAgICAgICAgICAgICAgLy8gU3RyaXAgV2luZG93cyBNZWRpYSBQbGF5ZXIgZmlsZSBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLnBsYSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gcGF0aAorICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGF0aDsKKyAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gbmFtZS5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobGFzdFNsYXNoICsgMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEF1ZGlvLlBsYXlsaXN0cy5EQVRBLCBwYXRoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEF1ZGlvLlBsYXlsaXN0cy5OQU1FLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE1lZGlhQ29sdW1ucy5NRURJQV9TQ0FOTkVSX05FV19PQkpFQ1RfSUQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IG1NZWRpYVByb3ZpZGVyLmluc2VydChBdWRpby5QbGF5bGlzdHMuRVhURVJOQUxfQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGVuZFNlbmRPYmplY3QiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NZWRpYVNjYW5uZXIuc2Nhbk10cEZpbGUocGF0aCwgbVZvbHVtZU5hbWUsIGhhbmRsZSwgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbGV0ZUZpbGUoaGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0T2JqZWN0TGlzdChpbnQgc3RvcmFnZUlELCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50KSB7CisgICAgICAgIC8vIHdlIGNhbiBpZ25vcmUgc3RvcmFnZUlEIHVudGlsIHdlIHN1cHBvcnQgbXVsdGlwbGUgc3RvcmFnZXMKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0TGlzdCBwYXJlbnQ6ICIgKyBwYXJlbnQpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX0ZPUk1BVF9XSEVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCksIEludGVnZXIudG9TdHJpbmcoZm9ybWF0KSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpIH0sIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm51bGwgY3Vyc29yIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY291bnQgPSBjLmdldENvdW50KCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmV0dXJuaW5nICIgKyByZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0TGlzdCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXROdW1PYmplY3RzKGludCBzdG9yYWdlSUQsIGludCBmb3JtYXQsIGludCBwYXJlbnQpIHsKKyAgICAgICAgLy8gd2UgY2FuIGlnbm9yZSBzdG9yYWdlSUQgdW50aWwgd2Ugc3VwcG9ydCBtdWx0aXBsZSBzdG9yYWdlcworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RMaXN0IHBhcmVudDogIiArIHBhcmVudCk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfRk9STUFUX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcocGFyZW50KSwgSW50ZWdlci50b1N0cmluZyhmb3JtYXQpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX1dIRVJFLCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCkgfSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXROdW1PYmplY3RzIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAvLyBhbGxvdyB0cmFuc2ZlcmluZyBhcmJpdHJhcnkgZmlsZXMKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfVU5ERUZJTkVELAorCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX0FTU09DSUFUSU9OLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9URVhULAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9IVE1MLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9XQVYsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX01QMywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfTVBFRywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfRVhJRl9KUEVHLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9USUZGX0VQLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9HSUYsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX0pGSUYsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX1BORywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfVElGRiwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfV01BLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9PR0csCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX0FBQywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfTVA0X0NPTlRBSU5FUiwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfTVAyLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfV1BMX1BMQVlMSVNULAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9NM1VfUExBWUxJU1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX1BMU19QTEFZTElTVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfWE1MX0RPQ1VNRU5ULAorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSB7CisgICAgICAgIC8vIG5vIGNhcHR1cmUgZm9ybWF0cyB5ZXQKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGludFtdIEZJTEVfUFJPUEVSVElFUyA9IHsKKyAgICAgICAgICAgIC8vIE5PVEUgbXVzdCBtYXRjaCBiZWdpbm5pbmcgb2YgQVVESU9fUFJPUEVSVElFUywgVklERU9fUFJPUEVSVElFUworICAgICAgICAgICAgLy8gYW5kIElNQUdFX1BST1BFUlRJRVMgYmVsb3cKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9TVE9SQUdFX0lELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GT1JNQVQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX1NJWkUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9EQVRFX01PRElGSUVELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BBUkVOVF9PQkpFQ1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9EQVRFX0FEREVELAorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50W10gQVVESU9fUFJPUEVSVElFUyA9IHsKKyAgICAgICAgICAgIC8vIE5PVEUgbXVzdCBtYXRjaCBGSUxFX1BST1BFUlRJRVMgYWJvdmUKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9TVE9SQUdFX0lELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GT1JNQVQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX1NJWkUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9EQVRFX01PRElGSUVELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BBUkVOVF9PQkpFQ1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9ESVNQTEFZX05BTUUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfREFURV9BRERFRCwKKworICAgICAgICAgICAgLy8gYXVkaW8gc3BlY2lmaWMgcHJvcGVydGllcworICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0FSVElTVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9BTEJVTV9OQU1FLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0FMQlVNX0FSVElTVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9UUkFDSywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfRFVSQVRJT04sCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfR0VOUkUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfQ09NUE9TRVIsCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBWSURFT19QUk9QRVJUSUVTID0geworICAgICAgICAgICAgLy8gTk9URSBtdXN0IG1hdGNoIEZJTEVfUFJPUEVSVElFUyBhYm92ZQorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1NUT1JBR0VfSUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfU0laRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RBVEVfTU9ESUZJRUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUEFSRU5UX09CSkVDVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9QRVJTSVNURU5UX1VJRCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9OQU1FLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RJU1BMQVlfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9EQVRFX0FEREVELAorCisgICAgICAgICAgICAvLyB2aWRlbyBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfQVJUSVNULAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0FMQlVNX05BTUUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfRFVSQVRJT04sCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfREVTQ1JJUFRJT04sCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBJTUFHRV9QUk9QRVJUSUVTID0geworICAgICAgICAgICAgLy8gTk9URSBtdXN0IG1hdGNoIEZJTEVfUFJPUEVSVElFUyBhYm92ZQorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1NUT1JBR0VfSUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfU0laRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RBVEVfTU9ESUZJRUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUEFSRU5UX09CSkVDVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9QRVJTSVNURU5UX1VJRCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9OQU1FLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RJU1BMQVlfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9EQVRFX0FEREVELAorCisgICAgICAgICAgICAvLyBpbWFnZSBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfREVTQ1JJUFRJT04sCisgICAgfTsKKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhpbnQgZm9ybWF0KSB7CisgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5GT1JNQVRfTVAzOgorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuRk9STUFUX1dBVjoKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkZPUk1BVF9XTUE6CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5GT1JNQVRfT0dHOgorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuRk9STUFUX0FBQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fUFJPUEVSVElFUzsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkZPUk1BVF9NUEVHOgorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuRk9STUFUXzNHUF9DT05UQUlORVI6CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5GT1JNQVRfV01WOgorICAgICAgICAgICAgICAgIHJldHVybiBWSURFT19QUk9QRVJUSUVTOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuRk9STUFUX0VYSUZfSlBFRzoKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkZPUk1BVF9HSUY6CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5GT1JNQVRfUE5HOgorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuRk9STUFUX0JNUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gSU1BR0VfUFJPUEVSVElFUzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZJTEVfUFJPUEVSVElFUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7CisgICAgICAgICAgICBNdHBDb25zdGFudHMuREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkRFVklDRV9QUk9QRVJUWV9ERVZJQ0VfRlJJRU5ETFlfTkFNRSwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBxdWVyeVN0cmluZyhpbnQgaWQsIFN0cmluZyBjb2x1bW4pIHsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBhcmUgb25seSByZWFkaW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgIm9iamVjdHMiIHRhYmxlCisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgY29sdW1uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfV0hFUkUsIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcoaWQpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlHZW5yZShpbnQgaWQpIHsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpIHVyaSA9IEF1ZGlvLkdlbnJlcy5nZXRDb250ZW50VXJpRm9yQXVkaW9JZChtVm9sdW1lTmFtZSwgaWQpOworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHsgRmlsZXMuRmlsZUNvbHVtbnMuX0lELCBBdWRpby5HZW5yZXNDb2x1bW5zLk5BTUUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgInF1ZXJ5R2VucmUgZXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcXVlcnlJbnQoaW50IGlkLCBTdHJpbmcgY29sdW1uLCBsb25nW10gb3V0VmFsdWUpIHsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBhcmUgb25seSByZWFkaW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgIm9iamVjdHMiIHRhYmxlCisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgY29sdW1uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfV0hFUkUsIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcoaWQpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIG91dFZhbHVlWzBdID0gYy5nZXRMb25nKDEpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWVGcm9tUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICAvLyBleHRyYWN0IG5hbWUgZnJvbSBmdWxsIHBhdGgKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgaW50IGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKGxhc3RTbGFzaCA+PSAwKSB7CisgICAgICAgICAgICBzdGFydCA9IGxhc3RTbGFzaCArIDE7CisgICAgICAgIH0KKyAgICAgICAgaW50IGVuZCA9IHBhdGgubGVuZ3RoKCk7CisgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IDI1NSkgeworICAgICAgICAgICAgZW5kID0gc3RhcnQgKyAyNTU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE9iamVjdFByb3BlcnR5KGludCBoYW5kbGUsIGludCBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nW10gb3V0SW50VmFsdWUsIGNoYXJbXSBvdXRTdHJpbmdWYWx1ZSkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RQcm9wZXJ0eTogIiArIHByb3BlcnR5KTsKKyAgICAgICAgU3RyaW5nIGNvbHVtbiA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gaXNTdHJpbmcgPSBmYWxzZTsKKworICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9TVE9SQUdFX0lEOgorICAgICAgICAgICAgICAgIG91dEludFZhbHVlWzBdID0gbVN0b3JhZ2VJRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBGaWxlcy5GaWxlQ29sdW1ucy5GT1JNQVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIHN0YXR1cyBpcyBhbHdheXMgMAorICAgICAgICAgICAgICAgIG91dEludFZhbHVlWzBdID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX1NJWkU6CisgICAgICAgICAgICAgICAgY29sdW1uID0gRmlsZXMuRmlsZUNvbHVtbnMuU0laRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GSUxFX05BTUU6CisgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gbmVlZCB0byBleHRyYWN0IGZpbGUgbmFtZSBmcm9tIGZ1bGwgcGF0aAorICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHF1ZXJ5U3RyaW5nKGhhbmRsZSwgRmlsZXMuRmlsZUNvbHVtbnMuREFUQSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuYW1lRnJvbVBhdGgodmFsdWUpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRDaGFycygwLCB2YWx1ZS5sZW5ndGgoKSwgb3V0U3RyaW5nVmFsdWUsIDApOworICAgICAgICAgICAgICAgICAgICBvdXRTdHJpbmdWYWx1ZVt2YWx1ZS5sZW5ndGgoKV0gPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX05BTUU6CisgICAgICAgICAgICAgICAgLy8gZmlyc3QgdHJ5IHRpdGxlCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBxdWVyeVN0cmluZyhoYW5kbGUsIE1lZGlhQ29sdW1ucy5USVRMRSk7CisgICAgICAgICAgICAgICAgLy8gdGhlbiB0cnkgbmFtZQorICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHF1ZXJ5U3RyaW5nKGhhbmRsZSwgQXVkaW8uUGxheWxpc3RzQ29sdW1ucy5OQU1FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gaWYgdGl0bGUgYW5kIG5hbWUgZmFpbCwgZXh0cmFjdCBuYW1lIGZyb20gZnVsbCBwYXRoCisgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gcXVlcnlTdHJpbmcoaGFuZGxlLCBGaWxlcy5GaWxlQ29sdW1ucy5EQVRBKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVGcm9tUGF0aChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUuZ2V0Q2hhcnMoMCwgbmFtZS5sZW5ndGgoKSwgb3V0U3RyaW5nVmFsdWUsIDApOworICAgICAgICAgICAgICAgICAgICBvdXRTdHJpbmdWYWx1ZVtuYW1lLmxlbmd0aCgpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfREFURV9NT0RJRklFRDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBGaWxlcy5GaWxlQ29sdW1ucy5EQVRFX01PRElGSUVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfREFURV9BRERFRDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBGaWxlcy5GaWxlQ29sdW1ucy5EQVRFX0FEREVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEF1ZGlvLkF1ZGlvQ29sdW1ucy5ZRUFSOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfUEFSRU5UX09CSkVDVDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9QRVJTSVNURU5UX1VJRDoKKyAgICAgICAgICAgICAgICAvLyBQVUlEIGlzIGNvbmNhdGVuYXRpb24gb2Ygc3RvcmFnZUlEIGFuZCBvYmplY3QgaGFuZGxlCisgICAgICAgICAgICAgICAgbG9uZyBwdWlkID0gbVN0b3JhZ2VJRDsKKyAgICAgICAgICAgICAgICBwdWlkIDw8PSAzMjsKKyAgICAgICAgICAgICAgICBwdWlkICs9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IHB1aWQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RVUkFUSU9OOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEF1ZGlvLkF1ZGlvQ29sdW1ucy5EVVJBVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1RSQUNLOgorICAgICAgICAgICAgICAgIGlmIChxdWVyeUludChoYW5kbGUsIEF1ZGlvLkF1ZGlvQ29sdW1ucy5UUkFDSywgb3V0SW50VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIGlzIHN0b3JlZCBpbiBsb3dlciAzIGRlY2ltYWwgZGlnaXRzCisgICAgICAgICAgICAgICAgICAgIG91dEludFZhbHVlWzBdICU9IDEwMDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfRElTUExBWV9OQU1FOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1lZGlhQ29sdW1ucy5ESVNQTEFZX05BTUU7CisgICAgICAgICAgICAgICAgaXNTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfQVJUSVNUOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEF1ZGlvLkF1ZGlvQ29sdW1ucy5BUlRJU1Q7CisgICAgICAgICAgICAgICAgaXNTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfQUxCVU1fTkFNRToKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBBdWRpby5BdWRpb0NvbHVtbnMuQUxCVU07CisgICAgICAgICAgICAgICAgaXNTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfQUxCVU1fQVJUSVNUOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEF1ZGlvLkF1ZGlvQ29sdW1ucy5BTEJVTV9BUlRJU1Q7CisgICAgICAgICAgICAgICAgaXNTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfR0VOUkU6CisgICAgICAgICAgICAgICAgU3RyaW5nIGdlbnJlID0gcXVlcnlHZW5yZShoYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChnZW5yZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbnJlLmdldENoYXJzKDAsIGdlbnJlLmxlbmd0aCgpLCBvdXRTdHJpbmdWYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIG91dFN0cmluZ1ZhbHVlW2dlbnJlLmxlbmd0aCgpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfQ09NUE9TRVI6CisgICAgICAgICAgICAgICAgY29sdW1uID0gQXVkaW8uQXVkaW9Db2x1bW5zLkNPTVBPU0VSOworICAgICAgICAgICAgICAgIGlzU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RFU0NSSVBUSU9OOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEltYWdlcy5JbWFnZUNvbHVtbnMuREVTQ1JJUFRJT047CisgICAgICAgICAgICAgICAgaXNTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTdHJpbmcpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHF1ZXJ5U3RyaW5nKGhhbmRsZSwgY29sdW1uKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFsdWUuZ2V0Q2hhcnMoMCwgdmFsdWUubGVuZ3RoKCksIG91dFN0cmluZ1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICBvdXRTdHJpbmdWYWx1ZVt2YWx1ZS5sZW5ndGgoKV0gPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocXVlcnlJbnQoaGFuZGxlLCBjb2x1bW4sIG91dEludFZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcXVlcnkgZmFpbGVkIGlmIHdlIGdldCBoZXJlCisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHNldE9iamVjdFByb3BlcnR5KGludCBoYW5kbGUsIGludCBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGludFZhbHVlLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2V0T2JqZWN0UHJvcGVydHk6ICIgKyBwcm9wZXJ0eSk7CisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXREZXZpY2VQcm9wZXJ0eShpbnQgcHJvcGVydHksIGxvbmdbXSBvdXRJbnRWYWx1ZSwgY2hhcltdIG91dFN0cmluZ1ZhbHVlKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldERldmljZVByb3BlcnR5OiAiICsgcHJvcGVydHkpOworCisgICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkRFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUjoKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkRFVklDRV9QUk9QRVJUWV9ERVZJQ0VfRlJJRU5ETFlfTkFNRToKKyAgICAgICAgICAgICAgICAvLyB3cml0YWJsZSBzdHJpbmcgcHJvcGVydGllcyBrZXB0IGluIG91ciBkZXZpY2UgcHJvcGVydHkgZGF0YWJhc2UKKyAgICAgICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IG1EZXZpY2VQcm9wRGIucXVlcnkoInByb3BlcnRpZXMiLCBERVZJQ0VfUFJPUEVSVFlfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9QUk9QRVJUWV9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgIEludGVnZXIudG9TdHJpbmcocHJvcGVydHkpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAyNTU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRDaGFycygwLCBsZW5ndGgsIG91dFN0cmluZ1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmluZ1ZhbHVlW2xlbmd0aF0gPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyaW5nVmFsdWVbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHNldERldmljZVByb3BlcnR5KGludCBwcm9wZXJ0eSwgbG9uZyBpbnRWYWx1ZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisgICAgICAgIExvZy5kKFRBRywgInNldERldmljZVByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIDogIiArIHN0cmluZ1ZhbHVlKTsKKworICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVI6CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUU6CisgICAgICAgICAgICAgICAgLy8gd3JpdGFibGUgc3RyaW5nIHByb3BlcnRpZXMga2VwdCBpbiBvdXIgZGV2aWNlIHByb3BlcnR5IGRhdGFiYXNlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJjb2RlIiwgcHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJ2YWx1ZSIsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVByb3BEYi5pbnNlcnQoInByb3BlcnRpZXMiLCAiY29kZSIsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZ2V0T2JqZWN0SW5mbyhpbnQgaGFuZGxlLCBpbnRbXSBvdXRTdG9yYWdlRm9ybWF0UGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIG91dE5hbWUsIGxvbmdbXSBvdXRTaXplTW9kaWZpZWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0SW5mbzogIiArIGhhbmRsZSk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgT0JKRUNUX0lORk9fUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgIEludGVnZXIudG9TdHJpbmcoaGFuZGxlKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBvdXRTdG9yYWdlRm9ybWF0UGFyZW50WzBdID0gbVN0b3JhZ2VJRDsKKyAgICAgICAgICAgICAgICBvdXRTdG9yYWdlRm9ybWF0UGFyZW50WzFdID0gYy5nZXRJbnQoMik7CisgICAgICAgICAgICAgICAgb3V0U3RvcmFnZUZvcm1hdFBhcmVudFsyXSA9IGMuZ2V0SW50KDMpOworCisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gcGF0aAorICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAobGFzdFNsYXNoID49IDAgPyBsYXN0U2xhc2ggKyAxIDogMCk7CisgICAgICAgICAgICAgICAgaW50IGVuZCA9IHBhdGgubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgMjU1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRoLmdldENoYXJzKHN0YXJ0LCBlbmQsIG91dE5hbWUsIDApOworICAgICAgICAgICAgICAgIG91dE5hbWVbZW5kIC0gc3RhcnRdID0gMDsKKworICAgICAgICAgICAgICAgIG91dFNpemVNb2RpZmllZFswXSA9IGMuZ2V0TG9uZyg0KTsKKyAgICAgICAgICAgICAgICBvdXRTaXplTW9kaWZpZWRbMV0gPSBjLmdldExvbmcoNSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0UHJvcGVydHkiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE9iamVjdEZpbGVQYXRoKGludCBoYW5kbGUsIGNoYXJbXSBvdXRGaWxlUGF0aCwgbG9uZ1tdIG91dEZpbGVMZW5ndGgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0RmlsZVBhdGg6ICIgKyBoYW5kbGUpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIFBBVEhfU0laRV9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1dIRVJFLCBuZXcgU3RyaW5nW10geyAgSW50ZWdlci50b1N0cmluZyhoYW5kbGUpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgcGF0aC5nZXRDaGFycygwLCBwYXRoLmxlbmd0aCgpLCBvdXRGaWxlUGF0aCwgMCk7CisgICAgICAgICAgICAgICAgb3V0RmlsZVBhdGhbcGF0aC5sZW5ndGgoKV0gPSAwOworICAgICAgICAgICAgICAgIG91dEZpbGVMZW5ndGhbMF0gPSBjLmdldExvbmcoMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0RmlsZVBhdGgiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZWxldGVSZWN1cnNpdmUoaW50IGhhbmRsZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGludFtdIGNoaWxkcmVuID0gZ2V0T2JqZWN0TGlzdCgwIC8qIHN0b3JhZ2VJRCAqLywgMCAvKiBmb3JtYXQgKi8sIGhhbmRsZSk7CisgICAgICAgIFVyaSB1cmkgPSBGaWxlcy5nZXRNdHBPYmplY3RzVXJpKG1Wb2x1bWVOYW1lLCBoYW5kbGUpOworICAgICAgICAvLyBkZWxldGUgcGFyZW50IGZpcnN0LCB0byBhdm9pZCBwb3RlbnRpYWwgaW5maW5pdGUgcmVjdXJzaW9uCisgICAgICAgIGludCBjb3VudCA9IG1NZWRpYVByb3ZpZGVyLmRlbGV0ZSh1cmksIG51bGwsIG51bGwpOworICAgICAgICBpZiAoY291bnQgPT0gMSkgeworICAgICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGRlbGV0ZVJlY3Vyc2l2ZShjaGlsZHJlbltpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZWxldGVGaWxlKGludCBoYW5kbGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGVsZXRlRmlsZTogIiArIGhhbmRsZSk7CisgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChkZWxldGVSZWN1cnNpdmUoaGFuZGxlKSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBkZWxldGVGaWxlIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldE9iamVjdFJlZmVyZW5jZXMoaW50IGhhbmRsZSkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RSZWZlcmVuY2VzIGZvcjogIiArIGhhbmRsZSk7CisgICAgICAgIFVyaSB1cmkgPSBGaWxlcy5nZXRNdHBSZWZlcmVuY2VzVXJpKG1Wb2x1bWVOYW1lLCBoYW5kbGUpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkodXJpLCBJRF9QUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBjb3VudCA9IGMuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGMuZ2V0SW50KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdExpc3QiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgc2V0T2JqZWN0UmVmZXJlbmNlcyhpbnQgaGFuZGxlLCBpbnRbXSByZWZlcmVuY2VzKSB7CisgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgVXJpIHVyaSA9IEZpbGVzLmdldE10cFJlZmVyZW5jZXNVcmkobVZvbHVtZU5hbWUsIGhhbmRsZSk7CisgICAgICAgIGludCBjb3VudCA9IHJlZmVyZW5jZXMubGVuZ3RoOworICAgICAgICBDb250ZW50VmFsdWVzW10gdmFsdWVzTGlzdCA9IG5ldyBDb250ZW50VmFsdWVzW2NvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgcmVmZXJlbmNlc1tpXSk7CisgICAgICAgICAgICB2YWx1ZXNMaXN0W2ldID0gdmFsdWVzOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY291bnQgPT0gbU1lZGlhUHJvdmlkZXIuYnVsa0luc2VydCh1cmksIHZhbHVlc0xpc3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBzZXRPYmplY3RSZWZlcmVuY2VzIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXNzaW9uU3RhcnRlZCgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2Vzc2lvblN0YXJ0ZWQiKTsKKyAgICAgICAgbURhdGFiYXNlTW9kaWZpZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2Vzc2lvbkVuZGVkKCkgeworICAgICAgICBMb2cuZChUQUcsICJzZXNzaW9uRW5kZWQiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZU1vZGlmaWVkKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJzZW5kaW5nIEFDVElPTl9NVFBfU0VTU0lPTl9FTkQiKTsKKyAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChNdHAuQUNUSU9OX01UUF9TRVNTSU9OX0VORCkpOworICAgICAgICAgICAgbURhdGFiYXNlTW9kaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVzZWQgYnkgdGhlIEpOSSBjb2RlCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXR1cCgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwU2VydmVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxNTI3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBKYXZhIHdyYXBwZXIgZm9yIE1UUC9QVFAgc3VwcG9ydCBhcyBVU0IgcmVzcG9uZGVyLgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgTXRwU2VydmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwU2VydmVyIjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgibWVkaWFfam5pIik7CisgICAgfQorCisgICAgcHVibGljIE10cFNlcnZlcihNdHBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHN0b3JhZ2VQYXRoKSB7CisgICAgICAgIG5hdGl2ZV9zZXR1cChkYXRhYmFzZSwgc3RvcmFnZVBhdGgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgbmF0aXZlX3N0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgbmF0aXZlX3N0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kT2JqZWN0QWRkZWQoaW50IGhhbmRsZSkgeworICAgICAgICBuYXRpdmVfc2VuZF9vYmplY3RfYWRkZWQoaGFuZGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kT2JqZWN0UmVtb3ZlZChpbnQgaGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9zZW5kX29iamVjdF9yZW1vdmVkKGhhbmRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHRwTW9kZShib29sZWFuIHVzZVB0cCkgeworICAgICAgICBuYXRpdmVfc2V0X3B0cF9tb2RlKHVzZVB0cCk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKE10cERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgc3RvcmFnZVBhdGgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc3RhcnQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zdG9wKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2VuZF9vYmplY3RfYWRkZWQoaW50IGhhbmRsZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZChpbnQgaGFuZGxlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXRfcHRwX21vZGUoYm9vbGVhbiB1c2VQdHApOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0F1ZGlvVHJhY2suamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9BdWRpb1RyYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDc2Y2MzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9BdWRpb1RyYWNrLmphdmEKQEAgLTAsMCArMSw0MzUgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIGhhbmRsZSBhbiBhdWRpbyB0cmFjay4gVGhpcyBhdWRpbyBmaWxlIGlzIG1peGVkIHdpdGggdGhlDQorICogYXVkaW8gc2FtcGxlcyBvZiB0aGUgTWVkaWFJdGVtcy4NCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIEF1ZGlvVHJhY2sgew0KKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMNCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVuaXF1ZUlkOw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRmlsZW5hbWU7DQorICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lTXM7DQorICAgIHByaXZhdGUgbG9uZyBtVGltZWxpbmVEdXJhdGlvbk1zOw0KKyAgICBwcml2YXRlIGludCBtVm9sdW1lUGVyY2VudDsNCisgICAgcHJpdmF0ZSBsb25nIG1CZWdpbkJvdW5kYXJ5VGltZU1zOw0KKyAgICBwcml2YXRlIGxvbmcgbUVuZEJvdW5kYXJ5VGltZU1zOw0KKyAgICBwcml2YXRlIGJvb2xlYW4gbUxvb3A7DQorICAgIHByaXZhdGUgYm9vbGVhbiBtTXV0ZWQ7DQorDQorICAgIHByaXZhdGUgZmluYWwgbG9uZyBtRHVyYXRpb25NczsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUF1ZGlvQ2hhbm5lbHM7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb1R5cGU7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb0JpdHJhdGU7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb1NhbXBsaW5nRnJlcXVlbmN5Ow0KKw0KKyAgICAvLyBEdWNraW5nIHZhcmlhYmxlcw0KKyAgICBwcml2YXRlIGludCBtRHVja2luZ1RocmVzaG9sZDsNCisgICAgcHJpdmF0ZSBpbnQgbUR1Y2tpbmdMb3dWb2x1bWU7DQorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEdWNraW5nRW5hYmxlZDsNCisNCisgICAgLy8gVGhlIGF1ZGlvIHdhdmVmb3JtIGZpbGVuYW1lDQorICAgIHByaXZhdGUgU3RyaW5nIG1BdWRpb1dhdmVmb3JtRmlsZW5hbWU7DQorDQorICAgIC8qKg0KKyAgICAgKiBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYnkgdXNpbmcgdGhlIGRlZmF1bHQNCisgICAgICogY29uc3RydWN0b3INCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KKyAgICBwcml2YXRlIEF1ZGlvVHJhY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIGVkaXRvciBUaGUgdmlkZW8gZWRpdG9yIHJlZmVyZW5jZQ0KKyAgICAgKiBAcGFyYW0gYXVkaW9UcmFja0lkIFRoZSBhdWRpbyB0cmFjayBpZA0KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGFic29sdXRlIGZpbGUgbmFtZQ0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGZpbGUgaXMgbm90IGZvdW5kDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGZpbGUgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgb3IgaWYNCisgICAgICogICAgICAgICAgICAgdGhlIGNvZGVjIGlzIG5vdCBzdXBwb3J0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBBdWRpb1RyYWNrKFZpZGVvRWRpdG9yIGVkaXRvciwgU3RyaW5nIGF1ZGlvVHJhY2tJZCwgU3RyaW5nIGZpbGVuYW1lKQ0KKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBtVW5pcXVlSWQgPSBhdWRpb1RyYWNrSWQ7DQorICAgICAgICBtRmlsZW5hbWUgPSBmaWxlbmFtZTsNCisgICAgICAgIG1TdGFydFRpbWVNcyA9IDA7DQorICAgICAgICAvLyBUT0RPOiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdG8gdGhlIGR1cmF0aW9uIG9mIHRoZSBhdWRpbyBmaWxlDQorICAgICAgICBtRHVyYXRpb25NcyA9IDMwMDAwMDsNCisgICAgICAgIC8vIFRPRE86IFRoaXMgdmFsdWUgbmVlZHMgdG8gYmUgcmVhZCBmcm9tIHRoZSBhdWRpbyB0cmFjayBvZiB0aGUgc291cmNlDQorICAgICAgICAvLyBmaWxlDQorICAgICAgICBtQXVkaW9DaGFubmVscyA9IDI7DQorICAgICAgICBtQXVkaW9UeXBlID0gTWVkaWFQcm9wZXJ0aWVzLkFDT0RFQ19BQUNfTEM7DQorICAgICAgICBtQXVkaW9CaXRyYXRlID0gMTI4MDAwOw0KKyAgICAgICAgbUF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPSA0NDEwMDsNCisNCisgICAgICAgIG1UaW1lbGluZUR1cmF0aW9uTXMgPSBtRHVyYXRpb25NczsNCisgICAgICAgIG1Wb2x1bWVQZXJjZW50ID0gMTAwOw0KKw0KKyAgICAgICAgLy8gUGxheSB0aGUgZW50aXJlIGF1ZGlvIHRyYWNrDQorICAgICAgICBtQmVnaW5Cb3VuZGFyeVRpbWVNcyA9IDA7DQorICAgICAgICBtRW5kQm91bmRhcnlUaW1lTXMgPSBtRHVyYXRpb25NczsNCisNCisgICAgICAgIC8vIEJ5IGRlZmF1bHQgbG9vcCBpcyBkaXNhYmxlZA0KKyAgICAgICAgbUxvb3AgPSBmYWxzZTsNCisNCisgICAgICAgIC8vIEJ5IGRlZmF1bHQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBtdXRlZA0KKyAgICAgICAgbU11dGVkID0gZmFsc2U7DQorDQorICAgICAgICAvLyBEdWNraW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdA0KKyAgICAgICAgbUR1Y2tpbmdUaHJlc2hvbGQgPSAwOw0KKyAgICAgICAgbUR1Y2tpbmdMb3dWb2x1bWUgPSAwOw0KKyAgICAgICAgbUlzRHVja2luZ0VuYWJsZWQgPSB0cnVlOw0KKw0KKyAgICAgICAgLy8gVGhlIGF1ZGlvIHdhdmVmb3JtIGZpbGUgaXMgZ2VuZXJhdGVkIGxhdGVyDQorICAgICAgICBtQXVkaW9XYXZlZm9ybUZpbGVuYW1lID0gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIGVkaXRvciBUaGUgdmlkZW8gZWRpdG9yIHJlZmVyZW5jZQ0KKyAgICAgKiBAcGFyYW0gYXVkaW9UcmFja0lkIFRoZSBhdWRpbyB0cmFjayBpZA0KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGF1ZGlvIGZpbGVuYW1lDQorICAgICAqIEBwYXJhbSBzdGFydFRpbWVNcyB0aGUgc3RhcnQgdGltZSBpbiBtaWxsaXNlY29uZHMgKHJlbGF0aXZlIHRvIHRoZQ0KKyAgICAgKiAgICAgICAgICAgICAgdGltZWxpbmUpDQorICAgICAqIEBwYXJhbSBiZWdpbk1zIHN0YXJ0IHRpbWUgaW4gdGhlIGF1ZGlvIHRyYWNrIGluIG1pbGxpc2Vjb25kcyAocmVsYXRpdmUgdG8NCisgICAgICogICAgICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhdWRpbyB0cmFjaykNCisgICAgICogQHBhcmFtIGVuZE1zIGVuZCB0aW1lIGluIHRoZSBhdWRpbyB0cmFjayBpbiBtaWxsaXNlY29uZHMgKHJlbGF0aXZlIHRvIHRoZQ0KKyAgICAgKiAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgYXVkaW8gdHJhY2spDQorICAgICAqIEBwYXJhbSBsb29wIHRydWUgdG8gbG9vcCB0aGUgYXVkaW8gdHJhY2sNCisgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgdm9sdW1lIGluIHBlcmNlbnRhZ2UNCisgICAgICogQHBhcmFtIG11dGVkIHRydWUgaWYgdGhlIGF1ZGlvIHRyYWNrIGlzIG11dGVkDQorICAgICAqIEBwYXJhbSBhdWRpb1dhdmVmb3JtRmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIHdhdmVmb3JtIGZpbGUNCisgICAgICoNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBmaWxlIGlzIG5vdCBmb3VuZA0KKyAgICAgKi8NCisgICAgQXVkaW9UcmFjayhWaWRlb0VkaXRvciBlZGl0b3IsIFN0cmluZyBhdWRpb1RyYWNrSWQsIFN0cmluZyBmaWxlbmFtZSwgbG9uZyBzdGFydFRpbWVNcywNCisgICAgICAgICAgICBsb25nIGJlZ2luTXMsIGxvbmcgZW5kTXMsIGJvb2xlYW4gbG9vcCwgaW50IHZvbHVtZSwgYm9vbGVhbiBtdXRlZCwNCisgICAgICAgICAgICBTdHJpbmcgYXVkaW9XYXZlZm9ybUZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgbVVuaXF1ZUlkID0gYXVkaW9UcmFja0lkOw0KKyAgICAgICAgbUZpbGVuYW1lID0gZmlsZW5hbWU7DQorICAgICAgICBtU3RhcnRUaW1lTXMgPSBzdGFydFRpbWVNczsNCisNCisgICAgICAgIC8vIFRPRE86IFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0byB0aGUgZHVyYXRpb24gb2YgdGhlIGF1ZGlvIGZpbGUNCisgICAgICAgIG1EdXJhdGlvbk1zID0gMzAwMDAwOw0KKw0KKyAgICAgICAgLy8gVE9ETzogVGhpcyB2YWx1ZSBuZWVkcyB0byBiZSByZWFkIGZyb20gdGhlIGF1ZGlvIHRyYWNrIG9mIHRoZSBzb3VyY2UNCisgICAgICAgIC8vIGZpbGUNCisgICAgICAgIG1BdWRpb0NoYW5uZWxzID0gMjsNCisgICAgICAgIG1BdWRpb1R5cGUgPSBNZWRpYVByb3BlcnRpZXMuQUNPREVDX0FBQ19MQzsNCisgICAgICAgIG1BdWRpb0JpdHJhdGUgPSAxMjgwMDA7DQorICAgICAgICBtQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9IDQ0MTAwOw0KKw0KKyAgICAgICAgbVRpbWVsaW5lRHVyYXRpb25NcyA9IGVuZE1zIC0gYmVnaW5NczsNCisgICAgICAgIG1Wb2x1bWVQZXJjZW50ID0gdm9sdW1lOw0KKw0KKyAgICAgICAgbUJlZ2luQm91bmRhcnlUaW1lTXMgPSBiZWdpbk1zOw0KKyAgICAgICAgbUVuZEJvdW5kYXJ5VGltZU1zID0gZW5kTXM7DQorDQorICAgICAgICBtTG9vcCA9IGxvb3A7DQorICAgICAgICBtTXV0ZWQgPSBtdXRlZDsNCisNCisgICAgICAgIG1BdWRpb1dhdmVmb3JtRmlsZW5hbWUgPSBhdWRpb1dhdmVmb3JtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGlkIG9mIHRoZSBhdWRpbyB0cmFjaw0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCisgICAgICAgIHJldHVybiBtVW5pcXVlSWQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgZmlsZW5hbWUgc291cmNlIGZvciB0aGlzIGF1ZGlvIHRyYWNrLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBmaWxlbmFtZSBhcyBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7DQorICAgICAgICByZXR1cm4gbUZpbGVuYW1lOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgaW4gdGhlIHNvdXJjZSBvZiB0aGlzIGF1ZGlvIHRyYWNrDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldEF1ZGlvQ2hhbm5lbHMoKSB7DQorICAgICAgICByZXR1cm4gbUF1ZGlvQ2hhbm5lbHM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGF1ZGlvIGNvZGVjIG9mIHRoZSBzb3VyY2Ugb2YgdGhpcyBhdWRpbyB0cmFjaw0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRBdWRpb1R5cGUoKSB7DQorICAgICAgICByZXR1cm4gbUF1ZGlvVHlwZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYXVkaW8gc2FtcGxlIGZyZXF1ZW5jeSBvZiB0aGUgYXVkaW8gdHJhY2sNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSgpIHsNCisgICAgICAgIHJldHVybiBtQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYXVkaW8gYml0cmF0ZSBvZiB0aGUgYXVkaW8gdHJhY2sNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0QXVkaW9CaXRyYXRlKCkgew0KKyAgICAgICAgcmV0dXJuIG1BdWRpb0JpdHJhdGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNldCB0aGUgdm9sdW1lIG9mIHRoaXMgYXVkaW8gdHJhY2sgYXMgcGVyY2VudGFnZSBvZiB0aGUgdm9sdW1lIGluIHRoZQ0KKyAgICAgKiBvcmlnaW5hbCBhdWRpbyBzb3VyY2UgZmlsZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIHZvbHVtZVBlcmNlbnQgUGVyY2VudGFnZSBvZiB0aGUgdm9sdW1lIHRvIGFwcGx5LiBJZiBpdCBpcyBzZXQgdG8NCisgICAgICogICAgICAgICAgICAwLCB0aGVuIHZvbHVtZSBiZWNvbWVzIG11dGUuIEl0IGl0IGlzIHNldCB0byAxMDAsIHRoZW4gdm9sdW1lDQorICAgICAqICAgICAgICAgICAgaXMgc2FtZSBhcyBvcmlnaW5hbCB2b2x1bWUuIEl0IGl0IGlzIHNldCB0byAyMDAsIHRoZW4gdm9sdW1lDQorICAgICAqICAgICAgICAgICAgaXMgZG91YmxlZCAocHJvdmlkZWQgdGhhdCB2b2x1bWUgYW1wbGlmaWNhdGlvbiBpcyBzdXBwb3J0ZWQpDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdm9sdW1lIGFtcGxpZmljYXRpb24gaXMNCisgICAgICogICAgICAgICAgICAgcmVxdWVzdGVkIGFuZCBpcyBub3Qgc3VwcG9ydGVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lKGludCB2b2x1bWVQZXJjZW50KSB7DQorICAgICAgICBtVm9sdW1lUGVyY2VudCA9IHZvbHVtZVBlcmNlbnQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgdm9sdW1lIG9mIHRoZSBhdWRpbyB0cmFjayBhcyBwZXJjZW50YWdlIG9mIHRoZSB2b2x1bWUgaW4gdGhlDQorICAgICAqIG9yaWdpbmFsIGF1ZGlvIHNvdXJjZSBmaWxlLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSB2b2x1bWUgaW4gcGVyY2VudGFnZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7DQorICAgICAgICByZXR1cm4gbVZvbHVtZVBlcmNlbnQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBtdXRlZCB0cnVlIHRvIG11dGUgdGhlIGF1ZGlvIHRyYWNrDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRNdXRlKGJvb2xlYW4gbXV0ZWQpIHsNCisgICAgICAgIG1NdXRlZCA9IG11dGVkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGF1ZGlvIHRyYWNrIGlzIG11dGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc011dGVkKCkgew0KKyAgICAgICAgcmV0dXJuIG1NdXRlZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBzdGFydCB0aW1lIG9mIHRoaXMgYXVkaW8gdHJhY2sgcmVsYXRpdmUgdG8gdGhlIHN0b3J5Ym9hcmQNCisgICAgICogdGltZWxpbmUuIERlZmF1bHQgdmFsdWUgaXMgMC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHN0YXJ0VGltZU1zIHRoZSBzdGFydCB0aW1lIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRUaW1lKGxvbmcgc3RhcnRUaW1lTXMpIHsNCisgICAgICAgIG1TdGFydFRpbWVNcyA9IHN0YXJ0VGltZU1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgdGhlIHN0YXJ0IHRpbWUgb2YgdGhpcyBhdWRpbyB0cmFjayByZWxhdGl2ZSB0byB0aGUgc3Rvcnlib2FyZA0KKyAgICAgKiB0aW1lbGluZS4NCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgc3RhcnQgdGltZSBpbiBtaWxsaXNlY29uZHMNCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0VGltZSgpIHsNCisgICAgICAgIHJldHVybiBtU3RhcnRUaW1lTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBhdWRpbw0KKyAgICAgKiAgICAgICAgIHRyYWNrIGR1cmF0aW9uIChub3QgbG9vcGVkKQ0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oKSB7DQorICAgICAgICByZXR1cm4gbUR1cmF0aW9uTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHRpbWVsaW5lIGR1cmF0aW9uLiBJZiBsb29waW5nIGlzIGVuYWJsZWQgdGhpcyB2YWx1ZQ0KKyAgICAgKiAgICAgICAgIHJlcHJlc2VudHMgdGhlIGR1cmF0aW9uIG9mIHRoZSBsb29wZWQgYXVkaW8gdHJhY2ssIG90aGVyd2lzZSBpdA0KKyAgICAgKiAgICAgICAgIGlzIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXVkaW8gdHJhY2sgKG1EdXJhdGlvbk1zKS4NCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIGdldFRpbWVsaW5lRHVyYXRpb24oKSB7DQorICAgICAgICByZXR1cm4gbVRpbWVsaW5lRHVyYXRpb25NczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgc3RhcnQgYW5kIGVuZCBtYXJrcyBmb3IgdHJpbW1pbmcgYW4gYXVkaW8gdHJhY2sNCisgICAgICoNCisgICAgICogQHBhcmFtIGJlZ2luTXMgc3RhcnQgdGltZSBpbiB0aGUgYXVkaW8gdHJhY2sgaW4gbWlsbGlzZWNvbmRzIChyZWxhdGl2ZSB0bw0KKyAgICAgKiAgICAgICAgICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHRyYWNrKQ0KKyAgICAgKiBAcGFyYW0gZW5kTXMgZW5kIHRpbWUgaW4gdGhlIGF1ZGlvIHRyYWNrIGluIG1pbGxpc2Vjb25kcyAocmVsYXRpdmUgdG8gdGhlDQorICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBhdWRpbyB0cmFjaykNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhY3RCb3VuZGFyaWVzKGxvbmcgYmVnaW5NcywgbG9uZyBlbmRNcykgew0KKyAgICAgICAgaWYgKGJlZ2luTXMgPiBtRHVyYXRpb25Ncykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhcnQgdGltZSIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGVuZE1zID4gbUR1cmF0aW9uTXMpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGVuZCB0aW1lIik7DQorICAgICAgICB9DQorDQorICAgICAgICBtQmVnaW5Cb3VuZGFyeVRpbWVNcyA9IGJlZ2luTXM7DQorICAgICAgICBtRW5kQm91bmRhcnlUaW1lTXMgPSBlbmRNczsNCisgICAgICAgIGlmIChtTG9vcCkgew0KKyAgICAgICAgICAgIC8vIFRPRE86IENvbXB1dGUgbUR1cmF0aW9uTXMgKGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcCB1bnRpbA0KKyAgICAgICAgICAgIC8vIHRoZSBlbmQgb2YgYWxsIHRoZSBsb29wcy4NCisgICAgICAgICAgICBtVGltZWxpbmVEdXJhdGlvbk1zID0gbUVuZEJvdW5kYXJ5VGltZU1zIC0gbUJlZ2luQm91bmRhcnlUaW1lTXM7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1UaW1lbGluZUR1cmF0aW9uTXMgPSBtRW5kQm91bmRhcnlUaW1lTXMgLSBtQmVnaW5Cb3VuZGFyeVRpbWVNczsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYm91bmRhcnkgYmVnaW4gdGltZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0Qm91bmRhcnlCZWdpblRpbWUoKSB7DQorICAgICAgICByZXR1cm4gbUJlZ2luQm91bmRhcnlUaW1lTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGJvdW5kYXJ5IGVuZCB0aW1lDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXRCb3VuZGFyeUVuZFRpbWUoKSB7DQorICAgICAgICByZXR1cm4gbUVuZEJvdW5kYXJ5VGltZU1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBFbmFibGUgdGhlIGxvb3AgbW9kZSBmb3IgdGhpcyBhdWRpbyB0cmFjay4gTm90ZSB0aGF0IG9ubHkgb25lIG9mIHRoZQ0KKyAgICAgKiBhdWRpbyB0cmFja3MgaW4gdGhlIHRpbWVsaW5lIGNhbiBoYXZlIHRoZSBsb29wIG1vZGUgZW5hYmxlZC4gV2hlbiBsb29waW5nDQorICAgICAqIGlzIGVuYWJsZWQgdGhlIHNhbXBsZXMgYmV0d2VlbiBtQmVnaW5Cb3VuZGFyeVRpbWVNcyBhbmQNCisgICAgICogbUVuZEJvdW5kYXJ5VGltZU1zIGFyZSBsb29wZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVMb29wKCkgew0KKyAgICAgICAgbUxvb3AgPSB0cnVlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEaXNhYmxlIHRoZSBsb29wIG1vZGUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGRpc2FibGVMb29wKCkgew0KKyAgICAgICAgbUxvb3AgPSBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiB0cnVlIGlmIGxvb3BpbmcgaXMgZW5hYmxlZA0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gaXNMb29waW5nKCkgew0KKyAgICAgICAgcmV0dXJuIG1Mb29wOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEaXNhYmxlIHRoZSBhdWRpbyBkdWNrIGVmZmVjdA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZGlzYWJsZUR1Y2tpbmcoKSB7DQorICAgICAgICBtSXNEdWNraW5nRW5hYmxlZCA9IGZhbHNlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUT0RPIERFRklORQ0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdGhyZXNob2xkDQorICAgICAqIEBwYXJhbSBsb3dWb2x1bWUNCisgICAgICogQHBhcmFtIHZvbHVtZQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZW5hYmxlRHVja2luZyhpbnQgdGhyZXNob2xkLCBpbnQgbG93Vm9sdW1lLCBpbnQgdm9sdW1lKSB7DQorICAgICAgICBtRHVja2luZ1RocmVzaG9sZCA9IHRocmVzaG9sZDsNCisgICAgICAgIG1EdWNraW5nTG93Vm9sdW1lID0gbG93Vm9sdW1lOw0KKyAgICAgICAgbUlzRHVja2luZ0VuYWJsZWQgPSB0cnVlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZHVja2luZyBpcyBlbmFibGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R1Y2tpbmdFbmFibGVkKCkgew0KKyAgICAgICAgcmV0dXJuIG1Jc0R1Y2tpbmdFbmFibGVkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBkdWNraW5nIHRocmVzaG9sZA0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXREdWNraW5nVGhyZXNoaG9sZCgpIHsNCisgICAgICAgIHJldHVybiBtRHVja2luZ1RocmVzaG9sZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgZHVja2luZyBsb3cgbGV2ZWwNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0RHVja2luZ0xvd1ZvbHVtZSgpIHsNCisgICAgICAgIHJldHVybiBtRHVja2luZ0xvd1ZvbHVtZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBBUEkgYWxsb3dzIHRvIGdlbmVyYXRlIGEgZmlsZSBjb250YWluaW5nIHRoZSBzYW1wbGUgdm9sdW1lIGxldmVscyBvZg0KKyAgICAgKiB0aGlzIGF1ZGlvIHRyYWNrIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBtYXkgdGFrZSBzaWduaWZpY2FudCB0aW1lIGFuZCBpcw0KKyAgICAgKiBibG9ja2luZy4gVGhlIGZpbGVuYW1lIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgZ2V0QXVkaW9XYXZlZm9ybUZpbGVuYW1lKCkuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgcHJvZ3Jlc3MgbGlzdGVuZXINCisgICAgICoNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgb3V0cHV0IGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGF1ZGlvIGZpbGUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkDQorICAgICAqICAgICAgICAgICAgIGF1ZGlvIHRyYWNrDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBleHRyYWN0QXVkaW9XYXZlZm9ybShFeHRyYWN0QXVkaW9XYXZlZm9ybVByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpDQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIC8vIFRPRE86IFNldCBtQXVkaW9XYXZlZm9ybUZpbGVuYW1lIGF0IHRoZSBlbmQgb25jZSB0aGUgZXh0cmFjdCBpcw0KKyAgICAgICAgLy8gY29tcGxldGUNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSBhdWRpbyB3YXZlZm9ybSBmaWxlIG5hbWUgaWYgZXh0cmFjdEF1ZGlvV2F2ZWZvcm0gd2FzIHN1Y2Nlc3NmdWwuDQorICAgICAqIFRoZSBmaWxlIGZvcm1hdCBpcyBhcyBmb2xsb3dpbmc6DQorICAgICAqIDx1bD4NCisgICAgICogPGxpPmZpcnN0IDQgYnl0ZXMgcHJvdmlkZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIGVhY2ggdmFsdWUsIGFzDQorICAgICAqIGJpZy1lbmRpYW4gc2lnbmVkPC9saT4NCisgICAgICogPGxpPjQgZm9sbG93aW5nIGJ5dGVzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBmaWxlLCBhcw0KKyAgICAgKiBiaWctZW5kaWFuIHNpZ25lZDwvbGk+DQorICAgICAqIDxsaT50aGVuLCBhbGwgdmFsdWVzIGZvbGxvdyBhcyBieXRlczwvbGk+DQorICAgICAqIDwvdWw+DQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpbGUsIG51bGwgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXVkaW9XYXZlZm9ybUZpbGVuYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1BdWRpb1dhdmVmb3JtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7DQorICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBBdWRpb1RyYWNrKSkgew0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBtVW5pcXVlSWQuZXF1YWxzKCgoQXVkaW9UcmFjaylvYmplY3QpLm1VbmlxdWVJZCk7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkLmhhc2hDb2RlKCk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0VmZmVjdC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0VmZmVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1ZTZhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvRWZmZWN0LmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIHN1cGVyIGNsYXNzIGZvciBhbGwgZWZmZWN0cy4gQW4gZWZmZWN0IGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYQ0KKyAqIHNpbmdsZSBtZWRpYSBpdGVtLiBJZiBvbmUgd2FudHMgdG8gYXBwbHkgdGhlIHNhbWUgZWZmZWN0IHRvIG11bHRpcGxlIG1lZGlhDQorICogaXRlbXMsIG11bHRpcGxlIEB7TWVkaWFJdGVtLmFkZEVmZmVjdChFZmZlY3QpfSBjYWxsIG11c3QgYmUgaW52b2tlZCBvbiBlYWNoDQorICogb2YgdGhlIE1lZGlhSXRlbSBvYmplY3RzLg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWZmZWN0IHsNCisgICAgLy8gSW5zdGFuY2UgdmFyaWFibGVzDQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1VbmlxdWVJZDsNCisgICAgLy8gVGhlIGVmZmVjdCBvd25lcg0KKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhSXRlbSBtTWVkaWFJdGVtOw0KKyAgICBwcm90ZWN0ZWQgbG9uZyBtRHVyYXRpb25NczsNCisgICAgLy8gVGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGVmZmVjdCByZWxhdGl2ZSB0byB0aGUgbWVkaWEgaXRlbSB0aW1lbGluZQ0KKyAgICBwcm90ZWN0ZWQgbG9uZyBtU3RhcnRUaW1lTXM7DQorDQorICAgIC8qKg0KKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBFZmZlY3QoKSB7DQorICAgICAgICBtTWVkaWFJdGVtID0gbnVsbDsNCisgICAgICAgIG1VbmlxdWVJZCA9IG51bGw7DQorICAgICAgICBtU3RhcnRUaW1lTXMgPSAwOw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSAwOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvcg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtIFRoZSBtZWRpYSBpdGVtIG93bmVyDQorICAgICAqIEBwYXJhbSBlZmZlY3RJZCBUaGUgZWZmZWN0IGlkDQorICAgICAqIEBwYXJhbSBzdGFydFRpbWVNcyBUaGUgc3RhcnQgdGltZSByZWxhdGl2ZSB0byB0aGUgbWVkaWEgaXRlbSB0byB3aGljaCBpdA0KKyAgICAgKiAgICAgICAgICAgIGlzIGFwcGxpZWQNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgVGhlIGVmZmVjdCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICovDQorICAgIHB1YmxpYyBFZmZlY3QoTWVkaWFJdGVtIG1lZGlhSXRlbSwgU3RyaW5nIGVmZmVjdElkLCBsb25nIHN0YXJ0VGltZU1zLCBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1lZGlhIGl0ZW0gY2Fubm90IGJlIG51bGwiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChzdGFydFRpbWVNcyArIGR1cmF0aW9uTXMgPiBtZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbU1lZGlhSXRlbSA9IG1lZGlhSXRlbTsNCisgICAgICAgIG1VbmlxdWVJZCA9IGVmZmVjdElkOw0KKyAgICAgICAgbVN0YXJ0VGltZU1zID0gc3RhcnRUaW1lTXM7DQorICAgICAgICBtRHVyYXRpb25NcyA9IGR1cmF0aW9uTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGlkIG9mIHRoZSBlZmZlY3QNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuIElmIGEgcHJldmlldyBvciBleHBvcnQgaXMgaW4gcHJvZ3Jlc3MsDQorICAgICAqIHRoZW4gdGhpcyBjaGFuZ2UgaXMgZWZmZWN0aXZlIGZvciBuZXh0IHByZXZpZXcgb3IgZXhwb3J0IHNlc3Npb24uIHMNCisgICAgICoNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgb2YgdGhlIGVmZmVjdCBpbiBtaWxsaXNlY29uZHMNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb25Ncykgew0KKyAgICAgICAgaWYgKG1TdGFydFRpbWVNcyArIGR1cmF0aW9uTXMgPiBtTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkR1cmF0aW9uIGlzIHRvbyBsYXJnZSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKw0KKyAgICAgICAgbU1lZGlhSXRlbS5pbnZhbGlkYXRlVHJhbnNpdGlvbnModGhpcyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oKSB7DQorICAgICAgICByZXR1cm4gbUR1cmF0aW9uTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNldCBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3QuIElmIGEgcHJldmlldyBvciBleHBvcnQgaXMgaW4gcHJvZ3Jlc3MsIHRoZW4NCisgICAgICogdGhpcyBjaGFuZ2UgaXMgZWZmZWN0aXZlIGZvciBuZXh0IHByZXZpZXcgb3IgZXhwb3J0IHNlc3Npb24uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzdGFydFRpbWVNcyBUaGUgc3RhcnQgdGltZSBvZiB0aGUgZWZmZWN0IHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcNCisgICAgICogICAgICAgICAgICBvZiB0aGUgbWVkaWEgaXRlbSBpbiBtaWxsaXNlY29uZHMNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0VGltZShsb25nIHN0YXJ0VGltZU1zKSB7DQorICAgICAgICBpZiAoc3RhcnRUaW1lTXMgKyBtRHVyYXRpb25NcyA+IG1NZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RhcnQgdGltZSBpcyB0b28gbGFyZ2UiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIG1TdGFydFRpbWVNcyA9IHN0YXJ0VGltZU1zOw0KKw0KKyAgICAgICAgbU1lZGlhSXRlbS5pbnZhbGlkYXRlVHJhbnNpdGlvbnModGhpcyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydFRpbWUoKSB7DQorICAgICAgICByZXR1cm4gbVN0YXJ0VGltZU1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXQgdGhlIHN0YXJ0IHRpbWUgYW5kIGR1cmF0aW9uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzdGFydFRpbWVNcyBzdGFydCB0aW1lIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFRpbWVBbmREdXJhdGlvbihsb25nIHN0YXJ0VGltZU1zLCBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIGlmIChzdGFydFRpbWVNcyArIGR1cmF0aW9uTXMgPiBtTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhcnQgdGltZSBvciBkdXJhdGlvbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbVN0YXJ0VGltZU1zID0gc3RhcnRUaW1lTXM7DQorICAgICAgICBtRHVyYXRpb25NcyA9IGR1cmF0aW9uTXM7DQorDQorICAgICAgICBtTWVkaWFJdGVtLmludmFsaWRhdGVUcmFuc2l0aW9ucyh0aGlzKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbWVkaWEgaXRlbSBvd25lcg0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSXRlbSBnZXRNZWRpYUl0ZW0oKSB7DQorICAgICAgICByZXR1cm4gbU1lZGlhSXRlbTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsNCisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIEVmZmVjdCkpIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkLmVxdWFscygoKEVmZmVjdClvYmplY3QpLm1VbmlxdWVJZCk7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkLmhhc2hDb2RlKCk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0VmZmVjdENvbG9yLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvRWZmZWN0Q29sb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMzhjZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0VmZmVjdENvbG9yLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIGFwcGx5IGNvbG9yIG9uIGEgbWVkaWEgaXRlbS4NCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIEVmZmVjdENvbG9yIGV4dGVuZHMgRWZmZWN0IHsNCisNCisgICAgLyoqDQorICAgICAqIENoYW5nZSB0aGUgdmlkZW8gZnJhbWUgY29sb3IgdG8gdGhlIFJHQiBjb2xvciB2YWx1ZSBwcm92aWRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DT0xPUiA9IDE7IC8vIGNvbG9yIGFzIDg4OCBSR0INCisgICAgLyoqDQorICAgICAqIENoYW5nZSB0aGUgdmlkZW8gZnJhbWUgY29sb3IgdG8gYSBncmFkYXRpb24gZnJvbSBSR0IgY29sb3IgKGF0IHRoZSB0b3Agb2YNCisgICAgICogdGhlIGZyYW1lKSB0byBibGFjayAoYXQgdGhlIGJvdHRvbSBvZiB0aGUgZnJhbWUpLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9HUkFESUVOVCA9IDI7DQorICAgIC8qKg0KKyAgICAgKiBDaGFuZ2UgdGhlIHZpZGVvIGZyYW1lIGNvbG9yIHRvIHNlcGlhDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NFUElBID0gMzsNCisgICAgLyoqDQorICAgICAqIEludmVydCB0aGUgdmlkZW8gZnJhbWUgY29sb3INCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTkVHQVRJVkUgPSA0Ow0KKyAgICAvKioNCisgICAgICogTWFrZSB0aGUgdmlkZW8gbG9vayBsaWtlIGFzIGlmIGl0IHdhcyByZWNvcmRlZCBpbiA1MCdzDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZJRlRJRVMgPSA1Ow0KKw0KKyAgICAvLyBDb2xvcnMgZm9yIHRoZSBjb2xvciBlZmZlY3QNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JFRU4gPSAweDAwMDBmZjAwOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSU5LID0gMHgwMGZmNjZjYzsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JBWSA9IDB4MDA3ZjdmN2Y7DQorDQorICAgIC8vIFRoZSBlZmZlY3QgdHlwZQ0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtVHlwZTsNCisNCisgICAgLy8gVGhlIGVmZmVjdCBwYXJhbWV0ZXINCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVBhcmFtOw0KKw0KKyAgICAvKioNCisgICAgICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGJ5IHVzaW5nIHRoZSBkZWZhdWx0DQorICAgICAqIGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBFZmZlY3RDb2xvcigpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgMCwgMCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSBtZWRpYUl0ZW0gVGhlIG1lZGlhIGl0ZW0gb3duZXINCisgICAgICogQHBhcmFtIGVmZmVjdElkIFRoZSBlZmZlY3QgaWQNCisgICAgICogQHBhcmFtIHN0YXJ0VGltZU1zIFRoZSBzdGFydCB0aW1lIHJlbGF0aXZlIHRvIHRoZSBtZWRpYSBpdGVtIHRvIHdoaWNoIGl0DQorICAgICAqICAgICAgICAgICAgaXMgYXBwbGllZA0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gb2YgdGhpcyBlZmZlY3QgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdGhlIGVmZmVjdC4gdHlwZSBpcyBvbmUgb2Y6IFRZUEVfQ09MT1IsDQorICAgICAqICAgICAgICAgICAgVFlQRV9HUkFESUVOVCwgVFlQRV9TRVBJQSwgVFlQRV9ORUdBVElWRSwgVFlQRV9GSUZUSUVTLiBJZg0KKyAgICAgKiAgICAgICAgICAgIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgdGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQNCisgICAgICogQHBhcmFtIHBhcmFtIGlmIHR5cGUgaXMgVFlQRV9DT0xPUiwgcGFyYW0gaXMgdGhlIFJHQiBjb2xvciBhcyA4ODguDQorICAgICAqICAgICAgICAgICAgT3RoZXJ3aXNlLCBwYXJhbSBpcyBpZ25vcmVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgRWZmZWN0Q29sb3IoTWVkaWFJdGVtIG1lZGlhSXRlbSwgU3RyaW5nIGVmZmVjdElkLCBsb25nIHN0YXJ0VGltZU1zLCBsb25nIGR1cmF0aW9uTXMsDQorICAgICAgICAgICAgaW50IHR5cGUsIGludCBwYXJhbSkgew0KKyAgICAgICAgc3VwZXIobWVkaWFJdGVtLCBlZmZlY3RJZCwgc3RhcnRUaW1lTXMsIGR1cmF0aW9uTXMpOw0KKyAgICAgICAgbVR5cGUgPSB0eXBlOw0KKyAgICAgICAgbVBhcmFtID0gcGFyYW07DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhpcyBlZmZlY3QNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsNCisgICAgICAgIHJldHVybiBtVHlwZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiB0aGUgY29sb3IgYXMgUkdCIDg4OCBpZiB0eXBlIGlzIFRZUEVfQ09MT1IuIE90aGVyd2lzZSwgaWdub3JlLg0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRQYXJhbSgpIHsNCisgICAgICAgIHJldHVybiBtUGFyYW07DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0VmZmVjdEtlbkJ1cm5zLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvRWZmZWN0S2VuQnVybnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZTJlNzBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0VmZmVjdEtlbkJ1cm5zLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBLZW4gQnVybnMgZWZmZWN0Lg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgRWZmZWN0S2VuQnVybnMgZXh0ZW5kcyBFZmZlY3Qgew0KKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMNCisgICAgcHJpdmF0ZSBSZWN0IG1TdGFydFJlY3Q7DQorICAgIHByaXZhdGUgUmVjdCBtRW5kUmVjdDsNCisNCisgICAgLyoqDQorICAgICAqIE9iamVjdHMgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYnkgdXNpbmcgdGhlIGRlZmF1bHQNCisgICAgICogY29uc3RydWN0b3INCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KKyAgICBwcml2YXRlIEVmZmVjdEtlbkJ1cm5zKCkgew0KKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCAwKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbSBUaGUgbWVkaWEgaXRlbSBvd25lcg0KKyAgICAgKiBAcGFyYW0gZWZmZWN0SWQgVGhlIGVmZmVjdCBpZA0KKyAgICAgKiBAcGFyYW0gc3RhcnRSZWN0IFRoZSBzdGFydCByZWN0YW5nbGUNCisgICAgICogQHBhcmFtIGVuZFJlY3QgVGhlIGVuZCByZWN0YW5nbGUNCisgICAgICogQHBhcmFtIHN0YXJ0VGltZU1zIFRoZSBzdGFydCB0aW1lDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIFRoZSBkdXJhdGlvbiBvZiB0aGUgS2VuIEJ1cm5zIGVmZmVjdCBpbiBtaWxsaXNlY29uZHMNCisgICAgICovDQorICAgIHB1YmxpYyBFZmZlY3RLZW5CdXJucyhNZWRpYUl0ZW0gbWVkaWFJdGVtLCBTdHJpbmcgZWZmZWN0SWQsIFJlY3Qgc3RhcnRSZWN0LCBSZWN0IGVuZFJlY3QsDQorICAgICAgICAgICAgbG9uZyBzdGFydFRpbWVNcywgbG9uZyBkdXJhdGlvbk1zKSB7DQorICAgICAgICBzdXBlcihtZWRpYUl0ZW0sIGVmZmVjdElkLCBzdGFydFRpbWVNcywgZHVyYXRpb25Ncyk7DQorDQorICAgICAgICBtU3RhcnRSZWN0ID0gc3RhcnRSZWN0Ow0KKyAgICAgICAgbUVuZFJlY3QgPSBlbmRSZWN0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gc3RhcnRSZWN0IFRoZSBzdGFydCByZWN0YW5nbGUNCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc3RhcnQgcmVjdGFuZ2xlIGlzIGluY29ycmVjdGx5IHNldC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0UmVjdChSZWN0IHN0YXJ0UmVjdCkgew0KKyAgICAgICAgbVN0YXJ0UmVjdCA9IHN0YXJ0UmVjdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgc3RhcnQgcmVjdGFuZ2xlDQorICAgICAqLw0KKyAgICBwdWJsaWMgUmVjdCBnZXRTdGFydFJlY3QoKSB7DQorICAgICAgICByZXR1cm4gbVN0YXJ0UmVjdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIGVuZFJlY3QgVGhlIGVuZCByZWN0YW5nbGUNCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZW5kIHJlY3RhbmdsZSBpcyBpbmNvcnJlY3RseSBzZXQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmRSZWN0KFJlY3QgZW5kUmVjdCkgew0KKyAgICAgICAgbUVuZFJlY3QgPSBlbmRSZWN0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBlbmQgcmVjdGFuZ2xlDQorICAgICAqLw0KKyAgICBwdWJsaWMgUmVjdCBnZXRFbmRSZWN0KCkgew0KKyAgICAgICAgcmV0dXJuIG1FbmRSZWN0Ow0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9FeHRyYWN0QXVkaW9XYXZlZm9ybVByb2dyZXNzTGlzdGVuZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9FeHRyYWN0QXVkaW9XYXZlZm9ybVByb2dyZXNzTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NlMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0V4dHJhY3RBdWRpb1dhdmVmb3JtUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7CisKKy8qKgorICogVGhpcyBsaXN0ZW5lciBpbnRlcmZhY2UgaXMgdXNlZCBieQorICoge0BsaW5rIE1lZGlhVmlkZW9JdGVtI2V4dHJhY3RBdWRpb1dhdmVmb3JtKEV4dHJhY3RBdWRpb1dhdmVmb3JtUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcil9CisgKiBvcgorICoge0BsaW5rIEF1ZGlvVHJhY2sjZXh0cmFjdEF1ZGlvV2F2ZWZvcm0oRXh0cmFjdEF1ZGlvV2F2ZWZvcm1Qcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKX0KKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGludGVyZmFjZSBFeHRyYWN0QXVkaW9XYXZlZm9ybVByb2dyZXNzTGlzdGVuZXIgeworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIHRoZSBsaXN0ZW5lciBvZiB0aGUgcHJvZ3Jlc3Mgc3RhdHVzIG9mCisgICAgICogYW4gZXh0cmFjdEF1ZGlvV2F2ZWZvcm0gb3BlcmF0aW9uLgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbWF4aW11bSAxMDAgdGltZXMgZm9yIG9uZSBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvZ3Jlc3MgVGhlIHByb2dyZXNzIGluICUuIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wZXJhdGlvbiwKKyAgICAgKiAgICAgICAgICB0aGlzIHZhbHVlIGlzIHNldCB0byAwOyBhdCB0aGUgZW5kLCB0aGUgdmFsdWUgaXMgc2V0IHRvIDEwMC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzKGludCBwcm9ncmVzcyk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9NZWRpYUltYWdlSXRlbS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL01lZGlhSW1hZ2VJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGYzYzVmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9NZWRpYUltYWdlSXRlbS5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCisNCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7DQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsNCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7DQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7DQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsNCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsNCitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGltYWdlIGl0ZW0gb24gdGhlIHN0b3J5Ym9hcmQuIE5vdGUgdGhhdCBpbWFnZXMgYXJlDQorICogc2NhbGVkIGRvd24gdG8gdGhlIG1heGltdW0gc3VwcG9ydGVkIHJlc29sdXRpb24gYnkgcHJlc2VydmluZyB0aGUgbmF0aXZlDQorICogYXNwZWN0IHJhdGlvLiBUbyBsZWFybiB0aGUgc2NhbGVkIGltYWdlIGRpbWVuc2lvbnMgdXNlDQorICoge0BsaW5rICNnZXRTY2FsZWRXaWR0aCgpfSBhbmQge0BsaW5rICNnZXRTY2FsZWRIZWlnaHQoKX0gcmVzcGVjdGl2ZWx5Lg0KKyAqDQorICoge0BoaWRlfQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNZWRpYUltYWdlSXRlbSBleHRlbmRzIE1lZGlhSXRlbSB7DQorICAgIC8vIExvZ2dpbmcNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUltYWdlSXRlbSI7DQorDQorICAgIC8vIFRoZSByZXNpemUgcGFpbnQNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFpbnQgc1Jlc2l6ZVBhaW50ID0gbmV3IFBhaW50KFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyk7DQorDQorICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcw0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtV2lkdGg7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1IZWlnaHQ7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1Bc3BlY3RSYXRpbzsNCisgICAgcHJpdmF0ZSBsb25nIG1EdXJhdGlvbk1zOw0KKyAgICBwcml2YXRlIGludCBtU2NhbGVkV2lkdGgsIG1TY2FsZWRIZWlnaHQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYnkgdXNpbmcgdGhlIGRlZmF1bHQgY29uc3RydWN0b3INCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KKyAgICBwcml2YXRlIE1lZGlhSW1hZ2VJdGVtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgMCwgUkVOREVSSU5HX01PREVfQkxBQ0tfQk9SREVSKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIGVkaXRvciBUaGUgdmlkZW8gZWRpdG9yIHJlZmVyZW5jZQ0KKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtSWQgVGhlIG1lZGlhIGl0ZW0gaWQNCisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBpbWFnZSBmaWxlIG5hbWUNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgVGhlIGR1cmF0aW9uIG9mIHRoZSBpbWFnZSBvbiB0aGUgc3Rvcnlib2FyZA0KKyAgICAgKiBAcGFyYW0gcmVuZGVyaW5nTW9kZSBUaGUgcmVuZGVyaW5nIG1vZGUNCisgICAgICoNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSW1hZ2VJdGVtKFZpZGVvRWRpdG9yIGVkaXRvciwgU3RyaW5nIG1lZGlhSXRlbUlkLCBTdHJpbmcgZmlsZW5hbWUsIGxvbmcgZHVyYXRpb25NcywNCisgICAgICAgICAgICBpbnQgcmVuZGVyaW5nTW9kZSkNCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgc3VwZXIoZWRpdG9yLCBtZWRpYUl0ZW1JZCwgZmlsZW5hbWUsIHJlbmRlcmluZ01vZGUpOw0KKw0KKyAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBpbWFnZQ0KKyAgICAgICAgZmluYWwgQml0bWFwRmFjdG9yeS5PcHRpb25zIGRibyA9IG5ldyBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMoKTsNCisgICAgICAgIGRiby5pbkp1c3REZWNvZGVCb3VuZHMgPSB0cnVlOw0KKyAgICAgICAgQml0bWFwRmFjdG9yeS5kZWNvZGVGaWxlKGZpbGVuYW1lLCBkYm8pOw0KKw0KKyAgICAgICAgbVdpZHRoID0gZGJvLm91dFdpZHRoOw0KKyAgICAgICAgbUhlaWdodCA9IGRiby5vdXRIZWlnaHQ7DQorICAgICAgICBtRHVyYXRpb25NcyA9IGR1cmF0aW9uTXM7DQorDQorICAgICAgICAvLyBUT0RPOiBEZXRlcm1pbmUgdGhlIGFzcGVjdCByYXRpbyBmcm9tIHRoZSB3aWR0aCBhbmQgaGVpZ2h0DQorICAgICAgICBtQXNwZWN0UmF0aW8gPSBNZWRpYVByb3BlcnRpZXMuQVNQRUNUX1JBVElPXzRfMzsNCisNCisgICAgICAgIC8vIEltYWdlcyBhcmUgc3RvcmVkIGluIG1lbW9yeSBzY2FsZWQgdG8gdGhlIG1heGltdW0gcmVzb2x1dGlvbiB0bw0KKyAgICAgICAgLy8gc2F2ZSBtZW1vcnkuDQorICAgICAgICBmaW5hbCBQYWlyPEludGVnZXIsIEludGVnZXI+W10gcmVzb2x1dGlvbnMgPQ0KKyAgICAgICAgICAgIE1lZGlhUHJvcGVydGllcy5nZXRTdXBwb3J0ZWRSZXNvbHV0aW9ucyhtQXNwZWN0UmF0aW8pOw0KKyAgICAgICAgLy8gR2V0IHRoZSBoaWdoZXN0IHJlc29sdXRpb24NCisgICAgICAgIGZpbmFsIFBhaXI8SW50ZWdlciwgSW50ZWdlcj4gbWF4UmVzb2x1dGlvbiA9IHJlc29sdXRpb25zW3Jlc29sdXRpb25zLmxlbmd0aCAtIDFdOw0KKyAgICAgICAgaWYgKG1IZWlnaHQgPiBtYXhSZXNvbHV0aW9uLnNlY29uZCkgew0KKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2NhbGUgdGhlIGltYWdlDQorICAgICAgICAgICAgc2NhbGVJbWFnZShmaWxlbmFtZSwgbWF4UmVzb2x1dGlvbi5maXJzdCwgbWF4UmVzb2x1dGlvbi5zZWNvbmQpOw0KKyAgICAgICAgICAgIG1TY2FsZWRXaWR0aCA9IG1heFJlc29sdXRpb24uZmlyc3Q7DQorICAgICAgICAgICAgbVNjYWxlZEhlaWdodCA9IG1heFJlc29sdXRpb24uc2Vjb25kOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtU2NhbGVkV2lkdGggPSBtV2lkdGg7DQorICAgICAgICAgICAgbVNjYWxlZEhlaWdodCA9IG1IZWlnaHQ7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgZ2V0RmlsZVR5cGUoKSB7DQorICAgICAgICBpZiAobUZpbGVuYW1lLmVuZHNXaXRoKCIuanBnIikgfHwgbUZpbGVuYW1lLmVuZHNXaXRoKCIuanBlZyIpKSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lZGlhUHJvcGVydGllcy5GSUxFX0pQRUc7DQorICAgICAgICB9IGVsc2UgaWYgKG1GaWxlbmFtZS5lbmRzV2l0aCgiLnBuZyIpKSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lZGlhUHJvcGVydGllcy5GSUxFX1BORzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIE1lZGlhUHJvcGVydGllcy5GSUxFX1VOU1VQUE9SVEVEOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgew0KKyAgICAgICAgcmV0dXJuIG1XaWR0aDsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7DQorICAgICAgICByZXR1cm4gbUhlaWdodDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgc2NhbGVkIHdpZHRoIG9mIHRoZSBpbWFnZS4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0U2NhbGVkV2lkdGgoKSB7DQorICAgICAgICByZXR1cm4gbVNjYWxlZFdpZHRoOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBzY2FsZWQgaGVpZ2h0IG9mIHRoZSBpbWFnZS4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0U2NhbGVkSGVpZ2h0KCkgew0KKyAgICAgICAgcmV0dXJuIG1TY2FsZWRIZWlnaHQ7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgZ2V0QXNwZWN0UmF0aW8oKSB7DQorICAgICAgICByZXR1cm4gbUFzcGVjdFJhdGlvOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFkanVzdCB0aGUgZHVyYXRpb24gb2YgYm91bmRpbmcgdHJhbnNpdGlvbnMsIGVmZmVjdHMNCisgICAgICogYW5kIG92ZXJsYXlzIGlmIHRoZSBjdXJyZW50IGR1cmF0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbnMgYmVjb21lIGdyZWF0ZXINCisgICAgICogdGhhbiB0aGUgbWF4aW11bSBhbGxvd2FibGUgZHVyYXRpb24uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIFRoZSBkdXJhdGlvbiBvZiB0aGUgaW1hZ2UgaW4gdGhlIHN0b3J5Ym9hcmQgdGltZWxpbmUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb25Ncykgew0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKw0KKyAgICAgICAgYWRqdXN0RWxlbWVudHNEdXJhdGlvbigpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lbGluZUR1cmF0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbk1zOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgQml0bWFwIGdldFRodW1ibmFpbChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGxvbmcgdGltZU1zKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIHNjYWxlSW1hZ2UobUZpbGVuYW1lLCB3aWR0aCwgaGVpZ2h0KTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIEJpdG1hcFtdIGdldFRodW1ibmFpbExpc3QoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBsb25nIHN0YXJ0TXMsIGxvbmcgZW5kTXMsDQorICAgICAgICAgICAgaW50IHRodW1ibmFpbENvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgZmluYWwgQml0bWFwIHRodW1ibmFpbCA9IHNjYWxlSW1hZ2UobUZpbGVuYW1lLCB3aWR0aCwgaGVpZ2h0KTsNCisgICAgICAgIGZpbmFsIEJpdG1hcFtdIHRodW1ibmFpbEFycmF5ID0gbmV3IEJpdG1hcFt0aHVtYm5haWxDb3VudF07DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRodW1ibmFpbENvdW50OyBpKyspIHsNCisgICAgICAgICAgICB0aHVtYm5haWxBcnJheVtpXSA9IHRodW1ibmFpbDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aHVtYm5haWxBcnJheTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVzaXplIGEgYml0bWFwIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodA0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGVuYW1lDQorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgdGh1bWJuYWlsIHdpZHRoDQorICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIHRodW1ibmFpbCBoZWlnaHQNCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgcmVzaXplZCBiaXRtYXANCisgICAgICovDQorICAgIHByaXZhdGUgQml0bWFwIHNjYWxlSW1hZ2UoU3RyaW5nIGZpbGVuYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpDQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGZpbmFsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBkYm8gPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7DQorICAgICAgICBkYm8uaW5KdXN0RGVjb2RlQm91bmRzID0gdHJ1ZTsNCisgICAgICAgIEJpdG1hcEZhY3RvcnkuZGVjb2RlRmlsZShmaWxlbmFtZSwgZGJvKTsNCisNCisgICAgICAgIGZpbmFsIGludCBuYXRpdmVXaWR0aCA9IGRiby5vdXRXaWR0aDsNCisgICAgICAgIGZpbmFsIGludCBuYXRpdmVIZWlnaHQgPSBkYm8ub3V0SGVpZ2h0Ow0KKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgew0KKyAgICAgICAgICAgIExvZy5kKFRBRywgImdlbmVyYXRlVGh1bWJuYWlsOiBJbnB1dDogIiArIG5hdGl2ZVdpZHRoICsgIngiICsgbmF0aXZlSGVpZ2h0DQorICAgICAgICAgICAgICAgICAgICArICIsIHJlc2l6ZSB0bzogIiArIHdpZHRoICsgIngiICsgaGVpZ2h0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZpbmFsIEJpdG1hcCBzcmNCaXRtYXA7DQorICAgICAgICBmbG9hdCBiaXRtYXBXaWR0aCwgYml0bWFwSGVpZ2h0Ow0KKyAgICAgICAgaWYgKG5hdGl2ZVdpZHRoID4gd2lkdGggfHwgbmF0aXZlSGVpZ2h0ID4gaGVpZ2h0KSB7DQorICAgICAgICAgICAgZmxvYXQgZHggPSAoKGZsb2F0KW5hdGl2ZVdpZHRoKSAvICgoZmxvYXQpd2lkdGgpOw0KKyAgICAgICAgICAgIGZsb2F0IGR5ID0gKChmbG9hdCluYXRpdmVIZWlnaHQpIC8gKChmbG9hdCloZWlnaHQpOw0KKyAgICAgICAgICAgIGlmIChkeCA+IGR5KSB7DQorICAgICAgICAgICAgICAgIGJpdG1hcFdpZHRoID0gd2lkdGg7DQorICAgICAgICAgICAgICAgIGJpdG1hcEhlaWdodCA9IG5hdGl2ZUhlaWdodCAvIGR4Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJpdG1hcFdpZHRoID0gbmF0aXZlV2lkdGggLyBkeTsNCisgICAgICAgICAgICAgICAgYml0bWFwSGVpZ2h0ID0gaGVpZ2h0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGJpdG1hcCBmcm9tIGZpbGUNCisgICAgICAgICAgICBpZiAobmF0aXZlV2lkdGggLyBiaXRtYXBXaWR0aCA+IDEpIHsNCisgICAgICAgICAgICAgICAgZmluYWwgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7DQorICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5TYW1wbGVTaXplID0gbmF0aXZlV2lkdGggLyAoaW50KWJpdG1hcFdpZHRoOw0KKyAgICAgICAgICAgICAgICBzcmNCaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUZpbGUoZmlsZW5hbWUsIG9wdGlvbnMpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHNyY0JpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlRmlsZShmaWxlbmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBiaXRtYXBXaWR0aCA9IHdpZHRoOw0KKyAgICAgICAgICAgIGJpdG1hcEhlaWdodCA9IGhlaWdodDsNCisgICAgICAgICAgICBzcmNCaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUZpbGUoZmlsZW5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKHNyY0JpdG1hcCA9PSBudWxsKSB7DQorICAgICAgICAgICAgTG9nLmUoVEFHLCAiZ2VuZXJhdGVUaHVtYm5haWw6IENhbm5vdCBkZWNvZGUgaW1hZ2UgYnl0ZXMiKTsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBkZWNvZGUgZmlsZTogIiArIG1GaWxlbmFtZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBDcmVhdGUgdGhlIGNhbnZhcyBiaXRtYXANCisgICAgICAgIGZpbmFsIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKChpbnQpYml0bWFwV2lkdGgsIChpbnQpYml0bWFwSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7DQorICAgICAgICBmaW5hbCBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhiaXRtYXApOw0KKyAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAoc3JjQml0bWFwLCBuZXcgUmVjdCgwLCAwLCBzcmNCaXRtYXAuZ2V0V2lkdGgoKSwgc3JjQml0bWFwLmdldEhlaWdodCgpKSwNCisgICAgICAgICAgICAgICAgbmV3IFJlY3QoMCwgMCwgKGludCliaXRtYXBXaWR0aCwgKGludCliaXRtYXBIZWlnaHQpLCBzUmVzaXplUGFpbnQpOw0KKyAgICAgICAgLy8gUmVsZWFzZSB0aGUgc291cmNlIGJpdG1hcA0KKyAgICAgICAgc3JjQml0bWFwLnJlY3ljbGUoKTsNCisgICAgICAgIHJldHVybiBiaXRtYXA7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL01lZGlhSXRlbS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL01lZGlhSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5YzM4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvTWVkaWFJdGVtLmphdmEKQEAgLTAsMCArMSw1NDYgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7DQorDQorLyoqDQorICogVGhpcyBhYnN0cmFjdCBjbGFzcyBkZXNjcmliZXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFueSBNZWRpYUl0ZW0uIE9iamVjdHMgYXJlDQorICogZGVmaW5lZCB3aXRoIGEgZmlsZSBwYXRoIGFzIGEgc291cmNlIGRhdGEuDQorICoge0BoaWRlfQ0KK3MgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFJdGVtIHsNCisgICAgLy8gQSBjb25zdGFudCB3aGljaCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBlbmQgb2YgdGhlIGZpbGUgKGluc3RlYWQgb2YNCisgICAgLy8gcHJvdmlkaW5nIHRoZSBhY3R1YWwgZHVyYXRpb24gb2YgdGhlIG1lZGlhIGl0ZW0pLg0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTkRfT0ZfRklMRSA9IC0xOw0KKw0KKyAgICAvLyBSZW5kZXJpbmcgbW9kZXMNCisgICAgLyoqDQorICAgICAqIFdoZW4gdXNpbmcgdGhlIFJFTkRFUklOR19NT0RFX0JMQUNLX0JPUkRFUiByZW5kZXJpbmcgbW9kZSB2aWRlbyBmcmFtZXMNCisgICAgICogYXJlIHJlc2l6ZWQgYnkgcHJlc2VydmluZyB0aGUgYXNwZWN0IHJhdGlvIHVudGlsIHRoZSBtb3ZpZSBtYXRjaGVzIG9uZSBvZg0KKyAgICAgKiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgb3V0cHV0IG1vdmllLiBUaGUgYXJlYXMgb3V0c2lkZSB0aGUgcmVzaXplZCB2aWRlbw0KKyAgICAgKiBjbGlwIGFyZSByZW5kZXJlZCBibGFjay4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTkRFUklOR19NT0RFX0JMQUNLX0JPUkRFUiA9IDA7DQorICAgIC8qKg0KKyAgICAgKiBXaGVuIHVzaW5nIHRoZSBSRU5ERVJJTkdfTU9ERV9TVFJFVENIIHJlbmRlcmluZyBtb2RlIHZpZGVvIGZyYW1lcyBhcmUNCisgICAgICogc3RyZXRjaGVkIGhvcml6b250YWxseSBvciB2ZXJ0aWNhbGx5IHRvIG1hdGNoIHRoZSBjdXJyZW50IGFzcGVjdCByYXRpbyBvZg0KKyAgICAgKiB0aGUgbW92aWUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU5ERVJJTkdfTU9ERV9TVFJFVENIID0gMTsNCisNCisNCisgICAgLy8gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgTWVkaWFJdGVtDQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1VbmlxdWVJZDsNCisNCisgICAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBNZWRpYUl0ZW0NCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtRmlsZW5hbWU7DQorDQorICAgIC8vIExpc3Qgb2YgZWZmZWN0cw0KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RWZmZWN0PiBtRWZmZWN0czsNCisNCisgICAgLy8gTGlzdCBvZiBvdmVybGF5cw0KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T3ZlcmxheT4gbU92ZXJsYXlzOw0KKw0KKyAgICAvLyBUaGUgcmVuZGVyaW5nIG1vZGUNCisgICAgcHJpdmF0ZSBpbnQgbVJlbmRlcmluZ01vZGU7DQorDQorICAgIC8vIEJlZ2lubmluZyBhbmQgZW5kIHRyYW5zaXRpb25zDQorICAgIHByb3RlY3RlZCBUcmFuc2l0aW9uIG1CZWdpblRyYW5zaXRpb247DQorICAgIHByb3RlY3RlZCBUcmFuc2l0aW9uIG1FbmRUcmFuc2l0aW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIGVkaXRvciBUaGUgdmlkZW8gZWRpdG9yIHJlZmVyZW5jZQ0KKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtSWQgVGhlIE1lZGlhSXRlbSBpZA0KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgbmFtZSBvZiB0aGUgbWVkaWEgZmlsZS4NCisgICAgICogQHBhcmFtIHJlbmRlcmluZ01vZGUgVGhlIHJlbmRlcmluZyBtb2RlDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZmlsZSBpcyBub3QgZm91bmQNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSBjYXBhYmlsaXR5IHN1Y2ggYXMgZmlsZSBmb3JtYXQgaXMgbm90DQorICAgICAqICAgICAgICAgICAgIHN1cHBvcnRlZCB0aGUgZXhjZXB0aW9uIG9iamVjdCBjb250YWlucyB0aGUgdW5zdXBwb3J0ZWQNCisgICAgICogICAgICAgICAgICAgY2FwYWJpbGl0eQ0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIE1lZGlhSXRlbShWaWRlb0VkaXRvciBlZGl0b3IsIFN0cmluZyBtZWRpYUl0ZW1JZCwgU3RyaW5nIGZpbGVuYW1lLA0KKyAgICAgICAgICAgIGludCByZW5kZXJpbmdNb2RlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgbVVuaXF1ZUlkID0gbWVkaWFJdGVtSWQ7DQorICAgICAgICBtRmlsZW5hbWUgPSBmaWxlbmFtZTsNCisgICAgICAgIG1SZW5kZXJpbmdNb2RlID0gcmVuZGVyaW5nTW9kZTsNCisgICAgICAgIG1FZmZlY3RzID0gbmV3IEFycmF5TGlzdDxFZmZlY3Q+KCk7DQorICAgICAgICBtT3ZlcmxheXMgPSBuZXcgQXJyYXlMaXN0PE92ZXJsYXk+KCk7DQorICAgICAgICBtQmVnaW5UcmFuc2l0aW9uID0gbnVsbDsNCisgICAgICAgIG1FbmRUcmFuc2l0aW9uID0gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgaWQgb2YgdGhlIG1lZGlhIGl0ZW0NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBzb3VyY2UgZmlsZSBuYW1lDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1GaWxlbmFtZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSWYgYXNwZWN0IHJhdGlvIG9mIHRoZSBNZWRpYUl0ZW0gaXMgZGlmZmVyZW50IGZyb20gdGhlIGFzcGVjdCByYXRpbyBvZg0KKyAgICAgKiB0aGUgZWRpdG9yIHRoZW4gdGhpcyBBUEkgY29udHJvbHMgdGhlIHJlbmRlcmluZyBtb2RlLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcmVuZGVyaW5nTW9kZSByZW5kZXJpbmcgbW9kZS4gSXQgaXMgb25lIG9mOg0KKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjUkVOREVSSU5HX01PREVfQkxBQ0tfQk9SREVSfSwNCisgICAgICogICAgICAgICAgICB7QGxpbmsgI1JFTkRFUklOR19NT0RFX1NUUkVUQ0h9DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJpbmdNb2RlKGludCByZW5kZXJpbmdNb2RlKSB7DQorICAgICAgICBtUmVuZGVyaW5nTW9kZSA9IHJlbmRlcmluZ01vZGU7DQorICAgICAgICBpZiAobUJlZ2luVHJhbnNpdGlvbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgbUJlZ2luVHJhbnNpdGlvbi5pbnZhbGlkYXRlKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAobUVuZFRyYW5zaXRpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgIG1FbmRUcmFuc2l0aW9uLmludmFsaWRhdGUoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgcmVuZGVyaW5nIG1vZGUNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0UmVuZGVyaW5nTW9kZSgpIHsNCisgICAgICAgIHJldHVybiBtUmVuZGVyaW5nTW9kZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb24gVGhlIGJlZ2lubmluZyB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICB2b2lkIHNldEJlZ2luVHJhbnNpdGlvbihUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsNCisgICAgICAgIG1CZWdpblRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBiZWdpbiB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbiBnZXRCZWdpblRyYW5zaXRpb24oKSB7DQorICAgICAgICByZXR1cm4gbUJlZ2luVHJhbnNpdGlvbjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb24gVGhlIGVuZCB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICB2b2lkIHNldEVuZFRyYW5zaXRpb24oVHJhbnNpdGlvbiB0cmFuc2l0aW9uKSB7DQorICAgICAgICBtRW5kVHJhbnNpdGlvbiA9IHRyYW5zaXRpb247DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGVuZCB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbiBnZXRFbmRUcmFuc2l0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIG1FbmRUcmFuc2l0aW9uOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lbGluZSBkdXJhdGlvbi4gVGhpcyBpcyB0aGUgYWN0dWFsIGR1cmF0aW9uIGluIHRoZQ0KKyAgICAgKiAgICAgIHRpbWVsaW5lICh0cmltbWVkIGR1cmF0aW9uKQ0KKyAgICAgKi8NCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0VGltZWxpbmVEdXJhdGlvbigpOw0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgc291cmNlIGZpbGUgdHlwZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRGaWxlVHlwZSgpOw0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBHZXQgdGhlIG5hdGl2ZSB3aWR0aCBvZiB0aGUgbWVkaWEgaXRlbQ0KKyAgICAgKi8NCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRXaWR0aCgpOw0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBHZXQgdGhlIG5hdGl2ZSBoZWlnaHQgb2YgdGhlIG1lZGlhIGl0ZW0NCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SGVpZ2h0KCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgYXNwZWN0IHJhdGlvIG9mIHRoZSBzb3VyY2UgbWVkaWEgaXRlbS4NCisgICAgICoNCisgICAgICogQHJldHVybiB0aGUgYXNwZWN0IHJhdGlvIGFzIGRlc2NyaWJlZCBpbiBNZWRpYVByb3BlcnRpZXMuDQorICAgICAqICBNZWRpYVByb3BlcnRpZXMuQVNQRUNUX1JBVElPX1VOREVGSU5FRCBpZiBhc3BlY3QgcmF0aW8gaXMgbm90DQorICAgICAqICBzdXBwb3J0ZWQgYXMgaW4gTWVkaWFQcm9wZXJ0aWVzDQorICAgICAqLw0KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFzcGVjdFJhdGlvKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCBlZmZlY3QgdG8gdGhpcyBtZWRpYSBpdGVtLg0KKyAgICAgKg0KKyAgICAgKiBOb3RlIHRoYXQgY2VydGFpbiB0eXBlcyBvZiBlZmZlY3RzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHZpZGVvIGFuZCB0bw0KKyAgICAgKiBpbWFnZSBtZWRpYSBpdGVtcy4gRm9yIGV4YW1wbGUgaW4gY2VydGFpbiBpbXBsZW1lbnRhdGlvbiBhIEtlbiBCdXJucw0KKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBjYW5ub3QgYmUgYXBwbGllZCB0byB2aWRlbyBtZWRpYSBpdGVtLg0KKyAgICAgKg0KKyAgICAgKiBUaGlzIG1ldGhvZCBpbnZhbGlkYXRlcyB0cmFuc2l0aW9uIHZpZGVvIGNsaXBzIGlmIHRoZQ0KKyAgICAgKiBlZmZlY3Qgb3ZlcmxhcHMgd2l0aCB0aGUgYmVnaW5uaW5nIGFuZC9vciB0aGUgZW5kIHRyYW5zaXRpb24uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBlZmZlY3QgVGhlIGVmZmVjdCB0byBhcHBseQ0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBlZmZlY3Qgc3RhcnQgYW5kL29yIGR1cmF0aW9uIGFyZQ0KKyAgICAgKiAgICAgIGludmFsaWQgb3IgaWYgdGhlIGVmZmVjdCBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGlzIHR5cGUgb2YgbWVkaWENCisgICAgICogICAgICBpdGVtIG9yIGlmIHRoZSBlZmZlY3QgaWQgaXMgbm90IHVuaXF1ZSBhY3Jvc3MgYWxsIHRoZSBFZmZlY3RzDQorICAgICAqICAgICAgYWRkZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBhZGRFZmZlY3QoRWZmZWN0IGVmZmVjdCkgew0KKyAgICAgICAgaWYgKGVmZmVjdC5nZXRNZWRpYUl0ZW0oKSAhPSB0aGlzKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWVkaWEgaXRlbSBtaXNtYXRjaCIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG1FZmZlY3RzLmNvbnRhaW5zKGVmZmVjdCkpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFZmZlY3QgYWxyZWFkeSBleGlzdHM6ICIgKyBlZmZlY3QuZ2V0SWQoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoZWZmZWN0LmdldFN0YXJ0VGltZSgpICsgZWZmZWN0LmdldER1cmF0aW9uKCkgPiBnZXRUaW1lbGluZUR1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgIkVmZmVjdCBzdGFydCB0aW1lICsgZWZmZWN0IGR1cmF0aW9uID4gbWVkaWEgY2xpcCBkdXJhdGlvbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbUVmZmVjdHMuYWRkKGVmZmVjdCk7DQorICAgICAgICBpbnZhbGlkYXRlVHJhbnNpdGlvbnMoZWZmZWN0KTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlIHRoZSBlZmZlY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLg0KKyAgICAgKg0KKyAgICAgKiBUaGlzIG1ldGhvZCBpbnZhbGlkYXRlcyBhIHRyYW5zaXRpb24gdmlkZW8gY2xpcCBpZiB0aGUgZWZmZWN0IG92ZXJsYXBzDQorICAgICAqIHdpdGggYSB0cmFuc2l0aW9uLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZWZmZWN0SWQgVGhlIGlkIG9mIHRoZSBlZmZlY3QgdG8gYmUgcmVtb3ZlZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBlZmZlY3QgdGhhdCB3YXMgcmVtb3ZlZA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzDQorICAgICAqLw0KKyAgICBwdWJsaWMgRWZmZWN0IHJlbW92ZUVmZmVjdChTdHJpbmcgZWZmZWN0SWQpIHsNCisgICAgICAgIGZvciAoRWZmZWN0IGVmZmVjdCA6IG1FZmZlY3RzKSB7DQorICAgICAgICAgICAgaWYgKGVmZmVjdC5nZXRJZCgpLmVxdWFscyhlZmZlY3RJZCkpIHsNCisgICAgICAgICAgICAgICAgbUVmZmVjdHMucmVtb3ZlKGVmZmVjdCk7DQorICAgICAgICAgICAgICAgIGludmFsaWRhdGVUcmFuc2l0aW9ucyhlZmZlY3QpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gZWZmZWN0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGaW5kIHRoZSBlZmZlY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGlkDQorICAgICAqDQorICAgICAqIEBwYXJhbSBlZmZlY3RJZCBUaGUgZWZmZWN0IGlkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGVmZmVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaWQgKG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QpDQorICAgICAqLw0KKyAgICBwdWJsaWMgRWZmZWN0IGdldEVmZmVjdChTdHJpbmcgZWZmZWN0SWQpIHsNCisgICAgICAgIGZvciAoRWZmZWN0IGVmZmVjdCA6IG1FZmZlY3RzKSB7DQorICAgICAgICAgICAgaWYgKGVmZmVjdC5nZXRJZCgpLmVxdWFscyhlZmZlY3RJZCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGVmZmVjdHMuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIGVmZmVjdHMgbGlzdC4gSWYgbm8gZWZmZWN0cyBleGlzdCBhbiBlbXB0eSBsaXN0IHdpbGwgYmUgcmV0dXJuZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgTGlzdDxFZmZlY3Q+IGdldEFsbEVmZmVjdHMoKSB7DQorICAgICAgICByZXR1cm4gbUVmZmVjdHM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhbiBvdmVybGF5IHRvIHRoZSBzdG9yeWJvYXJkLiBUaGlzIG1ldGhvZCBpbnZhbGlkYXRlcyBhIHRyYW5zaXRpb24NCisgICAgICogdmlkZW8gY2xpcCBpZiB0aGUgb3ZlcmxheSBvdmVybGFwcyB3aXRoIGEgdHJhbnNpdGlvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIG92ZXJsYXkgVGhlIG92ZXJsYXkgdG8gYWRkDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgaW4gcHJvZ3Jlc3Mgb3INCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG92ZXJsYXkgaWQgaXMgbm90IHVuaXF1ZSBhY3Jvc3MgYWxsIHRoZSBvdmVybGF5cw0KKyAgICAgKiAgICAgICAgICAgICBhZGRlZCBvciBpZiB0aGUgYml0bWFwIGlzIG5vdCBzcGVjaWZpZWQgb3IgaWYgdGhlIGRpbWVuc2lvbnMgb2YNCisgICAgICogICAgICAgICAgICAgdGhlIGJpdG1hcCBkbyBub3QgbWF0Y2ggdGhlIGRpbWVuc2lvbnMgb2YgdGhlIG1lZGlhIGl0ZW0NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGFkZE92ZXJsYXkoT3ZlcmxheSBvdmVybGF5KSB7DQorICAgICAgICBpZiAob3ZlcmxheS5nZXRNZWRpYUl0ZW0oKSAhPSB0aGlzKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWVkaWEgaXRlbSBtaXNtYXRjaCIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG1PdmVybGF5cy5jb250YWlucyhvdmVybGF5KSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk92ZXJsYXkgYWxyZWFkeSBleGlzdHM6ICIgKyBvdmVybGF5LmdldElkKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG92ZXJsYXkuZ2V0U3RhcnRUaW1lKCkgKyBvdmVybGF5LmdldER1cmF0aW9uKCkgPiBnZXRUaW1lbGluZUR1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgIk92ZXJsYXkgc3RhcnQgdGltZSArIG92ZXJsYXkgZHVyYXRpb24gPiBtZWRpYSBjbGlwIGR1cmF0aW9uIik7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAob3ZlcmxheSBpbnN0YW5jZW9mIE92ZXJsYXlGcmFtZSkgew0KKyAgICAgICAgICAgIGZpbmFsIE92ZXJsYXlGcmFtZSBmcmFtZSA9IChPdmVybGF5RnJhbWUpb3ZlcmxheTsNCisgICAgICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gZnJhbWUuZ2V0Qml0bWFwKCk7DQorICAgICAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk92ZXJsYXkgYml0bWFwIG5vdCBzcGVjaWZpZWQiKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZmluYWwgaW50IHNjYWxlZFdpZHRoLCBzY2FsZWRIZWlnaHQ7DQorICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNZWRpYVZpZGVvSXRlbSkgew0KKyAgICAgICAgICAgICAgICBzY2FsZWRXaWR0aCA9IGdldFdpZHRoKCk7DQorICAgICAgICAgICAgICAgIHNjYWxlZEhlaWdodCA9IGdldEhlaWdodCgpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHNjYWxlZFdpZHRoID0gKChNZWRpYUltYWdlSXRlbSl0aGlzKS5nZXRTY2FsZWRXaWR0aCgpOw0KKyAgICAgICAgICAgICAgICBzY2FsZWRIZWlnaHQgPSAoKE1lZGlhSW1hZ2VJdGVtKXRoaXMpLmdldFNjYWxlZEhlaWdodCgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBUaGUgZGltZW5zaW9ucyBvZiB0aGUgb3ZlcmxheSBiaXRtYXAgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUNCisgICAgICAgICAgICAvLyBtZWRpYSBpdGVtIGRpbWVuc2lvbnMNCisgICAgICAgICAgICBpZiAoYml0bWFwLmdldFdpZHRoKCkgIT0gc2NhbGVkV2lkdGggfHwgYml0bWFwLmdldEhlaWdodCgpICE9IHNjYWxlZEhlaWdodCkgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJCaXRtYXAgZGltZW5zaW9ucyBtdXN0IG1hdGNoIG1lZGlhIGl0ZW0gZGltZW5zaW9ucyIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3ZlcmxheSBub3Qgc3VwcG9ydGVkIik7DQorICAgICAgICB9DQorDQorICAgICAgICBtT3ZlcmxheXMuYWRkKG92ZXJsYXkpOw0KKyAgICAgICAgaW52YWxpZGF0ZVRyYW5zaXRpb25zKG92ZXJsYXkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZW1vdmUgdGhlIG92ZXJsYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLg0KKyAgICAgKg0KKyAgICAgKiBUaGlzIG1ldGhvZCBpbnZhbGlkYXRlcyBhIHRyYW5zaXRpb24gdmlkZW8gY2xpcCBpZiB0aGUgb3ZlcmxheSBvdmVybGFwcw0KKyAgICAgKiB3aXRoIGEgdHJhbnNpdGlvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIG92ZXJsYXlJZCBUaGUgaWQgb2YgdGhlIG92ZXJsYXkgdG8gYmUgcmVtb3ZlZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBvdmVybGF5IHRoYXQgd2FzIHJlbW92ZWQNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKi8NCisgICAgcHVibGljIE92ZXJsYXkgcmVtb3ZlT3ZlcmxheShTdHJpbmcgb3ZlcmxheUlkKSB7DQorICAgICAgICBmb3IgKE92ZXJsYXkgb3ZlcmxheSA6IG1PdmVybGF5cykgew0KKyAgICAgICAgICAgIGlmIChvdmVybGF5LmdldElkKCkuZXF1YWxzKG92ZXJsYXlJZCkpIHsNCisgICAgICAgICAgICAgICAgbU92ZXJsYXlzLnJlbW92ZShvdmVybGF5KTsNCisgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkgaW5zdGFuY2VvZiBPdmVybGF5RnJhbWUpIHsNCisgICAgICAgICAgICAgICAgICAgICgoT3ZlcmxheUZyYW1lKW92ZXJsYXkpLmludmFsaWRhdGUoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlVHJhbnNpdGlvbnMob3ZlcmxheSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBvdmVybGF5Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGaW5kIHRoZSBvdmVybGF5IHdpdGggdGhlIHNwZWNpZmllZCBpZA0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gb3ZlcmxheUlkIFRoZSBvdmVybGF5IGlkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIG92ZXJsYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIChudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIE92ZXJsYXkgZ2V0T3ZlcmxheShTdHJpbmcgb3ZlcmxheUlkKSB7DQorICAgICAgICBmb3IgKE92ZXJsYXkgb3ZlcmxheSA6IG1PdmVybGF5cykgew0KKyAgICAgICAgICAgIGlmIChvdmVybGF5LmdldElkKCkuZXF1YWxzKG92ZXJsYXlJZCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJsYXk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgbGlzdCBvZiBvdmVybGF5cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZWRpYSBpdGVtDQorICAgICAqDQorICAgICAqIE5vdGUgdGhhdCBpZiBhbnkgb3ZlcmxheSBzb3VyY2UgZmlsZXMgYXJlIG5vdCBhY2Nlc3NpYmxlIGFueW1vcmUsDQorICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgc3RpbGwgcHJvdmlkZSB0aGUgZnVsbCBsaXN0IG9mIG92ZXJsYXlzLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG92ZXJsYXlzLiBJZiBubyBvdmVybGF5cyBleGlzdCBhbiBlbXB0eSBsaXN0IHdpbGwNCisgICAgICogIGJlIHJldHVybmVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIExpc3Q8T3ZlcmxheT4gZ2V0QWxsT3ZlcmxheXMoKSB7DQorICAgICAgICByZXR1cm4gbU92ZXJsYXlzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGUgYSB0aHVtYm5haWwgYXQgc3BlY2lmaWVkIHRpbWUgaW4gYSB2aWRlbyBzdHJlYW0gaW4gQml0bWFwIGZvcm1hdA0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHRodW1ibmFpbCBpbiBwaXhlbHMNCisgICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgdGhlIHRodW1ibmFpbCBpbiBwaXhlbHMNCisgICAgICogQHBhcmFtIHRpbWVNcyBUaGUgdGltZSBpbiB0aGUgc291cmNlIHZpZGVvIGZpbGUgYXQgd2hpY2ggdGhlIHRodW1ibmFpbCBpcw0KKyAgICAgKiAgICAgICAgICAgIHJlcXVlc3RlZCAoZXZlbiBpZiB0cmltbWVkKS4NCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgdGh1bWJuYWlsIGFzIGEgQml0bWFwLg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgZmlsZSBlcnJvciBvY2N1cnMNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGltZSBpcyBvdXQgb2YgdmlkZW8gZHVyYXRpb24NCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBCaXRtYXAgZ2V0VGh1bWJuYWlsKGludCB3aWR0aCwgaW50IGhlaWdodCwgbG9uZyB0aW1lTXMpIHRocm93cyBJT0V4Y2VwdGlvbjsNCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgYXJyYXkgb2YgQml0bWFwIHRodW1ibmFpbHMgYmV0d2VlbiBzdGFydCBhbmQgZW5kLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHRodW1ibmFpbCBpbiBwaXhlbHMNCisgICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgdGhlIHRodW1ibmFpbCBpbiBwaXhlbHMNCisgICAgICogQHBhcmFtIHN0YXJ0TXMgVGhlIHN0YXJ0IG9mIHRpbWUgcmFuZ2UgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqIEBwYXJhbSBlbmRNcyBUaGUgZW5kIG9mIHRoZSB0aW1lIHJhbmdlIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlsQ291bnQgVGhlIHRodW1ibmFpbCBjb3VudA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBCaXRtYXBzDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYSBmaWxlIGVycm9yIG9jY3Vycw0KKyAgICAgKi8NCisgICAgcHVibGljIGFic3RyYWN0IEJpdG1hcFtdIGdldFRodW1ibmFpbExpc3QoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBsb25nIHN0YXJ0TXMsIGxvbmcgZW5kTXMsDQorICAgICAgICAgICAgaW50IHRodW1ibmFpbENvdW50KSB0aHJvd3MgSU9FeGNlcHRpb247DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgew0KKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgTWVkaWFJdGVtKSkgew0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBtVW5pcXVlSWQuZXF1YWxzKCgoTWVkaWFJdGVtKW9iamVjdCkubVVuaXF1ZUlkKTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgIHJldHVybiBtVW5pcXVlSWQuaGFzaENvZGUoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSW52YWxpZGF0ZSB0aGUgc3RhcnQgYW5kIGVuZCB0cmFuc2l0aW9ucyBpZiBuZWNlc3NhcnkNCisgICAgICoNCisgICAgICogQHBhcmFtIGVmZmVjdCBUaGUgZWZmZWN0IHRoYXQgd2FzIGFkZGVkIG9yIHJlbW92ZWQNCisgICAgICovDQorICAgIHZvaWQgaW52YWxpZGF0ZVRyYW5zaXRpb25zKEVmZmVjdCBlZmZlY3QpIHsNCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBlZmZlY3Qgb3ZlcmxhcHMgd2l0aCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgdHJhbnNpdGlvbnMNCisgICAgICAgIGlmIChtQmVnaW5UcmFuc2l0aW9uICE9IG51bGwpIHsNCisgICAgICAgICAgICBpZiAoZWZmZWN0LmdldFN0YXJ0VGltZSgpIDwgbUJlZ2luVHJhbnNpdGlvbi5nZXREdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgICAgIG1CZWdpblRyYW5zaXRpb24uaW52YWxpZGF0ZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChtRW5kVHJhbnNpdGlvbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgaWYgKGVmZmVjdC5nZXRTdGFydFRpbWUoKSArIGVmZmVjdC5nZXREdXJhdGlvbigpID4gZ2V0VGltZWxpbmVEdXJhdGlvbigpDQorICAgICAgICAgICAgICAgICAgICAtIG1FbmRUcmFuc2l0aW9uLmdldER1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICAgICAgbUVuZFRyYW5zaXRpb24uaW52YWxpZGF0ZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSW52YWxpZGF0ZSB0aGUgc3RhcnQgYW5kIGVuZCB0cmFuc2l0aW9ucyBpZiBuZWNlc3NhcnkNCisgICAgICoNCisgICAgICogQHBhcmFtIG92ZXJsYXkgVGhlIGVmZmVjdCB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkDQorICAgICAqLw0KKyAgICB2b2lkIGludmFsaWRhdGVUcmFuc2l0aW9ucyhPdmVybGF5IG92ZXJsYXkpIHsNCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBvdmVybGF5IG92ZXJsYXBzIHdpdGggdGhlIGJlZ2lubmluZyBhbmQgZW5kIHRyYW5zaXRpb25zDQorICAgICAgICBpZiAobUJlZ2luVHJhbnNpdGlvbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgaWYgKG92ZXJsYXkuZ2V0U3RhcnRUaW1lKCkgPCBtQmVnaW5UcmFuc2l0aW9uLmdldER1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICAgICAgbUJlZ2luVHJhbnNpdGlvbi5pbnZhbGlkYXRlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG1FbmRUcmFuc2l0aW9uICE9IG51bGwpIHsNCisgICAgICAgICAgICBpZiAob3ZlcmxheS5nZXRTdGFydFRpbWUoKSArIG92ZXJsYXkuZ2V0RHVyYXRpb24oKSA+IGdldFRpbWVsaW5lRHVyYXRpb24oKQ0KKyAgICAgICAgICAgICAgICAgICAgLSBtRW5kVHJhbnNpdGlvbi5nZXREdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgICAgIG1FbmRUcmFuc2l0aW9uLmludmFsaWRhdGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkanVzdCB0aGUgZHVyYXRpb24gb2YgZWZmZWN0cywgb3ZlcmxheXMgYW5kIHRyYW5zaXRpb25zLg0KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciBhIG1lZGlhIGl0ZW0gZHVyYXRpb24gaXMgY2hhbmdlZC4NCisgICAgICovDQorICAgIHByb3RlY3RlZCB2b2lkIGFkanVzdEVsZW1lbnRzRHVyYXRpb24oKSB7DQorICAgICAgICAvLyBDaGVjayBpZiB0aGUgZHVyYXRpb24gb2YgdHJhbnNpdGlvbnMgbmVlZCB0byBiZSBhZGp1c3RlZA0KKyAgICAgICAgaWYgKG1CZWdpblRyYW5zaXRpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbWF4RHVyYXRpb25NcyA9IG1CZWdpblRyYW5zaXRpb24uZ2V0TWF4aW11bUR1cmF0aW9uKCk7DQorICAgICAgICAgICAgaWYgKG1CZWdpblRyYW5zaXRpb24uZ2V0RHVyYXRpb24oKSA+IG1heER1cmF0aW9uTXMpIHsNCisgICAgICAgICAgICAgICAgbUJlZ2luVHJhbnNpdGlvbi5zZXREdXJhdGlvbihtYXhEdXJhdGlvbk1zKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAobUVuZFRyYW5zaXRpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbWF4RHVyYXRpb25NcyA9IG1FbmRUcmFuc2l0aW9uLmdldE1heGltdW1EdXJhdGlvbigpOw0KKyAgICAgICAgICAgIGlmIChtRW5kVHJhbnNpdGlvbi5nZXREdXJhdGlvbigpID4gbWF4RHVyYXRpb25Ncykgew0KKyAgICAgICAgICAgICAgICBtRW5kVHJhbnNpdGlvbi5zZXREdXJhdGlvbihtYXhEdXJhdGlvbk1zKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBmaW5hbCBMaXN0PE92ZXJsYXk+IG92ZXJsYXlzID0gZ2V0QWxsT3ZlcmxheXMoKTsNCisgICAgICAgIGZvciAoT3ZlcmxheSBvdmVybGF5IDogb3ZlcmxheXMpIHsNCisgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHN0YXJ0IHRpbWUgaWYgbmVjZXNzYXJ5DQorICAgICAgICAgICAgZmluYWwgbG9uZyBvdmVybGF5U3RhcnRUaW1lTXM7DQorICAgICAgICAgICAgaWYgKG92ZXJsYXkuZ2V0U3RhcnRUaW1lKCkgPiBnZXRUaW1lbGluZUR1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICAgICAgb3ZlcmxheVN0YXJ0VGltZU1zID0gMDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBvdmVybGF5U3RhcnRUaW1lTXMgPSBvdmVybGF5LmdldFN0YXJ0VGltZSgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIGR1cmF0aW9uIGlmIG5lY2Vzc2FyeQ0KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgb3ZlcmxheUR1cmF0aW9uTXM7DQorICAgICAgICAgICAgaWYgKG92ZXJsYXlTdGFydFRpbWVNcyArIG92ZXJsYXkuZ2V0RHVyYXRpb24oKSA+IGdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgICAgICBvdmVybGF5RHVyYXRpb25NcyA9IGdldFRpbWVsaW5lRHVyYXRpb24oKSAtIG92ZXJsYXlTdGFydFRpbWVNczsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBvdmVybGF5RHVyYXRpb25NcyA9IG92ZXJsYXkuZ2V0RHVyYXRpb24oKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKG92ZXJsYXlTdGFydFRpbWVNcyAhPSBvdmVybGF5LmdldFN0YXJ0VGltZSgpIHx8DQorICAgICAgICAgICAgICAgICAgICBvdmVybGF5RHVyYXRpb25NcyAhPSBvdmVybGF5LmdldER1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICAgICAgb3ZlcmxheS5zZXRTdGFydFRpbWVBbmREdXJhdGlvbihvdmVybGF5U3RhcnRUaW1lTXMsIG92ZXJsYXlEdXJhdGlvbk1zKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBmaW5hbCBMaXN0PEVmZmVjdD4gZWZmZWN0cyA9IGdldEFsbEVmZmVjdHMoKTsNCisgICAgICAgIGZvciAoRWZmZWN0IGVmZmVjdCA6IGVmZmVjdHMpIHsNCisgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHN0YXJ0IHRpbWUgaWYgbmVjZXNzYXJ5DQorICAgICAgICAgICAgZmluYWwgbG9uZyBlZmZlY3RTdGFydFRpbWVNczsNCisgICAgICAgICAgICBpZiAoZWZmZWN0LmdldFN0YXJ0VGltZSgpID4gZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgICAgIGVmZmVjdFN0YXJ0VGltZU1zID0gMDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBlZmZlY3RTdGFydFRpbWVNcyA9IGVmZmVjdC5nZXRTdGFydFRpbWUoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBkdXJhdGlvbiBpZiBuZWNlc3NhcnkNCisgICAgICAgICAgICBmaW5hbCBsb25nIGVmZmVjdER1cmF0aW9uTXM7DQorICAgICAgICAgICAgaWYgKGVmZmVjdFN0YXJ0VGltZU1zICsgZWZmZWN0LmdldER1cmF0aW9uKCkgPiBnZXRUaW1lbGluZUR1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICAgICAgZWZmZWN0RHVyYXRpb25NcyA9IGdldFRpbWVsaW5lRHVyYXRpb24oKSAtIGVmZmVjdFN0YXJ0VGltZU1zOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGVmZmVjdER1cmF0aW9uTXMgPSBlZmZlY3QuZ2V0RHVyYXRpb24oKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKGVmZmVjdFN0YXJ0VGltZU1zICE9IGVmZmVjdC5nZXRTdGFydFRpbWUoKSB8fA0KKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RHVyYXRpb25NcyAhPSBlZmZlY3QuZ2V0RHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgICAgICBlZmZlY3Quc2V0U3RhcnRUaW1lQW5kRHVyYXRpb24oZWZmZWN0U3RhcnRUaW1lTXMsIGVmZmVjdER1cmF0aW9uTXMpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvTWVkaWFQcm9wZXJ0aWVzLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvTWVkaWFQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzQwODhmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9NZWRpYVByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhbGwgcHJvcGVydGllcyBvZiBhIG1lZGlhIGZpbGUgc3VjaCBhcyBzdXBwb3J0ZWQgaGVpZ2h0LCBhc3BlY3QgcmF0aW8sDQorICogYml0cmF0ZSBmb3IgZXhwb3J0IGZ1bmN0aW9uLg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgTWVkaWFQcm9wZXJ0aWVzIHsNCisgICAgLy8gU3VwcG9ydGVkIGhlaWdodHMNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUXzE0NCA9IDE0NDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUXzM2MCA9IDM2MDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUXzQ4MCA9IDQ4MDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUXzcyMCA9IDcyMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUXzEwODAgPSAxMDgwOw0KKw0KKyAgICAvLyBTdXBwb3J0ZWQgYXNwZWN0IHJhdGlvcw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1BFQ1RfUkFUSU9fVU5ERUZJTkVEID0gMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNQRUNUX1JBVElPXzNfMiA9IDE7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTUEVDVF9SQVRJT18xNl85ID0gMjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNQRUNUX1JBVElPXzRfMyA9IDM7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTUEVDVF9SQVRJT181XzMgPSA0Ow0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1BFQ1RfUkFUSU9fMTFfOSA9IDU7DQorDQorICAgIC8vIFRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgYXNwZWN0IHJhdGlvcw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBBU1BFQ1RfUkFUSU9TID0gbmV3IGludFtdIHsNCisgICAgICAgIEFTUEVDVF9SQVRJT18zXzIsDQorICAgICAgICBBU1BFQ1RfUkFUSU9fMTZfOSwNCisgICAgICAgIEFTUEVDVF9SQVRJT180XzMsDQorICAgICAgICBBU1BFQ1RfUkFUSU9fNV8zLA0KKyAgICAgICAgQVNQRUNUX1JBVElPXzExXzkNCisgICAgfTsNCisNCisgICAgLy8gU3VwcG9ydGVkIHJlc29sdXRpb25zIGZvciBzcGVjaWZpYyBhc3BlY3QgcmF0aW9zDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhaXI8SW50ZWdlciwgSW50ZWdlcj5bXSBBU1BFQ1RfUkFUSU9fM18yX1JFU09MVVRJT05TID0NCisgICAgICAgIG5ldyBQYWlyW10gew0KKyAgICAgICAgbmV3IFBhaXI8SW50ZWdlciwgSW50ZWdlcj4oNzIwLCBIRUlHSFRfNDgwKSwNCisgICAgICAgIG5ldyBQYWlyPEludGVnZXIsIEludGVnZXI+KDEwODAsIEhFSUdIVF83MjApDQorICAgIH07DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhaXI8SW50ZWdlciwgSW50ZWdlcj5bXSBBU1BFQ1RfUkFUSU9fNF8zX1JFU09MVVRJT05TID0NCisgICAgICAgIG5ldyBQYWlyW10gew0KKyAgICAgICAgbmV3IFBhaXI8SW50ZWdlciwgSW50ZWdlcj4oNjQwLCBIRUlHSFRfNDgwKSwNCisgICAgICAgIG5ldyBQYWlyPEludGVnZXIsIEludGVnZXI+KDk2MCwgSEVJR0hUXzcyMCkNCisgICAgfTsNCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPltdIEFTUEVDVF9SQVRJT181XzNfUkVTT0xVVElPTlMgPQ0KKyAgICAgICAgbmV3IFBhaXJbXSB7DQorICAgICAgICBuZXcgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPig4MDAsIEhFSUdIVF80ODApDQorICAgIH07DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhaXI8SW50ZWdlciwgSW50ZWdlcj5bXSBBU1BFQ1RfUkFUSU9fMTFfOV9SRVNPTFVUSU9OUyA9DQorICAgICAgICBuZXcgUGFpcltdIHsNCisgICAgICAgIG5ldyBQYWlyPEludGVnZXIsIEludGVnZXI+KDE3NiwgSEVJR0hUXzE0NCkNCisgICAgfTsNCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPltdIEFTUEVDVF9SQVRJT18xNl85X1JFU09MVVRJT05TID0NCisgICAgICAgIG5ldyBQYWlyW10gew0KKyAgICAgICAgbmV3IFBhaXI8SW50ZWdlciwgSW50ZWdlcj4oNjQwLCBIRUlHSFRfMzYwKSwNCisgICAgICAgIG5ldyBQYWlyPEludGVnZXIsIEludGVnZXI+KDg1NCwgSEVJR0hUXzQ4MCksDQorICAgICAgICBuZXcgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPigxMjgwLCBIRUlHSFRfNzIwKSwNCisgICAgfTsNCisNCisNCisgICAgLy8gQml0cmF0ZSB2YWx1ZXMgKGluIGJpdHMgcGVyIHNlY29uZCkNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUUkFURV8yOEsgPSAyODAwMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUUkFURV80MEsgPSA0MDAwMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUUkFURV82NEsgPSA2NDAwMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUUkFURV85NksgPSA5NjAwMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUUkFURV8xMjhLID0gMTI4MDAwOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSVRSQVRFXzE5MksgPSAxOTIwMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfMjU2SyA9IDI1NjAwMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUUkFURV8zODRLID0gMzg0MDAwOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSVRSQVRFXzUxMksgPSA1MTIwMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfODAwSyA9IDgwMDAwMDsNCisNCisgICAgLy8gVGhlIGFycmF5IG9mIHN1cHBvcnRlZCBiaXRyYXRlcw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBTVVBQT1JURURfQklUUkFURVMgPSBuZXcgaW50W10gew0KKyAgICAgICAgQklUUkFURV8yOEssDQorICAgICAgICBCSVRSQVRFXzQwSywNCisgICAgICAgIEJJVFJBVEVfNjRLLA0KKyAgICAgICAgQklUUkFURV85NkssDQorICAgICAgICBCSVRSQVRFXzEyOEssDQorICAgICAgICBCSVRSQVRFXzE5MkssDQorICAgICAgICBCSVRSQVRFXzI1NkssDQorICAgICAgICBCSVRSQVRFXzM4NEssDQorICAgICAgICBCSVRSQVRFXzUxMkssDQorICAgICAgICBCSVRSQVRFXzgwMEsNCisgICAgfTsNCisNCisgICAgLy8gVmlkZW8gY29kZWMgdHlwZXMNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNPREVDX0gyNjRCUCA9IDE7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDT0RFQ19IMjY0TVAgPSAyOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ09ERUNfSDI2MyA9IDM7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDT0RFQ19NUEVHNCA9IDQ7DQorDQorICAgIC8vIFRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgdmlkZW8gY29kZWNzDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFNVUFBPUlRFRF9WQ09ERUNTID0gbmV3IGludFtdIHsNCisgICAgICAgIFZDT0RFQ19IMjY0QlAsDQorICAgICAgICBWQ09ERUNfSDI2MywNCisgICAgICAgIFZDT0RFQ19NUEVHNCwNCisgICAgfTsNCisNCisgICAgLy8gQXVkaW8gY29kZWMgdHlwZXMNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNPREVDX0FBQ19MQyA9IDE7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDT0RFQ19BTVJOQiA9IDI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDT0RFQ19BTVJXQiA9IDM7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDT0RFQ19NUDMgPSA0Ow0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ09ERUNfT0dHID0gNTsNCisNCisgICAgLy8gVGhlIGFycmF5IG9mIHN1cHBvcnRlZCB2aWRlbyBjb2RlY3MNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1VQUE9SVEVEX0FDT0RFQ1MgPSBuZXcgaW50W10gew0KKyAgICAgICAgQUNPREVDX0FBQ19MQywNCisgICAgICAgIEFDT0RFQ19BTVJOQiwNCisgICAgICAgIEFDT0RFQ19BTVJXQg0KKyAgICB9Ow0KKw0KKyAgICAvLyBGaWxlIGZvcm1hdCB0eXBlcw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1VOU1VQUE9SVEVEID0gMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV8zR1AgPSAxOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX01QNCA9IDI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfSlBFRyA9IDM7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfUE5HID0gNDsNCisNCisgICAgLy8gVGhlIGFycmF5IG9mIHRoZSBzdXBwb3J0ZWQgZmlsZSBmb3JtYXRzDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFNVUFBPUlRFRF9WSURFT19GSUxFX0ZPUk1BVFMgPSBuZXcgaW50W10gew0KKyAgICAgICAgRklMRV8zR1AsDQorICAgICAgICBGSUxFX01QNA0KKyAgICB9Ow0KKw0KKyAgICAvLyBUaGUgbWF4aW11bSBjb3VudCBvZiBhdWRpbyB0cmFja3Mgc3VwcG9ydGVkDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVRElPX01BWF9UUkFDS19DT1VOVCA9IDE7DQorDQorICAgIC8vIFRoZSBtYXhpbXVtIHZvbHVtZSBzdXBwb3J0ZWQgKDEwMCBtZWFucyB0aGF0IG5vIGFtcGxpZmljYXRpb24gaXMNCisgICAgLy8gc3VwcG9ydGVkLCBpLmUuIGF0dGVudWF0aW9uIG9ubHkpDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVRElPX01BWF9WT0xVTUVfUEVSQ0VOVCA9IDEwMDsNCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBNZWRpYVByb3BlcnRpZXMoKSB7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGFycmF5IG9mIHN1cHBvcnRlZCBhc3BlY3QgcmF0aW9zDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGludFtdIGdldEFsbFN1cHBvcnRlZEFzcGVjdFJhdGlvcygpIHsNCisgICAgICAgIHJldHVybiBBU1BFQ1RfUkFUSU9TOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgdGhlIHN1cHBvcnRlZCByZXNvbHV0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCBhc3BlY3QgcmF0aW8uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBhc3BlY3RSYXRpbyBUaGUgYXNwZWN0IHJhdGlvIGZvciB3aGljaCB0aGUgcmVzb2x1dGlvbnMgYXJlIHJlcXVlc3RlZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiB3aWR0aCBhbmQgaGVpZ2h0IHBhaXJzDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFBhaXI8SW50ZWdlciwgSW50ZWdlcj5bXSBnZXRTdXBwb3J0ZWRSZXNvbHV0aW9ucyhpbnQgYXNwZWN0UmF0aW8pIHsNCisgICAgICAgIGZpbmFsIFBhaXI8SW50ZWdlciwgSW50ZWdlcj5bXSByZXNvbHV0aW9uczsNCisgICAgICAgIHN3aXRjaChhc3BlY3RSYXRpbykgew0KKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzNfMjogew0KKyAgICAgICAgICAgICAgICByZXNvbHV0aW9ucyA9IEFTUEVDVF9SQVRJT18zXzJfUkVTT0xVVElPTlM7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT180XzM6IHsNCisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbnMgPSBBU1BFQ1RfUkFUSU9fNF8zX1JFU09MVVRJT05TOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fNV8zOiB7DQorICAgICAgICAgICAgICAgIHJlc29sdXRpb25zID0gQVNQRUNUX1JBVElPXzVfM19SRVNPTFVUSU9OUzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzExXzk6IHsNCisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbnMgPSBBU1BFQ1RfUkFUSU9fMTFfOV9SRVNPTFVUSU9OUzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzE2Xzk6IHsNCisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbnMgPSBBU1BFQ1RfUkFUSU9fMTZfOV9SRVNPTFVUSU9OUzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBhc3BlY3QgcmF0aW86ICIgKyBhc3BlY3RSYXRpbyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIHJlc29sdXRpb25zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgdmlkZW8gY29kZWNzDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGludFtdIGdldFN1cHBvcnRlZFZpZGVvQ29kZWNzKCkgew0KKyAgICAgICAgcmV0dXJuIFNVUFBPUlRFRF9WQ09ERUNTOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgYXVkaW8gY29kZWNzDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGludFtdIGdldFN1cHBvcnRlZEF1ZGlvQ29kZWNzKCkgew0KKyAgICAgICAgcmV0dXJuIFNVUFBPUlRFRF9BQ09ERUNTOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgZmlsZSBmb3JtYXRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGludFtdIGdldFN1cHBvcnRlZFZpZGVvRmlsZUZvcm1hdCgpIHsNCisgICAgICAgIHJldHVybiBTVVBQT1JURURfVklERU9fRklMRV9GT1JNQVRTOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgdmlkZW8gYml0cmF0ZXMNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgaW50W10gZ2V0U3VwcG9ydGVkVmlkZW9CaXRyYXRlcygpIHsNCisgICAgICAgIHJldHVybiBTVVBQT1JURURfQklUUkFURVM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gdmFsdWUgZm9yIHRoZSBhdWRpbyB2b2x1bWUNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZE1heFZvbHVtZSgpIHsNCisgICAgICAgIHJldHVybiBNZWRpYVByb3BlcnRpZXMuQVVESU9fTUFYX1ZPTFVNRV9QRVJDRU5UOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyB0cmFja3Mgc3VwcG9ydGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTdXBwb3J0ZWRBdWRpb1RyYWNrQ291bnQoKSB7DQorICAgICAgICByZXR1cm4gTWVkaWFQcm9wZXJ0aWVzLkFVRElPX01BWF9UUkFDS19DT1VOVDsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvTWVkaWFWaWRlb0l0ZW0uamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9NZWRpYVZpZGVvSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3MWY0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvTWVkaWFWaWRlb0l0ZW0uamF2YQpAQCAtMCwwICsxLDM5MiBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQorDQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOw0KK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB2aWRlbyBjbGlwIGl0ZW0gb24gdGhlIHN0b3J5Ym9hcmQNCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIE1lZGlhVmlkZW9JdGVtIGV4dGVuZHMgTWVkaWFJdGVtIHsNCisgICAgLy8gSW5zdGFuY2UgdmFyaWFibGVzDQorICAgIHByaXZhdGUgZmluYWwgaW50IG1XaWR0aDsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUhlaWdodDsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUFzcGVjdFJhdGlvOw0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtRmlsZVR5cGU7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1WaWRlb1R5cGU7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1WaWRlb1Byb2ZpbGU7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1WaWRlb0JpdHJhdGU7DQorICAgIHByaXZhdGUgZmluYWwgbG9uZyBtRHVyYXRpb25NczsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUF1ZGlvQml0cmF0ZTsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZwczsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUF1ZGlvVHlwZTsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUF1ZGlvQ2hhbm5lbHM7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb1NhbXBsaW5nRnJlcXVlbmN5Ow0KKw0KKyAgICBwcml2YXRlIGxvbmcgbUJlZ2luQm91bmRhcnlUaW1lTXM7DQorICAgIHByaXZhdGUgbG9uZyBtRW5kQm91bmRhcnlUaW1lTXM7DQorICAgIHByaXZhdGUgaW50IG1Wb2x1bWVQZXJjZW50YWdlOw0KKyAgICBwcml2YXRlIGJvb2xlYW4gbU11dGVkOw0KKyAgICBwcml2YXRlIFN0cmluZyBtQXVkaW9XYXZlZm9ybUZpbGVuYW1lOw0KKw0KKyAgICAvKioNCisgICAgICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkZWZhdWx0IGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBNZWRpYVZpZGVvSXRlbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICB0aGlzKG51bGwsIG51bGwsIG51bGwsIFJFTkRFUklOR19NT0RFX0JMQUNLX0JPUkRFUik7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSBlZGl0b3IgVGhlIHZpZGVvIGVkaXRvciByZWZlcmVuY2UNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbUlkIFRoZSBNZWRpYUl0ZW0gaWQNCisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBpbWFnZSBmaWxlIG5hbWUNCisgICAgICogQHBhcmFtIHJlbmRlcmluZ01vZGUgVGhlIHJlbmRlcmluZyBtb2RlDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCBmb3IgcmVhZGluZw0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhVmlkZW9JdGVtKFZpZGVvRWRpdG9yIGVkaXRvciwgU3RyaW5nIG1lZGlhSXRlbUlkLCBTdHJpbmcgZmlsZW5hbWUsDQorICAgICAgICAgICAgaW50IHJlbmRlcmluZ01vZGUpDQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgdGhpcyhlZGl0b3IsIG1lZGlhSXRlbUlkLCBmaWxlbmFtZSwgcmVuZGVyaW5nTW9kZSwgMCwgRU5EX09GX0ZJTEUsIDEwMCwgZmFsc2UsIG51bGwpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvcg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZWRpdG9yIFRoZSB2aWRlbyBlZGl0b3IgcmVmZXJlbmNlDQorICAgICAqIEBwYXJhbSBtZWRpYUl0ZW1JZCBUaGUgTWVkaWFJdGVtIGlkDQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgaW1hZ2UgZmlsZSBuYW1lDQorICAgICAqIEBwYXJhbSByZW5kZXJpbmdNb2RlIFRoZSByZW5kZXJpbmcgbW9kZQ0KKyAgICAgKiBAcGFyYW0gYmVnaW5NcyBTdGFydCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gU2V0IHRvIDAgdG8gZXh0cmFjdCBmcm9tIHRoZQ0KKyAgICAgKiAgICAgICAgICAgYmVnaW5uaW5nDQorICAgICAqIEBwYXJhbSBlbmRNcyBFbmQgdGltZSBpbiBtaWxsaXNlY29uZHMuIFNldCB0byB7QGxpbmsgI0VORF9PRl9GSUxFfSB0bw0KKyAgICAgKiAgICAgICAgICAgZXh0cmFjdCB1bnRpbCB0aGUgZW5kDQorICAgICAqIEBwYXJhbSB2b2x1bWVQZXJjZW50IGluICUvLiAxMDAlIG1lYW5zIG5vIGNoYW5nZTsgNTAlIG1lYW5zIGhhbGYgdmFsdWUsIDIwMCUNCisgICAgICogICAgICAgICAgICBtZWFucyBkb3VibGUsIDAlIG1lYW5zIHNpbGVudC4NCisgICAgICogQHBhcmFtIG11dGVkIHRydWUgaWYgdGhlIGF1ZGlvIGlzIG11dGVkDQorICAgICAqIEBwYXJhbSBhdWRpb1dhdmVmb3JtRmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGF1ZGlvIHdhdmVmb3JtIGZpbGUNCisgICAgICoNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIGZvciByZWFkaW5nDQorICAgICAqLw0KKyAgICBNZWRpYVZpZGVvSXRlbShWaWRlb0VkaXRvciBlZGl0b3IsIFN0cmluZyBtZWRpYUl0ZW1JZCwgU3RyaW5nIGZpbGVuYW1lLCBpbnQgcmVuZGVyaW5nTW9kZSwNCisgICAgICAgICAgICBsb25nIGJlZ2luTXMsIGxvbmcgZW5kTXMsIGludCB2b2x1bWVQZXJjZW50LCBib29sZWFuIG11dGVkLA0KKyAgICAgICAgICAgIFN0cmluZyBhdWRpb1dhdmVmb3JtRmlsZW5hbWUpICB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgc3VwZXIoZWRpdG9yLCBtZWRpYUl0ZW1JZCwgZmlsZW5hbWUsIHJlbmRlcmluZ01vZGUpOw0KKyAgICAgICAgLy8gVE9ETzogU2V0IHRoZXNlIHZhcmlhYmxlcyBjb3JyZWN0bHkNCisgICAgICAgIG1XaWR0aCA9IDEwODA7DQorICAgICAgICBtSGVpZ2h0ID0gNzIwOw0KKyAgICAgICAgbUFzcGVjdFJhdGlvID0gTWVkaWFQcm9wZXJ0aWVzLkFTUEVDVF9SQVRJT18zXzI7DQorICAgICAgICBtRmlsZVR5cGUgPSBNZWRpYVByb3BlcnRpZXMuRklMRV9NUDQ7DQorICAgICAgICBtVmlkZW9UeXBlID0gTWVkaWFQcm9wZXJ0aWVzLlZDT0RFQ19IMjY0QlA7DQorICAgICAgICAvLyBEbyB3ZSBoYXZlIHByZWRlZmluZWQgdmFsdWVzIGZvciB0aGlzIHZhcmlhYmxlPw0KKyAgICAgICAgbVZpZGVvUHJvZmlsZSA9IDA7DQorICAgICAgICAvLyBDYW4gdmlkZW8gYW5kIGF1ZGlvIGR1cmF0aW9uIGJlIGRpZmZlcmVudD8NCisgICAgICAgIG1EdXJhdGlvbk1zID0gMTAwMDA7DQorICAgICAgICBtVmlkZW9CaXRyYXRlID0gODAwMDAwOw0KKyAgICAgICAgbUF1ZGlvQml0cmF0ZSA9IDMwMDAwOw0KKyAgICAgICAgbUZwcyA9IDMwOw0KKyAgICAgICAgbUF1ZGlvVHlwZSA9IE1lZGlhUHJvcGVydGllcy5BQ09ERUNfQUFDX0xDOw0KKyAgICAgICAgbUF1ZGlvQ2hhbm5lbHMgPSAyOw0KKyAgICAgICAgbUF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPSAxNjAwMDsNCisNCisgICAgICAgIG1CZWdpbkJvdW5kYXJ5VGltZU1zID0gYmVnaW5NczsNCisgICAgICAgIG1FbmRCb3VuZGFyeVRpbWVNcyA9IGVuZE1zID09IEVORF9PRl9GSUxFID8gbUR1cmF0aW9uTXMgOiBlbmRNczsNCisgICAgICAgIG1Wb2x1bWVQZXJjZW50YWdlID0gdm9sdW1lUGVyY2VudDsNCisgICAgICAgIG1NdXRlZCA9IG11dGVkOw0KKyAgICAgICAgbUF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSA9IGF1ZGlvV2F2ZWZvcm1GaWxlbmFtZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgc3RhcnQgYW5kIGVuZCBtYXJrcyBmb3IgdHJpbW1pbmcgYSB2aWRlbyBtZWRpYSBpdGVtLg0KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFkanVzdCB0aGUgZHVyYXRpb24gb2YgYm91bmRpbmcgdHJhbnNpdGlvbnMsIGVmZmVjdHMNCisgICAgICogYW5kIG92ZXJsYXlzIGlmIHRoZSBjdXJyZW50IGR1cmF0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbnMgYmVjb21lIGdyZWF0ZXINCisgICAgICogdGhhbiB0aGUgbWF4aW11bSBhbGxvd2FibGUgZHVyYXRpb24uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBiZWdpbk1zIFN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdG8gMCB0byBleHRyYWN0IGZyb20gdGhlDQorICAgICAqICAgICAgICAgICBiZWdpbm5pbmcNCisgICAgICogQHBhcmFtIGVuZE1zIEVuZCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gU2V0IHRvIHtAbGluayAjRU5EX09GX0ZJTEV9IHRvDQorICAgICAqICAgICAgICAgICBleHRyYWN0IHVudGlsIHRoZSBlbmQNCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0YXJ0IHRpbWUgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuDQorICAgICAqICAgICAgICAgICBlbmQgdGltZSwgdGhlIGVuZCB0aW1lIGlzIGJleW9uZCB0aGUgZmlsZSBkdXJhdGlvbiwgdGhlIHN0YXJ0IHRpbWUNCisgICAgICogICAgICAgICAgIGlzIG5lZ2F0aXZlDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYWN0Qm91bmRhcmllcyhsb25nIGJlZ2luTXMsIGxvbmcgZW5kTXMpIHsNCisgICAgICAgIGlmIChiZWdpbk1zID4gbUR1cmF0aW9uTXMpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHN0YXJ0IHRpbWUiKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlbmRNcyA+IG1EdXJhdGlvbk1zKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBlbmQgdGltZSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGJlZ2luTXMgIT0gbUJlZ2luQm91bmRhcnlUaW1lTXMpIHsNCisgICAgICAgICAgICBpZiAobUJlZ2luVHJhbnNpdGlvbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIG1CZWdpblRyYW5zaXRpb24uaW52YWxpZGF0ZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChlbmRNcyAhPSBtRW5kQm91bmRhcnlUaW1lTXMpIHsNCisgICAgICAgICAgICBpZiAobUVuZFRyYW5zaXRpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBtRW5kVHJhbnNpdGlvbi5pbnZhbGlkYXRlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbUJlZ2luQm91bmRhcnlUaW1lTXMgPSBiZWdpbk1zOw0KKyAgICAgICAgbUVuZEJvdW5kYXJ5VGltZU1zID0gZW5kTXM7DQorDQorICAgICAgICBhZGp1c3RFbGVtZW50c0R1cmF0aW9uKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGJvdW5kYXJ5IGJlZ2luIHRpbWUNCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIGdldEJvdW5kYXJ5QmVnaW5UaW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1CZWdpbkJvdW5kYXJ5VGltZU1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBib3VuZGFyeSBlbmQgdGltZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0Qm91bmRhcnlFbmRUaW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1FbmRCb3VuZGFyeVRpbWVNczsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgYWRkRWZmZWN0KEVmZmVjdCBlZmZlY3QpIHsNCisgICAgICAgIGlmIChlZmZlY3QgaW5zdGFuY2VvZiBFZmZlY3RLZW5CdXJucykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIktlbiBCdXJucyBlZmZlY3RzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIE1lZGlhVmlkZW9JdGVtIik7DQorICAgICAgICB9DQorICAgICAgICBzdXBlci5hZGRFZmZlY3QoZWZmZWN0KTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIEJpdG1hcCBnZXRUaHVtYm5haWwoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBsb25nIHRpbWVNcykgew0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBCaXRtYXBbXSBnZXRUaHVtYm5haWxMaXN0KGludCB3aWR0aCwgaW50IGhlaWdodCwgbG9uZyBzdGFydE1zLCBsb25nIGVuZE1zLA0KKyAgICAgICAgICAgIGludCB0aHVtYm5haWxDb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldEFzcGVjdFJhdGlvKCkgew0KKyAgICAgICAgcmV0dXJuIG1Bc3BlY3RSYXRpbzsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBnZXRGaWxlVHlwZSgpIHsNCisgICAgICAgIHJldHVybiBtRmlsZVR5cGU7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7DQorICAgICAgICByZXR1cm4gbVdpZHRoOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsNCisgICAgICAgIHJldHVybiBtSGVpZ2h0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBkdXJhdGlvbiBvZiB0aGUgdmlkZW8gY2xpcA0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oKSB7DQorICAgICAgICByZXR1cm4gbUR1cmF0aW9uTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHRpbWVsaW5lIGR1cmF0aW9uLiBUaGlzIGlzIHRoZSBhY3R1YWwgZHVyYXRpb24gaW4gdGhlDQorICAgICAqICAgICAgdGltZWxpbmUgKHRyaW1tZWQgZHVyYXRpb24pDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGxvbmcgZ2V0VGltZWxpbmVEdXJhdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtRW5kQm91bmRhcnlUaW1lTXMgLSBtQmVnaW5Cb3VuZGFyeVRpbWVNczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVuZGVyIGEgZnJhbWUgYWNjb3JkaW5nIHRvIHRoZSBwbGF5YmFjayAoaW4gdGhlIG5hdGl2ZSBhc3BlY3QgcmF0aW8pIGZvcg0KKyAgICAgKiB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uIEFsbCBlZmZlY3RzIGFuZCBvdmVybGF5cyBhcHBsaWVkIHRvIHRoZSBtZWRpYQ0KKyAgICAgKiBpdGVtIGFyZSBpZ25vcmVkLiBUaGUgZXh0cmFjdCBib3VuZGFyaWVzIGFyZSBhbHNvIGlnbm9yZWQuIFRoaXMgbWV0aG9kDQorICAgICAqIGNhbiBiZSB1c2VkIHRvIHBsYXliYWNrIGZyYW1lcyB3aGVuIGltcGxlbWVudGluZyB0cmltbWluZyBmdW5jdGlvbmFsaXR5Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3VyZmFjZUhvbGRlciBTdXJmYWNlSG9sZGVyIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uDQorICAgICAqIEBwYXJhbSB0aW1lTXMgdGltZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmcmFtZSB0byBkaXNwbGF5IChyZWxhdGl2ZSB0byB0aGUNCisgICAgICogICAgICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZWRpYSBpdGVtKS4NCisgICAgICogQHJldHVybiBUaGUgYWNjdXJhdGUgdGltZSBzdGFtcCBvZiB0aGUgZnJhbWUgdGhhdCBpcyByZW5kZXJlZCAuDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcGxheWJhY2ssIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzDQorICAgICAqICAgICAgICAgICAgIGFscmVhZHkgaW4gcHJvZ3Jlc3MNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGltZSBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlDQorICAgICAqICAgICAgICAgICAgIG1lZGlhIGl0ZW0gZHVyYXRpb24NCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIHJlbmRlckZyYW1lKFN1cmZhY2VIb2xkZXIgc3VyZmFjZUhvbGRlciwgbG9uZyB0aW1lTXMpIHsNCisgICAgICAgIHJldHVybiB0aW1lTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgQVBJIGFsbG93cyB0byBnZW5lcmF0ZSBhIGZpbGUgY29udGFpbmluZyB0aGUgc2FtcGxlIHZvbHVtZSBsZXZlbHMgb2YNCisgICAgICogdGhlIEF1ZGlvIHRyYWNrIG9mIHRoaXMgbWVkaWEgaXRlbS4gVGhpcyBmdW5jdGlvbiBtYXkgdGFrZSBzaWduaWZpY2FudA0KKyAgICAgKiB0aW1lIGFuZCBpcyBibG9ja2luZy4gVGhlIGZpbGUgY2FuIGJlIHJldHJpZXZlZCB1c2luZw0KKyAgICAgKiBnZXRBdWRpb1dhdmVmb3JtRmlsZW5hbWUoKS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBwcm9ncmVzcyBsaXN0ZW5lcg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBvdXRwdXQgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWVkaWFJdGVtIGRvZXMgbm90IGhhdmUgYSB2YWxpZA0KKyAgICAgKiAgICAgICAgICAgICBBdWRpbyB0cmFjaw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZXh0cmFjdEF1ZGlvV2F2ZWZvcm0oRXh0cmFjdEF1ZGlvV2F2ZWZvcm1Qcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKQ0KKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICAvLyBUT0RPOiBTZXQgbUF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSBhdCB0aGUgZW5kIG9uY2UgdGhlIGV4cG9ydCBpcyBjb21wbGV0ZQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgdGhlIGF1ZGlvIHdhdmVmb3JtIGZpbGUgbmFtZSBpZiB7QGxpbmsgI2V4dHJhY3RBdWRpb1dhdmVmb3JtKCl9IHdhcw0KKyAgICAgKiBzdWNjZXNzZnVsLiBUaGUgZmlsZSBmb3JtYXQgaXMgYXMgZm9sbG93aW5nOg0KKyAgICAgKiA8dWw+DQorICAgICAqICA8bGk+Zmlyc3QgNCBieXRlcyBwcm92aWRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgZWFjaCB2YWx1ZSwgYXMgYmlnLWVuZGlhbiBzaWduZWQ8L2xpPg0KKyAgICAgKiAgPGxpPjQgZm9sbG93aW5nIGJ5dGVzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBmaWxlLCBhcyBiaWctZW5kaWFuIHNpZ25lZDwvbGk+DQorICAgICAqICA8bGk+YWxsIHZhbHVlcyBmb2xsb3cgYXMgYnl0ZXMgTmFtZSBpcyB1bmlxdWUuPC9saT4NCisgICAgICo8L3VsPg0KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCBudWxsIGlmIHRoZSBmaWxlIGhhcyBub3QgYmVlbiBjb21wdXRlZCBvcg0KKyAgICAgKiAgICAgICAgIGlmIHRoZXJlIGlzIG5vIEF1ZGlvIHRyYWNrIGluIHRoZSBtZWRpYUl0ZW0NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXVkaW9XYXZlZm9ybUZpbGVuYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1BdWRpb1dhdmVmb3JtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNldCB2b2x1bWUgb2YgdGhlIEF1ZGlvIHRyYWNrIG9mIHRoaXMgbWVkaWFJdGVtDQorICAgICAqDQorICAgICAqIEBwYXJhbSB2b2x1bWVQZXJjZW50IGluICUvLiAxMDAlIG1lYW5zIG5vIGNoYW5nZTsgNTAlIG1lYW5zIGhhbGYgdmFsdWUsIDIwMCUNCisgICAgICogICAgICAgICAgICBtZWFucyBkb3VibGUsIDAlIG1lYW5zIHNpbGVudC4NCisgICAgICogQHRocm93cyBVc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHZvbHVtZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWUoaW50IHZvbHVtZVBlcmNlbnQpIHsNCisgICAgICAgIG1Wb2x1bWVQZXJjZW50YWdlID0gdm9sdW1lUGVyY2VudDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSB2b2x1bWUgdmFsdWUgb2YgdGhlIGF1ZGlvIHRyYWNrIGFzIHBlcmNlbnRhZ2UuIENhbGwgb2YgdGhpcw0KKyAgICAgKiBtZXRob2QgYmVmb3JlIGNhbGxpbmcgc2V0Vm9sdW1lIHdpbGwgYWx3YXlzIHJldHVybiAxMDAlDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIHZvbHVtZSBpbiBwZXJjZW50YWdlDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsNCisgICAgICAgIHJldHVybiBtVm9sdW1lUGVyY2VudGFnZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG11dGVkIHRydWUgdG8gbXV0ZSB0aGUgbWVkaWEgaXRlbQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0TXV0ZShib29sZWFuIG11dGVkKSB7DQorICAgICAgICBtTXV0ZWQgPSBtdXRlZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZWRpYSBpdGVtIGlzIG11dGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc011dGVkKCkgew0KKyAgICAgICAgcmV0dXJuIG1NdXRlZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgdmlkZW8gdHlwZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRWaWRlb1R5cGUoKSB7DQorICAgICAgICByZXR1cm4gbVZpZGVvVHlwZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgdmlkZW8gcHJvZmlsZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRWaWRlb1Byb2ZpbGUoKSB7DQorICAgICAgICByZXR1cm4gbVZpZGVvUHJvZmlsZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgdmlkZW8gYml0cmF0ZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRWaWRlb0JpdHJhdGUoKSB7DQorICAgICAgICByZXR1cm4gbVZpZGVvQml0cmF0ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYXVkaW8gYml0cmF0ZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRBdWRpb0JpdHJhdGUoKSB7DQorICAgICAgICByZXR1cm4gbUF1ZGlvQml0cmF0ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgc2Vjb25kDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldEZwcygpIHsNCisgICAgICAgIHJldHVybiBtRnBzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhdWRpbyBjb2RlYw0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRBdWRpb1R5cGUoKSB7DQorICAgICAgICByZXR1cm4gbUF1ZGlvVHlwZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldEF1ZGlvQ2hhbm5lbHMoKSB7DQorICAgICAgICByZXR1cm4gbUF1ZGlvQ2hhbm5lbHM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGF1ZGlvIHNhbXBsZSBmcmVxdWVuY3kNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSgpIHsNCisgICAgICAgIHJldHVybiBtQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvT3ZlcmxheS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL092ZXJsYXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNThiNWNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL092ZXJsYXkuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIHN1cGVyIGNsYXNzIGZvciBhbGwgT3ZlcmxheSBjbGFzc2VzLg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3ZlcmxheSB7DQorICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVW5pcXVlSWQ7DQorICAgIC8vIFRoZSBvdmVybGF5IG93bmVyDQorICAgIHByaXZhdGUgZmluYWwgTWVkaWFJdGVtIG1NZWRpYUl0ZW07DQorICAgIC8vIHVzZXIgYXR0cmlidXRlcw0KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbVVzZXJBdHRyaWJ1dGVzOw0KKw0KKyAgICBwcm90ZWN0ZWQgbG9uZyBtU3RhcnRUaW1lTXM7DQorICAgIHByb3RlY3RlZCBsb25nIG1EdXJhdGlvbk1zOw0KKw0KKw0KKyAgICAvKioNCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgT3ZlcmxheSgpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSBtZWRpYUl0ZW0gVGhlIG1lZGlhIGl0ZW0gb3duZXINCisgICAgICogQHBhcmFtIG92ZXJsYXlJZCBUaGUgb3ZlcmxheSBpZA0KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMgVGhlIHN0YXJ0IHRpbWUgcmVsYXRpdmUgdG8gdGhlIG1lZGlhIGl0ZW0gc3RhcnQgdGltZQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24NCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpbGUgdHlwZSBpcyBub3QgUE5HIG9yIHRoZQ0KKyAgICAgKiAgICAgIHN0YXJ0VGltZU1zIGFuZCBkdXJhdGlvbk1zIGFyZSBpbmNvcnJlY3QuDQorICAgICAqLw0KKyAgICBwdWJsaWMgT3ZlcmxheShNZWRpYUl0ZW0gbWVkaWFJdGVtLCBTdHJpbmcgb3ZlcmxheUlkLCBsb25nIHN0YXJ0VGltZU1zLCBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1lZGlhIGl0ZW0gY2Fubm90IGJlIG51bGwiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChzdGFydFRpbWVNcyArIGR1cmF0aW9uTXMgPiBtZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbU1lZGlhSXRlbSA9IG1lZGlhSXRlbTsNCisgICAgICAgIG1VbmlxdWVJZCA9IG92ZXJsYXlJZDsNCisgICAgICAgIG1TdGFydFRpbWVNcyA9IHN0YXJ0VGltZU1zOw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKyAgICAgICAgbVVzZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIG9mIHRoZSBvdmVybGF5DQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgZHVyYXRpb24gb2YgdGhlIG92ZXJsYXkgZWZmZWN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtRHVyYXRpb25NczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSWYgYSBwcmV2aWV3IG9yIGV4cG9ydCBpcyBpbiBwcm9ncmVzcywgdGhlbiB0aGlzIGNoYW5nZSBpcyBlZmZlY3RpdmUgZm9yDQorICAgICAqIG5leHQgcHJldmlldyBvciBleHBvcnQgc2Vzc2lvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgVGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0RHVyYXRpb24obG9uZyBkdXJhdGlvbk1zKSB7DQorICAgICAgICBpZiAobVN0YXJ0VGltZU1zICsgZHVyYXRpb25NcyA+IG1NZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRHVyYXRpb24gaXMgdG9vIGxhcmdlIik7DQorICAgICAgICB9DQorDQorICAgICAgICBtRHVyYXRpb25NcyA9IGR1cmF0aW9uTXM7DQorDQorICAgICAgICBtTWVkaWFJdGVtLmludmFsaWRhdGVUcmFuc2l0aW9ucyh0aGlzKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgdGltZSBvZiB0aGUgb3ZlcmxheQ0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1TdGFydFRpbWVNczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBzdGFydCB0aW1lIGZvciB0aGUgb3ZlcmxheS4gSWYgYSBwcmV2aWV3IG9yIGV4cG9ydCBpcyBpbg0KKyAgICAgKiBwcm9ncmVzcywgdGhlbiB0aGlzIGNoYW5nZSBpcyBlZmZlY3RpdmUgZm9yIG5leHQgcHJldmlldyBvciBleHBvcnQNCisgICAgICogc2Vzc2lvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIHN0YXJ0VGltZU1zIHN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFRpbWUobG9uZyBzdGFydFRpbWVNcykgew0KKyAgICAgICAgaWYgKHN0YXJ0VGltZU1zICsgbUR1cmF0aW9uTXMgPiBtTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0YXJ0IHRpbWUgaXMgdG9vIGxhcmdlIik7DQorICAgICAgICB9DQorDQorICAgICAgICBtU3RhcnRUaW1lTXMgPSBzdGFydFRpbWVNczsNCisNCisgICAgICAgIG1NZWRpYUl0ZW0uaW52YWxpZGF0ZVRyYW5zaXRpb25zKHRoaXMpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXQgdGhlIHN0YXJ0IHRpbWUgYW5kIGR1cmF0aW9uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzdGFydFRpbWVNcyBzdGFydCB0aW1lIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFRpbWVBbmREdXJhdGlvbihsb25nIHN0YXJ0VGltZU1zLCBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIGlmIChzdGFydFRpbWVNcyArIGR1cmF0aW9uTXMgPiBtTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhcnQgdGltZSBvciBkdXJhdGlvbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbVN0YXJ0VGltZU1zID0gc3RhcnRUaW1lTXM7DQorICAgICAgICBtRHVyYXRpb25NcyA9IGR1cmF0aW9uTXM7DQorDQorICAgICAgICBtTWVkaWFJdGVtLmludmFsaWRhdGVUcmFuc2l0aW9ucyh0aGlzKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbWVkaWEgaXRlbSBvd25lcg0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSXRlbSBnZXRNZWRpYUl0ZW0oKSB7DQorICAgICAgICByZXR1cm4gbU1lZGlhSXRlbTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IGEgdXNlciBhdHRyaWJ1dGUNCisgICAgICoNCisgICAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lDQorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIG1Vc2VyQXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSB1c2VyIGF0dHJpYnV0ZXMNCisgICAgICovDQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFVzZXJBdHRyaWJ1dGVzKCkgew0KKyAgICAgICAgcmV0dXJuIG1Vc2VyQXR0cmlidXRlczsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsNCisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIE92ZXJsYXkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZC5lcXVhbHMoKChPdmVybGF5KW9iamVjdCkubVVuaXF1ZUlkKTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgIHJldHVybiBtVW5pcXVlSWQuaGFzaENvZGUoKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvT3ZlcmxheUZyYW1lLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvT3ZlcmxheUZyYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGNhYzRiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9PdmVybGF5RnJhbWUuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCisNCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7DQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsNCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29tcHJlc3NGb3JtYXQ7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG92ZXJsYXkgYW4gaW1hZ2Ugb24gdG9wIG9mIGEgbWVkaWEgaXRlbS4NCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIE92ZXJsYXlGcmFtZSBleHRlbmRzIE92ZXJsYXkgew0KKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMNCisgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsNCisgICAgcHJpdmF0ZSBTdHJpbmcgbUZpbGVuYW1lOw0KKw0KKyAgICAvKioNCisgICAgICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGJ5IHVzaW5nIHRoZSBkZWZhdWx0DQorICAgICAqIGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBPdmVybGF5RnJhbWUoKSB7DQorICAgICAgICB0aGlzKG51bGwsIG51bGwsIChTdHJpbmcpbnVsbCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yIGZvciBhbiBPdmVybGF5RnJhbWUNCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbSBUaGUgbWVkaWEgaXRlbSBvd25lcg0KKyAgICAgKiBAcGFyYW0gb3ZlcmxheUlkIFRoZSBvdmVybGF5IGlkDQorICAgICAqIEBwYXJhbSBiaXRtYXAgVGhlIGJpdG1hcCB0byBiZSB1c2VkIGFzIGFuIG92ZXJsYXkuIFRoZSBzaXplIG9mIHRoZQ0KKyAgICAgKiAgICAgIGJpdG1hcCBtdXN0IGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBtZWRpYSBpdGVtIHRvIHdoaWNoIGl0IGlzDQorICAgICAqICAgICAgYWRkZWQuIFRoZSBiaXRtYXAgaXMgdHlwaWNhbGx5IGEgZGVjb2RlZCBQTkcgZmlsZS4NCisgICAgICogQHBhcmFtIHN0YXJ0VGltZU1zIFRoZSBvdmVybGF5IHN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIFRoZSBvdmVybGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSB0eXBlIGlzIG5vdCBQTkcgb3IgdGhlDQorICAgICAqICAgICAgc3RhcnRUaW1lTXMgYW5kIGR1cmF0aW9uTXMgYXJlIGluY29ycmVjdC4NCisgICAgICovDQorICAgIHB1YmxpYyBPdmVybGF5RnJhbWUoTWVkaWFJdGVtIG1lZGlhSXRlbSwgU3RyaW5nIG92ZXJsYXlJZCwgQml0bWFwIGJpdG1hcCwgbG9uZyBzdGFydFRpbWVNcywNCisgICAgICAgICAgICBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIHN1cGVyKG1lZGlhSXRlbSwgb3ZlcmxheUlkLCBzdGFydFRpbWVNcywgZHVyYXRpb25Ncyk7DQorICAgICAgICBtQml0bWFwID0gYml0bWFwOw0KKyAgICAgICAgbUZpbGVuYW1lID0gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIE92ZXJsYXlGcmFtZS4gVGhpcyBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0bw0KKyAgICAgKiByZXN0b3JlIHRoZSBvdmVybGF5IGFmdGVyIGl0IHdhcyBzYXZlZCBpbnRlcm5hbGx5IGJ5IHRoZSB2aWRlbyBlZGl0b3IuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBtZWRpYUl0ZW0gVGhlIG1lZGlhIGl0ZW0gb3duZXINCisgICAgICogQHBhcmFtIG92ZXJsYXlJZCBUaGUgb3ZlcmxheSBpZA0KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGUgbmFtZSB0aGF0IGNvbnRhaW5zIHRoZSBvdmVybGF5Lg0KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMgVGhlIG92ZXJsYXkgc3RhcnQgdGltZSBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgVGhlIG92ZXJsYXkgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmaWxlIHR5cGUgaXMgbm90IFBORyBvciB0aGUNCisgICAgICogICAgICBzdGFydFRpbWVNcyBhbmQgZHVyYXRpb25NcyBhcmUgaW5jb3JyZWN0Lg0KKyAgICAgKi8NCisgICAgT3ZlcmxheUZyYW1lKE1lZGlhSXRlbSBtZWRpYUl0ZW0sIFN0cmluZyBvdmVybGF5SWQsIFN0cmluZyBmaWxlbmFtZSwgbG9uZyBzdGFydFRpbWVNcywNCisgICAgICAgICAgICBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIHN1cGVyKG1lZGlhSXRlbSwgb3ZlcmxheUlkLCBzdGFydFRpbWVNcywgZHVyYXRpb25Ncyk7DQorICAgICAgICBtRmlsZW5hbWUgPSBmaWxlbmFtZTsNCisgICAgICAgIG1CaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUZpbGUobUZpbGVuYW1lKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBHZXQgdGhlIG92ZXJsYXkgYml0bWFwDQorICAgICAqLw0KKyAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcCgpIHsNCisgICAgICAgIHJldHVybiBtQml0bWFwOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gYml0bWFwIFRoZSBvdmVybGF5IGJpdG1hcA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0Qml0bWFwKEJpdG1hcCBiaXRtYXApIHsNCisgICAgICAgIG1CaXRtYXAgPSBiaXRtYXA7DQorICAgICAgICBpZiAobUZpbGVuYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAvLyBEZWxldGUgdGhlIGZpbGUNCisgICAgICAgICAgICBuZXcgRmlsZShtRmlsZW5hbWUpLmRlbGV0ZSgpOw0KKyAgICAgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIGZpbGVuYW1lDQorICAgICAgICAgICAgbUZpbGVuYW1lID0gbnVsbDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIHRyYW5zaXRpb25zIGlmIG5lY2Vzc2FyeQ0KKyAgICAgICAgZ2V0TWVkaWFJdGVtKCkuaW52YWxpZGF0ZVRyYW5zaXRpb25zKHRoaXMpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgdGhlIGZpbGUgbmFtZSBvZiB0aGlzIG92ZXJsYXkNCisgICAgICovDQorICAgIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsNCisgICAgICAgIHJldHVybiBtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNhdmUgdGhlIG92ZXJsYXkgdG8gdGhlIHByb2plY3QgZm9sZGVyDQorICAgICAqDQorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHdoZXJlIHRoZSBvdmVybGF5IHdpbGwgYmUgc2F2ZWQNCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgZmlsZW5hbWUNCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGJpdG1hcCBjYW5ub3QgYmUgc2F2ZWQNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgYml0bWFwIGZpbGUgY2Fubm90IGJlIHNhdmVkDQorICAgICAqLw0KKyAgICBTdHJpbmcgc2F2ZShTdHJpbmcgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaWYgKG1GaWxlbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgcmV0dXJuIG1GaWxlbmFtZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIG1GaWxlbmFtZSA9IHBhdGggKyAiLyIgKyBnZXRJZCgpICsgIi5wbmciOw0KKyAgICAgICAgLy8gU2F2ZSB0aGUgaW1hZ2UgdG8gYSBsb2NhbCBmaWxlDQorICAgICAgICBmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1GaWxlbmFtZSk7DQorICAgICAgICBtQml0bWFwLmNvbXByZXNzKENvbXByZXNzRm9ybWF0LlBORywgMTAwLCBvdXQpOw0KKyAgICAgICAgb3V0LmZsdXNoKCk7DQorICAgICAgICBvdXQuY2xvc2UoKTsNCisgICAgICAgIHJldHVybiBtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERlbGV0ZSB0aGUgb3ZlcmxheSBmaWxlDQorICAgICAqLw0KKyAgICB2b2lkIGludmFsaWRhdGUoKSB7DQorICAgICAgICBpZiAobUZpbGVuYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBuZXcgRmlsZShtRmlsZW5hbWUpLmRlbGV0ZSgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFjODI3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgaXMgc3VwZXIgY2xhc3MgZm9yIGFsbCB0cmFuc2l0aW9ucy4gVHJhbnNpdGlvbnMgKHdpdGggdGhlDQorICogZXhjZXB0aW9uIG9mIFRyYW5zaXRpb25BdFN0YXJ0IGFuZCBUcmFuc2l0aW9BdEVuZCkgY2FuIG9ubHkgYmUgaW5zZXJ0ZWQNCisgKiBiZXR3ZWVuIG1lZGlhIGl0ZW1zLg0KKyAqDQorICogQWRkaW5nIGEgdHJhbnNpdGlvbiBiZXR3ZWVuIE1lZGlhSXRlbXMgbWFrZXMgdGhlDQorICogZHVyYXRpb24gb2YgdGhlIHN0b3J5Ym9hcmQgc2hvcnRlciBieSB0aGUgZHVyYXRpb24gb2YgdGhlIFRyYW5zaXRpb24gaXRzZWxmLg0KKyAqIEFzIGEgcmVzdWx0LCBpZiB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gaXMgbGFyZ2VyIHRoYW4gdGhlIHNtYWxsZXINCisgKiBkdXJhdGlvbiBvZiB0aGUgdHdvIE1lZGlhSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBUcmFuc2l0aW9uLCBhbiBleGNlcHRpb24NCisgKiB3aWxsIGJlIHRocm93bi4NCisgKg0KKyAqIER1cmluZyBhIHRyYW5zaXRpb24sIHRoZSBhdWRpbyB0cmFjayBhcmUgY3Jvc3MtZmFkaW5nDQorICogYXV0b21hdGljYWxseS4ge0BoaWRlfQ0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2l0aW9uIHsNCisgICAgLy8gVGhlIHRyYW5zaXRpb24gYmVoYXZpb3INCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJFSEFWSU9SX01JTl9WQUxVRSA9IDA7DQorICAgIC8qKiBUaGUgdHJhbnNpdGlvbiBzdGFydHMgc2xvd2x5IGFuZCBzcGVlZCB1cCAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUhBVklPUl9TUEVFRF9VUCA9IDA7DQorICAgIC8qKiBUaGUgdHJhbnNpdGlvbiBzdGFydCBmYXN0IGFuZCBzcGVlZCBkb3duICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFSEFWSU9SX1NQRUVEX0RPV04gPSAxOw0KKyAgICAvKiogVGhlIHRyYW5zaXRpb24gc3BlZWQgaXMgY29uc3RhbnQgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVIQVZJT1JfTElORUFSID0gMjsNCisgICAgLyoqIFRoZSB0cmFuc2l0aW9uIHN0YXJ0cyBmYXN0IGFuZCBlbmRzIGZhc3Qgd2l0aCBhIHNsb3cgbWlkZGxlICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFSEFWSU9SX01JRERMRV9TTE9XID0gMzsNCisgICAgLyoqIFRoZSB0cmFuc2l0aW9uIHN0YXJ0cyBzbG93bHkgYW5kIGVuZHMgc2xvd2x5IHdpdGggYSBmYXN0IG1pZGRsZSAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUhBVklPUl9NSURETEVfRkFTVCA9IDQ7DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCRUhBVklPUl9NQVhfVkFMVUUgPSA0Ow0KKw0KKyAgICAvLyBUaGUgdW5pcXVlIGlkIG9mIHRoZSB0cmFuc2l0aW9uDQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1VbmlxdWVJZDsNCisNCisgICAgLy8gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCBhdCB0aGUgZW5kIG9mIHRoaXMgbWVkaWEgaXRlbQ0KKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhSXRlbSBtQWZ0ZXJNZWRpYUl0ZW07DQorICAgIC8vIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIG1lZGlhIGl0ZW0NCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUl0ZW0gbUJlZm9yZU1lZGlhSXRlbTsNCisNCisgICAgLy8gVGhlIHRyYW5zaXRpb24gYmVoYXZpb3INCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBtQmVoYXZpb3I7DQorDQorICAgIC8vIFRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uDQorICAgIHByb3RlY3RlZCBsb25nIG1EdXJhdGlvbk1zOw0KKw0KKyAgICAvLyBUaGUgdHJhbnNpdGlvbiBmaWxlbmFtZQ0KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1GaWxlbmFtZTsNCisNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvbigpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzDQorICAgICAqICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gYmVmb3JlTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGJlZ2lubmluZyBvZg0KKyAgICAgKiAgICAgIHRoaXMgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqIEBwYXJhbSBiZWhhdmlvciBUaGUgdHJhbnNpdGlvbiBiZWhhdmlvcg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIFRyYW5zaXRpb24oU3RyaW5nIHRyYW5zaXRpb25JZCwgTWVkaWFJdGVtIGFmdGVyTWVkaWFJdGVtLCBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtLA0KKyAgICAgICAgICAgIGxvbmcgZHVyYXRpb25NcywgaW50IGJlaGF2aW9yKSB7DQorICAgICAgICBpZiAoYmVoYXZpb3IgPCBCRUhBVklPUl9NSU5fVkFMVUUgfHwgYmVoYXZpb3IgPiBCRUhBVklPUl9NQVhfVkFMVUUpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGJlaGF2aW9yOiAiICsgYmVoYXZpb3IpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbVVuaXF1ZUlkID0gdHJhbnNpdGlvbklkOw0KKyAgICAgICAgbUFmdGVyTWVkaWFJdGVtID0gYWZ0ZXJNZWRpYUl0ZW07DQorICAgICAgICBtQmVmb3JlTWVkaWFJdGVtID0gYmVmb3JlTWVkaWFJdGVtOw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKyAgICAgICAgbUJlaGF2aW9yID0gYmVoYXZpb3I7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIG9mIHRoZSB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbWVkaWEgaXRlbSBhdCB0aGUgZW5kIG9mIHdoaWNoIHRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQNCisgICAgICovDQorICAgIHB1YmxpYyBNZWRpYUl0ZW0gZ2V0QWZ0ZXJNZWRpYUl0ZW0oKSB7DQorICAgICAgICByZXR1cm4gbUFmdGVyTWVkaWFJdGVtOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBpdGVtIGF0IHRoZSBiZWdpbm5pbmcgb2Ygd2hpY2ggdGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZA0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSXRlbSBnZXRCZWZvcmVNZWRpYUl0ZW0oKSB7DQorICAgICAgICByZXR1cm4gbUJlZm9yZU1lZGlhSXRlbTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgdGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0RHVyYXRpb24obG9uZyBkdXJhdGlvbk1zKSB7DQorICAgICAgICBpZiAoZHVyYXRpb25NcyA+IGdldE1heGltdW1EdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGR1cmF0aW9uIGlzIHRvbyBsYXJnZSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKyAgICAgICAgaW52YWxpZGF0ZSgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbk1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgZHVyYXRpb24gb2YgYSB0cmFuc2l0aW9uIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gaGFsZiBvZiB0aGUgbWluaW11bQ0KKyAgICAgKiBkdXJhdGlvbiBvZiB0aGUgYm91bmRpbmcgbWVkaWEgaXRlbXMuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gZHVyYXRpb24gb2YgdGhpcyB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhpbXVtRHVyYXRpb24oKSB7DQorICAgICAgICBpZiAobUFmdGVyTWVkaWFJdGVtID09IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gbUJlZm9yZU1lZGlhSXRlbS5nZXRUaW1lbGluZUR1cmF0aW9uKCkgLyAyOw0KKyAgICAgICAgfSBlbHNlIGlmIChtQmVmb3JlTWVkaWFJdGVtID09IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gbUFmdGVyTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSAvIDI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiAoTWF0aC5taW4obUFmdGVyTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSwNCisgICAgICAgICAgICAgICAgICAgIG1CZWZvcmVNZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpKSAvIDIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBiZWhhdmlvcg0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRCZWhhdmlvcigpIHsNCisgICAgICAgIHJldHVybiBtQmVoYXZpb3I7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdlbmVyYXRlIHRoZSB2aWRlbyBjbGlwIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zaXRpb24uDQorICAgICAqIFRoaXMgbWV0aG9kIG1heSBibG9jayBmb3IgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZS4NCisgICAgICoNCisgICAgICogQmVmb3JlIHRoZSBtZXRob2QgY29tcGxldGVzIGV4ZWN1dGlvbiBpdCBzZXRzIHRoZSBtRmlsZW5hbWUgdG8NCisgICAgICogdGhlIG5hbWUgb2YgdGhlIG5ld2x5IGdlbmVyYXRlZCB0cmFuc2l0aW9uIHZpZGVvIGNsaXAgZmlsZS4NCisgICAgICovDQorICAgIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGUoKTsNCisNCisgICAgLyoqDQorICAgICAqIFJlbW92ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zaXRpb24NCisgICAgICovDQorICAgIHZvaWQgaW52YWxpZGF0ZSgpIHsNCisgICAgICAgIGlmIChtRmlsZW5hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIG5ldyBGaWxlKG1GaWxlbmFtZSkuZGVsZXRlKCk7DQorICAgICAgICAgICAgbUZpbGVuYW1lID0gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0cmFuc2l0aW9uIGlzIGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgYm9vbGVhbiBpc0dlbmVyYXRlZCgpIHsNCisgICAgICAgIHJldHVybiAobUZpbGVuYW1lICE9IG51bGwpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgew0KKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVHJhbnNpdGlvbikpIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkLmVxdWFscygoKFRyYW5zaXRpb24pb2JqZWN0KS5tVW5pcXVlSWQpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZC5oYXNoQ29kZSgpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uQWxwaGEuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uQWxwaGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMGU2NmZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25BbHBoYS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGFsbG93cyB0byByZW5kZXIgYW4gImFscGhhIGJsZW5kaW5nIiB0cmFuc2l0aW9uIGFjY29yZGluZyB0byBhDQorICogYml0bWFwIG1hc2suIFRoZSBtYXNrIHNob3dzIHRoZSBzaGFwZSBvZiB0aGUgdHJhbnNpdGlvbiBhbGwgYWxvbmcgdGhlDQorICogZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb246IGp1c3QgYmVmb3JlIHRoZSB0cmFuc2l0aW9uLCB2aWRlbyAxIGlzIGZ1bGx5DQorICogZGlzcGxheWVkLiBXaGVuIHRoZSB0cmFuc2l0aW9uIHN0YXJ0cywgYXMgdGhlIHRpbWUgZ29lcyBvbiwgcGl4ZWxzIG9mIHZpZGVvIDINCisgKiByZXBsYWNlIHBpeGVscyBvZiB2aWRlbyAxIGFjY29yZGluZyB0byB0aGUgZ3JheSBzY2FsZSBwaXhlbCB2YWx1ZSBvZiB0aGUNCisgKiBtYXNrLg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkFscGhhIGV4dGVuZHMgVHJhbnNpdGlvbiB7DQorICAgIC8qKiBUaGlzIGlzIHRoZSBpbnB1dCBKUEVHIGZpbGUgZm9yIHRoZSBtYXNrICovDQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NYXNrRmlsZW5hbWU7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIGlzIHBlcmNlbnRhZ2UgKGJldHdlZW4gMCBhbmQgMTAwKSBvZiBibGVuZGluZyBiZXR3ZWVuIHZpZGVvIDEgYW5kDQorICAgICAqIHZpZGVvIDIgaWYgdGhpcyB2YWx1ZSBlcXVhbHMgMCwgdGhlbiB0aGUgbWFzayBpcyBzdHJpY3RseSBhcHBsaWVkIGlmIHRoaXMNCisgICAgICogdmFsdWUgZXF1YWxzIDEwMCwgdGhlbiB0aGUgbWFzayBpcyBub3QgYXQgYWxsIGFwcGxpZWQgKG5vIHRyYW5zaXRpb24NCisgICAgICogZWZmZWN0KQ0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUJsZW5kaW5nUGVyY2VudDsNCisNCisgICAgLyoqDQorICAgICAqIElmIHRydWUsIHRoaXMgdmFsdWUgaW52ZXJ0cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtYXNrOiB3aGl0ZSBwaXhlbHMgb2YNCisgICAgICogdGhlIG1hc2sgc2hvdyB2aWRlbyAyIHBpeGVscyBmaXJzdCBibGFjayBwaXhlbHMgb2YgdGhlIG1hc2sgc2hvdyB2aWRlbyAyDQorICAgICAqIHBpeGVscyBsYXN0Lg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0ludmVydDsNCisNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvbkFscGhhKCkgew0KKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsLCAwLCAwLCBudWxsLCAwLCBmYWxzZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzIG1lZGlhDQorICAgICAqICAgICAgICAgICAgaXRlbQ0KKyAgICAgKiBAcGFyYW0gYmVmb3JlTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzDQorICAgICAqICAgICAgICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIGJlaGF2aW9yIGlzIG9uZSBvZiB0aGUgYmVoYXZpb3IgZGVmaW5lZCBpbiBUcmFuc2l0aW9uDQorICAgICAqICAgICAgICAgICAgY2xhc3MNCisgICAgICogQHBhcmFtIG1hc2tGaWxlbmFtZSBKUEVHIGZpbGUgbmFtZS4gVGhlIGRpbWVuc2lvbiBvZiB0aGUgaW1hZ2UNCisgICAgICogICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIDcyMHAgKDE2OjkgYXNwZWN0IHJhdGlvKS4gTWFzayBmaWxlcyBhcmUNCisgICAgICogICAgICAgICAgIHNoYXJlZCBiZXR3ZWVuIHZpZGVvIGVkaXRvcnMgYW5kIGNhbiBiZSBjcmVhdGVkIGluIHRoZQ0KKyAgICAgKiAgICAgICAgICAgcHJvamVjdHMgZm9sZGVyICh0aGUgcGFyZW50IGZvbGRlciBmb3IgYWxsIHByb2plY3RzKS4NCisgICAgICogQHBhcmFtIGJsZW5kaW5nUGVyY2VudCBUaGUgYmxlbmRpbmcgcGVyY2VudCBhcHBsaWVkDQorICAgICAqIEBwYXJhbSBpbnZlcnQgdHJ1ZSB0byBpbnZlcnQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYWxwaGEgYmxlbmRpbmcNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmVoYXZpb3IgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYNCisgICAgICogICAgICAgICAgICAgZGlyZWN0aW9uIGFyZSBub3Qgc3VwcG9ydGVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIFRyYW5zaXRpb25BbHBoYShTdHJpbmcgdHJhbnNpdGlvbklkLCBNZWRpYUl0ZW0gYWZ0ZXJNZWRpYUl0ZW0sDQorICAgICAgICAgICAgTWVkaWFJdGVtIGJlZm9yZU1lZGlhSXRlbSwgbG9uZyBkdXJhdGlvbk1zLCBpbnQgYmVoYXZpb3IsIFN0cmluZyBtYXNrRmlsZW5hbWUsDQorICAgICAgICAgICAgaW50IGJsZW5kaW5nUGVyY2VudCwgYm9vbGVhbiBpbnZlcnQpIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIGJlZm9yZU1lZGlhSXRlbSwgZHVyYXRpb25NcywgYmVoYXZpb3IpOw0KKw0KKyAgICAgICAgbU1hc2tGaWxlbmFtZSA9IG1hc2tGaWxlbmFtZTsNCisgICAgICAgIG1CbGVuZGluZ1BlcmNlbnQgPSBibGVuZGluZ1BlcmNlbnQ7DQorICAgICAgICBtSXNJbnZlcnQgPSBpbnZlcnQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGJsZW5kaW5nIHBlcmNlbnRhZ2UNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0QmxlbmRpbmdQZXJjZW50KCkgew0KKyAgICAgICAgcmV0dXJuIG1CbGVuZGluZ1BlcmNlbnQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIG1hc2sgZmlsZW5hbWUNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFza0ZpbGVuYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1NYXNrRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBhbHBoYSBibGVuZGluZyBpcyBpbnZlcnRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnZlcnQoKSB7DQorICAgICAgICByZXR1cm4gbUlzSW52ZXJ0Ow0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkNyb3NzZmFkZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25Dcm9zc2ZhZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mODIyM2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25Dcm9zc2ZhZGUuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGFsbG93cyB0byByZW5kZXIgYSBjcm9zc2ZhZGUgKGRpc3NvbHZlKSBlZmZlY3QgdHJhbnNpdGlvbiBiZXR3ZWVuDQorICogdHdvIHZpZGVvcw0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkNyb3NzZmFkZSBleHRlbmRzIFRyYW5zaXRpb24gew0KKyAgICAvKioNCisgICAgICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGJ5IHVzaW5nIHRoZSBkZWZhdWx0DQorICAgICAqIGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBUcmFuc2l0aW9uQ3Jvc3NmYWRlKCkgew0KKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsLCAwLCAwKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25JZCBUaGUgdHJhbnNpdGlvbiBpZA0KKyAgICAgKiBAcGFyYW0gYWZ0ZXJNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgZW5kIG9mIHRoaXMNCisgICAgICogICAgICBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBiZWZvcmVNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgYmVnaW5uaW5nIG9mDQorICAgICAqICAgICAgdGhpcyBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKiBAcGFyYW0gYmVoYXZpb3IgYmVoYXZpb3IgaXMgb25lIG9mIHRoZSBiZWhhdmlvciBkZWZpbmVkIGluIFRyYW5zaXRpb24NCisgICAgICogICAgICAgICAgICBjbGFzcw0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiZWhhdmlvciBpcyBub3Qgc3VwcG9ydGVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIFRyYW5zaXRpb25Dcm9zc2ZhZGUoU3RyaW5nIHRyYW5zaXRpb25JZCwgTWVkaWFJdGVtIGFmdGVyTWVkaWFJdGVtLA0KKyAgICAgICAgICAgIE1lZGlhSXRlbSBiZWZvcmVNZWRpYUl0ZW0sIGxvbmcgZHVyYXRpb25NcywgaW50IGJlaGF2aW9yKSB7DQorICAgICAgICBzdXBlcih0cmFuc2l0aW9uSWQsIGFmdGVyTWVkaWFJdGVtLCBiZWZvcmVNZWRpYUl0ZW0sIGR1cmF0aW9uTXMsIGJlaGF2aW9yKTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgdm9pZCBnZW5lcmF0ZSgpIHsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjNmJiNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uRW5kQ3VydGFpbkNsb3NpbmcuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisvKioNCisgKiBUaGlzIHRyYW5zaXRpb24gZmFkZXMgdG8gYmxhY2sgZnJhbWUgdXNpbmcgY3VydGFpbiBjbG9zaW5nOiBBIGJsYWNrIGltYWdlIGlzDQorICogbW92ZWQgZnJvbSB0b3AgdG8gYm90dG9tIHRvIGNvdmVyIHRoZSB2aWRlby4gVGhpcyB0cmFuc2l0aW9uIGlzIGFsd2F5cw0KKyAqIGFwcGxpZWQgYXQgdGhlIGVuZCBvZiB0aGUgbW92aWUuIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nIGV4dGVuZHMgVHJhbnNpdGlvbiB7DQorICAgIC8qKg0KKyAgICAgKiBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYnkgdXNpbmcgdGhlIGRlZmF1bHQNCisgICAgICogY29uc3RydWN0b3INCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KKyAgICBwcml2YXRlIFRyYW5zaXRpb25FbmRDdXJ0YWluQ2xvc2luZygpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgMCwgQkVIQVZJT1JfTElORUFSKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3IuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzDQorICAgICAqICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIFRoZSB0cmFuc2l0aW9uIGJlaGF2aW9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nKFN0cmluZyB0cmFuc2l0aW9uSWQsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbSwNCisgICAgICAgICAgICBsb25nIGR1cmF0aW9uLCBpbnQgYmVoYXZpb3IpIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIG51bGwsIGR1cmF0aW9uLCBiZWhhdmlvcik7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHZvaWQgZ2VuZXJhdGUoKSB7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25FbmRGYWRlVG9CbGFjay5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25FbmRGYWRlVG9CbGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmOTEzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkVuZEZhZGVUb0JsYWNrLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQorLyoqDQorICogVGhpcyB0cmFuc2l0aW9uIGZhZGVzIHRvIGJsYWNrIGZyYW1lIHVzaW5nIGZhZGUgb3V0IGluIGEgY2VydGFpbiBwcm92aWRlZA0KKyAqIGR1cmF0aW9uLiBUaGlzIHRyYW5zaXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgYXQgdGhlIGVuZCBvZiB0aGUgbW92aWUuIHtAaGlkZQ0KKyAqIH0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkVuZEZhZGVUb0JsYWNrIGV4dGVuZHMgVHJhbnNpdGlvbiB7DQorICAgIC8qKg0KKyAgICAgKiBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYnkgdXNpbmcgdGhlIGRlZmF1bHQNCisgICAgICogY29uc3RydWN0b3INCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KKyAgICBwcml2YXRlIFRyYW5zaXRpb25FbmRGYWRlVG9CbGFjaygpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgMCwgQkVIQVZJT1JfTElORUFSKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3IuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzDQorICAgICAqICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIFRoZSB0cmFuc2l0aW9uIGJlaGF2aW9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbkVuZEZhZGVUb0JsYWNrKFN0cmluZyB0cmFuc2l0aW9uSWQsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbSwgbG9uZyBkdXJhdGlvbiwNCisgICAgICAgICAgICBpbnQgYmVoYXZpb3IpIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIG51bGwsIGR1cmF0aW9uLCBiZWhhdmlvcik7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHZvaWQgZ2VuZXJhdGUoKSB7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25GYWRlVG9CbGFjay5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25GYWRlVG9CbGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1NjlhNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkZhZGVUb0JsYWNrLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlbmRlciBhIGZhZGUgdG8gYmxhY2sgdHJhbnNpdGlvbiBiZXR3ZWVuIHR3byB2aWRlb3MuDQorICoge0BoaWRlfQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUcmFuc2l0aW9uRmFkZVRvQmxhY2sgZXh0ZW5kcyBUcmFuc2l0aW9uIHsNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvbkZhZGVUb0JsYWNrKCkgew0KKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsLCAwLCAwKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25JZCBUaGUgdHJhbnNpdGlvbiBpZA0KKyAgICAgKiBAcGFyYW0gYWZ0ZXJNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgZW5kIG9mIHRoaXMNCisgICAgICogICAgICBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBiZWZvcmVNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgYmVnaW5uaW5nIG9mDQorICAgICAqICAgICAgdGhpcyBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uDQorICAgICAqIEBwYXJhbSBiZWhhdmlvciBiZWhhdmlvciBpcyBvbmUgb2YgdGhlIGJlaGF2aW9yIGRlZmluZWQgaW4gVHJhbnNpdGlvbg0KKyAgICAgKiAgICAgICAgICAgIGNsYXNzDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJlaGF2aW9yIGlzIG5vdCBzdXBwb3J0ZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbkZhZGVUb0JsYWNrKFN0cmluZyB0cmFuc2l0aW9uSWQsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbSwNCisgICAgICAgICAgICBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtLCBsb25nIGR1cmF0aW9uTXMsIGludCBiZWhhdmlvcikgew0KKyAgICAgICAgc3VwZXIodHJhbnNpdGlvbklkLCBhZnRlck1lZGlhSXRlbSwgYmVmb3JlTWVkaWFJdGVtLCBkdXJhdGlvbk1zLCBiZWhhdmlvcik7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHZvaWQgZ2VuZXJhdGUoKSB7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25TbGlkaW5nLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblNsaWRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYzlmNGIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25TbGlkaW5nLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gY3JlYXRlIHNsaWRpbmcgdHJhbnNpdGlvbnMNCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIFRyYW5zaXRpb25TbGlkaW5nIGV4dGVuZHMgVHJhbnNpdGlvbiB7DQorDQorICAgIC8qKiBWaWRlbyAxIGlzIHB1c2hlZCB0byB0aGUgcmlnaHQgd2hpbGUgdmlkZW8gMiBpcyBjb21pbmcgZnJvbSBsZWZ0ICovDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERJUkVDVElPTl9SSUdIVF9PVVRfTEVGVF9JTiA9IDA7DQorICAgIC8qKiBWaWRlbyAxIGlzIHB1c2hlZCB0byB0aGUgbGVmdCB3aGlsZSB2aWRlbyAyIGlzIGNvbWluZyBmcm9tIHJpZ2h0ICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MRUZUX09VVF9SSUdIVF9JTiA9IDE7DQorICAgIC8qKiBWaWRlbyAxIGlzIHB1c2hlZCB0byB0aGUgdG9wIHdoaWxlIHZpZGVvIDIgaXMgY29taW5nIGZyb20gYm90dG9tICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9UT1BfT1VUX0JPVFRPTV9JTiA9IDI7DQorICAgIC8qKiBWaWRlbyAxIGlzIHB1c2hlZCB0byB0aGUgYm90dG9tIHdoaWxlIHZpZGVvIDIgaXMgY29taW5nIGZyb20gdG9wICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9CT1RUT01fT1VUX1RPUF9JTiA9IDM7DQorDQorICAgIC8vIFRoZSBzbGlkaW5nIHRyYW5zaXRpb25zDQorICAgIHByaXZhdGUgZmluYWwgaW50IG1TbGlkaW5nRGlyZWN0aW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGJ5IHVzaW5nIHRoZSBkZWZhdWx0DQorICAgICAqIGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBUcmFuc2l0aW9uU2xpZGluZygpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzDQorICAgICAqICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gYmVmb3JlTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGJlZ2lubmluZyBvZg0KKyAgICAgKiAgICAgIHRoaXMgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIGJlaGF2aW9yIGlzIG9uZSBvZiB0aGUgYmVoYXZpb3IgZGVmaW5lZCBpbiBUcmFuc2l0aW9uDQorICAgICAqICAgICAgICAgICAgY2xhc3MNCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBkaXJlY3Rpb24gc2hhbGwgYmUgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGlyZWN0aW9ucyBsaWtlDQorICAgICAqICAgICAgICAgICAgUklHSFRfT1VUX0xFRlRfSU4NCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmVoYXZpb3IgaXMgbm90IHN1cHBvcnRlZC4NCisgICAgICovDQorICAgIHB1YmxpYyBUcmFuc2l0aW9uU2xpZGluZyhTdHJpbmcgdHJhbnNpdGlvbklkLCBNZWRpYUl0ZW0gYWZ0ZXJNZWRpYUl0ZW0sDQorICAgICAgICAgICAgTWVkaWFJdGVtIGJlZm9yZU1lZGlhSXRlbSwgbG9uZyBkdXJhdGlvbk1zLCBpbnQgYmVoYXZpb3IsIGludCBkaXJlY3Rpb24pIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIGJlZm9yZU1lZGlhSXRlbSwgZHVyYXRpb25NcywgYmVoYXZpb3IpOw0KKyAgICAgICAgbVNsaWRpbmdEaXJlY3Rpb24gPSBkaXJlY3Rpb247DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHNsaWRpbmcgZGlyZWN0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldERpcmVjdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtU2xpZGluZ0RpcmVjdGlvbjsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgdm9pZCBnZW5lcmF0ZSgpIHsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblN0YXJ0Q3VydGFpbk9wZW5pbmcuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uU3RhcnRDdXJ0YWluT3BlbmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI3ODdiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblN0YXJ0Q3VydGFpbk9wZW5pbmcuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisNCisvKioNCisgKiBUaGlzIHRyYW5zaXRpb24gZmFkZXMgZnJvbSBibGFjayBmcmFtZSB1c2luZyBjdXJ0YWluIG9wZW5pbmcuIEEgYmxhY2sNCisgKiBpbWFnZSBpcyBkaXNwbGF5ZWQgYW5kIG1vdmVzIGZyb20gYm90dG9tIHRvIHRvcCBtYWtpbmcgdGhlIHZpZGVvIHZpc2libGUuDQorICogVGhpcyB0cmFuc2l0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1vdmllLg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvblN0YXJ0Q3VydGFpbk9wZW5pbmcgZXh0ZW5kcyBUcmFuc2l0aW9uIHsNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvblN0YXJ0Q3VydGFpbk9wZW5pbmcoKSB7DQorICAgICAgICB0aGlzKG51bGwsIG51bGwsIDAsIFRyYW5zaXRpb24uQkVIQVZJT1JfTElORUFSKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25JZCBUaGUgdHJhbnNpdGlvbiBpZA0KKyAgICAgKiBAcGFyYW0gYmVmb3JlTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGJlZ2lubmluZyBvZg0KKyAgICAgKiAgICAgIHRoaXMgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqIEBwYXJhbSBiZWhhdmlvciBUaGUgdHJhbnNpdGlvbiBiZWhhdmlvcg0KKyAgICAgKi8NCisgICAgcHVibGljIFRyYW5zaXRpb25TdGFydEN1cnRhaW5PcGVuaW5nKFN0cmluZyB0cmFuc2l0aW9uSWQsIE1lZGlhSXRlbSBiZWZvcmVNZWRpYUl0ZW0sDQorICAgICAgICAgICAgbG9uZyBkdXJhdGlvbk1zLCBpbnQgYmVoYXZpb3IpIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgbnVsbCwgYmVmb3JlTWVkaWFJdGVtLCBkdXJhdGlvbk1zLCBiZWhhdmlvcik7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgew0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uU3RhcnRGYWRlRnJvbUJsYWNrLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTkzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjay5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOw0KKw0KKy8qKg0KKyAqIFRoaXMgdHJhbnNpdGlvbiBmYWRlcyBmcm9tIGJsYWNrIHVzaW5nIGZhZGUtaW4gaW4gYSBjZXJ0YWluIHByb3ZpZGVkDQorICogZHVyYXRpb24uIFRoaXMgdHJhbnNpdGlvbiBpcyBhbHdheXMgYXBwbGllZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb3ZpZS4NCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIFRyYW5zaXRpb25TdGFydEZhZGVGcm9tQmxhY2sgZXh0ZW5kcyBUcmFuc2l0aW9uIHsNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjaygpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgMCwgVHJhbnNpdGlvbi5CRUhBVklPUl9MSU5FQVIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvcg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbklkIFRoZSB0cmFuc2l0aW9uIGlkDQorICAgICAqIEBwYXJhbSBiZWZvcmVNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgYmVnaW5uaW5nIG9mDQorICAgICAqICAgICAgdGhpcyBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIFRoZSB0cmFuc2l0aW9uIGJlaGF2aW9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjayhTdHJpbmcgdHJhbnNpdGlvbklkLCBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtLA0KKyAgICAgICAgICAgIGxvbmcgZHVyYXRpb25NcywgaW50IGJlaGF2aW9yKSB7DQorICAgICAgICBzdXBlcih0cmFuc2l0aW9uSWQsIG51bGwsIGJlZm9yZU1lZGlhSXRlbSwgZHVyYXRpb25NcywgYmVoYXZpb3IpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVmlkZW9FZGl0b3IuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9WaWRlb0VkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhOGYyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVmlkZW9FZGl0b3IuamF2YQpAQCAtMCwwICsxLDQ5MyBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247DQorDQoraW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHdoaWNoIHByb3ZpZGUgdmlkZW8gZWRpdGluZw0KKyAqIGZ1bmN0aW9uYWxpdHkuIFRoZSBWaWRlb0VkaXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBtYW5hZ2VzIGFsbCBpbnB1dCBhbmQNCisgKiBvdXRwdXQgZmlsZXMuIFVubGVzcyBzcGVjaWZpY2FsbHkgbWVudGlvbmVkLCBtZXRob2RzIGFyZSBibG9ja2luZy4gQQ0KKyAqIHR5cGljYWwgZWRpdGluZyBzZXNzaW9uIG1heSBjb25zaXN0IG9mIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9uczoNCisgKg0KKyAqIDx1bD4NCisgKiAgPGxpPkFkZCBhIHNldCBvZiBNZWRpYUl0ZW1zPC9saT4NCisgKiAgPGxpPkFwcGx5IGEgc2V0IG9mIFRyYW5zaXRpb25zIGJldHdlZW4gTWVkaWFJdGVtczwvbGk+DQorICogIDxsaT5BZGQgRWZmZWN0cyBhbmQgT3ZlcmxheXMgdG8gbWVkaWEgaXRlbXM8L2xpPg0KKyAqICA8bGk+UHJldmlldyB0aGUgbW92aWUgYXQgYW55IHRpbWU8L2xpPg0KKyAqICA8bGk+U2F2ZSB0aGUgVmlkZW9FZGl0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MgaW50ZXJuYWwgc3RhdGU8L2xpPg0KKyAqICA8bGk+UmVsZWFzZSB0aGUgVmlkZW9FZGl0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MgaW5zdGFuY2UgYnkgaW52b2tpbmcNCisgKiB7QGxpbmsgI3JlbGVhc2UoKX0NCisgKiA8L3VsPg0KKyAqIFRoZSBpbnRlcm5hbCBWaWRlb0VkaXRvciBzdGF0ZSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOg0KKyAqIDx1bD4NCisgKiAgPGxpPk9yZGVyZWQgJiB0cmltbWVkIE1lZGlhSXRlbXM8L2xpPg0KKyAqICA8bGk+VHJhbnNpdGlvbiB2aWRlbyBjbGlwczwvbGk+DQorICogIDxsaT5PdmVybGF5czwvbGk+DQorICogIDxsaT5FZmZlY3RzPC9saT4NCisgKiAgPGxpPkF1ZGlvIHdhdmVmb3JtIGZvciB0aGUgYmFja2dyb3VuZCBhdWRpbyBhbmQgTWVkaWFJdGVtczwvbGk+DQorICogIDxsaT5Qcm9qZWN0IHRodW1ibmFpbDwvbGk+DQorICogIDxsaT5MYXN0IGV4cG9ydGVkIG1vdmllLjwvbGk+DQorICogIDxsaT5PdGhlciBwcm9qZWN0IHNwZWNpZmljIGRhdGEgc3VjaCBhcyB0aGUgY3VycmVudCBhc3BlY3QgcmF0aW8uPC9saT4NCisgKiA8L3VsPg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFZpZGVvRWRpdG9yIHsNCisgICAgLy8gVGhlIGZpbGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aHVtYm5haWwNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJOQUlMX0ZJTEVOQU1FID0gInRodW1ibmFpbC5qcGciOw0KKw0KKyAgICAvLyBVc2UgdGhpcyB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBzcGVjaWZpYyBlbmQgb2YgdGhlIHN0b3J5Ym9hcmQgdGltZWxpbmUNCisgICAgLy8gdmFsdWUuDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERVUkFUSU9OX09GX1NUT1JZQk9BUkQgPSAtMTsNCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgbGlzdGVuZXIgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIFZpZGVvRWRpdG9yIHRvIGVtaXQgcHJldmlldw0KKyAgICAgKiBwcm9ncmVzcyBub3RpZmljYXRpb25zLiBUaGlzIGNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZQ0KKyAgICAgKiBudW1iZXIgb2YgZnJhbWVzIHNwZWNpZmllZCBieQ0KKyAgICAgKiB7QGxpbmsgI3N0YXJ0UHJldmlldyhTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIsIGxvbmcgZnJvbU1zLA0KKyAgICAgKiAgICAgICAgICAgaW50IGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50LCBQcmV2aWV3UHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcil9DQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFByZXZpZXdQcm9ncmVzc0xpc3RlbmVyIHsNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgdGhlIGxpc3RlbmVyIG9mIHRoZSBjdXJyZW50IHRpbWUgcG9zaXRpb24gd2hpbGUNCisgICAgICAgICAqIHByZXZpZXdpbmcgYSBwcm9qZWN0Lg0KKyAgICAgICAgICoNCisgICAgICAgICAqIEBwYXJhbSB2aWRlb0VkaXRvciBUaGUgVmlkZW9FZGl0b3IgaW5zdGFuY2UNCisgICAgICAgICAqIEBwYXJhbSB0aW1lTXMgVGhlIGN1cnJlbnQgcHJldmlldyBwb3NpdGlvbiAoZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgICAgICogICAgICAgICAgICBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdG9yeWJvYXJkIHRpbWVsaW5lKS4NCisgICAgICAgICAqIEBwYXJhbSBlbmQgdHJ1ZSBpZiB0aGUgZW5kIG9mIHRoZSB0aW1lbGluZSB3YXMgcmVhY2hlZA0KKyAgICAgICAgICovDQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzKFZpZGVvRWRpdG9yIHZpZGVvRWRpdG9yLCBsb25nIHRpbWVNcywgYm9vbGVhbiBlbmQpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIGxpc3RlbmVyIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRoZSBWaWRlb0VkaXRvciB0byBlbWl0IGV4cG9ydCBzdGF0dXMNCisgICAgICogbm90aWZpY2F0aW9ucy4NCisgICAgICoge0BsaW5rICNleHBvcnQoU3RyaW5nIGZpbGVuYW1lLCBFeHBvcnRQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyLCBpbnQgaGVpZ2h0LCBpbnQgYml0cmF0ZSl9DQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEV4cG9ydFByb2dyZXNzTGlzdGVuZXIgew0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyB0aGUgbGlzdGVuZXIgb2YgdGhlIHByb2dyZXNzIHN0YXR1cyBvZiBhIGV4cG9ydA0KKyAgICAgICAgICogb3BlcmF0aW9uLg0KKyAgICAgICAgICoNCisgICAgICAgICAqIEBwYXJhbSB2aWRlb0VkaXRvciBUaGUgVmlkZW9FZGl0b3IgaW5zdGFuY2UNCisgICAgICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB3aGljaCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZw0KKyAgICAgICAgICogICAgICAgICAgICBleHBvcnRlZC4NCisgICAgICAgICAqIEBwYXJhbSBwcm9ncmVzcyBUaGUgcHJvZ3Jlc3MgaW4gJS4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXhwb3J0LCB0aGlzDQorICAgICAgICAgKiAgICAgICAgICAgIHZhbHVlIGlzIHNldCB0byAwOyBhdCB0aGUgZW5kLCB0aGUgdmFsdWUgaXMgc2V0IHRvIDEwMC4NCisgICAgICAgICAqLw0KKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzcyhWaWRlb0VkaXRvciB2aWRlb0VkaXRvciwgU3RyaW5nIGZpbGVuYW1lLCBpbnQgcHJvZ3Jlc3MpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBwYXRoIHdoZXJlIHRoZSBWaWRlb0VkaXRvciBzdG9yZXMgYWxsIGZpbGVzIHJlbGF0ZWQgdG8gdGhlDQorICAgICAqIHByb2plY3QNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpOw0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgcmVsZWFzZXMgYWxsIGluLW1lbW9yeSByZXNvdXJjZXMgdXNlZCBieSB0aGUgVmlkZW9FZGl0b3INCisgICAgICogaW5zdGFuY2UuIEFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgc3VjaCBhcyBwcmV2aWV3LCBleHBvcnQgYW5kIGV4dHJhY3QNCisgICAgICogYXVkaW8gd2F2ZWZvcm0gbXVzdCBiZSBjYW5jZWxlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKTsNCisNCisgICAgLyoqDQorICAgICAqIFBlcnNpc3QgdGhlIGN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgVmlkZW9FZGl0b3IgdG8gdGhlIHByb2plY3QgcGF0aC4NCisgICAgICogVGhlIFZpZGVvRWRpdG9yIHN0YXRlIG1heSBiZSByZXN0b3JlZCBieSBpbnZva2luZyB0aGUNCisgICAgICoge0BsaW5rIFZpZGVvRWRpdG9yRmFjdG9yeSNsb2FkKFN0cmluZyl9IG1ldGhvZC4gVGhpcyBtZXRob2QgZG9lcyBub3QNCisgICAgICogcmVsZWFzZSB0aGUgaW50ZXJuYWwgaW4tbWVtb3J5IHN0YXRlIG9mIHRoZSBWaWRlb0VkaXRvci4gVG8gcmVsZWFzZQ0KKyAgICAgKiB0aGUgaW4tbWVtb3J5IHN0YXRlIG9mIHRoZSBWaWRlb0VkaXRvciB0aGUge0BsaW5rICNyZWxlYXNlKCl9IG1ldGhvZA0KKyAgICAgKiBtdXN0IGJlIGludm9rZWQuDQorICAgICAqDQorICAgICAqIFBlbmRpbmcgdHJhbnNpdGlvbiBnZW5lcmF0aW9ucyBtdXN0IGJlIGFsbG93ZWQgdG8gY29tcGxldGUgYmVmb3JlIHRoZQ0KKyAgICAgKiBzdGF0ZSBpcyBzYXZlZC4NCisgICAgICogUGVuZGluZyBhdWRpbyB3YXZlZm9ybSBnZW5lcmF0aW9ucyBtdXN0IGJlIGFsbG93ZWQgdG8gY29tcGxldGUuDQorICAgICAqIFBlbmRpbmcgZXhwb3J0IG9wZXJhdGlvbnMgbXVzdCBiZSBhbGxvd2VkIHRvIGNvbnRpbnVlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsNCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZSB0aGUgb3V0cHV0IG1vdmllIGJhc2VkIG9uIGFsbCBtZWRpYSBpdGVtcyBhZGRlZCBhbmQgdGhlIGFwcGxpZWQNCisgICAgICogc3Rvcnlib2FyZCBpdGVtcy4gVGhpcyBtZXRob2QgY2FuIHRha2UgYSBsb25nIHRpbWUgdG8gZXhlY3V0ZSBhbmQgaXMNCisgICAgICogYmxvY2tpbmcuIFRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlY2VpdmUgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyB2aWEgdGhlDQorICAgICAqIEV4cG9ydFByb2dyZXNzTGlzdGVuZXIuIFNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IHN1cHBvcnQgbXVsdGlwbGUNCisgICAgICogc2ltdWx0YW5lb3VzIGV4cG9ydCBvcGVyYXRpb25zLg0KKyAgICAgKg0KKyAgICAgKiBOb3RlIHRoYXQgaW52b2tpbmcgbWV0aG9kcyB3aGljaCB3b3VsZCBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQNCisgICAgICogbW92aWUgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoaWxlIGFuIGV4cG9ydCBvcGVyYXRpb24gaXMNCisgICAgICogcGVuZGluZy4NCisgICAgICoNCisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBvdXRwdXQgZmlsZSBuYW1lIChpbmNsdWRpbmcgdGhlIGZ1bGwgcGF0aCkNCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBvdXRwdXQgdmlkZW8gZmlsZS4gVGhlIHN1cHBvcnRlZCB2YWx1ZXMNCisgICAgICogICAgICAgICAgICBmb3IgaGVpZ2h0IGFyZSBkZXNjcmliZWQgaW4gdGhlIE1lZGlhUHJvcGVydGllcyBjbGFzcywgZm9yDQorICAgICAqICAgICAgICAgICAgZXhhbXBsZTogSEVJR0hUXzQ4MC4gVGhlIHdpZHRoIHdpbGwgYmUgYXV0b21hdGljYWxseQ0KKyAgICAgKiAgICAgICAgICAgIGNvbXB1dGVkIGFjY29yZGluZyB0byB0aGUgYXNwZWN0IHJhdGlvIHByb3ZpZGVkIGJ5DQorICAgICAqICAgICAgICAgICAge0BsaW5rICNzZXRBc3BlY3RSYXRpbyhpbnQpfQ0KKyAgICAgKiBAcGFyYW0gYml0cmF0ZSBUaGUgYml0cmF0ZSBvZiB0aGUgb3V0cHV0IHZpZGVvIGZpbGUuIFRoaXMgaXMgYXBwcm94aW1hdGUNCisgICAgICogICAgICAgICAgICB2YWx1ZSBmb3IgdGhlIG91dHB1dCBtb3ZpZS4gU3VwcG9ydGVkIGJpdHJhdGUgdmFsdWVzIGFyZQ0KKyAgICAgKiAgICAgICAgICAgIGRlc2NyaWJlZCBpbiB0aGUgTWVkaWFQcm9wZXJ0aWVzIGNsYXNzIGZvciBleGFtcGxlOg0KKyAgICAgKiAgICAgICAgICAgIEJJVFJBVEVfMzg0Sw0KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZvciBwcm9ncmVzcyBub3RpZmljYXRpb25zLiBVc2UgbnVsbCBpZg0KKyAgICAgKiAgICAgICAgICAgIGV4cG9ydCBwcm9ncmVzcyBub3RpZmljYXRpb25zIGFyZSBub3QgbmVlZGVkLg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBoZWlnaHQgb3IgYml0cmF0ZSBhcmUgbm90IHN1cHBvcnRlZC4NCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBvdXRwdXQgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzIG9yDQorICAgICAqICAgICAgICAgICAgIGlmIG5vIE1lZGlhSXRlbSBoYXMgYmVlbiBhZGRlZA0KKyAgICAgKiBAdGhyb3dzIENhbmNlbGxhdGlvbkV4Y2VwdGlvbiBpZiBleHBvcnQgaXMgY2FuY2VsZWQgYnkgY2FsbGluZw0KKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI2NhbmNlbEV4cG9ydCgpfQ0KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBtdWx0aXBsZSBzaW11bHRhbmVvdXMgZXhwb3J0KCkNCisgICAgICogIGFyZSBub3QgYWxsb3dlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZXhwb3J0KFN0cmluZyBmaWxlbmFtZSwgaW50IGhlaWdodCwgaW50IGJpdHJhdGUsIEV4cG9ydFByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpDQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQ2FuY2VsIHRoZSBydW5uaW5nIGV4cG9ydCBvcGVyYXRpb24uIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCB0aGUNCisgICAgICogZXhwb3J0IGlzIGNhbmNlbGVkIGFuZCB0aGUgZXhwb3J0ZWQgZmlsZSAoaWYgYW55KSBpcyBkZWxldGVkLiBJZiB0aGUNCisgICAgICogZXhwb3J0IGNvbXBsZXRlZCBieSB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCB0aGUgZXhwb3J0IGZpbGUNCisgICAgICogd2lsbCBiZSBkZWxldGVkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGVuYW1lIHdoaWNoIGlkZW50aWZpZXMgdGhlIGV4cG9ydCBvcGVyYXRpb24gdG8gYmUNCisgICAgICogICAgICAgICAgICBjYW5jZWxlZC4NCisgICAgICoqLw0KKyAgICBwdWJsaWMgdm9pZCBjYW5jZWxFeHBvcnQoU3RyaW5nIGZpbGVuYW1lKTsNCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhIG1lZGlhIGl0ZW0gYXQgdGhlIGVuZCBvZiB0aGUgc3Rvcnlib2FyZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbSBUaGUgbWVkaWEgaXRlbSBvYmplY3QgdG8gYWRkDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgaW4gcHJvZ3Jlc3Mgb3INCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG1lZGlhIGl0ZW0gaWQgaXMgbm90IHVuaXF1ZSBhY3Jvc3MgYWxsIHRoZSBtZWRpYSBpdGVtcw0KKyAgICAgKiAgICAgICAgICAgICBhZGRlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGFkZE1lZGlhSXRlbShNZWRpYUl0ZW0gbWVkaWFJdGVtKTsNCisNCisgICAgLyoqDQorICAgICAqIEluc2VydCBhIG1lZGlhIGl0ZW0gYWZ0ZXIgdGhlIG1lZGlhIGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIGlkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtIFRoZSBtZWRpYSBpdGVtIG9iamVjdCB0byBpbnNlcnQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtSWQgSW5zZXJ0IHRoZSBtZWRpYUl0ZW0gYWZ0ZXIgdGhlIG1lZGlhIGl0ZW0NCisgICAgICogICAgICAgICAgICBpZGVudGlmaWVkIGJ5IHRoaXMgaWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG51bGwsIHRoZSBtZWRpYQ0KKyAgICAgKiAgICAgICAgICAgIGl0ZW0gaXMgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGltZWxpbmUuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgaW4gcHJvZ3Jlc3MNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWVkaWEgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQgZG9lcw0KKyAgICAgKiAgICAgICAgICAgICBub3QgZXhpc3QgKG51bGwgaXMgYSB2YWxpZCB2YWx1ZSkgb3IgaWYgdGhlIG1lZGlhIGl0ZW0gaWQgaXMNCisgICAgICogICAgICAgICAgICAgbm90IHVuaXF1ZSBhY3Jvc3MgYWxsIHRoZSBtZWRpYSBpdGVtcyBhZGRlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGluc2VydE1lZGlhSXRlbShNZWRpYUl0ZW0gbWVkaWFJdGVtLCBTdHJpbmcgYWZ0ZXJNZWRpYUl0ZW1JZCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBNb3ZlIGEgbWVkaWEgaXRlbSBhZnRlciB0aGUgbWVkaWEgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuDQorICAgICAqDQorICAgICAqIE5vdGU6IFRoZSBwcm9qZWN0IHRodW1ibmFpbCBpcyByZWdlbmVyYXRlZCBpZiB0aGUgbWVkaWEgaXRlbSBpcyBvcg0KKyAgICAgKiBiZWNvbWVzIHRoZSBmaXJzdCBtZWRpYSBpdGVtIGluIHRoZSBzdG9yeWJvYXJkIHRpbWVsaW5lLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtSWQgVGhlIGlkIG9mIHRoZSBtZWRpYSBpdGVtIHRvIG1vdmUNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtSWQgTW92ZSB0aGUgbWVkaWEgaXRlbSBpZGVudGlmaWVkIGJ5IG1lZGlhSXRlbUlkIGFmdGVyDQorICAgICAqICAgICAgICAgIHRoZSBtZWRpYSBpdGVtIGlkZW50aWZpZWQgYnkgdGhpcyBwYXJhbWV0ZXIuIElmIHRoaXMgcGFyYW1ldGVyDQorICAgICAqICAgICAgICAgIGlzIG51bGwsIHRoZSBtZWRpYSBpdGVtIGlzIG1vdmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlDQorICAgICAqICAgICAgICAgIHRpbWVsaW5lLg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG9uZSBvZiBtZWRpYSBpdGVtIGlkcyBpcyBpbnZhbGlkDQorICAgICAqICAgICAgICAgIChudWxsIGlzIGEgdmFsaWQgdmFsdWUpDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBtb3ZlTWVkaWFJdGVtKFN0cmluZyBtZWRpYUl0ZW1JZCwgU3RyaW5nIGFmdGVyTWVkaWFJdGVtSWQpOw0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlIHRoZSBtZWRpYSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBpZC4gSWYgdGhlcmUgYXJlIHRyYW5zaXRpb25zDQorICAgICAqIGJlZm9yZSBvciBhZnRlciB0aGlzIG1lZGlhIGl0ZW0sIHRoZW4gdGhpcy90aGVzZSB0cmFuc2l0aW9uKHMpIGFyZQ0KKyAgICAgKiByZW1vdmVkIGZyb20gdGhlIHN0b3J5Ym9hcmQuIElmIHRoZSBleHRyYWN0aW9uIG9mIHRoZSBhdWRpbyB3YXZlZm9ybSBpcw0KKyAgICAgKiBpbiBwcm9ncmVzcywgdGhlIGV4dHJhY3Rpb24gaXMgY2FuY2VsZWQgYW5kIHRoZSBmaWxlIGlzIGRlbGV0ZWQuDQorICAgICAqDQorICAgICAqIEVmZmVjdHMgYW5kIG92ZXJsYXlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgaXRlbSB3aWxsIGFsc28gYmUNCisgICAgICogcmVtb3ZlZC4NCisgICAgICoNCisgICAgICogTm90ZTogVGhlIHByb2plY3QgdGh1bWJuYWlsIGlzIHJlZ2VuZXJhdGVkIGlmIHRoZSBtZWRpYSBpdGVtIHdoaWNoDQorICAgICAqIGlzIHJlbW92ZWQgaXMgdGhlIGZpcnN0IG1lZGlhIGl0ZW0gaW4gdGhlIHN0b3J5Ym9hcmQgb3IgaWYgdGhlDQorICAgICAqIG1lZGlhIGl0ZW0gaXMgdGhlIG9ubHkgb25lIGluIHRoZSBzdG9yeWJvYXJkLiBJZiB0aGUNCisgICAgICogbWVkaWEgaXRlbSBpcyB0aGUgb25seSBvbmUgaW4gdGhlIHN0b3J5Ym9hcmQsIHRoZSBwcm9qZWN0IHRodW1ibmFpbA0KKyAgICAgKiB3aWxsIGJlIHNldCB0byBhIGJsYWNrIGZyYW1lIGFuZCB0aGUgYXNwZWN0IHJhdGlvIHdpbGwgcmV2ZXJ0IHRvIHRoZQ0KKyAgICAgKiBkZWZhdWx0IGFzcGVjdCByYXRpbywgYW5kIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8NCisgICAgICogcmVtb3ZlQWxsTWVkaWFJdGVtcygpIGluIHRoaXMgY2FzZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIG1lZGlhIGl0ZW0gdG8gYmUgcmVtb3ZlZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBpdGVtIHRoYXQgd2FzIHJlbW92ZWQNCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtZWRpYSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBpZA0KKyAgICAgKiAgICAgICAgICBkb2VzIG5vdCBleGlzdA0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSXRlbSByZW1vdmVNZWRpYUl0ZW0oU3RyaW5nIG1lZGlhSXRlbUlkKTsNCisNCisgICAgLyoqDQorICAgICAqIFJlbW92ZSBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHN0b3J5Ym9hcmQuIEFsbCBlZmZlY3RzLCBvdmVybGF5cyBhbmQgYWxsDQorICAgICAqIHRyYW5zaXRpb25zIGFyZSBhbHNvIHJlbW92ZWQuDQorICAgICAqDQorICAgICAqIE5vdGU6IFRoZSBwcm9qZWN0IHRodW1ibmFpbCB3aWxsIGJlIHNldCB0byBhIGJsYWNrIGZyYW1lIGFuZCB0aGUgYXNwZWN0DQorICAgICAqIHJhdGlvIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0IGFzcGVjdCByYXRpby4NCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVkaWFJdGVtcygpOw0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSBsaXN0IG9mIG1lZGlhIGl0ZW1zIGluIHRoZSBvcmRlciBpbiB3aGljaCBpdCB0aGV5IGFwcGVhciBpbiB0aGUNCisgICAgICogc3Rvcnlib2FyZCB0aW1lbGluZS4NCisgICAgICoNCisgICAgICogTm90ZSB0aGF0IGlmIGFueSBtZWRpYSBpdGVtIHNvdXJjZSBmaWxlcyBhcmUgbm8gbG9uZ2VyDQorICAgICAqIGFjY2Vzc2libGUsIHRoaXMgbWV0aG9kIHdpbGwgc3RpbGwgcHJvdmlkZSB0aGUgZnVsbCBsaXN0IG9mIG1lZGlhIGl0ZW1zLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG1lZGlhIGl0ZW1zLiBJZiBubyBtZWRpYSBpdGVtIGV4aXN0IGFuIGVtcHR5IGxpc3QNCisgICAgICogICAgICAgICAgd2lsbCBiZSByZXR1cm5lZC4NCisgICAgICovDQorICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbT4gZ2V0QWxsTWVkaWFJdGVtcygpOw0KKw0KKyAgICAvKioNCisgICAgICogRmluZCB0aGUgbWVkaWEgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQNCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbUlkIFRoZSBtZWRpYSBpdGVtIGlkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIGlkIChudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSXRlbSBnZXRNZWRpYUl0ZW0oU3RyaW5nIG1lZGlhSXRlbUlkKTsNCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhIHRyYW5zaXRpb24gYmV0d2VlbiB0aGUgbWVkaWEgaXRlbXMgc3BlY2lmaWVkIGJ5IHRoZSB0cmFuc2l0aW9uLg0KKyAgICAgKiBJZiBhIHRyYW5zaXRpb24gZXhpc3RlZCBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpdCBpcyBpbnZhbGlkYXRlZCBhbmQgdGhlbg0KKyAgICAgKiB0aGUgdHJhbnNpdGlvbiBpcyByZXBsYWNlZC4gTm90ZSB0aGF0IHRoZSBuZXcgdHJhbnNpdGlvbiB2aWRlbyBjbGlwIGlzDQorICAgICAqIG5vdCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGlzIG1ldGhvZC4gVGhlDQorICAgICAqIHtAbGluayBUcmFuc2l0aW9uI2dlbmVyYXRlKCl9IG1ldGhvZCBtdXN0IGJlIGludm9rZWQgdG8gZ2VuZXJhdGUNCisgICAgICogdGhlIHRyYW5zaXRpb24gdmlkZW8gY2xpcC4NCisgICAgICoNCisgICAgICogTm90ZSB0aGF0IHRoZSBUcmFuc2l0aW9uQXRFbmQgYW5kIFRyYW5zaXRpb25BdFN0YXJ0IGFyZSBzcGVjaWFsIGtpbmRzDQorICAgICAqIHRoYXQgY2FuIG5vdCBiZSBhcHBsaWVkIGJldHdlZW4gdHdvIG1lZGlhIGl0ZW1zLg0KKyAgICAgKg0KKyAgICAgKiBBIGNyb3NzZmFkZSBhdWRpbyB0cmFuc2l0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBhcHBsaWVkIHJlZ2FyZGxlc3Mgb2YNCisgICAgICogdGhlIHZpZGVvIHRyYW5zaXRpb24uDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSB0cmFuc2l0aW9uIHRvIGFwcGx5DQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgaW4gcHJvZ3Jlc3MNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHRyYW5zaXRpb24gZHVyYXRpb24gaXMgbGFyZ2VyDQorICAgICAqICAgICAgICAgICAgICB0aGFuIHRoZSBzbWFsbGVzdCBkdXJhdGlvbiBvZiB0aGUgdHdvIG1lZGlhIGl0ZW0gZmlsZXMgb3INCisgICAgICogICAgICAgICAgICAgIGlmIHRoZSB0d28gbWVkaWEgaXRlbXMgc3BlY2lmaWVkIGluIHRoZSB0cmFuc2l0aW9uIGFyZSBub3QNCisgICAgICogICAgICAgICAgICAgIGFkamFjZW50DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBhZGRUcmFuc2l0aW9uKFRyYW5zaXRpb24gdHJhbnNpdGlvbik7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZW1vdmUgdGhlIHRyYW5zaXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGlkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbklkIFRoZSBpZCBvZiB0aGUgdHJhbnNpdGlvbiB0byBiZSByZW1vdmVkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIHRyYW5zaXRpb24gdGhhdCB3YXMgcmVtb3ZlZA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRyYW5zaXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGlkIGRvZXMNCisgICAgICogICAgICAgICAgICAgbm90IGV4aXN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbiByZW1vdmVUcmFuc2l0aW9uKFN0cmluZyB0cmFuc2l0aW9uSWQpOw0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSBsaXN0IG9mIHRyYW5zaXRpb25zDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgdHJhbnNpdGlvbnMuIElmIG5vIHRyYW5zaXRpb25zIGV4aXN0IGFuIGVtcHR5IGxpc3QNCisgICAgICogIHdpbGwgYmUgcmV0dXJuZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgTGlzdDxUcmFuc2l0aW9uPiBnZXRBbGxUcmFuc2l0aW9ucygpOw0KKw0KKyAgICAvKioNCisgICAgICogRmluZCB0aGUgdHJhbnNpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgdHJhbnNpdGlvbiBpZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25JZCBUaGUgdHJhbnNpdGlvbiBpZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbiBnZXRUcmFuc2l0aW9uKFN0cmluZyB0cmFuc2l0aW9uSWQpOw0KKw0KKyAgICAvKioNCisgICAgICogQWRkIHRoZSBzcGVjaWZpZWQgQXVkaW9UcmFjayB0byB0aGUgc3Rvcnlib2FyZC4gTm90ZTogU3BlY2lmaWMNCisgICAgICogaW1wbGVtZW50YXRpb25zIG1heSBzdXBwb3J0IGEgbGltaXRlZCBudW1iZXIgb2YgYXVkaW8gdHJhY2tzIChlLmcuIG9ubHkNCisgICAgICogb25lIGF1ZGlvIHRyYWNrKQ0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYXVkaW9UcmFjayBUaGUgQXVkaW9UcmFjayB0byBhZGQNCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgYQ0KKyAgICAgKiAgICAgICAgICAgICBsaW1pdGVkIG51bWJlciBvZiBhdWRpbyB0cmFja3MuDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1lZGlhIGl0ZW0gaXMgbm90IHVuaXF1ZSBhY3Jvc3MgYWxsDQorICAgICAqICAgICAgICAgICAgIHRoZSBhdWRpbyB0cmFja3MgYWxyZWFkeSBhZGRlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGFkZEF1ZGlvVHJhY2soQXVkaW9UcmFjayBhdWRpb1RyYWNrKTsNCisNCisgICAgLyoqDQorICAgICAqIEluc2VydCBhbiBhdWRpbyB0cmFjayBhZnRlciB0aGUgYXVkaW8gdHJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLiBVc2UNCisgICAgICogYWRkQXVkaW9UcmFjayB0byBhZGQgYW4gYXVkaW8gdHJhY2sgYXQgdGhlIGVuZCBvZiB0aGUgc3Rvcnlib2FyZA0KKyAgICAgKiB0aW1lbGluZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGF1ZGlvVHJhY2sgVGhlIGF1ZGlvIHRyYWNrIG9iamVjdCB0byBpbnNlcnQNCisgICAgICogQHBhcmFtIGFmdGVyQXVkaW9UcmFja0lkIEluc2VydCB0aGUgYXVkaW8gdHJhY2sgYWZ0ZXIgdGhlIGF1ZGlvIHRyYWNrDQorICAgICAqICAgICAgICAgICAgaWRlbnRpZmllZCBieSB0aGlzIHBhcmFtZXRlci4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbnVsbCB0aGUNCisgICAgICogICAgICAgICAgICBhdWRpbyB0cmFjayBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aW1lbGluZS4NCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtZWRpYSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBpZCBkb2VzDQorICAgICAqICAgICAgICAgICAgIG5vdCBleGlzdCAobnVsbCBpcyBhIHZhbGlkIHZhbHVlKS4gaWYgbWVkaWEgaXRlbSBpcyBub3QNCisgICAgICogICAgICAgICAgICAgdW5pcXVlIGFjcm9zcyBhbGwgdGhlIGF1ZGlvIHRyYWNrcyBhbHJlYWR5IGFkZGVkLg0KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBhDQorICAgICAqICAgICAgICAgICAgIGxpbWl0ZWQgbnVtYmVyIG9mIGF1ZGlvIHRyYWNrcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgaW5zZXJ0QXVkaW9UcmFjayhBdWRpb1RyYWNrIGF1ZGlvVHJhY2ssIFN0cmluZyBhZnRlckF1ZGlvVHJhY2tJZCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBNb3ZlIGFuIEF1ZGlvVHJhY2sgYWZ0ZXIgdGhlIEF1ZGlvVHJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYXVkaW9UcmFja0lkIFRoZSBpZCBvZiB0aGUgQXVkaW9UcmFjayB0byBtb3ZlDQorICAgICAqIEBwYXJhbSBhZnRlckF1ZGlvVHJhY2tJZCBNb3ZlIHRoZSBBdWRpb1RyYWNrIGlkZW50aWZpZWQgYnkgYXVkaW9UcmFja0lkDQorICAgICAqICAgICAgICAgICAgYWZ0ZXIgdGhlIEF1ZGlvVHJhY2sgaWRlbnRpZmllZCBieSB0aGlzIHBhcmFtZXRlci4gSWYgdGhpcw0KKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBudWxsIHRoZSBhdWRpbyB0cmFjayBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mDQorICAgICAqICAgICAgICAgICAgdGhlIHRpbWVsaW5lLg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG9uZSBvZiBtZWRpYSBpdGVtIGlkcyBpcyBpbnZhbGlkDQorICAgICAqICAgICAgICAgICAgIChudWxsIGlzIGEgdmFsaWQgdmFsdWUpDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBtb3ZlQXVkaW9UcmFjayhTdHJpbmcgYXVkaW9UcmFja0lkLCBTdHJpbmcgYWZ0ZXJBdWRpb1RyYWNrSWQpOw0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlIHRoZSBhdWRpbyB0cmFjayB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuIElmIHRoZSBleHRyYWN0aW9uIG9mIHRoZQ0KKyAgICAgKiBhdWRpbyB3YXZlZm9ybSBpcyBpbiBwcm9ncmVzcywgdGhlIGV4dHJhY3Rpb24gaXMgY2FuY2VsZWQgYW5kIHRoZSBmaWxlIGlzDQorICAgICAqIGRlbGV0ZWQuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBhdWRpb1RyYWNrSWQgVGhlIGlkIG9mIHRoZSBhdWRpbyB0cmFjayB0byBiZSByZW1vdmVkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGF1ZGlvIHRyYWNrIHRoYXQgd2FzIHJlbW92ZWQNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKi8NCisgICAgcHVibGljIEF1ZGlvVHJhY2sgcmVtb3ZlQXVkaW9UcmFjayhTdHJpbmcgYXVkaW9UcmFja0lkKTsNCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgbGlzdCBvZiBBdWRpb1RyYWNrcyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgc3Rvcnlib2FyZC4NCisgICAgICoNCisgICAgICogTm90ZSB0aGF0IGlmIGFueSBBdWRpb1RyYWNrIHNvdXJjZSBmaWxlcyBhcmUgbm90IGFjY2Vzc2libGUgYW55bW9yZSwNCisgICAgICogdGhpcyBtZXRob2Qgd2lsbCBzdGlsbCBwcm92aWRlIHRoZSBmdWxsIGxpc3Qgb2YgYXVkaW8gdHJhY2tzLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEF1ZGlvVHJhY2tzLiBJZiBubyBhdWRpbyB0cmFja3MgZXhpc3QgYW4gZW1wdHkgbGlzdA0KKyAgICAgKiAgd2lsbCBiZSByZXR1cm5lZC4NCisgICAgICovDQorICAgIHB1YmxpYyBMaXN0PEF1ZGlvVHJhY2s+IGdldEFsbEF1ZGlvVHJhY2tzKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBGaW5kIHRoZSBBdWRpb1RyYWNrIHdpdGggdGhlIHNwZWNpZmllZCBpZA0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYXVkaW9UcmFja0lkIFRoZSBBdWRpb1RyYWNrIGlkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIEF1ZGlvVHJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIChudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIEF1ZGlvVHJhY2sgZ2V0QXVkaW9UcmFjayhTdHJpbmcgYXVkaW9UcmFja0lkKTsNCisNCisgICAgLyoqDQorICAgICAqIFNldCB0aGUgYXNwZWN0IHJhdGlvIHVzZWQgaW4gdGhlIHByZXZpZXcgYW5kIHRoZSBleHBvcnQgbW92aWUuDQorICAgICAqDQorICAgICAqIFRoZSBkZWZhdWx0IGFzcGVjdCByYXRpbyBpcyBBU1BFQ1RSQVRJT18xNl85ICgxNjo5KS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGFzcGVjdFJhdGlvIHRvIGFwcGx5LiBJZiBhc3BlY3RSYXRpbyBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudA0KKyAgICAgKiAgICAgICAgICAgIGFzcGVjdCByYXRpbywgdGhlbiB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucy4gVGhlIHN1cHBvcnRlZA0KKyAgICAgKiAgICAgICAgICAgIGFzcGVjdCByYXRpbyBhcmUgZGVmaW5lZCBpbiB0aGUgTWVkaWFQcm9wZXJ0aWVzIGNsYXNzIGZvcg0KKyAgICAgKiAgICAgICAgICAgIGV4YW1wbGU6IEFTUEVDVFJBVElPXzE2XzkNCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhc3BlY3QgcmF0aW8gaXMgbm90IHN1cHBvcnRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0QXNwZWN0UmF0aW8oaW50IGFzcGVjdFJhdGlvKTsNCisNCisgICAgLyoqDQorICAgICAqIEdldCBjdXJyZW50IGFzcGVjdCByYXRpby4NCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgYXNwZWN0IHJhdGlvIGFzIGRlc2NyaWJlZCBpbiBNZWRpYVByb3BlcnRpZXMNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0QXNwZWN0UmF0aW8oKTsNCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgcHJldmlldyAoYW5kIG91dHB1dCBtb3ZpZSkgZHVyYXRpb24uDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGR1cmF0aW9uIG9mIHRoZSBwcmV2aWV3IChhbmQgb3V0cHV0IG1vdmllKQ0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oKTsNCisNCisgICAgLyoqDQorICAgICAqIFJlbmRlciBhIGZyYW1lIGFjY29yZGluZyB0byB0aGUgcHJldmlldyBhc3BlY3QgcmF0aW8gYW5kIGFjdGl2YXRpbmcgYWxsDQorICAgICAqIHN0b3J5Ym9hcmQgaXRlbXMgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCB0aW1lLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3VyZmFjZUhvbGRlciBTdXJmYWNlSG9sZGVyIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uDQorICAgICAqIEBwYXJhbSB0aW1lTXMgdGltZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmcmFtZSB0byBkaXNwbGF5DQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGFjY3VyYXRlIHRpbWUgc3RhbXAgb2YgdGhlIGZyYW1lIHRoYXQgaXMgcmVuZGVyZWQNCisgICAgICogLg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGFscmVhZHkNCisgICAgICogICAgICAgICAgICAgaW4gcHJvZ3Jlc3MNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGltZSBpcyBuZWdhdGl2ZSBvciBiZXlvbmQgdGhlDQorICAgICAqICAgICAgICAgICAgIHByZXZpZXcgZHVyYXRpb24NCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIHJlbmRlclByZXZpZXdGcmFtZShTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIsIGxvbmcgdGltZU1zKTsNCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIHByb2plY3QgY2hhbmdlcw0KKyAgICAgKiBhbmQgYmVmb3JlIHN0YXJ0UHJldmlldyBpcyBjYWxsZWQuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgYmxvY2sgZm9yDQorICAgICAqIGFuIGV4dGVuc2l2ZSBwZXJpb2Qgb2YgdGltZS4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlUHJldmlldygpOw0KKw0KKyAgICAvKioNCisgICAgICogU3RhcnQgdGhlIHByZXZpZXcgb2YgYWxsIHRoZSBzdG9yeWJvYXJkIGl0ZW1zIGFwcGxpZWQgb24gYWxsIE1lZGlhSXRlbXMNCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgYmxvY2sgKGRvZXMgbm90IHdhaXQgZm9yIHRoZSBwcmV2aWV3IHRvIGNvbXBsZXRlKS4NCisgICAgICogVGhlIFByZXZpZXdQcm9ncmVzc0xpc3RlbmVyIGFsbG93cyB0byB0cmFjayB0aGUgcHJvZ3Jlc3MgYXQgdGhlIHRpbWUNCisgICAgICogaW50ZXJ2YWwgZGV0ZXJtaW5lZCBieSB0aGUgY2FsbGJhY2tBZnRlckZyYW1lQ291bnQgcGFyYW1ldGVyLiBUaGUNCisgICAgICogU3VyZmFjZUhvbGRlciBoYXMgdG8gYmUgY3JlYXRlZCBhbmQgcmVhZHkgZm9yIHVzZSBiZWZvcmUgY2FsbGluZyB0aGlzDQorICAgICAqIG1ldGhvZC4gVGhlIG1ldGhvZCBpcyBhIG5vLW9wIGlmIHRoZXJlIGFyZSBubyBNZWRpYUl0ZW1zIGluIHRoZQ0KKyAgICAgKiBzdG9yeWJvYXJkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3VyZmFjZUhvbGRlciBTdXJmYWNlSG9sZGVyIHdoZXJlIHRoZSBwcmV2aWV3IGlzIHJlbmRlcmVkLg0KKyAgICAgKiBAcGFyYW0gZnJvbU1zIFRoZSB0aW1lIChyZWxhdGl2ZSB0byB0aGUgdGltZWxpbmUpIGF0IHdoaWNoIHRoZSBwcmV2aWV3DQorICAgICAqICAgICAgICAgICAgd2lsbCBzdGFydA0KKyAgICAgKiBAcGFyYW0gdG9NcyBUaGUgdGltZSAocmVsYXRpdmUgdG8gdGhlIHRpbWVsaW5lKSBhdCB3aGljaCB0aGUgcHJldmlldyB3aWxsDQorICAgICAqICAgICAgICAgICAgc3RvcC4gVXNlIC0xIHRvIHBsYXkgdG8gdGhlIGVuZCBvZiB0aGUgdGltZWxpbmUNCisgICAgICogQHBhcmFtIGxvb3AgdHJ1ZSBpZiB0aGUgcHJldmlldyBzaG91bGQgYmUgbG9vcGVkIG9uY2UgaXQgcmVhY2hlcyB0aGUgZW5kDQorICAgICAqIEBwYXJhbSBjYWxsYmFja0FmdGVyRnJhbWVDb3VudCBUaGUgbGlzdGVuZXIgaW50ZXJmYWNlIHNob3VsZCBiZSBpbnZva2VkDQorICAgICAqICAgICAgICAgICAgYWZ0ZXIgdGhlIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkIGJ5IHRoaXMgcGFyYW1ldGVyLg0KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgb2YgdGhlIHByZXZpZXcNCisgICAgICogICAgICAgICAgICBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBmcm9tTXMgaXMgYmV5b25kIHRoZSBwcmV2aWV3IGR1cmF0aW9uDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgYWxyZWFkeSBpbg0KKyAgICAgKiAgICAgICAgICAgICBwcm9ncmVzcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc3RhcnRQcmV2aWV3KFN1cmZhY2VIb2xkZXIgc3VyZmFjZUhvbGRlciwgbG9uZyBmcm9tTXMsIGxvbmcgdG9NcywgYm9vbGVhbiBsb29wLA0KKyAgICAgICAgICAgIGludCBjYWxsYmFja0FmdGVyRnJhbWVDb3VudCwgUHJldmlld1Byb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpOw0KKw0KKyAgICAvKioNCisgICAgICogU3RvcCB0aGUgY3VycmVudCBwcmV2aWV3LiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgb25nb2luZyBwcmV2aWV3IGlzDQorICAgICAqIHN0b3BwZWQuIElnbm9yZWQgaWYgdGhlcmUgaXMgbm8gcHJldmlldyBydW5uaW5nLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhY2N1cmF0ZSBjdXJyZW50IHRpbWUgd2hlbiBzdG9wIGlzIGVmZmVjdGl2ZSBleHByZXNzZWQgaW4NCisgICAgICogICAgICAgICAgbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBzdG9wUHJldmlldygpOw0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVmlkZW9FZGl0b3JGYWN0b3J5LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVmlkZW9FZGl0b3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDFlZWQxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9WaWRlb0VkaXRvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKKworLyoqCisgKiBUaGUgVmlkZW9FZGl0b3JGYWN0b3J5IGNsYXNzIG11c3QgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBWaWRlb0VkaXRvciBvYmplY3RzCisgKiBieSBjcmVhdGluZyBhIG5ldyBwcm9qZWN0IHtAbGluayAjY3JlYXRlKFN0cmluZyl9IG9yIGJ5IGxvYWRpbmcgYW4KKyAqIGV4aXN0aW5nIHByb2plY3Qge0BsaW5rICNsb2FkKFN0cmluZyl9LgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgVmlkZW9FZGl0b3JGYWN0b3J5IHsKKyAgICAvLyBWaWRlb0VkaXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTU19JTVBMRU1FTlRBVElPTgorICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvci5WaWRlb0VkaXRvclRlc3RJbXBsIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMQVNTX0lNUExFTUVOVEFUSU9OCisgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yLlZpZGVvRWRpdG9ySW1wbCI7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgVmlkZW9FZGl0b3IgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdFBhdGggVGhlIHBhdGggd2hlcmUgYWxsIFZpZGVvRWRpdG9yIGludGVybmFsCisgICAgICogICAgICAgICAgICBmaWxlcyBhcmUgc3RvcmVkLiBXaGVuIGEgcHJvamVjdCBpcyBkZWxldGVkIHRoZSBhcHBsaWNhdGlvbiBpcworICAgICAqICAgICAgICAgICAgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBwYXRoIGFuZCBpdHMgY29udGVudHMuCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVmlkZW9FZGl0b3IgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgcGF0aCBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgcGF0aCBjYW4KKyAgICAgKiAgICAgICAgICAgICBub3QgYmUgYWNjZXNzZWQgaW4gcmVhZC93cml0ZSBtb2RlCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aW91cyBWaWRlb0VkaXRvciBpbnN0YW5jZSBoYXMgbm90CisgICAgICogICAgICAgICAgICAgYmVlbiByZWxlYXNlZAorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLAorICAgICAqICAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCisgICAgICogICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgY2Fubm90CisgICAgICogICAgICAgICAgICAgYmUgaW5zdGFudGlhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVmlkZW9FZGl0b3IgY3JlYXRlKFN0cmluZyBwcm9qZWN0UGF0aCwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIElmIHRoZSBwcm9qZWN0IHBhdGggZG9lcyBub3QgZXhpc3QgY3JlYXRlIGl0CisgICAgICAgIGZpbmFsIEZpbGUgZGlyID0gbmV3IEZpbGUocHJvamVjdFBhdGgpOworICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgaWYgKCFkaXIubWtkaXJzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIHByb2plY3QgcGF0aDogIiArIHByb2plY3RQYXRoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWxlIHdoaWNoIGhpZGVzIHRoZSBtZWRpYSBmaWxlcworICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIG1lZGlhIHNjYW5uZXIKKyAgICAgICAgICAgICAgICBpZiAoIW5ldyBGaWxlKGRpciwgIi5ub21lZGlhIikuY3JlYXRlTmV3RmlsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgZmlsZSAubm9tZWRpYSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENsYXNzPD8+IGNscyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcGFydHlwZXNbXSA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgcGFydHlwZXNbMF0gPSBTdHJpbmcuY2xhc3M7CisgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+IGN0ID0gY2xzLmdldENvbnN0cnVjdG9yKHBhcnR5cGVzKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGFyZ2xpc3RbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgIGFyZ2xpc3RbMF0gPSBwcm9qZWN0UGF0aDsKKworICAgICAgICByZXR1cm4gKFZpZGVvRWRpdG9yKWN0Lm5ld0luc3RhbmNlKGFyZ2xpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgbWV0aG9kIGZvciBpbnN0YW50aWF0aW5nIGEgVmlkZW9FZGl0b3IgZnJvbSB0aGUKKyAgICAgKiBpbnRlcm5hbCBzdGF0ZSBwcmV2aW91c2x5IHNhdmVkIHdpdGggdGhlCisgICAgICoge0BsaW5rIFZpZGVvRWRpdG9yI3NhdmUoU3RyaW5nKX0gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3RQYXRoIFRoZSBwYXRoIHdoZXJlIGFsbCBWaWRlb0VkaXRvciBpbnRlcm5hbCBmaWxlcworICAgICAqICAgICAgICAgICAgYXJlIHN0b3JlZC4gV2hlbiBhIHByb2plY3QgaXMgZGVsZXRlZCB0aGUgYXBwbGljYXRpb24gaXMKKyAgICAgKiAgICAgICAgICAgIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcGF0aCBhbmQgaXRzIGNvbnRlbnRzLgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUKKyAgICAgKiBAcGFyYW0gZ2VuZXJhdGVQcmV2aWV3IGlmIHNldCB0byB0cnVlIHRoZQorICAgICAqICAgICAge0BsaW5rIE1lZGlhRWRpdG9yI2dlbmVyYXRlUHJldmlldygpfSB3aWxsIGJlIGNhbGxlZCBpbnRlcm5hbGx5IHRvCisgICAgICogICAgICBnZW5lcmF0ZSBhbnkgbmVlZGVkIHRyYW5zaXRpb25zLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVmlkZW9FZGl0b3IgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgcGF0aCBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgcGF0aCBjYW4KKyAgICAgKiAgICAgICAgICAgICBub3QgYmUgYWNjZXNzZWQgaW4gcmVhZC93cml0ZSBtb2RlIG9yIGlmIG9uZSBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgICBtZWRpYSBmaWxlcyBjYW5ub3QgYmUgcmV0cmlldmVkCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aW91cyBWaWRlb0VkaXRvciBpbnN0YW5jZSBoYXMgbm90CisgICAgICogICAgICAgICAgICAgYmVlbiByZWxlYXNlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVmlkZW9FZGl0b3IgbG9hZChTdHJpbmcgcHJvamVjdFBhdGgsIFN0cmluZyBjbGFzc05hbWUsIGJvb2xlYW4gZ2VuZXJhdGVQcmV2aWV3KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgICBmaW5hbCBDbGFzczw/PiBwYXJ0eXBlc1tdID0gbmV3IENsYXNzWzFdOworICAgICAgICBwYXJ0eXBlc1swXSA9IFN0cmluZy5jbGFzczsKKyAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gY3QgPSBjbHMuZ2V0Q29uc3RydWN0b3IocGFydHlwZXMpOworICAgICAgICBmaW5hbCBPYmplY3QgYXJnbGlzdFtdID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgYXJnbGlzdFswXSA9IHByb2plY3RQYXRoOworCisgICAgICAgIGZpbmFsIFZpZGVvRWRpdG9yIHZpZGVvRWRpdG9yID0gKFZpZGVvRWRpdG9yKWN0Lm5ld0luc3RhbmNlKGFyZ2xpc3QpOworICAgICAgICBpZiAoZ2VuZXJhdGVQcmV2aWV3KSB7CisgICAgICAgICAgICB2aWRlb0VkaXRvci5nZW5lcmF0ZVByZXZpZXcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmlkZW9FZGl0b3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1ZpZGVvRWRpdG9yVGVzdEltcGwuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9WaWRlb0VkaXRvclRlc3RJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjYjgyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9WaWRlb0VkaXRvclRlc3RJbXBsLmphdmEKQEAgLTAsMCArMSwxMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcjsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CisKKy8qKgorICogVGhlIFZpZGVvRWRpdG9yIGltcGxlbWVudGF0aW9uIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIFZpZGVvRWRpdG9yVGVzdEltcGwgaW1wbGVtZW50cyBWaWRlb0VkaXRvciB7CisgICAgLy8gTG9nZ2luZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9FZGl0b3JJbXBsIjsKKworICAgIC8vIFRoZSBwcm9qZWN0IGZpbGVuYW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRklMRU5BTUUgPSAidmlkZW9lZGl0b3IueG1sIjsKKworICAgIC8vIFhNTCB0YWdzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9KRUNUID0gInByb2plY3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTUVESUFfSVRFTVMgPSAibWVkaWFfaXRlbXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTUVESUFfSVRFTSA9ICJtZWRpYV9pdGVtIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RSQU5TSVRJT05TID0gInRyYW5zaXRpb25zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RSQU5TSVRJT04gPSAidHJhbnNpdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PVkVSTEFZUyA9ICJvdmVybGF5cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PVkVSTEFZID0gIm92ZXJsYXkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfT1ZFUkxBWV9VU0VSX0FUVFJJQlVURVMgPSAib3ZlcmxheV91c2VyX2F0dHJpYnV0ZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRUZGRUNUUyA9ICJlZmZlY3RzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0VGRkVDVCA9ICJlZmZlY3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVVESU9fVFJBQ0tTID0gImF1ZGlvX3RyYWNrcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVURJT19UUkFDSyA9ICJhdWRpb190cmFjayI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRklMRU5BTUUgPSAiZmlsZW5hbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FVRElPX1dBVkVGT1JNX0ZJTEVOQU1FID0gIndhdmVmb2VtIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRU5ERVJJTkdfTU9ERSA9ICJyZW5kZXJpbmdfbW9kZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVNQRUNUX1JBVElPID0gImFzcGVjdF9yYXRpbyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9EVVJBVElPTiA9ICJkdXJhdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RBUlRfVElNRSA9ICJzdGFydF90aW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CRUdJTl9USU1FID0gImJlZ2luX3RpbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VORF9USU1FID0gImVuZF90aW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WT0xVTUUgPSAidm9sdW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CRUhBVklPUiA9ICJiZWhhdmlvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQkxFTkRJTkcgPSAiYmxlbmRpbmciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lOVkVSVCA9ICJpbnZlcnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01BU0sgPSAibWFzayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQkVGT1JFX01FRElBX0lURU1fSUQgPSAiYmVmb3JlX21lZGlhX2l0ZW0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FGVEVSX01FRElBX0lURU1fSUQgPSAiYWZ0ZXJfbWVkaWFfaXRlbSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09MT1JfRUZGRUNUX1RZUEUgPSAiY29sb3JfdHlwZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09MT1JfRUZGRUNUX1ZBTFVFID0gImNvbG9yX3ZhbHVlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFSVF9SRUNUX0wgPSAic3RhcnRfbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RBUlRfUkVDVF9UID0gInN0YXJ0X3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NUQVJUX1JFQ1RfUiA9ICJzdGFydF9yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFSVF9SRUNUX0IgPSAic3RhcnRfYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1JFQ1RfTCA9ICJlbmRfbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1JFQ1RfVCA9ICJlbmRfdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1JFQ1RfUiA9ICJlbmRfciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1JFQ1RfQiA9ICJlbmRfYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTE9PUCA9ICJsb29wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NVVRFRCA9ICJtdXRlZCI7CisKKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKyAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uTXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVByb2plY3RQYXRoOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxNZWRpYUl0ZW0+IG1NZWRpYUl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZWRpYUl0ZW0+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEF1ZGlvVHJhY2s+IG1BdWRpb1RyYWNrcyA9IG5ldyBBcnJheUxpc3Q8QXVkaW9UcmFjaz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8VHJhbnNpdGlvbj4gbVRyYW5zaXRpb25zID0gbmV3IEFycmF5TGlzdDxUcmFuc2l0aW9uPigpOworICAgIHByaXZhdGUgUHJldmlld1RocmVhZCBtUHJldmlld1RocmVhZDsKKyAgICBwcml2YXRlIGludCBtQXNwZWN0UmF0aW87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJldmlldyB0aHJlYWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFByZXZpZXdUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBGUkFNRV9EVVJBVElPTiA9IDMzOworCisgICAgICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcworICAgICAgICBwcml2YXRlIGZpbmFsIFByZXZpZXdQcm9ncmVzc0xpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50OworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbUZyb21NcywgbVRvTXM7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUnVuLCBtTG9vcDsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1Qb3NpdGlvbk1zOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZnJvbU1zIFN0YXJ0IHByZXZpZXcgYXQgdGhpcyBwb3NpdGlvbgorICAgICAgICAgKiBAcGFyYW0gdG9NcyBUaGUgdGltZSAocmVsYXRpdmUgdG8gdGhlIHRpbWVsaW5lKSBhdCB3aGljaCB0aGUgcHJldmlldworICAgICAgICAgKiAgICAgICAgICAgIHdpbGwgc3RvcC4gVXNlIC0xIHRvIHBsYXkgdG8gdGhlIGVuZCBvZiB0aGUgdGltZWxpbmUKKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50IFRoZSBsaXN0ZW5lciBpbnRlcmZhY2Ugc2hvdWxkIGJlCisgICAgICAgICAqICAgICAgICAgICAgaW52b2tlZCBhZnRlciB0aGUgbnVtYmVyIG9mIGZyYW1lcyBzcGVjaWZpZWQgYnkgdGhpcworICAgICAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlci4KKyAgICAgICAgICogQHBhcmFtIGxvb3AgdHJ1ZSBpZiB0aGUgcHJldmlldyBzaG91bGQgYmUgbG9vcGVkIG9uY2UgaXQgcmVhY2hlcyB0aGUKKyAgICAgICAgICogICAgICAgICAgICBlbmQKKyAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByZXZpZXdUaHJlYWQobG9uZyBmcm9tTXMsIGxvbmcgdG9NcywgYm9vbGVhbiBsb29wLCBpbnQgY2FsbGJhY2tBZnRlckZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgUHJldmlld1Byb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1Qb3NpdGlvbk1zID0gbUZyb21NcyA9IGZyb21NczsKKyAgICAgICAgICAgIGlmICh0b01zIDwgMCkgeworICAgICAgICAgICAgICAgIG1Ub01zID0gbUR1cmF0aW9uTXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Ub01zID0gdG9NczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Mb29wID0gbG9vcDsKKyAgICAgICAgICAgIG1DYWxsYmFja0FmdGVyRnJhbWVDb3VudCA9IGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50OworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBtUnVuID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiPT09PiBQcmV2aWV3VGhyZWFkLnJ1biBlbnRlciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgd2hpbGUgKG1SdW4pIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcChGUkFNRV9EVVJBVElPTik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQrKzsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb25NcyArPSBGUkFNRV9EVVJBVElPTjsKKworICAgICAgICAgICAgICAgIGlmIChtUG9zaXRpb25NcyA+PSBtVG9NcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1Mb29wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25Qcm9ncmVzcyhWaWRlb0VkaXRvclRlc3RJbXBsLnRoaXMsIG1Qb3NpdGlvbk1zLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcmV2aWV3VGhyZWFkLnJ1biBwbGF5YmFjayBjb21wbGV0ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJlIGEgbm90aWZpY2F0aW9uIGZvciB0aGUgZW5kIG9mIHRoZSBjbGlwCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25Qcm9ncmVzcyhWaWRlb0VkaXRvclRlc3RJbXBsLnRoaXMsIG1Ub01zLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJld2luZAorICAgICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBtRnJvbU1zOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uUHJvZ3Jlc3MoVmlkZW9FZGl0b3JUZXN0SW1wbC50aGlzLCBtUG9zaXRpb25NcywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByZXZpZXdUaHJlYWQucnVuIHBsYXliYWNrIGNvbXBsZXRlIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZUNvdW50ID09IG1DYWxsYmFja0FmdGVyRnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uUHJvZ3Jlc3MoVmlkZW9FZGl0b3JUZXN0SW1wbC50aGlzLCBtUG9zaXRpb25NcywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICI9PT0+IFByZXZpZXdUaHJlYWQucnVuIGV4aXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9wIHRoZSBwcmV2aWV3CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHN0b3AgcG9zaXRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIHN0b3BQcmV2aWV3KCkgeworICAgICAgICAgICAgbVJ1biA9IGZhbHNlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqb2luKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1Qb3NpdGlvbk1zOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdFBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgVmlkZW9FZGl0b3JUZXN0SW1wbChTdHJpbmcgcHJvamVjdFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1Qcm9qZWN0UGF0aCA9IHByb2plY3RQYXRoOworICAgICAgICBmaW5hbCBGaWxlIHByb2plY3RYbWwgPSBuZXcgRmlsZShwcm9qZWN0UGF0aCwgUFJPSkVDVF9GSUxFTkFNRSk7CisgICAgICAgIGlmIChwcm9qZWN0WG1sLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvYWQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXNwZWN0UmF0aW8gPSBNZWRpYVByb3BlcnRpZXMuQVNQRUNUX1JBVElPXzE2Xzk7CisgICAgICAgICAgICBtRHVyYXRpb25NcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiBtUHJvamVjdFBhdGg7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZE1lZGlhSXRlbShNZWRpYUl0ZW0gbWVkaWFJdGVtKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU1lZGlhSXRlbXMuY29udGFpbnMobWVkaWFJdGVtKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWVkaWEgaXRlbSBhbHJlYWR5IGV4aXN0czogIiArIG1lZGlhSXRlbS5nZXRJZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIGVuZCB0cmFuc2l0aW9uIGlmIG5lY2Vzc2FyeQorICAgICAgICBmaW5hbCBpbnQgbWVkaWFJdGVtc0NvdW50ID0gbU1lZGlhSXRlbXMuc2l6ZSgpOworICAgICAgICBpZiAoIG1lZGlhSXRlbXNDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25BZnRlcihtZWRpYUl0ZW1zQ291bnQgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCB0aGUgbmV3IG1lZGlhIGl0ZW0KKyAgICAgICAgbU1lZGlhSXRlbXMuYWRkKG1lZGlhSXRlbSk7CisKKyAgICAgICAgY29tcHV0ZVRpbWVsaW5lRHVyYXRpb24oKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5zZXJ0TWVkaWFJdGVtKE1lZGlhSXRlbSBtZWRpYUl0ZW0sIFN0cmluZyBhZnRlck1lZGlhSXRlbUlkKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU1lZGlhSXRlbXMuY29udGFpbnMobWVkaWFJdGVtKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWVkaWEgaXRlbSBhbHJlYWR5IGV4aXN0czogIiArIG1lZGlhSXRlbS5nZXRJZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZnRlck1lZGlhSXRlbUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTWVkaWFJdGVtcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgdHJhbnNpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aW1lbGluZQorICAgICAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25CZWZvcmUoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWVkaWFJdGVtcy5hZGQoMCwgbWVkaWFJdGVtKTsKKyAgICAgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWVkaWFJdGVtQ291bnQgPSBtTWVkaWFJdGVtcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lZGlhSXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0gbWkgPSBtTWVkaWFJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKG1pLmdldElkKCkuZXF1YWxzKGFmdGVyTWVkaWFJdGVtSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIHRyYW5zaXRpb24gYXQgdGhpcyBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQWZ0ZXIoaSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IG1lZGlhIGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgbU1lZGlhSXRlbXMuYWRkKGkgKyAxLCBtZWRpYUl0ZW0pOworICAgICAgICAgICAgICAgICAgICBjb21wdXRlVGltZWxpbmVEdXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWVkaWFJdGVtIG5vdCBmb3VuZDogIiArIGFmdGVyTWVkaWFJdGVtSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vdmVNZWRpYUl0ZW0oU3RyaW5nIG1lZGlhSXRlbUlkLCBTdHJpbmcgYWZ0ZXJNZWRpYUl0ZW1JZCkgeworICAgICAgICBpZiAobVByZXZpZXdUaHJlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJldmlld2luZyBpcyBpbiBwcm9ncmVzcyIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIG1vdmVNZWRpYUl0ZW0gPSByZW1vdmVNZWRpYUl0ZW0obWVkaWFJdGVtSWQpOworICAgICAgICBpZiAobW92ZU1lZGlhSXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXJnZXQgTWVkaWFJdGVtIG5vdCBmb3VuZDogIiArIG1lZGlhSXRlbUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZnRlck1lZGlhSXRlbUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTWVkaWFJdGVtcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBhZGphY2VudCB0cmFuc2l0aW9ucyBhdCB0aGUgaW5zZXJ0aW9uIHBvaW50CisgICAgICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkJlZm9yZSgwKTsKKworICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbWVkaWEgaXRlbSBhdCB0aGUgbmV3IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgbU1lZGlhSXRlbXMuYWRkKDAsIG1vdmVNZWRpYUl0ZW0pOworICAgICAgICAgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBtb3ZlIG1lZGlhIGl0ZW0gKGl0IGlzIHRoZSBvbmx5IGl0ZW0pIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWVkaWFJdGVtQ291bnQgPSBtTWVkaWFJdGVtcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lZGlhSXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0gbWkgPSBtTWVkaWFJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKG1pLmdldElkKCkuZXF1YWxzKGFmdGVyTWVkaWFJdGVtSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWRhdGUgYWRqYWNlbnQgdHJhbnNpdGlvbnMgYXQgdGhlIGluc2VydGlvbiBwb2ludAorICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQWZ0ZXIoaSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbWVkaWEgaXRlbSBhdCB0aGUgbmV3IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIG1NZWRpYUl0ZW1zLmFkZChpICsgMSwgbW92ZU1lZGlhSXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1lZGlhSXRlbSBub3QgZm91bmQ6ICIgKyBhZnRlck1lZGlhSXRlbUlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVkaWFJdGVtIHJlbW92ZU1lZGlhSXRlbShTdHJpbmcgbWVkaWFJdGVtSWQpIHsKKyAgICAgICAgaWYgKG1QcmV2aWV3VGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByZXZpZXdpbmcgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1lZGlhSXRlbSBtZWRpYUl0ZW0gPSBnZXRNZWRpYUl0ZW0obWVkaWFJdGVtSWQpOworICAgICAgICBpZiAobWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbWVkaWEgaXRlbQorICAgICAgICAgICAgbU1lZGlhSXRlbXMucmVtb3ZlKG1lZGlhSXRlbSk7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFkamFjZW50IHRyYW5zaXRpb25zCisgICAgICAgICAgICByZW1vdmVBZGphY2VudFRyYW5zaXRpb25zKG1lZGlhSXRlbSk7CisgICAgICAgICAgICBjb21wdXRlVGltZWxpbmVEdXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1lZGlhSXRlbTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE1lZGlhSXRlbSBnZXRNZWRpYUl0ZW0oU3RyaW5nIG1lZGlhSXRlbUlkKSB7CisgICAgICAgIGZvciAoTWVkaWFJdGVtIG1lZGlhSXRlbSA6IG1NZWRpYUl0ZW1zKSB7CisgICAgICAgICAgICBpZiAobWVkaWFJdGVtLmdldElkKCkuZXF1YWxzKG1lZGlhSXRlbUlkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZWRpYUl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8TWVkaWFJdGVtPiBnZXRBbGxNZWRpYUl0ZW1zKCkgeworICAgICAgICByZXR1cm4gbU1lZGlhSXRlbXM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFsbE1lZGlhSXRlbXMoKSB7CisgICAgICAgIG1NZWRpYUl0ZW1zLmNsZWFyKCk7CisKKyAgICAgICAgLy8gSW52YWxpZGF0ZSBhbGwgdHJhbnNpdGlvbnMKKyAgICAgICAgZm9yIChUcmFuc2l0aW9uIHRyYW5zaXRpb24gOiBtVHJhbnNpdGlvbnMpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb24uaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgICAgIG1UcmFuc2l0aW9ucy5jbGVhcigpOworCisgICAgICAgIG1EdXJhdGlvbk1zID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkVHJhbnNpdGlvbihUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKKyAgICAgICAgbVRyYW5zaXRpb25zLmFkZCh0cmFuc2l0aW9uKTsKKworICAgICAgICBmaW5hbCBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtID0gdHJhbnNpdGlvbi5nZXRCZWZvcmVNZWRpYUl0ZW0oKTsKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIGFmdGVyTWVkaWFJdGVtID0gdHJhbnNpdGlvbi5nZXRBZnRlck1lZGlhSXRlbSgpOworCisgICAgICAgIC8vIENyb3NzIHJlZmVyZW5jZSB0aGUgdHJhbnNpdGlvbnMKKyAgICAgICAgaWYgKGFmdGVyTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIElmIGEgdHJhbnNpdGlvbiBhbHJlYWR5IGV4aXN0cyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRoZW4KKyAgICAgICAgICAgIC8vIGludmFsaWRhdGUgaXQuCisgICAgICAgICAgICBpZiAoYWZ0ZXJNZWRpYUl0ZW0uZ2V0RW5kVHJhbnNpdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZnRlck1lZGlhSXRlbS5nZXRFbmRUcmFuc2l0aW9uKCkuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWZ0ZXJNZWRpYUl0ZW0uc2V0RW5kVHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiZWZvcmVNZWRpYUl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgYSB0cmFuc2l0aW9uIGFscmVhZHkgZXhpc3RzIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdGhlbgorICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSBpdC4KKyAgICAgICAgICAgIGlmIChiZWZvcmVNZWRpYUl0ZW0uZ2V0QmVnaW5UcmFuc2l0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJlZm9yZU1lZGlhSXRlbS5nZXRCZWdpblRyYW5zaXRpb24oKS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiZWZvcmVNZWRpYUl0ZW0uc2V0QmVnaW5UcmFuc2l0aW9uKHRyYW5zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgY29tcHV0ZVRpbWVsaW5lRHVyYXRpb24oKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFRyYW5zaXRpb24gcmVtb3ZlVHJhbnNpdGlvbihTdHJpbmcgdHJhbnNpdGlvbklkKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBUcmFuc2l0aW9uIHRyYW5zaXRpb24gPSBnZXRUcmFuc2l0aW9uKHRyYW5zaXRpb25JZCk7CisgICAgICAgIGlmICh0cmFuc2l0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRyYW5zaXRpb24gbm90IGZvdW5kOiAiICsgdHJhbnNpdGlvbklkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhbnNpdGlvbiByZWZlcmVuY2VzCisgICAgICAgIGZpbmFsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbSA9IHRyYW5zaXRpb24uZ2V0QWZ0ZXJNZWRpYUl0ZW0oKTsKKyAgICAgICAgaWYgKGFmdGVyTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFmdGVyTWVkaWFJdGVtLnNldEVuZFRyYW5zaXRpb24obnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtID0gdHJhbnNpdGlvbi5nZXRCZWZvcmVNZWRpYUl0ZW0oKTsKKyAgICAgICAgaWYgKGJlZm9yZU1lZGlhSXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBiZWZvcmVNZWRpYUl0ZW0uc2V0QmVnaW5UcmFuc2l0aW9uKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgbVRyYW5zaXRpb25zLnJlbW92ZSh0cmFuc2l0aW9uKTsKKyAgICAgICAgdHJhbnNpdGlvbi5pbnZhbGlkYXRlKCk7CisgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisKKyAgICAgICAgcmV0dXJuIHRyYW5zaXRpb247CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJhbnNpdGlvbj4gZ2V0QWxsVHJhbnNpdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtVHJhbnNpdGlvbnM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFRyYW5zaXRpb24gZ2V0VHJhbnNpdGlvbihTdHJpbmcgdHJhbnNpdGlvbklkKSB7CisgICAgICAgIGZvciAoVHJhbnNpdGlvbiB0cmFuc2l0aW9uIDogbVRyYW5zaXRpb25zKSB7CisgICAgICAgICAgICBpZiAodHJhbnNpdGlvbi5nZXRJZCgpLmVxdWFscyh0cmFuc2l0aW9uSWQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQXVkaW9UcmFjayhBdWRpb1RyYWNrIGF1ZGlvVHJhY2spIHsKKyAgICAgICAgaWYgKG1QcmV2aWV3VGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByZXZpZXdpbmcgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BdWRpb1RyYWNrcy5hZGQoYXVkaW9UcmFjayk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluc2VydEF1ZGlvVHJhY2soQXVkaW9UcmFjayBhdWRpb1RyYWNrLCBTdHJpbmcgYWZ0ZXJBdWRpb1RyYWNrSWQpIHsKKyAgICAgICAgaWYgKG1QcmV2aWV3VGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByZXZpZXdpbmcgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZnRlckF1ZGlvVHJhY2tJZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQXVkaW9UcmFja3MuYWRkKDAsIGF1ZGlvVHJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgaW50IGF1ZGlvVHJhY2tDb3VudCA9IG1BdWRpb1RyYWNrcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1ZGlvVHJhY2tDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQXVkaW9UcmFjayBhdCA9IG1BdWRpb1RyYWNrcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGF0LmdldElkKCkuZXF1YWxzKGFmdGVyQXVkaW9UcmFja0lkKSkgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja3MuYWRkKGkgKyAxLCBhdWRpb1RyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXVkaW9UcmFjayBub3QgZm91bmQ6ICIgKyBhZnRlckF1ZGlvVHJhY2tJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbW92ZUF1ZGlvVHJhY2soU3RyaW5nIGF1ZGlvVHJhY2tJZCwgU3RyaW5nIGFmdGVyQXVkaW9UcmFja0lkKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEF1ZGlvVHJhY2sgcmVtb3ZlQXVkaW9UcmFjayhTdHJpbmcgYXVkaW9UcmFja0lkKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBnZXRBdWRpb1RyYWNrKGF1ZGlvVHJhY2tJZCk7CisgICAgICAgIGlmIChhdWRpb1RyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrcy5yZW1vdmUoYXVkaW9UcmFjayk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYXVkaW9UcmFjazsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgQXVkaW9UcmFjayBnZXRBdWRpb1RyYWNrKFN0cmluZyBhdWRpb1RyYWNrSWQpIHsKKyAgICAgICAgZm9yIChBdWRpb1RyYWNrIGF0IDogbUF1ZGlvVHJhY2tzKSB7CisgICAgICAgICAgICBpZiAoYXQuZ2V0SWQoKS5lcXVhbHMoYXVkaW9UcmFja0lkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEF1ZGlvVHJhY2s+IGdldEFsbEF1ZGlvVHJhY2tzKCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvVHJhY2tzOworICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBYbWwubmV3U2VyaWFsaXplcigpOworICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBzZXJpYWxpemVyLnNldE91dHB1dCh3cml0ZXIpOworICAgICAgICBzZXJpYWxpemVyLnN0YXJ0RG9jdW1lbnQoIlVURi04IiwgdHJ1ZSk7CisgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19QUk9KRUNUKTsKKyAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfQVNQRUNUX1JBVElPLCBJbnRlZ2VyLnRvU3RyaW5nKG1Bc3BlY3RSYXRpbykpOworCisgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19NRURJQV9JVEVNUyk7CisgICAgICAgIGZvciAoTWVkaWFJdGVtIG1lZGlhSXRlbSA6IG1NZWRpYUl0ZW1zKSB7CisgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKCIiLCBUQUdfTUVESUFfSVRFTSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9JRCwgbWVkaWFJdGVtLmdldElkKCkpOworICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfVFlQRSwgbWVkaWFJdGVtLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0ZJTEVOQU1FLCBtZWRpYUl0ZW0uZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9SRU5ERVJJTkdfTU9ERSwgSW50ZWdlci50b1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFJdGVtLmdldFJlbmRlcmluZ01vZGUoKSkpOworICAgICAgICAgICAgaWYgKG1lZGlhSXRlbSBpbnN0YW5jZW9mIE1lZGlhVmlkZW9JdGVtKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFWaWRlb0l0ZW0gbXZpID0gKE1lZGlhVmlkZW9JdGVtKW1lZGlhSXRlbTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyCisgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlKCIiLCBBVFRSX0JFR0lOX1RJTUUsIExvbmcudG9TdHJpbmcobXZpLmdldEJvdW5kYXJ5QmVnaW5UaW1lKCkpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9FTkRfVElNRSwgTG9uZy50b1N0cmluZyhtdmkuZ2V0Qm91bmRhcnlFbmRUaW1lKCkpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9WT0xVTUUsIEludGVnZXIudG9TdHJpbmcobXZpLmdldFZvbHVtZSgpKSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfTVVURUQsIEJvb2xlYW4udG9TdHJpbmcobXZpLmlzTXV0ZWQoKSkpOworICAgICAgICAgICAgICAgIGlmIChtdmkuZ2V0QXVkaW9XYXZlZm9ybUZpbGVuYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9BVURJT19XQVZFRk9STV9GSUxFTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdmkuZ2V0QXVkaW9XYXZlZm9ybUZpbGVuYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFJdGVtIGluc3RhbmNlb2YgTWVkaWFJbWFnZUl0ZW0pIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcobWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBMaXN0PE92ZXJsYXk+IG92ZXJsYXlzID0gbWVkaWFJdGVtLmdldEFsbE92ZXJsYXlzKCk7CisgICAgICAgICAgICBpZiAob3ZlcmxheXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19PVkVSTEFZUyk7CisgICAgICAgICAgICAgICAgZm9yIChPdmVybGF5IG92ZXJsYXkgOiBvdmVybGF5cykgeworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKCIiLCBUQUdfT1ZFUkxBWSk7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0lELCBvdmVybGF5LmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9UWVBFLCBvdmVybGF5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfQkVHSU5fVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG92ZXJsYXkuZ2V0U3RhcnRUaW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRFVSQVRJT04sIExvbmcudG9TdHJpbmcob3ZlcmxheS5nZXREdXJhdGlvbigpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGF5IGluc3RhbmNlb2YgT3ZlcmxheUZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdmVybGF5RnJhbWUgb3ZlcmxheUZyYW1lID0gKE92ZXJsYXlGcmFtZSlvdmVybGF5OworICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZyYW1lLnNhdmUoZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGF5RnJhbWUuZ2V0RmlsZW5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRklMRU5BTUUsIG92ZXJsYXlGcmFtZS5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVzZXIgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKCIiLCBUQUdfT1ZFUkxBWV9VU0VSX0FUVFJJQlVURVMpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJBdHRyaWJ1dGVzID0gb3ZlcmxheS5nZXRVc2VyQXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogdXNlckF0dHJpYnV0ZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IHVzZXJBdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX09WRVJMQVlfVVNFUl9BVFRSSUJVVEVTKTsKKworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX09WRVJMQVkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX09WRVJMQVlTKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTGlzdDxFZmZlY3Q+IGVmZmVjdHMgPSBtZWRpYUl0ZW0uZ2V0QWxsRWZmZWN0cygpOworICAgICAgICAgICAgaWYgKGVmZmVjdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19FRkZFQ1RTKTsKKyAgICAgICAgICAgICAgICBmb3IgKEVmZmVjdCBlZmZlY3QgOiBlZmZlY3RzKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19FRkZFQ1QpOworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9JRCwgZWZmZWN0LmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9UWVBFLCBlZmZlY3QuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9CRUdJTl9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcoZWZmZWN0LmdldFN0YXJ0VGltZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0RVUkFUSU9OLCBMb25nLnRvU3RyaW5nKGVmZmVjdC5nZXREdXJhdGlvbigpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3QgaW5zdGFuY2VvZiBFZmZlY3RDb2xvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRWZmZWN0Q29sb3IgY29sb3JFZmZlY3QgPSAoRWZmZWN0Q29sb3IpZWZmZWN0OworICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfQ09MT1JfRUZGRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoY29sb3JFZmZlY3QuZ2V0VHlwZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JFZmZlY3QuZ2V0VHlwZSgpID09IEVmZmVjdENvbG9yLlRZUEVfQ09MT1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9DT0xPUl9FRkZFQ1RfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbG9yRWZmZWN0LmdldFBhcmFtKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlZmZlY3QgaW5zdGFuY2VvZiBFZmZlY3RLZW5CdXJucykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCBzdGFydFJlY3QgPSAoKEVmZmVjdEtlbkJ1cm5zKWVmZmVjdCkuZ2V0U3RhcnRSZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoc3RhcnRSZWN0LmxlZnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX1NUQVJUX1JFQ1RfVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhzdGFydFJlY3QudG9wKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoc3RhcnRSZWN0LnJpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoc3RhcnRSZWN0LmJvdHRvbSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IGVuZFJlY3QgPSAoKEVmZmVjdEtlbkJ1cm5zKWVmZmVjdCkuZ2V0RW5kUmVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRU5EX1JFQ1RfTCwgSW50ZWdlci50b1N0cmluZyhlbmRSZWN0LmxlZnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0VORF9SRUNUX1QsIEludGVnZXIudG9TdHJpbmcoZW5kUmVjdC50b3ApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0VORF9SRUNUX1IsIEludGVnZXIudG9TdHJpbmcoZW5kUmVjdC5yaWdodCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRU5EX1JFQ1RfQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhlbmRSZWN0LmJvdHRvbSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoIiIsIFRBR19FRkZFQ1QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX0VGRkVDVFMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX01FRElBX0lURU0pOworICAgICAgICB9CisgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKCIiLCBUQUdfTUVESUFfSVRFTVMpOworCisgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19UUkFOU0lUSU9OUyk7CisKKyAgICAgICAgZm9yIChUcmFuc2l0aW9uIHRyYW5zaXRpb24gOiBtVHJhbnNpdGlvbnMpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19UUkFOU0lUSU9OKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0lELCB0cmFuc2l0aW9uLmdldElkKCkpOworICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfVFlQRSwgdHJhbnNpdGlvbi5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9EVVJBVElPTiwgTG9uZy50b1N0cmluZyh0cmFuc2l0aW9uLmdldER1cmF0aW9uKCkpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0JFSEFWSU9SLCBJbnRlZ2VyLnRvU3RyaW5nKHRyYW5zaXRpb24uZ2V0QmVoYXZpb3IoKSkpOworICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtIGFmdGVyTWVkaWFJdGVtID0gdHJhbnNpdGlvbi5nZXRBZnRlck1lZGlhSXRlbSgpOworICAgICAgICAgICAgaWYgKGFmdGVyTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9BRlRFUl9NRURJQV9JVEVNX0lELCBhZnRlck1lZGlhSXRlbS5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtIGJlZm9yZU1lZGlhSXRlbSA9IHRyYW5zaXRpb24uZ2V0QmVmb3JlTWVkaWFJdGVtKCk7CisgICAgICAgICAgICBpZiAoYmVmb3JlTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9CRUZPUkVfTUVESUFfSVRFTV9JRCwgYmVmb3JlTWVkaWFJdGVtLmdldElkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHJhbnNpdGlvbiBpbnN0YW5jZW9mIFRyYW5zaXRpb25TbGlkaW5nKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRElSRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZygoKFRyYW5zaXRpb25TbGlkaW5nKXRyYW5zaXRpb24pLmdldERpcmVjdGlvbigpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBUcmFuc2l0aW9uQWxwaGEpIHsKKyAgICAgICAgICAgICAgICBUcmFuc2l0aW9uQWxwaGEgdGEgPSAoVHJhbnNpdGlvbkFscGhhKXRyYW5zaXRpb247CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfQkxFTkRJTkcsIEludGVnZXIudG9TdHJpbmcodGEuZ2V0QmxlbmRpbmdQZXJjZW50KCkpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9JTlZFUlQsIEJvb2xlYW4udG9TdHJpbmcodGEuaXNJbnZlcnQoKSkpOworICAgICAgICAgICAgICAgIGlmICh0YS5nZXRNYXNrRmlsZW5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX01BU0ssIHRhLmdldE1hc2tGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX1RSQU5TSVRJT04pOworICAgICAgICB9CisgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKCIiLCBUQUdfVFJBTlNJVElPTlMpOworCisgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19BVURJT19UUkFDS1MpOworICAgICAgICBmb3IgKEF1ZGlvVHJhY2sgYXQgOiBtQXVkaW9UcmFja3MpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19BVURJT19UUkFDSyk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9JRCwgYXQuZ2V0SWQoKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9GSUxFTkFNRSwgYXQuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9TVEFSVF9USU1FLCBMb25nLnRvU3RyaW5nKGF0LmdldFN0YXJ0VGltZSgpKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9CRUdJTl9USU1FLCBMb25nLnRvU3RyaW5nKGF0LmdldEJvdW5kYXJ5QmVnaW5UaW1lKCkpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0VORF9USU1FLCBMb25nLnRvU3RyaW5nKGF0LmdldEJvdW5kYXJ5RW5kVGltZSgpKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9WT0xVTUUsIEludGVnZXIudG9TdHJpbmcoYXQuZ2V0Vm9sdW1lKCkpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX01VVEVELCBCb29sZWFuLnRvU3RyaW5nKGF0LmlzTXV0ZWQoKSkpOworICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfTE9PUCwgQm9vbGVhbi50b1N0cmluZyhhdC5pc0xvb3BpbmcoKSkpOworICAgICAgICAgICAgaWYgKGF0LmdldEF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9BVURJT19XQVZFRk9STV9GSUxFTkFNRSwKKyAgICAgICAgICAgICAgICBhdC5nZXRBdWRpb1dhdmVmb3JtRmlsZW5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKCIiLCBUQUdfQVVESU9fVFJBQ0spOworICAgICAgICB9CisgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKCIiLCBUQUdfQVVESU9fVFJBQ0tTKTsKKworICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX1BST0pFQ1QpOworICAgICAgICBzZXJpYWxpemVyLmVuZERvY3VtZW50KCk7CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgbWV0YWRhdGEgWE1MIGZpbGUKKyAgICAgICAgZmluYWwgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShnZXRQYXRoKCksIFBST0pFQ1RfRklMRU5BTUUpKTsKKyAgICAgICAgb3V0LndyaXRlKHdyaXRlci50b1N0cmluZygpLmdldEJ5dGVzKCkpOworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgcHJvamVjdCBmb3JtIFhNTAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShtUHJvamVjdFBhdGgsIFBST0pFQ1RfRklMRU5BTUUpOworICAgICAgICAvLyBMb2FkIHRoZSBtZXRhZGF0YQorICAgICAgICBmaW5hbCBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IFhtbC5uZXdQdWxsUGFyc2VyKCk7CisgICAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCAiVVRGLTgiKTsKKyAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIE1lZGlhSXRlbSBjdXJyZW50TWVkaWFJdGVtID0gbnVsbDsKKyAgICAgICAgT3ZlcmxheSBjdXJyZW50T3ZlcmxheSA9IG51bGw7CisgICAgICAgIHdoaWxlIChldmVudFR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRzogeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19QUk9KRUNULmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFzcGVjdFJhdGlvID0gSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfQVNQRUNUX1JBVElPKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX01FRElBX0lURU0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVkaWFJdGVtSWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfRklMRU5BTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlbmRlcmluZ01vZGUgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9SRU5ERVJJTkdfTU9ERSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWVkaWFJbWFnZUl0ZW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb25NcyA9IExvbmcucGFyc2VMb25nKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfRFVSQVRJT04pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVkaWFJdGVtID0gbmV3IE1lZGlhSW1hZ2VJdGVtKHRoaXMsIG1lZGlhSXRlbUlkLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsIHJlbmRlcmluZ01vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVZpZGVvSXRlbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBiZWdpbk1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9CRUdJTl9USU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBlbmRNcyA9IExvbmcucGFyc2VMb25nKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfRU5EX1RJTUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lID0gSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSX1ZPTFVNRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbXV0ZWQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSX01VVEVEKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfQVVESU9fV0FWRUZPUk1fRklMRU5BTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZWRpYUl0ZW0gPSBuZXcgTWVkaWFWaWRlb0l0ZW0odGhpcywgbWVkaWFJdGVtSWQsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nTW9kZSwgYmVnaW5NcywgZW5kTXMsIHZvbHVtZSwgbXV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1dhdmVmb3JtRmlsZW5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBiZWdpblRpbWVNcyA9IExvbmcucGFyc2VMb25nKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfQkVHSU5fVElNRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZW5kVGltZU1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9FTkRfVElNRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTWVkaWFWaWRlb0l0ZW0pY3VycmVudE1lZGlhSXRlbSkuc2V0RXh0cmFjdEJvdW5kYXJpZXMoYmVnaW5UaW1lTXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lTXMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZVBlcmNlbnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfVk9MVU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNZWRpYVZpZGVvSXRlbSljdXJyZW50TWVkaWFJdGVtKS5zZXRWb2x1bWUodm9sdW1lUGVyY2VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gbWVkaWEgaXRlbSB0eXBlOiAiICsgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lZGlhSXRlbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFJdGVtcy5hZGQoY3VycmVudE1lZGlhSXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1RSQU5TSVRJT04uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmFuc2l0aW9uIHRyYW5zaXRpb24gPSBwYXJzZVRyYW5zaXRpb24ocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbnMuYWRkKHRyYW5zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19PVkVSTEFZLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNZWRpYUl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPdmVybGF5ID0gcGFyc2VPdmVybGF5KHBhcnNlciwgY3VycmVudE1lZGlhSXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPdmVybGF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lZGlhSXRlbS5hZGRPdmVybGF5KGN1cnJlbnRPdmVybGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX09WRVJMQVlfVVNFUl9BVFRSSUJVVEVTLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPdmVybGF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXR0cmlidXRlc0NvdW50ID0gcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3ZlcmxheS5zZXRVc2VyQXR0cmlidXRlKHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19FRkZFQ1QuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE1lZGlhSXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRWZmZWN0IGVmZmVjdCA9IHBhcnNlRWZmZWN0KHBhcnNlciwgY3VycmVudE1lZGlhSXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZWRpYUl0ZW0uYWRkRWZmZWN0KGVmZmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19BVURJT19UUkFDSy5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEF1ZGlvVHJhY2sgYXVkaW9UcmFjayA9IHBhcnNlQXVkaW9UcmFjayhwYXJzZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvVHJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvVHJhY2soYXVkaW9UcmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBYbWxQdWxsUGFyc2VyLkVORF9UQUc6IHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChUQUdfTUVESUFfSVRFTS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZWRpYUl0ZW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19PVkVSTEFZLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE92ZXJsYXkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnRUeXBlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHRyYW5zaXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJzZXIgVGhlIHBhcnNlcgorICAgICAqIEByZXR1cm4gVGhlIHRyYW5zaXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIFRyYW5zaXRpb24gcGFyc2VUcmFuc2l0aW9uKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0cmFuc2l0aW9uSWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfSUQpOworICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9UWVBFKTsKKyAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbk1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0RVUkFUSU9OKSk7CisgICAgICAgIGZpbmFsIGludCBiZWhhdmlvciA9IEludGVnZXIucGFyc2VJbnQocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0JFSEFWSU9SKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGJlZm9yZU1lZGlhSXRlbUlkID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0JFRk9SRV9NRURJQV9JVEVNX0lEKTsKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIGJlZm9yZU1lZGlhSXRlbTsKKyAgICAgICAgaWYgKGJlZm9yZU1lZGlhSXRlbUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJlZm9yZU1lZGlhSXRlbSA9IGdldE1lZGlhSXRlbShiZWZvcmVNZWRpYUl0ZW1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZWZvcmVNZWRpYUl0ZW0gPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGFmdGVyTWVkaWFJdGVtSWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfQUZURVJfTUVESUFfSVRFTV9JRCk7CisgICAgICAgIGZpbmFsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbTsKKyAgICAgICAgaWYgKGFmdGVyTWVkaWFJdGVtSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWZ0ZXJNZWRpYUl0ZW0gPSBnZXRNZWRpYUl0ZW0oYWZ0ZXJNZWRpYUl0ZW1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZnRlck1lZGlhSXRlbSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBUcmFuc2l0aW9uIHRyYW5zaXRpb247CisgICAgICAgIGlmIChUcmFuc2l0aW9uU3RhcnRDdXJ0YWluT3BlbmluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb25TdGFydEN1cnRhaW5PcGVuaW5nKHRyYW5zaXRpb25JZCwgYmVmb3JlTWVkaWFJdGVtLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLCBiZWhhdmlvcik7CisgICAgICAgIH0gZWxzZSBpZiAoVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb25TdGFydEZhZGVGcm9tQmxhY2sodHJhbnNpdGlvbklkLCBiZWZvcmVNZWRpYUl0ZW0sCisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsIGJlaGF2aW9yKTsKKyAgICAgICAgfSBlbHNlIGlmIChUcmFuc2l0aW9uQWxwaGEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgZmluYWwgaW50IGJsZW5kaW5nID0gSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfQkxFTkRJTkcpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXNrRmlsZW5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfTUFTSyk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGludmVydCA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfSU5WRVJUKSk7CisgICAgICAgICAgICB0cmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb25BbHBoYSh0cmFuc2l0aW9uSWQsIGFmdGVyTWVkaWFJdGVtLCBiZWZvcmVNZWRpYUl0ZW0sCisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsIGJlaGF2aW9yLCBtYXNrRmlsZW5hbWUsIGJsZW5kaW5nLCBpbnZlcnQpOworICAgICAgICB9IGVsc2UgaWYgKFRyYW5zaXRpb25Dcm9zc2ZhZGUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uQ3Jvc3NmYWRlKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIGJlZm9yZU1lZGlhSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25NcywgYmVoYXZpb3IpOworICAgICAgICB9IGVsc2UgaWYgKFRyYW5zaXRpb25TbGlkaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBkaXJlY3Rpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9ESVJFQ1RJT04pKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvblNsaWRpbmcodHJhbnNpdGlvbklkLCBhZnRlck1lZGlhSXRlbSwgYmVmb3JlTWVkaWFJdGVtLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLCBiZWhhdmlvciwgZGlyZWN0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChUcmFuc2l0aW9uRmFkZVRvQmxhY2suY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uRmFkZVRvQmxhY2sodHJhbnNpdGlvbklkLCBhZnRlck1lZGlhSXRlbSwgYmVmb3JlTWVkaWFJdGVtLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLCBiZWhhdmlvcik7CisgICAgICAgIH0gZWxzZSBpZiAoVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIGR1cmF0aW9uTXMsCisgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yKTsKKyAgICAgICAgfSBlbHNlIGlmIChUcmFuc2l0aW9uRW5kRmFkZVRvQmxhY2suY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uRW5kRmFkZVRvQmxhY2sodHJhbnNpdGlvbklkLCBhZnRlck1lZGlhSXRlbSwgZHVyYXRpb25NcywKKyAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhbnNpdGlvbiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmVmb3JlTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJlZm9yZU1lZGlhSXRlbS5zZXRCZWdpblRyYW5zaXRpb24odHJhbnNpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWZ0ZXJNZWRpYUl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgYWZ0ZXJNZWRpYUl0ZW0uc2V0RW5kVHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cmFuc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBvdmVybGF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBwYXJzZXIKKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtIFRoZSBtZWRpYSBpdGVtIG93bmVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvdmVybGF5CisgICAgICovCisgICAgcHJpdmF0ZSBPdmVybGF5IHBhcnNlT3ZlcmxheShYbWxQdWxsUGFyc2VyIHBhcnNlciwgTWVkaWFJdGVtIG1lZGlhSXRlbSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgb3ZlcmxheUlkID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0lEKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfVFlQRSk7CisgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb25NcyA9IExvbmcucGFyc2VMb25nKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9EVVJBVElPTikpOworICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZU1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0JFR0lOX1RJTUUpKTsKKworICAgICAgICBmaW5hbCBPdmVybGF5IG92ZXJsYXk7CisgICAgICAgIGlmIChPdmVybGF5RnJhbWUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0ZJTEVOQU1FKTsKKyAgICAgICAgICAgIG92ZXJsYXkgPSBuZXcgT3ZlcmxheUZyYW1lKG1lZGlhSXRlbSwgb3ZlcmxheUlkLCBmaWxlbmFtZSwgc3RhcnRUaW1lTXMsIGR1cmF0aW9uTXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3ZlcmxheSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3ZlcmxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZWZmZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBwYXJzZXIKKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtIFRoZSBtZWRpYSBpdGVtIG93bmVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlZmZlY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIEVmZmVjdCBwYXJzZUVmZmVjdChYbWxQdWxsUGFyc2VyIHBhcnNlciwgTWVkaWFJdGVtIG1lZGlhSXRlbSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZWZmZWN0SWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfSUQpOworICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9UWVBFKTsKKyAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbk1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0RVUkFUSU9OKSk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTXMgPSBMb25nLnBhcnNlTG9uZyhwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfQkVHSU5fVElNRSkpOworCisgICAgICAgIGZpbmFsIEVmZmVjdCBlZmZlY3Q7CisgICAgICAgIGlmIChFZmZlY3RDb2xvci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JFZmZlY3RUeXBlID0KKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9DT0xPUl9FRkZFQ1RfVFlQRSkpOworICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yOworICAgICAgICAgICAgaWYgKGNvbG9yRWZmZWN0VHlwZSA9PSBFZmZlY3RDb2xvci5UWVBFX0NPTE9SKSB7CisgICAgICAgICAgICAgICAgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9DT0xPUl9FRkZFQ1RfVkFMVUUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29sb3IgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0ID0gbmV3IEVmZmVjdENvbG9yKG1lZGlhSXRlbSwgZWZmZWN0SWQsIHN0YXJ0VGltZU1zLCBkdXJhdGlvbk1zLAorICAgICAgICAgICAgICAgICAgICBjb2xvckVmZmVjdFR5cGUsIGNvbG9yKTsKKyAgICAgICAgfSBlbHNlIGlmIChFZmZlY3RLZW5CdXJucy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICBmaW5hbCBSZWN0IHN0YXJ0UmVjdCA9IG5ldyBSZWN0KAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX0wpKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfU1RBUlRfUkVDVF9UKSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX1NUQVJUX1JFQ1RfUikpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX0IpKSk7CisgICAgICAgICAgICBmaW5hbCBSZWN0IGVuZFJlY3QgPSBuZXcgUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfRU5EX1JFQ1RfTCkpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9FTkRfUkVDVF9UKSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0VORF9SRUNUX1IpKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfRU5EX1JFQ1RfQikpKTsKKyAgICAgICAgICAgIGVmZmVjdCA9IG5ldyBFZmZlY3RLZW5CdXJucyhtZWRpYUl0ZW0sIGVmZmVjdElkLCBzdGFydFJlY3QsIGVuZFJlY3QsIHN0YXJ0VGltZU1zLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVmZmVjdCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZWZmZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBhdWRpbyB0cmFjaworICAgICAqCisgICAgICogQHBhcmFtIHBhcnNlciBUaGUgcGFyc2VyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBhdWRpbyB0cmFjaworICAgICAqLworICAgIHByaXZhdGUgQXVkaW9UcmFjayBwYXJzZUF1ZGlvVHJhY2soWG1sUHVsbFBhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGF1ZGlvVHJhY2tJZCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9JRCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWxlbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9GSUxFTkFNRSk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTXMgPSBMb25nLnBhcnNlTG9uZyhwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfU1RBUlRfVElNRSkpOworICAgICAgICBmaW5hbCBsb25nIGJlZ2luTXMgPSBMb25nLnBhcnNlTG9uZyhwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfQkVHSU5fVElNRSkpOworICAgICAgICBmaW5hbCBsb25nIGVuZE1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0VORF9USU1FKSk7CisgICAgICAgIGZpbmFsIGludCB2b2x1bWUgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9WT0xVTUUpKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtdXRlZCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9NVVRFRCkpOworICAgICAgICBmaW5hbCBib29sZWFuIGxvb3AgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfTE9PUCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgd2F2ZWZvcm1GaWxlbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9BVURJT19XQVZFRk9STV9GSUxFTkFNRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjayh0aGlzLCBhdWRpb1RyYWNrSWQsIGZpbGVuYW1lLCBzdGFydFRpbWVNcywKKyAgICAgICAgICAgICAgICAgICAgYmVnaW5NcywgZW5kTXMsIGxvb3AsIHZvbHVtZSwgbXV0ZWQsIHdhdmVmb3JtRmlsZW5hbWUpOworCisgICAgICAgICAgICByZXR1cm4gYXVkaW9UcmFjazsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsRXhwb3J0KFN0cmluZyBmaWxlbmFtZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4cG9ydChTdHJpbmcgZmlsZW5hbWUsIGludCBoZWlnaHQsIGludCBiaXRyYXRlLCBFeHBvcnRQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVByZXZpZXcoKSB7CisgICAgICAgIC8vIEdlbmVyYXRlIGFsbCB0aGUgbmVlZGVkIHRyYW5zaXRpb25zCisgICAgICAgIGZvciAoVHJhbnNpdGlvbiB0cmFuc2l0aW9uIDogbVRyYW5zaXRpb25zKSB7CisgICAgICAgICAgICBpZiAoIXRyYW5zaXRpb24uaXNHZW5lcmF0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyYW5zaXRpb24uZ2VuZXJhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHVzZXIgbWF5IGhhZCBjYWxsZWQgc2V0RHVyYXRpb24gb24KKyAgICAgICAgLy8gTWVkaWFJbWFnZUl0ZW1zCisgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgc3RvcFByZXZpZXcoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgLy8gU2luY2UgTWVkaWFJbWFnZUl0ZW0gY2FuIGNoYW5nZSBkdXJhdGlvbiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlCisgICAgICAgIC8vIGR1cmF0aW9uIGhlcmUKKyAgICAgICAgY29tcHV0ZVRpbWVsaW5lRHVyYXRpb24oKTsKKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbk1zOworICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QXNwZWN0UmF0aW8oKSB7CisgICAgICAgIHJldHVybiBtQXNwZWN0UmF0aW87CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXNwZWN0UmF0aW8oaW50IGFzcGVjdFJhdGlvKSB7CisgICAgICAgIG1Bc3BlY3RSYXRpbyA9IGFzcGVjdFJhdGlvOworICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBsb25nIHJlbmRlclByZXZpZXdGcmFtZShTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIsIGxvbmcgdGltZU1zKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRpbWVNczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnRQcmV2aWV3KFN1cmZhY2VIb2xkZXIgc3VyZmFjZUhvbGRlciwgbG9uZyBmcm9tTXMsIGxvbmcgdG9NcywKKyAgICAgICAgICAgIGJvb2xlYW4gbG9vcCwgaW50IGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50LCBQcmV2aWV3UHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAoZnJvbU1zID49IG1EdXJhdGlvbk1zKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpZXdUaHJlYWQgPSBuZXcgUHJldmlld1RocmVhZChmcm9tTXMsIHRvTXMsIGxvb3AsIGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50LCBsaXN0ZW5lcik7CisgICAgICAgIG1QcmV2aWV3VGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIHN0b3BQcmV2aWV3KCkgeworICAgICAgICBmaW5hbCBsb25nIHN0b3BUaW1lTXM7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdG9wVGltZU1zID0gbVByZXZpZXdUaHJlYWQuc3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIG1QcmV2aWV3VGhyZWFkID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0b3BUaW1lTXMgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdG9wVGltZU1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGUgdGhlIGR1cmF0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCkgeworICAgICAgICBtRHVyYXRpb25NcyA9IDA7CisgICAgICAgIGZvciAoTWVkaWFJdGVtIG1lZGlhSXRlbSA6IG1NZWRpYUl0ZW1zKSB7CisgICAgICAgICAgICBtRHVyYXRpb25NcyArPSBtZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3VidHJhY3QgdGhlIHRyYW5zaXRpb24gdGltZXMKKyAgICAgICAgZm9yIChUcmFuc2l0aW9uIHRyYW5zaXRpb24gOiBtVHJhbnNpdGlvbnMpIHsKKyAgICAgICAgICAgIGlmICghKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBUcmFuc2l0aW9uU3RhcnRDdXJ0YWluT3BlbmluZykKKyAgICAgICAgICAgICAgICAgICAgJiYgISh0cmFuc2l0aW9uIGluc3RhbmNlb2YgVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjaykKKyAgICAgICAgICAgICAgICAgICAgJiYgISh0cmFuc2l0aW9uIGluc3RhbmNlb2YgVHJhbnNpdGlvbkVuZEZhZGVUb0JsYWNrKQorICAgICAgICAgICAgICAgICAgICAmJiAhKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBUcmFuc2l0aW9uRW5kQ3VydGFpbkNsb3NpbmcpKSB7CisgICAgICAgICAgICAgICAgbUR1cmF0aW9uTXMgLT0gdHJhbnNpdGlvbi5nZXREdXJhdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRyYW5zaXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYUl0ZW0gVGhlIG1lZGlhIGl0ZW0KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQWRqYWNlbnRUcmFuc2l0aW9ucyhNZWRpYUl0ZW0gbWVkaWFJdGVtKSB7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFRyYW5zaXRpb24+IGl0ID0gbVRyYW5zaXRpb25zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRyYW5zaXRpb24gdCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0LmdldEFmdGVyTWVkaWFJdGVtKCkgPT0gbWVkaWFJdGVtIHx8IHQuZ2V0QmVmb3JlTWVkaWFJdGVtKCkgPT0gbWVkaWFJdGVtKSB7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdC5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgbWVkaWFJdGVtLnNldEJlZ2luVHJhbnNpdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICBtZWRpYUl0ZW0uc2V0RW5kVHJhbnNpdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgdHJhbnNpdGlvbiBiZWZvcmUgdGhpcyBtZWRpYSBpdGVtCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggVGhlIG1lZGlhIGl0ZW0gaW5kZXgKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVHJhbnNpdGlvbkJlZm9yZShpbnQgaW5kZXgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIG1lZGlhSXRlbSA9IG1NZWRpYUl0ZW1zLmdldCgwKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8VHJhbnNpdGlvbj4gaXQgPSBtVHJhbnNpdGlvbnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJhbnNpdGlvbiB0ID0gaXQubmV4dCgpOworICAgICAgICAgICAgaWYgKHQuZ2V0QmVmb3JlTWVkaWFJdGVtKCkgPT0gbWVkaWFJdGVtKSB7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdC5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgbWVkaWFJdGVtLnNldEJlZ2luVHJhbnNpdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYUl0ZW1zLmdldChpbmRleCAtIDEpLnNldEVuZFRyYW5zaXRpb24obnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSB0cmFuc2l0aW9uIGFmdGVyIHRoaXMgbWVkaWEgaXRlbQorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IFRoZSBtZWRpYSBpdGVtIGluZGV4CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRyYW5zaXRpb25BZnRlcihpbnQgaW5kZXgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIG1lZGlhSXRlbSA9IG1NZWRpYUl0ZW1zLmdldChpbmRleCk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFRyYW5zaXRpb24+IGl0ID0gbVRyYW5zaXRpb25zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRyYW5zaXRpb24gdCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0LmdldEFmdGVyTWVkaWFJdGVtKCkgPT0gbWVkaWFJdGVtKSB7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdC5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgbWVkaWFJdGVtLnNldEVuZFRyYW5zaXRpb24obnVsbCk7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgcmVmZXJlbmNlIGluIHRoZSBuZXh0IG1lZGlhIGl0ZW0KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBtTWVkaWFJdGVtcy5zaXplKCkgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYUl0ZW1zLmdldChpbmRleCArIDEpLnNldEJlZ2luVHJhbnNpdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2puaS9BbmRyb2lkLm1rCmluZGV4IDcwZWQ2MDguLjI1ZDI0M2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2puaS9BbmRyb2lkLm1rCkBAIC04LDcgKzgsMTEgQEAKICAgICBhbmRyb2lkX21lZGlhX01lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIFwKICAgICBhbmRyb2lkX21lZGlhX1Jlc2FtcGxlSW5wdXRTdHJlYW0uY3BwIFwKICAgICBhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMuY3BwIFwKLSAgICBhbmRyb2lkX21lZGlhX0FtcklucHV0U3RyZWFtLmNwcAorICAgIGFuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0uY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcCBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCkBAIC0yMSw5ICsyNSwxMiBAQAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKICAgICBsaWJzdGFnZWZyaWdodCBcCi0gICAgbGliY2FtZXJhX2NsaWVudAorICAgIGxpYmNhbWVyYV9jbGllbnQgXAorCWxpYnNxbGl0ZQogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdAorZW5kaWYKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZXh0ZXJuYWwvdHJlbW9yL1RyZW1vciBcCkBAIC0zMiw2ICszOSw3IEBACiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjIFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbiBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCiAgICAgJChQVl9JTkNMVURFUykgXAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKaW5kZXggNmY5NGU4Yi4uZDRhYWNhZiAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcApAQCAtNzg4LDYgKzc4OCwxMCBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lcihKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfUmVzYW1wbGVJbnB1dFN0cmVhbShKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcyhKTklFbnYgKmVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IoSk5JRW52ICplbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX0FtcklucHV0U3RyZWFtKEpOSUVudiAqZW52KTsKIAogamludCBKTklfT25Mb2FkKEphdmFWTSogdm0sIHZvaWQqIHJlc2VydmVkKQpAQCAtODM2LDYgKzg0MCwyNiBAQAogICAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBDbGllbnQgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwQ3Vyc29yIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZShlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwRGF0YWJhc2UgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwU2VydmVyIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKICAgICAvKiBzdWNjZXNzIC0tIHJldHVybiB2YWxpZCB2ZXJzaW9uIG51bWJlciAqLwogICAgIHJlc3VsdCA9IEpOSV9WRVJTSU9OXzFfNDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCBjY2U5ZmQwLi4wOGE2ZGUxIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcApAQCAtMTY1LDcgKzE2NSw5IEBACiBhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGlkLCBqaW50IHF1YWxpdHkpCiB7CiAgICAgTE9HVigibmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZTogJWQgJWQiLCBpZCwgcXVhbGl0eSk7Ci0gICAgaWYgKHF1YWxpdHkgIT0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSCAmJiBxdWFsaXR5ICE9IENBTUNPUkRFUl9RVUFMSVRZX0xPVykgeworICAgIGlmICghKChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX0xPVyAmJiBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZXzEwODBQKSB8fAorICAgICAgICAgICAgICAgIChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICYmCisgICAgICAgICAgICAgICAgcXVhbGl0eSA8PSBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQKSkpIHsKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAiVW5rbm93biBjYW1jb3JkZXIgcHJvZmlsZSBxdWFsaXR5Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTIxMCw2ICsyMTIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9DaGFubmVscyk7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9oYXNfY2FtY29yZGVyX3Byb2ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBpZCwgamludCBxdWFsaXR5KQoreworICAgIExPR1YoIm5hdGl2ZV9oYXNfY2FtY29yZGVyX3Byb2ZpbGU6ICVkICVkIiwgaWQsIHF1YWxpdHkpOworICAgIGlmICghKChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX0xPVyAmJiBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZXzEwODBQKSB8fAorICAgICAgICAgICAgICAgIChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICYmCisgICAgICAgICAgICAgICAgcXVhbGl0eSA8PSBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNhbWNvcmRlcl9xdWFsaXR5IHEgPSBzdGF0aWNfY2FzdDxjYW1jb3JkZXJfcXVhbGl0eT4ocXVhbGl0eSk7CisgICAgcmV0dXJuIHNQcm9maWxlcy0+aGFzQ2FtY29yZGVyUHJvZmlsZShpZCwgcSk7Cit9CisKIHN0YXRpYyBqaW50CiBhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9udW1fdmlkZW9fZGVjb2RlcnMoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKIHsKQEAgLTI4OSw2ICszMDUsOCBAQAogICAgIHsibmF0aXZlX2luaXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9pbml0fSwKICAgICB7Im5hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGUiLCAgICAgICAgICAgIihJSSlMYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZX0sCisgICAgeyJuYXRpdmVfaGFzX2NhbWNvcmRlcl9wcm9maWxlIiwgICAgICAgICAgICIoSUkpWiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2hhc19jYW1jb3JkZXJfcHJvZmlsZX0sCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzRm9yRGVjb2RlckNhcGFiaWxpdGllc0NsYXNzW10gPSB7CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwCmluZGV4IGVmYTA4MTMuLjgyYjRhYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwCkBAIC0yNjAsNiArMjYwLDIwIEBACiB9CiAKIHN0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0T3V0cHV0RmlsZUF1eEZEKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgZmlsZURlc2NyaXB0b3IpCit7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZSIpOworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgZmQgPSBnZXRQYXJjZWxGaWxlRGVzY3JpcHRvckZEKGVudiwgZmlsZURlc2NyaXB0b3IpOworICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gZ2V0TWVkaWFSZWNvcmRlcihlbnYsIHRoaXopOworICAgIHN0YXR1c190IG9wU3RhdHVzID0gbXItPnNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpOworICAgIHByb2Nlc3NfbWVkaWFfcmVjb3JkZXJfY2FsbChlbnYsIG9wU3RhdHVzLCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJzZXRPdXRwdXRGaWxlIGZhaWxlZC4iKTsKK30KKworc3RhdGljIHZvaWQKIGFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRWaWRlb1NpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCB3aWR0aCwgamludCBoZWlnaHQpCiB7CiAgICAgTE9HVigic2V0VmlkZW9TaXplKCVkLCAlZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTQ2Niw2ICs0ODAsNyBAQAogICAgIHsic2V0QXVkaW9FbmNvZGVyIiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldEF1ZGlvRW5jb2Rlcn0sCiAgICAgeyJzZXRQYXJhbWV0ZXIiLCAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0UGFyYW1ldGVyfSwKICAgICB7Il9zZXRPdXRwdXRGaWxlIiwgICAgICAgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtKSilWIiwgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRPdXRwdXRGaWxlRkR9LAorICAgIHsiX3NldE91dHB1dEZpbGVBdXgiLCAgICAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIiwgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldE91dHB1dEZpbGVBdXhGRH0sCiAgICAgeyJzZXRWaWRlb1NpemUiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0VmlkZW9TaXplfSwKICAgICB7InNldFZpZGVvRnJhbWVSYXRlIiwgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRWaWRlb0ZyYW1lUmF0ZX0sCiAgICAgeyJzZXRNYXhEdXJhdGlvbiIsICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0TWF4RHVyYXRpb259LApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lci5jcHAKaW5kZXggMjczZjFhZi4uZmQwYjIzMyAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXIuY3BwCkBAIC0xNDYsNyArMTQ2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWFuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyX3Byb2Nlc3NEaXJlY3RvcnkoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwganN0cmluZyBwYXRoLCBqc3RyaW5nIGV4dGVuc2lvbnMsIGpvYmplY3QgY2xpZW50KQorYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfcHJvY2Vzc0RpcmVjdG9yeShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIHBhdGgsIGpvYmplY3QgY2xpZW50KQogewogICAgIE1lZGlhU2Nhbm5lciAqbXAgPSAoTWVkaWFTY2FubmVyICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZHMuY29udGV4dCk7CiAKQEAgLTE1NCwyNyArMTU0LDE2IEBACiAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKKwogICAgIGNvbnN0IGNoYXIgKnBhdGhTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOwogICAgIGlmIChwYXRoU3RyID09IE5VTEwpIHsgIC8vIE91dCBvZiBtZW1vcnkKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAiT3V0IG9mIG1lbW9yeSIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGV4dGVuc2lvbnMsIE5VTEwpOwotICAgIGlmIChleHRlbnNpb25zU3RyID09IE5VTEwpIHsgIC8vIE91dCBvZiBtZW1vcnkKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgcGF0aFN0cik7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIiwgIk91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KIAogICAgIE15TWVkaWFTY2FubmVyQ2xpZW50IG15Q2xpZW50KGVudiwgY2xpZW50KTsKLSAgICBtcC0+cHJvY2Vzc0RpcmVjdG9yeShwYXRoU3RyLCBleHRlbnNpb25zU3RyLCBteUNsaWVudCwgRXhjZXB0aW9uQ2hlY2ssIGVudik7CisgICAgbXAtPnByb2Nlc3NEaXJlY3RvcnkocGF0aFN0ciwgbXlDbGllbnQsIEV4Y2VwdGlvbkNoZWNrLCBlbnYpOwogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIHBhdGhTdHIpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGV4dGVuc2lvbnMsIGV4dGVuc2lvbnNTdHIpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzA5LDkgKzI5OCw5IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKLSAgICB7InByb2Nlc3NEaXJlY3RvcnkiLCAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQ7KVYiLCAgICAKKyAgICB7InByb2Nlc3NEaXJlY3RvcnkiLCAgIihMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQ7KVYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyX3Byb2Nlc3NEaXJlY3Rvcnl9LAotICAgIHsicHJvY2Vzc0ZpbGUiLCAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lckNsaWVudDspViIsICAgIAorICAgIHsicHJvY2Vzc0ZpbGUiLCAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lckNsaWVudDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfcHJvY2Vzc0ZpbGV9LAogICAgIHsic2V0TG9jYWxlIiwgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyX3NldExvY2FsZX0sCiAgICAgeyJleHRyYWN0QWxidW1BcnQiLCAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVtCIiwgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfZXh0cmFjdEFsYnVtQXJ0fSwKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzE4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDbGllbnRKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2RldmljZUFkZGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGV2aWNlUmVtb3ZlZDsKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCitzdGF0aWMgc3RydWN0IGZpbGVfZGVzY3JpcHRvcl9vZmZzZXRzX3QKK3sKKyAgICBqY2xhc3MgbUNsYXNzOworICAgIGptZXRob2RJRCBtQ29uc3RydWN0b3I7CisgICAgamZpZWxkSUQgbURlc2NyaXB0b3I7Cit9IGdGaWxlRGVzY3JpcHRvck9mZnNldHM7CisKK3N0YXRpYyBzdHJ1Y3QgcGFyY2VsX2ZpbGVfZGVzY3JpcHRvcl9vZmZzZXRzX3QKK3sKKyAgICBqY2xhc3MgbUNsYXNzOworICAgIGptZXRob2RJRCBtQ29uc3RydWN0b3I7Cit9IGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHM7CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitjbGFzcyBNeUNsaWVudCA6IHB1YmxpYyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgICAgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpOworICAgIHZpcnR1YWwgdm9pZCAgICBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKTsKKworICAgIGpvYmplY3QgICAgICAgICBtQ2xpZW50OworICAgIE10cERldmljZSogICAgICBtRXZlbnREZXZpY2U7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KTsKKyAgICB2b2lkICAgICAgICAgICAgY2xlYW51cChKTklFbnYgKmVudik7Cit9OworCitNdHBDbGllbnQqIGdldF9jbGllbnRfZnJvbV9vYmplY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgamF2YUNsaWVudCkKK3sKKyAgICByZXR1cm4gKE10cENsaWVudCopZW52LT5HZXRJbnRGaWVsZChqYXZhQ2xpZW50LCBmaWVsZF9jb250ZXh0KTsKK30KKworCitNeUNsaWVudDo6TXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KQorICAgIDogICBtQ2xpZW50KGVudi0+TmV3R2xvYmFsUmVmKGNsaWVudCkpCit7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmNsZWFudXAoSk5JRW52ICplbnYpIHsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2xpZW50KTsKK30KKwordm9pZCBNeUNsaWVudDo6ZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZUFkZGVkICVzXG4iLCBuYW1lKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNsaWVudCwgbWV0aG9kX2RldmljZUFkZGVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZVJlbW92ZWQgJXNcbiIsIG5hbWUpOworCisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQ2xpZW50LCBtZXRob2RfZGV2aWNlUmVtb3ZlZCwgZGV2aWNlLT5nZXRJRCgpKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0dXBcbiIpOworICAgIE15Q2xpZW50KiBjbGllbnQgPSBuZXcgTXlDbGllbnQoZW52LCB0aGl6KTsKKyAgICBjbGllbnQtPnN0YXJ0KCk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWNsaWVudCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2ZpbmFsaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiZmluYWxpemVcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+Y2xlYW51cChlbnYpOworICAgIGRlbGV0ZSBjbGllbnQ7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgamJvb2xlYW4KK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3N0YXJ0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RhcnRcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIHJldHVybiBjbGllbnQtPnN0YXJ0KCk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc3RvcChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInN0b3BcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+c3RvcCgpOworI2VuZGlmCit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZGVsZXRlX29iamVjdChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamxvbmcgb2JqZWN0X2lkKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoZGV2aWNlKQorICAgICAgICByZXR1cm4gZGV2aWNlLT5kZWxldGVPYmplY3Qob2JqZWN0X2lkKTsKKyAgICBlbHNlCisgI2VuZGlmCisgICAgICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgamxvbmcKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2dldF9wYXJlbnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCBkZXZpY2VfaWQsIGpsb25nIG9iamVjdF9pZCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0UGFyZW50KG9iamVjdF9pZCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGpsb25nCithbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamxvbmcgb2JqZWN0X2lkKQoreworICNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0U3RvcmFnZUlEKG9iamVjdF9pZCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGpvYmplY3QKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X29wZW5fZmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamxvbmcgb2JqZWN0X2lkKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKG9iamVjdF9pZCk7CisgICAgaWYgKCFpbmZvKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbnQgb2JqZWN0X3NpemUgPSBpbmZvLT5tQ29tcHJlc3NlZFNpemU7CisgICAgZGVsZXRlIGluZm87CisgICAgaW50IGZkID0gZGV2aWNlLT5yZWFkT2JqZWN0KG9iamVjdF9pZCwgb2JqZWN0X3NpemUpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgam9iamVjdCBmaWxlRGVzY3JpcHRvciA9IGVudi0+TmV3T2JqZWN0KGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzLAorICAgICAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3Rvcik7CisgICAgaWYgKGZpbGVEZXNjcmlwdG9yICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChmaWxlRGVzY3JpcHRvciwgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciwgZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yLCBmaWxlRGVzY3JpcHRvcik7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9maW5hbGl6ZX0sCisgICAgeyJuYXRpdmVfc3RhcnQiLCAgICAgICAgICAgICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdGFydH0sCisgICAgeyJuYXRpdmVfc3RvcCIsICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdG9wfSwKKyAgICB7Im5hdGl2ZV9kZWxldGVfb2JqZWN0IiwgICAiKElKKVoiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2RlbGV0ZV9vYmplY3R9LAorICAgIHsibmF0aXZlX2dldF9wYXJlbnQiLCAgICAgICIoSUopSiIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3BhcmVudH0sCisgICAgeyJuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQiLCAgIihJSilKIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZH0sCisgICAgeyJuYXRpdmVfb3Blbl9maWxlIiwgICAgICAgIihJSilMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfb3Blbl9maWxlfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL010cENsaWVudCI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudChKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudFxuIik7CisKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL010cENsaWVudCIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZGV2aWNlQWRkZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGV2aWNlQWRkZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfZGV2aWNlQWRkZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGRldmljZUFkZGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RldmljZVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGV2aWNlUmVtb3ZlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF9kZXZpY2VSZW1vdmVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZXZpY2VSZW1vdmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwQ2xpZW50Lm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImphdmEvaW8vRmlsZURlc2NyaXB0b3IiKTsKKyAgICBMT0dfRkFUQUxfSUYoY2xhenogPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGphdmEuaW8uRmlsZURlc2NyaXB0b3IiKTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKClWIik7CisgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgImRlc2NyaXB0b3IiLCAiSSIpOworICAgIExPR19GQVRBTF9JRihnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1EZXNjcmlwdG9yID09IE5VTEwsCisgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBkZXNjcmlwdG9yIGZpZWxkIGluIGphdmEuaW8uRmlsZURlc2NyaXB0b3IiKTsKKworICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIExPR19GQVRBTF9JRihjbGF6eiA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIjxpbml0PiIsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiKTsKKyAgICBMT0dfRkFUQUxfSUYoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IgPT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGNvbnN0cnVjdG9yIGZvciBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIik7CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50IiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTBhZThhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ3Vyc29ySk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cEN1cnNvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKKworLy8gRnJvbSBhbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKK010cENsaWVudCAqIGdldF9jbGllbnRfZnJvbV9vYmplY3QoSk5JRW52ICogZW52LCBqb2JqZWN0IGphdmFDbGllbnQpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBib29sIEV4Y2VwdGlvbkNoZWNrKHZvaWQqIGVudikKK3sKKyAgICByZXR1cm4gKChKTklFbnYgKillbnYpLT5FeGNlcHRpb25DaGVjaygpOworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3Jfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqYXZhQ2xpZW50LAorICAgICAgICBqaW50IHF1ZXJ5VHlwZSwgamludCBkZXZpY2VJRCwgamxvbmcgc3RvcmFnZUlELCBqbG9uZyBvYmplY3RJRCwgamludEFycmF5IGphdmFDb2x1bW5zKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoImFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwIHF1ZXJ5VHlwZTogJWQgZGV2aWNlSUQ6ICVkIHN0b3JhZ2VJRDogJWxsZCBvYmplY3RJRDogJWxsZFxuIiwKKyAgICAgICAgICAgICAgICBxdWVyeVR5cGUsIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElEKTsKKworICAgIGludCogY29sdW1ucyA9IE5VTEw7CisgICAgaW50IGNvbHVtbkNvdW50ID0gMDsKKyAgICBpZiAoamF2YUNvbHVtbnMpIHsKKyAgICAgICAgY29sdW1ucyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhqYXZhQ29sdW1ucywgMCk7CisgICAgICAgIGNvbHVtbkNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChqYXZhQ29sdW1ucyk7CisgICAgfQorCisgICAgTXRwQ2xpZW50KiBjbGllbnQgPSBnZXRfY2xpZW50X2Zyb21fb2JqZWN0KGVudiwgamF2YUNsaWVudCk7CisgICAgTXRwQ3Vyc29yKiBjdXJzb3IgPSBuZXcgTXRwQ3Vyc29yKGNsaWVudCwgcXVlcnlUeXBlLAorICAgICAgICAgICAgZGV2aWNlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SUQsIGNvbHVtbkNvdW50LCBjb2x1bW5zKTsKKworICAgIGlmIChjb2x1bW5zKQorICAgICAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGphdmFDb2x1bW5zLCBjb2x1bW5zLCAwKTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIChpbnQpY3Vyc29yKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXRwQ3Vyc29yICpjdXJzb3IgPSAoTXRwQ3Vyc29yICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBkZWxldGUgY3Vyc29yOworI2VuZGlmCit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maWxsX3dpbmRvdyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFXaW5kb3csIGppbnQgc3RhcnRQb3MpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgQ3Vyc29yV2luZG93KiB3aW5kb3cgPSBnZXRfd2luZG93X2Zyb21fb2JqZWN0KGVudiwgamF2YVdpbmRvdyk7CisgICAgaWYgKCF3aW5kb3cpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBDdXJzb3JXaW5kb3ciKTsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgQ3Vyc29yV2luZG93Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworCisgICAgcmV0dXJuIGN1cnNvci0+ZmlsbFdpbmRvdyh3aW5kb3csIHN0YXJ0UG9zKTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50O0lJSkpbSSlWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9maWxsX3dpbmRvdyIsICAgICAgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SSlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbGxfd2luZG93fSwKKworfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cEN1cnNvciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cEN1cnNvci5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cEN1cnNvciIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YmY2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAKQEAgLTAsMCArMSwxMDE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBEYXRhYmFzZUpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKworI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKyNpbmNsdWRlICJtdHAuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGptZXRob2RJRCBtZXRob2RfYmVnaW5TZW5kT2JqZWN0Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZW5kU2VuZE9iamVjdDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdExpc3Q7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXROdW1PYmplY3RzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllczsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdFByb3BlcnR5Oworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2V0T2JqZWN0UHJvcGVydHk7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXREZXZpY2VQcm9wZXJ0eTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3NldERldmljZVByb3BlcnR5Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0SW5mbzsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdEZpbGVQYXRoOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGVsZXRlRmlsZTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdFJlZmVyZW5jZXM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2Vzc2lvblN0YXJ0ZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9zZXNzaW9uRW5kZWQ7CisKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCitNdHBEYXRhYmFzZSogZ2V0TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgZGF0YWJhc2UpIHsKKyAgICByZXR1cm4gKE10cERhdGFiYXNlICopZW52LT5HZXRJbnRGaWVsZChkYXRhYmFzZSwgZmllbGRfY29udGV4dCk7Cit9CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTXlNdHBEYXRhYmFzZSA6IHB1YmxpYyBNdHBEYXRhYmFzZSB7Citwcml2YXRlOgorICAgIGpvYmplY3QgICAgICAgICBtRGF0YWJhc2U7CisgICAgamludEFycmF5ICAgICAgIG1JbnRCdWZmZXI7CisgICAgamxvbmdBcnJheSAgICAgIG1Mb25nQnVmZmVyOworICAgIGpjaGFyQXJyYXkgICAgICBtU3RyaW5nQnVmZmVyOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeU10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsaWVudCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgICAgICAgICB+TXlNdHBEYXRhYmFzZSgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cChKTklFbnYgKmVudik7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IG1vZGlmaWVkKTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2NlZWRlZCk7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKworICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKworICAgIC8vIGNhbGxlZSBzaG91bGQgZGVsZXRlW10gdGhlIHJlc3VsdHMgZnJvbSB0aGVzZQorICAgIC8vIHJlc3VsdHMgY2FuIGJlIE5VTEwKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpOworICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKTsKKyAgICB2aXJ0dWFsIE10cE9iamVjdFByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCk7CisgICAgdmlydHVhbCBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHJlc2V0RGV2aWNlUHJvcGVydHkoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIGZpbGVMZW5ndGgpOworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T2JqZWN0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlJbmZvKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eURlc2MoTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RhcnRlZCgpOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBzZXNzaW9uRW5kZWQoKTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK015TXRwRGF0YWJhc2U6Ok15TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KQorICAgIDogICBtRGF0YWJhc2UoZW52LT5OZXdHbG9iYWxSZWYoY2xpZW50KSksCisgICAgICAgIG1JbnRCdWZmZXIoTlVMTCksCisgICAgICAgIG1Mb25nQnVmZmVyKE5VTEwpLAorICAgICAgICBtU3RyaW5nQnVmZmVyKE5VTEwpCit7CisgICAgamludEFycmF5IGludEFycmF5OworICAgIGpsb25nQXJyYXkgbG9uZ0FycmF5OworICAgIGpjaGFyQXJyYXkgY2hhckFycmF5OworCisgICAgLy8gY3JlYXRlIGJ1ZmZlcnMgZm9yIG91dCBhcmd1bWVudHMKKyAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGJlIHRocmVhZC1zYWZlIHNvIHRoaXMgaXMgT0sKKyAgICBpbnRBcnJheSA9IGVudi0+TmV3SW50QXJyYXkoMyk7CisgICAgaWYgKCFpbnRBcnJheSkKKyAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgIG1JbnRCdWZmZXIgPSAoamludEFycmF5KWVudi0+TmV3R2xvYmFsUmVmKGludEFycmF5KTsKKyAgICBsb25nQXJyYXkgPSBlbnYtPk5ld0xvbmdBcnJheSgyKTsKKyAgICBpZiAoIWxvbmdBcnJheSkKKyAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgIG1Mb25nQnVmZmVyID0gKGpsb25nQXJyYXkpZW52LT5OZXdHbG9iYWxSZWYobG9uZ0FycmF5KTsKKyAgICBjaGFyQXJyYXkgPSBlbnYtPk5ld0NoYXJBcnJheSgyNTYpOworICAgIGlmICghY2hhckFycmF5KQorICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgbVN0cmluZ0J1ZmZlciA9IChqY2hhckFycmF5KWVudi0+TmV3R2xvYmFsUmVmKGNoYXJBcnJheSk7CisgICAgcmV0dXJuOworCitvdXRfb2ZfbWVtb3J5OgorICAgIGVudi0+VGhyb3dOZXcoZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiksIE5VTEwpOworfQorCit2b2lkIE15TXRwRGF0YWJhc2U6OmNsZWFudXAoSk5JRW52ICplbnYpIHsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtRGF0YWJhc2UpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1JbnRCdWZmZXIpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1Mb25nQnVmZmVyKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtU3RyaW5nQnVmZmVyKTsKK30KKworTXlNdHBEYXRhYmFzZTo6fk15TXRwRGF0YWJhc2UoKSB7Cit9CisKK010cE9iamVjdEhhbmRsZSBNeU10cERhdGFiYXNlOjpiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcgcGF0aFN0ciA9IGVudi0+TmV3U3RyaW5nVVRGKHBhdGgpOworICAgIE10cE9iamVjdEhhbmRsZSByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfYmVnaW5TZW5kT2JqZWN0LAorICAgICAgICAgICAgcGF0aFN0ciwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQsIChqaW50KXN0b3JhZ2UsCisgICAgICAgICAgICAoamxvbmcpc2l6ZSwgKGpsb25nKW1vZGlmaWVkKTsKKworICAgIGlmIChwYXRoU3RyKQorICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHBhdGhTdHIpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXlNdHBEYXRhYmFzZTo6ZW5kU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBib29sIHN1Y2NlZWRlZCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcgcGF0aFN0ciA9IGVudi0+TmV3U3RyaW5nVVRGKHBhdGgpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZW5kU2VuZE9iamVjdCwgcGF0aFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpZm9ybWF0LCAoamJvb2xlYW4pc3VjY2VlZGVkKTsKKworICAgIGlmIChwYXRoU3RyKQorICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHBhdGhTdHIpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdExpc3QsCisgICAgICAgICAgICAgICAgKGppbnQpc3RvcmFnZUlELCAoamludClmb3JtYXQsIChqaW50KXBhcmVudCk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChoYW5kbGVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGFycmF5KTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitpbnQgTXlNdHBEYXRhYmFzZTo6Z2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXROdW1PYmplY3RzLAorICAgICAgICAgICAgICAgIChqaW50KXN0b3JhZ2VJRCwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0Rm9ybWF0TGlzdCgpOworICAgIGppbnQqIGZvcm1hdHMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2goZm9ybWF0c1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgZm9ybWF0cywgMCk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdEZvcm1hdExpc3QoKTsKKyAgICBqaW50KiBmb3JtYXRzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBsaXN0LT5wdXNoKGZvcm1hdHNbaV0pOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGZvcm1hdHMsIDApOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoYXJyYXkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cE9iamVjdFByb3BlcnR5TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMsIChqaW50KWZvcm1hdCk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdFByb3BlcnR5TGlzdCgpOworICAgIGppbnQqIHByb3BlcnRpZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2gocHJvcGVydGllc1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgcHJvcGVydGllcywgMCk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwRGV2aWNlUHJvcGVydHlMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIGxpc3QgPSBuZXcgTXRwRGV2aWNlUHJvcGVydHlMaXN0KCk7CisgICAgamludCogcHJvcGVydGllcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChwcm9wZXJ0aWVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBwcm9wZXJ0aWVzLCAwKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGFycmF5KTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0T2JqZWN0UHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHksCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCAoamludClwcm9wZXJ0eSwgbUxvbmdCdWZmZXIsIG1TdHJpbmdCdWZmZXIpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgamxvbmcgbG9uZ1ZhbHVlID0gbG9uZ1ZhbHVlc1swXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgZGF0ZSBwcm9wZXJ0aWVzLCB3aGljaCBhcmUgc3RyaW5ncyB0byBNVFAKKyAgICAvLyBidXQgc3RvcmVkIGludGVybmFsbHkgYXMgYSB1aW50NjQKKyAgICBpZiAocHJvcGVydHkgPT0gTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQgfHwgcHJvcGVydHkgPT0gTVRQX1BST1BFUlRZX0RBVEVfQURERUQpIHsKKyAgICAgICAgY2hhciAgICBkYXRlWzIwXTsKKyAgICAgICAgZm9ybWF0RGF0ZVRpbWUobG9uZ1ZhbHVlLCBkYXRlLCBzaXplb2YoZGF0ZSkpOworICAgICAgICBwYWNrZXQucHV0U3RyaW5nKGRhdGUpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgIH0KKyAgICAvLyByZWxlYXNlIGRhdGUgaXMgc3RvcmVkIGludGVybmFsbHkgYXMganVzdCB0aGUgeWVhcgorICAgIGlmIChwcm9wZXJ0eSA9PSBNVFBfUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFKSB7CisgICAgICAgIGNoYXIgICAgZGF0ZVsyMF07CisgICAgICAgIHNucHJpbnRmKGRhdGUsIHNpemVvZihkYXRlKSwgIiUwNGxsZDAxMDFUMDAwMDAwIiwgbG9uZ1ZhbHVlKTsKKyAgICAgICAgcGFja2V0LnB1dFN0cmluZyhkYXRlKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxNihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQxNihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MzIobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MzIobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDY0KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDY0KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTI4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDEyOChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICB7CisgICAgICAgICAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICAgICAgICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVuc3VwcG9ydGVkIHR5cGUgaW4gZ2V0T2JqZWN0UHJvcGVydHlWYWx1ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfRk9STUFUOworICAgIH0KKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBpbnQgICAgICAgICB0eXBlOworCisgICAgaWYgKCFnZXRPYmplY3RQcm9wZXJ0eUluZm8ocHJvcGVydHksIHR5cGUpKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQ7CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbG9uZyBsb25nVmFsdWUgPSAwOworICAgIGpzdHJpbmcgc3RyaW5nVmFsdWUgPSBOVUxMOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICB7CisgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIgYnVmZmVyOworICAgICAgICAgICAgcGFja2V0LmdldFN0cmluZyhidWZmZXIpOworICAgICAgICAgICAgc3RyaW5nVmFsdWUgPSBlbnYtPk5ld1N0cmluZ1VURigoY29uc3QgY2hhciAqKWJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVuc3VwcG9ydGVkIHR5cGUgaW4gZ2V0T2JqZWN0UHJvcGVydHlWYWx1ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfRk9STUFUOworICAgIH0KKworICAgIGppbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3NldE9iamVjdFByb3BlcnR5LAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpcHJvcGVydHksIGxvbmdWYWx1ZSwgc3RyaW5nVmFsdWUpOworICAgIGlmIChzdHJpbmdWYWx1ZSkKKyAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihzdHJpbmdWYWx1ZSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0RGV2aWNlUHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0RGV2aWNlUHJvcGVydHksCisgICAgICAgICAgICAgICAgKGppbnQpcHJvcGVydHksIG1Mb25nQnVmZmVyLCBtU3RyaW5nQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGpsb25nIGxvbmdWYWx1ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgZW52LT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIGxvbmdWYWx1ZXMsIDApOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50OChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dEludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDEyOChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxMjgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgeworICAgICAgICAgICAgamNoYXIqIHN0ciA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgMCk7CisgICAgICAgICAgICBwYWNrZXQucHV0U3RyaW5nKHN0cik7CisgICAgICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bnN1cHBvcnRlZCB0eXBlIGluIGdldERldmljZVByb3BlcnR5VmFsdWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX0ZPUk1BVDsKKyAgICB9CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6c2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0RGV2aWNlUHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamxvbmcgbG9uZ1ZhbHVlID0gMDsKKyAgICBqc3RyaW5nIHN0cmluZ1ZhbHVlID0gTlVMTDsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgeworICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgICAgIHBhY2tldC5nZXRTdHJpbmcoYnVmZmVyKTsKKyAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gZW52LT5OZXdTdHJpbmdVVEYoKGNvbnN0IGNoYXIgKilidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bnN1cHBvcnRlZCB0eXBlIGluIHNldERldmljZVByb3BlcnR5VmFsdWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0ZPUk1BVDsKKyAgICB9CisKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9zZXREZXZpY2VQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAoamludClwcm9wZXJ0eSwgbG9uZ1ZhbHVlLCBzdHJpbmdWYWx1ZSk7CisgICAgaWYgKHN0cmluZ1ZhbHVlKQorICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHN0cmluZ1ZhbHVlKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpyZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgcmV0dXJuIC0xOworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBjaGFyICAgIGRhdGVbMjBdOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RJbmZvLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgbUludEJ1ZmZlciwgbVN0cmluZ0J1ZmZlciwgbUxvbmdCdWZmZXIpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKworICAgIGppbnQqIGludFZhbHVlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhtSW50QnVmZmVyLCAwKTsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gaW50VmFsdWVzWzBdOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBpbnRWYWx1ZXNbMV07CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IGludFZhbHVlc1syXTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKG1JbnRCdWZmZXIsIGludFZhbHVlcywgMCk7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIHVpbnQ2NF90IHNpemUgPSBsb25nVmFsdWVzWzBdOworICAgIHVpbnQ2NF90IG1vZGlmaWVkID0gbG9uZ1ZhbHVlc1sxXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisKKy8vICAgIGludCBhc3NvY2lhdGlvblR5cGUgPSAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gPworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRQX0FTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVIgOgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEKTsKKyAgICBpbnQgYXNzb2NpYXRpb25UeXBlID0gTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEOworCisgICAgcGFja2V0LnB1dFVJbnQzMihzdG9yYWdlSUQpOworICAgIHBhY2tldC5wdXRVSW50MTYoZm9ybWF0KTsKKyAgICBwYWNrZXQucHV0VUludDE2KDApOyAgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgcGFja2V0LnB1dFVJbnQzMigoc2l6ZSA+IDB4RkZGRkZGRkZMTCA/IDB4RkZGRkZGRkYgOiBzaXplKSk7CisgICAgcGFja2V0LnB1dFVJbnQxNigwKTsgICAvLyB0aHVtYiBmb3JtYXQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIGNvbXByZXNzZWQgc2l6ZQorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgcGl4IHdpZHRoCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBwaXggaGVpZ2h0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBwaXggd2lkdGgKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIHBpeCBoZWlnaHQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIGJpdCBkZXB0aAorICAgIHBhY2tldC5wdXRVSW50MzIocGFyZW50KTsKKyAgICBwYWNrZXQucHV0VUludDE2KGFzc29jaWF0aW9uVHlwZSk7CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBhc3NvY2lhdGlvbiBkZXNjCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBzZXF1ZW5jZSBudW1iZXIKKworICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsgICAvLyBmaWxlIG5hbWUKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7CisgICAgZm9ybWF0RGF0ZVRpbWUobW9kaWZpZWQsIGRhdGUsIHNpemVvZihkYXRlKSk7CisgICAgcGFja2V0LnB1dFN0cmluZyhkYXRlKTsgICAvLyBkYXRlIG1vZGlmaWVkCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7ICAgLy8ga2V5d29yZHMKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBtU3RyaW5nQnVmZmVyLCBtTG9uZ0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgamNoYXIqIHN0ciA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgMCk7CisgICAgZmlsZVBhdGguc2V0VG8oc3RyLCBzdHJsZW4xNihzdHIpKTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworCisgICAgamxvbmcqIGxvbmdWYWx1ZXMgPSBlbnYtPkdldExvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCAwKTsKKyAgICBmaWxlTGVuZ3RoID0gbG9uZ1ZhbHVlc1swXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisgICAgCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OmRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZGVsZXRlRmlsZSwgKGppbnQpaGFuZGxlKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBQcm9wZXJ0eVRhYmxlRW50cnkgeworICAgIE10cE9iamVjdFByb3BlcnR5ICAgcHJvcGVydHk7CisgICAgaW50ICAgICAgICAgICAgICAgICB0eXBlOworfTsKKworc3RhdGljIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSAgIGtPYmplY3RQcm9wZXJ0eVRhYmxlW10gPSB7CisgICAgeyAgIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lELCAgICAgICAgTVRQX1RZUEVfVUlOVDMyICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwgICAgIE1UUF9UWVBFX1VJTlQxNiAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTLCBNVFBfVFlQRV9VSU5UMTYgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSwgICAgICAgTVRQX1RZUEVfVUlOVDY0ICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQsICAgICBNVFBfVFlQRV9TVFIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNULCAgICAgTVRQX1RZUEVfVUlOVDMyICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQsICAgIE1UUF9UWVBFX1VJTlQxMjggICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX05BTUUsICAgICAgICAgICAgICBNVFBfVFlQRV9TVFIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9ESVNQTEFZX05BTUUsICAgICAgTVRQX1RZUEVfU1RSICAgICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfREFURV9BRERFRCwgICAgICAgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0FSVElTVCwgICAgICAgICAgICBNVFBfVFlQRV9TVFIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9BTEJVTV9OQU1FLCAgICAgICAgTVRQX1RZUEVfU1RSICAgICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfQUxCVU1fQVJUSVNULCAgICAgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX1RSQUNLLCAgICAgICAgICAgICBNVFBfVFlQRV9VSU5UMTYgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUsIE1UUF9UWVBFX1NUUiAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfR0VOUkUsICAgICAgICAgICAgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0NPTVBPU0VSLCAgICAgICAgICBNVFBfVFlQRV9TVFIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9EVVJBVElPTiwgICAgICAgICAgTVRQX1RZUEVfVUlOVDMyICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfREVTQ1JJUFRJT04sICAgICAgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkgICBrRGV2aWNlUHJvcGVydHlUYWJsZVtdID0geworICAgIHsgICBNVFBfREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSLCAgICAgTVRQX1RZUEVfU1RSIH0sCisgICAgeyAgIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUsICAgICAgICBNVFBfVFlQRV9TVFIgfSwKK307CisKK2Jvb2wgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpIHsKKyAgICBpbnQgY291bnQgPSBzaXplb2Yoa09iamVjdFByb3BlcnR5VGFibGUpIC8gc2l6ZW9mKGtPYmplY3RQcm9wZXJ0eVRhYmxlWzBdKTsKKyAgICBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkqIGVudHJ5ID0ga09iamVjdFByb3BlcnR5VGFibGU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBlbnRyeSsrKSB7CisgICAgICAgIGlmIChlbnRyeS0+cHJvcGVydHkgPT0gcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBlbnRyeS0+dHlwZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNeU10cERhdGFiYXNlOjpnZXREZXZpY2VQcm9wZXJ0eUluZm8oTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksIGludCYgdHlwZSkgeworICAgIGludCBjb3VudCA9IHNpemVvZihrRGV2aWNlUHJvcGVydHlUYWJsZSkgLyBzaXplb2Yoa0RldmljZVByb3BlcnR5VGFibGVbMF0pOworICAgIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSogZW50cnkgPSBrRGV2aWNlUHJvcGVydHlUYWJsZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGVudHJ5KyspIHsKKyAgICAgICAgaWYgKGVudHJ5LT5wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworICAgICAgICAgICAgdHlwZSA9IGVudHJ5LT50eXBlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChoYW5kbGVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGFycmF5KTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6c2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpbnQgY291bnQgPSByZWZlcmVuY2VzLT5zaXplKCk7CisgICAgamludEFycmF5IGFycmF5ID0gZW52LT5OZXdJbnRBcnJheShjb3VudCk7CisgICAgaWYgKCFhcnJheSkgeworICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5IGluIHNldE9iamVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBqaW50KiBoYW5kbGVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBoYW5kbGVzW2ldID0gKCpyZWZlcmVuY2VzKVtpXTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXMsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBhcnJheSk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBQcm9wZXJ0eSogTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlEZXNjKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgTXRwUHJvcGVydHkqIHJlc3VsdCA9IE5VTEw7CisgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFUOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUzoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfVFJBQ0s6CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1VJTlQxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRDoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVDoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfRFVSQVRJT046CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1VJTlQzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkU6CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1VJTlQ2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQ6CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1VJTlQxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX05BTUU6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUU6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQ6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX0RJU1BMQVlfTkFNRToKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfREFURV9BRERFRDoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfQVJUSVNUOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9BTEJVTV9OQU1FOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9BTEJVTV9BUlRJU1Q6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX09SSUdJTkFMX1JFTEVBU0VfREFURToKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfR0VOUkU6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX0NPTVBPU0VSOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9ERVNDUklQVElPTjoKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfU1RSKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFByb3BlcnR5KiBNeU10cERhdGFiYXNlOjpnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICBNdHBQcm9wZXJ0eSogcmVzdWx0ID0gTlVMTDsKKyAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgIGNhc2UgTVRQX0RFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUjoKKyAgICAgICAgY2FzZSBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FOgorICAgICAgICB7CisgICAgICAgICAgICAvLyB3cml0ZWFibGUgc3RyaW5nIHByb3BlcnRpZXMKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfU1RSLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gc2V0IGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgamludCByZXQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0RGV2aWNlUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAoamludClwcm9wZXJ0eSwgbUxvbmdCdWZmZXIsIG1TdHJpbmdCdWZmZXIpOworICAgICAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgICAgICAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnNldEN1cnJlbnRWYWx1ZShzdHIpOworICAgICAgICAgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoInVuYWJsZSB0byByZWFkIGRldmljZSBwcm9wZXJ0eSwgcmVzcG9uc2U6ICUwNFgiLCByZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjpzZXNzaW9uU3RhcnRlZCgpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3Nlc3Npb25TdGFydGVkKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjpzZXNzaW9uRW5kZWQoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9zZXNzaW9uRW5kZWQpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2Vfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZXR1cFxuIik7CisgICAgTXlNdHBEYXRhYmFzZSogZGF0YWJhc2UgPSBuZXcgTXlNdHBEYXRhYmFzZShlbnYsIHRoaXopOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludClkYXRhYmFzZSk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXlNdHBEYXRhYmFzZSogZGF0YWJhc2UgPSAoTXlNdHBEYXRhYmFzZSAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgZGF0YWJhc2UtPmNsZWFudXAoZW52KTsKKyAgICBkZWxldGUgZGF0YWJhc2U7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAwKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2Vfc2V0dXB9LAorICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9maW5hbGl6ZX0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9iZWdpblNlbmRPYmplY3QgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiYmVnaW5TZW5kT2JqZWN0IiwgIihMamF2YS9sYW5nL1N0cmluZztJSUlKSilJIik7CisgICAgaWYgKG1ldGhvZF9iZWdpblNlbmRPYmplY3QgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGJlZ2luU2VuZE9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9lbmRTZW5kT2JqZWN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImVuZFNlbmRPYmplY3QiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0lJWilWIik7CisgICAgaWYgKG1ldGhvZF9lbmRTZW5kT2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBlbmRTZW5kT2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdExpc3QgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0TGlzdCIsICIoSUlJKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RMaXN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE51bU9iamVjdHMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0TnVtT2JqZWN0cyIsICIoSUlJKUkiKTsKKyAgICBpZiAobWV0aG9kX2dldE51bU9iamVjdHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE51bU9iamVjdHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyIsICIoKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyIsICIoKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzIiwgIihJKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyIsICIoKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdFByb3BlcnR5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdFByb3BlcnR5IiwgIihJSVtKW0MpSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdFByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3NldE9iamVjdFByb3BlcnR5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNldE9iamVjdFByb3BlcnR5IiwgIihJSUpMamF2YS9sYW5nL1N0cmluZzspSSIpOworICAgIGlmIChtZXRob2Rfc2V0T2JqZWN0UHJvcGVydHkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHNldE9iamVjdFByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldERldmljZVByb3BlcnR5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldERldmljZVByb3BlcnR5IiwgIihJW0pbQylJIik7CisgICAgaWYgKG1ldGhvZF9nZXREZXZpY2VQcm9wZXJ0eSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0RGV2aWNlUHJvcGVydHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2Rfc2V0RGV2aWNlUHJvcGVydHkgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2V0RGV2aWNlUHJvcGVydHkiLCAiKElKTGphdmEvbGFuZy9TdHJpbmc7KUkiKTsKKyAgICBpZiAobWV0aG9kX3NldERldmljZVByb3BlcnR5ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXREZXZpY2VQcm9wZXJ0eSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RJbmZvID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdEluZm8iLCAiKElbSVtDW0opWiIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0SW5mbyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0SW5mbyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RGaWxlUGF0aCIsICIoSVtDW0opSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGggPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdEZpbGVQYXRoIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RlbGV0ZUZpbGUgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGVsZXRlRmlsZSIsICIoSSlJIik7CisgICAgaWYgKG1ldGhvZF9kZWxldGVGaWxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZWxldGVGaWxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdFJlZmVyZW5jZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0UmVmZXJlbmNlcyIsICIoSSlbSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0UmVmZXJlbmNlcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0UmVmZXJlbmNlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNldE9iamVjdFJlZmVyZW5jZXMiLCAiKElbSSlJIik7CisgICAgaWYgKG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXRPYmplY3RSZWZlcmVuY2VzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3Nlc3Npb25TdGFydGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNlc3Npb25TdGFydGVkIiwgIigpViIpOworICAgIGlmIChtZXRob2Rfc2Vzc2lvblN0YXJ0ZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHNlc3Npb25TdGFydGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3Nlc3Npb25FbmRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXNzaW9uRW5kZWQiLCAiKClWIik7CisgICAgaWYgKG1ldGhvZF9zZXNzaW9uRW5kZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHNlc3Npb25FbmRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwRGF0YWJhc2UubU5hdGl2ZUNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2Nzk2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFNlcnZlckpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgInByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiTXRwU2VydmVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0Oworc3RhdGljIE11dGV4ICAgIHNNdXRleDsKKworLy8gaW4gYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAKK2V4dGVybiBNdHBEYXRhYmFzZSogZ2V0TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgZGF0YWJhc2UpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKworc3RhdGljIGJvb2wgRXhjZXB0aW9uQ2hlY2sodm9pZCogZW52KQoreworICAgIHJldHVybiAoKEpOSUVudiAqKWVudiktPkV4Y2VwdGlvbkNoZWNrKCk7Cit9CisKK2NsYXNzIE10cFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHJpdmF0ZToKKyAgICBNdHBEYXRhYmFzZSogICAgbURhdGFiYXNlOworICAgIE10cFNlcnZlciogICAgICBtU2VydmVyOworICAgIFN0cmluZzggICAgICAgICBtU3RvcmFnZVBhdGg7CisgICAgam9iamVjdCAgICAgICAgIG1KYXZhU2VydmVyOworICAgIGludCAgICAgICAgICAgICBtRmQ7CisKK3B1YmxpYzoKKyAgICBNdHBUaHJlYWQoTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBjb25zdCBjaGFyKiBzdG9yYWdlUGF0aCwgam9iamVjdCBqYXZhU2VydmVyKQorICAgICAgICA6ICAgbURhdGFiYXNlKGRhdGFiYXNlKSwKKyAgICAgICAgICAgIG1TZXJ2ZXIoTlVMTCksCisgICAgICAgICAgICBtU3RvcmFnZVBhdGgoc3RvcmFnZVBhdGgpLAorICAgICAgICAgICAgbUphdmFTZXJ2ZXIoamF2YVNlcnZlciksCisgICAgICAgICAgICBtRmQoLTEpCisgICAgeworICAgIH0KKworICAgIHZvaWQgc2V0UHRwTW9kZShib29sIHVzZVB0cCkgeworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgICAgIGlvY3RsKG1GZCwgTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgKHVzZVB0cCA/IE1UUF9JTlRFUkZBQ0VfTU9ERV9QVFAgOiBNVFBfSU5URVJGQUNFX01PREVfTVRQKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L210cF91c2IiLCBPX1JEV1IpOworICAgICAgICAgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgICAgICAgICBpb2N0bChmZCwgTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1c2VQdHAgPyBNVFBfSU5URVJGQUNFX01PREVfUFRQIDogTVRQX0lOVEVSRkFDRV9NT0RFX01UUCkpOworICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7CisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIG1GZCA9IG9wZW4oIi9kZXYvbXRwX3VzYiIsIE9fUkRXUik7CisgICAgICAgIHByaW50Zigib3BlbiByZXR1cm5lZCAlZFxuIiwgbUZkKTsKKyAgICAgICAgaWYgKG1GZCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuIE1UUCBkcml2ZXJcbiIpOworICAgICAgICAgICAgc011dGV4LnVubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVNlcnZlciA9IG5ldyBNdHBTZXJ2ZXIobUZkLCBtRGF0YWJhc2UsIEFJRF9TRENBUkRfUlcsIDA2NjQsIDA3NzUpOworICAgICAgICBtU2VydmVyLT5hZGRTdG9yYWdlKG1TdG9yYWdlUGF0aCk7CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKworICAgICAgICBMT0dEKCJNdHBUaHJlYWQgbVNlcnZlci0+cnVuIik7CisgICAgICAgIG1TZXJ2ZXItPnJ1bigpOworCisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgICAgICBkZWxldGUgbVNlcnZlcjsKKyAgICAgICAgbVNlcnZlciA9IE5VTEw7CisKKyAgICAgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQobUphdmFTZXJ2ZXIsIGZpZWxkX2NvbnRleHQsIDApOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtSmF2YVNlcnZlcik7CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKworICAgICAgICBMT0dEKCJ0aHJlYWRMb29wIHJldHVybmluZyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBpZiAobVNlcnZlcikKKyAgICAgICAgICAgIG1TZXJ2ZXItPnNlbmRPYmplY3RBZGRlZChoYW5kbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBMT0dFKCJzZW5kT2JqZWN0QWRkZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgaWYgKG1TZXJ2ZXIpCisgICAgICAgICAgICBtU2VydmVyLT5zZW5kT2JqZWN0UmVtb3ZlZChoYW5kbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBMT0dFKCJzZW5kT2JqZWN0UmVtb3ZlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworICAgIH0KK307CisKKyNlbmRpZiAvLyBIQVZFX0FORFJPSURfT1MKKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgamF2YURhdGFiYXNlLCBqc3RyaW5nIHN0b3JhZ2VQYXRoKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNldHVwXG4iKTsKKworICAgIE10cERhdGFiYXNlKiBkYXRhYmFzZSA9IGdldE10cERhdGFiYXNlKGVudiwgamF2YURhdGFiYXNlKTsKKyAgICBjb25zdCBjaGFyICpzdG9yYWdlUGF0aFN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3RvcmFnZVBhdGgsIE5VTEwpOworCisgICAgTXRwVGhyZWFkKiB0aHJlYWQgPSBuZXcgTXRwVGhyZWFkKGRhdGFiYXNlLCBzdG9yYWdlUGF0aFN0ciwgZW52LT5OZXdHbG9iYWxSZWYodGhpeikpOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludCl0aHJlYWQpOworCisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3RvcmFnZVBhdGgsIHN0b3JhZ2VQYXRoU3RyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7Cit9CisKKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0YXJ0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RhcnRcbiIpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgdGhyZWFkLT5ydW4oIk10cFRocmVhZCIpOworI2VuZGlmIC8vIEhBVkVfQU5EUk9JRF9PUworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RvcChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInN0b3BcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9hZGRlZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGhhbmRsZSkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZW5kX29iamVjdF9hZGRlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICBNdHBUaHJlYWQgKnRocmVhZCA9IChNdHBUaHJlYWQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGlmICh0aHJlYWQpCisgICAgICAgIHRocmVhZC0+c2VuZE9iamVjdEFkZGVkKGhhbmRsZSk7CisgICAgZWxzZQorICAgICAgICBMT0dFKCJzZW5kT2JqZWN0QWRkZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NlbmRfb2JqZWN0X3JlbW92ZWQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBoYW5kbGUpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2VuZF9vYmplY3RfcmVtb3ZlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICBNdHBUaHJlYWQgKnRocmVhZCA9IChNdHBUaHJlYWQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGlmICh0aHJlYWQpCisgICAgICAgIHRocmVhZC0+c2VuZE9iamVjdFJlbW92ZWQoaGFuZGxlKTsKKyAgICBlbHNlCisgICAgICAgIExPR0UoInNlbmRPYmplY3RSZW1vdmVkIGNhbGxlZCB3aGlsZSBkaXNjb25uZWN0ZWRcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXRfcHRwX21vZGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamJvb2xlYW4gdXNlUHRwKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNldF9wdHBfbW9kZVxuIik7CisgICAgTXRwVGhyZWFkICp0aHJlYWQgPSAoTXRwVGhyZWFkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBpZiAodGhyZWFkKQorICAgICAgICB0aHJlYWQtPnNldFB0cE1vZGUodXNlUHRwKTsKKyAjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL010cERhdGFiYXNlO0xqYXZhL2xhbmcvU3RyaW5nOylWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfZmluYWxpemV9LAorICAgIHsibmF0aXZlX3N0YXJ0IiwgICAgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0YXJ0fSwKKyAgICB7Im5hdGl2ZV9zdG9wIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdG9wfSwKKyAgICB7Im5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZCIsICAgICIoSSlWIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9hZGRlZH0sCisgICAgeyJuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZCIsICAiKEkpViIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZH0sCisgICAgeyJuYXRpdmVfc2V0X3B0cF9tb2RlIiwgICAgICAgICAiKFopViIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2V0X3B0cF9tb2RlfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL010cFNlcnZlciI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlcihKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlclxuIik7CisKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL010cFNlcnZlciIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmaWVsZF9jb250ZXh0ID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZUNvbnRleHQiLCAiSSIpOworICAgIGlmIChmaWVsZF9jb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBNdHBTZXJ2ZXIubU5hdGl2ZUNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKaW5kZXggNDhiNDVmZi4uZTZmZjY1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKQEAgLTI3LDQgKzI3LDQgQEAKIAogTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKIAotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCA3ZTNiNzQzLi45YzJhOGJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC03NjMsNyArNzYzLDggQEAKICAgICBpZiAoKHBvcENvdW50KGRldmljZSkgPT0gMSApICYmCiAgICAgICAgIChkZXZpY2UgJiAoQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyB8CiAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIHwKLSAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCkpKSB7CisgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQgfAorICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggMGY1NWIxOWQuLjlkZmRjYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtMjIsMTIgKzIyLDE0IEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKICAgICBESVNDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBTRVRfVklERU9fU1VSRkFDRSwKKyAgICBTRVRfVklERU9fSVNVUkZBQ0UsCiAgICAgUFJFUEFSRV9BU1lOQywKICAgICBTVEFSVCwKICAgICBTVE9QLApAQCAtNjUsMTEgKzY3LDIwIEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChESVNDT05ORUNULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIAotICAgIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCisgICAgc3RhdHVzX3Qgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc3VyZmFjZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVklERU9fSVNVUkZBQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIFN1cmZhY2U6OndyaXRlVG9QYXJjZWwoc3VyZmFjZSwgJmRhdGEpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZJREVPX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0yNTYsOSArMjY3LDE1IEBACiAgICAgICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1ZJREVPX1NVUkZBQ0U6IHsKKyAgICAgICAgY2FzZSBTRVRfVklERU9fSVNVUkZBQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElTdXJmYWNlPiBzdXJmYWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFZpZGVvSVN1cmZhY2Uoc3VyZmFjZSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9WSURFT19TVVJGQUNFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gU3VyZmFjZTo6cmVhZEZyb21QYXJjZWwoZGF0YSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRWaWRlb1N1cmZhY2Uoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCmluZGV4IDk0N2ZmMzQuLjU5Y2QxYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiSU1lZGlhUmVjb3JkZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgpAQCAtNDMsNiArNDMsNyBAQAogICAgIFNFVF9BVURJT19FTkNPREVSLAogICAgIFNFVF9PVVRQVVRfRklMRV9QQVRILAogICAgIFNFVF9PVVRQVVRfRklMRV9GRCwKKyAgICBTRVRfT1VUUFVUX0ZJTEVfQVVYSUxJQVJZX0ZELAogICAgIFNFVF9WSURFT19TSVpFLAogICAgIFNFVF9WSURFT19GUkFNRVJBVEUsCiAgICAgU0VUX1BBUkFNRVRFUlMsCkBAIC02OSwxMiArNzAsMTIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKKyAgICBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKICAgICB7CiAgICAgICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlKCVwKSIsIHN1cmZhY2UuZ2V0KCkpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzdXJmYWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgU3VyZmFjZTo6d3JpdGVUb1BhcmNlbChzdXJmYWNlLCAmZGF0YSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJFVklFV19TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTU5LDYgKzE2MCwxNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpIHsKKyAgICAgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSglZCkiLCBmZCk7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlRmlsZURlc2NyaXB0b3IoZmQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX09VVFBVVF9GSUxFX0FVWElMSUFSWV9GRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHN0YXR1c190IHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCiAgICAgewogICAgICAgICBMT0dWKCJzZXRWaWRlb1NpemUoJWR4JWQpIiwgd2lkdGgsIGhlaWdodCk7CkBAIC0zNzcsNiArMzg3LDEzIEBACiAgICAgICAgICAgICA6OmNsb3NlKGZkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfT1VUUFVUX0ZJTEVfQVVYSUxJQVJZX0ZEOiB7CisgICAgICAgICAgICBMT0dWKCJTRVRfT1VUUFVUX0ZJTEVfQVVYSUxJQVJZX0ZEIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBmZCA9IGR1cChkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfVklERU9fU0laRTogewogICAgICAgICAgICAgTE9HVigiU0VUX1ZJREVPX1NJWkUiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOwpAQCAtNDA5LDcgKzQyNiw3IEBACiAgICAgICAgIGNhc2UgU0VUX1BSRVZJRVdfU1VSRkFDRTogewogICAgICAgICAgICAgTE9HVigiU0VUX1BSRVZJRVdfU1VSRkFDRSIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gU3VyZmFjZTo6cmVhZEZyb21QYXJjZWwoZGF0YSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQcmV2aWV3U3VyZmFjZShzdXJmYWNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCmluZGV4IGYzODA0YjguLjQwODAxYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCkBAIC0yMSw3ICsyMSw5IEBACiAgICAgU0VUX1BBUkFNRVRFUiwKICAgICBHRVRfQ09ORklHLAogICAgIFNFVF9DT05GSUcsCisgICAgRU5BQkxFX0dSQVBISUNfQlVGRkVSUywKICAgICBVU0VfQlVGRkVSLAorICAgIFVTRV9HUkFQSElDX0JVRkZFUiwKICAgICBBTExPQ19CVUZGRVIsCiAgICAgQUxMT0NfQlVGRkVSX1dJVEhfQkFDS1VQLAogICAgIEZSRUVfQlVGRkVSLApAQCAtMjE2LDYgKzIxOCwxOSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycygKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCh1aW50MzJfdCllbmFibGUpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRU5BQkxFX0dSQVBISUNfQlVGRkVSUywgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpIHsKQEAgLTIzOCw2ICsyNTMsMjkgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CisgICAgICAgIGRhdGEud3JpdGUoKmdyYXBoaWNCdWZmZXIpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVVNFX0dSQVBISUNfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAqYnVmZmVyID0gMDsKKworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgICpidWZmZXIgPSAodm9pZCopcmVwbHkucmVhZEludFB0cigpOworCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCB2b2lkICoqYnVmZmVyX2RhdGEpIHsKQEAgLTU0MSw2ICs1NzksMjAgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRU5BQkxFX0dSQVBISUNfQlVGRkVSUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIE9NWF9CT09MIGVuYWJsZSA9IChPTVhfQk9PTClkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBlbmFibGVHcmFwaGljQnVmZmVycyhub2RlLCBwb3J0X2luZGV4LCBlbmFibGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBVU0VfQlVGRkVSOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwpAQCAtNTYxLDYgKzYxMywyNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBVU0VfR1JBUEhJQ19CVUZGRVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgqZ3JhcGhpY0J1ZmZlcik7CisKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXI7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSB1c2VHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBncmFwaGljQnVmZmVyLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgQUxMT0NfQlVGRkVSOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCAzODY5Mzg5Li45YWQ2M2YwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtNTksOCArNTksMjEgQEAKIH07CiAKIGNvbnN0IE1lZGlhUHJvZmlsZXM6Ok5hbWVUb1RhZ01hcCBNZWRpYVByb2ZpbGVzOjpzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXBbXSA9IHsKKyAgICB7ImxvdyIsIENBTUNPUkRFUl9RVUFMSVRZX0xPV30sCiAgICAgeyJoaWdoIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSH0sCi0gICAgeyJsb3ciLCAgQ0FNQ09SREVSX1FVQUxJVFlfTE9XfQorICAgIHsicWNpZiIsIENBTUNPUkRFUl9RVUFMSVRZX1FDSUZ9LAorICAgIHsiY2lmIiwgQ0FNQ09SREVSX1FVQUxJVFlfQ0lGfSwKKyAgICB7IjQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV80ODBQfSwKKyAgICB7IjcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV83MjBQfSwKKyAgICB7IjEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFB9LAorCisgICAgeyJ0aW1lbGFwc2Vsb3ciLCAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MT1d9LAorICAgIHsidGltZWxhcHNlaGlnaCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfSElHSH0sCisgICAgeyJ0aW1lbGFwc2VxY2lmIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RQ0lGfSwKKyAgICB7InRpbWVsYXBzZWNpZiIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfQ0lGfSwKKyAgICB7InRpbWVsYXBzZTQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzQ4MFB9LAorICAgIHsidGltZWxhcHNlNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNzIwUH0sCisgICAgeyJ0aW1lbGFwc2UxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFB9CiB9OwogCiAvKnN0YXRpYyovIHZvaWQKQEAgLTQxMSwxNiArNDI0LDE2IEBACiB9CiAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKLU1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJIaWdoUHJvZmlsZSgpCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlUWNpZlByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkKIHsKICAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KLSAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAzNjAwMDAsIDM1MiwgMjg4LCAyMCk7CisgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjKFZJREVPX0VOQ09ERVJfSDI2MywgMTAwMDAwMCwgMTc2LCAxNDQsIDIwKTsKIAogICAgIEF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPSBuZXcgQXVkaW9Db2RlYyhBVURJT19FTkNPREVSX0FNUl9OQiwgMTIyMDAsIDgwMDAsIDEpOwogICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKICAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOwogICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7Ci0gICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBDQU1DT1JERVJfUVVBTElUWV9ISUdIOworICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gcXVhbGl0eTsKICAgICBwcm9maWxlLT5tRHVyYXRpb24gPSA2MDsKICAgICBwcm9maWxlLT5tVmlkZW9Db2RlYyA9IHZpZGVvQ29kZWM7CiAgICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWMgPSBhdWRpb0NvZGVjOwpAQCAtNDI4LDcgKzQ0MSw0MCBAQAogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyTG93UHJvZmlsZSgpCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlNDgwcFByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkKK3sKKyAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KKyAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAyMDAwMDAwMCwgNzIwLCA0ODAsIDIwKTsKKworICAgIEF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPSBuZXcgQXVkaW9Db2RlYyhBVURJT19FTkNPREVSX0FNUl9OQiwgMTIyMDAsIDgwMDAsIDEpOworICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKKyAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOworICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CisgICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBxdWFsaXR5OworICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDYwOworICAgIHByb2ZpbGUtPm1WaWRlb0NvZGVjID0gdmlkZW9Db2RlYzsKKyAgICBwcm9maWxlLT5tQXVkaW9Db2RlYyA9IGF1ZGlvQ29kZWM7CisgICAgcmV0dXJuIHByb2ZpbGU7Cit9CisKKy8qc3RhdGljKi8gdm9pZAorTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZUxvd1Byb2ZpbGVzKAorICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqbG93VGltZUxhcHNlUHJvZmlsZSwKKyAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmxvd1NwZWNpZmljVGltZUxhcHNlUHJvZmlsZSkgeworICAgICpsb3dUaW1lTGFwc2VQcm9maWxlID0gY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZVFjaWZQcm9maWxlKENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XKTsKKyAgICAqbG93U3BlY2lmaWNUaW1lTGFwc2VQcm9maWxlID0gY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZVFjaWZQcm9maWxlKENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUNJRik7Cit9CisKKy8qc3RhdGljKi8gdm9pZAorTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZUhpZ2hQcm9maWxlcygKKyAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmhpZ2hUaW1lTGFwc2VQcm9maWxlLAorICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqaGlnaFNwZWNpZmljVGltZUxhcHNlUHJvZmlsZSkgeworICAgICpoaWdoVGltZUxhcHNlUHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2U0ODBwUHJvZmlsZShDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0hJR0gpOworICAgICpoaWdoU3BlY2lmaWNUaW1lTGFwc2VQcm9maWxlID0gY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZTQ4MHBQcm9maWxlKENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNDgwUCk7Cit9CisKKy8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJRY2lmUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KQogewogICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKnZpZGVvQ29kZWMgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyhWSURFT19FTkNPREVSX0gyNjMsIDE5MjAwMCwgMTc2LCAxNDQsIDIwKTsKQEAgLTQzOSwxOCArNDg1LDcyIEBACiAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOwogICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IDA7CiAgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKLSAgICBwcm9maWxlLT5tUXVhbGl0eSA9IENBTUNPUkRFUl9RVUFMSVRZX0xPVzsKKyAgICBwcm9maWxlLT5tUXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgcHJvZmlsZS0+bUR1cmF0aW9uID0gMzA7CiAgICAgcHJvZmlsZS0+bVZpZGVvQ29kZWMgPSB2aWRlb0NvZGVjOwogICAgIHByb2ZpbGUtPm1BdWRpb0NvZGVjID0gYXVkaW9Db2RlYzsKICAgICByZXR1cm4gcHJvZmlsZTsKIH0KIAorLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKgorTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlckNpZlByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkKK3sKKyAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KKyAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAzNjAwMDAsIDM1MiwgMjg4LCAyMCk7CisKKyAgICBBdWRpb0NvZGVjICphdWRpb0NvZGVjID0gbmV3IEF1ZGlvQ29kZWMoQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwLCA4MDAwLCAxKTsKKyAgICBDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CisgICAgcHJvZmlsZS0+bUNhbWVyYUlkID0gMDsKKyAgICBwcm9maWxlLT5tRmlsZUZvcm1hdCA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOworICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gcXVhbGl0eTsKKyAgICBwcm9maWxlLT5tRHVyYXRpb24gPSA2MDsKKyAgICBwcm9maWxlLT5tVmlkZW9Db2RlYyA9IHZpZGVvQ29kZWM7CisgICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWMgPSBhdWRpb0NvZGVjOworICAgIHJldHVybiBwcm9maWxlOworfQorCisvKnN0YXRpYyovIHZvaWQKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJMb3dQcm9maWxlcygKKyAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmxvd1Byb2ZpbGUsCisgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipsb3dTcGVjaWZpY1Byb2ZpbGUpIHsKKyAgICAqbG93UHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJRY2lmUHJvZmlsZShDQU1DT1JERVJfUVVBTElUWV9MT1cpOworICAgICpsb3dTcGVjaWZpY1Byb2ZpbGUgPSBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyUWNpZlByb2ZpbGUoQ0FNQ09SREVSX1FVQUxJVFlfUUNJRik7Cit9CisKKy8qc3RhdGljKi8gdm9pZAorTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlcygKKyAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmhpZ2hQcm9maWxlLAorICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqaGlnaFNwZWNpZmljUHJvZmlsZSkgeworICAgICpoaWdoUHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJDaWZQcm9maWxlKENBTUNPUkRFUl9RVUFMSVRZX0hJR0gpOworICAgICpoaWdoU3BlY2lmaWNQcm9maWxlID0gY3JlYXRlRGVmYXVsdENhbWNvcmRlckNpZlByb2ZpbGUoQ0FNQ09SREVSX1FVQUxJVFlfQ0lGKTsKK30KKwogLypzdGF0aWMqLyB2b2lkCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyUHJvZmlsZXMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpCiB7Ci0gICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoY3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlKCkpOwotICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJMb3dQcm9maWxlKCkpOworICAgIC8vIGxvdyBjYW1jb3JkZXIgcHJvZmlsZXMuCisgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqbG93UHJvZmlsZSwgKmxvd1NwZWNpZmljUHJvZmlsZTsKKyAgICBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyTG93UHJvZmlsZXMoJmxvd1Byb2ZpbGUsICZsb3dTcGVjaWZpY1Byb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGxvd1Byb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGxvd1NwZWNpZmljUHJvZmlsZSk7CisKKyAgICAvLyBoaWdoIGNhbWNvcmRlciBwcm9maWxlcy4KKyAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKiBoaWdoUHJvZmlsZSwgKmhpZ2hTcGVjaWZpY1Byb2ZpbGU7CisgICAgY3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlcygmaGlnaFByb2ZpbGUsICZoaWdoU3BlY2lmaWNQcm9maWxlKTsKKyAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChoaWdoUHJvZmlsZSk7CisgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoaGlnaFNwZWNpZmljUHJvZmlsZSk7CisKKyAgICAvLyBsb3cgY2FtY29yZGVyIHRpbWUgbGFwc2UgcHJvZmlsZXMuCisgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqbG93VGltZUxhcHNlUHJvZmlsZSwgKmxvd1NwZWNpZmljVGltZUxhcHNlUHJvZmlsZTsKKyAgICBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlTG93UHJvZmlsZXMoJmxvd1RpbWVMYXBzZVByb2ZpbGUsICZsb3dTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGxvd1RpbWVMYXBzZVByb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGxvd1NwZWNpZmljVGltZUxhcHNlUHJvZmlsZSk7CisKKyAgICAvLyBoaWdoIGNhbWNvcmRlciB0aW1lIGxhcHNlIHByb2ZpbGVzLgorICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKmhpZ2hUaW1lTGFwc2VQcm9maWxlLCAqaGlnaFNwZWNpZmljVGltZUxhcHNlUHJvZmlsZTsKKyAgICBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlSGlnaFByb2ZpbGVzKCZoaWdoVGltZUxhcHNlUHJvZmlsZSwgJmhpZ2hTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGhpZ2hUaW1lTGFwc2VQcm9maWxlKTsKKyAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChoaWdoU3BlY2lmaWNUaW1lTGFwc2VQcm9maWxlKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCkBAIC02NjgsMTMgKzc2OCw4IEBACiAgICAgcmV0dXJuIGRlY29kZXJzOyAgLy8gY29weSBvdXQKIH0KIAotaW50IE1lZGlhUHJvZmlsZXM6OmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0CitpbnQgTWVkaWFQcm9maWxlczo6Z2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGludCBjYW1lcmFJZCwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKIHsKLSAgICBMT0dWKCJnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWU6ICVzIGZvciBjYW1lcmEgJWQsIHF1YWxpdHkgJWQiLAotICAgICAgICAgbmFtZSwgY2FtZXJhSWQsIHF1YWxpdHkpOwotCiAgICAgaW50IGluZGV4ID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIG4gPSBtQ2FtY29yZGVyUHJvZmlsZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CiAgICAgICAgIGlmIChtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1DYW1lcmFJZCA9PSBjYW1lcmFJZCAmJgpAQCAtNjgzLDYgKzc3OCwxNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIGluZGV4OworfQorCitpbnQgTWVkaWFQcm9maWxlczo6Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKK3sKKyAgICBMT0dWKCJnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWU6ICVzIGZvciBjYW1lcmEgJWQsIHF1YWxpdHkgJWQiLAorICAgICAgICAgbmFtZSwgY2FtZXJhSWQsIHF1YWxpdHkpOworCisgICAgaW50IGluZGV4ID0gZ2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGNhbWVyYUlkLCBxdWFsaXR5KTsKICAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgICAgTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIGNhbWVyYSAlZCBxdWFsaXR5ICVkIGlzIG5vdCBmb3VuZCIsCiAgICAgICAgICAgICAgY2FtZXJhSWQsIHF1YWxpdHkpOwpAQCAtNzA1LDYgKzgxMSwxMSBAQAogICAgIHJldHVybiAtMTsKIH0KIAorYm9vbCBNZWRpYVByb2ZpbGVzOjpoYXNDYW1jb3JkZXJQcm9maWxlKGludCBjYW1lcmFJZCwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKK3sKKyAgICByZXR1cm4gKGdldENhbWNvcmRlclByb2ZpbGVJbmRleChjYW1lcmFJZCwgcXVhbGl0eSkgIT0gLTEpOworfQorCiBWZWN0b3I8aW50PiBNZWRpYVByb2ZpbGVzOjpnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhpbnQgY2FtZXJhSWQpIGNvbnN0CiB7CiAgICAgVmVjdG9yPGludD4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggYzUxMTJhNS4uYzMxYjYyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC00OCw4ICs0OCw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhU2Nhbm5lcjo6cHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZXh0ZW5zaW9ucywKLSAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsCisgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAogICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KSB7CiAgICAgaW50IHBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7CiAgICAgaWYgKHBhdGhMZW5ndGggPj0gUEFUSF9NQVgpIHsKQEAgLTcyLDM1ICs3MSwxNiBAQAogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0KICAgICAgICAgZG9Qcm9jZXNzRGlyZWN0b3J5KAotICAgICAgICAgICAgICAgIHBhdGhCdWZmZXIsIHBhdGhSZW1haW5pbmcsIGV4dGVuc2lvbnMsIGNsaWVudCwKLSAgICAgICAgICAgICAgICBleGNlcHRpb25DaGVjaywgZXhjZXB0aW9uRW52KTsKKyAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLCBwYXRoUmVtYWluaW5nLCBjbGllbnQsIGV4Y2VwdGlvbkNoZWNrLCBleGNlcHRpb25FbnYpOwogCiAgICAgZnJlZShwYXRoQnVmZmVyKTsKIAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBib29sIGZpbGVNYXRjaGVzRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMpIHsKLSAgICBjb25zdCBjaGFyKiBleHRlbnNpb24gPSBzdHJyY2hyKHBhdGgsICcuJyk7Ci0gICAgaWYgKCFleHRlbnNpb24pIHJldHVybiBmYWxzZTsKLSAgICArK2V4dGVuc2lvbjsgICAgLy8gc2tpcCB0aGUgZG90Ci0gICAgaWYgKGV4dGVuc2lvblswXSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgICB3aGlsZSAoZXh0ZW5zaW9uc1swXSkgewotICAgICAgICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihleHRlbnNpb25zLCAnLCcpOwotICAgICAgICBzaXplX3QgbGVuZ3RoID0gKGNvbW1hID8gY29tbWEgLSBleHRlbnNpb25zIDogc3RybGVuKGV4dGVuc2lvbnMpKTsKLSAgICAgICAgaWYgKGxlbmd0aCA9PSBzdHJsZW4oZXh0ZW5zaW9uKSAmJiBzdHJuY2FzZWNtcChleHRlbnNpb24sIGV4dGVuc2lvbnMsIGxlbmd0aCkgPT0gMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGV4dGVuc2lvbnMgKz0gbGVuZ3RoOwotICAgICAgICBpZiAoZXh0ZW5zaW9uc1swXSA9PSAnLCcpICsrZXh0ZW5zaW9uczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHN0YXR1c190IE1lZGlhU2Nhbm5lcjo6ZG9Qcm9jZXNzRGlyZWN0b3J5KAotICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgY29uc3QgY2hhciAqZXh0ZW5zaW9ucywKLSAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsIEV4Y2VwdGlvbkNoZWNrIGV4Y2VwdGlvbkNoZWNrLAotICAgICAgICB2b2lkICpleGNlcHRpb25FbnYpIHsKKyAgICAgICAgY2hhciAqcGF0aCwgaW50IHBhdGhSZW1haW5pbmcsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAorICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KSB7CiAgICAgLy8gcGxhY2UgdG8gY29weSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lCiAgICAgY2hhciogZmlsZVNwb3QgPSBwYXRoICsgc3RybGVuKHBhdGgpOwogICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OwpAQCAtMTMzLDYgKzExMywxMyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKKyAgICAgICAgaWYgKG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykgeworICAgICAgICAgICAgLy8gcGF0aCB0b28gbG9uZyEKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7CisKICAgICAgICAgaW50IHR5cGUgPSBlbnRyeS0+ZF90eXBlOwogICAgICAgICBpZiAodHlwZSA9PSBEVF9VTktOT1dOKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgdHlwZSBpcyB1bmtub3duLCBzdGF0KCkgdGhlIGZpbGUgaW5zdGVhZC4KQEAgLTE1MCwyOSArMTM3LDIwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgPT0gRFRfUkVHIHx8IHR5cGUgPT0gRFRfRElSKSB7Ci0gICAgICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKLSAgICAgICAgICAgIGJvb2wgaXNEaXJlY3RvcnkgPSAodHlwZSA9PSBEVF9ESVIpOwotCi0gICAgICAgICAgICBpZiAobmFtZUxlbmd0aCA+IHBhdGhSZW1haW5pbmcgfHwgKGlzRGlyZWN0b3J5ICYmIG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXRoIHRvbyBsb25nIQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJjcHkoZmlsZVNwb3QsIG5hbWUpOwotICAgICAgICAgICAgaWYgKGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBEVF9ESVIpIHsKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZGlyZWN0b3JpZXMgd2l0aCBhIG5hbWUgdGhhdCBzdGFydHMgd2l0aCAnLicKICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgdGhlIE1hYyAiLlRyYXNoZXMiIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgY29udGludWU7CiAKICAgICAgICAgICAgICAgICBzdHJjYXQoZmlsZVNwb3QsICIvIik7Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IGRvUHJvY2Vzc0RpcmVjdG9yeShwYXRoLCBwYXRoUmVtYWluaW5nIC0gbmFtZUxlbmd0aCAtIDEsIGV4dGVuc2lvbnMsIGNsaWVudCwgZXhjZXB0aW9uQ2hlY2ssIGV4Y2VwdGlvbkVudik7CisgICAgICAgICAgICAgICAgaW50IGVyciA9IGRvUHJvY2Vzc0RpcmVjdG9yeShwYXRoLCBwYXRoUmVtYWluaW5nIC0gbmFtZUxlbmd0aCAtIDEsIGNsaWVudCwgZXhjZXB0aW9uQ2hlY2ssIGV4Y2VwdGlvbkVudik7CiAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIGV4Y2VwdGlvbnMgdXAgLSBpZ25vcmUgb3RoZXIgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25DaGVjayAmJiBleGNlcHRpb25DaGVjayhleGNlcHRpb25FbnYpKSBnb3RvIGZhaWx1cmU7CiAgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIHByb2Nlc3NpbmcgJyVzJyAtIHNraXBwaW5nXG4iLCBwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlTWF0Y2hlc0V4dGVuc2lvbihwYXRoLCBleHRlbnNpb25zKSkgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogICAgICAgICAgICAgICAgIHN0YXQocGF0aCwgJnN0YXRidWYpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0YnVmLnN0X3NpemUgPiAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggYzZiMmVmYi4uZGExZjdlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtMjA2LDEwICsyMDYsMTUgQEAKICAgICBMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChzdXJmYWNlICE9IE5VTEwpCi0gICAgICAgIHJldHVybiAgbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlKHN1cmZhY2UtPmdldElTdXJmYWNlKCkpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2UoTlVMTCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRWaWRlb0lTdXJmYWNlKAorICAgICAgICAgICAgc3VyZmFjZSA9PSBOVUxMID8gTlVMTCA6IHN1cmZhY2UtPmdldElTdXJmYWNlKCkpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2Uoc3VyZmFjZSk7CiB9CiAKIC8vIG11c3QgY2FsbCB3aXRoIGxvY2sgaGVsZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCA5ZDUzYzI1Li41MWQ5MWZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3RhdHVzX3QgcmV0ID0gbU1lZGlhUmVjb3JkZXItPnNldFByZXZpZXdTdXJmYWNlKHN1cmZhY2UtPmdldElTdXJmYWNlKCkpOworICAgIHN0YXR1c190IHJldCA9IG1NZWRpYVJlY29yZGVyLT5zZXRQcmV2aWV3U3VyZmFjZShzdXJmYWNlKTsKICAgICBpZiAoT0sgIT0gcmV0KSB7CiAgICAgICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlIGZhaWxlZDogJWQiLCByZXQpOwogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUkVDT1JERVJfRVJST1I7CkBAIC0zMDgsNiArMzA4LDMyIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpCit7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSglZCkiLCBmZCk7CisgICAgaWYobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1Jc0F1eGlsaWFyeU91dHB1dEZpbGVTZXQpIHsKKyAgICAgICAgTE9HRSgib3V0cHV0IGZpbGUgaGFzIGFscmVhZHkgYmVlbiBzZXQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgTUVESUFfUkVDT1JERVJfREFUQVNPVVJDRV9DT05GSUdVUkVEKSkgeworICAgICAgICBMT0dFKCJzZXRPdXRwdXRGaWxlIGNhbGxlZCBpbiBhbiBpbnZhbGlkIHN0YXRlKCVkKSIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gbU1lZGlhUmVjb3JkZXItPnNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSBmYWlsZWQ6ICVkIiwgcmV0KTsKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1JFQ09SREVSX0VSUk9SOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0ID0gdHJ1ZTsKKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIExPR1YoInNldFZpZGVvU2l6ZSglZCwgJWQpIiwgd2lkdGgsIGhlaWdodCk7CkBAIC01NzEsNiArNTk3LDcgQEAKICAgICBtSXNBdWRpb0VuY29kZXJTZXQgPSBmYWxzZTsKICAgICBtSXNWaWRlb0VuY29kZXJTZXQgPSBmYWxzZTsKICAgICBtSXNPdXRwdXRGaWxlU2V0ICAgPSBmYWxzZTsKKyAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0ID0gZmFsc2U7CiB9CiAKIC8vIFJlbGVhc2Ugc2hvdWxkIGJlIE9LIGluIGFueSBzdGF0ZQpAQCAtNjQzLDQgKzY3MCwzIEBACiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggZDk3NWNiOS4uODc3ZTc4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTg5MSw3ICs4OTEsMTUgQEAKICAgICByZXR1cm4gbVN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCit7CisgICAgTE9HVigiWyVkXSBzZXRWaWRlb0lTdXJmYWNlKCVwKSIsIG1Db25uSWQsIHN1cmZhY2UuZ2V0KCkpOworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5zZXRWaWRlb0lTdXJmYWNlKHN1cmZhY2UpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogewogICAgIExPR1YoIlslZF0gc2V0VmlkZW9TdXJmYWNlKCVwKSIsIG1Db25uSWQsIHN1cmZhY2UuZ2V0KCkpOwogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IGE5NjdlZTIuLmRlYjQ1OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTIwNCw3ICsyMDQsOCBAQAogCiAgICAgICAgIC8vIElNZWRpYVBsYXllciBpbnRlcmZhY2UKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnQoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IDE5OTE1ZjEuLmJlNmE4YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTcwLDcgKzcwLDcgQEAKICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRDYW1lcmEoY2FtZXJhKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiB7CiAgICAgTE9HVigic2V0UHJldmlld1N1cmZhY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xNjQsNiArMTY0LDE3IEBACiAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0T3V0cHV0RmlsZShmZCwgb2Zmc2V0LCBsZW5ndGgpOwogfQogCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkKK3sKKyAgICBMT0dWKCJzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KCVkKSIsIGZkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1SZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoInJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShmZCk7Cit9CisKIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7CiAgICAgTE9HVigic2V0VmlkZW9TaXplKCVkeCVkKSIsIHdpZHRoLCBoZWlnaHQpOwpAQCAtMzM3LDQgKzM0OCwzIEBACiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCmluZGV4IDFkMTkxM2QuLmZkZWQ5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMjksNyArMjksNyBAQAogewogcHVibGljOgogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9Tb3VyY2UoaW50IHZzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9Tb3VyY2UoaW50IGFzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0Rm9ybWF0KGludCBvZik7CkBAIC0zNyw2ICszNyw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqIHBhdGgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwpAQCAtNjYsNCArNjcsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFSRUNPUkRFUkNMSUVOVF9ICi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKaW5kZXggNGE2MGVjZS4uMDZlNGI3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKQEAgLTM1LDcgKzM1LDggQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlQXN5bmMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAppbmRleCAyYzk2ZDZkLi42YjliZjg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKQEAgLTQ0LDEzICs0NCwyMCBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKGR1cChmZCksIG9mZnNldCwgbGVuZ3RoKTsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIExPR1YoInNldFZpZGVvSVN1cmZhY2UiKTsKIAogICAgIG1QbGF5ZXItPnNldElTdXJmYWNlKHN1cmZhY2UpOwogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIExPR1YoInNldFZpZGVvU3VyZmFjZSIpOworCisgICAgbVBsYXllci0+c2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpwcmVwYXJlKCkgewogICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCmluZGV4IDc4MWViNDQuLmRkMzcxMDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCkBAIC0zNSw3ICszNSw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggY2YwMWZmNi4uMDZkNWNkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMjAsMTAgKzIwLDEyIEBACiAKICNpbmNsdWRlICJTdGFnZWZyaWdodFJlY29yZGVyLmgiCiAKLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0zMiwyMSArMzQsMjAgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgotI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJBUlRQV3JpdGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU3RhZ2VmcmlnaHRSZWNvcmRlcjo6U3RhZ2VmcmlnaHRSZWNvcmRlcigpCi0gICAgOiBtV3JpdGVyKE5VTEwpLAotICAgICAgbU91dHB1dEZkKC0xKSB7CisgICAgOiBtV3JpdGVyKE5VTEwpLCBtV3JpdGVyQXV4KE5VTEwpLAorICAgICAgbU91dHB1dEZkKC0xKSwgbU91dHB1dEZkQXV4KC0xKSB7CiAKICAgICBMT0dWKCJDb25zdHJ1Y3RvciIpOwogICAgIHJlc2V0KCk7CkBAIC0xODEsMjYgKzE4MiwxMSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIG1GbGFncyAmPSB+RkxBR1NfSE9UX0NBTUVSQTsKLSAgICBtQ2FtZXJhID0gQ2FtZXJhOjpjcmVhdGUoY2FtZXJhKTsKLSAgICBpZiAobUNhbWVyYSA9PSAwKSB7Ci0gICAgICAgIExPR0UoIlVuYWJsZSB0byBjb25uZWN0IHRvIGNhbWVyYSIpOwotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0KLSAgICBMT0dWKCJDb25uZWN0ZWQgdG8gY2FtZXJhIik7Ci0gICAgaWYgKG1DYW1lcmEtPnByZXZpZXdFbmFibGVkKCkpIHsKLSAgICAgICAgTE9HVigiY2FtZXJhIGlzIGhvdCIpOwotICAgICAgICBtRmxhZ3MgfD0gRkxBR1NfSE9UX0NBTUVSQTsKLSAgICB9Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0KKyAgICBtQ2FtZXJhID0gY2FtZXJhOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewogICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlOiAlcCIsIHN1cmZhY2UuZ2V0KCkpOwogICAgIG1QcmV2aWV3U3VyZmFjZSA9IHN1cmZhY2U7CiAKQEAgLTIzNCw2ICsyMjAsMjQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSB7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeTogJWQiLCBmZCk7CisKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiAlZCIsIGZkKTsKKyAgICAgICAgcmV0dXJuIC1FQkFERjsKKyAgICB9CisKKyAgICBtQ2FwdHVyZUF1eFZpZGVvID0gdHJ1ZTsKKworICAgIGlmIChtT3V0cHV0RmRBdXggPj0gMCkgeworICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZEF1eCk7CisgICAgfQorICAgIG1PdXRwdXRGZEF1eCA9IGR1cChmZCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIC8vIEF0dGVtcHQgdG8gcGFyc2UgYW4gaW50NjQgbGl0ZXJhbCBvcHRpb25hbGx5IHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZSwKIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCiBzdGF0aWMgYm9vbCBzYWZlX3N0cnRvaTY0KGNvbnN0IGNoYXIgKnMsIGludDY0X3QgKnZhbCkgewpAQCAtNDczLDYgKzQ3Nyw2OCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1UaW1lTGFwc2VFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZTogJWQiLCB0aW1lTGFwc2VFbmFibGUpOworCisgICAgaWYodGltZUxhcHNlRW5hYmxlID09IDApIHsKKyAgICAgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHRpbWVMYXBzZUVuYWJsZSA9PSAxKSB7CisgICAgICAgIG1DYXB0dXJlVGltZUxhcHNlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlOiAlbGxkIHVzIiwgdGltZVVzKTsKKworICAgIC8vIE5vdCBhbGxvd2luZyB0aW1lIG1vcmUgdGhhbiBhIGRheQorICAgIGlmICh0aW1lVXMgPD0gMCB8fCB0aW1lVXMgPiA4NjQwMCoxRTYpIHsKKyAgICAgICAgTE9HRSgiVGltZSBiZXR3ZWVuIHRpbWUgbGFwc2UgZnJhbWUgY2FwdHVyZSAoJWxsZCkgaXMgb3V0IG9mIHJhbmdlIFswLCAxIERheV0iLCB0aW1lVXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gdGltZVVzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdXhWaWRlb1dpZHRoKGludDMyX3Qgd2lkdGgpIHsKKyAgICBMT0dWKCJzZXRQYXJhbUF1eFZpZGVvV2lkdGggOiAlZCIsIHdpZHRoKTsKKworICAgIGlmICh3aWR0aCA8PSAwKSB7CisgICAgICAgIExPR0UoIldpZHRoICglZCkgaXMgbm90IHBvc2l0aXZlIiwgd2lkdGgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1BdXhWaWRlb1dpZHRoID0gd2lkdGg7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0KGludDMyX3QgaGVpZ2h0KSB7CisgICAgTE9HVigic2V0UGFyYW1BdXhWaWRlb0hlaWdodCA6ICVkIiwgaGVpZ2h0KTsKKworICAgIGlmIChoZWlnaHQgPD0gMCkgeworICAgICAgICBMT0dFKCJIZWlnaHQgKCVkKSBpcyBub3QgcG9zaXRpdmUiLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1BdXhWaWRlb0hlaWdodCA9IGhlaWdodDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQXV4VmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgTE9HVigiU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdXhWaWRlb0VuY29kaW5nQml0UmF0ZTogJWQiLCBiaXRSYXRlKTsKKworICAgIGlmIChiaXRSYXRlIDw9IDApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCB2aWRlbyBlbmNvZGluZyBiaXQgcmF0ZTogJWQiLCBiaXRSYXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtQXV4VmlkZW9CaXRSYXRlID0gYml0UmF0ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtZXRlcigKICAgICAgICAgY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSkgewogICAgIExPR1YoInNldFBhcmFtZXRlcjoga2V5ICglcykgPT4gdmFsdWUgKCVzKSIsIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCkpOwpAQCAtNTU2LDYgKzYyMiwzMiBAQAogICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVTY2FsZSkpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvVGltZVNjYWxlKHRpbWVTY2FsZSk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1sYXBzZS1lbmFibGUiKSB7CisgICAgICAgIGludDMyX3QgdGltZUxhcHNlRW5hYmxlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVMYXBzZUVuYWJsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZSh0aW1lTGFwc2VFbmFibGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInRpbWUtYmV0d2Vlbi10aW1lLWxhcHNlLWZyYW1lLWNhcHR1cmUiKSB7CisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoCisgICAgICAgICAgICAgICAgICAgIDEwMDBMTCAqIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLWF1eC1wYXJhbS13aWR0aCIpIHsKKyAgICAgICAgaW50MzJfdCBhdXhXaWR0aDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZhdXhXaWR0aCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1eFZpZGVvV2lkdGgoYXV4V2lkdGgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLWF1eC1wYXJhbS1oZWlnaHQiKSB7CisgICAgICAgIGludDMyX3QgYXV4SGVpZ2h0OworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmF1eEhlaWdodCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0KGF1eEhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tYXV4LXBhcmFtLWVuY29kaW5nLWJpdHJhdGUiKSB7CisgICAgICAgIGludDMyX3QgYXV4VmlkZW9CaXRSYXRlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmF1eFZpZGVvQml0UmF0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1eFZpZGVvRW5jb2RpbmdCaXRSYXRlKGF1eFZpZGVvQml0UmF0ZSk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CiAgICAgfQpAQCAtNzg2LDcgKzg3OCwxNCBAQAogICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CiAgICAgICAgIHNvdXJjZSA9IGNyZWF0ZUF1ZGlvU291cmNlKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoJnNvdXJjZSk7CisKKyAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2U7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCZjYW1lcmFTb3VyY2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoY2FtZXJhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmc291cmNlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtODUwLDU3ICs5NDksMTUgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKCkgewotICAgIGNsaXBWaWRlb0JpdFJhdGUoKTsKLSAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKLSAgICBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7Ci0gICAgY2xpcFZpZGVvRnJhbWVIZWlnaHQoKTsKLQotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIGlmIChtQ2FtZXJhID09IDApIHsKLSAgICAgICAgbUNhbWVyYSA9IENhbWVyYTo6Y29ubmVjdChtQ2FtZXJhSWQpOwotICAgICAgICBpZiAobUNhbWVyYSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJDYW1lcmEgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICB9Ci0gICAgICAgIG1GbGFncyAmPSB+RkxBR1NfSE9UX0NBTUVSQTsKLSAgICAgICAgbUNhbWVyYS0+bG9jaygpOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Y2hlY2tWaWRlb0VuY29kZXJDYXBhYmlsaXRpZXMoKSB7CisgICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSkgeworICAgICAgICAvLyBEb250IGNsaXAgZm9yIHRpbWUgbGFwc2UgY2FwdHVyZSBhcyBlbmNvZGVyIHdpbGwgaGF2ZSBlbm91Z2gKKyAgICAgICAgLy8gdGltZSB0byBlbmNvZGUgYmVjYXVzZSBvZiBzbG93IGNhcHR1cmUgcmF0ZSBvZiB0aW1lIGxhcHNlLgorICAgICAgICBjbGlwVmlkZW9CaXRSYXRlKCk7CisgICAgICAgIGNsaXBWaWRlb0ZyYW1lUmF0ZSgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7CisgICAgICAgIGNsaXBWaWRlb0ZyYW1lSGVpZ2h0KCk7CiAgICAgfQotCi0gICAgLy8gU2V0IHRoZSBhY3R1YWwgdmlkZW8gcmVjb3JkaW5nIGZyYW1lIHNpemUKLSAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCkpOwotICAgIHBhcmFtcy5zZXRQcmV2aWV3U2l6ZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICBwYXJhbXMuc2V0UHJldmlld0ZyYW1lUmF0ZShtRnJhbWVSYXRlKTsKLSAgICBTdHJpbmc4IHMgPSBwYXJhbXMuZmxhdHRlbigpOwotICAgIGlmIChPSyAhPSBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHMpKSB7Ci0gICAgICAgIExPR0UoIkNvdWxkIG5vdCBjaGFuZ2Ugc2V0dGluZ3MuIgotICAgICAgICAgICAgICIgU29tZW9uZSBlbHNlIGlzIHVzaW5nIGNhbWVyYSAlZD8iLCBtQ2FtZXJhSWQpOwotICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgIH0KLSAgICBDYW1lcmFQYXJhbWV0ZXJzIG5ld0NhbWVyYVBhcmFtcyhtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCkpOwotCi0gICAgLy8gQ2hlY2sgb24gdmlkZW8gZnJhbWUgc2l6ZQotICAgIGludCBmcmFtZVdpZHRoID0gMCwgZnJhbWVIZWlnaHQgPSAwOwotICAgIG5ld0NhbWVyYVBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmZnJhbWVXaWR0aCwgJmZyYW1lSGVpZ2h0KTsKLSAgICBpZiAoZnJhbWVXaWR0aCAgPCAwIHx8IGZyYW1lV2lkdGggICE9IG1WaWRlb1dpZHRoIHx8Ci0gICAgICAgIGZyYW1lSGVpZ2h0IDwgMCB8fCBmcmFtZUhlaWdodCAhPSBtVmlkZW9IZWlnaHQpIHsKLSAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCB0aGUgdmlkZW8gZnJhbWUgc2l6ZSB0byAlZHglZCIsCi0gICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBvbiB2aWRlbyBmcmFtZSByYXRlCi0gICAgaW50IGZyYW1lUmF0ZSA9IG5ld0NhbWVyYVBhcmFtcy5nZXRQcmV2aWV3RnJhbWVSYXRlKCk7Ci0gICAgaWYgKGZyYW1lUmF0ZSA8IDAgfHwgKGZyYW1lUmF0ZSAtIG1GcmFtZVJhdGUpICE9IDApIHsKLSAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBmcmFtZSByYXRlIHRvICVkIGZwcy4gVGhlIGFjdHVhbCAiCi0gICAgICAgICAgICAgImZyYW1lIHJhdGUgaXMgJWQiLCBtRnJhbWVSYXRlLCBmcmFtZVJhdGUpOwotICAgIH0KLQotICAgIC8vIFRoaXMgQ0hFQ0sgaXMgZ29vZCwgc2luY2Ugd2UganVzdCBwYXNzZWQgdGhlIGxvY2svdW5sb2NrCi0gICAgLy8gY2hlY2sgZWFybGllciBieSBjYWxsaW5nIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMoKS4KLSAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c2V0UHJldmlld0Rpc3BsYXkobVByZXZpZXdTdXJmYWNlKSk7Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC05MjEsMTcgKzk3OCwzMyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSkgeworICAgIFNpemUgdmlkZW9TaXplOworICAgIHZpZGVvU2l6ZS53aWR0aCA9IG1WaWRlb1dpZHRoOworICAgIHZpZGVvU2l6ZS5oZWlnaHQgPSBtVmlkZW9IZWlnaHQ7CisgICAgaWYgKG1DYXB0dXJlVGltZUxhcHNlKSB7CisgICAgICAgIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UgPSBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNyZWF0ZUZyb21DYW1lcmEoCisgICAgICAgICAgICAgICAgbUNhbWVyYSwgbUNhbWVyYUlkLAorICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgbUZyYW1lUmF0ZSwgbVByZXZpZXdTdXJmYWNlLAorICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKKyAgICAgICAgKmNhbWVyYVNvdXJjZSA9IG1DYW1lcmFTb3VyY2VUaW1lTGFwc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmNhbWVyYVNvdXJjZSA9IENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYSgKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLCBtQ2FtZXJhSWQsIHZpZGVvU2l6ZSwgbUZyYW1lUmF0ZSwgbVByZXZpZXdTdXJmYWNlKTsKKyAgICB9CisgICAgQ0hFQ0soKmNhbWVyYVNvdXJjZSAhPSBOVUxMKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCisgICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAorICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKnNvdXJjZSkgewogICAgIHNvdXJjZS0+Y2xlYXIoKTsKIAotICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCk7Ci0gICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKLQotICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlID0gQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tQ2FtZXJhKG1DYW1lcmEpOwotICAgIENIRUNLKGNhbWVyYVNvdXJjZSAhPSBOVUxMKTsKLQogICAgIHNwPE1ldGFEYXRhPiBlbmNfbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1WaWRlb0JpdFJhdGUpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgdmlkZW9CaXRSYXRlKTsKICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1GcmFtZVJhdGUpOwogCiAgICAgc3dpdGNoIChtVmlkZW9FbmNvZGVyKSB7CkBAIC05NzUsMTQgKzEwNDgsMjQgQEAKICAgICB9CiAgICAgaWYgKG1WaWRlb0VuY29kZXJMZXZlbCAhPSAtMSkgewogICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIG1WaWRlb0VuY29kZXJMZXZlbCk7CisgICAgfSBlbHNlIGlmIChtQ2FwdHVyZVRpbWVMYXBzZSkgeworICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgdXNpbmcgaGlnaCByZXNvbHV0aW9uIGFuZC9vciBoaWdoIGJpdHJhdGUgYW5kCisgICAgICAgIC8vIHNldCBhcHByb3ByaWF0ZSBsZXZlbCBmb3IgdGhlIHNvZnR3YXJlIEFWQ0VuY29kZXIuCisgICAgICAgIGlmICgod2lkdGggKiBoZWlnaHQgPj0gOTIxNjAwKSAvLyA3MjBwCisgICAgICAgICAgICAgICAgfHwgKHZpZGVvQml0UmF0ZSA+PSAyMDAwMDAwMCkpIHsKKyAgICAgICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwgNTApOworICAgICAgICB9CiAgICAgfQogCiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCBPSyk7CiAKKyAgICAvLyBVc2Ugc29mdHdhcmUgY29kZWMgZm9yIHRpbWUgbGFwc2UKKyAgICB1aW50MzJfdCBlbmNvZGVyX2ZsYWdzID0gKG1DYXB0dXJlVGltZUxhcHNlKSA/IE9NWENvZGVjOjprUHJlZmVyU29mdHdhcmVDb2RlY3MgOiAwOwogICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKICAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jX21ldGEsCi0gICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSk7CisgICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSwKKyAgICAgICAgICAgIE5VTEwsIGVuY29kZXJfZmxhZ3MpOwogICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMTAxMyw1MSArMTA5NiwxNDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzRSZWNvcmRpbmcoKSB7Ci0gICAgaW50MzJfdCB0b3RhbEJpdFJhdGUgPSAwOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNFJlY29yZGluZygKKyAgICAgICAgYm9vbCB1c2VTcGxpdENhbWVyYVNvdXJjZSwKKyAgICAgICAgaW50IG91dHB1dEZkLAorICAgICAgICBpbnQzMl90IHZpZGVvV2lkdGgsIGludDMyX3QgdmlkZW9IZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAorICAgICAgICBpbnQzMl90ICp0b3RhbEJpdFJhdGUsCisgICAgICAgIHNwPE1lZGlhV3JpdGVyPiAqbWVkaWFXcml0ZXIpIHsKKyAgICBtZWRpYVdyaXRlci0+Y2xlYXIoKTsKKyAgICAqdG90YWxCaXRSYXRlID0gMDsKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGR1cChtT3V0cHV0RmQpKTsKKyAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGR1cChvdXRwdXRGZCkpOwogCiAgICAgLy8gQWRkIGF1ZGlvIHNvdXJjZSBmaXJzdCBpZiBpdCBleGlzdHMKLSAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpKSB7CiAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7Ci0gICAgICAgIHRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgICAgICAqdG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7CiAgICAgfQogICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0RFRkFVTFQKICAgICAgICAgICAgIHx8IG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfQ0FNRVJBKSB7CisKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYU1lZGlhU291cmNlOworICAgICAgICBpZiAodXNlU3BsaXRDYW1lcmFTb3VyY2UpIHsKKyAgICAgICAgICAgIExPR1YoIlVzaW5nIFNwbGl0IGNhbWVyYSBzb3VyY2UiKTsKKyAgICAgICAgICAgIGNhbWVyYU1lZGlhU291cmNlID0gbUNhbWVyYVNvdXJjZVNwbGl0dGVyLT5jcmVhdGVDbGllbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlOworICAgICAgICAgICAgZXJyID0gc2V0dXBDYW1lcmFTb3VyY2UoJmNhbWVyYVNvdXJjZSk7CisgICAgICAgICAgICBjYW1lcmFNZWRpYVNvdXJjZSA9IGNhbWVyYVNvdXJjZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHZpZGVvV2lkdGggIT0gbVZpZGVvV2lkdGgpIHx8ICh2aWRlb0hlaWdodCAhPSBtVmlkZW9IZWlnaHQpKSB7CisgICAgICAgICAgICAvLyBVc2UgZG93bnNhbXBsaW5nIGZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZS4KKyAgICAgICAgICAgIGNhbWVyYU1lZGlhU291cmNlID0KKyAgICAgICAgICAgICAgICBuZXcgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcihjYW1lcmFNZWRpYVNvdXJjZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKwogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlcjsKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoJmVuY29kZXIpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihjYW1lcmFNZWRpYVNvdXJjZSwgdmlkZW9CaXRSYXRlLCAmZW5jb2Rlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKwogICAgICAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKLSAgICAgICAgdG90YWxCaXRSYXRlICs9IG1WaWRlb0JpdFJhdGU7CisgICAgICAgICp0b3RhbEJpdFJhdGUgKz0gdmlkZW9CaXRSYXRlOwogICAgIH0KIAogICAgIGlmIChtSW50ZXJsZWF2ZUR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+CiAgICAgICAgICAgICBzZXRJbnRlcmxlYXZlRHVyYXRpb24obUludGVybGVhdmVEdXJhdGlvblVzKTsKICAgICB9Ci0KICAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKICAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24obU1heEZpbGVEdXJhdGlvblVzKTsKICAgICB9CiAgICAgaWYgKG1NYXhGaWxlU2l6ZUJ5dGVzICE9IDApIHsKICAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgfQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzeXN0ZW1UaW1lKCkgLyAxMDAwKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG1PdXRwdXRGb3JtYXQpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCB0b3RhbEJpdFJhdGUpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOworCisgICAgd3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOworICAgICptZWRpYVdyaXRlciA9IHdyaXRlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNE1ldGFEYXRhKGludDY0X3Qgc3RhcnRUaW1lVXMsIGludDMyX3QgdG90YWxCaXRSYXRlLAorICAgICAgICBzcDxNZXRhRGF0YT4gKm1ldGEpIHsKKyAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VGltZSwgc3RhcnRUaW1lVXMpOworICAgICgqbWV0YSktPnNldEludDMyKGtLZXlGaWxlVHlwZSwgbU91dHB1dEZvcm1hdCk7CisgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHRvdGFsQml0UmF0ZSk7CisgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgbVVzZTY0Qml0RmlsZU9mZnNldCk7CiAgICAgaWYgKG1Nb3ZpZVRpbWVTY2FsZSA+IDApIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbU1vdmllVGltZVNjYWxlKTsKKyAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbU1vdmllVGltZVNjYWxlKTsKICAgICB9CiAgICAgaWYgKG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPiAwKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOworICAgICAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKICAgICB9Ci0gICAgd3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwotICAgIG1Xcml0ZXIgPSB3cml0ZXI7Ci0gICAgcmV0dXJuIG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUc0UmVjb3JkaW5nKCkgeworICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7CisgICAgICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgICAgIExPR0UoIkF1eGlsaWFyeSB2aWRlbyBjYW4gYmUgY2FwdHVyZWQgb25seSBpbiB0aW1lIGxhcHNlIG1vZGUiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIExPR1YoIkNyZWF0aW5nIE1lZGlhU291cmNlU3BsaXR0ZXIiKTsKKyAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2U7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCZjYW1lcmFTb3VyY2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIG1DYW1lcmFTb3VyY2VTcGxpdHRlciA9IG5ldyBNZWRpYVNvdXJjZVNwbGl0dGVyKGNhbWVyYVNvdXJjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNhbWVyYVNvdXJjZVNwbGl0dGVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpbnQzMl90IHRvdGFsQml0UmF0ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cE1QRUc0UmVjb3JkaW5nKG1DYXB0dXJlQXV4VmlkZW8sCisgICAgICAgICAgICBtT3V0cHV0RmQsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCisgICAgICAgICAgICBtVmlkZW9CaXRSYXRlLCAmdG90YWxCaXRSYXRlLCAmbVdyaXRlcik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIHNldHVwTVBFRzRNZXRhRGF0YShzdGFydFRpbWVVcywgdG90YWxCaXRSYXRlLCAmbWV0YSk7CisKKyAgICBlcnIgPSBtV3JpdGVyLT5zdGFydChtZXRhLmdldCgpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKKyAgICAgICAgQ0hFQ0sobU91dHB1dEZkQXV4ID49IDApOworICAgICAgICBpZiAobVdyaXRlckF1eCAhPSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJBdXhpbGlhcnkgRmlsZSB3cml0ZXIgaXMgbm90IGF2YWlhbGJsZSIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtQXV4VmlkZW9XaWR0aCA+IG1WaWRlb1dpZHRoKSB8fCAobUF1eFZpZGVvSGVpZ2h0ID4gbVZpZGVvSGVpZ2h0KSB8fAorICAgICAgICAgICAgICAgICgobUF1eFZpZGVvV2lkdGggPT0gbVZpZGVvV2lkdGgpICYmIG1BdXhWaWRlb0hlaWdodCA9PSBtVmlkZW9IZWlnaHQpKSB7CisgICAgICAgICAgICBMT0dFKCJBdXhpbGlhcnkgdmlkZW8gc2l6ZSAoJWQgeCAlZCkgc2FtZSBvciBsYXJnZXIgdGhhbiB0aGUgbWFpbiB2aWRlbyBzaXplICglZCB4ICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1BdXhWaWRlb1dpZHRoLCBtQXV4VmlkZW9IZWlnaHQsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHRvdGFsQml0cmF0ZUF1eDsKKyAgICAgICAgZXJyID0gc2V0dXBNUEVHNFJlY29yZGluZyhtQ2FwdHVyZUF1eFZpZGVvLAorICAgICAgICAgICAgICAgIG1PdXRwdXRGZEF1eCwgbUF1eFZpZGVvV2lkdGgsIG1BdXhWaWRlb0hlaWdodCwKKyAgICAgICAgICAgICAgICBtQXV4VmlkZW9CaXRSYXRlLCAmdG90YWxCaXRyYXRlQXV4LCAmbVdyaXRlckF1eCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YUF1eCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgc2V0dXBNUEVHNE1ldGFEYXRhKHN0YXJ0VGltZVVzLCB0b3RhbEJpdHJhdGVBdXgsICZtZXRhQXV4KTsKKworICAgICAgICByZXR1cm4gbVdyaXRlckF1eC0+c3RhcnQobWV0YUF1eC5nZXQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwYXVzZSgpIHsKQEAgLTEwNjYsMzUgKzEyNDUsNTAgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogICAgIG1Xcml0ZXItPnBhdXNlKCk7CisKKyAgICBpZiAobUNhcHR1cmVBdXhWaWRlbykgeworICAgICAgICBpZiAobVdyaXRlckF1eCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtV3JpdGVyQXV4LT5wYXVzZSgpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RvcCgpIHsKICAgICBMT0dWKCJzdG9wIik7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICBpZiAobUNhcHR1cmVUaW1lTGFwc2UgJiYgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSAhPSBOVUxMKSB7CisgICAgICAgIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UtPnN0YXJ0UXVpY2tSZWFkUmV0dXJucygpOworICAgICAgICBtQ2FtZXJhU291cmNlVGltZUxhcHNlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUNhcHR1cmVBdXhWaWRlbykgeworICAgICAgICBpZiAobVdyaXRlckF1eCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtV3JpdGVyQXV4LT5zdG9wKCk7CisgICAgICAgICAgICBtV3JpdGVyQXV4LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CiAgICAgICAgIGVyciA9IG1Xcml0ZXItPnN0b3AoKTsKICAgICAgICAgbVdyaXRlci5jbGVhcigpOwogICAgIH0KIAotICAgIGlmIChtQ2FtZXJhICE9IDApIHsKLSAgICAgICAgTE9HVigiRGlzY29ubmVjdCBjYW1lcmEiKTsKLSAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIGlmICgobUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgPT0gMCkgewotICAgICAgICAgICAgTE9HVigiQ2FtZXJhIHdhcyBjb2xkIHdoZW4gd2Ugc3RhcnRlZCwgc3RvcHBpbmcgcHJldmlldyIpOwotICAgICAgICAgICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKLSAgICAgICAgfQotICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKLSAgICAgICAgbUNhbWVyYS5jbGVhcigpOwotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICAgICAgbUZsYWdzID0gMDsKLSAgICB9Ci0KICAgICBpZiAobU91dHB1dEZkID49IDApIHsKICAgICAgICAgOjpjbG9zZShtT3V0cHV0RmQpOwogICAgICAgICBtT3V0cHV0RmQgPSAtMTsKICAgICB9CiAKKyAgICBpZiAobUNhcHR1cmVBdXhWaWRlbykgeworICAgICAgICBpZiAobU91dHB1dEZkQXV4ID49IDApIHsKKyAgICAgICAgICAgIDo6Y2xvc2UobU91dHB1dEZkQXV4KTsKKyAgICAgICAgICAgIG1PdXRwdXRGZEF1eCA9IC0xOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMTExOSw4ICsxMzEzLDExIEBACiAgICAgbVZpZGVvRW5jb2RlciAgPSBWSURFT19FTkNPREVSX0gyNjM7CiAgICAgbVZpZGVvV2lkdGggICAgPSAxNzY7CiAgICAgbVZpZGVvSGVpZ2h0ICAgPSAxNDQ7CisgICAgbUF1eFZpZGVvV2lkdGggICAgPSAxNzY7CisgICAgbUF1eFZpZGVvSGVpZ2h0ICAgPSAxNDQ7CiAgICAgbUZyYW1lUmF0ZSAgICAgPSAyMDsKICAgICBtVmlkZW9CaXRSYXRlICA9IDE5MjAwMDsKKyAgICBtQXV4VmlkZW9CaXRSYXRlID0gMTkyMDAwOwogICAgIG1TYW1wbGVSYXRlICAgID0gODAwMDsKICAgICBtQXVkaW9DaGFubmVscyA9IDE7CiAgICAgbUF1ZGlvQml0UmF0ZSAgPSAxMjIwMDsKQEAgLTExMzcsMTAgKzEzMzQsMTUgQEAKICAgICBtTWF4RmlsZUR1cmF0aW9uVXMgPSAwOwogICAgIG1NYXhGaWxlU2l6ZUJ5dGVzID0gMDsKICAgICBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID0gMDsKKyAgICBtQ2FwdHVyZVRpbWVMYXBzZSA9IGZhbHNlOworICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gLTE7CisgICAgbUNhcHR1cmVBdXhWaWRlbyA9IGZhbHNlOworICAgIG1DYW1lcmFTb3VyY2VTcGxpdHRlciA9IE5VTEw7CisgICAgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSA9IE5VTEw7CiAgICAgbUVuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CiAKICAgICBtT3V0cHV0RmQgPSAtMTsKLSAgICBtRmxhZ3MgPSAwOworICAgIG1PdXRwdXRGZEF1eCA9IC0xOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTE3Nyw2ICsxMzc5LDggQEAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBSZWNvcmRlcjogJXBcbiIsIHRoaXMpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIE91dHB1dCBmaWxlIChmZCAlZCk6XG4iLCBtT3V0cHV0RmQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBPdXRwdXQgZmlsZSBBdXhpbGlhcnkgKGZkICVkKTpcbiIsIG1PdXRwdXRGZEF1eCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRmlsZSBmb3JtYXQ6ICVkXG4iLCBtT3V0cHV0Rm9ybWF0KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggZmlsZSBzaXplIChieXRlcyk6ICVsbGRcbiIsIG1NYXhGaWxlU2l6ZUJ5dGVzKTsKQEAgLTEyMDksOCArMTQxMyw2IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQ2FtZXJhIElkOiAlZFxuIiwgbUNhbWVyYUlkKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBDYW1lcmEgZmxhZ3M6ICVkXG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEVuY29kZXI6ICVkXG4iLCBtVmlkZW9FbmNvZGVyKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBFbmNvZGVyIHByb2ZpbGU6ICVkXG4iLCBtVmlkZW9FbmNvZGVyUHJvZmlsZSk7CkBAIC0xMjIxLDEwICsxNDIzLDE0IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRnJhbWUgc2l6ZSAocGl4ZWxzKTogJWR4JWRcbiIsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEF1eCBGcmFtZSBzaXplIChwaXhlbHMpOiAlZHglZFxuIiwgbUF1eFZpZGVvV2lkdGgsIG1BdXhWaWRlb0hlaWdodCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRnJhbWUgcmF0ZSAoZnBzKTogJWRcbiIsIG1GcmFtZVJhdGUpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEJpdCByYXRlIChicHMpOiAlZFxuIiwgbVZpZGVvQml0UmF0ZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQXV4IEJpdCByYXRlIChicHMpOiAlZFxuIiwgbUF1eFZpZGVvQml0UmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggMjE2ZjZiYy4uMDM5YmMxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0xOSwxMyArMTksMTggQEAKICNkZWZpbmUgU1RBR0VGUklHSFRfUkVDT1JERVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQ2FtZXJhOworY2xhc3MgQ2FtZXJhU291cmNlOworY2xhc3MgQ2FtZXJhU291cmNlVGltZUxhcHNlOworY2xhc3MgTWVkaWFTb3VyY2VTcGxpdHRlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZWRpYVdyaXRlcjsKK2NsYXNzIE1ldGFEYXRhOwogc3RydWN0IEF1ZGlvU291cmNlOwogY2xhc3MgTWVkaWFQcm9maWxlczsKIApAQCAtNDIsOSArNDcsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKTsKQEAgLTU3LDE1ICs2MywxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIGVudW0gQ2FtZXJhRmxhZ3MgewotICAgICAgICBGTEFHU19TRVRfQ0FNRVJBID0gMUwgPDwgMCwKLSAgICAgICAgRkxBR1NfSE9UX0NBTUVSQSA9IDFMIDw8IDEsCi0gICAgfTsKLQotICAgIHNwPENhbWVyYT4gbUNhbWVyYTsKLSAgICBzcDxJU3VyZmFjZT4gbVByZXZpZXdTdXJmYWNlOworICAgIHNwPElDYW1lcmE+IG1DYW1lcmE7CisgICAgc3A8U3VyZmFjZT4gbVByZXZpZXdTdXJmYWNlOwogICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7Ci0gICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXI7CisgICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXIsIG1Xcml0ZXJBdXg7CiAgICAgc3A8QXVkaW9Tb3VyY2U+IG1BdWRpb1NvdXJjZU5vZGU7CiAKICAgICBhdWRpb19zb3VyY2UgbUF1ZGlvU291cmNlOwpAQCAtNzUsOCArNzYsOSBAQAogICAgIHZpZGVvX2VuY29kZXIgbVZpZGVvRW5jb2RlcjsKICAgICBib29sIG1Vc2U2NEJpdEZpbGVPZmZzZXQ7CiAgICAgaW50MzJfdCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0OworICAgIGludDMyX3QgbUF1eFZpZGVvV2lkdGgsIG1BdXhWaWRlb0hlaWdodDsKICAgICBpbnQzMl90IG1GcmFtZVJhdGU7Ci0gICAgaW50MzJfdCBtVmlkZW9CaXRSYXRlOworICAgIGludDMyX3QgbVZpZGVvQml0UmF0ZSwgbUF1eFZpZGVvQml0UmF0ZTsKICAgICBpbnQzMl90IG1BdWRpb0JpdFJhdGU7CiAgICAgaW50MzJfdCBtQXVkaW9DaGFubmVsczsKICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwpAQCAtOTIsMjAgKzk0LDM4IEBACiAgICAgaW50NjRfdCBtTWF4RmlsZUR1cmF0aW9uVXM7CiAgICAgaW50NjRfdCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzOwogCisgICAgYm9vbCBtQ2FwdHVyZVRpbWVMYXBzZTsKKyAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOworICAgIGJvb2wgbUNhcHR1cmVBdXhWaWRlbzsKKyAgICBzcDxNZWRpYVNvdXJjZVNwbGl0dGVyPiBtQ2FtZXJhU291cmNlU3BsaXR0ZXI7CisgICAgc3A8Q2FtZXJhU291cmNlVGltZUxhcHNlPiBtQ2FtZXJhU291cmNlVGltZUxhcHNlOworCiAgICAgU3RyaW5nOCBtUGFyYW1zOwotICAgIGludCBtT3V0cHV0RmQ7Ci0gICAgaW50MzJfdCBtRmxhZ3M7CisgICAgaW50IG1PdXRwdXRGZCwgbU91dHB1dEZkQXV4OwogCiAgICAgTWVkaWFQcm9maWxlcyAqbUVuY29kZXJQcm9maWxlczsKIAorICAgIHN0YXR1c190IHNldHVwTVBFRzRSZWNvcmRpbmcoCisgICAgICAgIGJvb2wgdXNlU3BsaXRDYW1lcmFTb3VyY2UsCisgICAgICAgIGludCBvdXRwdXRGZCwKKyAgICAgICAgaW50MzJfdCB2aWRlb1dpZHRoLCBpbnQzMl90IHZpZGVvSGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgaW50MzJfdCAqdG90YWxCaXRSYXRlLAorICAgICAgICBzcDxNZWRpYVdyaXRlcj4gKm1lZGlhV3JpdGVyKTsKKyAgICB2b2lkIHNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKKyAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKTsKICAgICBzdGF0dXNfdCBzdGFydE1QRUc0UmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzdGFydEFBQ1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHN0YXJ0UlRQUmVjb3JkaW5nKCk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUF1ZGlvU291cmNlKCk7Ci0gICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2UoKTsKKyAgICBzdGF0dXNfdCBjaGVja1ZpZGVvRW5jb2RlckNhcGFiaWxpdGllcygpOworICAgIHN0YXR1c190IHNldHVwQ2FtZXJhU291cmNlKHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBdWRpb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpOwotICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cFZpZGVvRW5jb2RlcigKKyAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCisgICAgICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKIAogICAgIC8vIEVuY29kaW5nIHBhcmFtZXRlciBoYW5kbGluZyB1dGlsaXRpZXMKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSk7CkBAIC0xMTMsNiArMTMzLDExIEBACiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb051bWJlck9mQ2hhbm5lbHMoaW50MzJfdCBjaGFubmxlcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1NhbXBsaW5nUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9UaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVGltZUxhcHNlRW5hYmxlKGludDMyX3QgdGltZUxhcHNlRW5hYmxlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKGludDY0X3QgdGltZVVzKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0KGludDMyX3QgaGVpZ2h0KTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUF1eFZpZGVvV2lkdGgoaW50MzJfdCB3aWR0aCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdXhWaWRlb0VuY29kaW5nQml0UmF0ZShpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludDMyX3Qgc2Vjb25kcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKGludDMyX3QgcHJvZmlsZSk7CkBAIC0xMzcsNCArMTYyLDMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gU1RBR0VGUklHSFRfUkVDT1JERVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAppbmRleCA2ZTZjM2NkLi41ZWFmNTkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaApAQCAtNzUsNyArNzUsMTAgQEAKIAogCiAgICAgLy8gQWxsIHRoZSBtZXRob2RzIGJlbG93IHdyYXAgdGhlIG1QbGF5ZXIgaW5zdGFuY2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SVN1cmZhY2U+JiBzKSAgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJU3VyZmFjZT4mIHMpICB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb0lTdXJmYWNlKHMpOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpTdXJmYWNlPiYgcykgIHsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZShzKTsKICAgICB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCkge3JldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggM2UxN2E3ZS4uNDcyYmZjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC0xMCw2ICsxMCw4IEBACiAgICAgICAgIEF1ZGlvU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgICAgICAgICBcCisgICAgICAgIFZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwICAgICAgICBcCiAgICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCkBAIC0yNCw2ICsyNiw3IEBACiAgICAgICAgIE1lZGlhRGVmcy5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhU291cmNlU3BsaXR0ZXIuY3BwICAgICAgICAgICBcCiAgICAgICAgIE1ldGFEYXRhLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE51Q2FjaGVkU291cmNlMi5jcHAgICAgICAgICAgICAgICBcCiAgICAgICAgIE51SFRUUERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICBcCkBAIC02MCw2ICs2Myw3IEBACiAgICAgICAgIGxpYnNvbml2b3ggICAgICAgIFwKICAgICAgICAgbGlidm9yYmlzaWRlYyAgICAgXAogICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF95dXYgXAogICAgICAgICBsaWJjYW1lcmFfY2xpZW50CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAppbmRleCA4YzE3YWFiLi44MmYxNGEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KIAotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAKQEAgLTEwMCwxMyArMTAwLDE0IEBACiAgICAgICAgICAgICBib29sIHByZXZpZXdPbmx5LAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkKICAgICAgICAgOiBtVGFyZ2V0KE5VTEwpLAogICAgICAgICAgIG1MaWJIYW5kbGUoTlVMTCkgewogICAgICAgICAgICAgaW5pdChwcmV2aWV3T25seSwgY29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsIHN1cmZhY2UsIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsIGlzdXJmYWNlLCBzdXJmYWNlLCBkaXNwbGF5V2lkdGgsCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CiAgICAgfQogCkBAIC0xMzgsNyArMTM5LDggQEAKICAgICAgICAgICAgIGJvb2wgcHJldmlld09ubHksCiAgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJmlzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KTsKIApAQCAtMTUwLDcgKzE1Miw4IEBACiAgICAgICAgIGJvb2wgcHJldmlld09ubHksCiAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmaXN1cmZhY2UsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpIHsKICAgICBpZiAoIXByZXZpZXdPbmx5KSB7CkBAIC0xNzYsNyArMTc5LDcgQEAKIAogICAgICAgICAgICAgaWYgKGZ1bmMpIHsKICAgICAgICAgICAgICAgICBtVGFyZ2V0ID0KLSAgICAgICAgICAgICAgICAgICAgKCpmdW5jKShzdXJmYWNlLCBjb21wb25lbnROYW1lLCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgKCpmdW5jKShpc3VyZmFjZSwgY29tcG9uZW50TmFtZSwgY29sb3JGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOwogICAgICAgICAgICAgfQpAQCAtNzM1LDggKzczOCwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBBd2Vzb21lUGxheWVyOjpub3RpZnlWaWRlb1NpemVfbCgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpbnQzMl90IGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodDsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmZGVjb2RlZFdpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZkZWNvZGVkSGVpZ2h0KSk7CisKKyAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOworfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OmluaXRSZW5kZXJlcl9sKCkgewotICAgIGlmIChtSVN1cmZhY2UgIT0gTlVMTCkgeworICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMIHx8IG1JU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKIAogICAgICAgICBpbnQzMl90IGZvcm1hdDsKQEAgLTc1Myw3ICs3NjYsMTggQEAKICAgICAgICAgLy8gYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4KICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCi0gICAgICAgIGlmICghc3RybmNtcCgiT01YLiIsIGNvbXBvbmVudCwgNCkpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIE90aGVyIGRlY29kZXJzIGFyZSBpbnN0YW50aWF0ZWQgbG9jYWxseSBhbmQgYXMgYSBjb25zZXF1ZW5jZQorICAgICAgICAgICAgLy8gYWxsb2NhdGUgdGhlaXIgYnVmZmVycyBpbiBsb2NhbCBhZGRyZXNzIHNwYWNlLgorICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIoCisgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBwcmV2aWV3T25seQorICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZm9ybWF0LAorICAgICAgICAgICAgICAgIG1JU3VyZmFjZSwKKyAgICAgICAgICAgICAgICBtU3VyZmFjZSwKKyAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAorICAgICAgICAgICAgICAgIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPdXIgT01YIGNvZGVjcyBhbGxvY2F0ZSBidWZmZXJzIG9uIHRoZSBtZWRpYV9zZXJ2ZXIgc2lkZQogICAgICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZXkgcmVxdWlyZSBhIHJlbW90ZSBJT01YUmVuZGVyZXIgdGhhdCBrbm93cyBob3cKICAgICAgICAgICAgIC8vIHRvIGRpc3BsYXkgdGhlbS4KQEAgLTc2MywxNiArNzg3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSlmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPdGhlciBkZWNvZGVycyBhcmUgaW5zdGFudGlhdGVkIGxvY2FsbHkgYW5kIGFzIGEgY29uc2VxdWVuY2UKLSAgICAgICAgICAgIC8vIGFsbG9jYXRlIHRoZWlyIGJ1ZmZlcnMgaW4gbG9jYWwgYWRkcmVzcyBzcGFjZS4KLSAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAotICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gcHJldmlld09ubHkKLSAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWZvcm1hdCwKLSAgICAgICAgICAgICAgICBtSVN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtODE4LDYgKzgzMiwxMiBAQAogICAgIG1JU3VyZmFjZSA9IGlzdXJmYWNlOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVN1cmZhY2UgPSBzdXJmYWNlOworfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldEF1ZGlvU2luaygKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMTA3MCw2ICsxMDkwLDggQEAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKICAgICAgICAgICAgICAgICAgICAgTE9HVigiVmlkZW9Tb3VyY2Ugc2lnbmFsbGVkIGZvcm1hdCBjaGFuZ2UuIik7CiAKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRSZW5kZXJlcl9sKCk7CkBAIC0xNTU5LDEwICsxNTgxLDEwIEBACiAKIHZvaWQgQXdlc29tZVBsYXllcjo6ZmluaXNoQXN5bmNQcmVwYXJlX2woKSB7CiAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDApIHsKKyAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCAwLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKICAgICAgICAgfQogCiAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwpAQCAtMTY4NCwxMyArMTcwNiwxNCBAQAogCiAgICAgbUZsYWdzID0gc3RhdGUtPm1GbGFncyAmIChBVVRPX0xPT1BJTkcgfCBMT09QSU5HIHwgQVRfRU9TKTsKIAotICAgIGlmIChzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lICYmIG1JU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgaWYgKHN0YXRlLT5tTGFzdFZpZGVvRnJhbWUgJiYgKG1TdXJmYWNlICE9IE5VTEwgfHwgbUlTdXJmYWNlICE9IE5VTEwpKSB7CiAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0KICAgICAgICAgICAgIG5ldyBBd2Vzb21lTG9jYWxSZW5kZXJlcigKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIHByZXZpZXdPbmx5CiAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3RhdGUtPm1Db2xvckZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgbUlTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1WaWRlb1dpZHRoLAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVZpZGVvSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bURlY29kZWRXaWR0aCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDg5Y2IxMzUuLjFlYjM5NGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCkBAIC02NSw2ICs2NiwxMSBAQAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0cikgewogICAgIExPR1YoInBvc3REYXRhKCVkLCBwdHI6JXAsIHNpemU6JWQpIiwKICAgICAgICAgIG1zZ1R5cGUsIGRhdGFQdHItPnBvaW50ZXIoKSwgZGF0YVB0ci0+c2l6ZSgpKTsKKworICAgIHNwPENhbWVyYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZS5wcm9tb3RlKCk7CisgICAgaWYgKHNvdXJjZS5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIHNvdXJjZS0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGRhdGFQdHIpOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGFUaW1lc3RhbXAoCkBAIC03Nyw2ICs4MywxMCBAQAogfQogCiBzdGF0aWMgaW50MzJfdCBnZXRDb2xvckZvcm1hdChjb25zdCBjaGFyKiBjb2xvckZvcm1hdCkgeworICAgIGlmICghc3RyY21wKGNvbG9yRm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIwUCkpIHsKKyAgICAgICByZXR1cm4gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICB9CisKICAgICBpZiAoIXN0cmNtcChjb2xvckZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMlNQKSkgewogICAgICAgIHJldHVybiBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hcjsKICAgICB9CkBAIC05OSw3MiArMTA5LDM4NiBAQAogICAgIENIRUNLX0VRKDAsICJVbmtub3duIGNvbG9yIGZvcm1hdCIpOwogfQogCi0vLyBzdGF0aWMKIENhbWVyYVNvdXJjZSAqQ2FtZXJhU291cmNlOjpDcmVhdGUoKSB7Ci0gICAgc3A8Q2FtZXJhPiBjYW1lcmEgPSBDYW1lcmE6OmNvbm5lY3QoMCk7CisgICAgU2l6ZSBzaXplOworICAgIHNpemUud2lkdGggPSAtMTsKKyAgICBzaXplLmhlaWdodCA9IC0xOwogCi0gICAgaWYgKGNhbWVyYS5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgQ2FtZXJhU291cmNlKGNhbWVyYSk7CisgICAgc3A8SUNhbWVyYT4gY2FtZXJhOworICAgIHJldHVybiBuZXcgQ2FtZXJhU291cmNlKGNhbWVyYSwgMCwgc2l6ZSwgLTEsIE5VTEwpOwogfQogCiAvLyBzdGF0aWMKLUNhbWVyYVNvdXJjZSAqQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tQ2FtZXJhKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSkgewotICAgIGlmIChjYW1lcmEuZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CitDYW1lcmFTb3VyY2UgKkNhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYSgKKyAgICBjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLAorICAgIGludDMyX3QgY2FtZXJhSWQsCisgICAgU2l6ZSB2aWRlb1NpemUsCisgICAgaW50MzJfdCBmcmFtZVJhdGUsCisgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHsKIAotICAgIHJldHVybiBuZXcgQ2FtZXJhU291cmNlKGNhbWVyYSk7CisgICAgQ2FtZXJhU291cmNlICpzb3VyY2UgPSBuZXcgQ2FtZXJhU291cmNlKGNhbWVyYSwgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgZnJhbWVSYXRlLCBzdXJmYWNlKTsKKworICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBpZiAoc291cmNlLT5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICAgICAgZGVsZXRlIHNvdXJjZTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzb3VyY2U7CiB9CiAKLUNhbWVyYVNvdXJjZTo6Q2FtZXJhU291cmNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSkKLSAgICA6IG1DYW1lcmEoY2FtZXJhKSwKLSAgICAgIG1GaXJzdEZyYW1lVGltZVVzKDApLAotICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzKDApLAorQ2FtZXJhU291cmNlOjpDYW1lcmFTb3VyY2UoCisgICAgY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwKKyAgICBpbnQzMl90IGNhbWVyYUlkLAorICAgIFNpemUgdmlkZW9TaXplLAorICAgIGludDMyX3QgZnJhbWVSYXRlLAorICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQorICAgIDogbUNhbWVyYUZsYWdzKDApLAorICAgICAgbVZpZGVvRnJhbWVSYXRlKC0xKSwKKyAgICAgIG1DYW1lcmEoMCksCisgICAgICBtU3VyZmFjZShzdXJmYWNlKSwKICAgICAgIG1OdW1GcmFtZXNSZWNlaXZlZCgwKSwKKyAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1GaXJzdEZyYW1lVGltZVVzKDApLAogICAgICAgbU51bUZyYW1lc0VuY29kZWQoMCksCiAgICAgICBtTnVtRnJhbWVzRHJvcHBlZCgwKSwKICAgICAgIG1OdW1HbGl0Y2hlcygwKSwKICAgICAgIG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzKDIwMDAwMCksCi0gICAgICBtQ29sbGVjdFN0YXRzKGZhbHNlKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgICBtQ29sbGVjdFN0YXRzKGZhbHNlKSB7CiAKKyAgICBtVmlkZW9TaXplLndpZHRoICA9IC0xOworICAgIG1WaWRlb1NpemUuaGVpZ2h0ID0gLTE7CisKKyAgICBtSW5pdENoZWNrID0gaW5pdChjYW1lcmEsIGNhbWVyYUlkLCB2aWRlb1NpemUsIGZyYW1lUmF0ZSk7Cit9CisKK3N0YXR1c190IENhbWVyYVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OmlzQ2FtZXJhQXZhaWxhYmxlKAorICAgIGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsIGludDMyX3QgY2FtZXJhSWQpIHsKKworICAgIGlmIChjYW1lcmEgPT0gMCkgeworICAgICAgICBtQ2FtZXJhID0gQ2FtZXJhOjpjb25uZWN0KGNhbWVyYUlkKTsKKyAgICAgICAgbUNhbWVyYUZsYWdzICY9IH5GTEFHU19IT1RfQ0FNRVJBOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DYW1lcmEgPSBDYW1lcmE6OmNyZWF0ZShjYW1lcmEpOworICAgICAgICBtQ2FtZXJhRmxhZ3MgfD0gRkxBR1NfSE9UX0NBTUVSQTsKKyAgICB9CisKKyAgICAvLyBJcyBjYW1lcmEgYXZhaWxhYmxlPworICAgIGlmIChtQ2FtZXJhID09IDApIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhIGNvbm5lY3Rpb24gY291bGQgbm90IGJlIGVzdGFibGlzaGVkLiIpOworICAgICAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKyAgICBpZiAoIShtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSkgeworICAgICAgICBtQ2FtZXJhLT5sb2NrKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworCisvKgorICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCB2aWRlbyB3aWR0aCBhbmQgaGVpZ2h0IGlzIG9uZQorICogb2YgdGhlIHN1cHBvcnRlZCBzaXplcy4KKyAqIEBwYXJhbSB3aWR0aCB0aGUgdmlkZW8gZnJhbWUgd2lkdGggaW4gcGl4ZWxzCisgKiBAcGFyYW0gaGVpZ2h0IHRoZSB2aWRlbyBmcmFtZSBoZWlnaHQgaW4gcGl4ZWxzCisgKiBAcGFyYW0gc3VwcHBvcnRlZFNpemVzIHRoZSB2ZWN0b3Igb2Ygc2l6ZXMgdGhhdCB3ZSBjaGVjayBhZ2FpbnN0CisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRpbWVuc2lvbiAod2lkdGggYW5kIGhlaWdodCkgaXMgc3VwcG9ydGVkLgorICovCitzdGF0aWMgYm9vbCBpc1ZpZGVvU2l6ZVN1cHBvcnRlZCgKKyAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICBjb25zdCBWZWN0b3I8U2l6ZT4mIHN1cHBvcnRlZFNpemVzKSB7CisKKyAgICBMT0dWKCJpc1ZpZGVvU2l6ZVN1cHBvcnRlZCIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VwcG9ydGVkU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHdpZHRoICA9PSBzdXBwb3J0ZWRTaXplc1tpXS53aWR0aCAmJgorICAgICAgICAgICAgaGVpZ2h0ID09IHN1cHBvcnRlZFNpemVzW2ldLmhlaWdodCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKgorICogSWYgdGhlIHByZXZpZXcgYW5kIHZpZGVvIG91dHB1dCBpcyBzZXBhcmF0ZSwgd2Ugb25seSBzZXQgdGhlCisgKiB0aGUgdmlkZW8gc2l6ZSwgYW5kIGFwcGxpY2F0aW9ucyBzaG91bGQgc2V0IHRoZSBwcmV2aWV3IHNpemUKKyAqIHRvIHNvbWUgcHJvcGVyIHZhbHVlLCBhbmQgdGhlIHJlY29yZGluZyBmcmFtZXdvcmsgd2lsbCBub3QKKyAqIGNoYW5nZSB0aGUgcHJldmlldyBzaXplOyBvdGhlcndpc2UsIGlmIHRoZSB2aWRlbyBhbmQgcHJldmlldworICogb3V0cHV0IGlzIHRoZSBzYW1lLCB3ZSBuZWVkIHRvIHNldCB0aGUgcHJldmlldyB0byBiZSB0aGUgc2FtZQorICogYXMgdGhlIHJlcXVlc3RlZCB2aWRlbyBzaXplLgorICoKKyAqLworLyoKKyAqIFF1ZXJ5IHRoZSBjYW1lcmEgdG8gcmV0cmlldmUgdGhlIHN1cHBvcnRlZCB2aWRlbyBmcmFtZSBzaXplcworICogYW5kIGFsc28gdG8gc2VlIHdoZXRoZXIgQ2FtZXJhUGFyYW1ldGVyczo6c2V0VmlkZW9TaXplKCkKKyAqIGlzIHN1cHBvcnRlZCBvciBub3QuCisgKiBAcGFyYW0gcGFyYW1zIENhbWVyYVBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uCisgKiBAQHBhcmFtIGlzU2V0VmlkZW9TaXplU3VwcG9ydGVkIHJldHVucnMgd2hldGhlciBtZXRob2QKKyAqICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6c2V0VmlkZW9TaXplKCkgaXMgc3VwcG9ydGVkIG9yIG5vdC4KKyAqIEBwYXJhbSBzaXplcyByZXR1cm5zIHRoZSB2ZWN0b3Igb2YgU2l6ZSBvYmplY3RzIGZvciB0aGUKKyAqICAgICAgc3VwcG9ydGVkIHZpZGVvIGZyYW1lIHNpemVzIGFkdmVydGlzZWQgYnkgdGhlIGNhbWVyYS4KKyAqLworc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygKKyAgICBjb25zdCBDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgYm9vbCAqaXNTZXRWaWRlb1NpemVTdXBwb3J0ZWQsCisgICAgVmVjdG9yPFNpemU+JiBzaXplcykgeworCisgICAgKmlzU2V0VmlkZW9TaXplU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICBwYXJhbXMuZ2V0U3VwcG9ydGVkVmlkZW9TaXplcyhzaXplcyk7CisgICAgaWYgKHNpemVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIExPR0QoIkNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IHNldFZpZGVvU2l6ZSgpIik7CisgICAgICAgIHBhcmFtcy5nZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoc2l6ZXMpOworICAgICAgICAqaXNTZXRWaWRlb1NpemVTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHRoZSBjYW1lcmEgaGFzIHRoZSBzdXBwb3J0ZWQgY29sb3IgZm9ybWF0CisgKiBAcGFyYW0gcGFyYW1zIENhbWVyYVBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uCisgKiBAcmV0dXJuIE9LIGlmIG5vIGVycm9yLgorICovCitzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OmlzQ2FtZXJhQ29sb3JGb3JtYXRTdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykgeworICAgIG1Db2xvckZvcm1hdCA9IGdldENvbG9yRm9ybWF0KHBhcmFtcy5nZXQoCisgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVklERU9fRlJBTUVfRk9STUFUKSk7CisgICAgaWYgKG1Db2xvckZvcm1hdCA9PSAtMSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIGNhbWVyYSB0byB1c2UgdGhlIHJlcXVlc3RlZCB2aWRlbyBzaXplCisgKiAod2lkdGggYW5kIGhlaWdodCkgYW5kL29yIGZyYW1lIHJhdGUuIElmIGJvdGggd2lkdGggYW5kCisgKiBoZWlnaHQgYXJlIC0xLCBjb25maWd1cmF0aW9uIG9uIHRoZSB2aWRlbyBzaXplIGlzIHNraXBwZWQuCisgKiBpZiBmcmFtZVJhdGUgaXMgLTEsIGNvbmZpZ3VyYXRpb24gb24gdGhlIGZyYW1lIHJhdGUKKyAqIGlzIHNraXBwZWQuIFNraXBwaW5nIHRoZSBjb25maWd1cmF0aW9uIGFsbG93cyBvbmUgdG8KKyAqIHVzZSB0aGUgY3VycmVudCBjYW1lcmEgc2V0dGluZyB3aXRob3V0IHRoZSBuZWVkIHRvCisgKiBhY3R1YWxseSBrbm93IHRoZSBzcGVjaWZpYyB2YWx1ZXMgKHNlZSBDcmVhdGUoKSBtZXRob2QpLgorICoKKyAqIEBwYXJhbSBwYXJhbXMgdGhlIENhbWVyYVBhcmFtZXRlcnMgdG8gYmUgY29uZmlndXJlZAorICogQHBhcmFtIHdpZHRoIHRoZSB0YXJnZXQgdmlkZW8gZnJhbWUgd2lkdGggaW4gcGl4ZWxzCisgKiBAcGFyYW0gaGVpZ2h0IHRoZSB0YXJnZXQgdmlkZW8gZnJhbWUgaGVpZ2h0IGluIHBpeGVscworICogQHBhcmFtIGZyYW1lUmF0ZSB0aGUgdGFyZ2V0IGZyYW1lIHJhdGUgaW4gZnJhbWVzIHBlciBzZWNvbmQuCisgKiBAcmV0dXJuIE9LIGlmIG5vIGVycm9yLgorICovCitzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OmNvbmZpZ3VyZUNhbWVyYSgKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyogcGFyYW1zLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUpIHsKKworICAgIFZlY3RvcjxTaXplPiBzaXplczsKKyAgICBib29sIGlzU2V0VmlkZW9TaXplU3VwcG9ydGVkQnlDYW1lcmEgPSB0cnVlOworICAgIGdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKnBhcmFtcywgJmlzU2V0VmlkZW9TaXplU3VwcG9ydGVkQnlDYW1lcmEsIHNpemVzKTsKKyAgICBib29sIGlzQ2FtZXJhUGFyYW1DaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKHdpZHRoICE9IC0xICYmIGhlaWdodCAhPSAtMSkgeworICAgICAgICBpZiAoIWlzVmlkZW9TaXplU3VwcG9ydGVkKHdpZHRoLCBoZWlnaHQsIHNpemVzKSkgeworICAgICAgICAgICAgTE9HRSgiVmlkZW8gZGltZW5zaW9uICglZHglZCkgaXMgdW5zdXBwb3J0ZWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzU2V0VmlkZW9TaXplU3VwcG9ydGVkQnlDYW1lcmEpIHsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0VmlkZW9TaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1zLT5zZXRQcmV2aWV3U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBpc0NhbWVyYVBhcmFtQ2hhbmdlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmICgod2lkdGggPT0gLTEgJiYgaGVpZ2h0ICE9IC0xKSB8fAorICAgICAgICAgICAgICAgKHdpZHRoICE9IC0xICYmIGhlaWdodCA9PSAtMSkpIHsKKyAgICAgICAgLy8gSWYgb25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgd2lkdGggYW5kIGhlaWdodCBpcyAtMQorICAgICAgICAvLyB3ZSByZWplY3Qgc3VjaCBhIHJlcXVlc3QuCisgICAgICAgIExPR0UoIlJlcXVlc3RlZCB2aWRlbyBzaXplICglZHglZCkgaXMgbm90IHN1cHBvcnRlZCIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSB7ICAvLyB3aWR0aCA9PSAtMSAmJiBoZWlnaHQgPT0gLTEKKyAgICAgICAgLy8gRG8gbm90IGNvbmZpZ3VyZSB0aGUgY2FtZXJhLgorICAgICAgICAvLyBVc2UgdGhlIGN1cnJlbnQgd2lkdGggYW5kIGhlaWdodCB2YWx1ZSBzZXR0aW5nIGZyb20gdGhlIGNhbWVyYS4KKyAgICB9CisKKyAgICBpZiAoZnJhbWVSYXRlICE9IC0xKSB7CisgICAgICAgIHBhcmFtcy0+c2V0UHJldmlld0ZyYW1lUmF0ZShmcmFtZVJhdGUpOworICAgICAgICBpc0NhbWVyYVBhcmFtQ2hhbmdlZCA9IHRydWU7CisgICAgfSBlbHNlIHsgIC8vIGZyYW1lUmF0ZSA9PSAtMQorICAgICAgICAvLyBEbyBub3QgY29uZmlndXJlIHRoZSBjYW1lcmEuCisgICAgICAgIC8vIFVzZSB0aGUgY3VycmVudCBmcmFtZSByYXRlIHZhbHVlIHNldHRpbmcgZnJvbSB0aGUgY2FtZXJhCisgICAgfQorCisgICAgaWYgKGlzQ2FtZXJhUGFyYW1DaGFuZ2VkKSB7CisgICAgICAgIC8vIEVpdGhlciBmcmFtZSByYXRlIG9yIGZyYW1lIHNpemUgbmVlZHMgdG8gYmUgY2hhbmdlZC4KKyAgICAgICAgU3RyaW5nOCBzID0gcGFyYW1zLT5mbGF0dGVuKCk7CisgICAgICAgIGlmIChPSyAhPSBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHMpKSB7CisgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3QgY2hhbmdlIHNldHRpbmdzLiIKKyAgICAgICAgICAgICAgICAgIiBTb21lb25lIGVsc2UgaXMgdXNpbmcgY2FtZXJhICVwPyIsIG1DYW1lcmEuZ2V0KCkpOworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgdmlkZW8gZnJhbWUgc2l6ZQorICogaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQgb3Igbm90LiBJZiBib3RoIHdpZHRoIGFuZCBoZWlnaHQKKyAqIGFyZSAtMSwgY2hlY2sgb24gdGhlIGN1cnJlbnQgd2lkdGggYW5kIGhlaWdodCB2YWx1ZSBzZXR0aW5nCisgKiBpcyBwZXJmb3JtZWQuCisgKgorICogQHBhcmFtIHBhcmFtcyBDYW1lcmFQYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbgorICogQHBhcmFtIHRoZSB0YXJnZXQgdmlkZW8gZnJhbWUgd2lkdGggaW4gcGl4ZWxzIHRvIGNoZWNrIGFnYWluc3QKKyAqIEBwYXJhbSB0aGUgdGFyZ2V0IHZpZGVvIGZyYW1lIGhlaWdodCBpbiBwaXhlbHMgdG8gY2hlY2sgYWdhaW5zdAorICogQHJldHVybiBPSyBpZiBubyBlcnJvcgorICovCitzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OmNoZWNrVmlkZW9TaXplKAorICAgICAgICBjb25zdCBDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisKKyAgICBpbnQzMl90IGZyYW1lV2lkdGhBY3R1YWwgPSAtMTsKKyAgICBpbnQzMl90IGZyYW1lSGVpZ2h0QWN0dWFsID0gLTE7CisgICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZmcmFtZVdpZHRoQWN0dWFsLCAmZnJhbWVIZWlnaHRBY3R1YWwpOworICAgIGlmIChmcmFtZVdpZHRoQWN0dWFsIDwgMCB8fCBmcmFtZUhlaWdodEFjdHVhbCA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIHZpZGVvIGZyYW1lIHNpemUgKCVkeCVkKSIsCisgICAgICAgICAgICAgICAgZnJhbWVXaWR0aEFjdHVhbCwgZnJhbWVIZWlnaHRBY3R1YWwpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGUgYWN0dWFsIHZpZGVvIGZyYW1lIHNpemUgYWdhaW5zdCB0aGUgdGFyZ2V0L3JlcXVlc3RlZAorICAgIC8vIHZpZGVvIGZyYW1lIHNpemUuCisgICAgaWYgKHdpZHRoICE9IC0xICYmIGhlaWdodCAhPSAtMSkgeworICAgICAgICBpZiAoZnJhbWVXaWR0aEFjdHVhbCAhPSB3aWR0aCB8fCBmcmFtZUhlaWdodEFjdHVhbCAhPSBoZWlnaHQpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgdmlkZW8gZnJhbWUgc2l6ZSB0byAlZHglZC4gIgorICAgICAgICAgICAgICAgICAgICAiVGhlIGFjdHVhbCB2aWRlbyBzaXplIGlzICVkeCVkICIsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lV2lkdGhBY3R1YWwsIGZyYW1lSGVpZ2h0QWN0dWFsKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR29vZCBub3cuCisgICAgbVZpZGVvU2l6ZS53aWR0aCA9IGZyYW1lV2lkdGhBY3R1YWw7CisgICAgbVZpZGVvU2l6ZS5oZWlnaHQgPSBmcmFtZUhlaWdodEFjdHVhbDsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgcmVxdWVzdGVkIGZyYW1lIHJhdGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQgb3Igbm90LgorICogSWYgdGhlIHRhcmdldCBmcmFtZVJhdGUgaXMgLTEsIGNoZWNrIG9uIHRoZSBjdXJyZW50IGZyYW1lIHJhdGUgdmFsdWUKKyAqIHNldHRpbmcgaXMgcGVyZm9ybWVkLgorICoKKyAqIEBwYXJhbSBwYXJhbXMgQ2FtZXJhUGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24KKyAqIEBwYXJhbSB0aGUgdGFyZ2V0IHZpZGVvIGZyYW1lIHJhdGUgdG8gY2hlY2sgYWdhaW5zdAorICogQHJldHVybiBPSyBpZiBubyBlcnJvci4KKyAqLworc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpjaGVja0ZyYW1lUmF0ZSgKKyAgICAgICAgY29uc3QgQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSkgeworCisgICAgaW50MzJfdCBmcmFtZVJhdGVBY3R1YWwgPSBwYXJhbXMuZ2V0UHJldmlld0ZyYW1lUmF0ZSgpOworICAgIGlmIChmcmFtZVJhdGVBY3R1YWwgPCAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBwcmV2aWV3IGZyYW1lIHJhdGUgKCVkKSIsIGZyYW1lUmF0ZUFjdHVhbCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIENoZWNrIHRoZSBhY3R1YWwgdmlkZW8gZnJhbWUgcmF0ZSBhZ2FpbnN0IHRoZSB0YXJnZXQvcmVxdWVzdGVkCisgICAgLy8gdmlkZW8gZnJhbWUgcmF0ZS4KKyAgICBpZiAoZnJhbWVSYXRlICE9IC0xICYmIChmcmFtZVJhdGVBY3R1YWwgLSBmcmFtZVJhdGUpICE9IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBwcmV2aWV3IGZyYW1lIHJhdGUgdG8gJWQgZnBzLiBUaGUgYWN0dWFsICIKKyAgICAgICAgICAgICAgICAiZnJhbWUgcmF0ZSBpcyAlZCIsIGZyYW1lUmF0ZSwgZnJhbWVSYXRlQWN0dWFsKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gR29vZCBub3cuCisgICAgbVZpZGVvRnJhbWVSYXRlID0gZnJhbWVSYXRlQWN0dWFsOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIENhbWVyYVNvdXJjZSB0byBzbyB0aGF0IGl0IGJlY29tZXMKKyAqIHJlYWR5IGZvciBwcm92aWRpbmcgdGhlIHZpZGVvIGlucHV0IHN0cmVhbXMgYXMgcmVxdWVzdGVkLgorICogQHBhcmFtIGNhbWVyYSB0aGUgY2FtZXJhIG9iamVjdCB1c2VkIGZvciB0aGUgdmlkZW8gc291cmNlCisgKiBAcGFyYW0gY2FtZXJhSWQgaWYgY2FtZXJhID09IDAsIHVzZSBjYW1lcmEgd2l0aCB0aGlzIGlkCisgKiAgICAgIGFzIHRoZSB2aWRlbyBzb3VyY2UKKyAqIEBwYXJhbSB2aWRlb1NpemUgdGhlIHRhcmdldCB2aWRlbyBmcmFtZSBzaXplLiBJZiBib3RoCisgKiAgICAgIHdpZHRoIGFuZCBoZWlnaHQgaW4gdmlkZW9TaXplIGlzIC0xLCB1c2UgdGhlIGN1cnJlbnQKKyAqICAgICAgd2lkdGggYW5kIGhlaWd0aCBzZXR0aW5ncyBieSB0aGUgY2FtZXJhCisgKiBAcGFyYW0gZnJhbWVSYXRlIHRoZSB0YXJnZXQgZnJhbWUgcmF0ZSBpbiBmcmFtZXMgcGVyIHNlY29uZC4KKyAqICAgICAgaWYgaXQgaXMgLTEsIHVzZSB0aGUgY3VycmVudCBjYW1lcmEgZnJhbWUgcmF0ZSBzZXR0aW5nLgorICogQHJldHVybiBPSyBpZiBubyBlcnJvci4KKyAqLworc3RhdHVzX3QgQ2FtZXJhU291cmNlOjppbml0KAorICAgICAgICBjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLAorICAgICAgICBpbnQzMl90IGNhbWVyYUlkLAorICAgICAgICBTaXplIHZpZGVvU2l6ZSwKKyAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUpIHsKKworICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKKworICAgIGlmICgoZXJyICA9IGlzQ2FtZXJhQXZhaWxhYmxlKGNhbWVyYSwgY2FtZXJhSWQpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCkpOworICAgIGlmICgoZXJyID0gaXNDYW1lcmFDb2xvckZvcm1hdFN1cHBvcnRlZChwYXJhbXMpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIFNldCB0aGUgY2FtZXJhIHRvIHVzZSB0aGUgcmVxdWVzdGVkIHZpZGVvIGZyYW1lIHNpemUKKyAgICAvLyBhbmQvb3IgZnJhbWUgcmF0ZS4KKyAgICBpZiAoKGVyciA9IGNvbmZpZ3VyZUNhbWVyYSgmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICB2aWRlb1NpemUud2lkdGgsIHZpZGVvU2l6ZS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSkpKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLy8gQ2hlY2sgb24gdmlkZW8gZnJhbWUgc2l6ZSBhbmQgZnJhbWUgcmF0ZS4KKyAgICBDYW1lcmFQYXJhbWV0ZXJzIG5ld0NhbWVyYVBhcmFtcyhtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCkpOworICAgIGlmICgoZXJyID0gY2hlY2tWaWRlb1NpemUobmV3Q2FtZXJhUGFyYW1zLAorICAgICAgICAgICAgICAgIHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmICgoZXJyID0gY2hlY2tGcmFtZVJhdGUobmV3Q2FtZXJhUGFyYW1zLCBmcmFtZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIFRoaXMgQ0hFQ0sgaXMgZ29vZCwgc2luY2Ugd2UganVzdCBwYXNzZWQgdGhlIGxvY2svdW5sb2NrCisgICAgLy8gY2hlY2sgZWFybGllciBieSBjYWxsaW5nIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMoKS4KKyAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c2V0UHJldmlld0Rpc3BsYXkobVN1cmZhY2UpKTsKKworICAgIC8qCisgICAgICogbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSBzaWduYWxzIGNhbWVyYSBoYWwgdG8gbWFrZQorICAgICAqIGF2YWlsYWJsZSB0aGUgdmlkZW8gYnVmZmVycyAoZm9yIGluc3RhbmNlLCBhbGxvY2F0aW9uCisgICAgICogb2YgdGhlIHZpZGVvIGJ1ZmZlcnMgbWF5IGJlIHRyaWdnZXJlZCB3aGVuIGNhbWVyYSBoYWwncworICAgICAqIHN0YXJ0UmVjb3JkaW5nKCkgbWV0aG9kIGlzIGNhbGxlZCkuIE1ha2luZyBhdmFpbGFibGUgdGhlc2UKKyAgICAgKiB2aWRlbyBidWZmZXJzIGVhcmxpZXIgKGJlZm9yZSBjYWxsaW5nIHN0YXJ0KCkpIGlzIGNyaXRpY2FsLAorICAgICAqIGlmIG9uZSB3YW50cyB0byBjb25maWd1cmUgb214IHZpZGVvIGVuY29kZXJzIHRvIHVzZSB0aGVzZQorICAgICAqIGJ1ZmZlcnMgZm9yIHBhc3NpbmcgdmlkZW8gZnJhbWUgZGF0YSBkdXJpbmcgdmlkZW8gcmVjb3JkaW5nCisgICAgICogd2l0aG91dCB0aGUgbmVlZCB0byBtZW1jcHkgdGhlIHZpZGVvIGZyYW1lIGRhdGEgc3RvcmVkCisgICAgICogaW4gdGhlc2UgYnVmZmVycy4gRWxpbWluYXRpbmcgbWVtY3B5IGZvciB2aWRlbyBmcmFtZSBkYXRhCisgICAgICogaXMgY3J1Y2lhbCBpbiBwZXJmb3JtYW5jZSBmb3IgSEQgcXVhbGl0eSB2aWRlbyByZWNvcmRpbmcKKyAgICAgKiBhcHBsaWNhdGlvbnMuCisgICAgICoKKyAgICAgKiBCYXNlZCBvbiBPTVggSUwgc3BlYywgY29uZmlndXJpbmcgdGhlIG9teCB2aWRlbyBlbmNvZGVycworICAgICAqIG11c3Qgb2NjdXIgaW4gbG9hZGVkIHN0YXRlLiBXaGVuIHN0YXJ0KCkgaXMgY2FsbGVkLCBvbXgKKyAgICAgKiB2aWRlbyBlbmNvZGVycyBhcmUgYWxyZWFkeSBpbiBpZGxlIHN0YXRlLCB3aGljaCBpcyB0b28KKyAgICAgKiBsYXRlLiBUaHVzLCB3ZSBtdXN0IGNhbGwgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSBlYXJsaWVyLgorICAgICAqLworICAgIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAotICAgIHByaW50ZigicGFyYW1zOiBcIiVzXCJcbiIsIHMuc3RyaW5nKCkpOwotCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNsaWNlSGVpZ2h0OwotICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOwotICAgIHBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmd2lkdGgsICZoZWlnaHQpOwotCi0gICAgLy8gQ2FsY3VsYXRlIGdsaXRjaCBkdXJhdG9uIHRocmVzaG9sZCBiYXNlZCBvbiBmcmFtZSByYXRlCi0gICAgaW50MzJfdCBmcmFtZVJhdGUgPSBwYXJhbXMuZ2V0UHJldmlld0ZyYW1lUmF0ZSgpOwotICAgIGludDY0X3QgZ2xpdGNoRHVyYXRpb25VcyA9ICgxMDAwMDAwTEwgLyBmcmFtZVJhdGUpOworICAgIGludDY0X3QgZ2xpdGNoRHVyYXRpb25VcyA9ICgxMDAwMDAwTEwgLyBtVmlkZW9GcmFtZVJhdGUpOwogICAgIGlmIChnbGl0Y2hEdXJhdGlvblVzID4gbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMpIHsKICAgICAgICAgbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMgPSBnbGl0Y2hEdXJhdGlvblVzOwogICAgIH0KIAotICAgIGNvbnN0IGNoYXIgKmNvbG9yRm9ybWF0U3RyID0gcGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVklERU9fRlJBTUVfRk9STUFUKTsKLSAgICBDSEVDSyhjb2xvckZvcm1hdFN0ciAhPSBOVUxMKTsKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gZ2V0Q29sb3JGb3JtYXQoY29sb3JGb3JtYXRTdHIpOwotCiAgICAgLy8gWFhYOiBxdWVyeSBjYW1lcmEgZm9yIHRoZSBzdHJpZGUgYW5kIHNsaWNlIGhlaWdodAogICAgIC8vIHdoZW4gdGhlIGNhcGFiaWxpdHkgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgc3RyaWRlID0gd2lkdGg7Ci0gICAgc2xpY2VIZWlnaHQgPSBoZWlnaHQ7Ci0KICAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7Ci0gICAgbU1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOwotICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICBtTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICBtTWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKLSAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBzbGljZUhlaWdodCk7Ci0KKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIG1Db2xvckZvcm1hdCk7CisgICAgbU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgICAgICAgbVZpZGVvU2l6ZS53aWR0aCk7CisgICAgbU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsICAgICAgbVZpZGVvU2l6ZS5oZWlnaHQpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLCAgICAgIG1WaWRlb1NpemUud2lkdGgpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsIG1WaWRlb1NpemUuaGVpZ2h0KTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIENhbWVyYVNvdXJjZTo6fkNhbWVyYVNvdXJjZSgpIHsKQEAgLTE3Myw4ICs0OTcsMTcgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU291cmNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKKyAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7CisgICAgQ0hFQ0sobUNhbWVyYS0+cmVjb3JkaW5nRW5hYmxlZCgpKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhU291cmNlIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQogCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LnJlY29yZC1zdGF0cyIsIHZhbHVlLCBOVUxMKQpAQCAtMTkwLDEzICs1MjMsMTcgQEAKIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKG5ldyBDYW1lcmFTb3VyY2VMaXN0ZW5lcih0aGlzKSk7Ci0gICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCkpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmFTb3VyY2U6OnN0b3BDYW1lcmFSZWNvcmRpbmcoKSB7CisgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIoTlVMTCk7CisgICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOworfQorCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0b3AoKSB7CiAgICAgTE9HVigic3RvcCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CkBAIC0yMDQsMTUgKzU0MSwyMyBAQAogICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKE5VTEwpOwotICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7CiAgICAgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOwogICAgIHdoaWxlICghbUZyYW1lc0JlaW5nRW5jb2RlZC5lbXB0eSgpKSB7CiAgICAgICAgIExPR0koIldhaXRpbmcgZm9yIG91dHN0YW5kaW5nIGZyYW1lcyBiZWluZyBlbmNvZGVkOiAlZCIsCiAgICAgICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5zaXplKCkpOwogICAgICAgICBtRnJhbWVDb21wbGV0ZUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKICAgICB9Ci0gICAgbUNhbWVyYSA9IE5VTEw7CisKKyAgICBMT0dWKCJEaXNjb25uZWN0IGNhbWVyYSIpOworICAgIGlmICgobUNhbWVyYUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgPT0gMCkgeworICAgICAgICBMT0dWKCJDYW1lcmEgd2FzIGNvbGQgd2hlbiB3ZSBzdGFydGVkLCBzdG9wcGluZyBwcmV2aWV3Iik7CisgICAgICAgIG1DYW1lcmEtPnN0b3BQcmV2aWV3KCk7CisgICAgfQorICAgIG1DYW1lcmEtPnVubG9jaygpOworICAgIG1DYW1lcmEuY2xlYXIoKTsKKyAgICBtQ2FtZXJhID0gMDsKKyAgICBtQ2FtZXJhRmxhZ3MgPSAwOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgaWYgKG1Db2xsZWN0U3RhdHMpIHsKQEAgLTIyNSwxMSArNTcwLDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYVNvdXJjZTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSkgeworICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7Cit9CisKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlUXVldWVkRnJhbWVzKCkgewogICAgIExpc3Q8c3A8SU1lbW9yeT4gPjo6aXRlcmF0b3IgaXQ7CiAgICAgd2hpbGUgKCFtRnJhbWVzUmVjZWl2ZWQuZW1wdHkoKSkgewogICAgICAgICBpdCA9IG1GcmFtZXNSZWNlaXZlZC5iZWdpbigpOwotICAgICAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoKml0KTsKKyAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCppdCk7CiAgICAgICAgIG1GcmFtZXNSZWNlaXZlZC5lcmFzZShpdCk7CiAgICAgICAgICsrbU51bUZyYW1lc0Ryb3BwZWQ7CiAgICAgfQpAQCAtMjQxLDcgKzU5MCw3IEBACiAKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogfQogCkBAIC0yNTEsNyArNjAwLDYgQEAKICAgICBmb3IgKExpc3Q8c3A8SU1lbW9yeT4gPjo6aXRlcmF0b3IgaXQgPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmICgoKml0KS0+cG9pbnRlcigpID09ICBidWZmZXItPmRhdGEoKSkgewotCiAgICAgICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoKCppdCkpOwogICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5lcmFzZShpdCk7CiAgICAgICAgICAgICArK21OdW1GcmFtZXNFbmNvZGVkOwpAQCAtMzQzLDYgKzY5MSwxMyBAQAogICAgICAgICArK21OdW1HbGl0Y2hlczsKICAgICB9CiAKKyAgICAvLyBNYXkgbmVlZCB0byBza2lwIGZyYW1lIG9yIG1vZGlmeSB0aW1lc3RhbXAuIEN1cnJlbnRseSBpbXBsZW1lbnRlZAorICAgIC8vIGJ5IHRoZSBzdWJjbGFzcyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UuCisgICAgaWYoc2tpcEN1cnJlbnRGcmFtZSh0aW1lc3RhbXBVcykpIHsKKyAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGRhdGEpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CiAgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7CiAgICAgICAgIG1GaXJzdEZyYW1lVGltZVVzID0gdGltZXN0YW1wVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjNmMjBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU291cmNlVGltZUxhcHNlIgorCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKkNhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q3JlYXRlRnJvbUNhbWVyYSgKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwKKyAgICAgICAgU2l6ZSB2aWRlb1NpemUsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpIHsKKworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqc291cmNlID0gbmV3CisgICAgICAgICAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY2FtZXJhLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICB2aWRlb1NpemUsIHZpZGVvRnJhbWVSYXRlLCBzdXJmYWNlLAorICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworCisgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgICAgICBkZWxldGUgc291cmNlOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNvdXJjZTsKK30KKworQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDYW1lcmFTb3VyY2VUaW1lTGFwc2UoCisgICAgICAgIGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsCisgICAgICAgIGludDMyX3QgY2FtZXJhSWQsCisgICAgICAgIFNpemUgdmlkZW9TaXplLAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlLAorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKQorICAgIDogQ2FtZXJhU291cmNlKGNhbWVyYSwgY2FtZXJhSWQsIHZpZGVvU2l6ZSwgdmlkZW9GcmFtZVJhdGUsIHN1cmZhY2UpLAorICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXModGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyksCisgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzKDFFNi92aWRlb0ZyYW1lUmF0ZSksCisgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzKDApLAorICAgICAgbVNraXBDdXJyZW50RnJhbWUoZmFsc2UpIHsKKworICAgIExPR1YoInN0YXJ0aW5nIHRpbWUgbGFwc2UgbW9kZSIpOworICAgIG1WaWRlb1dpZHRoID0gdmlkZW9TaXplLndpZHRoOworICAgIG1WaWRlb0hlaWdodCA9IHZpZGVvU2l6ZS5oZWlnaHQ7CisKKyAgICBpZiAodHJ5U2V0dGluZ1ByZXZpZXdTaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCkpIHsKKyAgICAgICAgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogQWRkIGEgY2hlY2sgdG8gc2VlIHRoYXQgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgaXMgZ3JlYXRlcgorICAgICAgICAvLyB0aGFuIHRoZSBmYXN0ZXN0IHJhdGUgYXQgd2hpY2ggdGhlIHN0aWxsIGNhbWVyYSBjYW4gdGFrZSBwaWN0dXJlcy4KKyAgICAgICAgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlID0gdHJ1ZTsKKyAgICAgICAgQ0hFQ0soc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQodmlkZW9TaXplLndpZHRoLCB2aWRlb1NpemUuaGVpZ2h0KSk7CisgICAgICAgIG1OZWVkQ3JvcHBpbmcgPSBjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpOworICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB2aWRlb1NpemUud2lkdGgpOworICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgdmlkZW9TaXplLmhlaWdodCk7CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBxdWljayBzdG9wIHZhcmlhYmxlcy4KKyAgICBtUXVpY2tTdG9wID0gZmFsc2U7CisgICAgbUZvcmNlUmVhZCA9IGZhbHNlOworICAgIG1MYXN0UmVhZEJ1ZmZlckNvcHkgPSBOVUxMOworICAgIG1TdG9wV2FpdGluZ0ZvcklkbGVDYW1lcmEgPSBmYWxzZTsKK30KKworQ2FtZXJhU291cmNlVGltZUxhcHNlOjp+Q2FtZXJhU291cmNlVGltZUxhcHNlKCkgeworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c3RhcnRRdWlja1JlYWRSZXR1cm5zKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUXVpY2tTdG9wTG9jayk7CisgICAgTE9HVigiRW5hYmxpbmcgcXVpY2sgcmVhZCByZXR1cm5zIik7CisKKyAgICAvLyBFbmFibGUgcXVpY2sgc3RvcCBtb2RlLgorICAgIG1RdWlja1N0b3AgPSB0cnVlOworCisgICAgaWYgKG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICAvLyB3YWtlIHVwIHRoZSB0aHJlYWQgcmlnaHQgYXdheS4KKyAgICAgICAgbVRha2VQaWN0dXJlQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZvcmNlIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIGNvbWluZyBmcm9tIHRoZSB2aWRlbyBjYW1lcmEgdG8gbm90IHNraXAgdGhlCisgICAgICAgIC8vIG5leHQgZnJhbWUgYXMgd2Ugd2FudCByZWFkKCkgdG8gZ2V0IGEgZ2V0IGEgZnJhbWUgcmlnaHQgYXdheS4KKyAgICAgICAgbUZvcmNlUmVhZCA9IHRydWU7CisgICAgfQorfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6dHJ5U2V0dGluZ1ByZXZpZXdTaXplKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgU3RyaW5nOCBzID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMocyk7CisgICAgVmVjdG9yPFNpemU+IHN1cHBvcnRlZFNpemVzOworICAgIHBhcmFtcy5nZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoc3VwcG9ydGVkU2l6ZXMpOworCisgICAgYm9vbCBwcmV2aWV3U2l6ZVN1cHBvcnRlZCA9IGZhbHNlOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRTaXplcy5zaXplKCk7ICsraSkgeworICAgICAgICBpbnQzMl90IHBpY3R1cmVXaWR0aCA9IHN1cHBvcnRlZFNpemVzW2ldLndpZHRoOworICAgICAgICBpbnQzMl90IHBpY3R1cmVIZWlnaHQgPSBzdXBwb3J0ZWRTaXplc1tpXS5oZWlnaHQ7CisKKyAgICAgICAgaWYgKChwaWN0dXJlV2lkdGggPT0gd2lkdGgpICYmIChwaWN0dXJlSGVpZ2h0ID09IGhlaWdodCkpIHsKKyAgICAgICAgICAgIHByZXZpZXdTaXplU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmV2aWV3U2l6ZVN1cHBvcnRlZCkgeworICAgICAgICBMT0dWKCJWaWRlbyBzaXplICglZCwgJWQpIGlzIGEgc3VwcG9ydGVkIHByZXZpZXcgc2l6ZSIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBwYXJhbXMuc2V0UHJldmlld1NpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIENIRUNLKG1DYW1lcmEtPnNldFBhcmFtZXRlcnMocGFyYW1zLmZsYXR0ZW4oKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKworICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOworICAgIFZlY3RvcjxTaXplPiBzdXBwb3J0ZWRTaXplczsKKyAgICBwYXJhbXMuZ2V0U3VwcG9ydGVkUGljdHVyZVNpemVzKHN1cHBvcnRlZFNpemVzKTsKKworICAgIGludDMyX3QgbWluUGljdHVyZVNpemUgPSBJTlRfTUFYOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRTaXplcy5zaXplKCk7ICsraSkgeworICAgICAgICBpbnQzMl90IHBpY3R1cmVXaWR0aCA9IHN1cHBvcnRlZFNpemVzW2ldLndpZHRoOworICAgICAgICBpbnQzMl90IHBpY3R1cmVIZWlnaHQgPSBzdXBwb3J0ZWRTaXplc1tpXS5oZWlnaHQ7CisKKyAgICAgICAgaWYgKChwaWN0dXJlV2lkdGggPj0gd2lkdGgpICYmIChwaWN0dXJlSGVpZ2h0ID49IGhlaWdodCkpIHsKKyAgICAgICAgICAgIGludDMyX3QgcGljdHVyZVNpemUgPSBwaWN0dXJlV2lkdGgqcGljdHVyZUhlaWdodDsKKyAgICAgICAgICAgIGlmIChwaWN0dXJlU2l6ZSA8IG1pblBpY3R1cmVTaXplKSB7CisgICAgICAgICAgICAgICAgbWluUGljdHVyZVNpemUgPSBwaWN0dXJlU2l6ZTsKKyAgICAgICAgICAgICAgICBtUGljdHVyZVdpZHRoID0gcGljdHVyZVdpZHRoOworICAgICAgICAgICAgICAgIG1QaWN0dXJlSGVpZ2h0ID0gcGljdHVyZUhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dWKCJQaWN0dXJlIHNpemUgPSAoJWQsICVkKSIsIG1QaWN0dXJlV2lkdGgsIG1QaWN0dXJlSGVpZ2h0KTsKKyAgICByZXR1cm4gKG1pblBpY3R1cmVTaXplICE9IElOVF9NQVgpOworfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Y29tcHV0ZUNyb3BSZWN0YW5nbGVPZmZzZXQoKSB7CisgICAgaWYgKChtUGljdHVyZVdpZHRoID09IG1WaWRlb1dpZHRoKSAmJiAobVBpY3R1cmVIZWlnaHQgPT0gbVZpZGVvSGVpZ2h0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0soKG1QaWN0dXJlV2lkdGggPiBtVmlkZW9XaWR0aCkgJiYgKG1QaWN0dXJlSGVpZ2h0ID4gbVZpZGVvSGVpZ2h0KSk7CisKKyAgICBpbnQzMl90IHdpZHRoRGlmZmVyZW5jZSA9IG1QaWN0dXJlV2lkdGggLSBtVmlkZW9XaWR0aDsKKyAgICBpbnQzMl90IGhlaWdodERpZmZlcmVuY2UgPSBtUGljdHVyZUhlaWdodCAtIG1WaWRlb0hlaWdodDsKKworICAgIG1Dcm9wUmVjdFN0YXJ0WCA9IHdpZHRoRGlmZmVyZW5jZS8yOworICAgIG1Dcm9wUmVjdFN0YXJ0WSA9IGhlaWdodERpZmZlcmVuY2UvMjsKKworICAgIExPR1YoInNldHRpbmcgY3JvcCByZWN0YW5nbGUgb2Zmc2V0IHRvICglZCwgJWQpIiwgbUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1RdWlja1N0b3BMb2NrKTsKKyAgICBpZiAobVF1aWNrU3RvcCAmJiAoYnVmZmVyID09IG1MYXN0UmVhZEJ1ZmZlckNvcHkpKSB7CisgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIoTlVMTCk7CisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBDYW1lcmFTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIGNyZWF0ZU1lZGlhQnVmZmVyQ29weShjb25zdCBNZWRpYUJ1ZmZlciYgc291cmNlQnVmZmVyLCBpbnQ2NF90IGZyYW1lVGltZSwgTWVkaWFCdWZmZXIgKipuZXdCdWZmZXIpIHsKKyAgICBzaXplX3Qgc291cmNlU2l6ZSA9IHNvdXJjZUJ1ZmZlci5zaXplKCk7CisgICAgdm9pZCogc291cmNlUG9pbnRlciA9IHNvdXJjZUJ1ZmZlci5kYXRhKCk7CisKKyAgICAoKm5ld0J1ZmZlcikgPSBuZXcgTWVkaWFCdWZmZXIoc291cmNlU2l6ZSk7CisgICAgbWVtY3B5KCgqbmV3QnVmZmVyKS0+ZGF0YSgpLCBzb3VyY2VQb2ludGVyLCBzb3VyY2VTaXplKTsKKworICAgICgqbmV3QnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWUpOworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZmlsbExhc3RSZWFkQnVmZmVyQ29weShNZWRpYUJ1ZmZlciYgc291cmNlQnVmZmVyKSB7CisgICAgaW50NjRfdCBmcmFtZVRpbWU7CisgICAgQ0hFQ0soc291cmNlQnVmZmVyLm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZmcmFtZVRpbWUpKTsKKyAgICBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoc291cmNlQnVmZmVyLCBmcmFtZVRpbWUsICZtTGFzdFJlYWRCdWZmZXJDb3B5KTsKKyAgICBtTGFzdFJlYWRCdWZmZXJDb3B5LT5hZGRfcmVmKCk7CisgICAgbUxhc3RSZWFkQnVmZmVyQ29weS0+c2V0T2JzZXJ2ZXIodGhpcyk7Cit9CisKK3N0YXR1c190IENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgaWYgKG1MYXN0UmVhZEJ1ZmZlckNvcHkgPT0gTlVMTCkgeworICAgICAgICBtTGFzdFJlYWRTdGF0dXMgPSBDYW1lcmFTb3VyY2U6OnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKKworICAgICAgICAvLyBtUXVpY2tTdG9wIG1heSBoYXZlIHR1cm5lZCB0byB0cnVlIHdoaWxlIHJlYWQgd2FzIGJsb2NrZWQuIE1ha2UgYSBjb3B5IG9mCisgICAgICAgIC8vIHRoZSBidWZmZXIgaW4gdGhhdCBjYXNlLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVF1aWNrU3RvcExvY2spOworICAgICAgICBpZiAobVF1aWNrU3RvcCAmJiAqYnVmZmVyKSB7CisgICAgICAgICAgICBmaWxsTGFzdFJlYWRCdWZmZXJDb3B5KCoqYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUxhc3RSZWFkU3RhdHVzOworICAgIH0gZWxzZSB7CisgICAgICAgICgqYnVmZmVyKSA9IG1MYXN0UmVhZEJ1ZmZlckNvcHk7CisgICAgICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOworICAgICAgICByZXR1cm4gbUxhc3RSZWFkU3RhdHVzOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OlRocmVhZFRpbWVMYXBzZVdyYXBwZXIodm9pZCAqbWUpIHsKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqPihtZSk7CisgICAgc291cmNlLT50aHJlYWRUaW1lTGFwc2VFbnRyeSgpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6dGhyZWFkVGltZUxhcHNlRW50cnkoKSB7CisgICAgd2hpbGUgKG1TdGFydGVkKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQ2FtZXJhSWRsZUxvY2spOworICAgICAgICAgICAgaWYgKCFtQ2FtZXJhSWRsZSkgeworICAgICAgICAgICAgICAgIG1DYW1lcmFJZGxlQ29uZGl0aW9uLndhaXQobUNhbWVyYUlkbGVMb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLKG1DYW1lcmFJZGxlKTsKKyAgICAgICAgICAgIG1DYW1lcmFJZGxlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBFdmVuIGlmIG1RdWlja1N0b3AgPT0gdHJ1ZSB3ZSBuZWVkIHRvIHRha2Ugb25lIG1vcmUgcGljdHVyZQorICAgICAgICAvLyBhcyBhIHJlYWQoKSBtYXkgYmUgYmxvY2tlZCwgd2FpdGluZyBmb3IgYSBmcmFtZSB0byBnZXQgYXZhaWxhYmxlLgorICAgICAgICAvLyBBZnRlciB0aGlzIHRha2VQaWN0dXJlLCBpZiBtUXVpY2tTdG9wID09IHRydWUsIHdlIGNhbiBzYWZlbHkgZXhpdAorICAgICAgICAvLyB0aGlzIHRocmVhZCBhcyByZWFkKCkgd2lsbCBtYWtlIGEgY29weSBvZiB0aGlzIGxhc3QgZnJhbWUgYW5kIGtlZXAKKyAgICAgICAgLy8gcmV0dXJuaW5nIGl0IGluIHRoZSBxdWljayBzdG9wIG1vZGUuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUXVpY2tTdG9wTG9jayk7CisgICAgICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT50YWtlUGljdHVyZSgpKTsKKyAgICAgICAgaWYgKG1RdWlja1N0b3ApIHsKKyAgICAgICAgICAgIExPR1YoInRocmVhZFRpbWVMYXBzZUVudHJ5OiBFeGl0aW5nIGR1ZSB0byBtUXVpY2tTdG9wID0gdHJ1ZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1UYWtlUGljdHVyZUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobVF1aWNrU3RvcExvY2ssCisgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgKiAxMDAwKTsKKyAgICB9CisgICAgTE9HVigidGhyZWFkVGltZUxhcHNlRW50cnk6IEV4aXRpbmcgZHVlIHRvIG1TdGFydGVkID0gZmFsc2UiKTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkgeworICAgIGlmIChtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgTE9HVigic3RhcnQgdGltZSBsYXBzZSByZWNvcmRpbmcgdXNpbmcgc3RpbGwgY2FtZXJhIik7CisKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMocyk7CisgICAgICAgIHBhcmFtcy5zZXRQaWN0dXJlU2l6ZShtUGljdHVyZVdpZHRoLCBtUGljdHVyZUhlaWdodCk7CisgICAgICAgIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMocGFyYW1zLmZsYXR0ZW4oKSk7CisgICAgICAgIG1DYW1lcmFJZGxlID0gdHJ1ZTsKKyAgICAgICAgbVN0b3BXYWl0aW5nRm9ySWRsZUNhbWVyYSA9IGZhbHNlOworCisgICAgICAgIC8vIGRpc2FibGUgc2h1dHRlciBzb3VuZCBhbmQgcGxheSB0aGUgcmVjb3JkaW5nIHNvdW5kLgorICAgICAgICBtQ2FtZXJhLT5zZW5kQ29tbWFuZChDQU1FUkFfQ01EX0VOQUJMRV9TSFVUVEVSX1NPVU5ELCAwLCAwKTsKKyAgICAgICAgbUNhbWVyYS0+c2VuZENvbW1hbmQoQ0FNRVJBX0NNRF9QTEFZX1JFQ09SRElOR19TT1VORCwgMCwgMCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgdGhyZWFkIHdoaWNoIHRha2VzIHBpY3R1cmVzIGluIGEgbG9vcAorICAgICAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworCisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkVGltZUxhcHNlLCAmYXR0ciwgVGhyZWFkVGltZUxhcHNlV3JhcHBlciwgdGhpcyk7CisgICAgICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCJzdGFydCB0aW1lIGxhcHNlIHJlY29yZGluZyB1c2luZyB2aWRlbyBjYW1lcmEiKTsKKyAgICAgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCkpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnN0b3BDYW1lcmFSZWNvcmRpbmcoKSB7CisgICAgaWYgKG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICB2b2lkICpkdW1teTsKKyAgICAgICAgcHRocmVhZF9qb2luKG1UaHJlYWRUaW1lTGFwc2UsICZkdW1teSk7CisKKyAgICAgICAgLy8gTGFzdCB0YWtlUGljdHVyZSBtYXkgc3RpbGwgYmUgdW5kZXJ3YXkuIFdhaXQgZm9yIHRoZSBjYW1lcmEgdG8gZ2V0CisgICAgICAgIC8vIGlkbGUuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQ2FtZXJhSWRsZUxvY2spOworICAgICAgICBtU3RvcFdhaXRpbmdGb3JJZGxlQ2FtZXJhID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtQ2FtZXJhSWRsZSkgeworICAgICAgICAgICAgbUNhbWVyYUlkbGVDb25kaXRpb24ud2FpdChtQ2FtZXJhSWRsZUxvY2spOworICAgICAgICB9CisgICAgICAgIENIRUNLKG1DYW1lcmFJZGxlKTsKKyAgICAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIoTlVMTCk7CisKKyAgICAgICAgLy8gcGxheSB0aGUgcmVjb3JkaW5nIHNvdW5kLgorICAgICAgICBtQ2FtZXJhLT5zZW5kQ29tbWFuZChDQU1FUkFfQ01EX1BMQVlfUkVDT1JESU5HX1NPVU5ELCAwLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihOVUxMKTsKKyAgICAgICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOworICAgIH0KKyAgICBpZiAobUxhc3RSZWFkQnVmZmVyQ29weSkgeworICAgICAgICBtTGFzdFJlYWRCdWZmZXJDb3B5LT5yZWxlYXNlKCk7CisgICAgICAgIG1MYXN0UmVhZEJ1ZmZlckNvcHkgPSBOVUxMOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKKyAgICBpZiAoIW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOworICAgIH0KK30KKworc3A8SU1lbW9yeT4gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjcmVhdGVJTWVtb3J5Q29weShjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpIHsKKyAgICBzaXplX3Qgc291cmNlX3NpemUgPSBzb3VyY2VfZGF0YS0+c2l6ZSgpOworICAgIHZvaWQqIHNvdXJjZV9wb2ludGVyID0gc291cmNlX2RhdGEtPnBvaW50ZXIoKTsKKworICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBuZXdNZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNvdXJjZV9zaXplKTsKKyAgICBzcDxNZW1vcnlCYXNlPiBuZXdNZW1vcnkgPSBuZXcgTWVtb3J5QmFzZShuZXdNZW1vcnlIZWFwLCAwLCBzb3VyY2Vfc2l6ZSk7CisgICAgbWVtY3B5KG5ld01lbW9yeS0+cG9pbnRlcigpLCBzb3VyY2VfcG9pbnRlciwgc291cmNlX3NpemUpOworICAgIHJldHVybiBuZXdNZW1vcnk7Cit9CisKKy8vIEFsbG9jYXRlcyBJTWVtb3J5IG9mIGZpbmFsIHR5cGUgTWVtb3J5QmFzZSB3aXRoIHRoZSBnaXZlbiBzaXplLgorc3A8SU1lbW9yeT4gYWxsb2NhdGVJTWVtb3J5KHNpemVfdCBzaXplKSB7CisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IG5ld01lbW9yeUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSk7CisgICAgc3A8TWVtb3J5QmFzZT4gbmV3TWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UobmV3TWVtb3J5SGVhcCwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIG5ld01lbW9yeTsKK30KKworLy8gc3RhdGljCit2b2lkICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OlRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIodm9pZCAqbWUpIHsKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqPihtZSk7CisgICAgc291cmNlLT50aHJlYWRTdGFydFByZXZpZXcoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnRocmVhZFN0YXJ0UHJldmlldygpIHsKKyAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCkpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQ2FtZXJhSWRsZUxvY2spOworICAgIG1DYW1lcmFJZGxlID0gdHJ1ZTsKKyAgICBtQ2FtZXJhSWRsZUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlc3RhcnRQcmV2aWV3KCkgeworICAgIC8vIFN0YXJ0IHRoaXMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLCBzbyB0aGF0IHRoZSBkYXRhQ2FsbGJhY2sgY2FuIHJldHVybgorICAgIExPR1YoInJlc3RhcnRQcmV2aWV3Iik7CisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7CisKKyAgICBwdGhyZWFkX3QgdGhyZWFkUHJldmlldzsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkUHJldmlldywgJmF0dHIsIFRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIsIHRoaXMpOworICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKK30KKworc3A8SU1lbW9yeT4gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjcm9wWVVWSW1hZ2UoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKSB7CisgICAgLy8gZmluZCB0aGUgWVVWIGZvcm1hdAorICAgIGludDMyX3Qgc3JjRm9ybWF0OworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmc3JjRm9ybWF0KSk7CisgICAgWVVWSW1hZ2U6OllVVkZvcm1hdCB5dXZGb3JtYXQ7CisgICAgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwU2VtaVBsYW5hcjsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDS19FUShzcmNGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwUGxhbmFyOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgY3JvcHBlZCBpbWFnZSBhbmQgc2V0dXAgYSBjYW52YXMgdXNpbmcgaXQuCisgICAgc3A8SU1lbW9yeT4gY3JvcHBlZEltYWdlTWVtb3J5ID0gYWxsb2NhdGVJTWVtb3J5KAorICAgICAgICAgICAgWVVWSW1hZ2U6OmJ1ZmZlclNpemUoeXV2Rm9ybWF0LCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KSk7CisgICAgWVVWSW1hZ2UgeXV2SW1hZ2VDcm9wcGVkKHl1dkZvcm1hdCwKKyAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCisgICAgICAgICAgICAodWludDhfdCAqKWNyb3BwZWRJbWFnZU1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICBZVVZDYW52YXMgeXV2Q2FudmFzQ3JvcCh5dXZJbWFnZUNyb3BwZWQpOworCisgICAgWVVWSW1hZ2UgeXV2SW1hZ2VTb3VyY2UoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQsCisgICAgICAgICAgICAodWludDhfdCAqKXNvdXJjZV9kYXRhLT5wb2ludGVyKCkpOworICAgIHl1dkNhbnZhc0Nyb3AuQ29weUltYWdlUmVjdCgKKyAgICAgICAgICAgIFJlY3QobUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFksCisgICAgICAgICAgICAgICAgbUNyb3BSZWN0U3RhcnRYICsgbVZpZGVvV2lkdGgsCisgICAgICAgICAgICAgICAgbUNyb3BSZWN0U3RhcnRZICsgbVZpZGVvSGVpZ2h0KSwKKyAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICB5dXZJbWFnZVNvdXJjZSk7CisKKyAgICByZXR1cm4gY3JvcHBlZEltYWdlTWVtb3J5OworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKKyAgICBpZiAobXNnVHlwZSA9PSBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpIHsKKyAgICAgICAgLy8gdGFrZVBpY3R1cmUgd2lsbCBjb21wbGV0ZSBhZnRlciB0aGlzIGNhbGxiYWNrLCBzbyByZXN0YXJ0IHByZXZpZXcuCisgICAgICAgIHJlc3RhcnRQcmV2aWV3KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1zZ1R5cGUgIT0gQ0FNRVJBX01TR19SQVdfSU1BR0UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR1YoImRhdGFDYWxsYmFjayBmb3IgdGltZWxhcHNlIHN0aWxsIGZyYW1lIik7CisgICAgQ0hFQ0tfRVEodHJ1ZSwgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKTsKKworICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgIHRpbWVzdGFtcFVzID0gbVN0YXJ0VGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKKyAgICB9CisKKyAgICBpZiAobU5lZWRDcm9wcGluZykgeworICAgICAgICBzcDxJTWVtb3J5PiBjcm9wcGVkSW1hZ2VEYXRhID0gY3JvcFlVVkltYWdlKGRhdGEpOworICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIG1zZ1R5cGUsIGNyb3BwZWRJbWFnZURhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPElNZW1vcnk+IGRhdGFDb3B5ID0gY3JlYXRlSU1lbW9yeUNvcHkoZGF0YSk7CisgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgZGF0YUNvcHkpOworICAgIH0KK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNraXBDdXJyZW50RnJhbWUoaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIGlmIChtU2tpcEN1cnJlbnRGcmFtZSkgeworICAgICAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKCFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgaWYgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgPT0gMCkgeworICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBsYXBzZSBmcmFtZS4gSW5pdGlhbGl6ZSBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzCisgICAgICAgICAgICAvLyB0byBjdXJyZW50IHRpbWUgKHRpbWVzdGFtcFVzKSBhbmQgc2F2ZSBmcmFtZSBkYXRhLgorICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogaW5pdGlhbCBmcmFtZSIpOworCisgICAgICAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID0gKnRpbWVzdGFtcFVzOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1RdWlja1N0b3BMb2NrKTsKKworICAgICAgICAgICAgLy8gbUZvcmNlUmVhZCBtYXkgYmUgc2V0IHRvIHRydWUgYnkgc3RhcnRRdWlja1JlYWRSZXR1cm5zKCkuIEluIHRoYXQKKyAgICAgICAgICAgIC8vIGNhc2UgZG9uJ3Qgc2tpcCB0aGlzIGZyYW1lLgorICAgICAgICAgICAgaWYgKG1Gb3JjZVJlYWQpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAgdGltZWxhcHNlOiBmb3JjZWQgcmVhZCIpOworICAgICAgICAgICAgICAgIG1Gb3JjZVJlYWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAqdGltZXN0YW1wVXMgPSBtTGFzdEZyYW1lVGltZXN0YW1wVXM7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCp0aW1lc3RhbXBVcyA8CisgICAgICAgICAgICAgICAgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykpIHsKKyAgICAgICAgICAgIC8vIFNraXAgYWxsIGZyYW1lcyBmcm9tIGxhc3QgZW5jb2RlZCBmcmFtZSB1bnRpbAorICAgICAgICAgICAgLy8gc3VmZmljaWVudCB0aW1lIChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykgaGFzIHBhc3NlZC4KKyAgICAgICAgICAgIC8vIFRlbGwgdGhlIGNhbWVyYSB0byByZWxlYXNlIGl0cyByZWNvcmRpbmcgZnJhbWUgYW5kIHJldHVybi4KKyAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IHNraXBwaW5nIGludGVybWVkaWF0ZSBmcmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEZXNpcmVkIGZyYW1lIGhhcyBhcnJpdmVkIGFmdGVyIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIHRpbWU6CisgICAgICAgICAgICAvLyAtIFJlc2V0IG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgdG8gY3VycmVudCB0aW1lLgorICAgICAgICAgICAgLy8gLSBBcnRpZmljaWFsbHkgbW9kaWZ5IHRpbWVzdGFtcFVzIHRvIGJlIG9uZSBmcmFtZSB0aW1lICgxL2ZyYW1lcmF0ZSkgYWhlYWQKKyAgICAgICAgICAgIC8vIG9mIHRoZSBsYXN0IGVuY29kZWQgZnJhbWUncyB0aW1lIHN0YW1wLgorICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogZ290IHRpbWVsYXBzZSBmcmFtZSIpOworCisgICAgICAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID0gKnRpbWVzdGFtcFVzOworICAgICAgICAgICAgKnRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKKyAgICBpZiAoIW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgmdGltZXN0YW1wVXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQ2FtZXJhSWRsZUxvY2spOworICAgICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIHN0aWxsIGNhbWVyYSBhbmQgc3RvcCgpIGhhcyBiZWVuIGNhbGxlZCwgaXQgbWF5CisgICAgICAgIC8vIGJlIHdhaXRpbmcgZm9yIHRoZSBjYW1lcmEgdG8gZ2V0IGlkbGUuIEluIHRoYXQgY2FzZSByZXR1cm4KKyAgICAgICAgLy8gaW1tZWRpYXRlbHkuIENhbGxpbmcgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSB3aWxsIGxlYWQKKyAgICAgICAgLy8gdG8gYSBkZWFkbG9jayBzaW5jZSBpdCB0cmllcyB0byBhY2Nlc3MgQ2FtZXJhU291cmNlOjptTG9jayB3aGljaCBpbgorICAgICAgICAvLyB0aGlzIGNhc2UgaXMgaGVsZCBieSBDYW1lcmFTb3VyY2U6OnN0b3AoKSBjdXJyZW50bHkgd2FpdGluZyBmb3IgdGhlCisgICAgICAgIC8vIGNhbWVyYSB0byBnZXQgaWRsZS4gQW5kIGNhbWVyYSB3aWxsIG5vdCBnZXQgaWRsZSB1bnRpbCB0aGlzIGNhbGwKKyAgICAgICAgLy8gcmV0dXJucy4KKyAgICAgICAgaWYgKG1TdG9wV2FpdGluZ0ZvcklkbGVDYW1lcmEpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgZGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzcwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTb3VyY2VTcGxpdHRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhU291cmNlU3BsaXR0ZXI6Ok1lZGlhU291cmNlU3BsaXR0ZXIoc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlKSB7CisgICAgbU51bWJlck9mQ2xpZW50cyA9IDA7CisgICAgbVNvdXJjZSA9IG1lZGlhU291cmNlOworICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CisKKyAgICBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCA9IDA7CisgICAgbU51bWJlck9mQ3VycmVudFJlYWRzID0gMDsKKyAgICBtQ3VycmVudFJlYWRCaXQgPSAwOworICAgIG1MYXN0UmVhZENvbXBsZXRlZCA9IHRydWU7Cit9CisKK01lZGlhU291cmNlU3BsaXR0ZXI6On5NZWRpYVNvdXJjZVNwbGl0dGVyKCkgeworfQorCitzcDxNZWRpYVNvdXJjZT4gTWVkaWFTb3VyY2VTcGxpdHRlcjo6Y3JlYXRlQ2xpZW50KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gY2xpZW50ID0gbmV3IENsaWVudCh0aGlzLCBtTnVtYmVyT2ZDbGllbnRzKyspOworICAgIG1DbGllbnRzU3RhcnRlZC5wdXNoKGZhbHNlKTsKKyAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LnB1c2goMCk7CisgICAgcmV0dXJuIGNsaWVudDsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6c3RhcnQoaW50IGNsaWVudElkLCBNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIExPR1YoInN0YXJ0IGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgIGlmIChtQ2xpZW50c1N0YXJ0ZWRbY2xpZW50SWRdKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCsrOworCisgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgeworICAgICAgICBMT0dWKCJTdGFydGluZyByZWFsIHNvdXJjZSBmcm9tIGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChwYXJhbXMpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1DbGllbnRzU3RhcnRlZC5lZGl0SXRlbUF0KGNsaWVudElkKSA9IHRydWU7CisgICAgICAgICAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LmVkaXRJdGVtQXQoY2xpZW50SWQpID0gIW1DdXJyZW50UmVhZEJpdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNsaWVudHNTdGFydGVkLmVkaXRJdGVtQXQoY2xpZW50SWQpID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1MYXN0UmVhZENvbXBsZXRlZCkgeworICAgICAgICAgICAgLy8gTGFzdCByZWFkIHdhcyBjb21wbGV0ZWQuIFNvIGpvaW4gaW4gdGhlIHRocmVhZHMgZm9yIHRoZSBuZXh0IHJlYWQuCisgICAgICAgICAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LmVkaXRJdGVtQXQoY2xpZW50SWQpID0gIW1DdXJyZW50UmVhZEJpdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIExhc3QgcmVhZCBpcyBvbmdvaW5nLiBTbyBqb2luIGluIHRoZSB0aHJlYWRzIGZvciB0aGUgY3VycmVudCByZWFkLgorICAgICAgICAgICAgbUNsaWVudHNEZXNpcmVkUmVhZEJpdC5lZGl0SXRlbUF0KGNsaWVudElkKSA9IG1DdXJyZW50UmVhZEJpdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpzdG9wKGludCBjbGllbnRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBMT0dWKCJzdG9wIGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgIENIRUNLKGNsaWVudElkID49IDAgJiYgY2xpZW50SWQgPCBtTnVtYmVyT2ZDbGllbnRzKTsKKyAgICBDSEVDSyhtQ2xpZW50c1N0YXJ0ZWRbY2xpZW50SWRdKTsKKworICAgIGlmICgtLW1OdW1iZXJPZkNsaWVudHNTdGFydGVkID09IDApIHsKKyAgICAgICAgTE9HVigiU3RvcHBpbmcgcmVhbCBzb3VyY2UgZnJvbSBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBtQ2xpZW50c1N0YXJ0ZWQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2xpZW50c1N0YXJ0ZWQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFtTGFzdFJlYWRDb21wbGV0ZWQgJiYgKG1DbGllbnRzRGVzaXJlZFJlYWRCaXRbY2xpZW50SWRdID09IG1DdXJyZW50UmVhZEJpdCkpIHsKKyAgICAgICAgICAgIC8vICFtTGFzdFJlYWRDb21wbGV0ZWQgaW1wbGllcyB0aGF0IGJ1ZmZlciBoYXMgYmVlbiByZWFkIGZyb20gc291cmNlLCBidXQgYWxsCisgICAgICAgICAgICAvLyBjbGllbnRzIGhhdmVuJ3QgcmVhZCBpdC4KKyAgICAgICAgICAgIC8vIG1DbGllbnRzRGVzaXJlZFJlYWRCaXRbY2xpZW50SWRdID09IG1DdXJyZW50UmVhZEJpdCBpbXBsaWVzIHRoYXQgdGhpcworICAgICAgICAgICAgLy8gY2xpZW50IHdvdWxkIGhhdmUgd2FudGVkIHRvIHJlYWQgZnJvbSB0aGlzIGJ1ZmZlci4gKGkuZS4gaXQgaGFzIG5vdCB5ZXQKKyAgICAgICAgICAgIC8vIGNhbGxlZCByZWFkKCkgZm9yIHRoZSBjdXJyZW50IHJlYWQgYnVmZmVyLikKKyAgICAgICAgICAgIC8vIFNpbmNlIG90aGVyIHRocmVhZHMgbWF5IGJlIHdhaXRpbmcgZm9yIGFsbCB0aGUgY2xpZW50cycgcmVhZHMgdG8gY29tcGxldGUsCisgICAgICAgICAgICAvLyBzaWduYWwgdGhhdCB0aGlzIHJlYWQgaGFzIGJlZW4gYWJvcnRlZC4KKyAgICAgICAgICAgIHNpZ25hbFJlYWRDb21wbGV0ZV9sb2NrKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKK3NwPE1ldGFEYXRhPiBNZWRpYVNvdXJjZVNwbGl0dGVyOjpnZXRGb3JtYXQoaW50IGNsaWVudElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIExPR1YoImdldEZvcm1hdCBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OnJlYWQoaW50IGNsaWVudElkLAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIENIRUNLKGNsaWVudElkID49IDAgJiYgY2xpZW50SWQgPCBtTnVtYmVyT2ZDbGllbnRzKTsKKworICAgIExPR1YoInJlYWQgY2xpZW50ICglZCkiLCBjbGllbnRJZCk7CisgICAgKmJ1ZmZlciA9IE5VTEw7CisKKyAgICBpZiAoIW1DbGllbnRzU3RhcnRlZFtjbGllbnRJZF0pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtQ3VycmVudFJlYWRCaXQgIT0gbUNsaWVudHNEZXNpcmVkUmVhZEJpdFtjbGllbnRJZF0pIHsKKyAgICAgICAgLy8gRGVzaXJlZCBidWZmZXIgaGFzIG5vdCBiZWVuIHJlYWQgZnJvbSBzb3VyY2UgeWV0LgorCisgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNsaWVudCBpcyB0aGUgc3BlY2lhbCBjbGllbnQgd2l0aCBjbGllbnRJZCA9IDAKKyAgICAgICAgLy8gdGhlbiByZWFkIGZyb20gc291cmNlLCBlbHNlIHdhaXQgdW50aWwgdGhlIGNsaWVudCAwIGhhcyBmaW5pc2hlZAorICAgICAgICAvLyByZWFkaW5nIGZyb20gc291cmNlLgorICAgICAgICBpZiAoY2xpZW50SWQgPT0gMCkgeworICAgICAgICAgICAgLy8gV2FpdCBmb3IgYWxsIGNsaWVudCdzIGxhc3QgcmVhZCB0byBjb21wbGV0ZSBmaXJzdCBzbyBhcyB0byBub3QKKyAgICAgICAgICAgIC8vIGNvcnJ1cHQgdGhlIGJ1ZmZlciBhdCBtTGFzdFJlYWRNZWRpYUJ1ZmZlci4KKyAgICAgICAgICAgIHdhaXRGb3JBbGxDbGllbnRzTGFzdFJlYWRfbG9jayhjbGllbnRJZCk7CisKKyAgICAgICAgICAgIHJlYWRGcm9tU291cmNlX2xvY2sob3B0aW9ucyk7CisgICAgICAgICAgICAqYnVmZmVyID0gbUxhc3RSZWFkTWVkaWFCdWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YWl0Rm9yUmVhZEZyb21Tb3VyY2VfbG9jayhjbGllbnRJZCk7CisKKyAgICAgICAgICAgICpidWZmZXIgPSBtTGFzdFJlYWRNZWRpYUJ1ZmZlcjsKKyAgICAgICAgICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOworICAgICAgICB9CisgICAgICAgIENIRUNLKG1DdXJyZW50UmVhZEJpdCA9PSBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0W2NsaWVudElkXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRGVzaXJlZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZWFkIGZyb20gc291cmNlLiBVc2UgdGhlIGNhY2hlZCBkYXRhLgorICAgICAgICBDSEVDSyhjbGllbnRJZCAhPSAwKTsKKworICAgICAgICAqYnVmZmVyID0gbUxhc3RSZWFkTWVkaWFCdWZmZXI7CisgICAgICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOworICAgIH0KKworICAgIG1DbGllbnRzRGVzaXJlZFJlYWRCaXQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSAhbUNsaWVudHNEZXNpcmVkUmVhZEJpdFtjbGllbnRJZF07CisgICAgc2lnbmFsUmVhZENvbXBsZXRlX2xvY2soZmFsc2UpOworCisgICAgcmV0dXJuIG1MYXN0UmVhZFN0YXR1czsKK30KKwordm9pZCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpyZWFkRnJvbVNvdXJjZV9sb2NrKGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIG1MYXN0UmVhZFN0YXR1cyA9IG1Tb3VyY2UtPnJlYWQoJm1MYXN0UmVhZE1lZGlhQnVmZmVyICwgb3B0aW9ucyk7CisKKyAgICBtQ3VycmVudFJlYWRCaXQgPSAhbUN1cnJlbnRSZWFkQml0OworICAgIG1MYXN0UmVhZENvbXBsZXRlZCA9IGZhbHNlOworICAgIG1SZWFkRnJvbVNvdXJjZUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBNZWRpYVNvdXJjZVNwbGl0dGVyOjp3YWl0Rm9yUmVhZEZyb21Tb3VyY2VfbG9jayhpbnQzMl90IGNsaWVudElkKSB7CisgICAgbVJlYWRGcm9tU291cmNlQ29uZGl0aW9uLndhaXQobUxvY2spOworfQorCit2b2lkIE1lZGlhU291cmNlU3BsaXR0ZXI6OndhaXRGb3JBbGxDbGllbnRzTGFzdFJlYWRfbG9jayhpbnQzMl90IGNsaWVudElkKSB7CisgICAgaWYgKG1MYXN0UmVhZENvbXBsZXRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1BbGxSZWFkc0NvbXBsZXRlQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIENIRUNLKG1MYXN0UmVhZENvbXBsZXRlZCk7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2VTcGxpdHRlcjo6c2lnbmFsUmVhZENvbXBsZXRlX2xvY2soYm9vbCByZWFkQWJvcnRlZCkgeworICAgIGlmICghcmVhZEFib3J0ZWQpIHsKKyAgICAgICAgbU51bWJlck9mQ3VycmVudFJlYWRzKys7CisgICAgfQorCisgICAgaWYgKG1OdW1iZXJPZkN1cnJlbnRSZWFkcyA9PSBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCkgeworICAgICAgICBtTGFzdFJlYWRDb21wbGV0ZWQgPSB0cnVlOworICAgICAgICBtTnVtYmVyT2ZDdXJyZW50UmVhZHMgPSAwOworICAgICAgICBtQWxsUmVhZHNDb21wbGV0ZUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OnBhdXNlKGludCBjbGllbnRJZCkgeworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworLy8gQ2xpZW50CisKK01lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6Q2xpZW50KAorICAgICAgICBzcDxNZWRpYVNvdXJjZVNwbGl0dGVyPiBzcGxpdHRlciwKKyAgICAgICAgaW50MzJfdCBjbGllbnRJZCkgeworICAgIG1TcGxpdHRlciA9IHNwbGl0dGVyOworICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5zdGFydChtQ2xpZW50SWQsIHBhcmFtcyk7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6c3RvcCgpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5zdG9wKG1DbGllbnRJZCk7Cit9CisKK3NwPE1ldGFEYXRhPiBNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5nZXRGb3JtYXQobUNsaWVudElkKTsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5yZWFkKG1DbGllbnRJZCwgYnVmZmVyLCBvcHRpb25zKTsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpwYXVzZSgpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5wYXVzZShtQ2xpZW50SWQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAppbmRleCBmY2JmZGFjLi4yNzQzYjJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcApAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBwYXRoLT5zZXRUbyhzbGFzaFBvcyk7CiAgICAgfQogCi0gICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CisgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CiAKICAgICBpZiAoY29sb25Qb3MgIT0gTlVMTCkgewogICAgICAgICB1bnNpZ25lZCBsb25nIHg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggNDY0OGFkMy4uYzUzMmQwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtMTUyLDMxICsxNTIsMzggQEAKIAogc3RhdGljIGNvbnN0IENvZGVjSW5mbyBrRGVjb2RlckluZm9bXSA9IHsKICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUcsICJPTVguVEkuSlBFRy5kZWNvZGUiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLlRJLk1QMy5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiTVAzRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk9NWC5QVi5tcDNkZWMiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5USS5BTVIuZGVjb2RlIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguTnZpZGlhLmFtci5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiQU1STkJEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguUFYuYW1yZGVjIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguTnZpZGlhLmFtcndiLmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJPTVguVEkuV0JBTVIuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiQU1SV0JEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJPTVguUFYuYW1yZGVjIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguTnZpZGlhLmFhYy5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLlRJLkFBQy5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJBQUNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguUFYuYWFjZGVjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCAiRzcxMURlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsICJHNzExRGVjb2RlciIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguTnZpZGlhLm1wNC5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLjd4MzAudmlkZW8uZGVjb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5TRUMuTVBFRzQuRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiTTR2SDI2M0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlBWLm1wZWc0ZGVjIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLk52aWRpYS5oMjYzLmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIuaDI2MyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlNFQy5IMjYzLkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiTTR2SDI2M0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguUFYuaDI2M2RlYyIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5OdmlkaWEuaDI2NC5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguVEkuVmlkZW8uRGVjb2RlciIgfSwKQEAgLTE5OCwxOCArMjA1LDIxIEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlRJLlZpZGVvLmVuY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5OdmlkaWEubXA0LmVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5TRUMuTVBFRzQuRW5jb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiTTR2SDI2M0VuY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlBWLm1wZWc0ZW5jIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaDI2MyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguVEkuVmlkZW8uZW5jb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguTnZpZGlhLmgyNjMuZW5jb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguU0VDLkgyNjMuRW5jb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJNNHZIMjYzRW5jb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5QVi5oMjYzZW5jIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20uN3gzMC52aWRlby5lbmNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLmVuY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguTnZpZGlhLmgyNjQuZW5jb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5TRUMuQVZDLkVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJBVkNFbmNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguUFYuYXZjZW5jIiB9LApAQCAtMzUwLDYgKzM2MCwxMyBAQAogICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBib29sIGlzRW5jb2RlcikgewogICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7CiAKKyAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hbXIuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLmFtcndiLmRlY29kZXIiKSB8fAorICAgICAgICAgIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hYWMuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIikpIHsKKyAgICAgICAgcXVpcmtzIHw9IGtEZWNvZGVyTGllc0Fib3V0TnVtYmVyT2ZDaGFubmVsczsKKyAgICB9CisKICAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLlBWLmF2Y2RlYyIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrV2FudHNOQUxGcmFnbWVudHM7CiAgICAgfQpAQCAtODg2LDYgKzkwMywxMCBAQAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0OwogICAgIENIRUNLX0VRKE9LLCBmaW5kVGFyZ2V0Q29sb3JGb3JtYXQobWV0YSwgJmNvbG9yRm9ybWF0KSk7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CiAgICAgT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRSAqdmlkZW9fZGVmID0gJmRlZi5mb3JtYXQudmlkZW87CkBAIC0xMjM5LDYgKzEyNjAsMTAgQEAKICAgICBoMjY0dHlwZS5iTUJBRkYgPSBPTVhfRkFMU0U7CiAgICAgaDI2NHR5cGUuZUxvb3BGaWx0ZXJNb2RlID0gT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGU7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGgyNjR0eXBlLmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbE1heDsKKyAgICB9CisKICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0F2YywgJmgyNjR0eXBlLCBzaXplb2YoaDI2NHR5cGUpKTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKQEAgLTE4MjcsNyArMTg1MiwzMiBAQAogCiAgICAgICAgIGNhc2UgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZDoKICAgICAgICAgewotICAgICAgICAgICAgb25Qb3J0U2V0dGluZ3NDaGFuZ2VkKGRhdGExKTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIk9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQocG9ydD0lbGQsIGRhdGEyPTB4JTA4bHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YTEsIGRhdGEyKTsKKworICAgICAgICAgICAgaWYgKGRhdGEyID09IDAgfHwgZGF0YTIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgeworICAgICAgICAgICAgICAgIG9uUG9ydFNldHRpbmdzQ2hhbmdlZChkYXRhMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGExID09IGtQb3J0SW5kZXhPdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgJiYgZGF0YTIgPT0gT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCkgeworCisgICAgICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSByZWN0OworICAgICAgICAgICAgICAgIHJlY3QublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcmVjdCk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICAgICAgIG1PTVgtPmdldENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0LCBzaXplb2YocmVjdCkpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgY3JvcCAoJWxkLCAlbGQsICVsZCwgJWxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwgcmVjdC5uVG9wLCByZWN0Lm5XaWR0aCwgcmVjdC5uSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dFKCJnZXRDb25maWcoT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCBlcnJvciAweCUwOHgiLCBlcnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIyMTcsNiArMjI2Nyw3IEBACiAgICAgQ0hFQ0tfRVEobVBvcnRTdGF0dXNbcG9ydEluZGV4XSwgRU5BQkxFRCk7CiAgICAgbVBvcnRTdGF0dXNbcG9ydEluZGV4XSA9IERJU0FCTElORzsKIAorICAgIENPREVDX0xPR1YoInNlbmRpbmcgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSglbGQpIiwgcG9ydEluZGV4KTsKICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICBtT01YLT5zZW5kQ29tbWFuZChtTm9kZSwgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwgcG9ydEluZGV4KTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3YjA5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb1NvdXJjZURvd25TYW1wbGVyIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaD4KKyNpbmNsdWRlICJPTVhfVmlkZW8uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpWaWRlb1NvdXJjZURvd25TYW1wbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmdmlkZW9Tb3VyY2UsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgTE9HVigiQ29uc3RydWN0IFZpZGVvU291cmNlRG93blNhbXBsZXIiKTsKKyAgICBDSEVDSyh3aWR0aCA+IDApOworICAgIENIRUNLKGhlaWdodCA+IDApOworCisgICAgbVJlYWxWaWRlb1NvdXJjZSA9IHZpZGVvU291cmNlOworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisKKyAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YSgqKG1SZWFsVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpKSk7CisgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZtUmVhbFNvdXJjZVdpZHRoKSk7CisgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbVJlYWxTb3VyY2VIZWlnaHQpKTsKKworICAgIGlmICgobVdpZHRoICE9IG1SZWFsU291cmNlV2lkdGgpIHx8IChtSGVpZ2h0ICE9IG1SZWFsU291cmNlSGVpZ2h0KSkgeworICAgICAgICAvLyBDaGFuZ2UgbWV0YSBkYXRhIGZvciB3aWR0aCBhbmQgaGVpZ2h0LgorICAgICAgICBDSEVDSyhtV2lkdGggPD0gbVJlYWxTb3VyY2VXaWR0aCk7CisgICAgICAgIENIRUNLKG1IZWlnaHQgPD0gbVJlYWxTb3VyY2VIZWlnaHQpOworCisgICAgICAgIG1OZWVkRG93blNhbXBsaW5nID0gdHJ1ZTsKKyAgICAgICAgY29tcHV0ZURvd25TYW1wbGluZ1BhcmFtZXRlcnMoKTsKKyAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgbVdpZHRoKTsKKyAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1OZWVkRG93blNhbXBsaW5nID0gZmFsc2U7CisgICAgfQorfQorCitWaWRlb1NvdXJjZURvd25TYW1wbGVyOjp+VmlkZW9Tb3VyY2VEb3duU2FtcGxlcigpIHsKK30KKwordm9pZCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpjb21wdXRlRG93blNhbXBsaW5nUGFyYW1ldGVycygpIHsKKyAgICBtRG93blNhbXBsZVNraXBYID0gbVJlYWxTb3VyY2VXaWR0aCAvIG1XaWR0aDsKKyAgICBtRG93blNhbXBsZVNraXBZID0gbVJlYWxTb3VyY2VIZWlnaHQgLyBtSGVpZ2h0OworCisgICAgbURvd25TYW1wbGVPZmZzZXRYID0gbVJlYWxTb3VyY2VXaWR0aCAtIG1Eb3duU2FtcGxlU2tpcFggKiBtV2lkdGg7CisgICAgbURvd25TYW1wbGVPZmZzZXRZID0gbVJlYWxTb3VyY2VIZWlnaHQgLSBtRG93blNhbXBsZVNraXBZICogbUhlaWdodDsKK30KKwordm9pZCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpkb3duU2FtcGxlWVVWSW1hZ2UoCisgICAgICAgIGNvbnN0IE1lZGlhQnVmZmVyICZzb3VyY2VCdWZmZXIsIE1lZGlhQnVmZmVyICoqYnVmZmVyKSBjb25zdCB7CisgICAgLy8gZmluZCB0aGUgWVVWIGZvcm1hdAorICAgIGludDMyX3Qgc3JjRm9ybWF0OworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmc3JjRm9ybWF0KSk7CisgICAgWVVWSW1hZ2U6OllVVkZvcm1hdCB5dXZGb3JtYXQ7CisgICAgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwU2VtaVBsYW5hcjsKKyAgICB9IGVsc2UgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgIHl1dkZvcm1hdCA9IFlVVkltYWdlOjpZVVY0MjBQbGFuYXI7CisgICAgfQorCisgICAgLy8gYWxsb2NhdGUgbWVkaWFCdWZmZXIgZm9yIGRvd24gc2FtcGxlZCBpbWFnZSBhbmQgc2V0dXAgYSBjYW52YXMuCisgICAgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihZVVZJbWFnZTo6YnVmZmVyU2l6ZSh5dXZGb3JtYXQsIG1XaWR0aCwgbUhlaWdodCkpOworICAgIFlVVkltYWdlIHl1dkRvd25TYW1wbGVkSW1hZ2UoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQ4X3QgKikoKmJ1ZmZlciktPmRhdGEoKSk7CisgICAgWVVWQ2FudmFzIHl1dkNhbnZhc0Rvd25TYW1wbGUoeXV2RG93blNhbXBsZWRJbWFnZSk7CisKKyAgICBZVVZJbWFnZSB5dXZJbWFnZVNvdXJjZSh5dXZGb3JtYXQsCisgICAgICAgICAgICBtUmVhbFNvdXJjZVdpZHRoLCBtUmVhbFNvdXJjZUhlaWdodCwKKyAgICAgICAgICAgICh1aW50OF90ICopc291cmNlQnVmZmVyLmRhdGEoKSk7CisgICAgeXV2Q2FudmFzRG93blNhbXBsZS5kb3duc2FtcGxlKG1Eb3duU2FtcGxlT2Zmc2V0WCwgbURvd25TYW1wbGVPZmZzZXRZLAorICAgICAgICAgICAgbURvd25TYW1wbGVTa2lwWCwgbURvd25TYW1wbGVTa2lwWSwKKyAgICAgICAgICAgIHl1dkltYWdlU291cmNlKTsKK30KKworc3RhdHVzX3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIExPR1YoInN0YXJ0Iik7CisgICAgcmV0dXJuIG1SZWFsVmlkZW9Tb3VyY2UtPnN0YXJ0KCk7Cit9CisKK3N0YXR1c190IFZpZGVvU291cmNlRG93blNhbXBsZXI6OnN0b3AoKSB7CisgICAgTE9HVigic3RvcCIpOworICAgIHJldHVybiBtUmVhbFZpZGVvU291cmNlLT5zdG9wKCk7Cit9CisKK3NwPE1ldGFEYXRhPiBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpnZXRGb3JtYXQoKSB7CisgICAgTE9HVigiZ2V0Rm9ybWF0Iik7CisgICAgcmV0dXJuIG1NZXRhOworfQorCitzdGF0dXNfdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBMT0dWKCJyZWFkIik7CisgICAgTWVkaWFCdWZmZXIgKnJlYWxCdWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbVJlYWxWaWRlb1NvdXJjZS0+cmVhZCgmcmVhbEJ1ZmZlciwgb3B0aW9ucyk7CisKKyAgICBpZiAobU5lZWREb3duU2FtcGxpbmcpIHsKKyAgICAgICAgZG93blNhbXBsZVlVVkltYWdlKCpyZWFsQnVmZmVyLCBidWZmZXIpOworCisgICAgICAgIGludDY0X3QgZnJhbWVUaW1lOworICAgICAgICByZWFsQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmZnJhbWVUaW1lKTsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZSk7CisKKyAgICAgICAgLy8gV2UganVzdCB3YW50IHRoaXMgYnVmZmVyIHRvIGJlIGRlbGV0ZWQgd2hlbiB0aGUgZW5jb2RlciByZWxlYXNlcyBpdC4KKyAgICAgICAgLy8gU28gZG9uJ3QgYWRkIGEgcmVmZXJlbmNlIHRvIGl0IGFuZCBzZXQgdGhlIG9ic2VydmVyIHRvIE5VTEwuCisgICAgICAgICgqYnVmZmVyKS0+c2V0T2JzZXJ2ZXIoTlVMTCk7CisKKyAgICAgICAgLy8gVGhlIG9yaWdpbmFsIGJ1ZmZlciBpcyBubyBsb25nZXIgcmVxdWlyZWQuIFJlbGVhc2UgaXQuCisgICAgICAgIHJlYWxCdWZmZXItPnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqYnVmZmVyID0gcmVhbEJ1ZmZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpwYXVzZSgpIHsKKyAgICBMT0dWKCJwYXVzZSIpOworICAgIHJldHVybiBtUmVhbFZpZGVvU291cmNlLT5wYXVzZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawppbmRleCBiOWJhMWJlLi4yYjYzMjM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawpAQCAtNiw3ICs2LDggQEAKICAgICAgICAgU29mdHdhcmVSZW5kZXJlci5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZQorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUgXAorICAgICAgICAkKFRPUCkvaGFyZHdhcmUvbXNtN2sKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCiAgICAgICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgIFwKQEAgLTE3LDYgKzE4LDExIEBACiAgICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudFwKICAgICAgICAgbGliY2FtZXJhX2NsaWVudAogCisjIGlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSxtc203aykKK2lmZXEgKCQoVEFSR0VUX1BST0RVQ1QpLHBhc3Npb24pCisJTE9DQUxfQ0ZMQUdTICs9IC1ESEFTX1lDQkNSNDIwX1NQX0FEUkVOTworZW5kaWYKKwogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKaW5kZXggYTZkYmY2OS4uNjYyYTg0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcApAQCAtMjIsNjUgKzIyLDE4MiBAQAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwUG1lbS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KLSNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDx1aS9hbmRyb2lkX25hdGl2ZV9idWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CisKKy8vIFhYWDogVGVtcG9yYXJ5IGhhY2sgdG8gYWxsb3cgcmVmZXJlbmNpbmcgdGhlIF9BRFJFTk8gcGl4ZWwgZm9ybWF0IGhlcmUuCisjaW5jbHVkZSA8bGliZ3JhbGxvYy1xc2Q4ay9ncmFsbG9jX3ByaXYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTb2Z0d2FyZVJlbmRlcmVyOjpTb2Z0d2FyZVJlbmRlcmVyKAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKLSAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KQogICAgIDogbUNvbG9yRm9ybWF0KGNvbG9yRm9ybWF0KSwKLSAgICAgIG1Db252ZXJ0ZXIoY29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSksCi0gICAgICBtSVN1cmZhY2Uoc3VyZmFjZSksCisgICAgICBtQ29udmVydGVyKE5VTEwpLAorICAgICAgbVlVVk1vZGUoTm9uZSksCisgICAgICBtU3VyZmFjZShzdXJmYWNlKSwKICAgICAgIG1EaXNwbGF5V2lkdGgoZGlzcGxheVdpZHRoKSwKICAgICAgIG1EaXNwbGF5SGVpZ2h0KGRpc3BsYXlIZWlnaHQpLAogICAgICAgbURlY29kZWRXaWR0aChkZWNvZGVkV2lkdGgpLAotICAgICAgbURlY29kZWRIZWlnaHQoZGVjb2RlZEhlaWdodCksCi0gICAgICBtRnJhbWVTaXplKG1EZWNvZGVkV2lkdGggKiBtRGVjb2RlZEhlaWdodCAqIDIpLCAgLy8gUkdCNTY1Ci0gICAgICBtSW5kZXgoMCkgewotICAgIG1NZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKCIvZGV2L3BtZW1fYWRzcCIsIDIgKiBtRnJhbWVTaXplKTsKLSAgICBpZiAobU1lbW9yeUhlYXAtPmhlYXBJRCgpIDwgMCkgewotICAgICAgICBMT0dJKCJDcmVhdGluZyBwaHlzaWNhbCBtZW1vcnkgaGVhcCBmYWlsZWQsIHJldmVydGluZyB0byByZWd1bGFyIGhlYXAuIik7Ci0gICAgICAgIG1NZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKDIgKiBtRnJhbWVTaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzcDxNZW1vcnlIZWFwUG1lbT4gcG1lbUhlYXAgPSBuZXcgTWVtb3J5SGVhcFBtZW0obU1lbW9yeUhlYXApOwotICAgICAgICBwbWVtSGVhcC0+c2xhcCgpOwotICAgICAgICBtTWVtb3J5SGVhcCA9IHBtZW1IZWFwOworICAgICAgbURlY29kZWRIZWlnaHQoZGVjb2RlZEhlaWdodCkgeworICAgIExPR0koImlucHV0IGZvcm1hdCA9ICVkIiwgbUNvbG9yRm9ybWF0KTsKKyAgICBMT0dJKCJkaXNwbGF5ID0gJWQgeCAlZCwgZGVjb2RlZCA9ICVkIHggJWQiLAorICAgICAgICAgICAgbURpc3BsYXlXaWR0aCwgbURpc3BsYXlIZWlnaHQsIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0KTsKKworICAgIG1EZWNvZGVkV2lkdGggPSBtRGlzcGxheVdpZHRoOworICAgIG1EZWNvZGVkSGVpZ2h0ID0gbURpc3BsYXlIZWlnaHQ7CisKKyAgICBpbnQgaGFsRm9ybWF0OworICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7CisjaWYgSEFTX1lDQkNSNDIwX1NQX0FEUkVOTworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQX0FEUkVOTzsKKyAgICAgICAgICAgIG1ZVVZNb2RlID0gWVVWNDIwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAweDdmYTMwYzAwOgorICAgICAgICB7CisgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUF9BRFJFTk87CisgICAgICAgICAgICBtWVVWTW9kZSA9IFlVVjQyMHNwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworCisgICAgICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAorICAgICAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSk7CisgICAgICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgQ0hFQ0sobUlTdXJmYWNlLmdldCgpICE9IE5VTEwpOworICAgIENIRUNLKG1TdXJmYWNlLmdldCgpICE9IE5VTEwpOwogICAgIENIRUNLKG1EZWNvZGVkV2lkdGggPiAwKTsKICAgICBDSEVDSyhtRGVjb2RlZEhlaWdodCA+IDApOwotICAgIENIRUNLKG1NZW1vcnlIZWFwLT5oZWFwSUQoKSA+PSAwKTsKLSAgICBDSEVDSyhtQ29udmVydGVyLmlzVmFsaWQoKSk7CisgICAgQ0hFQ0sobUNvbnZlcnRlciA9PSBOVUxMIHx8IG1Db252ZXJ0ZXItPmlzVmFsaWQoKSk7CiAKLSAgICBJU3VyZmFjZTo6QnVmZmVySGVhcCBidWZmZXJIZWFwKAotICAgICAgICAgICAgbURpc3BsYXlXaWR0aCwgbURpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKLSAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgbU1lbW9yeUhlYXApOworICAgIENIRUNLX0VRKDAsCisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZSgKKyAgICAgICAgICAgIG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgorICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpKTsKIAotICAgIHN0YXR1c190IGVyciA9IG1JU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlckhlYXApOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtU3VyZmFjZS5nZXQoKSwgMikpOworCisgICAgLy8gV2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAzMj8/PworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCisgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0LAorICAgICAgICAgICAgICAgIGhhbEZvcm1hdCkpOwogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKLSAgICBtSVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICAgZGVsZXRlIG1Db252ZXJ0ZXI7CisgICAgbUNvbnZlcnRlciA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IEFMSUdOKHNpemVfdCB4LCBzaXplX3QgYWxpZ25tZW50KSB7CisgICAgcmV0dXJuICh4ICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpOwogfQogCiB2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlbmRlcigKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSkgewotICAgIHNpemVfdCBvZmZzZXQgPSBtSW5kZXggKiBtRnJhbWVTaXplOwotICAgIHZvaWQgKmRzdCA9ICh1aW50OF90ICopbU1lbW9yeUhlYXAtPmdldEJhc2UoKSArIG9mZnNldDsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqYnVmOworICAgIGludCBlcnI7CisgICAgaWYgKChlcnIgPSBtU3VyZmFjZS0+ZGVxdWV1ZUJ1ZmZlcihtU3VyZmFjZS5nZXQoKSwgJmJ1ZikpICE9IDApIHsKKyAgICAgICAgTE9HVygiU3VyZmFjZTo6ZGVxdWV1ZUJ1ZmZlciByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBtQ29udmVydGVyLmNvbnZlcnQoCi0gICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKLSAgICAgICAgICAgIGRhdGEsIDAsIGRzdCwgMiAqIG1EZWNvZGVkV2lkdGgpOworICAgIENIRUNLX0VRKDAsIG1TdXJmYWNlLT5sb2NrQnVmZmVyKG1TdXJmYWNlLmdldCgpLCBidWYpKTsKIAotICAgIG1JU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOwotICAgIG1JbmRleCA9IDEgLSBtSW5kZXg7CisgICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7CisKKyAgICBSZWN0IGJvdW5kcyhtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCk7CisKKyAgICB2b2lkICpkc3Q7CisgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2soCisgICAgICAgICAgICAgICAgYnVmLT5oYW5kbGUsIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sIGJvdW5kcywgJmRzdCkpOworCisgICAgaWYgKG1Db252ZXJ0ZXIpIHsKKyAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKKyAgICAgICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKKyAgICAgICAgICAgICAgICBkYXRhLCAwLCBkc3QsIGJ1Zi0+c3RyaWRlICogMik7CisgICAgfSBlbHNlIGlmIChtWVVWTW9kZSA9PSBZVVY0MjBzcFRvWVVWNDIwc3ApIHsKKyAgICAgICAgLy8gSW5wdXQgYW5kIG91dHB1dCBhcmUgYm90aCBZVVY0MjBzcCwgYnV0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzCisgICAgICAgIC8vIGFyZSBkaWZmZXJlbnQuCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbURlY29kZWRXaWR0aDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKyAgICAgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNvZGVkSGVpZ2h0OyArK2kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCBtRGVjb2RlZFdpZHRoKTsKKyAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgICAgIGRzdFkgKz0gYnVmLT5zdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSAobURlY29kZWRXaWR0aCArIDEpICYgfjE7CisgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IEFMSUdOKG1EZWNvZGVkV2lkdGggLyAyLCAzMikgKiAyOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1VWID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhCisgICAgICAgICAgICArIG1EZWNvZGVkSGVpZ2h0ICogbURlY29kZWRXaWR0aDsKKworICAgICAgICBzaXplX3QgZHN0VVZPZmZzZXQgPSBBTElHTihBTElHTihtRGVjb2RlZEhlaWdodCwgMzIpICogYnVmLT5zdHJpZGUsIDQwOTYpOworICAgICAgICB1aW50OF90ICpkc3RVViA9ICh1aW50OF90ICopZHN0ICsgZHN0VVZPZmZzZXQ7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAobURlY29kZWRIZWlnaHQgKyAxKSAvIDI7ICsraSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFVWLCBzcmNVViwgKG1EZWNvZGVkV2lkdGggKyAxKSAmIH4xKTsKKyAgICAgICAgICAgIHNyY1VWICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgICAgZHN0VVYgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1ZVVZNb2RlID09IFlVVjQyMFRvWVVWNDIwc3ApIHsKKyAgICAgICAgLy8gSW5wdXQgaXMgWVVWNDIwIHBsYW5hciwgb3V0cHV0IGlzIFlVVjQyMHNwLCBhZGhlcmUgdG8gcHJvcGVyCisgICAgICAgIC8vIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbURlY29kZWRXaWR0aDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKyAgICAgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNvZGVkSGVpZ2h0OyArK2kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCBtRGVjb2RlZFdpZHRoKTsKKyAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgICAgIGRzdFkgKz0gYnVmLT5zdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSAobURlY29kZWRXaWR0aCArIDEpIC8gMjsKKyAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gQUxJR04obURlY29kZWRXaWR0aCAvIDIsIDMyKSAqIDI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopZGF0YQorICAgICAgICAgICAgKyBtRGVjb2RlZEhlaWdodCAqIG1EZWNvZGVkV2lkdGg7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9CisgICAgICAgICAgICBzcmNVICsgKChtRGVjb2RlZFdpZHRoICsgMSkgLyAyKSAqICgobURlY29kZWRIZWlnaHQgKyAxKSAvIDIpOworCisgICAgICAgIHNpemVfdCBkc3RVVk9mZnNldCA9IEFMSUdOKEFMSUdOKG1EZWNvZGVkSGVpZ2h0LCAzMikgKiBidWYtPnN0cmlkZSwgNDA5Nik7CisgICAgICAgIHVpbnQ4X3QgKmRzdFVWID0gKHVpbnQ4X3QgKilkc3QgKyBkc3RVVk9mZnNldDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChtRGVjb2RlZEhlaWdodCArIDEpIC8gMjsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IChtRGVjb2RlZFdpZHRoICsgMSkgLyAyOyArK2opIHsKKyAgICAgICAgICAgICAgICBkc3RVVlsyICogaiArIDFdID0gc3JjVVtqXTsKKyAgICAgICAgICAgICAgICBkc3RVVlsyICogal0gPSBzcmNWW2pdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjVSArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgICAgIHNyY1YgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICAgICBkc3RVViArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShkc3QsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIENIRUNLX0VRKDAsIG1hcHBlci51bmxvY2soYnVmLT5oYW5kbGUpKTsKKworICAgIGlmICgoZXJyID0gbVN1cmZhY2UtPnF1ZXVlQnVmZmVyKG1TdXJmYWNlLmdldCgpLCBidWYpKSAhPSAwKSB7CisgICAgICAgIExPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKKyAgICB9CisgICAgYnVmID0gTlVMTDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IDBkN2RhYTkuLmY2ZjdkYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOwogICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOworICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKIAogICAgICAgICBpZiAoc2xhc2hQb3MgPiAmYmFzZVVSTFs2XSkgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBzbGFzaFBvcyAtIGJhc2VVUkwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAppbmRleCBiYmY0ODJkLi42ZWJmNGNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaApAQCAtNzYsNiArNzYsNyBAQAogICAgIGJvb2wgaXNQbGF5aW5nKCkgY29uc3Q7CiAKICAgICB2b2lkIHNldElTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmaXN1cmZhY2UpOworICAgIHZvaWQgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAgICAgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspOwogICAgIHN0YXR1c190IHNldExvb3BpbmcoYm9vbCBzaG91bGRMb29wKTsKIApAQCAtMTIxLDYgKzEyMiw3IEBACiAgICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7CiAKICAgICBzcDxJU3VyZmFjZT4gbUlTdXJmYWNlOworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogCiAgICAgU3lzdGVtVGltZVNvdXJjZSBtU3lzdGVtVGltZVNvdXJjZTsKQEAgLTIyNCw2ICsyMjYsNyBAQAogICAgIHN0YXR1c190IHNlZWtUb19sKGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBwYXVzZV9sKGJvb2wgYXRfZW9zID0gZmFsc2UpOwogICAgIHZvaWQgaW5pdFJlbmRlcmVyX2woKTsKKyAgICB2b2lkIG5vdGlmeVZpZGVvU2l6ZV9sKCk7CiAgICAgdm9pZCBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7CiAKICAgICB2b2lkIGNhbmNlbFBsYXllckV2ZW50cyhib29sIGtlZXBCdWZmZXJpbmdHb2luZyA9IGZhbHNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCmluZGV4IGM5OWRhNTkuLjgzYjc1YWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaApAQCAtNTksMTAgKzU5LDE3IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTkRFWFRZUEUgaW5kZXgsCiAgICAgICAgICAgICBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcik7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLCBidWZmZXJfaWQgKmJ1ZmZlcik7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIHZvaWQgKipidWZmZXJfZGF0YSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAppbmRleCBiNWIzMWFjLi44YzdjNTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKQEAgLTQ5LDEwICs0OSwxNiBAQAogICAgIHN0YXR1c190IGdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKTsKICAgICBzdGF0dXNfdCBzZXRDb25maWcoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSk7CiAKKyAgICBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycyhPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlKTsKKwogICAgIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcik7CiAKKyAgICBzdGF0dXNfdCB1c2VHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLAorICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcik7CisKICAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzaXplX3Qgc2l6ZSwgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwKICAgICAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSk7CkBAIC0xMjUsNCArMTMxLDMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gT01YX05PREVfSU5TVEFOQ0VfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAppbmRleCA5ZWVkMDg5Li44ZDU4MDU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaApAQCAtMjQsMTQgKzI0LDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogY2xhc3MgTWVtb3J5SGVhcEJhc2U7CiAKIGNsYXNzIFNvZnR3YXJlUmVuZGVyZXIgOiBwdWJsaWMgVmlkZW9SZW5kZXJlciB7CiBwdWJsaWM6CiAgICAgU29mdHdhcmVSZW5kZXJlcigKICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KTsKIApAQCAtNDEsMTQgKzQxLDE4IEBACiAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqcGxhdGZvcm1Qcml2YXRlKTsKIAogcHJpdmF0ZToKKyAgICBlbnVtIFlVVk1vZGUgeworICAgICAgICBOb25lLAorICAgICAgICBZVVY0MjBUb1lVVjQyMHNwLAorICAgICAgICBZVVY0MjBzcFRvWVVWNDIwc3AsCisgICAgfTsKKwogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1Db2xvckZvcm1hdDsKLSAgICBDb2xvckNvbnZlcnRlciBtQ29udmVydGVyOwotICAgIHNwPElTdXJmYWNlPiBtSVN1cmZhY2U7CisgICAgQ29sb3JDb252ZXJ0ZXIgKm1Db252ZXJ0ZXI7CisgICAgWVVWTW9kZSBtWVVWTW9kZTsKKyAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKICAgICBzaXplX3QgbURpc3BsYXlXaWR0aCwgbURpc3BsYXlIZWlnaHQ7CiAgICAgc2l6ZV90IG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0OwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBtTWVtb3J5SGVhcDsKLSAgICBpbnQgbUluZGV4OwogCiAgICAgU29mdHdhcmVSZW5kZXJlcihjb25zdCBTb2Z0d2FyZVJlbmRlcmVyICYpOwogICAgIFNvZnR3YXJlUmVuZGVyZXIgJm9wZXJhdG9yPShjb25zdCBTb2Z0d2FyZVJlbmRlcmVyICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCBjOTI3ZGExLi5kODlmNTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtMjg5LDYgKzI4OSwxMSBAQAogICAgICAgICAgICAgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CiB9CiAKK3N0YXR1c190IE9NWDo6ZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKKyAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5lbmFibGVHcmFwaGljQnVmZmVycyhwb3J0X2luZGV4LCBlbmFibGUpOworfQorCiBzdGF0dXNfdCBPTVg6OnVzZUJ1ZmZlcigKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CkBAIC0yOTYsNiArMzAxLDEzIEBACiAgICAgICAgICAgICBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlcik7CiB9CiAKK3N0YXR1c190IE9NWDo6dXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLCBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPnVzZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBwb3J0X2luZGV4LCBncmFwaGljQnVmZmVyLCBidWZmZXIpOworfQorCiBzdGF0dXNfdCBPTVg6OmFsbG9jYXRlQnVmZmVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgc2l6ZV90IHNpemUsCiAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCB2b2lkICoqYnVmZmVyX2RhdGEpIHsKQEAgLTQ5NywxMiArNTA5LDE3IEBACiAgICAgfQogCiAgICAgaWYgKCFpbXBsKSB7CisjaWYgMAogICAgICAgICBMT0dXKCJVc2luZyBzb2Z0d2FyZSByZW5kZXJlci4iKTsKICAgICAgICAgaW1wbCA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKAogICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0LAogICAgICAgICAgICAgICAgIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgICAgIGVuY29kZWRXaWR0aCwgZW5jb2RlZEhlaWdodCk7CisjZWxzZQorICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4gbmV3IE9NWFJlbmRlcmVyKGltcGwpOwpAQCAtNTI3LDQgKzU0NCwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggNWRiNTE2ZS4uYmE0ZDc2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKQEAgLTQwLDYgKzQxLDExIEBACiAgICAgICAgICAgbUlzQmFja3VwKGZhbHNlKSB7CiAgICAgfQogCisgICAgQnVmZmVyTWV0YShjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlcikKKyAgICAgICAgOiBtR3JhcGhpY0J1ZmZlcihncmFwaGljQnVmZmVyKSwKKyAgICAgICAgICBtSXNCYWNrdXAoZmFsc2UpIHsKKyAgICB9CisKICAgICB2b2lkIENvcHlGcm9tT01YKGNvbnN0IE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIpIHsKICAgICAgICAgaWYgKCFtSXNCYWNrdXApIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTYxLDYgKzY3LDcgQEAKICAgICB9CiAKIHByaXZhdGU6CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7CiAgICAgc3A8SU1lbW9yeT4gbU1lbTsKICAgICBzaXplX3QgbVNpemU7CiAgICAgYm9vbCBtSXNCYWNrdXA7CkBAIC0yNDAsNiArMjQ3LDQzIEBACiAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogfQogCitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmVuYWJsZUdyYXBoaWNCdWZmZXJzKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBtSGFuZGxlLAorICAgICAgICAgICAgY29uc3RfY2FzdDxPTVhfU1RSSU5HPigiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzIiksCisgICAgICAgICAgICAmaW5kZXgpOworCisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIExPR0UoIk9NWF9HZXRFeHRlbnNpb25JbmRleCBmYWlsZWQiKTsKKworICAgICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CisgICAgfQorCisgICAgT01YX1ZFUlNJT05UWVBFIHZlcjsKKyAgICB2ZXIucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICB2ZXIucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICB2ZXIucy5uUmV2aXNpb24gPSAwOworICAgIHZlci5zLm5TdGVwID0gMDsKKyAgICBFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyc1BhcmFtcyBwYXJhbXMgPSB7CisgICAgICAgIHNpemVvZihFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyc1BhcmFtcyksIHZlciwgcG9ydEluZGV4LCBlbmFibGUsCisgICAgfTsKKworICAgIGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZwYXJhbXMpOworCisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIExPR0UoIk9NWF9FbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycyBmYWlsZWQgd2l0aCBlcnJvciAlZCAoMHglMDh4KSIsCisgICAgICAgICAgICAgICAgZXJyLCBlcnIpOworCisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjp1c2VCdWZmZXIoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKSB7CkBAIC0yNzMsNiArMzE3LDYwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVzZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlciwKKyAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBPTVhfSU5ERVhUWVBFIGluZGV4OworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgbUhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyIiksCisgICAgICAgICAgICAmaW5kZXgpOworCisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIExPR0UoIk9NWF9HZXRFeHRlbnNpb25JbmRleCBmYWlsZWQiKTsKKworICAgICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CisgICAgfQorCisgICAgQnVmZmVyTWV0YSAqYnVmZmVyTWV0YSA9IG5ldyBCdWZmZXJNZXRhKGdyYXBoaWNCdWZmZXIpOworCisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcjsKKworICAgIE9NWF9WRVJTSU9OVFlQRSB2ZXI7CisgICAgdmVyLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgdmVyLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgdmVyLnMublJldmlzaW9uID0gMDsKKyAgICB2ZXIucy5uU3RlcCA9IDA7CisgICAgVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlclBhcmFtcyBwYXJhbXMgPSB7CisgICAgICAgIHNpemVvZihVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zKSwgdmVyLCBwb3J0SW5kZXgsIGJ1ZmZlck1ldGEsCisgICAgICAgICZoZWFkZXIsIGdyYXBoaWNCdWZmZXIsCisgICAgfTsKKworICAgIGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZwYXJhbXMpOworCisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIExPR0UoIk9NWF9Vc2VBbmRyb2lkTmF0aXZlQnVmZmVyIGZhaWxlZCB3aXRoIGVycm9yICVkICgweCUwOHgpIiwgZXJyLAorICAgICAgICAgICAgICAgIGVycik7CisKKyAgICAgICAgZGVsZXRlIGJ1ZmZlck1ldGE7CisgICAgICAgIGJ1ZmZlck1ldGEgPSBOVUxMOworCisgICAgICAgICpidWZmZXIgPSAwOworCisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlck1ldGEpOworCisgICAgKmJ1ZmZlciA9IGhlYWRlcjsKKworICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmFsbG9jYXRlQnVmZmVyKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgc2l6ZV90IHNpemUsIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsCiAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSkgewpAQCAtNDk4LDQgKzU5NiwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCA1ZWMwM2IyLi5mOTI4YzA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgcGF0aC0+c2V0VG8oc2xhc2hQb3MpOwogICAgIH0KIAotICAgIGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPmNfc3RyKCksICc6Jyk7CisgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+Y19zdHIoKSwgJzonKTsKIAogICAgIGlmIChjb2xvblBvcyAhPSBOVUxMKSB7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCmluZGV4IDBkYjM1OTUuLjYxMmNhZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApAQCAtMTg3LDcgKzE4Nyw3IEBACiAgICAgQVN0cmluZyBmb3JtYXQ7CiAgICAgZ2V0Rm9ybWF0KGluZGV4LCAmZm9ybWF0KTsKIAotICAgIGNoYXIgKmxhc3RTcGFjZVBvcyA9IHN0cnJjaHIoZm9ybWF0LmNfc3RyKCksICcgJyk7CisgICAgY29uc3QgY2hhciAqbGFzdFNwYWNlUG9zID0gc3RycmNocihmb3JtYXQuY19zdHIoKSwgJyAnKTsKICAgICBDSEVDSyhsYXN0U3BhY2VQb3MgIT0gTlVMTCk7CiAKICAgICBjaGFyICplbmQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBhMzFiMmIyLi4wOWRjMTU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTg5MCw3ICs4OTAsNyBAQAogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKICAgICAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOwogCiAgICAgICAgICAgICBpZiAoc2xhc2hQb3MgPiAmYmFzZVVSTFs2XSkgewogICAgICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgc2xhc2hQb3MgLSBiYXNlVVJMKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5NGFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTMgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAorICAgICAgICBZVVZJbWFnZS5jcHAgICAgICAgICAgICBcCisgICAgICAgIFlVVkNhbnZhcy5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCisgICAgICAgIGxpYmN1dGlscworCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF95dXYKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkNhbnZhcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWQ2FudmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGFhNzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkNhbnZhcy5jcHAKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJZVVZDYW52YXMiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworWVVWQ2FudmFzOjpZVVZDYW52YXMoWVVWSW1hZ2UgJnl1dkltYWdlKQorICAgIDogbVlVVkltYWdlKHl1dkltYWdlKSB7Cit9CisKK1lVVkNhbnZhczo6fllVVkNhbnZhcygpIHsKK30KKwordm9pZCBZVVZDYW52YXM6OkZpbGxZVVYodWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSkgeworICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1ZVVZJbWFnZS5oZWlnaHQoKTsgKyt5KSB7CisgICAgICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1ZVVZJbWFnZS53aWR0aCgpOyArK3gpIHsKKyAgICAgICAgICAgIG1ZVVZJbWFnZS5zZXRQaXhlbFZhbHVlKHgsIHksIHlWYWx1ZSwgdVZhbHVlLCB2VmFsdWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFlVVkNhbnZhczo6RmlsbFlVVlJlY3RhbmdsZShjb25zdCBSZWN0JiByZWN0LAorICAgICAgICB1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKSB7CisgICAgZm9yIChpbnQzMl90IHkgPSByZWN0LnRvcDsgeSA8IHJlY3QuYm90dG9tOyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IHggPSByZWN0LmxlZnQ7IHggPCByZWN0LnJpZ2h0OyArK3gpIHsKKyAgICAgICAgICAgIG1ZVVZJbWFnZS5zZXRQaXhlbFZhbHVlKHgsIHksIHlWYWx1ZSwgdVZhbHVlLCB2VmFsdWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFlVVkNhbnZhczo6Q29weUltYWdlUmVjdCgKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSkgeworCisgICAgLy8gVHJ5IGZhc3QgY29weSBmaXJzdAorICAgIGlmIChZVVZJbWFnZTo6ZmFzdENvcHlSZWN0YW5nbGUoCisgICAgICAgICAgICAgICAgc3JjUmVjdCwKKyAgICAgICAgICAgICAgICBkZXN0U3RhcnRYLCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgICAgIHNyY0ltYWdlLCBtWVVWSW1hZ2UpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IHNyY1N0YXJ0WCA9IHNyY1JlY3QubGVmdDsKKyAgICBpbnQzMl90IHNyY1N0YXJ0WSA9IHNyY1JlY3QudG9wOworICAgIGZvciAoaW50MzJfdCBvZmZzZXRZID0gMDsgb2Zmc2V0WSA8IHNyY1JlY3QuaGVpZ2h0KCk7ICsrb2Zmc2V0WSkgeworICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WCA9IDA7IG9mZnNldFggPCBzcmNSZWN0LndpZHRoKCk7ICsrb2Zmc2V0WCkgeworICAgICAgICAgICAgaW50MzJfdCBzcmNYID0gc3JjU3RhcnRYICsgb2Zmc2V0WDsKKyAgICAgICAgICAgIGludDMyX3Qgc3JjWSA9IHNyY1N0YXJ0WSArIG9mZnNldFk7CisKKyAgICAgICAgICAgIGludDMyX3QgZGVzdFggPSBkZXN0U3RhcnRYICsgb2Zmc2V0WDsKKyAgICAgICAgICAgIGludDMyX3QgZGVzdFkgPSBkZXN0U3RhcnRZICsgb2Zmc2V0WTsKKworICAgICAgICAgICAgdWludDhfdCB5VmFsdWU7CisgICAgICAgICAgICB1aW50OF90IHVWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdlZhbHVlOworCisgICAgICAgICAgICBzcmNJbWFnZS5nZXRQaXhlbFZhbHVlKHNyY1gsIHNyY1ksICZ5VmFsdWUsICZ1VmFsdWUsICZ2VmFsdWUpOworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoZGVzdFgsIGRlc3RZLCB5VmFsdWUsIHVWYWx1ZSwgdlZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBZVVZDYW52YXM6OmRvd25zYW1wbGUoCisgICAgICAgIGludDMyX3Qgc3JjT2Zmc2V0WCwgaW50MzJfdCBzcmNPZmZzZXRZLAorICAgICAgICBpbnQzMl90IHNraXBYLCBpbnQzMl90IHNraXBZLAorICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UpIHsKKyAgICAvLyBUT0RPOiBBZGQgYSBsb3cgcGFzcyBmaWx0ZXIgZm9yIGRvd25zYW1wbGluZy4KKworICAgIC8vIENoZWNrIHRoYXQgc3JjSW1hZ2UgaXMgYmlnIGVub3VnaCB0byBmaWxsIG1ZVVZJbWFnZS4KKyAgICBDSEVDSygoc3JjT2Zmc2V0WCArIChtWVVWSW1hZ2Uud2lkdGgoKSAtIDEpICogc2tpcFgpIDwgc3JjSW1hZ2Uud2lkdGgoKSk7CisgICAgQ0hFQ0soKHNyY09mZnNldFkgKyAobVlVVkltYWdlLmhlaWdodCgpIC0gMSkgKiBza2lwWSkgPCBzcmNJbWFnZS5oZWlnaHQoKSk7CisKKyAgICB1aW50OF90IHlWYWx1ZTsKKyAgICB1aW50OF90IHVWYWx1ZTsKKyAgICB1aW50OF90IHZWYWx1ZTsKKworICAgIGludDMyX3Qgc3JjWSA9IHNyY09mZnNldFk7CisgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbVlVVkltYWdlLmhlaWdodCgpOyArK3kpIHsKKyAgICAgICAgaW50MzJfdCBzcmNYID0gc3JjT2Zmc2V0WDsKKyAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVlVVkltYWdlLndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAgc3JjSW1hZ2UuZ2V0UGl4ZWxWYWx1ZShzcmNYLCBzcmNZLCAmeVZhbHVlLCAmdVZhbHVlLCAmdlZhbHVlKTsKKyAgICAgICAgICAgIG1ZVVZJbWFnZS5zZXRQaXhlbFZhbHVlKHgsIHksIHlWYWx1ZSwgdVZhbHVlLCB2VmFsdWUpOworCisgICAgICAgICAgICBzcmNYICs9IHNraXBYOworICAgICAgICB9CisgICAgICAgIHNyY1kgKz0gc2tpcFk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMjA2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJZVVZJbWFnZSIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmg+CisjaW5jbHVkZSA8dWkvUmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitZVVZJbWFnZTo6WVVWSW1hZ2UoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBtWVVWRm9ybWF0ID0geXV2Rm9ybWF0OworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisKKyAgICBzaXplX3QgbnVtYmVyT2ZCeXRlcyA9IGJ1ZmZlclNpemUoeXV2Rm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgdWludDhfdFtudW1iZXJPZkJ5dGVzXTsKKyAgICBtQnVmZmVyID0gYnVmZmVyOworICAgIG1Pd25CdWZmZXIgPSB0cnVlOworCisgICAgaW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCk7Cit9CisKK1lVVkltYWdlOjpZVVZJbWFnZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgdWludDhfdCAqYnVmZmVyKSB7CisgICAgbVlVVkZvcm1hdCA9IHl1dkZvcm1hdDsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgbU93bkJ1ZmZlciA9IGZhbHNlOworCisgICAgaW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCk7Cit9CisKKy8vc3RhdGljCitzaXplX3QgWVVWSW1hZ2U6OmJ1ZmZlclNpemUoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBpbnQzMl90IG51bWJlck9mUGl4ZWxzID0gd2lkdGgqaGVpZ2h0OworICAgIHNpemVfdCBudW1iZXJPZkJ5dGVzID0gMDsKKyAgICBpZiAoeXV2Rm9ybWF0ID09IFlVVjQyMFBsYW5hciB8fCB5dXZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAvLyBZIHRha2VzIG51bWJlck9mUGl4ZWxzIGJ5dGVzIGFuZCBVL1YgdGFrZSBudW1iZXJPZlBpeGVscy80IGJ5dGVzIGVhY2guCisgICAgICAgIG51bWJlck9mQnl0ZXMgPSAoc2l6ZV90KShudW1iZXJPZlBpeGVscyArIChudW1iZXJPZlBpeGVscyA+PiAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRm9ybWF0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIG51bWJlck9mQnl0ZXM7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OmluaXRpYWxpemVZVVZQb2ludGVycygpIHsKKyAgICBpbnQzMl90IG51bWJlck9mUGl4ZWxzID0gbVdpZHRoICogbUhlaWdodDsKKworICAgIGlmIChtWVVWRm9ybWF0ID09IFlVVjQyMFBsYW5hcikgeworICAgICAgICBtWWRhdGEgPSAodWludDhfdCAqKW1CdWZmZXI7CisgICAgICAgIG1VZGF0YSA9IG1ZZGF0YSArIG51bWJlck9mUGl4ZWxzOworICAgICAgICBtVmRhdGEgPSBtVWRhdGEgKyAobnVtYmVyT2ZQaXhlbHMgPj4gMik7CisgICAgfSBlbHNlIGlmIChtWVVWRm9ybWF0ID09IFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgLy8gVSBhbmQgViBjaGFubmVscyBhcmUgaW50ZXJsZWF2ZWQgYXMgVlVWVVZVLgorICAgICAgICAvLyBTbyBWIGRhdGEgc3RhcnRzIGF0IHRoZSBlbmQgb2YgWSBjaGFubmVsIGFuZAorICAgICAgICAvLyBVIGRhdGEgc3RhcnRzIHJpZ2h0IGFmdGVyIFYncyBzdGFydC4KKyAgICAgICAgbVlkYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyOworICAgICAgICBtVmRhdGEgPSBtWWRhdGEgKyBudW1iZXJPZlBpeGVsczsKKyAgICAgICAgbVVkYXRhID0gbVZkYXRhICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJGb3JtYXQgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitZVVZJbWFnZTo6fllVVkltYWdlKCkgeworICAgIGlmIChtT3duQnVmZmVyKSBkZWxldGVbXSBtQnVmZmVyOworfQorCitib29sIFlVVkltYWdlOjpnZXRPZmZzZXRzKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICBpbnQzMl90ICp5T2Zmc2V0LCBpbnQzMl90ICp1T2Zmc2V0LCBpbnQzMl90ICp2T2Zmc2V0KSBjb25zdCB7CisgICAgKnlPZmZzZXQgPSB5Km1XaWR0aCArIHg7CisKKyAgICBpbnQzMl90IHV2T2Zmc2V0ID0gKHkgPj4gMSkgKiAobVdpZHRoID4+IDEpICsgKHggPj4gMSk7CisgICAgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKSB7CisgICAgICAgICp1T2Zmc2V0ID0gdXZPZmZzZXQ7CisgICAgICAgICp2T2Zmc2V0ID0gdXZPZmZzZXQ7CisgICAgfSBlbHNlIGlmIChtWVVWRm9ybWF0ID09IFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgLy8gU2luY2UgVSBhbmQgViBjaGFubmVscyBhcmUgaW50ZXJsZWF2ZWQsIG9mZnNldHMgbmVlZAorICAgICAgICAvLyB0byBiZSBkb3VibGVkLgorICAgICAgICAqdU9mZnNldCA9IDIqdXZPZmZzZXQ7CisgICAgICAgICp2T2Zmc2V0ID0gMip1dk9mZnNldDsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJGb3JtYXQgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OmdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAorICAgICAgICBpbnQzMl90ICp5RGF0YU9mZnNldEluY3JlbWVudCwKKyAgICAgICAgaW50MzJfdCAqdURhdGFPZmZzZXRJbmNyZW1lbnQsCisgICAgICAgIGludDMyX3QgKnZEYXRhT2Zmc2V0SW5jcmVtZW50KSBjb25zdCB7CisgICAgKnlEYXRhT2Zmc2V0SW5jcmVtZW50ID0gbVdpZHRoOworCisgICAgaW50MzJfdCB1dkRhdGFPZmZzZXRJbmNyZW1lbnQgPSBtV2lkdGggPj4gMTsKKworICAgIGlmIChtWVVWRm9ybWF0ID09IFlVVjQyMFBsYW5hcikgeworICAgICAgICAqdURhdGFPZmZzZXRJbmNyZW1lbnQgPSB1dkRhdGFPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICp2RGF0YU9mZnNldEluY3JlbWVudCA9IHV2RGF0YU9mZnNldEluY3JlbWVudDsKKyAgICB9IGVsc2UgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAvLyBTaW5jZSBVIGFuZCBWIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZCwgb2Zmc2V0cyBuZWVkCisgICAgICAgIC8vIHRvIGJlIGRvdWJsZWQuCisgICAgICAgICp1RGF0YU9mZnNldEluY3JlbWVudCA9IDIqdXZEYXRhT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAqdkRhdGFPZmZzZXRJbmNyZW1lbnQgPSAyKnV2RGF0YU9mZnNldEluY3JlbWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJGb3JtYXQgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQ4X3QqIFlVVkltYWdlOjpnZXRZQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiBtWWRhdGEgKyBvZmZzZXQ7Cit9CisKK3VpbnQ4X3QqIFlVVkltYWdlOjpnZXRVQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiBtVWRhdGEgKyBvZmZzZXQ7Cit9CisKK3VpbnQ4X3QqIFlVVkltYWdlOjpnZXRWQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiBtVmRhdGEgKyBvZmZzZXQ7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OmdldFlVVkFkZHJlc3NlcyhpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgdWludDhfdCAqKnlBZGRyLCB1aW50OF90ICoqdUFkZHIsIHVpbnQ4X3QgKip2QWRkcikgY29uc3QgeworICAgIGludDMyX3QgeU9mZnNldDsKKyAgICBpbnQzMl90IHVPZmZzZXQ7CisgICAgaW50MzJfdCB2T2Zmc2V0OworICAgIGlmICghZ2V0T2Zmc2V0cyh4LCB5LCAmeU9mZnNldCwgJnVPZmZzZXQsICZ2T2Zmc2V0KSkgcmV0dXJuIGZhbHNlOworCisgICAgKnlBZGRyID0gZ2V0WUFkZHJlc3MoeU9mZnNldCk7CisgICAgKnVBZGRyID0gZ2V0VUFkZHJlc3ModU9mZnNldCk7CisgICAgKnZBZGRyID0gZ2V0VkFkZHJlc3Modk9mZnNldCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBZVVZJbWFnZTo6dmFsaWRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSkgY29uc3QgeworICAgIHJldHVybiAoeCA+PSAwICYmIHggPCBtV2lkdGggJiYKKyAgICAgICAgICAgIHkgPj0gMCAmJiB5IDwgbUhlaWdodCk7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OmdldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIHVpbnQ4X3QgKnlQdHIsIHVpbnQ4X3QgKnVQdHIsIHVpbnQ4X3QgKnZQdHIpIGNvbnN0IHsKKyAgICBDSEVDSyh2YWxpZFBpeGVsKHgsIHkpKTsKKworICAgIHVpbnQ4X3QgKnlBZGRyOworICAgIHVpbnQ4X3QgKnVBZGRyOworICAgIHVpbnQ4X3QgKnZBZGRyOworICAgIGlmICghZ2V0WVVWQWRkcmVzc2VzKHgsIHksICZ5QWRkciwgJnVBZGRyLCAmdkFkZHIpKSByZXR1cm4gZmFsc2U7CisKKyAgICAqeVB0ciA9ICp5QWRkcjsKKyAgICAqdVB0ciA9ICp1QWRkcjsKKyAgICAqdlB0ciA9ICp2QWRkcjsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFlVVkltYWdlOjpzZXRQaXhlbFZhbHVlKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICB1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKSB7CisgICAgQ0hFQ0sodmFsaWRQaXhlbCh4LCB5KSk7CisKKyAgICB1aW50OF90ICp5QWRkcjsKKyAgICB1aW50OF90ICp1QWRkcjsKKyAgICB1aW50OF90ICp2QWRkcjsKKyAgICBpZiAoIWdldFlVVkFkZHJlc3Nlcyh4LCB5LCAmeUFkZHIsICZ1QWRkciwgJnZBZGRyKSkgcmV0dXJuIGZhbHNlOworCisgICAgKnlBZGRyID0geVZhbHVlOworICAgICp1QWRkciA9IHVWYWx1ZTsKKyAgICAqdkFkZHIgPSB2VmFsdWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBZVVZJbWFnZTo6ZmFzdENvcHlSZWN0YW5nbGU0MjBQbGFuYXIoCisgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpIHsKKyAgICBDSEVDSyhzcmNJbWFnZS5tWVVWRm9ybWF0ID09IFlVVjQyMFBsYW5hcik7CisgICAgQ0hFQ0soZGVzdEltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKTsKKworICAgIGludDMyX3Qgc3JjU3RhcnRYID0gc3JjUmVjdC5sZWZ0OworICAgIGludDMyX3Qgc3JjU3RhcnRZID0gc3JjUmVjdC50b3A7CisgICAgaW50MzJfdCB3aWR0aCA9IHNyY1JlY3Qud2lkdGgoKTsKKyAgICBpbnQzMl90IGhlaWdodCA9IHNyY1JlY3QuaGVpZ2h0KCk7CisKKyAgICAvLyBHZXQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdGFydCBhZGRyZXNzZXMKKyAgICB1aW50OF90ICp5U3JjQWRkckJhc2U7CisgICAgdWludDhfdCAqdVNyY0FkZHJCYXNlOworICAgIHVpbnQ4X3QgKnZTcmNBZGRyQmFzZTsKKyAgICBzcmNJbWFnZS5nZXRZVVZBZGRyZXNzZXMoc3JjU3RhcnRYLCBzcmNTdGFydFksCisgICAgICAgICAgICAmeVNyY0FkZHJCYXNlLCAmdVNyY0FkZHJCYXNlLCAmdlNyY0FkZHJCYXNlKTsKKworICAgIHVpbnQ4X3QgKnlEZXN0QWRkckJhc2U7CisgICAgdWludDhfdCAqdURlc3RBZGRyQmFzZTsKKyAgICB1aW50OF90ICp2RGVzdEFkZHJCYXNlOworICAgIGRlc3RJbWFnZS5nZXRZVVZBZGRyZXNzZXMoZGVzdFN0YXJ0WCwgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgICZ5RGVzdEFkZHJCYXNlLCAmdURlc3RBZGRyQmFzZSwgJnZEZXN0QWRkckJhc2UpOworCisgICAgLy8gR2V0IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gb2Zmc2V0IGluY3JlbWVudHMgaW5jdXJyZWQgaW4gZ29pbmcKKyAgICAvLyBmcm9tIG9uZSBkYXRhIHJvdyB0byBuZXh0LgorICAgIGludDMyX3QgeVNyY09mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHVTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB2U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIHNyY0ltYWdlLmdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAorICAgICAgICAgICAgJnlTcmNPZmZzZXRJbmNyZW1lbnQsICZ1U3JjT2Zmc2V0SW5jcmVtZW50LCAmdlNyY09mZnNldEluY3JlbWVudCk7CisKKyAgICBpbnQzMl90IHlEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB2RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBkZXN0SW1hZ2UuZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgICAgICAmeURlc3RPZmZzZXRJbmNyZW1lbnQsICZ1RGVzdE9mZnNldEluY3JlbWVudCwgJnZEZXN0T2Zmc2V0SW5jcmVtZW50KTsKKworICAgIC8vIENvcHkgWQorICAgIHsKKyAgICAgICAgc2l6ZV90IG51bWJlck9mWUJ5dGVzUGVyUm93ID0gKHNpemVfdCkgd2lkdGg7CisgICAgICAgIHVpbnQ4X3QgKnlTcmNBZGRyID0geVNyY0FkZHJCYXNlOworICAgICAgICB1aW50OF90ICp5RGVzdEFkZHIgPSB5RGVzdEFkZHJCYXNlOworICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCBoZWlnaHQ7ICsrb2Zmc2V0WSkgeworICAgICAgICAgICAgbWVtY3B5KHlEZXN0QWRkciwgeVNyY0FkZHIsIG51bWJlck9mWUJ5dGVzUGVyUm93KTsKKworICAgICAgICAgICAgeVNyY0FkZHIgKz0geVNyY09mZnNldEluY3JlbWVudDsKKyAgICAgICAgICAgIHlEZXN0QWRkciArPSB5RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvcHkgVQorICAgIHsKKyAgICAgICAgc2l6ZV90IG51bWJlck9mVUJ5dGVzUGVyUm93ID0gKHNpemVfdCkgKHdpZHRoID4+IDEpOworICAgICAgICB1aW50OF90ICp1U3JjQWRkciA9IHVTcmNBZGRyQmFzZTsKKyAgICAgICAgdWludDhfdCAqdURlc3RBZGRyID0gdURlc3RBZGRyQmFzZTsKKyAgICAgICAgLy8gRXZlcnkgb3RoZXIgcm93IGhhcyBhbiBlbnRyeSBmb3IgVS9WIGNoYW5uZWwgdmFsdWVzLiBIZW5jZSBvbmx5CisgICAgICAgIC8vIGdvIGhhbGYgdGhlIGhlaWdodC4KKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgKGhlaWdodCA+PiAxKTsgKytvZmZzZXRZKSB7CisgICAgICAgICAgICBtZW1jcHkodURlc3RBZGRyLCB1U3JjQWRkciwgbnVtYmVyT2ZVQnl0ZXNQZXJSb3cpOworCisgICAgICAgICAgICB1U3JjQWRkciArPSB1U3JjT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAgICAgdURlc3RBZGRyICs9IHVEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29weSBWCisgICAgeworICAgICAgICBzaXplX3QgbnVtYmVyT2ZWQnl0ZXNQZXJSb3cgPSAoc2l6ZV90KSAod2lkdGggPj4gMSk7CisgICAgICAgIHVpbnQ4X3QgKnZTcmNBZGRyID0gdlNyY0FkZHJCYXNlOworICAgICAgICB1aW50OF90ICp2RGVzdEFkZHIgPSB2RGVzdEFkZHJCYXNlOworICAgICAgICAvLyBFdmVyeSBvdGhlciBwaXhlbCByb3cgaGFzIGEgVS9WIGRhdGEgcm93LiBIZW5jZSBvbmx5IGdvIGhhbGYgdGhlIGhlaWdodC4KKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgKGhlaWdodCA+PiAxKTsgKytvZmZzZXRZKSB7CisgICAgICAgICAgICBtZW1jcHkodkRlc3RBZGRyLCB2U3JjQWRkciwgbnVtYmVyT2ZWQnl0ZXNQZXJSb3cpOworCisgICAgICAgICAgICB2U3JjQWRkciArPSB2U3JjT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAgICAgdkRlc3RBZGRyICs9IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZTQyMFNlbWlQbGFuYXIoCisgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpIHsKKyAgICBDSEVDSyhzcmNJbWFnZS5tWVVWRm9ybWF0ID09IFlVVjQyMFNlbWlQbGFuYXIpOworICAgIENIRUNLKGRlc3RJbWFnZS5tWVVWRm9ybWF0ID09IFlVVjQyMFNlbWlQbGFuYXIpOworCisgICAgaW50MzJfdCBzcmNTdGFydFggPSBzcmNSZWN0LmxlZnQ7CisgICAgaW50MzJfdCBzcmNTdGFydFkgPSBzcmNSZWN0LnRvcDsKKyAgICBpbnQzMl90IHdpZHRoID0gc3JjUmVjdC53aWR0aCgpOworICAgIGludDMyX3QgaGVpZ2h0ID0gc3JjUmVjdC5oZWlnaHQoKTsKKworICAgIC8vIEdldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0YXJ0IGFkZHJlc3NlcworICAgIHVpbnQ4X3QgKnlTcmNBZGRyQmFzZTsKKyAgICB1aW50OF90ICp1U3JjQWRkckJhc2U7CisgICAgdWludDhfdCAqdlNyY0FkZHJCYXNlOworICAgIHNyY0ltYWdlLmdldFlVVkFkZHJlc3NlcyhzcmNTdGFydFgsIHNyY1N0YXJ0WSwKKyAgICAgICAgICAgICZ5U3JjQWRkckJhc2UsICZ1U3JjQWRkckJhc2UsICZ2U3JjQWRkckJhc2UpOworCisgICAgdWludDhfdCAqeURlc3RBZGRyQmFzZTsKKyAgICB1aW50OF90ICp1RGVzdEFkZHJCYXNlOworICAgIHVpbnQ4X3QgKnZEZXN0QWRkckJhc2U7CisgICAgZGVzdEltYWdlLmdldFlVVkFkZHJlc3NlcyhkZXN0U3RhcnRYLCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgJnlEZXN0QWRkckJhc2UsICZ1RGVzdEFkZHJCYXNlLCAmdkRlc3RBZGRyQmFzZSk7CisKKyAgICAvLyBHZXQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZmZzZXQgaW5jcmVtZW50cyBpbmN1cnJlZCBpbiBnb2luZworICAgIC8vIGZyb20gb25lIGRhdGEgcm93IHRvIG5leHQuCisgICAgaW50MzJfdCB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdVNyY09mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHZTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgc3JjSW1hZ2UuZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgICAgICAmeVNyY09mZnNldEluY3JlbWVudCwgJnVTcmNPZmZzZXRJbmNyZW1lbnQsICZ2U3JjT2Zmc2V0SW5jcmVtZW50KTsKKworICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOworCisgICAgLy8gQ29weSBZCisgICAgeworICAgICAgICBzaXplX3QgbnVtYmVyT2ZZQnl0ZXNQZXJSb3cgPSAoc2l6ZV90KSB3aWR0aDsKKyAgICAgICAgdWludDhfdCAqeVNyY0FkZHIgPSB5U3JjQWRkckJhc2U7CisgICAgICAgIHVpbnQ4X3QgKnlEZXN0QWRkciA9IHlEZXN0QWRkckJhc2U7CisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRZID0gMDsgb2Zmc2V0WSA8IGhlaWdodDsgKytvZmZzZXRZKSB7CisgICAgICAgICAgICBtZW1jcHkoeURlc3RBZGRyLCB5U3JjQWRkciwgbnVtYmVyT2ZZQnl0ZXNQZXJSb3cpOworCisgICAgICAgICAgICB5U3JjQWRkciA9IHlTcmNBZGRyICsgeVNyY09mZnNldEluY3JlbWVudDsKKyAgICAgICAgICAgIHlEZXN0QWRkciA9IHlEZXN0QWRkciArIHlEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29weSBVVgorICAgIHsKKyAgICAgICAgLy8gVVYgYXJlIGludGVybGVhdmVkLiBTbyBudW1iZXIgb2YgVVYgYnl0ZXMgcGVyIHJvdyBpcyAyKih3aWR0aC8yKS4KKyAgICAgICAgc2l6ZV90IG51bWJlck9mVVZCeXRlc1BlclJvdyA9IChzaXplX3QpIHdpZHRoOworICAgICAgICB1aW50OF90ICp2U3JjQWRkciA9IHZTcmNBZGRyQmFzZTsKKyAgICAgICAgdWludDhfdCAqdkRlc3RBZGRyID0gdkRlc3RBZGRyQmFzZTsKKyAgICAgICAgLy8gRXZlcnkgb3RoZXIgcGl4ZWwgcm93IGhhcyBhIFUvViBkYXRhIHJvdy4gSGVuY2Ugb25seSBnbyBoYWxmIHRoZSBoZWlnaHQuCisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRZID0gMDsgb2Zmc2V0WSA8IChoZWlnaHQgPj4gMSk7ICsrb2Zmc2V0WSkgeworICAgICAgICAgICAgbWVtY3B5KHZEZXN0QWRkciwgdlNyY0FkZHIsIG51bWJlck9mVVZCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHZTcmNBZGRyICs9IHZTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICAgICB2RGVzdEFkZHIgKz0gdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHN0YXRpYworYm9vbCBZVVZJbWFnZTo6ZmFzdENvcHlSZWN0YW5nbGUoCisgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpIHsKKyAgICBpZiAoc3JjSW1hZ2UubVlVVkZvcm1hdCA9PSBkZXN0SW1hZ2UubVlVVkZvcm1hdCkgeworICAgICAgICBpZiAoc3JjSW1hZ2UubVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgICAgIGZhc3RDb3B5UmVjdGFuZ2xlNDIwUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICBzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICBkZXN0U3RhcnRYLCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwgZGVzdEltYWdlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNJbWFnZS5tWVVWRm9ybWF0ID09IFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgICAgIGZhc3RDb3B5UmVjdGFuZ2xlNDIwU2VtaVBsYW5hcigKKyAgICAgICAgICAgICAgICAgICAgc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgZGVzdFN0YXJ0WCwgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsIGRlc3RJbWFnZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordWludDhfdCBjbGFtcCh1aW50OF90IHYsIHVpbnQ4X3QgbWluVmFsdWUsIHVpbnQ4X3QgbWF4VmFsdWUpIHsKKyAgICBDSEVDSyhtYXhWYWx1ZSA+PSBtaW5WYWx1ZSk7CisKKyAgICBpZiAodiA8IG1pblZhbHVlKSByZXR1cm4gbWluVmFsdWU7CisgICAgZWxzZSBpZiAodiA+IG1heFZhbHVlKSByZXR1cm4gbWF4VmFsdWU7CisgICAgZWxzZSByZXR1cm4gdjsKK30KKwordm9pZCBZVVZJbWFnZTo6eXV2MnJnYih1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlLAorICAgICAgICB1aW50OF90ICpyLCB1aW50OF90ICpnLCB1aW50OF90ICpiKSBjb25zdCB7CisgICAgKnIgPSB5VmFsdWUgKyAoMS4zNzA3MDUgKiAodlZhbHVlLTEyOCkpOworICAgICpnID0geVZhbHVlIC0gKDAuNjk4MDAxICogKHZWYWx1ZS0xMjgpKSAtICgwLjMzNzYzMyAqICh1VmFsdWUtMTI4KSk7CisgICAgKmIgPSB5VmFsdWUgKyAoMS43MzI0NDYgKiAodVZhbHVlLTEyOCkpOworCisgICAgKnIgPSBjbGFtcCgqciwgMCwgMjU1KTsKKyAgICAqZyA9IGNsYW1wKCpnLCAwLCAyNTUpOworICAgICpiID0gY2xhbXAoKmIsIDAsIDI1NSk7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OndyaXRlVG9QUE0oY29uc3QgY2hhciAqZmlsZW5hbWUpIGNvbnN0IHsKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAidyIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZnByaW50ZihmcCwgIlAzXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiJWQgJWRcbiIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgZnByaW50ZihmcCwgIjI1NVxuIik7CisgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbUhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1XaWR0aDsgKyt4KSB7CisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdVZhbHVlOworICAgICAgICAgICAgdWludDhfdCB2VmFsdWU7CisgICAgICAgICAgICBnZXRQaXhlbFZhbHVlKHgsIHksICZ5VmFsdWUsICZ1VmFsdWUsICYgdlZhbHVlKTsKKworICAgICAgICAgICAgdWludDhfdCByVmFsdWU7CisgICAgICAgICAgICB1aW50OF90IGdWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgYlZhbHVlOworICAgICAgICAgICAgeXV2MnJnYih5VmFsdWUsIHVWYWx1ZSwgdlZhbHVlLCAmclZhbHVlLCAmZ1ZhbHVlLCAmYlZhbHVlKTsKKworICAgICAgICAgICAgZnByaW50ZihmcCwgIiVkICVkICVkXG4iLCAoaW50MzJfdClyVmFsdWUsIChpbnQzMl90KWdWYWx1ZSwgKGludDMyX3QpYlZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FuZHJvaWQubWsgYi9tZWRpYS9tdHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTAyZjZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw3OCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cENsaWVudC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ3Vyc29yLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERlYnVnLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBFdmVudFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8uY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5LmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldC5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFNlcnZlci5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUluZm8uY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2UuY3BwICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwVXRpbHMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK0xPQ0FMX01PRFVMRTo9IGxpYm10cAorCitMT0NBTF9DRkxBR1MgOj0gLURNVFBfREVWSUNFIC1ETVRQX0hPU1QKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCitlbmRpZgorCitpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBDbGllbnQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cEN1cnNvci5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZWJ1Zy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERldmljZS5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRXZlbnRQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZXZpY2VJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8uY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eS5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFJlcXVlc3RQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVzcG9uc2VQYWNrZXQuY3BwICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSW5mby5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlci5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZS5jcHAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBVdGlscy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9DQUxfTU9EVUxFOj0gbGlibXRwCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9IT1NUCisKK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cENsaWVudC5jcHAgYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWI2YTQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cENsaWVudC5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cENsaWVudCIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwQ2xpZW50LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDIwKQorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvdXNiX2NoOS5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGJvb2wgaXNNdHBEZXZpY2UodWludDE2X3QgdmVuZG9yLCB1aW50MTZfdCBwcm9kdWN0KSB7CisgICAgLy8gU2FuZGlzayBTYW5zYSBGdXplCisgICAgaWYgKHZlbmRvciA9PSAweDA3ODEgJiYgcHJvZHVjdCA9PSAweDc0YzIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIC8vIFNhbXN1bmcgWVAtWjUKKyAgICBpZiAodmVuZG9yID09IDB4MDRlOCAmJiBwcm9kdWN0ID09IDB4NTAzYykKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitjbGFzcyBNdHBDbGllbnRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3ByaXZhdGU6CisgICAgTXRwQ2xpZW50KiAgIG1DbGllbnQ7CisKK3B1YmxpYzoKKyAgICBNdHBDbGllbnRUaHJlYWQoTXRwQ2xpZW50KiBjbGllbnQpCisgICAgICAgIDogbUNsaWVudChjbGllbnQpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+dGhyZWFkTG9vcCgpOworICAgIH0KK307CisKKworTXRwQ2xpZW50OjpNdHBDbGllbnQoKQorICAgIDogICBtVGhyZWFkKE5VTEwpLAorICAgICAgICBtVXNiSG9zdENvbnRleHQoTlVMTCksCisgICAgICAgIG1Eb25lKGZhbHNlKQoreworfQorCitNdHBDbGllbnQ6On5NdHBDbGllbnQoKSB7CisgICAgdXNiX2hvc3RfY2xlYW51cChtVXNiSG9zdENvbnRleHQpOworfQorCitib29sIE10cENsaWVudDo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpZiAobVRocmVhZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBtVXNiSG9zdENvbnRleHQgPSB1c2JfaG9zdF9pbml0KCk7CisgICAgaWYgKCFtVXNiSG9zdENvbnRleHQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1UaHJlYWQgPSBuZXcgTXRwQ2xpZW50VGhyZWFkKHRoaXMpOworICAgIG1UaHJlYWQtPnJ1bigiTXRwQ2xpZW50VGhyZWFkIik7CisgICAgLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBkbyBpbml0aWFsIGRldmljZSBkaXNjb3ZlcnkgYmVmb3JlIHJldHVybmluZworICAgIG1UaHJlYWRTdGFydENvbmRpdGlvbi53YWl0KG1NdXRleCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNdHBDbGllbnQ6OnN0b3AoKSB7CisgICAgbURvbmUgPSB0cnVlOworfQorCitNdHBEZXZpY2UqIE10cENsaWVudDo6Z2V0RGV2aWNlKGludCBpZCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtRGV2aWNlTGlzdFtpXTsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0SUQoKSA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitib29sIE10cENsaWVudDo6dXNiRGV2aWNlQWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSkgeworICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIqIGRlc2M7CisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2l0ZXIgaXRlcjsKKworICAgIHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UgPSB1c2JfZGV2aWNlX29wZW4oZGV2bmFtZSk7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgTE9HRSgidXNiX2RldmljZV9vcGVuIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBtRG9uZTsKKyAgICB9CisKKyAgICB1c2JfZGVzY3JpcHRvcl9pdGVyX2luaXQoZGV2aWNlLCAmaXRlcik7CisKKyAgICB3aGlsZSAoKGRlc2MgPSB1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkZXNjLT5iRGVzY3JpcHRvclR5cGUgPT0gVVNCX0RUX0lOVEVSRkFDRSkgeworICAgICAgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaW50ZXJmYWNlID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKilkZXNjOworCisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlLT5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX1NUSUxMX0lNQUdFICYmCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gMSAmJiAvLyBTdGlsbCBJbWFnZSBDYXB0dXJlCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gMSkgICAgIC8vIFBpY3R1cmUgVHJhbnNmZXIgUHJvdG9jb2wgKFBJTUEgMTU0NzApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgY2FtZXJhOiBcIiVzXCIgXCIlc1wiXG4iLCB1c2JfZGV2aWNlX2dldF9tYW51ZmFjdHVyZXJfbmFtZShkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2RldmljZV9nZXRfcHJvZHVjdF9uYW1lKGRldmljZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VDbGFzcyA9PSAweEZGICYmCisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVN1YkNsYXNzID09IDB4RkYgJiYKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIqIGludGVyZmFjZU5hbWUgPSB1c2JfZGV2aWNlX2dldF9zdHJpbmcoZGV2aWNlLCBpbnRlcmZhY2UtPmlJbnRlcmZhY2UpOworICAgICAgICAgICAgICAgIGlmICghaW50ZXJmYWNlTmFtZSB8fCBzdHJjbXAoaW50ZXJmYWNlTmFtZSwgIk1UUCIpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvLyBMb29rcyBsaWtlIGFuIGFuZHJvaWQgc3R5bGUgTVRQIGRldmljZQorICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIE1UUCBkZXZpY2U6IFwiJXNcIiBcIiVzXCJcbiIsIHVzYl9kZXZpY2VfZ2V0X21hbnVmYWN0dXJlcl9uYW1lKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2aWNlX2dldF9wcm9kdWN0X25hbWUoZGV2aWNlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIHNwZWNpYWwgY2FzZWQgZGV2aWNlcyBiYXNlZCBvbiB2ZW5kb3IvcHJvZHVjdCBJRAorICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBkb2luZyB0aGlzIG1haW5seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAgICAgICAgICAgIHVpbnQxNl90IHZlbmRvciA9IHVzYl9kZXZpY2VfZ2V0X3ZlbmRvcl9pZChkZXZpY2UpOworICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb2R1Y3QgPSB1c2JfZGV2aWNlX2dldF9wcm9kdWN0X2lkKGRldmljZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpc010cERldmljZSh2ZW5kb3IsIHByb2R1Y3QpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhbiBNVFAgb3IgUFRQIGRldmljZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBNVFAgT1Mgc3RyaW5nIGFuZCBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgLy8gc29tZSBtdXNpYyBwbGF5ZXJzIG5lZWQgdG8gc2VlIHRoaXMgYmVmb3JlIGVudGVyaW5nIE1UUCBtb2RlLgorICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIGludCByZXQgPSB1c2JfZGV2aWNlX3NlbmRfY29udHJvbChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBVU0JfRElSX0lOfFVTQl9SRUNJUF9ERVZJQ0V8VVNCX1RZUEVfU1RBTkRBUkQsCisgICAgICAgICAgICAgICAgICAgICAgICBVU0JfUkVRX0dFVF9ERVNDUklQVE9SLCAoVVNCX0RUX1NUUklORyA8PCA4KSB8IDB4RUUsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBzaXplb2YoYnVmZmVyKSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBwcmludGYoInVzYl9kZXZpY2Vfc2VuZF9jb250cm9sIHJldHVybmVkICVkIGVycm5vOiAlZFxuIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJnb3QgTVRQIHN0cmluZyAlc1xuIiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdXNiX2RldmljZV9zZW5kX2NvbnRyb2woZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRXxVU0JfVFlQRV9WRU5ET1IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgc2l6ZW9mKGJ1ZmZlciksIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiT1MgZGVzY3JpcHRvciBnb3QgJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJubyBNVFAgc3RyaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBoZXJlLCB0aGVuIHdlIGhhdmUgYSBsaWtlbHkgTVRQIG9yIFBUUCBkZXZpY2UKKworICAgICAgICAgICAgLy8gaW50ZXJmYWNlIHNob3VsZCBiZSBmb2xsb3dlZCBieSB0aHJlZSBlbmRwb2ludHMKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXA7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2luX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9vdXRfZGVzYyA9IE5VTEw7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2ludHJfZGVzYyA9IE5VTEw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgIGVwID0gKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqKXVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcik7CisgICAgICAgICAgICAgICAgaWYgKCFlcCB8fCBlcC0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwX2luX2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZXBfb3V0X2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVwLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UICYmCisgICAgICAgICAgICAgICAgICAgIGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgIGVwX2ludHJfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZXBfaW5fZGVzYyB8fCAhZXBfb3V0X2Rlc2MgfHwgIWVwX2ludHJfZGVzYykgeworICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBtRG9uZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW4gPSB1c2JfZW5kcG9pbnRfb3BlbihkZXZpY2UsIGVwX2luX2Rlc2MpOworICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfb3V0ID0gdXNiX2VuZHBvaW50X29wZW4oZGV2aWNlLCBlcF9vdXRfZGVzYyk7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbnRyID0gdXNiX2VuZHBvaW50X29wZW4oZGV2aWNlLCBlcF9pbnRyX2Rlc2MpOworCisgICAgICAgICAgICBpZiAodXNiX2RldmljZV9jbGFpbV9pbnRlcmZhY2UoZGV2aWNlLCBpbnRlcmZhY2UtPmJJbnRlcmZhY2VOdW1iZXIpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgidXNiX2RldmljZV9jbGFpbV9pbnRlcmZhY2UgZmFpbGVkIGVycm5vOiAlZFxuIiwgZXJybm8pOworICAgICAgICAgICAgICAgIHVzYl9lbmRwb2ludF9jbG9zZShlcF9pbik7CisgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX291dCk7CisgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX2ludHIpOworICAgICAgICAgICAgICAgIHJldHVybiBtRG9uZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTXRwRGV2aWNlKiBtdHBEZXZpY2UgPSBuZXcgTXRwRGV2aWNlKGRldmljZSwgaW50ZXJmYWNlLT5iSW50ZXJmYWNlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW4sIGVwX291dCwgZXBfaW50cik7CisgICAgICAgICAgICBtRGV2aWNlTGlzdC5hZGQobXRwRGV2aWNlKTsKKyAgICAgICAgICAgIG10cERldmljZS0+aW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgZGV2aWNlQWRkZWQobXRwRGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBtRG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVzYl9kZXZpY2VfY2xvc2UoZGV2aWNlKTsKKyAgICByZXR1cm4gbURvbmU7Cit9CisKK2Jvb2wgTXRwQ2xpZW50Ojp1c2JEZXZpY2VSZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cERldmljZSogZGV2aWNlID0gbURldmljZUxpc3RbaV07CisgICAgICAgIGlmICghc3RyY21wKGRldm5hbWUsIGRldmljZS0+Z2V0RGV2aWNlTmFtZSgpKSkgeworICAgICAgICAgICAgZGV2aWNlUmVtb3ZlZChkZXZpY2UpOworICAgICAgICAgICAgbURldmljZUxpc3QucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICAgICAgTE9HRCgiQ2FtZXJhIHJlbW92ZWQhXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtRG9uZTsKK30KKworYm9vbCBNdHBDbGllbnQ6OnVzYkRpc2NvdmVyeURvbmUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgbVRocmVhZFN0YXJ0Q29uZGl0aW9uLnNpZ25hbCgpOworICAgIHJldHVybiBtRG9uZTsKK30KKworYm9vbCBNdHBDbGllbnQ6OnRocmVhZExvb3AoKSB7CisgICAgdXNiX2hvc3RfcnVuKG1Vc2JIb3N0Q29udGV4dCwgdXNiX2RldmljZV9hZGRlZCwgdXNiX2RldmljZV9yZW1vdmVkLCB1c2JfZGlzY292ZXJ5X2RvbmUsIHRoaXMpOworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50IE10cENsaWVudDo6dXNiX2RldmljZV9hZGRlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIExPR0QoInVzYl9kZXZpY2VfYWRkZWQgJXNcbiIsIGRldm5hbWUpOworICAgIHJldHVybiAoKE10cENsaWVudCAqKWNsaWVudF9kYXRhKS0+dXNiRGV2aWNlQWRkZWQoZGV2bmFtZSk7Cit9CisKK2ludCBNdHBDbGllbnQ6OnVzYl9kZXZpY2VfcmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIExPR0QoInVzYl9kZXZpY2VfcmVtb3ZlZCAlc1xuIiwgZGV2bmFtZSk7CisgICAgcmV0dXJuICgoTXRwQ2xpZW50ICopY2xpZW50X2RhdGEpLT51c2JEZXZpY2VSZW1vdmVkKGRldm5hbWUpOworfQorCitpbnQgTXRwQ2xpZW50Ojp1c2JfZGlzY292ZXJ5X2RvbmUodm9pZCogY2xpZW50X2RhdGEpIHsKKyAgICBMT0dEKCJ1c2JfZGlzY292ZXJ5X2RvbmVcbiIpOworICAgIHJldHVybiAoKE10cENsaWVudCAqKWNsaWVudF9kYXRhKS0+dXNiRGlzY292ZXJ5RG9uZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cENsaWVudC5oIGIvbWVkaWEvbXRwL010cENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWM1MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9DTElFTlRfSAorI2RlZmluZSBfTVRQX0NMSUVOVF9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCitzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBDbGllbnRUaHJlYWQ7CisKK2NsYXNzIE10cENsaWVudCB7Citwcml2YXRlOgorICAgIE10cERldmljZUxpc3QgICAgICAgICAgICAgICBtRGV2aWNlTGlzdDsKKyAgICBNdHBDbGllbnRUaHJlYWQqICAgICAgICAgICAgbVRocmVhZDsKKyAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgbVRocmVhZFN0YXJ0Q29uZGl0aW9uOworICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTXV0ZXg7CisgICAgc3RydWN0IHVzYl9ob3N0X2NvbnRleHQqICAgIG1Vc2JIb3N0Q29udGV4dDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbURvbmU7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBDbGllbnQoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwQ2xpZW50KCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzdGFydCgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHN0b3AoKTsKKworICAgIGlubGluZSBNdHBEZXZpY2VMaXN0JiAgIGdldERldmljZUxpc3QoKSB7IHJldHVybiBtRGV2aWNlTGlzdDsgfQorICAgIE10cERldmljZSogICAgICAgICAgICAgIGdldERldmljZShpbnQgaWQpOworCisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkZXZpY2VBZGRlZChNdHBEZXZpY2UgKmRldmljZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpID0gMDsKKworcHJpdmF0ZToKKyAgICAvLyB0aGVzZSByZXR1cm4gdHJ1ZSBpZiB3ZSBzaG91bGQgc3RvcCBtb25pdG9yaW5nIFVTQiBhbmQgY2xlYW4gdXAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB1c2JEZXZpY2VBZGRlZChjb25zdCBjaGFyICpkZXZuYW1lKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB1c2JEZXZpY2VSZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHVzYkRpc2NvdmVyeURvbmUoKTsKKworICAgIGZyaWVuZCBjbGFzcyBNdHBDbGllbnRUaHJlYWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcCgpOworICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIHVzYl9kZXZpY2VfYWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpOworICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIHVzYl9kZXZpY2VfcmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgdXNiX2Rpc2NvdmVyeV9kb25lKHZvaWQqIGNsaWVudF9kYXRhKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ3Vyc29yLmNwcCBiL21lZGlhL210cC9NdHBDdXJzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZDkwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmNwcApAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ3Vyc29yIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBDdXJzb3IuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisKKworI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBEZXZpY2UgQ29sdW1uIElEcyAqLworLyogVGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIE10cEN1cnNvci5qYXZhICovCisjZGVmaW5lIERFVklDRV9ST1dfSUQgICAgICAgICAgIDEKKyNkZWZpbmUgREVWSUNFX01BTlVGQUNUVVJFUiAgICAgMgorI2RlZmluZSBERVZJQ0VfTU9ERUwgICAgICAgICAgICAzCisKKy8qIFN0b3JhZ2UgQ29sdW1uIElEcyAqLworLyogVGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIE10cEN1cnNvci5qYXZhICovCisjZGVmaW5lIFNUT1JBR0VfUk9XX0lEICAgICAgICAgIDEwMQorI2RlZmluZSBTVE9SQUdFX0lERU5USUZJRVIgICAgICAxMDIKKyNkZWZpbmUgU1RPUkFHRV9ERVNDUklQVElPTiAgICAgMTAzCisKKy8qIE9iamVjdCBDb2x1bW4gSURzICovCisvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmphdmEgKi8KKyNkZWZpbmUgT0JKRUNUX1JPV19JRCAgICAgICAgICAgICAgIDIwMQorI2RlZmluZSBPQkpFQ1RfU1RPUkFHRV9JRCAgICAgICAgICAgMjAyCisjZGVmaW5lIE9CSkVDVF9GT1JNQVQgICAgICAgICAgICAgICAyMDMKKyNkZWZpbmUgT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTICAgIDIwNAorI2RlZmluZSBPQkpFQ1RfU0laRSAgICAgICAgICAgICAgICAgMjA1CisjZGVmaW5lIE9CSkVDVF9USFVNQl9GT1JNQVQgICAgICAgICAyMDYKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX1NJWkUgICAgICAgICAgIDIwNworI2RlZmluZSBPQkpFQ1RfVEhVTUJfV0lEVEggICAgICAgICAgMjA4CisjZGVmaW5lIE9CSkVDVF9USFVNQl9IRUlHSFQgICAgICAgICAyMDkKKyNkZWZpbmUgT0JKRUNUX0lNQUdFX1dJRFRIICAgICAgICAgIDIxMAorI2RlZmluZSBPQkpFQ1RfSU1BR0VfSEVJR0hUICAgICAgICAgMjExCisjZGVmaW5lIE9CSkVDVF9JTUFHRV9ERVBUSCAgICAgICAgICAyMTIKKyNkZWZpbmUgT0JKRUNUX1BBUkVOVCAgICAgICAgICAgICAgIDIxMworI2RlZmluZSBPQkpFQ1RfQVNTT0NJQVRJT05fVFlQRSAgICAgMjE0CisjZGVmaW5lIE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDICAgICAyMTUKKyNkZWZpbmUgT0JKRUNUX1NFUVVFTkNFX05VTUJFUiAgICAgIDIxNgorI2RlZmluZSBPQkpFQ1RfTkFNRSAgICAgICAgICAgICAgICAgMjE3CisjZGVmaW5lIE9CSkVDVF9EQVRFX0NSRUFURUQgICAgICAgICAyMTgKKyNkZWZpbmUgT0JKRUNUX0RBVEVfTU9ESUZJRUQgICAgICAgIDIxOQorI2RlZmluZSBPQkpFQ1RfS0VZV09SRFMgICAgICAgICAgICAgMjIwCisjZGVmaW5lIE9CSkVDVF9USFVNQiAgICAgICAgICAgICAgICAyMjEKKworTXRwQ3Vyc29yOjpNdHBDdXJzb3IoTXRwQ2xpZW50KiBjbGllbnQsIGludCBxdWVyeVR5cGUsIGludCBkZXZpY2VJRCwKKyAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsCisgICAgICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50LCBpbnQqIGNvbHVtbnMpCisgICAgICAgIDogICBtQ2xpZW50KGNsaWVudCksCisgICAgICAgICAgICBtUXVlcnlUeXBlKHF1ZXJ5VHlwZSksCisgICAgICAgICAgICBtRGV2aWNlSUQoZGV2aWNlSUQpLAorICAgICAgICAgICAgbVN0b3JhZ2VJRChzdG9yYWdlSUQpLAorICAgICAgICAgICAgbVFiamVjdElEKG9iamVjdElEKSwKKyAgICAgICAgICAgIG1Db2x1bW5Db3VudChjb2x1bW5Db3VudCksCisgICAgICAgICAgICBtQ29sdW1ucyhOVUxMKQoreworICAgIGlmIChjb2x1bW5zKSB7CisgICAgICAgIG1Db2x1bW5zID0gbmV3IGludFtjb2x1bW5Db3VudF07CisgICAgICAgIG1lbWNweShtQ29sdW1ucywgY29sdW1ucywgY29sdW1uQ291bnQgKiBzaXplb2YoaW50KSk7CisgICAgfQorfQorCitNdHBDdXJzb3I6On5NdHBDdXJzb3IoKSB7CisgICAgZGVsZXRlW10gbUNvbHVtbnM7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxXaW5kb3coQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIExPR0QoIk10cEN1cnNvcjo6ZmlsbFdpbmRvdyBtUXVlcnlUeXBlOiAlZFxuIiwgbVF1ZXJ5VHlwZSk7CisKKyAgICBzd2l0Y2ggKG1RdWVyeVR5cGUpIHsKKyAgICAgICAgY2FzZSBERVZJQ0U6CisgICAgICAgICAgICByZXR1cm4gZmlsbERldmljZXMod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgREVWSUNFX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxEZXZpY2Uod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgU1RPUkFHRToKKyAgICAgICAgICAgIHJldHVybiBmaWxsU3RvcmFnZXMod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgU1RPUkFHRV9JRDoKKyAgICAgICAgICAgIHJldHVybiBmaWxsU3RvcmFnZSh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1Q6CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdHMod2luZG93LCAwLCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgT0JKRUNUX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3Qod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgU1RPUkFHRV9DSElMRFJFTjoKKyAgICAgICAgICAgIHJldHVybiBmaWxsT2JqZWN0cyh3aW5kb3csIC0xLCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgT0JKRUNUX0NISUxEUkVOOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3RzKHdpbmRvdywgbVFiamVjdElELCBzdGFydFBvcyk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJNdHBDdXJzb3I6OmZpbGxXaW5kb3c6IHVua25vd24gcXVlcnkgdHlwZSAlZFxuIiwgbVF1ZXJ5VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxEZXZpY2VzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZUxpc3QmIGRldmljZUxpc3QgPSBtQ2xpZW50LT5nZXREZXZpY2VMaXN0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXZpY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cERldmljZSogZGV2aWNlID0gZGV2aWNlTGlzdFtpXTsKKyAgICAgICAgaWYgKGZpbGxEZXZpY2Uod2luZG93LCBkZXZpY2UsIHN0YXJ0UG9zKSkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIHN0YXJ0UG9zKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxEZXZpY2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKGRldmljZSAmJiBmaWxsRGV2aWNlKHdpbmRvdywgZGV2aWNlLCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmICghZGV2aWNlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBNdHBTdG9yYWdlSURMaXN0KiBzdG9yYWdlSURzID0gZGV2aWNlLT5nZXRTdG9yYWdlSURzKCk7CisgICAgaWYgKCFzdG9yYWdlSURzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmFnZUlEcy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9ICgqc3RvcmFnZUlEcylbaV07CisgICAgICAgIGlmIChmaWxsU3RvcmFnZSh3aW5kb3csIGRldmljZSwgc3RvcmFnZUlELCBzdGFydFBvcykpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBzdGFydFBvcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIHN0b3JhZ2VJRHM7CisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgTXRwQ3Vyc29yOjpmaWxsU3RvcmFnZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxTdG9yYWdlKHdpbmRvdywgZGV2aWNlLCBtU3RvcmFnZUlELCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxPYmplY3RzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgcGFyZW50LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKCFkZXZpY2UpCisgICAgICAgIHJldHVybiAwOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBkZXZpY2UtPmdldE9iamVjdEhhbmRsZXMobVN0b3JhZ2VJRCwgMCwgcGFyZW50KTsKKyAgICBpZiAoIWhhbmRsZXMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzLT5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gKCpoYW5kbGVzKVtpXTsKKyAgICAgICAgaWYgKGZpbGxPYmplY3Qod2luZG93LCBkZXZpY2UsIGhhbmRsZSwgc3RhcnRQb3MpKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgc3RhcnRQb3MrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIHJldHVybiBjb3VudDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxPYmplY3Qod2luZG93LCBkZXZpY2UsIG1RYmplY3RJRCwgc3RhcnRQb3MpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitib29sIE10cEN1cnNvcjo6ZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsIGludCByb3cpIHsKKyAgICBNdHBEZXZpY2VJbmZvKiBkZXZpY2VJbmZvID0gZGV2aWNlLT5nZXREZXZpY2VJbmZvKCk7CisgICAgaWYgKCFkZXZpY2VJbmZvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbHVtbkNvdW50OyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtQ29sdW1uc1tpXSkgeworICAgICAgICAgICAgY2FzZSBERVZJQ0VfUk9XX0lEOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIGRldmljZS0+Z2V0SUQoKSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX01BTlVGQUNUVVJFUjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFN0cmluZyh3aW5kb3csIGRldmljZUluZm8tPm1NYW51ZmFjdHVyZXIsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERFVklDRV9NT0RFTDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFN0cmluZyh3aW5kb3csIGRldmljZUluZm8tPm1Nb2RlbCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiZmlsbERldmljZTogdW5rbm93biBjb2x1bW4gJWRcbiIsIG1Db2x1bW5zW2ldKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgaW50IHJvdykgeworCitMT0dEKCJmaWxsU3RvcmFnZSAlZFxuIiwgc3RvcmFnZUlEKTsKKworICAgIE10cFN0b3JhZ2VJbmZvKiBzdG9yYWdlSW5mbyA9IGRldmljZS0+Z2V0U3RvcmFnZUluZm8oc3RvcmFnZUlEKTsKKyAgICBpZiAoIXN0b3JhZ2VJbmZvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpIHsKKyAgICAgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgY2hhciogdGV4dDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2x1bW5Db3VudDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobUNvbHVtbnNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgc3RvcmFnZUlELCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0lERU5USUZJRVI6CisgICAgICAgICAgICAgICAgdGV4dCA9IHN0b3JhZ2VJbmZvLT5tVm9sdW1lSWRlbnRpZmllcjsKKyAgICAgICAgICAgICAgICBpZiAoIXRleHQgfHwgIXRleHRbMF0pCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiQ2FtZXJhIFN0b3JhZ2UiOworICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgdGV4dCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9ERVNDUklQVElPTjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc3RvcmFnZUluZm8tPm1TdG9yYWdlRGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgaWYgKCF0ZXh0IHx8ICF0ZXh0WzBdKQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIlN0b3JhZ2UgRGVzY3JpcHRpb24iOworICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgdGV4dCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiZmlsbFN0b3JhZ2U6IHVua25vd24gY29sdW1uICVkXG4iLCBtQ29sdW1uc1tpXSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgIHJldHVybiB0cnVlOworCitmYWlsOgorICAgIGRlbGV0ZSBzdG9yYWdlSW5mbzsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgTXRwT2JqZWN0SGFuZGxlIG9iamVjdElELCBpbnQgcm93KSB7CisKKyAgICBNdHBPYmplY3RJbmZvKiBvYmplY3RJbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKG9iamVjdElEKTsKKyAgICBpZiAoIW9iamVjdEluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBvYmplY3RJbmZvLT5wcmludCgpOworICAgIGlmICghcHJlcGFyZVJvdyh3aW5kb3cpKSB7CisgICAgICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1uQ291bnQ7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1Db2x1bW5zW2ldKSB7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TVE9SQUdFX0lEOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1TdG9yYWdlSUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9GT1JNQVQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUZvcm1hdCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Qcm90ZWN0aW9uU3RhdHVzLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfU0laRToKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tQ29tcHJlc3NlZFNpemUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9GT1JNQVQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iRm9ybWF0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfU0laRToKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tVGh1bWJDb21wcmVzc2VkU2l6ZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1RIVU1CX1dJRFRIOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYlBpeFdpZHRoLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfSEVJR0hUOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYlBpeEhlaWdodCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lNQUdFX1dJRFRIOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1JbWFnZVBpeFdpZHRoLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfSEVJR0hUOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1JbWFnZVBpeEhlaWdodCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lNQUdFX0RFUFRIOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1JbWFnZVBpeERlcHRoLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfUEFSRU5UOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1QYXJlbnQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Bc3NvY2lhdGlvblR5cGUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Bc3NvY2lhdGlvbkRlc2MsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVNlcXVlbmNlTnVtYmVyLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfTkFNRToKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFN0cmluZyh3aW5kb3csIG9iamVjdEluZm8tPm1OYW1lLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfREFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1EYXRlQ3JlYXRlZCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0RBVEVfTU9ESUZJRUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bURhdGVNb2RpZmllZCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0tFWVdPUkRTOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgb2JqZWN0SW5mby0+bUtleXdvcmRzLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUI6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRUaHVtYm5haWwod2luZG93LCBvYmplY3RJRCwgb2JqZWN0SW5mby0+bUZvcm1hdCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsT2JqZWN0OiB1bmtub3duIGNvbHVtbiAlZFxuIiwgbUNvbHVtbnNbaV0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgIHJldHVybiB0cnVlOworCitmYWlsOgorICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnByZXBhcmVSb3coQ3Vyc29yV2luZG93KiB3aW5kb3cpIHsKKyAgICBpZiAoIXdpbmRvdy0+c2V0TnVtQ29sdW1ucyhtQ29sdW1uQ291bnQpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjaGFuZ2UgY29sdW1uIGNvdW50IGZyb20gJWQgdG8gJWQiLCB3aW5kb3ctPmdldE51bUNvbHVtbnMoKSwgbUNvbHVtbkNvdW50KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZERpciA9IHdpbmRvdy0+YWxsb2NSb3coKTsKKyAgICBpZiAoIWZpZWxkRGlyKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIGZpZWxkRGlyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBNdHBDdXJzb3I6OnB1dExvbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludDY0X3QgdmFsdWUsIGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBpZiAoIXdpbmRvdy0+cHV0TG9uZyhyb3csIGNvbHVtbiwgdmFsdWUpKSB7CisgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKKyAgICAgICAgTE9HRSgiRmFpbGVkIGFsbG9jYXRpbmcgc3BhY2UgZm9yIGEgbG9uZyBpbiBjb2x1bW4gJWQiLCBjb2x1bW4pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE10cEN1cnNvcjo6cHV0U3RyaW5nKEN1cnNvcldpbmRvdyogd2luZG93LCBjb25zdCBjaGFyKiB0ZXh0LCBpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgaW50IHNpemUgPSBzdHJsZW4odGV4dCkgKyAxOworICAgIGludCBvZmZzZXQgPSB3aW5kb3ctPmFsbG9jKHNpemUpOworICAgIGlmICghb2Zmc2V0KSB7CisgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKKyAgICAgICAgTE9HRSgiRmFpbGVkIGFsbG9jYXRpbmcgJXUgYnl0ZXMgZm9yIHRleHQvYmxvYiAlcyIsIHNpemUsIHRleHQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHdpbmRvdy0+Y29weUluKG9mZnNldCwgKGNvbnN0IHVpbnQ4X3QqKXRleHQsIHNpemUpOworCisgICAgLy8gVGhpcyBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGNhbGwgdG8gYWxsb2MoKSwgc2luY2UgdGhhdAorICAgIC8vIG1heSBtb3ZlIHRoZSBmaWVsZCBhcm91bmQgaW4gdGhlIHdpbmRvdworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IHdpbmRvdy0+Z2V0RmllbGRTbG90KHJvdywgY29sdW1uKTsKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX1NUUklORzsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE10cEN1cnNvcjo6cHV0VGh1bWJuYWlsKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgdm9pZCogdGh1bWJuYWlsOworICAgIGludCBzaXplLCBvZmZzZXQ7CisgICAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIHRodW1ibmFpbCA9IE5VTEw7CisgICAgICAgIHNpemUgPSBvZmZzZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRodW1ibmFpbCA9IGRldmljZS0+Z2V0VGh1bWJuYWlsKG9iamVjdElELCBzaXplKTsKKworICAgICAgICBMT0dWKCJwdXRUaHVtYm5haWw6ICVwLCBzaXplOiAlZFxuIiwgdGh1bWJuYWlsLCBzaXplKTsKKyAgICAgICAgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFvZmZzZXQpIHsKKyAgICAgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0aHVtYm5haWwiLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGh1bWJuYWlsKQorICAgICAgICB3aW5kb3ctPmNvcHlJbihvZmZzZXQsIChjb25zdCB1aW50OF90Kil0aHVtYm5haWwsIHNpemUpOworCisgICAgLy8gVGhpcyBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGNhbGwgdG8gYWxsb2MoKSwgc2luY2UgdGhhdAorICAgIC8vIG1heSBtb3ZlIHRoZSBmaWVsZCBhcm91bmQgaW4gdGhlIHdpbmRvdworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IHdpbmRvdy0+Z2V0RmllbGRTbG90KHJvdywgY29sdW1uKTsKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0JMT0I7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEN1cnNvci5oIGIvbWVkaWEvbXRwL010cEN1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDNjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9DVVJTT1JfSAorI2RlZmluZSBfTVRQX0NVUlNPUl9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEN1cnNvcldpbmRvdzsKKworY2xhc3MgTXRwQ3Vyc29yIHsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIERFVklDRSAgICAgICAgICAgICAgPSAxLAorICAgICAgICBERVZJQ0VfSUQgICAgICAgICAgID0gMiwKKyAgICAgICAgU1RPUkFHRSAgICAgICAgICAgICA9IDMsCisgICAgICAgIFNUT1JBR0VfSUQgICAgICAgICAgPSA0LAorICAgICAgICBPQkpFQ1QgICAgICAgICAgICAgID0gNSwKKyAgICAgICAgT0JKRUNUX0lEICAgICAgICAgICA9IDYsCisgICAgICAgIFNUT1JBR0VfQ0hJTERSRU4gICAgPSA3LAorICAgICAgICBPQkpFQ1RfQ0hJTERSRU4gICAgID0gOCwKKyAgICB9OworCisgICAgTXRwQ2xpZW50KiAgICAgIG1DbGllbnQ7CisgICAgaW50ICAgICAgICAgICAgIG1RdWVyeVR5cGU7CisgICAgaW50ICAgICAgICAgICAgIG1EZXZpY2VJRDsKKyAgICBNdHBTdG9yYWdlSUQgICAgbVN0b3JhZ2VJRDsKKyAgICBNdHBPYmplY3RIYW5kbGUgbVFiamVjdElEOworICAgIGludCAgICAgICAgICAgICBtQ29sdW1uQ291bnQ7CisgICAgaW50KiAgICAgICAgICAgIG1Db2x1bW5zOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgTXRwQ3Vyc29yKE10cENsaWVudCogY2xpZW50LCBpbnQgcXVlcnlUeXBlLCBpbnQgZGV2aWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uQ291bnQsIGludCogY29sdW1ucyk7CisgICAgdmlydHVhbCAgICAgfk10cEN1cnNvcigpOworCisgICAgaW50ICAgICAgICAgZmlsbFdpbmRvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKworcHJpdmF0ZToKKyAgICBpbnQgICAgICAgICBmaWxsRGV2aWNlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsRGV2aWNlKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworICAgIGludCAgICAgICAgIGZpbGxTdG9yYWdlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsU3RvcmFnZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsT2JqZWN0cyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHBhcmVudCwgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworCisgICAgYm9vbCAgICAgICAgZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsIGludCBzdGFydFBvcyk7CisgICAgYm9vbCAgICAgICAgZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgaW50IHJvdyk7CisgICAgYm9vbCAgICAgICAgZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsIGludCByb3cpOworCisgICAgYm9vbCAgICAgICAgcHJlcGFyZVJvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdyk7CisgICAgYm9vbCAgICAgICAgcHV0TG9uZyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50NjRfdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbHVtbik7CisgICAgYm9vbCAgICAgICAgcHV0U3RyaW5nKEN1cnNvcldpbmRvdyogd2luZG93LCBjb25zdCBjaGFyKiB0ZXh0LCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBib29sICAgICAgICBwdXRUaHVtYm5haWwoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cE9iamVjdEhhbmRsZSBvYmplY3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBpbnQgcm93LCBpbnQgY29sdW1uKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0NVUlNPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3OGZmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcApAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGF0YVBhY2tldCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cERhdGFQYWNrZXQ6Ok10cERhdGFQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKSwKKyAgICAgICAgbU9mZnNldChNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQoreworfQorCitNdHBEYXRhUGFja2V0Ojp+TXRwRGF0YVBhY2tldCgpIHsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpyZXNldCgpIHsKKyAgICBNdHBQYWNrZXQ6OnJlc2V0KCk7CisgICAgbU9mZnNldCA9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6c2V0T3BlcmF0aW9uQ29kZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VULCBjb2RlKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCwgaWQpOworfQorCit1aW50MTZfdCBNdHBEYXRhUGFja2V0OjpnZXRVSW50MTYoKSB7CisgICAgaW50IG9mZnNldCA9IG1PZmZzZXQ7CisgICAgdWludDE2X3QgcmVzdWx0ID0gKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0XSB8ICgodWludDE2X3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KTsKKyAgICBtT2Zmc2V0ICs9IDI7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgTXRwRGF0YVBhY2tldDo6Z2V0VUludDMyKCkgeworICAgIGludCBvZmZzZXQgPSBtT2Zmc2V0OworICAgIHVpbnQzMl90IHJlc3VsdCA9ICh1aW50MzJfdCltQnVmZmVyW29mZnNldF0gfCAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgfAorICAgICAgICAgICAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgMl0gPDwgMTYpICB8ICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAzXSA8PCAyNCk7CisgICAgbU9mZnNldCArPSA0OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQ2NF90IE10cERhdGFQYWNrZXQ6OmdldFVJbnQ2NCgpIHsKKyAgICBpbnQgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICB1aW50NjRfdCByZXN1bHQgPSAodWludDY0X3QpbUJ1ZmZlcltvZmZzZXRdIHwgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDJdIDw8IDE2KSB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyAzXSA8PCAyNCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgNF0gPDwgMzIpIHwgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDVdIDw8IDQwKSB8CisgICAgICAgICAgICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA2XSA8PCA0OCkgIHwgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDddIDw8IDU2KTsKKyAgICBtT2Zmc2V0ICs9IDg7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpnZXRVSW50MTI4KHVpbnQxMjhfdCYgdmFsdWUpIHsKKyAgICB2YWx1ZVswXSA9IGdldFVJbnQzMigpOworICAgIHZhbHVlWzFdID0gZ2V0VUludDMyKCk7CisgICAgdmFsdWVbMl0gPSBnZXRVSW50MzIoKTsKKyAgICB2YWx1ZVszXSA9IGdldFVJbnQzMigpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OmdldFN0cmluZyhNdHBTdHJpbmdCdWZmZXImIHN0cmluZykKK3sKKyAgICBzdHJpbmcucmVhZEZyb21QYWNrZXQodGhpcyk7Cit9CisKK0ludDhMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50OCgpIHsKKyAgICBJbnQ4TGlzdCogcmVzdWx0ID0gbmV3IEludDhMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDgoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDhMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDgoKSB7CisgICAgVUludDhMaXN0KiByZXN1bHQgPSBuZXcgVUludDhMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQ4KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ludDE2TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDE2KCkgeworICAgIEludDE2TGlzdCogcmVzdWx0ID0gbmV3IEludDE2TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQxNigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50MTZMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDE2KCkgeworICAgIFVJbnQxNkxpc3QqIHJlc3VsdCA9IG5ldyBVSW50MTZMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQxNigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbnQzMkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQzMigpIHsKKyAgICBJbnQzMkxpc3QqIHJlc3VsdCA9IG5ldyBJbnQzMkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50MzIoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDMyTGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQzMigpIHsKKyAgICBVSW50MzJMaXN0KiByZXN1bHQgPSBuZXcgVUludDMyTGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50MzIoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50NjRMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50NjQoKSB7CisgICAgSW50NjRMaXN0KiByZXN1bHQgPSBuZXcgSW50NjRMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDY0KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQ2NExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50NjQoKSB7CisgICAgVUludDY0TGlzdCogcmVzdWx0ID0gbmV3IFVJbnQ2NExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDY0KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50OChpbnQ4X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgMSk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpdmFsdWU7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQ4KHVpbnQ4X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgMSk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpdmFsdWU7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDE2KGludDE2X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgMik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50MTYodWludDE2X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgMik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQzMihpbnQzMl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDQpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQzMih1aW50MzJfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA0KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQ2NChpbnQ2NF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDgpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAzMikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQwKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA1NikgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDY0KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDgpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAzMikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQwKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA1NikgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50MTI4KGNvbnN0IGludDEyOF90JiB2YWx1ZSkgeworICAgIHB1dEludDMyKHZhbHVlWzBdKTsKKyAgICBwdXRJbnQzMih2YWx1ZVsxXSk7CisgICAgcHV0SW50MzIodmFsdWVbMl0pOworICAgIHB1dEludDMyKHZhbHVlWzNdKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50MTI4KGNvbnN0IHVpbnQxMjhfdCYgdmFsdWUpIHsKKyAgICBwdXRVSW50MzIodmFsdWVbMF0pOworICAgIHB1dFVJbnQzMih2YWx1ZVsxXSk7CisgICAgcHV0VUludDMyKHZhbHVlWzJdKTsKKyAgICBwdXRVSW50MzIodmFsdWVbM10pOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDEyOChpbnQ2NF90IHZhbHVlKSB7CisgICAgcHV0SW50NjQodmFsdWUpOworICAgIHB1dEludDY0KHZhbHVlIDwgMCA/IC0xIDogMCk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDEyOCh1aW50NjRfdCB2YWx1ZSkgeworICAgIHB1dFVJbnQ2NCh2YWx1ZSk7CisgICAgcHV0VUludDY0KDApOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFJbnQ4KGNvbnN0IGludDhfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50OCgqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50OChjb25zdCB1aW50OF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50OCgqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFJbnQxNihjb25zdCBpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRJbnQxNigqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50MTYoY29uc3QgdWludDE2X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQxNigqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50MTYoY29uc3QgVUludDE2TGlzdCogdmFsdWVzKSB7CisgICAgc2l6ZV90IGNvdW50ID0gKHZhbHVlcyA/IHZhbHVlcy0+c2l6ZSgpIDogMCk7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQxNigoKnZhbHVlcylbaV0pOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFJbnQzMihjb25zdCBpbnQzMl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRJbnQzMigqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50MzIoY29uc3QgdWludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQzMigqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50MzIoY29uc3QgVUludDMyTGlzdCogbGlzdCkgeworICAgIGlmICghbGlzdCkgeworICAgICAgICBwdXRFbXB0eUFycmF5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBsaXN0LT5zaXplKCk7CisgICAgICAgIHB1dFVJbnQzMihzaXplKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICBwdXRVSW50MzIoKCpsaXN0KVtpXSk7CisgICAgfQorfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFJbnQ2NChjb25zdCBpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRJbnQ2NCgqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50NjQoY29uc3QgdWludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQ2NCgqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFN0cmluZyhjb25zdCBNdHBTdHJpbmdCdWZmZXImIHN0cmluZykgeworICAgIHN0cmluZy53cml0ZVRvUGFja2V0KHRoaXMpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFN0cmluZyhjb25zdCBjaGFyKiBzKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZyhzKTsKKyAgICBzdHJpbmcud3JpdGVUb1BhY2tldCh0aGlzKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgdWludDE2X3QqIHN0cmluZykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBpZiAoc3RyaW5nW2ldKQorICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHB1dFVJbnQ4KGNvdW50ID4gMCA/IGNvdW50ICsgMSA6IDApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDE2KHN0cmluZ1tpXSk7CisgICAgLy8gb25seSB0ZXJtaW5hdGUgd2l0aCB6ZXJvIGlmIHN0cmluZyBpcyBub3QgZW1wdHkKKyAgICBpZiAoY291bnQgPiAwKQorICAgICAgICBwdXRVSW50MTYoMCk7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFIAoraW50IE10cERhdGFQYWNrZXQ6OnJlYWQoaW50IGZkKSB7CisgICAgLy8gZmlyc3QgcmVhZCB0aGUgaGVhZGVyCisgICAgaW50IHJldCA9IDo6cmVhZChmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCAhPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLy8gdGhlbiB0aGUgZm9sbG93aW5nIGRhdGEKKyAgICBpbnQgdG90YWwgPSBNdHBQYWNrZXQ6OmdldFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQpOworICAgIGludCByZW1haW5pbmcgPSB0b3RhbCAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgcmV0ID0gOjpyZWFkKGZkLCAmbUJ1ZmZlclswXSArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsIHJlbWFpbmluZyk7CisgICAgaWYgKHJldCAhPSByZW1haW5pbmcpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG1QYWNrZXRTaXplID0gdG90YWw7CisgICAgbU9mZnNldCA9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgcmV0dXJuIHRvdGFsOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6cmVhZERhdGFIZWFkZXIoaW50IGZkKSB7CisgICAgaW50IHJldCA9IDo6cmVhZChmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA+IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZShpbnQgZmQpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisgICAgZHVtcCgpOworICAgIC8vIHNlbmQgaGVhZGVyIHNlcGFyYXRlbHkgZnJvbSBkYXRhCisgICAgaW50IHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPT0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGVEYXRhSGVhZGVyKGludCBmZCwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBsZW5ndGgpOworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisjZW5kaWYgLy8gTVRQX0RFVklDRQorCisjaWZkZWYgTVRQX0hPU1QKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgLy8gZmlyc3QgcmVhZCB0aGUgaGVhZGVyCisgICAgaW50IGxlbmd0aCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgaWYgKGxlbmd0aCA+PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CisgICAgICAgIC8vIGxvb2sgYXQgdGhlIGxlbmd0aCBmaWVsZCB0byBzZWUgaWYgdGhlIGRhdGEgc3BhbnMgbXVsdGlwbGUgcGFja2V0cworICAgICAgICB1aW50MzJfdCB0b3RhbExlbmd0aCA9IE10cFBhY2tldDo6Z2V0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCk7CisgICAgICAgIHdoaWxlICh0b3RhbExlbmd0aCA+IGxlbmd0aCkgeworICAgICAgICAgICAgYWxsb2NhdGUobGVuZ3RoICsgbUFsbG9jYXRpb25JbmNyZW1lbnQpOworICAgICAgICAgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyICsgbGVuZ3RoLCBtQWxsb2NhdGlvbkluY3JlbWVudCk7CisgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IHJldDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJldDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGVuZ3RoID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gbGVuZ3RoOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkRGF0YShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKSB7CisgICAgaW50IHBhY2tldFNpemUgPSB1c2JfZW5kcG9pbnRfbWF4X3BhY2tldChlcCk7CisgICAgaW50IHJlYWQgPSAwOworICAgIHdoaWxlIChyZWFkIDwgbGVuZ3RoKSB7CisgICAgICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgKGNoYXIgKilidWZmZXIgKyByZWFkLCBwYWNrZXRTaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKK3ByaW50ZigiTXRwRGF0YVBhY2tldDo6cmVhZERhdGEgcmV0dXJuaW5nICVkXG4iLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZWFkICs9IHJldDsKKyAgICB9CitwcmludGYoIk10cERhdGFQYWNrZXQ6OnJlYWREYXRhIHJldHVybmluZyAlZFxuIiwgcmVhZCk7CisgICAgcmV0dXJuIHJlYWQ7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkRGF0YUhlYWRlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIGludCBsZW5ndGggPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgdXNiX2VuZHBvaW50X21heF9wYWNrZXQoZXApKTsKKyAgICBpZiAobGVuZ3RoID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gbGVuZ3RoOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZURhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbGVuZ3RoKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworCisgICAgLy8gc2VuZCBoZWFkZXIgc2VwYXJhdGVseSBmcm9tIGRhdGEKKyAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPT0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNpemUgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIGludCByZXQgPSAwOworICAgIGludCBwYWNrZXRTaXplID0gdXNiX2VuZHBvaW50X21heF9wYWNrZXQoZXApOworICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICAgIGludCB3cml0ZSA9IChsZW5ndGggPiBwYWNrZXRTaXplID8gcGFja2V0U2l6ZSA6IGxlbmd0aCk7CisgICAgICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgYnVmZmVyLCB3cml0ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxlbmd0aCAtPSByZXQ7CisgICAgfQorICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCisjZW5kaWYgLy8gTVRQX0hPU1QKKwordm9pZCogTXRwRGF0YVBhY2tldDo6Z2V0RGF0YShpbnQmIG91dExlbmd0aCkgY29uc3QgeworICAgIGludCBsZW5ndGggPSBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgdm9pZCogcmVzdWx0ID0gbWFsbG9jKGxlbmd0aCk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIG1lbWNweShyZXN1bHQsIG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCBsZW5ndGgpOworICAgICAgICAgICAgb3V0TGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRMZW5ndGggPSAwOworICAgIHJldHVybiBOVUxMOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaCBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiNmEwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREFUQV9QQUNLRVRfSAorI2RlZmluZSBfTVRQX0RBVEFfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFN0cmluZ0J1ZmZlcjsKKworY2xhc3MgTXRwRGF0YVBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworcHJpdmF0ZToKKyAgICAvLyBjdXJyZW50IG9mZnNldCBmb3IgZ2V0L3B1dCBtZXRob2RzCisgICAgaW50ICAgICAgICAgICAgICAgICBtT2Zmc2V0OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwRGF0YVBhY2tldCgpOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICByZXNldCgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRPcGVyYXRpb25Db2RlKE10cE9wZXJhdGlvbkNvZGUgY29kZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpOworCisgICAgaW5saW5lIHVpbnQ4X3QgICAgICBnZXRVSW50OCgpIHsgcmV0dXJuICh1aW50OF90KW1CdWZmZXJbbU9mZnNldCsrXTsgfQorICAgIGlubGluZSBpbnQ4X3QgICAgICAgZ2V0SW50OCgpIHsgcmV0dXJuIChpbnQ4X3QpbUJ1ZmZlclttT2Zmc2V0KytdOyB9CisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRVSW50MTYoKTsKKyAgICBpbmxpbmUgaW50MTZfdCAgICAgIGdldEludDE2KCkgeyByZXR1cm4gKGludDE2X3QpZ2V0VUludDE2KCk7IH0KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldFVJbnQzMigpOworICAgIGlubGluZSBpbnQzMl90ICAgICAgZ2V0SW50MzIoKSB7IHJldHVybiAoaW50MzJfdClnZXRVSW50MzIoKTsgfQorICAgIHVpbnQ2NF90ICAgICAgICAgICAgZ2V0VUludDY0KCk7CisgICAgaW5saW5lIGludDY0X3QgICAgICBnZXRJbnQ2NCgpIHsgcmV0dXJuIChpbnQ2NF90KWdldFVJbnQ2NCgpOyB9CisgICAgdm9pZCAgICAgICAgICAgICAgICBnZXRVSW50MTI4KHVpbnQxMjhfdCYgdmFsdWUpOworICAgIGlubGluZSB2b2lkICAgICAgICAgZ2V0SW50MTI4KGludDEyOF90JiB2YWx1ZSkgeyBnZXRVSW50MTI4KCh1aW50MTI4X3QmKXZhbHVlKTsgfQorICAgIHZvaWQgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKTsKKworICAgIEludDhMaXN0KiAgICAgICAgICAgZ2V0QUludDgoKTsKKyAgICBVSW50OExpc3QqICAgICAgICAgIGdldEFVSW50OCgpOworICAgIEludDE2TGlzdCogICAgICAgICAgZ2V0QUludDE2KCk7CisgICAgVUludDE2TGlzdCogICAgICAgICBnZXRBVUludDE2KCk7CisgICAgSW50MzJMaXN0KiAgICAgICAgICBnZXRBSW50MzIoKTsKKyAgICBVSW50MzJMaXN0KiAgICAgICAgIGdldEFVSW50MzIoKTsKKyAgICBJbnQ2NExpc3QqICAgICAgICAgIGdldEFJbnQ2NCgpOworICAgIFVJbnQ2NExpc3QqICAgICAgICAgZ2V0QVVJbnQ2NCgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQ4KGludDhfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50OCh1aW50OF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDE2KGludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDE2KHVpbnQxNl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDMyKGludDMyX3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDMyKHVpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDY0KGludDY0X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDY0KHVpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDEyOChjb25zdCBpbnQxMjhfdCYgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDEyOChjb25zdCB1aW50MTI4X3QmIHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDEyOChpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxMjgodWludDY0X3QgdmFsdWUpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50OChjb25zdCBpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50OChjb25zdCB1aW50OF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50MTYoY29uc3QgaW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQxNihjb25zdCB1aW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQxNihjb25zdCBVSW50MTZMaXN0KiB2YWx1ZXMpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QUludDMyKGNvbnN0IGludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MzIoY29uc3QgdWludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MzIoY29uc3QgVUludDMyTGlzdCogbGlzdCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50NjQoY29uc3QgaW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQ2NChjb25zdCB1aW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0U3RyaW5nKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFN0cmluZyhjb25zdCBjaGFyKiBzdHJpbmcpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0U3RyaW5nKGNvbnN0IHVpbnQxNl90KiBzdHJpbmcpOworICAgIGlubGluZSB2b2lkICAgICAgICAgcHV0RW1wdHlTdHJpbmcoKSB7IHB1dFVJbnQ4KDApOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICBwdXRFbXB0eUFycmF5KCkgeyBwdXRVSW50MzIoMCk7IH0KKworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKGludCBmZCk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkRGF0YUhlYWRlcihpbnQgZmQpOworCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlRGF0YUhlYWRlcihpbnQgZmQsIHVpbnQzMl90IGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWREYXRhKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpOworICAgIGludCAgICAgICAgICAgICAgICAgcmVhZERhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZURhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHVpbnQzMl90IGxlbmd0aCk7CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpOworI2VuZGlmCisKKyAgICBpbmxpbmUgYm9vbCAgICAgICAgIGhhc0RhdGEoKSBjb25zdCB7IHJldHVybiBtUGFja2V0U2l6ZSA+IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7IH0KKyAgICB2b2lkKiAgICAgICAgICAgICAgIGdldERhdGEoaW50JiBvdXRMZW5ndGgpIGNvbnN0OworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREFUQV9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFiYXNlLmggYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNiMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERhdGFiYXNlLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREFUQUJBU0VfSAorI2RlZmluZSBfTVRQX0RBVEFCQVNFX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKK2NsYXNzIE10cFByb3BlcnR5OworCitjbGFzcyBNdHBEYXRhYmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TXRwRGF0YWJhc2UoKSB7fQorCisgICAgLy8gY2FsbGVkIGZyb20gU2VuZE9iamVjdEluZm8gdG8gcmVzZXJ2ZSBhIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgaW5jb21pbmcgZmlsZQorICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgYmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgbW9kaWZpZWQpID0gMDsKKworICAgIC8vIGNhbGxlZCB0byByZXBvcnQgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBTZW5kT2JqZWN0IGZpbGUgdHJhbnNmZXIKKyAgICAvLyBzdWNjZXNzIHNob3VsZCBzaWduYWwgYSBub3RpZmljYXRpb24gb2YgdGhlIG5ldyBvYmplY3QncyBjcmVhdGlvbiwKKyAgICAvLyBmYWlsdXJlIHNob3VsZCByZW1vdmUgdGhlIGRhdGFiYXNlIGVudHJ5IGNyZWF0ZWQgaW4gYmVnaW5TZW5kT2JqZWN0CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBlbmRTZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOworCisgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgICAgICAgICBnZXROdW1PYmplY3RzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpID0gMDsKKworICAgIC8vIGNhbGxlZSBzaG91bGQgZGVsZXRlW10gdGhlIHJlc3VsdHMgZnJvbSB0aGVzZQorICAgIC8vIHJlc3VsdHMgY2FuIGJlIE5VTEwKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpID0gMDsKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgPSAwOworICAgIHZpcnR1YWwgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiAgZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSA9IDA7CisgICAgdmlydHVhbCBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgcmVzZXREZXZpY2VQcm9wZXJ0eShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgPSAwOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0YXJ0ZWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHNlc3Npb25FbmRlZCgpID0gMDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAgYi9tZWRpYS9tdHAvTXRwRGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjEwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGVidWcuY3BwCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IENvZGVFbnRyeSB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICB1aW50MTZfdCBjb2RlOworfTsKKworc3RhdGljIGNvbnN0IENvZGVFbnRyeSBzT3BlcmF0aW9uQ29kZXNbXSA9IHsKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTyIsICAgICAgICAgICAgICAweDEwMDEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiIsICAgICAgICAgICAgICAgICAweDEwMDIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04iLCAgICAgICAgICAgICAgICAweDEwMDMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUyIsICAgICAgICAgICAgICAweDEwMDQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8iLCAgICAgICAgICAgICAweDEwMDUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUyIsICAgICAgICAgICAgICAweDEwMDYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUyIsICAgICAgICAgICAweDEwMDcgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTyIsICAgICAgICAgICAgICAweDEwMDggfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAweDEwMDkgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9USFVNQiIsICAgICAgICAgICAgICAgICAgICAweDEwMEEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAweDEwMEIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8iLCAgICAgICAgICAgICAweDEwMEMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMEQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX0NBUFRVUkUiLCAgICAgICAgICAgICAweDEwMEUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0ZPUk1BVF9TVE9SRSIsICAgICAgICAgICAgICAgICAweDEwMEYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRSIsICAgICAgICAgICAgICAgICAweDEwMTAgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCIsICAgICAgICAgICAgICAgICAgICAweDEwMTEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPVEVDVElPTiIsICAgICAgICAweDEwMTIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1BPV0VSX0RPV04iLCAgICAgICAgICAgICAgICAgICAweDEwMTMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDIiwgICAgICAgICAweDEwMTQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgICAweDEwMTUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgICAweDEwMTYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFIiwgICAgICAweDEwMTcgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUiLCAgICAgICAweDEwMTggfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMTkgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMUEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCIsICAgICAgICAgICAweDEwMUIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSIsICAgICAgICAweDEwMUMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVEIiwgICAweDk4MDEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDIiwgICAgICAgICAweDk4MDIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSIsICAgICAgICAweDk4MDMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRSIsICAgICAgICAweDk4MDQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUyIsICAgICAgICAweDk4MTAgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUyIsICAgICAgICAweDk4MTEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NLSVAiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDk4MjAgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBDb2RlRW50cnkgc0Zvcm1hdENvZGVzW10gPSB7CisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8iLCAgICAgICAgICAgICAgMHgxMDAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORUQiLCAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiIsICAgICAgICAgICAgICAgICAgICAgMHgzMDAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9TQ1JJUFQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9FWEVDVVRBQkxFIiwgICAgICAgICAgICAgICAgICAgICAgMHgzMDAzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9URVhUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9IVE1MIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA1IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9EUE9GIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA2IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BSUZGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA3IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XQVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA4IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUDMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA5IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BVkkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBBIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUEVHIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBCIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BU0YiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBDIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9ERUZJTkVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9FWElGX0pQRUciLCAgICAgICAgICAgICAgICAgICAgICAgMHgzODAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9USUZGX0VQIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9GTEFTSFBJWCIsICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9CTVAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9DSUZGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA1IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9HSUYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA3IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9KRklGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA4IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9DRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA5IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9QSUNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBBIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9QTkciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBCIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9USUZGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBEIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9USUZGX0lUIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBFIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9KUDIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBGIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9KUFgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODEwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfRklSTVdBUkUiLCAgICAgICAgICAgICAgMHhCODAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCIsICAgICAgICAgICAgMHhCODgxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8iLCAgICAgICAgICAgICAgICAgMHhCOTAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XTUEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9PR0ciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQUMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BVURJQkxFIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTA0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9GTEFDIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTA2IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8iLCAgICAgICAgICAgICAgICAgMHhCOTgwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XTVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUDRfQ09OVEFJTkVSIiwgICAgICAgICAgICAgICAgICAgMHhCOTgyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUDIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF8zR1BfQ09OVEFJTkVSIiwgICAgICAgICAgICAgICAgICAgMHhCOTg0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfQ09MTEVDVElPTiIsICAgICAgICAgICAgMHhCQTAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNIiwgICAgICAgMHhCQTAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9JTUFHRV9BTEJVTSIsICAgICAgICAgICAgMHhCQTAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVURJT19BTEJVTSIsICAgICAgICAgICAgMHhCQTAzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19BTEJVTSIsICAgICAgICAgICAgMHhCQTA0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCIsICAgICAgICAgICAgMHhCQTA1IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9DT05UQUNUX0dST1VQIiwgICAgICAgICAgMHhCQTA2IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTQUdFX0ZPTERFUiIsICAgICAgICAgMHhCQTA3IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiIsICAgMHhCQTA4IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVURJT19QTEFZTElTVCIsICAgICAgICAgMHhCQTA5IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19QTEFZTElTVCIsICAgICAgICAgMHhCQTBBIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QiLCAgICAgICAgICAgICAgMHhCQTBCIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XUExfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTEwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NM1VfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTExIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUExfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTEyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BU1hfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTEzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9QTFNfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTE0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQiLCAgICAgICAgICAgICAgMHhCQTgwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVCIsICAgICAgICAgICAgICAgMHhCQTgxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9YTUxfRE9DVU1FTlQiLCAgICAgICAgICAgICAgICAgICAgMHhCQTgyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NU19XT1JEX0RPQ1VNRU5UIiwgICAgICAgICAgICAgICAgMHhCQTgzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NSFRfQ09NUElMRURfSFRNTF9ET0NVTUVOVCIsICAgICAgMHhCQTg0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCIsICAgICAgICAgICAgMHhCQTg1IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NU19QT1dFUlBPSU5UX1BSRVNFTlRBVElPTiIsICAgICAgMHhCQTg2IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfTUVTU0FHRSIsICAgICAgICAgICAgICAgMHhCQjAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTU0FHRSIsICAgICAgICAgICAgICAgMHhCQjAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfQ09OVEFDVCIsICAgICAgICAgICAgICAgMHhCQjgwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9DT05UQUNUIiwgICAgICAgICAgICAgICAgMHhCQjgxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9WQ0FSRF8yIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQjgyIH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgQ29kZUVudHJ5IHNPYmplY3RQcm9wQ29kZXNbXSA9IHsKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMiLCAgICAgICAgICAgICAgICAgICAgICAweERDMDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fVFlQRSIsICAgICAgICAgICAgICAgICAgICAgICAweERDMDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fREVTQyIsICAgICAgICAgICAgICAgICAgICAgICAweERDMDYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAweERDMDcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREFURV9DUkVBVEVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfS0VZV09SRFMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUxMT1dFRF9GT0xERVJfQ09OVEVOVFMiLCAgICAgICAgICAgICAgICAweERDMEMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSElEREVOIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1lTVEVNX09CSkVDVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1lOQ19JRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJPUEVSVFlfQkFHIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ1JFQVRFRF9CWSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVJUSVNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREFURV9BVVRIT1JFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREVTQ1JJUFRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVVJMX1JFRkVSRU5DRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTEFOR1VBR0VfTE9DQUxFIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDNEEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ09QWVJJR0hUX0lORk9STUFUSU9OIiwgICAgICAgICAgICAgICAgICAweERDNEIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU09VUkNFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT1JJR0lOX0xPQ0FUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDNEQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREFURV9BRERFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTk9OX0NPTlNVTUFCTEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ09SUlVQVF9VTlBMQVlBQkxFIiwgICAgICAgICAgICAgICAgICAgICAweERDNTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJPRFVDRVJfU0VSSUFMX05VTUJFUiIsICAgICAgICAgICAgICAgICAweERDNTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0ZPUk1BVCIsICAgICAgICAgICAweERDODEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1NJWkUiLCAgICAgICAgICAgICAweERDODIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0hFSUdIVCIsICAgICAgICAgICAweERDODMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1dJRFRIIiwgICAgICAgICAgICAweERDODQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RVUkFUSU9OIiwgICAgICAgICAweERDODUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RBVEEiLCAgICAgICAgICAgICAweERDODYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfV0lEVEgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSEVJR0hUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRFVSQVRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkFUSU5HIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVFJBQ0siLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfR0VOUkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ1JFRElUUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTFlSSUNTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VCU0NSSVBUSU9OX0NPTlRFTlRfSUQiLCAgICAgICAgICAgICAgICAweERDOEYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJPRFVDRURfQlkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVVNFX0NPVU5UIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU0tJUF9DT1VOVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTEFTVF9BQ0NFU1NFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEFSRU5UQUxfUkFUSU5HIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDOTQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVUQV9HRU5SRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ09NUE9TRVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRUZGRUNUSVZFX1JBVElORyIsICAgICAgICAgICAgICAgICAgICAgICAweERDOTcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VCVElUTEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFIiwgICAgICAgICAgICAgICAgICAweERDOTkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUxCVU1fTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUxCVU1fQVJUSVNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTU9PRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRFJNX1NUQVRVUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VCX0RFU0NSSVBUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDOUUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSVNfQ1JPUFBFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSVNfQ09MT1VSX0NPUlJFQ1RFRCIsICAgICAgICAgICAgICAgICAgICAweERDRDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSU1BR0VfQklUX0RFUFRIIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDRDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRl9OVU1CRVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVgiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVE9UQUxfQklUUkFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQklUUkFURV9UWVBFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU0FNUExFX1JBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTlVNQkVSX09GX0NIQU5ORUxTIiwgICAgICAgICAgICAgICAgICAgICAweERFOTQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVVESU9fQklUX0RFUFRIIiwgICAgICAgICAgICAgICAgICAgICAgICAweERFOTUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU0NBTl9UWVBFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVVESU9fV0FWRV9DT0RFQyIsICAgICAgICAgICAgICAgICAgICAgICAweERFOTkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVVESU9fQklUUkFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVklERU9fRk9VUkNDX0NPREVDIiwgICAgICAgICAgICAgICAgICAgICAweERFOUIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVklERU9fQklUUkFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRlJBTUVTX1BFUl9USE9VU0FORF9TRUNPTkRTIiwgICAgICAgICAgICAweERFOUQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfS0VZRlJBTUVfRElTVEFOQ0UiLCAgICAgICAgICAgICAgICAgICAgICAweERFOUUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQlVGRkVSX1NJWkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU5DT0RJTkdfUVVBTElUWSIsICAgICAgICAgICAgICAgICAgICAgICAweERFQTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU5DT0RJTkdfUFJPRklMRSIsICAgICAgICAgICAgICAgICAgICAgICAweERFQTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRElTUExBWV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQk9EWV9URVhUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VCSkVDVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJJT1JJVFkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfR0lWRU5fTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUlERExFX05BTUVTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRkFNSUxZX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJFRklYIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VGRklYIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVUSUNfR0lWRU5fTkFNRSIsICAgICAgICAgICAgICAgICAgICAweEREMDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVUSUNfRkFNSUxZX05BTUUiLCAgICAgICAgICAgICAgICAgICAweEREMDYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfUFJJTUFSWSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMSIsICAgICAgICAgICAgICAgICAgICAgICAweEREMDggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMiIsICAgICAgICAgICAgICAgICAgICAgICAweEREMDkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMSIsICAgICAgICAgICAgICAgICAgICAgICAweEREMEEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMiIsICAgICAgICAgICAgICAgICAgICAgICAweEREMEIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfT1RIRVJTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMEMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BSSU1BUlkiLCAgICAgICAgICAgICAgICAgICAweEREMEQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMIiwgICAgICAgICAgICAgICAgICAweEREMEUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMXzIiLCAgICAgICAgICAgICAgICAweEREMEYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTIiwgICAgICAgICAgICAgICAgICAweEREMTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTXzIiLCAgICAgICAgICAgICAgICAweEREMTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRSIsICAgICAgICAgICAgICAgICAgICAweEREMTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRV8yIiwgICAgICAgICAgICAgICAgICAweEREMTMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QUklNQVJZIiwgICAgICAgICAgICAgICAgICAgICAweEREMTQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QRVJTT05BTCIsICAgICAgICAgICAgICAgICAgICAweEREMTUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9CVVNJTkVTUyIsICAgICAgICAgICAgICAgICAgICAweEREMTYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEFHRVJfTlVNQkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMTcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX09USEVSUyIsICAgICAgICAgICAgICAgICAgICAweEREMTggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJJTUFSWV9XRUJfQUREUkVTUyIsICAgICAgICAgICAgICAgICAgICAweEREMTkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEVSU09OQUxfV0VCX0FERFJFU1MiLCAgICAgICAgICAgICAgICAgICAweEREMUEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQlVTSU5FU1NfV0VCX0FERFJFU1MiLCAgICAgICAgICAgICAgICAgICAweEREMUIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTUyIsICAgICAgICAgICAgICAweEREMUMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18yIiwgICAgICAgICAgICAweEREMUQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18zIiwgICAgICAgICAgICAweEREMUUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfRlVMTCIsICAgICAgICAgICAweEREMUYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8xIiwgICAgICAgICAweEREMjAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8yIiwgICAgICAgICAweEREMjEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfQ0lUWSIsICAgICAgICAgICAweEREMjIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUkVHSU9OIiwgICAgICAgICAweEREMjMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUE9TVEFMX0NPREUiLCAgICAweEREMjQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfQ09VTlRSWSIsICAgICAgICAweEREMjUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfRlVMTCIsICAgICAgICAgICAweEREMjYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8xIiwgICAgICAgICAweEREMjcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8yIiwgICAgICAgICAweEREMjggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ0lUWSIsICAgICAgICAgICAweEREMjkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUkVHSU9OIiwgICAgICAgICAweEREMkEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUE9TVEFMX0NPREUiLCAgICAweEREMkIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ09VTlRSWSIsICAgICAgICAweEREMkMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfRlVMTCIsICAgICAgICAgICAgICAweEREMkQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8xIiwgICAgICAgICAgICAweEREMkUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8yIiwgICAgICAgICAgICAweEREMkYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ0lUWSIsICAgICAgICAgICAgICAweEREMzAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUkVHSU9OIiwgICAgICAgICAgICAweEREMzEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUE9TVEFMX0NPREUiLCAgICAgICAweEREMzIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ09VTlRSWSIsICAgICAgICAgICAweEREMzMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT1JHQU5JWkFUSU9OX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAweEREMzQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVUSUNfT1JHQU5JWkFUSU9OX05BTUUiLCAgICAgICAgICAgICAweEREMzUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUk9MRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQklSVEhEQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9UTyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9DQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9CQ0MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUFEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUNFSVZFRF9USU1FIiwgICAgICAgICAgICAgICAgICAweERENDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9TRU5ERVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERENDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQkVHSU5fVElNRSIsICAgICAgICAgICAgICAgICAgICAweERENTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfRU5EX1RJTUUiLCAgICAgICAgICAgICAgICAgICAgICAweERENTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfTE9DQVRJT04iLCAgICAgICAgICAgICAgICAgICAgICAweERENTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVRVUlSRURfQVRURU5ERUVTIiwgICAgICAgICAgICAweERENTQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1BUSU9OQUxfQVRURU5ERUVTIiwgICAgICAgICAgICAweERENTUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVTT1VSQ0VTIiwgICAgICAgICAgICAgICAgICAgICAweERENTYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQUNDRVBURUQiLCAgICAgICAgICAgICAgICAgICAgICAweERENTcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfVEVOVEFUSVZFIiwgICAgICAgICAgICAgICAgICAgICAweERENTggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfREVDTElORUQiLCAgICAgICAgICAgICAgICAgICAgICAweERENTkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVNQUlOREVSX1RJTUUiLCAgICAgICAgICAgICAgICAweERENUEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1dORVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERENUIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfU1RBVFVTIiwgICAgICAgICAgICAgICAgICAgICAgICAweERENUMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT1dORVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRURJVE9SIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfV0VCTUFTVEVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVVJMX1NPVVJDRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVVJMX0RFU1RJTkFUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAweERENjEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVElNRV9CT09LTUFSSyIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT0JKRUNUX0JPT0tNQVJLIiwgICAgICAgICAgICAgICAgICAgICAgICAweERENjMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQllURV9CT09LTUFSSyIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTEFTVF9CVUlMRF9EQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAweERENzAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVElNRV9UT19MSVZFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENzEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVESUFfR1VJRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENzIgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBDb2RlRW50cnkgc0RldmljZVByb3BDb2Rlc1tdID0geworICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVU5ERUZJTkVEIiwgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQkFUVEVSWV9MRVZFTCIsICAgICAgICAgICAgICAgICAgIDB4NTAwMSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRlVOQ1RJT05BTF9NT0RFIiwgICAgICAgICAgICAgICAgIDB4NTAwMiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfSU1BR0VfU0laRSIsICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09NUFJFU1NJT05fU0VUVElORyIsICAgICAgICAgICAgIDB4NTAwNCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfV0hJVEVfQkFMQU5DRSIsICAgICAgICAgICAgICAgICAgIDB4NTAwNSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUkdCX0dBSU4iLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRl9OVU1CRVIiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DQUxfTEVOR1RIIiwgICAgICAgICAgICAgICAgICAgIDB4NTAwOCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfRElTVEFOQ0UiLCAgICAgICAgICAgICAgICAgIDB4NTAwOSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTU9ERSIsICAgICAgICAgICAgICAgICAgICAgIDB4NTAwQSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfTUVURVJJTkdfTU9ERSIsICAgICAgICAgIDB4NTAwQiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRkxBU0hfTU9ERSIsICAgICAgICAgICAgICAgICAgICAgIDB4NTAwQyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSIsICAgICAgICAgICAgICAgICAgIDB4NTAwRCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfUFJPR1JBTV9NT0RFIiwgICAgICAgICAgIDB4NTAwRSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVgiLCAgICAgICAgICAgICAgICAgIDB4NTAwRiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfQklBU19DT01QRU5TQVRJT04iLCAgICAgIDB4NTAxMCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfREFURVRJTUUiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxMSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQ0FQVFVSRV9ERUxBWSIsICAgICAgICAgICAgICAgICAgIDB4NTAxMiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU1RJTExfQ0FQVFVSRV9NT0RFIiwgICAgICAgICAgICAgIDB4NTAxMyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09OVFJBU1QiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU0hBUlBORVNTIiwgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRElHSVRBTF9aT09NIiwgICAgICAgICAgICAgICAgICAgIDB4NTAxNiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRUZGRUNUX01PREUiLCAgICAgICAgICAgICAgICAgICAgIDB4NTAxNyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQlVSU1RfTlVNQkVSIiwgICAgICAgICAgICAgICAgICAgIDB4NTAxOCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQlVSU1RfSU5URVJWQUwiLCAgICAgICAgICAgICAgICAgIDB4NTAxOSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX05VTUJFUiIsICAgICAgICAgICAgICAgIDB4NTAxQSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX0lOVEVSVkFMIiwgICAgICAgICAgICAgIDB4NTAxQiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTUVURVJJTkdfTU9ERSIsICAgICAgICAgICAgIDB4NTAxQyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVVBMT0FEX1VSTCIsICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQVJUSVNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09QWVJJR0hUX0lORk8iLCAgICAgICAgICAgICAgICAgIDB4NTAxRiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVIiLCAgICAgICAgIDB4RDQwMSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUiLCAgICAgICAgICAgIDB4RDQwMiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVk9MVU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RDQwMyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU1VQUE9SVEVEX0ZPUk1BVFNfT1JERVJFRCIsICAgICAgIDB4RDQwNCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0lDT04iLCAgICAgICAgICAgICAgICAgICAgIDB4RDQwNSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfUkFURSIsICAgICAgICAgICAgICAgICAgIDB4RDQxMCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfT0JKRUNUIiwgICAgICAgICAgICAgICAgIDB4RDQxMSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfQ09OVEFJTkVSX0lOREVYIiwgICAgICAgIDB4RDQxMiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU0VTU0lPTl9JTklUSUFUT1JfVkVSU0lPTl9JTkZPIiwgIDB4RDQwNiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUEVSQ0VJVkVEX0RFVklDRV9UWVBFIiwgICAgICAgICAgIDB4RDQwNyB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGdldENvZGVOYW1lKHVpbnQxNl90IGNvZGUsIGNvbnN0IENvZGVFbnRyeSogdGFibGUpIHsKKyAgICBjb25zdCBDb2RlRW50cnkqIGVudHJ5ID0gdGFibGU7CisgICAgd2hpbGUgKGVudHJ5LT5uYW1lKSB7CisgICAgICAgIGlmIChlbnRyeS0+Y29kZSA9PSBjb2RlKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5LT5uYW1lOworICAgICAgICBlbnRyeSsrOworICAgIH0KKyAgICByZXR1cm4gIlVOS05PV04iOworfQorCitjb25zdCBjaGFyKiBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKSB7CisgICAgcmV0dXJuIGdldENvZGVOYW1lKGNvZGUsIHNPcGVyYXRpb25Db2Rlcyk7Cit9CisKK2NvbnN0IGNoYXIqIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpIHsKKyAgICByZXR1cm4gZ2V0Q29kZU5hbWUoY29kZSwgc0Zvcm1hdENvZGVzKTsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzT2JqZWN0UHJvcENvZGVzKTsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzRGV2aWNlUHJvcENvZGVzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZWJ1Zy5oIGIvbWVkaWEvbXRwL010cERlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1M2UzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZWJ1Zy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVCVUdfSAorI2RlZmluZSBfTVRQX0RFQlVHX0gKKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGVidWcgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRPcGVyYXRpb25Db2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRGb3JtYXRDb2RlTmFtZShNdHBPYmplY3RGb3JtYXQgY29kZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE9iamVjdFByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldERldmljZVByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9ERUJVR19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTAxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGV2aWNlIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cERldmljZTo6TXRwRGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlKiBkZXZpY2UsIGludCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiwgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfb3V0LAorICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW50cikKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCisgICAgICAgIG1FbmRwb2ludEluKGVwX2luKSwKKyAgICAgICAgbUVuZHBvaW50T3V0KGVwX291dCksCisgICAgICAgIG1FbmRwb2ludEludHIoZXBfaW50ciksCisgICAgICAgIG1EZXZpY2VJbmZvKE5VTEwpLAorICAgICAgICBtSUQodXNiX2RldmljZV9nZXRfdW5pcXVlX2lkKGRldmljZSkpLAorICAgICAgICBtU2Vzc2lvbklEKDApLAorICAgICAgICBtVHJhbnNhY3Rpb25JRCgwKQoreworfQorCitNdHBEZXZpY2U6On5NdHBEZXZpY2UoKSB7CisgICAgY2xvc2UoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VQcm9wZXJ0aWVzLnNpemUoKTsgaSsrKQorICAgICAgICBkZWxldGUgbURldmljZVByb3BlcnRpZXNbaV07Cit9CisKK3ZvaWQgTXRwRGV2aWNlOjppbml0aWFsaXplKCkgeworICAgIG9wZW5TZXNzaW9uKCk7CisgICAgbURldmljZUluZm8gPSBnZXREZXZpY2VJbmZvKCk7CisgICAgaWYgKG1EZXZpY2VJbmZvKSB7CisgICAgICAgIG1EZXZpY2VJbmZvLT5wcmludCgpOworCisgICAgICAgIGlmIChtRGV2aWNlSW5mby0+bURldmljZVByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcy0+c2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcENvZGUgPSAoKm1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcylbaV07CisgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gZ2V0RGV2aWNlUHJvcERlc2MocHJvcENvZGUpOworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS0+cHJpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE10cERldmljZTo6Y2xvc2UoKSB7CisgICAgaWYgKG1EZXZpY2UpIHsKKyAgICAgICAgdXNiX2RldmljZV9yZWxlYXNlX2ludGVyZmFjZShtRGV2aWNlLCBtSW50ZXJmYWNlKTsKKyAgICAgICAgdXNiX2RldmljZV9jbG9zZShtRGV2aWNlKTsKKyAgICAgICAgbURldmljZSA9IE5VTEw7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBNdHBEZXZpY2U6OmdldERldmljZU5hbWUoKSB7CisgICAgaWYgKG1EZXZpY2UpCisgICAgICAgIHJldHVybiB1c2JfZGV2aWNlX2dldF9uYW1lKG1EZXZpY2UpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICI/Pz8iOworfQorCitib29sIE10cERldmljZTo6b3BlblNlc3Npb24oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtU2Vzc2lvbklEID0gMDsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDA7CisgICAgTXRwU2Vzc2lvbklEIG5ld1Nlc3Npb24gPSAxOworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIG5ld1Nlc3Npb24pOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOKQorICAgICAgICBuZXdTZXNzaW9uID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigxKTsKKyAgICBlbHNlIGlmIChyZXQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtU2Vzc2lvbklEID0gbmV3U2Vzc2lvbjsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDE7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpjbG9zZVNlc3Npb24oKSB7CisgICAgLy8gRklYTUUKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTXRwRGV2aWNlSW5mbyogTXRwRGV2aWNlOjpnZXREZXZpY2VJbmZvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwRGV2aWNlSW5mbyogaW5mbyA9IG5ldyBNdHBEZXZpY2VJbmZvOworICAgICAgICBpbmZvLT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBTdG9yYWdlSURMaXN0KiBNdHBEZXZpY2U6OmdldFN0b3JhZ2VJRHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICByZXR1cm4gbURhdGEuZ2V0QVVJbnQzMigpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwU3RvcmFnZUluZm8qIE10cERldmljZTo6Z2V0U3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cFN0b3JhZ2VJbmZvKiBpbmZvID0gbmV3IE10cFN0b3JhZ2VJbmZvKHN0b3JhZ2VJRCk7CisgICAgICAgIGluZm8tPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEhhbmRsZUxpc3QqIE10cERldmljZTo6Z2V0T2JqZWN0SGFuZGxlcyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMiwgZm9ybWF0KTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMywgcGFyZW50KTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhLmdldEFVSW50MzIoKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEluZm8qIE10cERldmljZTo6Z2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICAvLyBGSVhNRSAtIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHNvbWUgY2FjaGluZyBoZXJlCisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gbmV3IE10cE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICAgICAgaW5mby0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCogTXRwRGV2aWNlOjpnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50JiBvdXRMZW5ndGgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CKSAmJiByZWFkRGF0YSgpKSB7CisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtRGF0YS5nZXREYXRhKG91dExlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0TGVuZ3RoID0gMDsKKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6c2VuZE9iamVjdEluZm8oTXRwT2JqZWN0SW5mbyogaW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gaW5mby0+bVBhcmVudDsKKyAgICBpZiAocGFyZW50ID09IDApCisgICAgICAgIHBhcmVudCA9IE1UUF9QQVJFTlRfUk9PVDsKKworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBpbmZvLT5tU3RvcmFnZUlEKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMiwgaW5mby0+bVBhcmVudCk7CisKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVN0b3JhZ2VJRCk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1Gb3JtYXQpOworICAgIG1EYXRhLnB1dFVJbnQxNihpbmZvLT5tUHJvdGVjdGlvblN0YXR1cyk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1Db21wcmVzc2VkU2l6ZSk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1UaHVtYkZvcm1hdCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1UaHVtYkNvbXByZXNzZWRTaXplKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVRodW1iUGl4V2lkdGgpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tVGh1bWJQaXhIZWlnaHQpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tSW1hZ2VQaXhXaWR0aCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1JbWFnZVBpeEhlaWdodCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1JbWFnZVBpeERlcHRoKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVBhcmVudCk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1Bc3NvY2lhdGlvblR5cGUpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tQXNzb2NpYXRpb25EZXNjKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVNlcXVlbmNlTnVtYmVyKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoaW5mby0+bU5hbWUpOworCisgICAgY2hhciBjcmVhdGVkWzEwMF0sIG1vZGlmaWVkWzEwMF07CisgICAgZm9ybWF0RGF0ZVRpbWUoaW5mby0+bURhdGVDcmVhdGVkLCBjcmVhdGVkLCBzaXplb2YoY3JlYXRlZCkpOworICAgIGZvcm1hdERhdGVUaW1lKGluZm8tPm1EYXRlTW9kaWZpZWQsIG1vZGlmaWVkLCBzaXplb2YobW9kaWZpZWQpKTsKKworICAgIG1EYXRhLnB1dFN0cmluZyhjcmVhdGVkKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcobW9kaWZpZWQpOworICAgIGlmIChpbmZvLT5tS2V5d29yZHMpCisgICAgICAgIG1EYXRhLnB1dFN0cmluZyhpbmZvLT5tS2V5d29yZHMpOworICAgIGVsc2UKKyAgICAgICAgbURhdGEucHV0RW1wdHlTdHJpbmcoKTsKKworICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTykgJiYgc2VuZERhdGEoKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgICAgICBpbmZvLT5tU3RvcmFnZUlEID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigxKTsKKyAgICAgICAgICAgIGluZm8tPm1QYXJlbnQgPSBtUmVzcG9uc2UuZ2V0UGFyYW1ldGVyKDIpOworICAgICAgICAgICAgaW5mby0+bUhhbmRsZSA9IG1SZXNwb25zZS5nZXRQYXJhbWV0ZXIoMyk7CisgICAgICAgICAgICByZXR1cm4gaW5mby0+bUhhbmRsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKE10cE9iamVjdEhhbmRsZSktMTsKK30KKworYm9vbCBNdHBEZXZpY2U6OnNlbmRPYmplY3QoTXRwT2JqZWN0SW5mbyogaW5mbywgaW50IHNyY0ZEKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpbnQgcmVtYWluaW5nID0gaW5mby0+bUNvbXByZXNzZWRTaXplOworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGluZm8tPm1IYW5kbGUpOworICAgIGlmIChzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUKSkgeworICAgICAgICAvLyBzZW5kIGRhdGEgaGVhZGVyCisgICAgICAgIHdyaXRlRGF0YUhlYWRlcihNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNULCByZW1haW5pbmcpOworCisgICAgICAgIGNoYXIgYnVmZmVyWzY1NTM2XTsKKyAgICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWQoc3JjRkQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGludCB3cml0dGVuID0gbURhdGEud3JpdGUobUVuZHBvaW50T3V0LCBidWZmZXIsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBjaGVjayBlcnJvcgorICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSBjb3VudDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIHJldHVybiAocmVtYWluaW5nID09IDAgJiYgcmV0ID09IE1UUF9SRVNQT05TRV9PSyk7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVBhcmVudDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0U3RvcmFnZUlEKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVN0b3JhZ2VJRDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwUHJvcGVydHkqIE10cERldmljZTo6Z2V0RGV2aWNlUHJvcERlc2MoTXRwRGV2aWNlUHJvcGVydHkgY29kZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgY29kZSk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gbmV3IE10cFByb3BlcnR5OworICAgICAgICBwcm9wZXJ0eS0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NsYXNzIFJlYWRPYmplY3RUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3ByaXZhdGU6CisgICAgTXRwRGV2aWNlKiAgICAgICAgICBtRGV2aWNlOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgbUhhbmRsZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1PYmplY3RTaXplOworICAgIHZvaWQqICAgICAgICAgICAgICAgbUluaXRpYWxEYXRhOworICAgIGludCAgICAgICAgICAgICAgICAgbUluaXRpYWxEYXRhTGVuZ3RoOworICAgIGludCAgICAgICAgICAgICAgICAgbUZEOworCitwdWJsaWM6CisgICAgUmVhZE9iamVjdFRocmVhZChNdHBEZXZpY2UqIGRldmljZSwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IG9iamVjdFNpemUpCisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgICAgICBtT2JqZWN0U2l6ZShvYmplY3RTaXplKSwKKyAgICAgICAgICBtSW5pdGlhbERhdGEoTlVMTCksCisgICAgICAgICAgbUluaXRpYWxEYXRhTGVuZ3RoKDApCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgflJlYWRPYmplY3RUaHJlYWQoKSB7CisgICAgICAgIGlmIChtRkQgPj0gMCkKKyAgICAgICAgICAgIGNsb3NlKG1GRCk7CisgICAgICAgIGZyZWUobUluaXRpYWxEYXRhKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCBpbml0KCkgeworICAgICAgICBtRGV2aWNlLT5tUmVxdWVzdC5yZXNldCgpOworICAgICAgICBtRGV2aWNlLT5tUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgbUhhbmRsZSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5zZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QpCisgICAgICAgICAgICAgICAgJiYgbURldmljZS0+bURhdGEucmVhZERhdGFIZWFkZXIobURldmljZS0+bUVuZHBvaW50SW4pKSB7CisKKyAgICAgICAgICAgIC8vIG1EYXRhIHdpbGwgY29udGFpbiBoZWFkZXIgYW5kIHBvc3NpYmx5IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9iamVjdCBkYXRhCisgICAgICAgICAgICBtSW5pdGlhbERhdGEgPSBtRGV2aWNlLT5tRGF0YS5nZXREYXRhKG1Jbml0aWFsRGF0YUxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHBpcGUgZm9yIHRoZSBjbGllbnQgdG8gcmVhZCBmcm9tCisgICAgICAgICAgICBpbnQgcGlwZWZkWzJdOworICAgICAgICAgICAgaWYgKHBpcGUocGlwZWZkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJwaXBlIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1GRCA9IHBpcGVmZFsxXTsKKyAgICAgICAgICAgIHJldHVybiBwaXBlZmRbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgeworICAgICAgICBpbnQgcmVtYWluaW5nID0gbU9iamVjdFNpemU7CisgICAgICAgIGlmIChtSW5pdGlhbERhdGEpIHsKKyAgICAgICAgICAgIHdyaXRlKG1GRCwgbUluaXRpYWxEYXRhLCBtSW5pdGlhbERhdGFMZW5ndGgpOworICAgICAgICAgICAgcmVtYWluaW5nIC09IG1Jbml0aWFsRGF0YUxlbmd0aDsKKyAgICAgICAgICAgIGZyZWUobUluaXRpYWxEYXRhKTsKKyAgICAgICAgICAgIG1Jbml0aWFsRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIGJ1ZmZlclsxNjM4NF07CisgICAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICBpbnQgcmVhZFNpemUgPSAocmVtYWluaW5nID4gc2l6ZW9mKGJ1ZmZlcikgPyBzaXplb2YoYnVmZmVyKSA6IHJlbWFpbmluZyk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBtRGV2aWNlLT5tRGF0YS5yZWFkRGF0YShtRGV2aWNlLT5tRW5kcG9pbnRJbiwgYnVmZmVyLCByZWFkU2l6ZSk7CisgICAgICAgICAgICBpbnQgd3JpdHRlbjsKKyAgICAgICAgICAgIGlmIChjb3VudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IHdyaXR0ZW4gPSB3cml0ZShtRkQsIGJ1ZmZlciwgY291bnQpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNoZWNrIGVycm9yCisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IGNvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSBtRGV2aWNlLT5yZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgbURldmljZS0+bU11dGV4LnVubG9jaygpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsKKworICAgIC8vIHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBwaXBlIHRvIHJlYWQgdGhlIG9iamVjdCdzIGRhdGEKK2ludCBNdHBEZXZpY2U6OnJlYWRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IG9iamVjdFNpemUpIHsKKyAgICBtTXV0ZXgubG9jaygpOworCisgICAgUmVhZE9iamVjdFRocmVhZCogdGhyZWFkID0gbmV3IFJlYWRPYmplY3RUaHJlYWQodGhpcywgaGFuZGxlLCBvYmplY3RTaXplKTsKKyAgICBpbnQgZmQgPSB0aHJlYWQtPmluaXQoKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIGRlbGV0ZSB0aHJlYWQ7CisgICAgICAgIG1NdXRleC51bmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aHJlYWQtPnJ1bigiUmVhZE9iamVjdFRocmVhZCIpOworICAgIH0KKyAgICByZXR1cm4gZmQ7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kUmVxdWVzdChNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbikgeworICAgIExPR1YoInNlbmRSZXF1ZXN0OiAlc1xuIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbikpOworICAgIG1SZXF1ZXN0LnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICBpZiAobVRyYW5zYWN0aW9uSUQgPiAwKQorICAgICAgICBtUmVxdWVzdC5zZXRUcmFuc2FjdGlvbklEKG1UcmFuc2FjdGlvbklEKyspOworICAgIGludCByZXQgPSBtUmVxdWVzdC53cml0ZShtRW5kcG9pbnRPdXQpOworICAgIG1SZXF1ZXN0LmR1bXAoKTsKKyAgICByZXR1cm4gKHJldCA+IDApOworfQorCitib29sIE10cERldmljZTo6c2VuZERhdGEoKSB7CisgICAgTE9HVigic2VuZERhdGFcbiIpOworICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUobVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpKTsKKyAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgaW50IHJldCA9IG1EYXRhLndyaXRlKG1FbmRwb2ludE91dCk7CisgICAgbURhdGEuZHVtcCgpOworICAgIHJldHVybiAocmV0ID4gMCk7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpyZWFkRGF0YSgpIHsKKyAgICBtRGF0YS5yZXNldCgpOworICAgIGludCByZXQgPSBtRGF0YS5yZWFkKG1FbmRwb2ludEluKTsKKyAgICBMT0dWKCJyZWFkRGF0YSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICBpZiAocmV0ID49IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgbURhdGEuZHVtcCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIExPR1YoInJlYWRSZXNwb25zZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIE10cERldmljZTo6d3JpdGVEYXRhSGVhZGVyKE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uLCBpbnQgZGF0YUxlbmd0aCkgeworICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgcmV0dXJuICghbURhdGEud3JpdGVEYXRhSGVhZGVyKG1FbmRwb2ludE91dCwgZGF0YUxlbmd0aCkpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwRGV2aWNlOjpyZWFkUmVzcG9uc2UoKSB7CisgICAgTE9HVigicmVhZFJlc3BvbnNlXG4iKTsKKyAgICBpbnQgcmV0ID0gbVJlc3BvbnNlLnJlYWQobUVuZHBvaW50SW4pOworICAgIGlmIChyZXQgPj0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICBtUmVzcG9uc2UuZHVtcCgpOworICAgICAgICByZXR1cm4gbVJlc3BvbnNlLmdldFJlc3BvbnNlQ29kZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRCgicmVhZFJlc3BvbnNlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNDkyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ERVZJQ0VfSAorI2RlZmluZSBfTVRQX0RFVklDRV9ICisKKyNpbmNsdWRlICJNdHBSZXF1ZXN0UGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworc3RydWN0IHVzYl9kZXZpY2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGV2aWNlSW5mbzsKK2NsYXNzIE10cE9iamVjdEluZm87CitjbGFzcyBNdHBTdG9yYWdlSW5mbzsKKworY2xhc3MgTXRwRGV2aWNlIHsKK3ByaXZhdGU6CisgICAgc3RydWN0IHVzYl9kZXZpY2UqICAgICAgbURldmljZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludEluOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludE91dDsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50KiAgICBtRW5kcG9pbnRJbnRyOworICAgIE10cERldmljZUluZm8qICAgICAgICAgIG1EZXZpY2VJbmZvOworICAgIE10cFByb3BlcnR5TGlzdCAgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzOworCisgICAgLy8gYSB1bmlxdWUgSUQgZm9yIHRoZSBkZXZpY2UKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSUQ7CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgICAgICBtU2Vzc2lvbklEOworICAgIC8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gSUQKKyAgICBNdHBUcmFuc2FjdGlvbklEICAgICAgICBtVHJhbnNhY3Rpb25JRDsKKworICAgIE10cFJlcXVlc3RQYWNrZXQgICAgICAgIG1SZXF1ZXN0OworICAgIE10cERhdGFQYWNrZXQgICAgICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgICAgIG1SZXNwb25zZTsKKworICAgIC8vIHRvIGVuc3VyZSBvbmx5IG9uZSBNVFAgdHJhbnNhY3Rpb24gYXQgYSB0aW1lCisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbU11dGV4OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlKiBkZXZpY2UsIGludCBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiwgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW50cik7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk10cERldmljZSgpOworCisgICAgaW5saW5lIGludCAgICAgICAgICAgICAgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBtSUQ7IH0KKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBjbG9zZSgpOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGdldERldmljZU5hbWUoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG9wZW5TZXNzaW9uKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgY2xvc2VTZXNzaW9uKCk7CisKKyAgICBNdHBEZXZpY2VJbmZvKiAgICAgICAgICBnZXREZXZpY2VJbmZvKCk7CisgICAgTXRwU3RvcmFnZUlETGlzdCogICAgICAgZ2V0U3RvcmFnZUlEcygpOworICAgIE10cFN0b3JhZ2VJbmZvKiAgICAgICAgIGdldFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQpOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdEhhbmRsZXMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisgICAgTXRwT2JqZWN0SW5mbyogICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50JiBvdXRMZW5ndGgpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIHNlbmRPYmplY3RJbmZvKE10cE9iamVjdEluZm8qIGluZm8pOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmRPYmplY3QoTXRwT2JqZWN0SW5mbyogaW5mbywgaW50IHNyY0ZEKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgZ2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldFN0b3JhZ2VJRChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldERldmljZVByb3BEZXNjKE10cERldmljZVByb3BlcnR5IGNvZGUpOworCisgICAgLy8gcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBhIHBpcGUgdG8gcmVhZCB0aGUgb2JqZWN0J3MgZGF0YQorICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlYWRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IG9iamVjdFNpemUpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBSZWFkT2JqZWN0VGhyZWFkOworCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgc2VuZFJlcXVlc3QoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24pOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmREYXRhKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgcmVhZERhdGEoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB3cml0ZURhdGFIZWFkZXIoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24sIGludCBkYXRhTGVuZ3RoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZWFkUmVzcG9uc2UoKTsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVWSUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkzMjJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERldmljZUluZm8iCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGV2aWNlSW5mbzo6TXRwRGV2aWNlSW5mbygpCisgICAgOiAgIG1TdGFuZGFyZFZlcnNpb24oMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25JRCgwKSwKKyAgICAgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb24oMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjKE5VTEwpLAorICAgICAgICBtRnVuY3Rpb25hbENvZGUoMCksCisgICAgICAgIG1PcGVyYXRpb25zKE5VTEwpLAorICAgICAgICBtRXZlbnRzKE5VTEwpLAorICAgICAgICBtRGV2aWNlUHJvcGVydGllcyhOVUxMKSwKKyAgICAgICAgbUNhcHR1cmVGb3JtYXRzKE5VTEwpLAorICAgICAgICBtUGxheWJhY2tGb3JtYXRzKE5VTEwpLAorICAgICAgICBtTWFudWZhY3R1cmVyKE5VTEwpLAorICAgICAgICBtTW9kZWwoTlVMTCksCisgICAgICAgIG1WZXJzaW9uKE5VTEwpLAorICAgICAgICBtU2VyaWFsKE5VTEwpCit7Cit9CisKK010cERldmljZUluZm86On5NdHBEZXZpY2VJbmZvKCkgeworICAgIGlmIChtVmVuZG9yRXh0ZW5zaW9uRGVzYykKKyAgICAgICAgZnJlZShtVmVuZG9yRXh0ZW5zaW9uRGVzYyk7CisgICAgZGVsZXRlIG1PcGVyYXRpb25zOworICAgIGRlbGV0ZSBtRXZlbnRzOworICAgIGRlbGV0ZSBtRGV2aWNlUHJvcGVydGllczsKKyAgICBkZWxldGUgbUNhcHR1cmVGb3JtYXRzOworICAgIGRlbGV0ZSBtUGxheWJhY2tGb3JtYXRzOworICAgIGlmIChtTWFudWZhY3R1cmVyKQorICAgICAgICBmcmVlKG1NYW51ZmFjdHVyZXIpOworICAgIGlmIChtTW9kZWwpCisgICAgICAgIGZyZWUobU1vZGVsKTsKKyAgICBpZiAobVZlcnNpb24pCisgICAgICAgIGZyZWUobVZlcnNpb24pOworICAgIGlmIChtU2VyaWFsKQorICAgICAgICBmcmVlKG1TZXJpYWwpOworfQorCit2b2lkIE10cERldmljZUluZm86OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKworICAgIC8vIHJlYWQgdGhlIGRldmljZSBpbmZvCisgICAgbVN0YW5kYXJkVmVyc2lvbiA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVmVuZG9yRXh0ZW5zaW9uSUQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb24gPSBwYWNrZXQuZ2V0VUludDE2KCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVZlbmRvckV4dGVuc2lvbkRlc2MgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworCisgICAgbUZ1bmN0aW9uYWxDb2RlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1PcGVyYXRpb25zID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtRXZlbnRzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtRGV2aWNlUHJvcGVydGllcyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbUNhcHR1cmVGb3JtYXRzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtUGxheWJhY2tGb3JtYXRzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtTWFudWZhY3R1cmVyID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU1vZGVsID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVZlcnNpb24gPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtU2VyaWFsID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKK30KKwordm9pZCBNdHBEZXZpY2VJbmZvOjpwcmludCgpIHsKKyAgICBMT0dWKCJEZXZpY2UgSW5mbzpcblx0bVN0YW5kYXJkVmVyc2lvbjogJWRcblx0bVZlbmRvckV4dGVuc2lvbklEOiAlZFxuXHRtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbnk6ICVkXG4iLAorICAgICAgICAgICAgbVN0YW5kYXJkVmVyc2lvbiwgbVZlbmRvckV4dGVuc2lvbklELCBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbik7CisgICAgTE9HVigiXHRtVmVuZG9yRXh0ZW5zaW9uRGVzYzogJXNcblx0bUZ1bmN0aW9uYWxDb2RlOiAlZFxuXHRtTWFudWZhY3R1cmVyOiAlc1xuXHRtTW9kZWw6ICVzXG5cdG1WZXJzaW9uOiAlc1xuXHRtU2VyaWFsOiAlc1xuIiwKKyAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjLCBtRnVuY3Rpb25hbENvZGUsIG1NYW51ZmFjdHVyZXIsIG1Nb2RlbCwgbVZlcnNpb24sIG1TZXJpYWwpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZUluZm8uaCBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiYWExMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ERVZJQ0VfSU5GT19ICisjZGVmaW5lIF9NVFBfREVWSUNFX0lORk9fSAorCitzdHJ1Y3Qgc3RhdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBEZXZpY2VJbmZvIHsKK3B1YmxpYzoKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtU3RhbmRhcmRWZXJzaW9uOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25JRDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYzsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtRnVuY3Rpb25hbENvZGU7CisgICAgVUludDE2TGlzdCogICAgICAgICAgICAgbU9wZXJhdGlvbnM7CisgICAgVUludDE2TGlzdCogICAgICAgICAgICAgbUV2ZW50czsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBtRGV2aWNlUHJvcGVydGllczsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBtQ2FwdHVyZUZvcm1hdHM7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgbVBsYXliYWNrRm9ybWF0czsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtTWFudWZhY3R1cmVyOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1Nb2RlbDsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtVmVyc2lvbjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtU2VyaWFsOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlSW5mbygpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBEZXZpY2VJbmZvKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBwcmludCgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVWSUNFX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NDU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRXZlbnRQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpZmRlZiBNVFBfREVWSUNFCisjaW5jbHVkZSA8bGludXgvdXNiL2ZfbXRwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIk10cEV2ZW50UGFja2V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRXZlbnRQYWNrZXQ6Ok10cEV2ZW50UGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMikKK3sKK30KKworTXRwRXZlbnRQYWNrZXQ6On5NdHBFdmVudFBhY2tldCgpIHsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UKK2ludCBNdHBFdmVudFBhY2tldDo6d3JpdGUoaW50IGZkKSB7CisgICAgc3RydWN0IG10cF9ldmVudCAgICBldmVudDsKKworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0VWRU5UKTsKKworICAgIGV2ZW50LmRhdGEgPSBtQnVmZmVyOworICAgIGV2ZW50Lmxlbmd0aCA9IG1QYWNrZXRTaXplOworICAgIGludCByZXQgPSA6OmlvY3RsKGZkLCBNVFBfU0VORF9FVkVOVCwgKHVuc2lnbmVkIGxvbmcpJmV2ZW50KTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKK2ludCBNdHBFdmVudFBhY2tldDo6cmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmggYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFlODY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9FVkVOVF9QQUNLRVRfSAorI2RlZmluZSBfTVRQX0VWRU5UX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBFdmVudFBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBFdmVudFBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cEV2ZW50UGFja2V0KCk7CisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworI2VuZGlmCisKKyAgICBpbmxpbmUgTXRwRXZlbnRDb2RlICAgICBnZXRFdmVudENvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICBzZXRFdmVudENvZGUoTXRwRXZlbnRDb2RlIGNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHNldENvbnRhaW5lckNvZGUoY29kZSk7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0VWRU5UX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2OGMzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwT2JqZWN0SW5mbyIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cE9iamVjdEluZm86Ok10cE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkKKyAgICA6ICAgbUhhbmRsZShoYW5kbGUpLAorICAgICAgICBtU3RvcmFnZUlEKDApLAorICAgICAgICBtRm9ybWF0KDApLAorICAgICAgICBtUHJvdGVjdGlvblN0YXR1cygwKSwKKyAgICAgICAgbUNvbXByZXNzZWRTaXplKDApLAorICAgICAgICBtVGh1bWJGb3JtYXQoMCksCisgICAgICAgIG1UaHVtYkNvbXByZXNzZWRTaXplKDApLAorICAgICAgICBtVGh1bWJQaXhXaWR0aCgwKSwKKyAgICAgICAgbVRodW1iUGl4SGVpZ2h0KDApLAorICAgICAgICBtSW1hZ2VQaXhXaWR0aCgwKSwKKyAgICAgICAgbUltYWdlUGl4SGVpZ2h0KDApLAorICAgICAgICBtSW1hZ2VQaXhEZXB0aCgwKSwKKyAgICAgICAgbVBhcmVudCgwKSwKKyAgICAgICAgbUFzc29jaWF0aW9uVHlwZSgwKSwKKyAgICAgICAgbUFzc29jaWF0aW9uRGVzYygwKSwKKyAgICAgICAgbVNlcXVlbmNlTnVtYmVyKDApLAorICAgICAgICBtTmFtZShOVUxMKSwKKyAgICAgICAgbURhdGVDcmVhdGVkKDApLAorICAgICAgICBtRGF0ZU1vZGlmaWVkKDApLAorICAgICAgICBtS2V5d29yZHMoTlVMTCkKK3sKK30KKworTXRwT2JqZWN0SW5mbzo6fk10cE9iamVjdEluZm8oKSB7CisgICAgaWYgKG1OYW1lKQorICAgICAgICBmcmVlKG1OYW1lKTsKKyAgICBpZiAobUtleXdvcmRzKQorICAgICAgICBmcmVlKG1LZXl3b3Jkcyk7Cit9CisKK3ZvaWQgTXRwT2JqZWN0SW5mbzo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nOworICAgIHRpbWVfdCB0aW1lOworCisgICAgbVN0b3JhZ2VJRCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtRm9ybWF0ID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Qcm90ZWN0aW9uU3RhdHVzID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Db21wcmVzc2VkU2l6ZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJGb3JtYXQgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVRodW1iQ29tcHJlc3NlZFNpemUgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVRodW1iUGl4V2lkdGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVRodW1iUGl4SGVpZ2h0ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeFdpZHRoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeEhlaWdodCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtSW1hZ2VQaXhEZXB0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtUGFyZW50ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Bc3NvY2lhdGlvblR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUFzc29jaWF0aW9uRGVzYyA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtU2VxdWVuY2VOdW1iZXIgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU5hbWUgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIGlmIChwYXJzZURhdGVUaW1lKChjb25zdCBjaGFyKilzdHJpbmcsIHRpbWUpKQorICAgICAgICBtRGF0ZUNyZWF0ZWQgPSB0aW1lOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIGlmIChwYXJzZURhdGVUaW1lKChjb25zdCBjaGFyKilzdHJpbmcsIHRpbWUpKQorICAgICAgICBtRGF0ZU1vZGlmaWVkID0gdGltZTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtS2V5d29yZHMgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworfQorCit2b2lkIE10cE9iamVjdEluZm86OnByaW50KCkgeworICAgIExPR0QoIk10cE9iamVjdCBJbmZvICUwOFg6ICVzXG4iLCBtSGFuZGxlLCBtTmFtZSk7CisgICAgTE9HRCgiICBtU3RvcmFnZUlEOiAlMDhYIG1Gb3JtYXQ6ICUwNFggbVByb3RlY3Rpb25TdGF0dXM6ICVkXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VJRCwgbUZvcm1hdCwgbVByb3RlY3Rpb25TdGF0dXMpOworICAgIExPR0QoIiAgbUNvbXByZXNzZWRTaXplOiAlZCBtVGh1bWJGb3JtYXQ6ICUwNFggbVRodW1iQ29tcHJlc3NlZFNpemU6ICVkXG4iLAorICAgICAgICAgICAgbUNvbXByZXNzZWRTaXplLCBtRm9ybWF0LCBtVGh1bWJDb21wcmVzc2VkU2l6ZSk7CisgICAgTE9HRCgiICBtVGh1bWJQaXhXaWR0aDogJWQgbVRodW1iUGl4SGVpZ2h0OiAlZFxuIiwgbVRodW1iUGl4V2lkdGgsIG1UaHVtYlBpeEhlaWdodCk7CisgICAgTE9HRCgiICBtSW1hZ2VQaXhXaWR0aDogJWQgbUltYWdlUGl4SGVpZ2h0OiAlZCBtSW1hZ2VQaXhEZXB0aDogJWRcbiIsCisgICAgICAgICAgICBtSW1hZ2VQaXhXaWR0aCwgbUltYWdlUGl4SGVpZ2h0LCBtSW1hZ2VQaXhEZXB0aCk7CisgICAgTE9HRCgiICBtUGFyZW50OiAlMDhYIG1Bc3NvY2lhdGlvblR5cGU6ICUwNFggbUFzc29jaWF0aW9uRGVzYzogJTA0WFxuIiwKKyAgICAgICAgICAgIG1QYXJlbnQsIG1Bc3NvY2lhdGlvblR5cGUsIG1Bc3NvY2lhdGlvbkRlc2MpOworICAgIExPR0QoIiAgbVNlcXVlbmNlTnVtYmVyOiAlZCBtRGF0ZUNyZWF0ZWQ6ICVsZCBtRGF0ZU1vZGlmaWVkOiAlbGQgbUtleXdvcmRzOiAlc1xuIiwKKyAgICAgICAgICAgIG1TZXF1ZW5jZU51bWJlciwgbURhdGVDcmVhdGVkLCBtRGF0ZU1vZGlmaWVkLCBtS2V5d29yZHMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE9iamVjdEluZm8uaCBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhNDQ5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfT0JKRUNUX0lORk9fSAorI2RlZmluZSBfTVRQX09CSkVDVF9JTkZPX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwT2JqZWN0SW5mbyB7CitwdWJsaWM6CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOworICAgIE10cFN0b3JhZ2VJRCAgICAgICAgbVN0b3JhZ2VJRDsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1Gb3JtYXQ7CisgICAgdWludDE2X3QgICAgICAgICAgICBtUHJvdGVjdGlvblN0YXR1czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Db21wcmVzc2VkU2l6ZTsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1UaHVtYkZvcm1hdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1UaHVtYkNvbXByZXNzZWRTaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRodW1iUGl4V2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtVGh1bWJQaXhIZWlnaHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtSW1hZ2VQaXhXaWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeEhlaWdodDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeERlcHRoOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgbVBhcmVudDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1Bc3NvY2lhdGlvblR5cGU7CisgICAgdWludDMyX3QgICAgICAgICAgICBtQXNzb2NpYXRpb25EZXNjOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVNlcXVlbmNlTnVtYmVyOworICAgIGNoYXIqICAgICAgICAgICAgICAgbU5hbWU7CisgICAgdGltZV90ICAgICAgICAgICAgICBtRGF0ZUNyZWF0ZWQ7CisgICAgdGltZV90ICAgICAgICAgICAgICBtRGF0ZU1vZGlmaWVkOworICAgIGNoYXIqICAgICAgICAgICAgICAgbUtleXdvcmRzOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cE9iamVjdEluZm8oKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwcmludCgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfT0JKRUNUX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmJmOGJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFBhY2tldC5jcHAKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFBhY2tldCIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBQYWNrZXQ6Ok10cFBhY2tldChpbnQgYnVmZmVyU2l6ZSkKKyAgICA6ICAgbUJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbUJ1ZmZlclNpemUoYnVmZmVyU2l6ZSksCisgICAgICAgIG1BbGxvY2F0aW9uSW5jcmVtZW50KGJ1ZmZlclNpemUpLAorICAgICAgICBtUGFja2V0U2l6ZSgwKQoreworICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhidWZmZXJTaXplKTsKKyAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgTE9HRSgib3V0IG9mIG1lbW9yeSEiKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKK010cFBhY2tldDo6fk10cFBhY2tldCgpIHsKKyAgICBpZiAobUJ1ZmZlcikKKyAgICAgICAgZnJlZShtQnVmZmVyKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnJlc2V0KCkgeworICAgIGFsbG9jYXRlKE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIG1QYWNrZXRTaXplID0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKKyAgICBtZW1zZXQobUJ1ZmZlciwgMCwgbUJ1ZmZlclNpemUpOworfQorCit2b2lkIE10cFBhY2tldDo6YWxsb2NhdGUoaW50IGxlbmd0aCkgeworICAgIGlmIChsZW5ndGggPiBtQnVmZmVyU2l6ZSkgeworICAgICAgICBpbnQgbmV3TGVuZ3RoID0gbGVuZ3RoICsgbUFsbG9jYXRpb25JbmNyZW1lbnQ7CisgICAgICAgIG1CdWZmZXIgPSAodWludDhfdCAqKXJlYWxsb2MobUJ1ZmZlciwgbmV3TGVuZ3RoKTsKKyAgICAgICAgaWYgKCFtQnVmZmVyKSB7CisgICAgICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5ISIpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyU2l6ZSA9IG5ld0xlbmd0aDsKKyAgICB9Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpkdW1wKCkgeworI2RlZmluZSBEVU1QX0JZVEVTX1BFUl9ST1cgIDE2CisgICAgY2hhciBidWZmZXJbNTAwXTsKKyAgICBjaGFyKiBidWZwdHIgPSBidWZmZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QYWNrZXRTaXplOyBpKyspIHsKKyAgICAgICAgc3ByaW50ZihidWZwdHIsICIlMDJYICIsIG1CdWZmZXJbaV0pOworICAgICAgICBidWZwdHIgKz0gc3RybGVuKGJ1ZnB0cik7CisgICAgICAgIGlmIChpICUgRFVNUF9CWVRFU19QRVJfUk9XID09IChEVU1QX0JZVEVTX1BFUl9ST1cgLSAxKSkgeworICAgICAgICAgICAgTE9HVigiJXMiLCBidWZmZXIpOworICAgICAgICAgICAgYnVmcHRyID0gYnVmZmVyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidWZwdHIgIT0gYnVmZmVyKSB7CisgICAgICAgIC8vIHByaW50IGxhc3QgbGluZQorICAgICAgICBMT0dWKCIlcyIsIGJ1ZmZlcik7CisgICAgfQorICAgIExPR1YoIlxuIik7Cit9CisKK3VpbnQxNl90IE10cFBhY2tldDo6Z2V0VUludDE2KGludCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gKCh1aW50MTZfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpIHwgKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0XTsKK30KKwordWludDMyX3QgTXRwUGFja2V0OjpnZXRVSW50MzIoaW50IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDJdIDw8IDE2KSB8CisgICAgICAgICAgICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSAgfCAodWludDMyX3QpbUJ1ZmZlcltvZmZzZXRdOworfQorCit2b2lkIE10cFBhY2tldDo6cHV0VUludDE2KGludCBvZmZzZXQsIHVpbnQxNl90IHZhbHVlKSB7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnB1dFVJbnQzMihpbnQgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSkgeworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKK30KKwordWludDE2X3QgTXRwUGFja2V0OjpnZXRDb250YWluZXJDb2RlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpzZXRDb250YWluZXJDb2RlKHVpbnQxNl90IGNvZGUpIHsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCwgY29kZSk7Cit9CisKK010cFRyYW5zYWN0aW9uSUQgTXRwUGFja2V0OjpnZXRUcmFuc2FjdGlvbklEKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKSB7CisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VULCBpZCk7Cit9CisKK3VpbnQzMl90IE10cFBhY2tldDo6Z2V0UGFyYW1ldGVyKGludCBpbmRleCkgY29uc3QgeworICAgIGlmIChpbmRleCA8IDEgfHwgaW5kZXggPiA1KSB7CisgICAgICAgIExPR0UoImluZGV4ICVkIG91dCBvZiByYW5nZSBpbiBNdHBSZXF1ZXN0UGFja2V0OjpnZXRQYXJhbWV0ZXIiLCBpbmRleCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gZ2V0VUludDMyKE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCArIChpbmRleCAtIDEpICogc2l6ZW9mKHVpbnQzMl90KSk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpzZXRQYXJhbWV0ZXIoaW50IGluZGV4LCB1aW50MzJfdCB2YWx1ZSkgeworICAgIGlmIChpbmRleCA8IDEgfHwgaW5kZXggPiA1KSB7CisgICAgICAgIExPR0UoImluZGV4ICVkIG91dCBvZiByYW5nZSBpbiBNdHBSZXNwb25zZVBhY2tldDo6c2V0UGFyYW1ldGVyIiwgaW5kZXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBvZmZzZXQgPSBNVFBfQ09OVEFJTkVSX1BBUkFNRVRFUl9PRkZTRVQgKyAoaW5kZXggLSAxKSAqIHNpemVvZih1aW50MzJfdCk7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgb2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KSkKKyAgICAgICAgbVBhY2tldFNpemUgPSBvZmZzZXQgKyBzaXplb2YodWludDMyX3QpOworICAgIHB1dFVJbnQzMihvZmZzZXQsIHZhbHVlKTsKK30KKworI2lmZGVmIE1UUF9IT1NUCitpbnQgTXRwUGFja2V0Ojp0cmFuc2ZlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKHVzYl9lbmRwb2ludF9xdWV1ZShlcCwgYnVmZmVyLCBsZW5ndGgpKSB7CisgICAgICAgIExPR0UoInVzYl9lbmRwb2ludF9xdWV1ZSBmYWlsZWQsIGVycm5vOiAlZCIsIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgZXBfbnVtOworICAgIHJldHVybiB1c2JfZW5kcG9pbnRfd2FpdCh1c2JfZW5kcG9pbnRfZ2V0X2RldmljZShlcCksICZlcF9udW0pOworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4ZDZkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQYWNrZXQuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK3N0cnVjdCB1c2JfZW5kcG9pbnQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwUGFja2V0IHsKKworcHJvdGVjdGVkOgorICAgIHVpbnQ4X3QqICAgICAgICAgICAgbUJ1ZmZlcjsKKyAgICAvLyBjdXJyZW50IHNpemUgb2YgdGhlIGJ1ZmZlcgorICAgIGludCAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemU7CisgICAgLy8gbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZCB3aGVuIHJlc2l6aW5nIHRoZSBidWZmZXIKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uSW5jcmVtZW50OworICAgIC8vIHNpemUgb2YgdGhlIGRhdGEgaW4gdGhlIHBhY2tldAorICAgIGludCAgICAgICAgICAgICAgICAgbVBhY2tldFNpemU7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFBhY2tldChpbnQgYnVmZmVyU2l6ZSk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUGFja2V0KCk7CisKKyAgICAvLyBzZXRzIHBhY2tldCBzaXplIHRvIHRoZSBkZWZhdWx0IGNvbnRhaW5lciBzaXplIGFuZCBzZXRzIGJ1ZmZlciB0byB6ZXJvCisgICAgdmlydHVhbCB2b2lkICAgICAgICByZXNldCgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBhbGxvY2F0ZShpbnQgbGVuZ3RoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIGR1bXAoKTsKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgZ2V0Q29udGFpbmVyQ29kZSgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0Q29udGFpbmVyQ29kZSh1aW50MTZfdCBjb2RlKTsKKworICAgIE10cFRyYW5zYWN0aW9uSUQgICAgZ2V0VHJhbnNhY3Rpb25JRCgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGluZGV4LCB1aW50MzJfdCB2YWx1ZSk7CisKKyNpZmRlZiBNVFBfSE9TVAorICAgIGludCAgICAgICAgICAgICAgICAgdHJhbnNmZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgaW50IGxlbmd0aCk7CisjZW5kaWYKKworcHJvdGVjdGVkOgorICAgIHVpbnQxNl90ICAgICAgICAgICAgZ2V0VUludDE2KGludCBvZmZzZXQpIGNvbnN0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0VUludDMyKGludCBvZmZzZXQpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDE2KGludCBvZmZzZXQsIHVpbnQxNl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQzMihpbnQgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcCBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkMDIzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFByb3BlcnR5IgorCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBQcm9wZXJ0eTo6TXRwUHJvcGVydHkoKQorICAgIDogICBtQ29kZSgwKSwKKyAgICAgICAgbVR5cGUoMCksCisgICAgICAgIG1Xcml0ZWFibGUoZmFsc2UpLAorICAgICAgICBtRGVmYXVsdEFycmF5TGVuZ3RoKDApLAorICAgICAgICBtRGVmYXVsdEFycmF5VmFsdWVzKE5VTEwpLAorICAgICAgICBtQ3VycmVudEFycmF5TGVuZ3RoKDApLAorICAgICAgICBtQ3VycmVudEFycmF5VmFsdWVzKE5VTEwpLAorICAgICAgICBtR3JvdXBDb2RlKDApLAorICAgICAgICBtRm9ybUZsYWcoa0Zvcm1Ob25lKSwKKyAgICAgICAgbUVudW1MZW5ndGgoMCksCisgICAgICAgIG1FbnVtVmFsdWVzKE5VTEwpCit7CisgICAgbWVtc2V0KCZtRGVmYXVsdFZhbHVlLCAwLCBzaXplb2YobURlZmF1bHRWYWx1ZSkpOworICAgIG1lbXNldCgmbUN1cnJlbnRWYWx1ZSwgMCwgc2l6ZW9mKG1DdXJyZW50VmFsdWUpKTsKKyAgICBtZW1zZXQoJm1NaW5pbXVtVmFsdWUsIDAsIHNpemVvZihtTWluaW11bVZhbHVlKSk7CisgICAgbWVtc2V0KCZtTWF4aW11bVZhbHVlLCAwLCBzaXplb2YobU1heGltdW1WYWx1ZSkpOworfQorCitNdHBQcm9wZXJ0eTo6TXRwUHJvcGVydHkoTXRwUHJvcGVydHlDb2RlIHByb3BDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSkKKyAgICA6ICAgbUNvZGUocHJvcENvZGUpLAorICAgICAgICBtVHlwZSh0eXBlKSwKKyAgICAgICAgbVdyaXRlYWJsZSh3cml0ZWFibGUpLAorICAgICAgICBtRGVmYXVsdEFycmF5TGVuZ3RoKDApLAorICAgICAgICBtRGVmYXVsdEFycmF5VmFsdWVzKE5VTEwpLAorICAgICAgICBtQ3VycmVudEFycmF5TGVuZ3RoKDApLAorICAgICAgICBtQ3VycmVudEFycmF5VmFsdWVzKE5VTEwpLAorICAgICAgICBtR3JvdXBDb2RlKDApLAorICAgICAgICBtRm9ybUZsYWcoa0Zvcm1Ob25lKSwKKyAgICAgICAgbUVudW1MZW5ndGgoMCksCisgICAgICAgIG1FbnVtVmFsdWVzKE5VTEwpCit7CisgICAgbWVtc2V0KCZtRGVmYXVsdFZhbHVlLCAwLCBzaXplb2YobURlZmF1bHRWYWx1ZSkpOworICAgIG1lbXNldCgmbUN1cnJlbnRWYWx1ZSwgMCwgc2l6ZW9mKG1DdXJyZW50VmFsdWUpKTsKKyAgICBtZW1zZXQoJm1NaW5pbXVtVmFsdWUsIDAsIHNpemVvZihtTWluaW11bVZhbHVlKSk7CisgICAgbWVtc2V0KCZtTWF4aW11bVZhbHVlLCAwLCBzaXplb2YobU1heGltdW1WYWx1ZSkpOworCisgICAgaWYgKGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnUuaTggPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudS51OCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51LmkxNiA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudS51MTYgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudS5pMzIgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnUudTMyID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnUuaTY0ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51LnU2NCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgidW5rbm93biB0eXBlICUwNFggaW4gTXRwUHJvcGVydHk6Ok10cFByb3BlcnR5IiwgdHlwZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK010cFByb3BlcnR5Ojp+TXRwUHJvcGVydHkoKSB7CisgICAgaWYgKG1UeXBlID09IE1UUF9UWVBFX1NUUikgeworICAgICAgICAvLyBmcmVlIGFsbCBzdHJpbmdzCisgICAgICAgIGZyZWUobURlZmF1bHRWYWx1ZS5zdHIpOworICAgICAgICBmcmVlKG1DdXJyZW50VmFsdWUuc3RyKTsKKyAgICAgICAgZnJlZShtTWluaW11bVZhbHVlLnN0cik7CisgICAgICAgIGZyZWUobU1heGltdW1WYWx1ZS5zdHIpOworICAgICAgICBpZiAobURlZmF1bHRBcnJheVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGVmYXVsdEFycmF5TGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZnJlZShtRGVmYXVsdEFycmF5VmFsdWVzW2ldLnN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DdXJyZW50QXJyYXlWYWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUN1cnJlbnRBcnJheUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUN1cnJlbnRBcnJheVZhbHVlc1tpXS5zdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChtRW51bVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUVudW1WYWx1ZXNbaV0uc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGVbXSBtRGVmYXVsdEFycmF5VmFsdWVzOworICAgIGRlbGV0ZVtdIG1DdXJyZW50QXJyYXlWYWx1ZXM7CisgICAgZGVsZXRlW10gbUVudW1WYWx1ZXM7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgYm9vbCBkZXZpY2VQcm9wID0gaXNEZXZpY2VQcm9wZXJ0eSgpOworCisgICAgbUNvZGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVdyaXRlYWJsZSA9IChwYWNrZXQuZ2V0VUludDgoKSA9PSAxKTsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICBtRGVmYXVsdEFycmF5VmFsdWVzID0gcmVhZEFycmF5VmFsdWVzKHBhY2tldCwgbURlZmF1bHRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlUHJvcCkKKyAgICAgICAgICAgICAgICBtQ3VycmVudEFycmF5VmFsdWVzID0gcmVhZEFycmF5VmFsdWVzKHBhY2tldCwgbUN1cnJlbnRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1EZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgaWYgKGRldmljZVByb3ApCisgICAgICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbUN1cnJlbnRWYWx1ZSk7CisgICAgfQorICAgIGlmICghZGV2aWNlUHJvcCkKKyAgICAgICAgbUdyb3VwQ29kZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtRm9ybUZsYWcgPSBwYWNrZXQuZ2V0VUludDgoKTsKKworICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgeworICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbU1pbmltdW1WYWx1ZSk7CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtTWF4aW11bVZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1TdGVwU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1FbnVtKSB7CisgICAgICAgIG1FbnVtTGVuZ3RoID0gcGFja2V0LmdldFVJbnQxNigpOworICAgICAgICBtRW51bVZhbHVlcyA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW21FbnVtTGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbUVudW1WYWx1ZXNbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6d3JpdGUoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgYm9vbCBkZXZpY2VQcm9wID0gaXNEZXZpY2VQcm9wZXJ0eSgpOworCisgICAgcGFja2V0LnB1dFVJbnQxNihtQ29kZSk7CisgICAgcGFja2V0LnB1dFVJbnQxNihtVHlwZSk7CisgICAgcGFja2V0LnB1dFVJbnQ4KG1Xcml0ZWFibGUgPyAxIDogMCk7CisKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICB3cml0ZUFycmF5VmFsdWVzKHBhY2tldCwgbURlZmF1bHRBcnJheVZhbHVlcywgbURlZmF1bHRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlUHJvcCkKKyAgICAgICAgICAgICAgICB3cml0ZUFycmF5VmFsdWVzKHBhY2tldCwgbUN1cnJlbnRBcnJheVZhbHVlcywgbUN1cnJlbnRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtRGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VQcm9wKQorICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtQ3VycmVudFZhbHVlKTsKKyAgICB9CisgICAgcGFja2V0LnB1dFVJbnQzMihtR3JvdXBDb2RlKTsKKyAgICBpZiAoIWRldmljZVByb3ApCisgICAgICAgIHBhY2tldC5wdXRVSW50OChtRm9ybUZsYWcpOworICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgeworICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NaW5pbXVtVmFsdWUpOworICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NYXhpbXVtVmFsdWUpOworICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1TdGVwU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1FbnVtKSB7CisgICAgICAgIHBhY2tldC5wdXRVSW50MTYobUVudW1MZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbnVtTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbUVudW1WYWx1ZXNbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6c2V0RGVmYXVsdFZhbHVlKGNvbnN0IHVpbnQxNl90KiBzdHJpbmcpIHsKKyAgICBmcmVlKG1EZWZhdWx0VmFsdWUuc3RyKTsKKyAgICBpZiAoc3RyaW5nKSB7CisgICAgICAgIE10cFN0cmluZ0J1ZmZlciBidWZmZXIoc3RyaW5nKTsKKyAgICAgICAgbURlZmF1bHRWYWx1ZS5zdHIgPSBzdHJkdXAoYnVmZmVyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBtRGVmYXVsdFZhbHVlLnN0ciA9IE5VTEw7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnNldEN1cnJlbnRWYWx1ZShjb25zdCB1aW50MTZfdCogc3RyaW5nKSB7CisgICAgZnJlZShtQ3VycmVudFZhbHVlLnN0cik7CisgICAgaWYgKHN0cmluZykgeworICAgICAgICBNdHBTdHJpbmdCdWZmZXIgYnVmZmVyKHN0cmluZyk7CisgICAgICAgIG1DdXJyZW50VmFsdWUuc3RyID0gc3RyZHVwKGJ1ZmZlcik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbUN1cnJlbnRWYWx1ZS5zdHIgPSBOVUxMOworfQorCit2b2lkIE10cFByb3BlcnR5OjpwcmludCgpIHsKKyAgICBMT0dWKCJNdHBQcm9wZXJ0eSAlMDRYXG4iLCBtQ29kZSk7CisgICAgTE9HVigiICAgIHR5cGUgJTA0WFxuIiwgbVR5cGUpOworICAgIExPR1YoIiAgICB3cml0ZWFibGUgJXNcbiIsIChtV3JpdGVhYmxlID8gInRydWUiIDogImZhbHNlIikpOworfQorCit2b2lkIE10cFByb3BlcnR5OjpyZWFkVmFsdWUoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlJiB2YWx1ZSkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXI7CisKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UODoKKyAgICAgICAgICAgIHZhbHVlLnUuaTggPSBwYWNrZXQuZ2V0SW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICAgICAgdmFsdWUudS51OCA9IHBhY2tldC5nZXRVSW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICAgICAgdmFsdWUudS5pMTYgPSBwYWNrZXQuZ2V0SW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDE2OgorICAgICAgICAgICAgdmFsdWUudS51MTYgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMzI6CisgICAgICAgICAgICB2YWx1ZS51LmkzMiA9IHBhY2tldC5nZXRJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgICAgICB2YWx1ZS51LnUzMiA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ2NDoKKyAgICAgICAgICAgIHZhbHVlLnUuaTY0ID0gcGFja2V0LmdldEludDY0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ2NDoKKyAgICAgICAgICAgIHZhbHVlLnUudTY0ID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQuZ2V0SW50MTI4KHZhbHVlLnUuaTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LmdldFVJbnQxMjgodmFsdWUudS51MTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nQnVmZmVyKTsKKyAgICAgICAgICAgIHZhbHVlLnN0ciA9IHN0cmR1cChzdHJpbmdCdWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bmtub3duIHR5cGUgJTA0WCBpbiBNdHBQcm9wZXJ0eTo6cmVhZFZhbHVlIiwgbVR5cGUpOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6d3JpdGVWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlcjsKKworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDgodmFsdWUudS5pOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDgodmFsdWUudS51OCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTYodmFsdWUudS5pMTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDE2KHZhbHVlLnUudTE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQzMih2YWx1ZS51LmkzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MzIodmFsdWUudS51MzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDY0KHZhbHVlLnUuaTY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ2NCh2YWx1ZS51LnU2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxMjgodmFsdWUudS5pMTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDEyOCh2YWx1ZS51LnUxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICAgICAgaWYgKHZhbHVlLnN0cikKKyAgICAgICAgICAgICAgICBwYWNrZXQucHV0U3RyaW5nKHZhbHVlLnN0cik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVua25vd24gdHlwZSAlMDRYIGluIE10cFByb3BlcnR5Ojp3cml0ZVZhbHVlIiwgbVR5cGUpOworICAgIH0KK30KKworTXRwUHJvcGVydHlWYWx1ZSogTXRwUHJvcGVydHk6OnJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGludCYgbGVuZ3RoKSB7CisgICAgbGVuZ3RoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5VmFsdWVbbGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICByZWFkVmFsdWUocGFja2V0LCByZXN1bHRbaV0pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OndyaXRlQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlKiB2YWx1ZXMsIGludCBsZW5ndGgpIHsKKyAgICBwYWNrZXQucHV0VUludDMyKGxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIHZhbHVlc1tpXSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaCBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjQ2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9QUk9QRVJUWV9ICisjZGVmaW5lIF9NVFBfUFJPUEVSVFlfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitzdHJ1Y3QgTXRwUHJvcGVydHlWYWx1ZSB7CisgICAgdW5pb24geworICAgICAgICBpbnQ4X3QgICAgICAgICAgaTg7CisgICAgICAgIHVpbnQ4X3QgICAgICAgICB1ODsKKyAgICAgICAgaW50MTZfdCAgICAgICAgIGkxNjsKKyAgICAgICAgdWludDE2X3QgICAgICAgIHUxNjsKKyAgICAgICAgaW50MzJfdCAgICAgICAgIGkzMjsKKyAgICAgICAgdWludDMyX3QgICAgICAgIHUzMjsKKyAgICAgICAgaW50NjRfdCAgICAgICAgIGk2NDsKKyAgICAgICAgdWludDY0X3QgICAgICAgIHU2NDsKKyAgICAgICAgaW50MTI4X3QgICAgICAgIGkxMjg7CisgICAgICAgIHVpbnQxMjhfdCAgICAgICB1MTI4OworICAgIH0gdTsKKyAgICAvLyBzdHJpbmcgaW4gVVRGOCBmb3JtYXQKKyAgICBjaGFyKiAgICAgICAgICAgICAgIHN0cjsKK307CisKK2NsYXNzIE10cFByb3BlcnR5IHsKK3B1YmxpYzoKKyAgICBNdHBQcm9wZXJ0eUNvZGUgICAgIG1Db2RlOworICAgIE10cERhdGFUeXBlICAgICAgICAgbVR5cGU7CisgICAgYm9vbCAgICAgICAgICAgICAgICBtV3JpdGVhYmxlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbURlZmF1bHRWYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1DdXJyZW50VmFsdWU7CisKKyAgICAvLyBmb3IgYXJyYXkgdHlwZXMKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGg7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICBtRGVmYXVsdEFycmF5VmFsdWVzOworICAgIGludCAgICAgICAgICAgICAgICAgbUN1cnJlbnRBcnJheUxlbmd0aDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIG1DdXJyZW50QXJyYXlWYWx1ZXM7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0Zvcm1Ob25lID0gMCwKKyAgICAgICAga0Zvcm1SYW5nZSA9IDEsCisgICAgICAgIGtGb3JtRW51bSA9IDIsCisgICAgfTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUdyb3VwQ29kZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgIG1Gb3JtRmxhZzsKKworICAgIC8vIGZvciByYW5nZSBmb3JtCisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtTWluaW11bVZhbHVlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbU1heGltdW1WYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1TdGVwU2l6ZTsKKworICAgIC8vIGZvciBlbnVtIGZvcm0KKyAgICBpbnQgICAgICAgICAgICAgICAgIG1FbnVtTGVuZ3RoOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgbUVudW1WYWx1ZXM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlYWJsZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUgPSAwKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBQcm9wZXJ0eSgpOworCisgICAgaW5saW5lIE10cFByb3BlcnR5Q29kZSBnZXRQcm9wZXJ0eUNvZGUoKSBjb25zdCB7IHJldHVybiBtQ29kZTsgfQorCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICB3cml0ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXREZWZhdWx0VmFsdWUoY29uc3QgdWludDE2X3QqIHN0cmluZyk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDdXJyZW50VmFsdWUoY29uc3QgdWludDE2X3QqIHN0cmluZyk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KCk7CisKKyAgICBpbmxpbmUgYm9vbCAgICAgICAgIGlzRGV2aWNlUHJvcGVydHkoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICggICAoKG1Db2RlICYgMHhGMDAwKSA9PSAweDUwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKG1Db2RlICYgMHhGODAwKSA9PSAweEQwMDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWRWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlJiB2YWx1ZSk7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICByZWFkQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBpbnQmIGxlbmd0aCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICB3cml0ZUFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHlWYWx1ZSogdmFsdWVzLCBpbnQgbGVuZ3RoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1BST1BFUlRZX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNlNTgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFJlcXVlc3RQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJNdHBSZXF1ZXN0UGFja2V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwUmVxdWVzdFBhY2tldDo6TXRwUmVxdWVzdFBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpCit7Cit9CisKK010cFJlcXVlc3RQYWNrZXQ6On5NdHBSZXF1ZXN0UGFja2V0KCkgeworfQorCisjaWZkZWYgTVRQX0RFVklDRQoraW50IE10cFJlcXVlc3RQYWNrZXQ6OnJlYWQoaW50IGZkKSB7CisgICAgaW50IHJldCA9IDo6cmVhZChmZCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyB3cml0ZSBvdXIgYnVmZmVyIHRvIHRoZSBnaXZlbiBlbmRwb2ludCAoaG9zdCBtb2RlKQoraW50IE10cFJlcXVlc3RQYWNrZXQ6OndyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKQoreworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0NPTU1BTkQpOworICAgIHJldHVybiB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgbVBhY2tldFNpemUpOworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5oIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjUxOGYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1JFUVVFU1RfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9SRVFVRVNUX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBSZXF1ZXN0UGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFJlcXVlc3RQYWNrZXQoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBSZXF1ZXN0UGFja2V0KCk7CisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gZmlsbCBvdXIgYnVmZmVyIHdpdGggZGF0YSBmcm9tIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoaW50IGZkKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyB3cml0ZSBvdXIgYnVmZmVyIHRvIHRoZSBnaXZlbiBlbmRwb2ludAorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworI2VuZGlmCisKKyAgICBpbmxpbmUgTXRwT3BlcmF0aW9uQ29kZSAgICBnZXRPcGVyYXRpb25Db2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0Q29udGFpbmVyQ29kZSgpOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICAgICAgICAgc2V0T3BlcmF0aW9uQ29kZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc2V0Q29udGFpbmVyQ29kZShjb2RlKTsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUkVRVUVTVF9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmNzE0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUmVzcG9uc2VQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFJlc3BvbnNlUGFja2V0OjpNdHBSZXNwb25zZVBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpCit7Cit9CisKK010cFJlc3BvbnNlUGFja2V0Ojp+TXRwUmVzcG9uc2VQYWNrZXQoKSB7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFCitpbnQgTXRwUmVzcG9uc2VQYWNrZXQ6OndyaXRlKGludCBmZCkgeworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX1JFU1BPTlNFKTsKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgbVBhY2tldFNpemUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAoraW50IE10cFJlc3BvbnNlUGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaCBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3M2Y4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1JFU1BPTlNFX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUkVTUE9OU0VfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFJlc3BvbnNlUGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFJlc3BvbnNlUGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUmVzcG9uc2VQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBSZXNwb25zZUNvZGUgICAgICBnZXRSZXNwb25zZUNvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VDb2RlKE10cFJlc3BvbnNlQ29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzZXRDb250YWluZXJDb2RlKGNvZGUpOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9SRVNQT05TRV9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGEzZTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTAsMCArMSw3OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2RlZmluZSBMT0dfVEFHICJNdHBTZXJ2ZXIiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKKyNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgTXRwT3BlcmF0aW9uQ29kZSBrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXNbXSA9IHsKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiwKKyAgICBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04sCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMsCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CLAorICAgIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCwKKyAgICBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fRk9STUFUX1NUT1JFLAorLy8gICAgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0UsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9URUNUSU9OLAorLy8gICAgTVRQX09QRVJBVElPTl9QT1dFUl9ET1dOLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MsCisgICAgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fVEVSTUlOQVRFX09QRU5fQ0FQVFVSRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fTU9WRV9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9HRVRfUEFSVElBTF9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVELAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0MsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVMsCisgICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVMsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NLSVAsCit9OworCitzdGF0aWMgY29uc3QgTXRwRXZlbnRDb2RlIGtTdXBwb3J0ZWRFdmVudENvZGVzW10gPSB7CisgICAgTVRQX0VWRU5UX09CSkVDVF9BRERFRCwKKyAgICBNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsCit9OworCitNdHBTZXJ2ZXI6Ok10cFNlcnZlcihpbnQgZmQsIE10cERhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVHcm91cCwgaW50IGZpbGVQZXJtLCBpbnQgZGlyZWN0b3J5UGVybSkKKyAgICA6ICAgbUZEKGZkKSwKKyAgICAgICAgbURhdGFiYXNlKGRhdGFiYXNlKSwKKyAgICAgICAgbUZpbGVHcm91cChmaWxlR3JvdXApLAorICAgICAgICBtRmlsZVBlcm1pc3Npb24oZmlsZVBlcm0pLAorICAgICAgICBtRGlyZWN0b3J5UGVybWlzc2lvbihkaXJlY3RvcnlQZXJtKSwKKyAgICAgICAgbVNlc3Npb25JRCgwKSwKKyAgICAgICAgbVNlc3Npb25PcGVuKGZhbHNlKSwKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUoa0ludmFsaWRPYmplY3RIYW5kbGUpLAorICAgICAgICBtU2VuZE9iamVjdEZvcm1hdCgwKSwKKyAgICAgICAgbVNlbmRPYmplY3RGaWxlU2l6ZSgwKQoreworfQorCitNdHBTZXJ2ZXI6On5NdHBTZXJ2ZXIoKSB7Cit9CisKK3ZvaWQgTXRwU2VydmVyOjphZGRTdG9yYWdlKGNvbnN0IGNoYXIqIGZpbGVQYXRoKSB7CisgICAgaW50IGluZGV4ID0gbVN0b3JhZ2VzLnNpemUoKSArIDE7CisgICAgaW5kZXggfD0gaW5kZXggPDwgMTY7ICAgLy8gc2V0IGhpZ2ggYW5kIGxvdyBwYXJ0IHRvIG91ciBpbmRleAorICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBuZXcgTXRwU3RvcmFnZShpbmRleCwgZmlsZVBhdGgsIG1EYXRhYmFzZSk7CisgICAgYWRkU3RvcmFnZShzdG9yYWdlKTsKK30KKworTXRwU3RvcmFnZSogTXRwU2VydmVyOjpnZXRTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVN0b3JhZ2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSAgbVN0b3JhZ2VzW2ldOworICAgICAgICBpZiAoc3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCkgPT0gaWQpCisgICAgICAgICAgICByZXR1cm4gc3RvcmFnZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTXRwU2VydmVyOjpydW4oKSB7CisgICAgaW50IGZkID0gbUZEOworCisgICAgTE9HVigiTXRwU2VydmVyOjpydW4gZmQ6ICVkXG4iLCBmZCk7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpbnQgcmV0ID0gbVJlcXVlc3QucmVhZChmZCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJyZXF1ZXN0IHJlYWQgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbiA9IG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKTsKKyAgICAgICAgTXRwVHJhbnNhY3Rpb25JRCB0cmFuc2FjdGlvbiA9IG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKTsKKworICAgICAgICBMT0dWKCJvcGVyYXRpb246ICVzIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbikpOworICAgICAgICBtUmVxdWVzdC5kdW1wKCk7CisKKyAgICAgICAgLy8gRklYTUUgbmVlZCB0byBnZW5lcmFsaXplIHRoaXMKKyAgICAgICAgYm9vbCBkYXRhSW4gPSAob3BlcmF0aW9uID09IE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTworICAgICAgICAgICAgICAgICAgICB8fCBvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVMKKyAgICAgICAgICAgICAgICAgICAgfHwgb3BlcmF0aW9uID09IE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9QX1ZBTFVFCisgICAgICAgICAgICAgICAgICAgIHx8IG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSk7CisgICAgICAgIGlmIChkYXRhSW4pIHsKKyAgICAgICAgICAgIGludCByZXQgPSBtRGF0YS5yZWFkKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZGF0YSByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR1YoInJlY2VpdmVkIGRhdGE6Iik7CisgICAgICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRGF0YS5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhbmRsZVJlcXVlc3QoKSkgeworICAgICAgICAgICAgaWYgKCFkYXRhSW4gJiYgbURhdGEuaGFzRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOworICAgICAgICAgICAgICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgICAgIExPR1YoInNlbmRpbmcgZGF0YToiKTsKKyAgICAgICAgICAgICAgICByZXQgPSBtRGF0YS53cml0ZShmZCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgicmVxdWVzdCB3cml0ZSByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SZXNwb25zZS5zZXRUcmFuc2FjdGlvbklEKHRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgIExPR1YoInNlbmRpbmcgcmVzcG9uc2UgJTA0WCIsIG1SZXNwb25zZS5nZXRSZXNwb25zZUNvZGUoKSk7CisgICAgICAgICAgICByZXQgPSBtUmVzcG9uc2Uud3JpdGUoZmQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJyZXF1ZXN0IHdyaXRlIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1YoInNraXBwaW5nIHJlc3BvbnNlXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU2Vzc2lvbk9wZW4pCisgICAgICAgIG1EYXRhYmFzZS0+c2Vzc2lvbkVuZGVkKCk7Cit9CisKK3ZvaWQgTXRwU2VydmVyOjpzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKKyAgICAgICAgTE9HRCgic2VuZE9iamVjdEFkZGVkICVkXG4iLCBoYW5kbGUpOworICAgICAgICBtRXZlbnQuc2V0RXZlbnRDb2RlKE1UUF9FVkVOVF9PQkpFQ1RfQURERUQpOworICAgICAgICBtRXZlbnQuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOworICAgICAgICBtRXZlbnQuc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgICAgIGludCByZXQgPSBtRXZlbnQud3JpdGUobUZEKTsKKyAgICAgICAgTE9HRCgibUV2ZW50LndyaXRlIHJldHVybmVkICVkXG4iLCByZXQpOworICAgIH0KK30KKwordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBpZiAobVNlc3Npb25PcGVuKSB7CisgICAgICAgIExPR0QoInNlbmRPYmplY3RSZW1vdmVkICVkXG4iLCBoYW5kbGUpOworICAgICAgICBtRXZlbnQuc2V0RXZlbnRDb2RlKE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCk7CisgICAgICAgIG1FdmVudC5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgICAgIG1FdmVudC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICAgICAgaW50IHJldCA9IG1FdmVudC53cml0ZShtRkQpOworICAgICAgICBMT0dEKCJtRXZlbnQud3JpdGUgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisgICAgfQorfQorCitib29sIE10cFNlcnZlcjo6aGFuZGxlUmVxdWVzdCgpIHsKKyAgICBNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbiA9IG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzcG9uc2U7CisKKyAgICBtUmVzcG9uc2UucmVzZXQoKTsKKworICAgIGlmIChtU2VuZE9iamVjdEhhbmRsZSAhPSBrSW52YWxpZE9iamVjdEhhbmRsZSAmJiBvcGVyYXRpb24gIT0gTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCkgeworICAgICAgICAvLyBGSVhNRSAtIG5lZWQgdG8gZGVsZXRlIG1TZW5kT2JqZWN0SGFuZGxlIGZyb20gdGhlIGRhdGFiYXNlCisgICAgICAgIExPR0UoImV4cGVjdGVkIFNlbmRPYmplY3QgYWZ0ZXIgU2VuZE9iamVjdEluZm8iKTsKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wZXJhdGlvbikgeworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldERldmljZUluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb09wZW5TZXNzaW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT046CisgICAgICAgICAgICByZXNwb25zZSA9IGRvQ2xvc2VTZXNzaW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRTdG9yYWdlSURzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldFN0b3JhZ2VJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdFByb3BzU3VwcG9ydGVkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RIYW5kbGVzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXROdW1PYmplY3RzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RSZWZlcmVuY2VzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZXRPYmplY3RSZWZlcmVuY2VzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9QX1ZBTFVFOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1NldE9iamVjdFByb3BWYWx1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZXREZXZpY2VQcm9wVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvUmVzZXREZXZpY2VQcm9wVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdEluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZW5kT2JqZWN0SW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvRGVsZXRlT2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdFByb3BEZXNjKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldERldmljZVByb3BEZXNjKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoImdvdCB1bnN1cHBvcnRlZCBjb21tYW5kICVzIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbikpOworICAgICAgICAgICAgcmVzcG9uc2UgPSBNVFBfUkVTUE9OU0VfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocmVzcG9uc2UgPT0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1SZXNwb25zZS5zZXRSZXNwb25zZUNvZGUocmVzcG9uc2UpOworICAgIHJldHVybiB0cnVlOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldERldmljZUluZm8oKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgc3RyaW5nOworICAgIGNoYXIgcHJvcF92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogcGxheWJhY2tGb3JtYXRzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKTsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBjYXB0dXJlRm9ybWF0cyA9IG1EYXRhYmFzZS0+Z2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKTsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIGRldmljZVByb3BlcnRpZXMgPSBtRGF0YWJhc2UtPmdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKTsKKworICAgIC8vIGZpbGwgaW4gZGV2aWNlIGluZm8KKyAgICBtRGF0YS5wdXRVSW50MTYoTVRQX1NUQU5EQVJEX1ZFUlNJT04pOworICAgIG1EYXRhLnB1dFVJbnQzMig2KTsgLy8gTVRQIFZlbmRvciBFeHRlbnNpb24gSUQKKyAgICBtRGF0YS5wdXRVSW50MTYoTVRQX1NUQU5EQVJEX1ZFUlNJT04pOworICAgIHN0cmluZy5zZXQoIm1pY3Jvc29mdC5jb206IDEuMDsiKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgLy8gTVRQIEV4dGVuc2lvbnMKKyAgICBtRGF0YS5wdXRVSW50MTYoMCk7IC8vRnVuY3Rpb25hbCBNb2RlCisgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMsCisgICAgICAgICAgICBzaXplb2Yoa1N1cHBvcnRlZE9wZXJhdGlvbkNvZGVzKSAvIHNpemVvZih1aW50MTZfdCkpOyAvLyBPcGVyYXRpb25zIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoa1N1cHBvcnRlZEV2ZW50Q29kZXMsCisgICAgICAgICAgICBzaXplb2Yoa1N1cHBvcnRlZEV2ZW50Q29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIEV2ZW50cyBTdXBwb3J0ZWQKKyAgICBtRGF0YS5wdXRBVUludDE2KGRldmljZVByb3BlcnRpZXMpOyAvLyBEZXZpY2UgUHJvcGVydGllcyBTdXBwb3J0ZWQKKyAgICBtRGF0YS5wdXRBVUludDE2KGNhcHR1cmVGb3JtYXRzKTsgLy8gQ2FwdHVyZSBGb3JtYXRzCisgICAgbURhdGEucHV0QVVJbnQxNihwbGF5YmFja0Zvcm1hdHMpOyAgLy8gUGxheWJhY2sgRm9ybWF0cworICAgIC8vIEZJWE1FCisgICAgc3RyaW5nLnNldCgiR29vZ2xlLCBJbmMuIik7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7ICAgLy8gTWFudWZhY3R1cmVyCisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLnByb2R1Y3QubW9kZWwiLCBwcm9wX3ZhbHVlLCAiTVRQIERldmljZSIpOworICAgIHN0cmluZy5zZXQocHJvcF92YWx1ZSk7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7ICAgLy8gTW9kZWwKKyAgICBzdHJpbmcuc2V0KCIxLjAiKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBEZXZpY2UgVmVyc2lvbgorCisgICAgcHJvcGVydHlfZ2V0KCJyby5zZXJpYWxubyIsIHByb3BfdmFsdWUsICI/Pz8/Pz8/PyIpOworICAgIHN0cmluZy5zZXQocHJvcF92YWx1ZSk7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7ICAgLy8gU2VyaWFsIE51bWJlcgorCisgICAgZGVsZXRlIHBsYXliYWNrRm9ybWF0czsKKyAgICBkZWxldGUgY2FwdHVyZUZvcm1hdHM7CisgICAgZGVsZXRlIGRldmljZVByb3BlcnRpZXM7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb09wZW5TZXNzaW9uKCkgeworICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBtU2Vzc2lvbklEKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTjsKKyAgICB9CisgICAgbVNlc3Npb25JRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBtU2Vzc2lvbk9wZW4gPSB0cnVlOworCisgICAgbURhdGFiYXNlLT5zZXNzaW9uU3RhcnRlZCgpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9DbG9zZVNlc3Npb24oKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBtU2Vzc2lvbklEID0gMDsKKyAgICBtU2Vzc2lvbk9wZW4gPSBmYWxzZTsKKyAgICBtRGF0YWJhc2UtPnNlc3Npb25FbmRlZCgpOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0U3RvcmFnZUlEcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworCisgICAgaW50IGNvdW50ID0gbVN0b3JhZ2VzLnNpemUoKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgbURhdGEucHV0VUludDMyKG1TdG9yYWdlc1tpXS0+Z2V0U3RvcmFnZUlEKCkpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRTdG9yYWdlSW5mbygpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICBzdHJpbmc7CisKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBpZCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gZ2V0U3RvcmFnZShpZCk7CisgICAgaWYgKCFzdG9yYWdlKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKKworICAgIG1EYXRhLnB1dFVJbnQxNihzdG9yYWdlLT5nZXRUeXBlKCkpOworICAgIG1EYXRhLnB1dFVJbnQxNihzdG9yYWdlLT5nZXRGaWxlU3lzdGVtVHlwZSgpKTsKKyAgICBtRGF0YS5wdXRVSW50MTYoc3RvcmFnZS0+Z2V0QWNjZXNzQ2FwYWJpbGl0eSgpKTsKKyAgICBtRGF0YS5wdXRVSW50NjQoc3RvcmFnZS0+Z2V0TWF4Q2FwYWNpdHkoKSk7CisgICAgbURhdGEucHV0VUludDY0KHN0b3JhZ2UtPmdldEZyZWVTcGFjZSgpKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoMTAyNCoxMDI0KjEwMjQpOyAvLyBGcmVlIFNwYWNlIGluIE9iamVjdHMKKyAgICBzdHJpbmcuc2V0KHN0b3JhZ2UtPmdldERlc2NyaXB0aW9uKCkpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOworICAgIG1EYXRhLnB1dEVtcHR5U3RyaW5nKCk7ICAgLy8gVm9sdW1lIElkZW50aWZpZXIKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogcHJvcGVydGllcyA9IG1EYXRhYmFzZS0+Z2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhmb3JtYXQpOworICAgIG1EYXRhLnB1dEFVSW50MTYocHJvcGVydGllcyk7CisgICAgZGVsZXRlIHByb3BlcnRpZXM7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RIYW5kbGVzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBhbGwgc3RvcmFnZQorICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7ICAgICAgLy8gMCBmb3IgYWxsIGZvcm1hdHMKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDMpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIG9iamVjdHMgd2l0aCBubyBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MDAwMDAwMDAgZm9yIGFsbCBvYmplY3RzPworICAgIGlmIChwYXJlbnQgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgcGFyZW50ID0gMDsKKworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBtRGF0YWJhc2UtPmdldE9iamVjdExpc3Qoc3RvcmFnZUlELCBmb3JtYXQsIHBhcmVudCk7CisgICAgbURhdGEucHV0QVVJbnQzMihoYW5kbGVzKTsKKyAgICBkZWxldGUgaGFuZGxlczsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE51bU9iamVjdHMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIGFsbCBzdG9yYWdlCisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisgICAgaWYgKHBhcmVudCA9PSAweEZGRkZGRkZGKQorICAgICAgICBwYXJlbnQgPSAwOworCisgICAgaW50IGNvdW50ID0gbURhdGFiYXNlLT5nZXROdW1PYmplY3RzKHN0b3JhZ2VJRCwgZm9ybWF0LCBwYXJlbnQpOworICAgIGlmIChjb3VudCA+PSAwKSB7CisgICAgICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgY291bnQpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgMCk7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RSZWZlcmVuY2VzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKworICAgIC8vIEZJWE1FIC0gY2hlY2sgZm9yIGludmFsaWQgb2JqZWN0IGhhbmRsZQorICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBtRGF0YWJhc2UtPmdldE9iamVjdFJlZmVyZW5jZXMoaGFuZGxlKTsKKyAgICBpZiAoaGFuZGxlcykgeworICAgICAgICBtRGF0YS5wdXRBVUludDMyKGhhbmRsZXMpOworICAgICAgICBkZWxldGUgaGFuZGxlczsKKyAgICB9IGVsc2UgeworICAgICAgICBtRGF0YS5wdXRFbXB0eUFycmF5KCk7CisgICAgfQorICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2V0T2JqZWN0UmVmZXJlbmNlcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogcmVmZXJlbmNlcyA9IG1EYXRhLmdldEFVSW50MzIoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gbURhdGFiYXNlLT5zZXRPYmplY3RSZWZlcmVuY2VzKGhhbmRsZSwgcmVmZXJlbmNlcyk7CisgICAgZGVsZXRlIHJlZmVyZW5jZXM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wVmFsdWUoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBMT0dEKCJHZXRPYmplY3RQcm9wVmFsdWUgJWQgJXNcbiIsIGhhbmRsZSwKKyAgICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5VmFsdWUoaGFuZGxlLCBwcm9wZXJ0eSwgbURhdGEpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NldE9iamVjdFByb3BWYWx1ZSgpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIExPR0QoIlNldE9iamVjdFByb3BWYWx1ZSAlZCAlc1xuIiwgaGFuZGxlLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+c2V0T2JqZWN0UHJvcGVydHlWYWx1ZShoYW5kbGUsIHByb3BlcnR5LCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0RGV2aWNlUHJvcFZhbHVlKCkgeworICAgIE10cERldmljZVByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIExPR0QoIkdldERldmljZVByb3BWYWx1ZSAlc1xuIiwKKyAgICAgICAgICAgIE10cERlYnVnOjpnZXREZXZpY2VQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldERldmljZVByb3BlcnR5VmFsdWUocHJvcGVydHksIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZXREZXZpY2VQcm9wVmFsdWUoKSB7CisgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTE9HRCgiU2V0RGV2aWNlUHJvcFZhbHVlICVzXG4iLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+c2V0RGV2aWNlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eSwgbURhdGEpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1Jlc2V0RGV2aWNlUHJvcFZhbHVlKCkgeworICAgIE10cERldmljZVByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIExPR0QoIlJlc2V0RGV2aWNlUHJvcFZhbHVlICVzXG4iLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+cmVzZXREZXZpY2VQcm9wZXJ0eShwcm9wZXJ0eSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0SW5mbygpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdEluZm8oaGFuZGxlLCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0KCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RyaW5nIHBhdGhCdWY7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgcGF0aEJ1ZiwgZmlsZUxlbmd0aCk7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBjb25zdCBjaGFyKiBmaWxlUGF0aCA9IChjb25zdCBjaGFyICopcGF0aEJ1ZjsKKyAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOworICAgIG1mci5mZCA9IG9wZW4oZmlsZVBhdGgsIE9fUkRPTkxZKTsKKyAgICBpZiAobWZyLmZkIDwgMCkgeworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBmaWxlTGVuZ3RoOworCisgICAgLy8gc2VuZCBkYXRhIGhlYWRlcgorICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUobVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpKTsKKyAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgbURhdGEud3JpdGVEYXRhSGVhZGVyKG1GRCwgZmlsZUxlbmd0aCk7CisKKyAgICAvLyB0aGVuIHRyYW5zZmVyIHRoZSBmaWxlCisgICAgaW50IHJldCA9IGlvY3RsKG1GRCwgTVRQX1NFTkRfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgY2xvc2UobWZyLmZkKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0SW5mbygpIHsKKyAgICBNdHBTdHJpbmcgcGF0aDsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHN0b3JhZ2VJRCk7CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworCisgICAgLy8gc3BlY2lhbCBjYXNlIHRoZSByb290CisgICAgaWYgKHBhcmVudCA9PSBNVFBfUEFSRU5UX1JPT1QpIHsKKyAgICAgICAgcGF0aCA9IHN0b3JhZ2UtPmdldFBhdGgoKTsKKyAgICAgICAgcGFyZW50ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IGR1bW15OworICAgICAgICBpbnQgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChwYXJlbnQsIHBhdGgsIGR1bW15KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIHJlYWQgb25seSB0aGUgZmllbGRzIHdlIG5lZWQKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHN0b3JhZ2UgSUQKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbURhdGEuZ2V0VUludDE2KCk7CisgICAgbURhdGEuZ2V0VUludDE2KCk7ICAvLyBwcm90ZWN0aW9uIHN0YXR1cworICAgIG1TZW5kT2JqZWN0RmlsZVNpemUgPSBtRGF0YS5nZXRVSW50MzIoKTsKKyAgICBtRGF0YS5nZXRVSW50MTYoKTsgIC8vIHRodW1iIGZvcm1hdAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gdGh1bWIgY29tcHJlc3NlZCBzaXplCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyB0aHVtYiBwaXggd2lkdGgKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHRodW1iIHBpeCBoZWlnaHQKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIGltYWdlIHBpeCB3aWR0aAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gaW1hZ2UgcGl4IGhlaWdodAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gaW1hZ2UgYml0IGRlcHRoCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBwYXJlbnQKKyAgICB1aW50MTZfdCBhc3NvY2lhdGlvblR5cGUgPSBtRGF0YS5nZXRVSW50MTYoKTsKKyAgICB1aW50MzJfdCBhc3NvY2lhdGlvbkRlc2MgPSBtRGF0YS5nZXRVSW50MzIoKTsgICAvLyBhc3NvY2lhdGlvbiBkZXNjCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBzZXF1ZW5jZSBudW1iZXIKKyAgICBNdHBTdHJpbmdCdWZmZXIgbmFtZSwgY3JlYXRlZCwgbW9kaWZpZWQ7CisgICAgbURhdGEuZ2V0U3RyaW5nKG5hbWUpOyAgICAvLyBmaWxlIG5hbWUKKyAgICBtRGF0YS5nZXRTdHJpbmcoY3JlYXRlZCk7ICAgICAgLy8gZGF0ZSBjcmVhdGVkCisgICAgbURhdGEuZ2V0U3RyaW5nKG1vZGlmaWVkKTsgICAgIC8vIGRhdGUgbW9kaWZpZWQKKyAgICAvLyBrZXl3b3JkcyBmb2xsb3cKKworICAgIHRpbWVfdCBtb2RpZmllZFRpbWU7CisgICAgaWYgKCFwYXJzZURhdGVUaW1lKG1vZGlmaWVkLCBtb2RpZmllZFRpbWUpKQorICAgICAgICBtb2RpZmllZFRpbWUgPSAwOworCisgICAgaWYgKHBhdGhbcGF0aC5zaXplKCkgLSAxXSAhPSAnLycpCisgICAgICAgIHBhdGggKz0gIi8iOworICAgIHBhdGggKz0gKGNvbnN0IGNoYXIgKiluYW1lOworCisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YmVnaW5TZW5kT2JqZWN0KChjb25zdCBjaGFyKilwYXRoLAorICAgICAgICAgICAgZm9ybWF0LCBwYXJlbnQsIHN0b3JhZ2VJRCwgbVNlbmRPYmplY3RGaWxlU2l6ZSwgbW9kaWZpZWRUaW1lKTsKKyAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisKKyAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIG1vZGVfdCBtYXNrID0gdW1hc2soMCk7CisgICAgICAgIGludCByZXQgPSBta2RpcigoY29uc3QgY2hhciAqKXBhdGgsIG1EaXJlY3RvcnlQZXJtaXNzaW9uKTsKKyAgICAgICAgdW1hc2sobWFzayk7CisgICAgICAgIGlmIChyZXQgJiYgcmV0ICE9IC1FRVhJU1QpCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIGNob3duKChjb25zdCBjaGFyICopcGF0aCwgZ2V0dWlkKCksIG1GaWxlR3JvdXApOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZW5kT2JqZWN0RmlsZVBhdGggPSBwYXRoOworICAgICAgICAvLyBzYXZlIHRoZSBoYW5kbGUgZm9yIHRoZSBTZW5kT2JqZWN0IGNhbGwsIHdoaWNoIHNob3VsZCBmb2xsb3cKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBoYW5kbGU7CisgICAgICAgIG1TZW5kT2JqZWN0Rm9ybWF0ID0gZm9ybWF0OworICAgIH0KKworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDIsIHBhcmVudCk7CisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigzLCBoYW5kbGUpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0KCkgeworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgbW9kZV90IG1hc2s7CisgICAgaW50IHJldDsKKworICAgIGlmIChtU2VuZE9iamVjdEhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICBMT0dFKCJFeHBlY3RlZCBTZW5kT2JqZWN0SW5mbyBiZWZvcmUgU2VuZE9iamVjdCIpOworICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfTk9fVkFMSURfT0JKRUNUX0lORk87CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICAvLyByZWFkIHRoZSBoZWFkZXIKKyAgICByZXQgPSBtRGF0YS5yZWFkRGF0YUhlYWRlcihtRkQpOworICAgIC8vIEZJWE1FIC0gY2hlY2sgZm9yIGVycm9ycyBoZXJlLgorCisgICAgLy8gcmVzZXQgc28gd2UgZG9uJ3QgYXR0ZW1wdCB0byBzZW5kIHRoaXMgYmFjaworICAgIG1EYXRhLnJlc2V0KCk7CisKKyAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOworICAgIG1mci5mZCA9IG9wZW4obVNlbmRPYmplY3RGaWxlUGF0aCwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMpOworICAgIGlmIChtZnIuZmQgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGZjaG93bihtZnIuZmQsIGdldHVpZCgpLCBtRmlsZUdyb3VwKTsKKyAgICAvLyBzZXQgcGVybWlzc2lvbnMKKyAgICBtYXNrID0gdW1hc2soMCk7CisgICAgZmNobW9kKG1mci5mZCwgbUZpbGVQZXJtaXNzaW9uKTsKKyAgICB1bWFzayhtYXNrKTsKKworICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplOworCisgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgIGNsb3NlKG1mci5mZCk7CisKKyAgICBMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkIiwgcmV0KTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHVubGluayhtU2VuZE9iamVjdEZpbGVQYXRoKTsKKyAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworZG9uZToKKyAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QobVNlbmRPYmplY3RGaWxlUGF0aCwgbVNlbmRPYmplY3RIYW5kbGUsIG1TZW5kT2JqZWN0Rm9ybWF0LAorICAgICAgICAgICAgcmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSyk7CisgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICBtU2VuZE9iamVjdEZvcm1hdCA9IDA7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZGVsZXRlUmVjdXJzaXZlKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBjaGFyIHBhdGhidWZbUEFUSF9NQVhdOworICAgIGludCBwYXRoTGVuZ3RoID0gc3RybGVuKHBhdGgpOworICAgIGlmIChwYXRoTGVuZ3RoID49IHNpemVvZihwYXRoYnVmKSAtIDEpIHsKKyAgICAgICAgTE9HRSgicGF0aCB0b28gbG9uZzogJXNcbiIsIHBhdGgpOworICAgIH0KKyAgICBzdHJjcHkocGF0aGJ1ZiwgcGF0aCk7CisgICAgaWYgKHBhdGhidWZbcGF0aExlbmd0aCAtIDFdICE9ICcvJykgeworICAgICAgICBwYXRoYnVmW3BhdGhMZW5ndGgrK10gPSAnLyc7CisgICAgfQorICAgIGNoYXIqIGZpbGVTcG90ID0gcGF0aGJ1ZiArIHBhdGhMZW5ndGg7CisgICAgaW50IHBhdGhSZW1haW5pbmcgPSBzaXplb2YocGF0aGJ1ZikgLSBwYXRoTGVuZ3RoIC0gMTsKKworICAgIERJUiogZGlyID0gb3BlbmRpcihwYXRoKTsKKyAgICBpZiAoIWRpcikgeworICAgICAgICBMT0dFKCJvcGVuZGlyICVzIGZhaWxlZDogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IGRpcmVudCogZW50cnk7CisgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkpIHsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudHJ5LT5kX25hbWU7CisKKyAgICAgICAgLy8gaWdub3JlICIuIiBhbmQgIi4uIgorICAgICAgICBpZiAobmFtZVswXSA9PSAnLicgJiYgKG5hbWVbMV0gPT0gMCB8fCAobmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAwKSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50IG5hbWVMZW5ndGggPSBzdHJsZW4obmFtZSk7CisgICAgICAgIGlmIChuYW1lTGVuZ3RoID4gcGF0aFJlbWFpbmluZykgeworICAgICAgICAgICAgTE9HRSgicGF0aCAlcy8lcyB0b28gbG9uZ1xuIiwgcGF0aCwgbmFtZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkoZmlsZVNwb3QsIG5hbWUpOworCisgICAgICAgIGludCB0eXBlID0gZW50cnktPmRfdHlwZTsKKyAgICAgICAgaWYgKGVudHJ5LT5kX3R5cGUgPT0gRFRfRElSKSB7CisgICAgICAgICAgICBkZWxldGVSZWN1cnNpdmUocGF0aGJ1Zik7CisgICAgICAgICAgICBybWRpcihwYXRoYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVubGluayhwYXRoYnVmKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVsZXRlUGF0aChjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICBpZiAoc3RhdChwYXRoLCAmc3RhdGJ1ZikgPT0gMCkgeworICAgICAgICBpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7CisgICAgICAgICAgICBkZWxldGVSZWN1cnNpdmUocGF0aCk7CisgICAgICAgICAgICBybWRpcihwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVubGluayhwYXRoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoImRlbGV0ZVBhdGggc3RhdCBmYWlsZWQgZm9yICVzOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0RlbGV0ZU9iamVjdCgpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7CisgICAgLy8gRklYTUUgLSBzdXBwb3J0IGRlbGV0aW5nIGFsbCBvYmplY3RzIGlmIGhhbmRsZSBpcyAweEZGRkZGRkZGCisgICAgLy8gRklYTUUgLSBpbXBsZW1lbnQgZGVsZXRpbmcgb2JqZWN0cyBieSBmb3JtYXQKKworICAgIE10cFN0cmluZyBmaWxlUGF0aDsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBmaWxlUGF0aCwgZmlsZUxlbmd0aCk7CisgICAgaWYgKHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTE9HVigiZGVsZXRpbmcgJXMiLCAoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKKyAgICAgICAgZGVsZXRlUGF0aCgoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKKyAgICAgICAgcmV0dXJuIG1EYXRhYmFzZS0+ZGVsZXRlRmlsZShoYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdFByb3BEZXNjKCkgeworICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BDb2RlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7CisgICAgTE9HRCgiR2V0T2JqZWN0UHJvcERlc2MgJXMgJXNcbiIsIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcENvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShmb3JtYXQpKTsKKyAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5RGVzYyhwcm9wQ29kZSwgZm9ybWF0KTsKKyAgICBpZiAoIXByb3BlcnR5KQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQ7CisgICAgcHJvcGVydHktPndyaXRlKG1EYXRhKTsKKyAgICBkZWxldGUgcHJvcGVydHk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXREZXZpY2VQcm9wRGVzYygpIHsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wQ29kZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBMT0dEKCJHZXREZXZpY2VQcm9wRGVzYyAlc1xuIiwgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wQ29kZSkpOworICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG1EYXRhYmFzZS0+Z2V0RGV2aWNlUHJvcGVydHlEZXNjKHByb3BDb2RlKTsKKyAgICBpZiAoIXByb3BlcnR5KQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0RFVklDRV9QUk9QX05PVF9TVVBQT1JURUQ7CisgICAgcHJvcGVydHktPndyaXRlKG1EYXRhKTsKKyAgICBkZWxldGUgcHJvcGVydHk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGE2NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1NFUlZFUl9ICisjZGVmaW5lIF9NVFBfU0VSVkVSX0gKKworI2luY2x1ZGUgIk10cFJlcXVlc3RQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUmVzcG9uc2VQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBFdmVudFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhYmFzZTsKK2NsYXNzIE10cFN0b3JhZ2U7CisKK2NsYXNzIE10cFNlcnZlciB7CisKK3ByaXZhdGU6CisgICAgLy8gZmlsZSBkZXNjcmlwdG9yIGZvciBNVFAga2VybmVsIGRyaXZlcgorICAgIGludCAgICAgICAgICAgICAgICAgbUZEOworCisgICAgTXRwRGF0YWJhc2UqICAgICAgICBtRGF0YWJhc2U7CisKKyAgICAvLyBncm91cCB0byBvd24gbmV3IGZpbGVzIGFuZCBmb2xkZXJzCisgICAgaW50ICAgICAgICAgICAgICAgICBtRmlsZUdyb3VwOworICAgIC8vIHBlcm1pc3Npb25zIGZvciBuZXcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisgICAgaW50ICAgICAgICAgICAgICAgICBtRmlsZVBlcm1pc3Npb247CisgICAgaW50ICAgICAgICAgICAgICAgICBtRGlyZWN0b3J5UGVybWlzc2lvbjsKKworICAgIC8vIGN1cnJlbnQgc2Vzc2lvbiBJRAorICAgIE10cFNlc3Npb25JRCAgICAgICAgbVNlc3Npb25JRDsKKyAgICAvLyB0cnVlIGlmIHdlIGhhdmUgYW4gb3BlbiBzZXNzaW9uIGFuZCBtU2Vzc2lvbklEIGlzIHZhbGlkCisgICAgYm9vbCAgICAgICAgICAgICAgICBtU2Vzc2lvbk9wZW47CisKKyAgICBNdHBSZXF1ZXN0UGFja2V0ICAgIG1SZXF1ZXN0OworICAgIE10cERhdGFQYWNrZXQgICAgICAgbURhdGE7CisgICAgTXRwUmVzcG9uc2VQYWNrZXQgICBtUmVzcG9uc2U7CisgICAgTXRwRXZlbnRQYWNrZXQgICAgICBtRXZlbnQ7CisKKyAgICBNdHBTdG9yYWdlTGlzdCAgICAgIG1TdG9yYWdlczsKKworICAgIC8vIGhhbmRsZSBmb3IgbmV3IG9iamVjdCwgc2V0IGJ5IFNlbmRPYmplY3RJbmZvIGFuZCB1c2VkIGJ5IFNlbmRPYmplY3QKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1TZW5kT2JqZWN0SGFuZGxlOworICAgIE10cE9iamVjdEZvcm1hdCAgICAgbVNlbmRPYmplY3RGb3JtYXQ7CisgICAgTXRwU3RyaW5nICAgICAgICAgICBtU2VuZE9iamVjdEZpbGVQYXRoOworICAgIHNpemVfdCAgICAgICAgICAgICAgbVNlbmRPYmplY3RGaWxlU2l6ZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU2VydmVyKGludCBmZCwgTXRwRGF0YWJhc2UqIGRhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVHcm91cCwgaW50IGZpbGVQZXJtLCBpbnQgZGlyZWN0b3J5UGVybSk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwU2VydmVyKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGFkZFN0b3JhZ2UoY29uc3QgY2hhciogZmlsZVBhdGgpOworICAgIGlubGluZSB2b2lkICAgICAgICAgYWRkU3RvcmFnZShNdHBTdG9yYWdlKiBzdG9yYWdlKSB7IG1TdG9yYWdlcy5wdXNoKHN0b3JhZ2UpOyB9CisgICAgTXRwU3RvcmFnZSogICAgICAgICBnZXRTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBydW4oKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisKK3ByaXZhdGU6CisgICAgYm9vbCAgICAgICAgICAgICAgICBoYW5kbGVSZXF1ZXN0KCk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0RGV2aWNlSW5mbygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9PcGVuU2Vzc2lvbigpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9DbG9zZVNlc3Npb24oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0U3RvcmFnZUlEcygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRTdG9yYWdlSW5mbygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RIYW5kbGVzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE51bU9iamVjdHMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9TZXRPYmplY3RSZWZlcmVuY2VzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BWYWx1ZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9TZXRPYmplY3RQcm9wVmFsdWUoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NldERldmljZVByb3BWYWx1ZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9SZXNldERldmljZVByb3BWYWx1ZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdCgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9TZW5kT2JqZWN0SW5mbygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9TZW5kT2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0RlbGV0ZU9iamVjdCgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RQcm9wRGVzYygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXREZXZpY2VQcm9wRGVzYygpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfU0VSVkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcCBiL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2NmMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFN0b3JhZ2UiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFN0b3JhZ2U6Ok10cFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkLCBjb25zdCBjaGFyKiBmaWxlUGF0aCwgTXRwRGF0YWJhc2UqIGRiKQorICAgIDogICBtU3RvcmFnZUlEKGlkKSwKKyAgICAgICAgbUZpbGVQYXRoKGZpbGVQYXRoKSwKKyAgICAgICAgbURhdGFiYXNlKGRiKSwKKyAgICAgICAgbU1heENhcGFjaXR5KDApCit7CisgICAgTE9HRCgiTXRwU3RvcmFnZSBpZDogJWQgcGF0aDogJXNcbiIsIGlkLCBmaWxlUGF0aCk7Cit9CisKK010cFN0b3JhZ2U6On5NdHBTdG9yYWdlKCkgeworfQorCitpbnQgTXRwU3RvcmFnZTo6Z2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTVRQX1NUT1JBR0VfRklYRURfUkFNOworfQorCitpbnQgTXRwU3RvcmFnZTo6Z2V0RmlsZVN5c3RlbVR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fSElFUkFSQ0hJQ0FMOworfQorCitpbnQgTXRwU3RvcmFnZTo6Z2V0QWNjZXNzQ2FwYWJpbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTVRQX1NUT1JBR0VfUkVBRF9XUklURTsKK30KKwordWludDY0X3QgTXRwU3RvcmFnZTo6Z2V0TWF4Q2FwYWNpdHkoKSB7CisgICAgaWYgKG1NYXhDYXBhY2l0eSA9PSAwKSB7CisgICAgICAgIHN0cnVjdCBzdGF0ZnMgICBzdGF0OworICAgICAgICBpZiAoc3RhdGZzKG1GaWxlUGF0aCwgJnN0YXQpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBtTWF4Q2FwYWNpdHkgPSAodWludDY0X3Qpc3RhdC5mX2Jsb2NrcyAqICh1aW50NjRfdClzdGF0LmZfYnNpemU7CisgICAgfQorICAgIHJldHVybiBtTWF4Q2FwYWNpdHk7Cit9CisKK3VpbnQ2NF90IE10cFN0b3JhZ2U6OmdldEZyZWVTcGFjZSgpIHsKKyAgICBzdHJ1Y3Qgc3RhdGZzICAgc3RhdDsKKyAgICBpZiAoc3RhdGZzKG1GaWxlUGF0aCwgJnN0YXQpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuICh1aW50NjRfdClzdGF0LmZfYmF2YWlsICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKK30KKworY29uc3QgY2hhciogTXRwU3RvcmFnZTo6Z2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuICJEZXZpY2UgU3RvcmFnZSI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTNiOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1NUT1JBR0VfSAorI2RlZmluZSBfTVRQX1NUT1JBR0VfSAorCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YWJhc2U7CisKK2NsYXNzIE10cFN0b3JhZ2UgeworCitwcml2YXRlOgorICAgIE10cFN0b3JhZ2VJRCAgICAgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgbUZpbGVQYXRoOworICAgIE10cERhdGFiYXNlKiAgICAgICAgICAgIG1EYXRhYmFzZTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtTWF4Q2FwYWNpdHk7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCwgY29uc3QgY2hhciogZmlsZVBhdGgsIE10cERhdGFiYXNlKiBkYik7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk10cFN0b3JhZ2UoKTsKKworICAgIGlubGluZSBNdHBTdG9yYWdlSUQgICAgIGdldFN0b3JhZ2VJRCgpIGNvbnN0IHsgcmV0dXJuIG1TdG9yYWdlSUQ7IH0KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlKCkgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVN5c3RlbVR5cGUoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRBY2Nlc3NDYXBhYmlsaXR5KCkgY29uc3Q7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgZ2V0TWF4Q2FwYWNpdHkoKTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBnZXRGcmVlU3BhY2UoKTsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICBnZXREZXNjcmlwdGlvbigpIGNvbnN0OworICAgIGlubGluZSBjb25zdCBjaGFyKiAgICAgIGdldFBhdGgoKSBjb25zdCB7IHJldHVybiBtRmlsZVBhdGg7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NUT1JBR0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2NGFjMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZUluZm8iCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlSW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFN0b3JhZ2VJbmZvOjpNdHBTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgaWQpCisgICAgOiAgIG1TdG9yYWdlSUQoaWQpLAorICAgICAgICBtU3RvcmFnZVR5cGUoMCksCisgICAgICAgIG1GaWxlU3lzdGVtVHlwZSgwKSwKKyAgICAgICAgbUFjY2Vzc0NhcGFiaWxpdHkoMCksCisgICAgICAgIG1NYXhDYXBhY2l0eSgwKSwKKyAgICAgICAgbUZyZWVTcGFjZUJ5dGVzKDApLAorICAgICAgICBtRnJlZVNwYWNlT2JqZWN0cygwKSwKKyAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbihOVUxMKSwKKyAgICAgICAgbVZvbHVtZUlkZW50aWZpZXIoTlVMTCkKK3sKK30KKworTXRwU3RvcmFnZUluZm86On5NdHBTdG9yYWdlSW5mbygpIHsKKyAgICBpZiAobVN0b3JhZ2VEZXNjcmlwdGlvbikKKyAgICAgICAgZnJlZShtU3RvcmFnZURlc2NyaXB0aW9uKTsKKyAgICBpZiAobVZvbHVtZUlkZW50aWZpZXIpCisgICAgICAgIGZyZWUobVZvbHVtZUlkZW50aWZpZXIpOworfQorCit2b2lkIE10cFN0b3JhZ2VJbmZvOjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmc7CisKKyAgICAvLyByZWFkIHRoZSBkZXZpY2UgaW5mbworICAgIG1TdG9yYWdlVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtRmlsZVN5c3RlbVR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUFjY2Vzc0NhcGFiaWxpdHkgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbU1heENhcGFjaXR5ID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgIG1GcmVlU3BhY2VCeXRlcyA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICBtRnJlZVNwYWNlT2JqZWN0cyA9IHBhY2tldC5nZXRVSW50MzIoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtU3RvcmFnZURlc2NyaXB0aW9uID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVZvbHVtZUlkZW50aWZpZXIgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworfQorCit2b2lkIE10cFN0b3JhZ2VJbmZvOjpwcmludCgpIHsKKyAgICBMT0dEKCJTdG9yYWdlIEluZm8gJTA4WDpcblx0bVN0b3JhZ2VUeXBlOiAlZFxuXHRtRmlsZVN5c3RlbVR5cGU6ICVkXG5cdG1BY2Nlc3NDYXBhYmlsaXR5OiAlZFxuIiwKKyAgICAgICAgICAgIG1TdG9yYWdlSUQsIG1TdG9yYWdlVHlwZSwgbUZpbGVTeXN0ZW1UeXBlLCBtQWNjZXNzQ2FwYWJpbGl0eSk7CisgICAgTE9HRCgiXHRtTWF4Q2FwYWNpdHk6ICVsbGRcblx0bUZyZWVTcGFjZUJ5dGVzOiAlbGxkXG5cdG1GcmVlU3BhY2VPYmplY3RzOiAlZFxuIiwKKyAgICAgICAgICAgIG1NYXhDYXBhY2l0eSwgbUZyZWVTcGFjZUJ5dGVzLCBtRnJlZVNwYWNlT2JqZWN0cyk7CisgICAgTE9HRCgiXHRtU3RvcmFnZURlc2NyaXB0aW9uOiAlc1xuXHRtVm9sdW1lSWRlbnRpZmllcjogJXNcbiIsCisgICAgICAgICAgICBtU3RvcmFnZURlc2NyaXB0aW9uLCBtVm9sdW1lSWRlbnRpZmllcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uaCBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYjYyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1NUT1JBR0VfSU5GT19ICisjZGVmaW5lIF9NVFBfU1RPUkFHRV9JTkZPX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwU3RvcmFnZUluZm8geworcHVibGljOgorICAgIE10cFN0b3JhZ2VJRCAgICAgICAgbVN0b3JhZ2VJRDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1TdG9yYWdlVHlwZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1GaWxlU3lzdGVtVHlwZTsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1BY2Nlc3NDYXBhYmlsaXR5OworICAgIHVpbnQ2NF90ICAgICAgICAgICAgbU1heENhcGFjaXR5OworICAgIHVpbnQ2NF90ICAgICAgICAgICAgbUZyZWVTcGFjZUJ5dGVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZyZWVTcGFjZU9iamVjdHM7CisgICAgY2hhciogICAgICAgICAgICAgICBtU3RvcmFnZURlc2NyaXB0aW9uOworICAgIGNoYXIqICAgICAgICAgICAgICAgbVZvbHVtZUlkZW50aWZpZXI7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBpZCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwU3RvcmFnZUluZm8oKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwcmludCgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfU1RPUkFHRV9JTkZPX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuY3BwIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4Y2YwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBTdHJpbmdCdWZmZXIiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcigpCisgICAgOiAgIG1DaGFyQ291bnQoMCksCisgICAgICAgIG1CeXRlQ291bnQoMSkKK3sKKyAgICBtQnVmZmVyWzBdID0gMDsKK30KKworTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgY2hhciogc3JjKQorICAgIDogICBtQ2hhckNvdW50KDApLAorICAgICAgICBtQnl0ZUNvdW50KDEpCit7CisgICAgc2V0KHNyYyk7Cit9CisKK010cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKGNvbnN0IHVpbnQxNl90KiBzcmMpCisgICAgOiAgIG1DaGFyQ291bnQoMCksCisgICAgICAgIG1CeXRlQ291bnQoMSkKK3sKKyAgICBzZXQoc3JjKTsKK30KKworTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpCisgICAgOiAgIG1DaGFyQ291bnQoc3JjLm1DaGFyQ291bnQpLAorICAgICAgICBtQnl0ZUNvdW50KHNyYy5tQnl0ZUNvdW50KQoreworICAgIG1lbWNweShtQnVmZmVyLCBzcmMubUJ1ZmZlciwgbUJ5dGVDb3VudCk7Cit9CisKKworTXRwU3RyaW5nQnVmZmVyOjp+TXRwU3RyaW5nQnVmZmVyKCkgeworfQorCit2b2lkIE10cFN0cmluZ0J1ZmZlcjo6c2V0KGNvbnN0IGNoYXIqIHNyYykgeworICAgIGludCBsZW5ndGggPSBzdHJsZW4oc3JjKTsKKyAgICBpZiAobGVuZ3RoID49IHNpemVvZihtQnVmZmVyKSkKKyAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKG1CdWZmZXIpIC0gMTsKKyAgICBtZW1jcHkobUJ1ZmZlciwgc3JjLCBsZW5ndGgpOworCisgICAgLy8gY291bnQgdGhlIGNoYXJhY3RlcnMKKyAgICBpbnQgY291bnQgPSAwOworICAgIGNoYXIgY2g7CisgICAgd2hpbGUgKChjaCA9ICpzcmMrKykgIT0gMCkgeworICAgICAgICBpZiAoKGNoICYgMHg4MCkgPT0gMCkgeworICAgICAgICAgICAgLy8gc2luZ2xlIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhFMCkgPT0gMHhDMCkgeworICAgICAgICAgICAgLy8gdHdvIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoISAqc3JjKyspIHsKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCBieXRlCisgICAgICAgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhGMCkgPT0gMHhFMCkgeworICAgICAgICAgICAgLy8gMyBieXRlIGNoYXIKKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IGJ5dGUKKyAgICAgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IHR3byBieXRlcworICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvdW50Kys7CisgICAgfQorCisgICAgbUJ5dGVDb3VudCA9IGxlbmd0aCArIDE7CisgICAgbUJ1ZmZlcltsZW5ndGhdID0gMDsKKyAgICBtQ2hhckNvdW50ID0gY291bnQ7Cit9CisKK3ZvaWQgTXRwU3RyaW5nQnVmZmVyOjpzZXQoY29uc3QgdWludDE2X3QqIHNyYykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgdWludDE2X3QgY2g7CisgICAgdWludDhfdCogZGVzdCA9IG1CdWZmZXI7CisKKyAgICB3aGlsZSAoKGNoID0gKnNyYysrKSAhPSAwICYmIGNvdW50IDwgMjU1KSB7CisgICAgICAgIGlmIChjaCA+PSAweDA4MDApIHsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhFMCB8IChjaCA+PiAxMikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKChjaCA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8IChjaCAmIDB4M0YpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAweDgwKSB7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4QzAgfCAoY2ggPj4gNikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3QrKyA9IGNoOworICAgICAgICB9CisgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgICpkZXN0KysgPSAwOworICAgIG1DaGFyQ291bnQgPSBjb3VudDsKKyAgICBtQnl0ZUNvdW50ID0gZGVzdCAtIG1CdWZmZXI7Cit9CisKK3ZvaWQgTXRwU3RyaW5nQnVmZmVyOjpyZWFkRnJvbVBhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIHsKKyAgICBpbnQgY291bnQgPSBwYWNrZXQtPmdldFVJbnQ4KCk7CisgICAgdWludDhfdCogZGVzdCA9IG1CdWZmZXI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90IGNoID0gcGFja2V0LT5nZXRVSW50MTYoKTsKKyAgICAgICAgaWYgKGNoID49IDB4MDgwMCkgeworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweEUwIHwgKGNoID4+IDEyKSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOworICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4ODApIHsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhDMCB8IChjaCA+PiA2KSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoY2ggJiAweDNGKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdCsrID0gY2g7CisgICAgICAgIH0KKyAgICB9CisgICAgKmRlc3QrKyA9IDA7CisgICAgbUNoYXJDb3VudCA9IGNvdW50OworICAgIG1CeXRlQ291bnQgPSBkZXN0IC0gbUJ1ZmZlcjsKK30KKwordm9pZCBNdHBTdHJpbmdCdWZmZXI6OndyaXRlVG9QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KSBjb25zdCB7CisgICAgaW50IGNvdW50ID0gbUNoYXJDb3VudDsKKyAgICBjb25zdCB1aW50OF90KiBzcmMgPSBtQnVmZmVyOworICAgIHBhY2tldC0+cHV0VUludDgoY291bnQgPiAwID8gY291bnQgKyAxIDogMCk7CisKKyAgICAvLyBleHBhbmQgdXRmOCB0byAxNiBiaXQgY2hhcnMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDE2X3QgY2g7CisgICAgICAgIHVpbnQxNl90IGNoMSA9ICpzcmMrKzsKKyAgICAgICAgaWYgKChjaDEgJiAweDgwKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGNoID0gY2gxOworICAgICAgICB9IGVsc2UgaWYgKChjaDEgJiAweEUwKSA9PSAweEMwKSB7CisgICAgICAgICAgICAvLyB0d28gYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMiA9ICpzcmMrKzsKKyAgICAgICAgICAgIGNoID0gKChjaDEgJiAweDFGKSA8PCA2KSB8IChjaDIgJiAweDNGKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRocmVlIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgICAgICB1aW50MTZfdCBjaDIgPSAqc3JjKys7CisgICAgICAgICAgICB1aW50MTZfdCBjaDMgPSAqc3JjKys7CisgICAgICAgICAgICBjaCA9ICgoY2gxICYgMHgwRikgPDwgMTIpIHwgKChjaDIgJiAweDNGKSA8PCA2KSB8IChjaDMgJiAweDNGKTsKKyAgICAgICAgfQorICAgICAgICBwYWNrZXQtPnB1dFVJbnQxNihjaCk7CisgICAgfQorICAgIC8vIG9ubHkgdGVybWluYXRlIHdpdGggemVybyBpZiBzdHJpbmcgaXMgbm90IGVtcHR5CisgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgcGFja2V0LT5wdXRVSW50MTYoMCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmggYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjODMwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1NUUklOR19CVUZGRVJfSAorI2RlZmluZSBfTVRQX1NUUklOR19CVUZGRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworLy8gUmVwcmVzZW50cyBhIHV0Zjggc3RyaW5nLCB3aXRoIGEgbWF4aW11bSBvZiAyNTUgY2hhcmFjdGVycworY2xhc3MgTXRwU3RyaW5nQnVmZmVyIHsKKworcHJpdmF0ZToKKyAgICAvLyBtQnVmZmVyIGNvbnRhaW5zIHN0cmluZyBpbiBVVEY4IGZvcm1hdAorICAgIC8vIG1heGltdW0gMyBieXRlcy9jaGFyYWN0ZXIsIHdpdGggMSBleHRyYSBmb3IgemVybyB0ZXJtaW5hdGlvbgorICAgIHVpbnQ4X3QgICAgICAgICBtQnVmZmVyWzI1NSAqIDMgKyAxXTsKKyAgICBpbnQgICAgICAgICAgICAgbUNoYXJDb3VudDsKKyAgICBpbnQgICAgICAgICAgICAgbUJ5dGVDb3VudDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKGNvbnN0IGNoYXIqIHNyYyk7CisgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCB1aW50MTZfdCogc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3JjKTsKKyAgICB2aXJ0dWFsICAgICAgICAgfk10cFN0cmluZ0J1ZmZlcigpOworCisgICAgdm9pZCAgICAgICAgICAgIHNldChjb25zdCBjaGFyKiBzcmMpOworICAgIHZvaWQgICAgICAgICAgICBzZXQoY29uc3QgdWludDE2X3QqIHNyYyk7CisKKyAgICB2b2lkICAgICAgICAgICAgcmVhZEZyb21QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KTsKKyAgICB2b2lkICAgICAgICAgICAgd3JpdGVUb1BhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIGNvbnN0OworCisgICAgaW5saW5lIGludCAgICAgIGdldENoYXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFyQ291bnQ7IH0KKyAgICBpbmxpbmUgaW50ICAgICAgZ2V0Qnl0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUJ5dGVDb3VudDsgfQorCisJaW5saW5lIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IGNoYXIgKiltQnVmZmVyOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVFJJTkdfQlVGRkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBUeXBlcy5oIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwYzg1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBUeXBlcy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfVFlQRVNfSAorI2RlZmluZSBfTVRQX1RZUEVTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInV0aWxzL1N0cmluZzguaCIKKyNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIGludDMyX3QgaW50MTI4X3RbNF07Cit0eXBlZGVmIHVpbnQzMl90IHVpbnQxMjhfdFs0XTsKKwordHlwZWRlZiB1aW50MTZfdCBNdHBPcGVyYXRpb25Db2RlOwordHlwZWRlZiB1aW50MTZfdCBNdHBSZXNwb25zZUNvZGU7Cit0eXBlZGVmIHVpbnQxNl90IE10cEV2ZW50Q29kZTsKK3R5cGVkZWYgdWludDMyX3QgTXRwU2Vzc2lvbklEOwordHlwZWRlZiB1aW50MzJfdCBNdHBTdG9yYWdlSUQ7Cit0eXBlZGVmIHVpbnQzMl90IE10cFRyYW5zYWN0aW9uSUQ7Cit0eXBlZGVmIHVpbnQxNl90IE10cFByb3BlcnR5Q29kZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwRGF0YVR5cGU7Cit0eXBlZGVmIHVpbnQxNl90IE10cE9iamVjdEZvcm1hdDsKK3R5cGVkZWYgTXRwUHJvcGVydHlDb2RlIE10cERldmljZVByb3BlcnR5OwordHlwZWRlZiBNdHBQcm9wZXJ0eUNvZGUgTXRwT2JqZWN0UHJvcGVydHk7CisKKy8vIG9iamVjdCBoYW5kbGVzIGFyZSB1bmlxdWUgYWNyb3NzIGFsbCBzdG9yYWdlIGJ1dCBvbmx5IHdpdGhpbiBhIHNpbmdsZSBzZXNzaW9uLgorLy8gb2JqZWN0IGhhbmRsZXMgY2Fubm90IGJlIHJldXNlZCBhZnRlciBhbiBvYmplY3QgaXMgZGVsZXRlZC4KKy8vIHZhbHVlcyAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGIGFyZSByZXNlcnZlZCBmb3Igc3BlY2lhbCBwdXJwb3Nlcy4KK3R5cGVkZWYgdWludDMyX3QgTXRwT2JqZWN0SGFuZGxlOworCisvLyBTcGVjaWFsIHZhbHVlcworI2RlZmluZSBNVFBfUEFSRU5UX1JPT1QgICAgICAgICAweEZGRkZGRkZGICAgICAgIC8vIHBhcmVudCBpcyByb290IG9mIHRoZSBzdG9yYWdlCisjZGVmaW5lIGtJbnZhbGlkT2JqZWN0SGFuZGxlICAgIDB4RkZGRkZGRkYKKworY2xhc3MgTXRwU3RvcmFnZTsKK2NsYXNzIE10cERldmljZTsKK2NsYXNzIE10cFByb3BlcnR5OworCit0eXBlZGVmIFZlY3RvcjxNdHBTdG9yYWdlICo+IE10cFN0b3JhZ2VMaXN0OwordHlwZWRlZiBWZWN0b3I8TXRwRGV2aWNlKj4gTXRwRGV2aWNlTGlzdDsKK3R5cGVkZWYgVmVjdG9yPE10cFByb3BlcnR5Kj4gTXRwUHJvcGVydHlMaXN0OworCit0eXBlZGVmIFZlY3Rvcjx1aW50OF90PiBVSW50OExpc3Q7Cit0eXBlZGVmIFZlY3Rvcjx1aW50MTZfdD4gVUludDE2TGlzdDsKK3R5cGVkZWYgVmVjdG9yPHVpbnQzMl90PiBVSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8dWludDY0X3Q+IFVJbnQ2NExpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQ4X3Q+IEludDhMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MTZfdD4gSW50MTZMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MzJfdD4gSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50NjRfdD4gSW50NjRMaXN0OworCit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwT2JqZWN0UHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MTZMaXN0IE10cERldmljZVByb3BlcnR5TGlzdDsKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RGb3JtYXRMaXN0OwordHlwZWRlZiBVSW50MzJMaXN0IE10cE9iamVjdEhhbmRsZUxpc3Q7Cit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwT2JqZWN0UHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MzJMaXN0IE10cFN0b3JhZ2VJRExpc3Q7CisKK3R5cGVkZWYgU3RyaW5nOCAgICBNdHBTdHJpbmc7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1RZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBVdGlscy5jcHAgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDFlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFV0aWxzIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvdHp0aW1lLmg+CisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorRGF0ZVRpbWUgc3RyaW5ncyBmb2xsb3cgYSBjb21wYXRpYmxlIHN1YnNldCBvZiB0aGUgZGVmaW5pdGlvbiBmb3VuZCBpbiBJU08gODYwMSwgYW5kCit0YWtlIHRoZSBmb3JtIG9mIGEgVW5pY29kZSBzdHJpbmcgZm9ybWF0dGVkIGFzOiAiWVlZWU1NRERUaGhtbXNzLnMiLiBJbiB0aGlzCityZXByZXNlbnRhdGlvbiwgWVlZWSBzaGFsbCBiZSByZXBsYWNlZCBieSB0aGUgeWVhciwgTU0gcmVwbGFjZWQgYnkgdGhlIG1vbnRoICgwMS0xMiksCitERCByZXBsYWNlZCBieSB0aGUgZGF5ICgwMS0zMSksIFQgaXMgYSBjb25zdGFudCBjaGFyYWN0ZXIgJ1QnIGRlbGltaXRpbmcgdGltZSBmcm9tIGRhdGUsCitoaCBpcyByZXBsYWNlZCBieSB0aGUgaG91ciAoMDAtMjMpLCBtbSBpcyByZXBsYWNlZCBieSB0aGUgbWludXRlICgwMC01OSksIGFuZCBzcyBieSB0aGUKK3NlY29uZCAoMDAtNTkpLiBUaGUgIi5zIiBpcyBvcHRpb25hbCwgYW5kIHJlcHJlc2VudHMgdGVudGhzIG9mIGEgc2Vjb25kLgorKi8KKworYm9vbCBwYXJzZURhdGVUaW1lKGNvbnN0IGNoYXIqIGRhdGVUaW1lLCB0aW1lX3QmIG91dFNlY29uZHMpIHsKKyAgICBpbnQgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQ7CisgICAgc3RydWN0IHRtIHRtOworCisgICAgaWYgKHNzY2FuZihkYXRlVGltZSwgIiUwNGQlMDJkJTAyZFQlMDJkJTAyZCUwMmQiLAorICAgICAgICAgICAgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsICZtaW51dGUsICZzZWNvbmQpICE9IDYpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBjaGFyKiB0YWlsID0gZGF0ZVRpbWUgKyAxNTsKKyAgICAvLyBza2lwIG9wdGlvbmFsIHRlbnRoIG9mIHNlY29uZAorICAgIGlmICh0YWlsWzBdID09ICcuJyAmJiB0YWlsWzFdKQorICAgICAgICB0YWlsICs9IDI7CisgICAgLy9GSVhNRSAtIHN1cHBvcnQgKy8taGhtbQorICAgIGJvb2wgdXNlVVRDID0gKHRhaWxbMF0gPT0gJ1onKTsKKworICAgIC8vIGhhY2sgdG8gY29tcHV0ZSB0aW1lem9uZQorICAgIHRpbWVfdCBkdW1teTsKKyAgICBsb2NhbHRpbWVfcigmZHVtbXksICZ0bSk7CisKKyAgICB0bS50bV9zZWMgPSBzZWNvbmQ7CisgICAgdG0udG1fbWluID0gbWludXRlOworICAgIHRtLnRtX2hvdXIgPSBob3VyOworICAgIHRtLnRtX21kYXkgPSBkYXk7CisgICAgdG0udG1fbW9uID0gbW9udGg7CisgICAgdG0udG1feWVhciA9IHllYXIgLSAxOTAwOworICAgIHRtLnRtX3dkYXkgPSAwOworICAgIHRtLnRtX2lzZHN0ID0gLTE7CisgICAgaWYgKHVzZVVUQykKKyAgICAgICAgb3V0U2Vjb25kcyA9IG1rdGltZSgmdG0pOworICAgIGVsc2UKKyAgICAgICAgb3V0U2Vjb25kcyA9IG1rdGltZV90eigmdG0sIHRtLnRtX3pvbmUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZm9ybWF0RGF0ZVRpbWUodGltZV90IHNlY29uZHMsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmZlckxlbmd0aCkgeworICAgIHN0cnVjdCB0bSB0bTsKKworICAgIGxvY2FsdGltZV9yKCZzZWNvbmRzLCAmdG0pOworICAgIHNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyTGVuZ3RoLCAiJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCIsCisgICAgICAgIHRtLnRtX3llYXIgKyAxOTAwLCB0bS50bV9tb24sIHRtLnRtX21kYXksIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBVdGlscy5oIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmOTA1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfVVRJTFNfSAorI2RlZmluZSBfTVRQX1VUSUxTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgcGFyc2VEYXRlVGltZShjb25zdCBjaGFyKiBkYXRlVGltZSwgdGltZV90JiBvdXRTZWNvbmRzKTsKK3ZvaWQgZm9ybWF0RGF0ZVRpbWUodGltZV90IHNlY29uZHMsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmZlckxlbmd0aCk7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9tdHAuaCBiL21lZGlhL210cC9tdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2FmYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL210cC5oCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0gKKyNkZWZpbmUgX01UUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBNVFBfU1RBTkRBUkRfVkVSU0lPTiAgICAgICAgICAgIDEwMAorCisvLyBDb250YWluZXIgVHlwZXMKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX1VOREVGSU5FRCAgICAwCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9DT01NQU5EICAgICAgMQorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSAgICAgICAgIDIKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX1JFU1BPTlNFICAgICAzCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9FVkVOVCAgICAgICAgNAorCisvLyBDb250YWluZXIgT2Zmc2V0cworI2RlZmluZSBNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQgICAgICAgICAgICAgMAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VUICAgICAgICAgICAgICAgNAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VUICAgICAgICAgICAgICAgNgorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCAgICAgOAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1BBUkFNRVRFUl9PRkZTRVQgICAgICAgICAgMTIKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSAgICAgICAgICAgICAgIDEyCisKKy8vIE1UUCBUeXBlcworI2RlZmluZSBNVFBfVFlQRV9VTkRFRklORUQgICAgICAweDAwMDAgICAgICAgICAgLy8gVW5kZWZpbmVkCisjZGVmaW5lIE1UUF9UWVBFX0lOVDggICAgICAgICAgIDB4MDAwMSAgICAgICAgICAvLyBTaWduZWQgOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UOCAgICAgICAgICAweDAwMDIgICAgICAgICAgLy8gVW5zaWduZWQgOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQxNiAgICAgICAgICAweDAwMDMgICAgICAgICAgLy8gU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQxNiAgICAgICAgIDB4MDAwNCAgICAgICAgICAvLyBVbnNpZ25lZCAxNi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQzMiAgICAgICAgICAweDAwMDUgICAgICAgICAgLy8gU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQzMiAgICAgICAgIDB4MDAwNiAgICAgICAgICAvLyBVbnNpZ25lZCAzMi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQ2NCAgICAgICAgICAweDAwMDcgICAgICAgICAgLy8gU2lnbmVkIDY0LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQ2NCAgICAgICAgIDB4MDAwOCAgICAgICAgICAvLyBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQxMjggICAgICAgICAweDAwMDkgICAgICAgICAgLy8gU2lnbmVkIDEyOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UMTI4ICAgICAgICAweDAwMEEgICAgICAgICAgLy8gVW5zaWduZWQgMTI4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQ4ICAgICAgICAgIDB4NDAwMSAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQ4ICAgICAgICAgMHg0MDAyICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQxNiAgICAgICAgIDB4NDAwMyAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgMTYtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UMTYgICAgICAgIDB4NDAwNCAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDMyICAgICAgICAgMHg0MDA1ICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQzMiAgICAgICAgMHg0MDA2ICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UNjQgICAgICAgICAweDQwMDcgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDY0LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDY0ICAgICAgICAweDQwMDggICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgNjQtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQxMjggICAgICAgIDB4NDAwOSAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgMTI4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDEyOCAgICAgICAweDQwMEEgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgMTI4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9TVFIgICAgICAgICAgICAweEZGRkYgICAgICAgICAgLy8gVmFyaWFibGUtbGVuZ3RoIFVuaWNvZGUgc3RyaW5nCisKKy8vIE1UUCBGb3JtYXQgQ29kZXMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwICAgLy8gVW5kZWZpbmVkIG9iamVjdAorI2RlZmluZSBNVFBfRk9STUFUX0FTU09DSUFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDEgICAvLyBBc3NvY2lhdGlvbiAoZm9yIGV4YW1wbGUsIGEgZm9sZGVyKQorI2RlZmluZSBNVFBfRk9STUFUX1NDUklQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDIgICAvLyBEZXZpY2UgbW9kZWwtc3BlY2lmaWMgc2NyaXB0CisjZGVmaW5lIE1UUF9GT1JNQVRfRVhFQ1VUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMyAgIC8vIERldmljZSBtb2RlbC1zcGVjaWZpYyBiaW5hcnkgZXhlY3V0YWJsZQorI2RlZmluZSBNVFBfRk9STUFUX1RFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDQgICAvLyBUZXh0IGZpbGUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9IVE1MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA1ICAgLy8gSHlwZXJ0ZXh0IE1hcmt1cCBMYW5ndWFnZSBmaWxlICh0ZXh0KQorI2RlZmluZSBNVFBfRk9STUFUX0RQT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDYgICAvLyBEaWdpdGFsIFByaW50IE9yZGVyIEZvcm1hdCBmaWxlICh0ZXh0KQorI2RlZmluZSBNVFBfRk9STUFUX0FJRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDcgICAvLyBBdWRpbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfV0FWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwOCAgIC8vIEF1ZGlvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA5ICAgLy8gQXVkaW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX0FWSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEEgICAvLyBWaWRlbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfTVBFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQiAgIC8vIFZpZGVvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BU0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBDICAgLy8gTWljcm9zb2Z0IEFkdmFuY2VkIFN0cmVhbWluZyBGb3JtYXQgKHZpZGVvKQorI2RlZmluZSBNVFBfRk9STUFUX0RFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDAgICAvLyBVbmtub3duIGltYWdlIG9iamVjdAorI2RlZmluZSBNVFBfRk9STUFUX0VYSUZfSlBFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDEgICAvLyBFeGNoYW5nZWFibGUgRmlsZSBGb3JtYXQsIEpFSURBIHN0YW5kYXJkCisjZGVmaW5lIE1UUF9GT1JNQVRfVElGRl9FUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMiAgIC8vIFRhZyBJbWFnZSBGaWxlIEZvcm1hdCBmb3IgRWxlY3Ryb25pYyBQaG90b2dyYXBoeQorI2RlZmluZSBNVFBfRk9STUFUX0ZMQVNIUElYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDMgICAvLyBTdHJ1Y3R1cmVkIFN0b3JhZ2UgSW1hZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfQk1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNCAgIC8vIE1pY3Jvc29mdCBXaW5kb3dzIEJpdG1hcCBmaWxlCisjZGVmaW5lIE1UUF9GT1JNQVRfQ0lGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNSAgIC8vIENhbm9uIENhbWVyYSBJbWFnZSBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0dJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDcgICAvLyBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9KRklGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA4ICAgLy8gSlBFRyBGaWxlIEludGVyY2hhbmdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0NEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDkgICAvLyBQaG90b0NEIEltYWdlIFBhYworI2RlZmluZSBNVFBfRk9STUFUX1BJQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEEgICAvLyBRdWlja2RyYXcgSW1hZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfUE5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQiAgIC8vIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MKKyNkZWZpbmUgTVRQX0ZPUk1BVF9USUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBEICAgLy8gVGFnIEltYWdlIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfVElGRl9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRSAgIC8vIFRhZyBJbWFnZSBGaWxlIEZvcm1hdCBmb3IgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAoZ3JhcGhpYyBhcnRzKQorI2RlZmluZSBNVFBfRk9STUFUX0pQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEYgICAvLyBKUEVHMjAwMCBCYXNlbGluZSBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0pQWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTAgICAvLyBKUEVHMjAwMCBFeHRlbmRlZCBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9GSVJNV0FSRSAgICAgICAgICAgICAgICAgICAweEI4MDIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCAgICAgICAgICAgICAgICAgMHhCODgxCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMAorI2RlZmluZSBNVFBfRk9STUFUX1dNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9PR0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAyCisjZGVmaW5lIE1UUF9GT1JNQVRfQUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMworI2RlZmluZSBNVFBfRk9STUFUX0FVRElCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9GTEFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTA2CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MAorI2RlZmluZSBNVFBfRk9STUFUX1dNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUDRfQ09OVEFJTkVSICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgyICAvLyBJU08gMTQ0OTYtMQorI2RlZmluZSBNVFBfRk9STUFUX01QMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODMKKyNkZWZpbmUgTVRQX0ZPUk1BVF8zR1BfQ09OVEFJTkVSICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTg0ICAvLyAzR1BQIGZpbGUgZm9ybWF0LiBEZXRhaWxzOiBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9odG1sLWluZm8vMjYyNDQuaHRtIChwYWdlIHRpdGxlIC0gXHUyMDFjVHJhbnNwYXJlbnQgZW5kLXRvLWVuZCBwYWNrZXQgc3dpdGNoZWQgc3RyZWFtaW5nIHNlcnZpY2UsIDNHUFAgZmlsZSBmb3JtYXRcdTIwMWQpLgorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9DT0xMRUNUSU9OICAgICAgICAgICAgICAgICAweEJBMDAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNICAgICAgICAgICAgMHhCQTAxCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gICAgICAgICAgICAgICAgIDB4QkEwMgorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNICAgICAgICAgICAgICAgICAweEJBMDMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19BTEJVTSAgICAgICAgICAgICAgICAgMHhCQTA0CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgICAgICAgICAgICAgICAgIDB4QkEwNQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAgICAgICAgICAgICAgICAweEJBMDYKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTQUdFX0ZPTERFUiAgICAgICAgICAgICAgMHhCQTA3CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQ0hBUFRFUkVEX1BST0RVQ1RJT04gICAgICAgIDB4QkEwOAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUICAgICAgICAgICAgICAweEJBMDkKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19QTEFZTElTVCAgICAgICAgICAgICAgMHhCQTBBCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVESUFDQVNUICAgICAgICAgICAgICAgICAgIDB4QkEwQiAvLyBGb3IgdXNlIHdpdGggbWVkaWFjYXN0czsgcmVmZXJlbmNlcyBtdWx0aW1lZGlhIGVuY2xvc3VyZXMgb2YgUlNTIGZlZWRzIG9yIGVwaXNvZGljIGNvbnRlbnQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XUExfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTEwCisjZGVmaW5lIE1UUF9GT1JNQVRfTTNVX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMQorI2RlZmluZSBNVFBfRk9STUFUX01QTF9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BU1hfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTEzCisjZGVmaW5lIE1UUF9GT1JNQVRfUExTX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExNAorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAweEJBODAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAgMHhCQTgxCisjZGVmaW5lIE1UUF9GT1JNQVRfWE1MX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkE4MgorI2RlZmluZSBNVFBfRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgICAweEJBODMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NSFRfQ09NUElMRURfSFRNTF9ET0NVTUVOVCAgICAgICAgICAgMHhCQTg0CisjZGVmaW5lIE1UUF9GT1JNQVRfTVNfRVhDRUxfU1BSRUFEU0hFRVQgICAgICAgICAgICAgICAgIDB4QkE4NQorI2RlZmluZSBNVFBfRk9STUFUX01TX1BPV0VSUE9JTlRfUFJFU0VOVEFUSU9OICAgICAgICAgICAweEJBODYKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfTUVTU0FHRSAgICAgICAgICAgICAgICAgICAgMHhCQjAwCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVTU1NBR0UgICAgICAgICAgICAgICAgICAgIDB4QkIwMQorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9DT05UQUNUICAgICAgICAgICAgICAgICAgICAweEJCODAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9DT05UQUNUICAgICAgICAgICAgICAgICAgICAgMHhCQjgxCisjZGVmaW5lIE1UUF9GT1JNQVRfVkNBUkRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkI4MgorCisvLyBNVFAgT2JqZWN0IFByb3BlcnR5IENvZGVzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgMHhEQzAzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FTU09DSUFUSU9OX1RZUEUgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fREVTQyAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAweERDMDcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfQ1JFQVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9LRVlXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BBUkVOVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUxMT1dFRF9GT0xERVJfQ09OVEVOVFMgICAgICAgICAgICAgICAgMHhEQzBDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ISURERU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NZU1RFTV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TWU5DX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST1BFUlRZX0JBRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MworI2RlZmluZSBNVFBfUFJPUEVSVFlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DUkVBVEVEX0JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FSVElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9BVVRIT1JFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VSTF9SRUZFUkVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTEFOR1VBR0VfTE9DQUxFICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DT1BZUklHSFRfSU5GT1JNQVRJT04gICAgICAgICAgICAgICAgICAweERDNEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0QworI2RlZmluZSBNVFBfUFJPUEVSVFlfT1JJR0lOX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX0FEREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX05PTl9DT05TVU1BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ09SUlVQVF9VTlBMQVlBQkxFICAgICAgICAgICAgICAgICAgICAgMHhEQzUwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9EVUNFUl9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAweERDNTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9GT1JNQVQgICAgICAgICAgIDB4REM4MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1NJWkUgICAgICAgICAgICAgMHhEQzgyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfSEVJR0hUICAgICAgICAgICAweERDODMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9XSURUSCAgICAgICAgICAgIDB4REM4NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RVUkFUSU9OICAgICAgICAgMHhEQzg1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfREFUQSAgICAgICAgICAgICAweERDODYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4NworI2RlZmluZSBNVFBfUFJPUEVSVFlfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JBVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfVFJBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9HRU5SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NSRURJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTFlSSUNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJTQ1JJUFRJT05fQ09OVEVOVF9JRCAgICAgICAgICAgICAgICAweERDOEYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST0RVQ0VEX0JZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVNFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TS0lQX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xBU1RfQUNDRVNTRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MworI2RlZmluZSBNVFBfUFJPUEVSVFlfUEFSRU5UQUxfUkFUSU5HICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVRBX0dFTlJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NPTVBPU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRUZGRUNUSVZFX1JBVElORyAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJUSVRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09SSUdJTkFMX1JFTEVBU0VfREFURSAgICAgICAgICAgICAgICAgIDB4REM5OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUxCVU1fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BTEJVTV9BUlRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01PT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QworI2RlZmluZSBNVFBfUFJPUEVSVFlfRFJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJfREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAweERDOUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lTX0NST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfSVNfQ09MT1VSX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgMHhEQ0QyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTUFHRV9CSVRfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAweERDRDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RPVEFMX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQklUUkFURV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TQU1QTEVfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX05VTUJFUl9PRl9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgIDB4REU5NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVVESU9fQklUX0RFUFRIICAgICAgICAgICAgICAgICAgICAgICAgMHhERTk1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TQ0FOX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FVRElPX1dBVkVfQ09ERUMgICAgICAgICAgICAgICAgICAgICAgIDB4REU5OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVVESU9fQklUUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9WSURFT19GT1VSQ0NfQ09ERUMgICAgICAgICAgICAgICAgICAgICAweERFOUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1ZJREVPX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5QworI2RlZmluZSBNVFBfUFJPUEVSVFlfRlJBTUVTX1BFUl9USE9VU0FORF9TRUNPTkRTICAgICAgICAgICAgMHhERTlECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9LRVlGUkFNRV9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAweERFOUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU5DT0RJTkdfUVVBTElUWSAgICAgICAgICAgICAgICAgICAgICAgMHhERUEwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTkNPRElOR19QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAweERFQTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RJU1BMQVlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQk9EWV9URVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BSSU9SSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMworI2RlZmluZSBNVFBfUFJPUEVSVFlfR0lWRU5fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NSURETEVfTkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBTUlMWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJFRklYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUZGSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FVElDX0dJVkVOX05BTUUgICAgICAgICAgICAgICAgICAgIDB4REQwNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVUSUNfRkFNSUxZX05BTUUgICAgICAgICAgICAgICAgICAgMHhERDA2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9QUklNQVJZICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzEgICAgICAgICAgICAgICAgICAgICAgIDB4REQwOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMiAgICAgICAgICAgICAgICAgICAgICAgMHhERDA5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18xICAgICAgICAgICAgICAgICAgICAgICAweEREMEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzIgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfT1RIRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDBDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUFJJTUFSWSAgICAgICAgICAgICAgICAgICAweEREMEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTCAgICAgICAgICAgICAgICAgIDB4REQwRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMXzIgICAgICAgICAgICAgICAgMHhERDBGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1MgICAgICAgICAgICAgICAgICAweEREMTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTU18yICAgICAgICAgICAgICAgIDB4REQxMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRSAgICAgICAgICAgICAgICAgICAgMHhERDEyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFXzIgICAgICAgICAgICAgICAgICAweEREMTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfUFJJTUFSWSAgICAgICAgICAgICAgICAgICAgIDB4REQxNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QRVJTT05BTCAgICAgICAgICAgICAgICAgICAgMHhERDE1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX0JVU0lORVNTICAgICAgICAgICAgICAgICAgICAweEREMTYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BBR0VSX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQxNworI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX09USEVSUyAgICAgICAgICAgICAgICAgICAgMHhERDE4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUklNQVJZX1dFQl9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweEREMTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BFUlNPTkFMX1dFQl9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4REQxQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQlVTSU5FU1NfV0VCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHhERDFCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTICAgICAgICAgICAgICAweEREMUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMiAgICAgICAgICAgIDB4REQxRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18zICAgICAgICAgICAgMHhERDFFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9GVUxMICAgICAgICAgICAweEREMUYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMSAgICAgICAgIDB4REQyMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8yICAgICAgICAgMHhERDIxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DSVRZICAgICAgICAgICAweEREMjIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1JFR0lPTiAgICAgICAgIDB4REQyMworI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUE9TVEFMX0NPREUgICAgMHhERDI0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DT1VOVFJZICAgICAgICAweEREMjUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0ZVTEwgICAgICAgICAgIDB4REQyNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8xICAgICAgICAgMHhERDI3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzIgICAgICAgICAweEREMjgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NJVFkgICAgICAgICAgIDB4REQyOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUkVHSU9OICAgICAgICAgMHhERDJBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19QT1NUQUxfQ09ERSAgICAweEREMkIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NPVU5UUlkgICAgICAgIDB4REQyQworI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfRlVMTCAgICAgICAgICAgICAgMHhERDJECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzEgICAgICAgICAgICAweEREMkUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMiAgICAgICAgICAgIDB4REQyRgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ0lUWSAgICAgICAgICAgICAgMHhERDMwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9SRUdJT04gICAgICAgICAgICAweEREMzEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1BPU1RBTF9DT0RFICAgICAgIDB4REQzMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ09VTlRSWSAgICAgICAgICAgMHhERDMzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PUkdBTklaQVRJT05fTkFNRSAgICAgICAgICAgICAgICAgICAgICAweEREMzQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FVElDX09SR0FOSVpBVElPTl9OQU1FICAgICAgICAgICAgIDB4REQzNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUk9MRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDM2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CSVJUSERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9DQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX0JDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MworI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUNFSVZFRF9USU1FICAgICAgICAgICAgICAgICAgMHhERDQ0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1NFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAweERENDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0JFR0lOX1RJTUUgICAgICAgICAgICAgICAgICAgIDB4REQ1MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfRU5EX1RJTUUgICAgICAgICAgICAgICAgICAgICAgMHhERDUxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAweERENTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFUVVJUkVEX0FUVEVOREVFUyAgICAgICAgICAgIDB4REQ1NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1BUSU9OQUxfQVRURU5ERUVTICAgICAgICAgICAgMHhERDU1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgICAweERENTYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0FDQ0VQVEVEICAgICAgICAgICAgICAgICAgICAgIDB4REQ1NworI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfVEVOVEFUSVZFICAgICAgICAgICAgICAgICAgICAgMHhERDU4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9ERUNMSU5FRCAgICAgICAgICAgICAgICAgICAgICAweERENTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFTUFJTkRFUl9USU1FICAgICAgICAgICAgICAgIDB4REQ1QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1dORVIgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAweERENUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09XTkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9XRUJNQVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VSTF9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVJMX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9USU1FX0JPT0tNQVJLICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9CT09LTUFSSyAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MworI2RlZmluZSBNVFBfUFJPUEVSVFlfQllURV9CT09LTUFSSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDY0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MQVNUX0JVSUxEX0RBVEUgICAgICAgICAgICAgICAgICAgICAgICAweERENzAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RJTUVfVE9fTElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVESUFfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcyCisKKy8vIE1UUCBEZXZpY2UgUHJvcGVydHkgQ29kZXMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0JBVFRFUllfTEVWRUwgICAgICAgICAgICAgICAgICAgMHg1MDAxCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRlVOQ1RJT05BTF9NT0RFICAgICAgICAgICAgICAgICAweDUwMDIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9JTUFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NPTVBSRVNTSU9OX1NFVFRJTkcgICAgICAgICAgICAgMHg1MDA0CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfV0hJVEVfQkFMQU5DRSAgICAgICAgICAgICAgICAgICAweDUwMDUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9SR0JfR0FJTiAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA3CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DQUxfTEVOR1RIICAgICAgICAgICAgICAgICAgICAweDUwMDgKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19ESVNUQU5DRSAgICAgICAgICAgICAgICAgIDB4NTAwOQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01PREUgICAgICAgICAgICAgICAgICAgICAgMHg1MDBBCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfTUVURVJJTkdfTU9ERSAgICAgICAgICAweDUwMEIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GTEFTSF9NT0RFICAgICAgICAgICAgICAgICAgICAgIDB4NTAwQworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUgICAgICAgICAgICAgICAgICAgMHg1MDBECisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfUFJPR1JBTV9NT0RFICAgICAgICAgICAweDUwMEUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCAgICAgICAgICAgICAgICAgIDB4NTAwRgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0JJQVNfQ09NUEVOU0FUSU9OICAgICAgMHg1MDEwCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREFURVRJTUUgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DQVBUVVJFX0RFTEFZICAgICAgICAgICAgICAgICAgIDB4NTAxMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NUSUxMX0NBUFRVUkVfTU9ERSAgICAgICAgICAgICAgMHg1MDEzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09OVFJBU1QgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TSEFSUE5FU1MgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RJR0lUQUxfWk9PTSAgICAgICAgICAgICAgICAgICAgMHg1MDE2CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRUZGRUNUX01PREUgICAgICAgICAgICAgICAgICAgICAweDUwMTcKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9CVVJTVF9OVU1CRVIgICAgICAgICAgICAgICAgICAgIDB4NTAxOAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgMHg1MDE5CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX05VTUJFUiAgICAgICAgICAgICAgICAweDUwMUEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfSU5URVJWQUwgICAgICAgICAgICAgIDB4NTAxQgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01FVEVSSU5HX01PREUgICAgICAgICAgICAgMHg1MDFDCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVVBMT0FEX1VSTCAgICAgICAgICAgICAgICAgICAgICAweDUwMUQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9BUlRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPICAgICAgICAgICAgICAgICAgMHg1MDFGCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVIgICAgICAgICAweEQ0MDEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfRlJJRU5ETFlfTkFNRSAgICAgICAgICAgIDB4RDQwMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhENDAzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU1VQUE9SVEVEX0ZPUk1BVFNfT1JERVJFRCAgICAgICAweEQ0MDQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfSUNPTiAgICAgICAgICAgICAgICAgICAgIDB4RDQwNQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX1JBVEUgICAgICAgICAgICAgICAgICAgMHhENDEwCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfT0JKRUNUICAgICAgICAgICAgICAgICAweEQ0MTEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19DT05UQUlORVJfSU5ERVggICAgICAgIDB4RDQxMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NFU1NJT05fSU5JVElBVE9SX1ZFUlNJT05fSU5GTyAgMHhENDA2CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUEVSQ0VJVkVEX0RFVklDRV9UWVBFICAgICAgICAgICAweEQ0MDcKKworLy8gTVRQIE9wZXJhdGlvbiBDb2RlcworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA0CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTyAgICAgICAgICAgICAgICAgICAgICAweDEwMDUKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUyAgICAgICAgICAgICAgICAgICAgMHgxMDA3CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAweDEwMDgKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwOQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9USFVNQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBBCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPICAgICAgICAgICAgICAgICAgICAgIDB4MTAwQworI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBECisjZGVmaW5lIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSAgICAgICAgICAgICAgICAgICAgICAweDEwMEUKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9GT1JNQVRfU1RPUkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwRgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDEwCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VMRl9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1RFQ1RJT04gICAgICAgICAgICAgICAgIDB4MTAxMgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1BPV0VSX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDEzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MgICAgICAgICAgICAgICAgICAweDEwMTQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4MTAxNQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHgxMDE2CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAweDEwMTcKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFICAgICAgICAgICAgICAgIDB4MTAxOAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDE5CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMUEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfUEFSVElBTF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIDB4MTAxQgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSAgICAgICAgICAgICAgICAgMHgxMDFDCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQgICAgICAgICAgICAweDk4MDEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQyAgICAgICAgICAgICAgICAgIDB4OTgwMgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHg5ODAzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDk4MDQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVMgICAgICAgICAgICAgICAgIDB4OTgxMAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUyAgICAgICAgICAgICAgICAgMHg5ODExCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0tJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk4MjAKKworLy8gTVRQIFJlc3BvbnNlIENvZGVzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIE1UUF9SRVNQT05TRV9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAxCisjZGVmaW5lIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAyCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1RSQU5TQUNUSU9OX0lEICAgICAgICAgICAgICAgICAgICAgMHgyMDA0CisjZGVmaW5lIE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgMHgyMDA1CisjZGVmaW5lIE1UUF9SRVNQT05TRV9QQVJBTUVURVJfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgMHgyMDA2CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTkNPTVBMRVRFX1RSQU5TRkVSICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA3CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA4CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgMHgyMDA5CisjZGVmaW5lIE1UUF9SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgMHgyMDBBCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9GT1JNQVRfQ09ERSAgICAgICAgICAgICAgICAgMHgyMDBCCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TVE9SQUdFX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBDCisjZGVmaW5lIE1UUF9SRVNQT05TRV9PQkpFQ1RfV1JJVEVfUFJPVEVDVEVEICAgICAgICAgICAgICAgICAgICAgMHgyMDBECisjZGVmaW5lIE1UUF9SRVNQT05TRV9TVE9SRV9SRUFEX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBFCisjZGVmaW5lIE1UUF9SRVNQT05TRV9BQ0NFU1NfREVOSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBGCisjZGVmaW5lIE1UUF9SRVNQT05TRV9OT19USFVNQk5BSUxfUFJFU0VOVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEwCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TRUxGX1RFU1RfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDExCisjZGVmaW5lIE1UUF9SRVNQT05TRV9QQVJUSUFMX0RFTEVUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEyCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TVE9SRV9OT1RfQVZBSUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0ZPUk1BVF9VTlNVUFBPUlRFRCAgICAgICAgMHgyMDE0CisjZGVmaW5lIE1UUF9SRVNQT05TRV9OT19WQUxJRF9PQkpFQ1RfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE1CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0NPREVfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE2CisjZGVmaW5lIE1UUF9SRVNQT05TRV9VTktOT1dOX1ZFTkRPUl9DT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE3CisjZGVmaW5lIE1UUF9SRVNQT05TRV9DQVBUVVJFX0FMUkVBRFlfVEVSTUlOQVRFRCAgICAgICAgICAgICAgICAgMHgyMDE4CisjZGVmaW5lIE1UUF9SRVNQT05TRV9ERVZJQ0VfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE5CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgMHgyMDFBCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX0ZPUk1BVCAgICAgICAgICAgICAgICAgMHgyMDFCCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAgMHgyMDFDCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDFECisjZGVmaW5lIE1UUF9SRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTiAgICAgICAgICAgICAgICAgICAgICAgMHgyMDFFCisjZGVmaW5lIE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQgICAgICAgICAgICAgICAgICAgICAgMHgyMDFGCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX09GX0RFU1RJTkFUSU9OX1VOU1VQUE9SVEVEICAgMHgyMDIwCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREUgICAgICAgICAgICAgICAgICAgMHhBODAxCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0ZPUk1BVCAgICAgICAgICAgICAgICAgMHhBODAyCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAgMHhBODAzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9SRUZFUkVOQ0UgICAgICAgICAgICAgICAgICAgMHhBODA0CisjZGVmaW5lIE1UUF9SRVNQT05TRV9HUk9VUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgMHhBODA1CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0RBVEFTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBODA2CisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0dST1VQX1VOU1VQUE9SVEVEICAgICAgICAgMHhBODA3CisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0RFUFRIX1VOU1VQUE9SVEVEICAgICAgICAgMHhBODA4CisjZGVmaW5lIE1UUF9SRVNQT05TRV9PQkpFQ1RfVE9PX0xBUkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBODA5CisjZGVmaW5lIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgMHhBODBBCisKKy8vIE1UUCBFdmVudCBDb2RlcworI2RlZmluZSBNVFBfRVZFTlRfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBNVFBfRVZFTlRfQ0FOQ0VMX1RSQU5TQUNUSU9OICAgICAgICAgICAgICAgIDB4NDAwMQorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX0FEREVEICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQgICAgICAgICAgICAgICAgICAgIDB4NDAwMworI2RlZmluZSBNVFBfRVZFTlRfU1RPUkVfQURERUQgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNAorI2RlZmluZSBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCAgICAgICAgICAgICAgICAgICAgIDB4NDAwNQorI2RlZmluZSBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCAgICAgICAgICAgICAgIDB4NDAwNgorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCAgICAgICAgICAgICAgIDB4NDAwNworI2RlZmluZSBNVFBfRVZFTlRfREVWSUNFX0lORk9fQ0hBTkdFRCAgICAgICAgICAgICAgIDB4NDAwOAorI2RlZmluZSBNVFBfRVZFTlRfUkVRVUVTVF9PQkpFQ1RfVFJBTlNGRVIgICAgICAgICAgIDB4NDAwOQorI2RlZmluZSBNVFBfRVZFTlRfU1RPUkVfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwQQorI2RlZmluZSBNVFBfRVZFTlRfREVWSUNFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgIDB4NDAwQgorI2RlZmluZSBNVFBfRVZFTlRfU1RPUkFHRV9JTkZPX0NIQU5HRUQgICAgICAgICAgICAgIDB4NDAwQworI2RlZmluZSBNVFBfRVZFTlRfQ0FQVFVSRV9DT01QTEVURSAgICAgICAgICAgICAgICAgIDB4NDAwRAorI2RlZmluZSBNVFBfRVZFTlRfVU5SRVBPUlRFRF9TVEFUVVMgICAgICAgICAgICAgICAgIDB4NDAwRQorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1BST1BfQ0hBTkdFRCAgICAgICAgICAgICAgIDB4QzgwMQorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1BST1BfREVTQ19DSEFOR0VEICAgICAgICAgIDB4QzgwMgorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1JFRkVSRU5DRVNfQ0hBTkdFRCAgICAgICAgIDB4QzgwMworCisvLyBTdG9yYWdlIFR5cGUKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklYRURfUk9NICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVNT1ZBQkxFX1JPTSAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklYRURfUkFNICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVNT1ZBQkxFX1JBTSAgICAgICAgICAgICAgICAgICAweDAwMDQKKworLy8gU3RvcmFnZSBGaWxlIFN5c3RlbQorI2RlZmluZSBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0ZMQVQgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0hJRVJBUkNISUNBTCAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0RDRiAgICAgICAgICAgICAgICAgIDB4MDAwMworCisvLyBTdG9yYWdlIEFjY2VzcyBDYXBhYmlsaXR5CisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFQURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFQURfT05MWV9XSVRIT1VUX0RFTEVURSAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFQURfT05MWV9XSVRIX0RFTEVURSAgICAgICAgICAgMHgwMDAyCisKKy8vIEFzc29jaWF0aW9uIFR5cGUKKyNkZWZpbmUgTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTVRQX0FTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVIgICAgICAgICAweDAwMDEKKworI2VuZGlmIC8vIF9NVFBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODExMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDYW1lcmFCcm93c2VyCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZTBiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOCBAQAorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyIj4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9sYWJlbCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkNhbWVyYUJyb3dzZXIiIGFuZHJvaWQ6bGFiZWw9IkNhbWVyYSBCcm93c2VyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJTdG9yYWdlQnJvd3NlciIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iT2JqZWN0QnJvd3NlciIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iT2JqZWN0Vmlld2VyIiAvPgorCisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9IlVzYlJlY2VpdmVyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0FUVEFDSEVEIiAvPgorICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6c2NoZW1lPSJjb250ZW50Ii8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvcmVjZWl2ZXI+CisKKyAgICA8L2FwcGxpY2F0aW9uPgorCisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9pbmZvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzIxMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9pbmZvLnhtbApAQCAtMCwwICsxLDE1NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPFRhYmxlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL29iamVjdF9pbmZvIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9uYW1lX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zaXplX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NpemUiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2Zvcm1hdF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mb3JtYXRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2Zvcm1hdCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9kZXB0aCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NlcXVlbmNlIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jcmVhdGVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NyZWF0ZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NyZWF0ZWQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tb2RpZmllZCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2tleXdvcmRzIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJuYWlsIiAvPgorICAgIDwvVGFibGVSb3c+Cis8L1RhYmxlTGF5b3V0PgorCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMxOGJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiIAorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorICAgIAorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYm5haWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwODY1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9zYXZlIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3NhdmVfaXRlbSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2RlbGV0ZSIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9kZWxldGVfaXRlbSIgLz4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDQ3N2YxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbGFiZWwiPkNhbWVyYSBCcm93c2VyPC9zdHJpbmc+CisKKyAgICA8IS0tIGZvciBvYmplY3QgaW5mbyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im5hbWVfbGFiZWwiPk5hbWU6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2l6ZV9sYWJlbCI+U2l6ZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmb3JtYXRfbGFiZWwiPkZvcm1hdDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVtYl93aWR0aF9sYWJlbCI+VGh1bWIgV2lkdGg6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGh1bWJfaGVpZ2h0X2xhYmVsIj5UaHVtYiBIZWlnaHQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGh1bWJfc2l6ZV9sYWJlbCI+VGh1bWIgU2l6ZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3aWR0aF9sYWJlbCI+V2lkdGg6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaGVpZ2h0X2xhYmVsIj5IZWlnaHQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVwdGhfbGFiZWwiPkRlcHRoOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlcXVlbmNlX2xhYmVsIj5TZXF1ZW5jZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjcmVhdGVkX2xhYmVsIj5DcmVhdGVkOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vZGlmaWVkX2xhYmVsIj5Nb2RpZmllZDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXl3b3Jkc19sYWJlbCI+S2V5d29yZHM6IDwvc3RyaW5nPgorCisgICAgPCEtLSBtZW51IGl0ZW1zIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9pdGVtIj5TYXZlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfaXRlbSI+RGVsZXRlPC9zdHJpbmc+CisKKyAgICA8IS0tIHRvYXN0cyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im9iamVjdF9zYXZlZF9tZXNzYWdlIj5PYmplY3Qgc2F2ZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhdmVfZmFpbGVkX21lc3NhZ2UiPkNvdWxkIG5vdCBzYXZlIG9iamVjdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib2JqZWN0X2RlbGV0ZWRfbWVzc2FnZSI+T2JqZWN0IGRlbGV0ZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9mYWlsZWRfbWVzc2FnZSI+Q291bGQgbm90IGRlbGV0ZSBvYmplY3Q8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Njk5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJpbmZvX2xhYmVsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9ImluZm9fdmFsdWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ4NzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBjb25uZWN0ZWQgY2FtZXJhcy4KKyAqLworcHVibGljIGNsYXNzIENhbWVyYUJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW1lcmFCcm93c2VyIjsKKworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgIHByaXZhdGUgRGV2aWNlT2JzZXJ2ZXIgbURldmljZU9ic2VydmVyOworICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CisKKyAgICBwcml2YXRlIGNsYXNzIERldmljZU9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgRGV2aWNlT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRldmljZU9ic2VydmVyLm9uQ2hhbmdlIik7CisgICAgICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVZJQ0VfQ09MVU1OUyA9CisgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuRGV2aWNlLl9JRCwgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbVJlc29sdmVyID0gZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIG1EZXZpY2VPYnNlcnZlciA9IG5ldyBEZXZpY2VPYnNlcnZlcihuZXcgSGFuZGxlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KE10cC5EZXZpY2UuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgREVWSUNFX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyk7CisgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisgICAgICAgIG1DdXJzb3IgPSBjOworCisgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMi54bWwKKyAgICAgICAgbUFkYXB0ZXIgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcih0aGlzLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8yLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSwgYW5kcm9pZC5SLmlkLnRleHQyIH0pOworICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGRldmljZSBsaXN0CisgICAgICAgIG1SZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihNdHAuRGV2aWNlLkNPTlRFTlRfVVJJLCB0cnVlLCBtRGV2aWNlT2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobURldmljZU9ic2VydmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgU3RvcmFnZUJyb3dzZXIuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIChpbnQpbUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzRmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk10cENvbnN0YW50czsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVzb3VyY2VDdXJzb3JBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBvYmplY3RzIHdpdGhpbiBhIGNvbnRhaW5lciAoZm9sZGVyIG9yIHN0b3JhZ2UgdW5pdCkuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RCcm93c2VyIGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiT2JqZWN0QnJvd3NlciI7CisKKyAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOworICAgIHByaXZhdGUgT2JqZWN0Q3Vyc29yQWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBsb25nIG1TdG9yYWdlSUQ7CisgICAgcHJpdmF0ZSBsb25nIG1PYmplY3RJRDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9CSkVDVF9DT0xVTU5TID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLk9iamVjdC5fSUQsIE10cC5PYmplY3QuTkFNRSwgTXRwLk9iamVjdC5GT1JNQVQsIE10cC5PYmplY3QuVEhVTUIgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09MVU1OID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DT0xVTU4gPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVEhVTUJfQ09MVU1OID0gMzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBtRGV2aWNlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiZGV2aWNlIiwgMCk7CisgICAgICAgIG1TdG9yYWdlSUQgPSBnZXRJbnRlbnQoKS5nZXRMb25nRXh0cmEoInN0b3JhZ2UiLCAwKTsKKyAgICAgICAgbU9iamVjdElEID0gZ2V0SW50ZW50KCkuZ2V0TG9uZ0V4dHJhKCJvYmplY3QiLCAwKTsKKyAgICAgICAgaWYgKG1EZXZpY2VJRCAhPSAwICYmIG1TdG9yYWdlSUQgIT0gMCkgeworICAgICAgICAgICAgQ3Vyc29yIGM7CisgICAgICAgICAgICBVcmkgdXJpOworICAgICAgICAgICAgaWYgKG1PYmplY3RJRCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdXJpID0gTXRwLk9iamVjdC5nZXRDb250ZW50VXJpRm9yU3RvcmFnZUNoaWxkcmVuKG1EZXZpY2VJRCwgbVN0b3JhZ2VJRCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVyaSA9IE10cC5PYmplY3QuZ2V0Q29udGVudFVyaUZvck9iamVjdENoaWxkcmVuKG1EZXZpY2VJRCwgbU9iamVjdElEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5ICIgKyB1cmkpOworICAgICAgICAgICAgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KHVyaSwgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKKyAgICAgICAgICAgIG1DdXJzb3IgPSBjOworCisgICAgICAgICAgICAvLyBNYXAgQ3Vyc29yIGNvbHVtbnMgdG8gdmlld3MgZGVmaW5lZCBpbiBzaW1wbGVfbGlzdF9pdGVtXzEueG1sCisgICAgICAgICAgICBtQWRhcHRlciA9IG5ldyBPYmplY3RDdXJzb3JBZGFwdGVyKHRoaXMsIGMpOworICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIGxvbmcgcm93SUQgPSBtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgcm93SUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyArICIgY291bnQ6ICIgKyBjLmdldENvdW50KCkpOworICAgICAgICBsb25nIGZvcm1hdCA9IDA7CisgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5nZXRDb3VudCgpID09IDEpIHsKKyAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoSURfQ09MVU1OKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYy5nZXRTdHJpbmcoTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgZm9ybWF0ID0gYy5nZXRMb25nKEZPUk1BVF9DT0xVTU4pOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicm93SWQ6ICIgKyByb3dJZCArICIgbmFtZTogIiArIG5hbWUgKyAiIGZvcm1hdDogIiArIGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdCA9PSBNdHBDb25zdGFudHMuRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RCcm93c2VyLmNsYXNzKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgbURldmljZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgic3RvcmFnZSIsIG1TdG9yYWdlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJvYmplY3QiLCByb3dJRCk7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RWaWV3ZXIuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdG9yYWdlIiwgbVN0b3JhZ2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoIm9iamVjdCIsIHJvd0lEKTsKKyAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgT2JqZWN0Q3Vyc29yQWRhcHRlciBleHRlbmRzIFJlc291cmNlQ3Vyc29yQWRhcHRlciB7CisKKyAgICAgICAgcHVibGljIE9iamVjdEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgUi5sYXlvdXQub2JqZWN0X2xpc3QsIGMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRWaWV3KFZpZXcgdmlldywgQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICBJbWFnZVZpZXcgdGh1bWJWaWV3ID0gKEltYWdlVmlldyl2aWV3LmZpbmRWaWV3QnlJZChSLmlkLnRodW1ibmFpbCk7CisgICAgICAgICAgICBUZXh0VmlldyBuYW1lVmlldyA9IChUZXh0Vmlldyl2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm5hbWUpOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIHRodW1ibmFpbAorICAgICAgICAgICAgYnl0ZVtdIHRodW1ibmFpbCA9IGN1cnNvci5nZXRCbG9iKFRIVU1CX0NPTFVNTik7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkodGh1bWJuYWlsLCAwLCB0aHVtYm5haWwubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnZXQgdGhlIG5hbWUKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY3Vyc29yLmdldFN0cmluZyhOQU1FX0NPTFVNTik7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZVZpZXcuc2V0VGV4dChuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0Vmlld2VyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdFZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMmY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdFZpZXdlci5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLyoqCisgKiBBIHZpZXcgdG8gZGlzcGxheSB0aGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RWaWV3ZXIgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk9iamVjdFZpZXdlciI7CisKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBsb25nIG1TdG9yYWdlSUQ7CisgICAgcHJpdmF0ZSBsb25nIG1PYmplY3RJRDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9CSkVDVF9DT0xVTU5TID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgIE10cC5PYmplY3QuX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5USFVNQl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUJfSEVJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5USFVNQl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5JTUFHRV9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuSU1BR0VfSEVJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5JTUFHRV9ERVBUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuU0VRVUVOQ0VfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5EQVRFX0NSRUFURUQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LkRBVEVfTU9ESUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LktFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5USFVNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5vYmplY3RfaW5mbyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgbURldmljZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoImRldmljZSIsIDApOworICAgICAgICBtU3RvcmFnZUlEID0gZ2V0SW50ZW50KCkuZ2V0TG9uZ0V4dHJhKCJzdG9yYWdlIiwgMCk7CisgICAgICAgIG1PYmplY3RJRCA9IGdldEludGVudCgpLmdldExvbmdFeHRyYSgib2JqZWN0IiwgMCk7CisKKyAgICAgICAgaWYgKG1EZXZpY2VJRCAhPSAwICYmIG1PYmplY3RJRCAhPSAwKSB7CisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCBtT2JqZWN0SUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgVGV4dFZpZXcgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChjLmdldFN0cmluZygxKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNpemUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDIpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX3dpZHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZygzKSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYl9oZWlnaHQpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDQpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX3NpemUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDUpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLndpZHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg2KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5oZWlnaHQpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDcpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmRlcHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg4KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXF1ZW5jZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoOSkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuY3JlYXRlZCk7CisgICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZShjLmdldExvbmcoMTApICogMTAwMCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoZGF0ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQubW9kaWZpZWQpOworICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGMuZ2V0TG9uZygxMSkgKiAxMDAwKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChkYXRlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5rZXl3b3Jkcyk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoYy5nZXRTdHJpbmcoMTIpKTsKKyAgICAgICAgICAgIGJ5dGVbXSB0aHVtYm5haWwgPSBjLmdldEJsb2IoMTMpOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IHRodW1iVmlldyA9IChJbWFnZVZpZXcpZmluZFZpZXdCeUlkKFIuaWQudGh1bWJuYWlsKTsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkodGh1bWJuYWlsLCAwLCB0aHVtYm5haWwubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5mb3JtYXQpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9IZXhTdHJpbmcoYy5nZXRMb25nKDE0KSkudG9VcHBlckNhc2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIgPSBnZXRNZW51SW5mbGF0ZXIoKTsKKyAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLm1lbnUub2JqZWN0X21lbnUsIG1lbnUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG1lbnUuZmluZEl0ZW0oUi5pZC5zYXZlKTsKKyAgICAgICAgaXRlbS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBpdGVtID0gbWVudS5maW5kSXRlbShSLmlkLmRlbGV0ZSk7CisgICAgICAgIGl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICBjYXNlIFIuaWQuc2F2ZToKKyAgICAgICAgICAgICAgICBzYXZlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIFIuaWQuZGVsZXRlOgorICAgICAgICAgICAgICAgIGRlbGV0ZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICBDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgYy5zZXRUaW1lSW5NaWxsaXMoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXRZLSV0bS0ldGQtJXRILSV0TS0ldFMiLCBjLCBjLCBjLCBjLCBjLCBjKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2F2ZSgpIHsKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIFVyaSB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCBtT2JqZWN0SUQpOworICAgICAgICBGaWxlIGRlc3RGaWxlID0gbnVsbDsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gbnVsbDsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGZkID0gZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbkZpbGVEZXNjcmlwdG9yKHVyaSwgInIiKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInNhdmUgZ290IHBmZCAiICsgcGZkKTsKKyAgICAgICAgICAgIGlmIChwZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNhdmUgZ290IGZpcyAiICsgZmlzKTsKKyAgICAgICAgICAgICAgICBGaWxlIGRlc3REaXIgPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VQdWJsaWNEaXJlY3RvcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5ESVJFQ1RPUllfRENJTSk7CisgICAgICAgICAgICAgICAgZGVzdERpci5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsICJDYW1lcmFCcm93c2VyLSIgKyBnZXRUaW1lc3RhbXAoKSArICIuanBlZyIpOworCisKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzYXZlIGdvdCBkZXN0RmlsZSAiICsgZGVzdEZpbGUpOworCisgICAgICAgICAgICAgICAgaWYgKGRlc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSk7CisKKyAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNjU1MzZdOworICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBmaXMucmVhZChidWZmZXIpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IHdvcmthcm91bmQgdW50aWwgd2Ugc3RyYWlnaHRlbiBvdXQgcGVybWlzc2lvbnMgaW4gL2RhdGEvbWVkaWEKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc2V0UGVybWlzc2lvbnMoZGVzdERpci5nZXRQYXRoKCksIDA3NzUsIFByb2Nlc3MubXlVaWQoKSwgUHJvY2Vzcy5TRENBUkRfUldfR0lEKTsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc2V0UGVybWlzc2lvbnMoZGVzdEZpbGUuZ2V0UGF0aCgpLCAwNjY0LCBQcm9jZXNzLm15VWlkKCksIFByb2Nlc3MuU0RDQVJEX1JXX0dJRCk7CisKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBPYmplY3RWaWV3LnNhdmUiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBwZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01FRElBX1NDQU5ORVJfU0NBTl9GSUxFKTsKKyAgICAgICAgICAgIGludGVudC5zZXREYXRhKFVyaS5mcm9tRmlsZShkZXN0RmlsZSkpOworICAgICAgICAgICAgc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcub2JqZWN0X3NhdmVkX21lc3NhZ2UsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcuc2F2ZV9mYWlsZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlKCkgeworICAgICAgICBVcmkgdXJpID0gTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgbU9iamVjdElEKTsKKworICAgICAgICBMb2cuZChUQUcsICJkZWxldGluZyAiICsgdXJpKTsKKworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0Q29udGVudFJlc29sdmVyKCkuZGVsZXRlKHVyaSwgbnVsbCwgbnVsbCk7CisgICAgICAgIGlmIChyZXN1bHQgPiAwKSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBSLnN0cmluZy5vYmplY3RfZGVsZXRlZF9tZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcuZGVsZXRlX2ZhaWxlZF9tZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2UwMzZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9TdG9yYWdlQnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworCisvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIHN0b3JhZ2UgdW5pdHMgb24gYSBkZXZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yYWdlQnJvd3NlciBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0b3JhZ2VCcm93c2VyIjsKKworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBpbnQgbURldmljZUlEOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RPUkFHRV9DT0xVTU5TID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLlN0b3JhZ2UuX0lELCBNdHAuU3RvcmFnZS5ERVNDUklQVElPTiB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIG1EZXZpY2VJRCA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJkZXZpY2UiLCAwKTsKKyAgICAgICAgaWYgKG1EZXZpY2VJRCAhPSAwKSB7CisgICAgICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KE10cC5TdG9yYWdlLmdldENvbnRlbnRVcmkobURldmljZUlEKSwKKyAgICAgICAgICAgICAgICAgICAgU1RPUkFHRV9DT0xVTU5TLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjKTsKKyAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisKKyAgICAgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMS54bWwKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIodGhpcywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10geyBhbmRyb2lkLlIuaWQudGV4dDEsIGFuZHJvaWQuUi5pZC50ZXh0MiB9KTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RCcm93c2VyLmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCBtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvVXNiUmVjZWl2ZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvVXNiUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDViMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9Vc2JSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlVzYjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFVzYlJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlVzYlJlY2VpdmVyIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAib25SZWNlaXZlICIgKyBpbnRlbnQpOworICAgICAgICBpZiAoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBVcmkgdXJpID0gaW50ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgU3RvcmFnZUJyb3dzZXIuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGFkZCBhIHdyYXBwZXIgdG8gTXRwLkRldmljZSBmb3IgdGhpcworICAgICAgICAgICAgICAgIGludCBpZCA9IEludGVnZXIucGFyc2VJbnQodXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgxKSk7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBpZCk7CisgICAgICAgICAgICAgICAgY29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImJhZCBkZXZpY2UgVXJpICIgKyB1cmkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvbXRwL0FuZHJvaWQubWsgYi9tZWRpYS90ZXN0cy9tdHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA3NGVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCW10cC5jcHAgXAorCU10cEZpbGUuY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9IT1NUCisKK0xPQ0FMX01PRFVMRSA6PSBtdHAKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdCBsaWJ1dGlscyBsaWJjdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2VuZGlmCisKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCW10cC5jcHAgXAorCU10cEZpbGUuY3BwIFwKKwkuLi8uLi8uLi9saWJzL3V0aWxzL1JlZkJhc2UuY3BwIFwKKwkuLi8uLi8uLi9saWJzL3V0aWxzL1NoYXJlZEJ1ZmZlci5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvVGhyZWFkcy5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvVmVjdG9ySW1wbC5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbXRwIFwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0hPU1QgLWcgLU8wCisKK2hhdmVfcmVhZGxpbmUgOj0gJCh3aWxkY2FyZCAvdXNyL2luY2x1ZGUvcmVhZGxpbmUvcmVhZGxpbmUuaCkKK2hhdmVfaGlzdG9yeSA6PSAkKHdpbGRjYXJkIC91c3IvbGliL2xpYmhpc3RvcnkqKQoraWZuZXEgKCQoc3RyaXAgJChoYXZlX3JlYWRsaW5lKSksKQorTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9SRUFETElORT0xCitlbmRpZgorCitMT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCitpZm5lcSAoJChzdHJpcCAkKGhhdmVfcmVhZGxpbmUpKSwpCitMT0NBTF9MRExJQlMgKz0gLWxyZWFkbGluZSAtbG5jdXJzZXMKK2VuZGlmCitpZm5lcSAoJChzdHJpcCAkKGhhdmVfaGlzdG9yeSkpLCkKK0xPQ0FMX0xETElCUyArPSAtbGhpc3RvcnkKK2VuZGlmCisKK0xPQ0FMX01PRFVMRSA6PSBtdHAKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdCBsaWJjdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmNwcCBiL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQzMjhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuY3BwCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKKyNpbmNsdWRlICJNdHBGaWxlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwQ2xpZW50KiBNdHBGaWxlOjpzQ2xpZW50ID0gTlVMTDsKKworTXRwRmlsZTo6TXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSkKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtU3RvcmFnZSgwKSwKKyAgICAgICAgbUhhbmRsZSgwKQoreworfQorCitNdHBGaWxlOjpNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSkKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtU3RvcmFnZShzdG9yYWdlKSwKKyAgICAgICAgbUhhbmRsZSgwKQoreworfQorCitNdHBGaWxlOjpNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtU3RvcmFnZShzdG9yYWdlKSwKKyAgICAgICAgbUhhbmRsZShoYW5kbGUpCit7Cit9CisKK010cEZpbGU6Ok10cEZpbGUoTXRwRmlsZSogZmlsZSkKKyAgICA6ICAgbURldmljZShmaWxlLT5tRGV2aWNlKSwKKyAgICAgICAgbVN0b3JhZ2UoZmlsZS0+bVN0b3JhZ2UpLAorICAgICAgICBtSGFuZGxlKGZpbGUtPm1IYW5kbGUpCit7Cit9CisKK010cEZpbGU6On5NdHBGaWxlKCkgeworfQorCit2b2lkIE10cEZpbGU6OnByaW50KCkgeworICAgIGlmIChtSGFuZGxlKSB7CisKKyAgICB9IGVsc2UgaWYgKG1TdG9yYWdlKSB7CisgICAgICAgIHByaW50ZigiJXhcbiIsIG1TdG9yYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaWQgPSBtRGV2aWNlLT5nZXRJRCgpOworICAgICAgICBNdHBEZXZpY2VJbmZvKiBpbmZvID0gbURldmljZS0+Z2V0RGV2aWNlSW5mbygpOworICAgICAgICBpZiAoaW5mbykKKyAgICAgICAgICAgIHByaW50ZigiJWRcdCVzICVzICVzXG4iLCBpZCwgaW5mby0+bU1hbnVmYWN0dXJlciwgaW5mby0+bU1vZGVsLCBpbmZvLT5tU2VyaWFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCIlZFx0KG5vIGRldmljZSBpbmZvIGF2YWlsYWJsZSlcbiIsIGlkKTsKKyAgICAgICAgZGVsZXRlIGluZm87CisgICAgfQorfQorCitNdHBPYmplY3RJbmZvKiBNdHBGaWxlOjpnZXRPYmplY3RJbmZvKCkgeworICAgIHJldHVybiBtRGV2aWNlLT5nZXRPYmplY3RJbmZvKG1IYW5kbGUpOworfQorCit2b2lkIE10cEZpbGU6Omxpc3QoKSB7CisgICAgaWYgKG1TdG9yYWdlKSB7CisgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBtRGV2aWNlLT5nZXRPYmplY3RIYW5kbGVzKG1TdG9yYWdlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1IYW5kbGUgPyBtSGFuZGxlIDogLTEpKTsKKyAgICAgICAgaWYgKGhhbmRsZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlcy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gKCpoYW5kbGVzKVtpXTsKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gbURldmljZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgbW9kaWZpZWRbMTAwXTsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRtIHRtOworCisgICAgICAgICAgICAgICAgICAgIGdtdGltZV9yKCZpbmZvLT5tRGF0ZU1vZGlmaWVkLCAmdG0pOworICAgICAgICAgICAgICAgICAgICBzdHJmdGltZShtb2RpZmllZCwgc2l6ZW9mKG1vZGlmaWVkKSwgIiVhICViICVlICVIOiVNOiVTIEdNVCAlWSIsICZ0bSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgSGFuZGxlOiAlZCBGb3JtYXQ6ICUwNFggU2l6ZTogJWQgTW9kaWZpZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1OYW1lLCBoYW5kbGUsIGluZm8tPm1Gb3JtYXQsIGluZm8tPm1Db21wcmVzc2VkU2l6ZSwgbW9kaWZpZWQpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgaGFuZGxlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGxpc3Qgc3RvcmFnZSB1bml0cyBmb3IgZGV2aWNlCisgICAgICAgIE10cFN0b3JhZ2VJRExpc3QqIHN0b3JhZ2VMaXN0ID0gbURldmljZS0+Z2V0U3RvcmFnZUlEcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JhZ2VMaXN0LT5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9ICgqc3RvcmFnZUxpc3QpW2ldOworICAgICAgICAgICAgcHJpbnRmKCIleFxuIiwgc3RvcmFnZUlEKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNdHBGaWxlOjppbml0KE10cENsaWVudCogY2xpZW50KSB7CisgICAgc0NsaWVudCA9IGNsaWVudDsKK30KKworTXRwRmlsZSogTXRwRmlsZTo6cGFyc2VQYXRoKE10cEZpbGUqIGJhc2UsIGNoYXIqIHBhdGgpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IE5VTEw7CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UgPSAwOworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAwOworCisgICAgaWYgKHBhdGhbMF0gIT0gJy8nICYmIGJhc2UpIHsKKyAgICAgICAgZGV2aWNlID0gYmFzZS0+bURldmljZTsKKyAgICAgICAgc3RvcmFnZSA9IGJhc2UtPm1TdG9yYWdlOworICAgICAgICBoYW5kbGUgPSBiYXNlLT5tSGFuZGxlOworICAgIH0KKworICAgIC8vIHBhcnNlIGFuIGFic29sdXRlIHBhdGgKKyAgICBpZiAocGF0aFswXSA9PSAnLycpCisgICAgICAgIHBhdGgrKzsKKyAgICBjaGFyKiB0b2sgPSBzdHJ0b2socGF0aCwgIi8iKTsKKyAgICB3aGlsZSAodG9rKSB7CisgICAgICAgIGlmIChzdG9yYWdlKSB7CisgICAgICAgICAgICAvLyBmaW5kIGNoaWxkIG9mIGN1cnJlbnQgaGFuZGxlCisgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gZGV2aWNlLT5nZXRPYmplY3RIYW5kbGVzKHN0b3JhZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhbmRsZSA/IGhhbmRsZSA6IC0xKSk7CisgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgY2hpbGRIYW5kbGUgPSAwOworCisgICAgICAgICAgICBpZiAoaGFuZGxlcykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlcy0+c2l6ZSgpICYmICFjaGlsZEhhbmRsZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAoKmhhbmRsZXMpW2ldOworICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICYmICFzdHJjbXAodG9rLCBpbmZvLT5tTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGluZm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoaWxkSGFuZGxlKQorICAgICAgICAgICAgICAgIGhhbmRsZSA9IGNoaWxkSGFuZGxlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkOworICAgICAgICAgICAgLy8gZmluZCBzdG9yYWdlIGZvciB0aGUgZGV2aWNlCisgICAgICAgICAgICBpZiAoc3NjYW5mKHRvaywgIiV4IiwgJmlkKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlETGlzdCogc3RvcmFnZUxpc3QgPSBkZXZpY2UtPmdldFN0b3JhZ2VJRHMoKTsKKyAgICAgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yYWdlTGlzdC0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgqc3RvcmFnZUxpc3QpW2ldID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UgPSBpZDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZmluZCBkZXZpY2UKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgICAgICAgIGlmIChzc2NhbmYodG9rLCAiJWQiLCAmaWQpID09IDEpCisgICAgICAgICAgICAgICAgZGV2aWNlID0gc0NsaWVudC0+Z2V0RGV2aWNlKGlkKTsKKyAgICAgICAgICAgIGlmICghZGV2aWNlKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgdG9rID0gc3RydG9rKE5VTEwsICIvIik7CisgICAgfQorCisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIG5ldyBNdHBGaWxlKGRldmljZSwgc3RvcmFnZSwgaGFuZGxlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5oIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjg3NjJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0ZJTEVfSAorI2RlZmluZSBfTVRQX0ZJTEVfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBDbGllbnQ7CitjbGFzcyBNdHBEZXZpY2U7CitjbGFzcyBNdHBPYmplY3RJbmZvOworCisvLyBGaWxlLWxpa2UgYWJzdHJhY3Rpb24gZm9yIHRoZSBpbnRlcmFjdGl2ZSBzaGVsbC4KKy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIE1UUCBkZXZpY2UsIHN0b3JhZ2UgdW5pdCBvciBvYmplY3QKKy8vIChlaXRoZXIgZmlsZSBvciBhc3NvY2lhdGlvbikuCitjbGFzcyBNdHBGaWxlIHsKK3ByaXZhdGU6CisgICAgTXRwRGV2aWNlKiAgICAgICAgICBtRGV2aWNlOworICAgIE10cFN0b3JhZ2VJRCAgICAgICAgbVN0b3JhZ2U7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOworICAgIHN0YXRpYyBNdHBDbGllbnQqICAgc0NsaWVudDsKKworcHVibGljOgorICAgIE10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UpOworICAgIE10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UsIE10cFN0b3JhZ2VJRCBzdG9yYWdlKTsKKyAgICBNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwRmlsZShNdHBGaWxlKiBmaWxlKTsKKyAgICB2aXJ0dWFsIH5NdHBGaWxlKCk7CisKKyAgICBNdHBPYmplY3RJbmZvKiBnZXRPYmplY3RJbmZvKCk7CisgICAgdm9pZCBwcmludCgpOworICAgIHZvaWQgbGlzdCgpOworCisgICAgaW5saW5lIE10cERldmljZSogZ2V0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURldmljZTsgfQorCisgICAgc3RhdGljIHZvaWQgaW5pdChNdHBDbGllbnQqIGNsaWVudCk7CisgICAgc3RhdGljIE10cEZpbGUqIHBhcnNlUGF0aChNdHBGaWxlKiBiYXNlLCBjaGFyKiBwYXRoKTsKK307CisKK30KKworI2VuZGlmIC8vIF9NVFBfRElSRUNUT1JZX0gKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL210cC9tdHAuY3BwIGIvbWVkaWEvdGVzdHMvbXRwL210cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwMmNhZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL210cC9tdHAuY3BwCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZiBIQVZFX1JFQURMSU5FCisjaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKyNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKworI2luY2x1ZGUgIk10cEZpbGUuaCIKKworI2RlZmluZSBQUk9NUFQgICJtdHA+ICIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBNdHBDbGllbnQqIHNDbGllbnQgPSBOVUxMOworCisvLyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGZvciBpbnRlcmFjdGl2ZSBzaGVsbAorc3RhdGljIE10cEZpbGUqIHNDdXJyZW50RGlyZWN0b3J5ID0gTlVMTDsKKworc3RhdGljIE10cEZpbGUqIHBhcnNlX3BhdGgoY2hhciogcGF0aCkgeworICAgIHJldHVybiBNdHBGaWxlOjpwYXJzZVBhdGgoc0N1cnJlbnREaXJlY3RvcnksIHBhdGgpOworfQorCitjbGFzcyBNeUNsaWVudCA6IHB1YmxpYyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSkgeworICAgIH0KKworcHVibGljOgorfTsKKworc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICBzQ2xpZW50ID0gbmV3IE15Q2xpZW50OworICAgIHNDbGllbnQtPnN0YXJ0KCk7CisgICAgTXRwRmlsZTo6aW5pdChzQ2xpZW50KTsKK30KKworc3RhdGljIGludCBzZXRfY3dkKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2Qgc2hvdWxkIGhhdmUgb25lIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXN0cmNtcChhcmd2WzBdLCAiLyIpKSB7CisgICAgICAgIGRlbGV0ZSBzQ3VycmVudERpcmVjdG9yeTsKKyAgICAgICAgc0N1cnJlbnREaXJlY3RvcnkgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTXRwRmlsZSogZmlsZSA9IHBhcnNlX3BhdGgoYXJndlswXSk7CisgICAgICAgIGlmIChmaWxlKSB7CisgICAgICAgICAgICBkZWxldGUgc0N1cnJlbnREaXJlY3Rvcnk7CisgICAgICAgICAgICBzQ3VycmVudERpcmVjdG9yeSA9IGZpbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kICVzXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGlzdF9kZXZpY2VzKCkgeworICAgIC8vIFRPRE8gLSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgbGlzdCB3aWxsIG5vdCBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nCisgICAgTXRwRGV2aWNlTGlzdCYgZGV2aWNlcyA9IHNDbGllbnQtPmdldERldmljZUxpc3QoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBkZXZpY2VzW2ldOworICAgICAgICBNdHBGaWxlKiBmaWxlID0gbmV3IE10cEZpbGUoZGV2aWNlKTsKKyAgICAgICAgZmlsZS0+cHJpbnQoKTsKKyAgICAgICAgZGVsZXRlIGZpbGU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGxpc3QoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjID09IDApIHsKKyAgICAgICAgLy8gbGlzdCBjd2QKKyAgICAgICAgaWYgKHNDdXJyZW50RGlyZWN0b3J5KSB7CisgICAgICAgICAgICBzQ3VycmVudERpcmVjdG9yeS0+bGlzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlzdF9kZXZpY2VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjaGFyKiBwYXRoID0gYXJndltpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAocGF0aCwgIi8iKSkgeworICAgICAgICAgICAgbGlzdF9kZXZpY2VzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNdHBGaWxlKiBmaWxlID0gcGFyc2VfcGF0aChwYXRoKTsKKyAgICAgICAgICAgIGlmICghZmlsZSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgJXNcbiIsIHBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbGUtPmxpc3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9maWxlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgaW50IHNyY0ZEID0gLTE7CisgICAgaW50IGRlc3RGRCA9IC0xOworICAgIE10cEZpbGUqIHNyY0ZpbGUgPSBOVUxMOworICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBOVUxMOworICAgIGNoYXIqIGRlc3Q7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJub3QgZW5vdWdoIGFyZ3VtZW50c1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIGZpbmQgc291cmNlIG9iamVjdAorICAgIGNoYXIqIHNyYyA9IGFyZ3ZbMF07CisgICAgc3JjRmlsZSA9IHBhcnNlX3BhdGgoc3JjKTsKKyAgICBpZiAoIXNyY0ZpbGUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCAlc1xuIiwgc3JjKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbmZvID0gc3JjRmlsZS0+Z2V0T2JqZWN0SW5mbygpOworICAgIGlmICghaW5mbykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kIG9iamVjdCBpbmZvIGZvciAlc1xuIiwgc3JjKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoaW5mby0+bUZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY29weWluZyBkaXJlY3RvcmllcyBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGRlc3QgPSAoYXJnYyA+IDEgPyBhcmd2WzFdIDogaW5mby0+bU5hbWUpOworICAgIGRlc3RGRCA9IG9wZW4oZGVzdCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgaWYgKGRlc3RGRCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY3JlYXRlICVzXG4iLCBkZXN0KTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzcmNGRCA9IHNyY0ZpbGUtPmdldERldmljZSgpLT5yZWFkT2JqZWN0KGluZm8tPm1IYW5kbGUsIGluZm8tPm1Db21wcmVzc2VkU2l6ZSk7CisgICAgaWYgKHNyY0ZEIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgY2hhciBidWZmZXJbNjU1MzZdOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCBjb3VudCA9IHJlYWQoc3JjRkQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB3cml0ZShkZXN0RkQsIGJ1ZmZlciwgY291bnQpOworICAgIH0KKyAgICAvLyBGSVhNRSAtIGVycm9yIGNoZWNraW5nIGFuZCByZXBvcnRpbmcKKyAgICByZXQgPSAwOworCitmYWlsOgorICAgIGRlbGV0ZSBzcmNGaWxlOworICAgIGRlbGV0ZSBpbmZvOworICAgIGlmIChzcmNGRCA+PSAwKQorICAgICAgICBjbG9zZShzcmNGRCk7CisgICAgaWYgKGRlc3RGRCA+PSAwKQorICAgICAgICBjbG9zZShkZXN0RkQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2ZpbGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgc3JjRkQgPSAtMTsKKyAgICBNdHBGaWxlKiBkZXN0RmlsZSA9IE5VTEw7CisgICAgTXRwT2JqZWN0SW5mbyogc3JjSW5mbyA9IE5VTEw7CisgICAgTXRwT2JqZWN0SW5mbyogZGVzdEluZm8gPSBOVUxMOworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGU7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICBjb25zdCBjaGFyKiBsYXN0U2xhc2g7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJub3QgZW5vdWdoIGFyZ3VtZW50c1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBzcmMgPSBhcmd2WzBdOworICAgIHNyY0ZEID0gb3BlbihzcmMsIE9fUkRPTkxZKTsKKyAgICBpZiAoc3JjRkQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IG9wZW4gJXNcbiIsIHNyYyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGFyZ2MgPT0gMikgeworICAgICAgICAgY2hhciogZGVzdCA9IGFyZ3ZbMV07CisgICAgICAgIGRlc3RGaWxlID0gcGFyc2VfcGF0aChkZXN0KTsKKyAgICAgICAgaWYgKCFkZXN0RmlsZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCAlc1xuIiwgZGVzdCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXNDdXJyZW50RGlyZWN0b3J5KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgbm90IHNldFxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZGVzdEZpbGUgPSBuZXcgTXRwRmlsZShzQ3VycmVudERpcmVjdG9yeSk7CisgICAgfQorCisgICAgZGVzdEluZm8gPSBkZXN0RmlsZS0+Z2V0T2JqZWN0SW5mbygpOworICAgIGlmICghZGVzdEluZm8pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCBvYmplY3QgaW5mbyBkZXN0aW5hdGlvbiBkaXJlY3RvcnlcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChkZXN0SW5mby0+bUZvcm1hdCAhPSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVzdGluYXRpb24gbm90IGEgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChmc3RhdChzcmNGRCwgJnN0YXRidWYpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzcmNJbmZvID0gbmV3IE10cE9iamVjdEluZm8oMCk7CisgICAgc3JjSW5mby0+bVN0b3JhZ2VJRCA9IGRlc3RJbmZvLT5tU3RvcmFnZUlEOworICAgIHNyY0luZm8tPm1Gb3JtYXQgPSBNVFBfRk9STUFUX0VYSUZfSlBFRzsgIC8vIEZJWE1FCisgICAgc3JjSW5mby0+bUNvbXByZXNzZWRTaXplID0gc3RhdGJ1Zi5zdF9zaXplOworICAgIHNyY0luZm8tPm1QYXJlbnQgPSBkZXN0SW5mby0+bUhhbmRsZTsKKyAgICBsYXN0U2xhc2ggPSBzdHJyY2hyKHNyYywgJy8nKTsKKyAgICBzcmNJbmZvLT5tTmFtZSA9IHN0cmR1cChsYXN0U2xhc2ggPyBsYXN0U2xhc2ggKyAxIDogc3JjKTsKKyAgICBzcmNJbmZvLT5tRGF0ZU1vZGlmaWVkID0gc3RhdGJ1Zi5zdF9tdGltZTsKKyAgICBoYW5kbGUgPSBkZXN0RmlsZS0+Z2V0RGV2aWNlKCktPnNlbmRPYmplY3RJbmZvKHNyY0luZm8pOworICAgIGlmIChoYW5kbGUgPD0gMCkgeworICAgICAgICBwcmludGYoInNlbmRPYmplY3RJbmZvIHJldHVybmVkICUwNFhcbiIsIGhhbmRsZSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGRlc3RGaWxlLT5nZXREZXZpY2UoKS0+c2VuZE9iamVjdChzcmNJbmZvLCBzcmNGRCkpCisgICAgICAgIHJldCA9IDA7CisKK2ZhaWw6CisgICAgZGVsZXRlIGRlc3RGaWxlOworICAgIGRlbGV0ZSBzcmNJbmZvOworICAgIGRlbGV0ZSBkZXN0SW5mbzsKKyAgICBpZiAoc3JjRkQgPj0gMCkKKyAgICAgICAgY2xvc2Uoc3JjRkQpOworICAgIHByaW50ZigicmV0dXJuaW5nICVkXG4iLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3R5cGVkZWYgaW50ICgqIGNvbW1hbmRfZnVuYykoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSk7CisKK3N0cnVjdCBjb21tYW5kX3RhYmxlX2VudHJ5IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGNvbW1hbmRfZnVuYyBmdW5jOworfTsKKworY29uc3QgY29tbWFuZF90YWJsZV9lbnRyeSBjb21tYW5kX2xpc3RbXSA9IHsKKyAgICB7ICAgImNkIiwgICAgICAgc2V0X2N3ZCAgICAgICAgIH0sCisgICAgeyAgICJscyIsICAgICAgIGxpc3QgICAgICAgICAgICB9LAorICAgIHsgICAiZ2V0IiwgICAgICBnZXRfZmlsZSAgICAgICAgfSwKKyAgICB7ICAgInB1dCIsICAgICAgcHV0X2ZpbGUgICAgICAgIH0sCisgICAgeyAgIE5VTEwsICAgICAgIE5VTEwgICAgICAgICAgICB9LAorfTsKKworCitzdGF0aWMgaW50IGRvX2NvbW1hbmQoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGNvbnN0IGNvbW1hbmRfdGFibGVfZW50cnkqIGNvbW1hbmQgPSBjb21tYW5kX2xpc3Q7CisgICAgY29uc3QgY2hhciogbmFtZSA9ICphcmd2Kys7CisgICAgYXJnYy0tOworCisgICAgd2hpbGUgKGNvbW1hbmQtPm5hbWUpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoY29tbWFuZC0+bmFtZSwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gY29tbWFuZC0+ZnVuYyhhcmdjLCBhcmd2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29tbWFuZCsrOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gY29tbWFuZCAlc1xuIiwgbmFtZSk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNoZWxsKCkgeworICAgIGludCBhcmdjOworICAgIGludCByZXN1bHQgPSAwOworI2RlZmluZSBNQVhfQVJHUyAgICAxMDAKKyAgICBjaGFyKiBhcmd2W01BWF9BUkdTXTsKKworI2lmIEhBVkVfUkVBRExJTkUKKyAgICB1c2luZ19oaXN0b3J5KCk7CisjZW5kaWYKKworICAgIHdoaWxlICgxKSB7CisjaWYgSEFWRV9SRUFETElORQorICAgICAgICBjaGFyKiBsaW5lID0gcmVhZGxpbmUoUFJPTVBUKTsKKyAgICAgICAgaWYgKCFsaW5lKSB7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisjZWxzZQorICAgICAgICBjaGFyICAgIGJ1ZmZlclsxMDAwXTsKKyAgICAgICAgcHJpbnRmKCIlcyIsIFBST01QVCk7CisgICAgICAgIGNoYXIqIGxpbmUgPSBOVUxMOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gMDsKKworICAgICAgICBidWZmZXJbMF0gPSAwOworICAgICAgICBmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGRpbik7CisgICAgICAgIGludCBjb3VudCA9IHN0cmxlbihidWZmZXIpOworICAgICAgICBpZiAoY291bnQgPiAwICYmIGJ1ZmZlclswXSA9PSAoY2hhcilFT0YpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBsaW5lW2NvdW50IC0gMV0gPT0gJ1xuJykKKyAgICAgICAgICAgIGxpbmVbY291bnQgLSAxXSA9PSAwOworI2VuZGlmCisgICAgICAgIGNoYXIqIHRvayA9IHN0cnRvayhsaW5lLCAiIFx0XG5cciIpOworICAgICAgICBpZiAoIXRvaykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXN0cmNtcCh0b2ssICJxdWl0IikgfHwgIXN0cmNtcCh0b2ssICJleGl0IikpIHsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0KKyNpZiBIQVZFX1JFQURMSU5FCisgICAgICAgIGFkZF9oaXN0b3J5KGxpbmUpOworI2VuZGlmCisgICAgICAgIGFyZ2MgPSAwOworICAgICAgICB3aGlsZSAodG9rKSB7CisgICAgICAgICAgICBpZiAoYXJnYyArIDEgPT0gTUFYX0FSR1MpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IGFyZ3VtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBib3R0b21fb2ZfbG9vcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXJndlthcmdjKytdID0gc3RyZHVwKHRvayk7CisgICAgICAgICAgICB0b2sgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IGRvX2NvbW1hbmQoYXJnYywgYXJndik7CisKK2JvdHRvbV9vZl9sb29wOgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICAgICAgICAgIGZyZWUoYXJndltpXSk7CisgICAgICAgIGZyZWUobGluZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGluaXQoKTsKKworICAgIGlmIChhcmdjID09IDEpCisgICAgICAgIHJldHVybiBzaGVsbCgpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRvX2NvbW1hbmQoYXJnYyAtIDEsIGFyZ3YgKyAxKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL3BsYXllcnMvaW52b2tlX21vY2tfbWVkaWFfcGxheWVyLmNwcCBiL21lZGlhL3Rlc3RzL3BsYXllcnMvaW52b2tlX21vY2tfbWVkaWFfcGxheWVyLmNwcAppbmRleCBiM2NjOGI2Li41MzMwOGJlIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9wbGF5ZXJzL2ludm9rZV9tb2NrX21lZGlhX3BsYXllci5jcHAKKysrIGIvbWVkaWEvdGVzdHMvcGxheWVycy9pbnZva2VfbW9ja19tZWRpYV9wbGF5ZXIuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAKIHVzaW5nIGFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OOwogdXNpbmcgYW5kcm9pZDo6SVN1cmZhY2U7Cit1c2luZyBhbmRyb2lkOjpTdXJmYWNlOwogdXNpbmcgYW5kcm9pZDo6TWVkaWFQbGF5ZXJCYXNlOwogdXNpbmcgYW5kcm9pZDo6T0s7CiB1c2luZyBhbmRyb2lkOjpQYXJjZWw7CkBAIC02Nyw3ICs2OCw4IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7cmV0dXJuIE9LO30KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHtyZXR1cm4gT0s7fQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHtyZXR1cm4gT0s7fQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7cmV0dXJuIE9LO30KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKSB7cmV0dXJuIE9LO30KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpIHtyZXR1cm4gT0s7fQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSB7cmV0dXJuIE9LO30KZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmggYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3R0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTUxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3R0cy5oCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfVFRTX0gKKyNkZWZpbmUgQU5EUk9JRF9UVFNfSCAKKworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIEFuZHJvaWQgcGxhdGZvcm0KKy8vIHRvIGFjY2VzcyBUZXh0LVRvLVNwZWVjaCBmdW5jdGlvbmFsaXR5IGluIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBpbXBsZW1lbnQKKy8vIHNwZWVjaCBzeW50aGVzaXMgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlCisvLyBzeW50aGVzaXMuCisKKy8vIFRoZSBzaGFyZWQgbGlicmFyeSBtdXN0IGNvbnRhaW4gYSBmdW5jdGlvbiBuYW1lZCAiYW5kcm9pZF9nZXRUdHNFbmdpbmUiCisvLyB0aGF0IHJldHVybnMgYW4gJ2FuZHJvaWRfdHRzX2VuZ2luZV90JyBpbnN0YW5jZS4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9DT05GSUcgImVuZ2luZUNvbmZpZyIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1BJVENIICAicGl0Y2giCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9SQVRFICAgInJhdGUiCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9WT0xVTUUgInZvbHVtZSIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19TVUNDRVNTICAgICAgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfRkFJTFVSRSAgICAgICAgICAgICAgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19GRUFUVVJFX1VOU1VQUE9SVEVEICAgICA9IC0yLAorICAgIEFORFJPSURfVFRTX1ZBTFVFX0lOVkFMSUQgICAgICAgICAgID0gLTMsCisgICAgQU5EUk9JRF9UVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQgICAgPSAtNCwKKyAgICBBTkRST0lEX1RUU19QUk9QRVJUWV9TSVpFX1RPT19TTUFMTCA9IC01LAorICAgIEFORFJPSURfVFRTX01JU1NJTkdfUkVTT1VSQ0VTICAgICAgID0gLTYKK30gYW5kcm9pZF90dHNfcmVzdWx0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfTEFOR19DT1VOVFJZX1ZBUl9BVkFJTEFCTEUgPSAyLAorICAgIEFORFJPSURfVFRTX0xBTkdfQ09VTlRSWV9BVkFJTEFCTEUgICAgPSAxLAorICAgIEFORFJPSURfVFRTX0xBTkdfQVZBSUxBQkxFICAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0xBTkdfTUlTU0lOR19EQVRBICAgICAgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQgICAgICAgID0gLTIKK30gYW5kcm9pZF90dHNfc3VwcG9ydF9yZXN1bHRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19TWU5USF9ET05FICAgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfU1lOVEhfUEVORElORyAgICAgICAgICAgPSAxCit9IGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190OworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19DQUxMQkFDS19DT05USU5VRSAgICAgICA9IDEKK30gYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3Q7CisKKy8vIFN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9JTlZBTElEICAgID0gLTEsCisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0RFRkFVTFQgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fMTZfQklUID0gMSwKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUICA9IDIsCit9IGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90OworCisKKy8qIEFuIGFuZHJvaWRfdHRzX2VuZ2luZV90IG9iamVjdCBjYW4gYmUgYW55dGhpbmcsIGJ1dCBtdXN0IGhhdmUsCisgKiBhcyBpdHMgZmlyc3QgZmllbGQsIGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIGZ1bmN0aW9ucy4KKyAqCisgKiBTZWUgdGhlIGZ1bGwgZGVmaW5pdGlvbiBvZiBzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX3RfZnVuY3NfdAorICogYmVsb3cgZm9yIGRldGFpbHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190ICBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190ICpmdW5jczsKK30gYW5kcm9pZF90dHNfZW5naW5lX3Q7CisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBUVFMgRW5naW5lIHNoYXJlZCBsaWJyYXJ5CisgKiBhbmQgbXVzdCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYW4gYW5kcm9pZF90dHNfZW5naW5lX3QgbGlicmFyeS4KKyAqLworZXh0ZXJuIGFuZHJvaWRfdHRzX2VuZ2luZV90ICphbmRyb2lkX2dldFR0c0VuZ2luZSgpOworCisvKiBJbmNsdWRpbmcgdGhlIG9sZCB2ZXJzaW9uIGZvciBsZWdhY3kgc3VwcG9ydCAoRnJveW8gY29tcGF0aWJpbGl0eSkuCisgKiBUaGlzIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYXMgYW5kcm9pZF9nZXRUdHNFbmdpbmUuCisgKi8KK2V4dGVybiAiQyIgYW5kcm9pZF90dHNfZW5naW5lX3QgKmdldFR0c0VuZ2luZSgpOworCisvLyBBIGNhbGxiYWNrIHR5cGUgdXNlZCB0byBub3RpZnkgdGhlIGZyYW1ld29yayBvZiBuZXcgc3ludGhldGl6ZWQKKy8vIGF1ZGlvIHNhbXBsZXMsIHN0YXR1cyB3aWxsIGJlIFNZTlRIX0RPTkUgZm9yIHRoZSBsYXN0IHNhbXBsZSBvZgorLy8gdGhlIGxhc3QgcmVxdWVzdCwgb2YgU1lOVEhfUEVORElORyBvdGhlcndpc2UuCisvLworLy8gVGhpcyBpcyBwYXNzZWQgYnkgdGhlIGZyYW1ld29yayB0byB0aGUgZW5naW5lIHRocm91Z2ggdGhlCisvLyAnZW5naW5lX2luaXQnIGZ1bmN0aW9uIChzZWUgYmVsb3cpLgorLy8KKy8vIFRoZSBjYWxsYmFjayBmb3Igc3ludGhlc2lzIGNvbXBsZXRlZCB0YWtlczoKKy8vIEBwYXJhbSBbaW5vdXRdIHZvaWQgKiYgICAgICAgLSBUaGUgdXNlcmRhdGEgcG9pbnRlciBzZXQgaW4gdGhlIG9yaWdpbmFsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoIGNhbGwKKy8vIEBwYXJhbSBbaW5dICAgIHVpbnQzMl90ICAgICAgLSBUcmFjayBzYW1wbGluZyByYXRlIGluIEh6CisvLyBAcGFyYW0gW2luXSAgICB1aW50MzJfdCAgICAgIC0gVGhlIGF1ZGlvIGZvcm1hdAorLy8gQHBhcmFtIFtpbl0gICAgaW50ICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKy8vIEBwYXJhbSBbaW5vdXRdIGludDhfdCAqJiAgICAgLSBBIGJ1ZmZlciBvZiBhdWRpbyBkYXRhIG9ubHkgdmFsaWQgZHVyaW5nIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbGJhY2sKKy8vIEBwYXJhbSBbaW5vdXRdIHNpemVfdCAgJiAgICAgLSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisvLyBAcGFyYW0gW2luXSB0dHNfc3ludGhfc3RhdHVzIC0gaW5kaWNhdGUgd2hldGhlciB0aGUgc3ludGhlc2lzIGlzIGRvbmUsIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1vcmUgZGF0YSBpcyB0byBiZSBzeW50aGVzaXplZC4KKy8vIEByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQgdG8gaW5kaWNhdGUgdGhlIHN5bnRoZXNpcyBtdXN0IHN0b3AsCisvLyAgICAgICAgIFRUU19DQUxMQkFDS19DT05USU5VRSB0byBpbmRpY2F0ZSB0aGUgc3ludGhlc2lzIG11c3QgY29udGludWUgaWYKKy8vICAgICAgICAgICAgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHByb2R1Y2UuCit0eXBlZGVmIGFuZHJvaWRfdHRzX2NhbGxiYWNrX3N0YXR1c190ICgqYW5kcm9pZF90dHNfc3ludGhfY2JfdCkKKyAgICAgICAgICAgICh2b2lkICoqcFVzZXJEYXRhLAorICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrU2FtcGxpbmdIeiwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgIGludDhfdCAqKnBBdWRpb0J1ZmZlciwKKyAgICAgICAgICAgICBzaXplX3QgKnBCdWZmZXJTaXplLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190IHN0YXR1cyk7CisKKworLy8gVGhlIHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgdGhlIGFuZHJvaWRfdHRzX2VuZ2luZV90IG11c3QgcG9pbnQgdG8uCisvLyBOb3RlIHRoYXQgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCB0YWtlIGEgaGFuZGxlIHRvIHRoZSBlbmdpbmUgaXRzZWxmCisvLyBhcyB0aGVpciBmaXJzdCBwYXJhbWV0ZXIuCisvLworCitzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgeworICAgIC8vIHJlc2VydmVkIGZpZWxkcywgaWdub3JlZCBieSB0aGUgZnJhbWV3b3JrCisgICAgLy8gdGhleSBtdXN0IGJlIHBsYWNlZCBoZXJlIHRvIGVuc3VyZSBiaW5hcnkgY29tcGF0aWJpbGl0eQorICAgIC8vIG9mIGxlZ2FjeSBiaW5hcnkgcGx1Z2lucy4KKyAgICB2b2lkICpyZXNlcnZlZFsyXTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIFRUUyBlbmdpbmUgYW5kIHJldHVybnMgd2hldGhlciBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQuCisgICAgLy8gQHBhcmFtIHN5bnRoRG9uZUNCUHRyIHN5bnRoZXNpcyBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmluaXQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX2NiX3Qgc3ludGhEb25lUHRyLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZ2luZUNvbmZpZyk7CisKKyAgICAvLyBTaHV0IGRvd24gdGhlIFRUUyBlbmdpbmUgYW5kIHJlbGVhc2VzIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2h1dGRvd24pCisgICAgICAgICAgICAodm9pZCAqZW5naW5lKTsKKworICAgIC8vIEludGVycnVwdCBzeW50aGVzaXMgYW5kIGZsdXNoZXMgYW55IHN5bnRoZXNpemVkIGRhdGEgdGhhdCBoYXNuJ3QgYmVlbgorICAgIC8vIG91dHB1dCB5ZXQuIFRoaXMgd2lsbCBibG9jayB1bnRpbCBjYWxsYmFja3MgdW5kZXJ3YXkgYXJlIGNvbXBsZXRlZC4KKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc3RvcCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUpOworCisgICAgLy8gUmV0dXJucyB0aGUgbGV2ZWwgb2Ygc3VwcG9ydCBmb3IgdGhlIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50LgorICAgIC8vIEByZXR1cm4gVFRTX0xBTkdfQ09VTlRSWV9WQVJfQVZBSUxBQkxFIGlmIHRoZSBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCBhcmUgc3VwcG9ydGVkLAorICAgIC8vICAgICAgICAgICAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfQ09VTlRSWV9BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlIGFuZCBjb3VudHJ5IGFyZSBzdXBwb3J0ZWQgYW5kIHRoZQorICAgIC8vICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkLCBidXQgdGhlcmUgaXMgbm8gbWF0Y2ggZm9yCisgICAgLy8gICAgICAgICAgICAgdGhlIHNwZWNpZmllZCB2YXJpYW50CisgICAgLy8gICAgICAgICBUVFNfTEFOR19BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlIGlzIHN1cHBvcnRlZCBhbmQgdGhlCisgICAgLy8gICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZXMgYXJlIGNvcnJlY3RseSBpbnN0YWxsZWQsIGJ1dCB0aGVyZSBpcyBubyBtYXRjaCBmb3IKKyAgICAvLyAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGNvdW50cnkgYW5kIHZhcmlhbnQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX01JU1NJTkdfREFUQSBpZiB0aGUgcmVxdWlyZWQgcmVzb3VyY2VzIHRvIHByb3ZpZGUgYW55IGxldmVsIG9mIHN1cHBvcnQKKyAgICAvLyAgICAgICAgICAgICBmb3IgdGhlIGxhbmd1YWdlIGFyZSBub3QgY29ycmVjdGx5IGluc3RhbGxlZAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfTk9UX1NVUFBPUlRFRCBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgVFRTIGVuZ2luZS4KKyAgICBhbmRyb2lkX3R0c19zdXBwb3J0X3Jlc3VsdF90ICgqaXNMYW5ndWFnZUF2YWlsYWJsZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLiBUaGUgbG9hZGVkCisgICAgLy8gbGFuZ3VhZ2Ugd2lsbCBvbmx5IGJlIHVzZWQgb25jZSBhIGNhbGwgdG8gc2V0TGFuZ3VhZ2UoKSB3aXRoIHRoZSBzYW1lCisgICAgLy8gbGFuZ3VhZ2UgdmFsdWUgaXMgaXNzdWVkLiBMYW5ndWFnZSBhbmQgY291bnRyeSB2YWx1ZXMgYXJlIGNvZGVkIGFjY29yZGluZyB0byB0aGUgSVNPIHRocmVlCisgICAgLy8gbGV0dGVyIGNvZGVzIGZvciBsYW5ndWFnZXMgYW5kIGNvdW50cmllcywgYXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgamF2YS51dGlsLkxvY2FsZQorICAgIC8vIGluc3RhbmNlLiBUaGUgdmFyaWFudCB2YWx1ZSBpcyBlbmNvZGVkIGFzIHRoZSB2YXJpYW50IHN0cmluZyByZXRyaWV2ZWQgZnJvbSBhCisgICAgLy8gamF2YS51dGlsLkxvY2FsZSBpbnN0YW5jZSBidWlsdCB3aXRoIHRoYXQgdmFyaWFudCBkYXRhLgorICAgIC8vIEBwYXJhbSBsYW5nIHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGxhbmd1YWdlCisgICAgLy8gQHBhcmFtIGNvdW50cnkgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgY291bnRyeQorICAgIC8vIEBwYXJhbSB2YXJpYW50IHBvaW50ZXIgdG8gdGhlIHZhcmlhbnQgY29kZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpsb2FkTGFuZ3VhZ2UpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIExvYWQgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBsYW5ndWFnZSwgY291bnRyeSBhbmQgTG9jYWxlIHZhcmlhbnQuCisgICAgLy8gVGhlIGxvYWRlZCBsYW5ndWFnZSB3aWxsIG9ubHkgYmUgdXNlZCBvbmNlIGEgY2FsbCB0byBzZXRMYW5ndWFnZUZyb21Mb2NhbGUoKSB3aXRoIHRoZSBzYW1lCisgICAgLy8gbGFuZ3VhZ2UgdmFsdWUgaXMgaXNzdWVkLiBMYW5ndWFnZSBhbmQgY291bnRyeSB2YWx1ZXMgYXJlIGNvZGVkIGFjY29yZGluZyB0byB0aGUgSVNPIHRocmVlCisgICAgLy8gbGV0dGVyIGNvZGVzIGZvciBsYW5ndWFnZXMgYW5kIGNvdW50cmllcywgYXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgamF2YS51dGlsLkxvY2FsZQorICAgIC8vIGluc3RhbmNlLiBUaGUgdmFyaWFudCB2YWx1ZSBpcyBlbmNvZGVkIGFzIHRoZSB2YXJpYW50IHN0cmluZyByZXRyaWV2ZWQgZnJvbSBhCisgICAgLy8gamF2YS51dGlsLkxvY2FsZSBpbnN0YW5jZSBidWlsdCB3aXRoIHRoYXQgdmFyaWFudCBkYXRhLgorICAgIC8vIEBwYXJhbSBsYW5nIHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGxhbmd1YWdlCisgICAgLy8gQHBhcmFtIGNvdW50cnkgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgY291bnRyeQorICAgIC8vIEBwYXJhbSB2YXJpYW50IHBvaW50ZXIgdG8gdGhlIHZhcmlhbnQgY29kZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzZXRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGN1cnJlbnRseSBzZXQgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQsIG9yIGVtcHR5IHN0cmluZ3MgaWYgbm9uZSBvZgorICAgIC8vIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldC4gTGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZWlyIDMtbGV0dGVyIElTTyBjb2RlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgMy1sZXR0ZXIgY29kZSBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIEBwYXJhbVtvdXRdICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIDMtbGV0dGVyIGNvZGUgY291bnRyeSB2YWx1ZQorICAgIC8vIEBwYXJhbVtvdXRdICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIHZhcmlhbnQgdmFsdWUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqZ2V0TGFuZ3VhZ2UpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNoYXIgKmxhbmd1YWdlLAorICAgICAgICAgICAgIGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBOb3RpZmllcyB0aGUgZW5naW5lIHdoYXQgYXVkaW8gcGFyYW1ldGVycyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHN5bnRoZXNpcy4KKyAgICAvLyBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBoaW50LCB0aGUgZW5naW5lIGltcGxlbWVudGF0aW9uIHdpbGwgc2V0IHRoZSBvdXRwdXQgdmFsdWVzCisgICAgLy8gdG8gdGhvc2Ugb2YgdGhlIHN5bnRoZXNpcyBmb3JtYXQsIGJhc2VkIG9uIGEgZ2l2ZW4gaGludC4KKyAgICAvLyBAcGFyYW1baW5vdXRdIGVuY29kaW5nIGluOiB0aGUgZGVzaXJlZCBhdWRpbyBzYW1wbGUgZm9ybWF0CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcGFyYW1baW5vdXRdIHJhdGUgaW46IHRoZSBkZXNpcmVkIGF1ZGlvIHNhbXBsZSByYXRlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgc2FtcGxlIHJhdGUgdXNlZCBieSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEBwYXJhbVtpbm91dF0gY2hhbm5lbHMgaW46IHRoZSBkZXNpcmVkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG91dDogdGhlIG51bWJlciBvZiBjaGFubmVscyB1c2VkIGJ5IHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldEF1ZGlvRm9ybWF0KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCogcEVuY29kaW5nLAorICAgICAgICAgICAgIHVpbnQzMl90KiBwUmF0ZSwKKyAgICAgICAgICAgICBpbnQqIHBDaGFubmVscyk7CisKKyAgICAvLyBTZXQgYSBwcm9wZXJ0eSBmb3IgdGhlIHRoZSBUVFMgZW5naW5lCisgICAgLy8gInNpemUiIGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgInZhbHVlIiBmb3IgcHJvcGVydGllcyAicHJvcGVydHkiCisgICAgLy8gQHBhcmFtIHByb3BlcnR5IHBvaW50ZXIgdG8gdGhlIHByb3BlcnR5IG5hbWUKKyAgICAvLyBAcGFyYW0gdmFsdWUgICAgcG9pbnRlciB0byB0aGUgcHJvcGVydHkgdmFsdWUKKyAgICAvLyBAcGFyYW0gc2l6ZSAgICAgbWF4aW11bSBzaXplIHJlcXVpcmVkIHRvIHN0b3JlIHRoaXMgdHlwZSBvZiBwcm9wZXJ0eQorICAgIC8vIEByZXR1cm4gICAgICAgICBUVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQsIG9yIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRSwKKyAgICAvLyAgICAgICAgICAgICAgICAgIG9yIFRUU19WQUxVRV9JTlZBTElECisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzZXRQcm9wZXJ0eSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUpOworCisgICAgLy8gUmV0cmlldmUgYSBwcm9wZXJ0eSBmcm9tIHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHBhcmFtICAgICAgICBwcm9wZXJ0eSBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eSBuYW1lCisgICAgLy8gQHBhcmFtW291dF0gICB2YWx1ZSAgICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgbGFuZ3VhZ2UgdmFsdWUKKyAgICAvLyBAcGFyYW1baW5vdXRdIGlvc2l6ZSAgIGluOiBzdG9yZXMgdGhlIHNpemUgYXZhaWxhYmxlIHRvIHN0b3JlIHRoZQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIG91dDogc3RvcmVzIHRoZSBzaXplIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGxhbmd1YWdlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlmIGdldExhbmd1YWdlKCkgcmV0dXJuZWQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMLCB1bmNoYW5nZWQgb3RoZXJ3aXNlCisgICAgLy8gQHJldHVybiBUVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQsIG9yIFRUU19TVUNDRVNTLAorICAgIC8vICAgICAgICAgb3IgVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpnZXRQcm9wZXJ0eSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisgICAgICAgICAgICAgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgc2l6ZV90ICppb3NpemUpOworCisgICAgLy8gU3ludGhlc2l6ZSB0aGUgdGV4dC4KKyAgICAvLyBBcyB0aGUgc3ludGhlc2lzIGlzIHBlcmZvcm1lZCwgdGhlIGVuZ2luZSBpbnZva2VzIHRoZSBjYWxsYmFjayB0byBub3RpZnkKKyAgICAvLyB0aGUgVFRTIGZyYW1ld29yayB0aGF0IGl0IGhhcyBmaWxsZWQgdGhlIGdpdmVuIGJ1ZmZlciwgYW5kIGluZGljYXRlcyBob3cKKyAgICAvLyBtYW55IGJ5dGVzIGl0IHdyb3RlLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVuZ2luZQorICAgIC8vIGhhcyBnZW5lcmF0ZWQgYWxsIHRoZSBhdWRpbyBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRleHQuCisgICAgLy8gTm90ZSBhYm91dCB0aGUgZm9ybWF0IG9mIHRoZSBpbnB1dDogdGhlIHRleHQgcGFyYW1ldGVyIG1heSB1c2UgdGhlCisgICAgLy8gZm9sbG93aW5nIGVsZW1lbnRzCisgICAgLy8gYW5kIHRoZWlyIHJlc3BlY3RpdmUgYXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBTU01MIDEuMCBzcGVjaWZpY2F0aW9uOgorICAgIC8vICAgICogbGFuZworICAgIC8vICAgICogc2F5LWFzOgorICAgIC8vICAgICAgICAgIG8gaW50ZXJwcmV0LWFzCisgICAgLy8gICAgKiBwaG9uZW1lCisgICAgLy8gICAgKiB2b2ljZToKKyAgICAvLyAgICAgICAgICBvIGdlbmRlciwKKyAgICAvLyAgICAgICAgICBvIGFnZSwKKyAgICAvLyAgICAgICAgICBvIHZhcmlhbnQsCisgICAgLy8gICAgICAgICAgbyBuYW1lCisgICAgLy8gICAgKiBlbXBoYXNpcworICAgIC8vICAgICogYnJlYWs6CisgICAgLy8gICAgICAgICAgbyBzdHJlbmd0aCwKKyAgICAvLyAgICAgICAgICBvIHRpbWUKKyAgICAvLyAgICAqIHByb3NvZHk6CisgICAgLy8gICAgICAgICAgbyBwaXRjaCwKKyAgICAvLyAgICAgICAgICBvIGNvbnRvdXIsCisgICAgLy8gICAgICAgICAgbyByYW5nZSwKKyAgICAvLyAgICAgICAgICBvIHJhdGUsCisgICAgLy8gICAgICAgICAgbyBkdXJhdGlvbiwKKyAgICAvLyAgICAgICAgICBvIHZvbHVtZQorICAgIC8vICAgICogbWFyaworICAgIC8vIERpZmZlcmVuY2VzIGJldHdlZW4gdGhpcyB0ZXh0IGZvcm1hdCBhbmQgU1NNTCBhcmU6CisgICAgLy8gICAgKiBmdWxsIFNTTUwgZG9jdW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgLy8gICAgKiBuYW1lc3BhY2VzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgLy8gVGV4dCBpcyBjb2RlZCBpbiBVVEYtOC4KKyAgICAvLyBAcGFyYW0gdGV4dCAgICAgIHRoZSBVVEYtOCB0ZXh0IHRvIHN5bnRoZXNpemUKKyAgICAvLyBAcGFyYW0gdXNlcmRhdGEgIHBvaW50ZXIgdG8gYmUgcmV0dXJuZWQgd2hlbiB0aGUgY2FsbCBpcyBpbnZva2VkCisgICAgLy8gQHBhcmFtIGJ1ZmZlciAgICB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHN5bnRoZXNpemVkIGRhdGEgbXVzdCBiZSB3cml0dGVuCisgICAgLy8gQHBhcmFtIGJ1ZmZlclNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIGluIGJ1ZmZlcgorICAgIC8vIEByZXR1cm4gICAgICAgICAgVFRTX1NVQ0NFU1Mgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnN5bnRoZXNpemVUZXh0KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICAgICAgIGludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBTkRST0lEX1RUU19IICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAgYi9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKaW5kZXggNDYwYjc0Zi4uMjM5ZGMwNSAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvZWdsLmNwcApAQCAtMTk2OSw3ICsxOTY5LDcgQEAKICAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCiAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CiAgICAgLy8gVE9ETzogZWdsU3dhcEludGVydmFsKCkKLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7CisgICAgcmV0dXJuIEVHTF9UUlVFOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcCBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCmluZGV4IDJkMWEyNzguLmJjOTQ0YTAgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCisrKyBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCkBAIC01OSw2ICs1OSw4IEBACiAgICAgICAgICJFR0xfS0hSX2ltYWdlICIKICAgICAgICAgIkVHTF9LSFJfaW1hZ2VfYmFzZSAiCiAgICAgICAgICJFR0xfS0hSX2ltYWdlX3BpeG1hcCAiCisgICAgICAgICJFR0xfS0hSX2dsX3RleHR1cmVfMkRfaW1hZ2UgIgorICAgICAgICAiRUdMX0tIUl9mZW5jZV9zeW5jICIKICAgICAgICAgIkVHTF9BTkRST0lEX2ltYWdlX25hdGl2ZV9idWZmZXIgIgogICAgICAgICAiRUdMX0FORFJPSURfc3dhcF9yZWN0YW5nbGUgIgogICAgICAgICA7CkBAIC0yNDMsOSArMjQ1LDIzIEBACiAgICAgRUdMSW1hZ2VLSFIgaW1hZ2VzW0lNUExfTlVNX0lNUExFTUVOVEFUSU9OU107CiB9OwogCitzdHJ1Y3QgZWdsX3N5bmNfdCA6IHB1YmxpYyBlZ2xfb2JqZWN0X3QKK3sKKyAgICB0eXBlZGVmIGVnbF9vYmplY3RfdDo6TG9jYWxSZWY8ZWdsX3N5bmNfdCwgRUdMU3luY0tIUj4gUmVmOworCisgICAgZWdsX3N5bmNfdChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjb250ZXh0LCBFR0xTeW5jS0hSIHN5bmMpCisgICAgICAgIDogZHB5KGRweSksIGNvbnRleHQoY29udGV4dCksIHN5bmMoc3luYykKKyAgICB7CisgICAgfQorICAgIEVHTERpc3BsYXkgZHB5OworICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICBFR0xTeW5jS0hSIHN5bmM7Cit9OworCiB0eXBlZGVmIGVnbF9zdXJmYWNlX3Q6OlJlZiAgU3VyZmFjZVJlZjsKIHR5cGVkZWYgZWdsX2NvbnRleHRfdDo6UmVmICBDb250ZXh0UmVmOwogdHlwZWRlZiBlZ2xfaW1hZ2VfdDo6UmVmICAgIEltYWdlUmVmOwordHlwZWRlZiBlZ2xfc3luY190OjpSZWYgICAgIFN5bmNSZWY7CiAKIHN0cnVjdCB0bHNfdAogewpAQCAtNDgzLDYgKzQ5OSwxMSBAQAogICAgIHJldHVybiBlZ2xfdG9fbmF0aXZlX2Nhc3Q8ZWdsX2ltYWdlX3Q+KGltYWdlKTsKIH0KIAorc3RhdGljIGlubGluZQorZWdsX3N5bmNfdCogZ2V0X3N5bmMoRUdMU3luY0tIUiBzeW5jKSB7CisgICAgcmV0dXJuIGVnbF90b19uYXRpdmVfY2FzdDxlZ2xfc3luY190PihzeW5jKTsKK30KKwogc3RhdGljIGVnbF9jb25uZWN0aW9uX3QqIHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKAogICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKICAgICAgICAgZWdsX2Rpc3BsYXlfdCBjb25zdComIGRwKQpAQCAtMTc5MCw2ICsxODExLDExMSBAQAogICAgICByZXR1cm4gRUdMX1RSVUU7CiB9CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVHTF9FR0xFWFRfVkVSU0lPTiA1CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworRUdMU3luY0tIUiBlZ2xDcmVhdGVTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCit7CisgICAgRUdMQ29udGV4dCBjdHggPSBlZ2xHZXRDdXJyZW50Q29udGV4dCgpOworICAgIENvbnRleHRSZWYgX2MoY3R4KTsKKyAgICBpZiAoIV9jLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfTk9fU1lOQ19LSFIpOworICAgIGlmICghdmFsaWRhdGVfZGlzcGxheV9jb250ZXh0KGRweSwgY3R4KSkKKyAgICAgICAgcmV0dXJuIEVHTF9OT19TWU5DX0tIUjsKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICBFR0xTeW5jS0hSIHJlc3VsdCA9IEVHTF9OT19TWU5DX0tIUjsKKyAgICBpZiAoYy0+Y254LT5lZ2wuZWdsQ3JlYXRlU3luY0tIUikgeworICAgICAgICBFR0xTeW5jS0hSIHN5bmMgPSBjLT5jbngtPmVnbC5lZ2xDcmVhdGVTeW5jS0hSKAorICAgICAgICAgICAgICAgIGRwLT5kaXNwW2MtPmltcGxdLmRweSwgdHlwZSwgYXR0cmliX2xpc3QpOworICAgICAgICBpZiAoc3luYyA9PSBFR0xfTk9fU1lOQ19LSFIpCisgICAgICAgICAgICByZXR1cm4gc3luYzsKKyAgICAgICAgcmVzdWx0ID0gKGVnbF9zeW5jX3QqKW5ldyBlZ2xfc3luY190KGRweSwgY3R4LCBzeW5jKTsKKyAgICB9CisgICAgcmV0dXJuIChFR0xTeW5jS0hSKXJlc3VsdDsKK30KKworRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jKQoreworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgaWYgKGRwID09IDApIHsKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICBTeW5jUmVmIF9zKHN5bmMpOworICAgIGlmICghX3MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKKyAgICBlZ2xfc3luY190KiBzeW5jT2JqZWN0ID0gZ2V0X3N5bmMoc3luYyk7CisKKyAgICBFR0xDb250ZXh0IGN0eCA9IHN5bmNPYmplY3QtPmNvbnRleHQ7CisgICAgQ29udGV4dFJlZiBfYyhjdHgpOworICAgIGlmICghX2MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X2NvbnRleHQoZHB5LCBjdHgpKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworCisgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworCisgICAgaWYgKGMtPmNueC0+ZWdsLmVnbERlc3Ryb3lTeW5jS0hSKSB7CisgICAgICAgIHJldHVybiBjLT5jbngtPmVnbC5lZ2xEZXN0cm95U3luY0tIUigKKyAgICAgICAgICAgICAgICBkcC0+ZGlzcFtjLT5pbXBsXS5kcHksIHN5bmNPYmplY3QtPnN5bmMpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTGludCBlZ2xDbGllbnRXYWl0U3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVLSFIgdGltZW91dCkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGlmIChkcCA9PSAwKSB7CisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgfQorCisgICAgU3luY1JlZiBfcyhzeW5jKTsKKyAgICBpZiAoIV9zLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7CisgICAgZWdsX3N5bmNfdCogc3luY09iamVjdCA9IGdldF9zeW5jKHN5bmMpOworCisgICAgRUdMQ29udGV4dCBjdHggPSBzeW5jT2JqZWN0LT5jb250ZXh0OworICAgIENvbnRleHRSZWYgX2MoY3R4KTsKKyAgICBpZiAoIV9jLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgIGlmICghdmFsaWRhdGVfZGlzcGxheV9jb250ZXh0KGRweSwgY3R4KSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKworICAgIGlmIChjLT5jbngtPmVnbC5lZ2xDbGllbnRXYWl0U3luY0tIUikgeworICAgICAgICByZXR1cm4gYy0+Y254LT5lZ2wuZWdsQ2xpZW50V2FpdFN5bmNLSFIoCisgICAgICAgICAgICAgICAgZHAtPmRpc3BbYy0+aW1wbF0uZHB5LCBzeW5jT2JqZWN0LT5zeW5jLCBmbGFncywgdGltZW91dCk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KKworRUdMQm9vbGVhbiBlZ2xHZXRTeW5jQXR0cmliS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoZHAgPT0gMCkgeworICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIFN5bmNSZWYgX3Moc3luYyk7CisgICAgaWYgKCFfcy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworICAgIGVnbF9zeW5jX3QqIHN5bmNPYmplY3QgPSBnZXRfc3luYyhzeW5jKTsKKworICAgIEVHTENvbnRleHQgY3R4ID0gc3luY09iamVjdC0+Y29udGV4dDsKKyAgICBDb250ZXh0UmVmIF9jKGN0eCk7CisgICAgaWYgKCFfYy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisKKyAgICBlZ2xfY29udGV4dF90ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7CisKKyAgICBpZiAoYy0+Y254LT5lZ2wuZWdsR2V0U3luY0F0dHJpYktIUikgeworICAgICAgICByZXR1cm4gYy0+Y254LT5lZ2wuZWdsR2V0U3luY0F0dHJpYktIUigKKyAgICAgICAgICAgICAgICBkcC0+ZGlzcFtjLT5pbXBsXS5kcHksIHN5bmNPYmplY3QtPnN5bmMsIGF0dHJpYnV0ZSwgdmFsdWUpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEFORFJPSUQgZXh0ZW5zaW9ucwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbF9lbnRyaWVzLmluIGIvb3BlbmdsL2xpYnMvRUdML2VnbF9lbnRyaWVzLmluCmluZGV4IDVkODkyODcuLjYzYzNjMTkgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2xfZW50cmllcy5pbgorKysgYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2VudHJpZXMuaW4KQEAgLTUxLDYgKzUxLDEzIEBACiBFR0xfRU5UUlkoRUdMSW1hZ2VLSFIsIGVnbENyZWF0ZUltYWdlS0hSLCAgIEVHTERpc3BsYXksIEVHTENvbnRleHQsIEVHTGVudW0sIEVHTENsaWVudEJ1ZmZlciwgY29uc3QgRUdMaW50ICopCiBFR0xfRU5UUlkoRUdMQm9vbGVhbiwgIGVnbERlc3Ryb3lJbWFnZUtIUiwgIEVHTERpc3BsYXksIEVHTEltYWdlS0hSKQogCisvKiBFR0xfRUdMRVhUX1ZFUlNJT04gNSAqLworCitFR0xfRU5UUlkoRUdMU3luY0tIUiwgICBlZ2xDcmVhdGVTeW5jS0hSLCAgICAgICBFR0xEaXNwbGF5LCBFR0xlbnVtLCBjb25zdCBFR0xpbnQgKikKK0VHTF9FTlRSWShFR0xCb29sZWFuLCAgIGVnbERlc3Ryb3lTeW5jS0hSLCAgICAgIEVHTERpc3BsYXksIEVHTFN5bmNLSFIpCitFR0xfRU5UUlkoRUdMaW50LCAgICAgICBlZ2xDbGllbnRXYWl0U3luY0tIUiwgICBFR0xEaXNwbGF5LCBFR0xTeW5jS0hSLCBFR0xpbnQsIEVHTFRpbWVLSFIpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgICBlZ2xHZXRTeW5jQXR0cmliS0hSLCAgICBFR0xEaXNwbGF5LCBFR0xTeW5jS0hSLCBFR0xpbnQsIEVHTGludCAqKQorCiAvKiBBTkRST0lEIGV4dGVuc2lvbnMgKi8KIAogRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lELCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQsIEVHTGludCwgRUdMaW50LCBFR0xpbnQpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwIGIvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcAppbmRleCAxOGRkNDgzLi5mZWU0NjA5IDEwMDY0NAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwCisrKyBiL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAKQEAgLTM5LDYgKzM5LDggQEAKICN1bmRlZiBDQUxMX0dMX0FQSQogI3VuZGVmIENBTExfR0xfQVBJX1JFVFVSTgogCisjZGVmaW5lIERFQlVHX0NBTExfR0xfQVBJIDAKKwogI2lmIFVTRV9GQVNUX1RMU19LRVkKIAogICAgICNpZmRlZiBIQVZFX0FSTV9UTFNfUkVHSVNURVIKQEAgLTc0LDEwICs3NiwyNCBAQAogCiAgICAgI2RlZmluZSBBUElfRU5UUlkoX2FwaSkgX2FwaQogCisjaWYgREVCVUdfQ0FMTF9HTF9BUEkKKwogICAgICNkZWZpbmUgQ0FMTF9HTF9BUEkoX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCi0gICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKQotICAgIAorICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgR0xlbnVtIHN0YXR1cyA9IEdMX05PX0VSUk9SOyBcCisgICAgICAgIHdoaWxlICgoc3RhdHVzID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgeyBcCisgICAgICAgICAgICBMT0dEKCJbIiAjX2FwaSAiXSAweCV4Iiwgc3RhdHVzKTsgXAorICAgICAgICB9CisKKyNlbHNlCisKKyAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyAgXAorICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXyk7CisKKyNlbmRpZgorCiAgICAgI2RlZmluZSBDQUxMX0dMX0FQSV9SRVRVUk4oX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKICAgICAgICAgcmV0dXJuIF9jLT5fYXBpKF9fVkFfQVJHU19fKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NDdjYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWdsMl9wZXJmLmNwcCBcCisJZmlsbHRlc3QuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliRUdMIFwKKyAgICBsaWJHTEVTdjIgXAorICAgIGxpYnVpCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWdsMl9wZXJmCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2OWY2NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcApAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmcmFnbWVudF9zaGFkZXJzLmNwcCIKKworRklMRSAqIGZPdXQgPSBOVUxMOwordm9pZCBwdFN3YXAoKTsKKworc3RhdGljIGNoYXIgZ0N1cnJlbnRUZXN0TmFtZVsxMDI0XTsKK3N0YXRpYyB1aW50MzJfdCBnV2lkdGggPSAwOworc3RhdGljIHVpbnQzMl90IGdIZWlnaHQgPSAwOworCitzdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKKyAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKKyAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7CisgICAgICAgIExPR0UoImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBlcnJvcik7CisgICAgfQorfQorCitHTHVpbnQgbG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSkgeworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKKyAgICBpZiAoc2hhZGVyKSB7CisgICAgICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnBTb3VyY2UsIE5VTEwpOworICAgICAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgR0xpbnQgY29tcGlsZWQgPSAwOworICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7CisgICAgICAgIGlmICghY29tcGlsZWQpIHsKKyAgICAgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOworICAgICAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOworICAgICAgICAgICAgaWYgKGluZm9MZW4pIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGluZm9MZW4sIE5VTEwsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAlZDpcbiVzXG4iLCBzaGFkZXJUeXBlLCBidWYpOworICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgICAgICAgICAgc2hhZGVyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2hhZGVyOworfQorCitlbnVtIHsKKyAgICBBX1BPUywKKyAgICBBX0NPTE9SLAorICAgIEFfVEVYMCwKKyAgICBBX1RFWDEKK307CisKK0dMdWludCBjcmVhdGVQcm9ncmFtKGNvbnN0IGNoYXIqIHBWZXJ0ZXhTb3VyY2UsIGNvbnN0IGNoYXIqIHBGcmFnbWVudFNvdXJjZSkgeworICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHBWZXJ0ZXhTb3VyY2UpOworICAgIGlmICghdmVydGV4U2hhZGVyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEdMdWludCBwaXhlbFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBwRnJhZ21lbnRTb3VyY2UpOworICAgIGlmICghcGl4ZWxTaGFkZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSkgeworICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOworICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHYiKTsKKyAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgcGl4ZWxTaGFkZXIpOworICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHAiKTsKKworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX1BPUywgImFfcG9zIik7CisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfQ09MT1IsICJhX2NvbG9yIik7CisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfVEVYMCwgImFfdGV4MCIpOworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX1RFWDEsICJhX3RleDEiKTsKKyAgICAgICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKKyAgICAgICAgR0xpbnQgbGlua1N0YXR1cyA9IEdMX0ZBTFNFOworICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOworICAgICAgICBpZiAobGlua1N0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgICAgICBHTGludCBidWZMZW5ndGggPSAwOworICAgICAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmYnVmTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChidWZMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhidWZMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBidWZMZW5ndGgsIE5VTEwsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06XG4lc1xuIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKKyAgICAgICAgICAgIHByb2dyYW0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIGNoZWNrR2xFcnJvcigiY3JlYXRlUHJvZ3JhbSIpOworICAgIGdsVXNlUHJvZ3JhbShwcm9ncmFtKTsKKyAgICByZXR1cm4gcHJvZ3JhbTsKK30KKwordWludDY0X3QgZ2V0VGltZSgpIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdDsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnQpOworICAgIHJldHVybiB0LnR2X25zZWMgKyAoKHVpbnQ2NF90KXQudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwKTsKK30KKwordWludDY0X3QgZ1RpbWU7Cit2b2lkIHN0YXJ0VGltZXIoKSB7CisgICAgZ1RpbWUgPSBnZXRUaW1lKCk7Cit9CisKKworc3RhdGljIHZvaWQgZW5kVGltZXIoaW50IGNvdW50KSB7CisgICAgdWludDY0X3QgdDIgPSBnZXRUaW1lKCk7CisgICAgZG91YmxlIGRlbHRhID0gKChkb3VibGUpKHQyIC0gZ1RpbWUpKSAvIDEwMDAwMDAwMDA7CisgICAgZG91YmxlIHBpeGVscyA9IChnV2lkdGggKiBnSGVpZ2h0KSAqIGNvdW50OworICAgIGRvdWJsZSBtcHBzID0gcGl4ZWxzIC8gZGVsdGEgLyAxMDAwMDAwOworICAgIGRvdWJsZSBkYzYwID0gKChkb3VibGUpY291bnQpIC8gZGVsdGEgLyA2MDsKKworICAgIGlmIChmT3V0KSB7CisgICAgICAgIGZwcmludGYoZk91dCwgIiVzLCAlZiwgJWZcclxuIiwgZ0N1cnJlbnRUZXN0TmFtZSwgbXBwcywgZGM2MCk7CisgICAgICAgIGZmbHVzaChmT3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzLCAlZiwgJWZcbiIsIGdDdXJyZW50VGVzdE5hbWUsIG1wcHMsIGRjNjApOworICAgIH0KKyAgICBMT0dJKCIlcywgJWYsICVmXHJcbiIsIGdDdXJyZW50VGVzdE5hbWUsIG1wcHMsIGRjNjApOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyIGdWZXJ0ZXhTaGFkZXJbXSA9CisgICAgImF0dHJpYnV0ZSB2ZWM0IGFfcG9zO1xuIgorICAgICJhdHRyaWJ1dGUgdmVjNCBhX2NvbG9yO1xuIgorICAgICJhdHRyaWJ1dGUgdmVjMiBhX3RleDA7XG4iCisgICAgImF0dHJpYnV0ZSB2ZWMyIGFfdGV4MTtcbiIKKyAgICAidmFyeWluZyB2ZWM0IHZfY29sb3I7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDE7XG4iCisgICAgInVuaWZvcm0gdmVjMiB1X3RleE9mZjtcbiIKKworICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgICB2X2NvbG9yID0gYV9jb2xvcjtcbiIKKyAgICAiICAgIHZfdGV4MCA9IGFfdGV4MDtcbiIKKyAgICAiICAgIHZfdGV4MSA9IGFfdGV4MTtcbiIKKyAgICAiICAgIHZfdGV4MC54ICs9IHVfdGV4T2ZmLng7XG4iCisgICAgIiAgICB2X3RleDEueSArPSB1X3RleE9mZi55O1xuIgorICAgICIgICAgZ2xfUG9zaXRpb24gPSBhX3BvcztcbiIKKyAgICAifVxuIjsKKworc3RhdGljIHZvaWQgc2V0dXBWQSgpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdnR4W10gPSB7CisgICAgICAgIC0xLjBmLC0xLjBmLAorICAgICAgICAgMS4wZiwtMS4wZiwKKyAgICAgICAgLTEuMGYsIDEuMGYsCisgICAgICAgICAxLjBmLCAxLjBmIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGNvbG9yW10gPSB7CisgICAgICAgIDEuMGYsMC4wZiwxLjBmLDEuMGYsCisgICAgICAgIDAuMGYsMC4wZiwxLjBmLDEuMGYsCisgICAgICAgIDEuMGYsMS4wZiwwLjBmLDEuMGYsCisgICAgICAgIDEuMGYsMS4wZiwxLjBmLDEuMGYgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdGV4MFtdID0geworICAgICAgICAwLjBmLDAuMGYsCisgICAgICAgIDEuMGYsMC4wZiwKKyAgICAgICAgMC4wZiwxLjBmLAorICAgICAgICAxLjBmLDEuMGYgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdGV4MVtdID0geworICAgICAgICAxLjBmLDAuMGYsCisgICAgICAgIDEuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwxLjBmLAorICAgICAgICAwLjBmLDAuMGYgfTsKKworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9QT1MpOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9DT0xPUik7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1RFWDApOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9URVgxKTsKKworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1BPUywgMiwgR0xfRkxPQVQsIGZhbHNlLCA4LCB2dHgpOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX0NPTE9SLCA0LCBHTF9GTE9BVCwgZmFsc2UsIDE2LCBjb2xvcik7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfVEVYMCwgMiwgR0xfRkxPQVQsIGZhbHNlLCA4LCB0ZXgwKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9URVgxLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHRleDEpOworfQorCitzdGF0aWMgdm9pZCByYW5kVW5pZm9ybShpbnQgcGdtLCBjb25zdCBjaGFyICp2YXIpIHsKKyAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCB2YXIpOworICAgIGlmIChsb2MgPj0gMCkgeworICAgICAgICBmbG9hdCB4ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7CisgICAgICAgIGZsb2F0IHkgPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZmxvYXQgeiA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOworICAgICAgICBmbG9hdCB3ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7CisgICAgICAgIGdsVW5pZm9ybTRmKGxvYywgeCwgeSwgeiwgdyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkb0xvb3AoYm9vbCB3YXJtdXAsIGludCBwZ20sIHVpbnQzMl90IHBhc3NDb3VudCkgeworICAgIGlmICh3YXJtdXApIHsKKyAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7CisgICAgICAgIHB0U3dhcCgpOworICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhcnRUaW1lcigpOworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBwYXNzQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgInVfdGV4T2ZmIik7CisgICAgICAgIGdsVW5pZm9ybTJmKGxvYywgKChmbG9hdCljdCkgLyBwYXNzQ291bnQsICgoZmxvYXQpY3QpIC8gMi5mIC8gcGFzc0NvdW50KTsKKworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1X2NvbG9yIik7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMCIpOworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzEiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8yIik7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMyIpOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpOworICAgIH0KKyAgICBwdFN3YXAoKTsKKyAgICBnbEZpbmlzaCgpOworICAgIGVuZFRpbWVyKHBhc3NDb3VudCk7Cit9CisKKworc3RhdGljIHVpbnQzMl90IHJnYih1aW50MzJfdCByLCB1aW50MzJfdCBnLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQzMl90IHJldCA9IDB4ZmYwMDAwMDA7CisgICAgcmV0IHw9IHIgJiAweGZmOworICAgIHJldCB8PSAoZyAmIDB4ZmYpIDw8IDg7CisgICAgcmV0IHw9IChiICYgMHhmZikgPDwgMTY7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBnZW5UZXh0dXJlcygpIHsKKyAgICB1aW50MzJfdCAqbSA9ICh1aW50MzJfdCAqKW1hbGxvYygxMDI0KjEwMjQqNCk7CisgICAgZm9yIChpbnQgeT0wOyB5IDwgMTAyNDsgeSsrKXsKKyAgICAgICAgZm9yIChpbnQgeD0wOyB4IDwgMTAyNDsgeCsrKXsKKyAgICAgICAgICAgIG1beSoxMDI0ICsgeF0gPSByZ2IoeCwgKCgoeCt5KSAmIDB4ZmYpID09IDB4N2YpICogMHhmZiwgeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAxKTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgMTAyNCwgMTAyNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgbSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7CisKKyAgICBmb3IgKGludCB5PTA7IHkgPCAxNjsgeSsrKXsKKyAgICAgICAgZm9yIChpbnQgeD0wOyB4IDwgMTY7IHgrKyl7CisgICAgICAgICAgICBtW3kqMTYgKyB4XSA9IHJnYih4IDw8IDQsICgoKHgreSkgJiAweGYpID09IDB4NykgKiAweGZmLCB5IDw8IDQpOworICAgICAgICB9CisgICAgfQorICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMik7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDE2LCAxNiwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgbSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7CisgICAgZnJlZShtKTsKK30KKworc3RhdGljIHZvaWQgZG9TaW5nbGVUZXN0KHVpbnQzMl90IHBnbU51bSwgaW50IHRleCkgeworICAgIGNvbnN0IGNoYXIgKnBnbVR4dCA9IGdGcmFnbWVudFRlc3RzW3BnbU51bV0tPnR4dDsKKyAgICBpbnQgcGdtID0gY3JlYXRlUHJvZ3JhbShnVmVydGV4U2hhZGVyLCBwZ21UeHQpOworICAgIGlmICghcGdtKSB7CisgICAgICAgIHByaW50ZigiZXJyb3IgcnVubmluZyB0ZXN0XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgwIik7CisgICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm0xaShsb2MsIDApOworICAgIGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgInVfdGV4MSIpOworICAgIGlmIChsb2MgPj0gMCkgZ2xVbmlmb3JtMWkobG9jLCAxKTsKKworCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleCk7CisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUxKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleCk7CisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKworICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FKTsKKyAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIC8vc3ByaW50ZihzdHIyLCAiJWksICVpLCAlaSwgJWksICVpLCAwIiwKKyAgICAgICAgICAgIC8vdXNlVmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZUZpcnN0VGV4LCBleHRyYU1hdGgsIHRleDApOworICAgIC8vZG9Mb29wKHRydWUsIHBnbSwgdywgaCwgc3RyMik7CisgICAgLy9kb0xvb3AoZmFsc2UsIHBnbSwgdywgaCwgc3RyMik7CisKKyAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgc3ByaW50ZihnQ3VycmVudFRlc3ROYW1lLCAiJXMsICVpLCAlaSwgMSIsIGdGcmFnbWVudFRlc3RzW3BnbU51bV0tPm5hbWUsIHBnbU51bSwgdGV4KTsKKyAgICBkb0xvb3AodHJ1ZSwgcGdtLCAxMDApOworICAgIGRvTG9vcChmYWxzZSwgcGdtLCAxMDApOworfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsdGVzdC5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4ZmFjYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKworI2luY2x1ZGUgImZpbGxfY29tbW9uLmNwcCIKKworCitib29sIGRvVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7CisgICAgZ1dpZHRoID0gdzsKKyAgICBnSGVpZ2h0ID0gaDsKKyAgICBzZXR1cFZBKCk7CisgICAgZ2VuVGV4dHVyZXMoKTsKKworICAgIHByaW50ZigiXG52YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXG4iKTsKKworICAgIGZvciAodWludDMyX3QgbnVtID0gMDsgbnVtIDwgZ0ZyYWdtZW50VGVzdENvdW50OyBudW0rKykgeworICAgICAgICBkb1NpbmdsZVRlc3QobnVtLCAyKTsKKyAgICAgICAgaWYgKGdGcmFnbWVudFRlc3RzW251bV0tPnRleENvdW50KSB7CisgICAgICAgICAgICBkb1NpbmdsZVRlc3QobnVtLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4aXQoMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9mcmFnbWVudF9zaGFkZXJzLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZyYWdtZW50X3NoYWRlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDVlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9mcmFnbWVudF9zaGFkZXJzLmNwcApAQCAtMCwwICsxLDEzOSBAQAorCit0eXBlZGVmIHN0cnVjdCBGcmFnbWVudFRlc3RSZWMgeworCWNvbnN0IGNoYXIgKiBuYW1lOworCXVpbnQzMl90IHRleENvdW50OworCWNvbnN0IGNoYXIgKiB0eHQ7Cit9IEZyYWdtZW50VGVzdDsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcEZpbGwgPSB7CisJIlNvbGlkIGNvbG9yIiwgMCwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidW5pZm9ybSB2ZWM0IHVfY29sb3I7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICBnbF9GcmFnQ29sb3IgPSB1X2NvbG9yO1xuIgorICAgICJ9XG4iCit9OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwR3JhZGllbnQgPSB7CisJIlNvbGlkIGdyYWRpZW50IiwgMCwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyBsb3dwIHZlYzQgdl9jb2xvcjtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IHZfY29sb3I7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBDb3B5VGV4ID0geworCSJUZXh0dXJlIGNvcHkiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgorICAgICJ9XG4iCit9OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwQ29weVRleEdhbW1hID0geworCSJUZXh0dXJlIGNvcHkgd2l0aCBnYW1tYSIsIDEsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIHZlYzQgdCA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisgICAgIiAgdC5yZ2IgPSBwb3codC5yZ2IsIHZlYzMoMS40LCAxLjQsIDEuNCkpO1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IHQ7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBUZXhTcGVjID0geworCSJUZXh0dXJlIHNwZWMiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICB2ZWM0IHQgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgorICAgICIgIGZsb2F0IHNpbVNwZWMgPSBkb3QoZ2xfRnJhZ0Nvb3JkLnh5eiwgZ2xfRnJhZ0Nvb3JkLnh5eik7XG4iCisgICAgIiAgc2ltU3BlYyA9IHBvdyhjbGFtcChzaW1TcGVjLCAwLjEsIDEuMCksIDQwLjApO1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IHQgKyB2ZWM0KHNpbVNwZWMsIHNpbVNwZWMsIHNpbVNwZWMsIHNpbVNwZWMpO1xuIgorICAgICJ9XG4iCit9OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwRGVwVGV4ID0geworCSJEZXBlbmRlbnQgTG9va3VwIiwgMSwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgdmVjNCB0ID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKKyAgICAiICB0ICs9IHRleHR1cmUyRCh1X3RleDAsIHQueHkpO1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IHQ7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBNb2R1bGF0ZUNvbnN0YW50VGV4ID0geworCSJUZXh0dXJlIG1vZHVsYXRlIGNvbnN0YW50IiwgMSwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV9jb2xvcjtcbiIKKworICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgbG93cCB2ZWM0IGMgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgorCSIgIGMgKj0gdV9jb2xvcjtcbiIKKyAgICAiICBnbF9GcmFnQ29sb3IgPSBjO1xuIgorICAgICJ9XG4iCit9OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwTW9kdWxhdGVWYXJ5aW5nVGV4ID0geworCSJUZXh0dXJlIG1vZHVsYXRlIGdyYWRpZW50IiwgMSwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidmFyeWluZyBsb3dwIHZlYzQgdl9jb2xvcjtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICBsb3dwIHZlYzQgYyA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisJIiAgYyAqPSB2X2NvbG9yO1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IGM7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBNb2R1bGF0ZVZhcnlpbmdDb25zdGFudFRleCA9IHsKKwkiVGV4dHVyZSBtb2R1bGF0ZSBncmFkaWVudCBjb25zdGFudCIsIDEsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInZhcnlpbmcgbG93cCB2ZWM0IHZfY29sb3I7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKyAgICAidW5pZm9ybSB2ZWM0IHVfY29sb3I7XG4iCisKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIGxvd3AgdmVjNCBjID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKKwkiICBjICo9IHZfY29sb3I7XG4iCisJIiAgYyAqPSB1X2NvbG9yO1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IGM7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgKmdGcmFnbWVudFRlc3RzW10gPSB7CisJJmZwRmlsbCwKKwkmZnBHcmFkaWVudCwKKwkmZnBDb3B5VGV4LAorCSZmcENvcHlUZXhHYW1tYSwKKyAgICZmcFRleFNwZWMsCisgICAmZnBEZXBUZXgsCisJJmZwTW9kdWxhdGVDb25zdGFudFRleCwKKwkmZnBNb2R1bGF0ZVZhcnlpbmdUZXgsCisJJmZwTW9kdWxhdGVWYXJ5aW5nQ29uc3RhbnRUZXgsCisKK307CisKK3N0YXRpYyBjb25zdCBzaXplX3QgZ0ZyYWdtZW50VGVzdENvdW50ID0gc2l6ZW9mKGdGcmFnbWVudFRlc3RzKSAvIHNpemVvZihnRnJhZ21lbnRUZXN0c1swXSk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9nbDJfcGVyZi5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9nbDJfcGVyZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmY2YxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2dsMl9wZXJmLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgorI2luY2x1ZGUgPHVpL0VHTFV0aWxzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisKK3N0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoY29uc3QgY2hhciogb3AsIEVHTEJvb2xlYW4gcmV0dXJuVmFsID0gRUdMX1RSVUUpIHsKKyAgICBpZiAocmV0dXJuVmFsICE9IEVHTF9UUlVFKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoKSByZXR1cm5lZCAlZFxuIiwgb3AsIHJldHVyblZhbCk7CisgICAgfQorCisgICAgZm9yIChFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOyBlcnJvciAhPSBFR0xfU1VDQ0VTUzsgZXJyb3IKKyAgICAgICAgICAgID0gZWdsR2V0RXJyb3IoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZWdsRXJyb3IgJXMgKDB4JXgpXG4iLCBvcCwgRUdMVXRpbHM6OnN0cmVycm9yKGVycm9yKSwKKyAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKKyAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKKyAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKKyAgICB9Cit9CisKK2Jvb2wgZG9UZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOworCitzdGF0aWMgRUdMRGlzcGxheSBkcHk7CitzdGF0aWMgRUdMU3VyZmFjZSBzdXJmYWNlOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBFR0xCb29sZWFuIHJldHVyblZhbHVlOworICAgIEVHTENvbmZpZyBteUNvbmZpZyA9IHswfTsKKworICAgIEVHTGludCBjb250ZXh0X2F0dHJpYnNbXSA9IHsgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTF9OT05FIH07CisgICAgRUdMaW50IHNfY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1dJTkRPV19CSVQsCisgICAgICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCisgICAgICAgICAgICBFR0xfTk9ORSB9OworICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgRUdMaW50IHcsIGg7CisKKworICAgIGNoZWNrRWdsRXJyb3IoIjxpbml0PiIpOworICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsR2V0RGlzcGxheSIpOworICAgIGlmIChkcHkgPT0gRUdMX05PX0RJU1BMQVkpIHsKKyAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IHJldHVybmVkIEVHTF9OT19ESVNQTEFZLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVyblZhbHVlID0gZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgIGNoZWNrRWdsRXJyb3IoImVnbEluaXRpYWxpemUiLCByZXR1cm5WYWx1ZSk7CisgICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7CisgICAgICAgIHByaW50ZigiZWdsSW5pdGlhbGl6ZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsNCisgICAgcmV0dXJuVmFsdWUgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KGRweSwgc19jb25maWdBdHRyaWJzLCB3aW5kb3csICZteUNvbmZpZyk7CisgICAgaWYgKHJldHVyblZhbHVlKSB7CisgICAgICAgIHByaW50ZigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdygpIHJldHVybmVkICVkIiwgcmV0dXJuVmFsdWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjaGVja0VnbEVycm9yKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93Iik7CisKKyAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIG15Q29uZmlnLCB3aW5kb3csIE5VTEwpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UiKTsKKyAgICBpZiAoc3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICBwcmludGYoImdlbENyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgbXlDb25maWcsIEVHTF9OT19DT05URVhULCBjb250ZXh0X2F0dHJpYnMpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKKyAgICBpZiAoY29udGV4dCA9PSBFR0xfTk9fQ09OVEVYVCkgeworICAgICAgICBwcmludGYoImVnbENyZWF0ZUNvbnRleHQgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVyblZhbHVlID0gZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xNYWtlQ3VycmVudCIsIHJldHVyblZhbHVlKTsKKyAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOworICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKKyAgICBHTGludCBkaW0gPSB3IDwgaCA/IHcgOiBoOworCisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZG9UZXN0KHcsIGgpOworICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xTd2FwQnVmZmVycyIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIHB0U3dhcCgpIHsKKyAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDc1YTc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE9wZW5HTCBFUyBQZXJmIEFwcAorIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkgIyBub3QgNjQgYml0IGNsZWFuCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhY3Rpdml0eQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEdMUGVyZgorCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJnbHBlcmYKKworIyBSdW4gb24gRWNsYWlyCitMT0NBTF9TREtfVkVSU0lPTiA6PSA3CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJ1aWxkIEpOSSBTaGFyZWQgTGlicmFyeQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitMT0NBTF9QQVRIOj0gJChMT0NBTF9QQVRIKS9qbmkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgT3B0aW9uYWwgdGFnIHdvdWxkIG1lYW4gaXQgZG9lc24ndCBnZXQgaW5zdGFsbGVkIGJ5IGRlZmF1bHQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgZ2xfY29kZS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlidXRpbHMgXAorCWxpYkVHTCBcCisJbGliR0xFU3YyCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJnbHBlcmYKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitlbmRpZiAjIFRBUkdFVF9TSU1VTEFUT1IKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNWQ5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5nbHBlcmYiCisgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wLjAiIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEwMDAwIiA+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iNyIgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSI3IiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZ2xwZXJmX2FjdGl2aXR5Ij4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR0xQZXJmQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgorICAgICAgICAgICAgCWFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKKyAgICAgICAgICAgIAlhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL2puaS9nbF9jb2RlLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL2puaS9nbF9jb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTkzMzcxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvam5pL2dsX2NvZGUuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvLyBPcGVuR0wgRVMgMi4wIGNvZGUKKworI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9qbmkuaD4KKyNkZWZpbmUgTE9HX1RBRyAiR0xQZXJmIGdsX2NvZGUuY3BwIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICIuLi8uLi9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcCIKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBXaWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzY3JlZW4KKwordWludDMyX3QgdzsKK3VpbnQzMl90IGg7CisKKy8vIFRoZSBzdGF0ZUNsb2NrIHN0YXJ0cyBhdCB6ZXJvIGFuZCBpbmNyZW1lbnRzIGJ5IDEgZXZlcnkgdGltZSB3ZSBkcmF3IGEgZnJhbWUuIEl0IGlzIHVzZWQgdG8gY29udHJvbCB3aGljaCBwaGFzZSBvZiB0aGUgdGVzdCB3ZSBhcmUgaW4uCisKK2ludCBzdGF0ZUNsb2NrOworY29uc3QgaW50IGRvTG9vcFN0YXRlcyA9IDI7Citjb25zdCBpbnQgZG9TaW5nbGVUZXN0U3RhdGVzID0gMjsKK2Jvb2wgZG9uZTsKKworLy8gU2F2ZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHRlc3QgKHNvIHdlIGNhbiBwcmludCB0aGVtIG91dCB3aGVuIHdlIGZpbmlzaCB0aGUgdGltaW5nLikKKworCitpbnQgcGdtOworCit2b2lkIHB0U3dhcCgpIHsKK30KKwordm9pZCBkb1Rlc3QoKSB7CisgICAgdWludDMyX3QgdGVzdE51bSA9IHN0YXRlQ2xvY2sgPj4gMjsKKyAgICBpbnQgdGV4U2l6ZSA9ICgoc3RhdGVDbG9jayA+PiAxKSAmIDB4MSkgKyAxOworCisgICAgaWYgKHRlc3ROdW0gPj0gZ0ZyYWdtZW50VGVzdENvdW50KSB7CisgICAgICAgTE9HSSgiZG9uZVxuIik7CisgICAgICAgaWYgKGZPdXQpIHsKKyAgICAgICAgICAgZmNsb3NlKGZPdXQpOworICAgICAgICAgICBmT3V0ID0gTlVMTDsKKyAgICAgICB9CisgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIExPR0koImRvVGVzdCAlZCAlZCAlZFxuIiwgdGV4Q291bnQsIGV4dHJhTWF0aCwgdGVzdFN1YlN0YXRlKTsKKworLy8gICAgICAgIGZvciAodWludDMyX3QgbnVtID0gMDsgbnVtIDwgZ0ZyYWdtZW50VGVzdENvdW50OyBudW0rKykgeworICAgIGRvU2luZ2xlVGVzdCh0ZXN0TnVtLCB0ZXhTaXplKTsKK30KKworZXh0ZXJuICJDIiB7CisgICAgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfaW5pdChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqLCAgamludCB3aWR0aCwgamludCBoZWlnaHQpOworICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX3N0ZXAoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaik7Cit9OworCitKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosICBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkKK3sKKyAgICBnV2lkdGggPSB3aWR0aDsKKyAgICBnSGVpZ2h0ID0gaGVpZ2h0OworICAgIGlmICghZG9uZSkgeworICAgICAgICAgICAgc3RhdGVDbG9jayA9IDA7CisgICAgICAgICAgICBkb25lID0gZmFsc2U7CisgICAgICAgICAgICBzZXR1cFZBKCk7CisgICAgICAgICAgICBnZW5UZXh0dXJlcygpOworICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZU5hbWUgPSAiL3NkY2FyZC9nbHBlcmYuY3N2IjsKKyAgICAgICAgICAgIGlmIChmT3V0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgTE9HSSgiQ2xvc2luZyBwYXJ0aWFsbHkgd3JpdHRlbiBvdXRwdXQubiIpOworICAgICAgICAgICAgICAgICBmY2xvc2UoZk91dCk7CisgICAgICAgICAgICAgICAgIGZPdXQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HSSgiV3JpdGluZyB0bzogJXNcbiIsZmlsZU5hbWUpOworICAgICAgICAgICAgZk91dCA9IGZvcGVuKGZpbGVOYW1lLCAidyIpOworICAgICAgICAgICAgaWYgKGZPdXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBvcGVuOiAlc1xuIiwgZmlsZU5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0dJKCJcbnZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGUsIGV4dHJhTWF0aCwgdGV4U2l6ZSwgYmxlbmQsIE1wcHMsIERDNjBcbiIpOworICAgICAgICAgICAgaWYgKGZPdXQpIGZwcmludGYoZk91dCwidmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZSwgZXh0cmFNYXRoLCB0ZXhTaXplLCBibGVuZCwgTXBwcywgREM2MFxyXG4iKTsKKyAgICB9Cit9CisKK0pOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX3N0ZXAoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaikKK3sKKyAgICBpZiAoISBkb25lKSB7CisgICAgICAgIGlmIChzdGF0ZUNsb2NrID4gMCAmJiAoKHN0YXRlQ2xvY2sgJiAxKSA9PSAwKSkgeworICAgICAgICAgICAgLy9lbmRUaW1lcigxMDApOworICAgICAgICB9CisgICAgICAgIGRvVGVzdCgpOworICAgICAgICBzdGF0ZUNsb2NrKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMjEwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZworICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJnbHBlcmZfYWN0aXZpdHkiPkdMUGVyZjwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjNhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZ2xwZXJmOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworCitwdWJsaWMgY2xhc3MgR0xQZXJmQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBHTFBlcmZWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKwlnZXRXaW5kb3coKS5zZXRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OLCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OKTsKKyAgICAgICAgbVZpZXcgPSBuZXcgR0xQZXJmVmlldyhnZXRBcHBsaWNhdGlvbigpKTsKKwlzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkxpYi5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZMaWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWEwZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZMaWIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7CisKKy8vIFdyYXBwZXIgZm9yIG5hdGl2ZSBsaWJyYXJ5CisKK3B1YmxpYyBjbGFzcyBHTFBlcmZMaWIgeworCisgICAgIHN0YXRpYyB7CisgICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImdscGVyZiIpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gd2lkdGggdGhlIGN1cnJlbnQgdmlldyB3aWR0aAorICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGN1cnJlbnQgdmlldyBoZWlnaHQKKyAgICAgKi8KKyAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBpbml0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RlcCgpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2U0YTRkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZWaWV3LmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgorICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQorICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQorICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKKyAqIGluc3RhbmNlLgorICovCitjbGFzcyBHTFBlcmZWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJHTFBlcmZWaWV3IjsKKworICAgIHB1YmxpYyBHTFBlcmZWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdChmYWxzZSwgMCwgMCk7CisgICAgfQorCisgICAgcHVibGljIEdMUGVyZlZpZXcoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHRyYW5zbHVjZW50LCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0KHRyYW5zbHVjZW50LCBkZXB0aCwgc3RlbmNpbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoYm9vbGVhbiB0cmFuc2x1Y2VudCwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgeworICAgICAgICBzZXRFR0xDb250ZXh0RmFjdG9yeShuZXcgQ29udGV4dEZhY3RvcnkoKSk7CisgICAgICAgIHNldEVHTENvbmZpZ0Nob29zZXIoIHRyYW5zbHVjZW50ID8KKyAgICAgICAgICAgICAgbmV3IENvbmZpZ0Nob29zZXIoOCw4LDgsOCwgZGVwdGgsIHN0ZW5jaWwpIDoKKyAgICAgICAgICAgICAgbmV3IENvbmZpZ0Nob29zZXIoNSw2LDUsMCwgZGVwdGgsIHN0ZW5jaWwpKTsKKyAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRleHRGYWN0b3J5IGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5FR0xDb250ZXh0RmFjdG9yeSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiA9IDB4MzA5ODsKKyAgICAgICAgcHVibGljIEVHTENvbnRleHQgY3JlYXRlQ29udGV4dChFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGVnbENvbmZpZykgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiY3JlYXRpbmcgT3BlbkdMIEVTIDIuMCBjb250ZXh0Iik7CisgICAgICAgICAgICBjaGVja0VnbEVycm9yKCJCZWZvcmUgZWdsQ3JlYXRlQ29udGV4dCIsIGVnbCk7CisgICAgICAgICAgICBpbnRbXSBhdHRyaWJfbGlzdCA9IHtFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMMTAuRUdMX05PTkUgfTsKKyAgICAgICAgICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbC5lZ2xDcmVhdGVDb250ZXh0KGRpc3BsYXksIGVnbENvbmZpZywgRUdMMTAuRUdMX05PX0NPTlRFWFQsIGF0dHJpYl9saXN0KTsKKyAgICAgICAgICAgIGNoZWNrRWdsRXJyb3IoIkFmdGVyIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95Q29udGV4dChFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBlZ2wuZWdsRGVzdHJveUNvbnRleHQoZGlzcGxheSwgY29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoU3RyaW5nIHByb21wdCwgRUdMMTAgZWdsKSB7CisgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgd2hpbGUgKChlcnJvciA9IGVnbC5lZ2xHZXRFcnJvcigpKSAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgTG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCIlczogRUdMIGVycm9yOiAweCV4IiwgcHJvbXB0LCBlcnJvcikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29uZmlnQ2hvb3NlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuRUdMQ29uZmlnQ2hvb3NlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBFR0xfT1BFTkdMX0VTMl9CSVQgPSA0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBzX2NvbmZpZ0F0dHJpYnMyID0KKyAgICAgICAgeworICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCA0LAorICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDQsCisgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCA0LAorICAgICAgICAgICAgRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAorICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgQ29uZmlnQ2hvb3NlcihpbnQgciwgaW50IGcsIGludCBiLCBpbnQgYSwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgeworICAgICAgICAgICAgbVJlZFNpemUgPSByOworICAgICAgICAgICAgbUdyZWVuU2l6ZSA9IGc7CisgICAgICAgICAgICBtQmx1ZVNpemUgPSBiOworICAgICAgICAgICAgbUFscGhhU2l6ZSA9IGE7CisgICAgICAgICAgICBtRGVwdGhTaXplID0gZGVwdGg7CisgICAgICAgICAgICBtU3RlbmNpbFNpemUgPSBzdGVuY2lsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXkpIHsKKworICAgICAgICAgICAgaW50W10gbnVtX2NvbmZpZyA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIHNfY29uZmlnQXR0cmliczIsIG51bGwsIDAsIG51bV9jb25maWcpOworCisgICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IG51bV9jb25maWdbMF07CisKKyAgICAgICAgICAgIGlmIChudW1Db25maWdzIDw9IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWdzIG1hdGNoIGNvbmZpZ1NwZWMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUNvbmZpZ3NdOworICAgICAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBzX2NvbmZpZ0F0dHJpYnMyLCBjb25maWdzLCBudW1Db25maWdzLCBudW1fY29uZmlnKTsKKyAgICAgICAgICAgIC8vIHByaW50Q29uZmlncyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOworICAgICAgICAgICAgcmV0dXJuIGNob29zZUNvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncykgeworICAgICAgICAgICAgRUdMQ29uZmlnIGNsb3Nlc3RDb25maWcgPSBudWxsOworICAgICAgICAgICAgaW50IGNsb3Nlc3REaXN0YW5jZSA9IDEwMDA7CisgICAgICAgICAgICBmb3IoRUdMQ29uZmlnIGNvbmZpZyA6IGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICBpbnQgZCA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgaW50IHMgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKGQgPj0gbURlcHRoU2l6ZSAmJiBzPj0gbVN0ZW5jaWxTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGludCByID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBhID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBkaXN0YW5jZSA9IE1hdGguYWJzKHIgLSBtUmVkU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhnIC0gbUdyZWVuU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhiIC0gbUJsdWVTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGEgLSBtQWxwaGFTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RDb25maWcgPSBjb25maWc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2xvc2VzdENvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGZpbmRDb25maWdBdHRyaWIoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworCisgICAgICAgICAgICBpZiAoZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgbVZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWVbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHByaW50Q29uZmlncyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKKyAgICAgICAgICAgIGludCBudW1Db25maWdzID0gY29uZmlncy5sZW5ndGg7CisgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiVkIGNvbmZpZ3VyYXRpb25zIiwgbnVtQ29uZmlncykpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkNvbmZpZ3VyYXRpb24gJWQ6XG4iLCBpKSk7CisgICAgICAgICAgICAgICAgcHJpbnRDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgICAgICBpbnRbXSBhdHRyaWJ1dGVzID0geworICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTkZJR19DQVZFQVQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT05GSUdfSUQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX1BJWEVMUywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX1dJRFRILAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1JFTkRFUkFCTEUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfVklTVUFMX0lELAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1ZJU1VBTF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAweDMwMzAsIC8vIEVHTDEwLkVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU0FNUExFUywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NBTVBMRV9CVUZGRVJTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1VSRkFDRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDM5LCAvLyBFR0wxMC5FR0xfQklORF9UT19URVhUVVJFX1JHQiwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDNBLCAvLyBFR0wxMC5FR0xfQklORF9UT19URVhUVVJFX1JHQkEsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzQiwgLy8gRUdMMTAuRUdMX01JTl9TV0FQX0lOVEVSVkFMLAorICAgICAgICAgICAgICAgICAgICAweDMwM0MsIC8vIEVHTDEwLkVHTF9NQVhfU1dBUF9JTlRFUlZBTCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0xVTUlOQU5DRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfTUFTS19TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09MT1JfQlVGRkVSX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIDB4MzA0MiAvLyBFR0wxMC5FR0xfQ09ORk9STUFOVAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVzID0geworICAgICAgICAgICAgICAgICAgICAiRUdMX0JVRkZFUl9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9BTFBIQV9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CTFVFX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0dSRUVOX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1JFRF9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9ERVBUSF9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TVEVOQ0lMX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZJR19DQVZFQVQiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZJR19JRCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTEVWRUwiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX0hFSUdIVCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfUElYRUxTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9XSURUSCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1JFTkRFUkFCTEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9WSVNVQUxfSUQiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9WSVNVQUxfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfUFJFU0VSVkVEX1JFU09VUkNFUyIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfU0FNUExFUyIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfU0FNUExFX0JVRkZFUlMiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1NVUkZBQ0VfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQklORF9UT19URVhUVVJFX1JHQiIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQklORF9UT19URVhUVVJFX1JHQkEiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01JTl9TV0FQX0lOVEVSVkFMIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfU1dBUF9JTlRFUlZBTCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTFVNSU5BTkNFX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0FMUEhBX01BU0tfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09MT1JfQlVGRkVSX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1JFTkRFUkFCTEVfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORk9STUFOVCIKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpbnRbXSB2YWx1ZSA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlID0gYXR0cmlidXRlc1tpXTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOworICAgICAgICAgICAgICAgIGlmICggZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiICAlczogJWRcbiIsIG5hbWUsIHZhbHVlWzBdKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIgICVzOiBmYWlsZWRcbiIsIG5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVnbC5lZ2xHZXRFcnJvcigpICE9IEVHTDEwLkVHTF9TVUNDRVNTKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdWJjbGFzc2VzIGNhbiBhZGp1c3QgdGhlc2UgdmFsdWVzOgorICAgICAgICBwcm90ZWN0ZWQgaW50IG1SZWRTaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1HcmVlblNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbUJsdWVTaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1BbHBoYVNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbURlcHRoU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtU3RlbmNpbFNpemU7CisgICAgICAgIHByaXZhdGUgaW50W10gbVZhbHVlID0gbmV3IGludFsxXTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7CisgICAgICAgICAgICBHTFBlcmZMaWIuc3RlcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgIEdMUGVyZkxpYi5pbml0KHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDBhYmYzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRlc3QgZnJhbWVyYXRlIGFuZCBsb29rIGZvciBoaWNjdXBzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhY3Rpdml0eQorCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVzdEZyYW1lcmF0ZQorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNDM0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdGZyYW1lcmF0ZSI+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iOCIgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSI4IiAvPgorCisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Rlc3RGcmFtZXJhdGVfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0RnJhbWVyYXRlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YjMwODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKKyAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0idGVzdEZyYW1lcmF0ZV9hY3Rpdml0eSI+VGVzdEZyYW1lcmF0ZTwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvc3JjL2NvbS9hbmRyb2lkL3Rlc3RmcmFtZXJhdGUvVGVzdEZyYW1lcmF0ZUFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmUyNzliCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvc3JjL2NvbS9hbmRyb2lkL3Rlc3RmcmFtZXJhdGUvVGVzdEZyYW1lcmF0ZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdGZyYW1lcmF0ZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKworcHVibGljIGNsYXNzIFRlc3RGcmFtZXJhdGVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIFRlc3RGcmFtZXJhdGVWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgbVZpZXcgPSBuZXcgVGVzdEZyYW1lcmF0ZVZpZXcoZ2V0QXBwbGljYXRpb24oKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICAgICAgbVZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlVmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvc3JjL2NvbS9hbmRyb2lkL3Rlc3RmcmFtZXJhdGUvVGVzdEZyYW1lcmF0ZVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2ZiNWRlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvc3JjL2NvbS9hbmRyb2lkL3Rlc3RmcmFtZXJhdGUvVGVzdEZyYW1lcmF0ZVZpZXcuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0ZnJhbWVyYXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CisKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTEVTMjA7CisKK2NsYXNzIFRlc3RGcmFtZXJhdGVWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJUZXN0RnJhbWVyYXRlVmlldyI7CisKKyAgICBwdWJsaWMgVGVzdEZyYW1lcmF0ZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBzZXRFR0xDb250ZXh0Q2xpZW50VmVyc2lvbigyKTsKKyAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBtTGFzdFRpbWVfdXMgPSAwOworICAgIHByaXZhdGUgbG9uZyBtTnVtU2hvcnRGcmFtZXNFbGFwc2VkID0gMDsKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJUaW1lKGxvbmcgbm93X3VzKSB7CisgICAgICAgIGxvbmcgbG9uZ0ZyYW1lVGltZV9tcyA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtUHJvcGVydGllcy5nZXQoImRlYnVnLmxvbmdmcmFtZV9tcyIsICIxNiIpKTsKKyAgICAgICAgbG9uZyBlbGFwc2VkVGltZV91cyA9IG5vd191cyAtIG1MYXN0VGltZV91czsKKyAgICAgICAgZmxvYXQgZnBzID0gMTAwMDAwMC5mIC8gZWxhcHNlZFRpbWVfdXM7CisgICAgICAgIGlmIChtTGFzdFRpbWVfdXMgPiAwICYmIGVsYXBzZWRUaW1lX3VzID4gbG9uZ0ZyYW1lVGltZV9tcyoxMDAwKSB7CisgICAgICAgICAgTG9nLnYoVEFHLCAiTG9uZyBmcmFtZTogIiArIGVsYXBzZWRUaW1lX3VzLzEwMDAuZiArICIgbXMgKCIgKyBmcHMgKyAiIGZwcykiKTsKKyAgICAgICAgICBpZiAobU51bVNob3J0RnJhbWVzRWxhcHNlZCA+IDApIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIiAgU2hvcnQgZnJhbWVzIHNpbmNlIGxhc3QgbG9uZyBmcmFtZTogIiArIG1OdW1TaG9ydEZyYW1lc0VsYXBzZWQpOworICAgICAgICAgICAgbU51bVNob3J0RnJhbWVzRWxhcHNlZCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKyttTnVtU2hvcnRGcmFtZXNFbGFwc2VkOworICAgICAgICB9CisKKyAgICAgICAgbUxhc3RUaW1lX3VzID0gbm93X3VzOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKKyAgICAgICAgcHVibGljIFJlbmRlcmVyKCkgeworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7CisgICAgICAgICAgICBsb25nIG5vd191cyA9IFN5c3RlbS5uYW5vVGltZSgpIC8gMTAwMDsKKyAgICAgICAgICAgIHJlZ2lzdGVyVGltZShub3dfdXMpOworCisgICAgICAgICAgICBmbG9hdCByZWQgPSAobm93X3VzICUgMTAwMDAwMCkgLyAxMDAwMDAwLmY7CisgICAgICAgICAgICBmbG9hdCBncmVlbiA9IChub3dfdXMgJSAyMDAwMDAwKSAvIDIwMDAwMDAuZjsKKyAgICAgICAgICAgIGZsb2F0IGJsdWUgPSAobm93X3VzICUgMzAwMDAwMCkgLyAzMDAwMDAwLmY7CisgICAgICAgICAgICBHTEVTMjAuZ2xDbGVhckNvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIDEuMGYpOworICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXIoR0xFUzIwLkdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgIEdMRVMyMC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0MTdjNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGVzdCBlbmQtdG8tZW5kIGxhdGVuY3kuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhY3Rpdml0eQorCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDgKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVzdExhdGVuY3kKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTI2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RsYXRlbmN5Ij4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGVzdExhdGVuY3lfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0TGF0ZW5jeUFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDk5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InRlc3RMYXRlbmN5X2FjdGl2aXR5Ij5UZXN0TGF0ZW5jeTwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3NyYy9jb20vYW5kcm9pZC90ZXN0bGF0ZW5jeS9UZXN0TGF0ZW5jeUFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvc3JjL2NvbS9hbmRyb2lkL3Rlc3RsYXRlbmN5L1Rlc3RMYXRlbmN5QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDk5M2NiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3NyYy9jb20vYW5kcm9pZC90ZXN0bGF0ZW5jeS9UZXN0TGF0ZW5jeUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdGxhdGVuY3k7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisKK3B1YmxpYyBjbGFzcyBUZXN0TGF0ZW5jeUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgVGVzdExhdGVuY3lWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgbVZpZXcgPSBuZXcgVGVzdExhdGVuY3lWaWV3KGdldEFwcGxpY2F0aW9uKCkpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgICAgIG1WaWV3LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3NyYy9jb20vYW5kcm9pZC90ZXN0bGF0ZW5jeS9UZXN0TGF0ZW5jeVZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9zcmMvY29tL2FuZHJvaWQvdGVzdGxhdGVuY3kvVGVzdExhdGVuY3lWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyYmYxNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9zcmMvY29tL2FuZHJvaWQvdGVzdGxhdGVuY3kvVGVzdExhdGVuY3lWaWV3LmphdmEKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RsYXRlbmN5OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKKworaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgorICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQorICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQorICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKKyAqIGluc3RhbmNlLgorICovCitjbGFzcyBUZXN0TGF0ZW5jeVZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RMYXRlbmN5aWV3IjsKKyAgICBwcml2YXRlIGZsb2F0IG1YOworICAgIHByaXZhdGUgZmxvYXQgbVk7CisgICAgcHJpdmF0ZSBmbG9hdCBtRFg7CisgICAgcHJpdmF0ZSBmbG9hdCBtRFk7CisgICAgcHJpdmF0ZSBsb25nICBtVDsKKyAgICBwcml2YXRlIGxvbmcgIG1EVDsKKworICAgIHB1YmxpYyBUZXN0TGF0ZW5jeVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBzZXRFR0xDb250ZXh0Q2xpZW50VmVyc2lvbigyKTsKKyAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEFjdGlvbigpKSB7CisgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICBmbG9hdCB4ID0gZXZlbnQuZ2V0WCgpOworICAgICAgICAgICAgZmxvYXQgeSA9IGV2ZW50LmdldFkoKTsKKyAgICAgICAgICAgIGxvbmcgIHQgPSBldmVudC5nZXRFdmVudFRpbWUoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgbURUID0gdCAtIG1UOworICAgICAgICAgICAgICAgIG1UID0gdDsKKyAgICAgICAgICAgICAgICBtRFggPSB4IC0gbVg7CisgICAgICAgICAgICAgICAgbVggPSB4OworICAgICAgICAgICAgICAgIG1EWSA9IHkgLSBtWTsKKyAgICAgICAgICAgICAgICBtWSA9IHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVYLCBtU2NhbGVZLCBtT2Zmc2V0WCwgbU9mZnNldFk7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgTVNfUEVSX0ZSQU1FID0gMTAwMCAvIDYwOworICAgICAgICBwdWJsaWMgUmVuZGVyZXIoKSB7CisgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QobVRyaWFuZ2xlVmVydGljZXNEYXRhLmxlbmd0aCAqIDQpCisgICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKS5hc0Zsb2F0QnVmZmVyKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKKyAgICAgICAgICAgIEdMRVMyMC5nbENsZWFyQ29sb3IoMC40ZiwgMC40ZiwgMC40ZiwgMS4wZik7CisgICAgICAgICAgICBHTEVTMjAuZ2xDbGVhciggR0xFUzIwLkdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTEVTMjAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICBHTEVTMjAuZ2xVc2VQcm9ncmFtKG1Qcm9ncmFtKTsKKyAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xVc2VQcm9ncmFtIik7CisKKyAgICAgICAgICAgIGZsb2F0IHgsIHksIGR4LCBkeTsKKyAgICAgICAgICAgIGxvbmcgdCwgZHQ7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQoVGVzdExhdGVuY3lWaWV3LnRoaXMpIHsKKyAgICAgICAgICAgICAgICB4ID0gbVg7CisgICAgICAgICAgICAgICAgeSA9IG1ZOworICAgICAgICAgICAgICAgIGR4ID0gbURYOworICAgICAgICAgICAgICAgIGR5ID0gbURZOworICAgICAgICAgICAgICAgIGR0ID0gbURUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZHQgPiAwKSB7CisgICAgICAgICAgICAgICAgZHggPSBkeCAqIE1TX1BFUl9GUkFNRSAvIGR0OworICAgICAgICAgICAgICAgIGR5ID0gZHkgKiBNU19QRVJfRlJBTUUgLyBkdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR0xFUzIwLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobXZQb3NpdGlvbkhhbmRsZSk7CisgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKKyAgICAgICAgICAgIEdMRVMyMC5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG12Q29sb3JIYW5kbGUpOworICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5Iik7CisgICAgICAgICAgICBmb3IoaW50IHN0ZXAgPSAwOyBzdGVwIDwgODsgc3RlcCsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgc3ggPSAoeCArIGR4ICogc3RlcCkgKiBtU2NhbGVYICsgbU9mZnNldFg7CisgICAgICAgICAgICAgICAgZmxvYXQgc3kgPSAoeSArIGR5ICogc3RlcCkgKiBtU2NhbGVZICsgbU9mZnNldFk7CisgICAgICAgICAgICAgICAgaW50IGNiYXNlID0gc3RlcCAqIDQ7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1UcmlhbmdsZVZlcnRpY2VzRGF0YS5sZW5ndGg7IGkgKz0gNikgeworICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2ldID0gc3ggKyBtVHJpYW5nbGVWZXJ0aWNlc0RhdGFbaV07CisgICAgICAgICAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzRGF0YTJbaSsxXSA9IC1zeSArIG1UcmlhbmdsZVZlcnRpY2VzRGF0YVtpKzFdOworICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2krMl0gPSBtQ29sb3JzW2NiYXNlXTsKKyAgICAgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXNEYXRhMltpKzNdID0gbUNvbG9yc1tjYmFzZSsxXTsKKyAgICAgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXNEYXRhMltpKzRdID0gbUNvbG9yc1tjYmFzZSsyXTsKKyAgICAgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXNEYXRhMltpKzVdID0gbUNvbG9yc1tjYmFzZSszXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucG9zaXRpb24oMCk7CisgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucHV0KG1UcmlhbmdsZVZlcnRpY2VzRGF0YTIpLnBvc2l0aW9uKDApOworCisgICAgICAgICAgICAgICAgR0xFUzIwLmdsVmVydGV4QXR0cmliUG9pbnRlcihtdlBvc2l0aW9uSGFuZGxlLCAyLCBHTEVTMjAuR0xfRkxPQVQsIGZhbHNlLCA2KjQsIG1UcmlhbmdsZVZlcnRpY2VzKTsKKyAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciBtdlBvc2l0aW9uIik7CisgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucHV0KG1UcmlhbmdsZVZlcnRpY2VzRGF0YTIpLnBvc2l0aW9uKDIpOworICAgICAgICAgICAgICAgIEdMRVMyMC5nbFZlcnRleEF0dHJpYlBvaW50ZXIobXZDb2xvckhhbmRsZSwgNCwgR0xFUzIwLkdMX0ZMT0FULCBmYWxzZSwgNio0LCBtVHJpYW5nbGVWZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbFZlcnRleEF0dHJpYlBvaW50ZXIgbXZDb2xvciIpOworICAgICAgICAgICAgICAgIEdMRVMyMC5nbERyYXdBcnJheXMoR0xFUzIwLkdMX1RSSUFOR0xFUywgMCwgMyk7CisgICAgICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbERyYXdBcnJheXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICBHTEVTMjAuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIG1TY2FsZVggPSAyLjBmIC8gd2lkdGg7CisgICAgICAgICAgICBtU2NhbGVZID0gMi4wZiAvIGhlaWdodDsKKyAgICAgICAgICAgIG1PZmZzZXRYID0gLTFmOworICAgICAgICAgICAgbU9mZnNldFkgPSAtMWY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIG1Qcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShtVmVydGV4U2hhZGVyLCBtRnJhZ21lbnRTaGFkZXIpOworICAgICAgICAgICAgaWYgKG1Qcm9ncmFtID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtdlBvc2l0aW9uSGFuZGxlID0gR0xFUzIwLmdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW0sICJhUG9zaXRpb24iKTsKKyAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKG12UG9zaXRpb25IYW5kbGUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBhdHRyaWIgbG9jYXRpb24gZm9yIHZQb3NpdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXZDb2xvckhhbmRsZSA9IEdMRVMyMC5nbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAiYUNvbG9yIik7CisgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChtdkNvbG9ySGFuZGxlID09IC0xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgYXR0cmliIGxvY2F0aW9uIGZvciB2Q29sb3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGxvYWRTaGFkZXIoaW50IHNoYWRlclR5cGUsIFN0cmluZyBzb3VyY2UpIHsKKyAgICAgICAgICAgIGludCBzaGFkZXIgPSBHTEVTMjAuZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7CisgICAgICAgICAgICBpZiAoc2hhZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBHTEVTMjAuZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpOworICAgICAgICAgICAgICAgIEdMRVMyMC5nbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgICAgICAgICBpbnRbXSBjb21waWxlZCA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgR0xFUzIwLmdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTEVTMjAuR0xfQ09NUElMRV9TVEFUVVMsIGNvbXBpbGVkLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGlsZWRbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgY29tcGlsZSBzaGFkZXIgIiArIHNoYWRlclR5cGUgKyAiOiIpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIEdMRVMyMC5nbEdldFNoYWRlckluZm9Mb2coc2hhZGVyKSk7CisgICAgICAgICAgICAgICAgICAgIEdMRVMyMC5nbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgICAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzaGFkZXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBjcmVhdGVQcm9ncmFtKFN0cmluZyB2ZXJ0ZXhTb3VyY2UsIFN0cmluZyBmcmFnbWVudFNvdXJjZSkgeworICAgICAgICAgICAgaW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xFUzIwLkdMX1ZFUlRFWF9TSEFERVIsIHZlcnRleFNvdXJjZSk7CisgICAgICAgICAgICBpZiAodmVydGV4U2hhZGVyID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTEVTMjAuR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNvdXJjZSk7CisgICAgICAgICAgICBpZiAocGl4ZWxTaGFkZXIgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcHJvZ3JhbSA9IEdMRVMyMC5nbENyZWF0ZVByb2dyYW0oKTsKKyAgICAgICAgICAgIGlmIChwcm9ncmFtICE9IDApIHsKKyAgICAgICAgICAgICAgICBHTEVTMjAuZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKKyAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHZlcnRleFNoYWRlciIpOworICAgICAgICAgICAgICAgIEdMRVMyMC5nbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBwaXhlbFNoYWRlcik7CisgICAgICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciBwaXhlbFNoYWRlciIpOworICAgICAgICAgICAgICAgIEdMRVMyMC5nbExpbmtQcm9ncmFtKHByb2dyYW0pOworICAgICAgICAgICAgICAgIGludFtdIGxpbmtTdGF0dXMgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIEdMRVMyMC5nbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTEVTMjAuR0xfTElOS19TVEFUVVMsIGxpbmtTdGF0dXMsIDApOworICAgICAgICAgICAgICAgIGlmIChsaW5rU3RhdHVzWzBdICE9IEdMRVMyMC5HTF9UUlVFKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06ICIpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIEdMRVMyMC5nbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgR0xFUzIwLmdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHByb2dyYW07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tHbEVycm9yKFN0cmluZyBvcCkgeworICAgICAgICAgICAgaW50IGVycm9yOworICAgICAgICAgICAgd2hpbGUgKChlcnJvciA9IEdMRVMyMC5nbEdldEVycm9yKCkpICE9IEdMRVMyMC5HTF9OT19FUlJPUikgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgb3AgKyAiOiBnbEVycm9yICIgKyBlcnJvcik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24ob3AgKyAiOiBnbEVycm9yICIgKyBlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBYLCBZLCBSIEcgQiBBCisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEgPSB7CisgICAgICAgICAgICAgICAgLTAuMDI1ZiwgMC4zZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAgMC4wZiAgLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLAorICAgICAgICAgICAgICAgICAwLjAyNWYsIDAuM2YsIDEuMGYsIDEuMGYsIDI1NS4wZiwgMS4wZgorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgLy8gQ29sb3IgY2FzY2FkZToKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1Db2xvcnMgPSB7CisgICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAwLjVmLCAwLjBmLCAwLjBmLCAxLjBmLAorICAgICAgICAgICAgICAgIDAuMGYsIDAuNWYsIDAuMGYsIDEuMGYsCisgICAgICAgICAgICAgICAgMC41ZiwgMC41ZiwgMC4wZiwgMS4wZiwKKworICAgICAgICAgICAgICAgIDAuMGYsIDAuMGYsIDAuNWYsIDEuMGYsCisgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmLAorICAgICAgICAgICAgICAgIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGZsb2F0W10gbVRyaWFuZ2xlVmVydGljZXNEYXRhMiA9IG5ldyBmbG9hdFttVHJpYW5nbGVWZXJ0aWNlc0RhdGEubGVuZ3RoXTsKKyAgICAgICAgcHJpdmF0ZSBGbG9hdEJ1ZmZlciBtVHJpYW5nbGVWZXJ0aWNlczsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmVydGV4U2hhZGVyID0gImF0dHJpYnV0ZSB2ZWM0IGFQb3NpdGlvbjtcbiIKKyAgICAgICAgICAgICsgImF0dHJpYnV0ZSB2ZWM0IGFDb2xvcjtcbiIKKyAgICAgICAgICAgICsgInZhcnlpbmcgdmVjNCB2Q29sb3I7XG4iCisgICAgICAgICAgICArICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICAgICArICIgIGdsX1Bvc2l0aW9uID0gYVBvc2l0aW9uO1xuIgorICAgICAgICAgICAgKyAiICB2Q29sb3IgPSBhQ29sb3I7XG4iCisgICAgICAgICAgICArICJ9XG4iOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1GcmFnbWVudFNoYWRlciA9ICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAgICAgICAgICsgInZhcnlpbmcgdmVjNCB2Q29sb3I7XG4iCisgICAgICAgICAgICArICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICAgICArICIgIGdsX0ZyYWdDb2xvciA9IHZDb2xvcjtcbiIKKyAgICAgICAgICAgICsgIn1cbiI7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVByb2dyYW07CisgICAgICAgIHByaXZhdGUgaW50IG12UG9zaXRpb25IYW5kbGU7CisgICAgICAgIHByaXZhdGUgaW50IG12Q29sb3JIYW5kbGU7CisKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM3ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3BlbkdMIEVTIEpOSSBzYW1wbGUKKyMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpICMgbm90IDY0IGJpdCBjbGVhbgorCitUT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQnVpbGQgYWN0aXZpdHkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0Vmlld3BvcnQKKworIyBTZXQgYSBzcGVjaWZpYyBTREsgdmVyc2lvbiBzbyB3ZSBjYW4gcnVuIG9uIEZyb3lvLgorCitMT0NBTF9TREtfVkVSU0lPTiA6PSA4CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZiAjIFRBUkdFVF9TSU1VTEFUT1IKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE5ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0Ij4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Rlc3RfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgorICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZhYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUKQEAgLTAsMCArMSwyOCBAQAorUmVwcm8gc3RlcHM6CisKK2J1aWxkLCBpbnN0YWxsIGFuZCBydW4gdGhlIGF0dGFjaGVkIHRlc3QgcHJvZ3JhbSBUZXN0Vmlld3BvcnQuYXBrCisKK1J1biBvbiBTYXBwaGlyZSB3aXRoIEZyb3lvLgorCitUaGUgcHJvZ3JhbSBjbGVhcnMgdGhlIHNjcmVlbiB0byBibHVlLCB0aGVuIGRyYXdzIGEgZnVsbCBzY3JlZW4gd2hpdGUgcXVhZCB0aGF0CitpcyBhbGxpZ25lZCB0byB0aGUgc2NyZWVuLgorKFRoZXJlZm9yZSB0aGUgd2hvbGUgc2NyZWVuIHNob3VsZCBhcHBlYXIgdG8gYmUgd2hpdGUuKQorCisKK05vdGUgdGhhdCBzY3JlZW4gaXMgYWxsIHdoaXRlLgorCitSb3RhdGUgc2NyZWVuIDkwIGRlZ3JlZXMuCisKK0V4cGVjdGVkOiBzY3JlZW4gaXMgc3RpbGwgYWxsIHdoaXRlLgorCitBY3R1YWw6IHNjcmVlbiBpcyBibHVlIHdpdGggb2Zmc2V0IHdoaXRlIHJlY3RhbmdsZS4KKworVGhpcyBidWcgb25seSBoYXBwZW5zIG9uIFNhcHBoaXJlLCBpdCB3b3JrcyBjb3JyZWN0bHkgb24gUGFzc2lvbi4KKworV2hhdCBoYXBwZW5zOgorCitJIHRoaW5rIHRoZSBidWcgaXMgdGhhdCB0aGUgZ2wuZ2xWaWV3cG9ydCgpIGNhbGwgaW4gb25TdXJmYWNlQ2hhbmdlZCgpIGlzCitiZWluZyBpZ25vcmVkIGJ5IHRoZSBPcGVuR0wgZHJpdmVyLgorCitOT1RFOiBJZiBhIGdsLmdsVmlld3BvcnQgY2FsbCBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvbkRyYXdGcmFtZSgpCitjYWxsICh3aGljaCBtZWFucyBpdCBpcyBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGRyYXcpLCB0aGUgcHJvZ3JhbSBydW5zIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI4YmJiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZworICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXN0X2FjdGl2aXR5Ij5UZXN0IFZpZXdwb3J0PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RBY3Rpdml0eSI7CisgICAgVGVzdFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIG1WaWV3ID0gbmV3IFRlc3RWaWV3KGdldEFwcGxpY2F0aW9uKCkpOworCSAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKwkgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NjMzdkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKKyAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKKyAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KKyAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCisgKiBpbnN0YW5jZS4KKyAqLworY2xhc3MgVGVzdFZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKKyAgICAgICAgc2V0UmVuZGVyTW9kZShSRU5ERVJNT0RFX1dIRU5fRElSVFkpOworICAgIH0KKyAgICAKKyAgICAgICAgLyoqIEEgZ3JpZCBpcyBhIHRvcG9sb2dpY2FsbHkgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgdmVydGljZXMuCisgICAgKgorICAgICogVGhlIHZlcnRleCBhbmQgaW5kZXggZGF0YSBhcmUgaGVsZCBpbiBWQk8gb2JqZWN0cyBiZWNhdXNlIG9uIG1vc3QKKyAgICAqIEdQVXMgVkJPIG9iamVjdHMgYXJlIHRoZSBmYXN0ZXN0IHdheSBvZiByZW5kZXJpbmcgc3RhdGljIHZlcnRleAorICAgICogYW5kIGluZGV4IGRhdGEuCisgICAgKgorICAgICovCisKKyAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyaWQgeworICAgICAgIC8vIFNpemUgb2YgdmVydGV4IGRhdGEgZWxlbWVudHMgaW4gYnl0ZXM6CisgICAgICAgZmluYWwgc3RhdGljIGludCBGTE9BVF9TSVpFID0gNDsKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IENIQVJfU0laRSA9IDI7CisKKyAgICAgICAvLyBWZXJ0ZXggc3RydWN0dXJlOgorICAgICAgIC8vIGZsb2F0IHgsIHksIHo7CisKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IFZFUlRFWF9TSVpFID0gMyAqIEZMT0FUX1NJWkU7CisKKyAgICAgICBwcml2YXRlIGludCBtVmVydGV4QnVmZmVyT2JqZWN0SWQ7CisgICAgICAgcHJpdmF0ZSBpbnQgbUVsZW1lbnRCdWZmZXJPYmplY3RJZDsKKworICAgICAgIC8vIFRoZXNlIGJ1ZmZlcnMgYXJlIHVzZWQgdG8gaG9sZCB0aGUgdmVydGV4IGFuZCBpbmRleCBkYXRhIHdoaWxlCisgICAgICAgLy8gY29uc3RydWN0aW5nIHRoZSBncmlkLiBPbmNlIGNyZWF0ZUJ1ZmZlck9iamVjdHMoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB0aGUgYnVmZmVycyBhcmUgbnVsbGVkIG91dCB0byBzYXZlIG1lbW9yeS4KKworICAgICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBtVmVydGV4Qnl0ZUJ1ZmZlcjsKKyAgICAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1WZXJ0ZXhCdWZmZXI7CisgICAgICAgcHJpdmF0ZSBDaGFyQnVmZmVyIG1JbmRleEJ1ZmZlcjsKKworICAgICAgIHByaXZhdGUgaW50IG1XOworICAgICAgIHByaXZhdGUgaW50IG1IOworICAgICAgIHByaXZhdGUgaW50IG1JbmRleENvdW50OworCisgICAgICAgcHVibGljIEdyaWQoaW50IHcsIGludCBoKSB7CisgICAgICAgICAgIGlmICh3IDwgMCB8fCB3ID49IDY1NTM2KSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3Iik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKGggPCAwIHx8IGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImgiKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAodyAqIGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIncgKiBoID49IDY1NTM2Iik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBtVyA9IHc7CisgICAgICAgICAgIG1IID0gaDsKKyAgICAgICAgICAgaW50IHNpemUgPSB3ICogaDsKKworICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoVkVSVEVYX1NJWkUgKiBzaXplKQorICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG1WZXJ0ZXhCeXRlQnVmZmVyLmFzRmxvYXRCdWZmZXIoKTsKKworICAgICAgICAgICBpbnQgcXVhZFcgPSBtVyAtIDE7CisgICAgICAgICAgIGludCBxdWFkSCA9IG1IIC0gMTsKKyAgICAgICAgICAgaW50IHF1YWRDb3VudCA9IHF1YWRXICogcXVhZEg7CisgICAgICAgICAgIGludCBpbmRleENvdW50ID0gcXVhZENvdW50ICogNjsKKyAgICAgICAgICAgbUluZGV4Q291bnQgPSBpbmRleENvdW50OworICAgICAgICAgICBtSW5kZXhCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KENIQVJfU0laRSAqIGluZGV4Q291bnQpCisgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpLmFzQ2hhckJ1ZmZlcigpOworCisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIEluaXRpYWxpemUgdHJpYW5nbGUgbGlzdCBtZXNoLgorICAgICAgICAgICAgKgorICAgICAgICAgICAgKiAgICAgWzBdLS0tLS1bICAxXSAuLi4KKyAgICAgICAgICAgICogICAgICB8ICAgIC8gICB8CisgICAgICAgICAgICAqICAgICAgfCAgIC8gICAgfAorICAgICAgICAgICAgKiAgICAgIHwgIC8gICAgIHwKKyAgICAgICAgICAgICogICAgIFt3XS0tLS0tW3crMV0gLi4uCisgICAgICAgICAgICAqICAgICAgfCAgICAgICB8CisgICAgICAgICAgICAqCisgICAgICAgICAgICAqLworCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgcXVhZEg7IHkrKykgeworICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgcXVhZFc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGEgPSAoY2hhcikgKHkgKiBtVyArIHgpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGIgPSAoY2hhcikgKHkgKiBtVyArIHggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4ICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGEpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYyk7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBiKTsKKworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYik7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGQpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICAgfQorCisgICAgICAgcHVibGljIHZvaWQgc2V0KGludCBpLCBpbnQgaiwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBtVykgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaSIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmIChqIDwgMCB8fCBqID49IG1IKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqIik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBpbnQgaW5kZXggPSBtVyAqIGogKyBpOworCisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucG9zaXRpb24oaW5kZXggKiBWRVJURVhfU0laRSAvIEZMT0FUX1NJWkUpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh4KTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeSk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHopOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUJ1ZmZlck9iamVjdHMoR0wgZ2wpIHsKKyAgICAgICAgICAgLy8gR2VuZXJhdGUgYSB0aGUgdmVydGV4IGFuZCBlbGVtZW50IGJ1ZmZlciBJRHMKKyAgICAgICAgICAgaW50W10gdmJvSWRzID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworICAgICAgICAgICBnbDExLmdsR2VuQnVmZmVycygyLCB2Ym9JZHMsIDApOworICAgICAgICAgICBtVmVydGV4QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMF07CisgICAgICAgICAgIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMV07CisKKyAgICAgICAgICAgLy8gVXBsb2FkIHRoZSB2ZXJ0ZXggZGF0YQorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICAgICAgIGdsMTEuZ2xCdWZmZXJEYXRhKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4Qnl0ZUJ1ZmZlci5jYXBhY2l0eSgpLCBtVmVydGV4Qnl0ZUJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJ1ZmZlckRhdGEoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLmNhcGFjaXR5KCkgKiBDSEFSX1NJWkUsIG1JbmRleEJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgaW4tbWVtb3J5IGRhdGEgYW55IG1vcmUKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgbUluZGV4QnVmZmVyID0gbnVsbDsKKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgdm9pZCBkcmF3KEdMMTAgZ2wpIHsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworCisgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wxMC5HTF9WRVJURVhfQVJSQVkpOworCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBnbDExLmdsVmVydGV4UG9pbnRlcigzLCBHTDEwLkdMX0ZMT0FULCBWRVJURVhfU0laRSwgMCk7CisgICAgICAgICAgIAorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtRWxlbWVudEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgZ2wxMS5nbERyYXdFbGVtZW50cyhHTDEwLkdMX1RSSUFOR0xFUywgbUluZGV4Q291bnQsIEdMMTAuR0xfVU5TSUdORURfU0hPUlQsIDApOworICAgICAgICAgICBnbC5nbERpc2FibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7CisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgICAgfQorICAgfQorCisKKyAgICBwcml2YXRlIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVuZGVyZXIiOworICAgICAgICBwcml2YXRlIEdyaWQgbUdyaWQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7CisJCQlnbC5nbENsZWFyQ29sb3IoMCwwLDEsMSk7CisJCQlnbC5nbENsZWFyKEdMMTAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICBtR3JpZC5kcmF3KGdsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICBnbC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7CisJCQlnbC5nbExvYWRJZGVudGl0eSgpOworCQkJZ2wuZ2xPcnRob2YoMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgICAgIGNyZWF0ZUdyaWQoZ2wsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHcmlkKEdMMTAgZ2wsIGZsb2F0IHcsIGZsb2F0IGgpIHsKKyAgICAgICAgbUdyaWQgPSBuZXcgR3JpZCgyLCAyKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQkJZmxvYXQgeCA9IHcgKiBpOworCQkJCQlmbG9hdCB5ID0gaCAqIGo7CisJCQkJCWZsb2F0IHogPSAwLjBmOworCQkJCQltR3JpZC5zZXQoaSxqLCB4LCB5LCB6KTsKKwkJCQl9CisJCQl9CisJCQltR3JpZC5jcmVhdGVCdWZmZXJPYmplY3RzKGdsKTsKKwkJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggMzdmNWI2MS4uZmZkNmI1OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xOCw2ICsxOCw2IEBACiAqLwogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8IS0tIHNlcnZpY2UgbmFtZSAgLS0+CisgICAgPCEtLSBzZXJ2aWNlIG5hbWUgW0NIQVIgTElNSVQ9MjVdICAtLT4KICAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSI+UGFja2FnZSBBY2Nlc3MgSGVscGVyPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFlNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9sYWJlbCIgbXNnaWQ9IjQ1Njc1NjYwOTg1Mjg1ODg4NjMiPiJNZW1vcmlhIGRhbHMgcGFyYW1ldGVycyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbCBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy9kZWZhdWx0cy54bWwKaW5kZXggNTJlMDRkNy4uOGRlNTA3ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMvZGVmYXVsdHMueG1sCkBAIC0zLDE2ICszLDE2IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAtLT4KQEAgLTI0LDYgKzI0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImRlZl9haXJwbGFuZV9tb2RlX3JhZGlvcyIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+Y2VsbCxibHVldG9vdGgsd2lmaTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWlycGxhbmVfbW9kZV90b2dnbGVhYmxlX3JhZGlvcyIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+Ymx1ZXRvb3RoLHdpZmk8L3N0cmluZz4KICAgICA8Ym9vbCBuYW1lPSJkZWZfYXV0b190aW1lIj50cnVlPC9ib29sPgorICAgIDxib29sIG5hbWU9ImRlZl9hdXRvX3RpbWVfem9uZSI+dHJ1ZTwvYm9vbD4KICAgICA8Ym9vbCBuYW1lPSJkZWZfYWNjZWxlcm9tZXRlcl9yb3RhdGlvbiI+dHJ1ZTwvYm9vbD4KICAgICA8IS0tIERlZmF1bHQgc2NyZWVuIGJyaWdodG5lc3MsIGZyb20gMCB0byAyNTUuICAxMDIgaXMgNDAlLiAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJkZWZfc2NyZWVuX2JyaWdodG5lc3MiPjEwMjwvaW50ZWdlcj4KQEAgLTMxLDEyICszMiwxMiBAQAogICAgIDxmcmFjdGlvbiBuYW1lPSJkZWZfd2luZG93X2FuaW1hdGlvbl9zY2FsZSI+MTAwJTwvZnJhY3Rpb24+CiAgICAgPGZyYWN0aW9uIG5hbWU9ImRlZl93aW5kb3dfdHJhbnNpdGlvbl9zY2FsZSI+MTAwJTwvZnJhY3Rpb24+CiAgICAgPGJvb2wgbmFtZT0iZGVmX2hhcHRpY19mZWVkYmFjayI+dHJ1ZTwvYm9vbD4KLSAgICAKKwogICAgIDxib29sIG5hbWU9ImRlZl9ibHVldG9vdGhfb24iPmZhbHNlPC9ib29sPgogICAgIDxib29sIG5hbWU9ImRlZl9pbnN0YWxsX25vbl9tYXJrZXRfYXBwcyI+ZmFsc2U8L2Jvb2w+Ci0gICAgPCEtLSBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhdGlvbiBwcm92aWRlcnMuIAorICAgIDwhLS0gQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYXRpb24gcHJvdmlkZXJzLgogICAgICAgICAgTmV0d29yayBsb2NhdGlvbiBpcyBvZmYgYnkgZGVmYXVsdCBiZWNhdXNlIGl0IHJlcXVpcmVzCi0gICAgICAgICB1c2VyIG9wdC1pbiB2aWEgU2V0dXAgV2l6YXJkIG9yIFNldHRpbmdzLiAgCisgICAgICAgICB1c2VyIG9wdC1pbiB2aWEgU2V0dXAgV2l6YXJkIG9yIFNldHRpbmdzLgogICAgIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iZGVmX2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkIiB0cmFuc2xhdGFibGU9ImZhbHNlIj5ncHM8L3N0cmluZz4KICAgICA8Ym9vbCBuYW1lPSJhc3Npc3RlZF9ncHNfZW5hYmxlZCI+dHJ1ZTwvYm9vbD4KQEAgLTQ1LDExICs0NiwxMSBAQAogICAgIDxib29sIG5hbWU9ImRlZl91c2JfbWFzc19zdG9yYWdlX2VuYWJsZWQiPnRydWU8L2Jvb2w+CiAgICAgPGJvb2wgbmFtZT0iZGVmX3dpZmlfb24iPmZhbHNlPC9ib29sPgogICAgIDxib29sIG5hbWU9ImRlZl9uZXR3b3Jrc19hdmFpbGFibGVfbm90aWZpY2F0aW9uX29uIj50cnVlPC9ib29sPgotICAgIAorCiAgICAgPGJvb2wgbmFtZT0iZGVmX2JhY2t1cF9lbmFibGVkIj5mYWxzZTwvYm9vbD4KICAgICA8c3RyaW5nIG5hbWU9ImRlZl9iYWNrdXBfdHJhbnNwb3J0IiB0cmFuc2xhdGFibGU9ImZhbHNlIj5hbmRyb2lkL2NvbS5hbmRyb2lkLmludGVybmFsLmJhY2t1cC5Mb2NhbFRyYW5zcG9ydDwvc3RyaW5nPgogCi0gICAgPCEtLSBEZWZhdWx0IHZhbHVlIGZvciB3aGV0aGVyIG9yIG5vdCB0byBwdWxzZSB0aGUgbm90aWZpY2F0aW9uIExFRCB3aGVuIHRoZXJlIGlzIGEgCisgICAgPCEtLSBEZWZhdWx0IHZhbHVlIGZvciB3aGV0aGVyIG9yIG5vdCB0byBwdWxzZSB0aGUgbm90aWZpY2F0aW9uIExFRCB3aGVuIHRoZXJlIGlzIGEKICAgICAgICAgIHBlbmRpbmcgbm90aWZpY2F0aW9uIC0tPgogICAgIDxib29sIG5hbWU9ImRlZl9ub3RpZmljYXRpb25fcHVsc2UiPnRydWU8L2Jvb2w+CiAKQEAgLTcyLDQgKzczLDM0IEBACiAKICAgICA8IS0tIERlZmF1bHQgZm9yIFNldHRpbmdzLlN5c3RlbS5WSUJSQVRFX0lOX1NJTEVOVCAtLT4KICAgICA8Ym9vbCBuYW1lPSJkZWZfdmlicmF0ZV9pbl9zaWxlbnQiPnRydWU8L2Jvb2w+CisKKyAgICA8Ym9vbCBuYW1lPSJkZWZfdXNlX3B0cF9pbnRlcmZhY2UiPmZhbHNlPC9ib29sPgorCisgICAgPCEtLSBEZWZhdWx0IGZvciBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9TQ1JJUFRfSU5KRUNUSU9OIC0tPgorICAgIDxib29sIG5hbWU9ImRlZl9hY2Nlc3NpYmlsaXR5X3NjcmlwdF9pbmplY3Rpb24iPmZhbHNlPC9ib29sPgorCisgICAgPCEtLSBEZWZhdWx0IGZvciBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9XRUJfQ09OVEVOVF9LRVlfQklORElOR1MgLS0+CisgICAgPHN0cmluZyBuYW1lPSJkZWZfYWNjZXNzaWJpbGl0eV93ZWJfY29udGVudF9rZXlfYmluZGluZ3MiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPgorICAgICAgICAgICAgPCEtLSBEUEFEL1RyYWNrYmFsbCBVUCBtYXBzIHRvIHRyYXZlcnNlIHByZXZpb3VzIG9uIGN1cnJlbnQgYXhpcyBhbmQgc2VuZCBhbiBldmVudC4gLS0+CisgICAgICAgICAgICAweDEzPTB4MDEwMDAxMDA7CisgICAgICAgICAgICA8IS0tIERQQUQvVHJhY2tiYWxsIERPV04gbWFwcyB0byB0cmF2ZXJzZSBuZXh0IG9uIGN1cnJlbnQgYXhpcyBhbmQgc2VuZCBhbiBldmVudC4gLS0+CisgICAgICAgICAgICAweDE0PTB4MDEwMTAxMDA7CisgICAgICAgICAgICA8IS0tIERQQUQvVHJhY2tiYWxsIExFRlQgbWFwcyB0byBhY3Rpb24gaW4gbm9uLWFuZHJvaWQgZGVmYXVsdCBuYXZpZ2F0aW9uIGF4aXMuIC0tPgorICAgICAgICAgICAgMHgxNT0weDA0MDAwMDAwOworICAgICAgICAgICAgPCEtLSBEUEFEL1RyYWNrYmFsbCBSSUdIVCBtYXBzIHRvIG5vIGFjdGlvbiBpbiBub24tYW5kcm9pZCBkZWZhdWx0IG5hdmlnYXRpb24gYXhpcy4gLS0+CisgICAgICAgICAgICAweDE2PTB4MDQwMDAwMDA7CisgICAgICAgICAgICA8IS0tIExlZnQgQWx0K0RQQUQvVHJhY2tiYWxsIFVQIHRyYW5zaXRpb25zIGZyb20gYW4gYXhpcyB0byBhbm90aGVyIGFuZCBzZW5kcyBhbiBldmVudC4gLS0+CisgICAgICAgICAgICA8IS0tIEF4aXMgdHJhbnNpdGlvbnM6ICAyIC0+IDc7IDEgLT4gMjsgMCAtPiAxOyAzIC0+IDA7IDQgLT4gMDsgNSAtPiAwOyA2IC0+IDA7IC0tPgorICAgICAgICAgICAgMHgxMjAwMTM9MHgwMzAyMDcwMToweDAzMDEwMjAxOjB4MDMwMDAxMDE6MHgwMzAzMDAwMToweDAzMDQwMDAxOjB4MDMwNTAwMDE6MHgwMzA2MDAwMTsKKyAgICAgICAgICAgIDwhLS0gTGVmdCBBbHQrRFBBRC9UcmFja2JhbGwgRE9XTiB0cmFuc2l0aW9ucyBmcm9tIGFuIGF4aXMgdG8gYW5vdGhlciBhbmQgc2VuZHMgYW4gZXZlbnQuIC0tPgorICAgICAgICAgICAgPCEtLSBBeGlzIHRyYW5zaXRpb25zOiAxIC0+IDA7IDIgLT4gMTsgNyAtPiAyOyAzIC0+IDc7IDQgLT4gNzsgNSAtPiA3OyA2IC0+IDc7IC0tPgorICAgICAgICAgICAgMHgxMjAwMTQ9MHgwMzAxMDAwMToweDAzMDIwMTAxOjB4MDMwNzAyMDE6MHgwMzAzMDcwMToweDAzMDQwNzAxOjB4MDMwNTA3MDE6MHgwMzA2MDcwMTsKKyAgICAgICAgICAgIDwhLS0gTGVmdCBBbHQrRFBBRC9UcmFja2JhbGwgTEVGVCB0cmFuc2l0aW9ucyBmcm9tIGFuIGF4aXMgdG8gYW5vdGhlciBhbmQgc2VuZHMgYW4gZXZlbnQuIC0tPgorICAgICAgICAgICAgPCEtLSBBeGlzIHRyYW5zaXRpb25zOiA0IC0+IDM7IDUgLT4gNDsgNiAtPiA1OyAwIC0+IDY7IDEgLT4gNjsgMiAtPiA2OyA3IC0+IDY7IC0tPgorICAgICAgICAgICAgMHgxMjAwMTU9MHgwMzA0MDMwMToweDAzMDUwNDAxOjB4MDMwNjA1MDE6MHgwMzAwMDYwMToweDAzMDEwNjAxOjB4MDMwMjA2MDE6MHgwMzA3MDYwMTsKKyAgICAgICAgICAgIDwhLS0gTGVmdCBBbHQrRFBBRC9UcmFja2JhbGwgUklHSFQgdHJhbnNpdGlvbnMgZnJvbSBhbiBheGlzIHRvIGFub3RoZXIgYW5kIHNlbmRzIGFuIGV2ZW50LiAgLS0+CisgICAgICAgICAgICA8IS0tIEF4aXMgdHJhbnNpdGlvbnM6IDUgLT4gNjsgNCAtPiA1OyAzIC0+IDQ7IDIgLT4gMzsgNyAtPiAzOyAxIC0+IDM7IDAgLT4gMzsgLS0+CisgICAgICAgICAgICAweDEyMDAxNj0weDAzMDUwNjAxOjB4MDMwNDA1MDE6MHgwMzAzMDQwMToweDAzMDIwMzAxOjB4MDMwNzAzMDE6MHgwMzAxMDMwMToweDAzMDAwMzAxOworICAgIDwvc3RyaW5nPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9EYXRhYmFzZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKaW5kZXggYWQwNGJiNC4uOWFjODMyYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKQEAgLTE2LDEyICsxNiwyMCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5nczsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbnRlbnQuUGFja2FnZUhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUklMQ29uc3RhbnRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldzsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CkBAIC0zNSwxOCArNDMsNyBAQAogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29udGVudC5QYWNrYWdlSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5SSUxDb25zdGFudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5VdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3OwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC02NCw3ICs2MSw3IEBACiAgICAgLy8gZGF0YWJhc2UgZ2V0cyB1cGdyYWRlZCBwcm9wZXJseS4gQXQgYSBtaW5pbXVtLCBwbGVhc2UgY29uZmlybSB0aGF0ICd1cGdyYWRlVmVyc2lvbicKICAgICAvLyBpcyBwcm9wZXJseSBwcm9wYWdhdGVkIHRocm91Z2ggeW91ciBjaGFuZ2UuICBOb3QgZG9pbmcgc28gd2lsbCByZXN1bHQgaW4gYSBsb3NzIG9mIHVzZXIKICAgICAvLyBzZXR0aW5ncy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFUQUJBU0VfVkVSU0lPTiA9IDU3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBQkFTRV9WRVJTSU9OID0gNTk7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKQEAgLTczNCw2ICs3MzEsNTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVwZ3JhZGVWZXJzaW9uID0gNTc7CiAgICAgICAgIH0KKworICAgICAgICBpZiAodXBncmFkZVZlcnNpb24gPT0gNTcpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBOZXcgc2V0dGluZ3MgdG86CisgICAgICAgICAgICAgKiAgMS4gRW5hYmxlIGluamVjdGlvbiBvZiBhY2Nlc3NpYmlsaXR5IHNjcmlwdHMgaW4gV2ViVmlld3MuCisgICAgICAgICAgICAgKiAgMi4gRGVmaW5lIHRoZSBrZXkgYmluZGluZ3MgZm9yIHRyYXZlcnNpbmcgd2ViIGNvbnRlbnQgaW4gV2ViVmlld3MuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RtdCA9IGRiLmNvbXBpbGVTdGF0ZW1lbnQoIklOU0VSVCBJTlRPIHNlY3VyZShuYW1lLHZhbHVlKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBWQUxVRVMoPyw/KTsiKTsKKyAgICAgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYm9vbC5kZWZfYWNjZXNzaWJpbGl0eV9zY3JpcHRfaW5qZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgc3RtdCA9IGRiLmNvbXBpbGVTdGF0ZW1lbnQoIklOU0VSVCBJTlRPIHNlY3VyZShuYW1lLHZhbHVlKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBWQUxVRVMoPyw/KTsiKTsKKyAgICAgICAgICAgICAgICBsb2FkU3RyaW5nU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9XRUJfQ09OVEVOVF9LRVlfQklORElOR1MsCisgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZWZfYWNjZXNzaWJpbGl0eV93ZWJfY29udGVudF9rZXlfYmluZGluZ3MpOworICAgICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZ3JhZGVWZXJzaW9uID0gNTg7CisgICAgICAgIH0KKworICAgICAgICBpZiAodXBncmFkZVZlcnNpb24gPT0gNTgpIHsKKyAgICAgICAgICAgIC8qIEFkZCBkZWZhdWx0IGZvciBuZXcgQXV0byBUaW1lIFpvbmUgKi8KKyAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RtdCA9IGRiLmNvbXBpbGVTdGF0ZW1lbnQoIklOU0VSVCBJTlRPIHNlY3VyZShuYW1lLHZhbHVlKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBWQUxVRVMoPyw/KTsiKTsKKyAgICAgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLkFVVE9fVElNRV9aT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl9hdXRvX3RpbWVfem9uZSk7IC8vIFN5bmMgdGltZXpvbmUgdG8gTklUWgorICAgICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZ3JhZGVWZXJzaW9uID0gNTk7CisgICAgICAgIH0KKwogICAgICAgICAvLyAqKiogUmVtZW1iZXIgdG8gdXBkYXRlIERBVEFCQVNFX1ZFUlNJT04gYWJvdmUhCiAKICAgICAgICAgaWYgKHVwZ3JhZGVWZXJzaW9uICE9IGN1cnJlbnRWZXJzaW9uKSB7CkBAIC04NzYsNyArOTE3LDcgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgY2xzID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJjbGFzcyIpOwogICAgICAgICAgICAgICAgIFN0cmluZyBzaG9ydGN1dFN0ciA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAic2hvcnRjdXQiKTsKIAotICAgICAgICAgICAgICAgIGludCBzaG9ydGN1dFZhbHVlID0gKGludCkgc2hvcnRjdXRTdHIuY2hhckF0KDApOworICAgICAgICAgICAgICAgIGludCBzaG9ydGN1dFZhbHVlID0gc2hvcnRjdXRTdHIuY2hhckF0KDApOwogICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzaG9ydGN1dFN0cikpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIGdldCBzaG9ydGN1dCBmb3I6ICIgKyBwa2cgKyAiLyIgKyBjbHMpOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwNDQsNyArMTA4NSwxMCBAQAogICAgIAogICAgICAgICAgICAgbG9hZEJvb2xlYW5TZXR0aW5nKHN0bXQsIFNldHRpbmdzLlN5c3RlbS5BVVRPX1RJTUUsCiAgICAgICAgICAgICAgICAgICAgIFIuYm9vbC5kZWZfYXV0b190aW1lKTsgLy8gU3luYyB0aW1lIHRvIE5JVFoKLSAgICAKKworICAgICAgICAgICAgbG9hZEJvb2xlYW5TZXR0aW5nKHN0bXQsIFNldHRpbmdzLlN5c3RlbS5BVVRPX1RJTUVfWk9ORSwKKyAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl9hdXRvX3RpbWVfem9uZSk7IC8vIFN5bmMgdGltZXpvbmUgdG8gTklUWgorCiAgICAgICAgICAgICBsb2FkSW50ZWdlclNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTLAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuZGVmX3NjcmVlbl9icmlnaHRuZXNzKTsKICAgICAKQEAgLTEwNjgsNiArMTExMiw5IEBACiAgICAgCiAgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLlZJQlJBVEVfSU5fU0lMRU5ULAogICAgICAgICAgICAgICAgICAgICBSLmJvb2wuZGVmX3ZpYnJhdGVfaW5fc2lsZW50KTsKKworICAgICAgICAgICAgbG9hZEJvb2xlYW5TZXR0aW5nKHN0bXQsIFNldHRpbmdzLlN5c3RlbS5VU0VfUFRQX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl91c2VfcHRwX2ludGVyZmFjZSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgIH0KQEAgLTExODQsNiArMTIzMSwxMiBAQAogICAgIAogICAgICAgICAgICAgbG9hZEJvb2xlYW5TZXR0aW5nKHN0bXQsIFNldHRpbmdzLlNlY3VyZS5NT1VOVF9VTVNfTk9USUZZX0VOQUJMRUQsCiAgICAgICAgICAgICAgICAgICAgIFIuYm9vbC5kZWZfbW91bnRfdW1zX25vdGlmeV9lbmFibGVkKTsKKworICAgICAgICAgICAgbG9hZEJvb2xlYW5TZXR0aW5nKHN0bXQsIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgIFIuYm9vbC5kZWZfYWNjZXNzaWJpbGl0eV9zY3JpcHRfaW5qZWN0aW9uKTsKKworICAgICAgICAgICAgbG9hZFN0cmluZ1NldHRpbmcoc3RtdCwgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfV0VCX0NPTlRFTlRfS0VZX0JJTkRJTkdTLAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZWZfYWNjZXNzaWJpbGl0eV93ZWJfY29udGVudF9rZXlfYmluZGluZ3MpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkLm1rIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZC5tawppbmRleCA0YzgzNzY4Li4yYzEzMDY5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkLm1rCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsKQEAgLTMsMTEgKzMsMTYgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykgXAorICAgIC4uLy4uLy4uL2V4L2Nhcm91c2VsL2phdmEvY29tL2FuZHJvaWQvZXgvY2Fyb3VzZWwvY2Fyb3VzZWwucnMKIAogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gc2VydmljZXMKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtY29tbW9uLWNhcm91c2VsCisKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBTeXN0ZW1VSQogTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KIAorTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUyA6PSBwcm9ndWFyZC5mbGFncworCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDBmY2NiZTcuLjYwNTcwMjMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNSw2ICs1LDkgQEAKICAgICAgICAgPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TVEFUVVNfQkFSX1NFUlZJQ0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CTFVFVE9PVEgiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CTFVFVE9PVEhfQURNSU4iIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5HRVRfVEFTS1MiIC8+CiAKICAgICA8YXBwbGljYXRpb24KICAgICAgICAgYW5kcm9pZDpwZXJzaXN0ZW50PSJ0cnVlIgpAQCAtMTMsNyArMTYsMTIgQEAKICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbGF1bmNoZXJfc2V0dGluZ3MiPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgPHNlcnZpY2UKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLnN0YXR1c2Jhci5TdGF0dXNCYXJTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuc3RhdHVzYmFyLlBob25lU3RhdHVzQmFyU2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9ImZhbHNlIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8c2VydmljZQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuc3RhdHVzYmFyLnRhYmxldC5UYWJsZXRTdGF0dXNCYXJTZXJ2aWNlIgogICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCiAgICAgICAgICAgICAvPgogCkBAIC0yMSw1ICsyOSwxMiBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhjbHVkZUZyb21SZWNlbnRzPSJ0cnVlIj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIucmVjZW50LlJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhjbHVkZUZyb21SZWNlbnRzPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVJbnN0YW5jZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgPC9hcHBsaWNhdGlvbj4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9wcm9ndWFyZC5mbGFncyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Byb2d1YXJkLmZsYWdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDg0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wcm9ndWFyZC5mbGFncwpAQCAtMCwwICsxLDYgQEAKKy1rZWVwIGNsYXNzIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuVGFibGV0U3RhdHVzQmFyU2VydmljZSB7CisgIHB1YmxpYyB2b2lkIG5vdGlmaWNhdGlvbkljb25zQ2xpY2tlZChhbmRyb2lkLnZpZXcuVmlldyk7CisgIHB1YmxpYyB2b2lkIHN5c3RlbUluZm9DbGlja2VkKGFuZHJvaWQudmlldy5WaWV3KTsKKyAgcHVibGljIHZvaWQgcmVjZW50QnV0dG9uQ2xpY2tlZChhbmRyb2lkLnZpZXcuVmlldyk7CisgIHB1YmxpYyB2b2lkIHRvZ2dsZUxpZ2h0c091dChhbmRyb2lkLnZpZXcuVmlldyk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9oeWRyYXVsaWNfYnJha2VfaW50ZXJwb2xhdG9yLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2h5ZHJhdWxpY19icmFrZV9pbnRlcnBvbGF0b3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjc3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9oeWRyYXVsaWNfYnJha2VfaW50ZXJwb2xhdG9yLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2FuaW0vZWFzZV9vdXRfaW50ZXJwb2xhdG9yLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGRlY2VsZXJhdGVJbnRlcnBvbGF0b3IgCisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6ZmFjdG9yPSIxMC4wIiAvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbGlnaHRzX291dF9pbi54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9saWdodHNfb3V0X2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU0ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbGlnaHRzX291dF9pbi54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgPgorICAgIDx0cmFuc2xhdGUgYW5kcm9pZDpmcm9tWURlbHRhPSIxMDAlcCIgYW5kcm9pZDp0b1lEZWx0YT0iMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiIAorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvciIKKyAgICAgICAgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDpmcm9tQWxwaGE9IjAuMCIgYW5kcm9pZDp0b0FscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2xpZ2h0c19vdXRfb3V0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2xpZ2h0c19vdXRfb3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJjNTVhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbGlnaHRzX291dF9vdXQueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8dHJhbnNsYXRlIGFuZHJvaWQ6dG9ZRGVsdGE9IjEwMCVwIiBhbmRyb2lkOmZyb21ZRGVsdGE9IjAiIAorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIgCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9oeWRyYXVsaWNfYnJha2VfaW50ZXJwb2xhdG9yIgorICAgICAgICAvPgorICAgIDxhbHBoYSBhbmRyb2lkOnRvQWxwaGE9IjAuMCIgYW5kcm9pZDpmcm9tQWxwaGE9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbmF2aWdhdGlvbl9pbi54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9uYXZpZ2F0aW9uX2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBmZDcyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbmF2aWdhdGlvbl9pbi54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgPgorICAgIDxhbHBoYSBhbmRyb2lkOmZyb21BbHBoYT0iMC4wIiBhbmRyb2lkOnRvQWxwaGE9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbmF2aWdhdGlvbl9vdXQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbmF2aWdhdGlvbl9vdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTdlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9uYXZpZ2F0aW9uX291dC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgPgorICAgIDxhbHBoYSBhbmRyb2lkOnRvQWxwaGE9IjAuMCIgYW5kcm9pZDpmcm9tQWxwaGE9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2J1dHRvbnNfaW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2J1dHRvbnNfaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGZkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9ub3RpZmljYXRpb25fYnV0dG9uc19pbi54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgPgorICAgIDxhbHBoYSBhbmRyb2lkOmZyb21BbHBoYT0iMC4wIiBhbmRyb2lkOnRvQWxwaGE9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2J1dHRvbnNfb3V0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL25vdGlmaWNhdGlvbl9idXR0b25zX291dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxN2U0NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL25vdGlmaWNhdGlvbl9idXR0b25zX291dC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgPgorICAgIDxhbHBoYSBhbmRyb2lkOnRvQWxwaGE9IjAuMCIgYW5kcm9pZDpmcm9tQWxwaGE9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2ljb25zX2luLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL25vdGlmaWNhdGlvbl9pY29uc19pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwZmQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL25vdGlmaWNhdGlvbl9pY29uc19pbi54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgPgorICAgIDxhbHBoYSBhbmRyb2lkOmZyb21BbHBoYT0iMC4wIiBhbmRyb2lkOnRvQWxwaGE9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2ljb25zX291dC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9ub3RpZmljYXRpb25faWNvbnNfb3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzE3ZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2ljb25zX291dC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgPgorICAgIDxhbHBoYSBhbmRyb2lkOnRvQWxwaGE9IjAuMCIgYW5kcm9pZDpmcm9tQWxwaGE9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vcmVjZW50X2FwcF9lbnRlci54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9yZWNlbnRfYXBwX2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQ3ZWVlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vcmVjZW50X2FwcF9lbnRlci54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gU3BlY2lhbCB3aW5kb3cgem9vbSBhbmltYXRpb246IHRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbiwKKyAgICAgaXQgc3RhcnRzIGF0IDIwMCUgYW5kIHNjYWxlcyBkb3duLiAgR29lcyB3aXRoIHpvb21fZXhpdC54bWwuIC0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5kcm9pZDphbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIj4KKyAgICA8c2NhbGUgYW5kcm9pZDpmcm9tWFNjYWxlPSIwLjI1IiBhbmRyb2lkOnRvWFNjYWxlPSIxLjAiCisgICAgICAgICAgIGFuZHJvaWQ6ZnJvbVlTY2FsZT0iMC4yNSIgYW5kcm9pZDp0b1lTY2FsZT0iMS4wIgorICAgICAgICAgICBhbmRyb2lkOnBpdm90WD0iMCVwIiBhbmRyb2lkOnBpdm90WT0iMCVwIgorICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSI1MDAiIC8+CisgICAgPGFscGhhIGFuZHJvaWQ6ZnJvbUFscGhhPSIwLjAiIGFuZHJvaWQ6dG9BbHBoYT0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIi8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3JlY2VudF9hcHBfbGVhdmUueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vcmVjZW50X2FwcF9sZWF2ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4Mzk4OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3JlY2VudF9hcHBfbGVhdmUueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFNwZWNpYWwgd2luZG93IHpvb20gYW5pbWF0aW9uOiB0aGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgZW50ZXJzIHRoZSBzY3JlZW4sCisgICAgIGl0IHN0YXJ0cyBhdCAyMDAlIGFuZCBzY2FsZXMgZG93bi4gIEdvZXMgd2l0aCB6b29tX2V4aXQueG1sLiAtLT4KKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuZHJvaWQ6YW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciI+CisgICAgPHNjYWxlIGFuZHJvaWQ6ZnJvbVhTY2FsZT0iMS4wIiBhbmRyb2lkOnRvWFNjYWxlPSIwLjI1IgorICAgICAgICAgICBhbmRyb2lkOmZyb21ZU2NhbGU9IjEuMCIgYW5kcm9pZDp0b1lTY2FsZT0iMC4yNSIKKyAgICAgICAgICAgYW5kcm9pZDpwaXZvdFg9IjAlcCIgYW5kcm9pZDpwaXZvdFk9IjAlcCIKKyAgICAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIiAvPgorICAgIDxhbHBoYSBhbmRyb2lkOmZyb21BbHBoYT0iMS4wIiBhbmRyb2lkOnRvQWxwaGE9IjAuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IjUwMCIvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9zdGF0dXNfYmFyX2luLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MGZlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9zdGF0dXNfYmFyX2luLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPHRyYW5zbGF0ZSBhbmRyb2lkOmZyb21ZRGVsdGE9Ii0xMDAlcCIgYW5kcm9pZDp0b1lEZWx0YT0iMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2h5ZHJhdWxpY19icmFrZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIC8+CisgICAgPGFscGhhIGFuZHJvaWQ6ZnJvbUFscGhhPSIwLjAiIGFuZHJvaWQ6dG9BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9zdGF0dXNfYmFyX291dC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9zdGF0dXNfYmFyX291dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3MmFiNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfb3V0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPHRyYW5zbGF0ZSBhbmRyb2lkOnRvWURlbHRhPSItMTAwJXAiIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2h5ZHJhdWxpY19icmFrZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIC8+CisgICAgPGFscGhhIGFuZHJvaWQ6dG9BbHBoYT0iMC4wIiBhbmRyb2lkOmZyb21BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9zeXN0ZW1faW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vc3lzdGVtX2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBmZDcyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vc3lzdGVtX2luLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPGFscGhhIGFuZHJvaWQ6ZnJvbUFscGhhPSIwLjAiIGFuZHJvaWQ6dG9BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9zeXN0ZW1fb3V0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N5c3RlbV9vdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTdlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9zeXN0ZW1fb3V0LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPGFscGhhIGFuZHJvaWQ6dG9BbHBoYT0iMC4wIiBhbmRyb2lkOmZyb21BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxMjdiZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWFmODA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDEwM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxY2JlNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMTAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzIwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjQwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzIwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzQwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZGUwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzQwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzYwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMmI4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzYwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzgwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfODAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjMxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzgwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfZGVmYXVsdC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDliODQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfZGVmYXVsdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfcHJlc3NlZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzAwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMWFhZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2xpZ2h0X29wYXF1ZS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9saWdodF9vcGFxdWUuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MGYwNzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2xpZ2h0X29wYXF1ZS45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZW1wdHkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19lbXB0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlNzY1NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZW1wdHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZnVsbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2Z1bGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNWM2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2Z1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8wLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGUzNmM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8xMDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlNTJmZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8yMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjY1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF80MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NWRkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF82MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTMxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF84MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfODAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYTY1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfODAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2FsYXJtLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2FsYXJtLnBuZwppbmRleCAyZDNlYjMwLi44OWRhZWUxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9hbGFybS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfYWxhcm0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoLnBuZwppbmRleCBlOGZiYzllLi45NmRjMDg1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9ibHVldG9vdGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoX2Nvbm5lY3RlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aF9jb25uZWN0ZWQucG5nCmluZGV4IDE4Yzc3ZGYuLjFlNGJiZjUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoX2Nvbm5lY3RlZC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9ibHVldG9vdGhfY29ubmVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcKaW5kZXggODE4ZTI5Mi4uYmRjOGMyNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfMXgucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8zZy5wbmcKaW5kZXggOTU4NjZiMS4uZDBkMTM0NSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfM2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2UucG5nCmluZGV4IDAxNmIzMGIuLjQyMTFiOGMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2UucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcKaW5kZXggZWM2NzJlYi4uZDVlY2U3YSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZwppbmRleCAyN2JhYjczLi42Njg3YjQwIDEwMDc1NQotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8xeC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAwZTY4NDliLi5iYTI0MDgyCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzF4LnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfM2cucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYTg2YTMyNC4uNWFmMmIwNQotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyNDkwMmQ2Li45OTA5YjA5Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZy5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA0MTYwYTk1Li4wZTAyYjhkCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBkNDU5ZWUzLi5mODRhZDMyCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3YjY0NzUxLi5kODBhOGNlCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8zZy5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBkODI5MzBjLi4zMWM5NzZhCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2UucG5nCmluZGV4IDgwOTY4NDYuLmFlOTBjYzggMTAwNzU1Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9nLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGU5NGUxNDYuLmE0ODdmMjkKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9nLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2gucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggODgwNWE0MC4uODE2MDg1YgotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzF4LnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDA3NTQ1ZDUuLjAxMzIwMTkKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDc2MjljZWYuLjM5MDM1NDUKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8zZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyODU3OGM2Li5lZDA5OWZmCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGQ5ZjdhMzAuLmM5MzBlNGMKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2gucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNTA1Y2NkNC4uNDA3YTA2YwotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNzgzYzJiNi4uNjE0MWY3MgotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8xeC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDAwMWVhZWEuLmQ0NGE0Y2YKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfM2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggY2JhZTdkYy4uNTRlYmQ5YgotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9lLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2cucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMTFmM2E1Yy4uMmZlMGJiZgotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2gucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZWI0MjI5NC4uZTU4ZTAxOQotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luXzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fMXgucG5nCmluZGV4IDY2ZmI2MGUuLjAwYTI5YTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fMXgucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl8zZy5wbmcKaW5kZXggMDdlYTQ5OS4uMTFlZTBmMiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl8zZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fZS5wbmcKaW5kZXggZTM5NzY3YS4uZmMxMzVmYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl9lLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luX2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luX2cucG5nCmluZGV4IDQ3YzFmY2EuLjNkMzNhNjIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luX2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl9oLnBuZwppbmRleCBhYzgwZGNlLi5mMzZlMWViIDEwMDc1NQotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luX2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5faC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0XzF4LnBuZwppbmRleCBmODgwOTFiLi5lZjVkYmY0IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0XzF4LnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0XzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfM2cucG5nCmluZGV4IDk1YmIzY2QuLmRiYTk2NzUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfM2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0X2UucG5nCmluZGV4IDBlZjQ3MDEuLjJlNWQ4MmUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0X2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF9nLnBuZwppbmRleCAzMWI5MjZiLi4wOTg1YTA5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0X2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfaC5wbmcKaW5kZXggZWQwMjk4NC4uN2EzMmM0MyAxMDA3NTUKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF9oLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0X2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0XzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0XzF4LnBuZwppbmRleCAwZWU1YjA4Li5iNjIyNTU2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF8xeC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0XzNnLnBuZwppbmRleCBjYWM3ODAyLi4wNGVjNTllIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF8zZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0X2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfZS5wbmcKaW5kZXggZGY2ZTE5NS4uYTQ3Yjk4MiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF9nLnBuZwppbmRleCA0YTJmODY3Li45ZDkwZTcxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF9nLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0X2gucG5nCmluZGV4IDJiNDYyOGYuLjkyMGYyOTAgMTAwNzU1Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0X2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0X2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2dwc19hY3F1aXJpbmcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX2FjcXVpcmluZy5wbmcKaW5kZXggYzQzZmMzYi4uOTAwM2Q2NyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX2FjcXVpcmluZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX2FjcXVpcmluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8wLnBuZwppbmRleCAxZWY3NWQzLi45NWJhMTgxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8wLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8wX2Z1bGx5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzBfZnVsbHkucG5nCmluZGV4IDFlZjc1ZDMuLjk1YmExODEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzBfZnVsbHkucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzBfZnVsbHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzEucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMS5wbmcKaW5kZXggYTdkYzA3ZS4uYWRmNjY4ZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMV9mdWxseS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8xX2Z1bGx5LnBuZwppbmRleCBmMWY0YzRlLi5hZGY2NjhkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8xX2Z1bGx5LnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8xX2Z1bGx5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8yLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzIucG5nCmluZGV4IDkxOGE0NzYuLjdiZjZiNTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzIucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzJfZnVsbHkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMl9mdWxseS5wbmcKaW5kZXggNmUzNGU2Ni4uN2JmNmI1MSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMl9mdWxseS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMl9mdWxseS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8zLnBuZwppbmRleCA1YjJhY2M2Li43ODczOGFjIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8zLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8zX2Z1bGx5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzNfZnVsbHkucG5nCmluZGV4IDM2NjRhYjQuLjc4NzM4YWMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzNfZnVsbHkucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzNfZnVsbHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfNC5wbmcKaW5kZXggZjFmZjU0OC4uYWM4ODE0MyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfNC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfNF9mdWxseS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF80X2Z1bGx5LnBuZwppbmRleCBiNGZhNDgxLi5hYzg4MTQzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF80X2Z1bGx5LnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF80X2Z1bGx5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yaW5nZXJfc2lsZW50LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl9zaWxlbnQucG5nCmluZGV4IDVhNzQxYmIuLmJkZDM3ZTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl9zaWxlbnQucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl9zaWxlbnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl92aWJyYXRlLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl92aWJyYXRlLnBuZwppbmRleCA3ZmYzNzVhLi4yMWMxYzA4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yaW5nZXJfdmlicmF0ZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcmluZ2VyX3ZpYnJhdGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9mbGlnaHRtb2RlLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9mbGlnaHRtb2RlLnBuZwppbmRleCAwMWM3ZTJhLi43YTQxOWYxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZmxpZ2h0bW9kZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2ZsaWdodG1vZGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9udWxsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9udWxsLnBuZwppbmRleCAwM2QyMTQ3Li4xYWRjMDVhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfbnVsbC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX251bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWY5NTQwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFhMTkwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfY2xvc2Vfb24uOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2Nsb3NlX29uLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2QxOTQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfY2xvc2Vfb24uOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZmM3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjA5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5NTFkZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzNWFkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjA0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJmYTRmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NzljZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzZDRjOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTMyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YzAxYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGU1NDg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzVlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjI1MDJiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODdmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE1OWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODU3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OGRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV9sb3dfYmF0dGVyeS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5X2xvd19iYXR0ZXJ5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiYmU2Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5X2xvd19iYXR0ZXJ5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMWYyNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmN2E0ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0NGYwZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfbGlnaHRfb3BhcXVlLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2xpZ2h0X29wYXF1ZS45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwZjA3OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfbGlnaHRfb3BhcXVlLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19lbXB0eS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2VtcHR5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmFkYTQxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19lbXB0eS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19mdWxsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZnVsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzNDZkNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZnVsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2FpcnBsYW5lX29mZi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb2ZmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODk3YmE2MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9haXJwbGFuZV9vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9haXJwbGFuZV9vbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTZiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYWNrLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVhNzliCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X21pbmkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JhdHRlcnlfbWluaS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiYWJiNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X21pbmkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjhiNDcyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JhdHRlcnlfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb2ZmLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb2ZmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDYzYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JsdWV0b290aF9vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JsdWV0b290aF9vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzOWQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2ZhNWZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JyaWdodG5lc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzX2F1dG8ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JyaWdodG5lc3NfYXV0by5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhMTUzMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzX2F1dG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzX2xvdy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19sb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTVlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19sb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9jbG9zZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfY2xvc2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYWJjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfY2xvc2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9kZWZhdWx0X2JnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9kZWZhdWx0X2JnLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgyZDRlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2RlZmF1bHRfYmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb2ZmLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb2ZmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJlZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2dwc19vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2dwc19vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzOWZkYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ob21lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ob21lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDgxM2RjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2hvbWUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9pbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfaW1lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzNjOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2ltZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbGlnaHRzb3V0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9saWdodHNvdXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDdhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbGlnaHRzb3V0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbWVudS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbWVudS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3NzVmMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9tZW51LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfb3Blbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfb3Blbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkNjI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9vcGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcHJlc3NfYmcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3ByZXNzX2JnLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU4MzkzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3ByZXNzX2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcmVjZW50LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yZWNlbnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OGFmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcmVjZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9sYW5zY2FwZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9sYW5zY2FwZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhYWRmNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX2xhbnNjYXBlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9wb3J0cmFpdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9wb3J0cmFpdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMGFjNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX3BvcnRyYWl0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTdkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb2ZmLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9zb3VuZF9vZmYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTFlODYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3NvdW5kX29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjNiYTJmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3NvdW5kX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9taW5pLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX21pbmkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYmQyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9taW5pLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vZmYucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3dpZmlfb2ZmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2FjYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3dpZmlfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiMWM3NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1NzgwMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1MjdiMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjQ5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2M0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxOWRlZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2NGZlOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmFjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDc5NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzYTc1NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMjFkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQ4ZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBhM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdjOWM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiN2M5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzYmFyX2JhY2tncm91bmQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1ZGJlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3NWE1MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzEwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzEwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmFiNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNTA1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzIwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzIwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTE5MDY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzMwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzMwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTZmMTlmMjZiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzQwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzQwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGFhYjIzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzUwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzUwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQyNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzYwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzYwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWE5MjdhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzcwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzcwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODE2MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzgwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzgwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RkOWJiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfODAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzkwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzkwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTM2ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfOTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5bWluaV8xMDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pXzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViMGYyOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5bWluaV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5bWluaV9yZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pX3JlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjYzZiOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5bWluaV9yZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9oaWRlbm90aWZpY2F0aW9uX2hhbmRsZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfaGlkZW5vdGlmaWNhdGlvbl9oYW5kbGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2VkZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfaGlkZW5vdGlmaWNhdGlvbl9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9taW5pbWV0ZXJfYmcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX21pbmltZXRlcl9iZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyNjVmYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9taW5pbWV0ZXJfYmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9wYW5lbF9iZy45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9wYW5lbF9iZy45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UwMzRiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3BhbmVsX2JnLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjkzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNWQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU3NjNiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8yMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2NjM2MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8zMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZDk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF80MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyMjlkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF81MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5ODlkNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF82MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjNTdkYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF83MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4MTk2OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF84MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3N2FlMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfODAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfOTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF85MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2MDQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfOTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxtaW5pXzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsbWluaV8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZWFhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsbWluaV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb2ZmLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3RvZ2dsZV9iZ19vZmYuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4NDlkOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb2ZmLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb24uOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfdG9nZ2xlX2JnX29uLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTA1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfdG9nZ2xlX2JnX29uLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9haXJwbGFuZV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9haXJwbGFuZV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjg3NTMyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9icmlnaHRuZXNzX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmYzgzZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9icmlnaHRuZXNzX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg0NzljCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9sb2NrZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxZDI2YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9sb2NrZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9zb3VuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9zb3VuZF9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjYzNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjZhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkIiAvPgorICAgIDxpdGVtCisgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsIiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2J1dHRvbl9mcmFtZS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYnV0dG9uX2ZyYW1lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGIzOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2J1dHRvbl9mcmFtZS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnV0dG9uX2ZyYW1lX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J1dHRvbl9mcmFtZV9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9pY19zeXNiYXJfaWNvbl9iZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiYTJhOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9pY19zeXNiYXJfaWNvbl9iZy54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfc3lzYmFyX3ByZXNzX2JnIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19zeXNiYXJfZGVmYXVsdF9iZyIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9yZWNlbnRfb3ZlcmxheS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvcmVjZW50X292ZXJsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZmEzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvcmVjZW50X292ZXJsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9yZWNlbnRfcmV6X2JvcmRlci5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvcmVjZW50X3Jlel9ib3JkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDI1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvcmVjZW50X3Jlel9ib3JkZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2sueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiZjE0NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2sueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja19wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjY5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTE3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzI4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9yZWNlbnQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzA4NDU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3JlY2VudF9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3JlY2VudF9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFiNjgxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0b19ub3JtYWwiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTUxYmYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bGV2ZWwtbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzEwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjIwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfMjAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMzAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV8zMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI0MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzQwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjUwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfNTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNjAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV82MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI3MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzcwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjgwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfODAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iOTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV85MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV8xMDAiIC8+Cis8L2xldmVsLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnltaW5pLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzAwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnltaW5pLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8Y2xpcCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6Y2xpcE9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOm1heExldmVsPSIxMDAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCI+CisgICAgPGxldmVsLWxpc3Q+CisgICAgICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjE1MDAiICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnltaW5pX3JlZCIgLz4KKyAgICAgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAwMDAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmlfMTAwIiAvPgorICAgIDwvbGV2ZWwtbGlzdD4KKzwvY2xpcD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfc2lnbmFsLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfc2lnbmFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTYxYzM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWwueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxsZXZlbC1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzEwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjIwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8yMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIzMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNDAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzQwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjUwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF81MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI2MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNjAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNzAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzcwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjgwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF84MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI5MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfOTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8xMDAiIC8+Cis8L2xldmVsLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3NpZ25hbG1pbmkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWxtaW5pLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThiZjEwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWxtaW5pLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8Y2xpcCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6Y2xpcE9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICBhbmRyb2lkOm1heExldmVsPSIxMDAwMCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxtaW5pXzEwMCIgLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3dpZmkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjFjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3dpZmkueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxsZXZlbC1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzEwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjIwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8yMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIzMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNDAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzQwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjUwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF81MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI2MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNjAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNzAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzcwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjgwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF84MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI5MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfOTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8xMDAiIC8+Cis8L2xldmVsLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3dpZmltaW5pLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaW1pbmkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNmM5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3dpZmltaW5pLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8Y2xpcCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6Y2xpcE9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICBhbmRyb2lkOm1heExldmVsPSIxMDAiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsbWluaV8xMDAiIC8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NGRmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyLnhtbApAQCAtMCwwICsxLDE5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclZpZXcKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6c3lzdGVtdWk9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc3lzdGVtdWkiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIgorICAgID4KKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYXJfY29udGVudHMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICA+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9leHBhbmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9vcGVuIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmciCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJub3RpZmljYXRpb25JY29uc0NsaWNrZWQiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZpY2F0aW9uQnV0dG9ucyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQCtpZC9leHBhbmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQCtpZC9zeXN0ZW1JbmZvIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9kb19ub3RfZGlzdHVyYiIKKyAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjZkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3RhdHVzX2Jhcl9kb19ub3RfZGlzdHVyYl9idXR0b24iCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfYWxsX2J1dHRvbiIKKyAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjZkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uIgorICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWEKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZpY2F0aW9uSWNvbnMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkAraWQvZXhwYW5kIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkAraWQvc3lzdGVtSW5mbyIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDx2aWV3CisgICAgICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWEkSWNvbkxheW91dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb25zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAKmFuZHJvaWQ6ZGltZW4vc3RhdHVzX2Jhcl9pY29uX3NpemUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPHZpZXcKKyAgICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSREcmFnZ2VyVmlldyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2hhbmRsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX2hpZGVub3RpZmljYXRpb25faGFuZGxlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LklucHV0TWV0aG9kQnV0dG9uCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbWVCdXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX2ltZV9kZWZhdWx0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWE+CisKKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGlja2VyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkAraWQvc3lzdGVtSW5mbyIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YW5pbWF0ZUxheW91dENoYW5nZXM9InRydWUiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9zdGF0dXNfYmFyX2NlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNTZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckluUGFyZW50PSJ0cnVlIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25hdmlnYXRpb25BcmVhIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLktleUJ1dHRvblZpZXcgYW5kcm9pZDppZD0iQCtpZC9tZW51IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfbWVudSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9pY19zeXNiYXJfaWNvbl9iZyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgICAgIHN5c3RlbXVpOmtleUNvZGU9IjgyIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZWNlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9yZWNlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9InJlY2VudEJ1dHRvbkNsaWNrZWQiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuS2V5QnV0dG9uVmlldyBhbmRyb2lkOmlkPSJAK2lkL2hvbWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX2hvbWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmciCisgICAgICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iMyIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5LZXlCdXR0b25WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmFjayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYmFjayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9pY19zeXNiYXJfaWNvbl9iZyIKKyAgICAgICAgICAgICAgICBzeXN0ZW11aTprZXlDb2RlPSI0IgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICA8IS0tIEl0J3MgY3VydGFpbnMgZm9yIHlvdS4gLS0+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xpZ2h0c19vdXQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX2xpZ2h0c291dCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJpbnZpc2libGUiCisgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICAvPgorPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclZpZXc+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfY2VudGVyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfY2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDc0NjcyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9jZW50ZXIueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gQ2VudGVyIG9mIHN0YXR1cyBiYXI6IFN5c3RlbSBpbmZvIGRpc3BsYXksIHN5c3RlbSBpbmZvIHBhbmVsIHRyaWdnZXIgLS0+Cis8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9zeXN0ZW1JbmZvIgorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczpzeXN0ZW11aT0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9jb20uYW5kcm9pZC5zeXN0ZW11aSIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckluUGFyZW50PSJ0cnVlIgorICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgIGFuZHJvaWQ6b25DbGljaz0ic3lzdGVtSW5mb0NsaWNrZWQiCisgICAgPgorICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuQ2xvY2sKKyAgICAgICAgc3R5bGU9IkAqYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSWNvbiIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbG9jayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjY0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMmRpcCIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjY0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL2Nsb2NrIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX21pbmltZXRlcl9iZyIgCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NpZ25hbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjY0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9jbG9jayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl9taW5pbWV0ZXJfYmciIAorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5X2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9iYXR0ZXJ5IgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYmF0dGVyeV9taW5pIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zaWduYWxfaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9zaWduYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckluUGFyZW50PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl93aWZpX21pbmkiCisgICAgICAgIC8+Cis8L1JlbGF0aXZlTGF5b3V0PgorCisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDlhMWNjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sCkBAIC0wLDAgKzEsMzggQEAKKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY1c3AiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZCIKKyAgICA+CisKKyAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92ZXRvIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvIgorICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBudWxsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE2ZGlwIgorICAgICAgICAvPgorCisgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5MYXRlc3RJdGVtVmlldyBhbmRyb2lkOmlkPSJAK2lkL2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL3ZldG8iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRzcCIKKyAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNnNwIgorICAgICAgICAvPgorCisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxc3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgICAgICAvPgorCis8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzlhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfbm90aWZpY2F0aW9ucy54bWwKQEAgLTAsMCArMSw0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgorPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uUGFuZWwKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICA+CisKKyAgICA8U2Nyb2xsVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvblNjcm9sbGVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgPgorICAgICAgICA8TGluZWFyTGF5b3V0IAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxib3R0b20iCisgICAgICAgICAgICBhbmRyb2lkOmFuaW1hdGlvbkNhY2hlPSJmYWxzZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIgorICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZGVzY2VuZGFudEZvY3VzYWJpbGl0eT0iYWZ0ZXJEZXNjZW5kYW50cyIKKyAgICAgICAgICAgID4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9TY3JvbGxWaWV3PgorPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0Lk5vdGlmaWNhdGlvblBhbmVsPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX3N5c3RlbS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfc3lzdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQ2OWY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX3N5c3RlbS54bWwKQEAgLTAsMCArMSwyMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlN5c3RlbVBhbmVsCisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3BhbmVsX2JnIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjcwZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMjBkaXAiCisgICAgPgorCisgICAgPCEtLSB0b3Agcm93OiBxdWljayBzZXR0aW5ncyBidXR0b25zIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRpcCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgID4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnJpZ2h0bmVzcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9icmlnaHRuZXNzIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zb3VuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfc291bmRfb24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfdG9nZ2xlX2JnX29mZiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29yaWVudGF0aW9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjkwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9yb3RhdGVfb24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfdG9nZ2xlX2JnX29mZiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2FpcnBsYW5lIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjkwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9haXJwbGFuZV9vbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl90b2dnbGVfYmdfb2ZmIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZ3BzIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjkwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9ncHNfb24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfdG9nZ2xlX2JnX29mZiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JsdWV0b290aCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYmx1ZXRvb3RoX29uIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPCEtLSBtYWluIHJvdzogbWV0ZXJzLCBjbG9jayAtLT4KKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE5MmRpcCIKKyAgICAgICAgPgorICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNTZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE5MmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjQ4ZGlwIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnlfbWV0ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1NmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyQ3JvcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5IgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5X2luZm8iCisgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuU3lzdGVtUGFuZWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAaWQvYmF0dGVyeV9tZXRlciIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuQ2xvY2sKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlN5c3RlbVBhbmVsIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbG9jayIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjUwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckhvcml6b250YWw9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjU2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxOTJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjQ4ZGlwIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3NpZ25hbF9tZXRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjU2ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXJDcm9wIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbCIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zaWduYWxfaW5mbyIKKyAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5TeXN0ZW1QYW5lbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkBpZC9zaWduYWxfbWV0ZXIiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9iYXR0ZXJ5X29uIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl93aWZpX29uIgorICAgICAgICAgICAgLz4KKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgPCEtLSBib3R0b20gcm93OiB0cmFuc2llbnQgaW5kaWNhdG9ycywgc2V0dGluZ3MgYnV0dG9uIC0tPgorICAgIDxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMXNwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgICAgICAvPgorICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZGlwIgorICAgICAgICA+CisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8IS0tIFRPRE86IGFsYXJtIC0tPgorICAgICAgICAgICAgPCEtLSBUT0RPOiBzeW5jIC0tPgorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NldHRpbmdzX2J1dHRvbiIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRleHRCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMzJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIzMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3lzdGVtX3BhbmVsX3NldHRpbmdzX2J1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxc3AiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL3NldHRpbmdzX2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQCphbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfdmVydGljYWxfZGFyayIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlN5c3RlbVBhbmVsPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2UvdGlja2VyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3RpY2tlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkODU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3RpY2tlci54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmMDAwMDAwIgorICAgID4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRwIgorICAgICAgICA+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCisgICAgICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N1YnRpdGxlIgorICAgICAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS90aWNrZXJfY29tcGF0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3RpY2tlcl9jb21wYXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Yzc1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS90aWNrZXJfY29tcGF0LnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjZmYwMDAwMDAiCisgICAgPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEyZHAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIgorICAgICAgICAvPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3RpY2tlcl9pY29uLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3RpY2tlcl9pY29uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWZhOTg3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2UvdGlja2VyX2ljb24ueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW1hZ2VWaWV3CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMGRwIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzBkcCIKKyAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRwIgorICAgIC8+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9pbnRydWRlcl9hbGVydC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0YTc3NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxGcmFtZUxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMyZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iOGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iOGRpcCIKKyAgICA+CisgICAgICAgIAorICAgIDxMaW5lYXJMYXlvdXQgCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW50cnVkZXJfYWxlcnRfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmFuaW1hdGlvbkNhY2hlPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmQiCisgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIgorICAgICAgICA+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGVydEljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsZXJ0VGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSW50cnVkZXJBbGVydCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9yZWNlbnRfYXBwc19hY3Rpdml0eS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3JlY2VudF9hcHBzX2FjdGl2aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY2MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9yZWNlbnRfYXBwc19hY3Rpdml0eS54bWwKQEAgLTAsMCArMSw1NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPCEtLSBUaXRsZSAtLT4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjODBGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9yZWNlbnRfdGFza3NfdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgorCisgICAgPCEtLSBUaGlzIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdmlzaWJsZSB3aGVuIGNhcm91c2VsIGlzIGludmlzaWJsZSAtLT4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub19hcHBsaWNhdGlvbnNfbWVzc2FnZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVjZW50X3Rhc2tzX2VtcHR5IgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KKworICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQuUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2Fyb3VzZWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKyAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXc+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9yZWNlbnRzX2RldGFpbF92aWV3LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvcmVjZW50c19kZXRhaWxfdmlldy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5ZDBmMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvcmVjZW50c19kZXRhaWxfdmlldy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPCEtLSBBcHBsaWNhdGlvbiBUaXRsZSAtLT4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hcHBfdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiLz4KKworICAgIDwhLS0gQXBwbGljYXRpb24gRGV0YWlscyAtLT4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcHBfZGVzY3JpcHRpb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXIueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbAppbmRleCBhNWQ2ODg1Li4yZjFiMzZlOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXIueG1sCkBAIC0yMSw3ICsyMSw4IEBACiA8IS0tICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfY2xvc2VkX2RlZmF1bHRfYmFja2dyb3VuZCIgLS0+CiA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlN0YXR1c0JhclZpZXcKICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzYmFyX2JhY2tncm91bmQiCisgICAgeG1sbnM6c3lzdGVtdWk9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc3lzdGVtdWkiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgogICAgIGFuZHJvaWQ6ZGVzY2VuZGFudEZvY3VzYWJpbGl0eT0iYWZ0ZXJEZXNjZW5kYW50cyIKQEAgLTU1LDYgKzU2LDggQEAKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCiAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxsZWZ0IgogICAgICAgICAgICAgLz4KICAgICA8L0xpbmVhckxheW91dD4KQEAgLTEwOCw2ICsxMTEsNiBAQAogICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxsZWZ0IgogICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2cHgiCiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2cHgiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tncm91bmQiCiAgICAgICAgIC8+CiA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TdGF0dXNCYXJWaWV3PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2V4cGFuZGVkLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9leHBhbmRlZC54bWwKaW5kZXggYzc0NGU0Yi4uYjViMWI1MCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2V4cGFuZGVkLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfZXhwYW5kZWQueG1sCkBAIC0zMSw3ICszMSw3IEBACiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RwIgogICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjVkcCIKICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjNkcCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvdGl0bGVfYmFyX3BvcnRyYWl0IgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zaGFkZV9oZWFkZXJfYmFja2dyb3VuZCIKICAgICAgICAgPgogICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNhcnJpZXJMYWJlbAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMWRwIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRwIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNmZmRmZGZkZiIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSI/YW5kcm9pZDphdHRyL3RleHRDb2xvclNlY29uZGFyeSIKICAgICAgICAgICAgIC8+CiAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NsZWFyX2FsbF9idXR0b24iCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgpAQCAtNTcsNyArNTcsNyBAQAogICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uU3R5bGUiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNWRwIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE1ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9kZWZhdWx0X3NtYWxsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnRuX2RlZmF1bHRfc21hbGwiCiAgICAgICAgICAgICAvPgogICAgIDwvTGluZWFyTGF5b3V0PgogCkBAIC03MSw3ICs3MSw2IEBACiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Im5vbmUiCi0gICAgICAgICAgICBhbmRyb2lkOm92ZXJTY3JvbGxNb2RlPSJpZkNvbnRlbnRTY3JvbGxzIgogICAgICAgICAgICAgPgogICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQKICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvbkxpbmVhckxheW91dCIKQEAgLTgzLDcgKzgyLDcgQEAKICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9ub05vdGlmaWNhdGlvbnNUaXRsZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3NoYWRlX2JnY29sb3IiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3RpdGxlX2Jhcl9wb3J0cmFpdCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRwIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpdGxlIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3RhdHVzX2Jhcl9ub19ub3RpZmljYXRpb25zX3RpdGxlIgpAQCAtOTIsNyArOTEsNyBAQAogICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL29uZ29pbmdUaXRsZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3NoYWRlX2JnY29sb3IiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3RpdGxlX2Jhcl9wb3J0cmFpdCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRwIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpdGxlIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3RhdHVzX2Jhcl9vbmdvaW5nX2V2ZW50c190aXRsZSIKQEAgLTEwNiw3ICsxMDUsNyBAQAogICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xhdGVzdFRpdGxlIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc2hhZGVfYmdjb2xvciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvdGl0bGVfYmFyX3BvcnRyYWl0IgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZHAiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGl0bGUiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudHNfdGl0bGUiCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sCmluZGV4IGI4YTFjYmUuLjg4ZDk3MzkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sCkBAIC0xNiw4ICsxNiw4IEBACiAKICAgICA8VmlldwogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2xpZ2h0X29wYXF1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxc3AiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodCIKICAgICAgICAgLz4KIAogPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfdHJhY2tpbmcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX3RyYWNraW5nLnhtbAppbmRleCAzYjliNzc1Li5hMmI0MGU2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfdHJhY2tpbmcueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl90cmFja2luZy54bWwKQEAgLTI2LDEyICsyNiwxMSBAQAogICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIwcHgiCiAgICAgPgogCi0gICAgPFZpZXcKLSAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmMjEyMTIxIgotICAgICAgICAgLz4KKyAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlRyYWNraW5nUGF0dGVyblZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgLz4KIAogICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuQ2xvc2VEcmFnSGFuZGxlIGFuZHJvaWQ6aWQ9IkAraWQvY2xvc2UiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCkBAIC00Myw3ICs0Miw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRYWSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZV9vbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc2hhZGVfaGFuZGxlYmFyIgogICAgICAgICAgICAgLz4KIAogICAgIDwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNsb3NlRHJhZ0hhbmRsZT4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbG9ycy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb2xvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MTYxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb2xvcnMueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyZXNvdXJjZXM+CisgICAgPGRyYXdhYmxlIG5hbWU9InN0YXR1c19iYXJfYmFja2dyb3VuZCI+IzAwMDAwMDwvZHJhd2FibGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29uZmlnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmNWQxOGQxMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAorICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+Cis8cmVzb3VyY2VzPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19zdGF0dXNfYmFyX3Bvc2l0aW9uIj4xPC9pbnRlZ2VyPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1OWM5MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBUaGUgdGV4dCBmb3IgdGhlIGJ1dHRvbiBpbiB0aGUgbm90aWZpY2F0aW9uIHdpbmRvdy1zaGFkZSB0aGF0IGNsZWFycworICAgICAgICAgYWxsIG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBub3RpZmljYXRpb25zLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbiI+Q2xlYXIgYWxsPC9zdHJpbmc+CisKKyAgICA8IS0tIFN5c3RlbSBwYW5lbCAoIlF1aWNrIFNldHRpbmdzIikgLS0+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgYmF0dGVyeSBtZXRlci4gU2hvdWxkCisgICAgICAgICBpbmNsdWRlIHRoZSB3b3JkIGZvciAiYmF0dGVyeSIgYW5kIGEgcGxhY2UgZm9yIHRoZSBwZXJjZW50YWdlIGNoYXJnZQorICAgICAgICAgYXZhaWxhYmxlLiBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfYmF0dGVyeV9tZXRlcl9mb3JtYXQiPgorICAgICAgICBCYXR0ZXJ5OiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0icGVyY2VudCI+JSU8L3hsaWZmOmc+CisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIG5vIGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlLiBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2Rpc2Nvbm5lY3RlZCI+CisgICAgICAgIG5vIGludGVybmV0IGNvbm5lY3Rpb24KKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbm5lY3RlZCwgbmFtZWQgV2ktRmkgbmV0d29yay4KKyAgICAgICAgIFNob3VsZCBpbmNsdWRlIHRoZSB3b3JkIGZvciAiV2ktRmkiIGFuZCBhIHBsYWNlaG9sZGVyIGZvciB0aGUKKyAgICAgICAgIHdpcmVsZXNzIG5ldHdvcmsncyBTU0lELiBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX3dpZmlfc3NpZF9mb3JtYXQiPgorICAgICAgICBXaS1GaTogPHhsaWZmOmcgaWQ9InNzaWQiPiVzPC94bGlmZjpnPgorICAgIDwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBpdCBpcyBkaXNwbGF5aW5nIFdpLUZpIHN0YXR1cyBhbmQgV2ktRmkgaXMgY29ubmVjdGVkIHRvIGEgbmV0d29yaworICAgICAgICAgd2hvc2UgU1NJRCBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX25vc3NpZCI+CisgICAgICAgIFdpLUZpOiBjb25uZWN0ZWQKKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBXaS1GaSBzdGF0dXMgYW5kIFdpLUZpIGlzIGluIHRoZSBwcm9jZXNzIG9mCisgICAgICAgICBjb25uZWN0aW5nIHRvIGEgbmV0d29yay4gIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN5c3RlbV9wYW5lbF9zaWduYWxfbWV0ZXJfd2lmaV9jb25uZWN0aW5nIj4KKyAgICAgICAgV2ktRmk6IGNvbm5lY3RpbmfigKYKKyAgICA8L3N0cmluZz4KKyAKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIGl0IGlzIGRpc3BsYXlpbmcgbW9iaWxlIGRhdGEgKDNHKSBzdGF0dXMgYW5kIGEgbmV0d29yayBjb25uZWN0aW9uIGlzCisgICAgICAgICBhdmFpbGFibGUuCisgICAgICAgICBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2RhdGFfY29ubmVjdGVkIj4KKyAgICAgICAgTW9iaWxlIGRhdGE6IGNvbm5lY3RlZAorICAgIDwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBpdCBpcyBkaXNwbGF5aW5nIG1vYmlsZSBkYXRhICgzRykgc3RhdHVzIGFuZCBhIG5ldHdvcmsgY29ubmVjdGlvbiBpcworICAgICAgICAgdW5hdmFpbGFibGUuCisgICAgICAgICBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2RhdGFfY29ubmVjdGluZyI+CisgICAgICAgIE1vYmlsZSBkYXRhOiBjb25uZWN0aW5n4oCmCisgICAgPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9hdHRycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiY2YyMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IktleUJ1dHRvblZpZXciPgorICAgICAgICA8YXR0ciBuYW1lPSJrZXlDb2RlIiBmb3JtYXQ9ImludGVnZXIiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbG9ycy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbG9ycy54bWwKaW5kZXggNjU1MDQzOC4uYTBkZWY2YiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApAQCAtMTcsNyArMTcsNSBAQAogICovCiAtLT4KIDxyZXNvdXJjZXM+Ci0gICAgPGRyYXdhYmxlIG5hbWU9InNoYWRlX2JnY29sb3IiPiNmZjI4MjgyODwvZHJhd2FibGU+Ci0gICAgPGRyYXdhYmxlIG5hbWU9Im5vdGlmaWNhdGlvbl9oZWFkZXJfdGV4dF9jb2xvciI+I2ZmOTY5Njk2PC9kcmF3YWJsZT4KICAgICA8ZHJhd2FibGUgbmFtZT0ibm90aWZpY2F0aW9uX251bWJlcl90ZXh0X2NvbG9yIj4jZmZmZmZmZmY8L2RyYXdhYmxlPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggOGVhNDZlNS4uYWMwMGM2OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtMjAsNyArMjAsMTYgQEAKIDwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAogICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+CiA8cmVzb3VyY2VzPgotICAgIDwhLS0gQ29udHJvbCB3aGV0aGVyIHN0YXR1cyBiYXIgc2hvdWxkIGRpc3Rpbmd1aXNoIEhTUEEgZGF0YSBpY29uIGZvcm0gVU1UUyBkYXRhIGljb24gb24gZGV2aWNlcyAtLT4KKworICAgIDwhLS0gQ29udHJvbCB3aGV0aGVyIHN0YXR1cyBiYXIgc2hvdWxkIGRpc3Rpbmd1aXNoIEhTUEEgZGF0YSBpY29uIGZvcm0gVU1UUworICAgIGRhdGEgaWNvbiBvbiBkZXZpY2VzIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19oc3BhX2RhdGFfZGlzdGluZ3Vpc2hhYmxlIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBzdGF0dXMgYmFyLgorICAgICAgICAwIC0gdG9wCisgICAgICAgIDEgLSBib3R0b20KKyAgICAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbiI+MDwvaW50ZWdlcj4KKwogPC9yZXNvdXJjZXM+CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IGJhM2EzZDEuLjFmMjRiYTYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMjQsNiArMjQsMTggQEAKICAgICAgICAgIGFsbCBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgbm90aWZpY2F0aW9ucy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iPkNsZWFyPC9zdHJpbmc+CiAKKyAgICA8IS0tIFRoZSB0ZXh0IGZvciB0aGUgYnV0dG9uIGluIHRoZSBub3RpZmljYXRpb24gd2luZG93LXNoYWRlIHRoYXQgdHVybnMKKyAgICAgICAgIG9uIGRvIG5vdCBkaXN0dXJiIG1vZGUsIHdoZXJlIG5vdGlmaWNhdGlvbnMgbm8gbG9uZ2VyIHNob3cgdGhlaXIgdGlja2VyLAorICAgICAgICAgbm8gc291bmQgcGxheXMsIGFuZCBubyBpY29ucyBhcmUgdmlzaWJsZS4gIFRoZSB3aW5kb3dzaGFkZSBjb250aW51ZXMgdG8gc2hvdworICAgICAgICAgdGhlIG5vdGlmaWNhdGlvbnMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9kb19ub3RfZGlzdHVyYl9idXR0b24iPkRvIG5vdCBkaXN0dXJiPC9zdHJpbmc+CisKKyAgICA8IS0tIFRoZSB0ZXh0IGZvciB0aGUgYnV0dG9uIGluIHRoZSBub3RpZmljYXRpb24gd2luZG93LXNoYWRlIHRoYXQgdHVybnMKKyAgICAgICAgIG9mZiBkbyBub3QgZGlzdHVyYiBtb2RlLiAgQWZ0ZXIgY2xpY2tpbmcgdGhpcywgbm90aWZpY2F0aW9ucyB3aWxsIGJlCisgICAgICAgICBzaG93biBhZ2Fpbi4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3BsZWFzZV9kaXN0dXJiX2J1dHRvbiI+U2hvdyBub3RpZmljYXRpb25zPC9zdHJpbmc+CisKKwogICAgIDwhLS0gVGhlIGxhYmVsIGluIHRoZSBiYXIgYXQgdGhlIHRvcCBvZiB0aGUgc3RhdHVzIGJhciB3aGVuIHRoZXJlIGFyZSBubyBub3RpZmljYXRpb25zCiAgICAgICAgICBzaG93aW5nLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfbm9fbm90aWZpY2F0aW9uc190aXRsZSI+Tm8gbm90aWZpY2F0aW9uczwvc3RyaW5nPgpAQCAtNTEsNCArNjMsMjAgQEAKICAgICAgICAgIHBvd2VyIHVzYWdlIGFjdGl2aXR5IHRvIGZpbmQgb3V0IHdoYXQgZHJhaW5lZCB0aGUgYmF0dGVyeS4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJiYXR0ZXJ5X2xvd193aHkiPkJhdHRlcnkgdXNlPC9zdHJpbmc+CiAKKyAgICA8IS0tIE5hbWUgb2YgdGhlIGJ1dHRvbiB0aGF0IGxpbmtzIHRvIHRoZSBTZXR0aW5ncyBhcHAuIFtNQVhDSEFSUz1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN5c3RlbV9wYW5lbF9zZXR0aW5nc19idXR0b24iPlNldHRpbmdzPC9zdHJpbmc+CisKKworICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogdGl0bGUKKyAgICAgVE9ETzogdGhpcyBzaG91bGQgbW92ZSB0byBTeXN0ZW1VSS5hcGssIGJ1dCB0aGUgY29kZSBmb3IgdGhlIG9sZCAKKyAgICAgICAgICAgIHJlY2VudCBkaWFsb2cgaXMgc3RpbGwgaW4gdGhlIGZyYW1ld29yaworICAgICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InJlY2VudF90YXNrc190aXRsZSI+UmVjZW50PC9zdHJpbmc+CisgICAgPCEtLSBSZWNlbnQgVGFza3MgZGlhbG9nOiBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG5vIHJlY2VudCBhcHBsaWNhdGlvbnMKKyAgICAgVE9ETzogdGhpcyBzaG91bGQgbW92ZSB0byBTeXN0ZW1VSS5hcGssIGJ1dCB0aGUgY29kZSBmb3IgdGhlIG9sZCAKKyAgICAgICAgICAgIHJlY2VudCBkaWFsb2cgaXMgc3RpbGwgaW4gdGhlIGZyYW1ld29yaworICAgICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InJlY2VudF90YXNrc19lbXB0eSI+Tm8gcmVjZW50IGFwcGxpY2F0aW9ucy48L3N0cmluZz4KKworICAgIAogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggODZiY2YzYS4uZjU5MjcwMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMTksMTAgKzE5LDI0IEBACiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSIgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGw8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGRyYXdhYmxlL25vdGlmaWNhdGlvbl9oZWFkZXJfdGV4dF9jb2xvcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JbnRydWRlckFsZXJ0IgogICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+CiAgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuU3lzdGVtUGFuZWwiCisgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPiM1MEZGRkZGRjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UZXh0QnV0dG9uIgorICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4jRkZGRkZGRkY8L2l0ZW0+CisgICAgPC9zdHlsZT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZWEzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmV4LmNhcm91c2VsLkNhcm91c2VsVmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5leC5jYXJvdXNlbC5DYXJvdXNlbFZpZXdIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZXguY2Fyb3VzZWwuQ2Fyb3VzZWxSUy5DYXJvdXNlbENhbGxiYWNrOworaW1wb3J0IGNvbS5hbmRyb2lkLmV4LmNhcm91c2VsLkNhcm91c2VsVmlld0hlbHBlci5EZXRhaWxUZXh0dXJlUGFyYW1ldGVyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuSVRodW1ibmFpbFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5SdW5uaW5nVGFza0luZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnRGbGFnc0RyYXdGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIFJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREJHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBUkRfU0xPVFMgPSA1NjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklTSUJMRV9TTE9UUyA9IDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9UQVNLUyA9IFZJU0lCTEVfU0xPVFMgKiAyOworCisgICAgLy8gVE9ETzogdGhlc2Ugc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVRBSUxfVEVYVFVSRV9NQVhfV0lEVEggPSAyMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVEFJTF9URVhUVVJFX01BWF9IRUlHSFQgPSA4MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVFVSRV9XSURUSCA9IDI1NjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVFVSRV9IRUlHSFQgPSAyNTY7CisKKyAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlciBtQWN0aXZpdHlNYW5hZ2VyOworICAgIHByaXZhdGUgTGlzdDxSdW5uaW5nVGFza0luZm8+IG1SdW5uaW5nVGFza0xpc3Q7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Qb3J0cmFpdE1vZGUgPSB0cnVlOworICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGl2aXR5RGVzY3JpcHRpb24+IG1BY3Rpdml0eURlc2NyaXB0aW9ucworICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5RGVzY3JpcHRpb24+KCk7CisgICAgcHJpdmF0ZSBDYXJvdXNlbFZpZXcgbUNhcm91c2VsVmlldzsKKyAgICBwcml2YXRlIExvY2FsQ2Fyb3VzZWxWaWV3SGVscGVyIG1IZWxwZXI7CisgICAgcHJpdmF0ZSBWaWV3IG1Ob1JlY2VudHNWaWV3OworICAgIHByaXZhdGUgQml0bWFwIG1Mb2FkaW5nQml0bWFwOworICAgIHByaXZhdGUgQml0bWFwIG1SZWNlbnRPdmVybGF5OworICAgIHByaXZhdGUgYm9vbGVhbiBtSGlkZGVuID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IaWRpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIERldGFpbEluZm8gbURldGFpbEluZm87CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIGEgY29udGFpbmVyIGZvciBhbGwgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBEZXRhaWxWaWV3IHdlJ2xsCisgICAgICogYmUgZHJhd2luZyB0byBhIGJpdG1hcCBhbmQgc2VuZGluZyB0byBDYXJvdXNlbC4KKyAgICAgKgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXRhaWxJbmZvIHsKKyAgICAgICAgcHVibGljIERldGFpbEluZm8oVmlldyBfdmlldywgVGV4dFZpZXcgX3RpdGxlLCBUZXh0VmlldyBfZGVzYykgeworICAgICAgICAgICAgdmlldyA9IF92aWV3OworICAgICAgICAgICAgdGl0bGUgPSBfdGl0bGU7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IF9kZXNjOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERyYXdzIHZpZXcgaW50byB0aGUgZ2l2ZW4gYml0bWFwLCBpZiBwcm92aWRlZAorICAgICAgICAgKiBAcGFyYW0gYml0bWFwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQml0bWFwIGRyYXcoQml0bWFwIGJpdG1hcCkgeworICAgICAgICAgICAgcmVzaXplVmlldyh2aWV3LCBERVRBSUxfVEVYVFVSRV9NQVhfV0lEVEgsIERFVEFJTF9URVhUVVJFX01BWF9IRUlHSFQpOworICAgICAgICAgICAgaW50IGRlc2lyZWRXaWR0aCA9IHZpZXcuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGludCBkZXNpcmVkSGVpZ2h0ID0gdmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCB8fCBkZXNpcmVkV2lkdGggIT0gYml0bWFwLmdldFdpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgZGVzaXJlZEhlaWdodCAhPSBiaXRtYXAuZ2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKGRlc2lyZWRXaWR0aCwgZGVzaXJlZEhlaWdodCwgQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhiaXRtYXApOworICAgICAgICAgICAgdmlldy5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICByZXR1cm4gYml0bWFwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcmNlIGEgbGF5b3V0IHBhc3Mgb24gdGhlIGdpdmVuIHZpZXcuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgcmVzaXplVmlldyhWaWV3IHZpZXcsIGludCBtYXhXaWR0aCwgaW50IG1heEhlaWdodCkgeworICAgICAgICAgICAgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLmdldE1vZGUoTWVhc3VyZVNwZWMuQVRfTU9TVCkKKyAgICAgICAgICAgICAgICAgICAgfCBNZWFzdXJlU3BlYy5nZXRTaXplKG1heFdpZHRoKTsKKyAgICAgICAgICAgIGludCBoZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShNZWFzdXJlU3BlYy5BVF9NT1NUKQorICAgICAgICAgICAgICAgICAgICB8IE1lYXN1cmVTcGVjLmdldFNpemUobWF4SGVpZ2h0KTsKKyAgICAgICAgICAgIHZpZXcubWVhc3VyZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICAgICAgdmlldy5sYXlvdXQoMCwgMCwgdmlldy5nZXRNZWFzdXJlZFdpZHRoKCksIHZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgICAgICBMb2cudihUQUcsICJSRVNJWkVEIFZJRVc6ICIgKyB2aWV3LmdldFdpZHRoKCkgKyAiLCAiICsgdmlldy5nZXRIZWlnaHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmlldyB2aWV3OworICAgICAgICBwdWJsaWMgVGV4dFZpZXcgdGl0bGU7CisgICAgICAgIHB1YmxpYyBUZXh0VmlldyBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbiB7CisgICAgICAgIGludCBpZDsKKyAgICAgICAgQml0bWFwIHRodW1ibmFpbDsgLy8gZ2VuZXJhdGVkIGJ5IEFjdGl2aXR5Lm9uQ3JlYXRlVGh1bWJuYWlsKCkKKyAgICAgICAgRHJhd2FibGUgaWNvbjsgLy8gYXBwbGljYXRpb24gcGFja2FnZSBpY29uCisgICAgICAgIFN0cmluZyBsYWJlbDsgLy8gYXBwbGljYXRpb24gcGFja2FnZSBsYWJlbAorICAgICAgICBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb247IC8vIGdlbmVyYXRlZCBieSBBY3Rpdml0eS5vbkNyZWF0ZURlc2NyaXB0aW9uKCkKKyAgICAgICAgSW50ZW50IGludGVudDsgLy8gbGF1bmNoIGludGVudCBmb3IgYXBwbGljYXRpb24KKyAgICAgICAgTWF0cml4IG1hdHJpeDsgLy8gYXJiaXRyYXJ5IHJvdGF0aW9uIG1hdHJpeCB0byBjb3JyZWN0IG9yaWVudGF0aW9uCisgICAgICAgIGludCBwb3NpdGlvbjsgLy8gcG9zaXRpb24gaW4gbGlzdAorCisgICAgICAgIHB1YmxpYyBBY3Rpdml0eURlc2NyaXB0aW9uKEJpdG1hcCBfdGh1bWJuYWlsLAorICAgICAgICAgICAgICAgIERyYXdhYmxlIF9pY29uLCBTdHJpbmcgX2xhYmVsLCBTdHJpbmcgX2Rlc2MsIGludCBfaWQsIGludCBfcG9zKQorICAgICAgICB7CisgICAgICAgICAgICB0aHVtYm5haWwgPSBfdGh1bWJuYWlsOworICAgICAgICAgICAgaWNvbiA9IF9pY29uOworICAgICAgICAgICAgbGFiZWwgPSBfbGFiZWw7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IF9kZXNjOworICAgICAgICAgICAgaWQgPSBfaWQ7CisgICAgICAgICAgICBwb3NpdGlvbiA9IF9wb3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIGljb24gPSBudWxsOworICAgICAgICAgICAgdGh1bWJuYWlsID0gbnVsbDsKKyAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIGludGVudCA9IG51bGw7CisgICAgICAgICAgICBtYXRyaXggPSBudWxsOworICAgICAgICAgICAgaWQgPSAtMTsKKyAgICAgICAgICAgIHBvc2l0aW9uID0gLTE7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBBY3Rpdml0eURlc2NyaXB0aW9uIGZpbmRBY3Rpdml0eURlc2NyaXB0aW9uKGludCBpZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpdGVtID0gbUFjdGl2aXR5RGVzY3JpcHRpb25zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5pZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTG9jYWxDYXJvdXNlbFZpZXdIZWxwZXIgZXh0ZW5kcyBDYXJvdXNlbFZpZXdIZWxwZXIgeworICAgICAgICBwcml2YXRlIERldGFpbFRleHR1cmVQYXJhbWV0ZXJzIG1EZXRhaWxQYXJhbXMgPSBuZXcgRGV0YWlsVGV4dHVyZVBhcmFtZXRlcnMoMTAuMGYsIDIwLjBmKTsKKworICAgICAgICBwdWJsaWMgTG9jYWxDYXJvdXNlbFZpZXdIZWxwZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGV0YWlsVGV4dHVyZVBhcmFtZXRlcnMgZ2V0RGV0YWlsVGV4dHVyZVBhcmFtZXRlcnMoaW50IGlkKSB7CisgICAgICAgICAgICByZXR1cm4gbURldGFpbFBhcmFtczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FyZFNlbGVjdGVkKGludCBuKSB7CisgICAgICAgICAgICBpZiAobiA8IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGl0ZW0gPSBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuZ2V0KG4pOworICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgYSBsYXVuY2ggaW50ZW50IGFuZCBzZW5kIGl0CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5pbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTEFVTkNIRURfRlJPTV9ISVNUT1JZKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlN0YXJ0aW5nIGludGVudCAiICsgaXRlbS5pbnRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpdGVtLmludGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZVBlbmRpbmdUcmFuc2l0aW9uKFIuYW5pbS5yZWNlbnRfYXBwX2VudGVyLCBSLmFuaW0ucmVjZW50X2FwcF9sZWF2ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLncoIlJlY2VudCIsICJVbmFibGUgdG8gbGF1bmNoIHJlY2VudCB0YXNrIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCaXRtYXAgZ2V0VGV4dHVyZShmaW5hbCBpbnQgaWQpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIm9uUmVxdWVzdFRleHR1cmUoIiArIGlkICsgIikiKTsKKyAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaW5mbzsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChtQWN0aXZpdHlEZXNjcmlwdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBpbmZvID0gbUFjdGl2aXR5RGVzY3JpcHRpb25zLmdldChpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBiaXRtYXAgPSBjb21wb3NpdGVCaXRtYXAoaW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYml0bWFwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCaXRtYXAgZ2V0RGV0YWlsVGV4dHVyZShpbnQgbikgeworICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IG51bGw7CisgICAgICAgICAgICBpZiAobiA8IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGl0ZW0gPSBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuZ2V0KG4pOworICAgICAgICAgICAgICAgIG1EZXRhaWxJbmZvLnRpdGxlLnNldFRleHQoaXRlbS5sYWJlbCk7CisgICAgICAgICAgICAgICAgbURldGFpbEluZm8uZGVzY3JpcHRpb24uc2V0VGV4dChpdGVtLmRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICBiaXRtYXAgPSBtRGV0YWlsSW5mby5kcmF3KG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEJpdG1hcCBjb21wb3NpdGVCaXRtYXAoQWN0aXZpdHlEZXNjcmlwdGlvbiBpbmZvKSB7CisgICAgICAgIGZpbmFsIGludCB0YXJnZXRXaWR0aCA9IFRFWFRVUkVfV0lEVEg7CisgICAgICAgIGZpbmFsIGludCB0YXJnZXRIZWlnaHQgPSBURVhUVVJFX0hFSUdIVDsKKyAgICAgICAgZmluYWwgaW50IGJvcmRlciA9IDM7IC8vIGluc2V0IGFsb25nIHRoZSBlZGdlIGZvciB0aHVtbm5haWwgY29udGVudAorICAgICAgICBmaW5hbCBpbnQgb3ZlcmxhcCA9IDE7IC8vIGhvdyBtYW55IHBpeGVscyBvZiBvdmVybGFwIGJldHdlZW4gYm9yZGVyIGFuZCB0aHVtYm5haWwKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBpZiAobVJlY2VudE92ZXJsYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJlY2VudE92ZXJsYXkgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgUi5kcmF3YWJsZS5yZWNlbnRfb3ZlcmxheSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBiaXRtYXAgb2YgdGhlIHByb3BlciBzaXplL2Zvcm1hdCBhbmQgc2V0IHRoZSBjYW52YXMgdG8gZHJhdyB0byBpdAorICAgICAgICBmaW5hbCBCaXRtYXAgcmVzdWx0ID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh0YXJnZXRXaWR0aCwgdGFyZ2V0SGVpZ2h0LCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIGZpbmFsIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHJlc3VsdCk7CisgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihQYWludC5ESVRIRVJfRkxBRywgUGFpbnQuRklMVEVSX0JJVE1BUF9GTEFHKSk7CisgICAgICAgIFBhaW50IHBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIHBhaW50LnNldEZpbHRlckJpdG1hcChmYWxzZSk7CisKKyAgICAgICAgcGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuU1JDKSk7CisgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgIGlmIChpbmZvLnRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBEcmF3IHRoZSB0aHVtYm5haWwKKyAgICAgICAgICAgIGludCBzb3VyY2VXaWR0aCA9IHRhcmdldFdpZHRoIC0gMiAqIChib3JkZXIgLSBvdmVybGFwKTsKKyAgICAgICAgICAgIGludCBzb3VyY2VIZWlnaHQgPSB0YXJnZXRIZWlnaHQgLSAyICogKGJvcmRlciAtIG92ZXJsYXApOworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGVYID0gKGZsb2F0KSBzb3VyY2VXaWR0aCAvIGluZm8udGh1bWJuYWlsLmdldFdpZHRoKCk7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZVkgPSAoZmxvYXQpIHNvdXJjZUhlaWdodCAvIGluZm8udGh1bWJuYWlsLmdldEhlaWdodCgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShib3JkZXIgKiAwLjVmLCBib3JkZXIgKiAwLjVmKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZShzY2FsZVgsIHNjYWxlWSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChpbmZvLnRodW1ibmFpbCwgMCwgMCwgcGFpbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRHJhdyB0aGUgTG9hZGluZyBiaXRtYXAgcGxhY2Vob2xkZXIsIFRPRE86IFJlbW92ZSB3aGVuIFJTIGhhbmRsZXMgYmxlbmRpbmcKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlWCA9IChmbG9hdCkgdGFyZ2V0V2lkdGggLyBtTG9hZGluZ0JpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGVZID0gKGZsb2F0KSB0YXJnZXRIZWlnaHQgLyBtTG9hZGluZ0JpdG1hcC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZShzY2FsZVgsIHNjYWxlWSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtTG9hZGluZ0JpdG1hcCwgMCwgMCwgcGFpbnQpOworICAgICAgICB9CisgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgLy8gRHJhdyBvdmVybGF5CisgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlT3ZlcmxheVggPSAoZmxvYXQpIHRhcmdldFdpZHRoIC8gbVJlY2VudE92ZXJsYXkuZ2V0V2lkdGgoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGVPdmVybGF5WSA9IChmbG9hdCkgdGFyZ2V0SGVpZ2h0IC8gbVJlY2VudE92ZXJsYXkuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGNhbnZhcy5zY2FsZShzY2FsZU92ZXJsYXlYLCBzY2FsZU92ZXJsYXlZKTsKKyAgICAgICAgcGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuQUREKSk7CisgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1SZWNlbnRPdmVybGF5LCAwLCAwLCBwYWludCk7CisgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgLy8gRHJhdyBpY29uCisgICAgICAgIGlmIChpbmZvLmljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGluZm8uaWNvbi5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIElUaHVtYm5haWxSZWNlaXZlciBtVGh1bWJuYWlsUmVjZWl2ZXIgPSBuZXcgSVRodW1ibmFpbFJlY2VpdmVyLlN0dWIoKSB7CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluaXNoZWQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbmV3VGh1bWJuYWlsKGZpbmFsIGludCBpZCwgZmluYWwgQml0bWFwIGJpdG1hcCwgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgaW50IHcgPSBiaXRtYXAuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGludCBoID0gYml0bWFwLmdldEhlaWdodCgpOworICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiTmV3IHRodW1ibmFpbCBmb3IgaWQ9IiArIGlkICsgIiwgZGltZW5zaW9ucz0iICsgdyArICJ4IiArIGgKKyAgICAgICAgICAgICAgICAgICAgKyAiIGRlc2NyaXB0aW9uICciICsgZGVzY3JpcHRpb24gKyAiJyIpOworICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpbmZvID0gZmluZEFjdGl2aXR5RGVzY3JpcHRpb24oaWQpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluZm8udGh1bWJuYWlsID0gYml0bWFwOworICAgICAgICAgICAgICAgIGluZm8uZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGh1bWJXaWR0aCA9IGJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0aHVtYkhlaWdodCA9IGJpdG1hcC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoKG1Qb3J0cmFpdE1vZGUgJiYgdGh1bWJXaWR0aCA+IHRodW1iSGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFtUG9ydHJhaXRNb2RlICYmIHRodW1iV2lkdGggPCB0aHVtYkhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4LnNldFJvdGF0ZSg5MC4wZiwgKGZsb2F0KSB0aHVtYldpZHRoIC8gMiwgKGZsb2F0KSB0aHVtYkhlaWdodCAvIDIpOworICAgICAgICAgICAgICAgICAgICBpbmZvLm1hdHJpeCA9IG1hdHJpeDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbmZvLm1hdHJpeCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEZvcmNlIENhcm91c2VsIHRvIHJlcXVlc3QgbmV3IHRleHR1cmVzIGZvciB0aGlzIGl0ZW0uCisgICAgICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRUZXh0dXJlRm9ySXRlbShpbmZvLnBvc2l0aW9uLCBudWxsKTsKKyAgICAgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldERldGFpbFRleHR1cmVGb3JJdGVtKGluZm8ucG9zaXRpb24sIDAsIDAsIDAsIDAsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJDYW4ndCBmaW5kIHZpZXcgZm9yIGlkICIgKyBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogV2UgbmV2ZXIgcmVhbGx5IGZpbmlzaCgpIFJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5LCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvCisgICAgICogZ2V0IGRlc3Ryb3llZCBhbmQgcGF5IHRoZSBzdGFydC11cCBjb3N0IHRvIHJlc3RhcnQgaXQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBtb3ZlVGFza1RvQmFjayh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk5ld0ludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1IaWRkZW4gPSAhbUhpZGRlbjsKKyAgICAgICAgaWYgKG1IaWRkZW4pIHsKKyAgICAgICAgICAgIG1IaWRpbmcgPSB0cnVlOworICAgICAgICAgICAgbW92ZVRhc2tUb0JhY2sodHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSGlkaW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIub25OZXdJbnRlbnQoaW50ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBWaWV3IGRlY29yVmlldyA9IGdldFdpbmRvdygpLmdldERlY29yVmlldygpOworCisgICAgICAgIGdldFdpbmRvdygpLmdldERlY29yVmlldygpLnNldEJhY2tncm91bmRDb2xvcigweDgwMDAwMDAwKTsKKworICAgICAgICBpZiAobUNhcm91c2VsVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICBsb25nIHQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJlY2VudF9hcHBzX2FjdGl2aXR5KTsKKyAgICAgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDsKKyAgICAgICAgICAgIExvZy52KFRBRywgIlJlY2VudHMgbGF5b3V0IHRvb2sgIiArIGVsYXBzZWQgKyAibXMgdG8gbG9hZCIpOworICAgICAgICAgICAgbUxvYWRpbmdCaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgUi5kcmF3YWJsZS5yZWNlbnRfcmV6X2JvcmRlcik7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3ID0gKENhcm91c2VsVmlldylmaW5kVmlld0J5SWQoUi5pZC5jYXJvdXNlbCk7CisgICAgICAgICAgICBtSGVscGVyID0gbmV3IExvY2FsQ2Fyb3VzZWxWaWV3SGVscGVyKHRoaXMpOworICAgICAgICAgICAgbUhlbHBlci5zZXRDYXJvdXNlbFZpZXcobUNhcm91c2VsVmlldyk7CisKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0U2xvdENvdW50KENBUkRfU0xPVFMpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRWaXNpYmxlU2xvdHMoVklTSUJMRV9TTE9UUyk7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LmNyZWF0ZUNhcmRzKDApOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRTdGFydEFuZ2xlKChmbG9hdCkgLSgyLjBmKk1hdGguUEkgKiA1IC8gQ0FSRF9TTE9UUykpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXREZWZhdWx0Qml0bWFwKG1Mb2FkaW5nQml0bWFwKTsKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0TG9hZGluZ0JpdG1hcChtTG9hZGluZ0JpdG1hcCk7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFJlekluQ2FyZENvdW50KDMuMGYpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5nZXRIb2xkZXIoKS5zZXRGb3JtYXQoUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOworCisgICAgICAgICAgICBtTm9SZWNlbnRzVmlldyA9IChWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5ub19hcHBsaWNhdGlvbnNfbWVzc2FnZSk7CisKKyAgICAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIgPSAoQWN0aXZpdHlNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgICAgICBtUG9ydHJhaXRNb2RlID0gZGVjb3JWaWV3LmdldEhlaWdodCgpID4gZGVjb3JWaWV3LmdldFdpZHRoKCk7CisKKyAgICAgICAgICAgIC8vIExvYWQgZGV0YWlsIHZpZXcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0ZXh0CisgICAgICAgICAgICBWaWV3IGRldGFpbCA9IGdldExheW91dEluZmxhdGVyKCkuaW5mbGF0ZShSLmxheW91dC5yZWNlbnRzX2RldGFpbF92aWV3LCBudWxsKTsKKyAgICAgICAgICAgIFRleHRWaWV3IHRpdGxlID0gKFRleHRWaWV3KSBkZXRhaWwuZmluZFZpZXdCeUlkKFIuaWQuYXBwX3RpdGxlKTsKKyAgICAgICAgICAgIFRleHRWaWV3IGRlc2NyaXB0aW9uID0gKFRleHRWaWV3KSBkZXRhaWwuZmluZFZpZXdCeUlkKFIuaWQuYXBwX2Rlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIG1EZXRhaWxJbmZvID0gbmV3IERldGFpbEluZm8oZGV0YWlsLCB0aXRsZSwgZGVzY3JpcHRpb24pOworCisgICAgICAgICAgICByZWZyZXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgcmVmcmVzaCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworICAgICAgICBtUG9ydHJhaXRNb2RlID0gbmV3Q29uZmlnLm9yaWVudGF0aW9uID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fUE9SVFJBSVQ7CisgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkNPTkZJRyBDSEFOR0UsIG1Qb3J0cmFpdE1vZGUgPSAiICsgbVBvcnRyYWl0TW9kZSk7CisgICAgICAgIHJlZnJlc2goKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZVJ1bm5pbmdUYXNrcygpIHsKKyAgICAgICAgbVJ1bm5pbmdUYXNrTGlzdCA9IG1BY3Rpdml0eU1hbmFnZXIuZ2V0UnVubmluZ1Rhc2tzKE1BWF9UQVNLUywgMCwgbVRodW1ibmFpbFJlY2VpdmVyKTsKKyAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiUG9ydHJhaXQ6ICIgKyBtUG9ydHJhaXRNb2RlKTsKKyAgICAgICAgZm9yIChSdW5uaW5nVGFza0luZm8gciA6IG1SdW5uaW5nVGFza0xpc3QpIHsKKyAgICAgICAgICAgIGlmIChyLnRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IHRodW1iV2lkdGggPSByLnRodW1ibmFpbC5nZXRXaWR0aCgpOworICAgICAgICAgICAgICAgIGludCB0aHVtYkhlaWdodCA9IHIudGh1bWJuYWlsLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkdvdCB0aHVtYm5haWwgIiArIHRodW1iV2lkdGggKyAieCIgKyB0aHVtYkhlaWdodCk7CisgICAgICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBkZXNjID0gZmluZEFjdGl2aXR5RGVzY3JpcHRpb24oci5pZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZXNjLnRodW1ibmFpbCA9IHIudGh1bWJuYWlsOworICAgICAgICAgICAgICAgICAgICBkZXNjLmRlc2NyaXB0aW9uID0gci5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtUG9ydHJhaXRNb2RlICYmIHRodW1iV2lkdGggPiB0aHVtYkhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW1Qb3J0cmFpdE1vZGUgJiYgdGh1bWJXaWR0aCA8IHRodW1iSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC5zZXRSb3RhdGUoOTAuMGYsIChmbG9hdCkgdGh1bWJXaWR0aCAvIDIsIChmbG9hdCkgdGh1bWJIZWlnaHQgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MubWF0cml4ID0gbWF0cml4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiQ291bGRuJ3QgZmluZCBBY3Rpdml0eURlc2MgZm9yIGlkPSIgKyByLmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIioqKiBSVU5OSU5HIFRIVU1CTkFJTCBXQVMgTlVMTCAqKioiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSZWNlbnRUYXNrcygpIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXIgYW0gPSAoQWN0aXZpdHlNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eU1hbmFnZXIuUmVjZW50VGFza0luZm8+IHJlY2VudFRhc2tzID0KKyAgICAgICAgICAgICAgICBhbS5nZXRSZWNlbnRUYXNrcyhNQVhfVEFTS1MsIEFjdGl2aXR5TWFuYWdlci5SRUNFTlRfSUdOT1JFX1VOQVZBSUxBQkxFKTsKKworICAgICAgICBBY3Rpdml0eUluZm8gaG9tZUluZm8gPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTikuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0hPTUUpCisgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlQWN0aXZpdHlJbmZvKHBtLCAwKTsKKworICAgICAgICAvLyBJY29uVXRpbGl0aWVzIGljb25VdGlsaXRpZXMgPSBuZXcgSWNvblV0aWxpdGllcyh0aGlzKTsgLy8gRklYTUUKKworICAgICAgICBpbnQgbnVtVGFza3MgPSByZWNlbnRUYXNrcy5zaXplKCk7CisgICAgICAgIG1BY3Rpdml0eURlc2NyaXB0aW9ucy5jbGVhcigpOworICAgICAgICBmb3IgKGludCBpID0gMCwgaW5kZXggPSAwOyBpIDwgbnVtVGFza3MgJiYgKGluZGV4IDwgTUFYX1RBU0tTKTsgKytpKSB7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXIuUmVjZW50VGFza0luZm8gcmVjZW50SW5mbyA9IHJlY2VudFRhc2tzLmdldChpKTsKKworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQocmVjZW50SW5mby5iYXNlSW50ZW50KTsKKyAgICAgICAgICAgIGlmIChyZWNlbnRJbmZvLm9yaWdBY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChyZWNlbnRJbmZvLm9yaWdBY3Rpdml0eSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIGN1cnJlbnQgaG9tZSBhY3Rpdml0eS4KKyAgICAgICAgICAgIGlmIChob21lSW5mbyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIGhvbWVJbmZvLnBhY2thZ2VOYW1lLmVxdWFscyhpbnRlbnQuZ2V0Q29tcG9uZW50KCkuZ2V0UGFja2FnZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgaG9tZUluZm8ubmFtZS5lcXVhbHMoaW50ZW50LmdldENvbXBvbmVudCgpLmdldENsYXNzTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoKGludGVudC5nZXRGbGFncygpJn5JbnRlbnQuRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRCkKKyAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICBmaW5hbCBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IHBtLnJlc29sdmVBY3Rpdml0eShpbnRlbnQsIDApOworICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUluZm8gaW5mbyA9IHJlc29sdmVJbmZvLmFjdGl2aXR5SW5mbzsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGl0bGUgPSBpbmZvLmxvYWRMYWJlbChwbSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBEcmF3YWJsZSBpY29uID0gaW5mby5sb2FkSWNvbihwbSk7CisKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSByZWNlbnRUYXNrcy5nZXQoaSkuaWQ7CisgICAgICAgICAgICAgICAgaWYgKGlkICE9IC0xICYmIHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoKCkgPiAwICYmIGljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpY29uID0gbnVsbDsgRklYTUU6IGljb25VdGlsaXRpZXMuY3JlYXRlSWNvbkRyYXdhYmxlKGljb24pOworICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGl0ZW0gPSBuZXcgQWN0aXZpdHlEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBpY29uLCB0aXRsZSwgbnVsbCwgaWQsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5pbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eURlc2NyaXB0aW9ucy5hZGQoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkFkZGVkIGl0ZW1bIiArIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSwgaWQ9IiArIGl0ZW0uaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHRpdGxlPSIgKyBpdGVtLmxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJTS0lQUElORyBpdGVtICIgKyBpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtUmVmcmVzaFJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB1cGRhdGVSZWNlbnRUYXNrcygpOworICAgICAgICAgICAgdXBkYXRlUnVubmluZ1Rhc2tzKCk7CisgICAgICAgICAgICBzaG93Q2Fyb3VzZWwobUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSA+IDApOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBzaG93Q2Fyb3VzZWwoYm9vbGVhbiBzaG93KSB7CisgICAgICAgIGlmIChzaG93KSB7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LmNyZWF0ZUNhcmRzKG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBGb3JjZSBDYXJvdXNlbCB0byB1cGRhdGUgdGV4dHVyZXMuIE5vdGUgd2UgZG9uJ3QgZG8gdGhpcyBmb3IgdGhlIGZpcnN0IGl0ZW0sCisgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgd2lsbCBiZSB1cGRhdGVkIHdoZW4gbVRodW1ibmFpbFJlY2VpdmVyIHJldHVybnMgYSB0aHVtYm5haWwuCisgICAgICAgICAgICAgICAgLy8gVE9ETzogb25seSBkbyB0aGlzIGZvciBhcHBzIHRoYXQgaGF2ZSBjaGFuZ2VkLgorICAgICAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VGV4dHVyZUZvckl0ZW0oaSwgbnVsbCk7CisgICAgICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXREZXRhaWxUZXh0dXJlRm9ySXRlbShpLCAwLCAwLCAwLCAwLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE1ha2UgY2Fyb3VzZWwgdmlzaWJsZQorICAgICAgICAgICAgbU5vUmVjZW50c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LmNyZWF0ZUNhcmRzKG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2hvdyAiTm8gUmVjZW50IFRhc2tzIgorICAgICAgICAgICAgbU5vUmVjZW50c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKKyAgICAgICAgaWYgKCFtSGlkaW5nICYmIG1DYXJvdXNlbFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRG9uJ3QgdXBkYXRlIHRoZSB2aWV3IG5vdy4gSW5zdGVhZCwgcG9zdCBhIHJlcXVlc3Qgc28gaXQgaGFwcGVucyBuZXh0IHRpbWUKKyAgICAgICAgICAgIC8vIHdlIHJlYWNoIHRoZSBsb29wZXIgYWZ0ZXIgYSBkZWxheS4gVGhpcyB3YXkgd2UgY2FuIGZvbGQgbXVsdGlwbGUgcmVmcmVzaGVzCisgICAgICAgICAgICAvLyBpbnRvIGp1c3QgdGhlIGxhdGVzdC4KKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcucmVtb3ZlQ2FsbGJhY2tzKG1SZWZyZXNoUnVubmFibGUpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5wb3N0RGVsYXllZChtUmVmcmVzaFJ1bm5hYmxlLCA1MCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhlYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuZXguY2Fyb3VzZWwuQ2Fyb3VzZWxWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK3B1YmxpYyBjbGFzcyBSZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcgZXh0ZW5kcyBDYXJvdXNlbFZpZXcgeworCisgICAgcHVibGljIFJlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5mbyBnZXRSZW5kZXJTY3JpcHRJbmZvKCkgeworICAgICAgICByZXR1cm4gbmV3IEluZm8oUi5yYXcuY2Fyb3VzZWwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEKaW5kZXggZjQ1Y2FmNTEuLjBmNjcyM2UgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogCiAKIHB1YmxpYyBjbGFzcyBDbG9zZURyYWdIYW5kbGUgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgewotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogCiAgICAgcHVibGljIENsb3NlRHJhZ0hhbmRsZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YQppbmRleCA0ZjA4MGQ1Li44MTA5MWUzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAqIGNvYWxlc2NpbmcgdGhlc2UgY2FsbHMgc28gdGhleSBkb24ndCBzdGFjayB1cC4gIEZvciB0aGUgY2FsbHMKICAqIGFyZSBjb2FsZXNjZWQsIG5vdGUgdGhhdCB0aGV5IGFyZSBhbGwgaWRlbXBvdGVudC4KICAqLwotY2xhc3MgQ29tbWFuZFF1ZXVlIGV4dGVuZHMgSVN0YXR1c0Jhci5TdHViIHsKK3B1YmxpYyBjbGFzcyBDb21tYW5kUXVldWUgZXh0ZW5kcyBJU3RhdHVzQmFyLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHVzQmFyLkNvbW1hbmRRdWV1ZSI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01BU0sgPSAweGZmZmYwMDAwOwpAQCAtNTIsNiArNTIsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUF9FWFBBTkQgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUF9DT0xMQVBTRSA9IDI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9MSUdIVFNfT04gPSAweDAwMDcwMDAwOworCiAgICAgcHJpdmF0ZSBTdGF0dXNCYXJJY29uTGlzdCBtTGlzdDsKICAgICBwcml2YXRlIENhbGxiYWNrcyBtQ2FsbGJhY2tzOwogICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIKCk7CkBAIC03NSw2ICs3Nyw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoaW50IHN0YXRlKTsKICAgICAgICAgcHVibGljIHZvaWQgYW5pbWF0ZUV4cGFuZCgpOwogICAgICAgICBwdWJsaWMgdm9pZCBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbik7CiAgICAgfQogCiAgICAgcHVibGljIENvbW1hbmRRdWV1ZShDYWxsYmFja3MgY2FsbGJhY2tzLCBTdGF0dXNCYXJJY29uTGlzdCBsaXN0KSB7CkBAIC0xNDMsNiArMTQ2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIG9uKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3QpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19TRVRfTElHSFRTX09OKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9MSUdIVFNfT04sIG9uID8gMSA6IDAsIDAsIG51bGwpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQgJiBNU0dfTUFTSzsKQEAgLTE5Niw2ICsyMDYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja3MuYW5pbWF0ZUNvbGxhcHNlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX0xJR0hUU19PTjoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5zZXRMaWdodHNPbihtc2cuYXJnMSAhPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9FeHBhbmRlZFZpZXcuamF2YQppbmRleCAzZDg1ZjI3Li5hMmQ0Yjk1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvRXhwYW5kZWRWaWV3LmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKIAogCiBwdWJsaWMgY2xhc3MgRXhwYW5kZWRWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKLSAgICBTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIFBob25lU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKICAgICBpbnQgbVByZXZIZWlnaHQgPSAtMTsKIAogICAgIHB1YmxpYyBFeHBhbmRlZFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgICAgICAvL1Nsb2cuZChTdGF0dXNCYXJTZXJ2aWNlLlRBRywgImhlaWdodCBjaGFuZ2VkIG9sZD0iICsgbVByZXZIZWlnaHQKICAgICAgICAgICAgICAvLyAgICAgKyAiIG5ldz0iICsgaGVpZ2h0KTsKICAgICAgICAgICAgICBtUHJldkhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoU3RhdHVzQmFyU2VydmljZS5FWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFBob25lU3RhdHVzQmFyU2VydmljZS5FWFBBTkRFRF9MRUFWRV9BTE9ORSk7CiAgICAgICAgICB9CiAgICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlCdXR0b25WaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxYzVlNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIEtleUJ1dHRvblZpZXcgZXh0ZW5kcyBJbWFnZVZpZXcgeworICAgIElXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOworICAgIGxvbmcgbURvd25UaW1lOworICAgIGJvb2xlYW4gbVNlbmRpbmcsIG1Mb25nUHJlc3NlZDsKKyAgICBpbnQgbUNvZGU7CisgICAgaW50IG1SZXBlYXQ7CisgICAgUnVubmFibGUgbUNoZWNrTG9uZ1ByZXNzID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBTbG9nLmQoIktleUJ1dHRvblZpZXciLCAibG9uZ3ByZXNzIik7CisgICAgICAgICAgICBpZiAoaXNQcmVzc2VkKCkpIHsKKyAgICAgICAgICAgICAgICBtTG9uZ1ByZXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1SZXBlYXQrKzsKKyAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNCisgICAgICAgICAgICAgICAgICAgICAgICB8IEtleUV2ZW50LkZMQUdfVklSVFVBTF9IQVJEX0tFWQorICAgICAgICAgICAgICAgICAgICAgICAgfCBLZXlFdmVudC5GTEFHX0xPTkdfUFJFU1MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBLZXlCdXR0b25WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBLZXlCdXR0b25WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgUi5zdHlsZWFibGUuS2V5QnV0dG9uVmlldywKKyAgICAgICAgICAgICAgICBkZWZTdHlsZSwgMCk7CisKKyAgICAgICAgbUNvZGUgPSBhLmdldEludGVnZXIoUi5zdHlsZWFibGUuS2V5QnV0dG9uVmlld19rZXlDb2RlLCAwKTsKKyAgICAgICAgaWYgKG1Db2RlID09IDApIHsKKyAgICAgICAgICAgIFNsb2cudyhTdGF0dXNCYXJTZXJ2aWNlLlRBRywgIktleUJ1dHRvblZpZXcgd2l0aG91dCBrZXkgY29kZSBpZD0weCIKKyAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGdldElkKCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgbVdpbmRvd01hbmFnZXIgPSBJV2luZG93TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGludCB4LCB5OworCisgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgorICAgICAgICAgICAgICAgIC8vU2xvZy5kKCJLZXlCdXR0b25WaWV3IiwgInByZXNzIik7CisgICAgICAgICAgICAgICAgbURvd25UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbVJlcGVhdCA9IDA7CisgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Mb25nUHJlc3NlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNlbmRFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0gfCBLZXlFdmVudC5GTEFHX1ZJUlRVQUxfSEFSRF9LRVksIG1Eb3duVGltZSk7CisgICAgICAgICAgICAgICAgc2V0UHJlc3NlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobUNoZWNrTG9uZ1ByZXNzKTsKKyAgICAgICAgICAgICAgICBwb3N0RGVsYXllZChtQ2hlY2tMb25nUHJlc3MsIFZpZXdDb25maWd1cmF0aW9uLmdldExvbmdQcmVzc1RpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgICAgIGlmIChtU2VuZGluZykgeworICAgICAgICAgICAgICAgICAgICB4ID0gKGludClldi5nZXRYKCk7CisgICAgICAgICAgICAgICAgICAgIHkgPSAoaW50KWV2LmdldFkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHggPj0gZ2V0V2lkdGgoKSB8fCB5IDwgMCB8fCB5ID49IGdldEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50KEtleUV2ZW50LkFDVElPTl9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSB8IEtleUV2ZW50LkZMQUdfVklSVFVBTF9IQVJEX0tFWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS2V5RXZlbnQuRkxBR19DQU5DRUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtQ2hlY2tMb25nUHJlc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6CisgICAgICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKG1TZW5kaW5nICYmICFtTG9uZ1ByZXNzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50KEtleUV2ZW50LkFDVElPTl9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNIHwgS2V5RXZlbnQuRkxBR19WSVJUVUFMX0hBUkRfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1DaGVja0xvbmdQcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBzZW5kRXZlbnQoaW50IGFjdGlvbiwgaW50IGZsYWdzKSB7CisgICAgICAgIHNlbmRFdmVudChhY3Rpb24sIGZsYWdzLCBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgfQorCisgICAgdm9pZCBzZW5kRXZlbnQoaW50IGFjdGlvbiwgaW50IGZsYWdzLCBsb25nIHdoZW4pIHsKKyAgICAgICAgZmluYWwgS2V5RXZlbnQgZXYgPSBuZXcgS2V5RXZlbnQobURvd25UaW1lLCB3aGVuLCBhY3Rpb24sIG1Db2RlLCBtUmVwZWF0LAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIGZsYWdzLCBJbnB1dERldmljZS5TT1VSQ0VfS0VZQk9BUkQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9TbG9nLmQoU3RhdHVzQmFyU2VydmljZS5UQUcsICJpbmplY3RpbmcgZXZlbnQgIiArIGV2KTsKKyAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmluamVjdElucHV0RXZlbnROb1dhaXQoZXYpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbSBwcm9jZXNzIGlzIGRlYWQKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkRhdGEuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhCmluZGV4IDdhODIyNjcuLjdlOGE1YzEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOwogCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC0zNSwyNiArMzYsNDcgQEAKICAgICAgICAgcHVibGljIFZpZXcgcm93OyAvLyB0aGUgb3V0ZXIgZXhwYW5kZWQgdmlldwogICAgICAgICBwdWJsaWMgVmlldyBjb250ZW50OyAvLyB0YWtlcyB0aGUgY2xpY2sgZXZlbnRzIGFuZCBzZW5kcyB0aGUgUGVuZGluZ0ludGVudAogICAgICAgICBwdWJsaWMgVmlldyBleHBhbmRlZDsgLy8gdGhlIGluZmxhdGVkIFJlbW90ZVZpZXdzCisgICAgICAgIHB1YmxpYyBFbnRyeSgpIHt9CisgICAgICAgIHB1YmxpYyBFbnRyeShJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0YXR1c0Jhckljb25WaWV3IGljKSB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uID0gbjsKKyAgICAgICAgICAgIHRoaXMuaWNvbiA9IGljOworICAgICAgICB9CiAgICAgfQogICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEVudHJ5PiBtRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPEVudHJ5PiBtRW50cnlDbXAgPSBuZXcgQ29tcGFyYXRvcjxFbnRyeT4oKSB7CisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShFbnRyeSBhLCBFbnRyeSBiKSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkoYS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gLSBiLm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbik7CisgICAgICAgIH0KKyAgICB9OwogCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICByZXR1cm4gbUVudHJpZXMuc2l6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBFbnRyeSBnZXRFbnRyeUF0KGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gbUVudHJpZXMuZ2V0KGluZGV4KTsKKyAgICBwdWJsaWMgRW50cnkgZ2V0KGludCBpKSB7CisgICAgICAgIHJldHVybiBtRW50cmllcy5nZXQoaSk7CiAgICAgfQogCi0gICAgcHVibGljIGludCBmaW5kRW50cnkoSUJpbmRlciBrZXkpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICBwdWJsaWMgRW50cnkgZmluZEJ5S2V5KElCaW5kZXIga2V5KSB7CisgICAgICAgIGZvciAoRW50cnkgZSA6IG1FbnRyaWVzKSB7CisgICAgICAgICAgICBpZiAoZS5rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFkZChFbnRyeSBlbnRyeSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IE4gPSBtRW50cmllcy5zaXplKCk7CisgICAgICAgIGZvciAoaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgaWYgKG1FbnRyeUNtcC5jb21wYXJlKG1FbnRyaWVzLmdldChpKSwgZW50cnkpID4gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1FbnRyaWVzLmFkZChpLCBlbnRyeSk7CisgICAgICAgIHJldHVybiBpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgYWRkKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBWaWV3IHJvdywgVmlldyBjb250ZW50LApAQCAtNjYsNDIgKzg4LDIzIEBACiAgICAgICAgIGVudHJ5LmNvbnRlbnQgPSBjb250ZW50OwogICAgICAgICBlbnRyeS5leHBhbmRlZCA9IGV4cGFuZGVkOwogICAgICAgICBlbnRyeS5pY29uID0gaWNvbjsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY2hvb3NlSW5kZXgobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuKTsKLSAgICAgICAgbUVudHJpZXMuYWRkKGluZGV4LCBlbnRyeSk7Ci0gICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgcmV0dXJuIGFkZChlbnRyeSk7CiAgICAgfQogCiAgICAgcHVibGljIEVudHJ5IHJlbW92ZShJQmluZGVyIGtleSkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkua2V5ID09IGtleSkgewotICAgICAgICAgICAgICAgIG1FbnRyaWVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgICAgICAgICB9CisgICAgICAgIEVudHJ5IGUgPSBmaW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUVudHJpZXMucmVtb3ZlKGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNob29zZUluZGV4KGZpbmFsIGxvbmcgd2hlbikgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuID4gd2hlbikgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOOworICAgICAgICByZXR1cm4gZTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHZpc2libGUgaXRlbXMgKGkuZS4gaXRlbXMgd2l0aG91dCBhbiBlcnJvcikuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzVmlzaWJsZUl0ZW1zKCkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZXhwYW5kZWQgIT0gbnVsbCkgeyAvLyB0aGUgdmlldyBzdWNjZXNzZnVsbHkgaW5mbGF0ZWQKKyAgICAgICAgZm9yIChFbnRyeSBlIDogbUVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlLmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTExMiwxMSArMTE1LDkgQEAKICAgICAgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGNsZWFyYWJsZSBpdGVtcyAodGhhdCBhcmVuJ3QgZXJyb3JzKS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGVhcmFibGVJdGVtcygpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCi0gICAgICAgICAgICAgICAgaWYgKChlbnRyeS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfTk9fQ0xFQVIpID09IDApIHsKKyAgICAgICAgZm9yIChFbnRyeSBlIDogbUVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlLmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCisgICAgICAgICAgICAgICAgaWYgKGUubm90aWZpY2F0aW9uLmlzQ2xlYXJhYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlYmQyNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxNTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhclNlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb25MaXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuU3RhdHVzQmFyUG9saWN5OworCisKKworcHVibGljIGNsYXNzIFBob25lU3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFN0YXR1c0JhclNlcnZpY2UgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBob25lU3RhdHVzQmFyU2VydmljZSI7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BFVyA9IGZhbHNlOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVRVU0JBUl9TVEFSVAorICAgICAgICAgICAgPSAiY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LnN0YXR1c2Jhci5TVEFSVCI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0xFQVZFX0FMT05FID0gLTEwMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfRlVMTF9PUEVOID0gLTEwMDAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BTklNQVRFID0gMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEVfUkVWRUFMID0gMTAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NIT1dfSU5UUlVERVIgPSAxMDAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfSElERV9JTlRSVURFUiA9IDEwMDM7CisKKyAgICAvLyB3aWxsIGxpa2VseSBtb3ZlIHRvIGEgcmVzb3VyY2Ugb3Igb3RoZXIgdHVuYWJsZSBwYXJhbSBhdCBzb21lIHBvaW50CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVFJVREVSX0FMRVJUX0RFQ0FZX01TID0gMTAwMDA7CisKKyAgICBTdGF0dXNCYXJQb2xpY3kgbUljb25Qb2xpY3k7CisKKyAgICBpbnQgbUljb25TaXplOworICAgIERpc3BsYXkgbURpc3BsYXk7CisKKyAgICBTdGF0dXNCYXJWaWV3IG1TdGF0dXNCYXJWaWV3OworICAgIGludCBtUGl4ZWxGb3JtYXQ7CisgICAgSCBtSGFuZGxlciA9IG5ldyBIKCk7CisgICAgT2JqZWN0IG1RdWV1ZUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvLyBpY29ucworICAgIExpbmVhckxheW91dCBtSWNvbnM7CisgICAgSWNvbk1lcmdlciBtTm90aWZpY2F0aW9uSWNvbnM7CisgICAgTGluZWFyTGF5b3V0IG1TdGF0dXNJY29uczsKKworICAgIC8vIGV4cGFuZGVkIG5vdGlmaWNhdGlvbnMKKyAgICBEaWFsb2cgbUV4cGFuZGVkRGlhbG9nOworICAgIEV4cGFuZGVkVmlldyBtRXhwYW5kZWRWaWV3OworICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1FeHBhbmRlZFBhcmFtczsKKyAgICBTY3JvbGxWaWV3IG1TY3JvbGxWaWV3OworICAgIFZpZXcgbU5vdGlmaWNhdGlvbkxpbmVhckxheW91dDsKKyAgICBWaWV3IG1FeHBhbmRlZENvbnRlbnRzOworICAgIC8vIHRvcCBiYXIKKyAgICBUZXh0VmlldyBtTm9Ob3RpZmljYXRpb25zVGl0bGU7CisgICAgVGV4dFZpZXcgbUNsZWFyQnV0dG9uOworICAgIC8vIGRyYWcgYmFyCisgICAgQ2xvc2VEcmFnSGFuZGxlIG1DbG9zZVZpZXc7CisgICAgLy8gb25nb2luZworICAgIE5vdGlmaWNhdGlvbkRhdGEgbU9uZ29pbmcgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOworICAgIFRleHRWaWV3IG1PbmdvaW5nVGl0bGU7CisgICAgTGluZWFyTGF5b3V0IG1PbmdvaW5nSXRlbXM7CisgICAgLy8gbGF0ZXN0CisgICAgTm90aWZpY2F0aW9uRGF0YSBtTGF0ZXN0ID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKKyAgICBUZXh0VmlldyBtTGF0ZXN0VGl0bGU7CisgICAgTGluZWFyTGF5b3V0IG1MYXRlc3RJdGVtczsKKyAgICAvLyBwb3NpdGlvbgorICAgIGludFtdIG1Qb3NpdGlvblRtcCA9IG5ldyBpbnRbMl07CisgICAgYm9vbGVhbiBtRXhwYW5kZWQ7CisgICAgYm9vbGVhbiBtRXhwYW5kZWRWaXNpYmxlOworCisgICAgLy8gdGhlIGRhdGUgdmlldworICAgIERhdGVWaWV3IG1EYXRlVmlldzsKKworICAgIC8vIGZvciBpbW1lcnNpdmUgYWN0aXZpdGllcworICAgIHByaXZhdGUgVmlldyBtSW50cnVkZXJBbGVydFZpZXc7CisKKyAgICAvLyB0aGUgdHJhY2tlciB2aWV3CisgICAgVHJhY2tpbmdWaWV3IG1UcmFja2luZ1ZpZXc7CisgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbVRyYWNraW5nUGFyYW1zOworICAgIGludCBtVHJhY2tpbmdQb3NpdGlvbjsgLy8gdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIHRyYWNraW5nIHZpZXcuCisgICAgcHJpdmF0ZSBib29sZWFuIG1QYW5lbFNsaWdodGx5VmlzaWJsZTsKKworICAgIC8vIHRpY2tlcgorICAgIHByaXZhdGUgVGlja2VyIG1UaWNrZXI7CisgICAgcHJpdmF0ZSBWaWV3IG1UaWNrZXJWaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtVGlja2luZzsKKworICAgIC8vIFRyYWNraW5nIGZpbmdlciBmb3Igb3BlbmluZy9jbG9zaW5nLgorICAgIGludCBtRWRnZUJvcmRlcjsgLy8gY29ycmVzcG9uZHMgdG8gUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlCisgICAgYm9vbGVhbiBtVHJhY2tpbmc7CisgICAgVmVsb2NpdHlUcmFja2VyIG1WZWxvY2l0eVRyYWNrZXI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1fRlJBTUVfRFVSQVRJT04gPSAoMTAwMC82MCk7CisKKyAgICBib29sZWFuIG1BbmltYXRpbmc7CisgICAgbG9uZyBtQ3VyQW5pbWF0aW9uVGltZTsKKyAgICBmbG9hdCBtRGlzcGxheUhlaWdodDsKKyAgICBmbG9hdCBtQW5pbVk7CisgICAgZmxvYXQgbUFuaW1WZWw7CisgICAgZmxvYXQgbUFuaW1BY2NlbDsKKyAgICBsb25nIG1BbmltTGFzdFRpbWU7CisgICAgYm9vbGVhbiBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7CisgICAgaW50IG1WaWV3RGVsdGE7CisgICAgaW50W10gbUFic1BvcyA9IG5ldyBpbnRbMl07CisKKyAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCisgICAgaW50IG1EaXNhYmxlZCA9IDA7CisKKyAgICBwcml2YXRlIGNsYXNzIEV4cGFuZGVkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKKyAgICAgICAgRXhwYW5kZWREaWFsb2coQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0xpZ2h0X05vVGl0bGVCYXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZG93biA9IGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOOworICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRLZXlDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9CQUNLOgorICAgICAgICAgICAgICAgIGlmICghZG93bikgeworICAgICAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hLZXlFdmVudChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgbURpc3BsYXkgPSAoKFdpbmRvd01hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKSkuZ2V0RGVmYXVsdERpc3BsYXkoKTsKKworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOworCisgICAgICAgIGFkZEludHJ1ZGVyVmlldygpOworCisgICAgICAgIC8vIExhc3RseSwgY2FsbCB0byB0aGUgaWNvbiBwb2xpY3kgdG8gaW5zdGFsbC91cGRhdGUgYWxsIHRoZSBpY29ucy4KKyAgICAgICAgbUljb25Qb2xpY3kgPSBuZXcgU3RhdHVzQmFyUG9saWN5KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgLy8gd2UncmUgbmV2ZXIgZGVzdHJveWVkCisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIHZpZXcKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIHByb3RlY3RlZCBWaWV3IG1ha2VTdGF0dXNCYXJWaWV3KCkgeworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSB0aGlzOworCisgICAgICAgIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworCisgICAgICAgIG1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7CisKKyAgICAgICAgRXhwYW5kZWRWaWV3IGV4cGFuZGVkID0gKEV4cGFuZGVkVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwKKyAgICAgICAgICAgICAgICBSLmxheW91dC5zdGF0dXNfYmFyX2V4cGFuZGVkLCBudWxsKTsKKyAgICAgICAgZXhwYW5kZWQubVNlcnZpY2UgPSB0aGlzOworCisgICAgICAgIG1JbnRydWRlckFsZXJ0VmlldyA9IFZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5pbnRydWRlcl9hbGVydCwgbnVsbCk7CisgICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRDbGlja2FibGUodHJ1ZSk7CisKKyAgICAgICAgU3RhdHVzQmFyVmlldyBzYiA9IChTdGF0dXNCYXJWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKKyAgICAgICAgc2IubVNlcnZpY2UgPSB0aGlzOworCisgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggcGl4ZWwtZm9ybWF0IHRvIHVzZSBmb3IgdGhlIHN0YXR1cyBiYXIuCisgICAgICAgIG1QaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOworICAgICAgICBEcmF3YWJsZSBiZyA9IHNiLmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7CisgICAgICAgIG1TdGF0dXNJY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzSWNvbnMpOworICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMgPSAoSWNvbk1lcmdlcilzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25JY29ucyk7CisgICAgICAgIG1JY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOworICAgICAgICBtVGlja2VyVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7CisgICAgICAgIG1EYXRlVmlldyA9IChEYXRlVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKKworICAgICAgICBtRXhwYW5kZWREaWFsb2cgPSBuZXcgRXhwYW5kZWREaWFsb2coY29udGV4dCk7CisgICAgICAgIG1FeHBhbmRlZFZpZXcgPSBleHBhbmRlZDsKKyAgICAgICAgbUV4cGFuZGVkQ29udGVudHMgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOworICAgICAgICBtT25nb2luZ1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdUaXRsZSk7CisgICAgICAgIG1PbmdvaW5nSXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdJdGVtcyk7CisgICAgICAgIG1MYXRlc3RUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RUaXRsZSk7CisgICAgICAgIG1MYXRlc3RJdGVtcyA9IChMaW5lYXJMYXlvdXQpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0SXRlbXMpOworICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm9Ob3RpZmljYXRpb25zVGl0bGUpOworICAgICAgICBtQ2xlYXJCdXR0b24gPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQuY2xlYXJfYWxsX2J1dHRvbik7CisgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUNsZWFyQnV0dG9uTGlzdGVuZXIpOworICAgICAgICBtU2Nyb2xsVmlldyA9IChTY3JvbGxWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLnNjcm9sbCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOworCisgICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgIG1UaWNrZXIgPSBuZXcgTXlUaWNrZXIoY29udGV4dCwgc2IpOworCisgICAgICAgIFRpY2tlclZpZXcgdGlja2VyVmlldyA9IChUaWNrZXJWaWV3KXNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlclRleHQpOworICAgICAgICB0aWNrZXJWaWV3Lm1UaWNrZXIgPSBtVGlja2VyOworCisgICAgICAgIG1UcmFja2luZ1ZpZXcgPSAoVHJhY2tpbmdWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyX3RyYWNraW5nLCBudWxsKTsKKyAgICAgICAgbVRyYWNraW5nVmlldy5tU2VydmljZSA9IHRoaXM7CisgICAgICAgIG1DbG9zZVZpZXcgPSAoQ2xvc2VEcmFnSGFuZGxlKW1UcmFja2luZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQuY2xvc2UpOworICAgICAgICBtQ2xvc2VWaWV3Lm1TZXJ2aWNlID0gdGhpczsKKworICAgICAgICBtRWRnZUJvcmRlciA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlKTsKKworICAgICAgICAvLyBzZXQgdGhlIGluaXRhbCB2aWV3IHZpc2liaWxpdHkKKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKworICAgICAgICAvLyByZWNlaXZlIGJyb2FkY2FzdHMKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKKworICAgICAgICByZXR1cm4gc2I7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRTdGF0dXNCYXJHcmF2aXR5KCkgeworICAgICAgICByZXR1cm4gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkSW50cnVkZXJWaWV3KCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQ9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2hlaWdodCk7CisKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUworICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLnkgKz0gaGVpZ2h0ICogMS41OyAvLyBGSVhNRQorICAgICAgICBscC5zZXRUaXRsZSgiSW50cnVkZXJBbGVydCIpOworICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fU3RhdHVzQmFyX0ludHJ1ZGVyQWxlcnQ7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobUludHJ1ZGVyQWxlcnRWaWV3LCBscCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJhZGRJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKKyAgICAgICAgICAgICAgICArICIgaWNvbj0iICsgaWNvbik7CisgICAgICAgIFN0YXR1c0Jhckljb25WaWV3IHZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywgc2xvdCk7CisgICAgICAgIHZpZXcuc2V0KGljb24pOworICAgICAgICBtU3RhdHVzSWNvbnMuYWRkVmlldyh2aWV3LCB2aWV3SW5kZXgsIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LAorICAgICAgICAgICAgU3RhdHVzQmFySWNvbiBvbGQsIFN0YXR1c0Jhckljb24gaWNvbikgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInVwZGF0ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleAorICAgICAgICAgICAgICAgICsgIiBvbGQ9IiArIG9sZCArICIgaWNvbj0iICsgaWNvbik7CisgICAgICAgIFN0YXR1c0Jhckljb25WaWV3IHZpZXcgPSAoU3RhdHVzQmFySWNvblZpZXcpbVN0YXR1c0ljb25zLmdldENoaWxkQXQodmlld0luZGV4KTsKKyAgICAgICAgdmlldy5zZXQoaWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4KSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmVtb3ZlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4KTsKKyAgICAgICAgbVN0YXR1c0ljb25zLnJlbW92ZVZpZXdBdCh2aWV3SW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgaWYgKGljb25WaWV3ID09IG51bGwpIHJldHVybjsKKworICAgICAgICBib29sZWFuIGltbWVyc2l2ZSA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW1tZXJzaXZlID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5pc1RvcEFjdGl2aXR5SW1tZXJzaXZlKCk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVG9wIGFjdGl2aXR5IGlzICIgKyAoaW1tZXJzaXZlPyJpbW1lcnNpdmUiOiJub3QgaW1tZXJzaXZlIikpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW1tZXJzaXZlKSB7CisgICAgICAgICAgICBpZiAoKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19ISUdIX1BSSU9SSVRZKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIlByZXNlbnRpbmcgaGlnaC1wcmlvcml0eSBub3RpZmljYXRpb24gaW4gaW1tZXJzaXZlIGFjdGl2aXR5Iik7CisgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBuZXcgdHJhbnNpZW50IHRpY2tlciBtb2RlCisgICAgICAgICAgICAgICAgLy8gMS4gUG9wdWxhdGUgbUludHJ1ZGVyQWxlcnRWaWV3CisKKyAgICAgICAgICAgICAgICBJbWFnZVZpZXcgYWxlcnRJY29uID0gKEltYWdlVmlldykgbUludHJ1ZGVyQWxlcnRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmFsZXJ0SWNvbik7CisgICAgICAgICAgICAgICAgVGV4dFZpZXcgYWxlcnRUZXh0ID0gKFRleHRWaWV3KSBtSW50cnVkZXJBbGVydFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuYWxlcnRUZXh0KTsKKyAgICAgICAgICAgICAgICBhbGVydEljb24uc2V0SW1hZ2VEcmF3YWJsZShTdGF0dXNCYXJJY29uVmlldy5nZXRJY29uKAorICAgICAgICAgICAgICAgICAgICBhbGVydEljb24uZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICBpY29uVmlldy5nZXRTdGF0dXNCYXJJY29uKCkpKTsKKyAgICAgICAgICAgICAgICBhbGVydFRleHQuc2V0VGV4dChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQpOworCisgICAgICAgICAgICAgICAgVmlldyBidXR0b24gPSBtSW50cnVkZXJBbGVydFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuaW50cnVkZXJfYWxlcnRfY29udGVudCk7CisgICAgICAgICAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IExhdW5jaGVyKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOworCisgICAgICAgICAgICAgICAgLy8gMi4gQW5pbWF0ZSBtSW50cnVkZXJBbGVydFZpZXcgaW4KKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19TSE9XX0lOVFJVREVSKTsKKworICAgICAgICAgICAgICAgIC8vIDMuIFNldCBhbGFybSB0byBhZ2UgdGhlIG5vdGlmaWNhdGlvbiBvZmYgKFRPRE8pCisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0hJREVfSU5UUlVERVIpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1TR19ISURFX0lOVFJVREVSLCBJTlRSVURFUl9BTEVSVF9ERUNBWV9NUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbW1lcnNpdmUgJiBhIGZ1bGwtc2NyZWVuIGFsZXJ0IHNob3VsZCBiZSBzaG93bgorICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vdGlmaWNhdGlvbiBoYXMgZnVsbFNjcmVlbkludGVudCBhbmQgYWN0aXZpdHkgaXMgbm90IGltbWVyc2l2ZTsiCisgICAgICAgICAgICAgICAgICAgICsgIiBzZW5kaW5nIGZ1bGxTY3JlZW5JbnRlbnQiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50LnNlbmQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdXN1YWwgY2FzZTogc3RhdHVzIGJhciB2aXNpYmxlICYgbm90IGltbWVyc2l2ZQorCisgICAgICAgICAgICAvLyBzaG93IHRoZSB0aWNrZXIKKyAgICAgICAgICAgIHRpY2sobm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgorICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVOb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSArICIgbm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOworCisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgb2xkTGlzdDsKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBvbGRFbnRyeSA9IG1PbmdvaW5nLmZpbmRCeUtleShrZXkpOworICAgICAgICBpZiAob2xkRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgb2xkTGlzdCA9IG1PbmdvaW5nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2xkRW50cnkgPSBtTGF0ZXN0LmZpbmRCeUtleShrZXkpOworICAgICAgICAgICAgaWYgKG9sZEVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2xkTGlzdCA9IG1MYXRlc3Q7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG9sZE5vdGlmaWNhdGlvbiA9IG9sZEVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3Mgb2xkQ29udGVudFZpZXcgPSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OworCisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIGNvbnRlbnRWaWV3ID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJvbGQgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgZXhwYW5kZWQ9IiArIG9sZEVudHJ5LmV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiBjb250ZW50Vmlldz0iICsgb2xkQ29udGVudFZpZXcpOworICAgICAgICAgICAgU2xvZy5kKFRBRywgIm5ldyBub3RpZmljYXRpb246IHdoZW49IiArIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgICAgICsgIiBjb250ZW50Vmlldz0iICsgY29udGVudFZpZXcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FuIHdlIGp1c3QgcmVhcHBseSB0aGUgUmVtb3RlVmlld3MgaW4gcGxhY2U/ICBJZiB3aGVuIGRpZG4ndCBjaGFuZ2UsIHRoZSBvcmRlcgorICAgICAgICAvLyBkaWRuJ3QgY2hhbmdlLgorICAgICAgICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuID09IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICYmIG5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKSA9PSBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAmJiBvbGRFbnRyeS5leHBhbmRlZCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcgIT0gbnVsbCAmJiBvbGRDb250ZW50VmlldyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKS5lcXVhbHMoY29udGVudFZpZXcuZ2V0UGFja2FnZSgpKQorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldExheW91dElkKCkgPT0gY29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSkgeworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZXVzaW5nIG5vdGlmaWNhdGlvbiIpOworICAgICAgICAgICAgb2xkRW50cnkubm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBSZWFwcGx5IHRoZSBSZW1vdGVWaWV3cworICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LnJlYXBwbHkodGhpcywgb2xkRW50cnkuY29udGVudCk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb250ZW50SW50ZW50CisgICAgICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50OworICAgICAgICAgICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkRW50cnkuY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IExhdW5jaGVyKGNvbnRlbnRJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGljb24uCisgICAgICAgICAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOworICAgICAgICAgICAgICAgIGlmICghb2xkRW50cnkuaWNvbi5zZXQoaWMpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgdXBkYXRlIGljb246ICIgKyBpYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSXQgZmFpbGVkIHRvIGFkZCBjbGVhbmx5LiAgTG9nLCBhbmQgcmVtb3ZlIHRoZSB2aWV3IGZyb20gdGhlIHBhbmVsLgorICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDb3VsZG4ndCByZWFwcGx5IHZpZXdzIGZvciBwYWNrYWdlICIgKyBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCksIGUpOworICAgICAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJub3QgcmV1c2luZyBub3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aWNrZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCisgICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICFUZXh0VXRpbHMuZXF1YWxzKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgb2xkRW50cnkubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0KSkgeworICAgICAgICAgICAgdGljayhub3RpZmljYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSk7CisgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGQgPSByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworCisgICAgICAgIGlmIChvbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSB0aWNrZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCisgICAgICAgICAgICBtVGlja2VyLnJlbW92ZUVudHJ5KG9sZCk7CisKKyAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgorICAgICAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgY2hvb3NlSWNvbkluZGV4KGJvb2xlYW4gaXNPbmdvaW5nLCBpbnQgdmlld0luZGV4KSB7CisgICAgICAgIGZpbmFsIGludCBsYXRlc3RTaXplID0gbUxhdGVzdC5zaXplKCk7CisgICAgICAgIGlmIChpc09uZ29pbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBsYXRlc3RTaXplICsgKG1PbmdvaW5nLnNpemUoKSAtIHZpZXdJbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSAtIHZpZXdJbmRleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZpZXdbXSBtYWtlTm90aWZpY2F0aW9uVmlldyhTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKKyAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlld3MgPSBuLmNvbnRlbnRWaWV3OworICAgICAgICBpZiAocmVtb3RlVmlld3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgdGhlIHJvdyB2aWV3CisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisgICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5zdGF0dXNfYmFyX2xhdGVzdF9ldmVudCwgcGFyZW50LCBmYWxzZSk7CisKKyAgICAgICAgLy8gYmluZCB0aGUgY2xpY2sgZXZlbnQgdG8gdGhlIGNvbnRlbnQgYXJlYQorICAgICAgICBWaWV3R3JvdXAgY29udGVudCA9IChWaWV3R3JvdXApcm93LmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOworICAgICAgICBjb250ZW50LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKKyAgICAgICAgY29udGVudC5zZXRPbkZvY3VzQ2hhbmdlTGlzdGVuZXIobUZvY3VzQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBuLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LCBub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgIH0KKworICAgICAgICBWaWV3IGV4cGFuZGVkID0gbnVsbDsKKyAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleHBhbmRlZCA9IHJlbW90ZVZpZXdzLmFwcGx5KHRoaXMsIGNvbnRlbnQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cGFuZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBpZGVudCA9IG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKTsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJjb3VsZG4ndCBpbmZsYXRlIHZpZXcgZm9yIG5vdGlmaWNhdGlvbiAiICsgaWRlbnQsIGV4Y2VwdGlvbik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRlbnQuYWRkVmlldyhleHBhbmRlZCk7CisgICAgICAgICAgICByb3cuc2V0RHJhd2luZ0NhY2hlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgVmlld1tdIHsgcm93LCBjb250ZW50LCBleHBhbmRlZCB9OworICAgIH0KKworICAgIFN0YXR1c0Jhckljb25WaWV3IGFkZE5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgbGlzdDsKKyAgICAgICAgVmlld0dyb3VwIHBhcmVudDsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc09uZ29pbmcgPSBub3RpZmljYXRpb24uaXNPbmdvaW5nKCk7CisgICAgICAgIGlmIChpc09uZ29pbmcpIHsKKyAgICAgICAgICAgIGxpc3QgPSBtT25nb2luZzsKKyAgICAgICAgICAgIHBhcmVudCA9IG1PbmdvaW5nSXRlbXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaXN0ID0gbUxhdGVzdDsKKyAgICAgICAgICAgIHBhcmVudCA9IG1MYXRlc3RJdGVtczsKKyAgICAgICAgfQorICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgIGZpbmFsIFZpZXdbXSB2aWV3cyA9IG1ha2VOb3RpZmljYXRpb25WaWV3KG5vdGlmaWNhdGlvbiwgcGFyZW50KTsKKyAgICAgICAgaWYgKHZpZXdzID09IG51bGwpIHsKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgZXhwYW5kIFJlbW90ZVZpZXdzIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBWaWV3IHJvdyA9IHZpZXdzWzBdOworICAgICAgICBmaW5hbCBWaWV3IGNvbnRlbnQgPSB2aWV3c1sxXTsKKyAgICAgICAgZmluYWwgVmlldyBleHBhbmRlZCA9IHZpZXdzWzJdOworICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGljb24uCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgaWYgKCFpY29uVmlldy5zZXQoaWMpKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkaW5nIGNyZWF0ZSBpY29uOiAiICsgaWMpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWRkIHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBmaW5hbCBpbnQgdmlld0luZGV4ID0gbGlzdC5hZGQoa2V5LCBub3RpZmljYXRpb24sIHJvdywgY29udGVudCwgZXhwYW5kZWQsIGljb25WaWV3KTsKKyAgICAgICAgcGFyZW50LmFkZFZpZXcocm93LCB2aWV3SW5kZXgpOworICAgICAgICAvLyBBZGQgdGhlIGljb24uCisgICAgICAgIGZpbmFsIGludCBpY29uSW5kZXggPSBjaG9vc2VJY29uSW5kZXgoaXNPbmdvaW5nLCB2aWV3SW5kZXgpOworICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkVmlldyhpY29uVmlldywgaWNvbkluZGV4KTsKKyAgICAgICAgcmV0dXJuIGljb25WaWV3OworICAgIH0KKworICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSkgeworICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbU9uZ29pbmcucmVtb3ZlKGtleSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBlbnRyeSA9IG1MYXRlc3QucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZW1vdmVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgICgoVmlld0dyb3VwKWVudHJ5LnJvdy5nZXRQYXJlbnQoKSkucmVtb3ZlVmlldyhlbnRyeS5yb3cpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGljb24uCisgICAgICAgICgoVmlld0dyb3VwKWVudHJ5Lmljb24uZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkuaWNvbik7CisKKyAgICAgICAgcmV0dXJuIGVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCkgeworICAgICAgICBib29sZWFuIG9uZ29pbmcgPSBtT25nb2luZy5oYXNWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgYm9vbGVhbiBsYXRlc3QgPSBtTGF0ZXN0Lmhhc1Zpc2libGVJdGVtcygpOworCisgICAgICAgIC8vIChubyBvbmdvaW5nIG5vdGlmaWNhdGlvbnMgYXJlIGNsZWFyYWJsZSkKKyAgICAgICAgaWYgKG1MYXRlc3QuaGFzQ2xlYXJhYmxlSXRlbXMoKSkgeworICAgICAgICAgICAgbUNsZWFyQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfQorCisgICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShvbmdvaW5nID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkobGF0ZXN0ID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKworICAgICAgICBpZiAob25nb2luZyB8fCBsYXRlc3QpIHsKKyAgICAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpcyBvbmUgb3IgbW9yZSBvZiB0aGUgRElTQUJMRSBjb25zdGFudHMgZnJvbSBTdGF0dXNCYXJNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoaW50IHN0YXRlKSB7CisgICAgICAgIGZpbmFsIGludCBvbGQgPSBtRGlzYWJsZWQ7CisgICAgICAgIGZpbmFsIGludCBkaWZmID0gc3RhdGUgXiBvbGQ7CisgICAgICAgIG1EaXNhYmxlZCA9IHN0YXRlOworCisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVI6IHllcyIpOworICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsIGNoYW5nZXMgdG8gdGhlIHN0YXR1cyBiYXIgYW5kIG5vdGlmaWNhdGlvbnMgZnVubmVsIHRocm91Z2ggaGVyZSBhbmQgYXJlIGJhdGNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG0ud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FOSU1BVEU6CisgICAgICAgICAgICAgICAgICAgIGRvQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FOSU1BVEVfUkVWRUFMOgorICAgICAgICAgICAgICAgICAgICBkb1JldmVhbEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TSE9XX0lOVFJVREVSOgorICAgICAgICAgICAgICAgICAgICBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfSElERV9JTlRSVURFUjoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW50cnVkZXJBbGVydFZpc2liaWxpdHkoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZpZXcuT25Gb2N1c0NoYW5nZUxpc3RlbmVyIG1Gb2N1c0NoYW5nZUxpc3RlbmVyID0gbmV3IFZpZXcuT25Gb2N1c0NoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkZvY3VzQ2hhbmdlKFZpZXcgdiwgYm9vbGVhbiBoYXNGb2N1cykgeworICAgICAgICAgICAgLy8gQmVjYXVzZSAndicgaXMgYSBWaWV3R3JvdXAsIGFsbCBpdHMgY2hpbGRyZW4gd2lsbCBiZSAodW4pc2VsZWN0ZWQKKyAgICAgICAgICAgIC8vIHRvbywgd2hpY2ggYWxsb3dzIG1hcnF1ZWVpbmcgdG8gd29yay4KKyAgICAgICAgICAgIHYuc2V0U2VsZWN0ZWQoaGFzRm9jdXMpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBtYWtlRXhwYW5kZWRWaXNpYmxlKCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIk1ha2UgZXhwYW5kZWQgdmlzaWJsZTogZXhwYW5kZWQgdmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7CisgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IHRydWU7CisgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHRydWUpOworCisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICBtRXhwYW5kZWRWaWV3LnJlcXVlc3RGb2N1cyhWaWV3LkZPQ1VTX0ZPUldBUkQpOworICAgICAgICBtVHJhY2tpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICBpZiAoIW1UaWNraW5nKSB7CisgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUV4cGFuZCgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRlIGV4cGFuZDogZXhwYW5kZWQ9IiArIG1FeHBhbmRlZCk7CisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUV4cGFuZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwcmVwYXJlVHJhY2tpbmcoMCwgdHJ1ZSk7CisgICAgICAgIHBlcmZvcm1GbGluZygwLCAyMDAwLjBmLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlQ29sbGFwc2UoKSB7CisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYW5pbWF0ZUNvbGxhcHNlKCk6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlCisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZworICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1ZPSIgKyBtQW5pbVkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCB5OworICAgICAgICBpZiAobUFuaW1hdGluZykgeworICAgICAgICAgICAgeSA9IChpbnQpbUFuaW1ZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeSA9IG1EaXNwbGF5LmdldEhlaWdodCgpLTE7CisgICAgICAgIH0KKyAgICAgICAgLy8gTGV0IHRoZSBmbGluZyB0aGluayB0aGF0IHdlJ3JlIG9wZW4gc28gaXQgZ29lcyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uCisgICAgICAgIC8vIGFuZCBkb2Vzbid0IHRyeSB0byByZS1vcGVuIHRoZSB3aW5kb3dzaGFkZS4KKyAgICAgICAgbUV4cGFuZGVkID0gdHJ1ZTsKKyAgICAgICAgcHJlcGFyZVRyYWNraW5nKHksIGZhbHNlKTsKKyAgICAgICAgcGVyZm9ybUZsaW5nKHksIC0yMDAwLjBmLCB0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1FeHBhbmQoKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUV4cGFuZDogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1FeHBhbmRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUV4cGFuZGVkID0gdHJ1ZTsKKyAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOworICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfRlVMTF9PUEVOKTsKKworICAgICAgICBpZiAoZmFsc2UpIHBvc3RTdGFydFRyYWNpbmcoKTsKKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1Db2xsYXBzZSgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtQ29sbGFwc2U6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOworCisgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSBmYWxzZTsKKyAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQoZmFsc2UpOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSA9PSAwKSB7CisgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgIH0KKyAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOworCisgICAgICAgIGlmICghbUV4cGFuZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUV4cGFuZGVkID0gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBkb0FuaW1hdGlvbigpIHsKKyAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYmVmb3JlIG1BbmltWT0iICsgbUFuaW1ZKTsKKyAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYWZ0ZXIgIG1BbmltWT0iICsgbUFuaW1ZKTsKKyAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMSkgeworICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0aW9uIGNvbXBsZXRlZCB0byBleHBhbmRlZCBzdGF0ZS4iKTsKKyAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7CisgICAgICAgICAgICAgICAgcGVyZm9ybUV4cGFuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobUFuaW1ZIDwgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gY29sbGFwc2VkIHN0YXRlLiIpOworICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoMCk7CisgICAgICAgICAgICAgICAgcGVyZm9ybUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURSksIG1DdXJBbmltYXRpb25UaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RvcFRyYWNraW5nKCkgeworICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOworICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50QW5pbSgpIHsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmxvYXQgdCA9ICgoZmxvYXQpKG5vdyAtIG1BbmltTGFzdFRpbWUpKSAvIDEwMDA7ICAgICAgICAgICAgLy8gbXMgLT4gcworICAgICAgICBmaW5hbCBmbG9hdCB5ID0gbUFuaW1ZOworICAgICAgICBmaW5hbCBmbG9hdCB2ID0gbUFuaW1WZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCisgICAgICAgIGZpbmFsIGZsb2F0IGEgPSBtQW5pbUFjY2VsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MvcworICAgICAgICBtQW5pbVkgPSB5ICsgKHYqdCkgKyAoMC41ZiphKnQqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweAorICAgICAgICBtQW5pbVZlbCA9IHYgKyAoYSp0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCisgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1zCisgICAgICAgIC8vU2xvZy5kKFRBRywgInk9IiArIHkgKyAiIHY9IiArIHYgKyAiIGE9IiArIGEgKyAiIHQ9IiArIHQgKyAiIG1BbmltWT0iICsgbUFuaW1ZCisgICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7CisgICAgfQorCisgICAgdm9pZCBkb1JldmVhbEFuaW1hdGlvbigpIHsKKyAgICAgICAgZmluYWwgaW50IGggPSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGlmIChtQW5pbWF0aW5nUmV2ZWFsICYmIG1BbmltYXRpbmcgJiYgbUFuaW1ZIDwgaCkgeworICAgICAgICAgICAgaW5jcmVtZW50QW5pbSgpOworICAgICAgICAgICAgaWYgKG1BbmltWSA+PSBoKSB7CisgICAgICAgICAgICAgICAgbUFuaW1ZID0gaDsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURV9SRVZFQUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwcmVwYXJlVHJhY2tpbmcoaW50IHksIGJvb2xlYW4gb3BlbmluZykgeworICAgICAgICBtVHJhY2tpbmcgPSB0cnVlOworICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICBpZiAob3BlbmluZykgeworICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7CisgICAgICAgICAgICBtQW5pbVZlbCA9IDIwMDsKKyAgICAgICAgICAgIG1BbmltWSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKKyAgICAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IHRydWU7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOworICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7CisgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKKyAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXQncyBvcGVuLCBjbG9zZSBpdD8KKyAgICAgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1GbGluZyhpbnQgeSwgZmxvYXQgdmVsLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7CisgICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgbUFuaW1ZID0geTsKKyAgICAgICAgbUFuaW1WZWwgPSB2ZWw7CisKKyAgICAgICAgLy9TbG9nLmQoVEFHLCAic3RhcnRpbmcgd2l0aCBtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKKworICAgICAgICBpZiAobUV4cGFuZGVkKSB7CisgICAgICAgICAgICBpZiAoIWFsd2F5cyAmJiAoCisgICAgICAgICAgICAgICAgICAgIHZlbCA+IDIwMC4wZgorICAgICAgICAgICAgICAgICAgICB8fCAoeSA+IChtRGlzcGxheUhlaWdodC0yNSkgJiYgdmVsID4gLTIwMC4wZikpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkLCBidXQgdGhleSBkaWRuJ3QgbW92ZSBzdWZmaWNpZW50bHkgdG8gY2F1c2UKKyAgICAgICAgICAgICAgICAvLyB1cyB0byByZXRyYWN0LiAgQW5pbWF0ZSBiYWNrIHRvIHRoZSBleHBhbmRlZCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkIGFuZCBhcmUgbm93IGdvaW5nIHRvIGFuaW1hdGUgYXdheS4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7CisgICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhbHdheXMgfHwgKAorICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKKyAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQvMikgJiYgdmVsID4gLTIwMC4wZikpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYW5kIHRoZXkgbW92ZWQgZW5vdWdoIHRvIGFsbG93IHVzIHRvCisgICAgICAgICAgICAgICAgLy8gZXhwYW5kLiAgQW5pbWF0ZSBpbiB0aGUgbm90aWZpY2F0aW9ucy4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCisgICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgY29sbGFwc2VkIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAtMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vU2xvZy5kKFRBRywgIm1BbmltWT0iICsgbUFuaW1ZICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwKKyAgICAgICAgLy8gICAgICAgICsgIiBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKKworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OworICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFX1JFVkVBTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7CisgICAgICAgIHN0b3BUcmFja2luZygpOworICAgIH0KKworICAgIGJvb2xlYW4gaW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvdWNoOiByYXdZPSIgKyBldmVudC5nZXRSYXdZKCkgKyAiIGV2ZW50PSIgKyBldmVudCArICIgbURpc2FibGVkPSIKKyAgICAgICAgICAgICAgICArIG1EaXNhYmxlZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBzdGF0dXNCYXJTaXplID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBoaXRTaXplID0gc3RhdHVzQmFyU2l6ZSoyOworICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7CisKKyAgICAgICAgICAgIGlmICghbUV4cGFuZGVkKSB7CisgICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IHN0YXR1c0JhclNpemUgLSB5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IG1BYnNQb3NbMV0gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpIC0geTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoIW1FeHBhbmRlZCAmJiB5IDwgaGl0U2l6ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1FeHBhbmRlZCAmJiB5ID4gKG1EaXNwbGF5LmdldEhlaWdodCgpLWhpdFNpemUpKSkgeworCisgICAgICAgICAgICAgICAgLy8gV2UgZHJvcCBldmVudHMgYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBtYWtlIHRoZSB3aW5kb3dzaGFkZSBjb21lCisgICAgICAgICAgICAgICAgLy8gZG93biBieSBhY2NpZGVudCBsZXNzLCBlc3BlY2lhbGx5IHdoZW4gcHVzaGluZyBvcGVuIGEgZGV2aWNlIHdpdGggYSBrZXlib2FyZAorICAgICAgICAgICAgICAgIC8vIHRoYXQgcm90YXRlcyAobGlrZSBnMSBhbmQgZHJvaWQpCisgICAgICAgICAgICAgICAgaW50IHggPSAoaW50KWV2ZW50LmdldFJhd1goKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZWRnZUJvcmRlciA9IG1FZGdlQm9yZGVyOworICAgICAgICAgICAgICAgIGlmICh4ID49IGVkZ2VCb3JkZXIgJiYgeCA8IG1EaXNwbGF5LmdldFdpZHRoKCkgLSBlZGdlQm9yZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCAhbUV4cGFuZGVkKTsvLyBvcGVuaW5nIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1UcmFja2luZykgeworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWluWSA9IHN0YXR1c0JhclNpemUgKyBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOworICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICAgICAgaW50IHkgPSAoaW50KWV2ZW50LmdldFJhd1koKTsKKyAgICAgICAgICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiB5IDwgbWluWSkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgICAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHlWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eSgpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVnYXRpdmUgPSB5VmVsIDwgMDsKKworICAgICAgICAgICAgICAgIGZsb2F0IHhWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFhWZWxvY2l0eSgpOworICAgICAgICAgICAgICAgIGlmICh4VmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB4VmVsID0gLXhWZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4VmVsID4gMTUwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIHhWZWwgPSAxNTAuMGY7IC8vIGxpbWl0IGhvdyBtdWNoIHdlIGNhcmUgYWJvdXQgdGhlIHggYXhpcworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZsb2F0IHZlbCA9IChmbG9hdClNYXRoLmh5cG90KHlWZWwsIHhWZWwpOworICAgICAgICAgICAgICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICB2ZWwgPSAtdmVsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBlcmZvcm1GbGluZygoaW50KWV2ZW50LmdldFJhd1koKSwgdmVsLCBmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbikgeworICAgICAgICBpZiAoIW9uKSB7CisgICAgICAgICAgICAvLyBBbGwgd2UgZG8gZm9yICJsaWdodHMgb3V0IiBtb2RlIG9uIGEgcGhvbmUgaXMgaGlkZSB0aGUgc3RhdHVzIGJhciwKKyAgICAgICAgICAgIC8vIHdoaWNoIHRoZSB3aW5kb3cgbWFuYWdlciBkb2VzLiAgQnV0IHdlIGRvIG5lZWQgdG8gaGlkZSB0aGUgd2luZG93c2hhZGUKKyAgICAgICAgICAgIC8vIG9uIG91ciBvd24uCisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGF1bmNoZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSW50ZW50OworICAgICAgICBwcml2YXRlIFN0cmluZyBtUGtnOworICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFnOworICAgICAgICBwcml2YXRlIGludCBtSWQ7CisKKyAgICAgICAgTGF1bmNoZXIoUGVuZGluZ0ludGVudCBpbnRlbnQsIFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIG1Qa2cgPSBwa2c7CisgICAgICAgICAgICBtVGFnID0gdGFnOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaW50ZW50IHdlIGFyZSBzZW5kaW5nIGlzIGZvciB0aGUgYXBwbGljYXRpb24sIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gd29uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IGFuIGFjdGl2aXR5IGFmdGVyCisgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgc3dpdGNoZXMgdG8gaG9tZS4gIFdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBhdCB0aGlzCisgICAgICAgICAgICAgICAgLy8gcG9pbnQsIHNvIG1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgc3dpdGNoZXMgYXJlIG5vdyBhbGxvd2VkLgorICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkucmVzdW1lQXBwU3dpdGNoZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOworICAgICAgICAgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbihwb3MpOworICAgICAgICAgICAgICAgIEludGVudCBvdmVybGF5ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgIG92ZXJsYXkuc2V0U291cmNlQm91bmRzKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QocG9zWzBdLCBwb3NbMV0sIHBvc1swXSt2LmdldFdpZHRoKCksIHBvc1sxXSt2LmdldEhlaWdodCgpKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUludGVudC5zZW5kKFBob25lU3RhdHVzQmFyU2VydmljZS50aGlzLCAwLCBvdmVybGF5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrIHRyYWNlIGlzbid0IHZlcnkgaGVscGZ1bCBoZXJlLiAgSnVzdCBsb2cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiU2VuZGluZyBjb250ZW50SW50ZW50IGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkNsaWNrKG1Qa2csIG1UYWcsIG1JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzaGFkZSBpZiBpdCB3YXMgb3BlbgorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgY2xpY2sgd2FzIG9uIHRoZSBpbnRydWRlciBhbGVydCwgaGlkZSB0aGF0IGluc3RlYWQKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0hJREVfSU5UUlVERVIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRpY2soU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICAgICAgLy8gU2hvdyB0aGUgdGlja2VyIGlmIG9uZSBpcyByZXF1ZXN0ZWQuIEFsc28gZG9uJ3QgZG8gdGhpcworICAgICAgICAvLyB1bnRpbCBzdGF0dXMgYmFyIHdpbmRvdyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIsCisgICAgICAgIC8vIGJlY2F1c2UuLi4gIHdlbGwsIHdoYXQncyB0aGUgcG9pbnQgb3RoZXJ3aXNlPyAgQW5kIHRyeWluZyB0bworICAgICAgICAvLyBydW4gYSB0aWNrZXIgd2l0aG91dCBiZWluZyBhdHRhY2hlZCB3aWxsIGNyYXNoIQorICAgICAgICBpZiAobi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsICYmIG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKDAgPT0gKG1EaXNhYmxlZCAmIChTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikpKSB7CisgICAgICAgICAgICAgICAgbVRpY2tlci5hZGRFbnRyeShuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGlzIG5vdGlmaWNhdGlvbiBhbmQgdGVsbCB0aGUgU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UgLyBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZQorICAgICAqIGFib3V0IHRoZSBmYWlsdXJlLgorICAgICAqCisgICAgICogV0FSTklORzogdGhpcyB3aWxsIGNhbGwgYmFjayBpbnRvIHVzLiAgRG9uJ3QgaG9sZCBhbnkgbG9ja3MuCisgICAgICovCisgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbihrZXkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25FcnJvcihuLnBrZywgbi50YWcsIG4uaWQsIG4udWlkLCBuLmluaXRpYWxQaWQsIG1lc3NhZ2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFRoZSBlbmQgaXMgbmlnaC4KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTXlUaWNrZXIgZXh0ZW5kcyBUaWNrZXIgeworICAgICAgICBNeVRpY2tlcihDb250ZXh0IGNvbnRleHQsIFZpZXcgc2IpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHNiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJTdGFydGluZygpIHsKKyAgICAgICAgICAgIG1UaWNraW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9pbiwgbnVsbCkpOworICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCwgbnVsbCkpOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VyRG9uZSgpIHsKKyAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9pbiwgbnVsbCkpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtVGlja2luZ0RvbmVMaXN0ZW5lcikpOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9pbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJIYWx0aW5nKCkgeworICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbiwgbnVsbCkpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpY2tpbmdEb25lTGlzdGVuZXIpKTsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBtVGlja2luZ0RvbmVMaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7OworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRpb24gYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBtVGlja2luZyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEFuaW1hdGlvbiBsb2FkQW5pbShpbnQgaWQsIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBBbmltYXRpb24gYW5pbSA9IEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIGlkKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdmlld0luZm8oVmlldyB2KSB7CisgICAgICAgIHJldHVybiAiKCIgKyB2LmdldExlZnQoKSArICIsIiArIHYuZ2V0VG9wKCkgKyAiKSgiICsgdi5nZXRSaWdodCgpICsgIiwiICsgdi5nZXRCb3R0b20oKQorICAgICAgICAgICAgICAgICsgIiAiICsgdi5nZXRXaWR0aCgpICsgIngiICsgdi5nZXRIZWlnaHQoKSArICIpIjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAoY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUCkKKyAgICAgICAgICAgICAgICAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFN0YXR1c0JhciBmcm9tIGZyb20gcGlkPSIKKyAgICAgICAgICAgICAgICAgICAgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpCisgICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobVF1ZXVlTG9jaykgeworICAgICAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBTdGF0dXMgQmFyIHN0YXRlOiIpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIsIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVGlja2luZz0iICsgbVRpY2tpbmcpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmc9IiArIG1UcmFja2luZyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtQW5pbVk9IiArIG1BbmltWSArICIsIG1BbmltVmVsPSIgKyBtQW5pbVZlbAorICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ3VyQW5pbWF0aW9uVGltZT0iICsgbUN1ckFuaW1hdGlvblRpbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltTGFzdFRpbWU9IiArIG1BbmltTGFzdFRpbWUpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGlzcGxheUhlaWdodD0iICsgbURpc3BsYXlIZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmdSZXZlYWw9IiArIG1BbmltYXRpbmdSZXZlYWwKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1WaWV3RGVsdGE9IiArIG1WaWV3RGVsdGEpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGlzcGxheUhlaWdodD0iICsgbURpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWRQYXJhbXM6ICIgKyBtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWRWaWV3OiAiICsgdmlld0luZm8obUV4cGFuZGVkVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWREaWFsb2c6ICIgKyBtRXhwYW5kZWREaWFsb2cpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmdQYXJhbXM6ICIgKyBtVHJhY2tpbmdQYXJhbXMpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmdWaWV3OiAiICsgdmlld0luZm8obVRyYWNraW5nVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtT25nb2luZ1RpdGxlOiAiICsgdmlld0luZm8obU9uZ29pbmdUaXRsZSkpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtT25nb2luZ0l0ZW1zOiAiICsgdmlld0luZm8obU9uZ29pbmdJdGVtcykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0VGl0bGU6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0VGl0bGUpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUxhdGVzdEl0ZW1zOiAiICsgdmlld0luZm8obUxhdGVzdEl0ZW1zKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZTogIiArIHZpZXdJbmZvKG1Ob05vdGlmaWNhdGlvbnNUaXRsZSkpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2xvc2VWaWV3OiAiICsgdmlld0luZm8obUNsb3NlVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVGlja2VyVmlldzogIiArIHZpZXdJbmZvKG1UaWNrZXJWaWV3KSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1TY3JvbGxWaWV3OiAiICsgdmlld0luZm8obVNjcm9sbFZpZXcpCisgICAgICAgICAgICAgICAgICAgICsgIiBzY3JvbGwgIiArIG1TY3JvbGxWaWV3LmdldFNjcm9sbFgoKSArICIsIiArIG1TY3JvbGxWaWV3LmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCJtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0OiAiICsgdmlld0luZm8obU5vdGlmaWNhdGlvbkxpbmVhckxheW91dCkpOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkRhdGEpIHsKKyAgICAgICAgICAgIGludCBOID0gbU5vdGlmaWNhdGlvbkRhdGEub25nb2luZ0NvdW50KCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG9uZ29pbmdDb3VudC5zaXplPSIgKyBOKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiA9IG1Ob3RpZmljYXRpb25EYXRhLmdldE9uZ29pbmcoaSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIFsiICsgaSArICJdIGtleT0iICsgbi5rZXkgKyAiIHZpZXc9IiArIG4udmlldyk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICAgICAgICBkYXRhPSIgKyBuLmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTiA9IG1Ob3RpZmljYXRpb25EYXRhLmxhdGVzdENvdW50KCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG9uZ29pbmdDb3VudC5zaXplPSIgKyBOKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiA9IG1Ob3RpZmljYXRpb25EYXRhLmdldExhdGVzdChpKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgWyIgKyBpICsgIl0ga2V5PSIgKyBuLmtleSArICIgdmlldz0iICsgbi52aWV3KTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgICAgICAgIGRhdGE9IiArIG4uZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oInNlZSB0aGUgbG9nY2F0IGZvciBhIGR1bXAgb2YgdGhlIHZpZXdzIHdlIGhhdmUgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIC8vIG11c3QgaGFwcGVuIG9uIHVpIHRocmVhZAorICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibVN0YXR1c0JhclZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbVN0YXR1c0JhclZpZXcuZ2V0V2lkdGgoKSArICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJWaWV3LmRlYnVnKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRlZFZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtRXhwYW5kZWRWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1FeHBhbmRlZFZpZXcuZ2V0V2lkdGgoKSArICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1FeHBhbmRlZFZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlldy5kZWJ1ZygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibVRyYWNraW5nVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtVHJhY2tpbmdWaWV3LmdldFdpZHRoKCkgKyAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZGVidWcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvbkJhclZpZXdBdHRhY2hlZCgpIHsKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHA7CisgICAgICAgIGludCBwaXhlbEZvcm1hdDsKKyAgICAgICAgRHJhd2FibGUgYmc7CisKKyAgICAgICAgLy8vIC0tLS0tLS0tLS0gVHJhY2tpbmcgVmlldyAtLS0tLS0tLS0tLS0tLQorICAgICAgICBwaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQlhfODg4ODsKKyAgICAgICAgYmcgPSBtVHJhY2tpbmdWaWV3LmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBpeGVsRm9ybWF0ID0gYmcuZ2V0T3BhY2l0eSgpOworICAgICAgICB9CisKKyAgICAgICAgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCisgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXQpOworLy8gICAgICAgIGxwLnRva2VuID0gbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLnNldFRpdGxlKCJUcmFja2luZ1ZpZXciKTsKKyAgICAgICAgbHAueSA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICBtVHJhY2tpbmdQYXJhbXMgPSBscDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtVHJhY2tpbmdWaWV3LCBscCk7CisgICAgfQorCisgICAgdm9pZCBvblRyYWNraW5nVmlld0F0dGFjaGVkKCkgeworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKKyAgICAgICAgaW50IHBpeGVsRm9ybWF0OworICAgICAgICBEcmF3YWJsZSBiZzsKKworICAgICAgICAvLy8gLS0tLS0tLS0tLSBFeHBhbmRlZCBWaWV3IC0tLS0tLS0tLS0tLS0tCisgICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQ7CisKKyAgICAgICAgZmluYWwgaW50IGRpc3BoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGxwID0gbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgbHAud2lkdGggPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgbHAuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKKyAgICAgICAgbHAueCA9IDA7CisgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbHAueSA9IC1kaXNwaDsgLy8gc3VmZmljaWVudGx5IGxhcmdlIG5lZ2F0aXZlCisgICAgICAgIGxwLnR5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUw7CisgICAgICAgIGxwLmZsYWdzID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJVEhFUgorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworICAgICAgICBscC5mb3JtYXQgPSBwaXhlbEZvcm1hdDsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXJFeHBhbmRlZCIpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhscCk7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRGb3JtYXQocGl4ZWxGb3JtYXQpOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMgPSBscDsKKworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2V0Q29udGVudFZpZXcobUV4cGFuZGVkVmlldywKKyAgICAgICAgICAgICAgICBuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlKG51bGwpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2hvdygpOworICAgICAgICBGcmFtZUxheW91dCBoYWNrID0gKEZyYW1lTGF5b3V0KW1FeHBhbmRlZFZpZXcuZ2V0UGFyZW50KCk7CisgICAgfQorCisgICAgdm9pZCBzZXREYXRlVmlld1Zpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgeworICAgICAgICBtRGF0ZVZpZXcuc2V0VXBkYXRlcyh2aXNpYmxlKTsKKyAgICAgICAgbURhdGVWaWV3LnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgbURhdGVWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgaW50IGFuaW0pIHsKKyAgICAgICAgaW50IG9sZCA9IG1Ob3RpZmljYXRpb25JY29ucy5nZXRWaXNpYmlsaXR5KCk7CisgICAgICAgIGludCB2ID0gdmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFOworICAgICAgICBpZiAob2xkICE9IHYpIHsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KHYpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKGludCBleHBhbmRlZFBvc2l0aW9uKSB7CisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGJlZm9yZSBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iICsgbVRyYWNraW5nUGFyYW1zLnkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaCA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKworICAgICAgICAvLyBJZiB0aGUgZXhwYW5kZWQgdmlldyBpcyBub3QgdmlzaWJsZSwgbWFrZSBzdXJlIHRoZXkncmUgc3RpbGwgb2ZmIHNjcmVlbi4KKyAgICAgICAgLy8gTWF5YmUgdGhlIHZpZXcgd2FzIHJlc2l6ZWQuCisgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgaWYgKG1UcmFja2luZ1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gLWRpc3BoOworICAgICAgICAgICAgICAgIGlmIChtVHJhY2tpbmdQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdQYXJhbXMueSA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOworICAgICAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyB0cmFja2luZyB2aWV3Li4uCisgICAgICAgIGludCBwb3M7CisgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0ZVTExfT1BFTikgeworICAgICAgICAgICAgcG9zID0gaDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0xFQVZFX0FMT05FKSB7CisgICAgICAgICAgICBwb3MgPSBtVHJhY2tpbmdQb3NpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uIDw9IGRpc3BoKSB7CisgICAgICAgICAgICAgICAgcG9zID0gZXhwYW5kZWRQb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcG9zID0gZGlzcGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3MgLT0gZGlzcGgtaDsKKyAgICAgICAgfQorICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IG1UcmFja2luZ1BhcmFtcy55ID0gcG9zOworICAgICAgICBtVHJhY2tpbmdQYXJhbXMuaGVpZ2h0ID0gZGlzcGgtaDsKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobVRyYWNraW5nVmlldywgbVRyYWNraW5nUGFyYW1zKTsKKworICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DbG9zZVZpZXcuZ2V0TG9jYXRpb25JbldpbmRvdyhtUG9zaXRpb25UbXApOworICAgICAgICAgICAgZmluYWwgaW50IGNsb3NlUG9zID0gbVBvc2l0aW9uVG1wWzFdOworCisgICAgICAgICAgICBtRXhwYW5kZWRDb250ZW50cy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY29udGVudHNCb3R0b20gPSBtUG9zaXRpb25UbXBbMV0gKyBtRXhwYW5kZWRDb250ZW50cy5nZXRIZWlnaHQoKTsKKworICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBwb3MgKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpCisgICAgICAgICAgICAgICAgICAgIC0gKG1UcmFja2luZ1BhcmFtcy5oZWlnaHQtY2xvc2VQb3MpIC0gY29udGVudHNCb3R0b207CisgICAgICAgICAgICBpbnQgbWF4ID0gaDsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMueSA+IG1heCkgeworICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gbWF4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1pbiA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55IDwgbWluKSB7CisgICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtaW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IChtVHJhY2tpbmdQb3NpdGlvbiArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpID4gaDsKKyAgICAgICAgICAgIGlmICghdmlzaWJsZSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjb250ZW50cyBhcmVuJ3QgdmlzaWJsZSwgbW92ZSB0aGUgZXhwYW5kZWQgdmlldyB3YXkgb2ZmIHNjcmVlbgorICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHdpbmRvdyBpdHNlbGYgZXh0ZW5kcyBiZWxvdyB0aGUgY29udGVudCB2aWV3LgorICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKworICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGlzIGlzbid0IGp1c3QgYSByZXBvc2l0aW9uaW5nIHRoYXQncyBub3Qgc3VwcG9zZWQgdG8gYWZmZWN0CisgICAgICAgICAgICAvLyB0aGUgdXNlcidzIHBlcmNlcHRpb24gb2Ygd2hhdCdzIHNob3dpbmcsIGNhbGwgdG8gc2F5IHRoYXQgdGhlIHZpc2liaWxpdHkKKyAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkLiAoT3RoZXJ3aXNlLCBzb21lb25lIGVsc2Ugd2lsbCBjYWxsIHRvIGRvIHRoYXQpLgorICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gIT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyB2aXNpYmlsaXR5Q2hhbmdlZCgiICsgdmlzaWJsZSArICIpIik7CisgICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodmlzaWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyBhZnRlciAgZXhwYW5kZWRQb3NpdGlvbj0iICsgZXhwYW5kZWRQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUGFyYW1zLnk9IiArIG1UcmFja2luZ1BhcmFtcy55CisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQb3NpdGlvbj0iICsgbVRyYWNraW5nUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFBhcmFtcy55PSIgKyBtRXhwYW5kZWRQYXJhbXMueQorICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLmhlaWdodD0iICsgbUV4cGFuZGVkUGFyYW1zLmhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgZ2V0RXhwYW5kZWRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtRGlzcGxheS5nZXRIZWlnaHQoKSAtIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpIC0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUV4cGFuZGVkSGVpZ2h0KCkgeworICAgICAgICBpZiAobUV4cGFuZGVkVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgTEVEcyBhcmUgdHVybmVkIG8pZmYgd2hlbiB0aGUgbm90aWZpY2F0aW9uIHBhbmVsIGlzIHNob3duLCBldmVuIGp1c3QgYSBsaXR0bGUgYml0LgorICAgICAqIFRoaXMgd2FzIGFkZGVkIGxhc3QtbWludXRlIGFuZCBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IHRoZSByZXN0IG9mIHRoZSBub3RpZmljYXRpb25zCisgICAgICogYXJlIGhhbmRsZWQsIGJlY2F1c2UgdGhlIG5vdGlmaWNhdGlvbiBpc24ndCByZWFsbHkgY2FuY2VsbGVkLiAgVGhlIGxpZ2h0cyBhcmUganVzdAorICAgICAqIHR1cm5lZCBvZmYuICBJZiBhbnkgb3RoZXIgbm90aWZpY2F0aW9ucyBoYXBwZW4sIHRoZSBsaWdodHMgd2lsbCB0dXJuIGJhY2sgb24uICBTdGV2ZSBzYXlzCisgICAgICogdGhpcyBpcyB3aGF0IGhlIHdhbnRzLiAoc2VlIGJ1ZyAxMTMxNDYxKQorICAgICAqLworICAgIHZvaWQgdmlzaWJpbGl0eUNoYW5nZWQoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmIChtUGFuZWxTbGlnaHRseVZpc2libGUgIT0gdmlzaWJsZSkgeworICAgICAgICAgICAgbVBhbmVsU2xpZ2h0bHlWaXNpYmxlID0gdmlzaWJsZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25QYW5lbFJldmVhbGVkKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBXb24ndCBmYWlsIHVubGVzcyB0aGUgd29ybGQgaGFzIGVuZGVkLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRGlzYWJsZUFjdGlvbnMoaW50IG5ldCkgeworICAgICAgICBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBpbnQgZGlmZiA9IG5ldCBeIG9sZDsKKyAgICAgICAgbURpc2FibGVkID0gbmV0OworCisgICAgICAgIC8vIGFjdCBhY2NvcmRpbmdseQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xlYXJCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MuZXF1YWxzKGFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgfHwgSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eShib29sZWFuIHZpcykgeworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0VmlzaWJpbGl0eSh2aXMgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbG9hZCBzb21lIG9mIG91ciByZXNvdXJjZXMgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorICAgICAqCisgICAgICogV2UgZG9uJ3QgcmVsb2FkIGV2ZXJ5dGhpbmcgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIC0tIHdlIHByb2JhYmx5CisgICAgICogc2hvdWxkLCBidXQgZ2V0dGluZyB0aGF0IHNtb290aCBpcyB0b3VnaC4gIFNvbWVkYXkgd2UnbGwgZml4IHRoYXQuICBJbiB0aGUKKyAgICAgKiBtZWFudGltZSwganVzdCB1cGRhdGUgdGhlIHRoaW5ncyB0aGF0IHdlIGtub3cgY2hhbmdlLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlUmVzb3VyY2VzKCkgeworICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24pKTsKKyAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9vbmdvaW5nX2V2ZW50c190aXRsZSkpOworICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50c190aXRsZSkpOworICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbm9fbm90aWZpY2F0aW9uc190aXRsZSkpOworCisgICAgICAgIG1FZGdlQm9yZGVyID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUpOworCisgICAgICAgIGlmIChmYWxzZSkgU2xvZy52KFRBRywgInVwZGF0ZVJlc291cmNlcyIpOworICAgIH0KKworICAgIC8vCisgICAgLy8gdHJhY2luZworICAgIC8vCisKKyAgICB2b2lkIHBvc3RTdGFydFRyYWNpbmcoKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdGFydFRyYWNpbmcsIDMwMDApOworICAgIH0KKworICAgIHZvaWQgdmlicmF0ZSgpIHsKKyAgICAgICAgYW5kcm9pZC5vcy5WaWJyYXRvciB2aWIgPSAoYW5kcm9pZC5vcy5WaWJyYXRvcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7CisgICAgICAgIHZpYi52aWJyYXRlKDI1MCk7CisgICAgfQorCisgICAgUnVubmFibGUgbVN0YXJ0VHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjUwKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdGFydFRyYWNpbmciKTsKKyAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RhcnRNZXRob2RUcmFjaW5nKCIvZGF0YS9zdGF0dXNiYXItdHJhY2VzL3RyYWNlIik7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtU3RvcFRyYWNpbmcsIDEwMDAwKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBSdW5uYWJsZSBtU3RvcFRyYWNpbmcgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RvcE1ldGhvZFRyYWNpbmcoKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdG9wVHJhY2luZyIpOworICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICB9CisgICAgfTsKK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJQb2xpY3kuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyUG9saWN5LmphdmEKaW5kZXggMDMwOTQzMC4uZTAwMTliNSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJQb2xpY3kuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclBvbGljeS5qYXZhCkBAIC0xOCw5ICsxOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUGJhcDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKQEAgLTMxOSw5ICszMTgsNiBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtVm9sdW1lVmlzaWJsZTsKIAogICAgIC8vIGJsdWV0b290aCBkZXZpY2Ugc3RhdHVzCi0gICAgcHJpdmF0ZSBpbnQgbUJsdWV0b290aEhlYWRzZXRTdGF0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUJsdWV0b290aEEyZHBDb25uZWN0ZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUJsdWV0b290aFBiYXBTdGF0ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUJsdWV0b290aEVuYWJsZWQ7CiAKICAgICAvLyB3aWZpCkBAIC0zNjksOSArMzY1LDcgQEAKICAgICAgICAgICAgICAgICBvbkJhdHRlcnlPa2F5KGludGVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fU1RBVEVfQ0hBTkdFRCkgfHwKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmVxdWFscyhCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoUGJhcC5QQkFQX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICBhY3Rpb24uZXF1YWxzKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKICAgICAgICAgICAgICAgICB1cGRhdGVCbHVldG9vdGgoaW50ZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikgfHwKQEAgLTQ1NCw5ICs0NDgsNiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUJsdWV0b290aEVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBtQmx1ZXRvb3RoQTJkcENvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldFN0YXRlID0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIG1CbHVldG9vdGhQYmFwU3RhdGUgPSBCbHVldG9vdGhQYmFwLlNUQVRFX0RJU0NPTk5FQ1RFRDsKICAgICAgICAgbVNlcnZpY2Uuc2V0SWNvblZpc2liaWxpdHkoImJsdWV0b290aCIsIG1CbHVldG9vdGhFbmFibGVkKTsKIAogICAgICAgICAvLyBHcHMgc3RhdHVzCkBAIC00OTAsOSArNDgxLDcgQEAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihBdWRpb01hbmFnZXIuUklOR0VSX01PREVfQ0hBTkdFRF9BQ1RJT04pOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEF1ZGlvTWFuYWdlci5WSUJSQVRFX1NFVFRJTkdfQ0hBTkdFRF9BQ1RJT04pOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoUGJhcC5QQkFQX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKQEAgLTEwNjQsMjggKzEwNTMsMTYgQEAKICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX1NUQVRFLCBCbHVldG9vdGhBZGFwdGVyLkVSUk9SKTsKICAgICAgICAgICAgIG1CbHVldG9vdGhFbmFibGVkID0gc3RhdGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTjsKLSAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldFN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aEhlYWRzZXQuRVhUUkFfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1IpOwotICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcCBhMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOwotICAgICAgICAgICAgaWYgKGEyZHAuZ2V0Q29ubmVjdGVkU2lua3MoKS5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBMmRwQ29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJsdWV0b290aEEyZHBDb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX1NUQVRFLAorICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGljb25JZCA9IFIuZHJhd2FibGUuc3RhdF9zeXNfZGF0YV9ibHVldG9vdGhfY29ubmVjdGVkOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoUGJhcC5QQkFQX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgewotICAgICAgICAgICAgbUJsdWV0b290aFBiYXBTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQYmFwLlBCQVBfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFBiYXAuU1RBVEVfRElTQ09OTkVDVEVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQmx1ZXRvb3RoSGVhZHNldFN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVEIHx8IG1CbHVldG9vdGhBMmRwQ29ubmVjdGVkIHx8Ci0gICAgICAgICAgICAgICAgbUJsdWV0b290aFBiYXBTdGF0ZSA9PSBCbHVldG9vdGhQYmFwLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgaWNvbklkID0gUi5kcmF3YWJsZS5zdGF0X3N5c19kYXRhX2JsdWV0b290aF9jb25uZWN0ZWQ7Ci0gICAgICAgIH0KLQogICAgICAgICBtU2VydmljZS5zZXRJY29uKCJibHVldG9vdGgiLCBpY29uSWQsIDApOwogICAgICAgICBtU2VydmljZS5zZXRJY29uVmlzaWJpbGl0eSgiYmx1ZXRvb3RoIiwgbUJsdWV0b290aEVuYWJsZWQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTZXJ2aWNlLmphdmEKaW5kZXggZjNkYTJhMy4uNjk1ZmRiYSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTZXJ2aWNlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTZXJ2aWNlLmphdmEKQEAgLTE3LDE4NSArMTcsNTMgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhclNlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb25MaXN0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJOb3RpZmljYXRpb247CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuU3RhdHVzQmFyUG9saWN5OwogCi0KLQotcHVibGljIGNsYXNzIFN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIGltcGxlbWVudHMgQ29tbWFuZFF1ZXVlLkNhbGxiYWNrcyB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgaW1wbGVtZW50cyBDb21tYW5kUXVldWUuQ2FsbGJhY2tzIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGF0dXNCYXJTZXJ2aWNlIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUEVXX0lDT05TID0gZmFsc2U7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BFVyA9IGZhbHNlOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVRVU0JBUl9TVEFSVAotICAgICAgICAgICAgPSAiY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LnN0YXR1c2Jhci5TVEFSVCI7CisgICAgcHJvdGVjdGVkIENvbW1hbmRRdWV1ZSBtQ29tbWFuZFF1ZXVlOworICAgIHByb3RlY3RlZCBJU3RhdHVzQmFyU2VydmljZSBtQmFyU2VydmljZTsKIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfTEVBVkVfQUxPTkUgPSAtMTAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBFWFBBTkRFRF9GVUxMX09QRU4gPSAtMTAwMDE7CisgICAgLy8gVXAtY2FsbCBtZXRob2RzCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFZpZXcgbWFrZVN0YXR1c0JhclZpZXcoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldFN0YXR1c0JhckdyYXZpdHkoKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURSA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BTklNQVRFX1JFVkVBTCA9IDEwMDE7Ci0KLSAgICBTdGF0dXNCYXJQb2xpY3kgbUljb25Qb2xpY3k7Ci0KLSAgICBDb21tYW5kUXVldWUgbUNvbW1hbmRRdWV1ZTsKLSAgICBJU3RhdHVzQmFyU2VydmljZSBtQmFyU2VydmljZTsKLQotICAgIGludCBtSWNvblNpemU7Ci0gICAgRGlzcGxheSBtRGlzcGxheTsKLSAgICBTdGF0dXNCYXJWaWV3IG1TdGF0dXNCYXJWaWV3OwotICAgIGludCBtUGl4ZWxGb3JtYXQ7Ci0gICAgSCBtSGFuZGxlciA9IG5ldyBIKCk7Ci0gICAgT2JqZWN0IG1RdWV1ZUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICAvLyBpY29ucwotICAgIExpbmVhckxheW91dCBtSWNvbnM7Ci0gICAgSWNvbk1lcmdlciBtTm90aWZpY2F0aW9uSWNvbnM7Ci0gICAgTGluZWFyTGF5b3V0IG1TdGF0dXNJY29uczsKLQotICAgIC8vIGV4cGFuZGVkIG5vdGlmaWNhdGlvbnMKLSAgICBEaWFsb2cgbUV4cGFuZGVkRGlhbG9nOwotICAgIEV4cGFuZGVkVmlldyBtRXhwYW5kZWRWaWV3OwotICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1FeHBhbmRlZFBhcmFtczsKLSAgICBTY3JvbGxWaWV3IG1TY3JvbGxWaWV3OwotICAgIFZpZXcgbU5vdGlmaWNhdGlvbkxpbmVhckxheW91dDsKLSAgICBWaWV3IG1FeHBhbmRlZENvbnRlbnRzOwotICAgIC8vIHRvcCBiYXIKLSAgICBUZXh0VmlldyBtTm9Ob3RpZmljYXRpb25zVGl0bGU7Ci0gICAgVGV4dFZpZXcgbUNsZWFyQnV0dG9uOwotICAgIC8vIGRyYWcgYmFyCi0gICAgQ2xvc2VEcmFnSGFuZGxlIG1DbG9zZVZpZXc7Ci0gICAgLy8gb25nb2luZwotICAgIE5vdGlmaWNhdGlvbkRhdGEgbU9uZ29pbmcgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOwotICAgIFRleHRWaWV3IG1PbmdvaW5nVGl0bGU7Ci0gICAgTGluZWFyTGF5b3V0IG1PbmdvaW5nSXRlbXM7Ci0gICAgLy8gbGF0ZXN0Ci0gICAgTm90aWZpY2F0aW9uRGF0YSBtTGF0ZXN0ID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKLSAgICBUZXh0VmlldyBtTGF0ZXN0VGl0bGU7Ci0gICAgTGluZWFyTGF5b3V0IG1MYXRlc3RJdGVtczsKLSAgICAvLyBwb3NpdGlvbgotICAgIGludFtdIG1Qb3NpdGlvblRtcCA9IG5ldyBpbnRbMl07Ci0gICAgYm9vbGVhbiBtRXhwYW5kZWQ7Ci0gICAgYm9vbGVhbiBtRXhwYW5kZWRWaXNpYmxlOwotCi0gICAgLy8gdGhlIGRhdGUgdmlldwotICAgIERhdGVWaWV3IG1EYXRlVmlldzsKLQotICAgIC8vIHRoZSB0cmFja2VyIHZpZXcKLSAgICBUcmFja2luZ1ZpZXcgbVRyYWNraW5nVmlldzsKLSAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtVHJhY2tpbmdQYXJhbXM7Ci0gICAgaW50IG1UcmFja2luZ1Bvc2l0aW9uOyAvLyB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgdHJhY2tpbmcgdmlldy4KLSAgICBwcml2YXRlIGJvb2xlYW4gbVBhbmVsU2xpZ2h0bHlWaXNpYmxlOwotCi0gICAgLy8gdGlja2VyCi0gICAgcHJpdmF0ZSBUaWNrZXIgbVRpY2tlcjsKLSAgICBwcml2YXRlIFZpZXcgbVRpY2tlclZpZXc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1UaWNraW5nOwotCi0gICAgLy8gVHJhY2tpbmcgZmluZ2VyIGZvciBvcGVuaW5nL2Nsb3NpbmcuCi0gICAgaW50IG1FZGdlQm9yZGVyOyAvLyBjb3JyZXNwb25kcyB0byBSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUKLSAgICBib29sZWFuIG1UcmFja2luZzsKLSAgICBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5JTV9GUkFNRV9EVVJBVElPTiA9ICgxMDAwLzYwKTsKLQotICAgIGJvb2xlYW4gbUFuaW1hdGluZzsKLSAgICBsb25nIG1DdXJBbmltYXRpb25UaW1lOwotICAgIGZsb2F0IG1EaXNwbGF5SGVpZ2h0OwotICAgIGZsb2F0IG1BbmltWTsKLSAgICBmbG9hdCBtQW5pbVZlbDsKLSAgICBmbG9hdCBtQW5pbUFjY2VsOwotICAgIGxvbmcgbUFuaW1MYXN0VGltZTsKLSAgICBib29sZWFuIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKLSAgICBpbnQgbVZpZXdEZWx0YTsKLSAgICBpbnRbXSBtQWJzUG9zID0gbmV3IGludFsyXTsKLQotICAgIC8vIGZvciBkaXNhYmxpbmcgdGhlIHN0YXR1cyBiYXIKLSAgICBpbnQgbURpc2FibGVkID0gMDsKLQotICAgIHByaXZhdGUgY2xhc3MgRXhwYW5kZWREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotICAgICAgICBFeHBhbmRlZERpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfTGlnaHRfTm9UaXRsZUJhcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgewotICAgICAgICAgICAgYm9vbGVhbiBkb3duID0gZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV047Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEtleUNvZGUoKSkgewotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0JBQ0s6Ci0gICAgICAgICAgICAgICAgaWYgKCFkb3duKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIE5vYm9keSBiaW5kcyB0byB1cy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgewogICAgICAgICAvLyBGaXJzdCBzZXQgdXAgb3VyIHZpZXdzIGFuZCBzdHVmZi4KLSAgICAgICAgbURpc3BsYXkgPSAoKFdpbmRvd01hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKSkuZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgbWFrZVN0YXR1c0JhclZpZXcodGhpcyk7CisgICAgICAgIFZpZXcgc2IgPSBtYWtlU3RhdHVzQmFyVmlldygpOwogCiAgICAgICAgIC8vIENvbm5lY3QgaW4gdG8gdGhlIHN0YXR1cyBiYXIgbWFuYWdlciBzZXJ2aWNlCiAgICAgICAgIFN0YXR1c0Jhckljb25MaXN0IGljb25MaXN0ID0gbmV3IFN0YXR1c0Jhckljb25MaXN0KCk7CkBAIC0yMDQsMTIgKzcyLDE2IEBACiAgICAgICAgIG1Db21tYW5kUXVldWUgPSBuZXcgQ29tbWFuZFF1ZXVlKHRoaXMsIGljb25MaXN0KTsKICAgICAgICAgbUJhclNlcnZpY2UgPSBJU3RhdHVzQmFyU2VydmljZS5TdHViLmFzSW50ZXJmYWNlKAogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5TVEFUVVNfQkFSX1NFUlZJQ0UpKTsKKyAgICAgICAgYm9vbGVhbltdIGxpZ2h0c09uID0gbmV3IGJvb2xlYW5bMV07CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQmFyU2VydmljZS5yZWdpc3RlclN0YXR1c0JhcihtQ29tbWFuZFF1ZXVlLCBpY29uTGlzdCwgbm90aWZpY2F0aW9uS2V5cywgbm90aWZpY2F0aW9ucyk7CisgICAgICAgICAgICBtQmFyU2VydmljZS5yZWdpc3RlclN0YXR1c0JhcihtQ29tbWFuZFF1ZXVlLCBpY29uTGlzdCwgbm90aWZpY2F0aW9uS2V5cywgbm90aWZpY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgbGlnaHRzT24pOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIElmIHRoZSBzeXN0ZW0gcHJvY2VzcyBpc24ndCB0aGVyZSB3ZSdyZSBkb29tZWQgYW55d2F5LgogICAgICAgICB9CiAKKyAgICAgICAgc2V0TGlnaHRzT24obGlnaHRzT25bMF0pOworCiAgICAgICAgIC8vIFNldCB1cCB0aGUgaW5pdGlhbCBpY29uIHN0YXRlCiAgICAgICAgIGludCBOID0gaWNvbkxpc3Quc2l6ZSgpOwogICAgICAgICBpbnQgdmlld0luZGV4ID0gMDsKQEAgLTIzMywxMjcxICsxMDUsMjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFB1dCB1cCB0aGUgdmlldwotICAgICAgICBhZGRTdGF0dXNCYXJWaWV3KCk7Ci0KLSAgICAgICAgLy8gTGFzdGx5LCBjYWxsIHRvIHRoZSBpY29uIHBvbGljeSB0byBpbnN0YWxsL3VwZGF0ZSBhbGwgdGhlIGljb25zLgotICAgICAgICBtSWNvblBvbGljeSA9IG5ldyBTdGF0dXNCYXJQb2xpY3kodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewotICAgICAgICAvLyB3ZSdyZSBuZXZlciBkZXN0cm95ZWQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb2JvZHkgYmluZHMgdG8gdXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIHZpZXcKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHByaXZhdGUgdm9pZCBtYWtlU3RhdHVzQmFyVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaWNvbl9zaXplKTsKLQotICAgICAgICBFeHBhbmRlZFZpZXcgZXhwYW5kZWQgPSAoRXhwYW5kZWRWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LAotICAgICAgICAgICAgICAgIFIubGF5b3V0LnN0YXR1c19iYXJfZXhwYW5kZWQsIG51bGwpOwotICAgICAgICBleHBhbmRlZC5tU2VydmljZSA9IHRoaXM7Ci0KLSAgICAgICAgU3RhdHVzQmFyVmlldyBzYiA9IChTdGF0dXNCYXJWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKLSAgICAgICAgc2IubVNlcnZpY2UgPSB0aGlzOwotCi0gICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggcGl4ZWwtZm9ybWF0IHRvIHVzZSBmb3IgdGhlIHN0YXR1cyBiYXIuCi0gICAgICAgIG1QaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOwotICAgICAgICBEcmF3YWJsZSBiZyA9IHNiLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7Ci0gICAgICAgIG1TdGF0dXNJY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzSWNvbnMpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMgPSAoSWNvbk1lcmdlcilzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25JY29ucyk7Ci0gICAgICAgIG1JY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOwotICAgICAgICBtVGlja2VyVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7Ci0gICAgICAgIG1EYXRlVmlldyA9IChEYXRlVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKLQotICAgICAgICBtRXhwYW5kZWREaWFsb2cgPSBuZXcgRXhwYW5kZWREaWFsb2coY29udGV4dCk7Ci0gICAgICAgIG1FeHBhbmRlZFZpZXcgPSBleHBhbmRlZDsKLSAgICAgICAgbUV4cGFuZGVkQ29udGVudHMgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotICAgICAgICBtT25nb2luZ1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdUaXRsZSk7Ci0gICAgICAgIG1PbmdvaW5nSXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdJdGVtcyk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RUaXRsZSk7Ci0gICAgICAgIG1MYXRlc3RJdGVtcyA9IChMaW5lYXJMYXlvdXQpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0SXRlbXMpOwotICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm9Ob3RpZmljYXRpb25zVGl0bGUpOwotICAgICAgICBtQ2xlYXJCdXR0b24gPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQuY2xlYXJfYWxsX2J1dHRvbik7Ci0gICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUNsZWFyQnV0dG9uTGlzdGVuZXIpOwotICAgICAgICBtU2Nyb2xsVmlldyA9IChTY3JvbGxWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLnNjcm9sbCk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotCi0gICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIG1UaWNrZXIgPSBuZXcgTXlUaWNrZXIoY29udGV4dCwgc2IpOwotCi0gICAgICAgIFRpY2tlclZpZXcgdGlja2VyVmlldyA9IChUaWNrZXJWaWV3KXNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlclRleHQpOwotICAgICAgICB0aWNrZXJWaWV3Lm1UaWNrZXIgPSBtVGlja2VyOwotCi0gICAgICAgIG1UcmFja2luZ1ZpZXcgPSAoVHJhY2tpbmdWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyX3RyYWNraW5nLCBudWxsKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5tU2VydmljZSA9IHRoaXM7Ci0gICAgICAgIG1DbG9zZVZpZXcgPSAoQ2xvc2VEcmFnSGFuZGxlKW1UcmFja2luZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQuY2xvc2UpOwotICAgICAgICBtQ2xvc2VWaWV3Lm1TZXJ2aWNlID0gdGhpczsKLQotICAgICAgICBtRWRnZUJvcmRlciA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGluaXRhbCB2aWV3IHZpc2liaWxpdHkKLSAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAvLyByZWNlaXZlIGJyb2FkY2FzdHMKLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGF0dXNCYXJWaWV3KCkgewotICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKICAgICAgICAgZmluYWwgaW50IGhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKIAotICAgICAgICBmaW5hbCBTdGF0dXNCYXJWaWV3IHZpZXcgPSBtU3RhdHVzQmFyVmlldzsKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAogICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAogICAgICAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVIsCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UT1VDSEFCTEVfV0hFTl9XQUtJTkcsCiAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuUkdCWF84ODg4KTsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLmdyYXZpdHkgPSBnZXRTdGF0dXNCYXJHcmF2aXR5KCk7CiAgICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXIiKTsKICAgICAgICAgLy8gVE9ETyBscC53aW5kb3dBbmltYXRpb25zID0gUi5zdHlsZS5BbmltYXRpb25fU3RhdHVzQmFyOworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhzYiwgbHApOwogCi0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KHZpZXcsIGxwKTsKKyAgICAgICAgU2xvZy5kKFRBRywgIkFkZGVkIHN0YXR1cyBiYXIgdmlldyB3LyBncmF2aXR5IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobHAuZ3Jhdml0eSkpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7Ci0gICAgICAgIGlmIChTUEVXX0lDT05TKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4Ci0gICAgICAgICAgICAgICAgICAgICsgIiBpY29uPSIgKyBpY29uKTsKLSAgICAgICAgfQotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOwotICAgICAgICB2aWV3LnNldChpY29uKTsKLSAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKLSAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKLSAgICAgICAgaWYgKFNQRVdfSUNPTlMpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9sZD0iICsgb2xkICsgIiBpY29uPSIgKyBpY29uKTsKLSAgICAgICAgfQotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7Ci0gICAgICAgIHZpZXcuc2V0KGljb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgewotICAgICAgICBpZiAoU1BFV19JQ09OUykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlbW92ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXR1c0ljb25zLnJlbW92ZVZpZXdBdCh2aWV3SW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBib29sZWFuIHNob3VsZFRpY2sgPSB0cnVlOwotICAgICAgICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNob3VsZFRpY2sgPSBmYWxzZTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJOb3RpZmljYXRpb24gaGFzIGZ1bGxTY3JlZW5JbnRlbnQ7IHNlbmRpbmcgZnVsbFNjcmVlbkludGVudCIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQuc2VuZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0KLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIGlmIChpY29uVmlldyA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgaWYgKHNob3VsZFRpY2spIHsKLSAgICAgICAgICAgIHRpY2sobm90aWZpY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCi0gICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGtleT0iICsga2V5ICsgIiBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7Ci0KLSAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBvbGRMaXN0OwotICAgICAgICBpbnQgb2xkSW5kZXggPSBtT25nb2luZy5maW5kRW50cnkoa2V5KTsKLSAgICAgICAgaWYgKG9sZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgIG9sZExpc3QgPSBtT25nb2luZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9sZEluZGV4ID0gbUxhdGVzdC5maW5kRW50cnkoa2V5KTsKLSAgICAgICAgICAgIGlmIChvbGRJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkTGlzdCA9IG1MYXRlc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBvbGRFbnRyeSA9IG9sZExpc3QuZ2V0RW50cnlBdChvbGRJbmRleCk7Ci0gICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247Ci0gICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKLQotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCi0gICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAotICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KLSAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQotICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKLSAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KLSAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KLSAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCi0gICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwgJiYgb2xkQ29udGVudFZpZXcgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkuZXF1YWxzKGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSkKLSAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpID09IGNvbnRlbnRWaWV3LmdldExheW91dElkKCkpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24iKTsKLSAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVhcHBseSB0aGUgUmVtb3RlVmlld3MKLSAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5yZWFwcGx5KHRoaXMsIG9sZEVudHJ5LmNvbnRlbnQpOwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29udGVudEludGVudAotICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5LmNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgotICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwotICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAibm90IHJldXNpbmcgbm90aWZpY2F0aW9uIik7Ci0gICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwotICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzdGFydCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZwotICAgICAgICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiAhVGV4dFV0aWxzLmVxdWFscyhub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQsCi0gICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCkpIHsKLSAgICAgICAgICAgIHRpY2sobm90aWZpY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgotICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb24oSUJpbmRlciBrZXkpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkpOwotICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkID0gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKLQotICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZwotICAgICAgICAgICAgbVRpY2tlci5yZW1vdmVFbnRyeShvbGQpOwotCi0gICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KLSAgICAgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNob29zZUljb25JbmRleChib29sZWFuIGlzT25nb2luZywgaW50IHZpZXdJbmRleCkgewotICAgICAgICBmaW5hbCBpbnQgbGF0ZXN0U2l6ZSA9IG1MYXRlc3Quc2l6ZSgpOwotICAgICAgICBpZiAoaXNPbmdvaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSArIChtT25nb2luZy5zaXplKCkgLSB2aWV3SW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFNpemUgLSB2aWV3SW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBWaWV3W10gbWFrZU5vdGlmaWNhdGlvblZpZXcoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247Ci0gICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gbi5jb250ZW50VmlldzsKLSAgICAgICAgaWYgKHJlbW90ZVZpZXdzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSByb3cgdmlldwotICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICBWaWV3IHJvdyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQsIHBhcmVudCwgZmFsc2UpOwotCi0gICAgICAgIC8vIGJpbmQgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250ZW50IGFyZWEKLSAgICAgICAgVmlld0dyb3VwIGNvbnRlbnQgPSAoVmlld0dyb3VwKXJvdy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKLSAgICAgICAgY29udGVudC5zZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KFZpZXdHcm91cC5GT0NVU19CTE9DS19ERVNDRU5EQU5UUyk7Ci0gICAgICAgIGNvbnRlbnQuc2V0T25Gb2N1c0NoYW5nZUxpc3RlbmVyKG1Gb2N1c0NoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbi5jb250ZW50SW50ZW50OwotICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwgbm90aWZpY2F0aW9uLnBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmlldyBleHBhbmRlZCA9IG51bGw7Ci0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhwYW5kZWQgPSByZW1vdGVWaWV3cy5hcHBseSh0aGlzLCBjb250ZW50KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb24gPSBlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleHBhbmRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWRlbnQgPSBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCk7Ci0gICAgICAgICAgICBTbG9nLmUoVEFHLCAiY291bGRuJ3QgaW5mbGF0ZSB2aWV3IGZvciBub3RpZmljYXRpb24gIiArIGlkZW50LCBleGNlcHRpb24pOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZW50LmFkZFZpZXcoZXhwYW5kZWQpOwotICAgICAgICAgICAgcm93LnNldERyYXdpbmdDYWNoZUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFZpZXdbXSB7IHJvdywgY29udGVudCwgZXhwYW5kZWQgfTsKLSAgICB9Ci0KLSAgICBTdGF0dXNCYXJJY29uVmlldyBhZGROb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBOb3RpZmljYXRpb25EYXRhIGxpc3Q7Ci0gICAgICAgIFZpZXdHcm91cCBwYXJlbnQ7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNPbmdvaW5nID0gbm90aWZpY2F0aW9uLmlzT25nb2luZygpOwotICAgICAgICBpZiAoaXNPbmdvaW5nKSB7Ci0gICAgICAgICAgICBsaXN0ID0gbU9uZ29pbmc7Ci0gICAgICAgICAgICBwYXJlbnQgPSBtT25nb2luZ0l0ZW1zOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGlzdCA9IG1MYXRlc3Q7Ci0gICAgICAgICAgICBwYXJlbnQgPSBtTGF0ZXN0SXRlbXM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBleHBhbmRlZCB2aWV3LgotICAgICAgICBmaW5hbCBWaWV3W10gdmlld3MgPSBtYWtlTm90aWZpY2F0aW9uVmlldyhub3RpZmljYXRpb24sIHBhcmVudCk7Ci0gICAgICAgIGlmICh2aWV3cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGV4cGFuZCBSZW1vdGVWaWV3cyBmb3I6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBub3RpZmljYXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgVmlldyByb3cgPSB2aWV3c1swXTsKLSAgICAgICAgZmluYWwgVmlldyBjb250ZW50ID0gdmlld3NbMV07Ci0gICAgICAgIGZpbmFsIFZpZXcgZXhwYW5kZWQgPSB2aWV3c1syXTsKLSAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpY29uLgotICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLAotICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKSk7Ci0gICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7Ci0gICAgICAgIGlmICghaWNvblZpZXcuc2V0KGljKSkgewotICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZGluZyBjcmVhdGUgaWNvbjogIiArIGljKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFkZCB0aGUgZXhwYW5kZWQgdmlldy4KLSAgICAgICAgZmluYWwgaW50IHZpZXdJbmRleCA9IGxpc3QuYWRkKGtleSwgbm90aWZpY2F0aW9uLCByb3csIGNvbnRlbnQsIGV4cGFuZGVkLCBpY29uVmlldyk7Ci0gICAgICAgIHBhcmVudC5hZGRWaWV3KHJvdywgdmlld0luZGV4KTsKLSAgICAgICAgLy8gQWRkIHRoZSBpY29uLgotICAgICAgICBmaW5hbCBpbnQgaWNvbkluZGV4ID0gY2hvb3NlSWNvbkluZGV4KGlzT25nb2luZywgdmlld0luZGV4KTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLmFkZFZpZXcoaWNvblZpZXcsIGljb25JbmRleCk7Ci0gICAgICAgIHJldHVybiBpY29uVmlldzsKLSAgICB9Ci0KLSAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXkpIHsKLSAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG1PbmdvaW5nLnJlbW92ZShrZXkpOwotICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgZW50cnkgPSBtTGF0ZXN0LnJlbW92ZShrZXkpOwotICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRlZCB2aWV3LgotICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5yb3cuZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkucm93KTsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBpY29uLgotICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5pY29uLmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5Lmljb24pOwotCi0gICAgICAgIHJldHVybiBlbnRyeS5ub3RpZmljYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpIHsKLSAgICAgICAgYm9vbGVhbiBvbmdvaW5nID0gbU9uZ29pbmcuaGFzVmlzaWJsZUl0ZW1zKCk7Ci0gICAgICAgIGJvb2xlYW4gbGF0ZXN0ID0gbUxhdGVzdC5oYXNWaXNpYmxlSXRlbXMoKTsKLQotICAgICAgICAvLyAobm8gb25nb2luZyBub3RpZmljYXRpb25zIGFyZSBjbGVhcmFibGUpCi0gICAgICAgIGlmIChtTGF0ZXN0Lmhhc0NsZWFyYWJsZUl0ZW1zKCkpIHsKLSAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkob25nb2luZyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZS5zZXRWaXNpYmlsaXR5KGxhdGVzdCA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0KLSAgICAgICAgaWYgKG9uZ29pbmcgfHwgbGF0ZXN0KSB7Ci0gICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU3RhdGUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIERJU0FCTEUgY29uc3RhbnRzIGZyb20gU3RhdHVzQmFyTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSkgewotICAgICAgICBmaW5hbCBpbnQgb2xkID0gbURpc2FibGVkOwotICAgICAgICBmaW5hbCBpbnQgZGlmZiA9IHN0YXRlIF4gb2xkOwotICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKLQotICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOwotICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgewotICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbCBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyIGFuZCBub3RpZmljYXRpb25zIGZ1bm5lbCB0aHJvdWdoIGhlcmUgYW5kIGFyZSBiYXRjaGVkLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSCBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbSkgewotICAgICAgICAgICAgc3dpdGNoIChtLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFOgotICAgICAgICAgICAgICAgICAgICBkb0FuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFX1JFVkVBTDoKLSAgICAgICAgICAgICAgICAgICAgZG9SZXZlYWxBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBtRm9jdXNDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Gb2N1c0NoYW5nZShWaWV3IHYsIGJvb2xlYW4gaGFzRm9jdXMpIHsKLSAgICAgICAgICAgIC8vIEJlY2F1c2UgJ3YnIGlzIGEgVmlld0dyb3VwLCBhbGwgaXRzIGNoaWxkcmVuIHdpbGwgYmUgKHVuKXNlbGVjdGVkCi0gICAgICAgICAgICAvLyB0b28sIHdoaWNoIGFsbG93cyBtYXJxdWVlaW5nIHRvIHdvcmsuCi0gICAgICAgICAgICB2LnNldFNlbGVjdGVkKGhhc0ZvY3VzKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFrZUV4cGFuZGVkVmlzaWJsZSgpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJNYWtlIGV4cGFuZGVkIHZpc2libGU6IGV4cGFuZGVkIHZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOwotICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSB0cnVlOwotICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh0cnVlKTsKLQotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgbUV4cGFuZGVkVmlldy5yZXF1ZXN0Rm9jdXMoVmlldy5GT0NVU19GT1JXQVJEKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgaWYgKCFtVGlja2luZykgewotICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0ZSBleHBhbmQ6IGV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOwotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FeHBhbmRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJlcGFyZVRyYWNraW5nKDAsIHRydWUpOwotICAgICAgICBwZXJmb3JtRmxpbmcoMCwgMjAwMC4wZiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgewotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgImFuaW1hdGVDb2xsYXBzZSgpOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZQotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltWT0iICsgbUFuaW1ZCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgeTsKLSAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKLSAgICAgICAgICAgIHkgPSAoaW50KW1BbmltWTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHkgPSBtRGlzcGxheS5nZXRIZWlnaHQoKS0xOwotICAgICAgICB9Ci0gICAgICAgIC8vIExldCB0aGUgZmxpbmcgdGhpbmsgdGhhdCB3ZSdyZSBvcGVuIHNvIGl0IGdvZXMgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbgotICAgICAgICAvLyBhbmQgZG9lc24ndCB0cnkgdG8gcmUtb3BlbiB0aGUgd2luZG93c2hhZGUuCi0gICAgICAgIG1FeHBhbmRlZCA9IHRydWU7Ci0gICAgICAgIHByZXBhcmVUcmFja2luZyh5LCBmYWxzZSk7Ci0gICAgICAgIHBlcmZvcm1GbGluZyh5LCAtMjAwMC4wZiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtRXhwYW5kKCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1FeHBhbmQ6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRXhwYW5kZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1FeHBhbmRlZCA9IHRydWU7Ci0gICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSBwb3N0U3RhcnRUcmFjaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtQ29sbGFwc2UoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUNvbGxhcHNlOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlCi0gICAgICAgICAgICAgICAgKyAiIG1UaWNraW5nPSIgKyBtVGlja2luZyk7Ci0KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IGZhbHNlOwotICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZChmYWxzZSk7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotICAgICAgICBtVHJhY2tpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpID09IDApIHsKLSAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobURhdGVWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cGFuZGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBkb0FuaW1hdGlvbigpIHsKLSAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24iKTsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYmVmb3JlIG1BbmltWT0iICsgbUFuaW1ZKTsKLSAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYWZ0ZXIgIG1BbmltWT0iICsgbUFuaW1ZKTsKLSAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMSkgewotICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0aW9uIGNvbXBsZXRlZCB0byBleHBhbmRlZCBzdGF0ZS4iKTsKLSAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybUV4cGFuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobUFuaW1ZIDwgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gY29sbGFwc2VkIHN0YXRlLiIpOwotICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoMCk7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURSksIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RvcFRyYWNraW5nKCkgewotICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7Ci0gICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwotICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50QW5pbSgpIHsKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmxvYXQgdCA9ICgoZmxvYXQpKG5vdyAtIG1BbmltTGFzdFRpbWUpKSAvIDEwMDA7ICAgICAgICAgICAgLy8gbXMgLT4gcwotICAgICAgICBmaW5hbCBmbG9hdCB5ID0gbUFuaW1ZOwotICAgICAgICBmaW5hbCBmbG9hdCB2ID0gbUFuaW1WZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCi0gICAgICAgIGZpbmFsIGZsb2F0IGEgPSBtQW5pbUFjY2VsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MvcwotICAgICAgICBtQW5pbVkgPSB5ICsgKHYqdCkgKyAoMC41ZiphKnQqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweAotICAgICAgICBtQW5pbVZlbCA9IHYgKyAoYSp0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCi0gICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1zCi0gICAgICAgIC8vU2xvZy5kKFRBRywgInk9IiArIHkgKyAiIHY9IiArIHYgKyAiIGE9IiArIGEgKyAiIHQ9IiArIHQgKyAiIG1BbmltWT0iICsgbUFuaW1ZCi0gICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0gICAgfQotCi0gICAgdm9pZCBkb1JldmVhbEFuaW1hdGlvbigpIHsKLSAgICAgICAgZmluYWwgaW50IGggPSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGlmIChtQW5pbWF0aW5nUmV2ZWFsICYmIG1BbmltYXRpbmcgJiYgbUFuaW1ZIDwgaCkgewotICAgICAgICAgICAgaW5jcmVtZW50QW5pbSgpOwotICAgICAgICAgICAgaWYgKG1BbmltWSA+PSBoKSB7Ci0gICAgICAgICAgICAgICAgbUFuaW1ZID0gaDsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURV9SRVZFQUwpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmVwYXJlVHJhY2tpbmcoaW50IHksIGJvb2xlYW4gb3BlbmluZykgewotICAgICAgICBtVHJhY2tpbmcgPSB0cnVlOwotICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOwotICAgICAgICBpZiAob3BlbmluZykgewotICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7Ci0gICAgICAgICAgICBtQW5pbVZlbCA9IDIwMDsKLSAgICAgICAgICAgIG1BbmltWSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IHRydWU7Ci0gICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7Ci0gICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOwotICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7Ci0gICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKLSAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaXQncyBvcGVuLCBjbG9zZSBpdD8KLSAgICAgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHBlcmZvcm1GbGluZyhpbnQgeSwgZmxvYXQgdmVsLCBib29sZWFuIGFsd2F5cykgewotICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgbUFuaW1ZID0geTsKLSAgICAgICAgbUFuaW1WZWwgPSB2ZWw7Ci0KLSAgICAgICAgLy9TbG9nLmQoVEFHLCAic3RhcnRpbmcgd2l0aCBtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKLQotICAgICAgICBpZiAobUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICBpZiAoIWFsd2F5cyAmJiAoCi0gICAgICAgICAgICAgICAgICAgIHZlbCA+IDIwMC4wZgotICAgICAgICAgICAgICAgICAgICB8fCAoeSA+IChtRGlzcGxheUhlaWdodC0yNSkgJiYgdmVsID4gLTIwMC4wZikpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkLCBidXQgdGhleSBkaWRuJ3QgbW92ZSBzdWZmaWNpZW50bHkgdG8gY2F1c2UKLSAgICAgICAgICAgICAgICAvLyB1cyB0byByZXRyYWN0LiAgQW5pbWF0ZSBiYWNrIHRvIHRoZSBleHBhbmRlZCBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkIGFuZCBhcmUgbm93IGdvaW5nIHRvIGFuaW1hdGUgYXdheS4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhbHdheXMgfHwgKAotICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQvMikgJiYgdmVsID4gLTIwMC4wZikpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYW5kIHRoZXkgbW92ZWQgZW5vdWdoIHRvIGFsbG93IHVzIHRvCi0gICAgICAgICAgICAgICAgLy8gZXhwYW5kLiAgQW5pbWF0ZSBpbiB0aGUgbm90aWZpY2F0aW9ucy4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCi0gICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgY29sbGFwc2VkIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAtMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vU2xvZy5kKFRBRywgIm1BbmltWT0iICsgbUFuaW1ZICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwKLSAgICAgICAgLy8gICAgICAgICsgIiBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKLQotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OwotICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFX1JFVkVBTCk7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7Ci0gICAgICAgIHN0b3BUcmFja2luZygpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvdWNoOiByYXdZPSIgKyBldmVudC5nZXRSYXdZKCkgKyAiIGV2ZW50PSIgKyBldmVudCArICIgbURpc2FibGVkPSIKLSAgICAgICAgICAgICAgICArIG1EaXNhYmxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBzdGF0dXNCYXJTaXplID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGZpbmFsIGludCBoaXRTaXplID0gc3RhdHVzQmFyU2l6ZSoyOwotICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7Ci0KLSAgICAgICAgICAgIGlmICghbUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IHN0YXR1c0JhclNpemUgLSB5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7Ci0gICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IG1BYnNQb3NbMV0gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpIC0geTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoIW1FeHBhbmRlZCAmJiB5IDwgaGl0U2l6ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1FeHBhbmRlZCAmJiB5ID4gKG1EaXNwbGF5LmdldEhlaWdodCgpLWhpdFNpemUpKSkgewotCi0gICAgICAgICAgICAgICAgLy8gV2UgZHJvcCBldmVudHMgYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBtYWtlIHRoZSB3aW5kb3dzaGFkZSBjb21lCi0gICAgICAgICAgICAgICAgLy8gZG93biBieSBhY2NpZGVudCBsZXNzLCBlc3BlY2lhbGx5IHdoZW4gcHVzaGluZyBvcGVuIGEgZGV2aWNlIHdpdGggYSBrZXlib2FyZAotICAgICAgICAgICAgICAgIC8vIHRoYXQgcm90YXRlcyAobGlrZSBnMSBhbmQgZHJvaWQpCi0gICAgICAgICAgICAgICAgaW50IHggPSAoaW50KWV2ZW50LmdldFJhd1goKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZWRnZUJvcmRlciA9IG1FZGdlQm9yZGVyOwotICAgICAgICAgICAgICAgIGlmICh4ID49IGVkZ2VCb3JkZXIgJiYgeCA8IG1EaXNwbGF5LmdldFdpZHRoKCkgLSBlZGdlQm9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCAhbUV4cGFuZGVkKTsvLyBvcGVuaW5nIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1UcmFja2luZykgewotICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWluWSA9IHN0YXR1c0JhclNpemUgKyBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOwotICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7Ci0gICAgICAgICAgICAgICAgaW50IHkgPSAoaW50KWV2ZW50LmdldFJhd1koKTsKLSAgICAgICAgICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiB5IDwgbWluWSkgewotICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfSBlbHNlICB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwKTsKLQotICAgICAgICAgICAgICAgIGZsb2F0IHlWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVnYXRpdmUgPSB5VmVsIDwgMDsKLQotICAgICAgICAgICAgICAgIGZsb2F0IHhWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFhWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGlmICh4VmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICB4VmVsID0gLXhWZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh4VmVsID4gMTUwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhWZWwgPSAxNTAuMGY7IC8vIGxpbWl0IGhvdyBtdWNoIHdlIGNhcmUgYWJvdXQgdGhlIHggYXhpcwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZsb2F0IHZlbCA9IChmbG9hdClNYXRoLmh5cG90KHlWZWwsIHhWZWwpOwotICAgICAgICAgICAgICAgIGlmIChuZWdhdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICB2ZWwgPSAtdmVsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBlcmZvcm1GbGluZygoaW50KWV2ZW50LmdldFJhd1koKSwgdmVsLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMYXVuY2hlciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1JbnRlbnQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qa2c7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1JZDsKLQotICAgICAgICBMYXVuY2hlcihQZW5kaW5nSW50ZW50IGludGVudCwgU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKSB7Ci0gICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OwotICAgICAgICAgICAgbVBrZyA9IHBrZzsKLSAgICAgICAgICAgIG1UYWcgPSB0YWc7Ci0gICAgICAgICAgICBtSWQgPSBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBpbnRlbnQgd2UgYXJlIHNlbmRpbmcgaXMgZm9yIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2gKLSAgICAgICAgICAgICAgICAvLyB3b24ndCBoYXZlIHBlcm1pc3Npb24gdG8gaW1tZWRpYXRlbHkgc3RhcnQgYW4gYWN0aXZpdHkgYWZ0ZXIKLSAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBzd2l0Y2hlcyB0byBob21lLiAgV2Uga25vdyBpdCBpcyBzYWZlIHRvIGRvIGF0IHRoaXMKLSAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gbWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBzd2l0Y2hlcyBhcmUgbm93IGFsbG93ZWQuCi0gICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5yZXN1bWVBcHBTd2l0Y2hlcygpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludFtdIHBvcyA9IG5ldyBpbnRbMl07Ci0gICAgICAgICAgICAgICAgdi5nZXRMb2NhdGlvbk9uU2NyZWVuKHBvcyk7Ci0gICAgICAgICAgICAgICAgSW50ZW50IG92ZXJsYXkgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgICAgICAgICAgb3ZlcmxheS5zZXRTb3VyY2VCb3VuZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdChwb3NbMF0sIHBvc1sxXSwgcG9zWzBdK3YuZ2V0V2lkdGgoKSwgcG9zWzFdK3YuZ2V0SGVpZ2h0KCkpKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtSW50ZW50LnNlbmQoU3RhdHVzQmFyU2VydmljZS50aGlzLCAwLCBvdmVybGF5KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrIHRyYWNlIGlzbid0IHZlcnkgaGVscGZ1bCBoZXJlLiAgSnVzdCBsb2cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiU2VuZGluZyBjb250ZW50SW50ZW50IGZhaWxlZDogIiArIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkNsaWNrKG1Qa2csIG1UYWcsIG1JZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzaGFkZSBpZiBpdCB3YXMgb3BlbgotICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGljayhTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgewotICAgICAgICAvLyBTaG93IHRoZSB0aWNrZXIgaWYgb25lIGlzIHJlcXVlc3RlZC4gQWxzbyBkb24ndCBkbyB0aGlzCi0gICAgICAgIC8vIHVudGlsIHN0YXR1cyBiYXIgd2luZG93IGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3cgbWFuYWdlciwKLSAgICAgICAgLy8gYmVjYXVzZS4uLiAgd2VsbCwgd2hhdCdzIHRoZSBwb2ludCBvdGhlcndpc2U/ICBBbmQgdHJ5aW5nIHRvCi0gICAgICAgIC8vIHJ1biBhIHRpY2tlciB3aXRob3V0IGJlaW5nIGF0dGFjaGVkIHdpbGwgY3Jhc2ghCi0gICAgICAgIGlmIChuLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwgJiYgbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoMCA9PSAobURpc2FibGVkICYgKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSkpIHsKLSAgICAgICAgICAgICAgICBtVGlja2VyLmFkZEVudHJ5KG4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FuY2VsIHRoaXMgbm90aWZpY2F0aW9uIGFuZCB0ZWxsIHRoZSBTdGF0dXNCYXJNYW5hZ2VyU2VydmljZSAvIE5vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlCi0gICAgICogYWJvdXQgdGhlIGZhaWx1cmUuCi0gICAgICoKLSAgICAgKiBXQVJOSU5HOiB0aGlzIHdpbGwgY2FsbCBiYWNrIGludG8gdXMuICBEb24ndCBob2xkIGFueSBsb2Nrcy4KLSAgICAgKi8KLSAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKGtleSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkVycm9yKG4ucGtnLCBuLnRhZywgbi5pZCwgbi51aWQsIG4uaW5pdGlhbFBpZCwgbWVzc2FnZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVGhlIGVuZCBpcyBuaWdoLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBNeVRpY2tlciBleHRlbmRzIFRpY2tlciB7Ci0gICAgICAgIE15VGlja2VyKENvbnRleHQgY29udGV4dCwgU3RhdHVzQmFyVmlldyBzYikgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc2IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHZvaWQgdGlja2VyU3RhcnRpbmcoKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInRpY2tlclN0YXJ0aW5nIik7Ci0gICAgICAgICAgICBtVGlja2luZyA9IHRydWU7Ci0gICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfaW4sIG51bGwpKTsKLSAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9vdXQsIG51bGwpKTsKLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9vdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHZvaWQgdGlja2VyRG9uZSgpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidGlja2VyRG9uZSIpOwotICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9pbiwgbnVsbCkpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9vdXQsIG51bGwpKTsKLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25faW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0aWNrZXJIYWx0aW5nKCkgewotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ0aWNrZXJIYWx0aW5nIik7Ci0gICAgICAgICAgICBtVGlja2luZyA9IGZhbHNlOwotICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbiwgbnVsbCkpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0LCBudWxsKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFuaW1hdGlvbiBsb2FkQW5pbShpbnQgaWQsIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBBbmltYXRpb24gYW5pbSA9IEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oU3RhdHVzQmFyU2VydmljZS50aGlzLCBpZCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbmltLnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5pbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZpZXdJbmZvKFZpZXcgdikgewotICAgICAgICByZXR1cm4gIigiICsgdi5nZXRMZWZ0KCkgKyAiLCIgKyB2LmdldFRvcCgpICsgIikoIiArIHYuZ2V0UmlnaHQoKSArICIsIiArIHYuZ2V0Qm90dG9tKCkKLSAgICAgICAgICAgICAgICArICIgIiArIHYuZ2V0V2lkdGgoKSArICJ4IiArIHYuZ2V0SGVpZ2h0KCkgKyAiKSI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaWYgKGNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCi0gICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBTdGF0dXNCYXIgZnJvbSBmcm9tIHBpZD0iCi0gICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdQaWQoKQotICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1RdWV1ZUxvY2spIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgU3RhdHVzIEJhciBzdGF0ZToiKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRpY2tpbmc9IiArIG1UaWNraW5nKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nPSIgKyBtVHJhY2tpbmcpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQW5pbWF0aW5nPSIgKyBtQW5pbWF0aW5nCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1ZPSIgKyBtQW5pbVkgKyAiLCBtQW5pbVZlbD0iICsgbUFuaW1WZWwKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUN1ckFuaW1hdGlvblRpbWU9IiArIG1DdXJBbmltYXRpb25UaW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbUxhc3RUaW1lPSIgKyBtQW5pbUxhc3RUaW1lKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURpc3BsYXlIZWlnaHQ9IiArIG1EaXNwbGF5SGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbWF0aW5nUmV2ZWFsPSIgKyBtQW5pbWF0aW5nUmV2ZWFsCi0gICAgICAgICAgICAgICAgICAgICsgIiBtVmlld0RlbHRhPSIgKyBtVmlld0RlbHRhKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURpc3BsYXlIZWlnaHQ9IiArIG1EaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkUGFyYW1zOiAiICsgbUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkVmlldzogIiArIHZpZXdJbmZvKG1FeHBhbmRlZFZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkRGlhbG9nOiAiICsgbUV4cGFuZGVkRGlhbG9nKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nUGFyYW1zOiAiICsgbVRyYWNraW5nUGFyYW1zKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nVmlldzogIiArIHZpZXdJbmZvKG1UcmFja2luZ1ZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU9uZ29pbmdUaXRsZTogIiArIHZpZXdJbmZvKG1PbmdvaW5nVGl0bGUpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU9uZ29pbmdJdGVtczogIiArIHZpZXdJbmZvKG1PbmdvaW5nSXRlbXMpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUxhdGVzdFRpdGxlOiAiICsgdmlld0luZm8obUxhdGVzdFRpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RJdGVtczogIiArIHZpZXdJbmZvKG1MYXRlc3RJdGVtcykpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTm9Ob3RpZmljYXRpb25zVGl0bGU6ICIgKyB2aWV3SW5mbyhtTm9Ob3RpZmljYXRpb25zVGl0bGUpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUNsb3NlVmlldzogIiArIHZpZXdJbmZvKG1DbG9zZVZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRpY2tlclZpZXc6ICIgKyB2aWV3SW5mbyhtVGlja2VyVmlldykpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtU2Nyb2xsVmlldzogIiArIHZpZXdJbmZvKG1TY3JvbGxWaWV3KQotICAgICAgICAgICAgICAgICAgICArICIgc2Nyb2xsICIgKyBtU2Nyb2xsVmlldy5nZXRTY3JvbGxYKCkgKyAiLCIgKyBtU2Nyb2xsVmlldy5nZXRTY3JvbGxZKCkpOwotICAgICAgICAgICAgcHcucHJpbnRsbigibU5vdGlmaWNhdGlvbkxpbmVhckxheW91dDogIiArIHZpZXdJbmZvKG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgICAgICAvLyBtdXN0IGhhcHBlbiBvbiB1aSB0aHJlYWQKLSAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibVN0YXR1c0ljb25zOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0ljb25zLmRlYnVnKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgdm9pZCBvbkJhclZpZXdBdHRhY2hlZCgpIHsKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHA7Ci0gICAgICAgIGludCBwaXhlbEZvcm1hdDsKLSAgICAgICAgRHJhd2FibGUgYmc7Ci0KLSAgICAgICAgLy8vIC0tLS0tLS0tLS0gVHJhY2tpbmcgVmlldyAtLS0tLS0tLS0tLS0tLQotICAgICAgICBwaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQlhfODg4ODsKLSAgICAgICAgYmcgPSBtVHJhY2tpbmdWaWV3LmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBpeGVsRm9ybWF0ID0gYmcuZ2V0T3BhY2l0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCi0gICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXQpOwotLy8gICAgICAgIGxwLnRva2VuID0gbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKTsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7Ci0gICAgICAgIGxwLnNldFRpdGxlKCJUcmFja2luZ1ZpZXciKTsKLSAgICAgICAgbHAueSA9IG1UcmFja2luZ1Bvc2l0aW9uOwotICAgICAgICBtVHJhY2tpbmdQYXJhbXMgPSBscDsKLQotICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtVHJhY2tpbmdWaWV3LCBscCk7Ci0gICAgfQotCi0gICAgdm9pZCBvblRyYWNraW5nVmlld0F0dGFjaGVkKCkgewotICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKLSAgICAgICAgaW50IHBpeGVsRm9ybWF0OwotICAgICAgICBEcmF3YWJsZSBiZzsKLQotICAgICAgICAvLy8gLS0tLS0tLS0tLSBFeHBhbmRlZCBWaWV3IC0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQ7Ci0KLSAgICAgICAgZmluYWwgaW50IGRpc3BoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGxwID0gbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgbHAud2lkdGggPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgbHAuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKLSAgICAgICAgbHAueCA9IDA7Ci0gICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbHAueSA9IC1kaXNwaDsgLy8gc3VmZmljaWVudGx5IGxhcmdlIG5lZ2F0aXZlCi0gICAgICAgIGxwLnR5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUw7Ci0gICAgICAgIGxwLmZsYWdzID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJVEhFUgotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOwotICAgICAgICBscC5mb3JtYXQgPSBwaXhlbEZvcm1hdDsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7Ci0gICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXJFeHBhbmRlZCIpOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhscCk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRGb3JtYXQocGl4ZWxGb3JtYXQpOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMgPSBscDsKLQotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2V0Q29udGVudFZpZXcobUV4cGFuZGVkVmlldywKLSAgICAgICAgICAgICAgICBuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlKG51bGwpOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2hvdygpOwotICAgICAgICBGcmFtZUxheW91dCBoYWNrID0gKEZyYW1lTGF5b3V0KW1FeHBhbmRlZFZpZXcuZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXREYXRlVmlld1Zpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgewotICAgICAgICBtRGF0ZVZpZXcuc2V0VXBkYXRlcyh2aXNpYmxlKTsKLSAgICAgICAgbURhdGVWaWV3LnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgbURhdGVWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgaW50IGFuaW0pIHsKLSAgICAgICAgaW50IG9sZCA9IG1Ob3RpZmljYXRpb25JY29ucy5nZXRWaXNpYmlsaXR5KCk7Ci0gICAgICAgIGludCB2ID0gdmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFOwotICAgICAgICBpZiAob2xkICE9IHYpIHsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KHYpOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKGludCBleHBhbmRlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChTUEVXKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGJlZm9yZSBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iIAotICAgICAgICAgICAgICAgICAgICArICgobVRyYWNraW5nUGFyYW1zID09IG51bGwpID8gIj8/PyIgOiBtVHJhY2tpbmdQYXJhbXMueSkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaCA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAvLyBJZiB0aGUgZXhwYW5kZWQgdmlldyBpcyBub3QgdmlzaWJsZSwgbWFrZSBzdXJlIHRoZXkncmUgc3RpbGwgb2ZmIHNjcmVlbi4KLSAgICAgICAgLy8gTWF5YmUgdGhlIHZpZXcgd2FzIHJlc2l6ZWQuCi0gICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgaWYgKG1UcmFja2luZ1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gLWRpc3BoOwotICAgICAgICAgICAgICAgIGlmIChtVHJhY2tpbmdQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdQYXJhbXMueSA9IG1UcmFja2luZ1Bvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOwotICAgICAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0cmFja2luZyB2aWV3Li4uCi0gICAgICAgIGludCBwb3M7Ci0gICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0ZVTExfT1BFTikgewotICAgICAgICAgICAgcG9zID0gaDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0xFQVZFX0FMT05FKSB7Ci0gICAgICAgICAgICBwb3MgPSBtVHJhY2tpbmdQb3NpdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uIDw9IGRpc3BoKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gZXhwYW5kZWRQb3NpdGlvbjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gZGlzcGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MgLT0gZGlzcGgtaDsKLSAgICAgICAgfQotICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IG1UcmFja2luZ1BhcmFtcy55ID0gcG9zOwotICAgICAgICBtVHJhY2tpbmdQYXJhbXMuaGVpZ2h0ID0gZGlzcGgtaDsKLSAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobVRyYWNraW5nVmlldywgbVRyYWNraW5nUGFyYW1zKTsKLQotICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DbG9zZVZpZXcuZ2V0TG9jYXRpb25JbldpbmRvdyhtUG9zaXRpb25UbXApOwotICAgICAgICAgICAgZmluYWwgaW50IGNsb3NlUG9zID0gbVBvc2l0aW9uVG1wWzFdOwotCi0gICAgICAgICAgICBtRXhwYW5kZWRDb250ZW50cy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29udGVudHNCb3R0b20gPSBtUG9zaXRpb25UbXBbMV0gKyBtRXhwYW5kZWRDb250ZW50cy5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBwb3MgKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgIC0gKG1UcmFja2luZ1BhcmFtcy5oZWlnaHQtY2xvc2VQb3MpIC0gY29udGVudHNCb3R0b207Ci0gICAgICAgICAgICBpbnQgbWF4ID0gaDsKLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMueSA+IG1heCkgewotICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gbWF4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IG1pbiA9IG1UcmFja2luZ1Bvc2l0aW9uOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55IDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtaW47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IChtVHJhY2tpbmdQb3NpdGlvbiArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpID4gaDsKLSAgICAgICAgICAgIGlmICghdmlzaWJsZSkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjb250ZW50cyBhcmVuJ3QgdmlzaWJsZSwgbW92ZSB0aGUgZXhwYW5kZWQgdmlldyB3YXkgb2ZmIHNjcmVlbgotICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHdpbmRvdyBpdHNlbGYgZXh0ZW5kcyBiZWxvdyB0aGUgY29udGVudCB2aWV3LgotICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLQotICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGlzIGlzbid0IGp1c3QgYSByZXBvc2l0aW9uaW5nIHRoYXQncyBub3Qgc3VwcG9zZWQgdG8gYWZmZWN0Ci0gICAgICAgICAgICAvLyB0aGUgdXNlcidzIHBlcmNlcHRpb24gb2Ygd2hhdCdzIHNob3dpbmcsIGNhbGwgdG8gc2F5IHRoYXQgdGhlIHZpc2liaWxpdHkKLSAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkLiAoT3RoZXJ3aXNlLCBzb21lb25lIGVsc2Ugd2lsbCBjYWxsIHRvIGRvIHRoYXQpLgotICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gIT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyB2aXNpYmlsaXR5Q2hhbmdlZCgiICsgdmlzaWJsZSArICIpIik7Ci0gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodmlzaWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyBhZnRlciAgZXhwYW5kZWRQb3NpdGlvbj0iICsgZXhwYW5kZWRQb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUGFyYW1zLnk9IiArIG1UcmFja2luZ1BhcmFtcy55Ci0gICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQb3NpdGlvbj0iICsgbVRyYWNraW5nUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFBhcmFtcy55PSIgKyBtRXhwYW5kZWRQYXJhbXMueQotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLmhlaWdodD0iICsgbUV4cGFuZGVkUGFyYW1zLmhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgZ2V0RXhwYW5kZWRIZWlnaHQoKSB7Ci0gICAgICAgIHJldHVybiBtRGlzcGxheS5nZXRIZWlnaHQoKSAtIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpIC0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUV4cGFuZGVkSGVpZ2h0KCkgewotICAgICAgICBpZiAobUV4cGFuZGVkVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgTEVEcyBhcmUgdHVybmVkIG8pZmYgd2hlbiB0aGUgbm90aWZpY2F0aW9uIHBhbmVsIGlzIHNob3duLCBldmVuIGp1c3QgYSBsaXR0bGUgYml0LgotICAgICAqIFRoaXMgd2FzIGFkZGVkIGxhc3QtbWludXRlIGFuZCBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IHRoZSByZXN0IG9mIHRoZSBub3RpZmljYXRpb25zCi0gICAgICogYXJlIGhhbmRsZWQsIGJlY2F1c2UgdGhlIG5vdGlmaWNhdGlvbiBpc24ndCByZWFsbHkgY2FuY2VsbGVkLiAgVGhlIGxpZ2h0cyBhcmUganVzdAotICAgICAqIHR1cm5lZCBvZmYuICBJZiBhbnkgb3RoZXIgbm90aWZpY2F0aW9ucyBoYXBwZW4sIHRoZSBsaWdodHMgd2lsbCB0dXJuIGJhY2sgb24uICBTdGV2ZSBzYXlzCi0gICAgICogdGhpcyBpcyB3aGF0IGhlIHdhbnRzLiAoc2VlIGJ1ZyAxMTMxNDYxKQotICAgICAqLwotICAgIHZvaWQgdmlzaWJpbGl0eUNoYW5nZWQoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIGlmIChtUGFuZWxTbGlnaHRseVZpc2libGUgIT0gdmlzaWJsZSkgewotICAgICAgICAgICAgbVBhbmVsU2xpZ2h0bHlWaXNpYmxlID0gdmlzaWJsZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25QYW5lbFJldmVhbGVkKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBXb24ndCBmYWlsIHVubGVzcyB0aGUgd29ybGQgaGFzIGVuZGVkLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtRGlzYWJsZUFjdGlvbnMoaW50IG5ldCkgewotICAgICAgICBpbnQgb2xkID0gbURpc2FibGVkOwotICAgICAgICBpbnQgZGlmZiA9IG5ldCBeIG9sZDsKLSAgICAgICAgbURpc2FibGVkID0gbmV0OwotCi0gICAgICAgIC8vIGFjdCBhY2NvcmRpbmdseQotICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOwotICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUjogIgotICAgICAgICAgICAgICAgICsgKCgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApCi0gICAgICAgICAgICAgICAgICAgID8gInllcyIgOiAibm8iKSk7Ci0gICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1DbGVhckJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUy5lcXVhbHMoYWN0aW9uKQotICAgICAgICAgICAgICAgICAgICB8fCBJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKEludGVudC5BQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VELmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogUmVsb2FkIHNvbWUgb2Ygb3VyIHJlc291cmNlcyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBXZSBkb24ndCByZWxvYWQgZXZlcnl0aGluZyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgLS0gd2UgcHJvYmFibHkKLSAgICAgKiBzaG91bGQsIGJ1dCBnZXR0aW5nIHRoYXQgc21vb3RoIGlzIHRvdWdoLiAgU29tZWRheSB3ZSdsbCBmaXggdGhhdC4gIEluIHRoZQotICAgICAqIG1lYW50aW1lLCBqdXN0IHVwZGF0ZSB0aGUgdGhpbmdzIHRoYXQgd2Uga25vdyBjaGFuZ2UuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVSZXNvdXJjZXMoKSB7Ci0gICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKLQotICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbikpOwotICAgICAgICBtT25nb2luZ1RpdGxlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX29uZ29pbmdfZXZlbnRzX3RpdGxlKSk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRzX3RpdGxlKSk7Ci0gICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9ub19ub3RpZmljYXRpb25zX3RpdGxlKSk7Ci0KLSAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSBTbG9nLnYoVEFHLCAidXBkYXRlUmVzb3VyY2VzIik7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyB0cmFjaW5nCi0gICAgLy8KLQotICAgIHZvaWQgcG9zdFN0YXJ0VHJhY2luZygpIHsKLSAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVN0YXJ0VHJhY2luZywgMzAwMCk7Ci0gICAgfQotCi0gICAgdm9pZCB2aWJyYXRlKCkgewotICAgICAgICBhbmRyb2lkLm9zLlZpYnJhdG9yIHZpYiA9IChhbmRyb2lkLm9zLlZpYnJhdG9yKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5WSUJSQVRPUl9TRVJWSUNFKTsKLSAgICAgICAgdmliLnZpYnJhdGUoMjUwKTsKLSAgICB9Ci0KLSAgICBSdW5uYWJsZSBtU3RhcnRUcmFjaW5nID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB2aWJyYXRlKCk7Ci0gICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgyNTApOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0YXJ0VHJhY2luZyIpOwotICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdGFydE1ldGhvZFRyYWNpbmcoIi9kYXRhL3N0YXR1c2Jhci10cmFjZXMvdHJhY2UiKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2luZywgMTAwMDApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIFJ1bm5hYmxlIG1TdG9wVHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdG9wTWV0aG9kVHJhY2luZygpOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0b3BUcmFjaW5nIik7Ci0gICAgICAgICAgICB2aWJyYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwogfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhCmluZGV4IDExN2IxMjYuLjIwZmM0MWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwpAQCAtMzQsNyArMzUsNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIGludCBESU1fQU5JTV9USU1FID0gNDAwOwogICAgIAotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogICAgIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIGludCBtU3RhcnRYLCBtU3RhcnRZOwogICAgIFZpZXdHcm91cCBtTm90aWZpY2F0aW9uSWNvbnM7CkBAIC00Miw2ICs0MywxMyBAQAogICAgIFZpZXcgbURhdGU7CiAgICAgRml4ZWRTaXplRHJhd2FibGUgbUJhY2tncm91bmQ7CiAgICAgCisgICAgYm9vbGVhbiBtTmlnaHRNb2RlID0gZmFsc2U7CisgICAgaW50IG1TdGFydEFscGhhID0gMCwgbUVuZEFscGhhID0gMDsKKyAgICBsb25nIG1FbmRUaW1lID0gMDsKKworICAgIFJlY3QgbUJ1dHRvbkJvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgYm9vbGVhbiBtQ2FwdHVyaW5nRXZlbnRzID0gdHJ1ZTsKKwogICAgIHB1YmxpYyBTdGF0dXNCYXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKICAgICB9CkBAIC02NSw5ICs3MywzMiBAQAogICAgIH0KICAgICAKICAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKKyAgICAgICAgYm9vbGVhbiBuaWdodE1vZGUgPSAobmV3Q29uZmlnLnVpTW9kZSAmIENvbmZpZ3VyYXRpb24uVUlfTU9ERV9OSUdIVF9NQVNLKQorICAgICAgICAgICAgICAgID09IENvbmZpZ3VyYXRpb24uVUlfTU9ERV9OSUdIVF9ZRVM7CisgICAgICAgIGlmIChtTmlnaHRNb2RlICE9IG5pZ2h0TW9kZSkgeworICAgICAgICAgICAgbU5pZ2h0TW9kZSA9IG5pZ2h0TW9kZTsKKyAgICAgICAgICAgIG1TdGFydEFscGhhID0gZ2V0Q3VyQWxwaGEoKTsKKyAgICAgICAgICAgIG1FbmRBbHBoYSA9IG1OaWdodE1vZGUgPyAweDgwIDogMHgwMDsKKyAgICAgICAgICAgIG1FbmRUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyBESU1fQU5JTV9USU1FOworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGdldEN1ckFscGhhKCkgeworICAgICAgICBsb25nIHRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYgKHRpbWUgPiBtRW5kVGltZSkgeworICAgICAgICAgICAgcmV0dXJuIG1FbmRBbHBoYTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUVuZEFscGhhCisgICAgICAgICAgICAgICAgLSAoaW50KSgoKG1FbmRBbHBoYS1tU3RhcnRBbHBoYSkgKiAobUVuZFRpbWUtdGltZSkgLyBESU1fQU5JTV9USU1FKSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb2xkdywgaW50IG9sZGgpIHsKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKLSAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLkVYUEFOREVEX0xFQVZFX0FMT05FKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwMCw2ICsxMzEsMTggQEAKICAgICAgICAgbUJhY2tncm91bmQuc2V0Rml4ZWRCb3VuZHMoLW1EYXRlLmdldExlZnQoKSwgLW1EYXRlLmdldFRvcCgpLCAoci1sKSwgKGItdCkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgIHN1cGVyLmRpc3BhdGNoRHJhdyhjYW52YXMpOworICAgICAgICBpbnQgYWxwaGEgPSBnZXRDdXJBbHBoYSgpOworICAgICAgICBpZiAoYWxwaGEgIT0gMCkgeworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKGFscGhhLCAwLCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWxwaGEgIT0gbUVuZEFscGhhKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHYgaW4gdGhpcyB2aWV3LiAgVGhyb3dzIGlmIHYgaXMgbm90CiAgICAgICogYSBjaGlsZCBvZiB0aGlzLgpAQCAtMTM4LDYgKzE4MSw5IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmICghbUNhcHR1cmluZ0V2ZW50cykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSAhPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgbVNlcnZpY2UuaW50ZXJjZXB0VG91Y2hFdmVudChldmVudCk7CiAgICAgICAgIH0KQEAgLTE0Niw2ICsxOTIsMTMgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uSW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIGlmIChtQnV0dG9uQm91bmRzLmNvbnRhaW5zKChpbnQpZXZlbnQuZ2V0WCgpLCAoaW50KWV2ZW50LmdldFkoKSkpIHsKKyAgICAgICAgICAgICAgICBtQ2FwdHVyaW5nRXZlbnRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYXB0dXJpbmdFdmVudHMgPSB0cnVlOwogICAgICAgICByZXR1cm4gbVNlcnZpY2UuaW50ZXJjZXB0VG91Y2hFdmVudChldmVudCkKICAgICAgICAgICAgICAgICA/IHRydWUgOiBzdXBlci5vbkludGVyY2VwdFRvdWNoRXZlbnQoZXZlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhCmluZGV4IDNhNjk3YTYuLmU3YjA1MDkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXIuamF2YQpAQCAtMTQxLDcgKzE0MSw3IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgVGlja2VyKENvbnRleHQgY29udGV4dCwgU3RhdHVzQmFyVmlldyBzYikgeworICAgIHB1YmxpYyBUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBWaWV3IHNiKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVRpY2tlclZpZXcgPSBzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpOwogCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICB9CiAKIAotICAgIHZvaWQgYWRkRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgewogICAgICAgICBpbnQgaW5pdGlhbENvdW50ID0gbVNlZ21lbnRzLnNpemUoKTsKIAogICAgICAgICAvLyBJZiB3aGF0J3MgYmVpbmcgZGlzcGxheWVkIGhhcyB0aGUgc2FtZSB0ZXh0IGFuZCBpY29uLCBqdXN0IGRyb3AgaXQKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCByZW1vdmVFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CiAgICAgICAgIGZvciAoaW50IGk9bVNlZ21lbnRzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICAgIFNlZ21lbnQgc2VnID0gbVNlZ21lbnRzLmdldChpKTsKICAgICAgICAgICAgIGlmIChuLmlkID09IHNlZy5ub3RpZmljYXRpb24uaWQgJiYgbi5wa2cuZXF1YWxzKHNlZy5ub3RpZmljYXRpb24ucGtnKSkgewpAQCAtMjIxLDEzICsyMjEsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgaGFsdCgpIHsKKyAgICBwdWJsaWMgdm9pZCBoYWx0KCkgewogICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUFkdmFuY2VUaWNrZXIpOwogICAgICAgICBtU2VnbWVudHMuY2xlYXIoKTsKICAgICAgICAgdGlja2VySGFsdGluZygpOwogICAgIH0KIAotICAgIHZvaWQgcmVmbG93VGV4dCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZWZsb3dUZXh0KCkgewogICAgICAgICBpZiAobVNlZ21lbnRzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIFNlZ21lbnQgc2VnID0gbVNlZ21lbnRzLmdldCgwKTsKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gc2VnLmdldFRleHQoKTsKQEAgLTI2Niw4ICsyNjYsOCBAQAogICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtQWR2YW5jZVRpY2tlciwgVElDS0VSX1NFR01FTlRfREVMQVkpOwogICAgIH0KIAotICAgIGFic3RyYWN0IHZvaWQgdGlja2VyU3RhcnRpbmcoKTsKLSAgICBhYnN0cmFjdCB2b2lkIHRpY2tlckRvbmUoKTsKLSAgICBhYnN0cmFjdCB2b2lkIHRpY2tlckhhbHRpbmcoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0aWNrZXJTdGFydGluZygpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRpY2tlckRvbmUoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0aWNrZXJIYWx0aW5nKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEKaW5kZXggOTc0OWFlNC4uODE0MDgxMSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEKQEAgLTM0LDUgKzM0LDkgQEAKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKICAgICAgICAgbVRpY2tlci5yZWZsb3dUZXh0KCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGlja2VyKFRpY2tlciB0KSB7CisgICAgICAgIG1UaWNrZXIgPSB0OworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEKaW5kZXggOTEwOGVlZS4uYzU5ZWI2YSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RyYWNraW5nVmlldy5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiAKIHB1YmxpYyBjbGFzcyBUcmFja2luZ1ZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgewogICAgIGZpbmFsIERpc3BsYXkgbURpc3BsYXk7Ci0gICAgU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKKyAgICBQaG9uZVN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CiAgICAgYm9vbGVhbiBtVHJhY2tpbmc7CiAgICAgaW50IG1TdGFydFgsIG1TdGFydFk7CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L0lucHV0TWV0aG9kQnV0dG9uLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9JbnB1dE1ldGhvZEJ1dHRvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjgyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9JbnB1dE1ldGhvZEJ1dHRvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLklucHV0TWV0aG9kTWFuYWdlclNlcnZpY2U7CisKK3B1YmxpYyBjbGFzcyBJbnB1dE1ldGhvZEJ1dHRvbiBleHRlbmRzIEltYWdlVmlldyB7CisKKyAgICAvLyBvdGhlciBzZXJ2aWNlcyB3ZSB3aXNoIHRvIHRhbGsgdG8KKyAgICBJbnB1dE1ldGhvZE1hbmFnZXIgbUltbTsKKworICAgIHB1YmxpYyBJbnB1dE1ldGhvZEJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgLy8gSU1FIGhvb2t1cAorICAgICAgICBtSW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7CisgICAgICAgIAorICAgICAgICAvLyBUT0RPOiByZWFkIHRoZSBjdXJyZW50IGljb24gJiB2aXNpYmlsaXR5IHN0YXRlIGRpcmVjdGx5IGZyb20gdGhlIHNlcnZpY2UKKworICAgICAgICAvLyBUT0RPOiByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyBhYm91dCBjaGFuZ2VzIHRvIHZpc2liaWxpdHkgJiBzdWJ0eXBlIGZyb20gc2VydmljZQorCisgICAgICAgIHNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgbUltbS5zaG93SW5wdXRNZXRob2RTdWJ0eXBlUGlja2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvTm90aWZpY2F0aW9uSWNvbkFyZWEuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L05vdGlmaWNhdGlvbkljb25BcmVhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZDc0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25JY29uQXJlYS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworCitwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uSWNvbkFyZWEgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTm90aWZpY2F0aW9uSWNvbkFyZWEiOworCisgICAgSWNvbkxheW91dCBtSWNvbkxheW91dDsKKyAgICBEcmFnZ2VyVmlldyBtRHJhZ2dlclZpZXc7CisKKyAgICBwdWJsaWMgTm90aWZpY2F0aW9uSWNvbkFyZWEoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIG1JY29uTGF5b3V0ID0gKEljb25MYXlvdXQpZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOworICAgICAgICBtRHJhZ2dlclZpZXcgPSAoRHJhZ2dlclZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmhhbmRsZSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEljb25MYXlvdXQgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworICAgICAgICBwdWJsaWMgSWNvbkxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIERyYWdnZXJWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHB1YmxpYyBEcmFnZ2VyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25QYW5lbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvTm90aWZpY2F0aW9uUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWUwYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvTm90aWZpY2F0aW9uUGFuZWwuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CisKK3B1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25QYW5lbCBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIFN0YXR1c0JhclBhbmVsIHsKKworICAgIHB1YmxpYyBOb3RpZmljYXRpb25QYW5lbChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTm90aWZpY2F0aW9uUGFuZWwoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5Db250ZW50QXJlYShpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgZmluYWwgaW50IGwgPSBnZXRQYWRkaW5nTGVmdCgpOworICAgICAgICBmaW5hbCBpbnQgciA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IHQgPSBnZXRQYWRkaW5nVG9wKCk7CisgICAgICAgIGZpbmFsIGludCBiID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIHJldHVybiB4ID49IGwgJiYgeCA8IHIgJiYgeSA+PSB0ICYmIHkgPCBiOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvU3RhdHVzQmFyUGFuZWwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1N0YXR1c0JhclBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhMDFkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1N0YXR1c0JhclBhbmVsLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworcHVibGljIGludGVyZmFjZSBTdGF0dXNCYXJQYW5lbCB7CisgICAgcHVibGljIGJvb2xlYW4gaXNJbkNvbnRlbnRBcmVhKGludCB4LCBpbnQgeSk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9TeXN0ZW1QYW5lbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvU3lzdGVtUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGY1YmU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvU3lzdGVtUGFuZWwuamF2YQpAQCAtMCwwICsxLDcxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm87CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSVBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2lnbmFsU3RyZW5ndGg7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRTd2l0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueUludGVudHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuRXJpSW5mbzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5UdHlJbnRlbnQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuKjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitwdWJsaWMgY2xhc3MgU3lzdGVtUGFuZWwgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgaW1wbGVtZW50cyBTdGF0dXNCYXJQYW5lbCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1QYW5lbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFRhYmxldFN0YXR1c0JhclNlcnZpY2UuREVCVUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TSUdOQUwgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5JTVVNX0JBQ0tMSUdIVCA9IGFuZHJvaWQub3MuUG93ZXIuQlJJR0hUTkVTU19ESU0gKyA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0JBQ0tMSUdIVCA9IGFuZHJvaWQub3MuUG93ZXIuQlJJR0hUTkVTU19PTjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CQUNLTElHSFQgPSAoaW50KSAoYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX09OICogMC40Zik7CisKKyAgICBwcml2YXRlIFRhYmxldFN0YXR1c0JhclNlcnZpY2UgbUJhcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUFpcnBsYW5lTW9kZTsKKworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUJyaWdodG5lc3NCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU291bmRCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtT3JpZW50YXRpb25CdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQWlycGxhbmVCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtR3BzQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUJsdWV0b290aEJ1dHRvbjsKKworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1CYXR0ZXJ5TWV0ZXI7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVNpZ25hbE1ldGVyOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQmF0dGVyeVRleHQ7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU2lnbmFsVGV4dDsKKworICAgIHByaXZhdGUgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBXaWZpTWFuYWdlciBtV2lmaU1hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBUZWxlcGhvbnlNYW5hZ2VyIG1QaG9uZTsKKyAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aEFkYXB0ZXIgbUJsdWV0b290aEFkYXB0ZXI7CisKKyAgICAvLyBzdGF0ZSB0cmFja2VycyBmb3IgdGVsZXBob255IGNvZGUKKyAgICBJY2NDYXJkLlN0YXRlIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuUkVBRFk7CisgICAgaW50IG1QaG9uZVN0YXRlID0gVGVsZXBob255TWFuYWdlci5DQUxMX1NUQVRFX0lETEU7CisgICAgaW50IG1EYXRhU3RhdGUgPSBUZWxlcGhvbnlNYW5hZ2VyLkRBVEFfRElTQ09OTkVDVEVEOworICAgIFNlcnZpY2VTdGF0ZSBtU2VydmljZVN0YXRlOworICAgIFNpZ25hbFN0cmVuZ3RoIG1TaWduYWxTdHJlbmd0aDsKKworICAgIC8vIHN0YXRlIGZvciB0aGUgbWV0ZXJzCisgICAgYm9vbGVhbiBtV2lmaUVuYWJsZWQsIG1XaWZpQ29ubmVjdGVkOworICAgIGludCBtV2lmaUxldmVsOworICAgIFN0cmluZyBtV2lmaVNzaWQ7CisKKyAgICBib29sZWFuIG1EYXRhRW5hYmxlZCwgbURhdGFDb25uZWN0ZWQsIG1EYXRhUm9hbWluZzsKKyAgICBpbnQgbURhdGFMZXZlbDsKKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5Db250ZW50QXJlYShpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgZmluYWwgaW50IGwgPSBnZXRQYWRkaW5nTGVmdCgpOworICAgICAgICBmaW5hbCBpbnQgciA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IHQgPSBnZXRQYWRkaW5nVG9wKCk7CisgICAgICAgIGZpbmFsIGludCBiID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIHJldHVybiB4ID49IGwgJiYgeCA8IHIgJiYgeSA+PSB0ICYmIHkgPCBiOworICAgIH0KKworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICByZWZyZXNoU291bmQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVCYXR0ZXJ5KGludGVudCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTikKKyAgICAgICAgICAgICAgICAgICAgfHwgYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKQorICAgICAgICAgICAgICAgICAgICB8fCBhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pCisgICAgICAgICAgICAgICAgICAgIHx8IGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVXaWZpU3RhdGUoaW50ZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9TSU1fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVTaW1TdGF0ZShpbnRlbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgcmVmcmVzaEJsdWV0b290aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgdm9pZCB1cGRhdGVTaW1TdGF0ZShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIFN0cmluZyBzdGF0ZUV4dHJhID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEljY0NhcmQuSU5URU5UX0tFWV9JQ0NfU1RBVEUpOworICAgICAgICBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX0FCU0VOVC5lcXVhbHMoc3RhdGVFeHRyYSkpIHsKKyAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuQUJTRU5UOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0lDQ19SRUFEWS5lcXVhbHMoc3RhdGVFeHRyYSkpIHsKKyAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuUkVBRFk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX0xPQ0tFRC5lcXVhbHMoc3RhdGVFeHRyYSkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NrZWRSZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoSWNjQ2FyZC5JTlRFTlRfS0VZX0xPQ0tFRF9SRUFTT04pOworICAgICAgICAgICAgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0xPQ0tFRF9PTl9QSU4uZXF1YWxzKGxvY2tlZFJlYXNvbikpIHsKKyAgICAgICAgICAgICAgICBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlBJTl9SRVFVSVJFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0xPQ0tFRF9PTl9QVUsuZXF1YWxzKGxvY2tlZFJlYXNvbikpIHsKKyAgICAgICAgICAgICAgICBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlBVS19SRVFVSVJFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuTkVUV09SS19MT0NLRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlVOS05PV047CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlRGF0YVN0YXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2RtYSgpIHsKKyAgICAgICAgcmV0dXJuIChtU2lnbmFsU3RyZW5ndGggIT0gbnVsbCkgJiYgIW1TaWduYWxTdHJlbmd0aC5pc0dzbSgpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0V2ZG8oKSB7CisgICAgICAgIHJldHVybiAoIChtU2VydmljZVN0YXRlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICYmICgobVNlcnZpY2VTdGF0ZS5nZXRSYWRpb1RlY2hub2xvZ3koKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET18wKQorICAgICAgICAgICAgICAgICAgICAgfHwgKG1TZXJ2aWNlU3RhdGUuZ2V0UmFkaW9UZWNobm9sb2d5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE9fQSkKKyAgICAgICAgICAgICAgICAgICAgIHx8IChtU2VydmljZVN0YXRlLmdldFJhZGlvVGVjaG5vbG9neSgpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPX0IpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NlcnZpY2UoKSB7CisgICAgICAgIGlmIChtU2VydmljZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobVNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuU1RBVEVfT1VUX09GX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuU1RBVEVfUE9XRVJfT0ZGOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRDZG1hTGV2ZWwoKSB7CisgICAgICAgIGlmIChtU2lnbmFsU3RyZW5ndGggPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICAgIGZpbmFsIGludCBjZG1hRGJtID0gbVNpZ25hbFN0cmVuZ3RoLmdldENkbWFEYm0oKTsKKyAgICAgICAgZmluYWwgaW50IGNkbWFFY2lvID0gbVNpZ25hbFN0cmVuZ3RoLmdldENkbWFFY2lvKCk7CisgICAgICAgIGludCBsZXZlbERibSA9IDA7CisgICAgICAgIGludCBsZXZlbEVjaW8gPSAwOworCisgICAgICAgIGlmIChjZG1hRGJtID49IC03NSkgbGV2ZWxEYm0gPSA0OworICAgICAgICBlbHNlIGlmIChjZG1hRGJtID49IC04NSkgbGV2ZWxEYm0gPSAzOworICAgICAgICBlbHNlIGlmIChjZG1hRGJtID49IC05NSkgbGV2ZWxEYm0gPSAyOworICAgICAgICBlbHNlIGlmIChjZG1hRGJtID49IC0xMDApIGxldmVsRGJtID0gMTsKKyAgICAgICAgZWxzZSBsZXZlbERibSA9IDA7CisKKyAgICAgICAgLy8gRWMvSW8gYXJlIGluIGRCKjEwCisgICAgICAgIGlmIChjZG1hRWNpbyA+PSAtOTApIGxldmVsRWNpbyA9IDQ7CisgICAgICAgIGVsc2UgaWYgKGNkbWFFY2lvID49IC0xMTApIGxldmVsRWNpbyA9IDM7CisgICAgICAgIGVsc2UgaWYgKGNkbWFFY2lvID49IC0xMzApIGxldmVsRWNpbyA9IDI7CisgICAgICAgIGVsc2UgaWYgKGNkbWFFY2lvID49IC0xNTApIGxldmVsRWNpbyA9IDE7CisgICAgICAgIGVsc2UgbGV2ZWxFY2lvID0gMDsKKworICAgICAgICByZXR1cm4gKGxldmVsRGJtIDwgbGV2ZWxFY2lvKSA/IGxldmVsRGJtIDogbGV2ZWxFY2lvOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEV2ZG9MZXZlbCgpIHsKKyAgICAgICAgaWYgKG1TaWduYWxTdHJlbmd0aCA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgaW50IGV2ZG9EYm0gPSBtU2lnbmFsU3RyZW5ndGguZ2V0RXZkb0RibSgpOworICAgICAgICBpbnQgZXZkb1NuciA9IG1TaWduYWxTdHJlbmd0aC5nZXRFdmRvU25yKCk7CisgICAgICAgIGludCBsZXZlbEV2ZG9EYm0gPSAwOworICAgICAgICBpbnQgbGV2ZWxFdmRvU25yID0gMDsKKworICAgICAgICBpZiAoZXZkb0RibSA+PSAtNjUpIGxldmVsRXZkb0RibSA9IDQ7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9EYm0gPj0gLTc1KSBsZXZlbEV2ZG9EYm0gPSAzOworICAgICAgICBlbHNlIGlmIChldmRvRGJtID49IC05MCkgbGV2ZWxFdmRvRGJtID0gMjsKKyAgICAgICAgZWxzZSBpZiAoZXZkb0RibSA+PSAtMTA1KSBsZXZlbEV2ZG9EYm0gPSAxOworICAgICAgICBlbHNlIGxldmVsRXZkb0RibSA9IDA7CisKKyAgICAgICAgaWYgKGV2ZG9TbnIgPj0gNykgbGV2ZWxFdmRvU25yID0gNDsKKyAgICAgICAgZWxzZSBpZiAoZXZkb1NuciA+PSA1KSBsZXZlbEV2ZG9TbnIgPSAzOworICAgICAgICBlbHNlIGlmIChldmRvU25yID49IDMpIGxldmVsRXZkb1NuciA9IDI7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9TbnIgPj0gMSkgbGV2ZWxFdmRvU25yID0gMTsKKyAgICAgICAgZWxzZSBsZXZlbEV2ZG9TbnIgPSAwOworCisgICAgICAgIHJldHVybiAobGV2ZWxFdmRvRGJtIDwgbGV2ZWxFdmRvU25yKSA/IGxldmVsRXZkb0RibSA6IGxldmVsRXZkb1NucjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGF0YVN0YXRlKCkgeworICAgICAgICBtRGF0YUNvbm5lY3RlZCA9IGhhc1NlcnZpY2UoKSAmJiAobURhdGFTdGF0ZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLkRBVEFfQ09OTkVDVEVEKTsKKworICAgICAgICBpZiAoaXNDZG1hKCkpIHsKKyAgICAgICAgICAgIC8vIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gYSB2YWx1ZSBmcm9tIDAgdG8gNCwgaW5jbHVzaXZlCisgICAgICAgICAgICBpZiAoKG1QaG9uZVN0YXRlID09IFRlbGVwaG9ueU1hbmFnZXIuQ0FMTF9TVEFURV9JRExFKSAmJiBpc0V2ZG8oKSl7CisgICAgICAgICAgICAgICAgbURhdGFMZXZlbCA9IGdldEV2ZG9MZXZlbCgpICogMjU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EYXRhTGV2ZWwgPSBnZXRDZG1hTGV2ZWwoKSAqIDI1OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR1NNCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBhc3UgPSAobVNpZ25hbFN0cmVuZ3RoID09IG51bGwpID8gMCA6IG1TaWduYWxTdHJlbmd0aC5nZXRHc21TaWduYWxTdHJlbmd0aCgpOworCisgICAgICAgICAgICAvLyBhc3Ugb24gWzAsMzFdOyA5OSA9IHVua25vd24KKyAgICAgICAgICAgIC8vIEFuZHJvaWQgaGFzIGhpc3RvcmljYWxseSBzaG93biBhbnl0aGluZyA+PTEyIGFzICJmdWxsIgorICAgICAgICAgICAgLy8gWFhYOiB0dW5lIHRoaXMgYmFzZWQgb24gSW5kdXN0cnkgQmVzdCBQcmFjdGljZXMoVE0pCisgICAgICAgICAgICBpZiAoYXN1IDw9IDIgfHwgYXN1ID09IDk5KSBtRGF0YUxldmVsID0gMDsKKyAgICAgICAgICAgIGVsc2UgbURhdGFMZXZlbCA9IChpbnQpKCgoZmxvYXQpTWF0aC5tYXgoYXN1LCAxNSkgLyAxNSkgKiAxMDApOworCisgICAgICAgICAgICBtRGF0YVJvYW1pbmcgPSBtUGhvbmUuaXNOZXR3b3JrUm9hbWluZygpOworCisgICAgICAgICAgICBtRGF0YUNvbm5lY3RlZCA9IG1EYXRhQ29ubmVjdGVkCisgICAgICAgICAgICAgICAgJiYgKG1TaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlJFQURZIHx8IG1TaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlVOS05PV04pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERFQlVHX1NJR05BTCB8fCBERUJVRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZURhdGFTdGF0ZTogY29ubmVjdGVkPSIgKyBtRGF0YUNvbm5lY3RlZCAKKyAgICAgICAgICAgICAgICAgICAgKyAiIGxldmVsPSIgKyBtRGF0YUxldmVsCisgICAgICAgICAgICAgICAgICAgICsgIiBpc0V2ZG89IiArIGlzRXZkbygpCisgICAgICAgICAgICAgICAgICAgICsgIiBpc0NkbWE9IiArIGlzQ2RtYSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBtUGhvbmVTdGF0ZT0iICsgbVBob25lU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1EYXRhU3RhdGU9IiArIG1EYXRhU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlZnJlc2hTaWduYWxNZXRlcnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlV2lmaVN0YXRlKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZVdpZmlTdGF0ZTogIiArIGludGVudCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiB3YXNDb25uZWN0ZWQgPSBtV2lmaUNvbm5lY3RlZDsKKworICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgbVdpZmlFbmFibGVkID0gaW50ZW50LmdldEludEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTikgPT0gV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEOworICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKQorICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICBtV2lmaUNvbm5lY3RlZCA9IG5ldHdvcmtJbmZvICE9IG51bGwgJiYgbmV0d29ya0luZm8uaXNDb25uZWN0ZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBmaW5hbCBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIGRldGFpbGVkU3RhdGUgPSBXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2YoCisgICAgICAgICAgICAgICAgICAgIChTdXBwbGljYW50U3RhdGUpaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfU1RBVEUpKTsKKyAgICAgICAgICAgIG1XaWZpQ29ubmVjdGVkID0gZGV0YWlsZWRTdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlJTU0lfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbmV3UnNzaSA9IGludGVudC5nZXRJbnRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgLTIwMCk7CisgICAgICAgICAgICBpbnQgbmV3U2lnbmFsTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChuZXdSc3NpLCAxMDEpOworICAgICAgICAgICAgbVdpZmlMZXZlbCA9IG1XaWZpQ29ubmVjdGVkID8gbmV3U2lnbmFsTGV2ZWwgOiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1XaWZpQ29ubmVjdGVkICYmICF3YXNDb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIFdpZmlJbmZvIGluZm8gPSBtV2lmaU1hbmFnZXIuZ2V0Q29ubmVjdGlvbkluZm8oKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlV2lmaVN0YXRlOiBqdXN0IGNvbm5lY3RlZDogaW5mbz0iICsgaW5mbyk7CisKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBncmFiIHRoZSBpbml0aWFsIHNpZ25hbCBzdHJlbmd0aAorICAgICAgICAgICAgICAgIG1XaWZpTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChpbmZvLmdldFJzc2koKSwgMTAxKTsKKworICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIFNTSUQKKyAgICAgICAgICAgICAgICBtV2lmaVNzaWQgPSBpbmZvLmdldFNTSUQoKTsKKyAgICAgICAgICAgICAgICBpZiAobVdpZmlTc2lkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT0ssIGl0J3Mgbm90IGluIHRoZSBjb25uZWN0aW9uSW5mbzsgd2UgaGF2ZSB0byBnbyBodW50aW5nIGZvciBpdAorICAgICAgICAgICAgICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9IG1XaWZpTWFuYWdlci5nZXRDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbiBuZXQgOiBuZXR3b3JrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldC5uZXR3b3JrSWQgPT0gaW5mby5nZXROZXR3b3JrSWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpU3NpZCA9IG5ldC5TU0lEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVmcmVzaFNpZ25hbE1ldGVycygpOworICAgIH0KKworICAgIC8vIGZpZ3VyZSBvdXQgd2hhdCB0byBzaG93OiBmaXJzdCB3aWZpLCB0aGVuIDNHLCB0aGVuIG5vdGhpbmcKKyAgICB2b2lkIHJlZnJlc2hTaWduYWxNZXRlcnMoKSB7CisgICAgICAgIGlmIChtU2lnbmFsTWV0ZXIgPT0gbnVsbCkgcmV0dXJuOyAvLyBubyBVSSB5ZXQKKworICAgICAgICBDb250ZXh0IGN0eHQgPSBnZXRDb250ZXh0KCk7CisKKyAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOworICAgICAgICBpbnQgbGV2ZWwgPSAwOworCisgICAgICAgIGlmIChtV2lmaUNvbm5lY3RlZCkgeworICAgICAgICAgICAgaWYgKG1XaWZpU3NpZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IGN0eHQuZ2V0U3RyaW5nKFIuc3RyaW5nLnN5c3RlbV9wYW5lbF9zaWduYWxfbWV0ZXJfd2lmaV9ub3NzaWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX3NzaWRfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVNzaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV2ZWwgPSBtV2lmaUxldmVsOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGVkKSB7CisgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kYXRhX2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBsZXZlbCA9IG1EYXRhTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgbGV2ZWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfc2lnbmFsKTsKKyAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlTGV2ZWwobGV2ZWwpOworICAgICAgICBtU2lnbmFsVGV4dC5zZXRUZXh0KHRleHQpOworCisgICAgICAgIC8vIGhhY2sgZm9yIG5vdworICAgICAgICBtQmFyLnNldFNpZ25hbE1ldGVyKGxldmVsLCBtV2lmaUNvbm5lY3RlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFyKFRhYmxldFN0YXR1c0JhclNlcnZpY2UgYmFyKSB7CisgICAgICAgIG1CYXIgPSBiYXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQmF0dGVyeShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGZpbmFsIGludCBsZXZlbCA9IGludGVudC5nZXRJbnRFeHRyYSgibGV2ZWwiLCAwKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBwbHVnZ2VkID0gaW50ZW50LmdldEludEV4dHJhKCJwbHVnZ2VkIiwgMCkgIT0gMDsKKworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfYmF0dGVyeSk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbChsZXZlbCk7CisgICAgICAgIG1CYXR0ZXJ5VGV4dC5zZXRUZXh0KGdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX2JhdHRlcnlfbWV0ZXJfZm9ybWF0LCBsZXZlbCkpOworCisgICAgICAgIC8vIGhhY2sgZm9yIG5vdworICAgICAgICBtQmFyLnNldEJhdHRlcnlNZXRlcihsZXZlbCwgcGx1Z2dlZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTeXN0ZW1QYW5lbChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3lzdGVtUGFuZWwoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworCisgICAgICAgIC8vIGdldCBub3RpZmllZCBvZiBwaG9uZSBzdGF0ZSBjaGFuZ2VzCisgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255TWFuYWdlciA9CisgICAgICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgdGVsZXBob255TWFuYWdlci5saXN0ZW4obVBob25lU3RhdGVMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TRVJWSUNFX1NUQVRFCisgICAgICAgICAgICAgICAgICAgICAgICB8IFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0lHTkFMX1NUUkVOR1RIUworICAgICAgICAgICAgICAgICAgICAgICAgfCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfU1RBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0FDVElWSVRZKTsKKworICAgICAgICAvLyB3aWZpIHN0YXR1cyBpbmZvCisgICAgICAgIG1XaWZpTWFuYWdlciA9IChXaWZpTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICAgICAgCisgICAgICAgIC8vIGF1ZGlvIHN0YXR1cyAKKyAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKKworICAgICAgICAvLyBtb2JpbGUgZGF0YSAKKyAgICAgICAgbVBob25lID0gKFRlbGVwaG9ueU1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworCisgICAgICAgIC8vIEJsdWV0b290aAorICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIFRleHRWaWV3IHNldHRpbmdzQnV0dG9uID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNldHRpbmdzX2J1dHRvbik7CisgICAgICAgIHNldHRpbmdzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5BQ1RJT05fU0VUVElOR1MpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spKTsKKyAgICAgICAgICAgICAgICBtQmFyLmFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfX0pOworCisgICAgICAgIG1CcmlnaHRuZXNzQnV0dG9uID0gKEltYWdlQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmJyaWdodG5lc3MpOworICAgICAgICBtQnJpZ2h0bmVzc0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICByb3RhdGVCcmlnaHRuZXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1Tb3VuZEJ1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zb3VuZCk7CisgICAgICAgIG1Tb3VuZEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBzZXRTaWxlbnRNb2RlKCFnZXRTaWxlbnRNb2RlKCkpOworICAgICAgICAgICAgICAgIG1Tb3VuZEJ1dHRvbi5zZXRBbHBoYShnZXRTaWxlbnRNb2RlKCkgPyAweDdGIDogMHhGRik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtT3JpZW50YXRpb25CdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQub3JpZW50YXRpb24pOworICAgICAgICBtT3JpZW50YXRpb25CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoZ2V0Q29udGV4dCgpLCAiT3JpZW50YXRpb24gY29udHJvbCBub3QgaW1wbGVtZW50ZWQ7IHBsZWFzZSBhZGp1c3QgbmVjayBhbmdsZS4iLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUFpcnBsYW5lQnV0dG9uID0gKEltYWdlQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmFpcnBsYW5lKTsKKyAgICAgICAgbUFpcnBsYW5lQnV0dG9uLnNldEFscGhhKG1BaXJwbGFuZU1vZGUgPyAweEZGIDogMHg3Rik7CisgICAgICAgIG1BaXJwbGFuZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5ld01vZGUgPSAhZ2V0QWlycGxhbmVNb2RlKCk7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoZ2V0Q29udGV4dCgpLCAiQXR0ZW1wdGluZyB0byB0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgKyAobmV3TW9kZSA/ICJvbiIgOiAib2ZmIikgKyAiIGFpcnBsYW5lIG1vZGUgKGZsYWt5KS4iLAorICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICBzZXRBaXJwbGFuZU1vZGUobmV3TW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1HcHNCdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuZ3BzKTsKKyAgICAgICAgbUdwc0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICB0b2dnbGVHcHMoKTsKKyAgICAgICAgICAgICAgICByZWZyZXNoR3BzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1CbHVldG9vdGhCdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuYmx1ZXRvb3RoKTsKKyAgICAgICAgbUJsdWV0b290aEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICB0b2dnbGVCbHVldG9vdGgoKTsKKyAgICAgICAgICAgICAgICByZWZyZXNoQmx1ZXRvb3RoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIHJlZ2lzdGVyIGZvciBicm9hZGNhc3RzCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fU0lNX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBnZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIAorICAgICAgICBtQmF0dGVyeU1ldGVyID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC5iYXR0ZXJ5X21ldGVyKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuc3lzYmFyX2JhdHRlcnkpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlTGV2ZWwoMCk7CisgICAgICAgIG1TaWduYWxNZXRlciA9IChJbWFnZVZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2lnbmFsX21ldGVyKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuc3lzYmFyX3NpZ25hbCk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbCgwKTsKKworICAgICAgICBtQmF0dGVyeVRleHQgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuYmF0dGVyeV9pbmZvKTsKKyAgICAgICAgbVNpZ25hbFRleHQgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2lnbmFsX2luZm8pOworCisgICAgICAgIHJlZnJlc2hTaWduYWxNZXRlcnMoKTsKKyAgICAgICAgcmVmcmVzaEJsdWV0b290aCgpOworICAgICAgICByZWZyZXNoR3BzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGdldENvbnRleHQoKS51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICAgIHByaXZhdGUgYm9vbGVhbiBpc0F1dG9CcmlnaHRuZXNzKCkgeworLy8gICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKy8vICAgICAgICB0cnkgeworLy8gICAgICAgICAgICBJUG93ZXJNYW5hZ2VyIHBvd2VyID0gSVBvd2VyTWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorLy8gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoInBvd2VyIikpOworLy8gICAgICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCkgeworLy8gICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSk7CisvLyAgICAgICAgICAgICAgICByZXR1cm4gYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKy8vICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworLy8gICAgICAgIH0KKy8vICAgICAgICByZXR1cm4gZmFsc2U7CisvLyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcm90YXRlQnJpZ2h0bmVzcygpIHsKKyAgICAgICAgaW50IGljb24gPSBSLmRyYXdhYmxlLmljX3N5c2Jhcl9icmlnaHRuZXNzOworICAgICAgICBpbnQgYmcgPSBSLmRyYXdhYmxlLnN5c2Jhcl90b2dnbGVfYmdfb247CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElQb3dlck1hbmFnZXIgcG93ZXIgPSBJUG93ZXJNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoInBvd2VyIikpOworICAgICAgICAgICAgaWYgKHBvd2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgICAgIGludCBicmlnaHRuZXNzID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChjciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUyk7CisgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMOworICAgICAgICAgICAgICAgIC8vT25seSBnZXQgYnJpZ2h0bmVzcyBzZXR0aW5nIGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2F1dG9tYXRpY19icmlnaHRuZXNzX2F2YWlsYWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBSb3RhdGUgQVVUTyAtPiBNSU5JTVVNIC0+IERFRkFVTFQgLT4gTUFYSU1VTQorICAgICAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5LCBub3QgYSB0b2dnbGUuLi4KKyAgICAgICAgICAgICAgICBpZiAoYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDKSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBNSU5JTVVNX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgaWNvbiA9IFIuZHJhd2FibGUuaWNfc3lzYmFyX2JyaWdodG5lc3NfbG93OworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJyaWdodG5lc3MgPCBERUZBVUxUX0JBQ0tMSUdIVCkgeworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gREVGQVVMVF9CQUNLTElHSFQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChicmlnaHRuZXNzIDwgTUFYSU1VTV9CQUNLTElHSFQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IE1BWElNVU1fQkFDS0xJR0hUOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDOworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gTUlOSU1VTV9CQUNLTElHSFQ7CisgICAgICAgICAgICAgICAgICAgIGljb24gPSBSLmRyYXdhYmxlLmljX3N5c2Jhcl9icmlnaHRuZXNzX2F1dG87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfYXV0b21hdGljX2JyaWdodG5lc3NfYXZhaWxhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc2NyZWVuIGJyaWdodG5lc3MgbW9kZSAoYXV0b21hdGljIG9yIG1hbnVhbCkKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLnB1dEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBicmlnaHRuZXNzIGlmIGF1dG9tYXRpYyBtb2RlIGlzbid0IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJyaWdodG5lc3NNb2RlID09IFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTCkgeworICAgICAgICAgICAgICAgICAgICBwb3dlci5zZXRCYWNrbGlnaHRCcmlnaHRuZXNzKGJyaWdodG5lc3MpOworICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsIGJyaWdodG5lc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIG1CcmlnaHRuZXNzQnV0dG9uLnNldEltYWdlUmVzb3VyY2UoaWNvbik7CisgICAgICAgIG1CcmlnaHRuZXNzQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZShiZyk7CisgICAgfQorCisgICAgUGhvbmVTdGF0ZUxpc3RlbmVyIG1QaG9uZVN0YXRlTGlzdGVuZXIgPSBuZXcgUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSBzZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19TSUdOQUwgfHwgREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAicGhvbmUgc2VydmljZSBzdGF0ZSBjaGFuZ2VkOiAiICsgc2VydmljZVN0YXRlLmdldFN0YXRlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlcnZpY2VTdGF0ZSA9IHNlcnZpY2VTdGF0ZTsKKyAgICAgICAgICAgIG1BaXJwbGFuZU1vZGUgPSBzZXJ2aWNlU3RhdGUuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfUE9XRVJfT0ZGOworICAgICAgICAgICAgaWYgKG1BaXJwbGFuZUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFpcnBsYW5lQnV0dG9uLnNldEltYWdlUmVzb3VyY2UobUFpcnBsYW5lTW9kZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuaWNfc3lzYmFyX2FpcnBsYW5lX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX3N5c2Jhcl9haXJwbGFuZV9vZmYpOworICAgICAgICAgICAgICAgIG1BaXJwbGFuZUJ1dHRvbi5zZXRCYWNrZ3JvdW5kUmVzb3VyY2UobUFpcnBsYW5lTW9kZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29mZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVEYXRhU3RhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TaWduYWxTdHJlbmd0aHNDaGFuZ2VkKFNpZ25hbFN0cmVuZ3RoIHNpZ25hbFN0cmVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfU0lHTkFMIHx8IERFQlVHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uU2lnbmFsU3RyZW5ndGhzQ2hhbmdlZDogIiArIHNpZ25hbFN0cmVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TaWduYWxTdHJlbmd0aCA9IHNpZ25hbFN0cmVuZ3RoOworICAgICAgICAgICAgdXBkYXRlRGF0YVN0YXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbFN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsIFN0cmluZyBpbmNvbWluZ051bWJlcikgeworICAgICAgICAgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIC8vIEluIGNkbWEsIGlmIGEgdm9pY2UgY2FsbCBpcyBtYWRlLCBSU1NJIHNob3VsZCBzd2l0Y2ggdG8gMXguCisgICAgICAgICAgICBpZiAoaXNDZG1hKCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVEYXRhU3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwgaW50IG5ldHdvcmtUeXBlKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfU0lHTkFMIHx8IERFQlVHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQ6IHN0YXRlPSIgKyBzdGF0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0eXBlPSIgKyBuZXR3b3JrVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YVN0YXRlID0gc3RhdGU7CisvLyAgICAgICAgICAgIHVwZGF0ZURhdGFOZXRUeXBlKG5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgIHVwZGF0ZURhdGFTdGF0ZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBnZXRBaXJwbGFuZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBtQWlycGxhbmVNb2RlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBaXJwbGFuZU1vZGUoYm9vbGVhbiBvbikgeworICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5BSVJQTEFORV9NT0RFX09OLAorICAgICAgICAgICAgICAgIG9uID8gMSA6IDApOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX0FJUlBMQU5FX01PREVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0YXRlIiwgb24pOworICAgICAgICBnZXRDb250ZXh0KCkuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIGJvb2xlYW4gZ2V0U2lsZW50TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb01hbmFnZXIuZ2V0UmluZ2VyTW9kZSgpICE9IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUw7CisgICAgfQorCisgICAgdm9pZCBzZXRTaWxlbnRNb2RlKGJvb2xlYW4gb24pIHsKKyAgICAgICAgaWYgKG9uKSB7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFJpbmdlck1vZGUoKFNldHRpbmdzLlN5c3RlbS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlZJQlJBVEVfSU5fU0lMRU5ULCAxKSA9PSAxKQorICAgICAgICAgICAgICAgID8gQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1ZJQlJBVEUKKyAgICAgICAgICAgICAgICA6IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9TSUxFTlQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRSaW5nZXJNb2RlKEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWZyZXNoU291bmQoKSB7CisgICAgICAgIGJvb2xlYW4gc2lsZW50ID0gZ2V0U2lsZW50TW9kZSgpOworICAgICAgICBtU291bmRCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZSghc2lsZW50IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuaWNfc3lzYmFyX3NvdW5kX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5pY19zeXNiYXJfc291bmRfb2ZmKTsKKyAgICAgICAgbVNvdW5kQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZSghc2lsZW50IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vZmYpOworICAgIH0KKworICAgIHZvaWQgdG9nZ2xlQmx1ZXRvb3RoKCkgeworICAgICAgICBpZiAobUJsdWV0b290aEFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBpZiAobUJsdWV0b290aEFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyLmRpc2FibGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyLmVuYWJsZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWZyZXNoQmx1ZXRvb3RoKCkgeworICAgICAgICBib29sZWFuIG9uID0gbUJsdWV0b290aEFkYXB0ZXIgIT0gbnVsbCAmJiBtQmx1ZXRvb3RoQWRhcHRlci5pc0VuYWJsZWQoKTsKKyAgICAgICAgbUJsdWV0b290aEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKG9uID8gUi5kcmF3YWJsZS5pY19zeXNiYXJfYmx1ZXRvb3RoX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfc3lzYmFyX2JsdWV0b290aF9vZmYpOworICAgICAgICBtQmx1ZXRvb3RoQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZShvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vZmYpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0dwc0VuYWJsZWQoKSB7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciByZXMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5pc0xvY2F0aW9uUHJvdmlkZXJFbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0b2dnbGVHcHMoKSB7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5zZXRMb2NhdGlvblByb3ZpZGVyRW5hYmxlZChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCAhaXNHcHNFbmFibGVkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoR3BzKCkgeworICAgICAgICBib29sZWFuIG9uID0gaXNHcHNFbmFibGVkKCk7CisgICAgICAgIG1HcHNCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZShvbiA/IFIuZHJhd2FibGUuaWNfc3lzYmFyX2dwc19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX3N5c2Jhcl9ncHNfb2ZmKTsKKyAgICAgICAgbUdwc0J1dHRvbi5zZXRCYWNrZ3JvdW5kUmVzb3VyY2Uob24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSLmRyYXdhYmxlLnN5c2Jhcl90b2dnbGVfYmdfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLnN5c2Jhcl90b2dnbGVfYmdfb2ZmKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyNmY1MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDg0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRTd2l0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuKjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQuUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHk7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIFRhYmxldFN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTdGF0dXNCYXJTZXJ2aWNlIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVGFibGV0U3RhdHVzQmFyU2VydmljZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwgPSAxMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwgPSAxMDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19PUEVOX1NZU1RFTV9QQU5FTCA9IDEwMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCA9IDEwMTE7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JTUFHRV9MRVZFTCA9IDEwMDAwOworCisgICAgaW50IG1JY29uU2l6ZTsKKworICAgIEggbUhhbmRsZXIgPSBuZXcgSCgpOworCisgICAgLy8gdHJhY2tpbmcgYWxsIGN1cnJlbnQgbm90aWZpY2F0aW9ucworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uRGF0YSBtTm90bnMgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOworICAgIAorICAgIFRhYmxldFN0YXR1c0JhclZpZXcgbVN0YXR1c0JhclZpZXc7CisgICAgVmlldyBtTm90aWZpY2F0aW9uVHJpZ2dlcjsKKyAgICBOb3RpZmljYXRpb25JY29uQXJlYSBtTm90aWZpY2F0aW9uSWNvbkFyZWE7CisgICAgVmlldyBtTm90aWZpY2F0aW9uQnV0dG9uczsKKyAgICBWaWV3IG1TeXN0ZW1JbmZvOworICAgIFZpZXcgbU5hdmlnYXRpb25BcmVhOworCisgICAgTm90aWZpY2F0aW9uUGFuZWwgbU5vdGlmaWNhdGlvblBhbmVsOworICAgIFN5c3RlbVBhbmVsIG1TeXN0ZW1QYW5lbDsKKworICAgIFZpZXdHcm91cCBtUGlsZTsKKyAgICBUZXh0VmlldyBtQ2xlYXJCdXR0b247CisgICAgVGV4dFZpZXcgbURvTm90RGlzdHVyYkJ1dHRvbjsKKworICAgIEltYWdlVmlldyBtQmF0dGVyeU1ldGVyOworICAgIEltYWdlVmlldyBtU2lnbmFsTWV0ZXI7CisgICAgSW1hZ2VWaWV3IG1TaWduYWxJY29uOworCisgICAgVmlldyBtQmFyQ29udGVudHM7CisgICAgVmlldyBtQ3VydGFpbnM7CisKKyAgICBOb3RpZmljYXRpb25JY29uQXJlYS5JY29uTGF5b3V0IG1JY29uTGF5b3V0OworCisgICAgVGFibGV0VGlja2VyIG1UaWNrZXI7CisgICAgVmlldyBtVGlja2VyVmlldzsKKyAgICBib29sZWFuIG1UaWNraW5nOworCisgICAgLy8gZm9yIGRpc2FibGluZyB0aGUgc3RhdHVzIGJhcgorICAgIGludCBtRGlzYWJsZWQgPSAwOworCisgICAgYm9vbGVhbiBtTm90aWZpY2F0aW9uc09uID0gdHJ1ZTsKKworICAgIHByb3RlY3RlZCB2b2lkIGFkZFBhbmVsV2luZG93cygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgYmFySGVpZ2h0PSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2hlaWdodCk7CisKKyAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsID0gKE5vdGlmaWNhdGlvblBhbmVsKVZpZXcuaW5mbGF0ZSh0aGlzLAorICAgICAgICAgICAgICAgIFIubGF5b3V0LnN5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLCBudWxsKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldE9uVG91Y2hMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBuZXcgVG91Y2hPdXRzaWRlTGlzdGVuZXIoTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCwgbU5vdGlmaWNhdGlvblBhbmVsKSk7CisKKyAgICAgICAgbVN0YXR1c0JhclZpZXcuc2V0SWdub3JlQ2hpbGRyZW4oMCwgbU5vdGlmaWNhdGlvblRyaWdnZXIsIG1Ob3RpZmljYXRpb25QYW5lbCk7CisKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgNDAwLCAvLyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5MRUZUOworICAgICAgICBscC5zZXRUaXRsZSgiTm90aWZpY2F0aW9uUGFuZWwiKTsKKyAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX1NsaWRpbmdDYXJkOworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1Ob3RpZmljYXRpb25QYW5lbCwgbHApOworCisgICAgICAgIG1TeXN0ZW1QYW5lbCA9IChTeXN0ZW1QYW5lbCkgVmlldy5pbmZsYXRlKHRoaXMsIFIubGF5b3V0LnN5c2Jhcl9wYW5lbF9zeXN0ZW0sIG51bGwpOworICAgICAgICBtU3lzdGVtUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtU3lzdGVtUGFuZWwuc2V0T25Ub3VjaExpc3RlbmVyKG5ldyBUb3VjaE91dHNpZGVMaXN0ZW5lcihNU0dfQ0xPU0VfU1lTVEVNX1BBTkVMLAorICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUGFuZWwpKTsKKworICAgICAgICBtU3RhdHVzQmFyVmlldy5zZXRJZ25vcmVDaGlsZHJlbigxLCBtU3lzdGVtSW5mbywgbVN5c3RlbVBhbmVsKTsKKworICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICA4MDAsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUw7CisgICAgICAgIGxwLnNldFRpdGxlKCJTeXN0ZW1QYW5lbCIpOworICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fU2xpZGluZ0NhcmQ7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobVN5c3RlbVBhbmVsLCBscCk7CisgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRCYXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7IC8vIHdpbGwgYWRkIHRoZSBtYWluIGJhciB2aWV3CisgICAgfQorCisgICAgcHJvdGVjdGVkIFZpZXcgbWFrZVN0YXR1c0JhclZpZXcoKSB7CisgICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKworICAgICAgICBtSWNvblNpemUgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9pY29uX3NpemUpOworCisgICAgICAgIGZpbmFsIFRhYmxldFN0YXR1c0JhclZpZXcgc2IgPSAoVGFibGV0U3RhdHVzQmFyVmlldylWaWV3LmluZmxhdGUoCisgICAgICAgICAgICAgICAgdGhpcywgUi5sYXlvdXQuc3RhdHVzX2JhciwgbnVsbCk7CisgICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7CisKKyAgICAgICAgc2Iuc2V0SGFuZGxlcihtSGFuZGxlcik7CisKKyAgICAgICAgbUJhckNvbnRlbnRzID0gc2IuZmluZFZpZXdCeUlkKFIuaWQuYmFyX2NvbnRlbnRzKTsKKyAgICAgICAgbUN1cnRhaW5zID0gc2IuZmluZFZpZXdCeUlkKFIuaWQubGlnaHRzX291dCk7CisgICAgICAgIG1TeXN0ZW1JbmZvID0gc2IuZmluZFZpZXdCeUlkKFIuaWQuc3lzdGVtSW5mbyk7CisKKyAgICAgICAgbVN5c3RlbUluZm8uc2V0T25Mb25nQ2xpY2tMaXN0ZW5lcihuZXcgU2V0TGlnaHRzT25MaXN0ZW5lcihmYWxzZSkpOworCisgICAgICAgIFNldExpZ2h0c09uTGlzdGVuZXIgb24gPSBuZXcgU2V0TGlnaHRzT25MaXN0ZW5lcih0cnVlKTsKKyAgICAgICAgbUN1cnRhaW5zLnNldE9uQ2xpY2tMaXN0ZW5lcihvbik7CisgICAgICAgIG1DdXJ0YWlucy5zZXRPbkxvbmdDbGlja0xpc3RlbmVyKG9uKTsKKworICAgICAgICAvLyB0aGUgYnV0dG9uIHRvIG9wZW4gdGhlIG5vdGlmaWNhdGlvbiBhcmVhCisgICAgICAgIG1Ob3RpZmljYXRpb25UcmlnZ2VyID0gc2IuZmluZFZpZXdCeUlkKFIuaWQuZXhwYW5kKTsKKworICAgICAgICAvLyB0aGUgbW9yZSBub3RpZmljYXRpb25zIGljb24KKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhID0gKE5vdGlmaWNhdGlvbkljb25BcmVhKXNiLmZpbmRWaWV3QnlJZChSLmlkLm5vdGlmaWNhdGlvbkljb25zKTsKKworICAgICAgICAvLyB0aGUgY2xlYXIgYW5kIGRuZCBidXR0b25zCisgICAgICAgIG1Ob3RpZmljYXRpb25CdXR0b25zID0gc2IuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uQnV0dG9ucyk7CisgICAgICAgIG1DbGVhckJ1dHRvbiA9IChUZXh0VmlldyltTm90aWZpY2F0aW9uQnV0dG9ucy5maW5kVmlld0J5SWQoUi5pZC5jbGVhcl9hbGxfYnV0dG9uKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xlYXJCdXR0b25MaXN0ZW5lcik7CisgICAgICAgIG1Eb05vdERpc3R1cmJCdXR0b24gPSAoVGV4dFZpZXcpbU5vdGlmaWNhdGlvbkJ1dHRvbnMuZmluZFZpZXdCeUlkKFIuaWQuZG9fbm90X2Rpc3R1cmIpOworICAgICAgICBtRG9Ob3REaXN0dXJiQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRG9Ob3REaXN0dXJiQnV0dG9uTGlzdGVuZXIpOworCisKKyAgICAgICAgLy8gd2hlcmUgdGhlIGljb25zIGdvCisgICAgICAgIG1JY29uTGF5b3V0ID0gKE5vdGlmaWNhdGlvbkljb25BcmVhLkljb25MYXlvdXQpIHNiLmZpbmRWaWV3QnlJZChSLmlkLmljb25zKTsKKworICAgICAgICBtVGlja2VyID0gbmV3IFRhYmxldFRpY2tlcigoQ29udGV4dCl0aGlzLCAoRnJhbWVMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyKSk7CisKKyAgICAgICAgLy8gU3lzdGVtIGluZm8gKGNlbnRlcikKKyAgICAgICAgbUJhdHRlcnlNZXRlciA9IChJbWFnZVZpZXcpIHNiLmZpbmRWaWV3QnlJZChSLmlkLmJhdHRlcnkpOworICAgICAgICBtU2lnbmFsTWV0ZXIgPSAoSW1hZ2VWaWV3KSBzYi5maW5kVmlld0J5SWQoUi5pZC5zaWduYWwpOworICAgICAgICBtU2lnbmFsSWNvbiA9IChJbWFnZVZpZXcpIHNiLmZpbmRWaWV3QnlJZChSLmlkLnNpZ25hbF9pY29uKTsKKworICAgICAgICAvLyBUaGUgbmF2aWdhdGlvbiBidXR0b25zCisgICAgICAgIG1OYXZpZ2F0aW9uQXJlYSA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLm5hdmlnYXRpb25BcmVhKTsKKworICAgICAgICAvLyBzZXQgdGhlIGluaXRpYWwgdmlldyB2aXNpYmlsaXR5CisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworCisgICAgICAgIC8vIEFkZCB0aGUgd2luZG93cworICAgICAgICBhZGRQYW5lbFdpbmRvd3MoKTsKKworICAgICAgICBtUGlsZSA9IChWaWV3R3JvdXApbU5vdGlmaWNhdGlvblBhbmVsLmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOworICAgICAgICBtUGlsZS5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICAKKyAgICAgICAgU2Nyb2xsVmlldyBzY3JvbGxlciA9IChTY3JvbGxWaWV3KW1QaWxlLmdldFBhcmVudCgpOworICAgICAgICBzY3JvbGxlci5zZXRGaWxsVmlld3BvcnQodHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuIHNiOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0U3RhdHVzQmFyR3Jhdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG0ud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJvcGVuaW5nIG5vdGlmaWNhdGlvbnMgcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25QYW5lbC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRG9Ob3REaXN0dXJiQnV0dG9uLnNldFRleHQobU5vdGlmaWNhdGlvbnNPbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuc3RyaW5nLnN0YXR1c19iYXJfZG9fbm90X2Rpc3R1cmJfYnV0dG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5zdHJpbmcuc3RhdHVzX2Jhcl9wbGVhc2VfZGlzdHVyYl9idXR0b24pOworICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1Ob3RpZmljYXRpb25JY29uQXJlYSwgVmlldy5HT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmFuaW0ubm90aWZpY2F0aW9uX2ljb25zX291dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRWaWV3VmlzaWJpbGl0eShtTm90aWZpY2F0aW9uQnV0dG9ucywgVmlldy5WSVNJQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmFuaW0ubm90aWZpY2F0aW9uX2J1dHRvbnNfaW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xvc2luZyBub3RpZmljYXRpb25zIHBhbmVsIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uUGFuZWwuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1Ob3RpZmljYXRpb25JY29uQXJlYSwgVmlldy5WSVNJQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmFuaW0ubm90aWZpY2F0aW9uX2ljb25zX2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1Ob3RpZmljYXRpb25CdXR0b25zLCBWaWV3LkdPTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5ub3RpZmljYXRpb25fYnV0dG9uc19vdXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX09QRU5fU1lTVEVNX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJvcGVuaW5nIHN5c3RlbSBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DTE9TRV9TWVNURU1fUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsb3Npbmcgc3lzdGVtIHBhbmVsIik7CisgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEJhdHRlcnlNZXRlcihpbnQgbGV2ZWwsIGJvb2xlYW4gcGx1Z2dlZCkgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJiYXR0ZXJ5PSIgKyBsZXZlbCArIChwbHVnZ2VkID8gIiAtIHBsdWdnZWQiIDogIiAtIHVucGx1Z2dlZCIpKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuc3lzYmFyX2JhdHRlcnltaW5pKTsKKyAgICAgICAgLy8gYWRqdXN0IHBlcmNlbnQgdG8gcGVybXlyaWFkIGZvciBDbGlwRHJhd2FibGUncyBzYWtlCisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbChsZXZlbCAqIChNQVhfSU1BR0VfTEVWRUwgLyAxMDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaWduYWxNZXRlcihpbnQgbGV2ZWwsIGJvb2xlYW4gaXNXaWZpKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInNpZ25hbD0iICsgbGV2ZWwpOworICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICBtU2lnbmFsTWV0ZXIuc2V0SW1hZ2VEcmF3YWJsZShudWxsKTsKKyAgICAgICAgICAgIG1TaWduYWxNZXRlci5zZXRJbWFnZUxldmVsKDApOworICAgICAgICAgICAgbVNpZ25hbEljb24uc2V0SW1hZ2VEcmF3YWJsZShudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TaWduYWxNZXRlci5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuc3lzYmFyX3dpZmltaW5pKTsKKyAgICAgICAgICAgIC8vIGFkanVzdCB0byBwZXJteXJpYWQKKyAgICAgICAgICAgIG1TaWduYWxNZXRlci5zZXRJbWFnZUxldmVsKGxldmVsICogKE1BWF9JTUFHRV9MRVZFTCAvIDEwMCkpOworICAgICAgICAgICAgbVNpZ25hbEljb24uc2V0SW1hZ2VSZXNvdXJjZShpc1dpZmkgPyBSLmRyYXdhYmxlLmljX3N5c2Jhcl93aWZpX21pbmkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfc3lzYmFyX3dpZmlfbWluaSk7IC8vIFhYWAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiYWRkSWNvbigiICsgc2xvdCArICIpIC0+ICIgKyBpY29uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsCisgICAgICAgICAgICBTdGF0dXNCYXJJY29uIG9sZCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInVwZGF0ZUljb24oIiArIHNsb3QgKyAiKSAtPiAiICsgaWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInJlbW92ZUljb24oIiArIHNsb3QgKyAiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJhZGROb3RpZmljYXRpb24oIiArIGtleSArICIgLT4gIiArIG5vdGlmaWNhdGlvbiArICIpIik7CisgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKworICAgICAgICBib29sZWFuIGltbWVyc2l2ZSA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW1tZXJzaXZlID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5pc1RvcEFjdGl2aXR5SW1tZXJzaXZlKCk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVG9wIGFjdGl2aXR5IGlzICIgKyAoaW1tZXJzaXZlPyJpbW1lcnNpdmUiOiJub3QgaW1tZXJzaXZlIikpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW1tZXJzaXZlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbW1lcnNpdmUgbW9kZSBwb3B1cHMgZm9yIHRhYmxldAorICAgICAgICB9IGVsc2UgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBub3QgaW1tZXJzaXZlICYgYSBmdWxsLXNjcmVlbiBhbGVydCBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJOb3RpZmljYXRpb24gaGFzIGZ1bGxTY3JlZW5JbnRlbnQgYW5kIGFjdGl2aXR5IGlzIG5vdCBpbW1lcnNpdmU7IgorICAgICAgICAgICAgICAgICAgICArICIgc2VuZGluZyBmdWxsU2NyZWVuSW50ZW50Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudC5zZW5kKCk7CisgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRpY2sobm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24oIiArIGtleSArICIgLT4gIiArIG5vdGlmaWNhdGlvbiArICIpIC8vIFRPRE8iKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgb2xkRW50cnkgPSBtTm90bnMuZmluZEJ5S2V5KGtleSk7CisgICAgICAgIGlmIChvbGRFbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkTm90aWZpY2F0aW9uID0gb2xkRW50cnkubm90aWZpY2F0aW9uOworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBvbGRDb250ZW50VmlldyA9IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgY29udGVudFZpZXcgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OworCisgICAgICAgIGlmIChmYWxzZSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9sZCBub3RpZmljYXRpb246IHdoZW49IiArIG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgICAgICsgIiBleHBhbmRlZD0iICsgb2xkRW50cnkuZXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBvbGRDb250ZW50Vmlldyk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAibmV3IG5vdGlmaWNhdGlvbjogd2hlbj0iICsgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBjb250ZW50Vmlldyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYW4gd2UganVzdCByZWFwcGx5IHRoZSBSZW1vdGVWaWV3cyBpbiBwbGFjZT8gIElmIHdoZW4gZGlkbid0IGNoYW5nZSwgdGhlIG9yZGVyCisgICAgICAgIC8vIGRpZG4ndCBjaGFuZ2UuCisgICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gPT0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgJiYgbm90aWZpY2F0aW9uLmlzT25nb2luZygpID09IG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICYmIG9sZEVudHJ5LmV4cGFuZGVkICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VmlldyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkuZXF1YWxzKGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSkKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpID09IGNvbnRlbnRWaWV3LmdldExheW91dElkKCkpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInJldXNpbmcgbm90aWZpY2F0aW9uIGZvciBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgb2xkRW50cnkubm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBSZWFwcGx5IHRoZSBSZW1vdGVWaWV3cworICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LnJlYXBwbHkodGhpcywgb2xkRW50cnkuY29udGVudCk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb250ZW50SW50ZW50CisgICAgICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50OworICAgICAgICAgICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkRW50cnkuY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE5vdGlmaWNhdGlvbkNsaWNrZXIoY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaWNvbi4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7CisgICAgICAgICAgICAgICAgaWYgKCFvbGRFbnRyeS5pY29uLnNldChpYykpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCB1cGRhdGUgaWNvbjogIiArIGljKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCBmYWlsZWQgdG8gYWRkIGNsZWFubHkuICBMb2csIGFuZCByZW1vdmUgdGhlIHZpZXcgZnJvbSB0aGUgcGFuZWwuCisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkNvdWxkbid0IHJlYXBwbHkgdmlld3MgZm9yIHBhY2thZ2UgIiArIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICAgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJub3QgcmV1c2luZyBub3RpZmljYXRpb24gZm9yIGtleTogIiArIGtleSk7CisgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHRpY2tlcjsgaW1tZXJzaXZlIG1vZGUKKworICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb24oSUJpbmRlciBrZXkpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uKCIgKyBrZXkgKyAiKSAvLyBUT0RPIik7CisgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoaW50IHN0YXRlKSB7CisgICAgICAgIGludCBvbGQgPSBtRGlzYWJsZWQ7CisgICAgICAgIGludCBkaWZmID0gc3RhdGUgXiBvbGQ7CisgICAgICAgIFNsb2cuZChUQUcsICJkaXNhYmxlLi4uIG9sZD0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG9sZCkKKyAgICAgICAgICAgICAgICArICIgZGlmZj0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGRpZmYpCisgICAgICAgICAgICAgICAgKyAiIHN0YXRlPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoc3RhdGUpKTsKKyAgICAgICAgbURpc2FibGVkID0gc3RhdGU7CisKKyAgICAgICAgLy8gYWN0IGFjY29yZGluZ2x5CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobU5vdGlmaWNhdGlvblRyaWdnZXIsIFZpZXcuR09ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5ub3RpZmljYXRpb25faWNvbnNfb3V0KTsKKyAgICAgICAgICAgICAgICBzZXRWaWV3VmlzaWJpbGl0eShtTm90aWZpY2F0aW9uSWNvbkFyZWEsIFZpZXcuR09ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5ub3RpZmljYXRpb25faWNvbnNfb3V0KTsKKyAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1Ob3RpZmljYXRpb25UcmlnZ2VyLCBWaWV3LlZJU0lCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICBSLmFuaW0ubm90aWZpY2F0aW9uX2ljb25zX2luKTsKKyAgICAgICAgICAgICAgICBzZXRWaWV3VmlzaWJpbGl0eShtTm90aWZpY2F0aW9uSWNvbkFyZWEsIFZpZXcuVklTSUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5ub3RpZmljYXRpb25faWNvbnNfaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9TWVNURU1fSU5GTykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9TWVNURU1fSU5GTykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX1NZU1RFTV9JTkZPOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBzZXRWaWV3VmlzaWJpbGl0eShtU3lzdGVtSW5mbywgVmlldy5HT05FLCBSLmFuaW0ubmF2aWdhdGlvbl9vdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9TWVNURU1fSU5GTzogbm8iKTsKKyAgICAgICAgICAgICAgICBzZXRWaWV3VmlzaWJpbGl0eShtU3lzdGVtSW5mbywgVmlldy5WSVNJQkxFLCBSLmFuaW0ubmF2aWdhdGlvbl9pbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05BVklHQVRJT04pICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTkFWSUdBVElPTikgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05BVklHQVRJT046IHllcyIpOworICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1OYXZpZ2F0aW9uQXJlYSwgVmlldy5HT05FLCBSLmFuaW0ubmF2aWdhdGlvbl9vdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OQVZJR0FUSU9OOiBubyIpOworICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1OYXZpZ2F0aW9uQXJlYSwgVmlldy5WSVNJQkxFLCBSLmFuaW0ubmF2aWdhdGlvbl9pbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzVGlja2VyKE5vdGlmaWNhdGlvbiBuKSB7CisgICAgICAgIHJldHVybiAhVGV4dFV0aWxzLmlzRW1wdHkobi50aWNrZXJUZXh0KQorICAgICAgICAgICAgICAgIHx8ICFUZXh0VXRpbHMuaXNFbXB0eShuLnRpY2tlclRpdGxlKQorICAgICAgICAgICAgICAgIHx8ICFUZXh0VXRpbHMuaXNFbXB0eShuLnRpY2tlclN1YnRpdGxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGljayhTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgICAgICAvLyBEb24ndCBzaG93IHRoZSB0aWNrZXIgd2hlbiB0aGUgd2luZG93c2hhZGUgaXMgb3Blbi4KKyAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25QYW5lbC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gU2hvdyB0aGUgdGlja2VyIGlmIG9uZSBpcyByZXF1ZXN0ZWQuIEFsc28gZG9uJ3QgZG8gdGhpcworICAgICAgICAvLyB1bnRpbCBzdGF0dXMgYmFyIHdpbmRvdyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIsCisgICAgICAgIC8vIGJlY2F1c2UuLi4gIHdlbGwsIHdoYXQncyB0aGUgcG9pbnQgb3RoZXJ3aXNlPyAgQW5kIHRyeWluZyB0bworICAgICAgICAvLyBydW4gYSB0aWNrZXIgd2l0aG91dCBiZWluZyBhdHRhY2hlZCB3aWxsIGNyYXNoIQorICAgICAgICBpZiAoaGFzVGlja2VyKG4ubm90aWZpY2F0aW9uKSAmJiBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgwID09IChtRGlzYWJsZWQgJiAoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpKSkgeworICAgICAgICAgICAgICAgIG1UaWNrZXIuYWRkKG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUV4cGFuZCgpIHsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpIHsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19DTE9TRV9TWVNURU1fUEFORUwpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19DTE9TRV9TWVNURU1fUEFORUwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpZ2h0c09uKGJvb2xlYW4gb24pIHsKKyAgICAgICAgaWYgKG9uKSB7CisgICAgICAgICAgICBzZXRWaWV3VmlzaWJpbGl0eShtQ3VydGFpbnMsIFZpZXcuR09ORSwgUi5hbmltLmxpZ2h0c19vdXRfb3V0KTsKKyAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1CYXJDb250ZW50cywgVmlldy5WSVNJQkxFLCBSLmFuaW0uc3RhdHVzX2Jhcl9pbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1DdXJ0YWlucywgVmlldy5WSVNJQkxFLCBSLmFuaW0ubGlnaHRzX291dF9pbik7CisgICAgICAgICAgICBzZXRWaWV3VmlzaWJpbGl0eShtQmFyQ29udGVudHMsIFZpZXcuR09ORSwgUi5hbmltLnN0YXR1c19iYXJfb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzQ2xlYXJhYmxlID0gbU5vdG5zLmhhc0NsZWFyYWJsZUl0ZW1zKCk7CisKKyAgICAgICAgLy9TbG9nLmQoVEFHLCAic2V0QXJlVGhlcmVOb3RpZmljYXRpb25zIGhhc0NsZXJhYmxlPSIgKyBoYXNDbGVhcmFibGUpOworCisgICAgICAgIC8vIFNob3cgb3IgaGlkZSB0aGUgIkNsZWFyIGFsbCIgYnV0dG9uLiAgTm90ZSB0aGF0IHdlIGRvbid0IGRvIGFuIGFuaW1hdGlvbgorICAgICAgICAvLyBpZiBpdCdzIG5vdCBvbiBzY3JlZW4sIHNvIHRoYXQgaWYgc29tZW9uZSBvcGVucyB0aGUgYmFyIHJpZ2h0IHRoZW4gdGhleQorICAgICAgICAvLyBkb24ndCBzZWUgdGhlIGFuaW1hdGlvbiBpbiBwcm9ncmVzcy4KKyAgICAgICAgLy8gKG5vIG9uZ29pbmcgbm90aWZpY2F0aW9ucyBhcmUgY2xlYXJhYmxlKQorICAgICAgICBpZiAoaGFzQ2xlYXJhYmxlKSB7CisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkJ1dHRvbnMuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgeworICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1DbGVhckJ1dHRvbiwgVmlldy5WSVNJQkxFLCBSLmFuaW0ubm90aWZpY2F0aW9uX2J1dHRvbnNfaW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25CdXR0b25zLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICBzZXRWaWV3VmlzaWJpbGl0eShtQ2xlYXJCdXR0b24sIFZpZXcuR09ORSwgUi5hbmltLm5vdGlmaWNhdGlvbl9idXR0b25zX291dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkob25nb2luZyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgIG1MYXRlc3RUaXRsZS5zZXRWaXNpYmlsaXR5KGxhdGVzdCA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisKKyAgICAgICAgaWYgKG9uZ29pbmcgfHwgbGF0ZXN0KSB7CisgICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmaWNhdGlvbkljb25zQ2xpY2tlZChWaWV3IHYpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xpY2tlZCBub3RpZmljYXRpb24gaWNvbnMiKTsKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSA9PSAwKSB7CisgICAgICAgICAgICBpbnQgbXNnID0gKG1Ob3RpZmljYXRpb25QYW5lbC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSAKKyAgICAgICAgICAgICAgICA/IE1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTAorICAgICAgICAgICAgICAgIDogTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTDsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKG1zZyk7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzeXN0ZW1JbmZvQ2xpY2tlZChWaWV3IHYpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xpY2tlZCBzeXN0ZW0gaW5mbyIpOworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpID09IDApIHsKKyAgICAgICAgICAgIGludCBtc2cgPSAobVN5c3RlbVBhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIAorICAgICAgICAgICAgICAgID8gTVNHX09QRU5fU1lTVEVNX1BBTkVMCisgICAgICAgICAgICAgICAgOiBNU0dfQ0xPU0VfU1lTVEVNX1BBTkVMOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMobXNnKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlY2VudEJ1dHRvbkNsaWNrZWQoVmlldyB2KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsaWNrZWQgcmVjZW50IGFwcHMiKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9FWENMVURFX0ZST01fUkVDRU5UUyk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhpcyBub3RpZmljYXRpb24gYW5kIHRlbGwgdGhlIHN0YXR1cyBiYXIgc2VydmljZSBhYm91dCB0aGUgZmFpbHVyZS4gSG9sZCBubyBsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKGtleSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkVycm9yKG4ucGtnLCBuLnRhZywgbi5pZCwgbi51aWQsIG4uaW5pdGlhbFBpZCwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gVGhlIGVuZCBpcyBuaWdoLgorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xlYXJCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbURvTm90RGlzdHVyYkJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbnNPbiA9ICFtTm90aWZpY2F0aW9uc09uOworICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBjbGFzcyBOb3RpZmljYXRpb25DbGlja2VyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbUludGVudDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVBrZzsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUlkOworCisgICAgICAgIE5vdGlmaWNhdGlvbkNsaWNrZXIoUGVuZGluZ0ludGVudCBpbnRlbnQsIFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIG1Qa2cgPSBwa2c7CisgICAgICAgICAgICBtVGFnID0gdGFnOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaW50ZW50IHdlIGFyZSBzZW5kaW5nIGlzIGZvciB0aGUgYXBwbGljYXRpb24sIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gd29uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IGFuIGFjdGl2aXR5IGFmdGVyCisgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgc3dpdGNoZXMgdG8gaG9tZS4gIFdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBhdCB0aGlzCisgICAgICAgICAgICAgICAgLy8gcG9pbnQsIHNvIG1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgc3dpdGNoZXMgYXJlIG5vdyBhbGxvd2VkLgorICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkucmVzdW1lQXBwU3dpdGNoZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOworICAgICAgICAgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbihwb3MpOworICAgICAgICAgICAgICAgIEludGVudCBvdmVybGF5ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgIG92ZXJsYXkuc2V0U291cmNlQm91bmRzKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QocG9zWzBdLCBwb3NbMV0sIHBvc1swXSt2LmdldFdpZHRoKCksIHBvc1sxXSt2LmdldEhlaWdodCgpKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUludGVudC5zZW5kKFRhYmxldFN0YXR1c0JhclNlcnZpY2UudGhpcywgMCwgb3ZlcmxheSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFjayB0cmFjZSBpc24ndCB2ZXJ5IGhlbHBmdWwgaGVyZS4gIEp1c3QgbG9nIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlNlbmRpbmcgY29udGVudEludGVudCBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGljayhtUGtnLCBtVGFnLCBtSWQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgc2hhZGUgaWYgaXQgd2FzIG9wZW4KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworCisgICAgICAgICAgICAvLyBJZiB0aGlzIGNsaWNrIHdhcyBvbiB0aGUgaW50cnVkZXIgYWxlcnQsIGhpZGUgdGhhdCBpbnN0ZWFkCisvLyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0hJREVfSU5UUlVERVIpOworICAgICAgICB9CisgICAgfQorCisgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5KSB7CisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnkgPSBtTm90bnMucmVtb3ZlKGtleSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgIFZpZXdHcm91cCByb3dQYXJlbnQgPSAoVmlld0dyb3VwKWVudHJ5LnJvdy5nZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKHJvd1BhcmVudCAhPSBudWxsKSByb3dQYXJlbnQucmVtb3ZlVmlldyhlbnRyeS5yb3cpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGljb24uCisvLyAgICAgICAgVmlld0dyb3VwIGljb25QYXJlbnQgPSAoVmlld0dyb3VwKWVudHJ5Lmljb24uZ2V0UGFyZW50KCk7CisvLyAgICAgICAgaWYgKGljb25QYXJlbnQgIT0gbnVsbCkgaWNvblBhcmVudC5yZW1vdmVWaWV3KGVudHJ5Lmljb24pOworICAgICAgICByZWZyZXNoSWNvbnMoKTsKKworICAgICAgICByZXR1cm4gZW50cnkubm90aWZpY2F0aW9uOworICAgIH0KKworICAgIFN0YXR1c0Jhckljb25WaWV3IGFkZE5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZE5vdGlmaWNhdGlvblZpZXdzKGtleT0iICsga2V5ICsgIiwgbm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgaWNvbi4KKyAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICBpY29uVmlldy5zZXRTY2FsZVR5cGUoSW1hZ2VWaWV3LlNjYWxlVHlwZS5DRU5URVJfSU5TSURFKTsKKworICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLAorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOworICAgICAgICBpZiAoIWljb25WaWV3LnNldChpYykpIHsKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgYXR0YWNoIFN0YXR1c0Jhckljb246ICIgKyBpYyk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnkgPSBuZXcgTm90aWZpY2F0aW9uRGF0YS5FbnRyeShrZXksIG5vdGlmaWNhdGlvbiwgaWNvblZpZXcpOworICAgICAgICBpZiAoIWluZmxhdGVWaWV3cyhlbnRyeSwgbVBpbGUpKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGV4cGFuZCBSZW1vdGVWaWV3cyBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBub3RpZmljYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWRkIHRoZSBpY29uLgorICAgICAgICBtTm90bnMuYWRkKGVudHJ5KTsKKyAgICAgICAgcmVmcmVzaEljb25zKCk7CisKKyAgICAgICAgcmV0dXJuIGljb25WaWV3OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoSWNvbnMoKSB7CisgICAgICAgIC8vIFhYWDogbmVlZCB0byBpbXBsZW1lbnQgYSBuZXcgbGltaXRlZCBsaW5lYXIgbGF5b3V0IGNsYXNzCisgICAgICAgIC8vIHRvIGF2b2lkIHJlbW92aW5nICYgcmVhZGRpbmcgZXZlcnl0aGluZworCisgICAgICAgIGludCBOID0gbU5vdG5zLnNpemUoKTsKKyAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSk7CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAicmVmcmVzaGluZyBpY29ucyAoIiArIE4gKyAiIG5vdGlmaWNhdGlvbnMsIG1JY29uTGF5b3V0PSIKKyAgICAgICAgICAgICAgICAgICAgKyBtSWNvbkxheW91dCArICIsIG1QaWxlPSIgKyBtUGlsZSk7CisgICAgICAgIH0KKworICAgICAgICBtSWNvbkxheW91dC5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaT49TikgYnJlYWs7CisgICAgICAgICAgICBtSWNvbkxheW91dC5hZGRWaWV3KG1Ob3Rucy5nZXQoTi1pLTEpLmljb24sIGksIHBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICBtUGlsZS5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBtUGlsZS5hZGRWaWV3KG1Ob3Rucy5nZXQoTi1pLTEpLnJvdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5mbGF0ZVZpZXdzKE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnksIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHNibiA9IGVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlld3MgPSBzYm4ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OworICAgICAgICBpZiAocmVtb3RlVmlld3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSByb3cgdmlldworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICBWaWV3IHJvdyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQsIHBhcmVudCwgZmFsc2UpOworICAgICAgICBWaWV3IHZldG9CdXR0b24gPSByb3cuZmluZFZpZXdCeUlkKFIuaWQudmV0byk7CisgICAgICAgIGlmIChlbnRyeS5ub3RpZmljYXRpb24uaXNDbGVhcmFibGUoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIF9wa2cgPSBzYm4ucGtnOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIF90YWcgPSBzYm4udGFnOworICAgICAgICAgICAgZmluYWwgaW50IF9pZCA9IHNibi5pZDsKKyAgICAgICAgICAgIHZldG9CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsgCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQ2xlYXIoX3BrZywgX3RhZywgX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZldG9CdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBiaW5kIHRoZSBjbGljayBldmVudCB0byB0aGUgY29udGVudCBhcmVhCisgICAgICAgIFZpZXdHcm91cCBjb250ZW50ID0gKFZpZXdHcm91cClyb3cuZmluZFZpZXdCeUlkKFIuaWQuY29udGVudCk7CisgICAgICAgIC8vIFhYWDogdXBkYXRlIHRvIGFsbG93IGNvbnRyb2xzIHdpdGhpbiBub3RpZmljYXRpb24gdmlld3MKKyAgICAgICAgY29udGVudC5zZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KFZpZXdHcm91cC5GT0NVU19CTE9DS19ERVNDRU5EQU5UUyk7CisvLyAgICAgICAgY29udGVudC5zZXRPbkZvY3VzQ2hhbmdlTGlzdGVuZXIobUZvY3VzQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBzYm4ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBOb3RpZmljYXRpb25DbGlja2VyKGNvbnRlbnRJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzYm4ucGtnLCBzYm4udGFnLCBzYm4uaWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFZpZXcgZXhwYW5kZWQgPSBudWxsOworICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4cGFuZGVkID0gcmVtb3RlVmlld3MuYXBwbHkodGhpcywgY29udGVudCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwYW5kZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGlkZW50ID0gc2JuLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhzYm4uaWQpOworICAgICAgICAgICAgU2xvZy5lKFRBRywgImNvdWxkbid0IGluZmxhdGUgdmlldyBmb3Igbm90aWZpY2F0aW9uICIgKyBpZGVudCwgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRlbnQuYWRkVmlldyhleHBhbmRlZCk7CisgICAgICAgICAgICByb3cuc2V0RHJhd2luZ0NhY2hlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5LnJvdyA9IHJvdzsKKyAgICAgICAgZW50cnkuY29udGVudCA9IGNvbnRlbnQ7CisgICAgICAgIGVudHJ5LmV4cGFuZGVkID0gZXhwYW5kZWQ7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFNldExpZ2h0c09uTGlzdGVuZXIgaW1wbGVtZW50cyBWaWV3Lk9uTG9uZ0NsaWNrTGlzdGVuZXIsCisgICAgICAgICAgIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1PbjsKKworICAgICAgICBTZXRMaWdodHNPbkxpc3RlbmVyKGJvb2xlYW4gb24pIHsKKyAgICAgICAgICAgIG1PbiA9IG9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uuc2V0TGlnaHRzT24obU9uKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkxvbmdDbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uuc2V0TGlnaHRzT24obU9uKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRvdWNoT3V0c2lkZUxpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PblRvdWNoTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGludCBtTXNnOworICAgICAgICBwcml2YXRlIFN0YXR1c0JhclBhbmVsIG1QYW5lbDsKKworICAgICAgICBwdWJsaWMgVG91Y2hPdXRzaWRlTGlzdGVuZXIoaW50IG1zZywgU3RhdHVzQmFyUGFuZWwgcGFuZWwpIHsKKyAgICAgICAgICAgIG1Nc2cgPSBtc2c7CisgICAgICAgICAgICBtUGFuZWwgPSBwYW5lbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2goVmlldyB2LCBNb3Rpb25FdmVudCBldikgeworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fT1VUU0lERQorICAgICAgICAgICAgICAgICAgICB8fCAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbVBhbmVsLmlzSW5Db250ZW50QXJlYSgoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpKSkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKG1Nc2cpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UobU1zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Vmlld1Zpc2liaWxpdHkoVmlldyB2LCBpbnQgdmlzLCBpbnQgYW5pbSkgeworICAgICAgICBpZiAodi5nZXRWaXNpYmlsaXR5KCkgIT0gdmlzKSB7CisgICAgICAgICAgICAvL1Nsb2cuZChUQUcsICJzZXRWaWV3VmlzaWJpbGl0eSB2aXM9IiArICh2aXMgPT0gVmlldy5WSVNJQkxFKSArICIgdj0iICsgdik7CisgICAgICAgICAgICB2LnNldEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKChDb250ZXh0KXRoaXMsIGFuaW0pKTsKKyAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eSh2aXMpOworICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODM2ZTRhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyVmlldy5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK3B1YmxpYyBjbGFzcyBUYWJsZXRTdGF0dXNCYXJWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKworICAgIHByaXZhdGUgVmlld1tdIG1JZ25vcmVDaGlsZHJlbiA9IG5ldyBWaWV3WzJdOworICAgIHByaXZhdGUgVmlld1tdIG1QYW5lbHMgPSBuZXcgVmlld1syXTsKKyAgICBwcml2YXRlIGludFtdIG1Qb3MgPSBuZXcgaW50WzJdOworCisgICAgcHVibGljIFRhYmxldFN0YXR1c0JhclZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBUYWJsZXRTdGF0dXNCYXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoVGFibGV0U3RhdHVzQmFyU2VydmljZS5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoVGFibGV0U3RhdHVzQmFyU2VydmljZS5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1QYW5lbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVBhbmVsc1tpXS5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudEluc2lkZShtSWdub3JlQ2hpbGRyZW5baV0sIGV2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uSW50ZXJjZXB0VG91Y2hFdmVudChldik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGV2ZW50SW5zaWRlKFZpZXcgdiwgTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgLy8gYXNzdW1lIHRoYXQgeCBhbmQgeSBhcmUgd2luZG93IGNvb3JkcyBiZWNhdXNlIHdlIGFyZS4KKyAgICAgICAgZmluYWwgaW50IHggPSAoaW50KWV2LmdldFgoKTsKKyAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KWV2LmdldFkoKTsKKworICAgICAgICBmaW5hbCBpbnRbXSBwID0gbVBvczsKKyAgICAgICAgdi5nZXRMb2NhdGlvbkluV2luZG93KHApOworCisgICAgICAgIGZpbmFsIGludCBsID0gcFswXTsKKyAgICAgICAgZmluYWwgaW50IHQgPSBwWzFdOworICAgICAgICBmaW5hbCBpbnQgciA9IHBbMF0gKyB2LmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBiID0gcFsxXSArIHYuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgcmV0dXJuIHggPj0gbCAmJiB4IDwgciAmJiB5ID49IHQgJiYgeSA8IGI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihIYW5kbGVyIGgpIHsKKyAgICAgICAgbUhhbmRsZXIgPSBoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUNoaWxkcmVuKGludCBpbmRleCwgVmlldyBpZ25vcmUsIFZpZXcgcGFuZWwpIHsKKyAgICAgICAgbUlnbm9yZUNoaWxkcmVuW2luZGV4XSA9IGlnbm9yZTsKKyAgICAgICAgbVBhbmVsc1tpbmRleF0gPSBwYW5lbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRUaWNrZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFRpY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzEzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRUaWNrZXIuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBjbGFzcyBUYWJsZXRUaWNrZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YXR1c0Jhci5UYWJsZXRUaWNrZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BRFZBTkNFID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRFZBTkNFX0RFTEFZID0gNTAwMDsgLy8gNSBzZWNvbmRzCisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtUGFyZW50OworCisgICAgcHJpdmF0ZSBTdGF0dXNCYXJOb3RpZmljYXRpb24gbUN1cnJlbnROb3RpZmljYXRpb247CisgICAgcHJpdmF0ZSBWaWV3IG1DdXJyZW50VmlldzsKKworICAgIHByaXZhdGUgU3RhdHVzQmFyTm90aWZpY2F0aW9uW10gbVF1ZXVlOworICAgIHByaXZhdGUgaW50IG1RdWV1ZVBvczsKKworICAgIHB1YmxpYyBUYWJsZXRUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBGcmFtZUxheW91dCBwYXJlbnQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtUGFyZW50ID0gcGFyZW50OworCisgICAgICAgIC8vIFRPRE86IE1ha2UgdGhpcyBhIGNvbmZpZ3VyYXRpb24gdmFsdWUuCisgICAgICAgIC8vIDMgaXMgZW5vdWdoIHRvIGxldCB1cyBzZWUgbW9zdCBjYXNlcywgYnV0IG5vdCBnZXQgc28gZmFyIGJlaGluZCB0aGF0IGl0J3MgYW5ub3lpbmcuCisgICAgICAgIG1RdWV1ZSA9IG5ldyBTdGF0dXNCYXJOb3RpZmljYXRpb25bM107CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkIG1DdXJyZW50Tm90aWZpY2F0aW9uPSIgKyBtQ3VycmVudE5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgbVF1ZXVlUG9zPSIgKyBtUXVldWVQb3MgKyAiIG1RdWV1ZT0iICsgQXJyYXlzLnRvU3RyaW5nKG1RdWV1ZSkpOworICAgICAgICB9CisgICAgICAgIG1RdWV1ZVttUXVldWVQb3NdID0gbm90aWZpY2F0aW9uOworCisgICAgICAgIC8vIElmIG5vdGhpbmcgaXMgcnVubmluZyBub3csIHN0YXJ0IHRoZSBuZXh0IG9uZQorICAgICAgICBpZiAobUN1cnJlbnROb3RpZmljYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShNU0dfQURWQU5DRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVF1ZXVlUG9zIDwgbVF1ZXVlLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgIG1RdWV1ZVBvcysrOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGFsdCgpIHsKKyAgICAgICAgcmVtb3ZlTWVzc2FnZXMoTVNHX0FEVkFOQ0UpOworICAgICAgICBpZiAobUN1cnJlbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVF1ZXVlLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtUXVldWVbaV0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVF1ZXVlUG9zID0gMDsKKyAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoTVNHX0FEVkFOQ0UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICBjYXNlIE1TR19BRFZBTkNFOgorICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZHZhbmNlKCkgeworICAgICAgICAvLyBPdXQgd2l0aCB0aGUgb2xkLi4uCisgICAgICAgIGlmIChtQ3VycmVudFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBhcmVudC5yZW1vdmVWaWV3KG1DdXJyZW50Vmlldyk7CisgICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBudWxsOworICAgICAgICAgICAgbUN1cnJlbnROb3RpZmljYXRpb24gPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW4gd2l0aCB0aGUgbmV3Li4uCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuZXh0ID0gZGVxdWV1ZSgpOworICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ3VycmVudE5vdGlmaWNhdGlvbiA9IG5leHQ7CisgICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtYWtlVGlja2VyVmlldyhuZXh0KTsKKyAgICAgICAgICAgIG1QYXJlbnQuYWRkVmlldyhtQ3VycmVudFZpZXcpOworICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX0FEVkFOQ0UsIEFEVkFOQ0VfREVMQVkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdGF0dXNCYXJOb3RpZmljYXRpb24gZGVxdWV1ZSgpIHsKKyAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG1RdWV1ZVswXTsKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZGVxdWV1ZSBtUXVldWVQb3M9IiArIG1RdWV1ZVBvcyArICIgbVF1ZXVlPSIgKyBBcnJheXMudG9TdHJpbmcobVF1ZXVlKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE4gPSBtUXVldWVQb3M7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIG1RdWV1ZVtpXSA9IG1RdWV1ZVtpKzFdOworICAgICAgICB9CisgICAgICAgIG1RdWV1ZVtOXSA9IG51bGw7CisgICAgICAgIGlmIChtUXVldWVQb3MgPiAwKSB7CisgICAgICAgICAgICBtUXVldWVQb3MtLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm90aWZpY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgVmlldyBtYWtlVGlja2VyVmlldyhTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbiBuID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKKworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworCisgICAgICAgIGludCBsYXlvdXRJZDsKKyAgICAgICAgVmlld0dyb3VwIGdyb3VwOworICAgICAgICBpZiAobi50aWNrZXJUaXRsZSAhPSBudWxsIHx8IG4udGlja2VyU3VidGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZ3JvdXAgPSAoVmlld0dyb3VwKWluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGlja2VyLCBtUGFyZW50LCBmYWxzZSk7CisgICAgICAgICAgICBpZiAobi50aWNrZXJUaXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGV4dFZpZXcgdGl0bGUgPSAoVGV4dFZpZXcpZ3JvdXAuZmluZFZpZXdCeUlkKFIuaWQudGl0bGUpOworICAgICAgICAgICAgICAgIHRpdGxlLnNldFRleHQobi50aWNrZXJUaXRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobi50aWNrZXJTdWJ0aXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGV4dFZpZXcgc3VidGl0bGUgPSAoVGV4dFZpZXcpZ3JvdXAuZmluZFZpZXdCeUlkKFIuaWQuc3VidGl0bGUpOworICAgICAgICAgICAgICAgIHN1YnRpdGxlLnNldFRleHQobi50aWNrZXJTdWJ0aXRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBncm91cCA9IChWaWV3R3JvdXApaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC50aWNrZXJfY29tcGF0LCBtUGFyZW50LCBmYWxzZSk7CisgICAgICAgICAgICBUZXh0VmlldyB0diA9IChUZXh0Vmlldylncm91cC5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgICAgIHR2LnNldFRleHQobi50aWNrZXJUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG1vcmUgdGhhbiAyIGljb25zLgorICAgICAgICBpZiAobi50aWNrZXJJY29ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgTiA9IG4udGlja2VySWNvbnMubGVuZ3RoOworICAgICAgICAgICAgaWYgKE4gPiAyKSB7CisgICAgICAgICAgICAgICAgTiA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpPU4tMTsgaT49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIEJpdG1hcCBiID0gbi50aWNrZXJJY29uc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEltYWdlVmlldyBpdiA9IChJbWFnZVZpZXcpaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC50aWNrZXJfaWNvbiwgZ3JvdXAsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaXYuc2V0SW1hZ2VCaXRtYXAoYik7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZFZpZXcoaXYsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBncm91cDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rCmluZGV4IGI0MTc1OWEuLjVkYzBjMzAgMTAwNzU1Ci0tLSBhL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsKKysrIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5tawpAQCAtNSw2ICs1LDcgQEAKIAlhbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwlmcmFtZXdvcmtzL2Jhc2UvbmF0aXZlL2luY2x1ZGUgXAogCSQoSk5JX0hfSU5DTFVERSkKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcCBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL2FuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwCmluZGV4IDFkNjkzNjEuLjhkYzg4ZGIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL2FuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwCisrKyBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL2FuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR29vZ2xlIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvam5pLmg+CiAjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDx0dHMvVHRzRW5naW5lLmg+CisjaW5jbHVkZSA8YW5kcm9pZC90dHMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogCkBAIC0xNTQsNyArMTU0LDcgQEAKIGNsYXNzIFN5bnRoUHJveHlKbmlTdG9yYWdlIHsKICAgICBwdWJsaWMgOgogICAgICAgICBqb2JqZWN0ICAgICAgICAgICAgICAgICAgIHR0c19yZWY7Ci0gICAgICAgIFR0c0VuZ2luZSogICAgICAgICAgICAgICAgbU5hdGl2ZVN5bnRoSW50ZXJmYWNlOworICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCogICAgICAgbUVuZ2luZTsKICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICBtRW5naW5lTGliSGFuZGxlOwogICAgICAgICBBdWRpb1RyYWNrKiAgICAgICAgICAgICAgIG1BdWRpb091dDsKICAgICAgICAgaW50OF90ICAgICAgICAgICAgICAgICAgICBtUGxheVN0YXRlOwpAQCAtMTY4LDcgKzE2OCw3IEBACiAKICAgICAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UoKSB7CiAgICAgICAgICAgICB0dHNfcmVmID0gTlVMTDsKLSAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZSA9IE5VTEw7CisgICAgICAgICAgICBtRW5naW5lID0gTlVMTDsKICAgICAgICAgICAgIG1FbmdpbmVMaWJIYW5kbGUgPSBOVUxMOwogICAgICAgICAgICAgbUF1ZGlvT3V0ID0gTlVMTDsKICAgICAgICAgICAgIG1QbGF5U3RhdGUgPSAgU1lOVEhQTEFZU1RBVEVfSVNfU1RPUFBFRDsKQEAgLTE4NCw5ICsxODQsOSBAQAogICAgICAgICB+U3ludGhQcm94eUpuaVN0b3JhZ2UoKSB7CiAgICAgICAgICAgICAvL0xPR1YoImVudGVyaW5nIH5TeW50aFByb3h5Sm5pU3RvcmFnZSgpIik7CiAgICAgICAgICAgICBraWxsQXVkaW8oKTsKLSAgICAgICAgICAgIGlmIChtTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgICAgICBtTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNodXRkb3duKCk7Ci0gICAgICAgICAgICAgICAgbU5hdGl2ZVN5bnRoSW50ZXJmYWNlID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChtRW5naW5lKSB7CisgICAgICAgICAgICAgICAgbUVuZ2luZS0+ZnVuY3MtPnNodXRkb3duKG1FbmdpbmUpOworICAgICAgICAgICAgICAgIG1FbmdpbmUgPSBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1FbmdpbmVMaWJIYW5kbGUpIHsKICAgICAgICAgICAgICAgICAvL0xPR0UoIn5TeW50aFByb3h5Sm5pU3RvcmFnZSgpOiBiZWZvcmUgY2xvc2UgbGlicmFyeSIpOwpAQCAtMjczLDI4ICsyNzMsNDUgQEAKICAqIENhbGxiYWNrIGZyb20gVFRTIGVuZ2luZS4KICAqIERpcmVjdGx5IHNwZWFrcyB1c2luZyBBdWRpb1RyYWNrIG9yIHdyaXRlIHRvIGZpbGUKICAqLwotc3RhdGljIHR0c19jYWxsYmFja19zdGF0dXMgdHRzU3ludGhEb25lQ0Iodm9pZCAqJiB1c2VyZGF0YSwgdWludDMyX3QgcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgaW50IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKiZ3YXYsIHNpemVfdCAmYnVmZmVyU2l6ZSwgdHRzX3N5bnRoX3N0YXR1cyBzdGF0dXMpIHsKK2V4dGVybiAiQyIgYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3QKK19fdHRzU3ludGhEb25lQ0Iodm9pZCAqKiBwVXNlcmRhdGEsIHVpbnQzMl90IHJhdGUsCisgICAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgaW50OF90ICoqcFdhdiwgc2l6ZV90ICpwQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190IHN0YXR1cykgCit7CiAgICAgLy9MT0dWKCJ0dHNTeW50aERvbmVDYWxsYmFjazogJWQgYnl0ZXMiLCBidWZmZXJTaXplKTsKKyAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0ICBlbmNvZGluZzsKIAotICAgIGlmICh1c2VyZGF0YSA9PSBOVUxMKXsKKyAgICBpZiAoKnBVc2VyZGF0YSA9PSBOVUxMKXsKICAgICAgICAgTE9HRSgidXNlcmRhdGEgPT0gTlVMTCIpOwotICAgICAgICByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgIH0KLSAgICBhZnRlclN5bnRoRGF0YV90KiBwRm9yQWZ0ZXIgPSAoYWZ0ZXJTeW50aERhdGFfdCopdXNlcmRhdGE7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CisgICAgICAgIGVuY29kaW5nID0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgZW5jb2RpbmcgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiQ2FuJ3QgcGxheSwgYmFkIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKKyAgICB9CisgICAgYWZ0ZXJTeW50aERhdGFfdCogcEZvckFmdGVyID0gKGFmdGVyU3ludGhEYXRhX3QqKSAqcFVzZXJkYXRhOwogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwSm5pRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopKHBGb3JBZnRlci0+am5pU3RvcmFnZSk7CiAKICAgICBpZiAocEZvckFmdGVyLT51c2FnZU1vZGUgPT0gVVNBR0VNT0RFX1BMQVlfSU1NRURJQVRFTFkpewogICAgICAgICAvL0xPR1YoIkRpcmVjdCBzcGVlY2giKTsKIAotICAgICAgICBpZiAod2F2ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCpwV2F2ID09IE5VTEwpIHsKICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CisgICAgICAgICAgICBwRm9yQWZ0ZXIgPSBOVUxMOwogICAgICAgICAgICAgTE9HVigiTnVsbDogc3BlZWNoIGhhcyBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGJ1ZmZlclNpemUgPiAwKSB7Ci0gICAgICAgICAgICBwcmVwQXVkaW9UcmFjayhwSm5pRGF0YSwgcEZvckFmdGVyLT5zdHJlYW1UeXBlLCByYXRlLCAoQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdClmb3JtYXQsIGNoYW5uZWwpOworICAgICAgICBpZiAoKnBCdWZmZXJTaXplID4gMCkgeworICAgICAgICAgICAgcHJlcEF1ZGlvVHJhY2socEpuaURhdGEsIHBGb3JBZnRlci0+c3RyZWFtVHlwZSwgcmF0ZSwgZW5jb2RpbmcsIGNoYW5uZWwpOwogICAgICAgICAgICAgaWYgKHBKbmlEYXRhLT5tQXVkaW9PdXQpIHsKICAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bVBsYXlMb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICBpZihwSm5pRGF0YS0+bUF1ZGlvT3V0LT5zdG9wcGVkKCkKQEAgLTMwMywyOCArMzIwLDMxIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBKbmlEYXRhLT5tUGxheUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYgKGJVc2VGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKGludDE2X3QqKXdhdiwgYnVmZmVyU2l6ZS8yKTsKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKGludDE2X3QqKSpwV2F2LCAqcEJ1ZmZlclNpemUvMik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBKbmlEYXRhLT5tQXVkaW9PdXQtPndyaXRlKHdhdiwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHdhdiwgMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgcEpuaURhdGEtPm1BdWRpb091dC0+d3JpdGUoKnBXYXYsICpwQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCpwV2F2LCAwLCAqcEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgIC8vTE9HVigiQXVkaW9UcmFjayB3cm90ZTogJWQgYnl0ZXMiLCBidWZmZXJTaXplKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiQ2FuJ3QgcGxheSwgbnVsbCBhdWRpb3RyYWNrIik7CisgICAgICAgICAgICAgICAgZGVsZXRlIHBGb3JBZnRlcjsKKyAgICAgICAgICAgICAgICBwRm9yQWZ0ZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlICBpZiAocEZvckFmdGVyLT51c2FnZU1vZGUgPT0gVVNBR0VNT0RFX1dSSVRFX1RPX0ZJTEUpIHsKICAgICAgICAgLy9MT0dWKCJTYXZlIHRvIGZpbGUiKTsKLSAgICAgICAgaWYgKHdhdiA9PSBOVUxMKSB7CisgICAgICAgIGlmICgqcFdhdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGUgcEZvckFmdGVyOwogICAgICAgICAgICAgTE9HVigiTnVsbDogc3BlZWNoIGhhcyBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVDsKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXJTaXplID4gMCl7CisgICAgICAgIGlmICgqcEJ1ZmZlclNpemUgPiAwKXsKICAgICAgICAgICAgIGlmIChiVXNlRmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKGludDE2X3QqKXdhdiwgYnVmZmVyU2l6ZS8yKTsKKyAgICAgICAgICAgICAgICBhcHBseUZpbHRlcigoaW50MTZfdCopKnBXYXYsICpwQnVmZmVyU2l6ZS8yKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZ3cml0ZSh3YXYsIDEsIGJ1ZmZlclNpemUsIHBGb3JBZnRlci0+b3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICBtZW1zZXQod2F2LCAwLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGZ3cml0ZSgqcFdhdiwgMSwgKnBCdWZmZXJTaXplLCBwRm9yQWZ0ZXItPm91dHB1dEZpbGUpOworICAgICAgICAgICAgbWVtc2V0KCpwV2F2LCAwLCAqcEJ1ZmZlclNpemUpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIEZ1dHVyZSB1cGRhdGU6CkBAIC0zMzIsNyArMzUyLDcgQEAKICAgICAvLyAgICAgIGphdmFUVFNGaWVsZHMuc3ludGhQcm94eU1ldGhvZFBvc3QgbWV0aG9kZSB0byBub3RpZnkKICAgICAvLyAgICAgIHBsYXliYWNrIGhhcyBjb21wbGV0ZWQgaWYgdGhlIHN5bnRoZXNpcyBpcyBkb25lIG9yIGlmIGEgbWFya2VyIGhhcyBiZWVuIHJlYWNoZWQuCiAKLSAgICBpZiAoc3RhdHVzID09IFRUU19TWU5USF9ET05FKSB7CisgICAgaWYgKHN0YXR1cyA9PSBBTkRST0lEX1RUU19TWU5USF9ET05FKSB7CiAgICAgICAgIC8vIHRoaXMgc3RydWN0IHdhcyBhbGxvY2F0ZWQgaW4gdGhlIG9yaWdpbmFsIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3BlYWsgY2FsbCwKICAgICAgICAgLy8gYWxsIHByb2Nlc3NpbmcgbWF0Y2hpbmcgdGhpcyBjYWxsIGlzIG5vdyBkb25lLgogICAgICAgICBMT0dWKCJTcGVlY2ggc3ludGhlc2lzIGRvbmUuIik7CkBAIC0zNDIsMTYgKzM2MiwxNiBAQAogICAgICAgICAgICAgZGVsZXRlIHBGb3JBZnRlcjsKICAgICAgICAgICAgIHBGb3JBZnRlciA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRUU19DQUxMQkFDS19IQUxUOworICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICB9CiAKICAgICAvLyB3ZSBkb24ndCB1cGRhdGUgdGhlIHdhdiAob3V0cHV0KSBwYXJhbWV0ZXIgYXMgd2UnbGwgbGV0IHRoZSBuZXh0IGNhbGxiYWNrCiAgICAgLy8gd3JpdGUgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdlJ3ZlIGNvbnN1bWVkIHRoZSBkYXRhIGFscmVhZHksIGJ1dCB3ZSBuZWVkCiAgICAgLy8gdG8gdXBkYXRlIGJ1ZmZlclNpemUgdG8gbGV0IHRoZSBUVFMgZW5naW5lIGtub3cgaG93IG11Y2ggaXQgY2FuIHdyaXRlIHRoZQogICAgIC8vIG5leHQgdGltZSBpdCBjYWxscyB0aGlzIGZ1bmN0aW9uLgotICAgIGJ1ZmZlclNpemUgPSBwSm5pRGF0YS0+bUJ1ZmZlclNpemU7CisgICAgKnBCdWZmZXJTaXplID0gcEpuaURhdGEtPm1CdWZmZXJTaXplOwogCi0gICAgcmV0dXJuIFRUU19DQUxMQkFDS19DT05USU5VRTsKKyAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfQ09OVElOVUU7CiB9CiAKIApAQCAtMzYwLDcgKzM4MCw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldExvd1NoZWxmKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpib29sZWFuIGFwcGx5RmlsdGVyLAogICAgICAgICBqZmxvYXQgZmlsdGVyR2FpbiwgamZsb2F0IGF0dGVudWF0aW9uSW5EYiwgamZsb2F0IGZyZXFJbkh6LCBqZmxvYXQgc2xvcGUpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19TVUNDRVNTOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19TVUNDRVNTOwogCiAgICAgYlVzZUZpbHRlciA9IGFwcGx5RmlsdGVyOwogICAgIGlmIChhcHBseUZpbHRlcikgewpAQCAtMzczLDcgKzM5Myw3IEBACiAgICAgICAgICAgICBpbml0aWFsaXplRVEoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExPR0UoIkludmFsaWQgc2xvcGUsIGNhbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgICAgICAgICAgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzg1LDcgKzQwNSw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X25hdGl2ZV9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAogICAgICAgICBqb2JqZWN0IHdlYWtfdGhpcywganN0cmluZyBuYXRpdmVTb0xpYiwganN0cmluZyBlbmdDb25maWcpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgYlVzZUZpbHRlciA9IGZhbHNlOwogCkBAIC00MDIsMTggKzQyMiwyOCBAQAogICAgIGlmIChlbmdpbmVfbGliX2hhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9uYXRpdmVfc2V0dXAoKTogZW5naW5lX2xpYl9oYW5kbGUgPT0gTlVMTCIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIFR0c0VuZ2luZSAqKCpnZXRfVHRzRW5naW5lKSgpID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VHRzRW5naW5lKiAoKikoKT4oZGxzeW0oZW5naW5lX2xpYl9oYW5kbGUsICJnZXRUdHNFbmdpbmUiKSk7CisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICogKCpnZXRfVHRzRW5naW5lKSgpID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8YW5kcm9pZF90dHNfZW5naW5lX3QqICgqKSgpPihkbHN5bShlbmdpbmVfbGliX2hhbmRsZSwgImFuZHJvaWRfZ2V0VHRzRW5naW5lIikpOwogCi0gICAgICAgIHBKbmlTdG9yYWdlLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UgPSAoKmdldF9UdHNFbmdpbmUpKCk7Ci0gICAgICAgIHBKbmlTdG9yYWdlLT5tRW5naW5lTGliSGFuZGxlID0gZW5naW5lX2xpYl9oYW5kbGU7Ci0KLSAgICAgICAgaWYgKHBKbmlTdG9yYWdlLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKGVuZ2luZU11dGV4KTsKLSAgICAgICAgICAgIHBKbmlTdG9yYWdlLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmluaXQodHRzU3ludGhEb25lQ0IsIGVuZ0NvbmZpZ1N0cmluZyk7CisgICAgICAgIC8vIFN1cHBvcnQgb2Jzb2xldGUvbGVnYWN5IGJpbmFyeSBtb2R1bGVzCisgICAgICAgIGlmIChnZXRfVHRzRW5naW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdldF9UdHNFbmdpbmUgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8YW5kcm9pZF90dHNfZW5naW5lX3QqICgqKSgpPihkbHN5bShlbmdpbmVfbGliX2hhbmRsZSwgImdldFR0c0VuZ2luZSIpKTsKICAgICAgICAgfQogCi0gICAgICAgIHJlc3VsdCA9IFRUU19TVUNDRVNTOworICAgICAgICBwSm5pU3RvcmFnZS0+bUVuZ2luZSA9ICgqZ2V0X1R0c0VuZ2luZSkoKTsKKyAgICAgICAgcEpuaVN0b3JhZ2UtPm1FbmdpbmVMaWJIYW5kbGUgPSBlbmdpbmVfbGliX2hhbmRsZTsKKworICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcEpuaVN0b3JhZ2UtPm1FbmdpbmU7CisgICAgICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKGVuZ2luZU11dGV4KTsKKyAgICAgICAgICAgIGVuZ2luZS0+ZnVuY3MtPmluaXQoCisgICAgICAgICAgICAgICAgZW5naW5lLAorICAgICAgICAgICAgICAgIF9fdHRzU3ludGhEb25lQ0IsCisgICAgICAgICAgICAgICAgZW5nQ29uZmlnU3RyaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IEFORFJPSURfVFRTX1NVQ0NFU1M7CiAgICAgfQogCiAgICAgLy8gd2UgdXNlIGEgd2VhayByZWZlcmVuY2Ugc28gdGhlIFN5bnRoUHJveHkgb2JqZWN0IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KQEAgLTQ2Miw3ICs0OTIsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9pc0xhbmd1YWdlQXZhaWxhYmxlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyBsYW5ndWFnZSwganN0cmluZyBjb3VudHJ5LCBqc3RyaW5nIHZhcmlhbnQpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19MQU5HX05PVF9TVVBQT1JURUQ7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9pc0xhbmd1YWdlQXZhaWxhYmxlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTQ3NCw4ICs1MDQsMTAgQEAKICAgICBjb25zdCBjaGFyICpjb3VudHJ5TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhjb3VudHJ5LCAwKTsKICAgICBjb25zdCBjaGFyICp2YXJpYW50TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh2YXJpYW50LCAwKTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5pc0xhbmd1YWdlQXZhaWxhYmxlKGxhbmdOYXRpdmVTdHJpbmcsCisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPmlzTGFuZ3VhZ2VBdmFpbGFibGUoZW5naW5lLGxhbmdOYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICAgICAgY291bnRyeU5hdGl2ZVN0cmluZywgdmFyaWFudE5hdGl2ZVN0cmluZyk7CiAgICAgfQogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCBsYW5nTmF0aXZlU3RyaW5nKTsKQEAgLTQ4Nyw3ICs1MTksNyBAQAogc3RhdGljIGludAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRDb25maWcoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLCBqc3RyaW5nIGVuZ2luZUNvbmZpZykKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0Q29uZmlnKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTQ5OCw5ICs1MzAsMTAgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogICAgIGNvbnN0IGNoYXIgKmVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZW5naW5lQ29uZmlnLCAwKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRQcm9wZXJ0eShBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfQ09ORklHLAorICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c2V0UHJvcGVydHkoZW5naW5lLEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9DT05GSUcsCiAgICAgICAgICAgICAgICAgZW5naW5lQ29uZmlnTmF0aXZlU3RyaW5nLCBzdHJsZW4oZW5naW5lQ29uZmlnTmF0aXZlU3RyaW5nKSk7CiAgICAgfQogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGVuZ2luZUNvbmZpZywgZW5naW5lQ29uZmlnTmF0aXZlU3RyaW5nKTsKQEAgLTUxMiw3ICs1NDUsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRMYW5ndWFnZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgbGFuZ3VhZ2UsIGpzdHJpbmcgY291bnRyeSwganN0cmluZyB2YXJpYW50KQogewotICAgIGludCByZXN1bHQgPSBUVFNfTEFOR19OT1RfU1VQUE9SVEVEOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQ7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0TGFuZ3VhZ2UoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNTI1LDkgKzU1OCwxMCBAQAogICAgIGNvbnN0IGNoYXIgKmxhbmdOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCAwKTsKICAgICBjb25zdCBjaGFyICpjb3VudHJ5TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhjb3VudHJ5LCAwKTsKICAgICBjb25zdCBjaGFyICp2YXJpYW50TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh2YXJpYW50LCAwKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRMYW5ndWFnZShsYW5nTmF0aXZlU3RyaW5nLAorICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c2V0TGFuZ3VhZ2UoZW5naW5lLCBsYW5nTmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIGNvdW50cnlOYXRpdmVTdHJpbmcsIHZhcmlhbnROYXRpdmVTdHJpbmcpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgbGFuZ05hdGl2ZVN0cmluZyk7CkBAIC01NDEsNyArNTc1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbG9hZExhbmd1YWdlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyBsYW5ndWFnZSwganN0cmluZyBjb3VudHJ5LCBqc3RyaW5nIHZhcmlhbnQpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19MQU5HX05PVF9TVVBQT1JURUQ7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9sb2FkTGFuZ3VhZ2UoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNTUyLDkgKzU4NiwxMCBAQAogICAgIGNvbnN0IGNoYXIgKmxhbmdOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCAwKTsKICAgICBjb25zdCBjaGFyICpjb3VudHJ5TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhjb3VudHJ5LCAwKTsKICAgICBjb25zdCBjaGFyICp2YXJpYW50TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh2YXJpYW50LCAwKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5sb2FkTGFuZ3VhZ2UobGFuZ05hdGl2ZVN0cmluZywKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPmxvYWRMYW5ndWFnZShlbmdpbmUsIGxhbmdOYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICAgICAgY291bnRyeU5hdGl2ZVN0cmluZywgdmFyaWFudE5hdGl2ZVN0cmluZyk7CiAgICAgfQogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCBsYW5nTmF0aXZlU3RyaW5nKTsKQEAgLTU2OSw3ICs2MDQsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRTcGVlY2hSYXRlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAgamludCBzcGVlY2hSYXRlKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRTcGVlY2hSYXRlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTU4NCw5ICs2MTksMTAgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogICAgIExPR0koInNldHRpbmcgc3BlZWNoIHJhdGUgdG8gJWQiLCBzcGVlY2hSYXRlKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRQcm9wZXJ0eSgicmF0ZSIsIGJ1ZmZlciwgYnVmU2l6ZSk7CisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zZXRQcm9wZXJ0eShlbmdpbmUsICJyYXRlIiwgYnVmZmVyLCBidWZTaXplKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNTk3LDcgKzYzMyw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldFBpdGNoKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAgamludCBwaXRjaCkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0UGl0Y2goKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNjEyLDkgKzY0OCwxMCBAQAogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7CiAgICAgTE9HSSgic2V0dGluZyBwaXRjaCB0byAlZCIsIHBpdGNoKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRQcm9wZXJ0eSgicGl0Y2giLCBidWZmZXIsIGJ1ZlNpemUpOworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c2V0UHJvcGVydHkoZW5naW5lLCAicGl0Y2giLCBidWZmZXIsIGJ1ZlNpemUpOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC02MjUsNyArNjYyLDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgdGV4dEphdmFTdHJpbmcsIGpzdHJpbmcgZmlsZW5hbWVKYXZhU3RyaW5nKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zeW50aGVzaXplVG9GaWxlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTYzMyw3ICs2NzAsNyBAQAogICAgIH0KIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwotICAgIGlmICghcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7CisgICAgaWYgKCFwU3ludGhEYXRhLT5tRW5naW5lKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZSgpOiBpbnZhbGlkIGVuZ2luZSBoYW5kbGUiKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC02NDMsMTIgKzY4MCwyMiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsKGVuZ2luZU11dGV4KTsKIAogICAgIC8vIFJldHJpZXZlIGF1ZGlvIHBhcmFtZXRlcnMgYmVmb3JlIHdyaXRpbmcgdGhlIGZpbGUgaGVhZGVyCi0gICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCBlbmNvZGluZyA9IERFRkFVTFRfVFRTX0ZPUk1BVDsKKyAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0IGVuY29kaW5nOwogICAgIHVpbnQzMl90IHJhdGUgPSBERUZBVUxUX1RUU19SQVRFOwogICAgIGludCBjaGFubmVscyA9IERFRkFVTFRfVFRTX05CX0NIQU5ORUxTOwotICAgIHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0QXVkaW9Gb3JtYXQoZW5jb2RpbmcsIHJhdGUsIGNoYW5uZWxzKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCAgZm9ybWF0ID0gQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAKLSAgICBpZiAoKGVuY29kaW5nICE9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSAmJiAoZW5jb2RpbmcgIT0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVCkpIHsKKyAgICBlbmdpbmUtPmZ1bmNzLT5zZXRBdWRpb0Zvcm1hdChlbmdpbmUsICZmb3JtYXQsICZyYXRlLCAmY2hhbm5lbHMpOworCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CisgICAgICAgIGVuY29kaW5nID0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zeW50aGVzaXplVG9GaWxlKCk6IGVuZ2luZSB1c2VzIGludmFsaWQgZm9ybWF0Iik7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNjc3LDcgKzcyNCw4IEBACiAgICAgdW5zaWduZWQgaW50IHVuaXF1ZV9pZGVudGlmaWVyOwogCiAgICAgbWVtc2V0KHBTeW50aERhdGEtPm1CdWZmZXIsIDAsIHBTeW50aERhdGEtPm1CdWZmZXJTaXplKTsKLSAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnN5bnRoZXNpemVUZXh0KHRleHROYXRpdmVTdHJpbmcsCisKKyAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zeW50aGVzaXplVGV4dChlbmdpbmUsIHRleHROYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICBwU3ludGhEYXRhLT5tQnVmZmVyLCBwU3ludGhEYXRhLT5tQnVmZmVyU2l6ZSwgKHZvaWQgKilwRm9yQWZ0ZXIpOwogCiAgICAgbG9uZyBmaWxlbGVuID0gZnRlbGwocEZvckFmdGVyLT5vdXRwdXRGaWxlKTsKQEAgLTczNyw3ICs3ODUsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zcGVhayhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgdGV4dEphdmFTdHJpbmcsIGppbnQgamF2YVN0cmVhbVR5cGUpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NwZWFrKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTc1OSwxMCArODA3LDEyIEBACiAgICAgcEZvckFmdGVyLT51c2FnZU1vZGUgID0gVVNBR0VNT0RFX1BMQVlfSU1NRURJQVRFTFk7CiAgICAgcEZvckFmdGVyLT5zdHJlYW1UeXBlID0gKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSkgamF2YVN0cmVhbVR5cGU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7CisgICAgaWYgKHBTeW50aERhdGEtPm1FbmdpbmUpIHsKICAgICAgICAgY29uc3QgY2hhciAqdGV4dE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModGV4dEphdmFTdHJpbmcsIDApOwogICAgICAgICBtZW1zZXQocFN5bnRoRGF0YS0+bUJ1ZmZlciwgMCwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUpOwotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnN5bnRoZXNpemVUZXh0KHRleHROYXRpdmVTdHJpbmcsCisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworCisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnN5bnRoZXNpemVUZXh0KGVuZ2luZSwgdGV4dE5hdGl2ZVN0cmluZywKICAgICAgICAgICAgICAgICBwU3ludGhEYXRhLT5tQnVmZmVyLCBwU3ludGhEYXRhLT5tQnVmZmVyU2l6ZSwgKHZvaWQgKilwRm9yQWZ0ZXIpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyh0ZXh0SmF2YVN0cmluZywgdGV4dE5hdGl2ZVN0cmluZyk7CiAgICAgfQpAQCAtNzc0LDcgKzgyNCw3IEBACiBzdGF0aWMgaW50CiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3N0b3AoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zdG9wKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTc5MCw4ICs4NDAsOSBAQAogICAgIH0KICAgICBwU3ludGhEYXRhLT5tUGxheUxvY2sudW5sb2NrKCk7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c3RvcCgpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c3RvcChlbmdpbmUpOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC04MDEsNyArODUyLDcgQEAKIHN0YXRpYyBpbnQKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcFN5bmMoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zdG9wKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTgyOSw3ICs4ODAsNyBAQAogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7CisgICAgaWYgKHBTeW50aERhdGEtPm1FbmdpbmUpIHsKICAgICAgICAgc2l6ZV90IGJ1ZlNpemUgPSAxMDA7CiAgICAgICAgIGNoYXIgbGFuZ1tidWZTaXplXTsKICAgICAgICAgY2hhciBjb3VudHJ5W2J1ZlNpemVdOwpAQCAtODM5LDcgKzg5MCw5IEBACiAgICAgICAgIG1lbXNldCh2YXJpYW50LCAwLCBidWZTaXplKTsKICAgICAgICAgam9iamVjdEFycmF5IHJldExvY2FsZSA9IChqb2JqZWN0QXJyYXkpZW52LT5OZXdPYmplY3RBcnJheSgzLAogICAgICAgICAgICAgICAgIGVudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvU3RyaW5nIiksIGVudi0+TmV3U3RyaW5nVVRGKCIiKSk7Ci0gICAgICAgIHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+Z2V0TGFuZ3VhZ2UobGFuZywgY291bnRyeSwgdmFyaWFudCk7CisKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgICAgIGVuZ2luZS0+ZnVuY3MtPmdldExhbmd1YWdlKGVuZ2luZSwgbGFuZywgY291bnRyeSwgdmFyaWFudCk7CiAgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldExvY2FsZSwgMCwgZW52LT5OZXdTdHJpbmdVVEYobGFuZykpOwogICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChyZXRMb2NhbGUsIDEsIGVudi0+TmV3U3RyaW5nVVRGKGNvdW50cnkpKTsKICAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQocmV0TG9jYWxlLCAyLCBlbnYtPk5ld1N0cmluZ1VURih2YXJpYW50KSk7CkBAIC04NjQsOCArOTE3LDkgQEAKICAgICBjaGFyIGJ1ZltidWZTaXplXTsKICAgICBtZW1zZXQoYnVmLCAwLCBidWZTaXplKTsKICAgICAvLyBUT0RPIGNoZWNrIHJldHVybiBjb2RlcwotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5nZXRQcm9wZXJ0eSgicmF0ZSIsIGJ1ZiwgJmJ1ZlNpemUpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLT5mdW5jcy0+Z2V0UHJvcGVydHkoZW5naW5lLCJyYXRlIiwgYnVmLCAmYnVmU2l6ZSk7CiAgICAgfQogICAgIHJldHVybiBhdG9pKGJ1Zik7CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9WcG5TZXJ2aWNlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvVnBuU2VydmljZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAppbmRleCA0YTkzZTBhLi44MGZlZmE0IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9WcG5TZXJ2aWNlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL1ZwblNlcnZpY2VzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKQEAgLTIsNyArMiw3IEBACiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CiAgICAgPHN0cmluZyBuYW1lPSJhcHBfbGFiZWwiIG1zZ2lkPSI0NTg5NTkyODI5MzAyNDk4MTAyIj4iU2VydmljZXMgVlBOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idnBuX25vdGlmaWNhdGlvbl90aXRsZV9jb25uZWN0ZWQiIG1zZ2lkPSI4NTk4NjU0NDg2OTU2MTMzNTgwIj4iVlBOIDx4bGlmZjpnIGlkPSJQUk9GSUxFTkFNRSI+JXM8L3hsaWZmOmc+IGNvbm5lY3TDqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InZwbl9ub3RpZmljYXRpb25fdGl0bGVfY29ubmVjdGVkIiBtc2dpZD0iODU5ODY1NDQ4Njk1NjEzMzU4MCI+IlZQTiBcbjx4bGlmZjpnIGlkPSJQUk9GSUxFTkFNRSI+JXM8L3hsaWZmOmc+IGNvbm5lY3TDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InZwbl9ub3RpZmljYXRpb25fdGl0bGVfZGlzY29ubmVjdGVkIiBtc2dpZD0iNjIxNjU3MjI2NDM4MjE5MjAyNyI+IlZQTiA8eGxpZmY6ZyBpZD0iUFJPRklMRU5BTUUiPiVzPC94bGlmZjpnPiBkw6ljb25uZWN0w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ2cG5fbm90aWZpY2F0aW9uX2hpbnRfZGlzY29ubmVjdGVkIiBtc2dpZD0iMTk1MjIwOTg2NzA4MjI2OTQyOSI+IlRvdWNoZXogbFwnw6ljcmFuIHBvdXIgdm91cyByZWNvbm5lY3RlciDDoCB1biBWUE4uIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhCmluZGV4IGJhMWQ3ZjUuLjcwYTRiMjAgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhCkBAIC0xMTMsNyArMTEzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CiAgICAgICAgICAgICBscC5zb2Z0SW5wdXRNb2RlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfUEFOOwogICAgICAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX0xvY2tTY3JlZW47Ci0gICAgICAgICAgICBscC5zY3JlZW5PcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTk9TRU5TT1I7CisKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfZW5hYmxlTG9ja1NjcmVlblJvdGF0aW9uKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdGF0aW9uIHNlbnNvciBmb3IgbG9jayBzY3JlZW4gT24hIik7CisgICAgICAgICAgICAgICAgbHAuc2NyZWVuT3JpZW50YXRpb24gPSBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1NFTlNPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm90YXRpb24gc2Vuc29yIGZvciBsb2NrIHNjcmVlbiBPZmYhIik7CisgICAgICAgICAgICAgICAgbHAuc2NyZWVuT3JpZW50YXRpb24gPSBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX05PU0VOU09SOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBscC5zZXRUaXRsZSgiS2V5Z3VhcmQiKTsKICAgICAgICAgICAgIG1XaW5kb3dMYXlvdXRQYXJhbXMgPSBscDsKIApkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhCmluZGV4IDg4MjAzYzMuLmQxOWYzMTggMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWVkaWF0b3IuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuaW1wbDsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fT0ZGX1RJTUVPVVQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5VdGlsczsKIApAQCAtNDEsNiArNDMsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKQEAgLTkzLDYgKzk2LDcgQEAKICAqLwogcHVibGljIGNsYXNzIEtleWd1YXJkVmlld01lZGlhdG9yIGltcGxlbWVudHMgS2V5Z3VhcmRWaWV3Q2FsbGJhY2ssCiAgICAgICAgIEtleWd1YXJkVXBkYXRlTW9uaXRvci5TaW1TdGF0ZUNhbGxiYWNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZR1VBUkRfRElTUExBWV9USU1FT1VUX0RFTEFZX0RFRkFVTFQgPSAzMDAwMDsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2UgJiYgQ29uZmlnLkxPR0Q7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBEQkdfV0FLRSA9IERFQlVHIHx8IHRydWU7CiAKQEAgLTEzMyw3ICsxMzcsNyBAQAogICAgICAqIHR1cm5pbmcgb24gdGhlIGtleWd1YXJkIChpLmUsIHRoZSB1c2VyIGhhcyB0aGlzIG11Y2ggdGltZSB0byB0dXJuCiAgICAgICogdGhlIHNjcmVlbiBiYWNrIG9uIHdpdGhvdXQgaGF2aW5nIHRvIGZhY2UgdGhlIGtleWd1YXJkKS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZR1VBUkRfREVMQVlfTVMgPSA1MDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlHVUFSRF9MT0NLX0FGVEVSX0RFTEFZX0RFRkFVTFQgPSA1MDAwOwogCiAgICAgLyoqCiAgICAgICogSG93IGxvbmcgd2UnbGwgd2FpdCBmb3IgdGhlIHtAbGluayBLZXlndWFyZFZpZXdDYWxsYmFjayNrZXlndWFyZERvbmVEcmF3aW5nKCl9CkBAIC0yNDQsNiArMjQ4LDcgQEAKICAgICAgKiB0aGUga2V5Z3VhcmQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1XYWl0aW5nVW50aWxLZXlndWFyZFZpc2libGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIExvY2tQYXR0ZXJuVXRpbHMgbUxvY2tQYXR0ZXJuVXRpbHM7CiAKICAgICBwdWJsaWMgS2V5Z3VhcmRWaWV3TWVkaWF0b3IoQ29udGV4dCBjb250ZXh0LCBQaG9uZVdpbmRvd01hbmFnZXIgY2FsbGJhY2ssCiAgICAgICAgICAgICBMb2NhbFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIpIHsKQEAgLTI3NSw4ICsyODAsOSBAQAogCiAgICAgICAgIG1VcGRhdGVNb25pdG9yLnJlZ2lzdGVyU2ltU3RhdGVDYWxsYmFjayh0aGlzKTsKIAotICAgICAgICBtS2V5Z3VhcmRWaWV3UHJvcGVydGllcyA9IG5ldyBMb2NrUGF0dGVybktleWd1YXJkVmlld1Byb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgbmV3IExvY2tQYXR0ZXJuVXRpbHMobUNvbnRleHQpLCBtVXBkYXRlTW9uaXRvcik7CisgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzID0gbmV3IExvY2tQYXR0ZXJuVXRpbHMobUNvbnRleHQpOworICAgICAgICBtS2V5Z3VhcmRWaWV3UHJvcGVydGllcyAKKyAgICAgICAgICAgICAgICA9IG5ldyBMb2NrUGF0dGVybktleWd1YXJkVmlld1Byb3BlcnRpZXMobUxvY2tQYXR0ZXJuVXRpbHMsIG1VcGRhdGVNb25pdG9yKTsKIAogICAgICAgICBtS2V5Z3VhcmRWaWV3TWFuYWdlciA9IG5ldyBLZXlndWFyZFZpZXdNYW5hZ2VyKAogICAgICAgICAgICAgICAgIGNvbnRleHQsIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKSwgdGhpcywKQEAgLTMyNiwxNSArMzMyLDQ2IEBACiAgICAgICAgICAgICAgICAgLy8gdG8gZW5hYmxlIGl0IGEgbGl0dGxlIGJpdCBsYXRlciAoaS5lLCBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlCiAgICAgICAgICAgICAgICAgLy8gdG8gdHVybiB0aGUgc2NyZWVuIGJhY2sgb24gd2l0aGluIGEgY2VydGFpbiB3aW5kb3cgd2l0aG91dAogICAgICAgICAgICAgICAgIC8vIGhhdmluZyB0byB1bmxvY2sgdGhlIHNjcmVlbikKLSAgICAgICAgICAgICAgICBsb25nIHdoZW4gPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIEtFWUdVQVJEX0RFTEFZX01TOwotICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KERFTEFZRURfS0VZR1VBUkRfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInNlcSIsIG1EZWxheWVkU2hvd2luZ1NlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbmRlciA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KG1Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgaW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfQ0FOQ0VMX0NVUlJFTlQpOwotICAgICAgICAgICAgICAgIG1BbGFybU1hbmFnZXIuc2V0KEFsYXJtTWFuYWdlci5FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwgd2hlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzZXR0aW5nIGFsYXJtIHRvIHR1cm4gb2ZmIGtleWd1YXJkLCBzZXEgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1EZWxheWVkU2hvd2luZ1NlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKworICAgICAgICAgICAgICAgIC8vIEZyb20gRGlzcGxheVNldHRpbmdzCisgICAgICAgICAgICAgICAgbG9uZyBkaXNwbGF5VGltZW91dCA9IFNldHRpbmdzLlN5c3RlbS5nZXRJbnQoY3IsIFNDUkVFTl9PRkZfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtFWUdVQVJEX0RJU1BMQVlfVElNRU9VVF9ERUxBWV9ERUZBVUxUKTsKKworICAgICAgICAgICAgICAgIC8vIEZyb20gU2VjdXJpdHlTZXR0aW5ncworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbG9ja0FmdGVyVGltZW91dCA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY3IsCisgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuTE9DS19TQ1JFRU5fTE9DS19BRlRFUl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZR1VBUkRfTE9DS19BRlRFUl9ERUxBWV9ERUZBVUxUKTsKKworICAgICAgICAgICAgICAgIC8vIEZyb20gRGV2aWNlUG9saWN5QWRtaW4KKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvbGljeVRpbWVvdXQgPSBtTG9ja1BhdHRlcm5VdGlscy5nZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNYXhpbXVtVGltZVRvTG9jayhudWxsKTsKKworICAgICAgICAgICAgICAgIGxvbmcgdGltZW91dDsKKyAgICAgICAgICAgICAgICBpZiAocG9saWN5VGltZW91dCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9saWN5IGluIGVmZmVjdC4gTWFrZSBzdXJlIHdlIGRvbid0IGdvIGJleW9uZCBwb2xpY3kgbGltaXQuCisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUaW1lb3V0ID0gTWF0aC5tYXgoZGlzcGxheVRpbWVvdXQsIDApOyAvLyBpZ25vcmUgbmVnYXRpdmUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBNYXRoLm1pbihwb2xpY3lUaW1lb3V0IC0gZGlzcGxheVRpbWVvdXQsIGxvY2tBZnRlclRpbWVvdXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBsb2NrQWZ0ZXJUaW1lb3V0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0IDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9jayBub3cKKyAgICAgICAgICAgICAgICAgICAgbVN1cHByZXNzTmV4dExvY2tTb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGRvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBMb2NrIGluIHRoZSBmdXR1cmUKKyAgICAgICAgICAgICAgICAgICAgbG9uZyB3aGVuID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgKyB0aW1lb3V0OworICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChERUxBWUVEX0tFWUdVQVJEX0FDVElPTik7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgic2VxIiwgbURlbGF5ZWRTaG93aW5nU2VxdWVuY2UpOworICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbmRlciA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KG1Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGludGVudCwgUGVuZGluZ0ludGVudC5GTEFHX0NBTkNFTF9DVVJSRU5UKTsKKyAgICAgICAgICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5zZXQoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCB3aGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2V0dGluZyBhbGFybSB0byB0dXJuIG9mZiBrZXlndWFyZCwgc2VxID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbURlbGF5ZWRTaG93aW5nU2VxdWVuY2UpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAod2h5ID09IFdpbmRvd01hbmFnZXJQb2xpY3kuT0ZGX0JFQ0FVU0VfT0ZfUFJPWF9TRU5TT1IpIHsKICAgICAgICAgICAgICAgICAvLyBEbyBub3QgZW5hYmxlIHRoZSBrZXlndWFyZCBpZiB0aGUgcHJveCBzZW5zb3IgZm9yY2VkIHRoZSBzY3JlZW4gb2ZmLgogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQppbmRleCAyNzcwNmVmLi44MjJiZTQ2IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCkBAIC02NDUsNyArNjQ1LDkgQEAKICAgICAgICAgICAgIC8vIFNob3cgTG9ja1NjcmVlbiBmaXJzdCBmb3IgYW55IHNjcmVlbiBvdGhlciB0aGFuIFBhdHRlcm4gdW5sb2NrLgogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1c2luZ0xvY2tQYXR0ZXJuID0gbUxvY2tQYXR0ZXJuVXRpbHMuZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKQogICAgICAgICAgICAgICAgICAgICA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HOwotICAgICAgICAgICAgaWYgKGlzU2VjdXJlKCkgJiYgdXNpbmdMb2NrUGF0dGVybikgeworCisgICAgICAgICAgICBib29sZWFuIHNob3dTbGlkaW5nVGFiID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbihSLmJvb2wuY29uZmlnX2VuYWJsZVNsaWRpbmdUYWJGaXJzdCk7CisgICAgICAgICAgICBpZiAoaXNTZWN1cmUoKSAmJiAodXNpbmdMb2NrUGF0dGVybiB8fCAhc2hvd1NsaWRpbmdUYWIpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE1vZGUuVW5sb2NrU2NyZWVuOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTW9kZS5Mb2NrU2NyZWVuOwpAQCAtNjY3LDYgKzY2OSw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQzoKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDOgogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzoKKyAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgogICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kZSA9IFVubG9ja01vZGUuUGFzc3dvcmQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORzoKQEAgLTY4Nyw4ICs2OTAsMTcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBzaG93VGltZW91dERpYWxvZygpIHsKICAgICAgICAgaW50IHRpbWVvdXRJblNlY29uZHMgPSAoaW50KSBMb2NrUGF0dGVyblV0aWxzLkZBSUxFRF9BVFRFTVBUX1RJTUVPVVRfTVMgLyAxMDAwOworICAgICAgICBpbnQgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2U7CisgICAgICAgIGlmKGdldFVubG9ja01vZGUoKSA9PSBVbmxvY2tNb2RlLlBhc3N3b3JkKSB7CisgICAgICAgICAgICBpZihtTG9ja1BhdHRlcm5VdGlscy5nZXRLZXlndWFyZFN0b3JlZFBhc3N3b3JkUXVhbGl0eSgpID09CisgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMpIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlSWQgPSBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbUNvbnRleHQuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCwKICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRGYWlsZWRBdHRlbXB0cygpLAogICAgICAgICAgICAgICAgIHRpbWVvdXRJblNlY29uZHMpOwogICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2cgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEKaW5kZXggYTVlZjFmYS4uMTM4MzM1NCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEKQEAgLTIwLDYgKzIwLDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5VdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ1RhYjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuV2F2ZVZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LldhdmVWaWV3Lk9uVHJpZ2dlckxpc3RlbmVyOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwpAQCAtNDYsOCArNDgsOSBAQAogICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBkZXBlbmRpbmcgb24gaXRzIHN0YXRlLCBhbmQgaG93IHRvIGdldAogICogcGFzdCBpdCwgYXMgYXBwbGljYWJsZS4KICAqLwotY2xhc3MgTG9ja1NjcmVlbiBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIEtleWd1YXJkU2NyZWVuLCBLZXlndWFyZFVwZGF0ZU1vbml0b3IuSW5mb0NhbGxiYWNrLAotICAgICAgICBLZXlndWFyZFVwZGF0ZU1vbml0b3IuU2ltU3RhdGVDYWxsYmFjaywgU2xpZGluZ1RhYi5PblRyaWdnZXJMaXN0ZW5lciB7CitjbGFzcyBMb2NrU2NyZWVuIGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgS2V5Z3VhcmRTY3JlZW4sCisgICAgICAgIEtleWd1YXJkVXBkYXRlTW9uaXRvci5JbmZvQ2FsbGJhY2ssCisgICAgICAgIEtleWd1YXJkVXBkYXRlTW9uaXRvci5TaW1TdGF0ZUNhbGxiYWNrIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2NrU2NyZWVuIjsKQEAgLTU5LDEyICs2Miw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFVwZGF0ZU1vbml0b3IgbVVwZGF0ZU1vbml0b3I7CiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFNjcmVlbkNhbGxiYWNrIG1DYWxsYmFjazsKIAotICAgIHByaXZhdGUgVGV4dFZpZXcgbUNhcnJpZXI7Ci0gICAgcHJpdmF0ZSBTbGlkaW5nVGFiIG1TZWxlY3RvcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbURhdGU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMyOworICAgIHByaXZhdGUgU2xpZGluZ1RhYiBtU2xpZGluZ1RhYjsKICAgICBwcml2YXRlIFRleHRWaWV3IG1TY3JlZW5Mb2NrZWQ7CiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtRW1lcmdlbmN5Q2FsbFRleHQ7CiAgICAgcHJpdmF0ZSBCdXR0b24gbUVtZXJnZW5jeUNhbGxCdXR0b247CkBAIC05Myw2ICs5MSwxMSBAQAogICAgIHByaXZhdGUgamF2YS50ZXh0LkRhdGVGb3JtYXQgbVRpbWVGb3JtYXQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVNZW51S2V5SW5Mb2NrU2NyZWVuOwogCisgICAgcHJpdmF0ZSBTdGF0dXNWaWV3IG1TdGF0dXNWaWV3OworICAgIHByaXZhdGUgV2F2ZVZpZXcgbUVuZXJneVdhdmU7CisgICAgcHJpdmF0ZSBTbGlkaW5nVGFiTWV0aG9kcyBtU2xpZGluZ1RhYk1ldGhvZHM7CisgICAgcHJpdmF0ZSBXYXZlVmlld01ldGhvZHMgbVdhdmVWaWV3TWV0aG9kczsKKwogICAgIC8qKgogICAgICAqIFRoZSBzdGF0dXMgb2YgdGhpcyBsb2NrIHNjcmVlbi4KICAgICAgKi8KQEAgLTE0NCw2ICsxNDcsOTggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGNsYXNzIFNsaWRpbmdUYWJNZXRob2RzIGltcGxlbWVudHMgU2xpZGluZ1RhYi5PblRyaWdnZXJMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJpZ2h0VGFiUmVzb3VyY2VzKCkgeworICAgICAgICAgICAgYm9vbGVhbiB2aWJlID0gbVNpbGVudE1vZGUKKyAgICAgICAgICAgICAgICAmJiAobUF1ZGlvTWFuYWdlci5nZXRSaW5nZXJNb2RlKCkgPT0gQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1ZJQlJBVEUpOworCisgICAgICAgICAgICBtU2xpZGluZ1RhYi5zZXRSaWdodFRhYlJlc291cmNlcygKKyAgICAgICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyAoIHZpYmUgPyBSLmRyYXdhYmxlLmljX2pvZ19kaWFsX3ZpYnJhdGVfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX2pvZ19kaWFsX3NvdW5kX29mZiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5pY19qb2dfZGlhbF9zb3VuZF9vbiwKKyAgICAgICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyBSLmRyYXdhYmxlLmpvZ190YWJfdGFyZ2V0X3llbGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuam9nX3RhYl90YXJnZXRfZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyBSLmRyYXdhYmxlLmpvZ190YWJfYmFyX3JpZ2h0X3NvdW5kX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5qb2dfdGFiX2Jhcl9yaWdodF9zb3VuZF9vZmYsCisgICAgICAgICAgICAgICAgICAgIG1TaWxlbnRNb2RlID8gUi5kcmF3YWJsZS5qb2dfdGFiX3JpZ2h0X3NvdW5kX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5qb2dfdGFiX3JpZ2h0X3NvdW5kX29mZik7CisgICAgICAgIH0KKworICAgICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblRyaWdnZXIoVmlldyB2LCBpbnQgd2hpY2hIYW5kbGUpIHsKKyAgICAgICAgICAgIGlmICh3aGljaEhhbmRsZSA9PSBTbGlkaW5nVGFiLk9uVHJpZ2dlckxpc3RlbmVyLkxFRlRfSEFORExFKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmdvVG9VbmxvY2tTY3JlZW4oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hpY2hIYW5kbGUgPT0gU2xpZGluZ1RhYi5PblRyaWdnZXJMaXN0ZW5lci5SSUdIVF9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICAvLyB0b2dnbGUgc2lsZW50IG1vZGUKKyAgICAgICAgICAgICAgICBtU2lsZW50TW9kZSA9ICFtU2lsZW50TW9kZTsKKyAgICAgICAgICAgICAgICBpZiAobVNpbGVudE1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2aWJlID0gKFNldHRpbmdzLlN5c3RlbS5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uVklCUkFURV9JTl9TSUxFTlQsIDEpID09IDEpOworCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZSh2aWJlCisgICAgICAgICAgICAgICAgICAgICAgICA/IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9WSUJSQVRFCisgICAgICAgICAgICAgICAgICAgICAgICA6IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9TSUxFTlQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZShBdWRpb01hbmFnZXIuUklOR0VSX01PREVfTk9STUFMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1cGRhdGVSaWdodFRhYlJlc291cmNlcygpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtU2lsZW50TW9kZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmdsb2JhbF9hY3Rpb25fc2lsZW50X21vZGVfb25fc3RhdHVzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmdsb2JhbF9hY3Rpb25fc2lsZW50X21vZGVfb2ZmX3N0YXR1cyk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG9hc3RJY29uID0gbVNpbGVudE1vZGUKKyAgICAgICAgICAgICAgICAgICAgPyBSLmRyYXdhYmxlLmljX2xvY2tfcmluZ2VyX29mZgorICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfbG9ja19yaW5nZXJfb247CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG9hc3RDb2xvciA9IG1TaWxlbnRNb2RlCisgICAgICAgICAgICAgICAgICAgID8gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldENvbG9yKFIuY29sb3Iua2V5Z3VhcmRfdGV4dF9jb2xvcl9zb3VuZG9mZikKKyAgICAgICAgICAgICAgICAgICAgOiBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IoUi5jb2xvci5rZXlndWFyZF90ZXh0X2NvbG9yX3NvdW5kb24pOworICAgICAgICAgICAgICAgIHRvYXN0TWVzc2FnZShtU2NyZWVuTG9ja2VkLCBtZXNzYWdlLCB0b2FzdENvbG9yLCB0b2FzdEljb24pOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5wb2tlV2FrZWxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uR3JhYmJlZFN0YXRlQ2hhbmdlKFZpZXcgdiwgaW50IGdyYWJiZWRTdGF0ZSkgeworICAgICAgICAgICAgaWYgKGdyYWJiZWRTdGF0ZSA9PSBTbGlkaW5nVGFiLk9uVHJpZ2dlckxpc3RlbmVyLlJJR0hUX0hBTkRMRSkgeworICAgICAgICAgICAgICAgIG1TaWxlbnRNb2RlID0gaXNTaWxlbnRNb2RlKCk7CisgICAgICAgICAgICAgICAgbVNsaWRpbmdUYWIuc2V0UmlnaHRIaW50VGV4dChtU2lsZW50TW9kZSA/IFIuc3RyaW5nLmxvY2tzY3JlZW5fc291bmRfb25fbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIDogUi5zdHJpbmcubG9ja3NjcmVlbl9zb3VuZF9vZmZfbGFiZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgV2F2ZVZpZXdNZXRob2RzIGltcGxlbWVudHMgV2F2ZVZpZXcuT25UcmlnZ2VyTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9GT1JfQU5JTUFUSU9OX1RJTUVPVVQgPSA1MDA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFZX09OX1dISUxFX0dSQUJCRURfVElNRU9VVCA9IDMwMDAwOworCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVHJpZ2dlcihWaWV3IHYsIGludCB3aGljaEhhbmRsZSkgeworICAgICAgICAgICAgaWYgKHdoaWNoSGFuZGxlID09IFdhdmVWaWV3Lk9uVHJpZ2dlckxpc3RlbmVyLkNFTlRFUl9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICAvLyBEZWxheSBoaWRpbmcgbG9jayBzY3JlZW4gbG9uZyBlbm91Z2ggZm9yIGFuaW1hdGlvbiB0byBmaW5pc2gKKyAgICAgICAgICAgICAgICBwb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5nb1RvVW5sb2NrU2NyZWVuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCBXQUlUX0ZPUl9BTklNQVRJT05fVElNRU9VVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkdyYWJiZWRTdGF0ZUNoYW5nZShWaWV3IHYsIGludCBncmFiYmVkU3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChncmFiYmVkU3RhdGUgPT0gV2F2ZVZpZXcuT25UcmlnZ2VyTGlzdGVuZXIuQ0VOVEVSX0hBTkRMRSkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5wb2tlV2FrZWxvY2soU1RBWV9PTl9XSElMRV9HUkFCQkVEX1RJTUVPVVQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sucG9rZVdha2Vsb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBJbiBnZW5lcmFsLCB3ZSBlbmFibGUgdW5sb2NraW5nIHRoZSBpbnNlY3VyZSBrZXkgZ3VhcmQgd2l0aCB0aGUgbWVudSBrZXkuIEhvd2V2ZXIsIHRoZXJlIGFyZQogICAgICAqIHNvbWUgY2FzZXMgd2hlcmUgd2Ugd2lzaCB0byBkaXNhYmxlIGl0LCBub3RhYmx5IHdoZW4gdGhlIG1lbnUgYnV0dG9uIHBsYWNlbWVudCBvciB0ZWNobm9sb2d5CkBAIC0xOTUsMTkgKzI5MCw5IEBACiAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrX2xhbmQsIHRoaXMsIHRydWUpOwogICAgICAgICB9CiAKLSAgICAgICAgbUNhcnJpZXIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhcnJpZXIpOwotICAgICAgICAvLyBSZXF1aXJlZCBmb3IgTWFycXVlZSB0byB3b3JrCi0gICAgICAgIG1DYXJyaWVyLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICBtQ2Fycmllci5zZXRUZXh0Q29sb3IoMHhmZmZmZmZmZik7Ci0KLSAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOwotICAgICAgICBtU3RhdHVzMSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMSk7Ci0gICAgICAgIG1TdGF0dXMyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMyKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcgPSBuZXcgU3RhdHVzVmlldyh0aGlzLCBtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOwogCiAgICAgICAgIG1TY3JlZW5Mb2NrZWQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNjcmVlbkxvY2tlZCk7Ci0gICAgICAgIG1TZWxlY3RvciA9IChTbGlkaW5nVGFiKSBmaW5kVmlld0J5SWQoUi5pZC50YWJfc2VsZWN0b3IpOwotICAgICAgICBtU2VsZWN0b3Iuc2V0SG9sZEFmdGVyVHJpZ2dlcih0cnVlLCBmYWxzZSk7Ci0gICAgICAgIG1TZWxlY3Rvci5zZXRMZWZ0SGludFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl91bmxvY2tfbGFiZWwpOwogCiAgICAgICAgIG1FbWVyZ2VuY3lDYWxsVGV4dCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW1lcmdlbmN5Q2FsbFRleHQpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeUNhbGxCdXR0b24pOwpAQCAtMjIwLDcgKzMwNSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCi0KICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOwpAQCAtMjMxLDE1ICszMTUsMjUgQEAKICAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7CiAgICAgICAgIG1TaWxlbnRNb2RlID0gaXNTaWxlbnRNb2RlKCk7CiAKLSAgICAgICAgbVNlbGVjdG9yLnNldExlZnRUYWJSZXNvdXJjZXMoCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19qb2dfZGlhbF91bmxvY2ssCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5qb2dfdGFiX3RhcmdldF9ncmVlbiwKLSAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmpvZ190YWJfYmFyX2xlZnRfdW5sb2NrLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuam9nX3RhYl9sZWZ0X3VubG9jayk7Ci0KLSAgICAgICAgdXBkYXRlUmlnaHRUYWJSZXNvdXJjZXMoKTsKLQotICAgICAgICBtU2VsZWN0b3Iuc2V0T25UcmlnZ2VyTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1TbGlkaW5nVGFiID0gKFNsaWRpbmdUYWIpIGZpbmRWaWV3QnlJZChSLmlkLnRhYl9zZWxlY3Rvcik7CisgICAgICAgIG1FbmVyZ3lXYXZlID0gKFdhdmVWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC53YXZlX3ZpZXcpOworICAgICAgICBpZiAobVNsaWRpbmdUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNsaWRpbmdUYWIuc2V0SG9sZEFmdGVyVHJpZ2dlcih0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICBtU2xpZGluZ1RhYi5zZXRMZWZ0SGludFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl91bmxvY2tfbGFiZWwpOworICAgICAgICAgICAgbVNsaWRpbmdUYWIuc2V0TGVmdFRhYlJlc291cmNlcygKKyAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19qb2dfZGlhbF91bmxvY2ssCisgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuam9nX3RhYl90YXJnZXRfZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuam9nX3RhYl9iYXJfbGVmdF91bmxvY2ssCisgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuam9nX3RhYl9sZWZ0X3VubG9jayk7CisgICAgICAgICAgICBtU2xpZGluZ1RhYk1ldGhvZHMgPSBuZXcgU2xpZGluZ1RhYk1ldGhvZHMoKTsKKyAgICAgICAgICAgIG1TbGlkaW5nVGFiLnNldE9uVHJpZ2dlckxpc3RlbmVyKG1TbGlkaW5nVGFiTWV0aG9kcyk7CisgICAgICAgICAgICBtU2xpZGluZ1RhYk1ldGhvZHMudXBkYXRlUmlnaHRUYWJSZXNvdXJjZXMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtRW5lcmd5V2F2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2F2ZVZpZXdNZXRob2RzID0gbmV3IFdhdmVWaWV3TWV0aG9kcygpOworICAgICAgICAgICAgbUVuZXJneVdhdmUuc2V0T25UcmlnZ2VyTGlzdGVuZXIobVdhdmVWaWV3TWV0aG9kcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNdXN0IGhhdmUgZWl0aGVyIFNsaWRpbmdUYWIgb3IgV2F2ZVZpZXcgZGVmaW5lZCIpOworICAgICAgICB9CiAKICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKHVwZGF0ZU1vbml0b3IpOwogICAgIH0KQEAgLTI0OCwyMiArMzQyLDYgQEAKICAgICAgICAgcmV0dXJuIG1BdWRpb01hbmFnZXIuZ2V0UmluZ2VyTW9kZSgpICE9IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJpZ2h0VGFiUmVzb3VyY2VzKCkgewotICAgICAgICBib29sZWFuIHZpYmUgPSBtU2lsZW50TW9kZQotICAgICAgICAgICAgJiYgKG1BdWRpb01hbmFnZXIuZ2V0UmluZ2VyTW9kZSgpID09IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9WSUJSQVRFKTsKLQotICAgICAgICBtU2VsZWN0b3Iuc2V0UmlnaHRUYWJSZXNvdXJjZXMoCi0gICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyAoIHZpYmUgPyBSLmRyYXdhYmxlLmljX2pvZ19kaWFsX3ZpYnJhdGVfb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfam9nX2RpYWxfc291bmRfb2ZmICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfam9nX2RpYWxfc291bmRfb24sCi0gICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyBSLmRyYXdhYmxlLmpvZ190YWJfdGFyZ2V0X3llbGxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5qb2dfdGFiX3RhcmdldF9ncmF5LAotICAgICAgICAgICAgICAgIG1TaWxlbnRNb2RlID8gUi5kcmF3YWJsZS5qb2dfdGFiX2Jhcl9yaWdodF9zb3VuZF9vbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5qb2dfdGFiX2Jhcl9yaWdodF9zb3VuZF9vZmYsCi0gICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyBSLmRyYXdhYmxlLmpvZ190YWJfcmlnaHRfc291bmRfb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuam9nX3RhYl9yaWdodF9zb3VuZF9vZmYpOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCByZXNldFN0YXR1c0luZm8oS2V5Z3VhcmRVcGRhdGVNb25pdG9yIHVwZGF0ZU1vbml0b3IpIHsKICAgICAgICAgbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IHVwZGF0ZU1vbml0b3Iuc2hvdWxkU2hvd0JhdHRlcnlJbmZvKCk7CiAgICAgICAgIG1QbHVnZ2VkSW4gPSB1cGRhdGVNb25pdG9yLmlzRGV2aWNlUGx1Z2dlZEluKCk7CkBAIC0yODksNTMgKzM2Nyw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKioge0Bpbmhlcml0RG9jfSAqLwotICAgIHB1YmxpYyB2b2lkIG9uVHJpZ2dlcihWaWV3IHYsIGludCB3aGljaEhhbmRsZSkgewotICAgICAgICBpZiAod2hpY2hIYW5kbGUgPT0gU2xpZGluZ1RhYi5PblRyaWdnZXJMaXN0ZW5lci5MRUZUX0hBTkRMRSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLmdvVG9VbmxvY2tTY3JlZW4oKTsKLSAgICAgICAgfSBlbHNlIGlmICh3aGljaEhhbmRsZSA9PSBTbGlkaW5nVGFiLk9uVHJpZ2dlckxpc3RlbmVyLlJJR0hUX0hBTkRMRSkgewotICAgICAgICAgICAgLy8gdG9nZ2xlIHNpbGVudCBtb2RlCi0gICAgICAgICAgICBtU2lsZW50TW9kZSA9ICFtU2lsZW50TW9kZTsKLSAgICAgICAgICAgIGlmIChtU2lsZW50TW9kZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmliZSA9IChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KAotICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5WSUJSQVRFX0lOX1NJTEVOVCwgMSkgPT0gMSk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFJpbmdlck1vZGUodmliZQotICAgICAgICAgICAgICAgICAgICA/IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9WSUJSQVRFCi0gICAgICAgICAgICAgICAgICAgIDogQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1NJTEVOVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZShBdWRpb01hbmFnZXIuUklOR0VSX01PREVfTk9STUFMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlUmlnaHRUYWJSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtU2lsZW50TW9kZSA/Ci0gICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcuZ2xvYmFsX2FjdGlvbl9zaWxlbnRfbW9kZV9vbl9zdGF0dXMpIDoKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5nbG9iYWxfYWN0aW9uX3NpbGVudF9tb2RlX29mZl9zdGF0dXMpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgdG9hc3RJY29uID0gbVNpbGVudE1vZGUKLSAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuaWNfbG9ja19yaW5nZXJfb2ZmCi0gICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX2xvY2tfcmluZ2VyX29uOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgdG9hc3RDb2xvciA9IG1TaWxlbnRNb2RlCi0gICAgICAgICAgICAgICAgPyBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IoUi5jb2xvci5rZXlndWFyZF90ZXh0X2NvbG9yX3NvdW5kb2ZmKQotICAgICAgICAgICAgICAgIDogZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldENvbG9yKFIuY29sb3Iua2V5Z3VhcmRfdGV4dF9jb2xvcl9zb3VuZG9uKTsKLSAgICAgICAgICAgIHRvYXN0TWVzc2FnZShtU2NyZWVuTG9ja2VkLCBtZXNzYWdlLCB0b2FzdENvbG9yLCB0b2FzdEljb24pOwotICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBwdWJsaWMgdm9pZCBvbkdyYWJiZWRTdGF0ZUNoYW5nZShWaWV3IHYsIGludCBncmFiYmVkU3RhdGUpIHsKLSAgICAgICAgaWYgKGdyYWJiZWRTdGF0ZSA9PSBTbGlkaW5nVGFiLk9uVHJpZ2dlckxpc3RlbmVyLlJJR0hUX0hBTkRMRSkgewotICAgICAgICAgICAgbVNpbGVudE1vZGUgPSBpc1NpbGVudE1vZGUoKTsKLSAgICAgICAgICAgIG1TZWxlY3Rvci5zZXRSaWdodEhpbnRUZXh0KG1TaWxlbnRNb2RlID8gUi5zdHJpbmcubG9ja3NjcmVlbl9zb3VuZF9vbl9sYWJlbAotICAgICAgICAgICAgICAgICAgICA6IFIuc3RyaW5nLmxvY2tzY3JlZW5fc291bmRfb2ZmX2xhYmVsKTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sucG9rZVdha2Vsb2NrKCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogRGlzcGxheXMgYSBtZXNzYWdlIGluIGEgdGV4dCB2aWV3IGFuZCB0aGVuIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB0ZXh0LgogICAgICAqIEBwYXJhbSB0ZXh0VmlldyBUaGUgdGV4dCB2aWV3LgpAQCAtNDI4LDM4ICs0NTksMTEgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpIHsKLSAgICAgICAgbURhdGUuc2V0VGV4dChEYXRlRm9ybWF0LmZvcm1hdChtRGF0ZUZvcm1hdFN0cmluZywgbmV3IERhdGUoKSkpOworICAgICAgICBtU3RhdHVzVmlldy5yZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1c0xpbmVzKCkgewotICAgICAgICBpZiAoIW1TdGF0dXMuc2hvd1N0YXR1c0xpbmVzKCkKLSAgICAgICAgICAgICAgICB8fCAobUNoYXJnaW5nID09IG51bGwgJiYgbU5leHRBbGFybSA9PSBudWxsKSkgewotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIGlmIChtQ2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNoYXJnaW5nIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1DaGFyZ2luZyk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIG1DaGFyZ2luZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBuZXh0IGFsYXJtIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1BbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKG1DaGFyZ2luZyAhPSBudWxsICYmIG1OZXh0QWxhcm0gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYm90aCBjaGFyZ2luZyBhbmQgbmV4dCBhbGFybQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1DaGFyZ2luZyk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1BbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9CisgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKG1TdGF0dXMuc2hvd1N0YXR1c0xpbmVzKCksIG1DaGFyZ2luZywgbUNoYXJnaW5nSWNvbiwgbUFsYXJtSWNvbik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KQEAgLTQ5OCw2ICs1MDIsMjIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFbmFibGVzIHVubG9ja2luZyBvZiB0aGlzIHNjcmVlbi4gVHlwaWNhbGx5IGp1c3Qgc2hvd3MgdGhlIHVubG9jayB3aWRnZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZVVubG9jaygpIHsKKyAgICAgICAgaWYgKG1FbmVyZ3lXYXZlICE9IG51bGwpIG1FbmVyZ3lXYXZlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgaWYgKG1TbGlkaW5nVGFiICE9IG51bGwpIG1TbGlkaW5nVGFiLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIHVubG9ja2luZyBvZiB0aGlzIHNjcmVlbi4gVHlwaWNhbGx5IGp1c3QgaGlkZXMgdGhlIHVubG9jayB3aWRnZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVVbmxvY2soKSB7CisgICAgICAgIGlmIChtRW5lcmd5V2F2ZSAhPSBudWxsKSBtRW5lcmd5V2F2ZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIGlmIChtU2xpZGluZ1RhYiAhPSBudWxsKSBtU2xpZGluZ1RhYi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBsYXlvdXQgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgc3RhdHVzLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoU3RhdHVzIHN0YXR1cykgewpAQCAtNTA5LDcgKzUyOSw3IEBACiAgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgICAgICAgICBjYXNlIE5vcm1hbDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255U3BuKCkpKTsKQEAgLTUxOCwxNCArNTM4LDE1IEBACiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRUZXh0KCIiKTsKIAogICAgICAgICAgICAgICAgIC8vIGxheW91dAotICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1TZWxlY3Rvci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbFRleHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIGVuYWJsZVVubG9jaygpOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlIE5ldHdvcmtMb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gVGhlIGNhcnJpZXIgc3RyaW5nIHNob3dzIGJvdGggc2ltIGNhcmQgc3RhdHVzIChpLmUuIE5vIFNpbSBDYXJkKSBhbmQKICAgICAgICAgICAgICAgICAvLyBjYXJyaWVyJ3MgbmFtZSBhbmQvb3IgIkVtZXJnZW5jeSBDYWxscyBPbmx5IiBzdGF0dXMKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KAorICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX25ldHdvcmtfbG9ja2VkX21lc3NhZ2UpKSk7CkBAIC01MzMsMjMgKzU1NCwyNCBAQAogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0CiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbFRleHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIGVuYWJsZVVubG9jaygpOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlIFNpbU1pc3Npbmc6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0KTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQpOwogICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX2luc3RydWN0aW9ucyk7CiAKICAgICAgICAgICAgICAgICAvLyBsYXlvdXQKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3Iuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1FbWVyZ2VuY3lDYWxsVGV4dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90IG5lZWQgdG8gc2hvdyB0aGUgZS1jYWxsIGJ1dHRvbjsgdXNlciBtYXkgdW5sb2NrCisgICAgICAgICAgICAgICAgZW5hYmxlVW5sb2NrKCk7IC8vIGRvIG5vdCBuZWVkIHRvIHNob3cgdGhlIGUtY2FsbCBidXR0b247IHVzZXIgbWF5IHVubG9jawogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlIFNpbU1pc3NpbmdMb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCkpKTsKQEAgLTU1NywyNSArNTc5LDI3IEBACiAKICAgICAgICAgICAgICAgICAvLyBsYXlvdXQKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3Iuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOyAvLyBjYW5ub3QgdW5sb2NrCiAgICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxUZXh0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgZGlzYWJsZVVubG9jaygpOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlIFNpbUxvY2tlZDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UpKSk7CiAKICAgICAgICAgICAgICAgICAvLyBsYXlvdXQKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1TZWxlY3Rvci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxUZXh0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICBlbmFibGVVbmxvY2soKTsKICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSBTaW1QdWtMb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fc2ltX3B1a19sb2NrZWRfbWVzc2FnZSkpKTsKQEAgLTU4Myw5ICs2MDcsOSBAQAogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0CiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgLy8gY2Fubm90IHVubG9jawogICAgICAgICAgICAgICAgIG1FbWVyZ2VuY3lDYWxsVGV4dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIGRpc2FibGVVbmxvY2soKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTY1MiwxMyArNjc2LDE0IEBACiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7Ci0KKyAgICAgICAgaWYgKG1FbmVyZ3lXYXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FbmVyZ3lXYXZlLnJlc2V0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICByZXNldFN0YXR1c0luZm8obVVwZGF0ZU1vbml0b3IpOwotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCkBAIC02NzEsMTEgKzY5NiwxMCBAQAogICAgICAgICBib29sZWFuIHNpbGVudCA9IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUwgIT0gc3RhdGU7CiAgICAgICAgIGlmIChzaWxlbnQgIT0gbVNpbGVudE1vZGUpIHsKICAgICAgICAgICAgIG1TaWxlbnRNb2RlID0gc2lsZW50OwotICAgICAgICAgICAgdXBkYXRlUmlnaHRUYWJSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIGlmIChtU2xpZGluZ1RhYk1ldGhvZHMgIT0gbnVsbCkgbVNsaWRpbmdUYWJNZXRob2RzLnVwZGF0ZVJpZ2h0VGFiUmVzb3VyY2VzKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgewotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQppbmRleCAzOWYyOTE3Li45ZGI4NmFhIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkRpZ2l0c0tleUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTUwLDE5ICs1MSwyNSBAQAogcHVibGljIGNsYXNzIFBhc3N3b3JkVW5sb2NrU2NyZWVuIGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgS2V5Z3VhcmRTY3JlZW4sCiAgICAgICAgIFZpZXcuT25DbGlja0xpc3RlbmVyLCBLZXlndWFyZFVwZGF0ZU1vbml0b3IuSW5mb0NhbGxiYWNrLCBPbkVkaXRvckFjdGlvbkxpc3RlbmVyIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGFzc3dvcmRVbmxvY2tTY3JlZW4iOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWxwaGE7CisKICAgICBwcml2YXRlIEVkaXRUZXh0IG1QYXNzd29yZEVudHJ5OwogICAgIHByaXZhdGUgQnV0dG9uIG1FbWVyZ2VuY3lDYWxsQnV0dG9uOwogICAgIHByaXZhdGUgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKICAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgbUtleWJvYXJkVmlldzsKKyAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgbUtleWJvYXJkVmlld0FscGhhOwogICAgIHByaXZhdGUgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyIG1LZXlib2FyZEhlbHBlcjsKKyAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlciBtS2V5Ym9hcmRIZWxwZXJBbHBoYTsKIAogICAgIHByaXZhdGUgaW50IG1DcmVhdGlvbk9yaWVudGF0aW9uOwogICAgIHByaXZhdGUgaW50IG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbjsKICAgICBwcml2YXRlIENvdW50RG93blRpbWVyIG1Db3VudGRvd25UaW1lcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZTsKKworICAgIHByaXZhdGUgU3RhdHVzVmlldyBtU3RhdHVzVmlldzsKIAogICAgIC8vIFRvIGF2b2lkIGFjY2lkZW50YWwgbG9ja291dCBkdWUgdG8gZXZlbnRzIHdoaWxlIHRoZSBkZXZpY2UgaW4gaW4gdGhlIHBvY2tldCwgaWdub3JlCiAgICAgLy8gYW55IHBhc3N3b3JkcyB3aXRoIGxlbmd0aCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyBsZW5ndGguCkBAIC04NiwzNiArOTMsNjUgQEAKICAgICAgICAgICAgIGxheW91dEluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQua2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZSwgdGhpcywgdHJ1ZSk7CiAgICAgICAgIH0KIAorICAgICAgICBtU3RhdHVzVmlldyA9IG5ldyBTdGF0dXNWaWV3KHRoaXMsIG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CisKICAgICAgICAgZmluYWwgaW50IHF1YWxpdHkgPSBsb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNBbHBoYSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID09IHF1YWxpdHkKLSAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID09IHF1YWxpdHk7CisgICAgICAgIG1Jc0FscGhhID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYID09IHF1YWxpdHk7CiAKICAgICAgICAgbUtleWJvYXJkVmlldyA9IChQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5rZXlib2FyZCk7CisgICAgICAgIG1LZXlib2FyZFZpZXdBbHBoYSA9IChQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5rZXlib2FyZEFscGhhKTsKICAgICAgICAgbVBhc3N3b3JkRW50cnkgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkRW50cnkpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRPbkVkaXRvckFjdGlvbkxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeUNhbGwpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7Ci0gICAgICAgIG1UaXRsZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW50ZXJfcGFzc3dvcmRfbGFiZWwpOwogCi0gICAgICAgIG1LZXlib2FyZEhlbHBlciA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlldywgdGhpcyk7Ci0gICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUoaXNBbHBoYSA/IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBCi0gICAgICAgICAgICAgICAgOiBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9OVU1FUklDKTsKKyAgICAgICAgbUtleWJvYXJkSGVscGVyID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihjb250ZXh0LCBtS2V5Ym9hcmRWaWV3LCB0aGlzLCBmYWxzZSk7CisgICAgICAgIGlmIChtS2V5Ym9hcmRWaWV3QWxwaGEgPT0gbnVsbCB8fCAhbUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUobUlzQWxwaGEgPworICAgICAgICAgICAgICAgICAgICBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9BTFBIQQorICAgICAgICAgICAgICAgICAgICA6IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOworICAgICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRWaXNpYmlsaXR5KAorICAgICAgICAgICAgICAgICAgICBtQ3JlYXRpb25IYXJkS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8KKyAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXJBbHBoYSA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlld0FscGhhLAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBmYWxzZSk7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOworICAgICAgICAgICAgbUtleWJvYXJkSGVscGVyQWxwaGEuc2V0S2V5Ym9hcmRNb2RlKFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBKTsKKyAgICAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUtleWJvYXJkVmlld0FscGhhLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbiA9PSBDb25maWd1cmF0aW9uLkhBUkRLRVlCT0FSREhJRERFTl9OTworICAgICAgICAgICAgICAgICAgICA/IFZpZXcuSU5WSVNJQkxFIDogVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldFdpZHRoKG1LZXlib2FyZFZpZXdBbHBoYS5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCk7CisgICAgICAgIH0KIAotICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldFZpc2liaWxpdHkobUNyZWF0aW9uSGFyZEtleWJvYXJkSGlkZGVuID09IENvbmZpZ3VyYXRpb24uSEFSREtFWUJPQVJESElEREVOX05PCi0gICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLAorICAgICAgICAgICAgICAgIDAsIDApOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5yZXF1ZXN0Rm9jdXMoKTsKIAogICAgICAgICAvLyBUaGlzIGFsbG93cyBrZXlib2FyZHMgd2l0aCBvdmVybGFwcGluZyBxd2VydHkvbnVtZXJpYyBrZXlzIHRvIGNob29zZSBqdXN0IHRoZQogICAgICAgICAvLyBudW1lcmljIGtleXMuCi0gICAgICAgIGlmIChpc0FscGhhKSB7CisgICAgICAgIGlmIChtSXNBbHBoYSkgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoVGV4dEtleUxpc3RlbmVyLmdldEluc3RhbmNlKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoRGlnaXRzS2V5TGlzdGVuZXIuZ2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUpOwogICAgICAgICB9CiAKICAgICAgICAgbUtleWJvYXJkSGVscGVyLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ192aXJ0dWFsS2V5VmliZVBhdHRlcm4gOiAwKTsKKyAgICAgICAgaWYgKG1LZXlib2FyZEhlbHBlckFscGhhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlckFscGhhLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdmlydHVhbEtleVZpYmVQYXR0ZXJuIDogMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1bnRpbCB3ZSBnZXQgYW4gdXBkYXRlLi4uCisgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMzYsOCArMTcyLDEyIEBACiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyByZXNldCBzdGF0dXMKKyAgICAgICAgbVN0YXR1c1ZpZXcucmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CisKICAgICAgICAgLy8gc3RhcnQgZnJlc2gKICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CisgICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5yZXF1ZXN0Rm9jdXMoKTsKICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKIApAQCAtMTc0LDYgKzIxNCw5IEBACiAgICAgICAgICAgICAgICAgbG9uZyBkZWFkbGluZSA9IG1Mb2NrUGF0dGVyblV0aWxzLnNldExvY2tvdXRBdHRlbXB0RGVhZGxpbmUoKTsKICAgICAgICAgICAgICAgICBoYW5kbGVBdHRlbXB0TG9ja291dChkZWFkbGluZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CiAgICAgICAgIH0KICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CiAgICAgfQpAQCAtMTkxLDE0ICsyMzQsMTQgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgaW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNSZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KGluc3RydWN0aW9ucyk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9ucyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2goKSB7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlKTsKICAgICAgICAgICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0uc3RhcnQoKTsKICAgICB9CkBAIC0yNDQsMjQgKzI4Nyw0MSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gLS0tLS0tLS0tLSBJbmZvQ2FsbGJhY2sKKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaEJhdHRlcnlJbmZvKHNob3dCYXR0ZXJ5SW5mbywgcGx1Z2dlZEluLCBiYXR0ZXJ5TGV2ZWwpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25UaW1lQ2hhbmdlZCgpIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25UaW1lQ2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25SZWZyZXNoQ2FycmllckluZm8ocGxtbiwgc3BuKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIG9uUmluZ2VyTW9kZUNoYW5nZWQoaW50IHN0YXRlKSB7CisgICAgICAgIC8vIG5vdCBjdXJyZW50bHkgdXNlZAorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0gU2ltU3RhdGVDYWxsYmFjaworCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgewogICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUmluZ2VyTW9kZUNoYW5nZWQoaW50IHN0YXRlKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblRpbWVDaGFuZ2VkKCkgewotCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3RhdHVzSW5mbygpIHsKKyAgICAgICAgaWYobUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSk7CisgICAgICAgIH0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGF0dGVyblVubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKaW5kZXggNDE4ZTI0My4uMzVmYTNlNSAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKQEAgLTI1LDkgKzI1LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwpAQCAtMzcsNyArMzQsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXcuQ2VsbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwogCiAvKioKICAqIFRoaXMgaXMgdGhlIHNjcmVlbiB0aGF0IHNob3dzIHRoZSA5IGNpcmNsZSB1bmxvY2sgd2lkZ2V0IGFuZCBpbnN0cnVjdHMKQEAgLTc1LDI3ICs3MSw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVGYWxsYmFjazsKIAotICAgIHByaXZhdGUgU3RyaW5nIG1EYXRlRm9ybWF0U3RyaW5nOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ2FycmllcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1EYXRlOwotCi0gICAgLy8gYXJlIHdlIHNob3dpbmcgYmF0dGVyeSBpbmZvcm1hdGlvbj8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IGZhbHNlOwotCi0gICAgLy8gbGFzdCBrbm93biBwbHVnZ2VkIGluIHN0YXRlCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QbHVnZ2VkSW4gPSBmYWxzZTsKLQotICAgIC8vIGxhc3Qga25vd24gYmF0dGVyeSBsZXZlbAotICAgIHByaXZhdGUgaW50IG1CYXR0ZXJ5TGV2ZWwgPSAxMDA7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtTmV4dEFsYXJtID0gbnVsbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1JbnN0cnVjdGlvbnMgPSBudWxsOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czE7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzU2VwOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czI7Ci0KKyAgICBwcml2YXRlIFN0YXR1c1ZpZXcgbVN0YXR1c1ZpZXc7CiAKICAgICBwcml2YXRlIExvY2tQYXR0ZXJuVmlldyBtTG9ja1BhdHRlcm5WaWV3OwogCkBAIC0xMzMsMTUgKzEwOSwxOCBAQAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGb290ZXIoRm9vdGVyTW9kZSBtb2RlKSB7CiAgICAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgICAgICAgY2FzZSBOb3JtYWw6CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibW9kZSBub3JtYWwiKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyTm9ybWFsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyRm9yZ290UGF0dGVybi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEZvcmdvdExvY2tQYXR0ZXJuOgorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1vZGUgRm9yZ290TG9ja1BhdHRlcm4iKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyTm9ybWFsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyRm9yZ290UGF0dGVybi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUZvcmdvdFBhdHRlcm5CdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBWZXJpZnlVbmxvY2tlZDoKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtb2RlIFZlcmlmeVVubG9ja2VkIik7CiAgICAgICAgICAgICAgICAgbUZvb3Rlck5vcm1hbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgbUZvb3RlckZvcmdvdFBhdHRlcm4uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICB9CkBAIC0xODAsMjQgKzE1OSwxNiBAQAogICAgICAgICBtQ3JlYXRpb25PcmllbnRhdGlvbiA9IGNvbmZpZ3VyYXRpb24ub3JpZW50YXRpb247CiAKICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpOworCiAgICAgICAgIGlmIChtQ3JlYXRpb25PcmllbnRhdGlvbiAhPSBDb25maWd1cmF0aW9uLk9SSUVOVEFUSU9OX0xBTkRTQ0FQRSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAicG9ydHJhaXQgbW9kZSIpOwogICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LCB0aGlzLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImxhbmRzY2FwZSBtb2RlIik7CiAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLCB0aGlzLCB0cnVlKTsKICAgICAgICAgfQogCi0gICAgICAgIG1DYXJyaWVyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5jYXJyaWVyKTsKLSAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOwotCi0gICAgICAgIG1EYXRlRm9ybWF0U3RyaW5nID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5mdWxsX3dkYXlfbW9udGhfZGF5X25vX3llYXIpOwotICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7Ci0KLSAgICAgICAgbVN0YXR1czEgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czEpOwotICAgICAgICBtU3RhdHVzU2VwID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXNTZXApOwotICAgICAgICBtU3RhdHVzMiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMik7Ci0KLSAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7Ci0KKyAgICAgICAgbVN0YXR1c1ZpZXcgPSBuZXcgU3RhdHVzVmlldyh0aGlzLCBtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOwogCiAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcgPSAoTG9ja1BhdHRlcm5WaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5sb2NrUGF0dGVybik7CiAKQEAgLTI0OSwxNSArMjIwLDExIEBACiAgICAgICAgIHVwZGF0ZU1vbml0b3IucmVnaXN0ZXJTaW1TdGF0ZUNhbGxiYWNrKHRoaXMpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKIAotICAgICAgICAvLyBSZXF1aXJlZCB0byBnZXQgTWFycXVlZSB0byB3b3JrLgotICAgICAgICBtQ2Fycmllci5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dENvbG9yKDB4ZmZmZmZmZmYpOwotCiAgICAgICAgIC8vIHVudGlsIHdlIGdldCBhbiB1cGRhdGUuLi4KLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcoCisgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CisKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEVtZXJnZW5jeUJ1dHRvblRleHQoKSB7CkBAIC0yNzAsODggKzIzNyw2IEBACiAgICAgICAgIG1FbmFibGVGYWxsYmFjayA9IHN0YXRlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCByZXNldFN0YXR1c0luZm8oKSB7Ci0gICAgICAgIG1JbnN0cnVjdGlvbnMgPSBudWxsOwotICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gbVVwZGF0ZU1vbml0b3Iuc2hvdWxkU2hvd0JhdHRlcnlJbmZvKCk7Ci0gICAgICAgIG1QbHVnZ2VkSW4gPSBtVXBkYXRlTW9uaXRvci5pc0RldmljZVBsdWdnZWRJbigpOwotICAgICAgICBtQmF0dGVyeUxldmVsID0gbVVwZGF0ZU1vbml0b3IuZ2V0QmF0dGVyeUxldmVsKCk7Ci0gICAgICAgIG1OZXh0QWxhcm0gPSBtTG9ja1BhdHRlcm5VdGlscy5nZXROZXh0QWxhcm0oKTsKLSAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoKSB7Ci0gICAgICAgIGlmIChtSW5zdHJ1Y3Rpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGluc3RydWN0aW9ucyBvbmx5Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1JbnN0cnVjdGlvbnMpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1JbnN0cnVjdGlvbnMpKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1c1NlcC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVNob3dpbmdCYXR0ZXJ5SW5mbyAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGJhdHRlcnkgb25seQotICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKLSAgICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGV2ZWwgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fY2hhcmdlZCkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fcGx1Z2dlZF9pbiwgbUJhdHRlcnlMZXZlbCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsIDAsIDAsIDApOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiAhbVNob3dpbmdCYXR0ZXJ5SW5mbykgewotICAgICAgICAgICAgLy8gYWxhcm0gb25seQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9hbGFybSwgMCwgMCwgMCk7Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiBtU2hvd2luZ0JhdHRlcnlJbmZvKSB7Ci0gICAgICAgICAgICAvLyBib3RoIGJhdHRlcnkgYW5kIG5leHQgYWxhcm0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFRleHQoInwiKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0LAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbigxMDAsIG1CYXR0ZXJ5TGV2ZWwpKSk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsIDAsIDApOwotICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsIDAsIDAsIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm90aGluZyBzcGVjaWZpYyB0byBzaG93OyBzaG93IGdlbmVyYWwgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKSB7Ci0gICAgICAgIG1EYXRlLnNldFRleHQoRGF0ZUZvcm1hdC5mb3JtYXQobURhdGVGb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpKTsKLSAgICB9Ci0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgewogICAgICAgICAvLyBhcyBsb25nIGFzIHRoZSB1c2VyIGlzIGVudGVyaW5nIGEgcGF0dGVybiAoaS5lIHNlbmRpbmcgYSB0b3VjaApAQCAtMzY2LDI1ICsyNTEsMjEgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLQogICAgIC8vIC0tLS0tLS0tLS0gSW5mb0NhbGxiYWNrCiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgewotICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gc2hvd0JhdHRlcnlJbmZvOwotICAgICAgICBtUGx1Z2dlZEluID0gcGx1Z2dlZEluOwotICAgICAgICBtQmF0dGVyeUxldmVsID0gYmF0dGVyeUxldmVsOwotICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgICAgICBtU3RhdHVzVmlldy5vblJlZnJlc2hCYXR0ZXJ5SW5mbyhzaG93QmF0dGVyeUluZm8sIHBsdWdnZWRJbiwgYmF0dGVyeUxldmVsKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uVGltZUNoYW5nZWQoKSB7Ci0gICAgICAgIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25UaW1lQ2hhbmdlZCgpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcocGxtbiwgc3BuKSk7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaENhcnJpZXJJbmZvKHBsbW4sIHNwbik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KQEAgLTQ0NCw4ICszMjUsOCBAQAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgLy8gcmVzZXQgaGVhZGVyCi0gICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOworICAgICAgICAvLyByZXNldCBzdGF0dXMKKyAgICAgICAgbVN0YXR1c1ZpZXcucmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CiAKICAgICAgICAgLy8gcmVzZXQgbG9jayBwYXR0ZXJuCiAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcuZW5hYmxlSW5wdXQoKTsKQEAgLTUxNCw4ICszOTUsOCBAQAogICAgICAgICAgICAgaWYgKG1Mb2NrUGF0dGVyblV0aWxzLmNoZWNrUGF0dGVybihwYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREaXNwbGF5TW9kZShMb2NrUGF0dGVyblZpZXcuRGlzcGxheU1vZGUuQ29ycmVjdCk7Ci0gICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9ICIiOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKCIiKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5rZXlndWFyZERvbmUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlcG9ydFN1Y2Nlc3NmdWxVbmxvY2tBdHRlbXB0KCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTMzLDggKzQxNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUF0dGVtcHRMb2Nrb3V0KGRlYWRsaW5lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1VbmxvY2tJY29uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nKSk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcucG9zdERlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmNlbFBhdHRlcm5SdW5uYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVRURVJOX0NMRUFSX1RJTUVPVVRfTVMpOwpAQCAtNTUyLDE3ICs0MzQsMTggQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25UaWNrKGxvbmcgbWlsbGlzVW50aWxGaW5pc2hlZCkgewogICAgICAgICAgICAgICAgIGludCBzZWNvbmRzUmVtYWluaW5nID0gKGludCkgKG1pbGxpc1VudGlsRmluaXNoZWQgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNSZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzUmVtYWluaW5nKSk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcudXBkYXRlU3RhdHVzTGluZXMoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaCgpIHsKICAgICAgICAgICAgICAgICBtTG9ja1BhdHRlcm5WaWV3LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX2luc3RydWN0aW9ucyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgICAgIC8vIFRPRE8gbVVubG9ja0ljb24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1GYWlsZWRQYXR0ZXJuQXR0ZW1wdHNTaW5jZUxhc3RUaW1lb3V0ID0gMDsKICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZUZhbGxiYWNrKSB7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKaW5kZXggZGZmY2NmOC4uMjRjOTQ0MyAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQpAQCAtMjQsMTEgKzI0LDE1IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LkJhc2VTdXJmYWNlSG9sZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuUm9vdFZpZXdTdXJmYWNlVGFrZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5TdGFuZGFsb25lQWN0aW9uTW9kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQ29udGV4dE1lbnVCdWlsZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudURpYWxvZ0hlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVBvcHVwSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51VmlldzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJWaWV3OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CkBAIC01Myw2ICs1Nyw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRRdWV1ZTsKQEAgLTY2LDYgKzcxLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1N0dWI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZvbHVtZVBhbmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CkBAIC05NSw3ICsxMDEsNyBAQAogICAgICAqIFNpbXBsZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSBjb250ZXh0IG1lbnUgYW5kIGl0cyBzdWJtZW51cy4gVGhlIG9wdGlvbnMKICAgICAgKiBtZW51IHN1Ym1lbnVzIGRvIG5vdCB1c2UgdGhpcyAodGhlaXIgYmVoYXZpb3IgaXMgbW9yZSBjb21wbGV4KS4KICAgICAgKi8KLSAgICBDb250ZXh0TWVudUNhbGxiYWNrIG1Db250ZXh0TWVudUNhbGxiYWNrID0gbmV3IENvbnRleHRNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOworICAgIERpYWxvZ01lbnVDYWxsYmFjayBtQ29udGV4dE1lbnVDYWxsYmFjayA9IG5ldyBEaWFsb2dNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOwogCiAgICAgLy8gVGhpcyBpcyB0aGUgdG9wLWxldmVsIHZpZXcgb2YgdGhlIHdpbmRvdywgY29udGFpbmluZyB0aGUgd2luZG93IGRlY29yLgogICAgIHByaXZhdGUgRGVjb3JWaWV3IG1EZWNvcjsKQEAgLTExNCw2ICsxMjAsOCBAQAogICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUxheW91dEluZmxhdGVyOwogCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyVmlldyBtQWN0aW9uQmFyOwogCiAgICAgcHJpdmF0ZSBEcmF3YWJsZUZlYXR1cmVTdGF0ZVtdIG1EcmF3YWJsZXM7CiAKQEAgLTE5MSw4ICsxOTksMTIgQEAKICAgICAgICAgICAgIC8qIEN1c3RvbSB0aXRsZSBmZWF0dXJlIGlzIGVuYWJsZWQgYW5kIHRoZSB1c2VyIGlzIHRyeWluZyB0byBlbmFibGUgYW5vdGhlciBmZWF0dXJlICovCiAgICAgICAgICAgICB0aHJvdyBuZXcgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oIllvdSBjYW5ub3QgY29tYmluZSBjdXN0b20gdGl0bGVzIHdpdGggb3RoZXIgdGl0bGUgZmVhdHVyZXMiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfT1BFTkdMKSB7Ci0gICAgICAgICAgICBnZXRBdHRyaWJ1dGVzKCkubWVtb3J5VHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1FTU9SWV9UWVBFX0dQVTsKKyAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfTk9fVElUTEUpKSAhPSAwICYmIGZlYXR1cmVJZCA9PSBGRUFUVVJFX0FDVElPTl9CQVIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWdub3JlLiBObyB0aXRsZSBkb21pbmF0ZXMuCisgICAgICAgIH0KKyAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQUNUSU9OX0JBUikpICE9IDAgJiYgZmVhdHVyZUlkID09IEZFQVRVUkVfTk9fVElUTEUpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYWN0aW9uIGJhciBmZWF0dXJlIGlmIHdlIGhhdmUgbm8gdGl0bGUuIE5vIHRpdGxlIGRvbWluYXRlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVzdEZlYXR1cmUoZmVhdHVyZUlkKTsKICAgICB9CkBAIC0yNzYsNiArMjg4LDggQEAKICAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKICAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0V2luZG93VGl0bGUodGl0bGUpOwogICAgICAgICB9CiAgICAgICAgIG1UaXRsZSA9IHRpdGxlOwogICAgIH0KQEAgLTMwMSw3ICszMTUsNyBAQAogICAgICAgICAvLyBBbHJlYWR5IHByZXBhcmVkIChpc1ByZXBhcmVkIHdpbGwgYmUgcmVzZXQgdG8gZmFsc2UgbGF0ZXIpCiAgICAgICAgIGlmIChzdC5pc1ByZXBhcmVkKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KKyAgICAgICAgCiAgICAgICAgIGlmICgobVByZXBhcmVkUGFuZWwgIT0gbnVsbCkgJiYgKG1QcmVwYXJlZFBhbmVsICE9IHN0KSkgewogICAgICAgICAgICAgLy8gQW5vdGhlciBQYW5lbCBpcyBwcmVwYXJlZCBhbmQgcG9zc2libHkgb3Blbiwgc28gY2xvc2UgaXQKICAgICAgICAgICAgIGNsb3NlUGFuZWwobVByZXBhcmVkUGFuZWwsIGZhbHNlKTsKQEAgLTMxNSw5ICszMjksMTEgQEAKIAogICAgICAgICBpZiAoc3QuY3JlYXRlZFBhbmVsVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBJbml0IHRoZSBwYW5lbCBzdGF0ZSdzIG1lbnUtLXJldHVybiBmYWxzZSBpZiBpbml0IGZhaWxlZAotICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCB8fCBzdC5yZWZyZXNoTWVudUNvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QubWVudSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBDYWxsIGNhbGxiYWNrLCBhbmQgcmV0dXJuIGlmIGl0IGRvZXNuJ3Qgd2FudCB0byBkaXNwbGF5IG1lbnUKICAgICAgICAgICAgICAgICBpZiAoKGNiID09IG51bGwpIHx8ICFjYi5vbkNyZWF0ZVBhbmVsTWVudShzdC5mZWF0dXJlSWQsIHN0Lm1lbnUpKSB7CkBAIC0zMjYsNiArMzQyLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5zZXRNZW51KHN0Lm1lbnUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2FsbGJhY2sgYW5kIHJldHVybiBpZiB0aGUgY2FsbGJhY2sgZG9lcyBub3Qgd2FudCB0byBzaG93IHRoZSBtZW51CkBAIC0zNDksMzYgKzM3MSwzNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCBmYWxzZSk7Ci0gICAgICAgIGlmICgoc3QgIT0gbnVsbCkgJiYgKHN0Lm1lbnUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gKE1lbnVCdWlsZGVyKSBzdC5tZW51OworICAgICAgICAvLyBBY3Rpb24gYmFycyBoYW5kbGUgdGhlaXIgb3duIG1lbnUgc3RhdGUKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgPT0gbnVsbCkgeworICAgICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKChzdCAhPSBudWxsKSAmJiAoc3QubWVudSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gKE1lbnVCdWlsZGVyKSBzdC5tZW51OwogCi0gICAgICAgICAgICBpZiAoc3QuaXNPcGVuKSB7Ci0gICAgICAgICAgICAgICAgLy8gRnJlZXplIHN0YXRlCi0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHN0YXRlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgIG1lbnVCdWlsZGVyLnNhdmVIaWVyYXJjaHlTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0LmlzT3BlbikgeworICAgICAgICAgICAgICAgICAgICAvLyBGcmVlemUgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5zYXZlSGllcmFyY2h5U3RhdGUoc3RhdGUpOwogCi0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBtZW51IHZpZXdzIHNpbmNlIHRoZXkgbmVlZCB0byBiZSByZWNyZWF0ZWQKLSAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG1lbnUgdmlld3Mgc2luY2UgdGhleSBuZWVkIHRvIGJlIHJlY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgIGNsZWFyTWVudVZpZXdzKHN0KTsKIAotICAgICAgICAgICAgICAgIC8vIFJlLW9wZW4gdGhlIHNhbWUgbWVudQotICAgICAgICAgICAgICAgIHJlb3Blbk1lbnUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAvLyBSZS1vcGVuIHRoZSBzYW1lIG1lbnUKKyAgICAgICAgICAgICAgICAgICAgcmVvcGVuTWVudShmYWxzZSk7CiAKLSAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHN0YXRlCi0gICAgICAgICAgICAgICAgbWVudUJ1aWxkZXIucmVzdG9yZUhpZXJhcmNoeVN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5yZXN0b3JlSGllcmFyY2h5U3RhdGUoc3RhdGUpOwogCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENsZWFyIG1lbnUgdmlld3Mgc28gb24gbmV4dCBtZW51IG9wZW5pbmcsIGl0IHdpbGwgdXNlCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlciBsYXlvdXQKLSAgICAgICAgICAgICAgICBjbGVhck1lbnVWaWV3cyhzdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgbWVudSB2aWV3cyBzbyBvbiBuZXh0IG1lbnUgb3BlbmluZywgaXQgd2lsbCB1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlciBsYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGVhck1lbnVWaWV3cyhQYW5lbEZlYXR1cmVTdGF0ZSBzdCkgewotCiAgICAgICAgIC8vIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBjb25maWcgY2hhbmdlcywgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZQogICAgICAgICAvLyB0aGUgdmlld3Mgd2lsbCBiZSByZWNvbnN0cnVjdGVkIGJhc2VkIG9uIHRoZSBuZXcgb3JpZW50YXRpb24sIGV0Yy4KIApAQCAtMzkzLDcgKzQxNiwxMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgb3BlblBhbmVsKGludCBmZWF0dXJlSWQsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG9wZW5QYW5lbChnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSksIGV2ZW50KTsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGVuUGFuZWwoZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpLCBldmVudCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb3BlblBhbmVsKFBhbmVsRmVhdHVyZVN0YXRlIHN0LCBLZXlFdmVudCBldmVudCkgewpAQCAtNDg0LDcgKzUxMiwxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgY2xvc2VQYW5lbChpbnQgZmVhdHVyZUlkKSB7Ci0gICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9DT05URVhUX01FTlUpIHsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfQ09OVEVYVF9NRU5VKSB7CiAgICAgICAgICAgICBjbG9zZUNvbnRleHRNZW51KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbG9zZVBhbmVsKGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKSwgdHJ1ZSk7CkBAIC01NDUsNiArNTc2LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CisgICAgICAgIGlmIChzdC5tZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0Lm1lbnUuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSB0cnVlOworICAgICAgICBzdC5yZWZyZXNoRGVjb3JWaWV3ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFByZXBhcmUgdGhlIG9wdGlvbnMgcGFuZWwgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gYmFyCisgICAgICAgIGlmICgoZmVhdHVyZUlkID09IEZFQVRVUkVfQUNUSU9OX0JBUiB8fCBmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMKQorICAgICAgICAgICAgICAgICYmIG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3QgPSBnZXRQYW5lbFN0YXRlKFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3QuaXNQcmVwYXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHByZXBhcmVQYW5lbChzdCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhbmVsIGtleSBpcyBwdXNoZWQgZG93bi4KICAgICAgKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSBmZWF0dXJlIElEIG9mIHRoZSByZWxldmFudCBwYW5lbCAoZGVmYXVsdHMgdG8gRkVBVFVSRV9PUFRJT05TX1BBTkVMfS4KQEAgLTU1OCw3ICs2MDksNyBAQAogICAgICAgICAgICAgLy8gVGhlIHBhbmVsIGtleSB3YXMgcHVzaGVkLCBzbyBzZXQgdGhlIGNob3JkaW5nIGtleQogICAgICAgICAgICAgbVBhbmVsQ2hvcmRpbmdLZXkgPSBrZXlDb2RlOwogICAgICAgICAgICAgbVBhbmVsTWF5TG9uZ1ByZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CiAgICAgICAgICAgICBpZiAoIXN0LmlzT3BlbikgewogICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkCkBAIC01NjcsNyArNjE4LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVQYW5lbChzdCwgZXZlbnQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCiAgICAgICAgIH0gZWxzZSBpZiAobVBhbmVsTWF5TG9uZ1ByZXNzICYmIG1QYW5lbENob3JkaW5nS2V5ID09IGtleUNvZGUKICAgICAgICAgICAgICAgICAmJiAoZXZlbnQuZ2V0RmxhZ3MoKSZLZXlFdmVudC5GTEFHX0xPTkdfUFJFU1MpICE9IDApIHsKICAgICAgICAgICAgIC8vIFdlIGhhdmUgaGFkIGEgbG9uZyBwcmVzcyB3aGlsZSBpbiBhIHN0YXRlIHdoZXJlIHRoaXMKQEAgLTYwMiwyNSArNjUyLDM4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGJvb2xlYW4gcGxheVNvdW5kRWZmZWN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChzdC5pc09wZW4gfHwgc3QuaXNIYW5kbGVkKSB7CisgICAgICAgICAgICBmaW5hbCBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMICYmIG1BY3Rpb25CYXIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dSZXNlcnZlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQWN0aW9uQmFyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENhbGxiYWNrIGNiID0gZ2V0Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi5vblByZXBhcmVQYW5lbChmZWF0dXJlSWQsIHN0LmNyZWF0ZWRQYW5lbFZpZXcsIHN0Lm1lbnUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBtQWN0aW9uQmFyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IG1BY3Rpb25CYXIuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LmlzT3BlbiB8fCBzdC5pc0hhbmRsZWQpIHsKIAotICAgICAgICAgICAgICAgIC8vIFBsYXkgdGhlIHNvdW5kIGVmZmVjdCBpZiB0aGUgdXNlciBjbG9zZWQgYW4gb3BlbiBtZW51IChhbmQgbm90IGlmCi0gICAgICAgICAgICAgICAgLy8gdGhleSBqdXN0IHJlbGVhc2VkIGEgbWVudSBzaG9ydGN1dCkKLSAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBzdC5pc09wZW47CisgICAgICAgICAgICAgICAgICAgIC8vIFBsYXkgdGhlIHNvdW5kIGVmZmVjdCBpZiB0aGUgdXNlciBjbG9zZWQgYW4gb3BlbiBtZW51IChhbmQgbm90IGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXkganVzdCByZWxlYXNlZCBhIG1lbnUgc2hvcnRjdXQpCisgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IHN0LmlzT3BlbjsKIAotICAgICAgICAgICAgICAgIC8vIENsb3NlIG1lbnUKLSAgICAgICAgICAgICAgICBjbG9zZVBhbmVsKHN0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgbWVudQorICAgICAgICAgICAgICAgICAgICBjbG9zZVBhbmVsKHN0LCB0cnVlKTsKIAotICAgICAgICAgICAgfSBlbHNlIGlmIChzdC5pc1ByZXBhcmVkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdC5pc1ByZXBhcmVkKSB7CiAKLSAgICAgICAgICAgICAgICAvLyBXcml0ZSAnbWVudSBvcGVuZWQnIHRvIGV2ZW50IGxvZwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDEsIDApOworICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSAnbWVudSBvcGVuZWQnIHRvIGV2ZW50IGxvZworICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDUwMDAxLCAwKTsKIAotICAgICAgICAgICAgICAgIC8vIFNob3cgbWVudQotICAgICAgICAgICAgICAgIG9wZW5QYW5lbChzdCwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAvLyBTaG93IG1lbnUKKyAgICAgICAgICAgICAgICAgICAgb3BlblBhbmVsKHN0LCBldmVudCk7CiAKLSAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHBsYXlTb3VuZEVmZmVjdCkgewpAQCAtNzc3LDggKzg0MCwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCi0gICAgICAgIG5ldyBNZW51RGlhbG9nSGVscGVyKHN1Yk1lbnUpLnNob3cobnVsbCk7CisgICAgICAgIGZpbmFsIE1lbnUgcGFyZW50TWVudSA9IHN1Yk1lbnUuZ2V0Um9vdE1lbnUoKTsKKyAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgcGFuZWwgPSBmaW5kTWVudVBhbmVsKHBhcmVudE1lbnUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0aGUgcGFuZWwgb3BlbiBzdGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGNvbWluZyBmcm9tIGFuIG9wZW4gcGFuZWwKKyAgICAgICAgICogb3IgYW4gYWN0aW9uIGJ1dHRvbi4gSWYgaXQncyBhbiBvcGVuIHBhbmVsIHdlIHdhbnQgdG8gdXNlIE1lbnVEaWFsb2dIZWxwZXIuCisgICAgICAgICAqIElmIGl0J3MgY2xvc2VkIHdlIHdhbnQgdG8gZ3JhYiB0aGUgcmVsZXZhbnQgdmlldyBhbmQgY3JlYXRlIGEgcG9wdXAgYW5jaG9yZWQgdG8gaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAocGFuZWwuaXNPcGVuKSB7CisgICAgICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCisgICAgICAgICAgICBuZXcgTWVudURpYWxvZ0hlbHBlcihzdWJNZW51KS5zaG93KG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihnZXRDb250ZXh0KCksIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTc4OCw2ICs4NjMsMjEgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVvcGVuTWVudShib29sZWFuIHRvZ2dsZU1lbnVNb2RlKSB7CisgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbUFjdGlvbkJhci5pc092ZXJmbG93TWVudVNob3dpbmcoKSB8fCAhdG9nZ2xlTWVudU1vZGUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDYWxsYmFjayBjYiA9IGdldENhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYi5vblByZXBhcmVQYW5lbChGRUFUVVJFX09QVElPTlNfUEFORUwsIHN0LmNyZWF0ZWRQYW5lbFZpZXcsIHN0Lm1lbnUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCB0cnVlKTsKIAogICAgICAgICAvLyBTYXZlIHRoZSBmdXR1cmUgZXhwYW5kZWQgbW9kZSBzdGF0ZSBzaW5jZSBjbG9zZVBhbmVsIHdpbGwgcmVzZXQgaXQKQEAgLTE0MTQsNyArMTUwNCwxMSBAQAogICAgICAgICBzZW5kQ2xvc2VTeXN0ZW1XaW5kb3dzKCk7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fQ0FMTF9CVVRUT04pOwogICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJObyBhY3Rpdml0eSBmb3VuZCBmb3IgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkNBTExfQlVUVE9OLiIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNDM3LDYgKzE1MzEsNyBAQAogICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBGT0NVU0VEX0lEX1RBRyA9ICJhbmRyb2lkOmZvY3VzZWRWaWV3SWQiOwogICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBWSUVXU19UQUcgPSAiYW5kcm9pZDp2aWV3cyI7CiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFBBTkVMU19UQUcgPSAiYW5kcm9pZDpQYW5lbHMiOworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBBQ1RJT05fQkFSX1RBRyA9ICJhbmRyb2lkOkFjdGlvbkJhciI7CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIEBPdmVycmlkZQpAQCAtMTQ3MCw2ICsxNTY1LDEwIEBACiAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoUEFORUxTX1RBRywgcGFuZWxTdGF0ZXMpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0Qm9vbGVhbihBQ1RJT05fQkFSX1RBRywgbUFjdGlvbkJhci5pc092ZXJmbG93TWVudVNob3dpbmcoKSk7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gb3V0U3RhdGU7CiAgICAgfQogCkBAIC0xNTA0LDYgKzE2MDMsMTAgQEAKICAgICAgICAgaWYgKHBhbmVsU3RhdGVzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlc3RvcmVQYW5lbFN0YXRlKHBhbmVsU3RhdGVzKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwgJiYgc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEJvb2xlYW4oQUNUSU9OX0JBUl9UQUcpKSB7CisgICAgICAgICAgICBtQWN0aW9uQmFyLnBvc3RTaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE1OTQsNiArMTY5Nyw5IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtV2F0Y2hpbmdGb3JNZW51OwogICAgICAgICBwcml2YXRlIGludCBtRG93blk7CiAKKyAgICAgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlIG1BY3Rpb25Nb2RlOworICAgICAgICBwcml2YXRlIEFjdGlvbkJhckNvbnRleHRWaWV3IG1BY3Rpb25Nb2RlVmlldzsKKwogICAgICAgICBwdWJsaWMgRGVjb3JWaWV3KENvbnRleHQgY29udGV4dCwgaW50IGZlYXR1cmVJZCkgewogICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CiAgICAgICAgICAgICBtRmVhdHVyZUlkID0gZmVhdHVyZUlkOwpAQCAtMTYwMiw3ICsxNzA4LDggQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBrZXlDb2RlID0gZXZlbnQuZ2V0S2V5Q29kZSgpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Rvd24gPSBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNEb3duID0gYWN0aW9uID09IEtleUV2ZW50LkFDVElPTl9ET1dOOwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogSWYgdGhlIHVzZXIgaGl0cyBhbm90aGVyIGtleSB3aXRoaW4gdGhlIHBsYXkgc291bmQgZGVsYXksIHRoZW4KQEAgLTE2NTksNiArMTc2NiwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gQmFjayBjYW5jZWxzIGFjdGlvbiBtb2RlcyBmaXJzdC4KKyAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSBudWxsICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLKSB7CisgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBmaW5hbCBDYWxsYmFjayBjYiA9IGdldENhbGxiYWNrKCk7CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhbmRsZWQgPSBjYiAhPSBudWxsICYmIG1GZWF0dXJlSWQgPCAwID8gY2IuZGlzcGF0Y2hLZXlFdmVudChldmVudCkKICAgICAgICAgICAgICAgICAgICAgOiBzdXBlci5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KTsKQEAgLTE4ODEsNiArMTk5Niw1NSBAQAogICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0TWVudUhlbHBlciAhPSBudWxsOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LAorICAgICAgICAgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIC8vIG9yaWdpbmFsVmlldyBjYW4gYmUgdXNlZCBoZXJlIHRvIGJlIHN1cmUgdGhhdCB3ZSBkb24ndCBvYnNjdXJlCisgICAgICAgICAgICAvLyByZWxldmFudCBjb250ZW50IHdpdGggdGhlIGNvbnRleHQgbW9kZSBVSS4KKyAgICAgICAgICAgIHJldHVybiBzdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBBY3Rpb25Nb2RlLkNhbGxiYWNrIHdyYXBwZWRDYWxsYmFjayA9IG5ldyBBY3Rpb25Nb2RlQ2FsbGJhY2tXcmFwcGVyKGNhbGxiYWNrKTsKKyAgICAgICAgICAgIEFjdGlvbk1vZGUgbW9kZSA9IGdldENhbGxiYWNrKCkub25TdGFydEFjdGlvbk1vZGUod3JhcHBlZENhbGxiYWNrKTsKKyAgICAgICAgICAgIGlmIChtb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRmVhdHVyZShGRUFUVVJFX0FDVElPTl9NT0RFX09WRVJMQVkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZVZpZXcgPSBuZXcgQWN0aW9uQmFyQ29udGV4dFZpZXcobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVENIX1BBUkVOVCwgV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZpZXcobUFjdGlvbk1vZGVWaWV3LCBwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgVmlld1N0dWIgc3R1YiA9IChWaWV3U3R1YikgZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9tb2RlX2Jhcl9zdHViKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHViICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZVZpZXcgPSAoQWN0aW9uQmFyQ29udGV4dFZpZXcpIHN0dWIuaW5mbGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBuZXcgU3RhbmRhbG9uZUFjdGlvbk1vZGUoZ2V0Q29udGV4dCgpLCBtQWN0aW9uTW9kZVZpZXcsIHdyYXBwZWRDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5vbkNyZWF0ZUFjdGlvbk1vZGUobW9kZSwgbW9kZS5nZXRNZW51KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldy5pbml0Rm9yTW9kZShtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbk1vZGU7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBzdGFydENoYW5naW5nKCkgewogICAgICAgICAgICAgbUNoYW5naW5nID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtMjA2MCw2ICsyMjI0LDM3IEBACiAgICAgICAgICAgICBpZiAoa2VlcE9uKSBQaG9uZVdpbmRvdy50aGlzLmFkZEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04pOwogICAgICAgICAgICAgZWxzZSBQaG9uZVdpbmRvdy50aGlzLmNsZWFyRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CiAgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xlYXJzIG91dCBpbnRlcm5hbCByZWZlcmVuY2Ugd2hlbiB0aGUgYWN0aW9uIG1vZGUgaXMgZGVzdHJveWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBBY3Rpb25Nb2RlQ2FsbGJhY2tXcmFwcGVyIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisgICAgICAgICAgICBwcml2YXRlIEFjdGlvbk1vZGUuQ2FsbGJhY2sgbVdyYXBwZWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlQ2FsbGJhY2tXcmFwcGVyKEFjdGlvbk1vZGUuQ2FsbGJhY2sgd3JhcHBlZCkgeworICAgICAgICAgICAgICAgIG1XcmFwcGVkID0gd3JhcHBlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtZW51KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vblByZXBhcmVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vbkFjdGlvbkl0ZW1DbGlja2VkKG1vZGUsIGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSkgeworICAgICAgICAgICAgICAgIG1XcmFwcGVkLm9uRGVzdHJveUFjdGlvbk1vZGUobW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldy5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcm90ZWN0ZWQgRGVjb3JWaWV3IGdlbmVyYXRlRGVjb3IoKSB7CkBAIC0yMTA4LDYgKzIzMDMsMTcgQEAKIAogICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dOb1RpdGxlLCBmYWxzZSkpIHsKICAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICB9IGVsc2UgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93QWN0aW9uQmFyLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGFsbG93IGFuIGFjdGlvbiBiYXIgaWYgdGhlcmUgaXMgbm8gdGl0bGUuCisgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93QWN0aW9uQmFyT3ZlcmxheSwgZmFsc2UpKSB7CisgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSwgZmFsc2UpKSB7CisgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX0FDVElPTl9NT0RFX09WRVJMQVkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93RnVsbHNjcmVlbiwgZmFsc2UpKSB7CkBAIC0yMTcyLDExICsyMzc4LDE1IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX3RpdGxlX2ljb25zOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gWFhYIFJlbW92ZSB0aGlzIG9uY2UgYWN0aW9uIGJhciBzdXBwb3J0cyB0aGVzZSBmZWF0dXJlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGUgSWNvbnMhIik7CiAgICAgICAgIH0gZWxzZSBpZiAoKGZlYXR1cmVzICYgKCgxIDw8IEZFQVRVUkVfUFJPR1JFU1MpIHwgKDEgPDwgRkVBVFVSRV9JTkRFVEVSTUlOQVRFX1BST0dSRVNTKSkpICE9IDApIHsKICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYSB3aW5kb3cgd2l0aCBvbmx5IGEgcHJvZ3Jlc3MgYmFyIChhbmQgdGl0bGUpLgogICAgICAgICAgICAgLy8gWFhYIE5lZWQgdG8gaGF2ZSBhIG5vLXRpdGxlIHZlcnNpb24gb2YgZW1iZWRkZWQgd2luZG93cy4KICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX3Byb2dyZXNzOworICAgICAgICAgICAgLy8gWFhYIFJlbW92ZSB0aGlzIG9uY2UgYWN0aW9uIGJhciBzdXBwb3J0cyB0aGVzZSBmZWF0dXJlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvZ3Jlc3MhIik7CiAgICAgICAgIH0gZWxzZSBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9DVVNUT01fVElUTEUpKSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgd2luZG93IHdpdGggYSBjdXN0b20gdGl0bGUuCkBAIC0yMTg2LDExICsyMzk2LDE5IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX2N1c3RvbV90aXRsZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFhYWCBSZW1vdmUgdGhpcyBvbmNlIGFjdGlvbiBiYXIgc3VwcG9ydHMgdGhlc2UgZmVhdHVyZXMuCisgICAgICAgICAgICByZW1vdmVGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUik7CiAgICAgICAgIH0gZWxzZSBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9OT19USVRMRSkpID09IDApIHsKICAgICAgICAgICAgIC8vIElmIG5vIG90aGVyIGZlYXR1cmVzIGFuZCBub3QgZW1iZWRkZWQsIG9ubHkgbmVlZCBhIHRpdGxlLgogICAgICAgICAgICAgLy8gSWYgdGhlIHdpbmRvdyBpcyBmbG9hdGluZywgd2UgbmVlZCBhIGRpYWxvZyBsYXlvdXQKICAgICAgICAgICAgIGlmIChtSXNGbG9hdGluZykgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuZGlhbG9nX3RpdGxlOworICAgICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX0FDVElPTl9CQVIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fYWN0aW9uX2JhcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX3RpdGxlOwogICAgICAgICAgICAgfQpAQCAtMjI3NSw2ICsyNDkzLDIyIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uQmFyID0gKEFjdGlvbkJhclZpZXcpIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXIpOworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25CYXIuZ2V0VGl0bGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNldFdpbmRvd1RpdGxlKG1UaXRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gUG9zdCB0aGUgcGFuZWwgaW52YWxpZGF0ZSBmb3IgbGF0ZXI7IGF2b2lkIGFwcGxpY2F0aW9uIG9uQ3JlYXRlT3B0aW9uc01lbnUKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVpbmcgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2Ygb25DcmVhdGUgb3Igc2ltaWxhci4KKyAgICAgICAgICAgICAgICAgICAgbURlY29yLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNEZXN0cm95ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUGFuZWxNZW51KEZFQVRVUkVfQUNUSU9OX0JBUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNjI4LDYgKzI4NjIsOCBAQAogCiAgICAgICAgIGJvb2xlYW4gcmVmcmVzaERlY29yVmlldzsKIAorICAgICAgICBib29sZWFuIHJlZnJlc2hNZW51Q29udGVudDsKKyAgICAgICAgCiAgICAgICAgIGJvb2xlYW4gd2FzTGFzdE9wZW47CiAgICAgICAgIAogICAgICAgICBib29sZWFuIHdhc0xhc3RFeHBhbmRlZDsKQEAgLTI3NTAsMTEgKzI5ODYsMTEgQEAKICAgICAgKiA8bGk+IENhbGxzIGJhY2sgdG8gdGhlIGNhbGxiYWNrJ3Mgb25NZW51SXRlbVNlbGVjdGVkIHdoZW4gYW4gaXRlbSBpcwogICAgICAqIHNlbGVjdGVkLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29udGV4dE1lbnVDYWxsYmFjayBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIERpYWxvZ01lbnVDYWxsYmFjayBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUZlYXR1cmVJZDsKICAgICAgICAgcHJpdmF0ZSBNZW51RGlhbG9nSGVscGVyIG1TdWJNZW51SGVscGVyOwogCi0gICAgICAgIHB1YmxpYyBDb250ZXh0TWVudUNhbGxiYWNrKGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgcHVibGljIERpYWxvZ01lbnVDYWxsYmFjayhpbnQgZmVhdHVyZUlkKSB7CiAgICAgICAgICAgICBtRmVhdHVyZUlkID0gZmVhdHVyZUlkOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCmluZGV4IGYyMWQzNTcuLjY4ZTBlMzIgMTAwNzU1Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQpAQCAtNDYsNiArNDYsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlNodXRkb3duVGhyZWFkOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5Qb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyU2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueTsKQEAgLTg4LDYgKzkwLDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQVBQTElDQVRJT05fUEFORUw7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0FQUExJQ0FUSU9OX1NVQl9QQU5FTDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQVBQTElDQVRJT05fQVRUQUNIRURfRElBTE9HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9EUkFHOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9LRVlHVUFSRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfS0VZR1VBUkRfRElBTE9HOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9QSE9ORTsKQEAgLTEyNiw2ICsxMjksMTAgQEAKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19MQVlPVVQgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX1NUQVJUSU5HX0FOSU1BVElPTlMgPSB0cnVlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1dfUFJPQ0VTU0VTX09OX0FMVF9NRU5VID0gZmFsc2U7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IExPTkdfUFJFU1NfUE9XRVJfTk9USElORyA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBMT05HX1BSRVNTX1BPV0VSX0dMT0JBTF9BQ1RJT05TID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IExPTkdfUFJFU1NfUE9XRVJfU0hVVF9PRkYgPSAyOwogICAgIAogICAgIC8vIHdhbGxwYXBlciBpcyBhdCB0aGUgYm90dG9tLCB0aG91Z2ggdGhlIHdpbmRvdyBtYW5hZ2VyIG1heSBtb3ZlIGl0LgogICAgIHN0YXRpYyBmaW5hbCBpbnQgV0FMTFBBUEVSX0xBWUVSID0gMjsKQEAgLTE1MSw4ICsxNTgsMTEgQEAKICAgICAvLyByZXNwb25zaWJsZSBmb3IgcG93ZXIgbWFuYWdlbWVudCB3aGVuIGRpc3BsYXllZC4KICAgICBzdGF0aWMgZmluYWwgaW50IEtFWUdVQVJEX0xBWUVSID0gMTQ7CiAgICAgc3RhdGljIGZpbmFsIGludCBLRVlHVUFSRF9ESUFMT0dfTEFZRVIgPSAxNTsKKyAgICAvLyB0aGUgZHJhZyBsYXllcjogaW5wdXQgZm9yIGRyYWctYW5kLWRyb3AgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2luZG93LAorICAgIC8vIHdoaWNoIHNpdHMgYWJvdmUgYWxsIG90aGVyIGZvY3VzYWJsZSB3aW5kb3dzCisgICAgc3RhdGljIGZpbmFsIGludCBEUkFHX0xBWUVSID0gMTY7CiAgICAgLy8gdGhpbmdzIGluIGhlcmUgQ0FOIE5PVCB0YWtlIGZvY3VzLCBidXQgYXJlIHNob3duIG9uIHRvcCBvZiBldmVyeXRoaW5nIGVsc2UuCi0gICAgc3RhdGljIGZpbmFsIGludCBTWVNURU1fT1ZFUkxBWV9MQVlFUiA9IDE2OworICAgIHN0YXRpYyBmaW5hbCBpbnQgU1lTVEVNX09WRVJMQVlfTEFZRVIgPSAxNzsKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgQVBQTElDQVRJT05fTUVESUFfU1VCTEFZRVIgPSAtMjsKICAgICBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OX01FRElBX09WRVJMQVlfU1VCTEFZRVIgPSAtMTsKQEAgLTE3Niw2ICsxODYsNyBAQAogICAgIENvbnRleHQgbUNvbnRleHQ7CiAgICAgSVdpbmRvd01hbmFnZXIgbVdpbmRvd01hbmFnZXI7CiAgICAgTG9jYWxQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKKyAgICBJU3RhdHVzQmFyU2VydmljZSBtU3RhdHVzQmFyU2VydmljZTsKICAgICBWaWJyYXRvciBtVmlicmF0b3I7IC8vIFZpYnJhdG9yIGZvciBnaXZpbmcgZmVlZGJhY2sgb2Ygb3JpZW50YXRpb24gY2hhbmdlcwogCiAgICAgLy8gVmlicmF0b3IgcGF0dGVybiBmb3IgaGFwdGljIGZlZWRiYWNrIG9mIGEgbG9uZyBwcmVzcy4KQEAgLTE5OCw2ICsyMDksNyBAQAogICAgIAogICAgIGJvb2xlYW4gbVNhZmVNb2RlOwogICAgIFdpbmRvd1N0YXRlIG1TdGF0dXNCYXIgPSBudWxsOworICAgIGJvb2xlYW4gbVN0YXR1c0JhckNhbkhpZGU7CiAgICAgZmluYWwgQXJyYXlMaXN0PFdpbmRvd1N0YXRlPiBtU3RhdHVzQmFyUGFuZWxzID0gbmV3IEFycmF5TGlzdDxXaW5kb3dTdGF0ZT4oKTsKICAgICBXaW5kb3dTdGF0ZSBtS2V5Z3VhcmQgPSBudWxsOwogICAgIEtleWd1YXJkVmlld01lZGlhdG9yIG1LZXlndWFyZE1lZGlhdG9yOwpAQCAtMjE3LDYgKzIyOSw3IEBACiAgICAgYm9vbGVhbiBtRGVza0RvY2tFbmFibGVzQWNjZWxlcm9tZXRlcjsKICAgICBpbnQgbUxpZEtleWJvYXJkQWNjZXNzaWJpbGl0eTsKICAgICBpbnQgbUxpZE5hdmlnYXRpb25BY2Nlc3NpYmlsaXR5OworICAgIGludCBtTG9uZ1ByZXNzT25Qb3dlckJlaGF2aW9yID0gLTE7CiAgICAgYm9vbGVhbiBtU2NyZWVuT24gPSBmYWxzZTsKICAgICBib29sZWFuIG1PcmllbnRhdGlvblNlbnNvckVuYWJsZWQgPSBmYWxzZTsKICAgICBpbnQgbUN1cnJlbnRBcHBPcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fVU5TUEVDSUZJRUQ7CkBAIC0yNjQsNiArMjc3LDcgQEAKICAgICBzdGF0aWMgZmluYWwgUmVjdCBtVG1wVmlzaWJsZUZyYW1lID0gbmV3IFJlY3QoKTsKICAgICAKICAgICBXaW5kb3dTdGF0ZSBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlOworICAgIGJvb2xlYW4gbVRvcElzRnVsbHNjcmVlbjsKICAgICBib29sZWFuIG1Gb3JjZVN0YXR1c0JhcjsKICAgICBib29sZWFuIG1IaWRlTG9ja1NjcmVlbjsKICAgICBib29sZWFuIG1EaXNtaXNzS2V5Z3VhcmQ7CkBAIC0yOTMsNiArMzA3LDkgQEAKIAogICAgIC8vIE5vdGhpbmcgdG8gc2VlIGhlcmUsIG1vdmUgYWxvbmcuLi4KICAgICBpbnQgbUZhbmN5Um90YXRpb25BbmltYXRpb247CisgICAgCisgICAgLy8gRW5hYmxlIDNEIHJlY2VudHMgYmFzZWQgb24gY29uZmlnIHNldHRpbmdzLgorICAgIHByaXZhdGUgQm9vbGVhbiBtVXNlM2RSZWNlbnRzOwogCiAgICAgU2hvcnRjdXRNYW5hZ2VyIG1TaG9ydGN1dE1hbmFnZXI7CiAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1Ccm9hZGNhc3RXYWtlTG9jazsKQEAgLTQ1NiwxMCArNDczLDI3IEBACiAKICAgICBSdW5uYWJsZSBtUG93ZXJMb25nUHJlc3MgPSBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIG1TaG91bGRUdXJuT2ZmT25LZXlVcCA9IGZhbHNlOwotICAgICAgICAgICAgcGVyZm9ybUhhcHRpY0ZlZWRiYWNrTHcobnVsbCwgSGFwdGljRmVlZGJhY2tDb25zdGFudHMuTE9OR19QUkVTUywgZmFsc2UpOwotICAgICAgICAgICAgc2VuZENsb3NlU3lzdGVtV2luZG93cyhTWVNURU1fRElBTE9HX1JFQVNPTl9HTE9CQUxfQUNUSU9OUyk7Ci0gICAgICAgICAgICBzaG93R2xvYmFsQWN0aW9uc0RpYWxvZygpOworICAgICAgICAgICAgLy8gVGhlIGNvbnRleHQgaXNuJ3QgcmVhZAorICAgICAgICAgICAgaWYgKG1Mb25nUHJlc3NPblBvd2VyQmVoYXZpb3IgPCAwKSB7CisgICAgICAgICAgICAgICAgbUxvbmdQcmVzc09uUG93ZXJCZWhhdmlvciA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX2xvbmdQcmVzc09uUG93ZXJCZWhhdmlvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG1Mb25nUHJlc3NPblBvd2VyQmVoYXZpb3IpIHsKKyAgICAgICAgICAgIGNhc2UgTE9OR19QUkVTU19QT1dFUl9OT1RISU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMT05HX1BSRVNTX1BPV0VSX0dMT0JBTF9BQ1RJT05TOgorICAgICAgICAgICAgICAgIG1TaG91bGRUdXJuT2ZmT25LZXlVcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHBlcmZvcm1IYXB0aWNGZWVkYmFja0x3KG51bGwsIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkxPTkdfUFJFU1MsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzZW5kQ2xvc2VTeXN0ZW1XaW5kb3dzKFNZU1RFTV9ESUFMT0dfUkVBU09OX0dMT0JBTF9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICBzaG93R2xvYmFsQWN0aW9uc0RpYWxvZygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMT05HX1BSRVNTX1BPV0VSX1NIVVRfT0ZGOgorICAgICAgICAgICAgICAgIG1TaG91bGRUdXJuT2ZmT25LZXlVcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHBlcmZvcm1IYXB0aWNGZWVkYmFja0x3KG51bGwsIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkxPTkdfUFJFU1MsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzZW5kQ2xvc2VTeXN0ZW1XaW5kb3dzKFNZU1RFTV9ESUFMT0dfUkVBU09OX0dMT0JBTF9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICBTaHV0ZG93blRocmVhZC5zaHV0ZG93bihtQ29udGV4dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwogCkBAIC01MDEsNiArNTM1LDI3IEBACiAgICAgICogQ3JlYXRlIChpZiBuZWNlc3NhcnkpIGFuZCBsYXVuY2ggdGhlIHJlY2VudCBhcHBzIGRpYWxvZwogICAgICAqLwogICAgIHZvaWQgc2hvd1JlY2VudEFwcHNEaWFsb2coKSB7CisgICAgICAgIC8vIFdlIGNhbid0IGluaXRpYWxpemUgdGhpcyBpbiBpbml0KCkgc2luY2UgdGhlIGNvbmZpZ3VyYXRpb24gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4KKyAgICAgICAgaWYgKG1Vc2UzZFJlY2VudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVVzZTNkUmVjZW50cyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oUi5ib29sLmNvbmZpZ19lbmFibGVSZWNlbnRBcHBzM0QpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBVc2UgM2QgUmVjZW50cyBkaWFsb2cKKyAgICAgICAgaWYgKG1Vc2UzZFJlY2VudHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5zeXN0ZW11aSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eSIpOworICAgICAgICAgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyAKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfRVhDTFVERV9GUk9NX1JFQ0VOVFMpOworICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gbGF1bmNoIFJlY2VudEFwcHNJbnRlbnQiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZhbGxiYWNrIHRvIGRpYWxvZyBpZiB3ZSBmYWlsIHRvIGxhdW5jaCB0aGUgYWJvdmUuCiAgICAgICAgIGlmIChtUmVjZW50QXBwc0RpYWxvZyA9PSBudWxsKSB7CiAgICAgICAgICAgICBtUmVjZW50QXBwc0RpYWxvZyA9IG5ldyBSZWNlbnRBcHBsaWNhdGlvbnNEaWFsb2cobUNvbnRleHQpOwogICAgICAgICB9CkBAIC01MzIsNiArNTg3LDcgQEAKICAgICAgICAgbURlc2tEb2NrSW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9ERVNLX0RPQ0spOwogICAgICAgICBtRGVza0RvY2tJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sKICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEKTsKKwogICAgICAgICBQb3dlck1hbmFnZXIgcG0gPSAoUG93ZXJNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogICAgICAgICBtQnJvYWRjYXN0V2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgIlBob25lV2luZG93TWFuYWdlci5tQnJvYWRjYXN0V2FrZUxvY2siKTsKQEAgLTU3NCw2ICs2MzAsOSBAQAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3NhZmVNb2RlRGlzYWJsZWRWaWJlUGF0dGVybik7CiAgICAgICAgIG1TYWZlTW9kZUVuYWJsZWRWaWJlUGF0dGVybiA9IGdldExvbmdJbnRBcnJheShtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ19zYWZlTW9kZUVuYWJsZWRWaWJlUGF0dGVybik7CisKKyAgICAgICAgLy8gTm90ZTogdGhlIENvbmZpZ3VyYXRpb24gaXMgbm90IHN0YWJsZSBoZXJlLCBzbyB3ZSBjYW5ub3QgbG9hZCBtU3RhdHVzQmFyQ2FuSGlkZSBmcm9tCisgICAgICAgIC8vIGNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlIGJlY2F1c2UgdGhlIGxhdHRlciBkZXBlbmRzIG9uIHRoZSBzY3JlZW4gc2l6ZQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVNldHRpbmdzKCkgewpAQCAtODEwLDYgKzg2OSw4IEBACiAgICAgICAgICAgICByZXR1cm4gVE9BU1RfTEFZRVI7CiAgICAgICAgIGNhc2UgVFlQRV9XQUxMUEFQRVI6CiAgICAgICAgICAgICByZXR1cm4gV0FMTFBBUEVSX0xBWUVSOworICAgICAgICBjYXNlIFRZUEVfRFJBRzoKKyAgICAgICAgICAgIHJldHVybiBEUkFHX0xBWUVSOwogICAgICAgICB9CiAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gd2luZG93IHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICAgcmV0dXJuIEFQUExJQ0FUSU9OX0xBWUVSOwpAQCAtOTg2LDYgKzEwNDcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdpbmRvd01hbmFnZXJJbXBsLkFERF9NVUxUSVBMRV9TSU5HTEVUT047CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TdGF0dXNCYXIgPSB3aW47CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgQ29uZmlndXJhdGlvbiB3aWxsIGJlIHN0YWJsZSBieSBub3csIHNvIHdlIGNhbiBsb2FkIHRoaXMKKyAgICAgICAgICAgICAgICBtU3RhdHVzQmFyQ2FuSGlkZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX3N0YXR1c0JhckNhbkhpZGUpOworCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRZUEVfU1RBVFVTX0JBUl9QQU5FTDoKICAgICAgICAgICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCkBAIC0xMjQ0LDcgKzEzMTAsNyBAQAogICAgIHB1YmxpYyB2b2lkIGdldENvbnRlbnRJbnNldEhpbnRMdyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBhdHRycywgUmVjdCBjb250ZW50SW5zZXQpIHsKICAgICAgICAgZmluYWwgaW50IGZsID0gYXR0cnMuZmxhZ3M7CiAgICAgICAgIAotICAgICAgICBpZiAoKGZsICYKKyAgICAgICAgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmCiAgICAgICAgICAgICAgICAgKEZMQUdfTEFZT1VUX0lOX1NDUkVFTiB8IEZMQUdfRlVMTFNDUkVFTiB8IEZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SKSkKICAgICAgICAgICAgICAgICA9PSAoRkxBR19MQVlPVVRfSU5fU0NSRUVOIHwgRkxBR19MQVlPVVRfSU5TRVRfREVDT1IpKSB7CiAgICAgICAgICAgICBjb250ZW50SW5zZXQuc2V0KG1DdXJMZWZ0LCBtQ3VyVG9wLCBtVyAtIG1DdXJSaWdodCwgbUggLSBtQ3VyQm90dG9tKTsKQEAgLTEyNzcsMTAgKzEzNDMsMTcgQEAKICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLmlzVmlzaWJsZUx3KCkpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3RhdHVzIGJhciBpcyBoaWRkZW4sIHdlIGRvbid0IHdhbnQgdG8gY2F1c2UKICAgICAgICAgICAgICAgICAvLyB3aW5kb3dzIGJlaGluZCBpdCB0byBzY3JvbGwuCi0gICAgICAgICAgICAgICAgbURvY2tUb3AgPSBtQ29udGVudFRvcCA9IG1DdXJUb3AgPSBtU3RhdHVzQmFyLmdldEZyYW1lTHcoKS5ib3R0b207Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiU3RhdHVzIGJhcjogbURvY2tCb3R0b209IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtRG9ja0JvdHRvbSArICIgbUNvbnRlbnRCb3R0b209IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29udGVudEJvdHRvbSArICIgbUN1ckJvdHRvbT0iICsgbUN1ckJvdHRvbSk7CisgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByID0gbVN0YXR1c0Jhci5nZXRGcmFtZUx3KCk7CisgICAgICAgICAgICAgICAgaWYgKG1Eb2NrVG9wID09IHIudG9wKSBtRG9ja1RvcCA9IHIuYm90dG9tOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1Eb2NrQm90dG9tID09IHIuYm90dG9tKSBtRG9ja0JvdHRvbSA9IHIudG9wOworICAgICAgICAgICAgICAgIG1Db250ZW50VG9wID0gbUN1clRvcCA9IG1Eb2NrVG9wOworICAgICAgICAgICAgICAgIG1Db250ZW50Qm90dG9tID0gbUN1ckJvdHRvbSA9IG1Eb2NrQm90dG9tOworICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIlN0YXR1cyBiYXI6IG1Eb2NrVG9wPSIgKyBtRG9ja1RvcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1Db250ZW50VG9wPSIgKyBtQ29udGVudFRvcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1DdXJUb3A9IiArIG1DdXJUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtRG9ja0JvdHRvbT0iICsgbURvY2tCb3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ29udGVudEJvdHRvbT0iICsgbUNvbnRlbnRCb3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ3VyQm90dG9tPSIgKyBtQ3VyQm90dG9tKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEzNjUsNyArMTQzOCw3IEBACiAgICAgICAgICAgICBhdHRycy5ncmF2aXR5ID0gR3Jhdml0eS5CT1RUT007CiAgICAgICAgICAgICBtRG9ja0xheWVyID0gd2luLmdldFN1cmZhY2VMYXllcigpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKChmbCAmCisgICAgICAgICAgICBpZiAobVN0YXR1c0JhckNhbkhpZGUgJiYgKGZsICYKICAgICAgICAgICAgICAgICAgICAgKEZMQUdfTEFZT1VUX0lOX1NDUkVFTiB8IEZMQUdfRlVMTFNDUkVFTiB8IEZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SKSkKICAgICAgICAgICAgICAgICAgICAgPT0gKEZMQUdfTEFZT1VUX0lOX1NDUkVFTiB8IEZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SKSkgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGEgbm9ybWFsIGFjdGl2aXR5IHdpbmRvdzogd2Ugd2FudCBpdApAQCAtMTM5Nyw3ICsxNDcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgdmYucmlnaHQgPSBtQ3VyUmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgIHZmLmJvdHRvbSA9IG1DdXJCb3R0b207CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgoZmwgJiBGTEFHX0xBWU9VVF9JTl9TQ1JFRU4pICE9IDApIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXR1c0JhckNhbkhpZGUgJiYgKGZsICYgRkxBR19MQVlPVVRfSU5fU0NSRUVOKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gQSB3aW5kb3cgdGhhdCBoYXMgcmVxdWVzdGVkIHRvIGZpbGwgdGhlIGVudGlyZSBzY3JlZW4ganVzdAogICAgICAgICAgICAgICAgIC8vIGdldHMgZXZlcnl0aGluZywgcGVyaW9kLgogICAgICAgICAgICAgICAgIHBmLmxlZnQgPSBkZi5sZWZ0ID0gY2YubGVmdCA9IDA7CkBAIC0xNTI2LDggKzE1OTksOCBAQAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIGludCBmaW5pc2hBbmltYXRpb25MdygpIHsKICAgICAgICAgaW50IGNoYW5nZXMgPSAwOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBoaWRpbmcgPSBmYWxzZTsKKworICAgICAgICBib29sZWFuIHRvcElzRnVsbHNjcmVlbiA9IGZhbHNlOwogICAgICAgICBpZiAobVN0YXR1c0JhciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobG9jYWxMT0dWKSBMb2cuaShUQUcsICJmb3JjZT0iICsgbUZvcmNlU3RhdHVzQmFyCiAgICAgICAgICAgICAgICAgICAgICsgIiB0b3A9IiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUpOwpAQCAtMTUzNSwxNyArMTYwOCwyNSBAQAogICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIlNob3dpbmcgc3RhdHVzIGJhciIpOwogICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLnNob3dMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL0xvZy5pKFRBRywgImZyYW1lOiAiICsgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRGcmFtZUx3KCkKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKyAiIHNob3duIGZyYW1lOiAiICsgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRTaG93bkZyYW1lTHcoKSk7Ci0gICAgICAgICAgICAgICAgLy9Mb2cuaShUQUcsICJhdHRyOiAiICsgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRBdHRycygpKTsKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9Ci0gICAgICAgICAgICAgICAgICAgIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0QXR0cnMoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhpZGVTdGF0dXNCYXIgPQotICAgICAgICAgICAgICAgICAgICAobHAuZmxhZ3MgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0ZVTExTQ1JFRU4pICE9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGhpZGVTdGF0dXNCYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiSGlkaW5nIHN0YXR1cyBiYXIiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXIuaGlkZUx3KHRydWUpKSBjaGFuZ2VzIHw9IEZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQ7Ci0gICAgICAgICAgICAgICAgICAgIGhpZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgZmluYWwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldEF0dHJzKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmcmFtZTogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0RnJhbWVMdygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNob3duIGZyYW1lOiAiICsgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRTaG93bkZyYW1lTHcoKSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImF0dHI6ICIgKyBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldEF0dHJzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbHAuZmxhZ3M9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyhscC5mbGFncykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3BJc0Z1bGxzY3JlZW4gPSAobHAuZmxhZ3MgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0ZVTExTQ1JFRU4pICE9IDA7CisgICAgICAgICAgICAgICAgLy8gVGhlIHN1YnRsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHdpbmRvdyBmb3IgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZQorICAgICAgICAgICAgICAgIC8vIGFuZCBtVG9wSXNGdWxsc2NyZWVuIGlzIHRoYXQgdGhhdCBtVG9wSXNGdWxsc2NyZWVuIGlzIHNldCBvbmx5IGlmIHRoZSB3aW5kb3cKKyAgICAgICAgICAgICAgICAvLyBoYXMgdGhlIEZMQUdfRlVMTFNDUkVFTiBzZXQuICBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhbm90aGVyIHdheSB0aGF0IHRvIGJlIHRoZQorICAgICAgICAgICAgICAgIC8vIGNhc2UgdGhvdWdoLgorICAgICAgICAgICAgICAgIGlmICh0b3BJc0Z1bGxzY3JlZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJDYW5IaWRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJIaWRpbmcgc3RhdHVzIGJhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXIuaGlkZUx3KHRydWUpKSBjaGFuZ2VzIHw9IEZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxMT0dWKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJQcmV2ZW50aW5nIHN0YXR1cyBiYXIgZnJvbSBoaWRpbmcgYnkgcG9saWN5Iik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTaG93aW5nIHN0YXR1cyBiYXIiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXIuc2hvd0x3KHRydWUpKSBjaGFuZ2VzIHw9IEZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQ7CkBAIC0xNTUzLDIxICsxNjM0LDM2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGlmIChjaGFuZ2VzICE9IDAgJiYgaGlkaW5nKSB7Ci0gICAgICAgICAgICBJU3RhdHVzQmFyU2VydmljZSBzYnMgPSBJU3RhdHVzQmFyU2VydmljZS5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoInN0YXR1c2JhciIpKTsKLSAgICAgICAgICAgIGlmIChzYnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgd2luZG93IHNoYWRlIGlzIGhpZGRlbi4KLSAgICAgICAgICAgICAgICAgICAgc2JzLmNvbGxhcHNlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmICh0b3BJc0Z1bGxzY3JlZW4gIT0gbVRvcElzRnVsbHNjcmVlbikgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0b3BJc0Z1bGxzY3JlZW5GID0gdG9wSXNGdWxsc2NyZWVuOworICAgICAgICAgICAgbVRvcElzRnVsbHNjcmVlbiA9IHRvcElzRnVsbHNjcmVlbjsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0JhclNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9uZSB0aGF0IGNhbiBub3QgZ28gYXdheSwgYnV0IGl0IGRvZXNuJ3QgY29tZSB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgd2luZG93IG1hbmFnZXIgZG9lcywgc28gZG9uJ3QgZmFpbCBpZiBpdCBkb2Vzbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3QuIFRoaXMgd29ya3MgYXMgbG9uZyBhcyBubyBmdWxsc2NyZWVuIHdpbmRvd3MgY29tZSB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlIGRvZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclNlcnZpY2UgPSBJU3RhdHVzQmFyU2VydmljZS5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgic3RhdHVzYmFyIikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1c0JhclNlcnZpY2Ugc2JzID0gbVN0YXR1c0JhclNlcnZpY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0JhclNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNicy5zZXRBY3RpdmVXaW5kb3dJc0Z1bGxzY3JlZW4odG9wSXNGdWxsc2NyZWVuRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZSBiZWNhdXNlIHdlJ3JlIGluIHRoZSBzYW1lIHByb2Nlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJTZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEhpZGUgdGhlIGtleSBndWFyZCBpZiBhIHZpc2libGUgd2luZG93IGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoYXQgaXQgd2FudHMgdG8gYmUgZGlzcGxheWVkCiAgICAgICAgIC8vIHdoZW4gdGhlIHNjcmVlbiBpcyBsb2NrZWQKICAgICAgICAgaWYgKG1LZXlndWFyZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9jYWxMT0dWKSBMb2cudihUQUcsICJmaW5pc2hMYXlvdXRMdzo6bUhpZGVLZXlndWFyZD0iK21IaWRlTG9ja1NjcmVlbik7CisgICAgICAgICAgICBpZiAobG9jYWxMT0dWKSBMb2cudihUQUcsICJmaW5pc2hBbmltYXRpb25Mdzo6bUhpZGVLZXlndWFyZD0iK21IaWRlTG9ja1NjcmVlbik7CiAgICAgICAgICAgICBpZiAobURpc21pc3NLZXlndWFyZCAmJiAhbUtleWd1YXJkTWVkaWF0b3IuaXNTZWN1cmUoKSkgewogICAgICAgICAgICAgICAgIGlmIChtS2V5Z3VhcmQuaGlkZUx3KHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVApkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Qb3dlckRpYWxvZy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Qb3dlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTM1YmQ3Li4wMDAwMDAwCi0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUG93ZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuaW1wbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvY2FsUG93ZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5TaHV0ZG93blRocmVhZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25LZXlMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBHbG9iYWxBY3Rpb25zfSBpbnN0ZWFkLgotICovCi1wdWJsaWMgY2xhc3MgUG93ZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIsCi0gICAgICAgIE9uS2V5TGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUG93ZXJEaWFsb2ciOwotCi0gICAgc3RhdGljIHByaXZhdGUgU3RhdHVzQmFyTWFuYWdlciBzU3RhdHVzQmFyOwotICAgIHByaXZhdGUgQnV0dG9uIG1LZXlndWFyZDsKLSAgICBwcml2YXRlIEJ1dHRvbiBtUG93ZXI7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVJhZGlvUG93ZXI7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVNpbGVudDsKLQotICAgIHByaXZhdGUgTG9jYWxQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKLQotICAgIHB1YmxpYyBQb3dlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIExvY2FsUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlcikgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgbVBvd2VyTWFuYWdlciA9IHBvd2VyTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgIGlmIChzU3RhdHVzQmFyID09IG51bGwpIHsKLSAgICAgICAgICAgIHNTdGF0dXNCYXIgPSAoU3RhdHVzQmFyTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5TVEFUVVNfQkFSX1NFUlZJQ0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucG93ZXJfZGlhbG9nKTsKLQotICAgICAgICBnZXRXaW5kb3coKS5zZXRUeXBlKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1lTVEVNX0RJQUxPRyk7Ci0gICAgICAgIGlmICghZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19zZl9zbG93Qmx1cikpIHsKLSAgICAgICAgICAgIGdldFdpbmRvdygpLnNldEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQkxVUl9CRUhJTkQsCi0gICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQkxVUl9CRUhJTkQpOwotICAgICAgICB9Ci0gICAgICAgIGdldFdpbmRvdygpLnNldEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0pOwotCi0gICAgICAgIHNldFRpdGxlKGNvbnRleHQuZ2V0VGV4dChSLnN0cmluZy5wb3dlcl9kaWFsb2cpKTsKLQotICAgICAgICBtS2V5Z3VhcmQgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5rZXlndWFyZCk7Ci0gICAgICAgIG1Qb3dlciA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLm9mZik7Ci0gICAgICAgIG1SYWRpb1Bvd2VyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQucmFkaW9fcG93ZXIpOwotICAgICAgICBtU2lsZW50ID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuc2lsZW50KTsKLQotICAgICAgICBpZiAobUtleWd1YXJkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1LZXlndWFyZC5zZXRPbktleUxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgbUtleWd1YXJkLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBvd2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qb3dlci5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1SYWRpb1Bvd2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SYWRpb1Bvd2VyLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVNpbGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2lsZW50LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIC8vIFhYWDogSEFDSyBmb3Igbm93IGhpZGUgdGhlIHNpbGVudCB1bnRpbCB3ZSBnZXQgbXV0ZSBzdXBwb3J0Ci0gICAgICAgICAgICBtU2lsZW50LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0OwotCi0gICAgICAgIC8vIHNldCB0aGUga2V5Z3VhcmQgYnV0dG9uJ3MgdGV4dAotICAgICAgICB0ZXh0ID0gY29udGV4dC5nZXRUZXh0KFIuc3RyaW5nLnNjcmVlbl9sb2NrKTsKLSAgICAgICAgbUtleWd1YXJkLnNldFRleHQodGV4dCk7Ci0gICAgICAgIG1LZXlndWFyZC5yZXF1ZXN0Rm9jdXMoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVRlbGVwaG9ueSBwaG9uZSA9IElUZWxlcGhvbnkuU3R1Yi5hc0ludGVyZmFjZShTZXJ2aWNlTWFuYWdlci5jaGVja1NlcnZpY2UoInBob25lIikpOwotICAgICAgICAgICAgaWYgKHBob25lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gcGhvbmUuaXNSYWRpb09uKCkgPyBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGV4dChSLnN0cmluZy50dXJuX29mZl9yYWRpbykgOiBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGV4dChSLnN0cmluZy50dXJuX29uX3JhZGlvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgaXQKLSAgICAgICAgfQotCi0gICAgICAgIG1SYWRpb1Bvd2VyLnNldFRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgdGhpcy5kaXNtaXNzKCk7Ci0gICAgICAgIGlmICh2ID09IG1Qb3dlcikgewotICAgICAgICAgICAgLy8gc2h1dGRvd24gYnkgbWFraW5nIHN1cmUgcmFkaW8gYW5kIHBvd2VyIGFyZSBoYW5kbGVkIGFjY29yZGluZ2x5LgotICAgICAgICAgICAgU2h1dGRvd25UaHJlYWQuc2h1dGRvd24oZ2V0Q29udGV4dCgpLCB0cnVlKTsKLSAgICAgICAgfSBlbHNlIGlmICh2ID09IG1SYWRpb1Bvd2VyKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElUZWxlcGhvbnkgcGhvbmUgPSBJVGVsZXBob255LlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuY2hlY2tTZXJ2aWNlKCJwaG9uZSIpKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZS50b2dnbGVSYWRpb09uT2ZmKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIGl0Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodiA9PSBtU2lsZW50KSB7Ci0gICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcKLSAgICAgICAgfSBlbHNlIGlmICh2ID09IG1LZXlndWFyZCkgewotICAgICAgICAgICAgaWYgKHYuaXNJblRvdWNoTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBpbiB0b3VjaCBtb2RlIGZvciB0aGUgcmVhc29ucyBleHBsYWluZWQgaW4gb25LZXkuCi0gICAgICAgICAgICAgICAgdGhpcy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5nb1RvU2xlZXAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5KFZpZXcgdiwgaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIFRoZSBhY3RpdmF0ZSBrZXlndWFyZCBidXR0b24gbmVlZHMgdG8gcHV0IHRoZSBkZXZpY2UgdG8gc2xlZXAgb24gdGhlCi0gICAgICAgIC8vIGtleSB1cCBldmVudC4gSWYgd2UgdHJ5IHRvIHB1dCBpdCB0byBzbGVlcCBvbiB0aGUgY2xpY2sgb3IgZG93bgotICAgICAgICAvLyBhY3Rpb24KLSAgICAgICAgLy8gdGhlIHRoZSB1cCBhY3Rpb24gd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvIHdha2UgYmFjayB1cC4KLQotICAgICAgICAvLyBMb2cuaShUQUcsICJrZXlDb2RlOiAiICsga2V5Q29kZSArICIgYWN0aW9uOiAiICsgZXZlbnQuZ2V0QWN0aW9uKCkpOwotICAgICAgICBpZiAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSCi0gICAgICAgICAgICAgICAgfHwgZXZlbnQuZ2V0QWN0aW9uKCkgIT0gS2V5RXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICAvLyBMb2cuaShUQUcsICJnZXR0aW5nIG91dCBvZiBkb2RnZS4uLiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9nLmkoVEFHLCAiQ2xpY2tlZCBtS2V5Z3VhcmQhIGRpbWlzc2luZyBkaWFsb2ciKTsKLSAgICAgICAgdGhpcy5kaXNtaXNzKCk7Ci0gICAgICAgIC8vIExvZy5pKFRBRywgIm9uS2V5OiB0dXJuaW5nIG9mZiB0aGUgc2NyZWVuLi4uIik7Ci0gICAgICAgIC8vIFhYWDogVGhpcyBpcyBhIGhhY2sgZm9yIG5vdwotICAgICAgICBtUG93ZXJNYW5hZ2VyLmdvVG9TbGVlcChldmVudC5nZXRFdmVudFRpbWUoKSArIDEpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaG93KCkgewotICAgICAgICBzdXBlci5zaG93KCk7Ci0gICAgICAgIExvZy5kKFRBRywgInNob3cuLi4gZGlzYWJsaW5nIGV4cGFuZCIpOwotICAgICAgICBzU3RhdHVzQmFyLmRpc2FibGUoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKLSAgICAgICAgc3VwZXIuZGlzbWlzcygpOwotICAgICAgICBMb2cuZChUQUcsICJkaXNtaXNzLi4uIHJlZW5hYmxpbmcgZXhwYW5kIik7Ci0gICAgICAgIHNTdGF0dXNCYXIuZGlzYWJsZShTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9ORSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9TdGF0dXNWaWV3LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1N0YXR1c1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjA4Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9TdGF0dXNWaWV3LmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LmltcGw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlRm9ybWF0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2NsYXNzIFN0YXR1c1ZpZXcgeworICAgIHByaXZhdGUgU3RyaW5nIG1EYXRlRm9ybWF0U3RyaW5nOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQ2FycmllcjsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1EYXRlOworCisgICAgLy8gYXJlIHdlIHNob3dpbmcgYmF0dGVyeSBpbmZvcm1hdGlvbj8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IGZhbHNlOworCisgICAgLy8gbGFzdCBrbm93biBwbHVnZ2VkIGluIHN0YXRlCisgICAgcHJpdmF0ZSBib29sZWFuIG1QbHVnZ2VkSW4gPSBmYWxzZTsKKworICAgIC8vIGxhc3Qga25vd24gYmF0dGVyeSBsZXZlbAorICAgIHByaXZhdGUgaW50IG1CYXR0ZXJ5TGV2ZWwgPSAxMDA7CisKKyAgICBwcml2YXRlIFN0cmluZyBtTmV4dEFsYXJtID0gbnVsbDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1JbnN0cnVjdGlvbnMgPSBudWxsOworICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czE7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMjsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1Qcm9wZXJ0eU9mOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNTdGF0dXMyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzQ2FycmllcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0RhdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNQcm9wZXJ0eTsKKworICAgIHByaXZhdGUgVmlldyBtVmlldzsKKworICAgIHByaXZhdGUgVmlldyBmaW5kVmlld0J5SWQoaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtVmlldy5maW5kVmlld0J5SWQoaWQpOworICAgIH0KKworICAgIHByaXZhdGUgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbVZpZXcuZ2V0Q29udGV4dCgpOworICAgIH0KKworICAgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25zKFN0cmluZyBpbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgbUluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uczsKKyAgICB9CisKKyAgICB2b2lkIHNldENhcnJpZXJUZXh0KENoYXJTZXF1ZW5jZSBjYXJyaWVyVGV4dCkgeworICAgICAgICBpZiAobUNhcnJpZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChjYXJyaWVyVGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgeworICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gc2hvd0JhdHRlcnlJbmZvOworICAgICAgICBtUGx1Z2dlZEluID0gcGx1Z2dlZEluOworICAgICAgICBtQmF0dGVyeUxldmVsID0gYmF0dGVyeUxldmVsOworICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgIH0KKworICAgIHZvaWQgb25UaW1lQ2hhbmdlZCgpIHsKKyAgICAgICAgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uUmluZ2VyTW9kZUNoYW5nZWQoaW50IHN0YXRlKSB7CisgICAgfQorCisgICAgdm9pZCBvblJlZnJlc2hDYXJyaWVySW5mbyhDaGFyU2VxdWVuY2UgcGxtbiwgQ2hhclNlcXVlbmNlIHNwbikgeworICAgICAgICBzZXRDYXJyaWVyVGV4dChMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcocGxtbiwgc3BuKSk7CisgICAgfQorCisgICAgcHVibGljIFN0YXR1c1ZpZXcoVmlldyB2aWV3LCBLZXlndWFyZFVwZGF0ZU1vbml0b3IgdXBkYXRlTW9uaXRvciwKKyAgICAgICAgICAgICAgICAgIExvY2tQYXR0ZXJuVXRpbHMgbG9ja1BhdHRlcm5VdGlscykgeworICAgICAgICBtVmlldyA9IHZpZXc7CisgICAgICAgIG1DYXJyaWVyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5jYXJyaWVyKTsKKyAgICAgICAgbUhhc0NhcnJpZXIgPSAobUNhcnJpZXIgIT0gbnVsbCk7CisgICAgICAgIG1EYXRlID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKKyAgICAgICAgbUhhc0RhdGUgPSAobURhdGUgIT0gbnVsbCk7CisgICAgICAgIG1EYXRlRm9ybWF0U3RyaW5nID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5mdWxsX3dkYXlfbW9udGhfZGF5X25vX3llYXIpOworCisgICAgICAgIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKTsKKworICAgICAgICBtU3RhdHVzMSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMSk7CisgICAgICAgIG1TdGF0dXMyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMyKTsKKyAgICAgICAgbUhhc1N0YXR1czIgPSAobVN0YXR1czIgIT0gbnVsbCk7CisgICAgICAgIG1Qcm9wZXJ0eU9mID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5wcm9wZXJ0eU9mKTsKKyAgICAgICAgbUhhc1Byb3BlcnR5ID0gKG1Qcm9wZXJ0eU9mICE9IG51bGwpOworCisgICAgICAgIHJlc2V0U3RhdHVzSW5mbyh1cGRhdGVNb25pdG9yLCBsb2NrUGF0dGVyblV0aWxzKTsKKworICAgICAgICAvLyBSZXF1aXJlZCB0byBnZXQgTWFycXVlZSB0byB3b3JrLgorICAgICAgICBpZiAobUhhc0NhcnJpZXIpIHsKKyAgICAgICAgICAgIG1DYXJyaWVyLnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dENvbG9yKDB4ZmZmZmZmZmYpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0U3RhdHVzSW5mbyhLZXlndWFyZFVwZGF0ZU1vbml0b3IgdXBkYXRlTW9uaXRvciwgTG9ja1BhdHRlcm5VdGlscyBsb2NrUGF0dGVyblV0aWxzKSB7CisgICAgICAgIG1JbnN0cnVjdGlvbnMgPSBudWxsOworICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gdXBkYXRlTW9uaXRvci5zaG91bGRTaG93QmF0dGVyeUluZm8oKTsKKyAgICAgICAgbVBsdWdnZWRJbiA9IHVwZGF0ZU1vbml0b3IuaXNEZXZpY2VQbHVnZ2VkSW4oKTsKKyAgICAgICAgbUJhdHRlcnlMZXZlbCA9IHVwZGF0ZU1vbml0b3IuZ2V0QmF0dGVyeUxldmVsKCk7CisgICAgICAgIG1OZXh0QWxhcm0gPSBsb2NrUGF0dGVyblV0aWxzLmdldE5leHRBbGFybSgpOworICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgIH0KKworICAgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25UZXh0KGludCBzdHJpbmdJZCkgeworICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KHN0cmluZ0lkKTsKKyAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOworICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgfQorCisgICAgdm9pZCBzZXRJbnN0cnVjdGlvblRleHQoU3RyaW5nIHN0cmluZykgeworICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KHN0cmluZyk7CisgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLCAwLCAwKTsKKyAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgIH0KKworICAgIHZvaWQgc2V0Q2FycmllclRleHQoaW50IHN0cmluZ0lkKSB7CisgICAgICAgIG1DYXJyaWVyLnNldFRleHQoc3RyaW5nSWQpOworICAgIH0KKyAgICB2b2lkIHNldENhcnJpZXJUZXh0KFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChzdHJpbmcpOworICAgIH0KKworICAgIC8qKiBPcmlnaW5hdGVkIGZyb20gUGF0dGVyblVubG9ja1NjcmVlbiAqKi8KKyAgICB2b2lkIHVwZGF0ZVN0YXR1c0xpbmVzKCkgeworICAgICAgICBpZiAobUhhc1Byb3BlcnR5KSB7CisgICAgICAgICAgICAvLyBUT0RPIEdldCBhY3R1YWwgbmFtZSAmIGVtYWlsCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJKb2huIFNtaXRoIjsKKyAgICAgICAgICAgIFN0cmluZyBlbWFpbCA9ICJqc21pdGhAZ21haWwuY29tIjsKKyAgICAgICAgICAgIG1Qcm9wZXJ0eU9mLnNldFRleHQoIlByb3BlcnR5IG9mOlxuIiArIG5hbWUgKyAiXG4iICsgZW1haWwpOworICAgICAgICAgICAgbVByb3BlcnR5T2Yuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSGFzU3RhdHVzMikgcmV0dXJuOworCisgICAgICAgIGlmIChtSW5zdHJ1Y3Rpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGluc3RydWN0aW9ucyBvbmx5CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1JbnN0cnVjdGlvbnMpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1JbnN0cnVjdGlvbnMpKSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKDAsIDAsIDAsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoCisgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSBpZiAobVNob3dpbmdCYXR0ZXJ5SW5mbyAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGJhdHRlcnkgb25seQorICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKKyAgICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGV2ZWwgPj0gMTAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fY2hhcmdlZCkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fcGx1Z2dlZF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhdHRlcnlMZXZlbCkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsIDAsCisgICAgICAgICAgICAgICAgICAgIDAsIDApOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKworICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiAhbVNob3dpbmdCYXR0ZXJ5SW5mbykgeworICAgICAgICAgICAgLy8gYWxhcm0gb25seQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9hbGFybSwgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiBtU2hvd2luZ0JhdHRlcnlJbmZvKSB7CisgICAgICAgICAgICAvLyBib3RoIGJhdHRlcnkgYW5kIG5leHQgYWxhcm0KKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oMTAwLCBtQmF0dGVyeUxldmVsKSkpOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2FsYXJtLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKyAgICAgICAgICAgIGlmIChtUGx1Z2dlZEluKSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2NoYXJnaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0dXMyLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcygwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm90aGluZyBzcGVjaWZpYyB0byBzaG93OyBzaG93IGdlbmVyYWwgaW5zdHJ1Y3Rpb25zCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsCisgICAgICAgICAgICAgICAgICAgIDAsIDApOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBPcmlnaW5hdGVkIGZyb20gTG9ja1NjcmVlbiAqKi8KKyAgICAvLyBUT0RPIE1lcmdlIHdpdGggZnVuY3Rpb24gYWJvdmUKKyAgICB2b2lkIHVwZGF0ZVN0YXR1c0xpbmVzKGJvb2xlYW4gc2hvd1N0YXR1c0xpbmVzLCBTdHJpbmcgY2hhcmdpbmcsIERyYXdhYmxlIGNoYXJnaW5nSWNvbiwKKyAgICAgICAgICAgIERyYXdhYmxlIGFsYXJtSWNvbikgeworICAgICAgICBpZiAoIXNob3dTdGF0dXNMaW5lcyB8fCAoY2hhcmdpbmcgPT0gbnVsbCAmJiBtTmV4dEFsYXJtID09IG51bGwpKSB7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgaWYgKGNoYXJnaW5nICE9IG51bGwgJiYgbU5leHRBbGFybSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBjaGFyZ2luZyBvbmx5CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChjaGFyZ2luZyk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoY2hhcmdpbmdJY29uLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTmV4dEFsYXJtICE9IG51bGwgJiYgY2hhcmdpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbmV4dCBhbGFybSBvbmx5CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhhbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9IGVsc2UgaWYgKGNoYXJnaW5nICE9IG51bGwgJiYgbU5leHRBbGFybSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBib3RoIGNoYXJnaW5nIGFuZCBuZXh0IGFsYXJtCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoY2hhcmdpbmcpOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKGNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRUZXh0KG1OZXh0QWxhcm0pOworICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKGFsYXJtSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKSB7CisgICAgICAgIGlmIChtSGFzRGF0ZSkgeworICAgICAgICAgICAgbURhdGUuc2V0VGV4dChEYXRlRm9ybWF0LmZvcm1hdChtRGF0ZUZvcm1hdFN0cmluZywgbmV3IERhdGUoKSkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9wcmVsb2FkZWQtY2xhc3NlcyBiL3ByZWxvYWRlZC1jbGFzc2VzCmluZGV4IDFkNWZiYzA4Li4zMzE3Mjg2IDEwMDY0NAotLS0gYS9wcmVsb2FkZWQtY2xhc3NlcworKysgYi9wcmVsb2FkZWQtY2xhc3NlcwpAQCAtMTM4LDcgKzEzOCw2IEBACiBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcgogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2xvc2FibGUKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNvbXBpbGVkU3FsCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDb250ZW50SGVscGVyCiBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3IKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlCiBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEZWJ1ZwpAQCAtNTYzLDggKzU2Miw2IEBACiBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwogYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyCiBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldwotYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXckRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lcgotYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXckRHJvcERvd25MaXN0VmlldwogYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94CkBAIC01ODIsNiArNTc5LDcgQEAKIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldwogYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3JFNjYWxlVHlwZQogYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0CithbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3cKIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3CiBhbmRyb2lkLndpZGdldC5MaXN0VmlldyRTYXZlZFN0YXRlCiBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIKQEAgLTY4NSw3ICs2ODMsNiBAQAogY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyCiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsCiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXIKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Db250YWN0SGVhZGVyV2lkZ2V0CiBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlhbG9nVGl0bGUKIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5FZGl0YWJsZUlucHV0Q29ubmVjdGlvbgogY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxpbmVhckxheW91dFdpdGhEZWZhdWx0VG91Y2hSZWNlcGllbnQKQEAgLTcyNyw3ICs3MjQsNiBAQAogamF2YS5pby5GaWxlCiBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yCiBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbQotamF2YS5pby5GaWxlSW5wdXRTdHJlYW0kUmVwb3NpdGlvbmluZ0xvY2sKIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uCiBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0KIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0KQEAgLTExMzEsNyArMTEyNyw2IEBACiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLkZpbGVDaGFubmVsRmFjdG9yeQogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5EaXJlY3RCdWZmZXIKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUNoYW5uZWxJbXBsCi1vcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbCRSZXBvc2l0aW9uaW5nTG9jawogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlTG9ja0ltcGwKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuTG9ja01hbmFnZXIKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuTG9ja01hbmFnZXIkMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCmluZGV4IDQyNWNhMzEuLjY1ZDllZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKQEAgLTEwMTcsOCArMTAxNyw4IEBACiAjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKICAgICBUaHJlYWQoZmFsc2UpLAogI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLSAgICBtUGhvbmVTdGF0ZShBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwpLCBtUmluZ2VyTW9kZSgwKSwgbU11c2ljU3RvcFRpbWUoMCksCi0gICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKQorICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLCBtTXVzaWNTdG9wVGltZSgwKSwgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLAorICAgIG1MYXN0Vm9pY2VWb2x1bWUoLTEuMGYpLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKQogewogICAgIG1wQ2xpZW50SW50ZXJmYWNlID0gY2xpZW50SW50ZXJmYWNlOwogCkBAIC0xODM1LDI5ICsxODM1LDM4IEBACiAgICAgfQogCiAgICAgZmxvYXQgdm9sdW1lID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBvdXRwdXQsIGRldmljZSk7Ci0gICAgLy8gZG8gbm90IHNldCB2b2x1bWUgaWYgdGhlIGZsb2F0IHZhbHVlIGRpZCBub3QgY2hhbmdlCi0gICAgaWYgKHZvbHVtZSAhPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gfHwgZm9yY2UpIHsKKyAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKKyAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAorICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0CisgICAgaWYgKHZvbHVtZSAhPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gfHwKKyAgICAgICAgICAgIGZvcmNlKSB7CiAgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSA9IHZvbHVtZTsKICAgICAgICAgTE9HVigic2V0U3RyZWFtVm9sdW1lKCkgZm9yIG91dHB1dCAlZCBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBvdXRwdXQsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCB8fAogICAgICAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpEVE1GIHx8CiAgICAgICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKLSAgICAgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lID0gLTEuMDsKICAgICAgICAgICAgIC8vIG9mZnNldCB2YWx1ZSB0byByZWZsZWN0IGFjdHVhbCBoYXJkd2FyZSB2b2x1bWUgdGhhdCBuZXZlciByZWFjaGVzIDAKICAgICAgICAgICAgIC8vIDElIGNvcnJlc3BvbmRzIHJvdWdobHkgdG8gZmlyc3Qgc3RlcCBpbiBWT0lDRV9DQUxMIHN0cmVhbSB2b2x1bWUgc2V0dGluZyAoc2VlIEF1ZGlvU2VydmljZS5qYXZhKQogICAgICAgICAgICAgdm9sdW1lID0gMC4wMSArIDAuOTkgKiB2b2x1bWU7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMKSB7Ci0gICAgICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKLSAgICAgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2b2ljZVZvbHVtZSA+PSAwICYmIG91dHB1dCA9PSBtSGFyZHdhcmVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LCBkZWxheU1zKTsKICAgICB9CiAKKyAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMIHx8CisgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgeworICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKKyAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAorICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMKSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSAmJiBvdXRwdXQgPT0gbUhhcmR3YXJlT3V0cHV0KSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOworICAgICAgICAgICAgbUxhc3RWb2ljZVZvbHVtZSA9IHZvaWNlVm9sdW1lOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcAppbmRleCBiM2UwZWU2Li4wN2I1YTM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAKQEAgLTEwMSw5ICsxMDEsOSBAQAogICAgIG1GYWtlQ2FtZXJhID0gMDsgLy8gcGFyYW5vaWEKIH0KIAotc3A8SU1lbW9yeUhlYXA+IENhbWVyYUhhcmR3YXJlU3R1Yjo6Z2V0UHJldmlld0hlYXAoKSBjb25zdAorc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVTdHViOjpzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpCiB7Ci0gICAgcmV0dXJuIG1QcmV2aWV3SGVhcDsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHNwPElNZW1vcnlIZWFwPiBDYW1lcmFIYXJkd2FyZVN0dWI6OmdldFJhd0hlYXAoKSBjb25zdApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuaAppbmRleCBkMzQyN2JhLi45YjY2YTc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuaApAQCAtMjksNyArMjksNyBAQAogCiBjbGFzcyBDYW1lcmFIYXJkd2FyZVN0dWIgOiBwdWJsaWMgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgewogcHVibGljOgotICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+IGdldFByZXZpZXdIZWFwKCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+IGdldFJhd0hlYXAoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc2V0Q2FsbGJhY2tzKG5vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDU4MjA5ZmQuLjgwOGM2NzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KQEAgLTMyMCw2ICszMjEsNyBAQAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOwogICAgIG1PcmllbnRhdGlvbiA9IDA7CiAgICAgbU9yaWVudGF0aW9uQ2hhbmdlZCA9IGZhbHNlOworICAgIG1QbGF5U2h1dHRlclNvdW5kID0gdHJ1ZTsKICAgICBjYW1lcmFTZXJ2aWNlLT5zZXRDYW1lcmFCdXN5KGNhbWVyYUlkKTsKICAgICBjYW1lcmFTZXJ2aWNlLT5sb2FkU291bmQoKTsKICAgICBMT0cxKCJDbGllbnQ6OkNsaWVudCBYIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CkBAIC0zMzcsMTggKzMzOSw2IEBACiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2xpZW50Ojp+Q2xpZW50IEUgKHBpZCAlZCwgdGhpcyAlcCkiLCBjYWxsaW5nUGlkLCB0aGlzKTsKIAotICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgewotICAgICAgICBwdGhyZWFkX3QgdGhyOwotICAgICAgICAvLyBXZSB1bnJlZ2lzdGVyIHRoZSBidWZmZXJzIGluIGEgZGlmZmVyZW50IHRocmVhZCBiZWNhdXNlIGJpbmRlciBkb2VzCi0gICAgICAgIC8vIG5vdCBsZXQgdXMgbWFrZSBzeWNocm9ub3VzIHRyYW5zYWN0aW9ucyBpbiBhIGJpbmRlciBkZXN0cnVjdG9yICh0aGF0Ci0gICAgICAgIC8vIGlzLCB1cG9uIG91ciByZWFjaGluZyBhIHJlZmNvdW50IG9mIHplcm8uKQotICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyLAotICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gYXR0cgotICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3N1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLmdldCgpKTsKLSAgICAgICAgcHRocmVhZF9qb2luKHRociwgTlVMTCk7Ci0gICAgfQotCiAgICAgLy8gc2V0IG1DbGllbnRQaWQgdG8gbGV0IGRpc2Nvbm5ldCgpIHRlYXIgZG93biB0aGUgaGFyZHdhcmUKICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ1BpZDsKICAgICBkaXNjb25uZWN0KCk7CkBAIC00NjYsNiArNDU2LDExIEBACiAgICAgaWYgKG1Vc2VPdmVybGF5KSB7CiAgICAgICAgIG1PdmVybGF5UmVmID0gMDsKICAgICB9CisgICAgLy8gUmVsZWFzZSB0aGUgaGVsZCBBTmF0aXZlV2luZG93IHJlc291cmNlcy4KKyAgICBpZiAobVByZXZpZXdXaW5kb3cgIT0gMCkgeworICAgICAgICBtUHJldmlld1dpbmRvdyA9IDA7CisgICAgICAgIG1IYXJkd2FyZS0+c2V0UHJldmlld1dpbmRvdyhtUHJldmlld1dpbmRvdyk7CisgICAgfQogICAgIG1IYXJkd2FyZS5jbGVhcigpOwogCiAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUNsaWVudChtQ2FtZXJhQ2xpZW50KTsKQEAgLTQ3Niw4ICs0NzEsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIHNldCB0aGUgSVN1cmZhY2UgdGhhdCB0aGUgcHJldmlldyB3aWxsIHVzZQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHsKKy8vIHNldCB0aGUgU3VyZmFjZSB0aGF0IHRoZSBwcmV2aWV3IHdpbGwgdXNlCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7CiAgICAgTE9HMSgic2V0UHJldmlld0Rpc3BsYXkoJXApIChwaWQgJWQpIiwgc3VyZmFjZS5nZXQoKSwgZ2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNDg3LDcgKzQ4Miw3IEBACiAKICAgICAvLyByZXR1cm4gaWYgbm8gY2hhbmdlIGluIHN1cmZhY2UuCiAgICAgLy8gYXNCaW5kZXIoKSBpcyBzYWZlIG9uIE5VTEwgKHJldHVybnMgTlVMTCkKLSAgICBpZiAoc3VyZmFjZS0+YXNCaW5kZXIoKSA9PSBtU3VyZmFjZS0+YXNCaW5kZXIoKSkgeworICAgIGlmIChnZXRJU3VyZmFjZShzdXJmYWNlKS0+YXNCaW5kZXIoKSA9PSBtU3VyZmFjZS0+YXNCaW5kZXIoKSkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtNDk4LDQ0ICs0OTMsMjggQEAKICAgICAgICAgICAgIHNwPE92ZXJsYXk+IGR1bW15OwogICAgICAgICAgICAgbUhhcmR3YXJlLT5zZXRPdmVybGF5KGR1bW15KTsKICAgICAgICAgICAgIG1PdmVybGF5UmVmID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwogICAgICAgICB9CiAgICAgfQotICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKKyAgICBpZiAoc3VyZmFjZSAhPSAwKSB7CisgICAgICAgIG1TdXJmYWNlID0gZ2V0SVN1cmZhY2Uoc3VyZmFjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN1cmZhY2UgPSAwOworICAgIH0KKyAgICBtUHJldmlld1dpbmRvdyA9IHN1cmZhY2U7CiAgICAgbU92ZXJsYXlSZWYgPSAwOwogICAgIC8vIElmIHByZXZpZXcgaGFzIGJlZW4gYWxyZWFkeSBzdGFydGVkLCBzZXQgb3ZlcmxheSBvciByZWdpc3RlciBwcmV2aWV3CiAgICAgLy8gYnVmZmVycyBub3cuCiAgICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgewogICAgICAgICBpZiAobVVzZU92ZXJsYXkpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IHNldE92ZXJsYXkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZWdpc3RlclByZXZpZXdCdWZmZXJzKCk7CisgICAgICAgIH0gZWxzZSBpZiAobVByZXZpZXdXaW5kb3cgIT0gMCkgeworICAgICAgICAgICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zZXRQcmV2aWV3V2luZG93KG1QcmV2aWV3V2luZG93KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpIHsKLSAgICBpbnQgdywgaDsKLSAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZ3LCAmaCk7Ci0KLSAgICAvLyBGSVhNRTogZG9uJ3QgdXNlIGEgaGFyZGNvZGVkIGZvcm1hdCBoZXJlLgotICAgIElTdXJmYWNlOjpCdWZmZXJIZWFwIGJ1ZmZlcnModywgaCwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZS0+Z2V0UHJldmlld0hlYXAoKSk7Ci0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlcnMpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HRSgicmVnaXN0ZXJCdWZmZXJzIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0T3ZlcmxheSgpIHsKICAgICBpbnQgdywgaDsKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKSk7CkBAIC01OTMsMTYgKzU3MiwxMCBAQAogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gY2FsbGJhY2tfZmxhZzsKLQotICAgIC8vIElmIHdlIGRvbid0IHVzZSBvdmVybGF5LCB3ZSBhbHdheXMgbmVlZCB0aGUgcHJldmlldyBmcmFtZSBmb3IgZGlzcGxheS4KLSAgICAvLyBJZiB3ZSBkbyB1c2Ugb3ZlcmxheSwgd2Ugb25seSBuZWVkIHRoZSBwcmV2aWV3IGZyYW1lIGlmIHRoZSB1c2VyCi0gICAgLy8gd2FudHMgdGhlIGRhdGEuCi0gICAgaWYgKG1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIGlmKG1QcmV2aWV3Q2FsbGJhY2tGbGFnICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykgewotICAgICAgICAgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICAgICAgfQorICAgIGlmIChtUHJldmlld0NhbGxiYWNrRmxhZyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spIHsKKyAgICAgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CiAgICAgfQogfQogCkBAIC02MjcsMTQgKzYwMCwxNCBAQAogCiAgICAgc3dpdGNoKG1vZGUpIHsKICAgICAgICAgY2FzZSBDQU1FUkFfUFJFVklFV19NT0RFOgotICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDApIHsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwICYmIG1QcmV2aWV3V2luZG93ID09IDApIHsKICAgICAgICAgICAgICAgICBMT0cxKCJtU3VyZmFjZSBpcyBub3Qgc2V0IHlldC4iKTsKICAgICAgICAgICAgICAgICAvLyBzdGlsbCBhYmxlIHRvIHN0YXJ0IHByZXZpZXcgaW4gdGhpcyBjYXNlLgogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UHJldmlld01vZGUoKTsKICAgICAgICAgY2FzZSBDQU1FUkFfUkVDT1JESU5HX01PREU6Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCkgewotICAgICAgICAgICAgICAgIExPR0UoIm1TdXJmYWNlIG11c3QgYmUgc2V0IGJlZm9yZSBzdGFydFJlY29yZGluZ01vZGUuIik7CisgICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCAmJiBtUHJldmlld1dpbmRvdyA9PSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibVN1cmZhY2Ugb3IgbVByZXZpZXdXaW5kb3cgbXVzdCBiZSBzZXQgYmVmb3JlIHN0YXJ0UmVjb3JkaW5nTW9kZS4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhcnRSZWNvcmRpbmdNb2RlKCk7CkBAIC02NjAsMTYgKzYzMyw5IEBACiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOworICAgICAgICAvLyBYWFg6IFNldCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIEFOYXRpdmVXaW5kb3cuCisgICAgICAgIG1IYXJkd2FyZS0+c2V0UHJldmlld1dpbmRvdyhtUHJldmlld1dpbmRvdyk7CiAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIC8vIElmIHByZXZpZXcgZGlzcGxheSBoYXMgYmVlbiBzZXQsIHJlZ2lzdGVyIHByZXZpZXcgYnVmZmVycyBub3cuCi0gICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgIC8vIFVucmVnaXN0ZXIgaGVyZSBiZWNhdXNlIHRoZSBzdXJmYWNlIG1heSBiZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKLSAgICAgICAgICAgLy8gd2l0aCB0aGUgcmF3IChzbmFwc2hvdCkgaGVhcC4KLSAgICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtNzA3LDEzICs2NzMsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCisKICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIG1IYXJkd2FyZS0+c3RvcFByZXZpZXcoKTsKIAotICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgewotICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKLSAgICB9Ci0KICAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwogfQogCkBAIC04MTEsNiArNzc0LDM1IEBACiAgICAgcmV0dXJuIHBhcmFtczsKIH0KIAorLy8gZW5hYmxlIHNodXR0ZXIgc291bmQKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZW5hYmxlU2h1dHRlclNvdW5kKGJvb2wgZW5hYmxlKSB7CisgICAgTE9HMSgiZW5hYmxlU2h1dHRlclNvdW5kIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKworICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKKyAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OworCisgICAgaWYgKGVuYWJsZSkgeworICAgICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5CisgICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlLCAiMCIpOworICAgIGlmIChzdHJjbXAodmFsdWUsICIwIikgIT0gMCkgeworICAgICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBpcyBub3QgYWxsb3dlZC4gRGVueSBpZiB0aGUgY3VycmVudAorICAgICAgICAvLyBwcm9jZXNzIGlzIG5vdCBtZWRpYXNlcnZlci4KKyAgICAgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2h1dHRlciBzb3VuZC4gUGVybWlzc2lvbiBkZW5pZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICB9CisgICAgfQorCisgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKSB7CiAgICAgTE9HMSgic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwogICAgIGludCBvcmllbnRhdGlvbjsKQEAgLTg0NCw2ICs4MzYsMjAgQEAKICAgICAgICAgICAgIGlmIChtT3ZlcmxheVJlZiAhPSAwKSBtT3JpZW50YXRpb25DaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9FTkFCTEVfU0hVVFRFUl9TT1VORCkgeworICAgICAgICBzd2l0Y2ggKGFyZzEpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBlbmFibGVTaHV0dGVyU291bmQoZmFsc2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGVuYWJsZVNodXR0ZXJTb3VuZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9QTEFZX1JFQ09SRElOR19TT1VORCkgeworICAgICAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1JFQ09SRElORyk7CiAgICAgfQogCiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+c2VuZENvbW1hbmQoY21kLCBhcmcxLCBhcmcyKTsKQEAgLTEwMDQsMTEgKzEwMTAsOCBAQAogLy8gInNpemUiIGlzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHl1diBwaWN0dXJlIGZvciByZWdpc3RlckJ1ZmZlci4KIC8vIElmIGl0IGlzIE5VTEwsIHVzZSB0aGUgcGljdHVyZSBzaXplIGZyb20gcGFyYW1ldGVycy4KIHZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVTaHV0dGVyKGltYWdlX3JlY3RfdHlwZSAqc2l6ZSkgewotICAgIG1DYW1lcmFTZXJ2aWNlLT5wbGF5U291bmQoU09VTkRfU0hVVFRFUik7Ci0KLSAgICAvLyBTY3JlZW4gZ29lcyBibGFjayBhZnRlciB0aGUgYnVmZmVyIGlzIHVucmVnaXN0ZXJlZC4KLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICAgaWYgKG1QbGF5U2h1dHRlclNvdW5kKSB7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT5wbGF5U291bmQoU09VTkRfU0hVVFRFUik7CiAgICAgfQogCiAgICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7CkBAIC0xMDM4LDcgKzEwNDEsNiBAQAogICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AsIG1PcmllbnRhdGlvbiwgMCwKICAgICAgICAgICAgIG1IYXJkd2FyZS0+Z2V0UmF3SGVhcCgpKTsKIAotICAgICAgICBtU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlcnMpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAgICAgfQogCkBAIC0xMDUxLDEyICsxMDUzLDYgQEAKICAgICBzaXplX3Qgc2l6ZTsKICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKIAotICAgIGlmICghbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlICE9IDApIHsKLSAgICAgICAgICAgIG1TdXJmYWNlLT5wb3N0QnVmZmVyKG9mZnNldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvLyBsb2NhbCBjb3B5IG9mIHRoZSBjYWxsYmFjayBmbGFncwogICAgIGludCBmbGFncyA9IG1QcmV2aWV3Q2FsbGJhY2tGbGFnOwogCkBAIC0xMDc3LDkgKzEwNzMsNyBAQAogICAgICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyAmPSB+KEZSQU1FX0NBTExCQUNLX0ZMQUdfT05FX1NIT1RfTUFTSyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfQ0FMTEJBQ0tfRkxBR19DT1BZX09VVF9NQVNLIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKTsKLSAgICAgICAgaWYgKG1Vc2VPdmVybGF5KSB7Ci0gICAgICAgICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwotICAgICAgICB9CisgICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CiAgICAgfQogCiAgICAgaWYgKGMgIT0gMCkgewpAQCAtMTExNiwxMSArMTExMCw2IEBACiAgICAgc2l6ZV90IHNpemU7CiAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBtZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CiAKLSAgICAvLyBQdXQgdGhlIFlVViB2ZXJzaW9uIG9mIHRoZSBzbmFwc2hvdCBpbiB0aGUgcHJldmlldyBkaXNwbGF5LgotICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgewotICAgICAgICBtU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOwotICAgIH0KLQogICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OwogICAgIG1Mb2NrLnVubG9jaygpOwogICAgIGlmIChjICE9IDApIHsKQEAgLTEyNzgsNCArMTI2NywxMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3A8SVN1cmZhY2U+IENhbWVyYVNlcnZpY2U6OmdldElTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7CisgICAgaWYgKHN1cmZhY2UgIT0gMCkgeworICAgICAgICByZXR1cm4gc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3A8SVN1cmZhY2U+KDApOworICAgIH0KK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCA4ZjBlZDc1Li5kNTczNjRhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC03OSw2ICs3OSwxMiBAQAogICAgIHNwPE1lZGlhUGxheWVyPiAgICAgbVNvdW5kUGxheWVyW05VTV9TT1VORFNdOwogICAgIGludCAgICAgICAgICAgICAgICAgbVNvdW5kUmVmOyAgLy8gcmVmZXJlbmNlIGNvdW50IChyZWxlYXNlIGFsbCBNZWRpYVBsYXllciB3aGVuIDApCiAKKyAgICAvLyBVc2VkIGJ5IENsaWVudCBvYmplY3RzIHRvIGV4dHJhY3QgdGhlIElTdXJmYWNlIGZyb20gYSBTdXJmYWNlIG9iamVjdC4KKyAgICAvLyBUaGlzIGlzIHVzZWQgYmVjYXVzZSBtYWtpbmcgQ2xpZW50IGEgZnJpZW5kIGNsYXNzIG9mIFN1cmZhY2Ugd291bGQKKyAgICAvLyByZXF1aXJlIGluY2x1ZGluZyB0aGlzIGhlYWRlciBpbiBTdXJmYWNlLmggc2luY2UgQ2xpZW50IGlzIGEgbmVzdGVkCisgICAgLy8gY2xhc3MuCisgICAgc3RhdGljIHNwPElTdXJmYWNlPiBnZXRJU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CisKICAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgQm5DYW1lcmEKICAgICB7CiAgICAgcHVibGljOgpAQCAtODcsNyArOTMsNyBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjbGllbnQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBsb2NrKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHVubG9jaygpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHNldFByZXZpZXdDYWxsYmFja0ZsYWcoaW50IGZsYWcpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydFByZXZpZXcoKTsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcFByZXZpZXcoKTsKQEAgLTEzMiw2ICsxMzgsOSBAQAogICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzdGFydFByZXZpZXdNb2RlKCk7CiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHN0YXJ0UmVjb3JkaW5nTW9kZSgpOwogCisgICAgICAgIC8vIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgc2VuZENvbW1hbmQgdG8gZW5hYmxlL2Rpc2FibGUgc2h1dHRlciBzb3VuZC4KKyAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgZW5hYmxlU2h1dHRlclNvdW5kKGJvb2wgZW5hYmxlKTsKKwogICAgICAgICAvLyB0aGVzZSBhcmUgc3RhdGljIGNhbGxiYWNrIGZ1bmN0aW9ucwogICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyLCB2b2lkKiB1c2VyKTsKICAgICAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpOwpAQCAtMTY3LDEwICsxNzYsMTIgQEAKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb247ICAgICAvLyBDdXJyZW50IGRpc3BsYXkgb3JpZW50YXRpb24KICAgICAgICAgLy8gVHJ1ZSBpZiBkaXNwbGF5IG9yaWVudGF0aW9uIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgaXMgb25seSB1c2VkIGluIG92ZXJsYXkuCiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uQ2hhbmdlZDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheVNodXR0ZXJTb3VuZDsKIAogICAgICAgICAvLyBFbnN1cmVzIGF0b21pY2l0eSBhbW9uZyB0aGUgcHVibGljIG1ldGhvZHMKICAgICAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgc3A8SVN1cmZhY2U+ICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZTsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gICAgICAgICAgICAgICBtUHJldmlld1dpbmRvdzsKIAogICAgICAgICAvLyBJZiB0aGUgdXNlciB3YW50IHVzIHRvIHJldHVybiBhIGNvcHkgb2YgdGhlIHByZXZpZXcgZnJhbWUgKGluc3RlYWQKICAgICAgICAgLy8gb2YgdGhlIG9yaWdpbmFsIG9uZSksIHdlIGFsbG9jYXRlIG1QcmV2aWV3QnVmZmVyIGFuZCByZXVzZSBpdCBpZiBwb3NzaWJsZS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggODdkZTc5YS4uODNjZTNlMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTI2OSwxNCArMjY5LDEwIEBACiAgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgeworICAgIHB1YmxpYyBib29sZWFuIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50LnNldEVuYWJsZWQobUlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgbUNsaWVudHMuYWRkKGNsaWVudCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkRlYWQgQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ6ICIgKyBjbGllbnQsIHJlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOworICAgICAgICAgICAgcmV0dXJuIG1Jc0VuYWJsZWQ7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YQppbmRleCA3MzFmYjIyLi41ZWYzZDM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQXBwV2lkZ2V0U2VydmljZS5qYXZhCkBAIC00MjYsNiArNDI2LDQwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXRJZHMoaW50W10gYXBwV2lkZ2V0SWRzLCBSZW1vdGVWaWV3cyB2aWV3cykgeworICAgICAgICBpZiAoYXBwV2lkZ2V0SWRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwV2lkZ2V0SWRzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE4gPSBhcHBXaWRnZXRJZHMubGVuZ3RoOworCisgICAgICAgIHN5bmNocm9uaXplZCAobUFwcFdpZGdldElkcykgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFwcFdpZGdldElkIGlkID0gbG9va3VwQXBwV2lkZ2V0SWRMb2NrZWQoYXBwV2lkZ2V0SWRzW2ldKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVBcHBXaWRnZXRJbnN0YW5jZUxvY2tlZChpZCwgdmlld3MsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGludFtdIGFwcFdpZGdldElkcywgaW50IHZpZXdJZCkgeworICAgICAgICBpZiAoYXBwV2lkZ2V0SWRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwV2lkZ2V0SWRzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE4gPSBhcHBXaWRnZXRJZHMubGVuZ3RoOworCisgICAgICAgIHN5bmNocm9uaXplZCAobUFwcFdpZGdldElkcykgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFwcFdpZGdldElkIGlkID0gbG9va3VwQXBwV2lkZ2V0SWRMb2NrZWQoYXBwV2lkZ2V0SWRzW2ldKTsKKyAgICAgICAgICAgICAgICBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWRJbnN0YW5jZUxvY2tlZChpZCwgdmlld0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFwcFdpZGdldFByb3ZpZGVyKENvbXBvbmVudE5hbWUgcHJvdmlkZXIsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUFwcFdpZGdldElkcykgewogICAgICAgICAgICAgUHJvdmlkZXIgcCA9IGxvb2t1cFByb3ZpZGVyTG9ja2VkKHByb3ZpZGVyKTsKQEAgLTQ0MywxMSArNDc3LDE3IEBACiAgICAgfQogCiAgICAgdm9pZCB1cGRhdGVBcHBXaWRnZXRJbnN0YW5jZUxvY2tlZChBcHBXaWRnZXRJZCBpZCwgUmVtb3RlVmlld3Mgdmlld3MpIHsKKyAgICAgICAgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdzLCBmYWxzZSk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVBcHBXaWRnZXRJbnN0YW5jZUxvY2tlZChBcHBXaWRnZXRJZCBpZCwgUmVtb3RlVmlld3Mgdmlld3MsIGJvb2xlYW4gaXNQYXJ0aWFsVXBkYXRlKSB7CiAgICAgICAgIC8vIGFsbG93IGZvciBzdGFsZSBhcHBXaWRnZXRJZHMgYW5kIG90aGVyIGJhZG5lc3MKICAgICAgICAgLy8gbG9va3VwIGFsc28gY2hlY2tzIHRoYXQgdGhlIGNhbGxpbmcgcHJvY2VzcyBjYW4gYWNjZXNzIHRoZSBhcHBXaWRnZXRJZAogICAgICAgICAvLyBkcm9wIHVuYm91bmQgYXBwV2lkZ2V0SWRzIChzaG91bGRuJ3QgYmUgcG9zc2libGUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMpCiAgICAgICAgIGlmIChpZCAhPSBudWxsICYmIGlkLnByb3ZpZGVyICE9IG51bGwgJiYgIWlkLnByb3ZpZGVyLnpvbWJpZSAmJiAhaWQuaG9zdC56b21iaWUpIHsKLSAgICAgICAgICAgIGlkLnZpZXdzID0gdmlld3M7CisKKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIHNhdmUgdGhpcyBSZW1vdGVWaWV3cworICAgICAgICAgICAgaWYgKCFpc1BhcnRpYWxVcGRhdGUpIGlkLnZpZXdzID0gdmlld3M7CiAKICAgICAgICAgICAgIC8vIGlzIGFueW9uZSBsaXN0ZW5pbmc/CiAgICAgICAgICAgICBpZiAoaWQuaG9zdC5jYWxsYmFja3MgIT0gbnVsbCkgewpAQCAtNDYzLDYgKzUwMywyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgdm9pZCBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWRJbnN0YW5jZUxvY2tlZChBcHBXaWRnZXRJZCBpZCwgaW50IHZpZXdJZCkgeworICAgICAgICAvLyBhbGxvdyBmb3Igc3RhbGUgYXBwV2lkZ2V0SWRzIGFuZCBvdGhlciBiYWRuZXNzCisgICAgICAgIC8vIGxvb2t1cCBhbHNvIGNoZWNrcyB0aGF0IHRoZSBjYWxsaW5nIHByb2Nlc3MgY2FuIGFjY2VzcyB0aGUgYXBwV2lkZ2V0SWQKKyAgICAgICAgLy8gZHJvcCB1bmJvdW5kIGFwcFdpZGdldElkcyAoc2hvdWxkbid0IGJlIHBvc3NpYmxlIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzKQorICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5wcm92aWRlciAhPSBudWxsICYmICFpZC5wcm92aWRlci56b21iaWUgJiYgIWlkLmhvc3Quem9tYmllKSB7CisgICAgICAgICAgICAvLyBpcyBhbnlvbmUgbGlzdGVuaW5nPworICAgICAgICAgICAgaWYgKGlkLmhvc3QuY2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9jayBpcyBoZWxkLCBidXQgdGhpcyBpcyBhIG9uZXdheSBjYWxsCisgICAgICAgICAgICAgICAgICAgIGlkLmhvc3QuY2FsbGJhY2tzLnZpZXdEYXRhQ2hhbmdlZChpZC5hcHBXaWRnZXRJZCwgdmlld0lkKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJdCBmYWlsZWQ7IHJlbW92ZSB0aGUgY2FsbGJhY2suIE5vIG5lZWQgdG8gcHJ1bmUgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBrbm93IHRoYXQgdGhpcyBob3N0IGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAgICAgaWQuaG9zdC5jYWxsYmFja3MgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBpbnRbXSBzdGFydExpc3RlbmluZyhJQXBwV2lkZ2V0SG9zdCBjYWxsYmFja3MsIFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IGhvc3RJZCwKICAgICAgICAgICAgIExpc3Q8UmVtb3RlVmlld3M+IHVwZGF0ZWRWaWV3cykgewogICAgICAgICBpbnQgY2FsbGluZ1VpZCA9IGVuZm9yY2VDYWxsaW5nVWlkKHBhY2thZ2VOYW1lKTsKQEAgLTc0Miw2ICs4MDEsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW5mby5sYWJlbCA9IGFjdGl2aXR5SW5mby5sb2FkTGFiZWwobVBhY2thZ2VNYW5hZ2VyKS50b1N0cmluZygpOwogICAgICAgICAgICAgaW5mby5pY29uID0gcmkuZ2V0SWNvblJlc291cmNlKCk7CisgICAgICAgICAgICBpbmZvLnByZXZpZXdJbWFnZSA9IHNhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAJCWNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFwcFdpZGdldFByb3ZpZGVySW5mb19wcmV2aWV3SW1hZ2UsIDApOworCiAgICAgICAgICAgICBzYS5yZWN5Y2xlKCk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBPayB0byBjYXRjaCBFeGNlcHRpb24gaGVyZSwgYmVjYXVzZSBhbnl0aGluZyBnb2luZyB3cm9uZyBiZWNhdXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9CYXR0ZXJ5U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQmF0dGVyeVNlcnZpY2UuamF2YQppbmRleCBlNmMzMmQ5Li5hOGNjZmMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9CYXR0ZXJ5U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0JhdHRlcnlTZXJ2aWNlLmphdmEKQEAgLTk5LDYgKzk5LDcgQEAKICAgICBwcml2YXRlIGludCBtQmF0dGVyeVRlbXBlcmF0dXJlOwogICAgIHByaXZhdGUgU3RyaW5nIG1CYXR0ZXJ5VGVjaG5vbG9neTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUJhdHRlcnlMZXZlbENyaXRpY2FsOworICAgIHByaXZhdGUgYm9vbGVhbiBtSW52YWxpZENoYXJnZXI7CiAKICAgICBwcml2YXRlIGludCBtTGFzdEJhdHRlcnlTdGF0dXM7CiAgICAgcHJpdmF0ZSBpbnQgbUxhc3RCYXR0ZXJ5SGVhbHRoOwpAQCAtMTA3LDYgKzEwOCw3IEBACiAgICAgcHJpdmF0ZSBpbnQgbUxhc3RCYXR0ZXJ5Vm9sdGFnZTsKICAgICBwcml2YXRlIGludCBtTGFzdEJhdHRlcnlUZW1wZXJhdHVyZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUxhc3RCYXR0ZXJ5TGV2ZWxDcml0aWNhbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUxhc3RJbnZhbGlkQ2hhcmdlcjsKIAogICAgIHByaXZhdGUgaW50IG1Mb3dCYXR0ZXJ5V2FybmluZ0xldmVsOwogICAgIHByaXZhdGUgaW50IG1Mb3dCYXR0ZXJ5Q2xvc2VXYXJuaW5nTGV2ZWw7CkBAIC0xMjgsNyArMTMwLDEyIEBACiAgICAgICAgIG1Mb3dCYXR0ZXJ5Q2xvc2VXYXJuaW5nTGV2ZWwgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfbG93QmF0dGVyeUNsb3NlV2FybmluZ0xldmVsKTsKIAotICAgICAgICBtVUV2ZW50T2JzZXJ2ZXIuc3RhcnRPYnNlcnZpbmcoIlNVQlNZU1RFTT1wb3dlcl9zdXBwbHkiKTsKKyAgICAgICAgbVBvd2VyU3VwcGx5T2JzZXJ2ZXIuc3RhcnRPYnNlcnZpbmcoIlNVQlNZU1RFTT1wb3dlcl9zdXBwbHkiKTsKKworICAgICAgICAvLyB3YXRjaCBmb3IgaW52YWxpZCBjaGFyZ2VyIG1lc3NhZ2VzIGlmIHRoZSBpbnZhbGlkX2NoYXJnZXIgc3dpdGNoIGV4aXN0cworICAgICAgICBpZiAobmV3IEZpbGUoIi9zeXMvZGV2aWNlcy92aXJ0dWFsL3N3aXRjaC9pbnZhbGlkX2NoYXJnZXIvc3RhdGUiKS5leGlzdHMoKSkgeworICAgICAgICAgICAgbUludmFsaWRDaGFyZ2VyT2JzZXJ2ZXIuc3RhcnRPYnNlcnZpbmcoIkRFVlBBVEg9L2RldmljZXMvdmlydHVhbC9zd2l0Y2gvaW52YWxpZF9jaGFyZ2VyIik7CisgICAgICAgIH0KIAogICAgICAgICAvLyBzZXQgaW5pdGlhbCBzdGF0dXMKICAgICAgICAgdXBkYXRlKCk7CkBAIC0xNjIsMTMgKzE2OSwyNCBAQAogICAgICAgICByZXR1cm4gbVBsdWdUeXBlOwogICAgIH0KIAotICAgIHByaXZhdGUgVUV2ZW50T2JzZXJ2ZXIgbVVFdmVudE9ic2VydmVyID0gbmV3IFVFdmVudE9ic2VydmVyKCkgeworICAgIHByaXZhdGUgVUV2ZW50T2JzZXJ2ZXIgbVBvd2VyU3VwcGx5T2JzZXJ2ZXIgPSBuZXcgVUV2ZW50T2JzZXJ2ZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblVFdmVudChVRXZlbnRPYnNlcnZlci5VRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIHVwZGF0ZSgpOwogICAgICAgICB9CiAgICAgfTsKIAorICAgIHByaXZhdGUgVUV2ZW50T2JzZXJ2ZXIgbUludmFsaWRDaGFyZ2VyT2JzZXJ2ZXIgPSBuZXcgVUV2ZW50T2JzZXJ2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblVFdmVudChVRXZlbnRPYnNlcnZlci5VRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaW52YWxpZENoYXJnZXIgPSAiMSIuZXF1YWxzKGV2ZW50LmdldCgiU1dJVENIX1NUQVRFIikpOworICAgICAgICAgICAgaWYgKG1JbnZhbGlkQ2hhcmdlciAhPSBpbnZhbGlkQ2hhcmdlcikgeworICAgICAgICAgICAgICAgIG1JbnZhbGlkQ2hhcmdlciA9IGludmFsaWRDaGFyZ2VyOworICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKwogICAgIC8vIHJldHVybnMgYmF0dGVyeSBsZXZlbCBhcyBhIHBlcmNlbnRhZ2UKICAgICBmaW5hbCBpbnQgZ2V0QmF0dGVyeUxldmVsKCkgewogICAgICAgICByZXR1cm4gbUJhdHRlcnlMZXZlbDsKQEAgLTIzNyw3ICsyNTUsOCBAQAogICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGV2ZWwgIT0gbUxhc3RCYXR0ZXJ5TGV2ZWwgfHwKICAgICAgICAgICAgICAgICBtUGx1Z1R5cGUgIT0gbUxhc3RQbHVnVHlwZSB8fAogICAgICAgICAgICAgICAgIG1CYXR0ZXJ5Vm9sdGFnZSAhPSBtTGFzdEJhdHRlcnlWb2x0YWdlIHx8Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlUZW1wZXJhdHVyZSAhPSBtTGFzdEJhdHRlcnlUZW1wZXJhdHVyZSkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5VGVtcGVyYXR1cmUgIT0gbUxhc3RCYXR0ZXJ5VGVtcGVyYXR1cmUgfHwKKyAgICAgICAgICAgICAgICBtSW52YWxpZENoYXJnZXIgIT0gbUxhc3RJbnZhbGlkQ2hhcmdlcikgewogCiAgICAgICAgICAgICBpZiAobVBsdWdUeXBlICE9IG1MYXN0UGx1Z1R5cGUpIHsKICAgICAgICAgICAgICAgICBpZiAobUxhc3RQbHVnVHlwZSA9PSBCQVRURVJZX1BMVUdHRURfTk9ORSkgewpAQCAtMzM0LDYgKzM1Myw3IEBACiAgICAgICAgICAgICBtTGFzdEJhdHRlcnlWb2x0YWdlID0gbUJhdHRlcnlWb2x0YWdlOwogICAgICAgICAgICAgbUxhc3RCYXR0ZXJ5VGVtcGVyYXR1cmUgPSBtQmF0dGVyeVRlbXBlcmF0dXJlOwogICAgICAgICAgICAgbUxhc3RCYXR0ZXJ5TGV2ZWxDcml0aWNhbCA9IG1CYXR0ZXJ5TGV2ZWxDcml0aWNhbDsKKyAgICAgICAgICAgIG1MYXN0SW52YWxpZENoYXJnZXIgPSBtSW52YWxpZENoYXJnZXI7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM1NSw2ICszNzUsNyBAQAogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmF0dGVyeU1hbmFnZXIuRVhUUkFfVk9MVEFHRSwgbUJhdHRlcnlWb2x0YWdlKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJhdHRlcnlNYW5hZ2VyLkVYVFJBX1RFTVBFUkFUVVJFLCBtQmF0dGVyeVRlbXBlcmF0dXJlKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJhdHRlcnlNYW5hZ2VyLkVYVFJBX1RFQ0hOT0xPR1ksIG1CYXR0ZXJ5VGVjaG5vbG9neSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCYXR0ZXJ5TWFuYWdlci5FWFRSQV9JTlZBTElEX0NIQVJHRVIsIG1JbnZhbGlkQ2hhcmdlcik7CiAKICAgICAgICAgaWYgKGZhbHNlKSB7CiAgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlQmF0dGVyeSBsZXZlbDoiICsgbUJhdHRlcnlMZXZlbCArCkBAIC0zNjQsNyArMzg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIiB0ZW1wZXJhdHVyZTogIiArIG1CYXR0ZXJ5VGVtcGVyYXR1cmUgKwogICAgICAgICAgICAgICAgICAgICAiIHRlY2hub2xvZ3k6ICIgKyBtQmF0dGVyeVRlY2hub2xvZ3kgKwogICAgICAgICAgICAgICAgICAgICAiIEFDIHBvd2VyZWQ6IiArIG1BY09ubGluZSArICIgVVNCIHBvd2VyZWQ6IiArIG1Vc2JPbmxpbmUgKwotICAgICAgICAgICAgICAgICAgICAiIGljb246IiArIGljb24gKTsKKyAgICAgICAgICAgICAgICAgICAgIiBpY29uOiIgKyBpY29uICArICIgaW52YWxpZCBjaGFyZ2VyOiIgKyBtSW52YWxpZENoYXJnZXIpOwogICAgICAgICB9CiAKICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmJyb2FkY2FzdFN0aWNreUludGVudChpbnRlbnQsIG51bGwpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhCmluZGV4IGFhOGNkZWQuLmJkZjMxM2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NsaXBib2FyZFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9DbGlwYm9hcmRTZXJ2aWNlLmphdmEKQEAgLTE2LDQyICsxNiwyNDAgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CiAKLWltcG9ydCBhbmRyb2lkLnRleHQuSUNsaXBib2FyZDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUNsaXBib2FyZDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVDYWxsYmFja0xpc3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpcGJvYXJkIGZvciBjb3B5IGFuZCBwYXN0ZS4KICAqLwogcHVibGljIGNsYXNzIENsaXBib2FyZFNlcnZpY2UgZXh0ZW5kcyBJQ2xpcGJvYXJkLlN0dWIgewotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1DbGlwYm9hcmQgPSAiIjsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBJQWN0aXZpdHlNYW5hZ2VyIG1BbTsKKyAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1QbTsKKyAgICBwcml2YXRlIGZpbmFsIElCaW5kZXIgbVBlcm1pc3Npb25Pd25lcjsKKworICAgIHByaXZhdGUgZmluYWwgUmVtb3RlQ2FsbGJhY2tMaXN0PElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyPiBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMKKyAgICAgICAgICAgID0gbmV3IFJlbW90ZUNhbGxiYWNrTGlzdDxJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcj4oKTsKKworICAgIHByaXZhdGUgQ2xpcERhdGEgbVByaW1hcnlDbGlwOworCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PFN0cmluZz4gbUFjdGl2ZVBlcm1pc3Npb25Pd25lcnMKKyAgICAgICAgICAgID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIHRoZSBjbGlwYm9hcmQuCiAgICAgICovCi0gICAgcHVibGljIENsaXBib2FyZFNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7IH0KKyAgICBwdWJsaWMgQ2xpcGJvYXJkU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQW0gPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpOworICAgICAgICBtUG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIElCaW5kZXIgcGVybU93bmVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBlcm1Pd25lciA9IG1BbS5uZXdVcmlQZXJtaXNzaW9uT3duZXIoImNsaXBib2FyZCIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy53KCJjbGlwYm9hcmQiLCAiQU0gZGVhZCIsIGUpOworICAgICAgICB9CisgICAgICAgIG1QZXJtaXNzaW9uT3duZXIgPSBwZXJtT3duZXI7CisgICAgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyB2b2lkIHNldENsaXBib2FyZFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBQYXJjZWwgZGF0YSwgUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy53KCJjbGlwYm9hcmQiLCAiRXhjZXB0aW9uOiAiLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEgY2xpcCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gIiI7CisgICAgICAgICAgICBpZiAoY2xpcCAhPSBudWxsICYmIGNsaXAuZ2V0SXRlbUNvdW50KCkgPD0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGl0ZW1zIik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja0RhdGFPd25lckxvY2tlZChjbGlwLCBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgIGNsZWFyQWN0aXZlT3duZXJzTG9ja2VkKCk7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXAgPSBjbGlwOworICAgICAgICAgICAgZmluYWwgaW50IG4gPSBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuYmVnaW5Ccm9hZGNhc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlDbGlwTGlzdGVuZXJzLmdldEJyb2FkY2FzdEl0ZW0oaSkuZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBSZW1vdGVDYWxsYmFja0xpc3Qgd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlYWQgb2JqZWN0IGZvciB1cy4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuZmluaXNoQnJvYWRjYXN0KCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgCi0gICAgICAgICAgICBtQ2xpcGJvYXJkID0gdGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGphdmFkb2MgZnJvbSBpbnRlcmZhY2UKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldENsaXBib2FyZFRleHQoKSB7CisgICAgcHVibGljIENsaXBEYXRhIGdldFByaW1hcnlDbGlwKFN0cmluZyBwa2cpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNsaXBib2FyZDsKKyAgICAgICAgICAgIGFkZEFjdGl2ZU93bmVyTG9ja2VkKEJpbmRlci5nZXRDYWxsaW5nVWlkKCksIHBrZyk7CisgICAgICAgICAgICByZXR1cm4gbVByaW1hcnlDbGlwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQorICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEZXNjcmlwdGlvbihtUHJpbWFyeUNsaXApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1QcmltYXJ5Q2xpcCAhPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMucmVnaXN0ZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMudW5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2xpcGJvYXJkLmxlbmd0aCgpID4gMDsKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeUNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbVByaW1hcnlDbGlwLmdldEl0ZW0oMCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgY2hlY2tVcmlPd25lckxvY2tlZChVcmkgdXJpLCBpbnQgdWlkKSB7CisgICAgICAgIGlmICghImNvbnRlbnQiLmVxdWFscyh1cmkuZ2V0U2NoZW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiBmb3IgdXMuCisgICAgICAgICAgICBtQW0uY2hlY2tHcmFudFVyaVBlcm1pc3Npb24odWlkLCBudWxsLCB1cmksIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNoZWNrSXRlbU93bmVyTG9ja2VkKENsaXBEYXRhLkl0ZW0gaXRlbSwgaW50IHVpZCkgeworICAgICAgICBpZiAoaXRlbS5nZXRVcmkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjaGVja1VyaU93bmVyTG9ja2VkKGl0ZW0uZ2V0VXJpKCksIHVpZCk7CisgICAgICAgIH0KKyAgICAgICAgSW50ZW50IGludGVudCA9IGl0ZW0uZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCAmJiBpbnRlbnQuZ2V0RGF0YSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoZWNrVXJpT3duZXJMb2NrZWQoaW50ZW50LmdldERhdGEoKSwgdWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBjaGVja0RhdGFPd25lckxvY2tlZChDbGlwRGF0YSBkYXRhLCBpbnQgdWlkKSB7CisgICAgICAgIGZpbmFsIGludCBOID0gZGF0YS5nZXRJdGVtQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgY2hlY2tJdGVtT3duZXJMb2NrZWQoZGF0YS5nZXRJdGVtKGkpLCB1aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGdyYW50VXJpTG9ja2VkKFVyaSB1cmksIFN0cmluZyBwa2cpIHsKKyAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUFtLmdyYW50VXJpUGVybWlzc2lvbkZyb21Pd25lcihtUGVybWlzc2lvbk93bmVyLCBQcm9jZXNzLm15VWlkKCksIHBrZywgdXJpLAorICAgICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBncmFudEl0ZW1Mb2NrZWQoQ2xpcERhdGEuSXRlbSBpdGVtLCBTdHJpbmcgcGtnKSB7CisgICAgICAgIGlmIChpdGVtLmdldFVyaSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdyYW50VXJpTG9ja2VkKGl0ZW0uZ2V0VXJpKCksIHBrZyk7CisgICAgICAgIH0KKyAgICAgICAgSW50ZW50IGludGVudCA9IGl0ZW0uZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCAmJiBpbnRlbnQuZ2V0RGF0YSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdyYW50VXJpTG9ja2VkKGludGVudC5nZXREYXRhKCksIHBrZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgYWRkQWN0aXZlT3duZXJMb2NrZWQoaW50IHVpZCwgU3RyaW5nIHBrZykgeworICAgICAgICBQYWNrYWdlSW5mbyBwaTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBpID0gbVBtLmdldFBhY2thZ2VJbmZvKHBrZywgMCk7CisgICAgICAgICAgICBpZiAocGkuYXBwbGljYXRpb25JbmZvLnVpZCAhPSB1aWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkNhbGxpbmcgdWlkICIgKyB1aWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBvd24gcGFja2FnZSAiICsgcGtnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gcGFja2FnZSAiICsgcGtnLCBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1BY3RpdmVQZXJtaXNzaW9uT3duZXJzLmNvbnRhaW5zKHBrZykpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVByaW1hcnlDbGlwLmdldEl0ZW1Db3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIGdyYW50SXRlbUxvY2tlZChtUHJpbWFyeUNsaXAuZ2V0SXRlbShpKSwgcGtnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BY3RpdmVQZXJtaXNzaW9uT3duZXJzLmFkZChwa2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHJldm9rZVVyaUxvY2tlZChVcmkgdXJpKSB7CisgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1BbS5yZXZva2VVcmlQZXJtaXNzaW9uRnJvbU93bmVyKG1QZXJtaXNzaW9uT3duZXIsIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgorICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCByZXZva2VJdGVtTG9ja2VkKENsaXBEYXRhLkl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoaXRlbS5nZXRVcmkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXZva2VVcmlMb2NrZWQoaXRlbS5nZXRVcmkoKSk7CisgICAgICAgIH0KKyAgICAgICAgSW50ZW50IGludGVudCA9IGl0ZW0uZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCAmJiBpbnRlbnQuZ2V0RGF0YSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldm9rZVVyaUxvY2tlZChpbnRlbnQuZ2V0RGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBjbGVhckFjdGl2ZU93bmVyc0xvY2tlZCgpIHsKKyAgICAgICAgbUFjdGl2ZVBlcm1pc3Npb25Pd25lcnMuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1QcmltYXJ5Q2xpcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE4gPSBtUHJpbWFyeUNsaXAuZ2V0SXRlbUNvdW50KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIHJldm9rZUl0ZW1Mb2NrZWQobVByaW1hcnlDbGlwLmdldEl0ZW0oaSkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCmluZGV4IGZjOGI0YTkuLjYwOTUxMTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKQEAgLTI2LDE0ICsyNiwxOCBAQAogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk1vYmlsZURhdGFTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CkBAIC00Nyw4ICs1MSwxMyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jb25uZWN0aXZpdHkuVGV0aGVyaW5nOwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwpAQCAtNTksNyArNjgsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgQ29ubmVjdGl2aXR5U2VydmljZSBleHRlbmRzIElDb25uZWN0aXZpdHlNYW5hZ2VyLlN0dWIgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDb25uZWN0aXZpdHlTZXJ2aWNlIjsKIAogICAgIC8vIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHN3aXRjaGluZyBiYWNrIHRvIGEgcmFkaW8ncyBkZWZhdWx0IG5ldHdvcmsKQEAgLTY4LDcgKzc3LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19SRVNUT1JFX0RFTEFZX1BST1BfTkFNRSA9CiAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYXBuLXJlc3RvcmUiOwogCi0KICAgICBwcml2YXRlIFRldGhlcmluZyBtVGV0aGVyaW5nOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSBmYWxzZTsKIApAQCAtODUsNiArOTMsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgTGlzdCBtTmV0UmVxdWVzdGVyc1BpZHNbXTsKIAorICAgIHByaXZhdGUgV2lmaVdhdGNoZG9nU2VydmljZSBtV2lmaVdhdGNoZG9nU2VydmljZTsKKwogICAgIC8vIHByaW9yaXR5IG9yZGVyIG9mIHRoZSBuZXR0cmFja2VycwogICAgIC8vIChleGNsdWRpbmcgZHluYW1pY2FsbHkgc2V0IG1OZXR3b3JrUHJlZmVyZW5jZSkKICAgICAvLyBUT0RPIC0gbW92ZSBtTmV0d29ya1R5cGVQcmVmZXJlbmNlIGludG8gdGhpcwpAQCAtMTYyLDYgKzE3MiwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfTU9CSUxFX0RBVEEgPQogICAgICAgICAgICAgTUFYX05FVFdPUktfU1RBVEVfVFJBQ0tFUl9FVkVOVCArIDc7CiAKKyAgICAvKioKKyAgICAgKiB1c2VkIGludGVybmFsbHkgdG8gY2xlYXIgYSB3YWtlbG9jayB3aGVuIHRyYW5zaXRpb25pbmcKKyAgICAgKiBmcm9tIG9uZSBuZXQgdG8gYW5vdGhlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSyA9CisgICAgICAgICAgICBNQVhfTkVUV09SS19TVEFURV9UUkFDS0VSX0VWRU5UICsgODsKKwogICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKIAogICAgIC8vIGxpc3Qgb2YgRGVhdGhSZWNpcGllbnRzIHVzZWQgdG8gbWFrZSBzdXJlIGZlYXR1cmVzIGFyZSB0dXJuZWQgb2ZmIHdoZW4KQEAgLTE3MSw2ICsxODgsMTMgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbVN5c3RlbVJlYWR5OwogICAgIHByaXZhdGUgSW50ZW50IG1Jbml0aWFsQnJvYWRjYXN0OwogCisgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbU5ldFRyYW5zaXRpb25XYWtlTG9jazsKKyAgICBwcml2YXRlIFN0cmluZyBtTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkgPSAiIjsKKyAgICBwcml2YXRlIGludCBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyOworICAgIHByaXZhdGUgaW50IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0OworCisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBtRGVmYXVsdERuczsKKwogICAgIC8vIHVzZWQgaW4gREJHIG1vZGUgdG8gdHJhY2sgaW5ldCBjb25kaXRpb24gcmVwb3J0cwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkVUX0NPTkRJVElPTl9MT0dfTUFYX1NJWkUgPSAxNTsKICAgICBwcml2YXRlIEFycmF5TGlzdCBtSW5ldExvZzsKQEAgLTIxMCw1MiArMjM0LDIwIEBACiAgICAgfQogICAgIFJhZGlvQXR0cmlidXRlc1tdIG1SYWRpb0F0dHJpYnV0ZXM7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25uZWN0aXZpdHlUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlUaHJlYWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcigiQ29ubmVjdGl2aXR5VGhyZWFkIik7Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKHNTZXJ2aWNlSW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgc1NlcnZpY2VJbnN0YW5jZSA9IG5ldyBDb25uZWN0aXZpdHlTZXJ2aWNlKGNvbnRleHQpOwogICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIExvb3Blci5wcmVwYXJlKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBzU2VydmljZUluc3RhbmNlID0gbmV3IENvbm5lY3Rpdml0eVNlcnZpY2UobUNvbnRleHQpOwotICAgICAgICAgICAgICAgIG5vdGlmeUFsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9vcGVyLmxvb3AoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRTZXJ2aWNlSW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBDb25uZWN0aXZpdHlUaHJlYWQgdGhyZWFkID0gbmV3IENvbm5lY3Rpdml0eVRocmVhZChjb250ZXh0KTsKLSAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOwotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRocmVhZCkgewotICAgICAgICAgICAgICAgIHdoaWxlIChzU2VydmljZUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgc1NlcnZpY2VJbnN0YW5jZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC53YWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB3aGlsZSB3YWl0aW5nIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBDb25uZWN0aXZpdHlTZXJ2aWNlIHRocmVhZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2VJbnN0YW5jZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIENvbm5lY3Rpdml0eVRocmVhZC5nZXRTZXJ2aWNlSW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIHJldHVybiBzU2VydmljZUluc3RhbmNlOwogICAgIH0KIAogICAgIHByaXZhdGUgQ29ubmVjdGl2aXR5U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIkNvbm5lY3Rpdml0eVNlcnZpY2Ugc3RhcnRpbmcgdXAiKTsKIAorICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ29ubmVjdGl2aXR5U2VydmljZVRocmVhZCIpOworICAgICAgICBoYW5kbGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKKwogICAgICAgICAvLyBzZXR1cCBvdXIgdW5pcXVlIGRldmljZSBuYW1lCiAgICAgICAgIFN0cmluZyBpZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQU5EUk9JRF9JRCk7CkBAIC0yNjQsMTAgKzI1NiwyOCBAQAogICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5ob3N0bmFtZSIsIG5hbWUpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVhZCBvdXIgZGVmYXVsdCBkbnMgc2VydmVyIGlwCisgICAgICAgIFN0cmluZyBkbnMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfRE5TX1NFUlZFUik7CisgICAgICAgIGlmIChkbnMgPT0gbnVsbCB8fCBkbnMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgZG5zID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvbmZpZ19kZWZhdWx0X2Ruc19zZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGVmYXVsdERucyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShkbnMpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3Igc2V0dGluZyBkZWZhdWx0RG5zIHVzaW5nICIgKyBkbnMpOworICAgICAgICB9CisKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFRBRyk7CisgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCk7CisKICAgICAgICAgbU5ldFRyYWNrZXJzID0gbmV3IE5ldHdvcmtTdGF0ZVRyYWNrZXJbCiAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5NQVhfTkVUV09SS19UWVBFKzFdOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoKTsKIAogICAgICAgICBtTmV0d29ya1ByZWZlcmVuY2UgPSBnZXRQZXJzaXN0ZWROZXR3b3JrUHJlZmVyZW5jZSgpOwogCkBAIC0zNjQsMTggKzM3NCwyMSBAQAogICAgICAgICAgICAgc3dpdGNoIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tUmFkaW8pIHsKICAgICAgICAgICAgIGNhc2UgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkk6CiAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIlN0YXJ0aW5nIFdpZmkgU2VydmljZS4iKTsKLSAgICAgICAgICAgICAgICBXaWZpU3RhdGVUcmFja2VyIHdzdCA9IG5ldyBXaWZpU3RhdGVUcmFja2VyKGNvbnRleHQsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBXaWZpU2VydmljZSB3aWZpU2VydmljZSA9IG5ldyBXaWZpU2VydmljZShjb250ZXh0LCB3c3QpOworICAgICAgICAgICAgICAgIFdpZmlTdGF0ZVRyYWNrZXIgd3N0ID0gbmV3IFdpZmlTdGF0ZVRyYWNrZXIoKTsKKyAgICAgICAgICAgICAgICBXaWZpU2VydmljZSB3aWZpU2VydmljZSA9IG5ldyBXaWZpU2VydmljZShjb250ZXh0KTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFLCB3aWZpU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgd2lmaVNlcnZpY2Uuc3RhcnRXaWZpKCk7CisgICAgICAgICAgICAgICAgd2lmaVNlcnZpY2UuY2hlY2tBbmRTdGFydFdpZmkoKTsKICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkldID0gd3N0OwotICAgICAgICAgICAgICAgIHdzdC5zdGFydE1vbml0b3JpbmcoKTsKKyAgICAgICAgICAgICAgICB3c3Quc3RhcnRNb25pdG9yaW5nKGNvbnRleHQsIG1IYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIC8vVE9ETzogYXMgcGFydCBvZiBXV1MgcmVmYWN0b3IsIGNyZWF0ZSBvbmx5IHdoZW4gbmVlZGVkCisgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBuZXcgV2lmaVdhdGNoZG9nU2VydmljZShjb250ZXh0KTsKIAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFOgotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXSA9IG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKGNvbnRleHQsIG1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICBuZXRUeXBlLCBtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tTmFtZSk7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnN0YXJ0TW9uaXRvcmluZygpOworICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXSA9IG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKG5ldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tTmFtZSk7CisgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnN0YXJ0TW9uaXRvcmluZyhjb250ZXh0LCBtSGFuZGxlcik7CiAgICAgICAgICAgICAgICAgaWYgKG5vTW9iaWxlRGF0YSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAidGVhcmluZyBkb3duIE1vYmlsZSBuZXR3b3JrcyBkdWUgdG8gc2V0dGluZyIpOwogICAgICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0udGVhcmRvd24oKTsKQEAgLTM5Miw3ICs0MDUsOCBAQAogICAgICAgICBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSAoKChtTmV0VHJhY2tlcnNbQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9EVU5dICE9IG51bGwpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1UZXRoZXJpbmcuaXNEdW5SZXF1aXJlZCgpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZVVzYlJlZ2V4cygpLmxlbmd0aCAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpLmxlbmd0aCAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKS5sZW5ndGggIT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpLmxlbmd0aCAhPSAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRVcHN0cmVhbUlmYWNlUmVnZXhzKCkubGVuZ3RoICE9IDApOwogCiAgICAgICAgIGlmIChEQkcpIHsKQEAgLTUyOCw2ICs1NDIsMzggQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gTGlua1Byb3BlcnRpZXMgZm9yIHRoZSBhY3RpdmUgKGkuZS4sIGNvbm5lY3RlZCkgZGVmYXVsdAorICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLiAgSXQgaXMgYXNzdW1lZCB0aGF0IGF0IG1vc3Qgb25lIGRlZmF1bHQgbmV0d29yaworICAgICAqIGlzIGFjdGl2ZSBhdCBhIHRpbWUuIElmIG1vcmUgdGhhbiBvbmUgaXMgYWN0aXZlLCBpdCBpcyBpbmRldGVybWluYXRlCisgICAgICogd2hpY2ggd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpcCBwcm9wZXJ0aWVzIGZvciB0aGUgYWN0aXZlIG5ldHdvcmssIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqIG5vbmUgaXMgYWN0aXZlCisgICAgICovCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldEFjdGl2ZUxpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICBmb3IgKGludCB0eXBlPTA7IHR5cGUgPD0gQ29ubmVjdGl2aXR5TWFuYWdlci5NQVhfTkVUV09SS19UWVBFOyB0eXBlKyspIHsKKyAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1t0eXBlXSA9PSBudWxsIHx8ICFtTmV0QXR0cmlidXRlc1t0eXBlXS5pc0RlZmF1bHQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciB0ID0gbU5ldFRyYWNrZXJzW3R5cGVdOworICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IHQuZ2V0TmV0d29ya0luZm8oKTsKKyAgICAgICAgICAgIGlmIChpbmZvLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhpbnQgbmV0d29ya1R5cGUpIHsKKyAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKKyAgICAgICAgaWYgKENvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZVZhbGlkKG5ldHdvcmtUeXBlKSkgeworICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciB0ID0gbU5ldFRyYWNrZXJzW25ldHdvcmtUeXBlXTsKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHJldHVybiB0LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW9zKGJvb2xlYW4gdHVybk9uKSB7CiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKQEAgLTY3NiwxNCArNzIyLDcgQEAKICAgICAgICAgICAgICAgICBuZXR3b3JrLnJlY29ubmVjdCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZVVzZXJzLmFkZChmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUkssCi0gICAgICAgICAgICAgICAgICAgICAgICBmKSwgZ2V0UmVzdG9yZURlZmF1bHROZXR3b3JrRGVsYXkoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV0d29yay5zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoZmVhdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwgZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CkBAIC04MDIsOCArODQxLDcgQEAKICAgICAgICAgICAgIHRyYWNrZXIudGVhcmRvd24oKTsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZG8gaXQgdGhlIG9sZCBmYXNoaW9uZWQgd2F5Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tlci5zdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShmZWF0dXJlLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg1MiwxMSArODkwLDM3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLQogICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaG9zdEFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIucmVxdWVzdFJvdXRlVG9Ib3N0KGluZXRBZGRyZXNzKTsKLSAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhob3N0QWRkcmVzcyk7CisgICAgICAgICAgICByZXR1cm4gYWRkSG9zdFJvdXRlKHRyYWNrZXIsIGFkZHIpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKKyAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgICAgICogVE9ETyAtIGRlcHJlY2F0ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhZGRIb3N0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCwgSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKKyAgICAgICAgaWYgKG50LmdldE5ldHdvcmtJbmZvKCkuZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgaG9zdEFkZHJlc3MgKyAiKCIgKyBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShpbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcywgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmUoVEFHLCAiYWRkSG9zdFJvdXRlIGZhaWxlZCBkdWUgdG8gbnVsbCBpbnRlcmZhY2UgbmFtZSIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtOTc1LDYgKzEwMzksMTIgQEAKICAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlQ29ubmVjdGl2aXR5SW50ZXJuYWxQZXJtaXNzaW9uKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEhhbmRsZSBhIHtAY29kZSBESVNDT05ORUNURUR9IGV2ZW50LiBJZiB0aGlzIHBlcnRhaW5zIHRvIHRoZSBub24tYWN0aXZlCiAgICAgICogbmV0d29yaywgd2UgaWdub3JlIGl0LiBJZiBpdCBpcyBmb3IgdGhlIGFjdGl2ZSBuZXR3b3JrLCB3ZSBzZW5kIG91dCBhCkBAIC0xMjY5LDkgKzEzMzksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJOZXR3b3JrIGRlY2xpbmVkIHRlYXJkb3duIHJlcXVlc3QiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWlsb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJOZXQucmVsZWFzZVdha2VMb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvbm5lY3Rpdml0eVNlcnZpY2UudGhpcykgeworICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBuZXcgZGVmYXVsdCBuZXR3b3JrLCByZWxlYXNlIHRoZSB0cmFuc2l0aW9uIHdha2Vsb2NrIGluIGEgc2Vjb25kCisgICAgICAgICAgICAgICAgLy8gaWYgaXQncyBoZWxkLiAgVGhlIHNlY29uZCBwYXVzZSBpcyB0byBhbGxvdyBhcHBzIHRvIHJlY29ubmVjdCBvdmVyIHRoZQorICAgICAgICAgICAgICAgIC8vIG5ldyBuZXR3b3JrCisgICAgICAgICAgICAgICAgaWYgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUFjdGl2ZURlZmF1bHROZXR3b3JrID0gdHlwZTsKQEAgLTEyODUsMzYgKzEzNjMsMTQgQEAKICAgICAgICAgICAgIC8vcmVwb3J0TmV0d29ya0NvbmRpdGlvbihtQWN0aXZlRGVmYXVsdE5ldHdvcmssIDEwMCk7CiAgICAgICAgIH0KICAgICAgICAgdGhpc05ldC5zZXRUZWFyZG93blJlcXVlc3RlZChmYWxzZSk7Ci0gICAgICAgIHRoaXNOZXQudXBkYXRlTmV0d29ya1NldHRpbmdzKCk7CisgICAgICAgIHVwZGF0ZU5ldHdvcmtTZXR0aW5ncyh0aGlzTmV0KTsKICAgICAgICAgaGFuZGxlQ29ubmVjdGl2aXR5Q2hhbmdlKHR5cGUpOwogICAgICAgICBzZW5kQ29ubmVjdGVkQnJvYWRjYXN0KGluZm8pOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTY2FuUmVzdWx0c0F2YWlsYWJsZShOZXR3b3JrSW5mbyBpbmZvKSB7Ci0gICAgICAgIGludCBuZXR3b3JrVHlwZSA9IGluZm8uZ2V0VHlwZSgpOwotICAgICAgICBpZiAobmV0d29ya1R5cGUgIT0gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIFNsb2cudihUQUcsICJHb3QgU2NhblJlc3VsdHNBdmFpbGFibGUgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICBpbmZvLmdldFR5cGVOYW1lKCkgKyAiIG5ldHdvcmsuIERvbid0IGtub3cgaG93IHRvIGhhbmRsZS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1OZXRUcmFja2Vyc1tuZXR3b3JrVHlwZV0uaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uQ2hhbmdlKGJvb2xlYW4gdmlzaWJsZSwgaW50IGlkLAotICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUNvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKLQotICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkoaWQsIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKLSAgICAgKiBBZnRlciBhIGNoYW5nZSBpbiB0aGUgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGFueSBuZXR3b3JrLCBXZSdyZSBtYWlubHkKLSAgICAgKiBjb25jZXJuZWQgd2l0aCBtYWtpbmcgc3VyZSB0aGF0IHRoZSBsaXN0IG9mIEROUyBzZXJ2ZXJzIGlzIHNldHVwdXAKKyAgICAgKiBBZnRlciBhIGNoYW5nZSBpbiB0aGUgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGEgbmV0d29yay4gV2UncmUgbWFpbmx5CisgICAgICogY29uY2VybmVkIHdpdGggbWFraW5nIHN1cmUgdGhhdCB0aGUgbGlzdCBvZiBETlMgc2VydmVycyBpcyBzZXQgdXAKICAgICAgKiBhY2NvcmRpbmcgdG8gd2hpY2ggbmV0d29ya3MgYXJlIGNvbm5lY3RlZCwgYW5kIGVuc3VyaW5nIHRoYXQgdGhlCiAgICAgICogcmlnaHQgcm91dGluZyB0YWJsZSBlbnRyaWVzIGV4aXN0LgogICAgICAqLwpAQCAtMTMyNywxOSArMTM4MywxNTggQEAKIAogICAgICAgICBpZiAobU5ldFRyYWNrZXJzW25ldFR5cGVdLmdldE5ldHdvcmtJbmZvKCkuaXNDb25uZWN0ZWQoKSkgewogICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLmFkZERlZmF1bHRSb3V0ZSgpOworICAgICAgICAgICAgICAgIGFkZERlZmF1bHRSb3V0ZShtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0uYWRkUHJpdmF0ZURuc1JvdXRlcygpOworICAgICAgICAgICAgICAgIGFkZFByaXZhdGVEbnNSb3V0ZXMobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5yZW1vdmVEZWZhdWx0Um91dGUoKTsKKyAgICAgICAgICAgICAgICByZW1vdmVEZWZhdWx0Um91dGUobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnJlbW92ZVByaXZhdGVEbnNSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICByZW1vdmVQcml2YXRlRG5zUm91dGVzKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYWRkUHJpdmF0ZURuc1JvdXRlcyhOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIGJvb2xlYW4gcHJpdmF0ZURuc1JvdXRlU2V0ID0gbnQuaXNQcml2YXRlRG5zUm91dGVTZXQoKTsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG50ICsKKyAgICAgICAgICAgICAgICAgICAgIigiICsgaW50ZXJmYWNlTmFtZSArICIpIC0gbVByaXZhdGVEbnNSb3V0ZVNldCA9ICIgKyBwcml2YXRlRG5zUm91dGVTZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIXByaXZhdGVEbnNSb3V0ZVNldCkgeworICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZG5zTGlzdCA9IHAuZ2V0RG5zZXMoKTsKKyAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICIgIGFkZGluZyAiICsgZG5zKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKGludGVyZmFjZU5hbWUsIGRucywgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudC5wcml2YXRlRG5zUm91dGVTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyhOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIC8vIFRPRE8gLSB3ZSBzaG91bGQgZG8gdGhpcyBleHBsaWNpdGx5IGJ1dCB0aGUgTmV0VXRpbHMgYXBpIGRvZXNudAorICAgICAgICAvLyBzdXBwb3J0IHRoaXMgeWV0IC0gbXVzdCByZW1vdmUgYWxsLiAgTm8gd29yc2UgdGhhbiBiZWZvcmUKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBwcml2YXRlRG5zUm91dGVTZXQgPSBudC5pc1ByaXZhdGVEbnNSb3V0ZVNldCgpOworICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIHByaXZhdGVEbnNSb3V0ZVNldCkgeworICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZW1vdmVQcml2YXRlRG5zUm91dGVzIGZvciAiICsgbnQuZ2V0TmV0d29ya0luZm8oKS5nZXRUeXBlTmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZW1vdmVIb3N0Um91dGVzKGludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgbnQucHJpdmF0ZURuc1JvdXRlU2V0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRSb3V0ZShOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgIEluZXRBZGRyZXNzIGRlZmF1bHRHYXRld2F5QWRkciA9IHAuZ2V0R2F0ZXdheSgpOworCisgICAgICAgIGlmICgoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSAmJiAoZGVmYXVsdEdhdGV3YXlBZGRyICE9IG51bGwgKSkgeworICAgICAgICAgICAgaWYgKCFOZXR3b3JrVXRpbHMuYWRkRGVmYXVsdFJvdXRlKGludGVyZmFjZU5hbWUsIGRlZmF1bHRHYXRld2F5QWRkcikgJiYgREJHKSB7CisgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBudC5nZXROZXR3b3JrSW5mbygpOworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGREZWZhdWx0Um91dGUgZm9yICIgKyBuZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBpbnRlcmZhY2VOYW1lICsgIiksIEdhdGV3YXlBZGRyPSIgKyBkZWZhdWx0R2F0ZXdheUFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgoTmV0d29ya1V0aWxzLnJlbW92ZURlZmF1bHRSb3V0ZShpbnRlcmZhY2VOYW1lKSA+PSAwKSAmJiBEQkcpIHsKKyAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IG50LmdldE5ldHdvcmtJbmZvKCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlbW92ZURlZmF1bHRSb3V0ZSBmb3IgIiArIG5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKyAiICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbmV0d29yayBzcGVjaWZpYyBUQ1AgYnVmZmVyIHNpemVzIGZyb20gU3lzdGVtUHJvcGVydGllcworICAgICAqIG5ldC50Y3AuYnVmZmVyc2l6ZS5bZGVmYXVsdHx3aWZpfHVtdHN8ZWRnZXxncHJzXSBhbmQgc2V0IHRoZW0gZm9yIHN5c3RlbQorICAgICAqIHdpZGUgdXNlCisgICAgICovCisgICBwdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU2V0dGluZ3MoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBTdHJpbmcga2V5ID0gbnQuZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOworICAgICAgICBTdHJpbmcgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOworCisgICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCBrZXkgKyAiIG5vdCBmb3VuZCBpbiBzeXN0ZW0gcHJvcGVydGllcy4gVXNpbmcgZGVmYXVsdHMiKTsKKworICAgICAgICAgICAgLy8gU2V0dGluZyB0byBkZWZhdWx0IHZhbHVlcyBzbyB3ZSB3b24ndCBiZSBzdHVjayB0byBwcmV2aW91cyB2YWx1ZXMKKyAgICAgICAgICAgIGtleSA9ICJuZXQudGNwLmJ1ZmZlcnNpemUuZGVmYXVsdCI7CisgICAgICAgICAgICBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdmFsdWVzIGluIGtlcm5lbAorICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJTZXR0aW5nIFRDUCB2YWx1ZXM6IFsiICsgYnVmZmVyU2l6ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gd2hpY2ggY29tZXMgZnJvbSBbIiArIGtleSArICJdIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRCdWZmZXJTaXplKGJ1ZmZlclNpemVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCisgICAgICogV3JpdGVzIFRDUCBidWZmZXIgc2l6ZXMgdG8gL3N5cy9rZXJuZWwvaXB2NC90Y3BfW3Ivd11tZW1fW21pbi9kZWYvbWF4XQorICAgICAqIHdoaWNoIG1hcHMgdG8gL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF9ybWVtIGFuZCB0Y3B3bWVtCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZXMgaW4gdGhlIGZvcm1hdCBvZiAicmVhZE1pbiwgcmVhZEluaXRpYWwsIHJlYWRNYXgsCisgICAgICogICAgICAgIHdyaXRlTWluLCB3cml0ZUluaXRpYWwsIHdyaXRlTWF4IgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRCdWZmZXJTaXplKFN0cmluZyBidWZmZXJTaXplcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gYnVmZmVyU2l6ZXMuc3BsaXQoIiwiKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gNikgeworICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gIi9zeXMva2VybmVsL2lwdjQvdGNwXyI7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21pbiIsIHZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX2RlZiIsIHZhbHVlc1sxXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21heCIsIHZhbHVlc1syXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21pbiIsIHZhbHVlc1szXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX2RlZiIsIHZhbHVlc1s0XSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21heCIsIHZhbHVlc1s1XSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbnZhbGlkIGJ1ZmZlcnNpemUgc3RyaW5nOiAiICsgYnVmZmVyU2l6ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3Qgc2V0IHRjcCBidWZmZXIgc2l6ZXM6IiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKKyAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdHJpbmdUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC53cml0ZShzdHJpbmcpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKwogICAgIC8qKgogICAgICAqIEFkanVzdCB0aGUgcGVyLXByb2Nlc3MgZG5zIGVudHJpZXMgKG5ldC5kbnM8eD4uPHBpZD4pIGJhc2VkCiAgICAgICogb24gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYWN0aXZlIG5ldCB3aGljaCB0aGlzIHByb2Nlc3MgcmVxdWVzdGVkLgpAQCAtMTM1NSwxMiArMTU1MCwxNCBAQAogICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciBudCA9IG1OZXRUcmFja2Vyc1tpXTsKICAgICAgICAgICAgIGlmIChudC5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkgJiYKICAgICAgICAgICAgICAgICAgICAgIW50LmlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIGlmIChwID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIExpc3QgcGlkcyA9IG1OZXRSZXF1ZXN0ZXJzUGlkc1tpXTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8cGlkcy5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHBpZCA9IChJbnRlZ2VyKXBpZHMuZ2V0KGopOwogICAgICAgICAgICAgICAgICAgICBpZiAocGlkLmludFZhbHVlKCkgPT0gbXlQaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBudC5nZXROYW1lU2VydmVycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zTGlzdCwgbXlQaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZG5zZXMgPSBwLmdldERuc2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNlcywgbXlQaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvQnVtcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBEbnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEzODIsMTIgKzE1NzksMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB3cml0ZVBpZERucyhTdHJpbmdbXSBkbnNMaXN0LCBpbnQgcGlkKSB7CisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGlkRG5zKENvbGxlY3Rpb24gPEluZXRBZGRyZXNzPiBkbnNlcywgaW50IHBpZCkgewogICAgICAgICBpbnQgaiA9IDE7Ci0gICAgICAgIGZvciAoU3RyaW5nIGRucyA6IGRuc0xpc3QpIHsKLSAgICAgICAgICAgIGlmIChkbnMgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhkbnMsICIwLjAuMC4wIikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgibmV0LmRucyIgKyBqKysgKyAiLiIgKyBwaWQsIGRucyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zZXMpIHsKKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKyArICIuIiArIHBpZCwgZG5zLmdldEhvc3RBZGRyZXNzKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDEwLDE2ICsxNjA1LDI0IEBACiAgICAgICAgIC8vIGFkZCBkZWZhdWx0IG5ldCdzIGRucyBlbnRyaWVzCiAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQgPSBtTmV0VHJhY2tlcnNbbmV0VHlwZV07CiAgICAgICAgIGlmIChudCAhPSBudWxsICYmIG50LmdldE5ldHdvcmtJbmZvKCkuaXNDb25uZWN0ZWQoKSAmJiAhbnQuaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBkbnNMaXN0ID0gbnQuZ2V0TmFtZVNlcnZlcnMoKTsKKyAgICAgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZG5zZXMgPSBwLmdldERuc2VzKCk7CiAgICAgICAgICAgICBpZiAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0uaXNEZWZhdWx0KCkpIHsKICAgICAgICAgICAgICAgICBpbnQgaiA9IDE7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZG5zIDogZG5zTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZG5zICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMoZG5zLCAiMC4wLjAuMCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRuc2VzLnNpemUoKSA9PSAwICYmIG1EZWZhdWx0RG5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm5vIGRucyBwcm92aWRlZCAtIHVzaW5nICIgKyBtRGVmYXVsdERucy5nZXRIb3N0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgibmV0LmRuczEiLCBtRGVmYXVsdERucy5nZXRIb3N0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkaW5nIGRucyAiICsgZG5zICsgIiBmb3IgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrLCBkbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrLCBkbnMuZ2V0SG9zdEFkZHJlc3MoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz1qIDsgazxtTnVtRG5zRW50cmllczsgaysrKSB7CkBAIC0xNDMyLDExICsxNjM1LDExIEBACiAgICAgICAgICAgICAgICAgTGlzdCBwaWRzID0gbU5ldFJlcXVlc3RlcnNQaWRzW25ldFR5cGVdOwogICAgICAgICAgICAgICAgIGZvciAoaW50IHk9MDsgeTwgcGlkcy5zaXplKCk7IHkrKykgewogICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHBpZCA9IChJbnRlZ2VyKXBpZHMuZ2V0KHkpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNMaXN0LCBwaWQuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlUGlkRG5zKGRuc2VzLCBwaWQuaW50VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVtcERucygpOwogICAgICAgICB9Ci0gICAgICAgIGJ1bXBEbnMoKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXRSZXN0b3JlRGVmYXVsdE5ldHdvcmtEZWxheSgpIHsKQEAgLTE0OTEsNiArMTY5NCwxMyBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKIAorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIk5ldHdvcmtUcmFuc3Rpb25XYWtlTG9jayBpcyBjdXJyZW50bHkgIiArCisgICAgICAgICAgICAgICAgICAgIChtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpID8gIiIgOiAibm90ICIpICsgImhlbGQuIik7CisgICAgICAgICAgICBwdy5wcmludGxuKCJJdCB3YXMgbGFzdCByZXF1ZXN0ZWQgZm9yICIrbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5KTsKKyAgICAgICAgfQorICAgICAgICBwdy5wcmludGxuKCk7CisKICAgICAgICAgbVRldGhlcmluZy5kdW1wKGZkLCBwdywgYXJncyk7CiAKICAgICAgICAgaWYgKG1JbmV0TG9nICE9IG51bGwpIHsKQEAgLTE1MDQsNiArMTcxNCwxMCBAQAogCiAgICAgLy8gbXVzdCBiZSBzdGF0ZWxlc3MgLSB0aGluZ3MgY2hhbmdlIHVuZGVyIHVzLgogICAgIHByaXZhdGUgY2xhc3MgTXlIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHB1YmxpYyBNeUhhbmRsZXIoTG9vcGVyIGxvb3BlcikgeworICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvOwpAQCAtMTU2NSwyOSArMTc3OSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29ubmVjdChpbmZvKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFOgotICAgICAgICAgICAgICAgICAgICBpbmZvID0gKE5ldHdvcmtJbmZvKSBtc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTY2FuUmVzdWx0c0F2YWlsYWJsZShpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkNoYW5nZShtc2cuYXJnMSA9PSAxLCBtc2cuYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTm90aWZpY2F0aW9uKSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KICAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gbWFrZSB0aGlzIGhhbmRsZSBpcC9wcm94eS9nYXRld2F5L2RucyBjaGFuZ2VzCiAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAoTmV0d29ya0luZm8pIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBpbmZvLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG5zQ29uZmlndXJhdGlvbkNoYW5nZSh0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfUk9BTUlOR19DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAvLyBmaWxsIG1lIGluCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAvLyBmaWxsIG1lIGluCisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdXNlZEJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25uZWN0aXZpdHlTZXJ2aWNlLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA9PSBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSA9IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2F1c2VkQnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5ldFRyYW5zaXRpb24gV2FrZWxvY2sgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSArICIgcmVsZWFzZWQgYnkgdGltZW91dCIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUks6CiAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVVc2VyIHUgPSAoRmVhdHVyZVVzZXIpbXNnLm9iajsKQEAgLTE2ODEsNiArMTg5MSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKSB7CisgICAgICAgIGVuZm9yY2VUZXRoZXJBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIGlmIChpc1RldGhlcmluZ1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFRPRE8gLSBtb3ZlIGlmYWNlIGxpc3RpbmcsIHF1ZXJpZXMsIGV0YyB0byBuZXcgbW9kdWxlCiAgICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlSWZhY2VzKCkgewpAQCAtMTcwOSw2ICsxOTI4LDI1IEBACiAgICAgICAgIHJldHVybiB0ZXRoZXJFbmFibGVkSW5TZXR0aW5ncyAmJiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQ7CiAgICAgfQogCisgICAgLy8gQW4gQVBJIE5ldHdvcmtTdGF0ZVRyYWNrZXJzIGNhbiBjYWxsIHdoZW4gdGhleSBsb3NlIHRoZWlyIG5ldHdvcmsuCisgICAgLy8gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBhZnRlciBYIHNlY29uZHMgb3IgYSBuZXR3b3JrIGJlY29tZXMgQ09OTkVDVEVELAorICAgIC8vIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LiAgVGhlIHRpbWVyIGlzIHN0YXJ0ZWQgYnkgdGhlIGZpcnN0IGNhbGxlciBhbmQgbm90CisgICAgLy8gcmVzdGFydGVkIGJ5IHN1YnNlcXVlbnQgY2FsbGVycy4KKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhTdHJpbmcgZm9yV2hvbSkgeworICAgICAgICBlbmZvcmNlQ29ubmVjdGl2aXR5SW50ZXJuYWxQZXJtaXNzaW9uKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIrKzsKKyAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5ID0gZm9yV2hvbTsKKyAgICAgICAgfQorICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSywKKyAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyLCAwKSwKKyAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrVGltZW91dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICAvLyAxMDAgcGVyY2VudCBpcyBmdWxsIGdvb2QsIDAgaXMgZnVsbCBiYWQuCiAgICAgcHVibGljIHZvaWQgcmVwb3J0SW5ldENvbmRpdGlvbihpbnQgbmV0d29ya1R5cGUsIGludCBwZXJjZW50YWdlKSB7CiAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJyZXBvcnROZXR3b3JrQ29uZGl0aW9uKCIgKyBuZXR3b3JrVHlwZSArICIsICIgKyBwZXJjZW50YWdlICsgIikiKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDgxZWJlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb24uQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5RGV0ZWN0b3I7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5JQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGV0ZWN0cyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluIHRocm91Z2gKKyAqIHtAbGluayBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yfS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeURldGVjdG9yU2VydmljZSBleHRlbmRzIElDb3VudHJ5RGV0ZWN0b3IuU3R1YiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyByZXByZXNlbnRzIHRoZSByZW1vdGUgbGlzdGVuZXIsIGl0IHdpbGwgYWxzbyByZW1vdmVzIGl0c2VsZgorICAgICAqIGZyb20gbGlzdGVuZXIgbGlzdCB3aGVuIHRoZSByZW1vdGUgcHJvY2VzcyB3YXMgZGllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJlY2VpdmVyIGltcGxlbWVudHMgSUJpbmRlci5EZWF0aFJlY2lwaWVudCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUNvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUJpbmRlciBtS2V5OworCisgICAgICAgIHB1YmxpYyBSZWNlaXZlcihJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIG1LZXkgPSBsaXN0ZW5lci5hc0JpbmRlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKKyAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKG1LZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXJPYmopIHsKKyAgICAgICAgICAgIGlmIChvdGhlck9iaiBpbnN0YW5jZW9mIFJlY2VpdmVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1LZXkuZXF1YWxzKCgoUmVjZWl2ZXIpIG90aGVyT2JqKS5tS2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1LZXkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJQ291bnRyeUxpc3RlbmVyIGdldExpc3RlbmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1MaXN0ZW5lcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQ291bnRyeURldGVjdG9yU2VydmljZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8SUJpbmRlciwgUmVjZWl2ZXI+IG1SZWNlaXZlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciBtQ291bnRyeURldGVjdG9yOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOworICAgIHByaXZhdGUgQ291bnRyeUxpc3RlbmVyIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JMaXN0ZW5lcjsKKworICAgIHB1YmxpYyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBtUmVjZWl2ZXJzID0gbmV3IEhhc2hNYXA8SUJpbmRlciwgUmVjZWl2ZXI+KCk7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN5c3RlbVJlYWR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Db3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgSUNvdW50cnlMaXN0ZW5lciBpbnRvIHRoZSBsaXN0ZW5lciBsaXN0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBhZGRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBJQ291bnRyeUxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ291bnRyeUxpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmFzQmluZGVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcihJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVJlY2VpdmVycykgeworICAgICAgICAgICAgUmVjZWl2ZXIgciA9IG5ldyBSZWNlaXZlcihsaXN0ZW5lcik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFzQmluZGVyKCkubGlua1RvRGVhdGgociwgMCk7CisgICAgICAgICAgICAgICAgbVJlY2VpdmVycy5wdXQobGlzdGVuZXIuYXNCaW5kZXIoKSwgcik7CisgICAgICAgICAgICAgICAgaWYgKG1SZWNlaXZlcnMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRoZSBmaXJzdCBsaXN0ZW5lciBpcyBhZGRlZCIpOworICAgICAgICAgICAgICAgICAgICBzZXRDb3VudHJ5TGlzdGVuZXIobUxvY2F0aW9uQmFzZWREZXRlY3Rvckxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJsaW5rVG9EZWF0aCBmYWlsZWQ6IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUJpbmRlciBrZXkpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJzKSB7CisgICAgICAgICAgICBtUmVjZWl2ZXJzLnJlbW92ZShrZXkpOworICAgICAgICAgICAgaWYgKG1SZWNlaXZlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc2V0Q291bnRyeUxpc3RlbmVyKG51bGwpOworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJObyBsaXN0ZW5lciBpcyBsZWZ0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeVJlY2VpdmVycyhDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1SZWNlaXZlcnMpIHsKKyAgICAgICAgICAgIGZvciAoUmVjZWl2ZXIgcmVjZWl2ZXIgOiBtUmVjZWl2ZXJzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0TGlzdGVuZXIoKS5vbkNvdW50cnlEZXRlY3RlZChjb3VudHJ5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTaGFsbCB3ZSByZW1vdmUgdGhlIHJlY2VpdmVyPworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAibm90aWZ5UmVjZWl2ZXJzIGZhaWxlZDoiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN5c3RlbVJlYWR5KCkgeworICAgICAgICAvLyBTaGFsbCB3ZSB3YWl0IGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZmluaXNoLgorICAgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCAiQ291bnRyeURldGVjdG9yU2VydmljZSIpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgbUNvdW50cnlEZXRlY3RvciA9IG5ldyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yKG1Db250ZXh0KTsKKyAgICAgICAgbUxvY2F0aW9uQmFzZWREZXRlY3Rvckxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKGZpbmFsIENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlSZWNlaXZlcnMoY291bnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFByb2Nlc3Muc2V0VGhyZWFkUHJpb3JpdHkoUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfQkFDS0dST1VORCk7CisgICAgICAgIExvb3Blci5wcmVwYXJlKCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgICAgICBtU3lzdGVtUmVhZHkgPSB0cnVlOworICAgICAgICBMb29wZXIubG9vcCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldENvdW50cnlMaXN0ZW5lcihmaW5hbCBDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtQ291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIEZvciB0ZXN0aW5nCisgICAgYm9vbGVhbiBpc1N5c3RlbVJlYWR5KCkgeworICAgICAgICByZXR1cm4gbVN5c3RlbVJlYWR5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZW1vRGF0YVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc5ODVmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuSW1hZ2VzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIERlbW9EYXRhU2V0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiRGVtb0RhdGFTZXQiOwotCi0gICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZChDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLQotICAgICAgICAvLyBSZW1vdmUgYWxsIHRoZSBvbGQgZGF0YQotICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZShDb250YWN0cy5QZW9wbGUuQ09OVEVOVF9VUkksIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIEFkZCB0aGUgbmV3IGRhdGEKLSAgICAgICAgYWRkRGVmYXVsdERhdGEoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCBpbWFnZXMgZnJvbSAvYW5kcm9pZC9pbWFnZXMKLSAgICAgICAgYWRkRGVmYXVsdEltYWdlcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGREZWZhdWx0SW1hZ2VzKCkKLSAgICB7Ci0gICAgICAgIEZpbGUgcm9vdERpcmVjdG9yeSA9IEVudmlyb25tZW50LmdldFJvb3REaXJlY3RvcnkoKTsKLSAgICAgICAgU3RyaW5nIFtdIGZpbGVzCi0gICAgICAgICAgICA9IG5ldyBGaWxlKHJvb3REaXJlY3RvcnksICJpbWFnZXMiKS5saXN0KCk7Ci0gICAgICAgIGludCBjb3VudCA9IGZpbGVzLmxlbmd0aDsKLQotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgU2xvZy5pKExPR19UQUcsICJhZGREZWZhdWx0SW1hZ2VzOiBubyBpbWFnZXMgZm91bmQhIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZXNbaV07Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHJvb3REaXJlY3RvcnkgKyAiLyIgKyBuYW1lOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEltYWdlcy5NZWRpYS5pbnNlcnRJbWFnZShtQ29udGVudFJlc29sdmVyLCBwYXRoLCBuYW1lLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gaW1wb3J0IGltYWdlICIgKyBwYXRoLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgYWRkRGVmYXVsdERhdGEoKQotICAgIHsKLSAgICAgICAgU2xvZy5pKExPR19UQUcsICJBZGRpbmcgZGVmYXVsdCBkYXRhLi4uIik7Ci0KLS8vICAgICAgIGFkZEltYWdlKCJWaW9sZXQiLCAiaW1hZ2VzL3Zpb2xldC5wbmciKTsKLS8vICAgICAgIGFkZEltYWdlKCJDb3JreSIsICJpbWFnZXMvY29ya3kucG5nIik7Ci0KLSAgICAgICAgLy8gUEVORElORzogc2hvdWxkIHRoaXMgYmUgZG9uZSBoZXJlPyE/IQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgKLSAgICAgICAgICAgICAgICBJbnRlbnQuQUNUSU9OX0NBTEwsIFVyaS5mcm9tUGFydHMoInZvaWNlbWFpbCIsICIiLCBudWxsKSk7Ci0gICAgICAgIGFkZFNob3J0Y3V0KCIxIiwgaW50ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFVyaSBhZGRJbWFnZShTdHJpbmcgbmFtZSwgVXJpIGZpbGUpCi0gICAgewotICAgICAgICBDb250ZW50VmFsdWVzIGltYWdldiA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGltYWdldi5wdXQoIm5hbWUiLCBuYW1lKTsKLQotICAgICAgICBVcmkgdXJsID0gbnVsbDsKLQotICAgICAgICBBc3NldE1hbmFnZXIgYXNzID0gQXNzZXRNYW5hZ2VyLmdldFN5c3RlbSgpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluID0gYXNzLm9wZW4oZmlsZS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgdXJsID0gbUNvbnRlbnRSZXNvbHZlci5pbnNlcnQoSW1hZ2VzLk1lZGlhLklOVEVSTkFMX0NPTlRFTlRfVVJJLCBpbWFnZXYpOwotICAgICAgICAgICAgb3V0ID0gbUNvbnRlbnRSZXNvbHZlci5vcGVuT3V0cHV0U3RyZWFtKHVybCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gOCAqIDEwMjQ7Ci0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvdW50ID0gaW4ucmVhZChidWYsIDAsIHNpemUpOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgY291bnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ID4gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBpbnNlcnQgaW1hZ2UgJyIgKyBmaWxlICsgIiciLCBlKTsKLSAgICAgICAgICAgIHVybCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgVXJpIGFkZFNob3J0Y3V0KFN0cmluZyBzaG9ydGN1dCwgSW50ZW50IGludGVudCkKLSAgICB7Ci0gICAgICAgIGlmIChDb25maWcuTE9HVikgU2xvZy52KExPR19UQUcsICJhZGRTaG9ydGN1dDogc2hvcnRjdXQ9IiArIHNob3J0Y3V0ICsgIiwgaW50ZW50PSIgKyBpbnRlbnQpOwotICAgICAgICByZXR1cm4gU2V0dGluZ3MuQm9va21hcmtzLmFkZChtQ29udGVudFJlc29sdmVyLCBpbnRlbnQsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0ICE9IG51bGwgPyBzaG9ydGN1dC5jaGFyQXQoMCkgOiAwLCAwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAyMTI3M2NjLi4yODEyNmI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5JRGV2aWNlUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKQEAgLTQ2LDYgKzQ3LDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHk7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJpbnRXcml0ZXJQcmludGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludGVyOwpAQCAtNTksNDYgKzYyLDY2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRldmljZSBwb2xpY3kgQVBJcy4KICAqLwogcHVibGljIGNsYXNzIERldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlIGV4dGVuZHMgSURldmljZVBvbGljeU1hbmFnZXIuU3R1YiB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UiOwotICAgIAorCiAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBmaW5hbCBNeVBhY2thZ2VNb25pdG9yIG1Nb25pdG9yOwogCiAgICAgSVBvd2VyTWFuYWdlciBtSVBvd2VyTWFuYWdlcjsKLSAgICAKKwogICAgIGludCBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgIGludCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSAwOwogICAgIGludCBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyA9IDA7Ci0gICAgCisKICAgICBpbnQgbVBhc3N3b3JkT3duZXIgPSAtMTsKLSAgICAKKwogICAgIGZpbmFsIEhhc2hNYXA8Q29tcG9uZW50TmFtZSwgQWN0aXZlQWRtaW4+IG1BZG1pbk1hcAogICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxDb21wb25lbnROYW1lLCBBY3RpdmVBZG1pbj4oKTsKICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aXZlQWRtaW4+IG1BZG1pbkxpc3QKICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxBY3RpdmVBZG1pbj4oKTsKLSAgICAKKwogICAgIHN0YXRpYyBjbGFzcyBBY3RpdmVBZG1pbiB7CiAgICAgICAgIGZpbmFsIERldmljZUFkbWluSW5mbyBpbmZvOwotICAgICAgICAKKwogICAgICAgICBpbnQgcGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGVuZ3RoID0gMDsKKyAgICAgICAgaW50IHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IDA7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gMDsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZExldHRlcnMgPSAxOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IDE7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gMTsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgICAgIGxvbmcgbWF4aW11bVRpbWVUb1VubG9jayA9IDA7CiAgICAgICAgIGludCBtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IDA7Ci0gICAgICAgIAorCisgICAgICAgIC8vIFRPRE86IHJldmlldyBpbXBsZW1lbnRhdGlvbiBkZWNpc2lvbnMgd2l0aCBmcmFtZXdvcmtzIHRlYW0KKyAgICAgICAgYm9vbGVhbiBzcGVjaWZpZXNHbG9iYWxQcm94eSA9IGZhbHNlOworICAgICAgICBTdHJpbmcgZ2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCA9IG51bGw7CisKICAgICAgICAgQWN0aXZlQWRtaW4oRGV2aWNlQWRtaW5JbmZvIF9pbmZvKSB7CiAgICAgICAgICAgICBpbmZvID0gX2luZm87CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaW50IGdldFVpZCgpIHsgcmV0dXJuIGluZm8uZ2V0QWN0aXZpdHlJbmZvKCkuYXBwbGljYXRpb25JbmZvLnVpZDsgfQotICAgICAgICAKKwogICAgICAgICB2b2lkIHdyaXRlVG9YbWwoWG1sU2VyaWFsaXplciBvdXQpCiAgICAgICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBvbGljaWVzIik7CkBAIC0xMTEsNyArMTM0LDQyIEBACiAgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZExlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbGVuZ3RoIik7CiAgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmRMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibW4tcGFzc3dvcmQtbGVuZ3RoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocGFzc3dvcmRIaXN0b3J5TGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBhc3N3b3JkLWhpc3RvcnktbGVuZ3RoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhwYXNzd29yZEhpc3RvcnlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXVwcGVyY2FzZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sb3dlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbG93ZXJjYXNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZXR0ZXJzIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZXR0ZXJzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmROdW1lcmljID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1udW1lcmljIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmROdW1lcmljKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1udW1lcmljIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRTeW1ib2xzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1zeW1ib2xzIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmRTeW1ib2xzKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1zeW1ib2xzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW5vbmxldHRlciIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1ub25sZXR0ZXIiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobWF4aW11bVRpbWVUb1VubG9jayAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQpIHsKQEAgLTEyNCw4ICsxODIsMjMgQEAKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtYXgtZmFpbGVkLXBhc3N3b3JkLXdpcGUiKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcGVjaWZpZXNHbG9iYWxQcm94eSkgeworICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAic3BlY2lmaWVzLWdsb2JhbC1wcm94eSIpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgQm9vbGVhbi50b1N0cmluZyhzcGVjaWZpZXNHbG9iYWxQcm94eSkpOworICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInNwZWNpZmllc19nbG9iYWxfcHJveHkiKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJnbG9iYWwtcHJveHktc3BlYyIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIGdsb2JhbFByb3h5U3BlYyk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1zcGVjIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1leGNsdXNpb24tbGlzdCIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1leGNsdXNpb24tbGlzdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB2b2lkIHJlYWRGcm9tWG1sKFhtbFB1bGxQYXJzZXIgcGFyc2VyKQogICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpbnQgb3V0ZXJEZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwpAQCAtMTQ0LDE5ICsyMTcsNDkgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbGVuZ3RoIi5lcXVhbHModGFnKSkgewogICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZXR0ZXJzIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1udW1lcmljIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmROdW1lcmljID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1zeW1ib2xzIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1ub25sZXR0ZXIiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtYXgtdGltZS10by11bmxvY2siLmVxdWFscyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1heGltdW1UaW1lVG9VbmxvY2sgPSBMb25nLnBhcnNlTG9uZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1heC1mYWlsZWQtcGFzc3dvcmQtd2lwZSIuZXF1YWxzKHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgbWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUgPSBJbnRlZ2VyLnBhcnNlSW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic3BlY2lmaWVzLWdsb2JhbC1wcm94eSIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzR2xvYmFsUHJveHkgPSBCb29sZWFuLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJnbG9iYWwtcHJveHktc3BlYyIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJveHlTcGVjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJnbG9iYWwtcHJveHktZXhjbHVzaW9uLWxpc3QiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gYWRtaW4gdGFnOiAiICsgdGFnKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCwgUHJpbnRXcml0ZXIgcHcpIHsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJ1aWQ9Iik7IHB3LnByaW50bG4oZ2V0VWlkKCkpOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnRsbigicG9saWNpZXM6Iik7CkBAIC0xNjcsMjMgKzI3MCw0NyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJwYXNzd29yZFF1YWxpdHk9MHgiKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoSW50ZWdlci50b0hleFN0cmluZyhwYXNzd29yZFF1YWxpdHkpKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBtaW5pbXVtUGFzc3dvcmRMZW5ndGg9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oSW50ZWdlci50b0hleFN0cmluZyhwYXNzd29yZFF1YWxpdHkpKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRMZW5ndGg9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJwYXNzd29yZEhpc3RvcnlMZW5ndGg9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4ocGFzc3dvcmRIaXN0b3J5TGVuZ3RoKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2U9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2U9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzPSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1pbmltdW1QYXNzd29yZExldHRlcnMpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZE51bWVyaWM9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTnVtZXJpYyk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWluaW11bVBhc3N3b3JkU3ltYm9scz0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRTeW1ib2xzKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXI9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKTsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtYXhpbXVtVGltZVRvVW5sb2NrPSIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1heGltdW1UaW1lVG9VbmxvY2spOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlPSIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJzcGVjaWZpZXNHbG9iYWxQcm94eT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihzcGVjaWZpZXNHbG9iYWxQcm94eSk7CisgICAgICAgICAgICBpZiAoZ2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZ2xvYmFsUHJveHlTcGVjPSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihnbG9iYWxQcm94eVNwZWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImdsb2JhbFByb3h5RWNsdXNpb25MaXN0PSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihnbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgY2xhc3MgTXlQYWNrYWdlTW9uaXRvciBleHRlbmRzIFBhY2thZ2VNb25pdG9yIHsKICAgICAgICAgcHVibGljIHZvaWQgb25Tb21lUGFja2FnZXNDaGFuZ2VkKCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChEZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS50aGlzKSB7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1tQWRtaW5MaXN0LnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWEgPSBtQWRtaW5MaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5nZSA9IGlzUGFja2FnZURpc2FwcGVhcmluZyhhYS5pbmZvLmdldFBhY2thZ2VOYW1lKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5nZSA9IGlzUGFja2FnZURpc2FwcGVhcmluZyhhYS5pbmZvLmdldFBhY2thZ2VOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlID09IFBBQ0tBR0VfUEVSTUFORU5UX0NIQU5HRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5nZSA9PSBQQUNLQUdFX1RFTVBPUkFSWV9DSEFOR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJBZG1pbiB1bmV4cGVjdGVkbHkgdW5pbnN0YWxsZWQ6ICIKQEAgLTIwOCw3ICszMzUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIHRoZSBzZXJ2aWNlLgogICAgICAqLwpAQCAtMjI1LDcgKzM1Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1JUG93ZXJNYW5hZ2VyOwogICAgIH0KLSAgICAKKwogICAgIEFjdGl2ZUFkbWluIGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTWFwLmdldCh3aG8pOwogICAgICAgICBpZiAoYWRtaW4gIT0gbnVsbApAQCAtMjM1LDcgKzM2Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgQWN0aXZlQWRtaW4gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQoQ29tcG9uZW50TmFtZSB3aG8sIGludCByZXFQb2xpY3kpCiAgICAgICAgICAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CkBAIC0yNjYsMTMgKzM5MywxMyBAQAogICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkgKyAiIGZvciBwb2xpY3kgIyIgKyByZXFQb2xpY3kpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKEFjdGl2ZUFkbWluIGFkbWluLCBTdHJpbmcgYWN0aW9uKSB7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CiAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQoYWRtaW4uaW5mby5nZXRDb21wb25lbnQoKSk7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKICAgICB9Ci0gICAgCisKICAgICB2b2lkIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoU3RyaW5nIGFjdGlvbiwgaW50IHJlcVBvbGljeSkgewogICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICBpZiAoTiA+IDApIHsKQEAgLTI4NCwxOSArNDExLDI0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICB2b2lkIHJlbW92ZUFjdGl2ZUFkbWluTG9ja2VkKENvbXBvbmVudE5hbWUgYWRtaW5SZWNlaXZlcikgewogICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpOwogICAgICAgICBpZiAoYWRtaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiBkb1Byb3h5Q2xlYW51cCA9CisgICAgICAgICAgICAgICAgYWRtaW4uaW5mby51c2VzUG9saWN5KERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSk7CiAgICAgICAgICAgICBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKGFkbWluLAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pblJlY2VpdmVyLkFDVElPTl9ERVZJQ0VfQURNSU5fRElTQUJMRUQpOwogICAgICAgICAgICAgLy8gWFhYIG5lZWQgdG8gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuCiAgICAgICAgICAgICBtQWRtaW5MaXN0LnJlbW92ZShhZG1pbik7CiAgICAgICAgICAgICBtQWRtaW5NYXAucmVtb3ZlKGFkbWluUmVjZWl2ZXIpOwogICAgICAgICAgICAgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCk7CisgICAgICAgICAgICBpZiAoZG9Qcm94eUNsZWFudXApIHsKKyAgICAgICAgICAgICAgICByZXNldEdsb2JhbFByb3h5KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgRGV2aWNlQWRtaW5JbmZvIGZpbmRBZG1pbihDb21wb25lbnROYW1lIGFkbWluTmFtZSkgewogICAgICAgICBJbnRlbnQgcmVzb2x2ZUludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgcmVzb2x2ZUludGVudC5zZXRDb21wb25lbnQoYWRtaW5OYW1lKTsKQEAgLTMwNSw3ICs0MzcsNyBAQAogICAgICAgICBpZiAoaW5mb3MgPT0gbnVsbCB8fCBpbmZvcy5zaXplKCkgPD0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBhZG1pbjogIiArIGFkbWluTmFtZSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRGV2aWNlQWRtaW5JbmZvKG1Db250ZXh0LCBpbmZvcy5nZXQoMCkpOwogICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKQEAgLTMxNiw3ICs0NDgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBKb3VybmFsZWRGaWxlIG1ha2VKb3VybmFsZWRGaWxlKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZSA9ICIvZGF0YS9zeXN0ZW0vZGV2aWNlX3BvbGljaWVzLnhtbCI7CiAgICAgICAgIHJldHVybiBuZXcgSm91cm5hbGVkRmlsZShuZXcgRmlsZShiYXNlKSwgbmV3IEZpbGUoYmFzZSArICIudG1wIikpOwpAQCAtMzMyLDcgKzQ2NCw3IEBACiAgICAgICAgICAgICBvdXQuc3RhcnREb2N1bWVudChudWxsLCB0cnVlKTsKIAogICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJwb2xpY2llcyIpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTM0MywyNiArNDc1LDM2IEBACiAgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImFkbWluIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwKSB7CiAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJwYXNzd29yZC1vd25lciIpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtUGFzc3dvcmRPd25lcikpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInBhc3N3b3JkLW93bmVyIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImZhaWxlZC1wYXNzd29yZC1hdHRlbXB0cyIpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cykpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImZhaWxlZC1wYXNzd29yZC1hdHRlbXB0cyIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCAhPSAwKSB7CisKKyAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZE51bWVyaWMgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyICE9IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImFjdGl2ZS1wYXNzd29yZCIpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInF1YWxpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkpKTsKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsZW5ndGgiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExlbmd0aCkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInVwcGVyY2FzZSIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibG93ZXJjYXNlIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsZXR0ZXJzIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibnVtZXJpYyIsIEludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmROdW1lcmljKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAic3ltYm9scyIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkU3ltYm9scykpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgIm5vbmxldHRlciIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiYWN0aXZlLXBhc3N3b3JkIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicG9saWNpZXMiKTsKIAogICAgICAgICAgICAgb3V0LmVuZERvY3VtZW50KCk7CkBAIC00NDAsNiArNTgyLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJxdWFsaXR5IikpOwogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibGVuZ3RoIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidXBwZXJjYXNlIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibG93ZXJjYXNlIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImxldHRlcnMiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibnVtZXJpYyIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJzeW1ib2xzIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibm9ubGV0dGVyIikpOwogICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJVbmtub3duIHRhZzogIiArIHRhZyk7CkBAIC00NzksMTAgKzYzMywxNiBAQAogICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcodXRpbHMuZ2V0QWN0aXZlUGFzc3dvcmRRdWFsaXR5KCkpKTsKICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSAwOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZhbGlkYXRlUGFzc3dvcmRPd25lckxvY2tlZCgpOwotICAgICAgICAKKwogICAgICAgICBsb25nIHRpbWVNcyA9IGdldE1heGltdW1UaW1lVG9Mb2NrKG51bGwpOwogICAgICAgICBpZiAodGltZU1zIDw9IDApIHsKICAgICAgICAgICAgIHRpbWVNcyA9IEludGVnZXIuTUFYX1ZBTFVFOwpAQCAtNTAxLDEyICs2NjEsMTMgQEAKICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUM6CiAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDOgogICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOgorICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDoKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBxdWFsaXR5IGNvbnN0YW50OiAweCIKICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocXVhbGl0eSkpOwogICAgIH0KLSAgICAKKwogICAgIHZvaWQgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCkgewogICAgICAgICBpZiAobVBhc3N3b3JkT3duZXIgPj0gMCkgewogICAgICAgICAgICAgYm9vbGVhbiBoYXZlT3duZXIgPSBmYWxzZTsKQEAgLTUyMywxNyArNjg0LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzeXN0ZW1SZWFkeSgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBsb2FkU2V0dGluZ3NMb2NrZWQoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUFkbWluKENvbXBvbmVudE5hbWUgYWRtaW5SZWNlaXZlcikgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgRGV2aWNlQWRtaW5JbmZvIGluZm8gPSBmaW5kQWRtaW4oYWRtaW5SZWNlaXZlcik7CiAgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBhZG1pbjogIiArIGFkbWluUmVjZWl2ZXIpOwpAQCAtNTU1LDEzICs3MTYsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIGlzQWRtaW5BY3RpdmUoQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgcmV0dXJuIGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpICE9IG51bGw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgTGlzdDxDb21wb25lbnROYW1lPiBnZXRBY3RpdmVBZG1pbnMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKQEAgLTU3NSw3ICs3MzYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIHBhY2thZ2VIYXNBY3RpdmVBZG1pbnMoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKQEAgLTU4Nyw3ICs3NDgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW4oQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChhZG1pblJlY2VpdmVyKTsKQEAgLTYwNiwxMCArNzY3LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSB3aG8sIGludCBxdWFsaXR5KSB7CiAgICAgICAgIHZhbGlkYXRlUXVhbGl0eUNvbnN0YW50KHF1YWxpdHkpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CkBAIC02MjIsMTYgKzc4MywxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpbnQgbW9kZSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5wYXNzd29yZFF1YWxpdHkgOiBtb2RlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC02NDIsNyArODAzLDcgQEAKICAgICAgICAgICAgIHJldHVybiBtb2RlOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CkBAIC02NTYsMTYgKzgxNywxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZW5ndGggOiBsZW5ndGg7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTY3NiwxOCArODM3LDI2NyBAQAogICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5wYXNzd29yZEhpc3RvcnlMZW5ndGggIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAucGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ucGFzc3dvcmRIaXN0b3J5TGVuZ3RoIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ucGFzc3dvcmRIaXN0b3J5TGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZExldHRlcnMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTGV0dGVycyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZExldHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkTGV0dGVyczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmROdW1lcmljICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZE51bWVyaWMgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTnVtZXJpYyA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTnVtZXJpYykgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZFN5bWJvbHMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkU3ltYm9scyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRTeW1ib2xzIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRTeW1ib2xzKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZE5vbkxldHRlcikgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLAogICAgICAgICAgICAgLy8gc28gdHJ5IHRvIHJldHJpZXZlIGl0IHRvIGNoZWNrIHRoYXQgdGhlIGNhbGxlciBpcyBvbmUuCiAgICAgICAgICAgICBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZChudWxsLAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOwotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPj0gZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpCi0gICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExlbmd0aCA+PSBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobnVsbCk7CisgICAgICAgICAgICBpZiAobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA8IGdldFBhc3N3b3JkUXVhbGl0eShudWxsKQorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPCBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobnVsbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID49IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmROdW1lcmljID49IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA+PSBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA+PSBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobnVsbCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtNjk3LDcgKzExMDcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUoQ29tcG9uZW50TmFtZSB3aG8sIGludCBudW0pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTcxMiwxNiArMTEyMiwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOwogICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUgOiBjb3VudDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtNzM1LDcgKzExNDUsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcmVzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQsIGludCBmbGFncykgewogICAgICAgICBpbnQgcXVhbGl0eTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CkBAIC03NDYsMTQgKzExNTYsMTUgQEAKICAgICAgICAgICAgIHF1YWxpdHkgPSBnZXRQYXNzd29yZFF1YWxpdHkobnVsbCk7CiAgICAgICAgICAgICBpZiAocXVhbGl0eSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQpIHsKICAgICAgICAgICAgICAgICBpbnQgcmVhbFF1YWxpdHkgPSBMb2NrUGF0dGVyblV0aWxzLmNvbXB1dGVQYXNzd29yZFF1YWxpdHkocGFzc3dvcmQpOwotICAgICAgICAgICAgICAgIGlmIChyZWFsUXVhbGl0eSA8IHF1YWxpdHkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhbFF1YWxpdHkgPCBxdWFsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBxdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBwYXNzd29yZCBxdWFsaXR5IDB4IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhxdWFsaXR5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIHF1YWxpdHkgMHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHF1YWxpdHkpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBxdWFsaXR5ID0gcmVhbFF1YWxpdHk7CisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IE1hdGgubWF4KHJlYWxRdWFsaXR5LCBxdWFsaXR5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCBsZW5ndGggPSBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobnVsbCk7CiAgICAgICAgICAgICBpZiAocGFzc3dvcmQubGVuZ3RoKCkgPCBsZW5ndGgpIHsKQEAgLTc2MSwxNCArMTE3Miw4NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbGVuZ3RoICIgKyBsZW5ndGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChxdWFsaXR5ID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKSB7CisgICAgICAgICAgICAgICAgaW50IGxldHRlcnMgPSAwOworICAgICAgICAgICAgICAgIGludCB1cHBlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgIGludCBsb3dlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgIGludCBudW1iZXJzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgc3ltYm9scyA9IDA7CisgICAgICAgICAgICAgICAgaW50IG5vbmxldHRlciA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IHBhc3N3b3JkLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9scysrOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZExldHRlcnMgPSBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpOworICAgICAgICAgICAgICAgIGlmKGxldHRlcnMgPCBuZWVkZWRMZXR0ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgbGV0dGVycyAiICsgbGV0dGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBsZXR0ZXJzICIgKyBuZWVkZWRMZXR0ZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTnVtYmVycyA9IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG51bWJlcnMgPCBuZWVkZWROdW1iZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyAiICsgbnVtYmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWROdW1iZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTG93ZXJDYXNlID0gZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChsb3dlcmNhc2UgPCBuZWVkZWRMb3dlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBsb3dlcmNhc2UgbGV0dGVycyAiICsgbG93ZXJjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIGxvd2VyY2FzZSBsZXR0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZExvd2VyQ2FzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZFVwcGVyQ2FzZSA9IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAodXBwZXJjYXNlIDwgbmVlZGVkVXBwZXJDYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgdXBwZXJjYXNlIGxldHRlcnMgIiArIHVwcGVyY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiB1cHBlcmNhc2UgbGV0dGVycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWRVcHBlckNhc2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRTeW1ib2xzID0gZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoc3ltYm9scyA8IG5lZWRlZFN5bWJvbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBzcGVjaWFsIHN5bWJvbHMgIiArIHN5bWJvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2Ygc3BlY2lhbCBzeW1ib2xzICIgKyBuZWVkZWRTeW1ib2xzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTm9uTGV0dGVyID0gZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChub25sZXR0ZXIgPCBuZWVkZWROb25MZXR0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgIiArIG5vbmxldHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkTm9uTGV0dGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9ja1BhdHRlcm5VdGlscyB1dGlscyA9IG5ldyBMb2NrUGF0dGVyblV0aWxzKG1Db250ZXh0KTsKKyAgICAgICAgICAgIGlmKHV0aWxzLmNoZWNrUGFzc3dvcmRIaXN0b3J5KHBhc3N3b3JkKSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBwYXNzd29yZCBpcyB0aGUgc2FtZSBhcyBvbmUgb2YgdGhlIGxhc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgobnVsbCkgKyAiIHBhc3N3b3JkcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwICYmIG1QYXNzd29yZE93bmVyICE9IGNhbGxpbmdVaWQpIHsKICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBhbHJlYWR5IHNldCBieSBhbm90aGVyIHVpZCBhbmQgbm90IGVudGVyZWQgYnkgdXNlciIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgd2l0aCB0aGUgbG9jayBoZWxkLCBiZWNhdXNlIGl0IGlzIGdvaW5nIHRvIGNhbGwKICAgICAgICAgLy8gYmFjayBpbiB0byB0aGUgc2VydmljZS4KICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwpAQCAtNzg2LDEwICsxMjY5LDEwIEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bVRpbWVUb0xvY2soQ29tcG9uZW50TmFtZSB3aG8sIGxvbmcgdGltZU1zKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CkBAIC03OTksMTYgKzEyODIsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0ZPUkNFX0xPQ0spOwogICAgICAgICAgICAgaWYgKGFwLm1heGltdW1UaW1lVG9VbmxvY2sgIT0gdGltZU1zKSB7CiAgICAgICAgICAgICAgICAgYXAubWF4aW11bVRpbWVUb1VubG9jayA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgdGltZU1zID0gZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lTXMgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGltZU1zID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGdldElQb3dlck1hbmFnZXIoKS5zZXRNYXhpbXVtU2NyZWVuT2ZmVGltZW91bnQoKGludCl0aW1lTXMpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpAQCAtODIwLDE2ICsxMzAzLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgbG9uZyBnZXRNYXhpbXVtVGltZVRvTG9jayhDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvbmcgdGltZSA9IDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOwogICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWF4aW11bVRpbWVUb1VubG9jayA6IHRpbWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTg0Myw3ICsxMzI2LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0aW1lOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgbG9ja05vdygpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTg2MCw3ICsxMzQzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgd2lwZURhdGFMb2NrZWQoaW50IGZsYWdzKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBSZWNvdmVyeVN5c3RlbS5yZWJvb3RXaXBlVXNlckRhdGEobUNvbnRleHQpOwpAQCAtODY4LDcgKzEzNTEsNyBAQAogICAgICAgICAgICAgU2xvZy53KFRBRywgIkZhaWxlZCByZXF1ZXN0aW5nIGRhdGEgd2lwZSIsIGUpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgd2lwZURhdGEoaW50IGZsYWdzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC04ODMsMTEgKzEzNjYsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGdldFJlbW92ZVdhcm5pbmcoQ29tcG9uZW50TmFtZSBjb21wLCBmaW5hbCBSZW1vdGVDYWxsYmFjayByZXN1bHQpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChjb21wKTsKICAgICAgICAgICAgIGlmIChhZG1pbiA9PSBudWxsKSB7CkBAIC05MTAsMjAgKzEzOTMsMzAgQEAKICAgICAgICAgICAgIH0sIG51bGwsIEFjdGl2aXR5LlJFU1VMVF9PSywgbnVsbCwgbnVsbCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCkgeworCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsCisgICAgICAgICAgICBpbnQgbG93ZXJjYXNlLCBpbnQgbnVtYmVycywgaW50IHN5bWJvbHMsIGludCBub25sZXR0ZXIpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHZhbGlkYXRlUXVhbGl0eUNvbnN0YW50KHF1YWxpdHkpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IHF1YWxpdHkgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICB8fCBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHx8IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyAhPSBsZXR0ZXJzCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSAhPSB1cHBlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlICE9IGxvd2VyY2FzZSB8fCBtQWN0aXZlUGFzc3dvcmROdW1lcmljICE9IG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyAhPSBzeW1ib2xzIHx8IG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciAhPSBub25sZXR0ZXIpIHsKICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA9IGxldHRlcnM7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IGxvd2VyY2FzZTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID0gdXBwZXJjYXNlOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gbnVtYmVyczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IHN5bWJvbHM7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IG5vbmxldHRlcjsKICAgICAgICAgICAgICAgICAgICAgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgc2VuZEFkbWluQ29tbWFuZExvY2tlZChEZXZpY2VBZG1pblJlY2VpdmVyLkFDVElPTl9QQVNTV09SRF9DSEFOR0VELApAQCAtOTM0LDExICsxNDI3LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZXBvcnRGYWlsZWRQYXNzd29yZEF0dGVtcHQoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC05NTUsMTEgKzE0NDgsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHJlcG9ydFN1Y2Nlc3NmdWxQYXNzd29yZEF0dGVtcHQoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyAhPSAwIHx8IG1QYXNzd29yZE93bmVyID49IDApIHsKICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC05NzUsNyArMTQ2OCw5NSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgc2V0R2xvYmFsUHJveHkoQ29tcG9uZW50TmFtZSB3aG8sIFN0cmluZyBwcm94eVNwZWMsCisgICAgICAgICAgICBTdHJpbmcgZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSk7CisKKyAgICAgICAgICAgIC8vIFNjYW4gdGhyb3VnaCBhY3RpdmUgYWRtaW5zIGFuZCBmaW5kIGlmIGFueW9uZSBoYXMgYWxyZWFkeQorICAgICAgICAgICAgLy8gc2V0IHRoZSBnbG9iYWwgcHJveHkuCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgU2V0PENvbXBvbmVudE5hbWU+IGNvbXBTZXQgPSBtQWRtaW5NYXAua2V5U2V0KCk7CisgICAgICAgICAgICBmb3IgIChDb21wb25lbnROYW1lIGNvbXBvbmVudCA6IGNvbXBTZXQpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IG1BZG1pbk1hcC5nZXQoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoKGFwLnNwZWNpZmllc0dsb2JhbFByb3h5KSAmJiAoIWNvbXBvbmVudC5lcXVhbHMod2hvKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQW5vdGhlciBhZG1pbiBhbHJlYWR5IHNldHMgdGhlIGdsb2JhbCBwcm94eQorICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJveHlTcGVjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZG1pbi5zcGVjaWZpZXNHbG9iYWxQcm94eSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGFkbWluLmdsb2JhbFByb3h5U3BlYyA9IG51bGw7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBhZG1pbi5zcGVjaWZpZXNHbG9iYWxQcm94eSA9IHRydWU7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlTcGVjID0gcHJveHlTcGVjOworICAgICAgICAgICAgICAgIGFkbWluLmdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCA9IGV4Y2x1c2lvbkxpc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnbG9iYWwgcHJveHkgYWNjb3JkaW5nbHkKKyAgICAgICAgICAgIC8vIERvIHRoaXMgdXNpbmcgc3lzdGVtIHBlcm1pc3Npb25zLCBhcyBhcHBzIGNhbm5vdCB3cml0ZSB0byBzZWN1cmUgc2V0dGluZ3MKKyAgICAgICAgICAgIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICByZXNldEdsb2JhbFByb3h5KCk7CisgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvcmlnSWQpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRHbG9iYWxQcm94eUFkbWluKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgLy8gU2NhbiB0aHJvdWdoIGFjdGl2ZSBhZG1pbnMgYW5kIGZpbmQgaWYgYW55b25lIGhhcyBhbHJlYWR5CisgICAgICAgICAgICAvLyBzZXQgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGFwLnNwZWNpZmllc0dsb2JhbFByb3h5KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERldmljZSBhZG1pbiBzZXRzIHRoZSBnbG9iYWwgcHJveHkKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcC5pbmZvLmdldENvbXBvbmVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBObyBkZXZpY2UgYWRtaW4gc2V0cyB0aGUgZ2xvYmFsIHByb3h5LgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRHbG9iYWxQcm94eSgpIHsKKyAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICBpZiAoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpIHsKKyAgICAgICAgICAgICAgICBzYXZlR2xvYmFsUHJveHkoYXAuZ2xvYmFsUHJveHlTcGVjLCBhcC5nbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBObyBkZXZpY2UgYWRtaW5zIGRlZmluaW5nIGdsb2JhbCBwcm94aWVzIC0gcmVzZXQgZ2xvYmFsIHByb3h5IHNldHRpbmdzIHRvIG5vbmUKKyAgICAgICAgc2F2ZUdsb2JhbFByb3h5KG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzYXZlR2xvYmFsUHJveHkoU3RyaW5nIHByb3h5U3BlYywgU3RyaW5nIGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgaWYgKGV4Y2x1c2lvbkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgZXhjbHVzaW9uTGlzdCA9ICIiOworICAgICAgICB9CisgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJveHlTcGVjID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVtb3ZlIHdoaXRlIHNwYWNlcworICAgICAgICBwcm94eVNwZWMgPSBwcm94eVNwZWMudHJpbSgpOworICAgICAgICBleGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdC50cmltKCk7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciByZXMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyZXMsIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZLCBwcm94eVNwZWMpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHJlcywgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFlfRVhDTFVTSU9OX0xJU1QsIGV4Y2x1c2lvbkxpc3QpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQpAQCAtOTg2LDEyICsxNTY3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBmaW5hbCBQcmludGVyIHAgPSBuZXcgUHJpbnRXcml0ZXJQcmludGVyKHB3KTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBwLnByaW50bG4oIkN1cnJlbnQgRGV2aWNlIFBvbGljeSBNYW5hZ2VyIHN0YXRlOiIpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHAucHJpbnRsbigiICBFbmFibGVkIERldmljZSBBZG1pbnM6Iik7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewpAQCAtMTAwMiwxMSArMTU4MywxNyBAQAogICAgICAgICAgICAgICAgICAgICBhcC5kdW1wKCIgICAgIiwgcHcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIik7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5PTB4Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oSW50ZWdlci50b0hleFN0cmluZyhtQWN0aXZlUGFzc3dvcmRRdWFsaXR5KSk7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRMZW5ndGg9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZT0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExldHRlcnMpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYz0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmROdW1lcmljKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZFN5bWJvbHM9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkU3ltYm9scyk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXI9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyKTsKICAgICAgICAgICAgIHB3LnByaW50KCIgIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzPSIpOyBwdy5wcmludGxuKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzKTsKICAgICAgICAgICAgIHB3LnByaW50KCIgIG1QYXNzd29yZE93bmVyPSIpOyBwdy5wcmludGxuKG1QYXNzd29yZE93bmVyKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNYW5hZ2VyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1hbmFnZXIuamF2YQppbmRleCAyOWNhOWE0Li5mZTMwNmIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1hbmFnZXIuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1hbmFnZXIuamF2YQpAQCAtNzcsNiArNzcsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBJbnB1dERldmljZSBuYXRpdmVHZXRJbnB1dERldmljZShpbnQgZGV2aWNlSWQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUdldElucHV0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnRbXSBuYXRpdmVHZXRJbnB1dERldmljZUlkcygpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVRyYW5zZmVyVG91Y2hGb2N1cyhJbnB1dENoYW5uZWwgZnJvbUNoYW5uZWwsCisgICAgICAgICAgICBJbnB1dENoYW5uZWwgdG9DaGFubmVsKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIG5hdGl2ZUR1bXAoKTsKICAgICAKICAgICAvLyBJbnB1dCBldmVudCBpbmplY3Rpb24gY29uc3RhbnRzIGRlZmluZWQgaW4gSW5wdXREaXNwYXRjaGVyLmguCkBAIC0zMjAsNiArMzIyLDI5IEBACiAgICAgICAgIG5hdGl2ZVNldElucHV0RGlzcGF0Y2hNb2RlKGVuYWJsZWQsIGZyb3plbik7CiAgICAgfQogICAgIAorICAgIC8qKgorICAgICAqIEF0b21pY2FsbHkgdHJhbnNmZXJzIHRvdWNoIGZvY3VzIGZyb20gb25lIHdpbmRvdyB0byBhbm90aGVyIGFzIGlkZW50aWZpZWQgYnkKKyAgICAgKiB0aGVpciBpbnB1dCBjaGFubmVscy4gIEl0IGlzIHBvc3NpYmxlIGZvciBtdWx0aXBsZSB3aW5kb3dzIHRvIGhhdmUKKyAgICAgKiB0b3VjaCBmb2N1cyBpZiB0aGV5IHN1cHBvcnQgc3BsaXQgdG91Y2ggZGlzcGF0Y2gKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI0ZMQUdfU1BMSVRfVE9VQ0h9IGJ1dCB0aGlzCisgICAgICogbWV0aG9kIG9ubHkgdHJhbnNmZXJzIHRvdWNoIGZvY3VzIG9mIHRoZSBzcGVjaWZpZWQgd2luZG93IHdpdGhvdXQgYWZmZWN0aW5nCisgICAgICogb3RoZXIgd2luZG93cyB0aGF0IG1heSBhbHNvIGhhdmUgdG91Y2ggZm9jdXMgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgKiBAcGFyYW0gZnJvbUNoYW5uZWwgVGhlIGNoYW5uZWwgb2YgYSB3aW5kb3cgdGhhdCBjdXJyZW50bHkgaGFzIHRvdWNoIGZvY3VzLgorICAgICAqIEBwYXJhbSB0b0NoYW5uZWwgVGhlIGNoYW5uZWwgb2YgdGhlIHdpbmRvdyB0aGF0IHNob3VsZCByZWNlaXZlIHRvdWNoIGZvY3VzIGluCisgICAgICogcGxhY2Ugb2YgdGhlIGZpcnN0LgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwuICBGYWxzZSBpZiB0aGUgd2luZG93IHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIGNoYW5uZWwgZGlkIG5vdCBhY3R1YWxseSBoYXZlIHRvdWNoIGZvY3VzIGF0IHRoZSB0aW1lIG9mIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHRyYW5zZmVyVG91Y2hGb2N1cyhJbnB1dENoYW5uZWwgZnJvbUNoYW5uZWwsIElucHV0Q2hhbm5lbCB0b0NoYW5uZWwpIHsKKyAgICAgICAgaWYgKGZyb21DaGFubmVsID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZyb21DaGFubmVsIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvQ2hhbm5lbCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0b0NoYW5uZWwgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmF0aXZlVHJhbnNmZXJUb3VjaEZvY3VzKGZyb21DaGFubmVsLCB0b0NoYW5uZWwpOworICAgIH0KKyAgICAKICAgICBwdWJsaWMgdm9pZCBkdW1wKFByaW50V3JpdGVyIHB3KSB7CiAgICAgICAgIFN0cmluZyBkdW1wU3RyID0gbmF0aXZlRHVtcCgpOwogICAgICAgICBpZiAoZHVtcFN0ciAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZWNhZDNjYy4uNzBiZGUwMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZFNlc3Npb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JbnB1dEJpbmRSZXN1bHQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JbnB1dE1ldGhvZEFuZFN1YnR5cGVFbmFibGVyOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLlN0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlOwogCkBAIC02MSwxOCArNjIsMjEgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50V3JpdGVyUHJpbnRlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJpbnRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0QmluZGluZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kSW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC04MCw2ICs4NCw3IEBACiBpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKQEAgLTkzLDYgKzk4LDggQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJJbnB1dE1hbmFnZXJTZXJ2aWNlIjsKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NIT1dfSU1fUElDS0VSID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19TSE9XX0lNX1NVQlRZUEVfUElDS0VSID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19TSE9XX0lNX1NVQlRZUEVfRU5BQkxFUiA9IDM7CiAKICAgICBzdGF0aWMgZmluYWwgaW50IE1TR19VTkJJTkRfSU5QVVQgPSAxMDAwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0JJTkRfSU5QVVQgPSAxMDEwOwpAQCAtMTA5LDggKzExNiwxMSBAQAogCiAgICAgc3RhdGljIGZpbmFsIGxvbmcgVElNRV9UT19SRUNPTk5FQ1QgPSAxMCoxMDAwOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9BX1NVQlRZUEVfSUQgPSAtMTsKKwogICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICAgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBmaW5hbCBJbnB1dE1ldGhvZFNldHRpbmdzIG1TZXR0aW5nczsKICAgICBmaW5hbCBTZXR0aW5nc09ic2VydmVyIG1TZXR0aW5nc09ic2VydmVyOwogICAgIGZpbmFsIFN0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlIG1TdGF0dXNCYXI7CiAgICAgZmluYWwgSVdpbmRvd01hbmFnZXIgbUlXaW5kb3dNYW5hZ2VyOwpAQCAtMTIwLDEzICsxMzAsOCBAQAogCiAgICAgLy8gQWxsIGtub3duIGlucHV0IG1ldGhvZHMuICBtTWV0aG9kTWFwIGFsc28gc2VydmVzIGFzIHRoZSBnbG9iYWwKICAgICAvLyBsb2NrIGZvciB0aGlzIGNsYXNzLgotICAgIGZpbmFsIEFycmF5TGlzdDxJbnB1dE1ldGhvZEluZm8+IG1NZXRob2RMaXN0Ci0gICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8SW5wdXRNZXRob2RJbmZvPigpOwotICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbnB1dE1ldGhvZEluZm8+IG1NZXRob2RNYXAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnB1dE1ldGhvZEluZm8+KCk7Ci0KLSAgICBmaW5hbCBUZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXIgbVN0cmluZ0NvbG9uU3BsaXR0ZXIKLSAgICAgICAgICAgID0gbmV3IFRleHRVdGlscy5TaW1wbGVTdHJpbmdTcGxpdHRlcignOicpOworICAgIGZpbmFsIEFycmF5TGlzdDxJbnB1dE1ldGhvZEluZm8+IG1NZXRob2RMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnB1dE1ldGhvZEluZm8+KCk7CisgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIElucHV0TWV0aG9kSW5mbz4gbU1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW5wdXRNZXRob2RJbmZvPigpOwogCiAgICAgY2xhc3MgU2Vzc2lvblN0YXRlIHsKICAgICAgICAgZmluYWwgQ2xpZW50U3RhdGUgY2xpZW50OwpAQCAtMjI0LDYgKzIyOSwxMiBAQAogICAgIFN0cmluZyBtQ3VySWQ7CiAKICAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBzdWJ0eXBlIG9mIHRoZSBjdXJyZW50IGlucHV0IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIElucHV0TWV0aG9kU3VidHlwZSBtQ3VycmVudFN1YnR5cGU7CisKKworICAgIC8qKgogICAgICAqIFNldCB0byB0cnVlIGlmIG91ciBTZXJ2aWNlQ29ubmVjdGlvbiBpcyBjdXJyZW50bHkgYWN0aXZlbHkgYm91bmQgdG8KICAgICAgKiBhIHNlcnZpY2UgKHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgZ290dGVuIGl0cyBJQmluZGVyIGJhY2sgeWV0KS4KICAgICAgKi8KQEAgLTI5Miw2ICszMDMsNyBAQAogICAgIEFsZXJ0RGlhbG9nIG1Td2l0Y2hpbmdEaWFsb2c7CiAgICAgSW5wdXRNZXRob2RJbmZvW10gbUltczsKICAgICBDaGFyU2VxdWVuY2VbXSBtSXRlbXM7CisgICAgaW50W10gbVN1YnR5cGVJZHM7CiAKICAgICBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKICAgICAgICAgU2V0dGluZ3NPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKQEAgLTI5OSw2ICszMTEsOCBAQAogICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CiAgICAgICAgICAgICByZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpLCBmYWxzZSwgdGhpcyk7CisgICAgICAgICAgICByZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuU0VMRUNURURfSU5QVVRfTUVUSE9EX1NVQlRZUEUpLCBmYWxzZSwgdGhpcyk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CkBAIC0zNTEsOSArMzY1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9pdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0U2VsZWN0ZWRJbnB1dE1ldGhvZFN1YnR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZU5ld0RlZmF1bHRJTUVMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC00MDksMTYgKzQyMywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hvb3NlTmV3RGVmYXVsdElNRUxvY2tlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJJbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cklucHV0TWV0aG9kSWQgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlVuc2V0dGluZyBjdXJyZW50IGlucHV0IG1ldGhvZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJJbnB1dE1ldGhvZElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRTZWxlY3RlZElucHV0TWV0aG9kU3VidHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIGlmIChjdXJJbSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGN1cnJlbnRseSBkb24ndCBoYXZlIGEgZGVmYXVsdCBpbnB1dCBtZXRob2QuLi4gaXMKICAgICAgICAgICAgICAgICAgICAgLy8gb25lIG5vdyBhdmFpbGFibGU/CkBAIC00NjksMjcgKzQ4MiwxOCBAQAogICAgICAgICBtU3RhdHVzQmFyID0gc3RhdHVzQmFyOwogICAgICAgICBzdGF0dXNCYXIuc2V0SWNvblZpc2liaWxpdHkoImltZSIsIGZhbHNlKTsKIAorICAgICAgICAvLyBtU2V0dGluZ3Mgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGJ1aWxkSW5wdXRNZXRob2RMaXN0TG9ja2VkCisgICAgICAgIG1TZXR0aW5ncyA9IG5ldyBJbnB1dE1ldGhvZFNldHRpbmdzKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIG1NZXRob2RNYXAsIG1NZXRob2RMaXN0KTsKICAgICAgICAgYnVpbGRJbnB1dE1ldGhvZExpc3RMb2NrZWQobU1ldGhvZExpc3QsIG1NZXRob2RNYXApOworICAgICAgICBtU2V0dGluZ3MuZW5hYmxlQWxsSU1Fc0lmVGhlcmVJc05vRW5hYmxlZElNRSgpOwogCi0gICAgICAgIGZpbmFsIFN0cmluZyBlbmFibGVkU3RyID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9JTlBVVF9NRVRIT0RTKTsKLSAgICAgICAgU2xvZy5pKFRBRywgIkVuYWJsZWQgaW5wdXQgbWV0aG9kczogIiArIGVuYWJsZWRTdHIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdEltZSA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcobUNvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0Q29udGVudFJlc29sdmVyKCksIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCk7Ci0gICAgICAgIGlmIChlbmFibGVkU3RyID09IG51bGwgfHwgVGV4dFV0aWxzLmlzRW1wdHkoZGVmYXVsdEltZSkpIHsKLSAgICAgICAgICAgIFNsb2cuaShUQUcsICJFbmFibGVkIGlucHV0IG1ldGhvZHMgb3IgZGVmYXVsdCBJTUUgaGFzIG5vdCBiZWVuIHNldCwgZW5hYmxpbmcgYWxsIik7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpKSkgewogICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGRlZkltID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyNTYpOwotICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWV0aG9kTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGltaSA9IG1NZXRob2RMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiQWRkaW5nOiAiICsgaW1pLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGltaS5nZXRJZCgpKTsKKyAgICAgICAgICAgIGZvciAoSW5wdXRNZXRob2RJbmZvIGltaTogbU1ldGhvZExpc3QpIHsKICAgICAgICAgICAgICAgICBpZiAoZGVmSW0gPT0gbnVsbCAmJiBpbWkuZ2V0SXNEZWZhdWx0UmVzb3VyY2VJZCgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXMgPSBtQ29udGV4dC5jcmVhdGVQYWNrYWdlQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmNyZWF0ZVBhY2thZ2VDb250ZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWkuZ2V0UGFja2FnZU5hbWUoKSwgMCkuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmdldEJvb2xlYW4oaW1pLmdldElzRGVmYXVsdFJlc291cmNlSWQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZJbSA9IGltaTsKQEAgLTUwMCwxNSArNTA0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVmSW0gPT0gbnVsbCAmJiBOID4gMCkgeworICAgICAgICAgICAgaWYgKGRlZkltID09IG51bGwgJiYgbU1ldGhvZExpc3Quc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgICAgIGRlZkltID0gbU1ldGhvZExpc3QuZ2V0KDApOwogICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJObyBkZWZhdWx0IGZvdW5kLCB1c2luZyAiICsgZGVmSW0uZ2V0SWQoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9JTlBVVF9NRVRIT0RTLCBzYi50b1N0cmluZygpKTsKICAgICAgICAgICAgIGlmIChkZWZJbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCwgZGVmSW0uZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcHV0U2VsZWN0ZWRJbnB1dE1ldGhvZFN1YnR5cGUoZGVmSW0sIE5PVF9BX1NVQlRZUEVfSUQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTU1MiwzMSArNTU1LDEwIEBACiAKICAgICBwdWJsaWMgTGlzdDxJbnB1dE1ldGhvZEluZm8+IGdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3QoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgewotICAgICAgICAgICAgcmV0dXJuIGdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3RMb2NrZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBtU2V0dGluZ3MuZ2V0RW5hYmxlZElucHV0TWV0aG9kTGlzdExvY2tlZCgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgTGlzdDxJbnB1dE1ldGhvZEluZm8+IGdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3RMb2NrZWQoKSB7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxJbnB1dE1ldGhvZEluZm8+IHJlcyA9IG5ldyBBcnJheUxpc3Q8SW5wdXRNZXRob2RJbmZvPigpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBlbmFibGVkU3RyID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9JTlBVVF9NRVRIT0RTKTsKLSAgICAgICAgaWYgKGVuYWJsZWRTdHIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgVGV4dFV0aWxzLlNpbXBsZVN0cmluZ1NwbGl0dGVyIHNwbGl0dGVyID0gbVN0cmluZ0NvbG9uU3BsaXR0ZXI7Ci0gICAgICAgICAgICBzcGxpdHRlci5zZXRTdHJpbmcoZW5hYmxlZFN0cik7Ci0KLSAgICAgICAgICAgIHdoaWxlIChzcGxpdHRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZEluZm8gaW5mbyA9IG1NZXRob2RNYXAuZ2V0KHNwbGl0dGVyLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXMuYWRkKGluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgYWRkQ2xpZW50KElJbnB1dE1ldGhvZENsaWVudCBjbGllbnQsCiAgICAgICAgICAgICBJSW5wdXRDb250ZXh0IGlucHV0Q29udGV4dCwgaW50IHVpZCwgaW50IHBpZCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKQEAgLTk2NSwxMCArOTQ3LDEwIEBACiAgICAgICAgIC8vIHN5bmMsIHNvIHdlIHdpbGwgbmV2ZXIgaGF2ZSBhIERFRkFVTFRfSU5QVVRfTUVUSE9EIHRoYXQgaXMgbm90CiAgICAgICAgIC8vIGVuYWJsZWQuCiAgICAgICAgIFN0cmluZyBpZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpOworICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCk7CiAgICAgICAgIGlmIChpZCAhPSBudWxsICYmIGlkLmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXRJbnB1dE1ldGhvZExvY2tlZChpZCk7CisgICAgICAgICAgICAgICAgc2V0SW5wdXRNZXRob2RMb2NrZWQoaWQsIGdldFNlbGVjdGVkSW5wdXRNZXRob2RTdWJ0eXBlSWQoaWQpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gaW5wdXQgbWV0aG9kIGZyb20gcHJlZnM6ICIgKyBpZCwgZSk7CiAgICAgICAgICAgICAgICAgbUN1ck1ldGhvZElkID0gbnVsbDsKQEAgLTk4MSwyMSArOTYzLDQ0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHNldElucHV0TWV0aG9kTG9ja2VkKFN0cmluZyBpZCkgeworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRJbnB1dE1ldGhvZExvY2tlZChTdHJpbmcgaWQsIGludCBzdWJ0eXBlSWQpIHsKICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGluZm8gPSBtTWV0aG9kTWFwLmdldChpZCk7CiAgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gaWQ6ICIgKyBpZCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaWQuZXF1YWxzKG1DdXJNZXRob2RJZCkpIHsKKyAgICAgICAgICAgIGlmIChzdWJ0eXBlSWQgIT0gTk9UX0FfU1VCVFlQRV9JRCkgeworICAgICAgICAgICAgICAgIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlID0gaW5mby5nZXRTdWJ0eXBlcygpLmdldChzdWJ0eXBlSWQpOworICAgICAgICAgICAgICAgIGlmIChzdWJ0eXBlICE9IG1DdXJyZW50U3VidHlwZSkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VyTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRTZWxlY3RlZElucHV0TWV0aG9kU3VidHlwZShpbmZvLCBzdWJ0eXBlSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyTWV0aG9kLmNoYW5nZUlucHV0TWV0aG9kU3VidHlwZShzdWJ0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUN1ck1ldGhvZElkID0gaWQ7CisgICAgICAgICAgICAvLyBTZXQgYSBzdWJ0eXBlIHRvIHRoaXMgaW5wdXQgbWV0aG9kLgorICAgICAgICAgICAgLy8gc3VidHlwZUlkIHRoZSBuYW1lIG9mIGEgc3VidHlwZSB3aGljaCB3aWxsIGJlIHNldC4KKyAgICAgICAgICAgIGlmIChwdXRTZWxlY3RlZElucHV0TWV0aG9kU3VidHlwZShpbmZvLCBzdWJ0eXBlSWQpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTdWJ0eXBlID0gaW5mby5nZXRTdWJ0eXBlcygpLmdldChzdWJ0eXBlSWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFN1YnR5cGUgPSBudWxsOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCwgaWQpOworICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QsIGlkKTsKIAogICAgICAgICAgICAgaWYgKEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHsKICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX0lOUFVUX01FVEhPRF9DSEFOR0VEKTsKQEAgLTEyMjMsNyArMTIyOCw3IEBACiAgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgewogICAgICAgICAgICAgaWYgKG1DdXJDbGllbnQgPT0gbnVsbCB8fCBjbGllbnQgPT0gbnVsbAogICAgICAgICAgICAgICAgICAgICB8fCBtQ3VyQ2xpZW50LmNsaWVudC5hc0JpbmRlcigpICE9IGNsaWVudC5hc0JpbmRlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklnbm9yaW5nIHNob3dJbnB1dE1ldGhvZERpYWxvZ0Zyb21DbGllbnQgb2YgdWlkICIKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiSWdub3Jpbmcgc2hvd0lucHV0TWV0aG9kUGlja2VyRnJvbUNsaWVudCBvZiB1aWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpICsgIjogIiArIGNsaWVudCk7CiAgICAgICAgICAgICB9CiAKQEAgLTEyMzEsNyArMTIzNiwzNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2hvd0lucHV0TWV0aG9kU3VidHlwZVBpY2tlckZyb21DbGllbnQoSUlucHV0TWV0aG9kQ2xpZW50IGNsaWVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKKyAgICAgICAgICAgIGlmIChtQ3VyQ2xpZW50ID09IG51bGwgfHwgY2xpZW50ID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgbUN1ckNsaWVudC5jbGllbnQuYXNCaW5kZXIoKSAhPSBjbGllbnQuYXNCaW5kZXIoKSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJJZ25vcmluZyBzaG93SW5wdXRNZXRob2RTdWJ0eXBlUGlja2VyRnJvbUNsaWVudCBvZjogIiArIGNsaWVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1NIT1dfSU1fU1VCVFlQRV9QSUNLRVIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvd0lucHV0TWV0aG9kQW5kU3VidHlwZUVuYWJsZXJGcm9tQ2xpZW50KAorICAgICAgICAgICAgSUlucHV0TWV0aG9kQ2xpZW50IGNsaWVudCwgU3RyaW5nIHRvcElkKSB7CisgICAgICAgIC8vIFRPRE86IEhhbmRsZSB0b3BJZCBmb3Igc2V0dGluZyB0aGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBsaXN0IGFjdGl2aXR5CisgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgeworICAgICAgICAgICAgaWYgKG1DdXJDbGllbnQgPT0gbnVsbCB8fCBjbGllbnQgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICB8fCBtQ3VyQ2xpZW50LmNsaWVudC5hc0JpbmRlcigpICE9IGNsaWVudC5hc0JpbmRlcigpKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklnbm9yaW5nIHNob3dJbnB1dE1ldGhvZEFuZFN1YnR5cGVFbmFibGVyRnJvbUNsaWVudCBvZjogIiArIGNsaWVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1NIT1dfSU1fU1VCVFlQRV9FTkFCTEVSKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHNldElucHV0TWV0aG9kKElCaW5kZXIgdG9rZW4sIFN0cmluZyBpZCkgeworICAgICAgICBzZXRJbnB1dE1ldGhvZFdpdGhTdWJ0eXBlKHRva2VuLCBpZCwgTk9UX0FfU1VCVFlQRV9JRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldElucHV0TWV0aG9kV2l0aFN1YnR5cGUoSUJpbmRlciB0b2tlbiwgU3RyaW5nIGlkLCBpbnQgc3VidHlwZUlkKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgewogICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKQEAgLTEyNDksNyArMTI4Miw3IEBACiAKICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2V0SW5wdXRNZXRob2RMb2NrZWQoaWQpOworICAgICAgICAgICAgICAgIHNldElucHV0TWV0aG9kTG9ja2VkKGlkLCBzdWJ0eXBlSWQpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CiAgICAgICAgICAgICB9CkBAIC0xMzE1LDYgKzEzNDgsMTQgQEAKICAgICAgICAgICAgICAgICBzaG93SW5wdXRNZXRob2RNZW51KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKKyAgICAgICAgICAgIGNhc2UgTVNHX1NIT1dfSU1fU1VCVFlQRV9QSUNLRVI6CisgICAgICAgICAgICAgICAgc2hvd0lucHV0TWV0aG9kU3VidHlwZU1lbnUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgY2FzZSBNU0dfU0hPV19JTV9TVUJUWVBFX0VOQUJMRVI6CisgICAgICAgICAgICAgICAgc2hvd0lucHV0TWV0aG9kQW5kU3VidHlwZUVuYWJsZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKwogICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICAgICAgICAgIGNhc2UgTVNHX1VOQklORF9JTlBVVDoKQEAgLTE0MTQsNyArMTQ1NSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNob29zZU5ld0RlZmF1bHRJTUVMb2NrZWQoKSB7Ci0gICAgICAgIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBlbmFibGVkID0gZ2V0RW5hYmxlZElucHV0TWV0aG9kTGlzdExvY2tlZCgpOworICAgICAgICBMaXN0PElucHV0TWV0aG9kSW5mbz4gZW5hYmxlZCA9IG1TZXR0aW5ncy5nZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0TG9ja2VkKCk7CiAgICAgICAgIGlmIChlbmFibGVkICE9IG51bGwgJiYgZW5hYmxlZC5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAvLyBXZSdkIHByZWZlciB0byBmYWxsIGJhY2sgb24gYSBzeXN0ZW0gSU1FLCBzaW5jZSB0aGF0IGlzIHNhZmVyLgogICAgICAgICAgICAgaW50IGk9ZW5hYmxlZC5zaXplKCk7CkBAIC0xNDI1LDkgKzE0NjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGltaSA9IGVuYWJsZWQuZ2V0KGkpOwogICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9ELAotICAgICAgICAgICAgICAgICAgICBlbmFibGVkLmdldChpKS5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9ELCBpbWkuZ2V0SWQoKSk7CisgICAgICAgICAgICBwdXRTZWxlY3RlZElucHV0TWV0aG9kU3VidHlwZShpbWksIE5PVF9BX1NVQlRZUEVfSUQpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIApAQCAtMTQ5OCw3ICsxNTQwLDIzIEBACiAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICB2b2lkIHNob3dJbnB1dE1ldGhvZE1lbnUoKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNob3dJbnB1dE1ldGhvZE1lbnUoKSB7CisgICAgICAgIHNob3dJbnB1dE1ldGhvZE1lbnVJbnRlcm5hbChmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNob3dJbnB1dE1ldGhvZFN1YnR5cGVNZW51KCkgeworICAgICAgICBzaG93SW5wdXRNZXRob2RNZW51SW50ZXJuYWwodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNob3dJbnB1dE1ldGhvZEFuZFN1YnR5cGVFbmFibGVyKCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJhbmRyb2lkIiwgSW5wdXRNZXRob2RBbmRTdWJ0eXBlRW5hYmxlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEKTsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaG93SW5wdXRNZXRob2RNZW51SW50ZXJuYWwoYm9vbGVhbiBzaG93U3VidHlwZXMpIHsKICAgICAgICAgaWYgKERFQlVHKSBTbG9nLnYoVEFHLCAiU2hvdyBzd2l0Y2hpbmcgbWVudSIpOwogCiAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1Db250ZXh0OwpAQCAtMTUwNyw0OCArMTU2NSw5MSBAQAogCiAgICAgICAgIFN0cmluZyBsYXN0SW5wdXRNZXRob2RJZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoY29udGV4dAogICAgICAgICAgICAgICAgIC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKTsKKyAgICAgICAgaW50IGxhc3RJbnB1dE1ldGhvZFN1YnR5cGVJZCA9IGdldFNlbGVjdGVkSW5wdXRNZXRob2RTdWJ0eXBlSWQobGFzdElucHV0TWV0aG9kSWQpOwogICAgICAgICBpZiAoREVCVUcpIFNsb2cudihUQUcsICJDdXJyZW50IElNRTogIiArIGxhc3RJbnB1dE1ldGhvZElkKTsKIAotICAgICAgICBmaW5hbCBMaXN0PElucHV0TWV0aG9kSW5mbz4gaW1taXMgPSBnZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0KCk7Ci0KLSAgICAgICAgaWYgKGltbWlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgc3luY2hyb25pemVkIChtTWV0aG9kTWFwKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFBhaXI8SW5wdXRNZXRob2RJbmZvLCBBcnJheUxpc3Q8U3RyaW5nPj4+IGltbWlzID0KKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzLmdldEVuYWJsZWRJbnB1dE1ldGhvZEFuZFN1YnR5cGVMaXN0TG9ja2VkKCk7CisgICAgICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3VidHlwZUlkcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKworICAgICAgICAgICAgaWYgKGltbWlzID09IG51bGwgfHwgaW1taXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGhpZGVJbnB1dE1ldGhvZE1lbnVMb2NrZWQoKTsKIAogICAgICAgICAgICAgaW50IE4gPSBpbW1pcy5zaXplKCk7CiAKLSAgICAgICAgICAgIGZpbmFsIE1hcDxDaGFyU2VxdWVuY2UsIElucHV0TWV0aG9kSW5mbz4gaW1NYXAgPQotICAgICAgICAgICAgICAgIG5ldyBUcmVlTWFwPENoYXJTZXF1ZW5jZSwgSW5wdXRNZXRob2RJbmZvPihDb2xsYXRvci5nZXRJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxDaGFyU2VxdWVuY2UsIFBhaXI8SW5wdXRNZXRob2RJbmZvLCBJbnRlZ2VyPj4gaW1NYXAgPQorICAgICAgICAgICAgICAgIG5ldyBUcmVlTWFwPENoYXJTZXF1ZW5jZSwgUGFpcjxJbnB1dE1ldGhvZEluZm8sIEludGVnZXI+PihDb2xsYXRvci5nZXRJbnN0YW5jZSgpKTsKIAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKLSAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZEluZm8gcHJvcGVydHkgPSBpbW1pcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIHByb3BlcnR5ID0gaW1taXMuZ2V0KGkpLmZpcnN0OworICAgICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IGVuYWJsZWRTdWJ0eXBlSWRzID0gaW1taXMuZ2V0KGkpLnNlY29uZDsKKyAgICAgICAgICAgICAgICBIYXNoU2V0PFN0cmluZz4gZW5hYmxlZFN1YnR5cGVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IGVuYWJsZWRTdWJ0eXBlSWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRTdWJ0eXBlU2V0LmFkZChzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGltTWFwLnB1dChwcm9wZXJ0eS5sb2FkTGFiZWwocG0pLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElucHV0TWV0aG9kU3VidHlwZT4gc3VidHlwZXMgPSBwcm9wZXJ0eS5nZXRTdWJ0eXBlcygpOworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBsYWJlbCA9IHByb3BlcnR5LmxvYWRMYWJlbChwbSk7CisgICAgICAgICAgICAgICAgaWYgKHNob3dTdWJ0eXBlcyAmJiBlbmFibGVkU3VidHlwZVNldC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3VidHlwZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlID0gc3VidHlwZXMuZ2V0KGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWRTdWJ0eXBlU2V0LmNvbnRhaW5zKFN0cmluZy52YWx1ZU9mKHN1YnR5cGUuaGFzaENvZGUoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYW1lUmVzSWQgPSBzdWJ0eXBlLmdldE5hbWVSZXNJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlUmVzSWQgPSBzdWJ0eXBlLmdldE1vZGVSZXNJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lUmVzSWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHBtLmdldFRleHQocHJvcGVydHkuZ2V0UGFja2FnZU5hbWUoKSwgbmFtZVJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldFNlcnZpY2VJbmZvKCkuYXBwbGljYXRpb25JbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbGFuZ3VhZ2UgPSBzdWJ0eXBlLmdldExvY2FsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbW9kZSA9IG1vZGVSZXNJZCA9PSAwID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcG0uZ2V0VGV4dChwcm9wZXJ0eS5nZXRQYWNrYWdlTmFtZSgpLCBtb2RlUmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRTZXJ2aWNlSW5mbygpLmFwcGxpY2F0aW9uSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzZSBtb3JlIGZyaWVuZGx5IFRpdGxlIGFuZCBVSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IGxhYmVsICsgIiwiICsgKG1vZGUgPT0gbnVsbCA/ICIiIDogbW9kZSkgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChsYW5ndWFnZSA9PSBudWxsID8gIiIgOiBsYW5ndWFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltTWFwLnB1dCh0aXRsZSwgbmV3IFBhaXI8SW5wdXRNZXRob2RJbmZvLCBJbnRlZ2VyPihwcm9wZXJ0eSwgaikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW1NYXAucHV0KGxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYWlyPElucHV0TWV0aG9kSW5mbywgSW50ZWdlcj4ocHJvcGVydHksIE5PVF9BX1NVQlRZUEVfSUQpKTsKKyAgICAgICAgICAgICAgICAgICAgc3VidHlwZUlkcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBOID0gaW1NYXAuc2l6ZSgpOwogICAgICAgICAgICAgbUl0ZW1zID0gaW1NYXAua2V5U2V0KCkudG9BcnJheShuZXcgQ2hhclNlcXVlbmNlW05dKTsKLSAgICAgICAgICAgIG1JbXMgPSBpbU1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBJbnB1dE1ldGhvZEluZm9bTl0pOwotCisgICAgICAgICAgICBtSW1zID0gbmV3IElucHV0TWV0aG9kSW5mb1tOXTsKKyAgICAgICAgICAgIG1TdWJ0eXBlSWRzID0gbmV3IGludFtOXTsKICAgICAgICAgICAgIGludCBjaGVja2VkSXRlbSA9IDA7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47ICsraSkgeworICAgICAgICAgICAgICAgIFBhaXI8SW5wdXRNZXRob2RJbmZvLCBJbnRlZ2VyPiB2YWx1ZSA9IGltTWFwLmdldChtSXRlbXNbaV0pOworICAgICAgICAgICAgICAgIG1JbXNbaV0gPSB2YWx1ZS5maXJzdDsKKyAgICAgICAgICAgICAgICBtU3VidHlwZUlkc1tpXSA9IHZhbHVlLnNlY29uZDsKICAgICAgICAgICAgICAgICBpZiAobUltc1tpXS5nZXRJZCgpLmVxdWFscyhsYXN0SW5wdXRNZXRob2RJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tlZEl0ZW0gPSBpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN1YnR5cGVJZCA9IG1TdWJ0eXBlSWRzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHN1YnR5cGVJZCA9PSBOT1RfQV9TVUJUWVBFX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXN0SW5wdXRNZXRob2RTdWJ0eXBlSWQgPT0gTk9UX0FfU1VCVFlQRV9JRCAmJiBzdWJ0eXBlSWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3VidHlwZUlkID09IGxhc3RJbnB1dE1ldGhvZFN1YnR5cGVJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRJdGVtID0gaTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAKKwogICAgICAgICAgICAgQWxlcnREaWFsb2cuT25DbGlja0xpc3RlbmVyIGFkb2NsID0gbmV3IEFsZXJ0RGlhbG9nLk9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewogICAgICAgICAgICAgICAgICAgICBoaWRlSW5wdXRNZXRob2RNZW51KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKLSAgICAKKwogICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKG51bGwsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkRpYWxvZ1ByZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hbGVydERpYWxvZ1N0eWxlLCAwKTsKQEAgLTE1NjIsMjMgKzE2NjMsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oYS5nZXREcmF3YWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5EaWFsb2dQcmVmZXJlbmNlX2RpYWxvZ1RpdGxlKSk7CiAgICAgICAgICAgICBhLnJlY3ljbGUoKTsKLSAgICAKKwogICAgICAgICAgICAgbURpYWxvZ0J1aWxkZXIuc2V0U2luZ2xlQ2hvaWNlSXRlbXMobUl0ZW1zLCBjaGVja2VkSXRlbSwKICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLk9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTWV0aG9kTWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW1zID09IG51bGwgfHwgbUltcy5sZW5ndGggPD0gd2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JbXMgPT0gbnVsbCB8fCBtSW1zLmxlbmd0aCA8PSB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdWJ0eXBlSWRzID09IG51bGwgfHwgbVN1YnR5cGVJZHMubGVuZ3RoIDw9IHdoaWNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGltID0gbUltc1t3aGljaF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0eXBlSWQgPSBtU3VidHlwZUlkc1t3aGljaF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVJbnB1dE1ldGhvZE1lbnUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElucHV0TWV0aG9kTG9ja2VkKGltLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdWJ0eXBlSWQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3VidHlwZUlkID49IGltLmdldFN1YnR5cGVzKCkuc2l6ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGVJZCA9IE5PVF9BX1NVQlRZUEVfSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dE1ldGhvZExvY2tlZChpbS5nZXRJZCgpLCBzdWJ0eXBlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9KTsKIAorICAgICAgICAgICAgaWYgKHNob3dTdWJ0eXBlcykgeworICAgICAgICAgICAgICAgIG1EaWFsb2dCdWlsZGVyLnNldFBvc2l0aXZlQnV0dG9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLm1vcmVfaXRlbV9sYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dJbnB1dE1ldGhvZEFuZFN1YnR5cGVFbmFibGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlhbG9nQnVpbGRlci5zZXROZWdhdGl2ZUJ1dHRvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jYW5jZWwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2hCdXR0b24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlSW5wdXRNZXRob2RNZW51KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgbVN3aXRjaGluZ0RpYWxvZyA9IG1EaWFsb2dCdWlsZGVyLmNyZWF0ZSgpOwogICAgICAgICAgICAgbVN3aXRjaGluZ0RpYWxvZy5nZXRXaW5kb3coKS5zZXRUeXBlKAogICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0lOUFVUX01FVEhPRF9ESUFMT0cpOwpAQCAtMTYzMCw4MCArMTc1MSwyNjcgQEAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBpbnB1dCBtZXRob2QuCiAgICAgICAgIElucHV0TWV0aG9kSW5mbyBpbW0gPSBtTWV0aG9kTWFwLmdldChpZCk7CiAgICAgICAgIGlmIChpbW0gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGltbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBpZDogIiArIG1DdXJNZXRob2RJZCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGlkOiAiICsgbUN1ck1ldGhvZElkKTsKICAgICAgICAgfQogCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDI1Nik7CisgICAgICAgIExpc3Q8UGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+Pj4gZW5hYmxlZElucHV0TWV0aG9kc0xpc3QgPSBtU2V0dGluZ3MKKyAgICAgICAgICAgICAgICAuZ2V0RW5hYmxlZElucHV0TWV0aG9kc0FuZFN1YnR5cGVMaXN0TG9ja2VkKCk7CiAKLSAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBmaXJzdElkID0gbnVsbDsKKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIGZvciAoUGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+PiBwYWlyOiBlbmFibGVkSW5wdXRNZXRob2RzTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChwYWlyLmZpcnN0LmVxdWFscyhpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGVuYWJsaW5nIHRoaXMgaW5wdXQgbWV0aG9kLCBidXQgaXQgaXMgYWxyZWFkeSBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLiBUaGUgcHJldmlvdXMgc3RhdGUgd2FzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZXR0aW5ncy5hcHBlbmRBbmRQdXRFbmFibGVkSW5wdXRNZXRob2RMb2NrZWQoaWQsIGZhbHNlKTsKKyAgICAgICAgICAgIC8vIFByZXZpb3VzIHN0YXRlIHdhcyBkaXNhYmxlZC4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBpZiAobVNldHRpbmdzLmJ1aWxkQW5kUHV0RW5hYmxlZElucHV0TWV0aG9kc1N0clJlbW92aW5nSWRMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIsIGVuYWJsZWRJbnB1dE1ldGhvZHNMaXN0LCBpZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBEaXNhYmxlZCBpbnB1dCBtZXRob2QgaXMgY3VycmVudGx5IHNlbGVjdGVkLCBzd2l0Y2ggdG8gYW5vdGhlciBvbmUuCisgICAgICAgICAgICAgICAgU3RyaW5nIHNlbElkID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCk7CisgICAgICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhzZWxJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRJbnB1dE1ldGhvZHNMaXN0LnNpemUoKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZW5hYmxlZElucHV0TWV0aG9kc0xpc3QuZ2V0KDApLmZpcnN0IDogIiIpOworICAgICAgICAgICAgICAgICAgICByZXNldFNlbGVjdGVkSW5wdXRNZXRob2RTdWJ0eXBlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFByZXZpb3VzIHN0YXRlIHdhcyBlbmFibGVkLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZGlzYWJsaW5nIHRoZSBpbnB1dCBtZXRob2QgYnV0IGl0IGlzIGFscmVhZHkgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkby4gIFRoZSBwcmV2aW91cyBzdGF0ZSB3YXMgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8vIExvb2sgdGhyb3VnaCB0aGUgY3VycmVudGx5IGVuYWJsZWQgaW5wdXQgbWV0aG9kcy4KLSAgICAgICAgU3RyaW5nIGVuYWJsZWRTdHIgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0lOUFVUX01FVEhPRFMpOwotICAgICAgICBpZiAoZW5hYmxlZFN0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBUZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXIgc3BsaXR0ZXIgPSBtU3RyaW5nQ29sb25TcGxpdHRlcjsKLSAgICAgICAgICAgIHNwbGl0dGVyLnNldFN0cmluZyhlbmFibGVkU3RyKTsKLSAgICAgICAgICAgIHdoaWxlIChzcGxpdHRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY3VySWQgPSBzcGxpdHRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cklkLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBlbmFibGluZyB0aGlzIGlucHV0IG1ldGhvZCwgYnV0IGl0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGVuYWJsZWQuICBOb3RoaW5nIHRvIGRvLiAgVGhlIHByZXZpb3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSB3YXMgZW5hYmxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBkaXNhYmxpbmcgdGhpcyBpbnB1dCBtZXRob2QsIGFuZCBpdCBpcwotICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgZW5hYmxlZC4gIFNraXAgaXQgdG8gcmVtb3ZlIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBsaXN0LgotICAgICAgICAgICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBidWlsZGluZyBhIG5ldyBsaXN0IG9mIGlucHV0IG1ldGhvZHMgdGhhdAotICAgICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGNvbnRhaW4gdGhlIGdpdmVuIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0SWQgPT0gbnVsbCkgZmlyc3RJZCA9IGN1cklkOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIGJ1aWxkZXIuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGN1cklkKTsKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRTZWxlY3RlZElucHV0TWV0aG9kU3VidHlwZSgpIHsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuU0VMRUNURURfSU5QVVRfTUVUSE9EX1NVQlRZUEUsIE5PVF9BX1NVQlRZUEVfSUQpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBwdXRTZWxlY3RlZElucHV0TWV0aG9kU3VidHlwZShJbnB1dE1ldGhvZEluZm8gaW1pLCBpbnQgc3VidHlwZUlkKSB7CisgICAgICAgIEFycmF5TGlzdDxJbnB1dE1ldGhvZFN1YnR5cGU+IHN1YnR5cGVzID0gaW1pLmdldFN1YnR5cGVzKCk7CisgICAgICAgIGlmIChzdWJ0eXBlSWQgPj0gMCAmJiBzdWJ0eXBlSWQgPCBzdWJ0eXBlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TRUxFQ1RFRF9JTlBVVF9NRVRIT0RfU1VCVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgc3VidHlwZXMuZ2V0KHN1YnR5cGVJZCkuaGFzaENvZGUoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc2V0U2VsZWN0ZWRJbnB1dE1ldGhvZFN1YnR5cGUoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFNlbGVjdGVkSW5wdXRNZXRob2RTdWJ0eXBlSWQoU3RyaW5nIGlkKSB7CisgICAgICAgIElucHV0TWV0aG9kSW5mbyBpbWkgPSBtTWV0aG9kTWFwLmdldChpZCk7CisgICAgICAgIGlmIChpbWkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIE5PVF9BX1NVQlRZUEVfSUQ7CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElucHV0TWV0aG9kU3VidHlwZT4gc3VidHlwZXMgPSBpbWkuZ2V0U3VidHlwZXMoKTsKKyAgICAgICAgaW50IHN1YnR5cGVJZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1YnR5cGVJZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TRUxFQ1RFRF9JTlBVVF9NRVRIT0RfU1VCVFlQRSk7CisgICAgICAgIH0gY2F0Y2ggKFNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gTk9UX0FfU1VCVFlQRV9JRDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnR5cGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBJbnB1dE1ldGhvZFN1YnR5cGUgaW1zID0gc3VidHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHN1YnR5cGVJZCA9PSBpbXMuaGFzaENvZGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBOT1RfQV9TVUJUWVBFX0lEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJuIHRoZSBjdXJyZW50IHN1YnR5cGUgb2YgdGhpcyBpbnB1dCBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIElucHV0TWV0aG9kU3VidHlwZSBnZXRDdXJyZW50SW5wdXRNZXRob2RTdWJ0eXBlKCkgeworICAgICAgICByZXR1cm4gbUN1cnJlbnRTdWJ0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgY2xhc3MgZm9yIHB1dHRpbmcgYW5kIGdldHRpbmcgc2V0dGluZ3MgZm9yIElucHV0TWV0aG9kCisgICAgICogVE9ETzogTW92ZSBhbGwgcHV0dGVycyBhbmQgZ2V0dGVycyBvZiBzZXR0aW5ncyB0byB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElucHV0TWV0aG9kU2V0dGluZ3MgeworICAgICAgICAvLyBUaGUgc3RyaW5nIGZvciBlbmFibGVkIGlucHV0IG1ldGhvZCBpcyBzYXZlZCBhcyBmb2xsb3dzOgorICAgICAgICAvLyBleGFtcGxlOiAoImltZTA7c3VidHlwZTA7c3VidHlwZTE7c3VidHlwZTI6aW1lMTppbWUyO3N1YnR5cGUwIikKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBJTlBVVF9NRVRIT0RfU0VQQVJBVEVSID0gJzonOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIElOUFVUX01FVEhPRF9TVUJUWVBFX1NFUEFSQVRFUiA9ICc7JzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXIgbVN0cmluZ0NvbG9uU3BsaXR0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBUZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXIoSU5QVVRfTUVUSE9EX1NFUEFSQVRFUik7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXIgbVN0cmluZ1NlbWlDb2xvblNwbGl0dGVyID0KKyAgICAgICAgICAgICAgICBuZXcgVGV4dFV0aWxzLlNpbXBsZVN0cmluZ1NwbGl0dGVyKElOUFVUX01FVEhPRF9TVUJUWVBFX1NFUEFSQVRFUik7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbnB1dE1ldGhvZEluZm8+IG1NZXRob2RNYXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PElucHV0TWV0aG9kSW5mbz4gbU1ldGhvZExpc3Q7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUVuYWJsZWRJbnB1dE1ldGhvZHNTdHJDYWNoZTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJ1aWxkRW5hYmxlZElucHV0TWV0aG9kc1NldHRpbmdTdHJpbmcoCisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBQYWlyPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+IHBhaXIpIHsKKyAgICAgICAgICAgIFN0cmluZyBpZCA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzdWJ0eXBlcyA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoaWQpOworICAgICAgICAgICAgaWYgKHN1YnR5cGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzdWJ0eXBlcy5nZXQoMCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3VidHlwZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoSU5QVVRfTUVUSE9EX1NVQlRZUEVfU0VQQVJBVEVSKS5hcHBlbmQoc3VidHlwZXMuZ2V0KGkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWVuYWJsZWQpIHsKLSAgICAgICAgICAgIGlmICghcmVtb3ZlZCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBkaXNhYmxpbmcgdGhlIGlucHV0IG1ldGhvZCBidXQgaXQgaXMgYWxyZWFkeQotICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkLiAgTm90aGluZyB0byBkby4gIFRoZSBwcmV2aW91cyBzdGF0ZSB3YXMKLSAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZC4KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNldHRpbmcgd2l0aCB0aGUgbmV3IGxpc3Qgb2YgaW5wdXQgbWV0aG9kcy4KLSAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0lOUFVUX01FVEhPRFMsIGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAvLyBXZSB0aGUgZGlzYWJsZWQgaW5wdXQgbWV0aG9kIGlzIGN1cnJlbnRseSBzZWxlY3RlZCwgc3dpdGNoCi0gICAgICAgICAgICAvLyB0byBhbm90aGVyIG9uZS4KLSAgICAgICAgICAgIFN0cmluZyBzZWxJZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCk7Ci0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKHNlbElkKSkgewotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdElkICE9IG51bGwgPyBmaXJzdElkIDogIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gUHJldmlvdXMgc3RhdGUgd2FzIGVuYWJsZWQuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcHVibGljIElucHV0TWV0aG9kU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBIYXNoTWFwPFN0cmluZywgSW5wdXRNZXRob2RJbmZvPiBtZXRob2RNYXAsCisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElucHV0TWV0aG9kSW5mbz4gbWV0aG9kTGlzdCkgeworICAgICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgICAgICBtTWV0aG9kTWFwID0gbWV0aG9kTWFwOworICAgICAgICAgICAgbU1ldGhvZExpc3QgPSBtZXRob2RMaXN0OwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQWRkIGluIHRoZSBuZXdseSBlbmFibGVkIGlucHV0IG1ldGhvZC4KLSAgICAgICAgaWYgKGVuYWJsZWRTdHIgPT0gbnVsbCB8fCBlbmFibGVkU3RyLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGVuYWJsZWRTdHIgPSBpZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVuYWJsZWRTdHIgPSBlbmFibGVkU3RyICsgJzonICsgaWQ7CisgICAgICAgIHB1YmxpYyBMaXN0PElucHV0TWV0aG9kSW5mbz4gZ2V0RW5hYmxlZElucHV0TWV0aG9kTGlzdExvY2tlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbmFibGVkSW5wdXRNZXRob2RMaXN0TG9ja2VkKAorICAgICAgICAgICAgICAgICAgICBnZXRFbmFibGVkSW5wdXRNZXRob2RzQW5kU3VidHlwZUxpc3RMb2NrZWQoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0lOUFVUX01FVEhPRFMsIGVuYWJsZWRTdHIpOworICAgICAgICBwdWJsaWMgTGlzdDxQYWlyPElucHV0TWV0aG9kSW5mbywgQXJyYXlMaXN0PFN0cmluZz4+PgorICAgICAgICAgICAgICAgIGdldEVuYWJsZWRJbnB1dE1ldGhvZEFuZFN1YnR5cGVMaXN0TG9ja2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVuYWJsZWRJbnB1dE1ldGhvZEFuZFN1YnR5cGVMaXN0TG9ja2VkKAorICAgICAgICAgICAgICAgICAgICBnZXRFbmFibGVkSW5wdXRNZXRob2RzQW5kU3VidHlwZUxpc3RMb2NrZWQoKSk7CisgICAgICAgIH0KIAotICAgICAgICAvLyBQcmV2aW91cyBzdGF0ZSB3YXMgZGlzYWJsZWQuCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQXQgdGhlIGluaXRpYWwgYm9vdCwgdGhlIHNldHRpbmdzIGZvciBpbnB1dCBtZXRob2RzIGFyZSBub3Qgc2V0LAorICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGVuYWJsZSBJTUUgaW4gdGhhdCBjYXNlLgorICAgICAgICBwdWJsaWMgdm9pZCBlbmFibGVBbGxJTUVzSWZUaGVyZUlzTm9FbmFibGVkSU1FKCkgeworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGdldEVuYWJsZWRJbnB1dE1ldGhvZHNTdHIoKSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1NZXRob2RMaXN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZEluZm8gaW1pID0gbU1ldGhvZExpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiQWRkaW5nOiAiICsgaW1pLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgnOicpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW1pLmdldElkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXRFbmFibGVkSW5wdXRNZXRob2RzU3RyKHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8UGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+Pj4gZ2V0RW5hYmxlZElucHV0TWV0aG9kc0FuZFN1YnR5cGVMaXN0TG9ja2VkKCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4+IGltc0xpc3QKKyAgICAgICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4+KCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5hYmxlZElucHV0TWV0aG9kc1N0ciA9IGdldEVuYWJsZWRJbnB1dE1ldGhvZHNTdHIoKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShlbmFibGVkSW5wdXRNZXRob2RzU3RyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbXNMaXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0cmluZ0NvbG9uU3BsaXR0ZXIuc2V0U3RyaW5nKGVuYWJsZWRJbnB1dE1ldGhvZHNTdHIpOworICAgICAgICAgICAgd2hpbGUgKG1TdHJpbmdDb2xvblNwbGl0dGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0SW1zU3RyID0gbVN0cmluZ0NvbG9uU3BsaXR0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIG1TdHJpbmdTZW1pQ29sb25TcGxpdHRlci5zZXRTdHJpbmcobmV4dEltc1N0cik7CisgICAgICAgICAgICAgICAgaWYgKG1TdHJpbmdTZW1pQ29sb25TcGxpdHRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc3VidHlwZUhhc2hlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgZWxlbWVudCBpcyBpbWUgaWQuCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbWVJZCA9IG1TdHJpbmdTZW1pQ29sb25TcGxpdHRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtU3RyaW5nU2VtaUNvbG9uU3BsaXR0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlSGFzaGVzLmFkZChtU3RyaW5nU2VtaUNvbG9uU3BsaXR0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbXNMaXN0LmFkZChuZXcgUGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+PihpbWVJZCwgc3VidHlwZUhhc2hlcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbXNMaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kQW5kUHV0RW5hYmxlZElucHV0TWV0aG9kTG9ja2VkKFN0cmluZyBpZCwgYm9vbGVhbiByZWxvYWRJbnB1dE1ldGhvZFN0cikgeworICAgICAgICAgICAgaWYgKHJlbG9hZElucHV0TWV0aG9kU3RyKSB7CisgICAgICAgICAgICAgICAgZ2V0RW5hYmxlZElucHV0TWV0aG9kc1N0cigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1FbmFibGVkSW5wdXRNZXRob2RzU3RyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgLy8gQWRkIGluIHRoZSBuZXdseSBlbmFibGVkIGlucHV0IG1ldGhvZC4KKyAgICAgICAgICAgICAgICBwdXRFbmFibGVkSW5wdXRNZXRob2RzU3RyKGlkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHV0RW5hYmxlZElucHV0TWV0aG9kc1N0cigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkSW5wdXRNZXRob2RzU3RyQ2FjaGUgKyBJTlBVVF9NRVRIT0RfU0VQQVJBVEVSICsgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuZCBwdXQgYSBzdHJpbmcgb2YgRW5hYmxlZElucHV0TWV0aG9kcyB3aXRoIHJlbW92aW5nIHNwZWNpZmllZCBJZC4KKyAgICAgICAgICogQHJldHVybiB0aGUgc3BlY2lmaWVkIGlkIHdhcyByZW1vdmVkIG9yIG5vdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJ1aWxkQW5kUHV0RW5hYmxlZElucHV0TWV0aG9kc1N0clJlbW92aW5nSWRMb2NrZWQoCisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBMaXN0PFBhaXI8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4+IGltc0xpc3QsIFN0cmluZyBpZCkgeworICAgICAgICAgICAgYm9vbGVhbiBpc1JlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNBcHBlbmRTZXBhcmF0b3IgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoUGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+PiBpbXM6IGltc0xpc3QpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY3VySWQgPSBpbXMuZmlyc3Q7CisgICAgICAgICAgICAgICAgaWYgKGN1cklkLmVxdWFscyhpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGRpc2FibGluZyB0aGlzIGlucHV0IG1ldGhvZCwgYW5kIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSBlbmFibGVkLiAgU2tpcCBpdCB0byByZW1vdmUgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGxpc3QuCisgICAgICAgICAgICAgICAgICAgIGlzUmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzQXBwZW5kU2VwYXJhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChJTlBVVF9NRVRIT0RfU0VQQVJBVEVSKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzQXBwZW5kU2VwYXJhdG9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidWlsZEVuYWJsZWRJbnB1dE1ldGhvZHNTZXR0aW5nU3RyaW5nKGJ1aWxkZXIsIGltcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzUmVtb3ZlZCkgeworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2V0dGluZyB3aXRoIHRoZSBuZXcgbGlzdCBvZiBpbnB1dCBtZXRob2RzLgorICAgICAgICAgICAgICAgIHB1dEVuYWJsZWRJbnB1dE1ldGhvZHNTdHIoYnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpc1JlbW92ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBjcmVhdGVFbmFibGVkSW5wdXRNZXRob2RMaXN0TG9ja2VkKAorICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+Pj4gaW1zTGlzdCkgeworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PElucHV0TWV0aG9kSW5mbz4gcmVzID0gbmV3IEFycmF5TGlzdDxJbnB1dE1ldGhvZEluZm8+KCk7CisgICAgICAgICAgICBmb3IgKFBhaXI8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4gaW1zOiBpbXNMaXN0KSB7CisgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGluZm8gPSBtTWV0aG9kTWFwLmdldChpbXMuZmlyc3QpOworICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzLmFkZChpbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFBhaXI8SW5wdXRNZXRob2RJbmZvLCBBcnJheUxpc3Q8U3RyaW5nPj4+CisgICAgICAgICAgICAgICAgY3JlYXRlRW5hYmxlZElucHV0TWV0aG9kQW5kU3VidHlwZUxpc3RMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4+IGltc0xpc3QpIHsKKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxQYWlyPElucHV0TWV0aG9kSW5mbywgQXJyYXlMaXN0PFN0cmluZz4+PiByZXMKKyAgICAgICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFBhaXI8SW5wdXRNZXRob2RJbmZvLCBBcnJheUxpc3Q8U3RyaW5nPj4+KCk7CisgICAgICAgICAgICBmb3IgKFBhaXI8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4gaW1zIDogaW1zTGlzdCkgeworICAgICAgICAgICAgICAgIElucHV0TWV0aG9kSW5mbyBpbmZvID0gbU1ldGhvZE1hcC5nZXQoaW1zLmZpcnN0KTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5hZGQobmV3IFBhaXI8SW5wdXRNZXRob2RJbmZvLCBBcnJheUxpc3Q8U3RyaW5nPj4oaW5mbywgaW1zLnNlY29uZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcHV0RW5hYmxlZElucHV0TWV0aG9kc1N0cihTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1SZXNvbHZlciwgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUywgc3RyKTsKKyAgICAgICAgICAgIG1FbmFibGVkSW5wdXRNZXRob2RzU3RyQ2FjaGUgPSBzdHI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRFbmFibGVkSW5wdXRNZXRob2RzU3RyKCkgeworICAgICAgICAgICAgbUVuYWJsZWRJbnB1dE1ldGhvZHNTdHJDYWNoZSA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIG1SZXNvbHZlciwgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUyk7CisgICAgICAgICAgICByZXR1cm4gbUVuYWJsZWRJbnB1dE1ldGhvZHNTdHJDYWNoZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAzNjFjZDNiLi4xOWVhNGUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTG9jYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NzUsMTQgKzQ3NSwxNyBAQAogICAgICAgICBtRW5hYmxlZFByb3ZpZGVycy5hZGQocGFzc2l2ZVByb3ZpZGVyLmdldE5hbWUoKSk7CiAKICAgICAgICAgLy8gaW5pdGlhbGl6ZSBleHRlcm5hbCBuZXR3b3JrIGxvY2F0aW9uIGFuZCBnZW9jb2RlciBzZXJ2aWNlcwotICAgICAgICBpZiAobU5ldHdvcmtMb2NhdGlvblByb3ZpZGVyUGFja2FnZU5hbWUgIT0gbnVsbCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGlmIChtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXJQYWNrYWdlTmFtZSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXJQYWNrYWdlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1OZXR3b3JrTG9jYXRpb25Qcm92aWRlciA9CiAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uUHJvdmlkZXJQcm94eShtQ29udGV4dCwgTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXJQYWNrYWdlTmFtZSwgbUxvY2F0aW9uSGFuZGxlcik7CiAgICAgICAgICAgICBhZGRQcm92aWRlcihtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXIpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1HZW9jb2RlUHJvdmlkZXJQYWNrYWdlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChtR2VvY29kZVByb3ZpZGVyUGFja2FnZU5hbWUgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIHBtLnJlc29sdmVTZXJ2aWNlKG5ldyBJbnRlbnQobUdlb2NvZGVQcm92aWRlclBhY2thZ2VOYW1lKSwgMCkgIT0gbnVsbCkgewogICAgICAgICAgICAgbUdlb2NvZGVQcm92aWRlciA9IG5ldyBHZW9jb2RlclByb3h5KG1Db250ZXh0LCBtR2VvY29kZVByb3ZpZGVyUGFja2FnZU5hbWUpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKaW5kZXggNjg2MmRiMy4uMjk1MDQ3YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKQEAgLTE0Niw2ICsxNDYsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQm9vdGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWFkeSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VuZFVtc0Nvbm5lY3RlZE9uQm9vdCA9IGZhbHNlOworICAgIC8vIHRydWUgaWYgd2Ugc2hvdWxkIGZha2UgTUVESUFfTU9VTlRFRCBzdGF0ZSBmb3IgZXh0ZXJuYWwgc3RvcmFnZQorICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogUHJpdmF0ZSBoYXNoIG9mIGN1cnJlbnRseSBtb3VudGVkIHNlY3VyZSBjb250YWluZXJzLgpAQCAtNDI5LDcgKzQzMSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlID0gZ2V0Vm9sdW1lU3RhdGUocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX1VOTU9VTlRFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Vm9sdW1lU3RhdGVDaGFuZ2UobnVsbCwgcGF0aCwgVm9sdW1lU3RhdGUuTm9NZWRpYSwgVm9sdW1lU3RhdGUuTW91bnRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSBkb01vdW50Vm9sdW1lKHBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gU3RvcmFnZVJlc3VsdENvZGUuT3BlcmF0aW9uU3VjY2VlZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCJCb290LXRpbWUgbW91bnQgZmFpbGVkICglZCkiLCByYykpOwpAQCAtNTAwLDExICs1MDQsMTMgQEAKICAgICAgICAgICAgIFNsb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkR1cGxpY2F0ZSBzdGF0ZSB0cmFuc2l0aW9uICglcyAtPiAlcykiLCBtTGVnYWN5U3RhdGUsIHN0YXRlKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlIG9uIFBhY2thZ2VNYW5hZ2VyCi0gICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgewotICAgICAgICAgICAgbVBtcy51cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRC5lcXVhbHMoc3RhdGUpKSB7Ci0gICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAvLyBVcGRhdGUgc3RhdGUgb24gUGFja2FnZU1hbmFnZXIsIGJ1dCBvbmx5IG9mIHJlYWwgZXZlbnRzCisgICAgICAgIGlmICghbUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgeworICAgICAgICAgICAgICAgIG1QbXMudXBkYXRlRXh0ZXJuYWxNZWRpYVN0YXR1cyhmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVELmVxdWFscyhzdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gUmVtb3ZlIGFsbCBPQkIgbWFwcGluZ3MgYW5kIGxpc3RlbmVycyBmcm9tIHRoaXMgcGF0aApAQCAtMTA0MSw2ICsxMDQ3LDEzIEBACiAgICAgcHVibGljIE1vdW50U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1FbXVsYXRlRXh0ZXJuYWxTdG9yYWdlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfZW11bGF0ZUV4dGVybmFsU3RvcmFnZSk7CisgICAgICAgIGlmIChtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVzaW5nIGVtdWxhdGVkIGV4dGVybmFsIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgIG1MZWdhY3lTdGF0ZSA9IEVudmlyb25tZW50Lk1FRElBX01PVU5URUQ7CisgICAgICAgIH0KKwogICAgICAgICAvLyBYWFg6IFRoaXMgd2lsbCBnbyBhd2F5IHNvb24gaW4gZmF2b3Igb2YgSU1vdW50U2VydmljZU9ic2VydmVyCiAgICAgICAgIG1QbXMgPSAoUGFja2FnZU1hbmFnZXJTZXJ2aWNlKSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJwYWNrYWdlIik7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKaW5kZXggN2I2OGQ2OC4uY2Y4N2E5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKQEAgLTEzMiwxMSArMTMyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaGFuZGxpbmcgJyVzJyIsIGV2ZW50KSwgZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNwb25zZVF1ZXVlLnB1dChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBwdXQgcmVzcG9uc2Ugb250byBxdWV1ZSIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3BvbnNlUXVldWUucHV0KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gcHV0IHJlc3BvbnNlIG9udG8gcXVldWUiLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiQmFkIG1zZyAoJXMpIiwgZXZlbnQpKTsKQEAgLTIxOSw2ICsyMjAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQXJyYXlMaXN0PFN0cmluZz4gZG9Db21tYW5kKFN0cmluZyBjbWQpCiAgICAgICAgICAgICB0aHJvd3MgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uICB7CisgICAgICAgIG1SZXNwb25zZVF1ZXVlLmNsZWFyKCk7CiAgICAgICAgIHNlbmRDb21tYW5kKGNtZCk7CiAKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcmVzcG9uc2UgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKaW5kZXggZjBhY2RjMC4uOGRiZDNlNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKQEAgLTIyNiwxMCArMjI2LDEwIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOwotICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKLSAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7Ci0gICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OworICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSA8PCAyNDsKKyAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSkgPDwgMTY7CisgICAgICAgICAgICBpbnQgYyA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pIDw8ICA4OworICAgICAgICAgICAgaW50IGQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSAgICAgIDsKIAogICAgICAgICAgICAgcmV0dXJuIGEgfCBiIHwgYyB8IGQ7CiAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmY4NGViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQubmV0LlNudHBDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBNb25pdG9ycyB0aGUgbmV0d29yayB0aW1lIGFuZCB1cGRhdGVzIHRoZSBzeXN0ZW0gdGltZSBpZiBpdCBpcyBvdXQgb2Ygc3luYworICogYW5kIHRoZXJlIGhhc24ndCBiZWVuIGFueSBOSVRaIHVwZGF0ZSBmcm9tIHRoZSBjYXJyaWVyIHJlY2VudGx5LgorICogSWYgbG9va2luZyB1cCB0aGUgbmV0d29yayB0aW1lIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgaXQgdHJpZXMgYSBmZXcgdGltZXMgd2l0aCBhIHNob3J0CisgKiBpbnRlcnZhbCBhbmQgdGhlbiByZXNldHMgdG8gY2hlY2tpbmcgb24gbG9uZ2VyIGludGVydmFscy4KKyAqIDxwPgorICogSWYgdGhlIHVzZXIgZW5hYmxlcyBBVVRPX1RJTUUsIGl0IHdpbGwgY2hlY2sgaW1tZWRpYXRlbHkgZm9yIHRoZSBuZXR3b3JrIHRpbWUsIGlmIE5JVFogd2Fzbid0CisgKiBhdmFpbGFibGUuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQVVUT19USU1FX0NIQU5HRUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QT0xMX05FVFdPUktfVElNRSA9IDI7CisKKyAgICAvKiogTm9ybWFsIHBvbGxpbmcgZnJlcXVlbmN5ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQT0xMSU5HX0lOVEVSVkFMX01TID0gMjRMICogNjAgKiA2MCAqIDEwMDA7IC8vIDI0IGhycworICAgIC8qKiBUcnktYWdhaW4gcG9sbGluZyBpbnRlcnZhbCwgaW4gY2FzZSB0aGUgbmV0d29yayByZXF1ZXN0IGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUE9MTElOR19JTlRFUlZBTF9TSE9SVEVSX01TID0gNjAgKiAxMDAwTDsgLy8gNjAgc2Vjb25kcworICAgIC8qKiBOdW1iZXIgb2YgdGltZXMgdG8gdHJ5IGFnYWluICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSWV9BR0FJTl9USU1FU19NQVggPSAzOworICAgIC8qKiBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgTlRQIHNlcnZlciB0byByZXNwb25kLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0ZFVENIX1dBSVRfTVMgPSAyMCAqIDEwMDA7CisgICAgLyoqIElmIHRoZSB0aW1lIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdGhyZXNob2xkLCB0aGVuIHVwZGF0ZSB0aGUgdGltZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9FUlJPUl9USFJFU0hPTERfTVMgPSA1ICogMTAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUE9MTCA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLk5ldHdvcmtUaW1lVXBkYXRlU2VydmljZS5hY3Rpb24uUE9MTCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRSA9ICIvZXRjL2dwcy5jb25mIjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgUE9MTF9SRVFVRVNUID0gMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTk9UX1NFVCA9IC0xOworICAgIHByaXZhdGUgbG9uZyBtTml0elRpbWVTZXRUaW1lID0gTk9UX1NFVDsKKyAgICAvLyBUT0RPOiBIYXZlIGEgd2F5IHRvIGxvb2sgdXAgdGhlIHRpbWV6b25lIHdlIGFyZSBpbgorICAgIHByaXZhdGUgbG9uZyBtTml0elpvbmVTZXRUaW1lID0gTk9UX1NFVDsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAvLyBOVFAgbG9va3VwIGlzIGRvbmUgb24gdGhpcyB0aHJlYWQgYW5kIGhhbmRsZXIKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBIYW5kbGVyVGhyZWFkIG1UaHJlYWQ7CisgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKKyAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbVBlbmRpbmdQb2xsSW50ZW50OworICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKKyAgICAvLyBBZGRyZXNzIG9mIHRoZSBOVFAgc2VydmVyCisgICAgcHJpdmF0ZSBTdHJpbmcgbU50cFNlcnZlcjsKKyAgICAvLyBUaGUgbGFzdCB0aW1lIHRoYXQgd2Ugc3VjY2Vzc2Z1bGx5IGZldGNoZWQgdGhlIE5UUCB0aW1lLgorICAgIHByaXZhdGUgbG9uZyBtTGFzdE50cEZldGNoVGltZSA9IE5PVF9TRVQ7CisgICAgLy8gS2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgcXVpY2sgYXR0ZW1wdHMgd2VyZSBtYWRlIHRvIGZldGNoIE5UUCB0aW1lLgorICAgIC8vIER1cmluZyBib290dXAsIHRoZSBuZXR3b3JrIG1heSBub3QgaGF2ZSBiZWVuIHVwIHlldCwgb3IgaXQncyB0YWtpbmcgdGltZSBmb3IgdGhlCisgICAgLy8gY29ubmVjdGlvbiB0byBoYXBwZW4uCisgICAgcHJpdmF0ZSBpbnQgbVRyeUFnYWluQ291bnRlcjsKKworICAgIHB1YmxpYyBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUFsYXJtTWFuYWdlciA9IChBbGFybU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKKyAgICAgICAgSW50ZW50IHBvbGxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9QT0xMLCBudWxsKTsKKyAgICAgICAgbVBlbmRpbmdQb2xsSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsIFBPTExfUkVRVUVTVCwgcG9sbEludGVudCwgMCk7CisgICAgfQorCisgICAgLyoqIEluaXRpYWxpemUgdGhlIHJlY2VpdmVycyBhbmQgaW5pdGlhdGUgdGhlIGZpcnN0IE5UUCByZXF1ZXN0ICovCisgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIG1OdHBTZXJ2ZXIgPSBnZXROdHBTZXJ2ZXJBZGRyZXNzKCk7CisgICAgICAgIGlmIChtTnRwU2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJOVFAgc2VydmVyIGFkZHJlc3Mgbm90IGZvdW5kLCBub3Qgc3luY2luZyB0byBOVFAgdGltZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmVnaXN0ZXJGb3JUZWxlcGhvbnlJbnRlbnRzKCk7CisgICAgICAgIHJlZ2lzdGVyRm9yQWxhcm1zKCk7CisKKyAgICAgICAgbVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKG1UaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICAvLyBDaGVjayB0aGUgbmV0d29yayB0aW1lIG9uIHRoZSBuZXcgdGhyZWFkCisgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUE9MTF9ORVRXT1JLX1RJTUUpLnNlbmRUb1RhcmdldCgpOworCisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX0FVVE9fVElNRV9DSEFOR0VEKTsKKyAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIub2JzZXJ2ZShtQ29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TnRwU2VydmVyQWRkcmVzcygpIHsKKyAgICAgICAgU3RyaW5nIHNlcnZlckFkZHJlc3MgPSBudWxsOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShQUk9QRVJUSUVTX0ZJTEUpOworICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChzdHJlYW0pOworICAgICAgICAgICAgc2VydmVyQWRkcmVzcyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIk5UUF9TRVJWRVIiLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBvcGVuIEdQUyBjb25maWd1cmF0aW9uIGZpbGUgIiArIFBST1BFUlRJRVNfRklMRSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VydmVyQWRkcmVzczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJGb3JUZWxlcGhvbnlJbnRlbnRzKCkgeworICAgICAgICBJbnRlbnRGaWx0ZXIgaW50ZW50RmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX05FVFdPUktfU0VUX1RJTUUpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX05FVFdPUktfU0VUX1RJTUVaT05FKTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtTml0elJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvckFsYXJtcygpIHsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUE9MTF9ORVRXT1JLX1RJTUUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1BPTEwpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25Qb2xsTmV0d29ya1RpbWUoaW50IGV2ZW50KSB7CisgICAgICAgIC8vIElmIEF1dG9tYXRpYyB0aW1lIGlzIG5vdCBzZXQsIGRvbid0IGJvdGhlci4KKyAgICAgICAgaWYgKCFpc0F1dG9tYXRpY1RpbWVSZXF1ZXN0ZWQoKSkgcmV0dXJuOworCisgICAgICAgIGZpbmFsIGxvbmcgcmVmVGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAvLyBJZiBOSVRaIHRpbWUgd2FzIHJlY2VpdmVkIGxlc3MgdGhhbiBQT0xMSU5HX0lOVEVSVkFMX01TIHRpbWUgYWdvLAorICAgICAgICAvLyBubyBuZWVkIHRvIHN5bmMgdG8gTlRQLgorICAgICAgICBpZiAobU5pdHpUaW1lU2V0VGltZSAhPSBOT1RfU0VUICYmIHJlZlRpbWUgLSBtTml0elRpbWVTZXRUaW1lIDwgUE9MTElOR19JTlRFUlZBTF9NUykgeworICAgICAgICAgICAgcmVzZXRBbGFybShQT0xMSU5HX0lOVEVSVkFMX01TKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlN5c3RlbSB0aW1lID0gIiArIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgLy8gR2V0IHRoZSBOVFAgdGltZQorICAgICAgICBpZiAobUxhc3ROdHBGZXRjaFRpbWUgPT0gTk9UX1NFVCB8fCByZWZUaW1lID49IG1MYXN0TnRwRmV0Y2hUaW1lICsgUE9MTElOR19JTlRFUlZBTF9NUworICAgICAgICAgICAgICAgIHx8IGV2ZW50ID09IEVWRU5UX0FVVE9fVElNRV9DSEFOR0VEKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJCZWZvcmUgTnRwIGZldGNoIik7CisgICAgICAgICAgICBsb25nIG50cCA9IGdldE50cFRpbWUoKTsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIk50cCA9ICIgKyBudHApOworICAgICAgICAgICAgaWYgKG50cCA+IDApIHsKKyAgICAgICAgICAgICAgICBtVHJ5QWdhaW5Db3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICBtTGFzdE50cEZldGNoVGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhudHAgLSBjdXJyZW50VGltZSkgPiBUSU1FX0VSUk9SX1RIUkVTSE9MRF9NUykgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHN5c3RlbSB0aW1lCisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIk50cCB0aW1lIHRvIGJlIHNldCA9ICIgKyBudHApOworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3csIHNpbmNlIGl0J3MgZ29pbmcgdG8gYmUgY29udmVydGVkIHRvIGFuIGludAorICAgICAgICAgICAgICAgICAgICBpZiAobnRwIC8gMTAwMCA8IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5zZXRDdXJyZW50VGltZU1pbGxpcyhudHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiTnRwIHRpbWUgaXMgY2xvc2UgZW5vdWdoID0gIiArIG50cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gc2hvcnRseQorICAgICAgICAgICAgICAgIG1UcnlBZ2FpbkNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICBpZiAobVRyeUFnYWluQ291bnRlciA8PSBUUllfQUdBSU5fVElNRVNfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0QWxhcm0oUE9MTElOR19JTlRFUlZBTF9TSE9SVEVSX01TKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUcnkgbXVjaCBsYXRlcgorICAgICAgICAgICAgICAgICAgICBtVHJ5QWdhaW5Db3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmVzZXRBbGFybShQT0xMSU5HX0lOVEVSVkFMX01TKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc2V0QWxhcm0oUE9MTElOR19JTlRFUlZBTF9NUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIG9sZCBhbGFybSBhbmQgc3RhcnRzIGEgbmV3IG9uZSBmb3IgdGhlIHNwZWNpZmllZCBpbnRlcnZhbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnZhbCB3aGVuIHRvIHRyaWdnZXIgdGhlIGFsYXJtLCBzdGFydGluZyBmcm9tIG5vdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzZXRBbGFybShsb25nIGludGVydmFsKSB7CisgICAgICAgIG1BbGFybU1hbmFnZXIuY2FuY2VsKG1QZW5kaW5nUG9sbEludGVudCk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgIGxvbmcgbmV4dCA9IG5vdyArIGludGVydmFsOworICAgICAgICBtQWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRSwgbmV4dCwgbVBlbmRpbmdQb2xsSW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZ2V0TnRwVGltZSgpIHsKKyAgICAgICAgU250cENsaWVudCBjbGllbnQgPSBuZXcgU250cENsaWVudCgpOworICAgICAgICBpZiAoY2xpZW50LnJlcXVlc3RUaW1lKG1OdHBTZXJ2ZXIsIE1BWF9OVFBfRkVUQ0hfV0FJVF9NUykpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0TnRwVGltZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIHVzZXIgcHJlZmVycyB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgdGltZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBdXRvbWF0aWNUaW1lUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU3lzdGVtLkFVVE9fVElNRSwgMCkKKyAgICAgICAgICAgICAgICAhPSAwOworICAgIH0KKworICAgIC8qKiBSZWNlaXZlciBmb3IgTml0eiB0aW1lIGV2ZW50cyAqLworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbU5pdHpSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9ORVRXT1JLX1NFVF9USU1FLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbU5pdHpUaW1lU2V0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9ORVRXT1JLX1NFVF9USU1FWk9ORS5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIG1OaXR6Wm9uZVNldFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogSGFuZGxlciB0byBkbyB0aGUgbmV0d29yayBhY2Nlc3NlcyBvbiAqLworICAgIHByaXZhdGUgY2xhc3MgTXlIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisKKyAgICAgICAgcHVibGljIE15SGFuZGxlcihMb29wZXIgbCkgeworICAgICAgICAgICAgc3VwZXIobCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfQVVUT19USU1FX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9QT0xMX05FVFdPUktfVElNRToKKyAgICAgICAgICAgICAgICAgICAgb25Qb2xsTmV0d29ya1RpbWUobXNnLndoYXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBPYnNlcnZlciB0byB3YXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgQVVUT19USU1FIHNldHRpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKworICAgICAgICBwcml2YXRlIGludCBtTXNnOworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisKKyAgICAgICAgU2V0dGluZ3NPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIsIGludCBtc2cpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICAgICAgbU1zZyA9IG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb2JzZXJ2ZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICByZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKFNldHRpbmdzLlN5c3RlbS5BVVRPX1RJTUUpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKG1Nc2cpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNTE4Y2ZkOS4uNWFmYWJiZCAxMDA3NTUKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwpAQCAtMjg1LDYgKzI4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uRkxBR19GT1JFR1JPVU5EX1NFUlZJQ0UpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihwa2csIHRhZywgaWQsIDAsIDApOyAvLyBtYXliZSBhZGQgc29tZSBmbGFncz8KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkxpc3QpIHsKICAgICAgICAgICAgICAgICAvLyBzb3VuZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAwNTBlMGM4Li5iY2YxYjk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtOTUxMCw3ICs5NTEwLDggQEAKICAgICAqIFVwZGF0ZSBtZWRpYSBzdGF0dXMgb24gUGFja2FnZU1hbmFnZXIuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXMoZmluYWwgYm9vbGVhbiBtZWRpYVN0YXR1cywgZmluYWwgYm9vbGVhbiByZXBvcnRTdGF0dXMpIHsKLSAgICAgICBpZiAoQmluZGVyLmdldENhbGxpbmdVaWQoKSAhPSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKKyAgICAgICBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgaWYgKGNhbGxpbmdVaWQgIT0gMCAmJiBjYWxsaW5nVWlkICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIk1lZGlhIHN0YXR1cyBjYW4gb25seSBiZSB1cGRhdGVkIGJ5IHRoZSBzeXN0ZW0iKTsKICAgICAgICB9CiAgICAgICAgc3luY2hyb25pemVkIChtUGFja2FnZXMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0OTZjNjY1Li41Mzg2YTFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNTU1LDcgKzI1NTUsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUtleWxpZ2h0RGVsYXkgPSBMT05HX0tFWUxJR0hUX0RFTEFZOwogICAgICAgICAgICAgaWYgKHRvdGFsRGVsYXkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVNjcmVlbk9mZkRlbGF5ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIG1lYW5zIHN0YXkgb24gYXMgbG9uZyBhcyBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmRGVsYXkgPSBtTWF4aW11bVNjcmVlbk9mZlRpbWVvdXQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1LZXlsaWdodERlbGF5IDwgdG90YWxEZWxheSkgewogICAgICAgICAgICAgICAgIC8vIHN1YnRyYWN0IHRoZSB0aW1lIHRoYXQgdGhlIGtleWxpZ2h0IGRlbGF5LiBUaGlzIHdpbGwgZ2l2ZSB1cyB0aGUKICAgICAgICAgICAgICAgICAvLyByZW1haW5kZXIgb2YgdGhlIHRpbWUgdGhhdCB3ZSBuZWVkIHRvIHNsZWVwIHRvIGdldCB0aGUgYWNjdXJhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWY3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQub3MuRHJvcEJveE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSBleHRlbmRzIEJpbmRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTkFQU0hPVF9ESVIgPSBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uU05BUFNIT1RfRElSOworCisgICAgcHJpdmF0ZSBGaWxlT2JzZXJ2ZXIgc25hcHNob3RPYnNlcnZlcjsKKworICAgIHB1YmxpYyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmVnaXN0ZXJTZXR0aW5nT2JzZXJ2ZXIoY29udGV4dCk7CisgICAgICAgIHN0YXJ0V29ya2luZyhjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRXb3JraW5nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgInN0YXJ0aW5nIFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlISIpOworCisgICAgICAgIGZpbmFsIERyb3BCb3hNYW5hZ2VyIGRyb3Bib3ggPQorICAgICAgICAgICAgICAgIChEcm9wQm94TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRFJPUEJPWF9TRVJWSUNFKTsKKworICAgICAgICAvLyBiZWZvcmUgRmlsZU9ic2VydmVyIGlzIHJlYWR5LCB0aGVyZSBjb3VsZCBoYXZlIGFscmVhZHkgYmVlbiBzb21lIHNuYXBzaG90cworICAgICAgICAvLyBpbiB0aGUgZGlyZWN0b3J5LCB3ZSBkb24ndCB3YW50IHRvIG1pc3MgdGhlbQorICAgICAgICBGaWxlW10gc25hcHNob3RGaWxlcyA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUikubGlzdEZpbGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBzbmFwc2hvdEZpbGVzICE9IG51bGwgJiYgaSA8IHNuYXBzaG90RmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGhhbmRsZVNuYXBzaG90RmlsZShzbmFwc2hvdEZpbGVzW2ldLCBkcm9wYm94KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldGVjdCBuZXcgc25hcHNob3QgYW5kIHB1dCBpdCBpbiBkcm9wYm94CisgICAgICAgIC8vIGRlbGV0ZSBpdCBhZnRlcndhcmRzIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkIGJlZm9yZQorICAgICAgICAvLyBOb3RlOiBuZWVkcyBsaXN0ZW5pbmcgYXQgZXZlbnQgQVRUUklCIHJhdGhlciB0aGFuIENMT1NFX1dSSVRFLCBiZWNhdXNlIHdlIHNldCB0aGUKKyAgICAgICAgLy8gcmVhZGFiaWxpdHkgb2Ygc25hcHNob3QgZmlsZXMgYWZ0ZXIgd3JpdGluZyB0aGVtIQorICAgICAgICBzbmFwc2hvdE9ic2VydmVyID0gbmV3IEZpbGVPYnNlcnZlcihTTkFQU0hPVF9ESVIsIEZpbGVPYnNlcnZlci5BVFRSSUIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChpbnQgZXZlbnQsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlU25hcHNob3RGaWxlKG5ldyBGaWxlKFNOQVBTSE9UX0RJUiwgcGF0aCksIGRyb3Bib3gpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzbmFwc2hvdE9ic2VydmVyLnN0YXJ0V2F0Y2hpbmcoKTsKKworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIGFjdGl2YXRlZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTbmFwc2hvdEZpbGUoRmlsZSBmaWxlLCBEcm9wQm94TWFuYWdlciBkcm9wYm94KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcm9wYm94LmFkZEZpbGUoVEFHLCBmaWxlLCAwKTsKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBTbG9nLnYoVEFHLCBmaWxlLmdldFBhdGgoKSArICIgYWRkZWQgdG8gZHJvcGJveCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3QgYWRkICIgKyBmaWxlLmdldFBhdGgoKSArICIgdG8gZHJvcGJveCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclNldHRpbmdPYnNlcnZlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIGNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiksCisgICAgICAgICAgICAgICAgZmFsc2UsIG5ldyBTYW1wbGluZ1Byb2ZpbGVyU2V0dGluZ3NPYnNlcnZlcihjb250ZW50UmVzb2x2ZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBwdy5wcmludGxuKCJTYW1wbGluZ1Byb2ZpbGVyU2VydmljZToiKTsKKyAgICAgICAgcHcucHJpbnRsbigiV2F0Y2hpbmcgZGlyZWN0b3J5OiAiICsgU05BUFNIT1RfRElSKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgcHVibGljIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyKENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwpOworICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgICAgIG9uQ2hhbmdlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBJbnRlZ2VyIHNhbXBsaW5nUHJvZmlsZXJIeiA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIsIFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiwgMCk7CisgICAgICAgICAgICAvLyBzZXR0aW5nIHRoaXMgc2VjdXJlIHByb3BlcnR5IHdpbGwgc3RhcnQgb3Igc3RvcCBzYW1wbGluZyBwcm9maWxlciwKKyAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYWRqdXN0IHRoZSBmcmVxdWVuY3kgb2YgdGFraW5nIHNuYXBzaG90cy4KKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJwZXJzaXN0LnN5cy5wcm9maWxlcl9oeiIsIHNhbXBsaW5nUHJvZmlsZXJIei50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2h1dGRvd25BY3Rpdml0eS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2h1dGRvd25BY3Rpdml0eS5qYXZhCmluZGV4IDY0YjljNWQuLmM5ZDRkMDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NodXRkb3duQWN0aXZpdHkuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TaHV0ZG93bkFjdGl2aXR5LmphdmEKQEAgLTI3LDE5ICsyNywyNiBAQAogcHVibGljIGNsYXNzIFNodXRkb3duQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNodXRkb3duQWN0aXZpdHkiOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVib290OwogICAgIHByaXZhdGUgYm9vbGVhbiBtQ29uZmlybTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAotICAgICAgICBtQ29uZmlybSA9IGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYShJbnRlbnQuRVhUUkFfS0VZX0NPTkZJUk0sIGZhbHNlKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtUmVib290ID0gSW50ZW50LkFDVElPTl9SRUJPT1QuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSk7CisgICAgICAgIG1Db25maXJtID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShJbnRlbnQuRVhUUkFfS0VZX0NPTkZJUk0sIGZhbHNlKTsKICAgICAgICAgU2xvZy5pKFRBRywgIm9uQ3JlYXRlKCk6IGNvbmZpcm09IiArIG1Db25maXJtKTsKIAogICAgICAgICBIYW5kbGVyIGggPSBuZXcgSGFuZGxlcigpOwogICAgICAgICBoLnBvc3QobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIFNodXRkb3duVGhyZWFkLnNodXRkb3duKFNodXRkb3duQWN0aXZpdHkudGhpcywgbUNvbmZpcm0pOworICAgICAgICAgICAgICAgIGlmIChtUmVib290KSB7CisgICAgICAgICAgICAgICAgICAgIFNodXRkb3duVGhyZWFkLnJlYm9vdChTaHV0ZG93bkFjdGl2aXR5LnRoaXMsIG51bGwsIG1Db25maXJtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTaHV0ZG93blRocmVhZC5zaHV0ZG93bihTaHV0ZG93bkFjdGl2aXR5LnRoaXMsIG1Db25maXJtKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TdGF0dXNCYXJNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDQxNzc0MzIuLmIxYmFlYzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNjgsNiArNjgsMTAgQEAKICAgICBBcnJheUxpc3Q8RGlzYWJsZVJlY29yZD4gbURpc2FibGVSZWNvcmRzID0gbmV3IEFycmF5TGlzdDxEaXNhYmxlUmVjb3JkPigpOwogICAgIGludCBtRGlzYWJsZWQgPSAwOwogCisgICAgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIC8vIFdlIHVzdWFsbHkgY2FsbCBpdCBsaWdodHMgb3V0IG1vZGUsIGJ1dCBkb3VibGUgbmVnYXRpdmVzIGFyZSBhbm5veWluZworICAgIGJvb2xlYW4gbUxpZ2h0c09uID0gdHJ1ZTsKKwogICAgIHByaXZhdGUgY2xhc3MgRGlzYWJsZVJlY29yZCBpbXBsZW1lbnRzIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgewogICAgICAgICBTdHJpbmcgcGtnOwogICAgICAgICBpbnQgd2hhdDsKQEAgLTg0LDYgKzg4LDcgQEAKICAgICAgICAgdm9pZCBvblNldERpc2FibGVkKGludCBzdGF0dXMpOwogICAgICAgICB2b2lkIG9uQ2xlYXJBbGwoKTsKICAgICAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsaWNrKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CisgICAgICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOwogICAgICAgICB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpOwogICAgICAgICB2b2lkIG9uTm90aWZpY2F0aW9uRXJyb3IoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkLAogICAgICAgICAgICAgICAgIGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgbWVzc2FnZSk7CkBAIC0yNDEsNiArMjQ2LDU2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBhdXRvbWF0aWMgdmVyc2lvbiBvZiBsaWdodHMtb3V0IG1vZGUuICBPbmx5IGNhbGwgdGhpcyBmcm9tCisgICAgICogdGhlIHdpbmRvdyBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHNlZSBzZXRMaWdodHNPbihib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVdpbmRvd0lzRnVsbHNjcmVlbihib29sZWFuIGZ1bGxzY3JlZW4pIHsKKyAgICAgICAgLy8gV2UgY291bGQgZ2V0IGF3YXkgd2l0aCBhIHNlcGFyYXRlIHBlcm1pc3Npb24gaGVyZSwgYnV0IFNUQVRVU19CQVIgaXMKKyAgICAgICAgLy8gc2lnbmF0dXJlT3JTeXN0ZW0gd2hpY2ggaXMgcHJvYmFibHkgZ29vZCBlbm91Z2guICBUaGVyZSBpcyBubyBwdWJsaWMgQVBJCisgICAgICAgIC8vIGZvciB0aGlzLCBzbyB0aGUgcXVlc3Rpb24gaXMgYSBzZWN1cml0eSBpc3N1ZSwgbm90IGFuIEFQSSBjb21wYXRpYmlsaXR5IGlzc3VlLgorICAgICAgICBlbmZvcmNlU3RhdHVzQmFyKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgdXBkYXRlTGlnaHRzT25Mb2NrZWQoIWZ1bGxzY3JlZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgdXNlci1jb250cm9sbGVkIHZlcnNpb24gb2YgbGlnaHRzLW91dCBtb2RlLiAgT25seSBjYWxsIHRoaXMgZnJvbQorICAgICAqIHRoZSBzdGF0dXMgYmFyIGl0c2VsZi4KKyAgICAgKgorICAgICAqIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBmdW5jdGlvbnMgaGVyZSwgYmVjYXVzZSBJIHRoaW5rIHdlJ3JlIGdvaW5nIHRvIHdhbnQgdG8KKyAgICAgKiB0d2VhayB0aGUgYmVoYXZpb3Igd2hlbiB0aGUgdXNlciBrZWVwcyB0dXJuaW5nIGxpZ2h0cy1vdXQgbW9kZSBvZmYgYW5kIHRoZQorICAgICAqIGFwcCBrZWVwcyB0cnlpbmcgdG8gdHVybiBpdCBvbi4gIEZvciBub3cgdGhleSBjYW4ganVzdCBmaWdodCBpdCBvdXQuICBIYXZpbmcKKyAgICAgKiB0aGVzZSB0d28gc2VwYXJ0ZSBpbnB1dHMgd2lsbCBhbGxvdyB1cyB0byBrZWVwIHRoYXQgY2hhbmdlIGxvY2FsIHRvIGhlcmUuICAtLWpvZW8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIGxpZ2h0c09uKSB7CisgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgdXBkYXRlTGlnaHRzT25Mb2NrZWQobGlnaHRzT24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpZ2h0c09uTG9ja2VkKGZpbmFsIGJvb2xlYW4gbGlnaHRzT24pIHsKKyAgICAgICAgaWYgKG1MaWdodHNPbiAhPSBsaWdodHNPbikgeworICAgICAgICAgICAgbUxpZ2h0c09uID0gbGlnaHRzT247CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXIuc2V0TGlnaHRzT24obGlnaHRzT24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VTdGF0dXNCYXIoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU1RBVFVTX0JBUiwKICAgICAgICAgICAgICAgICAiU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UiKTsKQEAgLTI2MSw3ICszMTYsOCBAQAogICAgIC8vIENhbGxiYWNrcyBmcm9tIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UuCiAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclN0YXR1c0JhcihJU3RhdHVzQmFyIGJhciwgU3RhdHVzQmFySWNvbkxpc3QgaWNvbkxpc3QsCi0gICAgICAgICAgICBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zKSB7CisgICAgICAgICAgICBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zLAorICAgICAgICAgICAgYm9vbGVhbiBsaWdodHNPbltdKSB7CiAgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CiAKICAgICAgICAgU2xvZy5pKFRBRywgInJlZ2lzdGVyU3RhdHVzQmFyIGJhcj0iICsgYmFyKTsKQEAgLTI3NSw2ICszMzEsOSBAQAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMuYWRkKGUuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbGlnaHRzT25bMF0gPSBtTGlnaHRzT247CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwMiw2ICszNjEsMTIgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbkNhbGxiYWNrcy5vbk5vdGlmaWNhdGlvbkVycm9yKHBrZywgdGFnLCBpZCwgdWlkLCBpbml0aWFsUGlkLCBtZXNzYWdlKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBvbk5vdGlmaWNhdGlvbkNsZWFyKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25DYWxsYmFja3Mub25Ob3RpZmljYXRpb25DbGVhcihwa2csIHRhZywgaWQpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCkgewogICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IDdmNDI0MjkuLjgwZGNjOTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC0yNCwyNyArMjQsMzMgQEAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlZNUnVudGltZTsKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlp5Z290ZTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy4qOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMuUGVvcGxlOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhBMmRwU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlclNlcnZpY2U7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVyOwpAQCAtNTIsMTEgKzU4LDggQEAKIAogY2xhc3MgU2VydmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbVNlcnZlciI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBJTkNMVURFX0RFTU8gPSBmYWxzZTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfQk9PVF9QUk9HUkVTU19TWVNURU1fUlVOID0gMzAxMDsKLQotICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CisgICAgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAKICAgICBwcml2YXRlIGNsYXNzIEFkYlNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewogICAgICAgICBwdWJsaWMgQWRiU2V0dGluZ3NPYnNlcnZlcigpIHsKQEAgLTEwMyw2ICsxMDYsNyBAQAogICAgICAgICBVaU1vZGVNYW5hZ2VyU2VydmljZSB1aU1vZGUgPSBudWxsOwogICAgICAgICBSZWNvZ25pdGlvbk1hbmFnZXJTZXJ2aWNlIHJlY29nbml0aW9uID0gbnVsbDsKICAgICAgICAgVGhyb3R0bGVTZXJ2aWNlIHRocm90dGxlID0gbnVsbDsKKyAgICAgICAgTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlIG5ldHdvcmtUaW1lVXBkYXRlciA9IG51bGw7CiAKICAgICAgICAgLy8gQ3JpdGljYWwgc2VydmljZXMuLi4KICAgICAgICAgdHJ5IHsKQEAgLTIxMSw2ICsyMTUsNyBAQAogICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZSBub3RpZmljYXRpb24gPSBudWxsOwogICAgICAgICBXYWxscGFwZXJNYW5hZ2VyU2VydmljZSB3YWxscGFwZXIgPSBudWxsOwogICAgICAgICBMb2NhdGlvbk1hbmFnZXJTZXJ2aWNlIGxvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgQ291bnRyeURldGVjdG9yU2VydmljZSBjb3VudHJ5RGV0ZWN0b3IgPSBudWxsOwogCiAgICAgICAgIGlmIChmYWN0b3J5VGVzdCAhPSBTeXN0ZW1TZXJ2ZXIuRkFDVE9SWV9URVNUX0xPV19MRVZFTCkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTMyMiw2ICszMjcsMTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiQ291bnRyeSBEZXRlY3RvciIpOworICAgICAgICAgICAgICAgIGNvdW50cnlEZXRlY3RvciA9IG5ldyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlKGNvbnRleHQpOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5DT1VOVFJZX0RFVEVDVE9SLCBjb3VudHJ5RGV0ZWN0b3IpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBDb3VudHJ5IERldGVjdG9yIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNlYXJjaCBTZXJ2aWNlIik7CiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlYXJjaE1hbmFnZXJTZXJ2aWNlKGNvbnRleHQpKTsKQEAgLTMyOSwxMSArMzQyLDYgQEAKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBTZWFyY2ggU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoSU5DTFVERV9ERU1PKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkluc3RhbGxpbmcgZGVtbyBkYXRhLi4uIik7Ci0gICAgICAgICAgICAgICAgKG5ldyBEZW1vVGhyZWFkKGNvbnRleHQpKS5zdGFydCgpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJEcm9wQm94IFNlcnZpY2UiKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuRFJPUEJPWF9TRVJWSUNFLApAQCAtNDMyLDYgKzQ0MCwyNSBAQAogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBEaXNrU3RhdHMgU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHRoaXMgc2VydmljZSBldmVuIGlmIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5pc0VuYWJsZWQoKQorICAgICAgICAgICAgICAgIC8vIGlzIGZhbHNlLCBiZWNhdXNlIGl0IGlzIHRoaXMgc2VydmljZSB0aGF0IGRldGVjdHMgc3lzdGVtIHByb3BlcnR5IGNoYW5nZSBhbmQKKyAgICAgICAgICAgICAgICAvLyB0dXJucyBvbiBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uIFBsdXMsIHdoZW4gc2FtcGxpbmcgcHJvZmlsZXIgZG9lc24ndCB3b3JrLAorICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGxpdHRsZSBvdmVyaGVhZCBmb3IgcnVubmluZyB0aGlzIHNlcnZpY2UuCisgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNhbXBsaW5nUHJvZmlsZXIgU2VydmljZSIpOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoInNhbXBsaW5ncHJvZmlsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZShjb250ZXh0KSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIFNhbXBsaW5nUHJvZmlsZXIgU2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICBuZXR3b3JrVGltZVVwZGF0ZXIgPSBuZXcgTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlKGNvbnRleHQpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBOZXR3b3JrVGltZVVwZGF0ZSBzZXJ2aWNlIik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIEFEQl9FTkFCTEVEIHNldHRpbmcgdmFsdWUgbWF0Y2hlcyB0aGUgc2VjdXJlIHByb3BlcnR5IHZhbHVlCkBAIC00NzMsNiArNTAwLDE2IEBACiAgICAgICAgICAgICBzdGF0dXNCYXIuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgfQogICAgICAgICB3bS5zeXN0ZW1SZWFkeSgpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjb250ZXh0IGJ5IGhhbmQsIGJlY2F1c2Ugd2UncmUgZ29pbmcKKyAgICAgICAgLy8gdG8gc3RhcnQgdXNpbmcgaXQgYmVmb3JlIHRoZSBjb25maWcgY2hhbmdlIGRvbmUgaW4gd20uc3lzdGVtUmVhZHkoKSB3aWxsCisgICAgICAgIC8vIHByb3BhZ2F0ZSB0byBpdC4KKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSB3bS5jb21wdXRlTmV3Q29uZmlndXJhdGlvbigpOworICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIFdpbmRvd01hbmFnZXIgdyA9IChXaW5kb3dNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKKyAgICAgICAgdy5nZXREZWZhdWx0RGlzcGxheSgpLmdldE1ldHJpY3MobWV0cmljcyk7CisgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkudXBkYXRlQ29uZmlndXJhdGlvbihjb25maWcsIG1ldHJpY3MpOworCiAgICAgICAgIHBvd2VyLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwbS5zeXN0ZW1SZWFkeSgpOwpAQCAtNDkyLDYgKzUyOSw4IEBACiAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UgaW1tRiA9IGltbTsKICAgICAgICAgZmluYWwgUmVjb2duaXRpb25NYW5hZ2VyU2VydmljZSByZWNvZ25pdGlvbkYgPSByZWNvZ25pdGlvbjsKICAgICAgICAgZmluYWwgTG9jYXRpb25NYW5hZ2VyU2VydmljZSBsb2NhdGlvbkYgPSBsb2NhdGlvbjsKKyAgICAgICAgZmluYWwgQ291bnRyeURldGVjdG9yU2VydmljZSBjb3VudHJ5RGV0ZWN0b3JGID0gY291bnRyeURldGVjdG9yOworICAgICAgICBmaW5hbCBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UgbmV0d29ya1RpbWVVcGRhdGVyRiA9IG5ldHdvcmtUaW1lVXBkYXRlcjsKIAogICAgICAgICAvLyBXZSBub3cgdGVsbCB0aGUgYWN0aXZpdHkgbWFuYWdlciBpdCBpcyBva2F5IHRvIHJ1biB0aGlyZCBwYXJ0eQogICAgICAgICAvLyBjb2RlLiAgSXQgd2lsbCBjYWxsIGJhY2sgaW50byB1cyBvbmNlIGl0IGhhcyBnb3R0ZW4gdG8gdGhlIHN0YXRlCkBAIC01MTksNyArNTU4LDkgQEAKICAgICAgICAgICAgICAgICBpZiAod2FsbHBhcGVyRiAhPSBudWxsKSB3YWxscGFwZXJGLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICAgICAgaWYgKGltbUYgIT0gbnVsbCkgaW1tRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbkYgIT0gbnVsbCkgbG9jYXRpb25GLnN5c3RlbVJlYWR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50cnlEZXRlY3RvckYgIT0gbnVsbCkgY291bnRyeURldGVjdG9yRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZUYgIT0gbnVsbCkgdGhyb3R0bGVGLnN5c3RlbVJlYWR5KCk7CisgICAgICAgICAgICAgICAgaWYgKG5ldHdvcmtUaW1lVXBkYXRlckYgIT0gbnVsbCkgbmV0d29ya1RpbWVVcGRhdGVyRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIApAQCAtNTMzLDM3ICs1NzQsNyBAQAogICAgIH0KIH0KIAotY2xhc3MgRGVtb1RocmVhZCBleHRlbmRzIFRocmVhZAotewotICAgIERlbW9UaHJlYWQoQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShQZW9wbGUuQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNEYXRhID0gYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKTsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzRGF0YSkgewotICAgICAgICAgICAgICAgIERlbW9EYXRhU2V0IGRhdGFzZXQgPSBuZXcgRGVtb0RhdGFTZXQoKTsKLSAgICAgICAgICAgICAgICBkYXRhc2V0LmFkZChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoIlN5c3RlbVNlcnZlciIsICJGYWlsdXJlIGluc3RhbGxpbmcgZGVtbyBkYXRhIiwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIENvbnRleHQgbUNvbnRleHQ7Ci19Ci0KLXB1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIKLXsKK3B1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUllfVEVTVF9PRkYgPSAwOwpAQCAtNTg3LDcgKzU5OCw3IEBACiAgICAgICAgICAgICB0aW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiLCBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBTTkFQU0hPVF9JTlRFUlZBTCwgU05BUFNIT1RfSU5URVJWQUwpOwogICAgICAgICB9CkBAIC01OTUsNyArNjA2LDcgQEAKICAgICAgICAgLy8gVGhlIHN5c3RlbSBzZXJ2ZXIgaGFzIHRvIHJ1biBhbGwgb2YgdGhlIHRpbWUsIHNvIGl0IG5lZWRzIHRvIGJlCiAgICAgICAgIC8vIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSB3aXRoIGl0cyBtZW1vcnkgdXNhZ2UuCiAgICAgICAgIFZNUnVudGltZS5nZXRSdW50aW1lKCkuc2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uKDAuOGYpOwotICAgICAgICAKKwogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImFuZHJvaWRfc2VydmVycyIpOwogICAgICAgICBpbml0MShhcmdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YQppbmRleCA3ZTIzNDIyLi4yYjQ4NDViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEKQEAgLTE5LDcgKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CkBAIC0zNSw2ICszNiw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5JQmF0dGVyeVN0YXRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255UmVnaXN0cnk7CkBAIC04OSw5ICs5MSwxMSBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uQXBuID0gIiI7CiAKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gbnVsbDsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db25uZWN0ZWRBcG5zOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSA9ICIiOworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbURhdGFDb25uZWN0aW9uTGlua1Byb3BlcnRpZXM7CisKKyAgICBwcml2YXRlIExpbmtDYXBhYmlsaXRpZXMgbURhdGFDb25uZWN0aW9uTGlua0NhcGFiaWxpdGllczsKIAogICAgIHByaXZhdGUgQnVuZGxlIG1DZWxsTG9jYXRpb24gPSBuZXcgQnVuZGxlKCk7CiAKQEAgLTEyMSw2ICsxMjUsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUJhdHRlcnlTdGF0cyA9IEJhdHRlcnlTdGF0c1NlcnZpY2UuZ2V0U2VydmljZSgpOworICAgICAgICBtQ29ubmVjdGVkQXBucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGxpc3RlbihTdHJpbmcgcGtnRm9yRGVidWcsIElQaG9uZVN0YXRlTGlzdGVuZXIgY2FsbGJhY2ssIGludCBldmVudHMsCkBAIC0yMzMsMTkgKzIzOCwyMCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5Q2FsbFN0YXRlKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtQ2FsbFN0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICBtQ2FsbEluY29taW5nTnVtYmVyID0gaW5jb21pbmdOdW1iZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25DYWxsU3RhdGVDaGFuZ2VkKHN0YXRlLCBpbmNvbWluZ051bWJlcik7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgICAgIGJyb2FkY2FzdENhbGxTdGF0ZUNoYW5nZWQoc3RhdGUsIGluY29taW5nTnVtYmVyKTsKICAgICB9CkBAIC0yNTYsOCArMjYyLDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2VydmljZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZFNlcnZpY2VTdGF0ZShyLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjcwLDEwICsyNzUsMTAgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeVNpZ25hbFN0cmVuZ3RoKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2lnbmFsU3RyZW5ndGggPSBzaWduYWxTdHJlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0lHTkFMX1NUUkVOR1RIUykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kU2lnbmFsU3RyZW5ndGgociwgc2lnbmFsU3RyZW5ndGgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4MywxMCArMjg4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKChnc21TaWduYWxTdHJlbmd0aCA9PSA5OSA/IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ3NtU2lnbmFsU3RyZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhDaGFuZ2VkKHNpZ25hbFN0cmVuZ3RoKTsKICAgICB9CkBAIC0yOTUsMTggKzMwMSwxOSBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtTWVzc2FnZVdhaXRpbmcgPSBtd2k7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX01FU1NBR0VfV0FJVElOR19JTkRJQ0FUT1IpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25NZXNzYWdlV2FpdGluZ0luZGljYXRvckNoYW5nZWQobXdpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxNCwxOCArMzIxLDE5IEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DYWxsRm9yd2FyZGluZyA9IGNmaTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9GT1JXQVJESU5HX0lORElDQVRPUikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZChjZmkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzMzLDU3ICszNDEsODEgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFBY3Rpdml0eSgpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQWN0aXZpdHkgPSBzdGF0ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9BQ1RJVklUWSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFBY3Rpdml0eShzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oaW50IHN0YXRlLCBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nW10gYXBuVHlwZXMsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUsCi0gICAgICAgICAgICBTdHJpbmcgZ2F0ZXdheSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIExpbmtQcm9wZXJ0aWVzIGxpbmtQcm9wZXJ0aWVzLAorICAgICAgICAgICAgTGlua0NhcGFiaWxpdGllcyBsaW5rQ2FwYWJpbGl0aWVzLCBpbnQgbmV0d29ya1R5cGUpIHsKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFDb25uZWN0aW9uKCkiICkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUG9zc2libGUgPSBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZTsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblJlYXNvbiA9IHJlYXNvbjsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkFwbiA9IGFwbjsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gYXBuVHlwZXM7Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgbmV0d29ya1R5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gVGVsZXBob255TWFuYWdlci5EQVRBX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZEFwbnMuY29udGFpbnMoYXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwbnMuYWRkKGFwblR5cGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFDb25uZWN0aW9uU3RhdGUgIT0gc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcG5zLnJlbW92ZShhcG5UeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RlZEFwbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBtRGF0YUNvbm5lY3Rpb25TdGF0ZSBhcyBpcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBvdXQgdGhlIG5ldyBzdGF0dXMgZm9yIHRoZSBBUE4gaW4gcXVlc3Rpb24uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUG9zc2libGUgPSBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZTsKKyAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblJlYXNvbiA9IHJlYXNvbjsKKyAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkxpbmtQcm9wZXJ0aWVzID0gbGlua1Byb3BlcnRpZXM7CisgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25MaW5rQ2FwYWJpbGl0aWVzID0gbGlua0NhcGFiaWxpdGllczsKKyAgICAgICAgICAgIGlmIChtRGF0YUNvbm5lY3Rpb25OZXR3b3JrVHlwZSAhPSBuZXR3b3JrVHlwZSkgeworICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7CisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CisgICAgICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIG5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicm9hZGNhc3REYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsIHJlYXNvbiwgYXBuLAotICAgICAgICAgICAgICAgIGFwblR5cGVzLCBpbnRlcmZhY2VOYW1lLCBnYXRld2F5KTsKKyAgICAgICAgICAgICAgICBhcG5UeXBlLCBsaW5rUHJvcGVydGllcywgbGlua0NhcGFiaWxpdGllcyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCgpIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvKgotICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGVyZSBpcyBvbiBvbkRhdGFDb25uZWN0aW9uRmFpbGVkIGNhbGxiYWNrCi0gICAgICAgICAqIG9uIFBob25lU3RhdGVMaXN0ZW5lci4gVGhlcmUgc2hvdWxkIGJlCisgICAgICAgICAqIFRoaXMgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXJlIGlzIG5vIG9uRGF0YUNvbm5lY3Rpb25GYWlsZWQgY2FsbGJhY2sKKyAgICAgICAgICogaW4gUGhvbmVTdGF0ZUxpc3RlbmVyLiBUaGVyZSBzaG91bGQgYmUuCiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkZhaWxlZFJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVJlY29yZHMuc2l6ZSgpOwpAQCAtMzk1LDcgKzQyNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKi8KLSAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uKTsKKyAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oQnVuZGxlIGNlbGxMb2NhdGlvbikgewpAQCAtNDA0LDggKzQzNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbUNlbGxMb2NhdGlvbiA9IGNlbGxMb2NhdGlvbjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0VMTF9MT0NBVElPTikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kQ2VsbExvY2F0aW9uKHIsIGNlbGxMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDE2LDcgKzQ0Nyw3IEBACiAgICAgLyoqCiAgICAgICogQ29weSB0aGUgc2VydmljZSBzdGF0ZSBvYmplY3Qgc28gdGhleSBjYW4ndCBtZXNzIGl0IHVwIGluIHRoZSBsb2NhbCBjYWxscwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRTZXJ2aWNlU3RhdGUoUmVjb3JkIHIsIFNlcnZpY2VTdGF0ZSBzdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZW5kU2VydmljZVN0YXRlKFJlY29yZCByLCBTZXJ2aWNlU3RhdGUgc3RhdGUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHIuY2FsbGJhY2sub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKG5ldyBTZXJ2aWNlU3RhdGUoc3RhdGUpKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CkBAIC00NjIsMTEgKzQ5MywxMSBAQAogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25Qb3NzaWJsZT0iICsgbURhdGFDb25uZWN0aW9uUG9zc2libGUpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25SZWFzb249IiArIG1EYXRhQ29ubmVjdGlvblJlYXNvbik7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkFwbj0iICsgbURhdGFDb25uZWN0aW9uQXBuKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZT0iICsgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkxpbmtQcm9wZXJ0aWVzPSIgKyBtRGF0YUNvbm5lY3Rpb25MaW5rUHJvcGVydGllcyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkxpbmtDYXBhYmlsaXRpZXM9IiArIG1EYXRhQ29ubmVjdGlvbkxpbmtDYXBhYmlsaXRpZXMpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2VsbExvY2F0aW9uPSIgKyBtQ2VsbExvY2F0aW9uKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oInJlZ2lzdHJhdGlvbnM6IGNvdW50PSIgKyByZWNvcmRDb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgIiArIHIucGtnRm9yRGVidWcgKyAiIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoci5ldmVudHMpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTM3LDcgKzU2OCw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLAogICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIGdhdGV3YXkpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcywKKyAgICAgICAgICAgIExpbmtDYXBhYmlsaXRpZXMgbGlua0NhcGFiaWxpdGllcykgewogICAgICAgICAvLyBOb3RlOiBub3QgcmVwb3J0aW5nIHRvIHRoZSBiYXR0ZXJ5IHN0YXRzIHNlcnZpY2UgaGVyZSwgYmVjYXVzZSB0aGUKICAgICAgICAgLy8gc3RhdHVzIGJhciB0YWtlcyBjYXJlIG9mIHRoYXQgYWZ0ZXIgdGFraW5nIGludG8gYWNjb3VudCBhbGwgb2YgdGhlCiAgICAgICAgIC8vIHJlcXVpcmVkIGluZm8uCkBAIC01NTAsMjkgKzU4MiwyNiBAQAogICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSwgcmVhc29uKTsKICAgICAgICAgfQotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOwotICAgICAgICBTdHJpbmcgdHlwZXMgPSBuZXcgU3RyaW5nKCIiKTsKLSAgICAgICAgaWYgKGFwblR5cGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHR5cGVzID0gYXBuVHlwZXNbMF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFwblR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHlwZXMgPSB0eXBlcysiLCIrYXBuVHlwZXNbaV07CisgICAgICAgIGlmIChsaW5rUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9MSU5LX1BST1BFUlRJRVNfS0VZLCBsaW5rUHJvcGVydGllcyk7CisgICAgICAgICAgICBTdHJpbmcgaWZhY2UgPSBsaW5rUHJvcGVydGllcy5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZLCBpZmFjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSwgdHlwZXMpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSwgaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIGludCBnYXRld2F5QWRkciA9IDA7Ci0gICAgICAgIGlmIChnYXRld2F5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdhdGV3YXlBZGRyID0gTmV0d29ya1V0aWxzLnY0U3RyaW5nVG9JbnQoZ2F0ZXdheSk7CisgICAgICAgIGlmIChsaW5rQ2FwYWJpbGl0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0xJTktfQ0FQQUJJTElUSUVTX0tFWSwgbGlua0NhcGFiaWxpdGllcyk7CiAgICAgICAgIH0KLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfR0FURVdBWV9LRVksIGdhdGV3YXlBZGRyKTsKLQorICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVksIGFwblR5cGUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKKyAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuRkFJTFVSRV9SRUFTT05fS0VZLCByZWFzb24pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVksIGFwblR5cGUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCmluZGV4IGE5M2E2ZWUuLmQ4NDFjYjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCkBAIC02MCw2ICs2MCw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKIGltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKQEAgLTgzLDggKzg1LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RJTkdfVEhSRVNIT0xEID0gMSAqIDEwMjQgKiAxMDI0OwogCiAgICAgcHJpdmF0ZSBpbnQgbVBvbGljeVBvbGxQZXJpb2RTZWM7Ci0gICAgcHJpdmF0ZSBsb25nIG1Qb2xpY3lUaHJlc2hvbGQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgcHJpdmF0ZSBBdG9taWNMb25nIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOwogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lSZXNldERheTsgLy8gMS0yOAogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2s7CiAKQEAgLTExNCw3ICsxMTYsNyBAQAogICAgIHByaXZhdGUgSW50ZXJmYWNlT2JzZXJ2ZXIgbUludGVyZmFjZU9ic2VydmVyOwogICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKIAotICAgIHByaXZhdGUgaW50IG1UaHJvdHRsZUluZGV4OyAvLyAwIGZvciBub25lLCAxIGZvciBmaXJzdCB0aHJvdHRsZSB2YWwsIDIgZm9yIG5leHQsIGV0YworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtVGhyb3R0bGVJbmRleDsgLy8gMCBmb3Igbm9uZSwgMSBmb3IgZmlyc3QgdGhyb3R0bGUgdmFsLCAyIGZvciBuZXh0LCBldGMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRCA9IC0xOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCAgID0gIDA7CiAKQEAgLTEyNiw2ICsxMjgsMTAgQEAKICAgICAgICAgaWYgKFZEQkcpIFNsb2cudihUQUcsICJTdGFydGluZyBUaHJvdHRsZVNlcnZpY2UiKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwogICAgICAgICBtTnRwQWN0aXZlID0gZmFsc2U7CiAKICAgICAgICAgbUlmYWNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmNvbmZpZ19kYXRhdXNlX2lmYWNlKTsKQEAgLTIxNCw3ICsyMjAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZyBudHBUb1dhbGxUaW1lKGxvbmcgbnRwVGltZSkgewotICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSgpOworICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSh0cnVlKTsgLy8gZG8gaXQgcXVpY2tseQogICAgICAgICBsb25nIGxvY2FsTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIHJldHVybiBsb2NhbE5vdyArIChudHBUaW1lIC0gYmVzdE5vdyk7CiAgICAgfQpAQCAtMjIyLDQwICsyMjgsNDIgQEAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRSZXNldFRpbWUoU3RyaW5nIGlmYWNlKSB7CisgICAgcHVibGljIGxvbmcgZ2V0UmVzZXRUaW1lKFN0cmluZyBpZmFjZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBsb25nIHJlc2V0VGltZSA9IDA7CiAgICAgICAgIGlmIChtUmVjb3JkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzZXRUaW1lID0gbnRwVG9XYWxsVGltZShtUmVjb3JkZXIuZ2V0UGVyaW9kRW5kKCkpOworICAgICAgICAgICAgcmVzZXRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZEVuZCgpOwogICAgICAgICB9CisgICAgICAgIHJlc2V0VGltZSA9IG50cFRvV2FsbFRpbWUocmVzZXRUaW1lKTsKICAgICAgICAgcmV0dXJuIHJlc2V0VGltZTsKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0UGVyaW9kU3RhcnRUaW1lKFN0cmluZyBpZmFjZSkgewotICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgIHB1YmxpYyBsb25nIGdldFBlcmlvZFN0YXJ0VGltZShTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSAwOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAobVJlY29yZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0VGltZSA9IG50cFRvV2FsbFRpbWUobVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCkpOworICAgICAgICAgICAgc3RhcnRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCk7CiAgICAgICAgIH0KKyAgICAgICAgc3RhcnRUaW1lID0gbnRwVG9XYWxsVGltZShzdGFydFRpbWUpOwogICAgICAgICByZXR1cm4gc3RhcnRUaW1lOwogICAgIH0KICAgICAvL1RPRE8gLSBhIGJldHRlciBuYW1lPyAgZ2V0Q2xpZmZCeXRlQ291bnRUaHJlc2hvbGQ/CiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Q2xpZmZUaHJlc2hvbGQoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRDbGlmZlRocmVzaG9sZChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyZXNob2xkLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAvLyBUT0RPIC0gYSBiZXR0ZXIgbmFtZT8gZ2V0VGhyb3R0bGVSYXRlPwogICAgIC8vIFRPRE8gLSBmZXRjaCBmb3IgdGhlIGlmYWNlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgeworICAgIHB1YmxpYyBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTI2NywxMCArMjc1LDkgQEAKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRCeXRlQ291bnQoU3RyaW5nIGlmYWNlLCBpbnQgZGlyLCBpbnQgcGVyaW9kLCBpbnQgYWdvKSB7CisgICAgcHVibGljIGxvbmcgZ2V0Qnl0ZUNvdW50KFN0cmluZyBpZmFjZSwgaW50IGRpciwgaW50IHBlcmlvZCwgaW50IGFnbykgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAoKHBlcmlvZCA9PSBUaHJvdHRsZU1hbmFnZXIuUEVSSU9EX0NZQ0xFKSAmJgotICAgICAgICAgICAgICAgIChtUmVjb3JkZXIgIT0gbnVsbCkpIHsKKyAgICAgICAgaWYgKChwZXJpb2QgPT0gVGhyb3R0bGVNYW5hZ2VyLlBFUklPRF9DWUNMRSkgJiYgKG1SZWNvcmRlciAhPSBudWxsKSkgewogICAgICAgICAgICAgaWYgKGRpciA9PSBUaHJvdHRsZU1hbmFnZXIuRElSRUNUSU9OX1RYKSByZXR1cm4gbVJlY29yZGVyLmdldFBlcmlvZFR4KGFnbyk7CiAgICAgICAgICAgICBpZiAoZGlyID09IFRocm90dGxlTWFuYWdlci5ESVJFQ1RJT05fUlgpIHJldHVybiBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoYWdvKTsKICAgICAgICAgfQpAQCAtMjc5LDEwICsyODYsMTAgQEAKIAogICAgIC8vIFRPRE8gLSBhIGJldHRlciBuYW1lIC0gZ2V0Q3VycmVudFRocm90dGxlUmF0ZT8KICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRocm90dGxlKFN0cmluZyBpZmFjZSkgeworICAgIHB1YmxpYyBpbnQgZ2V0VGhyb3R0bGUoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzA1LDIyICszMTIsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sIG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1JFU0VUKSk7CiAKLSAgICAgICAgLy8gdXNlIGEgbmV3IHRocmVhZCBhcyB3ZSBkb24ndCB3YW50IHRvIHN0YWxsIHRoZSBzeXN0ZW0gZm9yIGZpbGUgd3JpdGVzCi0gICAgICAgIG1UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOwotICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9SRUJPT1RfUkVDT1ZFUlkpLnNlbmRUb1RhcmdldCgpOwotCi0gICAgICAgIG1JbnRlcmZhY2VPYnNlcnZlciA9IG5ldyBJbnRlcmZhY2VPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfSUZBQ0VfVVAsIG1JZmFjZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTk1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobUludGVyZmFjZU9ic2VydmVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcmVnaXN0ZXIgSW50ZXJmYWNlT2JzZXJ2ZXIgIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfUE9MSUNZX0NIQU5HRUQpOwotICAgICAgICBtU2V0dGluZ3NPYnNlcnZlci5vYnNlcnZlKG1Db250ZXh0KTsKLQogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0zMzcsNiArMzI4LDIyIEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgYSBuZXcgdGhyZWFkIGFzIHdlIGRvbid0IHdhbnQgdG8gc3RhbGwgdGhlIHN5c3RlbSBmb3IgZmlsZSB3cml0ZXMKKyAgICAgICAgbVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKG1UaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1JFQk9PVF9SRUNPVkVSWSkuc2VuZFRvVGFyZ2V0KCk7CisKKyAgICAgICAgbUludGVyZmFjZU9ic2VydmVyID0gbmV3IEludGVyZmFjZU9ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9JRkFDRV9VUCwgbUlmYWNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1OTVNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlcihtSW50ZXJmYWNlT2JzZXJ2ZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCByZWdpc3RlciBJbnRlcmZhY2VPYnNlcnZlciAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9QT0xJQ1lfQ0hBTkdFRCk7CisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyLm9ic2VydmUobUNvbnRleHQpOwogICAgIH0KIAogCkBAIC0zNzUsNyArMzgyLDcgQEAKICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzaW0gY2hhbmdlIFRPRE8KICAgICAgICAgICAgIC8vIHJlcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBwb2xpY3kgY2hhbmdlCiAKLSAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEKTsKIAogICAgICAgICAgICAgbVJlY29yZGVyID0gbmV3IERhdGFSZWNvcmRlcihtQ29udGV4dCwgVGhyb3R0bGVTZXJ2aWNlLnRoaXMpOwogCkBAIC00MDMsMTUgKzQxMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyZXNob2xkX2J5dGVzKTsKICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyb3R0bGVfa2JpdHNwcyk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1RIUkVTSE9MRF9CWVRFUywgZGVmYXVsdFRocmVzaG9sZCk7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgPSBURVNUSU5HX1BPTExJTkdfUEVSSU9EX1NFQzsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFRFU1RJTkdfVEhSRVNIT0xEOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgdGhyZXNob2xkID0gU2V0dGluZ3MuU2VjdXJlLmdldExvbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9USFJFU0hPTERfQllURVMsIGRlZmF1bHRUaHJlc2hvbGQpOworICAgICAgICAgICAgaW50IHZhbHVlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7CisKKyAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KHRocmVzaG9sZCk7CisgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5zZXQodmFsdWUpOworICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKKyAgICAgICAgICAgICAgICBtUG9saWN5UG9sbFBlcmlvZFNlYyA9IFRFU1RJTkdfUE9MTElOR19QRVJJT0RfU0VDOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KFRFU1RJTkdfVEhSRVNIT0xEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVBvbGljeVJlc2V0RGF5ID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKQEAgLTQyMywxMCArNDMxLDggQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9SRVNFVF9EQVksIG1Qb2xpY3lSZXNldERheSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JZmFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWZhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KDApOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgZGVmYXVsdE5vdGlmaWNhdGlvblR5cGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKApAQCAtNDM3LDE1ICs0NDMsMTYgQEAKICAgICAgICAgICAgIG1NYXhOdHBDYWNoZUFnZVNlYyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9NQVhfTlRQX0NBQ0hFX0FHRV9TRUMsIE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyk7CiAKLSAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkICE9IDApKSB7CisgICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZC5nZXQoKSAhPSAwKSkgewogICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblBvbGljeUNoYW5nZWQgdGVzdGluZz0iICsgdGVzdGluZyArIiwgcGVyaW9kPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiLCB2YWx1ZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArICIsIG5vdGVUeXBlPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKyBtTWF4TnRwQ2FjaGVBZ2VTZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgdmFsdWU9IiArIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBub3RlVHlwZT0iICsgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgbU1heE50cENhY2hlQWdlU2VjKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZm9yY2UgdXBkYXRlcwotICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEOworICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQpOwogCiAgICAgICAgICAgICBvblJlc2V0QWxhcm0oKTsKIApAQCAtNDg3LDcgKzQ5NCw3IEBACiAgICAgICAgICAgICBsb25nIHBlcmlvZFJ4ID0gbVJlY29yZGVyLmdldFBlcmlvZFJ4KDApOwogICAgICAgICAgICAgbG9uZyBwZXJpb2RUeCA9IG1SZWNvcmRlci5nZXRQZXJpb2RUeCgwKTsKICAgICAgICAgICAgIGxvbmcgdG90YWwgPSBwZXJpb2RSeCArIHBlcmlvZFR4OwotICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkLmdldCgpICE9IDApKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uUG9sbEFsYXJtIC0gcm9hbWluZyA9IiArIHJvYW1pbmcgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcmVhZCA9IiArIGluY1JlYWQgKyAiLCB3cml0dGVuID0iICsgaW5jV3JpdGUgKyAiLCBuZXcgdG90YWwgPSIgKyB0b3RhbCk7CiAgICAgICAgICAgICB9CkBAIC01MTAsMTEgKzUxNywxMSBAQAogICAgICAgICBwcml2YXRlIHZvaWQgb25JZmFjZVVwKCkgewogICAgICAgICAgICAgLy8gaWYgd2Ugd2VyZSB0aHJvdHRsZWQgYmVmb3JlLCBiZSBzdXJlIGFuZCBzZXQgaXQgYWdhaW4gLSB0aGUgaWZhY2Ugd2VudCBkb3duCiAgICAgICAgICAgICAvLyAoYW5kIG1heSBoYXZlIGRpc2FwcGVhcmVkIGFsbCB0b2dldGhlcikgYW5kIHRoZXNlIHNldHRpbmdzIHdlcmUgbG9zdAotICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbU5NU2VydmljZS5zZXRJbnRlcmZhY2VUaHJvdHRsZShtSWZhY2UsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLCBtUG9saWN5VGhyb3R0bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCksIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiZXJyb3Igc2V0dGluZyBUaHJvdHRsZTogIiArIGUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTUyMyw3ICs1MzAsOCBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1Rocm90dGxlQW5kUG9zdE5vdGlmaWNhdGlvbihsb25nIGN1cnJlbnRUb3RhbCkgewogICAgICAgICAgICAgLy8gaXMgdGhyb3R0bGluZyBlbmFibGVkPwotICAgICAgICAgICAgaWYgKG1Qb2xpY3lUaHJlc2hvbGQgPT0gMCkgeworICAgICAgICAgICAgbG9uZyB0aHJlc2hvbGQgPSBtUG9saWN5VGhyZXNob2xkLmdldCgpOworICAgICAgICAgICAgaWYgKHRocmVzaG9sZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTUzNSwxNSArNTQzLDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gdGhyb3R0bGUKLSAgICAgICAgICAgIGlmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJUaHJlc2hvbGQgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiIGV4Y2VlZGVkISIpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRUb3RhbCA+IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldCgxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgIlRocmVzaG9sZCAiICsgdGhyZXNob2xkICsgIiBleGNlZWRlZCEiKTsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSwgbVBvbGljeVRocm90dGxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSwgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImVycm9yIHNldHRpbmcgVGhyb3R0bGU6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU2LDcgKzU2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLkZMQUdfT05HT0lOR19FVkVOVCk7CiAKICAgICAgICAgICAgICAgICAgICAgSW50ZW50IGJyb2FkY2FzdCA9IG5ldyBJbnRlbnQoVGhyb3R0bGVNYW5hZ2VyLlRIUk9UVExFX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdC5wdXRFeHRyYShUaHJvdHRsZU1hbmFnZXIuRVhUUkFfVEhST1RUTEVfTEVWRUwsIG1Qb2xpY3lUaHJvdHRsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LnB1dEV4dHJhKFRocm90dGxlTWFuYWdlci5FWFRSQV9USFJPVFRMRV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoYnJvYWRjYXN0KTsKIAogICAgICAgICAgICAgICAgIH0gLy8gZWxzZSBhbHJlYWR5IHVwIQpAQCAtNTc5LDggKzU4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIGxvbmcgcGVyaW9kTGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZVVzZWQgPSBub3cgLSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB3YXJuaW5nVGhyZXNob2xkID0gMiptUG9saWN5VGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkLzQpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgd2FybmluZ1RocmVzaG9sZCA9IDIqdGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiB0aHJlc2hvbGQvNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChSLmRyYXdhYmxlLnN0YXRfc3lzX3Rocm90dGxlZCk7CkBAIC02MjUsMTEgKzYzMiw5IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCAhPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVGhyb3R0bGVTZXJ2aWNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhclRocm90dGxlQW5kTm90aWZpY2F0aW9uKCkgeworICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4LmdldCgpICE9IFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKSB7CisgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwgLTEsIC0xKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtNjg3LDEyICs2OTIsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBvblJlc2V0QWxhcm0oKSB7Ci0gICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZCAhPSAwKSkgeworICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25SZXNldEFsYXJtIC0gbGFzdCBwZXJpb2QgaGFkICIgKyBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoMCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyByZWFkIGFuZCAiICsgbVJlY29yZGVyLmdldFBlcmlvZFR4KDApICsgIiB3cml0dGVuIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoZmFsc2UpOwogCiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSB8fCAobU50cFNlcnZlciA9PSBudWxsKSkgewogICAgICAgICAgICAgICAgIENhbGVuZGFyIGVuZCA9IGNhbGN1bGF0ZVBlcmlvZEVuZChub3cpOwpAQCAtNzE5LDIwICs3MjQsMjMgQEAKIAogICAgICAgICAvLyB3aWxsIHRyeSB0byBnZXQgdGhlIG50cCB0aW1lIGFuZCBzd2l0Y2ggdG8gaXQgaWYgZm91bmQuCiAgICAgICAgIC8vIHdpbGwgYWxzbyBjYWNoZSB0aGUgdGltZSBzbyB3ZSBkb24ndCBmZXRjaCBpdCByZXBlYXRlZGx5LgotICAgICAgICBnZXRCZXN0VGltZSgpOworICAgICAgICBnZXRCZXN0VGltZShmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyA9IDYwICogNjAgKiAyNDsgLy8gMSBkYXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05UUF9GRVRDSF9XQUlUID0gMTAgKiAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0ZFVENIX1dBSVQgPSAyMCAqIDEwMDA7CiAgICAgcHJpdmF0ZSBpbnQgbU1heE50cENhY2hlQWdlU2VjID0gTUFYX05UUF9DQUNIRV9BR0VfU0VDOwogICAgIHByaXZhdGUgbG9uZyBjYWNoZWROdHA7CiAgICAgcHJpdmF0ZSBsb25nIGNhY2hlZE50cFRpbWVzdGFtcDsKIAotICAgIHByaXZhdGUgbG9uZyBnZXRCZXN0VGltZSgpIHsKKyAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyB0aWVkIHRvIFVJIGFuZCBBTlIncyBhcmUgYSBkYW5nZXIsIHJlcXVlc3QgYSBmYXN0IHJlc3VsdAorICAgIC8vIHRoZSByZWd1bGFyIHBvbGxpbmcgc2hvdWxkIGhhdmUgdXBkYXRlZCB0aGUgY2FjaGVkIHRpbWUgcmVjZW50bHkgdXNpbmcgdGhlCisgICAgLy8gc2xvd2VyIG1ldGhvZCAoIWZhc3QpCisgICAgcHJpdmF0ZSBsb25nIGdldEJlc3RUaW1lKGJvb2xlYW4gZmFzdCkgewogICAgICAgICBpZiAobU50cFNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSkgewogICAgICAgICAgICAgICAgIGxvbmcgbnRwQWdlID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBjYWNoZWROdHBUaW1lc3RhbXA7Ci0gICAgICAgICAgICAgICAgaWYgKG50cEFnZSA8IG1NYXhOdHBDYWNoZUFnZVNlYyAqIDEwMDApIHsKKyAgICAgICAgICAgICAgICBpZiAobnRwQWdlIDwgbU1heE50cENhY2hlQWdlU2VjICogMTAwMCB8fCBmYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBTbG9nLnYoVEFHLCAidXNpbmcgY2FjaGVkIHRpbWUiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE50cCArIG50cEFnZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDI1LDM5ICsxMDMzLDU3IEBACiAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImRhdGEgZmlsZSBlbXB0eSIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgICAgICBpbnQgcGFyc2VkVXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGluc3VmZmljaWVudCBsZW5ndGggLSBpZ25vcmluZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gcGFyc2VkID0gZGF0YS5zcGxpdCgiOiIpOworICAgICAgICAgICAgaW50IHBhcnNlZFVzZWQgPSAwOworICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggaW5zdWZmaWNpZW50IGxlbmd0aCAtIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpbnQgcGVyaW9kQ291bnQ7CisgICAgICAgICAgICBsb25nW10gcGVyaW9kUnhEYXRhOworICAgICAgICAgICAgbG9uZ1tdIHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgIGludCBjdXJyZW50UGVyaW9kOworICAgICAgICAgICAgQ2FsZW5kYXIgcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICBDYWxlbmRhciBwZXJpb2RFbmQ7CisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmIChJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKSAhPSBEQVRBX0ZJTEVfVkVSU0lPTikgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicmVhZGluZyBkYXRhIGZpbGUgd2l0aCBiYWQgdmVyc2lvbiAtIGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBtUGVyaW9kQ291bnQpKSB7CisgICAgICAgICAgICAgICAgcGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBwZXJpb2RDb3VudCkpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggYmFkIGxlbmd0aCAoIiArIHBhcnNlZC5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1KygyKm1QZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1ICsgKDIgKiBwZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcmlvZFJ4RGF0YSA9IG5ldyBsb25nW3BlcmlvZENvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcmlvZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kUnhEYXRhW2ldID0gTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJpb2RUeERhdGEgPSBuZXcgbG9uZ1twZXJpb2RDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJpb2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZFR4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kUnhEYXRhID0gbmV3IGxvbmdbbVBlcmlvZENvdW50XTsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbVBlcmlvZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVBlcmlvZFJ4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IG5ldyBsb25nW21QZXJpb2RDb3VudF07Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1QZXJpb2RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50UGVyaW9kID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0LnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOwotICAgICAgICAgICAgICAgIG1QZXJpb2RFbmQgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICBtUGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgICAgIGN1cnJlbnRQZXJpb2QgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKworICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kU3RhcnQuc2V0VGltZUluTWlsbGlzKExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKSk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgcGFyc2luZyBkYXRhIGZpbGUgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgeworICAgICAgICAgICAgICAgIG1QZXJpb2RDb3VudCA9IHBlcmlvZENvdW50OworICAgICAgICAgICAgICAgIG1QZXJpb2RSeERhdGEgPSBwZXJpb2RSeERhdGE7CisgICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFBlcmlvZCA9IGN1cnJlbnRQZXJpb2Q7CisgICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICAgICAgbVBlcmlvZEVuZCA9IHBlcmlvZEVuZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMDkxLDE1ICsxMTE3LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCi0gICAgICAgIHB3LnByaW50bG4oIlRoZSB0aHJlc2hvbGQgaXMgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKworICAgICAgICBwdy5wcmludGxuKCJUaGUgdGhyZXNob2xkIGlzICIgKyBtUG9saWN5VGhyZXNob2xkLmdldCgpICsKICAgICAgICAgICAgICAgICAiLCBhZnRlciB3aGljaCB5b3UgZXhwZXJpbmNlIHRocm90dGxpbmcgdG8gIiArCi0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgKyAia2JwcyIpOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgImticHMiKTsKICAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBwZXJpb2QgaXMgIiArCiAgICAgICAgICAgICAgICAgKG1SZWNvcmRlci5nZXRQZXJpb2RFbmQoKSAtIG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpKS8xMDAwICsgIiBzZWNvbmRzIGxvbmcgIiArCiAgICAgICAgICAgICAgICAgImFuZCBlbmRzIGluICIgKyAoZ2V0UmVzZXRUaW1lKG1JZmFjZSkgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgLyAxMDAwICsKICAgICAgICAgICAgICAgICAiIHNlY29uZHMuIik7CiAgICAgICAgIHB3LnByaW50bG4oIlBvbGxpbmcgZXZlcnkgIiArIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiBzZWNvbmRzIik7Ci0gICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgVGhyb3R0bGUgSW5kZXggaXMgIiArIG1UaHJvdHRsZUluZGV4KTsKKyAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBUaHJvdHRsZSBJbmRleCBpcyAiICsgbVRocm90dGxlSW5kZXguZ2V0KCkpOwogICAgICAgICBwdy5wcmludGxuKCJNYXggTlRQIENhY2hlIEFnZSBpcyAiICsgbU1heE50cENhY2hlQWdlU2VjKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1SZWNvcmRlci5nZXRQZXJpb2RDb3VudCgpOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhCmluZGV4IGQwOGZlOWIuLjU0NmU1ZjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5VRXZlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CkBAIC0xNDcsOCArMTQ4LDQzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG1vbml0b3JVc2JIb3N0QnVzKCk7CisKKyAgICAvLyBjYWxsZWQgZnJvbSBKTkkgaW4gbW9uaXRvclVzYkhvc3RCdXMoKQorICAgIHByaXZhdGUgdm9pZCB1c2JDYW1lcmFBZGRlZChpbnQgZGV2aWNlSUQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHAuRGV2aWNlLmdldENvbnRlbnRVcmkoZGV2aWNlSUQpKTsKKyAgICAgICAgTG9nLmQoVEFHLCAidXNiQ2FtZXJhQWRkZWQsIHNlbmRpbmcgIiArIGludGVudCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICAvLyBjYWxsZWQgZnJvbSBKTkkgaW4gbW9uaXRvclVzYkhvc3RCdXMoKQorICAgIHByaXZhdGUgdm9pZCB1c2JDYW1lcmFSZW1vdmVkKGludCBkZXZpY2VJRCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2IuQUNUSU9OX1VTQl9DQU1FUkFfREVUQUNIRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cC5EZXZpY2UuZ2V0Q29udGVudFVyaShkZXZpY2VJRCkpOworICAgICAgICBMb2cuZChUQUcsICJ1c2JDYW1lcmFSZW1vdmVkLCBzZW5kaW5nICIgKyBpbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRIb3N0U3VwcG9ydCgpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgdGhyZWFkIHRvIGNhbGwgaW50byBuYXRpdmUgY29kZSB0byB3YWl0IGZvciBVU0IgaG9zdCBldmVudHMuCisgICAgICAgIC8vIFRoaXMgdGhyZWFkIHdpbGwgY2FsbCB1cyBiYWNrIG9uIHVzYkNhbWVyYUFkZGVkIGFuZCB1c2JDYW1lcmFSZW1vdmVkLgorICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtb25pdG9yVXNiSG9zdEJ1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBuZXcgVGhyZWFkKG51bGwsIHJ1bm5hYmxlLCAiVXNiT2JzZXJ2ZXIgaG9zdCB0aHJlYWQiKS5zdGFydCgpOworICAgIH0KKwogICAgIHZvaWQgc3lzdGVtUmVhZHkoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfaGFzVXNiSG9zdFN1cHBvcnQpKSB7CisgICAgICAgICAgICAgICAgLy8gc3RhcnQgbW9uaXRvcmluZyBmb3IgY29ubmVjdGVkIFVTQiBkZXZpY2VzCisgICAgICAgICAgICAgICAgaW5pdEhvc3RTdXBwb3J0KCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHVwZGF0ZSgpOwogICAgICAgICAgICAgbVN5c3RlbVJlYWR5ID0gdHJ1ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKaW5kZXggM2Q5NWJmMC4uNTQwYzdmZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsMTA5ICsxNiw4OSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxJTkc7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxJTkc7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9VTktOT1dOOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9ESVNBQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9FTkFCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0ZBSUxFRDsKLQogaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlTWFjaGluZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLktleU1nbXQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JbnRlcmZhY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Xb3JrU291cmNlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkJpdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHM7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLklCYWNrdXBNYW5hZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5CYXR0ZXJ5U3RhdHNTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIC8qKgogICogV2lmaVNlcnZpY2UgaGFuZGxlcyByZW1vdGUgV2lGaSBvcGVyYXRpb24gcmVxdWVzdHMgYnkgaW1wbGVtZW50aW5nCi0gKiB0aGUgSVdpZmlNYW5hZ2VyIGludGVyZmFjZS4gSXQgYWxzbyBjcmVhdGVzIGEgV2lmaU1vbml0b3IgdG8gbGlzdGVuCi0gKiBmb3IgV2lmaS1yZWxhdGVkIGV2ZW50cy4KKyAqIHRoZSBJV2lmaU1hbmFnZXIgaW50ZXJmYWNlLgogICoKICAqIEBoaWRlCiAgKi8KKy8vVE9ETzogQ2xlYW4gdXAgbXVsdGlwbGUgbG9ja3MgYW5kIGltcGxlbWVudCBXaWZpU2VydmljZQorLy8gYXMgYSBTTSB0byB0cmFjayBzb2Z0IEFQL2NsaWVudC9hZGhvYyBicmluZyB1cCBiYXNlZAorLy8gb24gZGV2aWNlIGlkbGUgc3RhdGUsIGFpcnBsYW5lIG1vZGUgYW5kIGJvb3QuCisKIHB1YmxpYyBjbGFzcyBXaWZpU2VydmljZSBleHRlbmRzIElXaWZpTWFuYWdlci5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlTZXJ2aWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc2NhblJlc3VsdFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlx0KyIpOwotICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlVHJhY2tlciBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICAvKiBUT0RPOiBmZXRjaCBhIGNvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVEFQX0lGQUNFID0gIndsMC4xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CisKKyAgICBwcml2YXRlIGZpbmFsIFdpZmlTdGF0ZU1hY2hpbmUgbVdpZmlTdGF0ZU1hY2hpbmU7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVdpZmlBcFN0YXRlOwogCiAgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKICAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbUlkbGVJbnRlbnQ7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1CbHVldG9vdGhBMmRwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRExFX1JFUVVFU1QgPSAwOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU2NyZWVuT2ZmOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRGV2aWNlSWRsZTsKICAgICBwcml2YXRlIGludCBtUGx1Z2dlZFR5cGU7CiAKLSAgICBwcml2YXRlIGVudW0gRHJpdmVyQWN0aW9uIHtEUklWRVJfVU5MT0FELCBOT19EUklWRVJfVU5MT0FEfTsKLQogICAgIC8vIHRydWUgaWYgdGhlIHVzZXIgZW5hYmxlZCBXaWZpIHdoaWxlIGluIGFpcnBsYW5lIG1vZGUKLSAgICBwcml2YXRlIGJvb2xlYW4gbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuOworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4gPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAKICAgICBwcml2YXRlIGZpbmFsIExvY2tMaXN0IG1Mb2NrcyA9IG5ldyBMb2NrTGlzdCgpOwogICAgIC8vIHNvbWUgd2lmaSBsb2NrIHN0YXRpc3RpY3MKLSAgICBwcml2YXRlIGludCBtRnVsbEhpZ2hQZXJmTG9ja3NBY3F1aXJlZDsKLSAgICBwcml2YXRlIGludCBtRnVsbEhpZ2hQZXJmTG9ja3NSZWxlYXNlZDsKICAgICBwcml2YXRlIGludCBtRnVsbExvY2tzQWNxdWlyZWQ7CiAgICAgcHJpdmF0ZSBpbnQgbUZ1bGxMb2Nrc1JlbGVhc2VkOwogICAgIHByaXZhdGUgaW50IG1TY2FuTG9ja3NBY3F1aXJlZDsKQEAgLTEzMSw5ICsxMTEsNyBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBJQmF0dGVyeVN0YXRzIG1CYXR0ZXJ5U3RhdHM7CiAKLSAgICBwcml2YXRlIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UgbndTZXJ2aWNlOwogICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOwotICAgIHByaXZhdGUgV2lmaVdhdGNoZG9nU2VydmljZSBtV2lmaVdhdGNoZG9nU2VydmljZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtV2lmaVJlZ2V4czsKIAogICAgIC8qKgpAQCAtMTQ1LDY4ICsxMjMsNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9JRExFX01JTExJUyA9IDE1ICogNjAgKiAxMDAwOyAvKiAxNSBtaW51dGVzICovCiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FLRUxPQ0tfVEFHID0gIip3aWZpKiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byBob2xkIHRoZSB3YWtlIGxvY2sgYWZ0ZXIgYSBkaXNjb25uZWN0Ci0gICAgICogY2F1c2VkIGJ5IHN0b3BwaW5nIHRoZSBkcml2ZXIuIEVzdGFibGlzaGluZyBhbiBFREdFIGNvbm5lY3Rpb24gaGFzIGJlZW4KLSAgICAgKiBvYnNlcnZlZCB0byB0YWtlIGFib3V0IDUgc2Vjb25kcyB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gVGhpcwotICAgICAqIHByb3ZpZGVzIGEgYml0IG9mIGV4dHJhIG1hcmdpbi4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI1dJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TfS4KLSAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGEgU2V0dGluZ3MuU2VjdXJlIHZhbHVlIGlzIG5vdCBwcmVzZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQgPSA4MDAwOwotCi0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgZHJpdmVyLXN0b3Agb3BlcmF0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNEcml2ZXJTdG9wV2FrZUxvY2s7Ci0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgb3RoZXIgb3BlcmF0aW9ucwotICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzV2FrZUxvY2s7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfV0lGSSAgICAgICAgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0RJU0FCTEVfV0lGSSAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RPUF9XSUZJICAgICAgICAgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9XSUZJICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0sgICA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVVBEQVRFX1NUQVRFICAgICAgID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UICA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU0VUX0NIQU5ORUxTICAgICAgID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfTkVUV09SS1MgICAgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUQVJUX1NDQU4gICAgICAgICA9IDEwOwotCi0KLSAgICBwcml2YXRlIGZpbmFsICBXaWZpSGFuZGxlciBtV2lmaUhhbmRsZXI7Ci0KLSAgICAvKgotICAgICAqIENhY2hlIG9mIHNjYW4gcmVzdWx0cyBvYmplY3RzIChzaXplIGlzIHNvbWV3aGF0IGFyYml0cmFyeSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7Ci0KLSAgICAvKgotICAgICAqIENoYXJhY3RlciBidWZmZXIgdXNlZCB0byBwYXJzZSBzY2FuIHJlc3VsdHMgKG9wdGltaXphdGlvbikKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQlVGRkVSX1NJWkUgPSA1MTI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkUmVjb25maWc7Ci0KLSAgICAvKioKLSAgICAgKiBUZW1wb3JhcnkgZm9yIGNvbXB1dGluZyBVSURTIHRoYXQgYXJlIHJlc3BvbnNpYmxlIGZvciBzdGFydGluZyBXSUZJLgotICAgICAqIFByb3RlY3RlZCBieSBtV2lmaVN0YXRlVHJhY2tlciBsb2NrLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgV29ya1NvdXJjZSBtVG1wV29ya1NvdXJjZSA9IG5ldyBXb3JrU291cmNlKCk7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RFbmFibGVVaWQgPSBQcm9jZXNzLm15VWlkKCk7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkgQVAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RBcEVuYWJsZVVpZCA9IFByb2Nlc3MubXlVaWQoKTsKLQotCiAgICAgLyoqCiAgICAgICogTnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGluIHZhcmlvdXMgcmVndWxhdG9yeSBkb21haW5zLgogICAgICAqIFRoaXMgbGlzdCBpcyBzdWZmaWNpZW50IGZvciA4MDIuMTFiL2cgbmV0d29ya3MgKDIuNEdIeiByYW5nZSkuCkBAIC0yMTYsNDcgKzEzMiw4NSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0lETEUgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5XaWZpTWFuYWdlci5hY3Rpb24uREVWSUNFX0lETEUiOwogCi0gICAgV2lmaVNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBXaWZpU3RhdGVUcmFja2VyIHRyYWNrZXIpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CisKKworICAgIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7CisKKyAgICAvLyBWYXJpYWJsZXMgcmVsYXRpbmcgdG8gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbgorICAgIC8qKgorICAgICAqIFRoZSBpY29uIHRvIHNob3cgaW4gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4gVGhpcyB3aWxsIGFsc28KKyAgICAgKiBiZSB0aGUgSUQgb2YgdGhlIE5vdGlmaWNhdGlvbiBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUgPQorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlOworICAgIC8qKgorICAgICAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgc2hvd24sIHdlIHdhaXQgdGhpcyBhbW91bnQgYmVmb3JlIHBvc3NpYmx5IHNob3dpbmcgaXQgYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVM7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc2V0IHRoZSBzZXR0aW5nIHRvIHNob3cgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvbkVuYWJsZWQ7CisgICAgLyoqCisgICAgICogT2JzZXJ2ZXMgdGhlIHVzZXIgc2V0dGluZyB0byBrZWVwIHtAbGluayAjbU5vdGlmaWNhdGlvbkVuYWJsZWR9IGluIHN5bmMuCisgICAgICovCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyOworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IG11c3QgYmUgYXQgbGVhc3QgdGhpcyB2YWx1ZSBmb3IgdXMKKyAgICAgKiB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lOworICAgIC8qKgorICAgICAqIFRoZSBOb3RpZmljYXRpb24gb2JqZWN0IGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNob3duLCBhcyBzZXQgYnkgdXMuIFRoYXQgaXMsIGlmIHRoZQorICAgICAqIHVzZXIgY2FuY2VscyB0aGUgbm90aWZpY2F0aW9uLCB3ZSB3aWxsIG5vdCByZWNlaXZlIHRoZSBjYWxsYmFjayBzbyB0aGlzCisgICAgICogd2lsbCBzdGlsbCBiZSB0cnVlLiBXZSBvbmx5IGd1YXJhbnRlZSBpZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZQorICAgICAqIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgY29udGludW91cyBzY2FucyB0aGF0IG11c3Qgb2NjdXIgYmVmb3JlIGNvbnNpZGVyIHRoZQorICAgICAqIHN1cHBsaWNhbnQgaW4gYSBzY2FubmluZyBzdGF0ZS4gVGhpcyBhbGxvd3Mgc3VwcGxpY2FudCB0byBhc3NvY2lhdGUgd2l0aAorICAgICAqIHJlbWVtYmVyZWQgbmV0d29ya3MgdGhhdCBhcmUgaW4gdGhlIHNjYW4gcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORyA9IDM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzY2FucyBzaW5jZSB0aGUgbGFzdCBuZXR3b3JrIHN0YXRlIGNoYW5nZS4gV2hlbiB0aGlzCisgICAgICogZXhjZWVkcyB7QGxpbmsgI05VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkd9LCB3ZSBjb25zaWRlciB0aGUKKyAgICAgKiBzdXBwbGljYW50IHRvIGFjdHVhbGx5IGJlIHNjYW5uaW5nLiBXaGVuIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZXMgdG8KKyAgICAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBzY2FubmluZywgd2UgcmVzZXQgdGhpcyB0byAwLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlOworCisgICAgLyoqCisgICAgICogVGVtcG9yYXJ5IGZvciBjb21wdXRpbmcgVUlEUyB0aGF0IGFyZSByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgV0lGSS4KKyAgICAgKiBQcm90ZWN0ZWQgYnkgbVdpZmlTdGF0ZVRyYWNrZXIgbG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFdvcmtTb3VyY2UgbVRtcFdvcmtTb3VyY2UgPSBuZXcgV29ya1NvdXJjZSgpOworCisgICAgV2lmaVNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIgPSB0cmFja2VyOwotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVSc3NpUG9sbGluZyh0cnVlKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUgPSBuZXcgV2lmaVN0YXRlTWFjaGluZShtQ29udGV4dCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOwogICAgICAgICBtQmF0dGVyeVN0YXRzID0gQmF0dGVyeVN0YXRzU2VydmljZS5nZXRTZXJ2aWNlKCk7CiAKLSAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwotICAgICAgICBud1NlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7Ci0KLSAgICAgICAgbVNjYW5SZXN1bHRDYWNoZSA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU2NhblJlc3VsdD4oCi0gICAgICAgICAgICBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFLCAwLjc1ZiwgdHJ1ZSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogTGltaXQgdGhlIGNhY2hlIHNpemUgYnkgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRQotICAgICAgICAgICAgICAgICAqIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5IGVsZGVzdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA8IHRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgSGFuZGxlclRocmVhZCB3aWZpVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldpZmlTZXJ2aWNlIik7Ci0gICAgICAgIHdpZmlUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbVdpZmlIYW5kbGVyID0gbmV3IFdpZmlIYW5kbGVyKHdpZmlUaHJlYWQuZ2V0TG9vcGVyKCkpOwotCi0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX0RJU0FCTEVEKTsKLSAgICAgICAgbVdpZmlBcFN0YXRlID0gV0lGSV9BUF9TVEFURV9ESVNBQkxFRDsKLQogICAgICAgICBtQWxhcm1NYW5hZ2VyID0gKEFsYXJtTWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUxBUk1fU0VSVklDRSk7CiAgICAgICAgIEludGVudCBpZGxlSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fREVWSUNFX0lETEUsIG51bGwpOwogICAgICAgICBtSWRsZUludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KG1Db250ZXh0LCBJRExFX1JFUVVFU1QsIGlkbGVJbnRlbnQsIDApOwogCi0gICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKLSAgICAgICAgc1dha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgV0FLRUxPQ0tfVEFHKTsKLSAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFdBS0VMT0NLX1RBRyk7CisgICAgICAgIEhhbmRsZXJUaHJlYWQgd2lmaVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJXaWZpU2VydmljZSIpOworICAgICAgICB3aWZpVGhyZWFkLnN0YXJ0KCk7CiAKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKICAgICAgICAgICAgICAgICBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXIgZmxhZyBpbmRpY2F0aW5nIHRoZSB1c2VyIGhhcyBvdmVyd3JpZGRlbiBhaXJwbGFuZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbi5zZXQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gYWlycGxhbmUgZGlzYWJsZSwgcmVzdG9yZSBXaWZpIGlmIHRoZSBzYXZlZCBzdGF0ZSBpbmRpY2F0ZXMgc28KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBaXJwbGFuZU1vZGVPbigpICYmIHRlc3RBbmRDbGVhcldpZmlTYXZlZFN0YXRlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQodHJ1ZSk7CkBAIC0yNzEsMTQgKzIyNSw1MCBAQAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKIAotICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYXZhaWxhYmxlID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FWQUlMQUJMRV9URVRIRVIpOwotICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWN0aXZlID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FDVElWRV9URVRIRVIpOwotICAgICAgICAgICAgICAgICAgdXBkYXRlVGV0aGVyU3RhdGUoYXZhaWxhYmxlLCBhY3RpdmUpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdmFpbGFibGUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9BVkFJTEFCTEVfVEVUSEVSKTsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWN0aXZlID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQUNUSVZFX1RFVEhFUik7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRldGhlclN0YXRlKGF2YWlsYWJsZSwgYWN0aXZlKTsKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sbmV3IEludGVudEZpbHRlcihDb25uZWN0aXZpdHlNYW5hZ2VyLkFDVElPTl9URVRIRVJfU1RBVEVfQ0hBTkdFRCkpOworCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pOworCisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIoCisgICAgICAgICAgICAgICAgbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCAmIGNsZWFyIG5vdGlmaWNhdGlvbiBvbiBhbnkgd2lmaSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mbyA9IChOZXR3b3JrSW5mbykgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgJiBjbGVhciBub3RpZmljYXRpb24gb24gYSBuZXR3b3JrIGNvbm5lY3QgJiBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXROb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIGZpbHRlcik7CisKKyAgICAgICAgLy8gU2V0dGluZyBpcyBpbiBzZWNvbmRzCisgICAgICAgIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX1JFUEVBVF9ERUxBWSwgOTAwKSAqIDEwMDBsOworICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciA9IG5ldyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlci5yZWdpc3RlcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjg3LDcgKzI3Nyw3IEBACiAgICAgICoKICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBhdCBib290IHRpbWUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFdpZmkoKSB7CisgICAgcHVibGljIHZvaWQgY2hlY2tBbmRTdGFydFdpZmkoKSB7CiAgICAgICAgIC8qIFN0YXJ0IGlmIFdpLUZpIGlzIGVuYWJsZWQgb3IgdGhlIHNhdmVkIHN0YXRlIGluZGljYXRlcyBXaS1GaSB3YXMgb24gKi8KICAgICAgICAgYm9vbGVhbiB3aWZpRW5hYmxlZCA9ICFpc0FpcnBsYW5lTW9kZU9uKCkKICAgICAgICAgICAgICAgICAmJiAoZ2V0UGVyc2lzdGVkV2lmaUVuYWJsZWQoKSB8fCB0ZXN0QW5kQ2xlYXJXaWZpU2F2ZWRTdGF0ZSgpKTsKQEAgLTMwNCw3ICsyOTQsMTAgQEAKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAKLSAgICAgICAgbUNtID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgaWYgKG1DbSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICB9CisKICAgICAgICAgbVdpZmlSZWdleHMgPSBtQ20uZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKTsKIAogICAgICAgICBmb3IgKFN0cmluZyBpbnRmIDogYXZhaWxhYmxlKSB7CkBAIC0zMjQsMTcgKzMxNywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIGNvbmZpZ3VyaW5nIGludGVyZmFjZSAiICsgaW50ZiArICIsIDoiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBBUCwgOiIgKyBlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIDAsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYobUNtLnRldGhlcihpbnRmKSAhPSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRFVEhFUl9FUlJPUl9OT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHRldGhlcmluZyAiK2ludGYpOworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHRldGhlcmluZyBvbiAiICsgaW50Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkKG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0zNzAsMTggKzM2MCwxMyBAQAogICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNyLCBTZXR0aW5ncy5TZWN1cmUuV0lGSV9PTiwgZW5hYmxlZCA/IDEgOiAwKTsKICAgICB9CiAKLSAgICBOZXR3b3JrU3RhdGVUcmFja2VyIGdldE5ldHdvcmtTdGF0ZVRyYWNrZXIoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcGluZ1N1cHBsaWNhbnQoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwaW5nU3VwcGxpY2FudCgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucGluZygpOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1BpbmdTdXBwbGljYW50KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zODksMTYwICszNzQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtV2lmaUhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwgTUVTU0FHRV9TVEFSVF9TQ0FOLCBmb3JjZUFjdGl2ZSA/IDEgOiAwLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc2V0V2lmaUVuYWJsZWQoYm9vbGVhbil9Ci0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlLCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVuYWJsZS9kaXNhYmxlIG9wZXJhdGlvbiB3YXMKLSAgICAgKiAgICAgICAgIHN0YXJ0ZWQgb3IgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaUhhbmRsZXIpIHsKLSAgICAgICAgICAgIC8vIGNhbGxlciBtYXkgbm90IGhhdmUgV0FLRV9MT0NLIHBlcm1pc3Npb24gLSBpdCdzIG5vdCByZXF1aXJlZCBoZXJlCi0gICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotCi0gICAgICAgICAgICBtTGFzdEVuYWJsZVVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICAvLyBzZXQgYSBmbGFnIGlmIHRoZSB1c2VyIGlzIGVuYWJsaW5nIFdpZmkgd2hpbGUgaW4gYWlycGxhbmUgbW9kZQotICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuID0gKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgaXNBaXJwbGFuZVRvZ2dsZWFibGUoKSk7Ci0gICAgICAgICAgICBzZW5kRW5hYmxlTWVzc2FnZShlbmFibGUsIHRydWUsIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlcy9kaXNhYmxlcyBXaS1GaSBzeW5jaHJvbm91c2x5LgotICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIHR1cm4gV2ktRmkgb24sIHtAY29kZSBmYWxzZX0gdG8gdHVybiBpdCBvZmYuCi0gICAgICogQHBhcmFtIHBlcnNpc3Qge0Bjb2RlIHRydWV9IGlmIHRoZSBzZXR0aW5nIHNob3VsZCBiZSBwZXJzaXN0ZWQuCi0gICAgICogQHBhcmFtIHVpZCBUaGUgVUlEIG9mIHRoZSBwcm9jZXNzIG1ha2luZyB0aGUgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIChvciBpZiB0aGUgZXhpc3Rpbmcgc3RhdGUKLSAgICAgKiAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0ZWQgc3RhdGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldFdpZmlFbmFibGVkQmxvY2tpbmcoYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gcGVyc2lzdCwgaW50IHVpZCkgewotICAgICAgICBmaW5hbCBpbnQgZXZlbnR1YWxXaWZpU3RhdGUgPSBlbmFibGUgPyBXSUZJX1NUQVRFX0VOQUJMRUQgOiBXSUZJX1NUQVRFX0RJU0FCTEVEOwotICAgICAgICBmaW5hbCBpbnQgd2lmaVN0YXRlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0KLSAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBldmVudHVhbFdpZmlTdGF0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgIW1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE11bHRpcGxlIGNhbGxzIHRvIHVucmVnaXN0ZXJSZWNlaXZlcigpIGNhdXNlIGV4Y2VwdGlvbiBhbmQgYSBzeXN0ZW0gY3Jhc2guCi0gICAgICAgICAqIFRoaXMgY2FuIGhhcHBlbiBpZiBhIHN1cHBsaWNhbnQgaXMgbG9zdCAob3IgZmlybXdhcmUgY3Jhc2ggb2NjdXJzKSBhbmQgdXNlciBpbmRpY2F0ZXMKLSAgICAgICAgICogZGlzYWJsZSB3aWZpIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICAgICAqIEF2b2lkIGRvaW5nIGEgZGlzYWJsZSB3aGVuIHRoZSBjdXJyZW50IFdpZmkgc3RhdGUgaXMgVU5LTk9XTgotICAgICAgICAgKiBUT0RPOiBIYW5kbGUgZHJpdmVyIGxvYWQgZmFpbCBhbmQgc3VwcGxpY2FudCBsb3N0IGFzIHNlcGVyYXRlIHN0YXRlcwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9VTktOT1dOKSAmJiAhZW5hYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmFpbCBXaWZpIGlmIEFQIGlzIGVuYWJsZWQKLSAgICAgICAgICogVE9ETzogRGVwcmVjYXRlIFdJRklfU1RBVEVfVU5LTk9XTiBhbmQgcmVuYW1lIGl0Ci0gICAgICAgICAqIFdJRklfU1RBVEVfRkFJTEVECi0gICAgICAgICAqLwotICAgICAgICBpZiAoKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpICYmIGVuYWJsZSkgewotICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKGVuYWJsZSA/IFdJRklfU1RBVEVfRU5BQkxJTkcgOiBXSUZJX1NUQVRFX0RJU0FCTElORywgdWlkKTsKLQotICAgICAgICBpZiAoZW5hYmxlKSB7Ci0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmxvYWREcml2ZXIoKSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gbG9hZCBXaS1GaSBkcml2ZXIuIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zdGFydFN1cHBsaWNhbnQoKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpOwotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgc3VwcGxpY2FudCBkYWVtb24uIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZWdpc3RlckZvckJyb2FkY2FzdHMoKTsKLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnN0YXJ0RXZlbnRMb29wKCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7Ci0gICAgICAgICAgIC8vIFJlbW92ZSBub3RpZmljYXRpb24gKGl0IHdpbGwgbm8tb3AgaWYgaXQgaXNuJ3QgdmlzaWJsZSkKLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zdG9wU3VwcGxpY2FudCgpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBzdG9wIHN1cHBsaWNhbnQgZGFlbW9uLiIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOLCB1aWQpOwotICAgICAgICAgICAgICAgIGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogUmVzZXQgY29ubmVjdGlvbnMgYW5kIGRpc2FibGUgaW50ZXJmYWNlCi0gICAgICAgICAgICAgKiBiZWZvcmUgd2UgdW5sb2FkIHRoZSBkcml2ZXIKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIucmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci51bmxvYWREcml2ZXIoKSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gdW5sb2FkIFdpLUZpIGRyaXZlci4iKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlcikgewotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWNjZXNzIQotCi0gICAgICAgIGlmIChwZXJzaXN0KSB7Ci0gICAgICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKGV2ZW50dWFsV2lmaVN0YXRlLCB1aWQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUVuYWJsZWRTdGF0ZShpbnQgd2lmaVN0YXRlLCBpbnQgdWlkKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlTdGF0ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldFdpZmlTdGF0ZSgpOwotCi0gICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9mZigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlCi0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFdpZmlTdGF0ZSh3aWZpU3RhdGUpOwotCi0gICAgICAgIC8vIEJyb2FkY2FzdAotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX1NUQVRFLCB3aWZpU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9TVEFURSwgcHJldmlvdXNXaWZpU3RhdGUpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0U2Nhbihmb3JjZUFjdGl2ZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCkgewpAQCAtNTYzLDYgKzM5NSw1MCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpRW5hYmxlZChib29sZWFuKX0KKyAgICAgKiBAcGFyYW0gZW5hYmxlIHtAY29kZSB0cnVlfSB0byBlbmFibGUsIHtAY29kZSBmYWxzZX0gdG8gZGlzYWJsZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZW5hYmxlL2Rpc2FibGUgb3BlcmF0aW9uIHdhcworICAgICAqICAgICAgICAgc3RhcnRlZCBvciBpcyBhbHJlYWR5IGluIHRoZSBxdWV1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiSW52b2tpbmcgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWRcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IGEgZmxhZyBpZiB0aGUgdXNlciBpcyBlbmFibGluZyBXaWZpIHdoaWxlIGluIGFpcnBsYW5lIG1vZGUKKyAgICAgICAgaWYgKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgaXNBaXJwbGFuZVRvZ2dsZWFibGUoKSkgeworICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLnNldCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIHJlcG9ydFN0YXJ0V29ya1NvdXJjZSgpOworICAgICAgICB9CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlFbmFibGVkKGVuYWJsZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbGVyIG1pZ2h0IG5vdCBoYXZlIFdSSVRFX1NFQ1VSRV9TRVRUSU5HUywKKyAgICAgICAgICogb25seSBDSEFOR0VfV0lGSV9TVEFURSBpcyBlbmZvcmNlZAorICAgICAgICAgKi8KKyAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQoZW5hYmxlKTsKKyAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworCisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIGlmICghbUlzUmVjZWl2ZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGb3JCcm9hZGNhc3RzKCk7CisgICAgICAgICAgICAgICAgbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtSXNSZWNlaXZlclJlZ2lzdGVyZWQpeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgICAgICBtSXNSZWNlaXZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjZ2V0V2lmaVN0YXRlKCl9CiAgICAgICogQHJldHVybiBPbmUgb2Yge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMRUR9LAogICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMSU5HfSwKQEAgLTU3Miw2NiArNDQ4LDU5IEBACiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRXaWZpRW5hYmxlZFN0YXRlKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2Rpc2Nvbm5lY3QoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZGlzY29ubmVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZWNvbm5lY3QoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5yZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlYXNzb2NpYXRlKCl9Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlYXNzb2NpYXRlKCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5yZWFzc29jaWF0ZSgpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFdpZmlTdGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpQXBFbmFibGVkKFdpZmlDb25maWd1cmF0aW9uLCBib29sZWFuKX0KICAgICAgKiBAcGFyYW0gd2lmaUNvbmZpZyBTU0lELCBzZWN1cml0eSBhbmQgY2hhbm5lbCBkZXRhaWxzIGFzCiAgICAgICogICAgICAgIHBhcnQgb2YgV2lmaUNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gZW5hYmxlZCwgdHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzdGFydCBvcGVyYXRpb24gd2FzCiAgICAgICogICAgICAgICBzdGFydGVkIG9yIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGVkKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtV2lmaUhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlIYW5kbGVyKSB7Ci0KKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IGNvbmZpZyBpZiB0aGVyZSBpcyBubyBleGlzdGluZyBjb25maWcgKi8KKyAgICAgICAgICAgIGlmICh3aWZpQ29uZmlnID09IG51bGwgJiYgKCh3aWZpQ29uZmlnID0gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpKSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIHdpZmlDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLlNTSUQgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcud2lmaV90ZXRoZXJfY29uZmlndXJlX3NzaWRfZGVmYXVsdCk7CisgICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoS2V5TWdtdC5OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsZXIgbWlnaHQgbm90IGhhdmUgV1JJVEVfU0VDVVJFX1NFVFRJTkdTLAorICAgICAgICAgICAgICogb25seSBDSEFOR0VfV0lGSV9TVEFURSBpcyBlbmZvcmNlZAorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKLQotICAgICAgICAgICAgbUxhc3RBcEVuYWJsZVVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICBzZW5kQWNjZXNzUG9pbnRNZXNzYWdlKGVuYWJsZWQsIHdpZmlDb25maWcsIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUFwRW5hYmxlZCh3aWZpQ29uZmlnLCBlbmFibGVkKTsKKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgV2lmaUNvbmZpZ3VyYXRpb24gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpIHsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlBcFN0YXRlKCl9CisgICAgICogQHJldHVybiBPbmUgb2Yge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0V2lmaUFwRW5hYmxlZFN0YXRlKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFdpZmlBcFN0YXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpQXBDb25maWd1cmF0aW9uKCl9CisgICAgICogQHJldHVybiBzb2Z0IGFjY2VzcyBwb2ludCBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkgewogICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOwogICAgICAgICBpbnQgYXV0aFR5cGU7CkBAIC02NDksNyArNTE4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRXaWZpQXBDb25maWd1cmF0aW9uKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI3NldFdpZmlBcENvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24pfQorICAgICAqIEBwYXJhbSB3aWZpQ29uZmlnIFdpZmlDb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHNvZnQgYWNjZXNzIHBvaW50CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZykgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwogICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgYm9vbGVhbiBpc1dwYTsKQEAgLTY2NSwxNDMgKzUzOCwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuYWJsZXMvZGlzYWJsZXMgV2ktRmkgQVAgc3luY2hyb25vdXNseS4gVGhlIGRyaXZlciBpcyBsb2FkZWQKLSAgICAgKiBhbmQgc29mdCBhY2Nlc3MgcG9pbnQgY29uZmlndXJlZCBhcyBhIHNpbmdsZSBvcGVyYXRpb24uCi0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gdHVybiBXaS1GaSBvbiwge0Bjb2RlIGZhbHNlfSB0byB0dXJuIGl0IG9mZi4KLSAgICAgKiBAcGFyYW0gdWlkIFRoZSBVSUQgb2YgdGhlIHByb2Nlc3MgbWFraW5nIHRoZSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSB3aWZpQ29uZmlnIFRoZSBXaWZpQ29uZmlndXJhdGlvbiBmb3IgQVAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIChvciBpZiB0aGUgZXhpc3Rpbmcgc3RhdGUKLSAgICAgKiAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0ZWQgc3RhdGUpCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2Rpc2Nvbm5lY3QoKX0KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0V2lmaUFwRW5hYmxlZEJsb2NraW5nKGJvb2xlYW4gZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLCBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7Ci0gICAgICAgIGZpbmFsIGludCBldmVudHVhbFdpZmlBcFN0YXRlID0gZW5hYmxlID8gV0lGSV9BUF9TVEFURV9FTkFCTEVEIDogV0lGSV9BUF9TVEFURV9ESVNBQkxFRDsKLQotICAgICAgICBpZiAobVdpZmlBcFN0YXRlID09IGV2ZW50dWFsV2lmaUFwU3RhdGUpIHsKLSAgICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gY2hhbmdlZCBvbiBhIHJ1bm5pbmcgYWNjZXNzIHBvaW50ICovCi0gICAgICAgICAgICBpZihlbmFibGUgJiYgKHdpZmlDb25maWcgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc2V0QWNjZXNzUG9pbnQod2lmaUNvbmZpZywgbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0SW50ZXJmYWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GVEFQX0lGQUNFKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIG53U2VydmljZSBkdXJpbmcgQVAgcmVzdGFydCIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBBUCwgOiIgKyBlZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmFpbCBBUCBpZiBXaWZpIGlzIGVuYWJsZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmICgobVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCkgPT0gV0lGSV9TVEFURV9FTkFCTEVEKSAmJiBlbmFibGUpIHsKLSAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoZW5hYmxlID8gV0lGSV9BUF9TVEFURV9FTkFCTElORyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSUZJX0FQX1NUQVRFX0RJU0FCTElORywgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0KLSAgICAgICAgaWYgKGVuYWJsZSkgewotCi0gICAgICAgICAgICAvKiBVc2UgZGVmYXVsdCBjb25maWcgaWYgdGhlcmUgaXMgbm8gZXhpc3RpbmcgY29uZmlnICovCi0gICAgICAgICAgICBpZiAod2lmaUNvbmZpZyA9PSBudWxsICYmICgod2lmaUNvbmZpZyA9IGdldFdpZmlBcENvbmZpZ3VyYXRpb24oKSkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB3aWZpQ29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5TU0lEID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLndpZmlfdGV0aGVyX2NvbmZpZ3VyZV9zc2lkX2RlZmF1bHQpOwotICAgICAgICAgICAgICAgIHdpZmlDb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KEtleU1nbXQuTk9ORSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBsb2FkIFdpLUZpIGRyaXZlciBmb3IgQVAgbW9kZSIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG53U2VydmljZS5zdGFydEFjY2Vzc1BvaW50KHdpZmlDb25maWcsIG1XaWZpU3RhdGVUcmFja2VyLmdldEludGVyZmFjZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOwotICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RhcnRBY2Nlc3NQb2ludCgpIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFdpZmlBcENvbmZpZ3VyYXRpb24od2lmaUNvbmZpZyk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBzdG9wQWNjZXNzUG9pbnQoKSIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgdWlkLCBEcml2ZXJBY3Rpb24uRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byB1bmxvYWQgV2ktRmkgZHJpdmVyIGZvciBBUCBtb2RlIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoZXZlbnR1YWxXaWZpQXBTdGF0ZSwgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmRpc2Nvbm5lY3RDb21tYW5kKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpQXBTdGF0ZSgpfQotICAgICAqIEByZXR1cm4gT25lIG9mIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTElOR30sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0ZBSUxFRH0KKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVjb25uZWN0KCl9CiAgICAgICovCi0gICAgcHVibGljIGludCBnZXRXaWZpQXBFbmFibGVkU3RhdGUoKSB7Ci0gICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBtV2lmaUFwU3RhdGU7CisgICAgcHVibGljIHZvaWQgcmVjb25uZWN0KCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5yZWNvbm5lY3RDb21tYW5kKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShpbnQgd2lmaUFQU3RhdGUsIGludCB1aWQsIERyaXZlckFjdGlvbiBmbGFnKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlBcFN0YXRlID0gbVdpZmlBcFN0YXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbmxvYWQgdGhlIGRyaXZlciBpZiBnb2luZyB0byBhIGZhaWxlZCBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChtV2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9GQUlMRUQpICYmIChmbGFnID09IERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKSkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAod2lmaUFQU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlBUFN0YXRlID09IFdJRklfQVBfU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgc3RhdGUKLSAgICAgICAgbVdpZmlBcFN0YXRlID0gd2lmaUFQU3RhdGU7Ci0KLSAgICAgICAgLy8gQnJvYWRjYXN0Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfQVBfU1RBVEUsIHdpZmlBUFN0YXRlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1BSRVZJT1VTX1dJRklfQVBfU1RBVEUsIHByZXZpb3VzV2lmaUFwU3RhdGUpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlYXNzb2NpYXRlKCl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhc3NvY2lhdGUoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlYXNzb2NpYXRlQ29tbWFuZCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODEwLDIxNyArNTY3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBTdHJpbmcgbGlzdFN0cjsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXZSBkb24ndCBjYWNoZSB0aGUgbGlzdCwgYmVjYXVzZSB3ZSB3YW50IHRvIGFsbG93Ci0gICAgICAgICAqIGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICAgICAqIGhhcyBiZWVuIG1vZGlmaWVkIHRocm91Z2ggc29tZSBleHRlcm5hbCBtZWFucywKLSAgICAgICAgICogc3VjaCBhcyB0aGUgd3BhX2NsaSBjb21tYW5kIGxpbmUgcHJvZ3JhbS4KLSAgICAgICAgICovCi0gICAgICAgIGxpc3RTdHIgPSBtV2lmaVN0YXRlVHJhY2tlci5saXN0TmV0d29ya3MoKTsKLQotICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFdpZmlDb25maWd1cmF0aW9uPigpOwotICAgICAgICBpZiAobGlzdFN0ciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldHdvcmtzOwotCi0gICAgICAgIFN0cmluZ1tdIGxpbmVzID0gbGlzdFN0ci5zcGxpdCgiXG4iKTsKLSAgICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgbGluZSwgd2hpY2ggaXMgYSBoZWFkZXIKLSAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IGxpbmVzW2ldLnNwbGl0KCJcdCIpOwotICAgICAgICAgICAvLyBuZXR3b3JrLWlkIHwgc3NpZCB8IGJzc2lkIHwgZmxhZ3MKLSAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICBjb25maWcubmV0d29ya0lkID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMF0pOwotICAgICAgICAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDMpIHsKLSAgICAgICAgICAgICAgIGlmIChyZXN1bHRbM10uaW5kZXhPZigiW0NVUlJFTlRdIikgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5DVVJSRU5UOwotICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0WzNdLmluZGV4T2YoIltESVNBQkxFRF0iKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkRJU0FCTEVEOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKLSAgICAgICAgICAgfQotICAgICAgICAgICByZWFkTmV0d29ya1ZhcmlhYmxlcyhjb25maWcpOwotICAgICAgICAgICBuZXR3b3Jrcy5hZGQoY29uZmlnKTsKLSAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldHdvcmtzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBzdXBwbGljYW50IGRhZW1vbiB0aGF0IGFyZSBuZWVkZWQgdG8KLSAgICAgKiBmaWxsIGluIHRoZSBXaWZpQ29uZmlndXJhdGlvbiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBzeW5jaHJvbml6YXRpb24gbW9uaXRvci4KLSAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdCB0byBiZSBmaWxsZWQgaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWROZXR3b3JrVmFyaWFibGVzKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgewotCi0gICAgICAgIGludCBuZXRJZCA9IGNvbmZpZy5uZXR3b3JrSWQ7Ci0gICAgICAgIGlmIChuZXRJZCA8IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogbWF5YmUgc2hvdWxkIGhhdmUgYSBuYXRpdmUgbWV0aG9kIHRoYXQgdGFrZXMgYW4gYXJyYXkgb2YKLSAgICAgICAgICogdmFyaWFibGUgbmFtZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzLiBCdXQgd2UnZCBzdGlsbAotICAgICAgICAgKiBiZSBkb2luZyBhIHJvdW5kIHRyaXAgdG8gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIGZvciBlYWNoIHZhcmlhYmxlLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBjb25maWcuU1NJRCA9IHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnLlNTSUQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBjb25maWcuQlNTSUQgPSB2YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lKTsKLSAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gLTE7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lKTsKLSAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSAhPSAwOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSk7Ci0gICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gLTE7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdXAgdG8gNCBXRVAga2V5cy4gTm90ZSB0aGF0IHRoZSBhY3R1YWwga2V5cyBhcmUgbm90IHBhc3NlZCBiYWNrLAotICAgICAgICAgKiBqdXN0IGEgIioiIGlmIHRoZSBrZXkgaXMgc2V0LCBvciB0aGUgbnVsbCBzdHJpbmcgb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgcHJpdmF0ZSBzaGFyZWQga2V5LiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBrZXlzIGFyZSBub3QgcGFzc2VkIGJhY2ssCi0gICAgICAgICAqIGp1c3QgYSAiKiIgaWYgdGhlIGtleSBpcyBzZXQsIG9yIHRoZSBudWxsIHN0cmluZyBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKGNvbmZpZy5uZXR3b3JrSWQsCi0gICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZFByb3RvY29scy5zZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKGNvbmZpZy5uZXR3b3JrSWQsCi0gICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbi5FbnRlcnByaXNlRmllbGQgZmllbGQgOgotICAgICAgICAgICAgICAgIGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgZmllbGQudmFyTmFtZSgpKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IGNvbmZpZy5lYXApIHZhbHVlID0gcmVtb3ZlRG91YmxlUXVvdGVzKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRG91YmxlUXVvdGVzKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgaWYgKHN0cmluZy5sZW5ndGgoKSA8PSAyKSByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEsIHN0cmluZy5sZW5ndGgoKSAtIDEpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9RdW90ZWRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotICAgICAgICByZXR1cm4gIlwiIiArIHN0cmluZyArICJcIiI7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0Q29uZmlndXJlZE5ldHdvcmtzKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDMwLDI4MCArNTc3LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIGludCBhZGRPclVwZGF0ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIHN1cHBsaWVkIG5ldHdvcmtJZCBpcyAtMSwgd2UgY3JlYXRlIGEgbmV3IGVtcHR5Ci0gICAgICAgICAqIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlLCB0aGUgbmV0d29ya0lkIHNob3VsZAotICAgICAgICAgKiByZWZlciB0byBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKLSAgICAgICAgYm9vbGVhbiBuZXdOZXR3b3JrID0gbmV0SWQgPT0gLTE7Ci0gICAgICAgIGJvb2xlYW4gZG9SZWNvbmZpZyA9IGZhbHNlOwotICAgICAgICAvLyBuZXR3b3JrSWQgb2YgLTEgbWVhbnMgd2Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbmV0d29yawotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpU3RhdGVUcmFja2VyKSB7Ci0gICAgICAgICAgICBpZiAobmV3TmV0d29yaykgewotICAgICAgICAgICAgICAgIG5ldElkID0gbVdpZmlTdGF0ZVRyYWNrZXIuYWRkTmV0d29yaygpOwotICAgICAgICAgICAgICAgIGlmIChuZXRJZCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkZhaWxlZCB0byBhZGQgYSBuZXR3b3JrISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZG9SZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTmVlZFJlY29uZmlnID0gbU5lZWRSZWNvbmZpZyB8fCBkb1JlY29uZmlnOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFyaWFibGVzOiB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogTm90ZSB0aGF0IGlmIGEgbmV0d29ya0lkIGZvciBhIG5vbi1leGlzdGVudCBuZXR3b3JrCi0gICAgICAgICAgICAgKiB3YXMgc3VwcGxpZWQsIHRoZW4gdGhlIGZpcnN0IHNldE5ldHdvcmtWYXJpYWJsZSgpCi0gICAgICAgICAgICAgKiB3aWxsIGZhaWwsIHNvIHdlIGRvbid0IGJvdGhlciB0byBtYWtlIGEgc2VwYXJhdGUgY2hlY2sKLSAgICAgICAgICAgICAqIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIElEIHVwIGZyb250LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoY29uZmlnLlNTSUQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5TU0lEKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgU1NJRDogIitjb25maWcuU1NJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbmZpZy5CU1NJRCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5CU1NJRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IEJTU0lEOiAiK2NvbmZpZy5CU1NJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQga2V5X21nbXQ6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFByb3RvY29scy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwcm90bzogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgYXV0aF9hbGc6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyA9Ci0gICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcGFpcndpc2U6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGdyb3VwOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0Ci0gICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KLSAgICAgICAgICAgIGlmIChjb25maWcucHJlU2hhcmVkS2V5ICE9IG51bGwgJiYgIWNvbmZpZy5wcmVTaGFyZWRLZXkuZXF1YWxzKCIqIikgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwc2s6ICIrY29uZmlnLnByZVNoYXJlZEtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBoYXNTZXRLZXkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChjb25maWcud2VwS2V5cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcud2VwS2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAotICAgICAgICAgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzW2ldICE9IG51bGwgJiYgIWNvbmZpZy53ZXBLZXlzW2ldLmVxdWFscygiKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgd2VwX2tleSIraSsiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NldEtleSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYXNTZXRLZXkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcud2VwVHhLZXlJbmRleCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF90eF9rZXlpZHg6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcucHJpb3JpdHkpKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IHByaW9yaXR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgK2NvbmZpZy5wcmlvcml0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbmZpZy5oaWRkZW5TU0lEICYmICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcuaGlkZGVuU1NJRCA/IDEgOiAwKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCBoaWRkZW5TU0lEOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZAotICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBmaWVsZC52YXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmllbGQudmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUubGVuZ3RoKCkgPT0gMCkgPyAiTlVMTCIgOiBjb252ZXJ0VG9RdW90ZWRTdHJpbmcodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0ICIgKyB2YXJOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV0SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBGb3IgYW4gdXBkYXRlLCBpZiBvbmUgb2YgdGhlIHNldE5ldHdvcmtWYXJpYWJsZSBvcGVyYXRpb25zIGZhaWxzLAotICAgICAgICAgKiB3ZSBtaWdodCB3YW50IHRvIHJvbGwgYmFjayBhbGwgdGhlIGNoYW5nZXMgYWxyZWFkeSBtYWRlLiBCdXQgdGhlCi0gICAgICAgICAqIGNoYW5jZXMgYXJlIHRoYXQgaWYgYW55dGhpbmcgaXMgZ29pbmcgdG8gZ28gd3JvbmcsIGl0J2xsIGhhcHBlbgotICAgICAgICAgKiB0aGUgZmlyc3QgdGltZSB3ZSB0cnkgdG8gc2V0IG9uZSBvZiB0aGUgdmFyaWFibGVzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKLSAgICAgICAgICAgIHJlbW92ZU5ldHdvcmsobmV0SWQpOwotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBhIG5ldHdvcmsgdmFyaWFibGUsIHJlbW92ZWQgbmV0d29yazogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0FkZE9yVXBkYXRlTmV0d29yayhjb25maWcpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlU3RyaW5nKEJpdFNldCBzZXQsIFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaW50IG5leHRTZXRCaXQgPSAtMTsKLQotICAgICAgICAvKiBNYWtlIHN1cmUgYWxsIHNldCBiaXRzIGFyZSBpbiBbMCwgc3RyaW5ncy5sZW5ndGgpIHRvIGF2b2lkCi0gICAgICAgICAqIGdvaW5nIG91dCBvZiBib3VuZHMgb24gc3RyaW5ncy4gIChTaG91bGRuJ3QgaGFwcGVuLCBidXQuLi4pICovCi0gICAgICAgIHNldCA9IHNldC5nZXQoMCwgc3RyaW5ncy5sZW5ndGgpOwotCi0gICAgICAgIHdoaWxlICgobmV4dFNldEJpdCA9IHNldC5uZXh0U2V0Qml0KG5leHRTZXRCaXQgKyAxKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc3RyaW5nc1tuZXh0U2V0Qml0XS5yZXBsYWNlKCdfJywgJy0nKSkuYXBwZW5kKCcgJyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2UKLSAgICAgICAgaWYgKHNldC5jYXJkaW5hbGl0eSgpID4gMCkgewotICAgICAgICAgICAgYnVmLnNldExlbmd0aChidWYubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbG9va3VwU3RyaW5nKFN0cmluZyBzdHJpbmcsIFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAgICAgaW50IHNpemUgPSBzdHJpbmdzLmxlbmd0aDsKLQotICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgnLScsICdfJyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICBpZiAoc3RyaW5nLmVxdWFscyhzdHJpbmdzW2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLQotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBldmVyIGdldCBoZXJlLCB3ZSBzaG91bGQgcHJvYmFibHkgYWRkIHRoZQotICAgICAgICAgICAgLy8gdmFsdWUgdG8gV2lmaUNvbmZpZ3VyYXRpb24gdG8gcmVmbGVjdCB0aGF0IGl0J3MKLSAgICAgICAgICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQKLSAgICAgICAgICAgIFNsb2cudyhUQUcsICJGYWlsZWQgdG8gbG9vay11cCBhIHN0cmluZzogIiArIHN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCisgICAgIC8qKgogICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZW1vdmVOZXR3b3JrKGludCl9CiAgICAgICogQHBhcmFtIG5ldElkIHRoZSBpbnRlZ2VyIHRoYXQgaWRlbnRpZmllcyB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uCiAgICAgICogdG8gdGhlIHN1cHBsaWNhbnQKQEAgLTEzMTEsOCArNTg4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVOZXR3b3JrKGludCBuZXRJZCkgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5yZW1vdmVOZXR3b3JrKG5ldElkKTsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNSZW1vdmVOZXR3b3JrKG5ldElkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMjQsMTQgKzYwMCw3IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIFN0cmluZyBpZm5hbWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXRJbnRlcmZhY2VOYW1lKCk7Ci0gICAgICAgIE5ldHdvcmtVdGlscy5lbmFibGVJbnRlcmZhY2UoaWZuYW1lKTsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVOZXR3b3JrKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKGlmbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNFbmFibGVOZXR3b3JrKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNDIsOCArNjExLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlTmV0d29yayhpbnQgbmV0SWQpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZGlzYWJsZU5ldHdvcmsobmV0SWQpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0Rpc2FibGVOZXR3b3JrKG5ldElkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNTYsNyArNjI0LDcgQEAKICAgICAgICAgICogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbiwgYnkgc2VuZGluZwogICAgICAgICAgKiBhIHN0YXR1cyByZXF1ZXN0IHRvIHRoZSBzdXBwbGljYW50LgogICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlcXVlc3RDb25uZWN0aW9uSW5mbygpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlcXVlc3RDb25uZWN0aW9uSW5mbygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM2NiwxODAgKzYzNCwxOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFNjYW5SZXN1bHQ+IGdldFNjYW5SZXN1bHRzKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBTdHJpbmcgcmVwbHk7Ci0KLSAgICAgICAgcmVwbHkgPSBtV2lmaVN0YXRlVHJhY2tlci5zY2FuUmVzdWx0cygpOwotICAgICAgICBpZiAocmVwbHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5MaXN0ID0gbmV3IEFycmF5TGlzdDxTY2FuUmVzdWx0PigpOwotCi0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotCi0gICAgICAgIGludCByZXBseUxlbiA9IHJlcGx5Lmxlbmd0aCgpOwotICAgICAgICAvLyBQYXJzZSB0aGUgcmVzdWx0IHN0cmluZywga2VlcGluZyBpbiBtaW5kIHRoYXQgdGhlIGxhc3QgbGluZSBkb2VzCi0gICAgICAgIC8vIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUuCi0gICAgICAgIGZvciAoaW50IGxpbmVCZWcgPSAwLCBsaW5lRW5kID0gMDsgbGluZUVuZCA8PSByZXBseUxlbjsgKytsaW5lRW5kKSB7Ci0gICAgICAgICAgICBpZiAobGluZUVuZCA9PSByZXBseUxlbiB8fCByZXBseS5jaGFyQXQobGluZUVuZCkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICsrbGluZUNvdW50OwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogU2tpcCB0aGUgZmlyc3QgbGluZSwgd2hpY2ggaXMgYSBoZWFkZXIKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobGluZUNvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmVFbmQgPiBsaW5lQmVnKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVwbHkuc3Vic3RyaW5nKGxpbmVCZWcsIGxpbmVFbmQpOwotICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBwYXJzZVNjYW5SZXN1bHQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5MaXN0LmFkZChzY2FuUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJtaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgZm9yOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFNjYW5SZXN1bHRzTGlzdChzY2FuTGlzdCk7Ci0gICAgICAgIHJldHVybiBzY2FuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgc2NhbiByZXN1bHQgbGluZSBwYXNzZWQgdG8gdXMgYnkgd3BhX3N1cHBsaWNhbnQgKGhlbHBlcikuCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gcGFyc2UKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2NhblJlc3VsdH0gb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTY2FuUmVzdWx0IHBhcnNlU2NhblJlc3VsdChTdHJpbmcgbGluZSkgewotICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ2FjaGUgaW1wbGVtZW50YXRpb24gKExpbmtlZEhhc2hNYXApIGlzIG5vdCBzeW5jaHJvbml6ZWQsIHRodXMsCi0gICAgICAgICAgICAgKiBtdXN0IHN5bmNocm9uaXplZCBoZXJlIQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TY2FuUmVzdWx0Q2FjaGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBzY2FuUmVzdWx0UGF0dGVybi5zcGxpdChsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAoMyA8PSByZXN1bHQubGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPD0gNSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnNzaWQgPSByZXN1bHRbMF07Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkIHwgZnJlcXVlbmN5IHwgbGV2ZWwgfCBmbGFncyB8IHNzaWQKLSAgICAgICAgICAgICAgICAgICAgaW50IGZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsyXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBzb21lIGltcGxlbWVudGF0aW9ucyBhdm9pZCBuZWdhdGl2ZSB2YWx1ZXMgYnkgYWRkaW5nIDI1NgotICAgICAgICAgICAgICAgICAgICAgICAgICogc28gd2UgbmVlZCB0byBhZGp1c3QgZm9yIHRoYXQgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gMCkgbGV2ZWwgLT0gMjU2OwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSBmb3JtYXR0aW5nIG9mIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAqIHdwYV9zdXBwbGljYW50IGlzIGludGVuZGVkIHRvIG1ha2UgdGhlIGZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgKiBsaW5lIHVwIG5pY2VseSB3aGVuIHByaW50ZWQsCi0gICAgICAgICAgICAgICAgICAgICAqIG5vdCB0byBtYWtlIHRoZW0gZWFzeSB0byBwYXJzZS4gU28gd2UgaGF2ZSB0bwotICAgICAgICAgICAgICAgICAgICAgKiBhcHBseSBzb21lIGhldXJpc3RpY3MgdG8gZmlndXJlIG91dCB3aGljaCBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgKiBpcyB0aGUgU1NJRCBhbmQgd2hpY2ggZmllbGQgaXMgdGhlIGZsYWdzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNzaWQ7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmbGFnczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5jaGFyQXQoMCkgPT0gJ1snKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZXN1bHRbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA9PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbNF07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBtdXN0IGhhdmUgMyBmaWVsZHM6IG5vIGZsYWdzIGFuZCBzc2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBic3NpZCArIHNzaWQgaXMgdGhlIGhhc2gga2V5Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBic3NpZCArIHNzaWQ7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQgPSBtU2NhblJlc3VsdENhY2hlLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NhblJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmxldmVsID0gbGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LlNTSUQgPSBzc2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMgPSBmbGFnczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuZnJlcXVlbmN5ID0gZnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGFkZCBzY2FuIHJlc3VsdHMgdGhhdCBoYXZlIG5vIFNTSUQgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8IHNzaWQudHJpbSgpLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTY2FuUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCwgYnNzaWQsIGZsYWdzLCBsZXZlbCwgZnJlcXVlbmN5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2NhblJlc3VsdENhY2hlLnB1dChrZXksIHNjYW5SZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIk1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCB0ZXh0IHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5sZW5ndGggKyAiIGZpZWxkczogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzY2FuUmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSAiZmxhZ3MiIGZpZWxkIHBhc3NlZCBiYWNrIGluIGEgc2NhbiByZXN1bHQgYnkgd3BhX3N1cHBsaWNhbnQsCi0gICAgICogYW5kIGNvbnN0cnVjdCBhIHtAY29kZSBXaWZpQ29uZmlndXJhdGlvbn0gdGhhdCBkZXNjcmliZXMgdGhlIGVuY3J5cHRpb24sCi0gICAgICoga2V5IG1hbmFnZW1lbnQsIGFuZCBhdXRoZW50aWNhaW9uIGNhcGFiaWxpdGllcyBvZiB0aGUgYWNjZXNzIHBvaW50LgotICAgICAqIEBwYXJhbSBmbGFncyB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IHdwYV9zdXBwbGljYW50Ci0gICAgICogQHJldHVybiB0aGUge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QsIGZpbGxlZCBpbgotICAgICAqLwotICAgIFdpZmlDb25maWd1cmF0aW9uIHBhcnNlU2NhbkZsYWdzKFN0cmluZyBmbGFncykgewotICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBpZiAoZmxhZ3MubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210Lk5PTkUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIC4uLiB0byBiZSBpbXBsZW1lbnRlZAotICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlbGwgdGhlIHN1cHBsaWNhbnQgdG8gcGVyc2lzdCB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MuCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQKKyAgICAgKgorICAgICAqIFRPRE86IGRlcHJlY2F0ZSB0aGlzCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2F2ZUNvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0OworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaVN0YXRlVHJhY2tlcikgewotICAgICAgICAgICAgcmVzdWx0ID0gbVdpZmlTdGF0ZVRyYWNrZXIuc2F2ZUNvbmZpZygpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiBtTmVlZFJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgbU5lZWRSZWNvbmZpZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1XaWZpU3RhdGVUcmFja2VyLnJlbG9hZENvbmZpZygpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5ORVRXT1JLX0lEU19DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSW5mb3JtIHRoZSBiYWNrdXAgbWFuYWdlciBhYm91dCBhIGRhdGEgY2hhbmdlCi0gICAgICAgIElCYWNrdXBNYW5hZ2VyIGlibSA9IElCYWNrdXBNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkJBQ0tVUF9TRVJWSUNFKSk7Ci0gICAgICAgIGlmIChpYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpYm0uZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gbGF0ZXIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1NhdmVDb25maWcoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NTQsNyArNjYxLDcgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZSwgZS5nLiwKICAgICAgKiB7QGNvZGUgbnVtQ2hhbm5lbHN9IGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoaW50IG51bUNoYW5uZWxzLCBib29sZWFuIHBlcnNpc3QpIHsKICAgICAgICAgU2xvZy5pKFRBRywgIldpZmlTZXJ2aWNlIHRyeWluZyB0byBzZXROdW1BbGxvd2VkIHRvICIrbnVtQ2hhbm5lbHMrCiAgICAgICAgICAgICAgICAgIiB3aXRoIHBlcnNpc3Qgc2V0IHRvICIrcGVyc2lzdCk7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CkBAIC0xNTc2LDI4ICs2ODMsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtV2lmaUhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1NFVF9DSEFOTkVMUywgbnVtQ2hhbm5lbHMsIChwZXJzaXN0ID8gMSA6IDApKS5zZW5kVG9UYXJnZXQoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXRzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgc3luY2hyb25vdXNseQotICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKLSAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgotICAgICAqIEBwYXJhbSBwZXJzaXN0IHtAY29kZSB0cnVlfSBpZiB0aGUgc2V0dGluZyBzaG91bGQgYmUgcmVtZW1iZXJlZC4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXROdW1BbGxvd2VkQ2hhbm5lbHNCbG9ja2luZyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgewogICAgICAgICBpZiAocGVyc2lzdCkgewogICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TnVtQWxsb3dlZENoYW5uZWxzKG51bUNoYW5uZWxzKTsKKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHMobnVtQ2hhbm5lbHMpOworCisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYxNSw3ICs3MDksNyBAQAogICAgICAgICAgKiBXaS1GaSBpcyBub3QgY3VycmVudGx5IGVuYWJsZWQpLCBnZXQgdGhlIHZhbHVlIGZyb20KICAgICAgICAgICogU2V0dGluZ3MuCiAgICAgICAgICAqLwotICAgICAgICBudW1DaGFubmVscyA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE51bUFsbG93ZWRDaGFubmVscygpOworICAgICAgICBudW1DaGFubmVscyA9IG1XaWZpU3RhdGVNYWNoaW5lLmdldE51bUFsbG93ZWRDaGFubmVscygpOwogICAgICAgICBpZiAobnVtQ2hhbm5lbHMgPCAwKSB7CiAgICAgICAgICAgICBudW1DaGFubmVscyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05VTV9BTExPV0VEX0NIQU5ORUxTLApAQCAtMTY0MSw3ICs3MzUsODYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgRGhjcEluZm8gZ2V0RGhjcEluZm8oKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5nZXREaGNwSW5mbygpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldERoY3BJbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3N0YXJ0V2lmaX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2lmaSgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgLyogVE9ETzogbWF5IGJlIGFkZCBwZXJtaXNzaW9ucyBmb3IgYWNjZXNzIG9ubHkgdG8gY29ubmVjdGl2aXR5IHNlcnZpY2UKKyAgICAgICAgICogVE9ETzogaWYgYSBzdGFydCBpc3N1ZWQsIGtlZXAgd2lmaSBhbGl2ZSB1bnRpbCBhIHN0b3AgaXNzdWVkIGlycmVzcGVjdGl2ZQorICAgICAgICAgKiBvZiBXaWZpTG9jayAmIGRldmljZSBpZGxlIHN0YXR1cyB1bmxlc3Mgd2lmaSBlbmFibGVkIHN0YXR1cyBpcyB0b2dnbGVkCisgICAgICAgICAqLworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KHRydWUpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3N0b3BXaWZpfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFdpZmkoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIC8qIFRPRE86IG1heSBiZSBhZGQgcGVybWlzc2lvbnMgZm9yIGFjY2VzcyBvbmx5IHRvIGNvbm5lY3Rpdml0eSBzZXJ2aWNlCisgICAgICAgICAqIFRPRE86IGlmIGEgc3RvcCBpcyBpc3N1ZWQsIHdpZmkgaXMgYnJvdWdodCB1cCBvbmx5IGJ5IHN0YXJ0V2lmaQorICAgICAgICAgKiB1bmxlc3Mgd2lmaSBlbmFibGVkIHN0YXR1cyBpcyB0b2dnbGVkCisgICAgICAgICAqLworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXREcml2ZXJTdGFydChmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjYWRkVG9CbGFja2xpc3R9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5hZGRUb0JsYWNrbGlzdChic3NpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2NsZWFyQmxhY2tsaXN0fQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJCbGFja2xpc3QoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuY2xlYXJCbGFja2xpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhJZChpbnQgbmV0d29ya0lkKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmNvbm5lY3ROZXR3b3JrKG5ldHdvcmtJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmtXaXRoQ29uZmlnKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5jb25uZWN0TmV0d29yayhjb25maWcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zYXZlTmV0d29yayhjb25maWcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmZvcmdldE5ldHdvcmsobmV0SWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0V3BzUGJjKFN0cmluZyBic3NpZCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zdGFydFdwc1BiYyhic3NpZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRXcHNQaW4oU3RyaW5nIGJzc2lkLCBpbnQgYXBQaW4pIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RhcnRXcHNQaW4oYnNzaWQsIGFwUGluKTsKICAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKQEAgLTE2NjMsMTcgKzgzNiwxMSBAQAogICAgICAgICAgICAgICAgIC8vIE9uY2UgdGhlIHNjcmVlbiBpcyBvbiwgd2UgYXJlIG5vdCBrZWVwaW5nIFdJRkkgcnVubmluZwogICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugb2YgYW55IGxvY2tzIHNvIGNsZWFyIHRoYXQgdHJhY2tpbmcgaW1tZWRpYXRlbHkuCiAgICAgICAgICAgICAgICAgcmVwb3J0U3RhcnRXb3JrU291cmNlKCk7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlUnNzaVBvbGxpbmcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLyogREhDUCBvciBvdGhlciB0ZW1wb3JhcnkgZmFpbHVyZXMgaW4gdGhlIHBhc3QgY2FuIHByZXZlbnQKLSAgICAgICAgICAgICAgICAgKiBhIGRpc2FibGVkIG5ldHdvcmsgZnJvbSBiZWluZyBjb25uZWN0ZWQgdG8sIGVuYWJsZSBvbiBzY3JlZW4gb24KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlTdGF0ZVRyYWNrZXIuaXNBbnlOZXR3b3JrRGlzYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTmV0d29ya3NNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fU0NSRUVOX09GRikpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiQUNUSU9OX1NDUkVFTl9PRkYiKTsKICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVSc3NpUG9sbGluZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZW5hYmxlUnNzaVBvbGxpbmcoZmFsc2UpOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IGEgdGltZXIgdG8gcHV0IFdpLUZpIHRvIHNsZWVwLCBidXQgb25seSBpZiB0aGUgc2NyZWVuIGlzIG9mZgogICAgICAgICAgICAgICAgICAqIEFORCB0aGUgInN0YXkgb24gd2hpbGUgcGx1Z2dlZCBpbiIgc2V0dGluZyBkb2Vzbid0IG1hdGNoIHRoZQpAQCAtMTY4MSwxMSArODQ4LDExIEBACiAgICAgICAgICAgICAgICAgICogb3IgcGx1Z2dlZCBpbiB0byBBQykuCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRXaWZpU3RheUF3YWtlKHN0YXlBd2FrZUNvbmRpdGlvbnMsIG1QbHVnZ2VkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgV2lmaUluZm8gaW5mbyA9IG1XaWZpU3RhdGVUcmFja2VyLnJlcXVlc3RDb25uZWN0aW9uSW5mbygpOworICAgICAgICAgICAgICAgICAgICBXaWZpSW5mbyBpbmZvID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlcXVlc3RDb25uZWN0aW9uSW5mbygpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRvIGdvIHRvIHNsZWVwIGltbWVkaWF0ZWx5LCBidXQgdGhpcyBjYXVzZWQgc29tZSByYWNlIGNvbmRpdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdGltZSB0byB0cmFjayBkb3duIGZvciB0aGlzIHJlbGVhc2UuICBEZWxheSBpbnN0ZWFkLCBidXQgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHdlIHdvdWxkIGlmIGNvbm5lY3RlZCAoYmVsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRpbWUgdG8gdHJhY2sgZG93biBmb3IgdGhpcyByZWxlYXNlLiAgRGVsYXkgaW5zdGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBub3QgYXMgbG9uZyBhcyB3ZSB3b3VsZCBpZiBjb25uZWN0ZWQgKGJlbG93KQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGZpeCB0aGUgcmFjZSBjb25kaXRpb25zIGFuZCBzd2l0Y2ggYmFjayB0byB0aGUgaW1tZWRpYXRlIHR1cm4tb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAoMio2MCoxMDAwKTsgLy8gMiBtaW4KICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzZXR0aW5nIEFDVElPTl9ERVZJQ0VfSURMRSB0aW1lciBmb3IgMTIwLDAwMCBtcyIpOwpAQCAtMTcxNCw3ICs4ODEsNiBAQAogICAgICAgICAgICAgICAgICAqIHRoZSBhbHJlYWR5LXNldCB0aW1lci4KICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBpbnQgcGx1Z2dlZFR5cGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoInBsdWdnZWQiLCAwKTsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCBwbHVnZ2VkVHlwZTogIiArIHBsdWdnZWRUeXBlKTsKICAgICAgICAgICAgICAgICBpZiAobVNjcmVlbk9mZiAmJiBzaG91bGRXaWZpU3RheUF3YWtlKHN0YXlBd2FrZUNvbmRpdGlvbnMsIG1QbHVnZ2VkVHlwZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICFzaG91bGRXaWZpU3RheUF3YWtlKHN0YXlBd2FrZUNvbmRpdGlvbnMsIHBsdWdnZWRUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBpZGxlTWlsbGlzOwpAQCAtMTcyNCwxNyArODkwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVBsdWdnZWRUeXBlID0gcGx1Z2dlZFR5cGU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKLSAgICAgICAgICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBzaW5rcyA9IGEyZHAuZ2V0Q29ubmVjdGVkU2lua3MoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIHNpbmsgOiBzaW5rcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYTJkcC5nZXRTaW5rU3RhdGUoc2luaykgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0JsdWV0b290aFBsYXlpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldEJsdWV0b290aFNjYW5Nb2RlKGlzQmx1ZXRvb3RoUGxheWluZyk7Ci0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhBMmRwLkFDVElPTl9QTEFZSU5HX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldEJsdWV0b290aFNjYW5Nb2RlKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTE3NzIsNyArOTMxLDcgQEAKICAgICAgICAgICogb2Yge0Bjb2RlIDB9IGlzbid0IHJlYWxseSBhIHBsdWdnZWQgdHlwZSwgYnV0IHJhdGhlciBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlCiAgICAgICAgICAqIGRldmljZSBpc24ndCBwbHVnZ2VkIGluIGF0IGFsbCwgdGhlcmUgaXMgbm8gYml0IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYQogICAgICAgICAgKiB7QGNvZGUgcGx1Z2dlZFR5cGV9IHZhbHVlIG9mIHtAY29kZSAwfS4gVGhhdCBpcyB3aHkgd2Ugc2hpZnQgYnkKLSAgICAgICAgICoge0Bjb2RlIHBsdWdnZWRUeXBlJm5ic3A7JiM4MjEyOyZuYnNwOzF9IGluc3RlYWQgb2YgYnkge0Bjb2RlIHBsdWdnZWRUeXBlfS4KKyAgICAgICAgICoge0Bjb2RlIHBsdWdnZWRUeXBlIC0gMX0gaW5zdGVhZCBvZiBieSB7QGNvZGUgcGx1Z2dlZFR5cGV9LgogICAgICAgICAgKiBAcGFyYW0gc3RheUF3YWtlQ29uZGl0aW9ucyBhIGJpdCBzdHJpbmcgc3BlY2lmeWluZyB3aGljaCAicGx1Z2dlZCB0eXBlcyIgc2hvdWxkCiAgICAgICAgICAqIGtlZXAgdGhlIGRldmljZSAoYW5kIGhlbmNlIFdpLUZpKSBhd2FrZS4KICAgICAgICAgICogQHBhcmFtIHBsdWdnZWRUeXBlIHRoZSB0eXBlIG9mIHBsdWcgKFVTQiwgQUMsIG9yIG5vbmUpIGZvciB3aGljaCB0aGUgY2hlY2sgaXMKQEAgLTE3ODUsMTAzICs5NDQsNDcgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIHZvaWQgc2VuZEVuYWJsZU1lc3NhZ2UoYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gcGVyc2lzdCwgaW50IHVpZCkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5hYmxlID8gTUVTU0FHRV9FTkFCTEVfV0lGSSA6IE1FU1NBR0VfRElTQUJMRV9XSUZJKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGVyc2lzdCA/IDEgOiAwKSwgdWlkKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kU3RhcnRNZXNzYWdlKGludCBsb2NrTW9kZSkgewotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsIE1FU1NBR0VfU1RBUlRfV0lGSSwgbG9ja01vZGUsIDApLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kQWNjZXNzUG9pbnRNZXNzYWdlKGJvb2xlYW4gZW5hYmxlLCBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBpbnQgdWlkKSB7Ci0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwKLSAgICAgICAgICAgICAgICAoZW5hYmxlID8gTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQgOiBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UKSwKLSAgICAgICAgICAgICAgICB1aWQsIDAsIHdpZmlDb25maWcpLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kRW5hYmxlTmV0d29ya3NNZXNzYWdlKCkgewotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsIE1FU1NBR0VfRU5BQkxFX05FVFdPUktTKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVwb3J0U3RhcnRXb3JrU291cmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpU3RhdGVUcmFja2VyKSB7Ci0gICAgICAgICAgICBtVG1wV29ya1NvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgaWYgKG1EZXZpY2VJZGxlKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1Mb2Nrcy5tTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtVG1wV29ya1NvdXJjZS5hZGQobUxvY2tzLm1MaXN0LmdldChpKS5tV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVwb3J0U3RhcnRXb3JrU291cmNlKCkgeworICAgICAgICBtVG1wV29ya1NvdXJjZS5jbGVhcigpOworICAgICAgICBpZiAobURldmljZUlkbGUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTG9ja3MubUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVG1wV29ya1NvdXJjZS5hZGQobUxvY2tzLm1MaXN0LmdldChpKS5tV29ya1NvdXJjZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci51cGRhdGVCYXR0ZXJ5V29ya1NvdXJjZUxvY2tlZChtVG1wV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICBzV2FrZUxvY2suc2V0V29ya1NvdXJjZShtVG1wV29ya1NvdXJjZSk7CiAgICAgICAgIH0KKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUudXBkYXRlQmF0dGVyeVdvcmtTb3VyY2UobVRtcFdvcmtTb3VyY2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVXaWZpU3RhdGUoKSB7Ci0gICAgICAgIC8vIHNlbmQgYSBtZXNzYWdlIHNvIGl0J3MgYWxsIHNlcmlhbGl6ZWQKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLCBNRVNTQUdFX1VQREFURV9TVEFURSwgMCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvVXBkYXRlV2lmaVN0YXRlKCkgewogICAgICAgICBib29sZWFuIHdpZmlFbmFibGVkID0gZ2V0UGVyc2lzdGVkV2lmaUVuYWJsZWQoKTsKLSAgICAgICAgYm9vbGVhbiBhaXJwbGFuZU1vZGUgPSBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgIW1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbjsKLQotICAgICAgICBib29sZWFuIGxvY2tIZWxkOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrcykgewotICAgICAgICAgICAgbG9ja0hlbGQgPSBtTG9ja3MuaGFzTG9ja3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdHJvbmdlc3RMb2NrTW9kZSA9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOworICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLmdldCgpOworICAgICAgICBib29sZWFuIGxvY2tIZWxkID0gbUxvY2tzLmhhc0xvY2tzKCk7CisgICAgICAgIGludCBzdHJvbmdlc3RMb2NrTW9kZTsKICAgICAgICAgYm9vbGVhbiB3aWZpU2hvdWxkQmVFbmFibGVkID0gd2lmaUVuYWJsZWQgJiYgIWFpcnBsYW5lTW9kZTsKICAgICAgICAgYm9vbGVhbiB3aWZpU2hvdWxkQmVTdGFydGVkID0gIW1EZXZpY2VJZGxlIHx8IGxvY2tIZWxkOwotCi0gICAgICAgIGlmIChsb2NrSGVsZCkgeworICAgICAgICBpZiAobURldmljZUlkbGUgJiYgbG9ja0hlbGQpIHsKICAgICAgICAgICAgIHN0cm9uZ2VzdExvY2tNb2RlID0gbUxvY2tzLmdldFN0cm9uZ2VzdExvY2tNb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogSWYgZGV2aWNlIGlzIG5vdCBpZGxlLCBsb2NrbW9kZSBjYW5ub3QgYmUgc2NhbiBvbmx5ICovCi0gICAgICAgIGlmICghbURldmljZUlkbGUgJiYgc3Ryb25nZXN0TG9ja01vZGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWSkgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3Ryb25nZXN0TG9ja01vZGUgPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlIYW5kbGVyKSB7Ci0gICAgICAgICAgICBpZiAoKG1XaWZpU3RhdGVUcmFja2VyLmdldFdpZmlTdGF0ZSgpID09IFdJRklfU1RBVEVfRU5BQkxJTkcpICYmICFhaXJwbGFuZU1vZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICAgIC8qIERpc2FibGUgdGV0aGVyaW5nIHdoZW4gYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkICovCisgICAgICAgIGlmIChhaXJwbGFuZU1vZGUpIHsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIERpc2FibGUgdGV0aGVyaW5nIHdoZW4gYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkICovCi0gICAgICAgICAgICBpZiAoYWlycGxhbmVNb2RlICYmCi0gICAgICAgICAgICAgICAgKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HIHx8IG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpKSB7Ci0gICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBzZW5kQWNjZXNzUG9pbnRNZXNzYWdlKGZhbHNlLCBudWxsLCBtTGFzdEFwRW5hYmxlVWlkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdpZmlTaG91bGRCZUVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAod2lmaVNob3VsZEJlU3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTWVzc2FnZSh0cnVlLCBmYWxzZSwgbUxhc3RFbmFibGVVaWQpOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBzZW5kU3RhcnRNZXNzYWdlKHN0cm9uZ2VzdExvY2tNb2RlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5pc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgd2FrZUxvY2tUaW1lb3V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9NT0JJTEVfREFUQV9UUkFOU0lUSU9OX1dBS0VMT0NLX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBXZSBhcmUgYXNzdW1pbmcgdGhhdCBDb25uZWN0aXZpdHlTZXJ2aWNlIGNhbiBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAqIGEgdHJhbnNpdGlvbiB0byBjZWxsdWxhciBkYXRhIHdpdGhpbiB3YWtlTG9ja1RpbWVvdXQgdGltZS4KLSAgICAgICAgICAgICAgICAgICAgICogVGhlIHdha2Vsb2NrIGlzIHJlbGVhc2VkIGJ5IHRoZSBkZWxheWVkIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTUVTU0FHRV9TVE9QX1dJRkkpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTUVTU0FHRV9SRUxFQVNFX1dBS0VMT0NLLCB3YWtlTG9ja1RpbWVvdXQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHdpZmlTaG91bGRCZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICh3aWZpU2hvdWxkQmVTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgcmVwb3J0U3RhcnRXb3JrU291cmNlKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0U2Nhbk9ubHlNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb25nZXN0TG9ja01vZGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWSk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0RHJpdmVyU3RhcnQodHJ1ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgc2VuZEVuYWJsZU1lc3NhZ2UoZmFsc2UsIGZhbHNlLCBtTGFzdEVuYWJsZVVpZCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUucmVxdWVzdENtV2FrZUxvY2soKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXREcml2ZXJTdGFydChmYWxzZSk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpRW5hYmxlZChmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4OTEsNyArOTk0LDcgQEAKICAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpOwogICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKTsKICAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihBQ1RJT05fREVWSUNFX0lETEUpOwotICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fUExBWUlOR19TVEFURV9DSEFOR0VEKTsKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGludGVudEZpbHRlcik7CiAgICAgfQogCkBAIC0xOTE5LDk3ICsxMDIyLDYgQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uQUlSUExBTkVfTU9ERV9PTiwgMCkgPT0gMTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVyIHRoYXQgYWxsb3dzIHBvc3RpbmcgdG8gdGhlIFdpZmlUaHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBXaWZpSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgV2lmaUhhbmRsZXIoTG9vcGVyIGxvb3BlcikgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfRU5BQkxFX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkQmxvY2tpbmcodHJ1ZSwgbXNnLmFyZzEgPT0gMSwgbXNnLmFyZzIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlXYXRjaGRvZ1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBuZXcgV2lmaVdhdGNoZG9nU2VydmljZShtQ29udGV4dCwgbVdpZmlTdGF0ZVRyYWNrZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUQVJUX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydFN0YXJ0V29ya1NvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRTY2FuT25seU1vZGUobXNnLmFyZzEgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnJlc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0SGlnaFBlcmZNb2RlKG1zZy5hcmcxID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGKTsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfVVBEQVRFX1NUQVRFOgotICAgICAgICAgICAgICAgICAgICBkb1VwZGF0ZVdpZmlTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9ESVNBQkxFX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGEgbm9uLXplcm8gbXNnLmFyZzEgdmFsdWUgbWVhbnMgdGhlICJlbmFibGVkIiBzZXR0aW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBwZXJzaXN0ZWQKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRCbG9ja2luZyhmYWxzZSwgbXNnLmFyZzEgPT0gMSwgbXNnLmFyZzIpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaVdhdGNoZG9nU2VydmljZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUT1BfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZGlzY29ubmVjdEFuZFN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVsZWFzZSB3YWtlbG9jawotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRUxFQVNFX1dBS0VMT0NLOgotICAgICAgICAgICAgICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RBUlRfQUNDRVNTX1BPSU5UOgotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcodHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdpZmlDb25maWd1cmF0aW9uKSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RPUF9BQ0NFU1NfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRCbG9ja2luZyhmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdpZmlDb25maWd1cmF0aW9uKSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU0VUX0NIQU5ORUxTOgotICAgICAgICAgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHNCbG9ja2luZyhtc2cuYXJnMSwgbXNnLmFyZzIgPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX0VOQUJMRV9ORVRXT1JLUzoKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlQWxsTmV0d29ya3MoZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVEFSVF9TQ0FOOgotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlQWN0aXZlID0gKG1zZy5hcmcxID09IDEpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1XaWZpU3RhdGVUcmFja2VyLmdldFN1cHBsaWNhbnRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBET1JNQU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRTY2FuUmVzdWx0SGFuZGxpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpU3RhdGVUcmFja2VyLlNVUFBMX1NDQU5fSEFORExJTkdfTElTVF9PTkxZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zY2FuKGZvcmNlQWN0aXZlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgewogICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUCkKQEAgLTIwMTksMTcgKzEwMzEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHB3LnByaW50bG4oIldpLUZpIGlzICIgKyBzdGF0ZU5hbWUobVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCkpKTsKKyAgICAgICAgcHcucHJpbnRsbigiV2ktRmkgaXMgIiArIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRXaWZpU3RhdGVCeU5hbWUoKSk7CiAgICAgICAgIHB3LnByaW50bG4oIlN0YXktYXdha2UgY29uZGl0aW9uczogIiArCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TVEFZX09OX1dISUxFX1BMVUdHRURfSU4sIDApKTsKICAgICAgICAgcHcucHJpbnRsbigpOwogCiAgICAgICAgIHB3LnByaW50bG4oIkludGVybmFsIHN0YXRlOiIpOwotICAgICAgICBwdy5wcmludGxuKG1XaWZpU3RhdGVUcmFja2VyKTsKKyAgICAgICAgcHcucHJpbnRsbihtV2lmaVN0YXRlTWFjaGluZSk7CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTGF0ZXN0IHNjYW4gcmVzdWx0czoiKTsKLSAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuUmVzdWx0cyA9IG1XaWZpU3RhdGVUcmFja2VyLmdldFNjYW5SZXN1bHRzTGlzdCgpOworICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpOwogICAgICAgICBpZiAoc2NhblJlc3VsdHMgIT0gbnVsbCAmJiBzY2FuUmVzdWx0cy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgcHcucHJpbnRsbigiICBCU1NJRCAgICAgICAgICAgICAgRnJlcXVlbmN5ICAgUlNTSSAgRmxhZ3MgICAgICAgICAgICAgU1NJRCIpOwogICAgICAgICAgICAgZm9yIChTY2FuUmVzdWx0IHIgOiBzY2FuUmVzdWx0cykgewpAQCAtMjA0MywzMyArMTA1NSwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTG9ja3MgYWNxdWlyZWQ6ICIgKyBtRnVsbExvY2tzQWNxdWlyZWQgKyAiIGZ1bGwsICIgKwotICAgICAgICAgICAgICAgIG1GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkICsgIiBmdWxsIGhpZ2ggcGVyZiwgIiArCiAgICAgICAgICAgICAgICAgbVNjYW5Mb2Nrc0FjcXVpcmVkICsgIiBzY2FuIik7CiAgICAgICAgIHB3LnByaW50bG4oIkxvY2tzIHJlbGVhc2VkOiAiICsgbUZ1bGxMb2Nrc1JlbGVhc2VkICsgIiBmdWxsLCAiICsKLSAgICAgICAgICAgICAgICBtRnVsbEhpZ2hQZXJmTG9ja3NSZWxlYXNlZCArICIgZnVsbCBoaWdoIHBlcmYsICIgKwogICAgICAgICAgICAgICAgIG1TY2FuTG9ja3NSZWxlYXNlZCArICIgc2NhbiIpOwogICAgICAgICBwdy5wcmludGxuKCk7CiAgICAgICAgIHB3LnByaW50bG4oIkxvY2tzIGhlbGQ6Iik7CiAgICAgICAgIG1Mb2Nrcy5kdW1wKHB3KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RhdGVOYW1lKGludCB3aWZpU3RhdGUpIHsKLSAgICAgICAgc3dpdGNoICh3aWZpU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxpbmciOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsZWQiOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxpbmciOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGVkIjsKLSAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9VTktOT1dOOgotICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biBzdGF0ZSI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiW2ludmFsaWQgc3RhdGVdIjsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgY2xhc3MgV2lmaUxvY2sgZXh0ZW5kcyBEZWF0aFJlY2lwaWVudCB7CiAgICAgICAgIFdpZmlMb2NrKGludCBsb2NrTW9kZSwgU3RyaW5nIHRhZywgSUJpbmRlciBiaW5kZXIsIFdvcmtTb3VyY2Ugd3MpIHsKICAgICAgICAgICAgIHN1cGVyKGxvY2tNb2RlLCB0YWcsIGJpbmRlciwgd3MpOwpAQCAtMjEwMSwxNSArMTA5NCwxMSBAQAogICAgICAgICAgICAgaWYgKG1MaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkID4gbUZ1bGxIaWdoUGVyZkxvY2tzUmVsZWFzZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGOworICAgICAgICAgICAgZm9yIChXaWZpTG9jayBsIDogbUxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAobC5tTW9kZSA9PSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUZ1bGxMb2Nrc0FjcXVpcmVkID4gbUZ1bGxMb2Nrc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWTsKICAgICAgICAgfQogCkBAIC0yMTQ3LDcgKzExMzYsNyBAQAogICAgIH0KIAogICAgIHZvaWQgZW5mb3JjZVdha2VTb3VyY2VQZXJtaXNzaW9uKGludCB1aWQsIGludCBwaWQpIHsKLSAgICAgICAgaWYgKHVpZCA9PSBQcm9jZXNzLm15VWlkKCkpIHsKKyAgICAgICAgaWYgKHVpZCA9PSBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5VUERBVEVfREVWSUNFX1NUQVRTLApAQCAtMjE1NiwxMSArMTE0NSw3IEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBhY3F1aXJlV2lmaUxvY2soSUJpbmRlciBiaW5kZXIsIGludCBsb2NrTW9kZSwgU3RyaW5nIHRhZywgV29ya1NvdXJjZSB3cykgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLldBS0VfTE9DSywgbnVsbCk7Ci0gICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJgotICAgICAgICAgICAgICAgIGxvY2tNb2RlICE9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkgJiYKLSAgICAgICAgICAgICAgICBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkYpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbGxlZ2FsIGFyZ3VtZW50LCBsb2NrTW9kZT0gIiArIGxvY2tNb2RlKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvY2tNb2RlPSIgKyBsb2NrTW9kZSk7CisgICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJiBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdzICE9IG51bGwpIHsKQEAgLTIxODMsMTAgKzExNjgsNiBAQAogICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDoKICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tBY3F1aXJlZEZyb21Tb3VyY2Uod2lmaUxvY2subVdvcmtTb3VyY2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkY6Ci0gICAgICAgICAgICAgICAgLyogVHJlYXQgaGlnaCBwb3dlciBhcyBhIGZ1bGwgbG9jayBmb3IgYmF0dGVyeSBzdGF0cyAqLwotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja0FjcXVpcmVkRnJvbVNvdXJjZSh3aWZpTG9jay5tV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk6CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlU2NhbldpZmlMb2NrQWNxdWlyZWRGcm9tU291cmNlKHdpZmlMb2NrLm1Xb3JrU291cmNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIxOTgsMTAgKzExNzksNiBAQAogICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDoKICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tSZWxlYXNlZEZyb21Tb3VyY2Uod2lmaUxvY2subVdvcmtTb3VyY2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkY6Ci0gICAgICAgICAgICAgICAgLyogVHJlYXQgaGlnaCBwb3dlciBhcyBhIGZ1bGwgbG9jayBmb3IgYmF0dGVyeSBzdGF0cyAqLwotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja1JlbGVhc2VkRnJvbVNvdXJjZSh3aWZpTG9jay5tV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk6CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlU2NhbldpZmlMb2NrUmVsZWFzZWRGcm9tU291cmNlKHdpZmlMb2NrLm1Xb3JrU291cmNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIyMjAsOSArMTE5Nyw2IEBACiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOgogICAgICAgICAgICAgICAgICsrbUZ1bGxMb2Nrc0FjcXVpcmVkOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkY6Ci0gICAgICAgICAgICAgICAgKyttRnVsbEhpZ2hQZXJmTG9ja3NBY3F1aXJlZDsKLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWToKICAgICAgICAgICAgICAgICArK21TY2FuTG9ja3NBY3F1aXJlZDsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIyOTEsOSArMTI2NSw2IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw6CiAgICAgICAgICAgICAgICAgICAgICAgICArK21GdWxsTG9ja3NSZWxlYXNlZDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbUZ1bGxIaWdoUGVyZkxvY2tzUmVsZWFzZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZOgogICAgICAgICAgICAgICAgICAgICAgICAgKyttU2NhbkxvY2tzUmVsZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIzNjUsNyArMTMzNiw3IEBACiAgICAgICAgICAgICBpZiAobU11bHRpY2FzdGVycy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zdGFydFBhY2tldEZpbHRlcmluZygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjM4MCw3ICsxMzUxLDcgQEAKICAgICAgICAgICAgIC8vIG91ciBuZXcgc2l6ZSA9PSAxIChmaXJzdCBjYWxsKSwgYnV0IHRoaXMgZnVuY3Rpb24gd29uJ3QKICAgICAgICAgICAgIC8vIGJlIGNhbGxlZCBvZnRlbiBhbmQgYnkgbWFraW5nIHRoZSBzdG9wUGFja2V0IGNhbGwgZWFjaAogICAgICAgICAgICAgLy8gdGltZSB3ZSdyZSBsZXNzIGZyYWdpbGUgYW5kIHNlbGYtaGVhbGluZy4KLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKICAgICAgICAgfQogCiAgICAgICAgIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwpAQCAtMjQxNyw3ICsxMzg4LDcgQEAKICAgICAgICAgICAgIHJlbW92ZWQudW5saW5rRGVhdGhSZWNpcGllbnQoKTsKICAgICAgICAgfQogICAgICAgICBpZiAobU11bHRpY2FzdGVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CiAgICAgICAgIH0KIAogICAgICAgICBMb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC0yNDM2LDQgKzE0MDcsMTQ0IEBACiAgICAgICAgICAgICByZXR1cm4gKG1NdWx0aWNhc3RlcnMuc2l6ZSgpID4gMCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXROb3RpZmljYXRpb24oKSB7CisgICAgICAgIC8vIElmIHdlIHNob3VsZG4ndCBwbGFjZSBhIG5vdGlmaWNhdGlvbiBvbiBhdmFpbGFibGUgbmV0d29ya3MsIHRoZW4KKyAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGRvaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nCisgICAgICAgIGlmICghbU5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKKworICAgICAgICBTdGF0ZSBzdGF0ZSA9IG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpOworICAgICAgICBpZiAoKHN0YXRlID09IE5ldHdvcmtJbmZvLlN0YXRlLkRJU0NPTk5FQ1RFRCkKKyAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuVU5LTk9XTikpIHsKKyAgICAgICAgICAgIC8vIExvb2sgZm9yIGFuIG9wZW4gbmV0d29yaworICAgICAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuUmVzdWx0cyA9IG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRTY2FuUmVzdWx0c0xpc3QoKTsKKyAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IG51bU9wZW5OZXR3b3JrcyA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNjYW5SZXN1bHRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHNjYW5SZXN1bHRzLmdldChpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1PcGVuTmV0d29ya3MrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChudW1PcGVuTmV0d29ya3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgrK21OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID49IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSd2ZSBzY2FubmVkIGNvbnRpbnVvdXNseSBhdCBsZWFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICogTlVNX1NDQU5TX0JFRk9SRV9OT1RJRklDQVRJT04gdGltZXMuIFRoZSB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm9iYWJseSBkb2VzIG5vdCBoYXZlIGEgcmVtZW1iZXJlZCBuZXR3b3JrIGluIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICogc2luY2Ugb3RoZXJ3aXNlIHN1cHBsaWNhbnQgd291bGQgaGF2ZSB0cmllZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzb2NpYXRlIGFuZCB0aHVzIHJlc2V0dGluZyB0aGlzIGNvdW50ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUodHJ1ZSwgbnVtT3Blbk5ldHdvcmtzLCBmYWxzZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG9wZW4gbmV0d29ya3MgaW4gcmFuZ2UsIHJlbW92ZSB0aGUgbm90aWZpY2F0aW9uCisgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdHJhY2tpbmcgd2hldGhlciBhIG5vdGlmaWNhdGlvbiBoYXMgYmVlbgorICAgICAqIHNob3duIHJlY2VudGx5IGFuZCBjbGVhcnMgdGhlIGN1cnJlbnQgbm90aWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNldE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUgPSAwOworICAgICAgICBtTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZSA9IDA7CisgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9yIGRvbid0IGRpc3BsYXkgYSBub3RpZmljYXRpb24gdGhhdCB0aGVyZSBhcmUgb3BlbiBXaS1GaSBuZXR3b3Jrcy4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZSB7QGNvZGUgdHJ1ZX0gaWYgbm90aWZpY2F0aW9uIHNob3VsZCBiZSB2aXNpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBudW1OZXR3b3JrcyB0aGUgbnVtYmVyIG5ldHdvcmtzIHNlZW4KKyAgICAgKiBAcGFyYW0gZm9yY2Uge0Bjb2RlIHRydWV9IHRvIGZvcmNlIG5vdGlmaWNhdGlvbiB0byBiZSBzaG93bi9ub3Qtc2hvd24sCisgICAgICogZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHNob3duL25vdC1zaG93bi4KKyAgICAgKiBAcGFyYW0gZGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgbWFkZQorICAgICAqIHZpc2libGUgb3IgaW52aXNpYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXROb3RpZmljYXRpb25WaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSwgaW50IG51bU5ldHdvcmtzLCBib29sZWFuIGZvcmNlLAorICAgICAgICAgICAgaW50IGRlbGF5KSB7CisKKyAgICAgICAgLy8gU2luY2Ugd2UgdXNlIGF1dG8gY2FuY2VsIG9uIHRoZSBub3RpZmljYXRpb24sIHdoZW4gdGhlCisgICAgICAgIC8vIG1OZXR3b3Jrc0F2YWlsYWJsZU5vdGlmaWNhdGlvblNob3duIGlzIHRydWUsIHRoZSBub3RpZmljYXRpb24gbWF5CisgICAgICAgIC8vIGhhdmUgYWN0dWFsbHkgYmVlbiBjYW5jZWxlZC4gIEhvd2V2ZXIsIHdoZW4gaXQgaXMgZmFsc2Ugd2Uga25vdworICAgICAgICAvLyBmb3Igc3VyZSB0aGF0IGl0IGlzIG5vdCBiZWluZyBzaG93biAoaXQgd2lsbCBub3QgYmUgc2hvd24gYW55IG90aGVyCisgICAgICAgIC8vIHBsYWNlIHRoYW4gaGVyZSkKKworICAgICAgICAvLyBJZiBpdCBzaG91bGQgYmUgaGlkZGVuIGFuZCBpdCBpcyBhbHJlYWR5IGhpZGRlbiwgdGhlbiBub29wCisgICAgICAgIGlmICghdmlzaWJsZSAmJiAhbU5vdGlmaWNhdGlvblNob3duICYmICFmb3JjZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1Db250ZXh0CisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7CisKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBpZiAodmlzaWJsZSkgeworCisgICAgICAgICAgICAvLyBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4KKyAgICAgICAgICAgIGlmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIE5vdGlmaWNhdGlvbiBvYmplY3QuCisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLndoZW4gPSAwOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uaWNvbiA9IElDT05fTkVUV09SS1NfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uZmxhZ3MgPSBOb3RpZmljYXRpb24uRkxBR19BVVRPX0NBTkNFTDsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChXaWZpTWFuYWdlci5BQ1RJT05fUElDS19XSUZJX05FVFdPUkspLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGUsIG51bU5ldHdvcmtzKTsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXRhaWxzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGVfZGV0YWlsZWQsIG51bU5ldHdvcmtzKTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb24udGlja2VyVGV4dCA9IHRpdGxlOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5zZXRMYXRlc3RFdmVudEluZm8obUNvbnRleHQsIHRpdGxlLCBkZXRhaWxzLCBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQpOworCisgICAgICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUzsKKworICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkoSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUsIG1Ob3RpZmljYXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUpOworICAgICAgICB9CisKKyAgICAgICAgbU5vdGlmaWNhdGlvblNob3duID0gdmlzaWJsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworCisgICAgICAgIHB1YmxpYyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcigpIHsKKyAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OKSwgdHJ1ZSwgdGhpcyk7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNoYW5nZShzZWxmQ2hhbmdlKTsKKworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWQgPSBnZXRWYWx1ZSgpOworICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OLCAxKSA9PSAxOworICAgICAgICB9CisgICAgfQorCisKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTdGF0ZVRyYWNrZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVN0YXRlVHJhY2tlci5qYXZhCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEKaW5kZXggNDQ1ZGQwMy4uNDZkNmJlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YQpAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuU2NhblJlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CkBAIC03Nyw3ICs3Niw2IEBACiAgICAgCiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOwogICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdpZmlNYW5hZ2VyOwogICAgIAogICAgIC8qKgpAQCAtMTA4LDEwICsxMDYsOSBAQAogICAgIC8qKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFQIGNoZWNrIHNob3VsZCBiZSBjYW5jZWxlZC4gKi8KICAgICBwcml2YXRlIGJvb2xlYW4gbVNob3VsZENhbmNlbDsKICAgICAKLSAgICBXaWZpV2F0Y2hkb2dTZXJ2aWNlKENvbnRleHQgY29udGV4dCwgV2lmaVN0YXRlVHJhY2tlciB3aWZpU3RhdGVUcmFja2VyKSB7CisgICAgV2lmaVdhdGNoZG9nU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIgPSB3aWZpU3RhdGVUcmFja2VyOwogICAgICAgICBtV2lmaU1hbmFnZXIgPSAoV2lmaU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CiAgICAgICAgIAogICAgICAgICBjcmVhdGVUaHJlYWQoKTsKQEAgLTI3NSwxMiArMjcyLDEzIEBACiAgICAgLyoqCiAgICAgICogVW5yZWdpc3RlciBicm9hZGNhc3RzIGFuZCBxdWl0IHRoZSB3YXRjaGRvZyB0aHJlYWQKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcXVpdCgpIHsKLSAgICAgICAgdW5yZWdpc3RlckZvcldpZmlCcm9hZGNhc3RzKCk7Ci0gICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNvbnRlbnRPYnNlcnZlcik7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZUFsbEFjdGlvbnMoKTsKLSAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdCgpOwotICAgIH0KKyAgICAvL1RPRE86IENoYW5nZSBiYWNrIHRvIHJ1bm5pbmcgV1dTIHdoZW4gbmVlZGVkCisvLyAgICBwcml2YXRlIHZvaWQgcXVpdCgpIHsKKy8vICAgICAgICB1bnJlZ2lzdGVyRm9yV2lmaUJyb2FkY2FzdHMoKTsKKy8vICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1Db250ZW50T2JzZXJ2ZXIpOworLy8gICAgICAgIG1IYW5kbGVyLnJlbW92ZUFsbEFjdGlvbnMoKTsKKy8vICAgICAgICBtSGFuZGxlci5nZXRMb29wZXIoKS5xdWl0KCk7CisvLyAgICB9CiAKICAgICAvKioKICAgICAgKiBXYWl0cyBmb3IgdGhlIG1haW4gd2F0Y2hkb2cgdGhyZWFkIHRvIGNyZWF0ZSB0aGUgaGFuZGxlci4KQEAgLTc1MSw3ICs3NDksNyBAQAogICAgICAgICAvLyBCbGFjayBsaXN0IHRoaXMgImJhZCIgQVAsIHRoaXMgd2lsbCBjYXVzZSBhbiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gYW5vdGhlcgogICAgICAgICBibGFja2xpc3RBcChhcC5ic3NpZCk7CiAgICAgICAgIC8vIEluaXRpYXRlIGFuIGFzc29jaWF0aW9uIHRvIGFuIGFsdGVybmF0ZSBBUAotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5yZWFzc29jaWF0ZSgpOworICAgICAgICBtV2lmaU1hbmFnZXIucmVhc3NvY2lhdGUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYmxhY2tsaXN0QXAoU3RyaW5nIGJzc2lkKSB7CkBAIC03NjIsMTAgKzc2MCw3IEBACiAgICAgICAgIC8vIEJlZm9yZSB0YWtpbmcgYWN0aW9uLCBtYWtlIHN1cmUgd2Ugc2hvdWxkIG5vdCBjYW5jZWwgb3VyIHByb2Nlc3NpbmcKICAgICAgICAgaWYgKHNob3VsZENhbmNlbCgpKSByZXR1cm47CiAgICAgICAgIAotICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmFkZFRvQmxhY2tsaXN0KGJzc2lkKSkgewotICAgICAgICAgICAgLy8gVGhlcmUncyBhIGtub3duIGJ1ZyB3aGVyZSB0aGlzIG1ldGhvZCByZXR1cm5zIGZhaWx1cmUgb24gc3VjY2VzcwotICAgICAgICAgICAgLy9TbG9nLmUoVEFHLCAiQmxhY2tsaXN0aW5nICIgKyBic3NpZCArICIgZmFpbGVkIik7Ci0gICAgICAgIH0KKyAgICAgICAgbVdpZmlNYW5hZ2VyLmFkZFRvQmxhY2tsaXN0KGJzc2lkKTsKIAogICAgICAgICBpZiAoRCkgewogICAgICAgICAgICAgbXlMb2dEKCJCbGFja2xpc3RpbmcgIiArIGJzc2lkKTsKQEAgLTg2MCwxMCArODU1LDcgQEAKICAgICAgICAgICAgICAqIChhbmQgYmxhY2tsaXN0ZWQgdGhlbSkuIENsZWFyIHRoZSBibGFja2xpc3Qgc28gdGhlIEFQIHdpdGggYmVzdAogICAgICAgICAgICAgICogc2lnbmFsIGlzIGNob3Nlbi4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5jbGVhckJsYWNrbGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBhIGtub3duIGJ1ZyB3aGVyZSB0aGlzIG1ldGhvZCByZXR1cm5zIGZhaWx1cmUgb24gc3VjY2VzcwotICAgICAgICAgICAgICAgIC8vU2xvZy5lKFRBRywgIkNsZWFyaW5nIGJsYWNrbGlzdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1XaWZpTWFuYWdlci5jbGVhckJsYWNrbGlzdCgpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoVikgewogICAgICAgICAgICAgICAgIG15TG9nVigiaGFuZGxlU2xlZXA6IFNldCBzdGF0ZSB0byBTTEVFUCBhbmQgY2xlYXJlZCBibGFja2xpc3QiKTsKQEAgLTkzNCw3ICs5MjYsNyBAQAogICAgICAqIHNob3VsZCByZXZlcnQgYW55dGhpbmcgZG9uZSBieSB0aGUgd2F0Y2hkb2cgbW9uaXRvcmluZy4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVzZXQoKSB7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmNsZWFyQmxhY2tsaXN0KCk7CisgICAgICAgIG1XaWZpTWFuYWdlci5jbGVhckJsYWNrbGlzdCgpOwogICAgICAgICBzZXRJZGxlU3RhdGUodHJ1ZSk7CiAgICAgfQogICAgIApAQCAtMTE1MSw3ICsxMTQzLDcgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlV2lmaVN0YXRlQ2hhbmdlZChpbnQgd2lmaVN0YXRlKSB7CiAgICAgICAgICAgICBpZiAod2lmaVN0YXRlID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBxdWl0KCk7CisgICAgICAgICAgICAgICAgb25EaXNjb25uZWN0ZWQoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaVN0YXRlID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRCkgewogICAgICAgICAgICAgICAgIG9uRW5hYmxlZCgpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZmE4NTUxNS4uNTlmNzQzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJTV9CRUhJTkQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TWVNURU1fRVJST1I7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07CkBAIC0zOSw2ICs0MCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LmltcGwuUGhvbmVXaW5kb3dNYW5hZ2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuQmFzZUlucHV0SGFuZGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dENvbnRleHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RDbGllbnQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RNYW5hZ2VyOwpAQCAtNTAsNiArNTIsOCBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwpAQCAtOTIsNiArOTYsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSUFwcGxpY2F0aW9uVG9rZW47CkBAIC0xMDMsNiArMTA4LDggQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRDaGFubmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dFF1ZXVlOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CkBAIC0xNTgsNyArMTY1LDcgQEAKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TVEFSVElOR19XSU5ET1cgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19SRU9SREVSID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfV0FMTFBBUEVSID0gZmFsc2U7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRlJFRVpFID0gZmFsc2U7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRFJBRyA9IHRydWU7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19UUkFOU0FDVElPTlMgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX1NUQUNLX0NSQVdMUyA9IHRydWU7CiAKQEAgLTQ4Niw2ICs0OTMsMzMzIEBACiAgICAgYm9vbGVhbiBtVHVybk9uU2NyZWVuOwogCiAgICAgLyoqCisgICAgICogRHJhZy9kcm9wIHN0YXRlCisgICAgICovCisgICAgY2xhc3MgRHJhZ1N0YXRlIHsKKyAgICAgICAgSUJpbmRlciBtVG9rZW47CisgICAgICAgIFN1cmZhY2UgbVN1cmZhY2U7CisgICAgICAgIGJvb2xlYW4gbUxvY2FsT25seTsKKyAgICAgICAgQ2xpcERhdGEgbURhdGE7CisgICAgICAgIENsaXBEZXNjcmlwdGlvbiBtRGF0YURlc2NyaXB0aW9uOworICAgICAgICBmbG9hdCBtVGh1bWJPZmZzZXRYLCBtVGh1bWJPZmZzZXRZOworICAgICAgICBJbnB1dENoYW5uZWwgbVNlcnZlckNoYW5uZWwsIG1DbGllbnRDaGFubmVsOworICAgICAgICBXaW5kb3dTdGF0ZSBtVGFyZ2V0V2luZG93OworICAgICAgICBBcnJheUxpc3Q8V2luZG93U3RhdGU+IG1Ob3RpZmllZFdpbmRvd3M7CisgICAgICAgIGJvb2xlYW4gbURyYWdJblByb2dyZXNzOworCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdCB0bXBSZWN0ID0gbmV3IFJlY3QoKTsKKworICAgICAgICBEcmFnU3RhdGUoSUJpbmRlciB0b2tlbiwgU3VyZmFjZSBzdXJmYWNlLCBib29sZWFuIGxvY2FsT25seSkgeworICAgICAgICAgICAgbVRva2VuID0gdG9rZW47CisgICAgICAgICAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgICAgICAgICBtTG9jYWxPbmx5ID0gbG9jYWxPbmx5OworICAgICAgICAgICAgbU5vdGlmaWVkV2luZG93cyA9IG5ldyBBcnJheUxpc3Q8V2luZG93U3RhdGU+KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3VyZmFjZS5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICBtTG9jYWxPbmx5ID0gZmFsc2U7CisgICAgICAgICAgICBtVG9rZW4gPSBudWxsOworICAgICAgICAgICAgbURhdGEgPSBudWxsOworICAgICAgICAgICAgbVRodW1iT2Zmc2V0WCA9IG1UaHVtYk9mZnNldFkgPSAwOworICAgICAgICAgICAgbU5vdGlmaWVkV2luZG93cyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlZ2lzdGVyKCkgeworICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIFNsb2cuZChUQUcsICJyZWdpc3RlcmluZyBkcmFnIGlucHV0IGNoYW5uZWwiKTsKKyAgICAgICAgICAgIGlmIChtQ2xpZW50Q2hhbm5lbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkR1cGxpY2F0ZSByZWdpc3RlciBvZiBkcmFnIGlucHV0IGNoYW5uZWwiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSW5wdXRDaGFubmVsW10gY2hhbm5lbHMgPSBJbnB1dENoYW5uZWwub3BlbklucHV0Q2hhbm5lbFBhaXIoImRyYWciKTsKKyAgICAgICAgICAgICAgICBtU2VydmVyQ2hhbm5lbCA9IGNoYW5uZWxzWzBdOworICAgICAgICAgICAgICAgIG1DbGllbnRDaGFubmVsID0gY2hhbm5lbHNbMV07CisgICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5yZWdpc3RlcklucHV0Q2hhbm5lbChtU2VydmVyQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgSW5wdXRRdWV1ZS5yZWdpc3RlcklucHV0Q2hhbm5lbChtQ2xpZW50Q2hhbm5lbCwgbURyYWdJbnB1dEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBtSC5nZXRMb29wZXIoKS5nZXRRdWV1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdW5yZWdpc3RlcigpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSBTbG9nLmQoVEFHLCAidW5yZWdpc3RlcmluZyBkcmFnIGlucHV0IGNoYW5uZWwiKTsKKyAgICAgICAgICAgIGlmIChtQ2xpZW50Q2hhbm5lbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIlVucmVnaXN0ZXIgb2Ygbm9uZXhpc3RlbnQgZHJhZyBpbnB1dCBjaGFubmVsIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIudW5yZWdpc3RlcklucHV0Q2hhbm5lbChtU2VydmVyQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgSW5wdXRRdWV1ZS51bnJlZ2lzdGVySW5wdXRDaGFubmVsKG1DbGllbnRDaGFubmVsKTsKKyAgICAgICAgICAgICAgICBtQ2xpZW50Q2hhbm5lbC5kaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgbUNsaWVudENoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIG1TZXJ2ZXJDaGFubmVsID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNhbGwgb3V0IHRvIGVhY2ggdmlzaWJsZSB3aW5kb3cvc2Vzc2lvbiBpbmZvcm1pbmcgaXQgYWJvdXQgdGhlIGRyYWcKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYnJvYWRjYXN0RHJhZ1N0YXJ0ZWRMdygpIHsKKyAgICAgICAgICAgIC8vIENhY2hlIGEgYmFzZS1jbGFzcyBpbnN0YW5jZSBvZiB0aGUgY2xpcCBtZXRhZGF0YSBzbyB0aGF0IHBhcmNlbGluZworICAgICAgICAgICAgLy8gd29ya3MgY29ycmVjdGx5IGluIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHBzLgorICAgICAgICAgICAgbURhdGFEZXNjcmlwdGlvbiA9IG5ldyBDbGlwRGVzY3JpcHRpb24obURhdGEpOworICAgICAgICAgICAgbU5vdGlmaWVkV2luZG93cy5jbGVhcigpOworICAgICAgICAgICAgbURyYWdJblByb2dyZXNzID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYnJvYWRjYXN0aW5nIERSQUdfU1RBUlRFRCBvZiAiICsgbURhdGFEZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERyYWdFdmVudCBldnQgPSBEcmFnRXZlbnQub2J0YWluKERyYWdFdmVudC5BQ1RJT05fRFJBR19TVEFSVEVELCAwLCAwLAorICAgICAgICAgICAgICAgICAgICBtRGF0YURlc2NyaXB0aW9uLCBudWxsKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVdpbmRvd3Muc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBzZW5kRHJhZ1N0YXJ0ZWRMdygpIGNsb25lcyBldnQgZm9yIGxvY2FsLXByb2Nlc3MgZGlzcGF0Y2gKKyAgICAgICAgICAgICAgICBzZW5kRHJhZ1N0YXJ0ZWRMdyhtV2luZG93cy5nZXQoaSksIGV2dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldnQucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyogaGVscGVyIC0gc2VuZCBhIGNhbGxlci1wcm92aWRlZCBldmVudCwgcHJlc3VtZWQgdG8gYmUgRFJBR19TVEFSVEVELCBpZiB0aGUKKyAgICAgICAgICogZGVzaWduYXRlZCB3aW5kb3cgaXMgcG90ZW50aWFsbHkgYSBkcm9wIHJlY2lwaWVudC4gIFRoZXJlIGFyZSByYWNlIHNpdHVhdGlvbnMKKyAgICAgICAgICogYXJvdW5kIERSQUdfRU5ERUQgYnJvYWRjYXN0LCBzbyB3ZSBtYWtlIHN1cmUgdGhhdCBvbmNlIHdlJ3ZlIGRlY2xhcmVkIHRoYXQKKyAgICAgICAgICogdGhlIGRyYWcgaGFzIGVuZGVkLCB3ZSBuZXZlciBzZW5kIG91dCBhbm90aGVyIERSQUdfU1RBUlRFRCBmb3IgdGhpcyBkcmFnIGFjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2QgY2xvbmVzIHRoZSAnZXZlbnQnIHBhcmFtZXRlciBpZiBpdCdzIGJlaW5nIGRlbGl2ZXJlZCB0byB0aGUgc2FtZQorICAgICAgICAgKiBwcm9jZXNzLCBzbyBpdCdzIHNhZmUgZm9yIHRoZSBjYWxsZXIgdG8gY2FsbCByZWN5Y2xlKCkgb24gdGhlIGV2ZW50IGFmdGVyd2FyZHMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgc2VuZERyYWdTdGFydGVkTHcoV2luZG93U3RhdGUgbmV3V2luLCBEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChtRHJhZ0luUHJvZ3Jlc3MgJiYgbmV3V2luLmlzUG90ZW50aWFsRHJhZ1RhcmdldCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvbmUgZm9yIGxvY2FsIGNhbGxlZXMgc2luY2UgZGlzcGF0Y2ggd2lsbCByZWN5Y2xlIHRoZSBldmVudAorICAgICAgICAgICAgICAgICAgICBpZiAoUHJvY2Vzcy5teVBpZCgpID09IG5ld1dpbi5tU2Vzc2lvbi5tUGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IERyYWdFdmVudC5vYnRhaW4oZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5ld1dpbi5tQ2xpZW50LmRpc3BhdGNoRHJhZ0V2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgZWFjaCB3aW5kb3cgdGhhdCB3ZSd2ZSBub3RpZmllZCB0aGF0IHRoZSBkcmFnIGlzIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmllZFdpbmRvd3MuYWRkKG5ld1dpbik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVuYWJsZSB0byBkcmFnLXN0YXJ0IHdpbmRvdyAiICsgbmV3V2luKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBoZWxwZXIgLSBjb25zdHJ1Y3QgYW5kIHNlbmQgYSBEUkFHX1NUQVJURUQgZXZlbnQgb25seSBpZiB0aGUgd2luZG93IGhhcyBub3QKKyAgICAgICAgICogcHJldmlvdXNseSBiZWVuIG5vdGlmaWVkLCBpLmUuIGl0IGJlY2FtZSB2aXNpYmxlIGFmdGVyIHRoZSBkcmFnIG9wZXJhdGlvbgorICAgICAgICAgKiB3YXMgYmVndW4uICBUaGlzIGlzIGEgcmFyZSBjYXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmREcmFnU3RhcnRlZElmTmVlZGVkTHcoV2luZG93U3RhdGUgbmV3V2luKSB7CisgICAgICAgICAgICBpZiAobURyYWdJblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBzZW50IHRoZSBkcmFnLXN0YXJ0ZWQsIHdlIG5lZWRuJ3QgZG8gc28gYWdhaW4KKyAgICAgICAgICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzIDogbU5vdGlmaWVkV2luZG93cykgeworICAgICAgICAgICAgICAgICAgICBpZiAod3MgPT0gbmV3V2luKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInNlbmRpbmcgRFJBR19TVEFSVEVEIHRvIG5ldyB3aW5kb3cgIiArIG5ld1dpbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERyYWdFdmVudCBldmVudCA9IERyYWdFdmVudC5vYnRhaW4oRHJhZ0V2ZW50LkFDVElPTl9EUkFHX1NUQVJURUQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YURlc2NyaXB0aW9uLCBudWxsKTsKKyAgICAgICAgICAgICAgICAvLyBzZW5kRHJhZ1N0YXJ0ZWRMdygpIGNsb25lcyAnZXZlbnQnIGlmIHRoZSB3aW5kb3cgaXMgcHJvY2Vzcy1sb2NhbAorICAgICAgICAgICAgICAgIHNlbmREcmFnU3RhcnRlZEx3KG5ld1dpbiwgZXZlbnQpOworICAgICAgICAgICAgICAgIGV2ZW50LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYnJvYWRjYXN0RHJhZ0VuZGVkKCkgeworICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYnJvYWRjYXN0aW5nIERSQUdfRU5ERUQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERyYWdFdmVudCBldnQgPSBEcmFnRXZlbnQub2J0YWluKERyYWdFdmVudC5BQ1RJT05fRFJBR19FTkRFRCwgMCwgMCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaW5kb3dNYXApIHsKKyAgICAgICAgICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzOiBtTm90aWZpZWRXaW5kb3dzKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5tQ2xpZW50LmRpc3BhdGNoRHJhZ0V2ZW50KGV2dCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5hYmxlIHRvIGRyYWctZW5kIHdpbmRvdyAiICsgd3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Ob3RpZmllZFdpbmRvd3MuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtRHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV2dC5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG5vdGlmeU1vdmVMdyhmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbXlQaWQgPSBQcm9jZXNzLm15UGlkKCk7CisKKyAgICAgICAgICAgIC8vIE1vdmUgdGhlIHN1cmZhY2UgdG8gdGhlIGdpdmVuIHRvdWNoCisgICAgICAgICAgICBtU3VyZmFjZS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIG1TdXJmYWNlLnNldFBvc2l0aW9uKChpbnQpKHggLSBtVGh1bWJPZmZzZXRYKSwgKGludCkoeSAtIG1UaHVtYk9mZnNldFkpKTsKKyAgICAgICAgICAgIG1TdXJmYWNlLmNsb3NlVHJhbnNhY3Rpb24oKTsKKworICAgICAgICAgICAgLy8gVGVsbCB0aGUgYWZmZWN0ZWQgd2luZG93CisgICAgICAgICAgICBXaW5kb3dTdGF0ZSB0b3VjaGVkV2luID0gZ2V0VG91Y2hlZFdpbkF0UG9pbnRMdyh4LCB5KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gaGF2ZSB3ZSBkcmFnZ2VkIG92ZXIgYSBuZXcgd2luZG93PworICAgICAgICAgICAgICAgIGlmICgodG91Y2hlZFdpbiAhPSBtVGFyZ2V0V2luZG93KSAmJiAobVRhcmdldFdpbmRvdyAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRFJBRykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInNlbmRpbmcgRFJBR19FWElURUQgdG8gIiArIG1UYXJnZXRXaW5kb3cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIERSQUdfRVhJVEVEX0VWRU5UIGlmIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgICAgIERyYWdFdmVudCBldnQgPSBEcmFnRXZlbnQub2J0YWluKERyYWdFdmVudC5BQ1RJT05fRFJBR19FWElURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRXaW5kb3cubUNsaWVudC5kaXNwYXRjaERyYWdFdmVudChldnQpOworICAgICAgICAgICAgICAgICAgICBpZiAobXlQaWQgIT0gbVRhcmdldFdpbmRvdy5tU2Vzc2lvbi5tUGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldnQucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0b3VjaGVkV2luICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzZW5kaW5nIERSQUdfTE9DQVRJT04gdG8gIiArIHRvdWNoZWRXaW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIERyYWdFdmVudCBldnQgPSBEcmFnRXZlbnQub2J0YWluKERyYWdFdmVudC5BQ1RJT05fRFJBR19MT0NBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgdG91Y2hlZFdpbi5tQ2xpZW50LmRpc3BhdGNoRHJhZ0V2ZW50KGV2dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChteVBpZCAhPSB0b3VjaGVkV2luLm1TZXNzaW9uLm1QaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJjYW4ndCBzZW5kIGRyYWcgbm90aWZpY2F0aW9uIHRvIHdpbmRvd3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UYXJnZXRXaW5kb3cgPSB0b3VjaGVkV2luOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVsbCB0aGUgZHJvcCB0YXJnZXQgYWJvdXQgdGhlIGRhdGEsIGFuZCB0aGVuIGJyb2FkY2FzdCB0aGUgZHJhZy1lbmRlZCBub3RpZmljYXRpb24KKyAgICAgICAgdm9pZCBub3RpZnlEcm9wTHcoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgV2luZG93U3RhdGUgdG91Y2hlZFdpbiA9IGdldFRvdWNoZWRXaW5BdFBvaW50THcoeCwgeSk7CisgICAgICAgICAgICBpZiAodG91Y2hlZFdpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInNlbmRpbmcgRFJPUCB0byAiICsgdG91Y2hlZFdpbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIGludCBteVBpZCA9IFByb2Nlc3MubXlQaWQoKTsKKyAgICAgICAgICAgICAgICBEcmFnRXZlbnQgZXZ0ID0gRHJhZ0V2ZW50Lm9idGFpbihEcmFnRXZlbnQuQUNUSU9OX0RST1AsIHgsIHksIG51bGwsIG1EYXRhKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0b3VjaGVkV2luLm1DbGllbnQuZGlzcGF0Y2hEcmFnRXZlbnQoZXZ0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiY2FuJ3Qgc2VuZCBkcm9wIG5vdGlmaWNhdGlvbiB0byB3aW4gIiArIHRvdWNoZWRXaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobXlQaWQgIT0gdG91Y2hlZFdpbi5tU2Vzc2lvbi5tUGlkKSB7CisgICAgICAgICAgICAgICAgICAgIGV2dC5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCB0aGUgdmlzaWJsZSwgdG91Y2gtZGVsaXZlcmFibGUgd2luZG93IHVuZGVyIHRoZSBnaXZlbiBwb2ludAorICAgICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIGdldFRvdWNoZWRXaW5BdFBvaW50THcoZmxvYXQgeGYsIGZsb2F0IHlmKSB7CisgICAgICAgICAgICBXaW5kb3dTdGF0ZSB0b3VjaGVkV2luID0gbnVsbDsKKyAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCkgeGY7CisgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIHlmOworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFdpbmRvd1N0YXRlPiB3aW5kb3dzID0gbVdpbmRvd3M7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IHdpbmRvd3Muc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IE4gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIGNoaWxkID0gd2luZG93cy5nZXQoaSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGZsYWdzID0gY2hpbGQubUF0dHJzLmZsYWdzOworICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWaXNpYmxlTHcoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3QgdmlzaWJsZSA9PSBkb24ndCB0ZWxsIGFib3V0IGRyYWdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hBQkxFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0b3VjaGFibGUgPT0gZG9uJ3QgdGVsbCBhYm91dCBkcmFncworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIHdpbmRvdydzIGRlY29yIGV0YworICAgICAgICAgICAgICAgIHRtcFJlY3Quc2V0KGNoaWxkLm1GcmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm1Ub3VjaGFibGVJbnNldHMgPT0gVmlld1RyZWVPYnNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnRlcm5hbEluc2V0c0luZm8uVE9VQ0hBQkxFX0lOU0VUU19DT05URU5UKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwb2ludCBpcyBpbnNpZGUgb2YgdGhlIHdpbmRvdyBpZiBpdCBpcworICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIGZyYW1lLCBBTkQgdGhlIGNvbnRlbnQgcGFydCBvZiB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lIHRoYXQgd2FzIGdpdmVuIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgdG1wUmVjdC5sZWZ0ICs9IGNoaWxkLm1HaXZlbkNvbnRlbnRJbnNldHMubGVmdDsKKyAgICAgICAgICAgICAgICAgICAgdG1wUmVjdC50b3AgKz0gY2hpbGQubUdpdmVuQ29udGVudEluc2V0cy50b3A7CisgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QucmlnaHQgLT0gY2hpbGQubUdpdmVuQ29udGVudEluc2V0cy5yaWdodDsKKyAgICAgICAgICAgICAgICAgICAgdG1wUmVjdC5ib3R0b20gLT0gY2hpbGQubUdpdmVuQ29udGVudEluc2V0cy5ib3R0b207CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5tVG91Y2hhYmxlSW5zZXRzID09IFZpZXdUcmVlT2JzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW50ZXJuYWxJbnNldHNJbmZvLlRPVUNIQUJMRV9JTlNFVFNfVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcG9pbnQgaXMgaW5zaWRlIG9mIHRoZSB3aW5kb3cgaWYgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSBmcmFtZSwgQU5EIHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZSB0aGF0IHdhcyBnaXZlbiBieSB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QubGVmdCArPSBjaGlsZC5tR2l2ZW5WaXNpYmxlSW5zZXRzLmxlZnQ7CisgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QudG9wICs9IGNoaWxkLm1HaXZlblZpc2libGVJbnNldHMudG9wOworICAgICAgICAgICAgICAgICAgICB0bXBSZWN0LnJpZ2h0IC09IGNoaWxkLm1HaXZlblZpc2libGVJbnNldHMucmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QuYm90dG9tIC09IGNoaWxkLm1HaXZlblZpc2libGVJbnNldHMuYm90dG9tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG91Y2hGbGFncyA9IGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wUmVjdC5jb250YWlucyh4LCB5KSB8fCB0b3VjaEZsYWdzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQKKyAgICAgICAgICAgICAgICAgICAgdG91Y2hlZFdpbiA9IGNoaWxkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0b3VjaGVkV2luOworICAgICAgICB9CisgICAgfQorCisgICAgRHJhZ1N0YXRlIG1EcmFnU3RhdGUgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgSW5wdXRIYW5kbGVyIG1EcmFnSW5wdXRIYW5kbGVyID0gbmV3IEJhc2VJbnB1dEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNb3Rpb24oTW90aW9uRXZlbnQgZXZlbnQsIFJ1bm5hYmxlIGZpbmlzaGVkQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5kRHJhZyA9IGZhbHNlOworICAgICAgICAgICAgZmluYWwgZmxvYXQgbmV3WCA9IGV2ZW50LmdldFJhd1goKTsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IG5ld1kgPSBldmVudC5nZXRSYXdZKCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG1EcmFnU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEFjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVuZXhwZWN0ZWQgQUNUSU9OX0RPV04gaW4gZHJhZyBsYXllciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdpbmRvd01hcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIHN1cmZhY2UgYW5kIHRlbGwgdGhlIGludm9sdmVkIHdpbmRvdyhzKSB3aGVyZSB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLm5vdGlmeU1vdmVMdyhuZXdYLCBuZXdZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIFNsb2cuZChUQUcsICJHb3QgVVAgb24gbW92ZSBjaGFubmVsOyBkcm9wcGluZyBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3WCArICIsIiArIG5ld1kpOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyYWdTdGF0ZS5ub3RpZnlEcm9wTHcobmV3WCwgbmV3WSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbmREcmFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSBTbG9nLmQoVEFHLCAiRHJhZyBjYW5jZWxsZWQhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmREcmFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChlbmREcmFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRFJBRykgU2xvZy5kKFRBRywgIkRyYWcgZW5kZWQ7IHRlYXJpbmcgZG93biBzdGF0ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsbCBhbGwgdGhlIHdpbmRvd3MgdGhhdCB0aGUgZHJhZyBoYXMgZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUuYnJvYWRjYXN0RHJhZ0VuZGVkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgaW50ZXJjZXB0aW5nIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLnVucmVnaXN0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3IudXBkYXRlSW5wdXRXaW5kb3dzTHcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlZSBvdXIgcmVzb3VyY2VzIGFuZCBkcm9wIGFsbCB0aGUgb2JqZWN0IHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXhjZXB0aW9uIGNhdWdodCBieSBkcmFnIGhhbmRsZU1vdGlvbiIsIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBmaW5pc2hlZENhbGxiYWNrLnJ1bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgogICAgICAqIFdoZXRoZXIgdGhlIFVJIGlzIGN1cnJlbnRseSBydW5uaW5nIGluIHRvdWNoIG1vZGUgKG5vdCBzaG93aW5nCiAgICAgICogbmF2aWdhdGlvbmFsIGZvY3VzIGJlY2F1c2UgdGhlIHVzZXIgaXMgZGlyZWN0bHkgcHJlc3NpbmcgdGhlIHNjcmVlbikuCiAgICAgICovCkBAIC0xNzg5LDE4ICsyMTIzLDExIEBACiAgICAgICAgIGJvb2xlYW4gcmVwb3J0TmV3Q29uZmlnID0gZmFsc2U7CiAgICAgICAgIFdpbmRvd1N0YXRlIGF0dGFjaGVkV2luZG93ID0gbnVsbDsKICAgICAgICAgV2luZG93U3RhdGUgd2luID0gbnVsbDsKKyAgICAgICAgbG9uZyBvcmlnSWQ7CiAKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIC8vIEluc3RhbnRpYXRpbmcgYSBEaXNwbGF5IHJlcXVpcmVzIHRhbGtpbmcgd2l0aCB0aGUgc2ltdWxhdG9yLAotICAgICAgICAgICAgLy8gc28gZG9uJ3QgZG8gaXQgdW50aWwgd2Uga25vdyB0aGUgc3lzdGVtIGlzIG1vc3RseSB1cCBhbmQKLSAgICAgICAgICAgIC8vIHJ1bm5pbmcuCiAgICAgICAgICAgICBpZiAobURpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5zZXREaXNwbGF5U2l6ZSgwLCBtSW5pdGlhbERpc3BsYXlXaWR0aCwgbUluaXRpYWxEaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICByZXBvcnROZXdDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgaGFzIG5vdCBiZWVuIGluaXRpYWxpYWxpemVkIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtV2luZG93TWFwLmNvbnRhaW5zS2V5KGNsaWVudC5hc0JpbmRlcigpKSkgewpAQCAtMTkwNiw3ICsyMjMzLDcgQEAKIAogICAgICAgICAgICAgcmVzID0gV2luZG93TWFuYWdlckltcGwuQUREX09LQVk7CiAKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgICAgICAgICAgaWYgKGFkZFRva2VuKSB7CiAgICAgICAgICAgICAgICAgbVRva2VuTWFwLnB1dChhdHRycy50b2tlbiwgdG9rZW4pOwpAQCAtMTk4MywxNCArMjMxMCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gc2VuZE5ld0NvbmZpZ3VyYXRpb24oKSBjaGVja3MgY2FsbGVyIHBlcm1pc3Npb25zIHNvIHdlIG11c3QgY2FsbCBpdCB3aXRoCi0gICAgICAgIC8vIHByaXZpbGVnZS4gIHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2VucygpIGNsZWFycyBhbmQgcmVzZXRzIHRoZSBjYWxsZXIKLSAgICAgICAgLy8gaWRlbnRpdHkgYW55d2F5LCBzbyBpdCdzIHNhZmUgdG8ganVzdCBjbGVhciAmIHJlc3RvcmUgYXJvdW5kIHRoaXMgd2hvbGUKLSAgICAgICAgLy8gYmxvY2suCi0gICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGlmIChyZXBvcnROZXdDb25maWcpIHsKICAgICAgICAgICAgIHNlbmROZXdDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIH0KKwogICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvcmlnSWQpOwogCiAgICAgICAgIHJldHVybiByZXM7CkBAIC00NDM2LDggKzQ3NTksNyBAQAogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtV2luZG93cy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgdyA9IG1XaW5kb3dzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAody5pc1Zpc2libGVMdygpICYmICF3Lm1PYnNjdXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHcubU9yaWVudGF0aW9uQ2hhbmdpbmcgfHwgIXcuaXNEcmF3bkx3KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHcuaXNWaXNpYmxlTHcoKSAmJiAhdy5tT2JzY3VyZWQgJiYgIXcuaXNEcmF3bkx3KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTUwNTUsNyArNTM3Nyw2MCBAQAogICAgICAgICBtUG9saWN5LmFkanVzdENvbmZpZ3VyYXRpb25Mdyhjb25maWcpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRHJhZyBhbmQgZHJvcAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIElCaW5kZXIgcHJlcGFyZURyYWdTdXJmYWNlKElXaW5kb3cgd2luZG93LCBTdXJmYWNlU2Vzc2lvbiBzZXNzaW9uLAorICAgICAgICAgICAgYm9vbGVhbiBsb2NhbE9ubHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgU3VyZmFjZSBvdXRTdXJmYWNlKSB7CisgICAgICAgIGlmIChERUJVR19EUkFHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAicHJlcGFyZSBkcmFnIHN1cmZhY2U6IHc9IiArIHdpZHRoICsgIiBoPSIgKyBoZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGxvY2FsPSIgKyBsb2NhbE9ubHkgKyAiIHdpbj0iICsgd2luZG93CisgICAgICAgICAgICAgICAgICAgICsgIiBhc2JpbmRlcj0iICsgd2luZG93LmFzQmluZGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNhbGxlclBpZCA9IEJpbmRlci5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIElCaW5kZXIgdG9rZW4gPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaW5kb3dNYXApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogZmFpbCBpZiB0aGUgZ2l2ZW4gd2luZG93IGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIHRvdWNoIGZvY3VzPworCisgICAgICAgICAgICAgICAgICAgIGlmIChtRHJhZ1N0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2Ugc3VyZmFjZSA9IG5ldyBTdXJmYWNlKHNlc3Npb24sIGNhbGxlclBpZCwgImRyYWcgc3VyZmFjZSIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5ULCBTdXJmYWNlLkhJRERFTik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdXJmYWNlLmNvcHlGcm9tKHN1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBuZXcgQmluZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlID0gbmV3IERyYWdTdGF0ZSh0b2tlbiwgc3VyZmFjZSwgbG9jYWxPbmx5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUubVN1cmZhY2UgPSBzdXJmYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgbURyYWdTdGF0ZS5tTG9jYWxPbmx5ID0gbG9jYWxPbmx5OworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBtRHJhZ1N0YXRlLm1Ub2tlbiA9IG5ldyBCaW5kZXIoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gNSBzZWNvbmQgdGltZW91dCBmb3IgdGhpcyB3aW5kb3cgdG8gYWN0dWFsbHkgYmVnaW4gdGhlIGRyYWcKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ILnJlbW92ZU1lc3NhZ2VzKEguRFJBR19TVEFSVF9USU1FT1VULCB3aW5kb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSC5vYnRhaW5NZXNzYWdlKEguRFJBR19TVEFSVF9USU1FT1VULCB3aW5kb3cuYXNCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSC5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCA1MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJEcmFnIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFN1cmZhY2UuT3V0T2ZSZXNvdXJjZXNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3QgYWxsb2NhdGUgZHJhZyBzdXJmYWNlIHc9IiArIHdpZHRoICsgIiBoPSIgKyBoZWlnaHQsIGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobURyYWdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9yaWdJZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIElucHV0IEV2ZW50cyBhbmQgRm9jdXMgTWFuYWdlbWVudAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUxNTQsNyArNTUyOSw0MiBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkRHJhZ0lucHV0V2luZG93KElucHV0V2luZG93TGlzdCB3aW5kb3dMaXN0KSB7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFdpbmRvdyBpbnB1dFdpbmRvdyA9IHdpbmRvd0xpc3QuYWRkKCk7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5pbnB1dENoYW5uZWwgPSBtRHJhZ1N0YXRlLm1TZXJ2ZXJDaGFubmVsOworICAgICAgICAgICAgaW5wdXRXaW5kb3cubmFtZSA9ICJkcmFnIjsKKyAgICAgICAgICAgIGlucHV0V2luZG93LmxheW91dFBhcmFtc0ZsYWdzID0gMDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LmxheW91dFBhcmFtc1R5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0RSQUc7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5kaXNwYXRjaGluZ1RpbWVvdXROYW5vcyA9IERFRkFVTFRfSU5QVVRfRElTUEFUQ0hJTkdfVElNRU9VVF9OQU5PUzsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnZpc2libGUgPSB0cnVlOworICAgICAgICAgICAgaW5wdXRXaW5kb3cuY2FuUmVjZWl2ZUtleXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGlucHV0V2luZG93Lmhhc0ZvY3VzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlucHV0V2luZG93Lmhhc1dhbGxwYXBlciA9IGZhbHNlOworICAgICAgICAgICAgaW5wdXRXaW5kb3cucGF1c2VkID0gZmFsc2U7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5sYXllciA9IG1Qb2xpY3kud2luZG93VHlwZVRvTGF5ZXJMdyhpbnB1dFdpbmRvdy5sYXlvdXRQYXJhbXNUeXBlKQorICAgICAgICAgICAgICAgICAgICAqIFRZUEVfTEFZRVJfTVVMVElQTElFUgorICAgICAgICAgICAgICAgICAgICArIFRZUEVfTEFZRVJfT0ZGU0VUOworICAgICAgICAgICAgaW5wdXRXaW5kb3cub3duZXJQaWQgPSBQcm9jZXNzLm15UGlkKCk7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5vd25lclVpZCA9IFByb2Nlc3MubXlVaWQoKTsKKworICAgICAgICAgICAgLy8gVGhlIGRyYWcgd2luZG93IGNvdmVycyB0aGUgZW50aXJlIGRpc3BsYXkKKyAgICAgICAgICAgIGlucHV0V2luZG93LmZyYW1lTGVmdCA9IDA7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5mcmFtZVRvcCA9IDA7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5mcmFtZVJpZ2h0ID0gbURpc3BsYXkuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGlucHV0V2luZG93LmZyYW1lQm90dG9tID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgICAgIGlucHV0V2luZG93LnZpc2libGVGcmFtZUxlZnQgPSBpbnB1dFdpbmRvdy5mcmFtZUxlZnQ7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy52aXNpYmxlRnJhbWVUb3AgPSBpbnB1dFdpbmRvdy5mcmFtZVRvcDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnZpc2libGVGcmFtZVJpZ2h0ID0gaW5wdXRXaW5kb3cuZnJhbWVSaWdodDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnZpc2libGVGcmFtZUJvdHRvbSA9IGlucHV0V2luZG93LmZyYW1lQm90dG9tOworCisgICAgICAgICAgICBpbnB1dFdpbmRvdy50b3VjaGFibGVBcmVhTGVmdCA9IGlucHV0V2luZG93LmZyYW1lTGVmdDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnRvdWNoYWJsZUFyZWFUb3AgPSBpbnB1dFdpbmRvdy5mcmFtZVRvcDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnRvdWNoYWJsZUFyZWFSaWdodCA9IGlucHV0V2luZG93LmZyYW1lUmlnaHQ7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy50b3VjaGFibGVBcmVhQm90dG9tID0gaW5wdXRXaW5kb3cuZnJhbWVCb3R0b207CisgICAgICAgIH0KKwogICAgICAgICAvKiBVcGRhdGVzIHRoZSBjYWNoZWQgd2luZG93IGluZm9ybWF0aW9uIHByb3ZpZGVkIHRvIHRoZSBpbnB1dCBkaXNwYXRjaGVyLiAqLwogICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVJbnB1dFdpbmRvd3NMdygpIHsKICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBpbnB1dCB3aW5kb3cgbGlzdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvZiB0aGUgd2luZG93cyB0aGF0CkBAIC01MTYzLDYgKzU1NzMsMTYgQEAKICAgICAgICAgICAgIC8vIG91dCB0byBiZSBkaWZmaWN1bHQgYmVjYXVzZSBvbmx5IHRoZSBuYXRpdmUgY29kZSBrbm93cyBmb3Igc3VyZSB3aGljaCB3aW5kb3cKICAgICAgICAgICAgIC8vIGN1cnJlbnRseSBoYXMgdG91Y2ggZm9jdXMuCiAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8V2luZG93U3RhdGU+IHdpbmRvd3MgPSBtV2luZG93czsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIGRyYWcgaW4gZmxpZ2h0LCBwcm92aWRlIGEgcHNldWRvd2luZG93IHRvIGNhdGNoIGRyYWcgaW5wdXQKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5EcmFnID0gKG1EcmFnU3RhdGUgIT0gbnVsbCk7CisgICAgICAgICAgICBpZiAoaW5EcmFnKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSW5zZXJ0aW5nIGRyYWcgd2luZG93Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZERyYWdJbnB1dFdpbmRvdyhtVGVtcElucHV0V2luZG93cyk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gd2luZG93cy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gTiAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgV2luZG93U3RhdGUgY2hpbGQgPSB3aW5kb3dzLmdldChpKTsKQEAgLTUxNzgsNyArNTU5OCwxMyBAQAogICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWaXNpYmxlID0gY2hpbGQuaXNWaXNpYmxlTHcoKTsKICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1dhbGxwYXBlciA9IChjaGlsZCA9PSBtV2FsbHBhcGVyVGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHR5cGUgIT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9LRVlHVUFSRCk7Ci0gICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgZHJhZyBpbiBwcm9ncmVzcyBhbmQgJ2NoaWxkJyBpcyBhIHBvdGVudGlhbCBkcm9wIHRhcmdldCwKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgaXQncyBiZWVuIHRvbGQgYWJvdXQgdGhlIGRyYWcKKyAgICAgICAgICAgICAgICBpZiAoaW5EcmFnICYmIGlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLnNlbmREcmFnU3RhcnRlZElmTmVlZGVkTHcoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIEFkZCBhIHdpbmRvdyB0byBvdXIgbGlzdCBvZiBpbnB1dCB3aW5kb3dzLgogICAgICAgICAgICAgICAgIGZpbmFsIElucHV0V2luZG93IGlucHV0V2luZG93ID0gbVRlbXBJbnB1dFdpbmRvd3MuYWRkKCk7CiAgICAgICAgICAgICAgICAgaW5wdXRXaW5kb3cuaW5wdXRDaGFubmVsID0gY2hpbGQubUlucHV0Q2hhbm5lbDsKQEAgLTU1NjksNiArNTk5NSwyMiBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVdpbmRvd01hcCkgeworICAgICAgICAgICAgaWYgKG1EaXNwbGF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEaXNwbGF5IGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworICAgICAgICAgICAgbURpc3BsYXkgPSB3bS5nZXREZWZhdWx0RGlzcGxheSgpOworICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5V2lkdGggPSBtRGlzcGxheS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnNldERpc3BsYXlTaXplKDAsIG1Jbml0aWFsRGlzcGxheVdpZHRoLCBtSW5pdGlhbERpc3BsYXlIZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIudXBkYXRlQ29uZmlndXJhdGlvbihudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgbVBvbGljeS5zeXN0ZW1SZWFkeSgpOwogICAgIH0KIApAQCAtNTczNCw2ICs2MTc2LDg2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvKiBEcmFnL2Ryb3AgKi8KKyAgICAgICAgcHVibGljIElCaW5kZXIgcHJlcGFyZURyYWcoSVdpbmRvdyB3aW5kb3csIGJvb2xlYW4gbG9jYWxPbmx5LAorICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgU3VyZmFjZSBvdXRTdXJmYWNlKSB7CisgICAgICAgICAgICByZXR1cm4gcHJlcGFyZURyYWdTdXJmYWNlKHdpbmRvdywgbVN1cmZhY2VTZXNzaW9uLCBsb2NhbE9ubHksCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIG91dFN1cmZhY2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybURyYWcoSVdpbmRvdyB3aW5kb3csIElCaW5kZXIgZHJhZ1Rva2VuLAorICAgICAgICAgICAgICAgIGZsb2F0IHRvdWNoWCwgZmxvYXQgdG91Y2hZLCBmbG9hdCB0aHVtYkNlbnRlclgsIGZsb2F0IHRodW1iQ2VudGVyWSwKKyAgICAgICAgICAgICAgICBDbGlwRGF0YSBkYXRhKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfRFJBRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJwZXJmb3JtIGRyYWc6IHdpbj0iICsgd2luZG93ICsgIiBkYXRhPSIgKyBkYXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1EcmFnU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiTm8gZHJhZyBwcmVwYXJlZCIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwZXJmb3JtRHJhZygpIHdpdGhvdXQgcHJlcGFyZURyYWcoKSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkcmFnVG9rZW4gIT0gbURyYWdTdGF0ZS5tVG9rZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlBlcmZvcm1pbmcgbWlzbWF0Y2hlZCBkcmFnIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBlcmZvcm1EcmFnKCkgZG9lcyBub3QgbWF0Y2ggcHJlcGFyZURyYWcoKSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIGNhbGxpbmdXaW4gPSB3aW5kb3dGb3JDbGllbnRMb2NrZWQobnVsbCwgd2luZG93LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKGNhbGxpbmdXaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQmFkIHJlcXVlc3Rpbmcgd2luZG93ICIgKyB3aW5kb3cpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyAhISEgVE9ETzogdGhyb3cgaGVyZT8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogaWYgaW5wdXQgaXMgbm90IHN0aWxsIGZvY3VzZWQgb24gdGhlIGluaXRpYXRpbmcgd2luZG93LCBmYWlsCisgICAgICAgICAgICAgICAgLy8gdGhlIGRyYWcgaW5pdGlhdGlvbiAoZS5nLiBhbiBhbGFybSB3aW5kb3cgcG9wcGVkIHVwIGp1c3QgYXMgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgLy8gY2FsbGVkIHBlcmZvcm1EcmFnKCkKKworICAgICAgICAgICAgICAgIG1ILnJlbW92ZU1lc3NhZ2VzKEguRFJBR19TVEFSVF9USU1FT1VULCB3aW5kb3cuYXNCaW5kZXIoKSk7CisKKyAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogZXh0cmFjdCB0aGUgY3VycmVudCB0b3VjaCAoeCwgeSkgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLiAgVGhhdAorICAgICAgICAgICAgICAgIC8vIHdpbGwgbGV0IHVzIGVsaW1pbmF0ZSB0aGUgKHRvdWNoWCx0b3VjaFkpIHBhcmFtZXRlcnMgZnJvbSB0aGUgQVBJLgorCisgICAgICAgICAgICAgICAgbURyYWdTdGF0ZS5yZWdpc3RlcigpOworICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3IudXBkYXRlSW5wdXRXaW5kb3dzTHcoKTsKKyAgICAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnRyYW5zZmVyVG91Y2hGb2N1cyhjYWxsaW5nV2luLm1JbnB1dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLm1TZXJ2ZXJDaGFubmVsKTsKKworICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUubURhdGEgPSBkYXRhOworICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUuYnJvYWRjYXN0RHJhZ1N0YXJ0ZWRMdygpOworCisgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIHRodW1iIG9mZnNldHMgZm9yIGxhdGVyCisgICAgICAgICAgICAgICAgbURyYWdTdGF0ZS5tVGh1bWJPZmZzZXRYID0gdGh1bWJDZW50ZXJYOworICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUubVRodW1iT2Zmc2V0WSA9IHRodW1iQ2VudGVyWTsKKworICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIHN1cmZhY2UgdmlzaWJsZSBhdCB0aGUgcHJvcGVyIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgZmluYWwgU3VyZmFjZSBzdXJmYWNlID0gbURyYWdTdGF0ZS5tU3VyZmFjZTsKKyAgICAgICAgICAgICAgICBzdXJmYWNlLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2Uuc2V0UG9zaXRpb24oKGludCkodG91Y2hYIC0gdGh1bWJDZW50ZXJYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSh0b3VjaFkgLSB0aHVtYkNlbnRlclkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLnNob3coKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLmNsb3NlVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAvLyBzdWNjZXNzIQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZHJhZ1JlY2lwaWVudEVudGVyZWQoSVdpbmRvdyB3aW5kb3cpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRyYWcgaW50byBuZXcgY2FuZGlkYXRlIHZpZXcgQCAiICsgd2luZG93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRyYWdSZWNpcGllbnRFeGl0ZWQoSVdpbmRvdyB3aW5kb3cpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRyYWcgZnJvbSBvbGQgY2FuZGlkYXRlIHZpZXcgQCAiICsgd2luZG93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFdhbGxwYXBlclBvc2l0aW9uKElCaW5kZXIgd2luZG93LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB4U3RlcCwgZmxvYXQgeVN0ZXApIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7CiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwpAQCAtNjg0OSw3ICs3MzcxLDcgQEAKICAgICAgICAgICAgIGZpbmFsIEFwcFdpbmRvd1Rva2VuIGF0b2tlbiA9IG1BcHBUb2tlbjsKICAgICAgICAgICAgIHJldHVybiBtU3VyZmFjZSAhPSBudWxsICYmICFtQXR0YWNoZWRIaWRkZW4KICAgICAgICAgICAgICAgICAgICAgJiYgKGF0b2tlbiA9PSBudWxsID8gbVBvbGljeVZpc2liaWxpdHkgOiAhYXRva2VuLmhpZGRlblJlcXVlc3RlZCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICghbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcpKQorICAgICAgICAgICAgICAgICAgICAmJiAhbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcKICAgICAgICAgICAgICAgICAgICAgJiYgIW1FeGl0aW5nICYmICFtRGVzdHJveWluZzsKICAgICAgICAgfQogCkBAIC02ODc1LDYgKzczOTcsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDYW4gdGhpcyB3aW5kb3cgcG9zc2libHkgYmUgYSBkcmFnL2Ryb3AgdGFyZ2V0PyAgVGhlIHRlc3QgaGVyZSBpcworICAgICAgICAgKiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSAidmlzaWJsZSBub3ciIHdpdGggdGhlIGNoZWNrIHRoYXQgdGhlCisgICAgICAgICAqIElucHV0IE1hbmFnZXIgdXNlcyB3aGVuIGRpc2NhcmRpbmcgd2luZG93cyBmcm9tIGlucHV0IGNvbnNpZGVyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGlzUG90ZW50aWFsRHJhZ1RhcmdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpc1Zpc2libGVOb3coKSAmJiAobUlucHV0Q2hhbm5lbCAhPSBudWxsKSAmJiAhbVJlbW92ZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogU2FtZSBhcyBpc1Zpc2libGUoKSwgYnV0IHdlIGFsc28gY291bnQgaXQgYXMgdmlzaWJsZSBiZXR3ZWVuIHRoZQogICAgICAgICAgKiBjYWxsIHRvIElXaW5kb3dTZXNzaW9uLmFkZCgpIGFuZCB0aGUgZmlyc3QgcmVsYXlvdXQoKS4KICAgICAgICAgICovCkBAIC02OTUzLDE0ICs3NDg0LDEyIEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGhhcyBhIHN1cmZhY2UgdGhhdCBpdCBoYXMgZHJhd24gYQotICAgICAgICAgKiBjb21wbGV0ZSBVSSBpbiB0by4gIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgb3JpZW50YXRpb24KLSAgICAgICAgICogaXMgY2hhbmdpbmcgZXZlbiBpZiB0aGUgd2luZG93IGhhc24ndCByZWRyYXduIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAotICAgICAgICAgKiB0byBzdG9wIHRoaW5ncyBmcm9tIGV4ZWN1dGluZyBkdXJpbmcgdGhhdCB0aW1lLgorICAgICAgICAgKiBjb21wbGV0ZSBVSSBpbiB0by4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRHJhd25MdygpIHsKICAgICAgICAgICAgIGZpbmFsIEFwcFdpbmRvd1Rva2VuIGF0b2tlbiA9IG1BcHBUb2tlbjsKICAgICAgICAgICAgIHJldHVybiBtU3VyZmFjZSAhPSBudWxsICYmICFtRGVzdHJveWluZwotICAgICAgICAgICAgICAgICYmIChtT3JpZW50YXRpb25DaGFuZ2luZyB8fCAoIW1EcmF3UGVuZGluZyAmJiAhbUNvbW1pdERyYXdQZW5kaW5nKSk7CisgICAgICAgICAgICAgICAgJiYgIW1EcmF3UGVuZGluZyAmJiAhbUNvbW1pdERyYXdQZW5kaW5nOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC03Nzc3LDYgKzgzMDYsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfRlJFRVpFX1RJTUVPVVQgPSAxNzsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9ORVdfQ09ORklHVVJBVElPTiA9IDE4OwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPUlRfV0lORE9XU19DSEFOR0UgPSAxOTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJBR19TVEFSVF9USU1FT1VUID0gMjA7CiAKICAgICAgICAgcHJpdmF0ZSBTZXNzaW9uIG1MYXN0UmVwb3J0ZWRIb2xkOwogCkBAIC04MTE5LDYgKzg2NDksMjAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBEUkFHX1NUQVJUX1RJTUVPVVQ6IHsKKyAgICAgICAgICAgICAgICAgICAgSUJpbmRlciB3aW4gPSAoSUJpbmRlciltc2cub2JqOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRFJBRykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlRpbWVvdXQgc3RhcnRpbmcgZHJhZyBieSB3aW4gIiArIHdpbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogQU5SIHRoZSBhcHAgdGhhdCBoYXMgZmFpbGVkIHRvIHN0YXJ0IHRoZSBkcmFnIGluIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRHJhZ1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyYWdTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTg0NjEsNiArOTAwNSwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBlcmZvcm1MYXlvdXRBbmRQbGFjZVN1cmZhY2VzTG9ja2VkSW5uZXIoCiAgICAgICAgICAgICBib29sZWFuIHJlY292ZXJpbmdNZW1vcnkpIHsKKyAgICAgICAgaWYgKG1EaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuaShUQUcsICJza2lwcGluZyBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyIHdpdGggbm8gbURpc3BsYXkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgaW50IGR3ID0gbURpc3BsYXkuZ2V0V2lkdGgoKTsKICAgICAgICAgZmluYWwgaW50IGRoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CkBAIC05MjQ5LDEyICs5Nzk4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHcubUF0dGFjaGVkSGlkZGVuIHx8ICF3LmlzUmVhZHlGb3JEaXNwbGF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdy5tTGFzdEhpZGRlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19DT05GSUdVUkFUSU9OKSBTbG9nLnYoVEFHLCAiV2luZG93IGhpZGluZzogd2FpdGluZ1RvU2hvdz0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVJvb3RUb2tlbi53YWl0aW5nVG9TaG93ICsgIiBwb2x2aXM9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1Qb2xpY3lWaXNpYmlsaXR5ICsgIiBhdHRoaWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1BdHRhY2hlZEhpZGRlbiArICIgdG9raGlkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tUm9vdFRva2VuLmhpZGRlbiArICIgdmlzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tVmlld1Zpc2liaWxpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcubUxhc3RIaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX1RSQU5TQUNUSU9OUykgbG9nU3VyZmFjZSh3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhJREUgKHBlcmZvcm1MYXlvdXQpIiwgbnVsbCk7CkBAIC05NjU1LDMwICsxMDE5OCwyNiBAQAogICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGluZykgewogICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkxvY2tlZChjdXJyZW50VGltZSsoMTAwMC82MCktU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIG1JbnB1dE1vbml0b3IudXBkYXRlSW5wdXRXaW5kb3dzTHcoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChERUJVR19GUkVFWkUpIFNsb2cudihUQUcsICJMYXlvdXQ6IG1EaXNwbGF5RnJvemVuPSIgKyBtRGlzcGxheUZyb3plbgotICAgICAgICAgICAgICAgICsgIiBob2xkU2NyZWVuPSIgKyBob2xkU2NyZWVuKTsKLSAgICAgICAgaWYgKCFtRGlzcGxheUZyb3plbikgewotICAgICAgICAgICAgc2V0SG9sZFNjcmVlbkxvY2tlZChob2xkU2NyZWVuICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHNjcmVlbkJyaWdodG5lc3MgPCAwIHx8IHNjcmVlbkJyaWdodG5lc3MgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgKHNjcmVlbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnV0dG9uQnJpZ2h0bmVzcyA8IDAgfHwgYnV0dG9uQnJpZ2h0bmVzcyA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChob2xkU2NyZWVuICE9IG1Ib2xkaW5nU2NyZWVuT24pIHsKLSAgICAgICAgICAgICAgICBtSG9sZGluZ1NjcmVlbk9uID0gaG9sZFNjcmVlbjsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG0gPSBtSC5vYnRhaW5NZXNzYWdlKEguSE9MRF9TQ1JFRU5fQ0hBTkdFRCwgaG9sZFNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUguc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgc2V0SG9sZFNjcmVlbkxvY2tlZChob2xkU2NyZWVuICE9IG51bGwpOworICAgICAgICBpZiAoc2NyZWVuQnJpZ2h0bmVzcyA8IDAgfHwgc2NyZWVuQnJpZ2h0bmVzcyA+IDEuMGYpIHsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCisgICAgICAgICAgICAgICAgICAgIChzY3JlZW5CcmlnaHRuZXNzICogUG93ZXIuQlJJR0hUTkVTU19PTikpOworICAgICAgICB9CisgICAgICAgIGlmIChidXR0b25CcmlnaHRuZXNzIDwgMCB8fCBidXR0b25CcmlnaHRuZXNzID4gMS4wZikgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKKyAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvbGRTY3JlZW4gIT0gbUhvbGRpbmdTY3JlZW5PbikgeworICAgICAgICAgICAgbUhvbGRpbmdTY3JlZW5PbiA9IGhvbGRTY3JlZW47CisgICAgICAgICAgICBNZXNzYWdlIG0gPSBtSC5vYnRhaW5NZXNzYWdlKEguSE9MRF9TQ1JFRU5fQ0hBTkdFRCwgaG9sZFNjcmVlbik7CisgICAgICAgICAgICBtSC5zZW5kTWVzc2FnZShtKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtVHVybk9uU2NyZWVuKSB7CkBAIC05OTY3LDggKzEwNTA2LDYgQEAKICAgICAgICAgICAgIG1GcmVlemVHY1BlbmRpbmcgPSBub3c7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiKioqIEZSRUVaSU5HIERJU1BMQVkiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgCiAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIG1JbnB1dE1vbml0b3IuZnJlZXplSW5wdXREaXNwYXRjaGluZ0x3KCk7CkBAIC05OTk1LDggKzEwNTMyLDYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgaWYgKERFQlVHX0ZSRUVaRSkgU2xvZy52KFRBRywgIioqKiBVTkZSRUVaSU5HIERJU1BMQVkiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgCiAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gZmFsc2U7CiAgICAgICAgIG1ILnJlbW92ZU1lc3NhZ2VzKEguQVBQX0ZSRUVaRV9USU1FT1VUKTsKICAgICAgICAgaWYgKFBST0ZJTEVfT1JJRU5UQVRJT04pIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA3OTdjMWZiLi4zMDg0YzE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNDUxLDYgKzI0NTEsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKHByb2MudGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvYy5waWQgPT0gUHJvY2Vzcy5teVBpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNyYXNoQXBwbGljYXRpb246IHRyeWluZyB0byBjcmFzaCBzZWxmISIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBwcm9jLnRocmVhZC5zY2hlZHVsZUNyYXNoKG1lc3NhZ2UpOwpAQCAtNDI2OCw4ICs0MjcyLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREVCVUdfVVJJX1BFUk1JU1NJT04pIFNsb2cudihUQUcsIAotICAgICAgICAgICAgICAgICJDaGVja2luZyBncmFudCAiICsgdGFyZ2V0UGtnICsgIiBwZXJtaXNzaW9uIHRvICIgKyB1cmkpOworICAgICAgICBpZiAodGFyZ2V0UGtnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19VUklfUEVSTUlTU0lPTikgU2xvZy52KFRBRywKKyAgICAgICAgICAgICAgICAgICAgIkNoZWNraW5nIGdyYW50ICIgKyB0YXJnZXRQa2cgKyAiIHBlcm1pc3Npb24gdG8gIiArIHVyaSk7CisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGZpbmFsIElQYWNrYWdlTWFuYWdlciBwbSA9IEFwcEdsb2JhbHMuZ2V0UGFja2FnZU1hbmFnZXIoKTsKIApAQCAtNDI5OCwyMyArNDMwNCw0NSBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHRhcmdldFVpZDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhcmdldFVpZCA9IHBtLmdldFBhY2thZ2VVaWQodGFyZ2V0UGtnKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXRVaWQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX1VSSV9QRVJNSVNTSU9OKSBTbG9nLnYoVEFHLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBncmFudCBVUkkgcGVybWlzc2lvbiBubyB1aWQgZm9yOiAiICsgdGFyZ2V0UGtnKTsKKyAgICAgICAgaWYgKHRhcmdldFBrZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRhcmdldFVpZCA9IHBtLmdldFBhY2thZ2VVaWQodGFyZ2V0UGtnKTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0VWlkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVVJJX1BFUk1JU1NJT04pIFNsb2cudihUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGdyYW50IFVSSSBwZXJtaXNzaW9uIG5vIHVpZCBmb3I6ICIgKyB0YXJnZXRQa2cpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhcmdldFVpZCA9IC0xOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gRmlyc3QuLi4gIGRvZXMgdGhlIHRhcmdldCBhY3R1YWxseSBuZWVkIHRoaXMgcGVybWlzc2lvbj8KLSAgICAgICAgaWYgKGNoZWNrSG9sZGluZ1Blcm1pc3Npb25zTG9ja2VkKHBtLCBwaSwgdXJpLCB0YXJnZXRVaWQsIG1vZGVGbGFncykpIHsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZ3JhbnQgdGhlIHRhcmdldCB0aGlzIHBlcm1pc3Npb24uCi0gICAgICAgICAgICBpZiAoREVCVUdfVVJJX1BFUk1JU1NJT04pIFNsb2cudihUQUcsIAotICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0ICIgKyB0YXJnZXRQa2cgKyAiIGFscmVhZHkgaGFzIGZ1bGwgcGVybWlzc2lvbiB0byAiICsgdXJpKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHRhcmdldFVpZCA+PSAwKSB7CisgICAgICAgICAgICAvLyBGaXJzdC4uLiAgZG9lcyB0aGUgdGFyZ2V0IGFjdHVhbGx5IG5lZWQgdGhpcyBwZXJtaXNzaW9uPworICAgICAgICAgICAgaWYgKGNoZWNrSG9sZGluZ1Blcm1pc3Npb25zTG9ja2VkKHBtLCBwaSwgdXJpLCB0YXJnZXRVaWQsIG1vZGVGbGFncykpIHsKKyAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGdyYW50IHRoZSB0YXJnZXQgdGhpcyBwZXJtaXNzaW9uLgorICAgICAgICAgICAgICAgIGlmIChERUJVR19VUklfUEVSTUlTU0lPTikgU2xvZy52KFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJUYXJnZXQgIiArIHRhcmdldFBrZyArICIgYWxyZWFkeSBoYXMgZnVsbCBwZXJtaXNzaW9uIHRvICIgKyB1cmkpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZpcnN0Li4uICB0aGVyZSBpcyBubyB0YXJnZXQgcGFja2FnZSwgc28gY2FuIGFueW9uZSBhY2Nlc3MgaXQ/CisgICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBwaS5leHBvcnRlZDsKKyAgICAgICAgICAgIGlmICgobW9kZUZsYWdzJkludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGkucmVhZFBlcm1pc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtb2RlRmxhZ3MmSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGkud3JpdGVQZXJtaXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gU2Vjb25kLi4uICBpcyB0aGUgcHJvdmlkZXIgYWxsb3dpbmcgZ3JhbnRpbmcgb2YgVVJJIHBlcm1pc3Npb25zPwpAQCAtNDM0NCwxNiArNDM3MiwyNSBAQAogCiAgICAgICAgIC8vIFRoaXJkLi4uICBkb2VzIHRoZSBjYWxsZXIgaXRzZWxmIGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MKICAgICAgICAgLy8gdGhpcyB1cmk/Ci0gICAgICAgIGlmICghY2hlY2tIb2xkaW5nUGVybWlzc2lvbnNMb2NrZWQocG0sIHBpLCB1cmksIGNhbGxpbmdVaWQsIG1vZGVGbGFncykpIHsKLSAgICAgICAgICAgIGlmICghY2hlY2tVcmlQZXJtaXNzaW9uTG9ja2VkKHVyaSwgY2FsbGluZ1VpZCwgbW9kZUZsYWdzKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVWlkICIgKyBjYWxsaW5nVWlkCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHVyaSAiICsgdXJpKTsKKyAgICAgICAgaWYgKGNhbGxpbmdVaWQgIT0gUHJvY2Vzcy5teVVpZCgpKSB7CisgICAgICAgICAgICBpZiAoIWNoZWNrSG9sZGluZ1Blcm1pc3Npb25zTG9ja2VkKHBtLCBwaSwgdXJpLCBjYWxsaW5nVWlkLCBtb2RlRmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjaGVja1VyaVBlcm1pc3Npb25Mb2NrZWQodXJpLCBjYWxsaW5nVWlkLCBtb2RlRmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVWlkICIgKyBjYWxsaW5nVWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB1cmkgIiArIHVyaSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHRhcmdldFVpZDsKICAgICB9CiAKKyAgICBwdWJsaWMgaW50IGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uKGludCBjYWxsaW5nVWlkLCBTdHJpbmcgdGFyZ2V0UGtnLAorICAgICAgICAgICAgVXJpIHVyaSwgaW50IG1vZGVGbGFncykgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgdXJpLCBtb2RlRmxhZ3MpOworICAgICAgICB9CisgICAgfQorCiAgICAgdm9pZCBncmFudFVyaVBlcm1pc3Npb25VbmNoZWNrZWRMb2NrZWQoaW50IHRhcmdldFVpZCwgU3RyaW5nIHRhcmdldFBrZywKICAgICAgICAgICAgIFVyaSB1cmksIGludCBtb2RlRmxhZ3MsIFVyaVBlcm1pc3Npb25Pd25lciBvd25lcikgewogICAgICAgICBtb2RlRmxhZ3MgJj0gKEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KQEAgLTQzOTYsNiArNDQzMywxMCBAQAogCiAgICAgdm9pZCBncmFudFVyaVBlcm1pc3Npb25Mb2NrZWQoaW50IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGtnLCBVcmkgdXJpLCBpbnQgbW9kZUZsYWdzLCBVcmlQZXJtaXNzaW9uT3duZXIgb3duZXIpIHsKKyAgICAgICAgaWYgKHRhcmdldFBrZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRhcmdldFBrZyIpOworICAgICAgICB9CisKICAgICAgICAgaW50IHRhcmdldFVpZCA9IGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgdXJpLCBtb2RlRmxhZ3MpOwogICAgICAgICBpZiAodGFyZ2V0VWlkIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNDQxNCw2ICs0NDU1LDEwIEBACiAgICAgICAgICAgICAgICAgKyAiIGZyb20gIiArIGludGVudCArICI7IGZsYWdzPTB4IgogICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhpbnRlbnQgIT0gbnVsbCA/IGludGVudC5nZXRGbGFncygpIDogMCkpOwogCisgICAgICAgIGlmICh0YXJnZXRQa2cgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0YXJnZXRQa2ciKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC01ODc4LDYgKzU5MjMsMzUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldEltbWVyc2l2ZShJQmluZGVyIHRva2VuLCBib29sZWFuIGltbWVyc2l2ZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgaW50IGluZGV4ID0gKHRva2VuICE9IG51bGwpID8gbU1haW5TdGFjay5pbmRleE9mVG9rZW5Mb2NrZWQodG9rZW4pIDogLTE7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgciA9IChBY3Rpdml0eVJlY29yZCltTWFpblN0YWNrLm1IaXN0b3J5LmdldChpbmRleCk7CisgICAgICAgICAgICByLmltbWVyc2l2ZSA9IGltbWVyc2l2ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tZXJzaXZlKElCaW5kZXIgdG9rZW4pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAodG9rZW4gIT0gbnVsbCkgPyBtTWFpblN0YWNrLmluZGV4T2ZUb2tlbkxvY2tlZCh0b2tlbikgOiAtMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gKEFjdGl2aXR5UmVjb3JkKW1NYWluU3RhY2subUhpc3RvcnkuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiByLmltbWVyc2l2ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgciA9IG1NYWluU3RhY2sudG9wUnVubmluZ0FjdGl2aXR5TG9ja2VkKG51bGwpOworICAgICAgICAgICAgcmV0dXJuIChyICE9IG51bGwpID8gci5pbW1lcnNpdmUgOiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudGVyU2FmZU1vZGUoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CiAgICAgICAgICAgICAvLyBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGRvIHRoaXMgYmVmb3JlIHRoZSBzeXN0ZW0gaXMgcmVhZHkKQEAgLTcyMTAsNiArNzI4NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBkdW1wU2VydmljZXNMb2NrZWQoZmQsIHB3LCBhcmdzLCBvcHRpLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEdW1waW5nIGEgc2luZ2xlIGFjdGl2aXR5PworICAgICAgICAgICAgICAgIGlmIChkdW1wQWN0aXZpdHkoZmQsIHB3LCBjbWQsIGFyZ3MsIG9wdGksIGR1bXBBbGwpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiQmFkIGFjdGl2aXR5IGNvbW1hbmQ6ICIgKyBjbWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApAQCAtNzYyMiw2ICs3NzAyLDgyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGVyZSBhcmUgdGhyZWUgdGhpbmdzIHRoYXQgY21kIGNhbiBiZToKKyAgICAgKiAgLSBhIGZsYXR0ZW5lZCBjb21wb25lbnQgbmFtZSB0aGF0IG1hdGNoZWQgYW4gZXhpc3RpbmcgYWN0aXZpdHkKKyAgICAgKiAgLSB0aGUgY21kIGFyZyBpc24ndCB0aGUgZmxhdHRlbmVkIGNvbXBvbmVudCBuYW1lIG9mIGFuIGV4aXN0aW5nIGFjdGl2aXR5OgorICAgICAqICAgIGR1bXAgYWxsIGFjdGl2aXR5IHdob3NlIGNvbXBvbmVudCBjb250YWlucyB0aGUgY21kIGFzIGEgc3Vic3RyaW5nCisgICAgICogIC0gQSBoZXggbnVtYmVyIG9mIHRoZSBBY3Rpdml0eVJlY29yZCBvYmplY3QgaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZHVtcEFjdGl2aXR5KEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgICAgICBpbnQgb3B0aSwgYm9vbGVhbiBkdW1wQWxsKSB7CisgICAgICAgIFN0cmluZ1tdIG5ld0FyZ3M7CisgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZyhuYW1lKTsKKyAgICAgICAgaW50IG9iamVjdElkID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iamVjdElkID0gSW50ZWdlci5wYXJzZUludChuYW1lLCAxNik7CisgICAgICAgICAgICBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUgPSBudWxsOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBuZXdBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIG9wdGldOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAyKSBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIG9wdGksIG5ld0FyZ3MsIDAsIGFyZ3MubGVuZ3RoIC0gb3B0aSk7CisKKyAgICAgICAgQXJyYXlMaXN0PEFjdGl2aXR5UmVjb3JkPiBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eVJlY29yZD4oKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBmb3IgKEFjdGl2aXR5UmVjb3JkIHIxIDogKEFycmF5TGlzdDxBY3Rpdml0eVJlY29yZD4pbU1haW5TdGFjay5tSGlzdG9yeSkgeworICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIxLmludGVudC5nZXRDb21wb25lbnQoKS5lcXVhbHMoY29tcG9uZW50TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMuYWRkKHIxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyMS5pbnRlbnQuZ2V0Q29tcG9uZW50KCkuZmxhdHRlblRvU3RyaW5nKCkuY29udGFpbnMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMuYWRkKHIxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykgPT0gb2JqZWN0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZpdGllcy5hZGQocjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhY3Rpdml0aWVzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8YWN0aXZpdGllcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZHVtcEFjdGl2aXR5KGZkLCBwdywgYWN0aXZpdGllcy5nZXQoaSksIG5ld0FyZ3MsIGR1bXBBbGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgSUFwcGxpY2F0aW9uVGhyZWFkLmR1bXBBY3Rpdml0eSgpIG9uIHRoZSB0aHJlYWQgb2YgdGhlIHNwZWNpZmllZCBhY3Rpdml0eSBpZgorICAgICAqIHRoZXJlIGlzIGEgdGhyZWFkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0aXZpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBBY3Rpdml0eShGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIEFjdGl2aXR5UmVjb3JkIHIsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgICAgICBib29sZWFuIGR1bXBBbGwpIHsKKyAgICAgICAgcHcucHJpbnRsbigiICBBY3Rpdml0eSAiICsgci5pbnRlbnQuZ2V0Q29tcG9uZW50KCkuZmxhdHRlblRvU3RyaW5nKCkpOworICAgICAgICBpZiAoZHVtcEFsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgKiAiKTsgcHcucHJpbnRsbihyKTsKKyAgICAgICAgICAgICAgICByLmR1bXAocHcsICIgICAgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoci5hcHAgIT0gbnVsbCAmJiByLmFwcC50aHJlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBmbHVzaCBhbnl0aGluZyB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIFByaW50V3JpdGVyIHNpbmNlIHRoZSB0aHJlYWQgaXMgZ29pbmcKKyAgICAgICAgICAgICAgICAvLyB0byB3cml0ZSB0byB0aGUgZmlsZSBkZXNjcmlwdG9yIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgICAgICAgICByLmFwcC50aHJlYWQuZHVtcEFjdGl2aXR5KGZkLCByLCBhcmdzKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiXG4iKTsKKyAgICAgICAgICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJnb3QgYSBSZW1vdGVFeGNlcHRpb24gd2hpbGUgZHVtcGluZyB0aGUgYWN0aXZpdHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGJvb2xlYW4gZHVtcEJyb2FkY2FzdHNMb2NrZWQoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzLAogICAgICAgICAgICAgaW50IG9wdGksIGJvb2xlYW4gZHVtcEFsbCkgewogICAgICAgICBib29sZWFuIG5lZWRTZXAgPSBmYWxzZTsKQEAgLTEyNDgzLDcgKzEyNjM5LDY5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLAorICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gbm90ZTogaGlqYWNraW5nIFNFVF9BQ1RJVklUWV9XQVRDSEVSLCBidXQgc2hvdWxkIGJlIGNoYW5nZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBpdHMgb3duIHBlcm1pc3Npb24gKHNhbWUgYXMgcHJvZmlsZUNvbnRyb2wpLgorICAgICAgICAgICAgICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TRVRfQUNUSVZJVFlfV0FUQ0hFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIHBlcm1pc3Npb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNFVF9BQ1RJVklUWV9XQVRDSEVSKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIGZkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHJvY2Vzc1JlY29yZCBwcm9jID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbnQgcGlkID0gSW50ZWdlci5wYXJzZUludChwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGlkc1NlbGZMb2NrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2MgPSBtUGlkc1NlbGZMb2NrZWQuZ2V0KHBpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm9jID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFNwYXJzZUFycmF5PFByb2Nlc3NSZWNvcmQ+PiBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG1Qcm9jZXNzTmFtZXMuZ2V0TWFwKCk7CisgICAgICAgICAgICAgICAgICAgIFNwYXJzZUFycmF5PFByb2Nlc3NSZWNvcmQ+IHByb2NzID0gYWxsLmdldChwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2NzICE9IG51bGwgJiYgcHJvY3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYyA9IHByb2NzLnZhbHVlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJvYyA9PSBudWxsIHx8IHByb2MudGhyZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBwcm9jZXNzOiAiICsgcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NlY3VyZSA9ICIxIi5lcXVhbHMoU3lzdGVtUHJvcGVydGllcy5nZXQoU1lTVEVNX1NFQ1VSRSwgIjAiKSk7CisgICAgICAgICAgICAgICAgaWYgKGlzU2VjdXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvYy5pbmZvLmZsYWdzJkFwcGxpY2F0aW9uSW5mby5GTEFHX0RFQlVHR0FCTEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUHJvY2VzcyBub3QgZGVidWdnYWJsZTogIiArIHByb2MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvYy50aHJlYWQuZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgICAgIGZkID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2Nlc3MgZGlzYXBwZWFyZWQiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIEluIHRoaXMgbWV0aG9kIHdlIHRyeSB0byBhY3F1aXJlIG91ciBsb2NrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgbm90IGRlYWRsb2NrZWQgKi8KICAgICBwdWJsaWMgdm9pZCBtb25pdG9yKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEKaW5kZXggNGQ3NzNlNC4uNDdiZTZhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhCkBAIC0xMDQsNiArMTA0LDcgQEAKICAgICBib29sZWFuIGlkbGU7ICAgICAgICAgICAvLyBoYXMgdGhlIGFjdGl2aXR5IGdvbmUgaWRsZT8KICAgICBib29sZWFuIGhhc0JlZW5MYXVuY2hlZDsvLyBoYXMgdGhpcyBhY3Rpdml0eSBldmVyIGJlZW4gbGF1bmNoZWQ/CiAgICAgYm9vbGVhbiBmcm96ZW5CZWZvcmVEZXN0cm95Oy8vIGhhcyBiZWVuIGZyb3plbiBidXQgbm90IHlldCBkZXN0cm95ZWQuCisgICAgYm9vbGVhbiBpbW1lcnNpdmU7ICAgICAgLy8gaW1tZXJzaXZlIG1vZGUgKGRvbid0IGludGVycnVwdCBpZiBwb3NzaWJsZSkKIAogICAgIFN0cmluZyBzdHJpbmdOYW1lOyAgICAgIC8vIGZvciBjYWNoaW5nIG9mIHRvU3RyaW5nKCkuCiAgICAgCkBAIC0xNTksNiArMTYwLDcgQEAKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGZpbmlzaGluZz0iKTsgcHcucHJpbnRsbihmaW5pc2hpbmcpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgia2V5c1BhdXNlZD0iKTsgcHcucHJpbnQoa2V5c1BhdXNlZCk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBpbkhpc3Rvcnk9Iik7IHB3LnByaW50KGluSGlzdG9yeSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBpbW1lcnNpdmU9Iik7IHB3LnByaW50KGltbWVyc2l2ZSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBsYXVuY2hNb2RlPSIpOyBwdy5wcmludGxuKGxhdW5jaE1vZGUpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZnVsbHNjcmVlbj0iKTsgcHcucHJpbnQoZnVsbHNjcmVlbik7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB2aXNpYmxlPSIpOyBwdy5wcmludCh2aXNpYmxlKTsKQEAgLTI4OSw2ICsyOTEsOCBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpc0hvbWVBY3Rpdml0eSA9IGZhbHNlOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbW1lcnNpdmUgPSAoYUluZm8uZmxhZ3MgJiBBY3Rpdml0eUluZm8uRkxBR19JTU1FUlNJVkUpICE9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZWFsQWN0aXZpdHkgPSBudWxsOwogICAgICAgICAgICAgdGFza0FmZmluaXR5ID0gbnVsbDsKQEAgLTMwMCw2ICszMDQsNyBAQAogICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBudWxsOwogICAgICAgICAgICAgZnVsbHNjcmVlbiA9IHRydWU7CiAgICAgICAgICAgICBpc0hvbWVBY3Rpdml0eSA9IGZhbHNlOworICAgICAgICAgICAgaW1tZXJzaXZlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhdHRlcnlTdGF0c1NlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhdHRlcnlTdGF0c1NlcnZpY2UuamF2YQppbmRleCA3M2E1NDM1Li4wYTk4ZWJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9CYXR0ZXJ5U3RhdHNTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQmF0dGVyeVN0YXRzU2VydmljZS5qYXZhCkBAIC0xNiw3ICsxNiw5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmFtOwogCitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtNDMsNiArNDUsOCBAQAogICAgIAogICAgIGZpbmFsIEJhdHRlcnlTdGF0c0ltcGwgbVN0YXRzOwogICAgIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1CbHVldG9vdGhQZW5kaW5nU3RhdHM7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OwogCiAgICAgQmF0dGVyeVN0YXRzU2VydmljZShTdHJpbmcgZmlsZW5hbWUpIHsKICAgICAgICAgbVN0YXRzID0gbmV3IEJhdHRlcnlTdGF0c0ltcGwoZmlsZW5hbWUpOwpAQCAtMjgzLDE2ICsyODcsNDMgQEAKIAogICAgIHB1YmxpYyB2b2lkIG5vdGVCbHVldG9vdGhPbigpIHsKICAgICAgICAgZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKCk7Ci0gICAgICAgIEJsdWV0b290aEhlYWRzZXQgaGVhZHNldCA9IG5ldyBCbHVldG9vdGhIZWFkc2V0KG1Db250ZXh0LCBudWxsKTsKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLmdldFByb2ZpbGVQcm94eShtQ29udGV4dCwgbUJsdWV0b290aFByb2ZpbGVTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQpOworICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRzKSB7Ci0gICAgICAgICAgICBtU3RhdHMubm90ZUJsdWV0b290aE9uTG9ja2VkKCk7Ci0gICAgICAgICAgICBtU3RhdHMuc2V0QnRIZWFkc2V0KGhlYWRzZXQpOworICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhIZWFkc2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMubm90ZUJsdWV0b290aE9uTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgbVN0YXRzLnNldEJ0SGVhZHNldChtQmx1ZXRvb3RoSGVhZHNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1CbHVldG9vdGhQZW5kaW5nU3RhdHMgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciBtQmx1ZXRvb3RoUHJvZmlsZVNlcnZpY2VMaXN0ZW5lciA9CisgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IChCbHVldG9vdGhIZWFkc2V0KSBwcm94eTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhQZW5kaW5nU3RhdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm5vdGVCbHVldG9vdGhPbkxvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHMuc2V0QnRIZWFkc2V0KG1CbHVldG9vdGhIZWFkc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aFBlbmRpbmdTdGF0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSkgeworICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQgPSBudWxsOworICAgICAgICB9CisgICAgfTsKKwogICAgIHB1YmxpYyB2b2lkIG5vdGVCbHVldG9vdGhPZmYoKSB7CiAgICAgICAgIGVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0cykgeworICAgICAgICAgICAgbUJsdWV0b290aFBlbmRpbmdTdGF0cyA9IGZhbHNlOwogICAgICAgICAgICAgbVN0YXRzLm5vdGVCbHVldG9vdGhPZmZMb2NrZWQoKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1VyaVBlcm1pc3Npb25Pd25lci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVXJpUGVybWlzc2lvbk93bmVyLmphdmEKaW5kZXggOTljODJlNi4uNjhhMmUwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVXJpUGVybWlzc2lvbk93bmVyLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVXJpUGVybWlzc2lvbk93bmVyLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICB9CiAKICAgICBCaW5kZXIgZ2V0RXh0ZXJuYWxUb2tlbkxvY2tlZCgpIHsKLSAgICAgICAgaWYgKGV4dGVybmFsVG9rZW4gIT0gbnVsbCkgeworICAgICAgICBpZiAoZXh0ZXJuYWxUb2tlbiA9PSBudWxsKSB7CiAgICAgICAgICAgICBleHRlcm5hbFRva2VuID0gbmV3IEV4dGVybmFsVG9rZW4oKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZXh0ZXJuYWxUb2tlbjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YQppbmRleCAxYmM1ZTRiLi4wNjIzZjViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwpAQCAtMzIsNyArMzIsNiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtNTQsNiArNTMsNyBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogLyoqCiAgKiBAaGlkZQpAQCAtNjYsNyArNjYsOCBAQAogcHVibGljIGNsYXNzIFRldGhlcmluZyBleHRlbmRzIElOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXIuU3R1YiB7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIlRldGhlcmluZyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJUZXRoZXJpbmciOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQm9vdGVkID0gZmFsc2U7CiAgICAgLy91c2VkIHRvIHJlbWVtYmVyIGlmIHdlIGdvdCBjb25uZWN0ZWQgYmVmb3JlIGJvb3QgZmluaXNoZWQKQEAgLTc1LDYgKzc2LDcgQEAKICAgICAvLyBUT0RPIC0gcmVtb3ZlIGJvdGggb2YgdGhlc2UgLSBzaG91bGQgYmUgcGFydCBvZiBpbnRlcmZhY2UgaW5zcGVjdGlvbi9zZWxlY3Rpb24gc3R1ZmYKICAgICBwcml2YXRlIFN0cmluZ1tdIG1UZXRoZXJhYmxlVXNiUmVnZXhzOwogICAgIHByaXZhdGUgU3RyaW5nW10gbVRldGhlcmFibGVXaWZpUmVnZXhzOworICAgIHByaXZhdGUgU3RyaW5nW10gbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHM7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVXBzdHJlYW1JZmFjZVJlZ2V4czsKIAogICAgIHByaXZhdGUgTG9vcGVyIG1Mb29wZXI7CkBAIC04NywxNyArODksMzEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX05FQVJfSUZBQ0VfQUREUiAgICAgID0gIjE5Mi4xNjguNDIuMTI5IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX05FVE1BU0sgICAgICAgICAgICAgID0gIjI1NS4yNTUuMjU1LjAiOwogCi0gICAgLy8gRllJIC0gdGhlIGRlZmF1bHQgd2lmaSBpcyAxOTIuMTY4LjQzLjEgYW5kIDI1NS4yNTUuMjU1LjAKKyAgICAvLyBVU0IgaXMgIDE5Mi4xNjguNDIuMSBhbmQgMjU1LjI1NS4yNTUuMAorICAgIC8vIFdpZmkgaXMgMTkyLjE2OC40My4xIGFuZCAyNTUuMjU1LjI1NS4wCisgICAgLy8gQlQgaXMgbGltaXRlZCB0byBtYXggZGVmYXVsdCBvZiA1IGNvbm5lY3Rpb25zLiAxOTIuMTY4LjQ0LjEgdG8gMTkyLjE2OC40OC4xCisgICAgLy8gd2l0aCAyNTUuMjU1LjI1NS4wCiAKICAgICBwcml2YXRlIFN0cmluZ1tdIG1EaGNwUmFuZ2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTFfU1RBUlQgPSAiMTkyLjE2OC40Mi4yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMV9TVE9QICA9ICIxOTIuMTY4LjQyLjI1NCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTJfU1RBUlQgPSAiMTkyLjE2OC40My4yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMl9TVE9QICA9ICIxOTIuMTY4LjQzLjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTNfU1RBUlQgPSAiMTkyLjE2OC40NC4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFM19TVE9QICA9ICIxOTIuMTY4LjQ0LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTRfU1RBUlQgPSAiMTkyLjE2OC40NS4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFNF9TVE9QICA9ICIxOTIuMTY4LjQ1LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTVfU1RBUlQgPSAiMTkyLjE2OC40Ni4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFNV9TVE9QICA9ICIxOTIuMTY4LjQ2LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTZfU1RBUlQgPSAiMTkyLjE2OC40Ny4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFNl9TVE9QICA9ICIxOTIuMTY4LjQ3LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTdfU1RBUlQgPSAiMTkyLjE2OC40OC4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFN19TVE9QICA9ICIxOTIuMTY4LjQ4LjI1NCI7CisKIAogICAgIHByaXZhdGUgU3RyaW5nW10gbURuc1NlcnZlcnM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEROU19ERUZBVUxUX1NFUlZFUjEgPSAiOC44LjguOCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEROU19ERUZBVUxUX1NFUlZFUjIgPSAiNC4yLjIuMiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEROU19ERUZBVUxUX1NFUlZFUjIgPSAiOC44LjQuNCI7CiAKICAgICAvLyByZXNhbXBsZWQgZWFjaCB0aW1lIHdlIHR1cm4gb24gdGV0aGVyaW5nIC0gdXNlZCBhcyBjYWNoZSBmb3Igc2V0dGluZ3MvY29uZmlnLXZhbAogICAgIHByaXZhdGUgYm9vbGVhbiBtRHVuUmVxdWlyZWQ7ICAvLyBjb25maWd1cmF0aW9uIGluZm8gLSBtdXN0IHVzZSBEVU4gYXBuIG9uIDNnCkBAIC0xNjEsMTEgKzE3NywyMSBAQAogICAgICAgICBtRGhjcFJhbmdlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmdBcnJheSgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ190ZXRoZXJfZGhjcF9yYW5nZSk7CiAgICAgICAgIGlmICgobURoY3BSYW5nZS5sZW5ndGggPT0gMCkgfHwgKG1EaGNwUmFuZ2UubGVuZ3RoICUgMiA9PTEpKSB7Ci0gICAgICAgICAgICBtRGhjcFJhbmdlID0gbmV3IFN0cmluZ1s0XTsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2UgPSBuZXcgU3RyaW5nWzE0XTsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMF0gPSBESENQX0RFRkFVTFRfUkFOR0UxX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVsxXSA9IERIQ1BfREVGQVVMVF9SQU5HRTFfU1RPUDsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMl0gPSBESENQX0RFRkFVTFRfUkFOR0UyX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVszXSA9IERIQ1BfREVGQVVMVF9SQU5HRTJfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbNF0gPSBESENQX0RFRkFVTFRfUkFOR0UzX1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs1XSA9IERIQ1BfREVGQVVMVF9SQU5HRTNfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbNl0gPSBESENQX0RFRkFVTFRfUkFOR0U0X1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs3XSA9IERIQ1BfREVGQVVMVF9SQU5HRTRfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbOF0gPSBESENQX0RFRkFVTFRfUkFOR0U1X1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs5XSA9IERIQ1BfREVGQVVMVF9SQU5HRTVfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbMTBdID0gREhDUF9ERUZBVUxUX1JBTkdFNl9TVEFSVDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbMTFdID0gREhDUF9ERUZBVUxUX1JBTkdFNl9TVE9QOworICAgICAgICAgICAgbURoY3BSYW5nZVsxMl0gPSBESENQX0RFRkFVTFRfUkFOR0U3X1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVsxM10gPSBESENQX0RFRkFVTFRfUkFOR0U3X1NUT1A7CiAgICAgICAgIH0KICAgICAgICAgbUR1blJlcXVpcmVkID0gZmFsc2U7IC8vIHJlc2FtcGxlIHdoZW4gd2UgdHVybiBvbgogCkBAIC0xNzMsNiArMTk5LDggQEAKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ190ZXRoZXJfdXNiX3JlZ2V4cyk7CiAgICAgICAgIG1UZXRoZXJhYmxlV2lmaVJlZ2V4cyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX3dpZmlfcmVnZXhzKTsKKyAgICAgICAgbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHMgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3RldGhlcl9ibHVldG9vdGhfcmVnZXhzKTsKICAgICAgICAgbVVwc3RyZWFtSWZhY2VSZWdleHMgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3RldGhlcl91cHN0cmVhbV9yZWdleHMpOwogCkBAIC0xODMsNyArMjExLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZChTdHJpbmcgaWZhY2UsIGJvb2xlYW4gbGluaykgewotICAgICAgICBMb2cuZChUQUcsICJpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZCAiICsgaWZhY2UgKyAiLCAiICsgbGluayk7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiaW50ZXJmYWNlTGlua1N0YXR1c0NoYW5nZWQgIiArIGlmYWNlICsgIiwgIiArIGxpbmspOwogICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gdXNiID0gZmFsc2U7CiAgICAgICAgIGlmIChpc1dpZmkoaWZhY2UpKSB7CkBAIC0xOTEsNiArMjE5LDggQEAKICAgICAgICAgfSBlbHNlIGlmIChpc1VzYihpZmFjZSkpIHsKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIHVzYiA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXNCbHVldG9vdGgoaWZhY2UpKSB7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSByZXR1cm47CiAKQEAgLTIyNSw2ICsyNTUsMTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzQmx1ZXRvb3RoKFN0cmluZyBpZmFjZSkgeworICAgICAgICBmb3IgKFN0cmluZyByZWdleCA6IG1UZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKSB7CisgICAgICAgICAgICBpZiAoaWZhY2UubWF0Y2hlcyhyZWdleCkpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgcHVibGljIHZvaWQgaW50ZXJmYWNlQWRkZWQoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKICAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOwpAQCAtMjM3LDI5ICsyNzMsMzQgQEAKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIHVzYiA9IHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQmx1ZXRvb3RoKGlmYWNlKSkgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CiAgICAgICAgIGlmIChmb3VuZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCBpZmFjZSArICIgaXMgbm90IGEgdGV0aGVyYWJsZSBpZmFjZSwgaWdub3JpbmciKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCBpZmFjZSArICIgaXMgbm90IGEgdGV0aGVyYWJsZSBpZmFjZSwgaWdub3JpbmciKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUlmYWNlcykgewogICAgICAgICAgICAgVGV0aGVySW50ZXJmYWNlU00gc20gPSBtSWZhY2VzLmdldChpZmFjZSk7CiAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImFjdGl2ZSBpZmFjZSAoIiArIGlmYWNlICsgIikgcmVwb3J0ZWQgYXMgYWRkZWQsIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJhY3RpdmUgaWZhY2UgKCIgKyBpZmFjZSArICIpIHJlcG9ydGVkIGFzIGFkZGVkLCBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNtID0gbmV3IFRldGhlckludGVyZmFjZVNNKGlmYWNlLCBtTG9vcGVyLCB1c2IpOwogICAgICAgICAgICAgbUlmYWNlcy5wdXQoaWZhY2UsIHNtKTsKICAgICAgICAgICAgIHNtLnN0YXJ0KCk7CiAgICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAiaW50ZXJmYWNlQWRkZWQgOiIgKyBpZmFjZSk7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiaW50ZXJmYWNlQWRkZWQgOiIgKyBpZmFjZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgaW50ZXJmYWNlUmVtb3ZlZChTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtSWZhY2VzKSB7CiAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYXR0ZW1wdGluZyB0byByZW1vdmUgdW5rbm93biBpZmFjZSAoIiArIGlmYWNlICsgIiksIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImF0dGVtcHRpbmcgdG8gcmVtb3ZlIHVua25vd24gaWZhY2UgKCIgKyBpZmFjZSArICIpLCBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzbS5zZW5kTWVzc2FnZShUZXRoZXJJbnRlcmZhY2VTTS5DTURfSU5URVJGQUNFX0RPV04pOwpAQCAtMzMwLDEzICszNzEsMTQgQEAKIAogICAgICAgICBib29sZWFuIHdpZmlUZXRoZXJlZCA9IGZhbHNlOwogICAgICAgICBib29sZWFuIHVzYlRldGhlcmVkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gYmx1ZXRvb3RoVGV0aGVyZWQgPSBmYWxzZTsKIAogICAgICAgICBzeW5jaHJvbml6ZWQgKG1JZmFjZXMpIHsKICAgICAgICAgICAgIFNldCBpZmFjZXMgPSBtSWZhY2VzLmtleVNldCgpOwogICAgICAgICAgICAgZm9yIChPYmplY3QgaWZhY2UgOiBpZmFjZXMpIHsKICAgICAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZihzbS5pc0Vycm9yZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc20uaXNFcnJvcmVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yZWRMaXN0LmFkZCgoU3RyaW5nKWlmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzbS5pc0F2YWlsYWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVMaXN0LmFkZCgoU3RyaW5nKWlmYWNlKTsKQEAgLTM0NSw2ICszODcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYlRldGhlcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaWZpKChTdHJpbmcpaWZhY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lmaVRldGhlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQmx1ZXRvb3RoKChTdHJpbmcpaWZhY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoVGV0aGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5hZGQoKFN0cmluZylpZmFjZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM1OSwxNyArNDAzLDI1IEBACiAgICAgICAgIGJyb2FkY2FzdC5wdXRTdHJpbmdBcnJheUxpc3RFeHRyYShDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0VSUk9SRURfVEVUSEVSLAogICAgICAgICAgICAgICAgIGVycm9yZWRMaXN0KTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChicm9hZGNhc3QpOwotICAgICAgICBMb2cuZChUQUcsICJzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0ICIgKyBhdmFpbGFibGVMaXN0LnNpemUoKSArICIsICIgKwotICAgICAgICAgICAgICAgIGFjdGl2ZUxpc3Quc2l6ZSgpICsgIiwgIiArIGVycm9yZWRMaXN0LnNpemUoKSk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VuZFRldGhlclN0YXRlQ2hhbmdlZEJyb2FkY2FzdCAiICsgYXZhaWxhYmxlTGlzdC5zaXplKCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5zaXplKCkgKyAiLCAiICsgZXJyb3JlZExpc3Quc2l6ZSgpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICh1c2JUZXRoZXJlZCkgewotICAgICAgICAgICAgaWYgKHdpZmlUZXRoZXJlZCkgeworICAgICAgICAgICAgaWYgKHdpZmlUZXRoZXJlZCB8fCBibHVldG9vdGhUZXRoZXJlZCkgewogICAgICAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl9nZW5lcmFsKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX3VzYik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAod2lmaVRldGhlcmVkKSB7Ci0gICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfd2lmaSk7CisgICAgICAgICAgICBpZiAoYmx1ZXRvb3RoVGV0aGVyZWQpIHsKKyAgICAgICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfZ2VuZXJhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl93aWZpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChibHVldG9vdGhUZXRoZXJlZCkgeworICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX2JsdWV0b290aCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbGVhclRldGhlcmVkTm90aWZpY2F0aW9uKCk7CiAgICAgICAgIH0KQEAgLTQwMCw3ICs0NTIsNyBAQAogICAgICAgICBDaGFyU2VxdWVuY2UgbWVzc2FnZSA9IHIuZ2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy4KICAgICAgICAgICAgICAgICB0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSk7CiAKLSAgICAgICAgaWYobVRldGhlcmVkTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgaWYgKG1UZXRoZXJlZE5vdGlmaWNhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICBtVGV0aGVyZWROb3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKCk7CiAgICAgICAgICAgICBtVGV0aGVyZWROb3RpZmljYXRpb24ud2hlbiA9IDA7CiAgICAgICAgIH0KQEAgLTQ1Nyw3ICs1MDksNyBAQAogICAgICAgICAgICAgICAgIG1Vc2JNYXNzU3RvcmFnZU9mZiA9IHRydWU7CiAgICAgICAgICAgICAgICAgdXBkYXRlVXNiU3RhdHVzKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQ29ubmVjdGl2aXR5TWFuYWdlci5DT05ORUNUSVZJVFlfQUNUSU9OKSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmluZyBnb3QgQ09OTkVDVElWSVRZX0FDVElPTiIpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyaW5nIGdvdCBDT05ORUNUSVZJVFlfQUNUSU9OIik7CiAgICAgICAgICAgICAgICAgbVRldGhlck1hc3RlclNNLnNlbmRNZXNzYWdlKFRldGhlck1hc3RlclNNLkNNRF9VUFNUUkVBTV9DSEFOR0VEKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX0JPT1RfQ09NUExFVEVEKSkgewogICAgICAgICAgICAgICAgIG1Cb290ZWQgPSB0cnVlOwpAQCAtNDg4LDkgKzU0MCw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyB0b2dnbGVkIHdoZW4gd2UgZW50ZXIvbGVhdmUgdGhlIGZ1bGx5IHRlYXRoZXJlZCBzdGF0ZQorICAgIC8vIHRvZ2dsZWQgd2hlbiB3ZSBlbnRlci9sZWF2ZSB0aGUgZnVsbHkgdGV0aGVyZWQgc3RhdGUKICAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlVXNiUm5kaXMoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImVuYWJsZVVzYlJuZGlzKCIgKyBlbmFibGVkICsgIikiKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJlbmFibGVVc2JSbmRpcygiICsgZW5hYmxlZCArICIpIik7CiAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKICAgICAgICAgICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAKQEAgLTUxNSw3ICs1NjcsNyBAQAogCiAgICAgLy8gY29uZmlndXJlZCB3aGVuIHdlIHN0YXJ0IHRldGhlcmluZyBhbmQgdW5jb25maWcnZCBvbiBlcnJvciBvciBjb25jbHVzaW9uCiAgICAgcHJpdmF0ZSBib29sZWFuIGNvbmZpZ3VyZVVzYklmYWNlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBMb2cuZChUQUcsICJjb25maWd1cmVVc2JJZmFjZSgiICsgZW5hYmxlZCArICIpIik7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiY29uZmlndXJlVXNiSWZhY2UoIiArIGVuYWJsZWQgKyAiKSIpOwogCiAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKICAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOwpAQCAtNTcxLDYgKzYyMywxMCBAQAogICAgICAgICByZXR1cm4gbVRldGhlcmFibGVXaWZpUmVnZXhzOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkgeworICAgICAgICByZXR1cm4gbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHM7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFVwc3RyZWFtSWZhY2VSZWdleHMoKSB7CiAgICAgICAgIHJldHVybiBtVXBzdHJlYW1JZmFjZVJlZ2V4czsKICAgICB9CkBAIC03NjIsNyArODE4LDcgQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJbml0aWFsU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIkluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9SRVFVRVNURUQ6CkBAIC04MDMsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnRpbmdTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiU3RhcnRpbmdTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1heWJlIGEgcGFyZW50IGNsYXNzPwpAQCAtODU1LDcgKzkxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1Vc2IpIFRldGhlcmluZy50aGlzLmVuYWJsZVVzYlJuZGlzKHRydWUpOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICBzZXRBdmFpbGFibGUoZmFsc2UpOwogICAgICAgICAgICAgICAgIHNldFRldGhlcmVkKHRydWUpOwogICAgICAgICAgICAgICAgIHNlbmRUZXRoZXJTdGF0ZUNoYW5nZWRCcm9hZGNhc3QoKTsKQEAgLTg2Niw3ICs5MjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXJlZFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXJlZFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CkBAIC05MDksNyArOTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS53aGF0ID09IENNRF9JTlRFUkZBQ0VfRE9XTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVW5hdmFpbGFibGVTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbnRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVW50ZXRoZXJlZCAiICsgbUlmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX0NPTk5FQ1RJT05fQ0hBTkdFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdVcHN0cmVhbUlmYWNlTmFtZSA9IChTdHJpbmcpKG1lc3NhZ2Uub2JqKTsKQEAgLTk4Miw3ICsxMDM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVEVUSEVSX0VSUk9SX01BU1RFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXIgbG9zdCB1cHN0cmVhbSBjb25uZWN0aW9uICIgKyBtSWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyIGxvc3QgdXBzdHJlYW0gY29ubmVjdGlvbiAiICsgbUlmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVzYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVGV0aGVyaW5nLnRoaXMuY29uZmlndXJlVXNiSWZhY2UoZmFsc2UpKSB7CkBAIC0xMjIwLDggKzEyNzYsMTAgQEAKICAgICAgICAgICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOwogICAgICAgICAgICAgICAgIElDb25uZWN0aXZpdHlNYW5hZ2VyIGNtID0gSUNvbm5lY3Rpdml0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShiKTsKICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblJlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNob29zZVVwc3RyZWFtVHlwZSgiICsgdHJ5Q2VsbCArICIpLCAgZHVuUmVxdWlyZWQgPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUR1blJlcXVpcmVkICsgIiwgaWZhY2U9IiArIGlmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2hvb3NlVXBzdHJlYW1UeXBlKCIgKyB0cnlDZWxsICsgIiksICBkdW5SZXF1aXJlZCA9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUR1blJlcXVpcmVkICsgIiwgaWZhY2U9IiArIGlmYWNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRHVuUmVxdWlyZWQpIHsKQEAgLTEyMjksNyArMTI4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IGNtLmdldE5ldHdvcmtJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9EVU4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0dGluZyBkdW4gaWZhY2VuYW1lID0iICsgaWZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNldHRpbmcgZHVuIGlmYWNlbmFtZSA9IiArIGlmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB3ZSdyZSBhbHJlYWR5IGNvbm5lY3RlZCAtIGl0IG1heSBiZSBzb21lYm9keSBlbHNlJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmY291bnQsIHNvIGFkZCBvdXIgb3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5Pbk1vYmlsZUNvbm5lY3Rpb24oKTsKQEAgLTEyNDEsMTEgKzEyOTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2hlY2tpbmcgaWYgaGlwcmkgYnJvdWdodCB1cyB0aGlzIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImNoZWNraW5nIGlmIGhpcHJpIGJyb3VnaHQgdXMgdGhpcyBjb25uZWN0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IGNtLmdldE5ldHdvcmtJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJ5ZXMgLSBoaXByaSBpbiB1c2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJ5ZXMgLSBoaXByaSBpbiB1c2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB3ZSdyZSBhbHJlYWR5IGNvbm5lY3RlZCAtIGl0IG1heSBiZSBzb21ib2R5IGVsc2UncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZjb3VudCwgc28gYWRkIG91ciBvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybk9uTW9iaWxlQ29ubmVjdGlvbigpOwpAQCAtMTI2Nyw3ICsxMzI1LDcgQEAKICAgICAgICAgICAgICAgICBub3RpZnlUZXRoZXJlZE9mTmV3VXBzdHJlYW1JZmFjZShpZmFjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlUZXRoZXJlZE9mTmV3VXBzdHJlYW1JZmFjZShTdHJpbmcgaWZhY2VOYW1lKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibm90aWZ5aW5nIHRldGhlcmVkIHdpdGggaWZhY2UgPSIgKyBpZmFjZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAibm90aWZ5aW5nIHRldGhlcmVkIHdpdGggaWZhY2UgPSIgKyBpZmFjZU5hbWUpOwogICAgICAgICAgICAgICAgIG1VcHN0cmVhbUlmYWNlTmFtZSA9IGlmYWNlTmFtZTsKICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogbU5vdGlmeUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgVGV0aGVySW50ZXJmYWNlU00gc20gPSAoVGV0aGVySW50ZXJmYWNlU00pbzsKQEAgLTEyODQsMTkgKzEzNDIsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWFzdGVySW5pdGlhbFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJNYXN0ZXJJbml0aWFsU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfTU9ERV9SRVFVRVNURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVuUmVxdWlyZWQgPSBpc0R1blJlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSB3aG8gPSAoVGV0aGVySW50ZXJmYWNlU00pbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSByZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgcmVxdWVzdGVkIGJ5ICIgKyB3aG8udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TGlzdC5hZGQod2hvKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVGV0aGVyTW9kZUFsaXZlU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9NT0RFX1VOUkVRVUVTVEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgd2hvID0gKFRldGhlckludGVyZmFjZVNNKW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgdW5yZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgdW5yZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1Ob3RpZnlMaXN0LmluZGV4T2Yod2hvKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlMaXN0LnJlbW92ZSh3aG8pOwpAQCAtMTMyNiw3ICsxMzg0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyTW9kZUFsaXZlU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlck1vZGVBbGl2ZVN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX01PREVfUkVRVUVTVEVEOgpAQCAtMTM1NCw4ICsxNDEyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UncmUgc3RpbGwgdXNpbmcgYSByZXF1ZXN0ZWQgY29ubmVjdGlvbiAtIG1heSBoYXZlIGZvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWZpIG9yIHNvbWV0aGluZyBzaW5jZSB0aGVuLgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUmVxdWVzdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVuZXdpbmcgbW9iaWxlIGNvbm5lY3Rpb24gLSByZXF1ZXVpbmcgZm9yIGFub3RoZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMX0NPTk5FQ1RJT05fUkVORVdfTVMgKyAibXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVuZXdpbmcgbW9iaWxlIGNvbm5lY3Rpb24gLSByZXF1ZXVpbmcgZm9yIGFub3RoZXIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMTF9DT05ORUNUSU9OX1JFTkVXX01TICsgIm1zIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5Pbk1vYmlsZUNvbm5lY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5Y2UzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRldGVjdCB0aGUgY291bnRyeSB3aGVyZSB0aGUgdXNlciBpcy4gVGhlIHNvdXJjZXMgb2YKKyAqIGNvdW50cnkgYXJlIHF1ZXJpZWQgaW4gb3JkZXIgb2YgcmVsaWFiaWxpdHksIGxpa2UKKyAqIDx1bD4KKyAqIDxsaT5Nb2JpbGUgbmV0d29yazwvbGk+CisgKiA8bGk+TG9jYXRpb248L2xpPgorICogPGxpPlNJTSdzIGNvdW50cnk8L2xpPgorICogPGxpPlBob25lJ3MgbG9jYWxlPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIENhbGwgdGhlIHtAbGluayAjZGV0ZWN0Q291bnRyeSgpfSB0byBnZXQgdGhlIGF2YWlsYWJsZSBjb3VudHJ5IGltbWVkaWF0ZWx5LgorICogPHA+CisgKiBUbyBiZSBub3RpZmllZCBvZiB0aGUgZnV0dXJlIGNvdW50cnkgY2hhbmdlLCB1c2luZyB0aGUKKyAqIHtAbGluayAjc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lcil9CisgKiA8cD4KKyAqIFVzaW5nIHRoZSB7QGxpbmsgI3N0b3AoKX0gdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvdW50cnkgY2hhbmdlLgorICogPHA+CisgKiBUaGUgY291bnRyeSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlZnJlc2hlZCBldmVyeQorICoge0BsaW5rICNMT0NBVElPTl9SRUZSRVNIX0lOVEVSVkFMfSBvbmNlIHRoZSBsb2NhdGlvbiBiYXNlZCBjb3VudHJ5IGlzIHVzZWQuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBDb3VudHJ5RGV0ZWN0b3JCYXNlIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVmcmVzaCBpbnRlcnZhbCB3aGVuIHRoZSBsb2NhdGlvbiBiYXNlZCBjb3VudHJ5IHdhcyB1c2VkCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBMT0NBVElPTl9SRUZSRVNIX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjAgKiAyNDsgLy8gMSBkYXkKKworICAgIHByb3RlY3RlZCBDb3VudHJ5RGV0ZWN0b3JCYXNlIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yOworICAgIHByb3RlY3RlZCBUaW1lciBtTG9jYXRpb25SZWZyZXNoVGltZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUGhvbmVUeXBlOworICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeTsKKyAgICBwcml2YXRlIFRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXI7CisgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5RnJvbUxvY2F0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcHBlZCA9IGZhbHNlOworICAgIHByaXZhdGUgU2VydmljZVN0YXRlIG1MYXN0U3RhdGU7CisKKyAgICBwcml2YXRlIFBob25lU3RhdGVMaXN0ZW5lciBtUGhvbmVTdGF0ZUxpc3RlbmVyID0gbmV3IFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZChTZXJ2aWNlU3RhdGUgc2VydmljZVN0YXRlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBGaW5kIG91dCBob3cgb2Z0ZW4gd2Ugd2lsbCBiZSBub3RpZmllZCwgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvbworICAgICAgICAgICAgLy8gbWFueSB0aW1lcywgbGV0J3MgY29uc2lkZXIgcXVlcnlpbmcgdGhlIG5ldHdvcmsuCisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25TZXJ2aWNlU3RhdGVDaGFuZ2VkIik7CisgICAgICAgICAgICAvLyBXZSBvbmx5IGNhcmUgdGhlIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgaWYgKG1MYXN0U3RhdGUgPT0gbnVsbCB8fCBtTGFzdFN0YXRlLmdldFN0YXRlKCkgIT0gc2VydmljZVN0YXRlLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgIG1MYXN0U3RhdGUgPSBuZXcgU2VydmljZVN0YXRlKHNlcnZpY2VTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIGxpc3RlbmVyIGZvciByZWNlaXZpbmcgdGhlIG5vdGlmaWNhdGlvbiBmcm9tIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDb3VudHJ5TGlzdGVuZXIgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Db3VudHJ5RnJvbUxvY2F0aW9uID0gY291bnRyeTsKKyAgICAgICAgICAgIC8vIERvbid0IHN0YXJ0IHRoZSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLgorICAgICAgICAgICAgZGV0ZWN0Q291bnRyeSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICBzdG9wTG9jYXRpb25CYXNlZERldGVjdG9yKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBtVGVsZXBob255TWFuYWdlciA9IChUZWxlcGhvbnlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIG1QaG9uZVR5cGUgPSBtVGVsZXBob255TWFuYWdlci5nZXRQaG9uZVR5cGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICAvLyBEb24ndCBzdGFydCB0aGUgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciBpZiB3ZSBoYXZlIGJlZW4gc3RvcHBlZC4KKyAgICAgICAgcmV0dXJuIGRldGVjdENvdW50cnkoZmFsc2UsICFtU3RvcHBlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgU2xvZy5pKFRBRywgIlN0b3AgdGhlIGRldGVjdG9yLiIpOworICAgICAgICBjYW5jZWxMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgbUxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY291bnRyeSBmcm9tIGRpZmZlcmVudCBzb3VyY2VzIGluIG9yZGVyIG9mIHRoZSByZWxpYWJpbGl0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvdW50cnkgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgQ291bnRyeSByZXN1bHQgPSBudWxsOworICAgICAgICByZXN1bHQgPSBnZXROZXR3b3JrQmFzZWRDb3VudHJ5KCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0TGFzdEtub3duTG9jYXRpb25CYXNlZENvdW50cnkoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGdldFNpbUJhc2VkQ291bnRyeSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0TG9jYWxlQ291bnRyeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY291bnRyeSBmcm9tIHRoZSBtb2JpbGUgbmV0d29yay4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXROZXR3b3JrQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBTdHJpbmcgY291bnRyeUlzbyA9IG51bGw7CisgICAgICAgIC8vIFRPRE86IFRoZSBkb2N1bWVudCBzYXlzIHRoZSByZXN1bHQgbWF5IGJlIHVucmVsaWFibGUgb24gQ0RNQSBuZXR3b3Jrcy4gU2hhbGwgd2UgdXNlCisgICAgICAgIC8vIGl0IG9uIENETUEgcGhvbmU/IFdlIG1heSB0ZXN0IHRoZSBBbmRyb2lkIHByaW1hcmlseSB1c2VkIGNvdW50cmllcy4KKyAgICAgICAgaWYgKG1QaG9uZVR5cGUgPT0gVGVsZXBob255TWFuYWdlci5QSE9ORV9UWVBFX0dTTSkgeworICAgICAgICAgICAgY291bnRyeUlzbyA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldE5ldHdvcmtDb3VudHJ5SXNvKCk7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvdW50cnlJc28pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY2FjaGVkIGxvY2F0aW9uIGJhc2VkIGNvdW50cnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TGFzdEtub3duTG9jYXRpb25CYXNlZENvdW50cnkoKSB7CisgICAgICAgIHJldHVybiBtQ291bnRyeUZyb21Mb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGZyb20gU0lNIGNhcmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgY291bnRyeUlzbyA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldFNpbUNvdW50cnlJc28oKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjb3VudHJ5SXNvKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGZyb20gdGhlIHN5c3RlbSdzIGxvY2FsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMb2NhbGVDb3VudHJ5KCkgeworICAgICAgICBMb2NhbGUgZGVmYXVsdExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CisgICAgICAgIGlmIChkZWZhdWx0TG9jYWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeShkZWZhdWx0TG9jYWxlLmdldENvdW50cnkoKSwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbm90aWZ5Q2hhbmdlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBsaXN0ZW5lciBzaG91bGQgYmUgbm90aWZpZWQgdGhlIGNoYW5nZSBvZiB0aGUKKyAgICAgKiBjb3VudHJ5CisgICAgICogQHBhcmFtIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciBjb3VsZAorICAgICAqIGJlIHN0YXJ0ZWQgaWYgdGhlIGN1cnJlbnQgY291bnRyeSBzb3VyY2UgaXMgbGVzcyByZWxpYWJsZSB0aGFuIHRoZSBsb2NhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBVc2VyQ291bnRyeQorICAgICAqLworICAgIHByaXZhdGUgQ291bnRyeSBkZXRlY3RDb3VudHJ5KGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBnZXRDb3VudHJ5KCk7CisgICAgICAgIHJ1bkFmdGVyRGV0ZWN0aW9uQXN5bmMobUNvdW50cnkgIT0gbnVsbCA/IG5ldyBDb3VudHJ5KG1Db3VudHJ5KSA6IG1Db3VudHJ5LCBjb3VudHJ5LAorICAgICAgICAgICAgICAgIG5vdGlmeUNoYW5nZSwgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKTsKKyAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0YXNrcyBpbiB0aGUgc2VydmljZSdzIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBydW5BZnRlckRldGVjdGlvbkFzeW5jKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnksCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUNoYW5nZSwgZmluYWwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgcnVuQWZ0ZXJEZXRlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5LCBkZXRlY3RlZENvdW50cnksIG5vdGlmeUNoYW5nZSwgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBDb3VudHJ5TGlzdGVuZXIgcHJldkxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBTdG9wIGxpc3RlbmluZyBhbGwgc2VydmljZXMKKyAgICAgICAgICAgIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpOworICAgICAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICAgICAgY2FuY2VsTG9jYXRpb25SZWZyZXNoKCk7CisgICAgICAgIH0gZWxzZSBpZiAocHJldkxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBob25lU3RhdGVMaXN0ZW5lcigpOworICAgICAgICAgICAgZGV0ZWN0Q291bnRyeShmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJ1bkFmdGVyRGV0ZWN0aW9uKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnksCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUNoYW5nZSwgZmluYWwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgaWYgKG5vdGlmeUNoYW5nZSkgeworICAgICAgICAgICAgbm90aWZ5SWZDb3VudHJ5Q2hhbmdlZChjb3VudHJ5LCBkZXRlY3RlZENvdW50cnkpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24gJiYgKGRldGVjdGVkQ291bnRyeSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgZGV0ZWN0ZWRDb3VudHJ5LmdldFNvdXJjZSgpID4gQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBVElPTikKKyAgICAgICAgICAgICAgICAmJiBpc0FpcnBsYW5lTW9kZU9mZigpICYmIG1MaXN0ZW5lciAhPSBudWxsICYmIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpKSB7CisgICAgICAgICAgICAvLyBTdGFydCBmaW5kaW5nIGxvY2F0aW9uIHdoZW4gdGhlIHNvdXJjZSBpcyBsZXNzIHJlbGlhYmxlIHRoYW4gdGhlCisgICAgICAgICAgICAvLyBsb2NhdGlvbiBhbmQgdGhlIGFpcnBsYW5lIG1vZGUgaXMgb2ZmIChhcyBnZW9jb2RlciB3aWxsIG5vdAorICAgICAgICAgICAgLy8gd29yaykuCisgICAgICAgICAgICAvLyBUT0RPIDogU2hhbGwgd2UgZ2l2ZSB1cCBzdGFydGluZyB0aGUgZGV0ZWN0b3Igd2l0aGluIGEKKyAgICAgICAgICAgIC8vIHBlcmlvZCBvZiB0aW1lPworICAgICAgICAgICAgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0b3IobUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0aW9uTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXRlY3RlZENvdW50cnkgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IGRldGVjdGVkQ291bnRyeS5nZXRTb3VyY2UoKSA+PSBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKSB7CisgICAgICAgICAgICAvLyBTY2hlZHVsZSB0aGUgbG9jYXRpb24gcmVmcmVzaCBpZiB0aGUgY291bnRyeSBzb3VyY2UgaXMKKyAgICAgICAgICAgIC8vIG5vdCBtb3JlIHJlbGlhYmxlIHRoYW4gdGhlIGxvY2F0aW9uIG9yIG5vIGNvdW50cnkgaXMKKyAgICAgICAgICAgIC8vIGZvdW5kLgorICAgICAgICAgICAgLy8gVE9ETzogTGlzdGVuIHRvIHRoZSBwcmVmZXJlbmNlIGNoYW5nZSBvZiBHUFMsIFdpZmkgZXRjLAorICAgICAgICAgICAgLy8gYW5kIHN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeS4KKyAgICAgICAgICAgIHNjaGVkdWxlTG9jYXRpb25SZWZyZXNoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDYW5jZWwgdGhlIGxvY2F0aW9uIHJlZnJlc2ggb25jZSB0aGUgY3VycmVudCBzb3VyY2UgaXMKKyAgICAgICAgICAgIC8vIG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgbG9jYXRpb24uCisgICAgICAgICAgICBjYW5jZWxMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGNvdW50cnkgZnJvbSBMb2NhdGlvblByb3ZpZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgPSBjcmVhdGVMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yKCk7CisgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ291bnRyeURldGVjdG9yQmFzZSBjcmVhdGVMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IobUNvbnRleHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQWlycGxhbmVNb2RlT2ZmKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU3lzdGVtLmdldEludCgKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU3lzdGVtLkFJUlBMQU5FX01PREVfT04sIDApID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBjb3VudHJ5IGNoYW5nZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5SWZDb3VudHJ5Q2hhbmdlZChmaW5hbCBDb3VudHJ5IGNvdW50cnksIGZpbmFsIENvdW50cnkgZGV0ZWN0ZWRDb3VudHJ5KSB7CisgICAgICAgIGlmIChkZXRlY3RlZENvdW50cnkgIT0gbnVsbCAmJiBtTGlzdGVuZXIgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIChjb3VudHJ5ID09IG51bGwgfHwgIWNvdW50cnkuZXF1YWxzKGRldGVjdGVkQ291bnRyeSkpKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAiVGhlIGNvdW50cnkgd2FzIGNoYW5nZWQgZnJvbSAiICsgY291bnRyeSAhPSBudWxsID8gY291bnRyeS5nZXRDb3VudHJ5SXNvKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSArICIgdG8gIiArIGRldGVjdGVkQ291bnRyeS5nZXRDb3VudHJ5SXNvKCkpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoZGV0ZWN0ZWRDb3VudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNjaGVkdWxlIHRoZSBuZXh0IGxvY2F0aW9uIHJlZnJlc2guIFdlIHdpbGwgZG8gbm90aGluZyBpZiB0aGUgc2NoZWR1bGVkIHRhc2sgZXhpc3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2NoZWR1bGVMb2NhdGlvblJlZnJlc2goKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25SZWZyZXNoVGltZXIgIT0gbnVsbCkgcmV0dXJuOworICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGRldGVjdENvdW50cnkoZmFsc2UsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9LCBMT0NBVElPTl9SRUZSRVNIX0lOVEVSVkFMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhlIHNjaGVkdWxlZCByZWZyZXNoIHRhc2sgaWYgaXQgZXhpc3RzCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjYW5jZWxMb2NhdGlvblJlZnJlc2goKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25SZWZyZXNoVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgIGlmIChtUGhvbmVTdGF0ZUxpc3RlbmVyID09IG51bGwgJiYgbVBob25lVHlwZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLlBIT05FX1RZUEVfR1NNKSB7CisgICAgICAgICAgICBtTGFzdFN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIG1QaG9uZVN0YXRlTGlzdGVuZXIgPSBuZXcgUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZChTZXJ2aWNlU3RhdGUgc2VydmljZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEZpbmQgb3V0IGhvdyBvZnRlbiB3ZSB3aWxsIGJlIG5vdGlmaWVkLCBpZiB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpcyBjYWxsZWQgdG9vCisgICAgICAgICAgICAgICAgICAgIC8vIG1hbnkgdGltZXMsIGxldCdzIGNvbnNpZGVyIHF1ZXJ5aW5nIHRoZSBuZXR3b3JrLgorICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25TZXJ2aWNlU3RhdGVDaGFuZ2VkIik7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSB0aGUgc3RhdGUgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFN0YXRlID09IG51bGwgfHwgbUxhc3RTdGF0ZS5nZXRTdGF0ZSgpICE9IHNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RTdGF0ZSA9IG5ldyBTZXJ2aWNlU3RhdGUoc2VydmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5saXN0ZW4obVBob25lU3RhdGVMaXN0ZW5lciwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TRVJWSUNFX1NUQVRFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgIGlmIChtUGhvbmVTdGF0ZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbihtUGhvbmVTdGF0ZUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX05PTkUpOworICAgICAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlb0NvZGVySW1wbGVtZW50ZWQoKSB7CisgICAgICAgIHJldHVybiBHZW9jb2Rlci5pc1ByZXNlbnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyNmVmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvdW50cnlEZXRlY3RvckJhc2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBtZXRob2RzIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvdW50cnkKKyAqIGRldGVjdG9yLgorICogPHA+CisgKiBDYWxsaW5nIHtAbGluayAjZGV0ZWN0Q291bnRyeX0gdG8gc3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LiBUaGUgY291bnRyeQorICogY291bGQgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkgaWYgaXQgaXMgYXZhaWxhYmxlLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JCYXNlIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBtRGV0ZWN0ZWRDb3VudHJ5OworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvckJhc2UoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjdHg7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCBzaG91bGQKKyAgICAgKiAgICAgICAgIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDb3VudHJ5IGRldGVjdENvdW50cnkoKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJldmlvdXMgbGlzdGVuZXIgd2lsbCBiZSByZXBsYWNlZCBpZiBpdCBleGlzdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGRldGVjdGluZyB0aGUgY291bnRyeS4gVGhlIGRldGVjdG9yIHNob3VsZCByZWxlYXNlIGFsbCBzeXN0ZW0gc2VydmljZXMgYW5kIGJlIHJlYWR5IHRvCisgICAgICogYmUgZnJlZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKCk7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcihDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25Db3VudHJ5RGV0ZWN0ZWQoY291bnRyeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTM5ZjA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3M7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHdoaWNoIGNvdW50cnkgdGhlIHVzZXIgY3VycmVudGx5IGlzIGluIHRocm91Z2ggdGhlIGVuYWJsZWQKKyAqIGxvY2F0aW9uIHByb3ZpZGVycyBhbmQgdGhlIEdlb0NvZGVyCisgKiA8cD4KKyAqIFVzZSB7QGxpbmsgI2RldGVjdENvdW50cnl9IHRvIHN0YXJ0IHF1ZXJ5aW5nLiBJZiB0aGUgbG9jYXRpb24gY2FuIG5vdCBiZQorICogcmVzb2x2ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lLCB0aGUgbGFzdCBrbm93biBsb2NhdGlvbiB3aWxsIGJlIHVzZWQgdG8gZ2V0CisgKiB0aGUgdXNlciBjb3VudHJ5IHRocm91Z2ggdGhlIEdlb0NvZGVyLiBUaGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUKKyAqIHRocm93biBpZiB0aGVyZSBpcyBhIG9uZ29pbmcgcXVlcnkuCisgKiA8cD4KKyAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhbiBiZSBzdG9wcGVkIGJ5IHtAbGluayAjc3RvcCgpfQorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGV4dGVuZHMgQ291bnRyeURldGVjdG9yQmFzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQgPSAxMDAwICogNjAgKiA1OyAvLyA1IG1pbnMKKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIGNhbmNlbGluZyBsb2NhdGlvbiBxdWVyeQorICAgICAqLworICAgIHByb3RlY3RlZCBUaW1lciBtVGltZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZWFkIHRvIHF1ZXJ5IHRoZSBjb3VudHJ5IGZyb20gdGhlIEdlb0NvZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgbVF1ZXJ5VGhyZWFkOworICAgIHByb3RlY3RlZCBMaXN0PExvY2F0aW9uTGlzdGVuZXI+IG1Mb2NhdGlvbkxpc3RlbmVyczsKKworICAgIHByaXZhdGUgTG9jYXRpb25NYW5hZ2VyIG1Mb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUVuYWJsZWRQcm92aWRlcnM7CisKKyAgICBwdWJsaWMgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcihDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihjdHgpOworICAgICAgICBtTG9jYXRpb25NYW5hZ2VyID0gKExvY2F0aW9uTWFuYWdlcikgY3R4LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MT0NBVElPTl9TRVJWSUNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSBmcm9tIHRoZSBsb2NhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBTdHJpbmcgY291bnRyeSA9IG51bGw7CisgICAgICAgIEdlb2NvZGVyIGdlb0NvZGVyID0gbmV3IEdlb2NvZGVyKG1Db250ZXh0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3Q8QWRkcmVzcz4gYWRkcmVzc2VzID0gZ2VvQ29kZXIuZ2V0RnJvbUxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5nZXRMYXRpdHVkZSgpLCBsb2NhdGlvbi5nZXRMb25naXR1ZGUoKSwgMSk7CisgICAgICAgICAgICBpZiAoYWRkcmVzc2VzICE9IG51bGwgJiYgYWRkcmVzc2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb3VudHJ5ID0gYWRkcmVzc2VzLmdldCgwKS5nZXRDb3VudHJ5Q29kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiRXhjZXB0aW9uIG9jY3VycyB3aGVuIGdldHRpbmcgY291bnRyeSBmcm9tIGxvY2F0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgaW50IHRvdGFsID0gbGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IHRvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcygKKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWRQcm92aWRlcnMuZ2V0KGkpLCAwLCAwLCBsaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgIGZvciAoTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZW1vdmVVcGRhdGVzKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxhc3Qga25vd24gbG9jYXRpb24gZnJvbSBhbGwgcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIExvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gcHJvdmlkZXJzID0gbUxvY2F0aW9uTWFuYWdlci5nZXRBbGxQcm92aWRlcnMoKTsKKyAgICAgICAgTG9jYXRpb24gYmVzdExvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJvdmlkZXIgOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgIExvY2F0aW9uIGxhc3RLbm93bkxvY2F0aW9uID0gbUxvY2F0aW9uTWFuYWdlci5nZXRMYXN0S25vd25Mb2NhdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICBpZiAobGFzdEtub3duTG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChiZXN0TG9jYXRpb24gPT0gbnVsbCB8fCBiZXN0TG9jYXRpb24uZ2V0VGltZSgpIDwgbGFzdEtub3duTG9jYXRpb24uZ2V0VGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RMb2NhdGlvbiA9IGxhc3RLbm93bkxvY2F0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVzdExvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHRpbWVvdXQgZm9yIHF1ZXJ5aW5nIHRoZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRRdWVyeUxvY2F0aW9uVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGVuYWJsZWQgbG9jYXRpb24gcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRUb3RhbEVuYWJsZWRQcm92aWRlcnMoKSB7CisgICAgICAgIGlmIChtRW5hYmxlZFByb3ZpZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtRW5hYmxlZFByb3ZpZGVycyA9IG1Mb2NhdGlvbk1hbmFnZXIuZ2V0UHJvdmlkZXJzKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRW5hYmxlZFByb3ZpZGVycy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LgorICAgICAqIDxwPgorICAgICAqIFF1ZXJpZXMgdGhlIGxvY2F0aW9uIGZyb20gYWxsIGxvY2F0aW9uIHByb3ZpZGVycywgdGhlbiBzdGFydHMgYSB0aHJlYWQgdG8gcXVlcnkgdGhlCisgICAgICogY291bnRyeSBmcm9tIEdlb0NvZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICBpZiAobUxvY2F0aW9uTGlzdGVuZXJzICAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVxdWVzdCB0aGUgbG9jYXRpb24gZnJvbSBhbGwgZW5hYmxlZCBwcm92aWRlcnMuCisgICAgICAgIGludCB0b3RhbFByb3ZpZGVycyA9IGdldFRvdGFsRW5hYmxlZFByb3ZpZGVycygpOworICAgICAgICBpZiAodG90YWxQcm92aWRlcnMgPiAwKSB7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PExvY2F0aW9uTGlzdGVuZXI+KHRvdGFsUHJvdmlkZXJzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxQcm92aWRlcnM7IGkrKykgeworICAgICAgICAgICAgICAgIExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lciAoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYXRpb25DaGFuZ2VkKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IudGhpcy5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckRpc2FibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhdHVzQ2hhbmdlZChTdHJpbmcgcHJvdmlkZXIsIGludCBzdGF0dXMsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMobUxvY2F0aW9uTGlzdGVuZXJzKTsKKyAgICAgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnRoaXMuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICAvLyBMb29rcyBsaWtlIG5vIHByb3ZpZGVyIGNvdWxkIHByb3ZpZGUgdGhlIGxvY2F0aW9uLCBsZXQncyB0cnkgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgLy8ga25vd24gbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnRyeUNvZGUoZ2V0TGFzdEtub3duTG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgZ2V0UXVlcnlMb2NhdGlvblRpbWVvdXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwcm92aWRlciBlbmFibGVkLgorICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShnZXRMYXN0S25vd25Mb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURldGVjdGVkQ291bnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjdXJyZW50IHF1ZXJ5IHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyUHJvdmlkZXJzKG1Mb2NhdGlvbkxpc3RlbmVycyk7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IHRocmVhZCB0byBxdWVyeSB0aGUgY291bnRyeSBmcm9tIEdlb2NvZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcXVlcnlDb3VudHJ5Q29kZShmaW5hbCBMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1RdWVyeVRocmVhZCAhPSBudWxsKSByZXR1cm47CisgICAgICAgIG1RdWVyeVRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudHJ5SXNvID0gZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5SXNvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURldGVjdGVkQ291bnRyeSA9IG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1EZXRlY3RlZENvdW50cnkgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtRGV0ZWN0ZWRDb3VudHJ5KTsKKyAgICAgICAgICAgICAgICBtUXVlcnlUaHJlYWQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVF1ZXJ5VGhyZWFkLnN0YXJ0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawppbmRleCBjZGMwYTZmLi40NTk1NTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawpAQCAtOCw2ICs4LDcgQEAKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlci5jcHAgXAorICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UuY3BwIFwKIAljb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAgXAogICAgIG9ubG9hZC5jcHAKQEAgLTI1LDYgKzI2LDggQEAKIAlsaWJ1dGlscyBcCiAJbGlidWkKIAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJ1c2Job3N0CisKIGlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKIGlmZXEgKCQoVEFSR0VUX09TKSxsaW51eCkKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLHg4NikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyLmNwcAppbmRleCA4ZTdiZTQ0Li40ZjFmYWI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwCkBAIC0xMjc4LDYgKzEyNzgsMjcgQEAKICAgICBlbnYtPlNldEludEZpZWxkKGNvbmZpZ09iaiwgZ0NvbmZpZ3VyYXRpb25DbGFzc0luZm8ubmF2aWdhdGlvbiwgY29uZmlnLm5hdmlnYXRpb24pOwogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZVRyYW5zZmVyVG91Y2hGb2N1cyhKTklFbnYqIGVudiwKKyAgICAgICAgamNsYXNzIGNsYXp6LCBqb2JqZWN0IGZyb21DaGFubmVsT2JqLCBqb2JqZWN0IHRvQ2hhbm5lbE9iaikgeworICAgIGlmIChjaGVja0lucHV0TWFuYWdlclVuaXRpYWxpemVkKGVudikpIHsKKyAgICAgICAgTE9HRCgiaW5wdXQgbWFuYWdlciB1bmluaXRpYWxpemVkOyBiYWlsaW5nIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxJbnB1dENoYW5uZWw+IGZyb21DaGFubmVsID0KKyAgICAgICAgICAgIGFuZHJvaWRfdmlld19JbnB1dENoYW5uZWxfZ2V0SW5wdXRDaGFubmVsKGVudiwgZnJvbUNoYW5uZWxPYmopOworICAgIHNwPElucHV0Q2hhbm5lbD4gdG9DaGFubmVsID0KKyAgICAgICAgICAgIGFuZHJvaWRfdmlld19JbnB1dENoYW5uZWxfZ2V0SW5wdXRDaGFubmVsKGVudiwgdG9DaGFubmVsT2JqKTsKKworICAgIGlmIChmcm9tQ2hhbm5lbCA9PSBOVUxMIHx8IHRvQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIExPR0QoImJhaWxpbmcgYmVjYXVzZSBmcm9tPSVwIHRvPSVwIiwgZnJvbUNoYW5uZWwsIHRvQ2hhbm5lbCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gZ05hdGl2ZUlucHV0TWFuYWdlci0+Z2V0SW5wdXRNYW5hZ2VyKCktPmdldERpc3BhdGNoZXIoKS0+CisgICAgICAgICAgICB0cmFuc2ZlclRvdWNoRm9jdXMoZnJvbUNoYW5uZWwsIHRvQ2hhbm5lbCk7Cit9CisKIHN0YXRpYyBqc3RyaW5nIGFuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcl9uYXRpdmVEdW1wKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopIHsKICAgICBpZiAoY2hlY2tJbnB1dE1hbmFnZXJVbml0aWFsaXplZChlbnYpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTMyNiw2ICsxMzQ3LDggQEAKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZUdldElucHV0RGV2aWNlSWRzIH0sCiAgICAgeyAibmF0aXZlR2V0SW5wdXRDb25maWd1cmF0aW9uIiwgIihMYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uOylWIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZUdldElucHV0Q29uZmlndXJhdGlvbiB9LAorICAgIHsgIm5hdGl2ZVRyYW5zZmVyVG91Y2hGb2N1cyIsICIoTGFuZHJvaWQvdmlldy9JbnB1dENoYW5uZWw7TGFuZHJvaWQvdmlldy9JbnB1dENoYW5uZWw7KVoiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXJfbmF0aXZlVHJhbnNmZXJUb3VjaEZvY3VzIH0sCiAgICAgeyAibmF0aXZlRHVtcCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsCiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcl9uYXRpdmVEdW1wIH0sCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQ3OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlVzYk9ic2VydmVyIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDIwKQorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvdXNiX2NoOS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF91c2JDYW1lcmFBZGRlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQ7CisKK1ZlY3RvcjxpbnQ+IG1EZXZpY2VMaXN0OworCitzdGF0aWMgdm9pZCBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXRob2ROYW1lKSB7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICBMT0dFKCJBbiBleGNlcHRpb24gd2FzIHRocm93biBieSBjYWxsYmFjayAnJXMnLiIsIG1ldGhvZE5hbWUpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdXNiX2RldmljZV9hZGRlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhIGNhbWVyYQorICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIqIGRlc2M7CisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2l0ZXIgaXRlcjsKKworICAgIHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UgPSB1c2JfZGV2aWNlX29wZW4oZGV2bmFtZSk7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgTE9HRSgidXNiX2RldmljZV9vcGVuIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChkZXZpY2UsICZpdGVyKTsKKworICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfSU5URVJGQUNFKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZhY2UgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfU1RJTExfSU1BR0UgJiYKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyA9PSAxICYmIC8vIFN0aWxsIEltYWdlIENhcHR1cmUKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAxKSAgICAgLy8gUGljdHVyZSBUcmFuc2ZlciBQcm90b2NvbCAoUElNQSAxNTQ3MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJGb3VuZCBjYW1lcmE6IFwiJXNcIiBcIiVzXCJcbiIsIHVzYl9kZXZpY2VfZ2V0X21hbnVmYWN0dXJlcl9uYW1lKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2aWNlX2dldF9wcm9kdWN0X25hbWUoZGV2aWNlKSk7CisKKyAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IHRocmVlIGVuZHBvaW50cworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXA7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX291dF9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2ludHJfZGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZXAgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFlcCB8fCBlcC0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVwLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX2luX2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9vdXRfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVwLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UICYmCisgICAgICAgICAgICAgICAgICAgICAgICBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgeworICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW50cl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFlcF9pbl9kZXNjIHx8ICFlcF9vdXRfZGVzYyB8fCAhZXBfaW50cl9kZXNjKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHdlIGZvdW5kIGEgY2FtZXJhCisgICAgICAgICAgICAgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICAgICAgam9iamVjdCB0aGl6ID0gKGpvYmplY3QpY2xpZW50X2RhdGE7CisKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSB1c2JfZGV2aWNlX2dldF91bmlxdWVfaWRfZnJvbV9uYW1lKGRldm5hbWUpOworICAgICAgICAgICAgICAgIG1EZXZpY2VMaXN0LmFkZChpZCk7CisKKyAgICAgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHRoaXosIG1ldGhvZF91c2JDYW1lcmFBZGRlZCwgaWQpOworICAgICAgICAgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorZG9uZToKKyAgICB1c2JfZGV2aWNlX2Nsb3NlKGRldmljZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgaW50IGlkID0gdXNiX2RldmljZV9nZXRfdW5pcXVlX2lkX2Zyb21fbmFtZShkZXZuYW1lKTsKKworICAgIC8vIHNlZSBpZiBpdCBpcyBhIGRldmljZSB3ZSBrbm93IGFib3V0CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaWQgID09IG1EZXZpY2VMaXN0W2ldKSB7CisgICAgICAgICAgICBtRGV2aWNlTGlzdC5yZW1vdmVBdChpKTsKKworICAgICAgICAgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBqb2JqZWN0IHRoaXogPSAoam9iamVjdCljbGllbnRfZGF0YTsKKworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCh0aGl6LCBtZXRob2RfdXNiQ2FtZXJhUmVtb3ZlZCwgaWQpOworICAgICAgICAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXJfbW9uaXRvclVzYkhvc3RCdXMoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCogY29udGV4dCA9IHVzYl9ob3N0X2luaXQoKTsKKyAgICBpZiAoIWNvbnRleHQpIHsKKyAgICAgICAgTE9HRSgidXNiX2hvc3RfaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIHNvIGl0IGlzIHNhZmUgdG8gcGFzcyB0aGl6IGRpcmVjdGx5CisgICAgdXNiX2hvc3RfcnVuKGNvbnRleHQsIHVzYl9kZXZpY2VfYWRkZWQsIHVzYl9kZXZpY2VfcmVtb3ZlZCwgTlVMTCwgKHZvaWQgKil0aGl6KTsKK30KKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RfdGFibGVbXSA9IHsKKyAgICB7ICJtb25pdG9yVXNiSG9zdEJ1cyIsICIoKVYiLCAodm9pZCopYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXJfbW9uaXRvclVzYkhvc3RCdXMgfQorfTsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJjb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGNvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF91c2JDYW1lcmFBZGRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJ1c2JDYW1lcmFBZGRlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF91c2JDYW1lcmFBZGRlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgdXNiQ2FtZXJhQWRkZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfdXNiQ2FtZXJhUmVtb3ZlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJ1c2JDYW1lcmFSZW1vdmVkIiwgIihJKVYiKTsKKyAgICBpZiAobWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkNhbWVyYVJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyIiwKKyAgICAgICAgICAgIG1ldGhvZF90YWJsZSwgTkVMRU0obWV0aG9kX3RhYmxlKSk7Cit9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcCBiL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwCmluZGV4IGNkNGYwYTQuLjM1MDJhY2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwCisrKyBiL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwCkBAIC05LDYgKzksNyBAQAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcihKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZShKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZShKTklFbnYqIGVudik7CitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZShKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfU3lzdGVtU2VydmVyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyKEpOSUVudiogZW52KTsKQEAgLTMyLDYgKzMzLDcgQEAKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9MaWdodHNTZXJ2aWNlKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQWxhcm1NYW5hZ2VyU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JhdHRlcnlTZXJ2aWNlKGVudik7CisgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyKGVudik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawppbmRleCBhMTRiZmI1Li5lNDgyNWQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKQEAgLTUsNiArNSw3IEBACiAgICAgY2x6LmNwcC5hcm0gXAogICAgIERpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwIFwKICAgICBEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlQmFzZS5jcHAgXAorICAgIERpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcCBcCiAgICAgQmx1ckZpbHRlci5jcHAuYXJtIFwKICAgICBHTEV4dGVuc2lvbnMuY3BwIFwKICAgICBMYXllci5jcHAgXApAQCAtMjEsNyArMjIsNyBAQAogTE9DQUxfQ0ZMQUdTICs9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwogCiBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIG9tYXAzKQotCUxPQ0FMX0NGTEFHUyArPSAtRE5PX1JHQlhfODg4OAorCUxPQ0FMX0NGTEFHUyArPSAtRE5PX1JHQlhfODg4OCAtREhBU19QVVNIX0JVRkZFUlMKIGVuZGlmCiAKICMgbmVlZCAiLWxydCIgb24gTGludXggc2ltdWxhdG9yIHRvIHBpY2sgdXAgY2xvY2tfZ2V0dGltZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcAppbmRleCAwNTE1MTEwLi5iZDM0OGJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcApAQCAtMzYsMTEgKzM2LDExIEBACiAKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCiAKLSNpbmNsdWRlIDxoYXJkd2FyZS9jb3B5Yml0Lmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvb3ZlcmxheS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KIAogI2luY2x1ZGUgIkdMRXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIkhXQ29tcG9zZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLAogICAgICAgICB1aW50MzJfdCBkcHkpCiAgICAgOiBEaXNwbGF5SGFyZHdhcmVCYXNlKGZsaW5nZXIsIGRweSksCi0gICAgICBtRmxhZ3MoMCkKKyAgICAgIG1GbGFncygwKSwgbUh3YygwKQogewogICAgIGluaXQoZHB5KTsKIH0KQEAgLTI2Miw2ICsyNjIsMTcgQEAKIAogICAgIC8vIFVuYmluZCB0aGUgY29udGV4dCBmcm9tIHRoaXMgdGhyZWFkCiAgICAgZWdsTWFrZUN1cnJlbnQoZGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCk7CisKKworICAgIC8vIGluaXRpYWxpemUgdGhlIEgvVyBjb21wb3NlcgorICAgIG1Id2MgPSBuZXcgSFdDb21wb3NlcigpOworICAgIGlmIChtSHdjLT5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICBtSHdjLT5zZXRGcmFtZUJ1ZmZlcihtRGlzcGxheSwgbVN1cmZhY2UpOworICAgIH0KK30KKworSFdDb21wb3NlciYgRGlzcGxheUhhcmR3YXJlOjpnZXRId0NvbXBvc2VyKCkgY29uc3QgeworICAgIHJldHVybiAqbUh3YzsKIH0KIAogLyoKQEAgLTI4MSw2ICsyOTIsOSBAQAogdm9pZCBEaXNwbGF5SGFyZHdhcmU6OnJlbGVhc2VTY3JlZW4oKSBjb25zdAogewogICAgIERpc3BsYXlIYXJkd2FyZUJhc2U6OnJlbGVhc2VTY3JlZW4oKTsKKyAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3Yy0+cmVsZWFzZSgpOworICAgIH0KIH0KIAogdm9pZCBEaXNwbGF5SGFyZHdhcmU6OmFjcXVpcmVTY3JlZW4oKSBjb25zdApAQCAtMzIxLDcgKzMzNSwxMiBAQAogICAgIH0KICAgICAKICAgICBtUGFnZUZsaXBDb3VudCsrOwotICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisKKyAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3Yy0+Y29tbWl0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICB9CiAgICAgY2hlY2tFR0xFcnJvcnMoImVnbFN3YXBCdWZmZXJzIik7CiAKICAgICAvLyBmb3IgZGVidWdnaW5nCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKaW5kZXggMmQ3OTAwYy4uNzViNTVkZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaApAQCAtMzQsMTIgKzM0LDExIEBACiAjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuaCIKIAogc3RydWN0IG92ZXJsYXlfY29udHJvbF9kZXZpY2VfdDsKLXN0cnVjdCBmcmFtZWJ1ZmZlcl9kZXZpY2VfdDsKLXN0cnVjdCBjb3B5Yml0X2ltYWdlX3Q7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c7CitjbGFzcyBIV0NvbXBvc2VyOwogCiBjbGFzcyBEaXNwbGF5SGFyZHdhcmUgOiBwdWJsaWMgRGlzcGxheUhhcmR3YXJlQmFzZQogewpAQCAtODAsNiArNzksOSBAQAogICAgIHVpbnQzMl90IGdldFBhZ2VGbGlwQ291bnQoKSBjb25zdDsKICAgICBFR0xEaXNwbGF5IGdldEVHTERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtRGlzcGxheTsgfQogICAgIG92ZXJsYXlfY29udHJvbF9kZXZpY2VfdCogZ2V0T3ZlcmxheUVuZ2luZSgpIGNvbnN0IHsgcmV0dXJuIG1PdmVybGF5RW5naW5lOyB9CisKKyAgICAvLyBIYXJkd2FyZSBDb21wb3NlcgorICAgIEhXQ29tcG9zZXImIGdldEh3Q29tcG9zZXIoKSBjb25zdDsKICAgICAKICAgICBzdGF0dXNfdCBjb21wb3NpdGlvbkNvbXBsZXRlKCkgY29uc3Q7CiAgICAgCkBAIC0xMTAsNiArMTEyLDggQEAKICAgICBHTGludCAgICAgICAgICAgbU1heFZpZXdwb3J0RGltczsKICAgICBHTGludCAgICAgICAgICAgbU1heFRleHR1cmVTaXplOwogICAgIAorICAgIEhXQ29tcG9zZXIqICAgICBtSHdjOworCiAgICAgc3A8RnJhbWVidWZmZXJOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7CiAgICAgb3ZlcmxheV9jb250cm9sX2RldmljZV90KiBtT3ZlcmxheUVuZ2luZTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmMjc0YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworI2luY2x1ZGUgIkhXQ29tcG9zZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hXQ29tcG9zZXI6OkhXQ29tcG9zZXIoKQorICAgIDogbU1vZHVsZSgwKSwgbUh3YygwKSwgbUxpc3QoMCksIG1DYXBhY2l0eSgwKSwKKyAgICAgIG1EcHkoRUdMX05PX0RJU1BMQVkpLCBtU3VyKEVHTF9OT19TVVJGQUNFKQoreworICAgIGludCBlcnIgPSBod19nZXRfbW9kdWxlKEhXQ19IQVJEV0FSRV9NT0RVTEVfSUQsICZtTW9kdWxlKTsKKyAgICBMT0dXX0lGKGVyciwgIiVzIG1vZHVsZSBub3QgZm91bmQiLCBIV0NfSEFSRFdBUkVfTU9EVUxFX0lEKTsKKyAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgZXJyID0gaHdjX29wZW4obU1vZHVsZSwgJm1Id2MpOworICAgICAgICBMT0dFX0lGKGVyciwgIiVzIGRldmljZSBmYWlsZWQgdG8gaW5pdGlhbGl6ZSAoJXMpIiwKKyAgICAgICAgICAgICAgICBIV0NfSEFSRFdBUkVfQ09NUE9TRVIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICB9Cit9CisKK0hXQ29tcG9zZXI6On5IV0NvbXBvc2VyKCkgeworICAgIGZyZWUobUxpc3QpOworICAgIGlmIChtSHdjKSB7CisgICAgICAgIGh3Y19jbG9zZShtSHdjKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEhXQ29tcG9zZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUh3YyA/IE5PX0VSUk9SIDogTk9fSU5JVDsKK30KKwordm9pZCBIV0NvbXBvc2VyOjpzZXRGcmFtZUJ1ZmZlcihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXIpIHsKKyAgICBtRHB5ID0gKGh3Y19kaXNwbGF5X3QpZHB5OworICAgIG1TdXIgPSAoaHdjX3N1cmZhY2VfdClzdXI7Cit9CisKK3N0YXR1c190IEhXQ29tcG9zZXI6OmNyZWF0ZVdvcmtMaXN0KHNpemVfdCBudW1MYXllcnMpIHsKKyAgICBpZiAobUh3YykgeworICAgICAgICBpZiAoIW1MaXN0IHx8IG1DYXBhY2l0eSA8IG51bUxheWVycykgeworICAgICAgICAgICAgZnJlZShtTGlzdCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihod2NfbGF5ZXJfbGlzdCkgKyBudW1MYXllcnMqc2l6ZW9mKGh3Y19sYXllcl90KTsKKyAgICAgICAgICAgIG1MaXN0ID0gKGh3Y19sYXllcl9saXN0X3QqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIG1DYXBhY2l0eSA9IG51bUxheWVyczsKKyAgICAgICAgfQorICAgICAgICBtTGlzdC0+ZmxhZ3MgPSBIV0NfR0VPTUVUUllfQ0hBTkdFRDsKKyAgICAgICAgbUxpc3QtPm51bUh3TGF5ZXJzID0gbnVtTGF5ZXJzOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEhXQ29tcG9zZXI6OnByZXBhcmUoKSBjb25zdCB7CisgICAgaW50IGVyciA9IG1Id2MtPnByZXBhcmUobUh3YywgbUxpc3QpOworICAgIHJldHVybiAoc3RhdHVzX3QpZXJyOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpjb21taXQoKSBjb25zdCB7CisgICAgaW50IGVyciA9IG1Id2MtPnNldChtSHdjLCBtRHB5LCBtU3VyLCBtTGlzdCk7CisgICAgaWYgKG1MaXN0KSB7CisgICAgICAgIG1MaXN0LT5mbGFncyAmPSB+SFdDX0dFT01FVFJZX0NIQU5HRUQ7CisgICAgfQorICAgIHJldHVybiAoc3RhdHVzX3QpZXJyOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpyZWxlYXNlKCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5zZXQobUh3YywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Cit9CisKK3NpemVfdCBIV0NvbXBvc2VyOjpnZXROdW1MYXllcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MaXN0ID8gbUxpc3QtPm51bUh3TGF5ZXJzIDogMDsKK30KKworaHdjX2xheWVyX3QqIEhXQ29tcG9zZXI6OmdldExheWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpc3QgPyBtTGlzdC0+aHdMYXllcnMgOiAwOworfQorCit2b2lkIEhXQ29tcG9zZXI6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdCB7CisgICAgaWYgKG1Id2MgJiYgbUxpc3QpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiSGFyZHdhcmUgQ29tcG9zZXIgc3RhdGU6XG4iKTsKKworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIG51bUh3TGF5ZXJzPSV1LCBmbGFncz0lMDh4XG4iLAorICAgICAgICAgICAgICAgIG1MaXN0LT5udW1Id0xheWVycywgbUxpc3QtPmZsYWdzKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8bUxpc3QtPm51bUh3TGF5ZXJzIDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBod2NfbGF5ZXJfdCYgbChtTGlzdC0+aHdMYXllcnNbaV0pOworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAlOHMgfCAlMDh4IHwgJTA4eCB8ICUwMnggfCAlMDR4IHwgWyU1ZCwlNWQsJTVkLCU1ZF0gfCAgWyU1ZCwlNWQsJTVkLCU1ZF1cbiIsCisgICAgICAgICAgICAgICAgICAgIGwuY29tcG9zaXRpb25UeXBlID8gIk9WRVJMQVkiIDogIkZCIiwKKyAgICAgICAgICAgICAgICAgICAgbC5oaW50cywgbC5mbGFncywgbC50cmFuc2Zvcm0sIGwuYmxlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgIGwuc291cmNlQ3JvcC5sZWZ0LCBsLnNvdXJjZUNyb3AudG9wLCBsLnNvdXJjZUNyb3AucmlnaHQsIGwuc291cmNlQ3JvcC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgIGwuZGlzcGxheUZyYW1lLmxlZnQsIGwuZGlzcGxheUZyYW1lLnRvcCwgbC5kaXNwbGF5RnJhbWUucmlnaHQsIGwuZGlzcGxheUZyYW1lLmJvdHRvbSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWU5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICisjZGVmaW5lIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIEhXQ29tcG9zZXIKK3sKK3B1YmxpYzoKKworICAgIEhXQ29tcG9zZXIoKTsKKyAgICB+SFdDb21wb3NlcigpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICAvLyB0ZWxscyB0aGUgSEFMIHdoYXQgdGhlIGZyYW1lYnVmZmVyIGlzCisgICAgdm9pZCBzZXRGcmFtZUJ1ZmZlcihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXIpOworCisgICAgLy8gY3JlYXRlIGEgd29yayBsaXN0IGZvciBudW1MYXllcnMgbGF5ZXIKKyAgICBzdGF0dXNfdCBjcmVhdGVXb3JrTGlzdChzaXplX3QgbnVtTGF5ZXJzKTsKKworICAgIC8vIEFza3MgdGhlIEhBTCB3aGF0IGl0IGNhbiBkbworICAgIHN0YXR1c190IHByZXBhcmUoKSBjb25zdDsKKworICAgIC8vIGNvbW1pdHMgdGhlIGxpc3QKKyAgICBzdGF0dXNfdCBjb21taXQoKSBjb25zdDsKKworICAgIC8vIHJlbGVhc2UgaGFyZHdhcmUgcmVzb3VyY2VzCisgICAgc3RhdHVzX3QgcmVsZWFzZSgpIGNvbnN0OworCisgICAgc2l6ZV90IGdldE51bUxheWVycygpIGNvbnN0OworICAgIGh3Y19sYXllcl90KiBnZXRMYXllcnMoKSBjb25zdDsKKworICAgIC8vIGZvciBkZWJ1Z2dpbmcKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCYgb3V0LCBjaGFyKiBzY3JhdGNoLCBzaXplX3QgU0laRSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgaHdfbW9kdWxlX3QgY29uc3QqICAgICAgbU1vZHVsZTsKKyAgICBod2NfY29tcG9zZXJfZGV2aWNlX3QqICBtSHdjOworICAgIGh3Y19sYXllcl9saXN0X3QqICAgICAgIG1MaXN0OworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1DYXBhY2l0eTsKKyAgICBod2NfZGlzcGxheV90ICAgICAgICAgICBtRHB5OworICAgIGh3Y19zdXJmYWNlX3QgICAgICAgICAgIG1TdXI7Cit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKaW5kZXggYTA2MGQzMS4uZmI3NjcyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgIkxheWVyLmgiCiAjaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCisjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaCIKIAogCiAjZGVmaW5lIERFQlVHX1JFU0laRSAgICAwCkBAIC0xODEsNiArMTgyLDYyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIExheWVyOjpzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCkKK3sKKyAgICBod2NsLT5jb21wb3NpdGlvblR5cGUgPSBIV0NfRlJBTUVCVUZGRVI7CisgICAgaHdjbC0+aGludHMgPSAwOworICAgIGh3Y2wtPmZsYWdzID0gMDsKKyAgICBod2NsLT50cmFuc2Zvcm0gPSAwOworICAgIGh3Y2wtPmJsZW5kaW5nID0gSFdDX0JMRU5ESU5HX05PTkU7CisKKyAgICAvLyB3ZSBjYW4ndCBkbyBhbHBoYS1mYWRlIHdpdGggdGhlIGh3YyBIQUwKKyAgICBjb25zdCBTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7CisgICAgaWYgKHMuYWxwaGEgPCAweEZGKSB7CisgICAgICAgIGh3Y2wtPmZsYWdzID0gSFdDX1NLSVBfTEFZRVI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSBjYW4gb25seSBoYW5kbGUgc2ltcGxlIHRyYW5zZm9ybWF0aW9uCisgICAgaWYgKG1PcmllbnRhdGlvbiAmIFRyYW5zZm9ybTo6Uk9UX0lOVkFMSUQpIHsKKyAgICAgICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGh3Y2wtPnRyYW5zZm9ybSA9IG1PcmllbnRhdGlvbjsKKworICAgIGlmIChuZWVkc0JsZW5kaW5nKCkpIHsKKyAgICAgICAgaHdjbC0+YmxlbmRpbmcgPSBtUHJlbXVsdGlwbGllZEFscGhhID8KKyAgICAgICAgICAgICAgICBIV0NfQkxFTkRJTkdfUFJFTVVMVCA6IEhXQ19CTEVORElOR19DT1ZFUkFHRTsKKyAgICB9CisKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUubGVmdCAgID0gbVRyYW5zZm9ybWVkQm91bmRzLmxlZnQ7CisgICAgaHdjbC0+ZGlzcGxheUZyYW1lLnRvcCAgICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy50b3A7CisgICAgaHdjbC0+ZGlzcGxheUZyYW1lLnJpZ2h0ICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy5yaWdodDsKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUuYm90dG9tID0gbVRyYW5zZm9ybWVkQm91bmRzLmJvdHRvbTsKKworICAgIGh3Y2wtPnZpc2libGVSZWdpb25TY3JlZW4ucmVjdHMgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod2NfcmVjdF90IGNvbnN0ICo+KAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlUmVnaW9uU2NyZWVuLmdldEFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZod2NsLT52aXNpYmxlUmVnaW9uU2NyZWVuLm51bVJlY3RzKSk7Cit9CisKK3ZvaWQgTGF5ZXI6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIHRoaXMgc2l0dWF0aW9uIGNhbiBoYXBwZW4gaWYgd2UgcmFuIG91dCBvZiBtZW1vcnkgZm9yIGluc3RhbmNlLgorICAgICAgICAvLyBub3QgbXVjaCB3ZSBjYW4gZG8uIGNvbnRpbnVlIHRvIHVzZSB3aGF0ZXZlciB0ZXh0dXJlIHdhcyBib3VuZAorICAgICAgICAvLyB0byB0aGlzIGNvbnRleHQuCisgICAgICAgIGh3Y2wtPmhhbmRsZSA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaHdjbC0+aGFuZGxlID0gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihidWZmZXItPmhhbmRsZSk7CisgICAgLy8gVE9ETzogc2V0IHRoZSBjcm9wIHZhbHVlIHByb3Blcmx5CisgICAgaHdjbC0+c291cmNlQ3JvcC5sZWZ0ICAgPSAwOworICAgIGh3Y2wtPnNvdXJjZUNyb3AudG9wICAgID0gMDsKKyAgICBod2NsLT5zb3VyY2VDcm9wLnJpZ2h0ICA9IGJ1ZmZlci0+d2lkdGg7CisgICAgaHdjbC0+c291cmNlQ3JvcC5ib3R0b20gPSBidWZmZXItPmhlaWdodDsKK30KKwogdm9pZCBMYXllcjo6cmVsb2FkVGV4dHVyZShjb25zdCBSZWdpb24mIGRpcnR5KQogewogICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CkBAIC0zMjEsNiArMzc4LDcgQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgICAgICAvLyB6ZXJvIG1lYW5zIGRlZmF1bHQKKyAgICAgICAgY29uc3QgYm9vbCBmaXhlZFNpemUgPSByZXFXaWR0aCAmJiByZXFIZWlnaHQ7CiAgICAgICAgIGlmICghcmVxRm9ybWF0KSByZXFGb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBpZiAoIXJlcVdpZHRoKSAgcmVxV2lkdGggPSBtV2lkdGg7CiAgICAgICAgIGlmICghcmVxSGVpZ2h0KSByZXFIZWlnaHQgPSBtSGVpZ2h0OwpAQCAtMzM0LDYgKzM5Miw3IEBACiAgICAgICAgICAgICBtUmVxV2lkdGggID0gcmVxV2lkdGg7CiAgICAgICAgICAgICBtUmVxSGVpZ2h0ID0gcmVxSGVpZ2h0OwogICAgICAgICAgICAgbVJlcUZvcm1hdCA9IHJlcUZvcm1hdDsKKyAgICAgICAgICAgIG1GaXhlZFNpemUgPSBmaXhlZFNpemU7CiAKICAgICAgICAgICAgIGxjYmxrLT5yZWFsbG9jYXRlQWxsRXhjZXB0KGluZGV4KTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmgKaW5kZXggMjYzYzM3Mi4uY2FhNmQxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCkBAIC02OCw2ICs2OCw4IEBACiAgICAgYm9vbCBpc0ZpeGVkU2l6ZSgpIGNvbnN0OwogCiAgICAgLy8gTGF5ZXJCYXNlIGludGVyZmFjZQorICAgIHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCk7CisgICAgdmlydHVhbCB2b2lkIHNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCk7CiAgICAgdmlydHVhbCB2b2lkIGRyYXdGb3JTcmVlblNob3QoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgb25EcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3Q7CiAgICAgdmlydHVhbCB1aW50MzJfdCBkb1RyYW5zYWN0aW9uKHVpbnQzMl90IHRyYW5zYWN0aW9uRmxhZ3MpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKaW5kZXggNzU4YjQwOC4uMTQxOTFjYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCkBAIC0zMDksNiArMzA5LDE1IEBACiAgICAgfQogfQogCit2b2lkIExheWVyQmFzZTo6c2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpIHsKKyAgICBod2NsLT5mbGFncyB8PSBIV0NfU0tJUF9MQVlFUjsKK30KKwordm9pZCBMYXllckJhc2U6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIGh3Y2wtPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKKyAgICBod2NsLT5oYW5kbGUgPSBOVUxMOworfQorCiB2b2lkIExheWVyQmFzZTo6ZHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0CiB7CiAgICAgLy8gcmVzZXQgR0wgc3RhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKaW5kZXggZDY4OGY2NS4uYmRlZTA1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKQEAgLTM1LDYgKzM1LDggQEAKIAogI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KIAorI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KKwogI2luY2x1ZGUgIlRyYW5zZm9ybS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xMDgsNiArMTEwLDEwIEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuICJMYXllckJhc2UiOyB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpOworCisgICAgdmlydHVhbCB2b2lkIHNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCk7CisKICAgICAvKioKICAgICAgKiBkcmF3IC0gcGVyZm9ybXMgc29tZSBnbG9iYWwgY2xpcHBpbmcgb3B0aW1pemF0aW9ucwogICAgICAqIGFuZCBjYWxscyBvbkRyYXcoKS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01lc3NhZ2VRdWV1ZS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9NZXNzYWdlUXVldWUuY3BwCmluZGV4IGQ2NjhlODguLjRmYjFlNjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01lc3NhZ2VRdWV1ZS5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTWVzc2FnZVF1ZXVlLmNwcApAQCAtOTEsMTcgKzkxLDIxIEBACiAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlcy5yZW1vdmUoY3VyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0Pj0wICYmIHRpbWVvdXRUaW1lIDwgbm93KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHRpbWVkLW91dCwgcmV0dXJuIGEgTlVMTCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuZXh0RXZlbnRUaW1lID0gcmVzdWx0LT53aGVuOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICh0aW1lb3V0ID49IDAgJiYgbmV4dEV2ZW50VGltZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobmV4dEV2ZW50VGltZSA+IHRpbWVvdXRUaW1lKSB7CisgICAgICAgICAgICBpZiAodGltZW91dCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXRUaW1lIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIHRpbWVkLW91dCwgcmV0dXJuIGEgTlVMTCBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV4dEV2ZW50VGltZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRFdmVudFRpbWUgPiB0aW1lb3V0VGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50VGltZSA9IHRpbWVvdXRUaW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50VGltZSA9IHRpbWVvdXRUaW1lOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAppbmRleCBlNWU4N2M2Li5lNmJkZmQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwCkBAIC01Myw2ICs1Myw3IEBACiAjaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKIAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKKyNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIgogCiAvKiBpZGVhbGx5IEFJRF9HUkFQSElDUyB3b3VsZCBiZSBpbiBhIHNlbWktcHVibGljIGhlYWRlcgogICogb3IgdGhlcmUgd291bGQgYmUgYSB3YXkgdG8gbWFwIGEgdXNlci9ncm91cCBuYW1lIHRvIGl0cyBpZApAQCAtNzgsMTIgKzc5LDE0IEBACiAgICAgICAgIG1SZWFkRnJhbWVidWZmZXIoImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0ZSQU1FX0JVRkZFUiIpLAogICAgICAgICBtRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSwKICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHkoZmFsc2UpLAorICAgICAgICBtSHdXb3JrTGlzdERpcnR5KGZhbHNlKSwKICAgICAgICAgbURlZmVyUmVsZWFzZUNvbnNvbGUoZmFsc2UpLAogICAgICAgICBtRnJlZXplRGlzcGxheShmYWxzZSksCiAgICAgICAgIG1GcmVlemVDb3VudCgwKSwKICAgICAgICAgbUZyZWV6ZURpc3BsYXlUaW1lKDApLAogICAgICAgICBtRGVidWdSZWdpb24oMCksCiAgICAgICAgIG1EZWJ1Z0JhY2tncm91bmQoMCksCisgICAgICAgIG1EZWJ1Z0Rpc2FibGVIV0MoMCksCiAgICAgICAgIG1EZWJ1Z0luU3dhcEJ1ZmZlcnMoMCksCiAgICAgICAgIG1MYXN0U3dhcEJ1ZmZlclRpbWUoMCksCiAgICAgICAgIG1EZWJ1Z0luVHJhbnNhY3Rpb24oMCksCkBAIC0xNjUsNyArMTY4LDcgQEAKIHsKICAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKICAgICBjb25zdCBuc2Vjc190IGR1cmF0aW9uID0gbm93IC0gbUJvb3RUaW1lOwotICAgIExPR0koIkJvb3QgaXMgZmluaXNoZWQgKCVsZCBtcykiLCBsb25nKG5zMm1zKGR1cmF0aW9uKSkgKTsgIAorICAgIExPR0koIkJvb3QgaXMgZmluaXNoZWQgKCVsZCBtcykiLCBsb25nKG5zMm1zKGR1cmF0aW9uKSkgKTsKICAgICBtQm9vdEZpbmlzaGVkID0gdHJ1ZTsKICAgICBwcm9wZXJ0eV9zZXQoImN0bC5zdG9wIiwgImJvb3RhbmltIik7CiB9CkBAIC0yMDEsMTAgKzIwNCwxMCBAQAogICAgIG1TZXJ2ZXJIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKDQwOTYsCiAgICAgICAgICAgICBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZLCAiU3VyZmFjZUZsaW5nZXIgcmVhZC1vbmx5IGhlYXAiKTsKICAgICBMT0dFX0lGKG1TZXJ2ZXJIZWFwPT0wLCAiY2FuJ3QgY3JlYXRlIHNoYXJlZCBtZW1vcnkgZGVhbGVyIik7Ci0gICAgCisKICAgICBtU2VydmVyQ2JsayA9IHN0YXRpY19jYXN0PHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QqPihtU2VydmVySGVhcC0+Z2V0QmFzZSgpKTsKICAgICBMT0dFX0lGKG1TZXJ2ZXJDYmxrPT0wLCAiY2FuJ3QgZ2V0IHRvIHNoYXJlZCBjb250cm9sIGJsb2NrJ3MgYWRkcmVzcyIpOwotICAgIAorCiAgICAgbmV3KG1TZXJ2ZXJDYmxrKSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190OwogCiAgICAgLy8gaW5pdGlhbGl6ZSBwcmltYXJ5IHNjcmVlbgpAQCAtMjMzLDcgKzIzNiw3IEBACiAKICAgICAvLyBJbml0aWFsaXplIE9wZW5HTHxFUwogICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgNCk7Ci0gICAgZ2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgNCk7IAorICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOwogICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKICAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwogICAgIGdsU2hhZGVNb2RlbChHTF9GTEFUKTsKQEAgLTI2Nyw3ICsyNzAsNyBAQAogCiAgICAgLy8gc3RhcnQgYm9vdCBhbmltYXRpb24KICAgICBwcm9wZXJ0eV9zZXQoImN0bC5zdGFydCIsICJib290YW5pbSIpOwotICAgIAorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0zNzAsNiArMzczLDExIEBACiAgICAgLy8gcG9zdCBzdXJmYWNlcyAoaWYgbmVlZGVkKQogICAgIGhhbmRsZVBhZ2VGbGlwKCk7CiAKKyAgICBpZiAoVU5MSUtFTFkobUh3V29ya0xpc3REaXJ0eSkpIHsKKyAgICAgICAgLy8gYnVpbGQgdGhlIGgvdyB3b3JrIGxpc3QKKyAgICAgICAgaGFuZGxlV29ya0xpc3QoKTsKKyAgICB9CisKICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7CiAgICAgaWYgKExJS0VMWShody5jYW5EcmF3KCkgJiYgIWlzRnJvemVuKCkpKSB7CiAgICAgICAgIC8vIHJlcGFpbnQgdGhlIGZyYW1lYnVmZmVyIChpZiBuZWVkZWQpCkBAIC0zODQsMTMgKzM5MiwxMiBAQAogICAgICAgICBsb2dnZXIubG9nKEdyYXBoaWNMb2c6OlNGX0NPTVBPU0lUSU9OX0NPTVBMRVRFLCBpbmRleCk7CiAgICAgICAgIGh3LmNvbXBvc2l0aW9uQ29tcGxldGUoKTsKIAotICAgICAgICAvLyByZWxlYXNlIHRoZSBjbGllbnRzIGJlZm9yZSB3ZSBmbGlwICgnY2F1c2UgZmxpcCBtaWdodCBibG9jaykKLSAgICAgICAgbG9nZ2VyLmxvZyhHcmFwaGljTG9nOjpTRl9VTkxPQ0tfQ0xJRU5UUywgaW5kZXgpOwotICAgICAgICB1bmxvY2tDbGllbnRzKCk7Ci0KICAgICAgICAgbG9nZ2VyLmxvZyhHcmFwaGljTG9nOjpTRl9TV0FQX0JVRkZFUlMsIGluZGV4KTsKICAgICAgICAgcG9zdEZyYW1lYnVmZmVyKCk7CiAKKyAgICAgICAgbG9nZ2VyLmxvZyhHcmFwaGljTG9nOjpTRl9VTkxPQ0tfQ0xJRU5UUywgaW5kZXgpOworICAgICAgICB1bmxvY2tDbGllbnRzKCk7CisKICAgICAgICAgbG9nZ2VyLmxvZyhHcmFwaGljTG9nOjpTRl9SRVBBSU5UX0RPTkUsIGluZGV4KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBwcmV0ZW5kIHdlIGRpZCB0aGUgcG9zdApAQCAtNDU1LDYgKzQ2Miw3IEBACiAgICAgICAgIGhhbmRsZVRyYW5zYWN0aW9uTG9ja2VkKHRyYW5zYWN0aW9uRmxhZ3MsIGRpdGNoZWRMYXllcnMpOwogICAgICAgICBtTGFzdFRyYW5zYWN0aW9uVGltZSA9IHN5c3RlbVRpbWUoKSAtIG5vdzsKICAgICAgICAgbURlYnVnSW5UcmFuc2FjdGlvbiA9IDA7CisgICAgICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOwogICAgICAgICAvLyBoZXJlIHRoZSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjb21taXR0ZWQKICAgICB9CiAKQEAgLTQ2Miw2ICs0NzAsNyBAQAogICAgICAqIENsZWFuLXVwIGFsbCBsYXllcnMgdGhhdCB3ZW50IGF3YXkKICAgICAgKiAoZG8gdGhpcyB3aXRob3V0IHRoZSBsb2NrIGhlbGQpCiAgICAgICovCisKICAgICBjb25zdCBzaXplX3QgY291bnQgPSBkaXRjaGVkTGF5ZXJzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGlmIChkaXRjaGVkTGF5ZXJzW2ldICE9IDApIHsKQEAgLTY2NSw3ICs2NzQsNyBAQAogCiAgICAgICAgIC8vIFVwZGF0ZSBhYm92ZU9wYXF1ZUxheWVycyBmb3IgbmV4dCAobG93ZXIpIGxheWVyCiAgICAgICAgIGFib3ZlT3BhcXVlTGF5ZXJzLm9yU2VsZihvcGFxdWVSZWdpb24pOwotICAgICAgICAKKwogICAgICAgICAvLyBTdG9yZSB0aGUgdmlzaWJsZSByZWdpb24gaXMgc2NyZWVuIHNwYWNlCiAgICAgICAgIGxheWVyLT5zZXRWaXNpYmxlUmVnaW9uKHZpc2libGVSZWdpb24pOwogICAgICAgICBsYXllci0+c2V0Q292ZXJlZFJlZ2lvbihjb3ZlcmVkUmVnaW9uKTsKQEAgLTY5NSw4ICs3MDQsOCBAQAogdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlUGFnZUZsaXAoKQogewogICAgIGJvb2wgdmlzaWJsZVJlZ2lvbnMgPSBtVmlzaWJsZVJlZ2lvbnNEaXJ0eTsKLSAgICBMYXllclZlY3RvciYgY3VycmVudExheWVycyA9IGNvbnN0X2Nhc3Q8TGF5ZXJWZWN0b3ImPigKLSAgICAgICAgICAgIG1EcmF3aW5nU3RhdGUubGF5ZXJzU29ydGVkQnlaKTsKKyAgICBMYXllclZlY3RvciYgY3VycmVudExheWVycygKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8TGF5ZXJWZWN0b3ImPihtRHJhd2luZ1N0YXRlLmxheWVyc1NvcnRlZEJ5WikpOwogICAgIHZpc2libGVSZWdpb25zIHw9IGxvY2tQYWdlRmxpcChjdXJyZW50TGF5ZXJzKTsKIAogICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3ID0gZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpOwpAQCAtNzE5LDYgKzcyOCw3IEBACiAKICAgICAgICAgICAgIG1Xb3JtaG9sZVJlZ2lvbiA9IHNjcmVlblJlZ2lvbi5zdWJ0cmFjdChvcGFxdWVSZWdpb24pOwogICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOwogICAgICAgICB9CiAKICAgICB1bmxvY2tQYWdlRmxpcChjdXJyZW50TGF5ZXJzKTsKQEAgLTc0OSw2ICs3NTksMjQgQEAKICAgICB9CiB9CiAKK3ZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVdvcmtMaXN0KCkKK3sKKyAgICBtSHdXb3JrTGlzdERpcnR5ID0gZmFsc2U7CisgICAgSFdDb21wb3NlciYgaHdjKGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKS5nZXRId0NvbXBvc2VyKCkpOworICAgIGlmIChod2MuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxMYXllckJhc2U+ID4mIGN1cnJlbnRMYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOworICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKKyAgICAgICAgaHdjLmNyZWF0ZVdvcmtMaXN0KGNvdW50KTsKKyAgICAgICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBjdXIgJiYgaTxjb3VudCA7IGkrKykgeworICAgICAgICAgICAgY3VycmVudExheWVyc1tpXS0+c2V0R2VvbWV0cnkoJmN1cltpXSk7CisgICAgICAgICAgICBpZiAobURlYnVnRGlzYWJsZUhXQykgeworICAgICAgICAgICAgICAgIGN1cltpXS5jb21wb3NpdGlvblR5cGUgPSBIV0NfRlJBTUVCVUZGRVI7CisgICAgICAgICAgICAgICAgY3VyW2ldLmZsYWdzIHw9IEhXQ19TS0lQX0xBWUVSOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQogCiB2b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVSZXBhaW50KCkKIHsKQEAgLTc2OSw4ICs3OTcsOCBAQAogICAgIGdsTG9hZElkZW50aXR5KCk7CiAKICAgICB1aW50MzJfdCBmbGFncyA9IGh3LmdldEZsYWdzKCk7Ci0gICAgaWYgKChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6U1dBUF9SRUNUQU5HTEUpIHx8IAotICAgICAgICAoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OkJVRkZFUl9QUkVTRVJWRUQpKSAKKyAgICBpZiAoKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpTV0FQX1JFQ1RBTkdMRSkgfHwKKyAgICAgICAgKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpCVUZGRVJfUFJFU0VSVkVEKSkKICAgICB7CiAgICAgICAgIC8vIHdlIGNhbiByZWRyYXcgb25seSB3aGF0J3MgZGlydHksIGJ1dCBzaW5jZSBTV0FQX1JFQ1RBTkdMRSBvbmx5CiAgICAgICAgIC8vIHRha2VzIGEgcmVjdGFuZ2xlLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0byB1cGRhdGUgdGhhdCB3aG9sZQpAQCAtODEzLDkgKzg0MSw3MyBAQAogICAgICAgICAvLyBkcmF3IHNvbWV0aGluZy4uLgogICAgICAgICBkcmF3V29ybWhvbGUoKTsKICAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKICAgICBjb25zdCBWZWN0b3I8IHNwPExheWVyQmFzZT4gPiYgbGF5ZXJzKG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaKTsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBsYXllcnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyArK2kpIHsKKyAgICBzaXplX3QgY291bnQgPSBsYXllcnMuc2l6ZSgpOworCisgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOworICAgIEhXQ29tcG9zZXImIGh3Yyhody5nZXRId0NvbXBvc2VyKCkpOworICAgIGh3Y19sYXllcl90KiBjb25zdCBjdXIoaHdjLmdldExheWVycygpKTsKKworICAgIExPR0VfSUYoY3VyICYmIGh3Yy5nZXROdW1MYXllcnMoKSAhPSBjb3VudCwKKyAgICAgICAgICAgICJIQUwgbnVtYmVyIG9mIGxheWVycyAoJWQpIGRvZXNuJ3QgbWF0Y2ggc3VyZmFjZWZsaW5nZXIgKCVkKSIsCisgICAgICAgICAgICBod2MuZ2V0TnVtTGF5ZXJzKCksIGNvdW50KTsKKworICAgIC8vIGp1c3QgdG8gYmUgZXh0cmEtc2FmZSwgdXNlIHRoZSBzbWFsbGVzdCBjb3VudAorICAgIGlmIChod2MuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY291bnQgPSBjb3VudCA8IGh3Yy5nZXROdW1MYXllcnMoKSA/IGNvdW50IDogaHdjLmdldE51bUxheWVycygpOworICAgIH0KKworICAgIC8qCisgICAgICogIHVwZGF0ZSB0aGUgcGVyLWZyYW1lIGgvdyBjb21wb3NlciBkYXRhIGZvciBlYWNoIGxheWVyCisgICAgICogIGFuZCBidWlsZCB0aGUgdHJhbnNwYXJlbnQgcmVnaW9uIG9mIHRoZSBGQgorICAgICAqLworICAgIFJlZ2lvbiB0cmFuc3BhcmVudDsKKyAgICBpZiAoY3VyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGxheWVyc1tpXSk7CisgICAgICAgICAgICBsYXllci0+c2V0UGVyRnJhbWVEYXRhKCZjdXJbaV0pOworICAgICAgICAgICAgaWYgKGN1cltpXS5oaW50cyAmIEhXQ19ISU5UX0NMRUFSX0ZCKSB7CisgICAgICAgICAgICAgICAgaWYgKCEobGF5ZXItPm5lZWRzQmxlbmRpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbnQub3JTZWxmKGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gaHdjLnByZXBhcmUoKTsKKyAgICAgICAgTE9HRV9JRihlcnIsICJIV0NvbXBvc2VyOjpwcmVwYXJlIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoLWVycikpOworICAgIH0KKworICAgIC8qCisgICAgICogIGNsZWFyIHRoZSBhcmVhIG9mIHRoZSBGQiB0aGF0IG5lZWQgdG8gYmUgdHJhbnNwYXJlbnQKKyAgICAgKi8KKyAgICB0cmFuc3BhcmVudC5hbmRTZWxmKGRpcnR5KTsKKyAgICBpZiAoIXRyYW5zcGFyZW50LmlzRW1wdHkoKSkgeworICAgICAgICBnbENsZWFyQ29sb3IoMCwwLDAsMCk7CisgICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0cmFuc3BhcmVudC5iZWdpbigpOworICAgICAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IHRyYW5zcGFyZW50LmVuZCgpOworICAgICAgICBjb25zdCBpbnQzMl90IGhlaWdodCA9IGh3LmdldEhlaWdodCgpOworICAgICAgICB3aGlsZSAoaXQgIT0gZW5kKSB7CisgICAgICAgICAgICBjb25zdCBSZWN0JiByKCppdCsrKTsKKyAgICAgICAgICAgIGNvbnN0IEdMaW50IHN5ID0gaGVpZ2h0IC0gKHIudG9wICsgci5oZWlnaHQoKSk7CisgICAgICAgICAgICBnbFNjaXNzb3Ioci5sZWZ0LCBzeSwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKKyAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogYW5kIHRoZW4sIHJlbmRlciB0aGUgbGF5ZXJzIHRhcmdldGVkIGF0IHRoZSBmcmFtZWJ1ZmZlcgorICAgICAqLworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKKyAgICAgICAgaWYgKGN1cikgeworICAgICAgICAgICAgaWYgKChjdXJbaV0uY29tcG9zaXRpb25UeXBlICE9IEhXQ19GUkFNRUJVRkZFUikgJiYKKyAgICAgICAgICAgICAgICAhKGN1cltpXS5mbGFncyAmIEhXQ19TS0lQX0xBWUVSKSkgeworICAgICAgICAgICAgICAgIC8vIHNraXAgbGF5ZXJzIGhhbmRsZWQgYnkgdGhlIEhBTAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKICAgICAgICAgY29uc3QgUmVnaW9uIGNsaXAoZGlydHkuaW50ZXJzZWN0KGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuKSk7CiAgICAgICAgIGlmICghY2xpcC5pc0VtcHR5KCkpIHsKQEAgLTEwNTQsNyArMTE0Niw3IEBACiAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmbVRyYW5zYWN0aW9uQ291bnQpID09IDEpIHsKICAgICAgICAgc2lnbmFsRXZlbnQoKTsKIAotICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uIHdpdGggYSByZXNpemUsIHdhaXQgZm9yIGl0IHRvIAorICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uIHdpdGggYSByZXNpemUsIHdhaXQgZm9yIGl0IHRvCiAgICAgICAgIC8vIHRha2UgZWZmZWN0IGJlZm9yZSByZXR1cm5pbmcuCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3RhdGVMb2NrKTsKICAgICAgICAgd2hpbGUgKG1SZXNpemVUcmFuc2F0aW9uUGVuZGluZykgewpAQCAtMTA5OCw3ICsxMTkwLDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWludCBTdXJmYWNlRmxpbmdlcjo6c2V0T3JpZW50YXRpb24oRGlzcGxheUlEIGRweSwgCitpbnQgU3VyZmFjZUZsaW5nZXI6OnNldE9yaWVudGF0aW9uKERpc3BsYXlJRCBkcHksCiAgICAgICAgIGludCBvcmllbnRhdGlvbiwgdWludDMyX3QgZmxhZ3MpCiB7CiAgICAgaWYgKFVOTElLRUxZKHVpbnQzMl90KGRweSkgPj0gRElTUExBWV9DT1VOVCkpCkBAIC0xMTMxLDE0ICsxMjIzLDE3IEBACiAgICAgICAgICAgICAgICAgaW50KHcpLCBpbnQoaCkpOwogICAgICAgICByZXR1cm4gc3VyZmFjZUhhbmRsZTsKICAgICB9Ci0gICAgCisKICAgICAvL0xPR0QoImNyZWF0ZVN1cmZhY2UgZm9yIHBpZCAlZCAoJWQgeCAlZCkiLCBwaWQsIHcsIGgpOwogICAgIHNwPExheWVyPiBub3JtYWxMYXllcjsKICAgICBzd2l0Y2ggKGZsYWdzICYgZUZYU3VyZmFjZU1hc2spIHsKICAgICAgICAgY2FzZSBlRlhTdXJmYWNlTm9ybWFsOgorI2lmIEhBU19QVVNIX0JVRkZFUlMKICAgICAgICAgICAgIGlmIChVTkxJS0VMWShmbGFncyAmIGVQdXNoQnVmZmVycykpIHsKICAgICAgICAgICAgICAgICBsYXllciA9IGNyZWF0ZVB1c2hCdWZmZXJzU3VyZmFjZShjbGllbnQsIGQsIHcsIGgsIGZsYWdzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5vcm1hbExheWVyID0gY3JlYXRlTm9ybWFsU3VyZmFjZShjbGllbnQsIGQsIHcsIGgsIGZsYWdzLCBmb3JtYXQpOwogICAgICAgICAgICAgICAgIGxheWVyID0gbm9ybWFsTGF5ZXI7CiAgICAgICAgICAgICB9CkBAIC0xMTU3LDcgKzEyNTIsNyBAQAogICAgICAgICBzc2l6ZV90IHRva2VuID0gYWRkQ2xpZW50TGF5ZXIoY2xpZW50LCBsYXllcik7CiAKICAgICAgICAgc3VyZmFjZUhhbmRsZSA9IGxheWVyLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgIGlmIChzdXJmYWNlSGFuZGxlICE9IDApIHsgCisgICAgICAgIGlmIChzdXJmYWNlSGFuZGxlICE9IDApIHsKICAgICAgICAgICAgIHBhcmFtcy0+dG9rZW4gPSB0b2tlbjsKICAgICAgICAgICAgIHBhcmFtcy0+aWRlbnRpdHkgPSBzdXJmYWNlSGFuZGxlLT5nZXRJZGVudGl0eSgpOwogICAgICAgICAgICAgcGFyYW1zLT53aWR0aCA9IHc7CkBAIC0xMjQxLDcgKzEzMzYsNyBAQAogICAgIC8qCiAgICAgICogY2FsbGVkIGJ5IHRoZSB3aW5kb3cgbWFuYWdlciwgd2hlbiBhIHN1cmZhY2Ugc2hvdWxkIGJlIG1hcmtlZCBmb3IKICAgICAgKiBkZXN0cnVjdGlvbi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIFRoZSBzdXJmYWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudCBhbmQgZHJhd2luZyBsaXN0cywgYnV0IHBsYWNlZAogICAgICAqIGluIHRoZSBwdXJnYXRvcnkgcXVldWUsIHNvIGl0J3Mgbm90IGRlc3Ryb3llZCByaWdodC1hd2F5ICh3ZSBuZWVkCiAgICAgICogdG8gd2FpdCBmb3IgYWxsIGNsaWVudCdzIHJlZmVyZW5jZXMgdG8gZ28gYXdheSBmaXJzdCkuCkBAIC0xMjYyLDcgKzEzNTcsNyBAQAogc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OmRlc3Ryb3lTdXJmYWNlKGNvbnN0IHNwPExheWVyQmFzZUNsaWVudD4mIGxheWVyKQogewogICAgIC8vIGNhbGxlZCBieSB+SVN1cmZhY2UoKSB3aGVuIGFsbCByZWZlcmVuY2VzIGFyZSBnb25lCi0gICAgCisKICAgICBjbGFzcyBNZXNzYWdlRGVzdHJveVN1cmZhY2UgOiBwdWJsaWMgTWVzc2FnZUJhc2UgewogICAgICAgICBTdXJmYWNlRmxpbmdlciogZmxpbmdlcjsKICAgICAgICAgc3A8TGF5ZXJCYXNlQ2xpZW50PiBsYXllcjsKQEAgLTEyNzUsOSArMTM3MCw5IEBACiAgICAgICAgICAgICBsYXllci5jbGVhcigpOyAvLyBjbGVhciBpdCBvdXRzaWRlIG9mIHRoZSBsb2NrOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGZsaW5nZXItPm1TdGF0ZUxvY2spOwogICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIHJlbW92ZSB0aGUgbGF5ZXIgZnJvbSB0aGUgY3VycmVudCBsaXN0IC0tIGNoYW5jZXMgYXJlIHRoYXQgaXQncyAKLSAgICAgICAgICAgICAqIG5vdCBpbiB0aGUgbGlzdCBhbnl3YXksIGJlY2F1c2UgaXQgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkIAotICAgICAgICAgICAgICogYWxyZWFkeSB1cG9uIHJlcXVlc3Qgb2YgdGhlIGNsaWVudCAoZWc6IHdpbmRvdyBtYW5hZ2VyKS4gCisgICAgICAgICAgICAgKiByZW1vdmUgdGhlIGxheWVyIGZyb20gdGhlIGN1cnJlbnQgbGlzdCAtLSBjaGFuY2VzIGFyZSB0aGF0IGl0J3MKKyAgICAgICAgICAgICAqIG5vdCBpbiB0aGUgbGlzdCBhbnl3YXksIGJlY2F1c2UgaXQgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkCisgICAgICAgICAgICAgKiBhbHJlYWR5IHVwb24gcmVxdWVzdCBvZiB0aGUgY2xpZW50IChlZzogd2luZG93IG1hbmFnZXIpLgogICAgICAgICAgICAgICogSG93ZXZlciwgYSBidWdneSBjbGllbnQgY291bGQgaGF2ZSBub3QgZG9uZSB0aGF0LgogICAgICAgICAgICAgICogU2luY2Ugd2Uga25vdyB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGNsaWVudHMsIHdlIGRvbid0IG5lZWQKICAgICAgICAgICAgICAqIHRvIHVzZSB0aGUgcHVyZ2F0b3J5LgpAQCAtMTM5Miw3ICsxNDg3LDcgQEAKICAgICAgICAgfQogICAgICAgICBjb25zdCBib29sIGxvY2tlZChyZXRyeSA+PSAwKTsKICAgICAgICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgCisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCiAgICAgICAgICAgICAgICAgICAgICJTdXJmYWNlRmxpbmdlciBhcHBlYXJzIHRvIGJlIHVucmVzcG9uc2l2ZSwgIgogICAgICAgICAgICAgICAgICAgICAiZHVtcGluZyBhbnl3YXlzIChubyBsb2NrcyBoZWxkKVxuIik7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC0xNDM0LDYgKzE1MjksMTMgQEAKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgfQogCisgICAgICAgIEhXQ29tcG9zZXImIGh3Yyhody5nZXRId0NvbXBvc2VyKCkpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIGgvdyBjb21wb3NlciAlcyBhbmQgJXNcbiIsCisgICAgICAgICAgICAgICAgaHdjLmluaXRDaGVjaygpPT1OT19FUlJPUiA/ICJwcmVzZW50IiA6ICJub3QgcHJlc2VudCIsCisgICAgICAgICAgICAgICAgbURlYnVnRGlzYWJsZUhXQyA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGh3Yy5kdW1wKHJlc3VsdCwgYnVmZmVyLCBTSVpFKTsKKwogICAgICAgICBjb25zdCBHcmFwaGljQnVmZmVyQWxsb2NhdG9yJiBhbGxvYyhHcmFwaGljQnVmZmVyQWxsb2NhdG9yOjpnZXQoKSk7CiAgICAgICAgIGFsbG9jLmR1bXAocmVzdWx0KTsKIApAQCAtMTUwNyw2ICsxNjA5LDExIEBACiAgICAgICAgICAgICAgICAgbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICAgICAgbURlYnVnQmFja2dyb3VuZCA9IG4gPyAxIDogMDsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICBjYXNlIDEwMDg6ICAvLyB0b2dnbGUgdXNlIG9mIGh3IGNvbXBvc2VyCisgICAgICAgICAgICAgICAgbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICAgICAgbURlYnVnRGlzYWJsZUhXQyA9IG4gPyAxIDogMDsKKyAgICAgICAgICAgICAgICBtSHdXb3JrTGlzdERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2guLi4KICAgICAgICAgICAgIGNhc2UgMTAwNDp7IC8vIHJlcGFpbnQgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3RhdGVMb2NrKTsKICAgICAgICAgICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7CkBAIC0xODUxLDEyICsxOTU4LDE1IEBACiB7CiAgICAgaW50MzJfdCBuYW1lID0gTkFNRV9OT1RfRk9VTkQ7CiAgICAgc3A8TGF5ZXI+IGxheWVyKG1GbGluZ2VyLT5nZXRMYXllcihzdXIpKTsKLSAgICBpZiAobGF5ZXIgPT0gMCkgcmV0dXJuIG5hbWU7CisgICAgaWYgKGxheWVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQogCiAgICAgLy8gaWYgdGhpcyBsYXllciBhbHJlYWR5IGhhcyBhIHRva2VuLCBqdXN0IHJldHVybiBpdAogICAgIG5hbWUgPSBsYXllci0+Z2V0VG9rZW4oKTsKLSAgICBpZiAoKG5hbWUgPj0gMCkgJiYgKGxheWVyLT5nZXRDbGllbnQoKSA9PSB0aGlzKSkKKyAgICBpZiAoKG5hbWUgPj0gMCkgJiYgKGxheWVyLT5nZXRDbGllbnQoKSA9PSB0aGlzKSkgewogICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CiAKICAgICBuYW1lID0gMDsKICAgICBkbyB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaAppbmRleCBmMGExNjdiLi43MzJlNTdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKQEAgLTMwMyw2ICszMDMsNyBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlUGFnZUZsaXAoKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGxvY2tQYWdlRmxpcChjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycyk7CiAgICAgICAgICAgICB2b2lkICAgICAgICB1bmxvY2tQYWdlRmxpcChjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycyk7CisgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVXb3JrTGlzdCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlUmVwYWludCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgcG9zdEZyYW1lYnVmZmVyKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBjb21wb3NlU3VyZmFjZXMoY29uc3QgUmVnaW9uJiBkaXJ0eSk7CkBAIC0zODMsNiArMzg0LDcgQEAKICAgICAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRSZWdpb247CiAgICAgICAgICAgICAgICAgUmVnaW9uICAgICAgICAgICAgICAgICAgICAgIG1Xb3JtaG9sZVJlZ2lvbjsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHk7CisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Id1dvcmtMaXN0RGlydHk7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclJlbGVhc2VDb25zb2xlOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZXplRGlzcGxheTsKICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUZyZWV6ZUNvdW50OwpAQCAtMzkzLDYgKzM5NSw3IEBACiAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIGEgbG9jayBmb3IgdGhlc2UsIHdlIGRvbid0IGNhcmUKICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbURlYnVnUmVnaW9uOwogICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdCYWNrZ3JvdW5kOworICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdEaXNhYmxlSFdDOwogICAgICAgICAgICAgICAgIHZvbGF0aWxlIG5zZWNzX3QgICAgICAgICAgICBtRGVidWdJblN3YXBCdWZmZXJzOwogICAgICAgICAgICAgICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICBtTGFzdFN3YXBCdWZmZXJUaW1lOwogICAgICAgICAgICAgICAgIHZvbGF0aWxlIG5zZWNzX3QgICAgICAgICAgICBtRGVidWdJblRyYW5zYWN0aW9uOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGIwN2ExMGIuLjE4NmIzNDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsKQEAgLTcsOCArNywxMCBAQAogIyBJbmNsdWRlIGFsbCB0ZXN0IGphdmEgZmlsZXMuCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBlYXN5bW9ja2xpYgogCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyIHNlcnZpY2VzCisKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGcmFtZXdvcmtzU2VydmljZXNUZXN0cwogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDVjZTEwOWYuLmYxMTVmNDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDYgKzIzLDE5IEBACiAgICAgCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0JE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiLz4KKyAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0JE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIj4KKyAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIi8+CisgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlM2E4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIFRoaXMgdGVzdCBleGVyY2lzZXMgdGhlCisgKiB7QGxpbmsgY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZX0gYnkgbW9ja2luZyB0aGUKKyAqIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcn0gd2hpY2ggdGFsa3MgdG8gdG8gdGhlCisgKiBzZXJ2aWNlLiBUaGUgc2VydmljZSBpdHNlbGYgaXMgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgcGxhdGZvcm0uIE5vdGU6IFRlc3RpbmcKKyAqIHRoZSBzZXJ2aWNlIGluIGZ1bGwgaXNvbGF0aW9uIHdvdWxkIHJlcXVpcmUgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHdvcmsgZm9yCisgKiBtb2NraW5nIGFsbCBzeXN0ZW0gaW50ZXJhY3Rpb25zLiBJdCB3b3VsZCBhbHNvIHJlcXVpcmUgYSBsb3Qgb2YgbW9ja2luZyBjb2RlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHJlcXVpcmVkIGZvciBwZW5kaW5nIEJpbmRlciBjYWxscyBvciBldmVudCBwcm9jZXNzaW5nIHRvCisgICAgICogY29tcGxldGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX0JJTkRFUl9DQUxMID0gMTAwOworCisgICAgLyoqCisgICAgICogVGltZW91dCBpbiB3aGljaCB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIHN5c3RlbSB0byBzdGFydCB0aGUgbW9jaworICAgICAqIGFjY2Vzc2liaWxpdHkgc2VydmljZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyA9IDMwMDsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgdXNlZCBmb3IgdGVzdGluZyB0aGF0IGEgc2VydmljZSBpcyBub3RpZmllZCBvbmx5IHVwb24gYQorICAgICAqIG5vdGlmaWNhdGlvbiB0aW1lb3V0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9URVNUX05PVElGSUNBVElPTl9USU1FT1VUID0gMzAwOworCisgICAgLyoqCisgICAgICogVGhlIHBhY2thZ2UgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc1BhY2thZ2VOYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGludGVyZmFjZSB1c2VkIHRvIHRhbGsgdG8gdGhlIHRlc3RlZCBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1NYW5hZ2VyU2VydmljZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyLnNldENvbnRleHQoY29udGV4dCk7CisgICAgICAgIGlmIChzUGFja2FnZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgc1BhY2thZ2VOYW1lID0gY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCgpIHsKKyAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CisgICAgICAgIG1NYW5hZ2VyU2VydmljZSA9IElBY2Nlc3NpYmlsaXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGlCaW5kZXIpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2xpZW50X0FjY2Vzc2liaWxpdHlEaXNhYmxlZFRoZW5FbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCBmYWxzZSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgY2xpZW50IG1vY2sgaW5zdGFuY2UKKyAgICAgICAgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgbW9ja0NsaWVudCA9IG5ldyBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjbGllbnQgbXVzdCBiZSBkaXNhYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCk7CisKKyAgICAgICAgLy8gZW5hYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2xpZW50IG11c3QgYmUgZW5hYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2xpZW50X0FjY2Vzc2liaWxpdHlFbmFibGVkVGhlbkRpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGVuYWJsZSBhY2Nlc3NpYmlsaXR5IGJlZm9yZSByZWdpc3RlcmluZyB0aGUgY2xpZW50CisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBjbGllbnQgbW9jayBpbnN0YW5jZQorICAgICAgICBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBtb2NrQ2xpZW50ID0gbmV3IE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjbGllbnQgbXVzdCBiZSBlbmFibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBhY2Nlc3NpYmlsaXR5CisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCBmYWxzZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNsaWVudCBtdXN0IGJlIGRpc2FibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlc0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VJbnN0YWxsZWQgPSBmYWxzZTsKKworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGZpcnN0TW9ja1NlcnZpY2VDbGFzc05hbWUgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHNlY29uZE1vY2tTZXJ2aWNlQ2xhc3NOYW1lID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOworCisgICAgICAgIC8vIGxvb2sgZm9yIHRoZSB0d28gbW9jayBzZXJ2aWNlcworICAgICAgICBmb3IgKFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvIDogbU1hbmFnZXJTZXJ2aWNlLmdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdE1vY2tTZXJ2aWNlQ2xhc3NOYW1lLmVxdWFscyhzZXJ2aWNlSW5mby5uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZE1vY2tTZXJ2aWNlQ2xhc3NOYW1lLmVxdWFscyhzZXJ2aWNlSW5mby5uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIkZpcnN0IG1vY2sgc2VydmljZSBtdXN0IGJlIGluc3RhbGxlZCIsIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQpOworICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgbW9jayBzZXJ2aWNlIG11c3QgYmUgaW5zdGFsbGVkIiwgc2Vjb25kTW9ja1NlcnZpY2VJbnN0YWxsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90TWF0Y2hpbmdQYWNrYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhY2thZ2VOYW1lKCJuby5zZXJ2aWNlLnJlZ2lzdGVyZWQuZm9yLnRoaXMucGFja2FnZSIpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX05vdE1hdGNoaW5nRXZlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2VudEV2ZW50LnNldEV2ZW50VHlwZShBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90aWZpdmF0aW9uQWZ0ZXJUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgaW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gVElNRU9VVF9URVNUX05PVElGSUNBVElPTl9USU1FT1VUOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgZmlyc3QgZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZmlyc3RFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoZmlyc3RFdmVudCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgc2Vjb25kIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlY29uZEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZWNvbmRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLmV4cGVjdEV2ZW50KHNlY29uZEV2ZW50KTsKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudHMKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZmlyc3RFdmVudCk7CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlY29uZEV2ZW50KTsKKworICAgICAgICAvLyB3YWl0IGZvciAjc2VuZEFjY2Vzc2liaWxpdHlFdmVudCB0byByZWFjaCB0aGUgYmFja2luZyBzZXJ2aWNlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmljZS52ZXJpZnkoKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV2ZW50cyBtdXN0IGJlIGRpc3BhdGNoZWQgYmVmb3JlIHRoZSBleHBpcmF0aW9uIG9mIHRoZSBub3RpZmljYXRpb24gdGltZW91dC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgeworICAgICAgICAgICAgLyogZXhwZWN0ZWQgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjb25maWd1cmVkIG5vdGlmaWNhdGlvbiB0aW1lb3V0IHRvIGV4cGlyZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9URVNUX05PVElGSUNBVElPTl9USU1FT1VUKTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlX0RpZmZGZWVkYmFjaygpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBmaXJzdEluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19BVURJQkxFOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBzZWNvbmRJbmZvID0gTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIHNlY29uZEluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0hBUFRJQzsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhzZWNvbmRJbmZvKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGVfT25lRGVmYXVsdCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBmaXJzdEluZm8gPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIGZpcnN0SW5mby5mbGFncyA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZV9Ud29EZWZhdWx0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIHNlY29uZEluZm8gPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIHNlY29uZEluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RJbnRlcnJ1cHQoKTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UuZXhwZWN0SW50ZXJydXB0KCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLmludGVycnVwdCgpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGx5IHBvcHVsYXRlcyB0aGUge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gdG8gbWFyc2hhbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZW50RXZlbnQgVGhlIGV2ZW50IHRvIHBvcHVsYXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50KSB7CisgICAgICAgIHNlbnRFdmVudC5zZXRBZGRlZENvdW50KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0QmVmb3JlVGV4dCgiQmVmb3JlVGV4dCIpOworICAgICAgICBzZW50RXZlbnQuc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldENsYXNzTmFtZSgiZm9vLmJhci5iYXouQ2xhc3MiKTsKKyAgICAgICAgc2VudEV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbigiQ29udGVudERlc2NyaXB0aW9uIik7CisgICAgICAgIHNlbnRFdmVudC5zZXRDdXJyZW50SXRlbUluZGV4KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEV2ZW50VHlwZShBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUaW1lKDEwMDApOworICAgICAgICBzZW50RXZlbnQuc2V0RnJvbUluZGV4KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0RnVsbFNjcmVlbih0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEl0ZW1Db3VudCgxKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhY2thZ2VOYW1lKCJmb28uYmFyLmJheiIpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFyY2VsYWJsZURhdGEoTWVzc2FnZS5vYnRhaW4obnVsbCwgMSwgbnVsbCkpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFzc3dvcmQodHJ1ZSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRSZW1vdmVkQ291bnQoMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyBhIG1vY2sge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudH0uCisgICAgICovCisgICAgcHVibGljIGNsYXNzIE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGV4dGVuZHMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50LlN0dWIgeworICAgICAgICBib29sZWFuIG1Jc0VuYWJsZWQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgICAgIG1Jc0VuYWJsZWQgPSBlbmFibGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyBhY2Nlc3NpYmlsaXR5IGlzIGluIGEgZ2l2ZW4gc3RhdGUgYnkgd3JpdGluZyB0aGUgc3RhdGUgdG8gdGhlCisgICAgICogc2V0dGluZ3MgYW5kIHdhaXRpbmcgdW50aWwgdGhlIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlIHBpY2sgaXQgdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgaGFuZGxlIHRvIGFjY2VzcyB0aGUgc2V0dGluZ3MuCisgICAgICogQHBhcmFtIGVuYWJsZWQgVGhlIGFjY2Vzc2liaWxpdHkgc3RhdGUgdG8gd3JpdGUgdG8gdGhlIHNldHRpbmdzLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWQgPSAoU2V0dGluZ3MuU2VjdXJlLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsIDApID09IDEgPyB0cnVlIDogZmFsc2UpOworCisgICAgICAgIGlmIChpc0VuYWJsZWQgPT0gZW5hYmxlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELAorICAgICAgICAgICAgICAgIGVuYWJsZWQgPyAxIDogMCk7CisKKyAgICAgICAgLy8gd2FpdCB0aGUgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgdG8gcGljayB0aGUgY2hhbmdlIHVwCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoZSBvbmx5IHtAbGluayBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2V9cyB3aXRoIGdpdmVuIGNvbXBvbmVudAorICAgICAqIG5hbWVzIGFyZSBlbmFibGVkIGJ5IHdyaXRpbmcgdG8gdGhlIHN5c3RlbSBzZXR0aW5ncyBhbmQgd2FpdGluZyB1bnRpbCB0aGUKKyAgICAgKiBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSBwaWNrcyB0aGF0IHVwIG9yIHRoZQorICAgICAqIHtAbGluayAjVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVN9IGlzIGV4Y2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IGhhbmRsZSB0byBhY2Nlc3MgdGhlIHNldHRpbmdzLgorICAgICAqIEBwYXJhbSBmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZCBJZiB0aGUgZmlyc3QgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgZW5hYmxlZC4KKyAgICAgKiBAcGFyYW0gc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkIElmIHRoZSBzZWNvbmQgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgZW5hYmxlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBzb21lIG9mIHRoZSByZXF1ZXN0ZWQgZm9yIGVuYWJsaW5nIG1vY2sgc2VydmljZXMKKyAgICAgKiAgICAgICAgIGlzIG5vdCBwcm9wZXJseSBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIEV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gZmlyc3RNb2NrU2VydmljZUVuYWJsZWQsCisgICAgICAgICAgICBib29sZWFuIHNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBlbmFibGVkU2VydmljZXMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyk7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzZXJ2aWNlc1RvRW5hYmxlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VFbmFibGVkKSB7CisgICAgICAgICAgICBzZXJ2aWNlc1RvRW5hYmxlLmFwcGVuZChNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkKSB7CisgICAgICAgICAgICBzZXJ2aWNlc1RvRW5hYmxlLmFwcGVuZChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSkuYXBwZW5kKCI6Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VydmljZXNUb0VuYWJsZS5lcXVhbHMoZW5hYmxlZFNlcnZpY2VzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMsIHNlcnZpY2VzVG9FbmFibGUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgLy8gd2UgaGF2ZSBlbmFibGVkIHRoZSBzZXJ2aWNlcyBvZiBpbnRlcmVzdCBhbmQgbmVlZCB0byB3YWl0IHVudGlsIHRoZXkKKyAgICAgICAgLy8gYXJlIGluc3RhbnRpYXRlZCBhbmQgc3RhcnRlZCAoaWYgbmVlZGVkKSBhbmQgdGhlIHN5c3RlbSBiaW5kcyB0byB0aGVtCisgICAgICAgIGJvb2xlYW4gZmlyc3RNb2NrU2VydmljZU9LID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VPSyA9IGZhbHNlOworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgcG9sbGluZ0ludGVydmFsID0gVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMgLyA2OworCisgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMpICB7CisgICAgICAgICAgICBmaXJzdE1vY2tTZXJ2aWNlT0sgPSAhZmlyc3RNb2NrU2VydmljZUVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgfHwgKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UuaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkpOworCisgICAgICAgICAgICBzZWNvbmRNb2NrU2VydmljZU9LID0gIXNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICB8fCAoTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlLmlzU3lzdGVtQm91bmRBc0NsaWVudCgpKTsKKworICAgICAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VPSyAmJiBzZWNvbmRNb2NrU2VydmljZU9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAocG9sbGluZ0ludGVydmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJNb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMgbm90IHN0YXJ0ZWQgb3Igc3lzdGVtIG5vdCBib3VuZCBhcyBhIGNsaWVudDogIik7CisgICAgICAgIGlmICghZmlyc3RNb2NrU2VydmljZU9LKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZWNvbmRNb2NrU2VydmljZU9LKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXNzYWdlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdmVyaWZpZWQKKyAgICAgKiAod2hpY2ggaXMgaXQgaGFzIHJlY2VpdmVkIHRoZSBleHBlY3RlZCBtZXRob2QgY2FsbHMgd2l0aCBleHBlY3RlZAorICAgICAqIGFyZ3VtZW50cykgd2l0aGluIHRoZSB7QGxpbmsgI1RJTUVPVVRfQklOREVSX0NBTEx9LiBUaGUgdmVyaWZpZWQgc3RhdGUgaXMKKyAgICAgKiBjaGVja2VkIGJ5IHBvbGxpbmcgdXBvbiBzbWFsbCBpbnRlcnZhbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSB0byB2ZXJpZnkuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgdGhlIHZlcmlmaWNhdGlvbiBoYXMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIGFmdGVyIHRoZQorICAgICAqICAgICAgICAgICAgIHtAbGluayAjVElNRU9VVF9CSU5ERVJfQ0FMTH0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEV4Y2VwdGlvbiBsYXN0VmVyaWZ5RXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgbG9uZyBiZWdpblRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyBwb2xsVG1lb3V0ID0gVElNRU9VVF9CSU5ERVJfQ0FMTCAvIDU7CisKKyAgICAgICAgLy8gcG9sbCB1bnRpbCB0aGUgdGltZW91dCBoYXMgZWxhcHNlZAorICAgICAgICB3aGlsZSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBiZWdpblRpbWUgPCBUSU1FT1VUX0JJTkRFUl9DQUxMKSB7CisgICAgICAgICAgICAvLyBzbGVlcCBmaXJzdCBzaW5jZSBpbW1lZGlhdGUgY2FsbCB3aWxsIGFsd2F5cyBmYWlsCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChwb2xsVG1lb3V0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwb2xsIGZvciB2ZXJpZmljYXRpb24gYW5kIGlmIHRoaXMgZmFpbHMgc2F2ZSB0aGUgZXhjZXB0aW9uIGFuZAorICAgICAgICAgICAgLy8ga2VlcCBwb2xsaW5nCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZpY2UudmVyaWZ5KCk7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgc28gaXQgZG9lcyBub3QgYWNjZXB0IG1vcmUgZXZlbnRzCisgICAgICAgICAgICAgICAgc2VydmljZS5yZXNldCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbGFzdFZlcmlmeUV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZXNldCwgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZAorICAgICAgICBzZXJ2aWNlLnJlc2V0KCk7CisKKyAgICAgICAgLy8gYWx3YXlzIG5vdCBudWxsCisgICAgICAgIHRocm93IGxhc3RWZXJpZnlFeGNlcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyB0aGUgZmlyc3QgbW9jayB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXJ2aWNlIHtAbGluayBDb21wb25lbnROYW1lfSBmbGF0dGVuZWQgYXMgYSBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHNDb21wb25lbnROYW1lID0gbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgc1BhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdG8gdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzSW5zdGFuY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpIHsKKyAgICAgICAgICAgIHNJbnN0YW5jZSA9IHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBmaXJzdCBtb2NrIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXJ2aWNlIHtAbGluayBDb21wb25lbnROYW1lfSBmbGF0dGVuZWQgYXMgYSBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHNDb21wb25lbnROYW1lID0gbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgc1BhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNJbnN0YW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpIHsKKyAgICAgICAgICAgIHNJbnN0YW5jZSA9IHRoaXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmZWQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5jcmVhdGVTdHJpY3RNb2NrOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwb3J0TWF0Y2hlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlc2V0OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sudmVyaWZ5OworCitpbXBvcnQgb3JnLmVhc3ltb2NrLklBcmd1bWVudE1hdGNoZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIHdoaWNoIG1vY2tpbmcgdGhlIGJhY2tpbmcgc2VydmljZS4KKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHJlcXVpcmVkIGZvciBwZW5kaW5nIEJpbmRlciBjYWxscyBvciBldmVudCBwcm9jZXNzaW5nIHRvCisgICAgICogY29tcGxldGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfQklOREVSX0NBTEwgPSA1MDsKKworICAgIC8qKgorICAgICAqIFRoZSByZXVzYWJsZSBtb2NrIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1Nb2NrU2VydmljZUludGVyZmFjZSA9CisgICAgICAgIGNyZWF0ZVN0cmljdE1vY2soSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNsYXNzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0KG1Nb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhIGxpc3Qgb2YgaW5zdGFsbGVkIGFjY2Vzc2liaWxpdHkgc2VydmljZXMgdGhlIG1vY2sgc2VydmljZSByZXR1cm5zCisgICAgICAgIExpc3Q8U2VydmljZUluZm8+IGV4cGVjdGVkU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PFNlcnZpY2VJbmZvPigpOworICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IG5ldyBTZXJ2aWNlSW5mbygpOworICAgICAgICBzZXJ2aWNlSW5mby5uYW1lID0gIlRlc3RTZXJ2aWNlSW5mb05hbWUiOworICAgICAgICBleHBlY3RlZFNlcnZpY2VzLmFkZChzZXJ2aWNlSW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpLmFuZFJldHVybihleHBlY3RlZFNlcnZpY2VzKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gcmVjZWl2ZWRTZXJ2aWNlcyA9IG1hbmFnZXIuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0IChsaXN0IGVxdWFscygpIGNvbXBhcmVzIGl0IGNvbnRlbnRzIGFzIHdlbGwpCisgICAgICAgIGFzc2VydEVxdWFscygiQWxsIGV4cGVjdGVkIHNlcnZpY2VzIG11c3QgYmUgcmV0dXJuZWQiLCByZWNlaXZlZFNlcnZpY2VzLCBleHBlY3RlZFNlcnZpY2VzKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgbW9ja1NlcnZpY2VJbnRlcmZhY2UuaW50ZXJydXB0KCk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIG1hbmFnZXIuaW50ZXJydXB0KCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWRTZXJ2aWNlRW5hYmxlZCA9IG1hbmFnZXIuaXNFbmFibGVkKCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIk11c3QgYmUgZW5hYmxlZCBzaW5jZSB0aGUgbW9jayBzZXJ2aWNlIGlzIGVuYWJsZWQiLCBpc0VuYWJsZWRTZXJ2aWNlRW5hYmxlZCk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBhY2Nlc3NpYmlsaXR5CisgICAgICAgIG1hbmFnZXIuZ2V0Q2xpZW50KCkuc2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGFzeW5jaHJvbm91cyBJQmluZGVyIGNhbGwgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWRTZXJ2Y2llRGlzYWJsZWQgPSBtYW5hZ2VyLmlzRW5hYmxlZCgpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiTXVzdCBiZSBkaXNhYmxlZCBzaW5jZSB0aGUgbW9jayBzZXJ2aWNlIGlzIGRpc2FibGVkIiwKKyAgICAgICAgICAgICAgICBpc0VuYWJsZWRTZXJ2Y2llRGlzYWJsZWQpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X0FjY2Vzc2liaWxpdHlFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhbiBldmVudCB0byBiZSBkaXNwYXRjaGVkCisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChlcUFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpKSkKKyAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChlcUFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpKSkKKyAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0IChtYW5hZ2VyIGFuZCBzZXJ2aWNlIGluIGRpZmZlcmVudCBwcm9jZXNzZXMpCisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBuZXh0RXZlbnREaWZmZXJlbnRQcm9jZXNzZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGFzc2VydFNhbWUoIlRoZSBtYW5hZ2VyIGFuZCB0aGUgc2VydmljZSBhcmUgaW4gZGlmZmVyZW50IHByb2Nlc3Nlcywgc28gdGhlIGV2ZW50IG11c3QgYmUgIiArCisgICAgICAgICAgICAgICAgInJlY3ljbGVkIiwgc2VudEV2ZW50LCBuZXh0RXZlbnREaWZmZXJlbnRQcm9jZXNzZXMpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKG1hbmFnZXIgYW5kIHNlcnZpY2UgaW4gdGhlIHNhbWUgcHJvY2VzcykKKyAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBuZXh0RXZlbnRTYW1lUHJvY2VzcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZSgiVGhlIG1hbmFnZXIgYW5kIHRoZSBzZXJ2aWNlIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLCBzbyB0aGUgZXZlbnQgbXVzdCBub3QiICsKKyAgICAgICAgICAgICAgICAiYmUgcmVjeWNsZWQiLCBzZW50RXZlbnQsIG5leHRFdmVudFNhbWVQcm9jZXNzKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9BY2Nlc3NpYmlsaXR5RGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGFuIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4oZmFsc2UpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKGFjY2Vzc2liaWxpdHkgZGlzYWJsZWQpCisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICAgICAgZmFpbCgiTm8gYWNjZXNzaWJpbGl0eSBldmVudHMgYXJlIHNlbnQgaWYgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWNjZXNzaWJpbGl0eSBvZmYuIERpZCB5b3UgZm9yZ2V0IHRvIGNoZWNrIHRoYXQ/IiwgaXNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQKKyAgICAgKiBtYXRjaGVzIGV4cGVjdGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXRjaGVkIFRoZSBldmVudCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgZXhwZWN0YXRpb25zIGFyZSBtYXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEFjY2Vzc2liaWxpdHlFdmVudCBlcUFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgbWF0Y2hlZCkgeworICAgICAgICByZXBvcnRNYXRjaGVyKG5ldyBBY2Nlc3NpYmlsaXR5RXZlbnRNYXRoZXIobWF0Y2hlZCkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnR9IHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudAorICAgICAqIG1hdGNoZXMgZXhwZWN0YXRpb25zIHdoaWNoIGluIHRoaXMgY2FzZSBhcmUgdGhhdCBhbnkgaW5zdGFuY2UgaXMgYWNjZXB0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSB7CisgICAgICAgIHJlcG9ydE1hdGNoZXIobmV3IEFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudE1hdGhlcigpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWF0Y2hlciBmb3Ige0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH1zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjY2Vzc2liaWxpdHlFdmVudE1hdGhlciBpbXBsZW1lbnRzIElBcmd1bWVudE1hdGNoZXIgeworICAgICAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlFdmVudCBtRXhwZWN0ZWRFdmVudDsKKworICAgICAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUV2ZW50TWF0aGVyKEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50KSB7CisgICAgICAgICAgICBtRXhwZWN0ZWRFdmVudCA9IGV4cGVjdGVkRXZlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBtYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoIShtYXRjaGVkIGluc3RhbmNlb2YgQWNjZXNzaWJpbGl0eUV2ZW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50ID0gKEFjY2Vzc2liaWxpdHlFdmVudCkgbWF0Y2hlZDsKKyAgICAgICAgICAgIHJldHVybiBtRXhwZWN0ZWRFdmVudC5nZXRFdmVudFR5cGUoKSA9PSByZWNlaXZlZEV2ZW50LmdldEV2ZW50VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgic2VuZEFjY2Vzc2liaWxpdHlFdmVudCgpIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgd2l0aCBldmVudCB0eXBlIFwiIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG1FeHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVyIGZvciB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50fXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50TWF0aGVyIGltcGxlbWVudHMgSUFyZ3VtZW50TWF0Y2hlciB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG1hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmICghKG1hdGNoZWQgaW5zdGFuY2VvZiBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJhZGRDbGllbnQoKSB3aXRoIGFueSBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMTU4NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlMaXN0ZW5lclRlc3RlciBleHRlbmRzIElDb3VudHJ5TGlzdGVuZXIuU3R1YiB7CisgICAgICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoQ291bnRyeSBjb3VudHJ5KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1Db3VudHJ5ID0gY291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5IGdldENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5ICE9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIgZXh0ZW5kcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIHsKKworICAgICAgICBwcml2YXRlIENvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICAgICAgcHVibGljIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlSZWNlaXZlcnMoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBzdXBlci5ub3RpZnlSZWNlaXZlcnMoY291bnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKGZpbmFsIENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyU2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1MaXN0ZW5lciAhPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxpc3RlbmVyKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIgc2VydmljZVRlc3RlciA9IG5ldyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuc3lzdGVtUmVhZHkoKTsKKyAgICAgICAgd2FpdEZvclN5c3RlbVJlYWR5KHNlcnZpY2VUZXN0ZXIpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgbGlzdGVuZXJUZXN0ZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyVGVzdGVyKCk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuYWRkQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIucmVtb3ZlQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RpZnlMaXN0ZW5lcnMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlciBzZXJ2aWNlVGVzdGVyID0gbmV3IENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGxpc3RlbmVyVGVzdGVyQSA9IG5ldyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIoKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGxpc3RlbmVyVGVzdGVyQiA9IG5ldyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIoKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gbmV3IENvdW50cnkoIlVTIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5zeXN0ZW1SZWFkeSgpOworICAgICAgICB3YWl0Rm9yU3lzdGVtUmVhZHkoc2VydmljZVRlc3Rlcik7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuYWRkQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyQSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuYWRkQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyQik7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIubm90aWZ5UmVjZWl2ZXJzKGNvdW50cnkpOworICAgICAgICBhc3NlcnRUcnVlKHNlcnZpY2VUZXN0ZXIuaXNMaXN0ZW5lclNldCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclRlc3RlckEuaXNOb3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclRlc3RlckIuaXNOb3RpZmllZCgpKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5yZW1vdmVDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJBKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5yZW1vdmVDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJCKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yU3lzdGVtUmVhZHkoQ291bnRyeURldGVjdG9yU2VydmljZSBzZXJ2aWNlKSB7CisgICAgICAgIGludCBjb3VudCA9IDU7CisgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VydmljZS5pc1N5c3RlbVJlYWR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldhaXQgU3lzdGVtIFJlYWR5IHRpbWVvdXQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjOWI4NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgdGhpcyBzZXJ2aWNlIGV4cGVjdHMgdG8gcmVjZWl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFF1ZXVlPEFjY2Vzc2liaWxpdHlFdmVudD4gbUV4cGVjdGVkRXZlbnRzID0gbmV3IExpbmtlZExpc3Q8QWNjZXNzaWJpbGl0eUV2ZW50PigpOworCisgICAgLyoqCisgICAgICogSW50ZXJydXB0aW9uIGNhbGwgdGhpcyBzZXJ2aWNlIGV4cGVjdHMgdG8gcmVjZWl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUV4cGVjdGVkSW50ZXJydXB0OworCisgICAgLyoqCisgICAgICogRmxhZyBpZiB0aGUgbW9jayBpcyBjdXJyZW50bHkgcmVwbGF5aW5nLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwbGF5aW5nOworCisgICAgLyoqCisgICAgICogRmxhZyBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kIGFzIGEgY2xpZW50IHRvIHRoaXMgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3lzdGVtQm91bmRBc0NsaWVudDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb30gcG9wdWxhdGVkIHdpdGggZGVmYXVsdAorICAgICAqIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBjcmVhdGVEZWZhdWx0SW5mbygpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGRlZmF1bHRJbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOworICAgICAgICBkZWZhdWx0SW5mby5ldmVudFR5cGVzID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEOworICAgICAgICBkZWZhdWx0SW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKKyAgICAgICAgZGVmYXVsdEluZm8uZmxhZ3MgPSAwOworICAgICAgICBkZWZhdWx0SW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gMDsKKyAgICAgICAgZGVmYXVsdEluZm8ucGFja2FnZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJmb28uYmFyLmJheiIKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gZGVmYXVsdEluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHJlcGxheWluZyB0aGUgbW9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXBsYXkoKSB7CisgICAgICAgIG1SZXBsYXlpbmcgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIGlmIGFsbCBleHBlY3RlZCBzZXJ2aWNlIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgIGlmICghbVJlcGxheWluZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZXBsYXkoKSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZEludGVycnVwdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgY2FsbCB0byAjaW50ZXJydXB0KCkgbm90IHJlY2VpdmVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRXhwZWN0ZWRFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIGNhbGwgdG8gb25BY2Nlc3NpYmlsaXR5RXZlbnQoKSBmb3IgIgorICAgICAgICAgICAgICAgICAgICArICJldmVudHMgXCIiICsgbUV4cGVjdGVkRXZlbnRzICsgIlwiIG5vdCByZWNlaXZlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgaW5zdGFuY2Ugc28gaXQgY2FuIGJlIHJldXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbUV4cGVjdGVkRXZlbnRzLmNsZWFyKCk7CisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IGZhbHNlOworICAgICAgICBtUmVwbGF5aW5nID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBleHBlY3RlZCBjYWxsIHRvCisgICAgICoge0BsaW5rICNvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQpfSB3aXRoIGdpdmVuIGV2ZW50IGFzCisgICAgICogYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRFdmVudCBUaGUgZXhwZWN0ZWQgZXZlbnQgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwZWN0RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQpIHsKKyAgICAgICAgbUV4cGVjdGVkRXZlbnRzLmFkZChleHBlY3RlZEV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGV4cGVjdGVkIGNhbGwgb2Yge0BsaW5rICNvbkludGVycnVwdCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RJbnRlcnJ1cHQoKSB7CisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV4cGVjdGVkRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBldmVudDogIiArIHJlY2VpdmVkRXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQgPSBtRXhwZWN0ZWRFdmVudHMucG9sbCgpOworICAgICAgICBhc3NlcnRFcXVhbHNBY2Nlc3NpYmxpdHlFdmVudChleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkludGVycnVwdCgpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1FeHBlY3RlZEludGVycnVwdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYWxsIHRvIG9uSW50ZXJydXB0KCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKKyAgICAgICAgbUlzU3lzdGVtQm91bmRBc0NsaWVudCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQgYXMgY2xpZW50IHRvIHRoaXMgc2VydmljZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkgeworICAgICAgICByZXR1cm4gbUlzU3lzdGVtQm91bmRBc0NsaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyBhbGwgcHJvcGVydGllcyBvZiB0aGUgPGNvZGU+ZXhwZWN0ZWRFdmVudDwvY29kZT4gYW5kIHRoZQorICAgICAqIDxjb2RlPnJlY2V2aWVkRXZlbnQ8L2NvZGU+IHRvIHZlcmlmeSB0aGF0IHRoZSByZWNlaXZlZCBldmVudCBpcyB0aGUgb25lCisgICAgICogdGhhdCBpcyBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzQWNjZXNzaWJsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImFkZGVkQ291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0QWRkZWRDb3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0QWRkZWRDb3VudCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJiZWZvcmVUZXh0IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEJlZm9yZVRleHQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEJlZm9yZVRleHQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY2hlY2tlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc0NoZWNrZWQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjbGFzc05hbWUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0Q2xhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY29udGVudERlc2NyaXB0aW9uIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50CisgICAgICAgICAgICAgICAgLmdldENvbnRlbnREZXNjcmlwdGlvbigpLCByZWNlaXZlZEV2ZW50LmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjdXJyZW50SXRlbUluZGV4IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50CisgICAgICAgICAgICAgICAgLmdldEN1cnJlbnRJdGVtSW5kZXgoKSwgcmVjZWl2ZWRFdmVudC5nZXRDdXJyZW50SXRlbUluZGV4KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImVuYWJsZWQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNFbmFibGVkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc0VuYWJsZWQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZXZlbnRUeXBlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImZyb21JbmRleCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRGcm9tSW5kZXgoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEZyb21JbmRleCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJmdWxsU2NyZWVuIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzRnVsbFNjcmVlbigpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNGdWxsU2NyZWVuKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoIml0ZW1Db3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRJdGVtQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEl0ZW1Db3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzTm90aWZpY2F0aW9uQXNQYXJjZWxhYmxlRGF0YShleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJwYXNzd29yZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc1Bhc3N3b3JkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc1Bhc3N3b3JkKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoInJlbW92ZWRDb3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRSZW1vdmVkQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldFJlbW92ZWRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzVGV4dChleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIGFuZHJvaWQub3MuUGFyY2VsYWJsZX0gZGF0YSBvZiB0aGUKKyAgICAgKiA8Y29kZT5leHBlY3RlZEV2ZW50PC9jb2RlPiBhbmQgPGNvZGU+cmVjZWl2ZWRFdmVudDwvY29kZT4gdG8gdmVyaWZ5IHRoYXQKKyAgICAgKiB0aGUgcmVjZWl2ZWQgZXZlbnQgaXMgdGhlIG9uZSB0aGF0IGlzIGV4cGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNOb3RpZmljYXRpb25Bc1BhcmNlbGFibGVEYXRhKEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAicGFyY2VsYWJsZURhdGEgaGFzIGluY29ycmVjdCB2YWx1ZSI7CisgICAgICAgIE1lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0gKE1lc3NhZ2UpIGV4cGVjdGVkRXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKTsKKyAgICAgICAgTWVzc2FnZSByZWNlaXZlZE1lc3NhZ2UgPSAoTWVzc2FnZSkgcmVjZWl2ZWRFdmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpOworCisgICAgICAgIGlmIChleHBlY3RlZE1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJlY2VpdmVkTWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtZXNzYWdlLCByZWNlaXZlZE1lc3NhZ2UpOworCisgICAgICAgIC8vIHdlIGRvIGEgdmVyeSBzaW1wbGUgc2FuaXR5IGNoZWNrIHNpbmNlIHdlIGRvIG5vdCB0ZXN0IE1lc3NhZ2UKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkTWVzc2FnZS53aGF0LCByZWNlaXZlZE1lc3NhZ2Uud2hhdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHRleHQgb2YgdGhlIDxjb2RlPmV4cGVjdGVkRXZlbnQ8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnJlY2VpdmVkRXZlbnQ8L2NvZGU+IGJ5IGNvbXBhcmluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcge0BsaW5rIENoYXJTZXF1ZW5jZX1zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNUZXh0KEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAidGV4dCBoYXMgaW5jb3JyZWN0IHZhbHVlIjsKKyAgICAgICAgTGlzdDxDaGFyU2VxdWVuY2U+IGV4cGVjdGVkVGV4dCA9IGV4cGVjdGVkRXZlbnQuZ2V0VGV4dCgpOworICAgICAgICBMaXN0PENoYXJTZXF1ZW5jZT4gcmVjZWl2ZWRUZXh0ID0gcmVjZWl2ZWRFdmVudC5nZXRUZXh0KCk7CisKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkVGV4dC5zaXplKCksIHJlY2VpdmVkVGV4dC5zaXplKCkpOworCisgICAgICAgIEl0ZXJhdG9yPENoYXJTZXF1ZW5jZT4gZXhwZWN0ZWRUZXh0SXRlcmF0b3IgPSBleHBlY3RlZFRleHQuaXRlcmF0b3IoKTsKKyAgICAgICAgSXRlcmF0b3I8Q2hhclNlcXVlbmNlPiByZWNlaXZlZFRleHRJdGVyYXRvciA9IHJlY2VpdmVkVGV4dC5pdGVyYXRvcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUZXh0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAvLyBjb21wYXJlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFRleHRJdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRUZXh0SXRlcmF0b3IubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODk2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q291bnRyeURldGVjdG9yIGV4dGVuZHMgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPVU5UUllfSVNPID0gInVzIjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQ7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1Ob3RpZmllZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTsKKworICAgICAgICBwcml2YXRlIENvdW50cnkgbU5vdGlmaWVkQ291bnRyeTsKKyAgICAgICAgcHVibGljIFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBzdXBlcihnZXRDb250ZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5TG9jYXRpb25CYXNlZExpc3RlbmVyKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbU5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Ob3RpZmllZENvdW50cnkgPSBjb3VudHJ5OworICAgICAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Iubm90aWZ5TGlzdGVuZXIoY291bnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yICE9IG51bGwgJiYgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yID09IG51bGwgJiYgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvblJlZnJlc2hTdGFydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvblJlZnJlc2hUaW1lciAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9PSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5RGV0ZWN0b3JCYXNlIGNyZWF0ZUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnlEZXRlY3RvckJhc2UobUNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgICAgICBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMYXN0S25vd25Mb2NhdGlvbkJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpZWRDb3VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExvY2FsZUNvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5BZnRlckRldGVjdGlvbkFzeW5jKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnksCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBub3RpZnlDaGFuZ2UsIGZpbmFsIGJvb2xlYW4gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKSB7CisgICAgICAgICAgICBydW5BZnRlckRldGVjdGlvbihjb3VudHJ5LCBkZXRlY3RlZENvdW50cnksIG5vdGlmeUNoYW5nZSwgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKTsKKyAgICAgICAgfTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBaXJwbGFuZU1vZGVPZmYoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgYWRkUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgbGlzdGVuZXJBZGRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlb0NvZGVySW1wbGVtZW50ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXJBZGRlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeUxpc3RlbmVySW1wbCBpbXBsZW1lbnRzIENvdW50cnlMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTm90aWZpZWQ7CisgICAgICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeTsKKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Ob3RpZmllZCA9IHRydWU7CisgICAgICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBub3RpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ291bnRyeSBnZXRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldGVjdE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldGVjdExvY2F0aW9uQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX1NJTSk7CisgICAgICAgIGZpbmFsIENvdW50cnkgbG9jYXRpb25CYXNlZENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgcmVzdWx0Q291bnRyeSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25CYXNlZExpc3RlbmVyKGxvY2F0aW9uQmFzZWRDb3VudHJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShsaXN0ZW5lci5nZXRDb3VudHJ5KCksIGxvY2F0aW9uQmFzZWRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxlQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FMRSk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExvY2FsZUNvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3BwaW5nRGV0ZWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3Qgc3RvcHBpbmcgZGV0ZWN0b3Igd2hlbiBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIHdhcyBzdGFydGVkCisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgcmVzdWx0Q291bnRyeSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAvLyBUaGUgTG9jYXRpb25CYXNlZERldGVjdG9yIHNob3VsZCBiZSBzdG9wcGVkLgorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICAvLyBUaGUgbG9jYXRpb24gcmVmcmVzaCBzaG91bGQgbm90IHJ1bm5pbmcuCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25CYXNlZENvdW50cnlOb3RGb3VuZCgpIHsKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGxpc3RlbmVyLmdldENvdW50cnkoKSwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQ291bnRyeUZvdW5kKCkgeworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGxpc3RlbmVyLmdldENvdW50cnkoKSwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxpc3RlbmVyKCkgeworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdlb2NvZGVyTm90SW1wbGVtZW50ZWQoKSB7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzYW1lQ291bnRyeShDb3VudHJ5IGNvdW50cnkxLCBDb3VudHJ5IGNvdW50cnkyKSB7CisgICAgICAgIHJldHVybiBjb3VudHJ5MSA9PSBudWxsICYmIGNvdW50cnkyID09IG51bGwgfHwgY291bnRyeTEgIT0gbnVsbCAmJiBjb3VudHJ5MiAhPSBudWxsICYmCisgICAgICAgIGNvdW50cnkxLmdldENvdW50cnlJc28oKS5lcXVhbHNJZ25vcmVDYXNlKGNvdW50cnkyLmdldENvdW50cnlJc28oKSkgJiYKKyAgICAgICAgY291bnRyeTEuZ2V0U291cmNlKCkgPT0gY291bnRyeTIuZ2V0U291cmNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MWU4ZTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb247CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbkxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q291bnRyeURldGVjdG9yIGV4dGVuZHMgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPVEFMX1BST1ZJREVSUyA9IDI7CisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgY291bnRyeUZvdW5kTG9ja2VyID0gbmV3IE9iamVjdCgpOworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZnlDb3VudHJ5ID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgTG9jYXRpb24gbUxvY2F0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ291bnRyeTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1RdWVyeUxvY2F0aW9uVGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PExvY2F0aW9uTGlzdGVuZXI+IG1MaXN0ZW5lcnM7CisKKyAgICAgICAgcHVibGljIFRlc3RDb3VudHJ5RGV0ZWN0b3IoU3RyaW5nIGNvdW50cnksIFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgdGhpcyhjb3VudHJ5LCBwcm92aWRlciwgMTAwMCAqIDYwICogNSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdENvdW50cnlEZXRlY3RvcihTdHJpbmcgY291bnRyeSwgU3RyaW5nIHByb3ZpZGVyLCBsb25nIHF1ZXJ5TG9jYXRpb25UaW1lb3V0KSB7CisgICAgICAgICAgICBzdXBlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICAgICAgbUxvY2F0aW9uID0gbmV3IExvY2F0aW9uKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIG1RdWVyeUxvY2F0aW9uVGltZW91dCA9IHF1ZXJ5TG9jYXRpb25UaW1lb3V0OworICAgICAgICAgICAgbUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8TG9jYXRpb25MaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvdW50cnlGcm9tTG9jYXRpb24oTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY291bnRyeUZvdW5kTG9ja2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub3RpZnlDb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Rm91bmRMb2NrZXIud2FpdCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvY2F0aW9uLmdldFByb3ZpZGVyKCkuZW5kc1dpdGgobG9jYXRpb24uZ2V0UHJvdmlkZXIoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBMb2NhdGlvbiBnZXRMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYXRpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJFbmFibGVkUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzLmFkZEFsbChsaXN0ZW5lcnMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGZvciAoTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1Mb2NhdGlvbkxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgbG9uZyBnZXRRdWVyeUxvY2F0aW9uVGltZW91dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUXVlcnlMb2NhdGlvblRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCBnZXRUb3RhbEVuYWJsZWRQcm92aWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gVE9UQUxfUFJPVklERVJTOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5TG9jYXRpb25Gb3VuZCgpIHsKKyAgICAgICAgICAgIC8vIExpc3RlbmVyIGNvdWxkIGJlIHJlbW92ZWQgaW4gdGhlIG5vdGlmaWNhdGlvbi4KKyAgICAgICAgICAgIExvY2F0aW9uTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgTG9jYXRpb25MaXN0ZW5lclttTGlzdGVuZXJzLnNpemUoKV07CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMudG9BcnJheShsaXN0ZW5lcnMpOworICAgICAgICAgICAgZm9yIChMb2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDpsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkxvY2F0aW9uQ2hhbmdlZChtTG9jYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRMaXN0ZW5lcnNDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNvdW50cnlGb3VuZCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY291bnRyeUZvdW5kTG9ja2VyKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5Q291bnRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgY291bnRyeUZvdW5kTG9ja2VyLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRpbWVyIGdldFRpbWVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UaW1lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUaHJlYWQgZ2V0UXVlcnlUaHJlYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVF1ZXJ5VGhyZWFkOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb3VudHJ5TGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ291bnRyeUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmllZDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvdW50cnlDb2RlOworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Ob3RpZmllZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvdW50cnlDb2RlID0gY291bnRyeS5nZXRDb3VudHJ5SXNvKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBub3RpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnlDb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkZvdW5kKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5Q291bnRyeUZvdW5kKCk7CisgICAgICAgIC8vIFdhaXQgZm9yIHF1ZXJ5IHRocmVhZCBlbmRpbmcKKyAgICAgICAgd2FpdEZvclRocmVhZEVuZGluZyhxdWVyeVRocmVhZCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBiZSBzZXQgdG8gTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCksIGNvdW50cnkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeUNhbmNlbGxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25Gb3VuZCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICAvLyBUaGUgdGltZSBzaG91bGQgYmUgc3RvcHBlZAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHN0b3AgdGhlIHRocmVhZCwgbGV0J3MgdGVzdCBpdCBjb3VsZCBiZSBzdG9wcGVkLCBhZnRlciBnZXQgY291bnRyeQorICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRyeUxpc3RlbmVyLmdldENvdW50cnkoKSwgY291bnRyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdMb2NhdGlvbkNhbmNlbGxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICAvLyBUaGUgdGltZSBzaG91bGQgYmUgc3RvcHBlZAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgc3RpbGwgYmUgTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdMb2NhdGlvbkZhaWxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIGxvbmcgdGltZW91dCA9IDEwMDA7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlciwgdGltZW91dCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTG9jYXRpb24gZ2V0TGFzdEtub3duTG9jYXRpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgd2FpdEZvclRpbWVyUmVzZXQoZGV0ZWN0b3IpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgc3RpbGwgYmUgTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnlGYWlsZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb3VudHJ5RnJvbUxvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3VudHJ5Rm91bmRMb2NrZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgbm90aWZ5Q291bnRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Rm91bmRMb2NrZXIud2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGNvdW50cnkuCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25Gb3VuZCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgLy8gQ291bnRyeUxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZAorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnlXaXRoTGFzdEtub3duTG9jYXRpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBsb25nIHRpbWVvdXQgPSAxMDAwOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIsIHRpbWVvdXQpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIHdhaXRGb3JUaW1lclJlc2V0KGRldGVjdG9yKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgVGhyZWFkIHF1ZXJ5VGhyZWFkID0gd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoZGV0ZWN0b3IpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIC8vIENvdW50cnlMaXN0ZW5lciBzaG91bGQgYmUgbm90aWZpZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBjb3VudHJ5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclRpbWVyUmVzZXQoVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICBpbnQgY291bnQgPSA1OworICAgICAgICBsb25nIGludGVydmFsID0gMTAwMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCAmJiBkZXRlY3Rvci5nZXRUaW1lcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoaW50ZXJ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgVGltZXIgdGltZXIgPSBkZXRlY3Rvci5nZXRUaW1lcigpOworICAgICAgICBhc3NlcnRUcnVlKHRpbWVyID09IG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yVGhyZWFkRW5kaW5nKFRocmVhZCB0aHJlYWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRocmVhZC5qb2luKDUwMDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBUaHJlYWQgd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICBpbnQgY291bnQgPSA1OworICAgICAgICBsb25nIGludGVydmFsID0gMTAwMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCAmJiBkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoaW50ZXJ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkIHRocmVhZCA9IGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCk7CisgICAgICAgIGFzc2VydFRydWUodGhyZWFkICE9IG51bGwpOworICAgICAgICByZXR1cm4gdGhyZWFkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhCmluZGV4IDhhNDczMzkuLmZmYWJiN2IgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YQpAQCAtMTYsODMgKzE2LDIwMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5Bc1lvdVR5cGVGb3JtYXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgotICogV2F0Y2hlcyBhIHtAbGluayBUZXh0Vmlld30gYW5kIGlmIGEgcGhvbmUgbnVtYmVyIGlzIGVudGVyZWQgd2lsbCBmb3JtYXQgaXQgdXNpbmcKLSAqIHtAbGluayBQaG9uZU51bWJlclV0aWxzI2Zvcm1hdE51bWJlcihFZGl0YWJsZSwgaW50KX0uIFRoZSBmb3JtYXR0aW5nIGlzIGJhc2VkIG9uCi0gKiB0aGUgY3VycmVudCBzeXN0ZW0gbG9jYWxlIHdoZW4gdGhpcyBvYmplY3QgaXMgY3JlYXRlZCBhbmQgZnV0dXJlIGxvY2FsZSBjaGFuZ2VzCi0gKiBtYXkgbm90IHRha2UgZWZmZWN0IG9uIHRoaXMgaW5zdGFuY2UuCisgKiBXYXRjaGVzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fSBhbmQgaWYgYSBwaG9uZSBudW1iZXIgaXMgZW50ZXJlZAorICogd2lsbCBmb3JtYXQgaXQuCisgKiA8cD4KKyAqIFN0b3AgZm9ybWF0dGluZyB3aGVuIHRoZSB1c2VyCisgKiA8dWw+CisgKiA8bGk+SW5wdXRzIG5vbi1kaWFsYWJsZSBjaGFyYWN0ZXJzPC9saT4KKyAqIDxsaT5SZW1vdmVzIHRoZSBzZXBhcmF0b3IgaW4gdGhlIG1pZGRsZSBvZiBzdHJpbmcuPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoZSBmb3JtYXR0aW5nIHdpbGwgYmUgcmVzdGFydGVkIG9uY2UgdGhlIHRleHQgaXMgY2xlYXJlZC4KICAqLwogcHVibGljIGNsYXNzIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyIGltcGxlbWVudHMgVGV4dFdhdGNoZXIgeworICAgIC8qKgorICAgICAqIE9uZSBvciBtb3JlIGNoYXJhY3RlcnMgd2VyZSByZW1vdmVkIGZyb20gdGhlIGVuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfUkVNT1ZFX0xBU1QgPSAwOwogCi0gICAgc3RhdGljIHByaXZhdGUgaW50IHNGb3JtYXRUeXBlOwotICAgIHN0YXRpYyBwcml2YXRlIExvY2FsZSBzQ2FjaGVkTG9jYWxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRm9ybWF0dGluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGV0aW5nSHlwaGVuOwotICAgIHByaXZhdGUgaW50IG1IeXBoZW5TdGFydDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGV0aW5nQmFja3dhcmQ7CisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgY2hhcmFjdGVycyB3ZXJlIGFwcGVuZGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9BUFBFTkQgPSAxOwogCisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgZGlnaXRzIHdlcmUgY2hhbmdlZCBpbiB0aGUgYmVnaW5uaW5nIG9yIHRoZSBtaWRkbGUgb2YgdGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfTU9ESUZZX0RJR0lUUyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2hhbmdlcyBvdGhlciB0aGFuIHRoZSBhYm92ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfT1RIRVIgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXRlIG9mIHRoaXMgY2hhbmdlIGNvdWxkIGJlIG9uZSB2YWx1ZSBvZiB0aGUgYWJvdmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtU3RhdGU7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGNoYW5nZSB3YXMgY2F1c2VkIGJ5IG91cnNlbHZlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGZDaGFuZ2UgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgZm9ybWF0dGluZyBoYXMgYmVlbiBzdG9wcGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcEZvcm1hdHRpbmc7CisKKyAgICBwcml2YXRlIEFzWW91VHlwZUZvcm1hdHRlciBtRm9ybWF0dGVyOworCisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3lzdGVtIGxvY2FsZSBhbmQgZnV0dXJlIGxvY2FsZSBjaGFuZ2VzCisgICAgICogbWF5IG5vdCB0YWtlIGVmZmVjdCBvbiB0aGlzIGluc3RhbmNlLgorICAgICAqLwogICAgIHB1YmxpYyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigpIHsKLSAgICAgICAgaWYgKHNDYWNoZWRMb2NhbGUgPT0gbnVsbCB8fCBzQ2FjaGVkTG9jYWxlICE9IExvY2FsZS5nZXREZWZhdWx0KCkpIHsKLSAgICAgICAgICAgIHNDYWNoZWRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgc0Zvcm1hdFR5cGUgPSBQaG9uZU51bWJlclV0aWxzLmdldEZvcm1hdFR5cGVGb3JMb2NhbGUoc0NhY2hlZExvY2FsZSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhpcyhMb2NhbGUuZ2V0RGVmYXVsdCgpLmdldENvdW50cnkoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgdGV4dCkgewotICAgICAgICAvLyBNYWtlIHN1cmUgdG8gaWdub3JlIGNhbGxzIHRvIGFmdGVyVGV4dENoYW5nZWQgY2F1c2VkIGJ5IHRoZSB3b3JrIGRvbmUgYmVsb3cKLSAgICAgICAgaWYgKCFtRm9ybWF0dGluZykgewotICAgICAgICAgICAgbUZvcm1hdHRpbmcgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBJZiBkZWxldGluZyB0aGUgaHlwaGVuLCBhbHNvIGRlbGV0ZSB0aGUgY2hhciBiZWZvcmUgb3IgYWZ0ZXIgdGhhdAotICAgICAgICAgICAgaWYgKG1EZWxldGluZ0h5cGhlbiAmJiBtSHlwaGVuU3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1EZWxldGluZ0JhY2t3YXJkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSHlwaGVuU3RhcnQgLSAxIDwgdGV4dC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5kZWxldGUobUh5cGhlblN0YXJ0IC0gMSwgbUh5cGhlblN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUh5cGhlblN0YXJ0IDwgdGV4dC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShtSHlwaGVuU3RhcnQsIG1IeXBoZW5TdGFydCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIodGV4dCwgc0Zvcm1hdFR5cGUpOwotCi0gICAgICAgICAgICBtRm9ybWF0dGluZyA9IGZhbHNlOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24gdGhlIGdpdmVuIDxjb2RlPmNvdW50cnlDb2RlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5Q29kZSB0aGUgSVNPIDMxNjYtMSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgY291bnRyeS9yZWdpb24KKyAgICAgKiB3aGVyZSB0aGUgcGhvbmUgbnVtYmVyIGlzIGJlaW5nIGVudGVyZWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcihTdHJpbmcgY291bnRyeUNvZGUpIHsKKyAgICAgICAgaWYgKGNvdW50cnlDb2RlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgbUZvcm1hdHRlciA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpLmdldEFzWW91VHlwZUZvcm1hdHRlcihjb3VudHJ5Q29kZSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgaXMgZGVsZXRpbmcgYSBoeXBoZW4KLSAgICAgICAgaWYgKCFtRm9ybWF0dGluZykgewotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHVzZXIgaXMgZGVsZXRpbmcgb25lIGNoYXIsIHdpdGhvdXQgYSBzZWxlY3Rpb24KLSAgICAgICAgICAgIGZpbmFsIGludCBzZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChzKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBzZWxFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHMpOwotICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAxIC8vIENhbiBkZWxldGUgYW5vdGhlciBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgY291bnQgPT0gMSAvLyBEZWxldGluZyBvbmx5IG9uZSBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgYWZ0ZXIgPT0gMCAvLyBEZWxldGluZwotICAgICAgICAgICAgICAgICAgICAmJiBzLmNoYXJBdChzdGFydCkgPT0gJy0nIC8vIGEgaHlwaGVuCi0gICAgICAgICAgICAgICAgICAgICYmIHNlbFN0YXJ0ID09IHNlbEVuZCkgeyAvLyBubyBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICBtRGVsZXRpbmdIeXBoZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIG1IeXBoZW5TdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGlzIGRlbGV0aW5nIGZvcndhcmQgb3IgYmFja3dhcmQKLSAgICAgICAgICAgICAgICBpZiAoc2VsU3RhcnQgPT0gc3RhcnQgKyAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWxldGluZ0JhY2t3YXJkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRGVsZXRpbmdCYWNrd2FyZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbURlbGV0aW5nSHlwaGVuID0gZmFsc2U7Ci0gICAgICAgICAgICB9CisgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LAorICAgICAgICAgICAgaW50IGFmdGVyKSB7CisgICAgICAgIGlmIChtU2VsZkNoYW5nZSB8fCBtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPT0gMCAmJiBzLmxlbmd0aCgpID09IHN0YXJ0KSB7CisgICAgICAgICAgICAvLyBBcHBlbmQgb25lIG9yIG1vcmUgbmV3IGNoYXJzCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BUFBFTkQ7CisgICAgICAgIH0gZWxzZSBpZiAoYWZ0ZXIgPT0gMCAmJiBzdGFydCArIGNvdW50ID09IHMubGVuZ3RoKCkgJiYgY291bnQgPiAwKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgb25lIG9yIG1vcmUgY2hhcnMgZnJvbSB0aGUgZW5kIG9mIHN0cmluZy4KKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFTU9WRV9MQVNUOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID4gMCAmJiAhaGFzU2VwYXJhdG9yKHMsIHN0YXJ0LCBjb3VudCkpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZGlhbGFibGUgY2hhcnMgaW4gdGhlIGJlZ2luIG9yIG1pZGRsZSBvZiB0ZXh0LgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfTU9ESUZZX0RJR0lUUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX09USEVSOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKLSAgICAgICAgLy8gRG9lcyBub3RoaW5nCisgICAgICAgIGlmIChtU2VsZkNoYW5nZSB8fCBtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX09USEVSKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwICYmICFoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgICAgIC8vIFVzZXIgaW5zZXJ0ZWQgdGhlIGRpYWxhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIG1pZGRsZSBvZiB0ZXh0LgorICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX01PRElGWV9ESUdJVFM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBzaG91bGQgc3RvcCBmb3JtYXR0aW5nLgorICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FQUEVORCAmJiBjb3VudCA+IDAgJiYgaGFzU2VwYXJhdG9yKHMsIHN0YXJ0LCBjb3VudCkpIHsKKyAgICAgICAgICAgIC8vIFVzZXIgYXBwZW5kZWQgdGhlIG5vbi1kaWFsYWJsZSBjaGFyYWN0ZXIsIHN0b3AgZm9ybWF0dGluZy4KKyAgICAgICAgICAgIHN0b3BGb3JtYXR0aW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX09USEVSKSB7CisgICAgICAgICAgICAvLyBVc2VyIG11c3QgaW5zZXJ0IG9yIHJlbW92ZSB0aGUgbm9uLWRpYWxhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGJlZ2luIG9yIG1pZGRsZSBvZgorICAgICAgICAgICAgLy8gbnVtYmVyLCBzdG9wIGZvcm1hdHRpbmcuCisgICAgICAgICAgICBzdG9wRm9ybWF0dGluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICBpZiAobVN0b3BGb3JtYXR0aW5nKSB7CisgICAgICAgICAgICAvLyBSZXN0YXJ0IHRoZSBmb3JtYXR0aW5nIHdoZW4gYWxsIHRleHRzIHdlcmUgY2xlYXIuCisgICAgICAgICAgICBtU3RvcEZvcm1hdHRpbmcgPSAhKHMubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGNoYW5nZSBjYXVzZWQgYnkgcy5yZXBsYWNlKCkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZCA9IHJlZm9ybWF0KHMsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQocykpOworICAgICAgICBpZiAoZm9ybWF0dGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCByZW1lbWJlcmVkUG9zID0gbUZvcm1hdHRlci5nZXRSZW1lbWJlcmVkUG9zaXRpb24oKTsKKyAgICAgICAgICAgIG1TZWxmQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHMucmVwbGFjZSgwLCBzLmxlbmd0aCgpLCBmb3JtYXR0ZWQsIDAsIGZvcm1hdHRlZC5sZW5ndGgoKSk7CisgICAgICAgICAgICAvLyBUaGUgdGV4dCBjb3VsZCBiZSBjaGFuZ2VkIGJ5IG90aGVyIFRleHRXYXRjaGVyIGFmdGVyIHdlIGNoYW5nZWQgaXQuIElmIHdlIGZvdW5kIHRoZQorICAgICAgICAgICAgLy8gdGV4dCBpcyBub3QgdGhlIG9uZSB3ZSB3ZXJlIGV4cGVjdGluZywganVzdCBnaXZlIHVwIGNhbGxpbmcgc2V0U2VsZWN0aW9uKCkuCisgICAgICAgICAgICBpZiAoZm9ybWF0dGVkLmVxdWFscyhzLnRvU3RyaW5nKCkpKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihzLCByZW1lbWJlcmVkUG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZWxmQ2hhbmdlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgZm9ybWF0dGVkIG51bWJlciBieSBpZ25vcmluZyBhbGwgbm9uLWRpYWxhYmxlIGNoYXJzIGFuZCBzdGljayB0aGUgY3Vyc29yIHRvIHRoZQorICAgICAqIG5lYXJlc3QgZGlhbGFibGUgY2hhciB0byB0aGUgbGVmdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbnVtYmVyIGlzICAoNjUwKSAxMjMtNDU2NzggYW5kICc0JyBpcworICAgICAqIHJlbW92ZWQgdGhlbiB0aGUgY3Vyc29yIHNob3VsZCBiZSBiZWhpbmQgJzMnIGluc3RlYWQgb2YgJy0nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlZm9ybWF0KENoYXJTZXF1ZW5jZSBzLCBpbnQgY3Vyc29yKSB7CisgICAgICAgIC8vIFRoZSBpbmRleCBvZiBjaGFyIHRvIHRoZSBsZWZ0d2FyZCBvZiB0aGUgY3Vyc29yLgorICAgICAgICBpbnQgY3VySW5kZXggPSBjdXJzb3IgLSAxOworICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gbnVsbDsKKyAgICAgICAgbUZvcm1hdHRlci5jbGVhcigpOworICAgICAgICBjaGFyIGxhc3ROb25TZXBhcmF0b3IgPSAwOworICAgICAgICBib29sZWFuIGhhc0N1cnNvciA9IGZhbHNlOworICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoUGhvbmVOdW1iZXJVdGlscy5pc05vblNlcGFyYXRvcihjKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0Tm9uU2VwYXJhdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkID0gZ2V0Rm9ybWF0dGVkTnVtYmVyKGxhc3ROb25TZXBhcmF0b3IsIGhhc0N1cnNvcik7CisgICAgICAgICAgICAgICAgICAgIGhhc0N1cnNvciA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0Tm9uU2VwYXJhdG9yID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IGN1ckluZGV4KSB7CisgICAgICAgICAgICAgICAgaGFzQ3Vyc29yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdE5vblNlcGFyYXRvciAhPSAwKSB7CisgICAgICAgICAgICBmb3JtYXR0ZWQgPSBnZXRGb3JtYXR0ZWROdW1iZXIobGFzdE5vblNlcGFyYXRvciwgaGFzQ3Vyc29yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9ybWF0dGVkOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEZvcm1hdHRlZE51bWJlcihjaGFyIGxhc3ROb25TZXBhcmF0b3IsIGJvb2xlYW4gaGFzQ3Vyc29yKSB7CisgICAgICAgIHJldHVybiBoYXNDdXJzb3IgPyBtRm9ybWF0dGVyLmlucHV0RGlnaXRBbmRSZW1lbWJlclBvc2l0aW9uKGxhc3ROb25TZXBhcmF0b3IpCisgICAgICAgICAgICAgICAgOiBtRm9ybWF0dGVyLmlucHV0RGlnaXQobGFzdE5vblNlcGFyYXRvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BGb3JtYXR0aW5nKCkgeworICAgICAgICBtU3RvcEZvcm1hdHRpbmcgPSB0cnVlOworICAgICAgICBtRm9ybWF0dGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NlcGFyYXRvcihmaW5hbCBDaGFyU2VxdWVuY2UgcywgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgY291bnQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICghUGhvbmVOdW1iZXJVdGlscy5pc05vblNlcGFyYXRvcihjKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKaW5kZXggZGRmYzUyMC4uZTM3NzMzYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuTnVtYmVyUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWwuUGhvbmVOdW1iZXJGb3JtYXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZW51bWJlci5QaG9uZU51bWJlcjsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CkBAIC02MTcsNyArNjIyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEluIHRoZSBVUywgMS02NTAtNTU1LTEyMzQgbXVzdCBiZSBlcXVhbCB0byA2NTAtNTU1LTEyMzQsCi0gICAgICAgICAgICAvLyB3aGlsZSAwOTAtMTIzNC0xMjM0IG11c3Qgbm90IGJlIGVxdWFsdCB0byA5MC0xMjM0LTEyMzQgaW4gSmFwYW4uCisgICAgICAgICAgICAvLyB3aGlsZSAwOTAtMTIzNC0xMjM0IG11c3Qgbm90IGJlIGVxdWFsIHRvIDkwLTEyMzQtMTIzNCBpbiBKYXBhbi4KICAgICAgICAgICAgIC8vIFRoaXMgcmVxdWVzdCBleGlzdHMganVzdCBpbiBVUyAod2l0aCAxIHRydW5rIChOREQpIHByZWZpeCkuCiAgICAgICAgICAgICAvLyBJbiBhZGRpdGlvbiwgIjAxMSAxMSA3MDA1NTU0MTQxIiBtdXN0IG5vdCBlcXVhbCB0byAiKzE3MDA1NTU0MTQxIiwKICAgICAgICAgICAgIC8vIHdoaWxlICIwMTEgMSA3MDA1NTU0MTQxIiBtdXN0IGVxdWFsIHRvICIrMTcwMDU1NTQxNDEiCkBAIC03NzksMTAgKzc4NCwxMCBAQAogICAgICAgICBpZiAocHJlcGVuZFBsdXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gImludGVybmF0aW9uYWwgbnVtYmVyIiBhbmQgc2hvdWxkIGhhdmUKICAgICAgICAgICAgIC8vIGEgcGx1cyBwcmVwZW5kZWQgdG8gdGhlIGRpYWxpbmcgbnVtYmVyLiBCdXQgdGhlcmUKLSAgICAgICAgICAgIC8vIGNhbiBhbHNvIGJlIEdzbSBNTUkgY29kZXMgYXMgZGVmaW5lZCBpbiBUUyAyMi4wMzAgNi41LjIKKyAgICAgICAgICAgIC8vIGNhbiBhbHNvIGJlIEdTTSBNTUkgY29kZXMgYXMgZGVmaW5lZCBpbiBUUyAyMi4wMzAgNi41LjIKICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gaGFuZGxlIHRob3NlIGFsc28uCiAgICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gaHR0cDovL3dlYi50ZWxpYS5jb20vfnU0NzkwNDc3Ni9nc21rb2RlLmh0bSBpcyBhCisgICAgICAgICAgICAvLyBodHRwOi8vd2ViLnRlbGlhLmNvbS9+dTQ3OTA0Nzc2L2dzbWtvZGUuaHRtCiAgICAgICAgICAgICAvLyBoYXMgYSBuaWNlIGxpc3Qgb2Ygc29tZSBvZiB0aGVzZSBHU00gY29kZXMuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gRXhhbXBsZXMgYXJlOgpAQCAtODcwLDEwICs4NzUsMTAgQEAKIAogICAgICAgICAgICAgLy8gRklYTUUobWtmKSBUUyAyMy4wNDAgOS4xLjIuMyBzYXlzCiAgICAgICAgICAgICAvLyAiaWYgYSBtb2JpbGUgcmVjZWl2ZXMgMTExMSBpbiBhIHBvc2l0aW9uIHByaW9yIHRvCi0gICAgICAgICAgICAvLyB0aGUgbGFzdCBzZW1pLW9jdGV0IHRoZW4gcHJvY2Vzc2luZyBzaGFsbCBjb21tZW5zZSB3aXRoCisgICAgICAgICAgICAvLyB0aGUgbGFzdCBzZW1pLW9jdGV0IHRoZW4gcHJvY2Vzc2luZyBzaGFsbCBjb21tZW5jZSB3aXRoCiAgICAgICAgICAgICAvLyB0aGUgbmV4dCBzZW1pLW9jdGV0IGFuZCB0aGUgaW50ZXJ2ZW5pbmcKICAgICAgICAgICAgIC8vIHNlbWktb2N0ZXQgc2hhbGwgYmUgaWdub3JlZCIKLSAgICAgICAgICAgIC8vIEhvdyBkb2VzIHRoaXMgaml2ZSB3aXRoIDI0LDAwOCAxMC41LjQuNworICAgICAgICAgICAgLy8gSG93IGRvZXMgdGhpcyBqaXZlIHdpdGggMjQuMDA4IDEwLjUuNC43CiAKICAgICAgICAgICAgIGIgPSAoYnl0ZSkoKGJ5dGVzW2ldID4+IDQpICYgMHhmKTsKIApAQCAtMTAwNCw3ICsxMDA5LDcgQEAKICAgICAgKiBDb252ZXJ0IGEgZGlhbGluZyBudW1iZXIgdG8gQkNEIGJ5dGUgYXJyYXkKICAgICAgKgogICAgICAqIEBwYXJhbSBudW1iZXIgZGlhbGluZyBudW1iZXIgc3RyaW5nCi0gICAgICogICAgICAgIGlmIHRoZSBkaWFsaW5nIG51bWJlciBzdGFydHMgd2l0aCAnKycsIHNldCB0byBpbnRlcm5hdGlvbmwgVE9BCisgICAgICogICAgICAgIGlmIHRoZSBkaWFsaW5nIG51bWJlciBzdGFydHMgd2l0aCAnKycsIHNldCB0byBpbnRlcm5hdGlvbmFsIFRPQQogICAgICAqIEByZXR1cm4gQkNEIGJ5dGUgYXJyYXkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXQpAQCAtMTEwOCwxMCArMTExMywxMCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgcGhvbmUgbnVtYmVyIHRvIGZvcm1hdAogICAgICAqIEBwYXJhbSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBydWxlcyB0byBhcHBseSBpZiB0aGUgbnVtYmVyIGRvZXMKLSAgICAgKiBub3QgYmVnaW4gd2l0aCArPGNvdW50cnlfY29kZT4KKyAgICAgKiBub3QgYmVnaW4gd2l0aCArW2NvdW50cnlfY29kZV0KICAgICAgKiBAcmV0dXJuIFRoZSBwaG9uZSBudW1iZXIgZm9ybWF0dGVkIHdpdGggdGhlIGdpdmVuIGZvcm1hdHRpbmcgdHlwZS4KICAgICAgKgotICAgICAqIEBoaWRlIFRPRE86U2h1b2xkIGJlIHVuaGlkZGVuLgorICAgICAqIEBoaWRlIFRPRE86IFNob3VsZCBiZSB1bmhpZGRlbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXROdW1iZXIoU3RyaW5nIHNvdXJjZSwgaW50IGRlZmF1bHRGb3JtYXR0aW5nVHlwZSkgewogICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzb3VyY2UpOwpAQCAtMTEzOCw3ICsxMTQzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLCB3aWxsIGJlIG1vZGlmaWVkIHdpdGggdGhlIGZvcm1hdHRpbmcKICAgICAgKiBAcGFyYW0gZGVmYXVsdEZvcm1hdHRpbmdUeXBlIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgcnVsZXMgdG8gYXBwbHkgaWYgdGhlIG51bWJlciBkb2VzCi0gICAgICogbm90IGJlZ2luIHdpdGggKzxjb3VudHJ5X2NvZGU+CisgICAgICogbm90IGJlZ2luIHdpdGggK1tjb3VudHJ5X2NvZGVdCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdE51bWJlcihFZGl0YWJsZSB0ZXh0LCBpbnQgZGVmYXVsdEZvcm1hdHRpbmdUeXBlKSB7CiAgICAgICAgIGludCBmb3JtYXRUeXBlID0gZGVmYXVsdEZvcm1hdHRpbmdUeXBlOwpAQCAtMTMxOSw2ICsxMzI0LDEzMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogRm9ybWF0IHRoZSBnaXZlbiBwaG9uZU51bWJlciB0byB0aGUgRS4xNjQgcmVwcmVzZW50YXRpb24uCisgICAgICogPHA+CisgICAgICogVGhlIGdpdmVuIHBob25lIG51bWJlciBtdXN0IGhhdmUgYW4gYXJlYSBjb2RlIGFuZCBjb3VsZCBoYXZlIGEgY291bnRyeQorICAgICAqIGNvZGUuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHRDb3VudHJ5SXNvIGlzIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGdpdmVuIG51bWJlciBhbmQgZ2VuZXJhdGUKKyAgICAgKiB0aGUgRS4xNjQgcGhvbmUgbnVtYmVyIGlmIHRoZSBnaXZlbiBudW1iZXIgZG9lc24ndCBoYXZlIGEgY291bnRyeSBjb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgcGhvbmUgbnVtYmVyIHRvIGZvcm1hdAorICAgICAqIEBwYXJhbSBkZWZhdWx0Q291bnRyeUlzbworICAgICAqICAgICAgICAgICAgdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlCisgICAgICogQHJldHVybiB0aGUgRS4xNjQgcmVwcmVzZW50YXRpb24sIG9yIG51bGwgaWYgdGhlIGdpdmVuIHBob25lIG51bWJlciBpcworICAgICAqICAgICAgICAgbm90IHZhbGlkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXROdW1iZXJUb0UxNjQoU3RyaW5nIHBob25lTnVtYmVyLCBTdHJpbmcgZGVmYXVsdENvdW50cnlJc28pIHsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlsIHV0aWwgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQaG9uZU51bWJlciBwbiA9IHV0aWwucGFyc2UocGhvbmVOdW1iZXIsIGRlZmF1bHRDb3VudHJ5SXNvKTsKKyAgICAgICAgICAgIGlmICh1dGlsLmlzVmFsaWROdW1iZXIocG4pKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdXRpbC5mb3JtYXQocG4sIFBob25lTnVtYmVyRm9ybWF0LkUxNjQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOdW1iZXJQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgYSBwaG9uZSBudW1iZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGdpdmVuIG51bWJlciBkb2Vzbid0IGhhdmUgdGhlIGNvdW50cnkgY29kZSwgdGhlIHBob25lIHdpbGwgYmUKKyAgICAgKiBmb3JtYXR0ZWQgdG8gdGhlIGRlZmF1bHQgY291bnRyeSdzIGNvbnZlbnRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLgorICAgICAqIEBwYXJhbSBkZWZhdWx0Q291bnRyeUlzbworICAgICAqICAgICAgICAgICAgdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlIHdob3NlIGNvbnZlbnRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgYmUgdXNlZCBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGRvZXNuJ3QgaGF2ZSB0aGUgY291bnRyeSBjb2RlLgorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBudW1iZXIsIG9yIG51bGwgaWYgdGhlIGdpdmVuIG51bWJlciBpcyBub3QgdmFsaWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlcihTdHJpbmcgcGhvbmVOdW1iZXIsIFN0cmluZyBkZWZhdWx0Q291bnRyeUlzbykgeworICAgICAgICBQaG9uZU51bWJlclV0aWwgdXRpbCA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBob25lTnVtYmVyIHBuID0gdXRpbC5wYXJzZUFuZEtlZXBSYXdJbnB1dChwaG9uZU51bWJlciwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICAgICAgcmVzdWx0ID0gdXRpbC5mb3JtYXRJbk9yaWdpbmFsRm9ybWF0KHBuLCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlclBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCB0aGUgcGhvbmUgbnVtYmVyIG9ubHkgaWYgdGhlIGdpdmVuIG51bWJlciBoYXNuJ3QgYmVlbiBmb3JtYXR0ZWQuCisgICAgICogPHA+CisgICAgICogVGhlIG51bWJlciB3aGljaCBoYXMgb25seSBkYWlsYWJsZSBjaGFyYWN0ZXIgaXMgdHJlYXRlZCBhcyBub3QgYmVpbmcKKyAgICAgKiBmb3JtYXR0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlckUxNjQKKyAgICAgKiAgICAgICAgICAgIHRoZSBFMTY0IGZvcm1hdCBudW1iZXIgd2hvc2UgY291bnRyeSBjb2RlIGlzIHVzZWQgaWYgdGhlIGdpdmVuCisgICAgICogICAgICAgICAgICBwaG9uZU51bWJlciBkb2Vzbid0IGhhdmUgdGhlIGNvdW50cnkgY29kZS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdENvdW50cnlJc28KKyAgICAgKiAgICAgICAgICAgIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSB3aG9zZSBjb252ZW50aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgIGJlIHVzZWQgaWYgdGhlIHBob25lTnVtYmVyRTE2NCBpcyBudWxsIG9yIGludmFsaWQuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIG51bWJlciBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGhhcyBiZWVuIGZvcm1hdHRlZCwKKyAgICAgKiAgICAgICAgICAgIG90aGVyd2lzZSwgcmV0dXJuIHRoZSBnaXZlbiBudW1iZXIuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlcigKKyAgICAgICAgICAgIFN0cmluZyBwaG9uZU51bWJlciwgU3RyaW5nIHBob25lTnVtYmVyRTE2NCwgU3RyaW5nIGRlZmF1bHRDb3VudHJ5SXNvKSB7CisgICAgICAgIGludCBsZW4gPSBwaG9uZU51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKCFpc0RpYWxhYmxlKHBob25lTnVtYmVyLmNoYXJBdChpKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGhvbmVOdW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUGhvbmVOdW1iZXJVdGlsIHV0aWwgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgLy8gR2V0IHRoZSBjb3VudHJ5IGNvZGUgZnJvbSBwaG9uZU51bWJlckUxNjQKKyAgICAgICAgaWYgKHBob25lTnVtYmVyRTE2NCAhPSBudWxsICYmIHBob25lTnVtYmVyRTE2NC5sZW5ndGgoKSA+PSAyCisgICAgICAgICAgICAgICAgJiYgcGhvbmVOdW1iZXJFMTY0LmNoYXJBdCgwKSA9PSAnKycpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXIgcG4gPSB1dGlsLnBhcnNlKHBob25lTnVtYmVyRTE2NCwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICAgICAgICAgIFN0cmluZyByZWdpb25Db2RlID0gdXRpbC5nZXRSZWdpb25Db2RlRm9yTnVtYmVyKHBuKTsKKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHJlZ2lvbkNvZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb3VudHJ5SXNvID0gcmVnaW9uQ29kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGZvcm1hdE51bWJlcihwaG9uZU51bWJlciwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBwaG9uZU51bWJlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemUgYSBwaG9uZSBudW1iZXIgYnkgcmVtb3ZpbmcgdGhlIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBkaWdpdHMuIElmCisgICAgICogdGhlIGdpdmVuIG51bWJlciBoYXMga2V5cGFkIGxldHRlcnMsIHRoZSBsZXR0ZXJzIHdpbGwgYmUgY29udmVydGVkIHRvCisgICAgICogZGlnaXRzIGZpcnN0LgorICAgICAqCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgICogQHJldHVybiB0aGUgbm9ybWFsaXplZCBudW1iZXIuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZU51bWJlcihTdHJpbmcgcGhvbmVOdW1iZXIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBsZW4gPSBwaG9uZU51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcGhvbmVOdW1iZXIuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKChpID09IDAgJiYgYyA9PSAnKycpIHx8IFBob25lTnVtYmVyVXRpbHMuaXNJU09EaWdpdChjKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU51bWJlcihQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMocGhvbmVOdW1iZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKICAgICAvLyBUaHJlZSBhbmQgZm91ciBkaWdpdCBwaG9uZSBudW1iZXJzIGZvciBlaXRoZXIgc3BlY2lhbCBzZXJ2aWNlcywKICAgICAvLyBvciAzLTYgZGlnaXQgYWRkcmVzc2VzIGZyb20gdGhlIG5ldHdvcmsgKGVnIGNhcnJpZXItb3JpZ2luYXRlZCBTTVMgbWVzc2FnZXMpIHNob3VsZAogICAgIC8vIG5vdCBtYXRjaC4KQEAgLTE1NDYsNyArMTY3Nyw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwotICAgIGNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KFN0cmluZyBkaWFsU3RyLGludCBjdXJyRm9ybWF0LGludCBkZWZhdWx0Rm9ybXQpIHsKKyAgICBjZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdChTdHJpbmcgZGlhbFN0cixpbnQgY3VyckZvcm1hdCxpbnQgZGVmYXVsdEZvcm1hdCkgewogICAgICAgICBTdHJpbmcgcmV0U3RyID0gZGlhbFN0cjsKIAogICAgICAgICAvLyBDaGVja3MgaWYgdGhlIHBsdXMgc2lnbiBjaGFyYWN0ZXIgaXMgaW4gdGhlIHBhc3NlZC1pbiBkaWFsIHN0cmluZwpAQCAtMTU1NCw3ICsxNjg1LDcgQEAKICAgICAgICAgICAgIGRpYWxTdHIubGFzdEluZGV4T2YoUExVU19TSUdOX1NUUklORykgIT0gLTEpIHsKICAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgc3RyaW5nIGJhc2VkIG9uIHRoZSBydWxlcyBmb3IgdGhlIGNvdW50cnkgdGhlIG51bWJlciBpcyBmcm9tLAogICAgICAgICAgICAgLy8gYW5kIHRoZSBjdXJyZW50IGNvdW50cnkgdGhlIHBob25lIGlzIGNhbXBlZCBvbi4KLSAgICAgICAgICAgIGlmICgoY3VyckZvcm1hdCA9PSBkZWZhdWx0Rm9ybXQpICYmIChjdXJyRm9ybWF0ID09IEZPUk1BVF9OQU5QKSkgeworICAgICAgICAgICAgaWYgKChjdXJyRm9ybWF0ID09IGRlZmF1bHRGb3JtYXQpICYmIChjdXJyRm9ybWF0ID09IEZPUk1BVF9OQU5QKSkgewogICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGRlZmF1bHQgYW5kIGN1cnJlbnQgdGVsZXBob25lIG51bWJlcmluZyBwbGFucyBhcmUgTkFOUC4KICAgICAgICAgICAgICAgICBTdHJpbmcgcG9zdERpYWxTdHIgPSBudWxsOwogICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wRGlhbFN0ciA9IGRpYWxTdHI7CkBAIC0xNzQxLDcgKzE4NzIsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgLy8gVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHRoZSBub24tZGlhYmxhYmxlIFAvVyBjaGFyYWN0ZXIgdG8gdGhlIG9yaWdpbmFsCisgICAgLy8gVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHRoZSBub24tZGlhbGFibGUgUC9XIGNoYXJhY3RlciB0byB0aGUgb3JpZ2luYWwKICAgICAvLyBkaWFsIHN0cmluZyBiYXNlZCBvbiB0aGUgZGlhbGFibGUgaW5kZXggcGFzc2VkIGluCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nCiAgICAgYXBwZW5kUHdDaGFyQmFja1RvT3JpZ0RpYWxTdHIoaW50IGRpYWxhYmxlSW5kZXgsU3RyaW5nIG9yaWdTdHIsIFN0cmluZyBkaWFsU3RyKSB7CkBAIC0xNzYxLDcgKzE4OTIsNyBAQAogICAgICAgICByZXR1cm4gcmV0U3RyOwogICAgIH0KIAotICAgIC8vPT09PT0gQmVnaW5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgaW4gY29tcGFyZUxvb3NlbHkoKSA9PT09PQorICAgIC8vPT09PT0gQmVnaW5uaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGluIGNvbXBhcmVMb29zZWx5KCkgPT09PT0KIAogICAgIC8qKgogICAgICAqIFBob25lIG51bWJlcnMgYXJlIHN0b3JlZCBpbiAibG9va3VwIiBmb3JtIGluIHRoZSBkYXRhYmFzZQpAQCAtMTg4MywxMiArMjAxNCwxMiBAQAogCiAgICAgLy89PT09PSBFbmQgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlTG9vc2VseSgpID09PT09CiAKLSAgICAvLz09PT09IEJlZ2dpbmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVTdHJpY3RseSgpID09PT0KKyAgICAvLz09PT09IEJlZ2lubmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVTdHJpY3RseSgpID09PT0KIAogICAgIC8qCiAgICAgICogSWYgdHJ1ZSwgdGhlIG51bWJlciBpcyBjb3VudHJ5IGNhbGxpbmcgY29kZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENPVU5UTFlfQ0FMTElOR19DQUxMW10gPSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT1VOVFJZX0NBTExJTkdfQ0FMTFtdID0gewogICAgICAgICB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLApAQCAtMTkwMCwxOCArMjAzMSwxOCBAQAogICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwKICAgICAgICAgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwKICAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQ0NfTEVOR1RIID0gQ09VTlRMWV9DQUxMSU5HX0NBTEwubGVuZ3RoOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQ0NfTEVOR1RIID0gQ09VTlRSWV9DQUxMSU5HX0NBTEwubGVuZ3RoOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIHdoZW4gaW5wdXQgaXMgdmFsaWQgQ291bnRyeSBDYWxsaW5nIENvZGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvdW50cnlDYWxsaW5nQ29kZShpbnQgY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlKSB7CiAgICAgICAgIHJldHVybiBjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGUgPiAwICYmIGNvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZSA8IENDQ19MRU5HVEggJiYKLSAgICAgICAgICAgICAgICBDT1VOVExZX0NBTExJTkdfQ0FMTFtjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGVdOworICAgICAgICAgICAgICAgIENPVU5UUllfQ0FMTElOR19DQUxMW2NvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZV07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpbnRlcmdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBpZiBpbnB1dCAiY2giIGlzCisgICAgICogUmV0dXJucyBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGlmIGlucHV0ICJjaCIgaXMKICAgICAgKiBJU08tTEFUSU4gY2hhcmFjdGVycyAwLTkuCiAgICAgICogUmV0dXJucyAtMSBvdGhlcndpc2UKICAgICAgKi8KQEAgLTIwNDYsNyArMjE3Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJlZml4IG9mICJzdHIiIGlzICJpZ25vcmFibGUiLiBIZXJlLCAiaWdub3JhYmxlIiBtZWFucwotICAgICAqIHRoYXQgInN0ciIgaGFzIG9ubHkgb25lIGRpZ2l0IGFuZCBzZXBhcmF0ZXIgY2hhcmFjdGVycy4gVGhlIG9uZSBkaWdpdCBpcworICAgICAqIHRoYXQgInN0ciIgaGFzIG9ubHkgb25lIGRpZ2l0IGFuZCBzZXBhcmF0b3IgY2hhcmFjdGVycy4gVGhlIG9uZSBkaWdpdCBpcwogICAgICAqIGFzc3VtZWQgdG8gYmUgdHJ1bmsgcHJlZml4LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tQcmVmaXhJc0lnbm9yYWJsZShmaW5hbCBTdHJpbmcgc3RyLApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQppbmRleCA4MzBhZjQ3Li4zOGY0NGQ4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVBob25lU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiAKIC8qKgogICogQSBsaXN0ZW5lciBjbGFzcyBmb3IgbW9uaXRvcmluZyBjaGFuZ2VzIGluIHNwZWNpZmljIHRlbGVwaG9ueSBzdGF0ZXMKQEAgLTI4NCw3ICsyODUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgb25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsIGludCBuZXR3b3JrVHlwZSkgewotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIExJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUsIHN0YXRlLCBuZXR3b3JrVHlwZSwgbnVsbCkuCisgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSwgc3RhdGUsIG5ldHdvcmtUeXBlKS4KICAgICAgICAgICAgICAgICAgICAgc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCmluZGV4IGY1ZTk3NTEuLjk1MzY5NmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JU21zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDb25zdGFudHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc1Jhd0RhdGE7CkBAIC0zMyw3ICszMiw3IEBACiAvKgogICogVE9ETyhjb2RlIHJldmlldyk6IEN1cmlvdXMgcXVlc3Rpb24uLi4gV2h5IGFyZSBhIGxvdCBvZiB0aGVzZQogICogbWV0aG9kcyBub3QgZGVjbGFyZWQgYXMgc3RhdGljLCBzaW5jZSB0aGV5IGRvIG5vdCBzZWVtIHRvIHJlcXVpcmUKLSAqIGFueSBsb2NhbCBvYmplY3Qgc3RhdGU/ICBBc3N1bWVkbHkgdGhpcyBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0CisgKiBhbnkgbG9jYWwgb2JqZWN0IHN0YXRlPyAgUHJlc3VtYWJseSB0aGlzIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQKICAqIGludGVyZmVyaW5nIHdpdGggdGhlIEFQSS4uLgogICovCiAKQEAgLTQyLDcgKzQxLDggQEAKICAqIEdldCB0aGlzIG9iamVjdCBieSBjYWxsaW5nIHRoZSBzdGF0aWMgbWV0aG9kIFNtc01hbmFnZXIuZ2V0RGVmYXVsdCgpLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU21zTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU21zTWFuYWdlciBzSW5zdGFuY2U7CisgICAgLyoqIFNpbmdsZXRvbiBvYmplY3QgY29uc3RydWN0ZWQgZHVyaW5nIGNsYXNzIGluaXRpYWxpemF0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNtc01hbmFnZXIgc0luc3RhbmNlID0gbmV3IFNtc01hbmFnZXIoKTsKIAogICAgIC8qKgogICAgICAqIFNlbmQgYSB0ZXh0IGJhc2VkIFNNUy4KQEAgLTUyLDggKzUyLDggQEAKICAgICAgKiAgdGhlIGN1cnJlbnQgZGVmYXVsdCBTTVNDCiAgICAgICogQHBhcmFtIHRleHQgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgotICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzwvY29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT48YnI+CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICAgKiBAcGFyYW0gc2VudEludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwogICAgICAqICAgYnJvYWRjYXN0IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBwYXJ0IGhhcyBiZWVuIHNlbnQuCi0gICAgICogICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgICogICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKQEAgLTE3OCw4ICsxNzgsOCBAQAogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0bwogICAgICAqIEBwYXJhbSBkYXRhIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KLSAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICogIHRoZSBleHRyYSAiZXJyb3JDb2RlIiBjb250YWluaW5nIGEgcmFkaW8gdGVjaG5vbG9neSBzcGVjaWZpYyB2YWx1ZSwKICAgICAgKiAgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcuPGJyPgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwogICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudC4gIFRoZQpAQCAtMjI0LDkgKzIyNCw2IEBACiAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgU21zTWFuYWdlcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU21zTWFuYWdlciBnZXREZWZhdWx0KCkgewotICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBTbXNNYW5hZ2VyKCk7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YQppbmRleCBhMjg0ZWE1Li4wNzQ2NTYyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5TdWJtaXRQZHVCYXNlOwpAQCAtNTQsNiArNTMsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR183QklUID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR184QklUID0gMjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR18xNkJJVCA9IDM7CisgICAgLyoqCisgICAgICogQGhpZGUgVGhpcyB2YWx1ZSBpcyBub3QgZGVmaW5lZCBpbiBnbG9iYWwgc3RhbmRhcmQuIE9ubHkgaW4gS29yZWEsIHRoaXMgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19LU0M1NjAxID0gNDsKIAogICAgIC8qKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGF5bG9hZCBieXRlcyBwZXIgbWVzc2FnZSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9VU0VSX0RBVEFfQllURVMgPSAxNDA7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEKaW5kZXggMjdlMDhkNC4uMjM3MGFkZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1RlbGVwaG9ueU1hbmFnZXIuamF2YQpAQCAtOTEyLDQgKzkxMiwyNSBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzICJ2b2ljZSBjYXBhYmxlIi4KKyAgICAgKiA8cD4KKyAgICAgKiAiVm9pY2UgY2FwYWJsZSIgbWVhbnMgdGhhdCB0aGlzIGRldmljZSBzdXBwb3J0cyBjaXJjdWl0LXN3aXRjaGVkCisgICAgICogKGkuZS4gdm9pY2UpIHBob25lIGNhbGxzIG92ZXIgdGhlIHRlbGVwaG9ueSBuZXR3b3JrLCBhbmQgaXMgYWxsb3dlZAorICAgICAqIHRvIGRpc3BsYXkgdGhlIGluLWNhbGwgVUkgd2hpbGUgYSBjZWxsdWxhciB2b2ljZSBjYWxsIGlzIGFjdGl2ZS4KKyAgICAgKiBUaGlzIHdpbGwgYmUgZmFsc2Ugb24gImRhdGEgb25seSIgZGV2aWNlcyB3aGljaCBjYW4ndCBtYWtlIHZvaWNlCisgICAgICogY2FsbHMgYW5kIGRvbid0IHN1cHBvcnQgYW55IGluLWNhbGwgVUkuCisgICAgICogPHA+CisgICAgICogTm90ZTogdGhlIG1lYW5pbmcgb2YgdGhpcyBmbGFnIGlzIHN1YnRseSBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgICAgKiBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWSBzeXN0ZW0gZmVhdHVyZSwgd2hpY2ggaXMgYXZhaWxhYmxlCisgICAgICogb24gYW55IGRldmljZSB3aXRoIGEgdGVsZXBob255IHJhZGlvLCBldmVuIGlmIHRoZSBkZXZpY2UgaXMKKyAgICAgKiBkYXRhLW9ubHkuCisgICAgICoKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSByZXZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZvaWNlQ2FwYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ192b2ljZV9jYXBhYmxlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mby5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxlckluZm8uamF2YQppbmRleCAzNjBkMzVlLi5jNjdiOTk1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mby5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvLmphdmEKQEAgLTcxLDYgKzcxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CiAgICAgcHVibGljIFN0cmluZyBwaG9uZU51bWJlcjsKKyAgICBwdWJsaWMgU3RyaW5nIG5vbWFsaXplZE51bWJlcjsKIAogICAgIHB1YmxpYyBTdHJpbmcgY25hcE5hbWU7CiAgICAgcHVibGljIGludCBudW1iZXJQcmVzZW50YXRpb247CkBAIC0xNTEsNiArMTUyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGluZm8ucGhvbmVOdW1iZXIgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAvLyBMb29rIGZvciB0aGUgbm9ybWFsaXplZCBudW1iZXIKKyAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChQaG9uZUxvb2t1cC5OT1JNQUxJWkVEX05VTUJFUik7CisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubm9tYWxpemVkTnVtYmVyID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGxhYmVsL3R5cGUgY29tYm8KICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChQaG9uZUxvb2t1cC5MQUJFTCk7CiAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ICE9IC0xKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mb0FzeW5jUXVlcnkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeS5qYXZhCmluZGV4IDI1Y2E1NTkuLmE5Njc4NTAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeS5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5RGV0ZWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKQEAgLTIzMiw3ICsyMzMsMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIG51bWJlciBlbnRlcmVkIGJ5IHRoZSB1c2VyIGZvciBkaXNwbGF5LgogICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGN3Lm51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvLnBob25lTnVtYmVyID0gUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoY3cubnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IChDb3VudHJ5RGV0ZWN0b3IpIG1RdWVyeUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT1VOVFJZX0RFVEVDVE9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvLnBob25lTnVtYmVyID0gUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoY3cubnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGVySW5mby5ub21hbGl6ZWROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKS5nZXRDb3VudHJ5SXNvKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCmluZGV4IDVkZTA0MjYuLjI3YTRkY2EgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCkBAIC0yNyw4ICsyNyw4IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZHNJbnRlcmZhY2UgewogICAgIGVudW0gUmFkaW9TdGF0ZSB7Ci0gICAgICAgIFJBRElPX09GRiwgICAgICAgICAvKiBSYWRpbyBleHBsaWN0bHkgcG93ZXJlZCBvZmYgKGVnIENGVU49MCkgKi8KLSAgICAgICAgUkFESU9fVU5BVkFJTEFCTEUsIC8qIFJhZGlvIHVuYXZhaWxhYmxlIChlZywgcmVzZXR0aW5nIG9yIG5vdCBib290ZWQpICovCisgICAgICAgIFJBRElPX09GRiwgICAgICAgICAvKiBSYWRpbyBleHBsaWNpdGx5IHBvd2VyZWQgb2ZmIChlLmcuIENGVU49MCkgKi8KKyAgICAgICAgUkFESU9fVU5BVkFJTEFCTEUsIC8qIFJhZGlvIHVuYXZhaWxhYmxlIChlLmcuIHJlc2V0dGluZyBvciBub3QgYm9vdGVkKSAqLwogICAgICAgICBTSU1fTk9UX1JFQURZLCAgICAgLyogUmFkaW8gaXMgb24sIGJ1dCB0aGUgU0lNIGludGVyZmFjZSBpcyBub3QgcmVhZHkgKi8KICAgICAgICAgU0lNX0xPQ0tFRF9PUl9BQlNFTlQsICAvKiBTSU0gUElOIGxvY2tlZCwgUFVLIHJlcXVpcmVkLCBuZXR3b3JrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYWxpemF0aW9uLCBvciBTSU0gYWJzZW50ICovCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAvLyBTZWUgMjcuMDA3ICtDQ0ZDIG9yICtDTENLCiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX05PTkUgICAgID0gMDsgLy8gbm8gdXNlciBpbnB1dAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19WT0lDRSAgICA9ICgxIDw8IDApOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19EQVRBICAgICA9ICgxIDw8IDEpOyAvL3N5bm95bSBmb3IgMTYrMzIrNjQrMTI4CisgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEEgICAgID0gKDEgPDwgMSk7IC8vc3lub255bSBmb3IgMTYrMzIrNjQrMTI4CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0ZBWCAgICAgID0gKDEgPDwgMik7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX1NNUyAgICAgID0gKDEgPDwgMyk7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEFfU1lOQyA9ICgxIDw8IDQpOwpAQCAtOTUyLDE5ICs5NTIsMTkgQEAKICAgICB2b2lkIHdyaXRlU21zVG9SdWltKGludCBzdGF0dXMsIFN0cmluZyBwZHUsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKICAgICAgKiBAcGFyYW0gYXBuCiAgICAgICogQHBhcmFtIHVzZXIKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQKICAgICAgKiBAcGFyYW0gcmVzcG9uc2UKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHZvaWQgc2V0dXBEZWZhdWx0UERQKFN0cmluZyBhcG4sIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKICAgICAgKiBAcGFyYW0gY2lkCiAgICAgICogQHBhcmFtIHJlc3BvbnNlCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0UERQKGludCBjaWQsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgdm9pZCBzZXRSYWRpb1Bvd2VyKGJvb2xlYW4gb24sIE1lc3NhZ2UgcmVzcG9uc2UpOwpAQCAtOTc0LDcgKzk3NCw3IEBACiAgICAgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ0NkbWFTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgY2F1c2UsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogcGFyYW1ldGVycyBlcXVpdmlsaWVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCisgICAgICogcGFyYW1ldGVycyBlcXVpdmFsZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKICAgICAgKiByZXNwb25zZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdAogICAgICAqIHJlc3BvbnNlLm9iai51c2VyT2JqIHdpbGwgYmUgYSBJY2NJb1Jlc3VsdCBvbiBzdWNjZXNzCiAgICAgICovCkBAIC0xMDc5LDcgKzEwNzksNyBAQAogCiAgICAgLyoqCiAgICAgICogKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0IHdpbGwgYmUgYW4gSW50ZWdlciByZXByZXNlbnRpbmcKLSAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VyaXZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKKyAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VydmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQogICAgICAqCiAgICAgICogQHBhcmFtIGZhY2lsaXR5IG9uZSBvZiBDQl9GQUNJTFRZXyoKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQgcGFzc3dvcmQgb3IgIiIgaWYgbm90IHJlcXVpcmVkCkBAIC0xMTUyLDcgKzExNTIsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBlbmFibGUvZGlzYWJsZSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIHdoZW4KLSAgICAgKiBsb2NhdGlvbiBpbmZvcm1hdGVpb24gKGxhYyBhbmQvb3IgY2lkKSBoYXMgY2hhbmdlZC4KKyAgICAgKiBsb2NhdGlvbiBpbmZvcm1hdGlvbiAobGFjIGFuZC9vciBjaWQpIGhhcyBjaGFuZ2VkLgogICAgICAqCiAgICAgICogQHBhcmFtIGVuYWJsZSB0cnVlIHRvIGVuYWJsZSwgZmFsc2UgdG8gZGlzYWJsZQogICAgICAqIEBwYXJhbSByZXNwb25zZSBjYWxsYmFjayBtZXNzYWdlCkBAIC0xMTgzLDcgKzExODMsNyBAQAogCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRvIHRoZSB2ZW5kb3IgcmlsIHRoYXQgU3RrU2VydmljZSBpcyBydW5uaW5nCi0gICAgICogcmFuZCBpcyBlYWR5IHRvIHJlY2VpdmUgUklMX1VOU09MX1NUS19YWFhYIGNvbW1hbmRzLgorICAgICAqIGFuZCBpcyByZWFkeSB0byByZWNlaXZlIFJJTF9VTlNPTF9TVEtfWFhYWCBjb21tYW5kcy4KICAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHQgY2FsbGJhY2sgbWVzc2FnZQogICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQppbmRleCA2NjM0MDE3Li4xODVkNDEzIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQpAQCAtMjEsMTEgKzIxLDIwIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IaWVyYXJjaGljYWxTdGF0ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTsKIAoraW1wb3J0IGFuZHJvaWQubmV0LkxpbmtBZGRyZXNzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIAoraW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkludGVyZmFjZUFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CisKIC8qKgogICoge0BoaWRlfQogICoKQEAgLTYwLDcgKzY5LDcgQEAKICAqICAgICAgICBFVkVOVF9HRVRfTEFTVF9GQUlMX0RPTkUsCiAgKiAgICAgICAgRVZFTlRfREVBQ1RJVkFURV9ET05FLgogICogICAgIH0KLSAqICAgKysgIyBtSW5hY3RpdmVTdGF0ZSAKKyAqICAgKysgIyBtSW5hY3RpdmVTdGF0ZQogICogICAgICAgIGUoZG9Ob3RpZmljYXRpb25zKQogICogICAgICAgIHgoY2xlYXJOb3RpZmljYXRpb25zKSB7CiAgKiAgICAgICAgICAgIEVWRU5UX1JFU0VUIHsgbm90aWZpeURpc2Nvbm5lY3RDb21wbGV0ZWQgfS4KQEAgLTI1NSwxMCArMjY0LDggQEAKICAgICBwcm90ZWN0ZWQgaW50IG1UYWc7CiAgICAgcHJvdGVjdGVkIFBob25lQmFzZSBwaG9uZTsKICAgICBwcm90ZWN0ZWQgaW50IGNpZDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGludGVyZmFjZU5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBpcEFkZHJlc3M7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBnYXRld2F5QWRkcmVzczsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZG5zU2VydmVyczsKKyAgICBwcm90ZWN0ZWQgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CisgICAgcHJvdGVjdGVkIExpbmtDYXBhYmlsaXRpZXMgbUNhcGFiaWxpdGllcyA9IG5ldyBMaW5rQ2FwYWJpbGl0aWVzKCk7CiAgICAgcHJvdGVjdGVkIGxvbmcgY3JlYXRlVGltZTsKICAgICBwcm90ZWN0ZWQgbG9uZyBsYXN0RmFpbFRpbWU7CiAgICAgcHJvdGVjdGVkIEZhaWxDYXVzZSBsYXN0RmFpbENhdXNlOwpAQCAtMjgzLDggKzI5MCw2IEBACiAgICAgICAgIGlmIChEQkcpIGxvZygiRGF0YUNvbm5lY3Rpb24gY29uc3RydWN0b3IgRSIpOwogICAgICAgICB0aGlzLnBob25lID0gcGhvbmU7CiAgICAgICAgIHRoaXMuY2lkID0gLTE7Ci0gICAgICAgIHRoaXMuZG5zU2VydmVycyA9IG5ldyBTdHJpbmdbMl07Ci0KICAgICAgICAgY2xlYXJTZXR0aW5ncygpOwogCiAgICAgICAgIHNldERiZyhmYWxzZSk7CkBAIC0zNzcsMTEgKzM4Miw3IEBACiAgICAgICAgIHRoaXMubGFzdEZhaWxUaW1lID0gLTE7CiAgICAgICAgIHRoaXMubGFzdEZhaWxDYXVzZSA9IEZhaWxDYXVzZS5OT05FOwogCi0gICAgICAgIGludGVyZmFjZU5hbWUgPSBudWxsOwotICAgICAgICBpcEFkZHJlc3MgPSBudWxsOwotICAgICAgICBnYXRld2F5QWRkcmVzcyA9IG51bGw7Ci0gICAgICAgIGRuc1NlcnZlcnNbMF0gPSBudWxsOwotICAgICAgICBkbnNTZXJ2ZXJzWzFdID0gbnVsbDsKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MTYsMzUgKzQxNyw2NyBAQAogLy8gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3BvbnNlLmxlbmd0aDsgaSsrKSB7CiAvLyAgICAgICAgICAgICAgICBsb2coIiAgcmVzcG9uc2VbIiArIGkgKyAiXT0nIiArIHJlc3BvbnNlW2ldICsgIiciKTsKIC8vICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdGFydCB3aXRoIGNsZWFuIG5ldHdvcmsgcHJvcGVydGllcyBhbmQgaWYgd2UgaGF2ZQorICAgICAgICAgICAgLy8gYSBmYWlsdXJlIHdlJ2xsIGNsZWFyIGFnYWluIGF0IHRoZSBib3R0b20gb2YgdGhpcyBjb2RlLgorICAgICAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKICAgICAgICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgICAgIGNpZCA9IEludGVnZXIucGFyc2VJbnQocmVzcG9uc2VbMF0pOwotICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUgPSByZXNwb25zZVsxXTsKLSAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgICAgICBpcEFkZHJlc3MgPSByZXNwb25zZVsyXTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHJlc3BvbnNlWzFdOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LlNVQ0NFU1M7CisKKyAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIm5ldC4iICsgaW50ZXJmYWNlTmFtZSArICIuIjsKLSAgICAgICAgICAgICAgICAgICAgZ2F0ZXdheUFkZHJlc3MgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZ3ciKTsKKworICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIG5ldHdvcmtJbnRlcmZhY2UgPSBOZXR3b3JrSW50ZXJmYWNlLmdldEJ5TmFtZShpbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuc2V0SW50ZXJmYWNlTmFtZShpbnRlcmZhY2VOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBHZXQgZ2F0ZXdheSBhbmQgZG5zIHZpYSBSSUwgaW50ZXJmYWNlIG5vdCBwcm9wZXJ0eT8KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGdhdGV3YXlBZGRyZXNzID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJlZml4ICsgImd3Iik7CisgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLnNldEdhdGV3YXkoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGdhdGV3YXlBZGRyZXNzKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJbnRlcmZhY2VBZGRyZXNzIGFkZHIgOiBuZXR3b3JrSW50ZXJmYWNlLmdldEludGVyZmFjZUFkZHJlc3NlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5hZGRMaW5rQWRkcmVzcyhuZXcgTGlua0FkZHJlc3MoYWRkcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEdldCBnYXRld2F5IGFuZCBkbnMgdmlhIFJJTCBpbnRlcmZhY2Ugbm90IHByb3BlcnR5PworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG5zU2VydmVyc1tdID0gbmV3IFN0cmluZ1syXTsKICAgICAgICAgICAgICAgICAgICAgZG5zU2VydmVyc1swXSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJkbnMxIik7CiAgICAgICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMV0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coImludGVyZmFjZT0iICsgaW50ZXJmYWNlTmFtZSArICIgaXBBZGRyZXNzPSIgKyBpcEFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZ2F0ZXdheT0iICsgZ2F0ZXdheUFkZHJlc3MgKyAiIEROUzE9IiArIGRuc1NlcnZlcnNbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRE5TMj0iICsgZG5zU2VydmVyc1sxXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgICAgICBpZiAoaXNEbnNPayhkbnNTZXJ2ZXJzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLmFkZERucyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZG5zU2VydmVyc1swXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuYWRkRG5zKEluZXRBZGRyZXNzLmdldEJ5TmFtZShkbnNTZXJ2ZXJzWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5FUlJfQmFkRG5zOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIm9uU2V0dXBDb21wbGV0ZWQ6IFVua25vd0hvc3RFeGNlcHRpb24gIiArIGUxKTsKKyAgICAgICAgICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9PdGhlcjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJvblNldHVwQ29tcGxldGVkOiBTb2NrZXRFeGNlcHRpb24gIiArIGUyKTsKKyAgICAgICAgICAgICAgICAgICAgZTIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9PdGhlcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygib25TZXR1cENvbXBsZXRlZDogZXJyb3I7IGV4cGVjdGVkIG51bWJlciBvZiByZXNwb25zZXMgPj0gMiB3YXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9PdGhlcjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgc28gY2xlYXIgcHJvcGVydGllcworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBTZXR1cFJlc3VsdC5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgbG9nKCJvblNldHVwQ29tcGxldGVkIHdpdGggYW4gZXJyb3IgY2xlYXJpbmcgTGlua1Byb3BlcnRpZXMiKTsKKyAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbGlua1Byb3BlcnRpZXM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREJHKSBsb2coIkRhdGFDb25uZWN0aW9uIHNldHVwIHJlc3VsdD0nIiArIHJlc3VsdCArICInIG9uIGNpZD0iICsgY2lkKTsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgbG9nKCJEYXRhQ29ubmVjdGlvbiBzZXR1cCByZXN1bHQ9JyIgKyByZXN1bHQgKyAiJyBvbiBjaWQ9IiArIGNpZCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFNldHVwUmVzdWx0LlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBsb2coIkxpbmtQcm9wZXJ0aWVzOiAiICsgbUxpbmtQcm9wZXJ0aWVzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC02MDYsNyArNjM5LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVSUl9CYWREbnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBzdWNjZWVkZWQgYnV0IEROUyBpbmZvIGlzIGJhZCBzbyBkaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuUERQX0JBRF9ETlNfQUREUkVTUywgZG5zU2VydmVyc1swXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBkbnNBZGRyZXNzZXNTYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBhZGRyIDogbUxpbmtQcm9wZXJ0aWVzLmdldERuc2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRuc0FkZHJlc3Nlc1NiLmxlbmd0aCgpICE9IDApIGRuc0FkZHJlc3Nlc1NiLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNTYi5hcHBlbmQoYWRkci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRuc0FkZHJlc3Nlc1NiLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5zQWRkcmVzc2VzU2IuYXBwZW5kKCJuby1kbnMtYWRkcmVzc2VzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRXZlbnRMb2dUYWdzLlBEUF9CQURfRE5TX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNTYi50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyRG93bkRhdGEoY3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ0JhZERuc1N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg3MywzMSArOTE1LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgaW50ZXJmYWNlIG5hbWUgYXMgYSBzdHJpbmcuCisgICAgICogUmV0dXJuIHRoZSBMaW5rUHJvcGVydGllcyBmb3IgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgTGlua1Byb3BlcnRpZXMsIGlzIG5ldmVyIG51bGwuCiAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VOYW1lOworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rUHJvcGVydGllcyhtTGlua1Byb3BlcnRpZXMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGlwIGFkZHJlc3MgYXMgYSBzdHJpbmcuCisgICAgICogQSBjYXBhYmlsaXR5IGlzIGFuIEludGVnZXIvU3RyaW5nIHBhaXIsIHRoZSBjYXBhYmlsaXRpZXMKKyAgICAgKiBhcmUgZGVmaW5lZCBpbiB0aGUgY2xhc3MgTGlua1NvY2tldCNLZXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGNvbm5lY3Rpb25zIGNhcGFiaWxpdGllcywgbWF5IGJlIGVtcHR5IGJ1dCBuZXZlciBudWxsLgogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXBBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gaXBBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGdhdGV3YXkgYWRkcmVzcyBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdhdGV3YXlBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gZ2F0ZXdheUFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBhc3NvY2lhdGVkIEROUyBhZGRyZXNzZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoKSB7Ci0gICAgICAgIHJldHVybiBkbnNTZXJ2ZXJzOworICAgIHB1YmxpYyBMaW5rQ2FwYWJpbGl0aWVzIGdldExpbmtDYXBhYmlsaXRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua0NhcGFiaWxpdGllcyhtQ2FwYWJpbGl0aWVzKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCAyNjViZjdlLi41MjgzOWJlIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0xNywxMCArMTcsMTEgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC0yOCw2ICsyOSw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCisKIC8qKgogICoge0BoaWRlfQogICoKQEAgLTE4OCw3ICsxOTAsMTYgQEAKICAgICAvKiogQ0lEIG9mIGFjdGl2ZSBkYXRhIGNvbm5lY3Rpb24gKi8KICAgICBwcm90ZWN0ZWQgaW50IGNpZEFjdGl2ZTsKIAotICAgLyoqCisgICAgLyoqIGluZGljYXRpb24gb2Ygb3VyIGF2YWlsYWJpbGl0eSAocHJlY29uZGl0aW9ucyB0byB0cnlzZXR1cERhdGEgYXJlIG1ldCkgKiovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUF2YWlsYWJpbGl0eSA9IGZhbHNlOworCisgICAgLyoqIFRoZSBsaW5rIHByb3BlcnRpZXMgKGRucywgZ2F0ZXdheSwgaXAsIGV0YykgKi8KKyAgICBwcm90ZWN0ZWQgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CisKKyAgICAvKiogVGhlIGxpbmsgY2FwYWJpbGl0aWVzICovCisgICAgcHJvdGVjdGVkIExpbmtDYXBhYmlsaXRpZXMgbUxpbmtDYXBhYmlsaXRpZXMgPSBuZXcgTGlua0NhcGFiaWxpdGllcygpOworCisgICAgLyoqCiAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAqLwogICAgIHByb3RlY3RlZCBEYXRhQ29ubmVjdGlvblRyYWNrZXIoUGhvbmVCYXNlIHBob25lKSB7CkBAIC00MTEsMTcgKzQyMiwxMjUgQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBBcnJheUxpc3Q8RGF0YUNvbm5lY3Rpb24+IGdldEFsbERhdGFDb25uZWN0aW9ucygpOwogCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0RG5zU2VydmVycyhTdHJpbmcgYXBuVHlwZSk7Ci0KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRTdGF0ZShTdGF0ZSBzKTsKIAotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0VuYWJsZWQoaW50IGlkKSB7CisgICAgcHJvdGVjdGVkIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIGludCBpZCA9IGFwblR5cGVUb0lkKGFwblR5cGUpOworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzKG1MaW5rUHJvcGVydGllcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlua0NhcGFiaWxpdGllcyBnZXRMaW5rQ2FwYWJpbGl0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIGludCBpZCA9IGFwblR5cGVUb0lkKGFwblR5cGUpOworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtDYXBhYmlsaXRpZXMobUxpbmtDYXBhYmlsaXRpZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5rQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExpbmtQcm9wZXJ0aWVzIGZvciB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhlIExpbmtQcm9wZXJ0aWVzLCBpcyBuZXZlciBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhEYXRhQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjYXBhYmlsaXR5IGlzIGFuIEludGVnZXIvU3RyaW5nIHBhaXIsIHRoZSBjYXBhYmlsaXRpZXMKKyAgICAgKiBhcmUgZGVmaW5lZCBpbiB0aGUgY2xhc3MgTGlua1NvY2tldCNLZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgY29ubmVjdGlvbnMgY2FwYWJpbGl0aWVzLCBtYXkgYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpbmtDYXBhYmlsaXRpZXMgZ2V0TGlua0NhcGFiaWxpdGllcyhEYXRhQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldExpbmtDYXBhYmlsaXRpZXMoKTsKKyAgICB9CisKKyAgICAvLyB0ZWxsIGFsbCBhY3RpdmUgYXBucyBvZiB0aGUgY3VycmVudCBjb25kaXRpb24KKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIGZvciAoaW50IGlkID0gMDsgaWQgPCBBUE5fTlVNX1RZUEVTOyBpZCsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbaWRdKSB7CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShpZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkocmVhc29uKTsKKyAgICB9CisKKyAgICAvLyBhIG5ldyBBUE4gaGFzIGdvbmUgYWN0aXZlIGFuZCBuZWVkcyB0byBzZW5kIGV2ZW50cyB0byBjYXRjaCB1cCB3aXRoIHRoZSBjdXJyZW50IGNvbmRpdGlvbgorICAgIHByaXZhdGUgdm9pZCBub3RpZnlBcG5JZFVwVG9DdXJyZW50KFN0cmluZyByZWFzb24sIGludCBhcG5JZCkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIElETEU6CisgICAgICAgICAgICBjYXNlIElOSVRJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RJTkc6CisgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgorICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNpbmNlIHdlIG5vcm1hbGx5IGRvbid0IHNlbmQgaW5mbyB0byBhIGRpc2Nvbm5lY3RlZCBBUE4sIHdlIG5lZWQgdG8gZG8gdGhpcyBzcGVjaWFsbHkKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoU3RyaW5nIHJlYXNvbiwgaW50IGFwbklkKSB7CisgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvLyBkaXNhYmxlZCBhcG4ncyBzdGlsbCBuZWVkIGF2YWlsL3VuYXZhaWwgbm90aWZpY2lhdGlvbnMgLSBzZW5kIHRoZW0gb3V0CisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KFN0cmluZyByZWFzb24sIGJvb2xlYW4gYXZhaWxhYmlsaXR5KSB7CisgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IGF2YWlsYWJpbGl0eSkgcmV0dXJuOworICAgICAgICBtQXZhaWxhYmlsaXR5ID0gYXZhaWxhYmlsaXR5OworICAgICAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQVBOX05VTV9UWVBFUzsgaWQrKykgeworICAgICAgICAgICAgaWYgKCFpc0FwbklkRW5hYmxlZChpZCkpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBcG5JZERpc2Nvbm5lY3RlZChyZWFzb24sIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIGhhZCBhbiBhdmFpbGFiaWxpdHkgY2hhbmdlIC0gdGVsbCB0aGUgbGlzdGVuZXJzCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBlaXRoZXIganVzdCB0dXJuZWQgYWxsIG9mZiBiZWNhdXNlIHdlIGxvc3QgYXZhaWxhYmlsaXR5CisgICAgICAgIC8vIG9yIGFsbCB3ZXJlIG9mZiBhbmQgY291bGQgbm93IGdvIG9uLCBzbyBvbmx5IGhhdmUgb2ZmIGFwbnMgdG8gd29ycnkgYWJvdXQKKyAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgaXNEYXRhUG9zc2libGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9ubHkgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB3ZSByZXBvcnQgdGhhdCBkYXRhIGNvbm5lY3Rpdml0eSBpcyBub3QKKyAgICAgKiBwb3NzaWJsZSBhcmUKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRhdGEgaXMgZGlzYWxsb3dlZCAocm9hbWluZywgcG93ZXIgc3RhdGUsIHZvaWNlIGNhbGwsIGV0YykuPC9saT4KKyAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBpcyB7QGNvZGUgRElTQ09OTkVDVEVEfSBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgorICAgICAqIGhhdmluZyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbm5lY3Rpdml0eS4gSW4gb3RoZXIgd29yZHMsIGRhdGEgaXMgbm90IGF2YWlsYWJsZQorICAgICAqIGJlY2F1c2UgdGhlIHBob25lIGlzIG91dCBvZiBjb3ZlcmFnZSBvciBzb21lIGxpa2UgcmVhc29uLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhUG9zc2libGUoKSB7CisgICAgICAgIGJvb2xlYW4gcG9zc2libGUgPSAoaXNEYXRhQWxsb3dlZCgpICYmCisgICAgICAgICAgICAhKGdldERhdGFFbmFibGVkKCkgJiYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCB8fCBzdGF0ZSA9PSBTdGF0ZS5JRExFKSkpOworICAgICAgICBpZiAoIXBvc3NpYmxlICYmIERCRyAmJiBpc0RhdGFBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgcG9zc2libGUuICBObyBjb3ZlcmFnZTogZGF0YVN0YXRlID0gIiArIHN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG9zc2libGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpOworCisgICAgcHVibGljIGJvb2xlYW4gaXNBcG5UeXBlRW5hYmxlZChTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gaXNBcG5JZEVuYWJsZWQoYXBuVHlwZVRvSWQoYXBuVHlwZSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0FwbklkRW5hYmxlZChpbnQgaWQpIHsKICAgICAgICAgaWYgKGlkICE9IEFQTl9JTlZBTElEX0lEKSB7CiAgICAgICAgICAgICByZXR1cm4gZGF0YUVuYWJsZWRbaWRdOwogICAgICAgICB9CkBAIC00NDQsMjIgKzU2MywyMSBAQAogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJlbmFibGVBcG5UeXBlKCIrdHlwZSsiKSwgaXNBcG5UeXBlQWN0aXZlID0gIgotICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiBhbmQgc3RhdGUgPSAiICsgc3RhdGUpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiZW5hYmxlQXBuVHlwZSgiICsgdHlwZSArICIpLCBpc0FwblR5cGVBY3RpdmUgPSAiCisgICAgICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiwgaXNBcG5JZEVuYWJsZWQgPSIgKyBpc0FwbklkRW5hYmxlZChpZCkgKworICAgICAgICAgICAgICAgICAgICAiIGFuZCBzdGF0ZSA9ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoIWlzQXBuVHlwZUF2YWlsYWJsZSh0eXBlKSkgewogICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInR5cGUgbm90IGF2YWlsYWJsZSIpOwogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBqdXN0IGJlY2F1c2UgaXQncyBhY3RpdmUgZG9lc24ndCBtZWFuIHdlIGhhZCBpdCBleHBsaWNpdGx5IHJlcXVlc3RlZCBiZWZvcmUKLSAgICAgICAgLy8gKGEgYnJvYWQgZGVmYXVsdCBtYXkgaGFuZGxlIG1hbnkgdHlwZXMpLiAgbWFrZSBzdXJlIHdlIG1hcmsgaXQgZW5hYmxlZAotICAgICAgICAvLyBzbyBpZiB0aGUgZGVmYXVsdCBpcyBkaXNhYmxlZCB3ZSBrZWVwIHRoZSBjb25uZWN0aW9uIGZvciBvdGhlcnMKLSAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSkgewotICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLklOSVRJTkcpIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ7CiAgICAgfQpAQCAtNDc4LDcgKzU5Niw3IEBACiAgICAgICAgIGlmIChpZCA9PSBBUE5fSU5WQUxJRF9JRCkgewogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQotICAgICAgICBpZiAoaXNFbmFibGVkKGlkKSkgeworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CiAgICAgICAgICAgICBzZXRFbmFibGVkKGlkLCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAoaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSkgewpAQCAtNDk1LDkgKzYxMywxMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkKGludCBpZCwgYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIiArCi0gICAgICAgICAgICAgICAgZGF0YUVuYWJsZWRbaWRdICsgIiBhbmQgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCk7Ci0KKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIgorICAgICAgICAgICAgICAgICAgICArIGRhdGFFbmFibGVkW2lkXSArICIgYW5kIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQpOworICAgICAgICB9CiAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShFVkVOVF9FTkFCTEVfTkVXX0FQTik7CiAgICAgICAgIG1zZy5hcmcxID0gaWQ7CiAgICAgICAgIG1zZy5hcmcyID0gKGVuYWJsZSA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CkBAIC01MDcsOSArNjI2LDggQEAKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgb25FbmFibGVBcG4oaW50IGFwbklkLCBpbnQgZW5hYmxlZCkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiRVZFTlRfQVBOX0VOQUJMRV9SRVFVRVNUICIgKyBhcG5JZCArICIsICIgKyBlbmFibGVkKTsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICIgZGF0YUVuYWJsZWQgPSAiICsgZGF0YUVuYWJsZWRbYXBuSWRdICsKLSAgICAgICAgICAgICAgICAgICAgIiwgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCArCi0gICAgICAgICAgICAgICAgICAgICIsIGlzQXBuVHlwZUFjdGl2ZSA9ICIgKyBpc0FwblR5cGVBY3RpdmUoYXBuSWRUb1R5cGUoYXBuSWQpKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiIGRhdGFFbmFibGVkID0gIiArIGRhdGFFbmFibGVkW2FwbklkXSArICIsIGVuYWJsZWRDb3VudCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlbmFibGVkQ291bnQgKyAiLCBpc0FwblR5cGVBY3RpdmUgPSAiICsgaXNBcG5UeXBlQWN0aXZlKGFwbklkVG9UeXBlKGFwbklkKSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChlbmFibGVkID09IEVOQUJMRUQpIHsKICAgICAgICAgICAgIGlmICghZGF0YUVuYWJsZWRbYXBuSWRdKSB7CkBAIC01MjAsNiArNjM4LDggQEAKICAgICAgICAgICAgIGlmICghaXNBcG5UeXBlQWN0aXZlKHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEFwblR5cGUgPSB0eXBlOwogICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vdGlmeUFwbklkVXBUb0N1cnJlbnQoUGhvbmUuUkVBU09OX0FQTl9TV0lUQ0hFRCwgYXBuSWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZGlzYWJsZQpAQCAtNTI4LDggKzY0OCwxNyBAQAogICAgICAgICAgICAgICAgIGVuYWJsZWRDb3VudC0tOwogICAgICAgICAgICAgICAgIGlmIChlbmFibGVkQ291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBvbkNsZWFuVXBDb25uZWN0aW9uKHRydWUsIFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSA9PSB0cnVlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgZGlzY29ubmVjdCBtc2cgbWFudWFsbHksIHNpbmNlIHRoZSBub3JtYWwgcm91dGUgd29udCBzZW5kCisgICAgICAgICAgICAgICAgLy8gaXQgKGl0J3Mgbm90IGVuYWJsZWQpCisgICAgICAgICAgICAgICAgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoUGhvbmUuUkVBU09OX0RBVEFfRElTQUJMRUQsIGFwbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbQVBOX0RFRkFVTFRfSURdID09IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgaXMgYW4gdWdseSB3YXkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBjb25uIC0gc2hvdWxkIGJlIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgYSByZWFsIGNvbnRlbnRpb24gbWFuYWdlciBhbmQgcG9saWN5IHRoYXQgZGlzY29ubmVjdHMgdGhlIGxvd2VyIHByaQorICAgICAgICAgICAgICAgICAgICAvLyBzdHVmZiBhcyBlbmFibGUgcmVxdWVzdHMgY29tZSBpbiBhbmQgcG9wcyB0aGVtIGJhY2sgb24gYXMgd2UgZGlzYWJsZSBiYWNrCisgICAgICAgICAgICAgICAgICAgIC8vIGRvd24gdG8gdGhlIGxvd2VyIHByaSBzdHVmZgogICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkQXBuVHlwZSA9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQ7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTc0LDkgKzcwMyw3IEBACiAgICAgICAgICAgICAgICAgb25UcnlTZXR1cERhdGEoUGhvbmUuUkVBU09OX0RBVEFfRU5BQkxFRCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9uQ2xlYW5VcENvbm5lY3Rpb24odHJ1ZSwgUGhvbmUuUkVBU09OX0RBVEFfRElTQUJMRUQpOwotICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YQppbmRleCAwNTdiYTBhLi42YTE2M2RkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGFuZHJvaWQubmV0LkxpbmtDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKQEAgLTkyLDI2ICs5NCw0NSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIC8vIHVzZSBhcG5UeXBlIGFzIHRoZSBrZXkgdG8gd2hpY2ggY29ubmVjdGlvbiB3ZSdyZSB0YWxraW5nIGFib3V0LgorICAgICAgICAvLyBwYXNzIGFwblR5cGUgYmFjayB1cCB0byBmZXRjaCBwYXJ0aWN1bGFyIGZvciB0aGlzIG9uZS4KICAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnkgPSBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKTsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBudWxsOworICAgICAgICBMaW5rQ2FwYWJpbGl0aWVzIGxpbmtDYXBhYmlsaXRpZXMgPSBudWxsOworICAgICAgICBpZiAoc3RhdGUgPT0gUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCkgeworICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMgPSBzZW5kZXIuZ2V0TGlua1Byb3BlcnRpZXMoYXBuVHlwZSk7CisgICAgICAgICAgICBsaW5rQ2FwYWJpbGl0aWVzID0gc2VuZGVyLmdldExpbmtDYXBhYmlsaXRpZXMoYXBuVHlwZSk7CisgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5pc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpLCByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG4oKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEFjdGl2ZUFwblR5cGVzKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRJbnRlcmZhY2VOYW1lKG51bGwpLAorICAgICAgICAgICAgICAgICAgICBhcG5UeXBlLAorICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgbGlua0NhcGFiaWxpdGllcywKICAgICAgICAgICAgICAgICAgICAgKCh0ZWxlcGhvbnkhPW51bGwpID8gdGVsZXBob255LmdldE5ldHdvcmtUeXBlKCkgOgotICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEdhdGV3YXkobnVsbCkpOworICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKaW5kZXggMzBlZTc3Yy4uZTQyODI3ZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKQEAgLTE2LDExICsxNiwxNCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKIC8qKgogICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjaGFyYWN0ZXIgc2V0IG1hcHBpbmcgYmV0d2VlbgogICogdGhlIEdTTSBTTVMgNy1iaXQgYWxwaGFiZXQgc3BlY2lmaWVkIGluIFRTIDIzLjAzOCA2LjIuMQpAQCAtMzIwLDcgKzMyMyw3IEBACiAKICAgICAgICAgICAgICAgICBnc21WYWwgPSAoMHg3ZiAmIChwZHVbb2Zmc2V0ICsgYnl0ZU9mZnNldF0gPj4gc2hpZnQpKTsKIAotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGNyb3NzZXMgYSBieXRlIGJvdW5kcnkKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBjcm9zc2VzIGEgYnl0ZSBib3VuZGFyeQogICAgICAgICAgICAgICAgIGlmIChzaGlmdCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG1zYiBiaXRzIHRvIDAKICAgICAgICAgICAgICAgICAgICAgZ3NtVmFsICY9IDB4N2YgPj4gKHNoaWZ0IC0gMSk7CkBAIC0zNTUsNiArMzU4LDMyIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKICAgICBnc204Qml0VW5wYWNrZWRUb1N0cmluZyhieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsICIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgR1NNIGFscGhhYmV0IHN0cmluZyB0aGF0J3Mgc3RvcmVkIGluIDgtYml0IHVucGFja2VkCisgICAgICogZm9ybWF0IChhcyBpdCBvZnRlbiBhcHBlYXJzIGluIFNJTSByZWNvcmRzKSBpbnRvIGEgU3RyaW5nCisgICAgICoKKyAgICAgKiBGaWVsZCBtYXkgYmUgcGFkZGVkIHdpdGggdHJhaWxpbmcgMHhmZidzLiBUaGUgZGVjb2RlIHN0b3BzCisgICAgICogYXQgdGhlIGZpcnN0IDB4ZmYgZW5jb3VudGVyZWQuCisgICAgICoKKyAgICAgKiBBZGRpdGlvbmFsbHksIGluIHNvbWUgY291bnRyeShleC4gS29yZWEpLCB0aGVyZSBhcmUgbm9uLUFTQ0lJIG9yIE1CQ1MgY2hhcmFjdGVycy4KKyAgICAgKiBJZiBhIGNoYXJhY3RlciBzZXQgaXMgZ2l2ZW4sIGNoYXJhY3RlcnMgaW4gZGF0YSBhcmUgdHJlYXQgYXMgTUJDUy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZworICAgIGdzbThCaXRVbnBhY2tlZFRvU3RyaW5nKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2hhcmFjdGVyc2V0KSB7CisgICAgICAgIGJvb2xlYW4gaXNNYmNzID0gZmFsc2U7CisgICAgICAgIENoYXJzZXQgY2hhcnNldCA9IG51bGw7CisgICAgICAgIEJ5dGVCdWZmZXIgbWJjc0J1ZmZlciA9IG51bGw7CisKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjaGFyYWN0ZXJzZXQpCisgICAgICAgICAgICAgICAgJiYgIWNoYXJhY3RlcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJ1cy1hc2NpaSIpCisgICAgICAgICAgICAgICAgJiYgQ2hhcnNldC5pc1N1cHBvcnRlZChjaGFyYWN0ZXJzZXQpKSB7CisgICAgICAgICAgICBpc01iY3MgPSB0cnVlOworICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShjaGFyYWN0ZXJzZXQpOworICAgICAgICAgICAgbWJjc0J1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMik7CisgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBwcmV2V2FzRXNjYXBlOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7CiAKQEAgLTM4MCw3ICs0MDksMTUgQEAKICAgICAgICAgICAgICAgICBpZiAocHJldldhc0VzY2FwZSkgewogICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKChjaGFyKWdzbUV4dGVuZGVkVG9DaGFyLmdldChjLCAnICcpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKChjaGFyKWdzbVRvQ2hhci5nZXQoYywgJyAnKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNNYmNzIHx8IGMgPCAweDgwIHx8IGkgKyAxID49IG9mZnNldCArIGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCgoY2hhcilnc21Ub0NoYXIuZ2V0KGMsICcgJykpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNNYmNzIG11c3QgYmUgdHJ1ZS4gU28gYm90aCBtYmNzQnVmZmVyIGFuZCBjaGFyc2V0IGFyZSBpbml0aWFsaXplZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1iY3NCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iY3NCdWZmZXIucHV0KGRhdGEsIGkrKywgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBtYmNzQnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoY2hhcnNldC5kZWNvZGUobWJjc0J1ZmZlcikudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcHJldldhc0VzY2FwZSA9IGZhbHNlOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKaW5kZXggMjMyODcxNy4uN2ExNTg3YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCkBAIC0yMzksOSArMjM5LDExIEBACiAgICAgU3RyaW5nIGdldENkbWFFcmlUZXh0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgQ0RNQSBwcm92aXNpb25pbmcgbmVlZHMgdG8gcnVuLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgc2VydmljZSBwcm92aXNpb25pbmcgbmVlZHMgdG8gcnVuLgorICAgICAqIE9ubHkgcmVsZXZhbnQgb24gc29tZSB0ZWNobm9sb2dpZXMsIG90aGVycyB3aWxsIGFsd2F5cworICAgICAqIHJldHVybiBmYWxzZS4KICAgICAgKi8KLSAgICBib29sZWFuIGdldENkbWFOZWVkc1Byb3Zpc2lvbmluZygpOworICAgIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CiAKICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdW5yZWFkIGNvdW50IG9mIHZvaWNlbWFpbHMKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbAppbmRleCA4N2U0YjUyLi42NDA3YTRlIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsCkBAIC0xNyw2ICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua0NhcGFiaWxpdGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2lnbmFsU3RyZW5ndGg7CkBAIC0zMiw4ICszNCw4IEBACiAgICAgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoYm9vbGVhbiBjZmkpOwogICAgIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KGludCBzdGF0ZSk7CiAgICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihpbnQgc3RhdGUsIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsCi0gICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBpbiBTdHJpbmdbXSBhcG5UeXBlcywgU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBuZXR3b3JrVHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBnYXRld2F5KTsKLSAgICB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pOworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIGluIExpbmtQcm9wZXJ0aWVzIGxpbmtQcm9wZXJ0aWVzLAorICAgICAgICAgICAgaW4gTGlua0NhcGFiaWxpdGllcyBsaW5rQ2FwYWJpbGl0aWVzLCBpbnQgbmV0d29ya1R5cGUpOworICAgIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogICAgIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKGluIEJ1bmRsZSBjZWxsTG9jYXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQppbmRleCA5NTdlZGRkLi5kZjU3OWIwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQpAQCAtMTYsMTMgKzE2LDE2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwotCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogCiAvKioKICAqIFZhcmlvdXMgbWV0aG9kcywgdXNlZnVsIGZvciBkZWFsaW5nIHdpdGggU0lNIGRhdGEuCkBAIC0xNTAsNiArMTUzLDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwogICAgIGFkblN0cmluZ0ZpZWxkVG9TdHJpbmcoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KICAgICAgICAgaWYgKGxlbmd0aCA+PSAxKSB7CiAgICAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdID09IChieXRlKSAweDgwKSB7CiAgICAgICAgICAgICAgICAgaW50IHVjc2xlbiA9IChsZW5ndGggLSAxKSAvIDI7CkBAIC0yMjUsNyArMjMxLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2UgPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCk7CisgICAgICAgIFN0cmluZyBkZWZhdWx0Q2hhcnNldCA9ICIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVmYXVsdENoYXJzZXQgPQorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZ3NtX2FscGhhYmV0X2RlZmF1bHRfY2hhcnNldCk7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSBFeGNlcHRpb24gYW5kIGRlZmF1bHRDaGFyc2V0IGlzIHNldCB0byBhIGVtcHR5IHN0cmluZy4KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIGRlZmF1bHRDaGFyc2V0LnRyaW0oKSk7CiAgICAgfQogCiAgICAgc3RhdGljIGludApAQCAtMjY3LDkgKzI4MSwxMSBAQAogCiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIFN0cmluZyBoZXhpZGVjaW1hbCBjaGFyYWN0ZXJzCisgICAgICogQ29udmVydHMgYSBieXRlIGFycmF5IGludG8gYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgY2hhcmFjdGVycy4KICAgICAgKgotICAgICAqIG51bGwgcmV0dXJucyBudWxsCisgICAgICogQHBhcmFtIGJ5dGVzIGFuIGFycmF5IG9mIGJ5dGVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYnl0ZXMgYXJyYXkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwogICAgIGJ5dGVzVG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCmluZGV4IDU1MzkwNTcuLjliMGFhM2MgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCkBAIC0yMywzNDYgKzIzLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRoZSB0YWJsZSBiZWxvdyBpcyBidWlsdCBmcm9tIHR3byByZXNvdXJjZXM6Ci0gKgotICogMSkgSVRVICJNb2JpbGUgTmV0d29yayBDb2RlIChNTkMpIGZvciB0aGUgaW50ZXJuYXRpb25hbAotICogICBpZGVudGlmaWNhdGlvbiBwbGFuIGZvciBtb2JpbGUgdGVybWluYWxzIGFuZCBtb2JpbGUgdXNlcnMiCi0gKiAgIHdoaWNoIGlzIGF2YWlsYWJsZSBhcyBhbiBhbm5leCB0byB0aGUgSVRVIG9wZXJhdGlvbmFsIGJ1bGxldGluCi0gKiAgIGF2YWlsYWJsZSBoZXJlOiBodHRwOi8vd3d3Lml0dS5pbnQvaXR1LXQvYnVsbGV0aW4vYW5uZXguaHRtbAotICoKLSAqIDIpIFRoZSBJU08gMzE2NiBjb3VudHJ5IGNvZGVzIGxpc3QsIGF2YWlsYWJsZSBoZXJlOgotICogICAgaHR0cDovL3d3dy5pc28ub3JnL2lzby9lbi9wcm9kcy1zZXJ2aWNlcy9pc28zMTY2bWEvMDJpc28tMzE2Ni1jb2RlLWxpc3RzL2luZGV4Lmh0bWwKLSAqCi0gKiBUaGlzIHRhYmxlIHdhcyB2ZXJpZmllZCAoMjggQXVnIDIwMDkpIGFnYWluc3QKLSAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9tb2JpbGVfY291bnRyeV9jb2RlcyB3aXRoIHRoZQotICogb25seSB1bnJlc29sdmVkIGRpc2NyZXBhbmN5IGJlaW5nIHRoYXQgdGhpcyBsaXN0IGhhcyBhbiBleHRyYSBlbnRyeQotICogKDQ2MSkgZm9yIENoaW5hLgotICoKLSAqIFRPRE86IENvbXBsZXRlIHRoZSBtYXBwaW5ncyBmb3IgdGltZXpvbmVzIGFuZCBsYW5ndWFnZS9sb2NhbGUgY29kZXMuCi0gKgotICogVGhlIGFjdHVhbCB0YWJsZSBkYXRhIHVzZWQgaW4gdGhlIEphdmEgY29kZSBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUKLSAqIGJlbG93IFB5dGhvbiBjb2RlIGZvciBlZmZpY2llbmN5LiAgVGhlIGluZm9ybWF0aW9uIGlzIGV4cGVjdGVkIHRvCi0gKiBiZSBzdGF0aWMsIGJ1dCBpZiBjaGFuZ2VzIGFyZSByZXF1aXJlZCwgdGhlIHRhYmxlIGluIHRoZSBweXRob24KLSAqIGNvZGUgY2FuIGJlIG1vZGlmaWVkIGFuZCB0aGUgdHJhaWxpbmcgY29kZSBydW4gdG8gcmUtZ2VuZXJhdGUgdGhlCi0gKiB0YWJsZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSBKYXZhLgotCi1tY2NfdGFibGUgPSBbCi0gICgyMDIsICdncicsIDIsICdHcmVlY2UnKSwKLSAgKDIwNCwgJ25sJywgMiwgJ0V1cm9wZS9BbXN0ZXJkYW0nLCAnbmwnLCAxMywgJ05ldGhlcmxhbmRzIChLaW5nZG9tIG9mIHRoZSknKSwKLSAgKDIwNiwgJ2JlJywgMiwgJ0JlbGdpdW0nKSwKLSAgKDIwOCwgJ2ZyJywgMiwgJ0V1cm9wZS9QYXJpcycsICdmcicsICdGcmFuY2UnKSwKLSAgKDIxMiwgJ21jJywgMiwgJ01vbmFjbyAoUHJpbmNpcGFsaXR5IG9mKScpLAotICAoMjEzLCAnYWQnLCAyLCAnQW5kb3JyYSAoUHJpbmNpcGFsaXR5IG9mKScpLAotICAoMjE0LCAnZXMnLCAyLCAnRXVyb3BlL01hZHJpZCcsICdlcycsICdTcGFpbicpLAotICAoMjE2LCAnaHUnLCAyLCAnSHVuZ2FyeSAoUmVwdWJsaWMgb2YpJyksCi0gICgyMTgsICdiYScsIDIsICdCb3NuaWEgYW5kIEhlcnplZ292aW5hJyksCi0gICgyMTksICdocicsIDIsICdDcm9hdGlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDIyMCwgJ3JzJywgMiwgJ1NlcmJpYSBhbmQgTW9udGVuZWdybycpLAotICAoMjIyLCAnaXQnLCAyLCAnRXVyb3BlL1JvbWUnLCAnaXQnLCAnSXRhbHknKSwKLSAgKDIyNSwgJ3ZhJywgMiwgJ0V1cm9wZS9Sb21lJywgJ2l0JywgJ1ZhdGljYW4gQ2l0eSBTdGF0ZScpLAotICAoMjI2LCAncm8nLCAyLCAnUm9tYW5pYScpLAotICAoMjI4LCAnY2gnLCAyLCAnRXVyb3BlL1p1cmljaCcsICdkZScsICdTd2l0emVybGFuZCAoQ29uZmVkZXJhdGlvbiBvZiknKSwKLSAgKDIzMCwgJ2N6JywgMiwgJ0V1cm9wZS9QcmFndWUnLCAnY3MnLCAxMywgJ0N6ZWNoIFJlcHVibGljJyksCi0gICgyMzEsICdzaycsIDIsICdTbG92YWsgUmVwdWJsaWMnKSwKLSAgKDIzMiwgJ2F0JywgMiwgJ0V1cm9wZS9WaWVubmEnLCAnZGUnLCAxMywgJ0F1c3RyaWEnKSwKLSAgKDIzNCwgJ2diJywgMiwgJ0V1cm9wZS9Mb25kb24nLCAnZW4nLCAxMywgJ1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQnKSwKLSAgKDIzNSwgJ2diJywgMiwgJ0V1cm9wZS9Mb25kb24nLCAnZW4nLCAxMywgJ1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQnKSwKLSAgKDIzOCwgJ2RrJywgMiwgJ0Rlbm1hcmsnKSwKLSAgKDI0MCwgJ3NlJywgMiwgJ1N3ZWRlbicpLAotICAoMjQyLCAnbm8nLCAyLCAnTm9yd2F5JyksCi0gICgyNDQsICdmaScsIDIsICdGaW5sYW5kJyksCi0gICgyNDYsICdsdCcsIDIsICdMaXRodWFuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjQ3LCAnbHYnLCAyLCAnTGF0dmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI0OCwgJ2VlJywgMiwgJ0VzdG9uaWEgKFJlcHVibGljIG9mKScpLAotICAoMjUwLCAncnUnLCAyLCAnUnVzc2lhbiBGZWRlcmF0aW9uJyksCi0gICgyNTUsICd1YScsIDIsICdVa3JhaW5lJyksCi0gICgyNTcsICdieScsIDIsICdCZWxhcnVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDI1OSwgJ21kJywgMiwgJ01vbGRvdmEgKFJlcHVibGljIG9mKScpLAotICAoMjYwLCAncGwnLCAyLCAnRXVyb3BlL1dhcnNhdycsICdQb2xhbmQgKFJlcHVibGljIG9mKScpLAotICAoMjYyLCAnZGUnLCAyLCAnRXVyb3BlL0JlcmxpbicsICdkZScsIDEzLCAnR2VybWFueSAoRmVkZXJhbCBSZXB1YmxpYyBvZiknKSwKLSAgKDI2NiwgJ2dpJywgMiwgJ0dpYnJhbHRhcicpLAotICAoMjY4LCAncHQnLCAyLCAnUG9ydHVnYWwnKSwKLSAgKDI3MCwgJ2x1JywgMiwgJ0x1eGVtYm91cmcnKSwKLSAgKDI3MiwgJ2llJywgMiwgJ0V1cm9wZS9EdWJsaW4nLCAnZW4nLCAnSXJlbGFuZCcpLAotICAoMjc0LCAnaXMnLCAyLCAnSWNlbGFuZCcpLAotICAoMjc2LCAnYWwnLCAyLCAnQWxiYW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNzgsICdtdCcsIDIsICdNYWx0YScpLAotICAoMjgwLCAnY3knLCAyLCAnQ3lwcnVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDI4MiwgJ2dlJywgMiwgJ0dlb3JnaWEnKSwKLSAgKDI4MywgJ2FtJywgMiwgJ0FybWVuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjg0LCAnYmcnLCAyLCAnQnVsZ2FyaWEgKFJlcHVibGljIG9mKScpLAotICAoMjg2LCAndHInLCAyLCAnVHVya2V5JyksCi0gICgyODgsICdmbycsIDIsICdGYXJvZSBJc2xhbmRzJyksCi0gICgyODksICdnZScsIDIsICdBYmtoYXppYSAoR2VvcmdpYSknKSwKLSAgKDI5MCwgJ2dsJywgMiwgJ0dyZWVubGFuZCAoRGVubWFyayknKSwKLSAgKDI5MiwgJ3NtJywgMiwgJ1NhbiBNYXJpbm8gKFJlcHVibGljIG9mKScpLAotICAoMjkzLCAnc2wnLCAyLCAnU2xvdmVuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjk0LCAnbWsnLCAyLCAnVGhlIEZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEnKSwKLSAgKDI5NSwgJ2xpJywgMiwgJ0xpZWNodGVuc3RlaW4gKFByaW5jaXBhbGl0eSBvZiknKSwKLSAgKDI5NywgJ21lJywgMiwgJ01vbnRlbmVncm8gKFJlcHVibGljIG9mKScpLAotICAoMzAyLCAnY2EnLCAzLCAnJywgJycsIDExLCAnQ2FuYWRhJyksCi0gICgzMDgsICdwbScsIDIsICdTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIChDb2xsZWN0aXZpdCB0ZXJyaXRvcmlhbGUgZGUgbGEgUnB1YmxpcXVlIGZyYW5haXNlKScpLAotICAoMzEwLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxMSwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTIsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzEzLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxNCwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTUsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzE2LCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMzMCwgJ3ByJywgMiwgJ1B1ZXJ0byBSaWNvJyksCi0gICgzMzIsICd2aScsIDIsICdVbml0ZWQgU3RhdGVzIFZpcmdpbiBJc2xhbmRzJyksCi0gICgzMzQsICdteCcsIDMsICdNZXhpY28nKSwKLSAgKDMzOCwgJ2ptJywgMywgJ0phbWFpY2EnKSwKLSAgKDM0MCwgJ2dwJywgMiwgJ0d1YWRlbG91cGUgKEZyZW5jaCBEZXBhcnRtZW50IG9mKScpLAotICAoMzQyLCAnYmInLCAzLCAnQmFyYmFkb3MnKSwKLSAgKDM0NCwgJ2FnJywgMywgJ0FudGlndWEgYW5kIEJhcmJ1ZGEnKSwKLSAgKDM0NiwgJ2t5JywgMywgJ0NheW1hbiBJc2xhbmRzJyksCi0gICgzNDgsICd2ZycsIDMsICdCcml0aXNoIFZpcmdpbiBJc2xhbmRzJyksCi0gICgzNTAsICdibScsIDIsICdCZXJtdWRhJyksCi0gICgzNTIsICdnZCcsIDIsICdHcmVuYWRhJyksCi0gICgzNTQsICdtcycsIDIsICdNb250c2VycmF0JyksCi0gICgzNTYsICdrbicsIDIsICdTYWludCBLaXR0cyBhbmQgTmV2aXMnKSwKLSAgKDM1OCwgJ2xjJywgMiwgJ1NhaW50IEx1Y2lhJyksCi0gICgzNjAsICd2YycsIDIsICdTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcycpLAotICAoMzYyLCAnbmwnLCAyLCAnTmV0aGVybGFuZHMgQW50aWxsZXMnKSwKLSAgKDM2MywgJ2F3JywgMiwgJ0FydWJhJyksCi0gICgzNjQsICdicycsIDIsICdCYWhhbWFzIChDb21tb253ZWFsdGggb2YgdGhlKScpLAotICAoMzY1LCAnYWknLCAzLCAnQW5ndWlsbGEnKSwKLSAgKDM2NiwgJ2RtJywgMiwgJ0RvbWluaWNhIChDb21tb253ZWFsdGggb2YpJyksCi0gICgzNjgsICdjdScsIDIsICdDdWJhJyksCi0gICgzNzAsICdkbycsIDIsICdEb21pbmljYW4gUmVwdWJsaWMnKSwKLSAgKDM3MiwgJ2h0JywgMiwgJ0hhaXRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDM3NCwgJ3R0JywgMiwgJ1RyaW5pZGFkIGFuZCBUb2JhZ28nKSwKLSAgKDM3NiwgJ3RjJywgMiwgJ1R1cmtzIGFuZCBDYWljb3MgSXNsYW5kcycpLAotICAoNDAwLCAnYXonLCAyLCAnQXplcmJhaWphbmkgUmVwdWJsaWMnKSwKLSAgKDQwMSwgJ2t6JywgMiwgJ0themFraHN0YW4gKFJlcHVibGljIG9mKScpLAotICAoNDAyLCAnYnQnLCAyLCAnQmh1dGFuIChLaW5nZG9tIG9mKScpLAotICAoNDA0LCAnaW4nLCAyLCAnSW5kaWEgKFJlcHVibGljIG9mKScpLAotICAoNDA1LCAnaW4nLCAyLCAnSW5kaWEgKFJlcHVibGljIG9mKScpLAotICAoNDEwLCAncGsnLCAyLCAnUGFraXN0YW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpJyksCi0gICg0MTIsICdhZicsIDIsICdBZmdoYW5pc3RhbicpLAotICAoNDEzLCAnbGsnLCAyLCAnU3JpIExhbmthIChEZW1vY3JhdGljIFNvY2lhbGlzdCBSZXB1YmxpYyBvZiknKSwKLSAgKDQxNCwgJ21tJywgMiwgJ015YW5tYXIgKFVuaW9uIG9mKScpLAotICAoNDE1LCAnbGInLCAyLCAnTGViYW5vbicpLAotICAoNDE2LCAnam8nLCAyLCAnSm9yZGFuIChIYXNoZW1pdGUgS2luZ2RvbSBvZiknKSwKLSAgKDQxNywgJ3N5JywgMiwgJ1N5cmlhbiBBcmFiIFJlcHVibGljJyksCi0gICg0MTgsICdpcScsIDIsICdJcmFxIChSZXB1YmxpYyBvZiknKSwKLSAgKDQxOSwgJ2t3JywgMiwgJ0t1d2FpdCAoU3RhdGUgb2YpJyksCi0gICg0MjAsICdzYScsIDIsICdTYXVkaSBBcmFiaWEgKEtpbmdkb20gb2YpJyksCi0gICg0MjEsICd5ZScsIDIsICdZZW1lbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MjIsICdvbScsIDIsICdPbWFuIChTdWx0YW5hdGUgb2YpJyksCi0gICg0MjMsICdwcycsIDIsICdQYWxlc3RpbmUnKSwKLSAgKDQyNCwgJ2FlJywgMiwgJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJyksCi0gICg0MjUsICdpbCcsIDIsICdJc3JhZWwgKFN0YXRlIG9mKScpLAotICAoNDI2LCAnYmgnLCAyLCAnQmFocmFpbiAoS2luZ2RvbSBvZiknKSwKLSAgKDQyNywgJ3FhJywgMiwgJ1FhdGFyIChTdGF0ZSBvZiknKSwKLSAgKDQyOCwgJ21uJywgMiwgJ01vbmdvbGlhJyksCi0gICg0MjksICducCcsIDIsICdOZXBhbCcpLAotICAoNDMwLCAnYWUnLCAyLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnKSwKLSAgKDQzMSwgJ2FlJywgMiwgJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJyksCi0gICg0MzIsICdpcicsIDIsICdJcmFuIChJc2xhbWljIFJlcHVibGljIG9mKScpLAotICAoNDM0LCAndXonLCAyLCAnVXpiZWtpc3RhbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MzYsICd0aicsIDIsICdUYWppa2lzdGFuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQzNywgJ2tnJywgMiwgJ0t5cmd5eiBSZXB1YmxpYycpLAotICAoNDM4LCAndG0nLCAyLCAnVHVya21lbmlzdGFuJyksCi0gICg0NDAsICdqcCcsIDIsICdBc2lhL1Rva3lvJywgJ2phJywgMTQsICdKYXBhbicpLAotICAoNDQxLCAnanAnLCAyLCAnQXNpYS9Ub2t5bycsICdqYScsIDE0LCAnSmFwYW4nKSwKLSAgKDQ1MCwgJ2tyJywgMiwgJ0FzaWEvU2VvdWwnLCAna28nLCAxMywgJ0tvcmVhIChSZXB1YmxpYyBvZiknKSwKLSAgKDQ1MiwgJ3ZuJywgMiwgJ1ZpZXQgTmFtIChTb2NpYWxpc3QgUmVwdWJsaWMgb2YpJyksCi0gICg0NTQsICdoaycsIDIsICciSG9uZyBLb25nLCBDaGluYSInKSwKLSAgKDQ1NSwgJ21vJywgMiwgJyJNYWNhbywgQ2hpbmEiJyksCi0gICg0NTYsICdraCcsIDIsICdDYW1ib2RpYSAoS2luZ2RvbSBvZiknKSwKLSAgKDQ1NywgJ2xhJywgMiwgIkxhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIiksCi0gICg0NjAsICdjbicsIDIsICJBc2lhL0JlaWppbmciLCAnemgnLCAxMywgIkNoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikiKSwKLSAgKDQ2MSwgJ2NuJywgMiwgIkFzaWEvQmVpamluZyIsICd6aCcsIDEzLCAiQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKSIpLAotICAoNDY2LCAndHcnLCAyLCAiVGFpd2FuIChSZXB1YmxpYyBvZiBDaGluYSkiKSwKLSAgKDQ2NywgJ2twJywgMiwgIkRlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YgS29yZWEiKSwKLSAgKDQ3MCwgJ2JkJywgMiwgIkJhbmdsYWRlc2ggKFBlb3BsZSdzIFJlcHVibGljIG9mKSIpLAotICAoNDcyLCAnbXYnLCAyLCAnTWFsZGl2ZXMgKFJlcHVibGljIG9mKScpLAotICAoNTAyLCAnbXknLCAyLCAnTWFsYXlzaWEnKSwKLSAgKDUwNSwgJ2F1JywgMiwgJ0F1c3RyYWxpYS9TeWRuZXknLCAnZW4nLCAxMSwgJ0F1c3RyYWxpYScpLAotICAoNTEwLCAnaWQnLCAyLCAnSW5kb25lc2lhIChSZXB1YmxpYyBvZiknKSwKLSAgKDUxNCwgJ3RsJywgMiwgJ0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgVGltb3ItTGVzdGUnKSwKLSAgKDUxNSwgJ3BoJywgMiwgJ1BoaWxpcHBpbmVzIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg1MjAsICd0aCcsIDIsICdUaGFpbGFuZCcpLAotICAoNTI1LCAnc2cnLCAyLCAnQXNpYS9TaW5nYXBvcmUnLCAnZW4nLCAxMSwgJ1NpbmdhcG9yZSAoUmVwdWJsaWMgb2YpJyksCi0gICg1MjgsICdibicsIDIsICdCcnVuZWkgRGFydXNzYWxhbScpLAotICAoNTMwLCAnbnonLCAyLCAnUGFjaWZpYy9BdWNrbGFuZCcsICdlbicsICdOZXcgWmVhbGFuZCcpLAotICAoNTM0LCAnbXAnLCAyLCAnTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzIChDb21tb253ZWFsdGggb2YgdGhlKScpLAotICAoNTM1LCAnZ3UnLCAyLCAnR3VhbScpLAotICAoNTM2LCAnbnInLCAyLCAnTmF1cnUgKFJlcHVibGljIG9mKScpLAotICAoNTM3LCAncGcnLCAyLCAnUGFwdWEgTmV3IEd1aW5lYScpLAotICAoNTM5LCAndG8nLCAyLCAnVG9uZ2EgKEtpbmdkb20gb2YpJyksCi0gICg1NDAsICdzYicsIDIsICdTb2xvbW9uIElzbGFuZHMnKSwKLSAgKDU0MSwgJ3Z1JywgMiwgJ1ZhbnVhdHUgKFJlcHVibGljIG9mKScpLAotICAoNTQyLCAnZmonLCAyLCAnRmlqaSAoUmVwdWJsaWMgb2YpJyksCi0gICg1NDMsICd3ZicsIDIsICJXYWxsaXMgYW5kIEZ1dHVuYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKSIpLAotICAoNTQ0LCAnYXMnLCAyLCAnQW1lcmljYW4gU2Ftb2EnKSwKLSAgKDU0NSwgJ2tpJywgMiwgJ0tpcmliYXRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDU0NiwgJ25jJywgMiwgIk5ldyBDYWxlZG9uaWEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikiKSwKLSAgKDU0NywgJ3BmJywgMiwgIkZyZW5jaCBQb2x5bmVzaWEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikiKSwKLSAgKDU0OCwgJ2NrJywgMiwgJ0Nvb2sgSXNsYW5kcycpLAotICAoNTQ5LCAnd3MnLCAyLCAnU2Ftb2EgKEluZGVwZW5kZW50IFN0YXRlIG9mKScpLAotICAoNTUwLCAnZm0nLCAyLCAnTWljcm9uZXNpYSAoRmVkZXJhdGVkIFN0YXRlcyBvZiknKSwKLSAgKDU1MSwgJ21oJywgMiwgJ01hcnNoYWxsIElzbGFuZHMgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDU1MiwgJ3B3JywgMiwgJ1BhbGF1IChSZXB1YmxpYyBvZiknKSwKLSAgKDYwMiwgJ2VnJywgMiwgJ0VneXB0IChBcmFiIFJlcHVibGljIG9mKScpLAotICAoNjAzLCAnZHonLCAyLCAiQWxnZXJpYSAoUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikiKSwKLSAgKDYwNCwgJ21hJywgMiwgJ01vcm9jY28gKEtpbmdkb20gb2YpJyksCi0gICg2MDUsICd0bicsIDIsICdUdW5pc2lhJyksCi0gICg2MDYsICdseScsIDIsICJMaWJ5YSAoU29jaWFsaXN0IFBlb3BsZSdzIExpYnlhbiBBcmFiIEphbWFoaXJpeWEpIiksCi0gICg2MDcsICdnbScsIDIsICdHYW1iaWEgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYwOCwgJ3NuJywgMiwgJ1NlbmVnYWwgKFJlcHVibGljIG9mKScpLAotICAoNjA5LCAnbXInLCAyLCAnTWF1cml0YW5pYSAoSXNsYW1pYyBSZXB1YmxpYyBvZiknKSwKLSAgKDYxMCwgJ21sJywgMiwgJ01hbGkgKFJlcHVibGljIG9mKScpLAotICAoNjExLCAnZ24nLCAyLCAnR3VpbmVhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxMiwgJ2NpJywgMiwgIkN0ZSBkJ0l2b2lyZSAoUmVwdWJsaWMgb2YpIiksCi0gICg2MTMsICdiZicsIDIsICdCdXJraW5hIEZhc28nKSwKLSAgKDYxNCwgJ25lJywgMiwgJ05pZ2VyIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MTUsICd0ZycsIDIsICdUb2dvbGVzZSBSZXB1YmxpYycpLAotICAoNjE2LCAnYmonLCAyLCAnQmVuaW4gKFJlcHVibGljIG9mKScpLAotICAoNjE3LCAnbXUnLCAyLCAnTWF1cml0aXVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxOCwgJ2xyJywgMiwgJ0xpYmVyaWEgKFJlcHVibGljIG9mKScpLAotICAoNjE5LCAnc2wnLCAyLCAnU2llcnJhIExlb25lJyksCi0gICg2MjAsICdnaCcsIDIsICdHaGFuYScpLAotICAoNjIxLCAnbmcnLCAyLCAnTmlnZXJpYSAoRmVkZXJhbCBSZXB1YmxpYyBvZiknKSwKLSAgKDYyMiwgJ3RkJywgMiwgJ0NoYWQgKFJlcHVibGljIG9mKScpLAotICAoNjIzLCAnY2YnLCAyLCAnQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljJyksCi0gICg2MjQsICdjbScsIDIsICdDYW1lcm9vbiAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjUsICdjdicsIDIsICdDYXBlIFZlcmRlIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyNiwgJ3N0JywgMiwgJ1NhbyBUb21lIGFuZCBQcmluY2lwZSAoRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiknKSwKLSAgKDYyNywgJ2dxJywgMiwgJ0VxdWF0b3JpYWwgR3VpbmVhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyOCwgJ2dhJywgMiwgJ0dhYm9uZXNlIFJlcHVibGljJyksCi0gICg2MjksICdjZycsIDIsICdDb25nbyAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjMwLCAnY2cnLCAyLCAnRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28nKSwKLSAgKDYzMSwgJ2FvJywgMiwgJ0FuZ29sYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzIsICdndycsIDIsICdHdWluZWEtQmlzc2F1IChSZXB1YmxpYyBvZiknKSwKLSAgKDYzMywgJ3NjJywgMiwgJ1NleWNoZWxsZXMgKFJlcHVibGljIG9mKScpLAotICAoNjM0LCAnc2QnLCAyLCAnU3VkYW4gKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYzNSwgJ3J3JywgMiwgJ1J3YW5kYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzYsICdldCcsIDIsICdFdGhpb3BpYSAoRmVkZXJhbCBEZW1vY3JhdGljIFJlcHVibGljIG9mKScpLAotICAoNjM3LCAnc28nLCAyLCAnU29tYWxpIERlbW9jcmF0aWMgUmVwdWJsaWMnKSwKLSAgKDYzOCwgJ2RqJywgMiwgJ0RqaWJvdXRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzOSwgJ2tlJywgMiwgJ0tlbnlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0MCwgJ3R6JywgMiwgJ1RhbnphbmlhIChVbml0ZWQgUmVwdWJsaWMgb2YpJyksCi0gICg2NDEsICd1ZycsIDIsICdVZ2FuZGEgKFJlcHVibGljIG9mKScpLAotICAoNjQyLCAnYmknLCAyLCAnQnVydW5kaSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDMsICdteicsIDIsICdNb3phbWJpcXVlIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0NSwgJ3ptJywgMiwgJ1phbWJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDYsICdtZycsIDIsICdNYWRhZ2FzY2FyIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0NywgJ3JlJywgMiwgJ1JldW5pb24gKEZyZW5jaCBEZXBhcnRtZW50IG9mKScpLAotICAoNjQ4LCAnencnLCAyLCAnWmltYmFid2UgKFJlcHVibGljIG9mKScpLAotICAoNjQ5LCAnbmEnLCAyLCAnTmFtaWJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NTAsICdtdycsIDIsICdNYWxhd2knKSwKLSAgKDY1MSwgJ2xzJywgMiwgJ0xlc290aG8gKEtpbmdkb20gb2YpJyksCi0gICg2NTIsICdidycsIDIsICdCb3Rzd2FuYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NTMsICdzeicsIDIsICdTd2F6aWxhbmQgKEtpbmdkb20gb2YpJyksCi0gICg2NTQsICdrbScsIDIsICdDb21vcm9zIChVbmlvbiBvZiB0aGUpJyksCi0gICg2NTUsICd6YScsIDIsICdBZnJpY2EvSm9oYW5uZXNidXJnJywgJ2VuJywgJ1NvdXRoIEFmcmljYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NTcsICdlcicsIDIsICdFcml0cmVhJyksCi0gICg3MDIsICdieicsIDIsICdCZWxpemUnKSwKLSAgKDcwNCwgJ2d0JywgMiwgJ0d1YXRlbWFsYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MDYsICdzdicsIDIsICdFbCBTYWx2YWRvciAoUmVwdWJsaWMgb2YpJyksCi0gICg3MDgsICdobicsIDMsICdIb25kdXJhcyAoUmVwdWJsaWMgb2YpJyksCi0gICg3MTAsICduaScsIDIsICdOaWNhcmFndWEnKSwKLSAgKDcxMiwgJ2NyJywgMiwgJ0Nvc3RhIFJpY2EnKSwKLSAgKDcxNCwgJ3BhJywgMiwgJ1BhbmFtYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MTYsICdwZScsIDIsICdQZXJ1JyksCi0gICg3MjIsICdhcicsIDMsICdBcmdlbnRpbmUgUmVwdWJsaWMnKSwKLSAgKDcyNCwgJ2JyJywgMiwgJ0JyYXppbCAoRmVkZXJhdGl2ZSBSZXB1YmxpYyBvZiknKSwKLSAgKDczMCwgJ2NsJywgMiwgJ0NoaWxlJyksCi0gICg3MzIsICdjbycsIDMsICdDb2xvbWJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MzQsICd2ZScsIDIsICdWZW5lenVlbGEgKEJvbGl2YXJpYW4gUmVwdWJsaWMgb2YpJyksCi0gICg3MzYsICdibycsIDIsICdCb2xpdmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDczOCwgJ2d5JywgMiwgJ0d1eWFuYScpLAotICAoNzQwLCAnZWMnLCAyLCAnRWN1YWRvcicpLAotICAoNzQyLCAnZ2YnLCAyLCAnRnJlbmNoIEd1aWFuYSAoRnJlbmNoIERlcGFydG1lbnQgb2YpJyksCi0gICg3NDQsICdweScsIDIsICdQYXJhZ3VheSAoUmVwdWJsaWMgb2YpJyksCi0gICg3NDYsICdzcicsIDIsICdTdXJpbmFtZSAoUmVwdWJsaWMgb2YpJyksCi0gICg3NDgsICd1eScsIDIsICdVcnVndWF5IChFYXN0ZXJuIFJlcHVibGljIG9mKScpLAotICAoNzUwLCAnZmsnLCAyLCAnRmFsa2xhbmQgSXNsYW5kcyAoTWFsdmluYXMpJyldCi0KLWdldF9tY2MgPSBsYW1iZGEgZWx0OiBlbHRbMF0KLWdldF9pc28gPSBsYW1iZGEgZWx0OiBlbHRbMV0KLWdldF9zZCA9IGxhbWJkYSBlbHQ6IGVsdFsyXQotZ2V0X3R6ID0gbGFtYmRhIGVsdDogbGVuKGVsdCkgPiA0IGFuZCBlbHRbM10gb3IgJycKLWdldF9sYW5nID0gbGFtYmRhIGVsdDogbGVuKGVsdCkgPiA1IGFuZCBlbHRbNF0gb3IgJycKLWdldF93aWZpID0gbGFtYmRhIGVsdDogbGVuKGVsdCkgPiA2IGFuZCBlbHRbNV0gb3IgMAotCi1tY2NfY29kZXMgPSBbJzB4JTA0eCcgJSBnZXRfbWNjKGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGVdCi10el9zZXQgPSBzb3J0ZWQoeCBmb3IgeCBpbiBzZXQoZ2V0X3R6KGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGUpKQotbGFuZ19zZXQgPSBzb3J0ZWQoeCBmb3IgeCBpbiBzZXQoZ2V0X2xhbmcoZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZSkpCi0KLWRlZiBta19pbmRfY29kZShlbHQpOgotICBpc28gPSBnZXRfaXNvKGVsdCkKLSAgaXNvX2NvZGUgPSAoKG9yZChpc29bMF0pIDw8IDgpIHwgb3JkKGlzb1sxXSkpICYgMHhGRkZGICMgMTYgYml0cwotICB3aWZpID0gZ2V0X3dpZmkoZWx0KSAmIDB4MDAwRiAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgNCBiaXRzCi0gIHNkID0gZ2V0X3NkKGVsdCkgJiAweDAwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAyIGJpdHMKLSAgdHpfaW5kID0gdHpfc2V0LmluZGV4KGdldF90eihlbHQpKSAmIDB4MDAxRiAgICAgICAgICAgICMgIDUgYml0cwotICBsYW5nX2luZCA9IGxhbmdfc2V0LmluZGV4KGdldF9sYW5nKGVsdCkpICYgMHgwMDBGICAgICAgIyAgNCBiaXRzCi0gIHJldHVybiAoaXNvX2NvZGUgPDwgMTYpIHwgKHdpZmkgPDwgMTEpIHwgKHNkIDw8IDkpIHwgKHR6X2luZCA8PCA0KSB8IGxhbmdfaW5kCi0KLWluZF9jb2RlcyA9IFsnMHglMDh4JyAlIG1rX2luZF9jb2RlKGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGVdCi0KLWRlZiBmbXRfbGlzdCh0aXRsZSwgbCwgYmF0Y2hfc3opOgotICBzbCA9IFtdCi0gIGZvciBpIGluIHJhbmdlKGxlbihsKSAvIGJhdGNoX3N6ICsgKGxlbihsKSAlIGJhdGNoX3N6IGFuZCAxIG9yIDApKToKLSAgICBqID0gaSAqIGJhdGNoX3N6Ci0gICAgc2wuYXBwZW5kKCgnICcgKiA4KSArICcsICcuam9pbihsW2o6aiArIGJhdGNoX3N6XSkpCi0gIHJldHVybiAnICAgIHByaXZhdGUgc3RhdGljIGZpbmFsICVzID0ge1xuJyAlIHRpdGxlICsgJyxcbicuam9pbihzbCkgKyAnXG4gICAgfTtcbicKLQotZGVmIGRvX2F1dG9nZW5fY29tbWVudChleHRyYV9kZXNjPVtdKToKLSAgcHJpbnQgJyAgICAvJyArICcqKlxuICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSknCi0gIGZvciBsaW5lIGluIGV4dHJhX2Rlc2M6Ci0gICAgcHJpbnQgJyAgICAqICVzJyAlIGxpbmUKLSAgcHJpbnQgJyAgICAqJyArICcvJwotCi1kb19hdXRvZ2VuX2NvbW1lbnQoKQotcHJpbnQgZm10X2xpc3QoJ1N0cmluZ1tdIFRaX1NUUklOR1MnLCBbJyIlcyInICUgeCBmb3IgeCBpbiB0el9zZXRdLCAxKQotZG9fYXV0b2dlbl9jb21tZW50KCkKLXByaW50IGZtdF9saXN0KCdTdHJpbmdbXSBMQU5HX1NUUklOR1MnLCBbJyIlcyInICUgeCBmb3IgeCBpbiBsYW5nX3NldF0sIDEwKQotZG9fYXV0b2dlbl9jb21tZW50KFsnVGhpcyB0YWJsZSBpcyBhIGxpc3Qgb2YgTUNDIGNvZGVzLiAgVGhlIGluZGV4IGluIHRoaXMgdGFibGUnLAotICAgICAgICAgICAgICAgICAgICAnb2YgYSBnaXZlbiBNQ0MgY29kZSBpcyB0aGUgaW5kZXggb2YgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQnLAotICAgICAgICAgICAgICAgICAgICAndGhhdCBNQ0MgaW4gdGhlIElORF9DT0RFUyB0YWJsZS4nXSkKLXByaW50IGZtdF9saXN0KCdzaG9ydFtdIE1DQ19DT0RFUycsIG1jY19jb2RlcywgMTApCi1kb19hdXRvZ2VuX2NvbW1lbnQoWydUaGUgdmFsdWVzIGluIHRoaXMgdGFibGUgYXJlIGJyb2tlbiBkb3duIGFzIGZvbGxvd3MgKG1zYiB0byBsc2IpOicsCi0gICAgICAgICAgICAgICAgICAgICcgICAgaXNvIGNvdW50cnkgY29kZSAxNiBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICAodW51c2VkKSAgICAgICAgICAxIGJpdCcsCi0gICAgICAgICAgICAgICAgICAgICcgICAgd2lmaSBjaGFubmVsICAgICAgNCBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBzbWFsbGVkIGRpZ2l0ICAgICAyIGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgIGRlZmF1bHQgdGltZXpvbmUgIDUgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgZGVmYXVsdCBsYW5ndWFnZSAgNCBiaXRzJ10pCi1wcmludCBmbXRfbGlzdCgnaW50W10gSU5EX0NPREVTJywgaW5kX2NvZGVzLCA2KQotCi1kZWYgcGFyc2VfaW5kX2NvZGUoaW5kKToKLSAgbWNjID0gZXZhbChtY2NfY29kZXNbaW5kXSkKLSAgY29kZSA9IGV2YWwoaW5kX2NvZGVzW2luZF0pCi0gIGlzb19sc2IgPSBpbnQoKGNvZGUgPj4gMTYpICYgMHgwMEZGKQotICBpc29fbXNiID0gaW50KChjb2RlID4+IDI0KSAmIDB4MDBGRikKLSAgaXNvID0gJyVzJXMnICUgKGNocihpc29fbXNiKSwgY2hyKGlzb19sc2IpKQotICB3aWZpID0gaW50KChjb2RlID4+IDExKSAmIDB4MDAwRikKLSAgc2QgPSBpbnQoKGNvZGUgPj4gOSkgJiAweDAwMDMpCi0gIHR6X2luZCA9IChjb2RlID4+IDQpICYgMHgwMDFGCi0gIGxhbmdfaW5kID0gKGNvZGUgPj4gMCkgJiAweDAwMEYKLSAgcmV0dXJuIChtY2MsIGlzbywgc2QsIHR6X3NldFt0el9pbmRdLCBsYW5nX3NldFtsYW5nX2luZF0sIHdpZmkpCi0KLWZtdF9zdHIgPSAnbWNjID0gJXMsIGlzbyA9ICVzLCBzZCA9ICVzLCB0eiA9ICVzLCBsYW5nID0gJXMsIHdpZmkgPSAlcycKLW9yaWdfdGFibGUgPSBbZm10X3N0ciAlIChnZXRfbWNjKGVsdCksIGdldF9pc28oZWx0KSwgZ2V0X3NkKGVsdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3R6KGVsdCksIGdldF9sYW5nKGVsdCksIGdldF93aWZpKGVsdCkpCi0gICAgICAgICAgICAgIGZvciBlbHQgaW4gbWNjX3RhYmxlXQotZGVyaXZlZF90YWJsZSA9IFtmbXRfc3RyICUgcGFyc2VfaW5kX2NvZGUoaSkgZm9yIGkgaW4gcmFuZ2UobGVuKGluZF9jb2RlcykpXQotZm9yIGkgaW4gcmFuZ2UobGVuKG9yaWdfdGFibGUpKToKLSAgaWYgb3JpZ190YWJsZVtpXSA9PSBkZXJpdmVkX3RhYmxlW2ldOiBjb250aW51ZQotICBwcmludCAnTUlTTUFUQ0ggRVJST1IgOiAnLCBvcmlnX3RhYmxlW2ldLCAiICE9ICIsIGRlcml2ZWRfdGFibGVbaV0KLQotKi8KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGxpYmNvcmUuaWN1LlRpbWVab25lczsKIAogLyoqCiAgKiBNb2JpbGUgQ291bnRyeSBDb2RlCkBAIC0zNzEsMjAyICszOCwxNTMgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE1jY1RhYmxlCiB7Ci0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUWl9TVFJJTkdTID0gewotICAgICAgICAiIiwKLSAgICAgICAgIkFmcmljYS9Kb2hhbm5lc2J1cmciLAotICAgICAgICAiQXNpYS9CZWlqaW5nIiwKLSAgICAgICAgIkFzaWEvU2VvdWwiLAotICAgICAgICAiQXNpYS9TaW5nYXBvcmUiLAotICAgICAgICAiQXNpYS9Ub2t5byIsCi0gICAgICAgICJBdXN0cmFsaWEvU3lkbmV5IiwKLSAgICAgICAgIkV1cm9wZS9BbXN0ZXJkYW0iLAotICAgICAgICAiRXVyb3BlL0JlcmxpbiIsCi0gICAgICAgICJFdXJvcGUvRHVibGluIiwKLSAgICAgICAgIkV1cm9wZS9Mb25kb24iLAotICAgICAgICAiRXVyb3BlL01hZHJpZCIsCi0gICAgICAgICJFdXJvcGUvUGFyaXMiLAotICAgICAgICAiRXVyb3BlL1ByYWd1ZSIsCi0gICAgICAgICJFdXJvcGUvUm9tZSIsCi0gICAgICAgICJFdXJvcGUvVmllbm5hIiwKLSAgICAgICAgIkV1cm9wZS9XYXJzYXciLAotICAgICAgICAiRXVyb3BlL1p1cmljaCIsCi0gICAgICAgICJQYWNpZmljL0F1Y2tsYW5kIgotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBTkdfU1RSSU5HUyA9IHsKLSAgICAgICAgIiIsICJjcyIsICJkZSIsICJlbiIsICJlcyIsICJmciIsICJpdCIsICJqYSIsICJrbyIsICJubCIsCi0gICAgICAgICJ6aCIKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKiBUaGlzIHRhYmxlIGlzIGEgbGlzdCBvZiBNQ0MgY29kZXMuICBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZQotICAgICAqIG9mIGEgZ2l2ZW4gTUNDIGNvZGUgaXMgdGhlIGluZGV4IG9mIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgICogdGhhdCBNQ0MgaW4gdGhlIElORF9DT0RFUyB0YWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydFtdIE1DQ19DT0RFUyA9IHsKLSAgICAgICAgMHgwMGNhLCAweDAwY2MsIDB4MDBjZSwgMHgwMGQwLCAweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDgsIDB4MDBkYSwgMHgwMGRiLAotICAgICAgICAweDAwZGMsIDB4MDBkZSwgMHgwMGUxLCAweDAwZTIsIDB4MDBlNCwgMHgwMGU2LCAweDAwZTcsIDB4MDBlOCwgMHgwMGVhLCAweDAwZWIsCi0gICAgICAgIDB4MDBlZSwgMHgwMGYwLCAweDAwZjIsIDB4MDBmNCwgMHgwMGY2LCAweDAwZjcsIDB4MDBmOCwgMHgwMGZhLCAweDAwZmYsIDB4MDEwMSwKLSAgICAgICAgMHgwMTAzLCAweDAxMDQsIDB4MDEwNiwgMHgwMTBhLCAweDAxMGMsIDB4MDEwZSwgMHgwMTEwLCAweDAxMTIsIDB4MDExNCwgMHgwMTE2LAotICAgICAgICAweDAxMTgsIDB4MDExYSwgMHgwMTFiLCAweDAxMWMsIDB4MDExZSwgMHgwMTIwLCAweDAxMjEsIDB4MDEyMiwgMHgwMTI0LCAweDAxMjUsCi0gICAgICAgIDB4MDEyNiwgMHgwMTI3LCAweDAxMjksIDB4MDEyZSwgMHgwMTM0LCAweDAxMzYsIDB4MDEzNywgMHgwMTM4LCAweDAxMzksIDB4MDEzYSwKLSAgICAgICAgMHgwMTNiLCAweDAxM2MsIDB4MDE0YSwgMHgwMTRjLCAweDAxNGUsIDB4MDE1MiwgMHgwMTU0LCAweDAxNTYsIDB4MDE1OCwgMHgwMTVhLAotICAgICAgICAweDAxNWMsIDB4MDE1ZSwgMHgwMTYwLCAweDAxNjIsIDB4MDE2NCwgMHgwMTY2LCAweDAxNjgsIDB4MDE2YSwgMHgwMTZiLCAweDAxNmMsCi0gICAgICAgIDB4MDE2ZCwgMHgwMTZlLCAweDAxNzAsIDB4MDE3MiwgMHgwMTc0LCAweDAxNzYsIDB4MDE3OCwgMHgwMTkwLCAweDAxOTEsIDB4MDE5MiwKLSAgICAgICAgMHgwMTk0LCAweDAxOTUsIDB4MDE5YSwgMHgwMTljLCAweDAxOWQsIDB4MDE5ZSwgMHgwMTlmLCAweDAxYTAsIDB4MDFhMSwgMHgwMWEyLAotICAgICAgICAweDAxYTMsIDB4MDFhNCwgMHgwMWE1LCAweDAxYTYsIDB4MDFhNywgMHgwMWE4LCAweDAxYTksIDB4MDFhYSwgMHgwMWFiLCAweDAxYWMsCi0gICAgICAgIDB4MDFhZCwgMHgwMWFlLCAweDAxYWYsIDB4MDFiMCwgMHgwMWIyLCAweDAxYjQsIDB4MDFiNSwgMHgwMWI2LCAweDAxYjgsIDB4MDFiOSwKLSAgICAgICAgMHgwMWMyLCAweDAxYzQsIDB4MDFjNiwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOSwgMHgwMWNjLCAweDAxY2QsIDB4MDFkMiwgMHgwMWQzLAotICAgICAgICAweDAxZDYsIDB4MDFkOCwgMHgwMWY2LCAweDAxZjksIDB4MDFmZSwgMHgwMjAyLCAweDAyMDMsIDB4MDIwOCwgMHgwMjBkLCAweDAyMTAsCi0gICAgICAgIDB4MDIxMiwgMHgwMjE2LCAweDAyMTcsIDB4MDIxOCwgMHgwMjE5LCAweDAyMWIsIDB4MDIxYywgMHgwMjFkLCAweDAyMWUsIDB4MDIxZiwKLSAgICAgICAgMHgwMjIwLCAweDAyMjEsIDB4MDIyMiwgMHgwMjIzLCAweDAyMjQsIDB4MDIyNSwgMHgwMjI2LCAweDAyMjcsIDB4MDIyOCwgMHgwMjVhLAotICAgICAgICAweDAyNWIsIDB4MDI1YywgMHgwMjVkLCAweDAyNWUsIDB4MDI1ZiwgMHgwMjYwLCAweDAyNjEsIDB4MDI2MiwgMHgwMjYzLCAweDAyNjQsCi0gICAgICAgIDB4MDI2NSwgMHgwMjY2LCAweDAyNjcsIDB4MDI2OCwgMHgwMjY5LCAweDAyNmEsIDB4MDI2YiwgMHgwMjZjLCAweDAyNmQsIDB4MDI2ZSwKLSAgICAgICAgMHgwMjZmLCAweDAyNzAsIDB4MDI3MSwgMHgwMjcyLCAweDAyNzMsIDB4MDI3NCwgMHgwMjc1LCAweDAyNzYsIDB4MDI3NywgMHgwMjc4LAotICAgICAgICAweDAyNzksIDB4MDI3YSwgMHgwMjdiLCAweDAyN2MsIDB4MDI3ZCwgMHgwMjdlLCAweDAyN2YsIDB4MDI4MCwgMHgwMjgxLCAweDAyODIsCi0gICAgICAgIDB4MDI4MywgMHgwMjg1LCAweDAyODYsIDB4MDI4NywgMHgwMjg4LCAweDAyODksIDB4MDI4YSwgMHgwMjhiLCAweDAyOGMsIDB4MDI4ZCwKLSAgICAgICAgMHgwMjhlLCAweDAyOGYsIDB4MDI5MSwgMHgwMmJlLCAweDAyYzAsIDB4MDJjMiwgMHgwMmM0LCAweDAyYzYsIDB4MDJjOCwgMHgwMmNhLAotICAgICAgICAweDAyY2MsIDB4MDJkMiwgMHgwMmQ0LCAweDAyZGEsIDB4MDJkYywgMHgwMmRlLCAweDAyZTAsIDB4MDJlMiwgMHgwMmU0LCAweDAyZTYsCi0gICAgICAgIDB4MDJlOCwgMHgwMmVhLCAweDAyZWMsIDB4MDJlZQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqIFRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYnJva2VuIGRvd24gYXMgZm9sbG93cyAobXNiIHRvIGxzYik6Ci0gICAgICogICAgIGlzbyBjb3VudHJ5IGNvZGUgMTYgYml0cwotICAgICAqICAgICAodW51c2VkKSAgICAgICAgICAxIGJpdAotICAgICAqICAgICB3aWZpIGNoYW5uZWwgICAgICA0IGJpdHMKLSAgICAgKiAgICAgc21hbGxlZCBkaWdpdCAgICAgMiBiaXRzCi0gICAgICogICAgIGRlZmF1bHQgdGltZXpvbmUgIDUgYml0cwotICAgICAqICAgICBkZWZhdWx0IGxhbmd1YWdlICA0IGJpdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBJTkRfQ09ERVMgPSB7Ci0gICAgICAgIDB4Njc3MjA0MDAsIDB4NmU2YzZjNzksIDB4NjI2NTA0MDAsIDB4NjY3MjA0YzUsIDB4NmQ2MzA0MDAsIDB4NjE2NDA0MDAsCi0gICAgICAgIDB4NjU3MzA0YjQsIDB4Njg3NTA0MDAsIDB4NjI2MTA0MDAsIDB4Njg3MjA0MDAsIDB4NzI3MzA0MDAsIDB4Njk3NDA0ZTYsCi0gICAgICAgIDB4NzY2MTA0ZTYsIDB4NzI2ZjA0MDAsIDB4NjM2ODA1MTIsIDB4NjM3YTZjZDEsIDB4NzM2YjA0MDAsIDB4NjE3NDZjZjIsCi0gICAgICAgIDB4Njc2MjZjYTMsIDB4Njc2MjZjYTMsIDB4NjQ2YjA0MDAsIDB4NzM2NTA0MDAsIDB4NmU2ZjA0MDAsIDB4NjY2OTA0MDAsCi0gICAgICAgIDB4NmM3NDA0MDAsIDB4NmM3NjA0MDAsIDB4NjU2NTA0MDAsIDB4NzI3NTA0MDAsIDB4NzU2MTA0MDAsIDB4NjI3OTA0MDAsCi0gICAgICAgIDB4NmQ2NDA0MDAsIDB4NzA2YzA1MDAsIDB4NjQ2NTZjODIsIDB4Njc2OTA0MDAsIDB4NzA3NDA0MDAsIDB4NmM3NTA0MDAsCi0gICAgICAgIDB4Njk2NTA0OTMsIDB4Njk3MzA0MDAsIDB4NjE2YzA0MDAsIDB4NmQ3NDA0MDAsIDB4NjM3OTA0MDAsIDB4Njc2NTA0MDAsCi0gICAgICAgIDB4NjE2ZDA0MDAsIDB4NjI2NzA0MDAsIDB4NzQ3MjA0MDAsIDB4NjY2ZjA0MDAsIDB4Njc2NTA0MDAsIDB4Njc2YzA0MDAsCi0gICAgICAgIDB4NzM2ZDA0MDAsIDB4NzM2YzA0MDAsIDB4NmQ2YjA0MDAsIDB4NmM2OTA0MDAsIDB4NmQ2NTA0MDAsIDB4NjM2MTVlMDAsCi0gICAgICAgIDB4NzA2ZDA0MDAsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsCi0gICAgICAgIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzA3MjA0MDAsIDB4NzY2OTA0MDAsIDB4NmQ3ODA2MDAsIDB4NmE2ZDA2MDAsCi0gICAgICAgIDB4Njc3MDA0MDAsIDB4NjI2MjA2MDAsIDB4NjE2NzA2MDAsIDB4NmI3OTA2MDAsIDB4NzY2NzA2MDAsIDB4NjI2ZDA0MDAsCi0gICAgICAgIDB4Njc2NDA0MDAsIDB4NmQ3MzA0MDAsIDB4NmI2ZTA0MDAsIDB4NmM2MzA0MDAsIDB4NzY2MzA0MDAsIDB4NmU2YzA0MDAsCi0gICAgICAgIDB4NjE3NzA0MDAsIDB4NjI3MzA0MDAsIDB4NjE2OTA2MDAsIDB4NjQ2ZDA0MDAsIDB4NjM3NTA0MDAsIDB4NjQ2ZjA0MDAsCi0gICAgICAgIDB4Njg3NDA0MDAsIDB4NzQ3NDA0MDAsIDB4NzQ2MzA0MDAsIDB4NjE3YTA0MDAsIDB4NmI3YTA0MDAsIDB4NjI3NDA0MDAsCi0gICAgICAgIDB4Njk2ZTA0MDAsIDB4Njk2ZTA0MDAsIDB4NzA2YjA0MDAsIDB4NjE2NjA0MDAsIDB4NmM2YjA0MDAsIDB4NmQ2ZDA0MDAsCi0gICAgICAgIDB4NmM2MjA0MDAsIDB4NmE2ZjA0MDAsIDB4NzM3OTA0MDAsIDB4Njk3MTA0MDAsIDB4NmI3NzA0MDAsIDB4NzM2MTA0MDAsCi0gICAgICAgIDB4Nzk2NTA0MDAsIDB4NmY2ZDA0MDAsIDB4NzA3MzA0MDAsIDB4NjE2NTA0MDAsIDB4Njk2YzA0MDAsIDB4NjI2ODA0MDAsCi0gICAgICAgIDB4NzE2MTA0MDAsIDB4NmQ2ZTA0MDAsIDB4NmU3MDA0MDAsIDB4NjE2NTA0MDAsIDB4NjE2NTA0MDAsIDB4Njk3MjA0MDAsCi0gICAgICAgIDB4NzU3YTA0MDAsIDB4NzQ2YTA0MDAsIDB4NmI2NzA0MDAsIDB4NzQ2ZDA0MDAsIDB4NmE3MDc0NTcsIDB4NmE3MDc0NTcsCi0gICAgICAgIDB4NmI3MjZjMzgsIDB4NzY2ZTA0MDAsIDB4Njg2YjA0MDAsIDB4NmQ2ZjA0MDAsIDB4NmI2ODA0MDAsIDB4NmM2MTA0MDAsCi0gICAgICAgIDB4NjM2ZTZjMmEsIDB4NjM2ZTZjMmEsIDB4NzQ3NzA0MDAsIDB4NmI3MDA0MDAsIDB4NjI2NDA0MDAsIDB4NmQ3NjA0MDAsCi0gICAgICAgIDB4NmQ3OTA0MDAsIDB4NjE3NTVjNjMsIDB4Njk2NDA0MDAsIDB4NzQ2YzA0MDAsIDB4NzA2ODA0MDAsIDB4NzQ2ODA0MDAsCi0gICAgICAgIDB4NzM2NzVjNDMsIDB4NjI2ZTA0MDAsIDB4NmU3YTA1MjMsIDB4NmQ3MDA0MDAsIDB4Njc3NTA0MDAsIDB4NmU3MjA0MDAsCi0gICAgICAgIDB4NzA2NzA0MDAsIDB4NzQ2ZjA0MDAsIDB4NzM2MjA0MDAsIDB4NzY3NTA0MDAsIDB4NjY2YTA0MDAsIDB4Nzc2NjA0MDAsCi0gICAgICAgIDB4NjE3MzA0MDAsIDB4NmI2OTA0MDAsIDB4NmU2MzA0MDAsIDB4NzA2NjA0MDAsIDB4NjM2YjA0MDAsIDB4Nzc3MzA0MDAsCi0gICAgICAgIDB4NjY2ZDA0MDAsIDB4NmQ2ODA0MDAsIDB4NzA3NzA0MDAsIDB4NjU2NzA0MDAsIDB4NjQ3YTA0MDAsIDB4NmQ2MTA0MDAsCi0gICAgICAgIDB4NzQ2ZTA0MDAsIDB4NmM3OTA0MDAsIDB4Njc2ZDA0MDAsIDB4NzM2ZTA0MDAsIDB4NmQ3MjA0MDAsIDB4NmQ2YzA0MDAsCi0gICAgICAgIDB4Njc2ZTA0MDAsIDB4NjM2OTA0MDAsIDB4NjI2NjA0MDAsIDB4NmU2NTA0MDAsIDB4NzQ2NzA0MDAsIDB4NjI2YTA0MDAsCi0gICAgICAgIDB4NmQ3NTA0MDAsIDB4NmM3MjA0MDAsIDB4NzM2YzA0MDAsIDB4Njc2ODA0MDAsIDB4NmU2NzA0MDAsIDB4NzQ2NDA0MDAsCi0gICAgICAgIDB4NjM2NjA0MDAsIDB4NjM2ZDA0MDAsIDB4NjM3NjA0MDAsIDB4NzM3NDA0MDAsIDB4Njc3MTA0MDAsIDB4Njc2MTA0MDAsCi0gICAgICAgIDB4NjM2NzA0MDAsIDB4NjM2NzA0MDAsIDB4NjE2ZjA0MDAsIDB4Njc3NzA0MDAsIDB4NzM2MzA0MDAsIDB4NzM2NDA0MDAsCi0gICAgICAgIDB4NzI3NzA0MDAsIDB4NjU3NDA0MDAsIDB4NzM2ZjA0MDAsIDB4NjQ2YTA0MDAsIDB4NmI2NTA0MDAsIDB4NzQ3YTA0MDAsCi0gICAgICAgIDB4NzU2NzA0MDAsIDB4NjI2OTA0MDAsIDB4NmQ3YTA0MDAsIDB4N2E2ZDA0MDAsIDB4NmQ2NzA0MDAsIDB4NzI2NTA0MDAsCi0gICAgICAgIDB4N2E3NzA0MDAsIDB4NmU2MTA0MDAsIDB4NmQ3NzA0MDAsIDB4NmM3MzA0MDAsIDB4NjI3NzA0MDAsIDB4NzM3YTA0MDAsCi0gICAgICAgIDB4NmI2ZDA0MDAsIDB4N2E2MTA0MTMsIDB4NjU3MjA0MDAsIDB4NjI3YTA0MDAsIDB4Njc3NDA0MDAsIDB4NzM3NjA0MDAsCi0gICAgICAgIDB4Njg2ZTA2MDAsIDB4NmU2OTA0MDAsIDB4NjM3MjA0MDAsIDB4NzA2MTA0MDAsIDB4NzA2NTA0MDAsIDB4NjE3MjA2MDAsCi0gICAgICAgIDB4NjI3MjA0MDAsIDB4NjM2YzA0MDAsIDB4NjM2ZjA2MDAsIDB4NzY2NTA0MDAsIDB4NjI2ZjA0MDAsIDB4Njc3OTA0MDAsCi0gICAgICAgIDB4NjU2MzA0MDAsIDB4Njc2NjA0MDAsIDB4NzA3OTA0MDAsIDB4NzM3MjA0MDAsIDB4NzU3OTA0MDAsIDB4NjY2YjA0MDAKLSAgICB9OwotCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIk1jY1RhYmxlIjsKIAorICAgIHN0YXRpYyBBcnJheUxpc3Q8TWNjRW50cnk+IHRhYmxlOworCisgICAgc3RhdGljIGNsYXNzIE1jY0VudHJ5IGltcGxlbWVudHMgQ29tcGFyYWJsZTxNY2NFbnRyeT4KKyAgICB7CisgICAgICAgIGludCBtY2M7CisgICAgICAgIFN0cmluZyBpc287CisgICAgICAgIGludCBzbWFsbGVzdERpZ2l0c01uYzsKKyAgICAgICAgU3RyaW5nIGxhbmd1YWdlOworICAgICAgICBpbnQgd2lmaUNoYW5uZWxzOworCisgICAgICAgIE1jY0VudHJ5KGludCBtbmMsIFN0cmluZyBpc28sIGludCBzbWFsbGVzdERpZ2l0c01DQykgeworICAgICAgICAgICAgdGhpcyhtbmMsIGlzbywgc21hbGxlc3REaWdpdHNNQ0MsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgTWNjRW50cnkoaW50IG1uYywgU3RyaW5nIGlzbywgaW50IHNtYWxsZXN0RGlnaXRzTUNDLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMobW5jLCBpc28sIHNtYWxsZXN0RGlnaXRzTUNDLCBsYW5ndWFnZSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBNY2NFbnRyeShpbnQgbW5jLCBTdHJpbmcgaXNvLCBpbnQgc21hbGxlc3REaWdpdHNNQ0MsIFN0cmluZyBsYW5ndWFnZSwgaW50IHdpZmlDaGFubmVscykgeworICAgICAgICAgICAgdGhpcy5tY2MgPSBtbmM7CisgICAgICAgICAgICB0aGlzLmlzbyA9IGlzbzsKKyAgICAgICAgICAgIHRoaXMuc21hbGxlc3REaWdpdHNNbmMgPSBzbWFsbGVzdERpZ2l0c01DQzsKKyAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKyAgICAgICAgICAgIHRoaXMud2lmaUNoYW5uZWxzID0gd2lmaUNoYW5uZWxzOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhNY2NFbnRyeSBvKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWNjIC0gby5tY2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNY2NFbnRyeQorICAgIGVudHJ5Rm9yTWNjKGludCBtY2MpCisgICAgeworICAgICAgICBpbnQgaW5kZXg7CisKKyAgICAgICAgTWNjRW50cnkgbTsKKworICAgICAgICBtID0gbmV3IE1jY0VudHJ5KG1jYywgbnVsbCwgMCk7CisKKyAgICAgICAgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2godGFibGUsIG0pOworCisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYSBkZWZhdWx0IHRpbWUgem9uZSBJRAotICAgICAqIGlmIGF2YWlsYWJsZS4gIFJldHVybnMgbnVsbCBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIGEgZGVmYXVsdCB0aW1lIHpvbmUgSUQgZm9yIHRoZSBnaXZlbiBNQ0MuCisgICAgICogQHBhcmFtIG1jYyBNb2JpbGUgQ291bnRyeSBDb2RlCisgICAgICogQHJldHVybiBkZWZhdWx0IFRpbWVab25lIElELCBvciBudWxsIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0VGltZVpvbmVGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5pc28gPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2NhbGUgbG9jYWxlOworICAgICAgICAgICAgaWYgKGVudHJ5Lmxhbmd1YWdlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGVudHJ5Lmlzbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoZW50cnkubGFuZ3VhZ2UsIGVudHJ5Lmlzbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdbXSB0eiA9IFRpbWVab25lcy5mb3JMb2NhbGUobG9jYWxlKTsKKyAgICAgICAgICAgIGlmICh0ei5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gdHpbMF07CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgdHpJbmQgPSAoaW5kQ29kZSA+Pj4gNCkgJiAweDAwMUY7Ci0gICAgICAgIFN0cmluZyB0eiA9IFRaX1NUUklOR1NbdHpJbmRdOwotICAgICAgICBpZiAodHogPT0gIiIpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ejsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYW4gSVNPIHR3by1jaGFyYWN0ZXIKLSAgICAgKiBjb3VudHJ5IGNvZGUgaWYgYXZhaWxhYmxlLiAgUmV0dXJucyAiIiBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zCisgICAgICogYW4gSVNPIHR3by1jaGFyYWN0ZXIgY291bnRyeSBjb2RlIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zICIiIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdW50cnlDb2RlRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKKyAgICBjb3VudHJ5Q29kZUZvck1jYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkuaXNvOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgYnl0ZVtdIGlzbyA9IHsoYnl0ZSkoKGluZENvZGUgPj4+IDI0KSAmIDB4MDBGRiksIChieXRlKSgoaW5kQ29kZSA+Pj4gMTYpICYgMHgwMEZGKX07Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGlzbyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyBhbiBJU08gMi0zIGNoYXJhY3RlcgotICAgICAqIGxhbmd1YWdlIGNvZGUgaWYgYXZhaWxhYmxlLiAgUmV0dXJucyBudWxsIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMKKyAgICAgKiBhbiBJU08gMi0zIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdExhbmd1YWdlRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkubGFuZ3VhZ2U7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgbGFuZ0luZCA9IGluZENvZGUgJiAweDAwMEY7Ci0gICAgICAgIFN0cmluZyBsYW5nID0gTEFOR19TVFJJTkdTW2xhbmdJbmRdOwotICAgICAgICBpZiAobGFuZyA9PSAiIikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhbmc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIHNtYWxsZXN0IG51bWJlciBvZiBkaWdpdHMgZmllbGQuICBSZXR1cm5zIDIgaWYgdW5hdmFpbGFibGUuCisgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucworICAgICAqIHRoZSBzbWFsbGVzdCBudW1iZXIgb2YgZGlnaXRzIHRoYXQgTSBpZiBhdmFpbGFibGUuCisgICAgICogUmV0dXJucyAyIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNtYWxsZXN0RGlnaXRzTWNjRm9yTW5jKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBpbnQKKyAgICBzbWFsbGVzdERpZ2l0c01jY0Zvck1uYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5zbWFsbGVzdERpZ2l0c01uYzsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCBzbURpZyA9IChpbmRDb2RlID4+PiA5KSAmIDB4MDAwMzsKLSAgICAgICAgcmV0dXJuIHNtRGlnOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgdGhlIG51bWJlciBvZiB3aWZpCiAgICAgICogY2hhbm5lbHMgYWxsb3dlZCBpbiB0aGF0IGNvdW50cnkuICBSZXR1cm5zIDAgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgd2lmaUNoYW5uZWxzRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBpbnQKKyAgICB3aWZpQ2hhbm5lbHNGb3JNY2MoaW50IG1jYykgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5LndpZmlDaGFubmVsczsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCB3aWZpID0gKGluZENvZGUgPj4+IDExKSAmIDB4MDAwRjsKLSAgICAgICAgcmV0dXJuIHdpZmk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NTgsNCArMjc2LDI2MiBAQAogICAgICAgICAgICAgd00uc2V0TnVtQWxsb3dlZENoYW5uZWxzKHdpZmlDaGFubmVscywgdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBzdGF0aWMgeworICAgICAgICB0YWJsZSA9IG5ldyBBcnJheUxpc3Q8TWNjRW50cnk+KDI0MCk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgdGFibGUgYmVsb3cgaXMgYnVpbHQgZnJvbSB0d28gcmVzb3VyY2VzOgorICAgICAgICAgKgorICAgICAgICAgKiAxKSBJVFUgIk1vYmlsZSBOZXR3b3JrIENvZGUgKE1OQykgZm9yIHRoZSBpbnRlcm5hdGlvbmFsCisgICAgICAgICAqICAgaWRlbnRpZmljYXRpb24gcGxhbiBmb3IgbW9iaWxlIHRlcm1pbmFscyBhbmQgbW9iaWxlIHVzZXJzIgorICAgICAgICAgKiAgIHdoaWNoIGlzIGF2YWlsYWJsZSBhcyBhbiBhbm5leCB0byB0aGUgSVRVIG9wZXJhdGlvbmFsIGJ1bGxldGluCisgICAgICAgICAqICAgYXZhaWxhYmxlIGhlcmU6IGh0dHA6Ly93d3cuaXR1LmludC9pdHUtdC9idWxsZXRpbi9hbm5leC5odG1sCisgICAgICAgICAqCisgICAgICAgICAqIDIpIFRoZSBJU08gMzE2NiBjb3VudHJ5IGNvZGVzIGxpc3QsIGF2YWlsYWJsZSBoZXJlOgorICAgICAgICAgKiAgICBodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2VuL3Byb2RzLXNlcnZpY2VzL2lzbzMxNjZtYS8wMmlzby0zMTY2LWNvZGUtbGlzdHMvaW5kZXguaHRtbAorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHRhYmxlIGhhcyBub3QgYmVlbiB2ZXJpZmllZC4KKyAgICAgICAgICoKKyAgICAgICAgICovCisKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDIsImdyIiwyKSk7CS8vR3JlZWNlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA0LCJubCIsMiwibmwiLDEzKSk7CS8vTmV0aGVybGFuZHMgKEtpbmdkb20gb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwNiwiYmUiLDIpKTsJLy9CZWxnaXVtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA4LCJmciIsMiwiZnIiKSk7CS8vRnJhbmNlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjEyLCJtYyIsMikpOwkvL01vbmFjbyAoUHJpbmNpcGFsaXR5IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxMywiYWQiLDIpKTsJLy9BbmRvcnJhIChQcmluY2lwYWxpdHkgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE0LCJlcyIsMiwiZXMiKSk7CS8vU3BhaW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTYsImh1IiwyKSk7CS8vSHVuZ2FyeSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE4LCJiYSIsMikpOwkvL0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTksImhyIiwyKSk7CS8vQ3JvYXRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjIwLCJycyIsMikpOwkvL1NlcmJpYSBhbmQgTW9udGVuZWdybworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyMiwiaXQiLDIsIml0IikpOwkvL0l0YWx5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI1LCJ2YSIsMiwiaXQiKSk7CS8vVmF0aWNhbiBDaXR5IFN0YXRlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI2LCJybyIsMikpOwkvL1JvbWFuaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjgsImNoIiwyLCJkZSIpKTsJLy9Td2l0emVybGFuZCAoQ29uZmVkZXJhdGlvbiBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzAsImN6IiwyLCJjcyIsMTMpKTsJLy9DemVjaCBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzMSwic2siLDIpKTsJLy9TbG92YWsgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzIsImF0IiwyLCJkZSIsMTMpKTsJLy9BdXN0cmlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjM0LCJnYiIsMiwiZW4iLDEzKSk7CS8vVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzNSwiZ2IiLDIsImVuIiwxMykpOwkvL1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzgsImRrIiwyKSk7CS8vRGVubWFyaworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0MCwic2UiLDIpKTsJLy9Td2VkZW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDIsIm5vIiwyKSk7CS8vTm9yd2F5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ0LCJmaSIsMikpOwkvL0ZpbmxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDYsImx0IiwyKSk7CS8vTGl0aHVhbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDcsImx2IiwyKSk7CS8vTGF0dmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDgsImVlIiwyKSk7CS8vRXN0b25pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjUwLCJydSIsMikpOwkvL1J1c3NpYW4gRmVkZXJhdGlvbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1NSwidWEiLDIpKTsJLy9Va3JhaW5lCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjU3LCJieSIsMikpOwkvL0JlbGFydXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1OSwibWQiLDIpKTsJLy9Nb2xkb3ZhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjAsInBsIiwyKSk7CS8vUG9sYW5kIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjIsImRlIiwyLCJkZSIsMTMpKTsJLy9HZXJtYW55IChGZWRlcmFsIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2NiwiZ2kiLDIpKTsJLy9HaWJyYWx0YXIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjgsInB0IiwyKSk7CS8vUG9ydHVnYWwKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzAsImx1IiwyKSk7CS8vTHV4ZW1ib3VyZworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3MiwiaWUiLDIsImVuIikpOwkvL0lyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzQsImlzIiwyKSk7CS8vSWNlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3NiwiYWwiLDIpKTsJLy9BbGJhbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzgsIm10IiwyKSk7CS8vTWFsdGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODAsImN5IiwyKSk7CS8vQ3lwcnVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODIsImdlIiwyKSk7CS8vR2VvcmdpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4MywiYW0iLDIpKTsJLy9Bcm1lbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODQsImJnIiwyKSk7CS8vQnVsZ2FyaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4NiwidHIiLDIpKTsJLy9UdXJrZXkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODgsImZvIiwyKSk7CS8vRmFyb2UgSXNsYW5kcworICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg5LCJnZSIsMikpOyAgICAvL0Fia2hhemlhIChHZW9yZ2lhKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5MCwiZ2wiLDIpKTsJLy9HcmVlbmxhbmQgKERlbm1hcmspCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjkyLCJzbSIsMikpOwkvL1NhbiBNYXJpbm8gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5Mywic2wiLDIpKTsJLy9TbG92ZW5pYSAoUmVwdWJsaWMgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTQsIm1rIiwyKSk7ICAgLy9UaGUgRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5NSwibGkiLDIpKTsJLy9MaWVjaHRlbnN0ZWluIChQcmluY2lwYWxpdHkgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTcsIm1lIiwyKSk7ICAgIC8vTW9udGVuZWdybyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzAyLCJjYSIsMywiIiwxMSkpOwkvL0NhbmFkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMwOCwicG0iLDIpKTsJLy9TYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIChDb2xsZWN0aXZpdCB0ZXJyaXRvcmlhbGUgZGUgbGEgUnB1YmxpcXVlIGZyYW5haXNlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMCwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMSwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMiwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMywidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNCwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNSwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNiwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzMCwicHIiLDIpKTsJLy9QdWVydG8gUmljbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzMiwidmkiLDIpKTsJLy9Vbml0ZWQgU3RhdGVzIFZpcmdpbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzM0LCJteCIsMykpOwkvL01leGljbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzOCwiam0iLDMpKTsJLy9KYW1haWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQwLCJncCIsMikpOwkvL0d1YWRlbG91cGUgKEZyZW5jaCBEZXBhcnRtZW50IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0MiwiYmIiLDMpKTsJLy9CYXJiYWRvcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0NCwiYWciLDMpKTsJLy9BbnRpZ3VhIGFuZCBCYXJidWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ2LCJreSIsMykpOwkvL0NheW1hbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ4LCJ2ZyIsMykpOwkvL0JyaXRpc2ggVmlyZ2luIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTAsImJtIiwyKSk7CS8vQmVybXVkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1MiwiZ2QiLDIpKTsJLy9HcmVuYWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU0LCJtcyIsMikpOwkvL01vbnRzZXJyYXQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTYsImtuIiwyKSk7CS8vU2FpbnQgS2l0dHMgYW5kIE5ldmlzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU4LCJsYyIsMikpOwkvL1NhaW50IEx1Y2lhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYwLCJ2YyIsMikpOwkvL1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYyLCJubCIsMikpOwkvL05ldGhlcmxhbmRzIEFudGlsbGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYzLCJhdyIsMikpOwkvL0FydWJhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY0LCJicyIsMikpOwkvL0JhaGFtYXMgKENvbW1vbndlYWx0aCBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY1LCJhaSIsMykpOwkvL0FuZ3VpbGxhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY2LCJkbSIsMikpOwkvL0RvbWluaWNhIChDb21tb253ZWFsdGggb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY4LCJjdSIsMikpOwkvL0N1YmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzAsImRvIiwyKSk7CS8vRG9taW5pY2FuIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzcyLCJodCIsMikpOwkvL0hhaXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzQsInR0IiwyKSk7CS8vVHJpbmlkYWQgYW5kIFRvYmFnbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3NiwidGMiLDIpKTsJLy9UdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDAsImF6IiwyKSk7CS8vQXplcmJhaWphbmkgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDEsImt6IiwyKSk7CS8vS2F6YWtoc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDAyLCJidCIsMikpOwkvL0JodXRhbiAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDQsImluIiwyKSk7CS8vSW5kaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwNSwiaW4iLDIpKTsJLy9JbmRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDEwLCJwayIsMikpOwkvL1Bha2lzdGFuIChJc2xhbWljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMiwiYWYiLDIpKTsJLy9BZmdoYW5pc3RhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMywibGsiLDIpKTsJLy9TcmkgTGFua2EgKERlbW9jcmF0aWMgU29jaWFsaXN0IFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNCwibW0iLDIpKTsJLy9NeWFubWFyIChVbmlvbiBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTUsImxiIiwyKSk7CS8vTGViYW5vbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNiwiam8iLDIpKTsJLy9Kb3JkYW4gKEhhc2hlbWl0ZSBLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNywic3kiLDIpKTsJLy9TeXJpYW4gQXJhYiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxOCwiaXEiLDIpKTsJLy9JcmFxIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTksImt3IiwyKSk7CS8vS3V3YWl0IChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjAsInNhIiwyKSk7CS8vU2F1ZGkgQXJhYmlhIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMSwieWUiLDIpKTsJLy9ZZW1lbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIyLCJvbSIsMikpOwkvL09tYW4gKFN1bHRhbmF0ZSBvZikKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMywicHMiLDIpKTsgICAgLy9QYWxlc3RpbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjQsImFlIiwyKSk7CS8vVW5pdGVkIEFyYWIgRW1pcmF0ZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjUsImlsIiwyKSk7CS8vSXNyYWVsIChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjYsImJoIiwyKSk7CS8vQmFocmFpbiAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjcsInFhIiwyKSk7CS8vUWF0YXIgKFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyOCwibW4iLDIpKTsJLy9Nb25nb2xpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyOSwibnAiLDIpKTsJLy9OZXBhbAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMCwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMSwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMiwiaXIiLDIpKTsJLy9JcmFuIChJc2xhbWljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzNCwidXoiLDIpKTsJLy9VemJla2lzdGFuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzYsInRqIiwyKSk7CS8vVGFqaWtpc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM3LCJrZyIsMikpOwkvL0t5cmd5eiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzOCwidG0iLDIpKTsJLy9UdXJrbWVuaXN0YW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NDAsImpwIiwyLCJqYSIsMTQpKTsJLy9KYXBhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ0MSwianAiLDIsImphIiwxNCkpOwkvL0phcGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDUwLCJrciIsMiwia28iLDEzKSk7CS8vS29yZWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1Miwidm4iLDIpKTsJLy9WaWV0IE5hbSAoU29jaWFsaXN0IFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1NCwiaGsiLDIpKTsJLy8iSG9uZyBLb25nLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTUsIm1vIiwyKSk7CS8vIk1hY2FvLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTYsImtoIiwyKSk7CS8vQ2FtYm9kaWEgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU3LCJsYSIsMikpOwkvL0xhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDYwLCJjbiIsMiwiemgiLDEzKSk7CS8vQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2MSwiY24iLDIsInpoIiwxMykpOwkvL0NoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NjYsInR3IiwyKSk7CS8vIlRhaXdhbiwgQ2hpbmEiCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDY3LCJrcCIsMikpOwkvL0RlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YgS29yZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NzAsImJkIiwyKSk7CS8vQmFuZ2xhZGVzaCAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDcyLCJtdiIsMikpOwkvL01hbGRpdmVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDIsIm15IiwyKSk7CS8vTWFsYXlzaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDUsImF1IiwyLCJlbiIsMTEpKTsJLy9BdXN0cmFsaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTAsImlkIiwyKSk7CS8vSW5kb25lc2lhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTQsInRsIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBUaW1vci1MZXN0ZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUxNSwicGgiLDIpKTsJLy9QaGlsaXBwaW5lcyAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyMCwidGgiLDIpKTsJLy9UaGFpbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyNSwic2ciLDIsImVuIiwxMSkpOwkvL1NpbmdhcG9yZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTI4LCJibiIsMikpOwkvL0JydW5laSBEYXJ1c3NhbGFtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTMwLCJueiIsMiwgImVuIikpOwkvL05ldyBaZWFsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM0LCJtcCIsMikpOwkvL05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzUsImd1IiwyKSk7CS8vR3VhbQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNiwibnIiLDIpKTsJLy9OYXVydSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM3LCJwZyIsMikpOwkvL1BhcHVhIE5ldyBHdWluZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzksInRvIiwyKSk7CS8vVG9uZ2EgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQwLCJzYiIsMikpOwkvL1NvbG9tb24gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0MSwidnUiLDIpKTsJLy9WYW51YXR1IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDIsImZqIiwyKSk7CS8vRmlqaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQzLCJ3ZiIsMikpOwkvL1dhbGxpcyBhbmQgRnV0dW5hIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ0LCJhcyIsMikpOwkvL0FtZXJpY2FuIFNhbW9hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ1LCJraSIsMikpOwkvL0tpcmliYXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDYsIm5jIiwyKSk7CS8vTmV3IENhbGVkb25pYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NywicGYiLDIpKTsJLy9GcmVuY2ggUG9seW5lc2lhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ4LCJjayIsMikpOwkvL0Nvb2sgSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0OSwid3MiLDIpKTsJLy9TYW1vYSAoSW5kZXBlbmRlbnQgU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUwLCJmbSIsMikpOwkvL01pY3JvbmVzaWEgKEZlZGVyYXRlZCBTdGF0ZXMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUxLCJtaCIsMikpOwkvL01hcnNoYWxsIElzbGFuZHMgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NTIsInB3IiwyKSk7CS8vUGFsYXUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwMiwiZWciLDIpKTsJLy9FZ3lwdCAoQXJhYiBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDMsImR6IiwyKSk7CS8vQWxnZXJpYSAoUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDQsIm1hIiwyKSk7CS8vTW9yb2NjbyAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDUsInRuIiwyKSk7CS8vVHVuaXNpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwNiwibHkiLDIpKTsJLy9MaWJ5YSAoU29jaWFsaXN0IFBlb3BsZSdzIExpYnlhbiBBcmFiIEphbWFoaXJpeWEpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA3LCJnbSIsMikpOwkvL0dhbWJpYSAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwOCwic24iLDIpKTsJLy9TZW5lZ2FsIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDksIm1yIiwyKSk7CS8vTWF1cml0YW5pYSAoSXNsYW1pYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTAsIm1sIiwyKSk7CS8vTWFsaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjExLCJnbiIsMikpOwkvL0d1aW5lYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEyLCJjaSIsMikpOwkvL0N0ZSBkJ0l2b2lyZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEzLCJiZiIsMikpOwkvL0J1cmtpbmEgRmFzbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNCwibmUiLDIpKTsJLy9OaWdlciAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNSwidGciLDIpKTsJLy9Ub2dvbGVzZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNiwiYmoiLDIpKTsJLy9CZW5pbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE3LCJtdSIsMikpOwkvL01hdXJpdGl1cyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE4LCJsciIsMikpOwkvL0xpYmVyaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxOSwic2wiLDIpKTsJLy9TaWVycmEgTGVvbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjAsImdoIiwyKSk7CS8vR2hhbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjEsIm5nIiwyKSk7CS8vTmlnZXJpYSAoRmVkZXJhbCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjIsInRkIiwyKSk7CS8vQ2hhZCAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIzLCJjZiIsMikpOwkvL0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNCwiY20iLDIpKTsJLy9DYW1lcm9vbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI1LCJjdiIsMikpOwkvL0NhcGUgVmVyZGUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNiwic3QiLDIpKTsJLy9TYW8gVG9tZSBhbmQgUHJpbmNpcGUgKERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI3LCJncSIsMikpOwkvL0VxdWF0b3JpYWwgR3VpbmVhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjgsImdhIiwyKSk7CS8vR2Fib25lc2UgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjksImNnIiwyKSk7CS8vQ29uZ28gKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzAsImNnIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzEsImFvIiwyKSk7CS8vQW5nb2xhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzIsImd3IiwyKSk7CS8vR3VpbmVhLUJpc3NhdSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMzLCJzYyIsMikpOwkvL1NleWNoZWxsZXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNCwic2QiLDIpKTsJLy9TdWRhbiAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNSwicnciLDIpKTsJLy9Sd2FuZGEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNiwiZXQiLDIpKTsJLy9FdGhpb3BpYSAoRmVkZXJhbCBEZW1vY3JhdGljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNywic28iLDIpKTsJLy9Tb21hbGkgRGVtb2NyYXRpYyBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzOCwiZGoiLDIpKTsJLy9Eamlib3V0aSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM5LCJrZSIsMikpOwkvL0tlbnlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDAsInR6IiwyKSk7CS8vVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDEsInVnIiwyKSk7CS8vVWdhbmRhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDIsImJpIiwyKSk7CS8vQnVydW5kaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQzLCJteiIsMikpOwkvL01vemFtYmlxdWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NSwiem0iLDIpKTsJLy9aYW1iaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NiwibWciLDIpKTsJLy9NYWRhZ2FzY2FyIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDcsInJlIiwyKSk7CS8vUmV1bmlvbiAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ4LCJ6dyIsMikpOwkvL1ppbWJhYndlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDksIm5hIiwyKSk7CS8vTmFtaWJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUwLCJtdyIsMikpOwkvL01hbGF3aQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MSwibHMiLDIpKTsJLy9MZXNvdGhvIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MiwiYnciLDIpKTsJLy9Cb3Rzd2FuYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUzLCJzeiIsMikpOwkvL1N3YXppbGFuZCAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTQsImttIiwyKSk7CS8vQ29tb3JvcyAoVW5pb24gb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1NSwiemEiLDIsImVuIikpOwkvL1NvdXRoIEFmcmljYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjU3LCJlciIsMikpOwkvL0VyaXRyZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDIsImJ6IiwyKSk7CS8vQmVsaXplCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA0LCJndCIsMikpOwkvL0d1YXRlbWFsYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA2LCJzdiIsMikpOwkvL0VsIFNhbHZhZG9yIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDgsImhuIiwzKSk7CS8vSG9uZHVyYXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxMCwibmkiLDIpKTsJLy9OaWNhcmFndWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTIsImNyIiwyKSk7CS8vQ29zdGEgUmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNCwicGEiLDIpKTsJLy9QYW5hbWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNiwicGUiLDIpKTsJLy9QZXJ1CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzIyLCJhciIsMykpOwkvL0FyZ2VudGluZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcyNCwiYnIiLDIpKTsJLy9CcmF6aWwgKEZlZGVyYXRpdmUgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMwLCJjbCIsMikpOwkvL0NoaWxlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMyLCJjbyIsMykpOwkvL0NvbG9tYmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzQsInZlIiwyKSk7CS8vVmVuZXp1ZWxhIChCb2xpdmFyaWFuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczNiwiYm8iLDIpKTsJLy9Cb2xpdmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzgsImd5IiwyKSk7CS8vR3V5YW5hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQwLCJlYyIsMikpOwkvL0VjdWFkb3IKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDIsImdmIiwyKSk7CS8vRnJlbmNoIEd1aWFuYSAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQ0LCJweSIsMikpOwkvL1BhcmFndWF5IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDYsInNyIiwyKSk7CS8vU3VyaW5hbWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0OCwidXkiLDIpKTsJLy9VcnVndWF5IChFYXN0ZXJuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc1MCwiZmsiLDIpKTsJLy9GYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcykKKyAgICAgICAgLy90YWJsZS5hZGQobmV3IE1jY0VudHJ5KDkwMSwiIiwyKSk7CS8vIkludGVybmF0aW9uYWwgTW9iaWxlLCBzaGFyZWQgY29kZSIKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRhYmxlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCmluZGV4IGU0MjZlOTQuLjI5NTdjN2UgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCkBAIC0xNywxMCArMTcsMTAgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CkBAIC0yOCw3ICsyOCw2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGF0YUNvbm5lY3Rpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbURhdGFDb25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZFJhZGlvQ29udHJvbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtOTksMTEgKzk4LDEyIEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORV9OQU1FX0tFWSA9ICJwaG9uZU5hbWUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fS0VZID0gInJlYXNvbiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9DSEFOR0VfUkVBU09OX0tFWSA9ICJyZWFzb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fVFlQRVNfS0VZID0gImFwblR5cGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fVFlQRV9LRVkgPSAiYXBuVHlwZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0FQTl9LRVkgPSAiYXBuIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfTElOS19QUk9QRVJUSUVTX0tFWSA9ICJsaW5rUHJvcGVydGllcyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0xJTktfQ0FQQUJJTElUSUVTX0tFWSA9ICJsaW5rQ2FwYWJpbGl0aWVzIjsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9JRkFDRV9OQU1FX0tFWSA9ICJpZmFjZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0dBVEVXQVlfS0VZID0gImdhdGV3YXkiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19VTkFWQUlMQUJMRV9LRVkgPSAibmV0d29ya1VudmFpbGFibGUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVfSU5fRUNNX1NUQVRFID0gInBob25laW5FQ01TdGF0ZSI7CiAKQEAgLTI0MywxMyArMjQzLDIxIEBACiAgICAgQ2VsbExvY2F0aW9uIGdldENlbGxMb2NhdGlvbigpOwogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IERhdGFTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBleGlzdHMgYXQgdGhpcwotICAgICAqIGludGVyZmFjZSAtLSB1c2UKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZm9yIHRoZSBkZWZhdWx0IGFwbiBEYXRhU3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24KKyAgICAgKiBleGlzdHMgYXQgdGhpcyBpbnRlcmZhY2UgLS0gdXNlCiAgICAgICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcn0gaW5zdGVhZC4KICAgICAgKi8KICAgICBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOwogCiAgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IERhdGFTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBleGlzdHMgYXQgdGhpcworICAgICAqIGludGVyZmFjZSAtLSB1c2UKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyfSBpbnN0ZWFkLgorICAgICAqIEBwYXJhbSBhcG5UeXBlIHNwZWNpZnkgZm9yIHdoaWNoIGFwbiB0byBnZXQgY29ubmVjdGlvbiBzdGF0ZSBpbmZvLgorICAgICAqLworICAgIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKTsKKworICAgIC8qKgogICAgICAqIEdldCB0aGUgY3VycmVudCBEYXRhQWN0aXZpdHlTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBleGlzdHMgYXQgdGhpcwogICAgICAqIGludGVyZmFjZSAtLSB1c2UKICAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcn0gaW5zdGVhZC4KQEAgLTMxMyw2ICszMjEsMTYgQEAKICAgICBTdHJpbmcgZ2V0QWN0aXZlQXBuKCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExpbmtQcm9wZXJ0aWVzIGZvciB0aGUgbmFtZWQgYXBuIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQorICAgICAqLworICAgIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTGlua0NhcGFiaWxpdGllcworICAgICAqLworICAgIExpbmtDYXBhYmlsaXRpZXMgZ2V0TGlua0NhcGFiaWxpdGllcyhTdHJpbmcgYXBuVHlwZSk7CisKKyAgICAvKioKICAgICAgKiBHZXQgY3VycmVudCBzaWduYWwgc3RyZW5ndGguIE5vIGNoYW5nZSBub3RpZmljYXRpb24gYXZhaWxhYmxlIG9uIHRoaXMKICAgICAgKiBpbnRlcmZhY2UuIFVzZSA8Y29kZT5QaG9uZVN0YXRlTm90aWZpZXI8L2NvZGU+IG9yIGFuIGVxdWl2YWxlbnQuCiAgICAgICogQW4gQVNVIGlzIDAtMzEgb3IgLTEgaWYgdW5rbm93biAoZm9yIEdTTSwgZEJtID0gLTExMyAtIDIgKiBhc3UpLgpAQCAtMTM3MywyOSArMTM5MSw2IEBACiAgICAgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBieSB0aGUgc3BlY2lmaWVkIEFQTiB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZAotICAgICAqIEFQTiB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ2F0ZXdheSBmb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZCBBUE4KLSAgICAgKiB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEROUyBzZXJ2ZXJzIGZvciB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBieSB0aGUgc3BlY2lmaWVkCi0gICAgICogQVBOIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgLyoqCiAgICAgICogUmV0cmlldmVzIHRoZSB1bmlxdWUgZGV2aWNlIElELCBlLmcuLCBJTUVJIGZvciBHU00gcGhvbmVzIGFuZCBNRUlEIGZvciBDRE1BIHBob25lcy4KICAgICAgKi8KICAgICBTdHJpbmcgZ2V0RGV2aWNlSWQoKTsKQEAgLTE1NDAsNiArMTUzNSwxMSBAQAogICAgIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cik7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgT1RBIFNlcnZpY2UgUHJvdmlzaW9uaW5nIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAgKi8KKyAgICBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOworCisgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBDRE1BIGNhbGwgd2FpdGluZyBjb21lcwogICAgICAqCiAgICAgICogQHBhcmFtIGggSGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQppbmRleCAxNjc0YWQ2Li43NGU4YzFiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCkBAIC0yMSw2ICsyMSw4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC0zNSwxMCArMzcsOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR3NtRGF0YUNvbm5lY3Rpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkUmFkaW9Db250cm9sOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogCkBAIC03NDEsOCArNzQxLDEzIEBACiAgICAgICAgIG1Ob3RpZmllci5ub3RpZnlNZXNzYWdlV2FpdGluZ0NoYW5nZWQodGhpcyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgewotICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uLCBhcG5UeXBlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uKHRoaXMsIHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgfQogCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQaG9uZU5hbWUoKTsKQEAgLTgyOCw5ICs4MzMsMTkgQEAKICAgICAgICAgbG9nVW5leHBlY3RlZENkbWFNZXRob2RDYWxsKCJ1bnJlZ2lzdGVyRm9yU3Vic2NyaXB0aW9uSW5mb1JlYWR5Iik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICogSWYgbm90IG92ZXJyaWRkZW4gcmV0dXJuIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIG51bWJlciBpcyBhbiBPVEFTUCBudW1iZXIuCisgICAgICogSWYgbm90IG92ZXJyaWRkZW4gcmV0dXJuIGZhbHNlLgorICAgICAqLwogICAgIHB1YmxpYyAgYm9vbGVhbiBpc090YVNwTnVtYmVyKFN0cmluZyBkaWFsU3RyKSB7Ci0gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNsYXNzIENETUFQaG9uZS4gTm90IGltcGxlbWVudGVkIGluIEdTTVBob25lLgotICAgICAgICBsb2dVbmV4cGVjdGVkQ2RtYU1ldGhvZENhbGwoImlzT3RhU3BOdW1iZXIiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtOTIwLDMwICs5MzUsMjIgQEAKICAgICAgICAgIGxvZ1VuZXhwZWN0ZWRDZG1hTWV0aG9kQ2FsbCgidW5zZXRPbkVjYk1vZGVFeGl0UmVzcG9uc2UiKTsKICAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0SW50ZXJmYWNlTmFtZShhcG5UeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElwQWRkcmVzcyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldElwQWRkcmVzcyhhcG5UeXBlKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlFbmFibGVkKCkgewogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldERhdGFFbmFibGVkKCk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0R2F0ZXdheShhcG5UeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zU2VydmVycyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldERuc1NlcnZlcnMoYXBuVHlwZSk7Ci0gICAgfQotCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEFjdGl2ZUFwblR5cGVzKCkgewogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldEFjdGl2ZUFwblR5cGVzKCk7CiAgICAgfQogCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0TGlua1Byb3BlcnRpZXMoYXBuVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgZ2V0TGlua0NhcGFiaWxpdGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldExpbmtDYXBhYmlsaXRpZXMoYXBuVHlwZSk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRBY3RpdmVBcG4oKSB7CiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0QWN0aXZlQXBuU3RyaW5nKCk7CiAgICAgfQpAQCAtOTU2LDYgKzk2MywxMCBAQAogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmRpc2FibGVBcG5UeXBlKHR5cGUpOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCkgeworICAgICAgICByZXR1cm4gKChtRGF0YUNvbm5lY3Rpb24gIT0gbnVsbCkgJiYgKG1EYXRhQ29ubmVjdGlvbi5pc0RhdGFQb3NzaWJsZSgpKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogc2ltdWxhdGVEYXRhQ29ubmVjdGlvbgogICAgICAqCkBAIC05ODQsNyArOTk1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1EYXRhQ29ubmVjdGlvbi5zZXRTdGF0ZShkY1N0YXRlKTsKLSAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwsIFBob25lLkFQTl9UWVBFX0RFRkFVTFQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAzOCw2ICsxMDQ5LDEwIEBACiAgICAgICAgICAgICAgICAgImNhbGxlZCwgQ0RNQVBob25lIGluYWN0aXZlLiIpOwogICAgIH0KIAorICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERhdGFDb25uZWN0aW9uU3RhdGUoQVBOX1RZUEVfREVGQVVMVCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29tbW9uIGVycm9yIGxvZ2dlciBtZXRob2QgZm9yIHVuZXhwZWN0ZWQgY2FsbHMgdG8gR1NNL1dDRE1BLW9ubHkgbWV0aG9kcy4KICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhCmluZGV4IGU5NmVlYWUuLjY5MTI3MWYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YQpAQCAtMzMsOSArMzMsMTIgQEAKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChQaG9uZSBzZW5kZXIpOwogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKTsKIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbik7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSk7CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKTsKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eShQaG9uZSBzZW5kZXIpOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQppbmRleCA3N2YxZTZjLi4wMmZkZjI4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKQEAgLTIwLDEzICsyMCwxMiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsTG9jYXRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TaWduYWxTdHJlbmd0aDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMzQsNyArMzMsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLkNETUFQaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21EYXRhQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTE3Miw3ICsxNzAsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldERhdGFDb25uZWN0aW9uU3RhdGUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CisgICAgfQorCisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YUFjdGl2aXR5U3RhdGUgZ2V0RGF0YUFjdGl2aXR5U3RhdGUoKSB7CkBAIC0yMDcsNiArMjA5LDE0IEBACiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0QWN0aXZlQXBuVHlwZXMoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRMaW5rUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlua0NhcGFiaWxpdGllcyBnZXRMaW5rQ2FwYWJpbGl0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0TGlua0NhcGFiaWxpdGllcyhhcG5UeXBlKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGl2ZUFwbigpIHsKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRBY3RpdmVBcG4oKTsKICAgICB9CkBAIC02NjQsMjIgKzY3NCw2IEBACiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRJbnRlcmZhY2VOYW1lKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0SXBBZGRyZXNzKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEdhdGV3YXkoYXBuVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREbnNTZXJ2ZXJzKGFwblR5cGUpOwotICAgIH0KLQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV2aWNlSWQoKSB7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGV2aWNlSWQoKTsKICAgICB9CkBAIC03NjgsNiArNzYyLDEwIEBACiAgICAgICAgIG1BY3RpdmVQaG9uZS5leGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCl7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cil7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNPdGFTcE51bWJlcihkaWFsU3RyKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKaW5kZXggNTY5YWM1Yy4uOGMyMjgwYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQpAQCAtMjg1LDkgKzI4NSw4IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIC8vKioqKiogSGFuZGxlciBpbXBsZW1lbWVudGF0aW9uCi0KLSAgICAgICAgcHVibGljIHZvaWQKKyAgICAgICAgLy8qKioqKiBIYW5kbGVyIGltcGxlbWVudGF0aW9uCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZAogICAgICAgICBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBSSUxSZXF1ZXN0IHJyID0gKFJJTFJlcXVlc3QpKG1zZy5vYmopOwogICAgICAgICAgICAgUklMUmVxdWVzdCByZXEgPSBudWxsOwpAQCAtNzgwLDcgKzc3OSw3IEBACiAgICAgICAgIHNlbmQocnIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkCisgICAgQERlcHJlY2F0ZWQgcHVibGljIHZvaWQKICAgICBnZXRQRFBDb250ZXh0TGlzdChNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICBnZXREYXRhQ2FsbExpc3QocmVzdWx0KTsKICAgICB9CkBAIC0xMjk5LDEwICsxMjk4LDE4IEBACiAgICAgcHVibGljIHZvaWQKICAgICBzZXR1cERhdGFDYWxsKFN0cmluZyByYWRpb1RlY2hub2xvZ3ksIFN0cmluZyBwcm9maWxlLCBTdHJpbmcgYXBuLAogICAgICAgICAgICAgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgU3RyaW5nIGF1dGhUeXBlLCBNZXNzYWdlIHJlc3VsdCkgeworICAgICAgICBzZXR1cERhdGFDYWxsV2l0aFByb3RvY29sKHJhZGlvVGVjaG5vbG9neSwgcHJvZmlsZSwgYXBuLCB1c2VyLCBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhUeXBlLCAiSVAiLCByZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkCisgICAgc2V0dXBEYXRhQ2FsbFdpdGhQcm90b2NvbChTdHJpbmcgcmFkaW9UZWNobm9sb2d5LCBTdHJpbmcgcHJvZmlsZSwKKyAgICAgICAgICAgIFN0cmluZyBhcG4sIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyBhdXRoVHlwZSwKKyAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbFR5cGUsIE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIFJJTFJlcXVlc3QgcnIKICAgICAgICAgICAgICAgICA9IFJJTFJlcXVlc3Qub2J0YWluKFJJTF9SRVFVRVNUX1NFVFVQX0RBVEFfQ0FMTCwgcmVzdWx0KTsKIAotICAgICAgICByci5tcC53cml0ZUludCg2KTsKKyAgICAgICAgcnIubXAud3JpdGVJbnQoNyk7CiAKICAgICAgICAgcnIubXAud3JpdGVTdHJpbmcocmFkaW9UZWNobm9sb2d5KTsKICAgICAgICAgcnIubXAud3JpdGVTdHJpbmcocHJvZmlsZSk7CkBAIC0xMzEwLDExICsxMzE3LDEyIEBACiAgICAgICAgIHJyLm1wLndyaXRlU3RyaW5nKHVzZXIpOwogICAgICAgICByci5tcC53cml0ZVN0cmluZyhwYXNzd29yZCk7CiAgICAgICAgIHJyLm1wLndyaXRlU3RyaW5nKGF1dGhUeXBlKTsKKyAgICAgICAgcnIubXAud3JpdGVTdHJpbmcocHJvdG9jb2xUeXBlKTsKIAogICAgICAgICBpZiAoUklMSl9MT0dEKSByaWxqTG9nKHJyLnNlcmlhbFN0cmluZygpICsgIj4gIgogICAgICAgICAgICAgICAgICsgcmVxdWVzdFRvU3RyaW5nKHJyLm1SZXF1ZXN0KSArICIgIiArIHJhZGlvVGVjaG5vbG9neSArICIgIgogICAgICAgICAgICAgICAgICsgcHJvZmlsZSArICIgIiArIGFwbiArICIgIiArIHVzZXIgKyAiICIKLSAgICAgICAgICAgICAgICArIHBhc3N3b3JkICsgIiAiICsgYXV0aFR5cGUpOworICAgICAgICAgICAgICAgICsgcGFzc3dvcmQgKyAiICIgKyBhdXRoVHlwZSArICIgIiArIHByb3RvY29sVHlwZSk7CiAKICAgICAgICAgc2VuZChycik7CiAgICAgfQpAQCAtMjkwMiw3ICsyOTEwLDExIEBACiAgICAgICAgICAgICBkYXRhQ2FsbC5hY3RpdmUgPSBwLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGRhdGFDYWxsLnR5cGUgPSBwLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIGRhdGFDYWxsLmFwbiA9IHAucmVhZFN0cmluZygpOwotICAgICAgICAgICAgZGF0YUNhbGwuYWRkcmVzcyA9IHAucmVhZFN0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBwLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5zcGxpdCgiICIpWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YUNhbGwuYWRkcmVzcyA9IGFkZHJlc3M7CiAKICAgICAgICAgICAgIHJlc3BvbnNlLmFkZChkYXRhQ2FsbCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IDkxN2UxZDguLjNhN2NlNDcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQpAQCAtMjU1LDYgKzI1NSw3IEBACiAgICAgICAgIG1DbS51bnJlZ2lzdGVyRm9yT24odGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlNNU0Rpc3BhdGNoZXIgZmluYWxpemVkIik7CiAgICAgfQpAQCAtOTI3LDE0ICs5MjgsMTQgQEAKICAgICAgKi8KICAgICBzdGF0aWMgcHJvdGVjdGVkIGNsYXNzIFNtc1RyYWNrZXIgewogICAgICAgICAvLyBmaWVsZHMgbmVlZCB0byBiZSBwdWJsaWMgZm9yIGRlcml2ZWQgU21zRGlzcGF0Y2hlcnMKLSAgICAgICAgcHVibGljIEhhc2hNYXAgbURhdGE7CisgICAgICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtRGF0YTsKICAgICAgICAgcHVibGljIGludCBtUmV0cnlDb3VudDsKICAgICAgICAgcHVibGljIGludCBtTWVzc2FnZVJlZjsKIAogICAgICAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBtU2VudEludGVudDsKICAgICAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgbURlbGl2ZXJ5SW50ZW50OwogCi0gICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgICAgIG1EYXRhID0gZGF0YTsKICAgICAgICAgICAgIG1TZW50SW50ZW50ID0gc2VudEludGVudDsKQEAgLTk0Myw3ICs5NDQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICByZXR1cm4gbmV3IFNtc1RyYWNrZXIoZGF0YSwgc2VudEludGVudCwgZGVsaXZlcnlJbnRlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YQppbmRleCA3ODcyZWVjLi43YTY1MTYyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc0hlYWRlci5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTbXNIZWFkZXIgewogCi0gICAgLy8gVE9ETyhjbGVhbnVwKTogdGhpcyBkYXRhc3RydWN0dXJlIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcworICAgIC8vIFRPRE8oY2xlYW51cCk6IHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzCiAgICAgLy8gdGhlICd1c2VyIGRhdGEgaGVhZGVyJyBvciBVREgsIGFuZCBzbyB0aGUgY2xhc3MgbmFtZSBzaG91bGQKICAgICAvLyBjaGFuZ2UgdG8gcmVmbGVjdCB0aGlzLi4uCiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKaW5kZXggYWY2YzVmOC4uY2JkODYwNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtMzY2LDEzICszNjUsMTMgQEAKICAgICAvKioKICAgICAgKiBUcnkgdG8gcGFyc2UgdGhpcyBtZXNzYWdlIGFzIGFuIGVtYWlsIGdhdGV3YXkgbWVzc2FnZQogICAgICAqIFRoZXJlIGFyZSB0d28gd2F5cyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQwIFNlY3Rpb24gMy44IDoKLSAgICAgKiAgLSBTTVMgbWVzc2FnZSAibWF5IGhhdmUgaXRzIFRQLVBJRCBzZXQgZm9yIGludGVybmV0IGVsZWN0cm9uaWMgbWFpbCAtIE1UCisgICAgICogIC0gU01TIG1lc3NhZ2UgIm1heSBoYXZlIGl0cyBUUC1QSUQgc2V0IGZvciBJbnRlcm5ldCBlbGVjdHJvbmljIG1haWwgLSBNVAogICAgICAqIFNNUyBmb3JtYXQ6IFs8ZnJvbS1hZGRyZXNzPjxzcGFjZT5dPG1lc3NhZ2U+IC0gIkRlcGVuZGluZyBvbiB0aGUKICAgICAgKiBuYXR1cmUgb2YgdGhlIGdhdGV3YXksIHRoZSBkZXN0aW5hdGlvbi9vcmlnaW5hdGlvbiBhZGRyZXNzIGlzIGVpdGhlcgogICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgU01TIFRQLU9BIG9yIFRQLURBIGZpZWxkLCBvciB0aGUKICAgICAgKiBUUC1PQS9UUC1EQSBmaWVsZCBjb250YWlucyBhIGdlbmVyaWMgZ2F0ZXdheSBhZGRyZXNzIGFuZCB0aGUgdG8vZnJvbQogICAgICAqIGFkZHJlc3MgaXMgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBhcyBzaG93biBhYm92ZS4iICh3aGljaCBpcyBzdXBwb3J0ZWQgaGVyZSkKLSAgICAgKiAtIE11bHRpcGxlIGFkZHJlc2VzIHNlcGFyYXRlZCBieSBjb21tYXMsIG5vIHNwYWNlcywgU3ViamVjdCBmaWVsZCBkZWxpbWl0ZWQKKyAgICAgKiAtIE11bHRpcGxlIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIFN1YmplY3QgZmllbGQgZGVsaW1pdGVkCiAgICAgICogYnkgJygpJyBvciAnIyMnIGFuZCAnIycgU2VjdGlvbiA5LjIuMy4yNC4xMSAod2hpY2ggYXJlIE5PVCBzdXBwb3J0ZWQgaGVyZSkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0RW1haWxBZGRyZXNzRnJvbU1lc3NhZ2VCb2R5KCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEKaW5kZXggYTExMzc4Ny4uMTM2ZDViMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255UHJvcGVydGllcy5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICogIENETUEgbmV0d29ya3MuCiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PUEVSQVRPUl9BTFBIQSA9ICJnc20ub3BlcmF0b3IuYWxwaGEiOwotICAgIC8vVE9ETzogbW9zdCBvZiB0aGVzZSBwcm9wcmlldGllcyBhcmUgZ2VuZXJpYywgc3Vic3RpdHV0ZSBnc20uIHdpdGggcGhvbmUuIGJ1ZyAxODU2OTU5CisgICAgLy9UT0RPOiBtb3N0IG9mIHRoZXNlIHByb3BlcnRpZXMgYXJlIGdlbmVyaWMsIHN1YnN0aXR1dGUgZ3NtLiB3aXRoIHBob25lLiBidWcgMTg1Njk1OQogCiAgICAgLyoqIE51bWVyaWMgbmFtZSAoTUNDK01OQykgb2YgY3VycmVudCByZWdpc3RlcmVkIG9wZXJhdG9yLjxwPgogICAgICAqICBBdmFpbGFiaWxpdHk6IHdoZW4gcmVnaXN0ZXJlZCB0byBhIG5ldHdvcmsuIFJlc3VsdCBtYXkgYmUgdW5yZWxpYWJsZSBvbgpAQCAtODMsMTIgKzgzLDEyIEBACiAKICAgICAvKiogVGhlIE1DQytNTkMgKG1vYmlsZSBjb3VudHJ5IGNvZGUrbW9iaWxlIG5ldHdvcmsgY29kZSkgb2YgdGhlCiAgICAgICogIHByb3ZpZGVyIG9mIHRoZSBTSU0uIDUgb3IgNiBkZWNpbWFsIGRpZ2l0cy4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfTlVNRVJJQyA9ICJnc20uc2ltLm9wZXJhdG9yLm51bWVyaWMiOwogCiAgICAgLyoqIFBST1BFUlRZX0lDQ19PUEVSQVRPUl9BTFBIQSBpcyBhbHNvIGtub3duIGFzIHRoZSBTUE4sIG9yIFNlcnZpY2UgUHJvdmlkZXIgTmFtZS4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfQUxQSEEgPSAiZ3NtLnNpbS5vcGVyYXRvci5hbHBoYSI7CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAicm8udGVsZXBob255LmNhbGxfcmluZy5tdWx0aXBsZSI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpLXNlY29uZHMgYmV0d2VlbiBDQUxMX1JJTkcgbm90aWZpY2F0aW9ucy4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIENBTExfUklORyBub3RpZmljYXRpb25zLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ0FMTF9SSU5HX0RFTEFZID0gInJvLnRlbGVwaG9ueS5jYWxsX3JpbmcuZGVsYXkiOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCmluZGV4IGYzMWJmMjQuLjZlNTNlYzUgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCkBAIC01MTUsMTQgKzUxNSw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBub0RhdGEgPSBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKSAmJgotICAgICAgICAgICAgICAgIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gIW5vRGF0YSAmJiBnZXRJY2NDYXJkKCkuZ2V0U3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLlJFQURZICYmCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZVN0YXRlKCkuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgotICAgICAgICAgICAgICAgIChtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSB8fCAhZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBNTUkgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCBub3RpZmllcyByZWdpc3RyYW50cyB0aGF0CiAgICAgICogaXQgaXMgY29tcGxldGUuCkBAIC02MTMsNyArNjA1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1TU1QgPT0gbnVsbCkgewpAQCAtNjI1LDYgKzYxNyw4IEBACiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvbi5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb24uZ2V0U3RhdGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOgpAQCAtODc4LDI2ICs4NzIsNiBAQAogICAgICAgICBtUnVpbVJlY29yZHMuc2V0Vm9pY2VNZXNzYWdlV2FpdGluZygxLCBtd2kpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBib29sZWFuCi0gICAgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgewotICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOwotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7Ci0gICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCkgewogICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7CkBAIC0xMTkxLDYgKzExNjUsMjYgQEAKICAgICAgICAgbVNNUy5zZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKKyAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7CisgICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVM2ODNBX0ZFQVRVUkVfQ09ERSA9ICIqMjI4IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX0ZFQVRVUkVfQ09ERV9OVU1fRElHSVRTID0gNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX1NZU19TRUxfQ09ERV9OVU1fRElHSVRTID0gMjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCA5ZjJhNDRiLi5lNDk5ZTk1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0yMywxNCArMjMsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTUwLDggKzQ4LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRXZlbnRMb2dUYWdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQXBuU2V0dGluZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJldHJ5TWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2VydmljZVN0YXRlVHJhY2tlcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKQEAgLTMwNSw5ICszMDEsNDAgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKLSAgICAgICAgcmV0dXJuIGdldEFueURhdGFFbmFibGVkKCkgJiYgKCFyb2FtaW5nIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmIG1NYXN0ZXJEYXRhRW5hYmxlZDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgeworICAgICAgICBpbnQgcHNTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXRDdXJyZW50Q2RtYURhdGFDb25uZWN0aW9uU3RhdGUoKTsKKyAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gKHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSAmJiAhZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSk7CisgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKKworICAgICAgICBib29sZWFuIGFsbG93ZWQgPSAocHNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgorICAgICAgICAgICAgICAgIChwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpID09IENvbW1hbmRzSW50ZXJmYWNlLlJhZGlvU3RhdGUuTlZfUkVBRFkgfHwKKyAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSAmJgorICAgICAgICAgICAgICAgIChtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgfHwKKyAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFKSAmJgorICAgICAgICAgICAgICAgICFyb2FtaW5nICYmCisgICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkICYmCisgICAgICAgICAgICAgICAgZGVzaXJlZFBvd2VyU3RhdGUgJiYKKyAgICAgICAgICAgICAgICAhbVBlbmRpbmdSZXN0YXJ0UmFkaW8gJiYKKyAgICAgICAgICAgICAgICAhbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSk7CisgICAgICAgIGlmICghYWxsb3dlZCAmJiBEQkcpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSAiIjsKKyAgICAgICAgICAgIGlmIChwc1N0YXRlICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSByZWFzb24gKz0gIiAtIHBzU3RhdGU9ICIgKyBwc1N0YXRlOworICAgICAgICAgICAgaWYgKHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgIT0gQ29tbWFuZHNJbnRlcmZhY2UuUmFkaW9TdGF0ZS5OVl9SRUFEWSAmJgorICAgICAgICAgICAgICAgICAgICAhbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSByYWRpb1N0YXRlPSAiICsgcGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSArICIgLSBSVUlNIG5vdCBsb2FkZWQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBob25lLmdldFN0YXRlKCkgIT0gUGhvbmUuU3RhdGUuSURMRSAmJgorICAgICAgICAgICAgICAgICAgICBtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIGNvbmN1cnJlbnRWb2ljZUFuZERhdGEgbm90IGFsbG93ZWQgYW5kIHN0YXRlPSAiICsgcGhvbmUuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyb2FtaW5nKSByZWFzb24gKz0gIiAtIFJvYW1pbmciOworICAgICAgICAgICAgaWYgKCFtTWFzdGVyRGF0YUVuYWJsZWQpIHJlYXNvbiArPSAiIC0gbU1hc3RlckRhdGFFbmFibGVkPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAoIWRlc2lyZWRQb3dlclN0YXRlKSByZWFzb24gKz0gIiAtIGRlc2lyZWRQb3dlclN0YXRlPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdSZXN0YXJ0UmFkaW8pIHJlYXNvbiArPSAiIC0gbVBlbmRpbmdSZXN0YXJ0UmFkaW89IHRydWUiOworICAgICAgICAgICAgaWYgKG1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpIHJlYXNvbiArPSAiIC0gbmVlZHMgUHJvdmlzaW9uaW5nIjsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgYWxsb3dlZCBkdWUgdG8iICsgcmVhc29uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsb3dlZDsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gdHJ5U2V0dXBEYXRhKFN0cmluZyByZWFzb24pIHsKQEAgLTMxNyw3ICszNDQsOCBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgdHJ1ZSk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICIoZml4PykgV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzI3LDM2ICszNTUsMTMgQEAKICAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwogICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CiAKLSAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKQotICAgICAgICAgICAgICAgICYmIChwc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKQotICAgICAgICAgICAgICAgICYmICgocGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSA9PSBDb21tYW5kc0ludGVyZmFjZS5SYWRpb1N0YXRlLk5WX1JFQURZKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKQotICAgICAgICAgICAgICAgICYmIChtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSApCi0gICAgICAgICAgICAgICAgJiYgaXNEYXRhQWxsb3dlZCgpCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZFBvd2VyU3RhdGUKLSAgICAgICAgICAgICAgICAmJiAhbVBlbmRpbmdSZXN0YXJ0UmFkaW8KLSAgICAgICAgICAgICAgICAmJiAhbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSkgewotCi0gICAgICAgICAgICByZXR1cm4gc2V0dXBEYXRhKHJlYXNvbik7Ci0KKyAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKSAmJgorICAgICAgICAgICAgICAgIGlzRGF0YUFsbG93ZWQoKSAmJiBnZXRBbnlEYXRhRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCByZXRWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygidHJ5U2V0dXBEYXRhOiBOb3QgcmVhZHkgZm9yIGRhdGE6ICIgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFTdGF0ZT0iICsgc3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIFBTIHN0YXRlPSIgKyBwc1N0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiByYWRpbyBzdGF0ZT0iICsgcGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcnVpbT0iICsgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBjb25jdXJyZW50Vm9pY2UmRGF0YT0iICsgbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwaG9uZVN0YXRlPSIgKyBwaG9uZS5nZXRTdGF0ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhRW5hYmxlZD0iICsgZ2V0QW55RGF0YUVuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcm9hbWluZz0iICsgcm9hbWluZyArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YU9uUm9hbWluZ0VuYWJsZT0iICsgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGVzaXJlZFBvd2VyU3RhdGU9IiArIGRlc2lyZWRQb3dlclN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBQZW5kaW5nUmVzdGFydFJhZGlvPSIgKyBtUGVuZGluZ1Jlc3RhcnRSYWRpbyArCi0gICAgICAgICAgICAgICAgICAgICIgTWFzdGVyRGF0YUVuYWJsZWQ9IiArIG1NYXN0ZXJEYXRhRW5hYmxlZCArCi0gICAgICAgICAgICAgICAgICAgICIgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nPSIgKyBtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTM4Miw2ICszODcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuRElTQ09OTkVDVElORyk7CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkocmVhc29uKTsKIAogICAgICAgICBib29sZWFuIG5vdGlmaWNhdGlvbkRlZmVycmVkID0gZmFsc2U7CiAgICAgICAgIGZvciAoRGF0YUNvbm5lY3Rpb24gY29ubiA6IGRhdGFDb25uZWN0aW9uTGlzdCkgewpAQCAtNDQwLDEzICs0NDYsMTMgQEAKICAgICAgICAgY29ubi5jb25uZWN0KG1zZywgbUFjdGl2ZUFwbik7CiAKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSU5JVElORyk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlEZWZhdWx0RGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKICAgICAgICAgbVJldHJ5TWdyLnJlc2V0UmV0cnlDb3VudCgpOwogICAgIH0KQEAgLTYyMiwxMiArNjI4LDEzIEBACiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5Tm9EYXRhKEZhaWxDYXVzZSBsYXN0RmFpbENhdXNlQ29kZSkgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5GQUlMRUQpOworICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uOiByZWFzb249IiArIHJlYXNvbik7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICB9CiAKQEAgLTY4NywxMSArNjk0LDEzIEBACiAgICAgICAgICAgICAvLyBBc3N1bWUgZGF0YSBpcyBjb25uZWN0ZWQgb24gdGhlIHNpbXVsYXRvcgogICAgICAgICAgICAgLy8gRklYTUUgIHRoaXMgY2FuIGJlIGltcHJvdmVkCiAgICAgICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKIAogICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIldlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgIH0KIAorICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KG51bGwpOworCiAgICAgICAgIGlmIChzdGF0ZSAhPSBTdGF0ZS5JRExFKSB7CiAgICAgICAgICAgICBjbGVhblVwQ29ubmVjdGlvbih0cnVlLCBudWxsKTsKICAgICAgICAgfQpAQCAtNzIzLDYgKzczMiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBXZSBzaG91bGQgY2xlYXIgTGlua1Byb3BlcnRpZXMvQ2FwYWJpbGl0aWVzIHdoZW4gdG9ybiBkb3duIG9yIGRpc2Nvbm5lY3RlZAorICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gZ2V0TGlua1Byb3BlcnRpZXMobUFjdGl2ZURhdGFDb25uZWN0aW9uKTsKKyAgICAgICAgICAgIG1MaW5rQ2FwYWJpbGl0aWVzID0gZ2V0TGlua0NhcGFiaWxpdGllcyhtQWN0aXZlRGF0YUNvbm5lY3Rpb24pOworCiAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGlzIHNldHVwCiAgICAgICAgICAgICBub3RpZnlEZWZhdWx0RGF0YShyZWFzb24pOwogICAgICAgICB9IGVsc2UgewpAQCAtNzYyLDcgKzc3NSw3IEBACiAgICAgICAgICAgICBvblJlc3RhcnRSYWRpbygpOwogICAgICAgICB9CiAKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgICAgIGlmIChyZXRyeUFmdGVyRGlzY29ubmVjdGVkKHJlYXNvbikpIHsKICAgICAgICAgICB0cnlTZXR1cERhdGEocmVhc29uKTsKQEAgLTc4OSw3ICs4MDIsOCBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uVm9pY2VDYWxsU3RhcnRlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCAmJiAhbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICBzdG9wTmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MDAsMTEgKzgxNCwxMiBAQAogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBpZiAoIW1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CisgICAgICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjbGVhbiBzbGF0ZSBhZnRlciBjYWxsIGVuZC4KICAgICAgICAgICAgICAgICByZXNldFBvbGxTdGF0cygpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtUmV0cnlNZ3IucmVzZXRSZXRyeUNvdW50KCk7CiAgICAgICAgICAgICAvLyBpbiBjYXNlIGRhdGEgc2V0dXAgd2FzIGF0dGVtcHRlZCB3aGVuIHdlIHdlcmUgb24gYSB2b2ljZSBjYWxsCkBAIC04MzgsNyArODUzLDcgQEAKICAgICBwcml2YXRlIHZvaWQgb25DZG1hRGF0YURldGFjaGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQ0RNQV9EQVRBX0RFVEFDSEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCkgewogICAgICAgICAgICAgICAgIGNsZWFuVXBDb25uZWN0aW9uKGZhbHNlLCBQaG9uZS5SRUFTT05fQ0RNQV9EQVRBX0RFVEFDSEVEKTsKQEAgLTk0OSwzNCArOTY0LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0SW50ZXJmYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVEYXRhQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZURhdGFDb25uZWN0aW9uLmdldElwQWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0R2F0ZXdheUFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RG5zU2VydmVycyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0RG5zU2VydmVycygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQogICAgIHB1YmxpYyBBcnJheUxpc3Q8RGF0YUNvbm5lY3Rpb24+IGdldEFsbERhdGFDb25uZWN0aW9ucygpIHsKICAgICAgICAgcmV0dXJuIGRhdGFDb25uZWN0aW9uTGlzdDsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCBkY2VmZjJhLi4zN2EzM2JjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKQEAgLTcwLDYgKzcwLDcgQEAKICAgICAgKiBAcGFyYW0gYXIgQXN5bmNSZXN1bHQgcGFzc2VkIGludG8gdGhlIG1lc3NhZ2UgaGFuZGxlci4gIGFyLnJlc3VsdCBzaG91bGQKICAgICAgKiAgICAgICAgICAgYmUgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgcmVwb3J0IFBEVSwgYXMgQVNDSUkgaGV4LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YXR1c1JlcG9ydChBc3luY1Jlc3VsdCBhcikgewogICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTdGF0dXNSZXBvcnQgaXMgYSBzcGVjaWFsIEdTTSBmdW5jdGlvbiwgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpbiBDRE1BISIpOwogICAgIH0KQEAgLTkyLDYgKzkzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgZGlzcGF0Y2hNZXNzYWdlKFNtc01lc3NhZ2VCYXNlIHNtc2IpIHsKIAogICAgICAgICAvLyBJZiBzbXMgaXMgbnVsbCwgbWVhbnMgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvci4KQEAgLTMzNSw2ICszMzcsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZERhdGEoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBpbnQgZGVzdFBvcnQsCiAgICAgICAgICAgICBieXRlW10gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMzQzLDYgKzM0Niw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kVGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIFN0cmluZyB0ZXh0LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMzUxLDYgKzM1NSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0VGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsCiAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0cywgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50cykgewpAQCAtMzU5LDcgKzM2NCw3IEBACiAgICAgICAgICAqIFRPRE8oY2xlYW51cCk6IFRoZXJlIGlzIG5vIHJlYWwgY29kZSBkaWZmZXJlbmNlIGJldHdlZW4KICAgICAgICAgICogdGhpcyBhbmQgdGhlIEdTTSB2ZXJzaW9uLCBhbmQgaGVuY2UgaXQgc2hvdWxkIGJlIG1vdmVkIHRvCiAgICAgICAgICAqIHRoZSBiYXNlIGNsYXNzIG9yIGNvbnNvbGlkYXRlZCBzb21laG93LCBwcm92aWRlZCBjYWxsaW5nCi0gICAgICAgICAqIHRoZSBwcm9wZXIgc3VibWl0cGR1IHN0dWZmIGNhbiBiZSBhcnJhbmdlZC4KKyAgICAgICAgICogdGhlIHByb3BlciBzdWJtaXQgcGR1IHN0dWZmIGNhbiBiZSBhcnJhbmdlZC4KICAgICAgICAgICovCiAKICAgICAgICAgaW50IHJlZk51bWJlciA9IGdldE5leHRDb25jYXRlbmF0ZWRSZWYoKSAmIDB4MDBGRjsKQEAgLTQzMiw4ICs0MzcsOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNtcyhTbXNUcmFja2VyIHRyYWNrZXIpIHsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSB0cmFja2VyLm1EYXRhOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSB0cmFja2VyLm1EYXRhOwogCiAgICAgICAgIC8vIGJ5dGUgc21zY1tdID0gKGJ5dGVbXSkgbWFwLmdldCgic21zYyIpOyAgLy8gdW51c2VkIGZvciBDRE1BCiAgICAgICAgIGJ5dGUgcGR1W10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJwZHUiKTsKQEAgLTQ0NCwxMSArNDUwLDEzIEBACiAgICAgfQogCiAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFNtcyAoU21zVHJhY2tlciB0cmFja2VyKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlRPRE86IENkbWFTTVNEaXNwYXRjaGVyLnNlbmRNdWx0aXBhcnRTbXMgbm90IGltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ1Ntcyhib29sZWFuIHN1Y2Nlc3MsIGludCByZXN1bHQsIE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBGSVhNRSB1bml0IHRlc3QgbGVhdmVzIGNtID09IG51bGwuIHRoaXMgc2hvdWxkIGNoYW5nZQogCkBAIC00NjksMTYgKzQ3NywxOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGludCBhY3RpdmF0ZSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdEFjdGl2YXRpb24oKGFjdGl2YXRlID09IDApLCByZXNwb25zZSk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBnZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgbUNtLmdldENkbWFCcm9hZGNhc3RDb25maWcocmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhpbnRbXSBjb25maWdWYWx1ZXNBcnJheSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdENvbmZpZyhjb25maWdWYWx1ZXNBcnJheSwgcmVzcG9uc2UpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IGQyYTRiZDguLjdkMjAxM2IgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTYsNiArMTYsMTYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kc0ludGVyZmFjZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGF0YUNvbm5lY3Rpb25UcmFja2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FdmVudExvZ1RhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1jY1RhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGVUcmFja2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC0zOCwxOSArNDgsOCBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVGltZVV0aWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvblRyYWNrZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkV2ZW50TG9nVGFnczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTWNjVGFibGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNlcnZpY2VTdGF0ZVRyYWNrZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueUludGVudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7Ci0KIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKQEAgLTEwMDgsNyArMTAwNyw3IEBACiAgICAgICAgIG1OZWVkRml4Wm9uZSA9IGZhbHNlOwogCiAgICAgICAgIGlmICh6b25lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBdXRvVGltZSgpKSB7CisgICAgICAgICAgICBpZiAoZ2V0QXV0b1RpbWVab25lKCkpIHsKICAgICAgICAgICAgICAgICBzZXRBbmRCcm9hZGNhc3ROZXR3b3JrU2V0VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNhdmVOaXR6VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKQEAgLTExNDAsNyArMTEzOSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzQ2RtYURhdGFDb25uZWN0aW9uQ2hhbmdlZCB8fCBoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzUm9hbWluZ09uKSB7CkBAIC0xNDYwLDcgKzE0NTksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoem9uZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldEF1dG9UaW1lKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0QXV0b1RpbWVab25lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgc2V0QW5kQnJvYWRjYXN0TmV0d29ya1NldFRpbWVab25lKHpvbmUuZ2V0SUQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNhdmVOaXR6VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKQEAgLTE1NTAsNiArMTU0OSwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEF1dG9UaW1lWm9uZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uQVVUT19USU1FX1pPTkUpID4gMDsKKyAgICAgICAgfSBjYXRjaCAoU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIHNuZmUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNhdmVOaXR6VGltZVpvbmUoU3RyaW5nIHpvbmVJZCkgewogICAgICAgICBtU2F2ZWRUaW1lWm9uZSA9IHpvbmVJZDsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCBlOTc1NDlkLi5kODRiNmFiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTY4LDggKzY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNtcyAgPSAoTGlzdDxTbXNSYXdEYXRhPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkVmFsaWRSYXdEYXRhKChBcnJheUxpc3Q8Ynl0ZVtdPikgYXIucmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU21zID0gYnVpbGRWYWxpZFJhd0RhdGEoKEFycmF5TGlzdDxieXRlW10+KSBhci5yZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihEQkcpIGxvZygiQ2Fubm90IGxvYWQgU21zIHJlY29yZHMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNtcyAhPSBudWxsKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCmluZGV4IGQ1NjNkYzguLjhhY2NmZDEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKQEAgLTE4LDExICsxOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5UaW1lOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2U7CkBAIC0zNCw3ICszMSw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQppbmRleCBhYjc5ZmU5Li5jZjA2ZGFiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NQVhfVVNFUl9EQVRBX0JZVEVTX1dJVEhfSEVBREVSOwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiAKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlOwogCkBAIC0zMCwxMCArMjksOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuVXNlckRhdGE7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlLlRleHRFbmNvZGluZ0RldGFpbHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5CaXR3aXNlSW5wdXRTdHJlYW07CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5CaXR3aXNlT3V0cHV0U3RyZWFtOwogCkBAIC00NSwxMyArNDIsMTMgQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJTTVMiOwogCiAgICAgLyoqCi0gICAgICogQmVhcmVyIERhdGEgU3VicGFyYW1ldGVyIEluZGVudGlmaWVycworICAgICAqIEJlYXJlciBEYXRhIFN1YnBhcmFtZXRlciBJZGVudGlmaWVycwogICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CLCB2Mi4wLCB0YWJsZSA0LjUtMSkKICAgICAgKiBOT1RFOiBDb21tZW50ZWQgc3VicGFyYW1ldGVyIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9NRVNTQUdFX0lERU5USUZJRVIgICAgICAgICAgICAgICA9IDB4MDA7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9VU0VSX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9VU0VSX1JFUE9OU0VfQ09ERSAgICAgICAgICAgICAgICA9IDB4MDI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9VU0VSX1JFU1BPTlNFX0NPREUgICAgICAgICAgICAgICA9IDB4MDI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9NRVNTQUdFX0NFTlRFUl9USU1FX1NUQU1QICAgICAgICA9IDB4MDM7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9WQUxJRElUWV9QRVJJT0RfQUJTT0xVVEUgICAgICAgICA9IDB4MDQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9WQUxJRElUWV9QRVJJT0RfUkVMQVRJVkUgICAgICAgICA9IDB4MDU7CkBAIC02OTcsNyArNjk0LDcgQEAKICAgICAvKgogICAgICAqIFRPRE8oY2xlYW51cCk6IENkbWFTbXNBZGRyZXNzIGVuY29kaW5nIHNob3VsZCBtYWtlIHVzZSBvZgogICAgICAqIENkbWFTbXNBZGRyZXNzLnBhcnNlIHByb3ZpZGVkIHRoYXQgRFRNRiBlbmNvZGluZyBpcyB1bmlmaWVkLAotICAgICAqIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiA0Yml0IHZzIDhiaXQgaXMgcmVzb2x2ZWQuCisgICAgICogYW5kIHRoZSBkaWZmZXJlbmNlIGluIDQtYml0IHZzLiA4LWJpdCBpcyByZXNvbHZlZC4KICAgICAgKi8KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5jb2RlQ2RtYVNtc0FkZHJlc3MoQ2RtYVNtc0FkZHJlc3MgYWRkcikgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbiB7CkBAIC04MDUsNiArODAyLDcgQEAKICAgICAgKiAoU2VlIDNHUFAyIEMuUjEwMDEtRiwgdjEuMCwgc2VjdGlvbiA0LjUgZm9yIGxheW91dCBkZXRhaWxzKQogICAgICAqCiAgICAgICogQHBhcmFtIGJEYXRhIGFuIGluc3RhbmNlIG9mIEJlYXJlckRhdGEuCisgICAgICoKICAgICAgKiBAcmV0dXJuIGJ5dGUgYXJyYXkgb2YgcmF3IGVuY29kZWQgU01TIGJlYXJlciBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShCZWFyZXJEYXRhIGJEYXRhKSB7CkBAIC05MTUsNyArOTEzLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXRmMTYoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBudW1GaWVsZHMpCiAgICAgICAgIHRocm93cyBDb2RpbmdFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCAxNi1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDE2LWJpdCBhbGlnbmVkIGJvdW5kYXJ5IGFmdGVyIG9mZnNldC4KICAgICAgICAgaW50IHBhZGRpbmcgPSBvZmZzZXQgJSAyOwogICAgICAgICBudW1GaWVsZHMgLT0gKG9mZnNldCArIHBhZGRpbmcpIC8gMjsKICAgICAgICAgdHJ5IHsKQEAgLTk2MSw3ICs5NTksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGU3Yml0R3NtKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbnVtRmllbGRzKQogICAgICAgICB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgNy1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDctYml0IGFsaWduZWQgYm91bmRhcnkgYWZ0ZXIgb2Zmc2V0LgogICAgICAgICBpbnQgb2Zmc2V0Qml0cyA9IG9mZnNldCAqIDg7CiAgICAgICAgIGludCBvZmZzZXRTZXB0ZXRzID0gKG9mZnNldEJpdHMgKyA2KSAvIDc7CiAgICAgICAgIG51bUZpZWxkcyAtPSBvZmZzZXRTZXB0ZXRzOwpAQCAtMTU1NCw3ICsxNTUyLDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1VTRVJfREFUQToKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlU3VjY2VzcyA9IGRlY29kZVVzZXJEYXRhKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fVVNFUl9SRVBPTlNFX0NPREU6CisgICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9VU0VSX1JFU1BPTlNFX0NPREU6CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVN1Y2Nlc3MgPSBkZWNvZGVVc2VyUmVzcG9uc2VDb2RlKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fUkVQTFlfT1BUSU9OOgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQppbmRleCA0ZjAwMTYzLi40YTYwMjMxIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQpAQCAtMTksNyArMTksNyBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLkNkbWFTbXNTdWJhZGRyZXNzOwogCi1wdWJsaWMgZmluYWwgY2xhc3MgU21zRW52ZWxvcGV7CitwdWJsaWMgZmluYWwgY2xhc3MgU21zRW52ZWxvcGUgewogICAgIC8qKgogICAgICAqIE1lc3NhZ2UgVHlwZXMKICAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiAzLjQuMSkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQppbmRleCA0Mzk3MWZmLi4zMGE2MzI0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCkBAIC0yODcsNyArMjg3LDcgQEAKICAgICAgICAgcmV0dXJuIG1QZW5kaW5nTU1JczsKICAgICB9CiAKLSAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7CisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIERhdGFTdGF0ZSByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtU1NUID09IG51bGwpIHsKQEAgLTMwMCw2ICszMDAsOCBAQAogICAgICAgICAgICAgLy8gSWYgd2UncmUgb3V0IG9mIHNlcnZpY2UsIG9wZW4gVENQIHNvY2tldHMgbWF5IHN0aWxsIHdvcmsKICAgICAgICAgICAgIC8vIGJ1dCBubyBkYXRhIHdpbGwgZmxvdwogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChtRGF0YUNvbm5lY3Rpb24uaXNBcG5UeXBlRW5hYmxlZChhcG5UeXBlKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIHsgLyogbVNTVC5ncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgKi8KICAgICAgICAgICAgIHN3aXRjaCAobURhdGFDb25uZWN0aW9uLmdldFN0YXRlKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIEZBSUxFRDoKQEAgLTQwMSw4ICs0MDMsOCBAQAogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHZvaWQKLSAgICBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCh0aGlzLCByZWFzb24pOworICAgIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCh0aGlzLCByZWFzb24sIGFwblR5cGUpOwogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHZvaWQKQEAgLTEwOTEsMjcgKzEwOTMsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBvbmx5IGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggd2UgcmVwb3J0IHRoYXQgZGF0YSBjb25uZWN0aXZpdHkgaXMgbm90Ci0gICAgICogcG9zc2libGUgYXJlCi0gICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhIHJvYW1pbmcgaXMgZGlzYWxsb3dlZCBhbmQgd2UgYXJlIHJvYW1pbmcuPC9saT4KLSAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBpcyB7QGNvZGUgRElTQ09OTkVDVEVEfSBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgotICAgICAqIGhhdmluZyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbm5lY3Rpdml0eS4gSW4gb3RoZXIgd29yZHMsIGRhdGEgaXMgbm90IGF2YWlsYWJsZQotICAgICAqIGJlY2F1c2UgdGhlIHBob25lIGlzIG91dCBvZiBjb3ZlcmFnZSBvciBzb21lIGxpa2UgcmVhc29uLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7Ci0gICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSBjaGVja3MgaWYgYW55IEdQUlMgY29ubmVjdGlvbiBpcyBhY3RpdmUuIFNob3VsZCBpdCBvbmx5Ci0gICAgICAgIC8vIGNoZWNrIGZvciAiZGVmYXVsdCI/Ci0gICAgICAgIGJvb2xlYW4gbm9EYXRhID0gbURhdGFDb25uZWN0aW9uLmdldERhdGFFbmFibGVkKCkgJiYKLSAgICAgICAgICAgIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gIW5vRGF0YSAmJiBnZXRJY2NDYXJkKCkuZ2V0U3RhdGUoKSA9PSBTaW1DYXJkLlN0YXRlLlJFQURZICYmCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZVN0YXRlKCkuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgotICAgICAgICAgICAgKG1EYXRhQ29ubmVjdGlvbi5nZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpIHx8ICFnZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIE1NSSBmcm9tIHRoZSBwZW5kaW5nIGxpc3QgYW5kIG5vdGlmaWVzCiAgICAgICogcmVnaXN0cmFudHMgdGhhdCBpdCBpcyBjb21wbGV0ZS4KICAgICAgKiBAcGFyYW0gbW1pIE1NSSB0aGF0IGlzIGRvbmUKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb24uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb24uamF2YQppbmRleCAwOWQ0NmRkLi4xNTcyZjA5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvbi5qYXZhCkBAIC0xODAsOCArMTgwLDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRG5zT2soU3RyaW5nW10gZG9tYWluTmFtZVNlcnZlcnMpIHsKLSAgICAgICAgaWYgKE5VTExfSVAuZXF1YWxzKGRuc1NlcnZlcnNbMF0pICYmIE5VTExfSVAuZXF1YWxzKGRuc1NlcnZlcnNbMV0pCi0gICAgICAgICAgICAgICAgICAgICYmICEoKEdTTVBob25lKSBwaG9uZSkuaXNEbnNDaGVja0Rpc2FibGVkKCkpIHsKKyAgICAgICAgaWYgKE5VTExfSVAuZXF1YWxzKGRvbWFpbk5hbWVTZXJ2ZXJzWzBdKSAmJiBOVUxMX0lQLmVxdWFscyhkb21haW5OYW1lU2VydmVyc1sxXSkKKyAgICAgICAgICAgICAgICAmJiAhKChHU01QaG9uZSkgcGhvbmUpLmlzRG5zQ2hlY2tEaXNhYmxlZCgpKSB7CiAgICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIFFNSSBkb2VzIG5vdCBmaWxsIGluIEROUzoKICAgICAgICAgICAgIC8vIERlYWN0aXZhdGUgUERQIGFuZCBsZXQgRGF0YUNvbm5lY3Rpb25UcmFja2VyIHJldHJ5LgogICAgICAgICAgICAgLy8gRG8gbm90IGFwcGx5IHRoZSByYWNlIGNvbmRpdGlvbiB3b3JrYXJvdW5kIGZvciBNTVMgQVBOCkBAIC0xODksNiArMTg5LDkgQEAKICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgQVBOIHdpbGwgbm90IGJlIHJlc3RvcmVkIGFueW1vcmUuCiAgICAgICAgICAgICBpZiAoIWFwbi50eXBlc1swXS5lcXVhbHMoUGhvbmUuQVBOX1RZUEVfTU1TKQogICAgICAgICAgICAgICAgIHx8ICFpc0lwQWRkcmVzcyhhcG4ubW1zUHJveHkpKSB7CisgICAgICAgICAgICAgICAgbG9nKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiaXNEbnNPazogcmV0dXJuIGZhbHNlIGFwbi50eXBlc1swXT0lcyBBUE5fVFlQRV9NTVM9JXMgaXNJcEFkZHJlc3MoJXMpPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwbi50eXBlc1swXSwgUGhvbmUuQVBOX1RZUEVfTU1TLCBhcG4ubW1zUHJveHksIGlzSXBBZGRyZXNzKGFwbi5tbXNQcm94eSkpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IGU3ZDU3YmMuLjY2ZGE2ZTggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtMjcsMTUgKzI3LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHlQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwpAQCAtNTgsNiArNTcsOSBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvbi5GYWlsQ2F1c2U7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgpAQCAtMzg4LDEyICszOTAsNiBAQAogICAgICAgICByZXR1cm4gcGRwczsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKLSAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwotICAgICAgICByZXR1cm4gZ2V0QW55RGF0YUVuYWJsZWQoKSAmJiAoIXJvYW1pbmcgfHwgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgJiYKLSAgICAgICAgICAgICAgICBtTWFzdGVyRGF0YUVuYWJsZWQ7Ci0gICAgfQotCiAgICAgLy8qKioqKiogQ2FsbGVkIGZyb20gU2VydmljZVN0YXRlVHJhY2tlcgogICAgIC8qKgogICAgICAqIEludm9rZWQgd2hlbiBTZXJ2aWNlU3RhdGVUcmFja2VyIG9ic2VydmVzIGEgdHJhbnNpdGlvbiBmcm9tIEdQUlMKQEAgLTQwNSwxMyArNDAxLDEzIEBACiAgICAgICAgICAqIHdoZW4gR1BSUyBkZXRhY2hlcywgYnV0IHdlIHNob3VsZCBzdG9wIHRoZSBuZXR3b3JrIHBvbGxpbmcuCiAgICAgICAgICAqLwogICAgICAgICBzdG9wTmV0U3RhdFBvbGwoKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfREVUQUNIRUQpOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19ERVRBQ0hFRCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG9uR3Byc0F0dGFjaGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19BVFRBQ0hFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19BVFRBQ0hFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuRkFJTEVEKSB7CiAgICAgICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24oZmFsc2UsIFBob25lLlJFQVNPTl9HUFJTX0FUVEFDSEVEKTsKQEAgLTQyMSw2ICs0MTcsMzUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7CisgICAgICAgIGludCBncHJzU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXRDdXJyZW50R3Byc1N0YXRlKCk7CisgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOworCisgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9ICgoZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFIHx8IG5vQXV0b0F0dGFjaCkgJiYKKyAgICAgICAgICAgICAgICBtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICYmCisgICAgICAgICAgICAgICAgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFICYmCisgICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkICYmCisgICAgICAgICAgICAgICAgKCFwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgfHwgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgJiYKKyAgICAgICAgICAgICAgICAhbUlzUHNSZXN0cmljdGVkICYmCisgICAgICAgICAgICAgICAgZGVzaXJlZFBvd2VyU3RhdGUpOworICAgICAgICBpZiAoIWFsbG93ZWQgJiYgREJHKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gIiI7CisgICAgICAgICAgICBpZiAoZ3Byc1N0YXRlICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSByZWFzb24gKz0gIiAtIGdwcnM9ICIgKyBncHJzU3RhdGU7CisgICAgICAgICAgICBpZiAoIW1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkpIHJlYXNvbiArPSAiIC0gU0lNIG5vdCBsb2FkZWQiOworICAgICAgICAgICAgaWYgKHBob25lLmdldFN0YXRlKCkgIT0gUGhvbmUuU3RhdGUuSURMRSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gUGhvbmVTdGF0ZT0gIiArIHBob25lLmdldFN0YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1NYXN0ZXJEYXRhRW5hYmxlZCkgcmVhc29uICs9ICIgLSBtTWFzdGVyRGF0YUVuYWJsZWQ9IGZhbHNlIjsKKyAgICAgICAgICAgIGlmIChwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgJiYgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gUm9hbWluZyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlzUHNSZXN0cmljdGVkKSByZWFzb24gKz0gIiAtIG1Jc1BzUmVzdHJpY3RlZD0gdHJ1ZSI7CisgICAgICAgICAgICBpZiAoIWRlc2lyZWRQb3dlclN0YXRlKSByZWFzb24gKz0gIiAtIGRlc2lyZWRQb3dlclN0YXRlPSBmYWxzZSI7CisgICAgICAgICAgICBsb2coIkRhdGEgbm90IGFsbG93ZWQgZHVlIHRvIiArIHJlYXNvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsbG93ZWQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIHRyeVNldHVwRGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiKioqdHJ5U2V0dXBEYXRhIGR1ZSB0byAiICsgKHJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogcmVhc29uKSk7CiAKQEAgLTQzMCw3ICs0NTUsNyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiKGZpeD8pIFdlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQzOSwxOSArNDY0LDE1IEBACiAgICAgICAgIGludCBncHJzU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXRDdXJyZW50R3Byc1N0YXRlKCk7CiAgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOwogCi0gICAgICAgIGlmICgoc3RhdGUgPT0gU3RhdGUuSURMRSB8fCBzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykKLSAgICAgICAgICAgICAgICAmJiAoZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFIHx8IG5vQXV0b0F0dGFjaCkKLSAgICAgICAgICAgICAgICAmJiBtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpCi0gICAgICAgICAgICAgICAgJiYgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFCi0gICAgICAgICAgICAgICAgJiYgaXNEYXRhQWxsb3dlZCgpCi0gICAgICAgICAgICAgICAgJiYgIW1Jc1BzUmVzdHJpY3RlZAotICAgICAgICAgICAgICAgICYmIGRlc2lyZWRQb3dlclN0YXRlICkgeworICAgICAgICBpZiAoKChzdGF0ZSA9PSBTdGF0ZS5JRExFKSB8fCAoc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpKSAmJgorICAgICAgICAgICAgICAgIGlzRGF0YUFsbG93ZWQoKSAmJiBnZXRBbnlEYXRhRW5hYmxlZCgpKSB7CiAKICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JRExFKSB7CiAgICAgICAgICAgICAgICAgd2FpdGluZ0FwbnMgPSBidWlsZFdhaXRpbmdBcG5zKCk7CiAgICAgICAgICAgICAgICAgaWYgKHdhaXRpbmdBcG5zLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIk5vIEFQTiBmb3VuZCIpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnlOb0RhdGEoR3NtRGF0YUNvbm5lY3Rpb24uRmFpbENhdXNlLk1JU1NJTkdfVU5LTk9XTl9BUE4pOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBsb2cgKCJDcmVhdGUgZnJvbSBhbGxBcG5zIDogIiArIGFwbkxpc3RUb1N0cmluZyhhbGxBcG5zKSk7CkBAIC00NjEsMjIgKzQ4MiwxMSBAQAogICAgICAgICAgICAgaWYgKERCRykgewogICAgICAgICAgICAgICAgIGxvZyAoIlNldHVwIHdhaXRuZ0FwbnMgOiAiICsgYXBuTGlzdFRvU3RyaW5nKHdhaXRpbmdBcG5zKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCByZXRWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoREJHKQotICAgICAgICAgICAgICAgIGxvZygidHJ5U2V0dXBEYXRhOiBOb3QgcmVhZHkgZm9yIGRhdGE6ICIgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFTdGF0ZT0iICsgc3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIGdwcnNTdGF0ZT0iICsgZ3Byc1N0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBzaW09IiArIG1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIFVNVFM9IiArIG1Hc21QaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwaG9uZVN0YXRlPSIgKyBwaG9uZS5nZXRTdGF0ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBpc0RhdGFBbGxvd2VkPSIgKyBpc0RhdGFBbGxvd2VkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFFbmFibGVkPSIgKyBnZXRBbnlEYXRhRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiByb2FtaW5nPSIgKyBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFPblJvYW1pbmdFbmFibGU9IiArIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHBzIHJlc3RyaWN0ZWQ9IiArIG1Jc1BzUmVzdHJpY3RlZCArCi0gICAgICAgICAgICAgICAgICAgICIgZGVzaXJlZFBvd2VyU3RhdGU9IiArIGRlc2lyZWRQb3dlclN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBNYXN0ZXJEYXRhRW5hYmxlZD0iICsgbU1hc3RlckRhdGFFbmFibGVkKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTU5NSw0NiArNjA1LDEwIEBACiAgICAgICAgIHBkcC5jb25uZWN0KG1zZywgYXBuKTsKIAogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JTklUSU5HKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlUGRwICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYXBuVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgKG1BY3RpdmVBcG4gIT0gbnVsbCAmJiBtQWN0aXZlQXBuLmNhbkhhbmRsZVR5cGUoYXBuVHlwZSkpKSkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQZHAuZ2V0SW50ZXJmYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXRJcEFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdhdGV3YXkoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXRHYXRld2F5QWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlUGRwICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYXBuVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgKG1BY3RpdmVBcG4gIT0gbnVsbCAmJiBtQWN0aXZlQXBuLmNhbkhhbmRsZVR5cGUoYXBuVHlwZSkpKSkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQZHAuZ2V0RG5zU2VydmVycygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbgogICAgIHBkcFN0YXRlc0hhc0NJRCAoQXJyYXlMaXN0PERhdGFDYWxsU3RhdGU+IHN0YXRlcywgaW50IGNpZCkgewogICAgICAgICBmb3IgKGludCBpID0gMCwgcyA9IHN0YXRlcy5zaXplKCkgOyBpIDwgcyA7IGkrKykgewpAQCAtNzQ2LDcgKzcyMCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5RGVmYXVsdERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7CiAgICAgICAgIC8vIHJlc2V0IHJlY29ubmVjdCB0aW1lcgogICAgICAgICBtUmV0cnlNZ3IucmVzZXRSZXRyeUNvdW50KCk7CkBAIC03NTYsNyArNzMwLDcgQEAKICAgICBwcml2YXRlIHZvaWQgZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbjogcmVhc29uPSIgKyByZWFzb24pOwogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JRExFKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgfQogCkBAIC05OTgsNyArOTcyLDcgQEAKICAgICAgICAgICAgIGlmICghbVJldHJ5TWdyLmlzUmV0cnlOZWVkZWQoKSkgewogICAgICAgICAgICAgICAgIGlmICghbVJlcXVlc3RlZEFwblR5cGUuZXF1YWxzKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1vcmUgcmV0cmllcyBvbiBhIHNlY29uZGFyeSBBUE4gYXR0ZW1wdCwgdGVsbCB0aGUgd29ybGQgYW5kIHJldmVydC4KLSAgICAgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0FQTl9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlQXBuKGFwblR5cGVUb0lkKG1SZXF1ZXN0ZWRBcG5UeXBlKSwgRElTQUJMRUQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA5MSw3ICsxMDY1LDcgQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgfQpAQCAtMTEyNSw2ICsxMDk5LDI3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYXIuZXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFdlIHNob3VsZCBjbGVhciBMaW5rUHJvcGVydGllcy9DYXBhYmlsaXRpZXMgd2hlbiB0b3JuIGRvd24gb3IgZGlzY29ubmVjdGVkCisgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBnZXRMaW5rUHJvcGVydGllcyhtQWN0aXZlUGRwKTsKKyAgICAgICAgICAgIG1MaW5rQ2FwYWJpbGl0aWVzID0gZ2V0TGlua0NhcGFiaWxpdGllcyhtQWN0aXZlUGRwKTsKKworICAgICAgICAgICAgQXBuU2V0dGluZyBhcG4gPSBtQWN0aXZlUGRwLmdldEFwbigpOworICAgICAgICAgICAgaWYgKGFwbi5wcm94eSAhPSBudWxsICYmIGFwbi5wcm94eS5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgUHJveHlQcm9wZXJ0aWVzIHByb3h5ID0gbmV3IFByb3h5UHJvcGVydGllcygpOworICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRTb2NrZXRBZGRyZXNzKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYXBuLnByb3h5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGFwbi5wb3J0KSkpOworICAgICAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMuc2V0SHR0cFByb3h5KHByb3h5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duSG9zdEV4Y2VwdGlvbiBtYWtpbmcgUHJveHlQcm9wZXJ0aWVzOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VjdXJpdHlFeGNlcHRpb24gbWFraW5nIFByb3h5UHJvcGVydGllczogIiArIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJOdW1iZXJGb3JtYXRFeGNlcHRpb24gbWFraW5nIFByb3h5UHJvcGVydGllcyAoIiArIGFwbi5wb3J0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBpcyBzZXR1cAogICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgewogICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJnc20uZGVmYXVsdHBkcGNvbnRleHQuYWN0aXZlIiwgInRydWUiKTsKQEAgLTExNTcsNyArMTE1Miw3IEBACiAgICAgICAgICAgICAvLyBObyB0cnkgZm9yIHBlcm1hbmVudCBmYWlsdXJlCiAgICAgICAgICAgICBpZiAoY2F1c2UuaXNQZXJtYW5lbnRGYWlsKCkpIHsKICAgICAgICAgICAgICAgICBub3RpZnlOb0RhdGEoY2F1c2UpOwotICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CiAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtMTE4Niw3ICsxMTgxLDcgQEAKICAgICAgICAgICAgcmVhc29uID0gKFN0cmluZykgYXIudXNlck9iajsKICAgICAgICAgfQogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JRExFKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgICAgIGlmIChyZXRyeUFmdGVyRGlzY29ubmVjdGVkKHJlYXNvbikpIHsKICAgICAgICAgICAgIHRyeVNldHVwRGF0YShyZWFzb24pOwpAQCAtMTIxNyw3ICsxMjEyLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvblZvaWNlQ2FsbFN0YXJ0ZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQgJiYgISBtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgc3RvcE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjI1LDcgKzEyMjAsNyBAQAogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBpZiAoIW1Hc21QaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGNsZWFuIHNsYXRlIGFmdGVyIGNhbGwgZW5kLgogICAgICAgICAgICAgICAgIHJlc2V0UG9sbFN0YXRzKCk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IDMwNzlhNjQuLmVkNzA2NmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCkBAIC01Niw2ICs1Niw3IEBACiAgICAgICogQHBhcmFtIGFyIEFzeW5jUmVzdWx0IHBhc3NlZCBpbnRvIHRoZSBtZXNzYWdlIGhhbmRsZXIuICBhci5yZXN1bHQgc2hvdWxkCiAgICAgICogICAgICAgICAgIGJlIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIHJlcG9ydCBQRFUsIGFzIEFTQ0lJIGhleC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdGF0dXNSZXBvcnQoQXN5bmNSZXN1bHQgYXIpIHsKICAgICAgICAgU3RyaW5nIHBkdVN0cmluZyA9IChTdHJpbmcpIGFyLnJlc3VsdDsKICAgICAgICAgU21zTWVzc2FnZSBzbXMgPSBTbXNNZXNzYWdlLm5ld0Zyb21DRFMocGR1U3RyaW5nKTsKQEAgLTg0LDYgKzg1LDcgQEAKIAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGRpc3BhdGNoTWVzc2FnZShTbXNNZXNzYWdlQmFzZSBzbXNiKSB7CiAKICAgICAgICAgLy8gSWYgc21zIGlzIG51bGwsIG1lYW5zIHRoZXJlIHdhcyBhIHBhcnNpbmcgZXJyb3IuCkBAIC0xNTEsNiArMTUzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmREYXRhKFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgaW50IGRlc3RQb3J0LAogICAgICAgICAgICAgYnl0ZVtdIGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICBTbXNNZXNzYWdlLlN1Ym1pdFBkdSBwZHUgPSBTbXNNZXNzYWdlLmdldFN1Ym1pdFBkdSgKQEAgLTE1OSw2ICsxNjIsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFRleHQoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBTdHJpbmcgdGV4dCwKICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICBTbXNNZXNzYWdlLlN1Ym1pdFBkdSBwZHUgPSBTbXNNZXNzYWdlLmdldFN1Ym1pdFBkdSgKQEAgLTE2Nyw2ICsxNzEsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFRleHQoU3RyaW5nIGRlc3RpbmF0aW9uQWRkcmVzcywgU3RyaW5nIHNjQWRkcmVzcywKICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcnRzLCBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gc2VudEludGVudHMsCiAgICAgICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzKSB7CkBAIC0zMDYsOCArMzExLDkgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRTbXMoU21zVHJhY2tlciB0cmFja2VyKSB7Ci0gICAgICAgIEhhc2hNYXAgbWFwID0gdHJhY2tlci5tRGF0YTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gdHJhY2tlci5tRGF0YTsKIAogICAgICAgICBieXRlIHNtc2NbXSA9IChieXRlW10pIG1hcC5nZXQoInNtc2MiKTsKICAgICAgICAgYnl0ZSBwZHVbXSA9IChieXRlW10pIG1hcC5nZXQoInBkdSIpOwpAQCAtMzIyLDEyICszMjgsMTMgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB0cmFja2VyIGhvbGRzIHRoZSBtdWx0aXBhcnQgU21zIHRyYWNrZXIgcmVhZHkgdG8gYmUgc2VudAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRTbXMgKFNtc1RyYWNrZXIgdHJhY2tlcikgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0czsKICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzOwogICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzOwogCi0gICAgICAgIEhhc2hNYXAgbWFwID0gdHJhY2tlci5tRGF0YTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gdHJhY2tlci5tRGF0YTsKIAogICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25BZGRyZXNzID0gKFN0cmluZykgbWFwLmdldCgiZGVzdGluYXRpb24iKTsKICAgICAgICAgU3RyaW5nIHNjQWRkcmVzcyA9IChTdHJpbmcpIG1hcC5nZXQoInNjYWRkcmVzcyIpOwpAQCAtMzQyLDYgKzM0OSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ1Ntcyhib29sZWFuIHN1Y2Nlc3MsIGludCByZXN1bHQsIE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBGSVhNRSB1bml0IHRlc3QgbGVhdmVzIGNtID09IG51bGwuIHRoaXMgc2hvdWxkIGNoYW5nZQogICAgICAgICBpZiAobUNtICE9IG51bGwpIHsKQEAgLTM1MCw2ICszNTgsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGludCBhY3RpdmF0ZSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICAvLyBVbmxlc3MgQ0JTIGlzIGltcGxlbWVudGVkIGZvciBHU00sIHRoaXMgcG9pbnQgc2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgVGhlIGZ1bmN0aW9uYWxpdHkgY2VsbCBicm9hZGNhc3Qgc21zIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwpAQCAtMzU3LDYgKzM2Niw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBnZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBVbmxlc3MgQ0JTIGlzIGltcGxlbWVudGVkIGZvciBHU00sIHRoaXMgcG9pbnQgc2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgVGhlIGZ1bmN0aW9uYWxpdHkgY2VsbCBicm9hZGNhc3Qgc21zIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwpAQCAtMzY0LDYgKzM3NCw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgIHZvaWQgc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhpbnRbXSBjb25maWdWYWx1ZXNBcnJheSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICAvLyBVbmxlc3MgQ0JTIGlzIGltcGxlbWVudGVkIGZvciBHU00sIHRoaXMgcG9pbnQgc2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgVGhlIGZ1bmN0aW9uYWxpdHkgY2VsbCBicm9hZGNhc3Qgc21zIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA2ZGRiMzEyLi42MzMyNDE1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTYsNiArMTYsMTcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRFeGNlcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvblRyYWNrZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkV2ZW50TG9nVGFnczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTWNjVGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJJTENvbnN0YW50czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2VydmljZVN0YXRlVHJhY2tlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllczsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKQEAgLTQ3LDE3ICs1OCw2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVGltZVV0aWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvblRyYWNrZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkV2ZW50TG9nVGFnczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTWNjVGFibGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJJTENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2VydmljZVN0YXRlVHJhY2tlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllczsKLQogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwpAQCAtMTAwMSw3ICsxMDAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbU5lZWRGaXhab25lID0gZmFsc2U7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKHpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEF1dG9UaW1lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRBdXRvVGltZVpvbmUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFuZEJyb2FkY2FzdE5ldHdvcmtTZXRUaW1lWm9uZSh6b25lLmdldElEKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZU5pdHpUaW1lWm9uZSh6b25lLmdldElEKCkpOwpAQCAtMTAyNCw3ICsxMDI0LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgLy8gVE9ETyAtIGRvIHdlIHJlYWxseSB3YW50IHRoaXM/CisgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNSb2FtaW5nT24pIHsKQEAgLTE0ODEsNyArMTQ4Miw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICh6b25lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0QXV0b1RpbWUoKSkgeworICAgICAgICAgICAgICAgIGlmIChnZXRBdXRvVGltZVpvbmUoKSkgewogICAgICAgICAgICAgICAgICAgICBzZXRBbmRCcm9hZGNhc3ROZXR3b3JrU2V0VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2F2ZU5pdHpUaW1lWm9uZSh6b25lLmdldElEKCkpOwpAQCAtMTU1MSw2ICsxNTUyLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gZ2V0QXV0b1RpbWVab25lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlN5c3RlbS5nZXRJbnQocGhvbmUuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uQVVUT19USU1FX1pPTkUpID4gMDsKKyAgICAgICAgfSBjYXRjaCAoU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIHNuZmUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNhdmVOaXR6VGltZVpvbmUoU3RyaW5nIHpvbmVJZCkgewogICAgICAgICBtU2F2ZWRUaW1lWm9uZSA9IHpvbmVJZDsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDY3ZWNjNzcuLmFhYjM1OWYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC04Nyw2ICs4Nyw3IEBACiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CkBAIC0xOTIsNiArMTkzLDcgQEAKICAgICAgICAgcmV0dXJuIG1TbXM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKICAgICAgICAgTG9nLmQoTE9HX1RBRywgIltTaW1TbXNJbnRlcmZhY2VNYW5hZ2VyXSAiICsgbXNnKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCmluZGV4IDlhM2M0NzYuLmUyNDYxM2YgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwpAQCAtMzQsNiArMzMsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfOEJJVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR18xNkJJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR19LU0M1NjAxOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HX1VOS05PV047CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFUzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NQVhfVVNFUl9EQVRBX0JZVEVTX1dJVEhfSEVBREVSOwpAQCAtNDUsNyArNDUsNyBAQAogICogQSBTaG9ydCBNZXNzYWdlIFNlcnZpY2UgbWVzc2FnZS4KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBTbXNNZXNzYWdlIGV4dGVuZHMgU21zTWVzc2FnZUJhc2V7CitwdWJsaWMgY2xhc3MgU21zTWVzc2FnZSBleHRlbmRzIFNtc01lc3NhZ2VCYXNlIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiR1NNIjsKIAogICAgIHByaXZhdGUgTWVzc2FnZUNsYXNzIG1lc3NhZ2VDbGFzczsKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyJ3MgU0lNIGNhcmQuIFlvdSBjYW4gdGhlbiBzZW5kIG1lc3NhZ2VzIHRvIHlvdXJzZWxmCiAgICAgICAgICAgICAvLyAob24gYSBwaG9uZSB3aXRoIHRoaXMgY2hhbmdlKSBhbmQgdGhleSdsbCBlbmQgdXAgb24gdGhlIFNJTSBjYXJkLgogICAgICAgICAgICAgYm8ud3JpdGUoMHgwMCk7Ci0gICAgICAgIH0gZWxzZSB7IC8vYXNzdW1lIFVDUy0yCisgICAgICAgIH0gZWxzZSB7IC8vIGFzc3VtZSBVQ1MtMgogICAgICAgICAgICAgaWYgKCgweGZmICYgdXNlckRhdGFbMF0pID4gTUFYX1VTRVJfREFUQV9CWVRFUykgewogICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgdG9vIGxvbmcKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTM3Nyw3ICszNzcsNyBAQAogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkFkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0byBhdCB0aGUKICAgICAgKiAgICAgICAgZGVzdGluYXRpb24KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0IGZvciB0aGUgbWVzc2FnZQorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdWJtaXRQZHU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgU0MKICAgICAgKiAgICAgICAgIGFkZHJlc3MsIGlmIGFwcGxpY2FibGUsIGFuZCB0aGUgZW5jb2RlZCBtZXNzYWdlLgogICAgICAqICAgICAgICAgUmV0dXJucyBudWxsIG9uIGVuY29kZSBlcnJvci4KQEAgLTQ4Miw3ICs0ODIsNyBAQAogICAgICAgICByZXR1cm4gYm87CiAgICAgfQogCi0gICAgc3RhdGljIGNsYXNzIFBkdVBhcnNlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGR1UGFyc2VyIHsKICAgICAgICAgYnl0ZSBwZHVbXTsKICAgICAgICAgaW50IGN1cjsKICAgICAgICAgU21zSGVhZGVyIHVzZXJEYXRhSGVhZGVyOwpAQCAtNDkwLDEwICs0OTAsNiBAQAogICAgICAgICBpbnQgbVVzZXJEYXRhU2VwdGV0UGFkZGluZzsKICAgICAgICAgaW50IG1Vc2VyRGF0YVNpemU7CiAKLSAgICAgICAgUGR1UGFyc2VyKFN0cmluZyBzKSB7Ci0gICAgICAgICAgICB0aGlzKEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMocykpOwotICAgICAgICB9Ci0KICAgICAgICAgUGR1UGFyc2VyKGJ5dGVbXSBwZHUpIHsKICAgICAgICAgICAgIHRoaXMucGR1ID0gcGR1OwogICAgICAgICAgICAgY3VyID0gMDsKQEAgLTU0NSw3ICs1NDEsNyBAQAogICAgICAgICAgICAgR3NtU21zQWRkcmVzcyByZXQ7CiAKICAgICAgICAgICAgIC8vICJUaGUgQWRkcmVzcy1MZW5ndGggZmllbGQgaXMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZgotICAgICAgICAgICAgLy8gdGhlIG51bWJlciBmaWVsZCwgaS5lLiBleGNsdWRlcyBhbnkgc2VtaSBvY3RldCBjb250YWluaW5nIG9ubHkKKyAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgZmllbGQsIGkuZS4gZXhjbHVkZXMgYW55IHNlbWktb2N0ZXQgY29udGFpbmluZyBvbmx5CiAgICAgICAgICAgICAvLyBmaWxsIGJpdHMuIgogICAgICAgICAgICAgLy8gVGhlIFRPQSBmaWVsZCBpcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGlzCiAgICAgICAgICAgICBpbnQgYWRkcmVzc0xlbmd0aCA9IHBkdVtjdXJdICYgMHhmZjsKQEAgLTU3Myw3ICs1NjksNyBAQAogICAgICAgICAgICAgaW50IHNlY29uZCA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChwZHVbY3VyKytdKTsKIAogICAgICAgICAgICAgLy8gRm9yIHRoZSB0aW1lem9uZSwgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZQotICAgICAgICAgICAgLy8gbGVhc3Qgc2lnbmZpY2FudCBuaWJibGUgaXMgdGhlIHNpZ24gYnl0ZQorICAgICAgICAgICAgLy8gbGVhc3Qgc2lnbmlmaWNhbnQgbmliYmxlIGlzIHRoZSBzaWduIGJ5dGUKICAgICAgICAgICAgIC8vIChtZWFuaW5nIHRoZSBtYXggcmFuZ2Ugb2YgdGhpcyBmaWVsZCBpcyA3OSBxdWFydGVyLWhvdXJzLAogICAgICAgICAgICAgLy8gd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCkKIApAQCAtNjMyLDcgKzYyOCw3IEBACiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBIZXJlIHdlIGp1c3QgY3JlYXRlIHRoZSB1c2VyIGRhdGEgbGVuZ3RoIHRvIGJlIHRoZSByZW1haW5kZXIgb2YKICAgICAgICAgICAgICAgICAgKiB0aGUgcGR1IG1pbnVzIHRoZSB1c2VyIGRhdGEgaGVhZGVyLCBzaW5jZSB1c2VyRGF0YUxlbmd0aCBtZWFucwotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIHNlcGV0cy4KKyAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBzZXB0ZXRzLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGJ1ZmZlckxlbiA9IHBkdS5sZW5ndGggLSBvZmZzZXQ7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjcxLDEwICs2NjcsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgdXNlciBkYXRhCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdXNlciBkYXRhCiAgICAgICAgICAqIGFycmF5IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHNlcHRldHMuCiAgICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSB1c2VyIGRhdGEKKyAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1c2VyIGRhdGEKICAgICAgICAgICogYXJyYXkgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgc2VwdGV0cwogICAgICAgICAgKi8KICAgICAgICAgaW50IGdldFVzZXJEYXRhU2VwdGV0UGFkZGluZygpIHsKQEAgLTY5NCw3ICs2OTAsNyBAQAogICAgICAgICBYWFggTm90IHN1cmUgd2hhdCB0aGlzIG9uZSBpcyBzdXBwb3NlZCB0byBiZSBkb2luZywgYW5kIG5vIG9uZSBpcyB1c2luZwogICAgICAgICBpdC4KICAgICAgICAgU3RyaW5nIGdldFVzZXJEYXRhR1NNOGJpdCgpIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVtYWluZGVyIG9mIHB1ZDoiICsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVtYWluZGVyIG9mIHBkdToiICsKICAgICAgICAgICAgIC8vIEhleER1bXAuZHVtcEhleFN0cmluZyhwZHUsIGN1ciwgcGR1Lmxlbmd0aCAtIGN1cikpOwogICAgICAgICAgICAgaW50IGNvdW50ID0gcGR1W2N1cisrXSAmIDB4ZmY7CiAgICAgICAgICAgICBpbnQgc2l6ZSA9IHBkdVtjdXIrK107CkBAIC03ODEsNiArNzc3LDI3IEBACiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludGVycHJldHMgdGhlIHVzZXIgZGF0YSBwYXlsb2FkIGFzIEtTQy01NjAxIGNoYXJhY3RlcnMsIGFuZAorICAgICAgICAgKiBkZWNvZGVzIHRoZW0gaW50byBhIFN0cmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ5dGVDb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB1c2VyIGRhdGEgcGF5bG9hZAorICAgICAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIGRlY29kZWQgY2hhcmFjdGVycworICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGdldFVzZXJEYXRhS1NDNTYwMShpbnQgYnl0ZUNvdW50KSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0OworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldCA9IG5ldyBTdHJpbmcocGR1LCBjdXIsIGJ5dGVDb3VudCwgIktTQzU2MDEiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAiIjsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiaW1wbGF1c2libGUgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiIsIGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VyICs9IGJ5dGVDb3VudDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKwogICAgICAgICBib29sZWFuIG1vcmVEYXRhUHJlc2VudCgpIHsKICAgICAgICAgICAgIHJldHVybiAocGR1Lmxlbmd0aCA+IGN1cik7CiAgICAgICAgIH0KQEAgLTgyNywxMSArODQ0LDEzIEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFByb3RvY29sSWRlbnRpZmllcigpIHsKICAgICAgICAgcmV0dXJuIHByb3RvY29sSWRlbnRpZmllcjsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmVwbGFjZSgpIHsKICAgICAgICAgcmV0dXJuIChwcm90b2NvbElkZW50aWZpZXIgJiAweGMwKSA9PSAweDQwCiAgICAgICAgICAgICAgICAgJiYgKHByb3RvY29sSWRlbnRpZmllciAmIDB4M2YpID4gMApAQCAtODM5LDEyICs4NTgsMTQgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzQ3Boc013aU1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiAoKEdzbVNtc0FkZHJlc3MpIG9yaWdpbmF0aW5nQWRkcmVzcykuaXNDcGhzVm9pY2VNZXNzYWdlQ2xlYXIoKQogICAgICAgICAgICAgICAgIHx8ICgoR3NtU21zQWRkcmVzcykgb3JpZ2luYXRpbmdBZGRyZXNzKS5pc0NwaHNWb2ljZU1lc3NhZ2VTZXQoKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTVdJQ2xlYXJNZXNzYWdlKCkgewogICAgICAgICBpZiAoaXNNd2kgJiYgKG13aVNlbnNlID09IGZhbHNlKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04NTUsNiArODc2LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTVdJU2V0TWVzc2FnZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIChtd2lTZW5zZSA9PSB0cnVlKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04NjUsNiArODg3LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTXdpRG9udFN0b3JlKCkgewogICAgICAgICBpZiAoaXNNd2kgJiYgbXdpRG9udFN0b3JlKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTg4NCwzMSArOTA3LDM0IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdHVzUmVwb3J0TWVzc2FnZSgpIHsKICAgICAgICAgcmV0dXJuIGlzU3RhdHVzUmVwb3J0TWVzc2FnZTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmVwbHlQYXRoUHJlc2VudCgpIHsKICAgICAgICAgcmV0dXJuIHJlcGx5UGF0aFByZXNlbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVFMgMjcuMDA1IDMuMSwgPHBkdT4gZGVmaW5pdGlvbiAiSW4gdGhlIGNhc2Ugb2YgU01TOiAzR1BQIFRTIDI0LjAxMSBbNl0KKyAgICAgKiBUUyAyNy4wMDUgMy4xLCAmbHQ7cGR1Jmd0OyBkZWZpbml0aW9uICJJbiB0aGUgY2FzZSBvZiBTTVM6IDNHUFAgVFMgMjQuMDExIFs2XQogICAgICAqIFNDIGFkZHJlc3MgZm9sbG93ZWQgYnkgM0dQUCBUUyAyMy4wNDAgWzNdIFRQRFUgaW4gaGV4YWRlY2ltYWwgZm9ybWF0OgogICAgICAqIE1FL1RBIGNvbnZlcnRzIGVhY2ggb2N0ZXQgb2YgVFAgZGF0YSB1bml0IGludG8gdHdvIElSQSBjaGFyYWN0ZXIgbG9uZwotICAgICAqIGhleGFkIG51bWJlciAoZS5nLiBvY3RldCB3aXRoIGludGVnZXIgdmFsdWUgNDIgaXMgcHJlc2VudGVkIHRvIFRFIGFzIHR3bworICAgICAqIGhleCBudW1iZXIgKGUuZy4gb2N0ZXQgd2l0aCBpbnRlZ2VyIHZhbHVlIDQyIGlzIHByZXNlbnRlZCB0byBURSBhcyB0d28KICAgICAgKiBjaGFyYWN0ZXJzIDJBIChJUkEgNTAgYW5kIDY1KSkiIC4uLmluIHRoZSBjYXNlIG9mIGNlbGwgYnJvYWRjYXN0LAogICAgICAqIHNvbWV0aGluZyBlbHNlLi4uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGR1KGJ5dGVbXSBwZHUpIHsKICAgICAgICAgbVBkdSA9IHBkdTsKLSAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgInJhdyBzbXMgbWVzYWdlOiIpOworICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCAicmF3IHNtcyBtZXNzYWdlOiIpOwogICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCBzKTsKIAogICAgICAgICBQZHVQYXJzZXIgcCA9IG5ldyBQZHVQYXJzZXIocGR1KTsKQEAgLTExMDcsNiArMTEzMywxNiBAQAogICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJNV0kgZm9yIGZheCwgZW1haWwsIG9yIG90aGVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRhdGFDb2RpbmdTY2hlbWUgJiAweGZmKSk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRhdGFDb2RpbmdTY2hlbWUgJiAweEMwKSA9PSAweDgwKSB7CisgICAgICAgICAgICAvLyAzR1BQIFRTIDIzLjAzOCBWNy4wLjAgKDIwMDYtMDMpIHNlY3Rpb24gNAorICAgICAgICAgICAgLy8gMHg4MC4uMHhCRiA9PSBSZXNlcnZlZCBjb2RpbmcgZ3JvdXBzCisgICAgICAgICAgICBpZiAoZGF0YUNvZGluZ1NjaGVtZSA9PSAweDg0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyB2YWx1ZSB1c2VkIGZvciBLU0M1NjAxIGJ5IGNhcnJpZXJzIGluIEtvcmVhLgorICAgICAgICAgICAgICAgIGVuY29kaW5nVHlwZSA9IEVOQ09ESU5HX0tTQzU2MDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICI1IC0gVW5zdXBwb3J0ZWQgU01TIGRhdGEgY29kaW5nIHNjaGVtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhQ29kaW5nU2NoZW1lICYgMHhmZikpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIjMgLSBVbnN1cHBvcnRlZCBTTVMgZGF0YSBjb2Rpbmcgc2NoZW1lICIKICAgICAgICAgICAgICAgICAgICAgKyAoZGF0YUNvZGluZ1NjaGVtZSAmIDB4ZmYpKTsKQEAgLTExMzEsNiArMTE2NywxMCBAQAogICAgICAgICBjYXNlIEVOQ09ESU5HXzE2QklUOgogICAgICAgICAgICAgbWVzc2FnZUJvZHkgPSBwLmdldFVzZXJEYXRhVUNTMihjb3VudCk7CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVOQ09ESU5HX0tTQzU2MDE6CisgICAgICAgICAgICBtZXNzYWdlQm9keSA9IHAuZ2V0VXNlckRhdGFLU0M1NjAxKGNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudihMT0dfVEFHLCAiU01TIG1lc3NhZ2UgYm9keSAocmF3KTogJyIgKyBtZXNzYWdlQm9keSArICInIik7CkBAIC0xMTYyLDYgKzEyMDIsNyBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWVzc2FnZUNsYXNzIGdldE1lc3NhZ2VDbGFzcygpIHsKICAgICAgICAgcmV0dXJuIG1lc3NhZ2VDbGFzczsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEKaW5kZXggYjY0MjU0MS4uNDFmM2IyMyAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQpAQCAtMjcsOCArMjcsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVCYXNlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzOwotCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhCmluZGV4IGRjNGIyN2IuLmMxMzlhNjQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwQ29ubmVjdGlvbkJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcENvbm5lY3Rpb25CYXNlLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiAKIGltcG9ydCBhbmRyb2lkLm5ldC5zaXAuU2lwQXVkaW9DYWxsOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CkBAIC0xNzEsNCArMTcyLDEwIEBACiAgICAgICAgIC8vIFRPRE86IGFkZCBQUkVTRU5UQVRJT05fVVJMCiAgICAgICAgIHJldHVybiBDb25uZWN0aW9uLlBSRVNFTlRBVElPTl9BTExPV0VEOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVVVNJbmZvIGdldFVVU0luZm8oKSB7CisgICAgICAgIC8vIEZJWE1FOiB3aGF0J3MgdGhpcyBmb3IgU0lQPworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEKaW5kZXggMDJhZjBlZC4uODc4ZDMwYyAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmUuamF2YQpAQCAtMzgsNyArMzgsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVOb3RpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVVVTSW5mbzsKIAogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTcyLDYgKzcxLDE0IEBACiAgICAgICAgIG1TaXBNYW5hZ2VyID0gU2lwTWFuYWdlci5uZXdJbnN0YW5jZShjb250ZXh0KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gdGhpcykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBTaXBQaG9uZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgU2lwUGhvbmUgdGhhdCA9IChTaXBQaG9uZSkgbzsKKyAgICAgICAgcmV0dXJuIG1Qcm9maWxlLmdldFVyaVN0cmluZygpLmVxdWFscyh0aGF0Lm1Qcm9maWxlLmdldFVyaVN0cmluZygpKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldFBob25lTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJTSVA6IiArIGdldFVyaVN0cmluZyhtUHJvZmlsZSk7CiAgICAgfQpAQCAtMTQ3LDEwICsxNTQsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIENvbm5lY3Rpb24gZGlhbChTdHJpbmcgZGlhbFN0cmluZywgVVVTSW5mbyB1dXNpbmZvKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRpYWwoZGlhbFN0cmluZyk7Ci0gICAgfQotCiAgICAgcHVibGljIENvbm5lY3Rpb24gZGlhbChTdHJpbmcgZGlhbFN0cmluZykgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoU2lwUGhvbmUuY2xhc3MpIHsKICAgICAgICAgICAgIHJldHVybiBkaWFsSW50ZXJuYWwoZGlhbFN0cmluZyk7CkBAIC04MzUsMTAgKzgzOCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFVVU0luZm8gZ2V0VVVTSW5mbygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2FsbC5TdGF0ZSBnZXRDYWxsU3RhdGVGcm9tKFNpcEF1ZGlvQ2FsbCBzaXBBdWRpb0NhbGwpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVCYXNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lQmFzZS5qYXZhCmluZGV4IDU0OTk5NjYuLmFmZDRkMGMgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuc2lwOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNDIsNiArNDMsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZU5vdGlmaWVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVN1YkluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNjIsNiArNjQsMTIgQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBDYWxsIGdldFJpbmdpbmdDYWxsKCk7CiAKKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFN0cmluZyBkaWFsU3RyaW5nLCBVVVNJbmZvIHV1c0luZm8pCisgICAgICAgICAgICB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaWdub3JlIFVVU0luZm8KKyAgICAgICAgcmV0dXJuIGRpYWwoZGlhbFN0cmluZyk7CisgICAgfQorCiAgICAgdm9pZCBtaWdyYXRlRnJvbShTaXBQaG9uZUJhc2UgZnJvbSkgewogICAgICAgICBtaWdyYXRlKG1SaW5nYmFja1JlZ2lzdHJhbnRzLCBmcm9tLm1SaW5nYmFja1JlZ2lzdHJhbnRzKTsKICAgICAgICAgbWlncmF0ZShtUHJlY2lzZUNhbGxTdGF0ZVJlZ2lzdHJhbnRzLCBmcm9tLm1QcmVjaXNlQ2FsbFN0YXRlUmVnaXN0cmFudHMpOwpAQCAtNDE5LDYgKzQyNywxOCBAQAogICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IhIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIFNJUC4iKTsKICAgICB9CiAKKyAgICAvL0BPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKKyAgICAgICAgLy8gRklYTUU6IHdoYXQncyB0aGlzIGZvciBTSVA/CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZQorICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICAvLyBGSVhNRTogd2hhdCdzIHRoaXMgZm9yIFNJUD8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgdm9pZCB1cGRhdGVQaG9uZVN0YXRlKCkgewogICAgICAgICBTdGF0ZSBvbGRTdGF0ZSA9IHN0YXRlOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YQppbmRleCA5YzcyZTVhLi5mZGNmNzhkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdDsKIAotCiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CkBAIC0yNyw3ICsyNiw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ2FsbFN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVVVTSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNhbGxGYWlsQ2F1c2U7CkBAIC0zMzUsNyArMzMzLDcgQEAKIAogICAgIC8qKgogICAgICAqIChBc3luY1Jlc3VsdClyZXNwb25zZS5vYmopLnJlc3VsdCB3aWxsIGJlIGFuIEludGVnZXIgcmVwcmVzZW50aW5nCi0gICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcml2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCisgICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcnZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKICAgICAgKgogICAgICAqIEBwYXJhbSBmYWNpbGl0eSBvbmUgb2YgQ0JfRkFDSUxUWV8qCiAgICAgICogQHBhcmFtIHBpbiBwYXNzd29yZCBvciAiIiBpZiBub3QgcmVxdWlyZWQKQEAgLTQ0MSw3ICs0MzksNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgY29udGFpbnMgYSBMaXN0IG9mIERyaXZlckNhbGwKICAgICAgKiAgICAgIFRoZSBhci5yZXN1bHQgTGlzdCBpcyBzb3J0ZWQgYnkgRHJpdmVyQ2FsbC5pbmRleAogICAgICAqLwpAQCAtNDY4LDcgKzQ2Niw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBjb250YWlucyBhIExpc3Qgb2YgRGF0YUNhbGxTdGF0ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldERhdGFDYWxsTGlzdChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNDc5LDcgKzQ3Nyw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKgogICAgICAqIENMSVJfREVGQVVMVCAgICAgPT0gb24gInVzZSBzdWJzY3JpcHRpb24gZGVmYXVsdCB2YWx1ZSIKQEAgLTQ5Niw3ICs0OTQsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiBDTElSX0RFRkFVTFQgICAgID09IG9uICJ1c2Ugc3Vic2NyaXB0aW9uIGRlZmF1bHQgdmFsdWUiCkBAIC01MTMsNyArNTExLDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIFN0cmluZyBjb250YWluaW5nIElNU0kgb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNU0koTWVzc2FnZSByZXN1bHQpIHsKQEAgLTUyNCw3ICs1MjIsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgU3RyaW5nIGNvbnRhaW5pbmcgSU1FSSBvbiBzdWNjZXNzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0SU1FSShNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTM1LDcgKzUzMyw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBTdHJpbmcgY29udGFpbmluZyBJTUVJU1Ygb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNRUlTVihNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTQ3LDcgKzU0NSw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKgogICAgICAqICAzR1BQIDIyLjAzMCA2LjUuNQpAQCAtNTcyLDcgKzU3MCw3IEBACiAgICAgICogICJSZWxlYXNlcyBhbGwgaGVsZCBjYWxscyBvciBzZXRzIFVzZXIgRGV0ZXJtaW5lZCBVc2VyIEJ1c3kgKFVEVUIpCiAgICAgICogICBmb3IgYSB3YWl0aW5nIGNhbGwuIgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaGFuZ3VwV2FpdGluZ09yQmFja2dyb3VuZCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTU5Myw3ICs1OTEsNyBAQAogICAgICAqICB0aGUgb3RoZXIgKGhlbGQgb3Igd2FpdGluZykgY2FsbC4iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGhhbmd1cEZvcmVncm91bmRSZXN1bWVCYWNrZ3JvdW5kIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjE0LDcgKzYxMiw3IEBACiAgICAgICogIHRoZSBvdGhlciAoaGVsZCBvciB3YWl0aW5nKSBjYWxsLiIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3dpdGNoV2FpdGluZ09ySG9sZGluZ0FuZEFjdGl2ZSAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTYzNCw3ICs2MzIsNyBAQAogICAgICAqICJBZGRzIGEgaGVsZCBjYWxsIHRvIHRoZSBjb252ZXJzYXRpb24iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvbmZlcmVuY2UgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02NTQsNyArNjUyLDcgQEAKICAgICAgKiAiQ29ubmVjdHMgdGhlIHR3byBjYWxscyBhbmQgZGlzY29ubmVjdHMgdGhlIHN1YnNjcmliZXIgZnJvbSBib3RoIGNhbGxzIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleHBsaWNpdENhbGxUcmFuc2ZlciAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTY5MCw3ICs2ODgsNyBAQAogICAgIC8qKgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhY2NlcHRDYWxsIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNzA4LDcgKzcwNiw3IEBACiAgICAgLyoqCiAgICAgICogIGFsc28ga25vd24gYXMgVURVQgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVqZWN0Q2FsbCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTc4NSw3ICs3ODMsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHJlc3VsdCBpcyBjYWxsYmFjayBtZXNzYWdlCiAgICAgICogICAgICAgICgoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgIGlzIGFuIGludFtdIHdpdGggZXZlcnkKLSAgICAgKiAgICAgICAgZWxlbWVudCByZXByZXNlbnRpbmcgb25lIGF2aWFsYWJsZSBCTV8qX0JBTkQKKyAgICAgKiAgICAgICAgZWxlbWVudCByZXByZXNlbnRpbmcgb25lIGF2YWlsYWJsZSBCTV8qX0JBTkQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBxdWVyeUF2YWlsYWJsZUJhbmRNb2RlIChNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICBpbnQgcmV0W10gPSBuZXcgaW50IFs0XTsKQEAgLTg5NCw3ICs4OTIsNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZW5kRHRtZihjaGFyIGMsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05MDMsNyArOTAxLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RhcnREdG1mKGNoYXIgYywgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTkxMiw3ICs5MTAsNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdG9wRHRtZihNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTIxLDcgKzkxOSw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNlbmRCdXJzdER0bWYoU3RyaW5nIGR0bWZTdHJpbmcsIGludCBvbiwgaW50IG9mZiwgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTk1Niw2ICs5NTQsNyBAQAogICAgICAgICB1bmltcGxlbWVudGVkKHJlc3BvbnNlKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldHVwRGVmYXVsdFBEUChTdHJpbmcgYXBuLCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkLCBNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICB1bmltcGxlbWVudGVkKHJlc3VsdCk7CiAgICAgfQpAQCAtOTY3LDkgKzk2Niw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlRGF0YUNhbGwoaW50IGNpZCwgTWVzc2FnZSByZXN1bHQpIHt1bmltcGxlbWVudGVkKHJlc3VsdCk7fQogCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0UERQKGludCBjaWQsIE1lc3NhZ2UgcmVzdWx0KSB7dW5pbXBsZW1lbnRlZChyZXN1bHQpO30KIAogICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcnJlZE5ldHdvcmtUeXBlKGludCBuZXR3b3JrVHlwZSAsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC0xMDQ2LDcgKzEwNDMsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHBhcmFtZXRlcnMgZXF1aXZpbGllbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAorICAgICAqIHBhcmFtZXRlcnMgZXF1aXZhbGVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCiAgICAgICogcmVzcG9uc2Uub2JqIHdpbGwgYmUgYW4gQXN5bmNSZXN1bHQKICAgICAgKiByZXNwb25zZS5vYmoudXNlck9iaiB3aWxsIGJlIGEgU2ltSW9SZXN1bHQgb24gc3VjY2VzcwogICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L21vY2tyaWwvQW5kcm9pZC5tayBiL3RlbGVwaG9ueS9tb2NrcmlsL0FuZHJvaWQubWsKaW5kZXggN2MzOWNiMS4uOTVhZTg0YyAxMDA2NDQKLS0tIGEvdGVsZXBob255L21vY2tyaWwvQW5kcm9pZC5taworKysgYi90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rCkBAIC0yNSw3ICsyNSw2IEBACiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBsaWJyaWxwcm90by1qYXZhCiAKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCiBMT0NBTF9NT0RVTEUgOj0gbW9ja3JpbGNvbnRyb2xsZXIKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvbW9ja3JpbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbENvbnRyb2xsZXIuamF2YSBiL3RlbGVwaG9ueS9tb2NrcmlsL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsQ29udHJvbGxlci5qYXZhCmluZGV4IDliNmE4NTAuLmE1MTM5YmQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9tb2NrcmlsL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsQ29udHJvbGxlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9tb2NrcmlsL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsQ29udHJvbGxlci5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZ0hlYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZzsKQEAgLTEzMywyNCArMTMyLDQgQEAKICAgICAgICAgaW50IGN1cnN0YXRlID0gcmVzcC5nZXRTdGF0ZSgpOwogICAgICAgICByZXR1cm4gY3Vyc3RhdGUgPT0gc3RhdGU7CiAgICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIFNldCBhbiBNVCBjYWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIgZm9yIHRoZSBudW1iZXIgc2hvd24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRNVENhbGwoU3RyaW5nIHBob25lTnVtYmVyKSB7Ci0gICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSZXFTZXRNVENhbGwgcmVxID0gbmV3IFJpbEN0cmxDbWRzLkN0cmxSZXFTZXRNVENhbGwoKTsKLQotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGl0IGlzIGEgdmFsaWQgbnVtYmVyCi0gICAgICAgIHJlcS5zZXRQaG9uZU51bWJlcihwaG9uZU51bWJlcik7Ci0gICAgICAgIGlmICghc2VuZEN0cmxDb21tYW5kKFJpbEN0cmxDbWRzLkNUUkxfQ01EX1NFVF9NVF9DQUxMLCAwLCAwLCByZXEpKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJzZW5kIENNRF9TRVRfTVRfQ0FMTCByZXF1ZXN0IGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkLm1rIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MzFkMGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBtb2NrcmlsY29udHJvbGxlcgorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZWxlcGhvbnlNb2NrUmlsVGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmNDRhMgotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorCis8IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzIj4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOmxhYmVsPSJUZWxlcGhvbnlNb2NrUmlsVGVzdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRlbGVwaG9ueU1vY2tSaWxUZXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iLlRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cyIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdCBydW5uZXIgZm9yIFRlbGVwaG9ueSBUZXN0cyBVc2luZyBNb2NrIFJJTCIKKyAgICAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvVGVsZXBob255TW9ja1Rlc3RSdW5uZXIuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZWU3MzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvVGVsZXBob255TW9ja1Rlc3RSdW5uZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RTdWl0ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbC5Nb2NrUmlsQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzLmZ1bmN0aW9uYWwuU2ltcGxlVGVzdFVzaW5nTW9ja1JpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBydW5uZXIgZm9yIHRlbGVwaG9ueSB0ZXN0cyB0aGF0IHVzaW5nIE1vY2sgUklMCisgKgorICovCitwdWJsaWMgY2xhc3MgVGVsZXBob255TW9ja1Rlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHPSJUZWxlcGhvbnlNb2NrVGVzdFJ1bm5lciI7CisgICAgcHVibGljIE1vY2tSaWxDb250cm9sbGVyIG1Db250cm9sbGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RTdWl0ZSBnZXRBbGxUZXN0cygpIHsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IEluc3RydW1lbnRhdGlvblRlc3RTdWl0ZSh0aGlzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZVRlc3RVc2luZ01vY2tSaWwuY2xhc3MpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgTW9ja1JpbENvbnRyb2xsZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoIkNyZWF0ZSBNb2NrIFJJbCBDb250cm9sbGVyIGZhaWxlZCIsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKG1Db250cm9sbGVyKTsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHRzKSB7CisgICAgICAgIGlmIChtQ29udHJvbGxlciAhPSBudWxsKQorICAgICAgICAgICAgbUNvbnRyb2xsZXIuY2xvc2VDaGFubmVsKCk7CisgICAgICAgIHN1cGVyLmZpbmlzaChyZXN1bHRDb2RlLCByZXN1bHRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvZnVuY3Rpb25hbC9TaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvZnVuY3Rpb25hbC9TaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhMWNmMgotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9mdW5jdGlvbmFsL1NpbXBsZVRlc3RVc2luZ01vY2tSaWwuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMuZnVuY3Rpb25hbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5tb2NrcmlsLk1vY2tSaWxDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzLlRlbGVwaG9ueU1vY2tUZXN0UnVubmVyOworCisvKioKKyAqIEEgc2ltcGxlIHRlc3QgdGhhdCB1c2luZyBNb2NrIFJJTCBDb250cm9sbGVyCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVUZXN0VXNpbmdNb2NrUmlsIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2ltcGxlVGVzdFVzaW5nTW9ja1JpbCI7CisgICAgcHJpdmF0ZSBNb2NrUmlsQ29udHJvbGxlciBtTW9ja1JpbEN0cmwgPSBudWxsOworICAgIHByaXZhdGUgVGVsZXBob255TW9ja1Rlc3RSdW5uZXIgbVJ1bm5lcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1SdW5uZXIgPSAoVGVsZXBob255TW9ja1Rlc3RSdW5uZXIpZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIG1Nb2NrUmlsQ3RybCA9IG1SdW5uZXIubUNvbnRyb2xsZXI7CisgICAgICAgIGFzc2VydE5vdE51bGwobU1vY2tSaWxDdHJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcmFkaW8gc3RhdGUgb2YgUklMCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJhZGlvU3RhdGUoKSB7CisgICAgICAgIGludCBzdGF0ZSA9IG1Nb2NrUmlsQ3RybC5nZXRSYWRpb1N0YXRlKCk7CisgICAgICAgIExvZy52KFRBRywgInRlc3RHZXRSYWRpb1N0YXRlOiAiICsgc3RhdGUpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlID49IDAgJiYgc3RhdGUgPD0gOSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjdXJyZW50IHJhZGlvIHN0YXRlIG9mIFJJTAorICAgICAqIGFuZCB2ZXJpZnkgdGhlIHJhZGlvIHN0YXRlIGlzIHNldCBjb3JyZWN0bHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UmFkaW9TdGF0ZSgpIHsKKyAgICAgICAgZm9yIChpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8PSA5OyBzdGF0ZSsrKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZXQgcmFkaW8gc3RhdGUgdG8gYmUgIiArIHN0YXRlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInNldCByYWRpbyBzdGF0ZTogIiArIHN0YXRlICsgIiBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbU1vY2tSaWxDdHJsLnNldFJhZGlvU3RhdGUoc3RhdGUpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZSgidXNlIGFuIGludmFsaWQgcmFkaW8gc3RhdGUiLCBtTW9ja1JpbEN0cmwuc2V0UmFkaW9TdGF0ZSgtMSkpOworICAgICAgICBhc3NlcnRGYWxzZSgidGhlIHJhZGlvIHN0YXRlIGRvZXNuJ3QgZXhpc3QiLCBtTW9ja1JpbEN0cmwuc2V0UmFkaW9TdGF0ZSgxMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1OWI4MS4uMDAwMDAwMAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyVXRpbHNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzE3MDA1NTU0MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIisxICg3MDApLjU1NS00MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSojIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQotICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKioyMSoqMTcwMDU1NTQxNDEjIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKioyMSoqKzE3MDA1NTU0MTQxIyIpCi0gICAgICAgICAgICAgICAgLy9UT0RPIHRoaXMgaXMgdGhlIGNvcnJlY3QgcmVzdWx0LCBhbHRob3VnaCB0aGUgYWJvdmUKLSAgICAgICAgICAgICAgICAvL3Jlc3VsdCBoYXMgYmVlbiByZXR1cm5lZCBzaW5jZSBjaGFuZ2UgMzE3NzYKLSAgICAgICAgICAgICAgICAvLyIqKjIxKiorMTcwMDU1NTQxNDEjIgotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIsMTIzNCIpKTsKLQotICAgICAgICBieXRlIFtdIGIgPSBuZXcgYnl0ZVsyMF07Ci0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJ5dGVbXSBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIisxNzAwNTU1MDAyMCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNywgYlJldC5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaV0sIGJSZXRbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEV2l0aExlbmd0aCgiKzE3MDA1NTUwMDIwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg4LCBiUmV0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhiUmV0WzBdLCA3KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhiW2kgLSAxXSwgYlJldFtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIjcwMDU1NTAwMjAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiUmV0LCAwLCBiUmV0Lmxlbmd0aCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4QjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJCOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIysiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMrIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA0KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKjE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMTApKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4MUE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNzsgYls1XSA9IChieXRlKSAweDUwOyBiWzZdID0gKGJ5dGUpIDB4NTU7IGJbN10gPSAoYnl0ZSkgMHgwMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweDAyOyBiWzldID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSorMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QTE7IGJbM10gPSAoYnl0ZSkgMHg3MTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxKjE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbihudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgIjEyMyIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxMjMiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2gobnVsbCkpOwotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZChudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5zdHJpbmdGcm9tU3RyaW5nQW5kVE9BKG51bGwsIDEpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxNzAwNTU1NDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIrMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gd3JvbmcsIGJ1dCBpdCdzIHByb2JhYmx5IG9rCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEqIyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEqIyIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4iKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OLDEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OOzEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIEFuIE1NSSBzdHJpbmcgaXMgdW5wZXJ0ZXJiZWQsIGV2ZW4gdGhvdWdoIGl0IGNvbnRhaW5zIGEKLSAgICAgICAgLy8gKHZhbGlkIGluIHRoaXMgY2FzZSkgZW1iZWRkZWQgKwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIioqMjEqKisxNzAwNTU1NDE0MSMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqKjIxKiorMTcwMDU1NTQxNDEjIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIiozMSMrNDQ3OTY2MTY0MjA4IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKjMxIys0NDc5NjYxNjQyMDgiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjICgrNDQpIDc5IDY2MTYgNDIwOCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiwxMjM0IikpOwotCi0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQobnVsbCkpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIsMTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk47MTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCw7TiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxLTIuMzQgLDtOIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB0aGlzIGlzIG9kZAotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIiIsICIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjkxMSIsICI5MTEiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjE4MDA1NTUwOTExIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICI1NTU1IikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjU1NTUiLCAiMTgwMDU1NTU1NTU1IikpOwotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxLDEyMzQiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMTExNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiMDAxNzAwNTU1NDE0MSIpKTsKLQotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMrMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMSA5OTkgNzAwNTU1NDE0MSIsICIrMSA3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDEgNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDExIDcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjcwODU4ODIzMDAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwIDIwNyA3OTIgMzQ5MCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLyoqKioqIEZJWE1FJ3MgKioqKioqLwotICAgICAgICAvLwotICAgICAgICAvLyBNTUkgaGVhZGVyIHNob3VsZCBiZSBpZ25vcmVkCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIioqMzEjMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgLy8gSXQncyB0b28gYmFkIHRoaXMgaXMgZmFsc2UKLSAgICAgICAgLy8gKzQ0ICgwKSAyMDcgNzkyIDM0OTAgaXMgbm90IGEgZGlhbGFibGUgbnVtYmVyCi0gICAgICAgIC8vIGJ1dCBpdCBpcyBjb21tb25seSBob3cgRXVyb3BlYW4gcGhvbmUgbnVtYmVycyBhcmUgd3JpdHRlbgotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiKzQ0ICgwKSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIGphcGFuZXNlIGludGVybmF0aW9uYWwgcHJlZml4LCBmb3IgZXhhbXBsZSwgbWVzc2VzIHVzIHVwCi0gICAgICAgIC8vIEJ1dCB3aG8gdXNlcyBhIEdTTSBwaG9uZSBpbiBKYXBhbj8KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMCA0NCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIEF1c3RyYWxpYW4gb25lIG1lc3NlcyB1cyB1cCB0b28KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwMTEgNDQgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIC8vIFRoZSBSdXNzaWFuIHRydW5rIHByZWZpeCBtZXNzZXMgdXMgdXAsIGFzIGRvZXMgY3VycmVudAotICAgICAgICAvLyBSdXNzaWFuIGFyZWEgY29kZXMgKHdoaWNoIGJlaW4gd2l0aCAwKQotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzcoMDk1KTkxMDA3NjYiLCAiOCgwOTUpOTEwMDc2NiIpKTsKLQotICAgICAgICAvLyA0NDQgaXMgbm90IGEgdmFsaWQgY291bnRyeSBjb2RlLCBidXQKLSAgICAgICAgLy8gbWF0Y2hJbnRsUHJlZml4QW5kQ0MgZG9lc250IGtub3cgdGhpcwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gY29tcGFyZSBTTVMgc2hvcnQgY29kZQotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNDA0LTA0IiwgIjQwNDA0IikpOwotICAgIH0KLQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0NhbGxlcklESW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxOzEyMzQiKSk7Ci0KLSAgICAgICAgLy90aGlzIHNlZW1zIHdyb25nLCBvciBhdCBsZWFzdCB1c2VsZXNzCi0gICAgICAgIGFzc2VydEVxdWFscygiTk4xNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDFOTiIpKTsKLQotICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKzIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiojMDMxIyIpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEluZGV4YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKLQotICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxTk4iKSk7Ci0KLSAgICAgICAgLy88c2hydWc+IC0tIHRoZXNlIGFyZSBhbGwgbm90IHVzZWZ1bCwgYnV0IG5vdCB0ZXJyaWJseSB3cm9uZwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIisyMzAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiMxMzAjKiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKiMwMzEjIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFucEZvcm1hdHRpbmcoKSB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMDU1NTEyMSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMSIsIG51bWJlci50b1N0cmluZygpKTsKLQotICAgICAgICBudW1iZXIuY2xlYXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMC01NTUxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG51bWJlci5jbGVhcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI0NjY0NSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI0NjY0NSIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2NC00MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC1HT09HLTQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDBHT09HNDExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEtODAwLTQ2Ni00NDExIiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMS04MDAtNDY2LTQ0MTEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTgwMDQ2NjQ0MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxODAwNDY2NDQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMjItMzMzLTQ0NC01NTUtNjY2LTc3NzctODg4LTk5OTkiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUJDLURFRi1HSEktSktMLU1OTy1QUVJTLVRVVi1XWFlaIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMtZGVmLWdoaS1qa2wtbW5vLXBxcnMtdHV2LXd4eXoiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgMjIyLTMzMzQiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIoODAwKSBBQkMtREVGRyIpKTsKLSAgICB9Ci0KLSAgICAvLyBUbyBydW4gdGhpcyB0ZXN0LCB0aGUgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHdpdGggbmV0d29yawotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDExMTIzNDU2NyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxMjM0NTY3IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTIzNDU2NzAwMDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzIzNDU2NzAwMDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTExODc1NzY3ODAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzExODc1NzY3ODAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxODQ3NTIzMTc1MyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwLDE4NDc1MjMxNzUzIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7MDExODQ2OTMxMjM0NSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7Kzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwwMTExMjM0NTY3IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwrMTIzNDU2NyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1OTcwMDA7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1OTcwMDA7KzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsLDAxMTg0NjkzMTIzNDUiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwrODQ2OTMxMjM0NSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTE4NDY5MzEyMzQ1IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssKzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTg0NzUyMzE3NTMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsLDAxMTExODc1NzY3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwsLCsxMTg3NTc2NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywsMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywsKzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIis7LDg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrOyw4NDc1Nzk3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3KzU3OS03MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3KzU3OS03MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiw4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiLDg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiOzs4NDc1Nzk3MDAwLCwiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI7Ozg0NzU3OTcwMDAsLCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrdGhpcytpcyR3ZWlyZDssKyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIit0aGlzK2lzJHdlaXJkOywrIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIiIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZShudWxsKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTixQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNpYyBjaGVja3MgZm9yIHRoZSBWb2ljZU1haWwgbnVtYmVyLgotICAgICAqLwotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aE51bWJlck5vdEVxdWFsVG9Wb2ljZU1haWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiOTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCJ0ZWw6OTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCIrMTgwMDEyMzQ1NjciKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihudWxsKSk7Ci0gICAgICAgIC8vIFRoaXMgdGVzdCBmYWlscyBvbiBhIGRldmljZSB3aXRob3V0IGEgc2ltIGNhcmQKLSAgICAgICAgLypUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyID0KLSAgICAgICAgICAgIChUZWxlcGhvbnlNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOwotICAgICAgICBTdHJpbmcgbVZvaWNlTWFpbE51bWJlciA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWb2ljZU1haWxOdW1iZXIoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG1Wb2ljZU1haWxOdW1iZXIpKTsKLSAgICAgICAgKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVhZWNkLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIeXBoZW5hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFRleHRXYXRjaGVyIHR3ID0gbmV3IFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7Ci0gICAgICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgbGVmdCBlZGdlCi0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAwKTsKLSAgICAgICAgdHcuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCAxKTsKLSAgICAgICAgLy8gSW5zZXJ0IGFuIDggYXQgdGhlIGJlZ2lubmluZwotICAgICAgICBudW1iZXIuaW5zZXJ0KDAsICI4Iik7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NTUtNTEyLTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEh5cGhlbkRlbGV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgVGV4dFdhdGNoZXIgdHcgPSBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIGFmdGVyIHRoZSBoeXBoZW4KLSAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDQpOwotICAgICAgICAvLyBEZWxldGUgdGhlIGh5cGhlbgotICAgICAgICB0dy5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDMsIDEsIDApOwotICAgICAgICBudW1iZXIuZGVsZXRlKDMsIDQpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGRlbGV0ZWQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGh5cGhlbiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTEtMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGRlYWxzIHdpdGggbGVmdCBlZGdlIGJvdW5kYXJ5IGNhc2UKLSAgICAgICAgbnVtYmVyLmluc2VydCgwLCAiLSIpOwotICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMSk7Ci0gICAgICAgIHR3LmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMSwgMCk7Ci0gICAgICAgIG51bWJlci5kZWxldGUoMCwgMSk7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgZGVsZXRlZCB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgaHlwaGVuIAotICAgICAgICBhc3NlcnRFcXVhbHMoIjU1MS0yMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YQppbmRleCAzYTljNTExLi43MDExYWViIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CkBAIC01MSw3ICs1Myw3IEBACiAgICAgICAgIC8vICdAJyBtYXBzIHRvIGNoYXIgMAogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgR3NtQWxwaGFiZXQuY2hhclRvR3NtKCdAJykpOwogCi0gICAgICAgIC8vIGBhIChhIHdpdGggZ3JhdmUgYWNjZW50KSBtYXBzIHRvIGxhc3QgR1NNIGNoYXJhdGVyCisgICAgICAgIC8vIGBhIChhIHdpdGggZ3JhdmUgYWNjZW50KSBtYXBzIHRvIGxhc3QgR1NNIGNoYXJhY3RlcgogICAgICAgICBhc3NlcnRFcXVhbHMoMHg3ZiwgR3NtQWxwaGFiZXQuY2hhclRvR3NtKCdcdTAwZTAnKSk7CiAKICAgICAgICAgLy8KQEAgLTMwNyw0ICszMDksMjYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwKICAgICAgICAgICAgICAgICBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyh1bnBhY2tlZCwgMSwgdW5wYWNrZWQubGVuZ3RoIC0gMSkpOwogICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3NtOEJpdFVwYWNrZWRXaXRoRXVja3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU29tZSBmZWF0dXJlIHBob25lcyBpbiBLb3JlYSBzdG9yZSBjb250YWN0cyBhcyBldWMta3IuCisgICAgICAgIC8vIFRlc3QgdGhpcyBzaXR1YXRpb25zLgorICAgICAgICBieXRlIHVucGFja2VkW107CisKKyAgICAgICAgLy8gVGVzdCBnZW5lcmFsIGFscGhhYmV0IHN0cmluZ3MuCisgICAgICAgIHVucGFja2VkID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiNjE2MjYzMjA2NDY1NjZGRiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyBkZWYiLAorICAgICAgICAgICAgICAgIEdzbUFscGhhYmV0LmdzbThCaXRVbnBhY2tlZFRvU3RyaW5nKHVucGFja2VkLCAwLCB1bnBhY2tlZC5sZW5ndGgsICJldWMta3IiKSk7CisKKyAgICAgICAgLy8gVGVzdCBrb3JlYW4gc3RyaW5ncy4KKyAgICAgICAgdW5wYWNrZWQgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKCJDNUQ3QkRCQUM2QUVGRiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1RDE0Q1x1QzJBNFx1RDJCOCIsCisgICAgICAgICAgICAgICAgR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcodW5wYWNrZWQsIDAsIHVucGFja2VkLmxlbmd0aCwgImV1Yy1rciIpKTsKKworICAgICAgICAvLyBUZXN0IGdzbSBFeHRlbnRlZCBDaGFyYWN0ZXJzLgorICAgICAgICB1bnBhY2tlZCA9IEdzbUFscGhhYmV0LnN0cmluZ1RvR3NtOEJpdFBhY2tlZChzR3NtRXh0ZW5kZWRDaGFycyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzR3NtRXh0ZW5kZWRDaGFycywKKyAgICAgICAgICAgICAgICBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyh1bnBhY2tlZCwgMCwgdW5wYWNrZWQubGVuZ3RoLCAiZXVjLWtyIikpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YQppbmRleCAzMTAzZmMxLi4yMTVjNmNlIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQogcHVibGljIGNsYXNzIEdzbVNtc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCiAgICAgQFNtYWxsVGVzdApkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZVRlc3QuamF2YQppbmRleCAyZDY5NzdjLi43ZWIzZGY4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZVRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZVRlc3QuamF2YQpAQCAtMjgsNyArMjgsNyBAQAogCiAgICAgQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lWm9uZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDIwOCksICJFdXJvcGUvUGFyaXMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYygyMDgpLCAiRUNUIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoMjMyKSwgIkV1cm9wZS9WaWVubmEiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYyg2NTUpLCAiQWZyaWNhL0pvaGFubmVzYnVyZyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDQ0MCksICJBc2lhL1Rva3lvIik7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE2ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDUzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBQaG9uZU51bWJlclV0aWxzVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3ROZXR3b3JrUG9ydGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIisxNzAwNTU1NDE0MSIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDE0MSIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gd3JvbmcsIGJ1dCBpdCdzIHByb2JhYmx5IG9rCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEqIyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxNDEqIyIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk4iKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OLDEyMzQiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OOzEyMzQiKQorICAgICAgICApOworCisgICAgICAgIC8vIEFuIE1NSSBzdHJpbmcgaXMgdW5wZXJ0ZXJiZWQsIGV2ZW4gdGhvdWdoIGl0IGNvbnRhaW5zIGEKKyAgICAgICAgLy8gKHZhbGlkIGluIHRoaXMgY2FzZSkgZW1iZWRkZWQgKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIioqMjEqKjE3MDA1NTU0MTQxIyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIioqMjEqKisxNzAwNTU1NDE0MSMiKQorICAgICAgICAgICAgICAgIC8vVE9ETyB0aGlzIGlzIHRoZSBjb3JyZWN0IHJlc3VsdCwgYWx0aG91Z2ggdGhlIGFib3ZlCisgICAgICAgICAgICAgICAgLy9yZXN1bHQgaGFzIGJlZW4gcmV0dXJuZWQgc2luY2UgY2hhbmdlIDMxNzc2CisgICAgICAgICAgICAgICAgLy8iKioyMSoqKzE3MDA1NTU0MTQxIyIKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiLDEyMzQiKSk7CisKKyAgICAgICAgYnl0ZSBbXSBiID0gbmV3IGJ5dGVbMjBdOworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7CisgICAgICAgIGFzc2VydEVxdWFscygiMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODA7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7CisgICAgICAgIGFzc2VydEVxdWFscygiMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTA7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKKworICAgICAgICBieXRlW10gYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEKCIrMTcwMDU1NTAwMjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGJSZXQubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiW2ldLCBiUmV0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRFdpdGhMZW5ndGgoIisxNzAwNTU1MDAyMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoOCwgYlJldC5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoYlJldFswXSwgNyk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYltpIC0gMV0sIGJSZXRbaV0pOworICAgICAgICB9CisKKyAgICAgICAgYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEKCI3MDA1NTUwMDIwIik7CisgICAgICAgIGFzc2VydEVxdWFscygiNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYlJldCwgMCwgYlJldC5sZW5ndGgpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4QjA7CisgICAgICAgIGFzc2VydEVxdWFscygiMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHgyQjsgYlsyXSA9IChieXRlKSAweEIxOworICAgICAgICBhc3NlcnRFcXVhbHMoIiMyMSMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMrIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA0KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEjKyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDlBOyBiWzJdID0gKGJ5dGUpIDB4QTk7IGJbM10gPSAoYnl0ZSkgMHg3MTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4QjA7CisgICAgICAgIGFzc2VydEVxdWFscygiKjk5KjE3MDA1NTUwMDIwIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDlBOyBiWzJdID0gKGJ5dGUpIDB4QTk7IGJbM10gPSAoYnl0ZSkgMHg3MTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4QjA7CisgICAgICAgIGFzc2VydEVxdWFscygiKjk5KisxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4MUE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNzsgYls1XSA9IChieXRlKSAweDUwOyBiWzZdID0gKGJ5dGUpIDB4NTU7IGJbN10gPSAoYnl0ZSkgMHgwMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweDAyOyBiWzldID0gKGJ5dGUpIDB4RkI7CisgICAgICAgIGFzc2VydEVxdWFscygiKioyMSoxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDEwKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweDFBOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDc7IGJbNV0gPSAoYnl0ZSkgMHg1MDsgYls2XSA9IChieXRlKSAweDU1OyBiWzddID0gKGJ5dGUpIDB4MDA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHgwMjsgYls5XSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEqKzE3MDA1NTUwMDIwIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMTApKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEExOyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSoxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7IGJbM10gPSAoYnl0ZSkgMHg3MTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4RjA7CisgICAgICAgIGFzc2VydEVxdWFscygiKjIxIysxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOworCisgICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24obnVsbCkpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbihudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKG51bGwsICIxMjMiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTIzIiwgbnVsbCkpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQobnVsbCkpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuc3RyaW5nRnJvbVN0cmluZ0FuZFRPQShudWxsLCAxKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TmV0d29ya1BvcnRpb25BbHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIrMTcwMDU1NTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKzEgKDcwMCkuNTU1LTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBUaGlzIG1heSBzZWVtIHdyb25nLCBidXQgaXQncyBwcm9iYWJseSBvaworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxKiMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MTQxKiMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTiwxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTjsxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBbiBNTUkgc3RyaW5nIGlzIHVucGVydGVyYmVkLCBldmVuIHRob3VnaCBpdCBjb250YWlucyBhCisgICAgICAgIC8vICh2YWxpZCBpbiB0aGlzIGNhc2UpIGVtYmVkZGVkICsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqKjIxKiorMTcwMDU1NTQxNDEjIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKioyMSoqKzE3MDA1NTU0MTQxIyIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqMzEjKzQ0Nzk2NjE2NDIwOCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiozMSMrNDQ3OTY2MTY0MjA4IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIiozMSMrNDQ3OTY2MTY0MjA4IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKjMxIyAoKzQ0KSA3OSA2NjE2IDQyMDgiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIsMTIzNCIpKTsKKworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KG51bGwpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk4iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLDEyMzQiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OLDEyMzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiOzEyMzQiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OOzEyMzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiOzEyMzQsO04iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk47MS0yLjM0ICw7TiIpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGhpcyBpcyBvZGQKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIiLCAiIikpOworCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI5MTEiLCAiOTExIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjkxMSIsICIxODAwNTU1MDkxMSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjU1NTUiLCAiNTU1NSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI1NTU1IiwgIjE4MDA1NTU1NTU1NSIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMSAoNzAwKS41NTUtNDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMSAoNzAwKS41NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjE3MDA1NTU0MTQxIiwgIjU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMDExMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMDAxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjE3MDA1NTU0MTQxIiwgIjAwMTcwMDU1NTQxNDEiKSk7CisKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIioqMzEjKzE3MDA1NTU0MTQxIikpOworCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzEgOTk5IDcwMDU1NTQxNDEiLCAiKzEgNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjAxMSAxIDcwMDU1NTQxNDEiLCAiNzAwNTU1NDE0MSIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjAxMSAxMSA3MDA1NTU0MTQxIiwgIisxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI3MDg1ODgyMzAwIikpOworCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMCAyMDcgNzkyIDM0OTAiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMTEgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIC8qKioqKiBGSVhNRSdzICoqKioqKi8KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTU1JIGhlYWRlciBzaG91bGQgYmUgaWdub3JlZAorICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIqKjMxIzE3MDA1NTU0MTQxIikpOworCisgICAgICAgIC8vIEl0J3MgdG9vIGJhZCB0aGlzIGlzIGZhbHNlCisgICAgICAgIC8vICs0NCAoMCkgMjA3IDc5MiAzNDkwIGlzIG5vdCBhIGRpYWxhYmxlIG51bWJlcgorICAgICAgICAvLyBidXQgaXQgaXMgY29tbW9ubHkgaG93IEV1cm9wZWFuIHBob25lIG51bWJlcnMgYXJlIHdyaXR0ZW4KKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIis0NCAoMCkgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIC8vIFRoZSBqYXBhbmVzZSBpbnRlcm5hdGlvbmFsIHByZWZpeCwgZm9yIGV4YW1wbGUsIG1lc3NlcyB1cyB1cAorICAgICAgICAvLyBCdXQgd2hvIHVzZXMgYSBHU00gcGhvbmUgaW4gSmFwYW4/CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMTAgNDQgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIC8vIFRoZSBBdXN0cmFsaWFuIG9uZSBtZXNzZXMgdXMgdXAgdG9vCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMDExIDQ0IDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgUnVzc2lhbiB0cnVuayBwcmVmaXggbWVzc2VzIHVzIHVwLCBhcyBkb2VzIGN1cnJlbnQKKyAgICAgICAgLy8gUnVzc2lhbiBhcmVhIGNvZGVzICh3aGljaCBiZWluIHdpdGggMCkKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis3KDA5NSk5MTAwNzY2IiwgIjgoMDk1KTkxMDA3NjYiKSk7CisKKyAgICAgICAgLy8gNDQ0IGlzIG5vdCBhIHZhbGlkIGNvdW50cnkgY29kZSwgYnV0CisgICAgICAgIC8vIG1hdGNoSW50bFByZWZpeEFuZENDIGRvZXNudCBrbm93IHRoaXMKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NDQgMjA3IDc5MiAzNDkwIiwgIjAgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIC8vIGNvbXBhcmUgU01TIHNob3J0IGNvZGUKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjQwNC0wNCIsICI0MDQwNCIpKTsKKyAgICB9CisKKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9DYWxsZXJJREluZGV4YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxLDEyMzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MTsxMjM0IikpOworCisgICAgICAgIC8vdGhpcyBzZWVtcyB3cm9uZywgb3IgYXQgbGVhc3QgdXNlbGVzcworICAgICAgICBhc3NlcnRFcXVhbHMoIk5OMTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxTk4iKSk7CisKKyAgICAgICAgLy88c2hydWc+IC0tIHRoZXNlIGFyZSBhbGwgbm90IHVzZWZ1bCwgYnV0IG5vdCB0ZXJyaWJseSB3cm9uZworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDAzMiIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIyMzAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIrIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIisyMzAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiMxMzAjKiIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIqIzAzMSMiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbmRleGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxLDEyMzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxOzEyMzQiKSk7CisKKyAgICAgICAgLy90aGlzIHNlZW1zIHdyb25nLCBvciBhdCBsZWFzdCB1c2VsZXNzCisgICAgICAgIGFzc2VydEVxdWFscygiTk4xNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MU5OIikpOworCisgICAgICAgIC8vPHNocnVnPiAtLSB0aGVzZSBhcmUgYWxsIG5vdCB1c2VmdWwsIGJ1dCBub3QgdGVycmlibHkgd3JvbmcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIyMzAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIrIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIrMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMTMwIyoiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIiojMDMxIyIpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hbnBGb3JtYXR0aW5nKCkgeworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIG51bWJlci5hcHBlbmQoIjgwMDU1NTEyMTIiKTsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwLTU1NS0xMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIG51bWJlci5jbGVhcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDA1NTUxMjEiKTsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwLTU1NS0xMjEiLCBudW1iZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbnVtYmVyLmNsZWFyKCk7CisgICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjU1NS0xMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIG51bWJlci5jbGVhcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDAtNTU1MTIiKTsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwLTU1NS0xMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiNDY2NDUiKTsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiNDY2NDUiLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjEtODAwLTQ2NjQtNDExIiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMS04MDAtR09PRy00MTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTgwMDQ2NjQ0MTEiLAorICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxODAwR09PRzQxMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTgwMC00NjYtNDQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjEtODAwLTQ2Ni00NDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE4MDA0NjY0NDExIiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMTgwMDQ2NjQ0MTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjIyLTMzMy00NDQtNTU1LTY2Ni03Nzc3LTg4OC05OTk5IiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFCQy1ERUYtR0hJLUpLTC1NTk8tUFFSUy1UVVYtV1hZWiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMjItMzMzLTQ0NC01NTUtNjY2LTc3NzctODg4LTk5OTkiLAorICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjLWRlZi1naGktamtsLW1uby1wcXJzLXR1di13eHl6IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIig4MDApIDIyMi0zMzM0IiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiKDgwMCkgQUJDLURFRkciKSk7CisgICAgfQorCisgICAgLy8gVG8gcnVuIHRoaXMgdGVzdCwgdGhlIGRldmljZSBoYXMgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIG5ldHdvcmsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis4NDc1Nzk3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzE4NDc1Nzk3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTEyMzQ1NjciLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTIzNDU2NyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTEyMzQ1NjcwMDAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisyMzQ1NjcwMDAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTExMTg3NTc2NzgwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxMTg3NTc2NzgwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDE4NDc1MjMxNzUzIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwrMTg0NzUyMzE3NTMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExODQ3NTc5NzAwMCwxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis4NDc1Nzk3MDAwLCsxODQ3NTIzMTc1MyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOzAxMTg0NjkzMTIzNDUiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOys4NDY5MzEyMzQ1IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsMDExMTIzNDU2NyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsKzEyMzQ1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTk3MDAwOzAxMTExODc1NzY3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTk3MDAwOysxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCwwMTE4NDY5MzEyMzQ1IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwsKzg0NjkzMTIzNDUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssMDExODQ2OTMxMjM0NSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCs4NDY5MzEyMzQ1IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsOzE4NDc1MjMxNzUzIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCw7KzE4NDc1MjMxNzUzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LDAxMTExODc1NzY3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssKzExODc1NzY3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsOzAxMTExODc1NzY3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCw7KzExODc1NzY3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsLCwwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsLCwrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssLDAxMTExODc1NzY3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssLCsxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrOyw4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzssODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0Nys1NzktNzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0Nys1NzktNzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIsODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIiw4NDc1Nzk3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjs7ODQ3NTc5NzAwMCwsIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiOzs4NDc1Nzk3MDAwLCwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiK3RoaXMraXMkd2VpcmQ7LCsiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrdGhpcytpcyR3ZWlyZDssKyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIiKSk7CisgICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUobnVsbCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4sUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTixQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzaWMgY2hlY2tzIGZvciB0aGUgVm9pY2VNYWlsIG51bWJlci4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhOdW1iZXJOb3RFcXVhbFRvVm9pY2VNYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIjkxMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigidGVsOjkxMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiKzE4MDAxMjM0NTY3IikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCIiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIobnVsbCkpOworICAgICAgICAvLyBUaGlzIHRlc3QgZmFpbHMgb24gYSBkZXZpY2Ugd2l0aG91dCBhIHNpbSBjYXJkCisgICAgICAgIC8qVGVsZXBob255TWFuYWdlciBtVGVsZXBob255TWFuYWdlciA9CisgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcilnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgU3RyaW5nIG1Wb2ljZU1haWxOdW1iZXIgPSBtVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0Vm9pY2VNYWlsTnVtYmVyKCk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihtVm9pY2VNYWlsTnVtYmVyKSk7CisgICAgICAgICovCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXROdW1iZXJUb0UxNjQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE2NTAyOTEwMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXJUb0UxNjQoIjY1MCAyOTEwMDAwIiwgInVzIikpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyVG9FMTY0KCIxMjM0NTY3IiwgInVzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxODAwNDY2NDExNCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyVG9FMTY0KCI4MDAtR09PRy0xMTQiLCAidXMiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXROdW1iZXIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiKDY1MCkgMjkxLTAwMDAiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwIDI5MTAwMDAiLCAidXMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTIzLTQ1NjciLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiMTIzNDU2NyIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoODAwKSA0NjYtNDExNCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKCI4MDAtR09PRy0xMTQiLCAidXMiKSk7CisKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZU51bWJlcigpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI2NTAyOTEwMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIjY1MCAyOTEwMDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMzQ1NjciLCBQaG9uZU51bWJlclV0aWxzLm5vcm1hbGl6ZU51bWJlcigiMTIsMyM0KjU2NyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDA0NjY0MTE0IiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIjgwMC1HT09HLTExNCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTY1MDI5MTAwMDAiLCBQaG9uZU51bWJlclV0aWxzLm5vcm1hbGl6ZU51bWJlcigiKzEgNjUwIDI5MTAwMDAiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXREYWlsYWJlTnVtYmVyKCkgeworICAgICAgICAvLyBVc2luZyB0aGUgcGhvbmVOdW1iZXJFMTY0J3MgY291bnRyeSBjb2RlCisgICAgICAgIGFzc2VydEVxdWFscygiKDY1MCkgMjkxLTAwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKCI2NTAyOTEwMDAwIiwgIisxNjUwMjkxMDAwMCIsICJDTiIpKTsKKyAgICAgICAgLy8gVGhlIHBob25lTnVtYmVyRTE2NCBpcyBudWxsCisgICAgICAgIGFzc2VydEVxdWFscygiKDY1MCkgMjkxLTAwMDAiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwMjkxMDAwMCIsIG51bGwsICJVUyIpKTsKKyAgICAgICAgLy8gVGhlIGdpdmVuIG51bWJlciBoYXMgYSBjb3VudHJ5IGNvZGUuCisgICAgICAgIGFzc2VydEVxdWFscygiKzEgNjUwLTI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIisxNjUwMjkxMDAwMCIsIG51bGwsICJDTiIpKTsKKyAgICAgICAgLy8gVGhlIGdpdmVuIG51bWJlciB3YXMgZm9ybWF0dGVkLgorICAgICAgICBhc3NlcnRFcXVhbHMoIjY1MC0yOTEtMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKCI2NTAtMjkxLTAwMDAiLCBudWxsLCAiVVMiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTU3M2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKKworcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRDaGFycygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG11bHRpQ2hhcnMgPSAiNjUwMTIzNDUiOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkMSA9ICIoNjUwKSAxMjMtNDUiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgLy8gQXBwZW5kIG1vcmUgdGhhbiBvbmUgY2hhcnMKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCBtdWx0aUNoYXJzLmxlbmd0aCgpKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZChtdWx0aUNoYXJzKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgICAgICAvLyBBcHBlbmQgb25lIGNoYXJzCisgICAgICAgIGZpbmFsIGNoYXIgYXBwZW5kQ2hhciA9ICc2JzsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZDIgPSAiKDY1MCkgMTIzLTQ1NiI7CisgICAgICAgIGludCBsZW4gPSBudW1iZXIubGVuZ3RoKCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpLCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZChhcHBlbmRDaGFyKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCBsZW4sIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0Q2hhcnMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIjY1MDEyMzQ1Njc4IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDEgPSAiKDY1MCkgMTIzLTQ1NjciOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBjaGFyLgorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIGxlbiAtIDEsIDEsIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKGxlbiAtIDEsIGxlbik7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpIC0gMSwgMSwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgICAgIC8vIFJlbW92ZSBsYXN0IDUgY2hhcnMKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDIgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCkgLSA0LCA0LCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZShudW1iZXIubGVuZ3RoKCkgLSA1LCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSwgNCwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDIubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc2VydENoYXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIC8vIEluc2VydCBvbmUgY2hhcgorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDQsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDQsICIxIik7IC8vICg2NTAxKSAyMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiAxCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA0LCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IG11bHRpcGxlIGNoYXJzCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDIgPSAiKDY1MCkgMTQ1LTY3MjMiOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDcsIDAsIDQpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDcsICI0NTY3Iik7IC8vIGNoYW5nZSB0byAoNjUwKSAxNDU2NzIzCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAxMSk7IC8vIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHJpZ2h0IG9mICc3Jy4KKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDcsIDAsIDQpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgYmUgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICc3JworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3BGb3JtYXR0aW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAxMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIig2NTApIDEyMyA0IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIC8vIEFwcGVuZCBzcGFjZQorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDksICIgNCIpOyAvLyAoNjUwMSkgMjMgNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICcxJworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIERlbGV0ZSBhICcpJworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0iKDY1MCAxMjMiOworICAgICAgICB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDQsIDEsIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKDQsIDUpOyAvLyAoNjUwMSAyMyA0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA1KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDEKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDQsIDEsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICcxJworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBJbnNlcnQgYSBoeXBoZW4KKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMyA9Iig2NTApIDEyLTMiOworICAgICAgICB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDgsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDgsICItIik7IC8vICg2NTApIDEyLTMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgLQorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOCwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMywgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJy0nCisgICAgICAgIGFzc2VydEVxdWFscyg5LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0YXJ0Rm9ybWF0dGluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIoNjUwKSAxMjMgNCI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBBcHBlbmQgc3BhY2UKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg5LCAiIDQiKTsgLy8gKDY1MCkgMTIzIDQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNCcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBzdHJpbmcsIGFuZCBzdGFydCBmb3JtYXR0aW5nIGFnYWluLgorICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDAsIGxlbiwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUoMCwgbGVuKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDAsIGxlbiwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0gIig2NTApIDEyMy00IjsKKyAgICAgICAgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMSk7CisgICAgICAgIG51bWJlci5pbnNlcnQoOSwgIjQiKTsgLy8gKDY1MCkgMTIzNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICc0JworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0Q2hhbmdlZEJ5T3RoZXJUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgZmluYWwgVGV4dFdhdGNoZXIgY2xlYW51cFRleHRXYXRjaGVyID0gbmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgcy5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGludCBhZnRlcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsCisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAxMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIiI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDUsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDUsICI0Iik7IC8vICg2NTA0KSAxMjMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDUpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNSwgMCwgMSk7CisgICAgICAgIG51bWJlci5zZXRTcGFuKGNsZWFudXBUZXh0V2F0Y2hlciwgMCwgbnVtYmVyLmxlbmd0aCgpLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXh0V2F0Y2hlciBnZXRUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigiVVMiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVV0aWxzVGVzdC5qYXZhCmluZGV4IGRiMzhlZGUuLmVmNjJkODUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVV0aWxzVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVV0aWxzVGVzdC5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBkYXRhLCBkYXRhMjsKIAotICAgICAgICAvKiAKKyAgICAgICAgLyoKICAgICAgICAgICogYmNkVG9TdHJpbmcoKQogICAgICAgICAgKi8KIApAQCAtNDAsOSArNDAsMTMgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTI2MDQ1MDAxNDQ4NDg2IiwgSWNjVXRpbHMuYmNkVG9TdHJpbmcoZGF0YSwgMSwgZGF0YS5sZW5ndGggLSAyKSk7CiAKICAgICAgICAgLy8gU3RvcHMgb24gaW52YWxpZCBCQ0QgdmFsdWUKLSAgICAgICAgZGF0YSA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjk4RjA2MjQwMDUxMDQ0NDg2OGYyIik7CisgICAgICAgIGRhdGEgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKCI5OEUwNjI0MDA1MTA0NDQ4NjhmMiIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjg5MCIsIEljY1V0aWxzLmJjZFRvU3RyaW5nKGRhdGEsIDAsIGRhdGEubGVuZ3RoKSk7CiAKKyAgICAgICAgLy8gc2tpcCB0aGUgaGlnaCBuaWJibGUgJ0YnIHNpbmNlIHNvbWUgUExNTnMgaGF2ZSBpdAorICAgICAgICBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiOThGMDYyNDAwNTEwNDQ0ODY4ZjIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4OTAyNjA0NTAwMTQ0ODQ4NjIiLCBJY2NVdGlscy5iY2RUb1N0cmluZyhkYXRhLCAwLCBkYXRhLmxlbmd0aCkpOworCiAgICAgICAgIC8qCiAgICAgICAgICAqIGdzbUJjZEJ5dGVUb0ludCgpCiAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggNDI3Nzk1Yi4uOGNiMDVjYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOworCiAvKioKICAqIFN0dWIgY2xhc3MgdXNlZCBmb3IgdW5pdCB0ZXN0cwogICovCkBAIC0zMiw3ICszNCw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oUGhvbmUgc2VuZGVyKSB7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgbm90aWZ5U2lnbmFsU3RyZW5ndGgoUGhvbmUgc2VuZGVyKSB7CiAgICAgfQogCkBAIC00MiwxMCArNDQsMTQgQEAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoUGhvbmUgc2VuZGVyKSB7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KFBob25lIHNlbmRlcikgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhCmluZGV4IGI5Njc0M2EuLjQ4NTU0MmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKQEAgLTE4LDI3ICsxOCwyMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsU3RhdGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1taUNvZGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZXN0UGhvbmVOb3RpZmllcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNhbGxGYWlsQ2F1c2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVRlc3RIYW5kbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR3NtTW1pQ29kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZFJhZGlvQ29udHJvbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTY1OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0xvYWRlclRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKKworLyoqCisgKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciB0ZXN0aW5nIHtAbGluayBMb2FkZXJ9cy4gVGhpcyB0ZXN0IGNhc2UKKyAqIHByb3ZpZGVzIGEgc2ltcGxlIHdheSB0byBzeW5jaHJvbm91c2x5IGdldCB0aGUgcmVzdWx0IGZyb20gYSBMb2FkZXIgbWFraW5nCisgKiBpdCBlYXN5IHRvIGFzc2VydCB0aGF0IHRoZSBMb2FkZXIgcmV0dXJucyB0aGUgZXhwZWN0ZWQgcmVzdWx0LgorICovCitwdWJsaWMgY2xhc3MgTG9hZGVyVGVzdENhc2UgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIEZvcmNlIGNsYXNzIGxvYWRpbmcgb2YgQXN5bmNUYXNrIG9uIHRoZSBtYWluIHRocmVhZCBzbyB0aGF0IGl0J3MgaGFuZGxlcnMgYXJlIHRpZWQgdG8KKyAgICAgICAgLy8gdGhlIG1haW4gdGhyZWFkIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgd29ya2VyIHRocmVhZCBnZXQgZGVsaXZlcmVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgLy8gVGhlIHRlc3RzIGFyZSBydW4gb24gYW5vdGhlciB0aHJlYWQsIGFsbG93aW5nIHRoZW0gdG8gYmxvY2sgd2FpdGluZyBvbiBhIHJlc3BvbnNlIGZyb20KKyAgICAgICAgLy8gdGhlIGNvZGUgcnVubmluZyBvbiB0aGUgbWFpbiB0aHJlYWQuIFRoZSBtYWluIHRocmVhZCBjYW4ndCBibG9jayBzaW5jZSB0aGUgQXlzbmNUYXNrCisgICAgICAgIC8vIHJlc3VsdHMgY29tZSBpbiB2aWEgdGhlIGV2ZW50IGxvb3AuCisgICAgICAgIG5ldyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgVm9pZD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gYXJncykge3JldHVybiBudWxsO30KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShWb2lkIHJlc3VsdCkge30KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIGEgTG9hZGVyIHN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZC4gVGhlIGxvYWRlciB3aWxsCisgICAgICogYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIGRlc3Ryb3llZCBieSB0aGlzIG1ldGhvZCBzbyBpdCBjYW5ub3QgYmUgcmV1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgbG9hZGVyIHRvIHJ1biBzeW5jaHJvbm91c2x5CisgICAgICogQHJldHVybiBUaGUgcmVzdWx0IGZyb20gdGhlIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCBnZXRMb2FkZXJSZXN1bHRTeW5jaHJvbm91c2x5KGZpbmFsIExvYWRlcjxUPiBsb2FkZXIpIHsKKyAgICAgICAgLy8gVGhlIHRlc3QgdGhyZWFkIGJsb2NrcyBvbiB0aGlzIHF1ZXVlIHVudGlsIHRoZSBsb2FkZXIgcHV0cyBpdCdzIHJlc3VsdCBpbgorICAgICAgICBmaW5hbCBBcnJheUJsb2NraW5nUXVldWU8VD4gcXVldWUgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFQ+KDEpOworCisgICAgICAgIC8vIFRoaXMgY2FsbGJhY2sgcnVucyBvbiB0aGUgIm1haW4iIHRocmVhZCBhbmQgdW5ibG9ja3MgdGhlIHRlc3QgdGhyZWFkCisgICAgICAgIC8vIHdoZW4gaXQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlIGJsb2NraW5nIHF1ZXVlCisgICAgICAgIGZpbmFsIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8VD4gbGlzdGVuZXIgPSBuZXcgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxUPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPFQ+IGNvbXBsZXRlZExvYWRlciwgVCBkYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gU2h1dCB0aGUgbG9hZGVyIGRvd24KKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGNvbXBsZXRlZExvYWRlci5zdG9wTG9hZGluZygpOworICAgICAgICAgICAgICAgIGNvbXBsZXRlZExvYWRlci5kZXN0cm95KCk7CisKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgcmVzdWx0LCB1bmJsb2NraW5nIHRoZSB0ZXN0IHRocmVhZAorICAgICAgICAgICAgICAgIHF1ZXVlLmFkZChkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBUaGlzIGhhbmRsZXIgcnVucyBvbiB0aGUgIm1haW4iIHRocmVhZCBvZiB0aGUgcHJvY2VzcyBzaW5jZSBBc3luY1Rhc2sKKyAgICAgICAgLy8gaXMgZG9jdW1lbnRlZCBhcyBuZWVkaW5nIHRvIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kIG1hbnkgTG9hZGVycyB1c2UKKyAgICAgICAgLy8gQXN5bmNUYXNrCisgICAgICAgIGZpbmFsIEhhbmRsZXIgbWFpblRocmVhZEhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcigwLCBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIEFzayB0aGUgbWFpbiB0aHJlYWQgdG8gc3RhcnQgdGhlIGxvYWRpbmcgcHJvY2VzcworICAgICAgICBtYWluVGhyZWFkSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKDApOworCisgICAgICAgIC8vIEJsb2NrIG9uIHRoZSBxdWV1ZSB3YWl0aW5nIGZvciB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIGJlIGluc2VydGVkCisgICAgICAgIFQgcmVzdWx0OworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBxdWV1ZS50YWtlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIndhaXRpbmcgdGhyZWFkIGludGVycnVwdGVkIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKaW5kZXggZTExNzJjZi4uNzRjZWJlZSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKQEAgLTczLDYgKzczLDE4IEBACiAgICAgICAgIG1SZXNvbHZlci5hZGRQcm92aWRlcihtUHJvdmlkZXJBdXRob3JpdHksIGdldFByb3ZpZGVyKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdCBmaXh0dXJlLgorICAgICAqIDxwPgorICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3NodXRkb3duKCl9IG9uIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSByZXByZXNlbnRlZCBieSBtUHJvdmlkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVByb3ZpZGVyLnNodXRkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCiAgICAgcHVibGljIE1vY2tDb250ZW50UmVzb2x2ZXIgZ2V0TW9ja0NvbnRlbnRSZXNvbHZlcigpIHsKICAgICAgICAgcmV0dXJuIG1SZXNvbHZlcjsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEKaW5kZXggMWZiNTUzOC4uMjgxMWIwZCAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZTIuamF2YQpAQCAtNzQsNyArNzQsNyBAQAogICAgIHByaXZhdGUgSXNvbGF0ZWRDb250ZXh0IG1Qcm92aWRlckNvbnRleHQ7CiAgICAgcHJpdmF0ZSBNb2NrQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKIAotICAgICAgIHByaXZhdGUgY2xhc3MgTW9ja0NvbnRleHQyIGV4dGVuZHMgTW9ja0NvbnRleHQgeworICAgIHByaXZhdGUgY2xhc3MgTW9ja0NvbnRleHQyIGV4dGVuZHMgTW9ja0NvbnRleHQgewogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKQEAgLTg3LDYgKzg3LDExIEBACiAgICAgICAgICAgICAvLyBvbmUgY3JlYXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIENvbnRleHQKICAgICAgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuZ2V0RGlyKCJtb2NrY29udGV4dDJfIiArIG5hbWUsIG1vZGUpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CiAgICAgfQogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgpAQCAtMTQxLDYgKzE0NiwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdCBmaXh0dXJlLgorICAgICAqIDxwPgorICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3NodXRkb3duKCl9IG9uIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSByZXByZXNlbnRlZCBieSBtUHJvdmlkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVByb3ZpZGVyLnNodXRkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUge0BsaW5rIE1vY2tDb250ZW50UmVzb2x2ZXJ9IGNyZWF0ZWQgYnkgdGhpcyBjbGFzcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFlvdQogICAgICAqIG11c3QgdXNlIHRoZSBtZXRob2RzIG9mIHRoaXMgcmVzb2x2ZXIgdG8gYWNjZXNzIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0LgogICAgICAqCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCmluZGV4IDk3M2I5ZjIuLmVlZTNhZDcgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMTQ4LDYgKzE0OSwxNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIGludCBtb2RlLCBTUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5IGZhY3RvcnksIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW50ZXJuYWxOYW1lID0gcmVuYW1lZEZpbGVOYW1lKG5hbWUpOworICAgICAgICBpZiAoIW1EYXRhYmFzZU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VOYW1lcy5hZGQobmFtZSk7CisgICAgICAgICAgICBtRmlsZUNvbnRleHQuZGVsZXRlRGF0YWJhc2UoaW50ZXJuYWxOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZpbGVDb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKGludGVybmFsTmFtZSwgbW9kZSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAobURhdGFiYXNlTmFtZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAgICAgIG1EYXRhYmFzZU5hbWVzLnJlbW92ZShuYW1lKTsKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDNmZDcxYzguLmI2M2ZmM2QgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMTI3LDYgKzEyNywxNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gTW9ja0NvbnRlbnRQcm92aWRlci50aGlzLmdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gTW9ja0NvbnRlbnRQcm92aWRlci50aGlzLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmwsIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgfQogICAgIH0KICAgICBwcml2YXRlIGZpbmFsIEludmVyc2lvbklDb250ZW50UHJvdmlkZXIgbUlDb250ZW50UHJvdmlkZXIgPSBuZXcgSW52ZXJzaW9uSUNvbnRlbnRQcm92aWRlcigpOwogCkBAIC0yMjIsNiArMjMyLDE0IEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCBjYWxsIik7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCBjYWxsIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBJQ29udGVudFByb3ZpZGVyIHdoaWNoIGNhbGxzIGJhY2sgc2FtZSBtZXRob2RzIGluIHRoaXMgY2xhc3MuCiAgICAgICogQnkgb3ZlcnJpZGluZyB0aGlzIGNsYXNzLCB3ZSBhdm9pZCB0aGUgbWVjaGFuaXNtIGhpZGRlbiBiZWhpbmQgQ29udGVudFByb3ZpZGVyCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCmluZGV4IGZmZDc1N2MuLmMzMWM5Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKQEAgLTE4NCw2ICsxODUsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIGZpbGUsIGludCBtb2RlLAorICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0RGF0YWJhc2VQYXRoKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhCmluZGV4IDliMWMwZWYuLmJhYTE1MGEgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YQpAQCAtMTc4LDM2ICsxNzgsMTEgQEAKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvblVyaShDb250ZW50UmVzb2x2ZXIgY3IsIFVyaSB1cmkpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KQEAgLTIxNyw0OCArMTkyLDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRG91YmxlKGludCBjb2x1bW5JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVN0cmluZyhpbnQgY29sdW1uSW5kZXgsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVRvTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCBhYm9ydFVwZGF0ZXMoKSB7CisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCAwYmU1YmVhLi4xODNiZTQxIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTEwMiw0ICsxMDMsMTMgQEAKICAgICBwdWJsaWMgSUJpbmRlciBhc0JpbmRlcigpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQppbmRleCBkZjZkYTcwLi5hMmI5NGZmIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQpAQCAtNDYsNiArNDYsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgVGVzdEdyb3VwaW5nIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlRlc3RHcm91cGluZyI7CisKICAgICBTb3J0ZWRTZXQ8Q2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPj4gdGVzdENhc2VDbGFzc2VzOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4+IFNPUlRfQllfU0lNUExFX05BTUUKQEAgLTExNCw3ICsxMTYsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZSA6IHBhY2thZ2VOYW1lcykgewogICAgICAgICAgICAgTGlzdDxDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+PiBhZGRlZENsYXNzZXMgPSB0ZXN0Q2FzZUNsYXNzZXNJblBhY2thZ2UocGFja2FnZU5hbWUpOwogICAgICAgICAgICAgaWYgKGFkZGVkQ2xhc3Nlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudygiVGVzdEdyb3VwaW5nIiwgIkludmFsaWQgUGFja2FnZTogJyIgKyBwYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbnZhbGlkIFBhY2thZ2U6ICciICsgcGFja2FnZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgY291bGQgbm90IGJlIGZvdW5kIG9yIGhhcyBubyB0ZXN0cyIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGVzdENhc2VDbGFzc2VzLmFkZEFsbChhZGRlZENsYXNzZXMpOwpAQCAtMjM0LDYgKzIzNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIlRlc3RDYXNlIGNsYXNzICVzIGlzIG1pc3NpbmcgYSBwdWJsaWMgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXJzICIgKworICAgICAgICAgICAgICAgICAgICAib3IgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciAtIHNraXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgYUNsYXNzLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDc3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBUZXN0R3JvdXBpbmd9CisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R3JvdXBpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBUZXN0R3JvdXBpbmcgbUdyb3VwaW5nOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUdyb3VwaW5nID0gbmV3IFRlc3RHcm91cGluZyhUZXN0R3JvdXBpbmcuU09SVF9CWV9TSU1QTEVfTkFNRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCBUZXN0Q2FzZXMgd2l0aCBubyBwdWJsaWMgY29uc3RydWN0b3IgYXJlIG5vdCBsb2FkZWQuCisgICAgICogUmVsaWVzIG9uIGZpeHR1cmUgY2xhc3NlcyBpbiBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRlc3RzX25vUHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgICAgIG1Hcm91cGluZy5hZGRQYWNrYWdlc1JlY3Vyc2l2ZSgiYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvciIpOworICAgICAgICBMaXN0PFRlc3RNZXRob2Q+IHRlc3RzID0gbUdyb3VwaW5nLmdldFRlc3RzKCk7CisgICAgICAgIC8vIG9ubHkgdGhlIFB1YmxpY0NvbnN0cnVjdG9yVGVzdCdzIHRlc3QgbWV0aG9kIHNob3VsZCBiZSBwcmVzZW50CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0ZXN0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RQdWJsaWNDb25zdHJ1Y3RvciIsIHRlc3RzLmdldCgwKS5nZXROYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL05vUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTA5YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQSB7QGxpbmsgVGVzdENhc2V9IHdoaWNoIHNob3VsZCBub3QgYmUgbG9hZGVkIHNpbmNlIGl0IGhhcyBub24tcHVibGljIGNvbnN0cnVjdG9ycyB3aXRoIG5vIGFyZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIE5vUHVibGljQ29uc3RydWN0b3JUZXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdChTdHJpbmcgZm9vLCBTdHJpbmcgZm9vMikgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RSdW4oKSB7CisgICAgICAgIGZhaWwoIm1ldGhvZCBpbiBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCBydW4gdW5leHBlY3RlZGx5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Qcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg2MmZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBBIHByb3RlY3RlZCBjb25zdHJ1Y3RvciB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgbm90IGJlIGxvYWRlZC4KKyAqLworcHVibGljIGNsYXNzIFByb3RlY3RlZENvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdFJ1bigpIHsKKyAgICAgICAgZmFpbCgibWV0aG9kIGluIFByb3RlY3RlZENvbnN0cnVjdG9yVGVzdCBydW4gdW5leHBlY3RlZGx5Iik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMWUyNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEEgcHVibGljIGNvbnN0cnVjdG9yIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQdWJsaWNDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCmluZGV4IGEwNThkNGEuLjAzNzM2N2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKQEAgLTY1LDcgKzY1LDcgQEAKIHB1YmxpYzoKICAgICBTdWJQbHVnaW4oTlBQIGluc3QpIDogbV9pbnN0KGluc3QpIHt9CiAgICAgdmlydHVhbCB+U3ViUGx1Z2luKCkge30KLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgPSAwOwogCiAgICAgTlBQIGluc3QoKSBjb25zdCB7IHJldHVybiBtX2luc3Q7IH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAKaW5kZXggMmVmZjM5NC4uOTFmMWIzZCAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICBicm93c2VyLT5tZW1mcmVlKGJlZ2luTWVtKTsKIH0KIAotaW50MTYgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKK2ludDE2X3QgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CiAKICAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKaW5kZXggODhiN2M5ZC4uMDQzYmU4NSAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKQEAgLTMyLDcgKzMyLDcgQEAKIHB1YmxpYzoKICAgICBFdmVudFBsdWdpbihOUFAgaW5zdCk7CiAgICAgdmlydHVhbCB+RXZlbnRQbHVnaW4oKTsKLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKIAogcHJpdmF0ZToKICAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcAppbmRleCA0MDJhN2UyLi41MTExODBjIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwCkBAIC0zNCwxOSArMzQsMTkgQEAKIE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKICNkZWZpbmUgRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCiAKLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7CiBOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKIE5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOwogTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLAotICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpOworICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSk7CiBOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKTsKLWludDMyICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKLWludDMyICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sCitpbnQzMl90ICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKK2ludDMyX3QgICBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sCiAgICAgICAgIHZvaWQqIGJ1ZmZlcik7CiB2b2lkICAgIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSk7CiB2b2lkICAgIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpOwotaW50MTYgICBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCk7CitpbnQxNl90ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOwogdm9pZCAgICBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogVVJMLCBOUFJlYXNvbiByZWFzb24sCiAgICAgICAgIHZvaWQqIG5vdGlmeURhdGEpOwogTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi94LWJyb3dzZXJ0ZXN0cGx1Z2luOmJ0cDpBbmRyb2lkIEJyb3dzZXIgVGVzdCBQbHVnaW4iOwogfQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCkKIHsKIApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwogfQogCi1OUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2KiBzdHlwZSkKK05QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpCiB7CiAgICAgKnN0eXBlID0gTlBfQVNGSUxFT05MWTsKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CkBAIC0xOTksMTIgKzE5OSwxMiBAQAogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKIH0KIAotaW50MzIgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQoraW50MzJfdCBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludDMyIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLCB2b2lkKiBidWZmZXIpCitpbnQzMl90IE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGxlbiwgdm9pZCogYnVmZmVyKQogewogICAgIHJldHVybiAwOwogfQpAQCAtMjE3LDcgKzIxNyw3IEBACiB7CiB9CiAKLWludDE2IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KQoraW50MTZfdCBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKIHsKICAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKICAgICBjb25zdCBBTlBFdmVudCogZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBTlBFdmVudCo+KGV2ZW50KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvTklPVGVzdC5qYXZhIGIvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9OSU9UZXN0LmphdmEKaW5kZXggZmQyNzljYS4uOTQ3NmQwNyAxMDA2NDQKLS0tIGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9OSU9UZXN0LmphdmEKKysrIGIvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9OSU9UZXN0LmphdmEKQEAgLTQwLDI3ICs0MCwzMSBAQAogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TklPKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYjsKLQorICAgIHB1YmxpYyB2b2lkIHRlc3ROSU9fYnl0ZV9hcnJheSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IGJ5dGUgYXJyYXktYmFzZWQgYnVmZmVyCi0gICAgICAgIGIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDEyKTsKLSAgICAgICAgYnl0ZUJ1ZmZlclRlc3QoYik7CisgICAgICAgIGJ5dGVCdWZmZXJUZXN0KEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTIpKTsKKyAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TklPX2RpcmVjdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUZXN0IG5hdGl2ZSBoZWFwLWFsbG9jYXRlZCBidWZmZXIKLSAgICAgICAgYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoMTIpOwotICAgICAgICBieXRlQnVmZmVyVGVzdChiKTsKKyAgICAgICAgYnl0ZUJ1ZmZlclRlc3QoQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgxMikpOworICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3ROSU9fc2hvcnRfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBzaG9ydCBhcnJheS1iYXNlZCBidWZmZXIKICAgICAgICAgc2hvcnRbXSBzaG9ydEFycmF5ID0gbmV3IHNob3J0WzhdOwogICAgICAgICBTaG9ydEJ1ZmZlciBzYiA9IFNob3J0QnVmZmVyLndyYXAoc2hvcnRBcnJheSk7CiAgICAgICAgIHNob3J0QnVmZmVyVGVzdChzYik7CisgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdE5JT19pbnRfYXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGVzdCBpbnQgYXJyYXktYmFzZWQgYnVmZmVyCiAgICAgICAgIGludFtdIGludEFycmF5ID0gbmV3IGludFs4XTsKICAgICAgICAgSW50QnVmZmVyIGliID0gSW50QnVmZmVyLndyYXAoaW50QXJyYXkpOwogICAgICAgICBpbnRCdWZmZXJUZXN0KGliKTsKKyAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TklPX2Zsb2F0X2FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRlc3QgZmxvYXQgYXJyYXktYmFzZWQgYnVmZmVyCiAgICAgICAgIGZsb2F0W10gZmxvYXRBcnJheSA9IG5ldyBmbG9hdFs4XTsKICAgICAgICAgRmxvYXRCdWZmZXIgZmIgPSBGbG9hdEJ1ZmZlci53cmFwKGZsb2F0QXJyYXkpOwpAQCAtNzAsNiArNzQsMTIgQEAKICAgICBwcml2YXRlIHZvaWQgYnl0ZUJ1ZmZlclRlc3QoQnl0ZUJ1ZmZlciBiKSB7CiAgICAgICAgIGNoZWNrQnVmZmVyKGIpOwogCisgICAgICAgIC8vIER1cGxpY2F0ZSBidWZmZXJzIHJldmVydCB0byBiaWctZW5kaWFuLgorICAgICAgICBiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBkdXBlID0gYi5kdXBsaWNhdGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVPcmRlci5CSUdfRU5ESUFOLCBkdXBlLm9yZGVyKCkpOworICAgICAgICBiLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKKwogICAgICAgICAvLyBCb3VuZHMgY2hlY2tzCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBiLnB1dCgtMSwgKGJ5dGUpIDApOwpAQCAtMjcyLDkgKzI4Miw5IEBACiAgICAgICAgIC8vIENoZWNrICdnZXRGbG9hdCcKICAgICAgICAgYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CiAgICAgICAgIGIucG9zaXRpb24oMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygweEEzQTJBMUEwLCBGbG9hdC5mbG9hdFRvSW50Qml0cyhiLmdldEZsb2F0KCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QTdBNkE1QTQsIEZsb2F0LmZsb2F0VG9JbnRCaXRzKGIuZ2V0RmxvYXQoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMHhBQkFBQTlBOCwgRmxvYXQuZmxvYXRUb0ludEJpdHMoYi5nZXRGbG9hdCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygweEEzQTJBMUEwLCBGbG9hdC5mbG9hdFRvUmF3SW50Qml0cyhiLmdldEZsb2F0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QTdBNkE1QTQsIEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKGIuZ2V0RmxvYXQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHhBQkFBQTlBOCwgRmxvYXQuZmxvYXRUb1Jhd0ludEJpdHMoYi5nZXRGbG9hdCgpKSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBiLmdldEZsb2F0KCk7CiAgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIpOwpAQCAtMjg0LDkgKzI5NCw5IEBACiAKICAgICAgICAgYi5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CiAgICAgICAgIGIucG9zaXRpb24oMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygweEEwQTFBMkEzLCBGbG9hdC5mbG9hdFRvSW50Qml0cyhiLmdldEZsb2F0KCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QTRBNUE2QTcsIEZsb2F0LmZsb2F0VG9JbnRCaXRzKGIuZ2V0RmxvYXQoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMHhBOEE5QUFBQiwgRmxvYXQuZmxvYXRUb0ludEJpdHMoYi5nZXRGbG9hdCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygweEEwQTFBMkEzLCBGbG9hdC5mbG9hdFRvUmF3SW50Qml0cyhiLmdldEZsb2F0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QTRBNUE2QTcsIEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKGIuZ2V0RmxvYXQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHhBOEE5QUFBQiwgRmxvYXQuZmxvYXRUb1Jhd0ludEJpdHMoYi5nZXRGbG9hdCgpKSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBiLmdldEZsb2F0KCk7CiAgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIpOwpAQCAtMjk2LDggKzMwNiw4IEBACiAKICAgICAgICAgLy8gQ2hlY2sgJ2dldERvdWJsZShpbnQgcG9zaXRpb24pJwogICAgICAgICBiLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QTdBNkE1QTRBM0EyQTFBMEwsIERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGIuZ2V0RG91YmxlKDApKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygweEE4QTdBNkE1QTRBM0EyQTFMLCBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhiLmdldERvdWJsZSgxKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHhBN0E2QTVBNEEzQTJBMUEwTCwgRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHMoYi5nZXREb3VibGUoMCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QThBN0E2QTVBNEEzQTJBMUwsIERvdWJsZS5kb3VibGVUb1Jhd0xvbmdCaXRzKGIuZ2V0RG91YmxlKDEpKSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBiLmdldERvdWJsZSgtMSk7CiAgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIpOwpAQCAtMzEyLDggKzMyMiw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBiLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QTBBMUEyQTNBNEE1QTZBN0wsIERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGIuZ2V0RG91YmxlKDApKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygweEExQTJBM0E0QTVBNkE3QThMLCBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhiLmdldERvdWJsZSgxKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHhBMEExQTJBM0E0QTVBNkE3TCwgRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHMoYi5nZXREb3VibGUoMCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QTFBMkEzQTRBNUE2QTdBOEwsIERvdWJsZS5kb3VibGVUb1Jhd0xvbmdCaXRzKGIuZ2V0RG91YmxlKDEpKSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBiLmdldERvdWJsZSgtMSk7CiAgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIpOwpAQCAtMzMzLDYgKzM0Myw5IEBACiAgICAgICAgIGIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOwogICAgICAgICBiYiA9IGIuc2xpY2UoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGJiLmNhcGFjaXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZU9yZGVyLkJJR19FTkRJQU4sIGJiLm9yZGVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHhBMUEyQTNBNCwgYmIuZ2V0SW50KDApKTsKKyAgICAgICAgYmIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOwogICAgICAgICBhc3NlcnRFcXVhbHMoMHhBNEEzQTJBMSwgYmIuZ2V0SW50KDApKTsKIAogICAgICAgICBiYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CkBAIC0zNzAsMTQgKzM4MywxNCBAQAogCiAgICAgICAgIGNoZWNrQnVmZmVyKGZiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGZiLmNhcGFjaXR5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMHhBNEEzQTJBMSwgRmxvYXQuZmxvYXRUb0ludEJpdHMoZmIuZ2V0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QTRBM0EyQTEsIEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKGZiLmdldCgpKSk7CiAKICAgICAgICAgYmIub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwogICAgICAgICBmYiA9IGJiLmFzRmxvYXRCdWZmZXIoKTsKIAogICAgICAgICBjaGVja0J1ZmZlcihmYik7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBmYi5jYXBhY2l0eSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDB4QTFBMkEzQTQsIEZsb2F0LmZsb2F0VG9JbnRCaXRzKGZiLmdldCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygweEExQTJBM0E0LCBGbG9hdC5mbG9hdFRvUmF3SW50Qml0cyhmYi5nZXQoKSkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzaG9ydEJ1ZmZlclRlc3QoU2hvcnRCdWZmZXIgc2IpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAzYjdlMjYuLmMxNTEyNTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTgsMTUgKzE4LDE4IEBACiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bmFtZT0iSFRNTEhvc3RBcHAiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTWVudSIgYW5kcm9pZDpsYWJlbD0iRHVtcCBSZW5kZXIgVHJlZSIKLSAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCI+CisgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlRFU1QiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RTaGVsbEFjdGl2aXR5IiBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRvcCIKLSAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSZWxpYWJpbGl0eVRlc3RBY3Rpdml0eSIgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiLz4KKyAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCIvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSZWxpYWJpbGl0eVRlc3RBY3Rpdml0eSIgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9Ii5MYXlvdXRUZXN0c0F1dG9SdW5uZXIiCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CmluZGV4IGI2ZTdiZjMuLmNlYWM1ZDIgMTAwNzU1Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgIyBDb3VudCBjcmFzaGVkIHRlc3RzLgogICBjcmFzaGVkX3Rlc3RzID0gW10KIAotICB0aW1lb3V0X21zID0gJzMwMDAwJworICB0aW1lb3V0X21zID0gJzE1MDAwJwogICBpZiBvcHRpb25zLnRpbWVfb3V0X21zOgogICAgIHRpbWVvdXRfbXMgPSBvcHRpb25zLnRpbWVfb3V0X21zCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhCmluZGV4IDU3ODBjNDMuLjc0MGY1NDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YQpAQCAtNzQsNiArNzQsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfU0VUX0NBTl9PUEVOX1dJTkRPV1MgPSA0MjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04gPSA0MzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlJJREVfUFJFRkVSRU5DRSA9IDQ0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCA9IDQ1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRfWFNTX0FVRElUT1JfRU5BQkxFRCA9IDQ2OwogICAgIAogICAgIENhbGxiYWNrUHJveHkoRXZlbnRTZW5kZXIgZXZlbnRTZW5kZXIsIAogICAgICAgICAgICAgTGF5b3V0VGVzdENvbnRyb2xsZXIgbGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKQEAgLTE3NSw3ICsxNzcsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfVEVYVDoKLSAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dChtc2cuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIExBWU9VVF9EVU1QX0hJU1RPUlk6CkBAIC0yNzMsNiArMjc5LDEwIEBACiAgICAgICAgICAgICBib29sZWFuIHZhbHVlID0gbXNnLmdldERhdGEoKS5nZXRCb29sZWFuKCJ2YWx1ZSIpOwogICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLm92ZXJyaWRlUHJlZmVyZW5jZShrZXksIHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX1hTU19BVURJVE9SX0VOQUJMRUQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0WFNTQXVkaXRvckVuYWJsZWQobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzc3LDcgKzM4NywxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7Ci0gICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9URVhULCBlbmFibGVQaXhlbFRlc3RzID8gMSA6IDApLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpIHsKQEAgLTQ5MiwxMCArNTEwLDIyIEBACiAgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04sIGFsbG93ID8gMSA6IDAsIDApLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgdGhlIFRlc3RTaGVsbEFjdGl2aXR5CisgICAgICAgIC8vIGFzIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBXZWJ2aWV3LgorICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UoT1ZFUlJJREVfUFJFRkVSRU5DRSk7CiAgICAgICAgIG1lc3NhZ2UuZ2V0RGF0YSgpLnB1dFN0cmluZygia2V5Iiwga2V5KTsKICAgICAgICAgbWVzc2FnZS5nZXREYXRhKCkucHV0Qm9vbGVhbigidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX1hTU19BVURJVE9SX0VOQUJMRUQsIGZsYWcgPyAxIDogMCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEKaW5kZXggNzdmZDNlZC4uZGVhNTQ5YSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCkBAIC03Myw0MyArNzMsODYgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVUZXN0TGlzdCA9IHsKICAgICAgICAgImVkaXRpbmcvc2VsZWN0aW9uL21vdmUtbGVmdC1yaWdodC5odG1sIiwgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcKKyAgICAgICAgImZhc3QvanMvZXhjZXNzaXZlLWNvbW1hLXVzYWdlLmh0bWwiLCAvLyBUZXN0cyBodWdlIGluaXRpYWxpemVyIGxpc3QsIGNhdXNlcyBPT00uCiAgICAgICAgICJmYXN0L2pzL3JlZ2V4cC1jaGFyY2xhc3MtY3Jhc2guaHRtbCIsIC8vIFJlZ0V4cCBpcyB0b28gbGFyZ2UsIGNhdXNpbmcgT09NCiAgICAgICAgICJmYXN0L3JlZ2V4L3Rlc3QxLmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4Ci0gICAgICAgICJmYXN0L3JlZ2V4L3Nsb3cuaHRtbCIgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcgd2l0aCBWOAorICAgICAgICAiZmFzdC9yZWdleC9zbG93Lmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0xNC5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk1CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0yOS5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk2CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy04Lmh0bWwiLCAvLyBoYW5ncyB0aGUgbGF5b3V0IHRlc3RzCisgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI4ODk1OTgKKyAgICAgICAgImh0dHAvdGVzdHMveG1saHR0cHJlcXVlc3Qvc2ltcGxlLWNyb3NzLW9yaWdpbi1wcm9ncmVzcy1ldmVudHMuaHRtbCIsIC8vIHJ1bnMgd2ViY29yZSBpbnRvIGJhZCBzdGF0ZQorICAgICAgICAvLyBodHRwOi8vYi8yOTgyNTAwCisgICAgICAgICJjYW52YXMvcGhpbGlwL3Rlc3RzLzJkLmRyYXdJbWFnZS5icm9rZW4uaHRtbCIsIC8vIGJsb2NrcyB0ZXN0CisgICAgICAgIC8vIGh0dHA6Ly9iLzI5ODI1MDAKICAgICB9OwogCiAgICAgc3RhdGljIHZvaWQgZmlsbElnbm9yZVJlc3VsdExpc3QoKSB7Ci0gICAgICAgIC8vIFRoaXMgZmlyc3QgYmxvY2sgb2YgdGVzdHMgYXJlIGZvciBIVE1MNSBmZWF0dXJlcywgZm9yIHdoaWNoIEFuZHJvaWQKKyAgICAgICAgLy8gVGhpcyBmaXJzdCBibG9jayBvZiB0ZXN0cyBhcmUgZm9yIGZlYXR1cmVzIGZvciB3aGljaCBBbmRyb2lkCiAgICAgICAgIC8vIHNob3VsZCBwYXNzIGFsbCB0ZXN0cy4gVGhleSBhcmUgc2tpcHBlZCBvbmx5IHRlbXBvcmFyaWx5LgogICAgICAgICAvLyBUT0RPOiBGaXggdGhlc2UgZmFpbGluZyB0ZXN0cyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGlzIGxpc3QuCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL2NoYXItZW5jb2RpbmcuaHRtbCIpOyAvLyBmYWlscyBpbiBKYXZhIEhUVFAgc3RhY2ssIHNlZSBodHRwOi8vYi9pc3N1ZT9pZD0zMDQ3MTU2CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL2NoYXItZGVjb2RpbmcuaHRtbCIpOyAvLyBmYWlscyBpbiBKYXZhIEhUVFAgc3RhY2ssIHNlZSBodHRwOi8vYi9pc3N1ZT9pZD0zMDQ3MTU2CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL2hhbmFyZWktYmxvZzMyLWZjMi1jb20uaHRtbCIpOyAvLyBmYWlscyBpbiBKYXZhIEhUVFAgc3RhY2ssIHNlZSBodHRwOi8vYi9pc3N1ZT9pZD0zMDQ2OTg2CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL21haWx0by1hbHdheXMtdXRmLTguaHRtbCIpOyAvLyBSZXF1aXJlcyB3YWl0Rm9yUG9saWN5RGVsZWdhdGUoKSwgc2VlIGh0dHA6Ly9iL2lzc3VlP2lkPTMwNDM0NjgKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZW5jb2RpbmcvcGVyY2VudC1lc2NhcGluZy5odG1sIik7IC8vIGZhaWxzIGluIEphdmEgSFRUUCBzdGFjaywgc2VlIGh0dHA6Ly9iL2lzc3VlP2lkPTMwNDY5ODQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZW1wdHktbWFuaWZlc3QuaHRtbCIpOyAvLyBmbGFreQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9mYWxsYmFjay5odG1sIik7IC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI3MTMwMDQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZm9yZWlnbi1pZnJhbWUtbWFpbi5odG1sIik7IC8vIGZsYWt5IC0gc2tpcHMgc3RhdGVzCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL21hbmlmZXN0LXdpdGgtZW1wdHktZmlsZS5odG1sIik7IC8vIGZsYWt5CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL29yaWdpbi1xdW90YS5odG1sIik7IC8vIG5lZWRzIGNsZWFyQWxsQXBwbGljYXRpb25DYWNoZXMoKSwgc2VlIGh0dHA6Ly9iL2lzc3VlP2lkPTI5NDQxOTYKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbCIpOyAvLyBTdWNjZWVkcyBidXQgRHVtcFJlbmRlclRyZWUgZG9lcyBub3QgcmVhZCByZXN1bHQgY29ycmVjdGx5CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2hhc2gtY2hhbmdlLXdpdGgteGhyLmh0bWwiKTsgLy8gU3VjY2VlZHMgYnV0IER1bXBSZW5kZXJUcmVlIGRvZXMgbm90IHJlYWQgcmVzdWx0IGNvcnJlY3RseQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9vcGVuLWRhdGFiYXNlLWNyZWF0aW9uLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9zdGF0ZW1lbnQtZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3N0YXRlbWVudC1zdWNjZXNzLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS90cmFuc2FjdGlvbi1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvdHJhbnNhY3Rpb24tZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3RyYW5zYWN0aW9uLXN1Y2Nlc3MtY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCiAKLSAgICAgICAgLy8gV2lsbCBhbHdheXMgZmFpbAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3N2Zy9sZXZlbDMveHBhdGgiKTsgLy8gWFBhdGggbm90IHN1cHBvcnRlZAorICAgICAgICAvLyBFeHBlY3RlZCBmYWlsdXJlcyBkdWUgdG8gdW5zdXBwb3J0ZWQgZmVhdHVyZXMgb3IgdGVzdHMgdW5zdWl0YWJsZSBmb3IgQW5kcm9pZC4KKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZW5jb2RpbmcvY2hhci1kZWNvZGluZy1tYWMuaHRtbCIpOyAvLyBNYWMtc3BlY2lmaWMgZW5jb2RpbmdzIChhbHNvIG1hcmtlZCBXb24ndCBGaXggaW4gQ2hyb21pdW0sIGJ1ZyA3Mzg4KQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9lbmNvZGluZy9jaGFyLWVuY29kaW5nLW1hYy5odG1sIik7IC8vIE1hYy1zcGVjaWZpYyBlbmNvZGluZ3MgKGFsc28gbWFya2VkIFdvbid0IEZpeCBpbiBDaHJvbWl1bSwgYnVnIDczODgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL2lkbi1zZWN1cml0eS5odG1sIik7IC8vIE1hYy1zcGVjaWZpYyBJRE4gY2hlY2tzIChhbHNvIG1hcmtlZCBXb24ndCBGaXggaW4gQ2hyb21pdW0sIGJ1ZyAyMTgxNCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL2Jhc2ljLW11bHRpLXRvdWNoLWV2ZW50cy5odG1sIik7IC8vIFJlcXVpcmVzIG11bHRpLXRvdWNoIGdlc3R1cmVzIG5vdCBzdXBwb3J0ZWQgYnkgQW5kcm9pZCBzeXN0ZW0KKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL3RvdWNoLWNvb3Jkcy1pbi16b29tLWFuZC1zY3JvbGwuaHRtbCIpOyAvLyBSZXF1aXJlcyBldmVudFNlbmRlci56b29tUGFnZUluKCksem9vbVBhZ2VPdXQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvdG91Y2gtdGFyZ2V0Lmh0bWwiKTsgLy8gUmVxdWlyZXMgbXVsdGktdG91Y2ggZ2VzdHVyZXMgbm90IHN1cHBvcnRlZCBieSBBbmRyb2lkIHN5c3RlbQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC94cGF0aCIpOyAvLyBYUGF0aCBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2V2ZW50c291cmNlL3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL3htbGh0dHByZXF1ZXN0L3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2RvbXN0b3JhZ2UvbG9jYWxzdG9yYWdlL3ByaXZhdGUtYnJvd3NpbmctYWZmZWN0cy1zdG9yYWdlLmh0bWwiKTsgLy8gcHJpdmF0ZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2RvbXN0b3JhZ2Uvc2Vzc2lvbnN0b3JhZ2UvcHJpdmF0ZS1icm93c2luZy1hZmZlY3RzLXN0b3JhZ2UuaHRtbCIpOyAvLyBwcml2YXRlIGJyb3dzaW5nIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvaW5kZXhlZGRiIik7IC8vIGluZGV4ZWRkYiBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3ByaXZhdGUtYnJvd3NpbmctcmVhZG9ubHkuaHRtbCIpOyAvLyBwcml2YXRlIGJyb3dzaW5nIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoIndlYnNvY2tldC90ZXN0cy93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogCisgICAgICAgIC8vIEV4cGVjdGVkIGZhaWx1cmVzIGR1ZSB0byBtaXNzaW5nIGV4cGVjdGVkIHJlc3VsdHMKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9jYW5vbmljYWxmb3JtMDgueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9jYW5vbmljYWxmb3JtMDkueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9kb2N1bWVudGdldGlucHV0ZW5jb2RpbmcwMy54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2VudGl0eWdldGlucHV0ZW5jb2RpbmcwMi54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2VudGl0eWdldHhtbHZlcnNpb24wMi54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMDUueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTA3LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkwOS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTAueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTExLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxNS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTcueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTE4LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWxvb2t1cG5hbWVzcGFjZXVyaTAxLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWxvb2t1cHByZWZpeDE5LnhodG1sIik7CisKICAgICAgICAgLy8gVE9ETzogVGhlc2UgbmVlZCB0byBiZSB0cmlhZ2VkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2Nzcy9jYXNlLXRyYW5zZm9ybS5odG1sIik7IC8vIHdpbGwgbm90IGZpeCAjNjE5NzA3CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9FbGVtZW50L29mZnNldExlZnQtb2Zmc2V0VG9wLWJvZHktcXVpcmsuaHRtbCIpOyAvLyBkaWZmZXJlbnQgc2NyZWVuIHNpemUgcmVzdWx0IGluIGV4dHJhIHNwYWNlcyBpbiBBcHBsZSBjb21wYXJlZCB0byB1cwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L1BsdWctaW5zLmh0bWwiKTsgLy8gbmVlZCB0ZXN0IHBsdWdpbgotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L3dpbmRvdy1wcm9wZXJ0aWVzLmh0bWwiKTsgLy8geHNsdCBhbmQgeHBhdGggZWxlbWVudHMgbWlzc2luZyBmcm9tIHByb3BlcnR5IGxpc3QKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy93aW5kb3ctc2NyZWVuLXByb3BlcnRpZXMuaHRtbCIpOyAvLyBwaXhlbCBkZXB0aAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L3dpbmRvdy14eS1wcm9wZXJ0aWVzLmh0bWwiKTsgLy8gcmVxdWlyZXMgZXZlbnRTZW5kZXIubW91c2VEb3duKCksbW91c2VVcCgpCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9hdHRyaWJ1dGUtbmFtZXNwYWNlcy1nZXQtc2V0Lmh0bWwiKTsgLy8gaHR0cDovL2IvNzMzMjI5Ci0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9nYy05Lmh0bWwiKTsgLy8gcmVxdWlyZXMgeHBhdGggc3VwcG9ydAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vZ2xvYmFsLWNvbnN0cnVjdG9ycy5odG1sIik7IC8vIHJlcXVpcmVzIHhzbHQgYW5kIHhwYXRoIHN1cHBvcnQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL29iamVjdC1lbWJlZC1wbHVnaW4tc2NyaXB0aW5nLmh0bWwiKTsgLy8gZHluYW1pYyBwbHVnaW5zIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL3RhYmluZGV4LWNsYW1wLmh0bWwiKTsgLy8gdGhlcmUgaXMgZXh0cmEgc3BhY2luZyBpbiB0aGUgZmlsZSBkdWUgdG8gbXVsdGlwbGUgaW5wdXQgYm94ZXMgZml0dGluZyBvbiBvbmUgbGluZSBvbiBBcHBsZSwgb3VycyBhcmUgd3JhcHBlZC4gU3BhY2UgYXQgbGluZSBlbmRzIGFyZSBzdHJpcHBlZC4KICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL2FuY2hvci1pbWFnZS1zY3JvbGxlZC14LXkuaHRtbCIpOyAvLyByZXF1aXJlcyBldmVudFNlbmRlci5tb3VzZURvd24oKSxtb3VzZVVwKCkKQEAgLTE3Miw4ICsyMTUsNiBAQAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9yZXBsYWNlZC9pbWFnZS1tYXAuaHRtbCIpOyAvLyByZXF1aXJlcyBldmVudFNlbmRlci5tb3VzZURvd24oKSxtb3VzZVVwKCkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvdGV4dC9wbGFpbi10ZXh0LWxpbmUtYnJlYWtzLmh0bWwiKTsgLy8gZXh0cmEgc3BhY2luZyBiZWNhdXNlIGlGcmFtZXMgcmVuZGVyZWQgbmV4dCB0byBlYWNoIG90aGVyIG9uIEFwcGxlCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJwcm9maWxlciIpOyAvLyBwcm9maWxlciBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdmciKTsgLy8gc3ZnIGlzIG5vdCBzdXBwb3J0ZWQKLQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKaW5kZXggNmNmY2U0MS4uNWQzNGUyNSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCkBAIC00OSw4ICs0OSwxMyBAQAogICAgICAgICAvL25vIGNyZWF0aW9uIG9mIGluc3RhbmNlcwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MsCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHdyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MsCiAgICAgICAgICAgICBTdHJpbmcgZGlyLCBib29sZWFuIGlnbm9yZVJlc3VsdHNJbkRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgdGVzdENvdW50ID0gMDsKICAgICAgICAgTG9nLnYoTE9HVEFHLCAiU2VhcmNoaW5nIHRlc3RzIHVuZGVyICIgKyBkaXIpOwogCiAgICAgICAgIEZpbGUgZCA9IG5ldyBGaWxlKGRpcik7CkBAIC02OCw3ICs3Myw3IEBACiAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSB0ZXN0IGRpcmVjdG9yeSwgd2UgZG9uJ3QgcmVjdXJzZSBpbnRvIGl0LgogICAgICAgICAgICAgICAgIGlmICghRmlsZUZpbHRlci5pc05vblRlc3REaXIocykpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVjdXJzaW5nIG9uICIgKyBzKTsKLSAgICAgICAgICAgICAgICAgICAgZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoYm9zLCBzLCBpZ25vcmVSZXN1bHRzSW5EaXIpOworICAgICAgICAgICAgICAgICAgICB0ZXN0Q291bnQgKz0gd3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KGJvcywgcywgaWdub3JlUmVzdWx0c0luRGlyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC03OSw3ICs4NCw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICgocy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpKQorICAgICAgICAgICAgaWYgKChzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5odG1sIikKKyAgICAgICAgICAgICAgICAgICAgfHwgcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueG1sIikKKyAgICAgICAgICAgICAgICAgICAgfHwgcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueGh0bWwiKSkKICAgICAgICAgICAgICAgICAgICAgJiYgIXMuZW5kc1dpdGgoIlRFTVBMQVRFLmh0bWwiKSkgewogICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlJlY29yZGluZyAiICsgcyk7CiAgICAgICAgICAgICAgICAgYm9zLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CkBAIC04OCw4ICs5NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBib3Mud3JpdGUoKCIgSUdOT1JFX1JFU1VMVCIpLmdldEJ5dGVzKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBib3Mud3JpdGUoJ1xuJyk7CisgICAgICAgICAgICAgICAgdGVzdENvdW50Kys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlc3RDb3VudDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlVGVzdFN0YXR1cyhTdHJpbmcgc3RhdHVzRmlsZSwgU3RyaW5nIHMpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEKaW5kZXggOTIzNjM0NS4uOWJlMmYxYyAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEKQEAgLTE4LDI5ICsxOCwzMCBAQAogCiBwdWJsaWMgaW50ZXJmYWNlIExheW91dFRlc3RDb250cm9sbGVyIHsKIAotCXB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKTsKLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCk7Ci0JcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpOwotCQotCS8vIEZvcmNlIGEgcmVkcmF3IG9mIHRoZSBwYWdlCi0JcHVibGljIHZvaWQgZGlzcGxheSgpOwotCS8vIFVzZWQgd2l0aCBwaXhlbCBkdW1wcyBvZiBjb250ZW50Ci0JcHVibGljIHZvaWQgdGVzdFJlcGFpbnQoKTsKLQkKLQkvLyBJZiB0aGUgcGFnZSB0aXRsZSBjaGFuZ2VzLCBhZGQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBvdXRwdXQuCi0JcHVibGljIHZvaWQgZHVtcFRpdGxlQ2hhbmdlcygpOwotCXB1YmxpYyB2b2lkIGR1bXBCYWNrRm9yd2FyZExpc3QoKTsKLQlwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucygpOwotCXB1YmxpYyB2b2lkIGR1bXBFZGl0aW5nQ2FsbGJhY2tzKCk7Ci0JCi0JLy8gU2hvdy9IaWRlIHdpbmRvdyBmb3Igd2luZG93Lm9uQmx1cigpIHRlc3RpbmcKLQlwdWJsaWMgdm9pZCBzZXRXaW5kb3dJc0tleShib29sZWFuIGIpOwotCS8vIE1hYyBmdW5jdGlvbiwgdXNlZCB0byBkaXNhYmxlIGV2ZW50cyBnb2luZyB0byB0aGUgd2luZG93Ci0JcHVibGljIHZvaWQgc2V0TWFpbkZyYW1lSXNGaXJzdFJlc3BvbmRlcihib29sZWFuIGIpOwotCQotCXB1YmxpYyB2b2lkIGR1bXBTZWxlY3Rpb25SZWN0KCk7Ci0JCi0JLy8gaW52YWxpZGF0ZSBhbmQgZHJhdyBvbmUgbGluZSBhdCBhIHRpbWUgb2YgdGhlIHdlYiB2aWV3LgorICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3RzKTsKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKTsKKyAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCk7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpOworCisgICAgLy8gRm9yY2UgYSByZWRyYXcgb2YgdGhlIHBhZ2UKKyAgICBwdWJsaWMgdm9pZCBkaXNwbGF5KCk7CisgICAgLy8gVXNlZCB3aXRoIHBpeGVsIGR1bXBzIG9mIGNvbnRlbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwYWludCgpOworCisgICAgLy8gSWYgdGhlIHBhZ2UgdGl0bGUgY2hhbmdlcywgYWRkIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgb3V0cHV0LgorICAgIHB1YmxpYyB2b2lkIGR1bXBUaXRsZUNoYW5nZXMoKTsKKyAgICBwdWJsaWMgdm9pZCBkdW1wQmFja0ZvcndhcmRMaXN0KCk7CisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMoKTsKKyAgICBwdWJsaWMgdm9pZCBkdW1wRWRpdGluZ0NhbGxiYWNrcygpOworCisgICAgLy8gU2hvdy9IaWRlIHdpbmRvdyBmb3Igd2luZG93Lm9uQmx1cigpIHRlc3RpbmcKKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dJc0tleShib29sZWFuIGIpOworICAgIC8vIE1hYyBmdW5jdGlvbiwgdXNlZCB0byBkaXNhYmxlIGV2ZW50cyBnb2luZyB0byB0aGUgd2luZG93CisgICAgcHVibGljIHZvaWQgc2V0TWFpbkZyYW1lSXNGaXJzdFJlc3BvbmRlcihib29sZWFuIGIpOworCisgICAgcHVibGljIHZvaWQgZHVtcFNlbGVjdGlvblJlY3QoKTsKKworICAgIC8vIGludmFsaWRhdGUgYW5kIGRyYXcgb25lIGxpbmUgYXQgYSB0aW1lIG9mIHRoZSB3ZWIgdmlldy4KICAgICBwdWJsaWMgdm9pZCByZXBhaW50U3dlZXBIb3Jpem9udGFsbHkoKTsKICAgICAKICAgICAvLyBIaXN0b3J5IHRlc3RpbmcgZnVuY3Rpb25zCkBAIC02Nyw0ICs2OCwxMSBAQAogICAgIHB1YmxpYyB2b2lkIHNldEdlb2xvY2F0aW9uUGVybWlzc2lvbihib29sZWFuIGFsbG93KTsKIAogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKKworICAgIC8vIEZvciBYU1NBdWRpdG9yIHRlc3RzCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKTsKKworICAgIC8vIEZvciBEZXZpY2VPcmllbnRhdGlvbiB0ZXN0cworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKaW5kZXggOWNjZjU0OS4uMTMyZjE3YSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCkBAIC0yMCw5ICsyMCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuZm9yd2FyZGVyLkFkYlV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLmZvcndhcmRlci5Gb3J3YXJkU2VydmljZTsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0xNTgsMTggKzE1NiwxMSBAQAogICAgIHByaXZhdGUgU3RyaW5nIG1Kc0VuZ2luZTsKICAgICBwcml2YXRlIFN0cmluZyBtVGVzdFBhdGhQcmVmaXg7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZDsKKyAgICBwcml2YXRlIGludCBtVGVzdENvdW50OworICAgIHByaXZhdGUgaW50IG1SZXN1bWVJbmRleDsKIAogICAgIHB1YmxpYyBMYXlvdXRUZXN0c0F1dG9UZXN0KCkgewotICAgICAgc3VwZXIoImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlIiwgVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwotICAgIH0KLQotICAgIC8vIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSByZXN1bHQgb2YgdGhlIGxheW91dCB0ZXN0IHRvCi0gICAgLy8gQW0gc3RhdHVzIHNvIHRoYXQgaXQgY2FuIGJlIHBpY2tlZCB1cCBmcm9tIGEgc2NyaXB0LgotICAgIHByaXZhdGUgdm9pZCBwYXNzT3JGYWlsQ2FsbGJhY2soU3RyaW5nIGZpbGUsIGJvb2xlYW4gcmVzdWx0KSB7Ci0gICAgICBJbnN0cnVtZW50YXRpb24gaW5zdCA9IGdldEluc3RydW1lbnRhdGlvbigpOwotICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKGZpbGUsIHJlc3VsdCk7Ci0gICAgICBpbnN0LnNlbmRTdGF0dXMoMCwgYnVuZGxlKTsKKyAgICAgIHN1cGVyKFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZ2V0VGVzdExpc3QoKSB7CkBAIC0xOTAsNiArMTgxLDcgQEAKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkVycm9yIHdoaWxlIHJlYWRpbmcgdGVzdCBsaXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQorICAgICAgICBtVGVzdENvdW50ID0gbVRlc3RMaXN0LnNpemUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVzdW1lVGVzdExpc3QoKSB7CkBAIC0yMDAsNiArMTkyLDcgQEAKICAgICAgICAgICAgICAgICBpZiAobVRlc3RMaXN0LmVsZW1lbnRBdChpKS5lcXVhbHMobGluZSkpIHsKICAgICAgICAgICAgICAgICAgICAgbVRlc3RMaXN0ID0gbmV3IFZlY3RvcjxTdHJpbmc+KG1UZXN0TGlzdC5zdWJMaXN0KGkrMSwgbVRlc3RMaXN0LnNpemUoKSkpOwogICAgICAgICAgICAgICAgICAgICBtVGVzdExpc3RJZ25vcmVSZXN1bHQgPSBuZXcgVmVjdG9yPEJvb2xlYW4+KG1UZXN0TGlzdElnbm9yZVJlc3VsdC5zdWJMaXN0KGkrMSwgbVRlc3RMaXN0SWdub3JlUmVzdWx0LnNpemUoKSkpOworICAgICAgICAgICAgICAgICAgICBtUmVzdW1lSW5kZXggPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjMyLDE0ICsyMjUsMjIgQEAKICAgICAgICAgLy8gVGhlIGdlbmVyaWMgcmVzdWx0IGlzIGF0IDxwYXRoPi88bmFtZT4tZXhwZWN0ZWQudHh0CiAgICAgICAgIC8vIEZpcnN0IHRyeSB0aGUgQW5kcm9pZC1zcGVjaWZpYyByZXN1bHQgYXQKICAgICAgICAgLy8gcGxhdGZvcm0vYW5kcm9pZC08anMtZW5naW5lPi88cGF0aD4vPG5hbWU+LWV4cGVjdGVkLnR4dAorICAgICAgICAvLyB0aGVuCisgICAgICAgIC8vIHBsYXRmb3JtL2FuZHJvaWQvPHBhdGg+LzxuYW1lPi1leHBlY3RlZC50eHQKICAgICAgICAgaW50IHBvcyA9IHRlc3QubGFzdEluZGV4T2YoJy4nKTsKICAgICAgICAgaWYgKHBvcyA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICBTdHJpbmcgZ2VuZXJpY0V4cGVjdGVkUmVzdWx0ID0gdGVzdC5zdWJzdHJpbmcoMCwgcG9zKSArICItZXhwZWN0ZWQudHh0IjsKICAgICAgICAgU3RyaW5nIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIgPSAicGxhdGZvcm0vYW5kcm9pZC0iICsgbUpzRW5naW5lICsgIi8iOwotICAgICAgICBTdHJpbmcgYW5kcm9pZEV4cGVjdGVkUmVzdWx0ID0KLSAgICAgICAgICAgIGdlbmVyaWNFeHBlY3RlZFJlc3VsdC5yZXBsYWNlRmlyc3QoTEFZT1VUX1RFU1RTX1JPT1QsIExBWU9VVF9URVNUU19ST09UICsgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0Rpcik7CisgICAgICAgIFN0cmluZyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgPSBnZW5lcmljRXhwZWN0ZWRSZXN1bHQucmVwbGFjZUZpcnN0KExBWU9VVF9URVNUU19ST09ULAorICAgICAgICAgICAgICAgIExBWU9VVF9URVNUU19ST09UICsgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0Rpcik7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGFuZHJvaWRFeHBlY3RlZFJlc3VsdCk7CisgICAgICAgIGlmIChmLmV4aXN0cygpKQorICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWRFeHBlY3RlZFJlc3VsdDsKKyAgICAgICAgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0RpciA9ICJwbGF0Zm9ybS9hbmRyb2lkLyI7CisgICAgICAgIGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA9IGdlbmVyaWNFeHBlY3RlZFJlc3VsdC5yZXBsYWNlRmlyc3QoTEFZT1VUX1RFU1RTX1JPT1QsCisgICAgICAgICAgICAgICAgTEFZT1VUX1RFU1RTX1JPT1QgKyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyKTsKKyAgICAgICAgZiA9IG5ldyBGaWxlKGFuZHJvaWRFeHBlY3RlZFJlc3VsdCk7CiAgICAgICAgIHJldHVybiBmLmV4aXN0cygpID8gYW5kcm9pZEV4cGVjdGVkUmVzdWx0IDogZ2VuZXJpY0V4cGVjdGVkUmVzdWx0OwogICAgIH0KIApAQCAtMzAwLDcgKzMwMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoVGVzdFNoZWxsQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyB0ZXN0LCBpbnQgdGltZW91dCwgYm9vbGVhbiBpZ25vcmVSZXN1bHQpIHsKKyAgICBwcml2YXRlIHZvaWQgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoVGVzdFNoZWxsQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyB0ZXN0LCBpbnQgdGltZW91dCwgYm9vbGVhbiBpZ25vcmVSZXN1bHQsIGludCB0ZXN0TnVtYmVyKSB7CiAgICAgICAgIGFjdGl2aXR5LnNldENhbGxiYWNrKG5ldyBUZXN0U2hlbGxDYWxsYmFjaygpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaGVkKCkgewogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoTGF5b3V0VGVzdHNBdXRvVGVzdC50aGlzKSB7CkBAIC0zMzYsNiArMzM3LDkgQEAKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRFU1RfVVJMLCBGc1V0aWxzLmdldFRlc3RVcmwodGVzdCkpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuUkVTVUxUX0ZJTEUsIHJlc3VsdEZpbGUpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVElNRU9VVF9JTl9NSUxMSVMsIHRpbWVvdXQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVE9UQUxfVEVTVF9DT1VOVCwgbVRlc3RDb3VudCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCB0ZXN0TnVtYmVyKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlNUT1BfT05fUkVGX0VSUk9SLCB0cnVlKTsKICAgICAgICAgYWN0aXZpdHkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogCiAgICAgICAgIC8vIFdhaXQgdW50aWwgZG9uZS4KQEAgLTM3NSw4ICszNzksOCBAQAogICAgICAgICAvLyBSZWFkIHNldHRpbmdzCiAgICAgICAgIG1UZXN0UGF0aFByZWZpeCA9IChuZXcgRmlsZShMQVlPVVRfVEVTVFNfUk9PVCArIHJ1bm5lci5tVGVzdFBhdGgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgbVJlYmFzZWxpbmVSZXN1bHRzID0gcnVubmVyLm1SZWJhc2VsaW5lOwotICAgICAgICAvLyBKU0MgaXMgdGhlIGRlZmF1bHQgSmF2YVNjcmlwdCBlbmdpbmUuCi0gICAgICAgIG1Kc0VuZ2luZSA9IHJ1bm5lci5tSnNFbmdpbmUgPT0gbnVsbCA/ICJqc2MiIDogcnVubmVyLm1Kc0VuZ2luZTsKKyAgICAgICAgLy8gVjggaXMgdGhlIGRlZmF1bHQgSmF2YVNjcmlwdCBlbmdpbmUuCisgICAgICAgIG1Kc0VuZ2luZSA9IHJ1bm5lci5tSnNFbmdpbmUgPT0gbnVsbCA/ICJ2OCIgOiBydW5uZXIubUpzRW5naW5lOwogCiAgICAgICAgIGludCB0aW1lb3V0ID0gcnVubmVyLm1UaW1lb3V0SW5NaWxsaXM7CiAgICAgICAgIGlmICh0aW1lb3V0IDw9IDApIHsKQEAgLTM5Myw3ICszOTcsNyBAQAogICAgICAgICAgICAgcmVzdW1lVGVzdExpc3QoKTsKIAogICAgICAgICBUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7Ci0gICAgICAgIGFjdGl2aXR5LnNldERlZmF1bHREdW1wRGF0YVR5cGUoRHVtcERhdGFUeXBlLkRVTVBfQVNfVEVYVCk7CisgICAgICAgIGFjdGl2aXR5LnNldERlZmF1bHREdW1wRGF0YVR5cGUoRHVtcERhdGFUeXBlLkVYVF9SRVBSKTsKIAogICAgICAgICAvLyBSdW4gdGVzdHMuCiAgICAgICAgIGludCBhZGRyID0gLTE7CkBAIC00MTAsNyArNDE0LDkgQEAKICAgICAgICAgICAgIGJvb2xlYW4gaWdub3JlUmVzdWx0ID0gbVRlc3RMaXN0SWdub3JlUmVzdWx0LmVsZW1lbnRBdChpKTsKICAgICAgICAgICAgIEZzVXRpbHMudXBkYXRlVGVzdFN0YXR1cyhURVNUX1NUQVRVU19GSUxFLCBzKTsKICAgICAgICAgICAgIC8vIFJ1biB0ZXN0cwotICAgICAgICAgICAgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoYWN0aXZpdHksIHMsIHJ1bm5lci5tVGltZW91dEluTWlsbGlzLCBpZ25vcmVSZXN1bHQpOworICAgICAgICAgICAgLy8gaSBpcyAwIGJhc2VkLCBidXQgdGVzdCBjb3VudCBpcyAxIGJhc2VkIHNvIGFkZCAxIHRvIGkgaGVyZS4KKyAgICAgICAgICAgIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKGFjdGl2aXR5LCBzLCBydW5uZXIubVRpbWVvdXRJbk1pbGxpcywgaWdub3JlUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICBpICsgMSArIG1SZXN1bWVJbmRleCk7CiAgICAgICAgIH0KIAogICAgICAgICBGc1V0aWxzLnVwZGF0ZVRlc3RTdGF0dXMoVEVTVF9TVEFUVVNfRklMRSwgIiNET05FIik7CkBAIC00MzUsNyArNDQxLDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgdGVzdHNfbGlzdCA9IG5ldyBGaWxlKExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOwogICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlc3RzX2xpc3QsIGZhbHNlKSk7Ci0gICAgICAgICAgICBGc1V0aWxzLmZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KGJvcywgZ2V0VGVzdFBhdGgoKSwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cworICAgICAgICAgICAgRnNVdGlscy53cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoYm9zLCBnZXRUZXN0UGF0aCgpLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCiAgICAgICAgICAgICBib3MuZmx1c2goKTsKICAgICAgICAgICAgIGJvcy5jbG9zZSgpOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQppbmRleCA5YzRiNTcyNTYuLjBiMDBkNjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQpAQCAtNTMsMjkgKzUzLDM4IEBACiAgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRFU1RfVVJMLCAiZmlsZTovLyIgKyBmaWxlbmFtZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5UT1RBTF9URVNUX0NPVU5ULCAxKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsIDEpOwogICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgdm9pZCBwcm9jZXNzRGlyZWN0b3J5KFN0cmluZyBwYXRoLCBib29sZWFuIHNlbGVjdGlvbikgewotICAgICAgICBnZW5lcmF0ZVRlc3RMaXN0KHBhdGgpOworICAgICAgICBpbnQgdGVzdENvdW50ID0gZ2VuZXJhdGVUZXN0TGlzdChwYXRoKTsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKICAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVUlfQVVUT19URVNULCBMQVlPVVRfVEVTVFNfTElTVF9GSUxFKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIHRlc3RDb3VudCk7CisgICAgICAgIC8vIFRlc3RTaGVsbEFjdGl2aXR5IHdpbGwgcHJvY2VzcyB0aGlzIGludGVudCBvbmNlIGFuZCBpbmNyZW1lbnQgdGhlIHRlc3QgaW5kZXgKKyAgICAgICAgLy8gYmVmb3JlIHJ1bm5pbmcgdGhlIGZpcnN0IHRlc3QsIHNvIHBhc3MgMCBoZXJlIHRvIGFsbG93IGZvciB0aGF0LgorICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgMCk7CiAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUZXN0TGlzdChTdHJpbmcgcGF0aCkgeworICAgIHByaXZhdGUgaW50IGdlbmVyYXRlVGVzdExpc3QoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaW50IHRlc3RDb3VudCA9IDA7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWxlIHRlc3RzX2xpc3QgPSBuZXcgRmlsZShMQVlPVVRfVEVTVFNfTElTVF9GSUxFKTsKICAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZXN0c19saXN0LCBmYWxzZSkpOwotICAgICAgICAgICAgRnNVdGlscy5maW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShib3MsIHBhdGgsIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKKyAgICAgICAgICAgIHRlc3RDb3VudCA9IEZzVXRpbHMud3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KAorICAgICAgICAgICAgICAgICAgICBib3MsIHBhdGgsIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKICAgICAgICAgICAgIGJvcy5mbHVzaCgpOwogICAgICAgICAgICAgYm9zLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXJyb3Igd2hlbiBjcmVhdGluZyB0ZXN0IGxpc3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQorICAgICAgIHJldHVybiB0ZXN0Q291bnQ7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCmluZGV4IDc0NzU3MTkuLjE5ODE1ZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCkBAIC0zNSw2ICszNSw4IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQud2Via2l0Lkdlb2xvY2F0aW9uUGVybWlzc2lvbnM7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuSHR0cEF1dGhIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LkpzUHJvbXB0UmVzdWx0OwpAQCAtNTUsNiArNTcsNyBAQAogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtOTksNiArMTAyLDggQEAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAibWVzc2FnZSBzZW50IHRvIFdlYlZpZXcgdG8gZHVtcCB0ZXh0LiIpOwogICAgICAgICBzd2l0Y2ggKG1EdW1wRGF0YVR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRFVNUF9BU19URVhUOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFyZzEgPSBtRHVtcFRvcEZyYW1lQXNUZXh0ID8gMSA6IDA7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXJnMiA9IG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPyAxIDogMDsKICAgICAgICAgICAgICAgICBtV2ViVmlldy5kb2N1bWVudEFzVGV4dChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEVYVF9SRVBSOgpAQCAtMTE3LDYgKzEyMiw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CiAKICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRlbnRWaWV3ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKICAgICAgICAgY29udGVudFZpZXcuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKQEAgLTEzOSwxMiArMTQ1LDE5IEBACiAgICAgICAgIC8vIFdlYlZpZXc6OnNldEpzRmxhZ3MgaXMgbm9vcCBpbiBKU0MgYnVpbGQuCiAgICAgICAgIG1XZWJWaWV3LnNldEpzRmxhZ3MoIi0tZXhwb3NlX2djIik7CiAKKyAgICAgICAgLy8gQWx3YXlzIHNlbmQgbXVsdGl0b3VjaCBldmVudHMgdG8gV2Via2l0IHNpbmNlIHRoZSBsYXlvdXQgdGVzdAorICAgICAgICAvLyBpcyBvbmx5IGZvciB0aGUgV2Via2l0IG5vdCB0aGUgYnJvd3NlcidzIFVJLgorICAgICAgICBtV2ViVmlldy5zZXREZWZlck11bHRpVG91Y2godHJ1ZSk7CisKICAgICAgICAgbUhhbmRsZXIgPSBuZXcgQXN5bmNIYW5kbGVyKCk7CiAKICAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOwogICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIGV4ZWN1dGVJbnRlbnQoaW50ZW50KTsKICAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgaXMgYXN5bmNocm9ub3VzLCBidXQgaXQgZ2V0cyBwcm9jZXNzZWQgYnkgV2ViQ29yZSBiZWZvcmUgaXQgc3RhcnRzIGxvYWRpbmcgcGFnZXMuCisgICAgICAgIG1XZWJWaWV3LnVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTU5LDYgKzE3Miw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICBtVG90YWxUZXN0Q291bnQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoVE9UQUxfVEVTVF9DT1VOVCwgbVRvdGFsVGVzdENvdW50KTsKKyAgICAgICAgbUN1cnJlbnRUZXN0TnVtYmVyID0gaW50ZW50LmdldEludEV4dHJhKENVUlJFTlRfVEVTVF9OVU1CRVIsIG1DdXJyZW50VGVzdE51bWJlcik7CisKICAgICAgICAgbVRlc3RVcmwgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoVEVTVF9VUkwpOwogICAgICAgICBpZiAobVRlc3RVcmwgPT0gbnVsbCkgewogICAgICAgICAgICAgbVVpQXV0b1Rlc3RQYXRoID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFVJX0FVVE9fVEVTVCk7CkBAIC0xNzIsNiArMTg4LDExIEBACiAgICAgICAgIG1UaW1lb3V0SW5NaWxsaXMgPSBpbnRlbnQuZ2V0SW50RXh0cmEoVElNRU9VVF9JTl9NSUxMSVMsIDApOwogICAgICAgICBtR2V0RHJhd3RpbWUgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEdFVF9EUkFXX1RJTUUsIGZhbHNlKTsKICAgICAgICAgbVNhdmVJbWFnZVBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoU0FWRV9JTUFHRSk7CisgICAgICAgIG1TdG9wT25SZWZFcnJvciA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoU1RPUF9PTl9SRUZfRVJST1IsIGZhbHNlKTsKKyAgICAgICAgc2V0VGl0bGUoIlRlc3QgIiArIG1DdXJyZW50VGVzdE51bWJlciArICIgb2YgIiArIG1Ub3RhbFRlc3RDb3VudCk7CisgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KW1DdXJyZW50VGVzdE51bWJlciAvIG1Ub3RhbFRlc3RDb3VudDsKKyAgICAgICAgaW50IHByb2dyZXNzID0gKGludCkocmF0aW8gKiBXaW5kb3cuUFJPR1JFU1NfRU5EKTsKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0RmVhdHVyZUludChXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUywgcHJvZ3Jlc3MpOwogCiAgICAgICAgIExvZy52KExPR1RBRywgIiAgTG9hZGluZyAiICsgbVRlc3RVcmwpOwogICAgICAgICBtV2ViVmlldy5sb2FkVXJsKG1UZXN0VXJsKTsKQEAgLTIzNyw2ICsyNTgsNyBAQAogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5URVNUX1VSTCwgRnNVdGlscy5nZXRUZXN0VXJsKHVybCkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgKyttQ3VycmVudFRlc3ROdW1iZXIpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVElNRU9VVF9JTl9NSUxMSVMsIDEwMDAwKTsKICAgICAgICAgZXhlY3V0ZUludGVudChpbnRlbnQpOwogICAgIH0KQEAgLTMyOSwxNCArMzUxLDI5IEBACiAKICAgICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KICAgICAvLyBMYXlvdXRUZXN0Q29udHJvbGxlciBGdW5jdGlvbnMKLSAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KCkgeworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3RzKSB7CisgICAgICAgIC8vIEFkZGVkIGFmdGVyIHdlYmtpdCB1cGRhdGUgdG8gcjYzODU5LiBTZWUgdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC82MzczMC4KKyAgICAgICAgaWYgKGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgImR1bXBBc1RleHQoZW5hYmxlUGl4ZWxUZXN0cyA9PSB0cnVlKSBub3QgaW1wbGVtZW50ZWQgb24gQW5kcm9pZCEiKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1EdW1wRGF0YVR5cGUgPSBEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUOworICAgICAgICBtRHVtcFRvcEZyYW1lQXNUZXh0ID0gdHJ1ZTsKICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgImR1bXBBc1RleHQgY2FsbGVkOiAiK3VybCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSB7CisgICAgICAgIG1EdW1wRGF0YVR5cGUgPSBEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUOworICAgICAgICBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgImR1bXBDaGlsZEZyYW1lc0FzVGV4dCBjYWxsZWQ6ICIrdXJsKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKSB7CiAgICAgICAgIG1XYWl0VW50aWxEb25lID0gdHJ1ZTsKICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwpAQCAtMzQ4LDcgKzM4NSw5IEBACiAgICAgICAgIExvZy52KExPR1RBRywgIm5vdGlmeURvbmUgY2FsbGVkOiAiICsgdXJsKTsKICAgICAgICAgaWYgKG1XYWl0VW50aWxEb25lKSB7CiAgICAgICAgICAgICBtV2FpdFVudGlsRG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgbUNocm9tZUNsaWVudC5vblByb2dyZXNzQ2hhbmdlZChtV2ViVmlldywgMTAxKTsKKyAgICAgICAgICAgIGlmICghbVJlcXVlc3RlZFdlYktpdERhdGEgJiYgIW1UaW1lZE91dCAmJiAhZmluaXNoZWQoKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ1OSw4ICs0OTgsMjUgQEAKICAgICAgKiBTZXRzIHRoZSBHZW9sb2NhdGlvbiBwZXJtaXNzaW9uIHN0YXRlIHRvIGJlIHVzZWQgZm9yIGFsbCBmdXR1cmUgcmVxdWVzdHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpIHsKLSAgICAgICAgbUdlb2xvY2F0aW9uUGVybWlzc2lvblNldCA9IHRydWU7CisgICAgICAgIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCA9IHRydWU7CiAgICAgICAgIG1HZW9sb2NhdGlvblBlcm1pc3Npb24gPSBhbGxvdzsKKworICAgICAgICBpZiAobVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luID0gKFN0cmluZykgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MuZ2V0KGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBtR2VvbG9jYXRpb25QZXJtaXNzaW9uLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIG1XZWJWaWV3LnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewpAQCAtNDczLDYgKzUyOSwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQgKGJvb2xlYW4gZmxhZykgeworICAgICAgICBtV2ViVmlldy5nZXRTZXR0aW5ncygpLnNldFhTU0F1ZGl0b3JFbmFibGVkKGZsYWcpOworICAgIH0KKwogICAgIHByaXZhdGUgZmluYWwgV2ViVmlld0NsaWVudCBtVmlld0NsaWVudCA9IG5ldyBXZWJWaWV3Q2xpZW50KCl7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKQEAgLTQ5MCwxMSArNTUwLDMwIEBACiAgICAgICAgICAgICAgICAgICAgIGRyYXdQYWdlVG9GaWxlKG1TYXZlSW1hZ2VQYXRoICsgIi8iICsgbmFtZSArICIucG5nIiwgbVdlYlZpZXcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gQ2FsbGluZyBmaW5pc2hlZCgpIHdpbGwgY2hlY2sgaWYgd2UndmUgbWV0IGFsbCB0aGUgY29uZGl0aW9ucyBmb3IgY29tcGxldGluZwotICAgICAgICAgICAgLy8gdGhpcyB0ZXN0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSBpZiB3ZSBhcmUgcmVhZHkuCisgICAgICAgICAgICAvLyB0aGlzIHRlc3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25lIGlmIHdlIGFyZSByZWFkeS4gT3RoZXJ3aXNlIHdlIGFzayBXZWJDb3JlIHRvCisgICAgICAgICAgICAvLyBkdW1wIHRoZSBwYWdlLgogICAgICAgICAgICAgaWYgKGZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbVdhaXRVbnRpbERvbmUgJiYgIW1SZXF1ZXN0ZWRXZWJLaXREYXRhICYmICFtVGltZWRPdXQpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobVdhaXRVbnRpbERvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAicGFnZSBmaW5pc2hlZCBsb2FkaW5nIGJ1dCB3YWl0aW5nIGZvciBub3RpZnlEb25lIHRvIGJlIGNhbGxlZDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0ZWRXZWJLaXREYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInBhZ2UgZmluaXNoZWQgbG9hZGluZyBidXQgd2Via2l0IGRhdGEgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQ6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtVGltZWRPdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAicGFnZSBmaW5pc2hlZCBsb2FkaW5nIGJ1dCBhbHJlYWR5IHRpbWVkIG91dDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBzdXBlci5vblBhZ2VGaW5pc2hlZCh2aWV3LCB1cmwpOwogICAgICAgICB9CiAKQEAgLTUzNiw0NCArNjE1LDggQEAKIAogICAgIHByaXZhdGUgZmluYWwgV2ViQ2hyb21lQ2xpZW50IG1DaHJvbWVDbGllbnQgPSBuZXcgV2ViQ2hyb21lQ2xpZW50KCkgewogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoV2ViVmlldyB2aWV3LCBpbnQgbmV3UHJvZ3Jlc3MpIHsKLQotICAgICAgICAgICAgLy8gbm90aWZ5RG9uZSBjYWxscyB0aGlzIHdpdGggMTAxJS4gV2Ugb25seSB3YW50IHRvIHVwZGF0ZSB0aGlzIGZsYWcgaWYgdGhpcwotICAgICAgICAgICAgLy8gaXMgdGhlIHJlYWwgY2FsbCBmcm9tIFdlYkNvcmUuCi0gICAgICAgICAgICBpZiAobmV3UHJvZ3Jlc3MgPT0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgbU9uZUh1bmRyZWRQZXJjZW50Q29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXaXRoIHRoZSBmbGFnIHVwZGF0ZWQsIHdlIGNhbiBub3cgcHJvY2VlZCBhcyBub3JtYWwgd2hldGhlciB0aGUgcHJvZ3Jlc3MgdXBkYXRlIGNhbWUgZnJvbQotICAgICAgICAgICAgLy8gV2ViQ29yZSBvciBub3RpZnlEb25lLgotICAgICAgICAgICAgaWYgKG5ld1Byb2dyZXNzID49IDEwMCkgewotICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkKCkgd2lsbCBjaGVjayBpZiB3ZSBhcmUgcmVhZHkgdG8gbW92ZSB0byB0aGUgbmV4dCB0ZXN0IGFuZCBkbyBzbyBpZiB3ZSBhcmUuCi0gICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghbVRpbWVkT3V0ICYmICFtV2FpdFVudGlsRG9uZSAmJiAhbVJlcXVlc3RlZFdlYktpdERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwotICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJGaW5pc2hlZDogIisgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdlYktpdERhdGEoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVGltZWRPdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlRpbWVkIG91dCBiZWZvcmUgZmluaXNoaW5nOiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtV2FpdFVudGlsRG9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiV2FpdGluZyBmb3Igbm90aWZ5RG9uZTogIiArIHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlcXVlc3RlZFdlYktpdERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlJlcXVlc3RlZCB3ZWJraXQgZGF0YSByZWFkeTogIiArIHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlZFRpdGxlKFdlYlZpZXcgdmlldywgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgICAgICBpZiAodGl0bGUubGVuZ3RoKCkgPiAzMCkKLSAgICAgICAgICAgICAgICB0aXRsZSA9ICIuLi4iK3RpdGxlLnN1YnN0cmluZyh0aXRsZS5sZW5ndGgoKS0zMCk7Ci0gICAgICAgICAgICBzZXRUaXRsZSh0aXRsZSk7CisgICAgICAgICAgICBzZXRUaXRsZSgiVGVzdCAiICsgbUN1cnJlbnRUZXN0TnVtYmVyICsgIiBvZiAiICsgbVRvdGFsVGVzdENvdW50ICsgIjogIisgdGl0bGUpOwogICAgICAgICAgICAgaWYgKG1EdW1wVGl0bGVDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICAgbVRpdGxlQ2hhbmdlcy5hcHBlbmQoIlRJVExFIENIQU5HRUQ6ICIpOwogICAgICAgICAgICAgICAgIG1UaXRsZUNoYW5nZXMuYXBwZW5kKHRpdGxlKTsKQEAgLTY3MCwyMSArNzEzLDQwIEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkdlb2xvY2F0aW9uUGVybWlzc2lvbnNTaG93UHJvbXB0KFN0cmluZyBvcmlnaW4sCiAgICAgICAgICAgICAgICAgR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKG1HZW9sb2NhdGlvblBlcm1pc3Npb25TZXQpIHsKKyAgICAgICAgICAgIGlmIChtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQpIHsKICAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBtR2VvbG9jYXRpb25QZXJtaXNzaW9uLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrLCBTdHJpbmc+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5wdXQoY2FsbGJhY2ssIG9yaWdpbik7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Db25zb2xlTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUlEKSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29uc29sZU1lc3NhZ2UoQ29uc29sZU1lc3NhZ2UgY29uc29sZU1lc3NhZ2UpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIgKyBjb25zb2xlTWVzc2FnZS5saW5lTnVtYmVyKCkgKyAiOiAiCisgICAgICAgICAgICAgICAgICAgICsgY29uc29sZU1lc3NhZ2UubWVzc2FnZSgpICsgIlxuIjsKICAgICAgICAgICAgIGlmIChtQ29uc29sZU1lc3NhZ2VzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtQ29uc29sZU1lc3NhZ2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGNvbnNvbGVNZXNzYWdlID0gIkNPTlNPTEUgTUVTU0FHRTogbGluZSAiCi0gICAgICAgICAgICAgICAgICAgICsgbGluZU51bWJlciArIjogIisgbWVzc2FnZSArIlxuIjsKLSAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMuYXBwZW5kKGNvbnNvbGVNZXNzYWdlKTsKLSAgICAgICAgICAgIExvZy52KExPR1RBRywgIkxPRzogIitjb25zb2xlTWVzc2FnZSk7CisgICAgICAgICAgICBtQ29uc29sZU1lc3NhZ2VzLmFwcGVuZChtc2cpOworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTE9HOiAiICsgbXNnKTsKKyAgICAgICAgICAgIC8vIHRoZSByYXRpb25hbGUgaGVyZSBpcyB0aGF0IGlmIHRoZXJlJ3MgYW4gZXJyb3Igb2YgZWl0aGVyIHR5cGUsIGFuZCB0aGUgdGVzdCB3YXMKKyAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yICJub3RpZnlEb25lIiBzaWduYWwgdG8gZmluaXNoLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gd2FpdGluZworICAgICAgICAgICAgLy8gYW55bW9yZSBiZWNhdXNlIHRoZSBKUyBleGVjdXRpb24gaXMgYWxyZWFkeSB0ZXJtaW5hdGVkIGF0IHRoaXMgcG9pbnQgYW5kIGEKKyAgICAgICAgICAgIC8vICJub3RpZnlEb25lIiB3aWxsIG5ldmVyIGNvbWUgb3V0IHNvIGl0J3MganVzdCB3YXN0aW5nIHRpbWUgdGlsbCB0aW1lb3V0IGtpY2tzIGluCisgICAgICAgICAgICBpZiAoKG1zZy5jb250YWlucygiVW5jYXVnaHQgUmVmZXJlbmNlRXJyb3I6IikgfHwgbXNnLmNvbnRhaW5zKCJVbmNhdWdodCBUeXBlRXJyb3I6IikpCisgICAgICAgICAgICAgICAgICAgICYmIG1XYWl0VW50aWxEb25lICYmIG1TdG9wT25SZWZFcnJvcikgeworICAgICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlRlcm1pbmF0aW5nIHRlc3QgY2FzZSBvbiB1bmNhdWdodCBSZWZlcmVuY2VFcnJvciBvciBUeXBlRXJyb3IuIik7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlEb25lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCA1MDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTcyMywxMyArNzg1LDE1IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXdXaW5kb3dXZWJWaWV3IGV4dGVuZHMgV2ViVmlldyB7CiAgICAgICAgIHB1YmxpYyBOZXdXaW5kb3dXZWJWaWV3KENvbnRleHQgY29udGV4dCwgTWFwPFN0cmluZywgT2JqZWN0PiBqc0lmYWNlcykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgMCwganNJZmFjZXMpOworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgMCwganNJZmFjZXMsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXNldFRlc3RTdGF0dXMoKSB7CiAgICAgICAgIG1XYWl0VW50aWxEb25lID0gZmFsc2U7CiAgICAgICAgIG1EdW1wRGF0YVR5cGUgPSBtRGVmYXVsdER1bXBEYXRhVHlwZTsKKyAgICAgICAgbUR1bXBUb3BGcmFtZUFzVGV4dCA9IGZhbHNlOworICAgICAgICBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gZmFsc2U7CiAgICAgICAgIG1UaW1lZE91dCA9IGZhbHNlOwogICAgICAgICBtRHVtcFRpdGxlQ2hhbmdlcyA9IGZhbHNlOwogICAgICAgICBtUmVxdWVzdGVkV2ViS2l0RGF0YSA9IGZhbHNlOwpAQCAtNzM5LDEwICs4MDMsMTIgQEAKICAgICAgICAgbUV2ZW50U2VuZGVyLmNsZWFyVG91Y2hQb2ludHMoKTsKICAgICAgICAgbUV2ZW50U2VuZGVyLmNsZWFyVG91Y2hNZXRhU3RhdGUoKTsKICAgICAgICAgbVBhZ2VGaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICBtRHVtcFdlYktpdERhdGEgPSBmYWxzZTsKICAgICAgICAgbUdldERyYXd0aW1lID0gZmFsc2U7CiAgICAgICAgIG1TYXZlSW1hZ2VQYXRoID0gbnVsbDsKKyAgICAgICAgc2V0RGVmYXVsdFdlYlNldHRpbmdzKG1XZWJWaWV3KTsKKyAgICAgICAgbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gZmFsc2U7CisgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0gbnVsbDsKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmdbXSBnZXREcmF3V2ViVmlld1RpbWUoV2ViVmlldyB2aWV3LCBpbnQgY291bnQpIHsKQEAgLTc3OSw3ICs4NDUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBjYW5Nb3ZlVG9OZXh0VGVzdCgpIHsKLSAgICAgICAgcmV0dXJuIChtRHVtcFdlYktpdERhdGEgJiYgbU9uZUh1bmRyZWRQZXJjZW50Q29tcGxldGUgJiYgbVBhZ2VGaW5pc2hlZCAmJiAhbVdhaXRVbnRpbERvbmUpIHx8IG1UaW1lZE91dDsKKyAgICAgICAgcmV0dXJuIChtRHVtcFdlYktpdERhdGEgJiYgbVBhZ2VGaW5pc2hlZCAmJiAhbVdhaXRVbnRpbERvbmUpIHx8IG1UaW1lZE91dDsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0dXBXZWJWaWV3Rm9yTGF5b3V0VGVzdHMoV2ViVmlldyB3ZWJ2aWV3LCBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkpIHsKQEAgLTc4Nyw2ICs4NTMsMTkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIHNldERlZmF1bHRXZWJTZXR0aW5ncyh3ZWJ2aWV3KTsKKworICAgICAgICB3ZWJ2aWV3LnNldFdlYkNocm9tZUNsaWVudChtQ2hyb21lQ2xpZW50KTsKKyAgICAgICAgd2Vidmlldy5zZXRXZWJWaWV3Q2xpZW50KG1WaWV3Q2xpZW50KTsKKyAgICAgICAgLy8gU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldworICAgICAgICAvLyB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQorICAgICAgICAvLyBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgorICAgICAgICAvLyBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAorICAgICAgICAvLyB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgorICAgICAgICB3ZWJ2aWV3LnNldFRvdWNoSW50ZXJ2YWwoLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRXZWJTZXR0aW5ncyhXZWJWaWV3IHdlYnZpZXcpIHsKICAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSB3ZWJ2aWV3LmdldFNldHRpbmdzKCk7CiAgICAgICAgIHNldHRpbmdzLnNldEFwcENhY2hlRW5hYmxlZCh0cnVlKTsKICAgICAgICAgc2V0dGluZ3Muc2V0QXBwQ2FjaGVQYXRoKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKQEAgLTc5OSwxNSArODc4LDcgQEAKICAgICAgICAgc2V0dGluZ3Muc2V0RGF0YWJhc2VQYXRoKGdldERpcigiZGF0YWJhc2VzIiwwKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIHNldHRpbmdzLnNldERvbVN0b3JhZ2VFbmFibGVkKHRydWUpOwogICAgICAgICBzZXR0aW5ncy5zZXRXb3JrZXJzRW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgd2Vidmlldy5zZXRXZWJDaHJvbWVDbGllbnQobUNocm9tZUNsaWVudCk7Ci0gICAgICAgIHdlYnZpZXcuc2V0V2ViVmlld0NsaWVudChtVmlld0NsaWVudCk7Ci0gICAgICAgIC8vIFNldHRpbmcgYSB0b3VjaCBpbnRlcnZhbCBvZiAtMSBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgb3B0aW1pc2F0aW9uIGluIFdlYlZpZXcKLSAgICAgICAgLy8gdGhhdCBzdG9wcyByZXBlYXRlZCB0b3VjaCBldmVudHMgZmxvb2RpbmcgV2ViQ29yZS4gVGhlIEV2ZW50IFNlbmRlciBvbmx5IHNlbmRzIGEKLSAgICAgICAgLy8gc2luZ2xlIGV2ZW50IHJhdGhlciB0aGFuIGEgc3RyZWFtIG9mIGV2ZW50cyAobGlrZSB3aGF0IHdvdWxkIGdlbmVyYWxseSBoYXBwZW4gaW4KLSAgICAgICAgLy8gYSByZWFsIHVzZSBvZiB0b3VjaCBldmVudHMgaW4gYSBXZWJWaWV3KSAgYW5kIHNvIGlmIHRoZSBXZWJWaWV3IGRyb3BzIHRoZSBldmVudCwKLSAgICAgICAgLy8gdGhlIHRlc3Qgd2lsbCBmYWlsIGFzIHRoZSB0ZXN0IGV4cGVjdHMgb25lIGNhbGxiYWNrIGZvciBldmVyeSB0b3VjaCBpdCBzeW50aGVzaXplcy4KLSAgICAgICAgd2Vidmlldy5zZXRUb3VjaEludGVydmFsKC0xKTsKKyAgICAgICAgc2V0dGluZ3Muc2V0WFNTQXVkaXRvckVuYWJsZWQoZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgV2ViVmlldyBtV2ViVmlldzsKQEAgLTgyNCw2ICs4OTUsOSBAQAogICAgIHByaXZhdGUgU3RyaW5nIG1TYXZlSW1hZ2VQYXRoOwogICAgIHByaXZhdGUgQnVmZmVyZWRSZWFkZXIgbVRlc3RMaXN0UmVhZGVyOwogICAgIHByaXZhdGUgYm9vbGVhbiBtR2V0RHJhd3RpbWU7CisgICAgcHJpdmF0ZSBpbnQgbVRvdGFsVGVzdENvdW50OworICAgIHByaXZhdGUgaW50IG1DdXJyZW50VGVzdE51bWJlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BPblJlZkVycm9yOwogCiAgICAgLy8gU3RhdGVzCiAgICAgcHJpdmF0ZSBib29sZWFuIG1UaW1lZE91dDsKQEAgLTgzMyw2ICs5MDcsOCBAQAogICAgIC8vIExheW91dCB0ZXN0IGNvbnRyb2xsZXIgdmFyaWFibGVzLgogICAgIHByaXZhdGUgRHVtcERhdGFUeXBlIG1EdW1wRGF0YVR5cGU7CiAgICAgcHJpdmF0ZSBEdW1wRGF0YVR5cGUgbURlZmF1bHREdW1wRGF0YVR5cGUgPSBEdW1wRGF0YVR5cGUuRVhUX1JFUFI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wVG9wRnJhbWVBc1RleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1XYWl0VW50aWxEb25lOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcFRpdGxlQ2hhbmdlczsKICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBtVGl0bGVDaGFuZ2VzOwpAQCAtODQ2LDcgKzkyMiw2IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbVBhZ2VGaW5pc2hlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcFdlYktpdERhdGEgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU9uZUh1bmRyZWRQZXJjZW50Q29tcGxldGUgPSBmYWxzZTsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRU9VVF9TVFIgPSAiKipUZXN0IHRpbWVvdXQiOwogCkBAIC04NjEsMTEgKzkzNiwxNSBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQVVUT19URVNUID0gIlVpQXV0b1Rlc3QiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0RSQVdfVElNRSA9ICJHZXREcmF3VGltZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0lNQUdFID0gIlNhdmVJbWFnZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUT1RBTF9URVNUX0NPVU5UID0gIlRlc3RDb3VudCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX1RFU1RfTlVNQkVSID0gIlRlc3ROdW1iZXIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUF9PTl9SRUZfRVJST1IgPSAiU3RvcE9uUmVmZXJlbmNlRXJyb3IiOwogCiAgICAgc3RhdGljIGZpbmFsIGludCBEUkFXX1JVTlMgPSA1OwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJBV19USU1FX0xPRyA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKICAgICAgICAgIi9hbmRyb2lkL3BhZ2VfZHJhd190aW1lLnR4dCI7CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUdlb2xvY2F0aW9uUGVybWlzc2lvblNldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0OwogICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uOworICAgIHByaXZhdGUgTWFwIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1dlYlZpZXdFdmVudFNlbmRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1dlYlZpZXdFdmVudFNlbmRlci5qYXZhCmluZGV4IDcxNjA4NmIuLjM4M2Q3ODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9XZWJWaWV3RXZlbnRTZW5kZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvV2ViVmlld0V2ZW50U2VuZGVyLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIAkKICAgICBXZWJWaWV3RXZlbnRTZW5kZXIoV2ViVmlldyB3ZWJWaWV3KSB7CiAgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRCdWlsdEluWm9vbUNvbnRyb2xzKHRydWUpOwogICAgICAgICBtVG91Y2hQb2ludHMgPSBuZXcgVmVjdG9yPFRvdWNoUG9pbnQ+KCk7CiAgICAgfQogCQpAQCAtMTcwLDcwICsxNzEsMTI4IEBACiAJfQogCiAgICAgcHVibGljIHZvaWQgdG91Y2hTdGFydCgpIHsKLSAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IHNpbmdsZSB0b3VjaCBzbyBleGFtaW5lIHRoZSBmaXJzdCB0b3VjaCBwb2ludCBvbmx5LgotICAgICAgICAvLyBJZiBtdWx0aSB0b3VjaCBpcyBlbmFibGVkIGluIHRoZSBmdXR1cmUsIHdlIG5lZWQgdG8gcmUtZXhhbWluZSB0aGlzIHRvIHNlbmQKLSAgICAgICAgLy8gYWxsIHRoZSB0b3VjaCBwb2ludHMgd2l0aCB0aGUgZXZlbnQuCi0gICAgICAgIFRvdWNoUG9pbnQgdHAgPSBtVG91Y2hQb2ludHMuZ2V0KDApOwotCi0gICAgICAgIGlmICh0cCA9PSBudWxsKSB7CisgICAgICAgIGZpbmFsIGludCBudW1Qb2ludHMgPSBtVG91Y2hQb2ludHMuc2l6ZSgpOworICAgICAgICBpZiAobnVtUG9pbnRzID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIHRwLnNldERvd25UaW1lKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpKTsKLSAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4odHAuZG93blRpbWUoKSwgdHAuZG93blRpbWUoKSwKLSAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgdHAuZ2V0WCgpLCB0cC5nZXRZKCksIG1Ub3VjaE1ldGFTdGF0ZSk7CisgICAgICAgIGludFtdIHBvaW50ZXJJZHMgPSBuZXcgaW50W251bVBvaW50c107CisgICAgICAgIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbXSBwb2ludGVyQ29vcmRzID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbbnVtUG9pbnRzXTsKKyAgICAgICAgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyArK2kpIHsKKyAgICAgICAgICAgIHBvaW50ZXJJZHNbaV0gPSBtVG91Y2hQb2ludHMuZ2V0KGkpLmdldElkKCk7CisgICAgICAgICAgICBwb2ludGVyQ29vcmRzW2ldID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMoKTsKKyAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbaV0ueCA9IG1Ub3VjaFBvaW50cy5nZXQoaSkuZ2V0WCgpOworICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tpXS55ID0gbVRvdWNoUG9pbnRzLmdldChpKS5nZXRZKCk7CisgICAgICAgICAgICBtVG91Y2hQb2ludHMuZ2V0KGkpLnNldERvd25UaW1lKGRvd25UaW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKGRvd25UaW1lLCBkb3duVGltZSwKKyAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCBudW1Qb2ludHMsIHBvaW50ZXJJZHMsIHBvaW50ZXJDb29yZHMsCisgICAgICAgICAgICBtVG91Y2hNZXRhU3RhdGUsIDEuMGYsIDEuMGYsIDAsIDAsIDAsIDApOworCiAgICAgICAgIG1XZWJWaWV3Lm9uVG91Y2hFdmVudChldmVudCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdG91Y2hNb3ZlKCkgewotICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldCgwKTsKLQotICAgICAgICBpZiAodHAgPT0gbnVsbCkgeworICAgICAgICBmaW5hbCBpbnQgbnVtUG9pbnRzID0gbVRvdWNoUG9pbnRzLnNpemUoKTsKKyAgICAgICAgaWYgKG51bVBvaW50cyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIXRwLmhhc01vdmVkKCkpIHsKKyAgICAgICAgaW50W10gcG9pbnRlcklkcyA9IG5ldyBpbnRbbnVtUG9pbnRzXTsKKyAgICAgICAgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIHBvaW50ZXJDb29yZHMgPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tudW1Qb2ludHNdOworICAgICAgICBpbnQgbnVtTW92ZWRQb2ludHMgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKSB7CisgICAgICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldChpKTsKKyAgICAgICAgICAgIGlmICh0cC5oYXNNb3ZlZCgpKSB7CisgICAgICAgICAgICAgICAgcG9pbnRlcklkc1tudW1Nb3ZlZFBvaW50c10gPSBtVG91Y2hQb2ludHMuZ2V0KGkpLmdldElkKCk7CisgICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tpXSA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzKCk7CisgICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tudW1Nb3ZlZFBvaW50c10ueCA9IG1Ub3VjaFBvaW50cy5nZXQoaSkuZ2V0WCgpOworICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbbnVtTW92ZWRQb2ludHNdLnkgPSBtVG91Y2hQb2ludHMuZ2V0KGkpLmdldFkoKTsKKyAgICAgICAgICAgICAgICArK251bU1vdmVkUG9pbnRzOworICAgICAgICAgICAgICAgIHRwLnNldE1vdmVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1Nb3ZlZFBvaW50cyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbih0cC5kb3duVGltZSgpLCBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSwKLSAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSwgdHAuZ2V0WCgpLCB0cC5nZXRZKCksIG1Ub3VjaE1ldGFTdGF0ZSk7CisgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKG1Ub3VjaFBvaW50cy5nZXQoMCkuZG93blRpbWUoKSwKKyAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSwgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUsCisgICAgICAgICAgICAgICAgbnVtTW92ZWRQb2ludHMsIHBvaW50ZXJJZHMsIHBvaW50ZXJDb29yZHMsCisgICAgICAgICAgICAgICAgbVRvdWNoTWV0YVN0YXRlLCAxLjBmLCAxLjBmLCAwLCAwLCAwLCAwKTsKICAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKLQotICAgICAgICB0cC5zZXRNb3ZlZChmYWxzZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdG91Y2hFbmQoKSB7Ci0gICAgICAgIFRvdWNoUG9pbnQgdHAgPSBtVG91Y2hQb2ludHMuZ2V0KDApOwotCi0gICAgICAgIGlmICh0cCA9PSBudWxsKSB7CisgICAgICAgIGZpbmFsIGludCBudW1Qb2ludHMgPSBtVG91Y2hQb2ludHMuc2l6ZSgpOworICAgICAgICBpZiAobnVtUG9pbnRzID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKHRwLmRvd25UaW1lKCksIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLAotICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9VUCwgdHAuZ2V0WCgpLCB0cC5nZXRZKCksIG1Ub3VjaE1ldGFTdGF0ZSk7CisgICAgICAgIGludFtdIHBvaW50ZXJJZHMgPSBuZXcgaW50W251bVBvaW50c107CisgICAgICAgIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbXSBwb2ludGVyQ29vcmRzID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbbnVtUG9pbnRzXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKSB7CisgICAgICAgICAgICBwb2ludGVySWRzW2ldID0gbVRvdWNoUG9pbnRzLmdldChpKS5nZXRJZCgpOworICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tpXSA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzKCk7CisgICAgICAgICAgICBwb2ludGVyQ29vcmRzW2ldLnggPSBtVG91Y2hQb2ludHMuZ2V0KGkpLmdldFgoKTsKKyAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbaV0ueSA9IG1Ub3VjaFBvaW50cy5nZXQoaSkuZ2V0WSgpOworICAgICAgICB9CisKKyAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obVRvdWNoUG9pbnRzLmdldCgwKS5kb3duVGltZSgpLAorICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLCBNb3Rpb25FdmVudC5BQ1RJT05fVVAsCisgICAgICAgICAgICAgICAgbnVtUG9pbnRzLCBwb2ludGVySWRzLCBwb2ludGVyQ29vcmRzLAorICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSwgMS4wZiwgMS4wZiwgMCwgMCwgMCwgMCk7CiAgICAgICAgIG1XZWJWaWV3Lm9uVG91Y2hFdmVudChldmVudCk7CiAKLSAgICAgICAgaWYgKHRwLmlzUmVsZWFzZWQoKSkgewotICAgICAgICAgICAgbVRvdWNoUG9pbnRzLnJlbW92ZSgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG51bVBvaW50cyAtIDE7IGkgPj0gMDsgLS1pKSB7ICAvLyByZW1vdmUgcmVsZWFzZWQgcG9pbnRzLgorICAgICAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoaSk7CisgICAgICAgICAgICBpZiAodHAuaXNSZWxlYXNlZCgpKSB7CisgICAgICAgICAgICAgIG1Ub3VjaFBvaW50cy5yZW1vdmUoaSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0b3VjaENhbmNlbCgpIHsKLSAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoMCk7Ci0gICAgICAgIGlmICh0cCA9PSBudWxsKSB7CisgICAgICAgIGZpbmFsIGludCBudW1Qb2ludHMgPSBtVG91Y2hQb2ludHMuc2l6ZSgpOworICAgICAgICBpZiAobnVtUG9pbnRzID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh0cC5jYW5jZWxsZWQoKSkgewotICAgICAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4odHAuZG93blRpbWUoKSwgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksCi0gICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwsIHRwLmdldFgoKSwgdHAuZ2V0WSgpLCBtVG91Y2hNZXRhU3RhdGUpOwotICAgICAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgaW50W10gcG9pbnRlcklkcyA9IG5ldyBpbnRbbnVtUG9pbnRzXTsKKyAgICAgICAgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIHBvaW50ZXJDb29yZHMgPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tudW1Qb2ludHNdOworICAgICAgICBsb25nIGNhbmNlbFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgaW50IG51bUNhbmNlbGVkUG9pbnRzID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKSB7CisgICAgICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldChpKTsKKyAgICAgICAgICAgIGlmICh0cC5jYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgIHBvaW50ZXJJZHNbbnVtQ2FuY2VsZWRQb2ludHNdID0gbVRvdWNoUG9pbnRzLmdldChpKS5nZXRJZCgpOworICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbbnVtQ2FuY2VsZWRQb2ludHNdID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMoKTsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzW251bUNhbmNlbGVkUG9pbnRzXS54ID0gbVRvdWNoUG9pbnRzLmdldChpKS5nZXRYKCk7CisgICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tudW1DYW5jZWxlZFBvaW50c10ueSA9IG1Ub3VjaFBvaW50cy5nZXQoaSkuZ2V0WSgpOworICAgICAgICAgICAgICAgICsrbnVtQ2FuY2VsZWRQb2ludHM7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAobnVtQ2FuY2VsZWRQb2ludHMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obVRvdWNoUG9pbnRzLmdldCgwKS5kb3duVGltZSgpLAorICAgICAgICAgICAgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwsCisgICAgICAgICAgICBudW1DYW5jZWxlZFBvaW50cywgcG9pbnRlcklkcywgcG9pbnRlckNvb3JkcywKKyAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSwgMS4wZiwgMS4wZiwgMCwgMCwgMCwgMCk7CisKKyAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjYW5jZWxUb3VjaFBvaW50KGludCBpZCkgewotICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldCgwKTsKKyAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoaWQpOwogICAgICAgICBpZiAodHAgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0yNDIsMTQgKzMwMSwxOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZFRvdWNoUG9pbnQoaW50IHgsIGludCB5KSB7Ci0gICAgICAgIG1Ub3VjaFBvaW50cy5hZGQobmV3IFRvdWNoUG9pbnQoY29udGVudHNUb1dpbmRvd1goeCksIGNvbnRlbnRzVG9XaW5kb3dZKHkpKSk7Ci0gICAgICAgIGlmIChtVG91Y2hQb2ludHMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiQWRkaW5nIG1vcmUgdGhhbiBvbmUgdG91Y2ggcG9pbnQsIGJ1dCBtdWx0aSB0b3VjaCBpcyBub3Qgc3VwcG9ydGVkISIpOworICAgICAgICBmaW5hbCBpbnQgbnVtUG9pbnRzID0gbVRvdWNoUG9pbnRzLnNpemUoKTsKKyAgICAgICAgaW50IGlkOworICAgICAgICBpZiAobnVtUG9pbnRzID09IDApIHsKKyAgICAgICAgICBpZCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWQgPSBtVG91Y2hQb2ludHMuZ2V0KG51bVBvaW50cyAtIDEpLmdldElkKCkgKyAxOwogICAgICAgICB9CisKKyAgICAgICAgbVRvdWNoUG9pbnRzLmFkZChuZXcgVG91Y2hQb2ludChpZCwgY29udGVudHNUb1dpbmRvd1goeCksIGNvbnRlbnRzVG9XaW5kb3dZKHkpKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVG91Y2hQb2ludChpbnQgaWQsIGludCB4LCBpbnQgeSkgewotICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldCgwKTsKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUb3VjaFBvaW50KGludCBpLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoaSk7CiAgICAgICAgIGlmICh0cCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTI3Niw3ICszNDAsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VUb3VjaFBvaW50KGludCBpZCkgewotICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldCgwKTsKKyAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoaWQpOwogICAgICAgICBpZiAodHAgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0zMDUsNiArMzY5LDcgQEAKICAgICBwcml2YXRlIGludCBtb3VzZVk7CiAKICAgICBwcml2YXRlIGNsYXNzIFRvdWNoUG9pbnQgeworICAgICAgICBwcml2YXRlIGludCBtSWQ7CiAgICAgICAgIHByaXZhdGUgaW50IG1YOwogICAgICAgICBwcml2YXRlIGludCBtWTsKICAgICAgICAgcHJpdmF0ZSBsb25nIG1Eb3duVGltZTsKQEAgLTMxMiw3ICszNzcsOCBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1vdmVkOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbGxlZDsKIAotICAgICAgICBwdWJsaWMgVG91Y2hQb2ludChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgcHVibGljIFRvdWNoUG9pbnQoaW50IGlkLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgICAgIG1JZCA9IGlkOwogICAgICAgICAgICAgbVggPSB4OwogICAgICAgICAgICAgbVkgPSB5OwogICAgICAgICAgICAgbVJlbGVhc2VkID0gZmFsc2U7CkBAIC0zMzIsNiArMzk4LDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgc2V0TW92ZWQoYm9vbGVhbiBtb3ZlZCkgeyBtTW92ZWQgPSBtb3ZlZDsgfQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3ZlZCgpIHsgcmV0dXJuIG1Nb3ZlZDsgfQogCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7IHJldHVybiBtSWQ7IH0KICAgICAgICAgcHVibGljIGludCBnZXRYKCkgeyByZXR1cm4gbVg7IH0KICAgICAgICAgcHVibGljIGludCBnZXRZKCkgeyByZXR1cm4gbVk7IH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWQubWsgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZjNjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyOSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBkaWZmX21hdGNoX3BhdGNoCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBEdW1wUmVuZGVyVHJlZTIKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTY1NzFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyIj4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii51aS5EaXJMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJEdW1wIFJlbmRlciBUcmVlIDIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9uIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5URVNUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0gYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIiBpcyB0aGVyZSBzbyB3ZSBvbmx5IGhhdmUgYSBvbmUgaW5zdGFuY2UKKyAgICAgICAgICAgICBvZiB0aGlzIGFjdGl2aXR5LiBIb3dldmVyLCBpdCBkb2Vzbid0IHNlZW0gdG8gd29yayBleGFjdGx5IGxpa2UgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgIGRvY3VtZW50YXRpb24sIGJlY2F1c2UgdGhlIGJlaGF2aW91ciBvZiB0aGUgYXBwbGljYXRpb24gc3VnZ2VzdAorICAgICAgICAgICAgIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGFzayBmb3IgYWxsIDMgYWN0aXZpdGllcy4gV2UgZG9uJ3QgdW5kZXJzdGFuZAorICAgICAgICAgICAgIGhvdyBleGFjdGx5IGl0IGFsbCB3b3JrcywgYnV0IGF0IHRoZSBtb21lbnQgaXQgd29ya3MganVzdCBmaW5lLgorICAgICAgICAgICAgIEl0IGNhbiBsZWFkIHRvIHNvbWUgd2VpcmQgYmVoYXZpb3VyIGluIHRoZSBmdXR1cmUuIC0tPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVGVzdHNMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0cycgbGlzdCBhY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb24iPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXlvdXRUZXN0c0V4ZWN1dG9yIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1doaXRlQmFja2dyb3VuZCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cycgZXhlY3V0b3IiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9IjpleGVjdXRvciI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJNYW5hZ2VyU2VydmljZSI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMiIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cyBzY3JpcHQgcnVubmVyIiAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NEQ0FSRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XQUtFX0xPQ0siIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fYXBhY2hlMi5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWVkZWFkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkKQEAgLTAsMCArMSwxNTAgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIiIiU3RhcnQsIHN0b3AsIG9yIHJlc3RhcnQgYXBhY2hlMiBzZXJ2ZXIuCisKKyAgQXBhY2hlMiBtdXN0IGJlIGluc3RhbGxlZCB3aXRoIG1vZF9waHAhCisKKyAgVXNhZ2U6CisgICAgcnVuX2FwYWNoZTIucHkgc3RhcnR8c3RvcHxyZXN0YXJ0CisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IHRpbWUKKworZGVmIG1haW4ob3B0aW9ucywgYXJncyk6CisgIGlmIGxlbihhcmdzKSA8IDE6CisgICAgcnVuX2NtZCA9ICIiCisgIGVsc2U6CisgICAgcnVuX2NtZCA9IGFyZ3NbMF0KKworICAjIFNldHVwIGxvZ2dpbmcgY2xhc3MKKyAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0nJShtZXNzYWdlKXMnKQorCisgIGlmIG5vdCBydW5fY21kIGluICgic3RhcnQiLCAic3RvcCIsICJyZXN0YXJ0Iik6CisgICAgbG9nZ2luZy5pbmZvKCJpbGxlZ2FsIGFyZ3VtZW50OiAiICsgcnVuX2NtZCkKKyAgICBsb2dnaW5nLmluZm8oIlVzYWdlOiBweXRob24gcnVuX2FwYWNoZTIucHkgc3RhcnR8c3RvcHxyZXN0YXJ0IikKKyAgICByZXR1cm4KKworICAjIENyZWF0ZSAvdG1wL1dlYktpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LiBUaGlzIGlzIG5lZWRlZCBmb3IgdmFyaW91cyBmaWxlcyB1c2VkIGJ5IGFwYWNoZTIKKyAgdG1wX1dlYktpdCA9IG9zLnBhdGguam9pbigiL3RtcCIsICJXZWJLaXQiKQorICBpZiBub3Qgb3MucGF0aC5leGlzdHModG1wX1dlYktpdCk6CisgICAgb3MubWtkaXIodG1wX1dlYktpdCkKKworICAjIEdldCB0aGUgcGF0aCB0byBhbmRyb2lkIHRyZWUgcm9vdCBiYXNlZCBvbiB0aGUgc2NyaXB0IGxvY2F0aW9uLgorICAjIEJhc2ljYWxseSB3ZSBnbyA1IGxldmVscyB1cAorICBwYXJlbnQgPSBvcy5wYXJkaXIKKyAgc2NyaXB0X2xvY2F0aW9uID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkpCisgIGFuZHJvaWRfdHJlZV9yb290ID0gb3MucGF0aC5qb2luKHNjcmlwdF9sb2NhdGlvbiwgcGFyZW50LCBwYXJlbnQsIHBhcmVudCwgcGFyZW50LCBwYXJlbnQpCisgIGFuZHJvaWRfdHJlZV9yb290ID0gb3MucGF0aC5ub3JtcGF0aChhbmRyb2lkX3RyZWVfcm9vdCkKKworICAjIElmIGFueSBvZiB0aGVzZSBpcyByZWxhdGl2ZSwgdGhlbiBpdCdzIHJlbGF0aXZlIHRvIFNlcnZlclJvb3QgKGluIG91ciBjYXNlIGFuZHJvaWRfdHJlZV9yb290KQorICB3ZWJraXRfcGF0aCA9IG9zLnBhdGguam9pbigiZXh0ZXJuYWwiLCAid2Via2l0IikKKyAgaWYgKG9wdGlvbnMudGVzdHNfcm9vdF9kaXJlY3RvcnkgIT0gTm9uZSk6CisgICAgIyBpZiBvcHRpb25zLnRlc3RzX3Jvb3RfZGlyZWN0b3J5IGlzIGFic29sdXRlLCBvcy5nZXRjd2QoKSBpcyBkaXNjYXJkZWQhCisgICAgbGF5b3V0X3Rlc3RzX3BhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgb3B0aW9ucy50ZXN0c19yb290X2RpcmVjdG9yeSkpCisgIGVsc2U6CisgICAgbGF5b3V0X3Rlc3RzX3BhdGggPSBvcy5wYXRoLmpvaW4od2Via2l0X3BhdGgsICJMYXlvdXRUZXN0cyIpCisgIGh0dHBfY29uZl9wYXRoID0gb3MucGF0aC5qb2luKGxheW91dF90ZXN0c19wYXRoLCAiaHR0cCIsICJjb25mIikKKworICAjIFByZXBhcmUgdGhlIGNvbW1hbmQgdG8gc2V0ICR7QVBBQ0hFX1JVTl9VU0VSfSBhbmQgJHtBUEFDSEVfUlVOX0dST1VQfQorICBlbnZ2YXJzX3BhdGggPSBvcy5wYXRoLmpvaW4oIi9ldGMiLCAiYXBhY2hlMiIsICJlbnZ2YXJzIikKKyAgZXhwb3J0X2VudnZhcnNfY21kID0gInNvdXJjZSAiICsgZW52dmFyc19wYXRoCisKKyAgZXJyb3JfbG9nX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wX1dlYktpdCwgImFwYWNoZTItZXJyb3IubG9nIikKKyAgY3VzdG9tX2xvZ19wYXRoID0gb3MucGF0aC5qb2luKHRtcF9XZWJLaXQsICJhcGFjaGUyLWFjY2Vzcy5sb2ciKQorCisgICMgUHJlcGFyZSB0aGUgY29tbWFuZCB0byAocmUpc3RhcnQvc3RvcCB0aGUgc2VydmVyIHdpdGggc3BlY2lmaWVkIHNldHRpbmdzCisgIGFwYWNoZTJfcmVzdGFydF90ZW1wbGF0ZSA9ICJhcGFjaGUyIC1rICVzIgorICBkaXJlY3RpdmVzICA9ICIgLWMgXCJTZXJ2ZXJSb290ICIgKyBhbmRyb2lkX3RyZWVfcm9vdCArICJcIiIKKworICAjIFRoZSBkZWZhdWx0IGNvbmZpZyBpbiBhcGFjaGUyLWRlYmlhbi1odHRwZC5jb25mIGxpc3RlbnMgb24gcG9ydHMgODA4MCBhbmQKKyAgIyA4NDQzLiBXZSBhbHNvIG5lZWQgdG8gbGlzdGVuIG9uIHBvcnQgODAwMCBmb3IgSFRUUCB0ZXN0cy4KKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiTGlzdGVuIDgwMDBcIiIKKworICAjIFdlIHVzZSBodHRwL3Rlc3RzIGFzIHRoZSBkb2N1bWVudCByb290IGFzIHRoZSBIVFRQIHRlc3RzIHVzZSBoYXJkY29kZWQKKyAgIyByZXNvdXJjZXMgYXQgdGhlIHNlcnZlciByb290LiBXZSB0aGVuIHVzZSBhbGlhc2VzIHRvIG1ha2UgYXZhaWxhYmxlIHRoZQorICAjIGNvbXBsZXRlIHNldCBvZiB0ZXN0cyBhbmQgdGhlIHJlcXVpcmVkIHNjcmlwdHMuCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkRvY3VtZW50Um9vdCAiICsgb3MucGF0aC5qb2luKGxheW91dF90ZXN0c19wYXRoLCAiaHR0cCIsICJ0ZXN0cy8iKSArICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiQWxpYXMgL0xheW91dFRlc3RzICIgKyBsYXlvdXRfdGVzdHNfcGF0aCArICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiQWxpYXMgL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2FuZHJvaWQgIiArIFwKKyAgICBvcy5wYXRoLmpvaW4od2Via2l0X3BhdGgsICJXZWJLaXRUb29scyIsICJEdW1wUmVuZGVyVHJlZSIsICJhbmRyb2lkIikgKyAiXCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkFsaWFzIC9UaGlyZFBhcnR5UHJvamVjdC5wcm9wICIgKyBcCisgICAgb3MucGF0aC5qb2luKHdlYmtpdF9wYXRoLCAiVGhpcmRQYXJ0eVByb2plY3QucHJvcCIpICsgIlwiIgorCisgICMgVGhpcyBkaXJlY3RpdmUgaXMgY29tbWVudGVkIG91dCBpbiBhcGFjaGUyLWRlYmlhbi1odHRwZC5jb25mIGZvciBzb21lIHJlYXNvbgorICAjIEhvd2V2ZXIsIGl0IGlzIHVzZWZ1bCB0byBicm93c2UgdGhyb3VnaCB0ZXN0cyBpbiB0aGUgYnJvd3Nlciwgc28gaXQncyBhZGRlZCBoZXJlLgorICAjIE9uZSB0aGluZyB0byBub3RlIGlzIHRoYXQgYmVjYXVzZSBvZiBwcm9ibGVtcyB3aXRoIG1vZF9kaXIgYW5kIHBvcnQgbnVtYmVycywgbW9kX2RpcgorICAjIGlzIHR1cm5lZCBvZmYuIFRoYXQgbWVhbnMgdGhhdCB0aGVyZSBfbXVzdF8gYmUgYSB0cmFpbGluZyBzbGFzaCBhdCB0aGUgZW5kIG9mIFVSTAorICAjIGZvciBhdXRvIGluZGV4ZXMgdG8gd29yayBjb3JyZWN0bHkuCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkxvYWRNb2R1bGUgYXV0b2luZGV4X21vZHVsZSAvdXNyL2xpYi9hcGFjaGUyL21vZHVsZXMvbW9kX2F1dG9pbmRleC5zb1wiIgorCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkVycm9yTG9nICIgKyBlcnJvcl9sb2dfcGF0aCArIlwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJDdXN0b21Mb2cgIiArIGN1c3RvbV9sb2dfcGF0aCArICIgY29tYmluZWRcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiU1NMQ2VydGlmaWNhdGVGaWxlICIgKyBvcy5wYXRoLmpvaW4oaHR0cF9jb25mX3BhdGgsICJ3ZWJraXQtaHR0cGQucGVtIikgKyBcCisgICAgIlwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJVc2VyICR7QVBBQ0hFX1JVTl9VU0VSfVwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJHcm91cCAke0FQQUNIRV9SVU5fR1JPVVB9XCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtQyBcIlR5cGVzQ29uZmlnICIgKyBcCisgICAgb3MucGF0aC5qb2luKGFuZHJvaWRfdHJlZV9yb290LCBodHRwX2NvbmZfcGF0aCwgIm1pbWUudHlwZXMiKSArICJcIiIKKyAgY29uZl9maWxlX2NtZCA9ICIgLWYgIiArIFwKKyAgICBvcy5wYXRoLmpvaW4oYW5kcm9pZF90cmVlX3Jvb3QsIGh0dHBfY29uZl9wYXRoLCAiYXBhY2hlMi1kZWJpYW4taHR0cGQuY29uZiIpCisKKyAgIyBUcnkgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZHMKKyAgbG9nZ2luZy5pbmZvKCJXaWxsICIgKyBydW5fY21kICsgIiBhcGFjaGUyIHNlcnZlci4iKQorCisgICMgSXQgaXMgd29ydGggbm90aW5nIGhlcmUgdGhhdCBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdpdGggd2hpY2ggd2UgcmVzdGFydCB0aGUgc2VydmVyIHBvaW50cworICAjIHRvIGEgZGlmZmVyZW50IFBpZEZpbGUgaXQgd2lsbCBub3Qgd29yayBhbmQgd2lsbCByZXN1bHQgaW4gYSBzZWNvbmQgYXBhY2hlMiBpbnN0YW5jZS4KKyAgaWYgKHJ1bl9jbWQgPT0gJ3Jlc3RhcnQnKToKKyAgICBsb2dnaW5nLmluZm8oIkZpcnN0IHdpbGwgc3RvcC4uLiIpCisgICAgZXhlY3V0ZV9jbWQoZXhwb3J0X2VudnZhcnNfY21kICsgIiAmJiAiICsgKGFwYWNoZTJfcmVzdGFydF90ZW1wbGF0ZSAlICgnc3RvcCcpKSArIGRpcmVjdGl2ZXMgKyBjb25mX2ZpbGVfY21kKQorICAgIGxvZ2dpbmcuaW5mbygiU3RvcHBlZC4gV2lsbCBzdGFydCBub3cuLi4iKQorICAgICMgV2UgbmVlZCB0byBzbGVlcCBicmVpZmx5IHRvIGF2b2lkIGVycm9ycyB3aXRoIGFwYWNoZSBiZWluZyBzdG9wcGVkIGFuZCBzdGFydGVkIHRvbyBxdWlja2x5CisgICAgdGltZS5zbGVlcCgwLjUpCisKKyAgZXhlY3V0ZV9jbWQoZXhwb3J0X2VudnZhcnNfY21kICsgIiAmJiAiICsgKGFwYWNoZTJfcmVzdGFydF90ZW1wbGF0ZSAlIChydW5fY21kKSkgKyBkaXJlY3RpdmVzICsgY29uZl9maWxlX2NtZCkKKworZGVmIGV4ZWN1dGVfY21kKGNtZCk6CisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgKG91dCwgZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorCisgICMgT3V0cHV0IHRoZSBzdGRvdXQgZnJvbSB0aGUgY29tbWFuZCB0byBjb25zb2xlCisgIGxvZ2dpbmcuaW5mbyhvdXQpCisKKyAgIyBSZXBvcnQgYW55IGVycm9ycworICBpZiBwLnJldHVybmNvZGUgIT0gMDoKKyAgICBsb2dnaW5nLmluZm8oIiEhIEVSUk9SUzoiKQorCisgICAgaWYgZXJyLmZpbmQoZW52dmFyc19wYXRoKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbyhlcnIpCisgICAgZWxpZiBlcnIuZmluZCgnY29tbWFuZCBub3QgZm91bmQnKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbygiYXBhY2hlMiBpcyBwcm9iYWJseSBub3QgaW5zdGFsbGVkIikKKyAgICBlbHNlOgorICAgICAgbG9nZ2luZy5pbmZvKGVycikKKyAgICAgIGxvZ2dpbmcuaW5mbygiVHJ5IGxvb2tpbmcgaW4gIiArIGVycm9yX2xvZ19wYXRoICsgIiBmb3IgZGV0YWlscyIpCisgIGVsc2U6CisgICAgbG9nZ2luZy5pbmZvKCJPSyIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG9wdGlvbl9wYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIodXNhZ2U9IlVzYWdlOiAlcHJvZyBbb3B0aW9uc10gc3RhcnR8c3RvcHxyZXN0YXJ0IikKKyAgb3B0aW9uX3BhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS10ZXN0cy1yb290LWRpcmVjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJUaGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gdGFrZSB0aGUgdGVzdHMsIGRlZmF1bHQgaXMgZXh0ZXJuYWwvd2Via2l0L0xheW91dFRlc3RzIGluIHRoaXMgY2hlY2tvdXQgb2YgdGhlIEFuZHJvaWQgdHJlZSIpCisgIG9wdGlvbnMsIGFyZ3MgPSBvcHRpb25fcGFyc2VyLnBhcnNlX2FyZ3MoKTsKKyAgbWFpbihvcHRpb25zLCBhcmdzKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMDNhMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0wLDAgKzEsOTQgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyIiIlJ1biBsYXlvdXQgdGVzdHMgb24gdGhlIGRldmljZS4KKworICBJdCBydW5zIHRoZSBzcGVjaWZpZWQgdGVzdHMgb24gdGhlIGRldmljZSwgZG93bmxvYWRzIHRoZSBzdW1tYXJpZXMgdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgYW5kIG9wdGlvbmFsbHkgc2hvd3MgdGhlIGRldGFpbGVkIHJlc3VsdHMgdGhlIGhvc3QncyBkZWZhdWx0IGJyb3dzZXIuCisKKyAgVXNhZ2U6CisgICAgcnVuX2xheW91dF90ZXN0cy5weSAtLXNob3ctcmVzdWx0cy1pbi1icm93c2VyIHRlc3QtcmVsYXRpdmUtcGF0aAorIiIiCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgd2ViYnJvd3NlcgorCisjVE9ETzogVGhlc2Ugc2hvdWxkIG5vdCBiZSBoYXJkY29kZWQKK1JFU1VMVFNfQUJTT0xVVEVfUEFUSCA9ICIvc2RjYXJkL2xheW91dC10ZXN0LXJlc3VsdHMvIgorREVUQUlMU19IVE1MID0gImRldGFpbHMuaHRtbCIKK1NVTU1BUllfVFhUID0gInN1bW1hcnkudHh0IgorCitkZWYgbWFpbihvcHRpb25zLCBhcmdzKToKKyAgaWYgYXJnczoKKyAgICBwYXRoID0gIiAiLmpvaW4oYXJncyk7CisgIGVsc2U6CisgICAgcGF0aCA9ICIiOworCisgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBmb3JtYXQ9JyUobWVzc2FnZSlzJykKKworICB0bXBkaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKworICBpZiBvcHRpb25zLnRlc3RzX3Jvb3RfZGlyZWN0b3J5ICE9IE5vbmU6CisgICAgIyBpZiBvcHRpb25zLnRlc3RzX3Jvb3RfZGlyZWN0b3J5IGlzIGFic29sdXRlLCBvcy5nZXRjd2QoKSBpcyBkaXNjYXJkZWQhCisgICAgdGVzdHNfcm9vdF9kaXJlY3RvcnkgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgb3B0aW9ucy50ZXN0c19yb290X2RpcmVjdG9yeSkpCisgICAgc2VydmVyX29wdGlvbnMgPSAiIC0tdGVzdHMtcm9vdC1kaXJlY3Rvcnk9IiArIHRlc3RzX3Jvb3RfZGlyZWN0b3J5CisgIGVsc2U6CisgICAgc2VydmVyX29wdGlvbnMgPSAiIjsKKworICAjIFJlc3RhcnQgdGhlIHNlcnZlcgorICBjbWQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkpLCAicnVuX2FwYWNoZTIucHkiKSArIHNlcnZlcl9vcHRpb25zICsgIiByZXN0YXJ0IgorICBvcy5zeXN0ZW0oY21kKTsKKworICAjIFJ1biB0aGUgdGVzdHMgaW4gcGF0aAorICBhZGJfY21kID0gImFkYiIKKyAgaWYgb3B0aW9ucy5zZXJpYWw6CisgICAgYWRiX2NtZCArPSAiIC1zICIgKyBvcHRpb25zLnNlcmlhbAorICBjbWQgPSBhZGJfY21kICsgIiBzaGVsbCBhbSBpbnN0cnVtZW50ICIKKyAgY21kICs9ICItZSBjbGFzcyBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydC5TdGFydGVyI3N0YXJ0TGF5b3V0VGVzdHMgIgorICBjbWQgKz0gIi1lIHBhdGggXCIiICsgcGF0aCArICJcIiAiCisgIGNtZCArPSAiLXcgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyL2NvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisKKyAgbG9nZ2luZy5pbmZvKCJSdW5uaW5nIHRoZSB0ZXN0cy4uLiIpCisgIChzdGRvdXRkYXRhLCBzdGRlcnJkYXRhKSA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpCisgIGlmIHJlLnNlYXJjaCgiXklOU1RSVU1FTlRBVElPTl9TVEFUVVNfQ09ERTogLTEiLCBzdGRvdXRkYXRhLCByZS5NVUxUSUxJTkUpICE9IE5vbmU6CisgICAgbG9nZ2luZy5pbmZvKCJGYWlsZWQgdG8gcnVuIHRoZSB0ZXN0cy4gSXMgRHVtcFJlbmRlclRyZWUyIGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlPyIpCisgICAgcmV0dXJuCisKKyAgbG9nZ2luZy5pbmZvKCJEb3dubG9hZGluZyB0aGUgc3VtbWFyaWVzLi4uIikKKworICAjIERvd25sb2FkIHRoZSB0eHQgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIHN1bW1hcnlfdHh0X3RtcF9wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgU1VNTUFSWV9UWFQpCisgIGNtZCA9ICJybSAtZiAiICsgc3VtbWFyeV90eHRfdG1wX3BhdGggKyAiOyIKKyAgY21kICs9IGFkYl9jbWQgKyAiIHB1bGwgIiArIFJFU1VMVFNfQUJTT0xVVEVfUEFUSCArIFNVTU1BUllfVFhUICsgIiAiICsgc3VtbWFyeV90eHRfdG1wX3BhdGgKKyAgc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPVRydWUpLndhaXQoKQorCisgICMgRG93bmxvYWQgdGhlIGh0bWwgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIGRldGFpbHNfaHRtbF90bXBfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIERFVEFJTFNfSFRNTCkKKyAgY21kID0gInJtIC1mICIgKyBkZXRhaWxzX2h0bWxfdG1wX3BhdGggKyAiOyIKKyAgY21kICs9IGFkYl9jbWQgKyAiIHB1bGwgIiArIFJFU1VMVFNfQUJTT0xVVEVfUEFUSCArIERFVEFJTFNfSFRNTCArICIgIiArIGRldGFpbHNfaHRtbF90bXBfcGF0aAorICBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSkud2FpdCgpCisKKyAgIyBQcmludCBzdW1tYXJ5IHRvIGNvbnNvbGUKKyAgbG9nZ2luZy5pbmZvKCJBbGwgZG9uZS5cbiIpCisgIGNtZCA9ICJjYXQgIiArIHN1bW1hcnlfdHh0X3RtcF9wYXRoCisgIG9zLnN5c3RlbShjbWQpCisgIGxvZ2dpbmcuaW5mbygiIikKKworICAjIE9wZW4gdGhlIGJyb3dzZXIgd2l0aCBzdW1tYXJ5CisgIGlmIG9wdGlvbnMuc2hvd19yZXN1bHRzX2luX2Jyb3dzZXIgIT0gImZhbHNlIjoKKyAgICB3ZWJicm93c2VyLm9wZW4oZGV0YWlsc19odG1sX3RtcF9wYXRoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBvcHRpb25fcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSJVc2FnZTogJXByb2cgW29wdGlvbnNdIHRlc3QtcmVsYXRpdmUtcGF0aCIpCisgIG9wdGlvbl9wYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tc2hvdy1yZXN1bHRzLWluLWJyb3dzZXIiLCBkZWZhdWx0PSJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNob3cgdGhlIHJlc3VsdHMgdGhlIGhvc3QncyBkZWZhdWx0IHdlYiBicm93c2VyLCBkZWZhdWx0PXRydWUiKQorICBvcHRpb25fcGFyc2VyLmFkZF9vcHRpb24oIiIsICItLXRlc3RzLXJvb3QtZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byB0YWtlIHRoZSB0ZXN0cywgZGVmYXVsdCBpcyBleHRlcm5hbC93ZWJraXQvTGF5b3V0VGVzdHMgaW4gdGhpcyBjaGVja291dCBvZiB0aGUgQW5kcm9pZCB0cmVlIikKKyAgb3B0aW9uX3BhcnNlci5hZGRfb3B0aW9uKCItcyIsICItLXNlcmlhbCIsIGRlZmF1bHQ9Tm9uZSwgaGVscD0iU3BlY2lmeSB0aGUgc2VyaWFsIG51bWJlciBvZiBkZXZpY2UgdG8gcnVuIHRlc3Qgb24iKQorICBvcHRpb25zLCBhcmdzID0gb3B0aW9uX3BhcnNlci5wYXJzZV9hcmdzKCk7CisgIG1haW4ob3B0aW9ucywgYXJncyk7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzZmNlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvZm9sZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL3J1bnRlc3QucG5nIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBjNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1NzhhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvbGF5b3V0L2Rpcmxpc3Rfcm93LnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjgwcHgiCisgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxNXB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI2MHB4IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKKyAgICAvPgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL21lbnUvZ3VpX21lbnUueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9tZW51L2d1aV9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIyYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9tZW51L2d1aV9tZW51LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvcnVuX2FsbCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3J1bl9hbGxfdGVzdHMiIC8+Cis8L21lbnU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk2NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCI+RGlyZWN0b3J5Ojwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnIj5UaGlzIHdpbGwgcnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbAorICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yaWVzLiBJdCBtYXkgdGFrZSBhIGZldyBob3VycyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiI+UnVuIHRlc3RzITwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uIj5BYm9ydDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfdGl0bGUiPkxvYWRpbmcgaXRlbXMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfbXNnIj5QbGVhc2Ugd2FpdC4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5uZXJfcHJlbG9hZGluZ190aXRsZSI+UHJlbG9hZGluZyB0ZXN0cy4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5fYWxsX3Rlc3RzIj5SdW4gYWxsIHRlc3RzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeTwvc3RyaW5nPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3R5bGUueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3R5bGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjM0MTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHlsZS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3R5bGUgbmFtZT0iV2hpdGVCYWNrZ3JvdW5kIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci93aGl0ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWJzdHJhY3RSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0YjAzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50IGEgcmVzdWx0IG9mIHRoZSB0ZXN0LiBJdCBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIHRoZSByZXN1bHQncworICogcmF3IGRhdGEgYW5kIGdlbmVyYXRpbmcgaXRzIG93biBkaWZmIGluIEhUTUwgZm9ybWF0LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXN1bHQgaW1wbGVtZW50cyBDb21wYXJhYmxlPEFic3RyYWN0UmVzdWx0PiwgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFic3RyYWN0UmVzdWx0IjsKKworICAgIHB1YmxpYyBlbnVtIFRlc3RUeXBlIHsKKyAgICAgICAgVEVYVCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFJlc3VsdChidW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBSRU5ERVJfVFJFRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBSZW5kZXJUcmVlIHRlc3RzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyBhY3R1YWwgYW5kIGV4cGVjdGVkIHJlc3VsdHMuCisgICAgICovCisgICAgcHVibGljIGVudW0gUmVzdWx0Q29kZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIFJFU1VMVFNfTUFUQ0goIlJlc3VsdHMgbWF0Y2giKSwKKyAgICAgICAgUkVTVUxUU19ESUZGRVIoIlJlc3VsdHMgZGlmZmVyIiksCisgICAgICAgIE5PX0VYUEVDVEVEX1JFU1VMVCgiTm8gZXhwZWN0ZWQgcmVzdWx0IiksCisgICAgICAgIE5PX0FDVFVBTF9SRVNVTFQoIk5vIGFjdHVhbCByZXN1bHQiKTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBtVGl0bGU7CisKKyAgICAgICAgcHJpdmF0ZSBSZXN1bHRDb2RlKFN0cmluZyB0aXRsZSkgeworICAgICAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcgbUFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nOworCisgICAgcHVibGljIGludCBjb21wYXJlVG8oQWJzdHJhY3RSZXN1bHQgYW5vdGhlcikgeworICAgICAgICByZXR1cm4gZ2V0UmVsYXRpdmVQYXRoKCkuY29tcGFyZVRvKGFub3RoZXIuZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKFN0cmluZyBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZykgeworICAgICAgICBtQWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgPSBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbUFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbnVsbDsKKyAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKKyAgICAgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QodGhpcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChiYW9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5hYmxlIHRvIHNlcmlhbGl6ZSByZXN1bHQ6ICIgKyBnZXRSZWxhdGl2ZVBhdGgoKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmFvcyA9PSBudWxsID8gbnVsbCA6IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0UmVzdWx0IGNyZWF0ZShieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG51bGw7CisgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG51bGw7CisgICAgICAgIEFic3RyYWN0UmVzdWx0IHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOworICAgICAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAoQWJzdHJhY3RSZXN1bHQpb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGJhaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiYWlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmFibGUgdG8gZGVzZXJpYWxpemUgcmVzdWx0ISIsIGUpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmFibGUgdG8gZGVzZXJpYWxpemUgcmVzdWx0ISIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJSZXN1bHRzKCkgeworICAgICAgICBtQWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSByZXN1bHQgb2JqZWN0IG9idGFpbiB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdCBmcm9tIHRoZSB3ZWJ2aWV3CisgICAgICogYW5kIHN0b3JlIHRoZW0gaW4gdGhlIGZvcm1hdCB0aGF0IHN1aXRzIGl0c2VsZiBiZXN0cy4gVGhpcyBtZXRob2QgaXMgYXN5bmNocm9ub3VzLgorICAgICAqIFRoZSBtZXNzYWdlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBpcyBhIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgc2VudCB0byBpdHMgdGFyZ2V0CisgICAgICogd2hlbiB0aGUgcmVzdWx0IGZpbmlzaGVzIG9idGFpbmluZyB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYnZpZXcKKyAgICAgKiBAcGFyYW0gcmVzdWx0T2J0YWluZWRNc2cKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvYnRhaW5BY3R1YWxSZXN1bHRzKFdlYlZpZXcgd2VidmlldywgTWVzc2FnZSByZXN1bHRPYnRhaW5lZE1zZyk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0KGJ5dGVbXSBleHBlY3RlZFJlc3VsdCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEV4cGVjdGVkVGV4dFJlc3VsdChTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyByZXN1bHQncyBpbWFnZSBkYXRhIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIGRpc2suIEl0IGNhbiBiZSBudWxsCisgICAgICogaWYgdGhlcmUgaXMgYW4gZXJyb3Igb2Ygc29tZSBzb3J0IG9yIGZvciBleGFtcGxlIHRoZSB0ZXN0IHRpbWVzIG91dC4KKyAgICAgKgorICAgICAqIDxwPiBTb21lIHRlc3RzIHdpbGwgbm90IHByb3ZpZGUgZGF0YSAobGlrZSB0ZXh0IHRlc3RzKQorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgcmVzdWx0cyBpbWFnZSBkYXRhCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRBY3R1YWxJbWFnZVJlc3VsdCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyByZXN1bHQncyB0ZXh0IGRhdGEuIEl0IGNhbiBiZSBudWxsCisgICAgICogaWYgdGhlcmUgaXMgYW4gZXJyb3Igb2Ygc29tZSBzb3J0IG9yIGZvciBleGFtcGxlIHRoZSB0ZXN0IHRpbWVzIG91dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHJlc3VsdHMgdGV4dCBkYXRhCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRBY3R1YWxUZXh0UmVzdWx0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgY29kZSByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgYWN0dWFsIGFuZCBleHBlY3RlZCByZXN1bHRzLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgdGhlIHN0YXR1cyBjb2RlIGZyb20gY29tcGFyaW5nIGFjdHVhbCBhbmQgZXhwZWN0ZWQgcmVzdWx0cworICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZXN1bHRDb2RlIGdldFJlc3VsdENvZGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHRlc3QgY3Jhc2hlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHdoZXRoZXIgdGhpcyB0ZXN0IGNyYXNoZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkaWRDcmFzaCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdGVzdCB0aW1lZCBvdXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB3aGV0aGVyIHRoaXMgdGVzdCB0aW1lZCBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkaWRUaW1lT3V0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoYXQgdGhpcyB0ZXN0IHRpbWVkIG91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaWRUaW1lT3V0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRlc3QgcGFzc2VkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgd2hldGhlciB0aGUgdGVzdCBwYXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkaWRQYXNzKCkgeworICAgICAgICAvLyBUZXN0cyB0aGF0IGNyYXNoIGNhbid0IGhhdmUgdGltZWQgb3V0IG9yIGhhdmUgYW4gYWN0dWFsIHJlc3VsdC4KKyAgICAgICAgYXNzZXJ0ICEoZGlkQ3Jhc2goKSAmJiBkaWRUaW1lT3V0KCkpOworICAgICAgICBhc3NlcnQgIShkaWRDcmFzaCgpICYmIGdldFJlc3VsdENvZGUoKSAhPSBSZXN1bHRDb2RlLk5PX0FDVFVBTF9SRVNVTFQpOworICAgICAgICByZXR1cm4gIWRpZENyYXNoKCkgJiYgIWRpZFRpbWVPdXQoKSAmJiBnZXRSZXN1bHRDb2RlKCkgPT0gUmVzdWx0Q29kZS5SRVNVTFRTX01BVENIOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFRlc3RUeXBlIGdldFR5cGUoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGllY2Ugb2YgSFRNTCBjb2RlIHRoYXQgcHJlc2VudHMgYSB2aXN1YWwgZGlmZiBiZXR3ZWVuIGEgcmVzdWx0IGFuZAorICAgICAqIHRoZSBleHBlY3RlZCByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhIHBpZWNlIG9mIEhUTUwgY29kZSB3aXRoIGEgdmlzdWFsIGRpZmYgYmV0d2VlbiB0aGUgcmVzdWx0IGFuZCB0aGUgZXhwZWN0ZWQgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaWZmQXNIdG1sKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQnVuZGxlIGdldEJ1bmRsZSgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWRkaXRpb25hbFRleHRPdXRwdXQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5YTkxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIEEgY2xhc3MgdGhhdCBzdG9yZXMgY29uc29sZXMgbWVzc2FnZXMsIGRhdGFiYXNlIGNhbGxiYWNrcywgYWxlcnQgbWVzc2FnZXMsIGV0Yy4KKyAqLworcHVibGljIGNsYXNzIEFkZGl0aW9uYWxUZXh0T3V0cHV0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBZGRpdGlvbmFsVGV4dE91dHB1dCI7CisKKyAgICAvKioKKyAgICAgKiBPcmRlcmluZyBvZiBlbnVtcyBpcyBpbXBvcnRhbnQgYXMgaXQgZGV0ZXJtaW5lcyBvcmRlcmluZyBvZiB0aGUgdG9TdHJpbmcgbWV0aG9kIQorICAgICAqIFN0cmluZ0J1aWxkZXJzIHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgb3JkZXIgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgYXBwZWFyIGhlcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBlbnVtIE91dHB1dFR5cGUgeworICAgICAgICBKU19ESUFMT0csCisgICAgICAgIEVYQ0VFREVEX0RCX1FVT1RBX01FU1NBR0UsCisgICAgICAgIENPTlNPTEVfTUVTU0FHRTsKKyAgICB9CisKKyAgICBTdHJpbmdCdWlsZGVyW10gbU91dHB1dHMgPSBuZXcgU3RyaW5nQnVpbGRlcltPdXRwdXRUeXBlLnZhbHVlcygpLmxlbmd0aF07CisKKyAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZSBvdXRwdXRUeXBlKSB7CisgICAgICAgIGludCBpbmRleCA9IG91dHB1dFR5cGUub3JkaW5hbCgpOworICAgICAgICBpZiAobU91dHB1dHNbaW5kZXhdID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PdXRwdXRzW2luZGV4XSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1PdXRwdXRzW2luZGV4XTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRFeGNlZWRlZERiUXVvdGFNZXNzYWdlKFN0cmluZyB1cmxTdHJpbmcsIFN0cmluZyBkYXRhYmFzZUlkZW50aWZpZXIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkVYQ0VFREVEX0RCX1FVT1RBX01FU1NBR0UpOworCisgICAgICAgIFN0cmluZyBwcm90b2NvbCA9ICIiOworICAgICAgICBTdHJpbmcgaG9zdCA9ICIiOworICAgICAgICBpbnQgcG9ydCA9IDA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7CisgICAgICAgICAgICBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOworICAgICAgICAgICAgaG9zdCA9IHVybC5nZXRIb3N0KCk7CisgICAgICAgICAgICBpZiAodXJsLmdldFBvcnQoKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHVybC5nZXRQb3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAidXJsU3RyaW5nPSIgKyB1cmxTdHJpbmcgKyAiIGRhdGFiYXNlSWRlbnRpZmllcj0iICsgZGF0YWJhc2VJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dC5hcHBlbmQoIlVJIERFTEVHQVRFIERBVEFCQVNFIENBTExCQUNLOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiZXhjZWVkZWREYXRhYmFzZVF1b3RhRm9yU2VjdXJpdHlPcmlnaW46eyIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKHByb3RvY29sICsgIiwgIiArIGhvc3QgKyAiLCAiICsgcG9ydCArICJ9ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCJkYXRhYmFzZToiICsgZGF0YWJhc2VJZGVudGlmaWVyICsgIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kQ29uc29sZU1lc3NhZ2UoQ29uc29sZU1lc3NhZ2UgY29uc29sZU1lc3NhZ2UpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkNPTlNPTEVfTUVTU0FHRSk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIgKyBjb25zb2xlTWVzc2FnZS5saW5lTnVtYmVyKCkpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCI6ICIgKyBjb25zb2xlTWVzc2FnZS5tZXNzYWdlKCkgKyAiXG4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRKc0FsZXJ0KFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkFMRVJUOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnXG4nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRKc0NvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkpTX0RJQUxPRyk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiQ09ORklSTTogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNQcm9tcHQoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkpTX0RJQUxPRyk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiUFJPTVBUOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiLCBkZWZhdWx0IHRleHQ6ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1PdXRwdXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU91dHB1dHNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobU91dHB1dHNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0NyYXNoZWREdW1teVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzExNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKKy8qKgorICogQSBkdW1teSBjbGFzcyByZXByZXNlbnRpbmcgdGVzdCB0aGF0IGNyYXNoZWQuCisgKgorICogVE9ETzogQWxsIHRoZSBtZXRob2RzIHJlZ2FyZGluZyBleHBlY3RlZCByZXN1bHRzIG5lZWQgaW1wbGVtZW50aW5nLgorICovCitwdWJsaWMgY2xhc3MgQ3Jhc2hlZER1bW15UmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RSZXN1bHQgeworICAgIFN0cmluZyBtUmVsYXRpdmVQYXRoOworCisgICAgcHVibGljIENyYXNoZWREdW1teVJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXSBnZXRBY3R1YWxJbWFnZVJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBY3R1YWxUZXh0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKKyAgICAgICAgLyoqIFRPRE86ICAqLworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpZmZBc0h0bWwoKSB7CisgICAgICAgIC8qKiBUT0RPOiBQcm9iYWJseSBzaG93IGF0IGxlYXN0IGV4cGVjdGVkIHJlc3VsdHMgKi8KKyAgICAgICAgcmV0dXJuICJPb29wcywgSSBjcmFzaGVkLi4uIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdENvZGUuTk9fQUNUVUFMX1JFU1VMVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBkaWRDcmFzaCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGlkVGltZU91dCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldERpZFRpbWVPdXQoKSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHMoV2ViVmlldyB3ZWJ2aWV3LCBNZXNzYWdlIHJlc3VsdE9idGFpbmVkTXNnKSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgLyoqIFRPRE8gKi8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aCgpIHsKKyAgICAgICAgLyoqIFRPRE8gKi8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKCkgeworICAgICAgICAvKiogVE9ETyAqLworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3Y2JjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGFjdHMgYXMgYSBKUyBpbnRlcmZhY2UgZm9yIHdlYnZpZXcgdG8gbW9jayB2YXJpb3VzIHRvdWNoIGV2ZW50cywKKyAqIG1vdXNlIGFjdGlvbnMgYW5kIGtleSBwcmVzc2VzLgorICoKKyAqIFRoZSBtZXRob2RzIGhlcmUganVzdCBjYWxsIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvbiBFdmVudFNlbmRlckltcGwKKyAqIHRoYXQgY29udGFpbnMgdGhlIGxvZ2ljIG9mIGhvdyB0byBleGVjdXRlIHRoZSBtZXRob2RzLgorICovCitwdWJsaWMgY2xhc3MgRXZlbnRTZW5kZXIgeworICAgIEV2ZW50U2VuZGVySW1wbCBtRXZlbnRTZW5kZXJJbXBsID0gbmV3IEV2ZW50U2VuZGVySW1wbCgpOworCisgICAgcHVibGljIHZvaWQgcmVzZXQoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwucmVzZXQod2ViVmlldyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5lbmFibGVET01VSUV2ZW50TG9nZ2luZyhkb21Ob2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5maXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQoZG9tTm9kZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQga2V5RG93bihTdHJpbmcgY2hhcmFjdGVyLCBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwua2V5RG93bihjaGFyYWN0ZXIsIHdpdGhNb2RpZmllcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtleURvd24oU3RyaW5nIGNoYXJhY3RlcikgeworICAgICAgICBrZXlEb3duKGNoYXJhY3RlciwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbGVhcEZvcndhcmQoaW50IG1pbGxpc2Vjb25kcykgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmxlYXBGb3J3YXJkKG1pbGxpc2Vjb25kcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VDbGljaygpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZUNsaWNrKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VEb3duKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLm1vdXNlRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZVRvKGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLm1vdXNlTW92ZVRvKHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubW91c2VVcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoU3RhcnQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hTdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRvdWNoUG9pbnQoaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuYWRkVG91Y2hQb2ludCh4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUb3VjaFBvaW50KGludCBpZCwgaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudXBkYXRlVG91Y2hQb2ludChpZCwgeCwgeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VG91Y2hNb2RpZmllcihTdHJpbmcgbW9kaWZpZXIsIGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnNldFRvdWNoTW9kaWZpZXIobW9kaWZpZXIsIGVuYWJsZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoTW92ZSgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC50b3VjaE1vdmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5yZWxlYXNlVG91Y2hQb2ludChpZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hFbmQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaENhbmNlbCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC50b3VjaENhbmNlbCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyVG91Y2hQb2ludHMoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuY2xlYXJUb3VjaFBvaW50cygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbFRvdWNoUG9pbnQoaW50IGlkKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuY2FuY2VsVG91Y2hQb2ludChpZCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVySW1wbC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiY2YxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBFdmVudFNlbmRlcgorICovCitwdWJsaWMgY2xhc3MgRXZlbnRTZW5kZXJJbXBsIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJFdmVudFNlbmRlckltcGwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRklSRV9LRVlCT0FSRF9FVkVOVFNfVE9fRUxFTUVOVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19MRUFQX0ZPUldBUkQgPSAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19LRVlfRE9XTiA9IDM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX0RPV04gPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTU9VU0VfVVAgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTU9VU0VfQ0xJQ0sgPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTU9VU0VfTU9WRV9UTyA9IDc7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FERF9UT1VDSF9QT0lOVCA9IDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UT1VDSF9TVEFSVCA9IDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfVE9VQ0hfUE9JTlQgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPVUNIX01PVkUgPSAxMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NMRUFSX1RPVUNIX1BPSU5UUyA9IDEyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfQ0FOQ0VMID0gMTM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19SRUxFQVNFX1RPVUNIX1BPSU5UID0gMTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UT1VDSF9FTkQgPSAxNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9UT1VDSF9NT0RJRklFUiA9IDE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ0FOQ0VMX1RPVUNIX1BPSU5UID0gMTc7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRvdWNoUG9pbnQgeworICAgICAgICBXZWJWaWV3IG1XZWJWaWV3OworICAgICAgICBwcml2YXRlIGludCBtSWQ7CisgICAgICAgIHByaXZhdGUgaW50IG1YOworICAgICAgICBwcml2YXRlIGludCBtWTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1Eb3duVGltZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWxlYXNlZCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1vdmVkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsbGVkID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIFRvdWNoUG9pbnQoV2ViVmlldyB3ZWJWaWV3LCBpbnQgaWQsIGludCB4LCBpbnQgeSkgeworICAgICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgICAgICBtWCA9IHNjYWxlWCh4KTsKKyAgICAgICAgICAgIG1ZID0gc2NhbGVZKHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgICByZXR1cm4gbUlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRYKCkgeworICAgICAgICAgICAgcmV0dXJuIG1YOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRZKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ZOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW92ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1vdmVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbW92ZShpbnQgbmV3WCwgaW50IG5ld1kpIHsKKyAgICAgICAgICAgIG1YID0gc2NhbGVYKG5ld1gpOworICAgICAgICAgICAgbVkgPSBzY2FsZVkobmV3WSk7CisgICAgICAgICAgICBtTW92ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXRIYXNNb3ZlZCgpIHsKKyAgICAgICAgICAgIG1Nb3ZlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0RG93blRpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbURvd25UaW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RG93blRpbWUobG9uZyBkb3duVGltZSkgeworICAgICAgICAgICAgbURvd25UaW1lID0gZG93blRpbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbGVhc2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZWxlYXNlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgICAgICBtUmVsZWFzZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbmNlbGxlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgICAgIG1DYW5jZWxsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgc2NhbGVYKGludCB4KSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkoeCAqIG1XZWJWaWV3LmdldFNjYWxlKCkpIC0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgc2NhbGVZKGludCB5KSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkoeSAqIG1XZWJWaWV3LmdldFNjYWxlKCkpIC0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRvdWNoUG9pbnQ+IG1Ub3VjaFBvaW50czsKKyAgICBwcml2YXRlIGludCBtVG91Y2hNZXRhU3RhdGU7CisgICAgcHJpdmF0ZSBpbnQgbU1vdXNlWDsKKyAgICBwcml2YXRlIGludCBtTW91c2VZOworCisgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OworCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1FdmVudFNlbmRlckhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGU7CisgICAgICAgICAgICBNb3Rpb25FdmVudCBldmVudDsKKyAgICAgICAgICAgIGxvbmcgdHM7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkc6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBpbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19GSVJFX0tFWUJPQVJEX0VWRU5UU19UT19FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTEVBUF9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfS0VZX0RPV046CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJhY3RlciA9IGJ1bmRsZS5nZXRTdHJpbmcoImNoYXJhY3RlciIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzID0gYnVuZGxlLmdldFN0cmluZ0FycmF5KCJ3aXRoTW9kaWZpZXJzIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhNb2RpZmllcnMgIT0gbnVsbCAmJiB3aXRoTW9kaWZpZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aE1vZGlmaWVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyVG9LZXlDb2RlKHdpdGhNb2RpZmllcnNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhclRvS2V5Q29kZShjaGFyYWN0ZXIudG9Mb3dlckNhc2UoKS50b0NoYXJBcnJheSgpWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyoqIE1PVVNFICovCisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9ET1dOOgorICAgICAgICAgICAgICAgICAgICB0cyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBldmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbih0cywgdHMsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCBtTW91c2VYLCBtTW91c2VZLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9VUDoKKyAgICAgICAgICAgICAgICAgICAgdHMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4odHMsIHRzLCBNb3Rpb25FdmVudC5BQ1RJT05fVVAsIG1Nb3VzZVgsIG1Nb3VzZVksIDApOworICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vblRvdWNoRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01PVVNFX0NMSUNLOgorICAgICAgICAgICAgICAgICAgICBtb3VzZURvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgbW91c2VVcCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01PVVNFX01PVkVfVE86CisgICAgICAgICAgICAgICAgICAgIG1Nb3VzZVggPSBtc2cuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgbU1vdXNlWSA9IG1zZy5hcmcyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8qKiBUT1VDSCAqLworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUREX1RPVUNIX1BPSU5UOgorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtUG9pbnRzID0gZ2V0VG91Y2hQb2ludHMoKS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVBvaW50cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KG51bVBvaW50cyAtIDEpLmdldElkKCkgKyAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkuYWRkKG5ldyBUb3VjaFBvaW50KG1XZWJWaWV3LCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwgbXNnLmFyZzIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1VDSF9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRUb3VjaFBvaW50cygpLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChpKS5zZXREb3duVGltZShTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRvdWNoRXZlbnQoTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlID0gKEJ1bmRsZSltc2cub2JqOworCisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGJ1bmRsZS5nZXRJbnQoImlkIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19VUERBVEVfVE9VQ0hfUE9JTlQiLCAiVG91Y2hQb2ludCBvdXQgb2YgYm91bmRzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChpbmRleCkubW92ZShidW5kbGUuZ2V0SW50KCJ4IiksIGJ1bmRsZS5nZXRJbnQoInkiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVE9VQ0hfTU9WRToKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHN1cHBvcnQgbXVsdGktdG91Y2guIEhlbmNlLCB3ZSBvbmx5IGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvdWNoIHBvaW50LiBJbiBmdXR1cmUgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHJld3JpdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRUb3VjaFBvaW50cygpLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChpKS5yZXNldEhhc01vdmVkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19SRUxFQVNFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQobXNnLmFyZzEpLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX0NBTkNFTDoKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHN1cHBvcnQgbXVsdGktdG91Y2guIEhlbmNlLCB3ZSBvbmx5IGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvdWNoIHBvaW50LiBJbiBmdXR1cmUgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHJld3JpdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19SRUxFQVNFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQobXNnLmFyZzEpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1VDSF9FTkQ6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fVVApOworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVsZWFzZWQgcG9pbnRzLgorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZ2V0VG91Y2hQb2ludHMoKS5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmlzUmVsZWFzZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX1RPVUNIX01PRElGSUVSOgorICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSAoQnVuZGxlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2RpZmllciA9IGJ1bmRsZS5nZXRTdHJpbmcoIm1vZGlmaWVyIik7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IGJ1bmRsZS5nZXRCb29sZWFuKCJlbmFibGVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IG1hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoImFsdCIuZXF1YWxzKG1vZGlmaWVyLnRvTG93ZXJDYXNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gS2V5RXZlbnQuTUVUQV9BTFRfT047CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNoaWZ0Ii5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NISUZUX09OOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJjdHJsIi5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NZTV9PTjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNZXRhU3RhdGUgfD0gbWFzazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSAmPSB+bWFzazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xFQVJfVE9VQ0hfUE9JTlRTOgorICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHZvaWQgcmVzZXQoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgbVRvdWNoUG9pbnRzID0gbnVsbDsKKyAgICAgICAgbVRvdWNoTWV0YVN0YXRlID0gMDsKKyAgICAgICAgbU1vdXNlWCA9IDA7CisgICAgICAgIG1Nb3VzZVkgPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZURPTVVJRXZlbnRMb2dnaW5nKGludCBkb21Ob2RlKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkcpOworICAgICAgICBtc2cuYXJnMSA9IGRvbU5vZGU7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0ZJUkVfS0VZQk9BUkRfRVZFTlRTX1RPX0VMRU1FTlQpOworICAgICAgICBtc2cuYXJnMSA9IGRvbU5vZGU7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsZWFwRm9yd2FyZChpbnQgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19MRUFQX0ZPUldBUkQpOworICAgICAgICBtc2cuYXJnMSA9IG1pbGxpc2Vjb25kczsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtleURvd24oU3RyaW5nIGNoYXJhY3RlciwgU3RyaW5nW10gd2l0aE1vZGlmaWVycykgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJjaGFyYWN0ZXIiLCBjaGFyYWN0ZXIpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nQXJyYXkoIndpdGhNb2RpZmllcnMiLCB3aXRoTW9kaWZpZXJzKTsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19LRVlfRE9XTiwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKiogTU9VU0UgKi8KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bigpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19NT1VTRV9ET1dOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX1VQKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX0NMSUNLKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmVUbyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19NT1VTRV9NT1ZFX1RPLCB4LCB5KS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKiogVE9VQ0ggKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZFRvdWNoUG9pbnQoaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQUREX1RPVUNIX1BPSU5ULCB4LCB5KS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaFN0YXJ0KCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1RPVUNIX1NUQVJUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUb3VjaFBvaW50KGludCBpZCwgaW50IHgsIGludCB5KSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoImlkIiwgaWQpOworICAgICAgICBidW5kbGUucHV0SW50KCJ4IiwgeCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoInkiLCB5KTsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19VUERBVEVfVE9VQ0hfUE9JTlQsIGJ1bmRsZSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hNb3ZlKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1RPVUNIX01PVkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbFRvdWNoUG9pbnQoaW50IGlkKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQpOworICAgICAgICBtc2cuYXJnMSA9IGlkOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hDYW5jZWwoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfQ0FOQ0VMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQpOworICAgICAgICBtc2cuYXJnMSA9IGlkOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hFbmQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfRU5EKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb3VjaE1vZGlmaWVyKFN0cmluZyBtb2RpZmllciwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoIm1vZGlmaWVyIiwgbW9kaWZpZXIpOworICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiZW5hYmxlZCIsIGVuYWJsZWQpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9UT1VDSF9NT0RJRklFUiwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclRvdWNoUG9pbnRzKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0NMRUFSX1RPVUNIX1BPSU5UUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRvdWNoUG9pbnQ+IGdldFRvdWNoUG9pbnRzKCkgeworICAgICAgICBpZiAobVRvdWNoUG9pbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Ub3VjaFBvaW50cyA9IG5ldyBMaW5rZWRMaXN0PFRvdWNoUG9pbnQ+KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVRvdWNoUG9pbnRzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVG91Y2hFdmVudChpbnQgYWN0aW9uKSB7CisgICAgICAgIGludCBudW1Qb2ludHMgPSBnZXRUb3VjaFBvaW50cygpLnNpemUoKTsKKyAgICAgICAgaW50W10gcG9pbnRlcklkcyA9IG5ldyBpbnRbbnVtUG9pbnRzXTsKKyAgICAgICAgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIHBvaW50ZXJDb29yZHMgPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tudW1Qb2ludHNdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyArK2kpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNOZWVkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHN3aXRjaChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgICAgICBpc05lZWRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgICAgIGlzTmVlZGVkID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoaSkuaGFzTW92ZWQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKKyAgICAgICAgICAgICAgICBpc05lZWRlZCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmlzQ2FuY2VsbGVkKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpleGVjdXRlVG91Y2hFdmVudCgpLCIsICJhY3Rpb24gbm90IHN1cHBvcnRlZDoiICsgYWN0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtUG9pbnRzID0gMDsKKyAgICAgICAgICAgIGlmIChpc05lZWRlZCkgeworICAgICAgICAgICAgICAgIHBvaW50ZXJJZHNbbnVtUG9pbnRzXSA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmdldElkKCk7CisgICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tudW1Qb2ludHNdID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMoKTsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzW251bVBvaW50c10ueCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmdldFgoKTsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzW251bVBvaW50c10ueSA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmdldFkoKTsKKyAgICAgICAgICAgICAgICArK251bVBvaW50czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1Qb2ludHMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obVRvdWNoUG9pbnRzLmdldCgwKS5nZXREb3duVGltZSgpLAorICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLCBhY3Rpb24sCisgICAgICAgICAgICAgICAgbnVtUG9pbnRzLCBwb2ludGVySWRzLCBwb2ludGVyQ29vcmRzLAorICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSwgMS4wZiwgMS4wZiwgMCwgMCwgMCwgMCk7CisKKyAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUtleUV2ZW50KGludCBhY3Rpb24sIGludCBrZXlDb2RlKSB7CisgICAgICAgIEtleUV2ZW50IGV2ZW50ID0gbmV3IEtleUV2ZW50KGFjdGlvbiwga2V5Q29kZSk7CisgICAgICAgIG1XZWJWaWV3Lm9uS2V5RG93bihldmVudC5nZXRLZXlDb2RlKCksIGV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3N1bWVzIGxvd2VyY2FzZSBjaGFycywgY2FzZSBuZWVkcyB0byBiZSBoYW5kbGVkIGJ5IGNhbGxpbmcgZnVuY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNoYXJUb0tleUNvZGUoY2hhciBjKSB7CisgICAgICAgIC8vIGhhbmRsZSBudW1iZXJzCisgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IGMgLSAnMCc7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV8wICsgb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIGNoYXJhY3RlcnMKKyAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYyAtICdhJzsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0EgKyBvZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgYWxsIG90aGVycworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJyonOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NUQVI7CisKKyAgICAgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1BPVU5EOworCisgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9DT01NQTsKKworICAgICAgICAgICAgY2FzZSAnLic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfUEVSSU9EOworCisgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfVEFCOworCisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRTsKKworICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOworCisgICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICBjYXNlIDB4N0Y6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfREVMOworCisgICAgICAgICAgICBjYXNlICd+JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9HUkFWRTsKKworICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfTUlOVVM7CisKKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0VRVUFMUzsKKworICAgICAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfTEVGVF9CUkFDS0VUOworCisgICAgICAgICAgICBjYXNlICcpJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9SSUdIVF9CUkFDS0VUOworCisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQkFDS1NMQVNIOworCisgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TRU1JQ09MT047CisKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9BUE9TVFJPUEhFOworCisgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TTEFTSDsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBtb2RpZmllclRvS2V5Q29kZShTdHJpbmcgbW9kaWZpZXIpIHsKKyAgICAgICAgaWYgKG1vZGlmaWVyLmVxdWFscygiY3RybEtleSIpKSB7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9BTFRfTEVGVDsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5lcXVhbHMoInNoaWZ0S2V5IikpIHsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQ7CisgICAgICAgIH0gZWxzZSBpZiAobW9kaWZpZXIuZXF1YWxzKCJhbHRLZXkiKSkgeworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU1lNOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfVU5LTk9XTjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9GaWxlRmlsdGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9GaWxlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiZjY0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB1dGlsaXR5IHRvIGZpbHRlciBvdXQgc29tZSBmaWxlcy9kaXJlY3RvcmllcyBmcm9tIHRoZSB2aWV3cyBhbmQgdGVzdHMgdGhhdCBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlRmlsdGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGaWxlRmlsdGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VYUEVDVEFUSU9OU19UWFRfUEFUSCA9CisgICAgICAgICAgICAicGxhdGZvcm0vYW5kcm9pZC90ZXN0X2V4cGVjdGF0aW9ucy50eHQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVEVTVFNfUEFUSCA9ICJodHRwL3Rlc3RzLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTF9QQVRIID0gInNzbC8iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0NSQVNIID0gIkNSQVNIIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fRkFJTCA9ICJGQUlMIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fU0xPVyA9ICJTTE9XIjsKKworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gbUNyYXNoTGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1GYWlsTGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1TbG93TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIHB1YmxpYyBGaWxlRmlsdGVyKCkgeworICAgICAgICBsb2FkVGVzdEV4cGVjdGF0aW9ucygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0cmltVHJhaWxpbmdTbGFzaElmUHJlc2VudChTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRUZXN0RXhwZWN0YXRpb25zKCkgeworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoRm9yd2FyZGVyTWFuYWdlci5nZXRIb3N0U2NoZW1lUG9ydChmYWxzZSkgKyAiTGF5b3V0VGVzdHMvIiArCisgICAgICAgICAgICAgICAgICAgIFRFU1RfRVhQRUNUQVRJT05TX1RYVF9QQVRIKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIobmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIEZzVXRpbHMucmVhZERhdGFGcm9tVXJsKHVybCkpKSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHM7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGg7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gdG9rZW5zOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qKiBSZW1vdmUgdGhlIGNvbW1lbnQgYW5kIHRyaW0gKi8KKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBsaW5lLnNwbGl0KCIvLyIsIDIpWzBdLnRyaW0oKTsKKworICAgICAgICAgICAgICAgICAgICAvKiogT21pdCBlbXB0eSBsaW5lcywgYWR2YW5jZSB0byBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiogU3BsaXQgb24gd2hpdGVzcGFjZSBpbnRvIHBhdGggcGFydCBhbmQgdGhlIHJlc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBlbnRyeS5zcGxpdCgiXFxzIiwgMik7CisKKyAgICAgICAgICAgICAgICAgICAgLyoqIEF0IHRoaXMgcG9pbnQgcGFydHMubGVuZ3RoID49IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6cmVsb2FkQ29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBhcmUgbm8gb3B0aW9ucyBzcGVjaWZpZWQgZm9yIHRoZSB0ZXN0ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwYXRoID0gdHJpbVRyYWlsaW5nU2xhc2hJZlByZXNlbnQocGFydHNbMF0pOworCisgICAgICAgICAgICAgICAgICAgIC8qKiBTcGxpdCBvbiB3aGl0ZXNwYWNlICovCisgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChwYXJ0c1sxXS5zcGxpdCgiXFxzIiwgMCkpKTsKKworICAgICAgICAgICAgICAgICAgICAvKiogQ2hvc2UgdGhlIHJpZ2h0IGNvbGxlY3Rpb25zIHRvIGFkZCB0byAqLworICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX0NSQVNIKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNyYXNoTGlzdC5hZGQocGF0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBJZiB0ZXN0IGlzIG9uIHNraXAgbGlzdCB3ZSBpZ25vcmUgYW55IGZ1cnRoZXIgb3B0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX0ZBSUwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmFpbExpc3QuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fU0xPVykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TbG93TGlzdC5hZGQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZFJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkUmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInJlbG9hZENvbmZpZ3VyYXRpb24oKTogRmlsZSBub3QgZm91bmQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJ1cmw9IiArIHVybCwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGVzdCBpcyBleHBlY3RlZCB0byBjcmFzaC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFBhdGggZ2l2ZW4gc2hvdWxkIHJlbGF0aXZlIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIsIGUuZy4gZmFzdC9kb20vZm9vLmh0bWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0UGF0aAorICAgICAqICAgICAgICAgICAgLSBhIHJlbGF0aXZlIHBhdGggd2l0aGluIExheW91dFRlc3RzIGZvbGRlcgorICAgICAqIEByZXR1cm4gaWYgdGhlIHRlc3QgaXMgc3VwcG9zZWQgdG8gYmUgc2tpcHBlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ3Jhc2goU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1DcmFzaExpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IHJlc3VsdCBpcyBzdXBwb3NlZCB0byBiZSAiZmFpbGVkIi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFBhdGggZ2l2ZW4gc2hvdWxkIHJlbGF0aXZlIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIsIGUuZy4gZmFzdC9kb20vZm9vLmh0bWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0UGF0aAorICAgICAqICAgICAgICAgICAgLSBhIHJlbGF0aXZlIHBhdGggd2l0aGluIExheW91dFRlc3RzIGZvbGRlcgorICAgICAqIEByZXR1cm4gaWYgdGhlIHRlc3QgcmVzdWx0IGlzIHN1cHBvc2VkIHRvIGJlICJmYWlsZWQiCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsKFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtRmFpbExpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IGlzIHNsb3cgYW5kIHNob3VsZCBoYXZlIHRpbWVvdXQgaW5jcmVhc2VkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogUGF0aCBnaXZlbiBzaG91bGQgcmVsYXRpdmUgd2l0aGluIExheW91dFRlc3RzIGZvbGRlciwgZS5nLiBmYXN0L2RvbS9mb28uaHRtbAorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RQYXRoCisgICAgICogICAgICAgICAgICAtIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyCisgICAgICogQHJldHVybiBpZiB0aGUgdGVzdCBpcyBzbG93IGFuZCBzaG91bGQgaGF2ZSB0aW1lb3V0IGluY3JlYXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nsb3coU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1TbG93TGlzdC5jb250YWlucyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcGF0aCBwcmVmaXhlcyBvZiB0aGUgZ2l2ZW4gcGF0aC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIGUuZy4gdGhpcy9pcy9hL3BhdGggcmV0dXJucyB0aGUgbGlzdDogdGhpcyB0aGlzL2lzIHRoaXMvaXMvYSB0aGlzL2lzL2EvcGF0aAorICAgICAqCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBwYXRoIHByZWZpeGVzIG9mIHRoZSBnaXZlbiBwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRQcmVmaXhlcyhTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByZWZpeGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDgpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHByZWZpeGVzLmFkZChmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIH0gd2hpbGUgKGZpbGUgIT0gbnVsbCk7CisKKyAgICAgICAgcmV0dXJuIHByZWZpeGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZGlyZWN0b3J5IG1heSBjb250YWluIHRlc3RzIG9yIGNvbnRhaW5zIGp1c3QgaGVscGVyIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRpck5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBpZiB0aGUgZGlyZWN0b3J5IG1heSBjb250YWluIHRlc3RzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGVzdERpcihTdHJpbmcgZGlyTmFtZSkgeworICAgICAgICByZXR1cm4gKCFkaXJOYW1lLmVxdWFscygic2NyaXB0LXRlc3RzIikKKyAgICAgICAgICAgICAgICAmJiAhZGlyTmFtZS5lcXVhbHMoInJlc291cmNlcyIpICYmICFkaXJOYW1lLnN0YXJ0c1dpdGgoIi4iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBmaWxlIGlzIGEgdGVzdC4KKyAgICAgKiBDdXJyZW50bHkgd2UgcnVuIC5odG1sIGFuZCAueGh0bWwgdGVzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdE5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBpZiB0aGUgZmlsZSBpcyBhIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZXN0RmlsZShTdHJpbmcgdGVzdE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHRlc3ROYW1lLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHRlc3ROYW1lLmVuZHNXaXRoKCIueGh0bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBVUkwgb2YgdGhlIHRlc3Qgb24gdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKKyAgICAgKiBAcmV0dXJuIGEgVVJMIG9mIHRoZSB0ZXN0IG9uIHRoZSBzZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVSTCBnZXRVcmwoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBTdHJpbmcgdXJsQmFzZSA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVUkwgaXMgZm9ybWVkIGRpZmZlcmVudGx5IGZvciBIVFRQIHZzIG5vbi1IVFRQIHRlc3RzLCBiZWNhdXNlIEhUVFAgdGVzdHMKKyAgICAgICAgICogZXhwZWN0IGRpZmZlcmVudCBkb2N1bWVudCByb290LiBTZWUgcnVuX2FwYWNoZTIucHkgYW5kIC5jb25mIGZpbGUgZm9yIGRldGFpbHMKKyAgICAgICAgICovCisgICAgICAgIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChIVFRQX1RFU1RTX1BBVEgpKSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGguc3Vic3RyaW5nKEhUVFBfVEVTVFNfUEFUSC5sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoU1NMX1BBVEgpKSB7CisgICAgICAgICAgICAgICAgdXJsQmFzZSA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSAiTGF5b3V0VGVzdHMvIiArIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxCYXNlICsgcmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJNYWxmb3JtZWQgVVJMISIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHBhdGggY29udGFpbnMgZXh0ZW5zaW9uIChlLmcgLmZvbyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlKSB0aGVuIGl0IGNoYW5nZXMKKyAgICAgKiB0aGlzICguZm9vKSBpbnRvIG5ld0VuZGluZyAoc28gaXQgaGFzIHRvIGNvbnRhaW4gdGhlIGRvdCBpZiB3ZSB3YW50IHRvIHByZXNlcnZlIGl0KS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBwYXRoIGRvZXNuJ3QgY29udGFpbiBhbiBleHRlbnNpb24sIGl0IGFkZHMgdGhlIGVuZGluZyB0byB0aGUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKKyAgICAgKiBAcGFyYW0gbmV3RW5kaW5nCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYSBuZXcgcGF0aCwgY29udGFpbmluZyB0aGUgbmV3RXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0UGF0aEVuZGluZyhTdHJpbmcgcmVsYXRpdmVQYXRoLCBTdHJpbmcgbmV3RW5kaW5nKSB7CisgICAgICAgIGludCBkb3RQb3MgPSByZWxhdGl2ZVBhdGgubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGRvdFBvcyA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCArIG5ld0VuZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGguc3Vic3RyaW5nKDAsIGRvdFBvcykgKyBuZXdFbmRpbmc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRnNVdGlscy5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRnNVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWE3MzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9Gc1V0aWxzLmphdmEKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlc3BvbnNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuUGxhaW5Tb2NrZXRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5TU0xTb2NrZXRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkJhc2ljSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBDb25uZWN0aW9uUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlsczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEZzVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRnNVdGlscyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX1VSTCA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpICsKKyAgICAgICAgICAgICJXZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9hbmRyb2lkL2dldF9sYXlvdXRfdGVzdHNfZGlyX2NvbnRlbnRzLnBocCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9USU1FT1VUX01TID0gNTAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIEh0dHBDbGllbnQgc0h0dHBDbGllbnQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBIdHRwQ2xpZW50IGdldEh0dHBDbGllbnQoKSB7CisgICAgICAgIGlmIChzSHR0cENsaWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBIdHRwUGFyYW1zIHBhcmFtcyA9IG5ldyBCYXNpY0h0dHBQYXJhbXMoKTsKKworICAgICAgICAgICAgU2NoZW1lUmVnaXN0cnkgc2NoZW1lUmVnaXN0cnkgPSBuZXcgU2NoZW1lUmVnaXN0cnkoKTsKKyAgICAgICAgICAgIHNjaGVtZVJlZ2lzdHJ5LnJlZ2lzdGVyKG5ldyBTY2hlbWUoImh0dHAiLCBQbGFpblNvY2tldEZhY3RvcnkuZ2V0U29ja2V0RmFjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICBGb3J3YXJkZXJNYW5hZ2VyLkhUVFBfUE9SVCkpOworICAgICAgICAgICAgc2NoZW1lUmVnaXN0cnkucmVnaXN0ZXIobmV3IFNjaGVtZSgiaHR0cHMiLCBTU0xTb2NrZXRGYWN0b3J5LmdldFNvY2tldEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgRm9yd2FyZGVyTWFuYWdlci5IVFRQU19QT1JUKSk7CisKKyAgICAgICAgICAgIENsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IFRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlcihwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIHNjaGVtZVJlZ2lzdHJ5KTsKKyAgICAgICAgICAgIHNIdHRwQ2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KGNvbm5lY3Rpb25NYW5hZ2VyLCBwYXJhbXMpOworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0U29UaW1lb3V0KHNIdHRwQ2xpZW50LmdldFBhcmFtcygpLCBIVFRQX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0Q29ubmVjdGlvblRpbWVvdXQoc0h0dHBDbGllbnQuZ2V0UGFyYW1zKCksIEhUVFBfVElNRU9VVF9NUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNIdHRwQ2xpZW50OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURhdGFUb1N0b3JhZ2UoRmlsZSBmaWxlLCBieXRlW10gYnl0ZXMsIGJvb2xlYW4gYXBwZW5kKSB7CisgICAgICAgIExvZy5kKExPR19UQUcsICJ3cml0ZURhdGFUb1N0b3JhZ2UoKTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJ3cml0ZURhdGFUb1N0b3JhZ2UoKTogRmlsZSBjcmVhdGVkOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSwgYXBwZW5kKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZXMpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiZmlsZS5nZXRBYnNvbHV0ZVBhdGg9IiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGFwcGVuZD0iICsgYXBwZW5kLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWREYXRhRnJvbVN0b3JhZ2UoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlYWREYXRhRnJvbVN0b3JhZ2UoKTogRmlsZSBkb2VzIG5vdCBleGlzdDogIgorICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBuZXcgYnl0ZVsoaW50KWZpbGUubGVuZ3RoKCldOworICAgICAgICAgICAgICAgIGZpcy5yZWFkKGJ5dGVzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImZpbGUuZ2V0QWJzb2x1dGVQYXRoPSIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkRGF0YUZyb21VcmwoVVJMIHVybCkgeworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJyZWFkRGF0YUZyb21VcmwoKTogdXJsIGlzIG51bGwhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEh0dHBHZXQgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cEdldCh1cmwudG9TdHJpbmcoKSk7CisgICAgICAgIFJlc3BvbnNlSGFuZGxlcjxieXRlW10+IGhhbmRsZXIgPSBuZXcgUmVzcG9uc2VIYW5kbGVyPGJ5dGVbXT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gaGFuZGxlUmVzcG9uc2UoSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpICE9IEh0dHBTdGF0dXMuU0NfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlbnRpdHkgPT0gbnVsbCA/IG51bGwgOiBFbnRpdHlVdGlscy50b0J5dGVBcnJheShlbnRpdHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUT0RPOiBOb3QgZXhhY3RseSBzdXJlIHdoeSBzb21lIHJlcXVlc3RzIGhhbmcgaW5kZWZpbml0ZWx5LCBidXQgYWRkaW5nIHRoaXMKKyAgICAgICAgICAgICAqIHRpbWVvdXQgKGluIHN0YXRpYyBnZXR0ZXIgZm9yIGh0dHAgY2xpZW50KSBpbiBsb29wIGhlbHBzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBib29sZWFuIHRpbWVkT3V0OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBnZXRIdHRwQ2xpZW50KCkuZXhlY3V0ZShodHRwUmVxdWVzdCwgaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkV4cGVjdGVkIFNvY2tldFRpbWVvdXRFeGNlcHRpb246ICIgKyB1cmwsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRpbWVkT3V0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInVybD0iICsgdXJsLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGgsIGJvb2xlYW4gcmVjdXJzZSwKKyAgICAgICAgICAgIGJvb2xlYW4gbW9kZSkgeworICAgICAgICBTdHJpbmcgbW9kZVN0cmluZyA9IChtb2RlID8gImZvbGRlcnMiIDogImZpbGVzIik7CisKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKFNDUklQVF9VUkwgKworICAgICAgICAgICAgICAgICAgICAiP3BhdGg9IiArIGRpclJlbGF0aXZlUGF0aCArCisgICAgICAgICAgICAgICAgICAgICImcmVjdXJzZT0iICsgcmVjdXJzZSArCisgICAgICAgICAgICAgICAgICAgICImbW9kZT0iICsgbW9kZVN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAicGF0aD0iICsgZGlyUmVsYXRpdmVQYXRoICsgIiByZWN1cnNlPSIgKyByZWN1cnNlICsgIiBtb2RlPSIgKworICAgICAgICAgICAgICAgICAgICBtb2RlU3RyaW5nLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIH0KKworICAgICAgICBIdHRwR2V0IGh0dHBSZXF1ZXN0ID0gbmV3IEh0dHBHZXQodXJsLnRvU3RyaW5nKCkpOworICAgICAgICBSZXNwb25zZUhhbmRsZXI8TGlua2VkTGlzdDxTdHJpbmc+PiBoYW5kbGVyID0gbmV3IFJlc3BvbnNlSGFuZGxlcjxMaW5rZWRMaXN0PFN0cmluZz4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlua2VkTGlzdDxTdHJpbmc+IGhhbmRsZVJlc3BvbnNlKEh0dHBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSHR0cEVudGl0eSBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGVudGl0eS5nZXRDb250ZW50KCkpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBsaW5lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBDbGllbnQoKS5leGVjdXRlKGh0dHBSZXF1ZXN0LCBoYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImdldExheW91dFRlc3RzRGlyQ29udGVudHMoKTogSFRUUCBHRVQgZmFpbGVkIGZvciBVUkwgIiArIHVybCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJDb3VsZG4ndCBjbG9zZSBzdHJlYW0hIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJDb3VsZG4ndCBjbG9zZSBzdHJlYW0hIiwgZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjA4ZTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuTW9ja0dlb2xvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgSlMgaW50ZXJmYWNlIGZvciB3ZWJ2aWV3IGluIExheW91dFRlc3RFeGVjdXRvcgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0VGVzdENvbnRyb2xsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkxheW91dFRlc3RDb250cm9sbGVyIjsKKworICAgIExheW91dFRlc3RzRXhlY3V0b3IgbUxheW91dFRlc3RzRXhlY3V0b3I7CisKKyAgICBwdWJsaWMgTGF5b3V0VGVzdENvbnRyb2xsZXIoTGF5b3V0VGVzdHNFeGVjdXRvciBsYXlvdXRUZXN0c0V4ZWN1dG9yKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yID0gbGF5b3V0VGVzdHNFeGVjdXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckFsbERhdGFiYXNlcygpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgImNsZWFyQWxsRGF0YWJhc2VzKCkgY2FsbGVkIik7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5kZWxldGVBbGxEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpIHsKKyAgICAgICAgZHVtcEFzVGV4dChmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5kdW1wQXNUZXh0KGVuYWJsZVBpeGVsVGVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLmR1bXBEYXRhYmFzZUNhbGxiYWNrcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURvbmUoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLm5vdGlmeURvbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5vdmVycmlkZVByZWZlcmVuY2Uoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXBwQ2FjaGVNYXhpbXVtU2l6ZShsb25nIHNpemUpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInNldEFwcENhY2hlTWF4aW11bVNpemUoKSBjYWxsZWQgd2l0aDogIiArIHNpemUpOworICAgICAgICBXZWJTdG9yYWdlLmdldEluc3RhbmNlKCkuc2V0QXBwQ2FjaGVNYXhpbXVtU2l6ZShzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5PcGVuV2luZG93cygpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0Q2FuT3BlbldpbmRvd3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmFzZVF1b3RhKGxvbmcgcXVvdGEpIHsKKyAgICAgICAgLyoqIFRPRE86IFJlc2V0IHRoaXMgYmVmb3JlIGV2ZXJ5IHRlc3QhICovCisgICAgICAgIExvZy5pKExPR19UQUcsICJzZXREYXRhYmFzZVF1b3RhKCkgY2FsbGVkIHdpdGg6ICIgKyBxdW90YSk7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5zZXRRdW90YUZvck9yaWdpbihVcmkuZnJvbUZpbGUobmV3IEZpbGUoIiIpKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIHF1b3RhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5zZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYWxsb3cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgTGF5b3V0VGVzdHNFeGVjdXRvcgorICAgICAgICAvLyBhcyB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgV2Vidmlldy4KKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigiICsgY2FuUHJvdmlkZUFscGhhICsKKyAgICAgICAgICAgICAgICAiLCAiICsgYWxwaGEgKyAiLCAiICsgY2FuUHJvdmlkZUJldGEgKyAiLCAiICsgYmV0YSArICIsICIgKyBjYW5Qcm92aWRlR2FtbWEgKworICAgICAgICAgICAgICAgICIsICIgKyBnYW1tYSArICIpIik7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0dlb2xvY2F0aW9uRXJyb3IoaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsICJzZXRNb2NrR2VvbG9jYXRpb25FcnJvcigpOiAiICsgImNvZGU9IiArIGNvZGUgKyAiIG1lc3NhZ2U9IiArIG1lc3NhZ2UpOworICAgICAgICBNb2NrR2VvbG9jYXRpb24uZ2V0SW5zdGFuY2UoKS5zZXRFcnJvcihjb2RlLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrR2VvbG9jYXRpb25Qb3NpdGlvbihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGRvdWJsZSBhY2N1cmFjeSkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCAic2V0TW9ja0dlb2xvY2F0aW9uUG9zaXRpb24oKTogIiArICJsYXRpdHVkZT0iICsgbGF0aXR1ZGUgKworICAgICAgICAgICAgICAgICIgbG9uZ2l0dWRlPSIgKyBsb25naXR1ZGUgKyAiIGFjY3VyYWN5PSIgKyBhY2N1cmFjeSk7CisgICAgICAgIE1vY2tHZW9sb2NhdGlvbi5nZXRJbnN0YW5jZSgpLnNldFBvc2l0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUsIGFjY3VyYWN5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0WFNTQXVkaXRvckVuYWJsZWQoZmxhZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iud2FpdFVudGlsRG9uZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Q3Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdHNFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5Tc2xFcnJvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlci5XYWtlTG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9uczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5IdHRwQXV0aEhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNQcm9tcHRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuU3NsRXJyb3JIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkNocm9tZUNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTdG9yYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2UuUXVvdGFVcGRhdGVyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcuVGhyZWFkLlVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgYWN0aXZpdHkgZXhlY3V0ZXMgdGhlIHRlc3QuIEl0IGNvbnRhaW5zIFdlYlZpZXcgYW5kIGxvZ2ljIG9mIExheW91dFRlc3RDb250cm9sbGVyCisgKiBmdW5jdGlvbnMuIEl0IHJ1bnMgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzIGFuZCBzZW5kcyB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIHRoZSB0ZXN0CisgKiB0byBNYW5hZ2VyU2VydmljZS4gVGhlIHJlYXNvbiB3aHkgaXMgdG8gaGFuZGxlIGNyYXNoaW5nICh0ZXN0IHRoYXQgY3Jhc2hlcyBicmluZ3MgZG93bgorICogd2hvbGUgcHJvY2VzcyB3aXRoIGl0KS4KKyAqLworcHVibGljIGNsYXNzIExheW91dFRlc3RzRXhlY3V0b3IgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIGVudW0gQ3VycmVudFN0YXRlIHsKKyAgICAgICAgSURMRSwKKyAgICAgICAgUkVOREVSSU5HX1BBR0UsCisgICAgICAgIFdBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNULAorICAgICAgICBPQlRBSU5JTkdfUkVTVUxUOworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZ1N0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gQ3VycmVudFN0YXRlLlJFTkRFUklOR19QQUdFIHx8CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPT0gQ3VycmVudFN0YXRlLldBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNUOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTGF5b3V0VGVzdHNFeGVjdXRvciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9URVNUU19MSVNUID0gIlRlc3RzTGlzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVTVF9JTkRFWCA9ICJUZXN0SW5kZXgiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BQ1RVQUxfUkVTVUxUX09CVEFJTkVEID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RFU1RfVElNRURfT1VUID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RJTUVfT1VUX01TID0gMTUgKiAxMDAwOworCisgICAgLyoqIEEgbGlzdCBvZiB0ZXN0cyB0aGF0IHJlbWFpbiB0byBydW4gc2luY2UgbGFzdCBjcmFzaCAqLworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZXN0c0xpc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgbnVtYmVyIG9mIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuIEl0IGlzIDAtYmFzZWQgYW5kIGRvZXNuJ3QgcmVzZXQgYWZ0ZXIKKyAgICAgKiB0aGUgY3Jhc2guIEluaXRpYWwgaW5kZXggaXMgcGFzc2VkIHRvIExheW91dFRlc3RzRXhlY3V0ZXIgaW4gdGhlIGludGVudCB0aGF0IHN0YXJ0cworICAgICAqIGl0LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1DdXJyZW50VGVzdEluZGV4OworCisgICAgLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMgdG8gcnVuLCBkb2Vzbid0IHJlc2V0IGFmdGVyIGNyYXNoICovCisgICAgcHJpdmF0ZSBpbnQgbVRvdGFsVGVzdENvdW50OworCisgICAgcHJpdmF0ZSBXZWJWaWV3IG1DdXJyZW50V2ViVmlldzsKKyAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRUZXN0VXJpOworICAgIHByaXZhdGUgQ3VycmVudFN0YXRlIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuSURMRTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ3VycmVudFRlc3RUaW1lZE91dDsKKyAgICBwcml2YXRlIEFic3RyYWN0UmVzdWx0IG1DdXJyZW50UmVzdWx0OworICAgIHByaXZhdGUgQWRkaXRpb25hbFRleHRPdXRwdXQgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dDsKKworICAgIHByaXZhdGUgTGF5b3V0VGVzdENvbnRyb2xsZXIgbUxheW91dFRlc3RDb250cm9sbGVyID0gbmV3IExheW91dFRlc3RDb250cm9sbGVyKHRoaXMpOworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuT3BlbldpbmRvd3M7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wRGF0YWJhc2VDYWxsYmFja3M7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUdlb2xvY2F0aW9uUGVybWlzc2lvbjsKKyAgICBwcml2YXRlIE1hcDxHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrLCBTdHJpbmc+IG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzOworCisgICAgcHJpdmF0ZSBFdmVudFNlbmRlciBtRXZlbnRTZW5kZXIgPSBuZXcgRXZlbnRTZW5kZXIoKTsKKworICAgIHByaXZhdGUgV2FrZUxvY2sgbVNjcmVlbkRpbUxvY2s7CisKKyAgICAvKiogQ09NTVVOSUNBVElPTiBXSVRIIE1hbmFnZXJTZXJ2aWNlICovCisKKyAgICBwcml2YXRlIE1lc3NlbmdlciBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXI7CisKKyAgICBwcml2YXRlIFNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpOworICAgICAgICAgICAgc3RhcnRUZXN0cygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPICovCisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1SZXN1bHRIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUNUVUFMX1JFU1VMVF9PQlRBSU5FRDoKKyAgICAgICAgICAgICAgICAgICAgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19URVNUX1RJTUVEX09VVDoKKyAgICAgICAgICAgICAgICAgICAgb25UZXN0VGltZWRPdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogV0VCVklFVyBDT05GSUdVUkFUSU9OICovCisKKyAgICBwcml2YXRlIFdlYlZpZXdDbGllbnQgbVdlYlZpZXdDbGllbnQgPSBuZXcgV2ViVmlld0NsaWVudCgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgeworICAgICAgICAgICAgLyoqIFNvbWUgdGVzdHMgZmlyZSB1cCBtYW55IHBhZ2UgbG9hZHMsIHdlIGRvbid0IHdhbnQgdG8gZGV0ZWN0IHRoZW0gKi8KKyAgICAgICAgICAgIGlmICghdXJsLmVxdWFscyhtQ3VycmVudFRlc3RVcmkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuUkVOREVSSU5HX1BBR0UpIHsKKyAgICAgICAgICAgICAgICBvblRlc3RGaW5pc2hlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdChXZWJWaWV3IHZpZXcsIEh0dHBBdXRoSGFuZGxlciBoYW5kbGVyLAorICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtKSB7CisgICAgICAgICAgICAgaWYgKGhhbmRsZXIudXNlSHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKCkgJiYgdmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNyZWRlbnRpYWxzID0gdmlldy5nZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoaG9zdCwgcmVhbG0pOworICAgICAgICAgICAgICAgICBpZiAoY3JlZGVudGlhbHMgIT0gbnVsbCAmJiBjcmVkZW50aWFscy5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5wcm9jZWVkKGNyZWRlbnRpYWxzWzBdLCBjcmVkZW50aWFsc1sxXSk7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaGFuZGxlci5jYW5jZWwoKTsKKyAgICAgICAgIH0KKworICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVkU3NsRXJyb3IoV2ViVmlldyB2aWV3LCBTc2xFcnJvckhhbmRsZXIgaGFuZGxlciwgU3NsRXJyb3IgZXJyb3IpIHsKKyAgICAgICAgICAgICAvLyBXZSBpZ25vcmUgU1NMIGVycm9ycy4gSW4gcGFydGljdWxhciwgdGhlIGNlcnRpZmljYXRlIHVzZWQgYnkgdGhlIExheW91dFRlc3RzIHNlcnZlcgorICAgICAgICAgICAgIC8vIHByb2R1Y2VzIGFuIGVycm9yIGFzIGl0IGxhY2tzIGEgQ04gZmllbGQuCisgICAgICAgICAgICAgaGFuZGxlci5wcm9jZWVkKCk7CisgICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgV2ViQ2hyb21lQ2xpZW50IG1XZWJDaHJvbWVDbGllbnQgPSBuZXcgV2ViQ2hyb21lQ2xpZW50KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FeGNlZWRlZERhdGFiYXNlUXVvdGEoU3RyaW5nIHVybCwgU3RyaW5nIGRhdGFiYXNlSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICBsb25nIGN1cnJlbnRRdW90YSwgbG9uZyBlc3RpbWF0ZWRTaXplLCBsb25nIHRvdGFsVXNlZFF1b3RhLAorICAgICAgICAgICAgICAgIFF1b3RhVXBkYXRlciBxdW90YVVwZGF0ZXIpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBUaGlzIHNob3VsZCBiZSByZWNvcmRlZCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IHJlc3VsdCAqLworICAgICAgICAgICAgLyoqIFRPRE86IFRoZSBxdW90YSBzaG91bGQgYWxzbyBwcm9iYWJseSBiZSByZXNldCBzb21laG93IGZvciBldmVyeSB0ZXN0PyAqLworICAgICAgICAgICAgaWYgKG1EdW1wRGF0YWJhc2VDYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRFeGNlZWRlZERiUXVvdGFNZXNzYWdlKHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlSWRlbnRpZmllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdW90YVVwZGF0ZXIudXBkYXRlUXVvdGEoY3VycmVudFF1b3RhICsgNSAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkpzQWxlcnQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgSnNSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRKc0FsZXJ0KG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpcm0oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNDb25maXJtKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCwgU3RyaW5nIG1lc3NhZ2UsIEpzUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kSnNDb25maXJtKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpcm0oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNQcm9tcHQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICBKc1Byb21wdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEpzUHJvbXB0KG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db25zb2xlTWVzc2FnZShDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZSkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kQ29uc29sZU1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVXaW5kb3coV2ViVmlldyB2aWV3LCBib29sZWFuIGRpYWxvZywgYm9vbGVhbiB1c2VyR2VzdHVyZSwKKyAgICAgICAgICAgICAgICBNZXNzYWdlIHJlc3VsdE1zZykgeworICAgICAgICAgICAgV2ViVmlldy5XZWJWaWV3VHJhbnNwb3J0IHRyYW5zcG9ydCA9IChXZWJWaWV3LldlYlZpZXdUcmFuc3BvcnQpcmVzdWx0TXNnLm9iajsKKyAgICAgICAgICAgIC8qKiBCeSBkZWZhdWx0IHdpbmRvd3MgY2Fubm90IGJlIG9wZW5lZCwgc28ganVzdCBzZW5kIG51bGwgYmFjay4gKi8KKyAgICAgICAgICAgIFdlYlZpZXcgbmV3V2luZG93V2ViVmlldyA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChtQ2FuT3BlbldpbmRvd3MpIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBXZSBuZXZlciBkaXNwbGF5IHRoZSBuZXcgd2luZG93LCBqdXN0IGNyZWF0ZSB0aGUgdmlldyBhbmQgYWxsb3cgaXQncyBjb250ZW50IHRvCisgICAgICAgICAgICAgICAgICogZXhlY3V0ZSBhbmQgYmUgcmVjb3JkZWQgYnkgdGhlIGV4ZWN1dG9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG5ld1dpbmRvd1dlYlZpZXcgPSBjcmVhdGVXZWJWaWV3V2l0aEphdmFzY3JpcHRJbnRlcmZhY2VzKCk7CisgICAgICAgICAgICAgICAgc2V0dXBXZWJWaWV3KG5ld1dpbmRvd1dlYlZpZXcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFuc3BvcnQuc2V0V2ViVmlldyhuZXdXaW5kb3dXZWJWaWV3KTsKKyAgICAgICAgICAgIHJlc3VsdE1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VvbG9jYXRpb25QZXJtaXNzaW9uc1Nob3dQcm9tcHQoU3RyaW5nIG9yaWdpbiwKKyAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0KSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8R2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjaywgU3RyaW5nPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBvcmlnaW4pOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKiBJTVBMRU1FTlRBVElPTiAqLworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJdCBkZXRlY3RzIHRoZSBjcmFzaCBieSBjYXRjaGluZyBhbGwgdGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMuIEhvd2V2ZXIsIHdlCisgICAgICAgICAqIHN0aWxsIGhhdmUgdG8ga2lsbCB0aGUgcHJvY2VzcywgYmVjYXVzZSBhZnRlciBjYXRjaGluZyB0aGUgZXhjZXB0aW9uIHRoZQorICAgICAgICAgKiBhY3Rpdml0eSByZW1haW5zIGluIGEgc3RyYW5nZSBzdGF0ZSwgd2hlcmUgaW50ZW50cyBkb24ndCByZXZpdmUgaXQuCisgICAgICAgICAqIEhvd2V2ZXIsIHdlIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHNlcnZpY2UgdG8gc3BlZWQgdXAgdGhlIHJlYm9vdGluZworICAgICAgICAgKiAod2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aW1lLW91dCB0byBraWNrIGluKS4KKyAgICAgICAgICovCisgICAgICAgIFRocmVhZC5zZXREZWZhdWx0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVuY2F1Z2h0RXhjZXB0aW9uKFRocmVhZCB0aHJlYWQsIFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJvblRlc3RDcmFzaGVkKCk6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiIHRocmVhZD0iICsgdGhyZWFkLCBlKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Ugc2VydmljZU1zZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0NVUlJFTlRfVEVTVF9DUkFTSEVEKTsKKworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aD0iICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoLCBlMik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHJvY2Vzcy5raWxsUHJvY2VzcyhQcm9jZXNzLm15UGlkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtVGVzdHNMaXN0ID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKEVYVFJBX1RFU1RTX0xJU1QpOworICAgICAgICBtQ3VycmVudFRlc3RJbmRleCA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9URVNUX0lOREVYLCAtMSk7CisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IG1DdXJyZW50VGVzdEluZGV4ICsgbVRlc3RzTGlzdC5zaXplKCk7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlNDUkVFTl9ESU1fV0FLRV9MT0NLCisgICAgICAgICAgICAgICAgfCBQb3dlck1hbmFnZXIuT05fQUZURVJfUkVMRUFTRSwgIldha2VMb2NrIGluIExheW91dFRlc3RlciIpOworICAgICAgICBtU2NyZWVuRGltTG9jay5hY3F1aXJlKCk7CisKKyAgICAgICAgYmluZFNlcnZpY2UobmV3IEludGVudCh0aGlzLCBNYW5hZ2VyU2VydmljZS5jbGFzcyksIG1TZXJ2aWNlQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKKyAgICAgICAgV2ViVmlldyBwcmV2aW91c1dlYlZpZXcgPSBtQ3VycmVudFdlYlZpZXc7CisKKyAgICAgICAgcmVzZXRMYXlvdXRUZXN0Q29udHJvbGxlcigpOworCisgICAgICAgIG1DdXJyZW50VGVzdFRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbnVsbDsKKyAgICAgICAgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCA9IG51bGw7CisKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3ID0gY3JlYXRlV2ViVmlld1dpdGhKYXZhc2NyaXB0SW50ZXJmYWNlcygpOworICAgICAgICAvLyBXaGVuIHdlIGNyZWF0ZSB0aGUgZmlyc3QgV2ViVmlldywgd2UgbmVlZCB0byBwYXVzZSB0byB3YWl0IGZvciB0aGUgV2ViVmlldyB0aHJlYWQgdG8gc3BpbgorICAgICAgICAvLyBhbmQgdXAgYW5kIGZvciBpdCB0byByZWdpc3RlciBpdHMgbWVzc2FnZSBoYW5kbGVycy4KKyAgICAgICAgaWYgKHByZXZpb3VzV2ViVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAgICAgfQorICAgICAgICBzZXR1cFdlYlZpZXcobUN1cnJlbnRXZWJWaWV3KTsKKworICAgICAgICBtRXZlbnRTZW5kZXIucmVzZXQobUN1cnJlbnRXZWJWaWV3KTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhtQ3VycmVudFdlYlZpZXcpOworICAgICAgICBpZiAocHJldmlvdXNXZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcgKyAiOjpyZXNldCIsICJwcmV2aW91c1dlYlZpZXcgIT0gbnVsbCIpOworICAgICAgICAgICAgcHJldmlvdXNXZWJWaWV3LmRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFdlYlZpZXdXaXRoSmF2YXNjcmlwdEludGVyZmFjZXMgZXh0ZW5kcyBXZWJWaWV3IHsKKyAgICAgICAgcHVibGljIFdlYlZpZXdXaXRoSmF2YXNjcmlwdEludGVyZmFjZXMoCisgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IGphdmFzY3JpcHRJbnRlcmZhY2VzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LAorICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gYXR0cmlidXRlIHNldAorICAgICAgICAgICAgICAgICAgMCwgLy8gZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRAorICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMsCisgICAgICAgICAgICAgICAgICBmYWxzZSk7IC8vIGlzIHByaXZhdGUgYnJvd3NpbmcKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIFdlYlZpZXcgY3JlYXRlV2ViVmlld1dpdGhKYXZhc2NyaXB0SW50ZXJmYWNlcygpIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBqYXZhc2NyaXB0SW50ZXJmYWNlcy5wdXQoImxheW91dFRlc3RDb250cm9sbGVyIiwgbUxheW91dFRlc3RDb250cm9sbGVyKTsKKyAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMucHV0KCJldmVudFNlbmRlciIsIG1FdmVudFNlbmRlcik7CisgICAgICAgIHJldHVybiBuZXcgV2ViVmlld1dpdGhKYXZhc2NyaXB0SW50ZXJmYWNlcyh0aGlzLCBqYXZhc2NyaXB0SW50ZXJmYWNlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwV2ViVmlldyhXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG1XZWJWaWV3Q2xpZW50KTsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJDaHJvbWVDbGllbnQobVdlYkNocm9tZUNsaWVudCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHRpbmcgYSB0b3VjaCBpbnRlcnZhbCBvZiAtMSBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgb3B0aW1pc2F0aW9uIGluIFdlYlZpZXcKKyAgICAgICAgICogdGhhdCBzdG9wcyByZXBlYXRlZCB0b3VjaCBldmVudHMgZmxvb2RpbmcgV2ViQ29yZS4gVGhlIEV2ZW50IFNlbmRlciBvbmx5IHNlbmRzIGEKKyAgICAgICAgICogc2luZ2xlIGV2ZW50IHJhdGhlciB0aGFuIGEgc3RyZWFtIG9mIGV2ZW50cyAobGlrZSB3aGF0IHdvdWxkIGdlbmVyYWxseSBoYXBwZW4gaW4KKyAgICAgICAgICogYSByZWFsIHVzZSBvZiB0b3VjaCBldmVudHMgaW4gYSBXZWJWaWV3KSAgYW5kIHNvIGlmIHRoZSBXZWJWaWV3IGRyb3BzIHRoZSBldmVudCwKKyAgICAgICAgICogdGhlIHRlc3Qgd2lsbCBmYWlsIGFzIHRoZSB0ZXN0IGV4cGVjdHMgb25lIGNhbGxiYWNrIGZvciBldmVyeSB0b3VjaCBpdCBzeW50aGVzaXplcy4KKyAgICAgICAgICovCisgICAgICAgIHdlYlZpZXcuc2V0VG91Y2hJbnRlcnZhbCgtMSk7CisKKyAgICAgICAgd2ViVmlldy5jbGVhckNhY2hlKHRydWUpOworICAgICAgICB3ZWJWaWV3LnNldERlZmVyTXVsdGlUb3VjaCh0cnVlKTsKKworICAgICAgICBXZWJTZXR0aW5ncyB3ZWJWaWV3U2V0dGluZ3MgPSB3ZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRBcHBDYWNoZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRBcHBDYWNoZVBhdGgoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOworICAgICAgICAvLyBVc2Ugb2YgbGFyZ2VyIHZhbHVlcyBjYXVzZXMgdW5leHBsYWluZWQgQXBwQ2FjaGUgZGF0YWJhc2UgY29ycnVwdGlvbi4KKyAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgd2hhdCdzIHJlYWxseSBnb2luZyBvbiBoZXJlLgorICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0QXBwQ2FjaGVNYXhTaXplKDEwMCAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEphdmFTY3JpcHRFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFN1cHBvcnRNdWx0aXBsZVdpbmRvd3ModHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRMYXlvdXRBbGdvcml0aG0oV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5PUk1BTCk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREYXRhYmFzZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREYXRhYmFzZVBhdGgoZ2V0RGlyKCJkYXRhYmFzZXMiLCAwKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREb21TdG9yYWdlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFdvcmtlcnNFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFhTU0F1ZGl0b3JFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyBUaGlzIGlzIGFzeW5jaHJvbm91cywgYnV0IGl0IGdldHMgcHJvY2Vzc2VkIGJ5IFdlYkNvcmUgYmVmb3JlIGl0IHN0YXJ0cyBsb2FkaW5nIHBhZ2VzLgorICAgICAgICBtQ3VycmVudFdlYlZpZXcudXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CisKKyAgICAgICAgLy8gTXVzdCBkbyB0aGlzIGFmdGVyIHNldHRpbmcgdGhlIEFwcENhY2hlIHBhdGguCisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5kZWxldGVBbGxEYXRhKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGVzdHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlIHNlcnZpY2VNc2cgPQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihudWxsLCBNYW5hZ2VyU2VydmljZS5NU0dfRklSU1RfVEVTVCk7CisKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBpZiAoIW1UZXN0c0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiZmlyc3RUZXN0IiwgbVRlc3RzTGlzdC5nZXQoMCkpOworICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoImluZGV4IiwgbUN1cnJlbnRUZXN0SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJ2aWNlTXNnLnNldERhdGEoYnVuZGxlKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3Nlbmdlci5zZW5kKHNlcnZpY2VNc2cpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aD0iICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bk5leHRUZXN0KCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuSURMRSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIGlmIChtVGVzdHNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgb25BbGxUZXN0c0ZpbmlzaGVkKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggPSBtVGVzdHNMaXN0LnJlbW92ZSgwKTsKKworICAgICAgICBMb2cuaShMT0dfVEFHLCAicnVuTmV4dFRlc3QoKTogU3RhcnQ6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKworICAgICAgICAgICAgICAgICIgKCIgKyBtQ3VycmVudFRlc3RJbmRleCArICIpIik7CisKKyAgICAgICAgbUN1cnJlbnRUZXN0VXJpID0gRmlsZUZpbHRlci5nZXRVcmwobUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKS50b1N0cmluZygpOworCisgICAgICAgIHJlc2V0KCk7CisKKyAgICAgICAgLyoqIFN0YXJ0IHRpbWUtb3V0IGNvdW50ZG93biBhbmQgdGhlIHRlc3QgKi8KKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5SRU5ERVJJTkdfUEFHRTsKKyAgICAgICAgbVJlc3VsdEhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX1RFU1RfVElNRURfT1VULCBERUZBVUxUX1RJTUVfT1VUX01TKTsKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3LmxvYWRVcmwobUN1cnJlbnRUZXN0VXJpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25UZXN0VGltZWRPdXQoKSB7CisgICAgICAgIGFzc2VydCBtQ3VycmVudFN0YXRlLmlzUnVubmluZ1N0YXRlKCkgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBMb2cudyhMT0dfVEFHLCAib25UZXN0VGltZWRPdXQoKTogIiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgIG1DdXJyZW50VGVzdFRpbWVkT3V0ID0gdHJ1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hpbGUgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0aGF0IHRoZSB0ZXN0IHRpbWVzIG91dCBiZWNhdXNlCisgICAgICAgICAqIG9mIHdlYnZpZXcgYmVjb21pbmcgdW5yZXNwb25zaXZlLCBpdCBpcyB2ZXJ5IHVubGlrZWx5LiBUaGVyZWZvcmUgaXQncworICAgICAgICAgKiBhc3N1bWVkIHRoYXQgb2J0YWluaW5nIHJlc3VsdHMgKHRoYXQgY2FsbHMgdmFyaW91cyB3ZWJ2aWV3IG1ldGhvZHMpCisgICAgICAgICAqIHdpbGwgbm90IGl0c2VsZiBoYW5nLgorICAgICAgICAgKi8KKyAgICAgICAgb2J0YWluQWN0dWFsUmVzdWx0c0Zyb21XZWJWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uVGVzdEZpbmlzaGVkKCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZS5pc1J1bm5pbmdTdGF0ZSgpIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgIm9uVGVzdEZpbmlzaGVkKCk6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICBtUmVzdWx0SGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVEVTVF9USU1FRF9PVVQpOworICAgICAgICBvYnRhaW5BY3R1YWxSZXN1bHRzRnJvbVdlYlZpZXcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb2J0YWluQWN0dWFsUmVzdWx0c0Zyb21XZWJWaWV3KCkgeworICAgICAgICAvKioKKyAgICAgICAgICogSWYgdGhlIHJlc3VsdCBoYXMgbm90IGJlZW4gc2V0IGJ5IHRoZSB0aW1lIHRoZSB0ZXN0IGZpbmlzaGVzIHdlIGNyZWF0ZQorICAgICAgICAgKiBhIGRlZmF1bHQgdHlwZSBvZiByZXN1bHQuCisgICAgICAgICAqLworICAgICAgICBpZiAobUN1cnJlbnRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgLyoqIFRPRE86IERlZmF1bHQgdHlwZSBzaG91bGQgYmUgUmVuZGVyVHJlZVJlc3VsdC4gV2UgZG9uJ3Qgc3VwcG9ydCBpdCBub3cuICovCisgICAgICAgICAgICBtQ3VycmVudFJlc3VsdCA9IG5ldyBUZXh0UmVzdWx0KG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBtQ3VycmVudFN0YXRlID0gQ3VycmVudFN0YXRlLk9CVEFJTklOR19SRVNVTFQ7CisKKyAgICAgICAgaWYgKG1DdXJyZW50VGVzdFRpbWVkT3V0KSB7CisgICAgICAgICAgICBtQ3VycmVudFJlc3VsdC5zZXREaWRUaW1lT3V0KCk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRSZXN1bHQub2J0YWluQWN0dWFsUmVzdWx0cyhtQ3VycmVudFdlYlZpZXcsCisgICAgICAgICAgICAgICAgbVJlc3VsdEhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQUNUVUFMX1JFU1VMVF9PQlRBSU5FRCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUgPT0gQ3VycmVudFN0YXRlLk9CVEFJTklOR19SRVNVTFQKKyAgICAgICAgICAgICAgICA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIExvZy5pKExPR19UQUcsICJvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZCgpOiAiICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5JRExFOworCisgICAgICAgIHJlcG9ydFJlc3VsdFRvU2VydmljZSgpOworICAgICAgICBtQ3VycmVudFRlc3RJbmRleCsrOworICAgICAgICB1cGRhdGVQcm9ncmVzc0JhcigpOworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXBvcnRSZXN1bHRUb1NlcnZpY2UoKSB7CisgICAgICAgIGlmIChtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0LnNldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZSBzZXJ2aWNlTXNnID0KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX1BST0NFU1NfQUNUVUFMX1JFU1VMVFMpOworCisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbUN1cnJlbnRSZXN1bHQuZ2V0QnVuZGxlKCk7CisgICAgICAgICAgICBidW5kbGUucHV0SW50KCJ0ZXN0SW5kZXgiLCBtQ3VycmVudFRlc3RJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1UZXN0c0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygibmV4dFRlc3QiLCBtVGVzdHNMaXN0LmdldCgwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcnZpY2VNc2cuc2V0RGF0YShidW5kbGUpOworICAgICAgICAgICAgbU1hbmFnZXJTZXJ2aWNlTWVzc2VuZ2VyLnNlbmQoc2VydmljZU1zZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoPSIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb2dyZXNzQmFyKCkgeworICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlSW50KFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTLAorICAgICAgICAgICAgICAgIG1DdXJyZW50VGVzdEluZGV4ICogV2luZG93LlBST0dSRVNTX0VORCAvIG1Ub3RhbFRlc3RDb3VudCk7CisgICAgICAgIHNldFRpdGxlKG1DdXJyZW50VGVzdEluZGV4ICogMTAwIC8gbVRvdGFsVGVzdENvdW50ICsgIiUgIiArCisgICAgICAgICAgICAgICAgIigiICsgbUN1cnJlbnRUZXN0SW5kZXggKyAiLyIgKyBtVG90YWxUZXN0Q291bnQgKyAiKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkFsbFRlc3RzRmluaXNoZWQoKSB7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrLnJlbGVhc2UoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZSBzZXJ2aWNlTXNnID0KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0FMTF9URVNUU19GSU5JU0hFRCk7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg9IiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCwgZSk7CisgICAgICAgIH0KKworICAgICAgICB1bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBBZGRpdGlvbmFsVGV4dE91dHB1dCBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKSB7CisgICAgICAgIGlmIChtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQgPSBuZXcgQWRkaXRpb25hbFRleHRPdXRwdXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dDsKKyAgICB9CisKKyAgICAvKiogTEFZT1VUIFRFU1QgQ09OVFJPTExFUiAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19XQUlUX1VOVElMX0RPTkUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTk9USUZZX0RPTkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9BU19URVhUID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RVTVBfQ0hJTERfRlJBTUVTX0FTX1RFWFQgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0NBTl9PUEVOX1dJTkRPV1MgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9EQVRBQkFTRV9DQUxMQkFDS1MgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04gPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfT1ZFUlJJREVfUFJFRkVSRU5DRSA9IDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfWFNTX0FVRElUT1JfRU5BQkxFRCA9IDg7CisKKyAgICAvKiogU3RyaW5nIGNvbnN0YW50cyBmb3IgdXNlIHdpdGggbGF5b3V0VGVzdENvbnRyb2xsZXIub3ZlcnJpZGVQcmVmZXJlbmNlKCkgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBXRUJLSVRfT0ZGTElORV9XRUJfQVBQTElDQVRJT05fQ0FDSEVfRU5BQkxFRCA9CisgICAgICAgICAgICAiV2ViS2l0T2ZmbGluZVdlYkFwcGxpY2F0aW9uQ2FjaGVFbmFibGVkIjsKKworICAgIEhhbmRsZXIgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUuaXNSdW5uaW5nU3RhdGUoKSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRFVNUF9BU19URVhUOgorICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBuZXcgVGV4dFJlc3VsdChtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIFRleHRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIiArIG1DdXJyZW50UmVzdWx0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RVTVBfQ0hJTERfRlJBTUVTX0FTX1RFWFQ6CisgICAgICAgICAgICAgICAgICAgIC8qKiBJZiBkdW1wQXNUZXh0IHdhcyBub3QgY2FsbGVkIHdlIGFzc3VtZSB0aGF0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbmV3IFRleHRSZXN1bHQobUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIFRleHRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIiArIG1DdXJyZW50UmVzdWx0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgICgoVGV4dFJlc3VsdCltQ3VycmVudFJlc3VsdCkuc2V0RHVtcENoaWxkRnJhbWVzQXNUZXh0KHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RVTVBfREFUQUJBU0VfQ0FMTEJBQ0tTOgorICAgICAgICAgICAgICAgICAgICBtRHVtcERhdGFiYXNlQ2FsbGJhY2tzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19OT1RJRllfRE9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gQ3VycmVudFN0YXRlLldBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvblRlc3RGaW5pc2hlZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfT1ZFUlJJREVfUFJFRkVSRU5DRToKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIFRPRE86IFdlIHNob3VsZCBsb29rIHVwIHRoZSBjb3JyZWN0IFdlYlZpZXcgZm9yIHRoZSBmcmFtZSB3aGljaAorICAgICAgICAgICAgICAgICAgICAgKiBjYWxsZWQgdGhlIGxheW91dFRlc3RDb250cm9sbGVyIG1ldGhvZC4gQ3VycmVudGx5LCB3ZSBqdXN0IHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICogV2ViVmlldyBmb3IgdGhlIG1haW4gZnJhbWUuIEV2ZW50U2VuZGVyIHN1ZmZlcnMgZnJvbSB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAgKiBwcm9ibGVtLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJrZXkiKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX09GRkxJTkVfV0VCX0FQUExJQ0FUSU9OX0NBQ0hFX0VOQUJMRUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRBcHBDYWNoZUVuYWJsZWQobXNnLmdldERhdGEoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiTVNHX09WRVJSSURFX1BSRUZFUkVOQ0U6IHVuc3VwcG9ydGVkIHByZWZlcmVuY2UhIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfQ0FOX09QRU5fV0lORE9XUzoKKyAgICAgICAgICAgICAgICAgICAgbUNhbk9wZW5XaW5kb3dzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfR0VPTE9DQVRJT05fUEVSTUlTU0lPTjoKKyAgICAgICAgICAgICAgICAgICAgbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiA9IG1zZy5hcmcxID09IDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2s+IGl0ZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjayBjYWxsYmFjayA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW4gPSBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5nZXQoY2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9YU1NfQVVESVRPUl9FTkFCTEVEOgorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRYU1NBdWRpdG9yRW5hYmxlZChtc2cuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19XQUlUX1VOVElMX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuV0FJVElOR19GT1JfQVNZTkNIUk9OT1VTX1RFU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogIm1zZy53aGF0PSIgKyBtc2cud2hhdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0TGF5b3V0VGVzdENvbnRyb2xsZXIoKSB7CisgICAgICAgIG1DYW5PcGVuV2luZG93cyA9IGZhbHNlOworICAgICAgICBtRHVtcERhdGFiYXNlQ2FsbGJhY2tzID0gZmFsc2U7CisgICAgICAgIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCA9IGZhbHNlOworICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBkdW1wQXNUZXh0KCIgKyBlbmFibGVQaXhlbFRlc3QgKyAiKSBjYWxsZWQiKTsKKyAgICAgICAgLyoqIFRPRE86IEltcGxlbWVudCAqLworICAgICAgICBpZiAoZW5hYmxlUGl4ZWxUZXN0KSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiZW5hYmxlUGl4ZWxUZXN0IG5vdCBpbXBsZW1lbnRlZCwgc3dpdGNoaW5nIHRvIGZhbHNlIik7CisgICAgICAgIH0KKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19EVU1QX0FTX1RFWFQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfRFVNUF9DSElMRF9GUkFNRVNfQVNfVEVYVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSBjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19EVU1QX0RBVEFCQVNFX0NBTExCQUNLUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogbm90aWZ5RG9uZSgpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX05PVElGWV9ET05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBvdmVycmlkZVByZWZlcmVuY2UoIiArIGtleSArICIsICIgKyB2YWx1ZSArCisgICAgICAgICIpIGNhbGxlZCIpOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfT1ZFUlJJREVfUFJFRkVSRU5DRSk7CisgICAgICAgIG1zZy5nZXREYXRhKCkucHV0U3RyaW5nKCJrZXkiLCBrZXkpOworICAgICAgICBtc2cuZ2V0RGF0YSgpLnB1dEJvb2xlYW4oInZhbHVlIiwgdmFsdWUpOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FuT3BlbldpbmRvd3MoKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IHNldENhbk9wZW5XaW5kb3dzKCkgY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfU0VUX0NBTl9PUEVOX1dJTkRPV1MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdlb2xvY2F0aW9uUGVybWlzc2lvbihib29sZWFuIGFsbG93KSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IHNldEdlb2xvY2F0aW9uUGVybWlzc2lvbigiICsgYWxsb3cgKworICAgICAgICAgICAgICAgICIpIGNhbGxlZCIpOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04pOworICAgICAgICBtc2cuYXJnMSA9IGFsbG93ID8gMSA6IDA7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigiICsgY2FuUHJvdmlkZUFscGhhICsKKyAgICAgICAgICAgICAgICAiLCAiICsgYWxwaGEgKyAiLCAiICsgY2FuUHJvdmlkZUJldGEgKyAiLCAiICsgYmV0YSArICIsICIgKyBjYW5Qcm92aWRlR2FtbWEgKworICAgICAgICAgICAgICAgICIsICIgKyBnYW1tYSArICIpIik7CisgICAgICAgIG1DdXJyZW50V2ViVmlldy5zZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IHNldFhTU0F1ZGl0b3JFbmFibGVkKCIgKyBmbGFnICsgIikgY2FsbGVkIik7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TRVRfWFNTX0FVRElUT1JfRU5BQkxFRCk7CisgICAgICAgIG1zZy5hcmcxID0gZmxhZyA/IDEgOiAwOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogd2FpdFVudGlsRG9uZSgpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1dBSVRfVU5USUxfRE9ORSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTWFuYWdlclNlcnZpY2UuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL01hbmFnZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyZGM4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIHNlcnZpY2UgdGhhdCBoYW5kbGVzIG1hbmFnaW5nIHRoZSByZXN1bHRzIG9mIHRlc3RzLCBpbmZvcm1pbmcgb2YgY3Jhc2hlcywgZ2VuZXJhdGluZworICogc3VtbWFyaWVzLCBldGMuCisgKi8KK3B1YmxpYyBjbGFzcyBNYW5hZ2VyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTWFuYWdlclNlcnZpY2UiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DUkFTSF9USU1FT1VUX0VYUElSRUQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU1VNTUFSSVpFUl9ET05FID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUkFTSF9USU1FT1VUX01TID0gMjAgKiAxMDAwOworCisgICAgLyoqIFRPRE86IG1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRTX1JPT1RfRElSX1BBVEggPQorICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKyBGaWxlLnNlcGFyYXRvciArICJsYXlvdXQtdGVzdC1yZXN1bHRzIjsKKworICAgIC8qKiBUT0RPOiBNYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigzKTsKKyAgICB7CisgICAgICAgIEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMuYWRkKCJwbGF0Zm9ybSIgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgImFuZHJvaWQtdjgiICsgRmlsZS5zZXBhcmF0b3IpOworICAgICAgICBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTLmFkZCgicGxhdGZvcm0iICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICJhbmRyb2lkIiArIEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5hZGQoIiIpOworICAgIH0KKworICAgIC8qKiBUT0RPOiBNYWtlIHRoZXNlIHNldHRpbmdzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVTVUxUX0VYVEVOU0lPTiA9ICJ0eHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9SRVNVTFRfRVhURU5TSU9OID0gInBuZyI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9DRVNTX0FDVFVBTF9SRVNVTFRTID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19BTExfVEVTVFNfRklOSVNIRUQgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZJUlNUX1RFU1QgPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NVUlJFTlRfVEVTVF9DUkFTSEVEID0gMzsKKworICAgIC8qKgorICAgICAqIFRoaXMgaGFuZGxlciBpcyBwdXJlbHkgZm9yIElQQy4gSXQgaXMgdXNlZCB0byBjcmVhdGUgbU1lc3NlbmdlcgorICAgICAqIHRoYXQgZ2VuZXJhdGVzIGEgYmluZGVyIHJldHVybmVkIGluIG9uQmluZCBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1JbmNvbWluZ0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19GSVJTVF9URVNUOgorICAgICAgICAgICAgICAgICAgICBtU3VtbWFyaXplci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbXNnLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgZW5zdXJlTmV4dFRlc3RTZXR1cChidW5kbGUuZ2V0U3RyaW5nKCJmaXJzdFRlc3QiKSwgYnVuZGxlLmdldEludCgiaW5kZXgiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPQ0VTU19BQ1RVQUxfUkVTVUxUUzoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywibUluY29taW5nSGFuZGxlcjogIiArIG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiKSk7CisgICAgICAgICAgICAgICAgICAgIG9uQWN0dWFsUmVzdWx0c09idGFpbmVkKG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NVUlJFTlRfVEVTVF9DUkFTSEVEOgorICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWxNZXNzYWdlc0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0NSQVNIX1RJTUVPVVRfRVhQSVJFRCk7CisgICAgICAgICAgICAgICAgICAgIG9uVGVzdENyYXNoZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BTExfVEVTVFNfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIC8qKiBXZSBydW4gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gYXZvaWQgQU5SICovCisgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VtbWFyaXplci5zZXRUZXN0c1JlbGF0aXZlUGF0aChtQWxsVGVzdHNSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4obUludGVybmFsTWVzc2FnZXNIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1NVTU1BUklaRVJfRE9ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1bW1hcml6ZXIuc3VtbWFyaXplKG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0uc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIE1lc3NlbmdlciBtTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtSW5jb21pbmdIYW5kbGVyKTsKKworICAgIHByaXZhdGUgSGFuZGxlciBtSW50ZXJuYWxNZXNzYWdlc0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DUkFTSF9USU1FT1VUX0VYUElSRUQ6CisgICAgICAgICAgICAgICAgICAgIG9uVGVzdENyYXNoZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TVU1NQVJJWkVSX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1hbmFnZXJTZXJ2aWNlLnRoaXMsIFRlc3RzTGlzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1NIVVRET1dOKTsKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRoaXMgZmxhZyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBzZW5kIHRoZSBpbnRlbnQgZnJvbSB0aGUgc2VydmljZSAqLworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKyAgICBwcml2YXRlIFN1bW1hcml6ZXIgbVN1bW1hcml6ZXI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudGx5UnVubmluZ1Rlc3Q7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRseVJ1bm5pbmdUZXN0SW5kZXg7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBnZXRFeHBlY3RlZFJlc3VsdFBhdGgoKSB1c2VkIHRvIHJlZHVjZSB0aGUgbnVtYmVyCisgICAgICogb2YgcmVxdWVzdHMgcmVxdWlyZWQgdG8gdGhlIGhvc3Qgc2VydmVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0RXhwZWN0ZWRSZXN1bHRQYXRoUmVxdWVzdGVkOworICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0RXhwZWN0ZWRSZXN1bHRQYXRoRmV0Y2hlZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1BbGxUZXN0c1JlbGF0aXZlUGF0aDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOworCisgICAgICAgIG1GaWxlRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKTsKKyAgICAgICAgbVN1bW1hcml6ZXIgPSBuZXcgU3VtbWFyaXplcihtRmlsZUZpbHRlciwgUkVTVUxUU19ST09UX0RJUl9QQVRILCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBvblN0YXJ0Q29tbWFuZChJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsIGludCBzdGFydElkKSB7CisgICAgICAgIG1BbGxUZXN0c1JlbGF0aXZlUGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYSgicGF0aCIpOworICAgICAgICBhc3NlcnQgbUFsbFRlc3RzUmVsYXRpdmVQYXRoICE9IG51bGw7CisgICAgICAgIHJldHVybiBTVEFSVF9TVElDS1k7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQWN0dWFsUmVzdWx0c09idGFpbmVkKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgbUludGVybmFsTWVzc2FnZXNIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19DUkFTSF9USU1FT1VUX0VYUElSRUQpOworICAgICAgICBlbnN1cmVOZXh0VGVzdFNldHVwKGJ1bmRsZS5nZXRTdHJpbmcoIm5leHRUZXN0IiksIGJ1bmRsZS5nZXRJbnQoInRlc3RJbmRleCIpICsgMSk7CisKKyAgICAgICAgQWJzdHJhY3RSZXN1bHQgcmVzdWx0cyA9CisgICAgICAgICAgICAgICAgQWJzdHJhY3RSZXN1bHQuVGVzdFR5cGUudmFsdWVPZihidW5kbGUuZ2V0U3RyaW5nKCJ0eXBlIikpLmNyZWF0ZVJlc3VsdChidW5kbGUpOworCisgICAgICAgIExvZy5pKExPR19UQUcsICJvbkFjdHVhbFJlc3VsdE9idGFpbmVkOiAiICsgcmVzdWx0cy5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIGhhbmRsZVJlc3VsdHMocmVzdWx0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU5leHRUZXN0U2V0dXAoU3RyaW5nIG5leHRUZXN0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG5leHRUZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJlbnN1cmVOZXh0VGVzdFNldHVwKCk6IG5leHRUZXN0PW51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50bHlSdW5uaW5nVGVzdCA9IG5leHRUZXN0OworICAgICAgICBtQ3VycmVudGx5UnVubmluZ1Rlc3RJbmRleCA9IGluZGV4OworICAgICAgICBtSW50ZXJuYWxNZXNzYWdlc0hhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX0NSQVNIX1RJTUVPVVRfRVhQSVJFRCwgQ1JBU0hfVElNRU9VVF9NUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBzZW5kcyBhbiBpbnRlbnQgdG8gVGVzdHNMaXN0QWN0aXZpdHkgdG8gcmVzdGFydCBMYXlvdXRUZXN0c0V4ZWN1dG9yLgorICAgICAqIFRoZSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBmbG93IGlzIGluIHRoZSBjb21tZW50IG9mIG9uTmV3SW50ZW50CisgICAgICogbWV0aG9kIGluIFRlc3RzTGlzdEFjdGl2aXR5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvblRlc3RDcmFzaGVkKCkgeworICAgICAgICBoYW5kbGVSZXN1bHRzKG5ldyBDcmFzaGVkRHVtbXlSZXN1bHQobUN1cnJlbnRseVJ1bm5pbmdUZXN0KSk7CisKKyAgICAgICAgTG9nLncoTE9HX1RBRywgIm9uVGVzdENyYXNoZWQoKTogIiArIG1DdXJyZW50bHlSdW5uaW5nVGVzdCArCisgICAgICAgICAgICAgICAgIiAoIiArIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4ICsgIikiKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SRUJPT1QpOworICAgICAgICAvKiogVGhpcyBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIHdlIHNlbmQgdGhlIGludGVudCBmcm9tIHRoZSBzZXJ2aWNlICovCisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiY3Jhc2hlZFRlc3RJbmRleCIsIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4KTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXN1bHRzKEFic3RyYWN0UmVzdWx0IHJlc3VsdHMpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlc3VsdHMuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgIHJlc3VsdHMuc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KGdldEV4cGVjdGVkVGV4dFJlc3VsdChyZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgcmVzdWx0cy5zZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgocmVsYXRpdmVQYXRoKSk7CisgICAgICAgIHJlc3VsdHMuc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChnZXRFeHBlY3RlZEltYWdlUmVzdWx0KHJlbGF0aXZlUGF0aCkpOworICAgICAgICByZXN1bHRzLnNldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKGdldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKHJlbGF0aXZlUGF0aCkpOworCisgICAgICAgIGR1bXBBY3R1YWxUZXh0UmVzdWx0KHJlc3VsdHMpOworICAgICAgICBkdW1wQWN0dWFsSW1hZ2VSZXN1bHQocmVzdWx0cyk7CisKKyAgICAgICAgbVN1bW1hcml6ZXIuYXBwZW5kVGVzdChyZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcEFjdHVhbFRleHRSZXN1bHQoQWJzdHJhY3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0UGF0aCA9IHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGFjdHVhbFRleHRSZXN1bHQgPSByZXN1bHQuZ2V0QWN0dWFsVGV4dFJlc3VsdCgpOworICAgICAgICBpZiAoYWN0dWFsVGV4dFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0UGF0aCA9IEZpbGVGaWx0ZXIuc2V0UGF0aEVuZGluZyh0ZXN0UGF0aCwgIi1hY3R1YWwuIiArIFRFWFRfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKFJFU1VMVFNfUk9PVF9ESVJfUEFUSCwgcmVzdWx0UGF0aCksCisgICAgICAgICAgICAgICAgYWN0dWFsVGV4dFJlc3VsdC5nZXRCeXRlcygpLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBBY3R1YWxJbWFnZVJlc3VsdChBYnN0cmFjdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgU3RyaW5nIHRlc3RQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICBieXRlW10gYWN0dWFsSW1hZ2VSZXN1bHQgPSByZXN1bHQuZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKTsKKyAgICAgICAgaWYgKGFjdHVhbEltYWdlUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHRQYXRoID0gRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHRlc3RQYXRoLAorICAgICAgICAgICAgICAgICItYWN0dWFsLiIgKyBJTUFHRV9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgRnNVdGlscy53cml0ZURhdGFUb1N0b3JhZ2UobmV3IEZpbGUoUkVTVUxUU19ST09UX0RJUl9QQVRILCByZXN1bHRQYXRoKSwKKyAgICAgICAgICAgICAgICBhY3R1YWxJbWFnZVJlc3VsdCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IGdldEV4cGVjdGVkUmVzdWx0KHJlbGF0aXZlUGF0aCwgVEVYVF9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIHJldHVybiBnZXRFeHBlY3RlZFJlc3VsdChyZWxhdGl2ZVBhdGgsIElNQUdFX1JFU1VMVF9FWFRFTlNJT04pOworICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGdldEV4cGVjdGVkUmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgsIFN0cmluZyBleHRlbnNpb24pIHsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsUmVsYXRpdmVQYXRoID0KKyAgICAgICAgICAgICAgICBGaWxlRmlsdGVyLnNldFBhdGhFbmRpbmcocmVsYXRpdmVQYXRoLCAiLWV4cGVjdGVkLiIgKyBleHRlbnNpb24pOworICAgICAgICBtTGFzdEV4cGVjdGVkUmVzdWx0UGF0aFJlcXVlc3RlZCA9IG9yaWdpbmFsUmVsYXRpdmVQYXRoOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsb2NhdGlvbnMgPSBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTOworCisgICAgICAgIGludCBzaXplID0gRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBieXRlcyA9PSBudWxsICYmIGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGxvY2F0aW9ucy5nZXQoaSkgKyBvcmlnaW5hbFJlbGF0aXZlUGF0aDsKKyAgICAgICAgICAgIGJ5dGVzID0gRnNVdGlscy5yZWFkRGF0YUZyb21VcmwoRmlsZUZpbHRlci5nZXRVcmwocmVsYXRpdmVQYXRoKSk7CisgICAgICAgIH0KKworICAgICAgICBtTGFzdEV4cGVjdGVkUmVzdWx0UGF0aEZldGNoZWQgPSBieXRlcyA9PSBudWxsID8gbnVsbCA6IHJlbGF0aXZlUGF0aDsKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICByZXR1cm4gZ2V0RXhwZWN0ZWRSZXN1bHRQYXRoKHJlbGF0aXZlUGF0aCwgVEVYVF9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIHJldHVybiBnZXRFeHBlY3RlZFJlc3VsdFBhdGgocmVsYXRpdmVQYXRoLCBJTUFHRV9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRFeHBlY3RlZFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIGV4dGVuc2lvbikgeworICAgICAgICBTdHJpbmcgb3JpZ2luYWxSZWxhdGl2ZVBhdGggPQorICAgICAgICAgICAgRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHJlbGF0aXZlUGF0aCwgIi1leHBlY3RlZC4iICsgZXh0ZW5zaW9uKTsKKyAgICAgICAgaWYgKCFvcmlnaW5hbFJlbGF0aXZlUGF0aC5lcXVhbHMobUxhc3RFeHBlY3RlZFJlc3VsdFBhdGhSZXF1ZXN0ZWQpKSB7CisgICAgICAgICAgICBnZXRFeHBlY3RlZFJlc3VsdChyZWxhdGl2ZVBhdGgsIGV4dGVuc2lvbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUxhc3RFeHBlY3RlZFJlc3VsdFBhdGhGZXRjaGVkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAxYTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvU3VtbWFyaXplci5qYXZhCkBAIC0wLDAgKzEsNTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGVzdHMgdGhhdCByYW4gYW5kIGNhbiBjcmVhdGUgSFRNTAorICogZmlsZXMgd2l0aCBzdW1tYXJpZXMgYW5kIGVhc3kgbmF2aWdhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFN1bW1hcml6ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU3VtbWFyaXplciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTID0KKyAgICAgICAgICAgICI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+IiArCisgICAgICAgICAgICAiKiB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXI6IDA7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogMDt9IiArCisgICAgICAgICAgICAiYm9keSB7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogMTBweDt9IiArCisgICAgICAgICAgICAiaDEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDI0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogNHB4IDAgNHB4IDA7fSIgKworICAgICAgICAgICAgImgyIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOjE4cHg7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogMjBweCAwIDNweCAwO30iICsKKyAgICAgICAgICAgICJoMywgaDMgYSB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTRweDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrOyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi10b3A6IDRweDsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O30iICsKKyAgICAgICAgICAgICJoMyBhIHNwYW4ucGF0aCB7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO30iICsKKyAgICAgICAgICAgICJoMyBzcGFuLnRyaSB7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICsKKyAgICAgICAgICAgICIgICAgICAgZmxvYXQ6IGxlZnQ7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAyMHB4O30iICsKKyAgICAgICAgICAgICJoMyBzcGFuLnNxciB7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICsKKyAgICAgICAgICAgICIgICAgICAgZmxvYXQ6IGxlZnQ7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAyMHB4O30iICsKKyAgICAgICAgICAgICJoMyBzcGFuLnNxcl9wYXNzIHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICM4ZWUxMDA7fSIgKworICAgICAgICAgICAgImgzIHNwYW4uc3FyX2ZhaWwgeyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2MzMDAwMDt9IiArCisgICAgICAgICAgICAic3Bhbi5zb3VyY2UgeyIgKworICAgICAgICAgICAgIiAgICAgICBkaXNwbGF5OiBibG9jazsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxMHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogIzg4ODsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDFweDt9IiArCisgICAgICAgICAgICAic3Bhbi5zb3VyY2UgYSB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTBweDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICM4ODg7fSIgKworICAgICAgICAgICAgImgzIGltZyB7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiA4cHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1yaWdodDogNHB4O30iICsKKyAgICAgICAgICAgICJkaXYuZGlmZiB7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7fSIgKworICAgICAgICAgICAgImRpdi5kaWZmIGEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDEycHg7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjODg4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1ib3R0b206IDBweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDEwMCU7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDJweDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIuaGVhZGVycyB0ZCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXRvcDogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZy1ib3R0b206IDNweDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIucmVzdWx0cyB0ZCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDE1cHg7IiArCisgICAgICAgICAgICAiICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLnJlc3VsdHMgdGQubGluZV9jb3VudCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6I2FhYTsiICsKKyAgICAgICAgICAgICIgICAgICAgbWluLXdpZHRoOjIwcHg7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogMnB4IDFweCAycHggMHB4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5yZXN1bHRzIHRkLmxpbmUgeyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAycHggMHB4IDJweCA0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogNDkuOCU7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLmZvb3RlcnMgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1ib3R0b206IDA7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyIHRkLnNwYWNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyOiAwOyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogMC40JX0iICsKKyAgICAgICAgICAgICJkaXYuc3BhY2UgeyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tdG9wOjRweDt9IiArCisgICAgICAgICAgICAic3Bhbi5lcWwgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO30iICsKKyAgICAgICAgICAgICJzcGFuLmRlbCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjg4ODg7IH0iICsKKyAgICAgICAgICAgICJzcGFuLmlucyB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4OGZmODg7IH0iICsKKyAgICAgICAgICAgICJ0YWJsZS5zdW1tYXJ5IHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi10b3A6IDIwcHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnN1bW1hcnkgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAzcHg7fSIgKworICAgICAgICAgICAgInNwYW4ubGlzdEl0ZW0geyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDExcHg7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDNweDsiICsKKyAgICAgICAgICAgICIgICAgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7fSIgKworICAgICAgICAgICAgInNwYW4uIiArIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUkVTVUxUU19ESUZGRVIubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLk5PX0VYUEVDVEVEX1JFU1VMVC5uYW1lKCkgKyAieyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTcwMGU0OyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2ZmZjt9IiArCisgICAgICAgICAgICAic3Bhbi50aW1lZF9vdXQgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNjYjAwOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogYmxhY2s7fSIgKworICAgICAgICAgICAgInNwYW4uY3Jhc2hlZCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjMzAwMDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICJzcGFuLm5vTHRjIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk0NDAwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgInNwYW4ubm9FdmVudFNlbmRlciB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4MTU2MDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICI8L3N0eWxlPiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUID0KKyAgICAgICAgICAgICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4iICsKKyAgICAgICAgICAgICIgICAgZnVuY3Rpb24gdG9nZ2xlRGlzcGxheShpZCkgeyIgKworICAgICAgICAgICAgIiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsiICsKKyAgICAgICAgICAgICIgICAgICAgIHRyaWFuZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RyaS4nICsgaWQpOyIgKworICAgICAgICAgICAgIiAgICAgICAgaWYgKGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpIHsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICB0cmlhbmdsZS5pbm5lckhUTUwgPSAnJiN4MjViYzsgJzsiICsKKyAgICAgICAgICAgICIgICAgICAgIH0gZWxzZSB7IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIHRyaWFuZ2xlLmlubmVySFRNTCA9ICcmI3gyNWI2OyAnOyIgKworICAgICAgICAgICAgIiAgICAgICAgfSIgKworICAgICAgICAgICAgIiAgICB9IiArCisgICAgICAgICAgICAiPC9zY3JpcHQ+IjsKKworICAgIC8qKiBUT0RPOiBNYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0RFVEFJTFNfUkVMQVRJVkVfUEFUSCA9ICJkZXRhaWxzLmh0bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWFRfU1VNTUFSWV9SRUxBVElWRV9QQVRIID0gInN1bW1hcnkudHh0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRTX1BFUl9EVU1QID0gNTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRTX1BFUl9EQl9BQ0NFU1MgPSA1MDsKKworICAgIHByaXZhdGUgaW50IG1DcmFzaGVkVGVzdHNDb3VudCA9IDA7CisgICAgcHJpdmF0ZSBMaXN0PEFic3RyYWN0UmVzdWx0PiBtVW5leHBlY3RlZEZhaWx1cmVzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1FeHBlY3RlZEZhaWx1cmVzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1FeHBlY3RlZFBhc3NlcyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RSZXN1bHQ+KCk7CisgICAgcHJpdmF0ZSBMaXN0PEFic3RyYWN0UmVzdWx0PiBtVW5leHBlY3RlZFBhc3NlcyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RSZXN1bHQ+KCk7CisKKyAgICBwcml2YXRlIEN1cnNvciBtVW5leHBlY3RlZEZhaWx1cmVzQ3Vyc29yOworICAgIHByaXZhdGUgQ3Vyc29yIG1FeHBlY3RlZEZhaWx1cmVzQ3Vyc29yOworICAgIHByaXZhdGUgQ3Vyc29yIG1VbmV4cGVjdGVkUGFzc2VzQ3Vyc29yOworICAgIHByaXZhdGUgQ3Vyc29yIG1FeHBlY3RlZFBhc3Nlc0N1cnNvcjsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKyAgICBwcml2YXRlIFN0cmluZyBtUmVzdWx0c1Jvb3REaXJQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0c1JlbGF0aXZlUGF0aDsKKyAgICBwcml2YXRlIERhdGUgbURhdGU7CisKKyAgICBwcml2YXRlIGludCBtUmVzdWx0c1NpbmNlTGFzdEh0bWxEdW1wID0gMDsKKyAgICBwcml2YXRlIGludCBtUmVzdWx0c1NpbmNlTGFzdERiQWNjZXNzID0gMDsKKworICAgIHByaXZhdGUgU3VtbWFyaXplckRCSGVscGVyIG1EYkhlbHBlcjsKKworICAgIHB1YmxpYyBTdW1tYXJpemVyKEZpbGVGaWx0ZXIgZmlsZUZpbHRlciwgU3RyaW5nIHJlc3VsdHNSb290RGlyUGF0aCwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1GaWxlRmlsdGVyID0gZmlsZUZpbHRlcjsKKyAgICAgICAgbVJlc3VsdHNSb290RGlyUGF0aCA9IHJlc3VsdHNSb290RGlyUGF0aDsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2UgZG9uJ3QgcnVuIHRoZSBkYXRhYmFzZSBJL08gaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gYXZvaWQgY29uc3VtZXIvcHJvZHVjZXIgcHJvYmxlbQorICAgICAgICAgKiBhbmQgdG8gc2ltcGxpZnkgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIG1EYkhlbHBlciA9IG5ldyBTdW1tYXJpemVyREJIZWxwZXIoY29udGV4dCk7CisgICAgICAgIG1EYkhlbHBlci5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBVUkkgZ2V0RGV0YWlsc1VyaSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKE1hbmFnZXJTZXJ2aWNlLlJFU1VMVFNfUk9PVF9ESVJfUEFUSCArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICBIVE1MX0RFVEFJTFNfUkVMQVRJVkVfUEFUSCkudG9VUkkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUZXN0KEFic3RyYWN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworCisgICAgICAgIGlmIChyZXN1bHQuZGlkQ3Jhc2goKSkgeworICAgICAgICAgICAgbUNyYXNoZWRUZXN0c0NvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0LmRpZFBhc3MoKSkgeworICAgICAgICAgICAgcmVzdWx0LmNsZWFyUmVzdWx0cygpOworICAgICAgICAgICAgaWYgKG1GaWxlRmlsdGVyLmlzRmFpbChyZWxhdGl2ZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgbVVuZXhwZWN0ZWRQYXNzZXMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1FeHBlY3RlZFBhc3Nlcy5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtRmlsZUZpbHRlci5pc0ZhaWwocmVsYXRpdmVQYXRoKSkgeworICAgICAgICAgICAgICAgIG1FeHBlY3RlZEZhaWx1cmVzLmFkZChyZXN1bHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVW5leHBlY3RlZEZhaWx1cmVzLmFkZChyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCsrbVJlc3VsdHNTaW5jZUxhc3REYkFjY2VzcyA9PSBSRVNVTFRTX1BFUl9EQl9BQ0NFU1MpIHsKKyAgICAgICAgICAgIHBlcnNpc3RMaXN0cygpOworICAgICAgICAgICAgY2xlYXJMaXN0cygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyTGlzdHMoKSB7CisgICAgICAgIG1VbmV4cGVjdGVkRmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkRmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgbVVuZXhwZWN0ZWRQYXNzZXMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkUGFzc2VzLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBlcnNpc3RMaXN0cygpIHsKKyAgICAgICAgcGVyc2lzdExpc3RUb1RhYmxlKG1VbmV4cGVjdGVkRmFpbHVyZXMsIFN1bW1hcml6ZXJEQkhlbHBlci5VTkVYUEVDVEVEX0ZBSUxVUkVTX1RBQkxFKTsKKyAgICAgICAgcGVyc2lzdExpc3RUb1RhYmxlKG1FeHBlY3RlZEZhaWx1cmVzLCBTdW1tYXJpemVyREJIZWxwZXIuRVhQRUNURURfRkFJTFVSRVNfVEFCTEUpOworICAgICAgICBwZXJzaXN0TGlzdFRvVGFibGUobVVuZXhwZWN0ZWRQYXNzZXMsIFN1bW1hcml6ZXJEQkhlbHBlci5VTkVYUEVDVEVEX1BBU1NFU19UQUJMRSk7CisgICAgICAgIHBlcnNpc3RMaXN0VG9UYWJsZShtRXhwZWN0ZWRQYXNzZXMsIFN1bW1hcml6ZXJEQkhlbHBlci5FWFBFQ1RFRF9QQVNTRVNfVEFCTEUpOworICAgICAgICBtUmVzdWx0c1NpbmNlTGFzdERiQWNjZXNzID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGVyc2lzdExpc3RUb1RhYmxlKExpc3Q8QWJzdHJhY3RSZXN1bHQ+IHJlc3VsdHMsIFN0cmluZyB0YWJsZSkgeworICAgICAgICBmb3IgKEFic3RyYWN0UmVzdWx0IGFic3RyYWN0UmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICAgICAgbURiSGVscGVyLmluc2VydEFic3RyYWN0UmVzdWx0KGFic3RyYWN0UmVzdWx0LCB0YWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXN0c1JlbGF0aXZlUGF0aChTdHJpbmcgdGVzdHNSZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbVRlc3RzUmVsYXRpdmVQYXRoID0gdGVzdHNSZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VtbWFyaXplKE1lc3NhZ2Ugb25GaW5pc2hNZXNzYWdlKSB7CisgICAgICAgIHBlcnNpc3RMaXN0cygpOworICAgICAgICBjbGVhckxpc3RzKCk7CisKKyAgICAgICAgbVVuZXhwZWN0ZWRGYWlsdXJlc0N1cnNvciA9CisgICAgICAgICAgICBtRGJIZWxwZXIuZ2V0QWJzdHJhY3RSZXN1bHRzKFN1bW1hcml6ZXJEQkhlbHBlci5VTkVYUEVDVEVEX0ZBSUxVUkVTX1RBQkxFKTsKKyAgICAgICAgbVVuZXhwZWN0ZWRQYXNzZXNDdXJzb3IgPQorICAgICAgICAgICAgbURiSGVscGVyLmdldEFic3RyYWN0UmVzdWx0cyhTdW1tYXJpemVyREJIZWxwZXIuVU5FWFBFQ1RFRF9QQVNTRVNfVEFCTEUpOworICAgICAgICBtRXhwZWN0ZWRGYWlsdXJlc0N1cnNvciA9CisgICAgICAgICAgICBtRGJIZWxwZXIuZ2V0QWJzdHJhY3RSZXN1bHRzKFN1bW1hcml6ZXJEQkhlbHBlci5FWFBFQ1RFRF9GQUlMVVJFU19UQUJMRSk7CisgICAgICAgIG1FeHBlY3RlZFBhc3Nlc0N1cnNvciA9CisgICAgICAgICAgICBtRGJIZWxwZXIuZ2V0QWJzdHJhY3RSZXN1bHRzKFN1bW1hcml6ZXJEQkhlbHBlci5FWFBFQ1RFRF9QQVNTRVNfVEFCTEUpOworCisgICAgICAgIFN0cmluZyB3ZWJLaXRSZXZpc2lvbiA9IGdldFdlYktpdFJldmlzaW9uKCk7CisgICAgICAgIGNyZWF0ZUh0bWxEZXRhaWxzKHdlYktpdFJldmlzaW9uKTsKKyAgICAgICAgY3JlYXRlVHh0U3VtbWFyeSh3ZWJLaXRSZXZpc2lvbik7CisKKyAgICAgICAgY2xlYXJMaXN0cygpOworICAgICAgICBtVW5leHBlY3RlZEZhaWx1cmVzQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIG1VbmV4cGVjdGVkUGFzc2VzQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIG1FeHBlY3RlZEZhaWx1cmVzQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIG1FeHBlY3RlZFBhc3Nlc0N1cnNvci5jbG9zZSgpOworCisgICAgICAgIG9uRmluaXNoTWVzc2FnZS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbUNyYXNoZWRUZXN0c0NvdW50ID0gMDsKKyAgICAgICAgY2xlYXJMaXN0cygpOworICAgICAgICBtRGJIZWxwZXIucmVzZXQoKTsKKyAgICAgICAgbURhdGUgPSBuZXcgRGF0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkdW1wSHRtbFRvRmlsZShTdHJpbmdCdWlsZGVyIGh0bWwsIGJvb2xlYW4gYXBwZW5kKSB7CisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKG1SZXN1bHRzUm9vdERpclBhdGgsIEhUTUxfREVUQUlMU19SRUxBVElWRV9QQVRIKSwKKyAgICAgICAgICAgICAgICBodG1sLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSwgYXBwZW5kKTsKKyAgICAgICAgaHRtbC5zZXRMZW5ndGgoMCk7CisgICAgICAgIG1SZXN1bHRzU2luY2VMYXN0SHRtbER1bXAgPSAwOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUeHRTdW1tYXJ5KFN0cmluZyB3ZWJLaXRSZXZpc2lvbikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHR4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkvTU0vZGQgSEg6bW06c3MiKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiUGF0aDogIiArIG1UZXN0c1JlbGF0aXZlUGF0aCArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJEYXRlOiAiICsgZGF0ZUZvcm1hdC5mb3JtYXQobURhdGUpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIkJ1aWxkIGZpbmdlcnByaW50OiAiICsgQnVpbGQuRklOR0VSUFJJTlQgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiV2ViS2l0IHZlcnNpb246ICIgKyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIldlYktpdCByZXZpc2lvbjogIiArIHdlYktpdFJldmlzaW9uICsgIlxuIik7CisKKyAgICAgICAgdHh0LmFwcGVuZCgiVE9UQUw6ICAgICAgICAgICAgICAgICAgICAgIiArIGdldFRvdGFsVGVzdENvdW50KCkgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiQ1JBU0hFRCAoYW1vbmcgYWxsIHRlc3RzKTogIiArIG1DcmFzaGVkVGVzdHNDb3VudCArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJVTkVYUEVDVEVEIEZBSUxVUkVTOiAgICAgICAiICsgbVVuZXhwZWN0ZWRGYWlsdXJlc0N1cnNvci5nZXRDb3VudCgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIlVORVhQRUNURUQgUEFTU0VTOiAgICAgICAgICIgKyBtVW5leHBlY3RlZFBhc3Nlc0N1cnNvci5nZXRDb3VudCgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIkVYUEVDVEVEIEZBSUxVUkVTOiAgICAgICAgICIgKyBtRXhwZWN0ZWRGYWlsdXJlc0N1cnNvci5nZXRDb3VudCgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIkVYUEVDVEVEIFBBU1NFUzogICAgICAgICAgICIgKyBtRXhwZWN0ZWRQYXNzZXNDdXJzb3IuZ2V0Q291bnQoKSArICJcbiIpOworCisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKG1SZXN1bHRzUm9vdERpclBhdGgsIFRYVF9TVU1NQVJZX1JFTEFUSVZFX1BBVEgpLAorICAgICAgICAgICAgICAgIHR4dC50b1N0cmluZygpLmdldEJ5dGVzKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlSHRtbERldGFpbHMoU3RyaW5nIHdlYktpdFJldmlzaW9uKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxodG1sPjxoZWFkPiIpOworICAgICAgICBodG1sLmFwcGVuZChDU1MpOworICAgICAgICBodG1sLmFwcGVuZChTQ1JJUFQpOworICAgICAgICBodG1sLmFwcGVuZCgiPC9oZWFkPjxib2R5PiIpOworCisgICAgICAgIGNyZWF0ZVRvcFN1bW1hcnlUYWJsZSh3ZWJLaXRSZXZpc2lvbiwgaHRtbCk7CisgICAgICAgIGR1bXBIdG1sVG9GaWxlKGh0bWwsIGZhbHNlKTsKKworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdChodG1sLCAiVW5leHBlY3RlZCBmYWlsdXJlcyIsIG1VbmV4cGVjdGVkRmFpbHVyZXNDdXJzb3IpOworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdChodG1sLCAiVW5leHBlY3RlZCBwYXNzZXMiLCBtVW5leHBlY3RlZFBhc3Nlc0N1cnNvcik7CisgICAgICAgIGNyZWF0ZVJlc3VsdHNMaXN0KGh0bWwsICJFeHBlY3RlZCBmYWlsdXJlcyIsIG1FeHBlY3RlZEZhaWx1cmVzQ3Vyc29yKTsKKyAgICAgICAgY3JlYXRlUmVzdWx0c0xpc3QoaHRtbCwgIkV4cGVjdGVkIHBhc3NlcyIsIG1FeHBlY3RlZFBhc3Nlc0N1cnNvcik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvYm9keT48L2h0bWw+Iik7CisgICAgICAgIGR1bXBIdG1sVG9GaWxlKGh0bWwsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFRvdGFsVGVzdENvdW50KCkgeworICAgICAgICByZXR1cm4gbVVuZXhwZWN0ZWRGYWlsdXJlc0N1cnNvci5nZXRDb3VudCgpICsKKyAgICAgICAgICAgICAgICBtVW5leHBlY3RlZFBhc3Nlc0N1cnNvci5nZXRDb3VudCgpICsKKyAgICAgICAgICAgICAgICBtRXhwZWN0ZWRQYXNzZXNDdXJzb3IuZ2V0Q291bnQoKSArCisgICAgICAgICAgICAgICAgbUV4cGVjdGVkRmFpbHVyZXNDdXJzb3IuZ2V0Q291bnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpIHsKKyAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMobmV3IEFzc2V0TWFuYWdlcigpLCBuZXcgRGlzcGxheU1ldHJpY3MoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgU3RyaW5nIHVzZXJBZ2VudCA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy53ZWJfdXNlcl9hZ2VudCk7CisKKyAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gUGF0dGVybi5jb21waWxlKCJBcHBsZVdlYktpdC8oWzAtOV0rP1xcLlswLTldKSIpLm1hdGNoZXIodXNlckFnZW50KTsKKyAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5ncm91cCgxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYktpdFJldmlzaW9uKCkgeworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoRm9yd2FyZGVyTWFuYWdlci5nZXRIb3N0U2NoZW1lUG9ydChmYWxzZSkgKyAiVGhpcmRQYXJ0eVByb2plY3QucHJvcCIpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHRoaXJkUGFydHlQcm9qZWN0Q29udGVudHMgPSBuZXcgU3RyaW5nKEZzVXRpbHMucmVhZERhdGFGcm9tVXJsKHVybCkpOworICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUoIl52ZXJzaW9uPShbMC05XSspIiwgUGF0dGVybi5NVUxUSUxJTkUpLm1hdGNoZXIoCisgICAgICAgICAgICAgICAgdGhpcmRQYXJ0eVByb2plY3RDb250ZW50cyk7CisgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIuZ3JvdXAoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVG9wU3VtbWFyeVRhYmxlKFN0cmluZyB3ZWJLaXRSZXZpc2lvbiwgU3RyaW5nQnVpbGRlciBodG1sKSB7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDE+IiArICJMYXlvdXQgdGVzdHMnIHJlc3VsdHMgZm9yOiAiICsKKyAgICAgICAgICAgICAgICAobVRlc3RzUmVsYXRpdmVQYXRoLmVxdWFscygiIikgPyAiYWxsIHRlc3RzIiA6IG1UZXN0c1JlbGF0aXZlUGF0aCkgKyAiPC9oMT4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iICsgIkRhdGU6ICIgKyBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgpKSArICI8L2gzPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiQnVpbGQgZmluZ2VycHJpbnQ6ICIgKyBCdWlsZC5GSU5HRVJQUklOVCArICI8L2gzPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiV2ViS2l0IHZlcnNpb246ICIgKyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpICsgIjwvaDM+Iik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iICsgIldlYktpdCByZXZpc2lvbjogIik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9icm93c2VyL3RydW5rP3Jldj0iICsgd2ViS2l0UmV2aXNpb24gKworICAgICAgICAgICAgICAgICJcIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3BhbiBjbGFzcz1cInBhdGhcIj4iICsgd2ViS2l0UmV2aXNpb24gKyAiPC9zcGFuPjwvYT4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvaDM+Iik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0YWJsZSBjbGFzcz1cInN1bW1hcnlcIj4iKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJUT1RBTCIsIGdldFRvdGFsVGVzdENvdW50KCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIkNSQVNIRUQgKGFtb25nIGFsbCB0ZXN0cykiLCBtQ3Jhc2hlZFRlc3RzQ291bnQpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIlVORVhQRUNURUQgRkFJTFVSRVMiLCBtVW5leHBlY3RlZEZhaWx1cmVzQ3Vyc29yLmdldENvdW50KCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIlVORVhQRUNURUQgUEFTU0VTIiwgbVVuZXhwZWN0ZWRQYXNzZXNDdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiRVhQRUNURUQgRkFJTFVSRVMiLCBtRXhwZWN0ZWRGYWlsdXJlc0N1cnNvci5nZXRDb3VudCgpKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJFWFBFQ1RFRCBQQVNTRVMiLCBtRXhwZWN0ZWRQYXNzZXNDdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RhYmxlPiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTdW1tYXJ5VGFibGVSb3coU3RyaW5nQnVpbGRlciBodG1sLCBTdHJpbmcgY2FwdGlvbiwgaW50IHNpemUpIHsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0cj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQ+IiArIGNhcHRpb24gKyAiPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQ+IiArIHNpemUgKyAiPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvdHI+Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlc3VsdHNMaXN0KAorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBodG1sLCBTdHJpbmcgdGl0bGUsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgU3RyaW5nIGlkID0gIiI7CisgICAgICAgIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUgcmVzdWx0Q29kZTsKKworICAgICAgICBodG1sLmFwcGVuZCgiPGgyPiIgKyB0aXRsZSArICIgWyIgKyBjdXJzb3IuZ2V0Q291bnQoKSArICJdPC9oMj4iKTsKKworICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBYnN0cmFjdFJlc3VsdCByZXN1bHQ7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFN1bW1hcml6ZXJEQkhlbHBlci5nZXRBYnN0cmFjdFJlc3VsdChjdXJzb3IpOworCisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgICAgICByZXN1bHRDb2RlID0gcmVzdWx0LmdldFJlc3VsdENvZGUoKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iKTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUZWNobmljYWxseSwgdHdvIGRpZmZlcmVudCBwYXRocyBjb3VsZCBlbmQgdXAgYmVpbmcgdGhlIHNhbWUsIGJlY2F1c2UKKyAgICAgICAgICAgICAqICc6JyBpcyBhIHZhbGlkICBjaGFyYWN0ZXIgaW4gYSBwYXRoLiBIb3dldmVyLCBpdCBpcyBwcm9iYWJseSBub3QgZ29pbmcKKyAgICAgICAgICAgICAqIHRvIGNhdXNlIGFueSBwcm9ibGVtcyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWQgPSByZWxhdGl2ZVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvciwgIjoiKTsKKworICAgICAgICAgICAgLyoqIFdyaXRlIHRoZSB0ZXN0IG5hbWUgKi8KKyAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlID09IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUkVTVUxUU19ESUZGRVIpIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiNcIiBvbkNsaWNrPVwidG9nZ2xlRGlzcGxheSgnIiArIGlkICsgIicpOyIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJyZXR1cm4gZmFsc2U7XCI+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwidHJpXCIgaWQ9XCJ0cmkuIiArIGlkICsgIlwiPiYjeDI1YjY7IDwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJwYXRoXCI+IiArIHJlbGF0aXZlUGF0aCArICI8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvYT4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIiICsgZ2V0Vmlld1NvdXJjZVVybChyZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCkpLnRvU3RyaW5nKCkgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIHRhcmdldD1cIl9ibGFua1wiPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNxciBzcXJfIiArIChyZXN1bHQuZGlkUGFzcygpID8gInBhc3MiIDogImZhaWwiKSk7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIlwiPiYjeDI1YTA7IDwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJwYXRoXCI+IiArIHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKSArICI8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvYT4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFyZXN1bHQuZGlkUGFzcygpKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kVGFncyhodG1sLCByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9oMz4iKTsKKyAgICAgICAgICAgIGFwcGVuZEV4cGVjdGVkUmVzdWx0c1NvdXJjZXMocmVzdWx0LCBodG1sKTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgPT0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5SRVNVTFRTX0RJRkZFUikgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8ZGl2IGNsYXNzPVwiZGlmZlwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBpZD1cIiIgKyBpZCArICJcIj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZChyZXN1bHQuZ2V0RGlmZkFzSHRtbCgpKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiNcIiBvbkNsaWNrPVwidG9nZ2xlRGlzcGxheSgnIiArIGlkICsgIicpOyIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJyZXR1cm4gZmFsc2U7XCI+SGlkZTwvYT4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIHwgIik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIiICsgZ2V0Vmlld1NvdXJjZVVybChyZWxhdGl2ZVBhdGgpLnRvU3RyaW5nKCkgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIHRhcmdldD1cIl9ibGFua1wiPlNob3cgc291cmNlPC9hPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2Rpdj4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxkaXYgY2xhc3M9XCJzcGFjZVwiPjwvZGl2PiIpOworCisgICAgICAgICAgICBpZiAoKyttUmVzdWx0c1NpbmNlTGFzdEh0bWxEdW1wID09IFJFU1VMVFNfUEVSX0RVTVApIHsKKyAgICAgICAgICAgICAgICBkdW1wSHRtbFRvRmlsZShodG1sLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKKyAgICAgICAgfSB3aGlsZSAoIWN1cnNvci5pc0FmdGVyTGFzdCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kVGFncyhTdHJpbmdCdWlsZGVyIGh0bWwsIEFic3RyYWN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICAvKiogVGFnIHRlc3RzIHdoaWNoIGNyYXNoLCB0aW1lIG91dCBvciB3aGVyZSByZXN1bHRzIGRvbid0IG1hdGNoICovCisgICAgICAgIGlmIChyZXN1bHQuZGlkQ3Jhc2goKSkgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtIGNyYXNoZWRcIj5DcmFzaGVkPC9zcGFuPiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5kaWRUaW1lT3V0KCkpIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIDxzcGFuIGNsYXNzPVwibGlzdEl0ZW0gdGltZWRfb3V0XCI+VGltZWQgb3V0PC9zcGFuPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZSByZXN1bHRDb2RlID0gcmVzdWx0LmdldFJlc3VsdENvZGUoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlICE9IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUkVTVUxUU19NQVRDSCkgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPHNwYW4gY2xhc3M9XCJsaXN0SXRlbSAiICsgcmVzdWx0Q29kZS5uYW1lKCkgKyAiXCI+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQocmVzdWx0Q29kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9zcGFuPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIERldGVjdCBtaXNzaW5nIExUQyBmdW5jdGlvbiAqLworICAgICAgICBTdHJpbmcgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgPSByZXN1bHQuZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKTsKKyAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUiKSAmJgorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJoYXMgbm8gbWV0aG9kIikpIHsKKyAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiTGF5b3V0VGVzdENvbnRyb2xsZXIiKSkgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPHNwYW4gY2xhc3M9XCJsaXN0SXRlbSBub0x0Y1wiPkxUQyBmdW5jdGlvbiBtaXNzaW5nPC9zcGFuPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJFdmVudFNlbmRlciIpKSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtIG5vRXZlbnRTZW5kZXJcIj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiRVMgZnVuY3Rpb24gbWlzc2luZzwvc3Bhbj4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYXBwZW5kRXhwZWN0ZWRSZXN1bHRzU291cmNlcyhBYnN0cmFjdFJlc3VsdCByZXN1bHQsCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGh0bWwpIHsKKyAgICAgICAgU3RyaW5nIHRleHRTb3VyY2UgPSByZXN1bHQuZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aCgpOworICAgICAgICBTdHJpbmcgaW1hZ2VTb3VyY2UgPSByZXN1bHQuZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoKTsKKworICAgICAgICBpZiAodGV4dFNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBTaG93IGlmIGEgdGV4dCByZXN1bHQgaXMgbWlzc2luZy4gV2UgbWF5IHdhbnQgdG8gcmV2aXNpdCB0aGlzIGRlY2lzaW9uIHdoZW4gd2UgYWRkCisgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBpbWFnZSByZXN1bHRzLgorICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwic291cmNlXCI+RXhwZWN0ZWQgdGV4dHVhbCByZXN1bHQgbWlzc2luZzwvc3Bhbj4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNvdXJjZVwiPkV4cGVjdGVkIHRleHR1YWwgcmVzdWx0IGZyb206ICIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIiICsgRm9yd2FyZGVyTWFuYWdlci5nZXRIb3N0U2NoZW1lUG9ydChmYWxzZSkgKyAiTGF5b3V0VGVzdHMvIiArCisgICAgICAgICAgICAgICAgICAgIHRleHRTb3VyY2UgKyAiXCIiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgdGFyZ2V0PVwiX2JsYW5rXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCh0ZXh0U291cmNlICsgIjwvYT48L3NwYW4+Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltYWdlU291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNvdXJjZVwiPkV4cGVjdGVkIGltYWdlIHJlc3VsdCBmcm9tOiAiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiIiArIEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpICsgIkxheW91dFRlc3RzLyIgKworICAgICAgICAgICAgICAgICAgICBpbWFnZVNvdXJjZSArICJcIiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiB0YXJnZXQ9XCJfYmxhbmtcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKGltYWdlU291cmNlICsgIjwvYT48L3NwYW4+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkwgZ2V0Vmlld1NvdXJjZVVybChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiaHR0cCIsICJsb2NhbGhvc3QiLCBGb3J3YXJkZXJNYW5hZ2VyLkhUVFBfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgIi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9hbmRyb2lkL3ZpZXdfc291cmNlLnBocD9zcmM9IiArCisgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAicmVsYXRpdmVQYXRoPSIgKyByZWxhdGl2ZVBhdGg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyREJIZWxwZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXJEQkhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTEzZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyREJIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBiYXNpYyBjbGFzcyB0aGF0IHdyYXBzIGRhdGFiYXNlIGFjY2Vzc2VzIGluc2lkZSBpdHNlbGYgYW5kIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8KKyAqIHN0b3JlIGFuZCByZXRyaWV2ZSBBYnN0cmFjdFJlc3VsdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBTdW1tYXJpemVyREJIZWxwZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEFUSCA9ICJwYXRoIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JZVEVTID0gImJ5dGVzIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9OQU1FID0gIlN1bW1hcml6ZXJEQiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFCQVNFX1ZFUlNJT04gPSAxOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9GQUlMVVJFU19UQUJMRSA9ICJleHBlY3RlZEZhaWx1cmVzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVORVhQRUNURURfRkFJTFVSRVNfVEFCTEUgPSAidW5leHBlY3RlZEZhaWx1cmVzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1BBU1NFU19UQUJMRSA9ICJleHBleHRlZFBhc3NlcyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBVTkVYUEVDVEVEX1BBU1NFU19UQUJMRSA9ICJ1bmV4cGV4dGVkUGFzc2VzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBUQUJMRVNfTkFNRVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgeworICAgICAgICBUQUJMRVNfTkFNRVMuYWRkKEVYUEVDVEVEX0ZBSUxVUkVTX1RBQkxFKTsKKyAgICAgICAgVEFCTEVTX05BTUVTLmFkZChFWFBFQ1RFRF9QQVNTRVNfVEFCTEUpOworICAgICAgICBUQUJMRVNfTkFNRVMuYWRkKFVORVhQRUNURURfRkFJTFVSRVNfVEFCTEUpOworICAgICAgICBUQUJMRVNfTkFNRVMuYWRkKFVORVhQRUNURURfUEFTU0VTX1RBQkxFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGNyZWF0ZVRhYmxlcyhTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICBTdHJpbmcgY21kOworICAgICAgICBmb3IgKFN0cmluZyB0YWJsZU5hbWUgOiBUQUJMRVNfTkFNRVMpIHsKKyAgICAgICAgICAgIGNtZCA9ICJjcmVhdGUgdGFibGUgIiArIHRhYmxlTmFtZSArICIgKCIKKyAgICAgICAgICAgICAgICAgICAgKyBLRVlfSUQgKyAiIGludGVnZXIgcHJpbWFyeSBrZXkgYXV0b2luY3JlbWVudCwgIgorICAgICAgICAgICAgICAgICAgICArIEtFWV9QQVRIICsgIiB0ZXh0IG5vdCBudWxsLCAiCisgICAgICAgICAgICAgICAgICAgICsgS0VZX0JZVEVTICsgIiBibG9iIG5vdCBudWxsKTsiOworICAgICAgICAgICAgZGIuZXhlY1NRTChjbWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBkcm9wVGFibGVzKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHRhYmxlTmFtZSA6IFRBQkxFU19OQU1FUykgeworICAgICAgICAgICAgZGIuZXhlY1NRTCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIHRhYmxlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEYXRhYmFzZUhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworICAgICAgICBEYXRhYmFzZUhlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIERBVEFCQVNFX05BTUUsIG51bGwsIERBVEFCQVNFX1ZFUlNJT04pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgICAgICBkcm9wVGFibGVzKGRiKTsKKyAgICAgICAgICAgIGNyZWF0ZVRhYmxlcyhkYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25VcGdyYWRlKFNRTGl0ZURhdGFiYXNlIGRiLCBpbnQgb2xkVmVyc2lvbiwgaW50IG5ld1ZlcnNpb24pIHsKKyAgICAgICAgICAgIC8qKiBOT09QIGZvciBub3csIGJlY2F1c2Ugd2Ugd2lsbCBuZXZlciB1cGdyYWRlIHRoZSBkYiAqLworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIGRyb3BUYWJsZXMoZGIpOworICAgICAgICAgICAgY3JlYXRlVGFibGVzKGRiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRGF0YWJhc2VIZWxwZXIgbURiSGVscGVyOworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURiOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgcHVibGljIFN1bW1hcml6ZXJEQkhlbHBlcihDb250ZXh0IGN0eCkgeworICAgICAgICBtQ29udGV4dCA9IGN0eDsKKyAgICAgICAgbURiSGVscGVyID0gbmV3IERhdGFiYXNlSGVscGVyKG1Db250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbURiSGVscGVyLnJlc2V0KHRoaXMubURiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYiA9IG1EYkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIG1EYkhlbHBlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydEFic3RyYWN0UmVzdWx0KEFic3RyYWN0UmVzdWx0IHJlc3VsdCwgU3RyaW5nIHRhYmxlKSB7CisgICAgICAgIENvbnRlbnRWYWx1ZXMgY3YgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICBjdi5wdXQoS0VZX1BBVEgsIHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIGN2LnB1dChLRVlfQllURVMsIHJlc3VsdC5nZXRCeXRlcygpKTsKKyAgICAgICAgbURiLmluc2VydCh0YWJsZSwgbnVsbCwgY3YpOworICAgIH0KKworICAgIHB1YmxpYyBDdXJzb3IgZ2V0QWJzdHJhY3RSZXN1bHRzKFN0cmluZyB0YWJsZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtRGIucXVlcnkoZmFsc2UsIHRhYmxlLCBuZXcgU3RyaW5nW10ge0tFWV9CWVRFU30sIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgS0VZX1BBVEggKyAiIEFTQyIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQWJzdHJhY3RSZXN1bHQgZ2V0QWJzdHJhY3RSZXN1bHQoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICByZXR1cm4gQWJzdHJhY3RSZXN1bHQuY3JlYXRlKGN1cnNvci5nZXRCbG9iKGN1cnNvci5nZXRDb2x1bW5JbmRleChLRVlfQllURVMpKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjRkMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0Lk9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2s7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEFuIEFjdGl2aXR5IHRoYXQgZ2VuZXJhdGVzIGEgbGlzdCBvZiB0ZXN0cyBhbmQgc2VuZHMgdGhlIGludGVudCB0bworICogTGF5b3V0VGVzdHNFeGVjdXRlciB0byBydW4gdGhlbS4gSXQgYWxzbyByZXN0YXJ0cyB0aGUgTGF5b3V0VGVzdHNFeGVjdXRlcgorICogYWZ0ZXIgaXQgY3Jhc2hlcy4KKyAqLworcHVibGljIGNsYXNzIFRlc3RzTGlzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19URVNUX0xJU1RfUFJFTE9BREVSX0RPTkUgPSAwOworCisgICAgLyoqIENvbnN0YW50cyBmb3IgYWRkaW5nIGV4dHJhcyB0byBhbiBpbnRlbnQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9URVNUX1BBVEggPSAiVGVzdFBhdGgiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvZ3Jlc3NEaWFsb2cgc1Byb2dyZXNzRGlhbG9nOworCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVEVTVF9MSVNUX1BSRUxPQURFUl9ET05FOgorICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICBtVGVzdHNMaXN0ID0gKEFycmF5TGlzdDxTdHJpbmc+KW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IG1UZXN0c0xpc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICByZXN0YXJ0RXhlY3V0b3IoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbVRlc3RzTGlzdDsKKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisKKyAgICBwcml2YXRlIE9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBib29sZWFuIG1FdmVyeXRoaW5nRmluaXNoZWQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLyoqIFByZXBhcmUgdGhlIHByb2dyZXNzIGRpYWxvZyAqLworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coVGVzdHNMaXN0QWN0aXZpdHkudGhpcyk7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzU3R5bGUoUHJvZ3Jlc3NEaWFsb2cuU1RZTEVfU1BJTk5FUik7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRUaXRsZShSLnN0cmluZy5kaWFsb2dfcHJvZ3Jlc3NfdGl0bGUpOworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0TWVzc2FnZShnZXRUZXh0KFIuc3RyaW5nLmRpYWxvZ19wcm9ncmVzc19tc2cpKTsKKworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBpZiAoIWludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9SVU4pKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfVEVTVF9QQVRIKTsKKworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2hvdygpOworICAgICAgICBNZXNzYWdlIGRvbmVNc2cgPSBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTVNHX1RFU1RfTElTVF9QUkVMT0FERVJfRE9ORSk7CisKKyAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE1hbmFnZXJTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgc2VydmljZUludGVudC5wdXRFeHRyYSgicGF0aCIsIHBhdGgpOworICAgICAgICBzdGFydFNlcnZpY2Uoc2VydmljZUludGVudCk7CisKKyAgICAgICAgbmV3IFRlc3RzTGlzdFByZWxvYWRlclRocmVhZChwYXRoLCBkb25lTXNnKS5zdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTmV3SW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9SRUJPT1QpKSB7CisgICAgICAgICAgICBvbkNyYXNoSW50ZW50KGludGVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX1NIVVRET1dOKSkgeworICAgICAgICAgICAgb25FdmVyeXRoaW5nRmluaXNoZWRJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgYW4gaW50ZW50IHRoYXQgY29tZXMgZnJvbSBNYW5hZ2VTZXJ2aWNlIHdoZW4gY3Jhc2ggaXMgZGV0ZWN0ZWQuCisgICAgICogVGhlIGludGVudCBjb250YWlucyBhbiBpbmRleCBpbiBtVGVzdHNMaXN0IG9mIHRoZSB0ZXN0IHRoYXQgY3Jhc2hlZC4gVGVzdHNMaXN0QWN0aXZpdHkKKyAgICAgKiByZXN0YXJ0cyB0aGUgTGF5b3V0VGVzdHNFeGVjdXRvciBmcm9tIHRoZSBmb2xsb3dpbmcgdGVzdCBpbiBtVGVzdHNMaXN0LCBieSBzZW5kaW5nCisgICAgICogYW4gaW50ZW50IHRvIGl0LiBUaGlzIG5ldyBpbnRlbnQgY29udGFpbnMgYSBsaXN0IG9mIHJlbWFpbmluZyB0ZXN0cyB0byBydW4sCisgICAgICogdG90YWwgY291bnQgb2YgYWxsIHRlc3RzLCBhbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB0ZXN0IHRvIHJ1biBhZnRlciByZXN0YXJ0aW5nLgorICAgICAqIExheW91dFRlc3RFeGVjdXRvciBydW5zIHRoZW4gYXMgdXN1YWwsIHNlbmRpbmcgcmVwb3J0cyB0byBNYW5hZ2VyU2VydmljZS4gSWYgaXQKKyAgICAgKiBkZXRlY3RzIHRoZSBjcmFzaCBpdCBzZW5kcyBhIG5ldyBpbnRlbnQgYW5kIHRoZSBmbG93IHJlcGVhdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9uQ3Jhc2hJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBpbnQgbmV4dFRlc3RUb1J1biA9IGludGVudC5nZXRJbnRFeHRyYSgiY3Jhc2hlZFRlc3RJbmRleCIsIC0xKSArIDE7CisgICAgICAgIGlmIChuZXh0VGVzdFRvUnVuID4gMCAmJiBuZXh0VGVzdFRvUnVuIDw9IG1Ub3RhbFRlc3RDb3VudCkgeworICAgICAgICAgICAgcmVzdGFydEV4ZWN1dG9yKG5leHRUZXN0VG9SdW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrKE9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgaWYgKG1FdmVyeXRoaW5nRmluaXNoZWQpIHsKKyAgICAgICAgICAgIG1PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLm9uRmluaXNoZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkV2ZXJ5dGhpbmdGaW5pc2hlZEludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIFRvYXN0IHRvYXN0ID0gVG9hc3QubWFrZVRleHQodGhpcywKKyAgICAgICAgICAgICAgICAiQWxsIHRlc3RzIGZpbmlzaGVkLlxuUHJlc3MgYmFjayBrZXkgdG8gcmV0dXJuIHRvIHRoZSB0ZXN0cycgbGlzdC4iLAorICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKTsKKyAgICAgICAgdG9hc3Quc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUiwgLTQwLCAwKTsKKyAgICAgICAgdG9hc3Quc2hvdygpOworCisgICAgICAgIC8qKiBTaG93IHRoZSBkZXRhaWxzIHRvIHRoZSB1c2VyICovCisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IG5ldyBXZWJWaWV3KHRoaXMpOworICAgICAgICB3ZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRCdWlsdEluWm9vbUNvbnRyb2xzKHRydWUpOworICAgICAgICB3ZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0RW5hYmxlU21vb3RoVHJhbnNpdGlvbih0cnVlKTsKKyAgICAgICAgLyoqIFRoaXMgZW5hYmxlcyBkb3VibGUtdGFwIHRvIHpvb20gKi8KKyAgICAgICAgd2ViVmlldy5nZXRTZXR0aW5ncygpLnNldFVzZVdpZGVWaWV3UG9ydCh0cnVlKTsKKworICAgICAgICBzZXRDb250ZW50Vmlldyh3ZWJWaWV3KTsKKyAgICAgICAgd2ViVmlldy5sb2FkVXJsKFN1bW1hcml6ZXIuZ2V0RGV0YWlsc1VyaSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIG1FdmVyeXRoaW5nRmluaXNoZWQgPSB0cnVlOworICAgICAgICBpZiAobU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sub25GaW5pc2hlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcywgdG9nZXRoZXIgd2l0aCBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9uIiBpbiBtYW5pZmVzdCBmaWxlLCBwcmV2ZW50cworICAgICAqIHRoZSBhY3Rpdml0eSBmcm9tIHJlc3RhcnRpbmcgb24gb3JpZW50YXRpb24gY2hhbmdlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIG91dFN0YXRlLnB1dFN0cmluZ0FycmF5TGlzdCgidGVzdHNMaXN0IiwgbVRlc3RzTGlzdCk7CisgICAgICAgIG91dFN0YXRlLnB1dEludCgidG90YWxDb3VudCIsIG1Ub3RhbFRlc3RDb3VudCk7CisKKyAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBtVGVzdHNMaXN0ID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldFN0cmluZ0FycmF5TGlzdCgidGVzdHNMaXN0Iik7CisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoInRvdGFsQ291bnQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpc3RhcnRzIHRoZSBleGVjdXRlciBhY3Rpdml0eSBmcm9tIHRoZSBnaXZlbiB0ZXN0IG51bWJlciAoaW5jbHVzaXZlLCAwLWJhc2VkKS4KKyAgICAgKiBUaGlzIG51bWJlciBpcyBhbiBpbmRleCBpbiBtVGVzdHNMaXN0LCBub3QgdGhlIHN1Ymxpc3QgcGFzc2VkIGluIHRoZSBpbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRGcm9tCisgICAgICogICAgICB0ZXN0IGluZGV4IGluIG1UZXN0c0xpc3QgdG8gc3RhcnQgdGhlIHRlc3RzIGZyb20gKGluY2x1c2l2ZSwgMC1iYXNlZCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzdGFydEV4ZWN1dG9yKGludCBzdGFydEZyb20pIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIExheW91dFRlc3RzRXhlY3V0b3IuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fUlVOKTsKKworICAgICAgICBpZiAoc3RhcnRGcm9tIDwgbVRvdGFsVGVzdENvdW50KSB7CisgICAgICAgICAgICBpbnRlbnQucHV0U3RyaW5nQXJyYXlMaXN0RXh0cmEoTGF5b3V0VGVzdHNFeGVjdXRvci5FWFRSQV9URVNUU19MSVNULAorICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4obVRlc3RzTGlzdC5zdWJMaXN0KHN0YXJ0RnJvbSwgbVRvdGFsVGVzdENvdW50KSkpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKExheW91dFRlc3RzRXhlY3V0b3IuRVhUUkFfVEVTVF9JTkRFWCwgc3RhcnRGcm9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludGVudC5wdXRTdHJpbmdBcnJheUxpc3RFeHRyYShMYXlvdXRUZXN0c0V4ZWN1dG9yLkVYVFJBX1RFU1RTX0xJU1QsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdkNDdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgVGhyZWFkIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgYSBsaXN0cyBvZiB0ZXN0cyB0byBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkIjsKKworICAgIC8qKiBBIGxpc3QgY29udGFpbmluZyByZWxhdGl2ZSBwYXRocyBvZiB0ZXN0cyB0byBydW4gKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1UZXN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKworICAgIC8qKgorICAgICAqIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdpdGggdGhlIHRlc3RzIHdlIHdhbnQgdG8gcnVuIG9yIHBhcnRpY3VsYXIgdGVzdC4KKyAgICAgKiBVc2VkIHVwIHRvIGFuZCBpbmNsdWRpbmcgcHJlbG9hZFRlc3RzKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbGF0aXZlUGF0aDsKKworICAgIHByaXZhdGUgTWVzc2FnZSBtRG9uZU1zZzsKKworICAgIC8qKgorICAgICAqIFRoZSBnaXZlbiBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiBAcGFyYW0gZG9uZU1zZworICAgICAqLworICAgIHB1YmxpYyBUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQoU3RyaW5nIHBhdGgsIE1lc3NhZ2UgZG9uZU1zZykgeworICAgICAgICBtRmlsZUZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCk7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSBwYXRoOworICAgICAgICBtRG9uZU1zZyA9IGRvbmVNc2c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3RGaWxlKG1SZWxhdGl2ZVBhdGgpKSB7CisgICAgICAgICAgICBtVGVzdHNMaXN0LmFkZChtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvYWRUZXN0c0Zyb21VcmwobVJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBtRG9uZU1zZy5vYmogPSBtVGVzdHNMaXN0OworICAgICAgICBtRG9uZU1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbGwgdGhlIHRlc3RzIGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yaWVzIGFuZCBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCisgICAgICogaW50byBtVGVzdHNMaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRpclJlbGF0aXZlUGF0aAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkVGVzdHNGcm9tVXJsKFN0cmluZyByb290UmVsYXRpdmVQYXRoKSB7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBkaXJlY3Rvcmllc0xpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGRpcmVjdG9yaWVzTGlzdC5hZGQocm9vdFJlbGF0aXZlUGF0aCk7CisKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgU3RyaW5nIGl0ZW1OYW1lOworICAgICAgICB3aGlsZSAoIWRpcmVjdG9yaWVzTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGRpcmVjdG9yaWVzTGlzdC5yZW1vdmVGaXJzdCgpOworCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gZGlyUmVsYXRpdmVQYXRocyA9IEZzVXRpbHMuZ2V0TGF5b3V0VGVzdHNEaXJDb250ZW50cyhyZWxhdGl2ZVBhdGgsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChkaXJSZWxhdGl2ZVBhdGhzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGggOiBkaXJSZWxhdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lID0gbmV3IEZpbGUoZGlyUmVsYXRpdmVQYXRoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlRmlsdGVyLmlzVGVzdERpcihpdGVtTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzTGlzdC5hZGQoZGlyUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHRlc3RSZWxhdGl2ZVBhdGhzID0gRnNVdGlscy5nZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKHJlbGF0aXZlUGF0aCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmICh0ZXN0UmVsYXRpdmVQYXRocyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdGVzdFJlbGF0aXZlUGF0aCA6IHRlc3RSZWxhdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lID0gbmV3IEZpbGUodGVzdFJlbGF0aXZlUGF0aCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3RGaWxlKGl0ZW1OYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGNob29zZSB0byBza2lwIGFsbCB0aGUgdGVzdHMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gY3Jhc2guICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1GaWxlRmlsdGVyLmlzQ3Jhc2godGVzdFJlbGF0aXZlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdHNMaXN0LmFkZCh0ZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVE9ETzogU3VtbWFyaXplciBpcyBub3cgaW4gc2VydmljZSAtIGZpZ3VyZSBvdXQgaG93IHRvIHNlbmQgdGhlIGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUHJldmlvdXNseTogbVN1bW1hcml6ZXIuYWRkU2tpcHBlZFRlc3QocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDJiOThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGV4dFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBuYW1lLmZyYXNlci5uZWlsLnBsYWludGV4dC5kaWZmX21hdGNoX3BhdGNoOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQSByZXN1bHQgb2JqZWN0IGZvciB3aGljaCB0aGUgZXhwZWN0ZWQgb3V0cHV0IGlzIHRleHQuIEl0IGRvZXMgbm90IGhhdmUgYW4gaW1hZ2UKKyAqIGV4cGVjdGVkIHJlc3VsdC4KKyAqCisgKiA8cD5DcmVhdGVkIGlmIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKSB3YXMgY2FsbGVkLgorICovCitwdWJsaWMgY2xhc3MgVGV4dFJlc3VsdCBleHRlbmRzIEFic3RyYWN0UmVzdWx0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRE9DVU1FTlRfQVNfVEVYVCA9IDA7CisKKyAgICBwcml2YXRlIFN0cmluZyBtRXhwZWN0ZWRSZXN1bHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4cGVjdGVkUmVzdWx0UGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBtQWN0dWFsUmVzdWx0OworICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EaWRUaW1lT3V0OworICAgIHByaXZhdGUgUmVzdWx0Q29kZSBtUmVzdWx0Q29kZTsKKyAgICB0cmFuc2llbnQgcHJpdmF0ZSBNZXNzYWdlIG1SZXN1bHRPYnRhaW5lZE1zZzsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcENoaWxkRnJhbWVzQXNUZXh0OworCisgICAgdHJhbnNpZW50IHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19ET0NVTUVOVF9BU19URVhUKSB7CisgICAgICAgICAgICAgICAgbUFjdHVhbFJlc3VsdCA9IChTdHJpbmcpbXNnLm9iajsKKyAgICAgICAgICAgICAgICBtUmVzdWx0T2J0YWluZWRNc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIFRleHRSZXN1bHQoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldER1bXBDaGlsZEZyYW1lc0FzVGV4dChib29sZWFuIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCkgeworICAgICAgICBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gZHVtcENoaWxkRnJhbWVzQXNUZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gcmVjcmVhdGUgdGhlIFJlc3VsdCB3aGVuIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZQorICAgICAqICAgICAgYnVuZGxlIHdpdGggZGF0YSB1c2VkIHRvIHJlY3JlYXRlIHRoZSByZXN1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgVGV4dFJlc3VsdChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1FeHBlY3RlZFJlc3VsdCA9IGJ1bmRsZS5nZXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdCIpOworICAgICAgICBtRXhwZWN0ZWRSZXN1bHRQYXRoID0gYnVuZGxlLmdldFN0cmluZygiZXhwZWN0ZWRUZXh0dWFsUmVzdWx0UGF0aCIpOworICAgICAgICBtQWN0dWFsUmVzdWx0ID0gYnVuZGxlLmdldFN0cmluZygiYWN0dWFsVGV4dHVhbFJlc3VsdCIpOworICAgICAgICBzZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhidW5kbGUuZ2V0U3RyaW5nKCJhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyIpKTsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IGJ1bmRsZS5nZXRTdHJpbmcoInJlbGF0aXZlUGF0aCIpOworICAgICAgICBtRGlkVGltZU91dCA9IGJ1bmRsZS5nZXRCb29sZWFuKCJkaWRUaW1lT3V0Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXJSZXN1bHRzKCkgeworICAgICAgICBzdXBlci5jbGVhclJlc3VsdHMoKTsKKyAgICAgICAgbUV4cGVjdGVkUmVzdWx0ID0gbnVsbDsKKyAgICAgICAgbUFjdHVhbFJlc3VsdCA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpIHsKKyAgICAgICAgaWYgKG1SZXN1bHRDb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gcmVzdWx0c01hdGNoKCkgPyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlJFU1VMVFNfTUFUQ0gKKyAgICAgICAgICAgICAgICAgICAgOiBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlJFU1VMVFNfRElGRkVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtUmVzdWx0Q29kZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzdWx0c01hdGNoKCkgeworICAgICAgICBhc3NlcnQgbUV4cGVjdGVkUmVzdWx0ICE9IG51bGw7CisgICAgICAgIGFzc2VydCBtQWN0dWFsUmVzdWx0ICE9IG51bGw7CisgICAgICAgIC8vIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgZW1wdHkgbGluZXMsIGFzIG90aGVyIFdlYktpdCBwbGF0Zm9ybXMgZG8uCisgICAgICAgIFN0cmluZyBsZWFkaW5nRW1wdHlMaW5lcyA9ICJeXFxuKyI7CisgICAgICAgIFN0cmluZyB0cmFpbGluZ0VtcHR5TGluZXMgPSAiXFxuKyQiOworICAgICAgICBTdHJpbmcgdHJpbW1lZEV4cGVjdGVkUmVzdWx0ID0gbUV4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChsZWFkaW5nRW1wdHlMaW5lcywgIiIpCisgICAgICAgICAgICAgICAgLnJlcGxhY2VGaXJzdCh0cmFpbGluZ0VtcHR5TGluZXMsICIiKTsKKyAgICAgICAgU3RyaW5nIHRyaW1tZWRBY3R1YWxSZXN1bHQgPSBtQWN0dWFsUmVzdWx0LnJlcGxhY2VGaXJzdChsZWFkaW5nRW1wdHlMaW5lcywgIiIpCisgICAgICAgICAgICAgICAgLnJlcGxhY2VGaXJzdCh0cmFpbGluZ0VtcHR5TGluZXMsICIiKTsKKyAgICAgICAgcmV0dXJuIHRyaW1tZWRFeHBlY3RlZFJlc3VsdC5lcXVhbHModHJpbW1lZEFjdHVhbFJlc3VsdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGlkQ3Jhc2goKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBkaWRUaW1lT3V0KCkgeworICAgICAgICByZXR1cm4gbURpZFRpbWVPdXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RGlkVGltZU91dCgpIHsKKyAgICAgICAgbURpZFRpbWVPdXQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0dWFsVGV4dFJlc3VsdCgpIHsKKyAgICAgICAgU3RyaW5nIGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nID0gZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKTsKKyAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRpdGlvbmFsVGV4dFJlc3VsdFN0cmluZyArIG1BY3R1YWxSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUFjdHVhbFJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0KGJ5dGVbXSBleHBlY3RlZFJlc3VsdCkgeworICAgICAgICAvKiogVGhpcyBtZXRob2QgaXMgbm90IGFwcGxpY2FibGUgdG8gdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgLyoqIFRoaXMgbWV0aG9kIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoaXMgdHlwZSBvZiByZXN1bHQgKi8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKCkgeworICAgICAgICAvKiogVGhpcyBtZXRob2QgaXMgbm90IGFwcGxpY2FibGUgdG8gdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbUV4cGVjdGVkUmVzdWx0UGF0aCA9IHJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoKSB7CisgICAgICAgIHJldHVybiBtRXhwZWN0ZWRSZXN1bHRQYXRoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkVGV4dFJlc3VsdChTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgLy8gRm9yIHRleHQgcmVzdWx0cywgd2UgdXNlIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIGV4cGVjdGVkIHJlc3VsdCB3aGVuIG5vbmUgaXMKKyAgICAgICAgLy8gcHJlc2VudCwgYXMgb3RoZXIgV2ViS2l0IHBsYXRmb3JtcyBkby4KKyAgICAgICAgbUV4cGVjdGVkUmVzdWx0ID0gZXhwZWN0ZWRSZXN1bHQgPT0gbnVsbCA/ICIiIDogZXhwZWN0ZWRSZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREaWZmQXNIdG1sKCkgeworICAgICAgICBhc3NlcnQgbUV4cGVjdGVkUmVzdWx0ICE9IG51bGw7CisgICAgICAgIGFzc2VydCBtQWN0dWFsUmVzdWx0ICE9IG51bGw7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBodG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0YWJsZSBjbGFzcz1cInZpc3VhbF9kaWZmXCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRyIGNsYXNzPVwiaGVhZGVyc1wiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5FeHBlY3RlZCByZXN1bHQ6PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5BY3R1YWwgcmVzdWx0OjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90cj4iKTsKKworICAgICAgICBhcHBlbmREaWZmSHRtbChodG1sKTsKKworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ciBjbGFzcz1cImZvb3RlcnNcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdHI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RhYmxlPiIpOworCisgICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZERpZmZIdG1sKFN0cmluZ0J1aWxkZXIgaHRtbCkgeworICAgICAgICBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMgPQorICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoKCkuZGlmZl9tYWluKG1FeHBlY3RlZFJlc3VsdCwgbUFjdHVhbFJlc3VsdCk7CisKKyAgICAgICAgZGlmZnMgPSBWaXN1YWxEaWZmVXRpbHMuc3BsaXREaWZmc09uTmV3bGluZShkaWZmcyk7CisKKyAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGV4cGVjdGVkTGluZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gZXhwZWN0ZWRMaW5lTnVtcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBhY3R1YWxMaW5lcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBhY3R1YWxMaW5lTnVtcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisKKyAgICAgICAgVmlzdWFsRGlmZlV0aWxzLmdlbmVyYXRlRXhwZWN0ZWRSZXN1bHRMaW5lcyhkaWZmcywgZXhwZWN0ZWRMaW5lTnVtcywgZXhwZWN0ZWRMaW5lcyk7CisgICAgICAgIFZpc3VhbERpZmZVdGlscy5nZW5lcmF0ZUFjdHVhbFJlc3VsdExpbmVzKGRpZmZzLCBhY3R1YWxMaW5lTnVtcywgYWN0dWFsTGluZXMpOworICAgICAgICAvLyBUT0RPOiBXZSBzaG91bGQgdXNlIGEgbWFwIGZvciBlYWNoIGxpbmUgbnVtYmVyIGFuZCBsaW5lcyBwYWlyLgorICAgICAgICBhc3NlcnQgZXhwZWN0ZWRMaW5lcy5zaXplKCkgPT0gZXhwZWN0ZWRMaW5lTnVtcy5zaXplKCk7CisgICAgICAgIGFzc2VydCBhY3R1YWxMaW5lcy5zaXplKCkgPT0gYWN0dWFsTGluZU51bXMuc2l6ZSgpOworICAgICAgICBhc3NlcnQgZXhwZWN0ZWRMaW5lcy5zaXplKCkgPT0gYWN0dWFsTGluZXMuc2l6ZSgpOworCisgICAgICAgIGh0bWwuYXBwZW5kKFZpc3VhbERpZmZVdGlscy5nZXRIdG1sKGV4cGVjdGVkTGluZU51bXMsIGV4cGVjdGVkTGluZXMsCisgICAgICAgICAgICAgICAgYWN0dWFsTGluZU51bXMsIGFjdHVhbExpbmVzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBUZXN0VHlwZS5URVhUOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHMoV2ViVmlldyB3ZWJ2aWV3LCBNZXNzYWdlIHJlc3VsdE9idGFpbmVkTXNnKSB7CisgICAgICAgIG1SZXN1bHRPYnRhaW5lZE1zZyA9IHJlc3VsdE9idGFpbmVkTXNnOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0RPQ1VNRU5UX0FTX1RFWFQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBhcmcxIC0gc2hvdWxkIGR1bXAgdG9wIGZyYW1lIGFzIHRleHQKKyAgICAgICAgICogYXJnMiAtIHNob3VsZCBkdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0CisgICAgICAgICAqLworICAgICAgICBtc2cuYXJnMSA9IDE7CisgICAgICAgIG1zZy5hcmcyID0gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA/IDEgOiAwOworICAgICAgICB3ZWJ2aWV3LmRvY3VtZW50QXNUZXh0KG1zZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdCIsIG1FeHBlY3RlZFJlc3VsdCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdFBhdGgiLCBtRXhwZWN0ZWRSZXN1bHRQYXRoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiYWN0dWFsVGV4dHVhbFJlc3VsdCIsIGdldEFjdHVhbFRleHRSZXN1bHQoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nIiwgZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoInJlbGF0aXZlUGF0aCIsIG1SZWxhdGl2ZVBhdGgpOworICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiZGlkVGltZU91dCIsIG1EaWRUaW1lT3V0KTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygidHlwZSIsIGdldFR5cGUoKS5uYW1lKCkpOworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Zpc3VhbERpZmZVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjczMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgbmFtZS5mcmFzZXIubmVpbC5wbGFpbnRleHQuZGlmZl9tYXRjaF9wYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIEhlbHBlciBtZXRob2RzIGZvIFRleHRSZXN1bHQuZ2V0RGlmZkFzSHRtbCgpCisgKi8KK3B1YmxpYyBjbGFzcyBWaXN1YWxEaWZmVXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPTlRfUFJJTlRfTElORV9OVU1CRVIgPSAtMTsKKworICAgIC8qKgorICAgICAqIFByZXByb2Nlc3NlcyB0aGUgbGlzdCBvZiBkaWZmcyBzbyB0aGF0IG5ldyBsaW5lIGNoYXJhY3RlcnMgYXBwZWFyIG9ubHkgYXQgdGhlIGVuZCBvZgorICAgICAqIGRpZmYudGV4dAorICAgICAqCisgICAgICogQHBhcmFtIGRpZmZzCisgICAgICogQHJldHVybgorICAgICAqICAgICAgTGlua2VkTGlzdCBvZiBkaWZmcyB3aGVyZSBuZXcgbGluZSBjaGFyYWN0ZXIgYXBwZWFycyBvbmx5IG9uIHRoZSBlbmQgb2YKKyAgICAgKiAgICAgIGRpZmYudGV4dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IHNwbGl0RGlmZnNPbk5ld2xpbmUoCisgICAgICAgICAgICBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMpIHsKKyAgICAgICAgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IG5ld0RpZmZzID0gbmV3IExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPigpOworCisgICAgICAgIFN0cmluZ1tdIHBhcnRzOworICAgICAgICBpbnQgbGVuZ3RoTWludXNPbmU7CisgICAgICAgIGZvciAoZGlmZl9tYXRjaF9wYXRjaC5EaWZmIGRpZmYgOiBkaWZmcykgeworICAgICAgICAgICAgcGFydHMgPSBkaWZmLnRleHQuc3BsaXQoIlxuIiwgLTEpOworICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKGRpZmYpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW5ndGhNaW51c09uZSA9IHBhcnRzLmxlbmd0aCAtIDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aE1pbnVzT25lOyBpKyspIHsKKyAgICAgICAgICAgICAgICBuZXdEaWZmcy5hZGQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihkaWZmLm9wZXJhdGlvbiwgcGFydHNbaV0gKyAiXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBhcnRzW2xlbmd0aE1pbnVzT25lXS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBuZXdEaWZmcy5hZGQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihkaWZmLm9wZXJhdGlvbiwgcGFydHNbbGVuZ3RoTWludXNPbmVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3RGlmZnM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRXhwZWN0ZWRSZXN1bHRMaW5lcyhMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMsCisgICAgICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMpIHsKKyAgICAgICAgU3RyaW5nIGRlbFNwYW4gPSAiPHNwYW4gY2xhc3M9XCJkZWxcIj4iOworICAgICAgICBTdHJpbmcgZXFsU3BhbiA9ICI8c3BhbiBjbGFzcz1cImVxbFwiPiI7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBkaWZmX21hdGNoX3BhdGNoLkRpZmYgZGlmZjsKKyAgICAgICAgaW50IHNpemUgPSBkaWZmcy5zaXplKCk7CisgICAgICAgIGJvb2xlYW4gaXNMYXN0RGlmZjsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgIGRpZmYgPSBkaWZmcy5nZXQoaik7CisgICAgICAgICAgICBpc0xhc3REaWZmID0gaiA9PSBzaXplIC0gMTsKKyAgICAgICAgICAgIHN3aXRjaCAoZGlmZi5vcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZGVsU3BhbiwgaXNMYXN0RGlmZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBpcyBjdXJyZW50bHkgZW1wdHkgYW5kIHRoaXMgaW5zZXJ0aW9uIGlzIHRoZSBlbnRpcmUgbGluZSwgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIGxpbmUgaXMgYWJzZW50LCBzbyBpdCBoYXMgbm8gbGluZSBudW1iZXIuCisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLnRleHQuZW5kc1dpdGgoIlxuIikgfHwgaXNMYXN0RGlmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bXMuYWRkKGxpbmUuZXF1YWxzKCIiKSA/IERPTlRfUFJJTlRfTElORV9OVU1CRVIgOiBpKyspOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZXFsU3BhbiwgaXNMYXN0RGlmZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUFjdHVhbFJlc3VsdExpbmVzKExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBkaWZmcywKKyAgICAgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMsIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lcykgeworICAgICAgICBTdHJpbmcgaW5zU3BhbiA9ICI8c3BhbiBjbGFzcz1cImluc1wiPiI7CisgICAgICAgIFN0cmluZyBlcWxTcGFuID0gIjxzcGFuIGNsYXNzPVwiZXFsXCI+IjsKKworICAgICAgICBTdHJpbmcgbGluZSA9ICIiOworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmOworICAgICAgICBpbnQgc2l6ZSA9IGRpZmZzLnNpemUoKTsKKyAgICAgICAgYm9vbGVhbiBpc0xhc3REaWZmOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgICAgZGlmZiA9IGRpZmZzLmdldChqKTsKKyAgICAgICAgICAgIGlzTGFzdERpZmYgPSBqID09IHNpemUgLSAxOworICAgICAgICAgICAgc3dpdGNoIChkaWZmLm9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gcHJvY2Vzc0RpZmYoZGlmZiwgbGluZU51bXMsIGxpbmVzLCBsaW5lLCBpLCBpbnNTcGFuLCBpc0xhc3REaWZmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5lIGlzIGN1cnJlbnRseSBlbXB0eSBhbmQgZGVsZXRpb24gaXMgdGhlIGVudGlyZSBsaW5lLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsIGxpbmUgaXMgYWJzZW50LCBzbyBpdCBoYXMgbm8gbGluZSBudW1iZXIuCisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLnRleHQuZW5kc1dpdGgoIlxuIikgfHwgaXNMYXN0RGlmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bXMuYWRkKGxpbmUuZXF1YWxzKCIiKSA/IERPTlRfUFJJTlRfTElORV9OVU1CRVIgOiBpKyspOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZXFsU3BhbiwgaXNMYXN0RGlmZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIG9yIGFwcGVuZCBhIGxpbmUgZm9yIGEgZ2l2ZW4gZGlmZiBhbmQgYWRkIGl0IHRvIGdpdmVuIGNvbGxlY3Rpb25zIGlmIG5lY2Vzc2FyeS4KKyAgICAgKiBJdCBwdXRzIGRpZmZzIGluIEhUTUwgc3BhbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlmZgorICAgICAqIEBwYXJhbSBsaW5lTnVtcworICAgICAqIEBwYXJhbSBsaW5lcworICAgICAqIEBwYXJhbSBsaW5lCisgICAgICogQHBhcmFtIGkKKyAgICAgKiBAcGFyYW0gYmVnU3BhbgorICAgICAqIEBwYXJhbSBmb3JjZU91dHB1dExpbmUgRm9yY2UgdGhlIGN1cnJlbnQgbGluZSB0byBiZSBvdXRwdXQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0RpZmYoZGlmZl9tYXRjaF9wYXRjaC5EaWZmIGRpZmYsIExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMsCisgICAgICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMsIFN0cmluZyBsaW5lLCBpbnQgaSwgU3RyaW5nIGJlZ1NwYW4sIGJvb2xlYW4gZm9yY2VPdXRwdXRMaW5lKSB7CisgICAgICAgIFN0cmluZyBlbmRTcGFuID0gIjwvc3Bhbj4iOworICAgICAgICBTdHJpbmcgYnIgPSAiJm5ic3A7IjsKKworICAgICAgICBpZiAoZGlmZi50ZXh0LmVuZHNXaXRoKCJcbiIpIHx8IGZvcmNlT3V0cHV0TGluZSkgeworICAgICAgICAgICAgbGluZU51bXMuYWRkKGkpOworICAgICAgICAgICAgLyoqIFRPRE86IFRoaW5rIG9mIGJldHRlciB3YXkgdG8gcmVwbGFjZSBzdHVmZiAqLworICAgICAgICAgICAgbGluZSArPSBiZWdTcGFuICsgZGlmZi50ZXh0LnJlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIpCisgICAgICAgICAgICAgICAgICAgICsgZW5kU3BhbiArIGJyOworICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGluZSArPSBiZWdTcGFuICsgZGlmZi50ZXh0LnJlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIpICsgZW5kU3BhbjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEh0bWwoTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtczEsIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lczEsCisgICAgICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zMiwgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzMikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGh0bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpbnQgbGluZU51bTsKKyAgICAgICAgaW50IHNpemUgPSBsaW5lczEuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjx0ciBjbGFzcz1cInJlc3VsdHNcIj4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lX2NvdW50XCI+Iik7CisgICAgICAgICAgICBsaW5lTnVtID0gbGluZU51bXMxLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBpZiAobGluZU51bSA+IDApIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZChsaW5lTnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZChsaW5lczEucmVtb3ZlRmlyc3QoKSk7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVfY291bnRcIj4iKTsKKyAgICAgICAgICAgIGxpbmVOdW0gPSBsaW5lTnVtczIucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIGlmIChsaW5lTnVtID4gMCkgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVOdW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVzMi5yZW1vdmVGaXJzdCgpKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvdHI+Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGh0bWwudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQWRiVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9BZGJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDUwOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQWRiVXRpbHMuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CisKKy8qKgorICogVGhlIHV0aWxpdHkgY2xhc3MgdGhhdCBjYW4gc2V0dXAgYSBzb2NrZXQgYWxsb3dpbmcgdGhlIGRldmljZSB0byBjb21tdW5pY2F0ZSB3aXRoIHJlbW90ZQorICogbWFjaGluZXMgdGhyb3VnaCB0aGUgbWFjaGluZSB0aGF0IHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHZpYSBhZGIuCisgKi8KK3B1YmxpYyBjbGFzcyBBZGJVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWRiVXRpbHMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9PSyA9ICJPS0FZIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURCX1BPUlQgPSA1MDM3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREJfSE9TVCA9ICIxMjcuMC4wLjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREJfUkVTUE9OU0VfU0laRSA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRvIHNlcnZlIGFzIGEgdHJhbnNwYXJlbnQgcHJveHkgdG8gYQorICAgICAqIHJlbW90ZSBtYWNoaW5lLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSBjYWxsaW5nIGNvbmZpZ3VyZVNvY2tldCgpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc29ja2V0IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gbGluayB0byByZW1vdGUgbWFjaGluZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNvY2tldCBjcmVhdGVTb2NrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgIHJldHVybiBuZXcgU29ja2V0KEFEQl9IT1NULCBBREJfUE9SVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGUgY29ubmVjdGlvbiB0byBzZXJ2ZSBhcyBhIHRyYW5zcGFyZW50IHByb3h5IHRvIGEgcmVtb3RlIG1hY2hpbmUuCisgICAgICogVGhlIGdpdmVuIHN0cmVhbXMgbXVzdCBiZWxvbmcgdG8gYSBzb2NrZXQgY3JlYXRlZCBieSBjcmVhdGVTb2NrZXQoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSBvZiB0aGUgc29ja2V0IHdlIHdhbnQgdG8gY29uZmlndXJlCisgICAgICogQHBhcmFtIG91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gb2YgdGhlIHNvY2tldCB3ZSB3YW50IHRvIGNvbmZpZ3VyZQorICAgICAqIEBwYXJhbSByZW1vdGVBZGRyZXNzIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBtYWNoaW5lIChhcyB5b3Ugd291bGQgdHlwZSBpbiBhIGJyb3dzZXIKKyAgICAgKiAgICAgIGluIGEgbWFjaGluZSB0aGF0IHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHZpYSBhZGIpCisgICAgICogQHBhcmFtIHJlbW90ZVBvcnQgcG9ydCBvbiB3aGljaCB0byBjb25uZWN0CisgICAgICogQHJldHVybiBpZiB0aGUgY29uZmlndXJhdGlvbiBzdWNlZWRlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29uZmlndXJlQ29ubmVjdGlvbihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwKKyAgICAgICAgICAgIFN0cmluZyByZW1vdGVBZGRyZXNzLCBpbnQgcmVtb3RlUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNtZCA9ICJ0Y3A6IiArIHJlbW90ZVBvcnQgKyAiOiIgKyByZW1vdGVBZGRyZXNzOworICAgICAgICBjbWQgPSBTdHJpbmcuZm9ybWF0KCIlMDRYIiwgY21kLmxlbmd0aCgpKSArIGNtZDsKKworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbQURCX1JFU1BPTlNFX1NJWkVdOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoY21kLmdldEJ5dGVzKCkpOworICAgICAgICBpbnQgcmVhZCA9IGlucHV0U3RyZWFtLnJlYWQoYnVmKTsKKyAgICAgICAgaWYgKHJlYWQgIT0gQURCX1JFU1BPTlNFX1NJWkUgfHwgIUFEQl9PSy5lcXVhbHMobmV3IFN0cmluZyhidWYpKSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImFkYiBjbWQgZmFpbGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Db25uZWN0aW9uSGFuZGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0Nvbm5lY3Rpb25IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5Y2Q0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Db25uZWN0aW9uSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5Gc1V0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKKworLyoqCisgKiBXb3JrZXIgY2xhc3MgZm9yIHtAbGluayBGb3J3YXJkZXJ9LiBBIENvbm5lY3Rpb25IYW5kbGVyIHdpbGwgYmUgY3JlYXRlZCBvbmNlIHRoZSBGb3J3YXJkZXIKKyAqIGFjY2VwdHMgYW4gaW5jb21pbmcgY29ubmVjdGlvbiwgYW5kIGl0IHdpbGwgdGhlbiBmb3J3YXJkIHRoZSBpbmNvbWluZy9vdXRnb2luZyBzdHJlYW1zIHRvIGEKKyAqIGNvbm5lY3Rpb24gYWxyZWFkeSBwcm94aWVkIGJ5IGFkYiBuZXR3b3JraW5nIChzZWUgYWxzbyB7QGxpbmsgQWRiVXRpbHN9KS4KKyAqLworcHVibGljIGNsYXNzIENvbm5lY3Rpb25IYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkNvbm5lY3Rpb25IYW5kbGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uRmluaXNoZWRDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNvY2tldFBpcGVUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbUlucHV0U3RyZWFtOworICAgICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBtT3V0cHV0U3RyZWFtOworCisgICAgICAgIHB1YmxpYyBTb2NrZXRQaXBlVGhyZWFkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKyAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07CisgICAgICAgICAgICBzZXROYW1lKCJTb2NrZXRQaXBlVGhyZWFkOiAiICsgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGxlbmd0aCA9IG1JbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvKiogVGhpcyBleGNlcHRpb24gbWVhbnMgb25lIG9mIHRoZSBzdHJlYW1zIGlzIGNsb3NlZCAqLworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dfVEFHLCB0aGlzLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRocmVhZHNSdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgbVRocmVhZHNSdW5uaW5nLS07CisgICAgICAgICAgICAgICAgaWYgKG1UaHJlYWRzUnVubmluZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25IYW5kbGVyLnRoaXMuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICBtT25GaW5pc2hlZENhbGxiYWNrLm9uRmluaXNoZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEludGVnZXIgbVRocmVhZHNSdW5uaW5nOworCisgICAgcHJpdmF0ZSBTb2NrZXQgbUZyb21Tb2NrZXQsIG1Ub1NvY2tldDsKKyAgICBwcml2YXRlIFNvY2tldFBpcGVUaHJlYWQgbUZyb21Ub1BpcGUsIG1Ub0Zyb21QaXBlOworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbUZyb21Tb2NrZXRJbnB1dFN0cmVhbSwgbVRvU29ja2V0SW5wdXRTdHJlYW07CisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gbUZyb21Tb2NrZXRPdXRwdXRTdHJlYW0sIG1Ub1NvY2tldE91dHB1dFN0cmVhbTsKKworICAgIHByaXZhdGUgaW50IG1Qb3J0OworICAgIHByaXZhdGUgU3RyaW5nIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzOworCisgICAgcHJpdmF0ZSBPbkZpbmlzaGVkQ2FsbGJhY2sgbU9uRmluaXNoZWRDYWxsYmFjazsKKworICAgIHB1YmxpYyBDb25uZWN0aW9uSGFuZGxlcihTdHJpbmcgcmVtb3RlTWFjaGluZUlwLCBpbnQgcG9ydCwgU29ja2V0IGZyb21Tb2NrZXQsIFNvY2tldCB0b1NvY2tldCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzID0gcmVtb3RlTWFjaGluZUlwOworICAgICAgICBtUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgbUZyb21Tb2NrZXQgPSBmcm9tU29ja2V0OworICAgICAgICBtVG9Tb2NrZXQgPSB0b1NvY2tldDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUZyb21Tb2NrZXRJbnB1dFN0cmVhbSA9IG1Gcm9tU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBtVG9Tb2NrZXRJbnB1dFN0cmVhbSA9IG1Ub1NvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgbUZyb21Tb2NrZXRPdXRwdXRTdHJlYW0gPSBtRnJvbVNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG1Ub1NvY2tldE91dHB1dFN0cmVhbSA9IG1Ub1NvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIEFkYlV0aWxzLmNvbmZpZ3VyZUNvbm5lY3Rpb24obVRvU29ja2V0SW5wdXRTdHJlYW0sIG1Ub1NvY2tldE91dHB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgbVJlbW90ZU1hY2hpbmVJcEFkZHJlc3MsIG1Qb3J0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuYWJsZSB0byBzdGFydCBDb25uZWN0aW9uSGFuZGxlciIsIGUpOworICAgICAgICAgICAgY2xvc2VTdHJlYW1zKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgbUZyb21Ub1BpcGUgPSBuZXcgU29ja2V0UGlwZVRocmVhZChtRnJvbVNvY2tldElucHV0U3RyZWFtLCBtVG9Tb2NrZXRPdXRwdXRTdHJlYW0pOworICAgICAgICBtVG9Gcm9tUGlwZSA9IG5ldyBTb2NrZXRQaXBlVGhyZWFkKG1Ub1NvY2tldElucHV0U3RyZWFtLCBtRnJvbVNvY2tldE91dHB1dFN0cmVhbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJPbkNvbm5lY3Rpb25IYW5kbGVyRmluaXNoZWRDYWxsYmFjayhPbkZpbmlzaGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbU9uRmluaXNoZWRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbG9zZVN0cmVhbXMoKSB7CisgICAgICAgIEZzVXRpbHMuY2xvc2VJbnB1dFN0cmVhbShtRnJvbVNvY2tldElucHV0U3RyZWFtKTsKKyAgICAgICAgRnNVdGlscy5jbG9zZUlucHV0U3RyZWFtKG1Ub1NvY2tldElucHV0U3RyZWFtKTsKKyAgICAgICAgRnNVdGlscy5jbG9zZU91dHB1dFN0cmVhbShtRnJvbVNvY2tldE91dHB1dFN0cmVhbSk7CisgICAgICAgIEZzVXRpbHMuY2xvc2VPdXRwdXRTdHJlYW0obVRvU29ja2V0T3V0cHV0U3RyZWFtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgLyoqIFdlIGhhdmUgMiB0aHJlYWRzIHJ1bm5pbmcsIG9uZSBmb3IgZWFjaCBwaXBlLCB0aGF0IHdlIHN0YXJ0IGhlcmUuICovCisgICAgICAgIG1UaHJlYWRzUnVubmluZyA9IDI7CisgICAgICAgIG1Gcm9tVG9QaXBlLnN0YXJ0KCk7CisgICAgICAgIG1Ub0Zyb21QaXBlLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc2h1dGRvd24obUZyb21Tb2NrZXQpOworICAgICAgICBzaHV0ZG93bihtVG9Tb2NrZXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaHV0ZG93bihTb2NrZXQgc29ja2V0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUZyb21Ub1BpcGUpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRvRnJvbVBpcGUpIHsKKyAgICAgICAgICAgICAgICAvKiogVGhpcyB3aWxsIHN0b3AgdGhlIHdoaWxlIGxvb3AgaW4gdGhlIHJ1biBtZXRob2QgKi8KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNvY2tldC5pc0lucHV0U2h1dGRvd24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LnNodXRkb3duSW5wdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Gcm9tVG9QaXBlPSIgKyBtRnJvbVRvUGlwZSArICIgbVRvRnJvbVBpcGU9IiArIG1Ub0Zyb21QaXBlLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzb2NrZXQuaXNPdXRwdXRTaHV0ZG93bigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuc2h1dGRvd25PdXRwdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Gcm9tVG9QaXBlPSIgKyBtRnJvbVRvUGlwZSArICIgbVRvRnJvbVBpcGU9IiArIG1Ub0Zyb21QaXBlLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzb2NrZXQuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtRnJvbVRvUGlwZT0iICsgbUZyb21Ub1BpcGUgKyAiIG1Ub0Zyb21QaXBlPSIgKyBtVG9Gcm9tUGlwZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjJmYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBwb3J0IGZvcndhcmRpbmcgc2VydmVyLiBMaXN0ZW5zIG9uIGxvY2FsaG9zdCBvbiBzcGVjaWZpZWQgcG9ydCBhbmQgZm9yd2FyZHMgdGhlIHRjcAorICogY29tbXVuaWNhdGlvbnMgdG8gZXh0ZXJuYWwgc29ja2V0IHZpYSBhZGIgbmV0d29ya2luZyBwcm94eS4KKyAqLworcHVibGljIGNsYXNzIEZvcndhcmRlciBleHRlbmRzIFRocmVhZCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRm9yd2FyZGVyIjsKKworICAgIHByaXZhdGUgaW50IG1Qb3J0OworICAgIHByaXZhdGUgU3RyaW5nIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzOworCisgICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgbVNlcnZlclNvY2tldDsKKworICAgIHByaXZhdGUgU2V0PENvbm5lY3Rpb25IYW5kbGVyPiBtQ29ubmVjdGlvbkhhbmRsZXJzID0gbmV3IEhhc2hTZXQ8Q29ubmVjdGlvbkhhbmRsZXI+KCk7CisKKyAgICBwdWJsaWMgRm9yd2FyZGVyKGludCBwb3J0LCBTdHJpbmcgcmVtb3RlTWFjaGluZUlwQWRkcmVzcykgeworICAgICAgICBtUG9ydCA9IHBvcnQ7CisgICAgICAgIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzID0gcmVtb3RlTWFjaGluZUlwQWRkcmVzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInN0YXJ0KCk6IFN0YXJ0aW5nIGZvd2FyZGVyIG9uIHBvcnQ6ICIgKyBtUG9ydCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KG1Qb3J0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Qb3J0PSIgKyBtUG9ydCwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5zdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFNvY2tldCBsb2NhbFNvY2tldDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9jYWxTb2NrZXQgPSBtU2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qKiBUaGlzIG1vc3QgbGlrZWx5IG1lYW5zIHRoYXQgbVNlcnZlclNvY2tldCBpcyBhbHJlYWR5IGNsb3NlZCAqLworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJtUG9ydD0iICsgbVBvcnQsIGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTb2NrZXQgcmVtb3RlU29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpb25IYW5kbGVyIGNvbm5lY3Rpb25IYW5kbGVyOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZW1vdGVTb2NrZXQgPSBBZGJVdGlscy5jcmVhdGVTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uSGFuZGxlciA9IG5ldyBDb25uZWN0aW9uSGFuZGxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzLCBtUG9ydCwgbG9jYWxTb2NrZXQsIHJlbW90ZVNvY2tldCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbFNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Qb3J0PSIgKyBtUG9ydCwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZW1vdGVTb2NrZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtUG9ydD0iICsgbVBvcnQsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFdlIGhhdmUgdG8gY2xvc2UgdGhlIHNvY2tldHMgYWZ0ZXIgdGhlIENvbm5lY3Rpb25IYW5kbGVyIGZpbmlzaGVzLCBzbyB3ZQorICAgICAgICAgICAgICogZG9uJ3QgZ2V0ICJUb28gbWF5IG9wZW4gZmlsZXMiIGV4Y2VwdGlvbi4gV2UgYWxzbyByZW1vdmUgdGhlIENvbm5lY3Rpb25IYW5kbGVyCisgICAgICAgICAgICAgKiBmcm9tIHRoZSBjb2xsZWN0aW9uIHRvIGF2b2lkIG1lbW9yeSBpc3N1ZXMuCisgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgQ29ubmVjdGlvbkhhbmRsZXIuT25GaW5pc2hlZENhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbm5lY3Rpb25IYW5kbGVyLk9uRmluaXNoZWRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3Rpb25IYW5kbGVycy5yZW1vdmUoY29ubmVjdGlvbkhhbmRsZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogInJlbW92ZUNvbm5lY3Rpb25IYW5kbGVyKCk6IG5vdCBpbiB0aGUgY29sbGVjdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY29ubmVjdGlvbkhhbmRsZXIucmVnaXN0ZXJPbkNvbm5lY3Rpb25IYW5kbGVyRmluaXNoZWRDYWxsYmFjayhjYWxsYmFjayk7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSGFuZGxlcnMuYWRkKGNvbm5lY3Rpb25IYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbm5lY3Rpb25IYW5kbGVyLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGZvciAoQ29ubmVjdGlvbkhhbmRsZXIgY29ubmVjdGlvbkhhbmRsZXIgOiBtQ29ubmVjdGlvbkhhbmRsZXJzKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbkhhbmRsZXIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibVBvcnQ9IiArIG1Qb3J0LCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Gb3J3YXJkZXJNYW5hZ2VyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjQzNmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLmZvcndhcmRlcjsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBzaW1wbGUgY2xhc3MgdG8gc3RhcnQgYW5kIHN0b3AgRm9yd2FyZGVycyBydW5uaW5nIG9uIHNvbWUgcG9ydHMuCisgKgorICogSXQgdXNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIGFuZCBpcyB0aHJlYWQgc2FmZS4KKyAqLworcHVibGljIGNsYXNzIEZvcndhcmRlck1hbmFnZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkZvcndhcmRlck1hbmFnZXIiOworCisgICAgLyoqCisgICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBzZXJ2aW5nIHRoZSB0ZXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVF9JUCA9ICIxMjcuMC4wLjEiOworCisgICAgLyoqCisgICAgICogV2UgdXNlIHRoZXNlIHBvcnRzIGJlY2F1c2Ugb3RoZXIgd2Via2l0IHBsYXRmb3JtcyBkby4gVGhleSBhcmUgc2V0IHVwIGluCisgICAgICogZXh0ZXJuYWwvd2Via2l0L0xheW91dFRlc3RzL2h0dHAvY29uZi9hcGFjaGUyLWRlYmlhbi1odHRwZC5jb25mCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QT1JUID0gODAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQU19QT1JUID0gODQ0MzsKKworICAgIHByaXZhdGUgc3RhdGljIEZvcndhcmRlck1hbmFnZXIgZm9yd2FyZGVyTWFuYWdlcjsKKworICAgIHByaXZhdGUgU2V0PEZvcndhcmRlcj4gbUZvcndhcmRlcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1N0YXJ0ZWQ7CisKKyAgICBwcml2YXRlIEZvcndhcmRlck1hbmFnZXIoKSB7CisgICAgICAgIG1Gb3J3YXJkZXJzID0gbmV3IEhhc2hTZXQ8Rm9yd2FyZGVyPigyKTsKKyAgICAgICAgbUZvcndhcmRlcnMuYWRkKG5ldyBGb3J3YXJkZXIoSFRUUF9QT1JULCBIT1NUX0lQKSk7CisgICAgICAgIG1Gb3J3YXJkZXJzLmFkZChuZXcgRm9yd2FyZGVyKEhUVFBTX1BPUlQsIEhPU1RfSVApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYWluIHBhcnQgb2YgdGhlIFVSTCB3aXRoIHRoZSB0cmFpbGluZyBzbGFzaAorICAgICAqCisgICAgICogQHBhcmFtIGlzSHR0cHMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SG9zdFNjaGVtZVBvcnQoYm9vbGVhbiBpc0h0dHBzKSB7CisgICAgICAgIGludCBwb3J0OworICAgICAgICBTdHJpbmcgcHJvdG9jb2w7CisgICAgICAgIGlmIChpc0h0dHBzKSB7CisgICAgICAgICAgICBwcm90b2NvbCA9ICJodHRwcyI7CisgICAgICAgICAgICBwb3J0ID0gSFRUUFNfUE9SVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3RvY29sID0gImh0dHAiOworICAgICAgICAgICAgcG9ydCA9IEhUVFBfUE9SVDsKKyAgICAgICAgfQorCisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTChwcm90b2NvbCwgSE9TVF9JUCwgcG9ydCwgIi8iKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJpc0h0dHBzPSIgKyBpc0h0dHBzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZvcndhcmRlck1hbmFnZXIgZ2V0Rm9yd2FyZGVyTWFuYWdlcigpIHsKKyAgICAgICAgaWYgKGZvcndhcmRlck1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9yd2FyZGVyTWFuYWdlciA9IG5ldyBGb3J3YXJkZXJNYW5hZ2VyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvcndhcmRlck1hbmFnZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgaWYgKG1Jc1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJzdGFydCgpOiBGb3J3YXJkZXJNYW5hZ2VyIGFscmVhZHkgcnVubmluZyEgTk9PUC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoRm9yd2FyZGVyIGZvcndhcmRlciA6IG1Gb3J3YXJkZXJzKSB7CisgICAgICAgICAgICBmb3J3YXJkZXIuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Jc1N0YXJ0ZWQgPSB0cnVlOworICAgICAgICBMb2cuaShMT0dfVEFHLCAiRm9yd2FyZGVyTWFuYWdlciBzdGFydGVkLiIpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworICAgICAgICBpZiAoIW1Jc1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJzdG9wKCk6IEZvcndhcmRlck1hbmFnZXIgYWxyZWFkeSBzdG9wcGVkISBOT09QLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChGb3J3YXJkZXIgZm9yd2FyZGVyIDogbUZvcndhcmRlcnMpIHsKKyAgICAgICAgICAgIGZvcndhcmRlci5maW5pc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Jc1N0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgIkZvcndhcmRlck1hbmFnZXIgc3RvcHBlZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L09uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2suamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDQzNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L09uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydDsKKworLyoqCisgKiBDYWxsYmFjayB1c2VkIHRvIGluZm9ybSBzY3JpcHRzdXBwb3J0LlN0YXJ0ZXIgdGhhdCBldmVyeXRoaW5nIGlzIGZpbmlzaGVkIGFuZAorICogd2UgY2FuIGV4aXQKKyAqLworcHVibGljIGludGVyZmFjZSBPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrIHsKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TY3JpcHRUZXN0UnVubmVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1NjcmlwdFRlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY1OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TY3JpcHRUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKKworLyoqCisgKiBFeHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgdG8gYWxsb3cgdGhlIHNjcmlwdCB0byBwYXNzIGFyZ3VtZW50cyB0byB0aGUgYXBwbGljYXRpb24KKyAqLworcHVibGljIGNsYXNzIFNjcmlwdFRlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKKyAgICBTdHJpbmcgbVRlc3RzUmVsYXRpdmVQYXRoOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGFyZ3VtZW50cykgeworICAgICAgICBtVGVzdHNSZWxhdGl2ZVBhdGggPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJwYXRoIik7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0c1JlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXN0c1JlbGF0aXZlUGF0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TdGFydGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1N0YXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQxYTBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TdGFydGVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlRlc3RzTGlzdEFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXIuRm9yd2FyZGVyTWFuYWdlcjsKKworLyoqCisgKiBBIGNsYXNzIHdoaWNoIHByb3ZpZGVzIG1ldGhvZHMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSBhIHNjcmlwdCBydW5uaW5nIG9uIHRoZSBob3N0IG1hY2hpbmUgdG8KKyAqIHJ1biB0aGUgdGVzdHMuCisgKgorICogSXQgc3RhcnRzIGEgVGVzdHNMaXN0QWN0aXZpdHkgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgdGhlIHRlc3RzIGZpbmlzaCBleGVjdXRpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFydGVyIGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8VGVzdHNMaXN0QWN0aXZpdHk+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTdGFydGVyIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUV2ZXJ5dGhpbmdGaW5pc2hlZDsKKworICAgIHB1YmxpYyBTdGFydGVyKCkgeworICAgICAgICBzdXBlcihUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gYWRiIHRvIHN0YXJ0IGV4ZWN1dGluZyB0aGUgdGVzdHMuIEl0IGRvZXNuJ3QgcmV0dXJuCisgICAgICogdW50aWwgZXZlcnl0aGluZyBpcyBmaW5pc2hlZCBzbyB0aGF0IHRoZSBzY3JpcHQgY2FuIHdhaXQgZm9yIHRoZSBlbmQgaWYgaXQgbmVlZHMKKyAgICAgKiB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydExheW91dFRlc3RzKCkgeworICAgICAgICBTY3JpcHRUZXN0UnVubmVyIHJ1bm5lciA9IChTY3JpcHRUZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcnVubmVyLmdldFRlc3RzUmVsYXRpdmVQYXRoKCk7CisKKyAgICAgICAgRm9yd2FyZGVyTWFuYWdlci5nZXRGb3J3YXJkZXJNYW5hZ2VyKCkuc3RhcnQoKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIiLCAiVGVzdHNMaXN0QWN0aXZpdHkiKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JVTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0c0xpc3RBY3Rpdml0eS5FWFRSQV9URVNUX1BBVEgsIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIHNldEFjdGl2aXR5SW50ZW50KGludGVudCk7CisgICAgICAgIGdldEFjdGl2aXR5KCkucmVnaXN0ZXJPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrKG5ldyBPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrKCkgeworICAgICAgICAgICAgLyoqIFRoaXMgbWV0aG9kIGlzIHNhZmUgdG8gY2FsbCBvbiBhbnkgdGhyZWFkICovCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoZWQoKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChTdGFydGVyLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUV2ZXJ5dGhpbmdGaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZXIudGhpcy5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgd2hpbGUgKCFtRXZlcnl0aGluZ0ZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAic3RhcnRMYXlvdXRUZXN0cygpIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRm9yd2FyZGVyTWFuYWdlci5nZXRGb3J3YXJkZXJNYW5hZ2VyKCkuc3RvcCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3VpL0Rpckxpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTY5YTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnVpOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZpbGVGaWx0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZzVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlRlc3RzTGlzdEFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXIuRm9yd2FyZGVyTWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIEFjdGl2aXR5IHRoYXQgYWxsb3dzIG5hdmlnYXRpbmcgdGhyb3VnaCB0ZXN0cyBmb2xkZXJzIGFuZCBjaG9vc2luZyBmb2xkZXJzIG9yIHRlc3RzIHRvIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIERpckxpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJEaXJMaXN0QWN0aXZpdHkiOworCisgICAgLyoqIFRPRE86IFRoaXMgaXMganVzdCBhIGd1ZXNzIC0gdGhpbmsgb2YgYSBiZXR0ZXIgd2F5IHRvIGFjaGlldmUgaXQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVBTl9USVRMRV9DSEFSX1NJWkUgPSAxMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9HUkVTU19ESUFMT0dfREVMQVlfTVMgPSAyMDA7CisKKyAgICAvKiogQ29kZSBmb3IgdGhlIGRpYWxvZywgdXNlZCBpbiBzaG93RGlhbG9nIGFuZCBvbkNyZWF0ZURpYWxvZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUFMT0dfUlVOX0FCT1JUX0RJUiA9IDA7CisKKyAgICAvKiogTWVzc2FnZXMgY29kZXMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0xPQURFRF9JVEVNUyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRyA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFyU2VxdWVuY2UgTk9fUkVTUE9OU0VfTUVTU0FHRSA9CisgICAgICAgICAgICAiTm8gcmVzcG9uc2UgZnJvbSBob3N0IHdoZW4gZ2V0dGluZyBkaXJlY3RvcnkgY29udGVudHMuIElzIHRoZSBob3N0IHNlcnZlciBydW5uaW5nPyI7CisKKyAgICAvKiogSW5pdGlhbGl6ZWQgbGF6aWx5IGJlZm9yZSBmaXJzdCBzUHJvZ3Jlc3NEaWFsb2cuc2hvdygpICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvZ3Jlc3NEaWFsb2cgc1Byb2dyZXNzRGlhbG9nOworCisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdFZpZXc7CisKKyAgICAvKiogVGhpcyBpcyBhIHJlbGF0aXZlIHBhdGghICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnREaXJQYXRoOworCisgICAgLyoqCisgICAgICogQSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgZnJvbSBzZCBjYXJkCisgICAgICogYW5kIHNlbmRpbmcgdGhlbSB2aWEgTWVzc2FnZSB0byBtYWluIHRocmVhZCB0aGF0IHRoZW4gbG9hZHMgdGhlbSBpbnRvCisgICAgICogTGlzdFZpZXcKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIExvYWRMaXN0SXRlbXNUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICAgICAgcHVibGljIExvYWRMaXN0SXRlbXNUaHJlYWQoU3RyaW5nIHJlbGF0aXZlUGF0aCwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfTE9BREVEX0lURU1TKTsKKyAgICAgICAgICAgIG1zZy5vYmogPSBnZXREaXJMaXN0KG1SZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcnkgc2ltcGxlIG9iamVjdCB0byB1c2UgaW5zaWRlIExpc3RWaWV3IGFzIGFuIGl0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdEl0ZW0gaW1wbGVtZW50cyBDb21wYXJhYmxlPExpc3RJdGVtPiB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzRGlyZWN0b3J5OworCisgICAgICAgIHB1YmxpYyBMaXN0SXRlbShTdHJpbmcgcmVsYXRpdmVQYXRoLCBib29sZWFuIGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbU5hbWUgPSBuZXcgRmlsZShyZWxhdGl2ZVBhdGgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG1Jc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMaXN0SXRlbSBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5jb21wYXJlVG8oYW5vdGhlci5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdEl0ZW0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5lcXVhbHMoKChMaXN0SXRlbSlvKS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVsYXRpdmVQYXRoLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY3VzdG9tIGFkYXB0ZXIgdGhhdCBzZXRzIHRoZSBwcm9wZXIgaWNvbiBhbmQgbGFiZWwgaW4gdGhlIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEaXJMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxMaXN0SXRlbT4geworICAgICAgICBwcml2YXRlIEFjdGl2aXR5IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIExpc3RJdGVtW10gbUl0ZW1zOworCisgICAgICAgIHB1YmxpYyBEaXJMaXN0QWRhcHRlcihBY3Rpdml0eSBjb250ZXh0LCBMaXN0SXRlbVtdIGl0ZW1zKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBSLmxheW91dC5kaXJsaXN0X3JvdywgaXRlbXMpOworCisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtSXRlbXMgPSBpdGVtczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBtQ29udGV4dC5nZXRMYXlvdXRJbmZsYXRlcigpOworICAgICAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmRpcmxpc3Rfcm93LCBudWxsKTsKKworICAgICAgICAgICAgVGV4dFZpZXcgbGFiZWwgPSAoVGV4dFZpZXcpcm93LmZpbmRWaWV3QnlJZChSLmlkLmxhYmVsKTsKKyAgICAgICAgICAgIGxhYmVsLnNldFRleHQobUl0ZW1zW3Bvc2l0aW9uXS5nZXROYW1lKCkpOworCisgICAgICAgICAgICBJbWFnZVZpZXcgaWNvbiA9IChJbWFnZVZpZXcpcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOworICAgICAgICAgICAgaWYgKG1JdGVtc1twb3NpdGlvbl0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnJ1bnRlc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIEZvcndhcmRlck1hbmFnZXIuZ2V0Rm9yd2FyZGVyTWFuYWdlcigpLnN0YXJ0KCk7CisKKyAgICAgICAgbUxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKKworICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIExpc3RJdGVtIGl0ZW0gPSAoTGlzdEl0ZW0pcGFyZW50LmdldEl0ZW1BdFBvc2l0aW9uKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvd0RpcihpdGVtLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiogUnVuIHRoZSB0ZXN0ICovCisgICAgICAgICAgICAgICAgICAgIHJ1bkFsbFRlc3RzVW5kZXIoaXRlbS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUxvbmdDbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkl0ZW1Mb25nQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIExpc3RJdGVtIGl0ZW0gPSAoTGlzdEl0ZW0pcGFyZW50LmdldEl0ZW1BdFBvc2l0aW9uKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoMSk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRTdHJpbmcoIm5hbWUiLCBpdGVtLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRTdHJpbmcoInJlbGF0aXZlUGF0aCIsIGl0ZW0uZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBzaG93RGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSLCBhcmd1bWVudHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBNYXliZSBzaG93IHNvbWUgaW5mbyBhYm91dCBhIHRlc3Q/ICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8qKiBBbGwgdGhlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0ZXN0IHJvb3QgZGlyIHdoZXJlIHBvc3NpYmxlICovCisgICAgICAgIHNob3dEaXIoIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5BbGxUZXN0c1VuZGVyKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKERpckxpc3RBY3Rpdml0eS50aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdHNMaXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9QQVRILCByZWxhdGl2ZVBhdGgpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51Lmd1aV9tZW51LCBtZW51KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICBjYXNlIFIuaWQucnVuX2FsbDoKKyAgICAgICAgICAgICAgICBydW5BbGxUZXN0c1VuZGVyKG1DdXJyZW50RGlyUGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBpZiBvbmUgZXhpc3RzLiBEb2VzIG5vdCBhbGxvdyB0byBtb3ZlIGFib3ZlCisgICAgICogdGhlIHRlc3QgJ3Jvb3QnIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkJhY2tQcmVzc2VkKCkgeworICAgICAgICBGaWxlIGN1cnJlbnREaXJQYXJlbnQgPSBuZXcgRmlsZShtQ3VycmVudERpclBhdGgpLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgaWYgKGN1cnJlbnREaXJQYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2hvd0RpcihjdXJyZW50RGlyUGFyZW50LmdldFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaG93RGlyKCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIHRoZSBhY3Rpdml0eSBmcm9tIHJlY3JlYXRpbmcgb24gY2hhbmdlIG9mIG9yaWVudGF0aW9uLiBUaGUgdGl0bGUgbmVlZHMgdG8KKyAgICAgKiBiZSByZWNhbGN1bGF0ZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisKKyAgICAgICAgc2V0VGl0bGUoc2hvcnRlblRpdGxlKG1DdXJyZW50RGlyUGF0aCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEaWFsb2cgb25DcmVhdGVEaWFsb2coaW50IGlkLCBmaW5hbCBCdW5kbGUgYXJncykgeworICAgICAgICBEaWFsb2cgZGlhbG9nID0gbnVsbDsKKyAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcyk7CisKKyAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgY2FzZSBESUFMT0dfUlVOX0FCT1JUX0RJUjoKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFRpdGxlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfdGl0bGVfcHJlZml4KSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmdldFN0cmluZygibmFtZSIpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldE1lc3NhZ2UoUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldENhbmNlbGFibGUodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5BbGxUZXN0c1VuZGVyKGFyZ3MuZ2V0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgZGlhbG9nID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0T25DYW5jZWxMaXN0ZW5lcihuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbChEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGlhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIHRoZSBjb250ZW50cyBvZiBkaXIgaW50byB0aGUgbGlzdCB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGRpclBhdGgKKyAgICAgKiAgICAgIGRpcmVjdG9yeSB0byBsb2FkIGludG8gbGlzdCB2aWV3CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNob3dEaXIoU3RyaW5nIGRpclBhdGgpIHsKKyAgICAgICAgbUN1cnJlbnREaXJQYXRoID0gZGlyUGF0aDsKKworICAgICAgICAvKiogU2hvdyBwcm9ncmVzcyBkaWFsb2cgd2l0aCBhIGRlbGF5ICovCisgICAgICAgIGZpbmFsIEhhbmRsZXIgZGVsYXllZERpYWxvZ0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNQcm9ncmVzc0RpYWxvZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coRGlyTGlzdEFjdGl2aXR5LnRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldENhbmNlbGFibGUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzU3R5bGUoUHJvZ3Jlc3NEaWFsb2cuU1RZTEVfU1BJTk5FUik7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0VGl0bGUoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRNZXNzYWdlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX21zZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBNZXNzYWdlIG1zZ1Nob3dEaWFsb2cgPSBkZWxheWVkRGlhbG9nSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRyk7CisgICAgICAgIGRlbGF5ZWREaWFsb2dIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2dTaG93RGlhbG9nLCBQUk9HUkVTU19ESUFMT0dfREVMQVlfTVMpOworCisgICAgICAgIC8qKiBEZWxlZ2F0ZSBsb2FkaW5nIGNvbnRlbnRzIGZyb20gU0QgY2FyZCB0byBhIG5ldyB0aHJlYWQgKi8KKyAgICAgICAgbmV3IExvYWRMaXN0SXRlbXNUaHJlYWQobUN1cnJlbnREaXJQYXRoLCBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfTE9BREVEX0lURU1TKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFRpdGxlKHNob3J0ZW5UaXRsZShtQ3VycmVudERpclBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXllZERpYWxvZ0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1NIT1dfUFJPR1JFU1NfRElBTE9HKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNQcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cub2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KERpckxpc3RBY3Rpdml0eS50aGlzLCBOT19SRVNQT05TRV9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfTE9ORykuc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobmV3IERpckxpc3RBZGFwdGVyKERpckxpc3RBY3Rpdml0eS50aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTGlzdEl0ZW1bXSltc2cub2JqKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZmluZCBhIG5lYXQgd2F5IHRvIGRldGVybWluZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGZpdCBpbiB0aGUgdGl0bGUKKyAgICAgKiBiYXIuCisgICAgICogKi8KKyAgICBwcml2YXRlIFN0cmluZyBzaG9ydGVuVGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIGlmICh0aXRsZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICByZXR1cm4gIlRlc3RzJyByb290IGRpcjoiOworICAgICAgICB9CisgICAgICAgIGludCBjaGFyQ291bnQgPSBtTGlzdFZpZXcuZ2V0V2lkdGgoKSAvIE1FQU5fVElUTEVfQ0hBUl9TSVpFOworCisgICAgICAgIGlmICh0aXRsZS5sZW5ndGgoKSA+IGNoYXJDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuICIuLi4iICsgdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpIC0gY2hhckNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0aXRsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJyYXkgd2l0aCBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorICAgICAqIEZpcnN0IGl0IGNvbnRhaW5zIHRoZSBzdWJmb2xkZXJzLCB0aGVuIHRoZSBmaWxlcy4gQm90aCBzb3J0ZWQKKyAgICAgKiBhbHBoYWJldGljYWxseS4KKyAgICAgKgorICAgICAqIFRoZSBkaXJQYXRoIGlzIHJlbGF0aXZlLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdEl0ZW1bXSBnZXREaXJMaXN0KFN0cmluZyBkaXJQYXRoKSB7CisgICAgICAgIExpc3Q8TGlzdEl0ZW0+IHN1YkRpcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RJdGVtPigpOworICAgICAgICBMaXN0PExpc3RJdGVtPiBzdWJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZW0+KCk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IGRpclJlbGF0aXZlUGF0aHMgPSBGc1V0aWxzLmdldExheW91dFRlc3RzRGlyQ29udGVudHMoZGlyUGF0aCwgZmFsc2UsIHRydWUpOworICAgICAgICBpZiAoZGlyUmVsYXRpdmVQYXRocyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGggOiBkaXJSZWxhdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3REaXIobmV3IEZpbGUoZGlyUmVsYXRpdmVQYXRoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc3ViRGlycy5hZGQobmV3IExpc3RJdGVtKGRpclJlbGF0aXZlUGF0aCwgdHJ1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IHRlc3RSZWxhdGl2ZVBhdGhzID0gRnNVdGlscy5nZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKGRpclBhdGgsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGlmICh0ZXN0UmVsYXRpdmVQYXRocyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFN0cmluZyB0ZXN0UmVsYXRpdmVQYXRoIDogdGVzdFJlbGF0aXZlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChGaWxlRmlsdGVyLmlzVGVzdEZpbGUobmV3IEZpbGUodGVzdFJlbGF0aXZlUGF0aCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHN1YkZpbGVzLmFkZChuZXcgTGlzdEl0ZW0odGVzdFJlbGF0aXZlUGF0aCwgZmFsc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiBDb25jYXRlbmF0ZSB0aGUgdHdvIGxpc3RzICovCisgICAgICAgIHN1YkRpcnMuYWRkQWxsKHN1YkZpbGVzKTsKKworICAgICAgICByZXR1cm4gc3ViRGlycy50b0FycmF5KG5ldyBMaXN0SXRlbVtzdWJEaXJzLnNpemUoKV0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkLm1rIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3NDNmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gSHdBY2NlbGVyYXRpb25UZXN0CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNjM2VkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3QuaHd1aSI+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iSHdVaSIKKyAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJ0cnVlIj4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkFscGhhTGF5ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX86xTGF5ZXJzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQWR2YW5jZWRHcmFkaWVudHNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQWR2YW5jZWQgR3JhZGllbnRzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTGFiZWxzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0xhYmVscyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJSZXNpemVBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUmVzaXplIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0iYWRqdXN0UmVzaXplIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVGV4dEdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0dhbW1hIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRleHRHYW1tYUFjdGl2aXR5JFN1YkdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1N1YiBHYW1tYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMYXllcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGF5ZXJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTmV3TGF5ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX05ld0xheWVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlhmZXJtb2RlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1hmZXJtb2RlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9CaXRtYXBzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FscGhhQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0JpdG1hcHNBbHBoYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc1JlY3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQml0bWFwc1JlY3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUaGluUGF0Y2hlc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il85cGF0Y2hUaGluIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJOaW5lUGF0Y2hlc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il85cGF0Y2giPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJRdWlja1JlamVjdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9RdWlja1JlamVjdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlJvdGF0aW9uQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1JvdGF0aW9uIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iR3JhZGllbnRzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0dyYWRpZW50cyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJTaGFkZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NoYWRlcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUZXh0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0xpc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVHJhbnNwYXJlbnRMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1RyYW5zcGFyZW50TGlzdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ik1vcmVTaGFkZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NoYWRlcnMyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkNvbG9yRmlsdGVyc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9Db2xvckZpbHRlcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTGluZXNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGluZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlBhdGhzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1BhdGhzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRyYW5zZm9ybTNkQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iXzNkIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlNpbXBsZVBhdGhzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NpbXBsZVBhdGhzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkFkdmFuY2VkQmxlbmRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQWR2YW5jZWQgQmxlbmQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iRnJhbWVidWZmZXJCbGVuZEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9GcmFtZWJ1ZmZlckJsZW5kIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJTdGFja0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9TdGFja3MiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmYmRmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0MS5qcGcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0MS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NTFmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0Mi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0Mi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1OGVlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0My5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0My5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwOGIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfb2ZmLjkucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9idG5fdG9nZ2xlX29mZi45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmVlMWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9idG5fdG9nZ2xlX29mZi45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfb24uOS5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfb24uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlOTVhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9vbi45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvZGVmYXVsdF93YWxscGFwZXIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2FkOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2ljb24ucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQwYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3BhdGNoLjkucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9wYXRjaC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2IzNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9wYXRjaC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDEuanBnIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg1MWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDIucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDMucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA4YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9mb3JtLnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2Zvcm0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMTdkYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9mb3JtLnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkZpcnN0IG5hbWUiIC8+CisgICAgICAgIAorICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkVudGVyIHlvdXIgZmlyc3QgbmFtZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJMYXN0IG5hbWUiIC8+CisgICAgICAgIAorICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkVudGVyIHlvdXIgbGFzdCBuYW1lIiAvPgorICAgICAgICAKKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICA8RWRpdFRleHQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjZmY3ZjAwMDAiIC8+CisgICAgCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2xhYmVscy54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9sYWJlbHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NWEyY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9sYWJlbHMueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICBhbmRyb2lkOnRleHQ9IlRoaXMgaXMgYSBsb25nIHRleHQgdmlldyBmb3IgZWxsaXBzaXppbmciIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjIwMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iVGhpcyBpcyBhIHZlcnkgbG9uZyB0ZXh0IHZpZXcgZm9yIGVsbGlwc2l6aW5nIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICBhbmRyb2lkOnRleHQ9IlRoaXMgaXMgYSB2ZXJ5IGxvbmcgdGV4dCB2aWV3IGZvciBlbGxpcHNpemluZyIgLz4KKyAgIAorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2xpc3RfYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmEzNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQiIC8+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlbW92ZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIgLz4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQiIC8+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlbW92ZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDJkNzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIwZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIwZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSI+CisgICAgPFN0YWNrVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YWNrX3ZpZXciIAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzQ4cHgiIAorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjM3NHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOmNhY2hlQ29sb3JIaW50PSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6YXV0b1N0YXJ0PSJ0cnVlIiAvPgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrX2l0ZW0ueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2tfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNDAxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrX2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFja19pdGVtIiAgCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPiAKKyAgICA8RnJhbWVMYXlvdXQgIAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPiAKKyAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3X2ljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21pbmlfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgPFRleHRWaWV3IAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorPC9GcmFtZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X2xhcmdlLnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbGFyZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjM3NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X2xhcmdlLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZSIKKyAgICBhbmRyb2lkOnRleHQ9IldpZGdldCAiLz4gCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X21lZGl1bS54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X21lZGl1bS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxOTVlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbWVkaXVtLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2UiCisgICAgYW5kcm9pZDp0ZXh0PSJXaWRnZXQgIi8+IApkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9zbWFsbC54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X3NtYWxsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVlZTYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9zbWFsbC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbEludmVyc2UiCisgICAgYW5kcm9pZDp0ZXh0PSJXaWRnZXQgIi8+IApkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEJsZW5kQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFhMjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29tcG9zZVNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWR2YW5jZWRCbGVuZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2hhZGVyc1ZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTaGFkZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbUhvckdyYWRpZW50OworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2VTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTNTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTVTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTZTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWQyU2hhZGVyOworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIEJpdG1hcCB0ZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gdGV4dHVyZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbVRleEhlaWdodCA9IHRleHR1cmUuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtRHJhd1dpZHRoID0gbVRleFdpZHRoICogMi4yZjsKKyAgICAgICAgICAgIG1EcmF3SGVpZ2h0ID0gbVRleEhlaWdodCAqIDEuMmY7CisKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTIuc2V0U2NhbGUoMC41ZiwgMC41Zik7CisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0zID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTMuc2V0U2NhbGUoMC4xZiwgMC4xZik7CisgICAgICAgICAgICBtU2NhbGVkMlNoYWRlci5zZXRMb2NhbE1hdHJpeChtMyk7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5CTEFDSywgQ29sb3IuV0hJVEUsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1Db21wb3NlU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuREFSS0VOKTsKKyAgICAgICAgICAgIG1Db21wb3NlMlNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkxJR0hURU4pOworICAgICAgICAgICAgbUNvbXBvc2UzU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuTVVMVElQTFkpOworICAgICAgICAgICAgbUNvbXBvc2U0U2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU0NSRUVOKTsKKyAgICAgICAgICAgIG1Db21wb3NlNVNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkFERCk7CisgICAgICAgICAgICBtQ29tcG9zZTZTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtSG9yR3JhZGllbnQsIG1TY2FsZWRTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2VTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTNTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiArIG1EcmF3V2lkdGggKyA0MC4wZiwgNDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNlNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEdyYWRpZW50c0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEdyYWRpZW50c0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5NzRlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0FkdmFuY2VkR3JhZGllbnRzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3dlZXBHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIEFkdmFuY2VkR3JhZGllbnRzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBHcmFkaWVudHNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgR3JhZGllbnRzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTd2VlcEdyYWRpZW50IG1Td2VlcEdyYWRpZW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFJhZGlhbEdyYWRpZW50IG1SYWRpYWxHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXRyaXggbU1hdHJpeDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXRyaXggbU1hdHJpeDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWF0cml4IG1NYXRyaXgzOworCisgICAgICAgIEdyYWRpZW50c1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbVN3ZWVwR3JhZGllbnQgPSBuZXcgU3dlZXBHcmFkaWVudCgwLjBmLCAwLjBmLCAweGZmMDAwMDAwLCAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgIG1SYWRpYWxHcmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgwLjBmLCAwLjBmLCAxMDAuMGYsIDB4ZmYwMDAwMDAsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbU1hdHJpeC5zZXRSb3RhdGUoLTQ1LCAwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1NYXRyaXgucG9zdFRyYW5zbGF0ZSgxMDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIG1NYXRyaXgyID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbU1hdHJpeDIuc2V0U2NhbGUoMS4wZiwgMi4wZik7CisgICAgICAgICAgICBtTWF0cml4Mi5wb3N0Um90YXRlKC00NSwgMC4wZiwgMC4wZik7CisKKyAgICAgICAgICAgIG1NYXRyaXgzID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbU1hdHJpeDMuc2V0VHJhbnNsYXRlKDEwMC4wZiwgMTAwLjBmKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEzMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgbVN3ZWVwR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobU1hdHJpeDMpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtU3dlZXBHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAwLjBmLCAyMDAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAwLjBmLCAwMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU3dlZXBHcmFkaWVudC5zZXRMb2NhbE1hdHJpeChtTWF0cml4KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVN3ZWVwR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMjAwLjBmLCBtUGFpbnQpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwMC4wZiwgMDAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVN3ZWVwR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobU1hdHJpeDIpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtU3dlZXBHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAwLjBmLCAyMDAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLTgwMC4wZiwgMzAwLjBmKTsKKworICAgICAgICAgICAgbVJhZGlhbEdyYWRpZW50LnNldExvY2FsTWF0cml4KG51bGwpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtUmFkaWFsR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMjAwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwMC4wZiwgMDAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVJhZGlhbEdyYWRpZW50LnNldExvY2FsTWF0cml4KG1NYXRyaXgpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtUmFkaWFsR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMjAwLjBmLCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwMC4wZiwgMDAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVJhZGlhbEdyYWRpZW50LnNldExvY2FsTWF0cml4KG1NYXRyaXgyKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVJhZGlhbEdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMDAuMGYsIDIwMC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjhhOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BbHBoYUxheWVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWxwaGFMYXllcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJId1VpIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBEaXJ0eUJpdG1hcFZpZXcgY29udGFpbmVyID0gbmV3IERpcnR5Qml0bWFwVmlldyh0aGlzKTsKKworICAgICAgICBDb2xvclZpZXcgY29sb3IgPSBuZXcgQ29sb3JWaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhjb2xvciwgbmV3IERpcnR5Qml0bWFwVmlldy5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgZGlwVG9QeCh0aGlzLCAxMDApLCBkaXBUb1B4KHRoaXMsIDEwMCksIEdyYXZpdHkuQ0VOVEVSKSk7CisKKyAgICAgICAgQWxwaGFBbmltYXRpb24gYSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKTsKKyAgICAgICAgYS5zZXREdXJhdGlvbigyMDAwKTsKKyAgICAgICAgYS5zZXRSZXBlYXRDb3VudChBbmltYXRpb24uSU5GSU5JVEUpOworICAgICAgICBhLnNldFJlcGVhdE1vZGUoQW5pbWF0aW9uLlJFVkVSU0UpOworICAgICAgICBjb2xvci5zdGFydEFuaW1hdGlvbihhKTsKKworICAgICAgICBzZXRDb250ZW50Vmlldyhjb250YWluZXIpOworICAgIH0KKyAgICAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgc3RhdGljIGludCBkaXBUb1B4KENvbnRleHQgYywgaW50IGRpcCkgeworICAgICAgICByZXR1cm4gKGludCkgKGMuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5ICogZGlwICsgMC41Zik7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENvbG9yVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBDb2xvclZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigwLCAyNTUsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIERpcnR5Qml0bWFwVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgRGlydHlCaXRtYXBWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgyMDAuMGYsIDAuMGYsIDIyMC4wZiwgMjAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDEwMC4wZiwgMTAwLjBmLCAxMTAuMGYsIDExMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDI1LjBmLCA1LjBmLCAzMC4wZiwgMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZSgyLjBmLCAyLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoNTAuMGYsIDUwLjBmLCA2MC4wZiwgNjAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgyNS4wZiwgNS4wZiwgMzAuMGYsIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDIwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDgwLjBmLCA4MC4wZiwgOTAuMGYsIDkwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMjUuMGYsIDUuMGYsIDMwLjBmLCAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKDIuMGYsIDIuMGYpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAuMGYsIDIwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVUbyA9IGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoMC4wZiwgMTAwLjBmLCBnZXRXaWR0aCgpLCAxNTAuMGYsIDEyNywKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcgfCBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUcpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDEwMC4wZiwgNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDBmZmZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCg0MC4wZiwgMTAwLjBmLCAxNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgxNDAuMGYsIDEwMC4wZiwgMjQwLjBmLCAxNTAuMGYsIG1QYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZVRvKTsKKworICAgICAgICAgICAgc3VwZXIuZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTQzNTMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uU2NhbGVBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNDgwLCA4MDAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgICAgIAorICAgICAgICBTY2FsZUFuaW1hdGlvbiBhID0gbmV3IFNjYWxlQW5pbWF0aW9uKDEuMGYsIDIuMGYsIDEuMGYsIDIuMGYsCisgICAgICAgICAgICAgICAgU2NhbGVBbmltYXRpb24uUkVMQVRJVkVfVE9fU0VMRiwgMC41ZiwKKyAgICAgICAgICAgICAgICBTY2FsZUFuaW1hdGlvbi5SRUxBVElWRV9UT19TRUxGLDAuNWYpOworICAgICAgICBhLnNldER1cmF0aW9uKDIwMDApOworICAgICAgICBhLnNldFJlcGVhdENvdW50KEFuaW1hdGlvbi5JTkZJTklURSk7CisgICAgICAgIGEuc2V0UmVwZWF0TW9kZShBbmltYXRpb24uUkVWRVJTRSk7CisgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUG9ydGVyRHVmZlhmZXJtb2RlIG1Ec3RJbjsKKworICAgICAgICBCaXRtYXBzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1CaXRtYXAyID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDIpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1Ec3RJbiA9IG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLkRTVF9JTik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbUJpdG1hcDIuZ2V0V2lkdGgoKSwgbUJpdG1hcDIuZ2V0SGVpZ2h0KCksIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0WGZlcm1vZGUobURzdEluKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBbHBoYUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDljN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzQWxwaGFBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIGZpbmFsIEZyYW1lTGF5b3V0IGxheW91dCA9IG5ldyBGcmFtZUxheW91dCh0aGlzKTsKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcodmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyg0ODAsIDgwMCwgR3Jhdml0eS5DRU5URVIpKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtQml0bWFwUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDM7CisKKyAgICAgICAgQml0bWFwc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgIkxvYWRpbmcgc3Vuc2V0MSwgZGVmYXVsdCBvcHRpb25zIik7CisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJMb2FkaW5nIHN1bnNldDIsIGRlZmF1bHQgb3B0aW9ucyIpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiTG9hZGluZyBzdW5zZXQzLCBmb3JjaW5nIEFSR0ItODg4OCIpOworICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdHMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CisgICAgICAgICAgICBvcHRzLmluUHJlZmVycmVkQ29uZmlnID0gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODg7CisgICAgICAgICAgICBtQml0bWFwMyA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQzLCBvcHRzKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICIgICAgaGFzIGJpdG1hcCBhbHBoYT8gIiArIG1CaXRtYXAzLmhhc0FscGhhKCkpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICI9PT09PT09PT09PT09PT09PSBEcmF3Iik7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCA1MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJpdG1hcFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAzLCAwLjBmLCAwLjBmLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTkyMjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc1JlY3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQml0bWFwc1JlY3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCaXRtYXBzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1CaXRtYXBQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVNyY1JlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3QyOworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKworICAgICAgICAgICAgZmluYWwgZmxvYXQgZm91cnRoID0gbUJpdG1hcDEuZ2V0V2lkdGgoKSAvIDQuMGY7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBoYWxmID0gbUJpdG1hcDEuZ2V0SGVpZ2h0KCkgLyAyLjBmOworICAgICAgICAgICAgbVNyY1JlY3QgPSBuZXcgUmVjdCgoaW50KSBmb3VydGgsIChpbnQpIChoYWxmIC0gaGFsZiAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoZm91cnRoICsgZm91cnRoKSwgKGludCkgKGhhbGYgKyBoYWxmIC8gMi4wZikpOworICAgICAgICAgICAgbURzdFJlY3QgPSBuZXcgUmVjdEYoZm91cnRoLCBoYWxmIC0gaGFsZiAvIDIuMGYsIGZvdXJ0aCArIGZvdXJ0aCwgaGFsZiArIGhhbGYgLyAyLjBmKTsKKyAgICAgICAgICAgIG1Ec3RSZWN0MiA9IG5ldyBSZWN0Rihmb3VydGgsIGhhbGYgLSBoYWxmIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgKGZvdXJ0aCArIGZvdXJ0aCkgKiAzLjBmLCAoaGFsZiArIGhhbGYgLyAyLjBmKSAqIDMuMGYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDUwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBtU3JjUmVjdCwgbURzdFJlY3QsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtMTAwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgbVNyY1JlY3QsIG1Ec3RSZWN0MiwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQ29sb3JGaWx0ZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ2M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQ29sb3JGaWx0ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4Q29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaWdodGluZ0NvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQ29sb3JGaWx0ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1Db2xvck1hdHJpeFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MaWdodGluZ1BhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbGVuZFBhaW50OworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBmaW5hbCBDb2xvck1hdHJpeCBjb2xvck1hdHJpeCA9IG5ldyBDb2xvck1hdHJpeCgpOworICAgICAgICAgICAgY29sb3JNYXRyaXguc2V0U2F0dXJhdGlvbigwKTsKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50LnNldENvbG9yRmlsdGVyKG5ldyBDb2xvck1hdHJpeENvbG9yRmlsdGVyKGNvbG9yTWF0cml4KSk7CisKKyAgICAgICAgICAgIG1MaWdodGluZ1BhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGlnaHRpbmdQYWludC5zZXRDb2xvckZpbHRlcihuZXcgTGlnaHRpbmdDb2xvckZpbHRlcigweDAwNjBmZmZmLCAweDAwMTAxMDMwKSk7CisKKyAgICAgICAgICAgIG1CbGVuZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQmxlbmRQYWludC5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKDB4N2Y5OTAwNDAsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAxLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmICsgbUJpdG1hcDEuZ2V0V2lkdGgoKSArIDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAyLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0ZyYW1lYnVmZmVyQmxlbmRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvRnJhbWVidWZmZXJCbGVuZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NmJhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0ZyYW1lYnVmZmVyQmxlbmRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBGcmFtZWJ1ZmZlckJsZW5kQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBCbGVuZFZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCbGVuZFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleFdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtVGV4SGVpZ2h0OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtSG9yR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgQml0bWFwIG1UZXh0dXJlOworCisgICAgICAgIEJsZW5kVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtVGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IG1UZXh0dXJlLmdldFdpZHRoKCk7CisgICAgICAgICAgICBtVGV4SGVpZ2h0ID0gbVRleHR1cmUuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtVGV4V2lkdGgsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLkJMQUNLLCBDb2xvci5XSElURSwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwKGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlLkRBUktFTik7CisgICAgICAgICAgICBkcmF3QmxlbmRlZEJpdG1hcChjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5MSUdIVEVOKTsKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwKGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlLk1VTFRJUExZKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtVGV4V2lkdGggKyA0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBkcmF3QmxlbmRlZEJpdG1hcChjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5TQ1JFRU4pOworICAgICAgICAgICAgZHJhd0JsZW5kZWRCaXRtYXAoY2FudmFzLCBQb3J0ZXJEdWZmLk1vZGUuQUREKTsKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwSW52ZXJzZShjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkcmF3QmxlbmRlZEJpdG1hcChDYW52YXMgY2FudmFzLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRYZmVybW9kZShudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1UZXh0dXJlLCAwLjBmLCAwLjBmLCBtUGFpbnQpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShtb2RlKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbVRleFdpZHRoLCBtVGV4SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbVRleEhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0JsZW5kZWRCaXRtYXBJbnZlcnNlKENhbnZhcyBjYW52YXMsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobnVsbCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbVRleFdpZHRoLCBtVGV4SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShtb2RlKSk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobVRleHR1cmUsIDAuMGYsIDAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtVGV4SGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0dyYWRpZW50c0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9HcmFkaWVudHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTYyNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9HcmFkaWVudHNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaW5lYXJHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Td2VlcEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBHcmFkaWVudHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgZmluYWwgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworCisgICAgICAgIGZpbmFsIFNoYWRlcnNWaWV3IHNoYWRlcnNWaWV3ID0gbmV3IFNoYWRlcnNWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBHcmFkaWVudFZpZXcgZ3JhZGllbnRWaWV3ID0gbmV3IEdyYWRpZW50Vmlldyh0aGlzKTsKKyAgICAgICAgZmluYWwgUmFkaWFsR3JhZGllbnRWaWV3IHJhZGlhbEdyYWRpZW50VmlldyA9IG5ldyBSYWRpYWxHcmFkaWVudFZpZXcodGhpcyk7CisgICAgICAgIGZpbmFsIFN3ZWVwR3JhZGllbnRWaWV3IHN3ZWVwR3JhZGllbnRWaWV3ID0gbmV3IFN3ZWVwR3JhZGllbnRWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBCaXRtYXBWaWV3IGJpdG1hcFZpZXcgPSBuZXcgQml0bWFwVmlldyh0aGlzKTsKKworICAgICAgICBmaW5hbCBTZWVrQmFyIHJvdGF0ZVZpZXcgPSBuZXcgU2Vla0Jhcih0aGlzKTsKKyAgICAgICAgcm90YXRlVmlldy5zZXRNYXgoMzYwKTsKKyAgICAgICAgcm90YXRlVmlldy5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihuZXcgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIGdyYWRpZW50Vmlldy5zZXRSb3RhdGlvblkoKGZsb2F0KSBwcm9ncmVzcyk7CisgICAgICAgICAgICAgICAgcmFkaWFsR3JhZGllbnRWaWV3LnNldFJvdGF0aW9uWCgoZmxvYXQpIHByb2dyZXNzKTsKKyAgICAgICAgICAgICAgICBzd2VlcEdyYWRpZW50Vmlldy5zZXRSb3RhdGlvblkoKGZsb2F0KSBwcm9ncmVzcyk7CisgICAgICAgICAgICAgICAgYml0bWFwVmlldy5zZXRSb3RhdGlvblgoKGZsb2F0KSBwcm9ncmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcoc2hhZGVyc1ZpZXcpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhncmFkaWVudFZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgMjAwLCAyMDAsIEdyYXZpdHkuQ0VOVEVSKSk7CisKKyAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygyMDAsIDIwMCwgR3Jhdml0eS5DRU5URVIpOworICAgICAgICBscC5zZXRNYXJnaW5zKDIyMCwgMCwgMCwgMCk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHJhZGlhbEdyYWRpZW50VmlldywgbHApOworCisgICAgICAgIGxwID0gbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygyMDAsIDIwMCwgR3Jhdml0eS5DRU5URVIpOworICAgICAgICBscC5zZXRNYXJnaW5zKDQ0MCwgMCwgMCwgMCk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHN3ZWVwR3JhZGllbnRWaWV3LCBscCk7CisKKyAgICAgICAgbHAgPSBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKDIwMCwgMjAwLCBHcmF2aXR5LkNFTlRFUik7CisgICAgICAgIGxwLnNldE1hcmdpbnMoMjIwLCAtMjIwLCAwLCAwKTsKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcoYml0bWFwVmlldywgbHApOworCisgICAgICAgIGxheW91dC5hZGRWaWV3KHJvdGF0ZVZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgMzAwLCBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUwgfCBHcmF2aXR5LkJPVFRPTSkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBjbGFzcyBCaXRtYXBWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVBhaW50OworCisgICAgICAgIEJpdG1hcFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgQml0bWFwIHRleHR1cmUgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBCaXRtYXBTaGFkZXIgc2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuUkVQRUFULAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuUkVQRUFUKTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihzaGFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oMjAwLCAyMDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgbVBhaW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgR3JhZGllbnRWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVBhaW50OworCisgICAgICAgIEdyYWRpZW50VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBMaW5lYXJHcmFkaWVudCBncmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLCAwLCAyMDAsIDAsIDB4RkYwMDAwMDAsIDAsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIoZ3JhZGllbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oMjAwLCAyMDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgbVBhaW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBSYWRpYWxHcmFkaWVudFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgUmFkaWFsR3JhZGllbnRWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDAuMGYsIDAuMGYsIDEwMC4wZiwgMHhmZjAwMDAwMCwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIoZ3JhZGllbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oMjAwLCAyMDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgbVBhaW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgU3dlZXBHcmFkaWVudFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgU3dlZXBHcmFkaWVudFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgU3dlZXBHcmFkaWVudCBncmFkaWVudCA9IG5ldyBTd2VlcEdyYWRpZW50KDEwMC4wZiwgMTAwLjBmLCAweGZmMDAwMDAwLCAweGZmZmZmZmZmKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIoZ3JhZGllbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oMjAwLCAyMDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgbVBhaW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgc3RhdGljIGNsYXNzIFNoYWRlcnNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGluZWFyR3JhZGllbnQgbUdyYWRpZW50OworICAgICAgICBwcml2YXRlIGZpbmFsIE1hdHJpeCBtTWF0cml4OworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1EcmF3V2lkdGggPSAyMDA7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IDIwMDsKKworICAgICAgICAgICAgbUdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAsIDAsIDAsIDEsIDB4RkYwMDAwMDAsIDAsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworCisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgLy8gR3JhZGllbnRzCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgZmxvYXQgdG9wID0gNDAuMGY7CisgICAgICAgICAgICBmbG9hdCByaWdodCA9IDQwLjBmICsgbURyYXdXaWR0aDsKKyAgICAgICAgICAgIGZsb2F0IGxlZnQgPSA0MC4wZjsKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSA9IDQwLjBmICsgbURyYXdIZWlnaHQ7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUdyYWRpZW50KTsKKworICAgICAgICAgICAgbU1hdHJpeC5zZXRTY2FsZSgxLCBtRHJhd1dpZHRoKTsKKyAgICAgICAgICAgIG1NYXRyaXgucG9zdFJvdGF0ZSg5MCk7CisgICAgICAgICAgICBtTWF0cml4LnBvc3RUcmFuc2xhdGUocmlnaHQsIHRvcCk7CisgICAgICAgICAgICBtR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobU1hdHJpeCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QocmlnaHQgLSBtRHJhd1dpZHRoLCB0b3AsIHJpZ2h0LCB0b3AgKyBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgdG9wICs9IDQwLjBmICsgbURyYXdIZWlnaHQ7CisgICAgICAgICAgICBib3R0b20gKz0gNDAuMGYgKyBtRHJhd0hlaWdodDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbU1hdHJpeC5zZXRTY2FsZSgxLCBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtTWF0cml4LnBvc3RUcmFuc2xhdGUobGVmdCwgdG9wKTsKKyAgICAgICAgICAgIG1HcmFkaWVudC5zZXRMb2NhbE1hdHJpeChtTWF0cml4KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCB0b3AgKyBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbGVmdCArPSA0MC4wZiArIG1EcmF3V2lkdGg7CisgICAgICAgICAgICByaWdodCArPSA0MC4wZiArIG1EcmF3V2lkdGg7CisgICAgICAgICAgICB0b3AgLT0gNDAuMGYgKyBtRHJhd0hlaWdodDsKKyAgICAgICAgICAgIGJvdHRvbSAtPSA0MC4wZiArIG1EcmF3SGVpZ2h0OworCisgICAgICAgICAgICBtTWF0cml4LnNldFNjYWxlKDEsIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1NYXRyaXgucG9zdFJvdGF0ZSgxODApOworICAgICAgICAgICAgbU1hdHJpeC5wb3N0VHJhbnNsYXRlKGxlZnQsIGJvdHRvbSk7CisgICAgICAgICAgICBtR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobU1hdHJpeCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobGVmdCwgYm90dG9tIC0gbURyYXdIZWlnaHQsIHJpZ2h0LCBib3R0b20sIG1QYWludCk7CisKKyAgICAgICAgICAgIHRvcCArPSA0MC4wZiArIG1EcmF3SGVpZ2h0OworICAgICAgICAgICAgYm90dG9tICs9IDQwLjBmICsgbURyYXdIZWlnaHQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1NYXRyaXguc2V0U2NhbGUoMSwgbURyYXdXaWR0aCk7CisgICAgICAgICAgICBtTWF0cml4LnBvc3RSb3RhdGUoLTkwKTsKKyAgICAgICAgICAgIG1NYXRyaXgucG9zdFRyYW5zbGF0ZShsZWZ0LCB0b3ApOworICAgICAgICAgICAgbUdyYWRpZW50LnNldExvY2FsTWF0cml4KG1NYXRyaXgpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGxlZnQsIHRvcCwgbGVmdCArIG1EcmF3V2lkdGgsIGJvdHRvbSwgbVBhaW50KTsKKyAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGFiZWxzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xhYmVsc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlMDUwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xhYmVsc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMYWJlbHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxhYmVscyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGF5ZXJzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xheWVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwNTExNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xheWVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTGF5ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgTGF5ZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExheWVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtTGF5ZXJQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUmVjdFBhaW50OworCisgICAgICAgIExheWVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTQwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICAvL2NhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMjUuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFscGhhKDUwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMDAuMGYsIDEwMC4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjUuMGYsIDEyNS4wZik7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMTAwLjBmLCA1MC4wZiwgbVJlY3RQYWludCk7ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5TUkNfT1VUKSk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDUwLjBmLCAyNS4wZiwgMTUwLjBmLCA3NS4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTI1LjBmKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAxMDAuMGYsIDUwLjBmLCBtUmVjdFBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuRFNUX0FUT1ApKTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcig1MC4wZiwgMjUuMGYsIDE1MC4wZiwgNzUuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xpbmVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xpbmVzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM4MzZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGluZXNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIExpbmVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBMaW5lc1ZpZXcgdmlldyA9IG5ldyBMaW5lc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBMaW5lc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVNtYWxsUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcFNoYWRlciBtU2hhZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbVBvaW50czsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQWxwaGFQYWludDsKKworICAgICAgICBMaW5lc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1TbWFsbFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U3Ryb2tlV2lkdGgoNC4wZik7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKKworICAgICAgICAgICAgbUFscGhhUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldENvbG9yKDB4N2ZmZjAwNTApOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMTAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcihtQml0bWFwMSwgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1Qb2ludHMgPSBuZXcgZmxvYXRbXSB7CisgICAgICAgICAgICAgICAgICAgIDYyLjBmLCAwLjBmLCAzMDIuMGYsIDQwMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgMzAyLjBmLCA0MDAuMGYsIDM1Mi4wZiwgNDAwLjBmLAorICAgICAgICAgICAgICAgICAgICAzNTIuMGYsIDQwMC4wZiwgMzUyLjBmLCA1MDAuMGYKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAyMC4wZik7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAwLjBmLCA0MC4wZiwgNDAwLjBmLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoNS4wZiwgMC4wZiwgOTUuMGYsIDQwMC4wZiwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgyMi4wZiwgMC4wZiwgMTYyLjBmLCA0MDAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1TaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDQyLjBmLCAwLjBmLCAyMjIuMGYsIDQwMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmVzKG1Qb2ludHMsIG1BbHBoYVBhaW50KTsKKworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0QW50aUFsaWFzKGZhbHNlKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAwLjBmLCA0MDAuMGYsIDAuMGYsIG1TbWFsbFBhaW50KTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAwLjBmLCAwLjBmLCA0MDAuMGYsIG1TbWFsbFBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCA0MDAuMGYsIDQwMC4wZiwgNDAwLjBmLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZXMobVBvaW50cywgbUFscGhhUGFpbnQpOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U2hhZGVyKG51bGwpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9MaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmQ0ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMaXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQV9MSVNUID0geworICAgICAgICAgICAgIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsICJBbWVyaWNhbiBTYW1vYSIsICJBbmRvcnJhIiwKKyAgICAgICAgICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgICAgICAgICAiQXJtZW5pYSIsICJBcnViYSIsICJBdXN0cmFsaWEiLCAiQXVzdHJpYSIsICJBemVyYmFpamFuIiwKKyAgICAgICAgICAgICJCYWhyYWluIiwgIkJhbmdsYWRlc2giLCAiQmFyYmFkb3MiLCAiQmVsYXJ1cyIsICJCZWxnaXVtIiwKKyAgICAgICAgICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgICAgICAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsICJCb3Rzd2FuYSIsICJCb3V2ZXQgSXNsYW5kIiwgIkJyYXppbCIsCisgICAgICAgICAgICAiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwgIkJyaXRpc2ggVmlyZ2luIElzbGFuZHMiLCAiQnJ1bmVpIiwgIkJ1bGdhcmlhIiwKKyAgICAgICAgICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAgICAgICAgICJDYXltYW4gSXNsYW5kcyIsICJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLCAiQ2hhZCIsICJDaGlsZSIsICJDaGluYSIsCisgICAgICAgICAgICAiQ2hyaXN0bWFzIElzbGFuZCIsICJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsICJDb2xvbWJpYSIsICJDb21vcm9zIiwgIkNvbmdvIiwKKyAgICAgICAgICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAgICAgICAgICJEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbyIsICJEZW5tYXJrIiwgIkRqaWJvdXRpIiwgIkRvbWluaWNhIiwgIkRvbWluaWNhbiBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRWFzdCBUaW1vciIsICJFY3VhZG9yIiwgIkVneXB0IiwgIkVsIFNhbHZhZG9yIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiwgIkVyaXRyZWEiLAorICAgICAgICAgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICAgICAgICAgIkZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEiLCAiRnJhbmNlIiwgIkZyZW5jaCBHdWlhbmEiLCAiRnJlbmNoIFBvbHluZXNpYSIsCisgICAgICAgICAgICAiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwgIkdhYm9uIiwgIkdlb3JnaWEiLCAiR2VybWFueSIsICJHaGFuYSIsICJHaWJyYWx0YXIiLAorICAgICAgICAgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAgICAgICAgICJHdXlhbmEiLCAiSGFpdGkiLCAiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwgIkhvbmR1cmFzIiwgIkhvbmcgS29uZyIsICJIdW5nYXJ5IiwKKyAgICAgICAgICAgICJJY2VsYW5kIiwgIkluZGlhIiwgIkluZG9uZXNpYSIsICJJcmFuIiwgIklyYXEiLCAiSXJlbGFuZCIsICJJc3JhZWwiLCAiSXRhbHkiLCAiSmFtYWljYSIsCisgICAgICAgICAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgICAgICAgICAiTGF0dmlhIiwgIkxlYmFub24iLCAiTGVzb3RobyIsICJMaWJlcmlhIiwgIkxpYnlhIiwgIkxpZWNodGVuc3RlaW4iLCAiTGl0aHVhbmlhIiwgIkx1eGVtYm91cmciLAorICAgICAgICAgICAgIk1hY2F1IiwgIk1hZGFnYXNjYXIiLCAiTWFsYXdpIiwgIk1hbGF5c2lhIiwgIk1hbGRpdmVzIiwgIk1hbGkiLCAiTWFsdGEiLCAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgICAgICAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICAgICAgICAgIk1vbmFjbyIsICJNb25nb2xpYSIsICJNb250c2VycmF0IiwgIk1vcm9jY28iLCAiTW96YW1iaXF1ZSIsICJNeWFubWFyIiwgIk5hbWliaWEiLAorICAgICAgICAgICAgIk5hdXJ1IiwgIk5lcGFsIiwgIk5ldGhlcmxhbmRzIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiwgIk5ldyBDYWxlZG9uaWEiLCAiTmV3IFplYWxhbmQiLAorICAgICAgICAgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICAgICAgICAgIk5vcndheSIsICJPbWFuIiwgIlBha2lzdGFuIiwgIlBhbGF1IiwgIlBhbmFtYSIsICJQYXB1YSBOZXcgR3VpbmVhIiwgIlBhcmFndWF5IiwgIlBlcnUiLAorICAgICAgICAgICAgIlBoaWxpcHBpbmVzIiwgIlBpdGNhaXJuIElzbGFuZHMiLCAiUG9sYW5kIiwgIlBvcnR1Z2FsIiwgIlB1ZXJ0byBSaWNvIiwgIlFhdGFyIiwKKyAgICAgICAgICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAgICAgICAgICJTYWludCBLaXR0cyBhbmQgTmV2aXMiLCAiU2FpbnQgTHVjaWEiLCAiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCisgICAgICAgICAgICAiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLCAiU2Ftb2EiLCAiU2FuIE1hcmlubyIsICJTYXVkaSBBcmFiaWEiLCAiU2VuZWdhbCIsCisgICAgICAgICAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgICAgICAgICAiU29tYWxpYSIsICJTb3V0aCBBZnJpY2EiLCAiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLCAiU291dGggS29yZWEiLAorICAgICAgICAgICAgIlNwYWluIiwgIlNyaSBMYW5rYSIsICJTdWRhbiIsICJTdXJpbmFtZSIsICJTdmFsYmFyZCBhbmQgSmFuIE1heWVuIiwgIlN3YXppbGFuZCIsICJTd2VkZW4iLAorICAgICAgICAgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAgICAgICAgICJUaGUgR2FtYmlhIiwgIlRvZ28iLCAiVG9rZWxhdSIsICJUb25nYSIsICJUcmluaWRhZCBhbmQgVG9iYWdvIiwgIlR1bmlzaWEiLCAiVHVya2V5IiwKKyAgICAgICAgICAgICJUdXJrbWVuaXN0YW4iLCAiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIiwgIlR1dmFsdSIsICJWaXJnaW4gSXNsYW5kcyIsICJVZ2FuZGEiLAorICAgICAgICAgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICAgICAgICAgIlVuaXRlZCBTdGF0ZXMiLCAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwgIlVydWd1YXkiLCAiVXpiZWtpc3RhbiIsCisgICAgICAgICAgICAiVmFudWF0dSIsICJWYXRpY2FuIENpdHkiLCAiVmVuZXp1ZWxhIiwgIlZpZXRuYW0iLCAiV2FsbGlzIGFuZCBGdXR1bmEiLCAiV2VzdGVybiBTYWhhcmEiLAorICAgICAgICAgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lmxpc3RfYWN0aXZpdHkpOworCisgICAgICAgIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2ltcGxlTGlzdEFkYXB0ZXIodGhpcyk7CisKKyAgICAgICAgTGlzdFZpZXcgbGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdCk7CisgICAgICAgIGxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgCisgICAgICAgIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUobGlzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKKyAgICAgICAgbWVudS5zZXRIZWFkZXJUaXRsZSgiQ29udGV4dCBtZW51Iik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMSIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDIiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8U3RyaW5nPiB7CisgICAgICAgIHB1YmxpYyBTaW1wbGVMaXN0QWRhcHRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBEQVRBX0xJU1QpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBUZXh0VmlldyB2ID0gKFRleHRWaWV3KSBzdXBlci5nZXRWaWV3KHBvc2l0aW9uLCBjb252ZXJ0VmlldywgcGFyZW50KTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IHIuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZVBhZGRpbmcoKGludCkgKDYgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKSk7CisgICAgICAgICAgICB2LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhyLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNvbiksCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTW9yZVNoYWRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTW9yZVNoYWRlcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmE0NzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Nb3JlU2hhZGVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db21wb3NlU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGlnaHRpbmdDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTW9yZVNoYWRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNoYWRlcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2hhZGVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVNjYWxlZFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleFdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtVGV4SGVpZ2h0OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd1dpZHRoOworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3SGVpZ2h0OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1Ib3JHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtVmVydEdyYWRpZW50OworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2VTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWQyU2hhZGVyOworICAgICAgICBwcml2YXRlIENvbG9yRmlsdGVyIG1Db2xvckZpbHRlcjsKKworICAgICAgICBTaGFkZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBCaXRtYXAgdGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IHRleHR1cmUuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIG1UZXhIZWlnaHQgPSB0ZXh0dXJlLmdldEhlaWdodCgpOworICAgICAgICAgICAgbURyYXdXaWR0aCA9IG1UZXhXaWR0aCAqIDIuMmY7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IG1UZXhIZWlnaHQgKiAxLjJmOworCisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMiA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0yLnNldFNjYWxlKDAuNWYsIDAuNWYpOworICAgICAgICAgICAgbVNjYWxlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWQyU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMyA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0zLnNldFNjYWxlKDAuMWYsIDAuMWYpOworICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTMpOworCisgICAgICAgICAgICBtSG9yR3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuUkVELCAweDdmMDBmZjAwLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtVmVydEdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIDAuMGYsIG1EcmF3SGVpZ2h0IC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuWUVMTE9XLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKworICAgICAgICAgICAgbUNvbXBvc2VTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtU2NhbGVkU2hhZGVyLCBtSG9yR3JhZGllbnQsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUik7CisgICAgICAgICAgICBtQ29tcG9zZTJTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtSG9yR3JhZGllbnQsIG1TY2FsZWRTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1VUKTsKKworICAgICAgICAgICAgbUNvbG9yRmlsdGVyID0gbmV3IExpZ2h0aW5nQ29sb3JGaWx0ZXIoMHgwMDYwZmZmZiwgMHgwMDEwMTAzMCk7CisgCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0VGV4dFNpemUoMzYuMGYpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDAwMCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2UyU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtRHJhd1dpZHRoICsgNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIk9wZW5HTCByZW5kZXJpbmciLCAwLjBmLCAyMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNjYWxlZDJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgNjAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlMlNoYWRlcik7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvckZpbHRlcihtQ29sb3JGaWx0ZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgMTAwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvckZpbHRlcihudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtVmVydEdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiT3BlbkdMIHJlbmRlcmluZyIsIDAuMGYsIDIwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9OZXdMYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTmV3TGF5ZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWEyODkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTmV3TGF5ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTmV3TGF5ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgTGF5ZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExheWVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtTGF5ZXJQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUmVjdFBhaW50OworCisgICAgICAgIExheWVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBtUmVjdFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0VGV4dFNpemUoMjQuMGYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDEyOCwgMjU1LCAxMjgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDE0MC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIGRyYXdTdHVmZihjYW52YXMsIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyMDAuMGYpOworICAgICAgICAgICAgZHJhd1N0dWZmKGNhbnZhcywgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdTdHVmZihDYW52YXMgY2FudmFzLCBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtTGF5ZXJQYWludCwgc2F2ZUZsYWdzKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweDdmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgtMjAuMGYsIC0yMC4wZiwgMjIwLjBmLCAxMjAuMGYsIG1SZWN0UGFpbnQpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmYwMDAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIHN0cmluZyB0byBvdmVybGFwIGJldHdlZW4gbGF5ZXJzIGFuZCBmcmFtZWJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgIC0xMDAuMGYsIDUwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDEwZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTmluZVBhdGNoZXNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIE5pbmVQYXRjaGVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBCdXR0b24gYiA9IG5ldyBCdXR0b24odGhpcyk7CisgICAgICAgIGIuc2V0TGF5b3V0UGFyYW1zKG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBHcmF2aXR5LkNFTlRFUikpOworICAgICAgICBiLnNldFRleHQoIjkgcGF0Y2hlcyIpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhiKTsKKyAgICAgICAgbGF5b3V0LnNldEJhY2tncm91bmRDb2xvcigweGZmZmZmZmZmKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUGF0aHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOWJmMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9QYXRoc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgUGF0aHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIFBhdGhzVmlldyB2aWV3ID0gbmV3IFBhdGhzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFBhdGhzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtU21hbGxQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTWVkaXVtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwU2hhZGVyIG1TaGFkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0aCBtUGF0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtUGF0aEJvdW5kczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQm91bmRzUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbU9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTGluZVBhaW50OworCisgICAgICAgIFBhdGhzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKworICAgICAgICAgICAgbVNtYWxsUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMS4wZik7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGluZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1MaW5lUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDBmZik7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMTAuMGYpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLlNUUk9LRSk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOworCisgICAgICAgICAgICBtU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcihtQml0bWFwMSwgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1QYXRoID0gbmV3IFBhdGgoKTsKKyAgICAgICAgICAgIG1QYXRoLm1vdmVUbygwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oMC4wZiwgMC4wZiwgMTAwLjBmLCAxNTAuMGYsIDEwMC4wZiwgMjAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oMTAwLjBmLCAyMDAuMGYsIDUwLjBmLCAzMDAuMGYsIC04MC4wZiwgMjAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oLTgwLjBmLCAyMDAuMGYsIDEwMC4wZiwgMjAwLjBmLCAyMDAuMGYsIDAuMGYpOworCisgICAgICAgICAgICBtUGF0aEJvdW5kcyA9IG5ldyBSZWN0RigpOworICAgICAgICAgICAgbVBhdGguY29tcHV0ZUJvdW5kcyhtUGF0aEJvdW5kcywgdHJ1ZSk7CisKKyAgICAgICAgICAgIG1Cb3VuZHNQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJvdW5kc1BhaW50LnNldENvbG9yKDB4NDAwMGZmMDApOworCisgICAgICAgICAgICBtT2Zmc2V0ID0gbU1lZGl1bVBhaW50LmdldFN0cm9rZVdpZHRoKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSAoaW50KSAobVBhdGhCb3VuZHMud2lkdGgoKSArIG1PZmZzZXQgKiAzLjBmICsgMC41Zik7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gKGludCkgKG1QYXRoQm91bmRzLmhlaWdodCgpICsgbU9mZnNldCAqIDMuMGYgKyAwLjVmKTsKKyAgICAgICAgICAgIG1CaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIEJpdG1hcC5Db25maWcuQUxQSEFfOCk7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhtQml0bWFwKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLW1QYXRoQm91bmRzLmxlZnQgKyBtT2Zmc2V0ICogMS41ZiwgLW1QYXRoQm91bmRzLnRvcCArIG1PZmZzZXQgKiAxLjVmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3QVJHQigyNTUsIDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgyMDAuMGYsIDYwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVNtYWxsUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1NZWRpdW1QYWludCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAwLjBmLCAzNjAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVBhdGhCb3VuZHMsIG1Cb3VuZHNQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAsIG1QYXRoQm91bmRzLmxlZnQgLSBtT2Zmc2V0ICogMS41ZiwKKyAgICAgICAgICAgICAgICAgICAgbVBhdGhCb3VuZHMudG9wIC0gbU9mZnNldCAqIDEuNWYsIG51bGwpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDAuMGYsIC0zNjAuMGYsIDAuMGYsIDUwMC4wZiwgbUxpbmVQYWludCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTkyYmZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUXVpY2tSZWplY3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBRdWlja1JlamVjdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgUXVpY2tSZWplY3RWaWV3IHZpZXcgPSBuZXcgUXVpY2tSZWplY3RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUXVpY2tSZWplY3RWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKworICAgICAgICBRdWlja1JlamVjdFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudD0iICsgY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmU9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImdldFNhdmVDb3VudCBhZnRlciBzYXZlPSIgKyBjb3VudCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgcmVzdG9yZT0iICsgY291bnQpOworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjYW52YXMuZ2V0U2F2ZUNvdW50KCkpOworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjYW52YXMuZ2V0U2F2ZUNvdW50KCkpOworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjYW52YXMuZ2V0U2F2ZUNvdW50KCkpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHJlc3RvcmVUb0NvdW50PSIgKyBjb3VudCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMCwgMCwgMTAsIDEwLCBtQml0bWFwUGFpbnQsIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlTGF5ZXI9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImdldFNhdmVDb3VudCBhZnRlciBzYXZlTGF5ZXI9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciByZXN0b3JlPSIgKyBjb3VudCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMC4wZiwgMC4wZiwgNDAuMGYsIDQwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIC1tQml0bWFwMS5nZXRXaWR0aCgpLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDUwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9SZXNpemVBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUmVzaXplQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGY5ZGUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUmVzaXplQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFJlc2l6ZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZvcm0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1JvdGF0aW9uQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1JvdGF0aW9uQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzMwOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUm90YXRpb25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBSb3RhdGlvbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBEcmF3aW5nVmlldyBjb250YWluZXIgPSBuZXcgRHJhd2luZ1ZpZXcodGhpcyk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoY29udGFpbmVyKTsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHN0YXRpYyBpbnQgZGlwVG9QeChDb250ZXh0IGMsIGludCBkaXApIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIChjLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSAqIGRpcCArIDAuNWYpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEcmF3aW5nVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKworICAgICAgICBEcmF3aW5nVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShkaXBUb1B4KGdldENvbnRleHQoKSwgNDAwKSwgZGlwVG9QeChnZXRDb250ZXh0KCksIDIwMCkpOworICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSg0NS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgtODAuMGYsIC04MC4wZiwgODAuMGYsIDgwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIyMC4wZiwgMjIwLjBmLCBtUGFpbnQpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NoYWRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2hhZGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiMTA3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NoYWRlcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTaGFkZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTaGFkZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNoYWRlcnNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1SZXBlYXRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1UcmFuc2xhdGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbUhvckdyYWRpZW50OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1EaWFnR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbVZlcnRHcmFkaWVudDsKKworICAgICAgICBTaGFkZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBCaXRtYXAgdGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IHRleHR1cmUuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIG1UZXhIZWlnaHQgPSB0ZXh0dXJlLmdldEhlaWdodCgpOworICAgICAgICAgICAgbURyYXdXaWR0aCA9IG1UZXhXaWR0aCAqIDIuMmY7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IG1UZXhIZWlnaHQgKiAxLjJmOworCisgICAgICAgICAgICBtUmVwZWF0U2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuUkVQRUFULAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuUkVQRUFUKTsKKworICAgICAgICAgICAgbVRyYW5zbGF0ZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQpOworICAgICAgICAgICAgTWF0cml4IG0xID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTEuc2V0VHJhbnNsYXRlKG1UZXhXaWR0aCAvIDIuMGYsIG1UZXhIZWlnaHQgLyAyLjBmKTsKKyAgICAgICAgICAgIG0xLnBvc3RSb3RhdGUoNDUsIDAsIDApOworICAgICAgICAgICAgbVRyYW5zbGF0ZWRTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTEpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMiA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0yLnNldFNjYWxlKDAuNWYsIDAuNWYpOworICAgICAgICAgICAgbVNjYWxlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMik7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5SRUQsIENvbG9yLkdSRUVOLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgTWF0cml4IG0zID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTMuc2V0U2NhbGUobURyYXdIZWlnaHQsIDEuMGYpOworICAgICAgICAgICAgbTMucG9zdFJvdGF0ZSgtOTAuMGYpOworICAgICAgICAgICAgbTMucG9zdFRyYW5zbGF0ZSgwLjBmLCBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtSG9yR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobTMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtRGlhZ0dyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGggLyAxLjVmLCBtRHJhd0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxVRSwgQ29sb3IuTUFHRU5UQSwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVZlcnRHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCAwLjBmLCBtRHJhd0hlaWdodCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLllFTExPVywgQ29sb3IuTUFHRU5UQSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIC8vY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIC8vIEJpdG1hcCBzaGFkZXJzCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1SZXBlYXRTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtVHJhbnNsYXRlZFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1TY2FsZWRTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICAvLyBHcmFkaWVudHMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmICsgbURyYXdXaWR0aCArIDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUhvckdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobURpYWdHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1WZXJ0R3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTE4YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9TaW1wbGVQYXRoc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTaW1wbGVQYXRoc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIEVkaXRUZXh0IHRleHQgPSBuZXcgRWRpdFRleHQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHRleHQsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNjAwLCAzNTAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHRleHQuc2V0VGV4dCgiVGhpcyBpcyBhbiBleGFtcGxlIG9mIGFuIEVkaXRUZXh0IHdpZGdldCBcbiIgKworICAgICAgICAgICAgICAgICJ1c2luZyBzaW1wbGUgcGF0aHMgdG8gY3JlYXRlIHRoZSBzZWxlY3Rpb24uIik7CisgICAgICAgIC8vdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1N0YWNrQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1N0YWNrQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU1YWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU3RhY2tBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TdGFja1ZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTdGFja0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5zdGFjayk7CisKKyAgICAgICAgU3RhY2tWaWV3IHN0YWNrID0gKFN0YWNrVmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhY2tfdmlldyk7CisgICAgICAgIHN0YWNrLnNldEFkYXB0ZXIobmV3IEFycmF5QWRhcHRlcjxEcmF3YWJsZT4odGhpcywgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmlkLnRleHQxLCBuZXcgRHJhd2FibGVbXSB7CisgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLnN1bnNldDEpLAorICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5zdW5zZXQyKSwKKyAgICAgICAgfSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgICAgIFZpZXcgaXRlbSA9IGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LnN0YWNrX2l0ZW0sIG51bGwsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgaXRlbS5maW5kVmlld0J5SWQoUi5pZC50ZXh0dmlld19pY29uKSkuc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEl0ZW0ocG9zaXRpb24gJSBnZXRDb3VudCgpKSk7CisgICAgICAgICAgICAgICAgKChUZXh0VmlldykgaXRlbS5maW5kVmlld0J5SWQoUi5pZC5taW5pX3RleHQpKS5zZXRUZXh0KCIiICsgcG9zaXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc3RhY2suc2V0RGlzcGxheWVkQ2hpbGQoMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBkZjUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBUZXh0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBDdXN0b21UZXh0Vmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEN1c3RvbVRleHRWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1TdHJpa2VQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtU2NhbGVkUGFpbnQ7CisKKyAgICAgICAgQ3VzdG9tVGV4dFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbU1lZGl1bVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0VGV4dFNpemUoMzYuMGYpOworCisgICAgICAgICAgICBtU3RyaWtlUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VGV4dFNpemUoMTYuMGYpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFVuZGVybGluZVRleHQodHJ1ZSk7CisKKyAgICAgICAgICAgIG1TY2FsZWRQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRUZXh0U2l6ZSgxNi4wZik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMjAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0VGV4dEFsaWduKFBhaW50LkFsaWduLkNFTlRFUik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDQwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5SSUdIVCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDYwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5MRUZUKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMTAwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFNoYWRvd0xheWVyKDIuNWYsIDAuMGYsIDAuMGYsIDB4ZmYwMDAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAxNTAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuY2xlYXJTaGFkb3dMYXllcigpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAyMDAsIG1MYXJnZVBhaW50KTsKKworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZG93TGF5ZXIoMi41ZiwgMy4wZiwgMy4wZiwgMHhmZjAwMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDQwMCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZG93TGF5ZXIoMy4wZiwgMy4wZiwgMy4wZiwgMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbHBoYSgxMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCA1MDAsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5jbGVhclNoYWRvd0xheWVyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgNDAsIG1TdHJpa2VQYWludCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0U3RyaWtlVGhydVRleHQodHJ1ZSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDcwLCBtU3RyaWtlUGFpbnQpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFVuZGVybGluZVRleHQoZmFsc2UpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCAxMDAsIG1TdHJpa2VQYWludCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0U3RyaWtlVGhydVRleHQoZmFsc2UpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFVuZGVybGluZVRleHQodHJ1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRUZXh0U2NhbGVYKDAuNWYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCAyMDAsIG1TY2FsZWRQYWludCk7CisgICAgICAgICAgICBtU2NhbGVkUGFpbnQuc2V0VGV4dFNjYWxlWCgyLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgMjMwLCBtU2NhbGVkUGFpbnQpOworICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldFRleHRTY2FsZVgoMS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDI2MCwgbVNjYWxlZFBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgxNTAuMGYsIDIyMC4wZiwgNDUwLjBmLCAzMjAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAzMDAsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEdhbW1hQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHRHYW1tYUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczZDM5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHRHYW1tYUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRleHRHYW1tYUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKKyAgICAgICAgbGF5b3V0LnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgZmluYWwgR2FtbWFUZXh0VmlldyBnYW1tYSA9IG5ldyBHYW1tYVRleHRWaWV3KHRoaXMpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhnYW1tYSwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgICAgIAorICAgICAgICBsYXlvdXQucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYiA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoZ2FtbWEuZ2V0V2lkdGgoKSwgZ2FtbWEuZ2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgICAgICAgICAgQ2FudmFzIGMgPSBuZXcgQ2FudmFzKGIpOworICAgICAgICAgICAgICAgIGMuZHJhd0NvbG9yKDAsIFBvcnRlckR1ZmYuTW9kZS5DTEVBUik7CisgICAgICAgICAgICAgICAgZ2FtbWEuZHJhdyhjKTsKKworICAgICAgICAgICAgICAgIEltYWdlVmlldyBpbWFnZSA9IG5ldyBJbWFnZVZpZXcoVGV4dEdhbW1hQWN0aXZpdHkudGhpcyk7CisgICAgICAgICAgICAgICAgaW1hZ2Uuc2V0SW1hZ2VCaXRtYXAoYik7CisKKyAgICAgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhpbWFnZSwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICAgICAgICAgKSk7CisKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoVGV4dEdhbW1hQWN0aXZpdHkudGhpcywgU3ViR2FtbWFBY3Rpdml0eS5jbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBnZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobmV3IENvbG9yRHJhd2FibGUoMHhmZmZmZmZmZikpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBHYW1tYVRleHRWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgR2FtbWFUZXh0VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoMHhmZmZmZmZmZik7CisKKyAgICAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGV4dF9sYXJnZSwgdGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRleHRfbWVkaXVtLCB0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGV4dF9zbWFsbCwgdGhpcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YkdhbW1hQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKKyAgICAgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIEdhbW1hVGV4dFZpZXcgZ2FtbWEgPSBuZXcgR2FtbWFUZXh0Vmlldyh0aGlzKTsKKyAgICAgICAgICAgIGZpbmFsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICAgICApOworICAgICAgICAgICAgbHAuc2V0TWFyZ2lucygwLCA3NCwgMCwgMCk7CisgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhnYW1tYSwgbHApOworCisgICAgICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGhpblBhdGNoZXNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGhpblBhdGNoZXNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNjA1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UaGluUGF0Y2hlc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRoaW5QYXRjaGVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBQYXRjaFZpZXcgYiA9IG5ldyBQYXRjaFZpZXcodGhpcyk7CisgICAgICAgIGIuc2V0TGF5b3V0UGFyYW1zKG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KGIpOworICAgICAgICBsYXlvdXQuc2V0QmFja2dyb3VuZENvbG9yKDB4ZmZmZmZmZmYpOworICAgICAgICAKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBhdGNoVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIERyYXdhYmxlIG1QYXRjaDEsIG1QYXRjaDI7CisKKyAgICAgICAgcHVibGljIFBhdGNoVmlldyhBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICAgICAgc3VwZXIoYWN0aXZpdHkpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzID0gYWN0aXZpdHkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBtUGF0Y2gxID0gcmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUucGF0Y2gpOworICAgICAgICAgICAgbVBhdGNoMiA9IHJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmJ0bl90b2dnbGVfb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSAxMDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gNjA7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBsZWZ0ID0gKGdldFdpZHRoKCkgLSB3aWR0aCkgLyAyOworICAgICAgICAgICAgZmluYWwgaW50IHRvcCAgPSAoZ2V0SGVpZ2h0KCkgLSBoZWlnaHQpIC8gMjsKKworICAgICAgICAgICAgbVBhdGNoMS5zZXRCb3VuZHMobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7CisgICAgICAgICAgICBtUGF0Y2gxLmRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBoZWlnaHQgKyAyMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYXRjaDIuc2V0Qm91bmRzKGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpOworICAgICAgICAgICAgbVBhdGNoMi5kcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmNjZlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zZm9ybTNkQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW1lcmE7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBUcmFuc2Zvcm0zZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgVHJhbnNmb3JtM2RWaWV3IHZpZXcgPSBuZXcgVHJhbnNmb3JtM2RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVHJhbnNmb3JtM2RWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIENhbWVyYSBtQ2FtZXJhOworICAgICAgICBwcml2YXRlIE1hdHJpeCBtTWF0cml4OworCisgICAgICAgIFRyYW5zZm9ybTNkVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1DYW1lcmEgPSBuZXcgQ2FtZXJhKCk7CisgICAgICAgICAgICBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGNlbnRlclggPSBnZXRXaWR0aCgpIC8gMi4wZiAtIG1CaXRtYXAxLmdldFdpZHRoKCkgLyAyLjBmOworICAgICAgICAgICAgZmluYWwgZmxvYXQgY2VudGVyWSA9IGdldEhlaWdodCgpIC8gMi4wZiAtIG1CaXRtYXAxLmdldEhlaWdodCgpIC8gMi4wZjsKKyAgICAgICAgICAgIGZpbmFsIENhbWVyYSBjYW1lcmEgPSBtQ2FtZXJhOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBNYXRyaXggbWF0cml4ID0gbU1hdHJpeDsKKworICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCAzMi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgMC4wZiwgbWF0cml4KTsKKworICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCAxMi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgLW1CaXRtYXAxLmdldFdpZHRoKCksIG1hdHJpeCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJvdGF0ZShjZW50ZXJYLCBjZW50ZXJZLCBjYW1lcmEsIG1hdHJpeCwgNTIuMGYpOworICAgICAgICAgICAgZHJhd0JpdG1hcChjYW52YXMsIGNlbnRlclgsIGNlbnRlclksIG1CaXRtYXAxLmdldFdpZHRoKCksIG1hdHJpeCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJvdGF0ZShjZW50ZXJYLCBjZW50ZXJZLCBjYW1lcmEsIG1hdHJpeCwgMTIyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCBtQml0bWFwMS5nZXRXaWR0aCgpICogMi4wZiwgbWF0cml4KTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdCaXRtYXAoQ2FudmFzIGNhbnZhcywgZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgZmxvYXQgb2Zmc2V0LAorICAgICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKG9mZnNldCwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuY29uY2F0KG1hdHJpeCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgY2VudGVyWCwgY2VudGVyWSwgbnVsbCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJvdGF0ZShmbG9hdCBjZW50ZXJYLCBmbG9hdCBjZW50ZXJZLCBDYW1lcmEgY2FtZXJhLAorICAgICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXgsIGZsb2F0IGFuZ2xlKSB7CisgICAgICAgICAgICBjYW1lcmEuc2F2ZSgpOworICAgICAgICAgICAgY2FtZXJhLnJvdGF0ZVkoYW5nbGUpOworICAgICAgICAgICAgY2FtZXJhLmdldE1hdHJpeChtYXRyaXgpOworICAgICAgICAgICAgY2FtZXJhLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgbWF0cml4LnByZVRyYW5zbGF0ZSgtY2VudGVyWCwgLWNlbnRlclkpOworICAgICAgICAgICAgbWF0cml4LnBvc3RUcmFuc2xhdGUoY2VudGVyWCwgY2VudGVyWSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc3BhcmVudExpc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVHJhbnNwYXJlbnRMaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjMxNjlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVHJhbnNwYXJlbnRMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRyYW5zcGFyZW50TGlzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBVEFfTElTVCA9IHsKKyAgICAgICAgICAgICJBZmdoYW5pc3RhbiIsICJBbGJhbmlhIiwgIkFsZ2VyaWEiLCAiQW1lcmljYW4gU2Ftb2EiLCAiQW5kb3JyYSIsCisgICAgICAgICAgICAiQW5nb2xhIiwgIkFuZ3VpbGxhIiwgIkFudGFyY3RpY2EiLCAiQW50aWd1YSBhbmQgQmFyYnVkYSIsICJBcmdlbnRpbmEiLAorICAgICAgICAgICAgIkFybWVuaWEiLCAiQXJ1YmEiLCAiQXVzdHJhbGlhIiwgIkF1c3RyaWEiLCAiQXplcmJhaWphbiIsCisgICAgICAgICAgICAiQmFocmFpbiIsICJCYW5nbGFkZXNoIiwgIkJhcmJhZG9zIiwgIkJlbGFydXMiLCAiQmVsZ2l1bSIsCisgICAgICAgICAgICAiQmVsaXplIiwgIkJlbmluIiwgIkJlcm11ZGEiLCAiQmh1dGFuIiwgIkJvbGl2aWEiLAorICAgICAgICAgICAgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLCAiQm90c3dhbmEiLCAiQm91dmV0IElzbGFuZCIsICJCcmF6aWwiLAorICAgICAgICAgICAgIkJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeSIsICJCcml0aXNoIFZpcmdpbiBJc2xhbmRzIiwgIkJydW5laSIsICJCdWxnYXJpYSIsCisgICAgICAgICAgICAiQnVya2luYSBGYXNvIiwgIkJ1cnVuZGkiLCAiQ290ZSBkJ0l2b2lyZSIsICJDYW1ib2RpYSIsICJDYW1lcm9vbiIsICJDYW5hZGEiLCAiQ2FwZSBWZXJkZSIsCisgICAgICAgICAgICAiQ2F5bWFuIElzbGFuZHMiLCAiQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljIiwgIkNoYWQiLCAiQ2hpbGUiLCAiQ2hpbmEiLAorICAgICAgICAgICAgIkNocmlzdG1hcyBJc2xhbmQiLCAiQ29jb3MgKEtlZWxpbmcpIElzbGFuZHMiLCAiQ29sb21iaWEiLCAiQ29tb3JvcyIsICJDb25nbyIsCisgICAgICAgICAgICAiQ29vayBJc2xhbmRzIiwgIkNvc3RhIFJpY2EiLCAiQ3JvYXRpYSIsICJDdWJhIiwgIkN5cHJ1cyIsICJDemVjaCBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iLCAiRGVubWFyayIsICJEamlib3V0aSIsICJEb21pbmljYSIsICJEb21pbmljYW4gUmVwdWJsaWMiLAorICAgICAgICAgICAgIkVhc3QgVGltb3IiLCAiRWN1YWRvciIsICJFZ3lwdCIsICJFbCBTYWx2YWRvciIsICJFcXVhdG9yaWFsIEd1aW5lYSIsICJFcml0cmVhIiwKKyAgICAgICAgICAgICJFc3RvbmlhIiwgIkV0aGlvcGlhIiwgIkZhZXJvZSBJc2xhbmRzIiwgIkZhbGtsYW5kIElzbGFuZHMiLCAiRmlqaSIsICJGaW5sYW5kIiwKKyAgICAgICAgICAgICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIiwgIkZyYW5jZSIsICJGcmVuY2ggR3VpYW5hIiwgIkZyZW5jaCBQb2x5bmVzaWEiLAorICAgICAgICAgICAgIkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsICJHYWJvbiIsICJHZW9yZ2lhIiwgIkdlcm1hbnkiLCAiR2hhbmEiLCAiR2licmFsdGFyIiwKKyAgICAgICAgICAgICJHcmVlY2UiLCAiR3JlZW5sYW5kIiwgIkdyZW5hZGEiLCAiR3VhZGVsb3VwZSIsICJHdWFtIiwgIkd1YXRlbWFsYSIsICJHdWluZWEiLCAiR3VpbmVhLUJpc3NhdSIsCisgICAgICAgICAgICAiR3V5YW5hIiwgIkhhaXRpIiwgIkhlYXJkIElzbGFuZCBhbmQgTWNEb25hbGQgSXNsYW5kcyIsICJIb25kdXJhcyIsICJIb25nIEtvbmciLCAiSHVuZ2FyeSIsCisgICAgICAgICAgICAiSWNlbGFuZCIsICJJbmRpYSIsICJJbmRvbmVzaWEiLCAiSXJhbiIsICJJcmFxIiwgIklyZWxhbmQiLCAiSXNyYWVsIiwgIkl0YWx5IiwgIkphbWFpY2EiLAorICAgICAgICAgICAgIkphcGFuIiwgIkpvcmRhbiIsICJLYXpha2hzdGFuIiwgIktlbnlhIiwgIktpcmliYXRpIiwgIkt1d2FpdCIsICJLeXJneXpzdGFuIiwgIkxhb3MiLAorICAgICAgICAgICAgIkxhdHZpYSIsICJMZWJhbm9uIiwgIkxlc290aG8iLCAiTGliZXJpYSIsICJMaWJ5YSIsICJMaWVjaHRlbnN0ZWluIiwgIkxpdGh1YW5pYSIsICJMdXhlbWJvdXJnIiwKKyAgICAgICAgICAgICJNYWNhdSIsICJNYWRhZ2FzY2FyIiwgIk1hbGF3aSIsICJNYWxheXNpYSIsICJNYWxkaXZlcyIsICJNYWxpIiwgIk1hbHRhIiwgIk1hcnNoYWxsIElzbGFuZHMiLAorICAgICAgICAgICAgIk1hcnRpbmlxdWUiLCAiTWF1cml0YW5pYSIsICJNYXVyaXRpdXMiLCAiTWF5b3R0ZSIsICJNZXhpY28iLCAiTWljcm9uZXNpYSIsICJNb2xkb3ZhIiwKKyAgICAgICAgICAgICJNb25hY28iLCAiTW9uZ29saWEiLCAiTW9udHNlcnJhdCIsICJNb3JvY2NvIiwgIk1vemFtYmlxdWUiLCAiTXlhbm1hciIsICJOYW1pYmlhIiwKKyAgICAgICAgICAgICJOYXVydSIsICJOZXBhbCIsICJOZXRoZXJsYW5kcyIsICJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsICJOZXcgQ2FsZWRvbmlhIiwgIk5ldyBaZWFsYW5kIiwKKyAgICAgICAgICAgICJOaWNhcmFndWEiLCAiTmlnZXIiLCAiTmlnZXJpYSIsICJOaXVlIiwgIk5vcmZvbGsgSXNsYW5kIiwgIk5vcnRoIEtvcmVhIiwgIk5vcnRoZXJuIE1hcmlhbmFzIiwKKyAgICAgICAgICAgICJOb3J3YXkiLCAiT21hbiIsICJQYWtpc3RhbiIsICJQYWxhdSIsICJQYW5hbWEiLCAiUGFwdWEgTmV3IEd1aW5lYSIsICJQYXJhZ3VheSIsICJQZXJ1IiwKKyAgICAgICAgICAgICJQaGlsaXBwaW5lcyIsICJQaXRjYWlybiBJc2xhbmRzIiwgIlBvbGFuZCIsICJQb3J0dWdhbCIsICJQdWVydG8gUmljbyIsICJRYXRhciIsCisgICAgICAgICAgICAiUmV1bmlvbiIsICJSb21hbmlhIiwgIlJ1c3NpYSIsICJSd2FuZGEiLCAiU3FvIFRvbWUgYW5kIFByaW5jaXBlIiwgIlNhaW50IEhlbGVuYSIsCisgICAgICAgICAgICAiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwgIlNhaW50IEx1Y2lhIiwgIlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAorICAgICAgICAgICAgIlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwgIlNhbW9hIiwgIlNhbiBNYXJpbm8iLCAiU2F1ZGkgQXJhYmlhIiwgIlNlbmVnYWwiLAorICAgICAgICAgICAgIlNleWNoZWxsZXMiLCAiU2llcnJhIExlb25lIiwgIlNpbmdhcG9yZSIsICJTbG92YWtpYSIsICJTbG92ZW5pYSIsICJTb2xvbW9uIElzbGFuZHMiLAorICAgICAgICAgICAgIlNvbWFsaWEiLCAiU291dGggQWZyaWNhIiwgIlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwgIlNvdXRoIEtvcmVhIiwKKyAgICAgICAgICAgICJTcGFpbiIsICJTcmkgTGFua2EiLCAiU3VkYW4iLCAiU3VyaW5hbWUiLCAiU3ZhbGJhcmQgYW5kIEphbiBNYXllbiIsICJTd2F6aWxhbmQiLCAiU3dlZGVuIiwKKyAgICAgICAgICAgICJTd2l0emVybGFuZCIsICJTeXJpYSIsICJUYWl3YW4iLCAiVGFqaWtpc3RhbiIsICJUYW56YW5pYSIsICJUaGFpbGFuZCIsICJUaGUgQmFoYW1hcyIsCisgICAgICAgICAgICAiVGhlIEdhbWJpYSIsICJUb2dvIiwgIlRva2VsYXUiLCAiVG9uZ2EiLCAiVHJpbmlkYWQgYW5kIFRvYmFnbyIsICJUdW5pc2lhIiwgIlR1cmtleSIsCisgICAgICAgICAgICAiVHVya21lbmlzdGFuIiwgIlR1cmtzIGFuZCBDYWljb3MgSXNsYW5kcyIsICJUdXZhbHUiLCAiVmlyZ2luIElzbGFuZHMiLCAiVWdhbmRhIiwKKyAgICAgICAgICAgICJVa3JhaW5lIiwgIlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwgIlVuaXRlZCBLaW5nZG9tIiwKKyAgICAgICAgICAgICJVbml0ZWQgU3RhdGVzIiwgIlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsICJVcnVndWF5IiwgIlV6YmVraXN0YW4iLAorICAgICAgICAgICAgIlZhbnVhdHUiLCAiVmF0aWNhbiBDaXR5IiwgIlZlbmV6dWVsYSIsICJWaWV0bmFtIiwgIldhbGxpcyBhbmQgRnV0dW5hIiwgIldlc3Rlcm4gU2FoYXJhIiwKKyAgICAgICAgICAgICJZZW1lbiIsICJZdWdvc2xhdmlhIiwgIlphbWJpYSIsICJaaW1iYWJ3ZSIKKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlKGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuZGVmYXVsdF93YWxscGFwZXIpKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubGlzdF9hY3Rpdml0eSk7CisKKyAgICAgICAgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTaW1wbGVMaXN0QWRhcHRlcih0aGlzKTsKKworICAgICAgICBMaXN0VmlldyBsaXN0ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0KTsKKyAgICAgICAgbGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBsaXN0LnNldENhY2hlQ29sb3JIaW50KDApOworICAgICAgICBsaXN0LnNldFZlcnRpY2FsRmFkaW5nRWRnZUVuYWJsZWQodHJ1ZSk7CisKKyAgICAgICAgcmVnaXN0ZXJGb3JDb250ZXh0TWVudShsaXN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSwgdiwgbWVudUluZm8pOworICAgICAgICBtZW51LnNldEhlYWRlclRpdGxlKCJDb250ZXh0IG1lbnUiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAxIik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMiIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxTdHJpbmc+IHsKKyAgICAgICAgcHVibGljIFNpbXBsZUxpc3RBZGFwdGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIERBVEFfTElTVCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIFRleHRWaWV3IHYgPSAoVGV4dFZpZXcpIHN1cGVyLmdldFZpZXcocG9zaXRpb24sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gci5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgdi5zZXRDb21wb3VuZERyYXdhYmxlUGFkZGluZygoaW50KSAoNiAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKHIuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY29uKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExMDc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1hmZXJtb2RlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBYZmVybW9kZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBYZmVybW9kZXNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgWGZlcm1vZGVzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbHVlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVJlZFBhaW50OworCisgICAgICAgIFhmZXJtb2Rlc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJsdWVQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJsdWVQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVJlZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUmVkUGFpbnQuc2V0Q29sb3IoMHg3ZmZmMDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgLy9jYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFNSQyBtb2RlcworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1ZFUik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDX0lOKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1VUKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfQVRPUCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEU1QgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09WRVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVF9JTik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09VVCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX0FUT1ApOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gT3RoZXIgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuQ0xFQVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlhPUik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMCk7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldENvbG9yKDB4N2YwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldEFscGhhKDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd1JlY3RzKENhbnZhcyBjYW52YXMsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgNTAuMGYsIDUwLjBmLCBtQmx1ZVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjUuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIG1SZWRQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKG1vZGUpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCA1MC4wZiwgNTAuMGYsIG1SZWRQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX2dtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QzM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX3Bob25lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJlN2QzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiNGUyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VmZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZWMyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24xLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NTI1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24yLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzMDk4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3MmI2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb240LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhNDBmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfZ21haWwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX2dtYWlsLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfcGhvbmUucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX3Bob25lLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfY2hhdC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2NoYXQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfZW1haWwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjEucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24xLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMS5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMi5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24yLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjMucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjQucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb240LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uNC5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L05vdGlmaWNhdGlvblRlc3RMaXN0LmphdmEgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQppbmRleCBiNzkzZDYyLi5lMzBjZjRhIDEwMDY0NAotLS0gYS90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQorKysgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQpAQCAtMTYsMTIgKzE2LDE0IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3RhdHVzYmFydGVzdDsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTc3LDYgKzc5LDExMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9LAogCisgICAgICAgIG5ldyBUZXN0KCJDYW5jZWwgIzEiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1OTS5jYW5jZWwoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgbmV3IFRlc3QoIlRpY2tlciAxIGxpbmUiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKFIuZHJhd2FibGUuaWNvbjEsICJ0aWNrIHRpY2sgdGljayIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDcmVhdGVUaW1lKTsKKyAgICAgICAgICAgICAgICBuLnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLCAiUGVyc2lzdGVudCAjMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBub3RpZmljYXRpb24hISEiLCBtYWtlSW50ZW50KCkpOworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgbmV3IFRlc3QoIlRpY2tlciAxIGxpbmUgJiBpY29uIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24xLCAidGljayB0aWNrIHRpY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q3JlYXRlVGltZSk7CisgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgbm90aWZpY2F0aW9uISEhIiwgbWFrZUludGVudCgpKTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlckljb25zID0gbmV3IEJpdG1hcFsxXTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlckljb25zWzBdID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmljb24zKTsKKyAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDEsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIG5ldyBUZXN0KCJUaWNrZXIgMiBsaW5lcyIpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24oUi5kcmF3YWJsZS5pY29uMSwgInRpY2sgdGljayB0aWNrXG50b2NrIHRvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q3JlYXRlVGltZSk7CisgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgbm90aWZpY2F0aW9uISEhIiwgbWFrZUludGVudCgpKTsKKyAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDEsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIG5ldyBUZXN0KCJUaWNrZXIgdGl0bGUiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKFIuZHJhd2FibGUuaWNvbjEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDcmVhdGVUaW1lKTsKKyAgICAgICAgICAgICAgICBuLnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLCAiUGVyc2lzdGVudCAjMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBub3RpZmljYXRpb24hISEiLCBtYWtlSW50ZW50KCkpOworICAgICAgICAgICAgICAgIG4udGlja2VyVGl0bGUgPSAiVGhpcyBpcyBhIHRpdGxlIjsKKyAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDEsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIG5ldyBUZXN0KCJUaWNrZXIgc3VidGl0bGUiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKFIuZHJhd2FibGUuaWNvbjEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDcmVhdGVUaW1lKTsKKyAgICAgICAgICAgICAgICBuLnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLCAiUGVyc2lzdGVudCAjMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBub3RpZmljYXRpb24hISEiLCBtYWtlSW50ZW50KCkpOworICAgICAgICAgICAgICAgIG4udGlja2VyU3VidGl0bGUgPSAiYW5kIGEgc3VidGl0bGUiOworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgbmV3IFRlc3QoIlRpY2tlciB0aXRsZSAmIHN1YnRpdGxlIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24xLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q3JlYXRlVGltZSk7CisgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgbm90aWZpY2F0aW9uISEhIiwgbWFrZUludGVudCgpKTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlclRpdGxlID0gIlRoaXMgaXMgYSB0aXRsZSBpdCBpcyByZWFsbHkgcmVhbGx5IGxvbmdnZ2dnZyBsb25nIGxvbmcgbG9uZyBsb25nIjsKKyAgICAgICAgICAgICAgICBuLnRpY2tlclN1YnRpdGxlID0gImFuZCBhIHN1YnRpdGxlIGl0IGlzIHJlYWxseSByZWFsbHkgbG9uZ2dnZ2dnIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmciOworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgbmV3IFRlc3QoIlRpY2tlciB0ZXh0LCB0aXRsZSAmIHN1YnRpdGxlIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24xLCAibm90IHZpc2libGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q3JlYXRlVGltZSk7CisgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgbm90aWZpY2F0aW9uISEhIiwgbWFrZUludGVudCgpKTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlclRpdGxlID0gIlRoaXMgaXMgYSB0aXRsZSI7CisgICAgICAgICAgICAgICAgbi50aWNrZXJTdWJ0aXRsZSA9ICJhbmQgYSBzdWJ0aXRsZSI7CisgICAgICAgICAgICAgICAgbU5NLm5vdGlmeSgxLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBuZXcgVGVzdCgiVGlja2VyIHRpdGxlLCBzdWJ0aXRsZSAmIDIgaWNvbnMiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKFIuZHJhd2FibGUuaWNvbjEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDcmVhdGVUaW1lKTsKKyAgICAgICAgICAgICAgICBuLnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLCAiUGVyc2lzdGVudCAjMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBub3RpZmljYXRpb24hISEiLCBtYWtlSW50ZW50KCkpOworICAgICAgICAgICAgICAgIG4udGlja2VyVGl0bGUgPSAiVGhpcyBpcyBhIHRpdGxlIjsKKyAgICAgICAgICAgICAgICBuLnRpY2tlclN1YnRpdGxlID0gImFuZCBhIHN1YnRpdGxlIjsKKworICAgICAgICAgICAgICAgIG4udGlja2VySWNvbnMgPSBuZXcgQml0bWFwWzJdOworICAgICAgICAgICAgICAgIG4udGlja2VySWNvbnNbMF0gPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuaWNvbjMpOworICAgICAgICAgICAgICAgIG4udGlja2VySWNvbnNbMV0gPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuYXBwX2dtYWlsKTsKKworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBuLnRpY2tlckljb25zWzBdLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlckljb25zWzFdLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9LAorCiAgICAgICAgIG5ldyBUZXN0KCJObyB2aWV3IikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24xLCAiTm8gdmlldyIsCkBAIC05OCwxMiArMjA2LDE2IEBACiAgICAgICAgIG5ldyBUZXN0KCJMYXlvdXQiKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuOwogCi0gICAgICAgICAgICAgICAgbU5NLm5vdGlmeSgxLCBuZXcgTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvblRlc3RMaXN0LnRoaXMsCisgICAgICAgICAgICAgICAgbiA9IG5ldyBOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLSgxMDAwKjYwKjYwKjI0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQ1MykgMTIzLTIzMjgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIG51bGwpOworICAgICAgICAgICAgICAgIG4uZmxhZ3MgfD0gTm90aWZpY2F0aW9uLkZMQUdfT05HT0lOR19FVkVOVDsKKworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CiAKICAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDIsIG5ldyBOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX3N0YXR1c2Jhcl9lbWFpbCwKQEAgLTQ3OSw3ICs1OTEsNyBAQAogCiAgICAgICAgIG5ldyBUZXN0KCJQZXJzaXN0ZW50ICMzIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24yLCAidG9jayB0b2NrIHRvY2siLAorICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24yLCAidG9jayB0b2NrIHRvY2tcbm1vb29vbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3RpZnkgbWUhISEiLCBtYWtlSW50ZW50KCkpOwpAQCAtNjMzLDIwICs3NDUsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9LAogCi0gICAgICAgIG5ldyBUZXN0KCJUaWNrZXIiKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBOb3RpZmljYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuYXBwX2dtYWlsLCAKLSAgICAgICAgICAgICAgICAgICAgIk5ldyBtYWlsIGZyb20gam9lb0BleGFtcGxlLmNvbSwgb24gdGhlIHRvcGljIG9mIHZlcnkgbG9uZyB0aWNrZXIgdGV4dHMiLAotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgICAgICAgICAgbm90LnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLAotICAgICAgICAgICAgICAgICAgICAiQSBuZXcgbWVzc2FnZSBhd2FpdHMiLAotICAgICAgICAgICAgICAgICAgICAiVGhlIGNvbnRlbnRzIGFyZSB2ZXJ5IGludGVyZXN0aW5nIGFuZCBpbXBvcnRhbnQiLAotICAgICAgICAgICAgICAgICAgICBtYWtlSW50ZW50KCkpOwotICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbm90KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLQogICAgICAgICBuZXcgVGVzdCgiQ3Jhc2giKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQogICAgICAgICAgICAgewpAQCAtNzE1LDUgKzgxMywxMCBAQAogICAgICAgICAgICAgICAgICAgICB0aW1lLCBsYWJlbCwgIiIgKyBuZXcgamF2YS51dGlsLkRhdGUodGltZSksIG51bGwpKTsKIAogICAgIH0KKworICAgIEJpdG1hcCBsb2FkQml0bWFwKGludCByZXNJZCkgeworICAgICAgICBCaXRtYXBEcmF3YWJsZSBiZCA9IChCaXRtYXBEcmF3YWJsZSlnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShyZXNJZCk7CisgICAgICAgIHJldHVybiBCaXRtYXAuY3JlYXRlQml0bWFwKGJkLmdldEJpdG1hcCgpKTsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvU3RhdHVzQmFyVGVzdC5qYXZhCmluZGV4IDQzOGEwNjAuLjdlNjllZTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YQpAQCAtODEsMjMgKzgxLDMyIEBACiAgICAgICAgICAgICAgICAgbVN0YXR1c0Jhck1hbmFnZXIuc2V0SWNvbigic3BlYWtlcnBob25lIiwgUi5kcmF3YWJsZS5zdGF0X3N5c19waG9uZSwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0sCi0gICAgICAgIG5ldyBUZXN0KCJIaWRlIikgeworICAgICAgICBuZXcgVGVzdCgiSGlkZSAoRkxBR19GVUxMU0NSRUVOKSIpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBXaW5kb3cgd2luID0gZ2V0V2luZG93KCk7Ci0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgd2luUGFyYW1zID0gd2luLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICB3aW5QYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOOwotICAgICAgICAgICAgICAgIHdpbi5zZXRBdHRyaWJ1dGVzKHdpblBhcmFtcyk7CisgICAgICAgICAgICAgICAgd2luLnNldEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTik7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmxhZ3M9IiArIEludGVnZXIudG9IZXhTdHJpbmcod2luLmdldEF0dHJpYnV0ZXMoKS5mbGFncykpOwogICAgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBuZXcgVGVzdCgiU2hvdyIpIHsKKyAgICAgICAgbmV3IFRlc3QoIlNob3cgKH5GTEFHX0ZVTExTQ1JFRU4pIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIFdpbmRvdyB3aW4gPSBnZXRXaW5kb3coKTsKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyB3aW5QYXJhbXMgPSB3aW4uZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIHdpblBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOOwotICAgICAgICAgICAgICAgIHdpbi5zZXRBdHRyaWJ1dGVzKHdpblBhcmFtcyk7CisgICAgICAgICAgICAgICAgd2luLnNldEZsYWdzKDAsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTik7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmxhZ3M9IiArIEludGVnZXIudG9IZXhTdHJpbmcod2luLmdldEF0dHJpYnV0ZXMoKS5mbGFncykpOwogICAgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBuZXcgVGVzdCgiZnVsbFNjcmVlbkludGVudCIpIHsKKyAgICAgICAgbmV3IFRlc3QoIkltbWVyc2l2ZTogRW50ZXIiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2V0SW1tZXJzaXZlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBuZXcgVGVzdCgiSW1tZXJzaXZlOiBFeGl0IikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHNldEltbWVyc2l2ZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG5ldyBUZXN0KCJQcmlvcml0eSBub3RpZmljYXRpb24iKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBOb3RpZmljYXRpb24oU3RhdHVzQmFyVGVzdC50aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLnN0YXRfc3lzX3Bob25lLApAQCAtMTA3LDggKzExNiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoODg4KSA1NTUtNTAzOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBub3QuZmxhZ3MgfD0gTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWTsKICAgICAgICAgICAgICAgICBJbnRlbnQgZnVsbFNjcmVlbkludGVudCA9IG5ldyBJbnRlbnQoU3RhdHVzQmFyVGVzdC50aGlzLCBUZXN0QWxlcnRBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaW50IGlkID0gKGludClTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSAoaW50KVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOyAvLyBYWFggSEFYCiAgICAgICAgICAgICAgICAgZnVsbFNjcmVlbkludGVudC5wdXRFeHRyYSgiaWQiLCBpZCk7CiAgICAgICAgICAgICAgICAgbm90LmZ1bGxTY3JlZW5JbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KAogICAgICAgICAgICAgICAgICAgICBTdGF0dXNCYXJUZXN0LnRoaXMsCkBAIC0xNTgsNiArMTY4LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIH0sIDMwMDApOwogICAgICAgICAgICAgfQogICAgICAgICB9LAorICAgICAgICBuZXcgVGVzdCgiRGlzYWJsZSBOYXZpZ2F0aW9uIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJNYW5hZ2VyLmRpc2FibGUoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05BVklHQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBuZXcgVGVzdCgiRGlzYWJsZSBldmVyeXRoaW5nIGluIDMgc2VjIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyTWFuYWdlci5kaXNhYmxlKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0FMRVJUUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfU1lTVEVNX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05BVklHQVRJT04pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LCAzMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKICAgICAgICAgbmV3IFRlc3QoIkVuYWJsZSBldmVyeXRoaW5nIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJNYW5hZ2VyLmRpc2FibGUoMCk7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L0NvbW1hbmQuY3BwIGIvdG9vbHMvYWFwdC9Db21tYW5kLmNwcAppbmRleCBmNzFlYmI5Li5lYWZmMGY0IDEwMDY0NAotLS0gYS90b29scy9hYXB0L0NvbW1hbmQuY3BwCisrKyBiL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKQEAgLTE5OCw4ICsxOTgsMTAgQEAKICAgICAgICAgaWYgKCZyZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgcHJpbnRmKCJcbk5vIHJlc291cmNlIHRhYmxlIGZvdW5kLlxuIik7CiAgICAgICAgIH0gZWxzZSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICAgICAgcHJpbnRmKCJcblJlc291cmNlIHRhYmxlOlxuIik7CiAgICAgICAgICAgICByZXMucHJpbnQoZmFsc2UpOworI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBBc3NldCogbWFuaWZlc3RBc3NldCA9IGFzc2V0cy5vcGVuTm9uQXNzZXQoIkFuZHJvaWRNYW5pZmVzdC54bWwiLApAQCAtMzkwLDggKzM5Miw5IEBACiAgICAgfQogCiAgICAgaWYgKHN0cmNtcCgicmVzb3VyY2VzIiwgb3B0aW9uKSA9PSAwKSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICByZXMucHJpbnQoYnVuZGxlLT5nZXRWYWx1ZXMoKSk7Ci0KKyNlbmRpZgogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJ4bWx0cmVlIiwgb3B0aW9uKSA9PSAwKSB7CiAgICAgICAgIGlmIChidW5kbGUtPmdldEZpbGVTcGVjQ291bnQoKSA8IDMpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IG5vIGR1bXAgeG1sdHJlZSByZXNvdXJjZSBmaWxlIHNwZWNpZmllZFxuIik7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1BhY2thZ2UuY3BwIGIvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcAppbmRleCA5OTlhNWNmLi4zY2I2MTRmIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1BhY2thZ2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiBzc2l6ZV90IHByb2Nlc3NKYXJGaWxlcyhCdW5kbGUqIGJ1bmRsZSwgWmlwRmlsZSogemlwKQogewotICAgIHNzaXplX3QgZXJyOworICAgIHN0YXR1c190IGVycjsKICAgICBzc2l6ZV90IGNvdW50ID0gMDsKICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgY2hhcio+JiBqYXJzID0gYnVuZGxlLT5nZXRKYXJGaWxlcygpOwogCmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCmluZGV4IGM4YmE5MDQuLjgyMjI2MmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCkBAIC01NDIsMTEgKzU0MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPEFhcHRHcm91cEVudHJ5LCBzcDxBYXB0RmlsZT4gPiBiYXNlRmlsZXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXAtPmdldEZpbGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBiYXNlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImJhc2VGaWxlICVsZCBoYXMgZmxhdm9yICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiYmFzZUZpbGUgJWQgaGFzIGZsYXZvciAlc1xuIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VGaWxlcy5rZXlBdChpKS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IG92ZXJsYXlGaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigib3ZlcmxheUZpbGUgJWxkIGhhcyBmbGF2b3IgJXNcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJvdmVybGF5RmlsZSAlZCBoYXMgZmxhdm9yICVzXG4iLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZpbGVzLmtleUF0KGkpLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC01NjAsNyArNTYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5QXQob3ZlcmxheUdyb3VwSW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJhc2VGaWxlSW5kZXggPCBVTktOT1dOX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZS0+Z2V0VmVyYm9zZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZm91bmQgYSBtYXRjaCAoJWxkKSBmb3Igb3ZlcmxheSBmaWxlICVzLCBmb3IgZmxhdm9yICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImZvdW5kIGEgbWF0Y2ggKCVkKSBmb3Igb3ZlcmxheSBmaWxlICVzLCBmb3IgZmxhdm9yICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VGaWxlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUdyb3VwLT5nZXRMZWFmKCkuc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZpbGVzLmtleUF0KG92ZXJsYXlHcm91cEluZGV4KS50b1N0cmluZygpLnN0cmluZygpKTsKQEAgLTIwODMsMTIgKzIwODMsMTMgQEAKICAgICAvLyB0YWc6YXR0cmlidXRlIHBhaXJzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaW4gbGF5b3V0IGZpbGVzLgogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE5hbWVzcGFjZUF0dHJpYnV0ZVBhaXI+IGtMYXlvdXRUYWdBdHRyUGFpcnM7CiAgICAgYWRkVGFnQXR0clBhaXIoJmtMYXlvdXRUYWdBdHRyUGFpcnMsICJ2aWV3IiwgTlVMTCwgImNsYXNzIik7CisgICAgYWRkVGFnQXR0clBhaXIoJmtMYXlvdXRUYWdBdHRyUGFpcnMsICJmcmFnbWVudCIsIE5VTEwsICJjbGFzcyIpOwogICAgIGFkZFRhZ0F0dHJQYWlyKCZrTGF5b3V0VGFnQXR0clBhaXJzLCAiZnJhZ21lbnQiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJuYW1lIik7CiAKICAgICAvLyB0YWc6YXR0cmlidXRlIHBhaXJzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaW4geG1sIGZpbGVzLgogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE5hbWVzcGFjZUF0dHJpYnV0ZVBhaXI+IGtYbWxUYWdBdHRyUGFpcnM7CiAgICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJQcmVmZXJlbmNlU2NyZWVuIiwgUkVTT1VSQ0VTX0FORFJPSURfTkFNRVNQQUNFLCAiZnJhZ21lbnQiKTsKLSAgICBhZGRUYWdBdHRyUGFpcigma1htbFRhZ0F0dHJQYWlycywgIkhlYWRlciIsIFJFU09VUkNFU19BTkRST0lEX05BTUVTUEFDRSwgImZyYWdtZW50Iik7CisgICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJoZWFkZXIiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJmcmFnbWVudCIpOwogCiAgICAgY29uc3QgVmVjdG9yPHNwPEFhcHREaXI+ID4mIGRpcnMgPSBhc3NldHMtPnJlc0RpcnMoKTsKICAgICBjb25zdCBzaXplX3QgSyA9IGRpcnMuc2l6ZSgpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKaW5kZXggMjk2NDRhNi4uMWQ2YjE4ZCAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCkBAIC0yNDQyLDcgKzI0NDIsNyBAQAogICAgICAgICBpZiAoY29uZmlnU2V0LmNvdW50KGRlZmF1bHRMb2NhbGUpID09IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiYWFwdDogd2FybmluZzogc3RyaW5nICclcycgaGFzIG5vIGRlZmF1bHQgdHJhbnNsYXRpb24gaW4gJXM7IGZvdW5kOiIsCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgobmFtZUl0ZXItPmZpcnN0KS5zdHJpbmcoKSwgbUJ1bmRsZS0+Z2V0UmVzb3VyY2VTb3VyY2VEaXJzKClbMF0pOwotICAgICAgICAgICAgZm9yIChzZXQ8U3RyaW5nOD46Oml0ZXJhdG9yIGxvY2FsZXMgPSBjb25maWdTZXQuYmVnaW4oKTsKKyAgICAgICAgICAgIGZvciAoc2V0PFN0cmluZzg+Ojpjb25zdF9pdGVyYXRvciBsb2NhbGVzID0gY29uZmlnU2V0LmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgIGxvY2FsZXMgIT0gY29uZmlnU2V0LmVuZCgpOwogICAgICAgICAgICAgICAgICBsb2NhbGVzKyspIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAlcyIsICgqbG9jYWxlcykuc3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcCBiL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKaW5kZXggYTA5Y2VjMC4uZTI4YmRmZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcAorKysgYi90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgICAgICBzdHIgPSBTdHJpbmc4KHBvb2wtPnN0cmluZ0F0KHMsICZsZW4pKS5zdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaW50ZigiU3RyaW5nICMlbGQ6ICVzXG4iLCBzLCBzdHIpOworICAgICAgICBwcmludGYoIlN0cmluZyAjJWQ6ICVzXG4iLCBzLCBzdHIpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcCBiL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKaW5kZXggODU1MWIwZi4uY2VlODU0NiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcAorKysgYi90b29scy9hYXB0L1hNTE5vZGUuY3BwCkBAIC0yMDMsOSArMjAzLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHhsaWZmRGVwdGggPT0gMCAmJiBwc2V1ZG9sb2NhbGl6ZSkgeworI2lmZGVmIEVOQUJMRV9QU0VVRE9MT0NBTElaRQogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9yaWcoU3RyaW5nOCh0ZXh0KS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHNldWRvID0gcHNldWRvbG9jYWxpemVfc3RyaW5nKG9yaWcpOwogICAgICAgICAgICAgICAgIGN1clN0cmluZy5hcHBlbmQoU3RyaW5nMTYoU3RyaW5nOChwc2V1ZG8uY19zdHIoKSkpKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyNlbmRpZgogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoaXNGb3JtYXR0ZWQgJiYgaGFzU3Vic3RpdHV0aW9uRXJyb3JzKGZpbGVOYW1lLCBpblhtbCwgdGV4dCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1ppcEZpbGUuaCBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCmluZGV4IGRiYmQwNzIuLjc4Nzc1NTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCisrKyBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgLyoKICAgICAgKiBPcGVuIGEgbmV3IG9yIGV4aXN0aW5nIGFyY2hpdmUuCiAgICAgICovCi0gICAgdHlwZWRlZiBlbnVtIHsKKyAgICBlbnVtIHsKICAgICAgICAga09wZW5SZWFkT25seSAgID0gMHgwMSwKICAgICAgICAga09wZW5SZWFkV3JpdGUgID0gMHgwMiwKICAgICAgICAga09wZW5DcmVhdGUgICAgID0gMHgwNCwgICAgIC8vIGNyZWF0ZSBpZiBpdCBkb2Vzbid0IGV4aXN0CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvUkVBRE1FIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVhOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK0xheW91dGxpYiBpcyBhIGN1c3RvbSB2ZXJzaW9uIG9mIHRoZSBhbmRyb2lkIFZpZXcgZnJhbWV3b3JrIGRlc2lnbmVkIHRvIHJ1biBpbnNpZGUgRWNsaXBzZS4KK1RoZSBnb2FsIG9mIHRoZSBsaWJyYXJ5IGlzIHRvIHByb3ZpZGUgbGF5b3V0IHJlbmRlcmluZyBpbiBFY2xpcHNlIHRoYXQgYXJlIHZlcnkgdmVyeSBjbG9zZSB0byB0aGVpciByZW5kZXJpbmcgb24gZGV2aWNlcy4KKworTm9uZSBvZiB0aGUgY29tLmFuZHJvaWQuKiBvciBhbmRyb2lkLiogY2xhc3NlcyBpbiBsYXlvdXRsaWIgcnVuIG9uIGRldmljZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKaW5kZXggZDVkMzE1ZS4uMWUxYWJhOSAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC02OSwxMSArNjksNiBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBDYW52YXMoaW50KSIpOwogICAgIH0KIAotICAgIHB1YmxpYyBDYW52YXMoamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wgZ2wpIHsKLSAgICAgICAgbUxvZ2dlciA9IG51bGw7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlIENhbnZhcyhqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCkiKTsKLSAgICB9Ci0KICAgICAvLyBjdXN0b20gY29uc3RydWN0b3JzIGZvciBvdXIgdXNlLgogICAgIHB1YmxpYyBDYW52YXMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBJTGF5b3V0TG9nIGxvZ2dlcikgewogICAgICAgICBtTG9nZ2VyID0gbG9nZ2VyOwpAQCAtMTE3NCwxNSArMTE2OSw2IEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZ2V0R0woKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0R0woKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNnZXRNYXRyaXgoKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTI1NywxNSArMTI0Myw2IEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjc2V0Vmlld3BvcnQoaW50LCBpbnQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgc3VwZXIuc2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjc2tldyhmbG9hdCwgZmxvYXQpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL3ZpZXcvQnJpZGdlSW5mbGF0ZXIuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvdmlldy9CcmlkZ2VJbmZsYXRlci5qYXZhCmluZGV4IDA5MTBkNzkuLjRiYzg4NTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvdmlldy9CcmlkZ2VJbmZsYXRlci5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvdmlldy9CcmlkZ2VJbmZsYXRlci5qYXZhCkBAIC0xMTYsMTAgKzExNiwxMCBAQAogICAgIH0KICAgICAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlldyBjcmVhdGVWaWV3RnJvbVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgcHVibGljIFZpZXcgY3JlYXRlVmlld0Zyb21UYWcoVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgVmlldyB2aWV3ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZpZXcgPSBzdXBlci5jcmVhdGVWaWV3RnJvbVRhZyhuYW1lLCBhdHRycyk7CisgICAgICAgICAgICB2aWV3ID0gc3VwZXIuY3JlYXRlVmlld0Zyb21UYWcocGFyZW50LCBuYW1lLCBhdHRycyk7CiAgICAgICAgIH0gY2F0Y2ggKEluZmxhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gdHJ5IHRvIGxvYWQgdGhlIGNsYXNzIGZyb20gdXNpbmcgdGhlIGN1c3RvbSB2aWV3IGxvYWRlcgogICAgICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZS5qYXZhCmluZGV4IGY5MWY2MDEuLjA1NTNmNWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2UuamF2YQpAQCAtMzAsNiArMzAsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxheW91dGxpYi5jcmVhdGUuTWV0aG9kQWRhcHRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuY3JlYXRlLk92ZXJyaWRlTWV0aG9kOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwpAQCAtNDYsNiArNDgsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQnJpZGdlSW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkRyYWdFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRDaGFubmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93U2Vzc2lvbjsKQEAgLTEwNzMsNiArMTA3NiwzMyBAQAogICAgICAgICB9CiAKICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBJQmluZGVyIHByZXBhcmVEcmFnKElXaW5kb3cgd2luZG93LCBib29sZWFuIGxvY2FsT25seSwKKyAgICAgICAgICAgICAgICBpbnQgdGh1bWJuYWlsV2lkdGgsIGludCB0aHVtYm5haWxIZWlnaHQsIFN1cmZhY2Ugb3V0U3VyZmFjZSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIHBhc3MgZm9yIG5vdworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybURyYWcoSVdpbmRvdyB3aW5kb3csIElCaW5kZXIgZHJhZ1Rva2VuLAorICAgICAgICAgICAgICAgIGZsb2F0IHRvdWNoWCwgZmxvYXQgdG91Y2hZLCBmbG9hdCB0aHVtYkNlbnRlclgsIGZsb2F0IHRodW1iQ2VudGVyWSwKKyAgICAgICAgICAgICAgICBDbGlwRGF0YSBkYXRhKQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgLy8gcGFzcyBmb3Igbm93CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHZvaWQgZHJhZ1JlY2lwaWVudEVudGVyZWQoSVdpbmRvdyB3aW5kb3cpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgLy8gcGFzcyBmb3Igbm93CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHZvaWQgZHJhZ1JlY2lwaWVudEV4aXRlZChJV2luZG93IHdpbmRvdykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBwYXNzIGZvciBub3cKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgICAgICBwdWJsaWMgdm9pZCBzZXRXYWxscGFwZXJQb3NpdGlvbihJQmluZGVyIHdpbmRvdywgZmxvYXQgeCwgZmxvYXQgeSwKICAgICAgICAgICAgIGZsb2F0IHhTdGVwLCBmbG9hdCB5U3RlcCkgewogICAgICAgICAgICAgLy8gcGFzcyBmb3Igbm93LgpAQCAtMTE3MCw2ICsxMjAwLDExIEBACiAgICAgICAgICAgICAvLyBwYXNzIGZvciBub3cuCiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEcmFnRXZlbnQoRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAvLyBwYXNzIGZvciBub3cuCisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgSUJpbmRlciBhc0JpbmRlcigpIHsKICAgICAgICAgICAgIC8vIHBhc3MgZm9yIG5vdy4KICAgICAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2VDb250ZXh0LmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQppbmRleCBkNWE5MGU2Li5mNTAxNDU5IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0xMDY1LDYgKzEwNjYsMTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIGFyZzAsIGludCBhcmcxLAorICAgICAgICAgICAgQ3Vyc29yRmFjdG9yeSBhcmcyLCBEYXRhYmFzZUVycm9ySGFuZGxlciBhcmczKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERyYXdhYmxlIHBlZWtXYWxscGFwZXIoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3Rlc3RzL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvVGVzdENsYXNzUmVwbGFjZW1lbnQuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2UvdGVzdHMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9UZXN0Q2xhc3NSZXBsYWNlbWVudC5qYXZhCmluZGV4IGUwZGM1NWYuLmFkYjY5M2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2UvdGVzdHMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9UZXN0Q2xhc3NSZXBsYWNlbWVudC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2UvdGVzdHMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9UZXN0Q2xhc3NSZXBsYWNlbWVudC5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2U7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIApAQCAtMjYsNyArMjgsOCBAQAogICAgICAgICAvLyBUT0RPOiB3ZSB3YW50IHRvIHRlc3QgYWxsIHRoZSBjbGFzc2VzLiBGb3Igbm93IG9ubHkgUGFpbnQgcGFzc2VzIHRoZSB0ZXN0cy4KIC8vICAgICAgICBmaW5hbCBTdHJpbmdbXSBjbGFzc2VzID0gQ3JlYXRlSW5mby5SRU5BTUVEX0NMQVNTRVM7CiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNsYXNzZXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICJhbmRyb2lkLmdyYXBoaWNzLlBhaW50IiwgICAgICAgICAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5fT3JpZ2luYWxfUGFpbnQiCisgICAgICAgICAgICAgICAgImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiLCAgICAgICAgICAgICAgICJhbmRyb2lkLmdyYXBoaWNzLl9PcmlnaW5hbF9QYWludCIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIiwgICAgICAgICAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5fT3JpZ2luYWxfQ2FudmFzIiwKICAgICAgICAgfTsKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gY2xhc3Nlcy5sZW5ndGg7CiAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50IDsgaSArPSAyKSB7CkBAIC01MiwxMiArNTUsMjEgQEAKICAgICAgICAgTWV0aG9kW10gb2xkQ2xhc3NNZXRob2RzID0gb2xkQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CiAKICAgICAgICAgZm9yIChNZXRob2Qgb2xkTWV0aG9kIDogb2xkQ2xhc3NNZXRob2RzKSB7Ci0gICAgICAgICAgICAvLyB3ZSBpZ25vcmUgYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBuYXRpdmUKKyAgICAgICAgICAgIC8vIHdlIGlnbm9yZSBhbnl0aGluZyB0aGF0IHN0YXJ0cyB3aXRoIG5hdGl2ZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBjbGFzcyB3ZSBhcmUgbG9va2luZworICAgICAgICAgICAgLy8gYXQgaGFzIGFscmVhZHkgYmVlbiBtb2RpZmllZCB0byByZW1vdmUgdGhlIG5hdGl2ZSBtb2RpZmllcnMuCiAgICAgICAgICAgICBpZiAob2xkTWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKCJuYXRpdmUiKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBvciBzdGF0aWMgYW5kIHByaXZhdGUKKyAgICAgICAgICAgIGludCBwcml2YXRlU3RhdGljID0gTW9kaWZpZXIuU1RBVElDIHwgTW9kaWZpZXIuUFJJVkFURTsKKyAgICAgICAgICAgIGlmICgob2xkTWV0aG9kLmdldE1vZGlmaWVycygpICYgcHJpdmF0ZVN0YXRpYykgPT0gcHJpdmF0ZVN0YXRpYykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKE1ldGhvZCBuZXdNZXRob2QgOiBuZXdDbGFzc01ldGhvZHMpIHsKKwogICAgICAgICAgICAgICAgIGlmIChjb21wYXJlTWV0aG9kcyhuZXdDbGFzcywgbmV3TWV0aG9kLCBvbGRDbGFzcywgb2xkTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjUsNyArNzcsMzEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJVbmFibGUgdG8gZmluZCAlMSRzIiwgb2xkTWV0aG9kLnRvR2VuZXJpY1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhIGZ1bGwgY2xhc3MgbmFtZSB0aGF0J3MgbG9uZyBidXQgbm90IHRvbyBsb25nLgorICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihvbGRNZXRob2QuZ2V0TmFtZSgpICsgIigiKTsKKyAgICAgICAgICAgICAgICBUeXBlW10gcGFyYW1zID0gb2xkTWV0aG9kLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbal0gaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSAoQ2xhc3MpcGFyYW1zW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRoZUNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGltZW5zaW9ucyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhlQ2xhc3MuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9ucysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gdGhlQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIltdIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXJhbXNbal0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA8IChwYXJhbXMubGVuZ3RoIC0gMSkpCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIikiKTsKKworICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiTWlzc2luZyAlMSRzLiUyJHMiLCBuZXdDbGFzcy5nZXROYW1lKCksIHNiLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL1JFQURNRS50eHQgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL1JFQURNRS50eHQKaW5kZXggYzU5ZTIwZC4uNjVhNjRjZCAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9SRUFETUUudHh0CisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvUkVBRE1FLnR4dApAQCAtMTk1LDUgKzE5NSwyMiBAQAogYnJpZGdlIHdpbGwgcHJvdmlkZSBpdHMgb3duIGltcGxlbWVudGF0aW9uLgogCiAKKy0gUmVmZXJlbmNlcyAtCistLS0tLS0tLS0tLS0tLQorCisKK1RoZSBKVk0gU3BlY2lmaWNhdGlvbiAybmQgZWRpdGlvbjoKKyAgaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2p2bXMvc2Vjb25kX2VkaXRpb24vaHRtbC9WTVNwZWNUT0MuZG9jLmh0bWwKKworVW5kZXJzdGFuZGluZyBieXRlY29kZToKKyAgaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2libS9saWJyYXJ5L2l0LWhhZ2dhcl9ieXRlY29kZS8KKworQnl0ZWNvZGUgb3Bjb2RlIGxpc3Q6CisgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmF2YV9ieXRlY29kZV9pbnN0cnVjdGlvbl9saXN0aW5ncworCitBU00gdXNlciBndWlkZToKKyAgaHR0cDovL2Rvd25sb2FkLmZvcmdlLm9iamVjdHdlYi5vcmcvYXNtL2FzbS1ndWlkZS5wZGYKKworCiAtLQogZW5kCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvYW5ub3RhdGlvbnMvTGF5b3V0bGliRGVsZWdhdGUuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9hbm5vdGF0aW9ucy9MYXlvdXRsaWJEZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDhlYTYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvYW5ub3RhdGlvbnMvTGF5b3V0bGliRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCisvKioKKyAqIERlbm90ZXMgYSBtZXRob2QgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSBkZWxlZ2F0ZSBieSBsYXlvdXRsaWJfY3JlYXRlLgorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgTGF5b3V0bGliRGVsZWdhdGUgeworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Bc21HZW5lcmF0b3IuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtR2VuZXJhdG9yLmphdmEKaW5kZXggN2I1NWVkM2UuLjU5MDkyM2YgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtR2VuZXJhdG9yLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Bc21HZW5lcmF0b3IuamF2YQpAQCAtMjgsOSArMjgsOSBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsKIApAQCAtNjAsMzggKzYwLDU1IEBACiAgICAgICogIG9sZC1GUUNOIHRvIHJlbmFtZSBhbmQgdGhleSBnZXQgZXJhc2VkIGFzIHRoZXkgZ2V0IHJlbmFtZWQuIEF0IHRoZSBlbmQsIGNsYXNzZXMgc3RpbGwKICAgICAgKiAgbGVmdCBoZXJlIGFyZSBub3QgaW4gdGhlIGNvZGUgYmFzZSBhbnltb3JlIGFuZCB0aHVzIHdlcmUgbm90IHJlbmFtZWQuICovCiAgICAgcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gbUNsYXNzZXNOb3RSZW5hbWVkOwotICAgIC8qKiBBIG1hcCB7IEZRQ04gPT4gbWFwIHsgbGlzdCBvZiByZXR1cm4gdHlwZXMgdG8gZGVsZXRlIGZyb20gdGhlIEZRQ04gfSB9LiAqLworICAgIC8qKiBBIG1hcCB7IEZRQ04gPT4gc2V0IHsgbGlzdCBvZiByZXR1cm4gdHlwZXMgdG8gZGVsZXRlIGZyb20gdGhlIEZRQ04gfSB9LiAqLwogICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBtRGVsZXRlUmV0dXJuczsKKyAgICAvKiogQSBtYXAgeyBGUUNOID0+IHNldCB7IG1ldGhvZCBuYW1lcyB9IH0gb2YgbWV0aG9kcyB0byByZXdyaXRlIGFzIGRlbGVnYXRlcy4KKyAgICAgKiAgVGhlIHNwZWNpYWwgbmFtZSB7QGxpbmsgRGVsZWdhdGVDbGFzc0FkYXB0ZXIjQUxMX05BVElWRVN9IGNhbiBiZSB1c2VkIGFzIGluIGludGVybmFsIHNldC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gbURlbGVnYXRlTWV0aG9kczsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgZ2VuZXJhdG9yIHRoYXQgY2FuIGdlbmVyYXRlIHRoZSBvdXRwdXQgSkFSIHdpdGggdGhlIHN0dWJiZWQgY2xhc3Nlcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBsb2cgT3V0cHV0IGxvZ2dlci4KICAgICAgKiBAcGFyYW0gb3NEZXN0SmFyIFRoZSBwYXRoIG9mIHRoZSBkZXN0aW5hdGlvbiBKQVIgdG8gY3JlYXRlLgotICAgICAqIEBwYXJhbSBpbmplY3RDbGFzc2VzIFRoZSBsaXN0IG9mIGNsYXNzIGZyb20gbGF5b3V0bGliX2NyZWF0ZSB0byBpbmplY3QgaW4gbGF5b3V0bGliLgotICAgICAqIEBwYXJhbSBzdHViTWV0aG9kcyBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIHN0dWIgb3V0LiBFYWNoIGVudHJ5IG11c3QgYmUgaW4gdGhlIGZvcm0KLSAgICAgKiAgICAgICAgICAicGFja2FnZS5wYWNrYWdlLk91dGVyQ2xhc3MkSW5uZXJDbGFzcyNNZXRob2ROYW1lIi4KLSAgICAgKiBAcGFyYW0gcmVuYW1lQ2xhc3NlcyBUaGUgbGlzdCBvZiBjbGFzc2VzIHRvIHJlbmFtZSwgbXVzdCBiZSBhbiBldmVuIGxpc3Q6IHRoZSBiaW5hcnkgRlFDTgotICAgICAqICAgICAgICAgIG9mIGNsYXNzIHRvIHJlcGxhY2UgZm9sbG93ZWQgYnkgdGhlIG5ldyBGUUNOLgotICAgICAqIEBwYXJhbSBkZWxldGVSZXR1cm5zIExpc3Qgb2YgY2xhc3NlcyBmb3Igd2hpY2ggdGhlIG1ldGhvZHMgcmV0dXJuaW5nIHRoZW0gc2hvdWxkIGJlIGRlbGV0ZWQuCi0gICAgICogVGhlIGFycmF5IGNvbnRhaW5zIGEgbGlzdCBvZiBudWxsIHRlcm1pbmF0ZWQgc2VjdGlvbiBzdGFydGluZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjbGFzcwotICAgICAqIHRvIHJlbmFtZSBpbiB3aGljaCB0aGUgbWV0aG9kcyBhcmUgZGVsZXRlZCwgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHJldHVybiB0eXBlcyBpZGVudGlmeWluZwotICAgICAqIHRoZSBtZXRob2RzIHRvIGRlbGV0ZS4KKyAgICAgKiBAcGFyYW0gY3JlYXRlSW5mbyBDcmVhdGlvbiBwYXJhbWV0ZXJzLiBNdXN0IG5vdCBiZSBudWxsLgogICAgICAqLwotICAgIHB1YmxpYyBBc21HZW5lcmF0b3IoTG9nIGxvZywgU3RyaW5nIG9zRGVzdEphciwKLSAgICAgICAgICAgIENsYXNzPD8+W10gaW5qZWN0Q2xhc3NlcywKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0dWJNZXRob2RzLAotICAgICAgICAgICAgU3RyaW5nW10gcmVuYW1lQ2xhc3NlcywgU3RyaW5nW10gZGVsZXRlUmV0dXJucykgeworICAgIHB1YmxpYyBBc21HZW5lcmF0b3IoTG9nIGxvZywgU3RyaW5nIG9zRGVzdEphciwgSUNyZWF0ZUluZm8gY3JlYXRlSW5mbykgewogICAgICAgICBtTG9nID0gbG9nOwogICAgICAgICBtT3NEZXN0SmFyID0gb3NEZXN0SmFyOwotICAgICAgICBtSW5qZWN0Q2xhc3NlcyA9IGluamVjdENsYXNzZXMgIT0gbnVsbCA/IGluamVjdENsYXNzZXMgOiBuZXcgQ2xhc3M8Pz5bMF07Ci0gICAgICAgIG1TdHViTWV0aG9kcyA9IHN0dWJNZXRob2RzICE9IG51bGwgPyBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3Qoc3R1Yk1ldGhvZHMpKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIG1JbmplY3RDbGFzc2VzID0gY3JlYXRlSW5mby5nZXRJbmplY3RlZENsYXNzZXMoKTsKKyAgICAgICAgbVN0dWJNZXRob2RzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KGNyZWF0ZUluZm8uZ2V0T3ZlcnJpZGRlbk1ldGhvZHMoKSkpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgbWFwL3NldCBvZiBtZXRob2RzIHRvIGNoYW5nZSB0byBkZWxlZ2F0ZXMKKyAgICAgICAgbURlbGVnYXRlTWV0aG9kcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHNpZ25hdHVyZSA6IGNyZWF0ZUluZm8uZ2V0RGVsZWdhdGVNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIGludCBwb3MgPSBzaWduYXR1cmUuaW5kZXhPZignIycpOworICAgICAgICAgICAgaWYgKHBvcyA8PSAwIHx8IHBvcyA+PSBzaWduYXR1cmUubGVuZ3RoKCkgLSAxKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYmluYXJ5VG9JbnRlcm5hbENsYXNzTmFtZShzaWduYXR1cmUuc3Vic3RyaW5nKDAsIHBvcykpOworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBzaWduYXR1cmUuc3Vic3RyaW5nKHBvcyArIDEpOworICAgICAgICAgICAgU2V0PFN0cmluZz4gbWV0aG9kcyA9IG1EZWxlZ2F0ZU1ldGhvZHMuZ2V0KGNsYXNzTmFtZSk7CisgICAgICAgICAgICBpZiAobWV0aG9kcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWV0aG9kcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGVNZXRob2RzLnB1dChjbGFzc05hbWUsIG1ldGhvZHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWV0aG9kcy5hZGQobWV0aG9kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogY3JlYXRlSW5mby5nZXREZWxlZ2F0ZUNsYXNzTmF0aXZlcygpKSB7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBtZXRob2RzID0gbURlbGVnYXRlTWV0aG9kcy5nZXQoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGlmIChtZXRob2RzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZXRob2RzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZU1ldGhvZHMucHV0KGNsYXNzTmFtZSwgbWV0aG9kcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXRob2RzLmFkZChEZWxlZ2F0ZUNsYXNzQWRhcHRlci5BTExfTkFUSVZFUyk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBDcmVhdGUgdGhlIG1hcCBvZiBjbGFzc2VzIHRvIHJlbmFtZS4KICAgICAgICAgbVJlbmFtZUNsYXNzZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgICAgbUNsYXNzZXNOb3RSZW5hbWVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBpbnQgbiA9IHJlbmFtZUNsYXNzZXMgPT0gbnVsbCA/IDAgOiByZW5hbWVDbGFzc2VzLmxlbmd0aDsKKyAgICAgICAgU3RyaW5nW10gcmVuYW1lQ2xhc3NlcyA9IGNyZWF0ZUluZm8uZ2V0UmVuYW1lZENsYXNzZXMoKTsKKyAgICAgICAgaW50IG4gPSByZW5hbWVDbGFzc2VzLmxlbmd0aDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpICs9IDIpIHsKICAgICAgICAgICAgIGFzc2VydCBpICsgMSA8IG47CiAgICAgICAgICAgICAvLyBUaGUgQVNNIGNsYXNzIG5hbWVzIHVzZXMgIi8iIHNlcGFyYXRvcnMsIHdoZXJlYXMgcmVndWxhciBGUUNOIHVzZSAiLiIKQEAgLTEwMCwzOCArMTE3LDM3IEBACiAgICAgICAgICAgICBtUmVuYW1lQ2xhc3Nlcy5wdXQob2xkRnFjbiwgbmV3RnFjbik7CiAgICAgICAgICAgICBtQ2xhc3Nlc05vdFJlbmFtZWQuYWRkKG9sZEZxY24pOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgbWFwIG9mIHJlbmFtZWQgY2xhc3MgLT4gcmV0dXJuIHR5cGUgb2YgbWV0aG9kIHRvIGRlbGV0ZS4KICAgICAgICAgbURlbGV0ZVJldHVybnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PigpOwotICAgICAgICBpZiAoZGVsZXRlUmV0dXJucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiByZXR1cm5UeXBlcyA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuYW1lZENsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGRlbGV0ZVJldHVybnMpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSByZWFjaCB0aGUgZW5kIG9mIGEgc2VjdGlvbiwgYWRkIGl0IHRvIHRoZSBtYWluIG1hcAotICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGV0ZVJldHVybnMucHV0KHJlbmFtZWRDbGFzcywgcmV0dXJuVHlwZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZW5hbWVkQ2xhc3MgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgU3RyaW5nW10gZGVsZXRlUmV0dXJucyA9IGNyZWF0ZUluZm8uZ2V0RGVsZXRlUmV0dXJucygpOworICAgICAgICBTZXQ8U3RyaW5nPiByZXR1cm5UeXBlcyA9IG51bGw7CisgICAgICAgIFN0cmluZyByZW5hbWVkQ2xhc3MgPSBudWxsOworICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBkZWxldGVSZXR1cm5zKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSByZWFjaCB0aGUgZW5kIG9mIGEgc2VjdGlvbiwgYWRkIGl0IHRvIHRoZSBtYWluIG1hcAorICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURlbGV0ZVJldHVybnMucHV0KHJlbmFtZWRDbGFzcywgcmV0dXJuVHlwZXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVuYW1lZCBjbGFzcyBpcyBudWxsLCB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZWN0aW9uCi0gICAgICAgICAgICAgICAgaWYgKHJlbmFtZWRDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmFtZWRDbGFzcyA9IGJpbmFyeVRvSW50ZXJuYWxDbGFzc05hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIC8vIGp1c3QgYSBzdGFuZGFyZCByZXR1cm4gdHlwZSwgd2UgYWRkIGl0IHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm5UeXBlcy5hZGQoYmluYXJ5VG9JbnRlcm5hbENsYXNzTmFtZShjbGFzc05hbWUpKTsKKworICAgICAgICAgICAgICAgIHJlbmFtZWRDbGFzcyA9IG51bGw7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSByZW5hbWVkIGNsYXNzIGlzIG51bGwsIHRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiBhIHNlY3Rpb24KKyAgICAgICAgICAgIGlmIChyZW5hbWVkQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlbmFtZWRDbGFzcyA9IGJpbmFyeVRvSW50ZXJuYWxDbGFzc05hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8ganVzdCBhIHN0YW5kYXJkIHJldHVybiB0eXBlLCB3ZSBhZGQgaXQgdG8gdGhlIGxpc3QuCisgICAgICAgICAgICBpZiAocmV0dXJuVHlwZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVyblR5cGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuVHlwZXMuYWRkKGJpbmFyeVRvSW50ZXJuYWxDbGFzc05hbWUoY2xhc3NOYW1lKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNsYXNzZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlbmFtZWQgeWV0LgogICAgICAqIDxwLz4KQEAgLTE2MywxMiArMTc5LDEyIEBACiAgICAgcHVibGljIHZvaWQgc2V0RGVwcyhNYXA8U3RyaW5nLCBDbGFzc1JlYWRlcj4gZGVwcykgewogICAgICAgICBtRGVwcyA9IGRlcHM7CiAgICAgfQotICAgIAorCiAgICAgLyoqIEdldHMgdGhlIG1hcCBvZiBjbGFzc2VzIHRvIG91dHB1dCBhcy1pcywgZXhjZXB0IGlmIHRoZXkgaGF2ZSBuYXRpdmUgbWV0aG9kcyAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDbGFzc1JlYWRlcj4gZ2V0S2VlcCgpIHsKICAgICAgICAgcmV0dXJuIG1LZWVwOwogICAgIH0KLSAgICAKKwogICAgIC8qKiBHZXRzIHRoZSBtYXAgb2YgZGVwZW5kZW5jaWVzIHRoYXQgbXVzdCBiZSBjb21wbGV0ZWx5IHN0dWJiZWQgKi8KICAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3NSZWFkZXI+IGdldERlcHMoKSB7CiAgICAgICAgIHJldHVybiBtRGVwczsKQEAgLTE3Nyw3ICsxOTMsNyBAQAogICAgIC8qKiBHZW5lcmF0ZXMgdGhlIGZpbmFsIEpBUiAqLwogICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBUcmVlTWFwPFN0cmluZywgYnl0ZVtdPiBhbGwgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIGJ5dGVbXT4oKTsKLSAgICAgICAgCisKICAgICAgICAgZm9yIChDbGFzczw/PiBjbGF6eiA6IG1JbmplY3RDbGFzc2VzKSB7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNsYXNzVG9FbnRyeVBhdGgoY2xhenopOwogICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKG5hbWUpOwpAQCAtMTg2LDcgKzIwMiw3IEBACiAgICAgICAgICAgICBuYW1lID0gY2xhc3NOYW1lVG9FbnRyeVBhdGgodHJhbnNmb3JtTmFtZShjci5nZXRDbGFzc05hbWUoKSkpOwogICAgICAgICAgICAgYWxsLnB1dChuYW1lLCBiKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgQ2xhc3NSZWFkZXI+IGVudHJ5IDogbURlcHMuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBlbnRyeS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgYnl0ZVtdIGIgPSB0cmFuc2Zvcm0oY3IsIHRydWUgLyogc3R1Yk5hdGl2ZXNPbmx5ICovKTsKQEAgLTIxMSw4ICsyMjcsOCBAQAogCiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBKQVIgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0U3RyZWFtIFRoZSBmaWxlIG91dHB1dCBzdHJlYW0gd2VyZSB0byB3cml0ZSB0aGUgSkFSLiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRTdHJlYW0gVGhlIGZpbGUgb3V0cHV0IHN0cmVhbSB3ZXJlIHRvIHdyaXRlIHRoZSBKQVIuCiAgICAgICogQHBhcmFtIGFsbCBUaGUgbWFwIG9mIGFsbCBjbGFzc2VzIHRvIG91dHB1dC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBoYXMgb2NjdXJyZWQKICAgICAgKi8KQEAgLTIzNiw3ICsyNTIsNyBAQAogICAgIFN0cmluZyBjbGFzc05hbWVUb0VudHJ5UGF0aChTdHJpbmcgY2xhc3NOYW1lKSB7CiAgICAgICAgIHJldHVybiBjbGFzc05hbWUucmVwbGFjZUFsbCgiXFwuIiwgIi8iKS5jb25jYXQoIi5jbGFzcyIpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgSkFSIGVudHJ5IHBhdGggZnJvbSBhIENsYXNzIG5hbWUuCiAgICAgICogZS5nLiBpdCByZXR1cm5zIHNvbWV0aW5nIGxpa2UgImNvbS9mb28vT3V0ZXJDbGFzcyRJbm5lckNsYXNzMSRJbm5lckNsYXNzMi5jbGFzcyIKQEAgLTI0OCwzMCArMjY0LDMyIEBACiAgICAgICAgICAgICBuYW1lID0gIiQiICsgY2xhenouZ2V0U2ltcGxlTmFtZSgpICsgbmFtZTsKICAgICAgICAgICAgIGNsYXp6ID0gcGFyZW50OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWVUb0VudHJ5UGF0aChjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkgKyBuYW1lKTsgICAgICAgIAorICAgICAgICByZXR1cm4gY2xhc3NOYW1lVG9FbnRyeVBhdGgoY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpICsgbmFtZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVHJhbnNmb3JtcyBhIGNsYXNzLgogICAgICAqIDxwLz4KICAgICAgKiBUaGVyZSBhcmUgMyBraW5kIG9mIHRyYW5zZm9ybWF0aW9uczoKLSAgICAgKiAKKyAgICAgKgogICAgICAqIDEtIEZvciAibW9jayIgZGVwZW5kZW5jaWVzIGNsYXNzZXMsIHdlIHdhbnQgdG8gcmVtb3ZlIGFsbCBjb2RlIGZyb20gbWV0aG9kcyBhbmQgcmVwbGFjZQogICAgICAqIGJ5IGEgc3R1Yi4gTmF0aXZlIG1ldGhvZHMgbXVzdCBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoaXMgc3R1YiB0b28uIEFic3RyYWN0IG1ldGhvZHMgYXJlCiAgICAgICogbGVmdCBpbnRhY3QuIE1vZGlmaWVkIGNsYXNzZXMgbXVzdCBiZSBvdmVycmlkYWJsZSAobm9uLXByaXZhdGUsIG5vbi1maW5hbCkuCiAgICAgICogTmF0aXZlIG1ldGhvZHMgbXVzdCBiZSBtYWRlIG5vbi1maW5hbCwgbm9uLXByaXZhdGUuCi0gICAgICogCisgICAgICoKICAgICAgKiAyLSBGb3IgImtlZXAiIGNsYXNzZXMsIHdlIHdhbnQgdG8gcmV3cml0ZSBhbGwgbmF0aXZlIG1ldGhvZHMgYXMgaW5kaWNhdGVkIGFib3ZlLgogICAgICAqIElmIGEgY2xhc3MgaGFzIG5hdGl2ZSBtZXRob2RzLCBpdCBtdXN0IGFsc28gYmUgbWFkZSBub24tcHJpdmF0ZSwgbm9uLWZpbmFsLgotICAgICAqIAorICAgICAqCiAgICAgICogTm90ZSB0aGF0IHVuZm9ydHVuYXRlbHkgc3RhdGljIG1ldGhvZHMgY2Fubm90IGJlIGNoYW5nZWQgdG8gbm9uLXN0YXRpYyAoc2luY2Ugc3RhdGljIGFuZAogICAgICAqIG5vbi1zdGF0aWMgYXJlIGludm9rZWQgZGlmZmVyZW50bHkuKQogICAgICAqLwogICAgIGJ5dGVbXSB0cmFuc2Zvcm0oQ2xhc3NSZWFkZXIgY3IsIGJvb2xlYW4gc3R1Yk5hdGl2ZXNPbmx5KSB7CiAKICAgICAgICAgYm9vbGVhbiBoYXNOYXRpdmVNZXRob2RzID0gaGFzTmF0aXZlTWV0aG9kcyhjcik7CisKKyAgICAgICAgLy8gR2V0IHRoZSBjbGFzcyBuYW1lLCBhcyBhbiBpbnRlcm5hbCBuYW1lIChlLmcuIGNvbS9hbmRyb2lkL1NvbWVDbGFzcyRJbm5lckNsYXNzKQogICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY3IuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIAorCiAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gdHJhbnNmb3JtTmFtZShjbGFzc05hbWUpOwogICAgICAgICAvLyB0cmFuc2Zvcm1OYW1lIHJldHVybnMgaXRzIGlucHV0IGFyZ3VtZW50IGlmIHRoZXJlJ3Mgbm8gbmVlZCB0byByZW5hbWUgdGhlIGNsYXNzCiAgICAgICAgIGlmIChuZXdOYW1lICE9IGNsYXNzTmFtZSkgewpAQCAtMjg4LDEzICszMDYsMjQgQEAKICAgICAgICAgLy8gUmV3cml0ZSB0aGUgbmV3IGNsYXNzIGZyb20gc2NyYXRjaCwgd2l0aG91dCByZXVzaW5nIHRoZSBjb25zdGFudCBwb29sIGZyb20gdGhlCiAgICAgICAgIC8vIG9yaWdpbmFsIGNsYXNzIHJlYWRlci4KICAgICAgICAgQ2xhc3NXcml0ZXIgY3cgPSBuZXcgQ2xhc3NXcml0ZXIoQ2xhc3NXcml0ZXIuQ09NUFVURV9NQVhTKTsKLSAgICAgICAgCisKICAgICAgICAgQ2xhc3NWaXNpdG9yIHJ2ID0gY3c7CiAgICAgICAgIGlmIChuZXdOYW1lICE9IGNsYXNzTmFtZSkgewogICAgICAgICAgICAgcnYgPSBuZXcgUmVuYW1lQ2xhc3NBZGFwdGVyKGN3LCBjbGFzc05hbWUsIG5ld05hbWUpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBUcmFuc2Zvcm1DbGFzc0FkYXB0ZXIgY3YgPSBuZXcgVHJhbnNmb3JtQ2xhc3NBZGFwdGVyKG1Mb2csIG1TdHViTWV0aG9kcywgCisKKyAgICAgICAgU2V0PFN0cmluZz4gZGVsZWdhdGVNZXRob2RzID0gbURlbGVnYXRlTWV0aG9kcy5nZXQoY2xhc3NOYW1lKTsKKyAgICAgICAgaWYgKGRlbGVnYXRlTWV0aG9kcyAhPSBudWxsICYmICFkZWxlZ2F0ZU1ldGhvZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBJZiBkZWxlZ2F0ZU1ldGhvZHMgb25seSBjb250YWlucyBvbmUgZW50cnkgQUxMX05BVElWRVMgYW5kIHRoZSBjbGFzcyBpcworICAgICAgICAgICAgLy8ga25vd24gdG8gaGF2ZSBubyBuYXRpdmUgbWV0aG9kcywganVzdCBza2lwIHRoaXMgc3RlcC4KKyAgICAgICAgICAgIGlmIChoYXNOYXRpdmVNZXRob2RzIHx8CisgICAgICAgICAgICAgICAgICAgICEoZGVsZWdhdGVNZXRob2RzLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVNZXRob2RzLmNvbnRhaW5zKERlbGVnYXRlQ2xhc3NBZGFwdGVyLkFMTF9OQVRJVkVTKSkpIHsKKyAgICAgICAgICAgICAgICBydiA9IG5ldyBEZWxlZ2F0ZUNsYXNzQWRhcHRlcihtTG9nLCBydiwgY2xhc3NOYW1lLCBkZWxlZ2F0ZU1ldGhvZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVHJhbnNmb3JtQ2xhc3NBZGFwdGVyIGN2ID0gbmV3IFRyYW5zZm9ybUNsYXNzQWRhcHRlcihtTG9nLCBtU3R1Yk1ldGhvZHMsCiAgICAgICAgICAgICAgICAgbURlbGV0ZVJldHVybnMuZ2V0KGNsYXNzTmFtZSksCiAgICAgICAgICAgICAgICAgbmV3TmFtZSwgcnYsCiAgICAgICAgICAgICAgICAgc3R1Yk5hdGl2ZXNPbmx5LCBzdHViTmF0aXZlc09ubHkgfHwgaGFzTmF0aXZlTWV0aG9kcyk7CkBAIC0zMjMsNyArMzUyLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3TmFtZSArIGNsYXNzTmFtZS5zdWJzdHJpbmcocG9zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9DcmVhdGVJbmZvLmphdmEgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0NyZWF0ZUluZm8uamF2YQppbmRleCAyZWQ4NjQxLi45Mjg5Mjc4NCAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9DcmVhdGVJbmZvLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9DcmVhdGVJbmZvLmphdmEKQEAgLTE2LDExICsxNiw3MCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnRvb2xzLmxheW91dGxpYi5jcmVhdGU7CiAKLXB1YmxpYyBjbGFzcyBDcmVhdGVJbmZvIHsKKy8qKgorICogRGVzY3JpYmVzIHRoZSB3b3JrIHRvIGJlIGRvbmUgYnkge0BsaW5rIEFzbUdlbmVyYXRvcn0uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDcmVhdGVJbmZvIGltcGxlbWVudHMgSUNyZWF0ZUluZm8geworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjbGFzcyBmcm9tIGxheW91dGxpYl9jcmVhdGUgdG8gaW5qZWN0IGluIGxheW91dGxpYi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+W10gZ2V0SW5qZWN0ZWRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gSU5KRUNURURfQ0xBU1NFUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG1ldGhvZHMgdG8gcmV3cml0ZSBhcyBkZWxlZ2F0ZXMuCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWxlZ2F0ZU1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBERUxFR0FURV9NRVRIT0RTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2xhc3NlcyBvbiB3aGljaCB0byBkZWxlZ2F0ZSBhbGwgbmF0aXZlIG1ldGhvZHMuCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWxlZ2F0ZUNsYXNzTmF0aXZlcygpIHsKKyAgICAgICAgcmV0dXJuIERFTEVHQVRFX0NMQVNTX05BVElWRVM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIHN0dWIgb3V0LiBFYWNoIGVudHJ5IG11c3QgYmUgaW4gdGhlIGZvcm0KKyAgICAgKiAicGFja2FnZS5wYWNrYWdlLk91dGVyQ2xhc3MkSW5uZXJDbGFzcyNNZXRob2ROYW1lIi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldE92ZXJyaWRkZW5NZXRob2RzKCkgeworICAgICAgICByZXR1cm4gT1ZFUlJJRERFTl9NRVRIT0RTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2xhc3NlcyB0byByZW5hbWUsIG11c3QgYmUgYW4gZXZlbiBsaXN0OiB0aGUgYmluYXJ5IEZRQ04KKyAgICAgKiBvZiBjbGFzcyB0byByZXBsYWNlIGZvbGxvd2VkIGJ5IHRoZSBuZXcgRlFDTi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlbmFtZWRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gUkVOQU1FRF9DTEFTU0VTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2xhc3NlcyBmb3Igd2hpY2ggdGhlIG1ldGhvZHMgcmV0dXJuaW5nIHRoZW0gc2hvdWxkIGJlIGRlbGV0ZWQuCisgICAgICogVGhlIGFycmF5IGNvbnRhaW5zIGEgbGlzdCBvZiBudWxsIHRlcm1pbmF0ZWQgc2VjdGlvbiBzdGFydGluZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqIHRvIHJlbmFtZSBpbiB3aGljaCB0aGUgbWV0aG9kcyBhcmUgZGVsZXRlZCwgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHJldHVybiB0eXBlcyBpZGVudGlmeWluZworICAgICAqIHRoZSBtZXRob2RzIHRvIGRlbGV0ZS4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERlbGV0ZVJldHVybnMoKSB7CisgICAgICAgIHJldHVybiBERUxFVEVfUkVUVVJOUzsKKyAgICB9CisKKyAgICAvLy0tLS0tCisKICAgICAvKioKICAgICAgKiBUaGUgbGlzdCBvZiBjbGFzcyBmcm9tIGxheW91dGxpYl9jcmVhdGUgdG8gaW5qZWN0IGluIGxheW91dGxpYi4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENsYXNzPD8+W10gSU5KRUNURURfQ0xBU1NFUyA9IG5ldyBDbGFzczw/PltdIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIElOSkVDVEVEX0NMQVNTRVMgPSBuZXcgQ2xhc3M8Pz5bXSB7CiAgICAgICAgICAgICBPdmVycmlkZU1ldGhvZC5jbGFzcywKICAgICAgICAgICAgIE1ldGhvZExpc3RlbmVyLmNsYXNzLAogICAgICAgICAgICAgTWV0aG9kQWRhcHRlci5jbGFzcywKQEAgLTI4LDE5ICs4NywzNyBAQAogICAgICAgICB9OwogCiAgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgbWV0aG9kcyB0byByZXdyaXRlIGFzIGRlbGVnYXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBERUxFR0FURV9NRVRIT0RTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgLy8gVE9ETzogY29tbWVudCBvdXQgb25jZSBEZWxlZ2F0ZUNsYXNzIGlzIHdvcmtpbmcKKyAgICAgICAgLy8gImFuZHJvaWQudmlldy5WaWV3I2lzSW5FZGl0TW9kZSIsCisgICAgICAgIC8vICJhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyRUaGVtZSNvYnRhaW5TdHlsZWRBdHRyaWJ1dGVzIiwKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgY2xhc3NlcyBvbiB3aGljaCB0byBkZWxlZ2F0ZSBhbGwgbmF0aXZlIG1ldGhvZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gREVMRUdBVEVfQ0xBU1NfTkFUSVZFUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIC8vIFRPRE86IGNvbW1lbnQgb3V0IG9uY2UgRGVsZWdhdGVDbGFzcyBpcyB3b3JraW5nCisgICAgICAgIC8vICJhbmRyb2lkLmdyYXBoaWNzLlBhaW50IgorICAgIH07CisKKyAgICAvKioKICAgICAgKiBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIHN0dWIgb3V0LiBFYWNoIGVudHJ5IG11c3QgYmUgaW4gdGhlIGZvcm0KICAgICAgKiAgInBhY2thZ2UucGFja2FnZS5PdXRlckNsYXNzJElubmVyQ2xhc3MjTWV0aG9kTmFtZSIuCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBPVkVSUklEREVOX01FVEhPRFMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgImFuZHJvaWQudmlldy5WaWV3I2lzSW5FZGl0TW9kZSIsCi0gICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMkVGhlbWUjb2J0YWluU3R5bGVkQXR0cmlidXRlcyIsCi0gICAgICAgIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gT1ZFUlJJRERFTl9NRVRIT0RTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIG9uY2UgRGVsZWdhdGVDbGFzcyBpcyB3b3JraW5nCisgICAgICAgICJhbmRyb2lkLnZpZXcuVmlldyNpc0luRWRpdE1vZGUiLAorICAgICAgICAiYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMkVGhlbWUjb2J0YWluU3R5bGVkQXR0cmlidXRlcyIsCisgICAgfTsKIAogICAgIC8qKgogICAgICAqICBUaGUgbGlzdCBvZiBjbGFzc2VzIHRvIHJlbmFtZSwgbXVzdCBiZSBhbiBldmVuIGxpc3Q6IHRoZSBiaW5hcnkgRlFDTgogICAgICAqICBvZiBjbGFzcyB0byByZXBsYWNlIGZvbGxvd2VkIGJ5IHRoZSBuZXcgRlFDTi4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIFJFTkFNRURfQ0xBU1NFUyA9CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUkVOQU1FRF9DTEFTU0VTID0KICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCIsICAgICAgICAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5fT3JpZ2luYWxfQml0bWFwIiwKICAgICAgICAgICAgICJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3RvcnkiLCAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5fT3JpZ2luYWxfQml0bWFwRmFjdG9yeSIsCkBAIC02OSw3ICsxNDYsNyBAQAogICAgICAqIHRvIHJlbmFtZSBpbiB3aGljaCB0aGUgbWV0aG9kcyBhcmUgZGVsZXRlZCwgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHJldHVybiB0eXBlcyBpZGVudGlmeWluZwogICAgICAqIHRoZSBtZXRob2RzIHRvIGRlbGV0ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIFJFTU9WRURfTUVUSE9EUyA9CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gREVMRVRFX1JFVFVSTlMgPQogICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiLCAgICAgICAvLyBjbGFzcyB0byBkZWxldGUgbWV0aG9kcyBmcm9tCiAgICAgICAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5QYWludCRBbGlnbiIsIC8vIGxpc3Qgb2YgdHlwZSBpZGVudGlmeWluZyBtZXRob2RzIHRvIGRlbGV0ZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9EZWxlZ2F0ZUNsYXNzQWRhcHRlci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9EZWxlZ2F0ZUNsYXNzQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmE4YTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0RlbGVnYXRlQ2xhc3NBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZTsKKworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzQWRhcHRlcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3I7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHtAbGluayBEZWxlZ2F0ZUNsYXNzQWRhcHRlcn0gY2FuIHRyYW5zZm9ybSBzb21lIG1ldGhvZHMgZnJvbSBhIGNsYXNzIGludG8KKyAqIGRlbGVnYXRlcyB0aGF0IGRlZmVyIHRoZSBjYWxsIHRvIGFuIGFzc29jaWF0ZWQgZGVsZWdhdGUgY2xhc3MuCisgKiA8cC8+CisgKiBUaGlzIGlzIHVzZWQgdG8gb3ZlcnJpZGUgc3BlY2lmaWMgbWV0aG9kcyBhbmQgb3IgYWxsIG5hdGl2ZSBtZXRob2RzIGluIGNsYXNzZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0ZUNsYXNzQWRhcHRlciBleHRlbmRzIENsYXNzQWRhcHRlciB7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTExfTkFUSVZFUyA9ICI8PGFsbF9uYXRpdmVzPj4iOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1EZWxlZ2F0ZU1ldGhvZHM7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2cgbUxvZzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERlbGVnYXRlQ2xhc3NBZGFwdGVyfSB0aGF0IGNhbiB0cmFuc2Zvcm0gc29tZSBtZXRob2RzCisgICAgICogZnJvbSBhIGNsYXNzIGludG8gZGVsZWdhdGVzIHRoYXQgZGVmZXIgdGhlIGNhbGwgdG8gYW4gYXNzb2NpYXRlZCBkZWxlZ2F0ZSBjbGFzcy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBpcyB1c2VkIHRvIG92ZXJyaWRlIHNwZWNpZmljIG1ldGhvZHMgYW5kIG9yIGFsbCBuYXRpdmUgbWV0aG9kcyBpbiBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGxvZyBUaGUgbG9nZ2VyIG9iamVjdC4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gY3YgdGhlIGNsYXNzIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyBhZGFwdGVyIG11c3QgZGVsZWdhdGUgY2FsbHMuCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgaW50ZXJuYWwgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgdG8gdmlzaXQsCisgICAgICogICAgICAgICAgZS5nLiA8Y29kZT5jb20vYW5kcm9pZC9Tb21lQ2xhc3MkSW5uZXJDbGFzczwvY29kZT4uCisgICAgICogQHBhcmFtIGRlbGVnYXRlTWV0aG9kcyBUaGUgc2V0IG9mIG1ldGhvZCBuYW1lcyB0byBtb2RpZnkgYW5kL29yIHRoZQorICAgICAqICAgICAgICAgIHNwZWNpYWwgY29uc3RhbnQge0BsaW5rICNBTExfTkFUSVZFU30gdG8gY29udmVydCBhbGwgbmF0aXZlIG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRlQ2xhc3NBZGFwdGVyKExvZyBsb2csCisgICAgICAgICAgICBDbGFzc1Zpc2l0b3IgY3YsCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLAorICAgICAgICAgICAgU2V0PFN0cmluZz4gZGVsZWdhdGVNZXRob2RzKSB7CisgICAgICAgIHN1cGVyKGN2KTsKKyAgICAgICAgbUxvZyA9IGxvZzsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgICAgbURlbGVnYXRlTWV0aG9kcyA9IGRlbGVnYXRlTWV0aG9kczsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBNZXRob2RzIGZyb20gdGhlIENsYXNzQWRhcHRlcgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGhvZFZpc2l0b3IgdmlzaXRNZXRob2QoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLAorICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSwgU3RyaW5nW10gZXhjZXB0aW9ucykgeworCisgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1RBVElDKSAhPSAwOworICAgICAgICBib29sZWFuIGlzTmF0aXZlID0gKGFjY2VzcyAmIE9wY29kZXMuQUNDX05BVElWRSkgIT0gMDsKKworICAgICAgICBib29sZWFuIHVzZURlbGVnYXRlID0gKGlzTmF0aXZlICYmIG1EZWxlZ2F0ZU1ldGhvZHMuY29udGFpbnMoQUxMX05BVElWRVMpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlbGVnYXRlTWV0aG9kcy5jb250YWlucyhuYW1lKTsKKworICAgICAgICBpZiAodXNlRGVsZWdhdGUpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBuYXRpdmUKKyAgICAgICAgICAgIGFjY2VzcyA9IGFjY2VzcyAmIH5PcGNvZGVzLkFDQ19OQVRJVkU7CisgICAgICAgIH0KKworICAgICAgICBNZXRob2RWaXNpdG9yIG13ID0gc3VwZXIudmlzaXRNZXRob2QoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOworICAgICAgICBpZiAodXNlRGVsZWdhdGUpIHsKKyAgICAgICAgICAgIERlbGVnYXRlTWV0aG9kQWRhcHRlciBhID0gbmV3IERlbGVnYXRlTWV0aG9kQWRhcHRlcihtTG9nLCBtdywgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkZXNjLCBpc1N0YXRpYyk7CisgICAgICAgICAgICBpZiAoaXNOYXRpdmUpIHsKKyAgICAgICAgICAgICAgICAvLyBBIG5hdGl2ZSBoYXMgbm8gY29kZSB0byB2aXNpdCwgc28gd2UgbmVlZCB0byBnZW5lcmF0ZSBpdCBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICBhLmdlbmVyYXRlQ29kZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbXc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9EZWxlZ2F0ZU1ldGhvZEFkYXB0ZXIuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvRGVsZWdhdGVNZXRob2RBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNjY4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvRGVsZWdhdGVNZXRob2RBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRvb2xzLmxheW91dGxpYi5jcmVhdGU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuYW5ub3RhdGlvbnMuTGF5b3V0bGliRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5Bbm5vdGF0aW9uVmlzaXRvcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NSZWFkZXI7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5UeXBlOworCisvKioKKyAqIFRoaXMgbWV0aG9kIGFkYXB0ZXIgcmV3cml0ZXMgYSBtZXRob2QgYnkgZGlzY2FyZGluZyB0aGUgb3JpZ2luYWwgY29kZSBhbmQgZ2VuZXJhdGluZworICogYSBjYWxsIHRvIGEgZGVsZWdhdGUuIE9yaWdpbmFsIGFubm90YXRpb25zIGFyZSBwYXNzZWQgYWxvbmcgdW5jaGFuZ2VkLgorICogPHAvPgorICogQ2FsbHMgYXJlIGRlbGVnYXRlZCB0byBhIGNsYXNzIG5hbWVkIDxjb2RlPiZsdDtjbGFzc05hbWUmZ3Q7X0RlbGVnYXRlPC9jb2RlPiB3aXRoCisgKiBzdGF0aWMgbWV0aG9kcyBtYXRjaGluZyB0aGUgbWV0aG9kcyB0byBiZSBvdmVycmlkZGVuIGhlcmUuIFRoZSBtZXRob2RzIGhhdmUgdGhlCisgKiBzYW1lIHJldHVybiB0eXBlLiBUaGUgYXJndW1lbnQgdHlwZSBsaXN0IGlzIHRoZSBzYW1lIGV4Y2VwdCB0aGUgInRoaXMiIHJlZmVyZW5jZSBpcworICogcGFzc2VkIGZpcnN0IGZvciBub24tc3RhdGljIG1ldGhvZHMuCisgKiA8cC8+CisgKiBBIG5ldyBhbm5vdGF0aW9uIGlzIGFkZGVkLgorICogPHAvPgorICogTm90ZSB0aGF0IG5hdGl2ZSBtZXRob2RzIGhhdmUsIGJ5IGRlZmluaXRpb24sIG5vIGNvZGUgc28gdGhlcmUncyBub3RoaW5nIGEgdmlzaXRvcgorICogY2FuIHZpc2l0LiBUaGF0IG1lYW5zIHRoZSBjYWxsZXIgbXVzdCBjYWxsIHtAbGluayAjZ2VuZXJhdGVDb2RlKCl9IGRpcmVjdGx5IGZvcgorICogYSBuYXRpdmUgYW5kIHVzZSB0aGUgdmlzaXRvciBwYXR0ZXJuIGZvciBub24tbmF0aXZlcy4KKyAqIDxwLz4KKyAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBub3QgcmUtdXNhYmxlLiBZb3UgbmVlZCBhIG5ldyBpbnN0YW5jZSBmb3IgZWFjaCBtZXRob2QuCisgKi8KK2NsYXNzIERlbGVnYXRlTWV0aG9kQWRhcHRlciBpbXBsZW1lbnRzIE1ldGhvZFZpc2l0b3IgeworCisgICAgLyoqCisgICAgICogU3VmZml4IGFkZGVkIHRvIGRlbGVnYXRlIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRUdBVEVfU1VGRklYID0gIl9EZWxlZ2F0ZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ09OU1RSVUNUT1IgPSAiPGluaXQ+IjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0xBU1NfSU5JVCA9ICI8Y2xpbml0PiI7CisKKyAgICAvKiogVGhlIHBhcmVudCBtZXRob2Qgd3JpdGVyICovCisgICAgcHJpdmF0ZSBNZXRob2RWaXNpdG9yIG1QYXJlbnRWaXNpdG9yOworICAgIC8qKiBGbGFnIHRvIG91dHB1dCB0aGUgZmlyc3QgbGluZSBudW1iZXIuICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1PdXRwdXRGaXJzdExpbmVOdW1iZXIgPSB0cnVlOworICAgIC8qKiBUaGUgb3JpZ2luYWwgbWV0aG9kIGRlc2NyaXB0b3IgKHJldHVybiB0eXBlICsgYXJndW1lbnQgdHlwZXMuKSAqLworICAgIHByaXZhdGUgU3RyaW5nIG1EZXNjOworICAgIC8qKiBUcnVlIGlmIHRoZSBvcmlnaW5hbCBtZXRob2QgaXMgc3RhdGljLiAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNTdGF0aWM7CisgICAgLyoqIFRoZSBpbnRlcm5hbCBjbGFzcyBuYW1lIChlLmcuIDxjb2RlPmNvbS9hbmRyb2lkL1NvbWVDbGFzcyRJbm5lckNsYXNzPC9jb2RlPi4pICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICAvKiogVGhlIG1ldGhvZCBuYW1lLiAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NZXRob2ROYW1lOworICAgIC8qKiBMb2dnZXIgb2JqZWN0LiAqLworICAgIHByaXZhdGUgZmluYWwgTG9nIG1Mb2c7CisgICAgLyoqIFRydWUgaWYge0BsaW5rICN2aXNpdENvZGUoKX0gaGFzIGJlZW4gaW52b2tlZC4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVZpc2l0Q29kZUNhbGxlZDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERlbGVnYXRlTWV0aG9kQWRhcHRlcn0gdGhhdCB3aWxsIHRyYW5zZm9ybSB0aGlzIG1ldGhvZAorICAgICAqIGludG8gYSBkZWxlZ2F0ZSBjYWxsLgorICAgICAqIDxwLz4KKyAgICAgKiBTZWUge0BsaW5rIERlbGVnYXRlTWV0aG9kQWRhcHRlcn0gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2cgVGhlIGxvZ2dlciBvYmplY3QuIE11c3Qgbm90IGJlIG51bGwuCisgICAgICogQHBhcmFtIG12IHRoZSBtZXRob2QgdmlzaXRvciB0byB3aGljaCB0aGlzIGFkYXB0ZXIgbXVzdCBkZWxlZ2F0ZSBjYWxscy4KKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBpbnRlcm5hbCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB0byB2aXNpdCwKKyAgICAgKiAgICAgICAgICBlLmcuIDxjb2RlPmNvbS9hbmRyb2lkL1NvbWVDbGFzcyRJbm5lckNsYXNzPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gZGVzYyBBIG1ldGhvZCBkZXNjcmlwdG9yIChjLmYuIHtAbGluayBUeXBlI2dldFJldHVyblR5cGUoU3RyaW5nKX0gKworICAgICAqICAgICAgICAgIHtAbGluayBUeXBlI2dldEFyZ3VtZW50VHlwZXMoU3RyaW5nKX0pCisgICAgICogQHBhcmFtIGlzU3RhdGljIFRydWUgaWYgdGhlIG1ldGhvZCBpcyBkZWNsYXJlZCBzdGF0aWMuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRlTWV0aG9kQWRhcHRlcihMb2cgbG9nLAorICAgICAgICAgICAgTWV0aG9kVmlzaXRvciBtdiwKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICAgICAgYm9vbGVhbiBpc1N0YXRpYykgeworICAgICAgICBtTG9nID0gbG9nOworICAgICAgICBtUGFyZW50VmlzaXRvciA9IG12OworICAgICAgICBtQ2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgICAgICBtTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgICAgIG1EZXNjID0gZGVzYzsKKyAgICAgICAgbUlzU3RhdGljID0gaXNTdGF0aWM7CisKKyAgICAgICAgaWYgKENPTlNUUlVDVE9SLmVxdWFscyhtZXRob2ROYW1lKSB8fCBDTEFTU19JTklULmVxdWFscyhtZXRob2ROYW1lKSkgeworICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gc2ltcGxpZnkgYnkgbm90IHN1cHBvcnRpbmcgY29uc3RydWN0b3JzLgorICAgICAgICAgICAgLy8gVGhlIG9ubHkgdHJpY2sgd2l0aCBhIGNvbnN0cnVjdG9yIGlzIHRvIGZpbmQgdGhlIHByb3BlciBzdXBlciBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgLy8gYW5kIGNhbGwgaXQgKGFuZCBkZWNpZGluZyBpZiB3ZSBzaG91bGQgbWlycm9yIHRoZSBvcmlnaW5hbCBtZXRob2QgY2FsbCB0bworICAgICAgICAgICAgLy8gYSBjdXN0b20gY29uc3RydWN0b3Igb3IgY2FsbCBhIGRlZmF1bHQgb25lLikKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRGVsZWdhdGUgZG9lc24ndCBzdXBwb3J0IG92ZXJyaWRpbmcgY29uc3RydWN0b3IgJTEkczolMiRzKCUzJHMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsIG1ldGhvZE5hbWUsIGRlc2MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgbmV3IGNvZGUgZm9yIHRoZSBtZXRob2QuCisgICAgICogPHAvPgorICAgICAqIEZvciBuYXRpdmUgbWV0aG9kcywgdGhpcyBtdXN0IGJlIGludm9rZWQgZGlyZWN0bHkgYnkge0BsaW5rIERlbGVnYXRlQ2xhc3NBZGFwdGVyfQorICAgICAqIChzaW5jZSB0aGV5IGhhdmUgbm8gY29kZSB0byB2aXNpdCkuCisgICAgICogPHAvPgorICAgICAqIE90aGVyd2lzZSBmb3Igbm9uLW5hdGl2ZSBtZXRob2RzIHRoZSB7QGxpbmsgRGVsZWdhdGVDbGFzc0FkYXB0ZXJ9IHNpbXBseSBuZWVkcyB0bworICAgICAqIHJldHVybiB0aGlzIGluc3RhbmNlIG9mIHtAbGluayBEZWxlZ2F0ZU1ldGhvZEFkYXB0ZXJ9IGFuZCBsZXQgdGhlIG5vcm1hbCB2aXNpdG9yIHBhdHRlcm4KKyAgICAgKiBpbnZva2UgaXQgYXMgcGFydCBvZiB0aGUge0BsaW5rIENsYXNzUmVhZGVyI2FjY2VwdChDbGFzc1Zpc2l0b3IsIGludCl9IHdvcmtmbG93IGFuZCB0aGVuCisgICAgICogdGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGZyb20ge0BsaW5rIE1ldGhvZFZpc2l0b3IjdmlzaXRFbmQoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKCkgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgZ29hbCBpcyB0byBnZW5lcmF0ZSBhIGNhbGwgdG8gYSBzdGF0aWMgZGVsZWdhdGUgbWV0aG9kLgorICAgICAgICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBub3Qtc3RhdGljLCB0aGUgZmlyc3QgcGFyYW1ldGVyIHdpbGwgYmUgdGhpcy4KKyAgICAgICAgICogQWxsIHRoZSBwYXJhbWV0ZXJzIG11c3QgYmUgcGFzc2VkIGFuZCB0aGVuIHRoZSBldmVudHVhbCByZXR1cm4gdHlwZSByZXR1cm5lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogRXhhbXBsZSwgbGV0J3Mgc2F5IHdlIGhhdmUgYSBtZXRob2Qgc3VjaCBhcworICAgICAgICAgKiAgIHB1YmxpYyB2b2lkIG1ldGhvZF8xKGludCBhLCBPYmplY3QgYiwgQXJyYXlMaXN0PFN0cmluZz4gYykgeyAuLi4gfQorICAgICAgICAgKgorICAgICAgICAgKiBXZSdsbCB3YW50IHRvIGNyZWF0ZSBhIGJvZHkgdGhhdCBjYWxscyBhIGRlbGVnYXRlIG1ldGhvZCBsaWtlIHRoaXM6CisgICAgICAgICAqICAgVGhlQ2xhc3NfRGVsZWdhdGUubWV0aG9kXzEodGhpcywgYSwgYiwgYyk7CisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBnZW5lcmF0ZWQgY2xhc3MgbmFtZSBpcyB0aGUgY3VycmVudCBjbGFzcyBuYW1lIHdpdGggIl9EZWxlZ2F0ZSIgYXBwZW5kZWQgdG8gaXQuCisgICAgICAgICAqIE9uZSB0aGluZyB0byByZWFsaXplIGlzIHRoYXQgd2UgZG9uJ3QgY2FyZSBhYm91dCBnZW5lcmljcyAtLSBzaW5jZSBnZW5lcmljIHR5cGVzCisgICAgICAgICAqIGFyZSBlcmFzZWQgYXQgcnVudGltZSwgdGhleSBoYXZlIG5vIGluZmx1ZW5jZSBvbiB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZC4KKyAgICAgICAgICovCisKKyAgICAgICAgLy8gQWRkIG91ciBhbm5vdGF0aW9uCisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIGF3ID0gbVBhcmVudFZpc2l0b3IudmlzaXRBbm5vdGF0aW9uKAorICAgICAgICAgICAgICAgIFR5cGUuZ2V0T2JqZWN0VHlwZShUeXBlLmdldEludGVybmFsTmFtZShMYXlvdXRsaWJEZWxlZ2F0ZS5jbGFzcykpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgdHJ1ZSk7IC8vIHZpc2libGUgYXQgcnVudGltZQorICAgICAgICBhdy52aXNpdEVuZCgpOworCisgICAgICAgIGlmICghbVZpc2l0Q29kZUNhbGxlZCkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGRpcmVjdCBjYWxsIHRvIGdlbmVyYXRlQ29kZSgpIGFzIGRvbmUgYnkgRGVsZWdhdGVDbGFzc0FkYXB0ZXIKKyAgICAgICAgICAgIC8vIGZvciBuYXRpdmVzLCB2aXNpdENvZGUoKSBoYXNuJ3QgYmVlbiBjYWxsZWQgeWV0LgorICAgICAgICAgICAgbVBhcmVudFZpc2l0b3IudmlzaXRDb2RlKCk7CisgICAgICAgICAgICBtVmlzaXRDb2RlQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBudW1WYXJzID0gMDsKKworICAgICAgICAvLyBQdXNoICJ0aGlzIiBmb3IgYW4gaW5zdGFuY2UgbWV0aG9kLCB3aGljaCBpcyBhbHdheXMgQUxPQUQgMAorICAgICAgICBpZiAoIW1Jc1N0YXRpYykgeworICAgICAgICAgICAgbVBhcmVudFZpc2l0b3IudmlzaXRWYXJJbnNuKE9wY29kZXMuQUxPQUQsIG51bVZhcnMrKyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQdXNoIGFsbCBvdGhlciBhcmd1bWVudHMKKyAgICAgICAgVHlwZVtdIGFyZ1R5cGVzID0gVHlwZS5nZXRBcmd1bWVudFR5cGVzKG1EZXNjKTsKKyAgICAgICAgZm9yIChUeXBlIHQgOiBhcmdUeXBlcykgeworICAgICAgICAgICAgaW50IHNpemUgPSB0LmdldFNpemUoKTsKKyAgICAgICAgICAgIG1QYXJlbnRWaXNpdG9yLnZpc2l0VmFySW5zbih0LmdldE9wY29kZShPcGNvZGVzLklMT0FEKSwgbnVtVmFycyk7CisgICAgICAgICAgICBudW1WYXJzICs9IHNpemU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGRlbGVnYXRlLiBGb3IgYSBzdGF0aWMgbWV0aG9kLCBpdCdzIHRoZSBzYW1lCisgICAgICAgIC8vIGhvd2V2ZXIgZm9yIGFuIGluc3RhbmNlIG1ldGhvZCB3ZSBuZWVkIHRvIHBhc3MgdGhlICd0aGlzJyByZWZlcmVuY2UgZmlyc3QKKyAgICAgICAgU3RyaW5nIGRlc2MgPSBtRGVzYzsKKyAgICAgICAgaWYgKCFtSXNTdGF0aWMgJiYgYXJnVHlwZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgVHlwZVtdIGFyZ1R5cGVzMiA9IG5ldyBUeXBlW2FyZ1R5cGVzLmxlbmd0aCArIDFdOworCisgICAgICAgICAgICBhcmdUeXBlczJbMF0gPSBUeXBlLmdldE9iamVjdFR5cGUobUNsYXNzTmFtZSk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ1R5cGVzLCAwLCBhcmdUeXBlczIsIDEsIGFyZ1R5cGVzLmxlbmd0aCk7CisKKyAgICAgICAgICAgIGRlc2MgPSBUeXBlLmdldE1ldGhvZERlc2NyaXB0b3IoVHlwZS5nZXRSZXR1cm5UeXBlKG1EZXNjKSwgYXJnVHlwZXMyKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBkZWxlZ2F0ZUNsYXNzTmFtZSA9IG1DbGFzc05hbWUgKyBERUxFR0FURV9TVUZGSVg7CisKKyAgICAgICAgLy8gSW52b2tlIHRoZSBzdGF0aWMgZGVsZWdhdGUKKyAgICAgICAgbVBhcmVudFZpc2l0b3IudmlzaXRNZXRob2RJbnNuKE9wY29kZXMuSU5WT0tFU1RBVElDLAorICAgICAgICAgICAgICAgIGRlbGVnYXRlQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIG1NZXRob2ROYW1lLAorICAgICAgICAgICAgICAgIGRlc2MpOworCisgICAgICAgIFR5cGUgcmV0dXJuVHlwZSA9IFR5cGUuZ2V0UmV0dXJuVHlwZShtRGVzYyk7CisgICAgICAgIG1QYXJlbnRWaXNpdG9yLnZpc2l0SW5zbihyZXR1cm5UeXBlLmdldE9wY29kZShPcGNvZGVzLklSRVRVUk4pKTsKKworICAgICAgICBtUGFyZW50VmlzaXRvci52aXNpdE1heHMobnVtVmFycywgbnVtVmFycyk7CisgICAgICAgIG1QYXJlbnRWaXNpdG9yLnZpc2l0RW5kKCk7CisKKyAgICAgICAgLy8gRm9yIGRlYnVnZ2luZyBub3cuIE1heWJlIHdlIHNob3VsZCBjb2xsZWN0IHRoZXNlIGFuZCBzdG9yZSB0aGVtIGluCisgICAgICAgIC8vIGEgdGV4dCBmaWxlIGZvciBoZWxwaW5nIGNyZWF0ZSB0aGUgZGVsZWdhdGVzLiBXZSBjb3VsZCBhbHNvIGNvbXBhcmUKKyAgICAgICAgLy8gdGhlIHRleHQgZmlsZSB0byBhIGdvbGRlbiBhbmQgYnJlYWsgdGhlIGJ1aWxkIG9uIHVuc3VwcG9ydGVkIGNoYW5nZXMKKyAgICAgICAgLy8gb3IgcmVncmVzc2lvbnMuIEV2ZW4gYmV0dGVyIHdlIGNvdWxkIGZhbmN5LXByaW50IHNvbWV0aGluZyB0aGF0IGxvb2tzCisgICAgICAgIC8vIGxpa2UgdGhlIGV4cGVjdGVkIEphdmEgbWV0aG9kIGRlY2xhcmF0aW9uLgorICAgICAgICBtTG9nLmRlYnVnKCJEZWxlZ2F0ZTogJTEkcyAjICUyJHMgJTMkcyIsIGRlbGVnYXRlQ2xhc3NOYW1lLCBtTWV0aG9kTmFtZSwgZGVzYyk7CisgICAgfQorCisgICAgLyogUGFzcyBkb3duIHRvIHZpc2l0b3Igd3JpdGVyLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBlaXRoZXIgZG8gbm90aGluZy4gKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvZGUoKSB7CisgICAgICAgIG1WaXNpdENvZGVDYWxsZWQgPSB0cnVlOworICAgICAgICBtUGFyZW50VmlzaXRvci52aXNpdENvZGUoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHZpc2l0TWF4cyBpcyBjYWxsZWQganVzdCBiZWZvcmUgdmlzaXRFbmQgaWYgdGhlcmUgd2FzIGFueSBjb2RlIHRvIHJld3JpdGUuCisgICAgICogU2tpcCB0aGUgb3JpZ2luYWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRNYXhzKGludCBtYXhTdGFjaywgaW50IG1heExvY2FscykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZCBvZiB2aXNpdGluZy4gR2VuZXJhdGUgdGhlIG1lc3NhZ2luZyBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBnZW5lcmF0ZUNvZGUoKTsKKyAgICB9CisKKyAgICAvKiBXcml0ZXMgYWxsIGFubm90YXRpb24gZnJvbSB0aGUgb3JpZ2luYWwgbWV0aG9kLiAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICByZXR1cm4gbVBhcmVudFZpc2l0b3IudmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgIH0KKworICAgIC8qIFdyaXRlcyBhbGwgYW5ub3RhdGlvbiBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBvcmlnaW5hbCBtZXRob2QuICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50VmlzaXRvci52aXNpdEFubm90YXRpb25EZWZhdWx0KCk7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbihpbnQgcGFyYW1ldGVyLCBTdHJpbmcgZGVzYywKKyAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICByZXR1cm4gbVBhcmVudFZpc2l0b3IudmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9uKHBhcmFtZXRlciwgZGVzYywgdmlzaWJsZSk7CisgICAgfQorCisgICAgLyogV3JpdGVzIGFsbCBhdHRyaWJ1dGVzIGZyb20gdGhlIG9yaWdpbmFsIG1ldGhvZC4gKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBtUGFyZW50VmlzaXRvci52aXNpdEF0dHJpYnV0ZShhdHRyKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE9ubHkgd3JpdGVzIHRoZSBmaXJzdCBsaW5lIG51bWJlciBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCBjb2RlIHNvIHRoYXQgc291cmNlCisgICAgICogdmlld2VycyBjYW4gZGlyZWN0IHRvIHRoZSBjb3JyZWN0IG1ldGhvZCwgZXZlbiBpZiB0aGUgY29udGVudCBkb2Vzbid0IG1hdGNoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGluZU51bWJlcihpbnQgbGluZSwgTGFiZWwgc3RhcnQpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRGaXJzdExpbmVOdW1iZXIpIHsKKyAgICAgICAgICAgIG1QYXJlbnRWaXNpdG9yLnZpc2l0TGluZU51bWJlcihsaW5lLCBzdGFydCk7CisgICAgICAgICAgICBtT3V0cHV0Rmlyc3RMaW5lTnVtYmVyID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEluc24oaW50IG9wY29kZSkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMYWJlbChMYWJlbCBsYWJlbCkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRUcnlDYXRjaEJsb2NrKExhYmVsIHN0YXJ0LCBMYWJlbCBlbmQsIExhYmVsIGhhbmRsZXIsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEluc24oaW50IG9wY29kZSwgU3RyaW5nIG93bmVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgLy8gU2tpcCBvcmlnaW5hbCBjb2RlLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKGludCBvcGNvZGUsIFN0cmluZyBvd25lciwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZyYW1lKGludCB0eXBlLCBpbnQgbkxvY2FsLCBPYmplY3RbXSBsb2NhbCwgaW50IG5TdGFjaywgT2JqZWN0W10gc3RhY2spIHsKKyAgICAgICAgLy8gU2tpcCBvcmlnaW5hbCBjb2RlLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0SWluY0luc24oaW50IHZhciwgaW50IGluY3JlbWVudCkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnRJbnNuKGludCBvcGNvZGUsIGludCBvcGVyYW5kKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEp1bXBJbnNuKGludCBvcGNvZGUsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExkY0luc24oT2JqZWN0IGNzdCkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMb2NhbFZhcmlhYmxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYywgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgICAgIExhYmVsIHN0YXJ0LCBMYWJlbCBlbmQsIGludCBpbmRleCkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMb29rdXBTd2l0Y2hJbnNuKExhYmVsIGRmbHQsIGludFtdIGtleXMsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE11bHRpQU5ld0FycmF5SW5zbihTdHJpbmcgZGVzYywgaW50IGRpbXMpIHsKKyAgICAgICAgLy8gU2tpcCBvcmlnaW5hbCBjb2RlLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VGFibGVTd2l0Y2hJbnNuKGludCBtaW4sIGludCBtYXgsIExhYmVsIGRmbHQsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVJbnNuKGludCBvcGNvZGUsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhckluc24oaW50IG9wY29kZSwgaW50IHZhcikgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0lDcmVhdGVJbmZvLmphdmEgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0lDcmVhdGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjMTcwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvSUNyZWF0ZUluZm8uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuY3JlYXRlOworCisvKioKKyAqIEludGVyZmFjZSBkZXNjcmliaW5nIHRoZSB3b3JrIHRvIGJlIGRvbmUgYnkge0BsaW5rIEFzbUdlbmVyYXRvcn0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNyZWF0ZUluZm8geworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjbGFzcyBmcm9tIGxheW91dGxpYl9jcmVhdGUgdG8gaW5qZWN0IGluIGxheW91dGxpYi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENsYXNzPD8+W10gZ2V0SW5qZWN0ZWRDbGFzc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG1ldGhvZHMgdG8gcmV3cml0ZSBhcyBkZWxlZ2F0ZXMuCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXREZWxlZ2F0ZU1ldGhvZHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2xhc3NlcyBvbiB3aGljaCB0byBkZWxlZ2F0ZSBhbGwgbmF0aXZlIG1ldGhvZHMuCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXREZWxlZ2F0ZUNsYXNzTmF0aXZlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIHN0dWIgb3V0LiBFYWNoIGVudHJ5IG11c3QgYmUgaW4gdGhlIGZvcm0KKyAgICAgKiAicGFja2FnZS5wYWNrYWdlLk91dGVyQ2xhc3MkSW5uZXJDbGFzcyNNZXRob2ROYW1lIi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldE92ZXJyaWRkZW5NZXRob2RzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gcmVuYW1lLCBtdXN0IGJlIGFuIGV2ZW4gbGlzdDogdGhlIGJpbmFyeSBGUUNOCisgICAgICogb2YgY2xhc3MgdG8gcmVwbGFjZSBmb2xsb3dlZCBieSB0aGUgbmV3IEZRQ04uCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRSZW5hbWVkQ2xhc3NlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjbGFzc2VzIGZvciB3aGljaCB0aGUgbWV0aG9kcyByZXR1cm5pbmcgdGhlbSBzaG91bGQgYmUgZGVsZXRlZC4KKyAgICAgKiBUaGUgYXJyYXkgY29udGFpbnMgYSBsaXN0IG9mIG51bGwgdGVybWluYXRlZCBzZWN0aW9uIHN0YXJ0aW5nIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogdG8gcmVuYW1lIGluIHdoaWNoIHRoZSBtZXRob2RzIGFyZSBkZWxldGVkLCBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgcmV0dXJuIHR5cGVzIGlkZW50aWZ5aW5nCisgICAgICogdGhlIG1ldGhvZHMgdG8gZGVsZXRlLgorICAgICAqIFRoZSBsaXN0IGNhbiBiZSBlbXB0eSBidXQgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0RGVsZXRlUmV0dXJucygpOworCit9CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL01haW4uamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvTWFpbi5qYXZhCmluZGV4IDMwM2YwOTcuLjRhZGFmZjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvTWFpbi5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvTWFpbi5qYXZhCkBAIC0yMSw3ICsyMSwyOCBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIAotCisvKioKKyAqIEVudHJ5IHBvaW50IGZvciB0aGUgbGF5b3V0bGliX2NyZWF0ZSB0b29sLgorICogPHAvPgorICogVGhlIHRvb2wgZG9lcyBub3QgY3VycmVudGx5IHJlbHkgb24gYW55IGV4dGVybmFsIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqIEluc3RlYWQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbW9zdGx5IGRvbmUgdmlhIHRoZSB7QGxpbmsgQ3JlYXRlSW5mb30gY2xhc3MuCisgKiA8cC8+CisgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9vbCBhbmQgaXRzIGltcGxlbWVudGF0aW9uLCBwbGVhc2UgcmVmZXIgdG8KKyAqIHRoZSAiUkVBRE1FLnR4dCIgZmlsZSBhdCB0aGUgcm9vdCBvZiB0aGlzIHByb2plY3QuCisgKiA8cC8+CisgKiBGb3IgYSBxdWljayB0ZXN0LCBpbnZva2UgdGhpcyBhcyBmb2xsb3dzOgorICogPHByZT4KKyAqICQgbWFrZSBsYXlvdXRsaWIKKyAqIDwvcHJlPgorICogd2hpY2ggZG9lczoKKyAqIDxwcmU+CisgKiAkIG1ha2UgbGF5b3V0bGliX2NyZWF0ZSAmbHQ7YnVuY2ggb2YgZnJhbWV3b3JrIGphcnMmZ3Q7CisgKiAkIG91dC9ob3N0L2xpbnV4LXg4Ni9mcmFtZXdvcmsvYmluL2xheW91dGxpYl9jcmVhdGUgXAorICogICAgICAgIG91dC9ob3N0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvdGVtcF9sYXlvdXRsaWJfaW50ZXJtZWRpYXRlcy9qYXZhbGliLmphciBcCisgKiAgICAgICAgb3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcy9jbGFzc2VzLmphciBcCisgKiAgICAgICAgb3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL2NsYXNzZXMuamFyCisgKiA8L3ByZT4KKyAqLwogcHVibGljIGNsYXNzIE1haW4gewogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewpAQCAtNDIsMTIgKzYzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBc21HZW5lcmF0b3IgYWdlbiA9IG5ldyBBc21HZW5lcmF0b3IobG9nLCBvc0Rlc3RKYXJbMF0sCi0gICAgICAgICAgICAgICAgICAgIENyZWF0ZUluZm8uSU5KRUNURURfQ0xBU1NFUywKLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRlSW5mby5PVkVSUklEREVOX01FVEhPRFMsCi0gICAgICAgICAgICAgICAgICAgIENyZWF0ZUluZm8uUkVOQU1FRF9DTEFTU0VTLAotICAgICAgICAgICAgICAgICAgICBDcmVhdGVJbmZvLlJFTU9WRURfTUVUSE9EUwotICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIEFzbUdlbmVyYXRvciBhZ2VuID0gbmV3IEFzbUdlbmVyYXRvcihsb2csIG9zRGVzdEphclswXSwgbmV3IENyZWF0ZUluZm8oKSk7CiAKICAgICAgICAgICAgIEFzbUFuYWx5emVyIGFhID0gbmV3IEFzbUFuYWx5emVyKGxvZywgb3NKYXJQYXRoLCBhZ2VuLAogICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiYW5kcm9pZC52aWV3LlZpZXciIH0sICAgLy8gZGVyaXZlZCBmcm9tCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL1RyYW5zZm9ybUNsYXNzQWRhcHRlci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9UcmFuc2Zvcm1DbGFzc0FkYXB0ZXIuamF2YQppbmRleCBlMjk0ZDU2Li5mMmQ5NzU1IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL1RyYW5zZm9ybUNsYXNzQWRhcHRlci5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvVHJhbnNmb3JtQ2xhc3NBZGFwdGVyLmphdmEKQEAgLTI2LDcgKzI2LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKLSAqIENsYXNzIGFkYXB0ZXIgdGhhdCBjYW4gc3R1YiBzb21lIG9yIGFsbCBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgY2xhc3MuIAorICogQ2xhc3MgYWRhcHRlciB0aGF0IGNhbiBzdHViIHNvbWUgb3IgYWxsIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBjbGFzcy4KICAqLwogY2xhc3MgVHJhbnNmb3JtQ2xhc3NBZGFwdGVyIGV4dGVuZHMgQ2xhc3NBZGFwdGVyIHsKIApAQCAtNDEsMTIgKzQxLDEyIEBACiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IGNsYXNzIGFkYXB0ZXIgdGhhdCB3aWxsIHN0dWIgc29tZSBvciBhbGwgbWV0aG9kcy4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIAotICAgICAqIEBwYXJhbSBzdHViTWV0aG9kcyAKKyAgICAgKiBAcGFyYW0gbG9nZ2VyCisgICAgICogQHBhcmFtIHN0dWJNZXRob2RzICBsaXN0IG9mIG1ldGhvZCBzaWduYXR1cmVzIHRvIGFsd2F5cyBzdHViIG91dAogICAgICAqIEBwYXJhbSBkZWxldGVSZXR1cm5zIGxpc3Qgb2YgdHlwZXMgdGhhdCB0cmlnZ2VyIHRoZSBkZWxldGlvbiBvZiBtZXRob2RzIHJldHVybmluZyB0aGVtLgogICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGJlaW5nIG1vZGlmaWVkCiAgICAgICogQHBhcmFtIGN2IFRoZSBwYXJlbnQgY2xhc3Mgd3JpdGVyIHZpc2l0b3IKLSAgICAgKiBAcGFyYW0gc3R1Yk5hdGl2ZXNPbmx5IFRydWUgaWYgb25seSBuYXRpdmUgbWV0aG9kcyBzaG91bGQgYmUgc3R1YmJlZC4gRmFsc2UgaWYgYWxsIAorICAgICAqIEBwYXJhbSBzdHViTmF0aXZlc09ubHkgVHJ1ZSBpZiBvbmx5IG5hdGl2ZSBtZXRob2RzIHNob3VsZCBiZSBzdHViYmVkLiBGYWxzZSBpZiBhbGwKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgc2hvdWxkIGJlIHN0dWJiZWQuCiAgICAgICogQHBhcmFtIGhhc05hdGl2ZSBUcnVlIGlmIHRoZSBtZXRob2QgaGFzIG5hdGl2ZXMsIGluIHdoaWNoIGNhc2UgaXRzIGFjY2VzcyBzaG91bGQgYmUKICAgICAgKiAgICAgICAgICAgICAgICAgIGNoYW5nZWQuCkBAIC02NywxMCArNjcsMTAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2aXNpdChpbnQgdmVyc2lvbiwgaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlLCBTdHJpbmcgc3VwZXJOYW1lLCBTdHJpbmdbXSBpbnRlcmZhY2VzKSB7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFRoaXMgY2xhc3MgbWlnaHQgYmUgYmVpbmcgcmVuYW1lZC4KICAgICAgICAgbmFtZSA9IG1DbGFzc05hbWU7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIHJlbW92ZSBwcm90ZWN0ZWQgb3IgcHJpdmF0ZSBhbmQgc2V0IGFzIHB1YmxpYwogICAgICAgICBhY2Nlc3MgPSBhY2Nlc3MgJiB+KE9wY29kZXMuQUNDX1BSSVZBVEUgfCBPcGNvZGVzLkFDQ19QUk9URUNURUQpOwogICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfUFVCTElDOwpAQCAtODIsNyArODIsNyBAQAogICAgICAgICBtSXNJbnRlcmZhY2UgPSAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0lOVEVSRkFDRSkgIT0gMCk7CiAgICAgICAgIHN1cGVyLnZpc2l0KHZlcnNpb24sIGFjY2VzcywgbmFtZSwgc2lnbmF0dXJlLCBzdXBlck5hbWUsIGludGVyZmFjZXMpOwogICAgIH0KLSAgICAKKwogICAgIC8qIFZpc2l0cyB0aGUgaGVhZGVyIG9mIGFuIGlubmVyIGNsYXNzLiAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5uZXJDbGFzcyhTdHJpbmcgbmFtZSwgU3RyaW5nIG91dGVyTmFtZSwgU3RyaW5nIGlubmVyTmFtZSwgaW50IGFjY2VzcykgewpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1ldGhvZFZpc2l0b3IgdmlzaXRNZXRob2QoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLAogICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSwgU3RyaW5nW10gZXhjZXB0aW9ucykgewotICAgICAgICAKKwogICAgICAgICBpZiAobURlbGV0ZVJldHVybnMgIT0gbnVsbCkgewogICAgICAgICAgICAgVHlwZSB0ID0gVHlwZS5nZXRSZXR1cm5UeXBlKGRlc2MpOwogICAgICAgICAgICAgaWYgKHQuZ2V0U29ydCgpID09IFR5cGUuT0JKRUNUKSB7CkBAIC0xMzAsMTYgKzEzMCwxNiBAQAogICAgICAgICAgICAgKG1TdHViQWxsIHx8CiAgICAgICAgICAgICAgKGFjY2VzcyAmIE9wY29kZXMuQUNDX05BVElWRSkgIT0gMCkgfHwKICAgICAgICAgICAgICBtU3R1Yk1ldGhvZHMuY29udGFpbnMobWV0aG9kU2lnbmF0dXJlKSkgewotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1RBVElDKSAhPSAwOwogICAgICAgICAgICAgYm9vbGVhbiBpc05hdGl2ZSA9IChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19OQVRJVkUpICE9IDA7CiAKICAgICAgICAgICAgIC8vIHJlbW92ZSBhYnN0cmFjdCwgZmluYWwgYW5kIG5hdGl2ZQogICAgICAgICAgICAgYWNjZXNzID0gYWNjZXNzICYgfihPcGNvZGVzLkFDQ19BQlNUUkFDVCB8IE9wY29kZXMuQUNDX0ZJTkFMIHwgT3Bjb2Rlcy5BQ0NfTkFUSVZFKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBTdHJpbmcgaW52b2tlU2lnbmF0dXJlID0gbWV0aG9kU2lnbmF0dXJlICsgZGVzYzsKICAgICAgICAgICAgIG1Mb2cuZGVidWcoIiAgU3R1YjogJXMgKCVzKSIsIGludm9rZVNpZ25hdHVyZSwgaXNOYXRpdmUgPyAibmF0aXZlIiA6ICIiKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBNZXRob2RWaXNpdG9yIG13ID0gc3VwZXIudmlzaXRNZXRob2QoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHViTWV0aG9kQWRhcHRlcihtdywgbmFtZSwgcmV0dXJuVHlwZShkZXNjKSwgaW52b2tlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgICAgICBpc1N0YXRpYywgaXNOYXRpdmUpOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRNZXRob2QoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyogVmlzaXRzIGEgZmllbGQuIE1ha2VzIGl0IHB1YmxpYy4gKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmllbGRWaXNpdG9yIHZpc2l0RmllbGQoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBTdHJpbmcgc2lnbmF0dXJlLApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgIC8vIGNoYW5nZSBhY2Nlc3MgdG8gcHVibGljCiAgICAgICAgIGFjY2VzcyAmPSB+KE9wY29kZXMuQUNDX1BST1RFQ1RFRCB8IE9wY29kZXMuQUNDX1BSSVZBVEUpOwogICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfUFVCTElDOwotICAgICAgICAKKwogICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRGaWVsZChhY2Nlc3MsIG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgdmFsdWUpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0FzbUFuYWx5emVyVGVzdC5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0FzbUFuYWx5emVyVGVzdC5qYXZhCmluZGV4IDYwMzI4NGUuLmQ2ZGJhNmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Bc21BbmFseXplclRlc3QuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtQW5hbHl6ZXJUZXN0LmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCiBpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZS5Bc21BbmFseXplci5EZXBlbmRlbmN5VmlzaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuY3JlYXRlLkxvZ1Rlc3QuTW9ja0xvZzsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtNDYsOSArNDUsOSBAQAogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Mb2cgPSBuZXcgTG9nVGVzdC5Nb2NrTG9nKCk7CisgICAgICAgIG1Mb2cgPSBuZXcgTW9ja0xvZygpOwogICAgICAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImRhdGEvbW9ja19hbmRyb2lkLmphciIpOwotICAgICAgICAKKwogICAgICAgICBtT3NKYXJQYXRoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgICAgIG1Pc0phclBhdGguYWRkKHVybC5nZXRGaWxlKCkpOwogCkBAIC02OSw5ICs2OCw5IEBACiAgICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC5kdW1teS5Jbm5lclRlc3QkRGVyaXZpbmdDbGFzcyIsCiAgICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC5kdW1teS5Jbm5lclRlc3QkTXlHZW5lcmljczEiLAogICAgICAgICAgICAgICAgICJtb2NrX2FuZHJvaWQuZHVtbXkuSW5uZXJUZXN0JE15SW50RW51bSIsCi0gICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC5kdW1teS5Jbm5lclRlc3QkTXlTdGF0aWNJbm5lckNsYXNzIiwgICAKLSAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLmR1bW15LklubmVyVGVzdCROb3RTdGF0aWNJbm5lcjEiLCAKLSAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLmR1bW15LklubmVyVGVzdCROb3RTdGF0aWNJbm5lcjIiLCAgCisgICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC5kdW1teS5Jbm5lclRlc3QkTXlTdGF0aWNJbm5lckNsYXNzIiwKKyAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLmR1bW15LklubmVyVGVzdCROb3RTdGF0aWNJbm5lcjEiLAorICAgICAgICAgICAgICAgICJtb2NrX2FuZHJvaWQuZHVtbXkuSW5uZXJUZXN0JE5vdFN0YXRpY0lubmVyMiIsCiAgICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC52aWV3LlZpZXciLAogICAgICAgICAgICAgICAgICJtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXAiLAogICAgICAgICAgICAgICAgICJtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIiwKQEAgLTgzLDcgKzgyLDcgQEAKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBtYXAua2V5U2V0KCkudG9BcnJheSgpKTsKICAgICB9Ci0gICAgCisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kQ2xhc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24sIExvZ0Fib3J0RXhjZXB0aW9uIHsKICAgICAgICAgTWFwPFN0cmluZywgQ2xhc3NSZWFkZXI+IHppcENsYXNzZXMgPSBtQWEucGFyc2VaaXAobU9zSmFyUGF0aCk7CkBAIC05MSw3ICs5MCw3IEBACiAKICAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBtQWEuZmluZENsYXNzKCJtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIiwKICAgICAgICAgICAgICAgICB6aXBDbGFzc2VzLCBmb3VuZCk7Ci0gICAgICAgIAorCiAgICAgICAgIGFzc2VydE5vdE51bGwoY3IpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm1vY2tfYW5kcm9pZC92aWV3L1ZpZXdHcm91cCRMYXlvdXRQYXJhbXMiLCBjci5nZXRDbGFzc05hbWUoKSk7CiAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIiB9LApAQCAtMTcyLDE0ICsxNzEsMTQgQEAKICAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLndpZGdldC5UYWJsZUxheW91dCIsCiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgZm91bmQua2V5U2V0KCkudG9BcnJheSgpKTsKLSAgICAgICAgCisKICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogZm91bmQua2V5U2V0KCkpIHsKICAgICAgICAgICAgIENsYXNzUmVhZGVyIHZhbHVlID0gZm91bmQuZ2V0KGtleSk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJObyB2YWx1ZSBmb3IgIiArIGtleSwgdmFsdWUpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGtleSwgQXNtQW5hbHl6ZXIuY2xhc3NSZWFkZXJUb0NsYXNzTmFtZSh2YWx1ZSkpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVwZW5kZW5jeVZpc2l0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24sIExvZ0Fib3J0RXhjZXB0aW9uIHsKICAgICAgICAgTWFwPFN0cmluZywgQ2xhc3NSZWFkZXI+IHppcENsYXNzZXMgPSBtQWEucGFyc2VaaXAobU9zSmFyUGF0aCk7CkBAIC0xOTAsNyArMTg5LDcgQEAKIAogICAgICAgICBDbGFzc1JlYWRlciBjciA9IG1BYS5maW5kQ2xhc3MoIm1vY2tfYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQiLCB6aXBDbGFzc2VzLCBrZWVwKTsKICAgICAgICAgRGVwZW5kZW5jeVZpc2l0b3IgdmlzaXRvciA9IG1BYS5nZXRWaXNpdG9yKHppcENsYXNzZXMsIGtlZXAsIG5ld19rZWVwLCBpbl9kZXBzLCBvdXRfZGVwcyk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIGdldCBmaXJzdCBsZXZlbCBkZXBlbmRlbmNpZXMKICAgICAgICAgY3IuYWNjZXB0KHZpc2l0b3IsIDAgLyogZmxhZ3MgKi8pOwogCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtR2VuZXJhdG9yVGVzdC5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0FzbUdlbmVyYXRvclRlc3QuamF2YQppbmRleCA3Y2RmNzlhLi5mNGZmMzg5IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtR2VuZXJhdG9yVGVzdC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Bc21HZW5lcmF0b3JUZXN0LmphdmEKQEAgLTIwLDggKzIwLDYgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZS5Mb2dUZXN0Lk1vY2tMb2c7Ci0KIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTQ0LDkgKzQyLDkgQEAKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtTG9nID0gbmV3IExvZ1Rlc3QuTW9ja0xvZygpOworICAgICAgICBtTG9nID0gbmV3IE1vY2tMb2coKTsKICAgICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJkYXRhL21vY2tfYW5kcm9pZC5qYXIiKTsKLSAgICAgICAgCisKICAgICAgICAgbU9zSmFyUGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgICAgICBtT3NKYXJQYXRoLmFkZCh1cmwuZ2V0RmlsZSgpKTsKIApAQCAtNjUsMTYgKzYzLDQxIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc1JlbmFtaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBMb2dBYm9ydEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBBc21HZW5lcmF0b3IgYWdlbiA9IG5ldyBBc21HZW5lcmF0b3IobUxvZywgbU9zRGVzdEphciwKLSAgICAgICAgICAgIG51bGwsIC8vIGNsYXNzZXMgdG8gaW5qZWN0IGluIHRoZSBmaW5hbCBKQVIKLSAgICAgICAgICAgIG51bGwsICAvLyBtZXRob2RzIHRvIGZvcmNlIG92ZXJyaWRlCi0gICAgICAgICAgICBuZXcgU3RyaW5nW10geyAgLy8gY2xhc3NlcyB0byByZW5hbWUgKHNvIHRoYXQgd2UgY2FuIHJlcGxhY2UgdGhlbSkKLSAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLnZpZXcuVmlldyIsICJtb2NrX2FuZHJvaWQudmlldy5fT3JpZ2luYWxfVmlldyIsCi0gICAgICAgICAgICAgICAgIm5vdC5hbi5hY3R1YWwuQ2xhc3NOYW1lIiwgImFub3Rlci5mYWtlLk5ld0NsYXNzTmFtZSIsCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgbnVsbCAvLyBtZXRob2RzIGRlbGV0ZWQgZnJvbSB0aGVpciByZXR1cm4gdHlwZS4KLSAgICAgICAgICAgICk7CisKKyAgICAgICAgSUNyZWF0ZUluZm8gY2kgPSBuZXcgSUNyZWF0ZUluZm8oKSB7CisgICAgICAgICAgICBwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRJbmplY3RlZENsYXNzZXMoKSB7CisgICAgICAgICAgICAgICAgLy8gY2xhc3NlcyB0byBpbmplY3QgaW4gdGhlIGZpbmFsIEpBUgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3M8Pz5bMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWxlZ2F0ZU1ldGhvZHMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWxlZ2F0ZUNsYXNzTmF0aXZlcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE92ZXJyaWRkZW5NZXRob2RzKCkgeworICAgICAgICAgICAgICAgIC8vIG1ldGhvZHMgdG8gZm9yY2Ugb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFJlbmFtZWRDbGFzc2VzKCkgeworICAgICAgICAgICAgICAgIC8vIGNsYXNzZXMgdG8gcmVuYW1lIChzbyB0aGF0IHdlIGNhbiByZXBsYWNlIHRoZW0pCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLnZpZXcuVmlldyIsICJtb2NrX2FuZHJvaWQudmlldy5fT3JpZ2luYWxfVmlldyIsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90LmFuLmFjdHVhbC5DbGFzc05hbWUiLCAiYW5vdGVyLmZha2UuTmV3Q2xhc3NOYW1lIiwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RGVsZXRlUmV0dXJucygpIHsKKyAgICAgICAgICAgICAgICAgLy8gbWV0aG9kcyBkZWxldGVkIGZyb20gdGhlaXIgcmV0dXJuIHR5cGUuCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQXNtR2VuZXJhdG9yIGFnZW4gPSBuZXcgQXNtR2VuZXJhdG9yKG1Mb2csIG1Pc0Rlc3RKYXIsIGNpKTsKIAogICAgICAgICBBc21BbmFseXplciBhYSA9IG5ldyBBc21BbmFseXplcihtTG9nLCBtT3NKYXJQYXRoLCBhZ2VuLAogICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20KQEAgLTgzLDcgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIGFhLmFuYWx5emUoKTsKICAgICAgICAgYWdlbi5nZW5lcmF0ZSgpOwotICAgICAgICAKKwogICAgICAgICBTZXQ8U3RyaW5nPiBub3RSZW5hbWVkID0gYWdlbi5nZXRDbGFzc2VzTm90UmVuYW1lZCgpOwogICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyAibm90L2FuL2FjdHVhbC9DbGFzc05hbWUiIH0sIG5vdFJlbmFtZWQudG9BcnJheSgpKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQ2xhc3NIYXNOYXRpdmVWaXNpdG9yVGVzdC5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0NsYXNzSGFzTmF0aXZlVmlzaXRvclRlc3QuamF2YQppbmRleCBkNjkxNmFlLi4wMTM1YzQwIDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQ2xhc3NIYXNOYXRpdmVWaXNpdG9yVGVzdC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9DbGFzc0hhc05hdGl2ZVZpc2l0b3JUZXN0LmphdmEKQEAgLTMzLDggKzMzLDkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNOYXRpdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBNb2NrQ2xhc3NIYXNOYXRpdmVWaXNpdG9yIGN2ID0gbmV3IE1vY2tDbGFzc0hhc05hdGl2ZVZpc2l0b3IoKTsKLSAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBuZXcgQ2xhc3NSZWFkZXIoCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnRvb2xzLmxheW91dGxpYi5jcmVhdGUuQ2xhc3NIYXNOYXRpdmVWaXNpdG9yVGVzdCRDbGFzc1dpdGhOYXRpdmUiKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9CisgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICIkIiArIENsYXNzV2l0aE5hdGl2ZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKGNsYXNzTmFtZSk7CiAKICAgICAgICAgY3IuYWNjZXB0KGN2LCAwIC8qIGZsYWdzICovKTsKICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsgIm5hdGl2ZV9tZXRob2QiIH0sIGN2LmdldE1ldGhvZHNGb3VuZCgpKTsKQEAgLTQ0LDE0ICs0NSwxNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEhhc05vTmF0aXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja0NsYXNzSGFzTmF0aXZlVmlzaXRvciBjdiA9IG5ldyBNb2NrQ2xhc3NIYXNOYXRpdmVWaXNpdG9yKCk7Ci0gICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuY3JlYXRlLkNsYXNzSGFzTmF0aXZlVmlzaXRvclRlc3QkQ2xhc3NXaXRob3V0TmF0aXZlIik7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPQorICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICIkIiArIENsYXNzV2l0aG91dE5hdGl2ZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKGNsYXNzTmFtZSk7CiAKICAgICAgICAgY3IuYWNjZXB0KGN2LCAwIC8qIGZsYWdzICovKTsKICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1swXSwgY3YuZ2V0TWV0aG9kc0ZvdW5kKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShjdi5oYXNOYXRpdmVNZXRob2RzKCkpOwogICAgIH0KIAorICAgIC8vLS0tLS0tLQorCiAgICAgLyoqCiAgICAgICogT3ZlcnJpZGVzIHtAbGluayBDbGFzc0hhc05hdGl2ZVZpc2l0b3J9IHRvIGNvbGxlYyB0aGUgbmFtZSBvZiB0aGUgbmF0aXZlIG1ldGhvZHMgZm91bmQuCiAgICAgICovCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvRGVsZWdhdGVDbGFzc0FkYXB0ZXJUZXN0LmphdmEgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvRGVsZWdhdGVDbGFzc0FkYXB0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMmU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9EZWxlZ2F0ZUNsYXNzQWRhcHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZTsKKworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzUmVhZGVyOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzV3JpdGVyOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLnV0aWwuVHJhY2VDbGFzc1Zpc2l0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworcHVibGljIGNsYXNzIERlbGVnYXRlQ2xhc3NBZGFwdGVyVGVzdCB7CisKKyAgICBwcml2YXRlIE1vY2tMb2cgbUxvZzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0KKyAgICAgICAgRGVsZWdhdGVDbGFzc0FkYXB0ZXJUZXN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSArICIkIiArCisgICAgICAgIENsYXNzV2l0aE5hdGl2ZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUxvZyA9IG5ldyBNb2NrTG9nKCk7CisgICAgICAgIG1Mb2cuc2V0VmVyYm9zZSh0cnVlKTsgLy8gY2FwdHVyZSBkZWJ1ZyBlcnJvciB0b28KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGEgY2xhc3Mgbm90IGJlaW5nIG1vZGlmaWVkIHN0aWxsIHdvcmtzLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vT3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB0aGF0IHdpbGwgYmUgbW9kaWZpZWQKKyAgICAgICAgLy8gKGxvYWQgdGhlIGNsYXNzIGluIGEgZGlzdGluY3QgY2xhc3MgbG9hZGVyIHNvIHRoYXQgd2UgY2FuIHRyYXNoIGl0cyBkZWZpbml0aW9uIGxhdGVyKQorICAgICAgICBDbGFzc0xvYWRlciBjbDEgPSBuZXcgQ2xhc3NMb2FkZXIodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpIHsgfTsKKyAgICAgICAgQ2xhc3M8Q2xhc3NXaXRoTmF0aXZlPiBjbGF6ejEgPSAoQ2xhc3M8Q2xhc3NXaXRoTmF0aXZlPikgY2wxLmxvYWRDbGFzcyhDTEFTU19OQU1FKTsKKyAgICAgICAgQ2xhc3NXaXRoTmF0aXZlIGluc3RhbmNlMSA9IGNsYXp6MS5uZXdJbnN0YW5jZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDIsIGluc3RhbmNlMS5hZGQoMjAsIDIyKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnN0YW5jZTEuY2FsbE5hdGl2ZUluc3RhbmNlKDEwLCAzLjE0MTUsIG5ldyBPYmplY3RbMF0gKTsKKyAgICAgICAgICAgIGZhaWwoIlRlc3Qgc2hvdWxkIGhhdmUgZmFpbGVkIHRvIGludm9rZSBjYWxsVGhlTmF0aXZlTWV0aG9kIFsxXSIpOworICAgICAgICB9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGV4cGVjdGVkIHRvIGZhaWwgc2luY2UgdGhlIG5hdGl2ZSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHByb2Nlc3MgaXQgYnV0IHRlbGwgdGhlIGRlbGVnYXRlIHRvIG5vdCBtb2RpZnkgYW55IG1ldGhvZAorICAgICAgICBDbGFzc1dyaXRlciBjdyA9IG5ldyBDbGFzc1dyaXRlcigwIC8qZmxhZ3MqLyk7CisKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IGRlbGVnYXRlTWV0aG9kcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgU3RyaW5nIGludGVybmFsQ2xhc3NOYW1lID0gQ0xBU1NfTkFNRS5yZXBsYWNlKCcuJywgJy8nKTsKKyAgICAgICAgRGVsZWdhdGVDbGFzc0FkYXB0ZXIgY3YgPSBuZXcgRGVsZWdhdGVDbGFzc0FkYXB0ZXIoCisgICAgICAgICAgICAgICAgbUxvZywgY3csIGludGVybmFsQ2xhc3NOYW1lLCBkZWxlZ2F0ZU1ldGhvZHMpOworCisgICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKENMQVNTX05BTUUpOworICAgICAgICBjci5hY2NlcHQoY3YsIDAgLyogZmxhZ3MgKi8pOworCisgICAgICAgIC8vIExvYWQgdGhlIGdlbmVyYXRlZCBjbGFzcyBpbiBhIGRpZmZlcmVudCBjbGFzcyBsb2FkZXIgYW5kIHRyeSBpdCBhZ2FpbgorICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBjdy50b0J5dGVBcnJheSgpOworCisgICAgICAgIENsYXNzTG9hZGVyMiBjbDIgPSBuZXcgQ2xhc3NMb2FkZXIyKGJ5dGVzKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RpZmllZEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenoyID0gbG9hZENsYXNzKENMQVNTX05BTUUpOworICAgICAgICAgICAgICAgIE9iamVjdCBpMiA9IGNsYXp6Mi5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaTIpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MiwgY2FsbEFkZChpMiwgMjAsIDIyKSk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYWxsQ2FsbE5hdGl2ZUluc3RhbmNlKGkyLCAxMCwgMy4xNDE1LCBuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiVGVzdCBzaG91bGQgaGF2ZSBmYWlsZWQgdG8gaW52b2tlIGNhbGxUaGVOYXRpdmVNZXRob2QgWzJdIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZXhwZWN0ZWQgdG8gZmFpbCBzaW5jZSB0aGUgbmF0aXZlIG1ldGhvZCBoYXMgTk9UIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGRlbiBoZXJlLgorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVW5zYXRpc2ZpZWRMaW5rRXJyb3IuY2xhc3MsIGUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBuYXRpdmUgbWV0aG9kIGRvZXMgTk9UIGhhdmUgdGhlIG5ldyBhbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgTWV0aG9kW10gbSA9IGNsYXp6Mi5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5hdGl2ZV9pbnN0YW5jZSIsIG1bMl0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKE1vZGlmaWVyLmlzTmF0aXZlKG1bMl0uZ2V0TW9kaWZpZXJzKCkpKTsKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYSA9IG1bMl0uZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBjbDIudGVzdE1vZGlmaWVkSW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgRGVsZWdhdGVNZXRob2RBZGFwdGVyfSBkb2VzIG5vdCBzdXBwb3J0IG92ZXJyaWRpbmcgY29uc3RydWN0b3JzIHlldCwKKyAgICAgKiBzbyB0aGlzIHNob3VsZCBmYWlsIHdpdGggYW4ge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KKyAgICAgKgorICAgICAqIEFsdGhvdWdoIG5vdCB0ZXN0ZWQgaGVyZSwgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbiBzaG91bGQgY29udGFpbiB0aGUKKyAgICAgKiBjb25zdHJ1Y3RvciBzaWduYXR1cmUuCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQ9VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yc05vdFN1cHBvcnRlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzV3JpdGVyIGN3ID0gbmV3IENsYXNzV3JpdGVyKDAgLypmbGFncyovKTsKKworICAgICAgICBTdHJpbmcgaW50ZXJuYWxDbGFzc05hbWUgPSBDTEFTU19OQU1FLnJlcGxhY2UoJy4nLCAnLycpOworCisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBkZWxlZ2F0ZU1ldGhvZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIGRlbGVnYXRlTWV0aG9kcy5hZGQoIjxpbml0PiIpOworICAgICAgICBEZWxlZ2F0ZUNsYXNzQWRhcHRlciBjdiA9IG5ldyBEZWxlZ2F0ZUNsYXNzQWRhcHRlcigKKyAgICAgICAgICAgICAgICBtTG9nLCBjdywgaW50ZXJuYWxDbGFzc05hbWUsIGRlbGVnYXRlTWV0aG9kcyk7CisKKyAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBuZXcgQ2xhc3NSZWFkZXIoQ0xBU1NfTkFNRSk7CisgICAgICAgIGNyLmFjY2VwdChjdiwgMCAvKiBmbGFncyAqLyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdGVOYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NXcml0ZXIgY3cgPSBuZXcgQ2xhc3NXcml0ZXIoMCAvKmZsYWdzKi8pOworICAgICAgICBTdHJpbmcgaW50ZXJuYWxDbGFzc05hbWUgPSBDTEFTU19OQU1FLnJlcGxhY2UoJy4nLCAnLycpOworCisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBkZWxlZ2F0ZU1ldGhvZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIGRlbGVnYXRlTWV0aG9kcy5hZGQoRGVsZWdhdGVDbGFzc0FkYXB0ZXIuQUxMX05BVElWRVMpOworICAgICAgICBEZWxlZ2F0ZUNsYXNzQWRhcHRlciBjdiA9IG5ldyBEZWxlZ2F0ZUNsYXNzQWRhcHRlcigKKyAgICAgICAgICAgICAgICBtTG9nLCBjdywgaW50ZXJuYWxDbGFzc05hbWUsIGRlbGVnYXRlTWV0aG9kcyk7CisKKyAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBuZXcgQ2xhc3NSZWFkZXIoQ0xBU1NfTkFNRSk7CisgICAgICAgIGNyLmFjY2VwdChjdiwgMCAvKiBmbGFncyAqLyk7CisKKyAgICAgICAgLy8gTG9hZCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGluIGEgZGlmZmVyZW50IGNsYXNzIGxvYWRlciBhbmQgdHJ5IGl0CisgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IGN3LnRvQnl0ZUFycmF5KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyMiBjbDIgPSBuZXcgQ2xhc3NMb2FkZXIyKGJ5dGVzKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE1vZGlmaWVkSW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenoyID0gbG9hZENsYXNzKENMQVNTX05BTUUpOworICAgICAgICAgICAgICAgICAgICBPYmplY3QgaTIgPSBjbGF6ejIubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpMik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHJlZmxlY3Rpb24gdG8gYWNjZXNzIGlubmVyIG1ldGhvZHMKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQyLCBjYWxsQWRkKGkyLCAyMCwgMjIpKTsKKworICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gb2JqUmVzdWx0ID0gbmV3IE9iamVjdFtdIHsgbnVsbCB9OworICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNhbGxDYWxsTmF0aXZlSW5zdGFuY2UoaTIsIDEwLCAzLjE0MTUsIG9ialJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKGludCkoMTAgKyAzLjE0MTUpLCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShpMiwgb2JqUmVzdWx0WzBdKTsKKworICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbmF0aXZlIG1ldGhvZCBub3cgaGFzIHRoZSBuZXcgYW5ub3RhdGlvbiBhbmQgaXMgbm90IG5hdGl2ZQorICAgICAgICAgICAgICAgICAgICAgTWV0aG9kW10gbSA9IGNsYXp6Mi5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibmF0aXZlX2luc3RhbmNlIiwgbVsyXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNOYXRpdmUobVsyXS5nZXRNb2RpZmllcnMoKSkpOworICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGEgPSBtWzJdLmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxheW91dGxpYkRlbGVnYXRlIiwgYVswXS5hbm5vdGF0aW9uVHlwZSgpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNsMi50ZXN0TW9kaWZpZWRJbnN0YW5jZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAvLyBGb3IgZGVidWdnaW5nLCBkdW1wIHRoZSBieXRlY29kZSBvZiB0aGUgY2xhc3MgaW4gY2FzZSBvZiB1bmV4cGVjdGVkIGVycm9yLgorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworICAgICAgICAgICAgVHJhY2VDbGFzc1Zpc2l0b3IgdGN2ID0gbmV3IFRyYWNlQ2xhc3NWaXNpdG9yKHB3KTsKKworICAgICAgICAgICAgQ2xhc3NSZWFkZXIgY3IyID0gbmV3IENsYXNzUmVhZGVyKGJ5dGVzKTsKKyAgICAgICAgICAgIGNyMi5hY2NlcHQodGN2LCAwIC8qIGZsYWdzICovKTsKKworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJcbiIgKyB0LmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOworICAgICAgICAgICAgaWYgKHQuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtc2cgKz0gIjogIiArIHQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnID0gbXNnICsgIlxuQnl0ZWNvZGUgZHVtcDpcbiIgKyBzdy50b1N0cmluZygpOworCisgICAgICAgICAgICAvLyBSZS10aHJvdyBleGNlcHRpb24gd2l0aCBuZXcgbWVzc2FnZQorICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBleCA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZywgdCk7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQSBjbGFzcyBsb2FkZXIgdGhhbiBjYW4gZGVmaW5lIGFuZCBpbnN0YW50aWF0ZSBvdXIgZHVtbXkge0BsaW5rIENsYXNzV2l0aE5hdGl2ZX0uCisgICAgICogPHAvPgorICAgICAqIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgdGhpcyBjbGFzcyBsb2FkZXIgd2lsbCB0ZXN0IG91ciBtb2RpZmllZCB2ZXJzaW9uIG9mIENsYXNzV2l0aE5hdGl2ZS4KKyAgICAgKiBUcnlpbmcgdG8gZG8gc28gaW4gdGhlIG9yaWdpbmFsIGNsYXNzIGxvYWRlciBnZW5lcmF0ZXMgYWxsIHNvcnQgb2YgbGluayBpc3N1ZXMgYmVjYXVzZQorICAgICAqIHRoZXJlIGFyZSAyIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBjbGFzcyBuYW1lLiBUaGlzIGNsYXNzIGxvYWRlciB3aWxsCisgICAgICogZGVmaW5lIGFuZCBsb2FkIHRoZSBjbGFzcyB3aGVuIHJlcXVlc3RlZCBieSBuYW1lIGFuZCBwcm92aWRlIGhlbHBlcnMgdG8gYWNjZXNzIHRoZQorICAgICAqIGluc3RhbmNlIG1ldGhvZHMgdmlhIHJlZmxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBDbGFzc0xvYWRlcjIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIG1DbGFzc1dpdGhOYXRpdmU7CisKKyAgICAgICAgcHVibGljIENsYXNzTG9hZGVyMihieXRlW10gY2xhc3NXaXRoTmF0aXZlKSB7CisgICAgICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgICAgIG1DbGFzc1dpdGhOYXRpdmUgPSBjbGFzc1dpdGhOYXRpdmU7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDbGFzczw/PiBmaW5kQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmZpbmRDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgaWYgKENMQVNTX05BTUUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgdGhlIG1vZGlmaWVkIENsYXNzV2l0aE5hdGl2ZSBmcm9tIGl0cyBieXRlcyByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZUNsYXNzKENMQVNTX05BTUUsIG1DbGFzc1dpdGhOYXRpdmUsIDAsIG1DbGFzc1dpdGhOYXRpdmUubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZXJ5dGhpbmcgZWxzZSBmcm9tIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIGludG8gdGhlIG5ldyBjbGFzcyBsb2FkZXIuCisgICAgICAgICAgICAgICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBDbGFzc1dyaXRlciBjdyA9IG5ldyBDbGFzc1dyaXRlcigwKTsKKyAgICAgICAgICAgICAgICAgICAgY3IuYWNjZXB0KGN3LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY3cudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZUNsYXNzKG5hbWUsIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlvZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFjY2Vzc2VzIHtAbGluayBDbGFzc1dpdGhOYXRpdmUjYWRkKGludCwgaW50KX0gdmlhIHJlZmxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGNhbGxBZGQoT2JqZWN0IGluc3RhbmNlLCBpbnQgYSwgaW50IGIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgTWV0aG9kIG0gPSBpbnN0YW5jZS5nZXRDbGFzcygpLmdldE1ldGhvZCgiYWRkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzPD8+W10geyBpbnQuY2xhc3MsIGludC5jbGFzcyB9KTsKKworICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG0uaW52b2tlKGluc3RhbmNlLCBuZXcgT2JqZWN0W10geyBhLCBiIH0pOworICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgcmVzdWx0KS5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFjY2Vzc2VzIHtAbGluayBDbGFzc1dpdGhOYXRpdmUjY2FsbE5hdGl2ZUluc3RhbmNlKGludCwgZG91YmxlLCBPYmplY3RbXSl9CisgICAgICAgICAqIHZpYSByZWZsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBjYWxsQ2FsbE5hdGl2ZUluc3RhbmNlKE9iamVjdCBpbnN0YW5jZSwgaW50IGEsIGRvdWJsZSBkLCBPYmplY3RbXSBvKQorICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgTWV0aG9kIG0gPSBpbnN0YW5jZS5nZXRDbGFzcygpLmdldE1ldGhvZCgiY2FsbE5hdGl2ZUluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzPD8+W10geyBpbnQuY2xhc3MsIGRvdWJsZS5jbGFzcywgT2JqZWN0W10uY2xhc3MgfSk7CisKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBtLmludm9rZShpbnN0YW5jZSwgbmV3IE9iamVjdFtdIHsgYSwgZCwgbyB9KTsKKyAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHJlc3VsdCkuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlc3RNb2RpZmllZEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdW1teSB0ZXN0IGNsYXNzIHdpdGggYSBuYXRpdmUgbWV0aG9kLgorICAgICAqIFRoZSBuYXRpdmUgbWV0aG9kIGlzIG5vdCBkZWZpbmVkIGFuZCBhbnkgYXR0ZW1wdCB0byBpbnZva2UgaXQgd2lsbAorICAgICAqIHRocm93IGFuIHtAbGluayBVbnNhdGlzZmllZExpbmtFcnJvcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc1dpdGhOYXRpdmUgeworICAgICAgICBwdWJsaWMgQ2xhc3NXaXRoTmF0aXZlKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGQoaW50IGEsIGludCBiKSB7CisgICAgICAgICAgICByZXR1cm4gYSArIGI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNhbGxOYXRpdmVJbnN0YW5jZShpbnQgYSwgZG91YmxlIGQsIE9iamVjdFtdIG8pIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfaW5zdGFuY2UoYSwgZCwgbyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2luc3RhbmNlKGludCBhLCBkb3VibGUgZCwgT2JqZWN0W10gbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlbGVnYXRlIHRoYXQgcmVjZWl2ZXMgdGhlIGNhbGwgdG8ge0BsaW5rIENsYXNzV2l0aE5hdGl2ZX0ncyBvdmVycmlkZGVuIG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc1dpdGhOYXRpdmVfRGVsZWdhdGUgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBuYXRpdmVfaW5zdGFuY2UoQ2xhc3NXaXRoTmF0aXZlIGluc3RhbmNlLCBpbnQgYSwgZG91YmxlIGQsIE9iamVjdFtdIG8pIHsKKyAgICAgICAgICAgIGlmIChvICE9IG51bGwgJiYgby5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgb1swXSA9IGluc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChpbnQpKGEgKyBkKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Mb2dUZXN0LmphdmEgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvTG9nVGVzdC5qYXZhCmluZGV4IDNmMTMxNTguLjFhNWY2NTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Mb2dUZXN0LmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0xvZ1Rlc3QuamF2YQpAQCAtMjQsMzMgKzI0LDggQEAKIAogcHVibGljIGNsYXNzIExvZ1Rlc3QgewogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2NrTG9nIGV4dGVuZHMgTG9nIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBtT3V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBtRXJyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1PdXQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFcnIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVyci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb3V0UHJpbnRsbihTdHJpbmcgbXNnKSB7Ci0gICAgICAgICAgICBtT3V0LmFwcGVuZChtc2cpOwotICAgICAgICAgICAgbU91dC5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlcnJQcmludGxuKFN0cmluZyBtc2cpIHsKLSAgICAgICAgICAgIG1FcnIuYXBwZW5kKG1zZyk7Ci0gICAgICAgICAgICBtRXJyLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgTW9ja0xvZyBtTG9nOwotICAgIAorCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1Mb2cgPSBuZXcgTW9ja0xvZygpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL01vY2tMb2cuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Nb2NrTG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3NTBhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Nb2NrTG9nLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZTsKKworCitwdWJsaWMgY2xhc3MgTW9ja0xvZyBleHRlbmRzIExvZyB7CisgICAgU3RyaW5nQnVpbGRlciBtT3V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBTdHJpbmdCdWlsZGVyIG1FcnIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgcHVibGljIFN0cmluZyBnZXRPdXQoKSB7CisgICAgICAgIHJldHVybiBtT3V0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFcnIoKSB7CisgICAgICAgIHJldHVybiBtRXJyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb3V0UHJpbnRsbihTdHJpbmcgbXNnKSB7CisgICAgICAgIG1PdXQuYXBwZW5kKG1zZyk7CisgICAgICAgIG1PdXQuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVyclByaW50bG4oU3RyaW5nIG1zZykgeworICAgICAgICBtRXJyLmFwcGVuZChtc2cpOworICAgICAgICBtRXJyLmFwcGVuZCgnXG4nKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92b2lwL2phdmEvYW5kcm9pZC9uZXQvc2lwL1NpcEF1ZGlvQ2FsbC5qYXZhIGIvdm9pcC9qYXZhL2FuZHJvaWQvbmV0L3NpcC9TaXBBdWRpb0NhbGwuamF2YQppbmRleCBmNTViYWRlLi5kODU5YzRjIDEwMDY0NAotLS0gYS92b2lwL2phdmEvYW5kcm9pZC9uZXQvc2lwL1NpcEF1ZGlvQ2FsbC5qYXZhCisrKyBiL3ZvaXAvamF2YS9hbmRyb2lkL25ldC9zaXAvU2lwQXVkaW9DYWxsLmphdmEKQEAgLTc1MSw2ICs3NTEsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBncmFiV2lmaUhpZ2hQZXJmTG9jaygpIHsKKyAgICAgICAgLyogbm90IGF2YWlsYWJsZSBpbiBtYXN0ZXIgeWV0CiAgICAgICAgIGlmIChtV2lmaUhpZ2hQZXJmTG9jayA9PSBudWxsKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJhY3F1aXJlIHdpZmkgaGlnaCBwZXJmIGxvY2siKTsKICAgICAgICAgICAgIG1XaWZpSGlnaFBlcmZMb2NrID0gKChXaWZpTWFuYWdlcikKQEAgLTc1OCw2ICs3NTksNyBAQAogICAgICAgICAgICAgICAgICAgICAuY3JlYXRlV2lmaUxvY2soV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGLCBUQUcpOwogICAgICAgICAgICAgbVdpZmlIaWdoUGVyZkxvY2suYWNxdWlyZSgpOwogICAgICAgICB9CisgICAgICAgICovCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VXaWZpSGlnaFBlcmZMb2NrKCkgewpkaWZmIC0tZ2l0IGEvdm9pcC9qbmkvcnRwL0VjaG9TdXBwcmVzc29yLmNwcCBiL3ZvaXAvam5pL3J0cC9FY2hvU3VwcHJlc3Nvci5jcHAKaW5kZXggYWQ2M2NkNi4uZmJlYjMxNSAxMDA2NDQKLS0tIGEvdm9pcC9qbmkvcnRwL0VjaG9TdXBwcmVzc29yLmNwcAorKysgYi92b2lwL2puaS9ydHAvRWNob1N1cHByZXNzb3IuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKICNkZWZpbmUgTE9HX1RBRyAiRWNobyIKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL0lXaWZpTWFuYWdlci5haWRsIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyLmFpZGwKaW5kZXggMTk4YjFlNi4uZjc2MGQyNyAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyLmFpZGwKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyLmFpZGwKQEAgLTQ2LDExICs0NiwxMSBAQAogCiAgICAgTGlzdDxTY2FuUmVzdWx0PiBnZXRTY2FuUmVzdWx0cygpOwogCi0gICAgYm9vbGVhbiBkaXNjb25uZWN0KCk7CisgICAgdm9pZCBkaXNjb25uZWN0KCk7CiAKLSAgICBib29sZWFuIHJlY29ubmVjdCgpOworICAgIHZvaWQgcmVjb25uZWN0KCk7CiAKLSAgICBib29sZWFuIHJlYXNzb2NpYXRlKCk7CisgICAgdm9pZCByZWFzc29jaWF0ZSgpOwogCiAgICAgV2lmaUluZm8gZ2V0Q29ubmVjdGlvbkluZm8oKTsKIApAQCAtODksNSArODksMjUgQEAKICAgICBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCk7CiAKICAgICB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oaW4gV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyk7CisKKyAgICB2b2lkIHN0YXJ0V2lmaSgpOworCisgICAgdm9pZCBzdG9wV2lmaSgpOworCisgICAgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpOworCisgICAgdm9pZCBjbGVhckJsYWNrbGlzdCgpOworCisgICAgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhDb25maWcoaW4gV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyk7CisKKyAgICB2b2lkIGNvbm5lY3ROZXR3b3JrV2l0aElkKGludCBuZXR3b3JrSWQpOworCisgICAgdm9pZCBzYXZlTmV0d29yayhpbiBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKTsKKworICAgIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0d29ya0lkKTsKKworICAgIHZvaWQgc3RhcnRXcHNQYmMoU3RyaW5nIGJzc2lkKTsKKworICAgIHZvaWQgc3RhcnRXcHNQaW4oU3RyaW5nIGJzc2lkLCBpbnQgYXBQaW4pOwogfQogCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlnU3RvcmUuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWdTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNWZhYjQKLS0tIC9kZXYvbnVsbAorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlnU3RvcmUuamF2YQpAQCAtMCwwICsxLDEzMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5EaGNwSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rQWRkcmVzczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHlQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb24uSXBBc3NpZ25tZW50OworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdDsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLlByb3h5U2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbi5TdGF0dXM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb24uSU5WQUxJRF9ORVRXT1JLX0lEOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgQVBJIHRvIG1hbmFnZSBjb25maWd1cmVkCisgKiB3aWZpIG5ldHdvcmtzLiBUaGUgQVBJIGlzIG5vdCB0aHJlYWQgc2FmZSBpcyBiZWluZworICogdXNlZCBvbmx5IGZyb20gV2lmaVN0YXRlTWFjaGluZS4KKyAqCisgKiBJdCBkZWFscyB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIC0gQWRkL3VwZGF0ZS9yZW1vdmUgYSBXaWZpQ29uZmlndXJhdGlvbgorICogICBUaGUgY29uZmlndXJhdGlvbiBjb250YWlucyB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24uCisgKiAgICAgPSBJUCBhbmQgcHJveHkgY29uZmlndXJhdGlvbiB0aGF0IGlzIGhhbmRsZWQgYnkgV2lmaUNvbmZpZ1N0b3JlIGFuZAorICogICAgICAgaXMgc2F2ZWQgdG8gZGlzayBvbiBhbnkgY2hhbmdlLgorICoKKyAqICAgICAgIFRoZSBmb3JtYXQgb2YgY29uZmlndXJhdGlvbiBmaWxlIGlzIGFzIGZvbGxvd3M6CisgKiAgICAgICA8dmVyc2lvbj4KKyAqICAgICAgIDxuZXRBX2tleTE+PG5ldEFfdmFsdWUxPjxuZXRBX2tleTI+PG5ldEFfdmFsdWUyPi4uLjxFT1M+CisgKiAgICAgICA8bmV0Ql9rZXkxPjxuZXRCX3ZhbHVlMT48bmV0Ql9rZXkyPjxuZXRCX3ZhbHVlMj4uLi48RU9TPgorICogICAgICAgLi4KKyAqCisgKiAgICAgICAoa2V5LCB2YWx1ZSkgcGFpcnMgZm9yIGEgZ2l2ZW4gbmV0d29yayBhcmUgZ3JvdXBlZCB0b2dldGhlciBhbmQgY2FuCisgKiAgICAgICBiZSBpbiBhbnkgb3JkZXIuIEEgRU9TIGF0IHRoZSBlbmQgb2YgYSBzZXQgb2YgKGtleSwgdmFsdWUpIHBhaXJzCisgKiAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgbmV4dCBzZXQgb2YgKGtleSwgdmFsdWUpIHBhaXJzIGFyZSBmb3IgYSBuZXcKKyAqICAgICAgIG5ldHdvcmsuIEEgbmV0d29yayBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIElEX0tFWS4gSWYgdGhlcmUgaXMgbm8KKyAqICAgICAgIElEX0tFWSBpbiB0aGUgKGtleSwgdmFsdWUpIHBhaXJzLCB0aGUgZGF0YSBpcyBkaXNjYXJkZWQuCisgKgorICogICAgICAgQW4gaW52YWxpZCB2ZXJzaW9uIG9uIHJlYWQgd291bGQgcmVzdWx0IGluIGRpc2NhcmRpbmcgdGhlIGNvbnRlbnRzIG9mCisgKiAgICAgICB0aGUgZmlsZS4gT24gdGhlIG5leHQgd3JpdGUsIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyB3cml0dGVuIHRvIGZpbGUuCisgKgorICogICAgICAgQW55IGZhaWx1cmVzIGR1cmluZyByZWFkIG9yIHdyaXRlIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYXJlIGlnbm9yZWQKKyAqICAgICAgIHdpdGhvdXQgcmVwb3J0aW5nIHRvIHRoZSB1c2VyIHNpbmNlIHRoZSBsaWtlbGlob29kIG9mIHRoZXNlIGVycm9ycyBhcmUKKyAqICAgICAgIGxvdyBhbmQgdGhlIGltcGFjdCBvbiBjb25uZWN0aXZpdHkgaXMgbG93LgorICoKKyAqICAgICA9IFNTSUQgJiBzZWN1cml0eSBkZXRhaWxzIHRoYXQgaXMgcHVzaGVkIHRvIHRoZSBzdXBwbGljYW50LgorICogICAgICAgc3VwcGxpY2FudCBzYXZlcyB0aGVzZSBkZXRhaWxzIHRvIHRoZSBkaXNrIG9uIGNhbGxpbmcKKyAqICAgICAgIHNhdmVDb25maWdDb21tYW5kKCkuCisgKgorICogICAgICAgV2UgaGF2ZSB0d28ga2luZHMgb2YgQVBJcyBleHBvc2VkOgorICogICAgICAgID4gcHVibGljIEFQSSBjYWxscyB0aGF0IHByb3ZpZGUgZmluZSBncmFpbmVkIGNvbnRyb2wKKyAqICAgICAgICAgIC0gZW5hYmxlTmV0d29yaywgZGlzYWJsZU5ldHdvcmssIGFkZE9yVXBkYXRlTmV0d29yaygpLAorICogICAgICAgICAgcmVtb3ZlTmV0d29yaygpLiBGb3IgdGhlc2UgY2FsbHMsIHRoZSBjb25maWcgaXMgbm90IHBlcnNpc3RlZAorICogICAgICAgICAgdG8gdGhlIGRpc2suIChUT0RPOiBkZXByZWNhdGUgdGhlc2UgY2FsbHMgaW4gV2lmaU1hbmFnZXIpCisgKiAgICAgICAgPiBUaGUgbmV3IEFQSSBjYWxscyAtIHNlbGVjdE5ldHdvcmsoKSwgc2F2ZU5ldHdvcmsoKSAmIGZvcmdldE5ldHdvcmsoKS4KKyAqICAgICAgICAgIFRoZXNlIGNhbGxzIHBlcnNpc3QgdGhlIHN1cHBsaWNhbnQgY29uZmlnIHRvIGRpc2suCisgKgorICogLSBNYWludGFpbiBhIGxpc3Qgb2YgY29uZmlndXJlZCBuZXR3b3JrcyBmb3IgcXVpY2sgYWNjZXNzCisgKgorICovCitjbGFzcyBXaWZpQ29uZmlnU3RvcmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGV4dCBzQ29udGV4dDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlDb25maWdTdG9yZSI7CisKKyAgICAvKiBjb25maWd1cmVkIG5ldHdvcmtzIHdpdGggbmV0d29yayBpZCBhcyB0aGUga2V5ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxJbnRlZ2VyLCBXaWZpQ29uZmlndXJhdGlvbj4gc0NvbmZpZ3VyZWROZXR3b3JrcyA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBXaWZpQ29uZmlndXJhdGlvbj4oKTsKKworICAgIC8qIEEgbmV0d29yayBpZCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIG5ldHdvcmsgY29uZmlndXJlZCBpbiB0aGUKKyAgICAgKiBzdXBwbGljYW50LiBOZXR3b3JrIGlkcyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIHN1cHBsaWNhbnQgcmVhZHMKKyAgICAgKiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGF0IHN0YXJ0IGFuZCBjYW4gdGh1cyBjaGFuZ2UgZm9yIG5ldHdvcmtzLgorICAgICAqIFdlIHN0b3JlIHRoZSBJUCBjb25maWd1cmF0aW9uIGZvciBuZXR3b3JrcyBhbG9uZyB3aXRoIGEgdW5pcXVlIGlkCisgICAgICogdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSBTU0lEIGFuZCBzZWN1cml0eSB0eXBlIG9mIHRoZSBuZXR3b3JrLiBBIG1hcHBpbmcKKyAgICAgKiBmcm9tIHRoZSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHRvIG5ldHdvcmsgaWQgb2YgdGhlIG5ldHdvcmsgaXMgbmVlZGVkIHRvCisgICAgICogbWFwIHN1cHBsaWNhbnQgY29uZmlnIHRvIElQIGNvbmZpZ3VyYXRpb24uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBzTmV0d29ya0lkcyA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworCisgICAgLyogVHJhY2tzIHRoZSBoaWdoZXN0IHByaW9yaXR5IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc0xhc3RQcmlvcml0eSA9IC0xOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGlwQ29uZmlnRmlsZSA9IEVudmlyb25tZW50LmdldERhdGFEaXJlY3RvcnkoKSArCisgICAgICAgICAgICAiL21pc2Mvd2lmaS9pcGNvbmZpZy50eHQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElQQ09ORklHX0ZJTEVfVkVSU0lPTiA9IDE7CisKKyAgICAvKiBJUCBhbmQgcHJveHkgY29uZmlndXJhdGlvbiBrZXlzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0tFWSA9ICJpZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQX0FTU0lHTk1FTlRfS0VZID0gImlwQXNzaWdubWVudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQUREUkVTU19LRVkgPSAibGlua0FkZHJlc3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHQVRFV0FZX0tFWSA9ICJnYXRld2F5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE5TX0tFWSA9ICJkbnMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9TRVRUSU5HU19LRVkgPSAicHJveHlTZXR0aW5ncyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0hPU1RfS0VZID0gInByb3h5SG9zdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1BPUlRfS0VZID0gInByb3h5UG9ydCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVU0lPTl9MSVNUX0tFWSA9ICJleGNsdXNpb25MaXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU9TID0gImVvcyI7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGNvbnRleHQsIGZldGNoIHRoZSBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MKKyAgICAgKiBhbmQgZW5hYmxlIGFsbCBzdG9yZWQgbmV0d29ya3MgaW4gc3VwcGxpY2FudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBMb2cuZChUQUcsICJMb2FkaW5nIGNvbmZpZyBhbmQgZW5hYmxpbmcgYWxsIG5ldHdvcmtzIik7CisgICAgICAgIHNDb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbG9hZENvbmZpZ3VyZWROZXR3b3JrcygpOworICAgICAgICBlbmFibGVBbGxOZXR3b3JrcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZldGNoIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBjb25maWd1cmVkIG5ldHdvcmtzCisgICAgICogQHJldHVybiBMaXN0IG9mIG5ldHdvcmtzCisgICAgICovCisgICAgc3RhdGljIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IGdldENvbmZpZ3VyZWROZXR3b3JrcygpIHsKKyAgICAgICAgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gbmV0d29ya3MgPSBuZXcgQXJyYXlMaXN0PFdpZmlDb25maWd1cmF0aW9uPigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIGZvcihXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgOiBzQ29uZmlndXJlZE5ldHdvcmtzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgbmV0d29ya3MuYWRkKG5ldyBXaWZpQ29uZmlndXJhdGlvbihjb25maWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV0d29ya3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogZW5hYmxlIGFsbCBuZXR3b3JrcyBhbmQgc2F2ZSBjb25maWcuIFRoaXMgd2lsbCBiZSBhIG5vLW9wIGlmIHRoZSBsaXN0CisgICAgICogb2YgY29uZmlndXJlZCBuZXR3b3JrcyBpbmRpY2F0ZXMgYWxsIG5ldHdvcmtzIGFzIGJlaW5nIGVuYWJsZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBlbmFibGVBbGxOZXR3b3JrcygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBmb3IoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogc0NvbmZpZ3VyZWROZXR3b3Jrcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIGlmKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy5zdGF0dXMgPT0gU3RhdHVzLkRJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFbmFibGUgbmV0d29yayBmYWlsZWQgb24gIiArIGNvbmZpZy5uZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgY29uZmlnIGZvciBjb25uZWN0aW9uLiBUaGlzIGludm9sdmVzCisgICAgICogYWRkaXRpb24vdXBkYXRlIG9mIHRoZSBzcGVjaWZpZWQgY29uZmlnLCB1cGRhdGluZyB0aGUgcHJpb3JpdHkgb2YKKyAgICAgKiBhbGwgdGhlIG5ldHdvcmtzIGFuZCBlbmFibGluZyB0aGUgZ2l2ZW4gbmV0d29yayB3aGlsZSBkaXNhYmxpbmcgb3RoZXJzLgorICAgICAqCisgICAgICogU2VsZWN0aW5nIGEgbmV0d29yayB3aWxsIGxlYXZlIHRoZSBvdGhlciBuZXR3b3JrcyBkaXNhYmxlZCBhbmQKKyAgICAgKiBhIGNhbGwgdG8gZW5hYmxlQWxsTmV0d29ya3MoKSBuZWVkcyB0byBiZSBpc3N1ZWQgdXBvbiBhIGNvbm5lY3Rpb24KKyAgICAgKiBvciBhIGZhaWx1cmUgZXZlbnQgZnJvbSBzdXBwbGljYW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGRldGFpbHMgaW4gV2lmaUNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZWxlY3ROZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBuZXRJZCA9IGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25maWcpOworICAgICAgICAgICAgaWYgKG5ldElkICE9IElOVkFMSURfTkVUV09SS19JRCkgeworICAgICAgICAgICAgICAgIHNlbGVjdE5ldHdvcmsobmV0SWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gdXBkYXRlIG5ldHdvcmsgIiArIGNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgbmV0d29yayBmb3IgY29ubmVjdGlvbi4gVGhpcyBpbnZvbHZlcworICAgICAqIHVwZGF0aW5nIHRoZSBwcmlvcml0eSBvZiBhbGwgdGhlIG5ldHdvcmtzIGFuZCBlbmFibGluZyB0aGUgZ2l2ZW4KKyAgICAgKiBuZXR3b3JrIHdoaWxlIGRpc2FibGluZyBvdGhlcnMuCisgICAgICoKKyAgICAgKiBTZWxlY3RpbmcgYSBuZXR3b3JrIHdpbGwgbGVhdmUgdGhlIG90aGVyIG5ldHdvcmtzIGRpc2FibGVkIGFuZAorICAgICAqIGEgY2FsbCB0byBlbmFibGVBbGxOZXR3b3JrcygpIG5lZWRzIHRvIGJlIGlzc3VlZCB1cG9uIGEgY29ubmVjdGlvbgorICAgICAqIG9yIGEgZmFpbHVyZSBldmVudCBmcm9tIHN1cHBsaWNhbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIHNlbGVjdCBmb3IgY29ubmVjdGlvbgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNlbGVjdE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIC8vIFJlc2V0IHRoZSBwcmlvcml0eSBvZiBlYWNoIG5ldHdvcmsgYXQgc3RhcnQgb3IgaWYgaXQgZ29lcyB0b28gaGlnaC4KKyAgICAgICAgaWYgKHNMYXN0UHJpb3JpdHkgPT0gLTEgfHwgc0xhc3RQcmlvcml0eSA+IDEwMDAwMDApIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgICAgIGZvcihXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgOiBzQ29uZmlndXJlZE5ldHdvcmtzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubmV0d29ya0lkICE9IElOVkFMSURfTkVUV09SS19JRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25maWcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc0xhc3RQcmlvcml0eSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYW5kIHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcubmV0d29ya0lkID0gbmV0SWQ7CisgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9ICsrc0xhc3RQcmlvcml0eTsKKworICAgICAgICBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgZ2l2ZW4gbmV0d29yayB3aGlsZSBkaXNhYmxpbmcgYWxsIG90aGVyIG5ldHdvcmtzICovCisgICAgICAgIGVuYWJsZU5ldHdvcmtXaXRob3V0QnJvYWRjYXN0KG5ldElkLCB0cnVlKTsKKworICAgICAgIC8qIEF2b2lkIHNhdmluZyB0aGUgY29uZmlnICYgc2VuZGluZyBhIGJyb2FkY2FzdCB0byBwcmV2ZW50IHNldHRpbmdzCisgICAgICAgICogZnJvbSBkaXNwbGF5aW5nIGEgZGlzYWJsZWQgbGlzdCBvZiBuZXR3b3JrcyAqLworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZC91cGRhdGUgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGFuZCBzYXZlIGNvbmZpZworICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBXaWZpQ29uZmlndXJhdGlvbiB0byBiZSBzYXZlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSAoY29uZmlnLm5ldHdvcmtJZCA9PSBJTlZBTElEX05FVFdPUktfSUQpOworICAgICAgICBpbnQgbmV0SWQgPSBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgLyogZW5hYmxlIGEgbmV3IG5ldHdvcmsgKi8KKyAgICAgICAgaWYgKG5ld05ldHdvcmsgJiYgbmV0SWQgIT0gSU5WQUxJRF9ORVRXT1JLX0lEKSB7CisgICAgICAgICAgICBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKG5ldElkLCBmYWxzZSk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBzQ29uZmlndXJlZE5ldHdvcmtzLmdldChuZXRJZCkuc3RhdHVzID0gU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yZ2V0IHRoZSBzcGVjaWZpZWQgbmV0d29yayBhbmQgc2F2ZSBjb25maWcKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIGZvcmdldAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGlmIChXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldElkKSkgeworICAgICAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgc0NvbmZpZ3VyZWROZXR3b3Jrcy5yZW1vdmUobmV0SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVJcEFuZFByb3h5Q29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIHNlbmRDb25maWdDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byByZW1vdmUgbmV0d29yayAiICsgbmV0SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkL3VwZGF0ZSBhIG5ldHdvcmsuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBzYXZlQ29uZmlnIG9wZXJhdGlvbi4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHB1YmxpYworICAgICAqIEFQSS4gVGhlIG1vcmUgcG93ZXJmdWwgc2F2ZU5ldHdvcmsoKSBpcyB1c2VkIGJ5IHRoZQorICAgICAqIHN0YXRlIG1hY2hpbmUKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgd2lmaSBjb25maWd1cmF0aW9uIHRvIGFkZC91cGRhdGUKKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IGFkZE9yVXBkYXRlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaW50IHJldCA9IGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25maWcpOworICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbmV0d29yay4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHNhdmVDb25maWcgb3BlcmF0aW9uLgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgcHVibGljCisgICAgICogQVBJLiBUaGUgbW9yZSBwb3dlcmZ1bCBmb3JnZXROZXR3b3JrKCkgaXMgdXNlZCBieSB0aGUKKyAgICAgKiBzdGF0ZSBtYWNoaW5lIGZvciBuZXR3b3JrIHJlbW92YWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiByZW1vdmVOZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICBib29sZWFuIHJldCA9IFdpZmlOYXRpdmUucmVtb3ZlTmV0d29ya0NvbW1hbmQobmV0SWQpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIGlmIChyZXQpIHNDb25maWd1cmVkTmV0d29ya3MucmVtb3ZlKG5ldElkKTsKKyAgICAgICAgfQorICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIGEgbmV0d29yay4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHNhdmVDb25maWcgb3BlcmF0aW9uLgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgcHVibGljCisgICAgICogQVBJLiBUaGUgbW9yZSBwb3dlcmZ1bCBzZWxlY3ROZXR3b3JrKCkvc2F2ZU5ldHdvcmsoKSBpcyB1c2VkIGJ5IHRoZQorICAgICAqIHN0YXRlIG1hY2hpbmUgZm9yIGNvbm5lY3RpbmcgdG8gYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgeworICAgICAgICBib29sZWFuIHJldCA9IGVuYWJsZU5ldHdvcmtXaXRob3V0QnJvYWRjYXN0KG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKKyAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIGVuYWJsZU5ldHdvcmtXaXRob3V0QnJvYWRjYXN0KGludCBuZXRJZCwgYm9vbGVhbiBkaXNhYmxlT3RoZXJzKSB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gV2lmaU5hdGl2ZS5lbmFibGVOZXR3b3JrQ29tbWFuZChuZXRJZCwgZGlzYWJsZU90aGVycyk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBzQ29uZmlndXJlZE5ldHdvcmtzLmdldChuZXRJZCk7CisgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIGNvbmZpZy5zdGF0dXMgPSBTdGF0dXMuRU5BQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXNhYmxlT3RoZXJzKSB7CisgICAgICAgICAgICBtYXJrQWxsTmV0d29ya3NEaXNhYmxlZEV4Y2VwdChuZXRJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIGEgbmV0d29yay4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHNhdmVDb25maWcgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIGJlIGRpc2FibGVkCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZGlzYWJsZU5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gV2lmaU5hdGl2ZS5kaXNhYmxlTmV0d29ya0NvbW1hbmQobmV0SWQpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNDb25maWd1cmVkTmV0d29ya3MuZ2V0KG5ldElkKTsKKyAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgY29uZmlnLnN0YXR1cyA9IFN0YXR1cy5ESVNBQkxFRDsKKyAgICAgICAgfQorICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgY29uZmlndXJlZCBuZXR3b3JrcyBpbiBzdXBwbGljYW50IHRvIGRpc2sKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzYXZlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IFdQUyBwaW4gbWV0aG9kIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzdGFydFdwc1BpbihTdHJpbmcgYnNzaWQsIGludCBhcFBpbikgeworICAgICAgICBpZiAoV2lmaU5hdGl2ZS5zdGFydFdwc1BpbkNvbW1hbmQoYnNzaWQsIGFwUGluKSkgeworICAgICAgICAgICAgLyogV1BTIGxlYXZlcyBhbGwgbmV0d29ya3MgZGlzYWJsZWQgKi8KKyAgICAgICAgICAgIG1hcmtBbGxOZXR3b3Jrc0Rpc2FibGVkKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgV1BTIHBpbiBtZXRob2QgY29uZmlndXJhdGlvbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgV1BTIHB1c2ggYnV0dG9uIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzdGFydFdwc1BiYyhTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgaWYgKFdpZmlOYXRpdmUuc3RhcnRXcHNQYmNDb21tYW5kKGJzc2lkKSkgeworICAgICAgICAgICAgLyogV1BTIGxlYXZlcyBhbGwgbmV0d29ya3MgZGlzYWJsZWQgKi8KKyAgICAgICAgICAgIG1hcmtBbGxOZXR3b3Jrc0Rpc2FibGVkKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgV1BTIHB1c2ggYnV0dG9uIGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZldGNoIHRoZSBsaW5rIHByb3BlcnRpZXMgZm9yIGEgZ2l2ZW4gbmV0d29yayBpZAorICAgICAqLworICAgIHN0YXRpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhpbnQgbmV0SWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBzQ29uZmlndXJlZE5ldHdvcmtzLmdldChuZXRJZCk7CisgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMoY29uZmlnLmxpbmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgSVAgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBuZXR3b3JrIGlkCisgICAgICogVE9ETzogV2UgY2Fubm90IGhhbmRsZSBJUHY2IGFkZHJlc3NlcyBmb3IgY29uZmlndXJhdGlvbgorICAgICAqICAgICAgIHJpZ2h0IG5vdyB1bnRpbCBOZXR3b3JrVXRpbHMgaXMgZml4ZWQuIFdoZW4gd2UgZG8KKyAgICAgKiAgICAgICB0aGF0LCB3ZSBzaG91bGQgcmVtb3ZlIGhhbmRsaW5nIERoY3BJbmZvIGFuZCBtb3ZlCisgICAgICogICAgICAgdG8gdXNpbmcgTGlua1Byb3BlcnRpZXMKKyAgICAgKi8KKyAgICBzdGF0aWMgRGhjcEluZm8gZ2V0SXBDb25maWd1cmF0aW9uKGludCBuZXRJZCkgeworICAgICAgICBEaGNwSW5mbyBkaGNwSW5mbyA9IG5ldyBEaGNwSW5mbygpOworICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IGdldExpbmtQcm9wZXJ0aWVzKG5ldElkKTsKKworICAgICAgICBpZiAobGlua1Byb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgSXRlcmF0b3I8TGlua0FkZHJlc3M+IGl0ZXIgPSBsaW5rUHJvcGVydGllcy5nZXRMaW5rQWRkcmVzc2VzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIExpbmtBZGRyZXNzIGxpbmtBZGRyZXNzID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGRoY3BJbmZvLmlwQWRkcmVzcyA9IE5ldHdvcmtVdGlscy5pbmV0QWRkcmVzc1RvSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtBZGRyZXNzLmdldEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIGRoY3BJbmZvLmdhdGV3YXkgPSBOZXR3b3JrVXRpbHMuaW5ldEFkZHJlc3NUb0ludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5nZXRHYXRld2F5KCkpOworICAgICAgICAgICAgICAgICAgICBkaGNwSW5mby5uZXRtYXNrID0gTmV0d29ya1V0aWxzLnByZWZpeExlbmd0aFRvTmV0bWFza0ludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rQWRkcmVzcy5nZXROZXR3b3JrUHJlZml4TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxJbmV0QWRkcmVzcz4gZG5zSXRlcmF0b3IgPSBsaW5rUHJvcGVydGllcy5nZXREbnNlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIGRoY3BJbmZvLmRuczEgPSBOZXR3b3JrVXRpbHMuaW5ldEFkZHJlc3NUb0ludChkbnNJdGVyYXRvci5uZXh0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZG5zSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaGNwSW5mby5kbnMyID0gTmV0d29ya1V0aWxzLmluZXRBZGRyZXNzVG9JbnQoZG5zSXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJUHY2IGFkZHJlc3MgY2Fubm90IGJlIGhhbmRsZWQgIiArIGUxKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgbm90IGhhcHBlbiBzaW5jZSBhIHN0b3JlZCBzdGF0aWMgY29uZmlnIHNob3VsZCBiZSB2YWxpZCAqLworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHBhcnRpYWwgSVAgY29uZmlndXJhdGlvbiAiICsgZTIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGhjcEluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogRmV0Y2ggdGhlIHByb3h5IHByb3BlcnRpZXMgZm9yIGEgZ2l2ZW4gbmV0d29yayBpZAorICAgICAqLworICAgIHN0YXRpYyBQcm94eVByb3BlcnRpZXMgZ2V0UHJveHlQcm9wZXJ0aWVzKGludCBuZXRJZCkgeworICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IGdldExpbmtQcm9wZXJ0aWVzKG5ldElkKTsKKyAgICAgICAgaWYgKGxpbmtQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHlQcm9wZXJ0aWVzKGxpbmtQcm9wZXJ0aWVzLmdldEh0dHBQcm94eSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gaWYgdGhlIHNwZWNpZmllZCBuZXR3b3JrIGlzIHVzaW5nIHN0YXRpYyBJUAorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGlzVXNpbmdTdGF0aWNJcChpbnQgbmV0SWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBzQ29uZmlndXJlZE5ldHdvcmtzLmdldChuZXRJZCk7CisgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLmlwQXNzaWdubWVudCA9PSBJcEFzc2lnbm1lbnQuU1RBVElDKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09ORklHX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgc0NvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGxvYWRDb25maWd1cmVkTmV0d29ya3MoKSB7CisgICAgICAgIFN0cmluZyBsaXN0U3RyID0gV2lmaU5hdGl2ZS5saXN0TmV0d29ya3NDb21tYW5kKCk7CisgICAgICAgIHNMYXN0UHJpb3JpdHkgPSAwOworCisgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgc0NvbmZpZ3VyZWROZXR3b3Jrcy5jbGVhcigpOworICAgICAgICAgICAgc05ldHdvcmtJZHMuY2xlYXIoKTsKKworICAgICAgICAgICAgaWYgKGxpc3RTdHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gbGlzdFN0ci5zcGxpdCgiXG4iKTsKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIGZpcnN0IGxpbmUsIHdoaWNoIGlzIGEgaGVhZGVyCisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbGluZXNbaV0uc3BsaXQoIlx0Iik7CisgICAgICAgICAgICAgICAgLy8gbmV0d29yay1pZCB8IHNzaWQgfCBic3NpZCB8IGZsYWdzCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm5ldHdvcmtJZCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzBdKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbQ1VSUkVOVF0iKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuQ1VSUkVOVDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0WzNdLmluZGV4T2YoIltESVNBQkxFRF0iKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWROZXR3b3JrVmFyaWFibGVzKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5wcmlvcml0eSA+IHNMYXN0UHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgc0xhc3RQcmlvcml0eSA9IGNvbmZpZy5wcmlvcml0eTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc0NvbmZpZ3VyZWROZXR3b3Jrcy5wdXQoY29uZmlnLm5ldHdvcmtJZCwgY29uZmlnKTsKKyAgICAgICAgICAgICAgICBzTmV0d29ya0lkcy5wdXQoY29uZmlnS2V5KGNvbmZpZyksIGNvbmZpZy5uZXR3b3JrSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlYWRJcEFuZFByb3h5Q29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgIH0KKworICAgIC8qIE1hcmsgYWxsIG5ldHdvcmtzIGV4Y2VwdCBzcGVjaWZpZWQgbmV0SWQgYXMgZGlzYWJsZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1hcmtBbGxOZXR3b3Jrc0Rpc2FibGVkRXhjZXB0KGludCBuZXRJZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIGZvcihXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgOiBzQ29uZmlndXJlZE5ldHdvcmtzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgaWYoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLm5ldHdvcmtJZCAhPSBuZXRJZCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gU3RhdHVzLkRJU0FCTEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFya0FsbE5ldHdvcmtzRGlzYWJsZWQoKSB7CisgICAgICAgIG1hcmtBbGxOZXR3b3Jrc0Rpc2FibGVkRXhjZXB0KElOVkFMSURfTkVUV09SS19JRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUlwQW5kUHJveHlDb25maWd1cmF0aW9ucygpIHsKKworICAgICAgICBEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlwQ29uZmlnRmlsZSkpKTsKKworICAgICAgICAgICAgb3V0LndyaXRlSW50KElQQ09ORklHX0ZJTEVfVkVSU0lPTik7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgICAgIGZvcihXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgOiBzQ29uZmlndXJlZE5ldHdvcmtzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd3JpdGVUb0ZpbGUgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBjb25maWcubGlua1Byb3BlcnRpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbmZpZy5pcEFzc2lnbm1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKElQX0FTU0lHTk1FTlRfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKGNvbmZpZy5pcEFzc2lnbm1lbnQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTGlua0FkZHJlc3MgbGlua0FkZHIgOiBsaW5rUHJvcGVydGllcy5nZXRMaW5rQWRkcmVzc2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihMSU5LX0FERFJFU1NfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihsaW5rQWRkci5nZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQobGlua0FkZHIuZ2V0TmV0d29ya1ByZWZpeExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBnYXRld2F5ID0gbGlua1Byb3BlcnRpZXMuZ2V0R2F0ZXdheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2F0ZXdheSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoR0FURVdBWV9LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKGdhdGV3YXkuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBpbmV0QWRkciA6IGxpbmtQcm9wZXJ0aWVzLmdldERuc2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihETlNfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihpbmV0QWRkci5nZXRIb3N0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVRvRmlsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREhDUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKElQX0FTU0lHTk1FTlRfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKGNvbmZpZy5pcEFzc2lnbm1lbnQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVG9GaWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVTkFTU0lHTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSWdub3JlIGludmFsaWQgaXAgYXNzaWdubWVudCB3aGlsZSB3cml0aW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbmZpZy5wcm94eVNldHRpbmdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFUSUM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBwcm94eVByb3BlcnRpZXMgPSBsaW5rUHJvcGVydGllcy5nZXRIdHRwUHJveHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4Y2x1c2lvbkxpc3QgPSBwcm94eVByb3BlcnRpZXMuZ2V0RXhjbHVzaW9uTGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoUFJPWFlfU0VUVElOR1NfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKGNvbmZpZy5wcm94eVNldHRpbmdzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoUFJPWFlfSE9TVF9LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYocHJveHlQcm9wZXJ0aWVzLmdldFNvY2tldEFkZHJlc3MoKS5nZXRIb3N0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKFBST1hZX1BPUlRfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KHByb3h5UHJvcGVydGllcy5nZXRTb2NrZXRBZGRyZXNzKCkuZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKEVYQ0xVU0lPTl9MSVNUX0tFWSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihleGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUb0ZpbGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihQUk9YWV9TRVRUSU5HU19LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoY29uZmlnLnByb3h5U2V0dGluZ3MudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVG9GaWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVTkFTU0lHTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSWdub3JlIGludmFsaWQgcHJveHkgc2V0dGluZ3Mgd2hpbGUgd3JpdGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZVRvRmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihJRF9LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUludChjb25maWdLZXkoY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWx1cmUgaW4gd3JpdGluZyAiICsgY29uZmlnLmxpbmtQcm9wZXJ0aWVzICsgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKEVPUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHdyaXRpbmcgZGF0YSBmaWxlIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZElwQW5kUHJveHlDb25maWd1cmF0aW9ucygpIHsKKworICAgICAgICBEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIGlwQ29uZmlnRmlsZSkpKTsKKworICAgICAgICAgICAgaWYgKGluLnJlYWRJbnQoKSAhPSBJUENPTkZJR19GSUxFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJCYWQgdmVyc2lvbiBvbiBJUCBjb25maWd1cmF0aW9uIGZpbGUsIGlnbm9yZSByZWFkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBpZCA9IC0xOworICAgICAgICAgICAgICAgIElwQXNzaWdubWVudCBpcEFzc2lnbm1lbnQgPSBJcEFzc2lnbm1lbnQuVU5BU1NJR05FRDsKKyAgICAgICAgICAgICAgICBQcm94eVNldHRpbmdzIHByb3h5U2V0dGluZ3MgPSBQcm94eVNldHRpbmdzLlVOQVNTSUdORUQ7CisgICAgICAgICAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJveHlIb3N0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgcHJveHlQb3J0ID0gLTE7CisgICAgICAgICAgICAgICAgU3RyaW5nIGV4Y2x1c2lvbkxpc3QgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyBrZXk7CisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGluLnJlYWRVVEYoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKElEX0tFWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscyhJUF9BU1NJR05NRU5UX0tFWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcEFzc2lnbm1lbnQgPSBJcEFzc2lnbm1lbnQudmFsdWVPZihpbi5yZWFkVVRGKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKExJTktfQUREUkVTU19LRVkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua0FkZHJlc3MgbGlua0FkZHIgPSBuZXcgTGlua0FkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4ucmVhZFVURigpKSwgaW4ucmVhZEludCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5hZGRMaW5rQWRkcmVzcyhsaW5rQWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoR0FURVdBWV9LRVkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuc2V0R2F0ZXdheShJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaW4ucmVhZFVURigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoRE5TX0tFWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5hZGREbnMoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGluLnJlYWRVVEYoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKFBST1hZX1NFVFRJTkdTX0tFWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVNldHRpbmdzID0gUHJveHlTZXR0aW5ncy52YWx1ZU9mKGluLnJlYWRVVEYoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoUFJPWFlfSE9TVF9LRVkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlIb3N0ID0gaW4ucmVhZFVURigpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKFBST1hZX1BPUlRfS0VZKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5UG9ydCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscyhFWENMVVNJT05fTElTVF9LRVkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9uTGlzdCA9IGluLnJlYWRVVEYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscyhFT1MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIklnbm9yZSB1bmtub3duIGtleSAiICsga2V5ICsgIndoaWxlIHJlYWRpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSWdub3JlIGludmFsaWQgYWRkcmVzcyB3aGlsZSByZWFkaW5nIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaWQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBzQ29uZmlndXJlZE5ldHdvcmtzLmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc05ldHdvcmtJZHMuZ2V0KGlkKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNvbmZpZ3VyYXRpb24gZm91bmQgZm9yIG1pc3NpbmcgbmV0d29yaywgaWdub3JlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcubGlua1Byb3BlcnRpZXMgPSBsaW5rUHJvcGVydGllczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlwQXNzaWdubWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESENQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmlwQXNzaWdubWVudCA9IGlwQXNzaWdubWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFVOQVNTSUdORUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJZ25vcmUgaW52YWxpZCBpcCBhc3NpZ25tZW50IHdoaWxlIHJlYWRpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocHJveHlTZXR0aW5ncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcm94eVNldHRpbmdzID0gcHJveHlTZXR0aW5nczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBwcm94eVByb3BlcnRpZXMgPSBuZXcgUHJveHlQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0U29ja2V0QWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKHByb3h5SG9zdCwgcHJveHlQb3J0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0RXhjbHVzaW9uTGlzdChleGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLnNldEh0dHBQcm94eShwcm94eVByb3BlcnRpZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcm94eVNldHRpbmdzID0gcHJveHlTZXR0aW5nczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFVOQVNTSUdORUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJZ25vcmUgaW52YWxpZCBwcm94eSBzZXR0aW5ncyB3aGlsZSByZWFkaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJNaXNzaW5nIGlkIHdoaWxlIHBhcnNpbmcgY29uZmlndXJhdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBwYXJzaW5nIGNvbmZpZ3VyYXRpb24iICsgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgc3VwcGxpZWQgbmV0d29ya0lkIGlzIElOVkFMSURfTkVUV09SS19JRCwgd2UgY3JlYXRlIGEgbmV3IGVtcHR5CisgICAgICAgICAqIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlLCB0aGUgbmV0d29ya0lkIHNob3VsZAorICAgICAgICAgKiByZWZlciB0byBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVGYWlsZWQgPSB0cnVlOworICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSAobmV0SWQgPT0gSU5WQUxJRF9ORVRXT1JLX0lEKTsKKyAgICAgICAgLy8gbmV0d29ya0lkIG9mIElOVkFMSURfTkVUV09SS19JRCBtZWFucyB3ZSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBuZXR3b3JrCisKKyAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKKyAgICAgICAgICAgIG5ldElkID0gV2lmaU5hdGl2ZS5hZGROZXR3b3JrQ29tbWFuZCgpOworICAgICAgICAgICAgaWYgKG5ldElkIDwgMCkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBhZGQgYSBuZXR3b3JrISIpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX05FVFdPUktfSUQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2V0VmFyaWFibGVzOiB7CisKKyAgICAgICAgICAgIGlmIChjb25maWcuU1NJRCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLlNTSUQpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBTU0lEOiAiK2NvbmZpZy5TU0lEKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25maWcuQlNTSUQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5ic3NpZFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuQlNTSUQpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBCU1NJRDogIitjb25maWcuQlNTSUQpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nID0KKyAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQga2V5X21nbXQ6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFByb3RvY29sc1N0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZFByb3RvY29scywgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRQcm90b2NvbHMuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcHJvdG86ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcywgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBhdXRoX2FsZzogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdXRoQWxnb3JpdGhtc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyA9CisgICAgICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMsCisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHBhaXJ3aXNlOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgZ3JvdXA6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0CisgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KKyAgICAgICAgICAgIGlmIChjb25maWcucHJlU2hhcmVkS2V5ICE9IG51bGwgJiYgIWNvbmZpZy5wcmVTaGFyZWRLZXkuZXF1YWxzKCIqIikgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwc2s6ICIrY29uZmlnLnByZVNoYXJlZEtleSk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGhhc1NldEtleSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZy53ZXBLZXlzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgorICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndlcEtleXNbaV0gIT0gbnVsbCAmJiAhY29uZmlnLndlcEtleXNbaV0uZXF1YWxzKCIqIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF9rZXkiK2krIjogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaGFzU2V0S2V5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhc1NldEtleSkgeworICAgICAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy53ZXBUeEtleUluZGV4KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF90eF9rZXlpZHg6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXgpOworICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcucHJpb3JpdHkpKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IHByaW9yaXR5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICArY29uZmlnLnByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25maWcuaGlkZGVuU1NJRCAmJiAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5oaWRkZW5TU0lEVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoY29uZmlnLmhpZGRlblNTSUQgPyAxIDogMCkpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgaGlkZGVuU1NJRDogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24uRW50ZXJwcmlzZUZpZWxkIGZpZWxkCisgICAgICAgICAgICAgICAgICAgIDogY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IGZpZWxkLnZhck5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWVsZC52YWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBjb25maWcuZWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSA/ICJOVUxMIiA6IGNvbnZlcnRUb1F1b3RlZFN0cmluZyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0ICIgKyB2YXJOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUZhaWxlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVwZGF0ZUZhaWxlZCkgeworICAgICAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldElkKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBhIG5ldHdvcmsgdmFyaWFibGUsIHJlbW92ZWQgbmV0d29yazogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9ORVRXT1JLX0lEOworICAgICAgICB9CisKKyAgICAgICAgLyogQW4gdXBkYXRlIG9mIHRoZSBuZXR3b3JrIHZhcmlhYmxlcyByZXF1aXJlcyByZWFkaW5nIHRoZW0KKyAgICAgICAgICogYmFjayBmcm9tIHRoZSBzdXBwbGljYW50IHRvIHVwZGF0ZSBzQ29uZmlndXJlZE5ldHdvcmtzLgorICAgICAgICAgKiBUaGlzIGlzIGJlY2F1c2Ugc29tZSBvZiB0aGUgdmFyaWFibGVzIChTU0lELCB3ZXAga2V5cyAmCisgICAgICAgICAqIHBhc3NwaHJhc2VzKSByZWZsZWN0IGRpZmZlcmVudCB2YWx1ZXMgd2hlbiByZWFkIGJhY2sgdGhhbgorICAgICAgICAgKiB3aGVuIHdyaXR0ZW4uIEZvciBleGFtcGxlLCB3ZXAga2V5IGlzIHN0b3JlZCBhcyAqIGlycmVzcGVjdGl2ZQorICAgICAgICAgKiBvZiB0aGUgdmFsdWUgc2VudCB0byB0aGUgc3VwcGxpY2FudAorICAgICAgICAgKi8KKyAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gc0NvbmZpZzsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBzQ29uZmlnID0gc0NvbmZpZ3VyZWROZXR3b3Jrcy5nZXQobmV0SWQpOworICAgICAgICB9CisgICAgICAgIGlmIChzQ29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgIHNDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIHNDb25maWcubmV0d29ya0lkID0gbmV0SWQ7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBzQ29uZmlndXJlZE5ldHdvcmtzLnB1dChuZXRJZCwgc0NvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVhZE5ldHdvcmtWYXJpYWJsZXMoc0NvbmZpZyk7CisgICAgICAgIHdyaXRlSXBBbmRQcm94eUNvbmZpZ3VyYXRpb25zT25DaGFuZ2Uoc0NvbmZpZywgY29uZmlnKTsKKyAgICAgICAgcmV0dXJuIG5ldElkOworICAgIH0KKworICAgIC8qIENvbXBhcmUgY3VycmVudCBhbmQgbmV3IGNvbmZpZ3VyYXRpb24gYW5kIHdyaXRlIHRvIGZpbGUgb24gY2hhbmdlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUlwQW5kUHJveHlDb25maWd1cmF0aW9uc09uQ2hhbmdlKFdpZmlDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcsCisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgYm9vbGVhbiBpcENoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBwcm94eUNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKworICAgICAgICBzd2l0Y2ggKG5ld0NvbmZpZy5pcEFzc2lnbm1lbnQpIHsKKyAgICAgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICAgICAgICAgIENvbGxlY3Rpb248TGlua0FkZHJlc3M+IGN1cnJlbnRMaW5rQWRkcmVzc2VzID0gY3VycmVudENvbmZpZy5saW5rUHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICAgICAgLmdldExpbmtBZGRyZXNzZXMoKTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPExpbmtBZGRyZXNzPiBuZXdMaW5rQWRkcmVzc2VzID0gbmV3Q29uZmlnLmxpbmtQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TGlua0FkZHJlc3NlcygpOworICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGN1cnJlbnREbnNlcyA9IGN1cnJlbnRDb25maWcubGlua1Byb3BlcnRpZXMuZ2V0RG5zZXMoKTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBuZXdEbnNlcyA9IG5ld0NvbmZpZy5saW5rUHJvcGVydGllcy5nZXREbnNlcygpOworICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGN1cnJlbnRHYXRld2F5ID0gY3VycmVudENvbmZpZy5saW5rUHJvcGVydGllcy5nZXRHYXRld2F5KCk7CisgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgbmV3R2F0ZXdheSA9IG5ld0NvbmZpZy5saW5rUHJvcGVydGllcy5nZXRHYXRld2F5KCk7CisKKyAgICAgICAgICAgICAgICBib29sZWFuIGxpbmtBZGRyZXNzZXNEaWZmZXIgPSAhY3VycmVudExpbmtBZGRyZXNzZXMuY29udGFpbnNBbGwobmV3TGlua0FkZHJlc3NlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50TGlua0FkZHJlc3Nlcy5zaXplKCkgIT0gbmV3TGlua0FkZHJlc3Nlcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZG5zZXNEaWZmZXIgPSAhY3VycmVudERuc2VzLmNvbnRhaW5zQWxsKG5ld0Ruc2VzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnREbnNlcy5zaXplKCkgIT0gbmV3RG5zZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGdhdGV3YXlzRGlmZmVyID0gKGN1cnJlbnRHYXRld2F5ID09IG51bGwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhY3VycmVudEdhdGV3YXkuZXF1YWxzKG5ld0dhdGV3YXkpOworCisgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50Q29uZmlnLmlwQXNzaWdubWVudCAhPSBuZXdDb25maWcuaXBBc3NpZ25tZW50KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbGlua0FkZHJlc3Nlc0RpZmZlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZG5zZXNEaWZmZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdhdGV3YXlzRGlmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGlwQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESENQOgorICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29uZmlnLmlwQXNzaWdubWVudCAhPSBuZXdDb25maWcuaXBBc3NpZ25tZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGlwQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVTkFTU0lHTkVEOgorICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJZ25vcmUgaW52YWxpZCBpcCBhc3NpZ25tZW50IGR1cmluZyB3cml0ZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChuZXdDb25maWcucHJveHlTZXR0aW5ncykgeworICAgICAgICAgICAgY2FzZSBTVEFUSUM6CisgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgbmV3U29ja0FkZHIgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyBuZXdFeGNsdXNpb25MaXN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBjdXJyZW50U29ja0FkZHIgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50RXhjbHVzaW9uTGlzdCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBQcm94eVByb3BlcnRpZXMgbmV3SHR0cFByb3h5ID0gbmV3Q29uZmlnLmxpbmtQcm9wZXJ0aWVzLmdldEh0dHBQcm94eSgpOworICAgICAgICAgICAgICAgIGlmIChuZXdIdHRwUHJveHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuZXdTb2NrQWRkciA9IG5ld0h0dHBQcm94eS5nZXRTb2NrZXRBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0V4Y2x1c2lvbkxpc3QgPSBuZXdIdHRwUHJveHkuZ2V0RXhjbHVzaW9uTGlzdCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBjdXJyZW50SHR0cFByb3h5ID0gY3VycmVudENvbmZpZy5saW5rUHJvcGVydGllcy5nZXRIdHRwUHJveHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudEh0dHBQcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTb2NrQWRkciA9ICBjdXJyZW50SHR0cFByb3h5LmdldFNvY2tldEFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEV4Y2x1c2lvbkxpc3QgPSBjdXJyZW50SHR0cFByb3h5LmdldEV4Y2x1c2lvbkxpc3QoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sZWFuIHNvY2tldEFkZHJlc3NEaWZmZXJzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBleGNsdXNpb25MaXN0RGlmZmVycyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKG5ld1NvY2tBZGRyICE9IG51bGwgJiYgY3VycmVudFNvY2tBZGRyICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldEFkZHJlc3NEaWZmZXJzID0gIWN1cnJlbnRTb2NrQWRkci5lcXVhbHMobmV3U29ja0FkZHIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U29ja0FkZHIgIT0gbnVsbCB8fCBjdXJyZW50U29ja0FkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzb2NrZXRBZGRyZXNzRGlmZmVycyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5ld0V4Y2x1c2lvbkxpc3QgIT0gbnVsbCAmJiBjdXJyZW50RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvbkxpc3REaWZmZXJzID0gIWN1cnJlbnRFeGNsdXNpb25MaXN0LmVxdWFscyhuZXdFeGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0V4Y2x1c2lvbkxpc3QgIT0gbnVsbCB8fCBjdXJyZW50RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvbkxpc3REaWZmZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRDb25maWcucHJveHlTZXR0aW5ncyAhPSBuZXdDb25maWcucHJveHlTZXR0aW5ncykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldEFkZHJlc3NEaWZmZXJzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25MaXN0RGlmZmVycykgeworICAgICAgICAgICAgICAgICAgICBwcm94eUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudENvbmZpZy5wcm94eVNldHRpbmdzICE9IG5ld0NvbmZpZy5wcm94eVNldHRpbmdzKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3h5Q2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVTkFTU0lHTkVEOgorICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJZ25vcmUgaW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uIGR1cmluZyB3cml0ZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpcENoYW5nZWQpIHsKKyAgICAgICAgICAgIGFkZElwU2V0dGluZ3NGcm9tQ29uZmlnKGxpbmtQcm9wZXJ0aWVzLCBjdXJyZW50Q29uZmlnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN1cnJlbnRDb25maWcuaXBBc3NpZ25tZW50ID0gbmV3Q29uZmlnLmlwQXNzaWdubWVudDsKKyAgICAgICAgICAgIGFkZElwU2V0dGluZ3NGcm9tQ29uZmlnKGxpbmtQcm9wZXJ0aWVzLCBuZXdDb25maWcpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAiSVAgY29uZmlnIGNoYW5nZWQgU1NJRCA9ICIgKyBjdXJyZW50Q29uZmlnLlNTSUQgKyAiIGxpbmtQcm9wZXJ0aWVzOiAiICsKKyAgICAgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworCisgICAgICAgIGlmICghcHJveHlDaGFuZ2VkKSB7CisgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5zZXRIdHRwUHJveHkoY3VycmVudENvbmZpZy5saW5rUHJvcGVydGllcy5nZXRIdHRwUHJveHkoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXJyZW50Q29uZmlnLnByb3h5U2V0dGluZ3MgPSBuZXdDb25maWcucHJveHlTZXR0aW5nczsKKyAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLnNldEh0dHBQcm94eShuZXdDb25maWcubGlua1Byb3BlcnRpZXMuZ2V0SHR0cFByb3h5KCkpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicHJveHkgY2hhbmdlZCBTU0lEID0gIiArIGN1cnJlbnRDb25maWcuU1NJRCk7CisgICAgICAgICAgICBpZiAobGlua1Byb3BlcnRpZXMuZ2V0SHR0cFByb3h5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiBwcm94eVByb3BlcnRpZXM6ICIgKyBsaW5rUHJvcGVydGllcy5nZXRIdHRwUHJveHkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpcENoYW5nZWQgfHwgcHJveHlDaGFuZ2VkKSB7CisgICAgICAgICAgICBjdXJyZW50Q29uZmlnLmxpbmtQcm9wZXJ0aWVzID0gbGlua1Byb3BlcnRpZXM7CisgICAgICAgICAgICB3cml0ZUlwQW5kUHJveHlDb25maWd1cmF0aW9ucygpOworICAgICAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRJcFNldHRpbmdzRnJvbUNvbmZpZyhMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcywKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBmb3IgKExpbmtBZGRyZXNzIGxpbmtBZGRyIDogY29uZmlnLmxpbmtQcm9wZXJ0aWVzLmdldExpbmtBZGRyZXNzZXMoKSkgeworICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuYWRkTGlua0FkZHJlc3MobGlua0FkZHIpOworICAgICAgICB9CisgICAgICAgIGxpbmtQcm9wZXJ0aWVzLnNldEdhdGV3YXkoY29uZmlnLmxpbmtQcm9wZXJ0aWVzLmdldEdhdGV3YXkoKSk7CisgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogY29uZmlnLmxpbmtQcm9wZXJ0aWVzLmdldERuc2VzKCkpIHsKKyAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLmFkZERucyhkbnMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgdmFyaWFibGVzIGZyb20gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIHRoYXQgYXJlIG5lZWRlZCB0bworICAgICAqIGZpbGwgaW4gdGhlIFdpZmlDb25maWd1cmF0aW9uIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0IHRvIGJlIGZpbGxlZCBpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWROZXR3b3JrVmFyaWFibGVzKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworCisgICAgICAgIGludCBuZXRJZCA9IGNvbmZpZy5uZXR3b3JrSWQ7CisgICAgICAgIGlmIChuZXRJZCA8IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVE9ETzogbWF5YmUgc2hvdWxkIGhhdmUgYSBuYXRpdmUgbWV0aG9kIHRoYXQgdGFrZXMgYW4gYXJyYXkgb2YKKyAgICAgICAgICogdmFyaWFibGUgbmFtZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzLiBCdXQgd2UnZCBzdGlsbAorICAgICAgICAgKiBiZSBkb2luZyBhIHJvdW5kIHRyaXAgdG8gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIGZvciBlYWNoIHZhcmlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWcuU1NJRCA9IHJlbW92ZURvdWJsZVF1b3Rlcyh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWcuU1NJRCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnLkJTU0lEID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUpOworICAgICAgICBjb25maWcucHJpb3JpdHkgPSAtMTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUpOworICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IGZhbHNlOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpICE9IDA7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ud2VwVHhLZXlJZHhWYXJOYW1lKTsKKyAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSAtMTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0pOworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZFByb3RvY29scy5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbi5FbnRlcnByaXNlRmllbGQgZmllbGQgOgorICAgICAgICAgICAgICAgIGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7CisgICAgICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgZmllbGQudmFyTmFtZSgpKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IGNvbmZpZy5lYXApIHZhbHVlID0gcmVtb3ZlRG91YmxlUXVvdGVzKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRG91YmxlUXVvdGVzKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgaWYgKHN0cmluZy5sZW5ndGgoKSA8PSAyKSByZXR1cm4gIiI7CisgICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEsIHN0cmluZy5sZW5ndGgoKSAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9RdW90ZWRTdHJpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gIlwiIiArIHN0cmluZyArICJcIiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTdHJpbmcoQml0U2V0IHNldCwgU3RyaW5nW10gc3RyaW5ncykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpbnQgbmV4dFNldEJpdCA9IC0xOworCisgICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgc2V0IGJpdHMgYXJlIGluIFswLCBzdHJpbmdzLmxlbmd0aCkgdG8gYXZvaWQKKyAgICAgICAgICogZ29pbmcgb3V0IG9mIGJvdW5kcyBvbiBzdHJpbmdzLiAgKFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLikgKi8KKyAgICAgICAgc2V0ID0gc2V0LmdldCgwLCBzdHJpbmdzLmxlbmd0aCk7CisKKyAgICAgICAgd2hpbGUgKChuZXh0U2V0Qml0ID0gc2V0Lm5leHRTZXRCaXQobmV4dFNldEJpdCArIDEpKSAhPSAtMSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChzdHJpbmdzW25leHRTZXRCaXRdLnJlcGxhY2UoJ18nLCAnLScpKS5hcHBlbmQoJyAnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZQorICAgICAgICBpZiAoc2V0LmNhcmRpbmFsaXR5KCkgPiAwKSB7CisgICAgICAgICAgICBidWYuc2V0TGVuZ3RoKGJ1Zi5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBsb29rdXBTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nW10gc3RyaW5ncykgeworICAgICAgICBpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOworCisgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCctJywgJ18nKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKHN0cmluZ3NbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworCisgICAgICAgIC8vIGlmIHdlIGV2ZXIgZ2V0IGhlcmUsIHdlIHNob3VsZCBwcm9iYWJseSBhZGQgdGhlCisgICAgICAgIC8vIHZhbHVlIHRvIFdpZmlDb25maWd1cmF0aW9uIHRvIHJlZmxlY3QgdGhhdCBpdCdzCisgICAgICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQKKyAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGxvb2stdXAgYSBzdHJpbmc6ICIgKyBzdHJpbmcpOworCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBSZXR1cm5zIGEgdW5pcXVlIGZvciBhIGdpdmVuIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY29uZmlnS2V5KFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBTdHJpbmcga2V5OworCisgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuZ2V0KEtleU1nbXQuV1BBX1BTSykpIHsKKyAgICAgICAgICAgIGtleSA9IGNvbmZpZy5TU0lEICsgS2V5TWdtdC5zdHJpbmdzW0tleU1nbXQuV1BBX1BTS107CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LmdldChLZXlNZ210LldQQV9FQVApIHx8CisgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LmdldChLZXlNZ210LklFRUU4MDIxWCkpIHsKKyAgICAgICAgICAgIGtleSA9IGNvbmZpZy5TU0lEICsgS2V5TWdtdC5zdHJpbmdzW0tleU1nbXQuV1BBX0VBUF07CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLndlcEtleXNbMF0gIT0gbnVsbCkgeworICAgICAgICAgICAga2V5ID0gY29uZmlnLlNTSUQgKyAiV0VQIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGtleSA9IGNvbmZpZy5TU0lEICsgS2V5TWdtdC5zdHJpbmdzW0tleU1nbXQuTk9ORV07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ga2V5Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBkdW1wKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJzTGFzdFByaW9yaXR5ICIpLmFwcGVuZChzTGFzdFByaW9yaXR5KS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIkNvbmZpZ3VyZWQgbmV0d29ya3MgIikuYXBwZW5kKExTKTsKKyAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbiBjb25mIDogZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb25mKS5hcHBlbmQoTFMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDAxYmM5MTkuLmQ1ZmI2M2UgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiAKQEAgLTQyLDYgKzQzLDggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBwcmlvcml0eVZhck5hbWUgPSAicHJpb3JpdHkiOwogICAgIC8qKiB7QGhpZGV9ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgaGlkZGVuU1NJRFZhck5hbWUgPSAic2Nhbl9zc2lkIjsKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTkVUV09SS19JRCA9IC0xOwogCiAgICAgLyoqIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgY2xhc3MgRW50ZXJwcmlzZUZpZWxkIHsKQEAgLTIxNiw3ICsyMTksNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBuZXR3b3JrJ3MgU1NJRC4gQ2FuIGVpdGhlciBiZSBhbiBBU0NJSSBzdHJpbmcsCiAgICAgICogd2hpY2ggbXVzdCBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGF0aW9uIG1hcmtzCi0gICAgICogKGUuZy4sIHtAY29kZSAmcXVvdDtNeU5ldHdvcmsmcXVvdDt9LCBvciBhIHN0cmluZyBvZgorICAgICAqIChlLmcuLCB7QGNvZGUgIk15TmV0d29yayJ9LCBvciBhIHN0cmluZyBvZgogICAgICAqIGhleCBkaWdpdHMsd2hpY2ggYXJlIG5vdCBlbmNsb3NlZCBpbiBxdW90ZXMKICAgICAgKiAoZS5nLiwge0Bjb2RlIDAxYTI0M2Y0MDV9KS4KICAgICAgKi8KQEAgLTIzOSw3ICsyNDIsNyBAQAogICAgIHB1YmxpYyBTdHJpbmcgcHJlU2hhcmVkS2V5OwogICAgIC8qKgogICAgICAqIFVwIHRvIGZvdXIgV0VQIGtleXMuIEVpdGhlciBhbiBBU0NJSSBzdHJpbmcgZW5jbG9zZWQgaW4gZG91YmxlCi0gICAgICogcXVvdGF0aW9uIG1hcmtzIChlLmcuLCB7QGNvZGUgJnF1b3Q7YWJjZGVmJnF1b3Q7fSBvciBhIHN0cmluZworICAgICAqIHF1b3RhdGlvbiBtYXJrcyAoZS5nLiwge0Bjb2RlICJhYmNkZWYifSBvciBhIHN0cmluZwogICAgICAqIG9mIGhleCBkaWdpdHMgKGUuZy4sIHtAY29kZSAwMTAyMDMwNDA1fSkuCiAgICAgICogPHAvPgogICAgICAqIFdoZW4gdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGVzZSBrZXlzIGlzIHJlYWQsIHRoZSBhY3R1YWwga2V5IGlzCkBAIC0yOTQsOSArMjk3LDQ5IEBACiAgICAgICovCiAgICAgcHVibGljIEJpdFNldCBhbGxvd2VkR3JvdXBDaXBoZXJzOwogCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBJcEFzc2lnbm1lbnQgeworICAgICAgICAvKiBVc2Ugc3RhdGljYWxseSBjb25maWd1cmVkIElQIHNldHRpbmdzLiBDb25maWd1cmF0aW9uIGNhbiBiZSBhY2Nlc3NlZAorICAgICAgICAgKiB3aXRoIGxpbmtQcm9wZXJ0aWVzICovCisgICAgICAgIFNUQVRJQywKKyAgICAgICAgLyogVXNlIGR5bmFtaWNhbGx5IGNvbmZpZ3VyZWQgSVAgc2V0dGlnbnMgKi8KKyAgICAgICAgREhDUCwKKyAgICAgICAgLyogbm8gSVAgZGV0YWlscyBhcmUgYXNzaWduZWQsIHRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZQorICAgICAgICAgKiB0aGF0IGFueSBleGlzdGluZyBJUCBzZXR0aW5ncyBzaG91bGQgYmUgcmV0YWluZWQgKi8KKyAgICAgICAgVU5BU1NJR05FRAorICAgIH0KKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBJcEFzc2lnbm1lbnQgaXBBc3NpZ25tZW50OworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBQcm94eVNldHRpbmdzIHsKKyAgICAgICAgLyogTm8gcHJveHkgaXMgdG8gYmUgdXNlZC4gQW55IGV4aXN0aW5nIHByb3h5IHNldHRpbmdzCisgICAgICAgICAqIHNob3VsZCBiZSBjbGVhcmVkLiAqLworICAgICAgICBOT05FLAorICAgICAgICAvKiBVc2Ugc3RhdGljYWxseSBjb25maWd1cmVkIHByb3h5LiBDb25maWd1cmF0aW9uIGNhbiBiZSBhY2Nlc3NlZAorICAgICAgICAgKiB3aXRoIGxpbmtQcm9wZXJ0aWVzICovCisgICAgICAgIFNUQVRJQywKKyAgICAgICAgLyogbm8gcHJveHkgZGV0YWlscyBhcmUgYXNzaWduZWQsIHRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZQorICAgICAgICAgKiB0aGF0IGFueSBleGlzdGluZyBwcm94eSBzZXR0aW5ncyBzaG91bGQgYmUgcmV0YWluZWQgKi8KKyAgICAgICAgVU5BU1NJR05FRAorICAgIH0KKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBQcm94eVNldHRpbmdzIHByb3h5U2V0dGluZ3M7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXM7CiAKICAgICBwdWJsaWMgV2lmaUNvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIG5ldHdvcmtJZCA9IC0xOworICAgICAgICBuZXR3b3JrSWQgPSBJTlZBTElEX05FVFdPUktfSUQ7CiAgICAgICAgIFNTSUQgPSBudWxsOwogICAgICAgICBCU1NJRCA9IG51bGw7CiAgICAgICAgIHByaW9yaXR5ID0gMDsKQEAgLTMxMiw2ICszNTUsOSBAQAogICAgICAgICBmb3IgKEVudGVycHJpc2VGaWVsZCBmaWVsZCA6IGVudGVycHJpc2VGaWVsZHMpIHsKICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKG51bGwpOwogICAgICAgICB9CisgICAgICAgIGlwQXNzaWdubWVudCA9IElwQXNzaWdubWVudC5VTkFTU0lHTkVEOworICAgICAgICBwcm94eVNldHRpbmdzID0gUHJveHlTZXR0aW5ncy5VTkFTU0lHTkVEOworICAgICAgICBsaW5rUHJvcGVydGllcyA9IG5ldyBMaW5rUHJvcGVydGllcygpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0zOTMsNiArNDM5LDEzIEBACiAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgc2J1Zi5hcHBlbmQodmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIHNidWYuYXBwZW5kKCdcbicpOworICAgICAgICBzYnVmLmFwcGVuZCgiSVAgYXNzaWdubWVudDogIiArIGlwQXNzaWdubWVudC50b1N0cmluZygpKTsKKyAgICAgICAgc2J1Zi5hcHBlbmQoIlxuIik7CisgICAgICAgIHNidWYuYXBwZW5kKCJQcm94eSBzZXR0aW5nczogIiArIHByb3h5U2V0dGluZ3MudG9TdHJpbmcoKSk7CisgICAgICAgIHNidWYuYXBwZW5kKCJcbiIpOworICAgICAgICBzYnVmLmFwcGVuZChsaW5rUHJvcGVydGllcy50b1N0cmluZygpKTsKKyAgICAgICAgc2J1Zi5hcHBlbmQoIlxuIik7CisKICAgICAgICAgcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKICAgICB9CiAKQEAgLTQzMiw2ICs0ODUsMzcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgLyoqIGNvcHkgY29uc3RydWN0b3Ige0BoaWRlfSAqLworICAgIHB1YmxpYyBXaWZpQ29uZmlndXJhdGlvbihXaWZpQ29uZmlndXJhdGlvbiBzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXR3b3JrSWQgPSBzb3VyY2UubmV0d29ya0lkOworICAgICAgICAgICAgc3RhdHVzID0gc291cmNlLnN0YXR1czsKKyAgICAgICAgICAgIFNTSUQgPSBzb3VyY2UuU1NJRDsKKyAgICAgICAgICAgIEJTU0lEID0gc291cmNlLkJTU0lEOworICAgICAgICAgICAgcHJlU2hhcmVkS2V5ID0gc291cmNlLnByZVNoYXJlZEtleTsKKworICAgICAgICAgICAgd2VwS2V5cyA9IG5ldyBTdHJpbmdbNF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdlcEtleXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgd2VwS2V5c1tpXSA9IHNvdXJjZS53ZXBLZXlzW2ldOworCisgICAgICAgICAgICB3ZXBUeEtleUluZGV4ID0gc291cmNlLndlcFR4S2V5SW5kZXg7CisgICAgICAgICAgICBwcmlvcml0eSA9IHNvdXJjZS5wcmlvcml0eTsKKyAgICAgICAgICAgIGhpZGRlblNTSUQgPSBzb3VyY2UuaGlkZGVuU1NJRDsKKyAgICAgICAgICAgIGFsbG93ZWRLZXlNYW5hZ2VtZW50ICAgPSAoQml0U2V0KSBzb3VyY2UuYWxsb3dlZEtleU1hbmFnZW1lbnQuY2xvbmUoKTsKKyAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHMgICAgICAgPSAoQml0U2V0KSBzb3VyY2UuYWxsb3dlZFByb3RvY29scy5jbG9uZSgpOworICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zICA9IChCaXRTZXQpIHNvdXJjZS5hbGxvd2VkQXV0aEFsZ29yaXRobXMuY2xvbmUoKTsKKyAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnMgPSAoQml0U2V0KSBzb3VyY2UuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5jbG9uZSgpOworICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVycyAgICA9IChCaXRTZXQpIHNvdXJjZS5hbGxvd2VkR3JvdXBDaXBoZXJzLmNsb25lKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlLmVudGVycHJpc2VGaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBlbnRlcnByaXNlRmllbGRzW2ldLnNldFZhbHVlKHNvdXJjZS5lbnRlcnByaXNlRmllbGRzW2ldLnZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXBBc3NpZ25tZW50ID0gc291cmNlLmlwQXNzaWdubWVudDsKKyAgICAgICAgICAgIHByb3h5U2V0dGluZ3MgPSBzb3VyY2UucHJveHlTZXR0aW5nczsKKyAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKHNvdXJjZS5saW5rUHJvcGVydGllcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZSB7QGhpZGV9ICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQobmV0d29ya0lkKTsKQEAgLTQ1NCw2ICs1MzgsOSBAQAogICAgICAgICBmb3IgKEVudGVycHJpc2VGaWVsZCBmaWVsZCA6IGVudGVycHJpc2VGaWVsZHMpIHsKICAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcoZmllbGQudmFsdWUoKSk7CiAgICAgICAgIH0KKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhpcEFzc2lnbm1lbnQubmFtZSgpKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhwcm94eVNldHRpbmdzLm5hbWUoKSk7CisgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKGxpbmtQcm9wZXJ0aWVzLCBmbGFncyk7CiAgICAgfQogCiAgICAgLyoqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2Uge0BoaWRlfSAqLwpAQCAtNDgwLDYgKzU2NywxMCBAQAogICAgICAgICAgICAgICAgIGZvciAoRW50ZXJwcmlzZUZpZWxkIGZpZWxkIDogY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0VmFsdWUoaW4ucmVhZFN0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25maWcuaXBBc3NpZ25tZW50ID0gSXBBc3NpZ25tZW50LnZhbHVlT2YoaW4ucmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBjb25maWcucHJveHlTZXR0aW5ncyA9IFByb3h5U2V0dGluZ3MudmFsdWVPZihpbi5yZWFkU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGNvbmZpZy5saW5rUHJvcGVydGllcyA9IGluLnJlYWRQYXJjZWxhYmxlKG51bGwpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlci5qYXZhCmluZGV4IGY4ODM1ODguLjBiM2E3ODIgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1hbmFnZXIuamF2YQpAQCAtMTY2LDcgKzE2Niw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRElTQUJMSU5HID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0RJU0FCTElORyA9IDEwOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGRpc2FibGVkLgogICAgICAqCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCA9IDExOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGN1cnJlbnRseSBiZWluZyBlbmFibGVkLiBUaGUgc3RhdGUgd2lsbCBjaGFuZ2UgdG8KICAgICAgKiB7QGxpbmsgI1dJRklfQVBfU1RBVEVfRU5BQkxFRH0gaWYgaXQgZmluaXNoZXMgc3VjY2Vzc2Z1bGx5LgpAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxJTkcgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxJTkcgPSAxMjsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBlbmFibGVkLgogICAgICAqCkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9FTkFCTEVEID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0VOQUJMRUQgPSAxMzsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBpbiBhIGZhaWxlZCBzdGF0ZS4gVGhpcyBzdGF0ZSB3aWxsIG9jY3VyIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZwogICAgICAqIGVuYWJsaW5nIG9yIGRpc2FibGluZwpAQCAtMjA0LDcgKzIwNCw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRkFJTEVEID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCA9IDE0OwogCiAgICAgLyoqCiAgICAgICogQnJvYWRjYXN0IGludGVudCBhY3Rpb24gaW5kaWNhdGluZyB0aGF0IGEgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudCBoYXMKQEAgLTI3NSw3ICsyNzUsMTQgQEAKICAgICAgKiBAc2VlICNFUlJPUl9BVVRIRU5USUNBVElORwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NVUFBMSUNBTlRfRVJST1IgPSAic3VwcGxpY2FudEVycm9yIjsKLQorICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBpbnRlbnQgYWN0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgc3VwcGxpY2FudCBjb25maWd1cmF0aW9uIGNoYW5nZWQuCisgICAgICogVGhpcyBjYW4gYmUgYXMgYSByZXN1bHQgb2YgYWRkaW5nL3VwZGF0aW5nL2RlbGV0aW5nIGEgbmV0d29yaworICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQTElDQU5UX0NPTkZJR19DSEFOR0VEX0FDVElPTiA9CisgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLnN1cHBsaWNhbnQuQ09ORklHX0NIQU5HRSI7CiAgICAgLyoqCiAgICAgICogQW4gYWNjZXNzIHBvaW50IHNjYW4gaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBzdXBwbGljYW50LgogICAgICAqIENhbGwge0BsaW5rICNnZXRTY2FuUmVzdWx0cygpfSB0byBvYnRhaW4gdGhlIHJlc3VsdHMuCkBAIC0yOTQsMTEgKzMwMSwzNSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05FV19SU1NJID0gIm5ld1Jzc2kiOwogCiAgICAgLyoqCisgICAgICogQnJvYWRjYXN0IGludGVudCBhY3Rpb24gaW5kaWNhdGluZyB0aGF0IHRoZSBJUCBjb25maWd1cmF0aW9uCisgICAgICogY2hhbmdlZCBvbiB3aWZpLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfQ0hBTkdFRF9BQ1RJT04gPSAiYW5kcm9pZC5uZXQud2lmaS5DT05GSUdfQ0hBTkdFRCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9va3VwIGtleSBmb3IgYSB7QGxpbmsgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXN9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogV2ktRmkgbmV0d29yay4gUmV0cmlldmUgd2l0aAorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I2dldFBhcmNlbGFibGVFeHRyYShTdHJpbmcpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0xJTktfUFJPUEVSVElFUyA9ICJsaW5rUHJvcGVydGllcyI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9va3VwIGtleSBmb3IgYSB7QGxpbmsgYW5kcm9pZC5uZXQuTGlua0NhcGFiaWxpdGllc30gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBXaS1GaSBuZXR3b3JrLiBSZXRyaWV2ZSB3aXRoCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjZ2V0UGFyY2VsYWJsZUV4dHJhKFN0cmluZyl9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTElOS19DQVBBQklMSVRJRVMgPSAibGlua0NhcGFiaWxpdGllcyI7CisKKyAgICAvKioKICAgICAgKiBUaGUgbmV0d29yayBJRHMgb2YgdGhlIGNvbmZpZ3VyZWQgbmV0d29ya3MgY291bGQgaGF2ZSBjaGFuZ2VkLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19JRFNfQ0hBTkdFRF9BQ1RJT04gPSAiYW5kcm9pZC5uZXQud2lmaS5ORVRXT1JLX0lEU19DSEFOR0VEIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IEFjdGlvbjogUGljayBhIFdpLUZpIG5ldHdvcmsgdG8gY29ubmVjdCB0by4KICAgICAgKiA8cD5JbnB1dDogTm90aGluZy4KQEAgLTMwOCwxNiArMzM5LDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUElDS19XSUZJX05FVFdPUksgPSAiYW5kcm9pZC5uZXQud2lmaS5QSUNLX1dJRklfTkVUV09SSyI7CiAKICAgICAvKioKLSAgICAgKiBJbiB0aGlzIFdpLUZpIGxvY2sgbW9kZSwgV2ktRmkgd2lsbCBiZWhhdmUgYXMgaW4gdGhlIG1vZGUKLSAgICAgKiB7QGxpbmsgI1dJRklfTU9ERV9GVUxMfSBidXQgaXQgb3BlcmF0ZXMgYXQgaGlnaCBwZXJmb3JtYW5jZQotICAgICAqIGF0IHRoZSBleHBlbnNlIG9mIHBvd2VyLiBUaGlzIG1vZGUgc2hvdWxkIGJlIHVzZWQKLSAgICAgKiBvbmx5IHdoZW4gdGhlIHdpZmkgY29ubmVjdGlvbiBuZWVkcyB0byBoYXZlIG1pbmltdW0gbG9zcyBhbmQgbG93Ci0gICAgICogbGF0ZW5jeSBhcyBpdCBjYW4gaW1wYWN0IHRoZSBiYXR0ZXJ5IGxpZmUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX01PREVfRlVMTF9ISUdIX1BFUkYgPSAzOwotCi0gICAgLyoqCiAgICAgICogSW4gdGhpcyBXaS1GaSBsb2NrIG1vZGUsIFdpLUZpIHdpbGwgYmUga2VwdCBhY3RpdmUsCiAgICAgICogYW5kIHdpbGwgYmVoYXZlIG5vcm1hbGx5LCBpLmUuLCBpdCB3aWxsIGF0dGVtcHQgdG8gYXV0b21hdGljYWxseQogICAgICAqIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYSByZW1lbWJlcmVkIGFjY2VzcyBwb2ludCB0aGF0IGlzCkBAIC01MTMsNyArNTM0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC01MjcsNyArNTQ5LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UucmVjb25uZWN0KCk7CisgICAgICAgICAgICBtU2VydmljZS5yZWNvbm5lY3QoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC01NDEsNyArNTY0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWFzc29jaWF0ZSgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5yZWFzc29jaWF0ZSgpOworICAgICAgICAgICAgbVNlcnZpY2UucmVhc3NvY2lhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC03NTYsOCArNzgwLDkgQEAKICAgICAgICAgfSBlbHNlIGlmIChyc3NpID49IE1BWF9SU1NJKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVtTGV2ZWxzIC0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBwYXJ0aXRpb25TaXplID0gKE1BWF9SU1NJIC0gTUlOX1JTU0kpIC8gKG51bUxldmVscyAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIChyc3NpIC0gTUlOX1JTU0kpIC8gcGFydGl0aW9uU2l6ZTsKKyAgICAgICAgICAgIGZsb2F0IGlucHV0UmFuZ2UgPSAoTUFYX1JTU0kgLSBNSU5fUlNTSSk7CisgICAgICAgICAgICBmbG9hdCBvdXRwdXRSYW5nZSA9IChudW1MZXZlbHMgLSAxKTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSgoZmxvYXQpKHJzc2kgLSBNSU5fUlNTSSkgKiBvdXRwdXRSYW5nZSAvIGlucHV0UmFuZ2UpOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAtODUxLDYgKzg3NiwxOTIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgLyoqCisgICAgICogU3RhcnQgdGhlIGRyaXZlciBhbmQgY29ubmVjdCB0byBuZXR3b3JrLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXItcmlkZSBXaWZpTG9jayBhbmQgZGV2aWNlIGlkbGUgc3RhdHVzLiBGb3IgZXhhbXBsZSwKKyAgICAgKiBldmVuIGlmIHRoZSBkZXZpY2UgaXMgaWRsZSBvciB0aGVyZSBpcyBvbmx5IGEgc2Nhbi1vbmx5IGxvY2sgaGVsZCwKKyAgICAgKiBhIHN0YXJ0IHdpZmkgd291bGQgbWVhbiB0aGF0IHdpZmkgY29ubmVjdGlvbiBpcyBrZXB0IGFjdGl2ZSB1bnRpbAorICAgICAqIGEgc3RvcFdpZmkoKSBpcyBzZW50LgorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpU3RhdGVUcmFja2VyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRXaWZpKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc3RhcnRXaWZpKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsgKGlmIGFueSkgYW5kIHN0b3AgdGhlIGRyaXZlci4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyLXJpZGUgV2lmaUxvY2sgYW5kIGRldmljZSBpZGxlIHN0YXR1cy4gV2ktRmkKKyAgICAgKiBzdGF5cyBpbmFjdGl2ZSB1bnRpbCBhIHN0YXJ0V2lmaSgpIGlzIGlzc3VlZC4KKyAgICAgKgorICAgICAqIFRoaXMgQVBJIGlzIHVzZWQgYnkgV2lmaVN0YXRlVHJhY2tlcgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBlbHNlIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0b3BXaWZpKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc3RvcFdpZmkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgYnNzaWQgdG8gdGhlIHN1cHBsaWNhbnQgYmxhY2tsaXN0CisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlXYXRjaGRvZ1NlcnZpY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmFkZFRvQmxhY2tsaXN0KGJzc2lkKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIHN1cHBsaWNhbnQgYmxhY2tsaXN0CisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlXYXRjaGRvZ1NlcnZpY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjbGVhckJsYWNrbGlzdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmNsZWFyQmxhY2tsaXN0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRPRE86IGRlcHJlY2F0ZSBzeW5jaHJvbm91cyBBUEkgYW5kIG9wZW4gdXAgdGhlIGZvbGxvd2luZyBBUEkgKi8KKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIGEgbmV0d29yayB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBUaGUgbmV0d29yayBhbHNvCisgICAgICogZ2V0cyBhZGRlZCB0byB0aGUgc3VwcGxpY2FudCBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogRm9yIGEgbmV3IG5ldHdvcmssIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIGEKKyAgICAgKiBzZXF1ZW5jZSBvZiBhZGROZXR3b3JrKCksIGVuYWJsZU5ldHdvcmsoKSwgc2F2ZUNvbmZpZ3VyYXRpb24oKSBhbmQKKyAgICAgKiByZWNvbm5lY3QoKQorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjb25maWd1cmF0aW9uLAorICAgICAqICAgICAgICAgICAgY29udGFpbmVkIGluIGEge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmNvbm5lY3ROZXR3b3JrV2l0aENvbmZpZyhjb25maWcpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byBhIG5ldHdvcmsgd2l0aCB0aGUgZ2l2ZW4gbmV0d29ya0lkLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYSBlbmFibGVOZXR3b3JrKCksIHNhdmVDb25maWd1cmF0aW9uKCkgYW5kCisgICAgICogcmVjb25uZWN0KCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIG5ldHdvcmsgaWQgaWRlbnRpZml5aW5nIHRoZSBuZXR3b3JrIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHN1cHBsaWNhbnQgY29uZmlndXJhdGlvbiBsaXN0CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhpbnQgbmV0d29ya0lkKSB7CisgICAgICAgIGlmIChuZXR3b3JrSWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmNvbm5lY3ROZXR3b3JrV2l0aElkKG5ldHdvcmtJZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7IH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBnaXZlbiBuZXR3b3JrIGluIHRoZSBzdXBwbGljYW50IGNvbmZpZy4gSWYgdGhlIG5ldHdvcmsgYWxyZWFkeQorICAgICAqIGV4aXN0cywgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdXBkYXRlZC4gQSBuZXcgbmV0d29yayBpcyBlbmFibGVkCisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEZvciBhIG5ldyBuZXR3b3JrLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBhCisgICAgICogc2VxdWVuY2Ugb2YgYWRkTmV0d29yaygpLCBlbmFibGVOZXR3b3JrKCkgYW5kIHNhdmVDb25maWd1cmF0aW9uKCkuCisgICAgICoKKyAgICAgKiBGb3IgYW4gZXhpc3RpbmcgbmV0d29yaywgaXQgYWNjb21wbGlzaGVzIHRoZSB0YXNrIG9mIHVwZGF0ZU5ldHdvcmsoKQorICAgICAqIGFuZCBzYXZlQ29uZmlndXJhdGlvbigpCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBzZXQgb2YgdmFyaWFibGVzIHRoYXQgZGVzY3JpYmUgdGhlIGNvbmZpZ3VyYXRpb24sCisgICAgICogICAgICAgICAgICBjb250YWluZWQgaW4gYSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc2F2ZU5ldHdvcmsoY29uZmlnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgbmV0d29yayBpbiB0aGUgc3VwcGxpY2FudCBjb25maWcuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHNlcXVlbmNlIG9mIHJlbW92ZU5ldHdvcmsoKQorICAgICAqIGFuZCBzYXZlQ29uZmlndXJhdGlvbigpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjb25maWd1cmF0aW9uLAorICAgICAqICAgICAgICAgICAgY29udGFpbmVkIGluIGEge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmb3JnZXROZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICBpZiAobmV0SWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmZvcmdldE5ldHdvcmsobmV0SWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgV2ktZmkgcHJvdGVjdGVkIHNldHVwIHB1c2ggYnV0dG9uIENvbmZpZ3VyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBic3NpZCBCU1NJRCBvZiB0aGUgYWNjZXNzIHBvaW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFdwc1BiYyhTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0YXJ0V3BzUGJjKGJzc2lkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IFdpLWZpIFByb3RlY3RlZCBTZXR1cCBwaW4gbWV0aG9kIGNvbmZpZ3VyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBic3NpZCBCU1NJRCBvZiB0aGUgYWNjZXNzIHBvaW50CisgICAgICogQHBhcmFtIGFwUGluIFBJTiBpc3N1ZWQgYnkgdGhlIGFjY2VzcyBwb2ludAorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFdwc1BpbihTdHJpbmcgYnNzaWQsIGludCBhcFBpbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc3RhcnRXcHNQaW4oYnNzaWQsIGFwUGluKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBrZWVwIHRoZSBXaS1GaSByYWRpbyBhd2FrZS4KICAgICAgKiBOb3JtYWxseSB0aGUgV2ktRmkgcmFkaW8gbWF5IHR1cm4gb2ZmIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCB1c2VkIHRoZSBkZXZpY2UgaW4gYSB3aGlsZS4KQEAgLTEwMzMsOSArMTI0NCw4IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBXaWZpTG9jay4KICAgICAgKgotICAgICAqIEBwYXJhbSBsb2NrVHlwZSB0aGUgdHlwZSBvZiBsb2NrIHRvIGNyZWF0ZS4gU2VlIHtAbGluayAjV0lGSV9NT0RFX0ZVTEx9LAotICAgICAqIGFuZCB7QGxpbmsgI1dJRklfTU9ERV9TQ0FOX09OTFl9IGZvciBkZXNjcmlwdGlvbnMgb2YgdGhlIHR5cGVzIG9mIFdpLUZpIGxvY2tzLgotICAgICAqCisgICAgICogQHBhcmFtIGxvY2tUeXBlIHRoZSB0eXBlIG9mIGxvY2sgdG8gY3JlYXRlLiBTZWUge0BsaW5rICNXSUZJX01PREVfRlVMTH0gYW5kCisgICAgICoge0BsaW5rICNXSUZJX01PREVfU0NBTl9PTkxZfSBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZSB0eXBlcyBvZiBXaS1GaSBsb2Nrcy4KICAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIGZvciB0aGUgV2lmaUxvY2sgdG8gaWRlbnRpZnkgaXQgaW4gZGVidWdnaW5nIG1lc3NhZ2VzLiAgVGhpcyBzdHJpbmcgaXMgCiAgICAgICogICAgICAgICAgICBuZXZlciBzaG93biB0byB0aGUgdXNlciB1bmRlciBub3JtYWwgY29uZGl0aW9ucywgYnV0IHNob3VsZCBiZSBkZXNjcmlwdGl2ZSAKICAgICAgKiAgICAgICAgICAgIGVub3VnaCB0byBpZGVudGlmeSB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGUgc3BlY2lmaWMgV2lmaUxvY2sgd2l0aGluIGl0LCBpZiBpdApkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yLmphdmEKaW5kZXggMjY2ZDgwMS4uYWYzMTMyZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhCkBAIC0xOSwxNCArMTksMTMgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKIAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogCiAvKioKICAqIExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHRoZSB3cGFfc3VwcGxpY2FudCBzZXJ2ZXIsIGFuZCBwYXNzZXMgdGhlbSBvbgotICogdG8gdGhlIHtAbGluayBXaWZpU3RhdGVUcmFja2VyfSBmb3IgaGFuZGxpbmcuIFJ1bnMgaW4gaXRzIG93biB0aHJlYWQuCisgKiB0byB0aGUge0BsaW5rIFdpZmlTdGF0ZU1hY2hpbmV9IGZvciBoYW5kbGluZy4gUnVucyBpbiBpdHMgb3duIHRocmVhZC4KICAqCiAgKiBAaGlkZQogICovCkBAIC0xMTcsNyArMTE2LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIG1Db25uZWN0ZWRFdmVudFBhdHRlcm4gPQogICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIigoPzpbMC05YS1mXXsyfTopezV9WzAtOWEtZl17Mn0pIC4qIFxcW2lkPShbMC05XSspICIpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOworICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlTWFjaGluZSBtV2lmaVN0YXRlTWFjaGluZTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBzdXBwbGljYW50IGNvbm5lY3Rpb24gZm9yIHRoZSBtb25pdG9yIGlzIGNsb3NlZApAQCAtMTM5LDMxICsxMzgsMjcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFQ1ZfRVJST1JTICAgID0gMTA7CiAKLSAgICBwdWJsaWMgV2lmaU1vbml0b3IoV2lmaVN0YXRlVHJhY2tlciB0cmFja2VyKSB7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyID0gdHJhY2tlcjsKKyAgICBwdWJsaWMgV2lmaU1vbml0b3IoV2lmaVN0YXRlTWFjaGluZSB3aWZpU3RhdGVNYWNoaW5lKSB7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lID0gd2lmaVN0YXRlTWFjaGluZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKSB7CiAgICAgICAgIG5ldyBNb25pdG9yVGhyZWFkKCkuc3RhcnQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgTmV0d29ya1N0YXRlVHJhY2tlciBnZXROZXR3b3JrU3RhdGVUcmFja2VyKCkgewotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXI7Ci0gICAgfQotCiAgICAgY2xhc3MgTW9uaXRvclRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgICAgIHB1YmxpYyBNb25pdG9yVGhyZWFkKCkgewogICAgICAgICAgICAgc3VwZXIoIldpZmlNb25pdG9yIik7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogCiAgICAgICAgICAgICBpZiAoY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gU2VuZCBhIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IGl0IGlzIG5vdyBwb3NzaWJsZSB0byBzZW5kIGNvbW1hbmRzCiAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHN1cHBsaWNhbnQKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTdXBwbGljYW50Q29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTI1OSw3ICsyNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IGFuZCBleGl0Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50KGV2ZW50LCBldmVudERhdGEpOwpAQCAtMjcyLDcgKzI2Nyw3IEBACiAgICAgICAgICAgICBpbnQgY29ubmVjdFRyaWVzID0gMDsKIAogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlTdGF0ZVRyYWNrZXIuY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKFdpZmlOYXRpdmUuY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdFRyaWVzKysgPCAzKSB7CkBAIC0yODUsNyArMjgwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURyaXZlckV2ZW50KFN0cmluZyBzdGF0ZSkgewpAQCAtMjkzLDExICsyODgsMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKCJTVE9QUEVEIikpIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlEcml2ZXJTdG9wcGVkKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVyU3RvcHBlZCgpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoIlNUQVJURUQiKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeURyaXZlclN0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlEcml2ZXJTdGFydGVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmVxdWFscygiSEFOR0VEIikpIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlEcml2ZXJIdW5nKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVySHVuZygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMxOCw3ICszMTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTOgotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgVU5LTk9XTjoKQEAgLTM3NSw3ICszNzAsNyBAQAogICAgICAgICAgICAgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuSU5WQUxJRCkgewogICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkludmFsaWQgc3VwcGxpY2FudCBzdGF0ZTogIiArIG5ld1N0YXRlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN0YXRlQ2hhbmdlKG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N1cHBsaWNhbnRTdGF0ZSk7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTdXBwbGljYW50U3RhdGVDaGFuZ2UobmV0d29ya0lkLCBCU1NJRCwgbmV3U3VwcGxpY2FudFN0YXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzk1LDcgKzM5MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN0YXRlQ2hhbmdlKG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5TmV0d29ya1N0YXRlQ2hhbmdlKG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YQppbmRleCAyNWYwNWMwLi4xMjUxYTI1IDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhCkBAIC00MSw2ICs0MSw4IEBACiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgU3RyaW5nIGdldEVycm9yU3RyaW5nKGludCBlcnJvckNvZGUpOwogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBsb2FkRHJpdmVyKCk7CisKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGlzRHJpdmVyTG9hZGVkKCk7CiAgICAgCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiB1bmxvYWREcml2ZXIoKTsKIApAQCAtMTA5LDYgKzExMSwxMCBAQAogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBzZXRQb3dlck1vZGVDb21tYW5kKGludCBtb2RlKTsKIAorICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBnZXRCYW5kQ29tbWFuZCgpOworCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBzZXRCYW5kQ29tbWFuZChpbnQgYmFuZCk7CisKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgZ2V0UG93ZXJNb2RlQ29tbWFuZCgpOwogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBzZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKGludCBudW1DaGFubmVscyk7CkBAIC0xNDUsMTIgKzE1MSwxNCBAQAogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBjbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKIAorICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gc3RhcnRXcHNQYmNDb21tYW5kKFN0cmluZyBic3NpZCk7CisKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHN0YXJ0V3BzUGluQ29tbWFuZChTdHJpbmcgYnNzaWQsIGludCBhcFBpbik7CisKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGRvRGhjcFJlcXVlc3QoRGhjcEluZm8gcmVzdWx0cyk7CiAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBTdHJpbmcgZ2V0RGhjcEVycm9yKCk7CiAKLSAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChib29sZWFuIGVuYWJsZWQpOwotCiAgICAgLyoqCiAgICAgICogV2FpdCBmb3IgdGhlIHN1cHBsaWNhbnQgdG8gc2VuZCBhbiBldmVudCwgcmV0dXJuaW5nIHRoZSBldmVudCBzdHJpbmcuCiAgICAgICogQHJldHVybiB0aGUgZXZlbnQgc3RyaW5nIHNlbnQgYnkgdGhlIHN1cHBsaWNhbnQuCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkMGUwYQotLS0gL2Rldi9udWxsCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZU1hY2hpbmUuamF2YQpAQCAtMCwwICsxLDMxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTjsKKworLyoqCisgKiBUT0RPOiBBZGQgc29mdCBBUCBzdGF0ZXMgYXMgcGFydCBvZiBXSUZJX1NUQVRFX1hYWAorICogUmV0YWluIFdJRklfU1RBVEVfRU5BQkxJTkcgdGhhdCBpbmRpY2F0ZXMgZHJpdmVyIGlzIGxvYWRpbmcKKyAqIEFkZCBXSUZJX1NUQVRFX0FQX0VOQUJMRUQgdG8gaW5kaWNhdGUgc29mdCBBUCBoYXMgc3RhcnRlZAorICogYW5kIFdJRklfU1RBVEVfRkFJTEVEIGZvciBmYWlsdXJlCisgKiBEZXByZWNhdGUgV0lGSV9TVEFURV9VTktOT1dOCisgKgorICogRG9pbmcgdGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBsb2dpYyBmb3Igc2VuZGluZyBicm9hZGNhc3RzCisgKi8KK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtBZGRyZXNzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHlQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuV29ya1NvdXJjZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLklCYWNrdXBNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogVHJhY2sgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5LiBBbGwgZXZlbnQgaGFuZGxpbmcgaXMgZG9uZSBoZXJlLAorICogYW5kIGFsbCBjaGFuZ2VzIGluIGNvbm5lY3Rpdml0eSBzdGF0ZSBhcmUgaW5pdGlhdGVkIGhlcmUuCisgKgorICogQGhpZGUKKyAqLworLy9UT0RPOiB3ZSBzdGlsbCBuZWVkIGZyZXF1ZW50IHNjYW5uaW5nIGZvciB0aGUgY2FzZSB3aGVuCisvLyB3ZSBpc3N1ZSBkaXNjb25uZWN0IGJ1dCBuZWVkIHNjYW4gcmVzdWx0cyBmb3Igb3BlbiBuZXR3b3JrIG5vdGlmaWNhdGlvbgorcHVibGljIGNsYXNzIFdpZmlTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpU3RhdGVNYWNoaW5lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS1RZUEUgPSAiV0lGSSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qIFRPRE86IGZldGNoIGEgY29uZmlndXJhYmxlIGludGVyZmFjZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUQVBfSUZBQ0UgPSAid2wwLjEiOworCisgICAgcHJpdmF0ZSBXaWZpTW9uaXRvciBtV2lmaU1vbml0b3I7CisgICAgcHJpdmF0ZSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG53U2VydmljZTsKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOworCisgICAgLyogU2NhbiByZXN1bHRzIGhhbmRsaW5nICovCisgICAgcHJpdmF0ZSBMaXN0PFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0czsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNjYW5SZXN1bHRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcdCsiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOworICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7CisKKyAgICBwcml2YXRlIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKKworICAgIHByaXZhdGUgaW50IG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSAwOworICAgIHByaXZhdGUgaW50IG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKyAgICBwcml2YXRlIFN0cmluZyBtTGFzdEJzc2lkOworICAgIHByaXZhdGUgaW50IG1MYXN0TmV0d29ya0lkOworICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlUnNzaVBvbGxpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBtUmVjb25uZWN0Q291bnQgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTY2FuTW9kZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgdGhlIGJsdWV0b290aCBoZWFkc2V0IGhlbHBlci4gVGhpcyBuZWVkcyB0byBiZSBjcmVhdGVkCisgICAgICogZWFybHkgYmVjYXVzZSB0aGVyZSBpcyBhIGRlbGF5IGJlZm9yZSBpdCBhY3R1YWxseSAnY29ubmVjdHMnLCBhcworICAgICAqIG5vdGVkIGJ5IGl0cyBqYXZhZG9jLiBJZiB3ZSBjaGVjayBiZWZvcmUgaXQgaXMgY29ubmVjdGVkLCBpdCB3aWxsIGJlCisgICAgICogaW4gYW4gZXJyb3Igc3RhdGUgYW5kIHdlIHdpbGwgbm90IGRpc2FibGUgY29leGlzdGVuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OworCisgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1CbHVldG9vdGhBMmRwOworCisgICAgcHJpdmF0ZSBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisKKyAgICAvLyBIZWxkIGR1cmluZyBkcml2ZXIgbG9hZCBhbmQgdW5sb2FkCisgICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNXYWtlTG9jazsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHByaXZhdGUgRGhjcEluZm8gbURoY3BJbmZvOworICAgIHByaXZhdGUgV2lmaUluZm8gbVdpZmlJbmZvOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOworICAgIHByaXZhdGUgU3VwcGxpY2FudFN0YXRlVHJhY2tlciBtU3VwcGxpY2FudFN0YXRlVHJhY2tlcjsKKyAgICAvKiBDb25uZWN0aW9uIHRvIGEgc3BlY2lmaWMgbmV0d29yayBpbnZvbHZlcyBkaXNhYmxpbmcgYWxsIG5ldHdvcmtzLAorICAgICAqIHRoaXMgZmxhZyB0cmFja3MgaWYgbmV0d29ya3MgbmVlZCB0byBiZSByZS1lbmFibGVkICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVBbGxOZXR3b3JrcyA9IGZhbHNlOworICAgIC8qIFRyYWNrIGlmIFdQUyB3YXMgc3RhcnRlZCBzaW5jZSB3ZSBuZWVkIHRvIHJlLWVuYWJsZSBuZXR3b3JrcworICAgICAqIGFuZCBsb2FkIGNvbmZpZ3VyYXRpb24gYWZ0ZXJ3YXJkcyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtV3BzU3RhcnRlZCA9IGZhbHNlOworCisgICAgLy8gRXZlbnQgbG9nIHRhZ3MgKG11c3QgYmUgaW4gc3luYyB3aXRoIGV2ZW50LWxvZy10YWdzKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQgICAgICAgID0gNTAwMjE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCAgICAgICAgPSA1MDAyMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEICA9IDUwMDIzOworCisgICAgLyogTG9hZCB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgLyogVW5sb2FkIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1VOTE9BRF9EUklWRVIgICAgICAgICAgICAgICAgICAgID0gMjsKKyAgICAvKiBJbmRpY2F0ZXMgZHJpdmVyIGxvYWQgc3VjY2VlZGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUl9TVUNDRVNTICAgICAgICAgICAgICA9IDM7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciBsb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfTE9BRF9EUklWRVJfRkFJTFVSRSAgICAgICAgICAgICAgPSA0OworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgdW5sb2FkIHN1Y2NlZWRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUl9TVUNDRVNTICAgICAgICAgICAgPSA1OworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgdW5sb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFICAgICAgICAgICAgPSA2OworCisgICAgLyogU3RhcnQgdGhlIHN1cHBsaWNhbnQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUQVJUX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgID0gMTE7CisgICAgLyogU3RvcCB0aGUgc3VwcGxpY2FudCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9TVVBQTElDQU5UICAgICAgICAgICAgICAgICAgPSAxMjsKKyAgICAvKiBTdGFydCB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9EUklWRVIgICAgICAgICAgICAgICAgICAgICA9IDEzOworICAgIC8qIFN0YXJ0IHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUT1BfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgID0gMTQ7CisgICAgLyogSW5kaWNhdGVzIERIQ1Agc3VjY2VkZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0lQX0NPTkZJR19TVUNDRVNTICAgICAgICAgICAgICAgID0gMTU7CisgICAgLyogSW5kaWNhdGVzIERIQ1AgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9JUF9DT05GSUdfRkFJTFVSRSAgICAgICAgICAgICAgICA9IDE2OworICAgIC8qIFJlLWNvbmZpZ3VyZSBpbnRlcmZhY2UgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFQ09ORklHVVJFX0lQICAgICAgICAgICAgICAgICAgID0gMTc7CisKKworICAgIC8qIFN0YXJ0IHRoZSBzb2Z0IGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTsKKyAgICAvKiBTdG9wIHRoZSBzb2Z0IGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9BUCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjsKKworCisgICAgLyogU3VwcGxpY2FudCBldmVudHMgKi8KKyAgICAvKiBDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgZXN0YWJsaXNoZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VQX0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgICAgID0gMzE7CisgICAgLyogQ29ubmVjdGlvbiB0byBzdXBwbGljYW50IGxvc3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgID0gMzI7CisgICAgLyogRHJpdmVyIHN0YXJ0IGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RBUlRfRVZFTlQgICAgICAgICAgICAgICAgICAgPSAzMzsKKyAgICAvKiBEcml2ZXIgc3RvcCBjb21wbGV0ZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUT1BfRVZFTlQgICAgICAgICAgICAgICAgICAgID0gMzQ7CisgICAgLyogTmV0d29yayBjb25uZWN0aW9uIGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgPSAzNjsKKyAgICAvKiBOZXR3b3JrIGRpc2Nvbm5lY3Rpb24gY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICA9IDM3OworICAgIC8qIFNjYW4gcmVzdWx0cyBhcmUgYXZhaWxhYmxlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUU19FVkVOVCAgICAgICAgICAgICAgICAgICA9IDM4OworICAgIC8qIFN1cHBsaWNhdGUgc3RhdGUgY2hhbmdlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVCAgICAgICAgPSAzOTsKKyAgICAvKiBQYXNzd29yZCBtYXkgYmUgaW5jb3JyZWN0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQgICAgICA9IDQwOworCisgICAgLyogU3VwcGxpY2FudCBjb21tYW5kcyAqLworICAgIC8qIElzIHN1cHBsaWNhbnQgYWxpdmUgPyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUElOR19TVVBQTElDQU5UICAgICAgICAgICAgICAgICAgPSA1MTsKKyAgICAvKiBBZGQvdXBkYXRlIGEgbmV0d29yayBjb25maWd1cmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9BRERfT1JfVVBEQVRFX05FVFdPUksgICAgICAgICAgICA9IDUyOworICAgIC8qIERlbGV0ZSBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFTU9WRV9ORVRXT1JLICAgICAgICAgICAgICAgICAgID0gNTM7CisgICAgLyogRW5hYmxlIGEgbmV0d29yay4gVGhlIGRldmljZSB3aWxsIGF0dGVtcHQgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBuZXR3b3JrLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRU5BQkxFX05FVFdPUksgICAgICAgICAgICAgICAgICAgPSA1NDsKKyAgICAvKiBEaXNhYmxlIGEgbmV0d29yay4gVGhlIGRldmljZSBkb2VzIG5vdCBhdHRlbXB0IGEgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gbmV0d29yay4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0RJU0FCTEVfTkVUV09SSyAgICAgICAgICAgICAgICAgID0gNTU7CisgICAgLyogQmxhY2tsaXN0IG5ldHdvcmsuIERlLXByaW9yaXRpemVzIHRoZSBnaXZlbiBCU1NJRCBmb3IgY29ubmVjdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0JMQUNLTElTVF9ORVRXT1JLICAgICAgICAgICAgICAgID0gNTY7CisgICAgLyogQ2xlYXIgdGhlIGJsYWNrbGlzdCBuZXR3b3JrIGxpc3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0NMRUFSX0JMQUNLTElTVCAgICAgICAgICAgICAgICAgID0gNTc7CisgICAgLyogU2F2ZSBjb25maWd1cmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TQVZFX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICA9IDU4OworCisgICAgLyogU3VwcGxpY2FudCBjb21tYW5kcyBhZnRlciBkcml2ZXIgc3RhcnQqLworICAgIC8qIEluaXRpYXRlIGEgc2NhbiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgPSA3MTsKKyAgICAvKiBTZXQgc2NhbiBtb2RlLiBDT05ORUNUX01PREUgb3IgU0NBTl9PTkxZX01PREUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9TQ0FOX01PREUgICAgICAgICAgICAgICAgICAgID0gNzI7CisgICAgLyogU2V0IHNjYW4gdHlwZS4gU0NBTl9BQ1RJVkUgb3IgU0NBTl9QQVNTSVZFICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfU0NBTl9UWVBFICAgICAgICAgICAgICAgICAgICA9IDczOworICAgIC8qIERpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICAgICAgICAgID0gNzQ7CisgICAgLyogUmVjb25uZWN0IHRvIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVDT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTsKKyAgICAvKiBSZWFzc29jaWF0ZSB0byBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFQVNTT0NJQVRFICAgICAgICAgICAgICAgICAgICAgID0gNzY7CisgICAgLyogU2V0IHBvd2VyIG1vZGUKKyAgICAgKiBQT1dFUl9NT0RFX0FDVElWRQorICAgICAqIFBPV0VSX01PREVfQVVUTworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU0VUX1BPV0VSX01PREUgICAgICAgICAgICAgICAgICAgPSA3NzsKKyAgICAvKiBTZXQgYmx1ZXRvb3RoIGNvLWV4aXN0ZW5jZQorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0VOQUJMRUQKKyAgICAgKiBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFICAgICAgICA9IDc4OworICAgIC8qIEVuYWJsZS9kaXNhYmxlIGJsdWV0b290aCBzY2FuIG1vZGUKKyAgICAgKiB0cnVlKDEpCisgICAgICogZmFsc2UoMCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFICAgICAgICAgID0gNzk7CisgICAgLyogU2V0IG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFMgICAgICAgICA9IDgwOworICAgIC8qIFJlcXVlc3QgY29ubmVjdGl2aXR5IG1hbmFnZXIgd2FrZSBsb2NrIGJlZm9yZSBkcml2ZXIgc3RvcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSyAgICAgICAgICAgICAgPSA4MTsKKyAgICAvKiBFbmFibGVzIFJTU0kgcG9sbCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRU5BQkxFX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgPSA4MjsKKyAgICAvKiBSU1NJIHBvbGwgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgICAgICAgID0gODM7CisgICAgLyogR2V0IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0kgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NDsKKyAgICAvKiBHZXQgYXBwcm94IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0lfQVBQUk9YICAgICAgICAgICAgICAgICAgPSA4NTsKKyAgICAvKiBHZXQgbGluayBzcGVlZCBvbiBjb25uZWN0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTElOS19TUEVFRCAgICAgICAgICAgICAgICAgICA9IDg2OworICAgIC8qIFJhZGlvIG1hYyBhZGRyZXNzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICA9IDg3OworICAgIC8qIFNldCB1cCBwYWNrZXQgZmlsdGVyaW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HICAgICAgICAgICA9IDg4OworICAgIC8qIENsZWFyIHBhY2tldCBmaWx0ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORyAgICAgICAgICAgID0gODk7CisgICAgLyogQ29ubmVjdCB0byBhIHNwZWNpZmllZCBuZXR3b3JrIChuZXR3b3JrIGlkCisgICAgICogb3IgV2lmaUNvbmZpZ3VyYXRpb24pIFRoaXMgaW52b2x2ZXMgaW5jcmVhc2luZworICAgICAqIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV0d29yaywgZW5hYmxpbmcgdGhlIG5ldHdvcmsKKyAgICAgKiAod2hpbGUgZGlzYWJsaW5nIG90aGVycykgYW5kIGlzc3VpbmcgYSByZWNvbm5lY3QuCisgICAgICogTm90ZSB0aGF0IENNRF9SRUNPTk5FQ1QganVzdCBkb2VzIGEgcmVjb25uZWN0IHRvCisgICAgICogYW4gZXhpc3RpbmcgbmV0d29yay4gQWxsIHRoZSBuZXR3b3JrcyBnZXQgZW5hYmxlZAorICAgICAqIHVwb24gYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24gb3IgYSBmYWlsdXJlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQ09OTkVDVF9ORVRXT1JLICAgICAgICAgICAgICAgICAgPSA5MDsKKyAgICAvKiBTYXZlIHRoZSBzcGVjaWZpZWQgbmV0d29yay4gVGhpcyBpbnZvbHZlcyBhZGRpbmcKKyAgICAgKiBhbiBlbmFibGVkIG5ldHdvcmsgKGlmIG5ldykgYW5kIHVwZGF0aW5nIHRoZQorICAgICAqIGNvbmZpZyBhbmQgaXNzdWluZyBhIHNhdmUgb24gc3VwcGxpY2FudCBjb25maWcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TQVZFX05FVFdPUksgICAgICAgICAgICAgICAgICAgICA9IDkxOworICAgIC8qIERlbGV0ZSB0aGUgc3BlY2lmaWVkIG5ldHdvcmsuIFRoaXMgaW52b2x2ZXMKKyAgICAgKiByZW1vdmluZyB0aGUgbmV0d29yayBhbmQgaXNzdWluZyBhIHNhdmUgb24KKyAgICAgKiBzdXBwbGljYW50IGNvbmZpZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0ZPUkdFVF9ORVRXT1JLICAgICAgICAgICAgICAgICAgID0gOTI7CisgICAgLyogU3RhcnQgV2ktRmkgcHJvdGVjdGVkIHNldHVwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9XUFMgICAgICAgICAgICAgICAgICAgICAgICA9IDkzOworCisKKyAgICAvKioKKyAgICAgKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGZvciBjb25uZWN0aW9uCisgICAgICogc3RhdHVzIGl0ZW1zIHRoYXQgYXJlIG5vdCBzZW50IHZpYSBhc3luY2hyb25vdXMgZXZlbnRzLgorICAgICAqIEFuIGV4YW1wbGUgaXMgUlNTSSAoc2lnbmFsIHN0cmVuZ3RoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTID0gMzAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX01PREUgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fT05MWV9NT0RFID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX0FDVElWRSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUEFTU0lWRSA9IDI7CisKKyAgICAvKiBBdXRvIGFsbG93cyA4MDIuMTFBL0IvRyBvcGVyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFORF9BVVRPID0gMDsKKyAgICAvKiA1R0h6IGFsbG93cyA4MDIuMTFBIG9wZXJhdGlvbiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQU5EXzVHID0gMTsKKyAgICAvKiAyLjRHSHogYWxsb3dzIDgwMi4xMUIvRyBvcGVyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFORF8yRyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2Ugd2lsbCByZXRyeSBhIGNvbm5lY3Rpb24gdG8gYW4gYWNjZXNzIHBvaW50CisgICAgICogZm9yIHdoaWNoIHdlIGhhdmUgZmFpbGVkIGluIGFjcXVpcmluZyBhbiBJUCBhZGRyZXNzIGZyb20gREhDUC4gQSB2YWx1ZSBvZgorICAgICAqIE4gbWVhbnMgdGhhdCB3ZSB3aWxsIG1ha2UgTisxIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaW4gYWxsLgorICAgICAqIDxwPgorICAgICAqIFNlZSB7QGxpbmsgU2V0dGluZ3MuU2VjdXJlI1dJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlR9LiBUaGlzIGlzIHRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaWYgYSBTZXR0aW5ncyB2YWx1ZSBpcyBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTID0gOTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BVVRPID0gMDsKKworICAgIC8qIERlZmF1bHQgcGFyZW50IHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGVmYXVsdFN0YXRlID0gbmV3IERlZmF1bHRTdGF0ZSgpOworICAgIC8qIFRlbXBvcmFyeSBpbml0aWFsIHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5pdGlhbFN0YXRlID0gbmV3IEluaXRpYWxTdGF0ZSgpOworICAgIC8qIFVubG9hZGluZyB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyVW5sb2FkaW5nU3RhdGUgPSBuZXcgRHJpdmVyVW5sb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBMb2FkaW5nIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJVbmxvYWRlZFN0YXRlID0gbmV3IERyaXZlclVubG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZC91bmxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyRmFpbGVkU3RhdGUgPSBuZXcgRHJpdmVyRmFpbGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlckxvYWRpbmdTdGF0ZSA9IG5ldyBEcml2ZXJMb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyTG9hZGVkU3RhdGUgPSBuZXcgRHJpdmVyTG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkLCB3YWl0aW5nIGZvciBzdXBwbGljYW50IHRvIHN0YXJ0ICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtV2FpdEZvclN1cFN0YXRlID0gbmV3IFdhaXRGb3JTdXBTdGF0ZSgpOworCisgICAgLyogRHJpdmVyIGxvYWRlZCBhbmQgc3VwcGxpY2FudCByZWFkeSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN1cFJlYWR5U3RhdGUgPSBuZXcgRHJpdmVyU3VwUmVhZHlTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydCBpc3N1ZWQsIHdhaXRpbmcgZm9yIGNvbXBsZXRlZCBldmVudCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0YXJ0aW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RhcnRpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RhcnRlZFN0YXRlID0gbmV3IERyaXZlclN0YXJ0ZWRTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0b3BwaW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RvcHBpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RvcHBlZFN0YXRlID0gbmV3IERyaXZlclN0b3BwZWRTdGF0ZSgpOworICAgIC8qIFNjYW4gZm9yIG5ldHdvcmtzLCBubyBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1TY2FuTW9kZVN0YXRlID0gbmV3IFNjYW5Nb2RlU3RhdGUoKTsKKyAgICAvKiBDb25uZWN0aW5nIHRvIGFuIGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RNb2RlU3RhdGUgPSBuZXcgQ29ubmVjdE1vZGVTdGF0ZSgpOworICAgIC8qIEZldGNoaW5nIElQIGFmdGVyIG5ldHdvcmsgY29ubmVjdGlvbiAoYXNzb2MrYXV0aCBjb21wbGV0ZSkgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0aW5nU3RhdGUgPSBuZXcgQ29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogQ29ubmVjdGVkIHdpdGggSVAgYWRkciAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RlZFN0YXRlID0gbmV3IENvbm5lY3RlZFN0YXRlKCk7CisgICAgLyogZGlzY29ubmVjdCBpc3N1ZWQsIHdhaXRpbmcgZm9yIG5ldHdvcmsgZGlzY29ubmVjdCBjb25maXJtYXRpb24gKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1EaXNjb25uZWN0aW5nU3RhdGUgPSBuZXcgRGlzY29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogTmV0d29yayBpcyBub3QgY29ubmVjdGVkLCBzdXBwbGljYW50IGFzc29jK2F1dGggaXMgbm90IGNvbXBsZXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdGVkU3RhdGUgPSBuZXcgRGlzY29ubmVjdGVkU3RhdGUoKTsKKworICAgIC8qIFNvZnQgQXAgaXMgcnVubmluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVNvZnRBcFN0YXJ0ZWRTdGF0ZSA9IG5ldyBTb2Z0QXBTdGFydGVkU3RhdGUoKTsKKworCisgICAgLyoqCisgICAgICogT25lIG9mICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9VTktOT1dOfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpU3RhdGUgPSBuZXcgQXRvbWljSW50ZWdlcihXSUZJX1NUQVRFX0RJU0FCTEVEKTsKKworICAgIC8qKgorICAgICAqIE9uZSBvZiAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpQXBTdGF0ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKFdJRklfQVBfU1RBVEVfRElTQUJMRUQpOworCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1MYXN0RW5hYmxlVWlkID0gbmV3IEF0b21pY0ludGVnZXIoUHJvY2Vzcy5teVVpZCgpKTsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbUxhc3RBcEVuYWJsZVVpZCA9IG5ldyBBdG9taWNJbnRlZ2VyKFByb2Nlc3MubXlVaWQoKSk7CisKKyAgICAvKioKKyAgICAgKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgV0lGSSBpcyBydW5uaW5nLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSdW5uaW5nID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgbGFzdCB0b2xkIHRoZSBiYXR0ZXJ5IHN0YXRzIHdlIGhhZCBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwb3J0ZWRSdW5uaW5nID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBNb3N0IHJlY2VudGx5IHNldCBzb3VyY2Ugb2Ygc3RhcnRpbmcgV0lGSS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFdvcmtTb3VyY2UgbVJ1bm5pbmdXaWZpVWlkcyA9IG5ldyBXb3JrU291cmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFzdCByZXBvcnRlZCBVSURzIHRoYXQgd2VyZSByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgV0lGSS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFdvcmtTb3VyY2UgbUxhc3RSdW5uaW5nV2lmaVVpZHMgPSBuZXcgV29ya1NvdXJjZSgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBJQmF0dGVyeVN0YXRzIG1CYXR0ZXJ5U3RhdHM7CisKKyAgICBwdWJsaWMgV2lmaVN0YXRlTWFjaGluZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoVEFHKTsKKworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJLCAwLCBORVRXT1JLVFlQRSwgIiIpOworICAgICAgICBtQmF0dGVyeVN0YXRzID0gSUJhdHRlcnlTdGF0cy5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImJhdHRlcnlpbmZvIikpOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKKyAgICAgICAgbndTZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOworCisgICAgICAgIG1XaWZpTW9uaXRvciA9IG5ldyBXaWZpTW9uaXRvcih0aGlzKTsKKyAgICAgICAgbURoY3BJbmZvID0gbmV3IERoY3BJbmZvKCk7CisgICAgICAgIG1XaWZpSW5mbyA9IG5ldyBXaWZpSW5mbygpOworICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJ3aWZpLmludGVyZmFjZSIsICJ0aXdsYW4wIik7CisgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyID0gbmV3IFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIoY29udGV4dCwgZ2V0SGFuZGxlcigpKTsKKworICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLmdldFByb2ZpbGVQcm94eShtQ29udGV4dCwgbUJsdWV0b290aFByb2ZpbGVTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLkEyRFApOworICAgICAgICAgICAgYWRhcHRlci5nZXRQcm9maWxlUHJveHkobUNvbnRleHQsIG1CbHVldG9vdGhQcm9maWxlU2VydmljZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUKTsKKyAgICAgICAgfQorCisgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CisgICAgICAgIG1MaW5rUHJvcGVydGllcy5jbGVhcigpOworICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKKyAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSAtMTsKKyAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOworCisgICAgICAgIG1TY2FuUmVzdWx0Q2FjaGUgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+KAorICAgICAgICAgICAgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSwgMC43NWYsIHRydWUpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIExpbWl0IHRoZSBjYWNoZSBzaXplIGJ5IFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUKKyAgICAgICAgICAgICAgICAgKiBlbGVtZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KE1hcC5FbnRyeSBlbGRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUgPCB0aGlzLnNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOworICAgICAgICBzV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBUQUcpOworCisgICAgICAgIGFkZFN0YXRlKG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobUluaXRpYWxTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyVW5sb2FkaW5nU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclVubG9hZGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJGYWlsZWRTdGF0ZSwgbURyaXZlclVubG9hZGVkU3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlckxvYWRpbmdTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyTG9hZGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1XYWl0Rm9yU3VwU3RhdGUsIG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3VwUmVhZHlTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0YXJ0aW5nU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RhcnRlZFN0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1TY2FuTW9kZVN0YXRlLCBtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RNb2RlU3RhdGUsIG1Ecml2ZXJTdGFydGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RpbmdTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RlZFN0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGluZ1N0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGVkU3RhdGUsIG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RvcHBpbmdTdGF0ZSwgbURyaXZlclN1cFJlYWR5U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJTdG9wcGVkU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Tb2Z0QXBTdGFydGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworCisgICAgICAgIHNldEluaXRpYWxTdGF0ZShtSW5pdGlhbFN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBzZXREYmcodHJ1ZSk7CisKKyAgICAgICAgLy9zdGFydCB0aGUgc3RhdGUgbWFjaGluZQorICAgICAgICBzdGFydCgpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBNZXRob2RzIGV4cG9zZWQgZm9yIHB1YmxpYyB1c2UKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jUGluZ1N1cHBsaWNhbnQoKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX1BJTkdfU1VQUExJQ0FOVCkuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NUQVJUX1NDQU4sIGZvcmNlQWN0aXZlID8KKyAgICAgICAgICAgICAgICBTQ0FOX0FDVElWRSA6IFNDQU5fUEFTU0lWRSwgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpZmlFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG1MYXN0RW5hYmxlVWlkLnNldChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCBwcmlvciB0byBsb2FkICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9FTkFCTElORywgMCkpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX1NVUFBMSUNBTlQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUT1BfU1VQUExJQ0FOVCk7CisgICAgICAgICAgICAvKiBBcmd1bWVudCBpcyB0aGUgc3RhdGUgdGhhdCBpcyBlbnRlcmVkIHVwb24gc3VjY2VzcyAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9ESVNBQkxFRCwgMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lmaUFwRW5hYmxlZChXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBib29sZWFuIGVuYWJsZSkgeworICAgICAgICBtTGFzdEFwRW5hYmxlVWlkLnNldChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCBwcmlvciB0byBsb2FkICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9FTkFCTElORywgMCkpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU1RBUlRfQVAsIHdpZmlDb25maWcpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX0FQKTsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgdXBvbiBzdWNjZXNzICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0RJU0FCTEVELCAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRXaWZpU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc3luY0dldFdpZmlTdGF0ZUJ5TmFtZSgpIHsKKyAgICAgICAgc3dpdGNoIChtV2lmaVN0YXRlLmdldCgpKSB7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24gc3RhdGUiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIltpbnZhbGlkIHN0YXRlXSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRXaWZpQXBTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1XaWZpQXBTdGF0ZS5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRXaWZpQXBTdGF0ZUJ5TmFtZSgpIHsKKyAgICAgICAgc3dpdGNoIChtV2lmaUFwU3RhdGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxpbmciOworICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsZWQiOworICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxpbmciOworICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmYWlsZWQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIltpbnZhbGlkIHN0YXRlXSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgc3RhdHVzIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBpZiBhbnkuCisgICAgICogQHJldHVybiBhIHtAbGluayBXaWZpSW5mb30gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgY29ubmVjdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFdpZmlJbmZvIHN5bmNSZXF1ZXN0Q29ubmVjdGlvbkluZm8oKSB7CisgICAgICAgIHJldHVybiBtV2lmaUluZm87CisgICAgfQorCisgICAgcHVibGljIERoY3BJbmZvIHN5bmNHZXREaGNwSW5mbygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtRGhjcEluZm8pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGhjcEluZm8obURoY3BJbmZvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyaXZlclN0YXJ0KGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX0RSSVZFUik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX0RSSVZFUik7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Nhbk9ubHlNb2RlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fTU9ERSwgU0NBTl9PTkxZX01PREUsIDApKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fTU9ERSwgQ09OTkVDVF9NT0RFLCAwKSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NhblR5cGUoYm9vbGVhbiBhY3RpdmUpIHsKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9UWVBFLCBTQ0FOX0FDVElWRSwgMCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9UWVBFLCBTQ0FOX1BBU1NJVkUsIDApKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTY2FuUmVzdWx0PiBzeW5jR2V0U2NhblJlc3VsdHNMaXN0KCkgeworICAgICAgICByZXR1cm4gbVNjYW5SZXN1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSBBY2Nlc3MgUG9pbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0Q29tbWFuZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGEgcmVjb25uZWN0aW9uIHRvIEFQCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjb25uZWN0Q29tbWFuZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1JFQ09OTkVDVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgYSByZS1hc3NvY2lhdGlvbiB0byBBUAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYXNzb2NpYXRlQ29tbWFuZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1JFQVNTT0NJQVRFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXR3b3JrIHN5bmNocm9ub3VzbHkKKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV0d29yayBpZCBvZiB0aGUgbmV3IG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNBZGRPclVwZGF0ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSywgY29uZmlnKS5pbnRWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gc3luY0dldENvbmZpZ3VyZWROZXR3b3JrcygpIHsKKyAgICAgICAgcmV0dXJuIFdpZmlDb25maWdTdG9yZS5nZXRDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIGlkIG9mIHRoZSBuZXR3b3JrIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jUmVtb3ZlTmV0d29yayhpbnQgbmV0d29ya0lkKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfUkVNT1ZFX05FVFdPUkssIG5ldHdvcmtJZCwgMCkpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEVuYWJsZU5ldFBhcmFtcyB7CisgICAgICAgIHByaXZhdGUgaW50IG5ldElkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZGlzYWJsZU90aGVyczsKKyAgICAgICAgRW5hYmxlTmV0UGFyYW1zKGludCBuLCBib29sZWFuIGIpIHsKKyAgICAgICAgICAgIG5ldElkID0gbjsKKyAgICAgICAgICAgIGRpc2FibGVPdGhlcnMgPSBiOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIEVuYWJsZSBhIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCisgICAgICogQHBhcmFtIGRpc2FibGVPdGhlcnMgdHJ1ZSwgaWYgYWxsIG90aGVyIG5ldHdvcmtzIGhhdmUgdG8gYmUgZGlzYWJsZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN5bmNFbmFibGVOZXR3b3JrKGludCBuZXRJZCwgYm9vbGVhbiBkaXNhYmxlT3RoZXJzKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0VOQUJMRV9ORVRXT1JLLAorICAgICAgICAgICAgICAgIG5ldyBFbmFibGVOZXRQYXJhbXMobmV0SWQsIGRpc2FibGVPdGhlcnMpKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZSBhIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jRGlzYWJsZU5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfRElTQUJMRV9ORVRXT1JLLCBuZXRJZCwgMCkpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCbGFja2xpc3QgYSBCU1NJRC4gVGhpcyB3aWxsIGF2b2lkIHRoZSBBUCBpZiB0aGVyZSBhcmUKKyAgICAgKiBhbHRlcm5hdGUgQVBzIHRvIGNvbm5lY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBic3NpZCBCU1NJRCBvZiB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRvQmxhY2tsaXN0KFN0cmluZyBic3NpZCkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9CTEFDS0xJU1RfTkVUV09SSywgYnNzaWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgYmxhY2tsaXN0IGxpc3QKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyQmxhY2tsaXN0KCkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9DTEVBUl9CTEFDS0xJU1QpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQ09OTkVDVF9ORVRXT1JLLCBuZXRJZCwgMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3ROZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKKyAgICAgICAgLyogYXJnMSBpcyB1c2VkIHRvIGluZGljYXRlIG5ldElkLCBmb3JjZSBhIG5ldElkIHZhbHVlIG9mIC0xIHdoZW4KKyAgICAgICAgICogd2UgYXJlIHBhc3NpbmcgYSBjb25maWd1cmF0aW9uIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mCisgICAgICAgICAqIDAgaXMgYSB2YWxpZCBuZXRJZAorICAgICAgICAgKi8KKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQ09OTkVDVF9ORVRXT1JLLCAtMSwgMCwgd2lmaUNvbmZpZykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0FWRV9ORVRXT1JLLCB3aWZpQ29uZmlnKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfRk9SR0VUX05FVFdPUkssIG5ldElkLCAwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRXcHNQYmMoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NUQVJUX1dQUywgYnNzaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydFdwc1BpbihTdHJpbmcgYnNzaWQsIGludCBhcFBpbikgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TVEFSVF9XUFMsIGFwUGluLCAwLCBic3NpZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0VOQUJMRV9SU1NJX1BPTEwsIGVuYWJsZWQgPyAxIDogMCwgMCkpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc3luY0dldFJzc2koKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0dFVF9SU1NJKS5pbnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYXBwcm94IFJTU0kgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJTU0kgdmFsdWUsIC0xIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRSc3NpQXBwcm94KCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfUlNTSV9BUFBST1gpLmludFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBsaW5rIHNwZWVkIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yaworICAgICAqCisgICAgICogQHJldHVybiBsaW5rIHNwZWVkLCAtMSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0TGlua1NwZWVkKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfTElOS19TUEVFRCkuaW50VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IE1BQyBhZGRyZXNzIG9mIHJhZGlvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1BQyBhZGRyZXNzLCBudWxsIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRNYWNBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfTUFDX0FERFIpLnN0cmluZ1ZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHBhY2tldCBmaWx0ZXJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFBhY2tldEZpbHRlcmluZygpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgcGFja2V0IGZpbHRlcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BQYWNrZXRGaWx0ZXJpbmcoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBwb3dlciBtb2RlCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgRFJJVkVSX1BPV0VSX01PREVfQVVUTworICAgICAqICAgICBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3dlck1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1BPV0VSX01PREUsIG1vZGUsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyBmcm9tIHRoZSBzeXN0ZW0KKyAgICAgKiBzZXR0aW5nIHZhbHVlLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9OVU1fQUxMT1dFRF9DSEFOTkVMUykpOworICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG1OdW1BbGxvd2VkQ2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscyhtTnVtQWxsb3dlZENoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXNlIHRoZSBkcml2ZXIgZGVmYXVsdAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBudW1iZXIgb2YgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZAorICAgICAqIGluIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKKyAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTLCBudW1DaGFubmVscywgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscworICAgICAqCisgICAgICogQHJldHVybiBjaGFubmVsIGNvdW50LCAtMSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBUT0RPOiB0aGlzIGlzIG5vdCBhIHB1YmxpYyBBUEkgYW5kIG5lZWRzIHRvIGJlIHJlbW92ZWQgaW4gZmF2b3IKKyAgICAgKiBvZiBhc3luY2hyb25vdXMgcmVwb3J0aW5nLiB1bnVzZWQgZm9yIG5vdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bUFsbG93ZWRDaGFubmVscygpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBibHVldG9vdGggY29leCBtb2RlOgorICAgICAqCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRU5BQkxFRAorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZShpbnQgbW9kZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFLCBtb2RlLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgQmx1ZXRvb3RoIGNvZXhpc3RlbmNlIHNjYW4gbW9kZS4gV2hlbiB0aGlzIG1vZGUgaXMgb24sCisgICAgICogc29tZSBvZiB0aGUgbG93LWxldmVsIHNjYW4gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBkcml2ZXIgYXJlIGNoYW5nZWQgdG8KKyAgICAgKiByZWR1Y2UgaW50ZXJmZXJlbmNlIHdpdGggQTJEUCBzdHJlYW1pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNCbHVldG9vdGhQbGF5aW5nIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBtb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoYm9vbGVhbiBpc0JsdWV0b290aFBsYXlpbmcpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREUsIGlzQmx1ZXRvb3RoUGxheWluZyA/IDEgOiAwLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSBjb25maWd1cmF0aW9uIG9uIHN1cHBsaWNhbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBUT0RPOiBkZXByZWNhdGUgdGhpcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN5bmNTYXZlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9TQVZFX0NPTkZJRykuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RDbVdha2VMb2NrKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfUkVRVUVTVF9DTV9XQUtFTE9DSyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQmF0dGVyeVdvcmtTb3VyY2UoV29ya1NvdXJjZSBuZXdTb3VyY2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUnVubmluZ1dpZmlVaWRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChuZXdTb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtUnVubmluZ1dpZmlVaWRzLnNldChuZXdTb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUlzUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcG9ydGVkUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmsgc291cmNlIGhhcyBjaGFuZ2VkIHNpbmNlIGxhc3QgdGltZSwgbmVlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcmVtb3ZlIG9sZCB3b3JrIGZyb20gYmF0dGVyeSBzdGF0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFJ1bm5pbmdXaWZpVWlkcy5kaWZmKG1SdW5uaW5nV2lmaVVpZHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaVJ1bm5pbmdDaGFuZ2VkKG1MYXN0UnVubmluZ1dpZmlVaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJ1bm5pbmdXaWZpVWlkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RSdW5uaW5nV2lmaVVpZHMuc2V0KG1SdW5uaW5nV2lmaVVpZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IGJlaW5nIHN0YXJ0ZWQsIHJlcG9ydCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlSdW5uaW5nKG1SdW5uaW5nV2lmaVVpZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RSdW5uaW5nV2lmaVVpZHMuc2V0KG1SdW5uaW5nV2lmaVVpZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbVJlcG9ydGVkUnVubmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcG9ydGVkUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGFzdCByZXBvcnRlZCB3ZSB3ZXJlIHJ1bm5pbmcsIHRpbWUgdG8gc3RvcC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlTdG9wcGVkKG1MYXN0UnVubmluZ1dpZmlVaWRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0UnVubmluZ1dpZmlVaWRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmVwb3J0ZWRSdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJjdXJyZW50IEhTTSBzdGF0ZTogIikuYXBwZW5kKGdldEN1cnJlbnRTdGF0ZSgpLmdldE5hbWUoKSkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTGlua1Byb3BlcnRpZXMgIikuYXBwZW5kKG1MaW5rUHJvcGVydGllcykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtV2lmaUluZm8gIikuYXBwZW5kKG1XaWZpSW5mbykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtRGhjcEluZm8gIikuYXBwZW5kKG1EaGNwSW5mbykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTmV0d29ya0luZm8gIikuYXBwZW5kKG1OZXR3b3JrSW5mbykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTnVtQWxsb3dlZENoYW5uZWxzICIpLmFwcGVuZChtTnVtQWxsb3dlZENoYW5uZWxzKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1MYXN0U2lnbmFsTGV2ZWwgIikuYXBwZW5kKG1MYXN0U2lnbmFsTGV2ZWwpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUxhc3RCc3NpZCAiKS5hcHBlbmQobUxhc3RCc3NpZCkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTGFzdE5ldHdvcmtJZCAiKS5hcHBlbmQobUxhc3ROZXR3b3JrSWQpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUVuYWJsZUFsbE5ldHdvcmtzICIpLmFwcGVuZChtRW5hYmxlQWxsTmV0d29ya3MpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUVuYWJsZVJzc2lQb2xsaW5nICIpLmFwcGVuZChtRW5hYmxlUnNzaVBvbGxpbmcpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgIikuYXBwZW5kKG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1SZWNvbm5lY3RDb3VudCAiKS5hcHBlbmQobVJlY29ubmVjdENvdW50KS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1Jc1NjYW5Nb2RlICIpLmFwcGVuZChtSXNTY2FuTW9kZSkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJTdXBwbGljYW50IHN0YXR1cyIpLmFwcGVuZChMUykKKyAgICAgICAgICAgICAgICAuYXBwZW5kKFdpZmlOYXRpdmUuc3RhdHVzQ29tbWFuZCgpKS5hcHBlbmQoTFMpLmFwcGVuZChMUyk7CisKKyAgICAgICAgc2IuYXBwZW5kKFdpZmlDb25maWdTdG9yZS5kdW1wKCkpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogSW50ZXJuYWwgcHJpdmF0ZSBmdW5jdGlvbnMKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjbGFzcyBTeW5jUmV0dXJuIHsKKyAgICAgICAgYm9vbGVhbiBib29sVmFsdWU7CisgICAgICAgIGludCBpbnRWYWx1ZTsKKyAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlOworICAgICAgICBPYmplY3Qgb2JqVmFsdWU7CisgICAgfQorCisgICAgY2xhc3MgU3luY1BhcmFtcyB7CisgICAgICAgIE9iamVjdCBtUGFyYW1ldGVyOworICAgICAgICBTeW5jUmV0dXJuIG1TeW5jUmV0dXJuOworICAgICAgICBTeW5jUGFyYW1zKCkgeworICAgICAgICAgICAgbVN5bmNSZXR1cm4gPSBuZXcgU3luY1JldHVybigpOworICAgICAgICB9CisgICAgICAgIFN5bmNQYXJhbXMoT2JqZWN0IHApIHsKKyAgICAgICAgICAgIG1QYXJhbWV0ZXIgPSBwOworICAgICAgICAgICAgbVN5bmNSZXR1cm4gPSBuZXcgU3luY1JldHVybigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbWVzc2FnZS5vYmogaXMgdXNlZCB0byBzdG9yZSBTeW5jUGFyYW1zCisgICAgICovCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHN5bmNlZFNlbmQoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1zZy5vYmo7CisgICAgICAgIHN5bmNocm9uaXplZChzeW5jUGFyYW1zKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzeW5jZWRTZW5kICIgKyBtc2cpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY1BhcmFtcy53YWl0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2VuZFN5bmNNZXNzYWdlOiB1bmV4cGVjdGVkIGludGVycnVwdGlvbiBvZiB3YWl0KCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3luY1BhcmFtcy5tU3luY1JldHVybjsKKyAgICB9CisKKyAgICBwcml2YXRlIFN5bmNSZXR1cm4gc2VuZFN5bmNNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtcyA9IG5ldyBTeW5jUGFyYW1zKCk7CisgICAgICAgIG1zZy5vYmogPSBzeW5jUGFyYW1zOworICAgICAgICByZXR1cm4gc3luY2VkU2VuZChtc2cpOworICAgIH0KKworICAgIHByaXZhdGUgU3luY1JldHVybiBzZW5kU3luY01lc3NhZ2UoaW50IHdoYXQsIE9iamVjdCBwYXJhbSkgeworICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSBuZXcgU3luY1BhcmFtcyhwYXJhbSk7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZSh3aGF0LCBzeW5jUGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIHN5bmNlZFNlbmQobXNnKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgU3luY1JldHVybiBzZW5kU3luY01lc3NhZ2UoaW50IHdoYXQpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShvYnRhaW5NZXNzYWdlKHdoYXQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5T25Nc2dPYmplY3QoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1zZy5vYmo7CisgICAgICAgIGlmIChzeW5jUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChzeW5jUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAibm90aWZ5T25Nc2dPYmplY3QgIiArIG1zZyk7CisgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBzeW5jUGFyYW1zIGluIG5vdGlmeU9uTXNnT2JqZWN0IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRXaWZpU3RhdGUoaW50IHdpZmlTdGF0ZSkgeworICAgICAgICBmaW5hbCBpbnQgcHJldmlvdXNXaWZpU3RhdGUgPSBtV2lmaVN0YXRlLmdldCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAod2lmaVN0YXRlID09IFdJRklfU1RBVEVfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPbigpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPZmYoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBub3RlIGJhdHRlcnkgc3RhdHMgaW4gd2lmaSIpOworICAgICAgICB9CisKKyAgICAgICAgbVdpZmlTdGF0ZS5zZXQod2lmaVN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXRXaWZpU3RhdGU6ICIgKyBzeW5jR2V0V2lmaVN0YXRlQnlOYW1lKCkpOworCisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsIHdpZmlTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX1NUQVRFLCBwcmV2aW91c1dpZmlTdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUFwU3RhdGUoaW50IHdpZmlBcFN0YXRlKSB7CisgICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlBcFN0YXRlID0gbVdpZmlBcFN0YXRlLmdldCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAod2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gbm90ZSBiYXR0ZXJ5IHN0YXRzIGluIHdpZmkiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQorICAgICAgICBtV2lmaUFwU3RhdGUuc2V0KHdpZmlBcFN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXRXaWZpQXBTdGF0ZTogIiArIHN5bmNHZXRXaWZpQXBTdGF0ZUJ5TmFtZSgpKTsKKworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX0FQX1NUQVRFLCB3aWZpQXBTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX0FQX1NUQVRFLCBwcmV2aW91c1dpZmlBcFN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBzY2FuIHJlc3VsdCBsaW5lIHBhc3NlZCB0byB1cyBieSB3cGFfc3VwcGxpY2FudCAoaGVscGVyKS4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwYXJzZQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBTY2FuUmVzdWx0fSBvYmplY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIFNjYW5SZXN1bHQgcGFyc2VTY2FuUmVzdWx0KFN0cmluZyBsaW5lKSB7CisgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWNoZSBpbXBsZW1lbnRhdGlvbiAoTGlua2VkSGFzaE1hcCkgaXMgbm90IHN5bmNocm9uaXplZCwgdGh1cywKKyAgICAgICAgICAgICAqIG11c3Qgc3luY2hyb25pemVkIGhlcmUhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNjYW5SZXN1bHRDYWNoZSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHNjYW5SZXN1bHRQYXR0ZXJuLnNwbGl0KGxpbmUpOworICAgICAgICAgICAgICAgIGlmICgzIDw9IHJlc3VsdC5sZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8PSA1KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBic3NpZCA9IHJlc3VsdFswXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnNzaWQgfCBmcmVxdWVuY3kgfCBsZXZlbCB8IGZsYWdzIHwgc3NpZAorICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcXVlbmN5OworICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSBsZXZlbCAtPSAyNTY7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogVGhlIGZvcm1hdHRpbmcgb2YgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgaXMgaW50ZW5kZWQgdG8gbWFrZSB0aGUgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAqIGxpbmUgdXAgbmljZWx5IHdoZW4gcHJpbnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICogbm90IHRvIG1ha2UgdGhlbSBlYXN5IHRvIHBhcnNlLiBTbyB3ZSBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvbWUgaGV1cmlzdGljcyB0byBmaWd1cmUgb3V0IHdoaWNoIGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAqIGlzIHRoZSBTU0lEIGFuZCB3aGljaCBmaWVsZCBpcyB0aGUgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZsYWdzOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0WzNdLmNoYXJBdCgwKSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoID09IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmVzdWx0WzNdOworICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFs0XTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIG11c3QgaGF2ZSAzIGZpZWxkczogbm8gZmxhZ3MgYW5kIHNzaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkICsgc3NpZCBpcyB0aGUgaGFzaCBrZXkKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGJzc2lkICsgc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9IG1TY2FuUmVzdWx0Q2FjaGUuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQubGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuU1NJRCA9IHNzaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmNhcGFiaWxpdGllcyA9IGZsYWdzOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYWRkIHNjYW4gcmVzdWx0cyB0aGF0IGhhdmUgbm8gU1NJRCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgc3NpZC50cmltKCkubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNjYW5SZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkLCBic3NpZCwgZmxhZ3MsIGxldmVsLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY2FuUmVzdWx0Q2FjaGUucHV0KGtleSwgc2NhblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJNaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgdGV4dCB3aXRoICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubGVuZ3RoICsgIiBmaWVsZHM6ICIgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2NhblJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzY2FuUmVzdWx0cyBpbnB1dCBmb3JtYXQKKyAgICAgKiAwMDpiYjpjYzpkZDpjYzplZSAgICAgICAyNDI3ICAgIDE2NiAgICAgW1dQQS1FQVAtVEtJUF1bV1BBMi1FQVAtQ0NNUF0gICBOZXQxCisgICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZmYgICAgICAgMjQxMiAgICAxNjUgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRTY2FuUmVzdWx0cyhTdHJpbmcgc2NhblJlc3VsdHMpIHsKKyAgICAgICAgaWYgKHNjYW5SZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2Nhbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFNjYW5SZXN1bHQ+KCk7CisKKyAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7CisKKyAgICAgICAgaW50IHNjYW5SZXN1bHRzTGVuID0gc2NhblJlc3VsdHMubGVuZ3RoKCk7CisgICAgICAgIC8vIFBhcnNlIHRoZSByZXN1bHQgc3RyaW5nLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgbGFzdCBsaW5lIGRvZXMKKyAgICAgICAgLy8gbm90IGVuZCB3aXRoIGEgbmV3bGluZS4KKyAgICAgICAgZm9yIChpbnQgbGluZUJlZyA9IDAsIGxpbmVFbmQgPSAwOyBsaW5lRW5kIDw9IHNjYW5SZXN1bHRzTGVuOyArK2xpbmVFbmQpIHsKKyAgICAgICAgICAgIGlmIChsaW5lRW5kID09IHNjYW5SZXN1bHRzTGVuIHx8IHNjYW5SZXN1bHRzLmNoYXJBdChsaW5lRW5kKSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgKytsaW5lQ291bnQ7CisKKyAgICAgICAgICAgICAgICBpZiAobGluZUNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmVFbmQgPiBsaW5lQmVnKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gc2NhblJlc3VsdHMuc3Vic3RyaW5nKGxpbmVCZWcsIGxpbmVFbmQpOworICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBwYXJzZVNjYW5SZXN1bHQobGluZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5MaXN0LmFkZChzY2FuUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCBmb3I6ICIgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtU2NhblJlc3VsdHMgPSBzY2FuTGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBmZXRjaFNTSUQoKSB7CisgICAgICAgIFN0cmluZyBzdGF0dXMgPSBXaWZpTmF0aXZlLnN0YXR1c0NvbW1hbmQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBleHRyYWN0IHNzaWQgZnJvbSBhIHNlcmllcyBvZiAibmFtZT12YWx1ZSIKKyAgICAgICAgU3RyaW5nW10gbGluZXMgPSBzdGF0dXMuc3BsaXQoIlxuIik7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgeworICAgICAgICAgICAgU3RyaW5nW10gcHJvcCA9IGxpbmUuc3BsaXQoIiAqPSAqIik7CisgICAgICAgICAgICBpZiAocHJvcC5sZW5ndGggPCAyKSBjb250aW51ZTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcFswXTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BbMV07CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzc2lkIikpIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlTGlua1Byb3BlcnRpZXMoKSB7CisgICAgICAgIGlmIChXaWZpQ29uZmlnU3RvcmUuaXNVc2luZ1N0YXRpY0lwKG1MYXN0TmV0d29ya0lkKSkgeworICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gV2lmaUNvbmZpZ1N0b3JlLmdldExpbmtQcm9wZXJ0aWVzKG1MYXN0TmV0d29ya0lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE8gLSBmaXggdGhpcyBmb3IgdjYKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobURoY3BJbmZvKSB7CisgICAgICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLmFkZExpbmtBZGRyZXNzKG5ldyBMaW5rQWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5pcEFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MobURoY3BJbmZvLm5ldG1hc2spKSk7CisgICAgICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLnNldEdhdGV3YXkoTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MobURoY3BJbmZvLmdhdGV3YXkpKTsKKyAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMuYWRkRG5zKE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5kbnMxKSk7CisgICAgICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLmFkZERucyhOZXR3b3JrVXRpbHMuaW50VG9JbmV0QWRkcmVzcyhtRGhjcEluZm8uZG5zMikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLnNldEh0dHBQcm94eShXaWZpQ29uZmlnU3RvcmUuZ2V0UHJveHlQcm9wZXJ0aWVzKG1MYXN0TmV0d29ya0lkKSk7CisgICAgICAgIH0KKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLnNldEludGVyZmFjZU5hbWUobUludGVyZmFjZU5hbWUpOworICAgICAgICBMb2cuZChUQUcsICJuZXRJZD0iICsgbUxhc3ROZXR3b3JrSWQgICsgIiBMaW5rIGNvbmZpZ3VyZWQ6ICIgKyBtTGlua1Byb3BlcnRpZXMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0TWF4RGhjcFJldHJpZXMoKSB7CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9NQVhfREhDUF9SRVRSWV9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB3aGlsZSBvYnRhaW5pbmcgSVAgYWRkcmVzcy4gVGhpcworICAgICAqIGxvZ2ljIHdpbGwgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVudCBibHVldG9vdGgKKyAgICAgKiBoZWFkc2V0L2hhbmRzZnJlZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQuIFRoaXMgbWVhbnMgaWYgaXQgaXMgaW4gYW4KKyAgICAgKiBlcnJvciBzdGF0ZSwgd2Ugd2lsbCBOT1QgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHRvIGVyciBvbiB0aGUgc2lkZQorICAgICAqIG9mIHNhZmV0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkgeworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gbUJsdWV0b290aEhlYWRzZXQuZ2V0Q29ubmVjdGVkRGV2aWNlcygpOworCisgICAgICAgIHJldHVybiAoZGV2aWNlcy5zaXplKCkgIT0gMCA/IHRydWUgOiBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjaGVja0lzQmx1ZXRvb3RoUGxheWluZygpIHsKKyAgICAgICAgYm9vbGVhbiBpc0JsdWV0b290aFBsYXlpbmcgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwICE9IG51bGwpIHsKKyAgICAgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGNvbm5lY3RlZCA9IG1CbHVldG9vdGhBMmRwLmdldENvbm5lY3RlZERldmljZXMoKTsKKworICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogY29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwLmlzQTJkcFBsYXlpbmcoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBpc0JsdWV0b290aFBsYXlpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoaXNCbHVldG9vdGhQbGF5aW5nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyIG1CbHVldG9vdGhQcm9maWxlU2VydmljZUxpc3RlbmVyID0KKyAgICAgICAgbmV3IEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoaW50IHByb2ZpbGUsIEJsdWV0b290aFByb2ZpbGUgcHJveHkpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoV2lmaVN0YXRlTWFjaGluZS50aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gKEJsdWV0b290aEhlYWRzZXQpIHByb3h5OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLkEyRFApIHsKKyAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEEyZHAgPSAoQmx1ZXRvb3RoQTJkcClwcm94eTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoaW50IHByb2ZpbGUpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoV2lmaVN0YXRlTWFjaGluZS50aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5BMkRQKSB7CisgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBMmRwID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZUJyb2FkY2FzdCgpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNDQU5fUkVTVUxUU19BVkFJTEFCTEVfQUNUSU9OKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KGZpbmFsIGludCBuZXdSc3NpKSB7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlJTU0lfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1JTU0ksIG5ld1Jzc2kpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPLCBtTmV0d29ya0luZm8pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTElOS19QUk9QRVJUSUVTLCBtTGlua1Byb3BlcnRpZXMpOworICAgICAgICBpZiAoYnNzaWQgIT0gbnVsbCkKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9CU1NJRCwgYnNzaWQpOworICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLyogVE9ETzogVW51c2VkIGZvciBub3csIHdpbGwgYmUgdXNlZCB3aGVuIGlwIGNoYW5nZSBvbiBjb25uZWN0ZWQgbmV0d29yayBpcyBoYW5kbGVkICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRDb25maWdDaGFuZ2VCcm9hZGNhc3QoKSB7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5DT05GSUdfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTElOS19QUk9QRVJUSUVTLCBtTGlua1Byb3BlcnRpZXMpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KFN0YXRlQ2hhbmdlUmVzdWx0IHNjLCBib29sZWFuIGZhaWxlZEF1dGgpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfU1RBVEUsIChQYXJjZWxhYmxlKXNjLnN0YXRlKTsKKyAgICAgICAgaWYgKGZhaWxlZEF1dGgpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgKKyAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0VSUk9SLAorICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVSUk9SX0FVVEhFTlRJQ0FUSU5HKTsKKyAgICAgICAgfQorICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRTdXBwbGljYW50Q29ubmVjdGlvbkNoYW5nZWRCcm9hZGNhc3QoYm9vbGVhbiBjb25uZWN0ZWQpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9DT05ORUNUSU9OX0NIQU5HRV9BQ1RJT04pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9DT05ORUNURUQsIGNvbm5lY3RlZCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yay4KKyAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIExvZy5kKFRBRywgInNldERldGFpbGVkIHN0YXRlLCBvbGQgPSIKKyAgICAgICAgICAgICAgICArIG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkgKyAiIGFuZCBuZXcgc3RhdGU9IiArIHN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKKyAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBvbGwgZm9yIGluZm8gbm90IHJlcG9ydGVkIHZpYSBldmVudHMKKyAgICAgKiBSU1NJICYgTGlua3NwZWVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RQb2xsZWRJbmZvKCkgeworICAgICAgICBpbnQgbmV3UnNzaSA9IFdpZmlOYXRpdmUuZ2V0UnNzaUNvbW1hbmQoKTsKKyAgICAgICAgaWYgKG5ld1Jzc2kgIT0gLTEgJiYgLTIwMCA8IG5ld1Jzc2kgJiYgbmV3UnNzaSA8IDI1NikgeyAvLyBzY3JlZW4gb3V0IGludmFsaWQgdmFsdWVzCisgICAgICAgICAgICAvKiBzb21lIGltcGxlbWVudGF0aW9ucyBhdm9pZCBuZWdhdGl2ZSB2YWx1ZXMgYnkgYWRkaW5nIDI1NgorICAgICAgICAgICAgICogc28gd2UgbmVlZCB0byBhZGp1c3QgZm9yIHRoYXQgaGVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG5ld1Jzc2kgPiAwKSBuZXdSc3NpIC09IDI1NjsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXRSc3NpKG5ld1Jzc2kpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJhdGhlciB0aGVuIHNlbmRpbmcgdGhlIHJhdyBSU1NJIG91dCBldmVyeSB0aW1lIGl0CisgICAgICAgICAgICAgKiBjaGFuZ2VzLCB3ZSBwcmVjYWxjdWxhdGUgdGhlIHNpZ25hbCBsZXZlbCB0aGF0IHdvdWxkCisgICAgICAgICAgICAgKiBiZSBkaXNwbGF5ZWQgaW4gdGhlIHN0YXR1cyBiYXIsIGFuZCBvbmx5IHNlbmQgdGhlCisgICAgICAgICAgICAgKiBicm9hZGNhc3QgaWYgdGhhdCBtdWNoIG1vcmUgY29hcnNlLWdyYWluZWQgbnVtYmVyCisgICAgICAgICAgICAgKiBjaGFuZ2VzLiBUaGlzIGN1dHMgZG93biBncmVhdGx5IG9uIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAqIGJyb2FkY2FzdHMsIGF0IHRoZSBjb3N0IG9mIG5vdCBtV2lmaUluZm9ybWluZyBvdGhlcnMKKyAgICAgICAgICAgICAqIGludGVyZXN0ZWQgaW4gUlNTSSBvZiBhbGwgdGhlIGNoYW5nZXMgaW4gc2lnbmFsCisgICAgICAgICAgICAgKiBsZXZlbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLy8gVE9ETzogVGhlIHNlY29uZCBhcmcgdG8gdGhlIGNhbGwgYmVsb3cgbmVlZHMgdG8gYmUgYSBzeW1ib2wgc29tZXdoZXJlLCBidXQKKyAgICAgICAgICAgIC8vIGl0J3MgYWN0dWFsbHkgdGhlIHNpemUgb2YgYW4gYXJyYXkgb2YgaWNvbnMgdGhhdCdzIHByaXZhdGUKKyAgICAgICAgICAgIC8vIHRvIFN0YXR1c0JhciBQb2xpY3kuCisgICAgICAgICAgICBpbnQgbmV3U2lnbmFsTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChuZXdSc3NpLCA0KTsKKyAgICAgICAgICAgIGlmIChuZXdTaWduYWxMZXZlbCAhPSBtTGFzdFNpZ25hbExldmVsKSB7CisgICAgICAgICAgICAgICAgc2VuZFJzc2lDaGFuZ2VCcm9hZGNhc3QobmV3UnNzaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gbmV3U2lnbmFsTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0UnNzaSgtMjAwKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbmV3TGlua1NwZWVkID0gV2lmaU5hdGl2ZS5nZXRMaW5rU3BlZWRDb21tYW5kKCk7CisgICAgICAgIGlmIChuZXdMaW5rU3BlZWQgIT0gLTEpIHsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXRMaW5rU3BlZWQobmV3TGlua1NwZWVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgV2ktRmkgQ29ubmVjdGlvbnMgYnkgY2xlYXJpbmcgYW55IHN0YXRlLCByZXNldHRpbmcgYW55IHNvY2tldHMKKyAgICAgKiB1c2luZyB0aGUgaW50ZXJmYWNlLCBzdG9wcGluZyBESENQICYgZGlzYWJsaW5nIGludGVyZmFjZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOZXR3b3JrRGlzY29ubmVjdCgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiUmVzZXQgY29ubmVjdGlvbnMgYW5kIHN0b3BwaW5nIERIQ1AiKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBSZXNldCBjb25uZWN0aW9ucyAmIHN0b3AgREhDUAorICAgICAgICAgKi8KKyAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOworCisgICAgICAgIGlmICghTmV0d29ya1V0aWxzLnN0b3BEaGNwKG1JbnRlcmZhY2VOYW1lKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHN0b3AgREhDUCIpOworICAgICAgICB9CisKKyAgICAgICAgLyogRGlzYWJsZSBpbnRlcmZhY2UgKi8KKyAgICAgICAgTmV0d29ya1V0aWxzLmRpc2FibGVJbnRlcmZhY2UobUludGVyZmFjZU5hbWUpOworCisgICAgICAgIC8qIHNlbmQgZXZlbnQgdG8gQ00gJiBuZXR3b3JrIGNoYW5nZSBicm9hZGNhc3QgKi8KKyAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCk7CisgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7CisKKyAgICAgICAgLyogUmVzZXQgZGF0YSBzdHJ1Y3R1cmVzICovCisgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MoMCk7CisgICAgICAgIG1XaWZpSW5mby5zZXRCU1NJRChudWxsKTsKKyAgICAgICAgbVdpZmlJbmZvLnNldFNTSUQobnVsbCk7CisgICAgICAgIG1XaWZpSW5mby5zZXROZXR3b3JrSWQoLTEpOworCisgICAgICAgIC8qIENsZWFyIG5ldHdvcmsgcHJvcGVydGllcyAqLworICAgICAgICBtTGlua1Byb3BlcnRpZXMuY2xlYXIoKTsKKworICAgICAgICBtTGFzdEJzc2lkPSBudWxsOworICAgICAgICBtTGFzdE5ldHdvcmtJZCA9IC0xOworCisgICAgfQorCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogTm90aWZpY2F0aW9ucyBmcm9tIFdpZmlNb25pdG9yCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyoqCisgICAgICogQSBzdHJ1Y3R1cmUgZm9yIHN1cHBseWluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHN1cHBsaWNhbnQgc3RhdGUKKyAgICAgKiBjaGFuZ2UgaW4gdGhlIFNUQVRFX0NIQU5HRSBldmVudCBtZXNzYWdlIHRoYXQgY29tZXMgZnJvbSB0aGUKKyAgICAgKiBXaWZpTW9uaXRvcgorICAgICAqIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0ZUNoYW5nZVJlc3VsdCB7CisgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0KGludCBuZXR3b3JrSWQsIFN0cmluZyBCU1NJRCwgT2JqZWN0IHN0YXRlKSB7CisgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICB0aGlzLkJTU0lEID0gQlNTSUQ7CisgICAgICAgICAgICB0aGlzLm5ldHdvcmtJZCA9IG5ldHdvcmtJZDsKKyAgICAgICAgfQorICAgICAgICBpbnQgbmV0d29ya0lkOworICAgICAgICBTdHJpbmcgQlNTSUQ7CisgICAgICAgIE9iamVjdCBzdGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSB1c2VyLWVudGVyZWQgcGFzc3dvcmQga2V5CisgICAgICogbWF5IGJlIGluY29ycmVjdCAoaS5lLiwgY2F1c2VkIGF1dGhlbnRpY2F0aW9uIHRvIGZhaWwpLgorICAgICAqLworICAgIHZvaWQgbm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudAorICAgICAqIGRhZW1vbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRDb25uZWN0aW9uKCkgeworICAgICAgICBzZW5kTWVzc2FnZShTVVBfQ09OTkVDVElPTl9FVkVOVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudAorICAgICAqIGRhZW1vbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRMb3N0KCkgeworICAgICAgICBzZW5kTWVzc2FnZShTVVBfRElTQ09OTkVDVElPTl9FVkVOVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdGF0ZSBvZiBXaWZpIGNvbm5lY3Rpdml0eQorICAgICAqIGhhcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIGNvbmZpZ3VyZWQgbmV0d29yayBvbiB3aGljaCB0aGUgc3RhdGUgY2hhbmdlIG9jY3VycmVkCisgICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbmV0d29yayBzdGF0ZQorICAgICAqIEBwYXJhbSBCU1NJRCB3aGVuIHRoZSBuZXcgc3RhdGUgaXMge0BsaW5rIERldGFpbGVkU3RhdGUjQ09OTkVDVEVECisgICAgICogTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUR9LAorICAgICAqIHRoaXMgaXMgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBhY2Nlc3MgcG9pbnQuIE90aGVyd2lzZSwgaXQKKyAgICAgKiBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgdm9pZCBub3RpZnlOZXR3b3JrU3RhdGVDaGFuZ2UoRGV0YWlsZWRTdGF0ZSBuZXdTdGF0ZSwgU3RyaW5nIEJTU0lELCBpbnQgbmV0d29ya0lkKSB7CisgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCkgeworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0ZUNoYW5nZVJlc3VsdChuZXR3b3JrSWQsIEJTU0lELCBuZXdTdGF0ZSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBzdXBwbGljYW50CisgICAgICogaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyB7QGNvZGUgU3VwcGxpY2FudFN0YXRlfQorICAgICAqLworICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudFN0YXRlQ2hhbmdlKGludCBuZXR3b3JrSWQsIFN0cmluZyBCU1NJRCwgU3VwcGxpY2FudFN0YXRlIG5ld1N0YXRlKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQsCisgICAgICAgICAgICAgICAgbmV3IFN0YXRlQ2hhbmdlUmVzdWx0KG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N0YXRlKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIHNjYW4gaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMKKyAgICAgKiBhcmUgYXZhaWxhYmxlLgorICAgICAqLworICAgIHZvaWQgbm90aWZ5U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTd2l0Y2ggc2NhbiBtb2RlIG92ZXIgdG8gcGFzc2l2ZS4KKyAgICAgICAgICogVHVybmluZyBvZmYgc2Nhbi1vbmx5IG1vZGUgaGFwcGVucyBvbmx5IGluICJDb25uZWN0IiBtb2RlCisgICAgICAgICAqLworICAgICAgICBzZXRTY2FuVHlwZShmYWxzZSk7CisgICAgICAgIHNlbmRNZXNzYWdlKFNDQU5fUkVTVUxUU19FVkVOVCk7CisgICAgfQorCisgICAgdm9pZCBub3RpZnlEcml2ZXJTdGFydGVkKCkgeworICAgICAgICBzZW5kTWVzc2FnZShEUklWRVJfU1RBUlRfRVZFTlQpOworICAgIH0KKworICAgIHZvaWQgbm90aWZ5RHJpdmVyU3RvcHBlZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoRFJJVkVSX1NUT1BfRVZFTlQpOworICAgIH0KKworICAgIHZvaWQgbm90aWZ5RHJpdmVySHVuZygpIHsKKyAgICAgICAgc2V0V2lmaUVuYWJsZWQoZmFsc2UpOworICAgICAgICBzZXRXaWZpRW5hYmxlZCh0cnVlKTsKKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEhTTSBzdGF0ZXMKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGNsYXNzIERlZmF1bHRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtczsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFN5bmNocm9ub3VzIGNhbGwgcmV0dXJucyAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1BJTkdfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRU1PVkVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9FTkFCTEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNBQkxFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQUREX09SX1VQREFURV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9SU1NJOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9SU1NJX0FQUFJPWDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfTElOS19TUEVFRDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfTUFDX0FERFI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0FWRV9DT05GSUc6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5zdHJpbmdWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9FTkFCTEVfUlNTSV9QT0xMOgorICAgICAgICAgICAgICAgICAgICBtRW5hYmxlUnNzaVBvbGxpbmcgPSAobWVzc2FnZS5hcmcxID09IDEpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5zZW5kTWVzc2FnZShDTURfRU5BQkxFX1JTU0lfUE9MTCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBEaXNjYXJkICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09ORklHVVJFX0lQOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVEFSVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVE9QX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0JMQUNLTElTVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NMRUFSX0JMQUNLTElTVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DT05ORUNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0FWRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0ZPUkdFVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1dQUzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIHVuaGFuZGxlZCBtZXNzYWdlIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgSW5pdGlhbFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgLy9UT0RPOiBjb3VsZCBtb3ZlIGxvZ2dpbmcgaW50byBhIGNvbW1vbiBjbGFzcworICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAvLyBbMzEtOF0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgIC8vIFs3IC0gMF0gSFNNIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgLy8gNTAwMjEgd2lmaV9zdGF0ZV9jaGFuZ2VkIChjdXN0b218MXw1KQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmIChXaWZpTmF0aXZlLmlzRHJpdmVyTG9hZGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyVW5sb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJMb2FkaW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29weUZyb20oZ2V0Q3VycmVudE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAvKiBUT0RPOiBhZGQgYSB0aW1lb3V0IHRvIGZhaWwgd2hlbiBkcml2ZXIgbG9hZCBpcyBodW5nLgorICAgICAgICAgICAgICogU2ltaWxhcmx5IGZvciBkcml2ZXIgdW5sb2FkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxpbmcgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX0VOQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0VOQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKFdpZmlOYXRpdmUubG9hZERyaXZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEcml2ZXIgbG9hZCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfTE9BRF9EUklWRVJfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gbG9hZCBkcml2ZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS5hcmcxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0xPQURfRFJJVkVSX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckZhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlckxvYWRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclVubG9hZGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYoV2lmaU5hdGl2ZS5zdGFydFN1cHBsaWNhbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3VwcGxpY2FudCBzdGFydCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaU1vbml0b3Iuc3RhcnRNb25pdG9yaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9FTkFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtV2FpdEZvclN1cFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzdGFydCBzdXBwbGljYW50ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9VTktOT1dOLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RhcnRBY2Nlc3NQb2ludCgoV2lmaUNvbmZpZ3VyYXRpb24pIG1lc3NhZ2Uub2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RhcnRBY2Nlc3NQb2ludCgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU29mdCBBUCBzdGFydCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRU5BQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU29mdEFwU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclVubG9hZGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtZXNzYWdlLmNvcHlGcm9tKGdldEN1cnJlbnRNZXNzYWdlKCkpOworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICBpZihXaWZpTmF0aXZlLnVubG9hZERyaXZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEcml2ZXIgdW5sb2FkIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS5hcmcxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9VTktOT1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVubG9hZCBkcml2ZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVJfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJVbmxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckZhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclVubG9hZGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkaW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyRmFpbGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisKKyAgICBjbGFzcyBXYWl0Rm9yU3VwU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgU1VQX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5yZXNldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcyAqLworICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOworCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRNYWNBZGRyZXNzKFdpZmlOYXRpdmUuZ2V0TWFjQWRkcmVzc0NvbW1hbmQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmluaXRpYWxpemUobUNvbnRleHQpOworCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogaW5pdGlhbGl6ZSBhbmQgZml4IG11bHRpY2FzdCBmaWx0ZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgLy9tV00uaW5pdGlhbGl6ZU11bHRpY2FzdEZpbHRlcmluZygpOworCisgICAgICAgICAgICAgICAgICAgIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRDb25uZWN0aW9uQ2hhbmdlZEJyb2FkY2FzdCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdG9wIHN1cHBsaWNhbnQgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wU3VwcGxpY2FudCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIEZhaWwgc29mdCBhcCB3aGVuIHdhaXRpbmcgZm9yIHN1cHBsaWNhbnQgc3RhcnQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IHNvZnQgQVAgd2l0aCBhIHJ1bm5pbmcgc3VwcGxpY2FudCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJTdXBSZWFkeVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgICAgICAvKiBJbml0aWFsaXplIGZvciBjb25uZWN0IG1vZGUgb3BlcmF0aW9uIGF0IHN0YXJ0ICovCisgICAgICAgICAgICBtSXNTY2FuTW9kZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9TVVBQTElDQU5UOiAgIC8qIFN1cHBsaWNhbnQgc3RvcHBlZCBieSB1c2VyICovCisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN0b3Agc3VwcGxpY2FudCByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0b3BTdXBwbGljYW50KCk7CisgICAgICAgICAgICAgICAgICAgIC8vJEZBTEwtVEhST1VHSCQKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UOiAgLyogU3VwcGxpY2FudCBkaWVkICovCisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRDb25uZWN0aW9uQ2hhbmdlZEJyb2FkY2FzdChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnJlc2V0U3VwcGxpY2FudFN0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gc3VwcGxpY2FudCBkaWVzLCB1bmxvYWQgZHJpdmVyIGFuZCBlbnRlciBmYWlsZWQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjb25zaWRlciBicmluZ2luZyB1cCBzdXBwbGljYW50IGFnYWluCisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLndoYXQgPT0gU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgZGllZCwgdW5sb2FkaW5nIGRyaXZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9VTktOT1dOLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdGFydERyaXZlckNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdGFydGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFNfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHNldFNjYW5SZXN1bHRzKFdpZmlOYXRpdmUuc2NhblJlc3VsdHNDb21tYW5kKCkpOworICAgICAgICAgICAgICAgICAgICBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGVCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUElOR19TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlOYXRpdmUucGluZ0NvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IChXaWZpQ29uZmlndXJhdGlvbikgc3luY1BhcmFtcy5tUGFyYW1ldGVyOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaUNvbmZpZ1N0b3JlLmFkZE9yVXBkYXRlTmV0d29yayhjb25maWcpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVNT1ZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlDb25maWdTdG9yZS5yZW1vdmVOZXR3b3JrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBFbmFibGVOZXRQYXJhbXMgZW5hYmxlTmV0UGFyYW1zID0gKEVuYWJsZU5ldFBhcmFtcykgc3luY1BhcmFtcy5tUGFyYW1ldGVyOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlDb25maWdTdG9yZS5lbmFibGVOZXR3b3JrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU5ldFBhcmFtcy5uZXRJZCwgZW5hYmxlTmV0UGFyYW1zLmRpc2FibGVPdGhlcnMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpQ29uZmlnU3RvcmUuZGlzYWJsZU5ldHdvcmsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0JMQUNLTElTVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5hZGRUb0JsYWNrbGlzdENvbW1hbmQoKFN0cmluZyltZXNzYWdlLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NMRUFSX0JMQUNLTElTVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5jbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0FWRV9DT05GSUc6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaUNvbmZpZ1N0b3JlLnNhdmVDb25maWcoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEluZm9ybSB0aGUgYmFja3VwIG1hbmFnZXIgYWJvdXQgYSBkYXRhIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICBJQmFja3VwTWFuYWdlciBpYm0gPSBJQmFja3VwTWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5CQUNLVVBfU0VSVklDRSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWJtLmRhdGFDaGFuZ2VkKCJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IGFnYWluIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX01BQ19BRERSOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLnN0cmluZ1ZhbHVlID0gV2lmaU5hdGl2ZS5nZXRNYWNBZGRyZXNzQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIENhbm5vdCBzdGFydCBzb2Z0IEFQIHdoaWxlIGluIGNsaWVudCBtb2RlICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBzdGFydCBzb2Z0IEFQIHdpdGggYSBydW5uaW5nIHN1cHBsaWNhbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0FWRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBjb25maWcgPSAoV2lmaUNvbmZpZ3VyYXRpb24pIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuc2F2ZU5ldHdvcmsoY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRk9SR0VUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5mb3JnZXROZXR3b3JrKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RhcnRpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RBUlRfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIFF1ZXVlIGRyaXZlciBjb21tYW5kcyAmIGNvbm5lY3Rpb24gZXZlbnRzICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RhcnRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIG1Jc1J1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgdXBkYXRlQmF0dGVyeVdvcmtTb3VyY2UobnVsbCk7CisKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgY2hhbm5lbCBjb3VudCAqLworICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU1RPUFNISVAKKyAgICAgICAgICAgICAqIFRPRE86IFdlIGFyZSBoYXZpbmcgMTFBIGlzc3VlcyB0aGF0IEJyb2FkY29tIGlzIGxvb2tpbmcKKyAgICAgICAgICAgICAqIHRvIHJlc29sdmUsIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IHRvIGFsbG93IG9ubHkgMTFCL0cKKyAgICAgICAgICAgICAqIGFuZCBoZWxwIGltcHJvdmUgR29vZ2xlR3Vlc3QgY29ubmVjdGl2aXR5CisgICAgICAgICAgICAgKiBXZSBhbHNvIG5lZWQgdG8gYWRkIHRoZSBVSSBmb3IgYmFuZCBjb250cm9sCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0QmFuZENvbW1hbmQoQkFORF8yRyk7CisKKyAgICAgICAgICAgIGlmIChtSXNTY2FuTW9kZSkgeworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChTQ0FOX09OTFlfTU9ERSk7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU2Nhbk1vZGVTdGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChDT05ORUNUX01PREUpOworICAgICAgICAgICAgICAgIC8qIElmIHN1cHBsaWNhbnQgaGFzIGFscmVhZHkgY29ubmVjdGVkLCBiZWZvcmUgd2UgY291bGQgZmluaXNoIGVzdGFibGlzaGluZworICAgICAgICAgICAgICAgICAqIHRoZSBjb250cm9sIGNoYW5uZWwgY29ubmVjdGlvbiwgd2UgbWlzcyBhbGwgdGhlIHN1cHBsaWNhbnQgZXZlbnRzLgorICAgICAgICAgICAgICAgICAqIERpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdCB3aGVuIGRyaXZlciBoYXMgc3RhcnRlZCB0byBlbnN1cmUgd2UgcmVjZWl2ZQorICAgICAgICAgICAgICAgICAqIGFsbCBzdXBwbGljYW50IGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFRPRE86IFRoaXMgaXMgYSBiaXQgdW5jbGVhbiwgaWRlYWxseSB0aGUgc3VwcGxpY2FudCBzaG91bGQgbmV2ZXIKKyAgICAgICAgICAgICAgICAgKiBjb25uZWN0IHVudGlsIHRvbGQgdG8gZG8gc28gYnkgdGhlIGZyYW1ld29yaworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuTW9kZUNvbW1hbmQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5Nb2RlQ29tbWFuZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VTY2FuTW9kZUNvbW1hbmQobWVzc2FnZS5hcmcxID09IDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgICAgIG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSBtZXNzYWdlLmFyZzE7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBhbm90aGVyIGRyaXZlciBzdGFydCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wRHJpdmVyQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN0b3BwaW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRVFVRVNUX0NNX1dBS0VMT0NLOgorICAgICAgICAgICAgICAgICAgICBpZiAobUNtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DbS5yZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhUQUcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wUGFja2V0RmlsdGVyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgbUlzUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgdXBkYXRlQmF0dGVyeVdvcmtTb3VyY2UobnVsbCk7CisgICAgICAgICAgICBtU2NhblJlc3VsdHMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RvcHBpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RPUF9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdG9wcGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogUXVldWUgZHJpdmVyIGNvbW1hbmRzICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RvcHBlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNjYW5Nb2RlU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb25uZWN0TW9kZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtczsKKyAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0OworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLmhhbmRsZUV2ZW50KHN0YXRlQ2hhbmdlUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0byBzZXQgc2NhbiB0eXBlIGluIGNvbXBsZXRlZCBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG5ld01zZyA9IG9idGFpbk1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3TXNnLmNvcHlGcm9tKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5zZW5kTWVzc2FnZShuZXdNc2cpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogRG8gYSByZWR1bmRhbnQgZGlzY29ubmVjdCB3aXRob3V0IHRyYW5zaXRpb24gKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlYXNzb2NpYXRlQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DT05ORUNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIGludCBuZXRJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICAgICAvKiBXZSBjb25uZWN0IHRvIGEgc3BlY2lmaWMgbmV0d29yayBieSBpc3N1aW5nIGEgc2VsZWN0CisgICAgICAgICAgICAgICAgICAgICAqIHRvIHRoZSBXaWZpQ29uZmlnU3RvcmUuIFRoaXMgZW5hYmxlcyB0aGUgbmV0d29yaywKKyAgICAgICAgICAgICAgICAgICAgICogd2hpbGUgZGlzYWJsaW5nIGFsbCBvdGhlciBuZXR3b3JrcyBpbiB0aGUgc3VwcGxpY2FudC4KKyAgICAgICAgICAgICAgICAgICAgICogRGlzYWJsaW5nIGEgY29ubmVjdGVkIG5ldHdvcmsgd2lsbCBjYXVzZSBhIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICogZnJvbSB0aGUgbmV0d29yay4gQSByZWNvbm5lY3RDb21tYW5kKCkgd2lsbCB0aGVuIGluaXRpYXRlCisgICAgICAgICAgICAgICAgICAgICAqIGEgY29ubmVjdGlvbiB0byB0aGUgZW5hYmxlZCBuZXR3b3JrLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuc2VsZWN0TmV0d29yayhjb25maWcpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLnNlbGVjdE5ldHdvcmsobmV0SWQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBuZWVkIHRvIGVuYWJsZSBhbGwKKyAgICAgICAgICAgICAgICAgICAgICogbmV0d29ya3MgYWZ0ZXIgc3VwcGxpY2FudCBpbmRpY2F0ZXMgYSBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlIGNoYW5nZSBldmVudAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZUFsbE5ldHdvcmtzID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBFeHBlY3QgYSBkaXNjb25uZWN0aW9uIGZyb20gdGhlIG9sZCBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfV1BTOgorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnNzaWQgPSAoU3RyaW5nKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFwUGluID0gbWVzc2FnZS5hcmcxOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3M7CisgICAgICAgICAgICAgICAgICAgIGlmIChhcFBpbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUFMgcGluIG1ldGhvZCBjb25maWd1cmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gV2lmaUNvbmZpZ1N0b3JlLnN0YXJ0V3BzUGluKGJzc2lkLCBhcFBpbik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUFMgcHVzaCBidXR0b24gY29uZmlndXJhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFdpZmlDb25maWdTdG9yZS5zdGFydFdwc1BiYyhic3NpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogRHVyaW5nIFdQUyBzZXR1cCwgYWxsIG90aGVyIG5ldHdvcmtzIGFyZSBkaXNhYmxlZC4gQWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICogYSBzdWNjZXNzZnVsIGNvbm5lY3QgYSBuZXcgY29uZmlnIGlzIGNyZWF0ZWQgaW4gdGhlIHN1cHBsaWNhbnQuCisgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAqIFdlIG5lZWQgdG8gZW5hYmxlIGFsbCBuZXR3b3JrcyBhZnRlciBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgKiBvciB3aGVuIHN1cHBsaWNhbnQgZ29lcyBpbmFjdGl2ZSBkdWUgdG8gZmFpbHVyZS4gRW5hYmxpbmcgYWxsCisgICAgICAgICAgICAgICAgICAgICAqIG5ldHdvcmtzIGFmdGVyIGEgZGlzY29ubmVjdCBpcyBvYnNlcnZlZCBhcyBkb25lIHdpdGggY29ubmVjdE5ldHdvcmsKKyAgICAgICAgICAgICAgICAgICAgICogZG9lcyBub3QgbGVhZCB0byBhIHN1Y2Nlc3NmdWwgV1BTIHNldHVwLgorICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgKiBVcG9uIHN1Y2Nlc3MsIHRoZSBjb25maWd1cmF0aW9uIGxpc3QgbmVlZHMgdG8gYmUgcmVsb2FkZWQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV3BzU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHBlY3QgYSBkaXNjb25uZWN0aW9uIGZyb20gdGhlIG9sZCBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFNfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgc2NhbiBzZXR0aW5nIGJhY2sgdG8gImNvbm5lY3QiIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKENPTk5FQ1RfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIC8qIEhhbmRsZSBzY2FuIHJlc3VsdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIk5ldHdvcmsgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBtYWtlIHN1cHBsaWNhbnQgbW9kaWZpY2F0aW9uIHRvIHB1c2ggdGhpcyBpbiBldmVudHMKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldFNTSUQoZmV0Y2hTU0lEKCkpOworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0QlNTSUQobUxhc3RCc3NpZCA9IHN0YXRlQ2hhbmdlUmVzdWx0LkJTU0lEKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZChzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgICBtTGFzdE5ldHdvcmtJZCA9IHN0YXRlQ2hhbmdlUmVzdWx0Lm5ldHdvcmtJZDsKKyAgICAgICAgICAgICAgICAgICAgLyogc2VuZCBldmVudCB0byBDTSAmIG5ldHdvcmsgY2hhbmdlIGJyb2FkY2FzdCAqLworICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuT0JUQUlOSU5HX0lQQUREUik7CisgICAgICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiTmV0d29yayBjb25uZWN0aW9uIGxvc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9SU1NJOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRSc3NpQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX1JTU0lfQVBQUk9YOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRSc3NpQXBwcm94Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX0xJTktfU1BFRUQ6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSBXaWZpTmF0aXZlLmdldExpbmtTcGVlZENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb25uZWN0aW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIGJvb2xlYW4gbU1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlOworICAgICAgICBpbnQgbVBvd2VyTW9kZTsKKyAgICAgICAgYm9vbGVhbiBtVXNlU3RhdGljSXA7CisgICAgICAgIFRocmVhZCBtRGhjcFRocmVhZDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIG1Vc2VTdGF0aWNJcCA9IFdpZmlDb25maWdTdG9yZS5pc1VzaW5nU3RhdGljSXAobUxhc3ROZXR3b3JrSWQpOworICAgICAgICAgICAgaWYgKCFtVXNlU3RhdGljSXApIHsKKyAgICAgICAgICAgICAgICBtRGhjcFRocmVhZCA9IG51bGw7CisgICAgICAgICAgICAgICAgbU1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVBvd2VyTW9kZSA9IERSSVZFUl9QT1dFUl9NT0RFX0FVVE87CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPKCk6IEluY29ycG9yYXRlIHRoZSBlbHNlIHBhcnQgaW4gdGhlIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAvLyBJZiBtQmx1ZXRvb3RoSGVhZHNldCA9PSBudWxsLCBtZWFucyBpdCBub3QgY29uZW5jdGVkIHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIHNlcnZpY2UgeWV0LgorICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoSGVhZHNldCAhPSBudWxsICYmIHNob3VsZERpc2FibGVDb2V4aXN0ZW5jZU1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZSBhcmUgcHJvYmxlbXMgc2V0dGluZyB0aGUgV2ktRmkgZHJpdmVyJ3MgcG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICogbW9kZSB0byBhY3RpdmUgd2hlbiBibHVldG9vdGggY29leGlzdGVuY2UgbW9kZSBpcworICAgICAgICAgICAgICAgICAgICAgKiBlbmFibGVkIG9yIHNlbnNlLgorICAgICAgICAgICAgICAgICAgICAgKiA8cD4KKyAgICAgICAgICAgICAgICAgICAgICogV2Ugc2V0IFdpLUZpIHRvIGFjdGl2ZSBtb2RlIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MgYmVjYXVzZSB3ZSd2ZSBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aXRoIHNvbWUgcm91dGVycyB3aXRoIGxvdyBwb3dlcgorICAgICAgICAgICAgICAgICAgICAgKiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgKiA8cD4KKyAgICAgICAgICAgICAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoaXMgYWN0aXZlIHBvd2VyIG1vZGUgdG8gcHJvcGVybHkgYmUgc2V0LAorICAgICAgICAgICAgICAgICAgICAgKiB3ZSBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgdW50aWwgd2UncmUgZG9uZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzLiAgT25lIGV4Y2VwdGlvbiBpcyBpZiB3ZQorICAgICAgICAgICAgICAgICAgICAgKiBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGhlYWRzZXQsIHNpbmNlIGRpc2FibGluZworICAgICAgICAgICAgICAgICAgICAgKiBjb2V4aXN0ZW5jZSB3b3VsZCBpbnRlcnJ1cHQgdGhhdCBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbU1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjb2V4aXN0ZW5jZSBtb2RlCisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVEKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtUG93ZXJNb2RlID0gIFdpZmlOYXRpdmUuZ2V0UG93ZXJNb2RlQ29tbWFuZCgpOworICAgICAgICAgICAgICAgIGlmIChtUG93ZXJNb2RlIDwgMCkgeworICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN1cHBsaWNhbnQgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgIC8vIGdldFBvd2VyTW9kZUNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgIG1Qb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVBvd2VyTW9kZSAhPSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRQb3dlck1vZGVDb21tYW5kKERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiREhDUCByZXF1ZXN0IHN0YXJ0ZWQiKTsKKyAgICAgICAgICAgICAgICBtRGhjcFRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEaGNwSW5mbyBkaGNwSW5mbyA9IG5ldyBEaGNwSW5mbygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5ydW5EaGNwKG1JbnRlcmZhY2VOYW1lLCBkaGNwSW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJESENQIHJlcXVlc3Qgc3VjY2VlZGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRGhjcEluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURoY3BJbmZvID0gZGhjcEluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBmYWlsZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmdldERoY3BFcnJvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfSVBfQ09ORklHX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRGhjcEluZm8gZGhjcEluZm8gPSBXaWZpQ29uZmlnU3RvcmUuZ2V0SXBDb25maWd1cmF0aW9uKG1MYXN0TmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLmNvbmZpZ3VyZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSwgZGhjcEluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1EaGNwSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURoY3BJbmZvID0gZGhjcEluZm87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0lQX0NPTkZJR19TVUNDRVNTKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJTdGF0aWMgSVAgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0lQX0NPTkZJR19GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisKKyAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgIGNhc2UgQ01EX0lQX0NPTkZJR19TVUNDRVNTOgorICAgICAgICAgICAgICAgICAgbVJlY29ubmVjdENvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsgLy8gZm9yY2UgdXBkYXRlIG9mIHNpZ25hbCBzdHJlbmd0aAorICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRGhjcEluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKG1EaGNwSW5mby5pcEFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgY29uZmlndXJlTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOworICAgICAgICAgICAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtTGFzdEJzc2lkKTsKKyAgICAgICAgICAgICAgICAgIC8vVE9ETzogVGhlIGZyYW1ld29yayBpcyBub3QgZGV0ZWN0aW5nIGEgREhDUCByZW5ld2FsIGFuZCBhIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgICAvL0lQIGNoYW5nZS4gd2Ugc2hvdWxkIGRldGVjdCB0aGlzIGFuZCBzZW5kIG91dCBhIGNvbmZpZyBjaGFuZ2UgYnJvYWRjYXN0CisgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9JUF9DT05GSUdfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MoMCk7CisKKyAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIklQIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAqIElmIHdlJ3ZlIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGZvciBESENQCisgICAgICAgICAgICAgICAgICAgKiB0byBhIGdpdmVuIG5ldHdvcmssIGRpc2FibGUgdGhlIG5ldHdvcmsKKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKCsrbVJlY29ubmVjdENvdW50ID4gZ2V0TWF4RGhjcFJldHJpZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlY29ubmVjdENvdW50ICsgIiB0aW1lcywgRGlzYWJsaW5nICIgKyBtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmRpc2FibGVOZXR3b3JrKG1MYXN0TmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgLyogREhDUCB0aW1lcyBvdXQgYWZ0ZXIgYWJvdXQgMzAgc2Vjb25kcywgd2UgZG8gYQorICAgICAgICAgICAgICAgICAgICogZGlzY29ubmVjdCBhbmQgYW4gaW1tZWRpYXRlIHJlY29ubmVjdCB0byB0cnkgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgLyogSWdub3JlIGNvbm5lY3Rpb24gdG8gc2FtZSBuZXR3b3JrICovCisgICAgICAgICAgICAgIGNhc2UgQ01EX0NPTk5FQ1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgIGludCBuZXRJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0TmV0d29ya0lkKCkgPT0gbmV0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05GSUdVUkVfSVA6CisgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgfQorICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgLyogcmVzZXQgcG93ZXIgc3RhdGUgJiBibHVldG9vdGggY29leGlzdGVuY2UgaWYgb24gREhDUCAqLworICAgICAgICAgIGlmICghbVVzZVN0YXRpY0lwKSB7CisgICAgICAgICAgICAgIGlmIChtUG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRQb3dlck1vZGVDb21tYW5kKG1Qb3dlck1vZGUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKG1Nb2RpZmllZEJsdWV0b290aENvZXhpc3RlbmNlTW9kZSkgeworICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBjb2V4aXN0ZW5jZSBtb2RlIGJhY2sgdG8gaXRzIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5CTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb25uZWN0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIC8qIEEgc3VjY2Vzc2Z1bCBXUFMgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgaWYgKG1XcHNTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmVuYWJsZUFsbE5ldHdvcmtzKCk7CisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmxvYWRDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICAgICAgICAgICAgICBtV3BzU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09ORklHVVJFX0lQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIlJlY29uZmlndXJpbmcgSVAgb24gY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBjb25uZWN0aW9uIHRvIHNhbWUgbmV0d29yayAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NPTk5FQ1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ldElkID0gbWVzc2FnZS5hcmcxOworICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldE5ldHdvcmtJZCgpID09IG5ldElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRGlzY29ubmVjdGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6IC8qIFN0b3AgZHJpdmVyIG9ubHkgYWZ0ZXIgZGlzY29ubmVjdCBoYW5kbGVkICovCisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICBpZiAobUVuYWJsZUFsbE5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgbUVuYWJsZUFsbE5ldHdvcmtzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmVuYWJsZUFsbE5ldHdvcmtzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEaXNjb25uZWN0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9TdXBwbGljYW50IGRpc2Nvbm5lY3QgdG8gcHJldmVudCBmdXJ0aGVyIGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNTY2FuTW9kZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNjYW5Nb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgbmV0d29yayBkaXNjb25uZWN0ICovCisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTb2Z0QXBTdGFydGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiU3RvcHBpbmcgU29mdCBBUCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0RJU0FCTElORyk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBzdG9wQWNjZXNzUG9pbnQoKSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJTb2Z0QVAgc2V0IG9uIGEgcnVubmluZyBhY2Nlc3MgcG9pbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zZXRBY2Nlc3NQb2ludCgoV2lmaUNvbmZpZ3VyYXRpb24pIG1lc3NhZ2Uub2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gbndTZXJ2aWNlIGR1cmluZyBzb2Z0IEFQIHNldCIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ291bGQgbm90IHN0b3AgQVAsIDoiICsgZWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9GQUlMRUQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBGYWlsIGNsaWVudCBtb2RlIG9wZXJhdGlvbiB3aGVuIHNvZnQgQVAgaXMgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywiQ2Fubm90IHN0YXJ0IHN1cHBsaWNhbnQgd2l0aCBhIHJ1bm5pbmcgc29mdCBBUCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgY2xhc3MgU3VwcGxpY2FudFN0YXRlVHJhY2tlciBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVJzc2lQb2xsVG9rZW4gPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF4IG51bWJlciBvZiB0aGUgV1BBIHN1cHBsaWNhbnQgbG9vcCBpdGVyYXRpb25zIGJlZm9yZSB3ZQorICAgICAgICAgKiBkZWNpZGUgdGhhdCB0aGUgbG9vcCBzaG91bGQgYmUgdGVybWluYXRlZDoKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU1VQUExJQ0FOVF9MT09QX0lURVJBVElPTlMgPSA0OworICAgICAgICBwcml2YXRlIGludCBtTG9vcERldGVjdEluZGV4ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUxvb3BEZXRlY3RDb3VudCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBTdXBwbGljYW50IHN0YXRlIGNoYW5nZSBjb21tYW5kcyBmb2xsb3cKKyAgICAgICAgICogIHRoZSBvcmRpbmFsIHZhbHVlcyBkZWZpbmVkIGluIFN1cHBsaWNhbnRTdGF0ZS5qYXZhCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVEVEICAgICAgICAgICA9IDA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkFDVElWRSAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5OSU5HICAgICAgICAgICAgICAgPSAyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRJTkcgICAgICAgICAgICA9IDM7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU1NPQ0lBVEVEICAgICAgICAgICAgID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPVVJfV0FZX0hBTkRTSEFLRSAgICAgPSA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JPVVBfSEFORFNIQUtFICAgICAgICA9IDY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT01QTEVURUQgICAgICAgICAgICAgID0gNzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPUk1BTlQgICAgICAgICAgICAgICAgPSA4OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5JTklUSUFMSVpFRCAgICAgICAgICA9IDk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEICAgICAgICAgICAgICAgID0gMTA7CisKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtVW5pbml0aWFsaXplZFN0YXRlID0gbmV3IFVuaW5pdGlhbGl6ZWRTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Jbml0aWFsaXplZFN0YXRlID0gbmV3IEluaXRpYWxpemVkU3RhdGUoKTs7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUluYWN0aXZlU3RhdGUgPSBuZXcgSW5hY3RpdmVTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1EaXNjb25uZWN0U3RhdGUgPSBuZXcgRGlzY29ubmVjdGVkU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtU2NhblN0YXRlID0gbmV3IFNjYW5TdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0U3RhdGUgPSBuZXcgQ29ubmVjdFN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUhhbmRzaGFrZVN0YXRlID0gbmV3IEhhbmRzaGFrZVN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbXBsZXRlZFN0YXRlID0gbmV3IENvbXBsZXRlZFN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURvcm1hbnRTdGF0ZSA9IG5ldyBEb3JtYW50U3RhdGUoKTsKKworICAgICAgICBwdWJsaWMgU3VwcGxpY2FudFN0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7CisgICAgICAgICAgICBzdXBlcihUQUcsIHRhcmdldC5nZXRMb29wZXIoKSk7CisKKyAgICAgICAgICAgIGFkZFN0YXRlKG1VbmluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1JbmFjdGl2ZVN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURpc2Nvbm5lY3RTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1TY2FuU3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtQ29ubmVjdFN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1IYW5kc2hha2VTdGF0ZSwgbUNvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db21wbGV0ZWRTdGF0ZSwgbUNvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURvcm1hbnRTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworCisgICAgICAgICAgICBzZXRJbml0aWFsU3RhdGUobVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vc3RhcnQgdGhlIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgIHN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCkgeworICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIG5ld1N0YXRlID0gKFN1cHBsaWNhbnRTdGF0ZSkgc3RhdGVDaGFuZ2VSZXN1bHQuc3RhdGU7CisKKyAgICAgICAgICAgIC8vIFN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlCisgICAgICAgICAgICAvLyBbMzEtMTNdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgICAgICAgICAgICAvLyBbOCAtIDBdIFN1cHBsaWNhbnQgc3RhdGUgKGFzIGRlZmluZWQgaW4gU3VwcGxpY2FudFN0YXRlLmphdmEpCisgICAgICAgICAgICAvLyA1MDAyMyBzdXBwbGljYW50X3N0YXRlX2NoYW5nZWQgKGN1c3RvbXwxfDUpCisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCwgbmV3U3RhdGUub3JkaW5hbCgpKTsKKworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShuZXdTdGF0ZS5vcmRpbmFsKCksIHN0YXRlQ2hhbmdlUmVzdWx0KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldFN1cHBsaWNhbnRTdGF0ZSgpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVW5pbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZXNldExvb3BEZXRlY3Rpb24oKSB7CisgICAgICAgICAgICBtTG9vcERldGVjdENvdW50ID0gMDsKKyAgICAgICAgICAgIG1Mb29wRGV0ZWN0SW5kZXggPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVRyYW5zaXRpb24oTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbXNnLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNjYW5TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRJTkc6CisgICAgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAvKiBCU1NJRCBpcyB2YWxpZCBvbmx5IGluIEFTU09DSUFUSU5HIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRCU1NJRChzdGF0ZUNoYW5nZVJlc3VsdC5CU1NJRCk7CisgICAgICAgICAgICAgICAgICAgIC8vJEZBTEwtVEhST1VHSCQKKyAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFURUQ6CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSX1dBWV9IQU5EU0hBS0U6CisgICAgICAgICAgICAgICAgY2FzZSBHUk9VUF9IQU5EU0hBS0U6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSGFuZHNoYWtlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db21wbGV0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRE9STUFOVDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Eb3JtYW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluYWN0aXZlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVOSU5JVElBTElaRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBJTlZBTElEOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtc2cub2JqOworICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN1cFN0YXRlID0gKFN1cHBsaWNhbnRTdGF0ZSkgc3RhdGVDaGFuZ2VSZXN1bHQuc3RhdGU7CisgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKFdpZmlJbmZvLmdldERldGFpbGVkU3RhdGVPZihzdXBTdGF0ZSkpOworICAgICAgICAgICAgbVdpZmlJbmZvLnNldFN1cHBsaWNhbnRTdGF0ZShzdXBTdGF0ZSk7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0TmV0d29ya0lkKHN0YXRlQ2hhbmdlUmVzdWx0Lm5ldHdvcmtJZCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgKiBIU00gc3RhdGVzCisgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIGNsYXNzIEluaXRpYWxpemVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLncoVEFHLCAiSWdub3JpbmcgIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgVW5pbml0aWFsaXplZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLncoVEFHLCAiSWdub3JpbmcgIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEluYWN0aXZlU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKworICAgICAgICAgICAgICAgICAvKiBBIGZhaWxlZCBXUFMgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICBpZiAobVdwc1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIldQUyBzZXQgdXAgZmFpbGVkLCBlbmFibGluZyBvdGhlciBuZXR3b3JrcyIpOworICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmVuYWJsZUFsbE5ldHdvcmtzKCk7CisgICAgICAgICAgICAgICAgICAgICBtV3BzU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGNsYXNzIERpc2Nvbm5lY3RlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICAvKiBJZiBhIGRpc2Nvbm5lY3QgZXZlbnQgaGFwcGVucyBhZnRlciBhIHBhc3N3b3JkIGtleSBmYWlsdXJlCisgICAgICAgICAgICAgICAgICAqIGV2ZW50LCBkaXNhYmxlIHRoZSBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBpZiAobVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBhdXRoZW50aWNhdGUsIGRpc2FibGluZyBuZXR3b3JrICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uZ2V0TmV0d29ya0lkKCkpOworICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmRpc2FibGVOZXR3b3JrKG1XaWZpSW5mby5nZXROZXR3b3JrSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIHRydWUpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBTY2FuU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBDb25uZWN0U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQoU0NBTl9PTkxZX01PREUpOworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zY2FuQ29tbWFuZChtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgSGFuZHNoYWtlU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIGlmIChtTG9vcERldGVjdEluZGV4ID4gbWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgICBtTG9vcERldGVjdENvdW50Kys7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgaWYgKG1Mb29wRGV0ZWN0Q291bnQgPiBNQVhfU1VQUExJQ0FOVF9MT09QX0lURVJBVElPTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5kaXNhYmxlTmV0d29yayhzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBtTG9vcERldGVjdEluZGV4ID0gbWVzc2FnZS53aGF0OworCisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIENvbXBsZXRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtUnNzaVBvbGxUb2tlbisrOworICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPTExfUlNTSV9JTlRFUlZBTF9NU0VDUyk7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEdST1VQX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfUlNTSV9QT0xMOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBtUnNzaVBvbGxUb2tlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBJbmZvIGFuZCBjb250aW51ZSBwb2xsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb2xsaW5nIGhhcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9FTkFCTEVfUlNTSV9QT0xMOgorICAgICAgICAgICAgICAgICAgICAgICAgbVJzc2lQb2xsVG9rZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBwb2xsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBEb3JtYW50U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgIC8qIFRPRE86IHJlY29ubmVjdCBpcyBub3cgYmVpbmcgaGFuZGxlZCBhdCBESENQIGZhaWx1cmUgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBydW4gaW50byBpc3N1ZXMgd2l0aCBzdGF5aW5nIGluIERvcm1hbnQgc3RhdGUsIG1pZ2h0CisgICAgICAgICAgICAgICAgICogbmVlZCBhIHJlY29ubmVjdCBoZXJlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDUyMjA3MTMuLmY4YzliZDYgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiw0NjYgKzE2LDExMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTjsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuV29ya1NvdXJjZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIAotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogLyoqCi0gKiBUcmFjayB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkuIEFsbCBldmVudCBoYW5kbGluZyBpcyBkb25lIGhlcmUsCi0gKiBhbmQgYWxsIGNoYW5nZXMgaW4gY29ubmVjdGl2aXR5IHN0YXRlIGFyZSBpbml0aWF0ZWQgaGVyZS4KKyAqIFRyYWNrIHRoZSBzdGF0ZSBvZiB3aWZpIGZvciBjb25uZWN0aXZpdHkgc2VydmljZS4KICAqCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgV2lmaVN0YXRlVHJhY2tlciBleHRlbmRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgeworcHVibGljIGNsYXNzIFdpZmlTdGF0ZVRyYWNrZXIgaW1wbGVtZW50cyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HRCA9IENvbmZpZy5MT0dEIHx8IGZhbHNlOwotICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLVFlQRSA9ICJXSUZJIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlTdGF0ZVRyYWNrZXIiOwogCi0gICAgLy8gRXZlbnQgbG9nIHRhZ3MgKG11c3QgYmUgaW4gc3luYyB3aXRoIGV2ZW50LWxvZy10YWdzKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19ORVRXT1JLX1NUQVRFX0NIQU5HRUQgPSA1MDAyMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEID0gNTAwMjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX0RSSVZFUl9TVEFURV9DSEFOR0VEID0gNTAwMjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NUQVRFX0NIQU5HRUQgPSA1MDAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPSA1MDAyNTsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtRGVmYXVsdEdhdGV3YXlBZGRyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1EZWZhdWx0Um91dGVTZXQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAKLSAgICAvLyBFdmVudCBjb2RlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX0NPTk5FQ1RJT04gICAgICAgICAgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX0RJU0NPTk5FQ1QgICAgICAgICAgICAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQgICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFICAgICAgICAgICAgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQgICAgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QT0xMX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgPSA4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ESENQX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUICAgICAgICAgICAgICAgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREVGRVJSRURfUkVDT05ORUNUICAgICAgICAgICAgICAgID0gMTE7Ci0gICAgLyoqCi0gICAgICogVGhlIGRyaXZlciBpcyBzdGFydGVkIG9yIHN0b3BwZWQuIFRoZSBvYmplY3Qgd2lsbCBiZSB0aGUgc3RhdGU6IHRydWUgZm9yCi0gICAgICogc3RhcnRlZCwgZmFsc2UgZm9yIHN0b3BwZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VEICAgICAgICAgICAgICA9IDEyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVCAgICAgPSAxMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUFZQkVfU1RBUlRfU0NBTl9QT1NUX0RJU0NPTk5FQ1QgID0gMTQ7CisgICAgcHJpdmF0ZSBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBMaW5rQ2FwYWJpbGl0aWVzIG1MaW5rQ2FwYWJpbGl0aWVzOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRyaXZlciBzdGF0ZSBpbmRpY2F0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RBUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfSFVORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOworICAgIC8qIEZvciBzZW5kaW5nIGV2ZW50cyB0byBjb25uZWN0aXZpdHkgc2VydmljZSBoYW5kbGVyICovCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1Dc0hhbmRsZXI7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVdpZmlTdGF0ZVJlY2VpdmVyOworICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdpZmlNYW5hZ2VyOwogCi0gICAgLyoqCi0gICAgICogSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcG9sbGluZyBmb3IgY29ubmVjdGlvbgotICAgICAqIHN0YXR1cyBpdGVtcyB0aGF0IGFyZSBub3Qgc2VudCB2aWEgYXN5bmNocm9ub3VzIGV2ZW50cy4KLSAgICAgKiBBbiBleGFtcGxlIGlzIFJTU0kgKHNpZ25hbCBzdHJlbmd0aCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPTExfU1RBVFVTX0lOVEVSVkFMX01TRUNTID0gMzAwMDsKKyAgICBwdWJsaWMgV2lmaVN0YXRlVHJhY2tlcigpIHsKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJLCAwLCBORVRXT1JLVFlQRSwgIiIpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgbUxpbmtDYXBhYmlsaXRpZXMgPSBuZXcgTGlua0NhcGFiaWxpdGllcygpOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1heCBudW1iZXIgb2YgdGhlIFdQQSBzdXBwbGljYW50IGxvb3AgaXRlcmF0aW9ucyBiZWZvcmUgd2UKLSAgICAgKiBkZWNpZGUgdGhhdCB0aGUgbG9vcCBzaG91bGQgYmUgdGVybWluYXRlZDoKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TID0gNDsKKyAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOworICAgIH0KIAotICAgIC8qKgotICAgICAqIFdoZW4gYSBESVNDT05ORUNUIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBkZWZlciBoYW5kbGluZyBpdCB0bwotICAgICAqIGFsbG93IGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgRElTQ09OTkVDVCBpcyBhYm91dCB0bwotICAgICAqIGJlIGZvbGxvd2VkIHNob3J0bHkgYnkgYSBDT05ORUNUIHRvIHRoZSBzYW1lIG5ldHdvcmsgd2Ugd2VyZQotICAgICAqIGp1c3QgY29ubmVjdGVkIHRvLiBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byByZXBvcnQKLSAgICAgKiB0aGUgbmV0d29yayBhcyBkb3duLCBub3IgZG8gd2Ugd2FudCB0byByZWNvbmZpZ3VyZSB0aGUgbmV0d29yawotICAgICAqIGludGVyZmFjZSwgZXRjLiBJZiB3ZSBnZXQgYSBDT05ORUNUIGV2ZW50IGZvciBhbm90aGVyIG5ldHdvcmsKLSAgICAgKiB3aXRoaW4gdGhlIGRlbGF5IHdpbmRvdywgd2UgaW1tZWRpYXRlbHkgaGFuZGxlIHRoZSBwZW5kaW5nCi0gICAgICogZGlzY29ubmVjdCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgQ09OTkVDVC48cC8+Ci0gICAgICogVGhlIGZpdmUgc2Vjb25kIGRlbGF5IGlzIGNob3NlbiBzb21ld2hhdCBhcmJpdHJhcmlseSwgYnV0IGlzCi0gICAgICogbWVhbnQgdG8gY292ZXIgbW9zdCBvZiB0aGUgY2FzZXMgd2hlcmUgYSBESVNDT05ORUNUL0NPTk5FQ1QKLSAgICAgKiBoYXBwZW5zIHRvIGEgbmV0d29yay4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9ERUxBWV9NU0VDUyA9IDUwMDA7Ci0gICAgLyoqCi0gICAgICogV2hlbiB0aGUgc3VwcGxpY2FudCBnb2VzIGlkbGUgYWZ0ZXIgd2UgZG8gYW4gZXhwbGljaXQgZGlzY29ubmVjdAotICAgICAqIGZvbGxvd2luZyBhIERIQ1AgZmFpbHVyZSwgd2UgbmVlZCB0byBraWNrIHRoZSBzdXBwbGljYW50IGludG8KLSAgICAgKiB0cnlpbmcgdG8gYXNzb2NpYXRlIHdpdGggYWNjZXNzIHBvaW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVDT05ORUNUX0RFTEFZX01TRUNTID0gMjAwMDsKIAotICAgIC8qKgotICAgICAqIFdoZW4gdGhlIHN1cHBsaWNhbnQgZGlzY29ubmVjdHMgZnJvbSBhbiBBUCBpdCBzb21ldGltZXMgZm9yZ2V0cwotICAgICAqIHRvIHJlc3RhcnQgc2Nhbm5pbmcuICBXYWl0IHRoaXMgZGVsYXkgYmVmb3JlIGFza2luZyBpdCB0byBzdGFydAotICAgICAqIHNjYW5uaW5nIChpbiBjYXNlIGl0IGZvcmdvdCkuICAxNSBzZWMgaXMgdGhlIHN0YW5kYXJkIGRlbGF5IGJldHdlZW4KLSAgICAgKiBzY2Fucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0lDS1NUQVJUX1NDQU5OSU5HX0RFTEFZX01TRUNTID0gMTUwMDA7CisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQuc2V0KGlzUmVxdWVzdGVkKTsKKyAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2Ugd2lsbCByZXRyeSBhIGNvbm5lY3Rpb24gdG8gYW4gYWNjZXNzIHBvaW50Ci0gICAgICogZm9yIHdoaWNoIHdlIGhhdmUgZmFpbGVkIGluIGFjcXVpcmluZyBhbiBJUCBhZGRyZXNzIGZyb20gREhDUC4gQSB2YWx1ZSBvZgotICAgICAqIE4gbWVhbnMgdGhhdCB3ZSB3aWxsIG1ha2UgTisxIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaW4gYWxsLgotICAgICAqIDxwPgotICAgICAqIFNlZSB7QGxpbmsgU2V0dGluZ3MuU2VjdXJlI1dJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlR9LiBUaGlzIGlzIHRoZSBkZWZhdWx0Ci0gICAgICogdmFsdWUgaWYgYSBTZXR0aW5ncyB2YWx1ZSBpcyBub3QgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTID0gOTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BVVRPID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IFdQQSBzdXBwbGljYW50IGxvb3Agc3RhdGUgKHVzZWQgdG8gZGV0ZWN0IGxvb3BpbmcgYmVoYXZpb3IpOgotICAgICAqLwotICAgIHByaXZhdGUgU3VwcGxpY2FudFN0YXRlIG1TdXBwbGljYW50TG9vcFN0YXRlID0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IG51bWJlciBvZiBXUEEgc3VwcGxpY2FudCBsb29wIGl0ZXJhdGlvbnM6Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBudW1iZXIgb2Ygc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2VzLiAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZQotICAgICAqIGlmIHdlJ3ZlIHJlY2VpdmVkIGFueSBuZXcgaW5mbyBzaW5jZSB3ZSBmb3VuZCBvdXQgaXQgd2FzIERJU0NPTk5FQ1RFRCBvcgotICAgICAqIElOQUNUSVZFLiAgSWYgd2UgaGF2ZW4ndCBmb3IgWCBtcywgd2UgdGhlbiByZXF1ZXN0IGEgc2NhbiAtIGl0IHNob3VsZCBoYXZlCi0gICAgICogZG9uZSB0aGF0IGF1dG9tYXRpY2FsbHksIGJ1dCBzb21ldGltZXMgc29tZSBmaXJtd2FyZSBkb2VzIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHdlIHJlY2VpdmVkIGFuIGV2ZW50IHRoYXQgdGhhdCBhIHBhc3N3b3JkLWtleSBtYXkgYmUgaW5jb3JyZWN0LgotICAgICAqIElmIHRoZSBuZXh0IGluY29taW5nIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGV2ZW50IGlzIERJU0NPTk5FQ1QsCi0gICAgICogYnJvYWRjYXN0IGEgbWVzc2FnZSB0aGF0IHdlIGhhdmUgYSBwb3NzaWJsZSBwYXNzd29yZCBlcnJvciBhbmQgZGlzYWJsZQotICAgICAqIHRoZSBuZXR3b3JrLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUFBMX1NDQU5fSEFORExJTkdfTElTVF9PTkxZID0gMjsKLQotICAgIHByaXZhdGUgV2lmaU1vbml0b3IgbVdpZmlNb25pdG9yOwotICAgIHByaXZhdGUgV2lmaUluZm8gbVdpZmlJbmZvOwotICAgIHByaXZhdGUgTGlzdDxTY2FuUmVzdWx0PiBtU2NhblJlc3VsdHM7Ci0gICAgcHJpdmF0ZSBXaWZpTWFuYWdlciBtV007Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1IYXZlSXBBZGRyZXNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT2J0YWluaW5nSXBBZGRyZXNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVG9ybkRvd25CeUNvbm5NZ3I7Ci0gICAgLyoqCi0gICAgICogQSBESVNDT05ORUNUIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkLCBidXQgcHJvY2Vzc2luZyBpdAotICAgICAqIGlzIGJlaW5nIGRlZmVycmVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY29ubmVjdFBlbmRpbmc7Ci0gICAgLyoqCi0gICAgICogQW4gb3BlcmF0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZCBhcyBhIHJlc3VsdCBvZiB3aGljaCB3ZSBleHBlY3QgdGhlIG5leHQgZXZlbnQKLSAgICAgKiB3aWxsIGJlIGEgRElTQ09OTkVDVC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc2Nvbm5lY3RFeHBlY3RlZDsKLSAgICBwcml2YXRlIERoY3BIYW5kbGVyIG1EaGNwVGFyZ2V0OwotICAgIHByaXZhdGUgRGhjcEluZm8gbURoY3BJbmZvOwotICAgIHByaXZhdGUgaW50IG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBtTGFzdEJzc2lkOwotICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0U3NpZDsKLSAgICBwcml2YXRlIGludCBtTGFzdE5ldHdvcmtJZCA9IC0xOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlU3RhdGljSXAgPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtUmVjb25uZWN0Q291bnQ7Ci0KLSAgICAvKiBUcmFja3MgaWYgYW55IG5ldHdvcmsgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgZGlzYWJsZWQgKi8KLSAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbUlzQW55TmV0d29ya0Rpc2FibGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotCi0gICAgLy8gdXNlZCB0byBzdG9yZSB0aGUgKG5vbi1wZXJzaXN0ZWQpIG51bSBkZXRlcm1pbmVkIGR1cmluZyBkZXZpY2UgYm9vdCAKLSAgICAvLyAoZnJvbSBtY2Mgb3Igb3RoZXIgcGhvbmUgaW5mbykgYmVmb3JlIHRoZSBkcml2ZXIgaXMgc3RhcnRlZC4KLSAgICBwcml2YXRlIGludCBtTnVtQWxsb3dlZENoYW5uZWxzID0gMDsKLQotICAgIC8vIFZhcmlhYmxlcyByZWxhdGluZyB0byB0aGUgJ2F2YWlsYWJsZSBuZXR3b3Jrcycgbm90aWZpY2F0aW9uCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGljb24gdG8gc2hvdyBpbiB0aGUgJ2F2YWlsYWJsZSBuZXR3b3Jrcycgbm90aWZpY2F0aW9uLiBUaGlzIHdpbGwgYWxzbwotICAgICAqIGJlIHRoZSBJRCBvZiB0aGUgTm90aWZpY2F0aW9uIGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSA9Ci0gICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfbm90aWZ5X3dpZmlfaW5fcmFuZ2U7Ci0gICAgLyoqCi0gICAgICogV2hlbiBhIG5vdGlmaWNhdGlvbiBpcyBzaG93biwgd2Ugd2FpdCB0aGlzIGFtb3VudCBiZWZvcmUgcG9zc2libHkgc2hvd2luZyBpdCBhZ2Fpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUzsKLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSB1c2VyIGhhcyBzZXQgdGhlIHNldHRpbmcgdG8gc2hvdyB0aGUgJ2F2YWlsYWJsZSBuZXR3b3Jrcycgbm90aWZpY2F0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtTm90aWZpY2F0aW9uRW5hYmxlZDsKLSAgICAvKioKLSAgICAgKiBPYnNlcnZlcyB0aGUgdXNlciBzZXR0aW5nIHRvIGtlZXAge0BsaW5rICNtTm90aWZpY2F0aW9uRW5hYmxlZH0gaW4gc3luYy4KLSAgICAgKi8KLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgbU5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXI7Ci0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBTeXN0ZW0jY3VycmVudFRpbWVNaWxsaXMoKX0gbXVzdCBiZSBhdCBsZWFzdCB0aGlzIHZhbHVlIGZvciB1cwotICAgICAqIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2Fpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWU7Ci0gICAgLyoqCi0gICAgICogVGhlIE5vdGlmaWNhdGlvbiBvYmplY3QgZ2l2ZW4gdG8gdGhlIE5vdGlmaWNhdGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb24gbU5vdGlmaWNhdGlvbjsKLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBub3RpZmljYXRpb24gaXMgYmVpbmcgc2hvd24sIGFzIHNldCBieSB1cy4gVGhhdCBpcywgaWYgdGhlCi0gICAgICogdXNlciBjYW5jZWxzIHRoZSBub3RpZmljYXRpb24sIHdlIHdpbGwgbm90IHJlY2VpdmUgdGhlIGNhbGxiYWNrIHNvIHRoaXMKLSAgICAgKiB3aWxsIHN0aWxsIGJlIHRydWUuIFdlIG9ubHkgZ3VhcmFudGVlIGlmIHRoaXMgaXMgZmFsc2UsIHRoZW4gdGhlCi0gICAgICogbm90aWZpY2F0aW9uIGlzIG5vdCBzaG93aW5nLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtTm90aWZpY2F0aW9uU2hvd247Ci0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBjb250aW51b3VzIHNjYW5zIHRoYXQgbXVzdCBvY2N1ciBiZWZvcmUgY29uc2lkZXIgdGhlCi0gICAgICogc3VwcGxpY2FudCBpbiBhIHNjYW5uaW5nIHN0YXRlLiBUaGlzIGFsbG93cyBzdXBwbGljYW50IHRvIGFzc29jaWF0ZSB3aXRoCi0gICAgICogcmVtZW1iZXJlZCBuZXR3b3JrcyB0aGF0IGFyZSBpbiB0aGUgc2NhbiByZXN1bHRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fU0NBTlNfQkVGT1JFX0FDVFVBTExZX1NDQU5OSU5HID0gMzsKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHNjYW5zIHNpbmNlIHRoZSBsYXN0IG5ldHdvcmsgc3RhdGUgY2hhbmdlLiBXaGVuIHRoaXMKLSAgICAgKiBleGNlZWRzIHtAbGluayAjTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklOR30sIHdlIGNvbnNpZGVyIHRoZQotICAgICAqIHN1cHBsaWNhbnQgdG8gYWN0dWFsbHkgYmUgc2Nhbm5pbmcuIFdoZW4gdGhlIG5ldHdvcmsgc3RhdGUgY2hhbmdlcyB0bwotICAgICAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHNjYW5uaW5nLCB3ZSByZXNldCB0aGlzIHRvIDAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2U7Ci0gICAgLyoqCi0gICAgICogT2JzZXJ2ZXMgdGhlIHN0YXRpYyBJUCBhZGRyZXNzIHNldHRpbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzU2Nhbk1vZGVBY3RpdmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVSc3NpUG9sbGluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzSGlnaFBlcmZFbmFibGVkOwotICAgIHByaXZhdGUgaW50IG1Qb3dlck1vZGVSZWZDb3VudCA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50ID0gMDsKLQotICAgIC8qKgotICAgICAqIE9uZSBvZiAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0VOQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxJTkd9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfVU5LTk9XTn0KLSAgICAgKgotICAgICAqIGdldFdpZmlTdGF0ZSgpIGlzIG5vdCBzeW5jaHJvbml6ZWQgdG8gbWFrZSBzdXJlIGl0J3MgYWx3YXlzIGZhc3QsCi0gICAgICogZXZlbiB3aGVuIHRoZSBpbnN0YW5jZSBsb2NrIGlzIGhlbGQgb24gb3RoZXIgc2xvdyBvcGVyYXRpb25zLgotICAgICAqIFVzZSBhIGF0b21pYyB2YXJpYWJsZSBmb3Igc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpU3RhdGUgPSBuZXcgQXRvbWljSW50ZWdlcihXSUZJX1NUQVRFX1VOS05PV04pOwotCi0gICAgLy8gV2ktRmkgcnVuIHN0YXRlczoKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1NUQVRFX1NUQVJUSU5HID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1NUQVRFX1JVTk5JTkcgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1NUQVRFX1NUT1BQSU5HID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1NUQVRFX1NUT1BQRUQgID0gNDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtUnVuU3RhdGVOYW1lc1tdID0gewotICAgICAgICAgICAgIlN0YXJ0aW5nIiwKLSAgICAgICAgICAgICJSdW5uaW5nIiwKLSAgICAgICAgICAgICJTdG9wcGluZyIsCi0gICAgICAgICAgICAiU3RvcHBlZCIKLSAgICB9OwotICAgIHByaXZhdGUgaW50IG1SdW5TdGF0ZTsKLQotICAgIHByaXZhdGUgZmluYWwgSUJhdHRlcnlTdGF0cyBtQmF0dGVyeVN0YXRzOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1NjYW5Pbmx5OwotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1CbHVldG9vdGhBMmRwOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUludGVyZmFjZU5hbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc0Ruc1Byb3BOYW1lczsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SZWxlYXNlV2FrZUxvY2tDYWxsYmFjazsKLQotICAgIC8qKgotICAgICAqIEtlZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSBsYXN0IHRvbGQgdGhlIGJhdHRlcnkgc3RhdHMgd2UgaGFkIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1SZXBvcnRlZFJ1bm5pbmcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIE1vc3QgcmVjZW50bHkgc2V0IHNvdXJjZSBvZiBzdGFydGluZyBXSUZJLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgV29ya1NvdXJjZSBtUnVubmluZ1dpZmlVaWRzID0gbmV3IFdvcmtTb3VyY2UoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBsYXN0IHJlcG9ydGVkIFVJRHMgdGhhdCB3ZXJlIHJlc3BvbnNpYmxlIGZvciBzdGFydGluZyBXSUZJLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgV29ya1NvdXJjZSBtTGFzdFJ1bm5pbmdXaWZpVWlkcyA9IG5ldyBXb3JrU291cmNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3VwcGxpY2FudCBzdGF0ZQotICAgICAqIGNoYW5nZSBpbiB0aGUgU1RBVEVfQ0hBTkdFIGV2ZW50IG1lc3NhZ2UgdGhhdCBjb21lcyBmcm9tIHRoZQotICAgICAqIFdpZmlNb25pdG9yCi0gICAgICogdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdCB7Ci0gICAgICAgIFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdChpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgdGhpcy5CU1NJRCA9IEJTU0lEOwotICAgICAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5ldHdvcmtJZDsKLSAgICAgICAgU3RyaW5nIEJTU0lEOwotICAgICAgICBTdXBwbGljYW50U3RhdGUgc3RhdGU7CisgICAgcHVibGljIGJvb2xlYW4gaXNUZWFyZG93blJlcXVlc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZWFyZG93blJlcXVlc3RlZC5nZXQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgY29ubmVjdGlvbiBpbgotICAgICAqIHRoZSBDT05ORUNURUQgZXZlbnQgbWVzc2FnZSB0aGF0IGNvbWVzIGZyb20gdGhlIFdpZmlNb25pdG9yCi0gICAgICogdGhyZWFkLgorICAgICAqIEJlZ2luIG1vbml0b3Jpbmcgd2lmaSBjb25uZWN0aXZpdHkKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQgewotICAgICAgICBOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQoRGV0YWlsZWRTdGF0ZSBzdGF0ZSwgU3RyaW5nIEJTU0lELCBpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICB0aGlzLkJTU0lEID0gQlNTSUQ7Ci0gICAgICAgICAgICB0aGlzLm5ldHdvcmtJZCA9IG5ldHdvcmtJZDsKLSAgICAgICAgfQotICAgICAgICBEZXRhaWxlZFN0YXRlIHN0YXRlOwotICAgICAgICBTdHJpbmcgQlNTSUQ7Ci0gICAgICAgIGludCBuZXR3b3JrSWQ7Ci0gICAgfQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZyhDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7CisgICAgICAgIG1Dc0hhbmRsZXIgPSB0YXJnZXQ7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKIAotICAgIHB1YmxpYyBXaWZpU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgdGFyZ2V0LCBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7Ci0gICAgICAgIAotICAgICAgICBtV2lmaUluZm8gPSBuZXcgV2lmaUluZm8oKTsKLSAgICAgICAgbVdpZmlNb25pdG9yID0gbmV3IFdpZmlNb25pdG9yKHRoaXMpOwotICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgIHNldFRvcm5Eb3duQnlDb25uTWdyKGZhbHNlKTsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIG1TY2FuUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U2NhblJlc3VsdD4oKTsKLSAgICAgICAgLy8gQWxsb2NhdGUgREhDUCBpbmZvIG9iamVjdCBvbmNlLCBhbmQgZmlsbCBpdCBpbiBvbiBlYWNoIHJlcXVlc3QKLSAgICAgICAgbURoY3BJbmZvID0gbmV3IERoY3BJbmZvKCk7Ci0gICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVEFSVElORzsKKyAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5DT05GSUdfQ0hBTkdFRF9BQ1RJT04pOwogCi0gICAgICAgIC8vIFNldHRpbmcgaXMgaW4gc2Vjb25kcwotICAgICAgICBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCAKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfUkVQRUFUX0RFTEFZLCA5MDApICogMTAwMGw7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyID0gbmV3IE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyLnJlZ2lzdGVyKCk7Ci0KLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihuZXcgSGFuZGxlcigpKTsKLQotICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJ3aWZpLmludGVyZmFjZSIsICJ0aXdsYW4wIik7Ci0gICAgICAgIHNEbnNQcm9wTmFtZXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgImRoY3AuIiArIG1JbnRlcmZhY2VOYW1lICsgIi5kbnMxIiwKLSAgICAgICAgICAgICJkaGNwLiIgKyBtSW50ZXJmYWNlTmFtZSArICIuZG5zMiIKLSAgICAgICAgfTsKLSAgICAgICAgbUJhdHRlcnlTdGF0cyA9IElCYXR0ZXJ5U3RhdHMuU3R1Yi5hc0ludGVyZmFjZShTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJiYXR0ZXJ5aW5mbyIpKTsKLQorICAgICAgICBtV2lmaVN0YXRlUmVjZWl2ZXIgPSBuZXcgV2lmaVN0YXRlUmVjZWl2ZXIoKTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtV2lmaVN0YXRlUmVjZWl2ZXIsIGZpbHRlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgc3VwcGxpY2FudCBzdGF0ZSBhbmQga2VlcHMgdGhlIG5ldHdvcmsKLSAgICAgKiBpbmZvIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgc3RhdGUKKyAgICAgKiBEaXNhYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsKKyAgICAgKiBUT0RPOiBkbyBhd2F5IHdpdGggcmV0dXJuIHZhbHVlIGFmdGVyIG1ha2luZyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGFzeW5jCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFN1cHBsaWNhbnRTdGF0ZShTdXBwbGljYW50U3RhdGUgc3RhdGUpIHsKLSAgICAgICAgbVdpZmlJbmZvLnNldFN1cHBsaWNhbnRTdGF0ZShzdGF0ZSk7Ci0gICAgICAgIHVwZGF0ZU5ldHdvcmtJbmZvKCk7Ci0gICAgICAgIGNoZWNrUG9sbFRpbWVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN1cHBsaWNhbnRTdGF0ZSBnZXRTdXBwbGljYW50U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCk7CisgICAgcHVibGljIGJvb2xlYW4gdGVhcmRvd24oKSB7CisgICAgICAgIG1UZWFyZG93blJlcXVlc3RlZC5zZXQodHJ1ZSk7CisgICAgICAgIG1XaWZpTWFuYWdlci5zdG9wV2lmaSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kOiBzZXRzIHRoZSBzdXBwbGljYW50IHN0YXRlIGFuZCBrZWVwcyB0aGUgbmV0d29yawotICAgICAqIGluZm8gdXBkYXRlZCAoc3RyaW5nIHZlcnNpb24pLgotICAgICAqIEBwYXJhbSBzdGF0ZU5hbWUgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBuZXcgc3RhdGUKKyAgICAgKiBSZS1lbmFibGUgY29ubmVjdGl2aXR5IHRvIGEgbmV0d29yayBhZnRlciBhIHtAbGluayAjdGVhcmRvd24oKX0uCisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTdXBwbGljYW50U3RhdGUoU3RyaW5nIHN0YXRlTmFtZSkgewotICAgICAgICBtV2lmaUluZm8uc2V0U3VwcGxpY2FudFN0YXRlKHN0YXRlTmFtZSk7Ci0gICAgICAgIHVwZGF0ZU5ldHdvcmtJbmZvKCk7Ci0gICAgICAgIGNoZWNrUG9sbFRpbWVyKCk7CisgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQuc2V0KGZhbHNlKTsKKyAgICAgICAgbVdpZmlNYW5hZ2VyLnN0YXJ0V2lmaSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kOiBzZXRzIHRoZSBib29sZWFuIGluZGljYXRpbmcgdGhhdCB0aGUgY29ubmVjdGlvbgotICAgICAqIG1hbmFnZXIgYXNrZWQgdGhlIG5ldHdvcmsgdG8gYmUgdG9ybiBkb3duIChhbmQgc28gb25seSB0aGUgY29ubmVjdGlvbgotICAgICAqIG1hbmFnZXIgY2FuIHNldCBpdCB1cCBhZ2FpbikuCi0gICAgICogbmV0d29yayBpbmZvIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIGZsYWcge0Bjb2RlIHRydWV9IGlmIGV4cGxpY2l0bHkgZGlzYWJsZWQuCisgICAgICogVHVybiB0aGUgd2lyZWxlc3MgcmFkaW8gb2ZmIGZvciBhIG5ldHdvcmsuCisgICAgICogQHBhcmFtIHR1cm5PbiB7QGNvZGUgdHJ1ZX0gdG8gdHVybiB0aGUgcmFkaW8gb24sIHtAY29kZSBmYWxzZX0KKyAgICAgKiBUT0RPOiBkbyBhd2F5IHdpdGggcmV0dXJuIHZhbHVlIGFmdGVyIG1ha2luZyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGFzeW5jCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFRvcm5Eb3duQnlDb25uTWdyKGJvb2xlYW4gZmxhZykgewotICAgICAgICBtVG9ybkRvd25CeUNvbm5NZ3IgPSBmbGFnOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoZSBXTEFOCi0gICAgICogbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgRE5TIGFkZHJlc3Nlcywgd2l0aCBubyBob2xlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZVNlcnZlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lU2VydmVyTGlzdChzRG5zUHJvcE5hbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIFdMQU4gbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiBvdXIgaW50ZXJmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnRlcmZhY2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRjcCBidWZmZXIgc2l6ZXMKLSAgICAgKiBmb3IgdGhpcyBuZXR3b3JrLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJuZXQudGNwLmJ1ZmZlcnNpemUud2lmaSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRNb25pdG9yaW5nKCkgewotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgYSBoYW5kbGUgb24gdGhlIFdpZmlNYW5hZ2VyLiBUaGlzIGNhbm5vdCBiZSBkb25lIGluIG91cgotICAgICAgICAgKiBjb25zdHJ1Y3RvciwgYmVjYXVzZSB0aGUgV2lmaSBzZXJ2aWNlIGlzIG5vdCB5ZXQgcmVnaXN0ZXJlZC4KLSAgICAgICAgICovCi0gICAgICAgIG1XTSA9IChXaWZpTWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEV2ZW50TG9vcCgpIHsKLSAgICAgICAgbVdpZmlNb25pdG9yLnN0YXJ0TW9uaXRvcmluZygpOworICAgIHB1YmxpYyBib29sZWFuIHNldFJhZGlvKGJvb2xlYW4gdHVybk9uKSB7CisgICAgICAgIG1XaWZpTWFuYWdlci5zZXRXaWZpRW5hYmxlZCh0dXJuT24pOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ4NywyMjAxICsxMzEsMTM2IEBACiAgICAgICogdW5hdmFpbGFibGUuCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgV2ktRmkgY29ubmVjdGlvbnMgYXJlIHBvc3NpYmxlCiAgICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQXZhaWxhYmxlKCkgewotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPOiBOZWVkIHRvIGFsc28gbG9vayBhdCBzY2FuIHJlc3VsdHMgdG8gc2VlIHdoZXRoZXIgd2UncmUKLSAgICAgICAgICogaW4gcmFuZ2Ugb2YgYW55IGFjY2VzcyBwb2ludHMuIElmIHdlIGhhdmUgc2NhbiByZXN1bHRzIHRoYXQKLSAgICAgICAgICogYXJlIG5vIG1vcmUgdGhhbiBOIHNlY29uZHMgb2xkLCB1c2UgdGhvc2UsIG90aGVyd2lzZSwgaW5pdGlhdGUKLSAgICAgICAgICogYSBzY2FuIGFuZCB3YWl0IGZvciB0aGUgcmVzdWx0cy4gVGhpcyBvbmx5IG1hdHRlcnMgaWYgd2UKLSAgICAgICAgICogYWxsb3cgbW9iaWxlIHRvIGJlIHRoZSBwcmVmZXJyZWQgbmV0d29yay4KLSAgICAgICAgICovCi0gICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdXBwU3RhdGUgPSBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCk7Ci0gICAgICAgIHJldHVybiBzdXBwU3RhdGUgIT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQgJiYKLSAgICAgICAgICAgICAgICBzdXBwU3RhdGUgIT0gU3VwcGxpY2FudFN0YXRlLklOQUNUSVZFICYmCi0gICAgICAgICAgICAgICAgKG1Ub3JuRG93bkJ5Q29ubk1nciB8fCAhaXNEcml2ZXJTdG9wcGVkKCkpOworICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvLmlzQXZhaWxhYmxlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZGVmaW5lZCBXaS1GaSBzdWJ0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5ldHdvcmtTdWJ0eXBlKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kOiB1cGRhdGVzIHRoZSBuZXR3b3JrIGluZm8gb2JqZWN0IHRvIGtlZXAgaXQgaW4gc3luYyB3aXRoCi0gICAgICogdGhlIFdpLUZpIHN0YXRlIHRyYWNrZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5ldHdvcmtJbmZvKCkgewotICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoaXNBdmFpbGFibGUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IHdoZXRoZXIgdGhlIFdpLUZpIGNvbm5lY3Rpb24gaXMgZnVsbHkgY29uZmlndXJlZCBmb3IgZGF0YS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUge0BsaW5rIFN1cHBsaWNhbnRTdGF0ZX0gaXMKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUjQ09NUExFVEVEIENPTVBMRVRFRH0uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW9uQ29tcGxldGVkKCkgewotICAgICAgICByZXR1cm4gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IHdoZXRoZXIgdGhlIFdpLUZpIGNvbm5lY3Rpb24gaGFzIHN1Y2Nlc3NmdWxseSBhY3F1aXJlZCBhbiBJUCBhZGRyZXNzLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBXaS1GaSBjb25uZWN0aW9uIGhhcyBiZWVuIGFzc2lnbmVkIGFuIElQIGFkZHJlc3MuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzSXBBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gbUhhdmVJcEFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgdXNlci1lbnRlcmVkIHBhc3N3b3JkIGtleQotICAgICAqIG1heSBiZSBpbmNvcnJlY3QgKGkuZS4sIGNhdXNlZCBhdXRoZW50aWNhdGlvbiB0byBmYWlsKS4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QoKSB7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfUEFTU1dPUkRfS0VZX01BWV9CRV9JTkNPUlJFQ1QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQKLSAgICAgKiBkYWVtb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlTdXBwbGljYW50Q29ubmVjdGlvbigpIHsKLSAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShFVkVOVF9TVVBQTElDQU5UX0NPTk5FQ1RJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgdGhlIHN1cHBsaWNhbnQKLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAotICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IHtAY29kZSBTdXBwbGljYW50U3RhdGV9Ci0gICAgICovCi0gICAgdm9pZCBub3RpZnlTdGF0ZUNoYW5nZShpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIFN1cHBsaWNhbnRTdGF0ZSBuZXdTdGF0ZSkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKAotICAgICAgICAgICAgdGhpcywgRVZFTlRfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VELAotICAgICAgICAgICAgbmV3IFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdChuZXR3b3JrSWQsIEJTU0lELCBuZXdTdGF0ZSkpOwotICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdGF0ZSBvZiBXaWZpIGNvbm5lY3Rpdml0eQotICAgICAqIGhhcyBjaGFuZ2VkLgotICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIGNvbmZpZ3VyZWQgbmV0d29yayBvbiB3aGljaCB0aGUgc3RhdGUgY2hhbmdlIG9jY3VycmVkCi0gICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbmV0d29yayBzdGF0ZQotICAgICAqIEBwYXJhbSBCU1NJRCB3aGVuIHRoZSBuZXcgc3RhdGUgaXMge0BsaW5rIERldGFpbGVkU3RhdGUjQ09OTkVDVEVECi0gICAgICogTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUR9LAotICAgICAqIHRoaXMgaXMgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBhY2Nlc3MgcG9pbnQuIE90aGVyd2lzZSwgaXQKLSAgICAgKiBpcyB7QGNvZGUgbnVsbH0uCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlTdGF0ZUNoYW5nZShEZXRhaWxlZFN0YXRlIG5ld1N0YXRlLCBTdHJpbmcgQlNTSUQsIGludCBuZXR3b3JrSWQpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbigKLSAgICAgICAgICAgIHRoaXMsIEVWRU5UX05FVFdPUktfU1RBVEVfQ0hBTkdFRCwKLSAgICAgICAgICAgIG5ldyBOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQobmV3U3RhdGUsIEJTU0lELCBuZXR3b3JrSWQpKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIHNjYW4gaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMKLSAgICAgKiBhcmUgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0gICAgICAgIC8vIHJlc2V0IHRoZSBzdXBwbGljYW50J3MgaGFuZGxpbmcgb2Ygc2NhbiByZXN1bHRzIHRvICJub3JtYWwiIG1vZGUKLSAgICAgICAgc2V0U2NhblJlc3VsdEhhbmRsaW5nKFNVUFBMX1NDQU5fSEFORExJTkdfTk9STUFMKTsKLSAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgd2UgY2FuIG5vIGxvbmdlciBjb21tdW5pY2F0ZSB3aXRoCi0gICAgICogdGhlIHN1cHBsaWNhbnQgZGFlbW9uLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudExvc3QoKSB7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfU1VQUExJQ0FOVF9ESVNDT05ORUNUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIFdpLUZpIGRyaXZlciBoYXMgYmVlbiBzdG9wcGVkLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5RHJpdmVyU3RvcHBlZCgpIHsKLSAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUT1BQRUQ7Ci0KLSAgICAgICAgLy8gU2VuZCBhIGRyaXZlciBzdG9wcGVkIG1lc3NhZ2UgdG8gb3VyIGhhbmRsZXIKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4odGhpcywgRVZFTlRfRFJJVkVSX1NUQVRFX0NIQU5HRUQsIERSSVZFUl9TVE9QUEVELCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIFdpLUZpIGRyaXZlciBoYXMgYmVlbiByZXN0YXJ0ZWQgYWZ0ZXIKLSAgICAgKiBoYXZpbmcgYmVlbiBzdG9wcGVkLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5RHJpdmVyU3RhcnRlZCgpIHsKLSAgICAgICAgLy8gU2VuZCBhIGRyaXZlciBzdGFydGVkIG1lc3NhZ2UgdG8gb3VyIGhhbmRsZXIKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4odGhpcywgRVZFTlRfRFJJVkVSX1NUQVRFX0NIQU5HRUQsIERSSVZFUl9TVEFSVEVELCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIFdpLUZpIGRyaXZlciBoYXMgaHVuZyBhbmQgbmVlZHMgcmVzdGFydGluZy4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeURyaXZlckh1bmcoKSB7Ci0gICAgICAgIC8vIFNlbmQgYSBkcml2ZXIgaGFuZ2VkIG1lc3NhZ2UgdG8gb3VyIGhhbmRsZXIKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4odGhpcywgRVZFTlRfRFJJVkVSX1NUQVRFX0NIQU5HRUQsIERSSVZFUl9IVU5HLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGludGVydmFsIHRpbWVyIGZvciBwb2xsaW5nIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24KLSAgICAgKiB0aGF0IGlzIG5vdCBkZWxpdmVyZWQgYXN5bmNocm9ub3VzbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjaGVja1BvbGxUaW1lcigpIHsKLSAgICAgICAgaWYgKG1FbmFibGVSc3NpUG9sbGluZyAmJgotICAgICAgICAgICAgICAgIG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmCi0gICAgICAgICAgICAgICAgIWhhc01lc3NhZ2VzKEVWRU5UX1BPTExfSU5URVJWQUwpKSB7Ci0gICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChFVkVOVF9QT0xMX0lOVEVSVkFMLCBQT0xMX1NUQVRVU19JTlRFUlZBTF9NU0VDUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUT0RPOiBtUnVuU3RhdGUgaXMgbm90IHN5bmNocm9uaXplZCBpbiBzb21lIHBsYWNlcwotICAgICAqIGFkZHJlc3MgdGhpcyBhcyBwYXJ0IG9mIHJlLWFyY2hpdGVjdC4KLSAgICAgKgotICAgICAqIFRPRE86IFdlIGFyZSBleHBvc2luZyBhbiBhZGRpdGlvbmFsIHB1YmxpYyBzeW5jaHJvbml6ZWQgY2FsbAotICAgICAqIGZvciBhIHdha2Vsb2NrIG9wdGltaXphdGlvbiBpbiBXaWZpU2VydmljZS4gUmVtb3ZlIGl0Ci0gICAgICogd2hlbiB3ZSBoYW5kbGUgdGhlIHdha2Vsb2NrIGluIENvbm5lY3Rpdml0eVNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRHJpdmVyU3RvcHBlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCB8fCBtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQSU5HOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJhdHRlcnlXb3JrU291cmNlTG9ja2VkKFdvcmtTb3VyY2UgbmV3U291cmNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobmV3U291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUnVubmluZ1dpZmlVaWRzLnNldChuZXdTb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgICAgIGlmIChtUmVwb3J0ZWRSdW5uaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB3b3JrIHNvdXJjZSBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUsIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gcmVtb3ZlIG9sZCB3b3JrIGZyb20gYmF0dGVyeSBzdGF0cy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0UnVubmluZ1dpZmlVaWRzLmRpZmYobVJ1bm5pbmdXaWZpVWlkcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlSdW5uaW5nQ2hhbmdlZChtTGFzdFJ1bm5pbmdXaWZpVWlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJ1bm5pbmdXaWZpVWlkcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFJ1bm5pbmdXaWZpVWlkcy5zZXQobVJ1bm5pbmdXaWZpVWlkcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBOb3cgYmVpbmcgc3RhcnRlZCwgcmVwb3J0IGl0LgotICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpUnVubmluZyhtUnVubmluZ1dpZmlVaWRzKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RSdW5uaW5nV2lmaVVpZHMuc2V0KG1SdW5uaW5nV2lmaVVpZHMpOwotICAgICAgICAgICAgICAgICAgICBtUmVwb3J0ZWRSdW5uaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgICAgIGlmIChtUmVwb3J0ZWRSdW5uaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIExhc3QgcmVwb3J0ZWQgd2Ugd2VyZSBydW5uaW5nLCB0aW1lIHRvIHN0b3AuCi0gICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlTdG9wcGVkKG1MYXN0UnVubmluZ1dpZmlVaWRzKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RSdW5uaW5nV2lmaVVpZHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbVJlcG9ydGVkUnVubmluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU3RhdGUgaW4gdHJhbnNpdGlvbiAtLSBub3RoaW5nIHRvIHVwZGF0ZSB5ZXQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcnVuIHN0YXRlIHRvIGVpdGhlciAibm9ybWFsIiBvciAic2Nhbi1vbmx5Ii4KLSAgICAgKiBAcGFyYW0gc2Nhbk9ubHlNb2RlIHRydWUgaWYgdGhlIG5ldyBtb2RlIHNob3VsZCBiZSBzY2FuLW9ubHkuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNjYW5Pbmx5TW9kZShib29sZWFuIHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAvLyBkbyBub3RoaW5nIHVubGVzcyBzY2FuLW9ubHkgbW9kZSBpcyBjaGFuZ2luZwotICAgICAgICBpZiAobUlzU2Nhbk9ubHkgIT0gc2Nhbk9ubHlNb2RlKSB7Ci0gICAgICAgICAgICBpbnQgc2NhblR5cGUgPSAoc2Nhbk9ubHlNb2RlID8KLSAgICAgICAgICAgICAgICAgICAgU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkgOiBTVVBQTF9TQ0FOX0hBTkRMSU5HX05PUk1BTCk7Ci0gICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU2Nhbi1vbmx5IG1vZGUgY2hhbmdpbmcgdG8gIiArIHNjYW5Pbmx5TW9kZSArICIgc2NhblR5cGU9IiArIHNjYW5UeXBlKTsKLSAgICAgICAgICAgIGlmIChzZXRTY2FuUmVzdWx0SGFuZGxpbmcoc2NhblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgbUlzU2Nhbk9ubHkgPSBzY2FuT25seU1vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2Nhbk9ubHlNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgc3VzcGVuZCBtb2RlIG9wdGltaXphdGlvbnMuIFRoZXNlIGluY2x1ZGU6Ci0gICAgICogLSBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICogLSB0dXJuIG9mZiByb2FtaW5nCi0gICAgICogLSBEVElNIHNldHRpbmdzCi0gICAgICoKLSAgICAgKiBVc2VzIHJlZmVyZW5jZSBjb3VudGluZyB0byBrZWVwIHRoZSBzdXNwZW5kIG9wdGltaXphdGlvbnMgZGlzYWJsZWQKLSAgICAgKiBhcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMgb3B0aW1pemF0aW9ucyBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqIEZvciBleGFtcGxlLCBXaWZpTG9jayBjYW4ga2VlcCBzdXNwZW5kIG9wdGltaXphdGlvbnMgZGlzYWJsZWQKLSAgICAgKiBvciB0aGUgdXNlciBzZXR0aW5nICh3aWZpIG5ldmVyIHNsZWVwcykgY2FuIGtlZXAgc3VzcGVuZCBvcHRpbWl6YXRpb25zCi0gICAgICogZGlzYWJsZWQuIEFzIGxvbmcgYXMgb25lIGVudGl0eSB3YW50cyBpdCBkaXNhYmxlZCwgaXQgc2hvdWxkIHN0YXkKLSAgICAgKiB0aGF0IHdheQotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiBvcHRpbWl6YXRpb25zIG5lZWQgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyhib29sZWFuIGVuYWJsZWQpIHsKLQotICAgICAgICAvKiBJdCBpcyBnb29kIHRvIHBsdW1iIHN1c3BlbmQgb3B0aW1pemF0aW9uIGVuYWJsZQotICAgICAgICAgKiBvciBkaXNhYmxlIGV2ZW4gaWYgcmVmIGNvdW50IGluZGljYXRlcyBhbHJlYWR5IGRvbmUKLSAgICAgICAgICogc2luY2Ugd2UgY291bGQgaGF2ZSBhIGNhc2Ugb2YgcHJldmlvdXMgZmFpbHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghZW5hYmxlZCkgewotICAgICAgICAgICAgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50Kys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQtLTsKLSAgICAgICAgICAgIGlmIChtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBLZWVwIHJlZmNvdW50IGZyb20gYmVjb21pbmcgbmVnYXRpdmUgKi8KLSAgICAgICAgICAgICAgICBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXaWZpTmF0aXZlLnNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChlbmFibGVkKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldCBoaWdoIHBlcmZvcm1hbmNlIG1vZGUgb2Ygb3BlcmF0aW9uLiBUaGlzIHdvdWxkIG1lYW4KLSAgICAgKiB1c2UgYWN0aXZlIHBvd2VyIG1vZGUgYW5kIGRpc2FibGUgc3VzcGVuZCBvcHRpbWl6YXRpb25zCi0gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SGlnaFBlcmZNb2RlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBpZiAobUlzSGlnaFBlcmZFbmFibGVkICE9IGVuYWJsZWQpIHsKLSAgICAgICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSk7Ci0gICAgICAgICAgICAgICAgc2V0U3VzcGVuZE1vZGVPcHRpbWl6YXRpb25zKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FVVE8pOwotICAgICAgICAgICAgICAgIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc0hpZ2hQZXJmRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICBMb2cuZChUQUcsImhpZ2ggcGVyZm9ybWFuY2UgbW9kZTogIiArIGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nID0gZmFsc2U7Ci0gICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGNvbm5lY3RlZCA9IG1CbHVldG9vdGhBMmRwLmdldENvbm5lY3RlZFNpbmtzKCk7Ci0KLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aEEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtRW5hYmxlUnNzaVBvbGxpbmcgPSBlbmFibGU7Ci0gICAgICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgcmVsZWFzZSB0aGUgd2FrZWxvY2sgaW4gV2lmaVNlcnZpY2UKLSAgICAgKiB1c2luZyBhIHRpbWVyLgotICAgICAqCi0gICAgICogVE9ETzoKLSAgICAgKiBSZWxlYXNpbmcgd2FrZWxvY2sgdXNpbmcgYm90aCB0aW1lciBhbmQKLSAgICAgKiBhIGNhbGwgZnJvbSBDb25uZWN0aXZpdHlTZXJ2aWNlIHJlcXVpcmVzCi0gICAgICogYSByZXRoaW5rLiBXZSBoYWQgcHJvYmxlbXMgd2hlcmUgV2lmaVNlcnZpY2UKLSAgICAgKiBjb3VsZCBrZWVwIGEgd2FrZWxvY2sgZm9yZXZlciBpZiB3ZSBkZWxldGUKLSAgICAgKiBtZXNzYWdlcyBpbiB0aGUgYXN5bmNocm9ub3VzIGNhbGwKLSAgICAgKiBmcm9tIENvbm5lY3Rpdml0eVNlcnZpY2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBXUEEgc3VwcGxpY2FudCBzdGF0ZXMgdG8gZGV0ZWN0ICJsb29wIiBzaXR1YXRpb25zLgotICAgICAqIEBwYXJhbSBuZXdTdXBwbGljYW50U3RhdGUgVGhlIG5ldyBXUEEgc3VwcGxpY2FudCBzdGF0ZS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VwcGxpY2FudCBsb29wIHNob3VsZCBiZSBzdG9wcGVkCi0gICAgICogYW5kIHtAY29kZSBmYWxzZX0gaWYgaXQgc2hvdWxkIGNvbnRpbnVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cHBsaWNhbnRMb29waW5nKFN1cHBsaWNhbnRTdGF0ZSBuZXdTdXBwbGljYW50U3RhdGUpIHsKLSAgICAgICAgaWYgKFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORy5vcmRpbmFsKCkgPD0gbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKQotICAgICAgICAgICAgJiYgbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKSA8IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQub3JkaW5hbCgpKSB7Ci0gICAgICAgICAgICBpZiAobVN1cHBsaWNhbnRMb29wU3RhdGUgIT0gbmV3U3VwcGxpY2FudFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZS5vcmRpbmFsKCkgPCBtU3VwcGxpY2FudExvb3BTdGF0ZS5vcmRpbmFsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKyttTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TdXBwbGljYW50TG9vcFN0YXRlID0gbmV3U3VwcGxpY2FudFN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7Ci0gICAgICAgICAgICByZXNldFN1cHBsaWNhbnRMb29wU3RhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zID49IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIFdQQSBzdXBwbGljYW50IGxvb3Agc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3VwcGxpY2FudExvb3BTdGF0ZSgpIHsKLSAgICAgICAgbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICBJbnRlbnQgaW50ZW50OwotCi0gICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OOgotICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9SVU5OSU5HOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVCYXR0ZXJ5V29ya1NvdXJjZUxvY2tlZChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hlY2tVc2VTdGF0aWNJcCgpOwotICAgICAgICAgICAgICAgIC8qIFJlc2V0IG5vdGlmaWNhdGlvbiBzdGF0ZSBvbiBuZXcgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIERIQ1AgcmVxdWVzdHMgYXJlIGJsb2NraW5nLCBzbyBydW4gdGhlbSBpbiBhIHNlcGFyYXRlIHRocmVhZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBIYW5kbGVyVGhyZWFkIGRoY3BUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiREhDUCBIYW5kbGVyIFRocmVhZCIpOwotICAgICAgICAgICAgICAgIGRoY3BUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICBtRGhjcFRhcmdldCA9IG5ldyBEaGNwSGFuZGxlcihkaGNwVGhyZWFkLmdldExvb3BlcigpLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtSXNTY2FuTW9kZUFjdGl2ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUlzSGlnaFBlcmZFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIG1Ub3JuRG93bkJ5Q29ubk1nciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1MYXN0QnNzaWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1MYXN0U3NpZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUlzQW55TmV0d29ya0Rpc2FibGVkLnNldChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdENvbm5lY3Rpb25JbmZvKCk7Ci0gICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN1cHBsU3RhdGUgPSBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhlIE1BQyBhZGRyZXNzIGlzbid0IGdvaW5nIHRvIGNoYW5nZSwgc28ganVzdCByZXF1ZXN0IGl0Ci0gICAgICAgICAgICAgICAgICogb25jZSBoZXJlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBtYWNhZGRyID0gZ2V0TWFjQWRkcmVzcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1hY2FkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0TWFjQWRkcmVzcyhtYWNhZGRyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkNvbm5lY3Rpb24gdG8gc3VwcGxpY2FudCBlc3RhYmxpc2hlZCwgc3RhdGU9IiArCi0gICAgICAgICAgICAgICAgICAgIHN1cHBsU3RhdGUpOwotICAgICAgICAgICAgICAgIC8vIFdpLUZpIHN1cHBsaWNhbnQgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIFszMS0gMl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAvLyBbIDEtIDBdIENvbm5lY3RlZCB0byBzdXBwbGljYW50ICgxKSwgZGlzY29ubmVjdGVkIGZyb20gc3VwcGxpY2FudCAoMCkgLAotICAgICAgICAgICAgICAgIC8vICAgICAgICAgb3Igc3VwcGxpY2FudCBkaWVkICgyKQotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfU1VQUExJQ0FOVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQsIDEpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVGhlIENPTVBMRVRFRCBzdGF0ZSBjaGFuZ2UgZnJvbSB0aGUgc3VwcGxpY2FudCBtYXkgaGF2ZSBvY2N1cnJlZAotICAgICAgICAgICAgICAgICAqIGluIGJldHdlZW4gcG9sbGluZyBmb3Igc3VwcGxpY2FudCBhdmFpbGFiaWxpdHksIGluIHdoaWNoIGNhc2UKLSAgICAgICAgICAgICAgICAgKiB3ZSBkaWRuJ3QgcGVyZm9ybSBhIERIQ1AgcmVxdWVzdCB0byBnZXQgYW4gSVAgYWRkcmVzcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoc3VwcGxTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0QnNzaWQgPSBtV2lmaUluZm8uZ2V0QlNTSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RTc2lkID0gbVdpZmlJbmZvLmdldFNTSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9DT05ORUNUSU9OX0NIQU5HRV9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9DT05ORUNURUQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdXBwbFN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQgJiYgbUhhdmVJcEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2Yoc3VwcGxTdGF0ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEZpbHRlciBvdXQgbXVsdGljYXN0IHBhY2tldHMuIFRoaXMgc2F2ZXMgYmF0dGVyeSBwb3dlciwgc2luY2UKLSAgICAgICAgICAgICAgICAgKiB0aGUgQ1BVIGRvZXNuJ3QgaGF2ZSB0byBzcGVuZCB0aW1lIHByb2Nlc3NpbmcgcGFja2V0cyB0aGF0Ci0gICAgICAgICAgICAgICAgICogYXJlIGdvaW5nIHRvIGVuZCB1cCBiZWluZyB0aHJvd24gYXdheS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBtV00uaW5pdGlhbGl6ZU11bHRpY2FzdEZpbHRlcmluZygpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoaXMgYWZ0ZXIgdGhlIHN1cHBsaWNhbnQgaXMgYWxpdmUKLSAgICAgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9TVVBQTElDQU5UX0RJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUJhdHRlcnlXb3JrU291cmNlTG9ja2VkKG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sZWFuIGRpZWQgPSBtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRElTQUJMRUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRElTQUJMSU5HOwotICAgICAgICAgICAgICAgIGlmIChkaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJTdXBwbGljYW50IGRpZWQgdW5leHBlY3RlZGx5Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkNvbm5lY3Rpb24gdG8gc3VwcGxpY2FudCBsb3N0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFdpLUZpIHN1cHBsaWNhbnQgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIFszMS0gMl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAvLyBbIDEtIDBdIENvbm5lY3RlZCB0byBzdXBwbGljYW50ICgxKSwgZGlzY29ubmVjdGVkIGZyb20gc3VwcGxpY2FudCAoMCkgLAotICAgICAgICAgICAgICAgIC8vICAgICAgICAgb3Igc3VwcGxpY2FudCBkaWVkICgyKQotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfU1VQUExJQ0FOVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQsIGRpZWQgPyAyIDogMCk7Ci0gICAgICAgICAgICAgICAgY2xvc2VTdXBwbGljYW50Q29ubmVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gV2hlbiBzdXBwbGljYW50IGRpZXMsIGtpbGwgdGhlIERIQ1AgdGhyZWFkCi0gICAgICAgICAgICAgICAgaWYgKG1EaGNwVGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbURoY3BUYXJnZXQuZ2V0TG9vcGVyKCkucXVpdCgpOwotICAgICAgICAgICAgICAgICAgICBtRGhjcFRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Db250ZXh0LnJlbW92ZVN0aWNreUJyb2FkY2FzdChuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKTsKLSAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfQ09OTkVDVEVELCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgc2V0U3VwcGxpY2FudFN0YXRlKFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKTsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoZGllZCkgewotICAgICAgICAgICAgICAgICAgICBtV00uc2V0V2lmaUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9NQVlCRV9TVEFSVF9TQ0FOX1BPU1RfRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgd2UgaGF2ZW4ndCBnb3R0ZW4gYSBuZXcgc3VwcGxpY2FudCBzdGF0dXMgc2luY2UgdGhlIHRpbWVyCi0gICAgICAgICAgICAgICAgLy8gc3RhcnRlZAotICAgICAgICAgICAgICAgIGlmIChtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcyA9PSBtc2cuYXJnMSkgewotICAgICAgICAgICAgICAgICAgICBzY2FuKGZhbHNlKTsgLy8gZG8gYSBwYXNzaXZlIHNjYW4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIG1OdW1TdXBwbGljYW50U3RhdGVDaGFuZ2VzKys7Ci0gICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0IHN1cHBsaWNhbnRTdGF0ZVJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgIChTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQpIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIG5ld1N0YXRlID0gc3VwcGxpY2FudFN0YXRlUmVzdWx0LnN0YXRlOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBjdXJyZW50U3RhdGUgPSBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBzdXBwbGljYW50IHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSA2XSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgNS0gMF0gU3VwcGxpY2FudCBzdGF0ZSBvcmRpbmFsIChhcyBkZWZpbmVkIGJ5IFN1cHBsaWNhbnRTdGF0ZSkKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnRMb2dQYXJhbSA9IChuZXdTdGF0ZS5vcmRpbmFsKCkgJiAweDNmKTsKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCwgZXZlbnRMb2dQYXJhbSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiQ2hhbmdpbmcgc3VwcGxpY2FudCBzdGF0ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPT0+ICIgKyBuZXdTdGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbmV0d29ya0lkID0gc3VwcGxpY2FudFN0YXRlUmVzdWx0Lm5ldHdvcmtJZDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBTdXBwbGljYW50U3RhdGUgQlNTSUQgdmFsdWUgaXMgdmFsaWQgaW4gQVNTT0NJQVRJTkcgc3RhdGUgb25seS4KLSAgICAgICAgICAgICAgICAgKiBUaGUgTmV0d29ya1N0YXRlIEJTU0lEIHZhbHVlIGNvbWVzIHVwb24gYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHN1cHBsaWNhbnRTdGF0ZVJlc3VsdC5zdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IHN1cHBsaWNhbnRTdGF0ZVJlc3VsdC5CU1NJRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiB3ZSBnZXQgZGlzY29ubmVjdCBvciBpbmFjdGl2ZSB3ZSBuZWVkIHRvIHN0YXJ0IG91cgotICAgICAgICAgICAgICAgICAqIHdhdGNoZG9nIHRpbWVyIHRvIHN0YXJ0IGEgc2NhbgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuSU5BQ1RJVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoRVZFTlRfTUFZQkVfU1RBUlRfU0NBTl9QT1NUX0RJU0NPTk5FQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMsIDApLCBLSUNLU1RBUlRfU0NBTk5JTkdfREVMQVlfTVNFQ1MpOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBEaWQgd2UgZ2V0IHRvIERJU0NPTk5FQ1RFRCBzdGF0ZSBkdWUgdG8gYW4KLSAgICAgICAgICAgICAgICAgKiBhdXRoZW50aWNhdGlvbiAocGFzc3dvcmQpIGZhaWx1cmU/Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBmYWlsZWRUb0F1dGhlbnRpY2F0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWxlZFRvQXV0aGVudGljYXRlID0gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEtlZXAgdHJhY2sgb2YgdGhlIHN1cHBsaWNhbnQgc3RhdGUgYW5kIGNoZWNrIGlmIHdlIHNob3VsZAotICAgICAgICAgICAgICAgICAqIGRpc2FibGUgdGhlIG5ldHdvcmsKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBib29sZWFuIGRpc2FibGVkTmV0d29yayA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChpc1N1cHBsaWNhbnRMb29waW5nKG5ld1N0YXRlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0b3AgV1BBIHN1cHBsaWNhbnQgbG9vcCBhbmQgZGlzYWJsZSBuZXR3b3JrIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWROZXR3b3JrID0gd2lmaU1hbmFnZXJEaXNhYmxlTmV0d29yayhuZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZE5ldHdvcmspIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIGxvb3Agc3RhdGUgaWYgd2UgZGlzYWJsZWQgdGhlIG5ldHdvcmsKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHJlc2V0U3VwcGxpY2FudExvb3BTdGF0ZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgIT0gY3VycmVudFN0YXRlIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCAmJiBpc0RyaXZlclN0b3BwZWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3VwcGxpY2FudFN0YXRlKG5ld1N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ET1JNQU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxlZFN0YXRlIG5ld0RldGFpbGVkU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlY29ubmVjdE1zZyA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfREVGRVJSRURfUkVDT05ORUNULCBtTGFzdEJzc2lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNTY2FuT25seSB8fCBtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV0YWlsZWRTdGF0ZSA9IERldGFpbGVkU3RhdGUuSURMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV0YWlsZWRTdGF0ZSA9IERldGFpbGVkU3RhdGUuRkFJTEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUobmV3RGV0YWlsZWRTdGF0ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgYXNzb2NpYXRlZCB3aXRoIGEgbmV0d29yayAobmV0d29ya0lkICE9IC0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFzc3VtZSB3ZSByZWFjaGVkIHRoaXMgc3RhdGUgYmVjYXVzZSBvZiBhIGZhaWxlZCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBhY3F1aXJlIGFuIElQIGFkZHJlc3MsIGFuZCBhdHRlbXB0IGFub3RoZXIgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIElQIGFkZHJlc3MgYWNxdWlzaXRpb24gaW4gUkVDT05ORUNUX0RFTEFZX01TRUNTCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBtaWxsaXNlY29uZHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1JVTk5JTkcgJiYgIW1Jc1NjYW5Pbmx5ICYmIG5ldHdvcmtJZCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChyZWNvbm5lY3RNc2csIFJFQ09OTkVDVF9ERUxBWV9NU0VDUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wRHJpdmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RBUlRJTkcgJiYgIW1Jc1NjYW5Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEcml2ZXJTdG9wcGVkKCkgfHwgbURpc2Nvbm5lY3RFeHBlY3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVEaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgIT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCAmJiAhbURpc2Nvbm5lY3RQZW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIElnbm9yZSBldmVudHMgdGhhdCBkb24ndCBjaGFuZ2UgdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1Y2ggYXMgV1BBIHJla2V5aW5nIG9wZXJhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGN1cnJlbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRk9VUl9XQVlfSEFORFNIQUtFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5HUk9VUF9IQU5EU0hBS0UpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoV2lmaUluZm8uZ2V0RGV0YWlsZWRTdGF0ZU9mKG5ld1N0YXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtRGlzY29ubmVjdEV4cGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfU1RBVEUsIChQYXJjZWxhYmxlKW5ld1N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZFRvQXV0aGVudGljYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSwgZGlzYWJsaW5nIG5ldHdvcmsgIiArIG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWZpTWFuYWdlckRpc2FibGVOZXR3b3JrKG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FUlJPUl9BVVRIRU5USUNBVElORyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBFYWNoIENPTk5FQ1Qgb3IgRElTQ09OTkVDVCBnZW5lcmF0ZXMgYSBwYWlyIG9mIGV2ZW50cy4KLSAgICAgICAgICAgICAgICAgKiBPbmUgaXMgYSBzdXBwbGljYW50IHN0YXRlIGNoYW5nZSBldmVudCwgYW5kIHRoZSBvdGhlcgotICAgICAgICAgICAgICAgICAqIGlzIGEgbmV0d29yayBzdGF0ZSBjaGFuZ2UgZXZlbnQuIEZvciBjb25uZWN0cywgdGhlCi0gICAgICAgICAgICAgICAgICogc3VwcGxpY2FudCBldmVudCBhbHdheXMgYXJyaXZlcyBmaXJzdCwgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgICAgICAgKiB0aGUgbmV0d29yayBzdGF0ZSBjaGFuZ2UgZXZlbnQuIE9ubHkgdGhlIGxhdHRlciBldmVudAotICAgICAgICAgICAgICAgICAqIGhhcyB0aGUgQlNTSUQsIHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkIGluIGNhcHR1cmluZy4KLSAgICAgICAgICAgICAgICAgKiBGb3IgZGlzY29ubmVjdHMsIHRoZSBvcmRlciBpcyB0aGUgb3Bwb3NpdGUgLS0gdGhlCi0gICAgICAgICAgICAgICAgICogbmV0d29yayBzdGF0ZSBjaGFuZ2UgZXZlbnQgY29tZXMgZmlyc3QsIGZvbGxvd2VkIGJ5Ci0gICAgICAgICAgICAgICAgICogdGhlIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGV2ZW50LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdCByZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAoTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0KSBtc2cub2JqOwotCi0gICAgICAgICAgICAgICAgLy8gV2ktRmkgbmV0d29yayBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIFszMS0gNl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAvLyBbIDUtIDBdIERldGFpbGVkIHN0YXRlIG9yZGluYWwgKGFzIGRlZmluZWQgYnkgTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSkgICAKLSAgICAgICAgICAgICAgICBldmVudExvZ1BhcmFtID0gKHJlc3VsdC5zdGF0ZS5vcmRpbmFsKCkgJiAweDNmKTsKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX05FVFdPUktfU1RBVEVfQ0hBTkdFRCwgZXZlbnRMb2dQYXJhbSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIk5ldyBuZXR3b3JrIHN0YXRlIGlzICIgKyByZXN1bHQuc3RhdGUpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSWYgd2UncmUgaW4gc2Nhbi1vbmx5IG1vZGUsIGRvbid0IGFkdmFuY2UgdGhlIHN0YXRlIG1hY2hpbmUsIGFuZAotICAgICAgICAgICAgICAgICAqIGRvbid0IHJlcG9ydCB0aGUgc3RhdGUgY2hhbmdlIHRvIGNsaWVudHMuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG1Jc1NjYW5Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJEcm9wcGluZyBldmVudCBpbiBzY2FuLW9ubHkgbW9kZSIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSAhPSBEZXRhaWxlZFN0YXRlLlNDQU5OSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzY2FuIGNvdW50IHNpbmNlIHRoZXJlIHdhcyBhIG5ldHdvcmsgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICogY2hhbmdlLiBUaGlzIGNvdWxkIGJlIGZyb20gc3VwcGxpY2FudCB0cnlpbmcgdG8gYXNzb2NpYXRlCi0gICAgICAgICAgICAgICAgICAgICAqIHdpdGggYSBuZXR3b3JrLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIElmIHRoZSBzdXBwbGljYW50IHNlbnQgdXMgYSBDT05ORUNURUQgZXZlbnQsIHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgICogd2FudCB0byBzZW5kIG91dCBhbiBpbmRpY2F0aW9uIG9mIG92ZXJhbGwgbmV0d29yawotICAgICAgICAgICAgICAgICAqIGNvbm5lY3Rpdml0eSB1bnRpbCB3ZSBoYXZlIG91ciBJUCBhZGRyZXNzLiBJZiB0aGUKLSAgICAgICAgICAgICAgICAgKiBzdXBwbGljYW50IHNlbnQgdXMgYSBESVNDT05ORUNURUQgZXZlbnQsIHdlIGRlbGF5Ci0gICAgICAgICAgICAgICAgICogc2VuZGluZyBhIG5vdGlmaWNhdGlvbiBpbiBjYXNlIGEgcmVjb25uZWN0aW9uIHRvCi0gICAgICAgICAgICAgICAgICogdGhlIHNhbWUgYWNjZXNzIHBvaW50IG9jY3VycyB3aXRoaW4gYSBzaG9ydCB0aW1lLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgPT0gRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuRE9STUFOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVEaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKG1XaWZpSW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKCEocmVzdWx0LnN0YXRlID09IERldGFpbGVkU3RhdGUuQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoIW1IYXZlSXBBZGRyZXNzIHx8IG1EaXNjb25uZWN0UGVuZGluZykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUocmVzdWx0LnN0YXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlID09IERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0aGUgJ2F2YWlsYWJsZSBuZXR3b3Jrcycgbm90aWZpY2F0aW9uIHdoZW4gd2UKLSAgICAgICAgICAgICAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGNvbm5lY3QgdG8gYSBuZXR3b3JrLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHdhc0Rpc2Nvbm5lY3RQZW5kaW5nID0gbURpc2Nvbm5lY3RQZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICBjYW5jZWxEaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgYXMgZmFyIGFzIGxpbmstbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICogY29ubmVjdGl2aXR5IGlzIGNvbmNlcm5lZCwgYnV0IHdlIG1heSBzdGlsbCBuZWVkIHRvIG9idGFpbgotICAgICAgICAgICAgICAgICAgICAgKiBhbiBJUCBhZGRyZXNzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0Rpc2Nvbm5lY3RQZW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxlZFN0YXRlIHNhdmVTdGF0ZSA9IGdldE5ldHdvcmtJbmZvKCkuZ2V0RGV0YWlsZWRTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGVJbnRlcm5hbChzYXZlU3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0QnNzaWQgPSByZXN1bHQuQlNTSUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0U3NpZCA9IG1XaWZpSW5mby5nZXRTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0TmV0d29ya0lkID0gcmVzdWx0Lm5ldHdvcmtJZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXZlSXBBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5PQlRBSU5JTkdfSVBBRERSKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1XaWZpSW5mby5nZXRCU1NJRCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFOgotICAgICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGUoKTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBPbiByZWNlaXZpbmcgdGhlIGZpcnN0IHNjYW4gcmVzdWx0cyBhZnRlciBjb25uZWN0aW5nIHRvCi0gICAgICAgICAgICAgICAgICogdGhlIHN1cHBsaWNhbnQsIHN3aXRjaCBzY2FuIG1vZGUgb3ZlciB0byBwYXNzaXZlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNldFNjYW5Nb2RlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9QT0xMX0lOVEVSVkFMOgotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8obVdpZmlJbmZvLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfREVGRVJSRURfUkVDT05ORUNUOgotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIG1MYXN0QnNzaWQgY2FuIGJlIG51bGwgd2hlbiB0aGVyZSBpcyBhIHJlY29ubmVjdAotICAgICAgICAgICAgICAgICAqIHJlcXVlc3Qgb24gdGhlIGZpcnN0IEJTU0lEIHdlIGNvbm5lY3QgdG8KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgQlNTSUQgPSAobXNnLm9iaiAhPSBudWxsKSA/IG1zZy5vYmoudG9TdHJpbmcoKSA6IG51bGw7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogSWYgd2UndmUgZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZm9yIHJlY29ubmVjdGluZwotICAgICAgICAgICAgICAgICAqIHRvIGEgZ2l2ZW4gbmV0d29yaywgZGlzYWJsZSB0aGUgbmV0d29yawotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCsrbVJlY29ubmVjdENvdW50ID4gZ2V0TWF4RGhjcFJldHJpZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgcmVjb25uZWN0IGNvdW50OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCArICIgRGlzYWJsaW5nICIgKyBCU1NJRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV00uZGlzYWJsZU5ldHdvcmsobUxhc3ROZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlY29ubmVjdENvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1VDQ0VFREVEOgotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFNpbmNlIHRoaXMgZXZlbnQgaXMgc2VudCBmcm9tIGFub3RoZXIgdGhyZWFkLCBpdCBtaWdodCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgKiBzZW50IGFmdGVyIHdlIGNsb3NlZCBvdXIgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudCBpbiB0aGUgY291cnNlCi0gICAgICAgICAgICAgICAgICogb2YgZGlzYWJsaW5nIFdpLUZpLiBJbiB0aGF0IGNhc2UsIHdlIHNob3VsZCBqdXN0IGlnbm9yZSB0aGUgZXZlbnQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVJlY29ubmVjdENvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MobURoY3BJbmZvLmlwQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOyAvLyBmb3JjZSB1cGRhdGUgb2Ygc2lnbmFsIHN0cmVuZ3RoCi0gICAgICAgICAgICAgICAgaWYgKG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkgIT0gRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobVdpZmlJbmZvLmdldEJTU0lEKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIklQIGNvbmZpZ3VyYXRpb246ICIgKyBtRGhjcEluZm8pOwotICAgICAgICAgICAgICAgIC8vIFdpLUZpIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSAxXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgMC0gMF0gSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkICgxKSBvciBmYWlsZWQgKDApICAgCi0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVEFURV9DSEFOR0VELCAxKTsKLQotICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHksIHNvIGFsbG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4gaW4gdGhlIGZ1dHVyZQotICAgICAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXaS1GaSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgICAgICAvLyBbMzEtIDFdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIFsgMC0gMF0gSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkICgxKSBvciBmYWlsZWQgKDApCi0gICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1RBVEVfQ0hBTkdFRCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MoMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBkcml2ZXIgc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyAwIFNUQVJURUQKLSAgICAgICAgICAgICAgICAvLyAxIFNUT1BQRUQKLSAgICAgICAgICAgICAgICAvLyAyIEhVTkcKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX0RSSVZFUl9TVEFURV9DSEFOR0VELCBtc2cuYXJnMSk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy5hcmcxKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gY2hhbm5lbHMgYWNjb3JkaW5nCi0gICAgICAgICAgICAgICAgICAgICAqIHRvIHRoZSBzeXN0ZW0gc2V0dGluZywgc2luY2UgaXQgZ2V0cyByZXNldCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogZHJpdmVyIHVwb24gY2hhbmdpbmcgdG8gdGhlIFNUQVJURUQgc3RhdGUuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoKTsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVEFSVElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9SVU5OSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUlzU2Nhbk9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHNvbWUgc2l0dWF0aW9ucywgc3VwcGxpY2FudCBuZWVkcyB0byBiZSBraWNrc3RhcnRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgYmFja2dyb3VuZCBzY2FubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9IVU5HOgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJXaWZpIERyaXZlciByZXBvcnRzIEhVTkcgLSByZWxvYWRpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiByZXN0YXJ0IHRoZSBkcml2ZXIgLSB0b2dnbGUgb2ZmIGFuZCBvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgbVdNLnNldFdpZmlFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbVdNLnNldFdpZmlFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUJhdHRlcnlXb3JrU291cmNlTG9ja2VkKG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVDoKLSAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gd2lmaU1hbmFnZXJEaXNhYmxlTmV0d29yayhpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgIGJvb2xlYW4gZGlzYWJsZWROZXR3b3JrID0gZmFsc2U7Ci0gICAgICAgIGlmICgwIDw9IG5ldHdvcmtJZCkgewotICAgICAgICAgICAgZGlzYWJsZWROZXR3b3JrID0gbVdNLmRpc2FibGVOZXR3b3JrKG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZE5ldHdvcmspIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRGlzYWJsZWQgbmV0d29yazogIiArIG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChMT0NBTF9MT0dEKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVkTmV0d29yaykgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBkaXNhYmxlIG5ldHdvcms6IiArCi0gICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIG5ldHdvcmsgaWQ6ICIgKyBuZXR3b3JrSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXNhYmxlZE5ldHdvcms7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUludGVyZmFjZSgpIHsKLSAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKLSAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOwotICAgICAgICBpZiAoIW1Vc2VTdGF0aWNJcCkgewotICAgICAgICAgICAgaWYgKCFtSGF2ZUlwQWRkcmVzcyAmJiAhbU9idGFpbmluZ0lwQWRkcmVzcykgewotICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0LnNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfREhDUF9TVEFSVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLmNvbmZpZ3VyZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSwgbURoY3BJbmZvKSkgewotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBldmVudCA9IEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NVQ0NFRURFRDsKLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCBvdXIgSVAgc3RhdGUgYW5kIHNlbmQgb3V0IGJyb2FkY2FzdHMgZm9sbG93aW5nIGEgZGlzY29ubmVjdC4KLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIHtAY29kZSBEZXRhaWxlZFN0YXRlfSB0byBzZXQuIFNob3VsZCBiZSBlaXRoZXIKLSAgICAgKiB7QGNvZGUgRElTQ09OTkVDVEVEfSBvciB7QGNvZGUgRkFJTEVEfS4KLSAgICAgKiBAcGFyYW0gZGlzYWJsZUludGVyZmFjZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaW50ZXJmYWNlIHNob3VsZAotICAgICAqIGJlIGRpc2FibGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUgbmV3U3RhdGUsIGJvb2xlYW4gZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICBpZiAobURpc2Nvbm5lY3RQZW5kaW5nKSB7Ci0gICAgICAgICAgICBjYW5jZWxEaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbURpc2Nvbm5lY3RFeHBlY3RlZCA9IGZhbHNlOwotICAgICAgICByZXNldENvbm5lY3Rpb25zKGRpc2FibGVJbnRlcmZhY2UpOwotICAgICAgICBzZXREZXRhaWxlZFN0YXRlKG5ld1N0YXRlKTsKLSAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtTGFzdEJzc2lkKTsKLSAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG51bGwpOwotICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKLSAgICAgICAgbUxhc3RTc2lkID0gbnVsbDsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBXaS1GaSBDb25uZWN0aW9ucyBieSBjbGVhcmluZyBhbnkgc3RhdGUsIHJlc2V0dGluZyBhbnkgc29ja2V0cwotICAgICAqIHVzaW5nIHRoZSBpbnRlcmZhY2UsIHN0b3BwaW5nIERIQ1AsIGFuZCBkaXNhYmxpbmcgdGhlIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbm5lY3Rpb25zKGJvb2xlYW4gZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLmQoVEFHLCAiUmVzZXQgY29ubmVjdGlvbnMgYW5kIHN0b3BwaW5nIERIQ1AiKTsKLSAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlc2V0IGNvbm5lY3Rpb24gZGVwZW5kcyBvbiBib3RoIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBJUCBhc3NpZ25lZCwKLSAgICAgICAgICogc28gaXQgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGFueSBjaGFuY2Ugb2YgdGhlIElQIGJlaW5nIGxvc3QuCi0gICAgICAgICAqLwotICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7Ci0KLSAgICAgICAgLy8gU3RvcCBESENQCi0gICAgICAgIGlmIChtRGhjcFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGhjcFRhcmdldC5zZXRDYW5jZWxDYWxsYmFjayh0cnVlKTsKLSAgICAgICAgICAgIG1EaGNwVGFyZ2V0LnJlbW92ZU1lc3NhZ2VzKEVWRU5UX0RIQ1BfU1RBUlQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghTmV0d29ya1V0aWxzLnN0b3BEaGNwKG1JbnRlcmZhY2VOYW1lKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHN0b3AgREhDUCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEludGVyZmFjZSBpcyByZS1lbmFibGVkIGluIHRoZSBzdXBwbGljYW50Ci0gICAgICAgICAqIHdoZW4gbW92aW5nIG91dCBvZiBBU1NPQ0lBVElORyBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgIkRpc2FibGluZyBpbnRlcmZhY2UiKTsKLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBzdXBwbGljYW50IGlzIHJlcG9ydGluZyB0aGF0IHdlIGFyZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY3VycmVudAotICAgICAqIGFjY2VzcyBwb2ludC4gT2Z0ZW4sIGhvd2V2ZXIsIGEgZGlzY29ubmVjdCB3aWxsIGJlIGZvbGxvd2VkIHZlcnkgc2hvcnRseQotICAgICAqIGJ5IGEgcmVjb25uZWN0IHRvIHRoZSBzYW1lIGFjY2VzcyBwb2ludC4gVGhlcmVmb3JlLCB3ZSBkZWxheSByZXNldHRpbmcKLSAgICAgKiB0aGUgY29ubmVjdGlvbidzIElQIHN0YXRlIGZvciBhIGJpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVEaXNjb25uZWN0KCkgewotICAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcgPSB0cnVlOwotICAgICAgICBpZiAoIWhhc01lc3NhZ2VzKEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1QpKSB7Ci0gICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNULCBESVNDT05ORUNUX0RFTEFZX01TRUNTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjYW5jZWxEaXNjb25uZWN0KCkgewotICAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgcmVtb3ZlTWVzc2FnZXMoRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVCk7Ci0gICAgfQotCi0gICAgcHVibGljIERoY3BJbmZvIGdldERoY3BJbmZvKCkgewotICAgICAgICByZXR1cm4gbURoY3BJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxTY2FuUmVzdWx0PiBnZXRTY2FuUmVzdWx0c0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtU2NhblJlc3VsdHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNjYW5SZXN1bHRzTGlzdChMaXN0PFNjYW5SZXN1bHQ+IHNjYW5MaXN0KSB7Ci0gICAgICAgIG1TY2FuUmVzdWx0cyA9IHNjYW5MaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBzdGF0dXMgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24sIGlmIGFueS4KLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFdpZmlJbmZvfSBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBjb25uZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFdpZmlJbmZvIHJlcXVlc3RDb25uZWN0aW9uSW5mbygpIHsKLSAgICAgICAgcmVxdWVzdENvbm5lY3Rpb25TdGF0dXMobVdpZmlJbmZvKTsKLSAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8obVdpZmlJbmZvLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBtV2lmaUluZm87Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKFdpZmlJbmZvIGluZm8pIHsKLSAgICAgICAgU3RyaW5nIHJlcGx5ID0gc3RhdHVzKCk7Ci0gICAgICAgIGlmIChyZXBseSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGFyc2UgdGhlIHJlcGx5IGZyb20gdGhlIHN1cHBsaWNhbnQgdG8gdGhlIHN0YXR1cyBjb21tYW5kLCBhbmQgdXBkYXRlCi0gICAgICAgICAqIGxvY2FsIHN0YXRlIGFjY29yZGluZ2x5LiBUaGUgcmVwbHkgaXMgYSBzZXJpZXMgb2YgbGluZXMgb2YgdGhlIGZvcm0KLSAgICAgICAgICogIm5hbWU9dmFsdWUiLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIFNTSUQgPSBudWxsOwotICAgICAgICBTdHJpbmcgQlNTSUQgPSBudWxsOwotICAgICAgICBTdHJpbmcgc3VwcFN0YXRlID0gbnVsbDsKLSAgICAgICAgaW50IG5ldElkID0gLTE7Ci0gICAgICAgIFN0cmluZ1tdIGxpbmVzID0gcmVwbHkuc3BsaXQoIlxuIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgU3RyaW5nW10gcHJvcCA9IGxpbmUuc3BsaXQoIiAqPSAqIiwgMik7Ci0gICAgICAgICAgICBpZiAocHJvcC5sZW5ndGggPCAyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wWzBdOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcFsxXTsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImlkIikpCi0gICAgICAgICAgICAgICAgbmV0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic3NpZCIpKQotICAgICAgICAgICAgICAgIFNTSUQgPSB2YWx1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYnNzaWQiKSkKLSAgICAgICAgICAgICAgICBCU1NJRCA9IHZhbHVlOwotICAgICAgICAgICAgZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ3cGFfc3RhdGUiKSkKLSAgICAgICAgICAgICAgICBzdXBwU3RhdGUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBpbmZvLnNldE5ldHdvcmtJZChuZXRJZCk7Ci0gICAgICAgIGluZm8uc2V0U1NJRChTU0lEKTsKLSAgICAgICAgaW5mby5zZXRCU1NJRChCU1NJRCk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG9ubHkgc2V0IHRoZSBzdXBwbGljYW50IHN0YXRlIGlmIHRoZSBwcmV2aW91cyBzdGF0ZSB3YXMKLSAgICAgICAgICogVU5JTklUSUFMSVpFRC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB3ZSBmaXJzdCBjb25uZWN0IHRvCi0gICAgICAgICAqIHRoZSBzdXBwbGljYW50LiBPbmNlIHdlJ3JlIGNvbm5lY3RlZCwgd2Ugc2hvdWxkIGFsd2F5cyByZWNlaXZlCi0gICAgICAgICAqIGFuIGV2ZW50IHVwb24gYW55IHN0YXRlIGNoYW5nZSwgYnV0IGluIHRoaXMgY2FzZSwgd2Ugd2FudCB0bwotICAgICAgICAgKiBtYWtlIHN1cmUgYW55IGxpc3RlbmVycyBhcmUgbWFkZSBhd2FyZSBvZiB0aGUgc3RhdGUgY2hhbmdlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCAmJiBzdXBwU3RhdGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHNldFN1cHBsaWNhbnRTdGF0ZShzdXBwU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZHluYW1pYyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCByZXBvcnRlZCB2aWEgZXZlbnRzLgotICAgICAqIEBwYXJhbSBpbmZvIHRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNhcHR1cmVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVxdWVzdFBvbGxlZEluZm8oV2lmaUluZm8gaW5mbywgYm9vbGVhbiBwb2xsaW5nKQotICAgIHsKLSAgICAgICAgaW50IG5ld1Jzc2kgPSAocG9sbGluZyA/IGdldFJzc2lBcHByb3goKSA6IGdldFJzc2koKSk7Ci0gICAgICAgIGlmIChuZXdSc3NpICE9IC0xICYmIC0yMDAgPCBuZXdSc3NpICYmIG5ld1Jzc2kgPCAyNTYpIHsgLy8gc2NyZWVuIG91dCBpbnZhbGlkIHZhbHVlcwotICAgICAgICAgICAgLyogc29tZSBpbXBsZW1lbnRhdGlvbnMgYXZvaWQgbmVnYXRpdmUgdmFsdWVzIGJ5IGFkZGluZyAyNTYKLSAgICAgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGF0IGhlcmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChuZXdSc3NpID4gMCkgbmV3UnNzaSAtPSAyNTY7Ci0gICAgICAgICAgICBpbmZvLnNldFJzc2kobmV3UnNzaSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmF0aGVyIHRoZW4gc2VuZGluZyB0aGUgcmF3IFJTU0kgb3V0IGV2ZXJ5IHRpbWUgaXQKLSAgICAgICAgICAgICAqIGNoYW5nZXMsIHdlIHByZWNhbGN1bGF0ZSB0aGUgc2lnbmFsIGxldmVsIHRoYXQgd291bGQKLSAgICAgICAgICAgICAqIGJlIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGJhciwgYW5kIG9ubHkgc2VuZCB0aGUKLSAgICAgICAgICAgICAqIGJyb2FkY2FzdCBpZiB0aGF0IG11Y2ggbW9yZSBjb2Fyc2UtZ3JhaW5lZCBudW1iZXIKLSAgICAgICAgICAgICAqIGNoYW5nZXMuIFRoaXMgY3V0cyBkb3duIGdyZWF0bHkgb24gdGhlIG51bWJlciBvZgotICAgICAgICAgICAgICogYnJvYWRjYXN0cywgYXQgdGhlIGNvc3Qgb2Ygbm90IGluZm9ybWluZyBvdGhlcnMKLSAgICAgICAgICAgICAqIGludGVyZXN0ZWQgaW4gUlNTSSBvZiBhbGwgdGhlIGNoYW5nZXMgaW4gc2lnbmFsCi0gICAgICAgICAgICAgKiBsZXZlbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLy8gVE9ETzogVGhlIHNlY29uZCBhcmcgdG8gdGhlIGNhbGwgYmVsb3cgbmVlZHMgdG8gYmUgYSBzeW1ib2wgc29tZXdoZXJlLCBidXQKLSAgICAgICAgICAgIC8vIGl0J3MgYWN0dWFsbHkgdGhlIHNpemUgb2YgYW4gYXJyYXkgb2YgaWNvbnMgdGhhdCdzIHByaXZhdGUKLSAgICAgICAgICAgIC8vIHRvIFN0YXR1c0JhciBQb2xpY3kuCi0gICAgICAgICAgICBpbnQgbmV3U2lnbmFsTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChuZXdSc3NpLCA0KTsKLSAgICAgICAgICAgIGlmIChuZXdTaWduYWxMZXZlbCAhPSBtTGFzdFNpZ25hbExldmVsKSB7Ci0gICAgICAgICAgICAgICAgc2VuZFJzc2lDaGFuZ2VCcm9hZGNhc3QobmV3UnNzaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gbmV3U2lnbmFsTGV2ZWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvLnNldFJzc2koLTIwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5ld0xpbmtTcGVlZCA9IGdldExpbmtTcGVlZCgpOwotICAgICAgICBpZiAobmV3TGlua1NwZWVkICE9IC0xKSB7Ci0gICAgICAgICAgICBpbmZvLnNldExpbmtTcGVlZChuZXdMaW5rU3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KGZpbmFsIGludCBuZXdSc3NpKSB7Ci0gICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgbmV3UnNzaSk7Ci0gICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChTdHJpbmcgYnNzaWQpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKLSAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8sIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgIGlmIChic3NpZCAhPSBudWxsKQotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0JTU0lELCBic3NpZCk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIFdpLUZpIGNvbm5lY3Rpdml0eSBieSBzdG9wcGluZyB0aGUgZHJpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgICAgICBpZiAoIW1Ub3JuRG93bkJ5Q29ubk1ncikgewotICAgICAgICAgICAgaWYgKGRpc2Nvbm5lY3RBbmRTdG9wKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRUb3JuRG93bkJ5Q29ubk1ncih0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWVuYWJsZSBXaS1GaSBjb25uZWN0aXZpdHkgYnkgcmVzdGFydGluZyB0aGUgZHJpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKLSAgICAgICAgaWYgKG1Ub3JuRG93bkJ5Q29ubk1ncikgewotICAgICAgICAgICAgaWYgKHJlc3RhcnQoKSkgewotICAgICAgICAgICAgICAgIHNldFRvcm5Eb3duQnlDb25uTWdyKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSB3YW50IHRvIHN0b3AgdGhlIGRyaXZlciwgYnV0IGlmIHdlJ3JlIGNvbm5lY3RlZCB0byBhIG5ldHdvcmssCi0gICAgICogd2UgZmlyc3Qgd2FudCB0byBkaXNjb25uZWN0LCBzbyB0aGF0IHRoZSBzdXBwbGljYW50IGlzIGFsd2F5cyBpbgotICAgICAqIGEga25vd24gc3RhdGUgKERJU0NPTk5FQ1RFRCkgd2hlbiB0aGUgZHJpdmVyIGlzIHN0b3BwZWQuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUKLSAgICAgKiBkaXNjb25uZWN0IG9yIHN0b3AgY29tbWFuZCB3YXMgaW5pdGlhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0QW5kU3RvcCgpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOzsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSAhPSBSVU5fU1RBVEVfU1RPUFBJTkcgJiYgbVJ1blN0YXRlICE9IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICAvLyBUYWtlIGRvd24gYW55IG9wZW4gbmV0d29yayBub3RpZmljYXRpb25zCi0gICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKGZhbHNlLCAwLCBmYWxzZSwgMCk7Ci0KLSAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkRPUk1BTlQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBzdG9wRHJpdmVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldCA9IGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUElORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZXN0YXJ0KCkgewotICAgICAgICBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RBUlRJTkc7Ci0gICAgICAgICAgICByZXNldENvbm5lY3Rpb25zKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0RHJpdmVyKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORykgewotICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUQVJUSU5HOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0V2lmaVN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZS5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWZpU3RhdGUoaW50IHdpZmlTdGF0ZSkgewotICAgICAgICBtV2lmaVN0YXRlLnNldCh3aWZpU3RhdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW55TmV0d29ya0Rpc2FibGVkKCkgewotICAgICAgICByZXR1cm4gbUlzQW55TmV0d29ya0Rpc2FibGVkLmdldCgpOwotICAgIH0KLQotICAgLyoqCi0gICAgICogVGhlIFdpZmlOYXRpdmUgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhcmUgbGlzdGVkIGJlbG93LgotICAgICAqIFRoZSBvbmx5IG5hdGl2ZSBjYWxsIHRoYXQgaXMgbm90IHN5bmNocm9uaXplZCBvbgotICAgICAqIFdpZmlTdGF0ZVRyYWNrZXIgaXMgd2FpdEZvckV2ZW50KCkgd2hpY2ggd2FpdHMgb24gYQotICAgICAqIHNlcGVyYXRlIG1vbml0b3IgY2hhbm5lbC4KLSAgICAgKgotICAgICAqIEFsbCBzdXBwbGljYW50IGNvbW1hbmRzIG5lZWQgdGhlIHdpZmkgdG8gYmUgaW4gYW4KLSAgICAgKiBlbmFibGVkIHN0YXRlLiBUaGlzIGNhbiBiZSBkb25lIGJ5IGNoZWNraW5nIHRoZQotICAgICAqIG1XaWZpU3RhdGUgdG8gYmUgV0lGSV9TVEFURV9FTkFCTEVELgotICAgICAqCi0gICAgICogQWxsIGNvbW1hbmRzIHRoYXQgY2FuIGNhdXNlIGNvbW1hbmRzIHRvIGRyaXZlcgotICAgICAqIGluaXRpYXRlZCBuZWVkIHRoZSBkcml2ZXIgc3RhdGUgdG8gYmUgc3RhcnRlZC4KLSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgY2hlY2tpbmcgaXNEcml2ZXJTdG9wcGVkKCkgdG8KLSAgICAgKiBiZSBmYWxzZS4KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGRyaXZlciBhbmQgZmlybXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGxvYWREcml2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmxvYWREcml2ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbmxvYWQgdGhlIGRyaXZlciBhbmQgZmlybXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHVubG9hZERyaXZlcigpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUudW5sb2FkRHJpdmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHN1cHBsaWNhbnQgY29uZmlnIGFuZAotICAgICAqIHN0YXJ0IHRoZSBzdXBwbGljYW50IGRhZW1vbgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRTdXBwbGljYW50KCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdGFydFN1cHBsaWNhbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBzdXBwbGljYW50IGRhZW1vbgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcFN1cHBsaWNhbnQoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BTdXBwbGljYW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXN0YWJsaXNoZXMgdHdvIGNoYW5uZWxzIC0gY29udHJvbCBjaGFubmVsIGZvciBjb21tYW5kcwotICAgICAqIGFuZCBtb25pdG9yIGNoYW5uZWwgZm9yIG5vdGlmeWluZyBXaWZpTW9uaXRvcgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdFRvU3VwcGxpY2FudCgpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuY29ubmVjdFRvU3VwcGxpY2FudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBjb250cm9sL21vbml0b3IgY2hhbm5lbHMgdG8gc3VwcGxpY2FudAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCkgewotICAgICAgICBXaWZpTmF0aXZlLmNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgc3VwcGxpY2FudCBpcyBhbGl2ZQotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcGluZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucGluZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbml0aWF0ZSBhbiBhY3RpdmUgb3IgcGFzc2l2ZSBzY2FuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9yY2VBY3RpdmUgdHJ1ZSBpZiBpdCBpcyBhIGFjdGl2ZSBzY2FuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKGZvcmNlQWN0aXZlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgc3VwcGxpY2FudCBvciBkcml2ZXIKLSAgICAgKiB0YWtlIGNhcmUgb2YgaW5pdGlhdGluZyBzY2FuIGFuZCBkb2luZyBBUCBzZWxlY3Rpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwKLSAgICAgKiAgICBTVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFNjYW5SZXN1bHRIYW5kbGluZyhpbnQgbW9kZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZldGNoIHRoZSBzY2FuIHJlc3VsdHMgZnJvbSB0aGUgc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiBleGFtcGxlIHJlc3VsdCBzdHJpbmcKLSAgICAgKiAwMDpiYjpjYzpkZDpjYzplZSAgICAgICAyNDI3ICAgIDE2NiAgICAgW1dQQS1FQVAtVEtJUF1bV1BBMi1FQVAtQ0NNUF0gICBOZXQxCi0gICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZmYgICAgICAgMjQxMiAgICAxNjUgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHNjYW5SZXN1bHRzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNjYW5SZXN1bHRzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2NhbiBtb2RlIC0gYWN0aXZlIG9yIHBhc3NpdmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFNjYW5Nb2RlKGJvb2xlYW4gaXNTY2FuTW9kZUFjdGl2ZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzU2Nhbk1vZGVBY3RpdmUgIT0gaXNTY2FuTW9kZUFjdGl2ZSkgewotICAgICAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0U2Nhbk1vZGVDb21tYW5kKG1Jc1NjYW5Nb2RlQWN0aXZlID0gaXNTY2FuTW9kZUFjdGl2ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdCBmcm9tIEFjY2VzcyBQb2ludAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWF0ZSBhIHJlY29ubmVjdGlvbiB0byBBUAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjb25uZWN0Q29tbWFuZCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gbmV0d29yayBpZCBvZiB0aGUgbmV3IG5ldHdvcmsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhZGROZXR3b3JrKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5hZGROZXR3b3JrQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZSBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgaWQgb2YgdGhlIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURpc2Nvbm5lY3RFeHBlY3RlZCA9IFdpZmlOYXRpdmUucmVtb3ZlTmV0d29ya0NvbW1hbmQobmV0d29ya0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBkaXNhYmxlT3RoZXJzIHRydWUsIGlmIGFsbCBvdGhlciBuZXR3b3JrcyBoYXZlIHRvIGJlIGRpc2FibGVkCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlzYWJsZU90aGVycykgbUlzQW55TmV0d29ya0Rpc2FibGVkLnNldCh0cnVlKTsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIGRpc2FibGVPdGhlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBhbGwgbmV0d29ya3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXR3b3JrcyBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5hYmxlQWxsTmV0d29ya3MoTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gbmV0d29ya3MpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUlzQW55TmV0d29ya0Rpc2FibGVkLnNldChmYWxzZSk7Ci0gICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogbmV0d29ya3MpIHsKLSAgICAgICAgICAgIGlmIChjb25maWcuc3RhdHVzID09IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5ESVNBQkxFRCkgewotICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzYWJsZU5ldHdvcmsoaW50IG5ldElkKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChuZXRJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGUgYSByZS1hc3NvY2lhdGlvbiBpbiBzdXBwbGljYW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWFzc29jaWF0ZSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucmVhc3NvY2lhdGVDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmxhY2tsaXN0IGEgQlNTSUQuIFRoaXMgd2lsbCBhdm9pZCB0aGUgQVAgaWYgdGhlcmUgYXJlCi0gICAgICogYWx0ZXJuYXRlIEFQcyB0byBjb25uZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnNzaWQgQlNTSUQgb2YgdGhlIG5ldHdvcmsKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuYWRkVG9CbGFja2xpc3RDb21tYW5kKGJzc2lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgYmxhY2tsaXN0IGxpc3QKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNsZWFyQmxhY2tsaXN0KCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5jbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IGFsbCBjb25maWd1cmVkIG5ldHdvcmtzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgbmV0d29ya3Mgb3IgbnVsbCBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgbGlzdE5ldHdvcmtzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmxpc3ROZXR3b3Jrc0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmV0d29yayBzZXR0aW5nIGJ5IG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHBhcmFtIG5hbWUgbmV0d29yayB2YXJpYWJsZSBrZXkKLSAgICAgKiBAcmV0dXJuIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8ga2V5Ci0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TmV0d29ya1ZhcmlhYmxlKGludCBuZXRJZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgbmV0d29yayBzZXR0aW5nIGJ5IG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHBhcmFtIG5hbWUgbmV0d29yayB2YXJpYWJsZSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUgbmV0d29yayB2YXJpYWJsZSB2YWx1ZQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE5ldHdvcmtWYXJpYWJsZShpbnQgbmV0SWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgbmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBkZXRhaWxlZCBzdGF0dXMgb2YgdGhlIGNvbm5lY3Rpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gRXhhbXBsZSBzdGF0dXMgcmVzdWx0Ci0gICAgICogIGJzc2lkPWFhOmJiOmNjOmRkOmVlOmZmCi0gICAgICogIHNzaWQ9VGVzdE5ldAotICAgICAqICBpZD0zCi0gICAgICogIHBhaXJ3aXNlX2NpcGhlcj1OT05FCi0gICAgICogIGdyb3VwX2NpcGhlcj1OT05FCi0gICAgICogIGtleV9tZ210PU5PTkUKLSAgICAgKiAgd3BhX3N0YXRlPUNPTVBMRVRFRAotICAgICAqICBpcF9hZGRyZXNzPVguWC5YLlgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBzdGF0dXMoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhdHVzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBSU1NJIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBSU1NJIHZhbHVlLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UnNzaSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0UnNzaUFwcHJveENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYXBwcm94IFJTU0kgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJTU0kgdmFsdWUsIC0xIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSc3NpQXBwcm94KCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRSc3NpQXBwcm94Q29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBsaW5rIHNwZWVkIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBsaW5rIHNwZWVkLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TGlua1NwZWVkKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRMaW5rU3BlZWRDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IE1BQyBhZGRyZXNzIG9mIHJhZGlvCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE1BQyBhZGRyZXNzLCBudWxsIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRNYWNBZGRyZXNzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldE1hY0FkZHJlc3NDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgZHJpdmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydERyaXZlcigpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnREcml2ZXJDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCBkcml2ZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BEcml2ZXIoKSB7Ci0gICAgICAgIC8qIERyaXZlciBzdG9wIHNob3VsZCBub3QgaGFwcGVuIG9ubHkgd2hlbiBzdXBwbGljYW50IGV2ZW50Ci0gICAgICAgICAqIERSSVZFUl9TVE9QUEVEIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCAqLwotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RvcERyaXZlckNvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydFBhY2tldEZpbHRlcmluZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHBhY2tldCBmaWx0ZXJpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BQYWNrZXRGaWx0ZXJpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgcG93ZXIgbW9kZQotICAgICAqIEByZXR1cm4gcG93ZXIgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFBvd2VyTW9kZSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEICYmICFpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldFBvd2VyTW9kZUNvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgcG93ZXIgbW9kZQotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FVVE8KLSAgICAgKiAgICAgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFCi0gICAgICoKLSAgICAgKiBVc2VzIHJlZmVyZW5jZSBjb3VudGluZyB0byBrZWVwIHBvd2VyIG1vZGUgYWN0aXZlCi0gICAgICogYXMgbG9uZyBhcyBvbmUgZW50aXR5IHdhbnRzIHBvd2VyIG1vZGUgdG8gYmUgYWN0aXZlLgotICAgICAqCi0gICAgICogRm9yIGV4YW1wbGUsIFdpZmlMb2NrIGhpZ2ggcGVyZiBtb2RlIGNhbiBrZWVwIHBvd2VyIG1vZGUgYWN0aXZlCi0gICAgICogb3IgYSBESENQIHNlc3Npb24gY2FuIGtlZXAgaXQgYWN0aXZlLiBBcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMKLSAgICAgKiBpdCBlbmFibGVkLCBpdCBzaG91bGQgc3RheSB0aGF0IHdheQotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQb3dlck1vZGUoaW50IG1vZGUpIHsKLQotICAgICAgICAvKiBJdCBpcyBnb29kIHRvIHBsdW1iIHBvd2VyIG1vZGUgY2hhbmdlCi0gICAgICAgICAqIGV2ZW4gaWYgcmVmIGNvdW50IGluZGljYXRlcyBhbHJlYWR5IGRvbmUKLSAgICAgICAgICogc2luY2Ugd2UgY291bGQgaGF2ZSBhIGNhc2Ugb2YgcHJldmlvdXMgZmFpbHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHN3aXRjaChtb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRToKLSAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRFJJVkVSX1BPV0VSX01PREVfQVVUTzoKLSAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQtLTsKLSAgICAgICAgICAgICAgICBpZiAobVBvd2VyTW9kZVJlZkNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogS2VlcCByZWZjb3VudCBmcm9tIGJlY29taW5nIG5lZ2F0aXZlICovCi0gICAgICAgICAgICAgICAgICAgIG1Qb3dlck1vZGVSZWZDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXaWZpTmF0aXZlLnNldFBvd2VyTW9kZUNvbW1hbmQobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgZnJvbSB0aGUgc3lzdGVtCi0gICAgICogc2V0dGluZyB2YWx1ZSwgaWYgYW55LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAotICAgICAqIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNldE51bUFsbG93ZWRDaGFubmVscygKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMpKTsKLSAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChtTnVtQWxsb3dlZENoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobU51bUFsbG93ZWRDaGFubmVscyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVzZSB0aGUgZHJpdmVyIGRlZmF1bHQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG51bWJlciBvZiByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSB1c2VkCi0gICAgICogaW4gdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCi0gICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAotICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UsIGUuZy4sCi0gICAgICoge0Bjb2RlIG51bUNoYW5uZWxzfSBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtTnVtQWxsb3dlZENoYW5uZWxzID0gbnVtQ2hhbm5lbHM7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobnVtQ2hhbm5lbHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscwotICAgICAqCi0gICAgICogQHJldHVybiBjaGFubmVsIGNvdW50LCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGJsdWV0b290aCBjb2V4IG1vZGU6Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9FTkFCTEVECi0gICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVECi0gICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIG9yIGRpc2FibGUgQmx1ZXRvb3RoIGNvZXhpc3RlbmNlIHNjYW4gbW9kZS4gV2hlbiB0aGlzIG1vZGUgaXMgb24sCi0gICAgICogc29tZSBvZiB0aGUgbG93LWxldmVsIHNjYW4gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBkcml2ZXIgYXJlIGNoYW5nZWQgdG8KLSAgICAgKiByZWR1Y2UgaW50ZXJmZXJlbmNlIHdpdGggQTJEUCBzdHJlYW1pbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXNCbHVldG9vdGhQbGF5aW5nIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBtb2RlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEJsdWV0b290aFNjYW5Nb2RlKGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VTY2FuTW9kZUNvbW1hbmQoaXNCbHVldG9vdGhQbGF5aW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gb24gc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2F2ZUNvbmZpZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxvYWRDb25maWcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlbG9hZENvbmZpZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5PbikgewotICAgICAgICByZXR1cm4gbVdNLnNldFdpZmlFbmFibGVkKHR1cm5Pbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gV2ktRmktc3BlY2lmaWMgZmVhdHVyZXMgc3VwcG9ydGVkLgotICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0gICAgICogQHJldHVybiB7QGNvZGUgLTF9IGluZGljYXRpbmcgZmFpbHVyZSwgYWx3YXlzCisgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIHdhbnRzIHRvCisgICAgICogYmVnaW4gdXNpbmcgdGhlIG5hbWVkIGZlYXR1cmUuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB7QGNvZGUgZmVhdHVyZX0KKyAgICAgKiBpcyBjb21wbGV0ZWx5IHVwIHRvIGVhY2ggbmV0d29ya2luZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIGNhbGxpbmdQaWQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEBwYXJhbSBjYWxsaW5nVWlkIHRoZSB1c2VyIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBvdXRjb21lIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHZhbHVlIGlzIHNwZWNpZmljIHRvIGVhY2ggbmV0d29ya2luZworICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CisgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgorICAgICAqIFRPRE86IG5lZWRzIHRvIGdvIGF3YXkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogVGhlcmUgYXJlIGN1cnJlbnRseSBubyBXaS1GaS1zcGVjaWZpYyBmZWF0dXJlcyBzdXBwb3J0ZWQuCi0gICAgICogQHBhcmFtIGZlYXR1cmUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUKLSAgICAgKiBAcmV0dXJuIHtAY29kZSAtMX0gaW5kaWNhdGluZyBmYWlsdXJlLCBhbHdheXMKKyAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgaXMgZmluaXNoZWQKKyAgICAgKiB1c2luZyB0aGUgbmFtZWQgZmVhdHVyZS4gVGhlIGludGVycHJldGF0aW9uIG9mIHtAY29kZSBmZWF0dXJlfQorICAgICAqIGlzIGNvbXBsZXRlbHkgdXAgdG8gZWFjaCBuZXR3b3JraW5nIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRoYXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgKiBAcGFyYW0gY2FsbGluZ1BpZCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgcHJvY2VzcyB0aGF0IGlzIGlzc3VpbmcgdGhpcyByZXF1ZXN0CisgICAgICogQHBhcmFtIGNhbGxpbmdVaWQgdGhlIHVzZXIgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG91dGNvbWUgb2YgdGhlIHJlcXVlc3QuCisgICAgICogVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgdmFsdWUgaXMgc3BlY2lmaWMgdG8gZWFjaCBuZXR3b3JraW5nCisgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KKyAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCisgICAgICogVE9ETzogbmVlZHMgdG8gZ28gYXdheQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0KLSAgICAgICAgLy8gSWYgd2Ugc2hvdWxkbid0IHBsYWNlIGEgbm90aWZpY2F0aW9uIG9uIGF2YWlsYWJsZSBuZXR3b3JrcywgdGhlbgotICAgICAgICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgaWYgKCFtTm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOwotCi0gICAgICAgIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gZ2V0TmV0d29ya0luZm8oKTsKLQotICAgICAgICBTdGF0ZSBzdGF0ZSA9IG5ldHdvcmtJbmZvLmdldFN0YXRlKCk7Ci0gICAgICAgIGlmICgoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuRElTQ09OTkVDVEVEKQotICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5VTktOT1dOKSkgewotCi0gICAgICAgICAgICAvLyBMb29rIGZvciBhbiBvcGVuIG5ldHdvcmsKLSAgICAgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2NhblJlc3VsdHMgPSBnZXRTY2FuUmVzdWx0c0xpc3QoKTsKLSAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bU9wZW5OZXR3b3JrcyA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNjYW5SZXN1bHRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHNjYW5SZXN1bHRzLmdldChpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1PcGVuTmV0d29ya3MrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChudW1PcGVuTmV0d29ya3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgrK21OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID49IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSd2ZSBzY2FubmVkIGNvbnRpbnVvdXNseSBhdCBsZWFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICogTlVNX1NDQU5TX0JFRk9SRV9OT1RJRklDQVRJT04gdGltZXMuIFRoZSB1c2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm9iYWJseSBkb2VzIG5vdCBoYXZlIGEgcmVtZW1iZXJlZCBuZXR3b3JrIGluIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICogc2luY2Ugb3RoZXJ3aXNlIHN1cHBsaWNhbnQgd291bGQgaGF2ZSB0cmllZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzb2NpYXRlIGFuZCB0aHVzIHJlc2V0dGluZyB0aGlzIGNvdW50ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUodHJ1ZSwgbnVtT3Blbk5ldHdvcmtzLCBmYWxzZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTm8gb3BlbiBuZXR3b3JrcyBpbiByYW5nZSwgcmVtb3ZlIHRoZSBub3RpZmljYXRpb24KLSAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQuZ2V0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGlzcGxheSBvciBkb24ndCBkaXNwbGF5IGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlcmUgYXJlIG9wZW4gV2ktRmkgbmV0d29ya3MuCi0gICAgICogQHBhcmFtIHZpc2libGUge0Bjb2RlIHRydWV9IGlmIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgdmlzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiBAcGFyYW0gbnVtTmV0d29ya3MgdGhlIG51bWJlciBuZXR3b3JrcyBzZWVuCi0gICAgICogQHBhcmFtIGZvcmNlIHtAY29kZSB0cnVlfSB0byBmb3JjZSBub3RpZmljYXRpb24gdG8gYmUgc2hvd24vbm90LXNob3duLAotICAgICAqIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBzaG93bi9ub3Qtc2hvd24uCi0gICAgICogQHBhcmFtIGRlbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBub3RpZmljYXRpb24gc2hvdWxkIGJlIG1hZGUKLSAgICAgKiB2aXNpYmxlIG9yIGludmlzaWJsZS4KKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShib29sZWFuIHZpc2libGUsIGludCBudW1OZXR3b3JrcywgYm9vbGVhbiBmb3JjZSwgaW50IGRlbGF5KSB7Ci0gICAgICAgIAotICAgICAgICAvLyBTaW5jZSB3ZSB1c2UgYXV0byBjYW5jZWwgb24gdGhlIG5vdGlmaWNhdGlvbiwgd2hlbiB0aGUKLSAgICAgICAgLy8gbU5ldHdvcmtzQXZhaWxhYmxlTm90aWZpY2F0aW9uU2hvd24gaXMgdHJ1ZSwgdGhlIG5vdGlmaWNhdGlvbiBtYXkKLSAgICAgICAgLy8gaGF2ZSBhY3R1YWxseSBiZWVuIGNhbmNlbGVkLiAgSG93ZXZlciwgd2hlbiBpdCBpcyBmYWxzZSB3ZSBrbm93Ci0gICAgICAgIC8vIGZvciBzdXJlIHRoYXQgaXQgaXMgbm90IGJlaW5nIHNob3duIChpdCB3aWxsIG5vdCBiZSBzaG93biBhbnkgb3RoZXIKLSAgICAgICAgLy8gcGxhY2UgdGhhbiBoZXJlKQotICAgICAgICAKLSAgICAgICAgLy8gSWYgaXQgc2hvdWxkIGJlIGhpZGRlbiBhbmQgaXQgaXMgYWxyZWFkeSBoaWRkZW4sIHRoZW4gbm9vcAotICAgICAgICBpZiAoIXZpc2libGUgJiYgIW1Ob3RpZmljYXRpb25TaG93biAmJiAhZm9yY2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTm90IGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uIGFnYWluCi0gICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSBOb3RpZmljYXRpb24gbWFpbmx5IHNvIHdlIGNhbiByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgLy8gRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQgbWVzc2FnZSB3aXRoIHRoaXMgTm90aWZpY2F0aW9uIGZyb20KLSAgICAgICAgICAgICAgICAvLyB0aGUgcXVldWUgbGF0ZXIKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24ud2hlbiA9IDA7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5pY29uID0gSUNPTl9ORVRXT1JLU19BVkFJTEFCTEU7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX0FVVE9fQ0FOQ0VMOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkFDVElPTl9QSUNLX1dJRklfTkVUV09SSyksIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZSwgbnVtTmV0d29ya3MpOwotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRldGFpbHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZV9kZXRhaWxlZCwgbnVtTmV0d29ya3MpOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gdGl0bGU7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uLnNldExhdGVzdEV2ZW50SW5mbyhtQ29udGV4dCwgdGl0bGUsIGRldGFpbHMsIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOwotCi0gICAgICAgICAgICBtZXNzYWdlID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VELCAxLAotICAgICAgICAgICAgICAgICAgICBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSwgbU5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBwZW5kaW5nIG1lc3NhZ2VzIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgbVRhcmdldC5yZW1vdmVNZXNzYWdlcyhFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCwgbU5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQsIDAsIElDT05fTkVUV09SS1NfQVZBSUxBQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UYXJnZXQuc2VuZE1lc3NhZ2VEZWxheWVkKG1lc3NhZ2UsIGRlbGF5KTsKLSAgICAgICAgCi0gICAgICAgIG1Ob3RpZmljYXRpb25TaG93biA9IHZpc2libGU7CisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0LnNldChlbmFibGVkKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdHJhY2tpbmcgd2hldGhlciBhIG5vdGlmaWNhdGlvbiBoYXMgYmVlbgotICAgICAqIHNob3duIHJlY2VudGx5LgotICAgICAqIDxwPgotICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSB0aW1lciB0aGF0IHByZXZlbnRzIG5vdGlmaWNhdGlvbnMgZnJvbQotICAgICAqIGJlaW5nIHNob3duIHRvbyBvZnRlbiB3aWxsIGJlIGNsZWFyZWQuCisgICAgICogRmV0Y2ggTmV0d29ya0luZm8gZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gMDsKLSAgICAgICAgbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPSAwOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiaW50ZXJmYWNlICIpLmFwcGVuZChtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIHJ1blN0YXRlPSIpOwotICAgICAgICBpZiAobVJ1blN0YXRlID49IDEgJiYgbVJ1blN0YXRlIDw9IG1SdW5TdGF0ZU5hbWVzLmxlbmd0aCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG1SdW5TdGF0ZU5hbWVzW21SdW5TdGF0ZS0xXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobVJ1blN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoTFMpLmFwcGVuZChtV2lmaUluZm8pLmFwcGVuZChMUyk7Ci0gICAgICAgIHNiLmFwcGVuZChtRGhjcEluZm8pLmFwcGVuZChMUyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiaGF2ZUlwQWRkcmVzcz0iKS5hcHBlbmQobUhhdmVJcEFkZHJlc3MpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBvYnRhaW5pbmdJcEFkZHJlc3M9IikuYXBwZW5kKG1PYnRhaW5pbmdJcEFkZHJlc3MpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBzY2FuTW9kZUFjdGl2ZT0iKS5hcHBlbmQobUlzU2Nhbk1vZGVBY3RpdmUpLmFwcGVuZChMUykuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCJsYXN0U2lnbmFsTGV2ZWw9IikuYXBwZW5kKG1MYXN0U2lnbmFsTGV2ZWwpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBleHBsaWNpdGx5RGlzYWJsZWQ9IikuYXBwZW5kKG1Ub3JuRG93bkJ5Q29ubk1ncik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIERoY3BIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBIYW5kbGVyIG1UYXJnZXQ7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0byBza2lwIHRoZSBESENQIHJlc3VsdCBjYWxsYmFjayB0byB0aGUgdGFyZ2V0LiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICogdGhpcyBjb3VsZCBiZSBzZXQgaWYgdGhlIG5ldHdvcmsgd2Ugd2VyZSByZXF1ZXN0aW5nIGFuIElQIGZvciBoYXMKLSAgICAgICAgICogc2luY2UgYmVlbiBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBOb3RlOiBUaGVyZSBpcyBzdGlsbCBhIGNoYW5jZSB3aGVyZSB0aGUgY2xpZW50J3MgaW50ZW5kZWQgREhDUAotICAgICAgICAgKiByZXF1ZXN0IG5vdCBiZWluZyBjYW5jZWxlZC4gRm9yIGV4YW1wbGUsIHdlIGFyZSByZXF1ZXN0IGZvciBJUCBvbgotICAgICAgICAgKiBBLCBhbmQgaGUgcXVldWVzIHJlcXVlc3QgZm9yIElQIG9uIEIsIGFuZCB0aGVuIGNhbmNlbHMgdGhlIHJlcXVlc3Qgb24KLSAgICAgICAgICogQiB3aGlsZSB3ZSdyZSBzdGlsbCByZXF1ZXN0aW5nIGZyb20gQS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsQ2FsbGJhY2s7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbmNlIG9mIHRoZSBibHVldG9vdGggaGVhZHNldCBoZWxwZXIuIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZAotICAgICAgICAgKiBlYXJseSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVsYXkgYmVmb3JlIGl0IGFjdHVhbGx5ICdjb25uZWN0cycsIGFzCi0gICAgICAgICAqIG5vdGVkIGJ5IGl0cyBqYXZhZG9jLiBJZiB3ZSBjaGVjayBiZWZvcmUgaXQgaXMgY29ubmVjdGVkLCBpdCB3aWxsIGJlCi0gICAgICAgICAqIGluIGFuIGVycm9yIHN0YXRlIGFuZCB3ZSB3aWxsIG5vdCBkaXNhYmxlIGNvZXhpc3RlbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OwotICAgICAgICAKLSAgICAgICAgcHVibGljIERoY3BIYW5kbGVyKExvb3BlciBsb29wZXIsIEhhbmRsZXIgdGFyZ2V0KSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQgPSBuZXcgQmx1ZXRvb3RoSGVhZHNldChtQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0RIQ1BfU1RBUlQ6Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZSBhcmUgcHJvYmxlbXMgc2V0dGluZyB0aGUgV2ktRmkgZHJpdmVyJ3MgcG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZGUgdG8gYWN0aXZlIHdoZW4gYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIG1vZGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGVuYWJsZWQgb3Igc2Vuc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlIHNldCBXaS1GaSB0byBhY3RpdmUgbW9kZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvYnRhaW5pbmcgYW4gSVAgYWRkcmVzcyBiZWNhdXNlIHdlJ3ZlIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aXRoIHNvbWUgcm91dGVycyB3aXRoIGxvdyBwb3dlcgotICAgICAgICAgICAgICAgICAgICAgICAgICogbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoaXMgYWN0aXZlIHBvd2VyIG1vZGUgdG8gcHJvcGVybHkgYmUgc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICogd2UgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHVudGlsIHdlJ3JlIGRvbmUgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MuICBPbmUgZXhjZXB0aW9uIGlzIGlmIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGhlYWRzZXQsIHNpbmNlIGRpc2FibGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICogY29leGlzdGVuY2Ugd291bGQgaW50ZXJydXB0IHRoYXQgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjb2V4aXN0ZW5jZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRElTQUJMRUQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBnZXRQb3dlck1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc3VwcGxpY2FudCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgIC8vIGdldFBvd2VyTW9kZUNvbW1hbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRQb3dlck1vZGUoRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBuZXcgcmVxdWVzdCBpcyBiZWluZyBtYWRlLCBzbyBhc3N1bWUgd2Ugd2lsbCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmNlbENhbGxiYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMucnVuRGhjcChtSW50ZXJmYWNlTmFtZSwgbURoY3BJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBzdWNjZWVkZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBmYWlsZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5nZXREaGNwRXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKHBvd2VyTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY29leGlzdGVuY2UgbW9kZSBiYWNrIHRvIGl0cyBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1DYW5jZWxDYWxsYmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UYXJnZXQuc2VuZEVtcHR5TWVzc2FnZShldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2FuY2VsQ2FsbGJhY2soYm9vbGVhbiBjYW5jZWxDYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbmNlbENhbGxiYWNrID0gY2FuY2VsQ2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgd2hpbGUgb2J0YWluaW5nIElQIGFkZHJlc3MuIFRoaXMKLSAgICAgICAgICogbG9naWMgd2lsbCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjdXJyZW50IGJsdWV0b290aAotICAgICAgICAgKiBoZWFkc2V0L2hhbmRzZnJlZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQuIFRoaXMgbWVhbnMgaWYgaXQgaXMgaW4gYW4KLSAgICAgICAgICogZXJyb3Igc3RhdGUsIHdlIHdpbGwgTk9UIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB0byBlcnIgb24gdGhlIHNpZGUKLSAgICAgICAgICogb2Ygc2FmZXR5LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkgewotICAgICAgICAgICAgaW50IHN0YXRlID0gbUJsdWV0b290aEhlYWRzZXQuZ2V0U3RhdGUobUJsdWV0b290aEhlYWRzZXQuZ2V0Q3VycmVudEhlYWRzZXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVXNlU3RhdGljSXAoKSB7Ci0gICAgICAgIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOwotICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8uaXBBZGRyZXNzID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmdhdGV3YXkgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8ubmV0bWFzayA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMxID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMik7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVVzZVN0YXRpY0lwID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBGZXRjaCBMaW5rUHJvcGVydGllcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMobUxpbmtQcm9wZXJ0aWVzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3RyaW5nVG9JcEFkZHIoU3RyaW5nIGFkZHJTdHJpbmcpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGFkZHJTdHJpbmcuc3BsaXQoIlxcLiIpOwotICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOwotICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKLSAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7Ci0gICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OwotCi0gICAgICAgICAgICByZXR1cm4gYSB8IGIgfCBjIHwgZDsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkhvc3RFeGNlcHRpb24oYWRkclN0cmluZyk7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBBIGNhcGFiaWxpdHkgaXMgYW4gSW50ZWdlci9TdHJpbmcgcGFpciwgdGhlIGNhcGFiaWxpdGllcworICAgICAqIGFyZSBkZWZpbmVkIGluIHRoZSBjbGFzcyBMaW5rU29ja2V0I0tleS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgY29ubmVjdGlvbnMgY2FwYWJpbGl0aWVzLCBtYXkgYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgZ2V0TGlua0NhcGFiaWxpdGllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rQ2FwYWJpbGl0aWVzKG1MaW5rQ2FwYWJpbGl0aWVzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGludCBnZXRNYXhEaGNwUmV0cmllcygpIHsKLSAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX01BWF9ESENQX1JFVFJZX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9ESENQX1JFVFJJRVMpOworICAgIC8qKgorICAgICAqIEZldGNoIGRlZmF1bHQgZ2F0ZXdheSBhZGRyZXNzIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEdhdGV3YXlBZGRyKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRHYXRld2F5QWRkci5nZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIFNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewotICAgICAgICBwdWJsaWMgU2V0dGluZ3NPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOwotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1VTRV9TVEFUSUNfSVApLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19JUCksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0dBVEVXQVkpLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMSksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzIpLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOwotCi0gICAgICAgICAgICBib29sZWFuIHdhc1N0YXRpY0lwID0gbVVzZVN0YXRpY0lwOwotICAgICAgICAgICAgaW50IG9JcCwgb0d3LCBvTXNrLCBvRG5zMSwgb0RuczI7Ci0gICAgICAgICAgICBvSXAgPSBvR3cgPSBvTXNrID0gb0RuczEgPSBvRG5zMiA9IDA7Ci0gICAgICAgICAgICBpZiAod2FzU3RhdGljSXApIHsKLSAgICAgICAgICAgICAgICBvSXAgPSBtRGhjcEluZm8uaXBBZGRyZXNzOwotICAgICAgICAgICAgICAgIG9HdyA9IG1EaGNwSW5mby5nYXRld2F5OwotICAgICAgICAgICAgICAgIG9Nc2sgPSBtRGhjcEluZm8ubmV0bWFzazsKLSAgICAgICAgICAgICAgICBvRG5zMSA9IG1EaGNwSW5mby5kbnMxOwotICAgICAgICAgICAgICAgIG9EbnMyID0gbURoY3BJbmZvLmRuczI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja1VzZVN0YXRpY0lwKCk7Ci0KLSAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9Ci0gICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICE9IG1Vc2VTdGF0aWNJcCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICYmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIG9JcCAgICE9IG1EaGNwSW5mby5pcEFkZHJlc3MgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9HdyAgICE9IG1EaGNwSW5mby5nYXRld2F5IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvTXNrICAhPSBtRGhjcEluZm8ubmV0bWFzayB8fAotICAgICAgICAgICAgICAgICAgICAgICAgb0RuczEgIT0gbURoY3BJbmZvLmRuczEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9EbnMyICE9IG1EaGNwSW5mby5kbnMyKSk7Ci0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobVVzZVN0YXRpY0lwKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIENoZWNrIGlmIGRlZmF1bHQgcm91dGUgaXMgc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlU2V0LmdldCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgLyoqCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIGRlZmF1bHQgcm91dGUgaXMgc2V0IGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURlZmF1bHRSb3V0ZVNldC5zZXQoZW5hYmxlZCk7CisgICAgfQogCi0gICAgICAgIHB1YmxpYyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCisgICAgICogZm9yIHRoaXMgbmV0d29yay4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKSB7CisgICAgICAgIHJldHVybiAibmV0LnRjcC5idWZmZXJzaXplLndpZmkiOworICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcigpIHsKLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OKSwgdHJ1ZSwgdGhpcyk7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQorICAgIHByaXZhdGUgY2xhc3MgV2lmaVN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOwotCi0gICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIW1Ob3RpZmljYXRpb25FbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBub3RpZmljYXRpb24gdGhhdCBtYXkgYmUgc2hvd2luZwotICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIHRydWUsIDApOworICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTElOS19QUk9QRVJUSUVTKTsKKyAgICAgICAgICAgICAgICBpZiAobUxpbmtQcm9wZXJ0aWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1MaW5rQ2FwYWJpbGl0aWVzID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgICAgICAgICBpZiAobUxpbmtDYXBhYmlsaXRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTGlua0NhcGFiaWxpdGllcyA9IG5ldyBMaW5rQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUNzSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1NUQVRFX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7CisgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFdpZmlNYW5hZ2VyLkNPTkZJR19DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSAoTGlua1Byb3BlcnRpZXMpIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9MSU5LX1BST1BFUlRJRVMpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUNzSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OLCAxKSA9PSAxOwogICAgICAgICB9CiAgICAgfQorCiB9Cg==